ソースを参照

add 订单添加时间快照

tea 1 ヶ月 前
コミット
fbab94deb5

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

@@ -0,0 +1,37 @@
+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);
+}

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

@@ -0,0 +1,85 @@
+package com.kxmall.web.controller.order.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.kxmall.common.enums.OrderStatusType;
+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
+ */
+@Service
+@RequiredArgsConstructor
+@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
+public class KxOrderSnapshotServiceImpl implements IKxOrderSnapshotService {
+
+    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) {
+        return addOrderSnapshotByOrderStatus(orderId, orderStatus, null, null);
+    }
+
+    @Override
+    public boolean addOrderSnapshotByOrderStatus(Long orderId, OrderStatusType orderStatus, String exceptionReason) {
+        return addOrderSnapshotByOrderStatus(orderId, orderStatus, exceptionReason, null);
+    }
+
+    @Override
+    public boolean addOrderSnapshotByOrderStatus(Long orderId, OrderStatusType 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);
+        lqw.orderByDesc(KxOrderSnapshot::getSnapshotTime);
+        KxOrderSnapshot kxOrderSnapshot = mapper.selectOne(lqw);
+        kxOrderSnapshot.setId(null);
+        kxOrderSnapshot.setRiderId(riderId);
+        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);
+        lqw.orderByDesc(KxOrderSnapshot::getSnapshotTime);
+        return BeanUtil.copyToList(mapper.selectList(lqw), KxOrderSnapshotVo.class);
+    }
+
+    private KxOrderSnapshot convert(Long orderId, OrderStatusType orderStatus, String exceptionReason, String remark) {
+        KxOrderSnapshot kxOrderSnapshot = new KxOrderSnapshot();
+        kxOrderSnapshot.setOrderId(orderId);
+        kxOrderSnapshot.setOrderStatus(orderStatus.getCode());
+        kxOrderSnapshot.setExceptionReason(exceptionReason);
+        kxOrderSnapshot.setRemark(remark);
+        kxOrderSnapshot.setSnapshotTime(LocalDateTime.now());
+        kxOrderSnapshot.setSnapshotType((byte) 1);
+        return kxOrderSnapshot;
+    }
+}

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

@@ -126,7 +126,9 @@ public class KxRiderServiceImpl implements IKxRiderService {
         lqw.eq(bo.getWorkState() != null, KxRider::getWorkState, bo.getWorkState());
         lqw.eq(StringUtils.isNotBlank(bo.getPassword()), KxRider::getPassword, bo.getPassword());
         lqw.eq(bo.getStorageId() != null, KxRider::getStorageId, bo.getStorageId());
-        lqw.eq(bo.getDeliveryRadius() != null, KxRider::getDeliveryRadius, bo.getDeliveryRadius());
+        lqw.eq(bo.getWorkRadio() != null, KxRider::getWorkRadio, bo.getWorkRadio());
+        lqw.eq(bo.getLevel() != null, KxRider::getLevel, bo.getLevel());
+        lqw.like(StringUtils.isNotBlank(bo.getWorkTypeKeywords()), KxRider::getWorkTypeKeywords, bo.getWorkTypeKeywords());
         lqw.in(!CollectionUtils.isEmpty(bo.getStorageIds()), KxRider::getStorageId, bo.getStorageIds());
         return lqw;
     }

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

@@ -1,32 +1,71 @@
 package com.kxmall.common.enums;
 
+import lombok.Getter;
+
 /**
  * Created by admin on 2019/2/13.
  */
