From 4f3a98f19143865cdc1de4791e8a95d96bd40c65 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期五, 01 八月 2025 13:27:59 +0800
Subject: [PATCH] yys 密码已重置

---
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java |  847 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 847 insertions(+), 0 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
new file mode 100644
index 0000000..ebaac84
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java
@@ -0,0 +1,847 @@
+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.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.config.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;
+
+/**
+ * @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 Result selectStandardTreeListByPartNo(String partNo) {
+        List<FactoryDto> factoryDtos = standardTreeMapper.selectStandardTreeListByPartNo(partNo);
+        if (CollectionUtil.isEmpty(factoryDtos)) {
+            return Result.success(null, "闆朵欢鍙蜂负" + partNo + "鐨勫師鏉愭枡娌℃湁瀵瑰簲鐨勬爣鍑嗗簱閰嶇疆");
+        }
+        RawMaterialStandardTreeDto rawMaterialStandardTreeDto = new RawMaterialStandardTreeDto();
+        for (FactoryDto factoryDto : factoryDtos) {
+            for (LaboratoryDto laboratoryDto : factoryDto.getChildren()) {
+                for (SampleTypeDto sampleTypeDto : laboratoryDto.getChildren()) {
+                    if (sampleTypeDto.getChildren().size() == 0) {
+                        sampleTypeDto.setChildren(standardTreeMapper.getStandardTree3(sampleTypeDto.getValue()));
+                    }
+                    // 鍒ゆ柇缁戝畾鐨勬槸鍚︽槸褰撳墠闆朵欢鍙�
+                    if (sampleTypeDto.getPartNo() != null && sampleTypeDto.getPartNo().equals(partNo)) {
+                        // 娣诲姞瀵硅薄
+                        rawMaterialStandardTreeDto.setTreeName(factoryDto.getValue() + " - "
+                                + laboratoryDto.getValue() + " - "
+                                + sampleTypeDto.getValue());
+                        rawMaterialStandardTreeDto.setCode(sampleTypeDto.getCode());
+                        rawMaterialStandardTreeDto.setLabel(sampleTypeDto.getLabel());
+                        rawMaterialStandardTreeDto.setValue(sampleTypeDto.getValue());
+                        rawMaterialStandardTreeDto.setChildren1(sampleTypeDto.getChildren());
+                    } else {
+                        for (SampleDto sampleDto : sampleTypeDto.getChildren()) {
+                            if (sampleDto.getPartNo() != null && sampleDto.getPartNo().equals(partNo)) {
+                                // 娣诲姞瀵硅薄
+                                rawMaterialStandardTreeDto.setTreeName(factoryDto.getValue() + " - "
+                                        + laboratoryDto.getValue() + " - "
+                                        + sampleTypeDto.getValue() + " - "
+                                        + sampleDto.getValue());
+                                rawMaterialStandardTreeDto.setCode(sampleDto.getCode());
+                                rawMaterialStandardTreeDto.setLabel(sampleDto.getLabel());
+                                rawMaterialStandardTreeDto.setValue(sampleDto.getValue());
+                                rawMaterialStandardTreeDto.setChildren2(sampleDto.getChildren());
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return Result.success(rawMaterialStandardTreeDto);
+    }
+
+    @Override
+    public IPage<IfsInventoryQuantity> getWarehouseSubmit(IPage<IfsInventoryQuantity> page, IfsInventoryQuantity ifsInventoryQuantity) {
+        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 {
+        // 鍒ゆ柇鏄惁鏄牴鎹�夋嫨鐨勫鍑�
+        List<IfsInventoryQuantitySupplierDto> ifsByOverList = new ArrayList<>();
+        if (StringUtils.isNotBlank(ifsInventoryQuantityDto.getIds())) {
+            List<String> ifsIds = StrUtil.split(ifsInventoryQuantityDto.getIds(), ",");
+            ifsByOverList = standardTreeMapper.getIfsByIds(ifsIds);
+        } else {
+            String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
+            String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
+            ifsInventoryQuantityDto.setBeginDeclareDate(null);
+            ifsInventoryQuantityDto.setEndDeclareDate(null);
+            ifsInventoryQuantityDto.setIds(null);
+            ifsByOverList = standardTreeMapper.getIfsByOverList(QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
+        }
+
+        for (IfsInventoryQuantitySupplierDto dto : ifsByOverList) {
+            dto.setSendTimeString(dto.getSendTime() == null ? "" : dto.getSendTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            dto.setReceiverDateString(dto.getReceiverDate() == null ? "" : dto.getReceiverDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            dto.setDeclareDateString(dto.getDeclareDate() == null ? "" : dto.getDeclareDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            switch (dto.getInspectStatus()) {
+                case 1:
+                    dto.setInspectStatusString("鍚堟牸");
+                    break;
+                case 2:
+                    dto.setInspectStatusString("涓嶅悎鏍�");
+                    // 鏌ヨ涓嶅悎鏍奸」
+                    List<String> unqualifiedList = insProductMapper.selectUnqualifiedList(dto.getEnterOrderId() == null ? dto.getQuarterOrderId() : dto.getEnterOrderId());
+                    dto.setUnqualifiedItem(CollUtil.join(unqualifiedList, ","));
+                    break;
+                case 3:
+                    dto.setInspectStatusString("鏈笅鍗�");
+                    break;
+                case 4:
+                    dto.setInspectStatusString("璁╂鏀捐");
+                    break;
+                case 0:
+                    dto.setInspectStatusString("妫�楠屼腑");
+                    break;
+
+            }
+        }
+
+
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
+        String fileName = URLEncoder.encode("鍘熸潗鏂欐娴嬩俊鎭鍑�", "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        try {
+            //鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            //鑾峰彇sheet0瀵硅薄
+            WriteSheet mainSheet = EasyExcel.writerSheet(0, "鍘熸潗鏂欐娴嬩俊鎭鍑�").head(IfsInventoryQuantitySupplierDto.class).build();
+
+            //鍚憇heet0鍐欏叆鏁版嵁 浼犲叆绌簂ist杩欐牱鍙鍑鸿〃澶�
+            excelWriter.write(ifsByOverList, mainSheet);
+            //鍏抽棴娴�
+            excelWriter.finish();
+        } catch (IOException e) {
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /**
+     * 鍘熸潗鏂欐煡璇㈠彲浠ュ搴︽楠岀殑鍐呭
+     * @param page
+     * @param ifsInventoryQuantityDto
+     * @return
+     */
+    @Override
+    public IPage<IfsInventoryQuantitySupplierDto> getIfsByQuarter(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) {
+
+        // todo: 鍙湅鎴�
+        String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
+        String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
+        ifsInventoryQuantityDto.setBeginDeclareDate(null);
+        ifsInventoryQuantityDto.setEndDeclareDate(null);
+
+        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