| Pass |
- 16:41:06 |
+ 17:45:43 |
Test passed
|
@@ -128,13 +128,13 @@
Started
-
ÁùÔÂ 21, 2026 16:41:05
+
ÁùÔÂ 22, 2026 17:45:41
Ended
-
ÁùÔÂ 21, 2026 16:41:06
+
ÁùÔÂ 22, 2026 17:45:43
diff --git a/hiver-core/src/main/java/cc/hiver/core/common/constant/SettingConstant.java b/hiver-core/src/main/java/cc/hiver/core/common/constant/SettingConstant.java
index 052a47f2..1c20eaf6 100644
--- a/hiver-core/src/main/java/cc/hiver/core/common/constant/SettingConstant.java
+++ b/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
}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java
index 36b6e6e4..683bf819 100644
--- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java
+++ b/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> 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 emptyPage = new Page<>(pageNum, pageSize);
+ emptyPage.setRecords(Collections.emptyList());
+ emptyPage.setTotal(0);
+ return new ResultUtil>().setData(emptyPage);
+ }
// ============ 1. 从缓å˜èŽ·å–当å‰åŒºåŸŸæ‰€æœ‰åœ¨çº¿é…é€å‘˜ ============
List 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(),
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/WorkerRelaPriceMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/WorkerRelaPriceMapper.java
index 5f6199a3..d1b3f7b3 100644
--- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/WorkerRelaPriceMapper.java
+++ b/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 {
@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,
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncProducer.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncProducer.java
index 6ee09e2b..5f84054a 100644
--- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncProducer.java
+++ b/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 extraParams) {
Map msgBody = new HashMap<>();
+ if (extraParams != null) {
+ msgBody.putAll(extraParams);
+ }
msgBody.put("orderId", orderId);
msgBody.put("delayType", delayType);
msgBody.put("timestamp", System.currentTimeMillis());
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderDelayConsumer.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderDelayConsumer.java
index 61a1a084..0b93d7f4 100644
--- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderDelayConsumer.java
+++ b/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 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())) {
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java
index 1c9d324b..5652332c 100644
--- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java
@@ -1106,9 +1106,31 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl uw = new LambdaUpdateWrapper<>();
uw.eq(MallDeliveryOrder::getId, deliveryId)
@@ -1133,10 +1156,51 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl 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);
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java
index 028d1737..2cc45588 100644
--- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java
+++ b/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 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);
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
index 030b1162..643e80fb 100644
--- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
@@ -603,11 +603,13 @@ public class MallOrderServiceImpl extends ServiceImpl 跳过待商家接å•,直接进入待é…逿ˆ–待消费
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 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 改为待æˆå›¢
- 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 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 uw = new LambdaUpdateWrapper<>();
uw.eq(MallOrder::getId, orderId).set(MallOrder::getStatus, status);
+ if (payTime != null) {
+ uw.set(MallOrder::getPayTime, payTime);
+ }
this.update(uw);
}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java
index 07a1b420..6c88af6a 100644
--- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java
+++ b/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 uw = new LambdaUpdateWrapper<>();
uw.eq(MallOrder::getId, orderId).set(MallOrder::getStatus, status);
diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/WorkerRelaPriceMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/WorkerRelaPriceMapper.xml
index 623fee08..c7d25817 100644
--- a/hiver-modules/hiver-mall/src/main/resources/mapper/WorkerRelaPriceMapper.xml
+++ b/hiver-modules/hiver-mall/src/main/resources/mapper/WorkerRelaPriceMapper.xml
@@ -103,6 +103,9 @@
AND p.order_type = #{orderType}
+
+ AND p.order_bkge <= #{commissionAmount}
+
/* å…³è”é…é€è®¢å•表:LEFT JOIN ä¿ç•™æ— 任何订å•çš„é…é€å‘˜ */
LEFT JOIN mall_delivery_order d
ON d.worker_id = w.worker_id