+@Getter
 public enum OrderStatusType {
+
+    /**
+     * 订单创建
+     */
     UNPAY(10, "未付款"),
+
     GROUP_SHOP_WAIT(12,"等待团购活动结束"),
 
+    /**
+     * 已付款(派单中)
+     */
     WAIT_PREPARE_GOODS(14, "等待配货"),
 
     PREPARING_GOODS(16, "配货中"),
 
+    /**
+     * 已接单
+     */
     WAIT_STOCK(20, "待出库"),
 
+    /**
+     * 已到达(开始服务)
+     */
     WAIT_CONFIRM(30, "待收货"),
 
     TRANS_ABNORMAL(32, "配送异常"),
 
     TIME_OUT(34, "配送超时"),
 
+    /**
+     * 完成服务
+     */
+    SERVICE_END(40, "结束服务"),
+
     /**
      * 前台显示待评价的单子在商户后台的显示状态当中表示已完成
      */
     WAIT_APPRAISE(40, "待评价"),
+
+    /**
+     * 已评价
+     */
     COMPLETE(50, "已完成"),
+
+    /**
+     * 退款中
+     */
     REFUNDING(60, "退款中"),
+
+    /**
+     * 已退款
+     */
     REFUNDED(70, "已退款"),
+
+    /**
+     * 已取消
+     */
     CANCELED(80, "已取消"),
+
     CANCELED_SYS(90, "已取消(系统)");
 
     OrderStatusType(int code, String msg) {
@@ -34,29 +73,17 @@ public enum OrderStatusType {
         this.msg = msg;
     }
 
-    private int code;
-
-    private String msg;
+    private final int code;
 
-    public int getCode() {
-        return code;
-    }
-
-    public String getMsg() {
-        return msg;
-    }
+    private final String msg;
 
 
     /**
      * 判断定订单是否可退款
      * @return
      */
-    public static boolean refundable(int orderStauts) {
-        if (orderStauts >= WAIT_PREPARE_GOODS.getCode() && orderStauts <= WAIT_STOCK.getCode()) {
-            return true;
-        } else {
-            return false;
-        }
+    public static boolean refundable(int orderStatus) {
+        return orderStatus >= WAIT_PREPARE_GOODS.getCode() && orderStatus <= WAIT_STOCK.getCode();
     }
 
 }

+ 1 - 1
kxmall-generator/src/test/java/Gen.java

@@ -27,7 +27,7 @@ public class Gen {
                                 .pathInfo(Collections.singletonMap(OutputFile.xml, "D://gen")) // 设置mapperXml生成路径
                 )
                 .strategyConfig(builder ->
-                        builder.addInclude("kx_rider_auth_attachment").entityBuilder().enableLombok()
+                        builder.addInclude("kx_order_snapshot").entityBuilder().enableLombok()
                 )
                 .execute();
     }

+ 66 - 0
kxmall-system/src/main/java/com/kxmall/order/domain/KxOrderSnapshot.java

@@ -0,0 +1,66 @@
+package com.kxmall.order.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 订单快照时间表
+ * </p>
+ *
+ * @author tea
+ * @since 2025-09-04
+ */
+@Getter
+@Setter
+@TableName("kx_order_snapshot")
+public class KxOrderSnapshot implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 快照ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 订单号
+     */
+    private Long orderId;
+
+    /**
+     * 订单状态
+     */
+    private Integer orderStatus;
+
+    /**
+     * 师傅id
+     */
+    private Long riderId;
+
+    /**
+     * 异常原因
+     */
+    private String exceptionReason;
+
+    /**
+     * 快照时间
+     */
+    private LocalDateTime snapshotTime;
+
+    /**
+     * 快照类型(1:状态变更, 2:更换师傅)
+     */
+    private Byte snapshotType;
+
+    /**
+     * 快照备注
+     */
+    private String remark;
+}

+ 61 - 0
kxmall-system/src/main/java/com/kxmall/order/domain/bo/KxOrderSnapshotBo.java

@@ -0,0 +1,61 @@
+package com.kxmall.order.domain.bo;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.kxmall.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+/**
+ * 订单快照业务对象 kx_order_snapshot
+ *
+ * @author tea
+ * @date 2025-01-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class KxOrderSnapshotBo extends BaseEntity {
+
+    private static final long serialVersionUID = 1311460339680961477L;
+    /**
+     * 快照ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 订单号
+     */
+    private Long orderId;
+
+    /**
+     * 订单状态
+     */
+    private Integer orderStatus;
+
+    /**
+     * 师傅id
+     */
+    private Long riderId;
+
+    /**
+     * 异常原因
+     */
+    private String exceptionReason;
+
+    /**
+     * 快照时间
+     */
+    private LocalDateTime snapshotTime;
+
+    /**
+     * 快照类型(1:状态变更, 2:更换师傅)
+     */
+    private Byte snapshotType;
+
+    /**
+     * 快照备注
+     */
+    private String remark;
+}

+ 80 - 0
kxmall-system/src/main/java/com/kxmall/order/domain/vo/KxOrderSnapshotVo.java

