From e2fd03067d452c9288033f1e17b7cb0085cbbff4 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期五, 18 九月 2026 09:12:18 +0800
Subject: [PATCH] fix: 优化检查时间渲染格式,确保按yyyy-MM-dd输出

---
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java |  172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 164 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index 07f070e..98a9368 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -8,9 +8,15 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.deepoove.poi.XWPFTemplate;
 import com.deepoove.poi.config.Configure;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
+import com.deepoove.poi.data.TextRenderData;
+import com.deepoove.poi.policy.TextRenderPolicy;
+import com.deepoove.poi.template.run.RunTemplate;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.quality.dto.QualityInspectDto;
@@ -23,15 +29,25 @@
 import com.ruoyi.quality.service.IQualityInspectParamService;
 import com.ruoyi.quality.service.IQualityInspectService;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.stock.dto.StockInventoryDto;
+import com.ruoyi.stock.pojo.StockInRecord;
+import com.ruoyi.stock.service.StockInRecordService;
+import com.ruoyi.stock.service.StockInventoryService;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
+import org.apache.poi.xwpf.usermodel.XWPFRun;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.math.BigDecimal;
 import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -42,6 +58,8 @@
 public class QualityInspectServiceImpl extends ServiceImpl<QualityInspectMapper, QualityInspect> implements IQualityInspectService {
 
     private final StockUtils stockUtils;
+    private final StockInventoryService stockInventoryService;
+    private final StockInRecordService stockInRecordService;
     private QualityInspectMapper qualityInspectMapper;
 
     private IQualityInspectParamService qualityInspectParamService;
@@ -81,22 +99,146 @@
     @Override
     public int submit(QualityInspect inspect) {
         QualityInspect qualityInspect = qualityInspectMapper.selectById(inspect.getId());
-        /*鍒ゆ柇涓嶅悎鏍�*/
-        if (ObjectUtils.isNotNull(qualityInspect.getCheckResult()) && qualityInspect.getCheckResult().equals("涓嶅悎鏍�")) {
+        if (qualityInspect == null) {
+            throw new ServiceException("妫�楠屽崟涓嶅瓨鍦�");
+        }
+        //骞傜瓑锛氬凡鎻愪氦鐨勬楠屽崟涓嶅厑璁搁噸澶嶆彁浜わ紝闃叉閲嶅鐢熸垚鍏ュ簱/涓嶅悎鏍艰褰�
+        if (Integer.valueOf(1).equals(qualityInspect.getInspectState())) {
+            throw new ServiceException("妫�楠屽崟宸叉彁浜わ紝璇峰嬁閲嶅鎻愪氦");
+        }
+
+        //鎻愪氦鍓嶅繀椤诲垽鏂槸鍚﹀悎鏍�
+        if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
+            throw new ServiceException("璇峰厛鍒ゆ柇鏄惁鍚堟牸");
+        }
+
+        if (ObjectUtils.isNull(qualityInspect.getQualifiedQuantity())) {
+            throw new ServiceException("鍚堟牸鏁伴噺涓嶈兘涓虹┖");
+        }
+
+        if (ObjectUtils.isNull(qualityInspect.getUnqualifiedQuantity())) {
+            throw new ServiceException("涓嶅悎鏍兼暟閲忎笉鑳戒负绌�");
+        }
+
+        // 濡傛灉鍚堟牸鏁伴噺涓虹┖锛岃涓�0
+        if (qualityInspect.getQualifiedQuantity() == null) {
+            qualityInspect.setQualifiedQuantity(BigDecimal.ZERO);
+        }
+
+        // 濡傛灉涓嶅悎鏍兼暟閲忎负绌猴紝璁句负0
+        if (qualityInspect.getUnqualifiedQuantity() == null) {
+            qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO);
+        }
+
+        //鏁伴噺涓�鑷存�э細鍚堟牸+涓嶅悎鏍� 涓嶅緱瓒呰繃妫�楠屾暟閲�
+        if (qualityInspect.getQuantity() != null
+                && qualityInspect.getQualifiedQuantity().add(qualityInspect.getUnqualifiedQuantity())
+                        .compareTo(qualityInspect.getQuantity()) > 0) {
+            throw new ServiceException("鍚堟牸鏁伴噺涓庝笉鍚堟牸鏁伴噺涔嬪拰涓嶈兘澶т簬妫�楠屾暟閲�");
+        }
+
+        // 鍚堟牸鐩存帴鍏ュ簱
+        if(qualityInspect.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0 && qualityInspect.getInspectType()!=1){
+            //浠呮坊鍔犲叆搴撹褰�
+            StockInventoryDto stockInventoryDto = new StockInventoryDto();
+            //濡傛灉鏄噰璐川妫�鍚堟牸鍏ュ簱閫夌敤CUSTOMIZATION_UNSTOCK_OUT,鍏朵綑鍚堟牸鍏ュ簱閫夌敤QUALITYINSPECT_STOCK_IN
+            stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()));
+            if (ObjectUtils.isNotEmpty(qualityInspect.getPurchaseLedgerId())){
+                stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
+            }
+            stockInventoryDto.setRecordId(qualityInspect.getId());
+            stockInventoryDto.setProductModelId(qualityInspect.getProductModelId());
+            stockInventoryDto.setQualitity(qualityInspect.getQualifiedQuantity());
+            if (qualityInspect.getCheckTime() != null) {
+                LocalDate stockCreateDate = DateUtils.toLocalDate(qualityInspect.getCheckTime()).plusDays(1);
+                stockInventoryDto.setCreateTime(LocalDateTime.of(stockCreateDate, java.time.LocalTime.MIDNIGHT));
+            }
+            stockInventoryDto.setBatchNo(resolveProductionBatchNo(
+                    qualityInspect.getProductMainId(),
+                    qualityInspect.getId(),
+                    qualityInspect.getProductModelId()));
+            stockInventoryService.addStockInRecordOnly(stockInventoryDto);
+        }
+        // 涓嶅悎鏍煎鐞�
+        if(qualityInspect.getUnqualifiedQuantity().compareTo(BigDecimal.ZERO) > 0){
             QualityUnqualified qualityUnqualified = new QualityUnqualified();
             BeanUtils.copyProperties(qualityInspect, qualityUnqualified);
             qualityUnqualified.setInspectState(0);//寰呭鐞�
+            qualityUnqualified.setQuantity(qualityInspect.getUnqualifiedQuantity());
+            qualityUnqualified.setProductModelId(qualityInspect.getProductModelId());
             List<QualityInspectParam> inspectParams = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId()));
             String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(","));
             qualityUnqualified.setDefectivePhenomena(text + "杩欎簺鎸囨爣涓瓨鍦ㄤ笉鍚堟牸");//涓嶅悎鏍肩幇璞�
             qualityUnqualified.setInspectId(qualityInspect.getId());
             qualityUnqualifiedMapper.insert(qualityUnqualified);
