yangys
2025-09-10 dc01577b31204fd3c80645b45d81ff693f79a985
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
package org.springblade.mdm.flow.excution.dispatch;
 
import com.alibaba.excel.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.service.ApproveRecordService;
import org.springblade.mdm.flow.service.FlowProgramFileService;
import org.springblade.mdm.flow.service.FlowProgramProperties;
import org.springblade.mdm.gkw.programnode.vo.ProgramNameVO;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.NcProgramApproved;
import org.springblade.mdm.program.service.NcNodeAutoCreateService;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.mdm.program.service.NcProgramApprovedService;
import org.springblade.mdm.utils.EntityUtil;
import org.springblade.mdm.utils.ProgramFileNameParser;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.util.List;
 
/**
 * 普通派工完成数据处理器,功能:插入审批表数据,DispatchFinishListener调用
 */
@Slf4j
@Component("normalDispatchFinishDataHandler")
public class NormalFinishDataHandler implements FinishDataHandler{
    @Autowired
    private NcProgramApprovedService approvedService;
    @Autowired
    private FlowProgramFileService flowProgramFileService;
    @Autowired
    private NcNodeService ncNodeService;
    @Autowired
    private NcNodeAutoCreateService ncNodeAutoCreateService;
    /**
     * DispatchFinishListener中调用
     * @param props 执行对象
     */
    public void handleData(FlowProgramProperties props) {
        // 执行业务逻辑
        NcNode packageNode;
        if(FlowContants.Y.equals(props.getHasCuredProgram())){
            //有固化
            packageNode = ncNodeService.getById(props.getCuredNodeId());
 
            if(FlowContants.N.equals(props.getCureProgramUseable())) {
                //程序不可用
                //原来的固化节点锁定
                packageNode.lock();
                ncNodeService.updateById(packageNode);
 
                Integer newVersion = packageNode.genNewVersionNumber();
                packageNode = ncNodeAutoCreateService.createNodeTreeWithProgram(props,newVersion);
            }else{
                //可用,升版(修改其工序版次),原来的节点清除
                moveToNewProcessEdition(packageNode,props);
            }
        }else{
            //普通试切
            packageNode = ncNodeAutoCreateService.createNodeTreeWithProgram(props,1);
        }
 
        addApproveTable(packageNode,props);
        //updateApproveRecordNodeId(instId, packageNode.getId());
        log.info("普通流程已完成in DispatchFinishListener");
    }
 
    /**
     * 节点移动到新的工序版本下
     * @param packageNode 程序包名节点
     * @param props 流程属性
     */
    private void moveToNewProcessEdition(NcNode packageNode, FlowProgramProperties props) {
        ncNodeService.deleteMachineNodeByParentId(packageNode.getParentId());
 
        FlowProgramProperties tempProps = new FlowProgramProperties();
        BeanUtils.copyProperties(props,tempProps);
        tempProps.setProcessDefinitionKey(FlowContants.CURE_PROCESS_KEY);//临时修改其为固化,在固化下创建节点
        NcNode machineNode = ncNodeAutoCreateService.createNodeTreeToMachine(tempProps);
 
        //移动历史节点到新的版次节点下
        List<NcNode> packageHisNodes = ncNodeService.getNodeHistory(packageNode);//该包的历史节点列表
        for(NcNode hisPackageNode : packageHisNodes){
            hisPackageNode.setParentId(machineNode.getParentId());
            hisPackageNode.setParentIds(machineNode.getParentIds());
 
            List<NcNode> oriProgramNodes = ncNodeService.lambdaQuery().eq(NcNode::getParentId,hisPackageNode.getId()).list();
 
            for(NcNode oldProgramNode : oriProgramNodes){
                oldProgramNode.setParentIds(hisPackageNode.getParentIds()+","+hisPackageNode.getId());
            }
            ncNodeService.updateBatchById(oriProgramNodes);
        }
        ncNodeService.updateBatchById(packageHisNodes);
 
        //移动程序包名节点
        packageNode.setProcessEdition(tempProps.getProcessEdition());
        packageNode.setParentId(machineNode.getParentId());
        packageNode.setParentIds(machineNode.getParentIds());
        packageNode.setName(tempProps.getDrawingNo()+"-"+tempProps.getProcessNo()+"-"+tempProps.getProcessEdition());
        this.ncNodeService.updateById(packageNode);
 
        //移动程序节点
        List<NcNode> programNodes = ncNodeService.getProgramFilesByPackageId(packageNode.getId());
        for(NcNode programNode : programNodes){
 
            programNode.setName(buildNewFilename(programNode.getName(),tempProps.getProcessEdition()));//名称修改,工序版次部分
            programNode.setParentIds(packageNode.getParentIds()+","+packageNode.getId());
            programNode.setProcessEdition(tempProps.getProcessEdition());//修改工序版次
            programNode.setVersionNumber(packageNode.getVersionNumber());
        }
        ncNodeService.updateBatchById(programNodes);
 
    }
 
    String buildNewFilename(String filename,String newProcessEdition){
        ProgramNameVO pnameVO = ProgramFileNameParser.parseProgramName(filename);
        String ext = FilenameUtils.getExtension(filename);
        String name= pnameVO.getDrawingNo()+"-"+pnameVO.getProcessNo()+"-"+newProcessEdition+"-"+pnameVO.getSegmentCount()+"-"+pnameVO.getSegmentNo();
        if(StringUtils.isNotBlank(ext)){
            name += "."+ext;
        }
        return name;
    }
 
    /**
     * 保存审批完成的记录
     * @param packageNode
     * @param props
     */
    void addApproveTable(NcNode packageNode,FlowProgramProperties props){
        NcProgramApproved approved = new NcProgramApproved();
 
        approved.setProgramName(packageNode.getName());
        approved.setNcNodeId(packageNode.getId());//程序包节点id
        approved.setTitle(props.getTitle());
        approved.setProgrammerId(props.getActProgrammerId());
        approved.setProcessInstanceId(props.getProcessInstanceId());
        approvedService.save(approved);
 
    }
 
}