Browse Source

对接拼团数据1

master
wangfukang 1 month ago
parent
commit
1b0c2c1b1f
  1. 16
      hiver-admin/test-output/test-report.html
  2. 4
      hiver-core/src/main/java/cc/hiver/core/common/constant/SettingConstant.java
  3. 13
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java
  4. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/WorkerRelaPriceMapper.java
  5. 7
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncProducer.java
  6. 47
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderDelayConsumer.java
  7. 66
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java
  8. 11
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java
  9. 25
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
  10. 76
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java
  11. 3
      hiver-modules/hiver-mall/src/main/resources/mapper/WorkerRelaPriceMapper.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 16:41:05</span></a>
<a href="#"><span class="badge badge-primary">六月 22, 2026 17:45:41</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>16:41:06 下午</span> / <span>0.024 secs</span></p>
<p class="text-sm"><span>17:45:43 下午</span> / <span>0.031 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'>06.21.2026 16:41:06</span>
<span class='badge badge-danger'>06.21.2026 16:41:06</span>
<span class='badge badge-default'>0.024 secs</span>
<span class='badge badge-success'>06.22.2026 17:45:43</span>
<span class='badge badge-danger'>06.22.2026 17:45:43</span>
<span class='badge badge-default'>0.031 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>16:41:06</td>
<td>17:45:43</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 16:41:05</h3>
<h3>六月 22, 2026 17:45:41</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 16:41:06</h3>
<h3>六月 22, 2026 17:45:43</h3>
</div></div>
</div>
<div class="col-md-3">

4
hiver-core/src/main/java/cc/hiver/core/common/constant/SettingConstant.java

@ -109,6 +109,10 @@ public interface SettingConstant {
SMS_TIMEOUT,
// 中转单商家送达后校内取货超时提醒
SMS_TRANSFER,
// 订单被拒绝退款,通知用户
SMS_REFUNDUSER,
// 用户申请配送员售后,通知配送员
SMS_REFUNDWORKER,
//订单退款
SMS_ORDERRETURN
}

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

