yangys
2025-09-17 1e2b04fabbbc4b1ae37d7951068d7ab235f5b5f9
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
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.apache.commons.io.IOUtils;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.basesetting.machine.service.MachineService;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.excution.ListenerHelper;
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.service.NcNodeAutoCreateService;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.mdm.program.service.NcProgramApprovedService;
import org.springblade.mdm.program.service.ProgramAnnotationService;
import org.springblade.mdm.program.service.programannotation.*;
import org.springblade.mdm.utils.ProgramFileNameParser;
import org.springblade.system.pojo.entity.DictBiz;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.List;
 
/**
 * 普通派工完成数据处理器,功能:插入审批表数据,DispatchFinishListener调用
 */
@Slf4j
@Component("normalDispatchFinishDataHandler")
public class NormalFinishDataHandler implements FinishDataHandler{
    @Autowired
    private FlowProgramFileService flowProgramFileService;
    @Autowired
    private MachineAnnotationConfig annotationConfig;
    @Autowired
    private MachineService machineService;
    @Autowired
    private NcNodeService ncNodeService;
    @Autowired
    private NcNodeAutoCreateService ncNodeAutoCreateService;
    @Autowired
    private ProgramAnnotationService programAnnotationService;
    @Autowired
    private ListenerHelper listenerHelper;
    @Autowired
    private OssTemplate ossTemplate;
 
    /**
     * DispatchFinishListener中调用
     * @param props 流程属性
     */
    public void handleData(FlowProgramProperties props) throws IOException {
        // 执行业务逻辑
        LocalDateTime now = LocalDateTime.now();
        NcNode packageNode;
        if(FlowContants.Y.equals(props.getHasCuredProgram())){
            //有固化
            packageNode = ncNodeService.getById(props.getCuredNodeId());
 
            if(FlowContants.N.equals(props.getCureProgramUseable())) {
                //程序不可用,原来的固化节点锁定
                packageNode.lock();
                ncNodeService.updateById(packageNode);
 
                //版本号根据零组件号+工序号,工序版次,机床组 直接查询数量,+1获取
                Integer newVersion = ncNodeService.calculateVersionNumber(packageNode);
                //Integer newVersion = packageNode.genNewVersionNumber();
 
                packageNode = ncNodeAutoCreateService.createNodeTreeWithProgram(props,newVersion);
            }else{
                //String oriProcessEdition = packageNode.getProcessEdition();
                //可用,空升版(修改其工序版次),原来的节点清除
                moveToNewProcessEdition(packageNode,props);
 
                //更新已固化的,同名、不同机床组的程序为锁定状态
                ncNodeService.lockSameNameOtherMachineGroupProgramPackage(packageNode);
            }
        }else{
            //普通试切
            packageNode = ncNodeAutoCreateService.createNodeTreeWithProgram(props,1);
            long hisSerial = ncNodeService.calculateHistorySerial(packageNode);
            packageNode.setHisSerial(hisSerial);
            ncNodeService.updateById(packageNode);
        }
 
        listenerHelper.addApproveTable(packageNode,props);
 
        log.info("普通流程已完成in DispatchFinishListener");
    }
 
    /**
     * 节点移动到新的工序版本下
     * @param packageNode 程序包名节点
     * @param props 流程属性
     */
    private void moveToNewProcessEdition(NcNode packageNode, FlowProgramProperties props) throws IOException {
        //ncNodeService.deleteMachineGroupNodeByParentId();
        ncNodeService.getBaseMapper().deleteById(packageNode.getParentId());//删除机床组节点
 
        FlowProgramProperties tempProps = new FlowProgramProperties();
        BeanUtils.copyProperties(props,tempProps);
        tempProps.setProcessDefinitionKey(FlowContants.CURE_PROCESS_KEY);//临时修改其为固化,在固化下创建节点
        NcNode machineGroupNode = ncNodeAutoCreateService.createNodeTreeToMachineGroup(tempProps);
 
        //移动历史节点到新的版次节点下
        /*
        List<NcNode> packageHisNodes = ncNodeService.getTryNodeHistory(packageNode);//该包的历史节点列表
        for(NcNode hisPackageNode : packageHisNodes){
            hisPackageNode.setParentId(machineGroupNode.getId());
            hisPackageNode.setParentIds(machineGroupNode.getParentIds()+","+machineGroupNode.getId());
 
            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(machineGroupNode.getId());
        packageNode.setParentIds(machineGroupNode.subNodeParentIds());
        packageNode.setName(tempProps.getDrawingNo()+"-"+tempProps.getProcessNo()+"-"+tempProps.getProcessEdition());
 
        this.ncNodeService.updateById(packageNode);
        Machine machine = machineService.getByCode(packageNode.getMachineCode());
        //移动程序节点
        //List<DictBiz> annoDicts = programAnnotationService.getAnnotionDictList();
        List<NcNode> programNodes = ncNodeService.getProgramFilesByPackageId(packageNode.getId());
        for(NcNode programNode : programNodes){
            FlowProgramFile progFile = this.flowProgramFileService.getById(programNode.getFlowProgramFileId());
 
            programNode.setParentIds(packageNode.subNodeParentIds());
            programNode.setProcessEdition(tempProps.getProcessEdition());//修改工序版次
            programNode.setVersionNumber(packageNode.getVersionNumber());
            if(progFile.isProgram()) {
                programNode.setName(buildNewFilename(programNode.getName(), tempProps.getProcessEdition()));//名称修改,工序版次部分
                setNewProgramNameAnnotation(programNode.getName(), progFile, machine.getControlSystem());
            }
        }
        ncNodeService.updateBatchById(programNodes);
 
    }
 
    /**
     * 构建新的程序市名
     * @param filename 程序包名
     * @param newProcessEdition 新的工序版次
     * @return 新的程序文件名
     */
    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 flowProgramFile oss 文件
     *
     */
    void setNewProgramNameAnnotation(String filename,FlowProgramFile flowProgramFile, String controlSystem) throws IOException {
 
        try(InputStream ins = ossTemplate.statFileStream(flowProgramFile.getOssName());){
            ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(IOUtils.toByteArray(ins));
 
            //List<DictBiz> annoDictList = programAnnotationService.getAnnotionDictList();
 
            AnnotationProcessor annoProcessor = ProcessorHelper.getProcessor(controlSystem,this.annotationConfig);
            /*
            AnnotationProperties annoProps = annotationConfig.getConfigMap().get(controlSystem);
            if(annoProps == null){
                annoProps = AnnotationProperties.getDefault();
            }*/
            InputStream finishedStream = annoProcessor.setFilenameAnnotation(filename,byteInputStream);
            //InputStream finishedStream = AnnotationUtil.setAnnotationAndGetInputStream(byteInputStream, "GH", annoProps.getStatusLineIndex(), controlSystem, annoDictList);
            try(finishedStream) {
                finishedStream.reset();
                BladeFile bfile = ossTemplate.putFile(flowProgramFile.getName(), finishedStream);
                //替换原有的文件地址
                flowProgramFile.setOssName(bfile.getName());
                flowProgramFile.setName(filename);
                flowProgramFileService.updateById(flowProgramFile);
            }
        }
    }
 
}