Quellcode durchsuchen

总体规划、村庄规划按照目录名称约束进行检验检查

wanger vor 9 Monaten
Ursprung
Commit
1d9c91fa2f

+ 137 - 2
onemap-common/onemap-common-core/src/main/java/com/onemap/common/core/utils/StringUtils.java

@@ -1,10 +1,16 @@
 package com.onemap.common.core.utils;
 
 import java.io.*;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CodingErrorAction;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import com.onemap.common.core.utils.uuid.UUID;
+import org.apache.commons.io.FileUtils;
 import org.springframework.util.AntPathMatcher;
 import com.onemap.common.core.constant.Constants;
 import com.onemap.common.core.text.StrFormatter;
@@ -711,8 +717,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
         Map<String, String> resMap = new HashMap<>();
         try {
             File file = new File(filepath);
-            charset = isEmpty(charset) ? "UTF-8" : charset;
-//            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "GBK"));
+            charset = getFilecharset(file);
             BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset));
             String line;
             while ((line = reader.readLine()) != null) {
@@ -738,4 +743,134 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
         }
         return resMap;
     }
+
+    /**
+     * 获取文件的编码格式
+     *
+     * @param sourceFile
+     * @return
+     */
+    private static String getFilecharset(File sourceFile) {
+        String charset = "GBK";
+        byte[] first3Bytes = new byte[3];
+        try {
+            boolean checked = false;
+            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile));
+            bis.mark(0);
+            int read = bis.read(first3Bytes, 0, 3);
+            if (read == -1) {
+                return charset; //文件编码为 ANSI
+            } else if (first3Bytes[0] == (byte) 0xFF
+                    && first3Bytes[1] == (byte) 0xFE) {
+                charset = "UTF-16LE"; //文件编码为 Unicode
+                checked = true;
+            } else if (first3Bytes[0] == (byte) 0xFE
+                    && first3Bytes[1] == (byte) 0xFF) {
+                charset = "UTF-16BE"; //文件编码为 Unicode big endian
+                checked = true;
+            } else if (first3Bytes[0] == (byte) 0xEF
+                    && first3Bytes[1] == (byte) 0xBB
+                    && first3Bytes[2] == (byte) 0xBF) {
+                charset = "UTF-8"; //文件编码为 UTF-8
+                checked = true;
+            }
+            bis.reset();
+            if (!checked) {
+                int loc = 0;
+                while ((read = bis.read()) != -1) {
+                    loc++;
+                    if (read >= 0xF0)
+                        break;
+                    if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK
+                        break;
+                    if (0xC0 <= read && read <= 0xDF) {
+                        read = bis.read();
+                        if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF)
+                            // (0x80
+                            // - 0xBF),也可能在GB编码内
+                            continue;
+                        else
+                            break;
+                    } else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小
+                        read = bis.read();
+                        if (0x80 <= read && read <= 0xBF) {
+                            read = bis.read();
+                            if (0x80 <= read && read <= 0xBF) {
+                                charset = "UTF-8";
+                                break;
+                            } else
+                                break;
+                        } else
+                            break;
+                    }
+                }
+            }
+            bis.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return charset;
+    }
+
+
+    /**
+     * 正则表达式  获取参数占位信息
+     *
+     * @param str
+     * @return
+     */
+    public static List<String> extractUniqueMatches(String str) {
+        // 定义正则表达式
+        Pattern regex = Pattern.compile("\\{.*?\\}", Pattern.CASE_INSENSITIVE);
+        Matcher matcher = regex.matcher(str);
+        // 用于存储匹配结果的集合
+        Set<String> uniqueMatches = new HashSet<>();
+        // 查找所有匹配项
+        while (matcher.find()) {
+            uniqueMatches.add(matcher.group());
+        }
+        // 将Set转换为List并返回
+        return new ArrayList<>(uniqueMatches);
+    }
+
+    /**
+     * 通过文件验证规则  获取文件的绝对路径
+     *
+     * @param gzmc
+     * @param xzqdm
+     * @param xzqmc
+     * @param filepath
+     * @return
+     */
+    public static String getAbFilepath(String gzmc, String xzqdm, String xzqmc, String filepath) {
+        List<String> matches = extractUniqueMatches(gzmc);
+        String relName = gzmc;
+        for (String matche : matches) {
+            if (matche.contains("行政区名称")) {
+                relName = relName.replace(matche, xzqmc);
+            }
+            if (matche.contains("行政区代码")) {
+                if (matche.contains(":")) {
+                    Integer len = Integer.valueOf(matche.split(":")[1].replace("}", ""));
+                    if (len > xzqdm.length()) {
+                        return "基本信息文件中的行政区代码长度与数据标准不符!";
+                    } else {
+                        relName = relName.replace(matche, xzqdm.substring(0, len));
+                    }
+                } else {
+                    relName = relName.replace(matche, xzqdm);
+                }
+            }
+        }
+        return filepath + "\\" + relName;
+    }
+
+    public static void deleteCurDirectory(String parent) {
+        try {
+            FileUtils.deleteDirectory(new File(parent));
+        } catch (IOException e) {
+            e.printStackTrace();
+            System.out.println(String.format("文件夹删除失败:%s", parent));
+        }
+    }
 }

+ 2 - 31
onemap-modules/onemap-api/src/main/java/com/onemap/api/service/impl/ResultsServiceImpl.java

@@ -34,6 +34,7 @@ import java.util.stream.Collectors;
 
 import static com.onemap.api.util.Md5Utils.getMD5;
 import static com.onemap.api.util.utils.*;
