+ * 搴曞眰浣跨敤 Redis Hash 缁撴瀯锛屼繚璇佹寜 shopId + orderId 缁村害鐨 O(1) 璇诲啓鏁堢巼銆
+ *
+ * Key = SHOP_GROUP_ORDERS:{shopId}
+ * Field = orderId
+ * Value = MallOrderGroup 鐨 JSON 搴忓垪鍖
+ *
+ *
+ * 浣跨敤鍦烘櫙锛氳鍗曠姸鎬佸彂鐢熷彉鍖栨椂锛堝垱寤恒佹洿鏂般佸彇娑堛佸畬鎴愮瓑锛夛紝
+ * 鐢变笟鍔℃柟涓诲姩璋冪敤鏈伐鍏风被鐨勬柟娉曠淮鎶ょ紦瀛橈紝浠ュ噺灏 getMallOrderGroupByShopId 鎺ュ彛瀵规暟鎹簱鐨勬煡璇㈠帇鍔涖
+ *
+ * @author system
+ */
+@Slf4j
+@Component
+public class ShopGroupOrderCacheUtil {
+
+ /** Redis Key 鍓嶇紑 */
+ private static final String KEY_PREFIX = "SHOP_GROUP_ORDERS:";
+
+ /** 璁㈠崟涓嶅啀灞炰簬"寰呮垚鍥"鐨勭姸鎬侀泦鍚 */
+ private static final int STATUS_DONE = 0;
+
+ @Autowired
+ private RedisTemplateHelper redisTemplateHelper;
+
+ // ================================================================
+ // Key 鏋勫缓
+ // ================================================================
+
+ private String buildKey(String shopId) {
+ return KEY_PREFIX + shopId;
+ }
+
+ // ================================================================
+ // 瀛樻斁锛坧ut锛
+ // ================================================================
+
+ /**
+ * 瀛樻斁鍗曚釜璁㈠崟鍒扮紦瀛
+ *
+ * @param shopId 搴楅摵ID
+ * @param orderVO 璁㈠崟VO锛堝繀椤诲寘鍚湁鏁堢殑 id锛
+ */
+ public void put(String shopId, MallOrderGroup orderVO) {
+ if (StringUtils.isBlank(shopId) || orderVO == null || StringUtils.isBlank(orderVO.getId())) {
+ log.info("UserPendingOrderCacheUtil.put 鍙傛暟鏃犳晥, userId={}, orderVO={}", shopId, orderVO);
+ return;
+ }
+ try {
+ String key = buildKey(shopId);
+ String json = JSONUtil.toJsonStr(orderVO);
+ redisTemplateHelper.hPut(key, orderVO.getId(), json);
+ log.info("缂撳瓨搴楅摵寰呮垚鍥㈣鍗: shopId={}, orderId={}", shopId, orderVO.getId());
+ } catch (Exception e) {
+ log.info("缂撳瓨搴楅摵寰呮垚鍥㈣鍗曞け璐: shopId={}, orderId={}", shopId, orderVO.getId(), e);
+ }
+ }
+
+ /**
+ * 鎵归噺瀛樻斁璁㈠崟鍒扮紦瀛橈紙閫氬父鐢ㄤ簬缂撳瓨棰勭儹 / 棣栨鍔犺浇锛
+ *
+ * @param shopId 搴楅摵ID
+ * @param orders 璁㈠崟鍒楄〃
+ */
+ public void putAll(String shopId, List orders) {
+ if (StringUtils.isBlank(shopId) || orders == null || orders.isEmpty()) {
+ return;
+ }
+ try {
+ String key = buildKey(shopId);
+ Map map = new java.util.LinkedHashMap<>(orders.size());
+ for (MallOrderGroup 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("鎵归噺缂撳瓨搴楅摵寰呮垚鍥㈣鍗: shopId={}, count={}", shopId, map.size());
+ }
+ } catch (Exception e) {
+ log.info("鎵归噺缂撳瓨搴楅摵寰呮垚鍥㈣鍗曞け璐: shopId={}", shopId, e);
+ }
+ }
+
+ // ================================================================
+ // 鍒犻櫎锛坮emove锛
+ // ================================================================
+
+ /**
+ * 鏍规嵁 shopId 鍜 orderId 浠庣紦瀛樹腑鍒犻櫎鎸囧畾璁㈠崟
+ *
+ * 鍏稿瀷鍦烘櫙锛氳鍗曟垚鍥€佸彇娑堛侀娆炬垚鍔熷悗璋冪敤銆
+ *
+ * @param shopId 搴楅摵ID
+ * @param orderId 璁㈠崟ID
+ */
+ public void remove(String shopId, String orderId) {
+ if (StringUtils.isBlank(shopId) || StringUtils.isBlank(orderId)) {
+ log.info("UserPendingOrderCacheUtil.remove 鍙傛暟鏃犳晥, shopId={}, orderId={}", shopId, orderId);
+ return;
+ }
+ try {
+ String key = buildKey(shopId);
+ redisTemplateHelper.hDelete(key, orderId);
+ log.info("鍒犻櫎寰呮垚鍥㈣鍗曠紦瀛: shopId={}, orderId={}", shopId, orderId);
+ } catch (Exception e) {
+ log.info("鍒犻櫎寰呮垚鍥㈣鍗曠紦瀛樺け璐: shopId={}, orderId={}", shopId, orderId, e);
+ }
+ }
+
+ /**
+ * 娓呴櫎鎸囧畾搴楅摵鎵鏈夊緟鎴愬洟璁㈠崟缂撳瓨
+ *
+ * 鍏稿瀷鍦烘櫙锛氶渶瑕佸己鍒跺埛鏂拌搴楅摵缂撳瓨鏃惰皟鐢ㄣ
+ *
+ * @param shopId 搴楅摵ID
+ */
+ public void removeAll(String shopId) {
+ if (StringUtils.isBlank(shopId)) {
+ return;
+ }
+ try {
+ redisTemplateHelper.delete(buildKey(shopId));
+ log.info("娓呴櫎搴楅摵寰呮垚鍥㈣鍗曠紦瀛: shopId={}", shopId);
+ } catch (Exception e) {
+ log.info("娓呴櫎搴楅摵寰呮垚鍥㈣鍗曠紦瀛樺け璐: shopId={}", shopId, e);
+ }
+ }
+
+ // ================================================================
+ // 鏇存柊锛坲pdate锛
+ // ================================================================
+
+ /**
+ * 鏍规嵁 shopId 鍜 orderId 鏇存柊缂撳瓨涓殑璁㈠崟淇℃伅
+ *
+ * 濡傛灉鏇存柊鍚庣殑璁㈠崟鐘舵佸凡缁忎笉灞炰簬"寰呭畬鎴"锛坰tatus 鈭 {10}锛夛紝
+ * 鍒欒嚜鍔ㄤ粠缂撳瓨涓Щ闄よ璁㈠崟锛屾棤闇璋冪敤鏂归澶栧垽鏂
+ *
+ * @param shopId 搴楅摵ID
+ * @param orderVO 鏇存柊鍚庣殑璁㈠崟VO
+ */
+ public void update(String shopId, MallOrderGroup orderVO) {
+ if (StringUtils.isBlank(shopId) || orderVO == null || StringUtils.isBlank(orderVO.getId())) {
+ log.warn("UserPendingOrderCacheUtil.update 鍙傛暟鏃犳晥, shopId={}, orderVO={}", shopId, orderVO);
+ return;
+ }
+ try {
+ // 濡傛灉璁㈠崟鐘舵佸凡涓嶅睘浜庡緟鎴愬洟锛岀洿鎺ュ垹闄
+ /*if (!isTerminalStatus(orderVO.getStatus())) {
+ remove(shopId, orderVO.getId());
+ log.debug("璁㈠崟宸茬粓鎬侊紝浠庣紦瀛樼Щ闄: shopId={}, orderId={}, status={}",
+ shopId, orderVO.getId(), orderVO.getStatus());
+ return;
+ }*/
+ // 瑕嗙洊鏇存柊
+ put(shopId, orderVO);
+ log.info("鏇存柊搴楅摵寰呮垚鍥㈢紦瀛: shopId={}, orderId={}, status={}",
+ shopId, orderVO.getId(), orderVO.getStatus());
+ } catch (Exception e) {
+ log.info("鏇存柊鐢ㄦ埛寰呭畬鎴愯鍗曠紦瀛樺け璐: shopId={}, orderId={}", shopId, orderVO.getId(), e);
+ }
+ }
+
+ // ================================================================
+ // 鏌ヨ锛坓et锛
+ // ================================================================
+
+ /**
+ * 鑾峰彇搴楅摵寰呮垚鍥㈣鍗曠紦瀛
+ *
+ * @param shopId 搴楅摵ID
+ * @return 缂撳瓨鐨勮鍗曞垪琛紝缂撳瓨涓嶅瓨鍦ㄦ椂杩斿洖 null锛堣皟鐢ㄦ柟鍙嵁姝ゅ垽鏂槸鍚﹂渶瑕佸洖婧愭煡搴擄級
+ */
+ public List getAll(String shopId) {
+ if (StringUtils.isBlank(shopId)) {
+ return null;
+ }
+ try {
+ String key = buildKey(shopId);
+ Map