diff --git a/hiver-admin/test-output/test-report.html b/hiver-admin/test-output/test-report.html index 95420d57..465ca002 100644 --- a/hiver-admin/test-output/test-report.html +++ b/hiver-admin/test-output/test-report.html @@ -35,7 +35,7 @@ Hiver
  • -四月 19, 2026 15:11:39 +四月 21, 2026 18:05:31
  • @@ -84,7 +84,7 @@

    passTest

    -

    15:11:39 下午 / 0.015 secs

    +

    18:05:32 下午 / 0.015 secs

    @@ -92,8 +92,8 @@
    #test-id=1
    passTest
    -04.19.2026 15:11:39 -04.19.2026 15:11:39 +04.21.2026 18:05:32 +04.21.2026 18:05:32 0.015 secs
    @@ -104,7 +104,7 @@ Pass - 15:11:39 + 18:05:32 Test passed @@ -128,13 +128,13 @@

    Started

    -

    四月 19, 2026 15:11:39

    +

    四月 21, 2026 18:05:31

    Ended

    -

    四月 19, 2026 15:11:39

    +

    四月 21, 2026 18:05:32

    diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/common/CaptchaController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/common/CaptchaController.java index d9643cd9..9966c877 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/common/CaptchaController.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/common/CaptchaController.java @@ -54,8 +54,8 @@ public class CaptchaController { @RequestMapping(value = "/init", method = RequestMethod.GET) @ApiOperation(value = "鍒濆鍖栭獙璇佺爜") @RateLimiter(rate = 1, ipLimit = true) - public Result initCaptcha(@ApiParam("浠呯敓鎴愭暟瀛") @RequestParam(required = false, defaultValue = "false") Boolean isDigit, - @ApiParam("楠岃瘉鐮侀暱搴") @RequestParam(required = false, defaultValue = "4") Integer length) { + public Result initCaptcha(@ApiParam("浠呯敓鎴愭暟瀛") @RequestParam(value = "isDigit",required = false, defaultValue = "false") Boolean isDigit, + @ApiParam("楠岃瘉鐮侀暱搴") @RequestParam(value = "length",required = false, defaultValue = "4") Integer length) { String captchaId = IdUtil.simpleUUID(); String code; if (isDigit) { diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java index 8bfabcc5..1f07cdd8 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java @@ -38,6 +38,7 @@ import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.math.RoundingMode; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -78,7 +79,7 @@ public class CommentController { if(e.getShopId().toUpperCase().startsWith("W")){ //鏇存柊閰嶉佸憳璇勫垎 Worker worker = workerServiceImpl.findByWorkerId(e.getShopId()); - Integer oldCount = worker.getOrderCount(); + Integer oldCount = worker.getOrderCount() == null ? 0 : worker.getOrderCount(); BigDecimal oldScore = worker.getScore(); BigDecimal score = e.getScore(); @@ -89,8 +90,10 @@ public class CommentController { BigDecimal newScore = oldScore.multiply(new BigDecimal(oldCount)) .add(score) .divide(new BigDecimal(newCount), 2, RoundingMode.HALF_UP); // 淇濈暀2浣嶅皬鏁 + DecimalFormat df = new DecimalFormat("00.00"); - worker.setScore(newScore); + String formattedResult = df.format(newScore); + worker.setScore(new BigDecimal(formattedResult)); // 3. 淇濆瓨鏇存柊 workerServiceImpl.update(worker); @@ -98,7 +101,7 @@ public class CommentController { }else{ //鏇存柊搴楅摵璇勫垎 Shop shop = shopService.findById(e.getShopId()); - Integer oldSaleCount = shop.getSaleCount() + 1; + Integer oldSaleCount = shop.getSaleCount() == null ? 0 : shop.getSaleCount(); BigDecimal oldScore = shop.getShopScore(); BigDecimal score = e.getScore(); @@ -108,8 +111,10 @@ public class CommentController { BigDecimal newScore = oldScore.multiply(new BigDecimal(oldSaleCount)) .add(score) .divide(new BigDecimal(newCount), 2, RoundingMode.HALF_UP); // 淇濈暀2浣嶅皬鏁 + DecimalFormat df = new DecimalFormat("00.00"); - shop.setShopScore(newScore); + String formattedResult = df.format(newScore); + shop.setShopScore(new BigDecimal(formattedResult)); shopService.update(shop); String shopCacheKey = "SHOP_CACHE:" + shop.getRegionId(); @@ -117,13 +122,13 @@ public class CommentController { if (org.apache.commons.lang3.StringUtils.isNotBlank(shopJson)) { ShopCacheDTO cacheDTO = JSONUtil.toBean(shopJson, ShopCacheDTO.class); if (cacheDTO.getShop() != null) { - cacheDTO.getShop().setShopScore(newScore); + cacheDTO.getShop().setShopScore(new BigDecimal(formattedResult)); redisTemplateHelper.hPut(shopCacheKey, shop.getId(), JSONUtil.toJsonStr(cacheDTO)); } } } }); - if(comment != null && comment.get(0).getParentId()!=null){ + if(comment != null && StringUtils.isNotBlank(comment.get(0).getParentId())){ Comment commentPar = commentService.getById(comment.get(0).getParentId()); commentPar.setHasAnswer(1); commentService.updateById(commentPar); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java index 251ee2dd..a5bdfe1f 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java @@ -9,6 +9,7 @@ import cc.hiver.mall.pojo.query.MallOrderPageQuery; import cc.hiver.mall.pojo.vo.MallOrderVO; import cc.hiver.mall.service.mybatis.MallOrderGroupService; import cc.hiver.mall.service.mybatis.MallOrderService; +import cc.hiver.mall.utils.UserPendingOrderCacheUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -32,6 +33,9 @@ public class MallOrderController { @Autowired private MallOrderService mallOrderService; + @Autowired + private UserPendingOrderCacheUtil userPendingOrderCacheUtil; + @Autowired private MallOrderGroupService mallOrderGroupService; @@ -43,6 +47,7 @@ public class MallOrderController { public Result createOrder(@RequestBody CreateOrderDTO dto) { try { MallOrderVO vo = mallOrderService.createOrder(dto); + userPendingOrderCacheUtil.put(dto.getUserId(), vo); return new ResultUtil().setData(vo); } catch (Exception e) { log.error("涓嬪崟澶辫触: {}", e.getMessage(), e); @@ -68,6 +73,30 @@ public class MallOrderController { return new ResultUtil>().setData(mallOrderGroupService.selectMallGroup(group)); } + /** + * 鏌ヨ鐢ㄦ埛褰撳墠寰呭畬鎴愯鍗 + */ + @GetMapping("/getOrdersByUserId/{userId}") + @ApiOperation(value = "鏌ヨ鐢ㄦ埛褰撳墠寰呭畬鎴愯鍗") + public Result> getOrdersByUserId(@ApiParam("鐢ㄦ埛ID") @PathVariable String userId) { + // 1. 鍏堜粠缂撳瓨鑾峰彇 + List orders = userPendingOrderCacheUtil.getAll(userId); + + // 2. 缂撳瓨鏈懡涓紝鏌ユ暟鎹簱 + if (orders == null) { + // 寤鸿锛氬姞涓垽绌猴紝闃叉鏁版嵁搴撲篃娌℃暟鎹椂鍋氭棤鐢ㄥ姛 + orders = mallOrderService.getPeiSongOrders(userId); + + // 3. 銆愬叧閿楠ゃ戝鏋滄煡鍒颁簡鏁版嵁锛屽繀椤诲洖鍐欏埌缂撳瓨锛 + if (orders != null && !orders.isEmpty()) { + // 璁剧疆杩囨湡鏃堕棿锛屾瘮濡 30 鍒嗛挓锛堟牴鎹鍗曞钩鍧囬厤閫佹椂闀垮喅瀹氾級 + userPendingOrderCacheUtil.putAll(userId, orders); + } + } + // 4. 杩斿洖缁撴灉 + return new ResultUtil>().setData(orders); + } + /** * 鏍规嵁鎷煎洟id鏌ヨ鍥㈤暱璁㈠崟閰嶉佽垂淇℃伅 diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopTakeawayController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopTakeawayController.java index 050ae74b..774c9181 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopTakeawayController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopTakeawayController.java @@ -48,7 +48,7 @@ public class ShopTakeawayController { @RequestMapping(value = "/getByShopId", method = RequestMethod.GET) @ApiOperation("鏍规嵁搴楅摵id鑾峰彇澶栧崠涓氬姟閰嶇疆") public Result getByShopId( - @ApiParam("搴楅摵id") @RequestParam String shopId) { + @ApiParam("搴楅摵id") @RequestParam(value = "shopId") String shopId) { final ShopTakeaway shopTakeaway = shopTakeawayService.selectByPrimaryKey(shopId); return new ResultUtil().setData(shopTakeaway); } @@ -81,7 +81,7 @@ public class ShopTakeawayController { @RequestMapping(value = "/deleteByShopId", method = RequestMethod.POST) @ApiOperation("鍒犻櫎澶栧崠涓氬姟閰嶇疆") public Result deleteByShopId( - @ApiParam("搴楅摵id") @RequestParam String shopId) { + @ApiParam("搴楅摵id") @RequestParam(value = "shopId") String shopId) { shopTakeawayService.deleteByPrimaryKey(shopId); return ResultUtil.success("鍒犻櫎鎴愬姛"); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java index d5cf06be..4ff38334 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java @@ -37,4 +37,6 @@ public interface MallDeliveryOrderMapper extends BaseMapper { MallDeliveryOrder selectByGroupId(@Param("orderId") String orderId); + List selectByOrderIds(@Param("ids") List ids); + } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderMapper.java index d851c843..20518040 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderMapper.java @@ -34,4 +34,6 @@ public interface MallOrderMapper extends BaseMapper { Integer selectRefundCount(@Param("shopId") String shopId); List getWeChatId(); + + List getPeiSongOrders(@Param("userId") String userId); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallRefundRecord.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallRefundRecord.java index 5bf0b6de..19b39b2d 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallRefundRecord.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallRefundRecord.java @@ -36,6 +36,8 @@ public class MallRefundRecord implements Serializable { private BigDecimal refundAmount; @ApiModelProperty(value = "閫娆惧師鍥") private String reason; + @ApiModelProperty(value = "鍖哄煙id") + private String regionId; @ApiModelProperty(value = "閫娆惧浘鐗") private String pictures; @ApiModelProperty(value = "閫娆剧姸鎬 0:閫娆惧鐞嗕腑 1:鍚屾剰閫娆 2:锛堝晢瀹舵垨鑰呴厤閫佸憳锛夋嫆缁濋娆 閫娆惧け璐 3鍞悗涓 4鍚屾剰鍞悗 5 锛堝晢瀹舵垨鑰呴厤閫佸憳锛夋嫆缁濆敭鍚") @@ -61,6 +63,11 @@ public class MallRefundRecord implements Serializable { @TableField(exist = false) private MallOrder mallOrder; + @ApiModelProperty("鍞悗璁㈠崟閰嶉佽鎯") + @Transient + @TableField(exist = false) + private MallDeliveryOrder mallDeliveryOrder; + @ApiModelProperty("璁㈠崟鏄惁閰嶉") @Transient @TableField(exist = false) diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallRefundRecordPageQuery.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallRefundRecordPageQuery.java index 79b85b73..e1f78f1b 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallRefundRecordPageQuery.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallRefundRecordPageQuery.java @@ -20,6 +20,9 @@ public class MallRefundRecordPageQuery extends HiverBasePageQuery { @ApiModelProperty(value = "鍏宠仈鐨勫晢瀹舵垨鑰呴厤閫佸憳ID 濡傛灉 refundType = 3 && refundTypeStatus == 3 MallRefundRecord瀛樹袱鏉¤褰") private String linkId; + @ApiModelProperty(value = "鍖哄煙id") + private String regionId; + @ApiModelProperty("澶氱鐘舵佹煡") private List statusList; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java index 5a8b981f..518ddb7e 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java @@ -83,4 +83,6 @@ public interface MallDeliveryOrderService extends IService { MallDeliveryOrder selectByGroupId(String orderId); MallOrder insertDeliveryOrder(MallDeliveryOrder deliveryOrder); + + List selectByOrderIds(List ids); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java index 3bef9f0b..73573546 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; +import java.util.List; import java.util.Map; /** @@ -86,4 +87,6 @@ public interface MallOrderService extends IService { MallOrder selectMallOrderByGroupId(@Param("groupId") String groupId); Map countByShop(String shopId); + + List getPeiSongOrders(String userId); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java index b3ab1db8..845338d8 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java @@ -13,12 +13,14 @@ import cc.hiver.mall.entity.*; import cc.hiver.mall.mq.OrderAsyncProducer; import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery; import cc.hiver.mall.pojo.query.MallRefundRecordPageQuery; +import cc.hiver.mall.pojo.vo.MallOrderVO; import cc.hiver.mall.service.ShopService; import cc.hiver.mall.service.mybatis.MallDeliveryOrderService; import cc.hiver.mall.service.mybatis.MallOrderService; import cc.hiver.mall.service.mybatis.MallRefundRecordService; import cc.hiver.mall.service.mybatis.MallUserCouponService; import cc.hiver.mall.utils.MerchantOrderSeqUtil; +import cc.hiver.mall.utils.UserPendingOrderCacheUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -34,6 +36,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.sql.Timestamp; +import java.text.DecimalFormat; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; @@ -83,6 +86,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl goods, + MallOrderGroup group, MallDeliveryOrder delivery) { + MallOrderVO vo = new MallOrderVO(); + org.springframework.beans.BeanUtils.copyProperties(order, vo); + vo.setGoodsList(goods); + vo.setGroupInfo(group); + vo.setDeliveryInfo(delivery); + return vo; + } + //璁剧疆鍟嗗鍑洪瓒呮椂鎻愰啋 private void triggerShopCookTimeoutEvent(List orderId) { orderId.forEach(id -> { @@ -267,6 +318,15 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl oUw = new LambdaUpdateWrapper<>(); oUw.in(MallOrder::getId, orderIds).set(MallOrder::getStatus, ORDER_STATUS_DELIVERING); mallOrderService.update(oUw); + //鏇存柊缂撳瓨 + for (String orderId : orderIds) { + MallOrder orderInner = mallOrderService.getById(orderId); + delivery.setGetTime(new Date()); + delivery.setStatus(STATUS_DELIVERING); + MallOrderVO orderVO = buildVO(orderInner, null, null, delivery); + orderVO.setStatus(ORDER_STATUS_DELIVERING); + userPendingOrderCacheUtil.update(orderInner.getUserId(), orderVO); + } } }else{ // 鍚屾璁㈠崟鐘舵 -> 閰嶉佷腑 @@ -275,6 +335,12 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl orderIdList = Arrays.asList(group.getGroupOrderIds().split(",")); - + //鏇存柊缂撳瓨 + for (String orderId : orderIdList) { + MallOrder orderInner = mallOrderService.getById(orderId); + userPendingOrderCacheUtil.remove(orderInner.getUserId(),orderInner.getId()); + } LambdaUpdateWrapper oqw = new LambdaUpdateWrapper<>(); oqw.in(MallOrder::getId, orderIdList).set(MallOrder::getStatus,ORDER_STATUS_DONE); mallOrderService.update(oqw); @@ -321,6 +391,10 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl selectByOrderIds(List ids) { + return this.baseMapper.selectByOrderIds(ids); + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java index 6066291b..116aa12c 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java @@ -6,10 +6,12 @@ import cc.hiver.core.entity.Worker; import cc.hiver.core.service.WorkerService; import cc.hiver.mall.dao.mapper.*; import cc.hiver.mall.entity.*; +import cc.hiver.mall.pojo.vo.MallOrderVO; import cc.hiver.mall.service.mybatis.MallOrderGroupService; import cc.hiver.mall.service.mybatis.MallOrderService; import cc.hiver.mall.service.mybatis.MallUserCouponService; import cc.hiver.mall.utils.MerchantOrderSeqUtil; +import cc.hiver.mall.utils.UserPendingOrderCacheUtil; import cc.hiver.mall.utils.WechatPayUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -71,6 +73,9 @@ public class MallOrderGroupServiceImpl extends ServiceImpl goods, + MallOrderGroup group, MallDeliveryOrder delivery) { + MallOrderVO vo = new MallOrderVO(); + org.springframework.beans.BeanUtils.copyProperties(order, vo); + vo.setGoodsList(goods); + vo.setGroupInfo(group); + vo.setDeliveryInfo(delivery); + return vo; + } + /** * 瑙﹀彂閰嶉佽鍗曞紓姝ヤ簨浠讹紙寰俊鎺ㄧ粰楠戞墜銆佸姞鍏ヨ秴鏃舵鏌ユ淇¢槦鍒楃瓑锛 */ diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java index 2db42df0..f4656962 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java @@ -21,6 +21,7 @@ import cc.hiver.mall.service.mybatis.MallDeliveryOrderService; import cc.hiver.mall.service.mybatis.MallOrderGroupService; import cc.hiver.mall.service.mybatis.MallOrderService; import cc.hiver.mall.utils.MerchantOrderSeqUtil; +import cc.hiver.mall.utils.UserPendingOrderCacheUtil; import cc.hiver.mall.utils.WechatPayUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; @@ -91,6 +92,9 @@ public class MallOrderServiceImpl extends ServiceImpl().eq("id",dto.getShopId()).set("sale_count",shopSaleCount)); - } - // 澧為噺鏇存柊Redis缂撳瓨锛堝簵閾洪攢閲 + 鍟嗗搧閿閲忥級锛屾敼涓轰氦缁橫Q寮傛澶勭悊 try { java.util.Map asyncParams = new java.util.HashMap<>(); @@ -496,6 +492,9 @@ public class MallOrderServiceImpl extends ServiceImpl 璺宠繃寰呭晢瀹舵帴鍗曪紝鐩存帴杩涘叆寰呴厤閫佹垨寰呮秷璐 if (DELIVERY_TYPE_EXPRESS == order.getDeliveryType()) { updateOrderStatus(orderId, STATUS_WAIT_DELIVERY); + MallOrderVO orderVO = buildVO(order, null, null, null); + orderVO.setStatus(STATUS_WAIT_DELIVERY); + userPendingOrderCacheUtil.update(order.getUserId(), orderVO); // 婵娲婚厤閫佸崟锛岀姸鎬佹敼涓哄緟鎺ュ崟(0) Date createTime = new Timestamp(System.currentTimeMillis()); // 1. 鑾峰彇褰撳墠鏃堕棿 (LocalDateTime) @@ -516,10 +515,16 @@ public class MallOrderServiceImpl extends ServiceImpl uw = new LambdaUpdateWrapper<>(); uw.eq(MallOrder::getId, orderId).set(MallOrder::getStatus, STATUS_WAIT_PICKUP).set(MallOrder::getNumberCode, latestSeq); this.update(uw); + MallOrderVO orderVO = buildVO(order, null, null, null); + orderVO.setStatus(STATUS_WAIT_PICKUP); + userPendingOrderCacheUtil.update(order.getUserId(), orderVO); } } else if (order.getOrderType() == ORDER_TYPE_GROUP || order.getOrderType() == ORDER_TYPE_FACETOFACE) { // 鎷煎洟璁㈠崟鏀粯鎴愬姛 -> 鏀逛负寰呮垚鍥 updateOrderStatus(orderId, STATUS_WAIT_GROUP); + MallOrderVO orderVO = buildVO(order, null, null, null); + orderVO.setStatus(STATUS_WAIT_GROUP); + userPendingOrderCacheUtil.update(order.getUserId(), orderVO); // 鏌ユ壘灞炰簬璇ヨ鍗曠殑鎷煎洟骞舵鏌ユ垚鍥㈡潯浠 LambdaQueryWrapper gq = new LambdaQueryWrapper<>(); @@ -686,6 +691,10 @@ public class MallOrderServiceImpl extends ServiceImpl uw = new LambdaUpdateWrapper<>(); uw.eq(MallOrder::getId, orderId).set(MallOrder::getShopMakeTime,new Date()); @@ -969,6 +987,7 @@ public class MallOrderServiceImpl extends ServiceImpl uw = new LambdaUpdateWrapper<>(); @@ -1013,6 +1032,8 @@ public class MallOrderServiceImpl extends ServiceImpl getPeiSongOrders(String userId) { + List orders = this.baseMapper.getPeiSongOrders(userId); + if(orders != null && !orders.isEmpty()){ + orders.forEach(order -> { + // 閰嶉佷俊鎭 + if(order.getOrderType() == ORDER_TYPE_FACETOFACE){ + order.setDeliveryInfo(mallDeliveryOrderMapper.selectByGroupId(order.getId())); + }else{ + LambdaQueryWrapper dq = new LambdaQueryWrapper<>(); + dq.eq(MallDeliveryOrder::getOrderId, order.getId()).last("LIMIT 1"); + order.setDeliveryInfo(mallDeliveryOrderMapper.selectOne(dq)); + } + }); + } + return orders; + } + // ================================================================ // 鏌ヨ // ================================================================ @@ -1202,8 +1241,15 @@ public class MallOrderServiceImpl extends ServiceImpl().eq("id",shopId).set("sale_count",(oldSaleCount1 != null ? oldSaleCount1 : 0) + 1)); + } redisTemplateHelper.hPut(shopCacheKey, shopId, JSONUtil.toJsonStr(cacheDTO)); + } } } @@ -1225,8 +1271,19 @@ public class MallOrderServiceImpl extends ServiceImpl goodsList = mallOrderGoodsMapper.selectByOrderId(order.getId()); if (goodsList == null || goodsList.isEmpty()) return; @@ -1672,6 +1735,10 @@ public class MallOrderServiceImpl extends ServiceImpl duw = new LambdaUpdateWrapper<>(); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java index 1561b6d3..52940d8e 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java @@ -6,9 +6,11 @@ import cc.hiver.core.serviceimpl.WorkerServiceImpl; import cc.hiver.mall.dao.mapper.*; import cc.hiver.mall.entity.*; import cc.hiver.mall.pojo.query.MallRefundRecordPageQuery; +import cc.hiver.mall.pojo.vo.MallOrderVO; import cc.hiver.mall.service.mybatis.MallOrderService; import cc.hiver.mall.service.mybatis.MallRefundRecordService; import cc.hiver.mall.service.mybatis.MallUserCouponService; +import cc.hiver.mall.utils.UserPendingOrderCacheUtil; import cc.hiver.mall.utils.WechatPayUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -17,6 +19,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; @@ -39,6 +42,8 @@ public class MallRefundRecordServiceImpl extends ServiceImpl oUw = new LambdaUpdateWrapper<>(); oUw.eq(MallOrder::getId, mallRefundRecord.getOrderId()) .set(MallOrder::getStatus, 11); mallOrderService.update(oUw); + MallOrder order = mallOrderService.getById(mallRefundRecord.getOrderId()); BigDecimal ratio = null; LambdaQueryWrapper uq = new LambdaQueryWrapper<>(); uq.eq(MallUserCoupon::getOrderId, mallRefundRecord.getOrderId()); @@ -108,6 +118,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl uw = new LambdaUpdateWrapper<>(); uw.eq(MallRefundRecord::getId, mallRefundRecord.getId()) @@ -200,7 +212,9 @@ public class MallRefundRecordServiceImpl extends ServiceImpl duw = new LambdaUpdateWrapper<>(); @@ -245,8 +271,16 @@ public class MallRefundRecordServiceImpl extends ServiceImpl duw = new LambdaUpdateWrapper<>(); @@ -292,18 +326,30 @@ public class MallRefundRecordServiceImpl extends ServiceImpl duw = new LambdaUpdateWrapper<>(); @@ -314,8 +360,16 @@ public class MallRefundRecordServiceImpl extends ServiceImpl duw = new LambdaUpdateWrapper<>(); @@ -326,8 +380,10 @@ public class MallRefundRecordServiceImpl extends ServiceImpl()).get(0)); + MallOrder order = orderMap.getOrDefault(vo.getOrderId(), new java.util.ArrayList<>()).get(0); + if(order != null){ + vo.setMallOrder(order); + if(order.getDeliveryType() == DELIVERY_TYPE_PEISONG){ + // 閰嶉佷俊鎭 + if(order.getOrderType() == ORDER_TYPE_FACETOFACE){ + vo.setMallDeliveryOrder(mallDeliveryOrderMapper.selectByGroupId(order.getId())); + }else{ + LambdaQueryWrapper dq = new LambdaQueryWrapper<>(); + dq.eq(MallDeliveryOrder::getOrderId, order.getId()).last("LIMIT 1"); + vo.setMallDeliveryOrder(mallDeliveryOrderMapper.selectOne(dq)); + } + } + } } } return result; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallUserCouponServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallUserCouponServiceImpl.java index ba3611ac..ce4691cf 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallUserCouponServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallUserCouponServiceImpl.java @@ -122,7 +122,7 @@ public class MallUserCouponServiceImpl extends ServiceImpl uw = new UpdateWrapper<>(); - uw.eq("order_id", orderId).in("status", 1, 2) + uw.eq("order_id", orderId) .set("status", 0) .set("order_id", null) .set("use_time", null); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/UserPendingOrderCacheUtil.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/UserPendingOrderCacheUtil.java new file mode 100644 index 00000000..9abf521f --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/UserPendingOrderCacheUtil.java @@ -0,0 +1,273 @@ +package cc.hiver.mall.utils; + +import cc.hiver.core.common.redis.RedisTemplateHelper; +import cc.hiver.mall.pojo.vo.MallOrderVO; +import cn.hutool.json.JSONUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 鐢ㄦ埛寰呭畬鎴愯鍗曠紦瀛樺伐鍏风被 + *

    + * 搴曞眰浣跨敤 Redis Hash 缁撴瀯锛屼繚璇佹寜 userId + orderId 缁村害鐨 O(1) 璇诲啓鏁堢巼銆 + *

    + *   Key   = USER_PENDING_ORDERS:{userId}
    + *   Field = orderId
    + *   Value = MallOrderVO 鐨 JSON 搴忓垪鍖
    + * 
    + *

    + * 浣跨敤鍦烘櫙锛氳鍗曠姸鎬佸彂鐢熷彉鍖栨椂锛堝垱寤恒佹洿鏂般佸彇娑堛佸畬鎴愮瓑锛夛紝 + * 鐢变笟鍔℃柟涓诲姩璋冪敤鏈伐鍏风被鐨勬柟娉曠淮鎶ょ紦瀛橈紝浠ュ噺灏 getOrdersByUserId 鎺ュ彛瀵规暟鎹簱鐨勬煡璇㈠帇鍔涖 + * + * @author system + */ +@Slf4j +@Component +public class UserPendingOrderCacheUtil { + + /** Redis Key 鍓嶇紑 */ + private static final String KEY_PREFIX = "USER_PENDING_ORDERS:"; + + /** 璁㈠崟瀹屾垚/鍙栨秷/閫娆剧瓑涓嶅啀灞炰簬"寰呭畬鎴"鐨勭姸鎬侀泦鍚 */ + private static final int STATUS_DONE = 5; + private static final int STATUS_CANCELLED = 6; + private static final int STATUS_REFUNDED = 8; + private static final int STATUS_RETURNED = 12; + + @Autowired + private RedisTemplateHelper redisTemplateHelper; + + // ================================================================ + // Key 鏋勫缓 + // ================================================================ + + private String buildKey(String userId) { + return KEY_PREFIX + userId; + } + + // ================================================================ + // 瀛樻斁锛坧ut锛 + // ================================================================ + + /** + * 瀛樻斁鍗曚釜璁㈠崟鍒扮紦瀛 + * + * @param userId 鐢ㄦ埛ID + * @param orderVO 璁㈠崟VO锛堝繀椤诲寘鍚湁鏁堢殑 id锛 + */ + public void put(String userId, MallOrderVO orderVO) { + if (StringUtils.isBlank(userId) || orderVO == null || StringUtils.isBlank(orderVO.getId())) { + log.warn("UserPendingOrderCacheUtil.put 鍙傛暟鏃犳晥, userId={}, orderVO={}", userId, orderVO); + return; + } + try { + String key = buildKey(userId); + String json = JSONUtil.toJsonStr(orderVO); + redisTemplateHelper.hPut(key, orderVO.getId(), json); + log.debug("缂撳瓨鐢ㄦ埛寰呭畬鎴愯鍗: userId={}, orderId={}", userId, orderVO.getId()); + } catch (Exception e) { + log.error("缂撳瓨鐢ㄦ埛寰呭畬鎴愯鍗曞け璐: userId={}, orderId={}", userId, orderVO.getId(), e); + } + } + + /** + * 鎵归噺瀛樻斁璁㈠崟鍒扮紦瀛橈紙閫氬父鐢ㄤ簬缂撳瓨棰勭儹 / 棣栨鍔犺浇锛 + * + * @param userId 鐢ㄦ埛ID + * @param orders 璁㈠崟鍒楄〃 + */ + public void putAll(String userId, List orders) { + if (StringUtils.isBlank(userId) || orders == null || orders.isEmpty()) { + return; + } + try { + String key = buildKey(userId); + java.util.Map map = new java.util.LinkedHashMap<>(orders.size()); + for (MallOrderVO order : orders) { + if (order != null && StringUtils.isNotBlank(order.getId())) { + map.put(order.getId(), JSONUtil.toJsonStr(order)); + } + } + if (!map.isEmpty()) { + redisTemplateHelper.hPutAll(key, map); + log.debug("鎵归噺缂撳瓨鐢ㄦ埛寰呭畬鎴愯鍗: userId={}, count={}", userId, map.size()); + } + } catch (Exception e) { + log.error("鎵归噺缂撳瓨鐢ㄦ埛寰呭畬鎴愯鍗曞け璐: userId={}", userId, e); + } + } + + // ================================================================ + // 鍒犻櫎锛坮emove锛 + // ================================================================ + + /** + * 鏍规嵁 userId 鍜 orderId 浠庣紦瀛樹腑鍒犻櫎鎸囧畾璁㈠崟 + *

    + * 鍏稿瀷鍦烘櫙锛氳鍗曞畬鎴愩佸彇娑堛侀娆炬垚鍔熷悗璋冪敤銆 + * + * @param userId 鐢ㄦ埛ID + * @param orderId 璁㈠崟ID + */ + public void remove(String userId, String orderId) { + if (StringUtils.isBlank(userId) || StringUtils.isBlank(orderId)) { + log.warn("UserPendingOrderCacheUtil.remove 鍙傛暟鏃犳晥, userId={}, orderId={}", userId, orderId); + return; + } + try { + String key = buildKey(userId); + redisTemplateHelper.hDelete(key, orderId); + log.debug("鍒犻櫎鐢ㄦ埛寰呭畬鎴愯鍗曠紦瀛: userId={}, orderId={}", userId, orderId); + } catch (Exception e) { + log.error("鍒犻櫎鐢ㄦ埛寰呭畬鎴愯鍗曠紦瀛樺け璐: userId={}, orderId={}", userId, orderId, e); + } + } + + /** + * 娓呴櫎鎸囧畾鐢ㄦ埛鐨勬墍鏈夊緟瀹屾垚璁㈠崟缂撳瓨 + *

    + * 鍏稿瀷鍦烘櫙锛氶渶瑕佸己鍒跺埛鏂拌鐢ㄦ埛缂撳瓨鏃惰皟鐢ㄣ + * + * @param userId 鐢ㄦ埛ID + */ + public void removeAll(String userId) { + if (StringUtils.isBlank(userId)) { + return; + } + try { + redisTemplateHelper.delete(buildKey(userId)); + log.debug("娓呴櫎鐢ㄦ埛鍏ㄩ儴寰呭畬鎴愯鍗曠紦瀛: userId={}", userId); + } catch (Exception e) { + log.error("娓呴櫎鐢ㄦ埛鍏ㄩ儴寰呭畬鎴愯鍗曠紦瀛樺け璐: userId={}", userId, e); + } + } + + // ================================================================ + // 鏇存柊锛坲pdate锛 + // ================================================================ + + /** + * 鏍规嵁 userId 鍜 orderId 鏇存柊缂撳瓨涓殑璁㈠崟淇℃伅 + *

    + * 濡傛灉鏇存柊鍚庣殑璁㈠崟鐘舵佸凡缁忎笉灞炰簬"寰呭畬鎴"锛坰tatus 鈭 {5,6,8,12}锛夛紝 + * 鍒欒嚜鍔ㄤ粠缂撳瓨涓Щ闄よ璁㈠崟锛屾棤闇璋冪敤鏂归澶栧垽鏂 + * + * @param userId 鐢ㄦ埛ID + * @param orderVO 鏇存柊鍚庣殑璁㈠崟VO + */ + public void update(String userId, MallOrderVO orderVO) { + if (StringUtils.isBlank(userId) || orderVO == null || StringUtils.isBlank(orderVO.getId())) { + log.warn("UserPendingOrderCacheUtil.update 鍙傛暟鏃犳晥, userId={}, orderVO={}", userId, orderVO); + return; + } + try { + // 濡傛灉璁㈠崟鐘舵佸凡涓嶅睘浜庡緟瀹屾垚锛岀洿鎺ュ垹闄 + if (isTerminalStatus(orderVO.getStatus())) { + remove(userId, orderVO.getId()); + log.debug("璁㈠崟宸茬粓鎬侊紝浠庣紦瀛樼Щ闄: userId={}, orderId={}, status={}", + userId, orderVO.getId(), orderVO.getStatus()); + return; + } + // 鍚﹀垯瑕嗙洊鏇存柊 + put(userId, orderVO); + log.debug("鏇存柊鐢ㄦ埛寰呭畬鎴愯鍗曠紦瀛: userId={}, orderId={}, status={}", + userId, orderVO.getId(), orderVO.getStatus()); + } catch (Exception e) { + log.error("鏇存柊鐢ㄦ埛寰呭畬鎴愯鍗曠紦瀛樺け璐: userId={}, orderId={}", userId, orderVO.getId(), e); + } + } + + // ================================================================ + // 鏌ヨ锛坓et锛 + // ================================================================ + + /** + * 鑾峰彇鐢ㄦ埛鍏ㄩ儴寰呭畬鎴愯鍗曠紦瀛 + * + * @param userId 鐢ㄦ埛ID + * @return 缂撳瓨鐨勮鍗曞垪琛紝缂撳瓨涓嶅瓨鍦ㄦ椂杩斿洖 null锛堣皟鐢ㄦ柟鍙嵁姝ゅ垽鏂槸鍚﹂渶瑕佸洖婧愭煡搴擄級 + */ + public List getAll(String userId) { + if (StringUtils.isBlank(userId)) { + return null; + } + try { + String key = buildKey(userId); + Map entries = redisTemplateHelper.hGetAll(key); + if (entries == null || entries.isEmpty()) { + return null; + } + List result = new ArrayList<>(entries.size()); + for (Object value : entries.values()) { + if (value != null) { + result.add(JSONUtil.toBean(value.toString(), MallOrderVO.class)); + } + } + return result; + } catch (Exception e) { + log.error("鑾峰彇鐢ㄦ埛寰呭畬鎴愯鍗曠紦瀛樺け璐: userId={}", userId, e); + return null; + } + } + + /** + * 鑾峰彇鐢ㄦ埛缂撳瓨涓殑鍗曚釜璁㈠崟 + * + * @param userId 鐢ㄦ埛ID + * @param orderId 璁㈠崟ID + * @return 缂撳瓨鐨勮鍗昖O锛屼笉瀛樺湪鏃惰繑鍥 null + */ + public MallOrderVO get(String userId, String orderId) { + if (StringUtils.isBlank(userId) || StringUtils.isBlank(orderId)) { + return null; + } + try { + String key = buildKey(userId); + Object value = redisTemplateHelper.hGet(key, orderId); + if (value == null) { + return null; + } + return JSONUtil.toBean(value.toString(), MallOrderVO.class); + } catch (Exception e) { + log.error("鑾峰彇鐢ㄦ埛鍗曚釜寰呭畬鎴愯鍗曠紦瀛樺け璐: userId={}, orderId={}", userId, orderId, e); + return null; + } + } + + /** + * 鍒ゆ柇璇ョ敤鎴风殑缂撳瓨鏄惁宸插瓨鍦 + * + * @param userId 鐢ㄦ埛ID + * @return true 琛ㄧず缂撳瓨瀛樺湪 + */ + public boolean exists(String userId) { + if (StringUtils.isBlank(userId)) { + return false; + } + Boolean hasKey = redisTemplateHelper.hasKey(buildKey(userId)); + return hasKey != null && hasKey; + } + + // ================================================================ + // 鍐呴儴宸ュ叿 + // ================================================================ + + /** + * 鍒ゆ柇璁㈠崟鐘舵佹槸鍚︿负缁堟侊紙涓嶅啀灞炰簬"寰呭畬鎴"锛 + */ + private boolean isTerminalStatus(Integer status) { + if (status == null) { + return false; + } + return status == STATUS_DONE + || status == STATUS_CANCELLED + || status == STATUS_REFUNDED + || status == STATUS_RETURNED; + } +} diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml index 1384b957..fe04ca75 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml @@ -202,6 +202,27 @@ + + + + + diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml index c77fb679..deee28e3 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml @@ -17,6 +17,7 @@ +