update 调整任务办理设置办理人

This commit is contained in:
gssong 2024-10-05 11:36:39 +08:00
parent 996faa1bf3
commit 47ba2bc404
5 changed files with 97 additions and 12 deletions

View File

@ -121,4 +121,9 @@ public class FlowTaskVo implements Serializable {
* 办理人 * 办理人
*/ */
private List<UserDTO> userDTOList; private List<UserDTO> userDTOList;
/**
* 办理人类型
*/
private String type;
} }

View File

@ -147,10 +147,10 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE);
// 获取下一个节点如果是网关节点则重新获取后续节点 // 获取下一个节点如果是网关节点则重新获取后续节点
List<Node> nextNodes = FlowFactory.taskService().getNextByCheckGateWay(new FlowParams(), getFirstBetween(startNode)); //List<Node> nextNodes = FlowFactory.taskService().getNextByCheckGateWay(new FlowParams(), getFirstBetween(startNode));
Node node = nextNodes.get(0); //Node node = nextNodes.get(0);
FlowParams flowParams = FlowParams.build().nodeCode(node.getNodeCode()).skipType(SkipType.PASS.getKey()).permissionFlag(WorkflowUtils.permissionList()); // FlowParams flowParams = FlowParams.build().nodeCode(node.getNodeCode()).skipType(SkipType.PASS.getKey()).permissionFlag(WorkflowUtils.permissionList());
taskService.skip(list.get(0).getId(), flowParams); // taskService.skip(list.get(0).getId(), flowParams);
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View File

@ -1,6 +1,7 @@
package org.dromara.workflow.service.impl; package org.dromara.workflow.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.warm.flow.core.dto.FlowParams; import com.warm.flow.core.dto.FlowParams;
@ -15,8 +16,10 @@ import com.warm.flow.core.service.TaskService;
import com.warm.flow.core.service.UserService; import com.warm.flow.core.service.UserService;
import com.warm.flow.orm.entity.FlowInstance; import com.warm.flow.orm.entity.FlowInstance;
import com.warm.flow.orm.entity.FlowTask; import com.warm.flow.orm.entity.FlowTask;
import com.warm.flow.orm.mapper.FlowTaskMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.dto.UserDTO;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
@ -54,6 +57,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
private final IWfDefinitionConfigService wfDefinitionConfigService; private final IWfDefinitionConfigService wfDefinitionConfigService;
private final IFlwInstanceService iFlwInstanceService; private final IFlwInstanceService iFlwInstanceService;
private final FlowTaskMapper flowTaskMapper;
/** /**
* 启动任务 * 启动任务
* *
@ -121,7 +126,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
flowParams.message(completeTaskBo.getMessage()); flowParams.message(completeTaskBo.getMessage());
flowParams.handler(userId); flowParams.handler(userId);
flowParams.permissionFlag(WorkflowUtils.permissionList()); flowParams.permissionFlag(WorkflowUtils.permissionList());
taskService.skip(taskId, flowParams); Instance instance = taskService.skip(taskId, flowParams);
setHandler(instance);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
@ -129,6 +135,31 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
} }
} }
/**
* 设置办理人
*
* @param instance 实例
*/
private void setHandler(Instance instance) {
if (instance != null) {
List<FlowTask> flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class)
.eq(FlowTask::getInstanceId, instance.getId()));
for (FlowTask flowTask : flowTasks) {
List<User> userList = userService.getByAssociateds(Collections.singletonList(flowTask.getId()));
if (CollUtil.isNotEmpty(userList)) {
Set<User> users = WorkflowUtils.getUser(userList);
if (CollUtil.isNotEmpty(users)) {
userService.deleteByTaskIds(Collections.singletonList(flowTask.getId()));
for (User user : users) {
user.setAssociated(flowTask.getId());
}
userService.saveBatch(new ArrayList<>(users));
}
}
}
}
}
/** /**
* 查询当前用户的待办任务 * 查询当前用户的待办任务
* *

View File

@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.warm.flow.core.entity.Task; import com.warm.flow.core.entity.Task;
import com.warm.flow.core.entity.User; import com.warm.flow.core.entity.User;
import com.warm.flow.orm.entity.FlowUser;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.dto.RoleDTO;
@ -111,12 +112,12 @@ public class WorkflowUtils {
for (User user : userList) { for (User user : userList) {
if (user.getProcessedBy().startsWith("user:")) { if (user.getProcessedBy().startsWith("user:")) {
userIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON))); userIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)));
} } else if (user.getProcessedBy().startsWith("role:")) {
if (user.getProcessedBy().startsWith("role:")) {
roleIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON))); roleIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)));
} } else if (user.getProcessedBy().startsWith("dept:")) {
if (user.getProcessedBy().startsWith("dept:")) {
deptIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON))); deptIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)));
} else {
userIds.add(Long.valueOf(user.getProcessedBy()));
} }
} }
List<UserDTO> users = userService.selectListByIds(userIds); List<UserDTO> users = userService.selectListByIds(userIds);
@ -134,4 +135,50 @@ public class WorkflowUtils {
} }
return userDTOList; return userDTOList;
} }
/**
* 获取办理人
*
* @param userList 办理用户
* @return 用户
*/
public static Set<User> getUser(List<User> userList) {
Set<User> list = new HashSet<>();
if (CollUtil.isNotEmpty(userList)) {
UserService userService = SpringUtils.getBean(UserService.class);
for (User user : userList) {
if (user.getProcessedBy().startsWith("user:")) {
Long userId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON));
List<UserDTO> users = userService.selectListByIds(List.of(userId));
if (CollUtil.isNotEmpty(users)) {
FlowUser u = new FlowUser();
u.setType(user.getType());
u.setProcessedBy(String.valueOf(StreamUtils.toList(users, UserDTO::getUserId).get(0)));
list.add(u);
}
}
if (user.getProcessedBy().startsWith("role:")) {
Long roleId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON));
List<UserDTO> roleUsers = userService.selectUsersByRoleIds(List.of(roleId));
for (UserDTO roleUser : roleUsers) {
FlowUser u = new FlowUser();
u.setType(user.getType());
u.setProcessedBy(String.valueOf(roleUser.getUserId()));
list.add(u);
}
}
if (user.getProcessedBy().startsWith("dept:")) {
Long deptId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON));
List<UserDTO> deptUsers = userService.selectUsersByDeptIds(List.of(deptId));
for (UserDTO deptUser : deptUsers) {
FlowUser u = new FlowUser();
u.setType(user.getType());
u.setProcessedBy(String.valueOf(deptUser.getUserId()));
list.add(u);
}
}
}
}
return list;
}
} }

