Browse Source

Merge branch 'dev-excel0521' into dev-to-user-1

# Conflicts:
#	siwei-modules/siwei-apply/src/main/java/com/siwei/apply/utils/ServiceUtil.java
chenendian 4 days ago
parent
commit
89cfefa5ba
31 changed files with 1527 additions and 159 deletions
  1. 580 0
      siwei-common/siwei-common-core/src/main/java/com/siwei/common/core/utils/RsaUtil.java
  2. 3 0
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/GyjsydscdjController.java
  3. 1 1
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/TdgyController.java
  4. 13 1
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/TjyydhxController.java
  5. 2 0
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/YdbpController.java
  6. 2 0
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/YdysyxzController.java
  7. 39 0
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/cadastre/StorageController.java
  8. 32 15
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/third/OfferDataController.java
  9. 24 26
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/third/TakeDataController.java
  10. 3 1
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/domain/ProjectImmobileCode.java
  11. 32 0
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/domain/cadastre/LandStorageInOutReportDTO.java
  12. 55 0
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/domain/cadastre/LandStorageReportDTO.java
  13. 4 0
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/domain/res/TdgyStatisticsRes.java
  14. 1 1
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/mapper/GjShijiShouchuMapper.java
  15. 1 1
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/mapper/GjShouchuJihuaMapper.java
  16. 3 0
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/mapper/NodeLandMapper.java
  17. 22 11
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/mapper/ProjectImmobileCodeMapper.java
  18. 1 0
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/ProjectService.java
  19. 0 2
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/TdgyService.java
  20. 292 3
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/cadastre/impl/StorageServiceImpl.java
  21. 138 1
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/impl/ProjectImpl.java
  22. 0 34
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/impl/TdgyImpl.java
  23. 2 5
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/third/OfferDataService.java
  24. 20 2
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/third/impl/OfferDataServiceImpl.java
  25. 22 22
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/third/impl/TakeDataServiceImpl.java
  26. 50 0
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/utils/HttpClientUtil.java
  27. 68 5
      siwei-modules/siwei-apply/src/main/java/com/siwei/apply/utils/ServiceUtil.java
  28. 6 1
      siwei-modules/siwei-apply/src/main/resources/mapper/GjShijiShouchuMapper.xml
  29. 4 0
      siwei-modules/siwei-apply/src/main/resources/mapper/GjShouchuJihuaMapper.xml
  30. 34 0
      siwei-modules/siwei-apply/src/main/resources/mapper/NodeLandMapper.xml
  31. 73 27
      siwei-modules/siwei-apply/src/main/resources/mapper/ProjectImmobileCodeMapper.xml

+ 580 - 0
siwei-common/siwei-common-core/src/main/java/com/siwei/common/core/utils/RsaUtil.java

