- * 搴曞眰浣跨敤 Redis Hash 缁撴瀯锛屼繚璇佹寜 shopId + orderId 缁村害鐨 O(1) 璇诲啓鏁堢巼銆
+ * 搴曞眰浣跨敤 Redis Hash 缁撴瀯锛屼繚璇佹寜 shopId / regionId + orderId 缁村害鐨 O(1) 璇诲啓鏁堢巼銆
*
- * Key = SHOP_GROUP_ORDERS:{shopId}
- * Field = orderId
- * Value = MallOrderGroup 鐨 JSON 搴忓垪鍖
+ * 搴楅摵缁村害 Key = SHOP_GROUP_ORDERS:{shopId}
+ * 鍖哄煙缁村害 Key = SHOP_GROUP_ORDERS_REGION:{regionId}
+ * Field = orderId
+ * Value = MallOrderGroup 鐨 JSON 搴忓垪鍖
*
*
* 浣跨敤鍦烘櫙锛氳鍗曠姸鎬佸彂鐢熷彉鍖栨椂锛堝垱寤恒佹洿鏂般佸彇娑堛佸畬鎴愮瓑锛夛紝
@@ -34,8 +35,14 @@ public class ShopGroupOrderCacheUtil {
/** Redis Key 鍓嶇紑 */
private static final String KEY_PREFIX = "SHOP_GROUP_ORDERS:";
- /** 璁㈠崟涓嶅啀灞炰簬"寰呮垚鍥"鐨勭姸鎬侀泦鍚 */
- private static final int STATUS_DONE = 0;
+ /** 鍖哄煙寰呮垚鍥 Redis Key 鍓嶇紑 */
+ private static final String REGION_KEY_PREFIX = "SHOP_GROUP_ORDERS_REGION:";
+
+ /** 鍏紑寰呮垚鍥㈢姸鎬 */
+ private static final int STATUS_FORMING = 0;
+
+ /** 闈為潰瀵归潰鎷煎洟 */
+ private static final int IS_FACE_NORMAL = 0;
@Autowired
private RedisTemplateHelper redisTemplateHelper;
@@ -48,6 +55,10 @@ public class ShopGroupOrderCacheUtil {
return KEY_PREFIX + shopId;
}
+ private String buildRegionKey(String regionId) {
+ return REGION_KEY_PREFIX + regionId;
+ }
+
// ================================================================
// 瀛樻斁锛坧ut锛
// ================================================================
@@ -64,10 +75,17 @@ public class ShopGroupOrderCacheUtil {
return;
}
try {
- String key = buildKey(shopId);
+ if (!isPublicPending(orderVO)) {
+ remove(shopId, orderVO.getRegionId(), orderVO.getId());
+ return;
+ }
String json = JSONUtil.toJsonStr(orderVO);
- redisTemplateHelper.hPut(key, orderVO.getId(), json);
- log.info("缂撳瓨搴楅摵寰呮垚鍥㈣鍗: shopId={}, orderId={}", shopId, orderVO.getId());
+ redisTemplateHelper.hPut(buildKey(shopId), orderVO.getId(), json);
+ if (StringUtils.isNotBlank(orderVO.getRegionId())) {
+ redisTemplateHelper.hPut(buildRegionKey(orderVO.getRegionId()), orderVO.getId(), json);
+ }
+ log.info("缂撳瓨搴楅摵寰呮垚鍥㈣鍗: shopId={}, regionId={}, orderId={}",
+ shopId, orderVO.getRegionId(), orderVO.getId());
} catch (Exception e) {
log.info("缂撳瓨搴楅摵寰呮垚鍥㈣鍗曞け璐: shopId={}, orderId={}", shopId, orderVO.getId(), e);
}
@@ -84,15 +102,23 @@ public class ShopGroupOrderCacheUtil {
return;
}
try {
- String key = buildKey(shopId);
Map map = new java.util.LinkedHashMap<>(orders.size());
+ Map> regionMap = new java.util.LinkedHashMap<>();
for (MallOrderGroup order : orders) {
- if (order != null && StringUtils.isNotBlank(order.getId())) {
- map.put(order.getId(), JSONUtil.toJsonStr(order));
+ if (order != null && StringUtils.isNotBlank(order.getId()) && isPublicPending(order)) {
+ String json = JSONUtil.toJsonStr(order);
+ map.put(order.getId(), json);
+ if (StringUtils.isNotBlank(order.getRegionId())) {
+ regionMap.computeIfAbsent(order.getRegionId(), k -> new java.util.LinkedHashMap<>())
+ .put(order.getId(), json);
+ }
}
}
if (!map.isEmpty()) {
- redisTemplateHelper.hPutAll(key, map);
+ redisTemplateHelper.hPutAll(buildKey(shopId), map);
+ for (Map.Entry> entry : regionMap.entrySet()) {
+ redisTemplateHelper.hPutAll(buildRegionKey(entry.getKey()), entry.getValue());
+ }
log.info("鎵归噺缂撳瓨搴楅摵寰呮垚鍥㈣鍗: shopId={}, count={}", shopId, map.size());
}
} catch (Exception e) {
@@ -118,14 +144,33 @@ public class ShopGroupOrderCacheUtil {
return;
}
try {
- String key = buildKey(shopId);
- redisTemplateHelper.hDelete(key, orderId);
+ MallOrderGroup cachedOrder = get(shopId, orderId);
+ redisTemplateHelper.hDelete(buildKey(shopId), orderId);
+ if (cachedOrder != null && StringUtils.isNotBlank(cachedOrder.getRegionId())) {
+ redisTemplateHelper.hDelete(buildRegionKey(cachedOrder.getRegionId()), orderId);
+ }
log.info("鍒犻櫎寰呮垚鍥㈣鍗曠紦瀛: shopId={}, orderId={}", shopId, orderId);
} catch (Exception e) {
log.info("鍒犻櫎寰呮垚鍥㈣鍗曠紦瀛樺け璐: shopId={}, orderId={}", shopId, orderId, e);
}
}
+ public void remove(String shopId, String regionId, String orderId) {
+ if (StringUtils.isBlank(shopId) || StringUtils.isBlank(orderId)) {
+ log.info("ShopGroupOrderCacheUtil.remove 鍙傛暟鏃犳晥, shopId={}, orderId={}", shopId, orderId);
+ return;
+ }
+ try {
+ redisTemplateHelper.hDelete(buildKey(shopId), orderId);
+ if (StringUtils.isNotBlank(regionId)) {
+ redisTemplateHelper.hDelete(buildRegionKey(regionId), orderId);
+ }
+ log.info("鍒犻櫎寰呮垚鍥㈣鍗曠紦瀛: shopId={}, regionId={}, orderId={}", shopId, regionId, orderId);
+ } catch (Exception e) {
+ log.info("鍒犻櫎寰呮垚鍥㈣鍗曠紦瀛樺け璐: shopId={}, regionId={}, orderId={}", shopId, regionId, orderId, e);
+ }
+ }
+
/**
* 娓呴櫎鎸囧畾搴楅摵鎵鏈夊緟鎴愬洟璁㈠崟缂撳瓨
*
@@ -165,8 +210,8 @@ public class ShopGroupOrderCacheUtil {
}
try {
// 濡傛灉璁㈠崟鐘舵佸凡涓嶅睘浜庡緟鎴愬洟锛岀洿鎺ュ垹闄
- /*if (!isTerminalStatus(orderVO.getStatus())) {
- remove(shopId, orderVO.getId());
+ /*if (!isPublicPending(orderVO)) {
+ remove(shopId, orderVO.getRegionId(), orderVO.getId());
log.debug("璁㈠崟宸茬粓鎬侊紝浠庣紦瀛樼Щ闄: shopId={}, orderId={}, status={}",
shopId, orderVO.getId(), orderVO.getStatus());
return;
@@ -213,6 +258,57 @@ public class ShopGroupOrderCacheUtil {
}
}
+ /**
+ * 鑾峰彇鍖哄煙缁村害寰呮垚鍥㈣鍗曠紦瀛樸
+ */
+ public List getAllByRegion(String regionId) {
+ if (StringUtils.isBlank(regionId)) {
+ return null;
+ }
+ try {
+ Map