Browse Source

对接拼团数据1

master
wangfukang 3 days ago
parent
commit
06fa786c77
  1. 16
      hiver-admin/test-output/test-report.html
  2. 3
      hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java
  3. 32
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java
  4. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderMapper.java
  5. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java
  6. 9
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java
  7. 46
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
  8. 268
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/ShopGroupOrderCacheUtil.java
  9. 32
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/UserPendingOrderCacheUtil.java
  10. 2
      hiver-modules/hiver-mall/src/main/resources/mapper/CommentMapper.xml
  11. 8
      hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml

16
hiver-admin/test-output/test-report.html

@ -35,7 +35,7 @@
<a href="#"><span class="badge badge-primary">Hiver</span></a>
</li>
<li class="m-r-10">
<a href="#"><span class="badge badge-primary">四月 21, 2026 18:05:31</span></a>
<a href="#"><span class="badge badge-primary">四月 22, 2026 17:15:02</span></a>
</li>
</ul>
</div>
@ -84,7 +84,7 @@
<div class="test-detail">
<span class="meta text-white badge badge-sm"></span>
<p class="name">passTest</p>
<p class="text-sm"><span>18:05:32 下午</span> / <span>0.015 secs</span></p>
<p class="text-sm"><span>17:15:02 下午</span> / <span>0.019 secs</span></p>
</div>
<div class="test-contents d-none">
<div class="detail-head">
@ -92,9 +92,9 @@
<div class="info">
<div class='float-right'><span class='badge badge-default'>#test-id=1</span></div>
<h5 class="test-status text-pass">passTest</h5>
<span class='badge badge-success'>04.21.2026 18:05:32</span>
<span class='badge badge-danger'>04.21.2026 18:05:32</span>
<span class='badge badge-default'>0.015 secs</span>
<span class='badge badge-success'>04.22.2026 17:15:02</span>
<span class='badge badge-danger'>04.22.2026 17:15:02</span>
<span class='badge badge-default'>0.019 secs</span>
</div>
<div class="m-t-10 m-l-5"></div>
</div>
@ -104,7 +104,7 @@
<tbody>
<tr class="event-row">
<td><span class="badge log pass-bg">Pass</span></td>
<td>18:05:32</td>
<td>17:15:02</td>
<td>
Test passed
</td>
@ -128,13 +128,13 @@
<div class="col-md-3">
<div class="card"><div class="card-body">
<p class="m-b-0">Started</p>
<h3>四月 21, 2026 18:05:31</h3>
<h3>四月 22, 2026 17:15:02</h3>
</div></div>
</div>
<div class="col-md-3">
<div class="card"><div class="card-body">
<p class="m-b-0">Ended</p>
<h3>四月 21, 2026 18:05:32</h3>
<h3>四月 22, 2026 17:15:02</h3>
</div></div>
</div>
<div class="col-md-3">

3
hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java

