Преглед изворни кода

规划成果包目录标准以及基本信息存储展示

wanger пре 3 месеци
родитељ
комит
354e9ea9cb

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

@@ -3,8 +3,11 @@ package com.onemap.common.core.utils;
 import java.io.*;
 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.apache.commons.lang3.RandomStringUtils;
 import org.springframework.util.AntPathMatcher;
 import com.onemap.common.core.constant.Constants;
@@ -734,8 +737,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) {
@@ -761,4 +763,135 @@ 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 - 2
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/controller/cggl/CgglController.java

@@ -83,9 +83,9 @@ public class CgglController extends BaseController {
      * @return
      */
     @GetMapping("/cgInfoList")
-    public RecordTableDataInfo cgInfoList(Integer limit, Integer page, String year, String xzqdm, String uploadstatus, String username, String cglevel, String plantype) {
+    public RecordTableDataInfo cgInfoList(Integer limit, Integer page, String year, String xzqdm, String uploadstatus, String username, String cglevel, String plantype, String name) {
         startRecordPage();
-        List<EscalationInfoDTO> list = cgglService.cgInfoList(year, xzqdm, uploadstatus, username, cglevel, plantype);
+        List<EscalationInfoDTO> list = cgglService.cgInfoList(year, xzqdm, uploadstatus, username, cglevel, plantype, name);
         return getRecordDataTable(list);
     }
 

+ 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;

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

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

+ 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;

+ 2 - 2
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/mapper/cggl/EscalationMapper.java

@@ -44,7 +44,7 @@ public interface EscalationMapper extends BaseMapper<EscalationDTO> {
     //getqxscinfo
     String getqxscinfo(@Param("gcid") String gcid);
 
-    List<EscalationInfoDTO> selectInfoList(@Param("year") String year, @Param("xzqdm") String xzqdm, @Param("uploadstatus") String uploadstatus, @Param("username") String username, @Param("cglevel") String cglevel, @Param("plantype") String plantype, @Param("userlevel") String userlevel);
+    List<EscalationInfoDTO> selectInfoList(@Param("year") String year, @Param("xzqdm") String xzqdm, @Param("uploadstatus") String uploadstatus, @Param("username") String username, @Param("cglevel") String cglevel, @Param("plantype") String plantype, @Param("userlevel") String userlevel, @Param("name") String name);
 
     String selectWaitCheck(String s);
 
@@ -64,7 +64,7 @@ public interface EscalationMapper extends BaseMapper<EscalationDTO> {
 
     List<String> getInstIds(String param);
 
-    void insertScx(@Param("id")String id, @Param("taskid")String taskid);
+    void insertScx(@Param("id") String id, @Param("taskid") String taskid);
 
     void updateCgScModel(@Param("cgid") String cgid, @Param("scmodel") String scmodel);
 

+ 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> {
+
+}

+ 1 - 1
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/service/cggl/CgglService.java

@@ -14,7 +14,7 @@ public interface CgglService {
 
     RequestResult uploadCgInfo(EscalationDTO escalationDTO);
 
-    List<EscalationInfoDTO> cgInfoList(String year, String xzqdm, String uploadstatus, String username, String cglevel, String plantype);
+    List<EscalationInfoDTO> cgInfoList(String year, String xzqdm, String uploadstatus, String username, String cglevel, String plantype, String name);
 
     RequestResult updateCgInfo(EscalationDTO escalationDTO);
 

+ 168 - 23
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/service/impl/cggl/CgglServiceImpl.java

@@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSONArray;
 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.*;
@@ -47,9 +49,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
@@ -71,6 +73,8 @@ public class CgglServiceImpl implements CgglService {
     private ScmxRecordMapper scmxRecordMapper;
     @Autowired
     private XzczghcgsbMapper xzczghcgsbMapper;
+    @Autowired
+    private TCgglSjbzmlwjMapper tCgglSjbzmlwjMapper;
 
     @Value("${Cggl.temp}")
     private static String platform;
@@ -151,7 +155,7 @@ public class CgglServiceImpl implements CgglService {
             //TODO wanger 总体规划跳过机器审查,原始赋值是9(待审查),现在改为1(审查结束)
             curdto.setStatus("9");
             curdto.setPath(temppath);
-            curdto.setUnzippath(unzippath + "/" + StringUtils.getFileRelName(filename));
+            curdto.setUnzippath(unzippath + "/" + getFileRelName(filename));
             escalationFileMapper.update(curdto, wrapper);
         } catch (Exception r) {
             r.printStackTrace();
@@ -209,27 +213,93 @@ public class CgglServiceImpl implements CgglService {
         {
             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;
+            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);
@@ -244,6 +314,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 RequestResult startcgsc(String scmodel, String jqscmodel, String cgid) {
         try {
@@ -295,16 +422,29 @@ public class CgglServiceImpl implements CgglService {
     }
 
     @Override
-    public List<EscalationInfoDTO> cgInfoList(String year, String xzqdm, String uploadstatus, String username, String cglevel, String plantype) {
+    public List<EscalationInfoDTO> cgInfoList(String year, String xzqdm, String uploadstatus, String username, String cglevel, String plantype, String name) {
         //判断是否为市级用户查看旗县数据,需要过滤uploadstatus != '0'
         String userlevel = "0";
         if (SecurityUtils.getLoginUserXzq().length() == 4 && !"1".equals(cglevel)) {
             userlevel = "1";
         }
-        List<EscalationInfoDTO> res = escalationMapper.selectInfoList(year, xzqdm, uploadstatus, username, cglevel, plantype, userlevel);
+        List<EscalationInfoDTO> res = escalationMapper.selectInfoList(year, xzqdm, uploadstatus, username, cglevel, plantype, userlevel, name);
         return res;
     }
 
+    /**
+     * 更新上报错误日志
+     *
+     * @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>();
@@ -416,6 +556,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);
@@ -442,11 +583,13 @@ public class CgglServiceImpl implements CgglService {
                                                     validateEscalationDTO.setInstid(validateEscalationDTO.getInstid() + "#");
                                                 }
                                             } else {
+                                                updateLogInfo(validateEscalationDTO, mergeResult.toJSONString());
                                                 return RequestResult.error("上传规划成果数据接口-合包失败!" + (mergeResult == null ? "" : mergeResult.getString("message")), false);
                                             }
                                         }
                                     }
                                 } else {
+                                    updateLogInfo(validateEscalationDTO, reStrMd5.toJSONString());
                                     System.out.println("上传规划成果数据接口-查询MD5值接口失败!");
                                     return RequestResult.error("上传规划成果数据接口-查询MD5值接口失败!", false);
                                 }
@@ -456,10 +599,12 @@ public class CgglServiceImpl implements CgglService {
                             }
                         }
                     } else {
+                        updateLogInfo(validateEscalationDTO, tokenJson.toJSONString());
                         System.out.println(tokenJson);
                         return RequestResult.error("市级系统token信息获取失败,请检查token获取地址、appid!", false);
                     }
                 } else {
+                    updateLogInfo(validateEscalationDTO, tokenJson.toJSONString());
                     System.out.println(tokenJson);
                     return RequestResult.error("市级系统token信息获取失败,请检查token获取地址、appid!", false);
                 }

+ 134 - 71
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/service/impl/sbjk/XzczghcgsbServiceImpl.java

@@ -3,12 +3,16 @@ package com.onemap.apply.service.impl.sbjk;
 import com.alibaba.fastjson.JSONArray;
 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
@@ -71,6 +75,10 @@ public class XzczghcgsbServiceImpl implements XzczghcgsbService {
     private ScmxMapper scmxMapper;
     @Autowired
     private ScmxRecordMapper scmxRecordMapper;
+    @Autowired
+    private TCgglSjbzmlwjMapper tCgglSjbzmlwjMapper;
+    //规划成果包基本信息存储
+    private Map<String, String> xmDetailMap = new HashMap<>();
 
     @Override
     public RequestResult startcgsc(String scmodel, String jqscmodel, String cgid) {
@@ -130,15 +138,6 @@ public class XzczghcgsbServiceImpl implements XzczghcgsbService {
     @Override
     public List<XzczghcgsbDTO> selectList(XzczghcgsbDTO xzczghcgsbDTO) {
         QueryWrapper<XzczghcgsbDTO> giswrapper = new QueryWrapper<>();
-//        if (StringUtils.isNotEmpty(xzczghcgsbDTO.getCounty())) {
-//            giswrapper.like("county", xzczghcgsbDTO.getCounty());
-//        }
-//        if (StringUtils.isNotEmpty(xzczghcgsbDTO.getTown())) {
-//            giswrapper.like("town", xzczghcgsbDTO.getTown());
-//        }
-//        if (StringUtils.isNotEmpty(xzczghcgsbDTO.getVillage())) {
-//            giswrapper.like("village", xzczghcgsbDTO.getVillage());
-//        }
         if (StringUtils.isNotEmpty(xzczghcgsbDTO.getXzqCode())) {
             giswrapper.like("xzq_code", xzczghcgsbDTO.getXzqCode());
         }
@@ -174,6 +173,7 @@ public class XzczghcgsbServiceImpl implements XzczghcgsbService {
 //            xzczghcgsbDTO.setStatus("12");
 //            xzczghcgsbDTO.setCglevel("1");
 //        }
+        xzczghcgsbDTO.setBz(xmDetailMap.get(xzczghcgsbDTO.getFilePath()));
         return xzczghcgsbMapper.insert(xzczghcgsbDTO);
     }
 
@@ -244,86 +244,149 @@ 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);
+        } 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);
             }
-        } catch (IOException e) {
-            e.printStackTrace();
-            return AjaxResult.error(e.getMessage());
         }
+        return missfiles;
     }
 
     /**

+ 4 - 1
onemap-modules/onemap-apply/src/main/resources/mapper/oracle/cggl/EscalationMapper.xml

@@ -405,7 +405,7 @@
             and t.year like #{year}||'%'
         </if>
         <if test="xzqdm != null and xzqdm != ''">
-            and t.xzqdm = #{xzqdm}
+            and t.xzqdm like '%'||#{xzqdm}||'%'
         </if>
         <choose>
             <when test="uploadstatus != null and uploadstatus != ''">
@@ -427,6 +427,9 @@
         <if test="plantype != null and plantype != ''">
             and t.plantype = #{plantype}
         </if>
+        <if test="name != null and name != ''">
+            and t.name like '%'||#{name}||'%'
+        </if>
         order by t.uploadtime desc
     </select>
 

+ 4 - 1
onemap-modules/onemap-apply/src/main/resources/mapper/postgresql/cggl/EscalationMapper.xml

@@ -435,7 +435,7 @@
             and t.year like #{year}||'%'
         </if>
         <if test="xzqdm != null and xzqdm != ''">
-            and t.xzqdm = #{xzqdm}
+            and t.xzqdm like '%'||#{xzqdm}||'%'
         </if>
         <choose>
             <when test="uploadstatus != null and uploadstatus != ''">
@@ -457,6 +457,9 @@
         <if test="plantype != null and plantype != ''">
             and t.plantype = #{plantype}
         </if>
+        <if test="name != null and name != ''">
+            and t.name like '%'||#{name}||'%'
+        </if>
         order by t.uploadtime desc
     </select>