From d28a5401ac1e2995ec6de12a81395aa5d05b040a Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期四, 05 十一月 2026 10:17:49 +0800
Subject: [PATCH] refactor(order): 提取外协判断方法并还原原下单

---
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java |  129 ++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 114 insertions(+), 15 deletions(-)

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 da12559..d3be4ec 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
@@ -7,6 +7,7 @@
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.support.ExcelTypeEnum;
@@ -27,6 +28,7 @@
 import com.ruoyi.common.constant.InsOrderTypeConstants;
 import com.ruoyi.common.core.domain.Result;
 import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.enums.ContractType;
 import com.ruoyi.common.enums.OrderType;
 import com.ruoyi.common.numgen.NumberGenerator;
 import com.ruoyi.common.utils.LimsDateUtil;
@@ -35,10 +37,7 @@
 import com.ruoyi.common.utils.WxCpUtils;
 import com.ruoyi.common.utils.api.IfsApiUtils;
 import com.ruoyi.framework.exception.ErrorException;
-import com.ruoyi.inspect.dto.CopperInsOrderDto;
-import com.ruoyi.inspect.dto.OrderSplitDTO;
-import com.ruoyi.inspect.dto.RawMaterialStandardTreeDto;
-import com.ruoyi.inspect.dto.SampleProductDto;
+import com.ruoyi.inspect.dto.*;
 import com.ruoyi.inspect.excel.OrderSplitExcelData;
 import com.ruoyi.inspect.excel.OrderSplitExcelListener;
 import com.ruoyi.inspect.mapper.InsOrderMapper;
@@ -52,6 +51,8 @@
 import com.ruoyi.inspect.service.InsOrderService;
 import com.ruoyi.inspect.service.InsReportService;
 import com.ruoyi.inspect.service.RawMaterialOrderService;
+import com.ruoyi.inspect.service.OutsourceOrderFlowService;
+import com.ruoyi.inspect.vo.ProductVo;
 import com.ruoyi.performance.mapper.AuxiliaryOutputWorkingHoursMapper;
 import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours;
 import com.ruoyi.system.mapper.UserMapper;