@ -95,9 +95,6 @@ public class WorkerServiceImpl implements WorkerService {
// 状态
if (worker.getWorkerStatus() != null) {
list.add(cb.equal(workerStatusField, worker.getWorkerStatus()));
}else{
// 禁用标识
list.add(cb.equal(workerStatusField, 1));
}
// 上下线状态

32
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java

@ -9,6 +9,7 @@ import cc.hiver.mall.pojo.query.MallOrderPageQuery;
import cc.hiver.mall.pojo.vo.MallOrderVO;
import cc.hiver.mall.service.mybatis.MallOrderGroupService;
import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.utils.ShopGroupOrderCacheUtil;
import cc.hiver.mall.utils.UserPendingOrderCacheUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
@ -36,6 +37,9 @@ public class MallOrderController {
@Autowired
private UserPendingOrderCacheUtil userPendingOrderCacheUtil;
@Autowired
private ShopGroupOrderCacheUtil shopGroupOrderCacheUtil;
@Autowired
private MallOrderGroupService mallOrderGroupService;
@ -70,7 +74,22 @@ public class MallOrderController {
@PostMapping("/getMallOrderGroupByShopId")
@ApiOperation(value = "根据店铺id查询待成团订单")
public Result<List<MallOrderGroup>> getMallOrderGroupByShopId(@RequestBody MallOrderGroup group) {
return new ResultUtil<List<MallOrderGroup>>().setData(mallOrderGroupService.selectMallGroup(group));
// 1. 先从缓存获取
List<MallOrderGroup> orders = shopGroupOrderCacheUtil.getAll(group.getShopId());
// 2. 缓存未命中,查数据库
if (orders == null) {
// 建议:加个判空,防止数据库也没数据时做无用功
orders = mallOrderGroupService.selectMallGroup(group);
// 3. 【关键步骤】如果查到了数据,必须回写到缓存!
if (orders != null && !orders.isEmpty()) {
// 设置过期时间,比如 30 分钟(根据订单平均配送时长决定)
shopGroupOrderCacheUtil.putAll(group.getShopId(), orders);
}
}
// 4. 返回结果
return new ResultUtil<List<MallOrderGroup>>().setData(orders);
}
/**
@ -109,6 +128,17 @@ public class MallOrderController {
return new ResultUtil<MallOrder>().setData(vo);
}
/**
* 根据订单id查询所有拼团订单
*/
@GetMapping("/selectAllOrderByOrderId/{orderId}")
@ApiOperation("根据订单id查询所有拼团订单")
public Result<List<MallOrderVO>> selectAllOrderByOrderId(@ApiParam("订单ID") @PathVariable String orderId) {
List<MallOrderVO> vo = mallOrderService.getAllByGroupId(orderId);
if (vo == null) return ResultUtil.error("订单不存在");
return new ResultUtil<List<MallOrderVO>>().setData(vo);
}
/**
* 订单详情
*/

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallOrderMapper.java

@ -36,4 +36,6 @@ public interface MallOrderMapper extends BaseMapper<MallOrder> {
List<String> getWeChatId();
List<MallOrderVO> getPeiSongOrders(@Param("userId") String userId);
List<MallOrderVO> getAllByGroupId(@Param("orderId") String orderId);
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java

@ -89,4 +89,6 @@ public interface MallOrderService extends IService<MallOrder> {
Map<String, Object> countByShop(String shopId);
List<MallOrderVO> getPeiSongOrders(String userId);
List<MallOrderVO> getAllByGroupId(String orderId);
}

9
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java

@ -11,6 +11,7 @@ import cc.hiver.mall.service.mybatis.MallOrderGroupService;
import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.service.mybatis.MallUserCouponService;
import cc.hiver.mall.utils.MerchantOrderSeqUtil;
import cc.hiver.mall.utils.ShopGroupOrderCacheUtil;
import cc.hiver.mall.utils.UserPendingOrderCacheUtil;
import cc.hiver.mall.utils.WechatPayUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -55,6 +56,9 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
@Lazy
private MallOrderService mallOrderService;
@Autowired
private ShopGroupOrderCacheUtil shopGroupOrderCacheUtil;
@Autowired
private cc.hiver.mall.mq.OrderAsyncProducer orderAsyncProducer;
@ -114,6 +118,8 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
.set(MallOrderGroup::getStatus, GROUP_STATUS_SUCCESS)
.set(MallOrderGroup::getSuccessTime, new Date());
this.update(guw);
//成团缓存去掉
shopGroupOrderCacheUtil.remove(group.getShopId(), groupId);
// 将所有关联子订单从"待成团"改为"待商家接单"
// 通过 head_order_id 找到团长订单,再通过 groupUserIds 关联
@ -256,6 +262,9 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
.set(MallOrderGroup::getStatus, GROUP_STATUS_FAIL);
this.update(guw);
//缓存去掉
shopGroupOrderCacheUtil.remove(group.getShopId(), groupId);
// 找出所有待成团子订单
List<String> orderIdList = Arrays.asList(group.getGroupOrderIds().split(","));
LambdaQueryWrapper<MallOrder> oqw = new LambdaQueryWrapper<>();

46
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java

@ -21,6 +21,7 @@ import cc.hiver.mall.service.mybatis.MallDeliveryOrderService;
import cc.hiver.mall.service.mybatis.MallOrderGroupService;
import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.utils.MerchantOrderSeqUtil;
import cc.hiver.mall.utils.ShopGroupOrderCacheUtil;
import cc.hiver.mall.utils.UserPendingOrderCacheUtil;
import cc.hiver.mall.utils.WechatPayUtil;
import cn.hutool.json.JSONArray;
@ -137,6 +138,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
@Autowired
private UserAddressMapper userAddressMapper;
@Autowired
private ShopGroupOrderCacheUtil shopGroupOrderCacheUtil;
@Autowired
private cc.hiver.mall.dao.mapper.ShopMapper shopMapper;
@ -522,6 +526,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
} else if (order.getOrderType() == ORDER_TYPE_GROUP || order.getOrderType() == ORDER_TYPE_FACETOFACE) {
// 拼团订单支付成功 -> 改为待成团
updateOrderStatus(orderId, STATUS_WAIT_GROUP);
MallOrderVO orderVO = buildVO(order, null, null, null);
orderVO.setStatus(STATUS_WAIT_GROUP);
userPendingOrderCacheUtil.update(order.getUserId(), orderVO);
@ -543,6 +548,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
guw.eq(MallOrderGroup::getId, group.getId())
.set(MallOrderGroup::getCurrentMembers, newMembers);
mallOrderGroupMapper.update(group,guw);
//缓存更新
group.setCurrentMembers(newMembers);
shopGroupOrderCacheUtil.update(group.getShopId(), group);
}else{
// 团长支付 且不是面对面团 状态改为待成团
int newMembers = 1;
@ -551,6 +559,11 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
guw.eq(MallOrderGroup::getId, group.getId())
.set(MallOrderGroup::getStatus, GROUP_STATUS_FORMING).set(MallOrderGroup::getCurrentMembers, newMembers);
mallOrderGroupMapper.update(group,guw);
//普通拼团团长发起拼团进缓存
if(order.getOrderType() == ORDER_TYPE_GROUP){
group.setCurrentMembers(newMembers);
shopGroupOrderCacheUtil.put(order.getShopId(), group);
}
}else{
LambdaUpdateWrapper<MallOrderGroup> guw = new LambdaUpdateWrapper<>();
guw.eq(MallOrderGroup::getId, group.getId())
@ -727,6 +740,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
.set(MallOrderGroup::getStatus, GROUP_STATUS_FAIL)
.set(MallOrderGroup::getCurrentMembers, 0);
mallOrderGroupMapper.update(null, guw);
//成团缓存去掉
shopGroupOrderCacheUtil.remove(group.getShopId(), group.getId());
//取消配送单
if(order.getDeliveryType() != null && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS){
cancelDeliveryOrderByOrderId(order.getId());
}
@ -813,6 +829,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
.set(MallOrderGroup::getCurrentMembers, Math.max(group.getCurrentMembers() - 1, 0))
.set(MallOrderGroup::getGroupOrderIds, remainingIds);
mallOrderGroupMapper.update(null, guw);
//缓存更新
group.setCurrentMembers(Math.max(group.getCurrentMembers() - 1, 0));
shopGroupOrderCacheUtil.update(group.getShopId(), group);
return;
}
@ -1082,6 +1101,30 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
return orders;
}
@Override
public List<MallOrderVO> getAllByGroupId(String orderId) {
List<MallOrderVO> orders = this.baseMapper.getAllByGroupId(orderId);
if(orders != null && !orders.isEmpty()){
// 1. 收集所有订单ID
List<String> orderIds = orders.stream()
.map(MallOrderVO::getId)
.collect(java.util.stream.Collectors.toList());
// 2. 一次 IN 查询所有商品明细
List<MallOrderGoods> allGoods = mallOrderGoodsMapper.selectByOrderIds(orderIds);
// 3. 按 orderId 分组
java.util.Map<String, List<MallOrderGoods>> goodsMap = allGoods.stream()
.collect(java.util.stream.Collectors.groupingBy(MallOrderGoods::getOrderId));
// 4. 组装到每个 VO
for (MallOrderVO vo : orders) {
vo.setGoodsList(goodsMap.getOrDefault(vo.getId(), java.util.Collections.emptyList()));
}
}
return orders;
}
// ================================================================
// 查询
// ================================================================
@ -1686,6 +1729,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
if (decrementMembers) {
guw.set(MallOrderGroup::getCurrentMembers, Math.max(group.getCurrentMembers() - 1, 0));
}
//缓存更新
group.setCurrentMembers(Math.max(group.getCurrentMembers() - 1, 0));
shopGroupOrderCacheUtil.update(group.getShopId(), group);
mallOrderGroupMapper.update(null, guw);
}

268
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/ShopGroupOrderCacheUtil.java

@ -0,0 +1,268 @@
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;
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 结构保证按 shopId + orderId 维度的 O(1) 读写效率
* <pre>
* Key = SHOP_GROUP_ORDERS:{shopId}
* Field = orderId
* Value = MallOrderGroup JSON 序列化
* </pre>
* <p>
* 使用场景订单状态发生变化时创建更新取消完成等
* 由业务方主动调用本工具类的方法维护缓存以减少 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;
}
// ================================================================
// 存放(put)
// ================================================================
/**
* 存放单个订单到缓存
*
* @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<MallOrderGroup> orders) {
if (StringUtils.isBlank(shopId) || orders == null || orders.isEmpty()) {
return;
}
try {
String key = buildKey(shopId);
Map<String, String> 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);
}
}
// ================================================================
// 删除(remove)
// ================================================================
/**
* 根据 shopId orderId 从缓存中删除指定订单
* <p>
* 典型场景订单成团取消退款成功后调用
*
* @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);
}
}
/**
* 清除指定店铺所有待成团订单缓存
* <p>
* 典型场景需要强制刷新该店铺缓存时调用
*
* @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);
}
}
// ================================================================
// 更新(update)
// ================================================================
/**
* 根据 shopId orderId 更新缓存中的订单信息
* <p>
* 如果更新后的订单状态已经不属于"待完成"status {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);
}
}
// ================================================================
// 查询(get)
// ================================================================
/**
* 获取店铺待成团订单缓存
*
* @param shopId 店铺ID
* @return 缓存的订单列表缓存不存在时返回 null调用方可据此判断是否需要回源查库
*/
public List<MallOrderGroup> getAll(String shopId) {
if (StringUtils.isBlank(shopId)) {
return null;
}
try {
String key = buildKey(shopId);
Map<Object, Object> entries = redisTemplateHelper.hGetAll(key);
if (entries == null || entries.isEmpty()) {
return null;
}
List<MallOrderGroup> result = new ArrayList<>(entries.size());
for (Object value : entries.values()) {
if (value != null) {
result.add(JSONUtil.toBean(value.toString(), MallOrderGroup.class));
}
}
return result;
} catch (Exception e) {
log.info("获取店铺待成团订单缓存失败: shopId={}", shopId, e);
return null;
}
}
/**
* 获取店铺缓存待成团单个订单
*
* @param shopId 店铺ID
* @param orderId 订单ID
* @return 缓存的订单VO不存在时返回 null
*/
public MallOrderVO get(String shopId, String orderId) {
if (StringUtils.isBlank(shopId) || StringUtils.isBlank(orderId)) {
return null;
}
try {
String key = buildKey(shopId);
Object value = redisTemplateHelper.hGet(key, orderId);
if (value == null) {
return null;
}
return JSONUtil.toBean(value.toString(), MallOrderVO.class);
} catch (Exception e) {
log.info("获取店铺单个待成团订单缓存失败: shopId={}, orderId={}", shopId, orderId, e);
return null;
}
}
/**
* 判断该店铺的缓存是否已存在
*
* @param shopId 店铺ID
* @return true 表示缓存存在
*/
public boolean exists(String shopId) {
if (StringUtils.isBlank(shopId)) {
return false;
}
Boolean hasKey = redisTemplateHelper.hasKey(buildKey(shopId));
return hasKey != null && hasKey;
}
// ================================================================
// 内部工具
// ================================================================
/**
* 判断订单状态是否为终态不再属于"待成团"
*/
private boolean isTerminalStatus(Integer status) {
if (status == null) {
return false;
}
return status == STATUS_DONE;
}
}

