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 | 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 | } | ... | ... |