yangys
2025-08-07 a0881c9a8dbff2bf7f3e10255b998b9529c7aef3
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
package org.springblade.mdm.flow.service;
 
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.HistoryService;
import org.flowable.engine.IdentityService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.mdm.basesetting.machine.MachineService;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.excution.AutoAssignUsersService;
import org.springblade.mdm.flow.vo.TaskAssignVO;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.entity.ProcessProgRef;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.mdm.program.service.NcProgramService;
import org.springblade.mdm.program.service.ProcessProgRefService;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
 
/**
 * 固化流程服务
 */
@Slf4j
@Service
@AllArgsConstructor
public class CureFlowService {
 
    private final RuntimeService runtimeService;
 
    private final HistoryService historyService;
    private final TaskService taskService;
    private final IdentityService identityService;
 
    private final NcNodeService ncNodeService;
 
    private final FlowProgramFileService flowProgramFileService;
 
    @Transactional
    public void startCure(List<NcNode> programPackageList, Map<Long,List<NcNode>> allFlowProgramFiles) {
        //根据分组启动流程,并插入关联表
        programPackageList.forEach(pkg -> {
            this.startOne(pkg,allFlowProgramFiles.get(pkg.getId()));
        });
    }
 
    /**
     * 启动一个数控程序的固化流程
     * @param programPackage 程序包名 节点实体
     */
    public void startOne(NcNode programPackage,List<NcNode> programNodes) {
        Map<String, Object> vars = new HashMap<>();
        //该程序在计划任务时 获取编制,校对,审批的人员,作为默认用户,其中编制时第一个固定的用户
        if(programPackage.getProcessInstanceId() != null) {
            //获取审批用户
            HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery()
                .processInstanceId(programPackage.getProcessInstanceId()).includeProcessVariables()
                .singleResult();
            if(instance != null) {//使用任务派工流程的变量
                Map<String, Object> oldVars = instance.getProcessVariables();
                //机床编号
                vars.put(FlowContants.MACHINE_CODE,oldVars.get(FlowContants.MACHINE_CODE));
                //机床型号
                vars.put(FlowContants.MACHINE_MODE,oldVars.get(FlowContants.MACHINE_MODE));
                vars.put(FlowContants.PROCESS_NO,oldVars.get(FlowContants.PROCESS_NO));
                vars.put(FlowContants.PROCESS_NAME,oldVars.get(FlowContants.PROCESS_NAME));
                vars.put(FlowContants.PROCESS_EDITION,oldVars.get(FlowContants.PROCESS_EDITION));
                vars.put(FlowContants.CRAFT_EDITION, oldVars.get(FlowContants.CRAFT_EDITION));
                vars.put(FlowContants.DRAWING_NO,oldVars.get(FlowContants.DRAWING_NO));
                vars.put(FlowContants.DRAWING_NO_EDITION,oldVars.get(FlowContants.DRAWING_NO_EDITION));
 
                vars.put(FlowContants.PRODUCT_MODEL,oldVars.get(FlowContants.PRODUCT_MODEL));
            }
 
        }
 
        //查找历史实际的审批人
        List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery()
            .orderByTaskCreateTime().desc().processInstanceId(programPackage.getProcessInstanceId())
            .list();
        fillHistoryAssignees(vars, historicTasks);
 
        String businessKey = "0";//业务表key
 
        identityService.setAuthenticatedUserId(String.valueOf(AuthUtil.getUserId()));//设置流程发起人
 
        vars.put(FlowContants.LAST_STEP_USER_NICKNAME, AuthUtil.getNickName());
        vars.put(FlowContants.TITLE,programPackage.getName()+"-固化");//自动增加标题
 
        ProcessInstance inst = runtimeService.startProcessInstanceByKey(FlowContants.CURE_PROCESS_KEY,businessKey,vars);
 
        //更新程序包名节点的流程实例id
        programPackage.setProcessInstanceId(inst.getProcessInstanceId());
        ncNodeService.updateById(programPackage);
 
        //更新文件的流程实例id,和 程序节点的流程文件id 并入库
        programNodes.forEach(programNode -> {
            FlowProgramFile flowProgramFile = programNode.getFlowProgramFile();
            flowProgramFile.setProcessInstanceId(inst.getProcessInstanceId());
            this.flowProgramFileService.save(flowProgramFile);
 
            programNode.setFlowProgramFileId(flowProgramFile.getId());
            this.ncNodeService.save(programNode);
        });
        log.info("启动固化流程完成,实例id={}", inst.getId());
    }
 
    /**
     * 填充历史审批人,从试切流程中查找
     * @param vars 找到审批人后填充的map
     * @param historicTasks 历史任务集合
     */
    void fillHistoryAssignees(Map<String, Object> vars,List<HistoricTaskInstance> historicTasks){
        String programmer = null;
        String checker = null;
        String senior = null;
 
        //找不到工艺员,那么查询最后一个审批的工艺员
 
        for (HistoricTaskInstance task : historicTasks) {
            // 获取任务的办理人
            if (task.getTaskDefinitionKey().equals("programmingTask")) {
                //编制
                if (programmer == null) {
                    programmer = task.getAssignee();
                }
            } else if (task.getTaskDefinitionKey().equals("check")) {
                //校对
                if (checker == null) {
                    checker = task.getAssignee();
                }
 
            } else if (task.getTaskDefinitionKey().equals("approveTask")) {
                //审核
                if (senior == null) {
                    senior = task.getAssignee();
                }
            }
 
        }
 
        vars.put(FlowContants.PROGRAMMER,programmer);
        vars.put(FlowContants.CHECKER,checker);
        vars.put(FlowContants.SENIOR,senior);
        vars.put(FlowContants.ASSIGNEE,programmer);
    }
    /**
     * 将程序按照机器代码分组
     * @param ncProgramIdList
     * @return
     */
    /*
    Map<String,List<NcProgram>> groupProgramsByMachineCode(List<Long> ncProgramIdList){
        List<NcProgram> programs = ncProgramService.listByIds(ncProgramIdList);
        return programs.stream().collect(Collectors.groupingBy(NcProgram::getMachineCode));
    }*/
}