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);
|
}
|
}
|
}
|
|
}
|