Commit a8223738db55f846c622b882b10fd0eb72fe1435
1 parent
9b426436
feat: 代码评审修改
Showing
2 changed files
with
34 additions
and
131 deletions
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 | } |