Bladeren bron

add 统一订单状态

tea 7 maanden geleden
bovenliggende
commit
2623007ec6
44 gewijzigde bestanden met toevoegingen van 546 en 285 verwijderingen
  1. 0 37
      kxmall-admin-api/src/main/java/com/kxmall/web/controller/order/service/IKxOrderSnapshotService.java
  2. 3 0
      kxmall-admin-api/src/main/java/com/kxmall/web/controller/order/service/impl/KxStoreOrderServiceImpl.java
  3. 2 1
      kxmall-admin-api/src/main/java/com/kxmall/web/controller/quartz/AutoDispatchQuartz.java
  4. 2 2
      kxmall-admin-api/src/main/java/com/kxmall/web/controller/rider/service/impl/OrderDispatchServiceImpl.java
  5. 1 1
      kxmall-admin-api/src/main/java/com/kxmall/web/controller/rider/service/impl/SmartDispatchServiceImpl.java
  6. 8 8
      kxmall-admin-api/src/main/java/com/kxmall/web/controller/system/service/SysLoginService.java
  7. 1 3
      kxmall-admin/src/main/resources/logback-spring.xml
  8. 45 3
      kxmall-app-api/src/main/java/com/kxmall/web/controller/callback/CallbackController.java
  9. 59 1
      kxmall-app-api/src/main/java/com/kxmall/web/controller/order/builder/OrderConcreteBuilder.java
  10. 10 2
      kxmall-app-api/src/main/java/com/kxmall/web/controller/order/service/impl/KxAppOrderService.java
  11. 2 6
      kxmall-app-api/src/main/java/com/kxmall/web/controller/product/KxAppProductController.java
  12. 3 2
      kxmall-common/src/main/java/com/kxmall/common/core/domain/PrintBean.java
  13. 3 2
      kxmall-common/src/main/java/com/kxmall/common/core/domain/PrintItemBean.java
  14. 34 0
      kxmall-common/src/main/java/com/kxmall/common/enums/OrderSnapshotState.java
  15. 1 1
      kxmall-common/src/main/java/com/kxmall/common/enums/OrderStatusType.java
  16. 5 5
      kxmall-common/src/main/java/com/kxmall/common/enums/RiderOrderStatusType.java
  17. 0 37
      kxmall-common/src/main/java/com/kxmall/common/service/RiderNotificationService.java
  18. 1 0
      kxmall-common/src/main/java/com/kxmall/common/utils/MessageUtils.java
  19. 6 0
      kxmall-common/src/main/java/com/kxmall/common/utils/ObjectUtils.java
  20. 0 1
      kxmall-common/src/main/java/com/kxmall/common/utils/redis/RedisUtils.java
  21. 5 0
      kxmall-framework/src/main/java/com/kxmall/framework/config/JacksonConfig.java
  22. 1 2
      kxmall-framework/src/main/java/com/kxmall/framework/config/RedisConfig.java
  23. 104 0
      kxmall-framework/src/main/java/com/kxmall/framework/config/RedissonSerializer.java
  24. 9 2
      kxmall-framework/src/main/java/com/kxmall/framework/web/exception/GlobalExceptionHandler.java
  25. 26 16
      kxmall-generator/src/test/java/Gen.java
  26. 0 52
      kxmall-rider-api/src/main/java/com/kxmall/web/controller/quartz/CheckRiderQuartz.java
  27. 21 1
      kxmall-rider-api/src/main/java/com/kxmall/web/controller/task/TaskCenterController.java
  28. 12 8
      kxmall-rider-api/src/main/java/com/kxmall/web/controller/task/service/TaskCenterService.java
  29. 130 38
      kxmall-rider-api/src/main/java/com/kxmall/web/controller/task/service/impl/TaskCenterServiceImpl.java
  30. 18 19
      kxmall-system/src/main/java/com/kxmall/order/biz/KxOrderSnapshotService.java
  31. 2 5
      kxmall-system/src/main/java/com/kxmall/order/biz/OrderRiderBizService.java
  32. 2 2
      kxmall-system/src/main/java/com/kxmall/order/biz/sfct/impl/SfCallbackServiceImpl.java
  33. 4 3
      kxmall-system/src/main/java/com/kxmall/order/domain/KxStoreOrder.java
  34. 1 3
      kxmall-system/src/main/java/com/kxmall/order/domain/vo/KxStoreCartVo.java
  35. 3 2
      kxmall-system/src/main/java/com/kxmall/oss/entity/UploadResult.java
  36. 3 3
      kxmall-system/src/main/java/com/kxmall/product/domain/KxStoreProductAttr.java
  37. 3 3
      kxmall-system/src/main/java/com/kxmall/product/domain/KxStoreProductAttrValue.java
  38. 3 3
      kxmall-system/src/main/java/com/kxmall/product/domain/vo/ProductResultVo.java
  39. 2 2
      kxmall-system/src/main/java/com/kxmall/rider/domain/KxRiderOrder.java
  40. 3 2
      kxmall-system/src/main/java/com/kxmall/rider/domain/vo/RiderWalletInfoVo.java
  41. 3 2
      kxmall-system/src/main/java/com/kxmall/sms/entity/SmsResult.java
  42. 3 3
      kxmall-system/src/main/java/com/kxmall/user/domain/KxUserBill.java
  43. 2 1
      kxmall-system/src/main/resources/mapper/order/KxStoreCartMapper.xml
  44. 0 1
      kxmall-system/src/main/resources/mapper/rider/KxOrderRiderRecommendMapper.xml

+ 0 - 37
kxmall-admin-api/src/main/java/com/kxmall/web/controller/order/service/IKxOrderSnapshotService.java

@@ -1,37 +0,0 @@
-package com.kxmall.web.controller.order.service;
-
-import com.kxmall.common.enums.OrderStatusType;
-import com.kxmall.order.domain.vo.KxOrderSnapshotVo;
-import com.kxmall.order.domain.bo.KxOrderSnapshotBo;
-import com.kxmall.common.core.page.TableDataInfo;
-import com.kxmall.common.core.domain.PageQuery;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 订单快照Service接口
- *
- * @author tea
- * @date 2025-01-04
- */
-public interface IKxOrderSnapshotService {
-
-    boolean initOrderSnapshot(KxOrderSnapshotBo bo);
-
-    boolean addOrderSnapshotByOrderStatus(Long orderId, OrderStatusType orderStatus);
-
-    boolean addOrderSnapshotByOrderStatus(Long orderId, OrderStatusType orderStatus, String exceptionReason);
-
-    boolean addOrderSnapshotByOrderStatus(Long orderId, OrderStatusType orderStatus, String exceptionReason, String remark);
-
-    boolean addOrderSnapshotByChangeRider(Long orderId, Long riderId);
-
-    /**
-     * 根据订单号查询快照列表
-     *
-     * @param orderId 订单号
-     * @return 快照列表
-     */
-    List<KxOrderSnapshotVo> queryByOrderId(Long orderId);
-}

+ 3 - 0
kxmall-admin-api/src/main/java/com/kxmall/web/controller/order/service/impl/KxStoreOrderServiceImpl.java

@@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
+import com.kxmall.common.constant.CacheConstants;
 import com.kxmall.common.core.domain.PageQuery;
 import com.kxmall.common.core.page.TableDataInfo;
 import com.kxmall.common.enums.*;
@@ -20,6 +21,7 @@ import com.kxmall.common.exception.ServiceException;
 import com.kxmall.common.helper.LoginHelper;
 import com.kxmall.common.utils.OrderUtil;
 import com.kxmall.common.utils.StringUtils;
+import com.kxmall.common.utils.redis.RedisUtils;
 import com.kxmall.coupon.domain.KxStoreCouponUser;
 import com.kxmall.coupon.mapper.KxStoreCouponUserMapper;
 import com.kxmall.executor.GlobalExecutor;
@@ -738,6 +740,7 @@ public class KxStoreOrderServiceImpl implements IKxStoreOrderService {
         storeAfterSalesStatus.setOperator(LoginHelper.getUsername());
         storeAfterSalesStatusMapper.insert(storeAfterSalesStatus);
 
+        RedisUtils.delCacheMapValue(CacheConstants.WAIT_DISPATCH_ORDERS, kxStoreOrder.getId().toString());
         return true;
     }
 

+ 2 - 1
kxmall-admin-api/src/main/java/com/kxmall/web/controller/quartz/AutoDispatchQuartz.java