@@ -0,0 +1,580 @@
+package com.siwei.common.core.utils;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import javax.crypto.Cipher;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.security.*;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * RSA加密算法工具类
+ * @author guoan
+ */
+public class RsaUtil {
+    /**
+     * 定义加密方式
+     */
+    private final static String KEY_RSA = "RSA";
+    /**
+     * 定义签名算法
+     */
+    private final static String KEY_RSA_SIGNATURE = "MD5withRSA";
+    /**
+     * 定义公钥算法
+     */
+    private final static String KEY_RSA_PUBLICKEY = "RSAPublicKey";
+    /**
+     * 定义私钥算法
+     */
+    private final static String KEY_RSA_PRIVATEKEY = "RSAPrivateKey";
+
+    /**
+     * RSA最大加密明文大小
+     */
+    private static final int MAX_ENCRYPT_BLOCK = 117;
+
+    /**
+     * RSA最大解密密文大小
+     */
+    private static final int MAX_DECRYPT_BLOCK = 128;
+
+
+    /**
+     * RSA最大解密密文大小
+     */
+    private static final int MAX_DECRYPT_BLOCK_256 = 256;
+
+    private RsaUtil() {
+    }
+
+    /**
+     * 生成公钥、私钥对象
+     * @return 封装公钥私钥对象的map
+     */
+    public static Map<String, Object> generateKey() {
+        Map<String, Object> map = new HashMap<>(2);
+        try {
+            KeyPairGenerator generator = KeyPairGenerator.getInstance(KEY_RSA);
+            generator.initialize(1024);
+            KeyPair keyPair = generator.generateKeyPair();
+            // 公钥
+            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
+            // 私钥
+            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
+            // 将密钥封装为map
+            map.put(KEY_RSA_PUBLICKEY, publicKey);
+            map.put(KEY_RSA_PRIVATEKEY, privateKey);
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        return map;
+    }
+
+    /**
+     * 获取公钥字符串
+     * @param map 封装公钥私钥对象的map
+     * @return 返回公钥字符串
+     */
+    public static String getPublicKey(Map<String, Object> map) {
+        String str = "";
+        try {
+            Key key = (Key) map.get(KEY_RSA_PUBLICKEY);
+            byte[] publicKey = key.getEncoded();
+            str = encryptBase64(publicKey);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return str;
+    }
+
+    /**
+     * 获取私钥字符串
+     * @param map 封装公钥私钥对象的map
+     * @return 返回私钥字符串
+     */
+    public static String getPrivateKey(Map<String, Object> map) {
+        String str = "";
+        try {
+            Key key = (Key) map.get(KEY_RSA_PRIVATEKEY);
+            str = encryptBase64(key.getEncoded());
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return str;
+    }
+
+    /**
+     * 用私钥对参数字符串生成数字签名
+     * @param privateKey 私钥
+     * @param dataStr 参数字符串
+     * @return 数字签名
+     */
+    public static String sign(String privateKey, String dataStr) {
+        String str = "";
+        try {
+            byte[] data = dataStr.getBytes("UTF-8");
+            return sign(privateKey, data);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 用私钥对参数字节数组生成数字签名
+     * @param privateKey 私钥
+     * @param data 参数字节数组
+     * @return 数字签名
+     */
+    public static String sign(String privateKey, byte[] data) {
+        String str = "";
+        try {
+            //指定加密算法
+            KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
+            //对私钥进行base64解码
+            byte[] bytes = decryptBase64(privateKey);
+            //构造PKCS8EncodedKeySpec对象
+            PKCS8EncodedKeySpec pkc = new PKCS8EncodedKeySpec(bytes);
+            // 取私钥对象
+            PrivateKey key = factory.generatePrivate(pkc);
+            // 用私钥对信息生成数字签名
+            Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE);
+            signature.initSign(key);
+            signature.update(data);
+            str = encryptBase64(signature.sign());
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return str;
+    }
+
+    /**
+     * 用公钥对数字签名进行校验
+     * @param publicKey 公钥
+     * @param dataStr 原文本
+     * @param sign 数字签名
+     * @return 数字签名是否合法
+     */
+    public static boolean verify(String publicKey, String dataStr, String sign) {
+
+        try {
+            byte[] data = dataStr.getBytes("UTF-8");
+            return verify(publicKey, data, sign);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+
+    /**
+     * 用公钥对数字签名进行校验
+     * @param publicKey 公钥
+     * @param data 原文本字节数组
+     * @param sign 数字签名
+     * @return 数字签名是否合法
+     */
+    public static boolean verify(String publicKey, byte[] data, String sign) {
+        boolean flag = false;
+        try {
+            //指定加密算法
+            KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
+            //对公钥进行base64解码
+            byte[] bytes = decryptBase64(publicKey);
+            //构造X509EncodedKeySpec对象
+            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
+            //取公钥对象
+            PublicKey key = factory.generatePublic(keySpec);
+            //用公钥验证数字签名
+            Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE);
+            signature.initVerify(key);
+            signature.update(data);
+            flag = signature.verify(decryptBase64(sign));
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return flag;
+    }
+
+    /**
+     * 公钥加密
+     * @param publicKey 公钥
+     * @param dataStr 需要加密的数据
+     * @return 加密后的数据
+     */
+    public static String encryptByPublicKey(String publicKey, String dataStr) {
+        try {
+            byte[] result = encryptByPublicKey(publicKey, dataStr.getBytes("UTF-8"));
+            return encryptBase64(result);
+        } catch (Exception ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    /**
+     * 公钥加密
+     * @param publicKey 公钥
+     * @param data 需要加密数据的字节数组
+     * @return 加密后的数据字节数组
+     */
+    public static byte[] encryptByPublicKey(String publicKey, byte[] data) {
+        byte[] result = null;
+        try {
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            //对公钥进行base64解码
+            byte[] bytes = decryptBase64(publicKey);
+            KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
+            Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
+            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
+            //取得公钥
+            PublicKey pubKey = factory.generatePublic(keySpec);
+            cipher.init(Cipher.ENCRYPT_MODE, pubKey);
+            int inputLen = data.length;
+
+            int offSet = 0;
+            byte[] cache;
+            int i = 0;
+            // 对数据分段加密
+            while (inputLen - offSet > 0) {
+                if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
+                    cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
+                } else {
+                    cache = cipher.doFinal(data, offSet, inputLen - offSet);
+                }
+                out.write(cache, 0, cache.length);
+                i++;
+                offSet = i * MAX_ENCRYPT_BLOCK;
+            }
+            byte[] encryptedData = out.toByteArray();
+            out.close();
+            return encryptedData;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 使用私钥解密数据
+     * @param privateKey 私钥
+     * @param dataStr 需要解密的数据
+     * @return 解密后的字符串
+     */
+    public static String decryptByPrivateKey256(String privateKey, String dataStr) {
+        try {
+            byte[] result = decryptByPrivateKey(privateKey, decryptBase64(dataStr),MAX_DECRYPT_BLOCK_256);
+            return new String(result);
+        } catch (Exception ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    /**
+     * 使用私钥解密数据,最大解密密文大小为256
+     * @param privateKey 私钥
+     * @param dataStr 需要解密的数据
+     * @return 解密后的字符串
+     */
+    public static String decryptByPrivateKey(String privateKey, String dataStr) {
+        try {
+            byte[] result = decryptByPrivateKey(privateKey, decryptBase64(dataStr),MAX_DECRYPT_BLOCK);
+            return new String(result);
+        } catch (Exception ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    /**
+     * 使用私钥解密数据
+     * @param privateKey 私钥
+     * @param data 需要解密的字节数组
+     * @param maxDecryptBlock 解密密文大小
+     * @return 解密后的字符串
+     */
+    public static byte[] decryptByPrivateKey(String privateKey, byte[] data,int maxDecryptBlock) {
+        byte[] result = null;
+        try {
+            // 获取私钥字符串时,进行了encryptBase64操作,因此此处需对私钥解密
+            byte[] bytes = decryptBase64(privateKey);
+            // 取得私钥
+            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
+            KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
+            PrivateKey priKey = factory.generatePrivate(keySpec);
+            // 对数据解密
+            Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
+            cipher.init(Cipher.DECRYPT_MODE, priKey);
+
+            int inputLen = data.length;
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            int offSet = 0;
+            byte[] cache;
+            int i = 0;
+            // 对数据分段解密
+            while (inputLen - offSet > 0) {
+                if (inputLen - offSet > maxDecryptBlock) {
+                    cache = cipher
+                            .doFinal(data, offSet, maxDecryptBlock);
+                } else {
+                    cache = cipher
+                            .doFinal(data, offSet, inputLen - offSet);
+                }
+                out.write(cache, 0, cache.length);
+                i++;
+                offSet = i * maxDecryptBlock;
+            }
+            byte[] decryptedData = out.toByteArray();
+            out.close();
+            return decryptedData;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+
+    /**
+     * 使用私钥加密数据
+     * @param privateKey 私钥
+     * @param dataStr 需要加密的字符串
+     * @return 加密后的字符串
+     */
+    public static String encryptByPrivateKey(String privateKey, String dataStr) {
+        try {
+            byte[] result = encryptByPrivateKey(privateKey, dataStr.getBytes("UTF-8"));
+            return encryptBase64(result);
+        } catch (Exception ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    /**
+     * 使用私钥加密数据
+     * @param privateKey 私钥
+     * @param data 需要加密的字符数组
+     * @return 加密后的字节数组
+     */
+    public static byte[] encryptByPrivateKey(String privateKey, byte[] data) {
+        try {
+            byte[] bytes = decryptBase64(privateKey);
+            // 取得私钥
+            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
+            KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
+            PrivateKey priKey = factory.generatePrivate(keySpec);
+            // 对数据加密
+            Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
+            cipher.init(Cipher.ENCRYPT_MODE, priKey);
+            int inputLen = data.length;
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            int offSet = 0;
+            byte[] cache;
+            int i = 0;
+            // 对数据分段加密
+            while (inputLen - offSet > 0) {
+                if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
+                    cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
+                } else {
+                    cache = cipher.doFinal(data, offSet, inputLen - offSet);
+                }
+                out.write(cache, 0, cache.length);
+                i++;
+                offSet = i * MAX_ENCRYPT_BLOCK;
+            }
+            byte[] encryptedData = out.toByteArray();
+            out.close();
+            return encryptedData;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 使用公钥解密数据
+     * @param publicKey 公钥
+     * @param dataStr 加密字符串
+     * @return 解密后的数据
+     */
+    public static String decryptByPublicKey(String publicKey, String dataStr) {
+        try {
+            byte[] result = decryptByPublicKey(publicKey, decryptBase64(dataStr));
+            return new String(result,"UTF-8");
+        } catch (Exception ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    /**
+     * 使用公钥解密数据
+     * @param publicKey  公钥
+     * @param data 加密字节数组
+     * @return  解密后的字节数组
+     */
+    public static byte[] decryptByPublicKey(String publicKey, byte[] data) {
+        try {
+            //对公钥进行base64解码
+            byte[] bytes = decryptBase64(publicKey);
+            //取得公钥
+            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
+            KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
+            PublicKey pubKey = factory.generatePublic(keySpec);
+            //对数据解密
+            Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
+            cipher.init(Cipher.DECRYPT_MODE, pubKey);
+            int inputLen = data.length;
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            int offSet = 0;
+            byte[] cache;
+            int i = 0;
+            // 对数据分段解密
+            while (inputLen - offSet > 0) {
+                if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
+                    cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK);
+                } else {
+                    cache = cipher.doFinal(data, offSet, inputLen - offSet);
+                }
+                out.write(cache, 0, cache.length);
+                i++;
+                offSet = i * MAX_DECRYPT_BLOCK;
+            }
+            byte[] decryptedData = out.toByteArray();
+            out.close();
+            return decryptedData;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * BASE64 解密
+     * @param key 需要解密的字符串
+     * @return 字节数组
+     */
+    public static byte[] decryptBase64(String key) {
+        return javax.xml.bind.DatatypeConverter.parseBase64Binary(key);
+    }
+
+    /**
+     * BASE64 加密
+     * @param key 需要加密的字节数组
+     * @return 字符串
+     */
+    public static String encryptBase64(byte[] key) {
+        return javax.xml.bind.DatatypeConverter.printBase64Binary(key);
+    }
+
+    /**
+     * 生成公钥私钥并存入map对象中
+     * @return 存放公钥私钥的map
+     */
+    public static Map<String,String> getKeyMap(){
+        Map<String,String> keyMap = new HashMap<>(16);
+        Map<String,Object> map = RsaUtil.generateKey();
+        keyMap.put("publicKey",RsaUtil.getPublicKey(map));
+        keyMap.put("privateKey",RsaUtil.getPrivateKey(map));
+        return keyMap;
+    }
+
+ 
+    /**
+     * 私钥解密数据并验证时间戳参数
+     * @param encryptParam 加密数据
+     * @param privateKey 私钥
+     * @return 返回解密后的数据
+     */
+    public static Map<String,Object> decryptStrByPrivateKey(String encryptParam,String privateKey){
+        Map<String,String> decryptMap;
+        Map<String, Object> depmap;
+        ObjectMapper mapper = new ObjectMapper();
+        String decryptParam = "";
+        try {
+            decryptMap = mapper.readValue(encryptParam, Map.class);
+            decryptParam = decryptMap.get("encryptParam").toString();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        try {
+            decryptParam = RsaUtil.decryptByPrivateKey(privateKey, decryptParam);
+            decryptParam = URLDecoder.decode(decryptParam, "UTF-8");
+            //验证时间戳参数,防止恶意请求
+            try {
+                depmap = mapper.readValue(decryptParam, Map.class);
+            } catch (Exception er) {
+                throw new RuntimeException("数据非法,请联系系统管理员申请!" + er.getMessage());
+            }
+            Map<String, String> mapValue = (Map) depmap;
+            if (!mapValue.containsKey("timestamp")) {
+                throw new RuntimeException("参数非法,未包含timestamp信息!");
+            }
+            String timestamp = mapValue.get("timestamp").toString();
+            if (StringUtils.isBlank(timestamp)) {
+                throw new RuntimeException("参数非法,timestamp信息为空!");
+            }
+            long lngRequestTime = Long.valueOf(timestamp);
+            long currentTime = System.currentTimeMillis();
+            Long s = (currentTime - lngRequestTime) / (1000 * 60);
+            if (s >= 30) {
+                throw new RuntimeException("链接超时,请检查时间戳!");
+            }
+        } catch (Exception er) {
+            throw new RuntimeException("数据非法,请联系系统管理员申请获取正确的key!");
+        }
+        return depmap;
+    }
+ 
+    /**
+     * 公钥解密数据
+     * @param encryptParam 加密数据
+     * @param publicKey 公钥
+     * @return 返回解密后的数据
+     */
+    public static Map<String,Object> decryptStrByPublicKey(String encryptParam,String publicKey){
+        Map<String,String> decryptMap;
+        Map<String, Object> depmap;
+        ObjectMapper mapper = new ObjectMapper();
+        String decryptParam = "";
+        try {
+            decryptMap = mapper.readValue(encryptParam, Map.class);
+            decryptParam = decryptMap.get("result").toString();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        try {
+            decryptParam = RsaUtil.decryptByPublicKey(publicKey, decryptParam);
+            decryptParam = URLDecoder.decode(decryptParam, "UTF-8");
+            try {
+                depmap = mapper.readValue(decryptParam, Map.class);
+            } catch (Exception e) {
+                throw new RuntimeException("数据非法,请联系系统管理员申请!" + e.getMessage());
+            }
+
+        } catch (Exception er) {
+            throw new RuntimeException("数据非法,请联系系统管理员申请获取正确的key!");
+        }
+        return depmap;
+    }
+
+    /**
+     * 判断是否json格式
+     * @param str
+     * @return
+     */
+    public static boolean isJson(String str){
+        try {
+            JSONObject jsonStr= JSONObject.parseObject(str);
+            return  true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+    public static void main(String[] args) {
+        Map<String, Object> stringObjectMap = generateKey();
+        String privateKey = getPrivateKey(stringObjectMap);
+        String publicKey = getPublicKey(stringObjectMap);
+        System.out.println(privateKey);
+        System.out.println(publicKey);
+    }
+}

+ 3 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/GyjsydscdjController.java

@@ -113,7 +113,10 @@ public class GyjsydscdjController extends BaseController {
                 if(Objects.isNull(nodeLand)){
                 if(Objects.isNull(nodeLand)){
                     return R.fail(502,"数据空间信息不存在,请检查先导入空间数据");
                     return R.fail(502,"数据空间信息不存在,请检查先导入空间数据");
                 }
                 }
+                //这里进行预赋码逻辑
+                projectService.addPreAssignCode(id,onChainVo.getProjectId(),nodeLand.getGeomDbId(),0);
             }
             }
+
             for (String id : onChainVo.getIds()) {
             for (String id : onChainVo.getIds()) {
                 gyjsydscdjService.updateHasOnchain(id, onChainVo.getHasOnchain());
                 gyjsydscdjService.updateHasOnchain(id, onChainVo.getHasOnchain());
             }
             }

+ 1 - 1
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/TdgyController.java

@@ -136,7 +136,7 @@ public class TdgyController extends BaseController {
             // 更新项目表的上链数量
             // 更新项目表的上链数量
             projectService.countOnChinaNum(projectId);
             projectService.countOnChinaNum(projectId);
             //这里进行预赋码逻辑
             //这里进行预赋码逻辑
-            tdgyService.addPreAssignCode(id,projectId,nodeLand.getGeomDbId());
+            projectService.addPreAssignCode(id,projectId,nodeLand.getGeomDbId(),1);
             //这里生成资源吗
             //这里生成资源吗
             landOneCodeService.addOrUpdateLandOneCodeInfo(projectId,id);
             landOneCodeService.addOrUpdateLandOneCodeInfo(projectId,id);
             return R.ok();
             return R.ok();

+ 13 - 1
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/TjyydhxController.java

@@ -1,9 +1,11 @@
 package com.siwei.apply.controller;
 package com.siwei.apply.controller;
 
 
+import com.siwei.apply.domain.NodeLand;
 import com.siwei.apply.domain.res.TjyydhxRes;
 import com.siwei.apply.domain.res.TjyydhxRes;
 import com.siwei.apply.domain.vo.TjyydhxUpdateVo;
 import com.siwei.apply.domain.vo.TjyydhxUpdateVo;
 import com.siwei.apply.domain.vo.TjyydhxVo;
 import com.siwei.apply.domain.vo.TjyydhxVo;
 import com.siwei.apply.service.LandOneCodeService;
 import com.siwei.apply.service.LandOneCodeService;
+import com.siwei.apply.service.NodeLandService;
 import com.siwei.apply.service.ProjectService;
 import com.siwei.apply.service.ProjectService;
 import com.siwei.apply.service.TjyydhxService;
 import com.siwei.apply.service.TjyydhxService;
 import com.siwei.common.core.domain.R;
 import com.siwei.common.core.domain.R;
@@ -14,6 +16,7 @@ import org.springframework.web.bind.annotation.*;
 
 
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
+import java.util.Objects;
 
 
 /**
 /**
  * 规划条件与用地红线出具 控制器
  * 规划条件与用地红线出具 控制器
@@ -29,7 +32,8 @@ public class TjyydhxController extends BaseController {
     @Autowired
     @Autowired
     LandOneCodeService landOneCodeService;
     LandOneCodeService landOneCodeService;
 
 
-
+    @Autowired
+    NodeLandService nodeLandService;
     /**
     /**
      * 添加规划条件与用地红线出具
      * 添加规划条件与用地红线出具
      */
      */
@@ -94,6 +98,8 @@ public class TjyydhxController extends BaseController {
 
 
     /**
     /**
      * 这里没有校验空间数据,是因为(流程第二项t_ydbp 表中对应的地块信息,如果按顺序流程,则第一项未上链,则第二一定无值,校验没有意义)
      * 这里没有校验空间数据,是因为(流程第二项t_ydbp 表中对应的地块信息,如果按顺序流程,则第一项未上链,则第二一定无值,校验没有意义)
+     *  (批次报批类型项目,在土地供应环节会嵌入新的节点,所以再上链方法会校验当前节点是否存在地块矢量)
+     *   这里需要校验当前节点是否存在地块矢量,如果不存在,则不允许上链
      * 更新规划条件与用地红线出具的上链状态
      * 更新规划条件与用地红线出具的上链状态
      */
      */
     @PutMapping("/onchain")
     @PutMapping("/onchain")
@@ -105,9 +111,15 @@ public class TjyydhxController extends BaseController {
             if (StringUtils.isBlank(id)) {
             if (StringUtils.isBlank(id)) {
                 return R.fail("nodeId不能为空");
                 return R.fail("nodeId不能为空");
             }
             }
+            NodeLand nodeLand = nodeLandService.getNodeLandByNodeId(id);
+            if(Objects.isNull(nodeLand)){
+                return R.fail(502,"数据空间信息不存在,请检查先导入空间数据");
+            }
             tjyydhxService.updateHasOnchain(id, hasOnchain);
             tjyydhxService.updateHasOnchain(id, hasOnchain);
             // 更新项目表的上链数量
             // 更新项目表的上链数量
             projectService.countOnChinaNum(projectId);
             projectService.countOnChinaNum(projectId);
+            //这里进行预赋码逻辑
+            projectService.addPreAssignCode(id,projectId,nodeLand.getGeomDbId(),0);
             //这里生成资源吗
             //这里生成资源吗
             landOneCodeService.addOrUpdateLandOneCodeInfo(projectId,id);
             landOneCodeService.addOrUpdateLandOneCodeInfo(projectId,id);
             return R.ok();
             return R.ok();

+ 2 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/YdbpController.java

@@ -113,6 +113,8 @@ public class YdbpController extends BaseController {
                 return R.fail(502,"数据空间信息不存在,请检查先导入空间数据");
                 return R.fail(502,"数据空间信息不存在,请检查先导入空间数据");
             }
             }
             ydbpService.updateHasOnchain(id, hasOnchain);
             ydbpService.updateHasOnchain(id, hasOnchain);
+            //这里进行预赋码逻辑
+            projectService.addPreAssignCode(id,projectId,nodeLand.getGeomDbId(),0);
             // 更新项目表的上链数量
             // 更新项目表的上链数量
             projectService.countOnChinaNum(projectId);
             projectService.countOnChinaNum(projectId);
             //这里生成资源吗
             //这里生成资源吗

+ 2 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/YdysyxzController.java

@@ -117,6 +117,8 @@ public class YdysyxzController extends BaseController {
             ydysyxzService.updateHasOnchain(id, hasOnchain);
             ydysyxzService.updateHasOnchain(id, hasOnchain);
             // 更新项目表的上链数量
             // 更新项目表的上链数量
             projectService.countOnChinaNum(projectId);
             projectService.countOnChinaNum(projectId);
+            //这里进行预赋码逻辑
+            projectService.addPreAssignCode(id,projectId,nodeLand.getGeomDbId(),0);
             //这里生成资源吗
             //这里生成资源吗
             landOneCodeService.addOrUpdateLandOneCodeInfo(projectId,id);
             landOneCodeService.addOrUpdateLandOneCodeInfo(projectId,id);
             return R.ok();
             return R.ok();

+ 39 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/cadastre/StorageController.java

@@ -1,5 +1,8 @@
 package com.siwei.apply.controller.cadastre;
 package com.siwei.apply.controller.cadastre;
 
 
+import com.siwei.apply.domain.cadastre.LandStorageInOutReportDTO;
+import com.siwei.apply.domain.cadastre.LandStorageReportDTO;
+import com.siwei.apply.domain.cadastre.LandSupplyReportDTO;
 import com.siwei.apply.domain.res.StorageYearStatisticsRes;
 import com.siwei.apply.domain.res.StorageYearStatisticsRes;
 import com.siwei.apply.domain.res.TrendStatisticsData;
 import com.siwei.apply.domain.res.TrendStatisticsData;
 import com.siwei.apply.domain.res.TrendStatisticsRes;
 import com.siwei.apply.domain.res.TrendStatisticsRes;
@@ -174,4 +177,40 @@ public class StorageController extends BaseController {
             return R.fail(e.getMessage());
             return R.fail(e.getMessage());
         }
         }
     }
     }
+
+
+    @GetMapping("/report/progress")
+    public R<LandStorageReportDTO> getStroageProgress(@RequestParam String startYear, @RequestParam String endYear) {
+        try {
+            //todo 调用相关方法,获取数据,封装成LandStorageReportDTO对象
+            LandStorageReportDTO res =  storageServiceImpl.stroageProgress(startYear,endYear);
+            return R.ok(res);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.fail(e.getMessage());
+        }
+    }
+
+
+
+    @GetMapping("/report/inOutDetails")
+    public R<LandStorageInOutReportDTO> getInOutDetails() {
+        try {
+            LandStorageInOutReportDTO res =  storageServiceImpl.inOutDetails();
+            return R.ok(res);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.fail(e.getMessage());
+        }
+    }
+
+
+
+
+
+
+
+
+
+
 }
 }

File diff suppressed because it is too large
+ 32 - 15
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/third/OfferDataController.java


+ 24 - 26
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/third/TakeDataController.java

@@ -1,7 +1,6 @@
 package com.siwei.apply.controller.third;
 package com.siwei.apply.controller.third;
 
 
-import com.siwei.apply.domain.LandOneCode;
-import com.siwei.apply.domain.vo.TakeDataAddVo;
+import com.siwei.apply.domain.vo.ThirdRecordStatusParamVo;
 import com.siwei.apply.service.third.TakeDataService;
 import com.siwei.apply.service.third.TakeDataService;
 import com.siwei.common.core.domain.R;
 import com.siwei.common.core.domain.R;
 import com.siwei.common.core.utils.StringUtils;
 import com.siwei.common.core.utils.StringUtils;
@@ -11,7 +10,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
 
 
 /**
 /**
@@ -44,25 +42,19 @@ public class TakeDataController extends BaseController {
         }
         }
     }
     }
 
 
-    /**
-     * 按ID查询
-     */
-    @GetMapping("{id}")
-    public R<LandOneCode> getById(@PathVariable String id) {
-        try {
-            return R.ok();
-        } catch (Exception e) {
-            return R.fail(e.getMessage());
-        }
-    }
+
+
 
 
     /**
     /**
-     * 更新(按ID)
+     * 国有建设用地使用权首次登记
+     * 不动产土地登记完成后入参使用
      */
      */
-    @PutMapping("zzz")
-    public R<Void> update(@RequestBody LandOneCode body) {
+    @PostMapping("/third/landFirstRegistration")
+    public R<Map<String, Object>> landFirstRegistration(@RequestBody ThirdRecordStatusParamVo body) {
         try {
         try {
-            return R.ok(null);
+            Map<String, Object> map = takeDataService.remoteLandFirstRegistration(body);
+            map.put("id", map.get("id"));
+            return R.ok(map);
         } catch (Exception e) {
         } catch (Exception e) {
             return R.fail(e.getMessage());
             return R.fail(e.getMessage());
         }
         }
@@ -70,17 +62,17 @@ public class TakeDataController extends BaseController {
 
 
 
 
     /**
     /**
-     * 添加数据
      *
      *
-     * @param takeDataAddVo
-     * @return
+     * 国有建设用地使用权及房屋所有权首次登记
+     * landFirstParamVo
+     * houseFirstParamVo
+     * 不动产土地登记完成后入参使用
      */
      */
-    @PostMapping("add")
-    public R<Map<String, String>> add(@RequestBody TakeDataAddVo takeDataAddVo) {
+    @PostMapping("/third/houseFirstRegistration")
+    public R<Map<String, Object>> houseFirstRegistration(@RequestBody ThirdRecordStatusParamVo  body) {
         try {
         try {
-            String id = takeDataService.add(takeDataAddVo);
-            Map<String, String> map = new HashMap<>();
-            map.put("id", id);
+            Map<String, Object> map = takeDataService.remoteHouseFirstRegistration(body);
+            map.put("id", map.get("id"));
             return R.ok(map);
             return R.ok(map);
         } catch (Exception e) {
         } catch (Exception e) {
             return R.fail(e.getMessage());
             return R.fail(e.getMessage());
@@ -100,4 +92,10 @@ public class TakeDataController extends BaseController {
 
 
 
 
 
 
+
+
+
+
+
+
 }
 }

+ 3 - 1
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/domain/ProjectImmobileCode.java

@@ -11,7 +11,9 @@ import java.util.Date;
 @Data
 @Data
 public class ProjectImmobileCode extends BaseId {
 public class ProjectImmobileCode extends BaseId {
     private String projectId;
     private String projectId;
-    private String businessId;
+    /** 序号 */
+    private String sequenceNumber;
+
     private String code;
     private String code;
     private Integer validFlag;
     private Integer validFlag;
 
 

+ 32 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/domain/cadastre/LandStorageInOutReportDTO.java

@@ -0,0 +1,32 @@
+package com.siwei.apply.domain.cadastre;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class LandStorageInOutReportDTO {
+
+    private String title;
+    private CategoryDTO  summary;
+    private List<CategoryDTO> categoryList;
+
+    @Data
+    public static class CategoryDTO {
+        private String category;
+        private DetailDTO detail;
+    }
+
+    @Data
+    public static class DetailDTO {
+        private List<ItemDTO> in;
+        private List<ItemDTO> out;
+    }
+
+    @Data
+    public static class ItemDTO {
+        private String year; //年份
+        private String count; //个数(条数)
+    }
+
+}

+ 55 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/domain/cadastre/LandStorageReportDTO.java

@@ -0,0 +1,55 @@
+package com.siwei.apply.domain.cadastre;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class LandStorageReportDTO {
+    private String title;
+    private String statTimeRange;
+    private SummaryDTO summary;
+    private List<DetailDTO> details;
+
+    @Data
+    public static class SummaryDTO {
+        private TotalDTO total;
+    }
+
+    @Data
+    public static class TotalDTO {
+        private String progress ;
+        private PlanDTO plan;
+        private CompletedDTO completed;
+    }
+
+    @Data
+    public static class DetailDTO {
+        private String category;
+        private String progress;
+        private PlanDTO plan;
+        private CompletedDTO completed;
+    }
+
+    @Data
+    public static class PlanDTO {
+        private Double area;
+        private Integer count;
+        private Float cost; //成本
+        private Integer method1;
+        private Integer method2;
+        private Integer otherMethod;
+    }
+
+    @Data
+    public static class CompletedDTO {
+        private Double area;
+        private Integer count;
+        private Float cost; //成本
+        private Integer method1;
+        private Integer method2;
+        private Integer otherMethod;
+    }
+
+
+}

+ 4 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/domain/res/TdgyStatisticsRes.java

@@ -33,6 +33,10 @@ public class TdgyStatisticsRes {
 
 
     private String bz;
     private String bz;
 
 
+    private BigDecimal cost;
+
+    private String nf;
+
     private String geom;
     private String geom;
 
 
 
 

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

@@ -30,7 +30,7 @@ public interface GjShijiShouchuMapper {
 
 
     List<GjShijiShouchu> getByGeomIntersects(@Param("ewkt") String ewkt);
     List<GjShijiShouchu> getByGeomIntersects(@Param("ewkt") String ewkt);
 
 
-    List<TdgyStatisticsRes> gjShijiShouchuListByYear(@Param("year") String year, @Param("landTypeCode") String landTypeCode, @Param("startTime") String startTime, @Param("endTime") String endTime);
+    List<TdgyStatisticsRes> gjShijiShouchuListByYear(@Param("year") String year,@Param("startYear") String startYear,@Param("endYear") String endYear,@Param("landTypeCode") String landTypeCode, @Param("startTime") String startTime, @Param("endTime") String endTime);
 
 
     Map<String, Object> getActualProject(@Param("gid") String gid);
     Map<String, Object> getActualProject(@Param("gid") String gid);
 }
 }

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

@@ -16,7 +16,7 @@ public interface GjShouchuJihuaMapper {
 
 
     List<Map<String, Object>> getPlanStatsByMethod(@Param("year") String year);
     List<Map<String, Object>> getPlanStatsByMethod(@Param("year") String year);
 
 
-    List<TdgyStatisticsRes> getPlanListByYear(@Param("year") String year, @Param("keyWord") String keyWord);
+    List<TdgyStatisticsRes> getPlanListByYear(@Param("year") String year,@Param("startYear") String startYear,@Param("endYear") String endYear, @Param("keyWord") String keyWord);
 
 
     Map<String, Object> getPlanProject(@Param("gid") String gid);
     Map<String, Object> getPlanProject(@Param("gid") String gid);
 }
 }

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

@@ -63,6 +63,9 @@ public interface NodeLandMapper {
 
 
     Map<String, String> selectDjzqContainsNodeList(@Param("detailsId")String detailsId);
     Map<String, String> selectDjzqContainsNodeList(@Param("detailsId")String detailsId);
 
 
+    Map<String, String> selectNodeGeomContains(@Param("nodeIdList") List<String> nodeIdList,@Param("detailsId")String detailsId);
+
+    Map<String, String> selectGeomContains(@Param("geomDbIdList") List<String> geomDbIdList,@Param("detailsId") String detailsId);
 
 
 
 
 }
 }

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

@@ -5,6 +5,7 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 
 
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 /**
 /**
  * 项目的不动产登记码 Mapper 接口
  * 项目的不动产登记码 Mapper 接口
@@ -20,31 +21,37 @@ public interface ProjectImmobileCodeMapper {
     /**
     /**
      * 根据项目ID查询(多条)
      * 根据项目ID查询(多条)
      */
      */
-    List<ProjectImmobileCode> selectByProjectId(String projectId);
+    List<ProjectImmobileCode> selectByProjectId(@Param("projectId") String projectId,@Param("validFlag") String validFlag);
 
 
     /**
     /**
-     * 根据业务ID查询(只返回一条)
+     * 根据序号查询(只返回一条)
      */
      */
-    ProjectImmobileCode selectByBusinessId(String businessId);
+    ProjectImmobileCode selectBySequenceNumber(String sequenceNumber);
 
 
     /**
     /**
-     * 根据业务ID列表查询
+     * 根据序号列表查询
      */
      */
-    List<ProjectImmobileCode> selectByBusinessIdList(@Param("businessIdList") List<String> businessIdList);
+    List<ProjectImmobileCode> selectBySequenceNumberList(@Param("sequenceNumberList") List<String> sequenceNumberList);
 
 
 
 
     /**
     /**
-     * 根据业务ID查询(只返回一条)
+     * 根据预赋不动产单元号查询(只返回一条)
      */
      */
     ProjectImmobileCode selectByPreAssignCode(@Param("preAssignCode") String preAssignCode);
     ProjectImmobileCode selectByPreAssignCode(@Param("preAssignCode") String preAssignCode);
 
 
+    ProjectImmobileCode selectByCondition(ProjectImmobileCode projectImmobileCode);
+
+
+    List<Map<String,String>> selectPreAssignCodeList(@Param("limit") Integer limit, @Param("offset") Integer offset);
+
+
     /**
     /**
      * 插入记录
      * 插入记录
      */
      */
     void insert(ProjectImmobileCode projectImmobileCode);
     void insert(ProjectImmobileCode projectImmobileCode);
 
 
     /**
     /**
-     * 根据业务ID更新记录(更新 code, validFlag, updatedAt, nodeId, geomDbId, geomDetailsId, preAssignCode)
+     * 根据序号更新记录(更新 code, validFlag, updatedAt, nodeId, geomDbId, geomDetailsId, preAssignCode)
      */
      */
     void update(ProjectImmobileCode projectImmobileCode);
     void update(ProjectImmobileCode projectImmobileCode);
 
 
@@ -59,13 +66,17 @@ public interface ProjectImmobileCodeMapper {
     void deleteByProjectId(String projectId);
     void deleteByProjectId(String projectId);
 
 
     /**
     /**
-     * 根据业务ID删除,排除指定ID
+     * 根据序号删除,排除指定ID
      */
      */
-    void deleteByBusinessIdAndIdNotEqual(@Param("businessId") String businessId, @Param("id") String id);
+    void deleteBySequenceNumberAndIdNotEqual(@Param("sequenceNumber") String sequenceNumber, @Param("id") String id);
 
 
     /**
     /**
-     * 根据业务ID删除
+     * 根据序号删除
      */
      */
-    void deleteByBusinessId(String businessId);
+    void deleteBySequenceNumber(String sequenceNumber);
+
+
+    void deleteByProjectIdNodeId(@Param("projectId") String projectId, @Param("nodeId") String nodeId);
+
 }
 }
 
 

+ 1 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/ProjectService.java

@@ -92,6 +92,7 @@ public interface ProjectService {
 
 
     void deleteOneNode(NodeVo nodeVo) ;
     void deleteOneNode(NodeVo nodeVo) ;
 
 
+    void addPreAssignCode(String nodeId,String projectId,String geomDbId,Integer validFlag) throws RuntimeException ;
 
 
 
 
     void testData() ;
     void testData() ;

+ 0 - 2
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/TdgyService.java

@@ -59,8 +59,6 @@ public interface TdgyService {
     void updateHasOnchain(String id,String projectId ,Boolean hasOnchain);
     void updateHasOnchain(String id,String projectId ,Boolean hasOnchain);
 
 
 
 
-    void addPreAssignCode(String nodeId,String projectId,String geomDbId) throws RuntimeException ;
-
 
 
 
 
 
 

+ 292 - 3
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/cadastre/impl/StorageServiceImpl.java

@@ -1,5 +1,7 @@
 package com.siwei.apply.service.cadastre.impl;
 package com.siwei.apply.service.cadastre.impl;
 
 
+import com.siwei.apply.domain.cadastre.LandStorageInOutReportDTO;
+import com.siwei.apply.domain.cadastre.LandStorageReportDTO;
 import com.siwei.apply.domain.cadastre.LandSupplyReportDTO;
 import com.siwei.apply.domain.cadastre.LandSupplyReportDTO;
 import com.siwei.apply.domain.res.*;
 import com.siwei.apply.domain.res.*;
 import com.siwei.apply.domain.vo.LandSupplyProjectVO;
 import com.siwei.apply.domain.vo.LandSupplyProjectVO;
@@ -24,6 +26,293 @@ public class StorageServiceImpl {
     @Autowired
     @Autowired
     private GjShouchuJihuaMapper gjShouchuJihuaMapper;
     private GjShouchuJihuaMapper gjShouchuJihuaMapper;
 
 
+
+    public LandStorageInOutReportDTO inOutDetails() {
+        LandStorageInOutReportDTO report = new LandStorageInOutReportDTO();
+        report.setTitle("收储出入库分析报表");
+        List<LandStorageInOutReportDTO.CategoryDTO> categoryList = new ArrayList();
+
+        List<TdgyStatisticsRes> completeList = gjShijiShouchuMapper.gjShijiShouchuListByYear(null, null,null,null, null, null);
+
+        String [] yearArr = {"all","2021","2022","2023","2024","2025","2026","other"};
+
+        Map<String, List<TdgyStatisticsRes>> groupedCompleteMap = completeList.stream()
+                .collect(Collectors.groupingBy(
+                        s -> {
+                            String tdyt = s.getTdyt();
+                            //为空赋值“其它”
+                            if (StringUtils.isBlank(tdyt)) {
+                                return "其它";
+                            }
+                            return tdyt;
+                        }
+                ));
+
+        Set<String> categorySet = new HashSet<>(groupedCompleteMap.keySet());
+        categorySet.add("其它");
+
+        for(String category  : categorySet){
+            List<TdgyStatisticsRes>   categoryCompleteList =  groupedCompleteMap.get(category);
+            if(CollectionUtils.isNotEmpty(categoryCompleteList)){
+                // 根据 nf 字段分组:在 yearArr 中年份相等的归到对应年份,不在 yearArr 中的归到 other
+                Set<String> definedYears = new HashSet<>(Arrays.asList("2021","2022","2023","2024","2025","2026"));
+                Map<String, Long> yearCountMap = categoryCompleteList.stream()
+                        .collect(Collectors.groupingBy(
+                                s -> {
+                                    String nf = s.getNf();
+                                    if (StringUtils.isNotBlank(nf) && definedYears.contains(nf)) {
+                                        return nf;
+                                    }
+                                    return "other";
+                                },
+                                Collectors.counting()
+                        ));
+
+                List<LandStorageInOutReportDTO.ItemDTO> inList = new ArrayList<>();
+                for (String year : yearArr) {
+                    LandStorageInOutReportDTO.ItemDTO item = new LandStorageInOutReportDTO.ItemDTO();
+                    item.setYear(year);
+                    if ("all".equals(year)) {
+                        // all 统计当前分类下不区分 nf 的所有数据加总
+                        item.setCount(String.valueOf(categoryCompleteList.size()));
+                    } else {
+                        item.setCount(String.valueOf(yearCountMap.getOrDefault(year, 0L)));
+                    }
+                    inList.add(item);
+                }
+
+                LandStorageInOutReportDTO.CategoryDTO categoryDTO = new LandStorageInOutReportDTO.CategoryDTO();
+                LandStorageInOutReportDTO.DetailDTO inOut =  new LandStorageInOutReportDTO.DetailDTO();
+                inOut.setIn(inList);
+                inOut.setOut(null); //这里暂时为空
+                categoryDTO.setCategory(category);
+                categoryDTO.setDetail(inOut);
+                categoryList.add(categoryDTO);
+            }
+        }
+        report.setCategoryList(categoryList);
+
+
+
+
+
+
+        // -----------------第二部分计算----------------------------
+        //todo 这里计算加总,合计的一行,使用completeList 直接算每一年的值,
+        LandStorageInOutReportDTO.CategoryDTO  summary = new LandStorageInOutReportDTO.CategoryDTO();
+        summary.setCategory("合计");
+        LandStorageInOutReportDTO.DetailDTO totalDetail = new LandStorageInOutReportDTO.DetailDTO();
+        //todo 这里计算 totalInList
+        List<LandStorageInOutReportDTO.ItemDTO> totalInList = new ArrayList<>();
+        totalDetail.setIn(totalInList);
+        totalDetail.setOut(null);
+        summary.setDetail(totalDetail);
+        report.setSummary(summary);
+
+
+
+
+        return report;
+    }
+
+
+
+
+    //统计分析
+    public LandStorageReportDTO stroageProgress(String startYear, String endYear) {
+        LandStorageReportDTO report = new LandStorageReportDTO();
+
+        startYear = "2025";
+        endYear = "2026";
+
+        report.setTitle("收储进度分析报表");
+        report.setStatTimeRange(startYear + " 至 " + endYear);
+
+        List<LandStorageReportDTO.DetailDTO> details =  new ArrayList<>();
+        List<TdgyStatisticsRes> completeList = gjShijiShouchuMapper.gjShijiShouchuListByYear(null, startYear,endYear,null, null, null);
+        Map<String, List<TdgyStatisticsRes>> completeMap = completeList.stream().collect(Collectors.groupingBy(TdgyStatisticsRes::getTdyt));
+        // 这里处理计划数据
+        List<TdgyStatisticsRes> planList = gjShouchuJihuaMapper.getPlanListByYear(null,startYear,endYear, null);
+        Set<String> categorySet = new HashSet<>(completeMap.keySet());
+        categorySet.add("其它");
+        Map<String, List<TdgyStatisticsRes>> groupedPlan = planList.stream()
+                .collect(Collectors.groupingBy(
+                        s -> {
+                            String tdyt = s.getTdyt();
+                            if (categorySet.contains(tdyt)) {
+                                return tdyt;
+                            }
+                            return "其它";
+                        }
+                ));
+
+        for(String category  : categorySet){
+            LandStorageReportDTO.DetailDTO tmpDetailDTO =  new LandStorageReportDTO.DetailDTO();
+            LandStorageReportDTO.PlanDTO plan = new LandStorageReportDTO.PlanDTO();
+            plan.setCount(0);
+            plan.setArea(0D);
+            plan.setCost(0F);
+            plan.setMethod1(0);
+            plan.setMethod2(0);
+            plan.setOtherMethod(0);
+
+            List<TdgyStatisticsRes>   categoryPlanList =  groupedPlan.get(category);
+            if(CollectionUtils.isNotEmpty(categoryPlanList)){
+                plan.setCount(categoryPlanList.size());
+                double totalArea = categoryPlanList.stream().mapToDouble(item -> item.getMjMu().doubleValue()).sum();
+                plan.setArea(totalArea);
+                float totalCost = (float) categoryPlanList.stream()
+                        .mapToDouble(item -> item.getCost() == null ? 0.0 : item.getCost().doubleValue())
+                        .sum();
+
+                plan.setCost(totalCost);
+
+                Map<String, List<TdgyStatisticsRes>> resultMap = categoryPlanList.stream()
+                        .collect(Collectors.groupingBy(item -> {
+                            String gyfs = item.getGyfs();
+                            //为空赋值“其它”
+                            if (StringUtils.isBlank(gyfs)) {
+                                return "其它";
+                            }
+                            return gyfs;
+                        }));
+                if(resultMap.containsKey("收购")){
+                    plan.setMethod1(resultMap.get("收购").size());
+                }
+                if(resultMap.containsKey("征收")){
+                    plan.setMethod2(resultMap.get("征收").size());
+                }
+                if(resultMap.containsKey("其它")){
+                    plan.setOtherMethod(resultMap.get("其它").size());
+                }
+            }
+
+            tmpDetailDTO.setPlan(plan);
+            List<TdgyStatisticsRes>  categoryCompleteList = completeMap.get(category);
+            LandStorageReportDTO.CompletedDTO complete = new LandStorageReportDTO.CompletedDTO();
+            complete.setCount(0);
+            complete.setArea(0D);
+            complete.setCost(0F);
+            complete.setMethod1(0);
+            complete.setMethod2(0);
+            complete.setOtherMethod(0);
+
+            if(CollectionUtils.isNotEmpty(categoryCompleteList)){
+                double totalArea = categoryCompleteList.stream().mapToDouble(item -> item.getMjMu().doubleValue()).sum();
+                complete.setArea(totalArea);
+                complete.setCount(categoryCompleteList.size());
+                float totalCost = (float) categoryCompleteList.stream().mapToDouble(item -> item.getCost().floatValue()).sum();
+                complete.setCost(totalCost);
+
+                Map<String, List<TdgyStatisticsRes>> resultMap = categoryCompleteList.stream()
+                        .collect(Collectors.groupingBy(item -> {
+                            String gyfs = item.getGyfs();
+                            //为空赋值“其它”
+                            if (StringUtils.isBlank(gyfs)) {
+                                return "其它";
+                            }
+                            return gyfs;
+                        }));
+                if(resultMap.containsKey("收购")){
+                    complete.setMethod1(resultMap.get("收购").size());
+                }
+                if(resultMap.containsKey("征收")){
+                    complete.setMethod2(resultMap.get("征收").size());
+                }
+                if(resultMap.containsKey("其它")){
+                    complete.setOtherMethod(resultMap.get("其它").size());
+                }
+            }
+
+            tmpDetailDTO.setCompleted(complete);
+            tmpDetailDTO.setCategory(category);
+            tmpDetailDTO.setProgress("0");
+            if(plan.getCount()>0){
+                tmpDetailDTO.setProgress(String.format("%.2f%%", (complete.getCount()*100.0 / plan.getCount()) ));
+            }
+            details.add(tmpDetailDTO);
+        }
+        report.setDetails(details);
+
+        //这里处理加总数据
+        LandStorageReportDTO.SummaryDTO summary = new LandStorageReportDTO.SummaryDTO();
+        LandStorageReportDTO.TotalDTO total = new LandStorageReportDTO.TotalDTO();
+        LandStorageReportDTO.CompletedDTO totalCompleted = new LandStorageReportDTO.CompletedDTO();
+        totalCompleted.setCount(completeList.size());
+        float totalCost = (float) completeList.stream().mapToDouble(item -> item.getCost().floatValue()).sum();
+        totalCompleted.setCost(totalCost);
+        double totalArea = completeList.stream().mapToDouble(item -> item.getMjMu().doubleValue()).sum();
+        totalCompleted.setArea(totalArea);
+
+        totalCompleted.setMethod1(0);
+        totalCompleted.setMethod2(0);
+        totalCompleted.setOtherMethod(0);
+
+        //这里处理收储的方式
+        Map<String, List<TdgyStatisticsRes>> resultMap = completeList.stream()
+                .collect(Collectors.groupingBy(item -> {
+                    String gyfs = item.getGyfs();
+                    //为空赋值“其它”
+                    if (StringUtils.isBlank(gyfs)) {
+                        return "其它";
+                    }
+                    return gyfs;
+                }));
+        if(resultMap.containsKey("收购")){
+            totalCompleted.setMethod1(resultMap.get("收购").size());
+        }
+        if(resultMap.containsKey("征收")){
+            totalCompleted.setMethod2(resultMap.get("征收").size());
+        }
+        if(resultMap.containsKey("其它")){
+            totalCompleted.setOtherMethod(resultMap.get("其它").size());
+        }
+
+        //这里处理计划的数据
+        LandStorageReportDTO.PlanDTO totalPlan = new LandStorageReportDTO.PlanDTO();
+        totalPlan.setCount(planList.size());
+        //这里计算成本
+        totalCost = (float) planList.stream().mapToDouble(item -> item.getCost() == null ? 0.0 : item.getCost().doubleValue()).sum();
+
+        totalPlan.setCost(totalCost);
+        //这里计算面积
+        totalArea = planList.stream().mapToDouble(item -> item.getMjMu().doubleValue()).sum();
+        totalPlan.setArea(totalArea);
+
+        totalPlan.setMethod1(0);
+        totalPlan.setMethod2(0);
+        totalPlan.setOtherMethod(0);
+
+        resultMap = planList.stream()
+                .collect(Collectors.groupingBy(item -> {
+                    String gyfs = item.getGyfs();
+                    //为空赋值“其它”
+                    if (StringUtils.isBlank(gyfs)) {
+                        return "其它";
+                    }
+                    return gyfs;
+                }));
+        if(resultMap.containsKey("收购")){
+            totalPlan.setMethod1(resultMap.get("收购").size());
+        }
+        if(resultMap.containsKey("征收")){
+            totalPlan.setMethod2(resultMap.get("征收").size());
+        }
+        if(resultMap.containsKey("其它")){
+            totalPlan.setOtherMethod(resultMap.get("其它").size());
+        }
+
+        String progress = String.format("%.2f%%", (totalCompleted.getCount()*100.0 / totalPlan.getCount()));
+        total.setProgress(progress);
+        total.setCompleted(totalCompleted);
+        total.setPlan(totalPlan);
+        summary.setTotal(total);
+        report.setSummary(summary);
+        return  report;
+    }
+
+
+
     //统计分析
     //统计分析
     public List<TrendStatisticsData> getData1() {
     public List<TrendStatisticsData> getData1() {
         List<Map<String, Object>> statsList = gjShijiShouchuMapper.getStatsByYear();
         List<Map<String, Object>> statsList = gjShijiShouchuMapper.getStatsByYear();
@@ -62,7 +351,7 @@ public class StorageServiceImpl {
         StorageYearStatisticsRes res = new StorageYearStatisticsRes();
         StorageYearStatisticsRes res = new StorageYearStatisticsRes();
 
 
         Map<String, Object> planSummary = gjShouchuJihuaMapper.getPlanSummaryByYear(year);
         Map<String, Object> planSummary = gjShouchuJihuaMapper.getPlanSummaryByYear(year);
-        List<TdgyStatisticsRes> completeList = gjShijiShouchuMapper.gjShijiShouchuListByYear(year, null, null, null);
+        List<TdgyStatisticsRes> completeList = gjShijiShouchuMapper.gjShijiShouchuListByYear(year, null, null, null, null, null);
         BigDecimal planArea = toBigDecimal(planSummary == null ? null : planSummary.get("plan_area"));
         BigDecimal planArea = toBigDecimal(planSummary == null ? null : planSummary.get("plan_area"));
         int planCount = toInteger(planSummary == null ? null : planSummary.get("plan_project_count"));
         int planCount = toInteger(planSummary == null ? null : planSummary.get("plan_project_count"));
         BigDecimal completeArea = sumArea(completeList);
         BigDecimal completeArea = sumArea(completeList);
@@ -129,7 +418,7 @@ public class StorageServiceImpl {
     }
     }
 
 
     private List<LandSupplyProjectVO> buildPlanProjectList(String year, String keyWord) {
     private List<LandSupplyProjectVO> buildPlanProjectList(String year, String keyWord) {
-        List<TdgyStatisticsRes> planList = gjShouchuJihuaMapper.getPlanListByYear(year, keyWord);
+        List<TdgyStatisticsRes> planList = gjShouchuJihuaMapper.getPlanListByYear(year,null,null, keyWord);
         if (CollectionUtils.isEmpty(planList)) {
         if (CollectionUtils.isEmpty(planList)) {
             return new ArrayList<>();
             return new ArrayList<>();
         }
         }
@@ -150,7 +439,7 @@ public class StorageServiceImpl {
     }
     }
 
 
     private List<LandSupplyProjectVO> buildCompleteProjectList(String year) {
     private List<LandSupplyProjectVO> buildCompleteProjectList(String year) {
-        List<TdgyStatisticsRes> completeList = gjShijiShouchuMapper.gjShijiShouchuListByYear(year, null, null, null);
+        List<TdgyStatisticsRes> completeList = gjShijiShouchuMapper.gjShijiShouchuListByYear(year, null,null,null, null, null);
         if (CollectionUtils.isEmpty(completeList)) {
         if (CollectionUtils.isEmpty(completeList)) {
             return new ArrayList<>();
             return new ArrayList<>();
         }
         }

+ 138 - 1
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/impl/ProjectImpl.java

@@ -17,8 +17,10 @@ import com.siwei.apply.mapper.*;
 import com.siwei.apply.service.NodeAttachmentService;
 import com.siwei.apply.service.NodeAttachmentService;
 import com.siwei.apply.service.NodeLandService;
 import com.siwei.apply.service.NodeLandService;
 import com.siwei.apply.service.ProjectService;
 import com.siwei.apply.service.ProjectService;
+import com.siwei.apply.service.third.TakeDataService;
 import com.siwei.apply.utils.ServiceFileUtil;
 import com.siwei.apply.utils.ServiceFileUtil;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
 import org.geotools.data.DefaultTransaction;
 import org.geotools.data.DefaultTransaction;
 import org.geotools.data.FeatureWriter;
 import org.geotools.data.FeatureWriter;
 import org.geotools.data.Transaction;
 import org.geotools.data.Transaction;
@@ -147,6 +149,18 @@ public class ProjectImpl implements ProjectService {
     @Autowired
     @Autowired
     private NodeLandService nodeLandService;
     private NodeLandService nodeLandService;
 
 
+
+    @Autowired
+    private TakeDataService takeDataService;
+
+    @Autowired
+    private ProjectImmobileCodeMapper projectImmobileCodeMapper;
+
+
+
+
+
+
     @Override
     @Override
     public String add(ProjectVo projectVo) {
     public String add(ProjectVo projectVo) {
         Project project = new Project();
         Project project = new Project();
@@ -1921,6 +1935,129 @@ public class ProjectImpl implements ProjectService {
         projectMapper.deleteNodeByTable(nodeVo.getNodeId(), nodeVo.getTableName());
         projectMapper.deleteNodeByTable(nodeVo.getNodeId(), nodeVo.getTableName());
     }
     }
 
 
+
+    /**
+     *
+     *         1.每一个地块都需要进行赋码操作,并且获取不动产最大序列值。
+     *         3.保证异常情况下,预付码不会重复。
+     *         5.简单取两者中最大序列号,进行+1赋码
+     *         6.如果每次上链都要求重新生成,则需要方法入口先删除当前t_project_immobile_code条目
+     * @param nodeId
+     * @param projectId
+     * @param geomDbId
+     * @param validFlag
+     * @throws RuntimeException
+     */
+    @Override
+    public void addPreAssignCode(String nodeId,String projectId,String geomDbId,Integer validFlag) throws RuntimeException {
+        String preAssignCode = "";
+        String sequenceNumber = "";
+        /*
+         2.这里校验当前地块是否已经存在当前项目中,如果存在共用一个预赋码,如果不存在则生成新的预赋码
+         3.用gemoId+projectId 查找如果找到,直接使用当前的预赋码,如果没有找到,则生成新的预赋码
+         4.如果找不到,分别遍历当前项目的所有地块,把其中其它的地块找出来,进行等值判断,如果找不到则生成新的预赋码,如果找到,则使用当前的预赋码
+         */
+        //--------------------第一部分先检查是否同一个引用----------------------------------------
+        //当前节点地块来自于存在的节点的矢量,直接沿用存在的预赋码
+        NodeLand nodeLand = nodeLandMapper.selectByNodeId(nodeId);
+        String currentNodeGeomDbId = nodeLand.getGeomDbId();
+        ProjectImmobileCode param = new ProjectImmobileCode();
+        param.setProjectId(projectId);
+        param.setGeomDbId(currentNodeGeomDbId);
+        ProjectImmobileCode existsRes = projectImmobileCodeMapper.selectByCondition(param);
+        if(Objects.nonNull(existsRes)){
+            preAssignCode = existsRes.getPreAssignCode();
+            sequenceNumber = existsRes.getSequenceNumber();
+        }
+
+        //--------------------第二部分,这里需要先进行图斑等值校验,先检查是否同一个地块(两条矢量数据 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<String> geomDbIdList = new ArrayList<>();
+            List<ProjectImmobileCode> currentProjectImmobileList = projectImmobileCodeMapper.selectByProjectId(projectId, "");
+            if (CollectionUtils.isNotEmpty(currentProjectImmobileList)) {
+                geomDbIdList = currentProjectImmobileList.stream().map(ProjectImmobileCode::getGeomDbId).collect(Collectors.toList());
+            }
+            String equalsGeomDbId = "";
+            Boolean equalsFlag = true;
+            List<Map<String, Object>> currentNodeDetails = nodeLandMapper.selectGeomDetailsByGeomDbId(currentNodeGeomDbId);
+            //这里简单判断,如果当前节点的图斑在当前项目其它节点都存在,则认为地块是存在地块,并且已经赋码完成,取最后一次的节点预赋码为当前码
+            if (!currentNodeDetails.isEmpty() && !geomDbIdList.isEmpty()) {
+                for (Map<String, Object> tmpMap : currentNodeDetails) {
+                    String detailsId = tmpMap.get("id").toString();
+                    Map<String, String> equalsGeomMap = nodeLandMapper.selectGeomContains(geomDbIdList, detailsId);
+
+                    if (MapUtils.isNotEmpty(equalsGeomMap) && equalsGeomMap.containsKey("geom_db_id")) {
+                        equalsGeomDbId = equalsGeomMap.get("geom_db_id");
+                    } else {
+                        equalsFlag = false;
+                        break;
+                    }
+                }
+            }
+            if (equalsFlag.equals(true) && StringUtils.isNotBlank(equalsGeomDbId)) {
+                param = new ProjectImmobileCode();
+                param.setProjectId(projectId);
+                param.setGeomDbId(equalsGeomDbId);
+                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;
+                    sequenceNumber = String.valueOf(Integer.parseInt(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前做检查,如果当前节点已经赋码过了且是当前预赋码则无需赋码
+            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文件数据
      * 递归解析json文件数据
      * 
      * 
@@ -1957,7 +2094,7 @@ public class ProjectImpl implements ProjectService {
         List<ProjectWorkflow> projectWorkflowList = projectWorkflowMapper.selectByProjectId(projectId);
         List<ProjectWorkflow> projectWorkflowList = projectWorkflowMapper.selectByProjectId(projectId);
         ProjectWorkflow currentProjectWorkflow = null;
         ProjectWorkflow currentProjectWorkflow = null;
         // 倒叙排序
         // 倒叙排序
-        projectWorkflowList = projectWorkflowList.stream()
+        projectWorkflowList = projectWorkflowList.stream().filter(s->!s.getWorkflowId().equals("17"))
                 .sorted(Comparator.comparing(ProjectWorkflow::getWorkflowId).reversed()).collect(Collectors.toList());
                 .sorted(Comparator.comparing(ProjectWorkflow::getWorkflowId).reversed()).collect(Collectors.toList());
         for (ProjectWorkflow projectWorkflow : projectWorkflowList) {
         for (ProjectWorkflow projectWorkflow : projectWorkflowList) {
             String nodeTableName = projectWorkflow.getNodeTableName();
             String nodeTableName = projectWorkflow.getNodeTableName();

+ 0 - 34
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/impl/TdgyImpl.java

@@ -50,12 +50,6 @@ public class TdgyImpl implements TdgyService {
     @Autowired
     @Autowired
     private NodeLandService nodeLandService;
     private NodeLandService nodeLandService;
 
 
-    @Autowired
-    private TakeDataService takeDataService;
-
-    @Autowired
-    private ProjectImmobileCodeMapper projectImmobileCodeMapper;
-
 
 
 
 
     @Override
     @Override
@@ -231,33 +225,5 @@ public class TdgyImpl implements TdgyService {
         tdgyMapper.updateHasOnchain(id, hasOnchain);
         tdgyMapper.updateHasOnchain(id, hasOnchain);
     }
     }
 
 
-    @Override
-    public void addPreAssignCode(String nodeId,String projectId,String geomDbId) throws RuntimeException {
-        //这里进行预赋码逻辑,先查询是否已经存在预赋码,如果存在则不进行生成
-        List<ProjectImmobileCode> existsList = projectImmobileCodeMapper.selectByProjectId(projectId);
-        if(CollectionUtils.isNotEmpty(existsList)){
-            String existsPreAssignCode  = existsList.get(0).getPreAssignCode();
-            if(StringUtils.isNotBlank(existsPreAssignCode)){
-                return;
-            }
-        }
-        //这里生成预赋码逻辑,调用三方接口获取最大序号,然后生成预赋码,插入到不动产单元号表中
-        Map<String, String> maxSequenceMap = takeDataService.getThirdMaxSequence(projectId,AloneWorkFlowEnum.NODE_2.getTableName());
-        if(MapUtils.isNotEmpty(maxSequenceMap) && maxSequenceMap.containsKey("preAssignCode")){
-            String preAssignCode  = maxSequenceMap.get("preAssignCode");
-            //这里需要校验是否已经存在预赋码,如果存在则修改
-            if(com.siwei.common.core.utils.StringUtils.isNotBlank(preAssignCode)){
-                //这里进行入库
-                ProjectImmobileCode projectImmobileCode = new ProjectImmobileCode();
-                projectImmobileCode.generateId();
-                projectImmobileCode.setProjectId(projectId);
-                projectImmobileCode.setNodeId(nodeId);
-                projectImmobileCode.setGeomDbId(geomDbId);
-                projectImmobileCode.setCode(null);
-                projectImmobileCode.setPreAssignCode(preAssignCode);
-                projectImmobileCodeMapper.insert(projectImmobileCode);
-            }
-        }
-    }
 
 
 }
 }

+ 2 - 5
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/third/OfferDataService.java

@@ -38,12 +38,9 @@ public interface OfferDataService {
 
 
     List<Map<String, Object>> landSupplyAndProjectList(ThirdProjectParamVo body) ;
     List<Map<String, Object>> landSupplyAndProjectList(ThirdProjectParamVo body) ;
 
 
-
     Map<String, Object> addRecordStatusData(ThirdRecordStatusParamVo body);
     Map<String, Object> addRecordStatusData(ThirdRecordStatusParamVo body);
 
 
+    List<String> getPreAssignedCodeList();
 
 
 
 
-
-
-
-    }
+}

+ 20 - 2
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/third/impl/OfferDataServiceImpl.java

@@ -1,5 +1,6 @@
 package com.siwei.apply.service.third.impl;
 package com.siwei.apply.service.third.impl;
 
 
+import com.alibaba.fastjson2.JSON;
 import com.siwei.apply.domain.NodeAttachment;
 import com.siwei.apply.domain.NodeAttachment;
 import com.siwei.apply.domain.ProjectImmobileCode;
 import com.siwei.apply.domain.ProjectImmobileCode;
 import com.siwei.apply.domain.ProjectWorkflow;
 import com.siwei.apply.domain.ProjectWorkflow;
@@ -25,6 +26,7 @@ import lombok.extern.slf4j.Slf4j;
 
 
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
@@ -33,6 +35,7 @@ import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
 
 
 
 
 /**
 /**
@@ -88,6 +91,18 @@ public class OfferDataServiceImpl implements OfferDataService {
         return map;
         return map;
     }
     }
 
 
+
+    @Override
+    public  List<String> getPreAssignedCodeList() {
+        List<String> list = new ArrayList<>();
+        List<Map<String,String>> preAssignCodeList = projectImmobileCodeMapper.selectPreAssignCodeList(20,0);
+        if(CollectionUtils.isNotEmpty(preAssignCodeList)){
+            list = preAssignCodeList.stream().map(s->s.get("pre_assign_code")).collect(Collectors.toList());
+        }
+        return list;
+    }
+
+
     /**
     /**
      * 获取 1.项目与土地供应,两个表进行关联。
      * 获取 1.项目与土地供应,两个表进行关联。
      * 并且为上链的,并且不动产单元号不经存在的数据。
      * 并且为上链的,并且不动产单元号不经存在的数据。
@@ -150,6 +165,8 @@ public class OfferDataServiceImpl implements OfferDataService {
             throw new ServiceException("业务号为空");
             throw new ServiceException("业务号为空");
         }
         }
 
 
+        log.info("登簿数据校验通过开始入库: {}" , JSON.toJSONString(body));
+
         String id="";
         String id="";
         String tbztFlag;
         String tbztFlag;
         // 入库:以 yfbdcdyh 或 ywh 及 ywlx 判重,已存在则按主键覆盖更新,避免重复插入
         // 入库:以 yfbdcdyh 或 ywh 及 ywlx 判重,已存在则按主键覆盖更新,避免重复插入
@@ -165,12 +182,13 @@ public class OfferDataServiceImpl implements OfferDataService {
             thirdRecordStatusMapper.insert(body);
             thirdRecordStatusMapper.insert(body);
             tbztFlag = "0";
             tbztFlag = "0";
         }
         }
-
+        log.info("登簿数据入库成功: {}" , id);
+        tbztFlag = "1"; //todo 这里暂时不同步数据
         if("0".equals(tbztFlag)) {
         if("0".equals(tbztFlag)) {
             //todo 需要进行数据的抓取,并且需要异步处理,否则下载文件会阻塞接口的返回,导致超时。
             //todo 需要进行数据的抓取,并且需要异步处理,否则下载文件会阻塞接口的返回,导致超时。
             CompletableFuture.supplyAsync(()-> {
             CompletableFuture.supplyAsync(()-> {
                 if("1".equals(ywlx)){ //土地首次登记
                 if("1".equals(ywlx)){ //土地首次登记
-                    //takeDataService.remoteLandFirstRegistration(body);
+                    takeDataService.remoteLandFirstRegistration(body);
                 }else if("2".equals(ywlx)){ //房屋首次登记
                 }else if("2".equals(ywlx)){ //房屋首次登记
                     //takeDataService.remoteHouseFirstRegistration(body);
                     //takeDataService.remoteHouseFirstRegistration(body);
                 }
                 }

+ 22 - 22
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 projectId
-     * @param tableName
+     * @param nodeId
      * @return
      * @return
      */
      */
     @Override
     @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<>();
         Map<String, String> retMap = new LinkedHashMap<>();
         Project project = projectMapper.get(projectId);
         Project project = projectMapper.get(projectId);
         String firstPlotCode = project.getFirstPlotCode();
         String firstPlotCode = project.getFirstPlotCode();
@@ -106,27 +106,19 @@ public class TakeDataServiceImpl implements TakeDataService {
 
 
         //获取地籍子区的代码
         //获取地籍子区的代码
         String regionCode = "";
         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 preAssignCode = "";
         String maxSequence = RandomStringUtils.randomNumeric(5);
         String maxSequence = RandomStringUtils.randomNumeric(5);
-        if (StringUtils.isNotBlank(regionCode)) {
-            preAssignCode = regionCode + firstPlotCode + secondPlotCode + maxSequence;
-        }
-
         //todo 这里三方接口完成后联调后修改
         //todo 这里三方接口完成后联调后修改
         if (StringUtils.isNotBlank(regionCode) && false) {
         if (StringUtils.isNotBlank(regionCode) && false) {
             Map<String, Object> paramMap = new LinkedHashMap<>();
             Map<String, Object> paramMap = new LinkedHashMap<>();
@@ -137,8 +129,8 @@ public class TakeDataServiceImpl implements TakeDataService {
         }
         }
 
 
         retMap.put("maxSequence", maxSequence);
         retMap.put("maxSequence", maxSequence);
-        retMap.put("preAssignCode", preAssignCode);
-        retMap.put("state", "success");
+        retMap.put("regionCode", regionCode);
+        retMap.put("plotCode", firstPlotCode + secondPlotCode);
         retMap.put("code", "200");
         retMap.put("code", "200");
         return retMap;
         return retMap;
     }
     }
@@ -202,6 +194,14 @@ public class TakeDataServiceImpl implements TakeDataService {
         //todo 这里进行远程请求,获取相关数据,解析后入库
         //todo 这里进行远程请求,获取相关数据,解析后入库
         LandFirstParamVo body = new LandFirstParamVo(); //这里需要调整
         LandFirstParamVo body = new LandFirstParamVo(); //这里需要调整
         List<String> geomsList = body.getGeoms();
         List<String> geomsList = body.getGeoms();
+
+
+
+
+
+
+
+
         if (CollectionUtils.isEmpty(geomsList)) {
         if (CollectionUtils.isEmpty(geomsList)) {
             throw new ServiceException("geom信息为空");
             throw new ServiceException("geom信息为空");
         }
         }
@@ -241,11 +241,11 @@ public class TakeDataServiceImpl implements TakeDataService {
         }
         }
         //todo 同步完成之后,需要修改t_third_record_status 表的状态值,同步完成;
         //todo 同步完成之后,需要修改t_third_record_status 表的状态值,同步完成;
 
 
-
         return null;
         return null;
     }
     }
 
 
 
 
+
     @Override
     @Override
     public Map<String, Object> remoteHouseFirstRegistration(ThirdRecordStatusParamVo paramVo) {
     public Map<String, Object> remoteHouseFirstRegistration(ThirdRecordStatusParamVo paramVo) {
         String yfbdcdyh = paramVo.getYfbdcdyh();
         String yfbdcdyh = paramVo.getYfbdcdyh();

+ 50 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/utils/HttpClientUtil.java

@@ -177,4 +177,54 @@ public class HttpClientUtil {
         }
         }
         return resultString;
         return resultString;
     }
     }
+
+    /**
+     * 传送json类型的post请求,支持自定义请求头
+     *
+     * @param url
+     * @param json
+     * @param headers
+     * @return String
+     */
+    public static String doPostJson(String url, String json, Map<String, String> headers) {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = null;
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            // 设置自定义请求头
+            if (headers != null) {
+                for (String key : headers.keySet()) {
+                    httpPost.setHeader(key, headers.get(key));
+                }
+            }
+            // 创建请求内容
+            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
+            entity.setContentEncoding("UTF-8");
+            httpPost.setEntity(entity);
+            RequestConfig requestConfig = RequestConfig.custom()
+                    .setConnectionRequestTimeout(10000)
+                    .setConnectTimeout(10000)
+                    .setSocketTimeout(30000).build();
+            httpPost.setConfig(requestConfig);
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (response != null) {
+                    response.close();
+                }
+                httpClient.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return resultString;
+    }
+
 }
 }

+ 68 - 5
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/utils/ServiceUtil.java

@@ -3,19 +3,31 @@ package com.siwei.apply.utils;
 import com.siwei.apply.domain.NodeAttachment;
 import com.siwei.apply.domain.NodeAttachment;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 import java.net.URI;
 import java.net.URI;
 import java.security.MessageDigest;
 import java.security.MessageDigest;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.*;
 
 
+import static com.siwei.common.core.utils.RsaUtil.decryptByPrivateKey;
+import static com.siwei.common.core.utils.RsaUtil.encryptByPublicKey;
+
 /**
 /**
  * 服务类工具
  * 服务类工具
  */
  */
 public class ServiceUtil {
 public class ServiceUtil {
-
     private static final long EXPIRY_TIME = 10 * 60 * 1000;  // 10 minutes in milliseconds
     private static final long EXPIRY_TIME = 10 * 60 * 1000;  // 10 minutes in milliseconds
     private static final String SECRET_KEY = "siwei";  // Secret key for signature
     private static final String SECRET_KEY = "siwei";  // Secret key for signature
     private static final String TIME_KEY = "?time=";  // time
     private static final String TIME_KEY = "?time=";  // time
+    private static final String DOMAIN = "http://192.168.60.219/prod-api/apply";  // doman
+    public static final String THIRD_API_PRIVATE_KEY = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAI1O4yrVG7/Eg1M0G1f/bRDV1ABUpRSSBxvfAxh4dL2W7ApMCz+Krs3xushcQzTOsVuxPGAjgXB906iUEyUJoefnixiKthYV56kzVeXtIw+J1Tbnc1ujTvhWNUkaJYxLCTw+8Z/kASL0XNKImSgzNsB6YQ/ZlYa0kBUEFrs0RBStAgMBAAECgYAxOrqJwZTZSm02H4EnNyWYJ+aj9tlMQVOYsikx7UU+h8XUEIoaqQYdWYnpI7uGOjwv5Z9THwuJVUzX/j5tON3el/eMeOCdnRaSzprY90ceKPr13TezIy6PvyZbH0JRua7Qwu+Klh8GL/6s5lZfs3VAM3qImSE+O86SlL+GbdLiAQJBANF5zA/a8KGkm7yremftARqvfOTy+PQxXXXE7tbWqE5P/t4/feZI45OKoNNId1EGFs4nIS/G+p99AEO80sQNnVUCQQCssUV6h6ddEp3SAVfDSB1Ss0i35kd5GRZT5v+atA9ETAyP37o8ZqnFln1blG95Afp7qy0NcP+ltGCZZftOBdn5AkAv+SXbx7duPYWRKvBolqW3F9ORl3eebSPLUeOk/hojfTyQZ5gMwkqkQo5cdO8mdi+I3PtDtt0042rJGJhoX/nVAkEAqJekGdxHgzDCjJws/wPvRKatDoQtMMdSKfUxgunYobeQ6ADmQ0OC6NhjZ73BGiTZUlSp9h5kJnSzfe626dQCmQJBAM7heHLxlzNY65ziyTp5RkShxmp/yEi6d4cFzZ5/UyFDWW/vphrbKezsKK5rpbFmQjNhFcAk61+O+70J0V8Yoh8=";  // doman
+    public static final String THIRD_API_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCoVP+LpSUfIL6r2nvN/TYOmBGGJT/6vB2Us8Qhk/4ZhmPIo1PE/8ovpdFcNXaYGbtd6/32dkotxFgMxiLdHFHii3EaBL6PXUYHiZWnIRz79gmttHQGDXhOVRGbldNHOZXWBBrek8/GWDk6Z5jgUFhi3K5853JU5fIc8w5TGyVs7wIDAQAB";
+    public static final String THIRD_API_BASE_URL = "http://10.224.1.228:10001/dsp-register-server/dspRegisterService/proxyService/proxyThirdPlatformService";
+
+
+    protected static final Logger logger = LoggerFactory.getLogger(ServiceUtil.class);
     private static final String DOMAIN = "http://10.224.1.227:15000/prod-api/apply";  // doman
     private static final String DOMAIN = "http://10.224.1.227:15000/prod-api/apply";  // doman
 
 
     /**
     /**
@@ -85,10 +97,10 @@ public class ServiceUtil {
                     List<Map<String, String>> list = (List<Map<String, String>>) childMap.get("children");
                     List<Map<String, String>> list = (List<Map<String, String>>) childMap.get("children");
                     for (Map<String, String> map : list) {
                     for (Map<String, String> map : list) {
                         String fileName = map.get("name");
                         String fileName = map.get("name");
-                        if(StringUtils.isNotBlank(fileName)){
+                        if (StringUtils.isNotBlank(fileName)) {
                             String SignedUrl = attachmentId + "/" + childName + "/" + fileName;
                             String SignedUrl = attachmentId + "/" + childName + "/" + fileName;
                             String signedRes = fileUrlSigned(SignedUrl, timestamp);
                             String signedRes = fileUrlSigned(SignedUrl, timestamp);
-                            String path =  DOMAIN+ "/public/offer/download/"+signedRes+"/"+timestamp+"/"+attachmentId+"/"+childName+"/"+fileName;
+                            String path = DOMAIN + "/public/offer/download/" + signedRes + "/" + timestamp + "/" + attachmentId + "/" + childName + "/" + fileName;
                             map.put("path", path);
                             map.put("path", path);
                         }
                         }
                     }
                     }
@@ -98,8 +110,6 @@ public class ServiceUtil {
     }
     }
 
 
 
 
-
-
     // Validate the URL by checking its timestamp and signature
     // Validate the URL by checking its timestamp and signature
     public static boolean isUrlValid222(String url, long originalTimestamp) {
     public static boolean isUrlValid222(String url, long originalTimestamp) {
         try {
         try {
@@ -175,4 +185,57 @@ public class ServiceUtil {
     }
     }
 
 
 
 
+    /**
+     * 使用HttpClient 获取远程加解密数据
+     *
+     * @throws Exception
+     */
+    public static String getRemoteDataByHttpClient(String queryMethod, Map<String, Object> paramMap) throws Exception {
+        // 1. 公钥私钥
+        String privateKey = THIRD_API_PRIVATE_KEY;
+        String publicKey = THIRD_API_PUBLIC_KEY;
+
+        // 2. 三方提供其公钥(这里用我方公钥模拟三方公钥,联调时替换为真实三方公钥)
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String time = sdf.format(new Date());
+
+        // 3. 组装业务数据
+        Map<String, Object> dataMap = new HashMap<>(4);
+        dataMap.putAll(paramMap);
+//        dataMap.put("ywbh", "");
+//        dataMap.put("bdcdyh", "360122011006GB00318F00010001");
+
+        // 4. 对象转 JSON ->  公钥加密  -> URLEncode
+        ObjectMapper mapper = new ObjectMapper();
+        String json = mapper.writeValueAsString(dataMap);
+        logger.info("入参:{} ", json);
+        String encrypted = encryptByPublicKey(publicKey, json);
+        //System.out.println("密文: " + encrypted);
+        logger.info("密文:{} ", encrypted);
+        String payload = encrypted;
+
+        // 6. 设置header参数(含 M方法参数 x-method)
+        Map<String, String> headers = new HashMap<>(16);
+        headers.put("Content-Type", "application/json; charset=UTF-8");
+        headers.put("Accept", "application/json");
+        headers.put("x-area-code", "360100");
+        headers.put("x-industry-code", "FC");
+        headers.put("x-method", queryMethod);
+        headers.put("x-sender-id", "YMGD20260709");
+        headers.put("x-version", "1.0");
+        headers.put("x-timestamp", time);
+        headers.put("x-format", "json");
+
+        // 7. 使用HttpClientUtil 发起远程POST请求
+        String resp = HttpClientUtil.doPostJson(THIRD_API_BASE_URL, payload, headers);
+        //System.out.println("响应原文: " + resp);
+        logger.info("响应原文:{} ", resp);
+        // 8. 用我方私钥解密响应密文
+        String plain = decryptByPrivateKey(privateKey, resp);
+        //System.out.println("响应解密明文: " + plain);
+        logger.info("响应解密明文:{} ", plain);
+        return plain;
+    }
+
+
 }
 }

+ 6 - 1
siwei-modules/siwei-apply/src/main/resources/mapper/GjShijiShouchuMapper.xml

@@ -159,11 +159,13 @@
             "项目名" AS xmmc,
             "项目名" AS xmmc,
             yqsdw AS company,
             yqsdw AS company,
             CAST(gid AS VARCHAR) AS nodeId,
             CAST(gid AS VARCHAR) AS nodeId,
-            ytdyt AS tdyt,
+            COALESCE(ytdyt, '其它') AS tdyt,
             scfs AS gyfs,
             scfs AS gyfs,
             to_timestamp(scsj, 'YYYY/MM/DD') AS gysj,
             to_timestamp(scsj, 'YYYY/MM/DD') AS gysj,
             ROUND("面积_亩", 2) AS mjMu,
             ROUND("面积_亩", 2) AS mjMu,
             bz,
             bz,
+            sccb AS cost,
+            scnd   as nf,
             ST_AsEWKT(geom) AS geom
             ST_AsEWKT(geom) AS geom
         FROM vector.gj_shiji_shouchu
         FROM vector.gj_shiji_shouchu
         WHERE 1=1
         WHERE 1=1
@@ -179,6 +181,9 @@
         <if test="endTime != null and endTime != ''">
         <if test="endTime != null and endTime != ''">
             AND scsj &lt;= #{endTime}
             AND scsj &lt;= #{endTime}
         </if>
         </if>
+        <if test="(startYear != null and startYear != '') and (endYear != null and endYear != '')">
+            AND scnd::NUMERIC BETWEEN #{startYear}::NUMERIC AND #{endYear}::NUMERIC
+        </if>
         order BY "项目名"
         order BY "项目名"
     </select>
     </select>
 
 

+ 4 - 0
siwei-modules/siwei-apply/src/main/resources/mapper/GjShouchuJihuaMapper.xml

@@ -52,6 +52,7 @@
             tdyt,
             tdyt,
             scfs AS gyfs,
             scfs AS gyfs,
             COALESCE(qdrq, TO_DATE(scnd || '-01-01', 'YYYY-MM-DD')) AS gysj,
             COALESCE(qdrq, TO_DATE(scnd || '-01-01', 'YYYY-MM-DD')) AS gysj,
+            sccb AS cost,
             bz,
             bz,
             ST_AsEWKT(geom) AS geom
             ST_AsEWKT(geom) AS geom
         FROM vector.gj_shouchu_jihua
         FROM vector.gj_shouchu_jihua
@@ -69,6 +70,9 @@
                 OR COALESCE(scfs, '') LIKE CONCAT('%', #{keyWord}, '%')
                 OR COALESCE(scfs, '') LIKE CONCAT('%', #{keyWord}, '%')
             )
             )
         </if>
         </if>
+        <if test="(startYear != null and startYear != '') and (endYear != null and endYear != '')">
+            AND scnd::NUMERIC BETWEEN #{startYear}::NUMERIC AND #{endYear}::NUMERIC
+        </if>
         ORDER BY gid
         ORDER BY gid
     </select>
     </select>
 
 

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

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

+ 73 - 27
siwei-modules/siwei-apply/src/main/resources/mapper/ProjectImmobileCodeMapper.xml

@@ -9,7 +9,7 @@
     <resultMap id="BaseResultMap" type="com.siwei.apply.domain.ProjectImmobileCode">
     <resultMap id="BaseResultMap" type="com.siwei.apply.domain.ProjectImmobileCode">
         <id property="id" column="id"/>
         <id property="id" column="id"/>
         <result property="projectId" column="project_id"/>
         <result property="projectId" column="project_id"/>
-        <result property="businessId" column="business_id"/>
+        <result property="sequenceNumber" column="sequence_number"/>
         <result property="code" column="code"/>
         <result property="code" column="code"/>
         <result property="validFlag" column="valid_flag"/>
         <result property="validFlag" column="valid_flag"/>
         <result property="createdAt" column="created_at"/>
         <result property="createdAt" column="created_at"/>
@@ -22,7 +22,7 @@
 
 
     <!-- 基础查询字段 -->
     <!-- 基础查询字段 -->
     <sql id="Base_Column_List">
     <sql id="Base_Column_List">
-        id, project_id, business_id, code, valid_flag, created_at, updated_at,
+        id, project_id, sequence_number, code, valid_flag, created_at, updated_at,
         node_id, geom_db_id, geom_details_id, pre_assign_code
         node_id, geom_db_id, geom_details_id, pre_assign_code
     </sql>
     </sql>
 
 
@@ -40,27 +40,39 @@
         <include refid="Base_Column_List"/>
         <include refid="Base_Column_List"/>
         FROM t_project_immobile_code
         FROM t_project_immobile_code
         WHERE project_id = #{projectId}
         WHERE project_id = #{projectId}
-        AND  valid_flag = 1
+        <if test="validFlag != null and validFlag !='' ">
+            AND  valid_flag = #{validFlag}
+        </if>
     </select>
     </select>
 
 
-    <!-- 根据业务ID查询(只返回一条) -->
-    <select id="selectByBusinessId" resultMap="BaseResultMap" parameterType="String">
+    <!-- 根据序号查询(只返回一条,这里查询表中最大的序列号做为新的编码基数) -->
+    <select id="selectBySequenceNumber" resultMap="BaseResultMap" parameterType="String">
         SELECT
         SELECT
         <include refid="Base_Column_List"/>
         <include refid="Base_Column_List"/>
         FROM t_project_immobile_code
         FROM t_project_immobile_code
-        WHERE business_id = #{businessId}
+        WHERE sequence_number >= #{sequenceNumber}
+        order by sequence_number desc
         LIMIT 1
         LIMIT 1
     </select>
     </select>
 
 
-    <!-- 根据业务ID列表查询 -->
-    <select id="selectByBusinessIdList" resultMap="BaseResultMap" parameterType="List">
+    <select id="selectPreAssignCodeList" resultType="Map">
+        SELECT
+        distinct sequence_number,pre_assign_code
+        FROM t_project_immobile_code
+        WHERE 1=1
+        ORDER BY sequence_number DESC
+        LIMIT ${limit} OFFSET ${offset}
+    </select>
+
+    <!-- 根据序号列表查询 -->
+    <select id="selectBySequenceNumberList" resultMap="BaseResultMap" parameterType="List">
         SELECT
         SELECT
         <include refid="Base_Column_List"/>
         <include refid="Base_Column_List"/>
         FROM t_project_immobile_code
         FROM t_project_immobile_code
         <where>
         <where>
-            <if test="businessIdList != null and businessIdList.size() > 0">
-                AND business_id IN
-                <foreach collection="businessIdList" item="id" open="(" separator="," close=")">
+            <if test="sequenceNumberList != null and sequenceNumberList.size() > 0">
+                AND sequence_number IN
+                <foreach collection="sequenceNumberList" item="id" open="(" separator="," close=")">
                     #{id}
                     #{id}
                 </foreach>
                 </foreach>
             </if>
             </if>
@@ -80,13 +92,39 @@
         LIMIT 1
         LIMIT 1
     </select>
     </select>
 
 
+    <!-- 根据序号列表查询 -->
+    <select id="selectByCondition" resultMap="BaseResultMap"  parameterType="com.siwei.apply.domain.ProjectImmobileCode">
+        SELECT
+        <include refid="Base_Column_List"/>
+        FROM t_project_immobile_code
+        <where>
+            <if test="projectId != null and projectId !=''">
+                AND project_id  = #{projectId}
+            </if>
+            <if test="nodeId != null and nodeId !='' ">
+                AND node_id  = #{nodeId}
+            </if>
+            <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>
+
+
 
 
     <!-- 插入记录 -->
     <!-- 插入记录 -->
     <insert id="insert" parameterType="com.siwei.apply.domain.ProjectImmobileCode">
     <insert id="insert" parameterType="com.siwei.apply.domain.ProjectImmobileCode">
         INSERT INTO t_project_immobile_code (
         INSERT INTO t_project_immobile_code (
             id,
             id,
             project_id,
             project_id,
-            business_id,
+            sequence_number,
             code,
             code,
             valid_flag,
             valid_flag,
             created_at,
             created_at,
@@ -98,9 +136,9 @@
         ) VALUES (
         ) VALUES (
             #{id},
             #{id},
             #{projectId},
             #{projectId},
-            #{businessId},
+            #{sequenceNumber},
             #{code},
             #{code},
-            1,
+            #{validFlag},
             now(),
             now(),
             now(),
             now(),
             #{nodeId},
             #{nodeId},
@@ -110,7 +148,7 @@
         )
         )
     </insert>
     </insert>
 
 
-    <!-- 根据业务ID更新记录(更新 code, valid_flag, updated_at, node_id, geom_db_id, geom_details_id, preAssignCode) -->
+    <!-- 根据序号更新记录(更新 code, valid_flag, updated_at, node_id, geom_db_id, geom_details_id, preAssignCode) -->
     <update id="update" parameterType="com.siwei.apply.domain.ProjectImmobileCode">
     <update id="update" parameterType="com.siwei.apply.domain.ProjectImmobileCode">
         UPDATE t_project_immobile_code
         UPDATE t_project_immobile_code
         SET code = #{code},
         SET code = #{code},
@@ -120,7 +158,7 @@
             geom_db_id = #{geomDbId},
             geom_db_id = #{geomDbId},
             geom_details_id = #{geomDetailsId},
             geom_details_id = #{geomDetailsId},
             pre_assign_code = #{preAssignCode}
             pre_assign_code = #{preAssignCode}
-        WHERE business_id = #{businessId}
+        WHERE sequence_number = #{sequenceNumber}
     </update>
     </update>
 
 
     <!-- 根据ID更新记录(可选字段更新) -->
     <!-- 根据ID更新记录(可选字段更新) -->
@@ -128,7 +166,7 @@
         UPDATE t_project_immobile_code
         UPDATE t_project_immobile_code
         <set>
         <set>
             <if test="projectId != null">project_id = #{projectId},</if>
             <if test="projectId != null">project_id = #{projectId},</if>
-            <if test="businessId != null">business_id = #{businessId},</if>
+            <if test="sequenceNumber != null">sequence_number = #{sequenceNumber},</if>
             <if test="code != null">code = #{code},</if>
             <if test="code != null">code = #{code},</if>
             <if test="validFlag != null">valid_flag = #{validFlag},</if>
             <if test="validFlag != null">valid_flag = #{validFlag},</if>
             <if test="nodeId != null">node_id = #{nodeId},</if>
             <if test="nodeId != null">node_id = #{nodeId},</if>
@@ -145,22 +183,30 @@
         DELETE FROM t_project_immobile_code WHERE project_id = #{projectId}
         DELETE FROM t_project_immobile_code WHERE project_id = #{projectId}
     </delete>
     </delete>
 
 
-    <!-- 根据业务ID删除,且排除指定ID的记录 -->
-    <delete id="deleteByBusinessIdAndIdNotEqual" parameterType="map">
+    <!-- 根据序号删除,且排除指定ID的记录 -->
+    <delete id="deleteBySequenceNumberAndIdNotEqual" parameterType="map">
         DELETE FROM t_project_immobile_code
         DELETE FROM t_project_immobile_code
-        WHERE business_id = #{businessId}
+        WHERE sequence_number = #{sequenceNumber}
           AND id != #{id}
           AND id != #{id}
     </delete>
     </delete>
 
 
-    <!-- 根据业务ID删除 -->
-    <delete id="deleteByBusinessId" parameterType="String">
-        DELETE FROM t_project_immobile_code WHERE business_id = #{businessId}
+    <!-- 根据序号删除 -->
+    <delete id="deleteBySequenceNumber" parameterType="String">
+        DELETE FROM t_project_immobile_code WHERE sequence_number = #{sequenceNumber}
     </delete>
     </delete>
 
 
-
-
-
-
+    <!-- 根据项目ID及nodeId删除 -->
+    <delete id="deleteByProjectIdNodeId" parameterType="String">
+        DELETE FROM t_project_immobile_code
+        <where>
+            <if test="projectId != null and projectId != ''">
+                AND project_id = #{projectId}
+            </if>
+            <if test="nodeId != null and nodeId != ''">
+                AND node_id = #{nodeId}
+            </if>
+        </where>
+    </delete>
 
 
 
 
 
 

Some files were not shown because too many files changed in this diff