From fccfe7d50f42f5be4c4612d61b7ae852e2ef37cd Mon Sep 17 00:00:00 2001 From: lyh <925863403@qq.com> Date: 星期四, 17 四月 2025 15:26:09 +0800 Subject: [PATCH] 优化指派设备与审签设备的权限校验查询,新增导入电子样板触发审签流程,新增电子样板指派设备功能 --- lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/DispatchFileServiceImpl.java | 275 ++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 184 insertions(+), 91 deletions(-) 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..f72e491 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,21 +1,26 @@ 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.commons.beanutils.BeanUtils; 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.*; +import org.jeecg.modules.dnc.entity.DocInfo; +import org.jeecg.modules.dnc.entity.PermissionStreamNew; import org.jeecg.modules.dnc.exception.ExceptionCast; import org.jeecg.modules.dnc.mapper.DocInfoMapper; import org.jeecg.modules.dnc.request.DocInfoQueryRequest; import org.jeecg.modules.dnc.response.ActivitiCode; import org.jeecg.modules.dnc.response.CommonCode; import org.jeecg.modules.dnc.response.UcenterCode; -import org.jeecg.modules.dnc.service.*; +import org.jeecg.modules.dnc.service.IDocInfoService; import org.jeecg.modules.dnc.utils.ValidateUtil; import org.jeecg.modules.dncFlow.entity.DispatchFile; import org.jeecg.modules.dncFlow.mapper.DispatchFileMapper; @@ -27,15 +32,15 @@ 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.lang.reflect.InvocationTargetException; +import java.util.*; /** * @Description: nc绋嬪簭涓庣數瀛愬浘鐗堢娲� @@ -49,12 +54,6 @@ @Autowired @Lazy private IDocInfoService docInfoService; - @Autowired - private IProcessStreamService processStreamService; - @Autowired - private IWorkStepService workStepService; - @Autowired - private IPermissionStreamNewService permissionStreamNewService; @Resource private FlowCommonService flowCommonService; @Resource @@ -62,13 +61,15 @@ @Autowired private IFlowTaskService flowTaskService; @Autowired - private IDeviceTypeService deviceTypeService; - @Autowired private TaskService taskService; @Autowired private IFlowMyBusinessService flowMyBusinessService; @Autowired private DocInfoMapper docInfoMapper; + @Autowired + private ISysUserRoleService sysUserRoleService; + @Autowired + private PermissionService permissionService; /** * 娴佺▼鍚姩,淇濆瓨瀵瑰簲鐨勬暟鎹� * @param dispatchFile @@ -95,6 +96,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 +110,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); + } + /** * 瀹℃壒鎿嶄綔 @@ -135,6 +227,7 @@ * @return */ @Override + @Transactional public Result<?> auditDispatchFile(DispatchFileFlowTaskVo dispatchFileFlowTaskVo) { try { // 鍙傛暟鏍¢獙 @@ -158,6 +251,33 @@ 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); dispatchFileFlowTaskVo.setValues(values); @@ -177,6 +297,36 @@ } catch (Exception e) { return Result.error("鎿嶄綔澶辫触锛�" + e.getMessage()); } + } + + /** + * 鎵归噺瀹℃壒鎿嶄綔 + * @param dispatchFileFlowTaskVo + * @return + */ + @Override + @Transactional + public Result<?> auditBatchDispatchFile(DispatchFileFlowTaskVo dispatchFileFlowTaskVo) throws InvocationTargetException, IllegalAccessException { + if (dispatchFileFlowTaskVo.getTaskIds()==null || dispatchFileFlowTaskVo.getTaskIds().isEmpty()) { + return Result.error(CommonCode.INVALID_PARAM.toString()); + } + if (dispatchFileFlowTaskVo.getTaskIds().contains(",")){ + String[] taskIds = dispatchFileFlowTaskVo.getTaskIds().split(","); + for (String taskId : taskIds) { + FlowMyBusiness flowMyBusiness=flowMyBusinessService.getOne(new QueryWrapper<FlowMyBusiness>().eq("task_id",taskId)); + DispatchFileFlowTaskVo dispatchFileFlowTaskVoNew=new DispatchFileFlowTaskVo(); + BeanUtils.copyProperties(dispatchFileFlowTaskVoNew, dispatchFileFlowTaskVo); + dispatchFileFlowTaskVoNew.setTaskId(taskId); + dispatchFileFlowTaskVoNew.setDataId(flowMyBusiness.getDataId()); + dispatchFileFlowTaskVoNew.setInstanceId(flowMyBusiness.getProcessInstanceId()); + if (dispatchFileFlowTaskVo.getTargetKey().equals("task_prepare")){ + reStartDispatchFile(dispatchFileFlowTaskVoNew); + }else { + auditDispatchFile(dispatchFileFlowTaskVoNew); + } + } + } + return Result.OK("鎿嶄綔鎴愬姛"); } /** @@ -203,7 +353,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()); } @@ -270,67 +419,12 @@ return true; } - //鑾峰彇鏂囦欢淇℃伅 - private DocInfo getDocInfo(DispatchFile dispatchFile) { - DocInfo docInfo = docInfoService.getByDocAttrAndDocId(dispatchFile.getDocId(), - Integer.parseInt(dispatchFile.getAttributionType()), dispatchFile.getAttributionId()); - if (docInfo == null || docInfo.getDocStatus() == 3) { - ExceptionCast.cast(ActivitiCode.ACT_DOC_ERROR); - } - return docInfo; - } - - private PermissionStreamNew getPermissionStreams(DispatchFile dispatchFile) { - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - DeviceType deviceType = deviceTypeService.getById(dispatchFile.getAttributionId()); - String attributionId = deviceType != null ? deviceType.getAttributionId() : dispatchFile.getAttributionId(); - - PermissionStreamNew permissionStreams; - if (dispatchFile.getAttributionType().equals("5")) { - // 宸ュ簭 - permissionStreams = handleProcess(dispatchFile, attributionId, user); - } else { - // 宸ユ - permissionStreams = handleWorkStep(dispatchFile, attributionId, user); - } - if (permissionStreams == null) { + PermissionStreamNew permissionStreamNew = permissionService.getPermissionStreams(dispatchFile); + if (permissionStreamNew == null) { ExceptionCast.cast(ActivitiCode.ACT_NODE_DEPART_NONE); } - return permissionStreams; - } - - private PermissionStreamNew handleProcess(DispatchFile dispatchFile, String attributionId, LoginUser user) { - ProcessStream processStream = processStreamService.getById(attributionId); - if (processStream == null) { - ExceptionCast.cast(CommonCode.INVALID_PARAM); - } - dispatchFile.setProductId(processStream.getProductId()); - dispatchFile.setComponentId(processStream.getComponentId()); - dispatchFile.setPartsId(processStream.getPartsId()); - dispatchFile.setPsvId(processStream.getPsvId()); - dispatchFile.setProcessId(processStream.getProcessId()); - if (deviceTypeService.getById(dispatchFile.getAttributionId()) != null) { - dispatchFile.setDeviceTypeId(deviceTypeService.getById(dispatchFile.getAttributionId()).getId()); - } - return permissionStreamNewService.loadPermissionStreamNewByBusinessIdAndUserId(processStream.getProcessId(), user.getId(), "5"); - } - - private PermissionStreamNew handleWorkStep(DispatchFile dispatchFile, String attributionId, LoginUser user) { - WorkStep workStep = workStepService.getById(attributionId); - if (workStep == null) { - ExceptionCast.cast(CommonCode.INVALID_PARAM); - } - dispatchFile.setProductId(workStep.getProductId()); - dispatchFile.setComponentId(workStep.getComponentId()); - dispatchFile.setPartsId(workStep.getPartsId()); - dispatchFile.setPsvId(workStep.getPsvId()); - dispatchFile.setProcessId(workStep.getProcessId()); - dispatchFile.setStepId(workStep.getId()); - if (deviceTypeService.getById(dispatchFile.getAttributionId()) != null) { - dispatchFile.setDeviceTypeId(deviceTypeService.getById(dispatchFile.getAttributionId()).getId()); - } - return permissionStreamNewService.loadPermissionStreamNewByBusinessIdAndUserId(workStep.getId(), user.getId(), "6"); + return permissionStreamNew; } @Override @@ -352,8 +446,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; } } -- Gitblit v1.9.3