财务管理模块--报表调整+质量模块调整(展示检验项,生成报告,与不合格进行关联)
已修改16个文件
已添加3个文件
582 ■■■■ 文件已修改
pom.xml 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/dto/AccountDto3.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/mapper/AccountExpenseMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/mapper/AccountIncomeMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/service/AccountExpenseService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/service/AccountIncomeService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/service/impl/AccountIncomeServiceImpl.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/HackLoopTableRenderPolicy.java 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/controller/QualityInspectController.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/dto/QualityInspectDto.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/QualityInspectParam.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/IQualityInspectService.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java 180 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/account/AccountExpenseMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/account/AccountIncomeMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/report-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -224,6 +224,7 @@
            <version>${poi.version}</version>
        </dependency>
        <!-- velocity代码生成使用模板 -->
        <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>
</project>
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;
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);
}
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);
}
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();
}
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();
}
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;
    }
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;
    }
}
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);
    }
}
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);
    }
}
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)));
    }
}
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;
}
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;
}
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;
}
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);
}
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 @@
        }
    }
}
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>
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>
src/main/resources/static/report-template.docx
Binary files differ