yangys
2025-08-10 8318e40770d53c87e2d5921d2d11f8de47c61e76
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
package org.springblade.mdm.flow.excution;
 
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.flowable.engine.IdentityService;
import org.flowable.engine.runtime.ProcessInstance;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.service.FlowProgramFileService;
import org.springblade.mdm.flow.vo.TaskAssignVO;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.mdm.program.service.NodeDeptQueryService;
import org.springblade.mdm.utils.EntityUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.flowable.engine.RuntimeService;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
@AllArgsConstructor
@Service("startDispatcher")
public class StartDispatcher  {
 
    private final RuntimeService runtimeService;
    private final AutoAssignUsersService autoAssignUsersService;
 
    private final IdentityService identityService;
    private final NcNodeService ncNodeService;
 
    private final FlowProgramFileService flowProgramFileService;
    private final NodeDeptQueryService nodeDeptQueryService;
    //public static final String PROCESS_KEY = "dispatch";
 
    /**
     * 启动派工流程
     * @param startVO 表单数据
     * @return 流程实例id
     */
    @Transactional
    public String start(TaskAssignVO startVO){
 
        Map<String,Object> preAssignee = autoAssignUsersService.autoAssignUsers(startVO);
        Map<String, Object> vars = new HashMap<>(preAssignee);
        vars.put(FlowContants.ASSIGNEE,preAssignee.get(FlowContants.TEAM_LEADER));//第一个审批用户:组长
 
        vars.put(FlowContants.TITLE,startVO.getTitle());
        //机床编号
        vars.put(FlowContants.MACHINE_CODE,startVO.getMachineCode());
        String workshop = nodeDeptQueryService.getWorkshopNameByMachineCode(startVO.getMachineCode());
        vars.put("workshop",workshop);
        //机床型号
        vars.put(FlowContants.MACHINE_MODE,startVO.getMachineMode());
 
 
        vars.put(FlowContants.PROCESS_NO,startVO.getProcessNo());
        vars.put(FlowContants.PROCESS_NAME,startVO.getProcessName());
        vars.put(FlowContants.PROCESS_EDITION,startVO.getProcessEdition());
        vars.put(FlowContants.CRAFT_EDITION,startVO.getCraftEdition());
        vars.put("planStartTime",startVO.getPlanStartTime());
        vars.put(FlowContants.DRAWING_NO,startVO.getDrawingNo());
        vars.put(FlowContants.DRAWING_NO_EDITION,startVO.getDrawingNoEdition());
        vars.put("planLockDays",startVO.getPlanLockDays());
        vars.put(FlowContants.PRODUCT_MODEL,startVO.getProductModel());
 
        if(StringUtils.isNotBlank(startVO.getDeviation())) {
            vars.put(FlowContants.DEVIATION, startVO.getDeviation());//偏离单
        }
        String programPkgName = NcNodeService.genProgramName(startVO.getDrawingNo(),startVO.getProcessNo());
        vars.put(FlowContants.PROGRAM_PACKAGE_NAME,programPkgName);
        NcNode curedProgramPackage = ncNodeService.getLastEditionCuredProgramPackage(programPkgName);
        //设置是否有固化程序标记
        vars.put(FlowContants.HAS_CURED_PROGRAM,curedProgramPackage != null ? FlowContants.Y:FlowContants.N);
        //工序版次是否一致,是否在有效期内
        if(curedProgramPackage != null){
            vars.put(FlowContants.CURED_NODE_ID,curedProgramPackage.getId());
            vars.put(FlowContants.IS_PROCESS_EDITION_SAME, StringUtils.equals(curedProgramPackage.getProcessEdition(),startVO.getProcessEdition()) ? "Y":"N");
            vars.put(FlowContants.VALIDITY_PERIOD, curedProgramPackage.withinValidityPeriod() ? FlowContants.Y:FlowContants.N);
        }else{
            vars.put(FlowContants.IS_PROCESS_EDITION_SAME, FlowContants.Y);
            vars.put(FlowContants.VALIDITY_PERIOD, FlowContants.Y);
        }
 
        String businessKey = "0";//业务表key
        identityService.setAuthenticatedUserId(String.valueOf(AuthUtil.getUserId()));//设置流程发起人
        ProcessInstance inst = runtimeService.startProcessInstanceByKey(FlowContants.TRY_PROCESS_KEY,businessKey,vars);
 
        if(curedProgramPackage != null) {//存在已固化程序,复制原来的程序文件。创建节点仍然在编程人员提交以后
            copyFlowProgramFiles(curedProgramPackage.getProcessInstanceId(),inst.getProcessInstanceId());
        }
 
        return inst.getProcessInstanceId();
    }
 
    /**
     * 根据原有固化程序包名节点,复制一个,赋予新的流程实例id
     * @param programPkg 原有固化的程序包名节点
     * @param processInstanceId 流程实例id
     */
 
    void cloneNodes(NcNode programPkg,String processInstanceId){
        NcNode newProgramPkg = new NcNode();
        BeanUtils.copyProperties(programPkg,newProgramPkg);
        EntityUtil.clearBaseProperties(newProgramPkg);
 
        newProgramPkg.setProcessInstanceId(processInstanceId);
        this.ncNodeService.save(newProgramPkg);
    }
 
    /**
     * 复制流程程序文件
     * @param processInstanceId 新启动的流程id
     */
    private void copyFlowProgramFiles(String oldProcessInstanceId,String processInstanceId) {
        List<FlowProgramFile> fileList = flowProgramFileService.lambdaQuery()
            .eq(FlowProgramFile::getProcessInstanceId,oldProcessInstanceId).list();
 
        for (FlowProgramFile file : fileList) {
            FlowProgramFile newFile = new FlowProgramFile();
            BeanUtils.copyProperties(file, newFile);
            EntityUtil.clearBaseProperties(newFile);
 
            newFile.setProcessInstanceId(processInstanceId);
 
            this.flowProgramFileService.save(newFile);
        }
    }
 
    /**
     * 生成零组件编号
     * 图号、图号版次、工序号、工序名称、工艺版次、工序版次 组合起来获得零组件号
     * @param startVO
     * @return
     */
    /*
    String generatePartNo(TaskAssignVO startVO){
        //TODO 这个格式未确定,需要确认
        return String.format("%s-%s-%s-%s-%s-%s",
            startVO.getPartNo(),
            startVO.getPartNoEdition(),
            startVO.getProcessNo(),
            startVO.getProcessName(),
            startVO.getCraftEdition(),
            startVO.getProcessEdition());
    }*/
}