diff --git a/hiver-admin/test-output/test-report.html b/hiver-admin/test-output/test-report.html index 24c41a7a..82584f4c 100644 --- a/hiver-admin/test-output/test-report.html +++ b/hiver-admin/test-output/test-report.html @@ -35,7 +35,7 @@ Hiver
  • -四月 25, 2026 17:38:11 +四月 26, 2026 11:40:47
  • @@ -84,7 +84,7 @@

    passTest

    -

    17:38:11 下午 / 0.017 secs

    +

    11:40:47 上午 / 0.015 secs

    @@ -92,9 +92,9 @@
    #test-id=1
    passTest
    -04.25.2026 17:38:11 -04.25.2026 17:38:11 -0.017 secs +04.26.2026 11:40:47 +04.26.2026 11:40:47 +0.015 secs
    @@ -104,7 +104,7 @@ Pass - 17:38:11 + 11:40:47 Test passed @@ -128,13 +128,13 @@

    Started

    -

    四月 25, 2026 17:38:11

    +

    四月 26, 2026 11:40:47

    Ended

    -

    四月 25, 2026 17:38:11

    +

    四月 26, 2026 11:40:47

    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 c157cbae..2de939f6 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 @@ -29,6 +29,7 @@ import cc.hiver.mall.pojo.query.CommentQuery; import cc.hiver.mall.pojo.vo.WorkerRedisVo; import cc.hiver.mall.service.CommentService; import cc.hiver.mall.service.ShopService; +import cc.hiver.mall.utils.CommentCacheUtil; import cc.hiver.mall.utils.WorkerRedisCacheUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -62,6 +63,9 @@ public class CommentController { @Autowired WorkerRedisCacheUtil workerRedisCacheUtil; + @Autowired + CommentCacheUtil commentCacheUtil; + @Autowired private ShopService shopService; @@ -71,6 +75,7 @@ public class CommentController { @Autowired private WorkerServiceImpl workerServiceImpl; + @RequestMapping(value = "/save", method = RequestMethod.POST) @ApiOperation("淇濆瓨") public Result save( @RequestBody List comment) { @@ -138,11 +143,17 @@ public class CommentController { } } } + //鏀捐繘缂撳瓨 灏忎簬4鍒 + if(e.getScore().compareTo(new BigDecimal(4)) < 0){ + commentCacheUtil.put(e.getShopId(),e); + } }); if(comment != null && StringUtils.isNotBlank(comment.get(0).getParentId())){ Comment commentPar = commentService.getById(comment.get(0).getParentId()); commentPar.setHasAnswer(1); commentService.updateById(commentPar); + //缂撳瓨鍘绘帀 + commentCacheUtil.remove(commentPar.getShopId(),commentPar.getId()); } commentService.saveBatch(comment); return ResultUtil.success("璇勮鎴愬姛"); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java index b03964e9..24066364 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java @@ -133,8 +133,9 @@ public class MallDeliveryOrderController { @PostMapping("/countOrderByStatus") @ApiOperation(value = "鏌ヨ褰撳墠閰嶉佸憳鎸囨淳鍗曞拰宸叉帴鍗曟暟閲") - public Result>> countOrderByStatus(@RequestParam String workerId) { - return new ResultUtil>>().setData(mallDeliveryOrderService.countOrdersByStatus(workerId)); + public Result>> countOrderByStatus(@RequestParam(value = "workerId") String workerId, + @RequestParam(value = "regionId") String regionId) { + return new ResultUtil>>().setData(mallDeliveryOrderService.countOrdersByStatus(workerId, regionId)); } @PostMapping("/pagebyworker") diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java index d83c0871..61905063 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java @@ -22,6 +22,7 @@ import cc.hiver.mall.pojo.vo.WorkerRedisVo; import cc.hiver.mall.service.RechargeService; import cc.hiver.mall.service.ShopAreaService; import cc.hiver.mall.service.mybatis.WorkerRelaPriceService; +import cc.hiver.mall.utils.WaitOrderCacheUtil; import cc.hiver.mall.utils.WorkerOrderCacheUtil; import cc.hiver.mall.utils.WorkerRedisCacheUtil; import cn.hutool.core.util.StrUtil; @@ -66,6 +67,9 @@ public class WorkerController { @Autowired private WorkerRelaPriceService workerRelaPriceService; + @Autowired + private WaitOrderCacheUtil waitOrderCacheUtil; + @Autowired private ShopAreaService shopAreaService; @@ -355,14 +359,15 @@ public class WorkerController { // ---- 浠庤鍗曠紦瀛樿幏鍙栬閰嶉佸憳鐨勫緟瀹屾垚璁㈠崟锛岀粺璁″悇鐘舵佹暟閲 ---- List workerOrders = workerOrderCacheUtil.getAllAsList(w.getWorkerId()); - int orderWaitCount = 0; // status=0 寰呮帴鍗 + int orderWaitCount = waitOrderCacheUtil.getAllByWorkerId(w.getWorkerId(),dto.getRegionId()); // status=0 寰呮帴鍗 int orderGetCount = 0; // status=1 寰呭彇璐 int orderPutCount = 0; // status=2 寰呴佽揪 boolean hasSamePutArea = false; + //寰呮帴鍗 + for (MallDeliveryOrder order : workerOrders) { if (order.getStatus() == null) continue; - if (order.getStatus() == 0) orderWaitCount++; else if (order.getStatus() == 1) orderGetCount++; else if (order.getStatus() == 2) orderPutCount++; 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 518ddb7e..c0a70fa4 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 @@ -63,7 +63,7 @@ public interface MallDeliveryOrderService extends IService { List> countOrdersByType(String regionId); - List> countOrdersByStatus(String workerId); + List> countOrdersByStatus(String workerId,String regionId); /** * 鐢ㄦ埛澧炲姞閰嶉佽垂锛堝湪鐜版湁 deliveryFee 鍩虹涓婅拷鍔狅級 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 cc5cae3b..169c157b 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 @@ -5,16 +5,14 @@ import cc.hiver.core.common.sms.SmsUtil; import cc.hiver.core.entity.Worker; import cc.hiver.core.serviceimpl.JPushServiceImpl; import cc.hiver.core.serviceimpl.WorkerServiceImpl; -import cc.hiver.mall.dao.mapper.MallDeliveryOrderMapper; -import cc.hiver.mall.dao.mapper.MallOrderGoodsMapper; -import cc.hiver.mall.dao.mapper.MallOrderGroupMapper; -import cc.hiver.mall.dao.mapper.ShopTakeawayMapper; +import cc.hiver.mall.dao.mapper.*; 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.pojo.vo.WorkerRedisVo; +import cc.hiver.mall.service.CommentService; import cc.hiver.mall.service.ShopService; import cc.hiver.mall.service.mybatis.MallDeliveryOrderService; import cc.hiver.mall.service.mybatis.MallOrderService; @@ -95,6 +93,12 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl pageDelivery(MallDeliveryOrderPageQuery q) { if (Boolean.TRUE.equals(q.getHallOnly())) { @@ -631,24 +641,70 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl> countOrdersByStatus(String workerId) { - List> returnList = this.baseMapper.countOrdersByStatus(workerId); - MallRefundRecordPageQuery q = new MallRefundRecordPageQuery(); - q.setPageSize(PAGE_SIZE); - IPage page = new Page<>(q.getPageNum(), q.getPageSize()); - q.setLinkId(workerId); - List statusList = new ArrayList<>(); - //鏌ュ緟鍞悗寰呴娆炬暟 - statusList.add(STATUS_WAIT_ACCEPT); - statusList.add(STATUS_DONE); - q.setStatusList(statusList); - IPage result = mallRefundRecordService.selectPageVO(q); - if(result != null){ + public List> countOrdersByStatus(String workerId,String regionId) { + List> returnList = new ArrayList<>(); + // ---- 浠庤鍗曠紦瀛樿幏鍙栬閰嶉佸憳鐨勫緟瀹屾垚璁㈠崟锛岀粺璁″悇鐘舵佹暟閲 ---- + List workerOrders = workerOrderCacheUtil.getAllAsList(workerId); + if(workerOrders != null){ + int orderWaitCount = waitOrderCacheUtil.getAllByWorkerId(workerId,regionId); // status=0 寰呮帴鍗 + int orderGetCount = 0; // status=1 寰呭彇璐 + int orderPutCount = 0; // status=2 寰呴佽揪 + + for (MallDeliveryOrder order : workerOrders) { + if (order.getStatus() == null) continue; + else if (order.getStatus() == 1) orderGetCount++; + else if (order.getStatus() == 2) orderPutCount++; + } Map newRecord = new HashMap<>(); - newRecord.put("status", STATUS_DONE); // 鐘舵 - newRecord.put("orderCount", result.getRecords().size()); + newRecord.put("status", 0); // 鐘舵 + newRecord.put("orderCount", orderWaitCount); returnList.add(newRecord); + + Map newRecord1 = new HashMap<>(); + newRecord1.put("status", 1); // 鐘舵 + newRecord1.put("orderCount", orderGetCount); + returnList.add(newRecord1); + + Map newRecord2 = new HashMap<>(); + newRecord2.put("status", 2); // 鐘舵 + newRecord2.put("orderCount", orderPutCount); + returnList.add(newRecord2); + }else{ + returnList = this.baseMapper.countOrdersByStatus(workerId); + } + + Integer pendingBadReviewCount = 0; + List all = refundOrderCacheUtil.getAll(workerId); + if(all != null){ + pendingBadReviewCount = all.size(); + }else{ + //鏌ュ緟鍞悗寰呴娆炬暟 + MallRefundRecordPageQuery q = new MallRefundRecordPageQuery(); + q.setPageSize(PAGE_SIZE); + IPage page = new Page<>(q.getPageNum(), q.getPageSize()); + q.setLinkId(workerId); + List statusList = new ArrayList<>(); + statusList.add(STATUS_WAIT_ACCEPT); + statusList.add(STATUS_DONE); + q.setStatusList(statusList); + IPage result = mallRefundRecordService.selectPageVO(q); + if(result != null && !result.getRecords().isEmpty()){ + pendingBadReviewCount = result.getRecords().size(); + } + } + + + List all1 = commentCacheUtil.getAll(workerId); + if(all1 != null){ + pendingBadReviewCount += all1.size(); + }else{ + //鏌ヨ寰呭洖澶嶅樊璇 + pendingBadReviewCount += mallOrderMapper.selectPendingBadReviewCount(workerId); } + Map newRecord = new HashMap<>(); + newRecord.put("status", STATUS_DONE); // 鐘舵 + newRecord.put("orderCount", pendingBadReviewCount); + returnList.add(newRecord); return returnList; } 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 17bb5c07..09b9152c 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 @@ -93,6 +93,9 @@ public class MallOrderServiceImpl extends ServiceImpl 3){ //澶勭悊鍞悗 diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/CommentCacheUtil.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/CommentCacheUtil.java new file mode 100644 index 00000000..763bb235 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/CommentCacheUtil.java @@ -0,0 +1,253 @@ +package cc.hiver.mall.utils; + +import cc.hiver.core.common.redis.RedisTemplateHelper; +import cc.hiver.mall.entity.Comment; +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 缁撴瀯锛屼繚璇佹寜 linkId + orderId 缁村害鐨 O(1) 璇诲啓鏁堢巼銆 + *

    + *   Key   = COMMENT_ORDERS:{linkId}
    + *   Field = orderId
    + *   Value = Comment 鐨 JSON 搴忓垪鍖
    + * 
    + *

    + * + * @author system + */ +@Slf4j +@Component +public class CommentCacheUtil { + + /** Redis Key 鍓嶇紑 */ + private static final String KEY_PREFIX = "COMMENT_ORDERS:"; + + @Autowired + private RedisTemplateHelper redisTemplateHelper; + + // ================================================================ + // Key 鏋勫缓 + // ================================================================ + + private String buildKey(String linkId) { + return KEY_PREFIX + linkId; + } + + // ================================================================ + // 瀛樻斁锛坧ut锛 + // ================================================================ + + /** + * 瀛樻斁鍗曚釜璁㈠崟鍒扮紦瀛 + * + * @param linkId ID + * @param orderVO 璁㈠崟VO锛堝繀椤诲寘鍚湁鏁堢殑 id锛 + */ + public void put(String linkId, Comment orderVO) { + if (StringUtils.isBlank(linkId) || orderVO == null || StringUtils.isBlank(orderVO.getId())) { + log.info("UserPendingOrderCacheUtil.put 鍙傛暟鏃犳晥, linkId={}, orderVO={}", linkId, orderVO); + return; + } + try { + String key = buildKey(linkId); + String json = JSONUtil.toJsonStr(orderVO); + redisTemplateHelper.hPut(key, orderVO.getId(), json); + log.info("缂撳瓨寰呭洖澶嶅樊璇勮鍗: linkId={}, orderId={}", linkId, orderVO.getId()); + } catch (Exception e) { + log.info("缂撳瓨寰呭洖澶嶅樊璇勮鍗曞け璐: linkId={}, orderId={}", linkId, orderVO.getId(), e); + } + } + + /** + * 鎵归噺瀛樻斁璁㈠崟鍒扮紦瀛橈紙閫氬父鐢ㄤ簬缂撳瓨棰勭儹 / 棣栨鍔犺浇锛 + * + * @param linkId ID + * @param orders 璁㈠崟鍒楄〃 + */ + public void putAll(String linkId, List orders) { + if (StringUtils.isBlank(linkId) || orders == null || orders.isEmpty()) { + return; + } + try { + String key = buildKey(linkId); + Map map = new java.util.LinkedHashMap<>(orders.size()); + for (Comment order : orders) { + if (order != null && StringUtils.isNotBlank(order.getId())) { + map.put(order.getId(), JSONUtil.toJsonStr(order)); + } + } + if (!map.isEmpty()) { + redisTemplateHelper.hPutAll(key, map); + log.info("鎵归噺缂撳瓨寰呭洖澶嶅樊璇勮鍗: linkId={}, count={}", linkId, map.size()); + } + } catch (Exception e) { + log.info("鎵归噺缂撳瓨寰呭洖澶嶅樊璇勮鍗曞け璐: linkId={}", linkId, e); + } + } + + // ================================================================ + // 鍒犻櫎锛坮emove锛 + // ================================================================ + + /** + * 鏍规嵁 linkId 鍜 orderId 浠庣紦瀛樹腑鍒犻櫎鎸囧畾璁㈠崟 + *

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

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

    + * 濡傛灉鏇存柊鍚庣殑璁㈠崟鐘舵佸凡缁忎笉灞炰簬"寰呭洖澶嶅樊璇"锛坰tatus 鈭 {5,6,8,12}锛夛紝 + * 鍒欒嚜鍔ㄤ粠缂撳瓨涓Щ闄よ璁㈠崟锛屾棤闇璋冪敤鏂归澶栧垽鏂 + * + * @param linkId ID + * @param orderVO 鏇存柊鍚庣殑璁㈠崟VO + */ + public void update(String linkId, Comment orderVO) { + if (StringUtils.isBlank(linkId) || orderVO == null || StringUtils.isBlank(orderVO.getId())) { + log.info("UserPendingOrderCacheUtil.update 鍙傛暟鏃犳晥, linkId={}, orderVO={}", linkId, orderVO); + return; + } + try { + // 濡傛灉璁㈠崟鐘舵佸凡涓嶅睘浜庡緟鍥炲宸瘎锛岀洿鎺ュ垹闄 + /*if (isTerminalStatus(orderVO.getStatus())) { + remove(linkId, orderVO.getId()); + log.info("璁㈠崟宸茬粓鎬侊紝浠庣紦瀛樼Щ闄: linkId={}, orderId={}, status={}", + linkId, orderVO.getId(), orderVO.getStatus()); + return; + }*/ + // 鍚﹀垯瑕嗙洊鏇存柊 + put(linkId, orderVO); + log.info("鏇存柊寰呭洖澶嶅樊璇勮鍗曠紦瀛: linkId={}, orderId={}, status={}", + linkId, orderVO.getId()); + } catch (Exception e) { + log.info("鏇存柊寰呭洖澶嶅樊璇勮鍗曠紦瀛樺け璐: linkId={}, orderId={}", linkId, orderVO.getId(), e); + } + } + + // ================================================================ + // 鏌ヨ锛坓et锛 + // ================================================================ + + /** + * 鑾峰彇鍏ㄩ儴寰呭洖澶嶅樊璇勮鍗曠紦瀛 + * + * @param linkId ID + * @return 缂撳瓨鐨勮鍗曞垪琛紝缂撳瓨涓嶅瓨鍦ㄦ椂杩斿洖 null锛堣皟鐢ㄦ柟鍙嵁姝ゅ垽鏂槸鍚﹂渶瑕佸洖婧愭煡搴擄級 + */ + public List getAll(String linkId) { + if (StringUtils.isBlank(linkId)) { + return null; + } + try { + String key = buildKey(linkId); + 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(), Comment.class)); + } + } + return result; + } catch (Exception e) { + log.info("鑾峰彇寰呭洖澶嶅樊璇勮鍗曠紦瀛樺け璐: linkId={}", linkId, e); + return null; + } + } + + /** + * 鑾峰彇缂撳瓨涓殑鍗曚釜璁㈠崟 + * + * @param linkId ID + * @param orderId 璁㈠崟ID + * @return 缂撳瓨鐨勮鍗昖O锛屼笉瀛樺湪鏃惰繑鍥 null + */ + public Comment get(String linkId, String orderId) { + if (StringUtils.isBlank(linkId) || StringUtils.isBlank(orderId)) { + return null; + } + try { + String key = buildKey(linkId); + Object value = redisTemplateHelper.hGet(key, orderId); + if (value == null) { + return null; + } + return JSONUtil.toBean(value.toString(), Comment.class); + } catch (Exception e) { + log.info("鑾峰彇鍗曚釜寰呭洖澶嶅樊璇勮鍗曠紦瀛樺け璐: linkId={}, orderId={}", linkId, orderId, e); + return null; + } + } + + /** + * 鍒ゆ柇璇ョ殑缂撳瓨鏄惁宸插瓨鍦 + * + * @param linkId ID + * @return true 琛ㄧず缂撳瓨瀛樺湪 + */ + public boolean exists(String linkId) { + if (StringUtils.isBlank(linkId)) { + return false; + } + Boolean hasKey = redisTemplateHelper.hasKey(buildKey(linkId)); + return hasKey != null && hasKey; + } + + // ================================================================ + // 鍐呴儴宸ュ叿 + // ================================================================ + +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/RefundOrderCacheUtil.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/RefundOrderCacheUtil.java new file mode 100644 index 00000000..ab17977f --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/RefundOrderCacheUtil.java @@ -0,0 +1,253 @@ +package cc.hiver.mall.utils; + +import cc.hiver.core.common.redis.RedisTemplateHelper; +import cc.hiver.mall.entity.MallRefundRecord; +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 缁撴瀯锛屼繚璇佹寜 linkId + orderId 缁村害鐨 O(1) 璇诲啓鏁堢巼銆 + *

    + *   Key   = REFOUND_ORDERS:{linkId}
    + *   Field = orderId
    + *   Value = MallRefundRecord 鐨 JSON 搴忓垪鍖
    + * 
    + *

    + * + * @author system + */ +@Slf4j +@Component +public class RefundOrderCacheUtil { + + /** Redis Key 鍓嶇紑 */ + private static final String KEY_PREFIX = "REFOUND_ORDERS:"; + + @Autowired + private RedisTemplateHelper redisTemplateHelper; + + // ================================================================ + // Key 鏋勫缓 + // ================================================================ + + private String buildKey(String linkId) { + return KEY_PREFIX + linkId; + } + + // ================================================================ + // 瀛樻斁锛坧ut锛 + // ================================================================ + + /** + * 瀛樻斁鍗曚釜璁㈠崟鍒扮紦瀛 + * + * @param linkId ID + * @param orderVO 璁㈠崟VO锛堝繀椤诲寘鍚湁鏁堢殑 id锛 + */ + public void put(String linkId, MallRefundRecord orderVO) { + if (StringUtils.isBlank(linkId) || orderVO == null || StringUtils.isBlank(orderVO.getId())) { + log.info("UserPendingOrderCacheUtil.put 鍙傛暟鏃犳晥, linkId={}, orderVO={}", linkId, orderVO); + return; + } + try { + String key = buildKey(linkId); + String json = JSONUtil.toJsonStr(orderVO); + redisTemplateHelper.hPut(key, orderVO.getId(), json); + log.info("缂撳瓨寰呭敭鍚/閫娆捐鍗: linkId={}, orderId={}", linkId, orderVO.getId()); + } catch (Exception e) { + log.info("缂撳瓨寰呭敭鍚/閫娆捐鍗曞け璐: linkId={}, orderId={}", linkId, orderVO.getId(), e); + } + } + + /** + * 鎵归噺瀛樻斁璁㈠崟鍒扮紦瀛橈紙閫氬父鐢ㄤ簬缂撳瓨棰勭儹 / 棣栨鍔犺浇锛 + * + * @param linkId ID + * @param orders 璁㈠崟鍒楄〃 + */ + public void putAll(String linkId, List orders) { + if (StringUtils.isBlank(linkId) || orders == null || orders.isEmpty()) { + return; + } + try { + String key = buildKey(linkId); + Map map = new java.util.LinkedHashMap<>(orders.size()); + for (MallRefundRecord order : orders) { + if (order != null && StringUtils.isNotBlank(order.getId())) { + map.put(order.getId(), JSONUtil.toJsonStr(order)); + } + } + if (!map.isEmpty()) { + redisTemplateHelper.hPutAll(key, map); + log.info("鎵归噺缂撳瓨寰呭敭鍚/閫娆捐鍗: linkId={}, count={}", linkId, map.size()); + } + } catch (Exception e) { + log.info("鎵归噺缂撳瓨寰呭敭鍚/閫娆捐鍗曞け璐: linkId={}", linkId, e); + } + } + + // ================================================================ + // 鍒犻櫎锛坮emove锛 + // ================================================================ + + /** + * 鏍规嵁 linkId 鍜 orderId 浠庣紦瀛樹腑鍒犻櫎鎸囧畾璁㈠崟 + *

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

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

    + * 濡傛灉鏇存柊鍚庣殑璁㈠崟鐘舵佸凡缁忎笉灞炰簬"寰呭敭鍚/閫娆"锛坰tatus 鈭 {5,6,8,12}锛夛紝 + * 鍒欒嚜鍔ㄤ粠缂撳瓨涓Щ闄よ璁㈠崟锛屾棤闇璋冪敤鏂归澶栧垽鏂 + * + * @param linkId ID + * @param orderVO 鏇存柊鍚庣殑璁㈠崟VO + */ + public void update(String linkId, MallRefundRecord orderVO) { + if (StringUtils.isBlank(linkId) || orderVO == null || StringUtils.isBlank(orderVO.getId())) { + log.info("UserPendingOrderCacheUtil.update 鍙傛暟鏃犳晥, linkId={}, orderVO={}", linkId, orderVO); + return; + } + try { + // 濡傛灉璁㈠崟鐘舵佸凡涓嶅睘浜庡緟鍞悗/閫娆撅紝鐩存帴鍒犻櫎 + /*if (isTerminalStatus(orderVO.getStatus())) { + remove(linkId, orderVO.getId()); + log.info("璁㈠崟宸茬粓鎬侊紝浠庣紦瀛樼Щ闄: linkId={}, orderId={}, status={}", + linkId, orderVO.getId(), orderVO.getStatus()); + return; + }*/ + // 鍚﹀垯瑕嗙洊鏇存柊 + put(linkId, orderVO); + log.info("鏇存柊寰呭敭鍚/閫娆捐鍗曠紦瀛: linkId={}, orderId={}, status={}", + linkId, orderVO.getId(), orderVO.getStatus()); + } catch (Exception e) { + log.info("鏇存柊寰呭敭鍚/閫娆捐鍗曠紦瀛樺け璐: linkId={}, orderId={}", linkId, orderVO.getId(), e); + } + } + + // ================================================================ + // 鏌ヨ锛坓et锛 + // ================================================================ + + /** + * 鑾峰彇鍏ㄩ儴寰呭敭鍚/閫娆捐鍗曠紦瀛 + * + * @param linkId ID + * @return 缂撳瓨鐨勮鍗曞垪琛紝缂撳瓨涓嶅瓨鍦ㄦ椂杩斿洖 null锛堣皟鐢ㄦ柟鍙嵁姝ゅ垽鏂槸鍚﹂渶瑕佸洖婧愭煡搴擄級 + */ + public List getAll(String linkId) { + if (StringUtils.isBlank(linkId)) { + return null; + } + try { + String key = buildKey(linkId); + 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(), MallRefundRecord.class)); + } + } + return result; + } catch (Exception e) { + log.info("鑾峰彇寰呭敭鍚/閫娆捐鍗曠紦瀛樺け璐: linkId={}", linkId, e); + return null; + } + } + + /** + * 鑾峰彇缂撳瓨涓殑鍗曚釜璁㈠崟 + * + * @param linkId ID + * @param orderId 璁㈠崟ID + * @return 缂撳瓨鐨勮鍗昖O锛屼笉瀛樺湪鏃惰繑鍥 null + */ + public MallRefundRecord get(String linkId, String orderId) { + if (StringUtils.isBlank(linkId) || StringUtils.isBlank(orderId)) { + return null; + } + try { + String key = buildKey(linkId); + Object value = redisTemplateHelper.hGet(key, orderId); + if (value == null) { + return null; + } + return JSONUtil.toBean(value.toString(), MallRefundRecord.class); + } catch (Exception e) { + log.info("鑾峰彇鍗曚釜寰呭敭鍚/閫娆捐鍗曠紦瀛樺け璐: linkId={}, orderId={}", linkId, orderId, e); + return null; + } + } + + /** + * 鍒ゆ柇璇ョ殑缂撳瓨鏄惁宸插瓨鍦 + * + * @param linkId ID + * @return true 琛ㄧず缂撳瓨瀛樺湪 + */ + public boolean exists(String linkId) { + if (StringUtils.isBlank(linkId)) { + return false; + } + Boolean hasKey = redisTemplateHelper.hasKey(buildKey(linkId)); + return hasKey != null && hasKey; + } + + // ================================================================ + // 鍐呴儴宸ュ叿 + // ================================================================ + +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WaitOrderCacheUtil.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WaitOrderCacheUtil.java index 609dde17..47a83cba 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WaitOrderCacheUtil.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WaitOrderCacheUtil.java @@ -359,6 +359,51 @@ public class WaitOrderCacheUtil { } } + public Integer getAllByWorkerId(String workerId,String regionId) { + // 1. 鍩虹鏍¢獙 + if (StringUtils.isBlank(regionId)) { + return null; + } + + try { + String key = buildKey(regionId); + // 2. 鑾峰彇 Hash 涓殑鎵鏈夎鍗曟暟鎹 + Map entries = redisTemplateHelper.hGetAll(key); + + // 濡傛灉缂撳瓨涓病鏈夋暟鎹紝杩斿洖 null 璁╄皟鐢ㄦ柟鍘绘煡搴 + if (entries == null || entries.isEmpty()) { + return null; + } + + // 3. 鍙嶅簭鍒楀寲鎵鏈夌紦瀛樿鍗 + List allCachedOrders = new ArrayList<>(entries.size()); + for (Object value : entries.values()) { + if (value != null) { + allCachedOrders.add(JSONUtil.toBean(value.toString(), MallDeliveryOrder.class)); + } + } + + // 绛涢夛細workerId 鍖归厤銆乻tatus=0锛屼笉鍖哄垎 deliveryType + List zhipaiList = allCachedOrders.stream() + .filter(o -> workerId.equals(o.getWorkerId())) + .filter(o -> o.getStatus() != null && o.getStatus() == 0) + .collect(Collectors.toList()); + if(allCachedOrders == null){ + return 0; + }else{ + if(!zhipaiList.isEmpty()){ + return zhipaiList.size(); + }else{ + return 0; + } + } + } catch (Exception e) { + log.error("鑾峰彇鎶㈠崟澶у巺璁㈠崟缂撳瓨澶辫触: workerId={}", e); + // 鍙戠敓寮傚父杩斿洖 null锛屽己鍒跺洖婧愭煡搴擄紝淇濊瘉绯荤粺鍙敤鎬 + return null; + } + } + /** * 鑾峰彇鎶㈠崟澶у巺缂撳瓨鍗曚釜璁㈠崟 * diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/CommentMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/CommentMapper.xml index c40e1805..07ddb901 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/CommentMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/CommentMapper.xml @@ -39,10 +39,10 @@ and picture != '' - and has_answer = 1 + and has_answer = #{comment.hasAnswer,jdbcType=Integer} - and score 4.5 + and score 4 order by create_time desc