lyh
7 天以前 2f757260f057da34ae362006a19f3a330b8facd6
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
package org.jeecg.modules.eam.service.impl;
 
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.flowable.engine.TaskService;
import org.flowable.task.api.Task;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.eam.constant.AssetStatusEnum;
import org.jeecg.modules.eam.constant.BusinessCodeConst;
import org.jeecg.modules.eam.constant.EquipmentLeanOutStatusEnum;
import org.jeecg.modules.eam.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamEquipmentLeanOut;
import org.jeecg.modules.eam.entity.EamSparePartRequisition;
import org.jeecg.modules.eam.entity.EamSparePartRequisitionDetail;
import org.jeecg.modules.eam.mapper.EamSparePartRequisitionMapper;
import org.jeecg.modules.eam.request.EamSparePartRequisitionRequest;
import org.jeecg.modules.eam.service.IEamSparePartRequisitionService;
import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
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.ISysUserService;
import org.jeecg.modules.system.vo.UserSelector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
 
import javax.annotation.Resource;
import java.util.*;
 
/**
 * @Description: 备件请购单
 * @Author: Lius
 * @Date: 2025-03-19
 * @Version: V1.0
 */
@Service("IEamSparePartRequisitionService")
public class EamSparePartRequisitionServiceImpl extends ServiceImpl<EamSparePartRequisitionMapper, EamSparePartRequisition> implements IEamSparePartRequisitionService, FlowCallBackServiceI {
 
    @Autowired
    private ISysUserService sysUserService;
 
    @Autowired
    private IFlowDefinitionService flowDefinitionService;
 
    @Autowired
    private FlowCommonService flowCommonService;
 
    @Resource
    private EamSparePartRequisitionMapper sparePartRequisitionMapper;
 
    @Autowired
    private IFlowMyBusinessService flowMyBusinessService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private IFlowTaskService flowTaskService;
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean submitSpareRequisition(EamSparePartRequisition eamSparePartRequisition) {
        EamSparePartRequisition entity = super.getById(eamSparePartRequisition.getId());
        if (entity == null) {
            throw new JeecgBootException("要提交的数据不存在,请刷新重试!");
        }
        //执行完成
        List<UserSelector> userSelectors = sysUserService.selectOperatorList(BusinessCodeConst.PCR0007);
        if (CollectionUtil.isEmpty(userSelectors)) {
            throw new JeecgBootException("备件管理员未设置人员,无法进入下级审批!");
        }
        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (sysUser == null) {
            throw new JeecgBootException("当前用户无法提交备件请购单!");
        }
        UpdateWrapper<EamSparePartRequisition> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("requisition_status", BusinessCodeConst.SPARE_REQUISITION_STATUS_2);
        updateWrapper.eq("id", eamSparePartRequisition.getId());
//        boolean success = super.update(updateWrapper);
        //启动审批流程
        flowCommonService.initActBusiness("备件请购单号:" + entity.getRequisitionCode() + ";申请人: " + entity.getReportUser() + ";发起备件请购申请",
                                                entity.getId(),
                                 "IEamSparePartRequisitionService",
                              "spare_part_apply",
                                null);
        Map<String, Object> variables = new HashMap<>();
        variables.put("dataId", entity.getId());
        variables.put("organization", "备件请购流程启动");
        variables.put("comment", "备件请购流程启动");
        variables.put("proofreading", true);
        List<String> usernames = new ArrayList<>();
        for (UserSelector userSelector : userSelectors) {
            usernames.add(userSelector.getUsername());
        }
        variables.put("NextAssignee", usernames);
        Result result = flowDefinitionService.startProcessInstanceByKey("spare_part_apply", variables);
        if (result != null) {
            super.update(updateWrapper);
            return result.isSuccess();
        }
        return false;
    }
 
