From e1284aa3b1b400ecebb59126d7110a3bb4a6b000 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期五, 31 十月 2025 15:46:09 +0800
Subject: [PATCH] 原材料报检拆分功能V1
---
 inspect-server/src/main/java/com/ruoyi/inspect/excel/OrderSplitExcelListener.java               |  146 +++++
 inspect-server/src/main/resources/static/split_order_import_template.xlsx                       |    0 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/api/MesApiUtils.java                          |   93 +++
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java                 |    4 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java    |  181 ++++++
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/IfsSplitOrderRecordMapper.java            |   18 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java               |   15 
 inspect-server/src/main/java/com/ruoyi/inspect/excel/OrderSplitExcelData.java                   |  107 ++++
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java            |  177 ++++++
 inspect-server/src/main/java/com/ruoyi/inspect/aspect/MoveLocationAfterPushMesStockAspect.java  |   88 +++
 basic-server/src/main/resources/mapper/IfsInventoryQuantityMapper.xml                           |   24 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java        |   21 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsSplitOrderRecordServiceImpl.java |   22 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java                     |   12 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java           |    4 
 basic-server/src/main/java/com/ruoyi/basic/vo/IfsInventoryQuantityVO.java                       |   31 +
 inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPlanVO.java                           |    2 
 inspect-server/src/main/resources/mapper/InsSampleMapper.xml                                    |    3 
 inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrder.java                               |    2 
 inspect-server/src/main/java/com/ruoyi/inspect/pojo/IfsSplitOrderRecord.java                    |  157 ++++++
 inspect-server/src/main/resources/mapper/IfsSplitOrderRecordMapper.xml                          |   43 +
 basic-server/src/main/java/com/ruoyi/basic/pojo/IfsInventoryQuantity.java                       |    5 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/RawMaterialOrderController.java       |   44 +
 basic-server/src/main/java/com/ruoyi/basic/mapper/IfsInventoryQuantityMapper.java               |    9 
 inspect-server/src/main/java/com/ruoyi/inspect/dto/OrderSplitDTO.java                           |   34 +
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsReportService.java                    |   15 
 inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java                    |    7 
 ruoyi-admin/src/main/resources/application-ztzb.yml                                             |    6 
 ruoyi-admin/src/main/resources/application-druid.yml                                            |   12 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java           |  111 +---
 ruoyi-common/src/main/java/com/ruoyi/common/utils/http/ParameterEscaperUtil.java                |   92 +++
 inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java             |   23 
 inspect-server/src/main/java/com/ruoyi/inspect/service/IfsSplitOrderRecordService.java          |   13 
 33 files changed, 1,376 insertions(+), 145 deletions(-)
diff --git a/basic-server/src/main/java/com/ruoyi/basic/mapper/IfsInventoryQuantityMapper.java b/basic-server/src/main/java/com/ruoyi/basic/mapper/IfsInventoryQuantityMapper.java
index 1963bb9..1eae395 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/mapper/IfsInventoryQuantityMapper.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/IfsInventoryQuantityMapper.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.basic.dto.IfsInventoryQuantityDto;
 import com.ruoyi.basic.pojo.IfsInventoryQuantity;
+import com.ruoyi.basic.vo.IfsInventoryQuantityVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -24,7 +25,7 @@
      * @param ifsInventoryId
      * @return
      */
-    int selectReportCountById(@Param("ifsInventoryId") Integer ifsInventoryId);
+    int selectReportCountById(@Param("ifsInventoryId") Long ifsInventoryId);
 
 
     /**
@@ -39,4 +40,10 @@
                           @Param("supplierName") String supplierName,
                           @Param("startOfNextQuarter") LocalDateTime startOfNextQuarter,
                           @Param("endOfQuarter") LocalDateTime endOfQuarter);
+
+    List<IfsInventoryQuantityVO> selectSplitOrderList(@Param("partNo")String partNo,
+                                                      @Param("lineNo")String lineNo,
+                                                      @Param("releaseNo")String releaseNo,
+                                                      @Param("receiptNo")Integer receiptNo,
+                                                      @Param("orderNo")String orderNo);
 }
diff --git a/basic-server/src/main/java/com/ruoyi/basic/pojo/IfsInventoryQuantity.java b/basic-server/src/main/java/com/ruoyi/basic/pojo/IfsInventoryQuantity.java
index 3984802..31f49a3 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/pojo/IfsInventoryQuantity.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/pojo/IfsInventoryQuantity.java
@@ -18,7 +18,7 @@
 @ExcelIgnoreUnannotated
 public class IfsInventoryQuantity  implements Serializable {
     @TableId(type = IdType.AUTO)
-    private Integer id;
+    private Long id;
 
 
     @ApiModelProperty("鍩�")
@@ -207,4 +207,7 @@
     // 鏄惁鏄繃鏈熸潗鏂�: 0鍚�, 1:鏄�"
     @ApiModelProperty("鐗╂枡绫诲瀷")
     private Integer isExpire;
+
+    @ApiModelProperty("鏄惁涓烘媶鍒嗚鍗�(1:鏄紝0:鍚�)")
+    private Integer isSplitOrder;
 }
diff --git a/basic-server/src/main/java/com/ruoyi/basic/vo/IfsInventoryQuantityVO.java b/basic-server/src/main/java/com/ruoyi/basic/vo/IfsInventoryQuantityVO.java
new file mode 100644
index 0000000..a7cc348
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/vo/IfsInventoryQuantityVO.java
@@ -0,0 +1,31 @@
+package com.ruoyi.basic.vo;
+
+import com.ruoyi.basic.pojo.IfsInventoryQuantity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鍘熸潗鏂欐姤妫�vo
+ */
+@Data
+public class IfsInventoryQuantityVO extends IfsInventoryQuantity {
+
+    /**
+     * 妫�楠屽崟id
+     */
+    @ApiModelProperty(value = "妫�楠屽崟id")
+    private Integer insOrderId;
+
+    /**
+     * 妫�楠岀粨鏋滐紙0锛氫笉鍚堟牸锛�1锛氬悎鏍硷級
+     */
+    @ApiModelProperty(value = "妫�楠岀粨鏋滐紙0锛氫笉鍚堟牸锛�1锛氬悎鏍硷級")
+    private Integer insResult;
+
+    /**
+     * 鍚屾鐘舵�侊紙0锛氭湭鍚屾锛�1锛氬凡鍚屾锛�
+     */
+    @ApiModelProperty(value = "鍚屾鐘舵�侊紙0锛氭湭鍚屾锛�1锛氬凡鍚屾锛�")
+    private Integer syncStatus;
+
+}
diff --git a/basic-server/src/main/resources/mapper/IfsInventoryQuantityMapper.xml b/basic-server/src/main/resources/mapper/IfsInventoryQuantityMapper.xml
index 2b615be..5495210 100644
--- a/basic-server/src/main/resources/mapper/IfsInventoryQuantityMapper.xml
+++ b/basic-server/src/main/resources/mapper/IfsInventoryQuantityMapper.xml
@@ -71,4 +71,28 @@
           and iiq.supplier_name = #{supplierName}
           and iiq.receiver_date between #{startOfNextQuarter} and #{endOfQuarter}
     </select>
