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 >= DATE_FORMAT(#{dateQueryDto.entryDateStart},'%Y-%m-%d') + </if> + <if test="dateQueryDto.entryDateEnd != null and dateQueryDto.entryDateEnd != '' "> + AND expense_date <= 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 >= DATE_FORMAT(#{dateQueryDto.entryDateStart},'%Y-%m-%d') + </if> + <if test="dateQueryDto.entryDateEnd != null and dateQueryDto.entryDateEnd != '' "> + AND income_date <= 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