|
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.mp.base.BizServiceImpl;
|
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.service.CureFlowService;
|
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.DncSendBackData;
|
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.LocalDateTime;
|
import java.util.*;
|
|
/**
|
* MDM程序导入(工控网功能)
|
*
|
* @author yangys
|
*/
|
@Slf4j
|
@Service
|
@AllArgsConstructor
|
public class MdmProgramImportService extends BizServiceImpl<NcProgramExchangeMapper, NcProgramExchange> {
|
private final CureFlowService cureFlowService;
|
private final NcProgramService ncProgramService;
|
/**
|
* MDM导入文件上传
|
* @param file MDM涉密网导出文件
|
* @return
|
*/
|
public List<MdmProgramImportVO> mdmImportUpload(MultipartFile file) {
|
List<MdmProgramImportVO> list;
|
try {
|
//String fileName = file.getOriginalFilename();
|
//InputStream zipFileInputStream = FileExchangeUtil.convertFileToZip(file.getInputStream());
|
InputStream zipFileInputStream = file.getInputStream();//test
|
|
byte[] bytes = FileUtil.copyToByteArray(zipFileInputStream);
|
list = parseMdmZipFromByteArray(bytes);
|
|
|
} catch (IOException e) {
|
log.error("上传dnc回传文件失败",e);
|
list = Collections.emptyList();
|
}
|
return list;
|
}
|
|
InputStream convertFileToZip(InputStream inputStream) throws IOException {
|
|
File tempFile = createTempFile();
|
FileOutputStream fos = new FileOutputStream(tempFile);
|
CustomBinaryReader.read(inputStream,fos);
|
|
|
FileInputStream dInstream = new FileInputStream(tempFile);
|
|
return dInstream;
|
}
|
|
/**
|
* 创建一个临时文件
|
* @return
|
* @throws IOException
|
*/
|
File createTempFile() throws IOException {
|
Path tempDir = Paths.get(System.getProperty("java.io.tmpdir"));
|
// 在临时目录中创建文件
|
String tfilename = "t"+System.currentTimeMillis();
|
Path tempFile = Files.createTempFile(tempDir, tfilename, ".tmp");
|
System.out.println("创建的临时文件: " + tempFile);
|
return tempFile.toFile();
|
}
|
public static List<MdmProgramImportVO> parseMdmZipFromByteArray(byte[] zipData) throws IOException {
|
List<MdmProgramImportVO> list = new ArrayList<>();
|
Map<String,String> fileMd5Map = new HashMap<>();
|
Map<String,MdmProgramImportVO> fileDataMap = new HashMap<>();
|
try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(zipData);
|
ZipFile zipFile = new ZipFile(channel)) {
|
|
ZipArchiveEntry entry;
|
Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
|
while (entries.hasMoreElements()) {
|
entry = entries.nextElement();
|
|
String entryName = entry.getName();
|
|
if (!entry.isDirectory()) {
|
//直接解析程序的json文件
|
if(entryName.equals(NcProgramExportDNCService.PROGRAM_JSON_FILE)){
|
|
try (InputStream inputStream = zipFile.getInputStream(entry)) {
|
String jsonStr = IoUtil.readToString(inputStream);
|
|
JSONArray jsonArray = JSONArray.parseArray(jsonStr);
|
for(int i=0;i<jsonArray.size();i++){
|
JSONObject jsonObject = jsonArray.getJSONObject(i);
|
MdmProgramImportVO d = new MdmProgramImportVO();
|
d.setName(jsonObject.getString("name"));
|
d.setId(jsonObject.getLong("id"));
|
d.setCode(jsonObject.getString("code"));
|
d.setDescription(jsonObject.getString("description"));
|
d.setCategory(jsonObject.getString("category"));
|
d.setBindNcNodeId(jsonObject.getLong("bindNcNodeId"));
|
d.setIsLastEdition(jsonObject.getInteger("isLastEdition"));
|
d.setIsLocked(jsonObject.getInteger("isLocked"));
|
d.setIsTest(jsonObject.getInteger("isTest"));
|
d.setMachineCode(jsonObject.getString("machineCode"));
|
d.setNcNodeId(jsonObject.getLong("ncNodeId"));
|
d.setPartNo(jsonObject.getString("partNo"));
|
d.setProcessEdition(jsonObject.getString("processEdition"));
|
|
fileDataMap.put(d.getName(),d);
|
|
list.add(d);
|
}
|
|
}
|
}else{
|
try (InputStream inputStream = zipFile.getInputStream(entry)) {
|
fileMd5Map.put(entryName,DigestUtils.md5Hex(inputStream));//获取文件MD5
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
//设置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) {
|
/*
|
List<Long> idList = Func.toLongList(ids);
|
List<NcProgram> progList = ncProgramService.listByIds(idList);
|
NcProgramExchange exchange;
|
//NcProgram program;
|
//NcNode programNode;
|
|
for(NcProgram prog:progList){
|
exchange = new NcProgramExchange();
|
exchange.setName(prog.getName());
|
exchange.setExchangeType(2);//回传
|
exchange.setNcProgramId(prog.getId());
|
|
this.save(exchange);
|
|
}
|
//直接入库,无流程
|
*/
|
|
}
|
}
|