package org.springblade.mdm.program.service; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.compress.archivers.zip.ZipUtil; 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.mdm.flow.entity.ApproveRecord; import org.springblade.mdm.flow.service.ApproveRecordService; import org.springblade.mdm.program.entity.NcNode; import org.springblade.mdm.program.entity.NcProgram; import org.springblade.mdm.program.entity.NcProgramApproved; import org.springblade.mdm.program.mapper.NcProgramApprovedMapper; import org.springblade.mdm.program.vo.DncSendBackData; import org.springblade.mdm.program.vo.NcProgramExportDncPageVO; import org.springblade.mdm.program.vo.NcProgramExportDncQueryVO; import org.springblade.mdm.utils.CustomBinaryWriter; import org.springframework.stereotype.Service; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * 下发/回传程序统计 * * @author yangys */ @Slf4j @Service @AllArgsConstructor public class NcProgramApprovedService extends BizServiceImpl { private final NcProgramService progService; private final OssTemplate ossTemplate; private final ApproveRecordService approvedService; private final NcNodeService ncNodeService; /** * 分页查询 * @param query 查询参数 * @return */ public IPage exportDncPageQuery(NcProgramExportDncQueryVO query) { IPage page = this.getBaseMapper().exportDncPageQuery(Condition.getPage(query),query); return page; } /** * 导出dnc * @param approvedIdArr 待导出审批表id数组 */ public void exportDnc(Long[] approvedIdArr, OutputStream os) throws IOException { ZipOutputStream zipOut = new ZipOutputStream(os); ArrayList programIdList = new ArrayList(); for (Long approvedId : approvedIdArr) { NcProgramApproved approved = this.getById(approvedId); programIdList.add(approved.getNcProgramId()); NcProgram prog = progService.getById(approved.getNcProgramId()); String filename = prog.getOssName(); InputStream inputStream = ossTemplate.statFileStream(filename); addInputStreamToZip(zipOut, inputStream, prog.getName()); } addDataJson(zipOut, programIdList); } /** * 导入数据文件 * @param zipOut */ void addDataJson(ZipOutputStream zipOut, List programIdList) throws IOException { // addApproveRecordDataJson(zipOut, programIdList); addNcNodeDataJson(zipOut, programIdList); } /** * 导入审批记录 * @param zipOut * @param programIdList */ void addApproveRecordDataJson(ZipOutputStream zipOut, List programIdList) throws IOException { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(ApproveRecord::getNcProgramId, programIdList); List records = approvedService.list(queryWrapper); 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("ncProgramId",record.getNcProgramId()); recObj.put("processInstanceId",record.getProcessInstanceId()); addSuperProperties(recObj,record); jsonArray.add(recObj); } addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),"exp_mdm_approve_record.json"); } /** * 导入节点 * @param zipOut * @param programIdList */ void addNcNodeDataJson(ZipOutputStream zipOut, List programIdList) throws IOException { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(NcProgram::getId, programIdList); List programs = progService.list(queryWrapper); JSONArray jsonArray = new JSONArray(); ArrayList nodeList = new ArrayList<>(); for(NcProgram program : programs){ JSONObject recObj = new JSONObject(); NcNode ncNode = ncNodeService.getById(program.getNcNodeId()); nodeList.add(ncNode); } for(NcNode node : nodeList){ JSONObject recObj = new JSONObject(); recObj.put("id", node.getId()); recObj.put("nodeType", node.getNodeType()); recObj.put("machineCode",node.getMachineCode()); addSuperProperties(recObj,node); } addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),"exp_mdm_nc_node.json"); } void addSuperProperties(JSONObject recObj, BizEntity entity){ 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()); } public 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(); } }