Browse Source

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

luofeiyun 6 days ago
parent
commit
890b8a9a57
11 changed files with 327 additions and 11 deletions
  1. 2 0
      ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/enums/ErrorCodeConstants.java
  2. 2 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/orderjzdetail/OrderJzDetailController.java
  3. 10 7
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/orderjzdetail/vo/OrderJzDetailExportVO.java
  4. 29 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/app/order/FileDeal.java
  5. 148 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/app/order/TradeOrderController.java
  6. 15 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/orderjzdetail/OrderJzDetailMapper.java
  7. 3 2
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/handler/InsuranceHandler.java
  8. 106 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeOrderRepositoryServiceImpl.java
  9. 3 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeOrderServiceImpl.java
  10. 8 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java
  11. 1 1
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeOrderMapper.xml

+ 2 - 0
ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/enums/ErrorCodeConstants.java

@@ -147,6 +147,8 @@ public interface ErrorCodeConstants {
 
 
     // ========== 核销 ==========
     // ========== 核销 ==========
     ErrorCode ORDER_NOT_EXIST = new ErrorCode(30_100, "订单不存在");
     ErrorCode ORDER_NOT_EXIST = new ErrorCode(30_100, "订单不存在");
+    ErrorCode ORDER_NOT_VOYAGE_CHANGE = new ErrorCode(30_101, "航次不能修改");
+    ErrorCode ORDER_NOT_VOYAGE = new ErrorCode(30_101, "航次不能为空");
     ErrorCode USE_DATE_RANGE_ERROR = new ErrorCode(30_102, "使用日期范围不正确");
     ErrorCode USE_DATE_RANGE_ERROR = new ErrorCode(30_102, "使用日期范围不正确");
     ErrorCode TRAVEL_DATE_ERROR = new ErrorCode(30_103, "游玩日期不正确");
     ErrorCode TRAVEL_DATE_ERROR = new ErrorCode(30_103, "游玩日期不正确");
     ErrorCode TRADE_DETAIL_NOT_EXIST = new ErrorCode(30_104, "票码不存在");
     ErrorCode TRADE_DETAIL_NOT_EXIST = new ErrorCode(30_104, "票码不存在");

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

@@ -228,6 +228,7 @@ public class OrderJzDetailController {
       vo.setRemark(detail.getRemark());
       vo.setRemark(detail.getRemark());
       vo.setSignTime(detail.getSignTime());
       vo.setSignTime(detail.getSignTime());
       vo.setDispatchNo(detail.getDispatchNo());
       vo.setDispatchNo(detail.getDispatchNo());
+        vo.setGroupNo(detail.getGroupNo());
         vo.setBusNumber(detail.getBusNumber());
         vo.setBusNumber(detail.getBusNumber());
         vo.setDriverName(detail.getDriverName());
         vo.setDriverName(detail.getDriverName());
         vo.setDriverPhone(detail.getDriverPhone());
         vo.setDriverPhone(detail.getDriverPhone());
@@ -405,6 +406,7 @@ public class OrderJzDetailController {
       vo.setRemark(detail.getRemark());
       vo.setRemark(detail.getRemark());
       vo.setSignTime(detail.getSignTime());
       vo.setSignTime(detail.getSignTime());
       vo.setDispatchNo(detail.getDispatchNo());
       vo.setDispatchNo(detail.getDispatchNo());
+        vo.setGroupNo(detail.getGroupNo());
         vo.setBusNumber(detail.getBusNumber());
         vo.setBusNumber(detail.getBusNumber());
         vo.setDriverName(detail.getDriverName());
         vo.setDriverName(detail.getDriverName());
         vo.setDriverPhone(detail.getDriverPhone());
         vo.setDriverPhone(detail.getDriverPhone());

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

@@ -38,25 +38,28 @@ public class OrderJzDetailExportVO {
     @ExcelProperty(value = "分车号", index = 9)
     @ExcelProperty(value = "分车号", index = 9)
     private String dispatchNo;
     private String dispatchNo;
 
 
-    @ExcelProperty(value = "车牌号", index = 10)
+    @ExcelProperty(value = "分车组团号", index = 10)
+    private String groupNo;
+
+    @ExcelProperty(value = "车牌号", index = 11)
     private String busNumber;
     private String busNumber;
 
 
-    @ExcelProperty(value = "司机姓名", index = 11)
+    @ExcelProperty(value = "司机姓名", index = 12)
     private String driverName;
     private String driverName;
 
 
-    @ExcelProperty(value = "司机联系电话", index = 12)
+    @ExcelProperty(value = "司机联系电话", index = 13)
     private String driverPhone;
     private String driverPhone;
 
 
-    @ExcelProperty(value = "接站人员", index = 13)
+    @ExcelProperty(value = "接站人员", index = 14)
     private String receiverName;
     private String receiverName;
 
 
-    @ExcelProperty(value = "接站人电话", index = 14)
+    @ExcelProperty(value = "接站人电话", index = 15)
     private String receiverPhone;
     private String receiverPhone;
 
 
-    @ExcelProperty(value = "分车情况", index = 15)
+    @ExcelProperty(value = "分车情况", index = 16)
     private String dispatchRemark;
     private String dispatchRemark;
 
 
-    @ExcelProperty(value = "预约情况", index = 16)
+    @ExcelProperty(value = "预约情况", index = 17)
     private String reservationInfo;
     private String reservationInfo;
 
 
 }
 }

+ 29 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/app/order/FileDeal.java

@@ -0,0 +1,29 @@
+package com.yc.ship.module.trade.controller.app.order;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+
+public  class FileDeal {
+	public  static String fileRead(File fl) {
+		StringBuilder result = new StringBuilder();
+		BufferedReader br;
+		if (!fl.exists()) {
+			System.err.println("文件不存在!");
+		}
+		try {
+			br = new BufferedReader(new FileReader(fl.getAbsolutePath()));
+			String s = null;
+			while ((s = br.readLine()) != null) {
+				result.append(s);
+			}
+			br.close();
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return result.toString();
+	}
+}

+ 148 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/app/order/TradeOrderController.java

@@ -10,11 +10,19 @@ import com.yc.ship.module.trade.service.refund.TradeRefundService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.dom4j.Document;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.SAXReader;
+import org.dom4j.io.XMLWriter;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import javax.validation.Valid;
 import javax.validation.Valid;
+import java.io.*;
+import java.net.Socket;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.Map;
 import java.util.Map;
 
 
 import static com.yc.ship.framework.operatelog.core.enums.OperateTypeEnum.TRADE;
 import static com.yc.ship.framework.operatelog.core.enums.OperateTypeEnum.TRADE;
@@ -98,4 +106,144 @@ public class TradeOrderController {
         return commonResult;
         return commonResult;
     }
     }
 
 
+
+    @GetMapping("/test")
+    @Operation(summary = "测试报文发送")
+    @OperateLog(type = TRADE)
+    public String test() {
+        try {
+            String serverAddress = "10.1.10.105";
+            // 服务器地址
+            int serverPort = 15999;
+            // 服务器端口号
+            // 1. 获取当前时间,用于组装公共包头流水与日期
+            Date now = new Date();
+            String reqDate = new SimpleDateFormat("yyyyMMdd").format(now);
+            String reqTime = new SimpleDateFormat("HHmmss").format(now);
+            // 构造请求方流水号 (保证唯一性)
+            String reqSeqNo = new SimpleDateFormat("yyyyMMddHHmmss").format(now) + "0001";
+//            File socketDataFile = new File("/data/publish/yl-ota/a.xml");
+//            if (!socketDataFile.exists()) {
+//                System.err.println("输入文件路径不存在!");
+//                return "输入文件路径不存在!";
+//            }
+//            //1。读取上送文件
+//            String xmlData = FileDeal.fileRead(socketDataFile);
+//        String xmlData = "<ap>\n" +
+//                "    <CCTransCode>CMLT40</CCTransCode>\n" +
+//                "    <Corp>\n" +
+//                "        <DbLogAccName>测试2</DbLogAccName>\n" +
+//                "        <IntTyp>2</IntTyp>\n" +
+//                "        <DbIntType>V</DbIntType>\n" +
+//                "        <DbRatType>0</DbRatType>\n" +
+//                "        <DbAddType>C1</DbAddType>\n" +
+//                "        <DbRatAdd>1</DbRatAdd>\n" +
+//                "        <CrIntType>V</CrIntType>\n" +
+//                "        <CrAddType>C1</CrAddType>\n" +
+//                "        <CrRatType>00002000</CrRatType>\n" +
+//                "        <CrRatAdd>0</CrRatAdd>\n" +
+//                "        <PmtHd>01</PmtHd>\n" +
+//                "        <ActInf>1</ActInf>\n" +
+//                "    </Corp>\n" +
+//                "    <Cmp>\n" +
+//                "        <DbProv>17</DbProv>\n" +
+//                "        <DbAccNo>000000</DbAccNo>\n" +
+//                "        <DbCur>CNY</DbCur>\n" +
+//                "        <CrLogAccNo>000000</CrLogAccNo>\n" +
+//                "        <DbLogAccNo>000000</DbLogAccNo>\n" +
+//                "        <LogAccBkOInd>1</LogAccBkOInd>\n" +
+//                "        <AuthAmt>1000</AuthAmt>\n" +
+//                "        <StatInd>1</StatInd>\n" +
+//                "    </Cmp>\n" +
+//                "</ap>"; // XML数据字符串(如上所示)
+            String xmlData = "<ap>\n" +
+                    "  <CCTransCode>CMLT40</CCTransCode>\n" +
+                    "  <ProductID>ICC</ProductID>\n" +
+                    "  <ChannelType>ERP</ChannelType>\n" +
+                    "  <CorpNo>17999953800000028</CorpNo>\n" +
+                    "  <OpNo></OpNo>\n" +
+                    "  <AuthNo></AuthNo>\n" +
+                    "  <ReqSeqNo>" + reqSeqNo + "</ReqSeqNo>\n" +
+                    "  <ReqDate>" + reqDate + "</ReqDate>\n" +
+                    "  <ReqTime>" + reqTime + "</ReqTime>\n" +
+                    "  <Sign></Sign>\n" +
+                    "  <Corp>\n" +
+                    "    <DbLogAccName>1</DbLogAccName>\n" +
+                    "    <IntTyp>0</IntTyp>\n" +
+                    "    <DbIntType>F</DbIntType>\n" +
+                    "    <DbRit>0.00</DbRit>\n" +
+                    "    <DbAddType>1</DbAddType>\n" +
+                    "    <DbRatType>00002000</DbRatType>\n" +
+                    "    <DbRatPct>0.00</DbRatPct>\n" +
+                    "    <DbRatAdd>0.00</DbRatAdd>\n" +
+                    "    <CrIntType>F</CrIntType>\n" +
+                    "    <CrRit>0.00</CrRit>\n" +
+                    "    <CrAddType>1</CrAddType>\n" +
+                    "    <CrRatType>00002000</CrRatType>\n" +
+                    "    <CrRatPct>0.00</CrRatPct>\n" +
+                    "    <CrRatAdd>0.00</CrRatAdd>\n" +
+                    "    <PmtHd>01</PmtHd>\n" +
+                    "    <ActInf>0</ActInf>\n" +
+                    "  </Corp>\n" +
+                    "  <Cmp>\n" +
+                    "    <DbProv>17</DbProv>\n" +
+                    "    <DbAccNo>342101046484369</DbAccNo>\n" +
+                    "    <DbCur>01</DbCur>\n" +
+                    "    <CrLogAccNo>0000000000</CrLogAccNo>\n" +
+                    "    <LogAccBkOInd>0</LogAccBkOInd>\n" +
+                    "  </Cmp>\n" +
+                    "</ap>";
+
+            // 3. 按照约定编码报文 (ERP上送报文必须为GBK字符集)
+            byte[] xmlBytes = xmlData.getBytes("GBK");
+
+            // 4. 构造7字节包头
+            // 第1字节为加密标志(0-不加密),后6字节为数据包长度(包含加密标志位),不足6位在右边用空格补足
+            int packetLen = xmlBytes.length + 1;
+            String lengthStr = String.format("%-6s", packetLen);
+            String headerStr = "0" + lengthStr;
+            byte[] headerBytes = headerStr.getBytes("GBK");
+
+            // 拼接完整的待发送字节数组
+            byte[] fullPacket = new byte[headerBytes.length + xmlBytes.length];
+            System.arraycopy(headerBytes, 0, fullPacket, 0, headerBytes.length);
+            System.arraycopy(xmlBytes, 0, fullPacket, headerBytes.length, xmlBytes.length);
+
+            Socket socket = new Socket(serverAddress, serverPort);
+            // 连接成功后的处理逻辑
+            OutputStream outputStream = socket.getOutputStream();
+            outputStream.write(fullPacket);
+            outputStream.flush();
+
+            BufferedReader clientInBufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));
+            String clinetInStr = null;
+            String clinetInStrData = null;
+            while ((clinetInStrData = clientInBufferedReader.readLine()) != null) {
+                clinetInStr = clinetInStr + clinetInStrData;
+            }
+            System.err.println(clinetInStr);
+            socket.close();
+            SAXReader sax = new SAXReader();
+            Document inClinetDoc = sax.read(new StringReader(clinetInStr.substring(clinetInStr.indexOf("<"))));
+            String formatReDoc = null;
+            if (inClinetDoc != null) {
+                StringWriter strWriter = new StringWriter();
+                OutputFormat format = new OutputFormat("  ", true);
+                format.setNewLineAfterDeclaration(false);
+                XMLWriter writer = new XMLWriter(strWriter, format);
+                writer.write(inClinetDoc);
+                writer.flush();
+                writer.close();
+                formatReDoc = strWriter.getBuffer().toString();
+                System.err.println("返回报文:" + clinetInStr);
+                String txa_return_data = "返回报文:" + "\n" + clinetInStr.substring(0, clinetInStr.indexOf("<")) + formatReDoc;
+                System.err.println(txa_return_data);
+                return txa_return_data;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "失败";
+    }
+
 }
 }

