Browse Source

修改订单保存历史记录,订单表id不变

caotao 2 tuần trước cách đây
mục cha
commit
10209291fd

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

@@ -43,10 +43,12 @@ import com.yc.ship.module.his.dal.dataobject.tradedetailbase.HisTradeDetailBaseD
 import com.yc.ship.module.his.dal.dataobject.tradeorder.HisTradeOrderDO;
 import com.yc.ship.module.his.dal.dataobject.tradeordercountry.HisTradeOrderCountryDO;
 import com.yc.ship.module.his.dal.dataobject.tradeorderfloor.HisTradeOrderFloorDO;
+import com.yc.ship.module.his.dal.dataobject.tradeOrderPolicy.HisTradeOrderPolicyDO;
 import com.yc.ship.module.his.dal.dataobject.tradeorderroommodel.HisTradeOrderRoomModelDO;
 import com.yc.ship.module.his.dal.dataobject.tradeordertotal.HisTradeOrderTotalDO;
 import com.yc.ship.module.his.dal.dataobject.tradeorderuser.HisTradeOrderUserDO;
 import com.yc.ship.module.his.dal.dataobject.tradevisitor.HisTradeVisitorDO;
+import com.yc.ship.module.his.dal.mysql.tradeOrderPolicy.HisTradeOrderPolicyMapper;
 import com.yc.ship.module.his.dal.mysql.tradedetail.HisTradeDetailMapper;
 import com.yc.ship.module.his.dal.mysql.tradedetailbase.HisTradeDetailBaseMapper;
 import com.yc.ship.module.his.dal.mysql.tradeorder.HisTradeOrderMapper;
@@ -56,14 +58,6 @@ import com.yc.ship.module.his.dal.mysql.tradeorderroommodel.HisTradeOrderRoomMod
 import com.yc.ship.module.his.dal.mysql.tradeordertotal.HisTradeOrderTotalMapper;
 import com.yc.ship.module.his.dal.mysql.tradeorderuser.HisTradeOrderUserMapper;
 import com.yc.ship.module.his.dal.mysql.tradevisitor.HisTradeVisitorMapper;
-import com.yc.ship.module.his.service.tradedetail.HisTradeDetailService;
-import com.yc.ship.module.his.service.tradedetailbase.HisTradeDetailBaseService;
-import com.yc.ship.module.his.service.tradeordercountry.HisTradeOrderCountryService;
-import com.yc.ship.module.his.service.tradeorderfloor.HisTradeOrderFloorService;
-import com.yc.ship.module.his.service.tradeorderroommodel.HisTradeOrderRoomModelService;
-import com.yc.ship.module.his.service.tradeordertotal.HisTradeOrderTotalService;
-import com.yc.ship.module.his.service.tradeorderuser.HisTradeOrderUserService;
-import com.yc.ship.module.his.service.tradevisitor.HisTradeVisitorService;
 import com.yc.ship.module.infra.api.config.ConfigApi;
 import com.yc.ship.module.marketing.api.policy.PolicyApi;
 import com.yc.ship.module.member.api.address.MemberAddressApi;
@@ -194,6 +188,8 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
     @Resource
     private PolicyApi policyApi;
     @Resource
+    private HisTradeOrderPolicyMapper hisTradeOrderPolicyMapper;
+    @Resource
     private NotifyMessageSendApi notifyMessageSendApi;
 
     @Resource
@@ -304,7 +300,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
     @Resource
     private ConfigUtils configUtils;
 
-
     public final static String AGENCY_LOGIN_INFO = "agencyLoginInfo";
 
 