@@ -86,25 +87,35 @@
 public class RawMaterialOrderServiceImpl implements RawMaterialOrderService {
 
     private StandardTreeMapper standardTreeMapper;
+
     private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
+
     private UserMapper userMapper;
+
     private InsOrderService insOrderService;
+
     private InsOrderMapper insOrderMapper;
+
     private InsSampleMapper insSampleMapper;
+
     private final NumberGenerator<InsOrder> numberGenerator;
+
     private InsReportService insReportService;
+
     private WechatProperty wechatProperty;
+
     private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
     private InsProductMapper insProductMapper;
+
     private AuxiliaryOutputWorkingHoursMapper auxiliaryOutputWorkingHoursMapper;
 
     private IfsApiUtils ifsApiUtils;
 
     private IfsSplitOrderRecordService ifsSplitOrderRecordService;
 
-    private InsUnqualifiedHandlerMapper insUnqualifiedHandlerMapper;
-
     private final NumberGenerator<IfsSplitOrderRecord> splitOrderRecordNumberGenerator;
+    private OutsourceOrderFlowService outsourceOrderFlowService;
 
     @Override
     public Result selectStandardTreeListByPartNo(String partNo) {
@@ -158,10 +169,61 @@
         return standardTreeMapper.selectIfsPage(page, QueryWrappers.queryWrappers(ifsInventoryQuantity));
     }
 
+    /** 淇濈暀澶栧崗鍒嗙被鏌ヨ鏉′欢锛岄伩鍏嶅師鏉愭枡鍒楄〃瑕嗙洊鍒嗙被銆� */
+    @Override
+    public IPage<IfsInventoryQuantity> getOutsourceWarehouseSubmit(IPage<IfsInventoryQuantity> page, IfsInventoryQuantity ifsInventoryQuantity) {
+        validateOutsourceType(ifsInventoryQuantity.getOrderType());
+        ifsInventoryQuantity.setIsInspect(1);
+        ifsInventoryQuantity.setState(0);
+        return standardTreeMapper.selectIfsPage(page, QueryWrappers.queryWrappers(ifsInventoryQuantity)
+                .eq(StringUtils.isNotBlank(ifsInventoryQuantity.getMaterialProp()), "material_prop", ifsInventoryQuantity.getMaterialProp()));
+    }
+
     @Override
     public IPage<IfsInventoryQuantityDto> getIfsByStateOne(IPage<IfsInventoryQuantityDto> page, IfsInventoryQuantityDto ifsInventoryQuantityDto) {
         ifsInventoryQuantityDto.setOrderType(OrderType.RAW.getValue());
         return standardTreeMapper.getIfsByStateOne(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto));
+    }
+
+    /** 妫�楠屼腑鍒楄〃鎸夌湡瀹炲鍗忓垎绫昏繃婊ゃ�� */
+    @Override
+    public IPage<IfsInventoryQuantityDto> getOutsourceByStateOne(IPage<IfsInventoryQuantityDto> page, IfsInventoryQuantityDto dto) {
+        validateOutsourceType(dto.getOrderType());
+        dto.setOrderState(1);
+        dto.setState(1);
+        // 鎸夐敭鍊肩簿纭瓫閫夛紝閬垮厤鈥滄垚鍝佲�濇ā绯婂尮閰嶅埌鈥滃崐鎴愬搧鈥濄��
+        return standardTreeMapper.getIfsByStateOne(page, QueryWrappers.queryWrappers(dto)
+                .eq(StringUtils.isNotBlank(dto.getMaterialProp()), "material_prop", dto.getMaterialProp()));
+    }
+
+    /** 宸叉楠屽垪琛ㄦ寜鐪熷疄澶栧崗鍒嗙被杩囨护銆� */
+    @Override
+    public IPage<IfsInventoryQuantitySupplierDto> getOutsourceByOver(Page<IfsInventoryQuantitySupplierDto> page, IfsInventoryQuantitySupplierDto dto) {
+        dto.setOrderState(4);
+        dto.setState(2);
+        return getOutsourceByAll(page, dto);
+    }
+
+    /** 鍏ㄩ儴鍒楄〃淇濈暀鐪熷疄鍒嗙被鍜屾绱㈡潯浠讹紝涓嶅己鍒堕檺鍒舵楠岀姸鎬併�� */
+    @Override
+    public IPage<IfsInventoryQuantitySupplierDto> getOutsourceByAll(Page<IfsInventoryQuantitySupplierDto> page, IfsInventoryQuantitySupplierDto dto) {
+        validateOutsourceType(dto.getOrderType());
+        String begin = dto.getBeginDeclareDate();
+        String end = dto.getEndDeclareDate();
+        dto.setBeginDeclareDate(null);
+        dto.setEndDeclareDate(null);
+        dto.setIsInspect(1);
+        IPage<IfsInventoryQuantitySupplierDto> result = standardTreeMapper.getIfsByOver(page, QueryWrappers.queryWrappers(dto)
+                .eq(StringUtils.isNotBlank(dto.getMaterialProp()), "material_prop", dto.getMaterialProp()), begin, end);
+        result.getRecords().forEach(r -> r.setOrderTypeName(OrderType.getLabelByValue(r.getOrderType())));
+        return result;
+    }
+
+    /** 闄愬埗澶栧崗鍒楄〃鎺ュ彛鍙兘鏌ヨ涓や釜澶栧崗鍒嗙被銆� */
+    private void validateOutsourceType(String orderType) {
+        if (!outsourceOrderFlowService.isOutsource(orderType)) {
+            throw new ErrorException("闈炴硶鐨勫鍗忚鍗曞垎绫�");
+        }
     }
 
 
@@ -172,6 +234,7 @@
      */
     @Override
     public int inspectionReport(List<Long> ids,String orderType,String materialProp) {
+        outsourceOrderFlowService.resolve(orderType, materialProp);
         Integer userId = SecurityUtils.getUserId().intValue();
         ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
                 .in(IfsInventoryQuantity::getId, ids)
@@ -245,6 +308,8 @@
         if(!validateValue){
             throw new ErrorException("鎶ユ澶辫触锛岄潪娉曠殑閿�鍞鍗曞垎绫绘灇涓�");
         }
+        outsourceOrderFlowService.resolve(ifsInventoryQuantity.getOrderType(), ifsInventoryQuantity.getMaterialProp());
+        validateUpdateBatchNo(ifsInventoryQuantity);
         //鎵规鍙峰瓧姣嶈浆澶у啓
         ifsInventoryQuantity.setUpdateBatchNo(ifsInventoryQuantity.getUpdateBatchNo().toUpperCase(Locale.ROOT));
         ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
@@ -269,6 +334,26 @@
             WxCpUtils.informWebHook(wechatProperty.getExaminingUrl(), message);
         });
         return 1;
