Jelajahi Sumber

预赋码逻辑修改,根据最大序列号和库表中序列号综合计算

chenendian 1 Minggu lalu
induk
melakukan
509b7ca6ab

+ 3 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/mapper/NodeLandMapper.java

@@ -64,5 +64,8 @@ public interface NodeLandMapper {
     Map<String, String> selectDjzqContainsNodeList(@Param("detailsId")String detailsId);
 
 
+    Map<String, String> selectNodeGeomContains(@Param("nodeIdList") List<String> nodeIdList,@Param("detailsId")String detailsId);
+
+
 
 }

+ 1 - 1
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/mapper/ProjectImmobileCodeMapper.java

@@ -20,7 +20,7 @@ public interface ProjectImmobileCodeMapper {
     /**
      * 根据项目ID查询(多条)
      */
-    List<ProjectImmobileCode> selectByProjectId(String projectId);
+    List<ProjectImmobileCode> selectByProjectId(String projectId,String validFlag);
 
     /**
      * 根据序号查询(只返回一条)

+ 95 - 70
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/impl/ProjectImpl.java

@@ -1936,39 +1936,30 @@ public class ProjectImpl implements ProjectService {
     }
 
 
-
-
+    /**
+     *
+     *         1.每一个地块都需要进行赋码操作,并且获取不动产最大序列值。
+     *         3.保证异常情况下,预付码不会重复。
+     *         5.简单取两者中最大序列号,进行+1赋码
+     * @param nodeId
+     * @param projectId
+     * @param geomDbId
+     * @param validFlag
+     * @throws RuntimeException
+     */
     @Override
     public void addPreAssignCode(String nodeId,String projectId,String geomDbId,Integer validFlag) throws RuntimeException {
-        //这里进行预赋码逻辑,先查询是否已经存在预赋码,如果存在则不进行生成
-        List<ProjectImmobileCode> existsList = projectImmobileCodeMapper.selectByProjectId(projectId);
-        if(CollectionUtils.isNotEmpty(existsList)){
-            String existsPreAssignCode  = existsList.get(0).getPreAssignCode();
-            if(StringUtils.isNotBlank(existsPreAssignCode)){
-                return;
-            }
-        }
-
-        /*
-        1.每一个地块都需要进行请求,并且获取最大值。
-        2.生成预赋码逻辑在这里。
-        3.保证异常情况下,预付码不会重复。
-        5.简单取最大序列号,进行+1赋码
-        */
         String preAssignCode = "";
         String sequenceNumber = "";
-
-        //这里需要先进行图斑等值校验
-        //这里校验当前地块是否已经存在当前项目中,如果存在共用一个预赋码,如果不存在则生成新的预赋码
-//        1.获取当前nodeId
-//        2.查找当前nodeId对应的gemoId
-//        3.用gemoId+projectId 查找如果找到,直接使用当前的预赋码,如果没有找到,则生成新的预赋码
-//        4.如果找不到,分别遍历当前项目的所有地块,把其中其它的地块找出来,进行等值判断,如果找不到则生成新的预赋码,如果找到,则使用当前的预赋码
-
+        /*
+         2.这里校验当前地块是否已经存在当前项目中,如果存在共用一个预赋码,如果不存在则生成新的预赋码
+         3.用gemoId+projectId 查找如果找到,直接使用当前的预赋码,如果没有找到,则生成新的预赋码
+         4.如果找不到,分别遍历当前项目的所有地块,把其中其它的地块找出来,进行等值判断,如果找不到则生成新的预赋码,如果找到,则使用当前的预赋码
+         */
         //--------------------第一部分先检查是否同一个引用----------------------------------------
+        //当前节点地块来自于存在的节点的矢量,直接沿用存在的预赋码
         NodeLand nodeLand = nodeLandMapper.selectByNodeId(nodeId);
-        String currentNodeGeomDbId =   nodeLand.getGeomDbId();
-
+        String currentNodeGeomDbId = nodeLand.getGeomDbId();
         ProjectImmobileCode param = new ProjectImmobileCode();
         param.setProjectId(projectId);
         param.setGeomDbId(currentNodeGeomDbId);
@@ -1977,58 +1968,92 @@ public class ProjectImpl implements ProjectService {
             preAssignCode = existsRes.getPreAssignCode();
             sequenceNumber = existsRes.getSequenceNumber();
         }
-        //--------------------第二部分先检查是否同一个地块(两条矢量数据 details)---------------------------------------
-//        1.根据当前项目查询所有的im数据list的geomId
-//        2.查询当前节点的 geomId
-//        geomId --- geomIds
-//        如果当前geomId 对应两块地,先比较两块地的数量
-
 
-
-
-
-        //这里生成预赋码逻辑,调用三方接口获取最大序号,然后生成预赋码,插入到不动产单元号表中
-        Map<String, String> maxSequenceMap = takeDataService.getThirdMaxSequence(projectId,AloneWorkFlowEnum.NODE_2.getTableName());
-        String plotCode = "";
-        String regionCode = "";
-        //这里校验当前地块是否已经存在当前项目中,如果存在共用一个预赋码,如果不存在则生成新的预赋码
-        if(MapUtils.isNotEmpty(maxSequenceMap) && maxSequenceMap.containsKey("maxSequence")) {
-            regionCode = maxSequenceMap.get("regionCode");
-            plotCode = maxSequenceMap.get("plotCode");
-            sequenceNumber = maxSequenceMap.get("maxSequence");
+        //--------------------第二部分,这里需要先进行图斑等值校验,先检查是否同一个地块(两条矢量数据 details)---------------------------------------
+        //        1.根据当前项目查询所有的预赋码表数据list然后获取nodeIdList 进行等值判断(在sql中执行)
+        //        2.如果当前geomId 对应两块地,是否先比较两块地的数量(这里不进行数量比较,简单比较,统一到当前项目下的其它节点地块中比较)
+        //        3.校验当前地块是否已经存在当前项目的其它节点中,如果存在则共用一个预赋码,如果不存在则走第三部分
+
+        if(com.siwei.common.core.utils.StringUtils.isBlank(preAssignCode) && com.siwei.common.core.utils.StringUtils.isBlank(sequenceNumber)) {
+            List<String> nodeIdList = new ArrayList<>();
+            List<ProjectImmobileCode> currentProjectImmobileList = projectImmobileCodeMapper.selectByProjectId(projectId, "");
+            if (CollectionUtils.isNotEmpty(currentProjectImmobileList)) {
+                nodeIdList = currentProjectImmobileList.stream().map(ProjectImmobileCode::getNodeId).collect(Collectors.toList());
+            }
+            String equalsNodeId = "";
+            Boolean equalsFlag = true;
+            List<Map<String, Object>> currentNodeDetails = nodeLandMapper.selectGeomDetailsByGeomDbId(currentNodeGeomDbId);
+            //这里简单判断,如果当前节点的图斑在当前项目其它节点都存在,则认为地块是存在地块,并且已经赋码完成,取最后一次的节点预赋码为当前码
+            if (!currentNodeDetails.isEmpty()) {
+                for (Map<String, Object> tmpMap : currentNodeDetails) {
+                    String detailsId = tmpMap.get("id").toString();
+                    Map<String, String> equalsGeomMap = nodeLandMapper.selectNodeGeomContains(nodeIdList, detailsId);
+                    if (MapUtils.isNotEmpty(equalsGeomMap) && equalsGeomMap.containsKey("node_id")) {
+                        equalsNodeId = equalsGeomMap.get("node_id");
+                    } else {
+                        equalsFlag = false;
+                        break;
+                    }
+                }
+            }
+            if (equalsFlag.equals(true) && StringUtils.isNotBlank(equalsNodeId)) {
+                param = new ProjectImmobileCode();
+                param.setProjectId(projectId);
+                param.setGeomDbId(equalsNodeId);
+                existsRes = projectImmobileCodeMapper.selectByCondition(param);
+                if (Objects.nonNull(existsRes)) {
+                    preAssignCode = existsRes.getPreAssignCode();
+                    sequenceNumber = existsRes.getSequenceNumber();
+                }
+            }
         }
 
-
-
-
-        //------------------------------------------------------------------------------------------------------------------------------------------
-
-        //这里需要校验是否已经存在预赋码,如果存在则修改
+        //--------------------第三部分 这里生成预赋码逻辑,调用三方接口获取最大序号,然后生成预赋码,插入到不动产单元号表中---------------------------
+        if(com.siwei.common.core.utils.StringUtils.isBlank(preAssignCode) && com.siwei.common.core.utils.StringUtils.isBlank(sequenceNumber)) {
+            String plotCode = "";
+            String regionCode = "";
+            Map<String, String> maxSequenceMap = takeDataService.getThirdMaxSequence(projectId,nodeId);
+            if (MapUtils.isNotEmpty(maxSequenceMap) && maxSequenceMap.containsKey("maxSequence")) {
+                regionCode = maxSequenceMap.get("regionCode");
+                plotCode = maxSequenceMap.get("plotCode");
+                sequenceNumber = maxSequenceMap.get("maxSequence");
+                //这里查询库中最大序列号,两者取其一的最大值
+                ProjectImmobileCode dbMaxSequenceNumberImmobileCode = projectImmobileCodeMapper.selectBySequenceNumber(sequenceNumber);
+                if (Objects.nonNull(dbMaxSequenceNumberImmobileCode)) {
+                    sequenceNumber = dbMaxSequenceNumberImmobileCode.getSequenceNumber() + 1;
+                }
+                preAssignCode = regionCode + plotCode + sequenceNumber;
+            }
+        }
+        //-----------------------------------------------------end-------------------------------------------------------------------------------------
         if(com.siwei.common.core.utils.StringUtils.isNotBlank(preAssignCode) && com.siwei.common.core.utils.StringUtils.isNotBlank(sequenceNumber)){
-            // insert 前需要先删除当前项目的预赋码数据
-            projectImmobileCodeMapper.deleteByProjectIdNodeId(projectId,nodeId);
-            //这里进行入库
-            ProjectImmobileCode projectImmobileCode = new ProjectImmobileCode();
-            projectImmobileCode.generateId();
-            projectImmobileCode.setProjectId(projectId);
-            projectImmobileCode.setNodeId(nodeId);
-            projectImmobileCode.setGeomDbId(geomDbId);
-            projectImmobileCode.setCode(null);
-            projectImmobileCode.setSequenceNumber(sequenceNumber);
-            projectImmobileCode.setPreAssignCode(preAssignCode);
-            projectImmobileCode.setValidFlag(validFlag);
-            projectImmobileCodeMapper.insert(projectImmobileCode);
+            // insert前做检查,如果当前节点已经赋码过了且是当前预赋码则无需赋码
+            param = new ProjectImmobileCode();
+            param.setProjectId(projectId);
+            param.setNodeId(nodeId);
+            param.setSequenceNumber(sequenceNumber);
+            param.setPreAssignCode(preAssignCode);
+            existsRes = projectImmobileCodeMapper.selectByCondition(param);
+            if(Objects.isNull(existsRes)){
+                // insert 前需要先删除当前项目的预赋码数据
+                projectImmobileCodeMapper.deleteByProjectIdNodeId(projectId,nodeId);
+                //这里进行入库
+                ProjectImmobileCode projectImmobileCode = new ProjectImmobileCode();
+                projectImmobileCode.generateId();
+                projectImmobileCode.setProjectId(projectId);
+                projectImmobileCode.setNodeId(nodeId);
+                projectImmobileCode.setGeomDbId(geomDbId);
+                projectImmobileCode.setCode(null);
+                projectImmobileCode.setSequenceNumber(sequenceNumber);
+                projectImmobileCode.setPreAssignCode(preAssignCode);
+                projectImmobileCode.setValidFlag(validFlag);
+                projectImmobileCodeMapper.insert(projectImmobileCode);
+            }
         }
-
-
-
-
-
     }
 
 
 
-
     /**
      * 递归解析json文件数据
      * 

+ 11 - 14
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/third/impl/TakeDataServiceImpl.java

@@ -88,11 +88,11 @@ public class TakeDataServiceImpl implements TakeDataService {
      * 然后根据规则生成预赋不动产单元号
      *
      * @param projectId
-     * @param tableName
+     * @param nodeId
      * @return
      */
     @Override
-    public Map<String, String> getThirdMaxSequence(String projectId, String tableName) {
+    public Map<String, String> getThirdMaxSequence(String projectId, String nodeId) {
         Map<String, String> retMap = new LinkedHashMap<>();
         Project project = projectMapper.get(projectId);
         String firstPlotCode = project.getFirstPlotCode();
@@ -106,19 +106,16 @@ public class TakeDataServiceImpl implements TakeDataService {
 
         //获取地籍子区的代码
         String regionCode = "";
-        List<ProjectWorkflow> projectWorkflows = projectWorkflowMapper.selectByProjectIdAndNodeTableName(projectId, tableName);
-        if (CollectionUtils.isNotEmpty(projectWorkflows)) {
-            String nodeId = projectWorkflows.get(0).getNodeId();
-            //这里查询出来所有的geometryId,然后循环查询某个区域的
-            List<Map<String, String>> geomDetailsList = nodeLandService.selectTGeomDbDetailsByNodeId(nodeId);
-            for (Map<String, String> geomDetailsMap : geomDetailsList) {
-                String geomDetailsId = geomDetailsMap.get("id");
-                //当前地块所属地籍子区编号
-                Map<String, String> detailGeomBelongToDjzqMap = nodeLandService.getDjzqContainsNodeList(geomDetailsId);
-                if (!MapUtils.isEmpty(detailGeomBelongToDjzqMap)) {
-                    regionCode = detailGeomBelongToDjzqMap.get("djzqdm");
-                }
+        //这里查询出来所有的geomId,然后循环查询某个区域的地块,包含第一块,直接获取区域代码
+        List<Map<String, String>> geomDetailsList = nodeLandService.selectTGeomDbDetailsByNodeId(nodeId);
+        for (Map<String, String> geomDetailsMap : geomDetailsList) {
+            String geomDetailsId = geomDetailsMap.get("id");
+            //当前地块所属地籍子区编号
+            Map<String, String> detailGeomBelongToDjzqMap = nodeLandService.getDjzqContainsNodeList(geomDetailsId);
+            if (!MapUtils.isEmpty(detailGeomBelongToDjzqMap)) {
+                regionCode = detailGeomBelongToDjzqMap.get("djzqdm");
             }
+            break;
         }
 
         String maxSequence = RandomStringUtils.randomNumeric(5);

+ 18 - 0
siwei-modules/siwei-apply/src/main/resources/mapper/NodeLandMapper.xml

@@ -167,4 +167,22 @@
             limit 1
         </select>
 
+
+    <!-- 这里判断两个图形是否一致,如果一致则返回已存在的当前的节点数据 -->
+    <select id="selectNodeGeomContains" parameterType="String" resultType="map">
+        SELECT  geom.id , node.node_id   FROM  "t_geom_db_details"  geom
+        LEFT JOIN "public"."t_geom_db"  upload   on geom.upload_id=upload.id
+        LEFT JOIN "public"."t_node_land" node    on  node.geom_db_id=upload.id
+        LEFT JOIN  "public"."t_project_immobile_code" tpic   on  node.node_id=tpic.node_id
+        where st_contains(ST_Buffer(geom.geom::geography, 0.1)::geometry, (SELECT geom FROM "t_geom_db_details"  WHERE id = #{detailsId} ))
+        <if test="nodeIdList != null and nodeIdList.size() > 0">
+            AND tpic.node_id  IN
+            <foreach collection="nodeIdList" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+        limit 1
+    </select>
+
+
 </mapper>

+ 16 - 3
siwei-modules/siwei-apply/src/main/resources/mapper/ProjectImmobileCodeMapper.xml

@@ -40,18 +40,25 @@
         <include refid="Base_Column_List"/>
         FROM t_project_immobile_code
         WHERE project_id = #{projectId}
-        AND  valid_flag = 1
+        <if test="validFlag != null validFlag!='' ">
+            AND  valid_flag = #{validFlag}
+        </if>
     </select>
 
-    <!-- 根据序号查询(只返回一条) -->
+    <!-- 根据序号查询(只返回一条,这里查询表中最大的序列号做为新的编码基数) -->
     <select id="selectBySequenceNumber" resultMap="BaseResultMap" parameterType="String">
         SELECT
         <include refid="Base_Column_List"/>
         FROM t_project_immobile_code
-        WHERE sequence_number = #{sequenceNumber}
+        WHERE sequence_number >= #{sequenceNumber}
+        order by sequence_number desc
         LIMIT 1
     </select>
 
+
+
+
+
     <!-- 根据序号列表查询 -->
     <select id="selectBySequenceNumberList" resultMap="BaseResultMap" parameterType="List">
         SELECT
@@ -95,6 +102,12 @@
             <if test="geomDbId != null and geomDbId !='' ">
                 AND geom_db_id  = #{geomDbId}
             </if>
+            <if test="sequenceNumber != null and sequenceNumber !='' ">
+                AND sequence_number  = #{sequenceNumber}
+            </if>
+            <if test="preAssignCode != null and preAssignCode !='' ">
+                AND pre_assign_code  = #{preAssignCode}
+            </if>
         </where>
         Limit 1
     </select>