+ 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.common.pojo.PageResult;
 import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
 import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
 import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
 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.controller.admin.orderjzdetail.vo.OrderJzDetailPageReqVO;
 import com.yc.ship.module.trade.dal.dataobject.orderjzdetail.OrderJzDetailDO;
 import com.yc.ship.module.trade.dal.dataobject.orderjzdetail.OrderJzDetailDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 
 
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
@@ -63,6 +65,19 @@ public interface OrderJzDetailMapper extends BaseMapperX<OrderJzDetailDO> {
 
 
   Long cleanSign(@Param("id") String id);
   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);
   IPage<OrderJzDetailDO> selectGiftPage(IPage<OrderJzDetailDO> page, @Param("vo") OrderJzDetailPageReqVO vo);

+ 3 - 2
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/handler/InsuranceHandler.java

@@ -38,8 +38,9 @@ public class InsuranceHandler implements TradeOrderHandler{
     @Override
     @Override
     public void afterProcessSuccess(TradeOrderDO tradeOrderDO) {
     public void afterProcessSuccess(TradeOrderDO tradeOrderDO) {
         try {
         try {
-            log.error("开始处理出票成功投保业务"+tradeOrderDO.getId());
-            insure(tradeOrderDO);
+            //订单任务统一处理
+//            log.error("开始处理出票成功投保业务"+tradeOrderDO.getId());
+//            insure(tradeOrderDO);
         }catch (Exception e){
         }catch (Exception e){
             log.error("投保异常",e);
             log.error("投保异常",e);
         }
         }

+ 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.insurance.InsuranceMapper;
 import com.yc.ship.module.trade.dal.mysql.order.*;
 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.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.enums.*;
 import com.yc.ship.module.trade.service.order.TradeOrderRepositoryService;
 import com.yc.ship.module.trade.service.order.TradeOrderRepositoryService;
 import com.yc.ship.module.trade.service.order.bo.*;
 import com.yc.ship.module.trade.service.order.bo.*;
@@ -66,6 +68,8 @@ public class TradeOrderRepositoryServiceImpl implements TradeOrderRepositoryServ
     @Resource
     @Resource
     private OrderJzMapper orderJzMapper;
     private OrderJzMapper orderJzMapper;
     @Resource
     @Resource
+    private OrderJzDetailMapper orderJzDetailMapper;
+    @Resource
     private TradeDetailMapper tradeDetailMapper;
     private TradeDetailMapper tradeDetailMapper;
     @Resource
     @Resource
     private TradeDetailBaseMapper tradeDetailBaseMapper;
     private TradeDetailBaseMapper tradeDetailBaseMapper;
@@ -145,12 +149,51 @@ public class TradeOrderRepositoryServiceImpl implements TradeOrderRepositoryServ
     public void modifyOrder(TradeOrderBO tradeOrderBO,TradeOrderDO oldOrder) {
     public void modifyOrder(TradeOrderBO tradeOrderBO,TradeOrderDO oldOrder) {
         try {
         try {
             Long oldOrderId = oldOrder.getId();
             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);
             tradeOrderMapper.updateOrderDeleted(oldOrderId,1);
             TradeOrderDO tradeOrderDO = tradeOrderBO.getTradeOrderDO();
             TradeOrderDO tradeOrderDO = tradeOrderBO.getTradeOrderDO();
             tradeOrderDO.setUpdateTime(LocalDateTime.now());
             tradeOrderDO.setUpdateTime(LocalDateTime.now());
             tradeOrderMapper.insert(tradeOrderDO);
             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));
             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) {
             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
     @Override
     public void updateOrderStatus(TradeOrderDO tradeOrderDO) {
     public void updateOrderStatus(TradeOrderDO tradeOrderDO) {
         //订单状态
         //订单状态

+ 3 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeOrderServiceImpl.java

@@ -194,6 +194,9 @@ public class TradeOrderServiceImpl implements TradeOrderService {
             if (tradeOrderRespVO.getReadUser() != null) {
             if (tradeOrderRespVO.getReadUser() != null) {
                 tradeOrderRespVO.setReadUserName(userMap.get(tradeOrderRespVO.getReadUser()));
                 tradeOrderRespVO.setReadUserName(userMap.get(tradeOrderRespVO.getReadUser()));
             }
             }
+            if (tradeOrderRespVO.getSellerId() != null) {
+                tradeOrderRespVO.setSellerName(userMap.get(tradeOrderRespVO.getSellerId()));
+            }
             Integer payStatus = tradeOrderRespVO.getPayStatus();
             Integer payStatus = tradeOrderRespVO.getPayStatus();
             if (payStatus != null && payStatus == 1) {
             if (payStatus != null && payStatus == 1) {
                 tradeOrderRespVO.setLoadPayAmount(BigDecimal.ZERO);
                 tradeOrderRespVO.setLoadPayAmount(BigDecimal.ZERO);

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

@@ -1970,6 +1970,14 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         }
         }
         int auditType = 0;
         int auditType = 0;
         String orderNo = tradeOrderDO.getOrderNo();
         String orderNo = tradeOrderDO.getOrderNo();
+        Long oldvoyageId = tradeOrderDO.getVoyageId();
+        Long newvoyageId = createVO.getVoyageId();
+        if (newvoyageId == null) {
+            return CommonResult.error(ORDER_NOT_VOYAGE);
+        }
+        if(!Objects.equals(oldvoyageId, newvoyageId)){
+            return CommonResult.error(ORDER_NOT_VOYAGE_CHANGE);
+        }
         //现在给整个订单号的加锁
         //现在给整个订单号的加锁
         String lockKey = String.format(ProductRedisKeyConstants.ORDER_REDIS_KEY_PREFIX, orderNo);
         String lockKey = String.format(ProductRedisKeyConstants.ORDER_REDIS_KEY_PREFIX, orderNo);
         RLock lock = redissonClient.getLock(lockKey);
         RLock lock = redissonClient.getLock(lockKey);

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

@@ -1511,7 +1511,7 @@
     </update>
     </update>
 
 
     <update id="updateOrderDeleted">
     <update id="updateOrderDeleted">
-        UPDATE trade_order SET deleted = #{deleted},update_time = now(), sync_status = '0' WHERE id = #{orderId}
+        UPDATE trade_order SET deleted = #{deleted}, sync_status = '0' WHERE id = #{orderId}
     </update>
     </update>
 
 
     <resultMap id="OrderAndDetailResultMap" type="com.yc.ship.module.trade.controller.admin.order.vo.order.TradeOrderPdaRespVO">
     <resultMap id="OrderAndDetailResultMap" type="com.yc.ship.module.trade.controller.admin.order.vo.order.TradeOrderPdaRespVO">