From 15fe19f4afa3bd506261c4c60e8685d7279f5438 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期五, 08 八月 2025 14:17:36 +0800
Subject: [PATCH] 财务管理模块--报表调整+质量模块调整(展示检验项,生成报告,与不合格进行关联)

---
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java   |  180 ++++++++++++++---
 src/main/resources/static/report-template.docx                                |    0 
 src/main/java/com/ruoyi/account/service/AccountExpenseService.java            |    5 
 src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java |   11 +
 src/main/resources/mapper/account/AccountExpenseMapper.xml                    |   14 +
 src/main/java/com/ruoyi/quality/service/IQualityInspectService.java           |   11 
 src/main/resources/mapper/account/AccountIncomeMapper.xml                     |   13 +
 src/main/java/com/ruoyi/account/mapper/AccountExpenseMapper.java              |    1 
 src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java   |   43 ++-
 pom.xml                                                                       |    9 
 src/main/java/com/ruoyi/quality/pojo/QualityInspect.java                      |    5 
 src/main/java/com/ruoyi/common/utils/HackLoopTableRenderPolicy.java           |  154 +++++++++++++++
 src/main/java/com/ruoyi/quality/controller/QualityInspectController.java      |   33 ++
 src/main/java/com/ruoyi/account/mapper/AccountIncomeMapper.java               |    1 
 src/main/java/com/ruoyi/account/dto/AccountDto3.java                          |   21 +
 src/main/java/com/ruoyi/quality/pojo/QualityInspectParam.java                 |    4 
 src/main/java/com/ruoyi/account/service/AccountIncomeService.java             |    5 
 src/main/java/com/ruoyi/account/service/impl/AccountIncomeServiceImpl.java    |   46 ++--
 src/main/java/com/ruoyi/quality/dto/QualityInspectDto.java                    |   26 ++
 19 files changed, 486 insertions(+), 96 deletions(-)

diff --git a/pom.xml b/pom.xml
index 5518a5e..c802315 100644
--- a/pom.xml
+++ b/pom.xml
@@ -224,6 +224,7 @@
             <version>${poi.version}</version>
         </dependency>
 
+
         <!-- velocity浠g爜鐢熸垚浣跨敤妯℃澘 -->
         <dependency>
             <groupId>org.apache.velocity</groupId>
@@ -282,6 +283,12 @@
             <version>${okhttp.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.deepoove</groupId>
+            <artifactId>poi-tl</artifactId>
+            <version>1.12.2</version>
+        </dependency>
+
     </dependencies>
 
 	<build>
@@ -322,4 +329,4 @@
 	    </pluginRepository>
 	</pluginRepositories>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/src/main/java/com/ruoyi/account/dto/AccountDto3.java b/src/main/java/com/ruoyi/account/dto/AccountDto3.java
index 4792b65..33b4b8e 100644
--- a/src/main/java/com/ruoyi/account/dto/AccountDto3.java
+++ b/src/main/java/com/ruoyi/account/dto/AccountDto3.java
@@ -4,12 +4,10 @@
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 /**
- * 璐㈠姟绠$悊--璐㈠姟鎶ヨ〃骞存煡璇�
+ * 璐㈠姟绠$悊--璐㈠姟鎶ヨ〃(绫诲瀷)
  */
 
 @Data
@@ -17,14 +15,23 @@
 
 
     /**
-     * 鏈堜唤
+     * 绫诲瀷
      */
-    private  List<String> month;
+    private String typeName;
+
 
     /**
-     * 鍚勭被鍨嬮噾棰�
+     * 鐧惧垎鍗犳瘮
      */
-    private Map<String, List<AccountDto2>> accountType;
+    private BigDecimal proportion;
+
+
+
+    /**
+     * 閲戦
+     */
+    private List<BigDecimal> account;
+
 
 
 
diff --git a/src/main/java/com/ruoyi/account/mapper/AccountExpenseMapper.java b/src/main/java/com/ruoyi/account/mapper/AccountExpenseMapper.java
index b534736..8b6a644 100644
--- a/src/main/java/com/ruoyi/account/mapper/AccountExpenseMapper.java
+++ b/src/main/java/com/ruoyi/account/mapper/AccountExpenseMapper.java
@@ -23,4 +23,5 @@
 
 
     List<AccountDto2> report(@Param("dateQueryDto") DateQueryDto dateQueryDto);
+    BigDecimal report1(@Param("dateQueryDto") DateQueryDto dateQueryDto, @Param("dictValue") String dictValue);
 }
diff --git a/src/main/java/com/ruoyi/account/mapper/AccountIncomeMapper.java b/src/main/java/com/ruoyi/account/mapper/AccountIncomeMapper.java
index 1d4db3d..76a3c55 100644
--- a/src/main/java/com/ruoyi/account/mapper/AccountIncomeMapper.java
+++ b/src/main/java/com/ruoyi/account/mapper/AccountIncomeMapper.java
@@ -22,4 +22,5 @@
     List<AccountIncome> accountIncomeExport(@Param("accountIncome") AccountIncome accountIncome);
 
     List<AccountDto2> report(@Param("dateQueryDto") DateQueryDto dateQueryDto);
