package com.zy.ruralhouse.utils;
import com.zy.ruralhouse.mapper.RuralInfoMapper;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
/**
* @Author:pmy
* @Description:
* @Date:2020/7/29
*/
@Component
public class ZipUtil {
@Resource
private RuralInfoMapper ruralInfoMapper;
/**
* zip解压
* @param srcFile zip源文件
* @param destDirPath 解压后的目标文件夹
* @throws RuntimeException 解压失败会抛出运行时异常
*/
public static String unZipFiles(File srcFile, String destDirPath,String flag) throws RuntimeException {
long start = System.currentTimeMillis();
String mdbFilePath=null;
// 判断源文件是否存在
if (!srcFile.exists()) {
throw new RuntimeException(srcFile.getPath() + "所指文件不存在");
}
// 开始解压
ZipFile zipFile = null;
try {
zipFile = new ZipFile(srcFile,"gbk");
Enumeration<?> entries = zipFile.getEntries();
List<String> filePathList=null;
Map<String, Object> m = null;
Map<String,String> mdata=null;
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
String zipEntryName = entry.getName();
if("sxsj".equals(flag)){
if(!zipEntryName.toLowerCase().endsWith(".mdb")) continue;
}
System.out.println("解压" + entry.getName());
// 如果是文件夹,就创建个文件夹
if (entry.isDirectory()) {
String dirPath = destDirPath + "/" + zipEntryName;
File dir = new File(dirPath);
dir.mkdirs();
} else {
// 如果是文件,就先创建一个文件,然后用io流把内容copy过去
String filePath=destDirPath + "/" + zipEntryName;
File targetFile = new File(filePath);
// 保证这个文件的父文件夹必须要存在
if(!targetFile.getParentFile().exists()){
targetFile.getParentFile().mkdirs();
}
targetFile.createNewFile();
// 将压缩文件内容写入到这个文件中
InputStream is = zipFile.getInputStream(entry);
FileOutputStream fos = new FileOutputStream(targetFile);
int len;
byte[] buf = new byte[1024];
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
// 关流顺序,先打开的后关闭
fos.close();
is.close();
//获取空间文件集合
String fileName=targetFile.getName();
// String namePre = fileName.substring(0, fileName.lastIndexOf("."));
// if(fileName.toLowerCase().endsWith(".dbf")){
// if(mdata==null){
// mdata=new HashMap<>();
// mdata.put("dbfPath",filePath);
// }
// }else if(fileName.toLowerCase().endsWith(".shp")){
// mdata.put("shpPath",filePath);
// m = new HashMap<>();
// m.put("id", namePre);
// m.put("type",namePre.toLowerCase().indexOf("zdjbxx")!=-1?"zdxx":"common");
// m.put("data", mdata);
// pathList.add(m);
// mdata=null;
// m=null;
// }
if (fileName.toLowerCase().endsWith(".mdb")) {
mdbFilePath = filePath;
}
}
}
long end = System.currentTimeMillis();
System.out.println("解压完成,耗时:" + (end - start) +" ms");
} catch (Exception e) {
throw new RuntimeException("unzip error from ZipUtils", e);
} finally {
if(zipFile != null){
try {
zipFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return mdbFilePath;
}
/**
* @param filePath
* 临时文件的删除
* 删除文件夹里面子目录
* 再删除文件夹
*/
public void deleteFiles(String filePath) {
File file = new File(filePath);
if ((!file.exists()) || (!file.isDirectory())) {
System.out.println("file not exist");
return;
}
String[] tempList = file.list();
File temp = null;
for (int i = 0; i < tempList.length; i++) {
if (filePath.endsWith(File.separator)) {
temp = new File(filePath + tempList[i]);
}
else {
temp = new File(filePath + File.separator + tempList[i]);
}
if (temp.isFile()) {
temp.delete();
}
if (temp.isDirectory()) {
this.deleteFiles(filePath + "/" + tempList[i]);
}
}
// 空文件的删除
file.delete();
}
/**
* @param desFile,fileList
* 获取目录下所有文件,包括子文件夹下的文件
*/
public List<File> getSubFiles(String desFile, List<File> fileList) {
File file = new File(desFile);
File[] files = file.listFiles();
for (File fileIndex : files) {
if (!fileIndex.exists()) {
throw new NullPointerException("Cannot find " + fileIndex);
} else if (fileIndex.isFile()) {
fileList.add(fileIndex);
} else {
if (fileIndex.isDirectory()) {
getSubFiles(fileIndex.getAbsolutePath(),fileList);
}
}
}
return fileList;
}
public Map<String,Map<String,List<File>>> getFiles(String path,String zddm,String unitId,Map<String,Map<String,List<File>>> o){
File file = new File(path);
File[] files = file.listFiles();
for (File fileIndex : files) {
if (!fileIndex.exists()) {
throw new NullPointerException("Cannot find " + fileIndex);
} else if(fileIndex.isDirectory()){
if(fileIndex.getName().contains(zddm)){
if(o==null || o.get(zddm) == null){
Map<String,List<File>> pf = new HashMap<>();
List<File> f = new ArrayList<>();
f=getSubFiles(fileIndex.getAbsolutePath()+"/zd_archives",f);
pf.put("宗地附件",f);
o.put(zddm,pf);
}
File mf= new File(fileIndex.getAbsolutePath());
File[] ms = mf.listFiles();
for(File tf:ms){
if(tf.getName().contains(unitId)){
Map<String,List<File>> uf = new HashMap<>();
File ff= new File(tf.getAbsolutePath());
File[] fs = ff.listFiles();
List<File> s = new ArrayList<>();
for(File zf:fs){
if(zf.isFile()){
s.add(zf);
uf.put("房屋附件",s);
}else if (zf.isDirectory()){
if(zf.getName().contains("分户")){
List<File> wf = new ArrayList<>();
wf=getSubFiles(zf.getAbsolutePath(),wf);
uf.put("分层分户图",wf);
} else if(zf.getName().contains("其他")){
List<File> wf = new ArrayList<>();
wf=getSubFiles(zf.getAbsolutePath(),wf);
uf.put("其他附件",wf);
}else{
getFiles(zf.getAbsolutePath(),zddm,unitId,o);
}
}
}
o.put(unitId,uf);
}else{
getFiles(tf.getAbsolutePath(),zddm,unitId,o);
}
}
break;
}else {
getFiles(fileIndex.getAbsolutePath(),zddm,unitId,o);
}
}
}
return o;
}
public Map<String,Map<String,List<File>>> getFilesTwo(String path,String zddm,String unitId,Map<String,Map<String,List<File>>> o,Integer status) {
File file = new File(path);
File[] files = file.listFiles();
if (files != null) {
for (File fileIndex : files) {
if (fileIndex.isDirectory()) {
if (fileIndex.getParent().contains("扫描档案")) {
File zd = new File(fileIndex.getAbsolutePath());
File[] zs = zd.listFiles();
for (File f : zs) {
if (f.getName().contains(zddm)) {
File mf = new File(f.getAbsolutePath());
File[] ms = mf.listFiles();
for (File tf : ms) {
if (tf.getName().contains(unitId)) {
//修改材料上传补录标志 补录的时候需要用
if(status==4){
ruralInfoMapper.updateCommitToBdcByZddm("3",zddm,unitId);
}
Map<String, List<File>> uf = new HashMap<>();
File ff = new File(tf.getAbsolutePath());
File[] fs = ff.listFiles();
List<File> s = new ArrayList<>();
for (File zf : fs) {
if (zf.isFile()) {
s.add(zf);
uf.put("房屋附件", s);
} else if (zf.isDirectory()) {
if (zf.getName().contains("分户")) {
List<File> wf = new ArrayList<>();
wf = getSubFiles(zf.getAbsolutePath(), wf);
uf.put("分层分户图", wf);
} else if (zf.getName().contains("其他")||zf.getName().contains("其它")) {
List<File> wf = new ArrayList<>();
wf = getSubFiles(zf.getAbsolutePath(), wf);
uf.put("其他附件", wf);
} else {
getFilesTwo(zf.getAbsolutePath(), zddm, unitId, o,status);
}
}
}
o.put(unitId, uf);
} else {
getFilesTwo(tf.getAbsolutePath(), zddm, unitId, o,status);
}
}
} else if (f.getName().contains("土地") && f.getParent().contains(zddm)) {
Map<String, List<File>> uf = new HashMap<>();
File mf = new File(f.getAbsolutePath());
File[] ds = mf.listFiles();
for (File df : ds) {
if (df.isDirectory() && df.getName().contains(zddm)) {
File kf = new File(df.getAbsolutePath());
File[] us = kf.listFiles();
for (File kkf : us) {
if (kkf.isDirectory()) {
if (kkf.getName().contains("地籍调查表")) {
List<File> wf = new ArrayList<>();
wf = getSubFiles(kkf.getAbsolutePath(), wf);
uf.put("地籍调查表", wf);
} else if (kkf.getName().contains("其他")||kkf.getName().contains("其它")) {
List<File> wf = new ArrayList<>();
wf = getSubFiles(kkf.getAbsolutePath(), wf);
uf.put("宗地其他附件", wf);
} else if (kkf.getName().contains("宗地图")) {
List<File> wf = new ArrayList<>();
wf = getSubFiles(kkf.getAbsolutePath(), wf);
uf.put("宗地图", wf);
} else {
getFilesTwo(df.getAbsolutePath(), zddm, unitId, o,status);
}
}
}
o.put(zddm, uf);
}
}
} else {
getFilesTwo(f.getAbsolutePath(), zddm, unitId, o,status);
}
}
} else {
getFilesTwo(fileIndex.getAbsolutePath(), zddm, unitId, o,status);
}
}
}
}
return o;
}
public boolean subFileExists(String path,String key){
File file = new File(path);
File[] files = file.listFiles();
for (File fileIndex : files) {
if (!fileIndex.exists()) {
throw new NullPointerException("Cannot find " + fileIndex);
} else if(fileIndex.isDirectory()){
if(fileIndex.getName().contains(key)){
return true;
}else {
if( subFileExists(fileIndex.getAbsolutePath(),key)) return true;
}
}
}
return false;
}
public Map<String,String> getMuLu(String path,Map<String,String> map) {
File file = new File(path);
File[] files = file.listFiles();
if(path.endsWith("扫描档案")){
for (File fileIndex : files) {
map.put(fileIndex.getPath().substring(fileIndex.getPath().lastIndexOf("扫描档案")+5),fileIndex.getPath());
}
return map;
}
if (files != null) {
for (File fileIndex : files) {
if (fileIndex.isDirectory()) {
if (fileIndex.getParent().contains("扫描档案")) {
} else {
getMuLu(fileIndex.getAbsolutePath(),map);
}
}
}
}
return map;
}
public Map<String,Map<String,List<File>>> getFilesByZddm(String path,String zddm,String unitId,Map<String,Map<String,List<File>>> o,Integer status) {
File file = new File(path);
File[] zs = file.listFiles();
for (File f : zs) {
if (f.getName().contains(zddm)) {
File mf = new File(f.getAbsolutePath());
File[] ms = mf.listFiles();
for (File tf : ms) {
if (tf.getName().contains(unitId)) {
//修改材料上传补录标志 补录的时候需要用
if(status==4){
ruralInfoMapper.updateCommitToBdcByZddm("3",zddm,unitId);
}
Map<String, List<File>> uf = new HashMap<>();
File ff = new File(tf.getAbsolutePath());
File[] fs = ff.listFiles();
List<File> s = new ArrayList<>();
for (File zf : fs) {
if (zf.isFile()) {
s.add(zf);
uf.put("房屋附件", s);
} else if (zf.isDirectory()) {
if (zf.getName().contains("分户")) {
List<File> wf = new ArrayList<>();
wf = getSubFiles(zf.getAbsolutePath(), wf);
uf.put("分层分户图", wf);
} else if (zf.getName().contains("其他")||zf.getName().contains("其它")) {
List<File> wf = new ArrayList<>();
wf = getSubFiles(zf.getAbsolutePath(), wf);
uf.put("其他附件", wf);
} else {
getFilesByZddm(zf.getAbsolutePath(), zddm, unitId, o,status);
}
}
}
o.put(unitId, uf);
} else {
getFilesByZddm(tf.getAbsolutePath(), zddm, unitId, o,status);
}
}
} else if (f.getName().contains("土地") && f.getParent().contains(zddm)) {
Map<String, List<File>> uf = new HashMap<>();
File mf = new File(f.getAbsolutePath());
File[] ds = mf.listFiles();
for (File df : ds) {
if (df.isDirectory() && df.getName().contains(zddm)) {
File kf = new File(df.getAbsolutePath());
File[] us = kf.listFiles();
for (File kkf : us) {
if (kkf.isDirectory()) {
if (kkf.getName().contains("地籍调查表")) {
List<File> wf = new ArrayList<>();
wf = getSubFiles(kkf.getAbsolutePath(), wf);
uf.put("地籍调查表", wf);
} else if (kkf.getName().contains("其他")||kkf.getName().contains("其它")) {
List<File> wf = new ArrayList<>();
wf = getSubFiles(kkf.getAbsolutePath(), wf);
uf.put("宗地其他附件", wf);
} else if (kkf.getName().contains("宗地图")) {
List<File> wf = new ArrayList<>();
wf = getSubFiles(kkf.getAbsolutePath(), wf);
uf.put("宗地图", wf);
} else {
getFilesByZddm(df.getAbsolutePath(), zddm, unitId, o,status);
}
}
}
o.put(zddm, uf);
}
}
} else {
getFilesByZddm(f.getAbsolutePath(), zddm, unitId, o,status);
}
}
return o;
}
}
/**
* 合并文件并解析附件材料数据
*
* @return
*/
@SuppressWarnings("unchecked")
@ResponseBody
@RequestMapping("/caiFileMerge")
public SimpleJsonResult mergeUploadCaiData(String applicationId, String intoFlag, String fileName, String checkData, HttpServletRequest request, HttpServletResponse response) throws Exception {
if (StringUtils.isBlank(applicationId)) {
return failureJsonResult("请先上传属性数据");
}
Subject subject = SecurityUtils.getSubject();
//获取所属机构信息
SysUser user = (SysUser) subject.getPrincipal();
long start = System.currentTimeMillis();
FileOutputStream fileOutputStream = null;
FileChannel inChannel = null;
FileChannel outChannel = null;
RuralInfo ruralInfo = ruralInfoMapper.select(applicationId);
//合并压缩包
//获取项目的根路径
String realpath = request.getSession().getServletContext().getRealPath("/");
final String Temp_Video_Path = "video/" + fileName;
String fileNameOut = fileName;
String classFile = URLDecoder.decode(this.getClass().getClassLoader().getResource("/").getPath(), "utf-8");
String path = classFile + "../static/fileSpace/" + applicationId + "/" + fileNameOut + "/";//总路径,包括zip文件和解压后的文件
String newFilePath = path + "fileOut";
String zipPath = path + "zip/" + fileNameOut + ".zip";
File video = new File(zipPath);
try {
//先判断文件的父目录是否存在,不存在需要创建;否则报错
if (!video.getParentFile().exists()) {
video.getParentFile().mkdirs();
video.createNewFile();//创建文件
}
//创建流
fileOutputStream = new FileOutputStream(video);
// 转成集合,便于排序
List<File> fileList = new ArrayList<>();
fileList = zipUtil.getSubFiles(realpath + Temp_Video_Path + "/", fileList);
// 从小到大排序
Collections.sort(fileList, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
String name1 = o1.getName();
String name2 = o2.getName();
if (Integer.parseInt(name1.substring(0, name1.lastIndexOf("."))) < Integer.parseInt(name2.substring(0, name2.lastIndexOf(".")))) {
return -1;
}
return 1;
}
});
// 输出流
outChannel = fileOutputStream.getChannel();
// 合并
for (File f : fileList) {
inChannel = new FileInputStream(f).getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
inChannel.close();
//获取文件上级目录
File prantFile = f.getParentFile();
// 删除分片
f.delete();
if (prantFile.isDirectory() && prantFile.listFiles().length <= 0) {
prantFile.delete();
}
}
// 关闭流
fileOutputStream.close();
outChannel.close();
System.out.println("合并文件成功");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inChannel != null) {
try {
inChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outChannel != null) {
try {
outChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//解析压缩包
String mdbFilePath = null;
try {
mdbFilePath = zipUtil.unZipFiles(video, newFilePath,"fjcl");//解压文件,获取文件路径
} catch (Exception e) {
e.printStackTrace();
//插入错误日志表
return failureJsonResult("解压执行失败");
}
Map<String, Object> params = new HashMap<String, Object>();
params.put("applicationId", applicationId);
//if ("0".equals(intoFlag)) {//覆盖导
// //删除附件信息
// ruralInfoService.removeUpfile(Long.valueOf(app文件上传ftp失败licationId), null);
//}
//获取导入成功的房子的不动产单元号和宗地代码集合
List<Map<String, String>> hlist = ruralInfoService.getHouseList(applicationId);
Map<String,String> as = new HashMap<>();
zipUtil.getMuLu(newFilePath,as);
String info = "";
if (hlist != null && hlist.size() > 0) {
for (Map<String, String> m : hlist) {
String unitId = m.get("unitid");
String zddm = m.get("zddm");
if(!as.containsKey(zddm)){
continue;
}
try {
ruralInfoService.insertFiles(applicationId, as.get(zddm), zddm, unitId);
} catch (Exception e) {
System.out.println("======================================"+e.toString());
info+=unitId+" "+e.getMessage();
continue;
}
}
} else {
return failureJsonResult("没有有效的房屋数据导入,请确认");
}
//附件材料上传
ruralInfoService.uploadFile(applicationId,user);
zipUtil.deleteFiles(path);//删除mdb文件夹
zipUtil.deleteFiles( path + "zip/" + fileNameOut + "zip");//删除压缩包文件夹
System.out.println("##################applicationId:"+applicationId+"材料文件上传结束##################");
if(ruralInfo.getExamineStatus()==4){//材料补录
//修改同步标志未待同步
ruralInfoMapper.updateCommitToBdcRural(applicationId,"3");
System.out.println("##################applicationId:"+applicationId+"材料文件补录开始##################");
ruralInfoService.imageProcess(applicationId,user);
System.out.println("##################applicationId:"+applicationId+"材料文件补录结束##################");
long end = System.currentTimeMillis();
System.out.println("材料文件补录完成,耗时:" + (end - start) +" ms");
}
if(info!=""){
return failureJsonResult("扫描档案:["+info+"]上传失败,其他附件材料上传成功");
}
long end = System.currentTimeMillis();
System.out.println("附件材料上传成功完成,耗时:" + (end - start) +" ms");
return successJsonResult("附件材料上传成功");
}