/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
*
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
*
* 1. This software is for development use only under a valid license
* from BladeX.
*
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
*
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
*
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
*
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
*
* Author: Chill Zhuang (bladejava@qq.com)
*/
package org.springblade.mdm.program.service;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
import org.flowable.engine.*;
import org.springblade.core.tool.utils.FileUtil;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
/**
* 工作流服务实现类
*
* @author Chill
*/
@Slf4j
@Service
@AllArgsConstructor
public class DncSendBackService {
private final RepositoryService repositoryService;
private final RuntimeService runtimeService;
private final HistoryService historyService;
private final ProcessEngine processEngine;
/**
* dnc回传文件上传
* @param file
* @return
*/
public List dncSendBackUpload(MultipartFile file) {
List list=new ArrayList<>();
try {
String fileName = file.getOriginalFilename();
InputStream fileInputStream = file.getInputStream();
byte[] bytes = FileUtil.copyToByteArray(fileInputStream);
list = parseDncZipFromByteArray(bytes);
//TODO 解析为列表文件
DncSendBackData dt = new DncSendBackData();
dt.setId(1L);
dt.setProgramName("test.nc");
dt.setProgramNo("001");
list.add(dt);
} catch (IOException e) {
log.error("上传dnc文件失败",e);
}
return list;
}
public static List parseDncZipFromByteArray(byte[] zipData) throws IOException {
//List datas = new ArrayList<>();
List datas = ZipFileDirectoryScanner.getFilesInDirectoryRecursive(zipData, "");
/*
try (ByteArrayInputStream bis = new ByteArrayInputStream(zipData);
ZipArchiveInputStream zis = new ZipArchiveInputStream(bis)) {
ZipArchiveEntry entry;
while ((entry = zis.getNextZipEntry()) != null) {
DncSendBackData prog = new DncSendBackData();
prog.setProgramName(entry.getName());
if (!entry.isDirectory()) {
System.out.println("文件名: " + entry.getName());
System.out.println("大小: " + entry.getSize());
// 读取文件内容到字节数组
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
IOUtils.copy(zis, outputStream);
byte[] fileContent = outputStream.toByteArray();
// 处理文件内容...
System.out.println("内容长度: " + fileContent.length);
}else{
//文件夹,读内部文件,获取文件列表
System.out.println("文件夹程序:"+entry.getName());
List children = new ArrayList<>();
prog.setChildren(children);
}
datas.add(prog);
}
}*/
return datas;
}
/**
* 入库回传文件
* @param ids
* @return
*/
public void dncFileAccept(String ids) {
}
}
class ZipFileDirectoryScanner {
public static List getFilesInDirectoryRecursive(byte[] zipData, String dirPath) throws IOException {
List list = new ArrayList<>();
if (!dirPath.endsWith("/")) {
dirPath += "/";
}
try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(zipData);
ZipFile zipFile = new ZipFile(channel)) {
Enumeration entries = zipFile.getEntries();
while (entries.hasMoreElements()) {
ZipArchiveEntry entry = entries.nextElement();
String entryName = entry.getName();
DncSendBackData d = new DncSendBackData();
d.setProgramName(entryName);
if(entry.isDirectory()){
d.setHasChildren(true);
}
list.add(d);
//if (entryName.startsWith(dirPath) && !entry.isDirectory()) {
// fileList.add(entryName);
//}
}
}
return list;
}
}