-        } else {
-            //鍚堟牸鐩存帴鍏ュ簱
-            stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId());
         }
+
         qualityInspect.setInspectState(1);//宸叉彁浜�
         return qualityInspectMapper.updateById(qualityInspect);
+    }
+
+    @Override
+    public R autoSubmit(Long id) {
+        if (id == null) {
+            return R.fail("妫�楠屽崟ID涓嶈兘涓虹┖");
+        }
+        QualityInspect qualityInspect = qualityInspectMapper.selectById(id);
+        if (qualityInspect == null) {
+            return R.fail("妫�楠屽崟涓嶅瓨鍦�");
+        }
+        if (Integer.valueOf(1).equals(qualityInspect.getInspectState())) {
+            return R.ok("妫�楠屽崟宸叉彁浜�");
+        }
+
+        if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
+            qualityInspect.setCheckResult("鍚堟牸");
+        }
+        if (ObjectUtils.isNull(qualityInspect.getQualifiedQuantity())) {
+            qualityInspect.setQualifiedQuantity(qualityInspect.getQuantity() == null ? BigDecimal.ZERO : qualityInspect.getQuantity());
+        }
+        if (ObjectUtils.isNull(qualityInspect.getUnqualifiedQuantity())) {
+            qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO);
+        }
+        qualityInspectMapper.updateById(qualityInspect);
+        int rows = submit(qualityInspect);
+        return rows > 0 ? R.ok("妫�楠屽崟鎻愪氦鎴愬姛") : R.fail("妫�楠屽崟鎻愪氦澶辫触");
+    }
+
+    private String resolveProductionBatchNo(Long productionProductMainId,
+                                            Long qualityInspectId,
+                                            Long productModelId) {
+        if (productModelId == null) {
+            return null;
+        }
+        if (productionProductMainId != null) {
+            StockInRecord productionRecord = stockInRecordService.getOne(
+                    Wrappers.<StockInRecord>lambdaQuery()
+                            .eq(StockInRecord::getRecordId, productionProductMainId)
+                            .eq(StockInRecord::getProductModelId, productModelId)
+                            .in(StockInRecord::getRecordType, Arrays.asList(
+                                    StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(),
+                                    StockInQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode()))
+                            .isNotNull(StockInRecord::getBatchNo)
+                            .orderByDesc(StockInRecord::getId)
+                            .last("limit 1"),
+                    false);
+            if (productionRecord != null) {
+                return productionRecord.getBatchNo();
+            }
+        }
+        if (qualityInspectId == null) {
+            return null;
+        }
+        StockInRecord inspectRecord = stockInRecordService.getOne(
+                Wrappers.<StockInRecord>lambdaQuery()
+                        .eq(StockInRecord::getRecordId, qualityInspectId)
+                        .eq(StockInRecord::getProductModelId, productModelId)
+                        .eq(StockInRecord::getRecordType, StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode())
+                        .isNotNull(StockInRecord::getBatchNo)
+                        .orderByDesc(StockInRecord::getId)
+                        .last("limit 1"),
+                false);
+        return inspectRecord == null ? null : inspectRecord.getBatchNo();
     }
 
     /*鐢熸垚妫�楠屾姤鍛�*/
