Просмотр исходного кода

修改订单时,同步创建新的分车信息

jinch 1 неделя назад
Родитель
Сommit
b2bc6ba8b1

+ 15 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/orderjzdetail/OrderJzDetailMapper.java

@@ -4,11 +4,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
 import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
 import com.yc.ship.module.trade.controller.admin.orderjzdetail.vo.OrderJzDetailPageReqVO;
 import com.yc.ship.module.trade.dal.dataobject.orderjzdetail.OrderJzDetailDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 
 import java.util.List;
 import java.util.Map;
@@ -63,6 +65,19 @@ public interface OrderJzDetailMapper extends BaseMapperX<OrderJzDetailDO> {
 
   Long cleanSign(@Param("id") String id);
 
+    /**
+     * 根据接站单ID列表软删除接站人员名单
+     * 修改订单时,需要软删除旧接站头表关联的所有接站人员名单
+     *
+     * @param jzIdList 接站单ID列表
+     * @param deleted  删除标记(1=已删除)
+     */
+    @Update("<script> UPDATE trade_order_jz_detail SET deleted = #{deleted}, update_time = now() WHERE jz_id IN " +
+            "<foreach collection='jzIdList' item='jzId' open='(' separator=',' close=')'> #{jzId} </foreach>" +
+            "</script>")
+    @TenantIgnore
+    void updateDeletedByJzIds(@Param("jzIdList") List<Long> jzIdList, @Param("deleted") int deleted);
+
   // ==================== 赠送行程接站相关 ====================
 
   IPage<OrderJzDetailDO> selectGiftPage(IPage<OrderJzDetailDO> page, @Param("vo") OrderJzDetailPageReqVO vo);

+ 106 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeOrderRepositoryServiceImpl.java

@@ -31,6 +31,8 @@ import com.yc.ship.module.trade.dal.mysql.contract.ContractMapper;
 import com.yc.ship.module.trade.dal.mysql.insurance.InsuranceMapper;
 import com.yc.ship.module.trade.dal.mysql.order.*;
 import com.yc.ship.module.trade.dal.mysql.orderjz.OrderJzMapper;
+import com.yc.ship.module.trade.dal.mysql.orderjzdetail.OrderJzDetailMapper;
+import com.yc.ship.module.trade.dal.dataobject.orderjzdetail.OrderJzDetailDO;
 import com.yc.ship.module.trade.enums.*;
 import com.yc.ship.module.trade.service.order.TradeOrderRepositoryService;
 import com.yc.ship.module.trade.service.order.bo.*;
@@ -66,6 +68,8 @@ public class TradeOrderRepositoryServiceImpl implements TradeOrderRepositoryServ
     @Resource
     private OrderJzMapper orderJzMapper;
     @Resource
+    private OrderJzDetailMapper orderJzDetailMapper;
+    @Resource
     private TradeDetailMapper tradeDetailMapper;
     @Resource
     private TradeDetailBaseMapper tradeDetailBaseMapper;
@@ -145,12 +149,51 @@ public class TradeOrderRepositoryServiceImpl implements TradeOrderRepositoryServ
     public void modifyOrder(TradeOrderBO tradeOrderBO,TradeOrderDO oldOrder) {
         try {
             Long oldOrderId = oldOrder.getId();
+
+            // ============ 先查询旧接站相关数据(在软删除之前),用于后续重建 ============
+            List<OrderJzDO> oldJzList = orderJzMapper.selectList(new LambdaQueryWrapper<OrderJzDO>()
+                    .eq(OrderJzDO::getOrderId, oldOrderId));
+            List<Long> oldJzIdList = oldJzList.stream().map(OrderJzDO::getId).collect(Collectors.toList());
+            List<OrderJzDetailDO> oldJzDetailList = Collections.emptyList();
+            if (CollUtil.isNotEmpty(oldJzIdList)) {
+                oldJzDetailList = orderJzDetailMapper.selectList(new LambdaQueryWrapper<OrderJzDetailDO>()
+                        .in(OrderJzDetailDO::getJzId, oldJzIdList));
+            }
+
+            // ============ 软删除旧订单主表 ============
             tradeOrderMapper.updateOrderDeleted(oldOrderId,1);
             TradeOrderDO tradeOrderDO = tradeOrderBO.getTradeOrderDO();
             tradeOrderDO.setUpdateTime(LocalDateTime.now());
             tradeOrderMapper.insert(tradeOrderDO);
 
-            orderJzMapper.insert(tradeOrderBO.getOrderJzDO());
+            // ============ 软删除旧接站头表 + 旧接站明细 ============
+            orderJzMapper.updateDeleted(oldOrderId, 1);
+            if (CollUtil.isNotEmpty(oldJzIdList)) {
+                orderJzDetailMapper.updateDeletedByJzIds(oldJzIdList, 1);
+            }
+
+            // ============ 插入新接站头表(同步旧接站头表数据) ============
+            OrderJzDO newOrderJzDO = tradeOrderBO.getOrderJzDO();
+            // 将旧接站头表数据同步到新记录:前端未传的字段用旧值补齐
+            if (CollUtil.isNotEmpty(oldJzList)) {
+                OrderJzDO oldJzDO = oldJzList.get(0);
+                if (newOrderJzDO.getIsJz() == null) {
+                    newOrderJzDO.setIsJz(oldJzDO.getIsJz());
+                }
+                if (newOrderJzDO.getJzAddress() == null) {
+                    newOrderJzDO.setJzAddress(oldJzDO.getJzAddress());
+                }
+                if (newOrderJzDO.getJzLinkName() == null) {
+                    newOrderJzDO.setJzLinkName(oldJzDO.getJzLinkName());
+                }
+                if (newOrderJzDO.getJzLinkPhone() == null) {
+                    newOrderJzDO.setJzLinkPhone(oldJzDO.getJzLinkPhone());
+                }
+            }
+            orderJzMapper.insert(newOrderJzDO);
+
+            // ============ 为新订单重建接站明细 ============
+            rebuildOrderJzDetail(oldJzDetailList, tradeOrderBO);
 
             tradeOrderBindMapper.update(new LambdaUpdateWrapper<TradeOrderBindDO>().set(TradeOrderBindDO::getDeleted, 1).set(TradeOrderBindDO::getUpdateTime, tradeOrderBO.getUpdateTime()==null?new Date():tradeOrderBO.getUpdateTime()).eq(TradeOrderBindDO::getOrderId, oldOrderId));
             if (tradeOrderBO.getTradeOrderBindDO() != null) {
@@ -184,6 +227,68 @@ public class TradeOrderRepositoryServiceImpl implements TradeOrderRepositoryServ
         }
     }
 
+    /**
+     * 修改订单时,为新订单重建接站明细数据。
+     * 通过旧接站明细的证件号(id_card)匹配新游客表(trade_visitor)中的记录,
+     * 将新的 visitor_id 和新的 jz_id 写入新创建的 trade_order_jz_detail 记录中,
+     * 确保 trade_order_jz_detail 与新订单的 trade_visitor 正确关联。
+     *
+     * @param oldJzDetailList 旧订单的接站明细列表(在软删除前已查询)
+     * @param tradeOrderBO    订单业务对象(包含新游客列表和新接站头表)
+     */
+    private void rebuildOrderJzDetail(List<OrderJzDetailDO> oldJzDetailList, TradeOrderBO tradeOrderBO) {
+        if (CollUtil.isEmpty(oldJzDetailList)) {
+            return;
+        }
+
+        Long newJzId = tradeOrderBO.getOrderJzDO().getId();
+
+        // 1. 构建证件号到新游客ID的映射(从新订单的游客列表中获取)
+        Map<String, Long> credentialNoToNewVisitorIdMap = new HashMap<>(16);
+        tradeOrderBO.getTradeOrderDetailBOList().forEach(detailBO -> {
+            if (CollUtil.isNotEmpty(detailBO.getTradeVisitorDOList())) {
+                detailBO.getTradeVisitorDOList().forEach(visitor -> {
+                    if (visitor.getCredentialNo() != null) {
+                        credentialNoToNewVisitorIdMap.put(visitor.getCredentialNo(), visitor.getId());
+                    }
+                });
+            }
+        });
+
+        // 2. 基于旧接站明细重建新记录,关联新的 visitor_id 和 jz_id
+        List<OrderJzDetailDO> newJzDetailList = new ArrayList<>();
+        for (OrderJzDetailDO oldDetail : oldJzDetailList) {
+            OrderJzDetailDO newDetail = new OrderJzDetailDO();
+            newDetail.setId(IdWorker.getId());
+            newDetail.setJzId(newJzId);
+            // 通过证件号匹配新游客ID,确保 visitor_id 关联到新订单的游客
+            Long newVisitorId = credentialNoToNewVisitorIdMap.get(oldDetail.getIdCard());
+            newDetail.setVisitorId(newVisitorId != null ? newVisitorId : oldDetail.getVisitorId());
+            newDetail.setBatchNo(oldDetail.getBatchNo());
+            newDetail.setArriveTime(oldDetail.getArriveTime());
+            newDetail.setAddress(oldDetail.getAddress());
+            newDetail.setName(oldDetail.getName());
+            newDetail.setIdCard(oldDetail.getIdCard());
+            newDetail.setTenantId(oldDetail.getTenantId());
+            newDetail.setPhone(oldDetail.getPhone());
+            newDetail.setRemark(oldDetail.getRemark());
+            newDetail.setStatus(oldDetail.getStatus());
+            newDetail.setSignTime(oldDetail.getSignTime());
+            newDetail.setSignMan(oldDetail.getSignMan());
+            newDetail.setSignRemark(oldDetail.getSignRemark());
+            newDetail.setSignImage(oldDetail.getSignImage());
+            newDetail.setExtendOrderNo(oldDetail.getExtendOrderNo());
+            newDetail.setExtendTicketNo(oldDetail.getExtendTicketNo());
+            newDetail.setDispatchId(oldDetail.getDispatchId());
+            newJzDetailList.add(newDetail);
+        }
+
+        // 3. 批量插入新接站明细
+        if (CollUtil.isNotEmpty(newJzDetailList)) {
+            orderJzDetailMapper.insertBatch(newJzDetailList);
+        }
+    }
+
     @Override
     public void updateOrderStatus(TradeOrderDO tradeOrderDO) {
         //订单状态