|
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<NcProgramExchangeMapper, NcProgramExchange> {
|
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<MdmProgramImportVO> mdmImportUpload(MultipartFile file) {
|
List<MdmProgramImportVO> 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<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文件
|
|
|
}
|
|
}
|
|
}
|
//设置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<Long> idList = Func.toLongList(ids);
|
//
|
updateProgramFile(pkgFileName,idList);
|
|
}
|
|
/**
|
* 更新程序文件
|
* @param pkgFileName mdm程序包
|
* @param idList 选定入库的
|
*/
|
private void updateProgramFile(String pkgFileName,List<Long> idList) throws IOException {
|
InputStream inputStream = this.ossTemplate.statFileStream(pkgFileName);
|
byte[] bytes = FileUtil.copyToByteArray(inputStream);
|
|
List<NcNode> nodeList = new ArrayList<>();
|
List<NcProgram> progList = new ArrayList<>();
|
List<ApproveRecord> recordList = new ArrayList<>();
|
|
try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(bytes);
|
ZipFile zipFile = new ZipFile(channel)) {
|
|
ZipArchiveEntry entry;
|
Enumeration<ZipArchiveEntry> 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"));
|
}
|
}
|