qw = new LambdaQueryWrapper<>();
+ qw.eq(MallDeliveryOrder::getOrderId, mallRefundRecord.getOrderId());
+ MallDeliveryOrder deliveryOrder = mallDeliveryOrderMapper.selectOne(qw);
+ workerOrderCacheUtil.remove(deliveryOrder.getWorkerId(),deliveryOrder.getId());
}
wechatPayUtil.refund(mallRefundRecord.getOrderId(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue());
if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/ShopGroupOrderCacheUtil.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/ShopGroupOrderCacheUtil.java
index 4ffc6295..79238407 100644
--- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/ShopGroupOrderCacheUtil.java
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/ShopGroupOrderCacheUtil.java
@@ -2,7 +2,6 @@ package cc.hiver.mall.utils;
import cc.hiver.core.common.redis.RedisTemplateHelper;
import cc.hiver.mall.entity.MallOrderGroup;
-import cc.hiver.mall.pojo.vo.MallOrderVO;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -221,7 +220,7 @@ public class ShopGroupOrderCacheUtil {
* @param orderId 璁㈠崟ID
* @return 缂撳瓨鐨勮鍗昖O锛屼笉瀛樺湪鏃惰繑鍥 null
*/
- public MallOrderVO get(String shopId, String orderId) {
+ public MallOrderGroup get(String shopId, String orderId) {
if (StringUtils.isBlank(shopId) || StringUtils.isBlank(orderId)) {
return null;
}
@@ -231,7 +230,7 @@ public class ShopGroupOrderCacheUtil {
if (value == null) {
return null;
}
- return JSONUtil.toBean(value.toString(), MallOrderVO.class);
+ return JSONUtil.toBean(value.toString(), MallOrderGroup.class);
} catch (Exception e) {
log.info("鑾峰彇搴楅摵鍗曚釜寰呮垚鍥㈣鍗曠紦瀛樺け璐: shopId={}, orderId={}", shopId, orderId, e);
return null;
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
new file mode 100644
index 00000000..609dde17
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WaitOrderCacheUtil.java
@@ -0,0 +1,535 @@
+package cc.hiver.mall.utils;
+
+import cc.hiver.core.common.redis.RedisTemplateHelper;
+import cc.hiver.mall.entity.MallDeliveryOrder;
+import cc.hiver.mall.pojo.dto.AreaRuleDTO;
+import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery;
+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.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鎶㈠崟澶у巺寰呭畬鎴愯鍗曠紦瀛樺伐鍏风被
+ *
+ * 搴曞眰浣跨敤 Redis Hash 缁撴瀯锛屼繚璇佹寜 regionId + orderId 缁村害鐨 O(1) 璇诲啓鏁堢巼銆
+ *
+ * Key = WAIT_ORDERS:{regionId}
+ * Field = orderId
+ * Value = MallDeliveryOrder 鐨 JSON 搴忓垪鍖
+ *
+ *
+ * 浣跨敤鍦烘櫙锛氳鍗曠姸鎬佸彂鐢熷彉鍖栨椂锛堝垱寤恒佹洿鏂般佸彇娑堛佸畬鎴愮瓑锛夛紝
+ * 鐢变笟鍔℃柟涓诲姩璋冪敤鏈伐鍏风被鐨勬柟娉曠淮鎶ょ紦瀛橈紝浠ュ噺灏 pagebyworker 鎺ュ彛瀵规暟鎹簱鐨勬煡璇㈠帇鍔涖
+ *
+ * @author system
+ */
+@Slf4j
+@Component
+public class WaitOrderCacheUtil {
+
+ /** Redis Key 鍓嶇紑 */
+ private static final String KEY_PREFIX = "WAIT_ORDERS:";
+
+ @Autowired
+ private RedisTemplateHelper redisTemplateHelper;
+
+ // ================================================================
+ // Key 鏋勫缓
+ // ================================================================
+
+ private String buildKey(String regionId) {
+ return KEY_PREFIX + regionId;
+ }
+
+ // ================================================================
+ // 瀛樻斁锛坧ut锛
+ // ================================================================
+
+ /**
+ * 瀛樻斁鍗曚釜璁㈠崟鍒扮紦瀛
+ *
+ * @param regionId 鍖哄煙ID
+ * @param orderVO 璁㈠崟VO锛堝繀椤诲寘鍚湁鏁堢殑 id锛
+ */
+ public void put(String regionId, MallDeliveryOrder orderVO) {
+ if (StringUtils.isBlank(regionId) || orderVO == null || StringUtils.isBlank(orderVO.getId())) {
+ log.info("UserPendingOrderCacheUtil.put 鍙傛暟鏃犳晥, userId={}, orderVO={}", regionId, orderVO);
+ return;
+ }
+ try {
+ String key = buildKey(regionId);
+ String json = JSONUtil.toJsonStr(orderVO);
+ redisTemplateHelper.hPut(key, orderVO.getId(), json);
+ log.info("缂撳瓨鎶㈠崟澶у巺璁㈠崟: regionId={}, orderId={}", regionId, orderVO.getId());
+ } catch (Exception e) {
+ log.info("缂撳瓨鎶㈠崟澶у巺璁㈠崟澶辫触: regionId={}, orderId={}", regionId, orderVO.getId(), e);
+ }
+ }
+
+ /**
+ * 鎵归噺瀛樻斁璁㈠崟鍒扮紦瀛橈紙閫氬父鐢ㄤ簬缂撳瓨棰勭儹 / 棣栨鍔犺浇锛
+ *
+ * @param regionId 鍖哄煙ID
+ * @param orders 璁㈠崟鍒楄〃
+ */
+ public void putAll(String regionId, List orders) {
+ if (StringUtils.isBlank(regionId) || orders == null || orders.isEmpty()) {
+ return;
+ }
+ try {
+ String key = buildKey(regionId);
+ Map map = new LinkedHashMap<>(orders.size());
+ for (MallDeliveryOrder 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("鎵归噺缂撳瓨鎶㈠崟澶у巺璁㈠崟: regionId={}, count={}", regionId, map.size());
+ }
+ } catch (Exception e) {
+ log.info("鎵归噺缂撳瓨鎶㈠崟澶у巺璁㈠崟澶辫触: regionId={}", regionId, e);
+ }
+ }
+
+ // ================================================================
+ // 鍒犻櫎锛坮emove锛
+ // ================================================================
+
+ /**
+ * 鏍规嵁 regionId 鍜 orderId 浠庣紦瀛樹腑鍒犻櫎鎸囧畾璁㈠崟
+ *
+ * 鍏稿瀷鍦烘櫙锛氳鍗曟垚鍥€佸彇娑堛侀娆炬垚鍔熷悗璋冪敤銆
+ *
+ * @param regionId 鍖哄煙ID
+ * @param orderId 璁㈠崟ID
+ */
+ public void remove(String regionId, String orderId) {
+ if (StringUtils.isBlank(regionId) || StringUtils.isBlank(orderId)) {
+ log.info("UserPendingOrderCacheUtil.remove 鍙傛暟鏃犳晥, regionId={}, orderId={}", regionId, orderId);
+ return;
+ }
+ try {
+ String key = buildKey(regionId);
+ redisTemplateHelper.hDelete(key, orderId);
+ log.info("鍒犻櫎璁㈠崟缂撳瓨: regionId={}, orderId={}", regionId, orderId);
+ } catch (Exception e) {
+ log.info("鍒犻櫎璁㈠崟缂撳瓨澶辫触: regionId={}, orderId={}", regionId, orderId, e);
+ }
+ }
+
+ /**
+ * 娓呴櫎鎸囧畾鎶㈠崟澶у巺鎵鏈夎鍗曠紦瀛
+ *
+ * 鍏稿瀷鍦烘櫙锛氶渶瑕佸己鍒跺埛鏂拌鎶㈠崟澶у巺缂撳瓨鏃惰皟鐢ㄣ
+ *
+ * @param regionId 鍖哄煙ID
+ */
+ public void removeAll(String regionId) {
+ if (StringUtils.isBlank(regionId)) {
+ return;
+ }
+ try {
+ redisTemplateHelper.delete(buildKey(regionId));
+ log.info("娓呴櫎鎶㈠崟澶у巺璁㈠崟缂撳瓨: regionId={}", regionId);
+ } catch (Exception e) {
+ log.info("娓呴櫎鎶㈠崟澶у巺璁㈠崟缂撳瓨澶辫触: regionId={}", regionId, e);
+ }
+ }
+
+ // ================================================================
+ // 鏇存柊锛坲pdate锛
+ // ================================================================
+
+ /**
+ * 鏍规嵁 regionId 鍜 orderId 鏇存柊缂撳瓨涓殑璁㈠崟淇℃伅
+ *
+ * 濡傛灉鏇存柊鍚庣殑璁㈠崟鐘舵佸凡缁忎笉灞炰簬"寰呭畬鎴"锛坰tatus 鈭 {10}锛夛紝
+ * 鍒欒嚜鍔ㄤ粠缂撳瓨涓Щ闄よ璁㈠崟锛屾棤闇璋冪敤鏂归澶栧垽鏂
+ *
+ * @param regionId 鍖哄煙ID
+ * @param orderVO 鏇存柊鍚庣殑璁㈠崟VO
+ */
+ public void update(String regionId, MallDeliveryOrder orderVO) {
+ if (StringUtils.isBlank(regionId) || orderVO == null || StringUtils.isBlank(orderVO.getId())) {
+ log.warn("UserPendingOrderCacheUtil.update 鍙傛暟鏃犳晥, regionId={}, orderVO={}", regionId, orderVO);
+ return;
+ }
+ try {
+ // 濡傛灉璁㈠崟鐘舵佸凡涓嶅睘浜庯紝鐩存帴鍒犻櫎
+ /*if (!isTerminalStatus(orderVO.getStatus())) {
+ remove(regionId, orderVO.getId());
+ log.debug("璁㈠崟宸茬粓鎬侊紝浠庣紦瀛樼Щ闄: regionId={}, orderId={}, status={}",
+ regionId, orderVO.getId(), orderVO.getStatus());
+ return;
+ }*/
+ // 瑕嗙洊鏇存柊
+ put(regionId, orderVO);
+ log.info("鏇存柊鎶㈠崟澶у巺缂撳瓨: regionId={}, orderId={}, status={}",
+ regionId, orderVO.getId(), orderVO.getStatus());
+ } catch (Exception e) {
+ log.info("鏇存柊鐢ㄦ埛寰呭畬鎴愯鍗曠紦瀛樺け璐: regionId={}, orderId={}", regionId, orderVO.getId(), e);
+ }
+ }
+
+ // ================================================================
+ // 鏌ヨ锛坓et锛
+ // ================================================================
+
+ /**
+ * 鑾峰彇鎶㈠崟澶у巺璁㈠崟缂撳瓨锛堝惈鍒嗛〉銆佽繃婊ゃ佹帓搴忓拰鍚勭被鍨嬭鍗曟暟缁熻锛
+ *
+ * 涓ょ鍦烘櫙锛
+ * 1. deliveryType==4 涓 workerId 闈炵┖ 鈫 鏌ョ湅鎸囨淳鍗曞垪琛 + 鍏朵粬绫诲瀷璁㈠崟鏁
+ * 2. 鍏朵粬鎯呭喌锛坔allOnly=true锛夆啋 鏌ョ湅鎶㈠崟澶у巺鏌愮被鍨嬭鍗曞垪琛(鍒嗛〉) + 鎸囨淳鍗曟暟 + 鍚勭被鍨嬭鍗曟暟
+ *
+ * @param q 鏌ヨ鍙傛暟
+ * @return 鍖呭惈鍒嗛〉鏁版嵁鍜岀粺璁℃暟鎹殑 Map锛岀紦瀛樹笉瀛樺湪鏃惰繑鍥 null锛堣皟鐢ㄦ柟鎹鍥炴簮鏌ュ簱锛
+ */
+ public Map getAll(MallDeliveryOrderPageQuery q) {
+ // 1. 鍩虹鏍¢獙
+ if (StringUtils.isBlank(q.getRegionId())) {
+ return null;
+ }
+
+ try {
+ String key = buildKey(q.getRegionId());
+ // 2. 鑾峰彇 Hash 涓殑鎵鏈夎鍗曟暟鎹
+ Map