Browse Source

对接拼团数据1

master
wangfukang 2 months ago
parent
commit
1f584d946e
  1. 16
      hiver-admin/test-output/test-report.html
  2. 11
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java
  3. 5
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java
  4. 9
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java
  5. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java
  6. 94
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java
  7. 12
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
  8. 18
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java
  9. 253
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/CommentCacheUtil.java
  10. 253
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/RefundOrderCacheUtil.java
  11. 45
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WaitOrderCacheUtil.java
  12. 4
      hiver-modules/hiver-mall/src/main/resources/mapper/CommentMapper.xml

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

@ -35,7 +35,7 @@
<a href="#"><span class="badge badge-primary">Hiver</span></a> <a href="#"><span class="badge badge-primary">Hiver</span></a>
</li> </li>
<li class="m-r-10"> <li class="m-r-10">
<a href="#"><span class="badge badge-primary">四月 25, 2026 17:38:11</span></a> <a href="#"><span class="badge badge-primary">四月 26, 2026 11:40:47</span></a>
</li> </li>
</ul> </ul>
</div> </div>
@ -84,7 +84,7 @@
<div class="test-detail"> <div class="test-detail">
<span class="meta text-white badge badge-sm"></span> <span class="meta text-white badge badge-sm"></span>
<p class="name">passTest</p> <p class="name">passTest</p>
<p class="text-sm"><span>17:38:11 下</span> / <span>0.017 secs</span></p> <p class="text-sm"><span>11:40:47 上</span> / <span>0.015 secs</span></p>
</div> </div>
<div class="test-contents d-none"> <div class="test-contents d-none">
<div class="detail-head"> <div class="detail-head">
@ -92,9 +92,9 @@
<div class="info"> <div class="info">
<div class='float-right'><span class='badge badge-default'>#test-id=1</span></div> <div class='float-right'><span class='badge badge-default'>#test-id=1</span></div>
<h5 class="test-status text-pass">passTest</h5> <h5 class="test-status text-pass">passTest</h5>
<span class='badge badge-success'>04.25.2026 17:38:11</span> <span class='badge badge-success'>04.26.2026 11:40:47</span>
<span class='badge badge-danger'>04.25.2026 17:38:11</span> <span class='badge badge-danger'>04.26.2026 11:40:47</span>
<span class='badge badge-default'>0.017 secs</span> <span class='badge badge-default'>0.015 secs</span>
</div> </div>
<div class="m-t-10 m-l-5"></div> <div class="m-t-10 m-l-5"></div>
</div> </div>
@ -104,7 +104,7 @@
<tbody> <tbody>
<tr class="event-row"> <tr class="event-row">
<td><span class="badge log pass-bg">Pass</span></td> <td><span class="badge log pass-bg">Pass</span></td>
<td>17:38:11</td> <td>11:40:47</td>
<td> <td>
Test passed Test passed
</td> </td>
@ -128,13 +128,13 @@
<div class="col-md-3"> <div class="col-md-3">
<div class="card"><div class="card-body"> <div class="card"><div class="card-body">
<p class="m-b-0">Started</p> <p class="m-b-0">Started</p>
<h3>四月 25, 2026 17:38:11</h3> <h3>四月 26, 2026 11:40:47</h3>
</div></div> </div></div>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<div class="card"><div class="card-body"> <div class="card"><div class="card-body">
<p class="m-b-0">Ended</p> <p class="m-b-0">Ended</p>
<h3>四月 25, 2026 17:38:11</h3> <h3>四月 26, 2026 11:40:47</h3>
</div></div> </div></div>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">

11
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java

