From b24e024f386e7f25a071b58e9267a2c19f20ba1e Mon Sep 17 00:00:00 2001 From: luohairen <3399054449@qq.com> Date: 星期二, 10 十二月 2024 18:11:47 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- flowable/src/main/java/com/ycl/service/IFlowTaskService.java | 8 + business/src/main/java/com/ycl/domain/form/ProjectInfoForm.java | 3 business/src/main/java/com/ycl/domain/entity/ProjectInfo.java | 4 business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java | 9 flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java | 8 + business/src/main/java/com/ycl/controller/ProjectInfoController.java | 20 ++ business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java | 14 + business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java | 135 +++++++++------- flowable/src/main/java/com/ycl/service/common/TaskCommonService.java | 145 +++++++++++++++--- flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java | 91 ++++++++-- flowable/src/main/java/com/ycl/controller/FlowTaskController.java | 7 business/src/main/java/com/ycl/service/ProjectInfoService.java | 2 12 files changed, 330 insertions(+), 116 deletions(-) diff --git a/business/src/main/java/com/ycl/controller/ProjectInfoController.java b/business/src/main/java/com/ycl/controller/ProjectInfoController.java index b082e4d..963dfee 100644 --- a/business/src/main/java/com/ycl/controller/ProjectInfoController.java +++ b/business/src/main/java/com/ycl/controller/ProjectInfoController.java @@ -44,12 +44,14 @@ public Result add(@RequestBody @Validated(Add.class) ProjectInfoForm form) { return projectInfoService.add(form); } + @PostMapping("/document") @ApiOperation(value = "娣诲姞鐩稿叧鏂囦欢", notes = "娣诲姞鐩稿叧鏂囦欢") // @PreAuthorize("hasAuthority('projectInfo:add')") public Result addDoc(@RequestBody @Validated(Add.class) DocumentInfoForm form) { return projectInfoService.addDoc(form); } + @PutMapping @ApiOperation(value = "淇敼", notes = "淇敼") // @PreAuthorize("hasAuthority('projectInfo:edit')") @@ -84,12 +86,14 @@ public Result detail(@PathVariable("id") Integer id) { return projectInfoService.detail(id); } + @GetMapping("/document/{id}") @ApiOperation(value = "鐩稿叧鏂囦欢璇︽儏", notes = "鐩稿叧鏂囦欢璇︽儏") // @PreAuthorize("hasAuthority('projectInfo:detail')") public Result docDetail(@PathVariable("id") Integer id) { return projectInfoService.docDetail(id); } + @GetMapping("/list") // @PreAuthorize("hasAuthority('projectInfo:list')") @ApiOperation(value = "鍒楄〃", notes = "鍒楄〃") @@ -99,12 +103,15 @@ /** * 鐢熸垚椤圭洰缂栧彿 + * * @return 椤圭洰缂栧彿 */ @GetMapping("/getProjectCode") public Result generateProjectCode() { return Result.ok().data(ProjectCodeGenerator.generateProjectCode()); - }; + } + + ; @GetMapping("/getManagerFlag/{recordId}") public Result getManagerFlag(@PathVariable("recordId") Integer recordId) { @@ -113,17 +120,19 @@ /** * 瀵煎嚭妯℃澘 + * * @param response * @return */ @PostMapping("/export/template") public void exportTemplate(HttpServletResponse response) throws IOException { List<String> fieldList = new ArrayList<>(); - OutputExcelUtils.export(response, "瀵煎叆妯℃澘", "椤圭洰淇℃伅", null, ProjectExcelTemplate.class ,fieldList); + OutputExcelUtils.export(response, "瀵煎叆妯℃澘", "椤圭洰淇℃伅", null, ProjectExcelTemplate.class, fieldList); } /** * 椤圭洰瀵煎嚭 + * * @param response * @throws IOException */ @@ -131,4 +140,11 @@ public void export(HttpServletResponse response, ProjectExportQuery query) throws IOException { projectInfoService.export(response, query); } + + @PutMapping("usedStatus/{id}/{usedStatus}") + @ApiOperation(value = "淇敼浣跨敤鐘舵��", notes = "淇敼浣跨敤鐘舵��") +// @PreAuthorize("hasAuthority('projectInfo:edit')") + public Result updateUsedStatus(@PathVariable Integer id, @PathVariable Integer usedStatus) { + return projectInfoService.updateUsedStatus(id, usedStatus); + } } diff --git a/business/src/main/java/com/ycl/domain/entity/ProjectInfo.java b/business/src/main/java/com/ycl/domain/entity/ProjectInfo.java index 2029fa3..ce65b79 100644 --- a/business/src/main/java/com/ycl/domain/entity/ProjectInfo.java +++ b/business/src/main/java/com/ycl/domain/entity/ProjectInfo.java @@ -141,5 +141,7 @@ /** 鍒涘缓浜� */ private Long createBy; - + @TableField("used_status") + /** 浣跨敤鐘舵�侊紙0锛氳崏绋匡紝1锛氭彁浜�,2:瀹℃牳閫氳繃锛�-1锛氶┏鍥烇級 */ + private Integer usedStatus; } diff --git a/business/src/main/java/com/ycl/domain/form/ProjectInfoForm.java b/business/src/main/java/com/ycl/domain/form/ProjectInfoForm.java index 644de14..ac5a053 100644 --- a/business/src/main/java/com/ycl/domain/form/ProjectInfoForm.java +++ b/business/src/main/java/com/ycl/domain/form/ProjectInfoForm.java @@ -121,6 +121,9 @@ @ApiModelProperty("鑱旂郴鏂瑰紡") private String contact; + @ApiModelProperty("浣跨敤鐘舵��") + private Integer usedStatus; + public static ProjectInfo getEntityByForm(@NonNull ProjectInfoForm form, ProjectInfo entity) { if(entity == null) { entity = new ProjectInfo(); diff --git a/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java b/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java index 06a3d89..ec3b9e0 100644 --- a/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java +++ b/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java @@ -21,6 +21,11 @@ private String taskId; /** + * 浠诲姟瀹氫箟id + */ + private String taskDefinitionKey; + + /** * flowable娴佺▼瀹炰緥id */ private String processInsId; @@ -53,7 +58,7 @@ /** * 鍙戣捣浜篿d */ - private Long promoterId; + private String promoterId; /** * 鍙戣捣浜哄鍚� @@ -63,7 +68,7 @@ /** * 鍙戣捣浜哄崟浣� */ - private Long promoterUnitId; + private String promoterUnitId; /** * 鍙戣捣浜哄崟浣嶅悕绉� diff --git a/business/src/main/java/com/ycl/service/ProjectInfoService.java b/business/src/main/java/com/ycl/service/ProjectInfoService.java index e92b8b3..41fac95 100644 --- a/business/src/main/java/com/ycl/service/ProjectInfoService.java +++ b/business/src/main/java/com/ycl/service/ProjectInfoService.java @@ -82,4 +82,6 @@ Result getManagerFlag(Integer recordId); void export(HttpServletResponse response, ProjectExportQuery query) throws IOException; + + Result updateUsedStatus(Integer id, Integer usedStatus); } diff --git a/business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java index 420ff76..afe0041 100644 --- a/business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java +++ b/business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java @@ -464,12 +464,12 @@ //瀹℃壒璁″垝涔� item.setApprovalPlan(file.getOriginalName()); } - }else if(FileTypeEnum.DOCUMENT_INFO.equals(file.getType())){ + } else if (FileTypeEnum.DOCUMENT_INFO.equals(file.getType())) { if (file.getBusId().equals(item.getId())) { //鐩稿叧鏂囦功 item.setDocuments(file.getOriginalName()); } - }else if(FileTypeEnum.INVEST_POLICY.equals(file.getType())){ + } else if (FileTypeEnum.INVEST_POLICY.equals(file.getType())) { if (file.getBusId().equals(item.getPolicyId())) { //绗﹀悎浜т笟鏀跨瓥闄勪欢 item.setPolicyComplianceAttachment(file.getOriginalName()); @@ -536,4 +536,14 @@ } } } + + @Override + public Result updateUsedStatus(Integer id, Integer usedStatus) { + ProjectInfo entity = baseMapper.selectById(id); + // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊 + Assert.notNull(entity, "璁板綍涓嶅瓨鍦�"); + entity.setUsedStatus(usedStatus); + baseMapper.updateById(entity); + return Result.ok("鍒犻櫎鎴愬姛"); + } } diff --git a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java index 50f95df..71e3bcc 100644 --- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java +++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java @@ -29,6 +29,7 @@ import com.ycl.domain.form.ProjectProcessForm; import com.ycl.domain.vo.ProjectProcessVO; import com.ycl.domain.query.ProjectProcessQuery; +import com.ycl.service.common.TaskCommonService; import com.ycl.system.service.ISysDeptService; import com.ycl.system.service.ISysRoleService; import com.ycl.system.service.ISysUserService; @@ -78,6 +79,7 @@ private final ISysUserService sysUserService; private final ISysRoleService sysRoleService; private final ISysDeptService sysDeptService; + private final TaskCommonService taskCommonService; /** * 鍒嗛〉鏌ヨ @@ -113,14 +115,16 @@ if (Objects.nonNull(pp.getProcessInsId())) { HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(pp.getProcessInsId()).singleResult(); - // 鍒犻櫎涔嬪墠娴佺▼鐨勬暟鎹� - if (historicProcessInstance.getEndTime() != null) { - historyService.deleteHistoricProcessInstance(historicProcessInstance.getId()); - } else { - // 鍒犻櫎娴佺▼瀹炰緥 - runtimeService.deleteProcessInstance(pp.getProcessInsId(), ""); - // 鍒犻櫎鍘嗗彶娴佺▼瀹炰緥 - historyService.deleteHistoricProcessInstance(pp.getProcessInsId()); + if (Objects.nonNull(historicProcessInstance)) { + // 鍒犻櫎涔嬪墠娴佺▼鐨勬暟鎹� + if (historicProcessInstance.getEndTime() != null) { + historyService.deleteHistoricProcessInstance(historicProcessInstance.getId()); + } else { + // 鍒犻櫎娴佺▼瀹炰緥 + runtimeService.deleteProcessInstance(pp.getProcessInsId(), ""); + // 鍒犻櫎鍘嗗彶娴佺▼瀹炰緥 + historyService.deleteHistoricProcessInstance(pp.getProcessInsId()); + } } } String processInsId = this.startPro(form.getProjectId(), form.getProcessDefId()); @@ -203,7 +207,7 @@ taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInsId())); taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(processDefId, projectProcess.getProcessInsId())); // taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId())); - taskStatistics.setRemainingTaskNum(this.getNotFinishedTaskNum(projectProcess.getProcessInsId())); + taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(projectProcess.getProcessDefId(), projectProcess.getProcessInsId())); detail.setStatistics(taskStatistics); Result result = Result.ok(); @@ -273,16 +277,11 @@ taskVO.setDeployId(pd.getDeploymentId()); taskVO.setProcessName(pd.getName()); taskVO.setProcessInsId(task.getProcessInstanceId()); + taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey()); // 娴佺▼鍙戣捣浜轰俊鎭� - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(task.getProcessInstanceId()) - .singleResult(); - SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); - taskVO.setPromoterId(startUser.getUserId()); - taskVO.setPromoterName(startUser.getNickName()); - taskVO.setPromoterUnitName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : ""); - taskVO.setPromoterUnitId(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptId() : null); + this.setPromoterInfo(taskVO); + // 娴佺▼澶勭悊浜轰俊鎭� List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId()); for (IdentityLink identityLink : identityLinksForTask) { @@ -341,26 +340,22 @@ @Override public Result taskIsAuditing(String processDefinitionId, String taskId) { + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); Collection<Process> processes = bpmnModel.getProcesses(); + Boolean needAuditing = Boolean.FALSE; for (Process process : processes) { Collection<FlowElement> flowElements = process.getFlowElements(); for (FlowElement flowElement : flowElements) { - if (flowElement instanceof UserTask) { + if (flowElement instanceof UserTask && flowElement.getId().equals(task.getTaskDefinitionKey())) { UserTask userTask = (UserTask) flowElement; - List<ExtensionElement> extensionElements = userTask.getExtensionElements().get("flowable:properties"); - if (! CollectionUtils.isEmpty(extensionElements)) { - for (ExtensionElement extensionElement : extensionElements) { - String fieldName = extensionElement.getAttributeValue(taskId,"name"); - String fieldValue = extensionElement.getAttributeValue(taskId,"value"); - System.out.println("Field Name: " + fieldName + ", Field Value: " + fieldValue); - } - } + needAuditing = taskCommonService.checkTaskNeedAuditing(userTask.getExtensionElements().get("properties")); + break; } } } - return null; + return Result.ok().data(needAuditing); } /** @@ -401,16 +396,11 @@ taskVO.setDeployId(pd.getDeploymentId()); taskVO.setProcessName(pd.getName()); taskVO.setProcessInsId(task.getProcessInstanceId()); + taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey()); // 娴佺▼鍙戣捣浜轰俊鎭� - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(task.getProcessInstanceId()) - .singleResult(); - SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); - taskVO.setPromoterId(startUser.getUserId()); - taskVO.setPromoterName(startUser.getNickName()); - taskVO.setPromoterUnitName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : ""); - taskVO.setPromoterUnitId(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptId() : null); + this.setPromoterInfo(taskVO); + // 娴佺▼澶勭悊浜轰俊鎭� List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId()); for (IdentityLink identityLink : identityLinksForTask) { @@ -502,6 +492,8 @@ .includeIdentityLinks() .singleResult(); if (Objects.isNull(historicTask)) { + vo.setPromoterName("鏆傛棤"); + vo.setPromoterUnitName("鏆傛棤"); // 鏈紑濮嬬殑浠诲姟锛屽叾鍏宠仈鐨勭敤鎴风粍杩欎簺閮藉彲浠ヤ粠UserTask涓嬁鍒帮紝鍥犱负鏈韩鏈紑濮嬬殑浠诲姟鏄病鏈塼ask鐨勶紝鎵�浠ヨ繖閲岀洿鎺ユ煡 if (StringUtils.isNotBlank(userTask.getAssignee())) { vo.setHandlerType(HandlerTypeEnum.USER); @@ -552,6 +544,7 @@ vo.setHandlerId(handlerUserId); vo.setHandlerName(handlerUser.getNickName()); } + vo.setTaskDefinitionKey(historicTask.getTaskDefinitionKey()); this.setPromoterAndHandler(vo, historicTask.getIdentityLinks()); } } else { @@ -559,6 +552,8 @@ vo.setTaskId(task.getId()); vo.setExecutionId(task.getExecutionId()); vo.setCreateTime(task.getCreateTime()); + vo.setTaskDefinitionKey(task.getTaskDefinitionKey()); + this.setPromoterAndHandler(vo, null); } return vo; @@ -695,22 +690,13 @@ /** - * 璁剧疆浠诲姟鐨勫彂璧蜂汉&澶勭悊浜� + * 璁剧疆浠诲姟鐨勫彂璧蜂汉&澶勭悊浜� 鍙湁寰呭姙浠诲姟鍜屽凡瀹屾垚浠诲姟鎵嶄細鎺夎繖涓柟娉� * * @param taskVO * @param identityLinkInfos 濡傛灉鏄凡瀹屾垚鐨勪换鍔★紝鐢ㄨ繖涓幓鍙栧叧鑱旂殑鐢ㄦ埛/鐢ㄦ埛缁� */ private void setPromoterAndHandler(CustomerTaskVO taskVO, List<? extends IdentityLinkInfo> identityLinkInfos) { - // TODO 鍙戣捣浜烘槸鍚﹀簲涓轰笂涓�鑺傜偣鐨勫鐞嗕汉 - // 娴佺▼鍙戣捣浜轰俊鎭� - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(taskVO.getProcessInsId()) - .singleResult(); - SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); - taskVO.setPromoterId(startUser.getUserId()); - taskVO.setPromoterName(startUser.getNickName()); - taskVO.setPromoterUnitId(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptId() : null); - taskVO.setPromoterUnitName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : ""); + this.setPromoterInfo(taskVO); // 娴佺▼澶勭悊浜轰俊鎭� if (TaskStatusEnum.TODO.equals(taskVO.getTaskStatus())) { List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(taskVO.getTaskId()); @@ -719,6 +705,7 @@ if (StringUtils.isNotBlank(identityLink.getUserId())) { SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { + taskVO.setHandlerType(HandlerTypeEnum.USER); taskVO.setHandlerId(sysUser.getUserId()); if (Objects.nonNull(sysUser.getDept())) { taskVO.setHandlerUnitId(sysUser.getDept().getDeptId()); @@ -729,6 +716,7 @@ // 缁戝畾鐨勬槸瑙掕壊鎴栬�呮槸閮ㄩ棬锛岄渶瑕佹牴鎹甶d鍒ゆ柇 } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { if (identityLink.getGroupId().startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 + taskVO.setHandlerType(HandlerTypeEnum.DEPT); String[] split = identityLink.getGroupId().split(":"); if (split.length > 1) { // 閮ㄩ棬 @@ -741,6 +729,7 @@ } } } else { + taskVO.setHandlerType(HandlerTypeEnum.ROLE); SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); if (Objects.nonNull(role)) { taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); @@ -755,6 +744,7 @@ for (IdentityLinkInfo identityLink : identityLinkInfos) { // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂� if (StringUtils.isNotBlank(identityLink.getUserId())) { + taskVO.setHandlerType(HandlerTypeEnum.USER); SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { // taskVO.setHandlerId(sysUser.getUserId()); @@ -767,6 +757,7 @@ // 缁戝畾鐨勬槸瑙掕壊锛屾煡鍑鸿鑹插悕绉� } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { if (identityLink.getGroupId().startsWith("dept")) { + taskVO.setHandlerType(HandlerTypeEnum.DEPT); String[] split = identityLink.getGroupId().split(":"); if (split.length > 1) { // 閮ㄩ棬 @@ -776,18 +767,50 @@ taskVO.setHandlerUnitName(dept.getDeptName()); } } - } - SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); - if (Objects.nonNull(role)) { - taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); - taskVO.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); + } else { + taskVO.setHandlerType(HandlerTypeEnum.ROLE); + SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); + if (Objects.nonNull(role)) { + taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); + taskVO.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); // taskVO.setHandlerName(role.getRoleName()); // taskVO.setHandlerId(null); + } } } } } + } + + /** + * 璁剧疆浠诲姟鍙戣捣浜� + * + * @param taskVO + */ + private void setPromoterInfo(CustomerTaskVO taskVO) { + // 鍙戣捣浜哄簲涓轰笂涓�鑺傜偣鐨勫鐞嗕汉 + List<String> beforeNodeKey = taskCommonService.getBeforeNodeInfo(taskVO.getProcessDefId(), taskVO.getTaskDefinitionKey()); + List<SysUser> userList = beforeNodeKey.stream().map(key -> { + HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().taskDefinitionKey(key).singleResult(); + if (Objects.nonNull(historicTaskInstance)) { + // 瀹為檯棰嗗彇杩欎釜浠诲姟鐨勪汉锛屼篃灏辨槸澶勭悊浜� + String assignee = historicTaskInstance.getAssignee(); + SysUser startUser = sysUserService.selectUserById(Long.parseLong(assignee)); + return startUser; + } else { + return null; + } + }).filter(user -> Objects.nonNull(user)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(userList)) { + taskVO.setPromoterName("鏆傛棤"); + taskVO.setPromoterUnitName("鏆傛棤"); + } else { + taskVO.setPromoterId(userList.stream().map(user -> { return user.getUserId() + ""; }).collect(Collectors.joining("銆�"))); + taskVO.setPromoterName(userList.stream().map(user -> { return user.getNickName(); }).collect(Collectors.joining("銆�"))); + taskVO.setPromoterUnitId(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> { return user.getDept().getDeptId() + "";}).collect(Collectors.joining("銆�"))); + taskVO.setPromoterUnitName(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> { return user.getDept().getDeptName() + "";}).collect(Collectors.joining("銆�"))); + } } /** @@ -833,16 +856,6 @@ */ private Long getTotalTaskNum(String processDefinitionId) { return Long.valueOf(this.getAllUserTaskElement(processDefinitionId).size()); - } - - /** - * 鑾峰彇娴佺▼鍓╀綑鏈畬鎴愮殑浠诲姟鏁� - * - * @param processInstanceId - * @return - */ - private Long getNotFinishedTaskNum(String processInstanceId) { - return historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).processUnfinished().count(); } /** diff --git a/flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java b/flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java index 173a8d6..1a9fadb 100644 --- a/flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java +++ b/flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java @@ -90,4 +90,12 @@ public static final String WIDGET_LIST = "widgetList"; + /** + * 鎵╁睍灞炴�т腑鐨勶細鑺傜偣鏄惁瀹℃壒 + * + */ + public static final String EXTENSION_PROPERTY_NEED_AUDITING_TEXT = "璇ヨ妭鐐规槸瀹℃壒鑺傜偣"; + public static final String EXTENSION_PROPERTY_NEED_AUDITING_VALUE = "鏄�"; + + } diff --git a/flowable/src/main/java/com/ycl/controller/FlowTaskController.java b/flowable/src/main/java/com/ycl/controller/FlowTaskController.java index 70a98a4..4a23d6f 100644 --- a/flowable/src/main/java/com/ycl/controller/FlowTaskController.java +++ b/flowable/src/main/java/com/ycl/controller/FlowTaskController.java @@ -7,6 +7,7 @@ import com.ycl.domain.dto.FlowTaskDto; import com.ycl.domain.vo.FlowQueryVo; import com.ycl.domain.vo.FlowTaskVo; +import com.ycl.domain.vo.FormDetailVO; import com.ycl.service.IFlowTaskService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -97,6 +98,12 @@ return flowTaskService.processVariables(taskId); } + @ApiOperation(value = "鏌ョ湅浠诲姟", response = FormDetailVO.class) + @GetMapping(value = "/detail/{taskId}") + public AjaxResult detail(@ApiParam(value = "娴佺▼浠诲姟Id") @PathVariable(value = "taskId") String taskId) { + return flowTaskService.detail(taskId); + } + @ApiOperation(value = "瀹屾垚鎻愪氦琛ㄥ崟浠诲姟/鏅�氭彁浜�") @Log(title = "瀹屾垚鎻愪氦琛ㄥ崟浠诲姟/鏅�氭彁浜�", businessType = BusinessType.INSERT) diff --git a/flowable/src/main/java/com/ycl/service/IFlowTaskService.java b/flowable/src/main/java/com/ycl/service/IFlowTaskService.java index 93cd0cc..35f11b5 100644 --- a/flowable/src/main/java/com/ycl/service/IFlowTaskService.java +++ b/flowable/src/main/java/com/ycl/service/IFlowTaskService.java @@ -223,4 +223,12 @@ * @return */ AjaxResult completeSubmitForm(String taskId, Map<String, Object> variables); + + /** + * 鏌ョ湅浠诲姟 + * + * @param taskId + * @return + */ + AjaxResult detail(String taskId); } diff --git a/flowable/src/main/java/com/ycl/service/common/TaskCommonService.java b/flowable/src/main/java/com/ycl/service/common/TaskCommonService.java index 5335db3..af2d729 100644 --- a/flowable/src/main/java/com/ycl/service/common/TaskCommonService.java +++ b/flowable/src/main/java/com/ycl/service/common/TaskCommonService.java @@ -17,6 +17,7 @@ import org.springframework.util.StringUtils; import java.util.*; +import java.util.stream.Collectors; /** * @author锛歺p @@ -30,13 +31,15 @@ private final RepositoryService repositoryService; /** - * 閫氳繃褰撳墠鑺傜偣瀹氫箟key锛岃幏鍙栧叾涓婁竴涓妭鐐圭殑瀹氫箟id锛屽鏋滃墠闈㈡槸骞惰鐨勪細杩斿洖澶氫釜 + * 閫氳繃褰撳墠鑺傜偣瀹氫箟key锛岃幏鍙栧叾涓婁竴涓妭鐐逛互鍙婂綋鍓嶈妭鐐圭殑淇℃伅锛屽鏋滃墠闈㈡槸骞惰鐨勪細杩斿洖澶氫釜 * * @param processDefId 娴佺▼瀹氫箟id - * @param currentNodeDefId + * @param currentNodeDefId 褰撳墠鑺傜偣瀹氫箟id + * @param sysFormService 琛ㄥ崟鏈嶅姟灞� + * @param needInitCurrentForm 鏄惁闇�瑕佸垵濮嬪寲褰撳墠鑺傜偣鐨勮〃鍗曟暟鎹紝涓�鑸煡璇㈠凡瀹屾垚鐨勪换鍔¤鎯呴渶瑕� * @return */ - public List<FormDetailVO> getBeforeNodeDefId(String processDefId, String currentNodeDefId, ISysFormService sysFormService) { + public List<FormDetailVO> getBeforeNodeDefInfo(String processDefId, String currentNodeDefId, ISysFormService sysFormService, Boolean needInitCurrentForm) { // 鑾峰彇娴佺▼瀹氫箟 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionId(processDefId) @@ -64,7 +67,7 @@ } } if (Objects.isNull(currentElement)) { - throw new RuntimeException("鏈壘鍒版敼浠诲姟鐨勬祦绋嬪畾涔夎妭鐐�"); + throw new RuntimeException("鏈壘鍒拌浠诲姟鐨勬祦绋嬪畾涔夎妭鐐�"); } // 鑾峰彇褰撳墠鑺傜偣鐨勮緭鍏� @@ -75,43 +78,135 @@ formDetailVO.setBeforeNodeName(currentElement.getName()); formDetailVO.setCurrent(Boolean.TRUE); - SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(currentElement.getFormKey())); - if (Objects.isNull(sysForm)) { - throw new RuntimeException("璇ユ祦绋嬬粦瀹氱殑琛ㄥ崟涓嶅瓨鍦ㄦ垨宸茶鍒犻櫎"); - } - Map<String, Object> data = new HashMap<>(1); - data.put(ProcessConstants.TASK_FORM_KEY, JSONObject.parseObject(sysForm.getFormContent())); + if (needInitCurrentForm) { + SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(currentElement.getFormKey())); + if (Objects.isNull(sysForm)) { + throw new RuntimeException("璇ユ祦绋嬬粦瀹氱殑琛ㄥ崟涓嶅瓨鍦ㄦ垨宸茶鍒犻櫎"); + } + Map<String, Object> data = new HashMap<>(1); + data.put(ProcessConstants.TASK_FORM_KEY, JSONObject.parseObject(sysForm.getFormContent())); - formDetailVO.setFormJsonObj(data); + formDetailVO.setFormJsonObj(data); + } + defKeys.add(formDetailVO); } - this.before(currentElement, defKeys); + this.beforeNodeInfo(currentElement, defKeys); return defKeys; } /** - * 閫掑綊鑾峰彇褰撳墠鑺傜偣鐨勫墠涓�涓换鍔¤妭鐐筴ey + * 閫掑綊鑾峰彇褰撳墠鑺傜偣鐨勫墠涓�涓换鍔¤妭鐐逛俊鎭� * * @param currentElement * @param defKeys */ - private void before(UserTask currentElement, List<FormDetailVO> defKeys) { - if (! CollectionUtils.isEmpty(currentElement.getIncomingFlows())) { - for (SequenceFlow incomingFlow : currentElement.getIncomingFlows()) { - if (! (incomingFlow.getSourceFlowElement() instanceof UserTask)) { - // 涓嶅寘鍚紑濮嬭妭鐐� - if (! (incomingFlow.getSourceFlowElement() instanceof StartEvent)) { - before((UserTask) (incomingFlow.getSourceFlowElement()), defKeys); + private void beforeNodeInfo(FlowElement currentElement, List<FormDetailVO> defKeys) { + if (currentElement instanceof UserTask) { + UserTask userTask = (UserTask) currentElement; + if (! CollectionUtils.isEmpty(userTask.getIncomingFlows())) { + for (SequenceFlow incomingFlow : userTask.getIncomingFlows()) { + if (incomingFlow.getSourceFlowElement() instanceof UserTask) { + FormDetailVO formDetailVO = new FormDetailVO(); + formDetailVO.setBeforeNodeDefId(incomingFlow.getSourceFlowElement().getId()); + formDetailVO.setBeforeNodeName(incomingFlow.getSourceFlowElement().getName()); + formDetailVO.setBeforeNodeName(((UserTask) incomingFlow.getSourceFlowElement()).getOwner()); + defKeys.add(formDetailVO); + } else { + beforeNodeInfo(incomingFlow.getSourceFlowElement(), defKeys); } - } else { - FormDetailVO formDetailVO = new FormDetailVO(); - formDetailVO.setBeforeNodeDefId(incomingFlow.getSourceFlowElement().getId()); - formDetailVO.setBeforeNodeName(incomingFlow.getSourceFlowElement().getName()); - defKeys.add(formDetailVO); + } + } + } else if (currentElement instanceof Gateway ){ + Gateway gateway = (Gateway) currentElement; + if (! CollectionUtils.isEmpty(gateway.getIncomingFlows())) { + for (SequenceFlow incomingFlow : gateway.getIncomingFlows()) { + if (incomingFlow.getSourceFlowElement() instanceof UserTask) { + FormDetailVO formDetailVO = new FormDetailVO(); + formDetailVO.setBeforeNodeDefId(incomingFlow.getSourceFlowElement().getId()); + formDetailVO.setBeforeNodeName(incomingFlow.getSourceFlowElement().getName()); + defKeys.add(formDetailVO); + } else { + beforeNodeInfo(incomingFlow.getSourceFlowElement(), defKeys); + } } } } } + + /** + * 鑾峰彇褰撳墠鑺傜偣鐨勪笂涓�鑺傜偣id锛屼笉鍙嶆倲褰撳墠鑺傜偣淇℃伅锛屽鏋滃墠闈㈡槸骞惰锛岄偅涔堜細杩斿洖澶氫釜 + * + * @param processDefId 娴佺▼瀹氫箟id + * @param currentNodeDefId 褰撳墠鑺傜偣瀹氫箟id + * @return + */ + public List<String> getBeforeNodeInfo(String processDefId, String currentNodeDefId) { + // 鑾峰彇娴佺▼瀹氫箟 + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(processDefId) + .singleResult(); + + // 鑾峰彇娴佺▼妯″瀷 + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefId); + if (bpmnModel == null) { + throw new RuntimeException("BpmnModel not found for processDefinitionId: " + processDefId); + } + + // 鑾峰彇娴佺▼瀵硅薄 + Process process = bpmnModel.getProcessById(processDefinition.getKey()); + if (process == null) { + throw new RuntimeException("Process not found for processDefinitionId: " + processDefId); + } + + // 閬嶅巻娴佺▼鍏冪礌锛屾壘鍒板搴旂殑浠诲姟鑺傜偣 + Collection<FlowElement> flowElements = process.getFlowElements(); + UserTask currentElement = null; + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof UserTask && flowElement.getId().equals(currentNodeDefId)) { + currentElement = (UserTask) flowElement; + break; + } + } + if (Objects.isNull(currentElement)) { + throw new RuntimeException("鏈壘鍒拌浠诲姟鐨勬祦绋嬪畾涔夎妭鐐�"); + } + + // 鑾峰彇褰撳墠鑺傜偣鐨勮緭鍏� + List<FormDetailVO> defKeys = new ArrayList<>(2); + this.beforeNodeInfo(currentElement, defKeys); + + return defKeys.stream().map(FormDetailVO::getBeforeNodeDefId).collect(Collectors.toList()); + } + + + /** + * 妫�鏌ヤ换鍔¤妭鐐规槸鍚﹂厤缃簡锛氶渶瑕佸鏍� 鐨勬墿灞曞睘鎬� + * + * @param extensionElements 鎵╁睍鍒楄〃 + * @return + */ + public Boolean checkTaskNeedAuditing(List<ExtensionElement> extensionElements) { + if (CollectionUtils.isEmpty(extensionElements)) { + return Boolean.FALSE; + } + for (ExtensionElement extensionElement : extensionElements) { + if (CollectionUtils.isEmpty(extensionElement.getAttributes())) { // 濡傛灉鏈韩娌℃湁灞炴�э紝鍒欓�掑綊child + return checkTaskNeedAuditing(extensionElement.getChildElements().get("property")); + } else { + // 鍚﹀垯鍏堟煡鏈韩鐨勫睘鎬ф湁涓嶆湁锛氶渶瑕佸鏍� 鐨勫睘鎬э紝娌℃湁涔熸槸閫掑綊child + if (extensionElement.getAttributes().get("name").stream().anyMatch(attribute -> ProcessConstants.EXTENSION_PROPERTY_NEED_AUDITING_TEXT.equals(attribute.getValue())) + && extensionElement.getAttributes().get("value").stream().anyMatch(attribute -> ProcessConstants.EXTENSION_PROPERTY_NEED_AUDITING_VALUE.equals(attribute.getValue())) + ) { + return Boolean.TRUE; + } else { + return checkTaskNeedAuditing(extensionElement.getChildElements().get("property")); + } + } + } + return Boolean.FALSE; + } + } diff --git a/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java b/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java index a7af1d7..cf45ee2 100644 --- a/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java +++ b/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ycl.common.constant.ProcessConstants; import com.ycl.common.core.domain.AjaxResult; +import com.ycl.common.core.domain.entity.SysDept; import com.ycl.common.core.domain.entity.SysRole; import com.ycl.common.core.domain.entity.SysUser; import com.ycl.common.enums.FlowComment; @@ -28,6 +29,7 @@ import com.ycl.service.ISysDeployFormService; import com.ycl.service.ISysFormService; import com.ycl.service.common.TaskCommonService; +import com.ycl.system.service.ISysDeptService; import com.ycl.system.service.ISysRoleService; import com.ycl.system.service.ISysUserService; import lombok.RequiredArgsConstructor; @@ -80,6 +82,7 @@ private final ISysUserService sysUserService; private final ISysRoleService sysRoleService; + private final ISysDeptService sysDeptService; private final ISysDeployFormService sysInstanceFormService; private final ISysFormService sysFormService; private final TaskCommonService taskCommonService; @@ -831,8 +834,14 @@ stringBuilder.append(sysUser.getNickName()).append(","); } if (StringUtils.isNotBlank(identityLink.getGroupId())) { - SysRole sysRole = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); - stringBuilder.append(sysRole.getRoleName()).append(","); + if (identityLink.getGroupId().contains("dept")) { + SysDept sysDept = sysDeptService.selectDeptById(Long.parseLong(identityLink.getGroupId().split(":")[1])); + stringBuilder.append(sysDept.getDeptName()).append(","); + } else { + SysRole sysRole = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); + stringBuilder.append(sysRole.getRoleName()).append(","); + } + } } } @@ -853,14 +862,14 @@ } map.put("flowList", hisFlowList); } - // 绗竴娆$敵璇疯幏鍙栧垵濮嬪寲琛ㄥ崟 - if (StringUtils.isNotBlank(deployId)) { - SysForm sysForm = sysInstanceFormService.selectSysDeployFormByDeployId(deployId); - if (Objects.isNull(sysForm)) { - return AjaxResult.error("璇峰厛閰嶇疆娴佺▼琛ㄥ崟"); - } - map.put("formData", JSONObject.parseObject(sysForm.getFormContent())); - } +// // 绗竴娆$敵璇疯幏鍙栧垵濮嬪寲琛ㄥ崟 +// if (StringUtils.isNotBlank(deployId)) { +// SysForm sysForm = sysInstanceFormService.selectSysDeployFormByDeployId(deployId); +// if (Objects.isNull(sysForm)) { +// return AjaxResult.error("璇峰厛閰嶇疆娴佺▼琛ㄥ崟"); +// } +// map.put("formData", JSONObject.parseObject(sysForm.getFormContent())); +// } return AjaxResult.success(map); } @@ -1149,10 +1158,46 @@ } else { parameters = taskService.getVariables(taskId); } + List<FormDetailVO> beforeNodes = this.getBeforeNodeForm(parameters, task.getFormKey(), task.getName(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(), Boolean.FALSE); + return AjaxResult.success(beforeNodes); + } + + @Override + public AjaxResult detail(String taskId) { + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + // 娴佺▼鍙橀噺 + Map<String, Object> parameters = new HashMap<>(); + if (Objects.isNull(task)) { + // 濡傛灉涓虹┖锛屽彲鑳芥槸浠诲姟宸茬粡缁撴潫 + HistoricTaskInstance hisTask = historyService.createHistoricTaskInstanceQuery().taskId(taskId).includeProcessVariables().singleResult(); + if (Objects.isNull(hisTask)) { + throw new RuntimeException("璇ヤ换鍔′笉瀛樺湪"); + } + parameters = hisTask.getProcessVariables(); + List<FormDetailVO> beforeNodes = this.getBeforeNodeForm(parameters, hisTask.getFormKey(), hisTask.getName(), hisTask.getProcessDefinitionId(), hisTask.getTaskDefinitionKey(), Boolean.TRUE); + return AjaxResult.success(beforeNodes); + } else { + parameters = taskService.getVariables(taskId); + List<FormDetailVO> beforeNodes = this.getBeforeNodeForm(parameters, task.getFormKey(), task.getName(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(), Boolean.TRUE); + return AjaxResult.success(beforeNodes); + } + } + + /** + * 鑾峰彇褰撳墠鑺傜偣鍜屼笂涓�鑺傜偣鐨勮〃鍗曞唴瀹� + * + * @param parameters 鏍规嵁浠诲姟鏌ユ壘鍑烘潵鐨勫弬鏁� + * @param formKey task鑷韩鍏宠仈鐨勮〃鍗昳d + * @param taskName task鑷韩鐨勪换鍔″悕 + * @param processDefId 娴佺▼瀹氫箟id + * @param processDefKey 娴佺▼瀹炰緥id + * @return + */ + private List<FormDetailVO> getBeforeNodeForm(Map<String, Object> parameters, String formKey, String taskName, String processDefId, String processDefKey, Boolean currentNeedData) { if (! parameters.keySet().stream().anyMatch(key -> key.contains(ProcessConstants.TASK_FORM_KEY))) { // 濡傛灉鏄┖鐨勶紝浣跨敤formId鍘绘煡 - if (StringUtils.isNotBlank(task.getFormKey())) { - SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(task.getFormKey())); + if (StringUtils.isNotBlank(formKey)) { + SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(formKey)); if (Objects.isNull(sysForm)) { throw new RuntimeException("璇ユ祦绋嬬粦瀹氱殑琛ㄥ崟涓嶅瓨鍦ㄦ垨宸茶鍒犻櫎"); } @@ -1160,24 +1205,25 @@ Map<String, Object> data = new HashMap<>(1); data.put(ProcessConstants.TASK_FORM_KEY, JSONObject.parseObject(sysForm.getFormContent())); formDetailVO.setFormJsonObj(data); - formDetailVO.setBeforeNodeName(task.getName()); + formDetailVO.setBeforeNodeName(taskName); formDetailVO.setCurrent(Boolean.TRUE); - return AjaxResult.success(Arrays.asList(formDetailVO)); + return Arrays.asList(formDetailVO); } else { - return AjaxResult.success(new ArrayList<>(1)); + return new ArrayList<>(1); } } // 杩欓噷鍙渶瑕佹煡鑷韩浠ュ強涓婁竴涓妭鐐�(濡傛灉骞惰鐨勬湁澶氫釜)鐨勮〃鍗曟暟鎹� - List<FormDetailVO> beforeNodes = taskCommonService.getBeforeNodeDefId(task.getProcessDefinitionId(), task.getTaskDefinitionKey(), sysFormService); - List<String> beforeNodeDefIds = beforeNodes.stream().filter(item -> !item.getCurrent()).map(FormDetailVO::getBeforeNodeDefId).collect(Collectors.toList()); + List<FormDetailVO> beforeNodes = taskCommonService.getBeforeNodeDefInfo(processDefId, processDefKey, sysFormService, Boolean.TRUE); + List<String> beforeNodeDefIds = beforeNodes.stream().filter(item -> !item.getCurrent() || currentNeedData).map(FormDetailVO::getBeforeNodeDefId).collect(Collectors.toList()); Map<String, Object> newP = new HashMap<>(); if (CollectionUtils.isNotEmpty(beforeNodeDefIds)) { for (String key : parameters.keySet()) { - // 杩囨护鐩爣鏁版嵁锛屽皢鐩爣琛ㄥ崟鏁版嵁鏀惧埌鏂癿ap涓� + // 杩囨护鎷垮埌鐩爣鏁版嵁锛屽皢鐩爣琛ㄥ崟鏁版嵁鏀惧埌鏂癿ap涓� if (beforeNodeDefIds.stream().anyMatch(defId -> key.startsWith(defId))) { if (key.contains(ProcessConstants.TASK_FORM_KEY)) { newP.put(key, parameters.get(key)); - } else { + } + else { newP.put(key.split("&")[1], parameters.get(key)); } } @@ -1186,8 +1232,8 @@ // 鎷垮埌鐩爣琛ㄥ崟鍚庯紝鍐嶅鐞嗘瘡涓〃鍗曠殑鏁版嵁 for (FormDetailVO formDetailVO : beforeNodes) { - if (formDetailVO.getCurrent()) { - continue; // 璺宠繃褰撳墠鑺傜偣锛屽洜涓哄綋鍓嶈妭鐐瑰湪鑾峰彇鍓嶇疆鑺傜偣鏃跺凡缁忚缃繃浜� + if (formDetailVO.getCurrent() && !currentNeedData) { + continue; // 璺宠繃褰撳墠鑺傜偣锛屽洜涓哄綋鍓嶈妭鐐瑰湪鑾峰彇鍓嶇疆鑺傜偣鏃跺凡缁忚缃繃浜�(浣嗚〃鍗曟暟鎹病鏈夌粰) } Object form = newP.get(formDetailVO.getBeforeNodeDefId() + "&" + ProcessConstants.TASK_FORM_KEY); if (Objects.nonNull(form)) { @@ -1224,8 +1270,7 @@ formDetailVO.setFormJsonObj(newP); } } - - return AjaxResult.success(beforeNodes); + return beforeNodes; } /** -- Gitblit v1.8.0