+    <select id="selectSplitOrderList" resultType="com.ruoyi.basic.vo.IfsInventoryQuantityVO">
+        select
+            iiq.*,
+            io.id AS ins_order_id,
+            io.ins_result,
+            isor.sync_status
+        from ifs_inventory_quantity iiq
+                 join ifs_split_order_record isor
+                      on iiq.update_batch_no = isor.lot_batch_no
+                          and iiq.order_no=isor.order_no
+                          and iiq.line_no=isor.line_no
+                          and iiq.release_no=isor.release_no
+                          and iiq.receipt_no=isor.receipt_no
+                          and iiq.part_no=isor.part_no
+                 left join ins_order io on iiq.id=io.ifs_inventory_id
+        where iiq.order_no=#{orderNo}
+          and iiq.part_no=#{partNo}
+          and iiq.line_no=#{lineNo}
+          and iiq.release_no=#{releaseNo}
+          and iiq.receipt_no=#{receiptNo}
+          and iiq.is_split_order=1
+          and (iiq.is_finish != 1 or isor.sync_status != 1)
+          and (io.id is null or io.is_exemption != 1)
+    </select>
 </mapper>
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/aspect/MoveLocationAfterPushMesStockAspect.java b/inspect-server/src/main/java/com/ruoyi/inspect/aspect/MoveLocationAfterPushMesStockAspect.java
new file mode 100644
index 0000000..d6ee1d0
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/aspect/MoveLocationAfterPushMesStockAspect.java
@@ -0,0 +1,88 @@
+package com.ruoyi.inspect.aspect;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.basic.pojo.IfsInventoryQuantity;
+import com.ruoyi.common.utils.api.MesApiUtils;
+import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
+import com.ruoyi.inspect.service.IfsSplitOrderRecordService;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * 鎵цifs绉诲簱鎿嶄綔鍚庯紝鍚屾鎺ㄩ�乵es瀹炴椂搴撳瓨
+ */
+@Aspect
+@Slf4j
+@Component
+public class MoveLocationAfterPushMesStockAspect {
+
+    @Autowired
+    private IfsSplitOrderRecordService ifsSplitOrderRecordService;
+
+    @Autowired
+    private MesApiUtils mesApiUtils;
+
+    private final static String LOCATION_NO = "WG-02-001";//mes澶栬喘鍚堟牸搴撲綅
+
+    @AfterReturning(value = "execution(* com.ruoyi.inspect.service.impl.InsOrderServiceImpl.moveRawMaterial(..))")
+    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
+    public void doAfterReturning(JoinPoint joinPoint) {
+        Object[] args = joinPoint.getArgs();
+        if(Objects.nonNull(args) && args.length>0) {
+            IfsInventoryQuantity ifsInventoryQuantity = BeanUtil.toBean(args[0], IfsInventoryQuantity.class);
+            if(Objects.nonNull(ifsInventoryQuantity) && ifsInventoryQuantity.getIsSplitOrder()==1){
+                //鏌ヨ瀵瑰簲鎵瑰彿鐨勬媶鍒嗚褰�
+                IfsSplitOrderRecord one = ifsSplitOrderRecordService.getOne(Wrappers.<IfsSplitOrderRecord>lambdaQuery()
+                        .eq(IfsSplitOrderRecord::getPartNo, ifsInventoryQuantity.getPartNo())
+                        .eq(IfsSplitOrderRecord::getLotBatchNo, ifsInventoryQuantity.getUpdateBatchNo())
+                        .eq(IfsSplitOrderRecord::getLineNo, ifsInventoryQuantity.getLineNo())
+                        .eq(IfsSplitOrderRecord::getReleaseNo, ifsInventoryQuantity.getReleaseNo())
+                        .eq(IfsSplitOrderRecord::getReceiptNo, ifsInventoryQuantity.getReceiptNo())
+                        .eq(IfsSplitOrderRecord::getOrderNo, ifsInventoryQuantity.getOrderNo())
+                        .last("limit 1")
+                );
+                if(Objects.nonNull(one)){
+                    //鍚屾MES瀹炴椂搴撳瓨
+                    Map<String, Object> requestMap = new HashMap<>();
+                    requestMap.put("partNo", one.getPartNo()); // 闆朵欢缂栧彿
+                    requestMap.put("systemNo", one.getSystemNo()); // 绯荤粺缂栧彿
+                    requestMap.put("spec", one.getSpec()); // 瑙勬牸
+                    requestMap.put("partBatchNo", one.getLotBatchNo()); // 闆朵欢鎵瑰彿
+                    requestMap.put("stockQuantity", one.getLength()); // 搴撳瓨鏁伴噺1
+                    requestMap.put("qty", one.getQtyStock()); // 搴撳瓨鏁伴噺2
+                    requestMap.put("insulationColor", one.getInsulationColor()); // 缁濈紭棰滆壊
+                    requestMap.put("outerColor", one.getOuterColor()); // 澶栨姢棰滆壊
+                    requestMap.put("letteringInfo", one.getLetteringInfo()); // 鍗板瓧淇℃伅
+                    requestMap.put("reelNumber", one.getDrumNo()); // 鐩樺彿
+                    requestMap.put("locationNo", LOCATION_NO); // 搴撲綅缂栧彿
+                    requestMap.put("customerOrderNo", one.getOrderNo()); // 閿�鍞鍗曞彿
+                    requestMap.put("stockSource", one.getStockSource()); // 搴撳瓨鏉ユ簮
+                    requestMap.put("remark", one.getRemark()); // 澶囨敞
+
+                    String jsonStr = JSONUtil.toJsonStr(Collections.singletonList(requestMap));
+                    boolean b = mesApiUtils.batchAddStock(jsonStr);
+                    //鍚屾鎴愬姛锛屾洿鏂板悓姝ョ姸鎬�
+                    if(b){
+                        ifsSplitOrderRecordService.update(null,Wrappers.<IfsSplitOrderRecord>lambdaUpdate()
+                                .set(IfsSplitOrderRecord::getSyncStatus,1)
+                                .eq(IfsSplitOrderRecord::getId,one.getId()));
+                    }
+                }
+            }
+        }
+    }
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
index 5e20dcd..6250602 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
@@ -1,15 +1,11 @@
 package com.ruoyi.inspect.controller;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
 import com.ruoyi.basic.pojo.IfsInventoryQuantity;
 import com.ruoyi.basic.pojo.StandardProductList;
 import com.ruoyi.common.core.domain.Result;
-import com.ruoyi.common.utils.JackSonUtil;
 import com.ruoyi.framework.exception.ErrorException;
 import com.ruoyi.inspect.dto.*;
 import com.ruoyi.inspect.pojo.InsOrder;
@@ -26,15 +22,13 @@
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -158,7 +152,7 @@
         Integer orderId = (Integer) param.get("orderId");
         String ids = (String) param.get("ids");
         Integer typeSource = (Integer) param.get("typeSource");
-        Integer ifsInventoryId = (Integer) param.get("ifsInventoryId");
+        Long ifsInventoryId = (Long) param.get("ifsInventoryId");
         if(Objects.nonNull(typeSource) && typeSource == 1){
             ifsInventoryQuantityMapper.update(null,new LambdaUpdateWrapper<IfsInventoryQuantity>()
                     .set(IfsInventoryQuantity::getState,0)
@@ -182,7 +176,10 @@
     @ApiOperation(value = "鑾峰彇ifs璁㈠崟")
     @GetMapping("/getIfsOrder")
     public Result<?> getIfsOrder() {
-        insOrderService.getIfsOrder();
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("LOCATION_NO","1302");
+        map.put("STATE_DB","To be Inspected");
+        insOrderService.getIfsOrder(map,false);
         return Result.success();
     }
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java
index 7ef8737..8cbb1d9 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java
@@ -106,8 +106,8 @@
 
     @ApiOperation(value = "妫�楠屼换鍔℃彁浜�")
     @PostMapping("/submitPlan")
-    public Result<?> submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode) {
-        int num = insOrderPlanService.submitPlan(orderId, laboratory, verifyUser, entrustCode);
+    public Result<?> submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode,Boolean registerInsResults) {
+        int num = insOrderPlanService.submitPlan(orderId, laboratory, verifyUser, entrustCode,registerInsResults);
         return num == 1 ? Result.success() : Result.fail("鎻愪氦澶辫触锛岄儴鍒嗛」鐩繕鏈繘琛屾楠�");
     }
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/RawMaterialOrderController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/RawMaterialOrderController.java
index 189dd0b..bbddb17 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/RawMaterialOrderController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/RawMaterialOrderController.java
@@ -7,6 +7,7 @@
 import com.ruoyi.basic.pojo.IfsInventoryQuantity;
 import com.ruoyi.common.annotation.PersonalScope;
 import com.ruoyi.inspect.dto.InsPlaceOrderDto;
+import com.ruoyi.inspect.dto.OrderSplitDTO;
 import com.ruoyi.inspect.dto.SampleProductDto;
 import com.ruoyi.inspect.pojo.InsOrder;
 import com.ruoyi.inspect.pojo.RawMaterialOrderTemplate;
@@ -22,7 +23,9 @@
 import lombok.AllArgsConstructor;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.util.List;
@@ -102,7 +105,7 @@
     @ApiOperation(value = "鎶ユ鎵归噺")
     @PostMapping("/inspectionReport")
     public Result<?> inspectionReport(@RequestBody Map<String, Object> param) {
-        List<Integer> ids = (List<Integer>) param.get("ids");
+        List<Long> ids = (List<Long>) param.get("ids");
         return Result.success(rawMaterialOrderService.inspectionReport(ids));
     }
 
@@ -114,7 +117,7 @@
     @ApiOperation(value = "鎾ら攢鎶ユ")
     @PostMapping("/revokeInspectionReport")
     public Result<?> revokeInspectionReport(@RequestBody Map<String, Object> param) {
-        Integer id = (Integer) param.get("id");
+        Long id = (Long) param.get("id");
         return Result.success(rawMaterialOrderService.revokeInspectionReport(id));
     }
 
@@ -161,7 +164,7 @@
     @ApiOperation(value = "鍘熸潗鏂欐挙閿�涓嬪崟")
     @GetMapping("/repealRawOrder")
     public Result<?> repealRawOrder(@RequestBody Map<String, Object> param){
-        Integer ifsInventoryId = (Integer) param.get("ifsInventoryId");
+        Long ifsInventoryId = (Long) param.get("ifsInventoryId");
         return Result.success(rawMaterialOrderService.repealRawOrder(ifsInventoryId));
     }
 
@@ -198,7 +201,7 @@
     @ApiOperation(value = "鍘熸潗鏂欎笅鍗曟斁琛屽厤妫�")
     @PostMapping("/rawOrderRelease")
     public Result<?> rawOrderRelease(@RequestBody Map<String, Object> param){
-        Integer ifsInventoryId = (Integer) param.get("ifsInventoryId");
+        Long ifsInventoryId = (Long) param.get("ifsInventoryId");
         String partDetail = (String) param.get("partDetail");
         return Result.success(rawMaterialOrderService.rawOrderRelease(ifsInventoryId, partDetail));
     }
@@ -210,7 +213,7 @@
      */
     @ApiOperation(value = "鍘熸潗鏂欎笅鍗曢�氱煡鍏嶆鎴栬�呭娆℃楠�")
     @GetMapping("/notificationRawOrder")
-    public Result<?> notificationRawOrder(Integer ifsInventoryId){
+    public Result<?> notificationRawOrder(Long ifsInventoryId){
         return Result.success(rawMaterialOrderService.notificationRawOrder(ifsInventoryId));
     }
 
@@ -266,7 +269,7 @@
     @ApiOperation(value = "璁╂鏀捐")
     @PostMapping("/concessionRelease")
     public Result<?> concessionRelease(@RequestBody Map<String, Object> param){
-        Integer ifsInventoryId = (Integer) param.get("ifsInventoryId");
+        Long ifsInventoryId = (Long) param.get("ifsInventoryId");
         return Result.success(rawMaterialOrderService.concessionRelease(ifsInventoryId));
     }
 
@@ -316,8 +319,35 @@
     @ApiOperation(value = "鎻愬墠鍏ュ簱")
     @PostMapping("/advancedGodown")
     public Result<?> advancedGodown(@RequestBody Map<String, Object> param){
-        Integer ifsInventoryId = (Integer) param.get("ifsInventoryId");
+        Long ifsInventoryId = (Long) param.get("ifsInventoryId");
         return Result.success(rawMaterialOrderService.advancedGodown(ifsInventoryId));
     }
 
+    /**
+     * 涓嬭浇璁㈠崟鎷嗗垎瀵煎叆妯℃澘
+     */
+    @ApiOperation(value = "涓嬭浇璁㈠崟鎷嗗垎瀵煎叆妯℃澘")
+    @GetMapping("/downloadTemplate")
+    public void downloadTemplate(HttpServletResponse response){
+        rawMaterialOrderService.downloadTemplate(response);
+    }
+
+    /**
+     * 涓嬭浇璁㈠崟鎷嗗垎瀵煎叆妯℃澘
+     */
+    @ApiOperation(value = "瀵煎叆璁㈠崟鎷嗗垎鏁版嵁")
+    @PostMapping("/importSplitOrderData")
+    public Result importSplitOrderData(@RequestParam(value = "file") MultipartFile file, @RequestParam("ifsId") Long ifsId, HttpServletRequest request){
+        return rawMaterialOrderService.importSplitOrderData(file,ifsId,request);
+    }
+
+    /**
+     * 纭鎷嗗垎璁㈠崟
+     */
+    @ApiOperation(value = "纭鎷嗗垎璁㈠崟")
+    @PostMapping("/confirmSplitOrder")
+    public Result confirmSplitOrder(@RequestBody OrderSplitDTO orderSplitDTO){
+        return Result.success(rawMaterialOrderService.confirmSplitOrder(orderSplitDTO));
+    }
+
 }
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/OrderSplitDTO.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/OrderSplitDTO.java
new file mode 100644
index 0000000..ab4d170
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/OrderSplitDTO.java
@@ -0,0 +1,34 @@
+package com.ruoyi.inspect.dto;
+
+import com.ruoyi.inspect.excel.OrderSplitExcelData;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 璁㈠崟鎷嗗垎dto
+ */
+@Data
+public class OrderSplitDTO implements Serializable {
+
+    /**
+     * ifs璁㈠崟涓婚敭id
+     */
+    @ApiModelProperty("ifs璁㈠崟涓婚敭id")
+    private Long ifsId;
+
+    /**
+     *鎷嗗垎璇︽儏鍒楄〃
+     */
+    @ApiModelProperty("鎷嗗垎璇︽儏鍒楄〃")
+    private List<OrderSplitExcelData> splitDetailList;
+
+    /**
+     *鏄惁鍚屾鍒癕ES
+     */
+    @ApiModelProperty("鏄惁鍚屾鍒癕ES")
+    private Boolean pushToMes;
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/excel/OrderSplitExcelData.java b/inspect-server/src/main/java/com/ruoyi/inspect/excel/OrderSplitExcelData.java
new file mode 100644
index 0000000..ac81d7a
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/excel/OrderSplitExcelData.java
@@ -0,0 +1,107 @@
+package com.ruoyi.inspect.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 鍘熸潗鏂欐姤妫�锛氳鍗曟媶鍒嗗鍏ユā鏉垮璞�
+ */
+@Data
+public class OrderSplitExcelData implements Serializable {
+
+    /**
+     * 闆朵欢缂栧彿
+     */
+    @ExcelProperty(index = 0,value = "闆朵欢缂栧彿")
+    @ApiModelProperty("闆朵欢缂栧彿")
+    private String partNo;
+
+    /**
+     * 绯荤粺缂栧彿
+     */
+    @ExcelProperty(index = 1,value = "绯荤粺缂栧彿")
+    @ApiModelProperty("绯荤粺缂栧彿 ")
+    private String systemNo;
+
+    /**
+     * 瑙勬牸
+     */
+    @ExcelProperty(index = 2,value = "瑙勬牸")
+    @ApiModelProperty("瑙勬牸")
+    private String spec;
+
+    /**
+     * 闆朵欢鎵瑰彿
+     */
+    @ExcelProperty(index = 3,value = "闆朵欢鎵瑰彿")
+    @ApiModelProperty("闆朵欢鎵瑰彿")
+    private String lotBatchNo;
+
+    /**
+     * 搴撳瓨鏁伴噺1
+     */
+    @ExcelProperty(index = 4,value = "搴撳瓨鏁伴噺1")
+    @ApiModelProperty("搴撳瓨鏁伴噺1锛堢敤浜庡鎺es鍒嗙洏璁$畻锛�")
+    private BigDecimal length;
+
+    /**
+     * 搴撳瓨鏁伴噺2
+     */
+    @ExcelProperty(index = 5,value = "搴撳瓨鏁伴噺2")
+    @ApiModelProperty("搴撳瓨鏁伴噺2锛坕fs瀵逛簬鐨勫簱瀛樻暟閲忥級")
+    private BigDecimal qtyStock;
+
+    /**
+     * 缁濈紭棰滆壊
+     */
+    @ExcelProperty(index = 6,value = "缁濈紭棰滆壊")
+    @ApiModelProperty("缁濈紭棰滆壊")
+    private String insulationColor;
+
+    /**
+     * 澶栨姢棰滆壊
+     */
+    @ExcelProperty(index = 7,value = "澶栨姢棰滆壊")
+    @ApiModelProperty("澶栨姢棰滆壊")
+    private String outerColor;
+
+    /**
+     * 鍗板瓧淇℃伅
+     */
+    @ExcelProperty(index = 8,value = "鍗板瓧淇℃伅")
+    @ApiModelProperty("鍗板瓧淇℃伅")
+    private String letteringInfo;
+
+    /**
+     * 鐩樺彿
+     */
+    @ExcelProperty(index = 9,value = "鐩樺彿")
+    @ApiModelProperty("鐩樺彿")
+    private String drumNo;
+
+    /**
+     * 搴撲綅缂栧彿
+     */
+    @ExcelProperty(index = 10,value = "搴撲綅缂栧彿")
+    @ApiModelProperty("搴撲綅缂栧彿")
+    private String locationNo;
+
+    /**
+     * 搴撲綅鏉ユ簮
+     */
+    @ExcelProperty(index = 11,value = "搴撲綅鏉ユ簮")
+    @ApiModelProperty("搴撲綅鏉ユ簮")
+    private String stockSource;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(index = 12,value = "澶囨敞")
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/excel/OrderSplitExcelListener.java b/inspect-server/src/main/java/com/ruoyi/inspect/excel/OrderSplitExcelListener.java
new file mode 100644
index 0000000..c8eb7ae
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/excel/OrderSplitExcelListener.java
@@ -0,0 +1,146 @@
+package com.ruoyi.inspect.excel;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.ruoyi.basic.pojo.IfsInventoryQuantity;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+@Slf4j
+public class OrderSplitExcelListener extends AnalysisEventListener<Map<Integer,Object>> {
+
+    //琛ㄥご妯℃澘
+    private static final String HEAD_TEMPLATE = "[闆朵欢缂栧彿, 绯荤粺缂栧彿, 瑙勬牸, 闆朵欢鎵瑰彿, 搴撳瓨鏁伴噺1, 搴撳瓨鏁伴噺2, 缁濈紭棰滆壊, 澶栨姢棰滆壊, 鍗板瓧淇℃伅, 鐩樺彿, 搴撲綅缂栧彿, 搴撲綅鏉ユ簮, 澶囨敞]";
+
+    AtomicInteger index = new AtomicInteger(0);//绗﹀悎琛ㄦ牸妯℃澘鐨勮鏁�
+
+    @Getter
+    List<OrderSplitExcelData> dataList = new ArrayList<>();//瀵煎叆鐨勬暟鎹垪琛�
+
+    IfsInventoryQuantity ifsInventoryQuantity;//瀵瑰簲鎶ユifs淇℃伅
+
+    public String errorMsg = "";
+
+    public OrderSplitExcelListener(IfsInventoryQuantity ifsInventoryQuantity) {
+        this.ifsInventoryQuantity = ifsInventoryQuantity;
+    }
+
+    AtomicReference<String> prePartLotBatchNo = new AtomicReference<>("");//涓婁竴鏉℃暟鎹殑闆朵欢鎵瑰彿
+
+    AtomicReference<BigDecimal> storeQty2Sum = new AtomicReference<>(BigDecimal.ZERO);//瀵煎叆鏁版嵁搴撳瓨鏁伴噺2鐨勬�诲拰
+
+    @Override
+    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
+        String temp = headMap.values().toString();
+        if(StringUtils.equals(HEAD_TEMPLATE,temp)){
+            index.getAndIncrement();
+        }
+    }
+
+    @Override
+    public void invoke(Map<Integer,Object> mapData, AnalysisContext analysisContext) {
+        Integer currentRowNum = analysisContext.getCurrentRowNum();
+        OrderSplitExcelData data = transformExcelData(mapData, currentRowNum);
+        if(Objects.nonNull(data)){
+            dataList.add(data);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        if(index.get()==0){
+            throw new RuntimeException("鏂囦欢鍐呭鏍煎紡涓庢ā鏉夸笉绗�");
+        }
+        if(storeQty2Sum.get().compareTo(ifsInventoryQuantity.getPurQtyInStore())>0){
+            throw new RuntimeException("搴撳瓨鏁伴噺2涓嶈兘澶т簬鎶ユ闆朵欢鐨勬姷杈鹃噰璐暟閲�");
+        }
+    }
+
+    /**
+     * 鏍¢獙鏁版嵁
+     * @param mapData
+     * @param rowNumber
+     */
+    private void validateRowData(Map<Integer,Object> mapData,Integer rowNumber){
+        String rowStr = "</br>绗�"+(rowNumber+1)+"琛�:";
+        List<String> errorMsgList = new ArrayList<>();
+        //闆朵欢缂栧彿
+        if(Objects.isNull(mapData.get(0))){
+            errorMsgList.add("闆朵欢缂栧彿涓嶈兘涓虹┖");
+        }else if(!StringUtils.equals(mapData.get(0).toString(),ifsInventoryQuantity.getPartNo())){
+            errorMsgList.add("闆朵欢缂栧彿涓庢姤妫�闆朵欢涓嶄竴鑷�");
+        }
+        //闆朵欢鎵瑰彿
+        if(Objects.isNull(mapData.get(3))){
+            errorMsgList.add("闆朵欢鎵瑰彿涓嶈兘涓虹┖");
+        }else if(StringUtils.equals(mapData.get(3).toString(),ifsInventoryQuantity.getLotBatchNo())){
+            errorMsgList.add("闆朵欢鎵瑰彿涓庢姤妫�闆朵欢鎵瑰彿鐩稿悓");
+        }else if(StringUtils.equals(prePartLotBatchNo.get(),mapData.get(3).toString())){
+            errorMsgList.add("闆朵欢鎵瑰彿瀛樺湪閲嶅");
+        }
+        prePartLotBatchNo.getAndSet(mapData.get(3).toString());
+        //搴撳瓨鏁伴噺2
+        if(Objects.isNull(mapData.get(5))){
+            errorMsgList.add("搴撳瓨鏁伴噺2涓嶈兘涓虹┖");
+        }else{
+            BigDecimal storeQty2 = BigDecimal.ZERO;
+            try{
+                storeQty2 = new BigDecimal(mapData.get(5).toString());
+            }catch (Exception e){
+                errorMsgList.add("搴撳瓨鏁伴噺2鏍煎紡寮傚父");
+            }
+            if(storeQty2.compareTo(ifsInventoryQuantity.getPurQtyInStore())>0){
+                errorMsgList.add("搴撳瓨鏁伴噺2涓嶈兘澶т簬鎶ユ闆朵欢鐨勬姷杈鹃噰璐暟閲�");
+            }
+            BigDecimal oldSum = storeQty2Sum.get();
+            storeQty2Sum.getAndSet(oldSum.add(storeQty2));
+        }
+        //搴撲綅缂栧彿
+        if(Objects.isNull(mapData.get(10))){
+            errorMsgList.add("搴撲綅缂栧彿涓嶈兘涓虹┖");
+        }else if(!StringUtils.equals(mapData.get(10).toString(),ifsInventoryQuantity.getLocationNo())){
+            errorMsgList.add("搴撲綅缂栧彿涓庢姤妫�闆朵欢鐨勫簱浣嶇紪鍙蜂笉涓�鑷�");
+        }
+        if(!errorMsgList.isEmpty()){
+            String errorStr = String.join(";",errorMsgList);
+            errorMsg+= rowStr + errorStr ;
+        }
+    }
+
+    /**
+     * 杞崲excel瀵煎叆琛屾暟鎹�
+     * @param mapData
+     * @return
+     */
+    private OrderSplitExcelData transformExcelData(Map<Integer,Object> mapData,Integer rowNumber){
+        validateRowData(mapData,rowNumber);
+        if(StringUtils.isBlank(errorMsg)){
+            OrderSplitExcelData data = new OrderSplitExcelData();
+            data.setPartNo(mapData.get(0).toString());
+            data.setSystemNo(Objects.isNull(mapData.get(1))?"":mapData.get(1).toString());
+            data.setSpec(Objects.isNull(mapData.get(2))?"":mapData.get(2).toString());
+            data.setLotBatchNo(Objects.isNull(mapData.get(3))?"":mapData.get(3).toString());
+            data.setLength(new BigDecimal(mapData.get(4).toString()));
+            data.setQtyStock(new BigDecimal(mapData.get(5).toString()));
+            data.setInsulationColor(Objects.isNull(mapData.get(6))?"":mapData.get(6).toString());
+            data.setOuterColor(Objects.isNull(mapData.get(7))?"":mapData.get(7).toString());
+            data.setLetteringInfo(Objects.isNull(mapData.get(8))?"":mapData.get(8).toString());
+            data.setDrumNo(Objects.isNull(mapData.get(9))?"":mapData.get(9).toString());
+            data.setLocationNo(Objects.isNull(mapData.get(10))?"":mapData.get(10).toString());
+            data.setStockSource(Objects.isNull(mapData.get(11))?"":mapData.get(11).toString());
+            data.setRemark(Objects.isNull(mapData.get(12))?"":mapData.get(12).toString());
+            return data;
+        }
+        return null;
+    }
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/IfsSplitOrderRecordMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/IfsSplitOrderRecordMapper.java
new file mode 100644
index 0000000..99769a5
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/IfsSplitOrderRecordMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.inspect.mapper;
+
+import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author 27233
+* @description 閽堝琛ㄣ�恑fs_split_order_record(ifs鍘熸潗鏂欒鍗曟媶鍒嗚褰曡〃)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-10-29 16:39:41
+* @Entity com.ruoyi.inspect.pojo.IfsSplitOrderRecord
+*/
+public interface IfsSplitOrderRecordMapper extends BaseMapper<IfsSplitOrderRecord> {
+
+}
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/IfsSplitOrderRecord.java b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/IfsSplitOrderRecord.java
new file mode 100644
index 0000000..3daf2ba
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/IfsSplitOrderRecord.java
@@ -0,0 +1,157 @@
+package com.ruoyi.inspect.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * ifs鍘熸潗鏂欒鍗曟媶鍒嗚褰曡〃
+ * @TableName ifs_split_order_record
+ */
+@TableName(value ="ifs_split_order_record")
+@Data
+public class IfsSplitOrderRecord implements Serializable {
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭id
+     */
+    @ApiModelProperty("涓婚敭id")
+    @TableId
+    private Long id;
+
+    /**
+     * 閿�鍞鍗曞彿
+     */
+    @ApiModelProperty("閿�鍞鍗曞彿")
+    private String orderNo;
+
+    /**
+     * 琛屽彿
+     */
+    @ApiModelProperty("琛屽彿")
+    private String lineNo;
+
+    /**
+     * 涓嬭揪鍙�
+     */
+    @ApiModelProperty("涓嬭揪鍙�")
+    private String releaseNo;
+
+    /**
+     * 鎺ユ敹鍙�
+     */
+    @ApiModelProperty("鎺ユ敹鍙�")
+    private Integer receiptNo;
+
+    /**
+     * 闆朵欢鍙�
+     */
+    @ApiModelProperty("闆朵欢鍙�")
+    private String partNo;
+
+    /**
+     * 绯荤粺缂栧彿
+     */
+    @ApiModelProperty("绯荤粺缂栧彿")
+    private String systemNo;
+
+    /**
+     * 瑙勬牸
+     */
+    @ApiModelProperty("瑙勬牸")
+    private String spec;
+
+    /**
+     * 闆朵欢鎵瑰彿
+     */
+    @ApiModelProperty("闆朵欢鎵瑰彿")
+    private String lotBatchNo;
+
+    /**
+     * 搴撳瓨鏁伴噺1锛堢敤浜庡鎺es鍒嗙洏璁$畻锛�
+     */
+    @ApiModelProperty("搴撳瓨鏁伴噺1锛堢敤浜庡鎺es鍒嗙洏璁$畻锛�")
+    private BigDecimal length;
+
+    /**
+     * 搴撳瓨鏁伴噺2锛坕fs瀵逛簬鐨勫簱瀛樻暟閲忥級
+     */
+    @ApiModelProperty("搴撳瓨鏁伴噺2锛坕fs瀵逛簬鐨勫簱瀛樻暟閲忥級")
+    private BigDecimal qtyStock;
+
+    /**
+     * 缁濈紭棰滆壊
+     */
+    @ApiModelProperty("缁濈紭棰滆壊")
+    private String insulationColor;
+
+    /**
+     * 澶栨姢棰滆壊
+     */
+    @ApiModelProperty("澶栨姢棰滆壊")
+    private String outerColor;
+
+    /**
+     * 鍗板瓧淇℃伅
+     */
+    @ApiModelProperty("鍗板瓧淇℃伅")
+    private String letteringInfo;
+
+    /**
+     * 鐩樺彿
+     */
+    @ApiModelProperty("鐩樺彿")
+    private String drumNo;
+
+    /**
+     * 搴撲綅鍙�
+     */
+    @ApiModelProperty("搴撲綅鍙�")
+    private String locationNo;
+
+    /**
+     * 搴撲綅鏉ユ簮
+     */
+    @ApiModelProperty("搴撲綅鏉ユ簮")
+    private String stockSource;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+    /**
+     * 鍚屾鐘舵�侊紙0锛氭湭鍚屾锛�1锛氬凡鍚屾锛�
+     */
+    @ApiModelProperty(value = "鍚屾鐘舵�侊紙0锛氭湭鍚屾锛�1锛氬凡鍚屾锛�")
+    private Integer syncStatus;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+}
\ No newline at end of file
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrder.java b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrder.java
index 3c4cba3..bf590ae 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrder.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrder.java
@@ -178,7 +178,7 @@
     private Integer typeSource;
 
     @ApiModelProperty("鍘熸潗鏂檌d")
-    private Integer ifsInventoryId;
+    private Long ifsInventoryId;
 
     @ApiModelProperty("鎶芥煡鏁伴噺")
     private String testQuantity;
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/IfsSplitOrderRecordService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/IfsSplitOrderRecordService.java
new file mode 100644
index 0000000..1f6767e
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/IfsSplitOrderRecordService.java
@@ -0,0 +1,13 @@
+package com.ruoyi.inspect.service;
+
+import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author 27233
+* @description 閽堝琛ㄣ�恑fs_split_order_record(ifs鍘熸潗鏂欒鍗曟媶鍒嗚褰曡〃)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2025-10-29 16:39:41
+*/
+public interface IfsSplitOrderRecordService extends IService<IfsSplitOrderRecord> {
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java
index 1caa282..d479cc6 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java
@@ -32,11 +32,11 @@
 
     int upPlanUser(Integer userId, Integer orderId,String sonLaboratory);
 
-    int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode);
+    int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode,Boolean registerInsResults);
 
     List<InsProduct> getInsProduct(InsOrderPlanProductDto insOrderPlanProductDto);
 
-    List<String> checkSubmitPlan(Integer orderId, String laboratory);
+    Map<String,Object> checkSubmitPlan(Integer orderId, String laboratory);
 
     IPage<InsOrderFile> getFileList(Page page, InsOrderFile insOrderFile);
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
index ab022c5..11b1eb5 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.basic.pojo.IfsInventoryQuantity;
 import com.ruoyi.basic.pojo.StandardProductList;
 import com.ruoyi.common.core.domain.Result;
 import com.ruoyi.inspect.pojo.InsOrder;
@@ -46,7 +47,7 @@
 
 
     // 鑾峰彇ifs搴撳瓨淇℃伅
-    void getIfsOrder();
+    void getIfsOrder(Map<String,Object> objectMap,Boolean isSplitOrder);
 
     /**
      * 淇敼璁㈠崟鍗曞彿
@@ -58,7 +59,7 @@
 
 
 
-    void updateIfsInventoryQuantity(Integer id);
+    void updateIfsInventoryQuantity(Long id);
 
     /**
      * 閾滄潗涓嬪崟
@@ -123,4 +124,11 @@
      * @return
      */
     Result judgeNotSpotCheckOrder(List<SampleProductDto> sampleList, InsOrder insOrder);
+
+    /**
+     * 绉诲簱鎿嶄綔
+     * @param one
+     * @return
+     */
+    String moveRawMaterial(IfsInventoryQuantity one);
 }
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsReportService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsReportService.java
index 0959257..7c50a7c 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsReportService.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsReportService.java
@@ -43,16 +43,15 @@
 
     int upAll(MultipartFile file) throws IOException;
 
-    void isRawMaterial(InsOrder insOrder);
+    /**
+     *
+     * @param insOrder 妫�楠屽崟淇℃伅
+     * @param registerInsResults 鏄惁鐧昏妫�楠岀粨鏋�
+     * @param hasExemption 鏄惁鍏嶆
+     */
+    void isRawMaterial(InsOrder insOrder,Boolean registerInsResults,Boolean hasExemption);
 
     Long getUnqualifiedCount(InsOrder insOrder);
-
-    /**
-     * 绉诲簱鎿嶄綔
-     * @param one
-     * @return
-     */
-    String moveRawMaterial(IfsInventoryQuantity one);
 
     /**
      * 閫�鍥炲埌妫�楠屼换鍔�
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java
index 7707de8..e6ceea9 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java
@@ -5,11 +5,14 @@
 import com.ruoyi.basic.dto.*;
 import com.ruoyi.basic.pojo.IfsInventoryQuantity;
 import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.inspect.dto.OrderSplitDTO;
 import com.ruoyi.inspect.dto.SampleProductDto;
 import com.ruoyi.inspect.pojo.InsOrder;
 import com.ruoyi.inspect.dto.CopperInsOrderDto;
 import com.ruoyi.inspect.dto.RawMaterialStandardTreeDto;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.UnsupportedEncodingException;
 import java.util.List;
@@ -39,9 +42,9 @@
      */
     IPage<IfsInventoryQuantityDto> getIfsByStateOne(IPage<IfsInventoryQuantityDto> page, IfsInventoryQuantityDto ifsInventoryQuantityDto);
 
-    int inspectionReport(List<Integer> ids);
+    int inspectionReport(List<Long> ids);
 
-    int revokeInspectionReport(Integer id);
+    int revokeInspectionReport(Long id);
 
     List<IfsInventoryQuantityDto> printLabel(List<Integer> ids);
 
@@ -54,7 +57,7 @@
      * @param ifsInventoryId
      * @return
      */
-    boolean repealRawOrder(Integer ifsInventoryId);
+    boolean repealRawOrder(Long ifsInventoryId);
 
     /**
      * 娣诲姞鍏嶆璁㈠崟
@@ -81,14 +84,14 @@
      * @param ifsInventoryId
      * @return
      */
-    boolean rawOrderRelease(Integer ifsInventoryId, String partDetail);
+    boolean rawOrderRelease(Long ifsInventoryId, String partDetail);
 
     /**
      * 鍘熸潗鏂欎笅鍗曢�氱煡鍏嶆鎴栬�呭娆℃楠�
      * @param ifsInventoryId
      * @return
      */
-    int notificationRawOrder(Integer ifsInventoryId);
+    int notificationRawOrder(Long ifsInventoryId);
 
     /**
      * 鎵嬪姩娣诲姞鍘熸潗淇℃伅
@@ -109,7 +112,7 @@
      * @param ifsInventoryId
      * @return
      */
-    boolean concessionRelease(Integer ifsInventoryId);
+    boolean concessionRelease(Long ifsInventoryId);
 
     /**
      * 鍘熸潗鏂欒繘鍘傛挙閿�涓嬪崟
@@ -145,5 +148,11 @@
      * @param ifsInventoryId
      * @return
      */
-    boolean advancedGodown(Integer ifsInventoryId);
+    boolean advancedGodown(Long ifsInventoryId);
+
+    void downloadTemplate(HttpServletResponse response);
+
+    Result importSplitOrderData(MultipartFile file, Long ifsId, HttpServletRequest request);
+
+    boolean confirmSplitOrder(OrderSplitDTO orderSplitDTO);
 }
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsSplitOrderRecordServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsSplitOrderRecordServiceImpl.java
new file mode 100644
index 0000000..d57e944
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/IfsSplitOrderRecordServiceImpl.java
@@ -0,0 +1,22 @@
+package com.ruoyi.inspect.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
+import com.ruoyi.inspect.service.IfsSplitOrderRecordService;
+import com.ruoyi.inspect.mapper.IfsSplitOrderRecordMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 27233
+* @description 閽堝琛ㄣ�恑fs_split_order_record(ifs鍘熸潗鏂欒鍗曟媶鍒嗚褰曡〃)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @createDate 2025-10-29 16:39:41
+*/
+@Service
+public class IfsSplitOrderRecordServiceImpl extends ServiceImpl<IfsSplitOrderRecordMapper, IfsSplitOrderRecord>
+    implements IfsSplitOrderRecordService{
+
+}
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
index 3724d3d..f8d29bd 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
@@ -277,7 +277,8 @@
     }
 
     @Override
-    public List<String> checkSubmitPlan(Integer orderId, String laboratory) {
+    public Map<String,Object> checkSubmitPlan(Integer orderId, String laboratory) {
+        Map<String, Object> map = new HashMap<>();
         List<String> collect = new ArrayList<>();
         List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, orderId).select(InsSample::getId));
         List<Integer> ids = insSamples.stream().map(a -> a.getId()).collect(Collectors.toList());
@@ -303,7 +304,19 @@
                 return insProduct.getInspectionItem() + "-" + insProduct.getInspectionItemSubclass();
             }).collect(Collectors.toList());
         }
