package org.springblade.mdm.program.service; import com.alibaba.csp.sentinel.util.StringUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.springblade.core.mp.base.BizEntity; import org.springblade.core.mp.base.BizServiceImpl; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.oss.OssTemplate; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springblade.mdm.basesetting.machine.MachineService; import org.springblade.mdm.basesetting.machine.entity.Machine; import org.springblade.mdm.flow.entity.ApproveRecord; 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.program.entity.NcNode; import org.springblade.mdm.program.entity.NcProgramApproved; import org.springblade.mdm.program.entity.NcProgramExchange; import org.springblade.mdm.program.mapper.NcProgramExchangeMapper; import org.springblade.mdm.program.vo.DncSendBackData; import org.springblade.mdm.utils.FileContentUtil; import org.springblade.system.feign.IDictClient; import org.springblade.system.pojo.entity.Dict; import org.springframework.stereotype.Service; import java.io.*; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * 下发/回传程序统计 * * @author yangys */ @Slf4j @Service @AllArgsConstructor public class NcProgramExportDNCService extends BizServiceImpl { //private final NcProgramService progService; private final IDictClient dictClient; private final MachineService machineService; private final NcProgramApprovedService approvedService; private final ApproveRecordService approveRecordService; private final NcNodeService ncNodeService; private final OssTemplate ossTemplate; private final FlowProgramFileService flowProgramFileService; private final ProgramAnnotationService programAnnotationService; //public static final String PROGRAM_JSON_FILE = "exp_mdm_nc_program.json"; //public static final String NODE_JSON_FILE = "exp_mdm_nc_node.json"; //public static final String APPROVE_RECORD_JSON_FILE = "exp_mdm_approve_record.json"; public static final String ANNOTATION_DICT = "machine_annotation"; /** * 分页查询 * @param query 查询参数 * @return */ public IPage dncSendBackPageQuery(Query query) { return this.getBaseMapper().dncSendBackpageQuery(Condition.getPage(query),query); } /** * 导出dnc压缩包 * @param approvedIdArray 待导出审批表id数组 */ public void exportDnc(Long[] approvedIdArray, OutputStream os) throws IOException { //FileOutputStream fos = new FileOutputStream("d:/exportDnc.zip"); try (ZipOutputStream zipOut = new ZipOutputStream(os);) {//os //ArrayList programPackageNodeIdList = new ArrayList(); for (Long approvedId : approvedIdArray) { NcProgramApproved approved = approvedService.getById(approvedId); //programPackageNodeIdList.add(approved.getNcNodeId()); addProgramPackageToZip(zipOut,approved); } //状态修改为已导出 approvedService.lambdaUpdate().in(NcProgramApproved::getId, approvedIdArray) .set(NcProgramApproved::getStatus,NcProgramApproved.STATUS_EXPORTED).update(); //addDataJson(zipOut, programPackageNodeIdList); } os.close(); } /** * 将程序包和下属文件加入压缩包 * @param zipOut * @param approved */ private void addProgramPackageToZip(ZipOutputStream zipOut, NcProgramApproved approved) throws IOException{ String packageFolder = approved.getProgramName()+"/"; ZipEntry zipEntry = new ZipEntry(packageFolder);// "/"结尾表示文件夹 zipOut.putNextEntry(zipEntry); zipOut.closeEntry(); List programNodes = ncNodeService.lambdaQuery().eq(NcNode::getIsLastEdition,1).eq(NcNode::getParentId, approved.getNcNodeId()).list(); FlowProgramFile programFile; NcNode programPackageNode = this.ncNodeService.getById(approved.getNcNodeId()); String status = "SQ"; if(programPackageNode.isDeviationProgram()){ status = "PL"; }else if(programPackageNode.hasCured()){ status = "GH"; } List annotationList = programAnnotationService.getAnnotionList(); for (NcNode node : programNodes) { String filePathInZip = packageFolder + node.getName(); programFile = this.flowProgramFileService.getById(node.getFlowProgramFileId()); InputStream inputStream = ossTemplate.statFileStream(programFile.getOssName()); Machine machine = machineService.getByCode(node.getMachineCode()); InputStream addedIns1 = addSendDirAnnotation(inputStream,machine,annotationList); InputStream addedIns2 = addProgramStatusAnnotation(addedIns1,status,machine,annotationList); this.addInputStreamToZip(zipOut,addedIns2,filePathInZip); } } /** * 获取字典中配置的注释 * @return 字典项列表 */ List getAnnotionList(){ List annotationList; R> dictsResult = dictClient.getList(ANNOTATION_DICT); if(dictsResult.isSuccess()) { annotationList = dictsResult.getData(); }else{ annotationList = Collections.emptyList(); } return annotationList; } /** * 加入机床下发路径和程序状态的注释 * @param inputStream * @return */ InputStream addSendDirAnnotation(InputStream inputStream,Machine machine,List annotationList) throws IOException { //检测第二行是否是路径 String annotationText = programAnnotationService.generateAnnotation(machine.getProgSendDir()==null? StringUtil.EMPTY:machine.getProgSendDir(),machine.getMachineGroupCode(),annotationList); //TODO 改判断行内容 return FileContentUtil.insertLine(inputStream,1,annotationText); } /** * 添加程序专改的注释 * @param inputStream * @param status 程序状态 * @param machine * @param annotationList 配置的注释字典列表 * @return * @throws IOException */ InputStream addProgramStatusAnnotation(InputStream inputStream,String status,Machine machine,List annotationList) throws IOException { String annoText= programAnnotationService.generateAnnotation(status,machine.getMachineGroupCode(),annotationList); return FileContentUtil.insertLine(inputStream,2,annoText); } /** * 判断一行文本是否是注释 * @param line * @param annotationList * @return */ boolean isAnnotation(String line,List annotationList){ boolean isAnno = false; return isAnno; } String generateAnnotation(String oriTest,String machineGroupCode,List annotationList) { R> dictsResult = dictClient.getList(ANNOTATION_DICT); String annotation = oriTest; String begin = "("; String end = ")"; Optional dictOpt = dictsResult.getData().stream().filter(dict -> {return dict.getDictKey().equals(machineGroupCode);}).findFirst(); String annotationSetting = "(,)"; if(dictOpt.isPresent()) { annotationSetting = dictOpt.get().getDictValue(); } String[] arr = annotationSetting.split(","); if(arr.length == 2){ begin = arr[0]; end = arr[1]; } annotation = begin + oriTest + end; return annotation; } /** * 导入数据文件 * @param zipOut */ /* void addDataJson(ZipOutputStream zipOut, List programPackageNodeIdList) throws IOException { addNodeDataJson(zipOut, programPackageNodeIdList); addApproveRecordDataJson(zipOut, programPackageNodeIdList); } */ /** * zip保重加入节点的数据 * @param zipOut * @param pkgNodeIdList * @throws IOException */ /* void addNodeDataJson(ZipOutputStream zipOut,List pkgNodeIdList) throws IOException { List pkgNodes = this.ncNodeService.lambdaQuery().in(NcNode::getId, pkgNodeIdList).list(); List allNodeIds = new ArrayList<>(); for(NcNode node : pkgNodes){ allNodeIds.addAll(Func.toLongList(node.getParentIds())); allNodeIds.add(node.getId()); } //加入程序包下级的程序节点 List programNodes = ncNodeService.lambdaQuery().in(NcNode::getParentId, pkgNodes.stream().map(NcNode::getId).toList()).list(); allNodeIds.addAll(programNodes.stream().map(NcNode::getId).toList()); List distinctIds = allNodeIds.stream().distinct().toList(); List allNodes = this.ncNodeService.lambdaQuery().in(NcNode::getId, distinctIds).list(); JSONArray jsonArray = new JSONArray(); for(NcNode node : allNodes){ JSONObject recObj = getNodeJsonObject(node); addSuperProperties(recObj,node); jsonArray.add(recObj); } addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),NODE_JSON_FILE); } */ /* @NotNull private static JSONObject getNodeJsonObject(NcNode node) { JSONObject recObj = new JSONObject(); recObj.put("id", node.getId()); recObj.put("name", node.getName()); recObj.put("drawingNo", node.getDrawingNo()); recObj.put("drawingNoEdition", node.getDrawingNoEdition()); recObj.put("productModel", node.getProductModel()); recObj.put("processName", node.getProcessName()); recObj.put("processEdition", node.getProcessEdition()); recObj.put("craftEdition", node.getCraftEdition()); recObj.put("parentIds", node.getParentIds()); recObj.put("processNo", node.getProcessNo()); recObj.put("isCured", node.getIsCured()); recObj.put("isLocked", node.getIsLocked()); recObj.put("nodeType", node.getNodeType()); recObj.put("machineCode", node.getMachineCode()); recObj.put("flowProgramFileId", node.getFlowProgramFileId()); recObj.put("processInstanceId", node.getProcessInstanceId()); return recObj; } */ /** * 导入审批记录 * @param zipOut * @param programPackageNodeIdList 程序包名的id列表 */ /* void addApproveRecordDataJson(ZipOutputStream zipOut, List programPackageNodeIdList) throws IOException { //List records = approveRecordService.lambdaQuery().in(ApproveRecord::getProcessInstanceId, instanceIds).list(); List records = approveRecordService.lambdaQuery().in(ApproveRecord::getNcNodeId, programPackageNodeIdList).list(); JSONArray jsonArray = new JSONArray(); for(ApproveRecord record : records){ JSONObject recObj = new JSONObject(); recObj.put("id", record.getId()); recObj.put("comment", record.getComment()); recObj.put("userId",record.getUserId()); recObj.put("userNickname",record.getUserNickname()); recObj.put("operateTime",record.getOperateTime()); recObj.put("operateResult",record.getOperateResult()); recObj.put("taskName",record.getTaskName()); recObj.put("processInstanceId",record.getProcessInstanceId()); recObj.put("ncNodeId",record.getNcNodeId()); addSuperProperties(recObj,record); jsonArray.add(recObj); } addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),"exp_mdm_approve_record.json"); }*/ void addSuperProperties(JSONObject recObj, BizEntity entity){ recObj.put("tenantId",entity.getTenantId()); recObj.put("createTime",entity.getCreateTime()); recObj.put("updateTime",entity.getUpdateTime()); recObj.put("createUser",entity.getCreateUser()); recObj.put("updateUser",entity.getUpdateUser()); recObj.put("status",entity.getStatus()); recObj.put("createDept",entity.getCreateDept()); } /** * 将 输入流 中的内容写入zip * @param zipOut zip输出流 * @param inputStream 输入流 * @param entryName 文件名 * @throws IOException */ void addInputStreamToZip(ZipOutputStream zipOut, InputStream inputStream, String entryName) throws IOException { // 创建新的 ZIP 条目 ZipEntry zipEntry = new ZipEntry(entryName); zipOut.putNextEntry(zipEntry); // 将输入流写入 ZIP 输出流 byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) >= 0) { zipOut.write(buffer, 0, length); } // 关闭当前条目 zipOut.closeEntry(); } }