Commit 2bc252237bd94bbcbbd981aece0433ff1a86dd64

Authored by YunaiV
1 parent 206b3ea9

【功能修复】工作流:没有审批人自动通过时,缺少了 owner 或 assignee 为空的判断

README.md
@@ -156,7 +156,7 @@ @@ -156,7 +156,7 @@
156 | 🚀 | 用户分组 | 自定义用户分组,可用于工作流的审批分组 | 156 | 🚀 | 用户分组 | 自定义用户分组,可用于工作流的审批分组 |
157 | 🚀 | 我的流程 | 查看我发起的工作流程,支持新建、取消流程等操作,高亮流程图、审批时间线 | 157 | 🚀 | 我的流程 | 查看我发起的工作流程,支持新建、取消流程等操作,高亮流程图、审批时间线 |
158 | 🚀 | 待办任务 | 查看自己【未】审批的工作任务,支持通过、不通过、转发、委派、退回等操作 | 158 | 🚀 | 待办任务 | 查看自己【未】审批的工作任务,支持通过、不通过、转发、委派、退回等操作 |
159 -| 🚀 | 已办任务 | 查看自己【已】审批的工作任务,未来会支持回退操作 | 159 +| 🚀 | 已办任务 | 查看自己【已】审批的工作任务,未来会支持退回操作 |
160 | 🚀 | OA 请假 | 作为业务自定义接入工作流的使用示例,只需创建请求对应的工作流程,即可进行审批 | 160 | 🚀 | OA 请假 | 作为业务自定义接入工作流的使用示例,只需创建请求对应的工作流程,即可进行审批 |
161 161
162 ![功能图](/.image/common/bpm-feature.png) 162 ![功能图](/.image/common/bpm-feature.png)
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
@@ -156,9 +156,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -156,9 +156,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
156 BpmnModel bpmnModel = bpmProcessDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId()); 156 BpmnModel bpmnModel = bpmProcessDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId());
157 List<BpmTaskRespVO> taskList = convertList(todoList, task -> { 157 List<BpmTaskRespVO> taskList = convertList(todoList, task -> {
158 // 找到分配给当前用户,或者当前用户加签的任务(为了减签) 158 // 找到分配给当前用户,或者当前用户加签的任务(为了减签)
159 - // TODO 3)(!userId.equals(NumberUtil.parseLong(task.getOwner(), null)) || BpmTaskSignTypeEnum.of(task.getScopeType()) == null) 这个判断的目的是啥?  
160 - // @芋艿 !isAddSignTask(userId, task) 该判断的目的被用户加签的任务。该用户可以进行减签操作  
161 - if (!isAssignUserTask(userId, task) && !isAddSignTask(userId, task)) { 159 + if (!isAssignUserTask(userId, task) && !isAddSignUserTask(userId, task)) {
162 return null; 160 return null;
163 } 161 }
164 BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class); 162 BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
@@ -166,9 +164,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -166,9 +164,10 @@ public class BpmTaskServiceImpl implements BpmTaskService {
166 taskVO.setButtonsSetting(BpmnModelUtils.parseButtonsSetting(bpmnModel, task.getTaskDefinitionKey())); 164 taskVO.setButtonsSetting(BpmnModelUtils.parseButtonsSetting(bpmnModel, task.getTaskDefinitionKey()));
167 BpmTaskConvert.INSTANCE.buildTaskOwner(taskVO, task.getOwner(), userMap, deptMap); 165 BpmTaskConvert.INSTANCE.buildTaskOwner(taskVO, task.getOwner(), userMap, deptMap);
168 // 如果是被加签的任务. 找到它的子任务 (为了减签) 166 // 如果是被加签的任务. 找到它的子任务 (为了减签)
169 - if (isAddSignTask(userId, task)) { 167 + // TODO @jason:如果是向后加签,这个判断有问题哈。因为向后加签后,当前任务,assignee 还是没变。可以简单点,直接拿子任务哈。另外,需要考虑子任务的子任务。
  168 + if (isAddSignUserTask(userId, task)) {
  169 + // TODO @jason:这里其实可以考虑,在 157 到 173 把所有需要的数据都拿到,然后交给 BpmTaskConvert.INSTANCE 转换出 taskVO。这样,service 只保留一些逻辑性强的东西,类似 status、buttonsetting,都拿到 convert 里去。
170 BpmTaskConvert.INSTANCE.buildTaskChildren(taskVO, childrenTaskMap, userMap, deptMap); 170 BpmTaskConvert.INSTANCE.buildTaskChildren(taskVO, childrenTaskMap, userMap, deptMap);
171 -  
172 } 171 }
173 return taskVO; 172 return taskVO;
174 }); 173 });
@@ -176,16 +175,24 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -176,16 +175,24 @@ public class BpmTaskServiceImpl implements BpmTaskService {
176 } 175 }
177 176
178 /** 177 /**
179 - * 判断是否为被分配给用户的任务 178 + * 判断指定用户,是否是当前任务的分配人
  179 + *
  180 + * @param userId 用户编号
  181 + * @param task 任务
  182 + * @return 是否
180 */ 183 */
181 private boolean isAssignUserTask(Long userId, Task task) { 184 private boolean isAssignUserTask(Long userId, Task task) {
182 return ObjectUtil.equal(userId, NumberUtil.parseLong(task.getAssignee(), null)); 185 return ObjectUtil.equal(userId, NumberUtil.parseLong(task.getAssignee(), null));
183 } 186 }
184 187
185 /** 188 /**
186 - * 判断是否为被用户加签的任务 189 + * 判断指定用户,是否是当前任务的加签人
  190 + *
  191 + * @param userId 用户编号
  192 + * @param task 任务
  193 + * @return 是否
187 */ 194 */
188 - private boolean isAddSignTask(Long userId, Task task) { 195 + private boolean isAddSignUserTask(Long userId, Task task) {
189 return userId.equals(NumberUtil.parseLong(task.getOwner(), null)) 196 return userId.equals(NumberUtil.parseLong(task.getOwner(), null))
190 && BpmTaskSignTypeEnum.of(task.getScopeType()) != null; 197 && BpmTaskSignTypeEnum.of(task.getScopeType()) != null;
191 } 198 }
@@ -994,8 +1001,13 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -994,8 +1001,13 @@ public class BpmTaskServiceImpl implements BpmTaskService {
994 if (ObjectUtil.notEqual(transactionStatus, TransactionSynchronization.STATUS_COMMITTED)) { 1001 if (ObjectUtil.notEqual(transactionStatus, TransactionSynchronization.STATUS_COMMITTED)) {
995 return; 1002 return;
996 } 1003 }
  1004 + // TODO 芋艿:可以后续优化成 getSelf();
997 // 特殊情况一:【人工审核】审批人为空,根据配置是否要自动通过、自动拒绝 1005 // 特殊情况一:【人工审核】审批人为空,根据配置是否要自动通过、自动拒绝
998 if (ObjectUtil.equal(approveType, BpmUserTaskApproveTypeEnum.USER.getType())) { 1006 if (ObjectUtil.equal(approveType, BpmUserTaskApproveTypeEnum.USER.getType())) {
  1007 + // 如果有审批人、或者拥有人,则说明不满足情况一,不自动通过、不自动拒绝
  1008 + if (!ObjectUtil.isAllEmpty(task.getAssignee(), task.getOwner())) {
  1009 + return;
  1010 + }
999 if (ObjectUtil.equal(assignEmptyHandlerType, BpmUserTaskAssignEmptyHandlerTypeEnum.APPROVE.getType())) { 1011 if (ObjectUtil.equal(assignEmptyHandlerType, BpmUserTaskAssignEmptyHandlerTypeEnum.APPROVE.getType())) {
1000 SpringUtil.getBean(BpmTaskService.class).approveTask(null, new BpmTaskApproveReqVO() 1012 SpringUtil.getBean(BpmTaskService.class).approveTask(null, new BpmTaskApproveReqVO()
1001 .setId(task.getId()).setReason(BpmReasonEnum.ASSIGN_EMPTY_APPROVE.getReason())); 1013 .setId(task.getId()).setReason(BpmReasonEnum.ASSIGN_EMPTY_APPROVE.getReason()));