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 fb13bed..8103579 100644 --- a/src/main/java/com/xdap/self_development/controller/DeleteController.java +++ b/src/main/java/com/xdap/self_development/controller/DeleteController.java @@ -60,10 +60,21 @@ public class DeleteController { for (String modelId : request.getModelIds()) { try { String redisKey = request.getUserID() + ":" + modelId + ":" + "ComparisonExport"; + log.info("尝试从Redis获取,KEY: {}", redisKey); + sb.append(redisKey).append(","); + String cachedData = redisTemplate.opsForValue().get(redisKey); - sb.append(cachedData).append("\n"); + + if (cachedData == null) { + log.warn("Redis中未找到数据,KEY: {}", redisKey); + sb.append(modelId).append("未找到数据").append(","); + } else { + log.info("成功获取到数据,长度: {}", cachedData.length()); + sb.append(cachedData).append("\n"); + } } catch (Exception e) { - log.error("删除缓存失败", e); + log.error("从Redis获取数据失败", e); // 修正日志信息 + sb.append(e.getMessage()).append("\n"); } } return Response.ok().data(sb); diff --git a/src/main/java/com/xdap/self_development/controller/TemplateApprovalController.java b/src/main/java/com/xdap/self_development/controller/TemplateApprovalController.java index d61be5c..860bbd0 100644 --- a/src/main/java/com/xdap/self_development/controller/TemplateApprovalController.java +++ b/src/main/java/com/xdap/self_development/controller/TemplateApprovalController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; +import javax.validation.constraints.NotBlank; import java.util.List; @RestController @@ -36,7 +37,7 @@ public class TemplateApprovalController { .doQuery(DepartmentUserView.class); return Response.ok().data(users); } - // 发起审批 + // 发起人发起审批 @PostMapping("/startApproval") public Response startApproval( @RequestBody @Valid StartApprovalRequest request, @@ -50,6 +51,16 @@ public class TemplateApprovalController { return Response.ok().data(templateApprovalService.startApproval(request)); } + // 发起人拒绝后重新发起审批 + @GetMapping("/restartApproval") + public Response restartApproval( + @RequestParam @NotBlank String templateId, + @RequestParam @NotBlank String userId + ) { + templateApprovalService.restartApproval(templateId, userId); + return Response.ok(); + } + // 查询审批列表 @GetMapping("/getApprovalList") public Response getTodoList( @@ -64,7 +75,7 @@ public class TemplateApprovalController { return Response.ok().data(templateApprovalService.getApprovalList(form)); } - // 处理审批 + // 处理人处理审批通过还是拒绝 @PostMapping("/handleApproval") public Response handleApproval( @RequestBody @Valid HandleApprovalRequest request, @@ -79,7 +90,31 @@ public class TemplateApprovalController { return Response.ok(); } - // 撤回审批 + // 获取可退回节点 + @GetMapping("/getReturnNodes") + public Response getReturnNodes( + @NotBlank String flowId + ) { + List result = templateApprovalService.getReturnNodes(flowId); + return Response.ok().data(result); + } + + // 处理人退回指定节点 + @PostMapping("/handleReturnToNode") + public Response handleReturnToNode( + @RequestBody @Valid HandleReturnNodeForm form, + BindingResult bindingResult + ) { + if (bindingResult.hasErrors()) { + bindingResult.getFieldErrors().forEach(error -> { + throw new CommonException(error.getDefaultMessage()); + }); + } + templateApprovalService.handleReturnToNode(form); + return Response.ok(); + } + + // 发起人撤回审批 @PostMapping("/handleReturn") public Response handleReturn( @RequestBody @Valid HandleApprovalRequest request, diff --git a/src/main/java/com/xdap/self_development/controller/TemplateController.java b/src/main/java/com/xdap/self_development/controller/TemplateController.java index 3de6f38..f70df61 100644 --- a/src/main/java/com/xdap/self_development/controller/TemplateController.java +++ b/src/main/java/com/xdap/self_development/controller/TemplateController.java @@ -16,6 +16,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import javax.validation.constraints.NotBlank; import java.util.List; @Slf4j @@ -43,6 +44,16 @@ public class TemplateController { return Response.ok().data(page); } + // 获取指定模板详情 + @GetMapping("/getTemplateById") + public Response getTemplateById( + @NotBlank String templateId + ) { + Template template = templateService.getTemplateById(templateId); + return Response.ok().data(template); + } + + // 查看版本 某个模板的全部版本 @GetMapping("getTemplateVersion") public Response getTemplateVersion( diff --git a/src/main/java/com/xdap/self_development/controller/form/HandleReturnNodeForm.java b/src/main/java/com/xdap/self_development/controller/form/HandleReturnNodeForm.java new file mode 100644 index 0000000..97c3812 --- /dev/null +++ b/src/main/java/com/xdap/self_development/controller/form/HandleReturnNodeForm.java @@ -0,0 +1,17 @@ +package com.xdap.self_development.controller.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class HandleReturnNodeForm { + @NotBlank(message = "流程不能为空") + private String flowId; + @NotBlank(message = "节点不能为空") + private String nodeName; + @NotBlank(message = "创建人不能为空") + private String createUserId; + @NotBlank(message = "处理人不能为空") + private String processUserId; +} diff --git a/src/main/java/com/xdap/self_development/pojo/ApprovalRecord.java b/src/main/java/com/xdap/self_development/pojo/ApprovalRecord.java index f67ad51..63a3dfa 100644 --- a/src/main/java/com/xdap/self_development/pojo/ApprovalRecord.java +++ b/src/main/java/com/xdap/self_development/pojo/ApprovalRecord.java @@ -24,4 +24,18 @@ public class ApprovalRecord extends MpaasBasePojo { private String result; // PASS, REJECT @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Timestamp approvalTime; + private Integer approvalLevel; + + public ApprovalRecord() { + } + + public ApprovalRecord(String flowId, String node, String userId, String opinion, String result, Timestamp approvalTime, Integer approvalLevel) { + this.flowId = flowId; + this.node = node; + this.userId = userId; + this.opinion = opinion; + this.result = result; + this.approvalTime = approvalTime; + this.approvalLevel = approvalLevel; + } } \ No newline at end of file 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 11c6dc5..24f6e1c 100644 --- a/src/main/java/com/xdap/self_development/pojo/Template.java +++ b/src/main/java/com/xdap/self_development/pojo/Template.java @@ -15,7 +15,7 @@ import java.sql.Timestamp; // 查找每个模板的最新版本并且优先级按照已发布、审核中、草稿状态转变(只有这三种状态) // CASE ranked.status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'DRAFT' THEN 3 WHEN 'RETURNED' THEN 4 WHEN 'REJECTED' THEN 5 ELSE 6 END ASC, @SQL(view = "getLatestTemplate", - sql = "SELECT ROW_NUMBER() OVER (ORDER BY ranked.order_num DESC) AS display_order_num, ranked.id, ranked.template_name, ranked.version , ranked.status, ranked.created_time, ranked.published_time, ROW_NUMBER() OVER (ORDER BY ranked.order_num DESC) AS order_num , xu.username AS \"createBy\" FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY template_name ORDER BY CASE WHEN status = 'COMPLETE' THEN 1 WHEN status = 'APPROVING' THEN 2 ELSE 3 END, version DESC) AS rn FROM yfsjglpt_model_template t WHERE status IN ('COMPLETE', 'DRAFT', 'APPROVING') ) ranked LEFT JOIN xdap_users xu ON xu.id = ranked.create_by WHERE rn = 1 ORDER BY ranked.order_num DESC" + sql = "SELECT ROW_NUMBER() OVER (ORDER BY ranked.order_num DESC) AS display_order_num, ranked.id, ranked.template_name, ranked.version, ranked.return_num , ranked.status, ranked.created_time, ranked.published_time, ROW_NUMBER() OVER (ORDER BY ranked.order_num DESC) AS order_num , xu.username AS \"createBy\" FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY template_name ORDER BY CASE WHEN status = 'COMPLETE' THEN 1 WHEN status = 'APPROVING' THEN 2 ELSE 3 END, version DESC) AS rn FROM yfsjglpt_model_template t WHERE status IN ('COMPLETE', 'DRAFT', 'APPROVING') ) ranked LEFT JOIN xdap_users xu ON xu.id = ranked.create_by WHERE rn = 1 ORDER BY ranked.order_num DESC" // sql = "SELECT ROW_NUMBER() OVER (ORDER BY CASE ranked.status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'DRAFT' THEN 3 WHEN 'RETURNED' THEN 4 WHEN 'REJECTED' THEN 5 ELSE 6 END ASC, ranked.order_num DESC) AS order_num, ranked.id, ranked.template_name, ranked.version , ranked.status, ranked.created_time, ranked.published_time, xu.username AS \"createBy\" FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY template_name ORDER BY CASE WHEN status = 'COMPLETE' THEN 1 WHEN status = 'APPROVING' THEN 2 ELSE 3 END, version DESC) AS rn FROM yfsjglpt_model_template t WHERE status IN ('COMPLETE', 'DRAFT', 'APPROVING') ) ranked LEFT JOIN xdap_users xu ON xu.id = ranked.create_by WHERE rn = 1 ORDER BY ranked.order_num DESC" ), // 获取所有模板的最新版本号(包括所有状态) 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 e6b3732..5be8a5f 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,7 +10,7 @@ import java.sql.Timestamp; @SQLQuery(value = { // CASE br.status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'REJECTED' THEN 3 ELSE 4 END ASC , @SQL(view = "getAllReport", - sql = "SELECT br.id AS \"reportId\", br.*, af.id AS \"flowId\" FROM yfsjglpt_model_benchmarking_report br LEFT JOIN yfsjglpt_model_approval_flow af 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, '%') ORDER BY br.upload_time DESC") + sql = "SELECT br.id AS \"reportId\", br.*, af.id AS \"flowId\" FROM yfsjglpt_model_benchmarking_report br LEFT JOIN ( SELECT af1.* FROM yfsjglpt_model_approval_flow af1 INNER JOIN ( SELECT template_id, MAX(created_time) AS max_create_time FROM yfsjglpt_model_approval_flow WHERE template_id IS NOT NULL GROUP BY template_id ) af2 ON af1.template_id = af2.template_id AND af1.created_time = af2.max_create_time ) af 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, '%') ORDER BY br.upload_time DESC") }) @Data public class TodoAndReportView { diff --git a/src/main/java/com/xdap/self_development/service/TemplateApprovalService.java b/src/main/java/com/xdap/self_development/service/TemplateApprovalService.java index ae81d8d..86930b0 100644 --- a/src/main/java/com/xdap/self_development/service/TemplateApprovalService.java +++ b/src/main/java/com/xdap/self_development/service/TemplateApprovalService.java @@ -4,16 +4,21 @@ import com.definesys.mpaas.query.db.PageQueryResult; import com.xdap.self_development.controller.form.*; import com.xdap.self_development.pojo.ApprovalConfigPojo; import com.xdap.self_development.pojo.ApprovalFlow; +import com.xdap.self_development.pojo.ApprovalRecord; import com.xdap.self_development.pojo.Template; import com.xdap.self_development.pojo.view.ApprovalFlowNodeView; import com.xdap.self_development.pojo.view.TemplateChangeView; import com.xdap.self_development.pojo.view.TodoAndTemplateView; import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import java.util.List; public interface TemplateApprovalService { String startApproval(StartApprovalRequest request); + void restartApproval(@NotBlank String templateId, @NotBlank String userId); + PageQueryResult getApprovalList(ApprovalListForm form); void handleApproval(HandleApprovalRequest request); @@ -24,11 +29,13 @@ public interface TemplateApprovalService { void handleReturn(@Valid HandleApprovalRequest request); + void handleReturnToNode(@Valid HandleReturnNodeForm form); + void processApprovalLogic( - ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode + ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode, ApprovalRecord lastedRecord ); - void cancelProcess(ApprovalFlow flow, String status); + void cancelProcess(ApprovalFlow flow, ApprovalConfigPojo node, String status, String userId); void processNextNode(ApprovalFlow flow, ApprovalConfigPojo currentNode, String userId); @@ -37,4 +44,6 @@ public interface TemplateApprovalService { void updateTasks(ApprovalFlow flow, String status); void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, Template template, String createBy); + + List getReturnNodes(@NotBlank String flowId); } 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 37434fb..de5b92d 100644 --- a/src/main/java/com/xdap/self_development/service/TemplateService.java +++ b/src/main/java/com/xdap/self_development/service/TemplateService.java @@ -8,6 +8,7 @@ import com.xdap.self_development.pojo.Template; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotBlank; import java.util.List; public interface TemplateService { @@ -28,4 +29,5 @@ public interface TemplateService { List