+    BigDecimal report1(@Param("dateQueryDto") DateQueryDto dateQueryDto, @Param("dictValue") String dictValue);
 }
diff --git a/src/main/java/com/ruoyi/account/service/AccountExpenseService.java b/src/main/java/com/ruoyi/account/service/AccountExpenseService.java
index 8f67074..71fd214 100644
--- a/src/main/java/com/ruoyi/account/service/AccountExpenseService.java
+++ b/src/main/java/com/ruoyi/account/service/AccountExpenseService.java
@@ -4,12 +4,13 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.account.dto.AccountDto;
+import com.ruoyi.account.dto.AccountDto2;
 import com.ruoyi.account.dto.AccountDto3;
 import com.ruoyi.account.pojo.AccountExpense;
-import com.ruoyi.account.pojo.AccountIncome;
 import com.ruoyi.dto.DateQueryDto;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 public interface AccountExpenseService extends IService<AccountExpense> {
 
@@ -19,5 +20,5 @@
 
     AccountDto report(DateQueryDto dateQueryDto);
 
-    AccountDto3 reportExpense();
+    List<AccountDto3> reportExpense();
 }
diff --git a/src/main/java/com/ruoyi/account/service/AccountIncomeService.java b/src/main/java/com/ruoyi/account/service/AccountIncomeService.java
index 8c128a8..fc30cda 100644
--- a/src/main/java/com/ruoyi/account/service/AccountIncomeService.java
+++ b/src/main/java/com/ruoyi/account/service/AccountIncomeService.java
@@ -3,11 +3,12 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.account.dto.AccountDto2;
 import com.ruoyi.account.dto.AccountDto3;
-import com.ruoyi.account.pojo.AccountFile;
 import com.ruoyi.account.pojo.AccountIncome;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 public interface AccountIncomeService extends IService<AccountIncome> {
 
@@ -16,5 +17,5 @@
 
     void accountIncomeExport(HttpServletResponse response, AccountIncome accountIncome);
 
-    AccountDto3 reportIncome();
+    List<AccountDto3> reportIncome();
 }
diff --git a/src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java
index 7871fb4..37c2f7c 100644
--- a/src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java
+++ b/src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java
@@ -9,14 +9,14 @@
 import com.ruoyi.account.dto.AccountDto2;
 import com.ruoyi.account.dto.AccountDto3;
 import com.ruoyi.account.mapper.AccountExpenseMapper;
-import com.ruoyi.account.mapper.AccountFileMapper;
 import com.ruoyi.account.mapper.AccountIncomeMapper;
 import com.ruoyi.account.pojo.AccountExpense;
 import com.ruoyi.account.pojo.AccountIncome;
 import com.ruoyi.account.service.AccountExpenseService;
-import com.ruoyi.account.service.AccountIncomeService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.dto.DateQueryDto;
+import com.ruoyi.project.system.domain.SysDictData;
+import com.ruoyi.project.system.mapper.SysDictDataMapper;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
@@ -36,6 +36,8 @@
     private AccountExpenseMapper accountExpenseMapper;
 
     private AccountIncomeMapper accountIncomeMapper;
+
+    private SysDictDataMapper sysDictDataMapper;
 
 
     //鍒嗛〉鏌ヨ
@@ -88,26 +90,29 @@
 
     //璐㈠姟鎶ヨ〃骞存煡璇�
     @Override
