mitao
13 小时以前 6534aeb7d0f8bf1541140645d161ffade21b3fbc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package com.ruoyi.system.service.impl;
 
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.mapper.OaApprovalTodoMapper;
import com.ruoyi.system.model.OaApprovalFlowNode;
import com.ruoyi.system.model.OaApprovalTodo;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.OaApprovalTodoService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
 
/**
 * <p>
 * 审批待办表 服务实现类
 * </p>
 *
 * @author WuGuanFengYue
 * @since 2025-09-15
 */
@Service
@RequiredArgsConstructor
public class OaApprovalTodoServiceImpl extends ServiceImpl<OaApprovalTodoMapper, OaApprovalTodo> implements OaApprovalTodoService {
 
    private final ISysUserService sysUserService;
    private final ISysDeptService sysDeptService;
 
    /**
     * 创建审批待办(公共实现)
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void createApprovalTodos(Integer applicationId, String applicationCode, OaApprovalFlowNode flowNode, Integer deptId) {
        Integer approvalType = flowNode.getApprovalType();
        if (approvalType == null) {
            throw new ServiceException("审批类型不能为空");
        }
 
        switch (approvalType) {
            case 0: // 上级部门审批
                createUpperDeptTodo(applicationId, applicationCode, flowNode, deptId);
                break;
            case 1: // 指定部门审批
                createSpecifiedDeptTodo(applicationId, applicationCode, flowNode);
                break;
            case 2: // 指定人员审批
                createSpecifiedUserTodo(applicationId, applicationCode, flowNode);
                break;
            default:
                throw new ServiceException("不支持的审批类型: " + approvalType);
        }
    }
 
    /**
     * 创建上级部门审批待办
     */
    private void createUpperDeptTodo(Integer applicationId, String applicationCode, OaApprovalFlowNode flowNode, Integer deptId) {
        // 1. 获取申请部门信息
        if (deptId == null) {
            throw new ServiceException("未填写申请部门信息");
        }
 
        SysDept currentDept = sysDeptService.selectDeptById(Long.valueOf(deptId));
        if (currentDept == null) {
            throw new ServiceException("申请部门信息不存在");
        }
 
        // 2. 获取上级部门信息
        if (currentDept.getParentId() == null || currentDept.getParentId() == 0) {
            throw new ServiceException("当前部门没有上级部门");
        }
 
        SysDept parentDept = sysDeptService.selectDeptById(currentDept.getParentId());
        if (parentDept == null) {
            throw new ServiceException("上级部门信息不存在");
        }
 
        // 3. 查询所有关联了该上级部门的用户
        List<SysUser> users = sysUserService.selectListByDeptId(parentDept.getDeptId().toString());
        if (CollUtil.isEmpty(users)) {
            throw new ServiceException("上级部门下没有找到用户");
        }
 
        // 4. 为每个用户创建待办数据
        createTodoItem(applicationId, applicationCode, flowNode, users);
    }
 
    /**
     * 创建指定部门审批待办
     */
    private void createSpecifiedDeptTodo(Integer applicationId, String applicationCode, OaApprovalFlowNode flowNode) {
        if (StringUtils.isBlank(flowNode.getApprovalIds())) {
            throw new ServiceException("操作失败,审批流程配置异常");
        }
        // 收集部门ID
        List<String> deptIdList = Arrays.stream(flowNode.getApprovalIds().split(",")).collect(Collectors.toList());
 
        // 查询所有关联了这些部门的用户
        List<SysUser> users = sysUserService.selectListByDeptIds(deptIdList);
        if (CollUtil.isEmpty(users)) {
            throw new ServiceException("指定部门下没有找到用户");
        }
 
        // 为每个用户创建待办数据
        createTodoItem(applicationId, applicationCode, flowNode, users);
    }
 
    /**
     * 创建指定人员审批待办
     */
    private void createSpecifiedUserTodo(Integer applicationId, String applicationCode, OaApprovalFlowNode flowNode) {
        if (StringUtils.isBlank(flowNode.getApprovalIds())) {
            throw new ServiceException("操作失败,审批流程配置异常");
        }
        List<Integer> userIds = Arrays.stream(flowNode.getApprovalIds().split(","))
                .map(Integer::valueOf).collect(Collectors.toList());
        // 1. 查询用户信息
        List<SysUser> users = sysUserService.selectListByUserIds(userIds);
        if (CollUtil.isEmpty(users)) {
            throw new ServiceException("没有找到指定审批用户");
        }
        //2. 创建待办数据
        createTodoItem(applicationId, applicationCode, flowNode, users);
    }
 
    /**
     * 创建待办数据项
     */
    private void createTodoItem(Integer applicationId, String applicationCode, OaApprovalFlowNode flowNode, List<SysUser> userList) {
        List<OaApprovalTodo> approvalTodoList = userList.stream().map(item -> {
            OaApprovalTodo todo = new OaApprovalTodo();
            todo.setApplicationId(applicationId);
            todo.setApplicationCode(applicationCode);
            todo.setFlowNodeId(flowNode.getId());
            todo.setUserId(item.getUserId().intValue());
            todo.setUserName(item.getNickName());
 
            // 设置部门信息
            if (item.getDeptId() != null) {
                todo.setDeptId(Integer.valueOf(item.getDeptId()));
            }
 
            todo.setSortOrder(flowNode.getSortOrder());
            todo.setStatus(0); // 0-待处理
            todo.setCreateTime(LocalDateTime.now());
            return todo;
        }).collect(Collectors.toList());
        //批量保存
        this.saveBatch(approvalTodoList);
    }
}