@@ -2530,7 +2525,9 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
     @Transactional(rollbackFor = Exception.class)
     @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ORDER_MODIFY)
     public CommonResult<?> motifyOtcOrder(LoginUser loginUser, TradeOrderOtcCreateVO createVO) {
+        // 获取分销商id
         Long distributorId = createVO.getDistributorId() != null ? createVO.getDistributorId() : loginUser.getDistributorId();
+        // 获取门店id
         Long storeId = createVO.getStoreId() != null ? createVO.getStoreId() : loginUser.getStoreId();
         //获取当前分销商信息
         if (distributorId == null) {
@@ -2546,21 +2543,26 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         if (storeId != null) {
             storeInfo = storeApi.getStoreInfo(storeId);
         }
+        // 查询订单信息
         Long orderId = createVO.getOrderId();
         TradeOrderDO tradeOrderDO = tradeOrderMapper.selectById(orderId);
         if (tradeOrderDO == null) {
             return CommonResult.error(ORDER_NOT_EXIST);
         }
+        // 判断订单是否开票,开票则不允许修改
         if (tradeOrderDO.getIsInvoice() != null && tradeOrderDO.getIsInvoice() == 1) {
             return CommonResult.error(ORDER_ISINVOICE);
         }
+        // 审核类型:0-无需审核,2-二级审核,3-三级审核,4-四级审核
         int auditType = 0;
         String orderNo = tradeOrderDO.getOrderNo();
         Long oldvoyageId = tradeOrderDO.getVoyageId();
         Long newvoyageId = createVO.getVoyageId();
+        // 航次ID
         if (newvoyageId == null) {
             return CommonResult.error(ORDER_NOT_VOYAGE);
         }
+        // 不允许修改航次
         if(!Objects.equals(oldvoyageId, newvoyageId)){
             return CommonResult.error(ORDER_NOT_VOYAGE_CHANGE);
         }
@@ -2570,6 +2572,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         try {
             lock.lock(60, TimeUnit.SECONDS);
             Date updateTime = new Date();
+            // 构建创建订单的参数
             ShipTradeOrderCreateReqVO shipTradeOrderCreateReqVO = BeanUtils.toBean(createVO, ShipTradeOrderCreateReqVO.class);
             shipTradeOrderCreateReqVO.setDistributorId(loginUser.getDistributorId());
             shipTradeOrderCreateReqVO.setGroupNo(createVO.getGroupNo());
@@ -2578,6 +2581,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             shipTradeOrderCreateReqVO.setDeposi(createVO.getSummary().getDeposi());
             shipTradeOrderCreateReqVO.setOrderSort(tradeOrderDO.getOrderSort());
             shipTradeOrderCreateReqVO.setIsRead(0);
+            // 订单金额
             TradeOrderTotalVO summary = createVO.getSummary();
             BigDecimal realAmount = summary.getRealMoney()==null?BigDecimal.ZERO:summary.getRealMoney()  ;
             BigDecimal orderMoney = summary.getOrderMoney();
@@ -2585,6 +2589,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             shipTradeOrderCreateReqVO.setAmount(orderMoney);
             shipTradeOrderCreateReqVO.setPayAmount(realAmount);
             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());
@@ -2594,6 +2599,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 tradeOrderBindDO.setRemark("modify订单金额修改,订单金额:" + orderMoney + ",订单修改后实际金额:" + realAmount);
                 shipTradeOrderCreateReqVO.setTradeOrderBindDO(tradeOrderBindDO);
             } else if (createVO.getSummary().getDeposi() != null && shipTradeOrderCreateReqVO.getDeposi().compareTo(tradeOrderDO.getDeposi())!=0) {
+                // 判断定金金额是否发生变化,记录变更日志
                 //shipTradeOrderCreateReqVO.setConfirmType(1);
                 TradeOrderBindDO tradeOrderBindDO = new TradeOrderBindDO();
                 tradeOrderBindDO.setId(IdWorker.getId());
@@ -2604,6 +2610,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 shipTradeOrderCreateReqVO.setTradeOrderBindDO(tradeOrderBindDO);
                 shipTradeOrderCreateReqVO.setDeposiStatus(1);
             }else if (!createVO.getPolicyList().isEmpty()) {
+                // 判断是否提交了营销政策,记录变更日志
                 //shipTradeOrderCreateReqVO.setConfirmType(1);
                 TradeOrderBindDO tradeOrderBindDO = new TradeOrderBindDO();
                 tradeOrderBindDO.setId(IdWorker.getId());
@@ -2622,6 +2629,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             if (createVO.getSummary().getRealOrderMoney() != null) {
                 shipTradeOrderCreateReqVO.setPayAmount(createVO.getSummary().getRealOrderMoney());
             }
+            // 设置订单联系人信息
             ShipTradeOrderCreateReqVO.OrderUser orderUser = new ShipTradeOrderCreateReqVO.OrderUser();
             orderUser.setContactName(createVO.getLinkMan());
             orderUser.setMobile(createVO.getLinkMobile());
@@ -2631,7 +2639,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             shipTradeOrderCreateReqVO.setIsYd(createVO.getIsYd());
             shipTradeOrderCreateReqVO.setTravelDate(createVO.getBoardingTime());
             shipTradeOrderCreateReqVO.setOrderNo(orderNo);
-
+            // 设置订单属性
             ShipTradeOrderCreateReqVO.OrderProperty orderProperty = new ShipTradeOrderCreateReqVO.OrderProperty();
             orderProperty.setSellMethod(SellMethodEnum.OTC.getType());
             orderProperty.setSourceId(distributorDO.getId() + "");
@@ -2640,18 +2648,21 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 orderProperty.setStoreId(storeInfo.getId());
                 orderProperty.setStoreName(storeInfo.getName());
             }
+            // 构建订单明细
             orderProperty.setSellMethod(SellMethodEnum.OTC.getType());
             shipTradeOrderCreateReqVO.setOrderProperty(orderProperty);
             ShipTradeOrderCreateReqVO.OrderItem orderItem = new ShipTradeOrderCreateReqVO.OrderItem();
             List<ShipTradeOrderCreateReqVO.OrderDetail> detailList = new ArrayList<>();
             ShipTradeOrderCreateReqVO.OrderDetail orderDetail = new ShipTradeOrderCreateReqVO.OrderDetail();
+            // 处理游客信息
             for (TradeVistorReqVO tradeVistorReqVO : createVO.getTourist()) {
                 List<ShipTradeOrderCreateReqVO.Visitor> visitorList = new ArrayList<>();
                 ShipTradeOrderCreateReqVO.OrderDetail visitorDetailId = new ShipTradeOrderCreateReqVO.OrderDetail();
-                BeanUtils.copyProperties(orderDetail, ShipTradeOrderCreateReqVO.OrderDetail.class);
+//                BeanUtils.copyProperties(orderDetail, ShipTradeOrderCreateReqVO.OrderDetail.class);
                 visitorDetailId.setPrice(tradeVistorReqVO.getPrice());
                 visitorDetailId.setOriginPrice(tradeVistorReqVO.getPrice());
                 visitorDetailId.setProductType(0);
+                visitorDetailId.setVisitorId(Long.valueOf(tradeVistorReqVO.getId()));
                 visitorDetailId.setBoardingTime(createVO.getBoardingTime());
                 visitorDetailId.setLeaveTime(createVO.getLeaveTime());
                 ShipTradeOrderCreateReqVO.Visitor visitor = getVisitor1(tradeVistorReqVO);
@@ -2663,6 +2674,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 visitorDetailId.setProductType(0);
                 detailList.add(visitorDetailId);
             }
+            // 处理附加产品
             BigDecimal spuMoney = new BigDecimal(0);
             for (TradeSpuReqVO tradeSpuReqVO : createVO.getSpuList()) {
                 ShipTradeOrderCreateReqVO.OrderDetail orderDetail1 = new ShipTradeOrderCreateReqVO.OrderDetail();
@@ -2682,6 +2694,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                     BigDecimal price = tradeSpuReqVO.getPrice() == null ? BigDecimal.ZERO : tradeSpuReqVO.getPrice();
                     spuMoney = spuMoney.add(price);
                 }
+                orderDetail1.setId(tradeSpuReqVO.getId());
                 orderDetail1.setVisitorList(visitorList1);
                 orderDetail1.setProductId(tradeSpuReqVO.getProductId() + "");
                 orderDetail1.setPrice(tradeSpuReqVO.getPrice());
@@ -2694,6 +2707,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             orderItem.setDetailList(detailList);
             shipTradeOrderCreateReqVO.setItemlList(Collections.singletonList(orderItem));
             shipTradeOrderCreateReqVO.setSpuAmount(spuMoney);
+            // 验证修改时间是否在允许范围内
             Date travelDate = tradeOrderDO.getTravelDate();
             if (loginUser.getDistributorId() != null && DateUtil.compare(DateUtil.beginOfDay(travelDate), DateUtil.offsetDay(new Date(), 3)) < 0) {
                 return CommonResult.error(500, "已过最晚修改时间");
@@ -2704,8 +2718,10 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             }
             shipTradeOrderCreateReqVO.setUpdateTime(updateTime);
             shipTradeOrderCreateReqVO.setOldtradeOrderDO(tradeOrderDO);
+            // 查询旧的订单汇总信息
             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);