32
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/UserPendingOrderCacheUtil.java

@ -63,16 +63,16 @@ public class UserPendingOrderCacheUtil {
*/
public void put(String userId, MallOrderVO orderVO) {
if (StringUtils.isBlank(userId) || orderVO == null || StringUtils.isBlank(orderVO.getId())) {
log.warn("UserPendingOrderCacheUtil.put 参数无效, userId={}, orderVO={}", userId, orderVO);
log.info("UserPendingOrderCacheUtil.put 参数无效, userId={}, orderVO={}", userId, orderVO);
return;
}
try {
String key = buildKey(userId);
String json = JSONUtil.toJsonStr(orderVO);
redisTemplateHelper.hPut(key, orderVO.getId(), json);
log.debug("缓存用户待完成订单: userId={}, orderId={}", userId, orderVO.getId());
log.info("缓存用户待完成订单: userId={}, orderId={}", userId, orderVO.getId());
} catch (Exception e) {
log.error("缓存用户待完成订单失败: userId={}, orderId={}", userId, orderVO.getId(), e);
log.info("缓存用户待完成订单失败: userId={}, orderId={}", userId, orderVO.getId(), e);
}
}
@ -96,10 +96,10 @@ public class UserPendingOrderCacheUtil {
}
if (!map.isEmpty()) {
redisTemplateHelper.hPutAll(key, map);
log.debug("批量缓存用户待完成订单: userId={}, count={}", userId, map.size());
log.info("批量缓存用户待完成订单: userId={}, count={}", userId, map.size());
}
} catch (Exception e) {
log.error("批量缓存用户待完成订单失败: userId={}", userId, e);
log.info("批量缓存用户待完成订单失败: userId={}", userId, e);
}
}
@ -117,15 +117,15 @@ public class UserPendingOrderCacheUtil {
*/
public void remove(String userId, String orderId) {
if (StringUtils.isBlank(userId) || StringUtils.isBlank(orderId)) {
log.warn("UserPendingOrderCacheUtil.remove 参数无效, userId={}, orderId={}", userId, orderId);
log.info("UserPendingOrderCacheUtil.remove 参数无效, userId={}, orderId={}", userId, orderId);
return;
}
try {
String key = buildKey(userId);
redisTemplateHelper.hDelete(key, orderId);
log.debug("删除用户待完成订单缓存: userId={}, orderId={}", userId, orderId);
log.info("删除用户待完成订单缓存: userId={}, orderId={}", userId, orderId);
} catch (Exception e) {
log.error("删除用户待完成订单缓存失败: userId={}, orderId={}", userId, orderId, e);
log.info("删除用户待完成订单缓存失败: userId={}, orderId={}", userId, orderId, e);
}
}
@ -142,9 +142,9 @@ public class UserPendingOrderCacheUtil {
}
try {
redisTemplateHelper.delete(buildKey(userId));
log.debug("清除用户全部待完成订单缓存: userId={}", userId);
log.info("清除用户全部待完成订单缓存: userId={}", userId);
} catch (Exception e) {
log.error("清除用户全部待完成订单缓存失败: userId={}", userId, e);
log.info("清除用户全部待完成订单缓存失败: userId={}", userId, e);
}
}
@ -163,23 +163,23 @@ public class UserPendingOrderCacheUtil {
*/
public void update(String userId, MallOrderVO orderVO) {
if (StringUtils.isBlank(userId) || orderVO == null || StringUtils.isBlank(orderVO.getId())) {
log.warn("UserPendingOrderCacheUtil.update 参数无效, userId={}, orderVO={}", userId, orderVO);
log.info("UserPendingOrderCacheUtil.update 参数无效, userId={}, orderVO={}", userId, orderVO);
return;
}
try {
// 如果订单状态已不属于待完成,直接删除
if (isTerminalStatus(orderVO.getStatus())) {
remove(userId, orderVO.getId());
log.debug("订单已终态,从缓存移除: userId={}, orderId={}, status={}",
log.info("订单已终态,从缓存移除: userId={}, orderId={}, status={}",
userId, orderVO.getId(), orderVO.getStatus());
return;
}
// 否则覆盖更新
put(userId, orderVO);
log.debug("更新用户待完成订单缓存: userId={}, orderId={}, status={}",
log.info("更新用户待完成订单缓存: userId={}, orderId={}, status={}",
userId, orderVO.getId(), orderVO.getStatus());
} catch (Exception e) {
log.error("更新用户待完成订单缓存失败: userId={}, orderId={}", userId, orderVO.getId(), e);
log.info("更新用户待完成订单缓存失败: userId={}, orderId={}", userId, orderVO.getId(), e);
}
}
@ -211,7 +211,7 @@ public class UserPendingOrderCacheUtil {
}
return result;
} catch (Exception e) {
log.error("获取用户待完成订单缓存失败: userId={}", userId, e);
log.info("获取用户待完成订单缓存失败: userId={}", userId, e);
return null;
}
}
@ -235,7 +235,7 @@ public class UserPendingOrderCacheUtil {
}
return JSONUtil.toBean(value.toString(), MallOrderVO.class);
} catch (Exception e) {
log.error("获取用户单个待完成订单缓存失败: userId={}, orderId={}", userId, orderId, e);
log.info("获取用户单个待完成订单缓存失败: userId={}, orderId={}", userId, orderId, e);
return null;
}
}

2
hiver-modules/hiver-mall/src/main/resources/mapper/CommentMapper.xml

@ -60,7 +60,7 @@
<delete id="deleteByOrderId" parameterType="java.lang.String" >
delete from t_comment
where order_id = #{orderId,jdbcType=VARCHAR}
where id = #{orderId,jdbcType=VARCHAR}
</delete>
<delete id="deleteById" parameterType="java.lang.String" >

8
hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml

@ -53,6 +53,14 @@
GROUP BY counttype
</select>
<select id="getAllByGroupId" resultMap="mallOrderVOMap">
SELECT m2.*
FROM mall_order m1
JOIN mall_order_group g ON FIND_IN_SET(m1.id, g.group_order_ids) > 0
JOIN mall_order m2 ON FIND_IN_SET(m2.id, g.group_order_ids) > 0
WHERE m2.status != 6 and m1.id = #{orderId}
</select>
<!-- 统计营业额和订单量 (带时间范围) -->
<select id="selectOrderRevenueAndCount" parameterType="java.util.Map" resultType="java.util.Map">
SELECT

Loading…
Cancel
Save