diff --git a/src/main/java/com/xdap/self_development/controller/BenchmarkingReportController.java b/src/main/java/com/xdap/self_development/controller/BenchmarkingReportController.java index 2f80eee..17dda7a 100644 --- a/src/main/java/com/xdap/self_development/controller/BenchmarkingReportController.java +++ b/src/main/java/com/xdap/self_development/controller/BenchmarkingReportController.java @@ -2,10 +2,7 @@ package com.xdap.self_development.controller; import com.definesys.mpaas.common.http.Response; import com.definesys.mpaas.query.db.PageQueryResult; -import com.xdap.self_development.controller.form.BenchmarkingReportPageForm; -import com.xdap.self_development.controller.form.HandleApprovalRequest; -import com.xdap.self_development.controller.form.SaveBenchmarkingReportForm; -import com.xdap.self_development.controller.form.UpdateBenchmarkingReportForm; +import com.xdap.self_development.controller.form.*; import com.xdap.self_development.exception.CommonException; import com.xdap.self_development.pojo.BenchmarkingReport; import com.xdap.self_development.pojo.view.ApprovalFlowView; @@ -37,9 +34,9 @@ public class BenchmarkingReportController { return Response.ok().data(fileUrl); } - // 新增对标报告并发起审批 - @PostMapping("/startReportApproval") - public Response startReportApproval( + // 保存对标报告 + @PostMapping("/insertReport") + public Response saveReportApproval( @Valid @RequestBody SaveBenchmarkingReportForm form, BindingResult bindingResult ) { @@ -48,12 +45,21 @@ public class BenchmarkingReportController { throw new CommonException(error.getDefaultMessage()); }); } - benchmarkingReportService.saveBenchmarkingReport(form); + benchmarkingReportService.insertReport(form); return Response.ok().setMessage("保存成功"); } - // 修改对标报告并发起审批 - @PostMapping("/restartReportApproval") + // 发起审批 + @PostMapping("/startReportApproval") + public Response startReportApproval( + @Valid @RequestBody ApprovalPersonForm form + ) { + benchmarkingReportService.startReportApproval(form); + return Response.ok().setMessage("保存成功"); + } + + // 修改对标报告 + @PostMapping("/updateReport") public Response restartReportApproval( @Valid @RequestBody UpdateBenchmarkingReportForm form, BindingResult bindingResult @@ -63,7 +69,7 @@ public class BenchmarkingReportController { throw new CommonException(error.getDefaultMessage()); }); } - benchmarkingReportService.restartReportApproval(form); + benchmarkingReportService.updateReport(form); return Response.ok().setMessage("重新提交成功"); } diff --git a/src/main/java/com/xdap/self_development/controller/DeleteController.java b/src/main/java/com/xdap/self_development/controller/DeleteController.java index ccef2e4..865bd85 100644 --- a/src/main/java/com/xdap/self_development/controller/DeleteController.java +++ b/src/main/java/com/xdap/self_development/controller/DeleteController.java @@ -1,5 +1,6 @@ package com.xdap.self_development.controller; +import com.alibaba.excel.EasyExcel; import com.definesys.mpaas.common.http.Response; import com.definesys.mpaas.query.MpaasQueryFactory; import com.xdap.motor.entity.SnowflakeIdWorker; @@ -14,12 +15,14 @@ import com.xdap.self_development.schedule.ParameterValueCalculationTimer; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; @Slf4j @RestController @@ -51,27 +54,57 @@ public class DeleteController { return Response.ok().data(myResponse); } - @GetMapping("/getTC") - public Response getTC( - @RequestParam String productNumber, - @RequestParam String partsName, - @RequestParam String parameterName + @PostMapping("/exportCompare") + public void exportTemplateCompare( +// @RequestBody CompareRequest request, +// HttpServletResponse response ) { - EnginePartsCollection enginePartsCollection = bd.getTCDatabase() - .eq("ztj", productNumber) - .eq("lbjmc", partsName) - .doQueryFirst(EnginePartsCollection.class); - if (enginePartsCollection == null || enginePartsCollection.getLbjth() == null) { - return Response.error("无法找到图号"); +// try { +// // 1. 查询对比数据 +// List data = compareService.compareMultipleTemplates( +// request.getTemplateNames(), +// request.getQueryParams() +// ); +// +// // 2. 设置响应头 +// String fileName = "模板参数对比_" + System.currentTimeMillis() + ".xlsx"; +// response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); +// response.setCharacterEncoding("utf-8"); +// response.setHeader("Content-disposition", +// "attachment;filename*=utf-8''" + URLEncoder.encode(fileName, "UTF-8")); +// +// // 3. 动态生成表头 +// List> head = generateDynamicHeader(request.getTemplateNames()); +// +// // 4. 使用EasyExcel写入数据 +// EasyExcel.write(response.getOutputStream()) +// .head(head) // 动态表头 +// .sheet("参数对比") +// .doWrite(data); +// +// } catch (Exception e) { +// throw new RuntimeException("导出失败", e); +// } + } + + /** + * 动态生成表头 + */ + private List> generateDynamicHeader(List templateNames) { + List> head = new ArrayList<>(); + + // 固定列 + head.add(Collections.singletonList("参数名称")); + head.add(Collections.singletonList("参数编码")); + + // 动态模板列 + for (String templateName : templateNames) { + head.add(Collections.singletonList(templateName)); } - ClassificationAttribute classificationAttribute = bd.getTCDatabase() - .eq("pitemId", enginePartsCollection.getLbjth()) - .eq("idattrtbutehame", parameterName) - .doQueryFirst(ClassificationAttribute.class); - if (classificationAttribute != null && classificationAttribute.getFieldvalue() != null) { - String fieldvalue = classificationAttribute.getFieldvalue(); - return Response.ok().data(fieldvalue); - } - return Response.error("无法找到参数值"); + + // 差异标识列 + head.add(Collections.singletonList("差异标识")); + + return head; } } diff --git a/src/main/java/com/xdap/self_development/controller/form/ApprovalPersonForm.java b/src/main/java/com/xdap/self_development/controller/form/ApprovalPersonForm.java new file mode 100644 index 0000000..bff76d5 --- /dev/null +++ b/src/main/java/com/xdap/self_development/controller/form/ApprovalPersonForm.java @@ -0,0 +1,24 @@ +package com.xdap.self_development.controller.form; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +@Data +public class ApprovalPersonForm { + @NotEmpty(message = "报告不能为空") + private String reportId; + + @NotEmpty(message = "校对人员不能为空") + private List proofreadUsers; + @NotEmpty(message = "审核人员不能为空") + private List reviewUsers; + private List countersignUsers; // 可选 + @NotEmpty(message = "批准人员不能为空") + private List approveUsers; + private String explanation; + + @NotEmpty(message = "创建者不能为空") + private String userId; +} diff --git a/src/main/java/com/xdap/self_development/controller/form/SaveBenchmarkingReportForm.java b/src/main/java/com/xdap/self_development/controller/form/SaveBenchmarkingReportForm.java index c216ff1..018a7c8 100644 --- a/src/main/java/com/xdap/self_development/controller/form/SaveBenchmarkingReportForm.java +++ b/src/main/java/com/xdap/self_development/controller/form/SaveBenchmarkingReportForm.java @@ -10,41 +10,20 @@ import java.util.List; public class SaveBenchmarkingReportForm { @NotBlank(message = "标题不能为空") private String title; - @NotBlank(message = "厂家名称不能为空") private String manufacturerName; - @NotBlank(message = "产品型号不能为空") private String modelName; - @NotBlank(message = "厂家简称不能为空") - private String manufacturerAbbreviation; - @NotBlank(message = "产品型号简称不能为空") - private String modelAbbreviation; - @NotBlank(message = "产品编号不能为空") - private String productNumber; - @NotBlank(message = "模块不能为空") private String module; - @NotBlank(message = "板块不能为空") + private String manufacturerAbbreviation; + private String modelAbbreviation; + private String productNumber; private String plate; - @NotBlank(message = "平台不能为空") private String platform; - @NotBlank(message = "系列不能为空") private String series; - @NotBlank(message = "细分市场不能为空") private String marketSegment; - @NotBlank(message = "项目名称不能为空") private String projectName; - @NotBlank(message = "项目编号不能为空") private String projectNumber; - private String fileUrl; - - @NotEmpty(message = "校对人员不能为空") - private List proofreadUsers; - @NotEmpty(message = "审核人员不能为空") - private List reviewUsers; - private List countersignUsers; // 可选 - @NotEmpty(message = "批准人员不能为空") - private List approveUsers; @NotBlank(message = "发起人不能为空") private String userId; - private String explanation; + private String fileUrl; } diff --git a/src/main/java/com/xdap/self_development/controller/form/UpdateBenchmarkingReportForm.java b/src/main/java/com/xdap/self_development/controller/form/UpdateBenchmarkingReportForm.java index c9be116..40d8e2b 100644 --- a/src/main/java/com/xdap/self_development/controller/form/UpdateBenchmarkingReportForm.java +++ b/src/main/java/com/xdap/self_development/controller/form/UpdateBenchmarkingReportForm.java @@ -8,46 +8,25 @@ import java.util.List; @Data public class UpdateBenchmarkingReportForm { - @NotBlank(message = "原对标报告id不能为空") + @NotBlank(message = "原对标报告不能为空") private String reportId; - @NotBlank(message = "标题不能为空") private String title; - @NotBlank(message = "厂家名称不能为空") private String manufacturerName; - @NotBlank(message = "产品型号不能为空") private String modelName; - @NotBlank(message = "厂家简称不能为空") private String manufacturerAbbreviation; - @NotBlank(message = "产品型号简称不能为空") private String modelAbbreviation; - @NotBlank(message = "产品编号不能为空") private String productNumber; - @NotBlank(message = "模块不能为空") private String module; - @NotBlank(message = "板块不能为空") private String plate; - @NotBlank(message = "平台不能为空") private String platform; - @NotBlank(message = "系列不能为空") private String series; - @NotBlank(message = "细分市场不能为空") private String marketSegment; - @NotBlank(message = "项目名称不能为空") private String projectName; - @NotBlank(message = "项目编号不能为空") private String projectNumber; private String fileUrl; - @NotEmpty(message = "校对人员不能为空") - private List proofreadUsers; - @NotEmpty(message = "审核人员不能为空") - private List reviewUsers; - private List countersignUsers; // 可选 - @NotEmpty(message = "批准人员不能为空") - private List approveUsers; @NotBlank(message = "发起人不能为空") - private String createBy; - private String explanation; + private String userId; } diff --git a/src/main/java/com/xdap/self_development/listener/SheetDataListener.java b/src/main/java/com/xdap/self_development/listener/SheetDataListener.java index 94d8dda..fd18180 100644 --- a/src/main/java/com/xdap/self_development/listener/SheetDataListener.java +++ b/src/main/java/com/xdap/self_development/listener/SheetDataListener.java @@ -23,7 +23,6 @@ public class SheetDataListener implements ReadListener { private List cachedDataList; private String currentSheetName; MyResponse problems; - Integer maxOrder; // 用于存储表头 private Set actualHeaders = new HashSet<>(); @@ -35,14 +34,13 @@ public class SheetDataListener implements ReadListener { private boolean validSheet = false; public SheetDataListener(TemplateService templateService, - String templateRowId, String createBy, MyResponse problems, Integer maxOrder) { + String templateRowId, String createBy, MyResponse problems) { this.templateService = templateService; this.templateRowId = templateRowId; this.createBy = createBy; this.cachedDataList = new ArrayList<>(BATCH_SIZE); this.problems = problems; this.requiredHeaders = getIncludeColumnFieldNames(); - this.maxOrder = maxOrder; } @Override @@ -104,8 +102,7 @@ public class SheetDataListener implements ReadListener { currentSheetName, templateRowId, createBy, - problems, - maxOrder + problems ); cachedDataList.clear(); } @@ -147,7 +144,6 @@ public class SheetDataListener implements ReadListener { headerChecked = false; validSheet = false; actualHeaders.clear(); - maxOrder += 1; } private static Set getIncludeColumnFieldNames() { diff --git a/src/main/java/com/xdap/self_development/pojo/BenchmarkingReport.java b/src/main/java/com/xdap/self_development/pojo/BenchmarkingReport.java index 9dd4329..7ce44b8 100644 --- a/src/main/java/com/xdap/self_development/pojo/BenchmarkingReport.java +++ b/src/main/java/com/xdap/self_development/pojo/BenchmarkingReport.java @@ -34,9 +34,9 @@ public class BenchmarkingReport extends MpaasBasePojo { private String marketSegment; private String projectName; private String projectNumber; + private String createBy; private Integer isDelete; - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Timestamp uploadTime; private String filePath; diff --git a/src/main/java/com/xdap/self_development/pojo/Template.java b/src/main/java/com/xdap/self_development/pojo/Template.java index 5d666b6..fb4c644 100644 --- a/src/main/java/com/xdap/self_development/pojo/Template.java +++ b/src/main/java/com/xdap/self_development/pojo/Template.java @@ -35,14 +35,14 @@ public class Template extends MpaasBasePojo { private Timestamp createdTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Timestamp publishedTime; - private Integer orderNum; + private Long orderNum; private String createBy; @Column(type = ColumnType.CALCULATE) private Integer maxOrder; - public Template(String templateName, Integer version, String status, Timestamp createdTime, Timestamp publishedTime, String createBy, Integer orderNum) { + public Template(String templateName, Integer version, String status, Timestamp createdTime, Timestamp publishedTime, String createBy, Long orderNum) { this.templateName = templateName; this.version = version; this.status = status; diff --git a/src/main/java/com/xdap/self_development/pojo/view/TodoAndReportView.java b/src/main/java/com/xdap/self_development/pojo/view/TodoAndReportView.java index 851dd42..804ea09 100644 --- a/src/main/java/com/xdap/self_development/pojo/view/TodoAndReportView.java +++ b/src/main/java/com/xdap/self_development/pojo/view/TodoAndReportView.java @@ -10,11 +10,11 @@ import java.util.List; @SQLQuery(value = { @SQL(view = "getAllReportApproval", - sql = "SELECT br.id AS \"reportId\", af.id AS \"flowId\", br.* FROM yfsjglpt_model_approval_flow af JOIN yfsjglpt_model_benchmarking_report br ON af.template_id = br.id WHERE br.is_delete = 0 and br.title like CONCAT('%', #title, '%') and br.manufacturer_name like CONCAT('%', #manufacturerName, '%') and br.model_name like CONCAT('%', #modelName, '%') and br.product_number like CONCAT('%', #productNumber, '%') and br.module like CONCAT('%', #module, '%') and br.plate like CONCAT('%', #plate, '%') and br.platform like CONCAT('%', #platform, '%') and br.series like CONCAT('%', #series, '%') and br.market_segment like CONCAT('%', #marketSegment, '%') and br.project_name like CONCAT('%', #projectName, '%') and br.project_number like CONCAT('%', #projectNumber, '%') and br.status like CONCAT('%', #status, '%') and af.flow_type = 2 ORDER BY CASE br.status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'REJECTED' THEN 3 ELSE 4 END ASC"), + sql = "SELECT br.id AS \"reportId\", af.id AS \"flowId\", br.* FROM yfsjglpt_model_approval_flow af RIGHT JOIN yfsjglpt_model_benchmarking_report br ON af.template_id = br.id AND af.flow_type = 2 WHERE br.is_delete = 0 and br.title like CONCAT('%', #title, '%') and br.manufacturer_name like CONCAT('%', #manufacturerName, '%') and br.model_name like CONCAT('%', #modelName, '%') and br.product_number like CONCAT('%', #productNumber, '%') and br.module like CONCAT('%', #module, '%') and br.plate like CONCAT('%', #plate, '%') and br.platform like CONCAT('%', #platform, '%') and br.series like CONCAT('%', #series, '%') and br.market_segment like CONCAT('%', #marketSegment, '%') and br.project_name like CONCAT('%', #projectName, '%') and br.project_number like CONCAT('%', #projectNumber, '%') and br.status like CONCAT('%', #status, '%') ORDER BY CASE br.status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'REJECTED' THEN 3 ELSE 4 END ASC"), @SQL(view = "getReportByUserIdAndIds", - sql = "SELECT br.id AS \"reportId\", af.id AS \"flowId\", br.* FROM yfsjglpt_model_approval_flow af JOIN yfsjglpt_model_benchmarking_report br ON af.template_id = br.id WHERE br.title like CONCAT('%', #title, '%') and br.manufacturer_name like CONCAT('%', #manufacturerName, '%') and br.model_name like CONCAT('%', #modelName, '%') and br.product_number like CONCAT('%', #productNumber, '%') and br.module like CONCAT('%', #module, '%') and br.plate like CONCAT('%', #plate, '%') and br.platform like CONCAT('%', #platform, '%') and br.series like CONCAT('%', #series, '%') and br.market_segment like CONCAT('%', #marketSegment, '%') and br.project_name like CONCAT('%', #projectName, '%') and br.project_number like CONCAT('%', #projectNumber, '%') and br.status like CONCAT('%', #status, '%') and af.flow_type = 2 AND af.id NOT IN (#ids) AND af.create_by = #createBy"), + sql = "SELECT br.id AS \"reportId\", af.id AS \"flowId\", br.* FROM yfsjglpt_model_approval_flow af LEFT JOIN yfsjglpt_model_benchmarking_report br ON af.template_id = br.id WHERE br.title like CONCAT('%', #title, '%') and br.manufacturer_name like CONCAT('%', #manufacturerName, '%') and br.model_name like CONCAT('%', #modelName, '%') and br.product_number like CONCAT('%', #productNumber, '%') and br.module like CONCAT('%', #module, '%') and br.plate like CONCAT('%', #plate, '%') and br.platform like CONCAT('%', #platform, '%') and br.series like CONCAT('%', #series, '%') and br.market_segment like CONCAT('%', #marketSegment, '%') and br.project_name like CONCAT('%', #projectName, '%') and br.project_number like CONCAT('%', #projectNumber, '%') and br.status like CONCAT('%', #status, '%') and af.flow_type = 2 AND af.id NOT IN (#ids) AND af.create_by = #createBy"), @SQL(view = "getTodoAndReport", - sql = "SELECT br.id AS \"reportId\", af.id AS \"flowId\", br.* FROM yfsjglpt_model_approval_flow af JOIN yfsjglpt_model_benchmarking_report br ON af.template_id = br.id WHERE br.title like CONCAT('%', #title, '%') and br.manufacturer_name like CONCAT('%', #manufacturerName, '%') and br.model_name like CONCAT('%', #modelName, '%') and br.product_number like CONCAT('%', #productNumber, '%') and br.module like CONCAT('%', #module, '%') and br.plate like CONCAT('%', #plate, '%') and br.platform like CONCAT('%', #platform, '%') and br.series like CONCAT('%', #series, '%') and br.market_segment like CONCAT('%', #marketSegment, '%') and br.project_name like CONCAT('%', #projectName, '%') and br.project_number like CONCAT('%', #projectNumber, '%') and br.status like CONCAT('%', #status, '%') and af.flow_type = 2 AND (af.id IN (#ids) OR af.create_by = #createBy) ORDER BY CASE br.status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'REJECTED' THEN 3 ELSE 4 END ASC") + sql = "SELECT br.id AS \"reportId\", af.id AS \"flowId\", br.* FROM yfsjglpt_model_approval_flow af LEFT JOIN yfsjglpt_model_benchmarking_report br ON af.template_id = br.id WHERE br.title like CONCAT('%', #title, '%') and br.manufacturer_name like CONCAT('%', #manufacturerName, '%') and br.model_name like CONCAT('%', #modelName, '%') and br.product_number like CONCAT('%', #productNumber, '%') and br.module like CONCAT('%', #module, '%') and br.plate like CONCAT('%', #plate, '%') and br.platform like CONCAT('%', #platform, '%') and br.series like CONCAT('%', #series, '%') and br.market_segment like CONCAT('%', #marketSegment, '%') and br.project_name like CONCAT('%', #projectName, '%') and br.project_number like CONCAT('%', #projectNumber, '%') and br.status like CONCAT('%', #status, '%') and af.flow_type = 2 AND (af.id IN (#ids) OR af.create_by = #createBy) ORDER BY CASE br.status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'REJECTED' THEN 3 ELSE 4 END ASC") }) @Data public class TodoAndReportView { diff --git a/src/main/java/com/xdap/self_development/schedule/ModifiedTodoTimer.java b/src/main/java/com/xdap/self_development/schedule/ModifiedTodoTimer.java deleted file mode 100644 index ce6b59a..0000000 --- a/src/main/java/com/xdap/self_development/schedule/ModifiedTodoTimer.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.xdap.self_development.schedule; - -import com.alibaba.fastjson2.JSON; -import com.xdap.self_development.config.BusinessDatabase; -import com.xdap.self_development.exception.CommonException; -import com.xdap.self_development.pojo.ApprovalFlow; -import com.xdap.self_development.pojo.ApprovalRecord; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -@Service -@Slf4j -@Transactional(rollbackFor = CommonException.class) -public class ModifiedTodoTimer { - @Resource - private BusinessDatabase bd; - @Autowired - private StringRedisTemplate redisTemplate; - private static final String TODO_PREFIX = "approval:todo:"; - private static final String TODO_PREFIX_2 = "report:todo:"; - - private static final String NODE_PROCESSED_PREFIX = "approval:node:processed:"; - private static final String NODE_PROCESSED_PREFIX_2 = "report:node:processed:"; - -// @Scheduled(cron = "0 */1 * * * *") - public void modifiedTodo() { - // 获取审批中的所有流程 - List flows1 = bd.getBusinessDatabase() - .eq("flow_status", "APPROVING") - .eq("flow_type", 1) - .doQuery(ApprovalFlow.class); - checkFlows(flows1, TODO_PREFIX, NODE_PROCESSED_PREFIX); - - List flows2 = bd.getBusinessDatabase() - .eq("flow_status", "APPROVING") - .eq("flow_type", 2) - .doQuery(ApprovalFlow.class); - checkFlows(flows2, TODO_PREFIX_2, NODE_PROCESSED_PREFIX_2); - } - - // 检查流程 - private void checkFlows(List flows, String todoFlag, String prefixFlag) { - // 遍历每一个流程 - flows.forEach(flow -> { - List nodeUsers = getNodeUsers(flow, flow.getCurrentNode()); - List records = bd.getBusinessDatabase() - .eq("flow_id", flow.getId()) - .eq("node", flow.getCurrentNode()) - .doQuery(ApprovalRecord.class) - .stream().map(ApprovalRecord::getUserId) - .collect(Collectors.toList()); - - if (Objects.equals(flow.getCurrentNode(), "COUNTERSIGN")) { - log.info("{}审批流,的COUNTERSIGN的已完成的人:{}", flow.getId(), records); - records.forEach(record -> { - Boolean isMember = redisTemplate.opsForSet() - .isMember(prefixFlag + flow.getId() + ":" + flow.getCurrentNode(), record); - if (Boolean.FALSE.equals(isMember)) { - redisTemplate.opsForSet().add(prefixFlag + flow.getId() + ":" + flow.getCurrentNode(), record); - } - }); - } - - // 未完成当前节点审批任务的人 - List collected = nodeUsers.stream() - .filter(element -> !records.contains(element)) - .collect(Collectors.toList()); - - collected.forEach(element -> { - // 检查redis是否存在该待办节点 - Boolean isMember = redisTemplate.opsForSet().isMember(todoFlag + element, flow.getId()); - log.info("{}{} is member: {}", todoFlag + element, flow.getId(), isMember); - if (Boolean.FALSE.equals(isMember)) { - redisTemplate.opsForSet().add(todoFlag + element, flow.getId()); - log.info("{}{} is added", todoFlag, element); - } - }); - }); - } - - private List getNodeUsers(ApprovalFlow flow, String node) { - switch (node) { - case "PROOFREAD": return JSON.parseArray(flow.getProofreadUsers()).toJavaList(String.class); - case "REVIEW": return JSON.parseArray(flow.getReviewUsers()).toJavaList(String.class); - case "COUNTERSIGN": return JSON.parseArray(flow.getCountersignUsers()).toJavaList(String.class); - case "APPROVE": return JSON.parseArray(flow.getApproveUsers()).toJavaList(String.class); - default: return Collections.emptyList(); - } - } -} diff --git a/src/main/java/com/xdap/self_development/service/BenchmarkingReportService.java b/src/main/java/com/xdap/self_development/service/BenchmarkingReportService.java index e73cb33..fc5152e 100644 --- a/src/main/java/com/xdap/self_development/service/BenchmarkingReportService.java +++ b/src/main/java/com/xdap/self_development/service/BenchmarkingReportService.java @@ -1,10 +1,7 @@ package com.xdap.self_development.service; import com.definesys.mpaas.query.db.PageQueryResult; -import com.xdap.self_development.controller.form.BenchmarkingReportPageForm; -import com.xdap.self_development.controller.form.HandleApprovalRequest; -import com.xdap.self_development.controller.form.SaveBenchmarkingReportForm; -import com.xdap.self_development.controller.form.UpdateBenchmarkingReportForm; +import com.xdap.self_development.controller.form.*; import com.xdap.self_development.pojo.BenchmarkingReport; import com.xdap.self_development.pojo.view.ApprovalFlowView; import com.xdap.self_development.pojo.view.TodoAndReportView; @@ -16,10 +13,12 @@ import java.util.List; public interface BenchmarkingReportService { PageQueryResult getBenchmarkingReportByCondition(@Valid BenchmarkingReportPageForm form); - - void saveBenchmarkingReport(@Valid SaveBenchmarkingReportForm form); - void restartReportApproval(@Valid UpdateBenchmarkingReportForm form); + void insertReport(@Valid SaveBenchmarkingReportForm form); + + void startReportApproval(ApprovalPersonForm form); + + void updateReport(@Valid UpdateBenchmarkingReportForm form); void handleReportApproval(@Valid HandleApprovalRequest request); diff --git a/src/main/java/com/xdap/self_development/service/TemplateService.java b/src/main/java/com/xdap/self_development/service/TemplateService.java index 9bd0a67..1ec3c3b 100644 --- a/src/main/java/com/xdap/self_development/service/TemplateService.java +++ b/src/main/java/com/xdap/self_development/service/TemplateService.java @@ -17,7 +17,7 @@ public interface TemplateService { MyResponse importTemplate(MultipartFile file, String templateRowId, String userId); void processSheetData(List dataList, String sheetName, - String templateRowId, String createBy, MyResponse problems,Integer maxOrder); + String templateRowId, String createBy, MyResponse problems); void insertTemplate(InsertTemplateForm form); diff --git a/src/main/java/com/xdap/self_development/service/impl/BenchmarkingReportServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/BenchmarkingReportServiceImpl.java index c120412..5fb76d3 100644 --- a/src/main/java/com/xdap/self_development/service/impl/BenchmarkingReportServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/BenchmarkingReportServiceImpl.java @@ -7,10 +7,7 @@ import com.definesys.mpaas.query.db.PageQueryResult; import com.xdap.runtime.service.RuntimeAppContextService; import com.xdap.self_development.common.UserPermissionGetter; import com.xdap.self_development.config.BusinessDatabase; -import com.xdap.self_development.controller.form.BenchmarkingReportPageForm; -import com.xdap.self_development.controller.form.HandleApprovalRequest; -import com.xdap.self_development.controller.form.SaveBenchmarkingReportForm; -import com.xdap.self_development.controller.form.UpdateBenchmarkingReportForm; +import com.xdap.self_development.controller.form.*; import com.xdap.self_development.exception.CommonException; import com.xdap.self_development.feign.ApaasMyTokenFeign; import com.xdap.self_development.feign.dto.AppTokenDTO; @@ -37,6 +34,7 @@ import java.sql.Timestamp; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; @Service public class BenchmarkingReportServiceImpl implements BenchmarkingReportService { @@ -63,55 +61,6 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService private static final String FLOW_LOCK_PREFIX = "report:lock:"; private static final int FLOW_LOCK_EXPIRE_SECONDS = 15; - @Override - @Transactional(rollbackFor = CommonException.class) - public void saveBenchmarkingReport(SaveBenchmarkingReportForm form) { - BenchmarkingReport report = new BenchmarkingReport(); - // 1. 创建对标报告并保存 - BeanUtils.copyProperties(form, report); - report.setFilePath(form.getFileUrl() == null ? "" : form.getFileUrl()); - report.setUploadTime(Timestamp.valueOf(LocalDateTime.now())); - report.setStatus("APPROVING"); - report.setCreateBy(form.getUserId()); - report.setIsDelete(0); - bd.getBusinessDatabase().doInsert(report); - // 2. 创建审批流程 - ApprovalFlow flow = new ApprovalFlow(); - flow.setTemplateId(report.getId()); - flow.setCurrentNode("PROOFREAD"); - flow.setFlowStatus("APPROVING"); - flow.setProofreadUsers(JSON.toJSONString(form.getProofreadUsers())); - flow.setReviewUsers(JSON.toJSONString(form.getReviewUsers())); - flow.setCountersignUsers(JSON.toJSONString(form.getCountersignUsers())); - flow.setApproveUsers(JSON.toJSONString(form.getApproveUsers())); - flow.setCreateBy(form.getUserId()); - flow.setCreatedTime(Timestamp.valueOf(LocalDateTime.now())); - flow.setFlowType(2); // 设置为报告审批流程 - flow.setExplanation(form.getExplanation()); - bd.getBusinessDatabase().doInsert(flow); - - // 新增待办 - List list = new ArrayList<>(); - for (String person : form.getProofreadUsers()) { - TodoTaskPojo todoTask = new TodoTaskPojo(); - todoTask.setCreatedById(form.getUserId()); - todoTask.setCreatedBy(xdapDeptUsersService.selectUserByID(form.getUserId()).getUsername()); - todoTask.setCurrentNode(getNodeName(flow.getCurrentNode())); - todoTask.setDataType("-"); - todoTask.setDocumentNo(flow.getId()); - todoTask.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); - todoTask.setIsDelete(0); - todoTask.setModelId(report.getId()); - todoTask.setModelName(report.getProjectName()+"对标报告"); - todoTask.setProcessTitle("对标报告审核"); - todoTask.setStatusCode(flow.getFlowStatus()); - todoTask.setVersionNumber(1); - todoTask.setOwnerId(person); - list.add(todoTask); - } - bd.getBusinessDatabase().doBatchInsert(list); - } - private String getNodeName(String node) { switch (node) { case "PROOFREAD": return "校对"; @@ -121,57 +70,6 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService } } - @Override - public void restartReportApproval(UpdateBenchmarkingReportForm form) { - bd.getBusinessDatabase() - .eq("id", form.getReportId()) - .update("is_delete", 1) - .doUpdate(BenchmarkingReport.class); - BenchmarkingReport report = new BenchmarkingReport(); - BeanUtils.copyProperties(form, report); - report.setFilePath(form.getFileUrl() == null ? "" : form.getFileUrl()); - report.setUploadTime(Timestamp.valueOf(LocalDateTime.now())); - report.setStatus("APPROVING"); - report.setCreateBy(form.getCreateBy()); - report.setIsDelete(0); - bd.getBusinessDatabase().doInsert(report); - - ApprovalFlow flow = new ApprovalFlow(); - flow.setTemplateId(report.getId()); - flow.setCurrentNode("PROOFREAD"); - flow.setFlowStatus("APPROVING"); - flow.setProofreadUsers(JSON.toJSONString(form.getProofreadUsers())); - flow.setReviewUsers(JSON.toJSONString(form.getReviewUsers())); - flow.setCountersignUsers(JSON.toJSONString(form.getCountersignUsers())); - flow.setApproveUsers(JSON.toJSONString(form.getApproveUsers())); - flow.setCreateBy(form.getCreateBy()); - flow.setCreatedTime(Timestamp.valueOf(LocalDateTime.now())); - flow.setFlowType(2); // 设置为报告审批流程 - flow.setExplanation(form.getExplanation()); - bd.getBusinessDatabase().doInsert(flow); - - List list = new ArrayList<>(); - for (String person : form.getProofreadUsers()) { - TodoTaskPojo todoTask = new TodoTaskPojo(); - todoTask.setCreatedById(form.getCreateBy()); - todoTask.setCreatedBy(xdapDeptUsersService.selectUserByID(form.getCreateBy()).getUsername()); - todoTask.setCurrentNode(getNodeName(flow.getCurrentNode())); - todoTask.setDataType("-"); - todoTask.setDocumentNo(flow.getId()); - todoTask.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); - todoTask.setIsDelete(0); - todoTask.setModelId(report.getId()); - todoTask.setModelName(report.getProjectName()+"对标报告"); - todoTask.setProcessTitle("对标报告审核"); - todoTask.setStatusCode(flow.getFlowStatus()); - todoTask.setVersionNumber(1); - todoTask.setOwnerId(person); - list.add(todoTask); - } - bd.getBusinessDatabase().doBatchInsert(list); - } - - @Override public String uploadFile(MultipartFile file, String userId) { String currentTenantId = runtimeAppContextService.getCurrentTenantId(); @@ -245,6 +143,79 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService return result; } + @Override + public void insertReport(SaveBenchmarkingReportForm form) { + BenchmarkingReport report = new BenchmarkingReport(); + BeanUtils.copyProperties(form, report); + report.setFilePath(form.getFileUrl() == null ? "" : form.getFileUrl()); + report.setUploadTime(Timestamp.valueOf(LocalDateTime.now())); + // 草稿状态 + report.setStatus("DRAFT"); + report.setCreateBy(form.getUserId()); + report.setIsDelete(0); + bd.getBusinessDatabase().doInsert(report); + } + + @Override + public void startReportApproval(ApprovalPersonForm form) { + BenchmarkingReport report = bd.getBusinessDatabase() + .eq("id", form.getReportId()) + .doQueryFirst(BenchmarkingReport.class); + + ApprovalFlow flow = new ApprovalFlow(); + flow.setTemplateId(report.getId()); + flow.setCurrentNode("PROOFREAD"); + flow.setFlowStatus("APPROVING"); + flow.setProofreadUsers(JSON.toJSONString(form.getProofreadUsers())); + flow.setReviewUsers(JSON.toJSONString(form.getReviewUsers())); + flow.setCountersignUsers(JSON.toJSONString(form.getCountersignUsers())); + flow.setApproveUsers(JSON.toJSONString(form.getApproveUsers())); + flow.setCreateBy(form.getUserId()); + flow.setCreatedTime(Timestamp.valueOf(LocalDateTime.now())); + flow.setFlowType(2); // 设置为报告审批流程 + flow.setExplanation(form.getExplanation()); + bd.getBusinessDatabase().doInsert(flow); + + List list = new ArrayList<>(); + for (String person : form.getProofreadUsers()) { + TodoTaskPojo todoTask = new TodoTaskPojo(); + todoTask.setCreatedById(form.getUserId()); + todoTask.setCreatedBy(xdapDeptUsersService.selectUserByID(form.getUserId()).getUsername()); + todoTask.setCurrentNode(getNodeName(flow.getCurrentNode())); + todoTask.setDataType("-"); + todoTask.setDocumentNo(flow.getId()); + todoTask.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); + todoTask.setIsDelete(0); + todoTask.setModelId(report.getId()); + todoTask.setModelName(report.getProjectName()+"对标报告"); + todoTask.setProcessTitle("对标报告审核"); + todoTask.setStatusCode(flow.getFlowStatus()); + todoTask.setVersionNumber(1); + todoTask.setOwnerId(person); + list.add(todoTask); + } + bd.getBusinessDatabase().doBatchInsert(list); + } + + @Override + public void updateReport(UpdateBenchmarkingReportForm form) { + BenchmarkingReport report = bd.getBusinessDatabase() + .eq("id", form.getReportId()) + .doQueryFirst(BenchmarkingReport.class); + if (!Objects.equals(report.getStatus(), "DRAFT")) { + throw new CommonException("报告非草稿状态不可修改"); + } + if (!Objects.equals(report.getCreateBy(), form.getUserId())) { + throw new CommonException("非创建者不能修改"); + } + BeanUtils.copyProperties(form, report); + report.setFilePath(form.getFileUrl() == null ? "" : form.getFileUrl()); + report.setUploadTime(Timestamp.valueOf(LocalDateTime.now())); + bd.getBusinessDatabase() + .eq("id", report.getId()) + .doUpdate(report); + } + private void setCurrentApprovers(PageQueryResult result) { result.getResult().forEach(item -> { ApprovalXdapUsers approvalXdapUser = bd.getBusinessDatabase() @@ -308,79 +279,99 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService ApprovalFlowView approvalFlowView = new ApprovalFlowView(); ApprovalFlow flow = bd.getBusinessDatabase() .eq("id", flowId) - .eq("flow_type", 2) + .eq("flow_type", 1) .doQueryFirst(ApprovalFlow.class); + + if (flow == null) { + return approvalFlowView; + } approvalFlowView.setExplanation(flow.getExplanation()); - List proofread = getNodeList(flowId, "PROOFREAD"); - if (proofread.isEmpty()) { - List list = new ArrayList<>(); - StringBuilder usernames = new StringBuilder(); - JSON.parseArray(flow.getProofreadUsers()).toJavaList(String.class).forEach(id -> { - ApprovalXdapUsers user = bd.getBusinessDatabase() - .eq("id", id) - .doQueryFirst(ApprovalXdapUsers.class); - usernames.append(user.getUsername()).append(" "); - }); - ApprovalNodeView approvalNodeView = new ApprovalNodeView(); - approvalNodeView.setNode("APPROVING"); - approvalNodeView.setUserName(usernames.toString()); - approvalNodeView.setResult("APPROVING"); - approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); - list.add(approvalNodeView); - approvalFlowView.setProofreadNodes(list); - approvalFlowView.setReviewNodes(new ArrayList<>()); - approvalFlowView.setApproveNodes(new ArrayList<>()); - approvalFlowView.setFlowStatus(flow.getFlowStatus()); - return approvalFlowView; - } - approvalFlowView.setProofreadNodes(proofread); - List review = getNodeList(flowId, "REVIEW"); - if (review.isEmpty()) { - List list = new ArrayList<>(); - StringBuilder usernames = new StringBuilder(); - JSON.parseArray(flow.getReviewUsers()).toJavaList(String.class).forEach(id -> { - ApprovalXdapUsers user = bd.getBusinessDatabase() - .eq("id", id) - .doQueryFirst(ApprovalXdapUsers.class); - usernames.append(user.getUsername()).append(" "); - }); - ApprovalNodeView approvalNodeView = new ApprovalNodeView(); - approvalNodeView.setNode("APPROVING"); - approvalNodeView.setUserName(usernames.toString()); - approvalNodeView.setResult("APPROVING"); - approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); - list.add(approvalNodeView); - approvalFlowView.setReviewNodes(list); - approvalFlowView.setApproveNodes(new ArrayList<>()); - approvalFlowView.setFlowStatus(flow.getFlowStatus()); - return approvalFlowView; - } - approvalFlowView.setReviewNodes(review); - List approve = getNodeList(flowId, "APPROVE"); - if (approve.isEmpty()) { - List list = new ArrayList<>(); - StringBuilder usernames = new StringBuilder(); - JSON.parseArray(flow.getApproveUsers()).toJavaList(String.class).forEach(id -> { - ApprovalXdapUsers user = bd.getBusinessDatabase() - .eq("id", id) - .doQueryFirst(ApprovalXdapUsers.class); - usernames.append(user.getUsername()).append(" "); - }); - ApprovalNodeView approvalNodeView = new ApprovalNodeView(); - approvalNodeView.setNode("APPROVING"); - approvalNodeView.setUserName(usernames.toString()); - approvalNodeView.setResult("APPROVING"); - approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); - list.add(approvalNodeView); - approvalFlowView.setApproveNodes(list); - approvalFlowView.setFlowStatus(flow.getFlowStatus()); - return approvalFlowView; - } - approvalFlowView.setApproveNodes(approve); approvalFlowView.setFlowStatus(flow.getFlowStatus()); + if (!"APPROVING".equals(flow.getFlowStatus())) { + setAllCompletedNodes(approvalFlowView, flow); + return approvalFlowView; + } + processApprovalNodes(approvalFlowView, flow); return approvalFlowView; } + private void setAllCompletedNodes(ApprovalFlowView view, ApprovalFlow flow) { + view.setProofreadNodes(getNodeList(flow.getId(), "PROOFREAD")); + view.setReviewNodes(getNodeList(flow.getId(), "REVIEW")); + view.setApproveNodes(getNodeList(flow.getId(), "APPROVE")); + } + + private void processApprovalNodes(ApprovalFlowView view, ApprovalFlow flow) { + // 处理校对节点 + List proofreadNodes = getNodeList(flow.getId(), "PROOFREAD"); + if (proofreadNodes.isEmpty()) { + view.setProofreadNodes(createApprovingNode(flow.getProofreadUsers())); + view.setReviewNodes(new ArrayList<>()); + view.setApproveNodes(new ArrayList<>()); + return; + } + view.setProofreadNodes(proofreadNodes); + + // 处理审核节点 + List reviewNodes = getNodeList(flow.getId(), "REVIEW"); + if (reviewNodes.isEmpty()) { + view.setReviewNodes(createApprovingNode(flow.getReviewUsers())); + view.setApproveNodes(new ArrayList<>()); + return; + } + view.setReviewNodes(reviewNodes); + + List approveNodes = getNodeList(flow.getId(), "APPROVE"); + if (approveNodes.isEmpty()) { + view.setApproveNodes(createApprovingNode(flow.getApproveUsers())); + } else { + view.setApproveNodes(approveNodes); + } + } + + private List createApprovingNode(String userJsonArray) { + List list = new ArrayList<>(); + + if (userJsonArray == null || userJsonArray.trim().isEmpty()) { + return list; + } + + List userIds = JSON.parseArray(userJsonArray).toJavaList(String.class); + if (userIds.isEmpty()) { + return list; + } + Map usersMap = batchQueryUsers(userIds); + StringBuilder usernames = new StringBuilder(); + for (String id : userIds) { + ApprovalXdapUsers user = usersMap.get(id); + if (user != null) { + usernames.append(user.getUsername()).append(" "); + } + } + if (usernames.length() > 0) { + ApprovalNodeView node = new ApprovalNodeView(); + node.setNode("APPROVING"); + node.setUserName(usernames.toString().trim()); + node.setResult("APPROVING"); + node.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); + list.add(node); + } + return list; + } + + private Map batchQueryUsers(List userIds) { + if (userIds == null || userIds.isEmpty()) { + return new HashMap<>(); + } + + List users = bd.getBusinessDatabase() + .in("id", userIds) + .doQuery(ApprovalXdapUsers.class); + + return users.stream() + .collect(Collectors.toMap(ApprovalXdapUsers::getId, user -> user)); + } + private List getNodeList(String flowId, String node) { List list = bd.getBusinessDatabase() .viewQueryMode(true) diff --git a/src/main/java/com/xdap/self_development/service/impl/EngineParamDetailServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/EngineParamDetailServiceImpl.java index cc7e986..ab4618f 100644 --- a/src/main/java/com/xdap/self_development/service/impl/EngineParamDetailServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/EngineParamDetailServiceImpl.java @@ -97,7 +97,7 @@ public class EngineParamDetailServiceImpl implements EngineParamDetailService { ) )); ArrayList