@@ -2753,27 +2769,48 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             Long neworderId = result.getCheckedData().getOrderId();
             Integer neworderStatus = result.getCheckedData().getOrderStatus();
             String content  = result.getCheckedData().getContent();
-
-            tradeOrderTotalMapper.update(new LambdaUpdateWrapper<TradeOrderTotalDO>()
-                    .set(TradeOrderTotalDO::getDeleted, 1)
-                    .set(TradeOrderTotalDO::getUpdateTime, updateTime)
-                    .eq(TradeOrderTotalDO::getOldOrderId, orderId)
-            );
-            tradeOrderTotalDO.setId(IdWorker.getId());
-            tradeOrderTotalDO.setOldOrderId(neworderId);
-            tradeOrderTotalMapper.insert(tradeOrderTotalDO);
-
-            //创建订单房型数据
-            List<TradeOrderRoomModelDO> list = new ArrayList<>();
-            List<TradeOrderRoomModelVO> roomModelList = createVO.getRoomModelList();
-            roomModelList.forEach(item -> {
-                TradeOrderRoomModelDO tradeOrderRoomModelDO = BeanUtils.toBean(item, TradeOrderRoomModelDO.class);
-                tradeOrderRoomModelDO.setId(IdWorker.getId());
-                tradeOrderRoomModelDO.setOrderId(neworderId);
-                tradeOrderRoomModelDO.setDiscount(tradeOrderRoomModelDO.getUnitPrice().subtract(tradeOrderRoomModelDO.getRealMoney()));
-                tradeOrderRoomModelDO.setOrderNo(orderNo);
-                list.add(tradeOrderRoomModelDO);
-            });
+            HisTradeOrderTotalDO latestHisRecord = hisTradeOrderTotalMapper.selectOne(new LambdaQueryWrapper<HisTradeOrderTotalDO>()
+                    .eq(HisTradeOrderTotalDO::getId, oldTradeOrderTotal.getId())
+                    .orderByDesc(HisTradeOrderTotalDO::getVersion)
+                    .last("limit 1"));
+            HisTradeOrderTotalDO hisTradeOrderTotalDO = new HisTradeOrderTotalDO();
+
+            BeanUtils.copyProperties(oldTradeOrderTotal,hisTradeOrderTotalDO);
+            hisTradeOrderTotalDO.setHisId(IdWorker.getId());
+            hisTradeOrderTotalDO.setCurrentVersion(1);
+            if(latestHisRecord!=null){
+                // 版本号加1
+                hisTradeOrderTotalDO.setVersion(latestHisRecord.getVersion()+1);
+            }
+            // 将历史订单汇总表其他数据的当前版本
+            hisTradeOrderTotalMapper.update(new LambdaUpdateWrapper<HisTradeOrderTotalDO>()
+                    .set(HisTradeOrderTotalDO::getCurrentVersion, 0)
+                    .set(HisTradeOrderTotalDO::getUpdateTime, updateTime)
+                    .eq(HisTradeOrderTotalDO::getId, oldTradeOrderTotal.getId()));
+            hisTradeOrderTotalMapper.insert(hisTradeOrderTotalDO);
+
+            // 20260427 以前删除逻辑
+//            tradeOrderTotalMapper.update(new LambdaUpdateWrapper<TradeOrderTotalDO>()
+//                    .set(TradeOrderTotalDO::getDeleted, 1)
+//                    .set(TradeOrderTotalDO::getUpdateTime, updateTime)
+//                    .eq(TradeOrderTotalDO::getOldOrderId, orderId)
+//            );
+            tradeOrderTotalDO.setId(oldTradeOrderTotal.getId());
+            tradeOrderTotalDO.setOldOrderId(orderId);
+            tradeOrderTotalMapper.updateById(tradeOrderTotalDO);
+            // 处理订单房型数据
+            updateRoomModel(createVO.getRoomModelList(),orderId,orderNo);
+//            //创建订单房型数据
+//            List<TradeOrderRoomModelDO> list = new ArrayList<>();
+//            List<TradeOrderRoomModelVO> roomModelList = createVO.getRoomModelList();
+//            roomModelList.forEach(item -> {
+//                TradeOrderRoomModelDO tradeOrderRoomModelDO = BeanUtils.toBean(item, TradeOrderRoomModelDO.class);
+//                tradeOrderRoomModelDO.setId(IdWorker.getId());
+//                tradeOrderRoomModelDO.setOrderId(orderId);
+//                tradeOrderRoomModelDO.setDiscount(tradeOrderRoomModelDO.getUnitPrice().subtract(tradeOrderRoomModelDO.getRealMoney()));
+//                tradeOrderRoomModelDO.setOrderNo(orderNo);
+//                list.add(tradeOrderRoomModelDO);
+//            });
             BigDecimal oldleaderAmount = oldTradeOrderTotal.getLeaderAmount();
             BigDecimal oldwithAmount = oldTradeOrderTotal.getWithAmount();
             BigDecimal oldotherMoney = oldTradeOrderTotal.getOtherMoney();
