yangys
2025-08-16 f77951077aa87daae6460c0161868bd5661efb2f
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
package org.springblade.mdm.flow.service;
 
import lombok.AllArgsConstructor;
import org.flowable.engine.HistoryService;
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.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
 
import java.util.List;
import java.util.Map;
 
@AllArgsConstructor
@Service
public class FlowCommonService {
    private final RuntimeService runtimeService;
    private final HistoryService historyService;
 
    /**
     * 根据流程实例id获取definitionKey
     * @param processInstanceId
     * @return
     */
    public String getDefinitionKey(String processInstanceId){
 
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
            .processInstanceId(processInstanceId)
            .singleResult();
        return processInstance.getProcessDefinitionKey();
    }
 
    /**
     * 从流程变量获取发起流程的树形
     * @param processInstanceId
     * @return
     */
    public FlowProgramProperties getProgramProperties(String processInstanceId){
        FlowProgramProperties programProperties = new FlowProgramProperties();
        programProperties.setProcessInstanceId(processInstanceId);
 
        Map<String, Object> vars = runtimeService.getVariables(processInstanceId);
 
        programProperties.setTitle(String.valueOf(vars.get(FlowContants.TITLE)));
        programProperties.setDrawingNo(String.valueOf(vars.get(FlowContants.DRAWING_NO)));
        programProperties.setDrawingNoEdition(String.valueOf(vars.get(FlowContants.DRAWING_NO_EDITION)));
        programProperties.setProductModel(String.valueOf(vars.get(FlowContants.PRODUCT_MODEL)));
 
        programProperties.setProcessNo(String.valueOf(vars.get(FlowContants.PROCESS_NO)));
        programProperties.setProcessEdition(String.valueOf(vars.get(FlowContants.PROCESS_EDITION)));//工序版次
        programProperties.setProcessName(String.valueOf(vars.get(FlowContants.PROCESS_NAME)));
        programProperties.setMachineCode(String.valueOf(vars.get(FlowContants.MACHINE_CODE)));
 
        programProperties.setMachineMode(String.valueOf(vars.get(FlowContants.MACHINE_MODE)));
        //数据处理名称为版次以前,零件号加工序号:YZL4-1100-01-50 零组件号:YZL4-1100-01 工序号 50
 
        programProperties.setCraftEdition(String.valueOf(vars.get(FlowContants.CRAFT_EDITION)));
        programProperties.setHasCuredProgram(String.valueOf(vars.get(FlowContants.HAS_CURED_PROGRAM)));
        programProperties.setIsProcessEditionSame(String.valueOf(vars.get(FlowContants.IS_PROCESS_EDITION_SAME)));
        if(vars.containsKey(FlowContants.DEVIATION)) {
            programProperties.setDeviation(String.valueOf(vars.get(FlowContants.DEVIATION)));
        }
        if(vars.containsKey(FlowContants.CURED_NODE_ID)){
            programProperties.setCuredNodeId(Func.toLong(vars.get(FlowContants.CURED_NODE_ID)));
        }
        programProperties.setCureProgramUseable(String.valueOf(vars.get(FlowContants.CURE_PROGRAM_USEABLE)));
 
 
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
            .processInstanceId(processInstanceId)
            .singleResult();
        String processDefinitionKey = processInstance.getProcessDefinitionKey();
        programProperties.setProcessDefinitionKey(processDefinitionKey);
        return programProperties;
    }
 
    /**
     * 流程是否在进行
     * @param processInstanceId 实例id
     */
    public boolean isProcessInstanceActive(String processInstanceId) {
        if(processInstanceId == null){
            return false;
        }
        // 先查运行时表
        ProcessInstance instance = runtimeService.createProcessInstanceQuery()
            .processInstanceId(processInstanceId)
            .singleResult();
 
        if (instance != null) {
            return true;
        }
 
        // 再查历史表确认是否曾经存在
        HistoricProcessInstance historicInstance = historyService.createHistoricProcessInstanceQuery()
            .processInstanceId(processInstanceId)
            .singleResult();
 
        return historicInstance != null && historicInstance.getEndTime() == null;
    }
 
    /**
     * 上一步处理人
     * @param processInstanceId 流程实例id
     * @return assignee
     */
    public String previusAssignee(String processInstanceId) {
        // 获取历史任务实例
        List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery()
            .processInstanceId(processInstanceId)
            .orderByHistoricTaskInstanceEndTime().asc()
            .list();
 
        // 获取上一个已完成的任务
        String assignee = "";
        if(!historicTasks.isEmpty()) {
            assignee = historicTasks.get(historicTasks.size() - 1).getAssignee();
        }
        return assignee;
    }
}