Browse Source

报批数据入库

chenendian 6 ngày trước cách đây
mục cha
commit
42dcdc4b2a

+ 40 - 2
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/third/DealExcelController.java

@@ -35,6 +35,32 @@ public class DealExcelController extends BaseController {
     DealExcelServiceImpl  dealExcelService;
 
 
+    /**
+     * 处理excel数据,批次报批数据
+     */
+    @GetMapping("excelDealBatchDate/{fileName}")
+    public R<Map<String, List<Map<String,String>>>> excelDealBatchDate(@PathVariable String fileName) {
+        try {
+            String uploadFile = Constant.IMPORT_EXCEL_DATA_FILE_PATH+"\\"+fileName;
+            Path filePath = Paths.get(uploadFile);
+            File file = filePath.toFile();
+            Map<String, List<Map<String, String>>> dataMap = readExcelWithMergedHeaders(file);
+             String res = dealExcelService.addBatchDateExcelDataToDb(dataMap);
+            logger.info("检查数据结果{}",res);
+            return R.ok(dataMap);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.fail(e.getMessage());
+        }
+    }
+
+
+
+
+
+
+
+
 
     /**
      * 处理excel数据(按合并列头分组读取)
@@ -46,8 +72,15 @@ public class DealExcelController extends BaseController {
             Path filePath = Paths.get(uploadFile);
             File file = filePath.toFile();
             Map<String, List<Map<String, String>>> dataMap = readExcelWithMergedHeaders(file);
-            String res = dealExcelService.addExcelDataToDb(dataMap);
-            logger.info("新增数据结果{}",res);
+
+            String res = dealExcelService.checkExcelDataToDb(dataMap);
+            logger.info("检查数据结果{}",res);
+
+
+
+
+//            String res = dealExcelService.addExcelDataToDb(dataMap);
+//            logger.info("新增数据结果{}",res);
 
 //            for (Map.Entry<String, List<Map<String, String>>> entry : dataMap.entrySet()) {
 //                logger.info("分类 [{}] 共 {} 条数据", entry.getKey(), entry.getValue().size());
@@ -55,6 +88,7 @@ public class DealExcelController extends BaseController {
 //                    logger.info("  第{}行: {}", i + 1, entry.getValue().get(i));
 //                }
 //            }
+
             return R.ok(dataMap);
         } catch (Exception e) {
             e.printStackTrace();
@@ -67,6 +101,10 @@ public class DealExcelController extends BaseController {
 
 
 
+
+
+
+
     /**
      * 按合并列头分组读取Excel
      * 第一行合并单元格作为分类key,第二行作为子列头,第三行起为数据

+ 363 - 20
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/third/impl/DealExcelServiceImpl.java

@@ -7,11 +7,13 @@ import com.siwei.apply.domain.YdbpData;
 import com.siwei.apply.domain.res.TdgyRes;
 import com.siwei.apply.domain.vo.ProjectVo;
 import com.siwei.apply.domain.vo.TdgyVo;
+import com.siwei.apply.domain.vo.YdbpDataVo;
 import com.siwei.apply.enums.AloneWorkFlowEnum;
 import com.siwei.apply.mapper.CadastreFileMapper;
 import com.siwei.apply.mapper.LandTypeMapper;
 import com.siwei.apply.mapper.ProjectWorkflowMapper;
 import com.siwei.apply.service.*;
+import com.siwei.common.core.constant.SecurityConstants;
 import com.siwei.common.core.domain.R;
 import com.siwei.common.core.utils.StringUtils;
 import com.siwei.spatial.api.RemoteSpatialFilesDbService;
@@ -19,8 +21,11 @@ import com.siwei.spatial.api.domain.file.TGeomDb;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.io.FileUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.io.File;
 import java.io.IOException;
@@ -32,6 +37,8 @@ import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.siwei.apply.common.Common.UserId;
+
 /**
  * excel 导入数据处理类
  */
@@ -41,6 +48,7 @@ public class DealExcelServiceImpl {
 
     private final String rootPath2019 = Constant.IMPORT_EXCEL_DATA_FILE_PATH + "\\数据治理批量导入示例数据\\赣江新区项目文件夹建立\\1.出让项目\\2019";
     private final String rootPath2020 = Constant.IMPORT_EXCEL_DATA_FILE_PATH + "\\数据治理批量导入示例数据\\赣江新区项目文件夹建立\\1.出让项目\\2020";
+    private final String rootPathZip = Constant.IMPORT_EXCEL_DATA_FILE_PATH + "\\zip";
     private final String targectDir = Constant.FILE_UPLOAD_PATH;
 
     private static List<LandType> allLandTypeList = new ArrayList<>();
@@ -67,7 +75,6 @@ public class DealExcelServiceImpl {
     @Autowired
     private YdbpDataService ydbpDataService;
 
-
     @Autowired
     private RemoteSpatialFilesDbService remoteSpatialFilesDbService;
 
@@ -75,6 +82,54 @@ public class DealExcelServiceImpl {
     private CadastreFileMapper cadastreFileMapper;
 
 
+    /**
+     * 报批数据导入
+     *
+     * @param dataMap
+     * @return
+     */
+    public String addBatchDateExcelDataToDb(Map<String, List<Map<String, String>>> dataMap) {
+        List<Map<String, String>> batchList = dataMap.get("新建(用地报批(批次)数据集成)");
+        for(Map<String, String> batch : batchList){
+            String projectName = batch.get("项目名称");
+            String reportStatus = batch.get("报征状态");
+            String batchApprovalNum = batch.get("批复文号");
+            String reportDate = batch.get("报批日期");
+            String approvalDate = batch.get("批复日期");
+
+            //todo 这里继续完善数据添加逻辑,目前先打印日志
+            log.info("项目名称:{},报征状态:{},批复文号:{},报批日期:{},批复日期:{}", projectName, reportStatus, batchApprovalNum, reportDate, approvalDate);
+
+            YdbpDataVo ydbpDataVo = new YdbpDataVo();
+            ydbpDataVo.setName(projectName+System.currentTimeMillis());
+            ydbpDataVo.setPfwh(batchApprovalNum);
+            ydbpDataVo.setBpDate(approvalDate);
+
+            String nodeId = ydbpDataService.add(ydbpDataVo);
+
+            String shpFileName = projectName+"shp.zip";
+           //数据治理文件名
+            if (StringUtils.isNotBlank(projectName)) {
+                Path filePath = Paths.get(rootPathZip + "\\" +shpFileName);
+                if (Files.exists(filePath) || !Files.isDirectory(filePath)) {
+                    String fullFilePath = copyFileToDirectory(rootPathZip + "\\", targectDir ,  shpFileName);
+                    R<TGeomDb> saveGeomRes = remoteSpatialFilesDbService.readShp(shpFileName,fullFilePath,"excel", SecurityConstants.INNER);
+                    TGeomDb tGeomDb = saveGeomRes.getData();
+                    log.info("远程调用geom保存,返回结果:{}", tGeomDb);
+                    //这里保存geom映射关系
+                    nodeLandService.createNodeLand(nodeId, tGeomDb.getId());
+                }
+            }
+        }
+        log.info("------------"+batchList);
+        return "successs";
+    }
+
+
+
+
+
+
     /**
      * 检查excel数据到数据库
      *
@@ -83,34 +138,316 @@ public class DealExcelServiceImpl {
      */
     public String checkExcelDataToDb(Map<String, List<Map<String, String>>> dataMap) {
         List<Map<String, String>> xmList = dataMap.get("项目信息");
-        int i = 0;
+        int i = 4;
         for (Map<String, String> xm : xmList) {
-            ProjectVo projectVo = new ProjectVo();
-            String projectType = xm.get("项目类型(必填)");
 
-            if (projectType.equalsIgnoreCase("单独选址")) {
-                projectVo.setProjectType(1);
-            } else if (projectType.equalsIgnoreCase("批次报批")) {
-                projectVo.setProjectType(2);
-            } else {
-                writeToLog("xm_err.log", "行(" + i + ")项目类型不合法,项目类型只能是单独选址或者批次报批");
+            String projectName = xm.get("项目名称");
+            if (StringUtils.isBlank(projectName)) {
+                writeToLog("xm_err.log", "excel行(" + i + ")项目名称为空,是否需要默认设置" );
+            }
+
+            String projectType = xm.get("项目类型(必填)");
+            if (!(projectType.equalsIgnoreCase("单独选址") || projectType.equalsIgnoreCase("批次报批"))) {
+                writeToLog("xm_err.log", "excel行(" + i + ")项目类型不合法,项目类型只能是单独选址或者批次报批");
             }
-        }
 
 
+            i++;
+        }
+
         // -----------------第一部分增加项目结束-------------------------------
+
+        // -----------------第二部分校验(土地供应)环节数据开始-------------------------------
         List<Map<String, String>> tdgyList = dataMap.get("土地供应");
+        i = 4;
         for (Map<String, String> tdgyExcel : tdgyList) {
             String tdyt = tdgyExcel.get("土地用途");
             String tdytCode = getTdytCodeByName(tdyt);
             if (StringUtils.isBlank(tdytCode)) {
-                writeToLog("tdgy_err.log", "行(" + i + ")项目类型不合法,项目类型只能是单独选址或者批次报批");
+                writeToLog("tdgy_err.log", "excel行(" + i + ")土地用途不合法,没有找到对应的code:" + tdyt);
+            }
+            String hetongCode = tdgyExcel.get("用地划拨/出让方案批复文号");
+            if (StringUtils.isBlank(hetongCode)) {
+                writeToLog("tdgy_err.log", "excel行(" + i + ")(用地划拨/出让方案批复文号)不能为空");
             }
+            i++;
         }
+
+
+        /*   ------------------参考json数据结构-------------------------------
+            {
+            "阶段": [
+                {
+                    "方式": "划拨",
+                    "文件名序号": "2017-00195",
+                    "提交项目文件名": "桑海综合性住宅小区",
+                    "数据治理文件名": "2017-00195-桑海综合性住宅小区",
+                    "规划号": "SH/J07-03"
+                }
+            ],
+            "项目信息": [
+                {
+                    "项目名称": "桑海综合性住宅小区",
+                    "项目代码": "",
+                    "建设单位": "",
+                    "项目类型(必填)": "",
+                    "第一位特征码": "",
+                    "第二位特征码": ""
+                }
+            ],
+            "用地预审与选址": [
+                {
+                    "建设地点": "",
+                    "拟用地面积(源)": "",
+                    "拟用地面积": "",
+                    "项目规模及内容": "",
+                    "项目建设依据": "",
+                    "证书文号": "",
+                    "发证日期": "",
+                    "面积单位": "",
+                    "是否完成征转": ""
+                }
+            ],
+            "规划条件与用地红线出具": [
+                {
+                    "地块编码": "",
+                    "用地面积": "",
+                    "用地性质": "",
+                    "用地位置": "",
+                    "出具编号": "",
+                    "出具日期": "",
+                    "出具依据": "",
+                    "面积单位": ""
+                }
+            ],
+            "用地报批": [
+                {
+                    "土地用途": "",
+                    "用地面积": "",
+                    "征收面积": "",
+                    "是否完成征转": "",
+                    "报批日期": "",
+                    "批复文号(必填)": "",
+                    "批复日期(必填)": "",
+                    "用地面积单位": "",
+                    "征收面积单位": ""
+                }
+            ],
+            "土地供应": [
+                {
+                    "土地受让人": "江西桑海经济开发区房产管理办公室",
+                    "土地用途(源版)": "居住用地(保障性住房)",
+                    "土地用途": "居住用地",
+                    "建设位置": "赣江新区经开组团桑海开发区时珍北大道以北、樟坪路以东、济生北路以西",
+                    "供地面积(平方米)(源数据)": "47332.4",
+                    "供地面积": "47332.4",
+                    "面积单位": "平方米",
+                    "供地方式": "划拨",
+                    "是否完成征转": "是",
+                    "用地划拨/出让方案批复文号": "赣新管办字(2017〕12号",
+                    "土地权属来源": "赣新管办字(2017〕12号",
+                    "划拨决定书/出让合同编号(必填)": "H36201701030017",
+                    "划拨决定书/出让合同日期": "2017年8月18日",
+                    "供地单位": "赣江新区国土资源局"
+                }
+            ],
+            "国有建设用地使用权及房屋所有权首次登记(会有多个不动产权证)(界面新参数)": [
+                {
+                    "业务号(必填)": "",
+                    "告知单盖章时间": "",
+                    "开发单位": "",
+                    "不动产情况": "",
+                    "建筑面积": "",
+                    "建筑面积单位": "",
+                    "套内面积": "",
+                    "套内面积单位": "",
+                    "分摊面积": "",
+                    "分摊面积单位": "",
+                    "是否上链": "",
+                    "备注(数据清单)": ""
+                }
+            ],
+            "新建(用地报批(批次)数据集成)": [
+                {
+                    "项目名称": "",
+                    "用地面积": "",
+                    "用地面积单位": "",
+                    "征收面积": "",
+                    "征收面积单位": "",
+                    "报征状态": "",
+                    "批复文号": "",
+                    "报批日期": "",
+                    "批复日期": ""
+                }
+            ],
+            "国有建设用地使用权首次登记": [
+                {
+                    "权利人": "",
+                    "共有情况": "",
+                    "坐落": "",
+                    "权利类型": "",
+                    "权利性质": "",
+                    "土地用途": "",
+                    "面积": "",
+                    "面积单位": "",
+                    "不动产单元号(必填)": "",
+                    "登记机构": "",
+                    "登记日期": "",
+                    "不动产证号(必填)": ""
+                }
+            ],
+            "建设用地规划许可": [
+                {
+                    "用地单位": "",
+                    "用地位置": "",
+                    "用地面积": "",
+                    "土地用途": "",
+                    "土地获取方式": "",
+                    "批准用地机关": "",
+                    "批准用地文号": "",
+                    "建设规模": "",
+                    "证书编号(必填)": "",
+                    "发证机关": "",
+                    "发证日期(必填)": ""
+                }
+            ],
+            "建设工程规划许可": [
+                {
+                    "用地单位": "",
+                    "期数": "",
+                    "用地位置": "",
+                    "建设规模": "",
+                    "证书编号(必填)": "",
+                    "发证机关": "",
+                    "发证日期(必填)": ""
+                }
+            ],
+            "土地核验与规划核实": [
+                {
+                    "用地位置": "",
+                    "合格证号(必填)": "",
+                    "发证机关": "",
+                    "发证日期(必填)": "",
+                    "建设单位": "",
+                    "关联建设工程规划许可号": ""
+                }
+            ],
+            "国有建设用地使用权首次登记(会有多个不动产权证)(旧参数)": [
+                {
+                    "权利人": "",
+                    "共有情况": "",
+                    "坐落": "",
+                    "权利类型": "",
+                    "权利性质": "",
+                    "面积": "",
+                    "不动产单元号": "",
+                    "不动产证号": "",
+                    "登记机构": "",
+                    "登记日期": "",
+                    "面积单位": "",
+                    "土地用途": ""
+                }
+            ]
+        }
+
+
+
+         ------------------项目类型为:单独选址-------项目的环节----------------------------------
+                t_ydysyxz	用地预审与选址
+                t_ydbp	用地报批
+                t_tdgy	土地供应
+                t_gyjsydscdj	国有建设用地使用权首次登记
+                t_jsydghxk	建设用地规划许可
+                t_jsgcghxk	建设工程规划许可
+                t_tdhyhs	土地核验与规划核实
+                t_gyjsydjfwscdj	国有建设用地使用权及房屋所有权首次登记
+
+                ----------------项目类型为:批次报批---的环节-------------------------------------
+                t_tdgy	土地供应
+                t_gyjsydscdj	国有建设用地使用权首次登记
+                t_jsydghxk	建设用地规划许可
+                t_jsgcghxk	建设工程规划许可
+                t_tdhyhs	土地核验与规划核实
+                t_gyjsydjfwscdj	国有建设用地使用权及房屋所有权首次登记
+                t_tjyydhx	规划条件与用地红线出具
+
+
+                    -----------各个环节的必传字段见下表----------------------------
+
+                    土地供应:(出让/划拨合同编号)
+
+                    国有建设用地使用权首次登记 (不动产单元号,不动产证号)
+
+                    建设用地规划许可  (证书编号,发证日期)
+
+                    建设工程规划许可 (证书编号,发证日期)
+
+                    土地核验与规划核实 (合格证号,发证日期)
+
+                    国有建设用地使用权及房屋所有权首次登记 (业务号)
+
+                    用地报批 (批复文号,批复日期)
+
+
+         */
+
+
+        //todo 读取excel中的数据然后做校验,excel字段对应,见上面参考json,这里继续完善其他部分的校验逻辑,按照上面两部分的示例进行编写,注意日志文件的命名和日志内容的准确性,方便后续排查问题
+        // 要求一,如果当前环节,如:String tdyt = tdgyExcel.get("土地用途"); 获取的所有字段都是空,直接跳过,不写日志
+        // 要求二,如果当前环节存在类似(供地面积,用地面积) 需要有(面积单位字段) ,用地面积的值都是数字,那么面积单位不能为空,并且需要校验面积单位是否合法(亩,公顷,平方米),如果不合法,记录日志
+        // 要求三,各个环节必填字段都没有满足要求的,记录日志,日志内容包括:excel行数,字段名称,字段值,错误描述等信息,方便后续排查问题
+        // 要求四,项目类型为空则直接跳过此数据
+        // 要求五, 若某个环节所有字段为空,或者必填字段不满足要求或为空,记录日志后,继续校验下一个环节,把当前环节跳过处理。
+
+        // -----------------第二部分校验(国有建设用地使用权首次登记)环节数据开始-------------------------------
+        //excel 字段:
+        //todo  需要校验 (不动产单元号,不动产证号) 字段不能为空
+
+
+        // -----------------第三部分校验(建设用地规划许可)环节数据开始-------------------------------
+            //todo  需要校验 (证书编号,发证日期) 字段不能为空,并且日期满足(2019年9月4日) 格式
+
+
+
+
+        // -----------------第四部分校验(建设工程规划许可)环节数据开始-------------------------------
+        //todo  需要校验 (证书编号,发证日期) 字段不能为空,并且日期满足(2019年9月4日) 格式
+
+
+
+        // -----------------第五部分校验(土地核验与规划核实)环节数据开始-------------------------------
+        //todo  需要校验 (合格证号,发证日期) 字段不能为空,并且日期满足(2019年9月4日) 格式
+
+
+        // -----------------第六部分校验(国有建设用地使用权及房屋所有权首次登记)环节数据开始-------------------------------
+        //todo  需要校验 (业务号) 字段不能为空
+
+
+
+        // -----------------第六部分校验(用地报批)环节数据开始-------------------------------
+        //todo  需要校验 (批复文号,批复日期)字段不能为空  ,并且日期满足(2019年9月4日) 格式
+
+
+
+        // -----------------第七部分校验(用地预审与选址)环节数据开始-------------------------------
+        //todo  需要校验 (证书文号,发证日期)字段不能为空  ,并且日期满足(2019年9月4日) 格式
+
+        // -----------------第七部分校验(规划条件与用地红线出具)环节数据开始-------------------------------
+        //todo  需要校验 (出具编号,出具日期)字段不能为空  ,并且日期满足(2019年9月4日) 格式
+
+
+
+
+
         return "successs";
     }
 
 
+
+
+
+
+
     /**
      * 添加excel数据到数据库
      *
@@ -214,7 +551,7 @@ public class DealExcelServiceImpl {
             Map<String, String> jdMap = jdList.get(i);
             String projectFileName = jdMap.get("数据治理文件名");
             String nodeFileName = "03土地供应阶段";
-            dealCurrentNodeAttachment(projectId,id,projectFileName,nodeFileName);
+            dealCurrentNodeAttachment(projectId, id, projectFileName, nodeFileName);
 
 
             //矢量数据处理  -- 数据治理文件名
@@ -232,9 +569,8 @@ public class DealExcelServiceImpl {
     }
 
 
-
     //附件数据处理  -- 数据治理文件名
-    public void dealCurrentNodeAttachment(String projectId, String nodeId,String projectFileName,String nodeFileName) {
+    public void dealCurrentNodeAttachment(String projectId, String nodeId, String projectFileName, String nodeFileName) {
         if (StringUtils.isBlank(projectFileName)) {
             log.info("数据治理文件名称--附件材料:{}", projectFileName);
             return;
@@ -262,10 +598,6 @@ public class DealExcelServiceImpl {
     }
 
 
-
-
-
-
     //矢量数据处理  -- 数据治理文件名
     public void dealCurrentNodeGeom(String dzjgh, String nodeId) {
         if (StringUtils.isBlank(dzjgh)) {
@@ -299,6 +631,13 @@ public class DealExcelServiceImpl {
     }
 
 
+    /**
+     * 把FileName 文件移动到targetDirectoryPath目录下,并且返回移动后的全路径,前提是sourceFilePath目录下存在FileName文件
+     * @param sourceFilePath
+     * @param targetDirectoryPath
+     * @param FileName
+     * @return
+     */
     public static String copyFileToDirectory(String sourceFilePath, String targetDirectoryPath, String FileName) {
         String fullTargetFilePath = "";
         try {
@@ -309,7 +648,11 @@ public class DealExcelServiceImpl {
                 targetDir.mkdirs();
             }
 
-            FileUtils.copyDirectoryToDirectory(sourceDir, targetDir);
+            if(sourceDir.isDirectory()){
+                FileUtils.copyDirectoryToDirectory(sourceDir, targetDir);
+            }else {
+                FileUtils.copyFileToDirectory(sourceDir, targetDir);
+            }
             fullTargetFilePath = Paths.get(targetDirectoryPath, FileName).toString();
 
         } catch (IOException e) {

+ 1 - 1
siwei-modules/siwei-spatial/src/main/java/com/siwei/spatial/utils/FileUtils.java

@@ -18,7 +18,7 @@ public class FileUtils {
      */
     public static void unzipAutoCharset(String zipFilePath, String destDir) throws IOException {
         try {
-            unzipWithCharset(zipFilePath, destDir, Charset.forName("UTF-8"));
+            unzipWithCharset(zipFilePath, destDir, Charset.forName("GBK"));
         } catch (ZipException e) { // 捕获ZIP结构或编码问题
             unzipWithCharset(zipFilePath, destDir, Charset.forName("GBK"));
         }