@@ -2786,10 +2823,23 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             //1.先删除原来的
             List<OrderPolicyDO> orderPolicyList = orderPolicyMapper.selectList(OrderPolicyDO::getOrderId, orderId);
             boolean isAudit = true;
-            orderPolicyMapper.deleteByOrderId(orderId);
+//            orderPolicyMapper.deleteByOrderId(orderId);
+            insertHisOrderPolicy(orderPolicyList,orderId);
             List<OrderPolicyDO> orderPolicyDOList = new ArrayList<>();
             List<TradeOrderPolicyReqVO> policyList = createVO.getPolicyList();
+            List<OrderPolicyDO> insetOrderPolicyDOList = new ArrayList<>();
+            List<OrderPolicyDO> updateOrderPolicyDOList = new ArrayList<>();
             if (policyList != null) {
+                // 传入的优惠政策id
+                List<Long> newIds = CollUtil.emptyIfNull(policyList).stream()
+                        .map(TradeOrderPolicyReqVO::getId)
+                        .filter(Objects::nonNull)
+                        .collect(Collectors.toList());
+                // 找出需要删除的优惠政策(数据库中存在但新数据中不存在的)
+                List<Long> deleteOrderPolicyIds = orderPolicyList.stream()
+                        .map(OrderPolicyDO::getId)
+                        .filter(id -> !newIds.contains(id))
+                        .collect(Collectors.toList());
                 policyList.forEach(policy -> {
                     OrderPolicyDO orderPolicyDO = new OrderPolicyDO();
                     orderPolicyDO.setOrderId(orderId);
@@ -2810,21 +2860,31 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                     }
                     orderPolicyDO.setAmount(policy.getAmount());
                     orderPolicyDO.setRooms(policy.getRooms());
-                    orderPolicyDOList.add(orderPolicyDO);
+                    if(policy.getId()!=null){
+                        orderPolicyDO.setId(policy.getId());
+                        updateOrderPolicyDOList.add(orderPolicyDO);
+                    }else{
+                        insetOrderPolicyDOList.add(orderPolicyDO);
+                    }
+//                    orderPolicyDOList.add(orderPolicyDO);
                 });
