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] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=89=E7=8E=AF=E7=AE=A1?= =?UTF-8?q?=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 8070473d..d40fd750 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 078bb9a5..6ada2ed4 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 fa110c87..10829b81 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 a9e03915..78a12180 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 7766ff41..3635065b 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 3a0438ea..4788ddf2 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 08e47592..4fa5ba40 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 305e08d1..5ac39a78 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 a20cef4c..ee46fa20 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 496bcfb9..d9dc0d50 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 00000000..14734457 --- /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 00000000..755c4fb7 --- /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 00000000..31865ef1 --- /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 1a36c85f..0fdcc80c 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 e845679d..695bf706 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 e3daaf47..e6970b06 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 ee7088cc..770cd1c7 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 00000000..ef50245b --- /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 00000000..b2eebf5f --- /dev/null +++ b/blade-service/blade-desk/src/main/resources/configs/systemConfig.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + kanban/getBatchNumAfter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +