Commit 304aa30a5e57dcb99433c9db534cf4ff31e4245a
1 parent
5b29d5ff
feat: 代码评审修改
Showing
7 changed files
with
100 additions
and
103 deletions
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
| ... | ... | @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 6 | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | 7 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| 8 | 8 | import cn.iocoder.yudao.framework.common.util.number.NumberUtils; |
| 9 | +import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; | |
| 9 | 10 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; |
| 10 | 11 | import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; |
| 11 | 12 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO; |
| ... | ... | @@ -26,6 +27,7 @@ import jakarta.validation.Valid; |
| 26 | 27 | import org.flowable.engine.history.HistoricProcessInstance; |
| 27 | 28 | import org.flowable.engine.repository.ProcessDefinition; |
| 28 | 29 | import org.flowable.task.api.Task; |
| 30 | +import org.flowable.task.api.history.HistoricTaskInstance; | |
| 29 | 31 | import org.springframework.security.access.prepost.PreAuthorize; |
| 30 | 32 | import org.springframework.validation.annotation.Validated; |
| 31 | 33 | import org.springframework.web.bind.annotation.*; |
| ... | ... | @@ -34,9 +36,11 @@ import java.util.List; |
| 34 | 36 | import java.util.Map; |
| 35 | 37 | import java.util.Set; |
| 36 | 38 | |
| 39 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | |
| 37 | 40 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 38 | 41 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| 39 | 42 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| 43 | +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS; | |
| 40 | 44 | |
| 41 | 45 | @Tag(name = "管理后台 - 流程实例") // 流程实例,通过流程定义创建的一次“申请” |
| 42 | 46 | @RestController |
| ... | ... | @@ -203,7 +207,19 @@ public class BpmProcessInstanceController { |
| 203 | 207 | @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") |
| 204 | 208 | public CommonResult<BpmProcessPrintDataRespVO> getProcessInstancePrintData( |
| 205 | 209 | @RequestParam("processInstanceId") String processInstanceId) { |
| 206 | - return success(processInstanceService.getProcessInstancePrintData(getLoginUserId(), processInstanceId)); | |
| 210 | + HistoricProcessInstance historicProcessInstance = processInstanceService.getHistoricProcessInstance(processInstanceId); | |
| 211 | + if (historicProcessInstance == null) { | |
| 212 | + throw exception(PROCESS_INSTANCE_NOT_EXISTS); | |
| 213 | + } | |
| 214 | + AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(historicProcessInstance.getStartUserId())); | |
| 215 | + DeptRespDTO dept = deptApi.getDept(startUser.getDeptId()); | |
| 216 | + List<HistoricTaskInstance> tasks = taskService.getFinishedTaskListByProcessInstanceIdWithoutCancel(processInstanceId); | |
| 217 | + Set<Long> userIds = convertSet(tasks, item -> Long.valueOf(item.getAssignee())); | |
| 218 | + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); | |
| 219 | + return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePrintData(historicProcessInstance, | |
| 220 | + processDefinitionService.getProcessDefinitionInfo(historicProcessInstance.getProcessDefinitionId()), | |
| 221 | + tasks, userMap, | |
| 222 | + new UserSimpleBaseVO().setNickname(startUser.getNickname()).setDeptName(dept.getName()))); | |
| 207 | 223 | } |
| 208 | 224 | |
| 209 | 225 | } | ... | ... |
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java
| ... | ... | @@ -11,43 +11,28 @@ import java.util.Map; |
| 11 | 11 | @Data |
| 12 | 12 | public class BpmProcessPrintDataRespVO { |
| 13 | 13 | |
| 14 | - private Boolean printTemplateEnable; | |
| 15 | - | |
| 16 | - // TODO @lesan:要不 processStatus、processInstanceId、processBusinessKey、processBusinessKey、startUser、endTime、processVariables 使用 BpmProcessInstanceRespVO ?虽然这个 VO 大了点,但是收一收字段。嘿嘿;进而只有 processInstance、tasks、formFields、printTemplateHtml 这些字段; | |
| 17 | - private Integer processStatus; | |
| 18 | - | |
| 19 | - private String processInstanceId; | |
| 20 | - | |
| 21 | - private String processBusinessKey; | |
| 22 | - | |
| 23 | - private String processName; | |
| 24 | - | |
| 25 | - private UserSimpleBaseVO startUser; | |
| 14 | + @Schema(description = "流程实例数据") | |
| 15 | + private BpmProcessInstanceRespVO processInstance; | |
| 26 | 16 | |
| 27 | - private String startTime; | |
| 28 | - | |
| 29 | - private String endTime; | |
| 30 | - | |
| 31 | - // TODO @lesan:变量要不改成 tasks; | |
| 32 | - private List<ApproveNode> approveNodes; | |
| 33 | - | |
| 34 | - private List<String> formFields; | |
| 17 | + @Schema(description = "是否开启自定义打印模板") | |
| 18 | + private Boolean printTemplateEnable; | |
| 35 | 19 | |
| 20 | + @Schema(description = "自定义打印模板HTML") | |
| 36 | 21 | private String printTemplateHtml; |
| 37 | 22 | |
| 38 | - private Map<String, Object> processVariables; | |
| 23 | + @Schema(description = "审批任务列表") | |
| 24 | + private List<ApproveTask> tasks; | |
| 39 | 25 | |
| 40 | - // TODO @lesan:类名要不要改成 tasks ?然后 id、name、signUrl、description;感觉理解成本低点; | |
| 41 | 26 | @Data |
| 42 | - public static class ApproveNode { | |
| 27 | + public static class ApproveTask { | |
| 43 | 28 | |
| 44 | - private String nodeName; | |
| 29 | + private String id; | |
| 45 | 30 | |
| 46 | - private String nodeDesc; | |
| 31 | + private String name; | |
| 47 | 32 | |
| 48 | - private String signUrl; | |
| 33 | + private String description; | |
| 49 | 34 | |
| 50 | - private String nodeId; | |
| 35 | + private String signUrl; | |
| 51 | 36 | |
| 52 | 37 | } |
| 53 | 38 | ... | ... |
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java
| 1 | 1 | package cn.iocoder.yudao.module.bpm.convert.task; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | +import cn.hutool.core.date.DateUtil; | |
| 4 | 5 | import cn.hutool.core.util.StrUtil; |
| 5 | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | 7 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| 7 | 8 | import cn.iocoder.yudao.framework.common.util.collection.SetUtils; |
| 9 | +import cn.iocoder.yudao.framework.common.util.date.DateUtils; | |
| 8 | 10 | import cn.iocoder.yudao.framework.common.util.number.NumberUtils; |
| 9 | 11 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 10 | 12 | import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; |
| 13 | +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; | |
| 11 | 14 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; |
| 12 | 15 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; |
| 13 | 16 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO; |
| 14 | 17 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceBpmnModelViewRespVO; |
| 15 | 18 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; |
| 19 | +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessPrintDataRespVO; | |
| 16 | 20 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; |
| 17 | 21 | import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert; |
| 18 | 22 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO; |
| 19 | 23 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; |
| 20 | 24 | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| 25 | +import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum; | |
| 26 | +import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; | |
| 21 | 27 | import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; |
| 22 | 28 | import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; |
| 23 | 29 | import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; |
| ... | ... | @@ -35,10 +41,7 @@ import org.mapstruct.Mapping; |
| 35 | 41 | import org.mapstruct.MappingTarget; |
| 36 | 42 | import org.mapstruct.factory.Mappers; |
| 37 | 43 | |
| 38 | -import java.util.HashSet; | |
| 39 | -import java.util.List; | |
| 40 | -import java.util.Map; | |
| 41 | -import java.util.Set; | |
| 44 | +import java.util.*; | |
| 42 | 45 | |
| 43 | 46 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| 44 | 47 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| ... | ... | @@ -292,4 +295,49 @@ public interface BpmProcessInstanceConvert { |
| 292 | 295 | .setActivityNodes(activityNodes); |
| 293 | 296 | } |
| 294 | 297 | |
| 298 | + default BpmProcessPrintDataRespVO buildProcessInstancePrintData(HistoricProcessInstance historicProcessInstance, | |
| 299 | + BpmProcessDefinitionInfoDO processDefinitionInfo, | |
| 300 | + List<HistoricTaskInstance> tasks, | |
| 301 | + Map<Long, AdminUserRespDTO> userMap, | |
| 302 | + UserSimpleBaseVO startUser) { | |
| 303 | + BpmModelMetaInfoVO.PrintTemplateSetting printTemplateSetting = processDefinitionInfo.getPrintTemplateSetting(); | |
| 304 | + BpmProcessPrintDataRespVO printData = new BpmProcessPrintDataRespVO(); | |
| 305 | + // 打印模板是否开启 | |
| 306 | + printData.setPrintTemplateEnable(printTemplateSetting != null && Boolean.TRUE.equals(printTemplateSetting.getEnable())); | |
| 307 | + // 流程相关数据 | |
| 308 | + BpmProcessInstanceRespVO processInstance = new BpmProcessInstanceRespVO(); | |
| 309 | + processInstance.setStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance)); | |
| 310 | + processInstance.setId(historicProcessInstance.getId()); | |
| 311 | + processInstance.setName(historicProcessInstance.getName()); | |
| 312 | + processInstance.setBusinessKey(historicProcessInstance.getBusinessKey()); | |
| 313 | + processInstance.setStartTime(DateUtils.of(historicProcessInstance.getStartTime())); | |
| 314 | + processInstance.setEndTime(DateUtils.of(historicProcessInstance.getEndTime())); | |
| 315 | + processInstance.setFormVariables(historicProcessInstance.getProcessVariables()); | |
| 316 | + processInstance.setStartUser(startUser); | |
| 317 | + processInstance.setProcessDefinition(BeanUtils.toBean(processDefinitionInfo, BpmProcessDefinitionRespVO.class)); | |
| 318 | + printData.setProcessInstance(processInstance); | |
| 319 | + // 审批历史 | |
| 320 | + List<BpmProcessPrintDataRespVO.ApproveTask> approveTasks = new ArrayList<>(tasks.size()); | |
| 321 | + tasks.forEach(item -> { | |
| 322 | + Map<String, Object> taskLocalVariables = item.getTaskLocalVariables(); | |
| 323 | + BpmProcessPrintDataRespVO.ApproveTask approveTask = new BpmProcessPrintDataRespVO.ApproveTask(); | |
| 324 | + approveTask.setName(item.getName()); | |
| 325 | + approveTask.setId(item.getId()); | |
| 326 | + approveTask.setSignUrl((String) taskLocalVariables.getOrDefault(BpmnVariableConstants.TASK_SIGN_PIC_URL, "")); | |
| 327 | + approveTask.setDescription(StrUtil.format("{} / {} / {} / {} / {}", | |
| 328 | + userMap.get(Long.valueOf(item.getAssignee())).getNickname(), | |
| 329 | + item.getName(), | |
| 330 | + DateUtil.formatDateTime(item.getEndTime()), | |
| 331 | + BpmTaskStatusEnum.valueOf((Integer) taskLocalVariables.get(BpmnVariableConstants.TASK_VARIABLE_STATUS)).getName(), | |
| 332 | + taskLocalVariables.get(BpmnVariableConstants.TASK_VARIABLE_REASON))); | |
| 333 | + approveTasks.add(approveTask); | |
| 334 | + }); | |
| 335 | + printData.setTasks(approveTasks); | |
| 336 | + // 自定义模板 | |
| 337 | + if (printData.getPrintTemplateEnable() && printTemplateSetting != null) { | |
| 338 | + printData.setPrintTemplateHtml(printTemplateSetting.getTemplate()); | |
| 339 | + } | |
| 340 | + return printData; | |
| 341 | + } | |
| 342 | + | |
| 295 | 343 | } | ... | ... |
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java
| ... | ... | @@ -113,14 +113,6 @@ public interface BpmProcessInstanceService { |
| 113 | 113 | */ |
| 114 | 114 | BpmProcessInstanceBpmnModelViewRespVO getProcessInstanceBpmnModelView(String id); |
| 115 | 115 | |
| 116 | - /** | |
| 117 | - * 获取流程打印所需数据 | |
| 118 | - * @param loginUserId 打印人 | |
| 119 | - * @param processInstanceId 流程实例id | |
| 120 | - * @return 打印所需数据 | |
| 121 | - */ | |
| 122 | - BpmProcessPrintDataRespVO getProcessInstancePrintData(Long loginUserId, String processInstanceId); | |
| 123 | - | |
| 124 | 116 | // ========== Update 写入相关方法 ========== |
| 125 | 117 | |
| 126 | 118 | /** | ... | ... |
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
| ... | ... | @@ -728,69 +728,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService |
| 728 | 728 | userMap, deptMap); |
| 729 | 729 | } |
| 730 | 730 | |
| 731 | - // TODO @lesan:这个可以放在 controller + convert 哇?保证 Service 只尽量处理写逻辑; | |
| 732 | - @Override | |
| 733 | - public BpmProcessPrintDataRespVO getProcessInstancePrintData(Long loginUserId, String processInstanceId) { | |
| 734 | - // 1 数据准备 | |
| 735 | - HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(processInstanceId); | |
| 736 | - if (historicProcessInstance == null) { | |
| 737 | - throw exception(PROCESS_INSTANCE_NOT_EXISTS); | |
| 738 | - } | |
| 739 | - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService | |
| 740 | - .getProcessDefinitionInfo(historicProcessInstance.getProcessDefinitionId()); | |
| 741 | - BpmModelMetaInfoVO.PrintTemplateSetting printTemplateSetting = processDefinitionInfo.getPrintTemplateSetting(); | |
| 742 | - // 2 获取打印所需数据 | |
| 743 | - BpmProcessPrintDataRespVO printData = new BpmProcessPrintDataRespVO(); | |
| 744 | - // 2.1 打印模板是否开启 | |
| 745 | - printData.setPrintTemplateEnable(printTemplateSetting != null && Boolean.TRUE.equals(printTemplateSetting.getEnable())); | |
| 746 | - // 2.2 流程相关数据 | |
| 747 | - printData.setProcessStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance)); | |
| 748 | - printData.setProcessInstanceId(historicProcessInstance.getId()); | |
| 749 | - printData.setProcessName(historicProcessInstance.getName()); | |
| 750 | - printData.setProcessBusinessKey(historicProcessInstance.getBusinessKey()); | |
| 751 | - printData.setStartTime(DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(historicProcessInstance.getStartTime())); | |
| 752 | - printData.setEndTime(Objects.isNull(historicProcessInstance.getEndTime()) ? | |
| 753 | - "" : DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(historicProcessInstance.getEndTime())); | |
| 754 | - printData.setProcessVariables(historicProcessInstance.getProcessVariables()); | |
| 755 | - // 2.3 发起人 | |
| 756 | - AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(historicProcessInstance.getStartUserId())); | |
| 757 | - DeptRespDTO dept = deptApi.getDept(startUser.getDeptId()); | |
| 758 | - printData.setStartUser(new UserSimpleBaseVO().setNickname(startUser.getNickname()).setDeptName(dept.getName())); | |
| 759 | - // 2.4 审批历史 | |
| 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); | |
| 769 | - List<BpmProcessPrintDataRespVO.ApproveNode> approveNodes = new ArrayList<>(tasks.size()); | |
| 770 | - tasks.forEach(item -> { | |
| 771 | - Map<String, Object> taskLocalVariables = item.getTaskLocalVariables(); | |
| 772 | - BpmProcessPrintDataRespVO.ApproveNode approveNode = new BpmProcessPrintDataRespVO.ApproveNode(); | |
| 773 | - approveNode.setNodeName(item.getName()); | |
| 774 | - approveNode.setNodeId(item.getId()); | |
| 775 | - approveNode.setSignUrl((String) taskLocalVariables.getOrDefault(BpmnVariableConstants.TASK_SIGN_PIC_URL, "")); | |
| 776 | - approveNode.setNodeDesc(StrUtil.format("{} / {} / {} / {} / {}", | |
| 777 | - userMap.get(Long.valueOf(item.getAssignee())).getNickname(), | |
| 778 | - item.getName(), | |
| 779 | - DateUtil.formatDateTime(item.getEndTime()), | |
| 780 | - BpmTaskStatusEnum.valueOf((Integer) taskLocalVariables.get(BpmnVariableConstants.TASK_VARIABLE_STATUS)).getName(), | |
| 781 | - taskLocalVariables.get(BpmnVariableConstants.TASK_VARIABLE_REASON))); | |
| 782 | - approveNodes.add(approveNode); | |
| 783 | - }); | |
| 784 | - printData.setApproveNodes(approveNodes); | |
| 785 | - // 2.5 表单数据 | |
| 786 | - printData.setFormFields(processDefinitionInfo.getFormFields()); | |
| 787 | - // 2.6 自定义模板 | |
| 788 | - if (printData.getPrintTemplateEnable() && printTemplateSetting != null) { | |
| 789 | - printData.setPrintTemplateHtml(printTemplateSetting.getTemplate()); | |
| 790 | - } | |
| 791 | - return printData; | |
| 792 | - } | |
| 793 | - | |
| 794 | 731 | // ========== Update 写入相关方法 ========== |
| 795 | 732 | |
| 796 | 733 | @Override | ... | ... |
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
| ... | ... | @@ -176,6 +176,14 @@ public interface BpmTaskService { |
| 176 | 176 | */ |
| 177 | 177 | List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId); |
| 178 | 178 | |
| 179 | + /** | |
| 180 | + * 获得指定流程实例的已完成的流程任务列表,不包含取消状态 | |
| 181 | + * | |
| 182 | + * @param processInstanceId 流程实例的编号 | |
| 183 | + * @return 流程任务列表 | |
| 184 | + */ | |
| 185 | + List<HistoricTaskInstance> getFinishedTaskListByProcessInstanceIdWithoutCancel(String processInstanceId); | |
| 186 | + | |
| 179 | 187 | // ========== Update 写入相关方法 ========== |
| 180 | 188 | |
| 181 | 189 | /** | ... | ... |
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
| ... | ... | @@ -491,6 +491,17 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 491 | 491 | return historyService.createHistoricActivityInstanceQuery().executionId(executionId).list(); |
| 492 | 492 | } |
| 493 | 493 | |
| 494 | + @Override | |
| 495 | + public List<HistoricTaskInstance> getFinishedTaskListByProcessInstanceIdWithoutCancel(String processInstanceId) { | |
| 496 | + return historyService.createHistoricTaskInstanceQuery() | |
| 497 | + .finished() | |
| 498 | + .includeTaskLocalVariables() | |
| 499 | + .processInstanceId(processInstanceId) | |
| 500 | + .taskVariableValueNotEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS, | |
| 501 | + BpmTaskStatusEnum.CANCEL.getStatus()) | |
| 502 | + .orderByHistoricTaskInstanceStartTime().asc().list(); | |
| 503 | + } | |
| 504 | + | |
| 494 | 505 | /** |
| 495 | 506 | * 判断指定用户,是否是当前任务的审批人 |
| 496 | 507 | * | ... | ... |