chenrui
2025-03-14 9687fd99fdf6208dbf747ea45c440f192a9af815
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java
@@ -1,847 +1,843 @@
//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) {
//            // 判断单位是kg或者t
//            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:需要判断oa流程是否是让步放行
//        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可以防止中文乱码 当然和easyexcel没有关系
//        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();
//
//            //向sheet0写入数据 传入空list这样只导出表头
//            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:需要判断oa流程是否是让步放行
//        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();
        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);
        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) {
            // 判断单位是kg或者t
            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:需要判断oa流程是否是让步放行
        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可以防止中文乱码 当然和easyexcel没有关系
        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();
            //向sheet0写入数据 传入空list这样只导出表头
            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:需要判断oa流程是否是让步放行
        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 "未知";
        }
    }
}