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 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 4 import io.swagger.v3.oas.annotations.media.Schema;
4 5 import lombok.Data;
5 6  
6 7 import java.util.List;
  8 +import java.util.Map;
7 9  
8   -// TODO @lesan:这个可能复用 BpmApprovalDetailRespVO 哇?
  10 +// TODO @lesan:这个可能复用 BpmApprovalDetailRespVO 哇?@芋艿:暂时先这样吧,BpmApprovalDetailRespVO 太大了。。。
9 11 @Schema(description = "管理后台 - 流程实例的打印数据 Response VO")
10 12 @Data
11 13 public class BpmProcessPrintDataRespVO {
... ... @@ -14,28 +16,26 @@ public class BpmProcessPrintDataRespVO {
14 16  
15 17 private Integer processStatus;
16 18  
17   - // TODO @lesan:通过字典?
18   - private String processStatusShow;
19   -
20 19 private String processInstanceId;
21 20  
22 21 private String processBusinessKey;
23 22  
24 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 27 private String startTime;
32 28  
  29 + private String endTime;
  30 +
33 31 private List<ApproveNode> approveNodes;
34 32  
35   - private List<FormField> formFields;
  33 + private List<String> formFields;
36 34  
37 35 private String printTemplateHtml;
38 36  
  37 + private Map<String, Object> processVariables;
  38 +
39 39 @Data
40 40 public static class ApproveNode {
41 41  
... ... @@ -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 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.collection.ListUtil;
5 5 import cn.hutool.core.date.DatePattern;
6   -import cn.hutool.core.date.DateTime;
7 6 import cn.hutool.core.date.DateUtil;
8 7 import cn.hutool.core.lang.Assert;
9 8 import cn.hutool.core.util.*;
10   -import cn.hutool.json.JSONObject;
11   -import cn.hutool.json.JSONUtil;
12 9 import cn.iocoder.yudao.framework.common.pojo.PageResult;
13 10 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
14 11 import cn.iocoder.yudao.framework.common.util.date.DateUtils;
... ... @@ -16,6 +13,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
16 13 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
17 14 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
18 15 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
  16 +import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
19 17 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO;
20 18 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
21 19 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
... ... @@ -61,10 +59,6 @@ import org.flowable.engine.runtime.ProcessInstance;
61 59 import org.flowable.engine.runtime.ProcessInstanceBuilder;
62 60 import org.flowable.task.api.Task;
63 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 62 import org.springframework.context.annotation.Lazy;
69 63 import org.springframework.stereotype.Service;
70 64 import org.springframework.transaction.annotation.Transactional;
... ... @@ -736,48 +730,42 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
736 730  
737 731 @Override
738 732 public BpmProcessPrintDataRespVO getProcessInstancePrintData(Long loginUserId, String processInstanceId) {
739   - // TODO 方法抽离
740   - // 流程实例
  733 + // 1 数据准备
741 734 HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(processInstanceId);
742 735 if (historicProcessInstance == null) {
743 736 throw exception(PROCESS_INSTANCE_NOT_EXISTS);
744 737 }
745   - // 准备数据
746 738 BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService
747 739 .getProcessDefinitionInfo(historicProcessInstance.getProcessDefinitionId());
748 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 742 BpmProcessPrintDataRespVO printData = new BpmProcessPrintDataRespVO();
765   - // 打印模板是否开启
  743 + // 2.1 打印模板是否开启
766 744 printData.setPrintTemplateEnable(printTemplateSetting != null && Boolean.TRUE.equals(printTemplateSetting.getEnable()));
767   - // 流程相关数据
  745 + // 2.2 流程相关数据
768 746 printData.setProcessStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance));
769   - printData.setProcessStatusShow(BpmProcessInstanceStatusEnum.valueOf(printData.getProcessStatus()).getDesc());
770 747 printData.setProcessInstanceId(historicProcessInstance.getId());
771 748 printData.setProcessName(historicProcessInstance.getName());
772 749 printData.setProcessBusinessKey(historicProcessInstance.getBusinessKey());
773 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 755 AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(historicProcessInstance.getStartUserId()));
776 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 769 List<BpmProcessPrintDataRespVO.ApproveNode> approveNodes = new ArrayList<>(tasks.size());
782 770 tasks.forEach(item -> {
783 771 Map<String, Object> taskLocalVariables = item.getTaskLocalVariables();
... ... @@ -794,81 +782,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
794 782 approveNodes.add(approveNode);
795 783 });
796 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 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 791 return printData;
874 792 }
... ...