-                if (!orderPolicyDOList.isEmpty()) {
+                if (!updateOrderPolicyDOList.isEmpty()) {
+                    orderPolicyMapper.updateBatch(updateOrderPolicyDOList);
+                    orderPolicyDOList.addAll(updateOrderPolicyDOList);
+                }
+                if(!insetOrderPolicyDOList.isEmpty()){
+                    orderPolicyMapper.insertBatch(insetOrderPolicyDOList);
+                    orderPolicyDOList.addAll(insetOrderPolicyDOList);
+                }
+                if(!orderPolicyDOList.isEmpty()){
                     //TODO: 判断优惠政策是否需要审核
-                    String changedFields11 = com.yc.ship.module.trade.utils.BeanUtils.getChangedFields(orderPolicyList, orderPolicyDOList);
+                    String changedFields11 = com.yc.ship.module.trade.utils.BeanUtils.getChangedFields(orderPolicyList, updateOrderPolicyDOList);
                     if(StringUtils.isEmpty(changedFields11)){
                         isAudit = false;
                     }
-                    orderPolicyMapper.insertBatch(orderPolicyDOList);
                 }
             }
-            tradeOrderRoomModelMapper.deleteByOrderId(orderId);
-            if (!list.isEmpty()) {
-                tradeOrderRoomModelMapper.insertBatch(list);
-            }
+
             String desc = "";
             if (!Objects.equals(shipTradeOrderCreateReqVO.getRemark(), tradeOrderDO.getRemark()) || !Objects.equals(shipTradeOrderCreateReqVO.getLinkMobile(), tradeOrderDO.getLinkMobile()) || !Objects.equals(shipTradeOrderCreateReqVO.getLinkMan(), tradeOrderDO.getLinkMan())) {
                 auditType = 2;
@@ -2940,6 +3000,125 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         }
     }
 
