Browse Source

分车修改

jinch 1 week ago
parent
commit
a7c092822f

+ 8 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/orderjzdetail/OrderJzDetailController.java

@@ -228,11 +228,12 @@ public class OrderJzDetailController {
       vo.setRemark(detail.getRemark());
       vo.setSignTime(detail.getSignTime());
       vo.setDispatchNo(detail.getDispatchNo());
-      vo.setBusNumber(detail.getBusNumber());
+        vo.setBusNumber(detail.getBusNumber());
         vo.setDriverName(detail.getDriverName());
         vo.setDriverPhone(detail.getDriverPhone());
         vo.setReceiverName(detail.getReceiverName());
         vo.setReceiverPhone(detail.getReceiverPhone());
+        vo.setDispatchRemark(detail.getDispatchRemark());
       vo.setReservationInfo(detail.getRemark());
 
       // 站点字典转义
@@ -334,6 +335,11 @@ public class OrderJzDetailController {
   @Operation(summary = "批量保存订单分车(有dispatchId更新,无则新建)")
   @PreAuthorize("@ss.hasPermission('trade:order-jz-detail:dispatch')")
   public CommonResult<Boolean> batchSaveOrderJzDispatch(@Valid @RequestBody OrderJzDispatchBatchReqVO batchReqVO) {
+    // 校验分车记录是否重复:按分车号+航次ID(有组团号则加上组团号)条件查询
+    String duplicateMsg = orderJzDispatchService.checkDispatchDuplicate(batchReqVO.getDispatchInfo());
+    if (duplicateMsg != null) {
+      return CommonResult.error(500, duplicateMsg);
+    }
     orderJzDispatchService.batchSaveOrderJzDispatch(batchReqVO);
     return success(true);
   }
@@ -397,6 +403,7 @@ public class OrderJzDetailController {
         vo.setDriverPhone(detail.getDriverPhone());
         vo.setReceiverName(detail.getReceiverName());
         vo.setReceiverPhone(detail.getReceiverPhone());
+        vo.setDispatchRemark(detail.getDispatchRemark());
       vo.setReservationInfo(detail.getRemark());
 
       // 站点字典转义

+ 3 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/orderjzdetail/vo/OrderJzDetailExportVO.java

@@ -53,8 +53,10 @@ public class OrderJzDetailExportVO {
     @ExcelProperty(value = "接站人电话", index = 14)
     private String receiverPhone;
 
+    @ExcelProperty(value = "分车情况", index = 15)
+    private String dispatchRemark;
 
-    @ExcelProperty(value = "预约情况", index = 15)
+    @ExcelProperty(value = "预约情况", index = 16)
     private String reservationInfo;
 
 }

+ 18 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/orderjzdetail/vo/OrderJzDetailRespVO.java

@@ -75,4 +75,22 @@ public class OrderJzDetailRespVO {
     @Schema(description = "分车号")
     private String dispatchNo;
 
+    @Schema(description = "车牌号")
+    private String busNumber;
+
+    @Schema(description = "司机姓名")
+    private String driverName;
+
+    @Schema(description = "司机电话")
+    private String driverPhone;
+
+    @Schema(description = "接站姓名")
+    private String receiverName;
+
+    @Schema(description = "接站联系电话")
+    private String receiverPhone;
+
+    @Schema(description = "分车备注")
+    private String dispatchRemark;
+
 }

+ 5 - 2
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/orderjzdetail/vo/OrderJzDispatchBatchReqVO.java

@@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.util.List;
@@ -43,10 +44,12 @@ public class OrderJzDispatchBatchReqVO {
         @NotNull(message = "航次ID不能为空")
         private Long voyageId;
 
-        @Schema(description = "分车号", example = "1号车")
+        @Schema(description = "分车号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1号车")
+        @NotBlank(message = "分车号不能为空")
         private String dispatchNo;
 
-        @Schema(description = "分车组团号", example = "T2024010001")
+        @Schema(description = "分车组团号", requiredMode = Schema.RequiredMode.REQUIRED, example = "T2024010001")
+        @NotBlank(message = "分车组团号不能为空")
         private String groupNo;
 
         @Schema(description = "车牌号", example = "川A12345")

+ 6 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/orderjzdetail/OrderJzDetailDO.java

@@ -137,4 +137,10 @@ public class OrderJzDetailDO extends BaseDO {
     @TableField(exist = false)
     private String receiverPhone;
 
+    /**
+     * 分车备注(关联查询,非表字段)
+     */
+    @TableField(exist = false)
+    private String dispatchRemark;
+
 }

+ 10 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/orderjzdetail/OrderJzDispatchService.java

@@ -76,5 +76,15 @@ public interface OrderJzDispatchService {
      */
     void updateDispatchRecord(@Valid OrderJzDispatchSaveReqVO updateReqVO);
 
+    /**
+     * 校验分车记录是否重复
+     * 根据分车号+航次ID(有组团号则加上组团号)查询已有记录,
+     * 如果已有记录的车辆信息与本次不一致,则返回提示信息
+     *
+     * @param dispatchInfo 分车信息
+     * @return 重复提示信息,null表示不重复
+     */
+    String checkDispatchDuplicate(OrderJzDispatchBatchReqVO.DispatchInfo dispatchInfo);
+
 
 }

+ 99 - 31
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/orderjzdetail/OrderJzDispatchServiceImpl.java

@@ -2,6 +2,7 @@ package com.yc.ship.module.trade.service.orderjzdetail;
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.module.trade.controller.admin.orderjzdetail.vo.OrderJzDispatchBatchReqVO;
@@ -73,33 +74,63 @@ public class OrderJzDispatchServiceImpl implements OrderJzDispatchService {
     @Transactional(rollbackFor = Exception.class)
     public void batchSaveOrderJzDispatch(@Valid OrderJzDispatchBatchReqVO batchReqVO) {
         OrderJzDispatchBatchReqVO.DispatchInfo info = batchReqVO.getDispatchInfo();
-        // 无分车记录 -> 新建
-        OrderJzDispatchDO orderJzDispatch = OrderJzDispatchDO.builder()
-                .dispatchTime(LocalDateTime.now())
-                .voyageId(info.getVoyageId())
-                .dispatchNo(info.getDispatchNo())
-                .groupNo(info.getGroupNo())
-                .busNumber(info.getBusNumber())
-                .driverName(info.getDriverName())
-                .driverPhone(info.getDriverPhone())
-                .receiverName(info.getReceiverName())
-                .receiverPhone(info.getReceiverPhone())
-                .sourceType(ObjectUtil.isEmpty(info.getSourceType()) ? 1 : info.getSourceType())
-                .passengerCount(info.getPassengerCount())
-                .remark(info.getRemark())
-                .build();
-        orderJzDispatchMapper.insert(orderJzDispatch);
-        for (OrderJzDispatchBatchReqVO.OrderItem item : batchReqVO.getOrderItems()) {
-                // 更新接站人员信息的分车ID
-                OrderJzDetailDO detail = orderJzDetailMapper.selectById(item.getId());
-                if (detail != null) {
-                    detail.setDispatchId(orderJzDispatch.getId());
-                    orderJzDetailMapper.updateById(detail);
-                }
-        }
+        String dispatchNo = info.getDispatchNo();
+        String groupNo = info.getGroupNo();
+        Long voyageId = info.getVoyageId();
 
+        // 根据条件查找已有的分车记录:分车号+分车组团号+航次ID,或分车号+航次ID
+        LambdaQueryWrapper<OrderJzDispatchDO> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(OrderJzDispatchDO::getDispatchNo, dispatchNo)
+                .eq(OrderJzDispatchDO::getVoyageId, voyageId);
+        if (StrUtil.isNotBlank(groupNo)) {
+            queryWrapper.eq(OrderJzDispatchDO::getGroupNo, groupNo);
+        }
+        List<OrderJzDispatchDO> existingList = orderJzDispatchMapper.selectList(queryWrapper);
 
+        Long dispatchId;
+        if (existingList != null && !existingList.isEmpty()) {
+            // 已存在分车记录,更新并复用
+            OrderJzDispatchDO existing = existingList.get(0);
+           /* OrderJzDispatchDO updateObj = OrderJzDispatchDO.builder()
+                    .id(existing.getId())
+                    .busNumber(info.getBusNumber())
+                    .driverName(info.getDriverName())
+                    .driverPhone(info.getDriverPhone())
+                    .receiverName(info.getReceiverName())
+                    .receiverPhone(info.getReceiverPhone())
+                    .passengerCount(existing.getPassengerCount() + batchReqVO.getOrderItems().size())
+                    .remark(info.getRemark())
+                    .build();
+            orderJzDispatchMapper.updateById(updateObj);*/
+            dispatchId = existing.getId();
+        } else {
+            // 不存在,新建分车记录
+            OrderJzDispatchDO orderJzDispatch = OrderJzDispatchDO.builder()
+                    .dispatchTime(LocalDateTime.now())
+                    .voyageId(voyageId)
+                    .dispatchNo(dispatchNo)
+                    .groupNo(groupNo)
+                    .busNumber(info.getBusNumber())
+                    .driverName(info.getDriverName())
+                    .driverPhone(info.getDriverPhone())
+                    .receiverName(info.getReceiverName())
+                    .receiverPhone(info.getReceiverPhone())
+                    .sourceType(ObjectUtil.isEmpty(info.getSourceType()) ? 1 : info.getSourceType())
+                    .passengerCount(batchReqVO.getOrderItems().size())
+                    .remark(info.getRemark())
+                    .build();
+            orderJzDispatchMapper.insert(orderJzDispatch);
+            dispatchId = orderJzDispatch.getId();
+        }
 
+        // 更新接站人员的分车ID
+        for (OrderJzDispatchBatchReqVO.OrderItem item : batchReqVO.getOrderItems()) {
+            OrderJzDetailDO detail = orderJzDetailMapper.selectById(item.getId());
+            if (detail != null) {
+                detail.setDispatchId(dispatchId);
+                orderJzDetailMapper.updateById(detail);
+            }
+        }
     }
 
     @Override
@@ -192,16 +223,17 @@ public class OrderJzDispatchServiceImpl implements OrderJzDispatchService {
         // 构建更新条件
         LambdaUpdateWrapper<OrderJzDispatchDO> updateWrapper = new LambdaUpdateWrapper<>();
 
-        // 如果有分车组团号,通过分车号、分车组团号、id三个条件更新
-        if (StrUtil.isNotBlank(updateReqVO.getGroupNo())) {
+        // 如果有分车组团号,通过分车号、分车组团号、航次、id条件更新
+       // if (StrUtil.isNotBlank(updateReqVO.getGroupNo())) {
             updateWrapper.eq(OrderJzDispatchDO::getDispatchNo, updateReqVO.getDispatchNo())
                     .eq(OrderJzDispatchDO::getGroupNo, updateReqVO.getGroupNo())
-                    .eq(OrderJzDispatchDO::getId, updateReqVO.getId());
-        } else {
+                    .eq(OrderJzDispatchDO::getVoyageId, updateReqVO.getVoyageId());
+            /*.eq(OrderJzDispatchDO::getId, updateReqVO.getId());*/
+        //} else {
             // 如果没有分车组团号,通过分车号、id两个条件更新
-            updateWrapper.eq(OrderJzDispatchDO::getDispatchNo, updateReqVO.getDispatchNo())
-                    .eq(OrderJzDispatchDO::getId, updateReqVO.getId());
-        }
+            // updateWrapper.eq(OrderJzDispatchDO::getDispatchNo, updateReqVO.getDispatchNo())
+             //       .eq(OrderJzDispatchDO::getId, updateReqVO.getId());
+       // }
 
         // 构建更新对象
         OrderJzDispatchDO updateObj = OrderJzDispatchDO.builder()
@@ -217,5 +249,41 @@ public class OrderJzDispatchServiceImpl implements OrderJzDispatchService {
         orderJzDispatchMapper.update(updateObj, updateWrapper);
     }
 
+    @Override
+    public String checkDispatchDuplicate(OrderJzDispatchBatchReqVO.DispatchInfo dispatchInfo) {
+        String dispatchNo = dispatchInfo.getDispatchNo();
+        String groupNo = dispatchInfo.getGroupNo();
+        Long voyageId = dispatchInfo.getVoyageId();
+
+        if (StrUtil.isBlank(dispatchNo)) {
+            return "分车号不能为空";
+        }
+
+        if (StrUtil.isBlank(groupNo)) {
+            return "分车组团号不能为空";
+        }
+
+
+
+       /* // 根据条件查找已有的分车记录
+        LambdaQueryWrapper<OrderJzDispatchDO> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(OrderJzDispatchDO::getDispatchNo, dispatchNo)
+                .eq(OrderJzDispatchDO::getVoyageId, voyageId);
+        if (StrUtil.isNotBlank(groupNo)) {
+            queryWrapper.eq(OrderJzDispatchDO::getGroupNo, groupNo);
+        }
+        List<OrderJzDispatchDO> existingList = orderJzDispatchMapper.selectList(queryWrapper);
+
+        if (existingList == null || existingList.isEmpty()) {
+            return null; // 无重复
+        }
+
+            String condition = StrUtil.isNotBlank(groupNo)
+                    ? "分车号「" + dispatchNo + "」+分车组团号「" + groupNo + "」"
+                    : "分车号「" + dispatchNo + "」";
+            return "该" + condition + "已存在分车组团号记录";*/
+        return null; // 无重复
+    }
+
 
 }

+ 12 - 12
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/orderjzdetail/OrderJzDetailMapper.xml

@@ -11,7 +11,9 @@
     <select id="selectPage2"
             resultType="com.yc.ship.module.trade.dal.dataobject.orderjzdetail.OrderJzDetailDO">
         select distinct d.* , r.direction , rm.name as room_model_name,
-        SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo
+        SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo,
+        dj.bus_number as busNumber, dj.driver_name as driverName, dj.driver_phone as driverPhone,
+        dj.receiver_name as receiverName, dj.receiver_phone as receiverPhone, dj.remark as dispatchRemark
         from trade_order_jz_detail d
         inner join trade_order_jz oz on d.jz_id = oz.id
         inner join trade_order o on o.deleted = 0 and o.id = oz.order_id
@@ -43,15 +45,14 @@
         <if test="vo.signStatus != null and vo.signStatus == 0">
             and d.sign_time is null
         </if>
-        order by CAST(SUBSTRING_INDEX(o.order_no, '-', -1) AS UNSIGNED) asc,
-                 d.address asc, d.arrive_time asc, d.batch_no asc
+        order by d.address asc, d.arrive_time asc, d.batch_no asc
     </select>
 
     <!-- selectVisitorExportList: 导出游客接站明细,条件与selectPage2一致,不分页 -->
     <select id="selectVisitorExportList"
             resultType="com.yc.ship.module.trade.dal.dataobject.orderjzdetail.OrderJzDetailDO">
         select distinct d.* , r.direction , rm.name as room_model_name,
-        SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo, dj.bus_number as busNumber,dj.driver_name as driverName,dj.driver_phone as driverPhone,dj.receiver_name as receiverName,dj.receiver_phone as receiverPhone
+        SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo, dj.bus_number as busNumber,dj.driver_name as driverName,dj.driver_phone as driverPhone,dj.receiver_name as receiverName,dj.receiver_phone as receiverPhone,dj.remark as dispatchRemark
         from trade_order_jz_detail d
         inner join trade_order_jz oz on d.jz_id = oz.id
         inner join trade_order o on o.deleted = 0 and o.id = oz.order_id
@@ -83,8 +84,7 @@
         <if test="vo.signStatus != null and vo.signStatus == 0">
             and d.sign_time is null
         </if>
-        order by CAST(SUBSTRING_INDEX(o.order_no, '-', -1) AS UNSIGNED) asc,
-                 d.address asc, d.arrive_time asc, d.batch_no asc
+        order by d.address asc, d.arrive_time asc, d.batch_no asc
     </select>
 
     <select id="selectPage3" resultType="map">
@@ -112,7 +112,9 @@
     <select id="selectGiftPage"
             resultType="com.yc.ship.module.trade.dal.dataobject.orderjzdetail.OrderJzDetailDO">
         select distinct d.* , r.direction , rm.name as room_model_name,
-        SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo
+        SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo,
+        dj.bus_number as busNumber, dj.driver_name as driverName, dj.driver_phone as driverPhone,
+        dj.receiver_name as receiverName, dj.receiver_phone as receiverPhone, dj.remark as dispatchRemark
         from trade_order_jz_detail d
         inner join trade_order_jz oz on d.jz_id = oz.id
         inner join trade_order o on o.deleted = 0 and o.id = oz.order_id
@@ -150,15 +152,14 @@
         <if test="vo.otaId != null and vo.otaId != ''">
             and o.source_id = #{vo.otaId}
         </if>
-        order by CAST(SUBSTRING_INDEX(o.order_no, '-', -1) AS UNSIGNED) asc,
-                 d.address asc, d.arrive_time asc, d.batch_no asc
+        order by d.address asc, d.arrive_time asc, d.batch_no asc
     </select>
 
     <!-- 赠送行程导出查询:条件与selectGiftPage一致,不分页 -->
     <select id="selectGiftExportList"
             resultType="com.yc.ship.module.trade.dal.dataobject.orderjzdetail.OrderJzDetailDO">
         select distinct d.* , r.direction , rm.name as room_model_name,
-        SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo, dj.bus_number as busNumber,dj.driver_name as driverName,dj.driver_phone as driverPhone,dj.receiver_name as receiverName,dj.receiver_phone as receiverPhone
+        SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo, dj.bus_number as busNumber,dj.driver_name as driverName,dj.driver_phone as driverPhone,dj.receiver_name as receiverName,dj.receiver_phone as receiverPhone,dj.remark as dispatchRemark
         from trade_order_jz_detail d
         inner join trade_order_jz oz on d.jz_id = oz.id
         inner join trade_order o on o.deleted = 0 and o.id = oz.order_id
@@ -196,8 +197,7 @@
         <if test="vo.otaId != null and vo.otaId != ''">
             and o.source_id = #{vo.otaId}
         </if>
-        order by CAST(SUBSTRING_INDEX(o.order_no, '-', -1) AS UNSIGNED) asc,
-                 d.address asc, d.arrive_time asc, d.batch_no asc
+        order by d.address asc, d.arrive_time asc, d.batch_no asc
     </select>
 
     <!-- 赠送行程补登订单查询:根据订单号/证件号后4位搜索,关联trade_detail过滤product_id -->

+ 9 - 7
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/orderjzdispatch/OrderJzDispatchMapper.xml

@@ -87,11 +87,13 @@
 
     <!-- 查询分车记录总数 -->
     <select id="selectDispatchRecordCount" resultType="java.lang.Long">
+        SELECT COUNT(1) FROM (
         SELECT
-        count(distinct tojd.id)
-        FROM trade_order_jz_dispatch tojd inner join trade_order_jz_detail d on tojd.id = d.dispatch_id
-        inner join trade_order_jz oz on d.jz_id = oz.id
-        inner join trade_order o on o.deleted = 0 and o.id = oz.order_id
+        tojd.dispatch_no, tojd.group_no
+        FROM trade_order_jz_dispatch tojd
+        INNER JOIN trade_order_jz_detail d ON tojd.id = d.dispatch_id
+        INNER JOIN trade_order_jz oz ON d.jz_id = oz.id
+        INNER JOIN trade_order o ON o.deleted = 0 AND o.id = oz.order_id
         <where>
             tojd.deleted = 0
             AND tojd.dispatch_no IS NOT NULL
@@ -100,11 +102,11 @@
                 AND tojd.voyage_id = #{reqVO.voyageId}
             </if>
             <if test="reqVO.dispatchNo != null and reqVO.dispatchNo != ''">
-                AND tojd.dispatch_no LIKE CONCAT('%', #{reqVO.dispatchNo}, '%')
+                AND tojd.dispatch_no LIKE CONCAT(#{reqVO.dispatchNo}, '%')
             </if>
         </where>
-        GROUP BY tojd.dispatch_no,tojd.group_no
-        ORDER BY MAX(tojd.id) DESC
+        GROUP BY tojd.dispatch_no, tojd.group_no
+        ) t
     </select>
 
 </mapper>