12 changed files with 688 additions and 34 deletions
@ -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; |
|||
|
|||
/** |
|||
* 待回复差评订单缓存工具类 |
|||
* <p> |
|||
* 底层使用 Redis Hash 结构,保证按 linkId + orderId 维度的 O(1) 读写效率。 |
|||
* <pre> |
|||
* Key = COMMENT_ORDERS:{linkId} |
|||
* Field = orderId |
|||
* Value = Comment 的 JSON 序列化 |
|||
* </pre> |
|||
* <p> |
|||
* |
|||
* @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; |
|||
} |
|||
|
|||
// ================================================================
|
|||
// 存放(put)
|
|||
// ================================================================
|
|||
|
|||
/** |
|||
* 存放单个订单到缓存 |
|||
* |
|||
* @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<Comment> orders) { |
|||
if (StringUtils.isBlank(linkId) || orders == null || orders.isEmpty()) { |
|||
return; |
|||
} |
|||
try { |
|||
String key = buildKey(linkId); |
|||
Map<String, String> 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); |
|||
} |
|||
} |
|||
|
|||
// ================================================================
|
|||
// 删除(remove)
|
|||
// ================================================================
|
|||
|
|||
/** |
|||
* 根据 linkId 和 orderId 从缓存中删除指定订单 |
|||
* <p> |
|||
* 典型场景:订单完成、取消、退款成功后调用。 |
|||
* |
|||
* @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); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 清除指定的所有待回复差评订单缓存 |
|||
* <p> |
|||
* 典型场景:需要强制刷新该缓存时调用。 |
|||
* |
|||
* @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); |
|||
} |
|||
} |
|||
|
|||
// ================================================================
|
|||
// 更新(update)
|
|||
// ================================================================
|
|||
|
|||
/** |
|||
* 根据 linkId 和 orderId 更新缓存中的订单信息 |
|||
* <p> |
|||
* 如果更新后的订单状态已经不属于"待回复差评"(status ∈ {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); |
|||
} |
|||
} |
|||
|
|||
// ================================================================
|
|||
// 查询(get)
|
|||
// ================================================================
|
|||
|
|||
/** |
|||
* 获取全部待回复差评订单缓存 |
|||
* |
|||
* @param linkId ID |
|||
* @return 缓存的订单列表,缓存不存在时返回 null(调用方可据此判断是否需要回源查库) |
|||
*/ |
|||
public List<Comment> getAll(String linkId) { |
|||
if (StringUtils.isBlank(linkId)) { |
|||
return null; |
|||
} |
|||
try { |
|||
String key = buildKey(linkId); |
|||
Map<Object, Object> entries = redisTemplateHelper.hGetAll(key); |
|||
if (entries == null || entries.isEmpty()) { |
|||
return null; |
|||
} |
|||
List<Comment> 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 缓存的订单VO,不存在时返回 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; |
|||
} |
|||
|
|||
// ================================================================
|
|||
// 内部工具
|
|||
// ================================================================
|
|||
|
|||
} |
|||
@ -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; |
|||
|
|||
/** |
|||
* 待售后/退款订单缓存工具类 |
|||
* <p> |
|||
* 底层使用 Redis Hash 结构,保证按 linkId + orderId 维度的 O(1) 读写效率。 |
|||
* <pre> |
|||
* Key = REFOUND_ORDERS:{linkId} |
|||
* Field = orderId |
|||
* Value = MallRefundRecord 的 JSON 序列化 |
|||
* </pre> |
|||
* <p> |
|||
* |
|||
* @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; |
|||
} |
|||
|
|||
// ================================================================
|
|||
// 存放(put)
|
|||
// ================================================================
|
|||
|
|||
/** |
|||
* 存放单个订单到缓存 |
|||
* |
|||
* @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<MallRefundRecord> orders) { |
|||
if (StringUtils.isBlank(linkId) || orders == null || orders.isEmpty()) { |
|||
return; |
|||
} |
|||
try { |
|||
String key = buildKey(linkId); |
|||
Map<String, String> 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); |
|||
} |
|||
} |
|||
|
|||
// ================================================================
|
|||
// 删除(remove)
|
|||
// ================================================================
|
|||
|
|||
/** |
|||
* 根据 linkId 和 orderId 从缓存中删除指定订单 |
|||
* <p> |
|||
* 典型场景:订单完成、取消、退款成功后调用。 |
|||
* |
|||
* @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); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 清除指定的所有待售后/退款订单缓存 |
|||
* <p> |
|||
* 典型场景:需要强制刷新该缓存时调用。 |
|||
* |
|||
* @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); |
|||
} |
|||
} |
|||
|
|||
// ================================================================
|
|||
// 更新(update)
|
|||
// ================================================================
|
|||
|
|||
/** |
|||
* 根据 linkId 和 orderId 更新缓存中的订单信息 |
|||
* <p> |
|||
* 如果更新后的订单状态已经不属于"待售后/退款"(status ∈ {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); |
|||
} |
|||
} |
|||
|
|||
// ================================================================
|
|||
// 查询(get)
|
|||
// ================================================================
|
|||
|
|||
/** |
|||
* 获取全部待售后/退款订单缓存 |
|||
* |
|||
* @param linkId ID |
|||
* @return 缓存的订单列表,缓存不存在时返回 null(调用方可据此判断是否需要回源查库) |
|||
*/ |
|||
public List<MallRefundRecord> getAll(String linkId) { |
|||
if (StringUtils.isBlank(linkId)) { |
|||
return null; |
|||
} |
|||
try { |
|||
String key = buildKey(linkId); |
|||
Map<Object, Object> entries = redisTemplateHelper.hGetAll(key); |
|||
if (entries == null || entries.isEmpty()) { |
|||
return null; |
|||
} |
|||
List<MallRefundRecord> 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 缓存的订单VO,不存在时返回 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; |
|||
} |
|||
|
|||
// ================================================================
|
|||
// 内部工具
|
|||
// ================================================================
|
|||
|
|||
} |
|||
Loading…
Reference in new issue