+import static com.onemap.common.core.utils.StringUtils.*;
 
 
 @Service
@@ -539,37 +540,7 @@ public class ResultsServiceImpl implements ResultsService {
         return missfiles;
     }
 
-    /**
-     * 通过文件验证规则  获取文件的绝对路径
-     *
-     * @param gzmc
-     * @param xzqdm
-     * @param xzqmc
-     * @param filepath
-     * @return
-     */
-    public String getAbFilepath(String gzmc, String xzqdm, String xzqmc, String filepath) {
-        List<String> matches = extractUniqueMatches(gzmc);
-        String relName = gzmc;
-        for (String matche : matches) {
-            if (matche.contains("行政区名称")) {
-                relName = relName.replace(matche, xzqmc);
-            }
-            if (matche.contains("行政区代码")) {
-                if (matche.contains(":")) {
-                    Integer len = Integer.valueOf(matche.split(":")[1].replace("}", ""));
-                    if (len > xzqdm.length()) {
-                        return "基本信息文件中的行政区代码长度与数据标准不符!";
-                    } else {
-                        relName = relName.replace(matche, xzqdm.substring(0, len));
-                    }
-                } else {
-                    relName = relName.replace(matche, xzqdm);
-                }
-            }
-        }
-        return filepath + "\\" + relName;
-    }
+
 
     /**
      * 通过当前登录用户token获取openuser表信息

+ 0 - 78
onemap-modules/onemap-api/src/main/java/com/onemap/api/util/utils.java

@@ -119,82 +119,4 @@ public class utils {
         fos.close();
     }
 
-    /**
-     * 读取txt文本文件
-     *
-     * @param filepath
-     * @return Map<String, String>
-     */
-    public static Map<String, String> readTxt(String filepath, String charset) {
-        Map<String, String> resMap = new HashMap<>();
-        try {
-            File file = new File(filepath);
-//            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "GBK"));
-            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset));
-            String line;
-            while ((line = reader.readLine()) != null) {
-                if (StringUtils.isNotEmpty(line) && !line.contains("[")) {
-                    line = line.replace(" ", "");
-                    String[] curline = line.split("=");
-                    if (curline.length == 1) {
-                        continue;
-                    }
-                    System.out.println("newnewnew");
-                    System.out.println(curline[0]);
-                    System.out.println(curline[1]);
-                    if (curline[0].contains("项目名称")) {
-                        System.out.println("---XMMC---");
-                        resMap.put("xmmc", curline[1]);
-                    }
-                    resMap.put(curline[0], curline[1]);
-                }
-            }
-            reader.close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return resMap;
-    }
-
-    /**
-     * 搜索文件夹下指定文件名结尾的文件  默认返回第一个
-     *
-     * @param filepath
-     * @param endsWith
-     * @return String
-     */
-    public static String FileSearch(String filepath, String endsWith) {
-        File folder = new File(filepath);
-        File[] files = folder.listFiles(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String name) {
-                return name.endsWith(endsWith);
-            }
-        });
-        if (files.length > 0) {
-            return files[0].getAbsolutePath();
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * 正则表达式  获取参数占位信息
-     *
-     * @param str
-     * @return
-     */
-    public static List<String> extractUniqueMatches(String str) {
-        // 定义正则表达式
-        Pattern regex = Pattern.compile("\\{.*?\\}", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = regex.matcher(str);
-        // 用于存储匹配结果的集合
-        Set<String> uniqueMatches = new HashSet<>();
-        // 查找所有匹配项
-        while (matcher.find()) {
-            uniqueMatches.add(matcher.group());
-        }
-        // 将Set转换为List并返回
-        return new ArrayList<>(uniqueMatches);
-    }
 }

+ 9 - 0
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/domain/cggl/EscalationDTO.java

@@ -28,6 +28,15 @@ public class EscalationDTO {
     private String username;
     private String instid;
     private String scmodel;
+    private String loginfo;//上报日志
+
+    public String getLoginfo() {
+        return loginfo;
+    }
+
+    public void setLoginfo(String loginfo) {
+        this.loginfo = loginfo;
+    }
 
     public String getScmodel() {
         return scmodel;

+ 9 - 0
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/domain/cggl/EscalationInfoDTO.java

@@ -25,6 +25,7 @@ public class EscalationInfoDTO {
     private String lxr;
     private String lxdh;
     private String username;
+    private String loginfo;
 
     /**
      * 市级审查状态(审查状态  默认0待审(旗县)、1审查中(旗县)、2完结(旗县)、3退回(旗县)、4待审(市级)、5审查中(市级)、6完结(市级)、7退回(市级)
@@ -35,6 +36,14 @@ public class EscalationInfoDTO {
     //文件检查结果
     private String fileuploadremark;
 
+    public String getLoginfo() {
+        return loginfo;
+    }
+
+    public void setLoginfo(String loginfo) {
+        this.loginfo = loginfo;
+    }
+
     public String getInstid() {
         return instid;
     }

+ 107 - 0
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/domain/cggl/TCgglSjbzmlwjDto.java

@@ -0,0 +1,107 @@
+package com.onemap.apply.domain.cggl;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+//数据标准目录文件
+@TableName("t_cggl_sjbzmlwj")
+public class TCgglSjbzmlwjDto {
+    private String bsm;
+    private String mlmc;
+    private String sjml;
+    private String gml;
+    private String gzmc;
+    private String wjgz_bsm;
+    private Integer px;
+    private String bz;
+    private String sjbz_bsm;
+    private Integer lx;
+    private String ystj;
+
+    public String getBsm() {
+        return bsm;
+    }
+
+    public void setBsm(String bsm) {
+        this.bsm = bsm;
+    }
+
+    public String getMlmc() {
+        return mlmc;
+    }
+
+    public void setMlmc(String mlmc) {
+        this.mlmc = mlmc;
+    }
+
+    public String getSjml() {
+        return sjml;
+    }
+
+    public void setSjml(String sjml) {
+        this.sjml = sjml;
+    }
+
+    public String getGml() {
+        return gml;
+    }
+
+    public void setGml(String gml) {
+        this.gml = gml;
+    }
+
+    public String getGzmc() {
+        return gzmc;
+    }
+
+    public void setGzmc(String gzmc) {
+        this.gzmc = gzmc;
+    }
+
+    public String getWjgz_bsm() {
+        return wjgz_bsm;
+    }
+
+    public void setWjgz_bsm(String wjgz_bsm) {
+        this.wjgz_bsm = wjgz_bsm;
+    }
+
+    public Integer getPx() {
+        return px;
+    }
+
+    public void setPx(Integer px) {
+        this.px = px;
+    }
+
+    public String getBz() {
+        return bz;
+    }
+
+    public void setBz(String bz) {
+        this.bz = bz;
+    }
+
+    public String getSjbz_bsm() {
+        return sjbz_bsm;
+    }
+
+    public void setSjbz_bsm(String sjbz_bsm) {
+        this.sjbz_bsm = sjbz_bsm;
+    }
+
+    public Integer getLx() {
+        return lx;
+    }
+
+    public void setLx(Integer lx) {
+        this.lx = lx;
+    }
+
+    public String getYstj() {
+        return ystj;
+    }
+
+    public void setYstj(String ystj) {
+        this.ystj = ystj;
+    }
+}

+ 9 - 0
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/domain/sbjk/XzczghcgsbDTO.java

@@ -53,6 +53,15 @@ public class XzczghcgsbDTO {
     //流程主键(补正流程需要)对接自治区补正流程
     @TableField(value = "instid")
     private String instid;
+    private String bz;
+
+    public String getBz() {
+        return bz;
+    }
+
+    public void setBz(String bz) {
+        this.bz = bz;
+    }
 
     public String getInstid() {
         return instid;

+ 13 - 0
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/mapper/cggl/TCgglSjbzmlwjMapper.java

@@ -0,0 +1,13 @@
+package com.onemap.apply.mapper.cggl;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.onemap.apply.domain.cggl.TCgglSjbzmlwjDto;
+
+/**
+ * 数据层
+ *
+ * @author onemap
+ */
+public interface TCgglSjbzmlwjMapper extends BaseMapper<TCgglSjbzmlwjDto> {
+
+}

+ 166 - 21
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/service/impl/cggl/CgglServiceImpl.java

@@ -3,6 +3,8 @@ package com.onemap.apply.service.impl.cggl;
 import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.onemap.apply.domain.cggl.*;
 import com.onemap.apply.domain.sbjk.XzczghcgsbDTO;
 import com.onemap.apply.mapper.cggl.*;
@@ -43,9 +45,9 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.stream.Collectors;
 
-import static com.onemap.common.core.utils.StringUtils.FileSearch;
-import static com.onemap.common.core.utils.StringUtils.readTxt;
+import static com.onemap.common.core.utils.StringUtils.*;
 
 
 @Service
@@ -55,6 +57,8 @@ public class CgglServiceImpl implements CgglService {
     private RemoteFileService remoteFileService;
     @Resource
     private EscalationMapper escalationMapper;
+    @Autowired
+    private TCgglSjbzmlwjMapper tCgglSjbzmlwjMapper;
     @Resource
     private EscalationFileMapper escalationFileMapper;
     @Resource
@@ -196,33 +200,99 @@ public class CgglServiceImpl implements CgglService {
         escalationDTO.setUploadtime(new Date());
         escalationDTO.setId(id);
         escalationDTO.setUsername(SecurityUtils.getUsername());
-        String xzqdm = SecurityUtils.getLoginUserXzq(); //当前用户 点击获取市级审查结果
+//        String xzqdm = SecurityUtils.getLoginUserXzq(); //当前用户 点击获取市级审查结果
         escalationDTO.setSczt("4");
 //        if (xzqdm.length() == 4) //市级上传 则为市级待审
 //        {
 //            escalationDTO.setSczt("4");
 //        }
-        //TODO wanger 处理规划成果名称
-        QueryWrapper<EscalationFileDTO> filewrapper = new QueryWrapper<EscalationFileDTO>();
-        filewrapper.eq("id", escalationDTO.getFileid());
-        EscalationFileDTO fileDto = escalationFileMapper.selectOne(filewrapper);
-        if (fileDto != null) {
-            String filepath = fileDto.getUnzippath();
+        //TODO wanger 根据成果目录要求进行审查和记录
+        String plantype = escalationDTO.getPlantype();
+        if (!"6".equals(plantype)) {
+            QueryWrapper<EscalationFileDTO> filewrapper = new QueryWrapper<EscalationFileDTO>();
+            filewrapper.eq("id", escalationDTO.getFileid());
+            EscalationFileDTO fileDto = escalationFileMapper.selectOne(filewrapper);
+            File zipFile = new File(fileDto.getPath());
+            String fileRelName = getFileRelName(fileDto.getPath());
             //解析txt
-            String txtFilePath = FileSearch(filepath, "基本信息.txt");
-            if (StringUtils.isNotEmpty(txtFilePath)) {
-                System.out.println("txtFilePath===" + txtFilePath);
-                Map<String, String> txtMap = null;
-                try {
-                    txtMap = readTxt(txtFilePath, charset);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-                System.out.println("txtMap===" + txtMap);
-                if (StringUtils.isNotEmpty(txtMap.get("xmmc"))) {
-                    escalationDTO.setName(txtMap.get("xmmc"));
+            String txtFilePath = FileSearch(fileDto.getUnzippath(), "基本信息.txt");
+            if (StringUtils.isEmpty(txtFilePath)) {
+                deleteCurDirectory(zipFile.getParent());
+                escalationFileMapper.delete(filewrapper);
+                return RequestResult.error("1----成果包中必须包含“xxx基本信息.txt”文件,同时注意成果包中应包含“xxx规划成果”的根目录");
+            }
+            System.out.println("txtFilePath===" + txtFilePath);
+            Map<String, String> txtMap = null;
+            try {
+                txtMap = readTxt(txtFilePath, charset);
+            } catch (Exception e) {
+                e.printStackTrace();
+                deleteCurDirectory(zipFile.getParent());
+                escalationFileMapper.delete(filewrapper);
+                return RequestResult.error("2---解析规划文本txt错误,请检查格式!");
+            }
+            System.out.println("txtMap===" + txtMap);
+            String xmmc = txtMap.get("xmmc") != null ? txtMap.get("xmmc") : fileRelName;
+            String xzqdm = txtMap.get("行政区代码");
+            String xzqmc = txtMap.get("行政区名称");
+            String ghlxtext = txtMap.get("规划类型");
+            String ghcjtext = txtMap.get("规划层级");
+            String ghxstext = txtMap.get("成果形式");
+            //TODO wanger 对成果包进行校验
+            System.out.println("xmmc===" + xmmc);
+            System.out.println("ghlxtext===" + ghlxtext);
+            System.out.println("ghxstext===" + ghxstext);
+            System.out.println("ghcjtext===" + ghcjtext);
+            String sjbz_bsm = "";
+            ObjectMapper objectMapper = new ObjectMapper();
+            String txtjson = "";
+            try {
+                txtjson = objectMapper.writeValueAsString(txtMap);
+            } catch (JsonProcessingException e) {
+                e.printStackTrace();
+            }
+            sjbz_bsm = ghcjtext + "" + ghlxtext;
+            QueryWrapper<TCgglSjbzmlwjDto> sjbzwrapper = new QueryWrapper();
+            sjbzwrapper.eq("sjbz_bsm", sjbz_bsm);
+            sjbzwrapper.orderByAsc("px");
+            List<TCgglSjbzmlwjDto> sjbzlist = tCgglSjbzmlwjMapper.selectList(sjbzwrapper);
+            if (sjbzlist.size() == 0) {
+                deleteCurDirectory(zipFile.getParent());
+                escalationFileMapper.delete(filewrapper);
+                return RequestResult.error(String.format("3-----未授权的数据类型:%s,请联系管理人员!", sjbz_bsm));
+            }
+            //TODO wanger 处理那些根目录带有“_报审”等的数据项
+            if (fileRelName.contains("_")) {
+                System.out.println("Important contains _");
+                int count = fileRelName.split("_").length;
+                for (TCgglSjbzmlwjDto sjbzmlwjDto : sjbzlist) {
+                    String bz = sjbzmlwjDto.getBz();
+                    if (StringUtils.isNotEmpty(bz) && bz.contains("根目录")) {
+                        String rule = sjbzmlwjDto.getGzmc();
+                        int rulecount = rule.split("_").length;
+                        if (rulecount == count) {
+                            //相等就代表命名规则一样,不需要处理
+                        } else {
+                            sjbzmlwjDto.setGzmc(rule + "_" + fileRelName.split("_")[fileRelName.split("_").length - 1]);
+                        }
+                        System.out.println("Important handle end  _" + "----" + sjbzmlwjDto.getGzmc());
+                        break;
+                    }
                 }
             }
+            //记录缺失的文件列表  字符串类型
+            List<String> missfiles = new ArrayList<>();
+            missfiles = checkMustFiles(zipFile.getParent(), sjbzlist, "", missfiles, xzqdm, xzqmc);
+            if (missfiles.size() > 0) {
+                deleteCurDirectory(zipFile.getParent());
+                escalationFileMapper.delete(filewrapper);
+                return RequestResult.error(String.format("4------成果数据缺少以下目录或文件:%s", String.join("\n", missfiles)), missfiles);
+            }
+            if (StringUtils.isNotEmpty(xmmc)) {
+                escalationDTO.setName(xmmc);
+            }
+            fileDto.setRemark(txtjson);
+            escalationFileMapper.update(fileDto, filewrapper);
         }
         escalationMapper.insert(escalationDTO);
         addCgglRz(escalationDTO);
@@ -234,6 +304,63 @@ public class CgglServiceImpl implements CgglService {
         return RequestResult.success("保存成功!", id);
     }
 
+    /**
+     * 检查缺失的成果文件 递归调用  非常重要
+     *
+     * @param unzippath  文件路径
+     * @param sjbzlist   约定的数据标准检查项
+     * @param parentname 递归遍历用 父节点
+     * @param missfiles  缺失的文件列表
+     * @param xzqdm      行政区代码
+     * @param xzqmc      行政区名称
+     * @return List<String> missfiles  缺失的文件列表
+     */
+    public List<String> checkMustFiles(String unzippath, List<TCgglSjbzmlwjDto> sjbzlist, String parentname, List<String> missfiles, String xzqdm, String xzqmc) {
+        List<TCgglSjbzmlwjDto> filteredList = new ArrayList<>();
+        if (StringUtils.isNotEmpty(parentname)) {
+            filteredList = sjbzlist.stream()
+                    .filter(cur -> parentname.equals(cur.getSjml()))
+                    .collect(Collectors.toList());
+        } else {
+            filteredList = sjbzlist.stream()
+                    .filter(cur -> cur.getSjml() == null)
+                    .collect(Collectors.toList());
+        }
+        for (TCgglSjbzmlwjDto dto : filteredList) {
+            if ("O".equals(dto.getYstj()) || "C".equals(dto.getYstj())) {//跳过非必要审查项
+                continue;
+            }
+            Integer lx = dto.getLx();
+            String gzmc = dto.getGzmc();
+            String mlmc = dto.getMlmc();
+            String curpath = "";//当前的文件或文件夹路径地址
+            if (StringUtils.isNotEmpty(gzmc)) {
+                curpath = getAbFilepath(gzmc, xzqdm, xzqmc, unzippath);
+            } else {
+                curpath = unzippath + "\\" + mlmc;
+            }
+            if (curpath.contains("不符")) {
+                missfiles.add(curpath);
+                return missfiles;
+            }
+            File folder = new File(curpath);
+            if (lx == 0) {//文件夹
+                if (folder.exists() && folder.isDirectory()) {
+                    if (!curpath.endsWith(".gdb")) {
+                        checkMustFiles(curpath, sjbzlist, dto.getBsm(), missfiles, xzqdm, xzqmc);
+                    }
+                } else {
+                    missfiles.add(StringUtils.isNotEmpty(gzmc) ? gzmc : mlmc);
+                }
+            } else if (lx == 1) {//文件
+                if (!folder.exists()) {
+                    missfiles.add(StringUtils.isNotEmpty(gzmc) ? gzmc : mlmc);
+                }
+            }
+        }
+        return missfiles;
+    }
+
     @Override
     public List<EscalationInfoDTO> cgInfoList(String year, String xzqdm, String uploadstatus, String username, String cglevel, String plantype, String name) {
         //判断是否为市级用户查看旗县数据,需要过滤uploadstatus != '0'
@@ -286,6 +413,19 @@ public class CgglServiceImpl implements CgglService {
         return RequestResult.error("发起审查失败!");
     }
 
+    /**
+     * 更新上报错误日志
+     *
+     * @param validateEscalationDTO
+     * @param loginfo
+     */
+    public void updateLogInfo(EscalationDTO validateEscalationDTO, String loginfo) {
+        QueryWrapper<EscalationDTO> wrapper = new QueryWrapper<EscalationDTO>();
+        wrapper.eq("id", validateEscalationDTO.getId());
+        validateEscalationDTO.setLoginfo(loginfo);
+        escalationMapper.update(validateEscalationDTO, wrapper);
+    }
+
     @Override
     public RequestResult updateCgInfo(EscalationDTO escalationDTO) {
         QueryWrapper<EscalationDTO> wrapper = new QueryWrapper<EscalationDTO>();
@@ -295,6 +435,7 @@ public class CgglServiceImpl implements CgglService {
         // 情况二:1、查询数据库,该条数据是否是旗县级的,2、判断前端传参的上传状态是否为7
         EscalationDTO validateEscalationDTO = escalationMapper.selectOne(wrapper);
         setSbjd(escalationDTO.getId(), "0/0");
+        String loginfo = "";
         if (("2".equals(validateEscalationDTO.getCglevel()) && "1".equals(escalationDTO.getUploadstatus()))
                 || ("1".equals(validateEscalationDTO.getCglevel()) && "7".equals(escalationDTO.getUploadstatus()))) {
             //获取token授权
@@ -389,6 +530,7 @@ public class CgglServiceImpl implements CgglService {
                                                 dto.setId(escalationDTO.getId());
                                                 dto.setRemark(reStrFileUpload.toJSONString());
                                                 addCgglRz(dto);
+                                                updateLogInfo(validateEscalationDTO, reStrFileUpload.toJSONString());
                                                 return RequestResult.error("上传规划成果数据分片失败:" + reStrFileUpload.getString("msg") + ",分片数: " + i + "  !", false);
                                             } else {//记录分片个数及上传状态
                                                 setSbjd(escalationDTO.getId(), (i + 1) + "/" + totalSliceNum);
@@ -406,6 +548,7 @@ public class CgglServiceImpl implements CgglService {
                                         }
                                     }
                                 } else {
+                                    updateLogInfo(validateEscalationDTO, reStrMd5.toJSONString());
                                     System.out.println("上传规划成果数据接口-查询MD5值接口失败!");
                                     return RequestResult.error("上传规划成果数据接口-查询MD5值接口失败!", false);
                                 }
@@ -415,10 +558,12 @@ public class CgglServiceImpl implements CgglService {
                             }
                         }
                     } else {
+                        updateLogInfo(validateEscalationDTO, tokenJson.toJSONString());
                         System.out.println(tokenJson);
                         return RequestResult.error("厅系统token信息获取失败,请检查token获取地址、用户名、密码!", false);
                     }
                 } else {
+                    updateLogInfo(validateEscalationDTO, tokenJson.toJSONString());
                     System.out.println(tokenJson);
                     return RequestResult.error("厅系统token信息获取失败,请检查token获取地址、用户名、密码!", false);
                 }

+ 211 - 61
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/service/impl/sbjk/XzczghcgsbServiceImpl.java

@@ -2,12 +2,16 @@ package com.onemap.apply.service.impl.sbjk;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.onemap.apply.domain.cggl.ScmxDTO;
 import com.onemap.apply.domain.cggl.ScmxRecordDTO;
+import com.onemap.apply.domain.cggl.TCgglSjbzmlwjDto;
 import com.onemap.apply.domain.sbjk.XzczghcgsbDTO;
 import com.onemap.apply.mapper.cggl.EscalationMapper;
 import com.onemap.apply.mapper.cggl.ScmxMapper;
 import com.onemap.apply.mapper.cggl.ScmxRecordMapper;
+import com.onemap.apply.mapper.cggl.TCgglSjbzmlwjMapper;
 import com.onemap.apply.mapper.sbjk.XzczghcgsbMapper;
 import com.onemap.apply.service.sbjk.XzczghcgsbService;
 import com.onemap.apply.utils.Md5Utils;
@@ -30,9 +34,9 @@ import java.io.File;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.stream.Collectors;
 
-import static com.onemap.common.core.utils.StringUtils.FileSearch;
-import static com.onemap.common.core.utils.StringUtils.readTxt;
+import static com.onemap.common.core.utils.StringUtils.*;
 
 
 @Service
@@ -61,13 +65,16 @@ public class XzczghcgsbServiceImpl implements XzczghcgsbService {
     private String charset;
     @Autowired
     private RedisService redisService;
-
+    @Autowired
+    private TCgglSjbzmlwjMapper tCgglSjbzmlwjMapper;
     @Autowired
     private EscalationMapper escalationMapper;
     @Autowired
     private ScmxMapper scmxMapper;
     @Autowired
     private ScmxRecordMapper scmxRecordMapper;
+    //规划成果包基本信息存储
+    private Map<String, String> xmDetailMap = new HashMap<>();
 
 
     @Override
@@ -175,6 +182,7 @@ public class XzczghcgsbServiceImpl implements XzczghcgsbService {
             xzczghcgsbDTO.setCglevel("1");
             xzczghcgsbDTO.setUploadStatus(2);
         }
+        xzczghcgsbDTO.setBz(xmDetailMap.get(xzczghcgsbDTO.getFilePath()));
         return xzczghcgsbMapper.insert(xzczghcgsbDTO);
     }
 
@@ -245,85 +253,227 @@ public class XzczghcgsbServiceImpl implements XzczghcgsbService {
             //将村庄规划成果包进行解压,并校验是否符合要求
             String filetype = StringUtils.getFileKzmx(fileName);
             String relFileName = StringUtils.getFileRelName(fileName);
+            if (!relFileName.contains("_")) {
+                return AjaxResult.success("成果包名称必须包含完整成果/简易成果!", new ArrayList<>());
+            }
             String unzippath = fileDir;
             if (".zip".equals(filetype)) {
                 new UnPackageUtils().unPackZip(desc, unzippath);
             } else if (".rar".equals(filetype)) {
                 new UnPackageUtils().unPackRar(desc, unzippath);
             }
-            //校验文件包是否符合上传要求
-            //名称检查 完整成果、简易成果
-            String[] requirefilenameRule = requireFileName.split("_");
-            String filenameRule = "";
+            //TODO wanger 根据成果目录要求进行审查和记录
+            String folderPath = unzippath + File.separator + relFileName;
+            String txtFilePath = FileSearch(folderPath, "基本信息.txt");
+            if (StringUtils.isEmpty(txtFilePath)) {
+                deleteCurDirectory(desc.getParent());
+                return AjaxResult.error("1----成果包中必须包含“xxx基本信息.txt”文件,同时注意成果包中应包含“xxx规划成果”的根目录");
+            }
+            System.out.println("txtFilePath===" + txtFilePath);
+            Map<String, String> txtMap = null;
             try {
-                filenameRule = relFileName.split("_")[1];//完整成果、简易成果
+                txtMap = readTxt(txtFilePath, charset);
             } catch (Exception e) {
-                return AjaxResult.success("成果包名称必须包含完整成果/简易成果!", new ArrayList<>());
+                e.printStackTrace();
+                deleteCurDirectory(desc.getParent());
+                return AjaxResult.error("2---解析规划文本txt错误,请检查格式!");
             }
-            String xzqdm = StringUtils.getNumStr(relFileName);
-            String xzqmc = relFileName.replace(xzqdm, "").replace(requirefilenameRule[requirefilenameRule.length - 1] + "_" + filenameRule, "");
-            if (StringUtils.isEmpty(xzqdm) || StringUtils.isEmpty(xzqmc)) {
-                return AjaxResult.success("成果包名称要求为:" + requireFileName + ",请检查修改后重新上传!", new ArrayList<>());
+            System.out.println("txtMap===" + txtMap);
+            String xmmc = txtMap.get("xmmc") != null ? txtMap.get("xmmc") : relFileName;
+            String xzqdm = txtMap.get("行政区代码");
+            String xzqmc = txtMap.get("行政区名称");
+            String ghlxtext = txtMap.get("规划类型");
+            String ghcjtext = txtMap.get("规划层级");
+            String ghxstext = txtMap.get("成果形式");
+            //TODO wanger 对成果包进行校验
+            System.out.println("xmmc===" + xmmc);
+            System.out.println("ghlxtext===" + ghlxtext);
+            System.out.println("ghxstext===" + ghxstext);
+            System.out.println("ghcjtext===" + ghcjtext);
+            String sjbz_bsm = "";
+            ObjectMapper objectMapper = new ObjectMapper();
+            String txtjson = "";
+            try {
+                txtjson = objectMapper.writeValueAsString(txtMap);
+            } catch (JsonProcessingException e) {
+                e.printStackTrace();
             }
-            Map<String, String> params = new HashMap<>();
-            for (int i = 0; i < requirefilenameRule.length; i++) {
-                if (i == 0) {
-                    params.put(requirefilenameRule[i], xzqdm);
-                } else if (i == 1) {
-                    params.put(requirefilenameRule[i], xzqmc);
-                } else if (i == 2) {
-                    params.put(requirefilenameRule[i], requirefilenameRule[i]);
-                }
+            sjbz_bsm = ghlxtext + "" + ghxstext;
+            QueryWrapper<TCgglSjbzmlwjDto> sjbzwrapper = new QueryWrapper();
+            sjbzwrapper.eq("sjbz_bsm", sjbz_bsm);
+            sjbzwrapper.orderByAsc("px");
+            List<TCgglSjbzmlwjDto> sjbzlist = tCgglSjbzmlwjMapper.selectList(sjbzwrapper);
+            if (sjbzlist.size() == 0) {
+                deleteCurDirectory(desc.getParent());
+                return AjaxResult.error(String.format("3-----未授权的数据类型:%s,请联系管理人员!", sjbz_bsm));
             }
-            List<String> missfile = new ArrayList<>();
-            String[] requireRole = requireFileList.split(",");
-            for (int i = 0; i < requireRole.length; i++) {
-                String cur = requireRole[i].replaceAll("\n", "").replace(requirefileSplit, File.separator);
-                if (cur.contains("|")) {//判断是否为完整成果、简易成果单独设置的筛选条件,如果不是则跳过此筛选项
-                    String whereType = cur.split("\\|")[1];
-                    cur = cur.split("\\|")[0];
-                    if (!filenameRule.contains(whereType)) {
-                        continue;
-                    }
-                }
-                //文件名称占位符统一替换
-                for (String key : params.keySet()) {
-                    if (cur.contains(key)) {
-                        cur = cur.replaceAll(key, params.get(key));
+            //TODO wanger 处理那些根目录带有“_报审”等的数据项
+            if (relFileName.contains("_")) {
+                System.out.println("Important contains _");
+                int count = relFileName.split("_").length;
+                for (TCgglSjbzmlwjDto sjbzmlwjDto : sjbzlist) {
+                    String bz = sjbzmlwjDto.getBz();
+                    if (StringUtils.isNotEmpty(bz) && bz.contains("根目录")) {
+                        String rule = sjbzmlwjDto.getGzmc();
+                        int rulecount = rule.split("_").length;
+                        if (rulecount == count) {
+                            //相等就代表命名规则一样,不需要处理
+                        } else {
+                            sjbzmlwjDto.setGzmc(rule + "_" + relFileName.split("_")[relFileName.split("_").length - 1]);
+                        }
+                        System.out.println("Important handle end  _" + "----" + sjbzmlwjDto.getGzmc());
+                        break;
                     }
                 }
-                cur = cur.replaceAll("_", "");
-                String curFilePath = unzippath + File.separator + relFileName + "" + cur;
-                File c = new File(curFilePath);
-                if (c.exists()) {
+            }
+            //记录缺失的文件列表  字符串类型
+            List<String> missfiles = new ArrayList<>();
+            missfiles = checkMustFiles(unzippath, sjbzlist, "", missfiles, xzqdm, xzqmc);
+            if (missfiles.size() > 0) {
+                deleteCurDirectory(desc.getParent());
+                return AjaxResult.success("村庄规划成果上传失败:上传失败缺少以下文件或文件名称有误:", missfiles);
+            }
+            xmDetailMap.put(desc.getAbsolutePath(), txtjson);
+            return AjaxResult.success(desc.getAbsolutePath() + "******" + xmmc);
+            //校验文件包是否符合上传要求
+            //名称检查 完整成果、简易成果
+//            String[] requirefilenameRule = requireFileName.split("_");
+//            String filenameRule = "";
+//            try {
+//                filenameRule = relFileName.split("_")[1];//完整成果、简易成果
+//            } catch (Exception e) {
+//                return AjaxResult.success("成果包名称必须包含完整成果/简易成果!", new ArrayList<>());
+//            }
+//            String xzqdm = StringUtils.getNumStr(relFileName);
+//            String xzqmc = relFileName.replace(xzqdm, "").replace(requirefilenameRule[requirefilenameRule.length - 1] + "_" + filenameRule, "");
+//            if (StringUtils.isEmpty(xzqdm) || StringUtils.isEmpty(xzqmc)) {
+//                return AjaxResult.success("成果包名称要求为:" + requireFileName + ",请检查修改后重新上传!", new ArrayList<>());
+//            }
+//            Map<String, String> params = new HashMap<>();
+//            for (int i = 0; i < requirefilenameRule.length; i++) {
+//                if (i == 0) {
+//                    params.put(requirefilenameRule[i], xzqdm);
+//                } else if (i == 1) {
+//                    params.put(requirefilenameRule[i], xzqmc);
+//                } else if (i == 2) {
+//                    params.put(requirefilenameRule[i], requirefilenameRule[i]);
+//                }
+//            }
+//            List<String> missfile = new ArrayList<>();
+//            String[] requireRole = requireFileList.split(",");
+//            for (int i = 0; i < requireRole.length; i++) {
+//                String cur = requireRole[i].replaceAll("\n", "").replace(requirefileSplit, File.separator);
+//                if (cur.contains("|")) {//判断是否为完整成果、简易成果单独设置的筛选条件,如果不是则跳过此筛选项
+//                    String whereType = cur.split("\\|")[1];
+//                    cur = cur.split("\\|")[0];
+//                    if (!filenameRule.contains(whereType)) {
+//                        continue;
+//                    }
+//                }
+//                //文件名称占位符统一替换
+//                for (String key : params.keySet()) {
+//                    if (cur.contains(key)) {
+//                        cur = cur.replaceAll(key, params.get(key));
+//                    }
+//                }
+//                cur = cur.replaceAll("_", "");
+//                String curFilePath = unzippath + File.separator + relFileName + "" + cur;
+//                File c = new File(curFilePath);
+//                if (c.exists()) {
+//
+//                } else {
+//                    missfile.add(relFileName + cur);
+//                }
+//            }
+//            if (missfile.size() > 0) {
+//                return AjaxResult.success("村庄规划成果上传失败:上传失败缺少以下文件或文件名称有误:", missfile);
+//            } else {
+//                //TODO wanger 获取规划文本中的项目名称
+//                //解析txt
+//                String txtFilePath = FileSearch(unzippath + File.separator + relFileName, "基本信息.txt");
+//                if (StringUtils.isNotEmpty(txtFilePath)) {
+//                    System.out.println("txtFilePath===" + txtFilePath);
+//                    Map<String, String> txtMap = null;
+//                    try {
+//                        txtMap = readTxt(txtFilePath, charset);
+//                    } catch (Exception e) {
+//                    }
+//                    System.out.println("txtMap===" + txtMap);
+//                    if (StringUtils.isNotEmpty(txtMap.get("xmmc"))) {
+//                        return AjaxResult.success(desc.getAbsolutePath() + "******" + txtMap.get("xmmc"));
+//                    }
+//                }
+//                return AjaxResult.success(desc.getAbsolutePath() + "******" + relFileName);
+//            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            return AjaxResult.error(e.getMessage());
+        }
+    }
 
-                } else {
-                    missfile.add(relFileName + cur);
-                }
+    /**
+     * 检查缺失的成果文件 递归调用  非常重要
+     *
+     * @param unzippath  文件路径
+     * @param sjbzlist   约定的数据标准检查项
+     * @param parentname 递归遍历用 父节点
+     * @param missfiles  缺失的文件列表
+     * @param xzqdm      行政区代码
+     * @param xzqmc      行政区名称
+     * @return List<String> missfiles  缺失的文件列表
+     */
+    public List<String> checkMustFiles(String unzippath, List<TCgglSjbzmlwjDto> sjbzlist, String parentname, List<String> missfiles, String xzqdm, String xzqmc) {
+        List<TCgglSjbzmlwjDto> filteredList = new ArrayList<>();
+        if (StringUtils.isNotEmpty(parentname)) {
+            filteredList = sjbzlist.stream()
+                    .filter(cur -> parentname.equals(cur.getSjml()))
+                    .collect(Collectors.toList());
+        } else {
+            filteredList = sjbzlist.stream()
+                    .filter(cur -> cur.getSjml() == null)
+                    .collect(Collectors.toList());
+        }
+        for (TCgglSjbzmlwjDto dto : filteredList) {
+            if ("O".equals(dto.getYstj()) || "C".equals(dto.getYstj())) {//跳过非必要审查项
+                continue;
             }
-            if (missfile.size() > 0) {
-                return AjaxResult.success("村庄规划成果上传失败:上传失败缺少以下文件或文件名称有误:", missfile);
+            Integer lx = dto.getLx();
+            String gzmc = dto.getGzmc();
+            String mlmc = dto.getMlmc();
+            String curpath = "";//当前的文件或文件夹路径地址
+            if (StringUtils.isNotEmpty(gzmc)) {
+                curpath = getAbFilepath(gzmc, xzqdm, xzqmc, unzippath);
             } else {
-                //TODO wanger 获取规划文本中的项目名称
-                //解析txt
-                String txtFilePath = FileSearch(unzippath + File.separator + relFileName, "基本信息.txt");
-                if (StringUtils.isNotEmpty(txtFilePath)) {
-                    System.out.println("txtFilePath===" + txtFilePath);
-                    Map<String, String> txtMap = null;
-                    try {
-                        txtMap = readTxt(txtFilePath, charset);
-                    } catch (Exception e) {
-                    }
-                    System.out.println("txtMap===" + txtMap);
-                    if (StringUtils.isNotEmpty(txtMap.get("xmmc"))) {
-                        return AjaxResult.success(desc.getAbsolutePath() + "******" + txtMap.get("xmmc"));
+                curpath = unzippath + "\\" + mlmc;
+            }
+            if (curpath.contains("不符")) {
+                missfiles.add(curpath);
+                return missfiles;
+            }
+            File folder = new File(curpath);
+            if (lx == 0) {//文件夹
+                if (folder.exists() && folder.isDirectory()) {
+                    if (!curpath.endsWith(".gdb")) {
+                        checkMustFiles(curpath, sjbzlist, dto.getBsm(), missfiles, xzqdm, xzqmc);
                     }
+                } else {
+                    missfiles.add(StringUtils.isNotEmpty(gzmc) ? gzmc : mlmc);
+                }
+            } else if (lx == 1) {//文件
+                if (!folder.exists()) {
+                    missfiles.add(StringUtils.isNotEmpty(gzmc) ? gzmc : mlmc);
                 }
-                return AjaxResult.success(desc.getAbsolutePath() + "******" + relFileName);
             }
+        }
+        return missfiles;
+    }
+
+    private void deleteCurDirectory(String parent) {
+        try {
+            FileUtils.deleteDirectory(new File(parent));
         } catch (IOException e) {
             e.printStackTrace();
-            return AjaxResult.error(e.getMessage());
+            System.out.println(String.format("文件夹删除失败:%s", parent));
         }
     }