From c1df30be108a9f4bd443c9034e0d93657870fcde Mon Sep 17 00:00:00 2001
From: chenrui <1187576398@qq.com>
Date: 星期一, 03 三月 2025 15:30:59 +0800
Subject: [PATCH] 代码迁移bug解决

---
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java | 1705 +++++++++++++++++++++++++++++-----------------------------
 1 files changed, 858 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..d3acb91 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,858 @@
-//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.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.properties.WechatProperty;
+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.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;
+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;
+
+
+    @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();
+        Set<String> sampleTypeValues = new HashSet<>();
+        for (FactoryDto factoryDto : factoryDtos) {
+            for (LaboratoryDto laboratoryDto : factoryDto.getChildren()) {
+                for (SampleTypeDto sampleTypeDto : laboratoryDto.getChildren()) {
+                    if (sampleTypeDto.getChildren().size() == 0) {
+                        sampleTypeValues.add(sampleTypeDto.getValue());
+                    }
+                }
+            }
+        }
+        // 鎵归噺鏌ヨ鎵�鏈� sampleTypeDto 鐨勬暟鎹�
+        List<SampleDto> standardList = standardTreeMapper.getStandardTree3Batch(sampleTypeValues);
+        Map<String, List<SampleDto>> standardTreeMap = standardList.stream().collect(Collectors.groupingBy(SampleDto::getValue));
+
+        for (FactoryDto factoryDto : factoryDtos) {
+            for (LaboratoryDto laboratoryDto : factoryDto.getChildren()) {
+                for (SampleTypeDto sampleTypeDto : laboratoryDto.getChildren()) {
+                    List<SampleDto> standardTreeList = standardTreeMap.get(sampleTypeDto.getValue());
+                    if (sampleTypeDto.getChildren().size() == 0) {
+                        sampleTypeDto.getChildren().addAll(standardTreeList);
+                    }
+                    // 鍒ゆ柇缁戝畾鐨勬槸鍚︽槸褰撳墠闆朵欢鍙�
+                    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);
+
+        IPage<IfsInventoryQuantitySupplierDto> ifsByOver = standardTreeMapper.getIfsByOver(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
+        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(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);
+    }
+
+
+
+
+    /**
+     * 閾滃崟涓濅笅鍗曞厤妫�
+     * @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 "鏈煡";
+        }
+    }
+}

--
Gitblit v1.9.3