@@ -122,8 +264,14 @@
             index++;
         }
         InputStream inputStream = this.getClass().getResourceAsStream("/static/report-template.docx");
+        //checkTime涓篋ate绫诲瀷锛岄粯璁ゆ覆鏌撶殑鏄痶oString锛團ri Sep 18 00:00:00 CST 2026锛夛紝杩欓噷鍗曠嫭鎸囧畾鎸墆yyy-MM-dd杈撳嚭
         Configure configure = Configure.builder()
                 .bind("paramList", new HackLoopTableRenderPolicy())
+                .bind("inspect.checkTime", (eleTemplate, data, xwpfTemplate) -> {
+                    XWPFRun run = ((RunTemplate) eleTemplate).getRun();
+                    String text = data == null ? "" : DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, (Date) data);
+                    TextRenderPolicy.Helper.renderTextRun(run, new TextRenderData(text));
+                })
                 .build();
         String finalInspectType = inspectType;
         XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
@@ -153,6 +301,14 @@
 
     @Override
     public int updateQualityInspect(QualityInspectDto qualityInspectDto) {
+        QualityInspect exist = qualityInspectMapper.selectById(qualityInspectDto.getId());
+        if (exist == null) {
+            throw new ServiceException("妫�楠屽崟涓嶅瓨鍦�");
+        }
+        //宸叉彁浜ょ殑妫�楠屽崟宸茶仈鍔ㄥ叆搴�/涓嶅悎鏍艰褰曪紝绂佹鍐嶄慨鏀�
+        if (Integer.valueOf(1).equals(exist.getInspectState())) {
+            throw new ServiceException("妫�楠屽崟宸叉彁浜わ紝涓嶅厑璁镐慨鏀�");
+        }
         if (ObjectUtils.isNotNull(qualityInspectDto.getQualityInspectParams())) {
             qualityInspectParamService.remove(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, qualityInspectDto.getId()));
             for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) {
@@ -166,7 +322,7 @@
     }
 
     @Override
-    public IPage<QualityInspect> qualityInspectListPage(Page page, QualityInspect qualityInspect) {
+    public IPage<QualityInspectDto> qualityInspectListPage(Page page, QualityInspectDto qualityInspect) {
         return qualityInspectMapper.qualityInspectListPage(page, qualityInspect);
     }
 

--
Gitblit v1.9.3