-        return collect;
+        //鏌ヨifs鎷嗗垎璁㈠崟鏄惁鏈夊凡涓嬪崟浣嗘槸鏈瀹岀殑鍗曞瓙
+        long count = 0L;
+        InsOrder insOrder = insOrderMapper.selectById(orderId);
+        if(Objects.nonNull(insOrder.getIfsInventoryId())){
+            IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId());
+            //杩囨护鍑轰笉鍚堟牸鎴栨湭鎻愪氦鐨勫崟瀛�
+            count = ifsInventoryQuantityMapper.selectSplitOrderList(one.getPartNo(),one.getLineNo(),one.getReleaseNo(),one.getReceiptNo(),one.getOrderNo())
+                    .stream()
+                    .filter(f->(Objects.nonNull(f.getInsOrderId()) && !Objects.equals(f.getInsOrderId(),orderId)) && (Objects.isNull(f.getInsResult()) || 0==f.getInsResult())).count();
+        }
+        map.put("errorMsg",collect);
+        map.put("unInsOrderCount",count);
+        return map;
     }
 
     @Override
@@ -756,7 +769,7 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode) {
+    public int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode,Boolean registerInsResults) {
         InsOrder order = insOrderMapper.selectById(orderId);
         // 1. 鍒ゆ柇鏄惁鏈夐噸澶嶇紪鍙�, 鏈夐噸澶嶇紪鍙峰仛鎻愰啋
         Long codeCount = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
@@ -926,7 +939,7 @@
             // 鐧昏妫�楠岀粨鏋�
             // 鍒ゆ柇鏄惁鏈変笉鍚堟牸, 鏈変笉鍚堟牸涓嶈兘绉诲簱
             // todo: ifs绉诲簱
-            insReportService.isRawMaterial(order);
+            insReportService.isRawMaterial(order,registerInsResults,false);
 
             // 15 鍒ゆ柇褰撳墠鏍峰搧鏄惁涓哄師鏉愭枡, 鍘熸潗鏂欓渶瑕佽繘琛屾暟鎹垎鏋�, 鍒ゆ柇涔嬪墠10鏉℃暟鎹悓涓�涓緵搴斿晢, 鍚屼竴涓楠岄」鐨勫亸宸槸鍚﹁秴杩�10%
             // 鏌ヨifs淇℃伅鑾峰彇鑾峰彇鍓�10涓緵搴斿晢涓�鏍风殑, 妫�楠岄」涓�鏍蜂俊鎭�
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
index 55d6e7f..d3f2274 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
@@ -43,6 +43,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletResponse;
@@ -547,12 +548,9 @@
      * @return
      */
     @Override
-    public void getIfsOrder() {
-        HashMap<String, Object> map = new HashMap<>();
-        map.put("LOCATION_NO","1302");
-        map.put("STATE_DB","To be Inspected");
+    public void getIfsOrder(Map<String, Object> map,Boolean isSplitOrder) {
         List<Map<String, Object>> inventory = ifsApiUtils.getInventory(JSONUtil.toJsonStr(map));
-        if(inventory.size() == 0) {
+        if(inventory.isEmpty()) {
             return;
         }
         // 杩涜淇濆瓨
@@ -637,6 +635,9 @@
             );
             if(count == 0) {
                 ifsInventoryQuantity.setIsFirst(0);
+                if(isSplitOrder){
+                    ifsInventoryQuantity.setIsSplitOrder(1);
+                }
                 // 鏌ヨ浜т笟閾炬娴嬫暟鎹�
                 String industryChainAttrFields = IndustryChainUtils.getIndustryChainAttrFields(ifsInventoryQuantity.getOrderNo(),
                         ifsInventoryQuantity.getLineNo(),
@@ -719,7 +720,7 @@
      * @param id
      */
     @Transactional
-    public void updateIfsInventoryQuantity(Integer id) {
+    public void updateIfsInventoryQuantity(Long id) {
         ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
                 .set(IfsInventoryQuantity::getIsRegister, 1)
                 .eq(IfsInventoryQuantity::getId, id));
@@ -1146,6 +1147,170 @@
 
     }
 
+    /**
+     * ifs绉诲簱鎿嶄綔
+     * @param inventoryQuantity
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
+    public String moveRawMaterial(IfsInventoryQuantity inventoryQuantity) {
+        //鏌ヨifs璁㈠崟璇︽儏
+        IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectById(inventoryQuantity.getId());
+        String toLocation;
+        // 鐧昏閲囪喘妫�楠岀粨鏋淪TD
+        if (one.getIsRegister().equals(0)) {
+            Map<String, Object> resultMap = new HashMap<>();
+            List<Map<String, Object>> resultList = new ArrayList<>();
+            Map<String, Object> map = new HashMap<>();
+            map.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
+            map.put("LINE_NO", one.getLineNo()); // 琛屽彿
+            map.put("RELEASE_NO", one.getReleaseNo()); // 涓嬭揪鍙�
+            map.put("RECEIPT_NO", one.getReceiptNo()); // 鎺ユ敹鍙�
+            map.put("PURCH_QTY", one.getQtyToInspect()); // 瑕佹楠岀殑閲囪喘鏁伴噺
+            resultList.add(map);
+            resultMap.put("RECORD_ID", UUID.randomUUID().toString());
+            resultMap.put("SYSCODE", "LIMS");
+            resultMap.put("SYSMODEL", "鐧昏閲囪喘妫�楠岀粨鏋�");
+            resultMap.put("BATCH_INFO", resultList);
+            Result result = ifsApiUtils.getProcurementResults(JSONUtil.toJsonStr(resultMap));
+            if (result.getCode() != 200) {
+                throw new ErrorException("IFS鐧昏閲囪喘妫�楠岀粨鏋滃け璐�: " + result.getMessage());
+            }
+            //濡傛灉鏄媶鍒嗚鍗曪紝鍒欏皢鍚屼竴鎺ユ敹鍙风殑璁㈠崟鏍囪宸茬櫥璁版牎楠�
+            if(one.getIsSplitOrder()==1){
+                //鏌ヨ鍏朵綑鎷嗗垎鐨勮鍗�
+                List<IfsInventoryQuantity> quantityList = ifsInventoryQuantityMapper.selectList(Wrappers.<IfsInventoryQuantity>lambdaQuery()
+                        .eq(IfsInventoryQuantity::getOrderNo, one.getOrderNo())
+                        .eq(IfsInventoryQuantity::getPartNo, one.getPartNo())
+                        .eq(IfsInventoryQuantity::getLineNo, one.getLineNo())
+                        .eq(IfsInventoryQuantity::getReleaseNo, one.getReleaseNo())
+                        .eq(IfsInventoryQuantity::getReceiptNo, one.getReceiptNo())
+                        .eq(IfsInventoryQuantity::getIsSplitOrder, 1)
+                );
+                if(Objects.nonNull(quantityList) && !quantityList.isEmpty()){
+                    //淇敼閲囪喘璁㈠崟鐧昏鐘舵��
+                    List<Long> ids = quantityList.stream().map(IfsInventoryQuantity::getId).collect(Collectors.toList());
+                    ifsInventoryQuantityMapper.update(null,Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                            .set(IfsInventoryQuantity::getIsRegister,1)
+                            .in(IfsInventoryQuantity::getId, ids)
+                    );
+                }
+            }else{
+                this.updateIfsInventoryQuantity(one.getId());
+            }
+        }
+        /**
+         * TODO 鍚庣画闇�瑕佽皟鐢↖FS鐨勬帴鍙� 绉诲叆鐨勫簱浣嶅彿 toLocation
+         */
+        // 妫�楠屽悗绉诲簱
+        toLocation = "1301";
+        Map<String, Object> moveResultMap = new HashMap<>();
+        List<Map<String, Object>> moveResultList = new ArrayList<>();
+        Map<String, Object> moveMap = new HashMap<>();
+        moveMap.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
+        moveMap.put("LINE_NO", one.getLineNo());
+        moveMap.put("RELEASE_NO", one.getReleaseNo());
+        moveMap.put("RECEIPT_NO", one.getReceiptNo());
+        moveMap.put("PART_NO", one.getPartNo());
+        moveMap.put("QTY", one.getPurQtyInStore());
+        moveMap.put("LOCATION_NO", one.getLocationNo());
+        moveMap.put("TO_LOCATION_NO", toLocation);
+        moveMap.put("LOT_BATCH_NO", one.getLotBatchNo());
+        moveMap.put("SERIAL_NO", one.getSerialNo());
+        moveMap.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo());
+        moveMap.put("ENG_CHG_LEVEL", one.getEngChgLevel());
+        moveMap.put("ACTIVITY_SEQ", one.getActivitySeq());
+        moveResultList.add(moveMap);
+        moveResultMap.put("RECORD_ID", UUID.randomUUID().toString());
+        moveResultMap.put("SYSCODE", "LIMS");
+        moveResultMap.put("SYSMODEL", "妫�楠屽悗绉诲簱");
+        moveResultMap.put("BATCH_INFO", moveResultList);
+
+        Result result1 = ifsApiUtils.moveReceipt(JSONUtil.toJsonStr(moveResultMap));
+        // 濡傛灉鏈夊繀椤讳负闆朵欢鎸囧畾鎵瑰彿鎶ラ敊闇�瑕侀噸鏂版彁浜ょЩ搴撲俊鎭幓鎸囧畾鎵瑰彿
+        if (result1.getCode() != 200) {
+            String message = result1.getMessage();
+            if (message.contains("蹇呴』涓洪浂浠�") && message.contains("鎸囧畾鎵瑰彿")) {
+                updaeBatch(one, toLocation);
+            } else {
+                throw new ErrorException("IFS妫�楠屽悗绉诲簱澶辫触: " + result1.getMessage());
+            }
+        }
+        return toLocation;
+    }
+
+
+    /**
+     * 鍏堜慨鏀归噰璐鍗曟壒娆″彿, 鍚庤繘琛岀Щ搴撴搷浣�
+     * @param one
+     * @param toLocation
+     */
+    private void updaeBatch(IfsInventoryQuantity one, String toLocation) {
+        if (one.getIsUpdateBatch().equals(0)) {
+            // 鍏堜慨鏀规壒娆″彿鍚庤繘琛岀Щ搴�
+            Map<String, Object> resultMap = new HashMap<>();
+            List<Map<String, Object>> resultList = new ArrayList<>();
+            Map<String, Object> map = new HashMap<>();
+            map.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
+            map.put("LINE_NO", one.getLineNo()); // 琛屽彿
+            map.put("RELEASE_NO", one.getReleaseNo()); // 涓嬭揪鍙�
+            map.put("RECEIPT_NO", one.getReceiptNo()); // 鎺ユ敹鍙�
+            map.put("PART_NO", one.getPartNo()); //闆朵欢鍙�
+            map.put("CONFIGURATION_ID", one.getConfigurationId()); // 閰嶇疆鏍囪瘑
+            map.put("LOCATION_NO", one.getLocationNo()); // 搴撲綅鍙�
+            map.put("LOT_BATCH_NO", one.getLotBatchNo());// 鎵规鍙�
+            map.put("NEW_LOT_BATCH_NO", one.getUpdateBatchNo()); // 鐩爣鎵规鍙�
+            map.put("SERIAL_NO", one.getSerialNo()); // 搴忓垪鍙�
+            map.put("ENG_CHG_LEVEL", one.getEngChgLevel()); // 鐗堟湰鍙�
+            map.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo()); // wdr鍙�
+            map.put("ACTIVITY_SEQ", one.getActivitySeq()); // 娲诲姩搴忓彿
+            map.put("QTY_TO_CHANGE", one.getQtyArrived()); // 鍙樻洿鏁伴噺
+            resultList.add(map);
+            resultMap.put("RECORD_ID", UUID.randomUUID().toString());
+            resultMap.put("SYSCODE", "LIMS");
+            resultMap.put("SYSMODEL", "淇敼閲囪喘璁㈠崟鎵规鍙�");
+            resultMap.put("BATCH_INFO", resultList);
+
+            Result result = ifsApiUtils.updateMoveReceiptLot(JSONUtil.toJsonStr(resultMap));
+
+            if (result.getCode() != 200) {
+                throw new ErrorException("IFS淇敼鎵规鍙峰け璐�: " + result.getMessage());
+            }
+            ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                    .set(IfsInventoryQuantity::getIsUpdateBatch, 1)
+                    .eq(IfsInventoryQuantity::getId, one.getId()));
+        }
+
+        Map<String, Object> moveResultMap = new HashMap<>();
+        List<Map<String, Object>> moveResultList = new ArrayList<>();
+        Map<String, Object> moveMap = new HashMap<>();
+        moveMap.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
+        moveMap.put("LINE_NO", one.getLineNo());
+        moveMap.put("RELEASE_NO", one.getReleaseNo());
+        moveMap.put("RECEIPT_NO", one.getReceiptNo());
+        moveMap.put("PART_NO", one.getPartNo());
+        moveMap.put("QTY", one.getQtyArrived());
+        moveMap.put("LOCATION_NO", one.getLocationNo());
+        moveMap.put("TO_LOCATION_NO", toLocation);
+        moveMap.put("LOT_BATCH_NO", one.getUpdateBatchNo());
+        moveMap.put("SERIAL_NO", one.getSerialNo());
+        moveMap.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo());
+        moveMap.put("ENG_CHG_LEVEL", one.getEngChgLevel());
+        moveMap.put("ACTIVITY_SEQ", one.getActivitySeq());
+        moveResultList.add(moveMap);
+        moveResultMap.put("RECORD_ID", UUID.randomUUID().toString());
+        moveResultMap.put("SYSCODE", "LIMS");
+        moveResultMap.put("SYSMODEL", "妫�楠屽悗绉诲簱");
+        moveResultMap.put("BATCH_INFO", moveResultList);
+
+        Result result1 = ifsApiUtils.moveReceipt(JSONUtil.toJsonStr(moveResultMap));
+        if (result1.getCode() != 200) {
+            throw new ErrorException("IFS妫�楠屽悗绉诲簱澶辫触: " + result1.getMessage());
+        }
+
+    }
+
 }
 
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
index 568a0ec..6d549f7 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
@@ -1,6 +1,5 @@
 package com.ruoyi.inspect.service.impl;
 
