Преглед изворни кода

Merge remote-tracking branch 'origin/main' into main

luofeiyun пре 1 недеља
родитељ
комит
9dcb1144cf
37 измењених фајлова са 584 додато и 89 уклоњено
  1. 6 0
      ship-module-trade/ship-module-trade-biz/pom.xml
  2. 15 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/orderjzdetail/OrderJzDetailController.java
  3. 19 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/orderjzdetail/vo/OrderJzDetailBatchSignReqVO.java
  4. 3 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/orderjzdetail/vo/OrderJzDetailExportVO.java
  5. 18 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/orderjzdetail/vo/OrderJzDetailRespVO.java
  6. 5 2
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/orderjzdetail/vo/OrderJzDispatchBatchReqVO.java
  7. 2 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeDetailDO.java
  8. 2 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderCountryDO.java
  9. 5 5
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderDO.java
  10. 2 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderFloorDO.java
  11. 2 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderRoomModelDO.java
  12. 3 2
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderTotalDO.java
  13. 2 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderUserDO.java
  14. 2 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeVisitorDO.java
  15. 6 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/orderjzdetail/OrderJzDetailDO.java
  16. 1 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderFloorMapper.java
  17. 4 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderMapper.java
  18. 1 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderRoomModelMapper.java
  19. 1 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderTotalMapper.java
  20. 1 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderUserMapper.java
  21. 1 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeVisitorMapper.java
  22. 31 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/job/OrderDownSmsOneJob.java
  23. 31 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/job/OrderDownSmsSevenJob.java
  24. 35 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/job/OrderUpSmsOneJob.java
  25. 31 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/job/OrderUpSmsSevenJob.java
  26. 10 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/orderjzdetail/OrderJzDetailService.java
  27. 44 2
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/orderjzdetail/OrderJzDetailServiceImpl.java
  28. 10 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/orderjzdetail/OrderJzDispatchService.java
  29. 122 31
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/orderjzdetail/OrderJzDispatchServiceImpl.java
  30. 22 9
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java
  31. 2 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/smsSendconfig/SmsSendconfigService.java
  32. 91 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/smsSendconfig/SmsSendconfigServiceImpl.java
  33. 4 2
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/utils/BeanUtils.java
  34. 1 1
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeDetailMapper.xml
  35. 22 3
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeOrderMapper.xml
  36. 12 12
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/orderjzdetail/OrderJzDetailMapper.xml
  37. 15 7
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/orderjzdispatch/OrderJzDispatchMapper.xml

+ 6 - 0
ship-module-trade/ship-module-trade-biz/pom.xml

@@ -156,6 +156,12 @@
             <version>1.0.0</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.yc.ship</groupId>
+            <artifactId>module-system-biz</artifactId>
+            <version>1.0.0</version>
+            <scope>compile</scope>
+        </dependency>
         <dependency>
             <groupId>com.yc.ship</groupId>
             <artifactId>ship-module-product-biz</artifactId>

+ 15 - 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());
 
       // 站点字典转义
@@ -282,6 +283,13 @@ public class OrderJzDetailController {
     return success(orderJzDetailService.signOrderJzDetail(createReqVO));
   }
 
+  @PostMapping("/visitor/batch-sign")
+  @Operation(summary = "批量核销(一键核销)")
+  public CommonResult<Integer> batchVisitorSign(@Valid @RequestBody OrderJzDetailBatchSignReqVO reqVO) {
+    int count = orderJzDetailService.batchSignOrderJzDetail(reqVO.getIds(), reqVO.getSignRemark());
+    return success(count);
+  }
+
 
   @DeleteMapping("/visitor/sign/clean")
   @Operation(summary = "游客登记")
