From e45a1df7a18c30248c1ace236322abecaa00dc3b Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Tue, 2 Sep 2025 00:00:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=AE=B6=E7=94=A8=E6=88=B7=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E4=B9=8B=E5=90=8E=EF=BC=8C=E8=A1=A5=E5=81=BF=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E5=BA=97=E9=93=BA=E9=81=97=E6=BC=8F=E7=9A=84=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E3=80=82=20=E5=A2=9E=E5=8A=A0=E6=89=93=E7=83=8A?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=85=BC=E9=A1=BE=E6=97=B6=E9=97=B4=E6=AE=B5?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E8=B4=A6=E5=8F=B7=E4=BD=93=E7=B3=BB?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20getOne=20=E5=BC=82=E5=B8=B8=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/AccountUserBaseServiceImpl.java | 39 +++++--- .../AccountUserBindConnectServiceImpl.java | 40 ++++++--- .../mall/common/utils/DateTimeUtils.java | 72 +++++++++++++-- .../impl/ShopProductItemServiceImpl.java | 88 ++++++++++--------- .../store/service/ShopStoreBaseService.java | 10 +++ .../service/impl/ShopMchEntryServiceImpl.java | 21 +++-- .../impl/ShopStoreBaseServiceImpl.java | 41 +++++++++ 7 files changed, 229 insertions(+), 82 deletions(-) diff --git a/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBaseServiceImpl.java b/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBaseServiceImpl.java index b8051078..b83e1cc2 100644 --- a/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBaseServiceImpl.java +++ b/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBaseServiceImpl.java @@ -2426,20 +2426,35 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); - if (user_is_admin == null) { - user_is_admin = CommonConstant.USER_TYPE_NORMAL; + public AccountUserBase getByAccountAndType(String userAccount, Integer userIsAdmin) { + // 参数校验 + if (StrUtil.isBlank(userAccount)) { + return null; + } + + try { + // 如果用户类型为null,默认设置为普通用户类型 + if (userIsAdmin == null) { + userIsAdmin = CommonConstant.USER_TYPE_NORMAL; + } + + // 构建查询条件 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_account", userAccount) + .eq("user_is_admin", userIsAdmin) + .orderByAsc("user_id"); + + // 执行查询并返回结果 + return getOne(queryWrapper); + } catch (Exception e) { + // 记录异常日志,避免影响主流程 + logger.error("根据账号和类型查询用户信息时发生异常,userAccount: {}, userIsAdmin: {}", userAccount, userIsAdmin, e); + return null; } - queryWrapper.eq("user_account", user_account) - .eq("user_is_admin", user_is_admin) - .orderByAsc("user_id"); - AccountUserBase data = findOne(queryWrapper); - return data; } @Override diff --git a/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBindConnectServiceImpl.java b/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBindConnectServiceImpl.java index 85c19cec..3fc2a8b9 100644 --- a/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBindConnectServiceImpl.java +++ b/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBindConnectServiceImpl.java @@ -173,17 +173,20 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("bind_id", bind_id).eq("bind_type", bind_type).orderByAsc("bind_time"); + queryWrapper.eq("bind_id", bind_id).eq("bind_type", bind_type) + .eq("user_type", user_type).orderByAsc("bind_time"); AccountUserBindConnect bind_row = findOne(queryWrapper); - //getBindByBindId(bind_id, bind_type, user_id, CommonConstant.USER_TYPE_NORMAL); //findOne(queryWrapper); if (bind_row != null) { Integer bind_active = bind_row.getBind_active(); @@ -334,23 +337,32 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("bind_id", bindId).eq("bind_type", bindType).eq("bind_active", CommonConstant.Enable); - if (ObjectUtil.isNotEmpty(userType)) { - queryWrapper.eq("user_type", userType); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("bind_id", bindId).eq("bind_type", bindType).eq("bind_active", CommonConstant.Enable); + if (ObjectUtil.isNotEmpty(userType)) { + queryWrapper.eq("user_type", userType); + } + + // 只查询 user_id 字段以提高性能 + queryWrapper.select("user_id").orderByAsc("bind_time"); + + AccountUserBindConnect accountUserBindConnect = getOne(queryWrapper); + // 确保 accountUserBindConnect 不为 null 且 user_id 不为 null + return (accountUserBindConnect != null && accountUserBindConnect.getUser_id() != null) + ? accountUserBindConnect.getUser_id() + : null; + } catch (Exception e) { + // 记录异常日志,避免影响主流程 + log.error("查询用户绑定信息时发生异常,bindId: {}, bindType: {}, userType: {}", bindId, bindType, userType, e); + return null; } - - queryWrapper.select("user_id").orderByAsc("bind_time"); - - AccountUserBindConnect accountUserBindConnect = getOne(queryWrapper); - return accountUserBindConnect != null ? accountUserBindConnect.getUser_id() : null; - } /** diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/DateTimeUtils.java b/mall-common/src/main/java/com/suisung/mall/common/utils/DateTimeUtils.java index 31c68bbd..6048c6f2 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/DateTimeUtils.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/DateTimeUtils.java @@ -5,10 +5,7 @@ import org.springframework.data.util.Pair; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.DateTimeException; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZonedDateTime; +import java.time.*; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.temporal.ChronoField; @@ -233,6 +230,61 @@ public class DateTimeUtils { return count; } + /** + * 判断指定时间是否在两个时间点之间(包含边界) + * + * @param startTimeStr 开始时间字符串,格式为 HH:mm + * @param endTimeStr 结束时间字符串,格式为 HH:mm + * @param currentTime 要判断的时间点 + * @return 如果在时间段内返回true,否则返回false。出现异常时返回false,不影响主流程 + */ + public static boolean isTimeInRange(String startTimeStr, String endTimeStr, LocalDateTime currentTime) { + try { + // 参数校验 + if (startTimeStr == null || endTimeStr == null || currentTime == null) { + log.warn("时间参数不能为空,startTimeStr: {}, endTimeStr: {}, currentTime: {}", + startTimeStr, endTimeStr, currentTime); + return false; + } + + // 解析开始时间 + LocalTime startTime = LocalTime.parse(startTimeStr, DateTimeFormatter.ofPattern("HH:mm")); + + // 解析结束时间 + LocalTime endTime = LocalTime.parse(endTimeStr, DateTimeFormatter.ofPattern("HH:mm")); + + // 获取当前时间的时间部分 + LocalTime nowTime = currentTime.toLocalTime(); + + // 处理跨天情况,例如 22:00 - 06:00 + if (endTime.isBefore(startTime)) { + // 如果结束时间小于开始时间,说明跨越了午夜 + // 当前时间需要满足:大于等于开始时间 或者 小于等于结束时间 + return !nowTime.isBefore(startTime) || !nowTime.isAfter(endTime); + } else { + // 正常情况(不跨天),当前时间需要在开始时间和结束时间之间(包含边界) + return !nowTime.isBefore(startTime) && !nowTime.isAfter(endTime); + } + } catch (Exception e) { + // 捕获解析异常,记录日志并返回false,避免影响主流程 + log.error("判断时间是否在范围内时发生异常,startTimeStr: {}, endTimeStr: {}, currentTime: {}", + startTimeStr, endTimeStr, currentTime, e); + return false; + } + } + + /** + * 判断当前时间是否在两个时间点之间(包含边界) + * + * @param startTimeStr 开始时间字符串,格式为 HH:mm + * @param endTimeStr 结束时间字符串,格式为 HH:mm + * @return 如果在时间段内返回true,否则返回false + * @throws IllegalArgumentException 当时间字符串格式不正确时抛出异常 + */ + public static boolean isCurrentTimeInRange(String startTimeStr, String endTimeStr) { + return isTimeInRange(startTimeStr, endTimeStr, LocalDateTime.now()); + } + public static void main(String[] args) { // System.out.println(convertLklDate("2021-02-19")); // 2025-01-02 @@ -249,9 +301,19 @@ public class DateTimeUtils { // System.out.println(convertLklDate("永久")); // 9999-12-31 // System.out.println(convertLklDate(null)); // 9999-12-31 // System.out.println(convertLklDate("2025.2.30")); // 9999-12-31(无效日期) - System.out.println(convertLklDate("2045-01-10")); // 2025-01-10 + // System.out.println(convertLklDate("2045-01-10")); // 2025-01-10 // System.out.println(formatLocalDate(LocalDate.now(), "yyyy-MM-dd")); + + // 判断当前时间是否在工作时间(9:00-18:00)内 + boolean isWorkTime = isCurrentTimeInRange("09:00", "22:36"); + +// 判断特定时间是否在夜间时间(22:00-06:00)内 + LocalDateTime testTime = LocalDateTime.of(2025, 1, 1, 23, 30); + boolean isNight = isTimeInRange("22:00", "06:00", testTime); + + System.out.println("当前时间是否在工作时间内:" + isWorkTime); + System.out.println("特定时间是否在夜间时间段内:" + isNight); } } \ No newline at end of file diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java index 175ea9f1..994b5b20 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java @@ -56,7 +56,6 @@ import com.suisung.mall.shop.product.mapper.ShopProductItemMapper; import com.suisung.mall.shop.product.pojo.vo.ProductVo; import com.suisung.mall.shop.product.service.*; import com.suisung.mall.shop.store.service.*; -import com.suisung.mall.shop.sync.keymanage.RedisKey; import com.suisung.mall.shop.user.service.ShopUserFavoritesItemService; import com.suisung.mall.shop.user.service.ShopUserProductBrowseService; import io.seata.spring.annotation.GlobalTransactional; @@ -484,6 +483,11 @@ public class ShopProductItemServiceImpl extends BaseServiceImpl getProductItemIdByStore(Integer store_id,List productNumbers) { + public Map getProductItemIdByStore(Integer store_id, List productNumbers) { QueryWrapper queryWrapper = new QueryWrapper<>(); /** * 一对多,如product_id:1002,item_number:120_121;数据格式为item_id,item_id item_unit_price,item_unit_price * 最终组合item_id,item_id_item_unit_price,item_unit_price */ - queryWrapper.select("product_id","GROUP_CONCAT(item_id SEPARATOR ',') AS mergedItemId","GROUP_CONCAT(item_unit_price SEPARATOR ',') AS mergedUnitPrices,category_id"); + queryWrapper.select("product_id", "GROUP_CONCAT(item_id SEPARATOR ',') AS mergedItemId", "GROUP_CONCAT(item_unit_price SEPARATOR ',') AS mergedUnitPrices,category_id"); productNumbers.forEach(productNumber -> { - queryWrapper.or(q->q.eq("store_id",store_id).eq("item_src_id",productNumber)); + queryWrapper.or(q -> q.eq("store_id", store_id).eq("item_src_id", productNumber)); }); - queryWrapper.eq("store_id",store_id); + queryWrapper.eq("store_id", store_id); queryWrapper.groupBy("product_id"); - List shopProductItems= this.list(queryWrapper); + List shopProductItems = this.list(queryWrapper); // Map map=shopProductItems.stream().collect(Collectors.toMap(ShopProductItem::getProduct_id,shopProductItem->shopProductItem.getMergedItemId() // +"_"+shopProductItem.getMergedUnitPrices())); - Map map=new HashMap(); + Map map = new HashMap(); shopProductItems.forEach(item -> { - map.put(String.valueOf(item.getProduct_id()),item.getMergedItemId()+"_"+item.getMergedUnitPrices()); - map.put(item.getProduct_id()+":category_id",String.valueOf(item.getCategory_id())); + map.put(String.valueOf(item.getProduct_id()), item.getMergedItemId() + "_" + item.getMergedUnitPrices()); + map.put(item.getProduct_id() + ":category_id", String.valueOf(item.getCategory_id())); }); return map; @@ -2289,71 +2293,71 @@ public class ShopProductItemServiceImpl extends BaseServiceImpl shopProductItemList) { - shopProductItemMapper.updateBatchByProductId(shopProductItemList,shopProductItemList.get(0).getItem_enable()); + shopProductItemMapper.updateBatchByProductId(shopProductItemList, shopProductItemList.get(0).getItem_enable()); } @Override @Transactional(rollbackFor = Exception.class) public CommonResult editQuantity(List shopProductItemList) { - if(shopProductItemList.isEmpty()){ + if (shopProductItemList.isEmpty()) { return CommonResult.failed("修改数据不能为空"); } - if(shopProductItemList.size()>10){ + if (shopProductItemList.size() > 10) { return CommonResult.failed("修改数据不能超过10条"); } QueryWrapper queryWrapper = new QueryWrapper<>(); - List updateShopProductItem=new ArrayList<>(); - List updateShopProductBase=new ArrayList<>(); - List updateShopProductIndex=new ArrayList<>(); + List updateShopProductItem = new ArrayList<>(); + List updateShopProductBase = new ArrayList<>(); + List updateShopProductIndex = new ArrayList<>(); //校验数据 - Iterator itemIs=shopProductItemList.iterator(); - StringBuilder ids= new StringBuilder(); - Long productId=shopProductItemList.get(0).getProduct_id(); + Iterator itemIs = shopProductItemList.iterator(); + StringBuilder ids = new StringBuilder(); + Long productId = shopProductItemList.get(0).getProduct_id(); while (itemIs.hasNext()) {//去重 - ShopProductItem shopProductItem=itemIs.next(); - if(ObjectUtil.isEmpty(shopProductItem.getProduct_id())){ + ShopProductItem shopProductItem = itemIs.next(); + if (ObjectUtil.isEmpty(shopProductItem.getProduct_id())) { return CommonResult.failed("产品id不能为空"); } - if(ObjectUtil.isEmpty(shopProductItem.getItem_id())){ + if (ObjectUtil.isEmpty(shopProductItem.getItem_id())) { return CommonResult.failed("商品sku不能为空"); } - if(ObjectUtil.isEmpty(shopProductItem.getItem_quantity())){ + if (ObjectUtil.isEmpty(shopProductItem.getItem_quantity())) { return CommonResult.failed("库存不能为空"); } - if(ObjectUtil.isEmpty(shopProductItem.getItem_unit_price())){ + if (ObjectUtil.isEmpty(shopProductItem.getItem_unit_price())) { return CommonResult.failed("价格不能为空"); } - if(!productId.equals(shopProductItem.getProduct_id())){ + if (!productId.equals(shopProductItem.getProduct_id())) { return CommonResult.failed("只能修改相同产品的sku列表"); } - if(ids.toString().contains(shopProductItem.getItem_id().toString())){ + if (ids.toString().contains(shopProductItem.getItem_id().toString())) { itemIs.remove(); - }else { + } else { ids.append(shopProductItem.getItem_id()); } } BigDecimal item_unit_price = shopProductItemList.stream().map(ShopProductItem::getItem_unit_price).min(BigDecimal::compareTo).get(); - BigDecimal item_unit_price_max =shopProductItemList.stream().map(ShopProductItem::getItem_unit_price).max(BigDecimal::compareTo).get(); + BigDecimal item_unit_price_max = shopProductItemList.stream().map(ShopProductItem::getItem_unit_price).max(BigDecimal::compareTo).get(); - queryWrapper.eq("product_id",productId); - List oldShopProductItems= shopProductItemService.list(queryWrapper); + queryWrapper.eq("product_id", productId); + List oldShopProductItems = shopProductItemService.list(queryWrapper); BigDecimal item_unit_price_old = oldShopProductItems.stream().map(ShopProductItem::getItem_unit_price).min(BigDecimal::compareTo).get(); - BigDecimal item_unit_price_max_old=oldShopProductItems.stream().map(ShopProductItem::getItem_unit_price).max(BigDecimal::compareTo).get(); + BigDecimal item_unit_price_max_old = oldShopProductItems.stream().map(ShopProductItem::getItem_unit_price).max(BigDecimal::compareTo).get(); for (ShopProductItem shopProductItem : shopProductItemList) { - List oldShopProductItemList= oldShopProductItems.stream().filter(s -> s.getItem_id().equals(shopProductItem.getItem_id())).collect(Collectors.toList()); - if(CollUtil.isEmpty(oldShopProductItemList)){ + List oldShopProductItemList = oldShopProductItems.stream().filter(s -> s.getItem_id().equals(shopProductItem.getItem_id())).collect(Collectors.toList()); + if (CollUtil.isEmpty(oldShopProductItemList)) { return CommonResult.failed("不存在商品sku"); } - ShopProductItem oldShopProductItem=oldShopProductItemList.get(0); + ShopProductItem oldShopProductItem = oldShopProductItemList.get(0); oldShopProductItem.setItem_quantity(shopProductItem.getItem_quantity()); oldShopProductItem.setItem_unit_price(shopProductItem.getItem_unit_price()); updateShopProductItem.add(oldShopProductItem); - // shopProductItemService.updateById(oldShopProductItem); + // shopProductItemService.updateById(oldShopProductItem); } - ShopProductIndex shopProductIndex=new ShopProductIndex(); - ShopProductBase shopProductBase=new ShopProductBase(); - if(item_unit_price_old.compareTo(item_unit_price)>0&&oldShopProductItems.size()>1){ + ShopProductIndex shopProductIndex = new ShopProductIndex(); + ShopProductBase shopProductBase = new ShopProductBase(); + if (item_unit_price_old.compareTo(item_unit_price) > 0 && oldShopProductItems.size() > 1) { shopProductBase.setProduct_id(productId); shopProductBase.setProduct_unit_price(item_unit_price); shopProductIndex.setProduct_unit_price(item_unit_price); @@ -2362,12 +2366,12 @@ public class ShopProductItemServiceImpl extends BaseServiceImpl0&&oldShopProductItems.size()>1){ + if (item_unit_price_max.compareTo(item_unit_price_max_old) > 0 && oldShopProductItems.size() > 1) { shopProductIndex.setProduct_id(productId); shopProductIndex.setProduct_unit_price_max(item_unit_price_max); } - if(oldShopProductItems.size()==1){ + if (oldShopProductItems.size() == 1) { shopProductBase.setProduct_id(productId); shopProductBase.setProduct_unit_price(item_unit_price); shopProductIndex.setProduct_id(productId); @@ -2377,13 +2381,13 @@ public class ShopProductItemServiceImpl extends BaseServiceImpl { */ BigDecimal getStorePackingFee(Integer storeId); + /** + * 根据当前时间检查并获取店铺营业状态 + * + * @param shopStoreBase 店铺基础信息 + * @param shopStoreInfo 店铺详细信息 + * @return 店铺营业状态:1-营业中;2-已打烊; + */ + Integer getStoreBizState(ShopStoreBase shopStoreBase, ShopStoreInfo shopStoreInfo); + // Page getMobileStoreList(Integer page, Integer rows); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMchEntryServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMchEntryServiceImpl.java index fbf9be42..bab62f97 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMchEntryServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMchEntryServiceImpl.java @@ -756,8 +756,8 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl getMobileStoreList(Integer page, Integer rows) { // QueryWrapper queryWrapper=new QueryWrapper<>();