From cc44920da3d40b8248b67560026e891afdd1a6ab Mon Sep 17 00:00:00 2001 From: lyh <925863403@qq.com> Date: 星期四, 08 五月 2025 17:57:14 +0800 Subject: [PATCH] 1.查询可以被引用的部件接口开发完成 2.借用部件(可批量) 开发完成 3.修改原有新增、修改部件接口 完成 4.修改原有删除文档与导入文档接口 完成 5.修改工作流问题 --- lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java | 185 +++++++++++++++++++++++++++++++-------------- 1 files changed, 126 insertions(+), 59 deletions(-) diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java index 3fe1de0..6b715e9 100644 --- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java +++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java @@ -1,20 +1,20 @@ package org.jeecg.modules.flowable.service.impl; - import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; -import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.*; +import org.flowable.bpmn.model.Process; import org.flowable.common.engine.api.FlowableException; import org.flowable.common.engine.api.FlowableObjectNotFoundException; import org.flowable.common.engine.impl.identity.Authentication; @@ -33,19 +33,18 @@ import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; import org.flowable.task.api.history.HistoricTaskInstance; -import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.SpringContextUtils; +import org.jeecg.modules.flowable.apithird.business.dto.FlowMyBusinessDto; import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness; import org.jeecg.modules.flowable.apithird.business.service.impl.FlowMyBusinessServiceImpl; -import org.jeecg.modules.flowable.apithird.entity.ActStatus; -import org.jeecg.modules.flowable.apithird.entity.SysUser; -import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI; -import org.jeecg.modules.flowable.apithird.service.IFlowThirdService; import org.jeecg.modules.flowable.apithird.common.constant.ProcessConstants; import org.jeecg.modules.flowable.apithird.common.enums.FlowComment; import org.jeecg.modules.flowable.apithird.common.exception.CustomException; +import org.jeecg.modules.flowable.apithird.entity.SysUser; +import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI; +import org.jeecg.modules.flowable.apithird.service.IFlowThirdService; import org.jeecg.modules.flowable.domain.dto.FlowCommentDto; import org.jeecg.modules.flowable.domain.dto.FlowNextDto; import org.jeecg.modules.flowable.domain.dto.FlowTaskDto; @@ -96,6 +95,10 @@ taskService.saveTask(task); } SysUser loginUser = iFlowThirdService.getLoginUser(); + //鍒ゆ柇鐢ㄦ埛鏄惁鏈夋潈闄� + if (!task.getAssignee().equals(loginUser.getUsername())){ + return Result.error("褰撳墠鐢ㄦ埛鏃犳潈闄�"); + } if (DelegationState.PENDING.equals(task.getDelegationState())) { taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.DELEGATE.getType(), taskVo.getComment()); //taskService.resolveTask(taskVo.getTaskId(), taskVo.getValues()); @@ -103,7 +106,6 @@ System.out.println("taskVo.getTaskId()--->taskVo.getInstanceId()--->FlowComment.NORMAL.getType()--->taskVo.getComment()"+taskVo.getTaskId() + "---" + taskVo.getInstanceId() + "---" + FlowComment.NORMAL.getType() + "---"+taskVo.getComment() ); taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment()); taskService.setAssignee(taskVo.getTaskId(), loginUser.getUsername()); - //taskService.complete(taskVo.getTaskId(), taskVo.getValues()); } /*======================瀹℃壒缁撴潫 鍥炶皟浠ュ強鍏抽敭鏁版嵁淇濆瓨======================*/ //涓氬姟鏁版嵁id @@ -157,8 +159,8 @@ if (task2!=null && task.getTaskDefinitionKey().equals(task2.getTaskDefinitionKey())){ // * 褰撳墠鑺傜偣鏄細绛捐妭鐐癸紝娌℃湁璧板畬 - business.setActStatus(ActStatus.doing) - .setTaskId(task2.getId()) + business.setTaskId(task2.getId()) +// .setActStatus(ActStatus.doing) .setDoneUsers(doneUserList.toJSONString()) ; String todoUsersStr = business.getTodoUsers(); @@ -202,8 +204,9 @@ // 鍓嶇浼犲叆鍊欓�変汉 collect_username = candidateUsers; } - business.setActStatus(ActStatus.doing) + business .setTaskId(task2.getId()) +// .setActStatus(ActStatus.doing) .setTaskNameId(nextTask.getId()) .setTaskName(nextTask.getName()) .setPriority(nextTask.getPriority()) @@ -234,7 +237,7 @@ } else { // **娌℃湁涓嬩竴涓妭鐐癸紝娴佺▼宸茬粡缁撴潫浜� - business.setActStatus(ActStatus.pass) + business .setDoneUsers(doneUserList.toJSONString()) .setTodoUsers("") .setTaskId("") @@ -250,11 +253,13 @@ if (flowCallBackService!=null)flowCallBackService.afterFlowHandle(business); return Result.OK(); } + @Override @Transactional(rollbackFor = Exception.class) public Result completeByDateId(FlowTaskVo flowTaskVo){ return this.complete(flowTaskVo); } + @Override public void taskRejectByDataId(FlowTaskVo flowTaskVo){ FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId()); @@ -409,8 +414,9 @@ if (!doneUserList.contains(loginUser.getUsername())){ doneUserList.add(loginUser.getUsername()); } - business.setActStatus(ActStatus.reject) + business .setTaskId(task2.getId()) +// .setActStatus(ActStatus.reject) .setTaskNameId(task2.getTaskDefinitionKey()) .setTaskName(task2.getName()) .setDoneUsers(doneUserList.toJSONString()) @@ -588,8 +594,9 @@ //**璺宠浆鍒扮洰鏍囪妭鐐� List<Task> task2List = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list(); Task targetTask = task2List.get(0); - business.setActStatus(ActStatus.reject) + business .setTaskId(targetTask.getId()) +// .setActStatus(ActStatus.reject) .setTaskNameId(targetTask.getTaskDefinitionKey()) .setTaskName(targetTask.getName()) .setPriority(targetTask.getPriority()+"") @@ -661,6 +668,29 @@ flowTaskVo.setTaskId(business.getTaskId()); return findReturnTaskList(flowTaskVo); } + + /** + * 缁撴潫娴佺▼ + * @param processInstanceId 娴佺▼瀹炰緥 ID + * @param deleteReason 瀹氫箟鍒犻櫎鍘熷洜 + */ + public Result<?> end(String processInstanceId, String deleteReason) { + try { + // 寮哄埗缁撴潫娴佺▼瀹炰緥 + runtimeService.deleteProcessInstance(processInstanceId, deleteReason); + // 鍒犻櫎鍏宠仈娴佺▼鐨勪笟鍔� + FlowMyBusiness flowMyBusiness=flowMyBusinessService.getFlowMyBusiness(processInstanceId); + flowMyBusinessService.removeById(flowMyBusiness.getId()); + System.out.println("Process instance with ID " + processInstanceId + " has been forcefully ended."); + } catch (Exception e) { + System.err.println("Failed to force end process instance: " + e.getMessage()); + } + + // 鍏抽棴娴佺▼寮曟搸 + processEngine.close(); + return Result.OK("娴佺▼宸茬粨鏉�"); + } + /** * 鑾峰彇鎵�鏈夊彲鍥為��鐨勮妭鐐� * @@ -872,7 +902,7 @@ String myTaskId = null; HistoricTaskInstance myTask = null; for (HistoricTaskInstance hti : htiList) { - if (loginUser.getUsername().toString().equals(hti.getAssignee())) { + if (loginUser.getUsername().equals(hti.getAssignee())) { myTaskId = hti.getId(); myTask = hti; break; @@ -907,6 +937,63 @@ return Result.OK(); + } + + + /** + * 鍒ゆ柇澶氫釜浠诲姟鏄惁澶勪簬鍚屼竴娴佺▼鑺傜偣 + * @param taskIds 閫楀彿鍒嗛殧鐨勪换鍔D瀛楃涓� + * @return 缁熶竴缁撴灉灏佽 + */ + @Override + public Result isSameNode(String taskIds) { + // 1. 鍙傛暟鏍¢獙 + if (StringUtils.isBlank(taskIds)) { + return Result.error("浠诲姟ID涓嶈兘涓虹┖"); + } + + // 2. 鍒嗗壊浠诲姟ID + String[] taskIdArray = taskIds.split(","); + if (taskIdArray.length == 0) { + return Result.error("鏈彁渚涙湁鏁堢殑浠诲姟ID"); + } + + // 3. 鍗曚换鍔$洿鎺ヨ繑鍥瀟rue + if (taskIdArray.length == 1) { + return Result.ok(true); + } + + // 4. 澶氫换鍔℃鏌ラ�昏緫 + String referenceNodeId = null; + String currentNodeId = null; + for (String taskId : taskIdArray) { + // 4.1 鏌ヨ浠诲姟瀹炰緥 + Task task = taskService.createTaskQuery() + .taskId(taskId.trim()) + .singleResult(); + + // 4.2 浠诲姟涓嶅瓨鍦ㄥ鐞� + if (task == null) { + return Result.error("浠诲姟涓嶅瓨鍦�: " + taskId); + } + + // 4.3 鑾峰彇鑺傜偣鏍囪瘑锛圱askDefinitionKey锛� + currentNodeId = task.getTaskDefinitionKey(); + + // 4.4 棣栨閬嶅巻鍒濆鍖栧弬鑰冭妭鐐� + if (referenceNodeId == null) { + referenceNodeId = currentNodeId; + continue; + } + + // 4.5 鑺傜偣涓嶄竴鑷寸洿鎺ヨ繑鍥� + if (!referenceNodeId.equals(currentNodeId)) { + return Result.ok("鑺傜偣涓嶄竴鑷�"); + } + } + + // 5. 鎵�鏈変换鍔¤妭鐐逛竴鑷� + return Result.ok(currentNodeId); } /** @@ -970,56 +1057,36 @@ * @return */ @Override - public Result finishedList(Integer pageNum, Integer pageSize) { - Page<FlowTaskDto> page = new Page<>(); + public Result finishedList(Integer pageNum, Integer pageSize, FlowMyBusinessDto flowMyBusinessDto) { + //淇敼鏌ヨ锛屾坊鍔犳煡璇㈡潯浠� + Page page = new Page(pageNum, pageSize); String username = iFlowThirdService.getLoginUser().getUsername(); - HistoricTaskInstanceQuery taskInstanceQuery = historyService.createHistoricTaskInstanceQuery() - .includeProcessVariables() - .finished() - .taskAssignee(username) - .orderByHistoricTaskInstanceEndTime() - .desc(); - List<HistoricTaskInstance> historicTaskInstanceList = taskInstanceQuery.listPage((pageNum - 1)*pageSize, pageSize); - List<FlowTaskDto> hisTaskList = Lists.newArrayList(); - for (HistoricTaskInstance histTask : historicTaskInstanceList) { - FlowTaskDto flowTask = new FlowTaskDto(); - // 褰撳墠娴佺▼淇℃伅 - flowTask.setTaskId(histTask.getId()); - // 瀹℃壒浜哄憳淇℃伅 - flowTask.setCreateTime(histTask.getCreateTime()); - flowTask.setFinishTime(histTask.getEndTime()); - flowTask.setDuration(getDate(histTask.getDurationInMillis())); - flowTask.setProcDefId(histTask.getProcessDefinitionId()); - flowTask.setTaskDefKey(histTask.getTaskDefinitionKey()); - flowTask.setTaskName(histTask.getName()); - flowTask.setDescription(flowMyBusinessService.getByProcessInstanceId(histTask.getProcessInstanceId()).getTitle()); - // 娴佺▼瀹氫箟淇℃伅 - ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() - .processDefinitionId(histTask.getProcessDefinitionId()) - .singleResult(); - flowTask.setDeployId(pd.getDeploymentId()); - flowTask.setProcDefName(pd.getName()); - flowTask.setProcDefVersion(pd.getVersion()); - flowTask.setProcInsId(histTask.getProcessInstanceId()); - flowTask.setHisProcInsId(histTask.getProcessInstanceId()); - + flowMyBusinessDto.setCurrentUser(username); + List<FlowTaskDto> list = flowMyBusinessService.ListMyBusiness(flowMyBusinessDto); + list.forEach(flowTaskDto -> { // 娴佺▼鍙戣捣浜轰俊鎭� HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(histTask.getProcessInstanceId()) + .processInstanceId(flowTaskDto.getProcInsId()) .singleResult(); SysUser startUser = iFlowThirdService.getUserByUsername(historicProcessInstance.getStartUserId()); - flowTask.setStartUserId(startUser.getUsername()); - flowTask.setStartUserName(startUser.getRealname()); + if (startUser!=null){ + flowTaskDto.setStartUserId(startUser.getUsername()); + flowTaskDto.setStartUserName(startUser.getRealname()); + } List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(historicProcessInstance.getStartUserId()); - flowTask.setStartDeptName(CollUtil.join(departNamesByUsername,"锛�")); - hisTaskList.add(flowTask); - } - page.setTotal(hisTaskList.size()); - page.setRecords(hisTaskList); -// Map<String, Object> result = new HashMap<>(); -// result.put("result",page); -// result.put("finished",true); - return Result.OK(page); + flowTaskDto.setStartDeptName(CollUtil.join(departNamesByUsername,"锛�")); + if (flowTaskDto.getTodoUsers() == null){ + flowTaskDto.setTodoUsers(""); + }else { + //鍘婚櫎[] + flowTaskDto.setTodoUsers(flowTaskDto.getTodoUsers().replaceAll("\\[", "").replaceAll("\\]", "")); + flowTaskDto.setTodoUsers(flowTaskDto.getTodoUsers().replaceAll("\"", "")); + } + }); + IPage<FlowTaskDto> flowTaskDtoIPage = new Page<>(); + flowTaskDtoIPage.setRecords(list); + flowTaskDtoIPage.setTotal(page.getTotal()); + return Result.OK(flowTaskDtoIPage); } private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { -- Gitblit v1.9.3