From c18fdcbad216da43133141da7baee566c05ffdd0 Mon Sep 17 00:00:00 2001 From: Kroytz Date: Sat, 25 Jul 2026 23:31:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(shop):=20=E8=90=A5=E4=B8=9A=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=80=BB=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../storeorder/AppStoreOrderServiceImpl.java | 7 ++ .../store/enums/ErrorCodeConstants.java | 1 + .../admin/storeshop/vo/StoreShopBaseVO.java | 2 +- .../app/storeshop/vo/AppStoreShopVO.java | 5 +- .../dal/dataobject/storeshop/StoreShopDO.java | 2 +- .../storeshop/AppStoreShopServiceImpl.java | 11 ++- .../storeshop/ShopBusinessHoursUtils.java | 67 +++++++++++++++++++ .../storeshop/StoreShopServiceImpl.java | 38 +---------- .../src/views/mall/store/shop/ShopForm.vue | 1 + 9 files changed, 94 insertions(+), 40 deletions(-) create mode 100644 yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/service/storeshop/ShopBusinessHoursUtils.java diff --git a/yshop-drink-boot3/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderServiceImpl.java b/yshop-drink-boot3/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderServiceImpl.java index 0373e60..9ddaf31 100644 --- a/yshop-drink-boot3/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderServiceImpl.java +++ b/yshop-drink-boot3/yshop-module-mall/yshop-module-order-biz/src/main/java/co/yixiang/yshop/module/order/service/storeorder/AppStoreOrderServiceImpl.java @@ -50,6 +50,7 @@ import co.yixiang.yshop.module.store.convert.storeshop.StoreShopConvert; import co.yixiang.yshop.module.store.dal.dataobject.storeshop.StoreShopDO; import co.yixiang.yshop.module.store.service.storeshop.AppStoreShopService; import co.yixiang.yshop.module.store.service.storeshop.DeliveryCalculator; +import co.yixiang.yshop.module.store.service.storeshop.ShopBusinessHoursUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -180,6 +181,12 @@ public class AppStoreOrderServiceImpl extends ServiceImpl cartIds = new ArrayList<>(); StoreShopDO storeShopDO = appStoreShopService.getById(param.getShopId()); + if (storeShopDO == null) { + throw exception(co.yixiang.yshop.module.store.enums.ErrorCodeConstants.SHOP_NOT_EXISTS); + } + if (!ShopBusinessHoursUtils.isCurrentlyOpen(storeShopDO)) { + throw exception(co.yixiang.yshop.module.store.enums.ErrorCodeConstants.STORE_SHOP_NOT_OPEN); + } BigDecimal sumPrice = BigDecimal.ZERO; BigDecimal couponPrice = BigDecimal.ZERO; diff --git a/yshop-drink-boot3/yshop-module-mall/yshop-module-store-api/src/main/java/co/yixiang/yshop/module/store/enums/ErrorCodeConstants.java b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-api/src/main/java/co/yixiang/yshop/module/store/enums/ErrorCodeConstants.java index 03c2718..bd26f4c 100644 --- a/yshop-drink-boot3/yshop-module-mall/yshop-module-store-api/src/main/java/co/yixiang/yshop/module/store/enums/ErrorCodeConstants.java +++ b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-api/src/main/java/co/yixiang/yshop/module/store/enums/ErrorCodeConstants.java @@ -8,4 +8,5 @@ public interface ErrorCodeConstants { ErrorCode STORE_REVENUE_NOT_EXISTS = new ErrorCode(1008016002, "店铺收支明细不存在"); ErrorCode WITHDRAWAL_NOT_EXISTS = new ErrorCode(1008016003, "提现管理不存在"); ErrorCode USER_BANK_NOT_EXISTS = new ErrorCode(1008016004, "提现账户不存在"); + ErrorCode STORE_SHOP_NOT_OPEN = new ErrorCode(1008016005, "店铺不在营业中,暂时无法下单"); } diff --git a/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/controller/admin/storeshop/vo/StoreShopBaseVO.java b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/controller/admin/storeshop/vo/StoreShopBaseVO.java index 390391d..9985a62 100644 --- a/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/controller/admin/storeshop/vo/StoreShopBaseVO.java +++ b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/controller/admin/storeshop/vo/StoreShopBaseVO.java @@ -75,7 +75,7 @@ public class StoreShopBaseVO { @NotNull(message = "公告不能为空") private String notice; - @Schema(description = "是否营业:0=否,1=是", required = true, example = "2") + @Schema(description = "是否营业总开关:0=否,1=是(为是且配置了营业时段时,下单以时段为准)", required = true, example = "1") @NotNull(message = "是否营业:0=否,1=是不能为空") private Integer status; diff --git a/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/controller/app/storeshop/vo/AppStoreShopVO.java b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/controller/app/storeshop/vo/AppStoreShopVO.java index 892cab7..be391f0 100644 --- a/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/controller/app/storeshop/vo/AppStoreShopVO.java +++ b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/controller/app/storeshop/vo/AppStoreShopVO.java @@ -78,7 +78,10 @@ public class AppStoreShopVO { @Schema(description = "桌面订单", required = true) private String deskOrderId; - @Schema(description = "是否营业:0=否,1=是", required = true) + @Schema(description = "是否营业总开关:0=否,1=是", required = true) private Integer status; + @Schema(description = "当前是否可下单:0=否,1=是(总开关为是且在营业时段内)") + private Integer open; + } diff --git a/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/dal/dataobject/storeshop/StoreShopDO.java b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/dal/dataobject/storeshop/StoreShopDO.java index 7f0bb5f..c2c9ae5 100644 --- a/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/dal/dataobject/storeshop/StoreShopDO.java +++ b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/dal/dataobject/storeshop/StoreShopDO.java @@ -93,7 +93,7 @@ public class StoreShopDO extends BaseDO { */ private String notice; /** - * 是否营业:0=否,1=是 + * 是否营业总开关:0=否,1=是 */ private Integer status; /** diff --git a/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/service/storeshop/AppStoreShopServiceImpl.java b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/service/storeshop/AppStoreShopServiceImpl.java index b1a46f1..04e13b8 100644 --- a/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/service/storeshop/AppStoreShopServiceImpl.java +++ b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/service/storeshop/AppStoreShopServiceImpl.java @@ -34,7 +34,16 @@ public class AppStoreShopServiceImpl extends ServiceImpl getStoreList(double lon, double lat,String name,Integer shopId) { - return shopMapper.getStoreList(lon,lat,name,shopId); + List list = shopMapper.getStoreList(lon, lat, name, shopId); + if (list == null) { + return list; + } + for (AppStoreShopVO shop : list) { + boolean open = ShopBusinessHoursUtils.isCurrentlyOpen( + shop.getStatus(), shop.getStartTime(), shop.getEndTime()); + shop.setOpen(open ? 1 : 0); + } + return list; } @Override diff --git a/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/service/storeshop/ShopBusinessHoursUtils.java b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/service/storeshop/ShopBusinessHoursUtils.java new file mode 100644 index 0000000..ae7ef7b --- /dev/null +++ b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/service/storeshop/ShopBusinessHoursUtils.java @@ -0,0 +1,67 @@ +package co.yixiang.yshop.module.store.service.storeshop; + +import cn.hutool.core.date.DateUtil; +import co.yixiang.yshop.module.store.dal.dataobject.storeshop.StoreShopDO; + +import java.util.Date; + +/** + * 门店是否可下单:status 为总开关;为营业且配置了起止时间时,再按营业时段判断。 + */ +public final class ShopBusinessHoursUtils { + + private ShopBusinessHoursUtils() { + } + + /** + * @param status 是否营业总开关:0=否,1=是 + * @param startTime 营业开始时间(可空,仅取时分) + * @param endTime 营业结束时间(可空,仅取时分) + * @return 当前是否允许下单 + */ + public static boolean isCurrentlyOpen(Integer status, Date startTime, Date endTime) { + if (status == null || status != 1) { + return false; + } + if (startTime == null || endTime == null) { + return true; + } + return isWithinBusinessHours(startTime, endTime, new Date()); + } + + public static boolean isCurrentlyOpen(StoreShopDO shop) { + if (shop == null) { + return false; + } + return isCurrentlyOpen(shop.getStatus(), shop.getStartTime(), shop.getEndTime()); + } + + /** + * 判断当前时刻是否落在营业时段内(仅比较时、分;不支持跨天)。 + */ + public static boolean isWithinBusinessHours(Date startTime, Date endTime, Date now) { + if (startTime == null || endTime == null || now == null) { + return true; + } + int sH = DateUtil.hour(startTime, true); + int sM = DateUtil.minute(startTime); + int eH = DateUtil.hour(endTime, true); + int eM = DateUtil.minute(endTime); + int nH = DateUtil.hour(now, true); + int nM = DateUtil.minute(now); + if (nH < sH) { + return false; + } + if (eH < nH) { + return false; + } + if (nH == sH && sM > nM) { + return false; + } + if (eH == nH && eM < nM) { + return false; + } + return true; + } + +} diff --git a/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/service/storeshop/StoreShopServiceImpl.java b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/service/storeshop/StoreShopServiceImpl.java index b8892bb..4f892f5 100644 --- a/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/service/storeshop/StoreShopServiceImpl.java +++ b/yshop-drink-boot3/yshop-module-mall/yshop-module-store-biz/src/main/java/co/yixiang/yshop/module/store/service/storeshop/StoreShopServiceImpl.java @@ -1,7 +1,5 @@ package co.yixiang.yshop.module.store.service.storeshop; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.date.DateUtil; import co.yixiang.yshop.framework.common.exception.ErrorCode; import co.yixiang.yshop.framework.security.core.util.SecurityFrameworkUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -43,10 +41,8 @@ public class StoreShopServiceImpl implements StoreShopService { throw exception(new ErrorCode(1000,"管理员ID:"+val+"已经绑定过其他门店,不能再次绑定")); } }); - // 插入 + // 插入:status 为总开关,按后台提交值落库,不再按营业时间覆盖 StoreShopDO shop = StoreShopConvert.INSTANCE.convert(createReqVO); - Integer status = doShopStatus(shop.getStartTime(),shop.getEndTime()); - shop.setStatus(status); shopMapper.insert(shop); // 返回 return shop.getId(); @@ -67,41 +63,11 @@ public class StoreShopServiceImpl implements StoreShopService { }); // 校验存在 validateShopExists(updateReqVO.getId()); - // 更新 + // 更新:status 为总开关,按后台提交值落库 StoreShopDO updateObj = StoreShopConvert.INSTANCE.convert(updateReqVO); - Integer status = doShopStatus(updateObj.getStartTime(),updateObj.getEndTime()); - updateObj.setStatus(status); shopMapper.updateById(updateObj); } - - /** - * 处理营业时间 - * @param startTime - * @param endTime - * @return - */ - private Integer doShopStatus(Date startTime,Date endTime){ - Date now = new Date(); - Integer sH = DateUtil.hour(startTime,true); - Integer sM = DateUtil.minute(startTime); - Integer eH = DateUtil.hour(endTime,true); - Integer eM = DateUtil.minute(endTime); - Integer nH = DateUtil.hour(now,true); - Integer nM = DateUtil.minute(now); - if(nH < sH){ - return 0; - }else if(eH < nH){ - return 0; - }else if(nH == sH && sM > nM){ - return 0; - }else if(eH == nH && eM < nM){ - return 0; - } else{ - return 1; - } - } - @Override public void deleteShop(Long id) { // 校验存在 diff --git a/yshop-drink-vue3/src/views/mall/store/shop/ShopForm.vue b/yshop-drink-vue3/src/views/mall/store/shop/ShopForm.vue index 694834d..7b91b48 100644 --- a/yshop-drink-vue3/src/views/mall/store/shop/ShopForm.vue +++ b/yshop-drink-vue3/src/views/mall/store/shop/ShopForm.vue @@ -95,6 +95,7 @@ 是 否 +
总开关:选「是」后,若填写了营业起止时间,下单以时段为准;选「否」则全天不可下单