mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	update 重构 workflow 模块与 system 模块解耦
This commit is contained in:
		@@ -0,0 +1,46 @@
 | 
			
		||||
package org.dromara.common.core.domain.dto;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
import java.io.Serial;
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * OSS对象
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lion Li
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
public class OssDTO implements Serializable {
 | 
			
		||||
 | 
			
		||||
    @Serial
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 对象存储主键
 | 
			
		||||
     */
 | 
			
		||||
    private Long ossId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 文件名
 | 
			
		||||
     */
 | 
			
		||||
    private String fileName;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 原名
 | 
			
		||||
     */
 | 
			
		||||
    private String originalName;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 文件后缀名
 | 
			
		||||
     */
 | 
			
		||||
    private String fileSuffix;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * URL地址
 | 
			
		||||
     */
 | 
			
		||||
    private String url;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -3,6 +3,7 @@ package org.dromara.common.core.domain.dto;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
import java.io.Serial;
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -15,6 +16,9 @@ import java.io.Serializable;
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
public class RoleDTO implements Serializable {
 | 
			
		||||
 | 
			
		||||
    @Serial
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 角色ID
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,73 @@
 | 
			
		||||
package org.dromara.common.core.domain.dto;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
import java.io.Serial;
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 用户
 | 
			
		||||
 *
 | 
			
		||||
 * @author Michelle.Chung
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
public class UserDTO implements Serializable {
 | 
			
		||||
 | 
			
		||||
    @Serial
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户ID
 | 
			
		||||
     */
 | 
			
		||||
    private Long userId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 部门ID
 | 
			
		||||
     */
 | 
			
		||||
    private Long deptId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户账号
 | 
			
		||||
     */
 | 
			
		||||
    private String userName;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户昵称
 | 
			
		||||
     */
 | 
			
		||||
    private String nickName;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户类型(sys_user系统用户)
 | 
			
		||||
     */
 | 
			
		||||
    private String userType;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户邮箱
 | 
			
		||||
     */
 | 
			
		||||
    private String email;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 手机号码
 | 
			
		||||
     */
 | 
			
		||||
    private String phonenumber;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户性别(0男 1女 2未知)
 | 
			
		||||
     */
 | 
			
		||||
    private String sex;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 帐号状态(0正常 1停用)
 | 
			
		||||
     */
 | 
			
		||||
    private String status;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建时间
 | 
			
		||||
     */
 | 
			
		||||
    private Date createTime;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,9 @@
 | 
			
		||||
package org.dromara.common.core.service;
 | 
			
		||||
 | 
			
		||||
import org.dromara.common.core.domain.dto.OssDTO;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 通用 OSS服务
 | 
			
		||||
 *
 | 
			
