From 4e2be858f4ccbb7490b59ed584fd1c829eb4d556 Mon Sep 17 00:00:00 2001 From: lyh <925863403@qq.com> Date: 星期二, 01 四月 2025 15:22:47 +0800 Subject: [PATCH] 修改审签问题 --- lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java | 5 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowHistoricalVo.java | 6 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/HisWorkTaskServiceImpl.java | 9 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskVoMapper.xml | 5 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java | 6 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/HisWorkTaskMapper.xml | 70 ++++++--- lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImplVo.java | 6 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java | 9 + lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskDataVo.java | 3 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoQueryRequest.java | 2 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java | 10 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml | 42 +++-- lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IDispatchFileService.java | 4 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java | 7 + lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/DispatchFileServiceImpl.java | 166 ++++++++++++++++++++--- lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/DispatchFileController.java | 23 ++ lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowTaskDto.java | 6 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java | 14 ++ 18 files changed, 304 insertions(+), 89 deletions(-) diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoQueryRequest.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoQueryRequest.java index 5b2adb1..462d983 100644 --- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoQueryRequest.java +++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoQueryRequest.java @@ -30,6 +30,8 @@ private String order; @ApiModelProperty(value = "鏂囨。鐘舵��") private String docStatus; + @ApiModelProperty(value = "瀹$鐘舵��") + private String docDispatchStatus; @ApiModelProperty(value = "鍑哄簱鐘舵��") private String pullStatus; @ApiModelProperty(value = "鍚屾鐘舵�� 1 鏈悓姝� 2 宸插悓姝�") diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java index 7d4f340..94b49ef 100644 --- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java +++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java @@ -528,6 +528,13 @@ }else { queryWrapper.eq(StrUtil.isNotEmpty(docQuery.getDocStatus()),"u.doc_status",docQuery.getDocStatus()); } + if (docQuery.getDocDispatchStatus() != null && docQuery.getDocDispatchStatus().contains(",")) { + String[] docDispatchStatusArray = docQuery.getDocDispatchStatus().split(","); + List<Integer> docDispatchStatusList = Arrays.stream(docDispatchStatusArray).map(Integer::parseInt).collect(Collectors.toList()); + queryWrapper.in("u.doc_dispatch_status",docDispatchStatusList); + }else { + queryWrapper.eq(StrUtil.isNotEmpty(docQuery.getDocDispatchStatus()),"u.doc_dispatch_status",docQuery.getDocDispatchStatus()); + } if (StrUtil.isNotEmpty(docQuery.getPullStatus())){ if (("1").equals(docQuery.getPullStatus())){ queryWrapper.isNull("o.doc_id"); @@ -754,6 +761,13 @@ }else { queryWrapper.eq(StrUtil.isNotEmpty(docQuery.getDocStatus()),"u.doc_status",docQuery.getDocStatus()); } + if (docQuery.getDocDispatchStatus() != null && docQuery.getDocDispatchStatus().contains(",")) { + String[] docDispatchStatusArray = docQuery.getDocDispatchStatus().split(","); + List<Integer> docDispatchStatusList = Arrays.stream(docDispatchStatusArray).map(Integer::parseInt).collect(Collectors.toList()); + queryWrapper.in("u.doc_dispatch_status",docDispatchStatusList); + }else { + queryWrapper.eq(StrUtil.isNotEmpty(docQuery.getDocDispatchStatus()),"u.doc_dispatch_status",docQuery.getDocDispatchStatus()); + } if (StrUtil.isNotEmpty(docQuery.getPullStatus())){ if (("1").equals(docQuery.getPullStatus())){ queryWrapper.isNull("o.doc_id"); diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java index 16ded6a..6a2c903 100644 --- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java +++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java @@ -91,11 +91,11 @@ }); } - // 6. 寰幆妫�娴� - if (sorted.size() != nodes.size()) { - handleSortingFailure(nodes, sorted, nodeMap); - return Collections.emptyList(); - } +// // 6. 寰幆妫�娴� +// if (sorted.size() != nodes.size()) { +// handleSortingFailure(nodes, sorted, nodeMap); +// return Collections.emptyList(); +// } return sorted; } diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/DispatchFileController.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/DispatchFileController.java index 6e7f712..6d338fb 100644 --- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/DispatchFileController.java +++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/DispatchFileController.java @@ -13,6 +13,8 @@ import org.jeecg.modules.dncFlow.entity.DispatchFile; import org.jeecg.modules.dncFlow.service.IDispatchFileService; import org.jeecg.modules.dncFlow.vo.DispatchFileFlowTaskVo; +import org.jeecg.modules.flowable.domain.dto.FlowTaskDto; +import org.jeecg.modules.flowable.service.IHisWorkTaskService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; @@ -35,6 +37,8 @@ @Autowired private IDispatchFileService dispatchFileService; + @Autowired + private IHisWorkTaskService hisWorkTaskService; /** * 鍒嗛〉鍒楄〃鏌ヨ * @@ -59,14 +63,14 @@ /** * 閲嶆柊鍚姩 - * @param id + * @param dispatchFileFlowTaskVo * @return */ @AutoLog(value = "nc绋嬪簭涓庣數瀛愬浘鐗堢娲�-閲嶆柊鍚姩") @ApiOperation(value="nc绋嬪簭涓庣數瀛愬浘鐗堢娲�-閲嶆柊鍚姩", notes="nc绋嬪簭涓庣數瀛愬浘鐗堢娲�-閲嶆柊鍚姩") - @GetMapping(value = "/saveDispatchFile") - public Result<?> saveDispatchFile(String id){ - return dispatchFileService.reStartDispatchFile(id); + @PostMapping(value = "/saveDispatchFile") + public Result<?> saveDispatchFile(@RequestBody DispatchFileFlowTaskVo dispatchFileFlowTaskVo){ + return dispatchFileService.reStartDispatchFile(dispatchFileFlowTaskVo); } @@ -77,11 +81,18 @@ */ @AutoLog(value = "nc绋嬪簭涓庣數瀛愬浘鐗堢娲�-瀹℃壒鎿嶄綔") @ApiOperation(value="nc绋嬪簭涓庣數瀛愬浘鐗堢娲�-瀹℃壒鎿嶄綔", notes="nc绋嬪簭涓庣數瀛愬浘鐗堢娲�-瀹℃壒鎿嶄綔") - @GetMapping(value = "/approval") - public Result<?> approval(DispatchFileFlowTaskVo dispatchFileFlowTaskVo){ + @PostMapping(value = "/approval") + public Result<?> approval(@RequestBody DispatchFileFlowTaskVo dispatchFileFlowTaskVo){ return dispatchFileService.auditDispatchFile(dispatchFileFlowTaskVo); } + + @ApiOperation(value = "鑾峰彇宸ヤ綔娴佸巻鍙蹭换鍔�", response = FlowTaskDto.class) + @GetMapping(value = "/queryHisTaskList") + public Result<?> queryHisTaskList(@RequestParam(name = "procInstId") String procInstId) { + return Result.OK(hisWorkTaskService.queryHisTaskByProcInstId(procInstId)); + } + /** * 娣诲姞 * diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IDispatchFileService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IDispatchFileService.java index cdacf7e..7502bd7 100644 --- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IDispatchFileService.java +++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IDispatchFileService.java @@ -22,9 +22,9 @@ /** * 閲嶆柊鍚姩 - * @param id + * @param dispatchFileFlowTaskVo */ - Result<?> reStartDispatchFile(String id); + Result<?> reStartDispatchFile(DispatchFileFlowTaskVo dispatchFileFlowTaskVo); /** * 瀹℃壒鎿嶄綔 diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/DispatchFileServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/DispatchFileServiceImpl.java index b768b7e..6ffcbf9 100644 --- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/DispatchFileServiceImpl.java +++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/DispatchFileServiceImpl.java @@ -1,11 +1,14 @@ package org.jeecg.modules.dncFlow.service.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.google.common.collect.Lists; import org.apache.shiro.SecurityUtils; +import org.flowable.common.engine.api.FlowableException; import org.flowable.engine.TaskService; +import org.flowable.identitylink.api.IdentityLink; +import org.flowable.task.api.Task; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.dnc.entity.*; @@ -27,15 +30,14 @@ import org.jeecg.modules.flowable.apithird.service.FlowCommonService; import org.jeecg.modules.flowable.service.IFlowDefinitionService; import org.jeecg.modules.flowable.service.IFlowTaskService; +import org.jeecg.modules.system.service.ISysUserRoleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @Description: nc绋嬪簭涓庣數瀛愬浘鐗堢娲� @@ -69,6 +71,8 @@ private IFlowMyBusinessService flowMyBusinessService; @Autowired private DocInfoMapper docInfoMapper; + @Autowired + private ISysUserRoleService sysUserRoleService; /** * 娴佺▼鍚姩,淇濆瓨瀵瑰簲鐨勬暟鎹� * @param dispatchFile @@ -95,6 +99,7 @@ Map<String, Object> variables = new HashMap<>(); variables.put("dataId", dispatchFile.getId()); variables.put("organization", "瀵煎叆鏂囨。榛樿鍚姩娴佺▼"); + variables.put("comment", "瀵煎叆鏂囨。榛樿鍚姩娴佺▼"); variables.put("proofreading",true); Result result= flowDefinitionService.startProcessInstanceByKey("nc_dispatch_file", variables); if (!result.isSuccess()) { @@ -108,26 +113,116 @@ /** * 閲嶆柊鍚姩 - * @param id + * @param dispatchFileFlowTaskVo */ @Override @Transactional(rollbackFor = {Exception.class}) - public Result<?> reStartDispatchFile(String id){ - DispatchFile dispatchFile = this.getById(id); - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - if (!dispatchFile.getCreateBy().equals(user.getUsername())){ - return Result.error("鎮ㄦ病鏈夋潈闄愰噸鏂板惎鍔�"); + public Result<?> reStartDispatchFile(DispatchFileFlowTaskVo dispatchFileFlowTaskVo) { + try { + // 1. 鑾峰彇褰撳墠鐢ㄦ埛骞舵牎楠岀櫥褰曠姸鎬� + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if (user == null) { + return Result.error("鐢ㄦ埛鏈櫥褰�"); + } + + // 2. 鏌ヨ娴佺▼涓氬姟璁板綍锛堝鐞嗙┖缁撴灉锛� + List<FlowMyBusiness> businessList = flowMyBusinessService.list( + new QueryWrapper<FlowMyBusiness>() + .eq("process_instance_id", dispatchFileFlowTaskVo.getInstanceId()) + ); + if (businessList.isEmpty()) { + return Result.error("娴佺▼璁板綍涓嶅瓨鍦�"); + } + FlowMyBusiness flowMyBusiness = businessList.get(0); + + // 3. 鏍¢獙鐢ㄦ埛鏄惁涓哄�欓�夊鐞嗕汉 + List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class); + if (todoUsers == null || !todoUsers.contains(user.getUsername())) { + return Result.error("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔�"); + } + + // 4. 璁ら浠诲姟锛堝鐞嗗凡琚棰嗙殑鎯呭喌锛� + String taskId = flowMyBusiness.getTaskId(); + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + if (task == null) { + return Result.error("浠诲姟涓嶅瓨鍦ㄦ垨宸插畬鎴�"); + } + if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) { + return Result.error("浠诲姟宸茶浠栦汉璁ら"); + } + taskService.claim(taskId, user.getUsername()); + + // 5. 瀹屾垚浠诲姟骞朵紶閫掑彉閲� + Map<String, Object> variables = new HashMap<>(); + variables.put("dataId", flowMyBusiness.getDataId()); + variables.put("organization", dispatchFileFlowTaskVo.getComment()); + variables.put("assignee", user.getUsername()); + variables.put("comment", dispatchFileFlowTaskVo.getComment()); + taskService.complete(taskId, variables); + + // 6. 鑾峰彇涓嬩竴浠诲姟骞舵洿鏂颁笟鍔¤褰� + List<Task> nextTasks = taskService.createTaskQuery() + .processInstanceId(dispatchFileFlowTaskVo.getInstanceId()) + .list(); + if (!nextTasks.isEmpty()) { + Task nextTask = nextTasks.get(0); // 鍋囪鍙栫涓�涓换鍔� + flowMyBusiness.setTaskId(nextTask.getId()); + flowMyBusiness.setTaskName(nextTask.getName()); + + // 鍔ㄦ�佽幏鍙栦笅涓�鑺傜偣鍊欓�変汉锛堢ず渚嬶級 + List<String> nextTodoUsers = getNextTaskCandidates(nextTask.getId()); + flowMyBusiness.setTodoUsers(JSON.toJSONString(nextTodoUsers)); + } else { + // 娴佺▼宸茬粨鏉燂紝娓呯┖浠诲姟淇℃伅 + flowMyBusiness.setTaskId(null); + flowMyBusiness.setTaskName(null); + flowMyBusiness.setTodoUsers(null); + } + flowMyBusinessService.updateById(flowMyBusiness); + + return Result.ok("娴佺▼閲嶅惎鎴愬姛"); + } catch (FlowableException e) { + return Result.error("娴佺▼鎿嶄綔澶辫触: " + e.getMessage()); + } catch (Exception e) { + return Result.error("绯荤粺閿欒: " + e.getMessage()); } - FlowMyBusiness flowMyBusiness=flowMyBusinessService.list(new QueryWrapper<FlowMyBusiness>() - .eq("data_id",dispatchFile.getId())).get(0); - String processInstanceId = flowMyBusiness.getProcessInstanceId(); - Map<String, Object> variables = new HashMap<>(); - variables.put("dataId", dispatchFile.getId()); - variables.put("organization", "閲嶆柊鍚姩"); - String TaskId=taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult().getId(); - taskService.complete(TaskId, variables); - return Result.ok("閲嶆柊鍚姩鎴愬姛"); } + + // 杈呭姪鏂规硶锛氳幏鍙栦笅涓�浠诲姟鐨勬墍鏈夊�欓�変俊鎭紙澶勭悊浜恒�佸�欓�夌敤鎴枫�佸�欓�夌粍锛� + private List<String> getNextTaskCandidates(String taskId) { + List<IdentityLink> links = taskService.getIdentityLinksForTask(taskId); + List<String> candidates = new ArrayList<>(); + + // 1. 鑾峰彇鐩存帴澶勭悊浜猴紙assignee锛� + links.stream() + .filter(link -> "assignee".equals(link.getType())) + .map(IdentityLink::getUserId) + .filter(Objects::nonNull) + .forEach(candidates::add); + + // 2. 鑾峰彇鍊欓�夌敤鎴峰拰鍊欓�夌粍 + links.stream() + .filter(link -> "candidate".equals(link.getType())) + .forEach(link -> { + if (link.getUserId() != null) { + // 鍊欓�夌敤鎴风洿鎺ユ坊鍔� + candidates.add(link.getUserId()); + } else if (link.getGroupId() != null) { + // 鍊欓�夌粍杞崲涓哄疄闄呯敤鎴凤紙绀轰緥閫昏緫锛岄渶鏍规嵁涓氬姟瀹炵幇锛� + List<String> groupUsers = convertGroupToUsers(link.getGroupId()); + candidates.addAll(groupUsers); + } + }); + + return candidates; + } + + // 绀轰緥鏂规硶锛氬皢鍊欓�夌粍ID杞崲涓虹敤鎴峰垪琛紙闇�鑷畾涔夊疄鐜帮級 + private List<String> convertGroupToUsers(String groupId) { + // 瀹為檯涓氬姟涓皟鐢ㄦ湇鍔℃帴鍙h幏鍙栫粍鎴愬憳 + return sysUserRoleService.getUserNameByRoleId(groupId); + } + /** * 瀹℃壒鎿嶄綔 @@ -157,6 +252,33 @@ if (docInfo == null) { return Result.error(ActivitiCode.ACT_DOC_ERROR.toString()); } + + // 2. 鏌ヨ娴佺▼涓氬姟璁板綍锛堝鐞嗙┖缁撴灉锛� + List<FlowMyBusiness> businessList = flowMyBusinessService.list( + new QueryWrapper<FlowMyBusiness>() + .eq("process_instance_id", dispatchFileFlowTaskVo.getInstanceId()) + ); + if (businessList.isEmpty()) { + return Result.error("娴佺▼璁板綍涓嶅瓨鍦�"); + } + FlowMyBusiness flowMyBusiness = businessList.get(0); + + // 3. 鏍¢獙鐢ㄦ埛鏄惁涓哄�欓�夊鐞嗕汉 + List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class); + if (todoUsers == null || !todoUsers.contains(user.getUsername())) { + return Result.error("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔�"); + } + + // 4. 璁ら浠诲姟锛堝鐞嗗凡琚棰嗙殑鎯呭喌锛� + String taskId = flowMyBusiness.getTaskId(); + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + if (task == null) { + return Result.error("浠诲姟涓嶅瓨鍦ㄦ垨宸插畬鎴�"); + } + if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) { + return Result.error("浠诲姟宸茶浠栦汉璁ら"); + } + taskService.claim(taskId, user.getUsername()); // 璁剧疆娴佺▼鍙橀噺 Map<String, Object> values = setProcessVariables(dispatchFile, userId, dispatchFileFlowTaskVo); @@ -203,7 +325,6 @@ values.put("organization", dispatchFile.getOrganization()); values.put("assignee", userId); values.put("comment", dispatchFileFlowTaskVo.getComment()); - if (StrUtil.isNotBlank(dispatchFileFlowTaskVo.getProofreadStatus())) { values.put("proofreadStatus", dispatchFileFlowTaskVo.getProofreadStatus()); } @@ -352,8 +473,7 @@ @Override public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) { - String dataId = values.get("dataId").toString(); - FlowMyBusiness flowMyBusiness=flowMyBusinessService.list(new QueryWrapper<FlowMyBusiness>().eq("data_id",dataId)).get(0); - return Lists.newArrayList(flowMyBusiness.getCreateBy()); + //涓氬姟鏄惁骞查娴佺▼锛屼笟鍔″共棰勶紝娴佺▼骞查锛屾寚瀹氫汉鍛樿繘琛屽鐞� + return null; } } diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml index cf2f3ad..72d3f84 100644 --- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml +++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml @@ -8,6 +8,10 @@ flow_my_business.proposer, flow_my_business.task_name, flow_my_business.task_id, + flow_my_business.data_id AS 'dataId', + flow_my_business.process_definition_key, + flow_my_business.process_definition_id, + flow_my_business.process_instance_id, ACT_RU_TASK.ASSIGNEE_ as todoUsers, flow_my_business.done_Users, ACT_HI_PROCINST.START_TIME_ AS start_time, @@ -41,25 +45,27 @@ </select> <select id="PageListMyBusiness" resultType="org.jeecg.modules.flowable.domain.dto.FlowTaskDto"> SELECT - task.ID_ as 'hisProcInsId', - TASK.PROC_INST_ID_ AS 'taskId', - ACT_RE_PROCDEF.CATEGORY_ AS 'category', - ACT_RE_PROCDEF.NAME_ 'procDefName', - flow_my_business.title AS 'Description', - flow_my_business.data_id AS 'dataId', - flow_my_business.process_definition_key AS 'processDefinitionKey', - flow_my_business.process_definition_id AS 'processDefinitionId', - flow_my_business.process_instance_id AS 'processInstanceId', - TASK.EXECUTION_ID_ AS 'executionId', - task.NAME_ AS 'taskName', - task.DURATION_ 'duration', - task.START_TIME_ AS 'createTime', - task.END_TIME_ AS 'finishTime', - task.TASK_DEF_KEY_ AS 'TaskDefKey' + task.ID_ AS 'taskId', + TASK.PROC_INST_ID_ AS 'procInsId', + ACT_RE_PROCDEF.CATEGORY_ AS 'category', + ACT_RE_PROCDEF.NAME_ 'procDefName', + flow_my_business.title AS 'Description', + flow_my_business.data_id AS 'dataId', + flow_my_business.process_definition_key AS 'processDefinitionKey', + flow_my_business.process_definition_id AS 'processDefinitionId', + ACT_HI_PROCINST.START_TIME_ AS createTime, + ACT_RU_TASK.ASSIGNEE_ as todoUsers, + task.END_TIME_ AS 'finishTime', + TASK.EXECUTION_ID_ AS 'executionId', + task.NAME_ AS 'taskName', + task.DURATION_ 'duration', + task.TASK_DEF_KEY_ AS 'TaskDefKey' FROM - ACT_HI_TASKINST TASK - LEFT JOIN flow_my_business ON flow_my_business.process_instance_id = TASK.PROC_INST_ID_ - LEFT JOIN ACT_RE_PROCDEF ON flow_my_business.process_definition_id = ACT_RE_PROCDEF.ID_ + ACT_HI_TASKINST TASK + LEFT JOIN flow_my_business ON flow_my_business.process_instance_id = TASK.PROC_INST_ID_ + LEFT JOIN ACT_RE_PROCDEF ON flow_my_business.process_definition_id = ACT_RE_PROCDEF.ID_ + LEFT JOIN ACT_HI_PROCINST ON TASK.PROC_INST_ID_ = ACT_HI_PROCINST.ID_ + left join ACT_RU_TASK on flow_my_business.task_id = ACT_RU_TASK.ID_ WHERE TASK.END_TIME_ IS NOT NULL <if test="flowMyBusinessDto.currentUser != null and flowMyBusinessDto.currentUser != ''"> diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowTaskDto.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowTaskDto.java index 4fc8beb..403bfec 100644 --- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowTaskDto.java +++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowTaskDto.java @@ -113,5 +113,9 @@ @Excel(name = "娴佺▼涓氬姟瀹炰緥id 涓�涓祦绋嬩笟鍔″敮涓�锛屾湰琛ㄤ腑涔熷敮涓�", width = 15) @ApiModelProperty(value = "娴佺▼涓氬姟瀹炰緥id 涓�涓祦绋嬩笟鍔″敮涓�锛屾湰琛ㄤ腑涔熷敮涓�") private String processInstanceId; - + /**褰撳墠鐨勮妭鐐瑰彲浠ュ鐞嗙殑鐢ㄦ埛鍚嶏紝涓簎sername鐨勯泦鍚坖son瀛楃涓�*/ + @Excel(name = "褰撳墠鐨勮妭鐐瑰彲浠ュ鐞嗙殑鐢ㄦ埛鍚�", width = 15) + @ApiModelProperty(value = "褰撳墠鐨勮妭鐐瑰彲浠ュ鐞嗙殑鐢ㄦ埛鍚�") + @Dict(dictTable = "sys_user", dicCode = "username", dicText = "realname") + private String todoUsers; } diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowHistoricalVo.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowHistoricalVo.java index 3dec366..2a858bf 100644 --- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowHistoricalVo.java +++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowHistoricalVo.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import lombok.Data; +import org.jeecg.common.aspect.annotation.Dict; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; @@ -61,6 +62,7 @@ /** * 澶勭悊浜� */ + @Dict(dictTable = "sys_user", dicCode = "username", dicText = "realname") private String assignee; /** * 浠诲姟鑰楁椂 @@ -70,4 +72,8 @@ * 浠诲姟鎻忚堪 */ private String description; + /** + * 澶勭悊缁撴灉 + */ + private String sequenceFlowName; } diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskDataVo.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskDataVo.java index b4f9f6b..b8ed938 100644 --- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskDataVo.java +++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskDataVo.java @@ -67,6 +67,9 @@ private String dataId; @ApiModelProperty(value = "鍓嶉┍鑺傜偣") private String preNode; + @ApiModelProperty(value = "鍓嶉┍鑺傜偣澶勭悊浜�") + @Dict(dictTable = "sys_user", dicCode = "username", dicText = "realname") + private String preNodeAssignee; @ApiModelProperty(value = "娴佺▼鍚嶇О") private transient String flowName; diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/HisWorkTaskMapper.xml b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/HisWorkTaskMapper.xml index ac9df17..edb48a8 100644 --- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/HisWorkTaskMapper.xml +++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/HisWorkTaskMapper.xml @@ -24,34 +24,52 @@ aht.START_TIME_ ASC </select> <select id="queryHisTaskByProcInstId" resultType="org.jeecg.modules.flowable.domain.vo.FlowHistoricalVo"> - SELECT - p.PROC_INST_ID_ AS procInstId, - p.BUSINESS_KEY_ AS businessKey, - p.START_TIME_ AS startTime, - p.END_TIME_ AS endTime, - a.ACT_NAME_ AS actName, - a.ACT_TYPE_ AS actType, - a.START_TIME_ AS actStartTime, - a.END_TIME_ AS actEndTime, - c.NAME_ AS taskName, - c.ASSIGNEE_ AS assignee, - CASE - WHEN c.DURATION_ IS NOT NULL THEN - CASE - WHEN FLOOR(c.DURATION_ / 1000.0) = 0 THEN NULL - ELSE FLOOR(c.DURATION_ / 1000.0) - END - ELSE NULL - END AS duration, - c.DESCRIPTION_ AS description + WITH ActivitySequence AS ( + SELECT + p.PROC_INST_ID_ AS procInstId, + p.BUSINESS_KEY_ AS businessKey, + p.START_TIME_ AS procStartTime, + p.END_TIME_ AS procEndTime, + a.ACT_ID_, + COALESCE ( a.ACT_NAME_, a.ACT_ID_ ) AS actName, + a.ACT_TYPE_ AS actType, + a.START_TIME_ AS actStartTime, + a.END_TIME_ AS actEndTime, + c.NAME_ AS taskName, + c.ASSIGNEE_ AS assignee, + c.DESCRIPTION_ AS description, +-- 浣跨敤 LEAD 鑾峰彇涓嬩竴涓椿鍔ㄤ俊鎭� + LEAD ( COALESCE ( a.ACT_NAME_, a.ACT_ID_ ) ) OVER ( PARTITION BY p.PROC_INST_ID_ ORDER BY a.START_TIME_ ) AS nextActName, + LEAD ( a.ACT_TYPE_ ) OVER ( PARTITION BY p.PROC_INST_ID_ ORDER BY a.START_TIME_ ) AS nextActType, + LEAD ( a.START_TIME_ ) OVER ( PARTITION BY p.PROC_INST_ID_ ORDER BY a.START_TIME_ ) AS nextActStartTime + FROM + act_hi_procinst p + LEFT JOIN act_hi_actinst a ON p.PROC_INST_ID_ = a.PROC_INST_ID_ + AND a.ACT_TYPE_ IN ( 'userTask', 'sequenceFlow' ) + LEFT JOIN ACT_HI_TASKINST c ON a.TASK_ID_ = c.ID_ + WHERE + p.PROC_INST_ID_ = #{procInstId} + ) SELECT + procInstId, + businessKey, +-- 褰撳墠娲诲姩锛坲serTask锛変俊鎭� + actName AS userTaskName, + taskName, + assignee, + actStartTime, + actEndTime, + description, +-- 涓嬩竴涓椿鍔紙sequenceFlow锛変俊鎭� + nextActName AS sequenceFlowName, + nextActStartTime AS sequenceFlowStartTime FROM - act_hi_procinst p - LEFT JOIN act_hi_actinst a ON p.PROC_INST_ID_ = a.PROC_INST_ID_ - LEFT JOIN ACT_HI_TASKINST c ON a.TASK_ID_ = c.ID_ + ActivitySequence WHERE - p.PROC_INST_ID_ = #{procInstId} - AND a.ACT_NAME_ IS NOT NULL + actType = 'userTask' -- 绛涢�夊綋鍓嶆椿鍔ㄤ负 userTask + + AND nextActType = 'sequenceFlow' -- 涓斾笅涓�涓椿鍔ㄤ负 sequenceFlow + ORDER BY - COALESCE(a.END_TIME_, '9999-12-31') ASC; + actStartTime; </select> </mapper> diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskVoMapper.xml b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskVoMapper.xml index 4137c80..017f4b5 100644 --- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskVoMapper.xml +++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskVoMapper.xml @@ -13,6 +13,7 @@ atask.priority_ AS priority, atask.create_time_ AS createTime, atask.suspension_state_ AS suspensionState, + atask.ASSIGNEE_ as assignee, fmb.act_status AS actStatus, fmb.title AS title, fmb.data_id AS dataId, @@ -26,7 +27,9 @@ LEFT JOIN flow_my_business fmb on atask.id_ = fmb.task_id LEFT JOIN ACT_RE_PROCDEF pro on atask.PROC_DEF_ID_ = pro.id_ WHERE - atask.assignee_ = #{flowMy.username} + (atask.assignee_ = #{flowMy.username} + OR ( atask.assignee_ IS NULL AND fmb.todo_users LIKE CONCAT('%',#{flowMy.username},'%')) + ) <if test="flowMy.flowName!= null and flowMy.flowName!= ''"> AND pro.name_ LIKE CONCAT('%',#{flowMy.flowName},'%') </if> 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 ab62a88..c9ae8f1 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 @@ -994,16 +994,15 @@ flowTaskDto.setCategory(pd.getCategory()); // 娴佺▼鍙戣捣浜轰俊鎭� HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(flowTaskDto.getTaskId()) + .processInstanceId(flowTaskDto.getProcInsId()) .singleResult(); SysUser startUser = iFlowThirdService.getUserByUsername(historicProcessInstance.getStartUserId()); flowTaskDto.setStartUserId(startUser.getUsername()); flowTaskDto.setStartUserName(startUser.getRealname()); List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(historicProcessInstance.getStartUserId()); flowTaskDto.setStartDeptName(CollUtil.join(departNamesByUsername,"锛�")); - flowTaskDto.setTaskId(flowTaskDto.getHisProcInsId()); }); - return Result.OK(page); + return Result.OK(flowTaskDtoIPage); } private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/HisWorkTaskServiceImpl.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/HisWorkTaskServiceImpl.java index 32fc6b0..87fa156 100644 --- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/HisWorkTaskServiceImpl.java +++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/HisWorkTaskServiceImpl.java @@ -1,19 +1,22 @@ package org.jeecg.modules.flowable.service.impl; -import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.ibatis.annotations.Param; +import org.flowable.engine.HistoryService; import org.jeecg.modules.flowable.domain.vo.FlowHistoricalVo; import org.jeecg.modules.flowable.domain.vo.HisWorkTask; import org.jeecg.modules.flowable.mapper.IHisWorkTaskMapper; import org.jeecg.modules.flowable.service.IHisWorkTaskService; import org.jeecg.modules.flowable.util.TimeUtil; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class HisWorkTaskServiceImpl extends ServiceImpl<IHisWorkTaskMapper,HisWorkTask> implements IHisWorkTaskService { + @Autowired + private HistoryService historyService; @Override public List<HisWorkTask> queryHisTaskList(String drapprovedataId) { return baseMapper.queryHisTaskList(drapprovedataId); @@ -30,8 +33,8 @@ List<FlowHistoricalVo> flowHistoricalVoList=baseMapper.queryHisTaskByProcInstId(procInstId); flowHistoricalVoList.forEach(flowHistoricalVo->{ //璁$畻鏃堕棿 - if (StrUtil.isNotEmpty(flowHistoricalVo.getDuration())){ - flowHistoricalVo.setDuration(TimeUtil.howLongByMillis(Long.parseLong(flowHistoricalVo.getDuration()),2)); + if (flowHistoricalVo.getActStartTime()!=null && flowHistoricalVo.getActEndTime()!=null){ + flowHistoricalVo.setDuration(TimeUtil.howLong(flowHistoricalVo.getActStartTime(),flowHistoricalVo.getActEndTime(),2)); } }); return flowHistoricalVoList; diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImplVo.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImplVo.java index 1cf95eb..ee8f6ea 100644 --- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImplVo.java +++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImplVo.java @@ -1,5 +1,6 @@ package org.jeecg.modules.flowable.service.impl; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -23,7 +24,10 @@ HistoricActivityInstance historicActivityInstance=flowMyBusinessService.getPreviousNode(workTaskDataVo.getId()); if (historicActivityInstance != null){ workTaskDataVo.setPreNode(historicActivityInstance.getActivityName()); - workTaskDataVo.setAssignee(historicActivityInstance.getAssignee()); + workTaskDataVo.setPreNodeAssignee(historicActivityInstance.getAssignee()); + } + if (StrUtil.isEmpty(workTaskDataVo.getAssignee())){ + workTaskDataVo.setAssignee(flowMy.getUsername()); } }); return workTaskDataVoIPage; diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java index 84fa63b..15f8bb8 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java @@ -41,4 +41,11 @@ List<SysUser> getUsersByRoles(@Param("roleList") List<String> roleList); + /** + * 閫氳繃瑙掕壊id鑾峰彇鐢ㄦ埛username + * @param roleId + */ + @Select("select username from sys_user where id in (select user_id from sys_user_role where role_id = #{roleId})") + List<String> getUserNameByRoleId(@Param("roleId") String roleId); + } diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java index cb1ef5f..c0096a3 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java @@ -22,4 +22,10 @@ * */ List<SysUser> queryUsersByRoles(List<String> roleList); + /** + * 閫氳繃瑙掕壊id鑾峰彇鐢ㄦ埛username + * @param roleId + */ + List<String> getUserNameByRoleId(String roleId); + } diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java index dad8e87..463b020 100644 --- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java +++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java @@ -33,4 +33,13 @@ return sysUserRoleMapper.getUsersByRoles(roleList); } + /** + * 閫氳繃瑙掕壊id鑾峰彇鐢ㄦ埛username + * @param roleId + */ + @Override + public List<String> getUserNameByRoleId(String roleId){ + return sysUserRoleMapper.getUserNameByRoleId(roleId); + } + } -- Gitblit v1.9.3