package org.springblade.mdm.program.service; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipFile; import org.apache.commons.compress.utils.SeekableInMemoryByteChannel; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BizEntity; import org.springblade.core.mp.base.BizServiceImpl; import org.springblade.core.oss.OssTemplate; import org.springblade.core.oss.model.BladeFile; import org.springblade.core.redis.cache.BladeRedis; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.FileUtil; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.IoUtil; import org.springblade.mdm.flow.entity.ApproveRecord; import org.springblade.mdm.flow.service.ApproveRecordService; import org.springblade.mdm.flow.service.CureFlowService; import org.springblade.mdm.program.entity.NcNode; import org.springblade.mdm.program.entity.NcProgram; import org.springblade.mdm.program.entity.NcProgramExchange; import org.springblade.mdm.program.mapper.NcProgramExchangeMapper; import org.springblade.mdm.program.vo.MdmProgramImportVO; import org.springblade.mdm.utils.CustomBinaryReader; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.Duration; import java.util.*; /** * MDM程序导入(工控网功能) * 目前工控网展现形式未定,暂时实现暂停 * @author yangys */ @Slf4j @Service @AllArgsConstructor public class MdmProgramImportService extends BizServiceImpl { private final CureFlowService cureFlowService; private final NcProgramService ncProgramService; private final NcNodeService ncNodeService; private final ApproveRecordService approveRecordService; private final BladeRedis bladeRedis; private final OssTemplate ossTemplate; private String getFileKey(){ return "mdmimpfile-"+ AuthUtil.getUserId(); } /** * MDM导入文件上传 * @param file MDM涉密网导出文件 * @return */ public List mdmImportUpload(MultipartFile file) { List list; try { BladeFile bfile = ossTemplate.putFile(file);//上传,供后续入库使用 //设置一个缓存,2小时过期 bladeRedis.setEx(getFileKey(),bfile.getName(), Duration.ofHours(2)); String pkgFileName = bladeRedis.get(getFileKey()); InputStream zipFileInputStream = file.getInputStream();//test byte[] bytes = FileUtil.copyToByteArray(zipFileInputStream); list = parseMdmZipFromByteArray(bytes); } catch (IOException e) { log.error("导入涉密网摆渡文件失败",e); throw new ServiceException("解析DNC回传数据失败"); } return list; } public static List parseMdmZipFromByteArray(byte[] zipData) throws IOException { List list = new ArrayList<>(); Map fileMd5Map = new HashMap<>(); Map fileDataMap = new HashMap<>(); try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(zipData); ZipFile zipFile = new ZipFile(channel)) { ZipArchiveEntry entry; Enumeration entries = zipFile.getEntries(); while (entries.hasMoreElements()) { entry = entries.nextElement(); String entryName = entry.getName(); if (!entry.isDirectory()) { //直接解析程序的json文件 } } } //设置md5值 fileDataMap.forEach((k,v)->{ if(fileMd5Map.containsKey(k)){ v.setMd5(fileMd5Map.get(k)); } }); return list; } /** * 入库mdm涉密网文件 * @param ids id列表逗号分隔 * @return */ public void mdmFileAccept(String ids) throws IOException { String pkgFileName = bladeRedis.get(getFileKey()); List idList = Func.toLongList(ids); // updateProgramFile(pkgFileName,idList); } /** * 更新程序文件 * @param pkgFileName mdm程序包 * @param idList 选定入库的 */ private void updateProgramFile(String pkgFileName,List idList) throws IOException { InputStream inputStream = this.ossTemplate.statFileStream(pkgFileName); byte[] bytes = FileUtil.copyToByteArray(inputStream); List nodeList = new ArrayList<>(); List progList = new ArrayList<>(); List recordList = new ArrayList<>(); try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(bytes); ZipFile zipFile = new ZipFile(channel)) { ZipArchiveEntry entry; Enumeration entries = zipFile.getEntries(); while (entries.hasMoreElements()) { entry = entries.nextElement(); String entryName = entry.getName(); } } for(NcNode node:nodeList){ NcNode nodeTemp = this.ncNodeService.getById(node.getId()); if(nodeTemp == null){ ncNodeService.save(node); }else{ ncNodeService.updateById(node); } } for(NcProgram prog:progList){ NcProgram ncTemp = ncProgramService.getById(prog.getId()); if(ncTemp == null){ ncProgramService.save(prog); }else{ ncProgramService.updateById(prog); } } for(ApproveRecord record:recordList) { ApproveRecord recordTemp = this.approveRecordService.getById(record.getId()); if (recordTemp == null) { approveRecordService.save(record); } else { approveRecordService.updateById(record); } } } void setBaseProperties(BizEntity entity,JSONObject jsonObject){ entity.setCreateTime(jsonObject.getDate("createTime")); entity.setUpdateTime(jsonObject.getDate("updateTime")); entity.setStatus(jsonObject.getInteger("status")); entity.setCreateUser(jsonObject.getLong("createUser")); entity.setUpdateUser(jsonObject.getLong("updateUser")); } }