		||||
@@ -15,4 +19,11 @@ public interface OssService {
 | 
			
		||||
     */
 | 
			
		||||
    String selectUrlByIds(String ossIds);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过ossId查询列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param ossIds ossId串逗号分隔
 | 
			
		||||
     * @return 列表
 | 
			
		||||
     */
 | 
			
		||||
    List<OssDTO> selectByIds(String ossIds);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,9 @@
 | 
			
		||||
package org.dromara.common.core.service;
 | 
			
		||||
 | 
			
		||||
import org.dromara.common.core.domain.dto.UserDTO;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 通用 用户服务
 | 
			
		||||
 *
 | 
			
		||||
@@ -47,4 +51,19 @@ public interface UserService {
 | 
			
		||||
     */
 | 
			
		||||
    String selectEmailById(Long userId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过用户ID查询用户列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param userIds 用户ids
 | 
			
		||||
     * @return 用户列表
 | 
			
		||||
     */
 | 
			
		||||
    List<UserDTO> selectListByIds(List<Long> userIds);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过角色ID查询用户ID
 | 
			
		||||
     *
 | 
			
		||||
     * @param roleIds 角色ids
 | 
			
		||||
     * @return 用户ids
 | 
			
		||||
     */
 | 
			
		||||
    List<Long> selectUserIdsByRoleIds(List<Long> roleIds);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -296,4 +296,5 @@ public class SysUserController extends BaseController {
 | 
			
		||||
    public R<List<SysUserVo>> listByDept(@PathVariable @NotNull Long deptId) {
 | 
			
		||||
        return R.ok(userService.selectUserListByDept(deptId));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -103,6 +103,11 @@ public class SysUserBo extends BaseEntity {
 | 
			
		||||
     */
 | 
			
		||||
    private Long roleId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 排除不查询的用户(工作流用)
 | 
			
		||||
     */
 | 
			
		||||
    private String excludeUserIds;
 | 
			
		||||
 | 
			
		||||
    public SysUserBo(Long userId) {
 | 
			
		||||
        this.userId = userId;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package org.dromara.system.service.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.convert.Convert;
 | 
			
		||||
import cn.hutool.core.io.IoUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
@@ -9,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import jakarta.servlet.http.HttpServletResponse;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import org.dromara.common.core.constant.CacheNames;
 | 
			
		||||
import org.dromara.common.core.domain.dto.OssDTO;
 | 
			
		||||
import org.dromara.common.core.exception.ServiceException;
 | 
			
		||||
import org.dromara.common.core.service.OssService;
 | 
			
		||||
import org.dromara.common.core.utils.MapstructUtils;
 | 
			
		||||
@@ -114,6 +116,24 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
 | 
			
		||||
        return String.join(StringUtils.SEPARATOR, list);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<OssDTO> selectByIds(String ossIds) {
 | 
			
		||||
        List<OssDTO> list = new ArrayList<>();
 | 
			
		||||
        for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) {
 | 
			
		||||
            SysOssVo vo = SpringUtils.getAopProxy(this).getById(id);
 | 
			
		||||
            if (ObjectUtil.isNotNull(vo)) {
 | 
			
		||||
                try {
 | 
			
		||||
                    vo.setUrl(this.matchingUrl(vo).getUrl());
 | 
			
		||||
                    list.add(BeanUtil.toBean(vo, OssDTO.class));
 | 
			
		||||
                } catch (Exception ignored) {
 | 
			
		||||
                    // 如果oss异常无法连接则将数据直接返回
 | 
			
		||||
                    list.add(BeanUtil.toBean(vo, OssDTO.class));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return list;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private LambdaQueryWrapper<SysOss> buildQueryWrapper(SysOssBo bo) {
 | 
			
		||||
        Map<String, Object> params = bo.getParams();
 | 
			
		||||
        LambdaQueryWrapper<SysOss> lqw = Wrappers.lambdaQuery();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package org.dromara.system.service.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.convert.Convert;
 | 
			
		||||
import cn.hutool.core.util.ArrayUtil;
 | 
			
		||||
@@ -14,6 +15,7 @@ import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.dromara.common.core.constant.CacheNames;
 | 
			
		||||
import org.dromara.common.core.constant.UserConstants;
 | 
			
		||||
import org.dromara.common.core.domain.dto.UserDTO;
 | 
			
		||||
import org.dromara.common.core.exception.ServiceException;
 | 
			
		||||
import org.dromara.common.core.service.UserService;
 | 
			
		||||
import org.dromara.common.core.utils.MapstructUtils;
 | 
			
		||||
@@ -29,7 +31,10 @@ import org.dromara.system.domain.SysUser;
 | 
			
		||||
import org.dromara.system.domain.SysUserPost;
 | 
			
		||||
import org.dromara.system.domain.SysUserRole;
 | 
			
		||||
import org.dromara.system.domain.bo.SysUserBo;
 | 
			
		||||
import org.dromara.system.domain.vo.*;
 | 
			
		||||
import org.dromara.system.domain.vo.SysPostVo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysRoleVo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysUserExportVo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysUserVo;
 | 
			
		||||
import org.dromara.system.mapper.*;
 | 
			
		||||
import org.dromara.system.service.ISysUserService;
 | 
			
		||||
import org.springframework.cache.annotation.Cacheable;
 | 
			
		||||
@@ -92,6 +97,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
 | 
			
		||||
                ids.add(user.getDeptId());
 | 
			
		||||
                w.in("u.dept_id", ids);
 | 
			
		||||
            }).orderByAsc("u.user_id");
 | 
			
		||||
        if (StringUtils.isNotBlank(user.getExcludeUserIds())) {
 | 
			
		||||
            wrapper.notIn("u.user_id", StringUtils.splitList(user.getExcludeUserIds()));
 | 
			
		||||
        }
 | 
			
		||||
        return wrapper;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -623,4 +631,20 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
 | 
			
		||||
        return ObjectUtil.isNull(sysUser) ? null : sysUser.getEmail();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<UserDTO> selectListByIds(List<Long> userIds) {
 | 
			
		||||
        if (CollUtil.isEmpty(userIds)) {
 | 
			
		||||
            return List.of();
 | 
			
		||||
        }
 | 
			
		||||
        List<SysUserVo> list = this.selectUserByIds(userIds, null);
 | 
			
		||||
        return BeanUtil.copyToList(list, UserDTO.class);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<Long> selectUserIdsByRoleIds(List<Long> roleIds) {
 | 
			
		||||
        List<SysUserRole> userRoles = userRoleMapper.selectList(
 | 
			
		||||
            new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getRoleId, roleIds));
 | 
			
		||||
        return StreamUtils.toList(userRoles, SysUserRole::getUserId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -66,12 +66,6 @@
 | 
			
		||||
            </exclusions>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!--系统模块-->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.dromara</groupId>
 | 
			
		||||
            <artifactId>ruoyi-system</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.dromara</groupId>
 | 
			
		||||
            <artifactId>ruoyi-common-websocket</artifactId>
 | 
			
		||||
@@ -87,6 +81,35 @@
 | 
			
		||||
            <artifactId>ruoyi-common-sms</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.dromara</groupId>
 | 
			
		||||
            <artifactId>ruoyi-common-mybatis</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.dromara</groupId>
 | 
			
		||||
            <artifactId>ruoyi-common-web</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.dromara</groupId>
 | 
			
		||||
            <artifactId>ruoyi-common-log</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.dromara</groupId>
 | 
			
		||||
            <artifactId>ruoyi-common-idempotent</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.dromara</groupId>
 | 
			
		||||
            <artifactId>ruoyi-common-excel</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.dromara</groupId>
 | 
			
		||||
            <artifactId>ruoyi-common-translation</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.dromara</groupId>
 | 
			
		||||
            <artifactId>ruoyi-common-tenant</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
 
 | 
			
		||||
@@ -271,4 +271,25 @@ public class ActTaskController extends BaseController {
 | 
			
		||||
    public R<List<WfTaskBackNode>> getNodeList(@PathVariable String processInstanceId) {
 | 
			
		||||
        return R.ok(CollUtil.reverse(iWfTaskBackNodeService.getListByInstanceId(processInstanceId)));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询工作流任务用户选择加签人员
 | 
			
		||||
     *
 | 
			
		||||
     * @param taskId 任务id
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/getTaskUserIdsByAddMultiInstance/{taskId}")
 | 
			
		||||
    public R<String> getTaskUserIdsByAddMultiInstance(@PathVariable String taskId) {
 | 
			
		||||
        return R.ok(actTaskService.getTaskUserIdsByAddMultiInstance(taskId));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询工作流选择减签人员
 | 
			
		||||
     *
 | 
			
		||||
     * @param taskId 任务id
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/getListByDeleteMultiInstance/{taskId}")
 | 
			
		||||
    public R<List<TaskVo>> getListByDeleteMultiInstance(@PathVariable String taskId) {
 | 
			
		||||
        return R.ok(actTaskService.getListByDeleteMultiInstance(taskId));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,6 @@ import org.dromara.common.log.enums.BusinessType;
 | 
			
		||||
import org.dromara.common.mybatis.core.page.PageQuery;
 | 
			
		||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
 | 
			
		||||
import org.dromara.common.web.core.BaseController;
 | 
			
		||||
import org.dromara.workflow.domain.TestLeave;
 | 
			
		||||
import org.dromara.workflow.domain.bo.TestLeaveBo;
 | 
			
		||||
import org.dromara.workflow.domain.vo.TestLeaveVo;
 | 
			
		||||
import org.dromara.workflow.service.ITestLeaveService;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,72 +0,0 @@
 | 
			
		||||
package org.dromara.workflow.controller;
 | 
			
		||||
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import org.dromara.common.core.domain.R;
 | 
			
		||||
import org.dromara.common.mybatis.core.page.PageQuery;
 | 
			
		||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
 | 
			
		||||
import org.dromara.common.web.core.BaseController;
 | 
			
		||||
import org.dromara.system.domain.bo.SysUserBo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysUserVo;
 | 
			
		||||
import org.dromara.workflow.domain.bo.SysUserMultiBo;
 | 
			
		||||
import org.dromara.workflow.domain.vo.TaskVo;
 | 
			
		||||
import org.dromara.workflow.service.IWorkflowUserService;
 | 
			
		||||
import org.springframework.validation.annotation.Validated;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 工作流用户选人管理 控制层
 | 
			
		||||
 *
 | 
			
		||||
 * @author may
 | 
			
		||||
 */
 | 
			
		||||
@Validated
 | 
			
		||||
@RequiredArgsConstructor
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/workflow/user")
 | 
			
		||||
public class WorkflowUserController extends BaseController {
 | 
			
		||||
 | 
			
		||||
    private final IWorkflowUserService workflowUserService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询工作流选择加签人员
 | 
			
		||||
     *
 | 
			
		||||
     * @param bo 参数
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/getPageByAddMultiInstance")
 | 
			
		||||
    public TableDataInfo<SysUserVo> getPageByAddMultiInstance(SysUserMultiBo bo, PageQuery pageQuery) {
 | 
			
		||||
        return workflowUserService.getPageByAddMultiInstance(bo, pageQuery);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询工作流选择减签人员
 | 
			
		||||
     *
 | 
			
		||||
     * @param taskId 任务id
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/getListByDeleteMultiInstance/{taskId}")
 | 
			
		||||
    public R<List<TaskVo>> getListByDeleteMultiInstance(@PathVariable String taskId) {
 | 
			
		||||
        return R.ok(workflowUserService.getListByDeleteMultiInstance(taskId));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 按照用户id查询用户
 | 
			
		||||
     *
 | 
			
		||||
     * @param userIds 用户id
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/getUserListByIds/{userIds}")
 | 
			
		||||
    public R<List<SysUserVo>> getUserListByIds(@PathVariable List<Long> userIds) {
 | 
			
		||||
        return R.ok(workflowUserService.getUserListByIds(userIds));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询用户
 | 
			
		||||
     *
 | 
			
		||||
     * @param sysUserBo 参数
 | 
			
		||||
     * @param pageQuery 分页
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/getPageByUserList")
 | 
			
		||||
    public TableDataInfo<SysUserVo> getPageByUserList(SysUserBo sysUserBo, PageQuery pageQuery) {
 | 
			
		||||
        return workflowUserService.getPageByUserList(sysUserBo, pageQuery);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,20 +1,17 @@
 | 
			
		||||
package org.dromara.workflow.flowable.cmd;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import org.dromara.common.core.domain.dto.OssDTO;
 | 
			
		||||
import org.dromara.common.core.service.OssService;
 | 
			
		||||
import org.dromara.common.core.utils.SpringUtils;
 | 
			
		||||
import org.dromara.common.core.utils.StreamUtils;
 | 
			
		||||
import org.dromara.common.core.utils.StringUtils;
 | 
			
		||||
import org.dromara.common.satoken.utils.LoginHelper;
 | 
			
		||||
import org.dromara.system.domain.vo.SysOssVo;
 | 
			
		||||
import org.dromara.system.service.ISysOssService;
 | 
			
		||||
import org.flowable.common.engine.impl.interceptor.Command;
 | 
			
		||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
 | 
			
		||||
import org.flowable.engine.impl.persistence.entity.AttachmentEntity;
 | 
			
		||||
import org.flowable.engine.impl.persistence.entity.AttachmentEntityManager;
 | 
			
		||||
import org.flowable.engine.impl.util.CommandContextUtil;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@@ -41,20 +38,19 @@ public class AttachmentCmd implements Command<Boolean> {
 | 
			
		||||
    public Boolean execute(CommandContext commandContext) {
 | 
			
		||||
        try {
 | 
			
		||||
            if (StringUtils.isNotBlank(fileId)) {
 | 
			
		||||
                List<Long> fileIds = StreamUtils.toList(Arrays.asList(fileId.split(StrUtil.COMMA)), Long::valueOf);
 | 
			
		||||
                List<SysOssVo> sysOssVos = SpringUtils.getBean(ISysOssService.class).listByIds(fileIds);
 | 
			
		||||
                if (CollUtil.isNotEmpty(sysOssVos)) {
 | 
			
		||||
                    for (SysOssVo sysOssVo : sysOssVos) {
 | 
			
		||||
                List<OssDTO> ossList = SpringUtils.getBean(OssService.class).selectByIds(fileId);
 | 
			
		||||
                if (CollUtil.isNotEmpty(ossList)) {
 | 
			
		||||
                    for (OssDTO oss : ossList) {
 | 
			
		||||
                        AttachmentEntityManager attachmentEntityManager = CommandContextUtil.getAttachmentEntityManager();
 | 
			
		||||
                        AttachmentEntity attachmentEntity = attachmentEntityManager.create();
 | 
			
		||||
                        attachmentEntity.setRevision(1);
 | 
			
		||||
                        attachmentEntity.setUserId(LoginHelper.getUserId().toString());
 | 
			
		||||
                        attachmentEntity.setName(sysOssVo.getOriginalName());
 | 
			
		||||
                        attachmentEntity.setDescription(sysOssVo.getOriginalName());
 | 
			
		||||
                        attachmentEntity.setType(sysOssVo.getFileSuffix());
 | 
			
		||||
                        attachmentEntity.setName(oss.getOriginalName());
 | 
			
		||||
                        attachmentEntity.setDescription(oss.getOriginalName());
 | 
			
		||||
                        attachmentEntity.setType(oss.getFileSuffix());
 | 
			
		||||
                        attachmentEntity.setTaskId(taskId);
 | 
			
		||||
                        attachmentEntity.setProcessInstanceId(processInstanceId);
 | 
			
		||||
                        attachmentEntity.setContentId(sysOssVo.getOssId().toString());
 | 
			
		||||
                        attachmentEntity.setContentId(oss.getOssId().toString());
 | 
			
		||||
                        attachmentEntity.setTime(new Date());
 | 
			
		||||
                        attachmentEntityManager.insert(attachmentEntity);
 | 
			
		||||
                    }
 | 
			
		||||
 
 | 
			
		||||
@@ -142,4 +142,8 @@ public interface IActTaskService {
 | 
			
		||||
     * @return 结果
 | 
			
		||||
     */
 | 
			
		||||
    List<VariableVo> getInstanceVariable(String taskId);
 | 
			
		||||
 | 
			
		||||
    String getTaskUserIdsByAddMultiInstance(String taskId);
 | 
			
		||||
 | 
			
		||||
    List<TaskVo> getListByDeleteMultiInstance(String taskId);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,61 +0,0 @@
 | 
			
		||||
package org.dromara.workflow.service;
 | 
			
		||||
 | 
			
		||||
import org.dromara.common.mybatis.core.page.PageQuery;
 | 
			
		||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
 | 
			
		||||
import org.dromara.system.domain.SysUserRole;
 | 
			
		||||
import org.dromara.system.domain.bo.SysUserBo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysUserVo;
 | 
			
		||||
import org.dromara.workflow.domain.bo.SysUserMultiBo;
 | 
			
		||||
import org.dromara.workflow.domain.vo.TaskVo;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 工作流用户选人管理 服务层
 | 
			
		||||
 *
 | 
			
		||||
 * @author may
 | 
			
		||||
 */
 | 
			
		||||
public interface IWorkflowUserService {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询工作流选择加签人员
 | 
			
		||||
     *
 | 
			
		||||
     * @param sysUserMultiBo 参数
 | 
			
		||||
     * @param pageQuery      分页
 | 
			
		||||
     * @return 结果
 | 
			
		||||
     */
 | 
			
		||||
    TableDataInfo<SysUserVo> getPageByAddMultiInstance(SysUserMultiBo sysUserMultiBo, PageQuery pageQuery);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询工作流选择减签人员
 | 
			
		||||
     *
 | 
			
		||||
     * @param taskId 任务id
 | 
			
		||||
     * @return 结果
 | 
			
		||||
     */
 | 
			
		||||
    List<TaskVo> getListByDeleteMultiInstance(String taskId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 按照用户id查询用户
 | 
			
		||||
     *
 | 
			
		||||
     * @param userIds 用户id
 | 
			
		||||
     * @return 结果
 | 
			
		||||
     */
 | 
			
		||||
    List<SysUserVo> getUserListByIds(List<Long> userIds);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 按照角色id查询关联用户id
 | 
			
		||||
     *
 | 
			
		||||
     * @param roleIds 角色id
 | 
			
		||||
     * @return 结果
 | 
			
		||||
     */
 | 
			
		||||
    List<SysUserRole> getUserRoleListByRoleIds(List<Long> roleIds);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询用户
 | 
			
		||||
     *
 | 
			
		||||
     * @param sysUserBo 参数
 | 
			
		||||
     * @param pageQuery 分页
 | 
			
		||||
     * @return 结果
 | 
			
		||||
     */
 | 
			
		||||
    TableDataInfo<SysUserVo> getPageByUserList(SysUserBo sysUserBo, PageQuery pageQuery);
 | 
			
		||||
}
 | 
			
		||||
@@ -8,7 +8,9 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import org.dromara.common.core.domain.dto.RoleDTO;
 | 
			
		||||
import org.dromara.common.core.domain.dto.UserDTO;
 | 
			
		||||
import org.dromara.common.core.exception.ServiceException;
 | 
			
		||||
import org.dromara.common.core.service.UserService;
 | 
			
		||||
import org.dromara.common.core.utils.StreamUtils;
 | 
			
		||||
import org.dromara.common.core.utils.StringUtils;
 | 
			
		||||
import org.dromara.common.mybatis.core.page.PageQuery;
 | 
			
		||||
@@ -79,6 +81,7 @@ public class ActTaskServiceImpl implements IActTaskService {
 | 
			
		||||
    private final ActHiTaskinstMapper actHiTaskinstMapper;
 | 
			
		||||
    private final IWfNodeConfigService iWfNodeConfigService;
 | 
			
		||||
    private final IWfDefinitionConfigService iWfDefinitionConfigService;
 | 
			
		||||
    private final UserService userService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 启动任务
 | 
			
		||||
@@ -777,4 +780,87 @@ public class ActTaskServiceImpl implements IActTaskService {
 | 
			
		||||
        }
 | 
			
		||||
        return variableVoList;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public String getTaskUserIdsByAddMultiInstance(String taskId) {
 | 
			
		||||
        Task task = QueryUtils.taskQuery().taskId(taskId).singleResult();
 | 
			
		||||
        if (task == null) {
 | 
			
		||||
            throw new ServiceException("任务不存在");
 | 
			
		||||
        }
 | 
			
		||||
        MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey());
 | 
			
		||||
        if (multiInstance == null) {
 | 
			
		||||
            return "";
 | 
			
		||||
        }
 | 
			
		||||
        List<Long> userIds;
 | 
			
		||||
        if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) {
 | 
			
		||||
            userIds = (List<Long>) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList());
 | 
			
		||||
        } else {
 | 
			
		||||
            List<Task> list = QueryUtils.taskQuery(task.getProcessInstanceId()).list();
 | 
			
		||||
            userIds = StreamUtils.toList(list, e -> Long.valueOf(e.getAssignee()));
 | 
			
		||||
        }
 | 
			
		||||
        return StringUtils.join(userIds, StringUtils.SEPARATOR);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询工作流选择减签人员
 | 
			
		||||
     *
 | 
			
		||||
     * @param taskId 任务id 任务id
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public List<TaskVo> getListByDeleteMultiInstance(String taskId) {
 | 
			
		||||
        Task task = QueryUtils.taskQuery().taskId(taskId).singleResult();
 | 
			
		||||
        List<Task> taskList = QueryUtils.taskQuery(task.getProcessInstanceId()).list();
 | 
			
		||||
        MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey());
 | 
			
		||||
        List<TaskVo> taskListVo = new ArrayList<>();
 | 
			
		||||
        if (multiInstance == null) {
 | 
			
		||||
            return List.of();
 | 
			
		||||
        }
 | 
			
		||||
        List<Long> assigneeList = new ArrayList<>();
 | 
			
		||||
        if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) {
 | 
			
		||||
            List<Object> variable = (List<Object>) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList());
 | 
			
		||||
            for (Object o : variable) {
 | 
			
		||||
                assigneeList.add(Long.valueOf(o.toString()));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) {
 | 
			
		||||
            List<Long> userIds = StreamUtils.filter(assigneeList, e -> !String.valueOf(e).equals(task.getAssignee()));
 | 
			
		||||
            List<UserDTO> userList = userService.selectListByIds(userIds);
 | 
			
		||||
            for (Long userId : userIds) {
 | 
			
		||||
                TaskVo taskVo = new TaskVo();
 | 
			
		||||
                taskVo.setId("串行会签");
 | 
			
		||||
                taskVo.setExecutionId("串行会签");
 | 
			
		||||
                taskVo.setProcessInstanceId(task.getProcessInstanceId());
 | 
			
		||||
                taskVo.setName(task.getName());
 | 
			
		||||
                taskVo.setAssignee(userId);
 | 
			
		||||
                if (CollUtil.isNotEmpty(userList)) {
 | 
			
		||||
                    userList.stream().filter(u -> u.getUserId().toString().equals(userId.toString())).findFirst().ifPresent(u -> taskVo.setAssigneeName(u.getNickName()));
 | 
			
		||||
                }
 | 
			
		||||
                taskListVo.add(taskVo);
 | 
			
		||||
            }
 | 
			
		||||
            return taskListVo;
 | 
			
		||||
        } else if (multiInstance.getType() instanceof ParallelMultiInstanceBehavior) {
 | 
			
		||||
            List<Task> tasks = StreamUtils.filter(taskList, e -> StringUtils.isBlank(e.getParentTaskId()) && !e.getExecutionId().equals(task.getExecutionId()) && e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey()));
 | 
			
		||||
            if (CollUtil.isNotEmpty(tasks)) {
 | 
			
		||||
                List<Long> userIds = StreamUtils.toList(tasks, e -> Long.valueOf(e.getAssignee()));
 | 
			
		||||
                List<UserDTO> userList = userService.selectListByIds(userIds);
 | 
			
		||||
                for (Task t : tasks) {
 | 
			
		||||
                    TaskVo taskVo = new TaskVo();
 | 
			
		||||
                    taskVo.setId(t.getId());
 | 
			
		||||
                    taskVo.setExecutionId(t.getExecutionId());
 | 
			
		||||
                    taskVo.setProcessInstanceId(t.getProcessInstanceId());
 | 
			
		||||
                    taskVo.setName(t.getName());
 | 
			
		||||
                    taskVo.setAssignee(Long.valueOf(t.getAssignee()));
 | 
			
		||||
                    if (CollUtil.isNotEmpty(userList)) {
 | 
			
		||||
                        userList.stream().filter(u -> u.getUserId().toString().equals(t.getAssignee())).findFirst().ifPresent(e -> taskVo.setAssigneeName(e.getNickName()));
 | 
			
		||||
                    }
 | 
			
		||||
                    taskListVo.add(taskVo);
 | 
			
		||||
                }
 | 
			
		||||
                return taskListVo;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return List.of();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,214 +0,0 @@
 | 
			
		||||
package org.dromara.workflow.service.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import org.dromara.common.core.enums.UserStatus;
 | 
			
		||||
import org.dromara.common.core.exception.ServiceException;
 | 
			
		||||
import org.dromara.common.core.utils.StreamUtils;
 | 
			
		||||
import org.dromara.common.core.utils.StringUtils;
 | 
			
		||||
import org.dromara.common.mybatis.core.page.PageQuery;
 | 
			
		||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
 | 
			
		||||
import org.dromara.system.domain.SysUser;
 | 
			
		||||
import org.dromara.system.domain.SysUserRole;
 | 
			
		||||
import org.dromara.system.domain.bo.SysUserBo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysUserVo;
 | 
			
		||||
import org.dromara.system.mapper.SysUserMapper;
 | 
			
		||||
import org.dromara.system.mapper.SysUserRoleMapper;
 | 
			
		||||
import org.dromara.workflow.domain.bo.SysUserMultiBo;
 | 
			
		||||
import org.dromara.workflow.domain.vo.MultiInstanceVo;
 | 
			
		||||
import org.dromara.workflow.domain.vo.TaskVo;
 | 
			
		||||
import org.dromara.workflow.service.IWorkflowUserService;
 | 
			
		||||
import org.dromara.workflow.utils.QueryUtils;
 | 
			
		||||
import org.dromara.workflow.utils.WorkflowUtils;
 | 
			
		||||
import org.flowable.engine.RuntimeService;
 | 
			
		||||
import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior;
 | 
			
		||||
import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior;
 | 
			
		||||
import org.flowable.task.api.Task;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 工作流用户选人管理 业务处理层
 | 
			
		||||
 *
 | 
			
		||||
 * @author may
 | 
			
		||||
 */
 | 
			
		||||
@RequiredArgsConstructor
 | 
			
		||||
@Service
 | 
			
		||||
public class WorkflowUserServiceImpl implements IWorkflowUserService {
 | 
			
		||||
 | 
			
		||||
    private final SysUserMapper sysUserMapper;
 | 
			
		||||
    private final SysUserRoleMapper sysUserRoleMapper;
 | 
			
		||||
    private final RuntimeService runtimeService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询工作流选择加签人员
 | 
			
		||||
     *
 | 
			
		||||
     * @param bo        参数
 | 
			
		||||
     * @param pageQuery 分页
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public TableDataInfo<SysUserVo> getPageByAddMultiInstance(SysUserMultiBo bo, PageQuery pageQuery) {
 | 
			
		||||
        Task task = QueryUtils.taskQuery().taskId(bo.getTaskId()).singleResult();
 | 
			
		||||
        if (task == null) {
 | 
			
		||||
            throw new ServiceException("任务不存在");
 | 
			
		||||
        }
 | 
			
		||||
        MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey());
 | 
			
		||||
        if (multiInstance == null) {
 | 
			
		||||
            return TableDataInfo.build();
 | 
			
		||||
        }
 | 
			
		||||
        LambdaQueryWrapper<SysUser> queryWrapper = Wrappers.lambdaQuery();
 | 
			
		||||
        //检索条件
 | 
			
		||||
        queryWrapper.eq(StringUtils.isNotEmpty(bo.getDeptId()), SysUser::getDeptId, bo.getDeptId());
 | 
			
		||||
        queryWrapper.eq(SysUser::getStatus, UserStatus.OK.getCode());
 | 
			
		||||
        if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) {
 | 
			
		||||
            List<Long> assigneeList = (List<Long>) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList());
 | 
			
		||||
            queryWrapper.notIn(CollUtil.isNotEmpty(assigneeList), SysUser::getUserId, assigneeList);
 | 
			
		||||
        } else {
 | 
			
		||||
            List<Task> list = QueryUtils.taskQuery(task.getProcessInstanceId()).list();
 | 
			
		||||
            List<Long> userIds = StreamUtils.toList(list, e -> Long.valueOf(e.getAssignee()));
 | 
			
		||||
            queryWrapper.notIn(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds);
 | 
			
		||||
        }
 | 
			
		||||
        queryWrapper.like(StringUtils.isNotEmpty(bo.getUserName()), SysUser::getUserName, bo.getUserName());
 | 
			
		||||
        queryWrapper.like(StringUtils.isNotEmpty(bo.getNickName()), SysUser::getNickName, bo.getNickName());
 | 
			
		||||
        Page<SysUser> page = new Page<>(pageQuery.getFirstNum(), pageQuery.getPageSize());
 | 
			
		||||
        Page<SysUserVo> userPage = sysUserMapper.selectVoPage(page, queryWrapper);
 | 
			
		||||
        return TableDataInfo.build(recordPage(userPage));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询工作流选择减签人员
 | 
			
		||||
     *
 | 
			
		||||
     * @param taskId 任务id 任务id
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public List<TaskVo> getListByDeleteMultiInstance(String taskId) {
 | 
			
		||||
        Task task = QueryUtils.taskQuery().taskId(taskId).singleResult();
 | 
			
		||||
        List<Task> taskList = QueryUtils.taskQuery(task.getProcessInstanceId()).list();
 | 
			
		||||
        MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey());
 | 
			
		||||
        List<TaskVo> taskListVo = new ArrayList<>();
 | 
			
		||||
        if (multiInstance == null) {
 | 
			
		||||
            return Collections.emptyList();
 | 
			
		||||
        }
 | 
			
		||||
        List<Long> assigneeList = new ArrayList<>();
 | 
			
		||||
        if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) {
 | 
			
		||||
            List<Object> variable = (List<Object>) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList());
 | 
			
		||||
            for (Object o : variable) {
 | 
			
		||||
                assigneeList.add(Long.valueOf(o.toString()));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) {
 | 
			
		||||
            List<Long> userIds = StreamUtils.filter(assigneeList, e -> !String.valueOf(e).equals(task.getAssignee()));
 | 
			
		||||
            List<SysUserVo> sysUsers = null;
 | 
			
		||||
            if (CollUtil.isNotEmpty(userIds)) {
 | 
			
		||||
                sysUsers = sysUserMapper.selectVoBatchIds(userIds);
 | 
			
		||||
            }
 | 
			
		||||
            for (Long userId : userIds) {
 | 
			
		||||
                TaskVo taskVo = new TaskVo();
 | 
			
		||||
                taskVo.setId("串行会签");
 | 
			
		||||
                taskVo.setExecutionId("串行会签");
 | 
			
		||||
                taskVo.setProcessInstanceId(task.getProcessInstanceId());
 | 
			
		||||
                taskVo.setName(task.getName());
 | 
			
		||||
                taskVo.setAssignee(userId);
 | 
			
		||||
                if (CollUtil.isNotEmpty(sysUsers)) {
 | 
			
		||||
                    sysUsers.stream().filter(u -> u.getUserId().toString().equals(userId.toString())).findFirst().ifPresent(u -> taskVo.setAssigneeName(u.getNickName()));
 | 
			
		||||
                }
 | 
			
		||||
                taskListVo.add(taskVo);
 | 
			
		||||
            }
 | 
			
		||||
            return taskListVo;
 | 
			
		||||
        } else if (multiInstance.getType() instanceof ParallelMultiInstanceBehavior) {
 | 
			
		||||
            List<Task> tasks = StreamUtils.filter(taskList, e -> StringUtils.isBlank(e.getParentTaskId()) && !e.getExecutionId().equals(task.getExecutionId()) && e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey()));
 | 
			
		||||
            if (CollUtil.isNotEmpty(tasks)) {
 | 
			
		||||
                List<Long> userIds = StreamUtils.toList(tasks, e -> Long.valueOf(e.getAssignee()));
 | 
			
		||||
                List<SysUserVo> sysUsers = null;
 | 
			
		||||
                if (CollUtil.isNotEmpty(userIds)) {
 | 
			
		||||
                    sysUsers = sysUserMapper.selectVoBatchIds(userIds);
 | 
			
		||||
                }
 | 
			
		||||
                for (Task t : tasks) {
 | 
			
		||||
                    TaskVo taskVo = new TaskVo();
 | 
			
		||||
                    taskVo.setId(t.getId());
 | 
			
		||||
                    taskVo.setExecutionId(t.getExecutionId());
 | 
			
		||||
                    taskVo.setProcessInstanceId(t.getProcessInstanceId());
 | 
			
		||||
                    taskVo.setName(t.getName());
 | 
			
		||||
                    taskVo.setAssignee(Long.valueOf(t.getAssignee()));
 | 
			
		||||
                    if (CollUtil.isNotEmpty(sysUsers)) {
 | 
			
		||||
                        sysUsers.stream().filter(u -> u.getUserId().toString().equals(t.getAssignee())).findFirst().ifPresent(e -> taskVo.setAssigneeName(e.getNickName()));
 | 
			
		||||
                    }
 | 
			
		||||
                    taskListVo.add(taskVo);
 | 
			
		||||
                }
 | 
			
		||||
                return taskListVo;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return Collections.emptyList();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 翻译部门
 | 
			
		||||
     *
 | 
			
		||||
     * @param page 用户分页数据
 | 
			
		||||
     */
 | 
			
		||||
    private Page<SysUserVo> recordPage(Page<SysUserVo> page) {
 | 
			
		||||
        List<SysUserVo> records = page.getRecords();
 | 
			
		||||
        if (CollUtil.isEmpty(records)) {
 | 
			
		||||
            return page;
 | 
			
		||||
        }
 | 
			
		||||
        List<Long> collectDeptId = StreamUtils.toList(records, SysUserVo::getDeptId);
 | 
			
		||||
        if (CollUtil.isEmpty(collectDeptId)) {
 | 
			
		||||
            return page;
 | 
			
		||||
        }
 | 
			
		||||
        page.setRecords(records);
 | 
			
		||||
        return page;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 按照用户id查询用户
 | 
			
		||||
     *
 | 
			
		||||
     * @param userIds 用户id
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<SysUserVo> getUserListByIds(List<Long> userIds) {
 | 
			
		||||
        if (CollUtil.isEmpty(userIds)) {
 | 
			
		||||
            return Collections.emptyList();
 | 
			
		||||
        }
 | 
			
		||||
        LambdaQueryWrapper<SysUser> queryWrapper = Wrappers.lambdaQuery();
 | 
			
		||||
        // 检索条件
 | 
			
		||||
        queryWrapper.eq(SysUser::getStatus, UserStatus.OK.getCode());
 | 
			
		||||
        queryWrapper.in(SysUser::getUserId, userIds);
 | 
			
		||||
        return sysUserMapper.selectVoList(queryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 按照角色id查询关联用户id
 | 
			
		||||
     *
 | 
			
		||||
     * @param roleIds 角色id
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<SysUserRole> getUserRoleListByRoleIds(List<Long> roleIds) {
 | 
			
		||||
        return sysUserRoleMapper.selectList(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getRoleId, roleIds));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询用户
 | 
			
		||||
     *
 | 
			
		||||
     * @param sysUserBo 参数
 | 
			
		||||
     * @param pageQuery 分页
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public TableDataInfo<SysUserVo> getPageByUserList(SysUserBo sysUserBo, PageQuery pageQuery) {
 | 
			
		||||
        LambdaQueryWrapper<SysUser> queryWrapper = Wrappers.lambdaQuery();
 | 
			
		||||
        queryWrapper.eq(sysUserBo.getDeptId() != null, SysUser::getDeptId, sysUserBo.getDeptId());
 | 
			
		||||
        queryWrapper.eq(SysUser::getStatus, UserStatus.OK.getCode());
 | 
			
		||||
        queryWrapper.like(StringUtils.isNotEmpty(sysUserBo.getUserName()), SysUser::getUserName, sysUserBo.getUserName());
 | 
			
		||||
        queryWrapper.like(StringUtils.isNotEmpty(sysUserBo.getNickName()), SysUser::getNickName, sysUserBo.getNickName());
 | 
			
		||||
        Page<SysUserVo> userPage = sysUserMapper.selectVoPage(pageQuery.build(), queryWrapper);
 | 
			
		||||
        return TableDataInfo.build(recordPage(userPage));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -7,6 +7,8 @@ import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
			
		||||
import lombok.AccessLevel;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
import org.dromara.common.core.domain.dto.UserDTO;
 | 
			
		||||
import org.dromara.common.core.service.UserService;
 | 
			
		||||
import org.dromara.common.core.utils.SpringUtils;
 | 
			
		||||
import org.dromara.common.core.utils.StreamUtils;
 | 
			
		||||
import org.dromara.common.core.utils.StringUtils;
 | 
			
		||||
@@ -15,18 +17,18 @@ import org.dromara.common.mail.utils.MailUtils;
 | 
			
		||||
import org.dromara.common.tenant.helper.TenantHelper;
 | 
			
		||||
import org.dromara.common.websocket.dto.WebSocketMessageDto;
 | 
			
		||||
import org.dromara.common.websocket.utils.WebSocketUtils;
 | 
			
		||||
import org.dromara.system.domain.SysUserRole;
 | 
			
		||||
import org.dromara.system.domain.vo.SysUserVo;
 | 
			
		||||
import org.dromara.workflow.common.constant.FlowConstant;
 | 
			
		||||
import org.dromara.workflow.common.enums.BusinessStatusEnum;
 | 
			
		||||
import org.dromara.workflow.common.enums.MessageTypeEnum;
 | 
			
		||||
import org.dromara.workflow.common.enums.TaskStatusEnum;
 | 
			
		||||
import org.dromara.workflow.domain.ActHiProcinst;
 | 
			
		||||
import org.dromara.workflow.domain.ActHiTaskinst;
 | 
			
		||||
import org.dromara.workflow.domain.vo.*;
 | 
			
		||||
import org.dromara.workflow.domain.vo.MultiInstanceVo;
 | 
			
		||||
import org.dromara.workflow.domain.vo.ParticipantVo;
 | 
			
		||||
import org.dromara.workflow.domain.vo.ProcessInstanceVo;
 | 
			
		||||
import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd;
 | 
			
		||||
import org.dromara.workflow.mapper.ActHiTaskinstMapper;
 | 
			
		||||
import org.dromara.workflow.service.*;
 | 
			
		||||
import org.dromara.workflow.service.IActHiProcinstService;
 | 
			
		||||
import org.flowable.bpmn.model.BpmnModel;
 | 
			
		||||
import org.flowable.bpmn.model.FlowNode;
 | 
			
		||||
import org.flowable.common.engine.api.delegate.Expression;
 | 
			
		||||
@@ -41,7 +43,7 @@ import org.flowable.task.service.impl.persistence.entity.TaskEntity;
 | 
			
		||||
 | 
			
		||||
import java.util.*;
 | 
			
		||||
 | 
			
		||||
import static org.dromara.workflow.common.constant.FlowConstant.*;
 | 
			
		||||
import static org.dromara.workflow.common.constant.FlowConstant.PROCESS_INSTANCE_VO;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 工作流工具
 | 
			
		||||
@@ -52,7 +54,7 @@ import static org.dromara.workflow.common.constant.FlowConstant.*;
 | 
			
		||||
public class WorkflowUtils {
 | 
			
		||||
 | 
			
		||||
    private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class);
 | 
			
		||||
    private static final IWorkflowUserService WORKFLOW_USER_SERVICE = SpringUtils.getBean(IWorkflowUserService.class);
 | 
			
		||||
    private static final UserService USER_SERVICE = SpringUtils.getBean(UserService.class);
 | 
			
		||||
    private static final IActHiProcinstService ACT_HI_PROCINST_SERVICE = SpringUtils.getBean(IActHiProcinstService.class);
 | 
			
		||||
    private static final ActHiTaskinstMapper ACT_HI_TASKINST_MAPPER = SpringUtils.getBean(ActHiTaskinstMapper.class);
 | 
			
		||||
 | 
			
		||||
@@ -138,15 +140,14 @@ public class WorkflowUtils {
 | 
			
		||||
            List<HistoricIdentityLink> groupList = StreamUtils.filter(linksForTask, e -> StringUtils.isNotBlank(e.getGroupId()));
 | 
			
		||||
            if (CollUtil.isNotEmpty(groupList)) {
 | 
			
		||||
                List<Long> groupIds = StreamUtils.toList(groupList, e -> Long.valueOf(e.getGroupId()));
 | 
			
		||||
                List<SysUserRole> sysUserRoles = WORKFLOW_USER_SERVICE.getUserRoleListByRoleIds(groupIds);
 | 
			
		||||
                if (CollUtil.isNotEmpty(sysUserRoles)) {
 | 
			
		||||
                List<Long> userIds = USER_SERVICE.selectUserIdsByRoleIds(groupIds);
 | 
			
		||||
                if (CollUtil.isNotEmpty(userIds)) {
 | 
			
		||||
                    participantVo.setGroupIds(groupIds);
 | 
			
		||||
                    List<Long> userIdList = StreamUtils.toList(sysUserRoles, SysUserRole::getUserId);
 | 
			
		||||
                    List<SysUserVo> sysUsers = WORKFLOW_USER_SERVICE.getUserListByIds(userIdList);
 | 
			
		||||
                    if (CollUtil.isNotEmpty(sysUsers)) {
 | 
			
		||||
                        List<Long> userIds = StreamUtils.toList(sysUsers, SysUserVo::getUserId);
 | 
			
		||||
                        List<String> nickNames = StreamUtils.toList(sysUsers, SysUserVo::getNickName);
 | 
			
		||||
                        participantVo.setCandidate(userIds);
 | 
			
		||||
                    List<UserDTO> userList = USER_SERVICE.selectListByIds(userIds);
 | 
			
		||||
                    if (CollUtil.isNotEmpty(userList)) {
 | 
			
		||||
                        List<Long> userIdList = StreamUtils.toList(userList, UserDTO::getUserId);
 | 
			
		||||
                        List<String> nickNames = StreamUtils.toList(userList, UserDTO::getNickName);
 | 
			
		||||
                        participantVo.setCandidate(userIdList);
 | 
			
		||||
                        participantVo.setCandidateName(nickNames);
 | 
			
		||||
                        participantVo.setClaim(!StringUtils.isBlank(task.getAssignee()));
 | 
			
		||||
                    }
 | 
			
		||||
@@ -161,10 +162,10 @@ public class WorkflowUtils {
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                List<SysUserVo> sysUsers = WORKFLOW_USER_SERVICE.getUserListByIds(userIdList);
 | 
			
		||||
                if (CollUtil.isNotEmpty(sysUsers)) {
 | 
			
		||||
                    List<Long> userIds = StreamUtils.toList(sysUsers, SysUserVo::getUserId);
 | 
			
		||||
                    List<String> nickNames = StreamUtils.toList(sysUsers, SysUserVo::getNickName);
 | 
			
		||||
                List<UserDTO> userList = USER_SERVICE.selectListByIds(userIdList);
 | 
			
		||||
                if (CollUtil.isNotEmpty(userList)) {
 | 
			
		||||
                    List<Long> userIds = StreamUtils.toList(userList, UserDTO::getUserId);
 | 
			
		||||
                    List<String> nickNames = StreamUtils.toList(userList, UserDTO::getNickName);
 | 
			
		||||
                    participantVo.setCandidate(userIds);
 | 
			
		||||
                    participantVo.setCandidateName(nickNames);
 | 
			
		||||
                    // 判断当前任务是否具有多个办理人
 | 
			
		||||
@@ -306,9 +307,9 @@ public class WorkflowUtils {
 | 
			
		||||
        for (Task t : list) {
 | 
			
		||||
            ParticipantVo taskParticipant = WorkflowUtils.getCurrentTaskParticipant(t.getId());
 | 
			
		||||
            if (CollUtil.isNotEmpty(taskParticipant.getGroupIds())) {
 | 
			
		||||
                List<SysUserRole> sysUserRoles = WORKFLOW_USER_SERVICE.getUserRoleListByRoleIds(taskParticipant.getGroupIds());
 | 
			
		||||
                if (CollUtil.isNotEmpty(sysUserRoles)) {
 | 
			
		||||
                    userIds.addAll(StreamUtils.toList(sysUserRoles, SysUserRole::getUserId));
 | 
			
		||||
                List<Long> userIdList = USER_SERVICE.selectUserIdsByRoleIds(taskParticipant.getGroupIds());
 | 
			
		||||
                if (CollUtil.isNotEmpty(userIdList)) {
 | 
			
		||||
                    userIds.addAll(userIdList);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            List<Long> candidate = taskParticipant.getCandidate();
 | 
			
		||||
@@ -317,7 +318,7 @@ public class WorkflowUtils {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (CollUtil.isNotEmpty(userIds)) {
 | 
			
		||||
            List<SysUserVo> sysUserVoList = WORKFLOW_USER_SERVICE.getUserListByIds(new ArrayList<>(userIds));
 | 
			
		||||
            List<UserDTO> userList = USER_SERVICE.selectListByIds(new ArrayList<>(userIds));
 | 
			
		||||
            for (String code : messageType) {
 | 
			
		||||
                MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code);
 | 
			
		||||
                if (ObjectUtil.isNotEmpty(messageTypeEnum)) {
 | 
			
		||||
@@ -329,7 +330,7 @@ public class WorkflowUtils {
 | 
			
		||||
                            WebSocketUtils.publishMessage(dto);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case EMAIL_MESSAGE:
 | 
			
		||||
                            MailUtils.sendText(StreamUtils.join(sysUserVoList, SysUserVo::getEmail), "单据审批提醒", message);
 | 
			
		||||
                            MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case SMS_MESSAGE:
 | 
			
		||||
                            //todo 短信发送
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user