From 0e5bddf6084d3dfb7bcad7217d4320898416eba3 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期四, 23 十月 2025 16:49:12 +0800
Subject: [PATCH] 拆分原材料和外购成品的业务流程(报检、下单、检验)

---
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java | 1870 +++++++++++++++++++++++++++++++--------------------------
 1 files changed, 1,023 insertions(+), 847 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 1faaee4..2fc3082 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,847 +1,1023 @@
-//package com.ruoyi.inspect.service.impl;
-//
-//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.util.StrUtil;
-//import com.alibaba.excel.EasyExcel;
-//import com.alibaba.excel.ExcelWriter;
-//import com.alibaba.excel.write.metadata.WriteSheet;
-//import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
-//import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-//import com.baomidou.mybatisplus.core.metadata.IPage;
-//import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-//import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-//import com.ruoyi.basic.dto.*;
-//import com.ruoyi.basic.pojo.IfsInventoryQuantity;
-//import com.ruoyi.common.constant.InsOrderTypeConstants;
-//import com.ruoyi.common.core.domain.entity.User;
-//import com.ruoyi.common.utils.LimsDateUtil;
-//import com.ruoyi.common.utils.QueryWrappers;
-//import com.ruoyi.common.utils.SecurityUtils;
-//import com.ruoyi.common.utils.WxCpUtils;
-//import com.ruoyi.framework.properties.WechatProperty;
-//import com.ruoyi.inspect.dto.CopperInsOrderDto;
-//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.mapper.InsOrderMapper;
-//import com.ruoyi.inspect.mapper.InsProductMapper;
-//import com.ruoyi.inspect.mapper.InsSampleMapper;
-//import com.ruoyi.inspect.pojo.InsOrder;
-//import com.ruoyi.inspect.pojo.InsReport;
-//import com.ruoyi.inspect.service.InsOrderService;
-//import com.ruoyi.inspect.service.InsReportService;
-//import com.ruoyi.inspect.service.RawMaterialOrderService;
-//import com.ruoyi.common.numgen.NumberGenerator;
-//import com.ruoyi.framework.exception.ErrorException;
-//import com.ruoyi.performance.mapper.AuxiliaryOutputWorkingHoursMapper;
-//import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours;
-//import com.ruoyi.system.mapper.UserMapper;
-//import lombok.AllArgsConstructor;
-//import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-//import org.springframework.stereotype.Service;
-//import org.springframework.transaction.annotation.Transactional;
-//
-//import javax.servlet.http.HttpServletResponse;
-//import java.io.IOException;
-//import java.io.UnsupportedEncodingException;
-//import java.math.BigDecimal;
-//import java.net.URLEncoder;
-//import java.text.SimpleDateFormat;
-//import java.time.LocalDateTime;
-//import java.time.format.DateTimeFormatter;
-//import java.util.*;
-//import java.util.concurrent.atomic.AtomicInteger;
-//
-///**
-// * @Author zhuo
-// * @Date 2024/7/31
-// */
-//@Service
-//@AllArgsConstructor
-//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;
-//
-//
-//    @Override
-//    public RawMaterialStandardTreeDto selectStandardTreeListByPartNo(String partNo) {
-//        if (StringUtils.isBlank(partNo)) {
-//            throw new ErrorException("闆朵欢鍙蜂涪澶�");
-//        }
-//        List<FactoryDto> factoryDtos = standardTreeMapper.selectStandardTreeListByPartNo(partNo);
-//        if (CollectionUtil.isEmpty(factoryDtos)) {
-//            throw new ErrorException("闆朵欢鍙蜂负" + partNo + "鐨勫師鏉愭枡娌℃湁瀵瑰簲鐨勬爣鍑嗗簱閰嶇疆");
-//        }
-//        RawMaterialStandardTreeDto rawMaterialStandardTreeDto = new RawMaterialStandardTreeDto();
-//        for (FactoryDto factoryDto : factoryDtos) {
-//            for (LaboratoryDto laboratoryDto : factoryDto.getChildren()) {
-//                for (SampleTypeDto sampleTypeDto : laboratoryDto.getChildren()) {
-//                    if (sampleTypeDto.getChildren().size() == 0) {
-//                        sampleTypeDto.setChildren(standardTreeMapper.getStandardTree3(sampleTypeDto.getValue()));
-//                    }
-//                    // 鍒ゆ柇缁戝畾鐨勬槸鍚︽槸褰撳墠闆朵欢鍙�
-//                    if (sampleTypeDto.getPartNo() != null && sampleTypeDto.getPartNo().equals(partNo)) {
-//                        // 娣诲姞瀵硅薄
-//                        rawMaterialStandardTreeDto.setTreeName(factoryDto.getValue() + "-"
-//                                + laboratoryDto.getValue() + "-"
-//                                + sampleTypeDto.getValue());
-//                        rawMaterialStandardTreeDto.setCode(sampleTypeDto.getCode());
-//                        rawMaterialStandardTreeDto.setLabel(sampleTypeDto.getLabel());
-//                        rawMaterialStandardTreeDto.setValue(sampleTypeDto.getValue());
-//                        rawMaterialStandardTreeDto.setChildren1(sampleTypeDto.getChildren());
-//                    } else {
-//                        for (SampleDto sampleDto : sampleTypeDto.getChildren()) {
-//                            if (sampleDto.getPartNo() != null && sampleDto.getPartNo().equals(partNo)) {
-//                                // 娣诲姞瀵硅薄
-//                                rawMaterialStandardTreeDto.setTreeName(factoryDto.getValue() + "-"
-//                                        + laboratoryDto.getValue() + "-"
-//                                        + sampleTypeDto.getValue() + "-"
-//                                        + sampleDto.getValue());
-//                                rawMaterialStandardTreeDto.setCode(sampleDto.getCode());
-//                                rawMaterialStandardTreeDto.setLabel(sampleDto.getLabel());
-//                                rawMaterialStandardTreeDto.setValue(sampleDto.getValue());
-//                                rawMaterialStandardTreeDto.setChildren2(sampleDto.getChildren());
-//                            }
-//                        }
-//                    }
-//                }
-//            }
-//        }
-//        return rawMaterialStandardTreeDto;
-//    }
-//
-//    @Override
-//    public IPage<IfsInventoryQuantity> getWarehouseSubmit(IPage<IfsInventoryQuantity> page, IfsInventoryQuantity ifsInventoryQuantity) {
-//        return standardTreeMapper.selectIfsPage(page, QueryWrappers.queryWrappers(ifsInventoryQuantity));
-//    }
-//
-//    @Override
-//    public IPage<IfsInventoryQuantityDto> getIfsByStateOne(IPage<IfsInventoryQuantityDto> page, IfsInventoryQuantityDto ifsInventoryQuantityDto) {
-//        return standardTreeMapper.getIfsByStateOne(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto));
-//    }
-//
-//
-//    /**
-//     * 鎶ユ
-//     * @param ids
-//     * @return
-//     */
-//    @Override
-//    public int inspectionReport(List<Integer> ids) {
-//        Integer userId = SecurityUtils.getUserId().intValue();
-//        ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
-//                .in(IfsInventoryQuantity::getId, ids)
-//                .set(IfsInventoryQuantity::getDeclareUser, userMapper.selectById(userId).getName())
-//                .set(IfsInventoryQuantity::getDeclareUserId, userId)
-//                .set(IfsInventoryQuantity::getIsInspect, 1)
-//                .set(IfsInventoryQuantity::getDeclareDate, LocalDateTime.now())
-//        );
-//        threadPoolTaskExecutor.execute(() -> {
-//            List<IfsInventoryQuantity> quantityList = ifsInventoryQuantityMapper.selectList(Wrappers.<IfsInventoryQuantity>lambdaQuery()
-//                    .in(IfsInventoryQuantity::getId, ids));
-//            // 浼佷笟寰俊閫氱煡
-//            String message = "";
-//            message += "鏂板鎶ユ閫氱煡";
-//            for (IfsInventoryQuantity inventoryQuantity : quantityList) {
-//                message += "\n鎵规鍙�: " + inventoryQuantity.getUpdateBatchNo();
-//                message += "\n闆朵欢鎻忚堪: " + inventoryQuantity.getPartDesc();
-//                message += "\n鎶佃揪鏁伴噺: " + inventoryQuantity.getQtyArrived().stripTrailingZeros().toPlainString() + inventoryQuantity.getBuyUnitMeas();
-//
-//                // 鍒ゆ柇鏈夋病鏈夊埌20鍚�. 鎴栬�呰兘鍚﹀厤妫�
-//                int result = notificationRawOrder(inventoryQuantity.getId());
-//                switch (result) {
-//                    case 1:
-//                        message += "\n褰撳墠鏍峰搧宸叉楠岃繃, 鍙互鍏嶆";
-//                        break;
-//                    case 2:
-//                        message += "\n褰撳墠鏍峰搧宸茶秴杩�20鍚�";
-//                        break;
-//                }
-//                message += "\n";
-//            }
-//            WxCpUtils.informWebHook(wechatProperty.getExaminingUrl(), message);
-//        });
-//        return 1;
-//    }
-//
-//    /**
-//     * 鎾ら攢鎶ユ
-//     * @param id
-//     * @return
-//     */
-//    @Override
-//    public int revokeInspectionReport(Integer id) {
-//        return ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
-//                .eq(IfsInventoryQuantity::getId, id)
-//                .set(IfsInventoryQuantity::getIsInspect, 0)
-//        );
-//    }
-//
-//    /**
-//     * 鎵撳嵃鏍囩鏌ヨ
-//     * @param ids
-//     * @return
-//     */
-//    @Override
-//    public List<IfsInventoryQuantityDto> printLabel(List<Integer> ids) {
-//        return ifsInventoryQuantityMapper.printLabel(ids);
-//    }
-//
-//    /**
-//     * 鎶ユ
-//     * @param ifsInventoryQuantity
-//     * @return
-//     */
-//    @Override
-//    public int inspectionReportOne(IfsInventoryQuantity ifsInventoryQuantity) {
-//        Integer userId = SecurityUtils.getUserId().intValue();
-//        ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
-//                .eq(IfsInventoryQuantity::getId, ifsInventoryQuantity.getId())
-//                .set(IfsInventoryQuantity::getDeclareUser, userMapper.selectById(userId).getName())
-//                .set(IfsInventoryQuantity::getDeclareUserId, userId)
-//                .set(IfsInventoryQuantity::getIsInspect, 1)
-//                .set(IfsInventoryQuantity::getDeclareDate, LocalDateTime.now())
-//                .set(IfsInventoryQuantity::getUpdateBatchNo, ifsInventoryQuantity.getUpdateBatchNo())
-//        );
-//
-//        threadPoolTaskExecutor.execute(() -> {
-//            IfsInventoryQuantity inventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryQuantity.getId());
-//            // 浼佷笟寰俊閫氱煡
-//            String message = "";
-//            message += "鏂板鎶ユ閫氱煡";
-//            message += "\n鎵规鍙�: " + inventoryQuantity.getUpdateBatchNo();
-//            message += "\n闆朵欢鎻忚堪: " + inventoryQuantity.getPartDesc();
-//            message += "\n鎶佃揪鏁伴噺: " + inventoryQuantity.getQtyArrived().stripTrailingZeros().toPlainString() + inventoryQuantity.getBuyUnitMeas();
-//            WxCpUtils.informWebHook(wechatProperty.getExaminingUrl(), message);
-//        });
-//        return 1;
-//    }
-//
-//    /**
-//     * 鑾峰彇閾滀骇涓氶摼妫�娴嬫暟鎹�
-//     * @param id
-//     * @return
-//     */
-//    @Override
-//    public String getIndustryChain(Integer id) {
-//        return ifsInventoryQuantityMapper.selectById(id).getIndustryChain();
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欐挙閿�鎺ュ彛
-//     * @param ifsInventoryId
-//     * @return
-//     */
-//    @Override
-//    public boolean repealRawOrder(Integer ifsInventoryId) {
-//        // 鏌ヨ鍒ゆ柇鏄惁鏄摐鍗曚笣
-//        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
-//        if (ifsInventoryQuantity.getIsCopper() != null && ifsInventoryQuantity.getIsCopper().equals(1)) {
-//            // 閾滃崟涓濈洿鎺ュ垹闄ゅ氨琛�
-//            ifsInventoryQuantityMapper.deleteById(ifsInventoryId);
-//        } else {
-//            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                    .set(IfsInventoryQuantity::getState, 0)
-//                    .set(IfsInventoryQuantity::getIsQuarter, 1)
-//                    .eq(IfsInventoryQuantity::getId, ifsInventoryId));
-//        }
-//
-//        insOrderService.update(Wrappers.<InsOrder>lambdaUpdate()
-//                .eq(InsOrder::getIfsInventoryId, ifsInventoryId)
-//                .set(InsOrder::getState, -1)
-//                .set(InsOrder::getEntrustCode, ""));// 鎾ら攢
-//        return true;
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欏厤妫�涓嬪崟
-//     * @param list
-//     * @param insOrder
-//     * @return
-//     */
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public int addExemptionOrder(List<SampleProductDto> list, InsOrder insOrder) {
-//        if (!insOrder.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
-//            throw new ErrorException("鍙湁杩涘巶妫�楠屾墠鑳藉厤妫�");
-//        }
-//        insOrder.setSendTime(LocalDateTime.now());
-//        // 淇敼璁㈠崟琛ㄧ洿鎺ヤ负宸叉楠�
-//        insOrder.setState(4);
-//        insOrder.setTypeSource(1);
-//
-//        String code = "Y";
-//        // 鐢熸垚缂栧彿
-//        String no = numberGenerator.generateNumberWithPrefix(3,
-//                "JCZX/ZB-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
-//                InsOrder::getEntrustCode);
-//
-//        insOrderMapper.insert(insOrder); // 涓昏〃
-//
-//        AtomicInteger count = new AtomicInteger();
-//        list.forEach(a -> {
-//            count.getAndIncrement();
-//            a.setId(null);
-//            a.setInsOrderId(insOrder.getId());
-//            if (StrUtil.isEmpty(a.getSampleCode())) {
-//                // 濡傛灉鍙湁涓�涓牱鍝佸氨涓嶉渶瑕佹嫾鎺ユ暟瀛�
-//                if (list.size() != 1) {
-//                    a.setSampleCode(no + "-" + count.get());
-//                } else {
-//                    a.setSampleCode(no);
-//                }
-//            }
-//            insSampleMapper.insert(a);
-//
-//            if (!CollectionUtil.isEmpty(a.getInsProduct())) {
-//                throw new ErrorException("鍏嶆涓嶉渶瑕佸~鍐欐楠岄」");
-//            }
-//        });
-//
-//        // 鍘熸潗鏂欎笅鍗�: 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
-//        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId());
-//        Integer declareUserId = ifsInventoryQuantity.getDeclareUserId();
-//        User user = userMapper.selectById(declareUserId);
-//        // 渚涘簲鍟嗗悕绉�
-//        insOrder.setProduction(ifsInventoryQuantity.getSupplierName());
-//        // 濮旀墭浜哄悕绉�
-//        insOrder.setPrepareUser(user.getName());
-//        insOrder.setPhone(user.getPhone());
-//
-//        // 淇敼鍘熸潗鏂欐暟鎹洿鎺ヤ负宸叉楠�
-//        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>().set(IfsInventoryQuantity::getState, 2)
-//                .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
-//
-//        insOrder.setExamineTime(LocalDateTime.now());
-//
-//        insOrder.setEntrustCode(no);
-//        insOrder.setIsExemption(1);
-//
-//        insOrderMapper.updateById(insOrder);
-//
-//        // 娣诲姞宸ユ椂
-//        addAuxiliary(insOrder, ifsInventoryQuantity);
-//
-//        // todo: ifs鐩存帴绉诲簱
-//        insReportService.isRawMaterial(insOrder);
-//
-//        return insOrder.getId();
-//    }
-//
-//
-//    /**
-//     * 鏌ヨ寰呬笅鍗�
-//     * @param page
-//     * @param ifsInventoryQuantity
-//     * @return
-//     */
-//    @Override
-//    public IPage<IfsInventoryQuantityCheckDto> selectIfsInventoryQuantity(Page<IfsInventoryQuantityCheckDto> page, IfsInventoryQuantityCheckDto ifsInventoryQuantity) {
-//        return standardTreeMapper.selectIfsInventoryQuantity(page, QueryWrappers.queryWrappers(ifsInventoryQuantity));
-//    }
-//
-//    /**
-//     * 鏌ヨ宸叉楠�
-//     * @param page
-//     * @param ifsInventoryQuantityDto
-//     * @return
-//     */
-//    @Override
-//    public IPage<IfsInventoryQuantitySupplierDto> getIfsByOver(Page<IfsInventoryQuantitySupplierDto> page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) {
-//        // todo: 鍙湅鎴�
-//        String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
-//        String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
-//        ifsInventoryQuantityDto.setBeginDeclareDate(null);
-//        ifsInventoryQuantityDto.setEndDeclareDate(null);
-//
-//        return standardTreeMapper.getIfsByOver(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
-//    }
-//
-//    /**
-//     * 鍒犻櫎鍘熸潗鏂欐姤妫�淇℃伅
-//     * @param id
-//     * @return
-//     */
-//    @Override
-//    public int delIfsInventory(Integer id) {
-//        return ifsInventoryQuantityMapper.deleteById(id);
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欐斁琛屽厤妫�
-//     * @param ifsInventoryId
-//     * @return
-//     */
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public boolean rawOrderRelease(Integer ifsInventoryId, String partDetail) {
-//        // 淇敼鍘熸潗鏂欐暟鎹洿鎺ヤ负宸叉楠�
-//        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                .set(IfsInventoryQuantity::getState, 2)
-//                .set(IfsInventoryQuantity::getIsQuarter, 0)
-//                .eq(IfsInventoryQuantity::getId, ifsInventoryId));
-//
-//        // 鏌ヨ鍘熸潗鏂欎俊鎭�
-//        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
-//        // 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
-//        Integer declareUserId = ifsInventoryQuantity.getDeclareUserId();
-//        User user = userMapper.selectById(declareUserId);
-//
-//        InsOrder insOrder = new InsOrder();
-//        insOrder.setState(4);
-//        insOrder.setTypeSource(1);
-//        String code = "Y";
-//        // 鐢熸垚缂栧彿
-//        String no = numberGenerator.generateNumberWithPrefix(3,
-//                "JCZX/ZB-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
-//                InsOrder::getEntrustCode);
-//        insOrder.setExamineTime(LocalDateTime.now());
-//        insOrder.setEntrustCode(no);
-//        insOrder.setIsExemption(1);
-//        // 渚涘簲鍟嗗悕绉�
-//        insOrder.setProduction(ifsInventoryQuantity.getSupplierName());
-//        // 濮旀墭浜哄悕绉�
-//        insOrder.setPrepareUser(user.getName());
-//        insOrder.setPhone(user.getPhone());
-//        insOrder.setIfsInventoryId(ifsInventoryId);
-//        insOrder.setPartDetail(partDetail);
-//        insOrder.setSendTime(LocalDateTime.now());
-//        insOrder.setSample(ifsInventoryQuantity.getPartDesc());
-//        // 杩涘巶妫�楠�
-//        insOrder.setOrderType(InsOrderTypeConstants.ENTER_THE_FACTORY);
-//
-//        insOrderMapper.insert(insOrder);
-//
-//        // 娣诲姞宸ユ椂
-//        addAuxiliary(insOrder, ifsInventoryQuantity);
-//
-//        // todo: ifs鐩存帴绉诲簱
-//        insReportService.isRawMaterial(insOrder);
-//        return true;
-//    }
-//
-//    /**
-//     * 0, 鏃犳彁绀�, 1鎻愮ず  褰撳墠鎵规鐨勬牱鍝佸凡妫�楠岃繃, 鍙互鍏嶆, 2 鎻愮ず 褰撳墠鎵规鐨勬牱鍝佸凡瓒�20鍚�, 闇�瑕佸绾у娆℃楠�
-//     *
-//     * 鍘熸潗鏂欎笅鍗曢�氱煡鍏嶆鎴栬�呭娆℃楠�
-//     * @param ifsInventoryId
-//     * @return
-//     */
-//    @Override
-//    public int notificationRawOrder(Integer ifsInventoryId) {
-//        IfsInventoryQuantity ifsInventory = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
-//        // 鏌ヨ褰撳墠鎵规, 渚涘簲鍟�, 闆朵欢鍙风殑鍘熸潗鏂欐槸鍚﹁秴杩囦簡20鍚�, 瓒呰繃浜�20鍚ㄩ渶瑕佽繘琛屽娆℃楠屾彁閱�
-//        List<IfsInventoryQuantity> quantityList = ifsInventoryQuantityMapper.selectList(Wrappers.<IfsInventoryQuantity>lambdaQuery()
-//                .eq(IfsInventoryQuantity::getPartNo, ifsInventory.getPartNo())
-//                .eq(IfsInventoryQuantity::getUpdateBatchNo, ifsInventory.getUpdateBatchNo())
-//                .eq(IfsInventoryQuantity::getSupplierId, ifsInventory.getSupplierId())
-//                .eq(IfsInventoryQuantity::getSupplierName, ifsInventory.getSupplierName()));
-//
-//        // 鍒ゆ柇鏄惁澶т簬20鍚�
-//        BigDecimal bigDecimal = new BigDecimal("20000");
-//        BigDecimal count = BigDecimal.ZERO;
-//        for (IfsInventoryQuantity inventoryQuantity : quantityList) {
-//            // 鍒ゆ柇鍗曚綅鏄痥g鎴栬�卼
-//            if (inventoryQuantity.getBuyUnitMeas().equalsIgnoreCase("t")) {
-//                count = count.add(inventoryQuantity.getQtyArrived().multiply(new BigDecimal("1000")));
-//            } else if (inventoryQuantity.getBuyUnitMeas().equalsIgnoreCase("kg")) {
-//                count = count.add(inventoryQuantity.getQtyArrived());
-//            }
-//        }
-//
-//        if (count.compareTo(bigDecimal) >= 0) {
-//            return 2;
-//        } else {
-//            // 鍒ゆ柇涔嬪墠鏄惁鍑鸿繃鎶ュ憡, 鍑鸿繃鎶ュ憡鍙互鍏嶆
-//            int reportCount = ifsInventoryQuantityMapper.selectReportCountById(ifsInventoryId);
-//            if (reportCount > 0) {
-//                return 1;
-//            }
-//        }
-//        return 0;
-//    }
-//
-//    /**
-//     * 鎶ユ鍙互鏂板鎶ユ淇℃伅
-//     * @param ifsInventoryQuantity
-//     */
-//    @Override
-//    public void addIfsInventoryQuantity(IfsInventoryQuantity ifsInventoryQuantity) {
-//        ifsInventoryQuantity.setIsSource(0);
-//        ifsInventoryQuantity.setState(0);
-//        ifsInventoryQuantity.setIsFinish(0);
-//        ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
-//    }
-//
-//    @Override
-//    public void shiftingParking(List<Integer> ids) {
-//        for (Integer id : ids) {
-//            InsOrder order = insOrderService.getById(id);
-//            // todo: ifs鐩存帴绉诲簱
-//            insReportService.isRawMaterial(order);
-//        }
-//    }
-//
-//    /**
-//     * 閾滃崟涓濅笅鍗曞厤妫�
-//     * @param list
-//     * @param insOrder
-//     */
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public int addRawCopperOrderExemptionOrder(List<SampleProductDto> list, CopperInsOrderDto insOrder) {
-//        if (!insOrder.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
-//            throw new ErrorException("鍙湁杩涘巶妫�楠屾墠鑳藉厤妫�");
-//        }
-//        insOrder.setSendTime(LocalDateTime.now());
-//        // 淇敼璁㈠崟琛ㄧ洿鎺ヤ负宸叉楠�
-//        insOrder.setState(4);
-//        insOrder.setTypeSource(1);
-//
-//        String code = "Y";
-//        // 鐢熸垚缂栧彿
-//        String no = numberGenerator.generateNumberWithPrefix(3,
-//                "JCZX/ZB-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
-//                InsOrder::getEntrustCode);
-//
-//        insOrderMapper.insert(insOrder); // 涓昏〃
-//
-//        AtomicInteger count = new AtomicInteger();
-//        list.forEach(a -> {
-//            count.getAndIncrement();
-//            a.setId(null);
-//            a.setInsOrderId(insOrder.getId());
-//            if (StrUtil.isEmpty(a.getSampleCode())) {
-//                // 濡傛灉鍙湁涓�涓牱鍝佸氨涓嶉渶瑕佹嫾鎺ユ暟瀛�
-//                if (list.size() != 1) {
-//                    a.setSampleCode(no + "-" + count.get());
-//                } else {
-//                    a.setSampleCode(no);
-//                }
-//            }
-//            insSampleMapper.insert(a);
-//
-//            if (!CollectionUtil.isEmpty(a.getInsProduct())) {
-//                throw new ErrorException("鍏嶆涓嶉渶瑕佸~鍐欐楠岄」");
-//            }
-//        });
-//        // 娣诲姞鍘熸潗鏂欎俊鎭�
-//        IfsInventoryQuantity ifsInventoryQuantity = new IfsInventoryQuantity();
-//        // 鍩烘湰淇℃伅
-//        ifsInventoryQuantity.setIsSource(0);
-//        ifsInventoryQuantity.setState(2);
-//        ifsInventoryQuantity.setIsInspect(1);
-//        ifsInventoryQuantity.setIsFinish(1);
-//        ifsInventoryQuantity.setIsCopper(1);
-//        ifsInventoryQuantity.setInspectStatus(1);
-//        ifsInventoryQuantity.setIsQuarter(0);
-//
-//        ifsInventoryQuantity.setQtyArrived(insOrder.getQtyArrived());
-//        ifsInventoryQuantity.setBuyUnitMeas(insOrder.getBuyUnitMeas());
-//        ifsInventoryQuantity.setSupplierName(insOrder.getSupplierName());
-//        ifsInventoryQuantity.setUpdateBatchNo(insOrder.getUpdateBatchNo());
-//        ifsInventoryQuantity.setDeclareDate(insOrder.getDeclareDate());
-//
-//        ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
-//
-//        insOrder.setIfsInventoryId(ifsInventoryQuantity.getId());
-//        insOrder.setExamineTime(LocalDateTime.now());
-//
-//        insOrder.setEntrustCode(no);
-//        insOrder.setIsExemption(1);
-//
-//        insOrderMapper.updateById(insOrder);
-//
-//        // 娣诲姞宸ユ椂
-//        addAuxiliary(insOrder, ifsInventoryQuantity);
-//
-//        return insOrder.getId();
-//    }
-//
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public boolean concessionRelease(Integer ifsInventoryId) {
-//        // 鏌ヨ鍘熸潗鏂欎俊鎭�
-//        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
-//        if (!ifsInventoryQuantity.getInspectStatus().equals(2)) {
-//            throw new ErrorException("涓嶅悎鏍肩殑鍘熸潗鏂欐墠鑳借姝ユ斁琛�");
-//        }
-//
-//        // todo:闇�瑕佸垽鏂璷a娴佺▼鏄惁鏄姝ユ斁琛�
-//        String toLocation = insReportService.moveRawMaterial(ifsInventoryQuantity);
-//
-//        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                .set(IfsInventoryQuantity::getInspectStatus, 4)
-//                .set(IfsInventoryQuantity::getToLocation, toLocation)
-//                .eq(IfsInventoryQuantity::getId, ifsInventoryId));
-//
-//        return true;
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欒繘鍘傛挙閿�涓嬪崟
-//     * @param enterOrderId
-//     * @return
-//     */
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public boolean repealEnterRawOrder(Integer enterOrderId) {
-//        // 鏌ヨ璁㈠崟
-//        InsOrder order = insOrderMapper.selectById(enterOrderId);
-//
-//        // 鏌ヨ鍒ゆ柇鏄惁鏄摐鍗曚笣
-//        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
-//        if (ifsInventoryQuantity.getIsCopper() != null && ifsInventoryQuantity.getIsCopper().equals(1)) {
-//            // 閾滃崟涓濈洿鎺ュ垹闄ゅ氨琛�
-//            ifsInventoryQuantityMapper.deleteById(order.getIfsInventoryId());
-//        } else {
-//            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                    .set(IfsInventoryQuantity::getState, 0)
-//                    .set(IfsInventoryQuantity::getIsQuarter, 1)
-//                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
-//        }
-//        insOrderService.update(Wrappers.<InsOrder>lambdaUpdate()
-//                .eq(InsOrder::getId, enterOrderId)
-//                .set(InsOrder::getState, -1)
-//                .set(InsOrder::getEntrustCode, ""));// 鎾ら攢
-//
-//        // 娓呴櫎涔嬪墠鐨勫伐鏃�
-//        auxiliaryOutputWorkingHoursMapper.delete(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery()
-//                .eq(AuxiliaryOutputWorkingHours::getOrderId, enterOrderId));
-//
-//        // 娓呴櫎涔嬪墠鎶ュ憡
-//        insReportService.remove(Wrappers.<InsReport>lambdaQuery()
-//                .eq(InsReport::getInsOrderId, enterOrderId));
-//
-//        return true;
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欏搴︽挙閿�涓嬪崟
-//     * @param quarterOrderId
-//     * @return
-//     */
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public boolean repealQuarterRawOrder(Integer quarterOrderId) {
-//        // 鏌ヨ璁㈠崟
-//        InsOrder order = insOrderMapper.selectById(quarterOrderId);
-//
-//        Long count = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
-//                .eq(InsOrder::getIfsInventoryId, order.getIfsInventoryId())
-//                .ne(InsOrder::getState, -1)
-//                .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY)
-//                .ne(InsOrder::getId, order.getId()));
-//        // 鍒ゆ柇涔嬪墠鏄惁鏈夎繘鍘傛楠�, 娌℃湁闇�瑕佷慨鏀瑰師鏉愭枡淇℃伅
-//        if (count == 0) {
-//            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                    .set(IfsInventoryQuantity::getState, 0)
-//                    .set(IfsInventoryQuantity::getIsQuarter, 1)
-//                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
-//        } else {
-//            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                    .set(IfsInventoryQuantity::getIsQuarter, 1)
-//                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
-//        }
-//
-//        insOrderService.update(Wrappers.<InsOrder>lambdaUpdate()
-//                .eq(InsOrder::getId, quarterOrderId)
-//                .set(InsOrder::getState, -1)
-//                .set(InsOrder::getEntrustCode, ""));// 鎾ら攢
-//        auxiliaryOutputWorkingHoursMapper.delete(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery()
-//                .eq(AuxiliaryOutputWorkingHours::getOrderId, quarterOrderId));
-//        // 娓呴櫎涔嬪墠鎶ュ憡
-//        insReportService.remove(Wrappers.<InsReport>lambdaQuery()
-//                .eq(InsReport::getInsOrderId, quarterOrderId));
-//        return true;
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欐姤妫�鍏ㄩ儴淇℃伅瀵煎嚭
-//     * @param ifsInventoryQuantityDto
-//     * @param response
-//     */
-//    @Override
-//    public void rawAllExport(IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto, HttpServletResponse response) throws UnsupportedEncodingException {
-//        //鏌ヨ瀵煎嚭鐨勮垂鐢ㄧ粺璁℃暟鎹�
-//        String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
-//        String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
-//        ifsInventoryQuantityDto.setBeginDeclareDate(null);
-//        ifsInventoryQuantityDto.setEndDeclareDate(null);
-//        List<IfsInventoryQuantitySupplierDto> ifsByOverList = standardTreeMapper.getIfsByOverList(QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
-//
-//        for (IfsInventoryQuantitySupplierDto dto : ifsByOverList) {
-//            dto.setSendTimeString(dto.getSendTime() == null ? "" : dto.getSendTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-//            dto.setReceiverDateString(dto.getReceiverDate() == null ? "" : dto.getReceiverDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-//            dto.setDeclareDateString(dto.getDeclareDate() == null ? "" : dto.getDeclareDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-//            switch (dto.getInspectStatus()) {
-//                case 1:
-//                    dto.setInspectStatusString("鍚堟牸");
-//                    break;
-//                case 2:
-//                    dto.setInspectStatusString("涓嶅悎鏍�");
-//                    // 鏌ヨ涓嶅悎鏍奸」
-//                    List<String> unqualifiedList = insProductMapper.selectUnqualifiedList(dto.getEnterOrderId() == null ? dto.getQuarterOrderId() : dto.getEnterOrderId());
-//                    dto.setUnqualifiedItem(CollUtil.join(unqualifiedList, ","));
-//                    break;
-//                case 3:
-//                    dto.setInspectStatusString("鏈笅鍗�");
-//                    break;
-//                case 4:
-//                    dto.setInspectStatusString("璁╂鏀捐");
-//                    break;
-//                case 0:
-//                    dto.setInspectStatusString("妫�楠屼腑");
-//                    break;
-//
-//            }
-//        }
-//
-//
-//        response.setContentType("application/vnd.ms-excel");
-//        response.setCharacterEncoding("UTF-8");
-//        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
-//        String fileName = URLEncoder.encode("鍘熸潗鏂欐娴嬩俊鎭鍑�", "UTF-8");
-//        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
-//        try {
-//            //鏂板缓ExcelWriter
-//            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
-//            //鑾峰彇sheet0瀵硅薄
-//            WriteSheet mainSheet = EasyExcel.writerSheet(0, "鍘熸潗鏂欐娴嬩俊鎭鍑�").head(IfsInventoryQuantitySupplierDto.class).build();
-//
-//            //鍚憇heet0鍐欏叆鏁版嵁 浼犲叆绌簂ist杩欐牱鍙鍑鸿〃澶�
-//            excelWriter.write(ifsByOverList, mainSheet);
-//            //鍏抽棴娴�
-//            excelWriter.finish();
-//        } catch (IOException e) {
-//            throw new RuntimeException("瀵煎嚭澶辫触");
-//        }
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欐煡璇㈠彲浠ュ搴︽楠岀殑鍐呭
-//     * @param page
-//     * @param ifsInventoryQuantityDto
-//     * @return
-//     */
-//    @Override
-//    public IPage<IfsInventoryQuantitySupplierDto> getIfsByQuarter(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) {
-//
-//        // todo: 鍙湅鎴�
-//        String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
-//        String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
-//        ifsInventoryQuantityDto.setBeginDeclareDate(null);
-//        ifsInventoryQuantityDto.setEndDeclareDate(null);
-//
-//        return standardTreeMapper.getIfsByQuarter(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
-//    }
-//
-//    /**
-//     * 鎻愬墠鍏ュ簱
-//     * @param ifsInventoryId
-//     * @return
-//     */
-//    @Override
-//    public boolean advancedGodown(Integer ifsInventoryId) {
-//        // 鏌ヨ鍘熸潗鏂欎俊鎭�
-//        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
-//        if (!ifsInventoryQuantity.getInspectStatus().equals(0)
-//                && !ifsInventoryQuantity.getInspectStatus().equals(3)) {
-//            throw new ErrorException("鏈娴嬪畬鎴愭暟鎹墠鑳芥彁鍓嶅叆搴�");
-//        }
-//
-//        // todo:闇�瑕佸垽鏂璷a娴佺▼鏄惁鏄姝ユ斁琛�
-//        String toLocation = insReportService.moveRawMaterial(ifsInventoryQuantity);
-//
-//        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                .set(IfsInventoryQuantity::getInspectStatus, 1)
-//                .set(IfsInventoryQuantity::getIsFinish, 1)
-//                .set(IfsInventoryQuantity::getToLocation, toLocation)
-//                .eq(IfsInventoryQuantity::getId, ifsInventoryId));
-//
-//        return true;
-//    }
-//
-//
-//    /**
-//     * 娣诲姞宸ユ椂
-//     * @param insOrder
-//     * @param ifsInventoryQuantity
-//     */
-//    private void addAuxiliary(InsOrder insOrder, IfsInventoryQuantity ifsInventoryQuantity) {
-//        AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHours = new AuxiliaryOutputWorkingHours();
-//        auxiliaryOutputWorkingHours.setInspectionItemClass(ifsInventoryQuantity.getUpdateBatchNo() + "鍏嶆");//妫�娴嬮」鍒嗙被
-//        auxiliaryOutputWorkingHours.setSample(insOrder.getEntrustCode());//鏍峰搧缂栧彿
-//        auxiliaryOutputWorkingHours.setOrderId(insOrder.getId());//璁㈠崟id
-//        auxiliaryOutputWorkingHours.setOrderNo(insOrder.getEntrustCode());//闈炲姞鐝鎵樺崟鍙�
-//
-//        // 鍏嶆榛樿2
-//        auxiliaryOutputWorkingHours.setWorkTime(new BigDecimal("2"));//闈炲姞鐝伐鏃�
-//        auxiliaryOutputWorkingHours.setAmount(1);//闈炲姞鐝暟閲�
-//        auxiliaryOutputWorkingHours.setOutputWorkTime((ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getOvertimeWorkTime()) ? auxiliaryOutputWorkingHours.getOvertimeWorkTime() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getWorkTime()) ? auxiliaryOutputWorkingHours.getWorkTime() : BigDecimal.ZERO));//浜ч噺宸ユ椂
-//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-//        DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-//        auxiliaryOutputWorkingHours.setDateTime(LocalDateTime.now().toLocalDate().atStartOfDay().format(formatters));//鏃ユ湡
-//        LocalDateTime localDateTime = LocalDateTime.now();
-//        DateTime parse = DateUtil.parse(localDateTime.format(formatter));
-//        auxiliaryOutputWorkingHours.setWeekDay(getWeek(localDateTime.format(formatters)));//鏄熸湡
-//        auxiliaryOutputWorkingHours.setWeek(String.valueOf(DateUtil.weekOfYear(DateUtil.offsetDay(parse, 1))));//鍛ㄦ
-//        auxiliaryOutputWorkingHours.setCheck(SecurityUtils.getUserId().intValue());//妫�娴嬩汉
-//        auxiliaryOutputWorkingHours.setPrice(new BigDecimal("1"));//鍗曚环
-//
-//        auxiliaryOutputWorkingHoursMapper.insert(auxiliaryOutputWorkingHours);
-//    }
-//
-//    public static String getWeek(String dayStr) {
-//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-//        try {
-//            Date date = sdf.parse(dayStr);
-//            Calendar calendar = Calendar.getInstance();
-//            calendar.setTime(date);
-//            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
-//            int day = calendar.get(Calendar.DAY_OF_MONTH);
-//            return getWeekDay(dayOfWeek);
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//        return null;
-//    }
-//
-//    public static String getWeekDay(int dayOfWeek) {
-//        switch (dayOfWeek) {
-//            case Calendar.MONDAY:
-//                return "鍛ㄤ竴";
-//            case Calendar.TUESDAY:
-//                return "鍛ㄤ簩";
-//            case Calendar.WEDNESDAY:
-//                return "鍛ㄤ笁";
-//            case Calendar.THURSDAY:
-//                return "鍛ㄥ洓";
-//            case Calendar.FRIDAY:
-//                return "鍛ㄤ簲";
-//            case Calendar.SATURDAY:
-//                return "鍛ㄥ叚";
-//            case Calendar.SUNDAY:
-//                return "鍛ㄦ棩";
-//            default:
-//                return "鏈煡";
-//        }
-//    }
-//}
+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;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.*;
+import com.ruoyi.basic.pojo.IfsInventoryQuantity;
+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.config.WechatProperty;
+import com.ruoyi.common.enums.OrderType;
+import com.ruoyi.common.utils.LimsDateUtil;
+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.common.utils.api.MesApiUtils;
+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.mapper.InsUnqualifiedHandlerMapper;
+import com.ruoyi.inspect.pojo.IfsSplitOrderRecord;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.pojo.InsReport;
+import com.ruoyi.inspect.pojo.InsUnqualifiedHandler;
+import com.ruoyi.inspect.service.IfsSplitOrderRecordService;
+import com.ruoyi.inspect.service.InsOrderService;
+import com.ruoyi.inspect.service.InsReportService;
+import com.ruoyi.inspect.service.RawMaterialOrderService;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.performance.mapper.AuxiliaryOutputWorkingHoursMapper;
+import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours;
+import com.ruoyi.system.mapper.UserMapper;
+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
+ * @Date 2024/7/31
+ */
+@Service
+@AllArgsConstructor
+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;
+
+
+    @Override
+    public Result selectStandardTreeListByPartNo(String partNo) {
+        List<FactoryDto> factoryDtos = standardTreeMapper.selectStandardTreeListByPartNo(partNo);
+        if (CollectionUtil.isEmpty(factoryDtos)) {
+            return Result.success(null, "闆朵欢鍙蜂负" + partNo + "鐨勫師鏉愭枡娌℃湁瀵瑰簲鐨勬爣鍑嗗簱閰嶇疆");
+        }
+        RawMaterialStandardTreeDto rawMaterialStandardTreeDto = new RawMaterialStandardTreeDto();
+        for (FactoryDto factoryDto : factoryDtos) {
+            for (LaboratoryDto laboratoryDto : factoryDto.getChildren()) {
+                for (SampleTypeDto sampleTypeDto : laboratoryDto.getChildren()) {
+                    if (sampleTypeDto.getChildren().size() == 0) {
+                        sampleTypeDto.setChildren(standardTreeMapper.getStandardTree3(sampleTypeDto.getValue()));
+                    }
+                    // 鍒ゆ柇缁戝畾鐨勬槸鍚︽槸褰撳墠闆朵欢鍙�
+                    if (sampleTypeDto.getPartNo() != null && sampleTypeDto.getPartNo().equals(partNo)) {
+                        // 娣诲姞瀵硅薄
+                        rawMaterialStandardTreeDto.setTreeName(factoryDto.getValue() + " - "
+                                + laboratoryDto.getValue() + " - "
+                                + sampleTypeDto.getValue());
+                        rawMaterialStandardTreeDto.setCode(sampleTypeDto.getCode());
+                        rawMaterialStandardTreeDto.setLabel(sampleTypeDto.getLabel());
+                        rawMaterialStandardTreeDto.setValue(sampleTypeDto.getValue());
+                        rawMaterialStandardTreeDto.setChildren1(sampleTypeDto.getChildren());
+                    } else {
+                        for (SampleDto sampleDto : sampleTypeDto.getChildren()) {
+                            if (sampleDto.getPartNo() != null && sampleDto.getPartNo().equals(partNo)) {
+                                // 娣诲姞瀵硅薄
+                                rawMaterialStandardTreeDto.setTreeName(factoryDto.getValue() + " - "
+                                        + laboratoryDto.getValue() + " - "
+                                        + sampleTypeDto.getValue() + " - "
+                                        + sampleDto.getValue());
+                                rawMaterialStandardTreeDto.setCode(sampleDto.getCode());
+                                rawMaterialStandardTreeDto.setLabel(sampleDto.getLabel());
+                                rawMaterialStandardTreeDto.setValue(sampleDto.getValue());
+                                rawMaterialStandardTreeDto.setChildren2(sampleDto.getChildren());
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return Result.success(rawMaterialStandardTreeDto);
+    }
+
+    @Override
+    public IPage<IfsInventoryQuantity> getWarehouseSubmit(IPage<IfsInventoryQuantity> page, IfsInventoryQuantity ifsInventoryQuantity) {
+        if(ifsInventoryQuantity.getIsInspect().equals(1)){
+            ifsInventoryQuantity.setOrderType(OrderType.RAW.getValue());
+        }
+        return standardTreeMapper.selectIfsPage(page, QueryWrappers.queryWrappers(ifsInventoryQuantity));
+    }
+
+    @Override
+    public IPage<IfsInventoryQuantityDto> getIfsByStateOne(IPage<IfsInventoryQuantityDto> page, IfsInventoryQuantityDto ifsInventoryQuantityDto) {
+        ifsInventoryQuantityDto.setOrderType(OrderType.RAW.getValue());
+        return standardTreeMapper.getIfsByStateOne(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto));
+    }
+
+
+    /**
+     * 鎶ユ
+     * @param ids
+     * @return
+     */
+    @Override
+    public int inspectionReport(List<Long> ids,String orderType) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                .in(IfsInventoryQuantity::getId, ids)
+                .set(IfsInventoryQuantity::getDeclareUser, userMapper.selectById(userId).getName())
+                .set(IfsInventoryQuantity::getDeclareUserId, userId)
+                .set(IfsInventoryQuantity::getIsInspect, 1)
+                .set(IfsInventoryQuantity::getOrderType,orderType)
+                .set(IfsInventoryQuantity::getDeclareDate, LocalDateTime.now())
+        );
+        threadPoolTaskExecutor.execute(() -> {
+            List<IfsInventoryQuantity> quantityList = ifsInventoryQuantityMapper.selectList(Wrappers.<IfsInventoryQuantity>lambdaQuery()
+                    .in(IfsInventoryQuantity::getId, ids));
+            // 浼佷笟寰俊閫氱煡
+            String message = "";
+            message += "鏂板鎶ユ閫氱煡";
+            for (IfsInventoryQuantity inventoryQuantity : quantityList) {
+                message += "\n鎵规鍙�: " + inventoryQuantity.getUpdateBatchNo();
+                message += "\n闆朵欢鎻忚堪: " + inventoryQuantity.getPartDesc();
+                message += "\n鎶佃揪鏁伴噺: " + inventoryQuantity.getQtyArrived().stripTrailingZeros().toPlainString() + inventoryQuantity.getBuyUnitMeas();
+
+                // 鍒ゆ柇鏈夋病鏈夊埌20鍚�. 鎴栬�呰兘鍚﹀厤妫�
+                int result = notificationRawOrder(inventoryQuantity.getId());
+                switch (result) {
+                    case 1:
+                        message += "\n褰撳墠鏍峰搧宸叉楠岃繃, 鍙互鍏嶆";
+                        break;
+                    case 2:
+                        message += "\n褰撳墠鏍峰搧宸茶秴杩�20鍚�";
+                        break;
+                }
+                message += "\n";
+            }
+            WxCpUtils.informWebHook(wechatProperty.getExaminingUrl(), message);
+        });
+        return 1;
+    }
+
+    /**
+     * 鎾ら攢鎶ユ
+     * @param id
+     * @return
+     */
+    @Override
+    public int revokeInspectionReport(Long id) {
+        return ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                .eq(IfsInventoryQuantity::getId, id)
+                .set(IfsInventoryQuantity::getIsInspect, 0)
+        );
+    }
+
+    /**
+     * 鎵撳嵃鏍囩鏌ヨ
+     * @param ids
+     * @return
+     */
+    @Override
+    public List<IfsInventoryQuantityDto> printLabel(List<Integer> ids) {
+        return ifsInventoryQuantityMapper.printLabel(ids);
+    }
+
+    /**
+     * 鎶ユ
+     * @param ifsInventoryQuantity
+     * @return
+     */
+    @Override
+    public int inspectionReportOne(IfsInventoryQuantity ifsInventoryQuantity) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        boolean validateValue = OrderType.validateValue(ifsInventoryQuantity.getOrderType());
+        if(!validateValue){
+            throw new ErrorException("鎶ユ澶辫触锛岄潪娉曠殑閿�鍞鍗曞垎绫绘灇涓�");
+        }
+        ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                .eq(IfsInventoryQuantity::getId, ifsInventoryQuantity.getId())
+                .set(IfsInventoryQuantity::getDeclareUser, userMapper.selectById(userId).getName())
+                .set(IfsInventoryQuantity::getDeclareUserId, userId)
+                .set(IfsInventoryQuantity::getIsInspect, 1)
+                .set(IfsInventoryQuantity::getDeclareDate, LocalDateTime.now())
+                .set(IfsInventoryQuantity::getUpdateBatchNo, ifsInventoryQuantity.getUpdateBatchNo())
+                .set(IfsInventoryQuantity::getOrderType,ifsInventoryQuantity.getOrderType())
+        );
+
+        threadPoolTaskExecutor.execute(() -> {
+            IfsInventoryQuantity inventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryQuantity.getId());
+            // 浼佷笟寰俊閫氱煡
+            String message = "";
+            message += "鏂板鎶ユ閫氱煡";
+            message += "\n鎵规鍙�: " + inventoryQuantity.getUpdateBatchNo();
+            message += "\n闆朵欢鎻忚堪: " + inventoryQuantity.getPartDesc();
+            message += "\n鎶佃揪鏁伴噺: " + inventoryQuantity.getQtyArrived().stripTrailingZeros().toPlainString() + inventoryQuantity.getBuyUnitMeas();
+            WxCpUtils.informWebHook(wechatProperty.getExaminingUrl(), message);
+        });
+        return 1;
+    }
+
+    /**
+     * 鑾峰彇閾滀骇涓氶摼妫�娴嬫暟鎹�
+     * @param id
+     * @return
+     */
+    @Override
+    public String getIndustryChain(Integer id) {
+        return ifsInventoryQuantityMapper.selectById(id).getIndustryChain();
+    }
+
+    /**
+     * 鍘熸潗鏂欐挙閿�鎺ュ彛
+     * @param ifsInventoryId
+     * @return
+     */
+    @Override
+    public boolean repealRawOrder(Long ifsInventoryId) {
+        // 鏌ヨ鍒ゆ柇鏄惁鏄摐鍗曚笣
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
+        if (ifsInventoryQuantity.getIsCopper() != null && ifsInventoryQuantity.getIsCopper().equals(1)) {
+            // 閾滃崟涓濈洿鎺ュ垹闄ゅ氨琛�
+            ifsInventoryQuantityMapper.deleteById(ifsInventoryId);
+        } else {
+            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                    .set(IfsInventoryQuantity::getState, 0)
+                    .set(IfsInventoryQuantity::getIsQuarter, 1)
+                    .eq(IfsInventoryQuantity::getId, ifsInventoryId));
+        }
+
+        insOrderService.update(Wrappers.<InsOrder>lambdaUpdate()
+                .eq(InsOrder::getIfsInventoryId, ifsInventoryId)
+                .set(InsOrder::getState, -1)
+                .set(InsOrder::getEntrustCode, ""));// 鎾ら攢
+        return true;
+    }
+
+    /**
+     * 鍘熸潗鏂欏厤妫�涓嬪崟
+     * @param list
+     * @param insOrder
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int addExemptionOrder(List<SampleProductDto> list, InsOrder insOrder) {
+        if (!insOrder.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
+            throw new ErrorException("鍙湁杩涘巶妫�楠屾墠鑳藉厤妫�");
+        }
+        insOrder.setSendTime(LocalDateTime.now());
+        // 淇敼璁㈠崟琛ㄧ洿鎺ヤ负宸叉楠�
+        insOrder.setState(4);
+        insOrder.setTypeSource(1);
+
+        String code = "Y";
+        // 鐢熸垚缂栧彿
+        String no = numberGenerator.generateNumberWithPrefix(3,
+                "JCZX/NS-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
+                InsOrder::getEntrustCode);
+
+        insOrderMapper.insert(insOrder); // 涓昏〃
+
+        AtomicInteger count = new AtomicInteger();
+        list.forEach(a -> {
+            count.getAndIncrement();
+            a.setId(null);
+            a.setInsOrderId(insOrder.getId());
+            if (StrUtil.isEmpty(a.getSampleCode())) {
+                // 濡傛灉鍙湁涓�涓牱鍝佸氨涓嶉渶瑕佹嫾鎺ユ暟瀛�
+                if (list.size() != 1) {
+                    a.setSampleCode(no + "-" + count.get());
+                } else {
+                    a.setSampleCode(no);
+                }
+            }
+            insSampleMapper.insert(a);
+
+            if (!CollectionUtil.isEmpty(a.getInsProduct())) {
+                throw new ErrorException("鍏嶆涓嶉渶瑕佸~鍐欐楠岄」");
+            }
+        });
+
+        // 鍘熸潗鏂欎笅鍗�: 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId());
+        Integer declareUserId = ifsInventoryQuantity.getDeclareUserId();
+        User user = userMapper.selectById(declareUserId);
+        // 渚涘簲鍟嗗悕绉�
+        insOrder.setProduction(ifsInventoryQuantity.getSupplierName());
+        // 濮旀墭浜哄悕绉�
+        insOrder.setPrepareUser(user.getName());
+        insOrder.setPhone(user.getPhone());
+
+        // 淇敼鍘熸潗鏂欐暟鎹洿鎺ヤ负宸叉楠�
+        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>().set(IfsInventoryQuantity::getState, 2)
+                .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
+
+        insOrder.setExamineTime(LocalDateTime.now());
+
+        insOrder.setEntrustCode(no);
+        insOrder.setIsExemption(1);
+
+        insOrderMapper.updateById(insOrder);
+
+        // 娣诲姞宸ユ椂
+        addAuxiliary(insOrder, ifsInventoryQuantity);
+
+        // todo: ifs鐩存帴绉诲簱
+        insReportService.isRawMaterial(insOrder,true,true);
+
+        return insOrder.getId();
+    }
+
+
+    /**
+     * 鏌ヨ寰呬笅鍗�
+     * @param page
+     * @param ifsInventoryQuantity
+     * @return
+     */
+    @Override
+    public IPage<IfsInventoryQuantityCheckDto> selectIfsInventoryQuantity(Page<IfsInventoryQuantityCheckDto> page, IfsInventoryQuantityCheckDto ifsInventoryQuantity) {
+        return standardTreeMapper.selectIfsInventoryQuantity(page, QueryWrappers.queryWrappers(ifsInventoryQuantity));
+    }
+
+    /**
+     * 鏌ヨ宸叉楠�
+     * @param page
+     * @param ifsInventoryQuantityDto
+     * @return
+     */
+    @Override
+    public IPage<IfsInventoryQuantitySupplierDto> getIfsByOver(Page<IfsInventoryQuantitySupplierDto> page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) {
+        // todo: 鍙湅鎴�
+        String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
+        String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
+        ifsInventoryQuantityDto.setBeginDeclareDate(null);
+        ifsInventoryQuantityDto.setEndDeclareDate(null);
+        ifsInventoryQuantityDto.setOrderType(OrderType.RAW.getValue());
+        IPage<IfsInventoryQuantitySupplierDto> ifsByOver = standardTreeMapper.getIfsByOver(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
+        ifsByOver.getRecords().forEach(r->r.setOrderTypeName(OrderType.getLabelByValue(r.getOrderType())));
+        return ifsByOver;
+    }
+
+    /**
+     * 鍒犻櫎鍘熸潗鏂欐姤妫�淇℃伅
+     * @param id
+     * @return
+     */
+    @Override
+    public int delIfsInventory(Integer id) {
+        return ifsInventoryQuantityMapper.deleteById(id);
+    }
+
+    /**
+     * 鍘熸潗鏂欐斁琛屽厤妫�
+     * @param ifsInventoryId
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean rawOrderRelease(Long ifsInventoryId, String partDetail) {
+        // 淇敼鍘熸潗鏂欐暟鎹洿鎺ヤ负宸叉楠�
+        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                .set(IfsInventoryQuantity::getState, 2)
+                .set(IfsInventoryQuantity::getIsQuarter, 0)
+                .eq(IfsInventoryQuantity::getId, ifsInventoryId));
+
+        // 鏌ヨ鍘熸潗鏂欎俊鎭�
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
+        // 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
+        Integer declareUserId = ifsInventoryQuantity.getDeclareUserId();
+        User user = userMapper.selectById(declareUserId);
+
+        InsOrder insOrder = new InsOrder();
+        insOrder.setState(4);
+        insOrder.setTypeSource(1);
+        String code = "Y";
+        // 鐢熸垚缂栧彿
+        String no = numberGenerator.generateNumberWithPrefix(3,
+                "JCZX/NS-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
+                InsOrder::getEntrustCode);
+        insOrder.setExamineTime(LocalDateTime.now());
+        insOrder.setEntrustCode(no);
+        insOrder.setIsExemption(1);
+        // 渚涘簲鍟嗗悕绉�
+        insOrder.setProduction(ifsInventoryQuantity.getSupplierName());
+        // 濮旀墭浜哄悕绉�
+        insOrder.setPrepareUser(user.getName());
+        insOrder.setPhone(user.getPhone());
+        insOrder.setIfsInventoryId(ifsInventoryId);
+        insOrder.setPartDetail(partDetail);
+        insOrder.setSendTime(LocalDateTime.now());
+        insOrder.setSample(ifsInventoryQuantity.getPartDesc());
+        // 杩涘巶妫�楠�
+        insOrder.setOrderType(InsOrderTypeConstants.ENTER_THE_FACTORY);
+
+        insOrderMapper.insert(insOrder);
+
+        // 娣诲姞宸ユ椂
+        addAuxiliary(insOrder, ifsInventoryQuantity);
+
+        // todo: ifs鐩存帴绉诲簱
+        insReportService.isRawMaterial(insOrder,true,true);
+        return true;
+    }
+
+    /**
+     * 0, 鏃犳彁绀�, 1鎻愮ず  褰撳墠鎵规鐨勬牱鍝佸凡妫�楠岃繃, 鍙互鍏嶆, 2 鎻愮ず 褰撳墠鎵规鐨勬牱鍝佸凡瓒�20鍚�, 闇�瑕佸绾у娆℃楠�
+     *
+     * 鍘熸潗鏂欎笅鍗曢�氱煡鍏嶆鎴栬�呭娆℃楠�
+     * @param ifsInventoryId
+     * @return
+     */
+    @Override
+    public int notificationRawOrder(Long ifsInventoryId) {
+        IfsInventoryQuantity ifsInventory = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
+        // 鏌ヨ褰撳墠鎵规, 渚涘簲鍟�, 闆朵欢鍙风殑鍘熸潗鏂欐槸鍚﹁秴杩囦簡20鍚�, 瓒呰繃浜�20鍚ㄩ渶瑕佽繘琛屽娆℃楠屾彁閱�
+        List<IfsInventoryQuantity> quantityList = ifsInventoryQuantityMapper.selectList(Wrappers.<IfsInventoryQuantity>lambdaQuery()
+                .eq(IfsInventoryQuantity::getPartNo, ifsInventory.getPartNo())
+                .eq(IfsInventoryQuantity::getUpdateBatchNo, ifsInventory.getUpdateBatchNo())
+                .eq(IfsInventoryQuantity::getSupplierId, ifsInventory.getSupplierId())
+                .eq(IfsInventoryQuantity::getSupplierName, ifsInventory.getSupplierName()));
+
+        // 鍒ゆ柇鏄惁澶т簬20鍚�
+        BigDecimal bigDecimal = new BigDecimal("20000");
+        BigDecimal count = BigDecimal.ZERO;
+        for (IfsInventoryQuantity inventoryQuantity : quantityList) {
+            // 鍒ゆ柇鍗曚綅鏄痥g鎴栬�卼
+            if (inventoryQuantity.getBuyUnitMeas().equalsIgnoreCase("t")) {
+                count = count.add(inventoryQuantity.getQtyArrived().multiply(new BigDecimal("1000")));
+            } else if (inventoryQuantity.getBuyUnitMeas().equalsIgnoreCase("kg")) {
+                count = count.add(inventoryQuantity.getQtyArrived());
+            }
+        }
+
+        if (count.compareTo(bigDecimal) >= 0) {
+            return 2;
+        } else {
+            // 鍒ゆ柇涔嬪墠鏄惁鍑鸿繃鎶ュ憡, 鍑鸿繃鎶ュ憡鍙互鍏嶆
+            int reportCount = ifsInventoryQuantityMapper.selectReportCountById(ifsInventoryId);
+            if (reportCount > 0) {
+                return 1;
+            }
+        }
+        return 0;
+    }
+
+    /**
+     * 鎶ユ鍙互鏂板鎶ユ淇℃伅
+     * @param ifsInventoryQuantity
+     */
+    @Override
+    public void addIfsInventoryQuantity(IfsInventoryQuantity ifsInventoryQuantity) {
+        ifsInventoryQuantity.setIsSource(0);
+        ifsInventoryQuantity.setState(0);
+        ifsInventoryQuantity.setIsFinish(0);
+        if(!OrderType.validateValue(ifsInventoryQuantity.getOrderType())){
+            throw new ErrorException("鏂板鎶ユ淇℃伅澶辫触锛岄潪娉曠殑閿�鍞鍗曞垎绫绘灇涓�");
+        }
+        ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
+    }
+
+
+
+
+    /**
+     * 閾滃崟涓濅笅鍗曞厤妫�
+     * @param list
+     * @param insOrder
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int addRawCopperOrderExemptionOrder(List<SampleProductDto> list, CopperInsOrderDto insOrder) {
+        if (!insOrder.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
+            throw new ErrorException("鍙湁杩涘巶妫�楠屾墠鑳藉厤妫�");
+        }
+        insOrder.setSendTime(LocalDateTime.now());
+        // 淇敼璁㈠崟琛ㄧ洿鎺ヤ负宸叉楠�
+        insOrder.setState(4);
+        insOrder.setTypeSource(1);
+
+        String code = "Y";
+        // 鐢熸垚缂栧彿
+        String no = numberGenerator.generateNumberWithPrefix(3,
+                "JCZX/NS-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
+                InsOrder::getEntrustCode);
+
+        insOrderMapper.insert(insOrder); // 涓昏〃
+
+        AtomicInteger count = new AtomicInteger();
+        list.forEach(a -> {
+            count.getAndIncrement();
+            a.setId(null);
+            a.setInsOrderId(insOrder.getId());
+            if (StrUtil.isEmpty(a.getSampleCode())) {
+                // 濡傛灉鍙湁涓�涓牱鍝佸氨涓嶉渶瑕佹嫾鎺ユ暟瀛�
+                if (list.size() != 1) {
+                    a.setSampleCode(no + "-" + count.get());
+                } else {
+                    a.setSampleCode(no);
+                }
+            }
+            insSampleMapper.insert(a);
+
+            if (!CollectionUtil.isEmpty(a.getInsProduct())) {
+                throw new ErrorException("鍏嶆涓嶉渶瑕佸~鍐欐楠岄」");
+            }
+        });
+        // 娣诲姞鍘熸潗鏂欎俊鎭�
+        IfsInventoryQuantity ifsInventoryQuantity = new IfsInventoryQuantity();
+        // 鍩烘湰淇℃伅
+        ifsInventoryQuantity.setIsSource(0);
+        ifsInventoryQuantity.setState(2);
+        ifsInventoryQuantity.setIsInspect(1);
+        ifsInventoryQuantity.setIsFinish(1);
+        ifsInventoryQuantity.setIsCopper(1);
+        ifsInventoryQuantity.setInspectStatus(1);
+        ifsInventoryQuantity.setIsQuarter(0);
+
+        ifsInventoryQuantity.setQtyArrived(insOrder.getQtyArrived());
+        ifsInventoryQuantity.setBuyUnitMeas(insOrder.getBuyUnitMeas());
+        ifsInventoryQuantity.setSupplierName(insOrder.getSupplierName());
+        ifsInventoryQuantity.setUpdateBatchNo(insOrder.getUpdateBatchNo());
+        ifsInventoryQuantity.setDeclareDate(insOrder.getDeclareDate());
+
+        ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
+
+        insOrder.setIfsInventoryId(ifsInventoryQuantity.getId());
+        insOrder.setExamineTime(LocalDateTime.now());
+
+        insOrder.setEntrustCode(no);
+        insOrder.setIsExemption(1);
+
+        insOrderMapper.updateById(insOrder);
+
+        // 娣诲姞宸ユ椂
+        addAuxiliary(insOrder, ifsInventoryQuantity);
+
+        return insOrder.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean concessionRelease(Long ifsInventoryId) {
+        // 鏌ヨ鍘熸潗鏂欎俊鎭�
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
+        if (!ifsInventoryQuantity.getInspectStatus().equals(2)) {
+            throw new ErrorException("涓嶅悎鏍肩殑鍘熸潗鏂欐墠鑳借姝ユ斁琛�");
+        }
+        // todo:闇�瑕佸垽鏂璷a娴佺▼鏄惁鏄姝ユ斁琛�
+        String toLocation = insOrderService.moveRawMaterial(ifsInventoryQuantity);
+
+        return ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                .set(IfsInventoryQuantity::getInspectStatus, 4)
+                .set(IfsInventoryQuantity::getToLocation, toLocation)
+                .eq(IfsInventoryQuantity::getId, ifsInventoryId))>0;
+    }
+
+    /**
+     * 鍘熸潗鏂欒繘鍘傛挙閿�涓嬪崟
+     * @param enterOrderId
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean repealEnterRawOrder(Integer enterOrderId) {
+        // 鏌ヨ璁㈠崟
+        InsOrder order = insOrderMapper.selectById(enterOrderId);
+
+        // 鏌ヨ鍒ゆ柇鏄惁鏄摐鍗曚笣
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
+        if (ifsInventoryQuantity.getIsCopper() != null && ifsInventoryQuantity.getIsCopper().equals(1)) {
+            // 閾滃崟涓濈洿鎺ュ垹闄ゅ氨琛�
+            ifsInventoryQuantityMapper.deleteById(order.getIfsInventoryId());
+        } else {
+            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                    .set(IfsInventoryQuantity::getState, 0)
+                    .set(IfsInventoryQuantity::getIsQuarter, 1)
+                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
+        }
+        insOrderService.update(Wrappers.<InsOrder>lambdaUpdate()
+                .eq(InsOrder::getId, enterOrderId)
+                .set(InsOrder::getState, -1)
+                .set(InsOrder::getEntrustCode, ""));// 鎾ら攢
+
+        // 娓呴櫎涔嬪墠鐨勫伐鏃�
+        auxiliaryOutputWorkingHoursMapper.delete(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery()
+                .eq(AuxiliaryOutputWorkingHours::getOrderId, enterOrderId));
+
+        // 娓呴櫎涔嬪墠鎶ュ憡
+        insReportService.remove(Wrappers.<InsReport>lambdaQuery()
+                .eq(InsReport::getInsOrderId, enterOrderId));
+
+        return true;
+    }
+
+    /**
+     * 鍘熸潗鏂欏搴︽挙閿�涓嬪崟
+     * @param quarterOrderId
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean repealQuarterRawOrder(Integer quarterOrderId) {
+        // 鏌ヨ璁㈠崟
+        InsOrder order = insOrderMapper.selectById(quarterOrderId);
+
+        Long count = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
+                .eq(InsOrder::getIfsInventoryId, order.getIfsInventoryId())
+                .ne(InsOrder::getState, -1)
+                .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY)
+                .ne(InsOrder::getId, order.getId()));
+        // 鍒ゆ柇涔嬪墠鏄惁鏈夎繘鍘傛楠�, 娌℃湁闇�瑕佷慨鏀瑰師鏉愭枡淇℃伅
+        if (count == 0) {
+            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                    .set(IfsInventoryQuantity::getState, 0)
+                    .set(IfsInventoryQuantity::getIsQuarter, 1)
+                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
+        } else {
+            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                    .set(IfsInventoryQuantity::getIsQuarter, 1)
+                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
+        }
+
+        insOrderService.update(Wrappers.<InsOrder>lambdaUpdate()
+                .eq(InsOrder::getId, quarterOrderId)
+                .set(InsOrder::getState, -1)
+                .set(InsOrder::getEntrustCode, ""));// 鎾ら攢
+        auxiliaryOutputWorkingHoursMapper.delete(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery()
+                .eq(AuxiliaryOutputWorkingHours::getOrderId, quarterOrderId));
+        // 娓呴櫎涔嬪墠鎶ュ憡
+        insReportService.remove(Wrappers.<InsReport>lambdaQuery()
+                .eq(InsReport::getInsOrderId, quarterOrderId));
+        return true;
+    }
+
+    /**
+     * 鍘熸潗鏂欐姤妫�鍏ㄩ儴淇℃伅瀵煎嚭
+     * @param ifsInventoryQuantityDto
+     * @param response
+     */
+    @Override
+    public void rawAllExport(IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto, HttpServletResponse response) throws UnsupportedEncodingException {
+        // 鍒ゆ柇鏄惁鏄牴鎹�夋嫨鐨勫鍑�
+        List<IfsInventoryQuantitySupplierDto> ifsByOverList = new ArrayList<>();
+        if (StringUtils.isNotBlank(ifsInventoryQuantityDto.getIds())) {
+            List<String> ifsIds = StrUtil.split(ifsInventoryQuantityDto.getIds(), ",");
+            ifsByOverList = standardTreeMapper.getIfsByIds(ifsIds);
+        } else {
+            String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
+            String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
+            ifsInventoryQuantityDto.setBeginDeclareDate(null);
+            ifsInventoryQuantityDto.setEndDeclareDate(null);
+            ifsInventoryQuantityDto.setIds(null);
+            ifsByOverList = standardTreeMapper.getIfsByOverList(QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
+        }
+
+        for (IfsInventoryQuantitySupplierDto dto : ifsByOverList) {
+            dto.setSendTimeString(dto.getSendTime() == null ? "" : dto.getSendTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            dto.setReceiverDateString(dto.getReceiverDate() == null ? "" : dto.getReceiverDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            dto.setDeclareDateString(dto.getDeclareDate() == null ? "" : dto.getDeclareDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            switch (dto.getInspectStatus()) {
+                case 1:
+                    dto.setInspectStatusString("鍚堟牸");
+                    break;
+                case 2:
+                    dto.setInspectStatusString("涓嶅悎鏍�");
+                    // 鏌ヨ涓嶅悎鏍奸」
+                    List<String> unqualifiedList = insProductMapper.selectUnqualifiedList(dto.getEnterOrderId() == null ? dto.getQuarterOrderId() : dto.getEnterOrderId());
+                    dto.setUnqualifiedItem(CollUtil.join(unqualifiedList, ","));
+                    break;
+                case 3:
+                    dto.setInspectStatusString("鏈笅鍗�");
+                    break;
+                case 4:
+                    dto.setInspectStatusString("璁╂鏀捐");
+                    break;
+                case 0:
+                    dto.setInspectStatusString("妫�楠屼腑");
+                    break;
+
+            }
+        }
+
+
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
+        String fileName = URLEncoder.encode("鍘熸潗鏂欐娴嬩俊鎭鍑�", "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        try {
+            //鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            //鑾峰彇sheet0瀵硅薄
+            WriteSheet mainSheet = EasyExcel.writerSheet(0, "鍘熸潗鏂欐娴嬩俊鎭鍑�").head(IfsInventoryQuantitySupplierDto.class).build();
+
+            //鍚憇heet0鍐欏叆鏁版嵁 浼犲叆绌簂ist杩欐牱鍙鍑鸿〃澶�
+            excelWriter.write(ifsByOverList, mainSheet);
+            //鍏抽棴娴�
+            excelWriter.finish();
+        } catch (IOException e) {
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /**
+     * 鍘熸潗鏂欐煡璇㈠彲浠ュ搴︽楠岀殑鍐呭
+     * @param page
+     * @param ifsInventoryQuantityDto
+     * @return
+     */
+    @Override
+    public IPage<IfsInventoryQuantitySupplierDto> getIfsByQuarter(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) {
+
+        // todo: 鍙湅鎴�
+        String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
+        String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
+        ifsInventoryQuantityDto.setBeginDeclareDate(null);
+        ifsInventoryQuantityDto.setEndDeclareDate(null);
+        ifsInventoryQuantityDto.setOrderType(OrderType.RAW.getValue());
+        return standardTreeMapper.getIfsByQuarter(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
+    }
+
+    /**
+     * 鎻愬墠鍏ュ簱
+     * @param ifsInventoryId
+     * @return
+     */
+    @Override
+    public boolean advancedGodown(Long ifsInventoryId) {
+        // 鏌ヨ鍘熸潗鏂欎俊鎭�
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
+        if (!ifsInventoryQuantity.getInspectStatus().equals(0)
+                && !ifsInventoryQuantity.getInspectStatus().equals(3)) {
+            throw new ErrorException("鏈娴嬪畬鎴愭暟鎹墠鑳芥彁鍓嶅叆搴�");
+        }
+
+        // todo:闇�瑕佸垽鏂璷a娴佺▼鏄惁鏄姝ユ斁琛�
+        String toLocation = insOrderService.moveRawMaterial(ifsInventoryQuantity);
+
+        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                .set(IfsInventoryQuantity::getInspectStatus, 1)
+                .set(IfsInventoryQuantity::getIsFinish, 1)
+                .set(IfsInventoryQuantity::getToLocation, toLocation)
+                .eq(IfsInventoryQuantity::getId, ifsInventoryId));
+
+        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_NS");
+        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,OrderType.RAW.getValue());
+        }
+        //鍕鹃�夊悓姝ュ埌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;
+    }
+
+    /**
+     * 娣诲姞宸ユ椂
+     * @param insOrder
+     * @param ifsInventoryQuantity
+     */
+    private void addAuxiliary(InsOrder insOrder, IfsInventoryQuantity ifsInventoryQuantity) {
+        AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHours = new AuxiliaryOutputWorkingHours();
+        auxiliaryOutputWorkingHours.setInspectionItemClass(ifsInventoryQuantity.getUpdateBatchNo() + "鍏嶆");//妫�娴嬮」鍒嗙被
+        auxiliaryOutputWorkingHours.setSample(insOrder.getEntrustCode());//鏍峰搧缂栧彿
+        auxiliaryOutputWorkingHours.setOrderId(insOrder.getId());//璁㈠崟id
+        auxiliaryOutputWorkingHours.setOrderNo(insOrder.getEntrustCode());//闈炲姞鐝鎵樺崟鍙�
+
+        // 鍏嶆榛樿2
+        auxiliaryOutputWorkingHours.setWorkTime(new BigDecimal("2"));//闈炲姞鐝伐鏃�
+        auxiliaryOutputWorkingHours.setAmount(1);//闈炲姞鐝暟閲�
+        auxiliaryOutputWorkingHours.setOutputWorkTime((ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getOvertimeWorkTime()) ? auxiliaryOutputWorkingHours.getOvertimeWorkTime() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getWorkTime()) ? auxiliaryOutputWorkingHours.getWorkTime() : BigDecimal.ZERO));//浜ч噺宸ユ椂
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        auxiliaryOutputWorkingHours.setDateTime(LocalDateTime.now().toLocalDate().atStartOfDay().format(formatters));//鏃ユ湡
+        LocalDateTime localDateTime = LocalDateTime.now();
+        DateTime parse = DateUtil.parse(localDateTime.format(formatter));
+        auxiliaryOutputWorkingHours.setWeekDay(getWeek(localDateTime.format(formatters)));//鏄熸湡
+        auxiliaryOutputWorkingHours.setWeek(String.valueOf(DateUtil.weekOfYear(DateUtil.offsetDay(parse, 1))));//鍛ㄦ
+        auxiliaryOutputWorkingHours.setCheck(SecurityUtils.getUserId().intValue());//妫�娴嬩汉
+        auxiliaryOutputWorkingHours.setPrice(new BigDecimal("1"));//鍗曚环
+
+        auxiliaryOutputWorkingHoursMapper.insert(auxiliaryOutputWorkingHours);
+    }
+
+    public static String getWeek(String dayStr) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            Date date = sdf.parse(dayStr);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(date);
+            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
+            int day = calendar.get(Calendar.DAY_OF_MONTH);
+            return getWeekDay(dayOfWeek);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static String getWeekDay(int dayOfWeek) {
+        switch (dayOfWeek) {
+            case Calendar.MONDAY:
+                return "鍛ㄤ竴";
+            case Calendar.TUESDAY:
+                return "鍛ㄤ簩";
+            case Calendar.WEDNESDAY:
+                return "鍛ㄤ笁";
+            case Calendar.THURSDAY:
+                return "鍛ㄥ洓";
+            case Calendar.FRIDAY:
+                return "鍛ㄤ簲";
+            case Calendar.SATURDAY:
+                return "鍛ㄥ叚";
+            case Calendar.SUNDAY:
+                return "鍛ㄦ棩";
+            default:
+                return "鏈煡";
+        }
+    }
+}

--
Gitblit v1.9.3