@@ -0,0 +1,80 @@
+package com.kxmall.order.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 订单快照视图对象 kx_order_snapshot
+ *
+ * @author tea
+ * @date 2025-01-04
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class KxOrderSnapshotVo {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 快照ID
+     */
+    @ExcelProperty(value = "快照ID")
+    private Long id;
+
+    /**
+     * 订单号
+     */
+    @ExcelProperty(value = "订单号")
+    private String orderId;
+
+    /**
+     * 订单状态
+     */
+    @ExcelProperty(value = "订单状态")
+    private Boolean orderStatus;
+
+    /**
+     * 师傅id
+     */
+    @ExcelProperty(value = "师傅id")
+    private Long riderId;
+
+    /**
+     * 异常原因
+     */
+    @ExcelProperty(value = "异常原因")
+    private String exceptionReason;
+
+    /**
+     * 快照时间
+     */
+    @ExcelProperty(value = "快照时间")
+    private LocalDateTime snapshotTime;
+
+    /**
+     * 快照类型(1:状态变更, 2:更换师傅)
+     */
+    @ExcelProperty(value = "快照类型")
+    private Boolean snapshotType;
+
+    /**
+     * 快照备注
+     */
+    @ExcelProperty(value = "快照备注")
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    @ExcelProperty(value = "更新时间")
+    private LocalDateTime updateTime;
+}

+ 16 - 0
kxmall-system/src/main/java/com/kxmall/order/mapper/KxOrderSnapshotMapper.java

@@ -0,0 +1,16 @@
+package com.kxmall.order.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kxmall.order.domain.KxOrderSnapshot;
+
+/**
+ * <p>
+ * 订单快照时间表 Mapper 接口
+ * </p>
+ *
+ * @author tea
+ * @since 2025-09-04
+ */
+public interface KxOrderSnapshotMapper extends BaseMapper<KxOrderSnapshot> {
+
+}

+ 0 - 5
kxmall-system/src/main/java/com/kxmall/rider/domain/KxRider.java

@@ -79,11 +79,6 @@ public class KxRider extends BaseEntity {
      * 所属仓库
      */
     private Long storageId;
-    /**
-     * 配送范围
-     */
-    private Long deliveryRadius;
-
 
     private String gzhOpenId;
 

+ 16 - 3
kxmall-system/src/main/java/com/kxmall/rider/domain/bo/KxRiderBo.java

@@ -7,12 +7,11 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import javax.validation.constraints.*;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
-
 /**
  * 配送业务对象 kx_rider
  *
@@ -24,6 +23,8 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 @EqualsAndHashCode(callSuper = true)
 public class KxRiderBo extends BaseEntity {
 
+    private static final long serialVersionUID = 3276269818039858420L;
+
     /**
      * 配送员主键ID
      */
@@ -103,7 +104,7 @@ public class KxRiderBo extends BaseEntity {
     /**
      * 配送范围
      */
-    private Long deliveryRadius;
+    private BigDecimal workRadio;
 
 
     private List<Long> weekNumberIds;
@@ -119,4 +120,16 @@ public class KxRiderBo extends BaseEntity {
      * 骑手附件列表
      */
     private List<KxRiderAuthAttachment> attachments;
+
+    /**
+     * 骑手等级
+     */
+    private Byte level;
+
+    /**
+     * 擅长类型关键词
+     */
+    private String workTypeKeywords;
+
+    private String idCardNumber;
 }

+ 15 - 1
kxmall-system/src/main/java/com/kxmall/rider/domain/vo/KxRiderVo.java

@@ -110,7 +110,7 @@ public class KxRiderVo {
      * 配送范围
      */
     @ExcelProperty(value = "配送范围")
-    private Long deliveryRadius;
+    private BigDecimal workRadio;
 
     private Date createTime;
 
@@ -139,4 +139,18 @@ public class KxRiderVo {
      * 骑手附件列表
      */
     private List<KxRiderAuthAttachment> attachments;
+
+    /**
+     * 骑手等级
+     */
+    @ExcelProperty(value = "骑手等级")
+    private Byte level;
+
+    /**
+     * 擅长类型关键词
+     */
+    @ExcelProperty(value = "擅长类型")
+    private String workTypeKeywords;
+
+    private String idCardNumber;
 }

+ 2 - 2
需求列表.md

@@ -7,8 +7,8 @@
 - [ ] 商品分类 查询条件(按销量、价格、评分筛选)
 
 # 商品下单
-- [ ] 订单选择时间,可上传照片
-- [ ] 订单添加到达时间
+- [x] 订单选择时间,可上传照片
+- [x] 订单添加到达时间
 - [ ] 订单可添加费用
 
 # 订单互动