-    public AccountDto3 reportExpense() {
-        AccountDto3 accountDto3 = new AccountDto3();
+    public  List<AccountDto3> reportExpense() {
+        List<AccountDto3> accountDto3s = new ArrayList<>();
+        //鍏堟煡璇㈡敹鍏ョ被鍨嬫湁鍝簺
+        List<SysDictData> incomeTypes = sysDictDataMapper.selectDictDataByType("expense_types");
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         int currentYear = LocalDate.now().getYear(); // 鑾峰彇褰撳墠骞翠唤锛堝2025锛�
-        List<String> months = new ArrayList<>();
-        Map<String, List<AccountDto2>> map = new HashMap<>();
-        for (int i = 1; i <= 12; i++) {
-            months.add(i + "鏈�");
-            // 褰撴湀绗竴澶╋細骞翠唤涓哄綋鍓嶅勾锛屾湀浠戒负i锛屾棩鏈熶负1
-            LocalDate firstDay = LocalDate.of(currentYear, i, 1);
-            DateQueryDto dateQueryDto = new DateQueryDto();
-            dateQueryDto.setEntryDateStart(firstDay.format(formatter));
-            // 褰撴湀鏈�鍚庝竴澶╋細绗竴澶╃殑鏈堜唤鐨勬渶鍚庝竴澶�
-            dateQueryDto.setEntryDateEnd(firstDay.plusMonths(1).minusDays(1).format(formatter));
-            List<AccountDto2> report = accountExpenseMapper.report(dateQueryDto);
-            map.put(i + "鏈�",report);
+        for (SysDictData incomeType : incomeTypes) {
+            AccountDto3 accountDto3 = new AccountDto3();
+            accountDto3.setTypeName(incomeType.getDictLabel());//绫诲瀷
+            List<BigDecimal> account=new ArrayList<>();
+            for (int i = 1; i <= 12; i++) {
+                // 褰撴湀绗竴澶╋細骞翠唤涓哄綋鍓嶅勾锛屾湀浠戒负i锛屾棩鏈熶负1
+                LocalDate firstDay = LocalDate.of(currentYear, i, 1);
+                DateQueryDto dateQueryDto = new DateQueryDto();
+                dateQueryDto.setEntryDateStart(firstDay.format(formatter));
+                // 褰撴湀鏈�鍚庝竴澶╋細绗竴澶╃殑鏈堜唤鐨勬渶鍚庝竴澶�
+                dateQueryDto.setEntryDateEnd(firstDay.plusMonths(1).minusDays(1).format(formatter));
+                account.add(accountExpenseMapper.report1(dateQueryDto,incomeType.getDictValue()));
+            }
+            accountDto3.setAccount(account);//绫诲瀷
+            accountDto3s.add(accountDto3);
         }
-        accountDto3.setMonth(months);
-        accountDto3.setAccountType(map);
-        return accountDto3;
+        return accountDto3s;
     }
 
 
diff --git a/src/main/java/com/ruoyi/account/service/impl/AccountIncomeServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/AccountIncomeServiceImpl.java
index 0439103..66fb6e4 100644
--- a/src/main/java/com/ruoyi/account/service/impl/AccountIncomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/account/service/impl/AccountIncomeServiceImpl.java
@@ -6,19 +6,18 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.account.dto.AccountDto2;
 import com.ruoyi.account.dto.AccountDto3;
-import com.ruoyi.account.mapper.AccountFileMapper;
 import com.ruoyi.account.mapper.AccountIncomeMapper;
-import com.ruoyi.account.pojo.AccountFile;
 import com.ruoyi.account.pojo.AccountIncome;
-import com.ruoyi.account.service.AccountFileService;
 import com.ruoyi.account.service.AccountIncomeService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.dto.DateQueryDto;
-import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.project.system.domain.SysDictData;
+import com.ruoyi.project.system.mapper.SysDictDataMapper;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
@@ -31,6 +30,8 @@
 public class AccountIncomeServiceImpl extends ServiceImpl<AccountIncomeMapper, AccountIncome> implements AccountIncomeService {
 
     private AccountIncomeMapper accountIncomeMapper;
+
+    private SysDictDataMapper sysDictDataMapper;
 
 
     //鍒嗛〉鏌ヨ
@@ -49,25 +50,28 @@
 
     //璐㈠姟鎶ヨ〃骞存煡璇�
     @Override
-    public AccountDto3 reportIncome() {
-        AccountDto3 accountDto3 = new AccountDto3();
+    public List<AccountDto3> reportIncome() {
+        List<AccountDto3> accountDto3s = new ArrayList<>();
+        //鍏堟煡璇㈡敹鍏ョ被鍨嬫湁鍝簺
+        List<SysDictData> incomeTypes = sysDictDataMapper.selectDictDataByType("income_types");
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         int currentYear = LocalDate.now().getYear(); // 鑾峰彇褰撳墠骞翠唤锛堝2025锛�
-        List<String> months = new ArrayList<>();
-        Map<String, List<AccountDto2>> map = new HashMap<>();
-        for (int i = 1; i <= 12; i++) {
-            months.add(i + "鏈�");
-            // 褰撴湀绗竴澶╋細骞翠唤涓哄綋鍓嶅勾锛屾湀浠戒负i锛屾棩鏈熶负1
-            LocalDate firstDay = LocalDate.of(currentYear, i, 1);
-            DateQueryDto dateQueryDto = new DateQueryDto();
-            dateQueryDto.setEntryDateStart(firstDay.format(formatter));
-            // 褰撴湀鏈�鍚庝竴澶╋細绗竴澶╃殑鏈堜唤鐨勬渶鍚庝竴澶�
-            dateQueryDto.setEntryDateEnd(firstDay.plusMonths(1).minusDays(1).format(formatter));
-            List<AccountDto2> report = accountIncomeMapper.report(dateQueryDto);
-            map.put(i + "鏈�",report);
+        for (SysDictData incomeType : incomeTypes) {
+            AccountDto3 accountDto3 = new AccountDto3();
+            accountDto3.setTypeName(incomeType.getDictLabel());//绫诲瀷
+            List<BigDecimal> account=new ArrayList<>();
+            for (int i = 1; i <= 12; i++) {
+                // 褰撴湀绗竴澶╋細骞翠唤涓哄綋鍓嶅勾锛屾湀浠戒负i锛屾棩鏈熶负1
+                LocalDate firstDay = LocalDate.of(currentYear, i, 1);
+                DateQueryDto dateQueryDto = new DateQueryDto();
+                dateQueryDto.setEntryDateStart(firstDay.format(formatter));
+                // 褰撴湀鏈�鍚庝竴澶╋細绗竴澶╃殑鏈堜唤鐨勬渶鍚庝竴澶�
+                dateQueryDto.setEntryDateEnd(firstDay.plusMonths(1).minusDays(1).format(formatter));
+                account.add(accountIncomeMapper.report1(dateQueryDto,incomeType.getDictValue()));
+            }
+            accountDto3.setAccount(account);//绫诲瀷
+            accountDto3s.add(accountDto3);
         }
-        accountDto3.setMonth(months);
-        accountDto3.setAccountType(map);
-        return accountDto3;
+        return accountDto3s;
     }
 }
diff --git a/src/main/java/com/ruoyi/common/utils/HackLoopTableRenderPolicy.java b/src/main/java/com/ruoyi/common/utils/HackLoopTableRenderPolicy.java
new file mode 100644
index 0000000..4bb0daa
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/utils/HackLoopTableRenderPolicy.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2014-2020 Sayi
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.ruoyi.common.utils;
+
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.exception.RenderException;
+import com.deepoove.poi.policy.RenderPolicy;
+import com.deepoove.poi.render.compute.RenderDataCompute;
+import com.deepoove.poi.render.processor.DocumentProcessor;
+import com.deepoove.poi.resolver.TemplateResolver;
+import com.deepoove.poi.template.ElementTemplate;
+import com.deepoove.poi.template.MetaTemplate;
+import com.deepoove.poi.template.run.RunTemplate;
+import com.deepoove.poi.util.ReflectionUtils;
+import com.deepoove.poi.util.TableTools;
+import org.apache.poi.xwpf.usermodel.*;
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlObject;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Hack for loop table row
+ *
+ * @author
+ *
+ */
+public class HackLoopTableRenderPolicy implements RenderPolicy {
+
+    private String prefix;
+    private String suffix;
+    private boolean onSameLine;
+
+    public HackLoopTableRenderPolicy() {
+        this(false);
+    }
+
+    public HackLoopTableRenderPolicy(boolean onSameLine) {
+        this("[", "]", onSameLine);
+    }
+
+    public HackLoopTableRenderPolicy(String prefix, String suffix) {
+        this(prefix, suffix, false);
+    }
+
+    public HackLoopTableRenderPolicy(String prefix, String suffix, boolean onSameLine) {
+        this.prefix = prefix;
+        this.suffix = suffix;
+        this.onSameLine = onSameLine;
+    }
+
+    @Override
+    public void render(ElementTemplate eleTemplate, Object data, XWPFTemplate template) {
+        RunTemplate runTemplate = (RunTemplate) eleTemplate;
+        XWPFRun run = runTemplate.getRun();
+        try {
+            if (!TableTools.isInsideTable(run)) {
+                throw new IllegalStateException(
+                        "The template tag " + runTemplate.getSource() + " must be inside a table");
+            }
+            XWPFTableCell tagCell = (XWPFTableCell) ((XWPFParagraph) run.getParent()).getBody();
+            XWPFTable table = tagCell.getTableRow().getTable();
+            run.setText("", 0);
+
+            int templateRowIndex = getTemplateRowIndex(tagCell);
+            if (null != data && data instanceof Iterable) {
+                Iterator<?> iterator = ((Iterable<?>) data).iterator();
+                XWPFTableRow templateRow = table.getRow(templateRowIndex);
+                int insertPosition = templateRowIndex;
+
+                TemplateResolver resolver = new TemplateResolver(template.getConfig().copy(prefix, suffix));
+                boolean firstFlag = true;
+                while (iterator.hasNext()) {
+                    insertPosition = templateRowIndex++;
+                    XWPFTableRow nextRow = table.insertNewTableRow(insertPosition);
+                    setTableRow(table, templateRow, insertPosition);
+
+                    // double set row
+                    XmlCursor newCursor = templateRow.getCtRow().newCursor();
+                    newCursor.toPrevSibling();
+                    XmlObject object = newCursor.getObject();
+                    nextRow = new XWPFTableRow((CTRow) object, table);
+                    if (!firstFlag) {
+                        // update VMerge cells for non-first row
+                        List<XWPFTableCell> tableCells = nextRow.getTableCells();
+                        for (XWPFTableCell cell : tableCells) {
+                            CTTcPr tcPr = TableTools.getTcPr(cell);
+                            CTVMerge vMerge = tcPr.getVMerge();
+                            if (null == vMerge) continue;
+                            if (STMerge.RESTART == vMerge.getVal()) {
+                                vMerge.setVal(STMerge.CONTINUE);
+                            }
+                        }
+                    } else {
+                        firstFlag = false;
+                    }
+                    setTableRow(table, nextRow, insertPosition);
+
+                    RenderDataCompute dataCompute = template.getConfig().getRenderDataComputeFactory()
+                            .newCompute(iterator.next());
+                    List<XWPFTableCell> cells = nextRow.getTableCells();
+                    cells.forEach(cell -> {
+                        List<MetaTemplate> templates = resolver.resolveBodyElements(cell.getBodyElements());
+                        new DocumentProcessor(template, resolver, dataCompute).process(templates);
+                    });
+                }
+            }
+
+            table.removeRow(templateRowIndex);
+            afterloop(table, data);
+        } catch (Exception e) {
+            throw new RenderException("HackLoopTable for " + eleTemplate + "error: " + e.getMessage(), e);
+        }
+    }
+
+    private int getTemplateRowIndex(XWPFTableCell tagCell) {
+        XWPFTableRow tagRow = tagCell.getTableRow();
+        return onSameLine ? getRowIndex(tagRow) : (getRowIndex(tagRow) + 1);
+    }
+
+    protected void afterloop(XWPFTable table, Object data) {
+    }
+
+    @SuppressWarnings("unchecked")
+    private void setTableRow(XWPFTable table, XWPFTableRow templateRow, int pos) {
+        List<XWPFTableRow> rows = (List<XWPFTableRow>) ReflectionUtils.getValue("tableRows", table);
+        rows.set(pos, templateRow);
+        table.getCTTbl().setTrArray(pos, templateRow.getCtRow());
+    }
+
+    private int getRowIndex(XWPFTableRow row) {
+        List<XWPFTableRow> rows = row.getTable().getRows();
+        return rows.indexOf(row);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
index 717044e..0daeba8 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.quality.dto.QualityInspectDto;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityInspectFile;
 import com.ruoyi.quality.pojo.QualityInspectParam;
@@ -37,12 +38,12 @@
 
     /**
      * 鏂板
-     * @param qualityInspect
+     * @param qualityInspectDto
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody QualityInspect qualityInspect) {
-        return AjaxResult.success(qualityInspectService.add(qualityInspect));
+    public AjaxResult add(@RequestBody QualityInspectDto qualityInspectDto) {
+        return AjaxResult.success(qualityInspectService.add(qualityInspectDto));
     }
 
     /**
@@ -72,17 +73,17 @@
      */
     @GetMapping("/{id}")
     public AjaxResult QualityInspectDetail(@PathVariable("id") Integer id) {
-        return AjaxResult.success(qualityInspectService.getById(id));
+        return AjaxResult.success(qualityInspectService.getDetailById(id));
     }
 
     /**
      * 淇敼
-     * @param qualityInspect
+     * @param qualityInspectDto
      * @return
      */
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody QualityInspect qualityInspect) {
-        return AjaxResult.success(qualityInspectService.updateQualityInspect(qualityInspect));
+    public AjaxResult update(@RequestBody QualityInspectDto qualityInspectDto) {
+        return AjaxResult.success(qualityInspectService.updateQualityInspect(qualityInspectDto));
     }
 
     /**
@@ -106,5 +107,23 @@
         qualityInspectService.qualityInspectExport(response, qualityInspect);
     }
 
+    /**
+     * 鎻愪氦
+     * @param id
+     * @return
+     */
+    @PostMapping("/submit")
+    public AjaxResult submit(Integer id) {
+        return AjaxResult.success(qualityInspectService.submit(id));
+    }
 
+    /**
+     * 涓嬭浇
+     * @param response
+     * @param id
+     */
+    @PostMapping("/down")
+    public void down(HttpServletResponse response,Integer id) {
+        qualityInspectService.down(response, id);
+    }
 }
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java b/src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java
index 47701e2..5a47d92 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java
@@ -1,5 +1,6 @@
 package com.ruoyi.quality.controller;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.quality.pojo.QualityTestStandard;
@@ -89,5 +90,15 @@
         qualityTestStandardService.qualityTestStandardListPageExport(response, qualityTestStandard);
     }
 
+    /**
+     * 璇︽儏
+     * @param productId
+     * @return
+     */
+    @GetMapping("/{productId}")
+    public AjaxResult QualityInspectDetail(@PathVariable("productId") Integer productId) {
+        return AjaxResult.success(qualityTestStandardService.list(Wrappers.<QualityTestStandard>lambdaQuery().eq(QualityTestStandard::getProductId,productId)));
+    }
+
 
 }
diff --git a/src/main/java/com/ruoyi/quality/dto/QualityInspectDto.java b/src/main/java/com/ruoyi/quality/dto/QualityInspectDto.java
new file mode 100644
index 0000000..9bd4ca9
--- /dev/null
+++ b/src/main/java/com/ruoyi/quality/dto/QualityInspectDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.quality.dto;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.dto.DateQueryDto;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.quality.pojo.QualityInspectParam;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+
+//璐ㄩ噺妫�楠屾柊澧炵紪杈戝弬鏁�
+@Data
+public class QualityInspectDto extends QualityInspect implements Serializable {
+
+    //妫�楠岄」鐩�
+    private List<QualityInspectParam> qualityInspectParams;
+
+}
diff --git a/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java b/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
index 5aa0219..e1b2e6a 100644
--- a/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
+++ b/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -133,5 +133,10 @@
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
 
+    /**
+     * 绫诲埆(0:鏈彁浜�;1:宸叉彁浜�)
+     */
+    private Integer inspectState;
+
 
 }
diff --git a/src/main/java/com/ruoyi/quality/pojo/QualityInspectParam.java b/src/main/java/com/ruoyi/quality/pojo/QualityInspectParam.java
index 6d7bc97..91092d2 100644
--- a/src/main/java/com/ruoyi/quality/pojo/QualityInspectParam.java
+++ b/src/main/java/com/ruoyi/quality/pojo/QualityInspectParam.java
@@ -84,5 +84,9 @@
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
 
+    // 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    private Integer index;
+
 
 }
diff --git a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
index 73396a4..1dcba08 100644
--- a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
+++ b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.quality.dto.QualityInspectDto;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
 import com.ruoyi.staff.pojo.StaffOnJob;
@@ -13,11 +14,17 @@
 public interface IQualityInspectService extends IService<QualityInspect> {
 
 
-    int add(QualityInspect qualityInspect);
+    int add(QualityInspectDto qualityInspectDto);
 
-    int updateQualityInspect(QualityInspect qualityInspect);
+    int updateQualityInspect(QualityInspectDto qualityInspectDto);
 
     IPage<QualityInspect> qualityInspectListPage(Page page, QualityInspect qualityInspect);
 
     void qualityInspectExport(HttpServletResponse response, QualityInspect qualityInspect);
+
+    QualityInspectDto getDetailById(Integer id);
+
+    int submit(Integer id);
+
+    void down(HttpServletResponse response, Integer id);
 }
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 22055fc..b2633a8 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -2,17 +2,25 @@
 
 
 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
 import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.quality.dto.QualityInspectDto;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.quality.mapper.QualityInspectParamMapper;
 import com.ruoyi.quality.mapper.QualityTestStandardMapper;
+import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityInspectParam;
 import com.ruoyi.quality.pojo.QualityTestStandard;
+import com.ruoyi.quality.pojo.QualityUnqualified;
 import com.ruoyi.quality.service.IQualityInspectParamService;
 import com.ruoyi.quality.service.IQualityInspectService;
 import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper;
@@ -26,6 +34,10 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.HashMap;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -40,48 +52,144 @@
 
     private QualityTestStandardMapper qualityTestStandardMapper;
 
+    private QualityUnqualifiedMapper qualityUnqualifiedMapper;
+
     @Override
-    public int add(QualityInspect qualityInspect) {
-        String[] ignoreProperties = {"id"};//鎺掗櫎id灞炴��
-        //鏍规嵁浜у搧id鏌ヨ鎸囨爣缁存姢瀵瑰簲鏂板妫�楠屽弬鏁�
-        List<QualityTestStandard> qualityTestStandards = qualityTestStandardMapper.selectList(Wrappers.<QualityTestStandard>lambdaQuery()
-                .eq(QualityTestStandard::getProductId, qualityInspect.getProductId()));
-        if (qualityTestStandards.size()>0){
-            qualityInspectMapper.insert(qualityInspect);
-            List<QualityInspectParam> qualityInspectParams = qualityTestStandards.stream().map(qualityTestStandard -> {
-                QualityInspectParam qualityInspectParam = new QualityInspectParam();
-                BeanUtils.copyProperties(qualityTestStandard, qualityInspectParam,ignoreProperties);
-                qualityInspectParam.setInspectId(qualityInspect.getId());
-                return qualityInspectParam;
-            }).collect(Collectors.toList());
-            qualityInspectParamService.saveBatch(qualityInspectParams);
-        }else{
-            throw new BaseException("璇ヤ骇鍝佹病鏈夌淮鎶ゆ楠屾寚鏍�,璇锋鏌�!!!!!!!!");
+    public int add(QualityInspectDto qualityInspectDto) {
+        QualityInspect qualityInspect = new QualityInspect();
+        BeanUtils.copyProperties(qualityInspectDto,qualityInspect);
+        qualityInspect.setInspectState(0);//榛樿鏈彁浜�
+        qualityInspectMapper.insert(qualityInspect);
+        for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) {
+            qualityInspectParam.setInspectId(qualityInspect.getId());
         }
+        qualityInspectParamService.saveBatch(qualityInspectDto.getQualityInspectParams());
+//        String[] ignoreProperties = {"id"};//鎺掗櫎id灞炴��
+//        //鏍规嵁浜у搧id鏌ヨ鎸囨爣缁存姢瀵瑰簲鏂板妫�楠屽弬鏁�
+//        List<QualityTestStandard> qualityTestStandards = qualityTestStandardMapper.selectList(Wrappers.<QualityTestStandard>lambdaQuery()
+//                .eq(QualityTestStandard::getProductId, qualityInspect.getProductId()));
+//        if (qualityTestStandards.size()>0){
+//
+//            List<QualityInspectParam> qualityInspectParams = qualityTestStandards.stream().map(qualityTestStandard -> {
+//                QualityInspectParam qualityInspectParam = new QualityInspectParam();
+//                BeanUtils.copyProperties(qualityTestStandard, qualityInspectParam,ignoreProperties);
+//                qualityInspectParam.setInspectId(qualityInspect.getId());
+//                return qualityInspectParam;
+//            }).collect(Collectors.toList());
+//            qualityInspectParamService.saveBatch(qualityInspectParams);
+//        }else{
+//            throw new BaseException("璇ヤ骇鍝佹病鏈夌淮鎶ゆ楠屾寚鏍�,璇锋鏌�!!!!!!!!");
+//        }
         return 0;
     }
 
     @Override
-    public int updateQualityInspect(QualityInspect qualityInspect) {
-        String[] ignoreProperties = {"id"};//鎺掗櫎id灞炴��
-        //鍏堝垹闄ゆ墍鏈夋楠屽弬鏁板啀鏂板
-        qualityInspectParamService.remove(Wrappers.<QualityInspectParam>lambdaQuery()
-                .eq(QualityInspectParam::getInspectId,qualityInspect.getId()));
-        //鏍规嵁浜у搧id鏌ヨ鎸囨爣缁存姢瀵瑰簲鏂板妫�楠屽弬鏁�
-        List<QualityTestStandard> qualityTestStandards = qualityTestStandardMapper.selectList(Wrappers.<QualityTestStandard>lambdaQuery()
-                .eq(QualityTestStandard::getProductId, qualityInspect.getProductId()));
-        if (qualityTestStandards.size()>0){
-            List<QualityInspectParam> qualityInspectParams = qualityTestStandards.stream().map(qualityTestStandard -> {
-                QualityInspectParam qualityInspectParam = new QualityInspectParam();
-                BeanUtils.copyProperties(qualityTestStandard, qualityInspectParam,ignoreProperties);
-                qualityInspectParam.setInspectId(qualityInspect.getId());
-                return qualityInspectParam;
-            }).collect(Collectors.toList());
-            qualityInspectParamService.saveBatch(qualityInspectParams);
-        }else{
-            throw new BaseException("璇ヤ骇鍝佹病鏈夌淮鎶ゆ楠屾寚鏍�,璇锋鏌�!!!!!!!!");
+    public QualityInspectDto getDetailById(Integer id) {
+        QualityInspect qualityInspect = qualityInspectMapper.selectById(id);
+        List<QualityInspectParam> qualityInspectParams = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, id));
+        QualityInspectDto qualityInspectDto = new QualityInspectDto();
+        BeanUtils.copyProperties(qualityInspect,qualityInspectDto);
+        qualityInspectDto.setQualityInspectParams(qualityInspectParams);
+        return qualityInspectDto;
+    }
+
+    //鎻愪氦
+    @Override
+    public int submit(Integer id) {
+        QualityInspect qualityInspect = qualityInspectMapper.selectById(id);
+        /*鍒ゆ柇涓嶅悎鏍�*/
+        if (ObjectUtils.isNotNull(qualityInspect.getCheckResult()) && qualityInspect.getCheckResult().equals("涓嶅悎鏍�")){
+            QualityUnqualified qualityUnqualified = new QualityUnqualified();
+            BeanUtils.copyProperties(qualityInspect,qualityUnqualified);
+            qualityUnqualified.setInspectState(0);//寰呭鐞�
+            List<QualityInspectParam> inspectParams = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, id));
+            String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(","));
+            qualityUnqualified.setDefectivePhenomena(text+"杩欎簺鎸囨爣涓瓨鍦ㄤ笉鍚堟牸");//涓嶅悎鏍肩幇璞�
+            qualityUnqualifiedMapper.insert(qualityUnqualified);
         }