-import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.excel.EasyExcel;
@@ -11,7 +10,6 @@
 import com.aspose.words.SaveFormat;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
@@ -25,15 +23,18 @@
 import com.itextpdf.text.pdf.PdfContentByte;
 import com.itextpdf.text.pdf.PdfReader;
 import com.itextpdf.text.pdf.PdfStamper;
-import com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto;
 import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
 import com.ruoyi.basic.pojo.IfsInventoryQuantity;
+import com.ruoyi.basic.vo.IfsInventoryQuantityVO;
+import com.ruoyi.common.config.WechatProperty;
 import com.ruoyi.common.constant.InsOrderTypeConstants;
 import com.ruoyi.common.constant.MenuJumpPathConstants;
 import com.ruoyi.common.core.domain.Result;
 import com.ruoyi.common.core.domain.entity.InformationNotification;
-import com.ruoyi.common.config.WechatProperty;
-import com.ruoyi.common.utils.*;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
 import com.ruoyi.common.utils.api.IfsApiUtils;
 import com.ruoyi.framework.exception.ErrorException;
 import com.ruoyi.inspect.dto.InsReportExport;
@@ -42,15 +43,17 @@
 import com.ruoyi.inspect.pojo.*;
 import com.ruoyi.inspect.service.InsOrderService;
 import com.ruoyi.inspect.service.InsReportService;