    @Override
    public List<Map<String, Object>> getSparePartRequisitionDetailList(String sparePartRequisitionId) {
        QueryWrapper<EamSparePartRequisitionDetail> queryWrapper = Wrappers.query();
        if (sparePartRequisitionId != null && sparePartRequisitionId != "") {
            queryWrapper.eq("t1.spare_requisition_id", sparePartRequisitionId);
        }
        return this.baseMapper.getSparePartRequisitionDetailList(queryWrapper);
 
 
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public EamSparePartRequisition approval(EamSparePartRequisitionRequest request) {
        EamSparePartRequisition entity = sparePartRequisitionMapper.selectById(request.getId());
        if (entity == null) {
            throw new JeecgBootException("审批的数据已删除,请刷新重试!");
        }
        // 获取当前登录用户
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (user == null || StrUtil.isBlank(user.getId())) {
            throw new JeecgBootException("未获取到登录用户,请重新登录后再试!");
        }
        request.setApprovalUser(user.getUsername());
        // 获取流程业务记录
        FlowMyBusiness flowMyBusiness = flowMyBusinessService.getFlowMyBusiness(request.getInstanceId());
        if (flowMyBusiness == null) {
            throw new JeecgBootException("流程实例不存在,请刷新后重试!");
        }
 
        boolean userAuthorized = isUserAuthorized(flowMyBusiness, user);
        if (!userAuthorized) {
            throw new JeecgBootException("用户无权操作此任务,请刷新后重试!");
        }
        // 认领任务
        if (!claimTask(flowMyBusiness.getTaskId(), user)) {
            throw new JeecgBootException("任务不存在、已完成或已被他人认领!");
        }
        //流程变量
        Map<String, Object> values = new HashMap<>();
        switch (BusinessCodeConst.SPARE_REQUISITION_STATUS_2) {
            // 审批
            case BusinessCodeConst.SPARE_REQUISITION_STATUS_2:
                //执行完成
                values.put("dataId", entity.getId());
                values.put("organization", "备件请购审批");
                values.put("comment", request.getComment());
                values.put("status", request.getStatus());
                request.setComment(request.getComment());
                entity.setApprovalUser(user.getUsername());// 审核人
                entity.setApprovalTime(new Date());// 审核时间
                entity.setRemark(request.getApprovalOpinion());// 审核意见
                // 验证通过还是驳回
                if (request.getStatus().equals("1")) {
                    //设置entity
                    entity.setRequisitionStatus(BusinessCodeConst.SPARE_REQUISITION_STATUS_3);
                    List<String> userApprovalList = new ArrayList<>(Collections.singletonList(entity.getReportUser()));
                    values.put("NextAssignee", userApprovalList);
                } else {
                    //设置entity
                    entity.setRequisitionStatus(BusinessCodeConst.SPARE_REQUISITION_STATUS_4);
                }
                break;
        }
        request.setValues(values);
 
        // 完成流程任务
        Result result = flowTaskService.complete(request);
        if (!result.isSuccess()) {
            throw new JeecgBootException("审批失败,请刷新查看!");
        }
        //保存工单
        sparePartRequisitionMapper.updateById(entity);
        return entity;
    }
 
    /**
     * 判断用户是否拥有此权限
     *
     * @param flowMyBusiness
     * @param user
     * @return
     */
    private boolean isUserAuthorized(FlowMyBusiness flowMyBusiness, LoginUser user) {
        List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
        return todoUsers != null && todoUsers.contains(user.getUsername());
    }
 
    private boolean claimTask(String taskId, LoginUser user) {
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        if (task == null) {
            return false;
        }
        if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
            return false;
        }
        taskService.claim(taskId, user.getUsername());
        return true;
    }
 
    @Override
    public void afterFlowHandle(FlowMyBusiness business) {
        business.getTaskNameId();//接下来审批的节点
        business.getValues();//前端传进来的参数
        business.getActStatus();
    }
 
    @Override
    public Object getBusinessDataById(String dataId) {
        return this.getById(dataId);
    }
 
    @Override
    public Map<String, Object> flowValuesOfTask(String taskNameId, Map<String, Object> values) {
        return null;
    }
 
    @Override
    public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
        //业务是否干预流程,业务干预,流程干预,指定人员进行处理
        //获取下一步处理人
        Object object = values.get("NextAssignee");
        return (List<String>) object;
    }
}