@@ -23,7 +23,8 @@ public class AutoDispatchQuartz {
      * 自动扫描等待状态的订单进行智能派单
      * 每3分钟执行一次
      */
-    @Scheduled(cron = "0 */3 * * * ?")
+    // @Scheduled(cron = "0 */3 * * * ?")
+    @Scheduled(fixedDelay = 10000)
     public void autoDispatchWaitingOrders() {
         log.debug("开始执行自动派单定时任务");
         orderDispatchService.scanAndDispatchWaitingOrders();

+ 2 - 2
kxmall-admin-api/src/main/java/com/kxmall/web/controller/rider/service/impl/OrderDispatchServiceImpl.java

@@ -77,7 +77,7 @@ public class OrderDispatchServiceImpl implements IOrderDispatchService {
 
         // 过滤已派过单的
         List<KxOrderRiderRecommend> alreadyDispaycherList = orderRiderRecommendMapper.selectByOrderNo(order.getOrderId());
-        List<Long> alreadyDispaycherRiderIdList = alreadyDispaycherList.stream().map(KxOrderRiderRecommend::getId).collect(Collectors.toList());
+        List<Long> alreadyDispaycherRiderIdList = alreadyDispaycherList.stream().map(KxOrderRiderRecommend::getRiderId).collect(Collectors.toList());
 
         LocalDateTime now = LocalDateTime.now();
         // 保存推荐记录
@@ -108,7 +108,7 @@ public class OrderDispatchServiceImpl implements IOrderDispatchService {
      */
     private SmartDispatchParamBo buildDispatchParam(KxStoreOrderVo order) {
         LambdaQueryWrapper<KxStoreOrderProduct> storeOrderProductLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        storeOrderProductLambdaQueryWrapper.eq(KxStoreOrderProduct::getOrderId, order.getOrderId());
+        storeOrderProductLambdaQueryWrapper.eq(KxStoreOrderProduct::getOrderId, order.getId());
         List<KxStoreOrderProduct> storeOrderProductList = storeOrderProductMapper.selectList(storeOrderProductLambdaQueryWrapper);
         if (CollUtil.isEmpty(storeOrderProductList)) {
             throw new ServiceException("订单商品为空,订单号:" + order.getOrderId());

+ 1 - 1
kxmall-admin-api/src/main/java/com/kxmall/web/controller/rider/service/impl/SmartDispatchServiceImpl.java

@@ -53,7 +53,7 @@ public class SmartDispatchServiceImpl implements ISmartDispatchService {
         // 获取可用的师傅列表
         List<KxRiderVo> availableRiders = getAvailableRiders(dispatchParam);
         if (CollUtil.isEmpty(availableRiders)) {
-            log.warn("没有可用的师傅,orderNo: {}", dispatchParam.getOrderNo());
+            log.info("没有可用的师傅,orderNo: {}", dispatchParam.getOrderNo());
             return new ArrayList<>();
         }
 

+ 8 - 8
kxmall-admin-api/src/main/java/com/kxmall/web/controller/system/service/SysLoginService.java

@@ -8,9 +8,9 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.kxmall.common.constant.CacheConstants;
 import com.kxmall.common.constant.Constants;
-import com.kxmall.common.core.domain.event.LogininforEvent;
 import com.kxmall.common.core.domain.dto.RoleDTO;
 import com.kxmall.common.core.domain.entity.SysUser;
+import com.kxmall.common.core.domain.event.LogininforEvent;
 import com.kxmall.common.core.domain.model.LoginUser;
 import com.kxmall.common.core.domain.model.XcxLoginUser;
 import com.kxmall.common.enums.DeviceType;
@@ -72,7 +72,7 @@ public class SysLoginService {
         boolean captchaEnabled = configService.selectCaptchaEnabled();
         // 验证码开关
         if (captchaEnabled) {
-            validateCaptcha(username, code, uuid, request);
+            validateCaptcha(username, code, uuid);
         }
         SysUser user = loadUserByUsername(username);
         checkLogin(LoginType.PASSWORD, username, () -> !BCrypt.checkpw(password, user.getPassword()));
@@ -116,7 +116,7 @@ public class SysLoginService {
         loginUser.setUserType(user.getUserType());
         loginUser.setOpenid(openid);
         // 生成token
-        //LoginHelper.loginByDevice(loginUser, DeviceType.XCX);
+        // LoginHelper.loginByDevice(loginUser, DeviceType.XCX);
 
         recordLogininfor(user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
         recordLoginInfo(user.getUserId(), user.getUserName());
@@ -171,7 +171,7 @@ public class SysLoginService {
      * @param code     验证码
      * @param uuid     唯一标识
      */
-    public void validateCaptcha(String username, String code, String uuid, HttpServletRequest request) {
+    public void validateCaptcha(String username, String code, String uuid) {
         String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
         String captcha = RedisUtils.getCacheObject(verifyKey);
         RedisUtils.deleteObject(verifyKey);
@@ -187,8 +187,8 @@ public class SysLoginService {
 
     private SysUser loadUserByUsername(String username) {
         SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
-            .select(SysUser::getUserName, SysUser::getStatus)
-            .eq(SysUser::getUserName, username));
+                .select(SysUser::getUserName, SysUser::getStatus)
+                .eq(SysUser::getUserName, username));
         if (ObjectUtil.isNull(user)) {
             log.info("登录用户:{} 不存在.", username);
             throw new UserException("user.not.exists", username);
@@ -201,8 +201,8 @@ public class SysLoginService {
 
     private SysUser loadUserByPhonenumber(String phonenumber) {
         SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
-            .select(SysUser::getPhonenumber, SysUser::getStatus)
-            .eq(SysUser::getPhonenumber, phonenumber));
+                .select(SysUser::getPhonenumber, SysUser::getStatus)
+                .eq(SysUser::getPhonenumber, phonenumber));
         if (ObjectUtil.isNull(user)) {
             log.info("登录用户:{} 不存在.", phonenumber);
             throw new UserException("user.not.exists", phonenumber);

+ 1 - 3
kxmall-admin/src/main/resources/logback-spring.xml

@@ -14,7 +14,7 @@
 
     <!-- 日志格式定义 -->
     <property name="CONSOLE_LOG_PATTERN"
-              value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%-5level) %clr([%15.15thread]){magenta} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
+              value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%-5level) %clr([%15.15thread]){magenta} %clr(%-40.40logger{60}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
     <property name="FILE_LOG_PATTERN"
               value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
 
@@ -57,8 +57,6 @@
         </rollingPolicy>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>debug</level>
-            <onMatch>ACCEPT</onMatch>
-            <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
 

+ 45 - 3
kxmall-app-api/src/main/java/com/kxmall/web/controller/callback/CallbackController.java

@@ -1,6 +1,7 @@
 package com.kxmall.web.controller.callback;
 
 import cn.dev33.satoken.annotation.SaIgnore;
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.ListUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -9,12 +10,16 @@ import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.kxmall.common.constant.CacheConstants;
+import com.kxmall.common.enums.OrderSnapshotState;
 import com.kxmall.common.enums.OrderStatusType;
 import com.kxmall.common.enums.PayMethodEnum;
+import com.kxmall.common.enums.RiderOrderStatusType;
+import com.kxmall.common.utils.ObjectUtils;
 import com.kxmall.common.utils.redis.RedisUtils;
 import com.kxmall.executor.GlobalExecutor;
 import com.kxmall.group.mapper.KxGroupShopMapper;
 import com.kxmall.notify.service.AdminNotifyBizService;
+import com.kxmall.order.biz.KxOrderSnapshotService;
 import com.kxmall.order.biz.OrderBizService;
 import com.kxmall.order.domain.KxStoreOrder;
 import com.kxmall.order.domain.KxStoreOrderProduct;
@@ -23,6 +28,8 @@ import com.kxmall.order.domain.vo.KxStoreOrderVo;
 import com.kxmall.order.mapper.KxStoreOrderProductMapper;
 import com.kxmall.print.AdminPrintBizService;
 import com.kxmall.product.mapper.KxStoreProductMapper;
+import com.kxmall.rider.domain.KxRiderOrder;
+import com.kxmall.rider.mapper.KxRiderOrderMapper;
 import com.kxmall.web.controller.order.service.IKxAppOrderService;
 import com.kxmall.wechat.WxPayConfiguration;
 import org.slf4j.Logger;
@@ -62,6 +69,10 @@ public class CallbackController {
     private AdminNotifyBizService adminNotifyBizService;
     @Autowired
     private AdminPrintBizService adminPrintBizService;
+    @Autowired
+    private KxRiderOrderMapper riderOrderMapper;
+    @Autowired
+    private KxOrderSnapshotService orderSnapshotService;
 
     @RequestMapping("/wxpay")
     @SaIgnore
@@ -138,8 +149,9 @@ public class CallbackController {
             productIds.add(item.getProductId());
         });
 
-
         RedisUtils.setCacheMapValue(CacheConstants.WAIT_DISPATCH_ORDERS, order.getId().toString(), order);
+        addRiderOrder(order);
+        orderSnapshotService.addOrderSnapshotByOrderStatus(order.getId(), OrderSnapshotState.PAYED);
 
         // 通知管理员发货
         GlobalExecutor.execute(() -> {
@@ -154,8 +166,6 @@ public class CallbackController {
     @RequestMapping("/balancePay")
     @Transactional(rollbackFor = Exception.class)
     public Object balancePay(String orderNo) {
-
-
         List<KxStoreOrderVo> KxStoreOrderList = appOrderService.selectListVoByWrapper(
                 new QueryWrapper<KxStoreOrder>()
                         .eq("order_id", orderNo));
@@ -198,6 +208,9 @@ public class CallbackController {
             }
         });
 
+        RedisUtils.setCacheMapValue(CacheConstants.WAIT_DISPATCH_ORDERS, order.getId().toString(), order);
+        addRiderOrder(order);
+
         // 通知管理员发货
         GlobalExecutor.execute(() -> {
             adminNotifyBizService.newOrder(order);
@@ -207,4 +220,33 @@ public class CallbackController {
         return WxPayNotifyResponse.success("支付成功");
     }
 
+
+    private void addRiderOrder(KxStoreOrderVo storeOrder) {
+        KxRiderOrder riderOrder = BeanUtil.toBean(storeOrder, KxRiderOrder.class, ObjectUtils.defaultCopyOptions());
+        riderOrder.setOrderNo(storeOrder.getOrderId());
+
+        riderOrder.setConsignee(storeOrder.getRealName());
+        riderOrder.setAddress(storeOrder.getUserAddress());
+        riderOrder.setPhone(storeOrder.getUserPhone());
+        riderOrder.setLatitude(storeOrder.getLatitude());
+        riderOrder.setLongitude(storeOrder.getLongitude());
+        riderOrder.setPredictTime(storeOrder.getPredictDate());
+
+        riderOrder.setOrderCreateTime(storeOrder.getCreateTime());
+
+        BigDecimal prefer = storeOrder.getTotalPrice().subtract(storeOrder.getPayPrice());
+        riderOrder.setTotalPreferentialPrice(prefer);
+        riderOrder.setTotalPrice(storeOrder.getOriginalTotalPrice());
+        riderOrder.setFreightPrice(storeOrder.getFreightPrice());
+        riderOrder.setPayChannel(storeOrder.getPayChannel());
+        riderOrder.setPredictTime(storeOrder.getPredictDate());
+        riderOrder.setStatus(RiderOrderStatusType.WAITING.getCode());
+        riderOrder.setPayTime(storeOrder.getPayTime());
+
+        Date now = new Date();
+        riderOrder.setCreateTime(now);
+        riderOrder.setUpdateTime(now);
+
+        riderOrderMapper.insert(riderOrder);
+    }
 }

+ 59 - 1
kxmall-app-api/src/main/java/com/kxmall/web/controller/order/builder/OrderConcreteBuilder.java

@@ -1,5 +1,6 @@
 package com.kxmall.web.controller.order.builder;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.NumberUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -20,6 +21,7 @@ import com.kxmall.group.domain.KxGroupShopProduct;
 import com.kxmall.group.domain.vo.KxGroupShopVo;
 import com.kxmall.group.mapper.KxGroupShopMapper;
 import com.kxmall.notify.service.AdminNotifyBizService;
+import com.kxmall.order.biz.KxOrderSnapshotService;
 import com.kxmall.order.domain.KxStoreCart;
 import com.kxmall.order.domain.KxStoreOrder;
 import com.kxmall.order.domain.KxStoreOrderProduct;
@@ -36,6 +38,10 @@ import com.kxmall.orderobserve.OrderUpdater;
 import com.kxmall.print.AdminPrintBizService;
 import com.kxmall.product.domain.vo.KxStoreProductVo;
 import com.kxmall.product.mapper.KxStoreProductMapper;
+import com.kxmall.rider.domain.KxRiderItem;
+import com.kxmall.rider.domain.KxRiderOrder;
+import com.kxmall.rider.mapper.KxRiderItemMapper;
+import com.kxmall.rider.mapper.KxRiderOrderMapper;
 import com.kxmall.seckill.domain.KxStoreSeckill;
 import com.kxmall.seckill.domain.vo.KxStoreSeckillVo;
 import com.kxmall.seckill.mapper.KxStoreSeckillMapper;
@@ -131,6 +137,15 @@ public class OrderConcreteBuilder extends OrderBuilder {
     @Autowired
     private KxStoreSeckillMapper storeSeckillMapper;
 
+    @Autowired
+    private KxRiderOrderMapper riderOrderMapper;
+
+    @Autowired
+    private KxRiderItemMapper riderSpuMapper;
+
+    @Autowired
+    private KxOrderSnapshotService orderSnapshotService;
+
     /**
      * 1.订单初始创建校验部分
      *
@@ -691,7 +706,50 @@ public class OrderConcreteBuilder extends OrderBuilder {
 
     @Override
     public void addOrderToPool(KxStoreOrder orderDO) {
-        RedisUtils.setCacheMapValue(CacheConstants.WAIT_DISPATCH_ORDERS, orderDO.getId().toString(), orderDO);
+        KxRiderOrder riderOrder = BeanUtil.toBean(orderDO, KxRiderOrder.class, com.kxmall.common.utils.ObjectUtils.defaultCopyOptions());
+        riderOrder.setOrderNo(orderDO.getOrderId());
+
+        riderOrder.setConsignee(orderDO.getRealName());
+        riderOrder.setAddress(orderDO.getUserAddress());
+        riderOrder.setPhone(orderDO.getUserPhone());
+        riderOrder.setLatitude(orderDO.getLatitude());
+        riderOrder.setLongitude(orderDO.getLongitude());
+        riderOrder.setPredictTime(orderDO.getPredictDate());
+
+        riderOrder.setOrderCreateTime(orderDO.getCreateTime());
+
+        BigDecimal prefer = orderDO.getTotalPrice().subtract(orderDO.getPayPrice());
+        riderOrder.setTotalPreferentialPrice(prefer);
+        riderOrder.setTotalPrice(orderDO.getOriginalTotalPrice());
+        riderOrder.setFreightPrice(orderDO.getFreightPrice());
+        riderOrder.setPayChannel(orderDO.getPayChannel());
+        riderOrder.setPredictTime(orderDO.getPredictDate());
+        riderOrder.setStatus(RiderOrderStatusType.WAITING.getCode());
+        riderOrder.setPayTime(orderDO.getPayTime());
+        Date now = new Date();
+        riderOrder.setCreateTime(now);
+        riderOrder.setUpdateTime(now);
+        riderOrder.setUserId(orderDO.getUid());
+
+        riderOrderMapper.insert(riderOrder);
+
+        List<KxStoreOrderProduct> orderSkuDoList = orderProductMapper.selectList(new QueryWrapper<KxStoreOrderProduct>().eq("order_id", orderDO.getId()));
+        List<KxRiderItem> items = orderSkuDoList.stream()
+                .map(orderProduct -> {
+                    KxRiderItem item = new KxRiderItem();
+                    item.setRiderOrderId(riderOrder.getId());
+                    item.setSpuName(orderProduct.getProductTitle());
+                    item.setAmount(String.valueOf(orderProduct.getNum().doubleValue()));
+                    item.setPreferentialPrice(orderProduct.getPrice().subtract(orderProduct.getOtPrice()));
+                    item.setUrl(orderProduct.getImg());
+                    item.setUnitPrice(orderProduct.getPrice());
+                    return item;
+                }).collect(Collectors.toList());
+        riderSpuMapper.insertBatch(items);
+
+        orderSnapshotService.addOrderSnapshotByOrderStatus(orderDO.getId(), OrderSnapshotState.PAYED);
+
+        RedisUtils.setCacheMapValue(CacheConstants.WAIT_DISPATCH_ORDERS, orderDO.getId().toString(), BeanUtil.toBean(orderDO, KxStoreOrderVo.class, com.kxmall.common.utils.ObjectUtils.defaultCopyOptions()));
     }
 
 }

+ 10 - 2
kxmall-app-api/src/main/java/com/kxmall/web/controller/order/service/impl/KxAppOrderService.java

@@ -11,6 +11,7 @@ import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.kxmall.address.domain.KxAddress;
 import com.kxmall.address.mapper.KxAddressMapper;
+import com.kxmall.common.constant.CacheConstants;
 import com.kxmall.common.core.domain.model.LoginUser;
 import com.kxmall.common.core.page.TableDataInfo;
 import com.kxmall.common.enums.*;
@@ -21,13 +22,14 @@ import com.kxmall.common.utils.StringUtils;
 import com.kxmall.common.utils.redis.RedisUtils;
 import com.kxmall.group.mapper.KxGroupShopMapper;
 import com.kxmall.order.biz.BillBizService;
+import com.kxmall.order.biz.KxOrderSnapshotService;
 import com.kxmall.order.biz.OrderBizService;
 import com.kxmall.order.domain.KxStoreOrder;
 import com.kxmall.order.domain.KxStoreOrderProduct;
 import com.kxmall.order.domain.bo.DeliveryRequestBo;
+import com.kxmall.order.domain.bo.OrderPriceBo;
 import com.kxmall.order.domain.bo.OrderRequestBo;
 import com.kxmall.order.domain.bo.OrderRequestProductBo;
-import com.kxmall.order.domain.bo.OrderPriceBo;
 import com.kxmall.order.domain.vo.KxStoreOrderProductVo;
 import com.kxmall.order.domain.vo.KxStoreOrderVo;
 import com.kxmall.order.mapper.KxStoreOrderMapper;
@@ -91,6 +93,8 @@ public class KxAppOrderService implements IKxAppOrderService {
 
     private final BillBizService billBizService;
 
+    private final KxOrderSnapshotService orderSnapshotService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Object wxPrepay(String orderId, Long userId, Integer loginType, String openId) {
@@ -180,6 +184,9 @@ public class KxAppOrderService implements IKxAppOrderService {
         updateOrderDO.setStatus(OrderStatusType.CANCELED.getCode());
         updateOrderDO.setUpdateTime(new Date());
         orderBizService.changeOrderStatus(orderId, OrderStatusType.UNPAY.getCode(), updateOrderDO);
+        orderSnapshotService.addOrderSnapshotByOrderStatus(storeOrder.getId(), OrderSnapshotState.CANCELED);
+
+        RedisUtils.delCacheMapValue(CacheConstants.WAIT_DISPATCH_ORDERS, storeOrder.getId().toString());
         return "ok";
     }
 
@@ -395,6 +402,8 @@ public class KxAppOrderService implements IKxAppOrderService {
             orderDTO.setProductList(orderProductVos);
             // adminNotifyBizService.refundOrder(orderDTO);
             //});
+            orderSnapshotService.addOrderSnapshotByOrderStatus(orderDO.getId(), OrderSnapshotState.REFUNDED);
+
             if (PayChannelType.BALANCE.getCode().equals(orderDO.getPayChannel())) {
                 //余额退款
                 balanceRefund(orderDTO);
@@ -403,7 +412,6 @@ public class KxAppOrderService implements IKxAppOrderService {
                 return "ok";
             }
 
-
         }
         throw new ServiceException("订单状态不支持退款");
     }

+ 2 - 6
kxmall-app-api/src/main/java/com/kxmall/web/controller/product/KxAppProductController.java

@@ -21,6 +21,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * app商品管理
@@ -48,7 +49,7 @@ public class KxAppProductController extends BaseAppController {
     public R<KxStoreProductVo> getGoodsByStorage(Long storageId, Long productId, Long groupShopId) {
         Long userId = 0L;
         DeviceType deviceType = LoginHelper.getDeviceType();
-        if (!ObjectUtils.isEmpty(deviceType)) {
+        if (Objects.nonNull(deviceType)) {
             userId = getAppLoginUser().getUserId();
         }
         KxStoreProductVo storage = appProductService.getGoodsByStorage(storageId, productId, userId);
@@ -67,11 +68,6 @@ public class KxAppProductController extends BaseAppController {
     public TableDataInfo<KxStoreProductVo> getRecommend(@RequestParam(defaultValue = "1") Integer page,
                                             @RequestParam(defaultValue = "4") Integer size,
                                             Long storageId) {
-        Long userId = 0L;
-        DeviceType deviceType = LoginHelper.getDeviceType();
-        if (!ObjectUtils.isEmpty(deviceType)) {
-            userId = getAppLoginUser().getUserId();
-        }
         return appProductService.getRecommend(page,size,storageId);
     }
 

+ 3 - 2
kxmall-common/src/main/java/com/kxmall/common/core/domain/PrintBean.java

@@ -1,7 +1,6 @@
 package com.kxmall.common.core.domain;
 
-import lombok.Builder;
-import lombok.Data;
+import lombok.*;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -14,6 +13,8 @@ import java.util.List;
  */
 @Data
 @Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class PrintBean {
 
     private String storageName;

+ 3 - 2
kxmall-common/src/main/java/com/kxmall/common/core/domain/PrintItemBean.java

@@ -1,7 +1,6 @@
 package com.kxmall.common.core.domain;
 
-import lombok.Builder;
-import lombok.Data;
+import lombok.*;
 
 import java.math.BigDecimal;
 
@@ -12,6 +11,8 @@ import java.math.BigDecimal;
  */
 @Data
 @Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class PrintItemBean {
 
     private String name;

+ 34 - 0
kxmall-common/src/main/java/com/kxmall/common/enums/OrderSnapshotState.java

@@ -0,0 +1,34 @@
+package com.kxmall.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ *
+ * @author tea
+ * @date 2025/9/13
+ */
+@Getter
+@AllArgsConstructor
+public enum OrderSnapshotState {
+
+    PAYED(1, "已付款"),
+    WAITING(2, "待接单"),
+    WAIT_BEGIN(3, "已接单"),
+    IN_ROAD(4, "正在路上"),
+    WORKING(5, "服务中"),
+    COMPLETED(6, "已完成"),
+    RIDER_CHANGE(7, "被更改师傅"),
+    REFUNDING(8, "退款中"),
+    REFUNDED(9, "已退款"),
+    CANCELED(10, "已取消"),
+    CANCELED_SYS(11, "已取消(系统)"),
+    ABNORMAL(12, "服务异常"),
+    ;
+
+    private final Integer state;
+    private final String desc;
+
+
+
+}

+ 1 - 1
kxmall-common/src/main/java/com/kxmall/common/enums/OrderStatusType.java

@@ -18,7 +18,7 @@ public enum OrderStatusType {
     /**
      * 已付款(派单中)
      */
-    WAIT_PREPARE_GOODS(14, "等待配货"),
+    WAIT_PREPARE_GOODS(14, "已付款"),
 
     PREPARING_GOODS(16, "配货中"),
 

+ 5 - 5
kxmall-common/src/main/java/com/kxmall/common/enums/RiderOrderStatusType.java

@@ -11,12 +11,12 @@ import lombok.Getter;
 @Getter
 public enum RiderOrderStatusType {
 
-    WAITING(0, "待取货"),
-    DISPENSE(1, "配送中"),
-    TIMEOUT(2, "超时"),
-    ABNORMAL(3, "配送异常"),
+    WAITING(0, "待接单"),
+    IN_ROAD(1, "正在路上"),
+    WORKING(2, "服务中"),
+    ABNORMAL(3, "服务异常"),
     COMPLETED(4, "已完成"),
-    RIDER_CHANGE(5, "被更改分配"),
+    RIDER_CHANGE(5, "被更改师傅"),
     ALLOCATED(6, "已分配"),
     CANCELED(7, "已取消"),
     ;

+ 0 - 37
kxmall-common/src/main/java/com/kxmall/common/service/RiderNotificationService.java

@@ -1,37 +0,0 @@
-package com.kxmall.common.service;
-
-
-/**
- * 骑手通知服务接口
- * 通用模块接口,用于不同模块间的解耦
- * 
- * @author kxmall
- * @date 2025-01-08
- */
-public interface RiderNotificationService {
-
-    /**
-     * 发送新订单通知给推荐的骑手列表
-     * 
-     * @param dispatchParam 派单参数
-     * @param riderIds 推荐的骑手ID列表
-     * @param matchScores 对应的匹配度分数
-     */
-    // void sendNewOrderNotification(SmartDispatchParamBo dispatchParam, List<String> riderIds, List<Double> matchScores);
-
-    /**
-     * 发送订单取消通知
-     * 
-     * @param orderNo 订单号
-     * @param riderId 骑手ID
-     */
-    void sendOrderCancelNotification(String orderNo, String riderId);
-
-    /**
-     * 检查骑手是否在线
-     * 
-     * @param riderId 骑手ID
-     * @return 是否在线
-     */
-    boolean isRiderOnline(String riderId);
-}

+ 1 - 0
kxmall-common/src/main/java/com/kxmall/common/utils/MessageUtils.java

@@ -26,4 +26,5 @@ public class MessageUtils {
     public static String message(String code, Object... args) {
         return MESSAGE_SOURCE.getMessage(code, args, LocaleContextHolder.getLocale());
     }
+
 }

+ 6 - 0
kxmall-common/src/main/java/com/kxmall/common/utils/ObjectUtils.java

@@ -1,5 +1,6 @@
 package com.kxmall.common.utils;
 
+import cn.hutool.core.bean.copier.CopyOptions;
 import cn.hutool.core.util.ObjectUtil;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
@@ -57,4 +58,9 @@ public class ObjectUtils extends ObjectUtil {
         return defaultValue;
     }
 
+    public static CopyOptions defaultCopyOptions() {
+        CopyOptions copyOptions = CopyOptions.create();
+        copyOptions.ignoreError();
+        return copyOptions;
+    }
 }

+ 0 - 1
kxmall-common/src/main/java/com/kxmall/common/utils/redis/RedisUtils.java

@@ -55,7 +55,6 @@ public class RedisUtils {
         return CLIENT.getLock(LOCK_PREFIX + key);
     }
 
-
     /**
      * 发布通道消息
      *

+ 5 - 0
kxmall-framework/src/main/java/com/kxmall/framework/config/JacksonConfig.java

@@ -1,6 +1,7 @@
 package com.kxmall.framework.config;
 
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
@@ -39,6 +40,10 @@ public class JacksonConfig {
             javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
             builder.modules(javaTimeModule);
             builder.timeZone(TimeZone.getDefault());
+            
+            // 配置Builder模式支持 - 禁用无法找到默认构造函数时的失败
+            builder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+            
             log.info("初始化 jackson 配置");
         };
     }

+ 1 - 2
kxmall-framework/src/main/java/com/kxmall/framework/config/RedisConfig.java

@@ -6,7 +6,6 @@ import com.kxmall.framework.config.properties.RedissonProperties;
 import com.kxmall.framework.handler.KeyPrefixHandler;
 import com.kxmall.framework.manager.PlusSpringCacheManager;
 import lombok.extern.slf4j.Slf4j;
-import org.redisson.codec.JsonJacksonCodec;
 import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -37,7 +36,7 @@ public class RedisConfig {
         return config -> {
             config.setThreads(redissonProperties.getThreads())
                 .setNettyThreads(redissonProperties.getNettyThreads())
-                .setCodec(new JsonJacksonCodec(objectMapper));
+                .setCodec(new RedissonSerializer());
             RedissonProperties.SingleServerConfig singleServerConfig = redissonProperties.getSingleServerConfig();
             if (ObjectUtil.isNotNull(singleServerConfig)) {
                 // 使用单机模式

+ 104 - 0
kxmall-framework/src/main/java/com/kxmall/framework/config/RedissonSerializer.java

@@ -0,0 +1,104 @@
+package com.kxmall.framework.config;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.parser.ParserConfig;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufAllocator;
+import io.netty.buffer.ByteBufOutputStream;
+import org.redisson.client.codec.BaseCodec;
+import org.redisson.client.protocol.Decoder;
+import org.redisson.client.protocol.Encoder;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 基于 Fastjson 的 Redisson 序列化器
+ *
+ * @author tea
+ * @date 2025/9/12
+ */
+public class RedissonSerializer extends BaseCodec {
+
+    static {
+        // 启用 AutoType 支持,允许反序列化时根据类型信息创建对象
+        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
+        // 添加受信任的包前缀,提高安全性
+        ParserConfig.getGlobalInstance().addAccept("com.kxmall.");
+    }
+
+    private final Encoder encoder = in -> {
+        ByteBuf out = ByteBufAllocator.DEFAULT.buffer();
+        try (ByteBufOutputStream os = new ByteBufOutputStream(out)) {
+            JSON.writeJSONString(os, in, SerializerFeature.WriteClassName);
+            return os.buffer();
+        } catch (IOException e) {
+            out.release();
+            throw e;
+        } catch (Exception e) {
+            out.release();
+            throw new IOException("Could not encode object of type: " + in.getClass(), e);
+        }
+    };
+    private final Decoder<Object> decoder = (buf, state) -> {
+        if (!buf.isReadable()) {
+            return null;
+        }
+        byte[] bytes = new byte[buf.readableBytes()];
+        buf.readBytes(bytes);
+        return JSON.parseObject(new String(bytes, StandardCharsets.UTF_8), Object.class);
+    };
+    private final Encoder keyEncoder = in -> {
+        ByteBuf out = ByteBufAllocator.DEFAULT.buffer();
+        try (ByteBufOutputStream os = new ByteBufOutputStream(out)) {
+            String str = in.toString();
+            os.write(str.getBytes(StandardCharsets.UTF_8));
+            return os.buffer();
+        } catch (IOException e) {
+            out.release();
+            throw e;
+        } catch (Exception e) {
+            out.release();
+            throw new IOException("Could not encode key: " + in, e);
+        }
+    };
+    private final Decoder<Object> keyDecoder = (buf, state) -> {
+        if (!buf.isReadable()) {
+            return null;
+        }
+        byte[] bytes = new byte[buf.readableBytes()];
+        buf.readBytes(bytes);
+        return new String(bytes, StandardCharsets.UTF_8);
+    };
+
+    @Override
+    public Decoder<Object> getValueDecoder() {
+        return decoder;
+    }
+
+    @Override
+    public Encoder getValueEncoder() {
+        return encoder;
+    }
+
+    @Override
+    public Decoder<Object> getMapValueDecoder() {
+        return decoder;
+    }
+
+    @Override
+    public Encoder getMapValueEncoder() {
+        return encoder;
+    }
+
+    @Override
+    public Decoder<Object> getMapKeyDecoder() {
+        return keyDecoder;
+    }
+
+    @Override
+    public Encoder getMapKeyEncoder() {
+        return keyEncoder;
+    }
+}

+ 9 - 2
kxmall-framework/src/main/java/com/kxmall/framework/web/exception/GlobalExceptionHandler.java

@@ -8,6 +8,7 @@ import cn.hutool.http.HttpStatus;
 import com.kxmall.common.core.domain.R;
 import com.kxmall.common.exception.DemoModeException;
 import com.kxmall.common.exception.ServiceException;
+import com.kxmall.common.exception.base.BaseException;
 import com.kxmall.common.utils.StreamUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.mybatis.spring.MyBatisSystemException;
@@ -102,12 +103,18 @@ public class GlobalExceptionHandler {
      * 业务异常
      */
     @ExceptionHandler(ServiceException.class)
-    public R<Void> handleServiceException(ServiceException e, HttpServletRequest request) {
-        log.error(e.getMessage(), e);
+    public R<Void> handleServiceException(ServiceException e) {
+        log.info(e.getMessage(), e);
         Integer code = e.getCode();
         return ObjectUtil.isNotNull(code) ? R.fail(code, e.getMessage()) : R.fail(e.getMessage());
     }
 
+    @ExceptionHandler(BaseException.class)
+    public R<Void> handleBaseException(BaseException e) {
+        log.info(e.getMessage(), e);
+        return R.fail(e.getMessage());
+    }
+
     /**
      * 拦截未知的运行时异常
      */

+ 26 - 16
kxmall-generator/src/test/java/Gen.java

@@ -1,5 +1,5 @@
-import com.baomidou.mybatisplus.generator.FastAutoGenerator;
-import com.baomidou.mybatisplus.generator.config.OutputFile;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.parser.ParserConfig;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -11,25 +11,35 @@ import java.util.List;
  */
 public class Gen {
 
+    static {
+        // 启用 AutoType 支持,允许反序列化时根据类型信息创建对象
+        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
+        // 添加受信任的包前缀,提高安全性
+        ParserConfig.getGlobalInstance().addAccept("com.kxmall.");
+    }
+
     public static void main(String[] args) {
         String u = "jdbc:mysql://139.224.55.184:3306/kxmall?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true";
         String n = "root";
         String p = "mysql@yudao";
 
-        FastAutoGenerator.create(u, n, p)
-                .globalConfig(builder -> {
-                    builder.author("tea") // 设置作者
-                            .outputDir("D://"); // 指定输出目录
-                })
-                .packageConfig(builder ->
-                        builder
-                                .parent("system")
-                                .pathInfo(Collections.singletonMap(OutputFile.xml, "D://gen")) // 设置mapperXml生成路径
-                )
-                .strategyConfig(builder ->
-                        builder.addInclude("kx_rider_ext").entityBuilder().enableLombok()
-                )
-                .execute();
+        // FastAutoGenerator.create(u, n, p)
+        //         .globalConfig(builder -> {
+        //             builder.author("tea") // 设置作者
+        //                     .outputDir("D://"); // 指定输出目录
+        //         })
+        //         .packageConfig(builder ->
+        //                 builder
+        //                         .parent("system")
+        //                         .pathInfo(Collections.singletonMap(OutputFile.xml, "D://gen")) // 设置mapperXml生成路径
+        //         )
+        //         .strategyConfig(builder ->
+        //                 builder.addInclude("kx_rider_ext").entityBuilder().enableLombok()
+        //         )
+        //         .execute();
+
+        String s = "{\"@type\":\"com.kxmall.order.domain.KxStoreOrder\",\"city\":\"南京市\",\"county\":\"江宁区\",\"createTime\":1757686545896,\"freightPrice\":0,\"gainIntegral\":30.00,\"id\":1966506020988919809,\"isChannel\":\"devtools\",\"latitude\":31.952607,\"longitude\":118.842272,\"orderId\":\"2025092215451001\",\"originalTotalPrice\":7.00,\"params\":{\"@type\":\"java.util.HashMap\"},\"payChannel\":\"BALANCE\",\"payId\":\"0\",\"payPrice\":156.00,\"payTime\":1757686545969,\"predictDate\":1757638800000,\"predictTime\":\"明天09月13日08:00-09:00\",\"province\":\"江苏省\",\"realName\":\"收货人\",\"remark\":\"备注\",\"shippingType\":1,\"status\":14,\"storeId\":11,\"totalPrice\":12.00,\"uid\":1706531205549178881,\"updateTime\":1757686545896,\"urgentFee\":144,\"userAddress\":\"江宁万达中心D座\",\"userPhone\":\"13499998888\"}";
+        System.out.println(JSONObject.parseObject(s, Object.class));
     }
 
     // 处理 all 情况

+ 0 - 52
kxmall-rider-api/src/main/java/com/kxmall/web/controller/quartz/CheckRiderQuartz.java

@@ -1,21 +1,11 @@
 package com.kxmall.web.controller.quartz;
 
-import com.kxmall.common.enums.RiderOrderStatusType;
-import com.kxmall.common.utils.redis.RedisUtils;
-import com.kxmall.order.biz.OrderRiderBizService;
-import com.kxmall.rider.mapper.KxRiderOrderMapper;
 import com.kxmall.web.controller.quartz.service.RiderQuartzService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
-
-import java.util.Date;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Lock;
 
 /**
  * 骑手部分订单定时任务
@@ -26,51 +16,9 @@ import java.util.concurrent.locks.Lock;
 @Slf4j
 public class CheckRiderQuartz {
 
-    private static final String RIDER_ORDER_STATUS_LOCK = "RIDER_ORDER_STATUS_QUARTZ_LOCK";
-
-    @Autowired
-    private KxRiderOrderMapper riderOrderMapper;
-
-    @Autowired
-    private OrderRiderBizService orderRiderBizService;
-
     @Autowired
     private RiderQuartzService riderQuartzService;
 
-
-    /**
-     * 订单状态定时轮训
-     */
-    @Scheduled(cron = "0 * * * * ?")
-    public void checkOrderStatus() {
-        Lock lock = RedisUtils.lock(RIDER_ORDER_STATUS_LOCK);
-        boolean isLocked;
-        try {
-            isLocked = lock.tryLock(20, TimeUnit.SECONDS);
-            if (isLocked) {
-                try {
-                    Date now = new Date();
-                    List<String> nos = riderOrderMapper.selectExpireOrderNos(RiderOrderStatusType.DISPENSE.getCode(), new Date(now.getTime()));
-                    if (!CollectionUtils.isEmpty(nos)) {
-                        nos.forEach(no -> {
-                            try {
-                                orderRiderBizService.sendRiderMessageBusiness(no, RiderOrderStatusType.TIMEOUT, 0L, "");
-                            } catch (Exception e) {
-                                log.error("[订单状态变更异常] 异常", e);
-                            }
-                        });
-                    }
-                } catch (Exception e) {
-                    log.error("[骑手订单状态检测定时任务] 异常", e);
-                } finally {
-                    lock.unlock();
-                }
-            }
-        } catch (InterruptedException e) {
-            log.error(e.getMessage(), e);
-        }
-    }
-
     @Scheduled(cron = "10 0 0 * * ?")
     public void flushRiderExtInfo() {
         riderQuartzService.flushRiderExtInfo();

+ 21 - 1
kxmall-rider-api/src/main/java/com/kxmall/web/controller/task/TaskCenterController.java

@@ -38,6 +38,27 @@ public class TaskCenterController extends BaseRiderController {
         return taskCenterService.list(status, page, limit, riderId);
     }
 
+    /**
+     * 接单
+     *
+     * @return 结果
+     */
+    @GetMapping("/accept")
+    public R<String> accept(Long riderOrderId, BigDecimal lng, BigDecimal lat) {
+        Long riderId = getRiderLoginUser().getUserId();
+        return R.ok("操作成功", taskCenterService.accept(riderOrderId, lng, lat, riderId));
+    }
+
+    /**
+     * 出发
+     *
+     * @return 结果
+     */
+    @GetMapping("/inRoad")
+    public R<String> inRoad(Long riderOrderId, BigDecimal lng, BigDecimal lat) {
+        Long riderId = getRiderLoginUser().getUserId();
+        return R.ok("操作成功", taskCenterService.inRoad(riderOrderId, lng, lat, riderId));
+    }
 
     /**
      * 开始配送
@@ -50,7 +71,6 @@ public class TaskCenterController extends BaseRiderController {
         return R.ok("操作成功", taskCenterService.begin(riderOrderId, lng, lat, riderId));
     }
 
-
     /**
      * 异常配送
      *

+ 12 - 8
kxmall-rider-api/src/main/java/com/kxmall/web/controller/task/service/TaskCenterService.java

@@ -24,7 +24,7 @@ public interface TaskCenterService {
      * @return
      * @
      */
-    public TableDataInfo<KxRiderOrderVo> list(
+    TableDataInfo<KxRiderOrderVo> list(
             Integer status,
             Integer page,
             Integer limit,
@@ -38,7 +38,7 @@ public interface TaskCenterService {
      * @return
      * @
      */
-    public KxRiderOrderVo detail(Long riderOrderId,
+    KxRiderOrderVo detail(Long riderOrderId,
                                  Long riderId);
 
     /**
@@ -51,7 +51,7 @@ public interface TaskCenterService {
      * @return
      * @
      */
-    public String begin(Long riderOrderId,
+    String begin(Long riderOrderId,
                         BigDecimal lng,
                         BigDecimal lat,
                         Long riderId);
@@ -67,7 +67,7 @@ public interface TaskCenterService {
      * @return
      * @
      */
-    public String abnormal(Long riderOrderId,
+    String abnormal(Long riderOrderId,
                            String reason,
                            BigDecimal lng,
                            BigDecimal lat,
@@ -83,7 +83,7 @@ public interface TaskCenterService {
      * @return
      * @
      */
-    public String complete(Long riderOrderId,
+    String complete(Long riderOrderId,
                            BigDecimal lng,
                            BigDecimal lat,
                            Long riderId);
@@ -95,7 +95,7 @@ public interface TaskCenterService {
      * @return
      * @
      */
-    public RiderOrderStatisticalDTO statistical(Long riderId);
+    RiderOrderStatisticalDTO statistical(Long riderId);
 
 
     /**
@@ -107,7 +107,7 @@ public interface TaskCenterService {
      * @return
      * @
      */
-    public TableDataInfo<KxRiderOrderVo> income(Integer pageNum,
+    TableDataInfo<KxRiderOrderVo> income(Integer pageNum,
                                                 Integer limit,
                                                 Long riderId);
 
@@ -119,7 +119,7 @@ public interface TaskCenterService {
      * @return
      * @
      */
-    public BigDecimal countIncome(Long riderId);
+    BigDecimal countIncome(Long riderId);
 
     /**
      * 上报骑手经纬度
@@ -127,4 +127,8 @@ public interface TaskCenterService {
      * @return
      */
     String reportLocation(KxRiderVo riderVo);
+
+    String inRoad(Long riderOrderId, BigDecimal lng, BigDecimal lat, Long riderId);
+
+    String accept(Long riderOrderId, BigDecimal lng, BigDecimal lat, Long riderId);
 }

+ 130 - 38
kxmall-rider-api/src/main/java/com/kxmall/web/controller/task/service/impl/TaskCenterServiceImpl.java

@@ -1,43 +1,34 @@
 package com.kxmall.web.controller.task.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kxmall.common.constant.CacheConstants;
 import com.kxmall.common.core.domain.PageQuery;
 import com.kxmall.common.core.page.TableDataInfo;
-import com.kxmall.common.enums.RiderOrderStatusType;
-import com.kxmall.common.enums.RiderTransactionSource;
-import com.kxmall.common.enums.RiderTransactionType;
-import com.kxmall.common.enums.RiderWorkStateType;
+import com.kxmall.common.enums.*;
 import com.kxmall.common.exception.ServiceException;
 import com.kxmall.common.utils.redis.RedisUtils;
+import com.kxmall.order.biz.KxOrderSnapshotService;
 import com.kxmall.order.biz.OrderRiderBizService;
 import com.kxmall.order.domain.KxOrderScreenshot;
 import com.kxmall.order.mapper.KxOrderScreenshotMapper;
-import com.kxmall.rider.domain.KxRider;
-import com.kxmall.rider.domain.KxRiderItem;
-import com.kxmall.rider.domain.KxRiderOrder;
-import com.kxmall.rider.domain.KxRiderWalletTransaction;
+import com.kxmall.rider.domain.*;
 import com.kxmall.rider.domain.vo.*;
-import com.kxmall.rider.mapper.KxRiderItemMapper;
-import com.kxmall.rider.mapper.KxRiderMapper;
-import com.kxmall.rider.mapper.KxRiderOrderMapper;
-import com.kxmall.rider.mapper.KxRiderWalletTransactionMapper;
+import com.kxmall.rider.mapper.*;
 import com.kxmall.web.controller.task.service.TaskCenterService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.ObjectUtils;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 import java.util.stream.Collectors;
@@ -56,7 +47,7 @@ public class TaskCenterServiceImpl implements TaskCenterService {
     private static final Integer RIDER_ORDER_LOCK_WAITING_TIME = 30;
     private static final String RIDER_ORDER_STATUS_LOCK = "RIDER_ORDER_STATUS_LOCK";
     @Resource
-    OrderRiderBizService orderRiderBizService;
+    private OrderRiderBizService orderRiderBizService;
     @Resource
     private KxRiderItemMapper riderSpuMapper;
     @Resource
@@ -67,12 +58,21 @@ public class TaskCenterServiceImpl implements TaskCenterService {
     private KxRiderWalletTransactionMapper riderWalletTransactionMapper;
     @Resource
     private KxOrderScreenshotMapper kxOrderScreenshotMapper;
+    @Resource
+    private KxOrderRiderRecommendMapper orderRiderRecommendMapper;
+    @Resource
+    private KxOrderSnapshotService orderSnapshotService;
 
     @Override
     public TableDataInfo<KxRiderOrderVo> list(Integer status, Integer page, Integer limit, Long riderId) throws ServiceException {
-        if (ObjectUtils.isEmpty(status)) {
+        if (Objects.isNull(status)) {
             throw new ServiceException("骑手订单状态不存在");
         }
+
+        if (RiderOrderStatusType.WAITING.getCode().equals(status)) {
+            return TableDataInfo.build(getWaitList(riderId, page, limit));
+        }
+
         QueryWrapper<KxRiderOrder> wrapper = new QueryWrapper<>();
         wrapper.eq("status", status);
         wrapper.eq("rider_id", riderId);
@@ -98,8 +98,8 @@ public class TaskCenterServiceImpl implements TaskCenterService {
         }
         QueryWrapper<KxRiderItem> wrapper = new QueryWrapper<>();
         wrapper.eq("rider_order_id", riderOrderId);
-        List<KxRiderItemVo> riderSpuDOS = riderSpuMapper.selectVoList(wrapper);
-        if (riderSpuDOS == null || riderSpuDOS.size() == 0) {
+        List<KxRiderItemVo> riderSpuDOs = riderSpuMapper.selectVoList(wrapper);
+        if (CollUtil.isEmpty(riderSpuDOs)) {
             throw new ServiceException("骑手订单商品不存在!");
         }
         KxRiderOrderVo riderOrderDTO = new KxRiderOrderVo();
@@ -112,7 +112,7 @@ public class TaskCenterServiceImpl implements TaskCenterService {
         riderOrderDTO.setUserImageUrls(imagesMap.get(1));
         riderOrderDTO.setImageUrls(imagesMap.get(2));
 
-        riderOrderDTO.setRiderItemVoList(riderSpuDOS);
+        riderOrderDTO.setRiderItemVoList(riderSpuDOs);
         return riderOrderDTO;
     }
 
@@ -123,23 +123,19 @@ public class TaskCenterServiceImpl implements TaskCenterService {
         if (riderOrderDO == null) {
             throw new ServiceException("配送员订单不存在");
         }
-        if (!((RiderOrderStatusType.WAITING.getCode()).equals(riderOrderDO.getStatus()) || (RiderOrderStatusType.ABNORMAL.getCode()).equals(riderOrderDO.getStatus()))) {
+        if (!((RiderOrderStatusType.IN_ROAD.getCode()).equals(riderOrderDO.getStatus()) || (RiderOrderStatusType.ABNORMAL.getCode()).equals(riderOrderDO.getStatus()))) {
             throw new ServiceException("当前配送员订单状态不能执行该操作");
         }
         String orderNo = riderOrderDO.getOrderNo();
         Lock lock = RedisUtils.lock(RIDER_ORDER_STATUS_LOCK + orderNo);
         try {
             if (lock.tryLock(RIDER_ORDER_LOCK_WAITING_TIME, TimeUnit.SECONDS)) {
-                riderOrderDO.setStatus(RiderOrderStatusType.DISPENSE.getCode());
+                riderOrderDO.setStatus(RiderOrderStatusType.WORKING.getCode());
                 riderOrderDO.setUpdateTime(new Date());
                 if (riderOrderMapper.updateById(riderOrderDO) > 0) {
-                    KxRider kxRider = new KxRider();
-                    kxRider.setId(riderId);
-                    kxRider.setWorkState(RiderWorkStateType.IN_WORK.getCode());
-                    riderMapper.updateById(kxRider);
-                    orderRiderBizService.sendRiderMessageBusiness(riderOrderDO.getOrderNo(), RiderOrderStatusType.DISPENSE, riderOrderDO.getRiderId(), null);
+                    orderSnapshotService.addOrderSnapshotByOrderStatus(riderOrderDO.getId(), OrderSnapshotState.WORKING);
 
-                    RedisUtils.delCacheMapValue(CacheConstants.WAIT_DISPATCH_ORDERS, riderOrderDO.getOrderId().toString());
+                    orderRiderBizService.sendRiderMessageBusiness(riderOrderDO.getOrderNo(), RiderOrderStatusType.WORKING, riderOrderDO.getRiderId(), null);
                     return "ok";
                 }
                 throw new ServiceException("配送员订单状态更新异常,请稍后再试");
@@ -160,7 +156,7 @@ public class TaskCenterServiceImpl implements TaskCenterService {
         if (riderOrderDO == null) {
             throw new ServiceException("配送员订单不存在");
         }
-        if (!((RiderOrderStatusType.DISPENSE.getCode()).equals(riderOrderDO.getStatus()))) {
+        if (!((RiderOrderStatusType.IN_ROAD.getCode()).equals(riderOrderDO.getStatus()))) {
             throw new ServiceException("当前配送员订单状态不能执行该操作");
         }
         String orderNo = riderOrderDO.getOrderNo();
@@ -172,6 +168,7 @@ public class TaskCenterServiceImpl implements TaskCenterService {
                 riderOrderDO.setUpdateTime(new Date());
                 riderOrderDO.setReason(reason);
                 if (riderOrderMapper.updateById(riderOrderDO) > 0) {
+                    orderSnapshotService.addOrderSnapshotByOrderStatus(riderOrderDO.getId(), OrderSnapshotState.ABNORMAL);
                     orderRiderBizService.sendRiderMessageBusiness(riderOrderDO.getOrderNo(), RiderOrderStatusType.ABNORMAL, riderOrderDO.getRiderId(), reason);
                     return "ok";
                 }
@@ -194,8 +191,7 @@ public class TaskCenterServiceImpl implements TaskCenterService {
         if (riderOrderDO == null) {
             throw new ServiceException("配送员订单不存在");
         }
-        if (!((RiderOrderStatusType.DISPENSE.getCode()).equals(riderOrderDO.getStatus())
-                || (RiderOrderStatusType.TIMEOUT.getCode()).equals(riderOrderDO.getStatus())
+        if (!((RiderOrderStatusType.WORKING.getCode()).equals(riderOrderDO.getStatus())
                 || (RiderOrderStatusType.ABNORMAL.getCode()).equals(riderOrderDO.getStatus()))) {
             throw new ServiceException("当前配送员订单状态不能执行该操作");
         }
@@ -208,9 +204,10 @@ public class TaskCenterServiceImpl implements TaskCenterService {
                 riderOrderDO.setFinishTime(new Date());
                 if (riderOrderMapper.updateById(riderOrderDO) > 0) {
                     // 更新骑手钱包余额(如果配送费大于0)
-                    if (riderOrderDO.getFreightPrice() != null && riderOrderDO.getFreightPrice().compareTo(BigDecimal.ZERO) > 0) {
-                        updateRiderWallet(riderOrderDO.getRiderId(), riderOrderDO.getFreightPrice(), riderOrderDO.getOrderNo());
-                    }
+                    // if (riderOrderDO.getFreightPrice() != null && riderOrderDO.getFreightPrice().compareTo(BigDecimal.ZERO) > 0) {
+                    //     updateRiderWallet(riderOrderDO.getRiderId(), riderOrderDO.getFreightPrice(), riderOrderDO.getOrderNo());
+                    // }
+                    orderSnapshotService.addOrderSnapshotByOrderStatus(riderOrderDO.getId(), OrderSnapshotState.COMPLETED);
 
                     KxRider kxRider = new KxRider();
                     kxRider.setId(riderId);
@@ -283,13 +280,13 @@ public class TaskCenterServiceImpl implements TaskCenterService {
                 for (RiderStatisticalDTO riderStatisticalDTO : riderStatisticalDTOList) {
                     if (RiderOrderStatusType.WAITING.getCode().equals(riderStatisticalDTO.getStatus())) {
                         riderOrderStatisticalDTO.setWaitingCount(riderStatisticalDTO.getCount());
-                    } else if (RiderOrderStatusType.TIMEOUT.getCode().equals(riderStatisticalDTO.getStatus())) {
+                    } else if (RiderOrderStatusType.WORKING.getCode().equals(riderStatisticalDTO.getStatus())) {
                         riderOrderStatisticalDTO.setTimeoutCount(riderStatisticalDTO.getCount());
                     } else if (RiderOrderStatusType.ABNORMAL.getCode().equals(riderStatisticalDTO.getStatus())) {
                         riderOrderStatisticalDTO.setAbnormalCount(riderStatisticalDTO.getCount());
                     } else if (RiderOrderStatusType.COMPLETED.getCode().equals(riderStatisticalDTO.getStatus())) {
                         riderOrderStatisticalDTO.setCompletedCount(riderStatisticalDTO.getCount());
-                    } else if (RiderOrderStatusType.DISPENSE.getCode().equals(riderStatisticalDTO.getStatus())) {
+                    } else if (RiderOrderStatusType.IN_ROAD.getCode().equals(riderStatisticalDTO.getStatus())) {
                         riderOrderStatisticalDTO.setDispenseCount(riderStatisticalDTO.getCount());
                     }
                 }
@@ -326,4 +323,99 @@ public class TaskCenterServiceImpl implements TaskCenterService {
         RedisUtils.setCacheObject(String.valueOf(riderVo.getId()), dataSet);
         return "ok";
     }
+
+    private List<KxRiderOrderVo> getWaitList(Long riderId, Integer page, Integer limit) {
+        PageQuery pageQuery = new PageQuery();
+        pageQuery.setPageNum(page - 1);
+        pageQuery.setPageSize(limit);
+
+        LambdaQueryWrapper<KxOrderRiderRecommend> orderRiderRecommendLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        orderRiderRecommendLambdaQueryWrapper.eq(KxOrderRiderRecommend::getRiderId, riderId)
+                .eq(KxOrderRiderRecommend::getStatus, OrderRiderRecommendStatusEnum.WAITING.getStatus());
+
+        List<Long> orderIds = orderRiderRecommendMapper.selectList(orderRiderRecommendLambdaQueryWrapper).stream().map(KxOrderRiderRecommend::getOrderId).collect(Collectors.toList());
+        if (CollUtil.isEmpty(orderIds)) {
+            return ListUtil.empty();
+        }
+
+        LambdaQueryWrapper<KxRiderOrder> riderOrderLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        riderOrderLambdaQueryWrapper.in(KxRiderOrder::getId, orderIds);
+        riderOrderLambdaQueryWrapper.orderByDesc(KxRiderOrder::getPredictTime);
+        IPage<KxRiderOrderVo> kxRiderOrderVoIPage = riderOrderMapper.selectVoPage(pageQuery.build(), riderOrderLambdaQueryWrapper);
+        return kxRiderOrderVoIPage.getRecords();
+    }
+
+    @Override
+    public String inRoad(Long riderOrderId, BigDecimal lng, BigDecimal lat, Long riderId) {
+        KxRiderOrder riderOrderDO = riderOrderMapper.selectById(riderOrderId);
+        if (riderOrderDO == null) {
+            throw new ServiceException("配送员订单不存在");
+        }
+        if (!((RiderOrderStatusType.ALLOCATED.getCode()).equals(riderOrderDO.getStatus()) || (RiderOrderStatusType.ABNORMAL.getCode()).equals(riderOrderDO.getStatus()))) {
+            throw new ServiceException("当前配送员订单状态不能执行该操作");
+        }
+        String orderNo = riderOrderDO.getOrderNo();
+        Lock lock = RedisUtils.lock(RIDER_ORDER_STATUS_LOCK + orderNo);
+        try {
+            if (lock.tryLock(RIDER_ORDER_LOCK_WAITING_TIME, TimeUnit.SECONDS)) {
+                riderOrderDO.setStatus(RiderOrderStatusType.IN_ROAD.getCode());
+                riderOrderDO.setUpdateTime(new Date());
+                if (riderOrderMapper.updateById(riderOrderDO) > 0) {
+                    KxRider kxRider = new KxRider();
+                    kxRider.setId(riderId);
+                    kxRider.setWorkState(RiderWorkStateType.IN_WORK.getCode());
+                    riderMapper.updateById(kxRider);
+
+                    orderRiderBizService.sendRiderMessageBusiness(riderOrderDO.getOrderNo(), RiderOrderStatusType.IN_ROAD, riderOrderDO.getRiderId(), null);
+
+                    orderSnapshotService.addOrderSnapshotByOrderStatus(riderOrderDO.getId(), OrderSnapshotState.IN_ROAD);
+                    return "ok";
+                }
+                throw new ServiceException("配送员订单状态更新异常,请稍后再试");
+            } else {
+                throw new ServiceException("配送订单系统繁忙,请稍后再试~");
+            }
+        } catch (Exception e) {
+            logger.error("[订单配送状态变更] 异常", e);
+            throw new ServiceException("配送订单系统未知异常");
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    @Override
+    public String accept(Long riderOrderId, BigDecimal lng, BigDecimal lat, Long riderId) {
+        KxRiderOrder riderOrderDO = riderOrderMapper.selectById(riderOrderId);
+        if (riderOrderDO == null) {
+            throw new ServiceException("配送员订单不存在");
+        }
+        if (!((RiderOrderStatusType.WAITING.getCode()).equals(riderOrderDO.getStatus()) || (RiderOrderStatusType.ABNORMAL.getCode()).equals(riderOrderDO.getStatus()))) {
+            throw new ServiceException("当前配送员订单状态不能执行该操作");
+        }
+        String orderNo = riderOrderDO.getOrderNo();
+        Lock lock = RedisUtils.lock(RIDER_ORDER_STATUS_LOCK + orderNo);
+        try {
+            if (lock.tryLock(RIDER_ORDER_LOCK_WAITING_TIME, TimeUnit.SECONDS)) {
+                riderOrderDO.setStatus(RiderOrderStatusType.ALLOCATED.getCode());
+                riderOrderDO.setUpdateTime(new Date());
+                if (riderOrderMapper.updateById(riderOrderDO) > 0) {
+                    orderRiderBizService.sendRiderMessageBusiness(riderOrderDO.getOrderNo(), RiderOrderStatusType.ALLOCATED, riderOrderDO.getRiderId(), null);
+
+                    orderRiderRecommendMapper.deleteByOrderNo(orderNo);
+                    RedisUtils.delCacheMapValue(CacheConstants.WAIT_DISPATCH_ORDERS, riderOrderDO.getId().toString());
+
+                    orderSnapshotService.addOrderSnapshotByOrderStatus(riderOrderDO.getId(), OrderSnapshotState.WAIT_BEGIN);
+                    return "ok";
+                }
+                throw new ServiceException("配送员订单状态更新异常,请稍后再试");
+            } else {
+                throw new ServiceException("配送订单系统繁忙,请稍后再试~");
+            }
+        } catch (Exception e) {
+            logger.error("[订单配送状态变更] 异常", e);
+            throw new ServiceException("配送订单系统未知异常");
+        } finally {
+            lock.unlock();
+        }
+    }
 }

+ 18 - 19
kxmall-admin-api/src/main/java/com/kxmall/web/controller/order/service/impl/KxOrderSnapshotServiceImpl.java → kxmall-system/src/main/java/com/kxmall/order/biz/KxOrderSnapshotService.java

@@ -1,57 +1,54 @@
-package com.kxmall.web.controller.order.service.impl;
+package com.kxmall.order.biz;
 
 import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.kxmall.common.enums.OrderStatusType;
+import com.kxmall.common.enums.OrderSnapshotState;
 import com.kxmall.order.domain.KxOrderSnapshot;
 import com.kxmall.order.domain.bo.KxOrderSnapshotBo;
 import com.kxmall.order.domain.vo.KxOrderSnapshotVo;
 import com.kxmall.order.mapper.KxOrderSnapshotMapper;
-import com.kxmall.web.controller.order.service.IKxOrderSnapshotService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.util.List;
 
 /**
- * 订单快照Service接口
  *
  * @author tea
- * @date 2025-01-04
+ * @date 2025/9/13
  */
 @Service
 @RequiredArgsConstructor
-@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
-public class KxOrderSnapshotServiceImpl implements IKxOrderSnapshotService {
+@Transactional(rollbackFor = Exception.class)
+public class KxOrderSnapshotService {
 
     private final KxOrderSnapshotMapper mapper;
 
-    @Override
+
     public boolean initOrderSnapshot(KxOrderSnapshotBo bo) {
         KxOrderSnapshot kxOrderSnapshot = BeanUtil.toBean(bo, KxOrderSnapshot.class);
         return mapper.insert(kxOrderSnapshot) > 0;
     }
 
-    @Override
-    public boolean addOrderSnapshotByOrderStatus(Long orderId, OrderStatusType orderStatus) {
+
+    public boolean addOrderSnapshotByOrderStatus(Long orderId, OrderSnapshotState orderStatus) {
         return addOrderSnapshotByOrderStatus(orderId, orderStatus, null, null);
     }
 
-    @Override
-    public boolean addOrderSnapshotByOrderStatus(Long orderId, OrderStatusType orderStatus, String exceptionReason) {
+
+    public boolean addOrderSnapshotByOrderStatus(Long orderId, OrderSnapshotState orderStatus, String exceptionReason) {
         return addOrderSnapshotByOrderStatus(orderId, orderStatus, exceptionReason, null);
     }
 
-    @Override
-    public boolean addOrderSnapshotByOrderStatus(Long orderId, OrderStatusType orderStatus, String exceptionReason, String remark) {
+
+    public boolean addOrderSnapshotByOrderStatus(Long orderId, OrderSnapshotState orderStatus, String exceptionReason, String remark) {
         KxOrderSnapshot snapshot = convert(orderId, orderStatus, exceptionReason, remark);
         return mapper.insert(snapshot) > 0;
     }
 
-    @Override
+
     public boolean addOrderSnapshotByChangeRider(Long orderId, Long riderId) {
         LambdaQueryWrapper<KxOrderSnapshot> lqw = new LambdaQueryWrapper<>();
         lqw.eq(KxOrderSnapshot::getOrderId, orderId);
@@ -59,12 +56,13 @@ public class KxOrderSnapshotServiceImpl implements IKxOrderSnapshotService {
         KxOrderSnapshot kxOrderSnapshot = mapper.selectOne(lqw);
         kxOrderSnapshot.setId(null);
         kxOrderSnapshot.setRiderId(riderId);
+        kxOrderSnapshot.setOrderStatus(OrderSnapshotState.RIDER_CHANGE.getState());
         kxOrderSnapshot.setSnapshotTime(LocalDateTime.now());
         kxOrderSnapshot.setSnapshotType((byte) 2);
         return mapper.insert(kxOrderSnapshot) > 0;
     }
 
-    @Override
+
     public List<KxOrderSnapshotVo> queryByOrderId(Long orderId) {
         LambdaQueryWrapper<KxOrderSnapshot> lqw = new LambdaQueryWrapper<>();
         lqw.eq(KxOrderSnapshot::getOrderId, orderId);
@@ -72,14 +70,15 @@ public class KxOrderSnapshotServiceImpl implements IKxOrderSnapshotService {
         return BeanUtil.copyToList(mapper.selectList(lqw), KxOrderSnapshotVo.class);
     }
 
-    private KxOrderSnapshot convert(Long orderId, OrderStatusType orderStatus, String exceptionReason, String remark) {
+    private KxOrderSnapshot convert(Long orderId, OrderSnapshotState orderStatus, String exceptionReason, String remark) {
         KxOrderSnapshot kxOrderSnapshot = new KxOrderSnapshot();
         kxOrderSnapshot.setOrderId(orderId);
-        kxOrderSnapshot.setOrderStatus(orderStatus.getCode());
+        kxOrderSnapshot.setOrderStatus(orderStatus.getState());
         kxOrderSnapshot.setExceptionReason(exceptionReason);
         kxOrderSnapshot.setRemark(remark);
         kxOrderSnapshot.setSnapshotTime(LocalDateTime.now());
         kxOrderSnapshot.setSnapshotType((byte) 1);
         return kxOrderSnapshot;
     }
+
 }

+ 2 - 5
kxmall-system/src/main/java/com/kxmall/order/biz/OrderRiderBizService.java

@@ -186,14 +186,11 @@ public class OrderRiderBizService {
         try {
             if (riderMessageBO != null) {
                 switch (Objects.requireNonNull(RiderOrderStatusType.getByCode(riderMessageBO.getOrderRiderStatus()))) {
-                    case DISPENSE:
+                    case IN_ROAD:
                         // 1.订单配送
                         orderBizService.updateOrderStatus(riderMessageBO.getOrderNo(), OrderStatusType.WAIT_CONFIRM.getCode());
                         break;
-                    case TIMEOUT:
-                        // 2.订单配送超时
-                        orderBizService.updateOrderStatus(riderMessageBO.getOrderNo(), OrderStatusType.TIME_OUT.getCode());
-                        riderOrderMapper.updateRiderOrderStatus(riderMessageBO.getOrderNo(), RiderOrderStatusType.TIMEOUT.getCode(), false);
+                    case WORKING:
                         break;
                     case ABNORMAL:
                         // 3.订单配送异常

+ 2 - 2
kxmall-system/src/main/java/com/kxmall/order/biz/sfct/impl/SfCallbackServiceImpl.java

@@ -134,10 +134,10 @@ public class SfCallbackServiceImpl implements SfCallbackService {
                 riderOrder.setStatus(RiderOrderStatusType.WAITING.getCode());
                 break;
             case 12:
-                riderOrder.setStatus(RiderOrderStatusType.DISPENSE.getCode());
+                riderOrder.setStatus(RiderOrderStatusType.IN_ROAD.getCode());
                 break;
             case 15:
-                riderOrder.setStatus(RiderOrderStatusType.DISPENSE.getCode());
+                riderOrder.setStatus(RiderOrderStatusType.IN_ROAD.getCode());
                 break;
             case 17:
                 riderOrder.setStatus(RiderOrderStatusType.COMPLETED.getCode());

+ 4 - 3
kxmall-system/src/main/java/com/kxmall/order/domain/KxStoreOrder.java

@@ -3,9 +3,8 @@ package com.kxmall.order.domain;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kxmall.common.core.domain.BaseEntity;
-import lombok.Builder;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
+import lombok.*;
+import lombok.experimental.Tolerate;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -20,6 +19,8 @@ import java.util.Date;
 @EqualsAndHashCode(callSuper = true)
 @TableName("kx_store_order")
 @Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class KxStoreOrder extends BaseEntity {
 
     private static final long serialVersionUID = 1L;

+ 1 - 3
kxmall-system/src/main/java/com/kxmall/order/domain/vo/KxStoreCartVo.java

@@ -26,9 +26,6 @@ public class KxStoreCartVo {
     @ExcelProperty(value = "")
     private Long id;
 
-
-
-
     /**
      * 购物车id
      */
@@ -71,4 +68,5 @@ public class KxStoreCartVo {
      */
     private Long giveIntegral;
 
+    private String keyword;
 }

+ 3 - 2
kxmall-system/src/main/java/com/kxmall/oss/entity/UploadResult.java

@@ -1,7 +1,6 @@
 package com.kxmall.oss.entity;
 
-import lombok.Builder;
-import lombok.Data;
+import lombok.*;
 
 /**
  * 上传返回体
@@ -10,6 +9,8 @@ import lombok.Data;
  */
 @Data
 @Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class UploadResult {
 
     /**

+ 3 - 3
kxmall-system/src/main/java/com/kxmall/product/domain/KxStoreProductAttr.java

@@ -2,9 +2,7 @@ package com.kxmall.product.domain;
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.kxmall.common.core.domain.BaseEntity;
-import lombok.Builder;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
+import lombok.*;
 
 
 /**
@@ -17,6 +15,8 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = true)
 @TableName("kx_store_product_attr")
 @Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class KxStoreProductAttr extends BaseEntity {
 
     private static final long serialVersionUID = 1L;

+ 3 - 3
kxmall-system/src/main/java/com/kxmall/product/domain/KxStoreProductAttrValue.java

@@ -2,9 +2,7 @@ package com.kxmall.product.domain;
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.kxmall.common.core.domain.BaseEntity;
-import lombok.Builder;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
+import lombok.*;
 
 import java.math.BigDecimal;
 
@@ -18,6 +16,8 @@ import java.math.BigDecimal;
 @EqualsAndHashCode(callSuper = true)
 @TableName("kx_store_product_attr_value")
 @Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class KxStoreProductAttrValue extends BaseEntity {
 
     private static final long serialVersionUID = 1L;

+ 3 - 3
kxmall-system/src/main/java/com/kxmall/product/domain/vo/ProductResultVo.java

@@ -1,13 +1,13 @@
 package com.kxmall.product.domain.vo;
 
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Setter;
+import lombok.*;
 
 
 @Getter
 @Setter
 @Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class ProductResultVo {
     private Double minPrice;
 

+ 2 - 2
kxmall-system/src/main/java/com/kxmall/rider/domain/KxRiderOrder.java

@@ -28,8 +28,8 @@ public class KxRiderOrder implements Serializable {
     /**
      * 配送状态
      *     WAITING(0, "待取货"),
-     *     DISPENSE(1, "配送中"),
-     *     TIMEOUT(2, "超时"),
+     *     IN_ROAD(1, "配送中"),
+     *     WORKING(2, "超时"),
      *     ABNORMAL(3, "配送异常"),
      *     COMPLETED(4, "已完成"),
      *     RIDER_CHANGE(5, "被更改分配");

+ 3 - 2
kxmall-system/src/main/java/com/kxmall/rider/domain/vo/RiderWalletInfoVo.java

@@ -1,12 +1,13 @@
 package com.kxmall.rider.domain.vo;
 
-import lombok.Builder;
-import lombok.Data;
+import lombok.*;
 
 import java.math.BigDecimal;
 
 @Data
 @Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class RiderWalletInfoVo {
 
     /**

+ 3 - 2
kxmall-system/src/main/java/com/kxmall/sms/entity/SmsResult.java

@@ -1,7 +1,6 @@
 package com.kxmall.sms.entity;
 
-import lombok.Builder;
-import lombok.Data;
+import lombok.*;
 
 /**
  * 上传返回体
@@ -10,6 +9,8 @@ import lombok.Data;
  */
 @Data
 @Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class SmsResult {
 
     /**

+ 3 - 3
kxmall-system/src/main/java/com/kxmall/user/domain/KxUserBill.java

@@ -2,9 +2,7 @@ package com.kxmall.user.domain;
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.kxmall.common.core.domain.BaseEntity;
-import lombok.Builder;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
+import lombok.*;
 
 import java.math.BigDecimal;
 
@@ -18,6 +16,8 @@ import java.math.BigDecimal;
 @EqualsAndHashCode(callSuper = true)
 @TableName("kx_user_bill")
 @Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class KxUserBill extends BaseEntity {
 
     private static final long serialVersionUID = 1L;

+ 2 - 1
kxmall-system/src/main/resources/mapper/order/KxStoreCartMapper.xml

@@ -33,7 +33,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             p.cate_id AS cateId,
             p.is_integral AS isIntegral,
             p.integral AS integral,
-            p.give_integral AS giveIntegral
+            p.give_integral AS giveIntegral,
+            p.keyword as keyword
         FROM
             kx_store_cart AS c
                 left join kx_store_product  p on p.id = c.product_id

+ 0 - 1
kxmall-system/src/main/resources/mapper/rider/KxOrderRiderRecommendMapper.xml

@@ -23,7 +23,6 @@
     <select id="selectByOrderNo" parameterType="String" resultMap="KxOrderRiderRecommendResult">
         <include refid="selectKxOrderRiderRecommendVo"/>
         where order_no = #{orderNo}
-        order by recommend_order asc
     </select>
 
     <delete id="deleteByOrderNo" parameterType="String">