-import com.ruoyi.inspect.mapper.InsUnqualifiedHandlerMapper;
+import com.ruoyi.inspect.service.RawMaterialOrderService;
 import com.ruoyi.system.mapper.UserMapper;
 import com.ruoyi.system.service.InformationNotificationService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.xwpf.usermodel.*;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -116,6 +119,8 @@
     private IfsApiUtils ifsApiUtils;
     @Resource
     private InsSampleUserMapper insSampleUserMapper;
+    @Autowired
+    private RawMaterialOrderService rawMaterialOrderService;
 
 
     @Override
@@ -793,8 +798,9 @@
         stamp.close();
     }
 
-    @Transactional(rollbackFor = Exception.class)
-    public void isRawMaterial(InsOrder insOrder) {
+    @Override
+    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
+    public void isRawMaterial(InsOrder insOrder,Boolean registerInsResults,Boolean hasExemption) {
         IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectOne(new LambdaQueryWrapper<IfsInventoryQuantity>()
                 .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
         if (Objects.isNull(one)) {
@@ -808,9 +814,25 @@
         // 鍒ゆ柇鏄惁鏈変笉鍚堟牸
         Long unqualifiedCount = getUnqualifiedCount(insOrder);
 
-        if (count.equals(0L) && unqualifiedCount.equals(0L) && one.getIsFinish().equals(0) && one.getIsSource().equals(1)) {
+        if (count.equals(0L) && unqualifiedCount.equals(0L) && one.getIsFinish().equals(0) && one.getIsSource().equals(1) && registerInsResults) {
             // 鍘熸潗鏂欑Щ搴�
-            toLocation = this.moveRawMaterial(one);
+            //濡傛灉鏄媶鍒嗙殑璁㈠崟锛屽垯鎶婃媶鍒嗙殑鎵�鏈夋壒娆¢兘绉诲簱
+            if(one.getIsSplitOrder()==1 && !hasExemption){
+                //鏌ヨ鎷嗗垎璁㈠崟璇︽儏
+                List<IfsInventoryQuantityVO> ifsInventoryQuantityVOS = ifsInventoryQuantityMapper.selectSplitOrderList(one.getPartNo(), one.getLineNo(), one.getReleaseNo(), one.getReceiptNo(), one.getOrderNo());
+                for (IfsInventoryQuantityVO vo : ifsInventoryQuantityVOS) {
+                    //濡傛灉鏈夊鎵樺崟淇℃伅涓斿悎鏍硷紝璧扮櫥璁板悗绉诲簱锛涘鏋滄病鏈夛紝鍒欒蛋鍏嶆锛涗笉鍚堟牸涓嶅仛澶勭悊
+                    if(Objects.isNull(vo.getInsOrderId())){
+                        rawMaterialOrderService.rawOrderRelease(vo.getId(), vo.getPartDesc());
+                    }else if(Objects.equals(vo.getInsOrderId(),insOrder.getId())){
+                        toLocation = insOrderService.moveRawMaterial(vo);
+                    }else if(Objects.nonNull(vo.getInsResult()) && 1 == vo.getInsResult()){
+                        toLocation = insOrderService.moveRawMaterial(vo);
+                    }
+                }
+            }else{
+                toLocation = insOrderService.moveRawMaterial(one);
+            }
         }
 
         // 鍒ゆ柇缁撴潫鐘舵�佷慨鏀瑰悎鏍肩姸鎬�
@@ -895,75 +917,6 @@
             }
         }
         return unqualifiedCount;
-    }
-
-    /**
-     * ifs绉诲簱鎿嶄綔
-     * @param one
-     * @return
-     */
-    @Override
-    public String moveRawMaterial(IfsInventoryQuantity one) {
-        String toLocation;
-        // 鐧昏閲囪喘妫�楠岀粨鏋淪TD
-        if (one.getIsRegister().equals(0)) {
-            Map<String, Object> resultMap = new HashMap<>();
-            List<Map<String, Object>> resultList = new ArrayList<>();
-            Map<String, Object> map = new HashMap<>();
-            map.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
-            map.put("LINE_NO", one.getLineNo()); // 琛屽彿
-            map.put("RELEASE_NO", one.getReleaseNo()); // 涓嬭揪鍙�
-            map.put("RECEIPT_NO", one.getReceiptNo()); // 鎺ユ敹鍙�
-            map.put("PURCH_QTY", one.getQtyToInspect()); // 瑕佹楠岀殑閲囪喘鏁伴噺
-            resultList.add(map);
-            resultMap.put("RECORD_ID", UUID.randomUUID().toString());
-            resultMap.put("SYSCODE", "LIMS");
-            resultMap.put("SYSMODEL", "鐧昏閲囪喘妫�楠岀粨鏋�");
-            resultMap.put("BATCH_INFO", resultList);
-            Result result = ifsApiUtils.getProcurementResults(JSONUtil.toJsonStr(resultMap));
-            if (result.getCode() != 200) {
-                throw new ErrorException("IFS鐧昏閲囪喘妫�楠岀粨鏋滃け璐�: " + result.getMessage());
-            }
-        }
-        insOrderService.updateIfsInventoryQuantity(one.getId());
-        /**
-         * TODO 鍚庣画闇�瑕佽皟鐢↖FS鐨勬帴鍙� 绉诲叆鐨勫簱浣嶅彿 toLocation
-         */
-        // 妫�楠屽悗绉诲簱
-        toLocation = "1301";
-        Map<String, Object> moveResultMap = new HashMap<>();
-        List<Map<String, Object>> moveResultList = new ArrayList<>();
-        Map<String, Object> moveMap = new HashMap<>();
-        moveMap.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
-        moveMap.put("LINE_NO", one.getLineNo());
-        moveMap.put("RELEASE_NO", one.getReleaseNo());
-        moveMap.put("RECEIPT_NO", one.getReceiptNo());
-        moveMap.put("PART_NO", one.getPartNo());
-        moveMap.put("QTY", one.getQtyArrived());
-        moveMap.put("LOCATION_NO", one.getLocationNo());
-        moveMap.put("TO_LOCATION_NO", toLocation);
-        moveMap.put("LOT_BATCH_NO", one.getLotBatchNo());
-        moveMap.put("SERIAL_NO", one.getSerialNo());
-        moveMap.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo());
-        moveMap.put("ENG_CHG_LEVEL", one.getEngChgLevel());
-        moveMap.put("ACTIVITY_SEQ", one.getActivitySeq());
-        moveResultList.add(moveMap);
-        moveResultMap.put("RECORD_ID", UUID.randomUUID().toString());
-        moveResultMap.put("SYSCODE", "LIMS");
-        moveResultMap.put("SYSMODEL", "妫�楠屽悗绉诲簱");
-        moveResultMap.put("BATCH_INFO", moveResultList);
-
-        Result result1 = ifsApiUtils.moveReceipt(JSONUtil.toJsonStr(moveResultMap));
-        // 濡傛灉鏈夊繀椤讳负闆朵欢鎸囧畾鎵瑰彿鎶ラ敊闇�瑕侀噸鏂版彁浜ょЩ搴撲俊鎭幓鎸囧畾鎵瑰彿
-        if (result1.getCode() != 200) {
-            String message = result1.getMessage();
-            if (message.contains("蹇呴』涓洪浂浠�") && message.contains("鎸囧畾鎵瑰彿")) {
-                updaeBatch(one, toLocation);
-            } else {
-                throw new ErrorException("IFS妫�楠屽悗绉诲簱澶辫触: " + result1.getMessage());
-            }
-        }
-        return toLocation;
     }
 
     /**
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java
index ebaac84..50a5633 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java
@@ -1,14 +1,18 @@
 package com.ruoyi.inspect.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.alibaba.excel.write.metadata.WriteSheet;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -25,16 +29,22 @@
 import com.ruoyi.common.utils.QueryWrappers;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.common.utils.api.IfsApiUtils;
 import com.ruoyi.inspect.dto.CopperInsOrderDto;
+import com.ruoyi.inspect.dto.OrderSplitDTO;
 import com.ruoyi.inspect.dto.RawMaterialStandardTreeDto;
 import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
 import com.ruoyi.basic.mapper.StandardTreeMapper;
 import com.ruoyi.inspect.dto.SampleProductDto;
+import com.ruoyi.inspect.excel.OrderSplitExcelData;
+import com.ruoyi.inspect.excel.OrderSplitExcelListener;
 import com.ruoyi.inspect.mapper.InsOrderMapper;
 import com.ruoyi.inspect.mapper.InsProductMapper;
 import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
 import com.ruoyi.inspect.pojo.InsOrder;
 import com.ruoyi.inspect.pojo.InsReport;
+import com.ruoyi.inspect.service.IfsSplitOrderRecordService;
 import com.ruoyi.inspect.service.InsOrderService;
 import com.ruoyi.inspect.service.InsReportService;
 import com.ruoyi.inspect.service.RawMaterialOrderService;
@@ -46,18 +56,24 @@
 import lombok.AllArgsConstructor;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 /**
  * @Author zhuo
@@ -79,6 +95,10 @@
     private ThreadPoolTaskExecutor threadPoolTaskExecutor;
     private InsProductMapper insProductMapper;
     private AuxiliaryOutputWorkingHoursMapper auxiliaryOutputWorkingHoursMapper;
+    private IfsApiUtils ifsApiUtils;
+
+    private IfsSplitOrderRecordService ifsSplitOrderRecordService;
+
 
 
     @Override
@@ -142,7 +162,7 @@
      * @return
      */
     @Override
-    public int inspectionReport(List<Integer> ids) {
+    public int inspectionReport(List<Long> ids) {
         Integer userId = SecurityUtils.getUserId().intValue();
         ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
                 .in(IfsInventoryQuantity::getId, ids)
@@ -185,7 +205,7 @@
      * @return
      */
     @Override
-    public int revokeInspectionReport(Integer id) {
+    public int revokeInspectionReport(Long id) {
         return ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
                 .eq(IfsInventoryQuantity::getId, id)
                 .set(IfsInventoryQuantity::getIsInspect, 0)
@@ -248,7 +268,7 @@
      * @return
      */
     @Override
-    public boolean repealRawOrder(Integer ifsInventoryId) {
+    public boolean repealRawOrder(Long ifsInventoryId) {
         // 鏌ヨ鍒ゆ柇鏄惁鏄摐鍗曚笣
         IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
         if (ifsInventoryQuantity.getIsCopper() != null && ifsInventoryQuantity.getIsCopper().equals(1)) {
@@ -338,7 +358,7 @@
         addAuxiliary(insOrder, ifsInventoryQuantity);
 
         // todo: ifs鐩存帴绉诲簱
-        insReportService.isRawMaterial(insOrder);
+        insReportService.isRawMaterial(insOrder,true,true);
 
         return insOrder.getId();
     }
@@ -390,7 +410,7 @@
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean rawOrderRelease(Integer ifsInventoryId, String partDetail) {
+    public boolean rawOrderRelease(Long ifsInventoryId, String partDetail) {
         // 淇敼鍘熸潗鏂欐暟鎹洿鎺ヤ负宸叉楠�
         ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
                 .set(IfsInventoryQuantity::getState, 2)
@@ -432,7 +452,7 @@
         addAuxiliary(insOrder, ifsInventoryQuantity);
 
         // todo: ifs鐩存帴绉诲簱
-        insReportService.isRawMaterial(insOrder);
+        insReportService.isRawMaterial(insOrder,true,true);
         return true;
     }
 
@@ -444,7 +464,7 @@
      * @return
      */
     @Override
-    public int notificationRawOrder(Integer ifsInventoryId) {
+    public int notificationRawOrder(Long ifsInventoryId) {
         IfsInventoryQuantity ifsInventory = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
         // 鏌ヨ褰撳墠鎵规, 渚涘簲鍟�, 闆朵欢鍙风殑鍘熸潗鏂欐槸鍚﹁秴杩囦簡20鍚�, 瓒呰繃浜�20鍚ㄩ渶瑕佽繘琛屽娆℃楠屾彁閱�
         List<IfsInventoryQuantity> quantityList = ifsInventoryQuantityMapper.selectList(Wrappers.<IfsInventoryQuantity>lambdaQuery()
@@ -570,7 +590,7 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean concessionRelease(Integer ifsInventoryId) {
+    public boolean concessionRelease(Long ifsInventoryId) {
         // 鏌ヨ鍘熸潗鏂欎俊鎭�
         IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
         if (!ifsInventoryQuantity.getInspectStatus().equals(2)) {
@@ -578,7 +598,7 @@
         }
 
         // todo:闇�瑕佸垽鏂璷a娴佺▼鏄惁鏄姝ユ斁琛�
-        String toLocation = insReportService.moveRawMaterial(ifsInventoryQuantity);
+        String toLocation = insOrderService.moveRawMaterial(ifsInventoryQuantity);
 
         ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
                 .set(IfsInventoryQuantity::getInspectStatus, 4)
@@ -759,7 +779,7 @@
      * @return
      */
     @Override
-    public boolean advancedGodown(Integer ifsInventoryId) {
+    public boolean advancedGodown(Long ifsInventoryId) {
         // 鏌ヨ鍘熸潗鏂欎俊鎭�
         IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
         if (!ifsInventoryQuantity.getInspectStatus().equals(0)
@@ -768,7 +788,7 @@
         }
 
         // todo:闇�瑕佸垽鏂璷a娴佺▼鏄惁鏄姝ユ斁琛�
-        String toLocation = insReportService.moveRawMaterial(ifsInventoryQuantity);
+        String toLocation = insOrderService.moveRawMaterial(ifsInventoryQuantity);
 
         ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
                 .set(IfsInventoryQuantity::getInspectStatus, 1)
@@ -779,6 +799,145 @@
         return true;
     }
 
+    @Override
+    public void downloadTemplate(HttpServletResponse response) {
+        response.reset();
+        try{
+            String fileName = "璁㈠崟鎷嗗垎瀵煎叆妯℃澘" + ExcelTypeEnum.XLSX.getValue();
+            fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
+            response.setContentType("application/vnd.ms-excel");
+            response.setHeader("Cache-Control", "no-cache");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+            //璁㈠崟鎷嗗垎瀵煎叆妯℃澘鏂囦欢
+            InputStream inputStream = this.getClass().getResourceAsStream("/static/split_order_import_template.xlsx");
+            IoUtil.copy(inputStream,response.getOutputStream());
+            inputStream.close();
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new RuntimeException("妯℃澘涓嬭浇澶辫触");
+        }
+    }
+
+    @Override
+    public Result importSplitOrderData(MultipartFile file, Long ifsId, HttpServletRequest request) {
+        try {
+            IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsId);
+            OrderSplitExcelListener listener = new OrderSplitExcelListener(ifsInventoryQuantity);
+            EasyExcel.read(file.getInputStream(), listener).sheet().headRowNumber(2).doRead();
+            if(StringUtils.isNotBlank(listener.errorMsg)){
+                return Result.fail(201,listener.errorMsg);
+            }
+            return Result.success(listener.getDataList());
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎叆澶辫触:"+e.getMessage());
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
+    public boolean confirmSplitOrder(OrderSplitDTO orderSplitDTO) {
+        //1.鏌ヨifs璁㈠崟淇℃伅
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(orderSplitDTO.getIfsId());
+        if(Objects.isNull(ifsInventoryQuantity)){
+            throw new RuntimeException("鏈煡璇㈠埌璇FS璁㈠崟淇℃伅");
+        }
+        //2.瀵规帴ifs閲囪喘鎺ユ敹鏇存敼鎵瑰彿鎺ュ彛
+        //缁勮璇锋眰鍙傛暟inAttr
+        List<String> newLotBathNo = new ArrayList<>();//鏂版壒鍙峰垪琛�
+        Map<String,Object> inAttrMap = new HashMap<>();
+        inAttrMap.put("RECORD_ID",UUID.randomUUID().toString());
+        inAttrMap.put("SYSCODE","LIMS_ZB");
+        inAttrMap.put("SYSMODEL","瑁呭LIMS璁㈠崟鎷嗗垎");
+        List<Map<String,Object>> batchInfoData = new ArrayList<>();
+        if(Objects.nonNull(orderSplitDTO.getSplitDetailList()) && !orderSplitDTO.getSplitDetailList().isEmpty()){
+            for (OrderSplitExcelData data : orderSplitDTO.getSplitDetailList()) {
+                Map<String, Object> infoMap = new HashMap<>();
+                infoMap.put("ORDER_NO",ifsInventoryQuantity.getOrderNo());
+                infoMap.put("LINE_NO",ifsInventoryQuantity.getLineNo());
+                infoMap.put("RELEASE_NO",ifsInventoryQuantity.getReleaseNo());
+                infoMap.put("RECEIPT_NO",ifsInventoryQuantity.getReceiptNo());
+                infoMap.put("PART_NO",ifsInventoryQuantity.getPartNo());
+                infoMap.put("CONFIGURATION_ID",ifsInventoryQuantity.getConfigurationId());
+                infoMap.put("LOCATION_NO",ifsInventoryQuantity.getLocationNo());
+                infoMap.put("LOT_BATCH_NO",ifsInventoryQuantity.getLotBatchNo());
+                infoMap.put("NEW_LOT_BATCH_NO",data.getLotBatchNo());
+                newLotBathNo.add(data.getLotBatchNo());
+                infoMap.put("SERIAL_NO",ifsInventoryQuantity.getSerialNo());
+                infoMap.put("ENG_CHG_LEVEL",ifsInventoryQuantity.getEngChgLevel());
+                infoMap.put("WAIV_DEV_REJ_NO",ifsInventoryQuantity.getWaivDevRejNo());
+                infoMap.put("ACTIVITY_SEQ",ifsInventoryQuantity.getActivitySeq());
+                infoMap.put("QTY_TO_CHANGE",data.getQtyStock());
+                batchInfoData.add(infoMap);
+            }
+        }
+        inAttrMap.put("BATCH_INFO", batchInfoData);
+        String inAttr = JSONObject.toJSONString(inAttrMap);
+        //璋冪敤ifs鎺ュ彛
+        Result result = ifsApiUtils.updateMoveReceiptLot(inAttr);
+        if(result.getCode()!=200){
+            throw new RuntimeException("IFS閲囪喘鎺ユ敹鏇存敼鎵瑰彿璇锋眰寮傚父锛�"+result.getMessage());
+        }
+        //鏇存柊涓昏鍗曠殑鎶佃揪閲囪喘鏁伴噺
+        BigDecimal purQtyInStore = orderSplitDTO.getSplitDetailList()
+                .stream()
+                .map(OrderSplitExcelData::getQtyStock)
+                .reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
+        BigDecimal newPurQtyInStore = ifsInventoryQuantity.getPurQtyInStore().subtract(purQtyInStore);
+        //濡傛灉鎷嗗垎鍚庯紝鍓╀綑鐨勫簱瀛樻暟閲忎负0锛屽垯鍒犻櫎鎵瑰彿涓�*鐨勮鍗曚俊鎭�
+        if(newPurQtyInStore.compareTo(BigDecimal.ZERO)==0){
+            ifsInventoryQuantityMapper.deleteById(ifsInventoryQuantity.getId());
+        }else{
+            ifsInventoryQuantityMapper.update(null,Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                    .set(IfsInventoryQuantity::getPurQtyInStore,newPurQtyInStore)
+                    .set(IfsInventoryQuantity::getInvQtyInStore,newPurQtyInStore)
+                    .eq(IfsInventoryQuantity::getId,ifsInventoryQuantity.getId())
+            );
+        }
+        //ifs鏇存敼鎵瑰彿鎺ュ彛璋冪敤鎴愬姛锛屾媺鍙栨柊鎷嗗垎鐨刬fs璁㈠崟骞舵姤妫�
+        Map<String, Object> map = new HashMap<>();
+        map.put("LOCATION_NO","1302");
+        map.put("STATE_DB","To be Inspected");
+        map.put("PART_NO",ifsInventoryQuantity.getPartNo());
+        map.put("ORDER_NO",ifsInventoryQuantity.getOrderNo());
+        map.put("LINE_NO",ifsInventoryQuantity.getLineNo());
+        map.put("RELEASE_NO",ifsInventoryQuantity.getReleaseNo());
+        map.put("RECEIPT_NO",ifsInventoryQuantity.getReceiptNo());
+        map.put("LOT_BATCH_NO",String.join(";",newLotBathNo));
+        insOrderService.getIfsOrder(map,true);
+        //鏌ヨ鏂版媶鍒嗙殑璁㈠崟淇℃伅
+        List<IfsInventoryQuantity> splitOrderList = ifsInventoryQuantityMapper.selectList(Wrappers.<IfsInventoryQuantity>lambdaQuery()
+                .eq(IfsInventoryQuantity::getLocationNo, "1302")
+                .eq(IfsInventoryQuantity::getStatusDb, "To be Inspected")
+                .eq(IfsInventoryQuantity::getPartNo, ifsInventoryQuantity.getPartNo())
+                .eq(IfsInventoryQuantity::getOrderNo, ifsInventoryQuantity.getOrderNo())
+                .eq(IfsInventoryQuantity::getLineNo, ifsInventoryQuantity.getLineNo())
+                .eq(IfsInventoryQuantity::getReleaseNo, ifsInventoryQuantity.getReleaseNo())
+                .eq(IfsInventoryQuantity::getReceiptNo, ifsInventoryQuantity.getReceiptNo())
+                .in(IfsInventoryQuantity::getLotBatchNo, newLotBathNo)
+        );
+        //鎵ц鎶ユ鎿嶄綔
+        if(Objects.nonNull(splitOrderList) && !splitOrderList.isEmpty()){
+            List<Long> ids = splitOrderList.stream().map(IfsInventoryQuantity::getId).collect(Collectors.toList());
+            ids.add(ifsInventoryQuantity.getId());
+            this.inspectionReport(ids);
+        }
+        //鍕鹃�夊悓姝ュ埌MES锛屼繚瀛樿鍗曟媶鍒嗚褰�
+        if(orderSplitDTO.getPushToMes()){
+            List<IfsSplitOrderRecord> collect = orderSplitDTO.getSplitDetailList().stream().map(m -> {
+                IfsSplitOrderRecord record = new IfsSplitOrderRecord();
+                BeanUtil.copyProperties(m, record);
+                record.setOrderNo(ifsInventoryQuantity.getOrderNo());
+                record.setLineNo(ifsInventoryQuantity.getLineNo());
+                record.setReleaseNo(ifsInventoryQuantity.getReleaseNo());
+                record.setReceiptNo(ifsInventoryQuantity.getReceiptNo());
+                return record;
+            }).collect(Collectors.toList());
+            return ifsSplitOrderRecordService.saveBatch(collect);
+        }
+        return false;
+    }
 
     /**
      * 娣诲姞宸ユ椂
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java b/inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java
index c15200c..95fb08e 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java
@@ -5,6 +5,8 @@
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * @Author zhuo
@@ -21,6 +23,9 @@
      */
     @Scheduled(fixedDelay = 1200000)
     public void getIfsOrderTiming() {
-        insOrderService.getIfsOrder();
+        Map<String, Object> map = new HashMap<>();
+        map.put("LOCATION_NO","1302");
+        map.put("STATE_DB","To be Inspected");
+        insOrderService.getIfsOrder(map,false);
     }
 }
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPlanVO.java b/inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPlanVO.java
index d1748f2..85a0de4 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPlanVO.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPlanVO.java
@@ -75,4 +75,6 @@
     @ApiModelProperty("鎶ュ憡id")
     private Integer insReportId;
 
+    @ApiModelProperty(value = "鏄惁涓烘媶鍒嗚鍗�(0:鍚� 1:鏄�)")
+    private Integer isSplitOrder;
 }
diff --git a/inspect-server/src/main/resources/mapper/IfsSplitOrderRecordMapper.xml b/inspect-server/src/main/resources/mapper/IfsSplitOrderRecordMapper.xml
new file mode 100644
index 0000000..50a7493
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/IfsSplitOrderRecordMapper.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.inspect.mapper.IfsSplitOrderRecordMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.inspect.pojo.IfsSplitOrderRecord">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="orderNo" column="order_no" jdbcType="VARCHAR"/>
+            <result property="lineNo" column="line_no" jdbcType="VARCHAR"/>
+            <result property="releaseNo" column="release_no" jdbcType="VARCHAR"/>
+            <result property="receiptNo" column="receipt_no" jdbcType="INTEGER"/>
+            <result property="partNo" column="part_no" jdbcType="VARCHAR"/>
+            <result property="systemNo" column="system_no" jdbcType="VARCHAR"/>
+            <result property="spec" column="spec" jdbcType="VARCHAR"/>
+            <result property="lotBatchNo" column="lot_batch_no" jdbcType="VARCHAR"/>
+            <result property="length" column="length" jdbcType="DECIMAL"/>
+            <result property="qtyStock" column="qty_stock" jdbcType="DECIMAL"/>
+            <result property="insulationColor" column="insulation_color" jdbcType="VARCHAR"/>
+            <result property="outerColor" column="outer_color" jdbcType="VARCHAR"/>
+            <result property="letteringInfo" column="lettering_info" jdbcType="VARCHAR"/>
+            <result property="drumNo" column="drum_no" jdbcType="VARCHAR"/>
+            <result property="locationNo" column="location_no" jdbcType="VARCHAR"/>
+            <result property="stockSource" column="stock_source" jdbcType="VARCHAR"/>
+            <result property="remark" column="remark" jdbcType="VARCHAR"/>
+            <result property="syncStatus" column="sync_status" jdbcType="TINYINT"/>
+            <result property="createUser" column="create_user" jdbcType="INTEGER"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUser" column="update_user" jdbcType="INTEGER"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,order_no,line_no,
+        release_no,receipt_no,part_no,
+        system_no,spec,lot_batch_no,
+        length,qty_stock,insulation_color,
+        outer_color,lettering_info,drum_no,
+        location_no,stock_source,remark,
+        sync_status,create_user,create_time,
+        update_user,update_time
+    </sql>
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/InsSampleMapper.xml b/inspect-server/src/main/resources/mapper/InsSampleMapper.xml
index cda7bff..4a8569d 100644
--- a/inspect-server/src/main/resources/mapper/InsSampleMapper.xml
+++ b/inspect-server/src/main/resources/mapper/InsSampleMapper.xml
@@ -192,7 +192,8 @@
         ira.url,
         ira.url_s,
         ira.temp_url_pdf,
-        iiq.is_copper
+        iiq.is_copper,
+        iiq.is_split_order
         FROM
         ins_order io
         LEFT JOIN ins_sample isa ON isa.ins_order_id = io.id
diff --git a/inspect-server/src/main/resources/static/split_order_import_template.xlsx b/inspect-server/src/main/resources/static/split_order_import_template.xlsx
new file mode 100644
index 0000000..1ac0789
--- /dev/null
+++ b/inspect-server/src/main/resources/static/split_order_import_template.xlsx
Binary files differ
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index c88c67b..6cb9fd4 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -8,7 +8,7 @@
     druid:
       # 涓诲簱鏁版嵁婧�
       master:
-        url: jdbc:mysql://localhost:3306/center-lims?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        url: jdbc:mysql://localhost:3307/center-lims-ztzb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
         username: root
         password: 123456
       # 浠庡簱鏁版嵁婧�
@@ -71,7 +71,7 @@
     # 鏁版嵁搴撶储寮�
     database: 0
     #    # 瀵嗙爜
-    #    password: root2022!
+    password: 123456
     # 杩炴帴瓒呮椂鏃堕棿
     timeout: 10s
     lettuce:
@@ -149,7 +149,13 @@
 # 浼佷笟寰俊閫氱煡
 wechat:
   # 璐ㄩ噺鎶ユ閫氱煡
-  examiningUrl: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=21993616-9966-4fe4-81b0-68e99a40c964
+  examiningUrl: #https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=21993616-9966-4fe4-81b0-68e99a40c964
+
+mes:
+  ztzb:
+    ip: http://192.168.7.48:8100
+    user: chen
+    password: ojAX5Ws3z0/LXRtjGdjKYQ==
 
 ifs:
   contract: ZTZB
diff --git a/ruoyi-admin/src/main/resources/application-ztzb.yml b/ruoyi-admin/src/main/resources/application-ztzb.yml
index e879f12..df6b62c 100644
--- a/ruoyi-admin/src/main/resources/application-ztzb.yml
+++ b/ruoyi-admin/src/main/resources/application-ztzb.yml
@@ -142,6 +142,12 @@
   # 璐ㄩ噺鎶ユ閫氱煡
   examiningUrl: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=6e1d2d18-0c60-4889-a05f-b1b5479c9188
 
+mes:
+  ztzb:
+    ip: http://192.168.7.46
+    user: lims
+    password: qCzOMJlqE8TYOHDWGva/Tw==
+
 # 浜轰簨绯荤粺
 personnel:
   # 姝e紡鍦板潃
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/api/MesApiUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/api/MesApiUtils.java
new file mode 100644
index 0000000..98f2f2f
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/api/MesApiUtils.java
@@ -0,0 +1,93 @@
+package com.ruoyi.common.utils.api;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+@Slf4j
+@Component
+public class MesApiUtils {
+
+    @Value("${mes.ztzb.ip}")
+    String ip;
+
+    @Value("${mes.ztzb.user}")
+    String user;
+
+    @Value("${mes.ztzb.password}")
+    String password;
+
+    /**
+     * 鑾峰彇token璇锋眰閾炬帴
+     * @return
+     */
+    private String getAuthTokenUrl() {
+        return ip + "/auth/oauth/token?randomStr=blockPuzzle&grant_type=password";
+    }
+
+    /**
+     * 鏂板瀹炴椂搴撳瓨璇锋眰閾炬帴
+     * @return
+     */
+    private String getBatchAddStockUrl(){
+        return ip + "/mes/stock/batchAddStock";
+    }
+
+    /**
+     * 鑾峰彇mes绯荤粺token
+     * @return 鎺ュ彛鍝嶅簲缁撴灉
+     */
+    public String getToken(){
+        try{
+            Map<String,Object> bodyMap = new HashMap<>();
+            bodyMap.put("username",user);
+            String bodyStr = "username="+user+"&password="+password;
+            String response = HttpRequest.post(getAuthTokenUrl())
+                    .header("Authorization", "Basic cGlnOnBpZw==")
+                    .header("Content-Type", "application/x-www-form-urlencoded")
+                    .body(bodyStr,"application/x-www-form-urlencoded").execute().body();
+            JSONObject responseObj = JSONUtil.parseObj(response);
+            if(Objects.nonNull(responseObj.getStr("access_token"))){
+                return "Bearer " + responseObj.getStr("access_token");
+            }else{
+                throw new RuntimeException(responseObj.getStr("msg"));
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new RuntimeException("鑾峰彇MES绯荤粺token鎺ュ彛寮傚父:"+e.getMessage());
+        }
+    }
+
+    /**
+     * mes鏂板瀹炴椂搴撳瓨鎺ュ彛
+     * @param requestJsonStr 璇锋眰鍙傛暟json瀛楃涓�
+     * @return 鎺ュ彛鍝嶅簲缁撴灉
+     */
+    public boolean batchAddStock(String requestJsonStr){
+        try{
+            String response = HttpRequest.post(getBatchAddStockUrl())
+                    .header("Authorization", getToken())
+                    .header("Content-Type", "application/json")
+                    .body(requestJsonStr)
+                    .execute()
+                    .body();
+            JSONObject entries = JSONUtil.parseObj(response);
+            if(entries.getInt("code")==0){
+                return true;
+            }else{
+                throw new RuntimeException("鍚屾鍒癕ES澶辫触锛�"+entries.getStr("msg"));
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new RuntimeException("鍚屾MES瀹炴椂搴撳瓨鎺ュ彛寮傚父:"+e.getMessage());
+        }
+    }
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/ParameterEscaperUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/ParameterEscaperUtil.java
new file mode 100644
index 0000000..1318508
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/ParameterEscaperUtil.java
@@ -0,0 +1,92 @@
+package com.ruoyi.common.utils.http;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 璇锋眰鍙傛暟鐗规畩瀛楃杞箟宸ュ叿绫�
+ * 鐢ㄤ簬澶勭悊HTTP璇锋眰鍙傛暟涓殑鐗规畩瀛楃锛岄槻姝SS鏀诲嚮鍜屽弬鏁拌В鏋愰敊璇�
+ */
+public class ParameterEscaperUtil {
+    // 鐗规畩瀛楃杞箟鏄犲皠琛�
+    private static final Map<Character, String> ESCAPE_MAP;
+    // 杞箟瀛楃鍙嶈浆鏄犲皠琛�
+    private static final Map<String, Character> UNESCAPE_MAP;
+    
+    static {
+        // 鍒濆鍖栬浆涔夋槧灏�
+        ESCAPE_MAP = new HashMap<>();
+        ESCAPE_MAP.put('&', "&");
+        ESCAPE_MAP.put('<', "<");
+        ESCAPE_MAP.put('>', ">");
+        ESCAPE_MAP.put('"', """);
+        ESCAPE_MAP.put('\'', "'");
+        ESCAPE_MAP.put('/', "/");
+        ESCAPE_MAP.put('\\', "\");
+        ESCAPE_MAP.put(' ', "%20");
+        ESCAPE_MAP.put('?', "%3F");
+        ESCAPE_MAP.put('=', "%3D");
+        ESCAPE_MAP.put('+', "%2B");
+        ESCAPE_MAP.put('%', "%25");
+        ESCAPE_MAP.put('#', "%23");
+        ESCAPE_MAP.put(':', "%3A");
+        ESCAPE_MAP.put(';', "%3B");
+        
+        // 鍒濆鍖栧弽杞箟鏄犲皠
+        UNESCAPE_MAP = new HashMap<>();
+        for (Map.Entry<Character, String> entry : ESCAPE_MAP.entrySet()) {
+            UNESCAPE_MAP.put(entry.getValue(), entry.getKey());
+        }
+    }
+    
+    /**
+     * 杞箟璇锋眰鍙傛暟涓殑鐗规畩瀛楃
+     * @param input 鍘熷杈撳叆瀛楃涓�
+     * @return 杞箟鍚庣殑瀛楃涓�
+     */
+    public static String escape(String input) {
+        if (input == null || input.isEmpty()) {
+            return input;
+        }
+        
+        StringBuilder sb = new StringBuilder();
+        for (char c : input.toCharArray()) {
+            // 濡傛灉鏄渶瑕佽浆涔夌殑瀛楃锛屽垯浣跨敤杞箟鍚庣殑瀛楃涓诧紝鍚﹀垯鐩存帴娣诲姞
+            String escaped = ESCAPE_MAP.get(c);
+            sb.append(escaped != null ? escaped : c);
+        }
+        return sb.toString();
+    }
+    
+    /**
+     * 鍙嶈浆涔夎姹傚弬鏁颁腑鐨勭壒娈婂瓧绗�
+     * @param input 杞箟鍚庣殑瀛楃涓�
+     * @return 鍘熷瀛楃涓�
+     */
+    public static String unescape(String input) {
+        if (input == null || input.isEmpty()) {
+            return input;
+        }
+        
+        StringBuilder sb = new StringBuilder();
+        int i = 0;
+        while (i < input.length()) {
+            boolean found = false;
+            // 妫�鏌ユ槸鍚︽槸杞箟搴忓垪
+            for (String escapeSeq : UNESCAPE_MAP.keySet()) {
+                if (input.startsWith(escapeSeq, i)) {
+                    sb.append(UNESCAPE_MAP.get(escapeSeq));
+                    i += escapeSeq.length();
+                    found = true;
+                    break;
+                }
+            }
+            if (!found) {
+                sb.append(input.charAt(i));
+                i++;
+            }
+        }
+        return sb.toString();
+    }
+}
+    
\ No newline at end of file
--
Gitblit v1.9.3