@ -298,6 +298,8 @@ public class WorkerController {
private Integer orderType;
/** 送货区域id(用户收货区域) */
private String putAreaId;
/** 佣金上限:改派时传当前配送单总佣金,只返回接单佣金不超过该金额的配送员 */
private BigDecimal commissionAmount;
/** 交易保障:true 只查 rebate_amount > 0 的配送员 */
private Boolean baozhang;
/** 相同地址:true 只查手上有相同送货区域订单的配送员 */
@ -325,6 +327,13 @@ public class WorkerController {
public Result<IPage<WorkerMatchVO>> getMatchingWorkerList(@RequestBody WorkerMatchDTO dto) {
int pageNum = dto.getPageNum() != null && dto.getPageNum() > 0 ? dto.getPageNum() : 1;
int pageSize = dto.getPageSize() != null && dto.getPageSize() > 0 ? dto.getPageSize() : 10;
if (dto.getCommissionAmount() != null
&& (StrUtil.isBlank(dto.getShopAreaId()) || StrUtil.isBlank(dto.getPutAreaId()))) {
IPage<WorkerMatchVO> emptyPage = new Page<>(pageNum, pageSize);
emptyPage.setRecords(Collections.emptyList());
emptyPage.setTotal(0);
return new ResultUtil<IPage<WorkerMatchVO>>().setData(emptyPage);
}
// ============ 1. 从缓存获取当前区域所有在线配送员 ============
List<WorkerRedisVo> workerRedisVoList = null;
@ -372,6 +381,9 @@ public class WorkerController {
if (StrUtil.isNotBlank(dto.getPutAreaId()) && !dto.getPutAreaId().equals(rp.getPutAreaId())) continue;
// 订单类型匹配
if (dto.getOrderType() != null && !dto.getOrderType().equals(rp.getOrderType())) continue;
// 改派时只允许选择接单佣金不超过当前配送单总佣金的规则
if (dto.getCommissionAmount() != null
&& (rp.getOrderBkge() == null || rp.getOrderBkge().compareTo(dto.getCommissionAmount()) > 0)) continue;
matchedRule = rp;
break;
}
@ -473,6 +485,7 @@ public class WorkerController {
dto.getShopAreaId(),
dto.getOrderType(),
dto.getPutAreaId(),
dto.getCommissionAmount(),
StrUtil.isBlank(dto.getKeyword()) ? null : dto.getKeyword().trim(),
dto.getBaozhang(),
dto.getXiangtong(),

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

@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.math.BigDecimal;
import java.util.List;
@Repository
@ -38,6 +39,7 @@ public interface WorkerRelaPriceMapper extends BaseMapper<WorkerRelaPrice> {
@Param("shopAreaId") String shopAreaId,
@Param("orderType") Integer orderType,
@Param("putAreaId") String putAreaId,
@Param("commissionAmount") BigDecimal commissionAmount,
@Param("keyword") String keyword,
@Param("baozhang") Boolean baozhang,
@Param("xiangtong") Boolean xiangtong,

7
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncProducer.java

@ -78,7 +78,14 @@ public class OrderAsyncProducer {
* @param delayMillis 需要延迟的毫秒数
*/
public void sendDelayMessage(String orderId, String delayType, long delayMillis) {
sendDelayMessage(orderId, delayType, delayMillis, null);
}
public void sendDelayMessage(String orderId, String delayType, long delayMillis, Map<String, Object> extraParams) {
Map<String, Object> msgBody = new HashMap<>();
if (extraParams != null) {
msgBody.putAll(extraParams);
}
msgBody.put("orderId", orderId);
msgBody.put("delayType", delayType);
msgBody.put("timestamp", System.currentTimeMillis());

47
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderDelayConsumer.java

@ -11,6 +11,8 @@ import cc.hiver.mall.entity.MallOrder;
import cc.hiver.mall.entity.MallRefundRecord;
import cc.hiver.mall.entity.Shop;
import cc.hiver.mall.service.mybatis.MallRefundRecordService;
import cc.hiver.mall.utils.WaitOrderCacheUtil;
import cc.hiver.mall.utils.WorkerOrderCacheUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -52,6 +54,12 @@ public class OrderDelayConsumer {
@Autowired
private cc.hiver.mall.utils.RefundOrderCacheUtil refundOrderCacheUtil;
@Autowired
private WorkerOrderCacheUtil workerOrderCacheUtil;
@Autowired
private WaitOrderCacheUtil waitOrderCacheUtil;
@RabbitListener(queues = OrderQueueConfig.DEAD_QUEUE)
public void processDelayMessage(String messageBody) {
log.info("【订单延时处理】接收到死信超时消息: {}", messageBody);
@ -59,13 +67,14 @@ public class OrderDelayConsumer {
JSONObject msg = JSON.parseObject(messageBody);
String orderId = msg.getString("orderId");
String delayType = msg.getString("delayType");
String assignedWorkerId = msg.getString("assignedWorkerId");
switch (delayType) {
case "Worker_Timeout_5m":
handleWorkerTimeout5m(orderId);
handleWorkerTimeout5m(orderId, assignedWorkerId);
break;
case "Worker_Timeout_10m":
handleWorkerTimeout10m(orderId);
handleWorkerTimeout10m(orderId, assignedWorkerId);
break;
case "NoWorker_Timeout_10m":
handleNoWorkerTimeout10m(orderId);
@ -92,12 +101,15 @@ public class OrderDelayConsumer {
}
}
private void handleWorkerTimeout5m(String orderId) {
private void handleWorkerTimeout5m(String orderId, String assignedWorkerId) {
MallDeliveryOrder delivery = getDeliveryOrder(orderId);
if (delivery == null || delivery.getStatus() != 0 || StringUtils.isBlank(delivery.getWorkerId())) {
// 已被处理、状态不再是0待接单,或者已经不是指定单,安全撤销(忽略)
return;
}
if (StringUtils.isBlank(assignedWorkerId) || !assignedWorkerId.equals(delivery.getWorkerId())) {
return;
}
log.info("【订单延时处理】指定配送单 5分钟未接单,向配送员发送短信通知 orderId={}", orderId);
// 发送 SMS_TIMEOUT
if (StringUtils.isNotBlank(delivery.getWorkerPhone())) {
@ -105,11 +117,15 @@ public class OrderDelayConsumer {
}
}
private void handleWorkerTimeout10m(String orderId) {
private void handleWorkerTimeout10m(String orderId, String assignedWorkerId) {
MallDeliveryOrder delivery = getDeliveryOrder(orderId);
if (delivery == null || delivery.getStatus() != 0 || StringUtils.isBlank(delivery.getWorkerId())) {
return;
}
if (StringUtils.isBlank(assignedWorkerId) || !assignedWorkerId.equals(delivery.getWorkerId())) {
return;
}
String workerId = delivery.getWorkerId();
log.info("【订单延时处理】指定配送单 10分钟未接单,移除配送员并通知用户 orderId={}", orderId);
// 更新配送单(去掉workerId,退回大厅)
LambdaUpdateWrapper<MallDeliveryOrder> uw = new LambdaUpdateWrapper<>();
@ -117,6 +133,7 @@ public class OrderDelayConsumer {
.set(MallDeliveryOrder::getWorkerId, (String)null).set(MallDeliveryOrder::getWorkerName, (String)null)
.set(MallDeliveryOrder::getWorkerPhone, (String)null);
mallDeliveryOrderMapper.update(null, uw);
moveAssignedOrderBackToWaitCache(workerId, delivery);
// 给用户通知
if (StringUtils.isNotBlank(delivery.getReceiverPhone())) {
@ -133,6 +150,28 @@ public class OrderDelayConsumer {
}
}
private void moveAssignedOrderBackToWaitCache(String workerId, MallDeliveryOrder delivery) {
if (delivery == null || StringUtils.isBlank(delivery.getId())) {
return;
}
MallDeliveryOrder cacheDelivery = StringUtils.isBlank(workerId) ? null : workerOrderCacheUtil.get(workerId, delivery.getId());
if (cacheDelivery == null && StringUtils.isNotBlank(delivery.getRegionId())) {
cacheDelivery = waitOrderCacheUtil.get(delivery.getRegionId(), delivery.getId());
}
if (StringUtils.isNotBlank(workerId)) {
workerOrderCacheUtil.remove(workerId, delivery.getId());
}
if (cacheDelivery == null) {
cacheDelivery = delivery;
}
cacheDelivery.setWorkerId(null);
cacheDelivery.setWorkerName(null);
cacheDelivery.setWorkerPhone(null);
if (StringUtils.isNotBlank(cacheDelivery.getRegionId())) {
waitOrderCacheUtil.update(cacheDelivery.getRegionId(), cacheDelivery);
}
}
private void handleNoWorkerTimeout10m(String orderId) {
MallDeliveryOrder delivery = getDeliveryOrder(orderId);
if (delivery == null || delivery.getStatus() != 0 || StringUtils.isNotBlank(delivery.getWorkerId())) {

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

@ -1106,9 +1106,31 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
uw.eq(MallDeliveryOrder::getId, delivery.getId())
.set(MallDeliveryOrder::getDeliveryFee, newFee);
this.update(uw);
delivery.setDeliveryFee(newFee);
syncAddedDeliveryFeeCache(delivery, newFee);
log.info("配送单 {} 配送费增加 {},更新后为 {}", delivery.getId(), additionalFee, newFee);
}
private void syncAddedDeliveryFeeCache(MallDeliveryOrder delivery, BigDecimal newFee) {
if (delivery == null || StringUtils.isBlank(delivery.getId()) || newFee == null) {
return;
}
if (StringUtils.isNotBlank(delivery.getRegionId())) {
MallDeliveryOrder waitCacheDelivery = waitOrderCacheUtil.get(delivery.getRegionId(), delivery.getId());
if (waitCacheDelivery != null) {
waitCacheDelivery.setDeliveryFee(newFee);
waitOrderCacheUtil.update(delivery.getRegionId(), waitCacheDelivery);
}
}
if (StringUtils.isNotBlank(delivery.getWorkerId())) {
MallDeliveryOrder workerCacheDelivery = workerOrderCacheUtil.get(delivery.getWorkerId(), delivery.getId());
if (workerCacheDelivery != null) {
workerCacheDelivery.setDeliveryFee(newFee);
workerOrderCacheUtil.update(delivery.getWorkerId(), workerCacheDelivery);
}
}
}
/**
* 重新指定配送员仅待接单状态可操作
*/
@ -1122,6 +1144,7 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
if (delivery.getStatus() != STATUS_WAIT_ACCEPT) {
throw new RuntimeException("只有待接单状态的配送单才能重新指定配送员");
}
String oldWorkerId = delivery.getWorkerId();
LambdaUpdateWrapper<MallDeliveryOrder> uw = new LambdaUpdateWrapper<>();
uw.eq(MallDeliveryOrder::getId, deliveryId)
@ -1133,10 +1156,51 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
delivery.setWorkerId(newWorkerId);
delivery.setWorkerName(newWorkerName);
delivery.setWorkerPhone(newWorkerPhone);
waitOrderCacheUtil.update(delivery.getRegionId(), delivery);
syncReassignedWorkerCache(oldWorkerId, newWorkerId, delivery);
sendReassignedWorkerTimeoutMessage(delivery);
log.info("配送单 {} 重新指定配送员: workerId={}, workerName={}", deliveryId, newWorkerId, newWorkerName);
}
private void sendReassignedWorkerTimeoutMessage(MallDeliveryOrder delivery) {
if (delivery == null || StringUtils.isBlank(delivery.getOrderId()) || StringUtils.isBlank(delivery.getWorkerId())) {
return;
}
Map<String, Object> extraParams = new HashMap<>();
extraParams.put("assignedWorkerId", delivery.getWorkerId());
orderAsyncProducer.sendDelayMessage(delivery.getOrderId(), "Worker_Timeout_5m", 5 * 60 * 1000L, extraParams);
orderAsyncProducer.sendDelayMessage(delivery.getOrderId(), "Worker_Timeout_10m", 10 * 60 * 1000L, extraParams);
}
private void syncReassignedWorkerCache(String oldWorkerId, String newWorkerId, MallDeliveryOrder delivery) {
if (delivery == null || StringUtils.isBlank(delivery.getId())) {
return;
}
MallDeliveryOrder cacheDelivery = null;
if (StringUtils.isNotBlank(delivery.getRegionId())) {
cacheDelivery = waitOrderCacheUtil.get(delivery.getRegionId(), delivery.getId());
}
if (cacheDelivery == null && StringUtils.isNotBlank(oldWorkerId)) {
cacheDelivery = workerOrderCacheUtil.get(oldWorkerId, delivery.getId());
}
if (StringUtils.isNotBlank(oldWorkerId)) {
workerOrderCacheUtil.remove(oldWorkerId, delivery.getId());
}
if (cacheDelivery == null) {
cacheDelivery = delivery;
assembleOrderGoodsForDeliveries(Collections.singletonList(cacheDelivery));
}
cacheDelivery.setWorkerId(newWorkerId);
cacheDelivery.setWorkerName(delivery.getWorkerName());
cacheDelivery.setWorkerPhone(delivery.getWorkerPhone());
if (StringUtils.isNotBlank(cacheDelivery.getRegionId())) {
waitOrderCacheUtil.update(cacheDelivery.getRegionId(), cacheDelivery);
}
if (StringUtils.isNotBlank(newWorkerId)) {
workerOrderCacheUtil.put(newWorkerId, cacheDelivery);
}
}
@Override
public MallDeliveryOrder selectByGroupId(String orderId) {
return this.baseMapper.selectByGroupId(orderId);

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

@ -32,10 +32,7 @@ import java.math.BigDecimal;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -420,8 +417,10 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
boolean isSpecified = StringUtils.isNotBlank(delivery.getWorkerId());
if (isSpecified) {
// 指定单:5分钟校验,10分钟校验
orderAsyncProducer.sendDelayMessage(orderId, "Worker_Timeout_5m", 5 * 60 * 1000L);
orderAsyncProducer.sendDelayMessage(orderId, "Worker_Timeout_10m", 10 * 60 * 1000L);
Map<String, Object> extraParams = new HashMap<>();
extraParams.put("assignedWorkerId", delivery.getWorkerId());
orderAsyncProducer.sendDelayMessage(orderId, "Worker_Timeout_5m", 5 * 60 * 1000L, extraParams);
orderAsyncProducer.sendDelayMessage(orderId, "Worker_Timeout_10m", 10 * 60 * 1000L, extraParams);
} else {
// 抢单大厅:10分钟校验
orderAsyncProducer.sendDelayMessage(orderId, "NoWorker_Timeout_10m", 10 * 60 * 1000L);

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

@ -603,11 +603,13 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
if (order.getStatus() != STATUS_WAIT_PAY) {
return; // 已经处理过或状态不对
}
Date payTime = new Date();
order.setPayTime(payTime);
if (order.getOrderType() == ORDER_TYPE_NORMAL) {
// 直购支付成功 -> 跳过待商家接单,直接进入待配送或待消费
if (DELIVERY_TYPE_EXPRESS == order.getDeliveryType()) {
updateOrderStatus(orderId, STATUS_WAIT_DELIVERY);
updateOrderStatus(orderId, STATUS_WAIT_DELIVERY, payTime);
notifyShopDeliveryOrder(order);
//用户当前订单缓存
MallOrderVO orderVO = buildVO(order, null, null, null);
@ -647,7 +649,10 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
} else {
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 2);
LambdaUpdateWrapper<MallOrder> uw = new LambdaUpdateWrapper<>();
uw.eq(MallOrder::getId, orderId).set(MallOrder::getStatus, STATUS_WAIT_PICKUP).set(MallOrder::getNumberCode, latestSeq);
uw.eq(MallOrder::getId, orderId)
.set(MallOrder::getStatus, STATUS_WAIT_PICKUP)
.set(MallOrder::getNumberCode, latestSeq)
.set(MallOrder::getPayTime, payTime);
this.update(uw);
MallOrderVO orderVO = buildVO(order, null, null, null);
orderVO.setStatus(STATUS_WAIT_PICKUP);
@ -663,7 +668,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);
updateOrderStatus(orderId, STATUS_WAIT_GROUP, payTime);
MallOrderVO orderVO = buildVO(order, null, null, null);
orderVO.setStatus(STATUS_WAIT_GROUP);
@ -717,6 +722,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
}
}
}else if(orderId != null && orderId.startsWith("ORDERDE_")){
//增加配送佣金
orderId = orderId.substring(8);
MallOrder order = this.getById(orderId);
if(order.getOrderType() == ORDER_TYPE_FACETOFACE){
@ -750,8 +756,10 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
boolean isSpecified = StringUtils.isNotBlank(delivery.getWorkerId());
if (isSpecified) {
// 指定单:5分钟校验,10分钟校验
orderAsyncProducer.sendDelayMessage(orderId, "Worker_Timeout_5m", 5 * 60 * 1000L);
orderAsyncProducer.sendDelayMessage(orderId, "Worker_Timeout_10m", 10 * 60 * 1000L);
Map<String, Object> extraParams = new HashMap<>();
extraParams.put("assignedWorkerId", delivery.getWorkerId());
orderAsyncProducer.sendDelayMessage(orderId, "Worker_Timeout_5m", 5 * 60 * 1000L, extraParams);
orderAsyncProducer.sendDelayMessage(orderId, "Worker_Timeout_10m", 10 * 60 * 1000L, extraParams);
} else {
// 抢单大厅:10分钟校验
orderAsyncProducer.sendDelayMessage(orderId, "NoWorker_Timeout_10m", 10 * 60 * 1000L);
@ -1827,8 +1835,15 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
* 更新订单状态
*/
private void updateOrderStatus(String orderId, int status) {
updateOrderStatus(orderId, status, null);
}
private void updateOrderStatus(String orderId, int status, Date payTime) {
LambdaUpdateWrapper<MallOrder> uw = new LambdaUpdateWrapper<>();
uw.eq(MallOrder::getId, orderId).set(MallOrder::getStatus, status);
if (payTime != null) {
uw.set(MallOrder::getPayTime, payTime);
}
this.update(uw);
}

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

@ -1,13 +1,17 @@
package cc.hiver.mall.serviceimpl.mybatis;
import cc.hiver.core.common.constant.DealingsRecordConstant;
import cc.hiver.core.common.constant.SettingConstant;
import cc.hiver.core.common.sms.SmsUtil;
import cc.hiver.core.common.utils.SnowFlakeUtil;
import cc.hiver.core.entity.Worker;
import cc.hiver.core.serviceimpl.JPushServiceImpl;
import cc.hiver.core.serviceimpl.WorkerServiceImpl;
import cc.hiver.mall.dao.mapper.*;
import cc.hiver.mall.entity.*;
import cc.hiver.mall.pojo.query.MallRefundRecordPageQuery;
import cc.hiver.mall.pojo.vo.MallOrderVO;
import cc.hiver.mall.service.ShopService;
import cc.hiver.mall.service.mybatis.DealingsRecordService;
import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.service.mybatis.MallRefundRecordService;
@ -58,6 +62,15 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
@Autowired
private cc.hiver.mall.mq.OrderAsyncProducer orderAsyncProducer;
@Autowired
private SmsUtil smsUtil;
@Autowired
private JPushServiceImpl jPushService;
@Autowired
private ShopService shopService;
@Autowired
private MallReturnOrderGoodsMapper mallReturnOrderGoodsMapper;
@ -156,7 +169,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
mallRefundRecord.setCreateTime(new Date());
mallRefundRecord.setRegionId(order.getRegionId());
if(mallRefundRecord.getRefundType() == 1){
// 退商品
// 退商品,和商家有关联
mallRefundRecord.setLinkId(mallRefundRecord.getShopId());
if(ratio != null && !ratio.equals(0)){
mallRefundRecord.setRefundAmount(mallRefundRecord.getRefundAmount()
@ -167,8 +180,9 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
refundOrderCacheUtil.put(mallRefundRecord.getLinkId(),mallRefundRecord);
//发送1小时延时MQ:超时未处理则自动同意
orderAsyncProducer.sendRefundDelayMessage(mallRefundRecord.getId(), mallRefundRecord.getOrderId());
sendShopAfterSaleNotice(order);
}else if(mallRefundRecord.getRefundType() == 2){
// 退配送费
// 退配送费和配送员有关联
mallRefundRecord.setLinkId(mallRefundRecord.getWorkerId());
if(ratio != null){
mallRefundRecord.setRefundAmount(mallRefundRecord.getRefundAmount()
@ -179,24 +193,29 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
refundOrderCacheUtil.put(mallRefundRecord.getLinkId(),mallRefundRecord);
//发送1小时延时MQ:超时未处理则自动同意
orderAsyncProducer.sendRefundDelayMessage(mallRefundRecord.getId(), mallRefundRecord.getOrderId());
sendWorkerAfterSaleSms(mallRefundRecord,order);
}else if(mallRefundRecord.getRefundType() == 3){
// 全额退款
if(mallRefundRecord.getRefundTypeStatus() == 1){
//和商家有关联
mallRefundRecord.setLinkId(mallRefundRecord.getShopId());
mallRefundRecordMapper.insert(mallRefundRecord);
//售后放到缓存
refundOrderCacheUtil.put(mallRefundRecord.getLinkId(),mallRefundRecord);
//发送1小时延时MQ:超时未处理则自动同意
orderAsyncProducer.sendRefundDelayMessage(mallRefundRecord.getId(), mallRefundRecord.getOrderId());
sendShopAfterSaleNotice(order);
}else if(mallRefundRecord.getRefundTypeStatus() == 2){
//和配送员有关联
mallRefundRecord.setLinkId(mallRefundRecord.getWorkerId());
mallRefundRecordMapper.insert(mallRefundRecord);
//售后放到缓存
refundOrderCacheUtil.put(mallRefundRecord.getLinkId(),mallRefundRecord);
//发送1小时延时MQ:超时未处理则自动同意
orderAsyncProducer.sendRefundDelayMessage(mallRefundRecord.getId(), mallRefundRecord.getOrderId());
sendWorkerAfterSaleSms(mallRefundRecord,order);
}else if(mallRefundRecord.getRefundTypeStatus() == 3){
//商家、配送员都加一条
//商家、配送员都加一条,和商家+配送员都有关联
mallRefundRecord.setLinkId(mallRefundRecord.getShopId());
mallRefundRecord.setRefundAmount(mallRefundRecord.getGoodsAmount().add(mallRefundRecord.getPackageFee()));
if(ratio != null){
@ -208,6 +227,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
refundOrderCacheUtil.put(mallRefundRecord.getLinkId(),mallRefundRecord);
//发送1小时延时MQ:超时未处理则自动同意(商家侧)
orderAsyncProducer.sendRefundDelayMessage(mallRefundRecord.getId(), mallRefundRecord.getOrderId());
sendShopAfterSaleNotice(order);
MallRefundRecord mallRefundRecord1 = mallRefundRecord;
mallRefundRecord1.setId(SnowFlakeUtil.nextId().toString());
mallRefundRecord1.setLinkId(mallRefundRecord.getWorkerId());
@ -221,6 +241,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
refundOrderCacheUtil.put(mallRefundRecord1.getLinkId(),mallRefundRecord1);
//发送1小时延时MQ:超时未处理则自动同意(配送员侧)
orderAsyncProducer.sendRefundDelayMessage(mallRefundRecord1.getId(), mallRefundRecord1.getOrderId());
sendWorkerAfterSaleSms(mallRefundRecord1,order);
}
}
if(!mallRefundRecord.getItems().isEmpty()){
@ -264,6 +285,11 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
//处理售后
isTuiKuan = false;
}
MallOrder rejectOrder = null;
if(mallRefundRecord.getStatus() == 2 || mallRefundRecord.getStatus() == 5){
rejectOrder = mallOrderService.getById(mallRefundRecord.getOrderId());
sendRejectSmsIfNeeded(mallRefundRecord, rejectOrder);
}
//更新订单status、 配送单isReturn
if(mallRefundRecord.getRefundTypeStatus() != null && mallRefundRecord.getRefundTypeStatus() == 3){
//商家和配送员都有原因,需要判断另外角色处理了没再判断是否更新订单的状态
@ -337,7 +363,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
}
}else{
//拒绝退款
MallOrder order = mallOrderService.getById(mallRefundRecord.getOrderId());
MallOrder order = rejectOrder != null ? rejectOrder : mallOrderService.getById(mallRefundRecord.getOrderId());
//如果是自取订单,则恢复待消费状态
if(order.getDeliveryType() == DELIVERY_TYPE_SELF){
updateOrderStatusAndReturn(mallRefundRecord.getOrderId(), STATUS_WAIT_PICKUP);
@ -476,7 +502,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
if(isTuiKuan){
//拒绝退款
if(mallRefundRecord.getStatus() == 2){
MallOrder order = mallOrderService.getById(mallRefundRecord.getOrderId());
MallOrder order = rejectOrder;
//如果是自取订单,则恢复待消费状态
if(mallRefundRecord.getDeliveryType() == DELIVERY_TYPE_SELF){
updateOrderStatusAndReturn(mallRefundRecord.getOrderId(), STATUS_WAIT_PICKUP);
@ -677,6 +703,46 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
mallOrderMapper.update(null, uw);
}
private void sendRejectSmsIfNeeded(MallRefundRecord mallRefundRecord, MallOrder order) {
if (mallRefundRecord == null || order == null || (mallRefundRecord.getStatus() != 2 && mallRefundRecord.getStatus() != 5)) {
return;
}
try {
if (order.getReceiverPhone() != null && !"".equals(order.getReceiverPhone())) {
smsUtil.sendCode(order.getReceiverPhone(), null, SettingConstant.SMS_TYPE.SMS_REFUNDUSER.name());
}
} catch (Exception ignored) {
}
}
private void sendShopAfterSaleNotice(MallOrder order) {
if (order == null || order.getShopId() == null) {
return;
}
try {
Shop shop = shopService.findById(order.getShopId());
if (shop != null && shop.getClientId() != null && !"".equals(shop.getClientId())) {
jPushService.sendPushNotification(shop.getClientId(), "您有一笔订单用户申请售后,请尽快处理", order.getId());
}
} catch (Exception ignored) {
}
}
private void sendWorkerAfterSaleSms(MallRefundRecord mallRefundRecord, MallOrder order) {
if (mallRefundRecord == null) {
return;
}
try {
MallDeliveryOrder delivery = order.getOrderType() == STATUS_WAIT_PICKUP
? mallDeliveryOrderMapper.selectByGroupId(mallRefundRecord.getOrderId())
: findDeliveryByOrderId(order.getId());
if (delivery != null && delivery.getWorkerPhone() != null && !"".equals(delivery.getWorkerPhone())) {
smsUtil.sendCode(delivery.getWorkerPhone(), null, SettingConstant.SMS_TYPE.SMS_REFUNDWORKER.name());
}
} catch (Exception ignored) {
}
}
private void updateOrderStatusAndReturn(String orderId, int status) {
LambdaUpdateWrapper<MallOrder> uw = new LambdaUpdateWrapper<>();
uw.eq(MallOrder::getId, orderId).set(MallOrder::getStatus, status);

3
hiver-modules/hiver-mall/src/main/resources/mapper/WorkerRelaPriceMapper.xml

@ -103,6 +103,9 @@
<if test="orderType != null">
AND p.order_type = #{orderType}
</if>
<if test="commissionAmount != null">
AND p.order_bkge &lt;= #{commissionAmount}
</if>
/* 关联配送订单表:LEFT JOIN 保留无任何订单的配送员 */
LEFT JOIN mall_delivery_order d
ON d.worker_id = w.worker_id

Loading…
Cancel
Save