@ -29,6 +29,7 @@ import cc.hiver.mall.pojo.query.CommentQuery;
import cc.hiver.mall.pojo.vo.WorkerRedisVo; import cc.hiver.mall.pojo.vo.WorkerRedisVo;
import cc.hiver.mall.service.CommentService; import cc.hiver.mall.service.CommentService;
import cc.hiver.mall.service.ShopService; import cc.hiver.mall.service.ShopService;
import cc.hiver.mall.utils.CommentCacheUtil;
import cc.hiver.mall.utils.WorkerRedisCacheUtil; import cc.hiver.mall.utils.WorkerRedisCacheUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -62,6 +63,9 @@ public class CommentController {
@Autowired @Autowired
WorkerRedisCacheUtil workerRedisCacheUtil; WorkerRedisCacheUtil workerRedisCacheUtil;
@Autowired
CommentCacheUtil commentCacheUtil;
@Autowired @Autowired
private ShopService shopService; private ShopService shopService;
@ -71,6 +75,7 @@ public class CommentController {
@Autowired @Autowired
private WorkerServiceImpl workerServiceImpl; private WorkerServiceImpl workerServiceImpl;
@RequestMapping(value = "/save", method = RequestMethod.POST) @RequestMapping(value = "/save", method = RequestMethod.POST)
@ApiOperation("保存") @ApiOperation("保存")
public Result save( @RequestBody List<Comment> comment) { public Result save( @RequestBody List<Comment> comment) {
@ -138,11 +143,17 @@ public class CommentController {
} }
} }
} }
//放进缓存 小于4分
if(e.getScore().compareTo(new BigDecimal(4)) < 0){
commentCacheUtil.put(e.getShopId(),e);
}
}); });
if(comment != null && StringUtils.isNotBlank(comment.get(0).getParentId())){ if(comment != null && StringUtils.isNotBlank(comment.get(0).getParentId())){
Comment commentPar = commentService.getById(comment.get(0).getParentId()); Comment commentPar = commentService.getById(comment.get(0).getParentId());
commentPar.setHasAnswer(1); commentPar.setHasAnswer(1);
commentService.updateById(commentPar); commentService.updateById(commentPar);
//缓存去掉
commentCacheUtil.remove(commentPar.getShopId(),commentPar.getId());
} }
commentService.saveBatch(comment); commentService.saveBatch(comment);
return ResultUtil.success("评论成功"); return ResultUtil.success("评论成功");

5
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java