-        return  qualityInspectMapper.updateById(qualityInspect);
+        qualityInspect.setInspectState(1);//宸叉彁浜�
+        return qualityInspectMapper.updateById(qualityInspect);
+    }
+
+    /*鐢熸垚妫�楠屾姤鍛�*/
+    @Override
+    public void down(HttpServletResponse response, Integer id) {
+        QualityInspect inspect = qualityInspectMapper.selectById(id);
+        String inspectType="";
+        switch (inspect.getInspectType()){
+            case 0:
+                inspectType="鍘熸潗鏂欐楠�";
+                break;
+            case 1:
+                inspectType="杩囩▼妫�楠�";
+                break;
+            case 2:
+                inspectType="鍑哄巶妫�楠�";
+                break;
+        }
+        List<QualityInspectParam> paramList = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, id));
+        int index = 1;
+        for (QualityInspectParam detail : paramList) {
+            detail.setIndex(index);
+            index++;
+        }
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/report-template.docx");
+        Configure configure = Configure.builder()
+                .bind("paramList", new HackLoopTableRenderPolicy())
+                .build();
+        String finalInspectType = inspectType;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("inspect", inspect);
+                    put("inspectType", finalInspectType);
+                    put("paramList", paramList);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "妫�楠屾姤鍛�", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    @Override
+    public int updateQualityInspect(QualityInspectDto qualityInspectDto) {
+        if (qualityInspectDto.getQualityInspectParams().size()>0) {
+            qualityInspectParamService.updateBatchById(qualityInspectDto.getQualityInspectParams());
+        }
+        QualityInspect qualityInspect = new QualityInspect();
+        BeanUtils.copyProperties(qualityInspectDto,qualityInspect);
+        return qualityInspectMapper.updateById(qualityInspect);
+
+//        String[] ignoreProperties = {"id"};//鎺掗櫎id灞炴��
+//        //鍏堝垹闄ゆ墍鏈夋楠屽弬鏁板啀鏂板
+//        qualityInspectParamService.remove(Wrappers.<QualityInspectParam>lambdaQuery()
+//                .eq(QualityInspectParam::getInspectId,qualityInspect.getId()));
+//        //鏍规嵁浜у搧id鏌ヨ鎸囨爣缁存姢瀵瑰簲鏂板妫�楠屽弬鏁�
+//        List<QualityTestStandard> qualityTestStandards = qualityTestStandardMapper.selectList(Wrappers.<QualityTestStandard>lambdaQuery()
+//                .eq(QualityTestStandard::getProductId, qualityInspect.getProductId()));
+//        if (qualityTestStandards.size()>0){
+//            List<QualityInspectParam> qualityInspectParams = qualityTestStandards.stream().map(qualityTestStandard -> {
+//                QualityInspectParam qualityInspectParam = new QualityInspectParam();
+//                BeanUtils.copyProperties(qualityTestStandard, qualityInspectParam,ignoreProperties);
+//                qualityInspectParam.setInspectId(qualityInspect.getId());
+//                return qualityInspectParam;
+//            }).collect(Collectors.toList());
+//            qualityInspectParamService.saveBatch(qualityInspectParams);
+//        }else{
+//            throw new BaseException("璇ヤ骇鍝佹病鏈夌淮鎶ゆ楠屾寚鏍�,璇锋鏌�!!!!!!!!");
+//        }
+//        return  qualityInspectMapper.updateById(qualityInspect);
     }
 
     @Override
