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