@ -133,8 +133,9 @@ public class MallDeliveryOrderController {
@PostMapping("/countOrderByStatus") @PostMapping("/countOrderByStatus")
@ApiOperation(value = "查询当前配送员指派单和已接单数量") @ApiOperation(value = "查询当前配送员指派单和已接单数量")
public Result<List<Map<String, Object>>> countOrderByStatus(@RequestParam String workerId) { public Result<List<Map<String, Object>>> countOrderByStatus(@RequestParam(value = "workerId") String workerId,
return new ResultUtil<List<Map<String, Object>>>().setData(mallDeliveryOrderService.countOrdersByStatus(workerId)); @RequestParam(value = "regionId") String regionId) {
return new ResultUtil<List<Map<String, Object>>>().setData(mallDeliveryOrderService.countOrdersByStatus(workerId, regionId));
} }
@PostMapping("/pagebyworker") @PostMapping("/pagebyworker")

9
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java

@ -22,6 +22,7 @@ import cc.hiver.mall.pojo.vo.WorkerRedisVo;
import cc.hiver.mall.service.RechargeService; import cc.hiver.mall.service.RechargeService;
import cc.hiver.mall.service.ShopAreaService; import cc.hiver.mall.service.ShopAreaService;
import cc.hiver.mall.service.mybatis.WorkerRelaPriceService; import cc.hiver.mall.service.mybatis.WorkerRelaPriceService;
import cc.hiver.mall.utils.WaitOrderCacheUtil;
import cc.hiver.mall.utils.WorkerOrderCacheUtil; import cc.hiver.mall.utils.WorkerOrderCacheUtil;
import cc.hiver.mall.utils.WorkerRedisCacheUtil; import cc.hiver.mall.utils.WorkerRedisCacheUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
@ -66,6 +67,9 @@ public class WorkerController {
@Autowired @Autowired
private WorkerRelaPriceService workerRelaPriceService; private WorkerRelaPriceService workerRelaPriceService;
@Autowired
private WaitOrderCacheUtil waitOrderCacheUtil;
@Autowired @Autowired
private ShopAreaService shopAreaService; private ShopAreaService shopAreaService;
@ -355,14 +359,15 @@ public class WorkerController {
// ---- 从订单缓存获取该配送员的待完成订单,统计各状态数量 ---- // ---- 从订单缓存获取该配送员的待完成订单,统计各状态数量 ----
List<MallDeliveryOrder> workerOrders = workerOrderCacheUtil.getAllAsList(w.getWorkerId()); List<MallDeliveryOrder> workerOrders = workerOrderCacheUtil.getAllAsList(w.getWorkerId());
int orderWaitCount = 0; // status=0 待接单 int orderWaitCount = waitOrderCacheUtil.getAllByWorkerId(w.getWorkerId(),dto.getRegionId()); // status=0 待接单
int orderGetCount = 0; // status=1 待取货 int orderGetCount = 0; // status=1 待取货
int orderPutCount = 0; // status=2 待送达 int orderPutCount = 0; // status=2 待送达
boolean hasSamePutArea = false; boolean hasSamePutArea = false;
//待接单
for (MallDeliveryOrder order : workerOrders) { for (MallDeliveryOrder order : workerOrders) {
if (order.getStatus() == null) continue; if (order.getStatus() == null) continue;
if (order.getStatus() == 0) orderWaitCount++;
else if (order.getStatus() == 1) orderGetCount++; else if (order.getStatus() == 1) orderGetCount++;
else if (order.getStatus() == 2) orderPutCount++; else if (order.getStatus() == 2) orderPutCount++;

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

@ -63,7 +63,7 @@ public interface MallDeliveryOrderService extends IService<MallDeliveryOrder> {
List<Map<Integer, Integer>> countOrdersByType(String regionId); List<Map<Integer, Integer>> countOrdersByType(String regionId);
List<Map<String, Object>> countOrdersByStatus(String workerId); List<Map<String, Object>> countOrdersByStatus(String workerId,String regionId);
/** /**
* 用户增加配送费在现有 deliveryFee 基础上追加 * 用户增加配送费在现有 deliveryFee 基础上追加

94
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java

@ -5,16 +5,14 @@ import cc.hiver.core.common.sms.SmsUtil;
import cc.hiver.core.entity.Worker; import cc.hiver.core.entity.Worker;
import cc.hiver.core.serviceimpl.JPushServiceImpl; import cc.hiver.core.serviceimpl.JPushServiceImpl;
import cc.hiver.core.serviceimpl.WorkerServiceImpl; import cc.hiver.core.serviceimpl.WorkerServiceImpl;
import cc.hiver.mall.dao.mapper.MallDeliveryOrderMapper; import cc.hiver.mall.dao.mapper.*;
import cc.hiver.mall.dao.mapper.MallOrderGoodsMapper;
import cc.hiver.mall.dao.mapper.MallOrderGroupMapper;
import cc.hiver.mall.dao.mapper.ShopTakeawayMapper;
import cc.hiver.mall.entity.*; import cc.hiver.mall.entity.*;
import cc.hiver.mall.mq.OrderAsyncProducer; import cc.hiver.mall.mq.OrderAsyncProducer;
import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery; import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery;
import cc.hiver.mall.pojo.query.MallRefundRecordPageQuery; import cc.hiver.mall.pojo.query.MallRefundRecordPageQuery;
import cc.hiver.mall.pojo.vo.MallOrderVO; import cc.hiver.mall.pojo.vo.MallOrderVO;
import cc.hiver.mall.pojo.vo.WorkerRedisVo; import cc.hiver.mall.pojo.vo.WorkerRedisVo;
import cc.hiver.mall.service.CommentService;
import cc.hiver.mall.service.ShopService; import cc.hiver.mall.service.ShopService;
import cc.hiver.mall.service.mybatis.MallDeliveryOrderService; import cc.hiver.mall.service.mybatis.MallDeliveryOrderService;
import cc.hiver.mall.service.mybatis.MallOrderService; import cc.hiver.mall.service.mybatis.MallOrderService;
@ -95,6 +93,12 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
@Autowired @Autowired
private UserPendingOrderCacheUtil userPendingOrderCacheUtil; private UserPendingOrderCacheUtil userPendingOrderCacheUtil;
@Autowired
private MallOrderMapper mallOrderMapper;
@Autowired
CommentCacheUtil commentCacheUtil;
@Autowired @Autowired
private WaitOrderCacheUtil waitOrderCacheUtil; private WaitOrderCacheUtil waitOrderCacheUtil;
@ -107,12 +111,18 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
@Autowired @Autowired
private MerchantOrderSeqUtil merchantOrderSeqUtil; private MerchantOrderSeqUtil merchantOrderSeqUtil;
@Autowired
private CommentService commentService;
@Autowired @Autowired
private WorkerServiceImpl workerServiceImpl; private WorkerServiceImpl workerServiceImpl;
@Autowired @Autowired
private MallUserCouponService mallUserCouponService; private MallUserCouponService mallUserCouponService;
@Autowired
private RefundOrderCacheUtil refundOrderCacheUtil;
@Override @Override
public IPage<MallDeliveryOrder> pageDelivery(MallDeliveryOrderPageQuery q) { public IPage<MallDeliveryOrder> pageDelivery(MallDeliveryOrderPageQuery q) {
if (Boolean.TRUE.equals(q.getHallOnly())) { if (Boolean.TRUE.equals(q.getHallOnly())) {
@ -631,24 +641,70 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
} }
@Override @Override
public List<Map<String, Object>> countOrdersByStatus(String workerId) { public List<Map<String, Object>> countOrdersByStatus(String workerId,String regionId) {
List<Map<String, Object>> returnList = this.baseMapper.countOrdersByStatus(workerId); List<Map<String, Object>> returnList = new ArrayList<>();
MallRefundRecordPageQuery q = new MallRefundRecordPageQuery(); // ---- 从订单缓存获取该配送员的待完成订单,统计各状态数量 ----
q.setPageSize(PAGE_SIZE); List<MallDeliveryOrder> workerOrders = workerOrderCacheUtil.getAllAsList(workerId);
IPage<MallRefundRecord> page = new Page<>(q.getPageNum(), q.getPageSize()); if(workerOrders != null){
q.setLinkId(workerId); int orderWaitCount = waitOrderCacheUtil.getAllByWorkerId(workerId,regionId); // status=0 待接单
List<Integer> statusList = new ArrayList<>(); int orderGetCount = 0; // status=1 待取货
//查待售后待退款数 int orderPutCount = 0; // status=2 待送达
statusList.add(STATUS_WAIT_ACCEPT);
statusList.add(STATUS_DONE); for (MallDeliveryOrder order : workerOrders) {
q.setStatusList(statusList); if (order.getStatus() == null) continue;
IPage<MallRefundRecord> result = mallRefundRecordService.selectPageVO(q); else if (order.getStatus() == 1) orderGetCount++;
if(result != null){ else if (order.getStatus() == 2) orderPutCount++;
}
Map<String, Object> newRecord = new HashMap<>(); Map<String, Object> newRecord = new HashMap<>();
newRecord.put("status", STATUS_DONE); // 状态 newRecord.put("status", 0); // 状态
newRecord.put("orderCount", result.getRecords().size()); newRecord.put("orderCount", orderWaitCount);
returnList.add(newRecord); returnList.add(newRecord);
Map<String, Object> newRecord1 = new HashMap<>();
newRecord1.put("status", 1); // 状态
newRecord1.put("orderCount", orderGetCount);
returnList.add(newRecord1);
Map<String, Object> newRecord2 = new HashMap<>();
newRecord2.put("status", 2); // 状态
newRecord2.put("orderCount", orderPutCount);
returnList.add(newRecord2);
}else{
returnList = this.baseMapper.countOrdersByStatus(workerId);
}
Integer pendingBadReviewCount = 0;
List<MallRefundRecord> all = refundOrderCacheUtil.getAll(workerId);
if(all != null){
pendingBadReviewCount = all.size();
}else{
//查待售后待退款数
MallRefundRecordPageQuery q = new MallRefundRecordPageQuery();
q.setPageSize(PAGE_SIZE);
IPage<MallRefundRecord> page = new Page<>(q.getPageNum(), q.getPageSize());
q.setLinkId(workerId);
List<Integer> statusList = new ArrayList<>();
statusList.add(STATUS_WAIT_ACCEPT);
statusList.add(STATUS_DONE);
q.setStatusList(statusList);
IPage<MallRefundRecord> result = mallRefundRecordService.selectPageVO(q);
if(result != null && !result.getRecords().isEmpty()){
pendingBadReviewCount = result.getRecords().size();
}
}
List<Comment> all1 = commentCacheUtil.getAll(workerId);
if(all1 != null){
pendingBadReviewCount += all1.size();
}else{
//查询待回复差评
pendingBadReviewCount += mallOrderMapper.selectPendingBadReviewCount(workerId);
} }
Map<String, Object> newRecord = new HashMap<>();
newRecord.put("status", STATUS_DONE); // 状态
newRecord.put("orderCount", pendingBadReviewCount);
returnList.add(newRecord);
return returnList; return returnList;
} }

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

@ -93,6 +93,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
@Autowired @Autowired
private UserPendingOrderCacheUtil userPendingOrderCacheUtil; private UserPendingOrderCacheUtil userPendingOrderCacheUtil;
@Autowired
private RefundOrderCacheUtil refundOrderCacheUtil;
@Autowired @Autowired
JPushServiceImpl jPushService; JPushServiceImpl jPushService;
@ -1600,6 +1603,8 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
.subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); .subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
} }
mallRefundRecordMapper.insert(record); mallRefundRecordMapper.insert(record);
//退款放到缓存
refundOrderCacheUtil.put(record.getLinkId(),record);
//发送商家通知 //发送商家通知
jPushService.sendPushNotification(shopService.findById(order.getShopId()).getClientId(), "您有一笔订单申请退款",order.getId()); jPushService.sendPushNotification(shopService.findById(order.getShopId()).getClientId(), "您有一笔订单申请退款",order.getId());
}else if(refundTypeStatus == 2){ }else if(refundTypeStatus == 2){
@ -1609,6 +1614,8 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
.subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); .subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
} }
mallRefundRecordMapper.insert(record); mallRefundRecordMapper.insert(record);
//退款放到缓存
refundOrderCacheUtil.put(record.getLinkId(),record);
//发送商家通知 //发送商家通知
jPushService.sendPushNotification(shopService.findById(order.getShopId()).getClientId(), "您有一笔订单申请退款,配送员原因",order.getId()); jPushService.sendPushNotification(shopService.findById(order.getShopId()).getClientId(), "您有一笔订单申请退款,配送员原因",order.getId());
}else if(refundTypeStatus == 3){ }else if(refundTypeStatus == 3){
@ -1620,6 +1627,8 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
.subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); .subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
} }
mallRefundRecordMapper.insert(record); mallRefundRecordMapper.insert(record);
//退款放到缓存
refundOrderCacheUtil.put(record.getLinkId(),record);
//发送商家通知 //发送商家通知
jPushService.sendPushNotification(shopService.findById(order.getShopId()).getClientId(), "您有一笔订单申请退款",order.getId()); jPushService.sendPushNotification(shopService.findById(order.getShopId()).getClientId(), "您有一笔订单申请退款",order.getId());
MallRefundRecord mallRefundRecord1 = record; MallRefundRecord mallRefundRecord1 = record;
@ -1631,8 +1640,11 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
.subtract(mallRefundRecord1.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); .subtract(mallRefundRecord1.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
} }
mallRefundRecordMapper.insert(mallRefundRecord1); mallRefundRecordMapper.insert(mallRefundRecord1);
//退款放到缓存
refundOrderCacheUtil.put(mallRefundRecord1.getLinkId(),mallRefundRecord1);
} }
} }
//给配送员发短信 //给配送员发短信
if(order.getDeliveryType() == DELIVERY_TYPE_EXPRESS){ if(order.getDeliveryType() == DELIVERY_TYPE_EXPRESS){
if(order.getOrderType() == ORDER_TYPE_FACETOFACE){ if(order.getOrderType() == ORDER_TYPE_FACETOFACE){

18
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java

@ -10,6 +10,7 @@ import cc.hiver.mall.pojo.vo.MallOrderVO;
import cc.hiver.mall.service.mybatis.MallOrderService; import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.service.mybatis.MallRefundRecordService; import cc.hiver.mall.service.mybatis.MallRefundRecordService;
import cc.hiver.mall.service.mybatis.MallUserCouponService; import cc.hiver.mall.service.mybatis.MallUserCouponService;
import cc.hiver.mall.utils.RefundOrderCacheUtil;
import cc.hiver.mall.utils.UserPendingOrderCacheUtil; import cc.hiver.mall.utils.UserPendingOrderCacheUtil;
import cc.hiver.mall.utils.WechatPayUtil; import cc.hiver.mall.utils.WechatPayUtil;
import cc.hiver.mall.utils.WorkerOrderCacheUtil; import cc.hiver.mall.utils.WorkerOrderCacheUtil;
@ -70,6 +71,9 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
@Autowired @Autowired
WorkerOrderCacheUtil workerOrderCacheUtil; WorkerOrderCacheUtil workerOrderCacheUtil;
@Autowired
private RefundOrderCacheUtil refundOrderCacheUtil;
@Autowired @Autowired
private MallUserCouponService mallUserCouponService; private MallUserCouponService mallUserCouponService;
@ -131,20 +135,28 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
.subtract(mallRefundRecord.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); .subtract(mallRefundRecord.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
} }
mallRefundRecordMapper.insert(mallRefundRecord); mallRefundRecordMapper.insert(mallRefundRecord);
//售后放到缓存
refundOrderCacheUtil.put(mallRefundRecord.getLinkId(),mallRefundRecord);
}else if(mallRefundRecord.getRefundType() == 2){ }else if(mallRefundRecord.getRefundType() == 2){
// 退配送费 // 退配送费
mallRefundRecord.setLinkId(mallRefundRecord.getWorkerId()); mallRefundRecord.setLinkId(mallRefundRecord.getWorkerId());
mallRefundRecord.setRefundAmount(mallRefundRecord.getRefundAmount() mallRefundRecord.setRefundAmount(mallRefundRecord.getRefundAmount()
.subtract(mallRefundRecord.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); .subtract(mallRefundRecord.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
mallRefundRecordMapper.insert(mallRefundRecord); mallRefundRecordMapper.insert(mallRefundRecord);
//售后放到缓存
refundOrderCacheUtil.put(mallRefundRecord.getLinkId(),mallRefundRecord);
}else if(mallRefundRecord.getRefundType() == 3){ }else if(mallRefundRecord.getRefundType() == 3){
// 全额退款 // 全额退款
if(mallRefundRecord.getRefundTypeStatus() == 1){ if(mallRefundRecord.getRefundTypeStatus() == 1){
mallRefundRecord.setLinkId(mallRefundRecord.getShopId()); mallRefundRecord.setLinkId(mallRefundRecord.getShopId());
mallRefundRecordMapper.insert(mallRefundRecord); mallRefundRecordMapper.insert(mallRefundRecord);
//售后放到缓存
refundOrderCacheUtil.put(mallRefundRecord.getLinkId(),mallRefundRecord);
}else if(mallRefundRecord.getRefundTypeStatus() == 2){ }else if(mallRefundRecord.getRefundTypeStatus() == 2){
mallRefundRecord.setLinkId(mallRefundRecord.getWorkerId()); mallRefundRecord.setLinkId(mallRefundRecord.getWorkerId());
mallRefundRecordMapper.insert(mallRefundRecord); mallRefundRecordMapper.insert(mallRefundRecord);
//售后放到缓存
refundOrderCacheUtil.put(mallRefundRecord.getLinkId(),mallRefundRecord);
}else if(mallRefundRecord.getRefundTypeStatus() == 3){ }else if(mallRefundRecord.getRefundTypeStatus() == 3){
//商家、配送员都加一条 //商家、配送员都加一条
mallRefundRecord.setLinkId(mallRefundRecord.getShopId()); mallRefundRecord.setLinkId(mallRefundRecord.getShopId());
@ -152,6 +164,8 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
mallRefundRecord.setRefundAmount(mallRefundRecord.getRefundAmount() mallRefundRecord.setRefundAmount(mallRefundRecord.getRefundAmount()
.subtract(mallRefundRecord.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); .subtract(mallRefundRecord.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
mallRefundRecordMapper.insert(mallRefundRecord); mallRefundRecordMapper.insert(mallRefundRecord);
//售后放到缓存
refundOrderCacheUtil.put(mallRefundRecord.getLinkId(),mallRefundRecord);
MallRefundRecord mallRefundRecord1 = mallRefundRecord; MallRefundRecord mallRefundRecord1 = mallRefundRecord;
mallRefundRecord1.setId(SnowFlakeUtil.nextId().toString()); mallRefundRecord1.setId(SnowFlakeUtil.nextId().toString());
mallRefundRecord1.setLinkId(mallRefundRecord.getWorkerId()); mallRefundRecord1.setLinkId(mallRefundRecord.getWorkerId());
@ -159,6 +173,8 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
mallRefundRecord1.setRefundAmount(mallRefundRecord1.getRefundAmount() mallRefundRecord1.setRefundAmount(mallRefundRecord1.getRefundAmount()
.subtract(mallRefundRecord1.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); .subtract(mallRefundRecord1.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
mallRefundRecordMapper.insert(mallRefundRecord1); mallRefundRecordMapper.insert(mallRefundRecord1);
//售后放到缓存
refundOrderCacheUtil.put(mallRefundRecord1.getLinkId(),mallRefundRecord1);
} }
} }
if(!mallRefundRecord.getItems().isEmpty()){ if(!mallRefundRecord.getItems().isEmpty()){
@ -194,6 +210,8 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
.set(MallRefundRecord::getSuccessTime, new Date()) .set(MallRefundRecord::getSuccessTime, new Date())
.set(MallRefundRecord::getStatus, mallRefundRecord.getStatus()); .set(MallRefundRecord::getStatus, mallRefundRecord.getStatus());
this.update(null, uw); this.update(null, uw);
//缓存去掉
refundOrderCacheUtil.remove(mallRefundRecord.getLinkId(), mallRefundRecord.getId());
Boolean isTuiKuan = true; Boolean isTuiKuan = true;
if(mallRefundRecord.getStatus() > 3){ if(mallRefundRecord.getStatus() > 3){
//处理售后 //处理售后

253
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;
/**
* 待回复差评订单缓存工具类
* <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;
}
// ================================================================
// 内部工具
// ================================================================
}

253
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/RefundOrderCacheUtil.java

@ -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;
}
// ================================================================
// 内部工具
// ================================================================
}

45
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WaitOrderCacheUtil.java

@ -359,6 +359,51 @@ public class WaitOrderCacheUtil {
} }
} }
public Integer getAllByWorkerId(String workerId,String regionId) {
// 1. 基础校验
if (StringUtils.isBlank(regionId)) {
return null;
}
try {
String key = buildKey(regionId);
// 2. 获取 Hash 中的所有订单数据
Map<Object, Object> entries = redisTemplateHelper.hGetAll(key);
// 如果缓存中没有数据,返回 null 让调用方去查库
if (entries == null || entries.isEmpty()) {
return null;
}
// 3. 反序列化所有缓存订单
List<MallDeliveryOrder> allCachedOrders = new ArrayList<>(entries.size());
for (Object value : entries.values()) {
if (value != null) {
allCachedOrders.add(JSONUtil.toBean(value.toString(), MallDeliveryOrder.class));
}
}
// 筛选:workerId 匹配、status=0,不区分 deliveryType
List<MallDeliveryOrder> zhipaiList = allCachedOrders.stream()
.filter(o -> workerId.equals(o.getWorkerId()))
.filter(o -> o.getStatus() != null && o.getStatus() == 0)
.collect(Collectors.toList());
if(allCachedOrders == null){
return 0;
}else{
if(!zhipaiList.isEmpty()){
return zhipaiList.size();
}else{
return 0;
}
}
} catch (Exception e) {
log.error("获取抢单大厅订单缓存失败: workerId={}", e);
// 发生异常返回 null,强制回源查库,保证系统可用性
return null;
}
}
/** /**
* 获取抢单大厅缓存单个订单 * 获取抢单大厅缓存单个订单
* *

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

@ -39,10 +39,10 @@
and picture != '' and picture != ''
</if> </if>
<if test="comment.hasAnswer != null" > <if test="comment.hasAnswer != null" >
and has_answer = 1 and has_answer = #{comment.hasAnswer,jdbcType=Integer}
</if> </if>
<if test="comment.score != 0" > <if test="comment.score != 0" >
and score <![CDATA[ < ]]> 4.5 and score <![CDATA[ < ]]> 4
</if> </if>
order by create_time desc order by create_time desc
</select> </select>

Loading…
Cancel
Save