Commit a8223738db55f846c622b882b10fd0eb72fe1435

Authored by Lesan
1 parent 9b426436

feat: 代码评审修改

yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java
1 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; 1 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance;
2 2
  3 +import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
3 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 5 import lombok.Data;
5 6
6 import java.util.List; 7 import java.util.List;
  8 +import java.util.Map;
7 9
8 -// TODO @lesan:这个可能复用 BpmApprovalDetailRespVO 哇? 10 +// TODO @lesan:这个可能复用 BpmApprovalDetailRespVO 哇?@芋艿:暂时先这样吧,BpmApprovalDetailRespVO 太大了。。。
9 @Schema(description = "管理后台 - 流程实例的打印数据 Response VO") 11 @Schema(description = "管理后台 - 流程实例的打印数据 Response VO")
10 @Data 12 @Data
11 public class BpmProcessPrintDataRespVO { 13 public class BpmProcessPrintDataRespVO {
@@ -14,28 +16,26 @@ public class BpmProcessPrintDataRespVO { @@ -14,28 +16,26 @@ public class BpmProcessPrintDataRespVO {
14 16
15 private Integer processStatus; 17 private Integer processStatus;
16 18
17 - // TODO @lesan:通过字典?  
18 - private String processStatusShow;  
19 -  
20 private String processInstanceId; 19 private String processInstanceId;
21 20
22 private String processBusinessKey; 21 private String processBusinessKey;
23 22
24 private String processName; 23 private String processName;
25 24
26 - // TODO @lesan:UserSimpleBaseVO 替代 startUser、startUserDept;  
27 - private String startUser;  
28 -  
29 - private String startUserDept; 25 + private UserSimpleBaseVO startUser;
30 26
31 private String startTime; 27 private String startTime;
32 28
  29 + private String endTime;
  30 +
33 private List<ApproveNode> approveNodes; 31 private List<ApproveNode> approveNodes;
34 32
35 - private List<FormField> formFields; 33 + private List<String> formFields;
36 34
37 private String printTemplateHtml; 35 private String printTemplateHtml;
38 36
  37 + private Map<String, Object> processVariables;
  38 +
39 @Data 39 @Data
40 public static class ApproveNode { 40 public static class ApproveNode {
41 41
@@ -49,19 +49,4 @@ public class BpmProcessPrintDataRespVO { @@ -49,19 +49,4 @@ public class BpmProcessPrintDataRespVO {
49 49
50 } 50 }
51 51
52 - @Data  
53 - public static class FormField {  
54 -  
55 - private String formId;  
56 -  
57 - private String formName;  
58 -  
59 - private String formType;  
60 -  
61 - private String formValue;  
62 -  
63 - private String formValueShow;  
64 -  
65 - }  
66 -  
67 } 52 }
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
@@ -3,12 +3,9 @@ package cn.iocoder.yudao.module.bpm.service.task; @@ -3,12 +3,9 @@ package cn.iocoder.yudao.module.bpm.service.task;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.ListUtil; 4 import cn.hutool.core.collection.ListUtil;
5 import cn.hutool.core.date.DatePattern; 5 import cn.hutool.core.date.DatePattern;
6 -import cn.hutool.core.date.DateTime;  
7 import cn.hutool.core.date.DateUtil; 6 import cn.hutool.core.date.DateUtil;
8 import cn.hutool.core.lang.Assert; 7 import cn.hutool.core.lang.Assert;
9 import cn.hutool.core.util.*; 8 import cn.hutool.core.util.*;
10 -import cn.hutool.json.JSONObject;  
11 -import cn.hutool.json.JSONUtil;  
12 import cn.iocoder.yudao.framework.common.pojo.PageResult; 9 import cn.iocoder.yudao.framework.common.pojo.PageResult;
13 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 10 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
14 import cn.iocoder.yudao.framework.common.util.date.DateUtils; 11 import cn.iocoder.yudao.framework.common.util.date.DateUtils;
@@ -16,6 +13,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; @@ -16,6 +13,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
16 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; 13 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
17 import cn.iocoder.yudao.framework.common.util.object.PageUtils; 14 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
18 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; 15 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
  16 +import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
19 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; 17 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO;
20 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; 18 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
21 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; 19 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
@@ -61,10 +59,6 @@ import org.flowable.engine.runtime.ProcessInstance; @@ -61,10 +59,6 @@ import org.flowable.engine.runtime.ProcessInstance;
61 import org.flowable.engine.runtime.ProcessInstanceBuilder; 59 import org.flowable.engine.runtime.ProcessInstanceBuilder;
62 import org.flowable.task.api.Task; 60 import org.flowable.task.api.Task;
63 import org.flowable.task.api.history.HistoricTaskInstance; 61 import org.flowable.task.api.history.HistoricTaskInstance;
64 -import org.jsoup.Jsoup;  
65 -import org.jsoup.nodes.Document;  
66 -import org.jsoup.nodes.Element;  
67 -import org.jsoup.select.Elements;  
68 import org.springframework.context.annotation.Lazy; 62 import org.springframework.context.annotation.Lazy;
69 import org.springframework.stereotype.Service; 63 import org.springframework.stereotype.Service;
70 import org.springframework.transaction.annotation.Transactional; 64 import org.springframework.transaction.annotation.Transactional;
@@ -736,48 +730,42 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -736,48 +730,42 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
736 730
737 @Override 731 @Override
738 public BpmProcessPrintDataRespVO getProcessInstancePrintData(Long loginUserId, String processInstanceId) { 732 public BpmProcessPrintDataRespVO getProcessInstancePrintData(Long loginUserId, String processInstanceId) {
739 - // TODO 方法抽离  
740 - // 流程实例 733 + // 1 数据准备
741 HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(processInstanceId); 734 HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(processInstanceId);
742 if (historicProcessInstance == null) { 735 if (historicProcessInstance == null) {
743 throw exception(PROCESS_INSTANCE_NOT_EXISTS); 736 throw exception(PROCESS_INSTANCE_NOT_EXISTS);
744 } 737 }
745 - // 准备数据  
746 BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService 738 BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService
747 .getProcessDefinitionInfo(historicProcessInstance.getProcessDefinitionId()); 739 .getProcessDefinitionInfo(historicProcessInstance.getProcessDefinitionId());
748 BpmModelMetaInfoVO.PrintTemplateSetting printTemplateSetting = processDefinitionInfo.getPrintTemplateSetting(); 740 BpmModelMetaInfoVO.PrintTemplateSetting printTemplateSetting = processDefinitionInfo.getPrintTemplateSetting();
749 - List<String> formFieldList = processDefinitionInfo.getFormFields();  
750 - List<JSONObject> formFieldObjList = formFieldList != null ? formFieldList.stream().map(JSONUtil::parseObj).toList()  
751 - : ListUtil.of();  
752 - List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()  
753 - .finished()  
754 - .includeTaskLocalVariables()  
755 - .processInstanceId(processInstanceId)  
756 - .taskVariableValueNotEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS,  
757 - BpmTaskStatusEnum.CANCEL.getStatus())  
758 - .orderByHistoricTaskInstanceStartTime().asc().list();  
759 - Set<Long> userIds = convertSet(tasks, item -> Long.valueOf(item.getAssignee()));  
760 - userIds.add(loginUserId);  
761 - Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);  
762 - HashMap<String, String> printDataMap = new HashMap<>(8 + formFieldObjList.size());  
763 - // 返回打印所需数据 741 + // 2 获取打印所需数据
764 BpmProcessPrintDataRespVO printData = new BpmProcessPrintDataRespVO(); 742 BpmProcessPrintDataRespVO printData = new BpmProcessPrintDataRespVO();
765 - // 打印模板是否开启 743 + // 2.1 打印模板是否开启
766 printData.setPrintTemplateEnable(printTemplateSetting != null && Boolean.TRUE.equals(printTemplateSetting.getEnable())); 744 printData.setPrintTemplateEnable(printTemplateSetting != null && Boolean.TRUE.equals(printTemplateSetting.getEnable()));
767 - // 流程相关数据 745 + // 2.2 流程相关数据
768 printData.setProcessStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance)); 746 printData.setProcessStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance));
769 - printData.setProcessStatusShow(BpmProcessInstanceStatusEnum.valueOf(printData.getProcessStatus()).getDesc());  
770 printData.setProcessInstanceId(historicProcessInstance.getId()); 747 printData.setProcessInstanceId(historicProcessInstance.getId());
771 printData.setProcessName(historicProcessInstance.getName()); 748 printData.setProcessName(historicProcessInstance.getName());
772 printData.setProcessBusinessKey(historicProcessInstance.getBusinessKey()); 749 printData.setProcessBusinessKey(historicProcessInstance.getBusinessKey());
773 printData.setStartTime(DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(historicProcessInstance.getStartTime())); 750 printData.setStartTime(DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(historicProcessInstance.getStartTime()));
774 - // 发起人 751 + printData.setEndTime(Objects.isNull(historicProcessInstance.getEndTime()) ?
  752 + "" : DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(historicProcessInstance.getEndTime()));
  753 + printData.setProcessVariables(historicProcessInstance.getProcessVariables());
  754 + // 2.3 发起人