+    }
+
+    /**
+     * 鏍¢獙澶栬喘璁㈠崟鎶ユ鐨勬壒娆″彿鏄惁閲嶅
+     * @param ifsInventoryQuantity
+     */
+    public void validateUpdateBatchNo(IfsInventoryQuantity ifsInventoryQuantity){
+        if(StringUtils.equals(ifsInventoryQuantity.getOrderType(),OrderType.WG.getValue())){
+            //鏌ヨ鍘嗗彶璁板綍
+            Long count = ifsInventoryQuantityMapper.selectCount(Wrappers.<IfsInventoryQuantity>lambdaQuery()
+                    .eq(IfsInventoryQuantity::getContract,ifsInventoryQuantity.getContract())
+                    .eq(IfsInventoryQuantity::getPartNo,ifsInventoryQuantity.getPartNo())
+                    .eq(IfsInventoryQuantity::getUpdateBatchNo,ifsInventoryQuantity.getUpdateBatchNo())
+                    .eq(IfsInventoryQuantity::getOrderType,OrderType.WG.getValue())
+                    .ne(IfsInventoryQuantity::getState,0)
+            );
+            if(count>0){
+                throw new RuntimeException("鎶ユ澶辫触锛岄浂浠�"+ifsInventoryQuantity.getPartNo()+"鎵�鎶ユ鐨勬壒娆″彿銆�"+ifsInventoryQuantity.getUpdateBatchNo()+"銆戝凡瀛樺湪锛�");
+            }
+        }
     }
 
     /**
@@ -319,10 +404,16 @@
         if (!insOrder.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
             throw new ErrorException("鍙湁杩涘巶妫�楠屾墠鑳藉厤妫�");
         }
+        // 鍏嶆涓庢甯镐笅鍗曚娇鐢ㄧ浉鍚岀殑澶栧崗鏉ユ簮瑙勫垯銆�
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId());
+        if (ifsInventoryQuantity == null) {
+            throw new ErrorException("鎵句笉鍒伴攢鍞鍗曚俊鎭�");
+        }
         insOrder.setSendTime(LocalDateTime.now());
         // 淇敼璁㈠崟琛ㄧ洿鎺ヤ负宸叉楠�
         insOrder.setState(4);
-        insOrder.setTypeSource(1);
+        insOrder.setTypeSource(outsourceOrderFlowService.resolveTypeSource(
+                ifsInventoryQuantity.getOrderType(), ifsInventoryQuantity.getMaterialProp(), 1));
 
         String code = "Y";
         // 鐢熸垚缂栧彿
@@ -353,7 +444,6 @@
         });
 
         // 鍘熸潗鏂欎笅鍗�: 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
-        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId());
         Integer declareUserId = ifsInventoryQuantity.getDeclareUserId();
         User user = userMapper.selectById(declareUserId);
         // 渚涘簲鍟嗗悕绉�
@@ -374,7 +464,7 @@
         insOrderMapper.updateById(insOrder);
 
         // 娣诲姞宸ユ椂
-        addAuxiliary(insOrder, ifsInventoryQuantity);
+//        addAuxiliary(insOrder, ifsInventoryQuantity);
 
         // todo: ifs鐩存帴绉诲簱
         insReportService.isRawMaterial(insOrder,true,true);
@@ -445,7 +535,9 @@
 
         InsOrder insOrder = new InsOrder();
         insOrder.setState(4);
-        insOrder.setTypeSource(1);
+        // 鍒楄〃鐩存帴鍏嶆涔熸寜鐪熷疄澶栧崗鍒嗙被鍙婄墿鏂欏睘鎬х‘瀹氭潵婧愩��
+        insOrder.setTypeSource(outsourceOrderFlowService.resolveTypeSource(
+                ifsInventoryQuantity.getOrderType(), ifsInventoryQuantity.getMaterialProp(), 1));
         String code = "Y";
         // 鐢熸垚缂栧彿
         String no = numberGenerator.generateNumberWithPrefix(3,
@@ -469,7 +561,7 @@
         insOrderMapper.insert(insOrder);
 
         // 娣诲姞宸ユ椂
-        addAuxiliary(insOrder, ifsInventoryQuantity);
+//        addAuxiliary(insOrder, ifsInventoryQuantity);
 
         // todo: ifs鐩存帴绉诲簱
         insReportService.isRawMaterial(insOrder,true,true);
@@ -529,6 +621,8 @@
         if(!OrderType.validateValue(ifsInventoryQuantity.getOrderType())){
             throw new ErrorException("鏂板鎶ユ淇℃伅澶辫触锛岄潪娉曠殑閿�鍞鍗曞垎绫绘灇涓�");
         }
+        outsourceOrderFlowService.resolve(ifsInventoryQuantity.getOrderType(), ifsInventoryQuantity.getMaterialProp());
+        validateUpdateBatchNo(ifsInventoryQuantity);
         ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
     }
 
@@ -606,7 +700,7 @@
         insOrderMapper.updateById(insOrder);
 
         // 娣诲姞宸ユ椂
-        addAuxiliary(insOrder, ifsInventoryQuantity);
+//        addAuxiliary(insOrder, ifsInventoryQuantity);
 
         return insOrder.getId();
     }
@@ -753,6 +847,9 @@
 
             }
         }
+        //鏌ヨ妫�楠岄」璁板綍
+        List<Long> ifsIds = ifsByOverList.stream().map(IfsInventoryQuantitySupplierDto::getId).collect(Collectors.toList());
+        List<ProductVo> inspectList = insProductMapper.selectInspectListByIfsIfs(ifsIds);
 
 
         response.setContentType("application/vnd.ms-excel");
@@ -764,10 +861,12 @@
             //鏂板缓ExcelWriter
             ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
             //鑾峰彇sheet0瀵硅薄
-            WriteSheet mainSheet = EasyExcel.writerSheet(0, "鍘熸潗鏂欐娴嬩俊鎭鍑�").head(IfsInventoryQuantitySupplierDto.class).build();
+            WriteSheet mainSheet = EasyExcel.writerSheet(0, "鍘熸潗鏂欐娴嬩俊鎭�昏").head(IfsInventoryQuantitySupplierDto.class).build();
+            WriteSheet inspectSheet = EasyExcel.writerSheet(1, "鍘熸潗鏂欐娴嬫暟鎹鎯�").head(ProductVo.class).build();
 
             //鍚憇heet0鍐欏叆鏁版嵁 浼犲叆绌簂ist杩欐牱鍙鍑鸿〃澶�
             excelWriter.write(ifsByOverList, mainSheet);
+            excelWriter.write(inspectList, inspectSheet);
             //鍏抽棴娴�
             excelWriter.finish();
         } catch (IOException e) {
@@ -895,7 +994,7 @@
         inAttrMap.put("BATCH_INFO", batchInfoData);
         String inAttr = JSONObject.toJSONString(inAttrMap);
         //璋冪敤ifs鎺ュ彛
-        Result result = ifsApiUtils.updateMoveReceiptLot(inAttr);
+        Result result = ifsApiUtils.updateMoveReceiptLot(ifsInventoryQuantity.getContract(),inAttr);
         if(result.getCode()!=200){
             throw new RuntimeException("IFS閲囪喘鎺ユ敹鏇存敼鎵瑰彿璇锋眰寮傚父锛�"+result.getMessage());
         }
@@ -917,7 +1016,7 @@
         }
         //ifs鏇存敼鎵瑰彿鎺ュ彛璋冪敤鎴愬姛锛屾媺鍙栨柊鎷嗗垎鐨刬fs璁㈠崟骞舵姤妫�
         Map<String, Object> map = new HashMap<>();
-        map.put("LOCATION_NO","1302");
+//        map.put("LOCATION_NO","1302");
         map.put("STATE_DB","To be Inspected");
         map.put("PART_NO",ifsInventoryQuantity.getPartNo());
         map.put("ORDER_NO",ifsInventoryQuantity.getOrderNo());

--
Gitblit v1.9.3