+    /**
+     * 保存历史优惠政策
+     * @param policyList
+     * @param orderId
+     */
+    private void insertHisOrderPolicy(List<OrderPolicyDO> policyList,Long orderId){
+        // 历史优惠政策记录
+        List<HisTradeOrderPolicyDO> hisTradeOrderPolicyDOList = new ArrayList<>();
+        // 获取历史优惠政策中最新的记录
+        HisTradeOrderPolicyDO latestHisTradeOrderPolicy = hisTradeOrderPolicyMapper.selectOne(new LambdaQueryWrapper<HisTradeOrderPolicyDO>()
+                .eq(HisTradeOrderPolicyDO::getOrderId, orderId)
+                .orderByDesc(HisTradeOrderPolicyDO::getVersion)
+                .last("limit 1"));
+        Integer version;
+        if(latestHisTradeOrderPolicy!=null){
+            version = latestHisTradeOrderPolicy.getVersion() + 1;
+        } else {
+            version = 0;
+        }
+        if (CollUtil.isNotEmpty(policyList)) {
+            //创建订单优惠政策数据
+            policyList.forEach(item -> {
+                HisTradeOrderPolicyDO hisTradeOrderPolicyDO = new HisTradeOrderPolicyDO();
+                BeanUtils.copyProperties(item,hisTradeOrderPolicyDO);
+                hisTradeOrderPolicyDO.setHisId(IdWorker.getId());
+                hisTradeOrderPolicyDO.setCurrentVersion(1);
+                hisTradeOrderPolicyDO.setVersion(version);
+                hisTradeOrderPolicyDOList.add(hisTradeOrderPolicyDO);
+
+            });
+        }
+        hisTradeOrderPolicyMapper.update(new LambdaUpdateWrapper<HisTradeOrderPolicyDO>()
+                .set(HisTradeOrderPolicyDO::getCurrentVersion, 0)
+                .set(HisTradeOrderPolicyDO::getUpdateTime, new Date())
+                .eq(HisTradeOrderPolicyDO::getOrderId, orderId));
+        if(!hisTradeOrderPolicyDOList.isEmpty()){
+            hisTradeOrderPolicyMapper.insertBatch(hisTradeOrderPolicyDOList);
+        }
+    }
+
+    /**
+     * 修改订单房型,保存历史房型
+     * @param roomModelList
+     * @param orderId
+     * @param orderNo
+     */
+    private void updateRoomModel(List<TradeOrderRoomModelVO> roomModelList,Long orderId,String orderNo){
+        // 查询现在数据库中的房型数据
+        List<TradeOrderRoomModelDO> tradeOrderRoomModelList = tradeOrderRoomModelMapper.selectListByOrderId(orderId);
+        // 历史房型记录
+        List<HisTradeOrderRoomModelDO> hisTradeOrderRoomModelList = new ArrayList<>();
+        // 获取历史房型中最新的记录
+        HisTradeOrderRoomModelDO latestHisOrderRoomModel = hisTradeOrderRoomModelMapper.selectOne(new LambdaQueryWrapper<HisTradeOrderRoomModelDO>()
+                .eq(HisTradeOrderRoomModelDO::getOrderId, orderId)
+                .orderByDesc(HisTradeOrderRoomModelDO::getVersion)
+                .last("limit 1"));
+        Integer version;
+        if(latestHisOrderRoomModel!=null){
+            version = latestHisOrderRoomModel.getVersion() + 1;
+        } else {
+            version = 0;
+        }
+        // 删除的房型数据
+        if (CollUtil.isNotEmpty(tradeOrderRoomModelList)) {
+            // 获取传入的房型ID列表
+            List<Long> newRoomModelIds = CollUtil.emptyIfNull(roomModelList).stream()
+                    .map(TradeOrderRoomModelVO::getId)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toList());
+
+            // 找出需要删除的房型(数据库中存在但新数据中不存在的)
+            List<Long> deleteRoomModelIds = tradeOrderRoomModelList.stream()
+                    .map(TradeOrderRoomModelDO::getId)
+                    .filter(id -> !newRoomModelIds.contains(id))
+                    .collect(Collectors.toList());
+            tradeOrderRoomModelList.forEach(item -> {
+                HisTradeOrderRoomModelDO hisTradeOrderRoomModelDO = new HisTradeOrderRoomModelDO();
+                BeanUtils.copyProperties(item,hisTradeOrderRoomModelDO);
+                hisTradeOrderRoomModelDO.setHisId(IdWorker.getId());
+                hisTradeOrderRoomModelDO.setCurrentVersion(1);
+                hisTradeOrderRoomModelDO.setVersion(version);
+                hisTradeOrderRoomModelList.add(hisTradeOrderRoomModelDO);
+            });
+            // 执行删除操作
+            if (CollUtil.isNotEmpty(deleteRoomModelIds)) {
+                tradeOrderRoomModelMapper.deleteByIds(deleteRoomModelIds);
+            }
+        }
+        //创建订单房型数据
+        List<TradeOrderRoomModelDO> insetList = new ArrayList<>();
+        List<TradeOrderRoomModelDO> updateList = new ArrayList<>();
+        roomModelList.forEach(item -> {
+            TradeOrderRoomModelDO tradeOrderRoomModelDO = BeanUtils.toBean(item, TradeOrderRoomModelDO.class);
+            tradeOrderRoomModelDO.setSyncStatus("0");
+            tradeOrderRoomModelDO.setOrderId(orderId);
+            tradeOrderRoomModelDO.setDiscount(tradeOrderRoomModelDO.getUnitPrice().subtract(tradeOrderRoomModelDO.getRealMoney()));
+            tradeOrderRoomModelDO.setOrderNo(orderNo);
+            if(tradeOrderRoomModelDO.getId() == null){
+                tradeOrderRoomModelDO.setId(IdWorker.getId());
+                insetList.add(tradeOrderRoomModelDO);
+            }else{
+                updateList.add(tradeOrderRoomModelDO);
+            }
+        });
+        hisTradeOrderRoomModelMapper.update(new LambdaUpdateWrapper<HisTradeOrderRoomModelDO>()
+                .set(HisTradeOrderRoomModelDO::getCurrentVersion, 0)
+                .set(HisTradeOrderRoomModelDO::getUpdateTime, new Date())
+                .eq(HisTradeOrderRoomModelDO::getOrderId, orderId));
+        if(!hisTradeOrderRoomModelList.isEmpty()){
+            hisTradeOrderRoomModelMapper.insertBatch(hisTradeOrderRoomModelList);
+        }
+        if (!insetList.isEmpty()) {
+            tradeOrderRoomModelMapper.insertBatch(insetList);
+        }
+        if (!updateList.isEmpty()) {
+            tradeOrderRoomModelMapper.updateBatch(updateList);
+        }
+    }
+
 
     @Override
     public TradeOrderRespNewVO getOrderInfoNew(Long id) {