775 AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(historicProcessInstance.getStartUserId())); 755 AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(historicProcessInstance.getStartUserId()));
776 DeptRespDTO dept = deptApi.getDept(startUser.getDeptId()); 756 DeptRespDTO dept = deptApi.getDept(startUser.getDeptId());
777 - printData.setStartUser(startUser.getNickname());  
778 - printData.setStartUserDept(dept.getName());  
779 - // 审批历史  
780 - // TODO @lesan:打印的时候,未来节点打印么? 757 + printData.setStartUser(new UserSimpleBaseVO().setNickname(startUser.getNickname()).setDeptName(dept.getName()));
  758 + // 2.4 审批历史
  759 + // TODO @lesan:打印的时候,未来节点打印么? @芋艿:只打印已完成的任务
  760 + List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()
  761 + .finished()
  762 + .includeTaskLocalVariables()
  763 + .processInstanceId(processInstanceId)
  764 + .taskVariableValueNotEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS,
  765 + BpmTaskStatusEnum.CANCEL.getStatus())
  766 + .orderByHistoricTaskInstanceStartTime().asc().list();
  767 + Set<Long> userIds = convertSet(tasks, item -> Long.valueOf(item.getAssignee()));
  768 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
781 List<BpmProcessPrintDataRespVO.ApproveNode> approveNodes = new ArrayList<>(tasks.size()); 769 List<BpmProcessPrintDataRespVO.ApproveNode> approveNodes = new ArrayList<>(tasks.size());
782 tasks.forEach(item -> { 770 tasks.forEach(item -> {
783 Map<String, Object> taskLocalVariables = item.getTaskLocalVariables(); 771 Map<String, Object> taskLocalVariables = item.getTaskLocalVariables();
@@ -794,81 +782,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -794,81 +782,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
794 approveNodes.add(approveNode); 782 approveNodes.add(approveNode);
795 }); 783 });
796 printData.setApproveNodes(approveNodes); 784 printData.setApproveNodes(approveNodes);
797 - // 表单数据  
798 - // TODO @lesan:这个可以在端上搞么?主要考虑,vben 和 vue3 plus 可能使用了不同的前端框架;可能直接使用 form-create 前端的工具方法,会更方便。  
799 - Map<String, Object> processVariables = historicProcessInstance.getProcessVariables();  
800 - List<BpmProcessPrintDataRespVO.FormField> formFields = new ArrayList<>(formFieldObjList.size());  
801 - formFieldObjList.forEach(item -> {  
802 - BpmProcessPrintDataRespVO.FormField formField = new BpmProcessPrintDataRespVO.FormField();  
803 - formField.setFormName(item.getStr("title"));  
804 - formField.setFormType(item.getStr("type"));  
805 - formField.setFormId(item.getStr("field"));  
806 - formField.setFormValue(processVariables.getOrDefault(item.getStr("field"), "").toString());  
807 - // TODO 根据不同类型的表单展示,下面为图片和输入框示例  
808 - if (formField.getFormType().equals("input")) {  
809 - formField.setFormValueShow(processVariables.getOrDefault(item.getStr("field"), "").toString());  
810 - } else if (formField.getFormType().equals("UploadImg")) {  
811 - formField.setFormValueShow("<img style=\"max-width: 600px\" src=\"" + processVariables.getOrDefault(item.getStr("field"), "").toString() + "\" />");  
812 - } else {  
813 - formField.setFormValueShow("此类型表单展示未完善");  
814 - }  
815 - printDataMap.put(formField.getFormId(), formField.getFormValueShow());  
816 - formFields.add(formField);  
817 - });  
818 - printData.setFormFields(formFields);  
819 - // 数据映射  
820 - printDataMap.put("processName", printData.getProcessName());  
821 - printDataMap.put("printUsername", userMap.get(loginUserId).getNickname());  
822 - printDataMap.put("processNum", printData.getProcessInstanceId());  
823 - printDataMap.put("printTime", DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(new DateTime()));  
824 - printDataMap.put("startUser", printData.getStartUser());  
825 - printDataMap.put("startTime", printData.getStartTime());  
826 - printDataMap.put("startUserDept", printData.getStartUserDept());  
827 - printDataMap.put("processStatus", printData.getProcessStatusShow());  
828 - // 自定义模板 785 + // 2.5 表单数据
  786 + printData.setFormFields(processDefinitionInfo.getFormFields());
  787 + // 2.6 自定义模板