@@ -106,4 +214,6 @@
         }
 
     }
+
+
 }
diff --git a/src/main/resources/mapper/account/AccountExpenseMapper.xml b/src/main/resources/mapper/account/AccountExpenseMapper.xml
index 909f372..fff6020 100644
--- a/src/main/resources/mapper/account/AccountExpenseMapper.xml
+++ b/src/main/resources/mapper/account/AccountExpenseMapper.xml
@@ -56,4 +56,18 @@
         group by expense_type
     </select>
 
+    <select id="report1" resultType="java.math.BigDecimal">
+        SELECT
+        sum(expense_money) account
+        FROM account_expense ai
+        where
+        expense_type=#{dictValue}
+        <if test="dateQueryDto.entryDateStart != null and dateQueryDto.entryDateStart != '' ">
+            AND expense_date &gt;= DATE_FORMAT(#{dateQueryDto.entryDateStart},'%Y-%m-%d')
+        </if>
+        <if test="dateQueryDto.entryDateEnd != null and dateQueryDto.entryDateEnd != '' ">
+            AND expense_date &lt;= DATE_FORMAT(#{dateQueryDto.entryDateEnd},'%Y-%m-%d')
+        </if>
+    </select>
+
 </mapper>
diff --git a/src/main/resources/mapper/account/AccountIncomeMapper.xml b/src/main/resources/mapper/account/AccountIncomeMapper.xml
index bfb6d73..1cb49b9 100644
--- a/src/main/resources/mapper/account/AccountIncomeMapper.xml
+++ b/src/main/resources/mapper/account/AccountIncomeMapper.xml
@@ -56,4 +56,17 @@
         </if>
         group by income_type
     </select>
+    <select id="report1" resultType="java.math.BigDecimal">
+        SELECT
+        sum(income_money) account
+        FROM account_income ai
+        where
+        income_type=#{dictValue}
+        <if test="dateQueryDto.entryDateStart != null and dateQueryDto.entryDateStart != '' ">
+            AND income_date &gt;= DATE_FORMAT(#{dateQueryDto.entryDateStart},'%Y-%m-%d')
+        </if>
+        <if test="dateQueryDto.entryDateEnd != null and dateQueryDto.entryDateEnd != '' ">
+            AND income_date &lt;= DATE_FORMAT(#{dateQueryDto.entryDateEnd},'%Y-%m-%d')
+        </if>
+    </select>
 </mapper>
diff --git a/src/main/resources/static/report-template.docx b/src/main/resources/static/report-template.docx
new file mode 100644
index 0000000..0bc9746
--- /dev/null
+++ b/src/main/resources/static/report-template.docx
Binary files differ

--
Gitblit v1.9.3