View File

@ -20,6 +20,7 @@
<result property="formCustom" column="form_custom"/> <result property="formCustom" column="form_custom"/>
<result property="formPath" column="form_path"/> <result property="formPath" column="form_path"/>
<result property="delFlag" column="del_flag"/> <result property="delFlag" column="del_flag"/>
<result property="type" column="type"/>
</resultMap> </resultMap>
<resultMap type="org.dromara.workflow.domain.vo.FlowHisTaskVo" id="FlowHisTaskResult"> <resultMap type="org.dromara.workflow.domain.vo.FlowHisTaskVo" id="FlowHisTaskResult">
<result property="id" column="id"/> <result property="id" column="id"/>
@ -63,11 +64,12 @@
d.flow_code, d.flow_code,
d.form_custom, d.form_custom,
d.form_path, d.form_path,
uu.processed_by uu.processed_by,
uu.type
FROM flow_task AS t FROM flow_task AS t
LEFT JOIN flow_user uu ON uu.associated = t.id LEFT JOIN flow_user uu ON uu.associated = t.id
LEFT JOIN flow_definition d on t.definition_id = d.id LEFT JOIN flow_definition d on t.definition_id = d.id
LEFT JOIN flow_instance i on t.instance_id = i.id where t.node_type = 1 and t.del_flag = '0') t LEFT JOIN flow_instance i on t.instance_id = i.id where t.node_type = 1 and t.del_flag = '0' and uu.del_flag = '0') t
${ew.getCustomSqlSegment} ${ew.getCustomSqlSegment}
</select> </select>
@ -117,7 +119,7 @@
LEFT JOIN flow_instance b ON a.associated = b.id LEFT JOIN flow_instance b ON a.associated = b.id
LEFT JOIN flow_definition d on b.definition_id=d.id LEFT JOIN flow_definition d on b.definition_id=d.id
WHERE WHERE
a.type = 4 a.type = 4 and a.del_flag = '0'
) t ${ew.getCustomSqlSegment} ) t ${ew.getCustomSqlSegment}
</select> </select>
</mapper> </mapper>