829 if (printData.getPrintTemplateEnable() && printTemplateSetting != null) { 788 if (printData.getPrintTemplateEnable() && printTemplateSetting != null) {
830 - Document document = Jsoup.parse(printTemplateSetting.getTemplate());  
831 - // 添加table的border  
832 - Elements tables = document.select("table");  
833 - tables.forEach(item -> {  
834 - item.attr("border", "1");  
835 - });  
836 - // 替换所有mention  
837 - Elements mention = document.getElementsByAttributeValue("data-w-e-type", "mention");  
838 - mention.forEach(item -> {  
839 - String mentionId = JSONUtil.parseObj(URLUtil.decode(item.attr("data-info"))).getStr("id");  
840 - // TODO @lesan:这里要求非空;  
841 - item.html(printDataMap.get(mentionId));  
842 - });  
843 - // 替换流程记录  
844 - Elements processRecords = document.getElementsByAttributeValue("data-w-e-type", "process-record");  
845 - Element processRecordElement = null;  
846 - if (!processRecords.isEmpty()) {  
847 - processRecordElement = new Element("table", "")  
848 - .attr("style", "width:100%;")  
849 - .attr("border", "1");  
850 - Element tbody = new Element("tbody", "");  
851 - Element rowHead = new Element("tr", "");  
852 - rowHead.appendChild(new Element("td", "")  
853 - .attr("colspan", "2")  
854 - .attr("width", "auto")  
855 - .attr("style", "text-align: center;")  
856 - .html("流程节点"));  
857 - tbody.appendChild(rowHead);  
858 - for (BpmProcessPrintDataRespVO.ApproveNode item : printData.getApproveNodes()) {  
859 - Element row = new Element("tr", "");  
860 - row.appendChild(new Element("td", "")  
861 - .html(item.getNodeName()));  
862 - row.appendChild(new Element("td", "")  
863 - .html(item.getNodeDesc()));  
864 - tbody.appendChild(row);  
865 - }  
866 - processRecordElement.appendChild(tbody);  
867 - }  
868 - for (Element item : processRecords) {  
869 - item.html(processRecordElement.outerHtml());  
870 - }  
871 - printData.setPrintTemplateHtml(document.html()); 789 + printData.setPrintTemplateHtml(printTemplateSetting.getTemplate());
872 } 790 }
873 return printData; 791 return printData;
874 } 792 }