@@ -334,6 +342,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 +410,7 @@ public class OrderJzDetailController {
         vo.setDriverPhone(detail.getDriverPhone());
         vo.setReceiverName(detail.getReceiverName());
         vo.setReceiverPhone(detail.getReceiverPhone());
+        vo.setDispatchRemark(detail.getDispatchRemark());
       vo.setReservationInfo(detail.getRemark());
 
       // 站点字典转义

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

@@ -0,0 +1,19 @@
+package com.yc.ship.module.trade.controller.admin.orderjzdetail.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+@Schema(description = "管理后台 - 批量核销请求 VO")
+@Data
+public class OrderJzDetailBatchSignReqVO {
+
+    @Schema(description = "接站人员ID列表", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "请选择需要核销的游客")
+    private List<Long> ids;
+
+    @Schema(description = "核销备注", example = "批量核销")
+    private String signRemark;
+}

+ 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")

+ 2 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeDetailDO.java

@@ -2,6 +2,7 @@ package com.yc.ship.module.trade.dal.dataobject.order;
 
 import com.baomidou.mybatisplus.annotation.*;
 
+import com.yc.ship.framework.mybatis.core.dataobject.TenantSyncDO;
 import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
 import com.yc.ship.module.trade.enums.VoucherStatusEnum;
 import lombok.*;
@@ -22,7 +23,7 @@ import java.time.LocalDateTime;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class TradeDetailDO extends TenantBaseDO {
+public class TradeDetailDO extends TenantSyncDO {
 
     /**
      * 主键

+ 2 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderCountryDO.java

@@ -1,5 +1,6 @@
 package com.yc.ship.module.trade.dal.dataobject.order;
 
+import com.yc.ship.framework.mybatis.core.dataobject.TenantSyncDO;
 import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
@@ -22,7 +23,7 @@ import com.yc.ship.framework.mybatis.core.dataobject.BaseDO;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class TradeOrderCountryDO extends TenantBaseDO {
+public class TradeOrderCountryDO extends TenantSyncDO {
 
     /**
      * ID

+ 5 - 5
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderDO.java

@@ -2,13 +2,13 @@ package com.yc.ship.module.trade.dal.dataobject.order;
 
 import com.baomidou.mybatisplus.annotation.*;
 
+import com.yc.ship.framework.mybatis.core.dataobject.TenantSyncDO;
 import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
 import com.yc.ship.module.trade.dal.dataobject.tradeOrderaudit.TradeOrderAuditDO;
 import com.yc.ship.module.trade.enums.SellMethodEnum;
 import com.yc.ship.module.trade.enums.TradeOrderStatusEnum;
 import com.yc.ship.module.trade.enums.invoice.InvoiceStatusEnum;
 import com.yc.ship.module.trade.framework.annotation.ForUpdate;
-import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
 import java.math.BigDecimal;
@@ -29,7 +29,7 @@ import java.util.List;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class TradeOrderDO extends TenantBaseDO {
+public class TradeOrderDO extends TenantSyncDO {
 
     /**
      * 主键
@@ -104,7 +104,7 @@ public class TradeOrderDO extends TenantBaseDO {
     /**
      * 支付金额
      */
-    @ForUpdate(fieldName = "支付金额")
+    @ForUpdate(fieldName = "实际金额")
     private BigDecimal payAmount;
     /**
      * 订单状态
@@ -342,13 +342,13 @@ public class TradeOrderDO extends TenantBaseDO {
     @ForUpdate(fieldName = "政策优惠金额")
     private BigDecimal freeAmount;
 
-    @ForUpdate(fieldName = "是否需要补缴费 1是 0 否 2已补差价")
+//    @ForUpdate(fieldName = "是否需要补缴费 1是 0 否 2已补差价")
     private Integer isSupplementary;
 
     @ForUpdate(fieldName = "受损金额")
     private BigDecimal damaged;
 
-    @ForUpdate(fieldName = "补缴费金额")
+//    @ForUpdate(fieldName = "补缴费金额")
     private BigDecimal  supplementAmount;
     /**
      * 取消状态 0:初始 1:已提交取消 2:取消成功 3取消审核不通过

+ 2 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderFloorDO.java

@@ -1,5 +1,6 @@
 package com.yc.ship.module.trade.dal.dataobject.order;
 
+import com.yc.ship.framework.mybatis.core.dataobject.TenantSyncDO;
 import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 import java.util.*;
@@ -23,7 +24,7 @@ import com.yc.ship.framework.mybatis.core.dataobject.BaseDO;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class TradeOrderFloorDO extends TenantBaseDO {
+public class TradeOrderFloorDO extends TenantSyncDO {
 
     /**
      * ID

+ 2 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderRoomModelDO.java

@@ -1,5 +1,6 @@
 package com.yc.ship.module.trade.dal.dataobject.order;
 
+import com.yc.ship.framework.mybatis.core.dataobject.TenantSyncDO;
 import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
@@ -21,7 +22,7 @@ import com.yc.ship.framework.mybatis.core.dataobject.BaseDO;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class TradeOrderRoomModelDO extends TenantBaseDO {
+public class TradeOrderRoomModelDO extends TenantSyncDO {
 
     /**
      * ID

+ 3 - 2
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderTotalDO.java

@@ -1,5 +1,6 @@
 package com.yc.ship.module.trade.dal.dataobject.order;
 
+import com.yc.ship.framework.mybatis.core.dataobject.TenantSyncDO;
 import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
 import com.yc.ship.module.trade.framework.annotation.ForUpdate;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -23,7 +24,7 @@ import com.yc.ship.framework.mybatis.core.dataobject.BaseDO;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class TradeOrderTotalDO extends TenantBaseDO {
+public class TradeOrderTotalDO extends TenantSyncDO {
 
     /**
      * 订单ID
@@ -106,7 +107,7 @@ public class TradeOrderTotalDO extends TenantBaseDO {
     @ForUpdate(fieldName = "订单总额")
     private BigDecimal orderMoney;
 
-    @ForUpdate(fieldName = "实际金额")
+//    @ForUpdate(fieldName = "实际金额")
     private BigDecimal realMoney;
 
     @ForUpdate(fieldName = "其它费用")

+ 2 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderUserDO.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 
+import com.yc.ship.framework.mybatis.core.dataobject.TenantSyncDO;
 import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
 import com.yc.ship.module.trade.enums.CredentialTypeEnum;
 import lombok.*;
@@ -22,7 +23,7 @@ import lombok.*;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class TradeOrderUserDO extends TenantBaseDO {
+public class TradeOrderUserDO extends TenantSyncDO {
 
     /**
      * 主键

+ 2 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeVisitorDO.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 
+import com.yc.ship.framework.mybatis.core.dataobject.TenantSyncDO;
 import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
 import com.yc.ship.module.trade.enums.CredentialTypeEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -25,7 +26,7 @@ import java.math.BigDecimal;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class TradeVisitorDO extends TenantBaseDO {
+public class TradeVisitorDO extends TenantSyncDO {
 
     /**
      * 主键

+ 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;
+
 }

+ 1 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderFloorMapper.java

@@ -14,7 +14,7 @@ import org.apache.ibatis.annotations.Update;
  */
 @Mapper
 public interface TradeOrderFloorMapper extends BaseMapperX<TradeOrderFloorDO> {
-    @Update("UPDATE trade_order_floor SET deleted = #{deleted},update_time = now() WHERE order_id = #{orderId}")
+    @Update("UPDATE trade_order_floor SET deleted = #{deleted},update_time = now(), sync_status = '0' WHERE order_id = #{orderId}")
     @TenantIgnore
     void updateDeleted(@Param("orderId") Long orderId, @Param("deleted")  int deleted);
 }

+ 4 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderMapper.java

@@ -249,4 +249,8 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
      * @return
      */
     List<Long> selectCanBuyInsuranceOrder();
+
+    List<Map<String, Object>> queryOrderLink(@Param("day") int day,@Param("direction")int direction);
+
+    List<Map<String, Object>> queryOrderJzPhone(@Param("day") int day,@Param("direction")int direction);
 }

+ 1 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderRoomModelMapper.java

@@ -33,7 +33,7 @@ public interface TradeOrderRoomModelMapper extends BaseMapperX<TradeOrderRoomMod
                 .eq(TradeOrderRoomModelDO::getOrderId, orderId));
     }
 
