From 29a13ebe1b950443a58947a9cb004cd2993612f0 Mon Sep 17 00:00:00 2001 From: sugy <455459989@qq.com> Date: Tue, 13 Jan 2026 16:53:06 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=89=E7=8E=AF?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resource/feign/IAttachClient.java | 12 ++ .../resource/feign/AttachClient.java | 9 + blade-service/blade-desk/pom.xml | 28 ++- .../BsSafeInspectionPointController.java | 55 +++++- .../desk/energy/mapper/DosingRecMapper.xml | 2 +- .../entity/BsSafeInspectionPointEntity.java | 21 ++- .../pojo/entity/BsWasteGasRunRecEntity.java | 9 +- .../IBsSafeInspectionPointService.java | 7 + .../BsSafeInspectionPointServiceImpl.java | 112 ++++++++++- .../desk/energy/task/OrderSafeJob.java | 3 - .../desk/energy/util/ExportUtil.java | 166 +++++++++++++++++ .../desk/energy/util/JasperReportUtil.java | 117 ++++++++++++ .../desk/energy/util/PdfPageUtil.java | 176 ++++++++++++++++++ .../FmProjectMilestoneController.java | 34 ++-- .../entity/FmProjectApplicationEntity.java | 12 ++ .../pojo/entity/FmProjectMilestoneEntity.java | 26 ++- .../service/IFmProjectMilestoneService.java | 7 + .../impl/FmProjectMilestoneServiceImpl.java | 22 +++ .../safety/safety_inspectionPoint.jasper | Bin 0 -> 35534 bytes .../main/resources/configs/report/report.xml | 6 + .../configs/report/safety_report.xml | 6 + .../main/resources/configs/systemConfig.xml | 159 ++++++++++++++++ 22 files changed, 942 insertions(+), 47 deletions(-) create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/ExportUtil.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/JasperReportUtil.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/PdfPageUtil.java create mode 100644 blade-service/blade-desk/src/main/resources/configs/jasperReport/safety/safety_inspectionPoint.jasper create mode 100644 blade-service/blade-desk/src/main/resources/configs/report/report.xml create mode 100644 blade-service/blade-desk/src/main/resources/configs/report/safety_report.xml create mode 100644 blade-service/blade-desk/src/main/resources/configs/systemConfig.xml diff --git a/blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/IAttachClient.java b/blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/IAttachClient.java index 8070473d9..d40fd750e 100644 --- a/blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/IAttachClient.java +++ b/blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/IAttachClient.java @@ -9,6 +9,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; +import java.util.List; + @FeignClient( value = AppConstant.APPLICATION_RESOURCE_NAME ) @@ -22,6 +24,8 @@ public interface IAttachClient { String COPY_FROM_TEMP_TO_BIZ_PREFIX = API_PREFIX + "/copy-from-temp-to-biz-prefix"; + String LIST_BY_IDS = API_PREFIX + "/list-by-ids"; + /** * * @param attach @@ -46,4 +50,12 @@ public interface IAttachClient { @GetMapping(COPY_FROM_TEMP_TO_BIZ_PREFIX) R copyFromTempToBizPrefix(@RequestParam("id") Long id, @RequestParam("bizPrefix") String bizPrefix); + + /** + * 查询集合 + * @param + * @return + */ + @GetMapping(LIST_BY_IDS) + R> listByIds(@RequestParam("ids") String ids); } diff --git a/blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/AttachClient.java b/blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/AttachClient.java index 078bb9a5b..6ada2ed42 100644 --- a/blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/AttachClient.java +++ b/blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/AttachClient.java @@ -4,11 +4,14 @@ import jakarta.annotation.Resource; import lombok.Data; import org.springblade.core.mp.support.Condition; import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.Func; import org.springblade.resource.pojo.entity.Attach; import org.springblade.resource.service.IAttachService; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + /** * todo:有temp桶,成功以后移动到具体业务桶中. */ @@ -36,4 +39,10 @@ public class AttachClient implements IAttachClient { // todo:有temp桶,成功以后移动到具体业务桶中. return null; } + + @Override + public R> listByIds(String ids) { + List list=attachService.listByIds(Func.toLongList(ids)); + return R.data(list); + } } diff --git a/blade-service/blade-desk/pom.xml b/blade-service/blade-desk/pom.xml index fa110c876..10829b81c 100644 --- a/blade-service/blade-desk/pom.xml +++ b/blade-service/blade-desk/pom.xml @@ -78,6 +78,33 @@ hutool-all 5.8.16 + + + com.videasoft + vwebfrk-base + 1.4.6-RELEASE + + + org.codehaus.groovy + groovy + 3.0.9 + + + com.videasoft.m3 + barbecue + 0.0.1 + + + com.itextpdf + itext7-core + 7.1.16 + pom + + + com.lowagie + itext + 2.1.7 + org.springblade blade-resource-api @@ -86,7 +113,6 @@ org.springblade blade-system-api - diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsSafeInspectionPointController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsSafeInspectionPointController.java index a9e039155..78a121802 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsSafeInspectionPointController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsSafeInspectionPointController.java @@ -31,10 +31,10 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import lombok.AllArgsConstructor; -import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.excel.util.ExcelUtil; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; @@ -43,18 +43,22 @@ import org.springblade.core.secure.annotation.IsAdmin; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; -import org.springblade.desk.basic.pojo.entity.BatConfig; import org.springblade.desk.basic.util.ExcelExtUtil; import org.springblade.desk.energy.excel.BsSafeInspectionPointExcel; import org.springblade.desk.energy.pojo.entity.BsSafeInspectionPointEntity; import org.springblade.desk.energy.pojo.vo.BsSafeInspectionPointVO; import org.springblade.desk.energy.service.IBsSafeInspectionPointService; +import org.springblade.desk.energy.util.ExportUtil; import org.springblade.desk.energy.wrapper.BsSafeInspectionPointWrapper; import org.springframework.core.io.Resource; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -68,10 +72,12 @@ import java.util.Map; @AllArgsConstructor @RequestMapping("/bsSafeInspectionPoint") @Tag(name = "巡检点配置表", description = "巡检点配置表接口") -public class BsSafeInspectionPointController extends BladeController { +public class BsSafeInspectionPointController { private final IBsSafeInspectionPointService bsSafeInspectionPointService; + private final ExportUtil exportUtil; + /** * 巡检点配置表 详情 */ @@ -199,5 +205,48 @@ public class BsSafeInspectionPointController extends BladeController { public R saveList(@Valid @RequestBody List bsSafeInspectionPointList) { return R.status(bsSafeInspectionPointService.saveOrUpdateBatch(bsSafeInspectionPointList)); } + @PostMapping(value = "/print") + @ApiOperationSupport(order = 13) + @Operation(summary = "打印", description = "传入bsSafeInspectionPointList") + public void print(@RequestBody BsSafeInspectionPointEntity data, HttpServletRequest request, HttpServletResponse response) { + + // List ipIdList = JSONArray.parseArray(data.get("ipIdList").toString(), Long.class); + List ipIdList = new ArrayList<>(); + //Short exportType = data.getShort("exportType"); + Short exportType = 1; + List list = bsSafeInspectionPointService.listByIds(Func.toLongList(data.getIds())); + + String reportId = null; + if (reportId == null) { + reportId = "safety_inspectionPoint"; + } + Map map=new HashMap(); + map.put("companyName","客户公司的名称"); + map.put("companySN","客户公司的简称"); + //ipIdList.forEach(id -> list.add(safeInspectionPointService.getByKey(id))); + exportUtil.export(reportId, exportType, "安全巡检点", list, map,request, response); + } + /** + * 巡检点配置表 导出pdf + */ +// @PostMapping("/exportPdf") +// @ApiOperationSupport(order = 7) +// @Operation(summary = "导出pdf", description = "传入ids") +// public void exportPdf(@Parameter(description = "主键集合", required = true) @RequestParam String ids,HttpServletRequest request, HttpServletResponse response) { +// List list = bsSafeInspectionPointService.listByIds(Func.toLongList(ids)); +// // 防止日志记录获取session异常 +// request.getSession(); +// // 设置编码格式 +// response.setContentType("application/pdf;charset=UTF-8"); +// response.setCharacterEncoding("utf-8"); +// String fileName = null; +// try { +// fileName = URLEncoder.encode("下载的PDF名称", "UTF-8"); +// } catch (UnsupportedEncodingException e) { +// throw new RuntimeException(e); +// } +// response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".pdf"); +// //bsSafeInspectionPointService.exportPdf(list, response); +// } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/DosingRecMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/DosingRecMapper.xml index 7766ff41c..3635065bd 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/DosingRecMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/DosingRecMapper.xml @@ -47,7 +47,7 @@ and n.DOSING_TIME like '%' || #{bsDosingRec.dosingTime} || '%' - and n.DOSING_TIME BETWEEN to_date(#{bsDosingRec.startDate},'YYYY-MM-DD HH24:MI:SS') AND to_date(#{bsDosingRec .endDate},'YYYY-MM-DD HH24:MI:SS') + and n.DOSING_TIME BETWEEN to_date(#{bsDosingRec.startDate},'YYYY-MM-DD HH24:MI:SS') AND to_date(#{bsDosingRec.endDate},'YYYY-MM-DD HH24:MI:SS') diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsSafeInspectionPointEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsSafeInspectionPointEntity.java index 3a0438ea7..4788ddf21 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsSafeInspectionPointEntity.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsSafeInspectionPointEntity.java @@ -25,6 +25,7 @@ */ package org.springblade.desk.energy.pojo.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import io.swagger.v3.oas.annotations.media.Schema; @@ -66,14 +67,15 @@ public class BsSafeInspectionPointEntity extends BaseEntity { @Schema(description = "巡检点位置") private String insSite; -// /** -// * 巡检器 -// */ -// @Schema(description = "巡检器") -// private String patrolRegister; -// /** -// * 巡检点 -// */ + /** + * 巡检器 + */ + @Schema(description = "巡检器") + @TableField(value = "ins_num") + private String patrolRegister; + /** + * 巡检点 + */ // @Schema(description = "巡检点") // private String insSpot; /** @@ -89,4 +91,7 @@ public class BsSafeInspectionPointEntity extends BaseEntity { @Schema(description = "备注") private String memo; + @TableField(exist = false) + private String ids; + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsWasteGasRunRecEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsWasteGasRunRecEntity.java index 08e47592d..4fa5ba403 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsWasteGasRunRecEntity.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsWasteGasRunRecEntity.java @@ -25,19 +25,18 @@ */ package org.springblade.desk.energy.pojo.entity; +import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.Data; import io.swagger.v3.oas.annotations.media.Schema; -import com.baomidou.mybatisplus.annotation.TableName; -import java.util.Date; -import java.math.BigDecimal; +import lombok.Data; import lombok.EqualsAndHashCode; import org.springblade.core.mp.base.BaseEntity; -import org.springblade.core.tenant.mp.TenantEntity; import org.springblade.core.tool.utils.DateUtil; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; +import java.math.BigDecimal; +import java.util.Date; /** * 废气运行记录表 实体类 diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsSafeInspectionPointService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsSafeInspectionPointService.java index 305e08d13..5ac39a78c 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsSafeInspectionPointService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/IBsSafeInspectionPointService.java @@ -27,6 +27,7 @@ package org.springblade.desk.energy.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import jakarta.servlet.http.HttpServletResponse; import org.springblade.core.mp.base.BaseService; import org.springblade.desk.energy.excel.BsSafeInspectionPointExcel; import org.springblade.desk.energy.pojo.entity.BsSafeInspectionPointEntity; @@ -59,4 +60,10 @@ public interface IBsSafeInspectionPointService extends BaseService exportBsSafeInspectionPoint(Wrapper queryWrapper); + /** + * 导出pdf + * @param list + * @param response + */ + //void exportPdf(List list, HttpServletResponse response); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsSafeInspectionPointServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsSafeInspectionPointServiceImpl.java index a20cef4c2..ee46fa202 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsSafeInspectionPointServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsSafeInspectionPointServiceImpl.java @@ -26,15 +26,16 @@ package org.springblade.desk.energy.service.impl; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.desk.energy.excel.BsSafeInspectionPointExcel; import org.springblade.desk.energy.mapper.BsSafeInspectionPointMapper; import org.springblade.desk.energy.pojo.entity.BsSafeInspectionPointEntity; import org.springblade.desk.energy.pojo.vo.BsSafeInspectionPointVO; import org.springblade.desk.energy.service.IBsSafeInspectionPointService; import org.springframework.stereotype.Service; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import org.springblade.core.mp.base.BaseServiceImpl; + import java.util.List; /** @@ -61,4 +62,109 @@ public class BsSafeInspectionPointServiceImpl extends BaseServiceImpl list, HttpServletResponse response) { +// // 定义全局的字体静态变量 +// Font titlefont; +// Font headfont; +// Font keyfont = null; +// Font textfont = null; +// Font content = null; +// // 最大宽度 +// try { +// // 不同字体(这里定义为同一种字体:包含不同字号、不同style) +// BaseFont bfChinese = BaseFont.createFont( "C:/Windows/Fonts/simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED ); +// titlefont = new Font(bfChinese, 16, Font.BOLD); +// headfont = new Font(bfChinese, 14, Font.BOLD); +// keyfont = new Font(bfChinese, 10, Font.BOLD); +// textfont = new Font(bfChinese, 15, Font.NORMAL); +// content = new Font(bfChinese, 10, Font.NORMAL); +// +// } catch (Exception e) { +// e.printStackTrace(); +// } +// BaseFont bf; +// Font font = null; +// try { +// //创建字体 +// bf = BaseFont.createFont( "C:/Windows/Fonts/simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED ); +// //使用字体并给出颜色 +// font = new Font(bf,20,Font.BOLD, BaseColor.BLACK); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// +// Document document = new Document(new RectangleReadOnly(842F, 595F)); +// //设置页边距 60:左边距,60:右边距,72:上边距,72:下边距 +// document.setMargins(60, 60, 72, 72); +// +// try { +// PdfWriter writer = PdfWriter.getInstance(document,response.getOutputStream()); +// //添加页码 +// writer.setPageEvent(new PdfPageUtil()); +// //打开生成的pdf文件 +// document.open(); +// //设置内容 +// Paragraph paragraph = new Paragraph("熏蒸备案回执",font); +// paragraph.setAlignment(1); +// //引用字体 +// document.add(paragraph); +// +// // 设置表格的列宽和列数 +// float[] widths = {25f,25f,25f,25f,25f,25f}; +// PdfPTable table = new PdfPTable(widths); +// table.setSpacingBefore(20f); +// // 设置表格宽度为100% +// table.setWidthPercentage(100.0F); +// table.setHeaderRows(1); +// table.getDefaultCell().setHorizontalAlignment(1); +// PdfPCell cell = null; +// //第一行 +// cell = new PdfPCell(new Paragraph("熏蒸备案编码",content)); +// cell.setVerticalAlignment(Element.ALIGN_MIDDLE); +// cell.setHorizontalAlignment(Element.ALIGN_CENTER); +// cell.setFixedHeight(30); +// table.addCell(cell); +// +//// cell = new PdfPCell(new Paragraph(fumigationDowloadVO.getXzbm())); +//// cell.setVerticalAlignment(Element.ALIGN_MIDDLE); +//// cell.setHorizontalAlignment(Element.ALIGN_CENTER); +//// table.addCell(cell); +// +// cell = new PdfPCell(new Paragraph("熏蒸备案时间",content)); +// cell.setVerticalAlignment(Element.ALIGN_MIDDLE); +// cell.setHorizontalAlignment(Element.ALIGN_CENTER); +// table.addCell(cell); +// +//// cell = new PdfPCell(new Paragraph(CheckVerifyUtil.dateToString4(fumigationDowloadVO.getSqxzrq()))); +//// cell.setVerticalAlignment(Element.ALIGN_MIDDLE); +//// cell.setHorizontalAlignment(Element.ALIGN_CENTER); +//// table.addCell(cell); +// +// cell = new PdfPCell(new Paragraph("申请备案单位",content)); +// cell.setVerticalAlignment(Element.ALIGN_MIDDLE); +// cell.setHorizontalAlignment(Element.ALIGN_CENTER); +// table.addCell(cell); +// +//// cell = new PdfPCell(new Paragraph(fumigationDowloadVO.getDwmc(),content)); +//// cell.setVerticalAlignment(Element.ALIGN_MIDDLE); +//// cell.setHorizontalAlignment(Element.ALIGN_CENTER); +//// table.addCell(cell); +// +// document.add(new Paragraph("\n")); +// document.add(new Paragraph("▋ 基本信息",content)); +// document.add(new Paragraph("\n")); +// +// document.add(table); +// +// //关闭文档 +// document.close(); +// +// } catch (DocumentException e) { +// throw new RuntimeException(e); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// } + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/task/OrderSafeJob.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/task/OrderSafeJob.java index 496bcfb9a..d9dc0d502 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/task/OrderSafeJob.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/task/OrderSafeJob.java @@ -3,13 +3,10 @@ package org.springblade.desk.energy.task; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.desk.energy.service.IBsSafePatrolInspectionService; -import org.springblade.desk.order.service.IYieldOrderService; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import java.util.List; - /** * 定时任务 * diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/ExportUtil.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/ExportUtil.java new file mode 100644 index 000000000..147344579 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/ExportUtil.java @@ -0,0 +1,166 @@ +package org.springblade.desk.energy.util; + +import com.videasoft.utils.other.Function; +import com.videasoft.webframework.common.web.report.HtmlExporterUtil; +import com.videasoft.webframework.common.web.report.ReportModel; +import com.videasoft.webframework.configs.ReportInfoReader; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperExportManager; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter; +import net.sf.jasperreports.export.ExporterInput; +import net.sf.jasperreports.export.OutputStreamExporterOutput; +import net.sf.jasperreports.export.SimpleExporterInput; +import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +@Service +public class ExportUtil { + public void export(String reportId, short exportType, String fileName, Object data, Map params, HttpServletRequest request, HttpServletResponse response) { + if (params == null) { + params = new HashMap(); + } + + try { + Map reports = ReportInfoReader.getReport(); + JasperPrint jp = JasperReportUtil.getJasperPrint(reportId, data, (Map)params); + ReportModel rm = (ReportModel)reports.get(reportId); + jp.setName("测试"); + if (StringUtils.isBlank(fileName)) { + fileName = Function.toUtf8String(rm.getReportName()); + } + + if (0 == exportType) { + fileName = fileName + ".xlsx"; + fileName= URLEncoder.encode(fileName,"UTF-8"); + this.exportExcel(jp, fileName, response); + } else if (1 == exportType) { + fileName = fileName + ".pdf"; + fileName= URLEncoder.encode(fileName,"UTF-8"); + this.exportPdf(jp, fileName, response); + } else if (3 == exportType) { + this.exportHtml(jp, response); + } + } catch (Exception var12) { + var12.printStackTrace(); + } + + } + protected void exportExcel(Object jasperPrint, String fileName, HttpServletResponse response) { + OutputStream out = null; + + try { + out = this.getExportStream("application/vnd.ms-excel", fileName, response); + JRXlsxExporter exporter = new JRXlsxExporter(); + ExporterInput exporterInput = null; + if (jasperPrint instanceof JasperPrint) { + exporterInput = new SimpleExporterInput((JasperPrint)jasperPrint); + } else if (jasperPrint instanceof List) { + exporterInput = SimpleExporterInput.getInstance((List)jasperPrint); + } + + exporter.setExporterInput(exporterInput); + OutputStreamExporterOutput exporterOutput = new SimpleOutputStreamExporterOutput(response.getOutputStream()); + exporter.setExporterOutput(exporterOutput); + exporter.exportReport(); + } catch (JRException var20) { + var20.getMessage(); + } catch (UnsupportedEncodingException var21) { + var21.printStackTrace(); + var21.getMessage(); + } catch (IOException var22) { + var22.printStackTrace(); + var22.getMessage(); + } finally { + if (out != null) { + try { + out.flush(); + out.close(); + } catch (IOException var19) { + var19.printStackTrace(); + } + } + + } + + } + private void exportPdf(Object jasperPrint, String fileName, HttpServletResponse response) { + try { + OutputStream ouputStream = this.getExportStream("application/pdf", fileName, response); + if (jasperPrint instanceof JasperPrint) { + JasperExportManager.exportReportToPdfStream((JasperPrint)jasperPrint, ouputStream); + } else if (jasperPrint instanceof List) { + List list = (List)jasperPrint; + if (list != null && list.size() > 0) { + Iterator var6 = list.iterator(); + + while(var6.hasNext()) { + JasperPrint jp = (JasperPrint)var6.next(); + JasperExportManager.exportReportToPdfStream(jp, ouputStream); + } + } + } + + ouputStream.flush(); + ouputStream.close(); + } catch (Exception var8) { + var8.getMessage(); + } + + } + protected void exportHtml(Object jasperPrint, HttpServletResponse response) { + PrintWriter printWriter = null; + + try { + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html"); + printWriter = response.getWriter(); + HtmlExporterUtil exporter = new HtmlExporterUtil(jasperPrint, printWriter); + exporter.exportReport(); + } catch (JRException var9) { + var9.getMessage(); + } catch (IOException var10) { + var10.getMessage(); + } finally { + printWriter.close(); + } + + } + + protected OutputStream getExportStream(String contentType, String fileName, HttpServletResponse response) { + String ct = "application/octet-stream"; + if (contentType != null) { + ct = contentType; + } + + ServletOutputStream out = null; + + try { + response.setCharacterEncoding("UTF-8"); + response.setContentType(ct); + if (fileName != null && fileName.trim().length() > 0) { + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); + } + + response.setBufferSize(2048); + out = response.getOutputStream(); + } catch (IOException var7) { + var7.getMessage(); + } + + return out; + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/JasperReportUtil.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/JasperReportUtil.java new file mode 100644 index 000000000..755c4fb74 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/JasperReportUtil.java @@ -0,0 +1,117 @@ +package org.springblade.desk.energy.util; + +import com.videasoft.configs.Configers; +import com.videasoft.utils.other.Function; +import com.videasoft.utils.reader.PathReader; +import com.videasoft.webframework.common.web.report.JasperReportUtils; +import com.videasoft.webframework.common.web.report.PrintData; +import com.videasoft.webframework.common.web.report.ReportModel; +import com.videasoft.webframework.common.web.report.SubReportModel; +import com.videasoft.webframework.configs.ReportInfoReader; +import net.sf.jasperreports.engine.JasperFillManager; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.JasperReport; +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; +import net.sf.jasperreports.engine.util.JRLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.io.InputStream; +import java.util.*; +@Service +public class JasperReportUtil { + + + protected static final Logger logger = LoggerFactory.getLogger(JasperReportUtils.class); + + public JasperReportUtil() { + } + + public static final ReportModel getReportModel(String reportId) throws Exception { + return ReportInfoReader.getReportModel(reportId); + } + + public static final JasperPrint getJasperPrint(String reportId, Object data, Map params) throws Exception { + ReportModel rm = ReportInfoReader.getReportModel(reportId); + if (rm == null) { + throw new Exception("找不到报表模板定义"); + } else { + Collection mainData = null; + if (data instanceof Collection) { + mainData = (Collection)data; + } else { + mainData = new ArrayList(1); + ((List)mainData).add(data); + } + + if (params == null) { + params = new HashMap(); + } + + JasperReport jr = rm.getJasperRoport(); + InputStream inputStream = PathReader.class.getResourceAsStream(rm.getTemplatePath()); + if (inputStream == null) { + logger.error("读取打印模版:" + rm.getTemplatePath() + "出错,文件可能不存在!"); + return null; + } else { + if (rm.isDebug() || jr == null) { + jr = (JasperReport) JRLoader.loadObject(inputStream); + rm.setJasperRoport(jr); + } + + if (rm.getExtParam() != null) { + ((Map)params).putAll(rm.getExtParam()); + } + + // ((Map)params).put("companyInfo", Configers.getEnumConfiger("company").getOption()); + SubReportModel subReport = null; + JasperReport subJS = null; + ReportModel subRM = null; + Collection subData = null; + List subReports = rm.getSubReports(); + if (subReports != null && subReports.size() > 0) { + for(int i = 0; i < subReports.size(); ++i) { + subReport = (SubReportModel)subReports.get(i); + subRM = ReportInfoReader.getReportModel(subReport.getSubReportId()); + subJS = subRM.getJasperRoport(); + if (subRM.isDebug() || subJS == null) { + subJS = (JasperReport)JRLoader.loadObject(PathReader.class.getResourceAsStream(subRM.getTemplatePath())); + subRM.setJasperRoport(subJS); + } + + subData = (Collection) Function.getPropertyValue(((Map)params).get("jasper_head_data"), subReport.getPropertyName()); + ((Map)params).put("subReport_" + subReport.getJsReportParamName(), subJS); + ((Map)params).put("subData_" + subReport.getDataParamName(), subData != null ? new JRBeanCollectionDataSource(subData) : null); + } + } + + JasperPrint jp = JasperFillManager.fillReport(jr, (Map)params, new JRBeanCollectionDataSource((Collection)mainData)); + mainData = null; + subData = null; + if (jp == null) { + throw new Exception("无法生成导出或打印资源!"); + } else { + return jp; + } + } + } + } + + public static final ArrayList getJasperPrints(String reportId, List data, Map pubParamMap) throws Exception { + ArrayList jps = new ArrayList(data.size()); + + for(int i = 0; i < data.size(); ++i) { + PrintData d = (PrintData)data.get(i); + if (d.getParams() == null) { + d.setParams(new HashMap()); + } + + d.getParams().putAll(pubParamMap); + JasperPrint jp = getJasperPrint(reportId, d.getData(), d.getParams()); + jps.add(jp); + } + + return jps; + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/PdfPageUtil.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/PdfPageUtil.java new file mode 100644 index 000000000..31865ef14 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/PdfPageUtil.java @@ -0,0 +1,176 @@ +//package org.springblade.desk.energy.util; +// +//import com.itextpdf.text.*; +//import com.itextpdf.text.pdf.*; +// +//import java.io.IOException; +// +///** +// * @Author xx +// * @Date 2023/12/15 10:05 +// * @Description: 导出pdf添加页数 +// * @Version 1.0 +// */ +//public class PdfPageUtil extends PdfPageEventHelper { +// +// /** +// * 页眉 +// */ +// //public String header = "itext测试页眉"; +// +// /** +// * 文档字体大小,页脚页眉最好和文本大小一致 +// */ +// public int presentFontSize = 15; +// +// /** +// * 文档页面大小,最好前面传入,否则默认为A4纸张 +// */ +// public Rectangle pageSize = PageSize.A4; +// +// // 模板 +// public PdfTemplate total; +// +// // 基础字体对象 +// public BaseFont bf = null; +// +// // 利用基础字体生成的字体对象,一般用于生成中文文字 +// public Font fontDetail = null; +// +// /** +// * +// * 无参构造方法. +// * +// */ +// public PdfPageUtil() { +// +// } +// +// /** +// * +// * 构造方法. +// * +// * @param +// * +// * @param presentFontSize +// * 数据体字体大小 +// * @param pageSize +// * 页面文档大小,A4,A5,A6横转翻转等Rectangle对象 +// */ +// public PdfPageUtil( int presentFontSize, Rectangle pageSize) { +// this.presentFontSize = presentFontSize; +// this.pageSize = pageSize; +// } +// +// public void setPresentFontSize(int presentFontSize) { +// this.presentFontSize = presentFontSize; +// } +// +// /** +// * +// * 文档打开时创建模板 +// */ +// @Override +// public void onOpenDocument(PdfWriter writer, Document document) { +// // 共 页 的矩形的长宽高 +// total = writer.getDirectContent().createTemplate(50, 50); +// } +// +// /** +// * +// *关闭每页的时候,写入页眉,写入'第几页共'这几个字。 +// */ +// @Override +// public void onEndPage(PdfWriter writer, Document document) { +// this.addPage(writer, document); +// } +// +// //加分页 +// public void addPage(PdfWriter writer, Document document){ +// //设置分页页眉页脚字体 +// try { +// if (bf == null) { +// bf = BaseFont.createFont("C:/Windows/Fonts/simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED ); +// } +// if (fontDetail == null) { +// fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体 +// } +// } catch (DocumentException e) { +// e.printStackTrace(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// +// // 1.写入页眉 +//// ColumnText.showTextAligned(writer.getDirectContent(), +//// Element.ALIGN_LEFT, new Phrase(header, fontDetail), +//// document.left(), document.top() + 20, 0); +// // 2.写入前半部分的 第 X页/共 +// int pageS = writer.getPageNumber(); +// //String foot1 = "第 " + pageS + " 页 /共"; +// String foot1 = pageS +"/"; +// Phrase footer = new Phrase(foot1, fontDetail); +// +// // 3.计算前半部分的foot1的长度,后面好定位最后一部分的'Y页'这俩字的x轴坐标,字体长度也要计算进去 = len +// float len = bf.getWidthPoint(foot1, presentFontSize); +// +// // 4.拿到当前的PdfContentByte +// PdfContentByte cb = writer.getDirectContent(); +// +// // 5.写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0F +// ColumnText +// .showTextAligned( +// cb, +// Element.ALIGN_CENTER, +// footer, +// (document.rightMargin() + document.right() +// + document.leftMargin() - document.left() - len) / 2.0F , +// document.bottom() - 10, 0); +// cb.addTemplate(total, (document.rightMargin() + document.right() +// + document.leftMargin() - document.left()) / 2.0F , +// document.bottom() - 10); // 调节模版显示的位置 +// +// } +// +//// //加水印 +//// public void addWatermark(PdfWriter writer){ +//// // 水印图片 +//// Image image; +//// try { +//// image = Image.getInstance("./web/images/001.jpg"); +//// PdfContentByte content = writer.getDirectContentUnder(); +//// content.beginText(); +//// // 开始写入水印 +//// for(int k=0;k<5;k++){ +//// for (int j = 0; j <4; j++) { +//// image.setAbsolutePosition(150*j,170*k); +//// content.addImage(image); +//// } +//// } +//// content.endText(); +//// } catch (IOException | DocumentException e) { +//// // TODO Auto-generated catch block +//// e.printStackTrace(); +//// } +//// } +// +// /** +// * +// * 关闭文档时,替换模板,完成整个页眉页脚组件 +// */ +// @Override +// public void onCloseDocument(PdfWriter writer, Document document) { +// // 关闭文档的时候,将模板替换成实际的 Y 值 +// total.beginText(); +// // 生成的模版的字体、颜色 +// total.setFontAndSize(bf, presentFontSize); +// //页脚内容拼接 如 第1页/共2页 +// //String foot2 = " " + (writer.getPageNumber()) + " 页"; +// //页脚内容拼接 如 第1页/共2页 +// String foot2 = String.valueOf(writer.getPageNumber()); +// // 模版显示的内容 +// total.showText(foot2); +// total.endText(); +// total.closePath(); +// } +//} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectMilestoneController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectMilestoneController.java index 1a36c85fc..0fdcc80c8 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectMilestoneController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectMilestoneController.java @@ -25,18 +25,23 @@ */ package org.springblade.desk.process.controller; -import io.swagger.v3.oas.annotations.tags.Tag; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import lombok.AllArgsConstructor; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; - -import org.springblade.core.secure.BladeUser; -import org.springblade.core.secure.annotation.IsAdmin; +import lombok.AllArgsConstructor; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.excel.util.ExcelUtil; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.annotation.IsAdmin; import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.desk.process.excel.FmProjectMilestoneExcel; import org.springblade.desk.process.pojo.entity.FmProjectMilestoneEntity; @@ -44,15 +49,9 @@ import org.springblade.desk.process.pojo.vo.FmProjectMilestoneVO; import org.springblade.desk.process.service.IFmProjectMilestoneService; import org.springblade.desk.process.wrapper.FmProjectMilestoneWrapper; import org.springframework.web.bind.annotation.*; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import org.springblade.core.boot.ctrl.BladeController; -import org.springblade.core.tool.utils.DateUtil; -import org.springblade.core.excel.util.ExcelUtil; -import org.springblade.core.tool.constant.BladeConstant; -import java.util.Map; + import java.util.List; -import jakarta.servlet.http.HttpServletResponse; +import java.util.Map; /** * 项目里程碑 控制器 @@ -75,7 +74,8 @@ public class FmProjectMilestoneController extends BladeController { @ApiOperationSupport(order = 1) @Operation(summary = "详情", description = "传入fmProjectMilestone") public R detail(FmProjectMilestoneEntity fmProjectMilestone) { - FmProjectMilestoneEntity detail = fmProjectMilestoneService.getOne(Condition.getQueryWrapper(fmProjectMilestone)); + //FmProjectMilestoneEntity detail = fmProjectMilestoneService.getOne(Condition.getQueryWrapper(fmProjectMilestone)); + FmProjectMilestoneEntity detail = fmProjectMilestoneService.getDetail(fmProjectMilestone); return R.data(FmProjectMilestoneWrapper.build().entityVO(detail)); } /** @@ -170,7 +170,7 @@ public class FmProjectMilestoneController extends BladeController { * 项目里程碑 核查 */ @PostMapping("/sendCheck") - @ApiOperationSupport(order = 10) + @ApiOperationSupport(order = 11) @Operation(summary = "核查", description = "传入fmProjectMilestone") public R sendCheck(@Valid @RequestBody FmProjectMilestoneEntity fmProjectMilestone) { return R.status(fmProjectMilestoneService.sendCheck(fmProjectMilestone)); @@ -179,7 +179,7 @@ public class FmProjectMilestoneController extends BladeController { * 项目里程碑 核准 */ @PostMapping("/gradeSubmit") - @ApiOperationSupport(order = 10) + @ApiOperationSupport(order = 12) @Operation(summary = "核准", description = "传入fmProjectMilestone") public R gradeSubmit(@Valid @RequestBody FmProjectMilestoneEntity fmProjectMilestone) { return R.status(fmProjectMilestoneService.gradeSubmit(fmProjectMilestone)); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectApplicationEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectApplicationEntity.java index e845679dd..695bf706d 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectApplicationEntity.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectApplicationEntity.java @@ -26,6 +26,7 @@ package org.springblade.desk.process.pojo.entity; import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import io.swagger.v3.oas.annotations.media.Schema; import com.baomidou.mybatisplus.annotation.TableName; @@ -34,6 +35,9 @@ import java.math.BigDecimal; import lombok.EqualsAndHashCode; import org.springblade.core.mp.base.BaseEntity; import org.springblade.core.tenant.mp.TenantEntity; +import org.springblade.core.tool.utils.DateUtil; +import org.springframework.format.annotation.DateTimeFormat; + import java.io.Serial; import java.util.List; @@ -71,6 +75,8 @@ public class FmProjectApplicationEntity extends BaseEntity { * 制单时间 */ @Schema(description = "制单时间") + @DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) + @JsonFormat(pattern = DateUtil.PATTERN_DATETIME) private Date touchingTime; /** * 项目名称 @@ -101,16 +107,22 @@ public class FmProjectApplicationEntity extends BaseEntity { * 项目开始时间 */ @Schema(description = "项目开始时间") + @DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) + @JsonFormat(pattern = DateUtil.PATTERN_DATETIME) private Date projectStartTime; /** * 项目预期结束时间 */ @Schema(description = "项目预期结束时间") + @DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) + @JsonFormat(pattern = DateUtil.PATTERN_DATETIME) private Date projectDesiredEnd; /** * 项目实际结束时间 */ @Schema(description = "项目实际结束时间") + @DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) + @JsonFormat(pattern = DateUtil.PATTERN_DATETIME) private Date projectEnd; /** * 项目支持人 diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectMilestoneEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectMilestoneEntity.java index e3daaf473..e6970b06c 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectMilestoneEntity.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectMilestoneEntity.java @@ -26,16 +26,20 @@ package org.springblade.desk.process.pojo.entity; import com.baomidou.mybatisplus.annotation.TableField; -import lombok.Data; -import io.swagger.v3.oas.annotations.media.Schema; import com.baomidou.mybatisplus.annotation.TableName; -import java.math.BigDecimal; -import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; import lombok.EqualsAndHashCode; import org.springblade.core.mp.base.BaseEntity; -import org.springblade.core.tenant.mp.TenantEntity; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.resource.pojo.entity.Attach; +import org.springframework.format.annotation.DateTimeFormat; + import java.io.Serial; +import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -56,6 +60,8 @@ public class FmProjectMilestoneEntity extends BaseEntity { @TableField(exist = false) private FmProjectApplicationEntity fmProjectApplication; + @TableField(exist = false) + private List attachList; /** * 项目ID @@ -86,6 +92,8 @@ public class FmProjectMilestoneEntity extends BaseEntity { * 里程碑节点 */ @Schema(description = "里程碑节点") + @DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) + @JsonFormat(pattern = DateUtil.PATTERN_DATETIME) private Date milestoneNode; /** * 里程碑描述 @@ -126,6 +134,8 @@ public class FmProjectMilestoneEntity extends BaseEntity { * 延期时间 */ @Schema(description = "延期时间") + @DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) + @JsonFormat(pattern = DateUtil.PATTERN_DATETIME) private Date delayTime; /** * 核查结果 @@ -141,6 +151,8 @@ public class FmProjectMilestoneEntity extends BaseEntity { * 核查时间 */ @Schema(description = "核查时间") + @DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) + @JsonFormat(pattern = DateUtil.PATTERN_DATETIME) private Date checkTime; /** * 评价人 @@ -156,6 +168,8 @@ public class FmProjectMilestoneEntity extends BaseEntity { * 通过时间 */ @Schema(description = "通过时间") + @DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) + @JsonFormat(pattern = DateUtil.PATTERN_DATETIME) private Date okTime; /** * 延期产生数据 @@ -166,7 +180,7 @@ public class FmProjectMilestoneEntity extends BaseEntity { * 附件ID */ @Schema(description = "附件ID") - private Long fileId; + private String fileId; /** * 评价等级 未评价 diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/IFmProjectMilestoneService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/IFmProjectMilestoneService.java index ee7088ccf..770cd1c7c 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/IFmProjectMilestoneService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/IFmProjectMilestoneService.java @@ -79,4 +79,11 @@ public interface IFmProjectMilestoneService extends BaseService implements IFmProjectMilestoneService { private final IFmProjectApplicationService fmProjectApplicationService; + + private final IAttachClient attachClient; @Override public IPage selectFmProjectMilestonePage(IPage page, FmProjectMilestoneVO fmProjectMilestone) { return page.setRecords(baseMapper.selectFmProjectMilestonePage(page, fmProjectMilestone)); @@ -198,4 +205,19 @@ public class FmProjectMilestoneServiceImpl extends BaseServiceImpl attachList=attachClient.listByIds(detail.getFileId()).getData(); + detail.setAttachList(attachList); + } + detail.setFmProjectApplication(fmProjectApplication); + return detail; + } + } diff --git a/blade-service/blade-desk/src/main/resources/configs/jasperReport/safety/safety_inspectionPoint.jasper b/blade-service/blade-desk/src/main/resources/configs/jasperReport/safety/safety_inspectionPoint.jasper new file mode 100644 index 0000000000000000000000000000000000000000..c372882768e908fef650a578b73f1c43f882b33a GIT binary patch literal 35534 zcmeHw>u(#$mS1&KZ&7bqHZ6Pn7}=Izk|p_Vk7x9tY-%VrV9J1xd z+&goV0Q)UKkT1I*k^s9&KIidiu}E(ALx2S~36LPb1%d?0hX8kP_Dl9($nTu0uI^^H znzVPb2#__zs%F)xQ>RXyI_K1>YWgq!_*Z}N$G;No^_rM0TlQ3acj~)*y=v8JR<%;I z>r+;FuUNLGR=6vueeBsrWhr7GQceWUoz@>b7Z#rk!isd~3_Vp;p+F~hRuYWIo66U*_xE@8` zt9%_aW*3kJX}ppWiS=A^b7^fmm&~T-)7x9gY%aBy+1^Yor9}Ky#kMO4tN9v6nxf&9 z4iCzUmBX@~Vq)lPuA1KgdAj;(v0(4N5QD|Na;0Xi=g~B87c1o#Vx(AKE>-gOBBNQZ zRBWq8fc4zr!9l+EK4ZNFxb;Gu)kRN>_CA$8vGN70HeW6{t@?}gjiOz$R2w3vWbN9L z)CJL7sTHjpguF5!yd;1`~o4zoW3seK%+G{mn#|UZ!;S9Iiu2da-{crcJa;8EP zx$(Yg(Nw(3@4Vitffof^Or$Xd)AikHpM*?H37IDDmkXG`0m;CnV$Iqi%4{(g+0aH; z)7itaZjdY=9so~V;*q={DQMGWl2KgtQgjtSZ{4!%wwQbw+0#mvh6Yf=Ua)rahb22_ zzb{#~xX`2_gP~bR!Lswkk|L+CM}EyYBfZoNjRXXu;oVB@Aa5_{ckD{-y({U&^x^@p zy_{v+Vn8mDL%UeQiXzIpXt^9>c6nu_ML$-FP2%I@RPRB)SXRTeMKiiwzO5w(_MzaBVhnxID3Iu8696m2&DM))8G2f7RQ7E3&GyndY6XYcc1(UW$%7 zO)n(lVl&BbCb+XMmnoC+QgqwaLA8{(3CDCZ98&dcs1}&2cAHkO8qtVGTY*awaUu{v3(rT8-q^9qT)}kHz7O9mN z0y-;KEfwwgQmOLRDx}2-&m;{Z`L0^C>UGu$S0cx~l67IhM^a!F7$v)C)mQUXTU>9_ zdff{S1l@HaiIkcx20cb+;k`|^sb5#CS-BC3p9Px-Nf_mX)Wlqij7^rT18D8X(5je4 z`X?D|VrlQ}7fXd2Y8@(h-KUFnR#}#(r7f;S(g+TEpdY-eV(Lf8G*1!Asrgzh|DN!^ zgM8rcw9N9zV!}v?wtDdgi=<45w{4VqBu*IBYW1g@n2H)O@o37&Bf>)ehJmam`k59| zWmCjJStTnmzn!^_Y;t4q33{1n+DoJD@ZzGiciM)VvXQN_D>20BNx+yqFcW-EO)Es%yU5r|1FhH*=WX7qpQTSf+8+;8o zYmUt1-`dk$0?Ag+&4RblkaT!t83PiwOKk4h6^nFr&C;73(kOu*KMQA><4@2?;P~=PVCHPOY7}Ri1gjA^&c{@_tc||_) z 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 + + + + + \ No newline at end of file diff --git a/blade-service/blade-desk/src/main/resources/configs/report/safety_report.xml b/blade-service/blade-desk/src/main/resources/configs/report/safety_report.xml new file mode 100644 index 000000000..ef50245b1 --- /dev/null +++ b/blade-service/blade-desk/src/main/resources/configs/report/safety_report.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/blade-service/blade-desk/src/main/resources/configs/systemConfig.xml b/blade-service/blade-desk/src/main/resources/configs/systemConfig.xml new file mode 100644 index 000000000..b2eebf5fe --- /dev/null +++ b/blade-service/blade-desk/src/main/resources/configs/systemConfig.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + kanban/getBatchNumAfter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 343510c71649a49a50c30408735dad1f04177008 Mon Sep 17 00:00:00 2001 From: qinyulong Date: Tue, 13 Jan 2026 17:52:33 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E5=AD=97=E6=AE=B5=E4=BF=AE=E6=94=B9+sql?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/pojo/entity/EquipmentEntity.java | 27 +------------------ .../desk/device/mapper/EquipmentMapper.xml | 2 +- .../service/impl/EquipmentServiceImpl.java | 2 +- doc/sql/mes/increase-260113.sql | 5 ++++ 4 files changed, 8 insertions(+), 28 deletions(-) create mode 100644 doc/sql/mes/increase-260113.sql diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/entity/EquipmentEntity.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/entity/EquipmentEntity.java index 1de7aa0c7..bd61a14d1 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/entity/EquipmentEntity.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/device/pojo/entity/EquipmentEntity.java @@ -1,28 +1,3 @@ -/** - * BladeX Commercial License Agreement - * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. - *

- * Use of this software is governed by the Commercial License Agreement - * obtained after purchasing a license from BladeX. - *

- * 1. This software is for development use only under a valid license - * from BladeX. - *

- * 2. Redistribution of this software's source code to any third party - * without a commercial license is strictly prohibited. - *

- * 3. Licensees may copyright their own code but cannot use segments - * from this software for such purposes. Copyright of this software - * remains with BladeX. - *

- * Using this software signifies agreement to this License, and the software - * must not be used for illegal purposes. - *

- * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is - * not liable for any claims arising from secondary or illegal development. - *

- * Author: Chill Zhuang (bladejava@qq.com) - */ package org.springblade.desk.device.pojo.entity; import com.baomidou.mybatisplus.annotation.TableName; @@ -153,7 +128,7 @@ public class EquipmentEntity extends BaseEntity { * 作业中心ID */ @Schema(description = "作业中心ID") - private Long workstationId; + private Long workCenterId; public void setDocking(String docking) { // 核心逻辑:如果传入的是 null 或空字符串,则使用默认值 "0" if (docking == null || docking.trim().isEmpty()) { diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/EquipmentMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/EquipmentMapper.xml index d8632dfde..7713186bc 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/EquipmentMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/device/mapper/EquipmentMapper.xml @@ -27,7 +27,7 @@ - + Date: Wed, 14 Jan 2026 09:04:18 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=89=E7=8E=AF?= =?UTF-8?q?=E5=BA=9F=E6=B0=B4=E5=BA=9F=E5=BC=83=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../desk/energy/mapper/InsTestMapper.xml | 3 +++ .../desk/energy/mapper/WasteGasRunRecMapper.xml | 6 ++++++ .../desk/energy/pojo/vo/BsInsTestVO.java | 14 ++++++++++++++ .../desk/energy/pojo/vo/BsWasteGasRunRecVO.java | 12 ++++++++++++ .../energy/service/impl/BsInsTestServiceImpl.java | 5 +++++ .../service/impl/BsWasteGasRunRecServiceImpl.java | 9 +++++++++ .../springblade/desk/energy/util/ExportUtil.java | 1 - 7 files changed, 49 insertions(+), 1 deletion(-) diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/InsTestMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/InsTestMapper.xml index 40857cfa5..b25986541 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/InsTestMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/InsTestMapper.xml @@ -40,6 +40,9 @@ and n.DOSING_TIME like '%' || #{bsInsTest.dosingTime} || '%' + + and n.DOSING_TIME BETWEEN to_date(#{bsInsTest.startDate},'YYYY-MM-DD HH24:MI:SS') AND to_date(#{bsInsTest.endDate},'YYYY-MM-DD HH24:MI:SS') + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/WasteGasRunRecMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/WasteGasRunRecMapper.xml index 9b2f58028..0a5119209 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/WasteGasRunRecMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/WasteGasRunRecMapper.xml @@ -45,6 +45,12 @@ and n.END_TIME to_date(#{bsWasteGasRunRec.endTime},'YYYY-MM-DD HH24:MI:SS') + + and n.START_TIME BETWEEN to_date(#{bsWasteGasRunRec.startStart},'YYYY-MM-DD HH24:MI:SS') AND to_date(#{bsWasteGasRunRec.startEnd},'YYYY-MM-DD HH24:MI:SS') + + + and n.END_TIME BETWEEN to_date(#{bsWasteGasRunRec.endStart},'YYYY-MM-DD HH24:MI:SS') AND to_date(#{bsWasteGasRunRec.endEnd},'YYYY-MM-DD HH24:MI:SS') + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsInsTestVO.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsInsTestVO.java index 6946eeabe..e7c8e6b20 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsInsTestVO.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsInsTestVO.java @@ -25,6 +25,7 @@ */ package org.springblade.desk.energy.pojo.vo; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import org.springblade.desk.energy.pojo.entity.BsInsTestEntity; @@ -43,4 +44,17 @@ public class BsInsTestVO extends BsInsTestEntity { @Serial private static final long serialVersionUID = 1L; + private String queryDosingTime; + + /** + * 开始时间 + */ + @Schema(description = "开始时间") + private String startDate; + /** + * 结束时间 + */ + @Schema(description = "结束时间") + private String endDate; + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsWasteGasRunRecVO.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsWasteGasRunRecVO.java index d9a6ccc1e..4fc026d80 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsWasteGasRunRecVO.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/vo/BsWasteGasRunRecVO.java @@ -43,4 +43,16 @@ public class BsWasteGasRunRecVO extends BsWasteGasRunRecEntity { @Serial private static final long serialVersionUID = 1L; + private String queryStartTime; + + private String queryEndTime; + + private String startStart; + + private String startEnd; + + private String endStart; + + private String endEnd; + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsInsTestServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsInsTestServiceImpl.java index ca8d68b04..21938538d 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsInsTestServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsInsTestServiceImpl.java @@ -28,6 +28,7 @@ package org.springblade.desk.energy.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.commons.lang3.StringUtils; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.desk.energy.excel.BsInsTestExcel; import org.springblade.desk.energy.mapper.BsInsTestMapper; @@ -49,6 +50,10 @@ public class BsInsTestServiceImpl extends BaseServiceImpl selectBsInsTestPage(IPage page, BsInsTestVO bsInsTest) { + if(StringUtils.isNotEmpty(bsInsTest.getQueryDosingTime())){ + bsInsTest.setStartDate(bsInsTest.getQueryDosingTime().split(",")[0]); + bsInsTest.setEndDate(bsInsTest.getQueryDosingTime().split(",")[1]); + } return page.setRecords(baseMapper.selectBsInsTestPage(page, bsInsTest)); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsWasteGasRunRecServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsWasteGasRunRecServiceImpl.java index b8d8f1936..afc9ba3b0 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsWasteGasRunRecServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsWasteGasRunRecServiceImpl.java @@ -27,6 +27,7 @@ package org.springblade.desk.energy.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.commons.lang3.StringUtils; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.desk.energy.excel.BsWasteGasRunRecExcel; import org.springblade.desk.energy.mapper.BsWasteGasRunRecMapper; @@ -48,6 +49,14 @@ public class BsWasteGasRunRecServiceImpl extends BaseServiceImpl selectBsWasteGasRunRecPage(IPage page, BsWasteGasRunRecVO bsWasteGasRunRec) { + if(StringUtils.isNotEmpty(bsWasteGasRunRec.getQueryStartTime())){ + bsWasteGasRunRec.setStartStart(bsWasteGasRunRec.getQueryStartTime().split(",")[0]); + bsWasteGasRunRec.setStartEnd(bsWasteGasRunRec.getQueryStartTime().split(",")[1]); + } + if(StringUtils.isNotEmpty(bsWasteGasRunRec.getQueryEndTime())){ + bsWasteGasRunRec.setEndStart(bsWasteGasRunRec.getQueryEndTime().split(",")[0]); + bsWasteGasRunRec.setEndEnd(bsWasteGasRunRec.getQueryEndTime().split(",")[1]); + } return page.setRecords(baseMapper.selectBsWasteGasRunRecPage(page, bsWasteGasRunRec)); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/ExportUtil.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/ExportUtil.java index 147344579..93fce533b 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/ExportUtil.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/ExportUtil.java @@ -38,7 +38,6 @@ public class ExportUtil { Map reports = ReportInfoReader.getReport(); JasperPrint jp = JasperReportUtil.getJasperPrint(reportId, data, (Map)params); ReportModel rm = (ReportModel)reports.get(reportId); - jp.setName("测试"); if (StringUtils.isBlank(fileName)) { fileName = Function.toUtf8String(rm.getReportName()); } From 2ea90d207b5ff9ecf37f5fe97cd23876be85b2bf Mon Sep 17 00:00:00 2001 From: sugy <455459989@qq.com> Date: Wed, 14 Jan 2026 13:55:36 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=89=E7=8E=AF?= =?UTF-8?q?=E5=8A=A0=E8=8D=AF=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BsDosingRecController.java | 5 +- .../BsSafeInspectionPointController.java | 5 +- .../energy/pojo/entity/BsDosingRecEntity.java | 15 ++-- .../desk/energy/util/Configer.java | 85 ++++++++++++++++++ .../desk/energy/util/JasperReportUtil.java | 3 +- .../QA/废水化验记录导入模板.xls | Bin 20992 -> 19456 bytes .../safety/safety_inspectionPoint.jasper | Bin 35534 -> 32041 bytes .../springblade/system/mapper/UserMapper.xml | 2 +- 8 files changed, 100 insertions(+), 15 deletions(-) create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/Configer.java diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsDosingRecController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsDosingRecController.java index 476ff1628..f3b7dc473 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsDosingRecController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsDosingRecController.java @@ -180,7 +180,7 @@ public class BsDosingRecController extends BladeController { @PostMapping("/importExcel") @ApiOperationSupport(order = 11) @Operation(summary = "导入Excel", description = "MultipartFile") - public R importExcel(@RequestParam("file") MultipartFile file) { + public R importExcel(@RequestParam String dorType,@RequestParam("file") MultipartFile file) { R checkR = ExcelExtUtil.importExcelCheck(file); if (checkR != null) { return checkR; @@ -188,6 +188,9 @@ public class BsDosingRecController extends BladeController { List importList = ExcelUtil.read( file, 0, 1, BsDosingRecEntity.class ); + importList.forEach(x->{ + x.setDorType(dorType); + }); return R.status(bsDosingRecService.saveBatch(importList)); } /** diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsSafeInspectionPointController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsSafeInspectionPointController.java index 78a121802..35a1e47b8 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsSafeInspectionPointController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/controller/BsSafeInspectionPointController.java @@ -221,11 +221,8 @@ public class BsSafeInspectionPointController { if (reportId == null) { reportId = "safety_inspectionPoint"; } - Map map=new HashMap(); - map.put("companyName","客户公司的名称"); - map.put("companySN","客户公司的简称"); //ipIdList.forEach(id -> list.add(safeInspectionPointService.getByKey(id))); - exportUtil.export(reportId, exportType, "安全巡检点", list, map,request, response); + exportUtil.export(reportId, exportType, "安全巡检点", list, null,request, response); } /** * 巡检点配置表 导出pdf diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsDosingRecEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsDosingRecEntity.java index b5363feeb..2bb767b25 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsDosingRecEntity.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/pojo/entity/BsDosingRecEntity.java @@ -54,11 +54,6 @@ public class BsDosingRecEntity extends BaseEntity { @Serial private static final long serialVersionUID = 1L; - /** - * 酸雾塔 - */ - @Schema(description = "酸雾塔") - private BigDecimal btId; /** * 设施 */ @@ -78,8 +73,8 @@ public class BsDosingRecEntity extends BaseEntity { * 加药时间 */ @Schema(description = "加药时间") - @JsonFormat(pattern = DateUtil.PATTERN_DATETIME) - @DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) + @JsonFormat(pattern = DateUtil.PATTERN_DATE) + @DateTimeFormat(pattern = DateUtil.PATTERN_DATE) private Date dosingTime; /** * 加药人 @@ -102,4 +97,10 @@ public class BsDosingRecEntity extends BaseEntity { @Schema(description = "类型:1、废气加药;2、废水加药") private String dorType; + /** + * 酸雾塔 + */ + @Schema(description = "酸雾塔") + private Long btId; + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/Configer.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/Configer.java new file mode 100644 index 000000000..fcd5e584a --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/Configer.java @@ -0,0 +1,85 @@ +package org.springblade.desk.energy.util; + +import com.alibaba.fastjson.JSONObject; +import com.videasoft.configs.EnumConfiger; +import com.videasoft.configs.XmlConfigReader; +import jakarta.annotation.PostConstruct; +import org.springframework.stereotype.Component; + +import java.text.MessageFormat; +import java.util.LinkedHashMap; +import java.util.Map; +@Component +public class Configer { + private static final Map configerMap = new LinkedHashMap(); + private static final Map enumConfigerMap = new LinkedHashMap(); + + public Configer() { + } + + public static String getValue(String code) { + return (String)configerMap.get(code); + } + + public static String getValue(String code, String defaultValue) { + String v = getValue(code); + return v == null ? defaultValue : v; + } + + public static String getValue(String id, String[] args) { + String value = getValue(id); + if (value != null) { + value = MessageFormat.format(value, (Object[])args); + } + + return value; + } + + public static EnumConfiger getEnumConfiger(String id) { + return (EnumConfiger)enumConfigerMap.get(id); + } + + public static String getEnumValue(String id, String code) { + String enumValue = null; + EnumConfiger enumConfiger = getEnumConfiger(id); + if (enumConfiger != null) { + enumValue = enumConfiger.getEnumValue(code); + } + + return enumValue; + } + + public static String getEnumValue(String id, String code, String[] args) { + String enumValue = getEnumValue(id, code); + if (enumValue != null) { + enumValue = MessageFormat.format(enumValue, (Object[])args); + } + + return enumValue; + } + + public static JSONObject getJsonEnum(String id) { + JSONObject json = new JSONObject(); + EnumConfiger enumConfiger = getEnumConfiger(id); + if (enumConfiger != null) { + json.putAll(enumConfiger.getOption()); + } + + return json; + } + @PostConstruct + public static void init() { + XmlConfigReader loader = new XmlConfigReader(); + configerMap.clear(); + configerMap.putAll(loader.loadKeyValues()); + enumConfigerMap.clear(); + enumConfigerMap.putAll(loader.loadEnumConfigs()); + } + + public static void appendLoad(XmlConfigReader reader) { + if (reader != null) { + configerMap.putAll(reader.loadKeyValues()); + enumConfigerMap.putAll(reader.loadEnumConfigs()); + } + } +} \ No newline at end of file diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/JasperReportUtil.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/JasperReportUtil.java index 755c4fb74..6816a3aa8 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/JasperReportUtil.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/util/JasperReportUtil.java @@ -1,6 +1,5 @@ package org.springblade.desk.energy.util; -import com.videasoft.configs.Configers; import com.videasoft.utils.other.Function; import com.videasoft.utils.reader.PathReader; import com.videasoft.webframework.common.web.report.JasperReportUtils; @@ -64,7 +63,7 @@ public class JasperReportUtil { ((Map)params).putAll(rm.getExtParam()); } - // ((Map)params).put("companyInfo", Configers.getEnumConfiger("company").getOption()); + ((Map)params).put("companyInfo", Configer.getEnumConfiger("company").getOption()); SubReportModel subReport = null; JasperReport subJS = null; ReportModel subRM = null; diff --git a/blade-service/blade-desk/src/main/resources/Excel/QA/废水化验记录导入模板.xls b/blade-service/blade-desk/src/main/resources/Excel/QA/废水化验记录导入模板.xls index 9b676fc1028a9dbf6a2f95ee230cf1d6d055abbb..cd906dd541ffc094949ac05c9874a20948b5f322 100644 GIT binary patch literal 19456 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

Z|3`djAK_c0FRGVoT1^M zhXWCA@nHHt?myoG`1lfN5xv#ID_G@Joxj)XBQ$)m_+eN4q8u8?(fYSE{=Y-ihZ-M0 zB?KOpes%H}OB&J<3Hj=*xkGt6$|E0Ns3cFSX#W4Q@BUwJ+XwPuAbQSWH|Tf4J@m zwBz7$T*LHm@Zhqe;eumdEO<;y29J7Xg2(Z04tN~n^1|nY%y;<025kaw0}D z{8z#l2r-UhY0;qS?oQ+V^;- zi7*ewf9042v;>%8(_=IQ4IE$jQ9t38b5{!7E%leKfbzS(E$RR?O(mKpOmHBQgNq_i#b^z2I@Kfr*$W{@Vn`F%9Eg zU@G1RLZo5e>IUtxJFF(LR}6!eITTuGdkBX^j~E7=36O#gWl_&CSed3!?KuVRnEy}d z2@<$kRV@SdJsa@e#GkZ-NqT!g@P%t9;sX?K>b@P^w!?#%i>iJqxcizx{IzSpa k#KLg`-_&UZS2tM4dJ}iJ;+N^}6q+BT;BptohW`ZjzbQaA#sB~S literal 20992 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 z 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 - and role_id = #{user.roleId} + and role_id like '%' || #{user.roleId} || '%' and real_name = #{user.realName}