-    @Update("UPDATE trade_order_room_model SET deleted = #{deleted},update_time = now() WHERE order_id = #{orderId}")
+    @Update("UPDATE trade_order_room_model SET deleted = #{deleted},update_time = now(), sync_status = '0' WHERE order_id = #{orderId}")
     @TenantIgnore
     void updateDeleted(@Param("orderId") Long orderId, @Param("deleted")  int deleted);
 

+ 1 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderTotalMapper.java

@@ -29,7 +29,7 @@ public interface TradeOrderTotalMapper extends BaseMapperX<TradeOrderTotalDO> {
                 .inIfPresent(TradeOrderTotalDO::getOldOrderId, orderIds));
     }
 
-    @Update("UPDATE trade_order_total SET deleted = #{deleted},update_time = now() WHERE old_order_id = #{orderId}")
+    @Update("UPDATE trade_order_total SET deleted = #{deleted},update_time = now(), sync_status = '0' WHERE old_order_id = #{orderId}")
     @TenantIgnore
     void updateDeleted(@Param("orderId") Long orderId, @Param("deleted")  int deleted);
 

+ 1 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderUserMapper.java

@@ -15,7 +15,7 @@ import org.apache.ibatis.annotations.Update;
  */
 @Mapper
 public interface TradeOrderUserMapper extends BaseMapperX<TradeOrderUserDO> {
-    @Update("UPDATE trade_order_user SET deleted = #{deleted},update_time = now() WHERE order_id = #{orderId}")
+    @Update("UPDATE trade_order_user SET deleted = #{deleted},update_time = now(), sync_status = '0' WHERE order_id = #{orderId}")
     @TenantIgnore
     void updateDeleted(@Param("orderId") Long orderId, @Param("deleted")  int deleted);
 

+ 1 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeVisitorMapper.java

@@ -72,7 +72,7 @@ public interface TradeVisitorMapper extends BaseMapperX<TradeVisitorDO> {
      */
     List<TradeVisitorDO> selectListByVoyageId(@Param("voyageId") String voyageId);
 
-    @Update("UPDATE trade_visitor SET deleted = #{deleted},update_time = now() WHERE order_id = #{orderId}")
+    @Update("UPDATE trade_visitor SET deleted = #{deleted},update_time = now(), sync_status = '0' WHERE order_id = #{orderId}")
     @TenantIgnore
     void updateDeleted(@Param("orderId") Long orderId, @Param("deleted")  int deleted);
 

+ 31 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/job/OrderDownSmsOneJob.java

@@ -0,0 +1,31 @@
+package com.yc.ship.module.trade.job;
+
+import com.yc.ship.framework.quartz.core.handler.JobHandler;
+import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
+import com.yc.ship.framework.tenant.core.job.TenantJob;
+import com.yc.ship.module.trade.service.smsSendconfig.SmsSendconfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class OrderDownSmsOneJob  implements JobHandler {
+    @Resource
+    private SmsSendconfigService smsSendconfigService;
+
+    @Override
+    @TenantIgnore
+    public String execute(String s){
+        log.info(">>>>>>>>>>>>>>>>>>>>>> OrderDownSmsOneJob Begin <<<<<<<<<<<<<<<<<<<<<<");
+        try {
+            smsSendconfigService.upSmsSendMsg(2,"SMS_505150033",1);
+        } catch (Exception e) {
+            log.error(">>>>>>>>>>>>>>>>>>>>>> OrderDownSmsOneJob Error <<<<<<<<<<<<<<<<<<<<<<");
+            log.error(e.getMessage(), e);
+        }
+        log.info(">>>>>>>>>>>>>>>>>>>>>>  OrderDownSmsOneJob End  <<<<<<<<<<<<<<<<<<<<<<");
+        return "成功";
+    }
+}

+ 31 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/job/OrderDownSmsSevenJob.java

@@ -0,0 +1,31 @@
+package com.yc.ship.module.trade.job;
+
+import com.yc.ship.framework.quartz.core.handler.JobHandler;
+import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
+import com.yc.ship.framework.tenant.core.job.TenantJob;
+import com.yc.ship.module.trade.service.smsSendconfig.SmsSendconfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class OrderDownSmsSevenJob  implements JobHandler {
+    @Resource
+    private SmsSendconfigService smsSendconfigService;
+
+    @Override
+    @TenantIgnore
+    public String execute(String s){
+        log.info(">>>>>>>>>>>>>>>>>>>>>> OrderDownSmsSevenJob Begin <<<<<<<<<<<<<<<<<<<<<<");
+        try {
+            smsSendconfigService.upSmsSendMsg(2,"SMS_504885367",7);
+        } catch (Exception e) {
+            log.error(">>>>>>>>>>>>>>>>>>>>>> OrderDownSmsSevenJob Error <<<<<<<<<<<<<<<<<<<<<<");
+            log.error(e.getMessage(), e);
+        }
+        log.info(">>>>>>>>>>>>>>>>>>>>>>  OrderDownSmsSevenJob End  <<<<<<<<<<<<<<<<<<<<<<");
+        return "成功";
+    }
+}

+ 35 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/job/OrderUpSmsOneJob.java

@@ -0,0 +1,35 @@
+package com.yc.ship.module.trade.job;
+
+import com.xxl.job.core.handler.annotation.XxlJob;
+import com.yc.ship.framework.quartz.core.handler.JobHandler;
+import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
+import com.yc.ship.framework.tenant.core.job.TenantJob;
+import com.yc.ship.module.trade.service.smsSendconfig.SmsSendconfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 上水开航前1天短信通知
+ */
+@Component
+@Slf4j
+public class OrderUpSmsOneJob implements JobHandler {
+    @Resource
+    private SmsSendconfigService smsSendconfigService;
+
+    @Override
+    @TenantIgnore
+    public String execute(String s){
+        log.info(">>>>>>>>>>>>>>>>>>>>>> OrderUpSmsOneJob Begin <<<<<<<<<<<<<<<<<<<<<<");
+        try {
+            smsSendconfigService.upSmsSendMsg(1,"SMS_505090361",1);
+        } catch (Exception e) {
+            log.error(">>>>>>>>>>>>>>>>>>>>>> OrderUpSmsOneJob Error <<<<<<<<<<<<<<<<<<<<<<");
+            log.error(e.getMessage(), e);
+        }
+        log.info(">>>>>>>>>>>>>>>>>>>>>>  OrderUpSmsOneJob End  <<<<<<<<<<<<<<<<<<<<<<");
+        return "成功";
+    }
+}

+ 31 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/job/OrderUpSmsSevenJob.java

@@ -0,0 +1,31 @@
+package com.yc.ship.module.trade.job;
+
+import com.yc.ship.framework.quartz.core.handler.JobHandler;
+import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
+import com.yc.ship.framework.tenant.core.job.TenantJob;
+import com.yc.ship.module.trade.service.smsSendconfig.SmsSendconfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class OrderUpSmsSevenJob implements JobHandler {
+    @Resource
+    private SmsSendconfigService smsSendconfigService;
+
+    @Override
+    @TenantIgnore
+    public String execute(String s){
+        log.info(">>>>>>>>>>>>>>>>>>>>>> OrderUpSmsSevenJob Begin <<<<<<<<<<<<<<<<<<<<<<");
+        try {
+            smsSendconfigService.upSmsSendMsg(1,"SMS_504955351",7);
+        } catch (Exception e) {
+            log.error(">>>>>>>>>>>>>>>>>>>>>> OrderUpSmsSevenJob Error <<<<<<<<<<<<<<<<<<<<<<");
+            log.error(e.getMessage(), e);
+        }
+        log.info(">>>>>>>>>>>>>>>>>>>>>>  OrderUpSmsSevenJob End  <<<<<<<<<<<<<<<<<<<<<<");
+        return "成功";
+    }
+}

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

@@ -63,6 +63,16 @@ public interface OrderJzDetailService {
 
   Long signOrderJzDetail(OrderJzDetailSaveReqVO createReqVO);
 
+  /**
+   * 批量核销(一键核销)
+   * 对已选中的接站人员进行批量签到核销,已核销的跳过
+   *
+   * @param ids 接站人员ID列表
+   * @param signRemark 签到备注
+   * @return 实际核销成功数量
+   */
+  int batchSignOrderJzDetail(List<Long> ids, String signRemark);
+
   PageResult<OrderJzDetailDO> getOrderJzDetailPage2(OrderJzDetailPageReqVO pageReqVO);
 
   PageResult<?> getOrderJzDetailPage3(OrderJzDetailPageReqVO pageReqVO);

+ 44 - 2
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/orderjzdetail/OrderJzDetailServiceImpl.java

@@ -1,5 +1,6 @@
 package com.yc.ship.module.trade.service.orderjzdetail;
 
+import cn.hutool.core.codec.Base64Decoder;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.http.HttpUtil;
@@ -160,6 +161,10 @@ public class OrderJzDetailServiceImpl implements OrderJzDetailService {
             vistor.put("name", tradeVisitorDO.getName());
             vistor.put("mobile", tradeVisitorDO.getPhone());
             vistor.put("idCard", tradeVisitorDO.getIdCard());
+            if(tradeVisitorDO.getIdCard().length()!=18){
+                vistor.put("idType", "1");
+            }
+
             vistor.put("face", "");
             vistorList.add(vistor);
         }
@@ -189,8 +194,9 @@ public class OrderJzDetailServiceImpl implements OrderJzDetailService {
                 .execute().body();
         log.info("二期系统预下单完成,响应参数:{}", res);
         // base64解密
-        log.info("二期系统预下单完成,响应response参数:{}", res);
-        JSONObject jsonObj = JSONUtil.parseObj(res);
+        String result = Base64Decoder.decodeStr(res);
+        log.info("二期系统预下单完成,响应response参数:{}", result);
+        JSONObject jsonObj = JSONUtil.parseObj(result);
         JSONObject responseHead = jsonObj.getJSONObject("responseHead");
         if (StringUtils.equals("1000", responseHead.getStr("res_code"))) {
             String response = jsonObj.getStr("responseBody");
@@ -446,6 +452,42 @@ public class OrderJzDetailServiceImpl implements OrderJzDetailService {
         return detail.getId();
     }
 
+    @Override
+    public int batchSignOrderJzDetail(List<Long> ids, String signRemark) {
+        if (ids == null || ids.isEmpty()) {
+            return 0;
+        }
+        // 批量查询
+        List<OrderJzDetailDO> detailList = orderJzDetailMapper.selectBatchIds(ids);
+        if (detailList == null || detailList.isEmpty()) {
+            return 0;
+        }
+
+        // 检查已核销的人员,收集名称用于提示
+        List<String> alreadySignedNames = detailList.stream()
+                .filter(d -> StringUtils.isNotBlank(d.getSignTime()))
+                .map(OrderJzDetailDO::getName)
+                .collect(Collectors.toList());
+        if (!alreadySignedNames.isEmpty()) {
+            throw new RuntimeException("以下游客已核销,请勿重复核销:" + String.join("、", alreadySignedNames));
+        }
+
+        // 获取当前登录人信息
+        LoginUser loginUser = getLoginUser();
+        String signMan = MapUtils.getString(loginUser.getInfo(), LoginUser.INFO_KEY_NICKNAME);
+        String signTime = DateUtils.format(new Date(), DatePattern.NORM_DATETIME_PATTERN);
+
+        int count = 0;
+        for (OrderJzDetailDO detail : detailList) {
+            detail.setSignTime(signTime);
+            detail.setSignMan(signMan);
+            detail.setSignRemark(signRemark);
+            orderJzDetailMapper.updateById(detail);
+            count++;
+        }
+        return count;
+    }
+
     @Override
     public PageResult<OrderJzDetailDO> getOrderJzDetailPage2(OrderJzDetailPageReqVO pageReqVO) {
         IPage<OrderJzDetailDO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());

+ 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);
+
 
 }

+ 122 - 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;
@@ -12,6 +13,7 @@ import com.yc.ship.module.trade.dal.dataobject.orderjzdetail.OrderJzDetailDO;
 import com.yc.ship.module.trade.dal.dataobject.orderjzdispatch.OrderJzDispatchDO;
 import com.yc.ship.module.trade.dal.mysql.orderjzdetail.OrderJzDetailMapper;
 import com.yc.ship.module.trade.dal.mysql.orderjzdispatch.OrderJzDispatchMapper;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -73,33 +75,83 @@ 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();
+        Integer sourceType = info.getSourceType(); // 1.接站 2.赠送接站
+
+        // 根据条件查找已有的分车记录:分车号+分车组团号+航次ID,或分车号+航次ID
+        LambdaQueryWrapper<OrderJzDispatchDO> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(OrderJzDispatchDO::getDispatchNo, dispatchNo)
+                .eq(OrderJzDispatchDO::getVoyageId, voyageId)
+        .eq(OrderJzDispatchDO::getSourceType, sourceType);
+        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
+        StringBuilder alreadyDispatchedNames = new StringBuilder();
+        for (OrderJzDispatchBatchReqVO.OrderItem item : batchReqVO.getOrderItems()) {
+            OrderJzDetailDO detail = orderJzDetailMapper.selectById(item.getId());
+            if (detail != null) {
+                // 校验是否已分车(dispatchId不为空且不为0表示已分车)
+                if (detail.getDispatchId() != null && detail.getDispatchId() != 0L) {
+                    if (alreadyDispatchedNames.length() > 0) {
+                        alreadyDispatchedNames.append("、");
+                    }
+                    alreadyDispatchedNames.append(detail.getName());
+                }
+            }
+        }
+        if (alreadyDispatchedNames.length() > 0) {
+            throw new RuntimeException("以下游客已分车,不能重复分车:" + alreadyDispatchedNames.toString());
+        }
 
+        // 更新接站人员的分车ID
+        for (OrderJzDispatchBatchReqVO.OrderItem item : batchReqVO.getOrderItems()) {
+            OrderJzDetailDO detail = orderJzDetailMapper.selectById(item.getId());
+            if (detail != null) {
+                detail.setDispatchId(dispatchId);
+                orderJzDetailMapper.updateById(detail);
+            }
+        }
     }
 
     @Override
@@ -142,7 +194,8 @@ public class OrderJzDispatchServiceImpl implements OrderJzDispatchService {
         if (dispatchId != null) {
 
             OrderJzDispatchDO orderJzDis = orderJzDispatchMapper.selectById(dispatchId);
-            Integer passengerCount = orderJzDis.getPassengerCount();
+
+            Integer passengerCount = ObjectUtils.isEmpty(orderJzDis) ? 0 : orderJzDis.getPassengerCount();
             if (passengerCount != null && passengerCount > 1) {
                 // 大于一人 更新分车记录表
                 orderJzDispatchMapper.updateById(OrderJzDispatchDO.builder()
@@ -192,16 +245,18 @@ 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::getSourceType, updateReqVO.getSourceType());
+            /*.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 +272,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; // 无重复
+    }
+
 
 }

+ 22 - 9
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java

@@ -1985,12 +1985,12 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             shipTradeOrderCreateReqVO.setOrderSort(tradeOrderDO.getOrderSort());
             shipTradeOrderCreateReqVO.setIsRead(0);
             TradeOrderTotalVO summary = createVO.getSummary();
-            BigDecimal realAmount = summary.getRealMoney();
+            BigDecimal realAmount = summary.getRealMoney()==null?BigDecimal.ZERO:summary.getRealMoney()  ;
             BigDecimal orderMoney = summary.getOrderMoney();
             Long discountId = summary.getDiscountId();
             shipTradeOrderCreateReqVO.setAmount(orderMoney);
             shipTradeOrderCreateReqVO.setPayAmount(realAmount);
-            if ((orderMoney != null && realAmount != null && realAmount.compareTo(orderMoney) != 0) || shipTradeOrderCreateReqVO.getAmount().compareTo(tradeOrderDO.getAmount())!=0) {
+            if ((orderMoney != null && realAmount != null && (realAmount.compareTo(orderMoney) != 0) || shipTradeOrderCreateReqVO.getAmount().compareTo(tradeOrderDO.getAmount())!=0)) {
                 shipTradeOrderCreateReqVO.setConfirmType(1);
                 TradeOrderBindDO tradeOrderBindDO = new TradeOrderBindDO();
                 tradeOrderBindDO.setId(IdWorker.getId());
@@ -2113,6 +2113,11 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             TradeOrderTotalDO oldTradeOrderTotal = tradeOrderTotalMapper.selectOne(new LambdaQueryWrapper<TradeOrderTotalDO>().eq(TradeOrderTotalDO::getOldOrderId, orderId));
             shipTradeOrderCreateReqVO.setOldtradeOrderTotalDO(oldTradeOrderTotal);
             TradeOrderTotalDO tradeOrderTotalDO = BeanUtils.toBean(summary, TradeOrderTotalDO.class);
+            if(tradeOrderTotalDO.getUpFloorTotalMoney()==null){
+                tradeOrderTotalDO.setUpFloorTotalMoney(BigDecimal.ZERO);
+            }
+            tradeOrderTotalDO.setUpFloorTotalNum(tradeOrderTotalDO.getUpFloorTotalNum()==null?0:tradeOrderTotalDO.getUpFloorTotalNum());
+            tradeOrderTotalDO.setUseRoomTotalNum(tradeOrderTotalDO.getUseRoomTotalNum()==null?0:tradeOrderTotalDO.getUseRoomTotalNum());
             List<TradeVisitorDO> oldvisitorDOList = tradeVisitorMapper.selectList(new LambdaQueryWrapper<TradeVisitorDO>().eq(TradeVisitorDO::getOrderId, tradeOrderDO.getId()));
             String changedFields0 = "";
             AtomicReference<String> oldCardNo = new AtomicReference<>("");
@@ -2134,10 +2139,10 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                     }
                 }
             }
-            List<TradeDetailRespVO> orderDetailByOrderId = tradeDetailMapper.getOrderDetailByOrderId(orderId);
-            if(orderDetailByOrderId!=null){
-
-            }
+//            List<TradeDetailRespVO> orderDetailByOrderId = tradeDetailMapper.getOrderDetailByOrderId(orderId);
+//            if(orderDetailByOrderId!=null){
+//
+//            }
 
             if(tradeOrderDO.getPayStatus()==1 && tradeOrderDO.getPayAmount().subtract(shipTradeOrderCreateReqVO.getPayAmount()).compareTo(BigDecimal.ZERO)!=0){
                 return CommonResult.error(500, "已支付订单金额发生变化"+tradeOrderDO.getPayAmount()+"->"+shipTradeOrderCreateReqVO.getPayAmount());
@@ -2236,8 +2241,8 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 desc = "政策优惠提交,订单进入二级审核";
             }
             if (shipTradeOrderCreateReqVO.getAmount().compareTo(tradeOrderDO.getAmount())!=0 && loginUser.getDistributorId() == null) {
-                auditType = 3;
-                desc = "平台修改订单金额发生变化,订单进入级审核";
+                auditType = 4;
+                desc = "平台修改订单金额发生变化,订单进入级审核";
             }
             BigDecimal oldDeposi = tradeOrderDO.getDeposi()==null?BigDecimal.ZERO:tradeOrderDO.getDeposi();
             BigDecimal newDeposi = shipTradeOrderCreateReqVO.getDeposi()==null?BigDecimal.ZERO:shipTradeOrderCreateReqVO.getDeposi();
@@ -2245,13 +2250,21 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 auditType = 3;
                 desc = "平台修改定金金额,订单进入三级审核";
             }
+            if (realAmount.compareTo(tradeOrderDO.getPayAmount())!=0 && loginUser.getDistributorId() == null) {
+                auditType = 4;
+                desc = "平台修改实际金额,订单进入四级审核";
+            }
             if (oldleaderAmount.compareTo(leaderAmount)!=0 || oldwithAmount.compareTo(withAmount)!=0 || oldotherMoney.compareTo(otherMoney)!=0) {
                 auditType = 4;
                 desc = "领队陪同修改,订单进入四级审核";
             }
             if (shipTradeOrderCreateReqVO.getAmount().compareTo(tradeOrderDO.getAmount())!=0 && loginUser.getDistributorId() != null) {
                 auditType = 4;
-                desc = "分销商修改订单金额发生变化,订单进入四级审核";
+                desc = "分销商修改订单金额,订单进入四级审核";
+            }
+            if (realAmount.compareTo(tradeOrderDO.getPayAmount())!=0 && loginUser.getDistributorId() != null) {
+                auditType = 4;
+                desc = "分销商修改实际金额,订单进入四级审核";
             }
             //1.取消订单,四级审核,销售-计调-运营主管-营销经理
             //2.重要信息修改(修改游客信息,价格变动),四级审核,销售-计调-运营主管-营销经理

+ 2 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/smsSendconfig/SmsSendconfigService.java

@@ -57,4 +57,6 @@ public interface SmsSendconfigService {
     PageResult<SmsSendconfigDO> getSmsSendconfigPage(SmsSendconfigPageReqVO pageReqVO);
 
     PageResult<SmsSendconfigQueryRespVO> querySendLogList(SmsSendconfigPageReqVO pageReqVO);
+
+    void upSmsSendMsg(int type, String code, int day);
 }

+ 91 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/smsSendconfig/SmsSendconfigServiceImpl.java

@@ -1,5 +1,6 @@
 package com.yc.ship.module.trade.service.smsSendconfig;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -11,6 +12,11 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.framework.common.util.object.BeanUtils;
 import com.yc.ship.framework.mybatis.core.util.MyBatisUtils;
+import com.yc.ship.module.system.dal.dataobject.dict.DictDataDO;
+import com.yc.ship.module.system.dal.dataobject.sms.SmsTemplateDO;
+import com.yc.ship.module.system.dal.mysql.dict.DictDataMapper;
+import com.yc.ship.module.system.dal.mysql.sms.SmsTemplateMapper;
+import com.yc.ship.module.system.service.sms.SmsSendService;
 import com.yc.ship.module.trade.api.sms.dto.SmsReqDTO;
 import com.yc.ship.module.trade.controller.admin.smsSendconfig.vo.SmsSendconfigPageReqVO;
 import com.yc.ship.module.trade.controller.admin.smsSendconfig.vo.SmsSendconfigQueryRespVO;
@@ -18,6 +24,7 @@ import com.yc.ship.module.trade.controller.admin.smsSendconfig.vo.SmsSendconfigS
 import com.yc.ship.module.trade.dal.dataobject.smsProduct.SmsProductDO;
 import com.yc.ship.module.trade.dal.dataobject.smsSendLog.SmsSendLogDO;
 import com.yc.ship.module.trade.dal.dataobject.smsSendconfig.SmsSendconfigDO;
+import com.yc.ship.module.trade.dal.mysql.order.TradeOrderMapper;
 import com.yc.ship.module.trade.dal.mysql.smsProduct.SmsProductMapper;
 import com.yc.ship.module.trade.dal.mysql.smsSendLog.SmsSendLogMapper;
 import com.yc.ship.module.trade.dal.mysql.smsSendconfig.SmsSendconfigMapper;
@@ -59,9 +66,20 @@ public class SmsSendconfigServiceImpl implements SmsSendconfigService {
     @Resource
     private SmsServiceImpl smsService;
 
+    @Resource
+    private SmsSendService smsSendService;
+
     @Resource
     private SmsSendLogMapper smsSendLogMapper;
 
+    @Resource
+    private TradeOrderMapper tradeOrderMapper;
+
+    @Resource
+    private SmsTemplateMapper smsTemplateMapper;
+    @Resource
+    private DictDataMapper dictDataMapper;
+
     @Override
     public Long createSmsSendconfig(SmsSendconfigSaveReqVO createReqVO) {
         // 插入
@@ -285,4 +303,77 @@ public class SmsSendconfigServiceImpl implements SmsSendconfigService {
         return new PageResult<>(page.getRecords(), page.getTotal());
     }
 
+    /**
+     * @param type 1 上水 2 下水
+     * @param code
+     * @param day 天数
+     */
+    @Override
+    @Async
+    public void upSmsSendMsg(int type, String code, int day) {
+        // 查询订单联系人
+        List<Map<String,Object>> linkList = tradeOrderMapper.queryOrderLink(day,type);
+        // 查询接站登记人
+        List<Map<String,Object>> jzPhoneList = tradeOrderMapper.queryOrderJzPhone(day,type);
+        // 查询短信配置
+        SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectByCode(code);
+        // 合并两个列表并去重
+        Set<String> phoneSet = new HashSet<>();
+        Map<String, Map<String, Object>> phoneDataMap = new HashMap<>();
+
+        if (linkList != null) {
+            for (Map<String, Object> map : linkList) {
+                String phone = (String) map.get("link_mobile");
+                if (phone != null && !phone.isEmpty()) {
+                    phoneSet.add(phone);
+                }
+            }
+        }
+        if (jzPhoneList != null) {
+            for (Map<String, Object> map : jzPhoneList) {
+                String phone = (String) map.get("phone");
+                if (phone != null && !phone.isEmpty()) {
+                    phoneSet.add(phone);
+                    if (!phoneDataMap.containsKey(phone)) {
+                        phoneDataMap.put(phone, map);
+                    }
+                }
+            }
+        }
+        List<String> phoneList = new ArrayList<>(phoneSet);
+        List<String> params = smsTemplateDO.getParams();// ["【pick】","【time】"]
+        Map<String, Object> templateParams = new HashMap<>();
+        if(type == 1){
+            // 上水
+            // 获取上水抵达三峡游客中心 查询数据字典
+            List<DictDataDO> arriveDataLis = dictDataMapper.selectListByStatusAndDictType(0, "up_arrive");
+            if(day == -1){
+                // 获取上水登船时间 查询数据字典
+                List<DictDataDO> dictDataList = dictDataMapper.selectListByStatusAndDictType(0, "up_board");
+                templateParams.put(params.get(0), dictDataList.get(0).getLabel());
+                templateParams.put(params.get(1), arriveDataLis.get(0).getLabel());
+            }else{
+                templateParams.put(params.get(0), DateUtil.format(DateUtil.offsetDay(new Date(), day), "yyyy年MM月dd日"));
+                templateParams.put(params.get(1), arriveDataLis.get(0).getLabel());
+            }
+        }else{
+            // 下水
+            if(day == -1){
+                // 获取下水登船时间 查询数据字典
+                List<DictDataDO> dictDataList = dictDataMapper.selectListByStatusAndDictType(0, "down_board");
+                templateParams.put(params.get(0), dictDataList.get(0).getLabel());
+            }else{
+                templateParams.put(params.get(0), DateUtil.format(DateUtil.offsetDay(new Date(), day), "yyyy年MM月dd日"));
+            }
+        }
+        if(CollectionUtil.isNotEmpty(phoneList)){
+            for(String phone : phoneList){
+//                log.info("【短信发送】:phone:{}", phone);
+//                log.info("【短信发送】:templateParams:{}", templateParams);
+                smsSendService.sendSingleSmsToAdmin(phone, null, smsTemplateDO.getId(), templateParams);
+            }
+//            smsSendService.sendSingleSmsToAdmin("18071246889", null, smsTemplateDO.getId(), templateParams);
+        }
+    }
+
 }

+ 4 - 2
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/utils/BeanUtils.java

@@ -38,13 +38,15 @@ public class BeanUtils {
                             continue;
                         }
                     }
+                    newValue = newValue == null ? "" : newValue;
+                    oldValue = oldValue == null ? "" : oldValue;
                     if (!Objects.equals(newValue, oldValue)) {
                         //获取字段名称
                         builder.append(field.getAnnotation(ForUpdate.class).fieldName());
                         builder.append(": 【更改前:");
-                        builder.append(newValue==null?"空":newValue);
+                        builder.append(newValue);
                         builder.append(", 更改后:");
-                        builder.append(oldValue==null?"空":oldValue);
+                        builder.append(oldValue);
                         builder.append("】\n");
                     }
                 } catch (Exception e) {

+ 1 - 1
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeDetailMapper.xml

@@ -1438,6 +1438,6 @@
     </select>
 
     <update id="updateDeleted">
-        UPDATE trade_detail SET deleted = #{deleted},update_time = now() WHERE order_id = #{orderId}
+        UPDATE trade_detail SET deleted = #{deleted},update_time = now(), sync_status = '0' WHERE order_id = #{orderId}
     </update>
 </mapper>

+ 22 - 3
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeOrderMapper.xml

@@ -1502,15 +1502,15 @@
     </select>
 
     <update id="updateOrderStatus">
-        UPDATE trade_order SET order_status = #{orderStatus} WHERE id = #{orderId} and order_status != #{orderStatus}
+        UPDATE trade_order SET order_status = #{orderStatus}, sync_status = '0' WHERE id = #{orderId} and order_status != #{orderStatus}
     </update>
 
     <update id="updateOrderIsAccount">
-        UPDATE trade_order SET is_account = #{isAccount} WHERE id = #{orderId}
+        UPDATE trade_order SET is_account = #{isAccount} , sync_status = '0' WHERE id = #{orderId}
     </update>
 
     <update id="updateOrderDeleted">
-        UPDATE trade_order SET deleted = #{deleted},update_time = now() WHERE id = #{orderId}
+        UPDATE trade_order SET deleted = #{deleted},update_time = now(), sync_status = '0' WHERE id = #{orderId}
     </update>
 
     <resultMap id="OrderAndDetailResultMap" type="com.yc.ship.module.trade.controller.admin.order.vo.order.TradeOrderPdaRespVO">
@@ -2576,5 +2576,24 @@
           and (is_insure is null)
           and travel_date BETWEEN now() and CONCAT(DATE_ADD(CURDATE(),INTERVAL 2 DAY), ' 23:59:59')
     </select>
+
+
+    <select id="queryOrderLink" resultType="java.util.Map">
+        select distinct td.link_mobile from trade_order td
+                                                LEFT JOIN product_voyage pv ON td.voyage_id = pv.id
+                                                LEFT JOIN resource_route rr ON pv.route_id = rr.id
+        where DATE_FORMAT(td.travel_date, '%Y-%m-%d') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL (-#{day}) DAY), '%Y-%m-%d')
+          and td.deleted='0' and td.link_mobile is not null and td.order_status >0 and rr.direction = #{direction};
+    </select>
+
+    <select id="queryOrderJzPhone" resultType="java.util.Map">
+        select distinct tzd.phone from trade_order td
+                                           left join trade_order_jz tz on tz.order_id = td.id
+                                           left join trade_order_jz_detail tzd on tzd.jz_id = tz.id and tzd.deleted='0'
+                                           LEFT JOIN product_voyage pv ON td.voyage_id = pv.id
+                                           LEFT JOIN resource_route rr ON pv.route_id = rr.id
+        where DATE_FORMAT(td.travel_date, '%Y-%m-%d') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL (-#{day}) DAY), '%Y-%m-%d')
+          and td.deleted='0' and tzd.phone is not null and td.order_status >0 and rr.direction = #{direction};
+    </select>
 </mapper>
 

+ 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, d.sign_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,d.sign_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, d.sign_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,d.sign_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 -->

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

@@ -79,6 +79,9 @@
             <if test="reqVO.dispatchNo != null and reqVO.dispatchNo != ''">
                 AND tojd.dispatch_no LIKE CONCAT('%', #{reqVO.dispatchNo}, '%')
             </if>
+            <if test="reqVO.sourceType != null">
+                AND tojd.source_type = #{reqVO.sourceType}
+            </if>
         </where>
         GROUP BY tojd.dispatch_no,tojd.group_no
         ORDER BY MAX(tojd.id) DESC
@@ -87,11 +90,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 +105,14 @@
                 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>
+            <if test="reqVO.sourceType != null">
+                AND tojd.source_type = #{reqVO.sourceType}
             </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>