ソースを参照

Merge remote-tracking branch 'origin/dev-diji1220' into dev-diji1220

chenendian 3 ヶ月 前
コミット
cdd4729df5

+ 159 - 223
siwei-common/siwei-common-core/src/main/java/com/siwei/common/core/utils/StringUtils.java

@@ -13,197 +13,180 @@ import com.siwei.common.core.text.StrFormatter;
 
 /**
  * 字符串工具类
- * 
+ *
  * @author siwei-zhx
  */
-public class StringUtils extends org.apache.commons.lang3.StringUtils
-{
-    /** 空字符串 */
+public class StringUtils extends org.apache.commons.lang3.StringUtils {
+    /**
+     * 空字符串
+     */
     private static final String NULLSTR = "";
 
-    /** 下划线 */
+    /**
+     * 下划线
+     */
     private static final char SEPARATOR = '_';
 
-    /** 星号 */
+    /**
+     * 星号
+     */
     private static final char ASTERISK = '*';
 
     /**
      * 获取参数不为空值
-     * 
+     *
      * @param value defaultValue 要判断的value
      * @return value 返回值
      */
-    public static <T> T nvl(T value, T defaultValue)
-    {
+    public static <T> T nvl(T value, T defaultValue) {
         return value != null ? value : defaultValue;
     }
 
     /**
      * * 判断一个Collection是否为空, 包含List,Set,Queue
-     * 
+     *
      * @param coll 要判断的Collection
      * @return true:为空 false:非空
      */
-    public static boolean isEmpty(Collection<?> coll)
-    {
+    public static boolean isEmpty(Collection<?> coll) {
         return isNull(coll) || coll.isEmpty();
     }
 
     /**
      * * 判断一个Collection是否非空,包含List,Set,Queue
-     * 
+     *
      * @param coll 要判断的Collection
      * @return true:非空 false:空
      */
-    public static boolean isNotEmpty(Collection<?> coll)
-    {
+    public static boolean isNotEmpty(Collection<?> coll) {
         return !isEmpty(coll);
     }
 
     /**
      * * 判断一个对象数组是否为空
-     * 
+     *
      * @param objects 要判断的对象数组
-     ** @return true:为空 false:非空
+     *                * @return true:为空 false:非空
      */
-    public static boolean isEmpty(Object[] objects)
-    {
+    public static boolean isEmpty(Object[] objects) {
         return isNull(objects) || (objects.length == 0);
     }
 
     /**
      * * 判断一个对象数组是否非空
-     * 
+     *
      * @param objects 要判断的对象数组
      * @return true:非空 false:空
      */
-    public static boolean isNotEmpty(Object[] objects)
-    {
+    public static boolean isNotEmpty(Object[] objects) {
         return !isEmpty(objects);
     }
 
     /**
      * * 判断一个Map是否为空
-     * 
+     *
      * @param map 要判断的Map
      * @return true:为空 false:非空
      */
-    public static boolean isEmpty(Map<?, ?> map)
-    {
+    public static boolean isEmpty(Map<?, ?> map) {
         return isNull(map) || map.isEmpty();
     }
 
     /**
      * * 判断一个Map是否为空
-     * 
+     *
      * @param map 要判断的Map
      * @return true:非空 false:空
      */
-    public static boolean isNotEmpty(Map<?, ?> map)
-    {
+    public static boolean isNotEmpty(Map<?, ?> map) {
         return !isEmpty(map);
     }
 
     /**
      * * 判断一个字符串是否为空串
-     * 
+     *
      * @param str String
      * @return true:为空 false:非空
      */
-    public static boolean isEmpty(String str)
-    {
+    public static boolean isEmpty(String str) {
         return isNull(str) || NULLSTR.equals(str.trim());
     }
 
     /**
      * * 判断一个字符串是否为非空串
-     * 
+     *
      * @param str String
      * @return true:非空串 false:空串
      */
-    public static boolean isNotEmpty(String str)
-    {
+    public static boolean isNotEmpty(String str) {
         return !isEmpty(str);
     }
 
     /**
      * * 判断一个对象是否为空
-     * 
+     *
      * @param object Object
      * @return true:为空 false:非空
      */
-    public static boolean isNull(Object object)
-    {
+    public static boolean isNull(Object object) {
         return object == null;
     }
 
     /**
      * * 判断一个对象是否非空
-     * 
+     *
      * @param object Object
      * @return true:非空 false:空
      */
-    public static boolean isNotNull(Object object)
-    {
+    public static boolean isNotNull(Object object) {
         return !isNull(object);
     }
 
     /**
      * * 判断一个对象是否是数组类型(Java基本型别的数组)
-     * 
+     *
      * @param object 对象
      * @return true:是数组 false:不是数组
      */
-    public static boolean isArray(Object object)
-    {
+    public static boolean isArray(Object object) {
         return isNotNull(object) && object.getClass().isArray();
     }
 
     /**
      * 去空格
      */
-    public static String trim(String str)
-    {
+    public static String trim(String str) {
         return (str == null ? "" : str.trim());
     }
 
     /**
      * 替换指定字符串的指定区间内字符为"*"
      *
-     * @param str 字符串
+     * @param str          字符串
      * @param startInclude 开始位置(包含)
-     * @param endExclude 结束位置(不包含)
+     * @param endExclude   结束位置(不包含)
      * @return 替换后的字符串
      */
-    public static String hide(CharSequence str, int startInclude, int endExclude)
-    {
-        if (isEmpty(str))
-        {
+    public static String hide(CharSequence str, int startInclude, int endExclude) {
+        if (isEmpty(str)) {
             return NULLSTR;
         }
         final int strLength = str.length();
-        if (startInclude > strLength)
-        {
+        if (startInclude > strLength) {
             return NULLSTR;
         }
-        if (endExclude > strLength)
-        {
+        if (endExclude > strLength) {
             endExclude = strLength;
         }
-        if (startInclude > endExclude)
-        {
+        if (startInclude > endExclude) {
             // 如果起始位置大于结束位置,不替换
             return NULLSTR;
         }
         final char[] chars = new char[strLength];
-        for (int i = 0; i < strLength; i++)
-        {
-            if (i >= startInclude && i < endExclude)
-            {
+        for (int i = 0; i < strLength; i++) {
+            if (i >= startInclude && i < endExclude) {
                 chars[i] = ASTERISK;
-            }
-            else
-            {
+            } else {
                 chars[i] = str.charAt(i);
             }
         }
@@ -212,29 +195,24 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
 
     /**
      * 截取字符串
-     * 
-     * @param str 字符串
+     *
+     * @param str   字符串
      * @param start 开始
      * @return 结果
      */
-    public static String substring(final String str, int start)
-    {
-        if (str == null)
-        {
+    public static String substring(final String str, int start) {
+        if (str == null) {
             return NULLSTR;
         }
 
-        if (start < 0)
-        {
+        if (start < 0) {
             start = str.length() + start;
         }
 
-        if (start < 0)
-        {
+        if (start < 0) {
             start = 0;
         }
-        if (start > str.length())
-        {
+        if (start > str.length()) {
             return NULLSTR;
         }
 
@@ -243,44 +221,36 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
 
     /**
      * 截取字符串
-     * 
-     * @param str 字符串
+     *
+     * @param str   字符串
      * @param start 开始
-     * @param end 结束
+     * @param end   结束
      * @return 结果
      */
-    public static String substring(final String str, int start, int end)
-    {
-        if (str == null)
-        {
+    public static String substring(final String str, int start, int end) {
+        if (str == null) {
             return NULLSTR;
         }
 
-        if (end < 0)
-        {
+        if (end < 0) {
             end = str.length() + end;
         }
-        if (start < 0)
-        {
+        if (start < 0) {
             start = str.length() + start;
         }
 
-        if (end > str.length())
-        {
+        if (end > str.length()) {
             end = str.length();
         }
 
-        if (start > end)
-        {
+        if (start > end) {
             return NULLSTR;
         }
 
-        if (start < 0)
-        {
+        if (start < 0) {
             start = 0;
         }
-        if (end < 0)
-        {
+        if (end < 0) {
             end = 0;
         }
 
@@ -289,22 +259,18 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
 
     /**
      * 判断是否为空,并且不是空白字符
-     * 
+     *
      * @param str 要判断的value
      * @return 结果
      */
-    public static boolean hasText(String str)
-    {
+    public static boolean hasText(String str) {
         return (str != null && !str.isEmpty() && containsText(str));
     }
 
-    private static boolean containsText(CharSequence str)
-    {
+    private static boolean containsText(CharSequence str) {
         int strLen = str.length();
-        for (int i = 0; i < strLen; i++)
-        {
-            if (!Character.isWhitespace(str.charAt(i)))
-            {
+        for (int i = 0; i < strLen; i++) {
+            if (!Character.isWhitespace(str.charAt(i))) {
                 return true;
             }
         }
@@ -319,15 +285,13 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
      * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
      * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
      * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
-     * 
+     *
      * @param template 文本模板,被替换的部分用 {} 表示
-     * @param params 参数值
+     * @param params   参数值
      * @return 格式化后的文本
      */
-    public static String format(String template, Object... params)
-    {
-        if (isEmpty(params) || isEmpty(template))
-        {
+    public static String format(String template, Object... params) {
+        if (isEmpty(params) || isEmpty(template)) {
             return template;
         }
         return StrFormatter.format(template, params);
@@ -335,12 +299,11 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
 
     /**
      * 是否为http(s)://开头
-     * 
+     *
      * @param link 链接
      * @return 结果
      */
-    public static boolean ishttp(String link)
-    {
+    public static boolean ishttp(String link) {
         return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS);
     }
 
@@ -348,21 +311,15 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
      * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value
      *
      * @param collection 给定的集合
-     * @param array 给定的数组
+     * @param array      给定的数组
      * @return boolean 结果
      */
-    public static boolean containsAny(Collection<String> collection, String... array)
-    {
-        if (isEmpty(collection) || isEmpty(array))
-        {
+    public static boolean containsAny(Collection<String> collection, String... array) {
+        if (isEmpty(collection) || isEmpty(array)) {
             return false;
-        }
-        else
-        {
-            for (String str : array)
-            {
-                if (collection.contains(str))
-                {
+        } else {
+            for (String str : array) {
+                if (collection.contains(str)) {
                     return true;
                 }
             }
@@ -373,10 +330,8 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
     /**
      * 驼峰转下划线命名
      */
-    public static String toUnderScoreCase(String str)
-    {
-        if (str == null)
-        {
+    public static String toUnderScoreCase(String str) {
+        if (str == null) {
             return null;
         }
         StringBuilder sb = new StringBuilder();
@@ -386,31 +341,23 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
         boolean curreCharIsUpperCase = true;
         // 下一字符是否大写
         boolean nexteCharIsUpperCase = true;
-        for (int i = 0; i < str.length(); i++)
-        {
+        for (int i = 0; i < str.length(); i++) {
             char c = str.charAt(i);
-            if (i > 0)
-            {
+            if (i > 0) {
                 preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
-            }
-            else
-            {
+            } else {
                 preCharIsUpperCase = false;
             }
 
             curreCharIsUpperCase = Character.isUpperCase(c);
 
-            if (i < (str.length() - 1))
-            {
+            if (i < (str.length() - 1)) {
                 nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
             }
 
-            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase)
-            {
+            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) {
                 sb.append(SEPARATOR);
-            }
-            else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase)
-            {
+            } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) {
                 sb.append(SEPARATOR);
             }
             sb.append(Character.toLowerCase(c));
@@ -421,19 +368,15 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
 
     /**
      * 是否包含字符串
-     * 
-     * @param str 验证字符串
+     *
+     * @param str  验证字符串
      * @param strs 字符串组
      * @return 包含返回true
      */
-    public static boolean inStringIgnoreCase(String str, String... strs)
-    {
-        if (str != null && strs != null)
-        {
-            for (String s : strs)
-            {
-                if (str.equalsIgnoreCase(trim(s)))
-                {
+    public static boolean inStringIgnoreCase(String str, String... strs) {
+        if (str != null && strs != null) {
+            for (String s : strs) {
+                if (str.equalsIgnoreCase(trim(s))) {
                     return true;
                 }
             }
@@ -443,31 +386,25 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
 
     /**
      * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
-     * 
+     *
      * @param name 转换前的下划线大写方式命名的字符串
      * @return 转换后的驼峰式命名的字符串
      */
-    public static String convertToCamelCase(String name)
-    {
+    public static String convertToCamelCase(String name) {
         StringBuilder result = new StringBuilder();
         // 快速检查
-        if (name == null || name.isEmpty())
-        {
+        if (name == null || name.isEmpty()) {
             // 没必要转换
             return "";
-        }
-        else if (!name.contains("_"))
-        {
+        } else if (!name.contains("_")) {
             // 不含下划线,仅将首字母大写
             return name.substring(0, 1).toUpperCase() + name.substring(1);
         }
         // 用下划线将原始字符串分割
         String[] camels = name.split("_");
-        for (String camel : camels)
-        {
+        for (String camel : camels) {
             // 跳过原始字符串中开头、结尾的下换线或双重下划线
-            if (camel.isEmpty())
-            {
+            if (camel.isEmpty()) {
                 continue;
             }
             // 首字母大写
@@ -481,34 +418,25 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
      * 驼峰式命名法
      * 例如:user_name->userName
      */
-    public static String toCamelCase(String s)
-    {
-        if (s == null)
-        {
+    public static String toCamelCase(String s) {
+        if (s == null) {
             return null;
         }
-        if (s.indexOf(SEPARATOR) == -1)
-        {
+        if (s.indexOf(SEPARATOR) == -1) {
             return s;
         }
         s = s.toLowerCase();
         StringBuilder sb = new StringBuilder(s.length());
         boolean upperCase = false;
-        for (int i = 0; i < s.length(); i++)
-        {
+        for (int i = 0; i < s.length(); i++) {
             char c = s.charAt(i);
 
-            if (c == SEPARATOR)
-            {
+            if (c == SEPARATOR) {
                 upperCase = true;
-            }
-            else if (upperCase)
-            {
+            } else if (upperCase) {
                 sb.append(Character.toUpperCase(c));
                 upperCase = false;
-            }
-            else
-            {
+            } else {
                 sb.append(c);
             }
         }
@@ -517,21 +445,17 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
 
     /**
      * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串
-     * 
-     * @param str 指定字符串
+     *
+     * @param str  指定字符串
      * @param strs 需要检查的字符串数组
      * @return 是否匹配
      */
-    public static boolean matches(String str, List<String> strs)
-    {
-        if (isEmpty(str) || isEmpty(strs))
-        {
+    public static boolean matches(String str, List<String> strs) {
+        if (isEmpty(str) || isEmpty(strs)) {
             return false;
         }
-        for (String pattern : strs)
-        {
-            if (isMatch(pattern, str))
-            {
+        for (String pattern : strs) {
+            if (isMatch(pattern, str)) {
                 return true;
             }
         }
@@ -539,70 +463,58 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
     }
 
     /**
-     * 判断url是否与规则配置: 
-     * ? 表示单个字符; 
-     * * 表示一层路径内的任意字符串,不可跨层级; 
+     * 判断url是否与规则配置:
+     * ? 表示单个字符;
+     * * 表示一层路径内的任意字符串,不可跨层级;
      * ** 表示任意层路径;
-     * 
+     *
      * @param pattern 匹配规则
-     * @param url 需要匹配的url
+     * @param url     需要匹配的url
      * @return
      */
-    public static boolean isMatch(String pattern, String url)
-    {
+    public static boolean isMatch(String pattern, String url) {
         AntPathMatcher matcher = new AntPathMatcher();
         return matcher.match(pattern, url);
     }
 
     @SuppressWarnings("unchecked")
-    public static <T> T cast(Object obj)
-    {
+    public static <T> T cast(Object obj) {
         return (T) obj;
     }
 
     /**
      * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。
-     * 
-     * @param num 数字对象
+     *
+     * @param num  数字对象
      * @param size 字符串指定长度
      * @return 返回数字的字符串格式,该字符串为指定长度。
      */
-    public static final String padl(final Number num, final int size)
-    {
+    public static final String padl(final Number num, final int size) {
         return padl(num.toString(), size, '0');
     }
 
     /**
      * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。
-     * 
-     * @param s 原始字符串
+     *
+     * @param s    原始字符串
      * @param size 字符串指定长度
-     * @param c 用于补齐的字符
+     * @param c    用于补齐的字符
      * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。
      */
-    public static final String padl(final String s, final int size, final char c)
-    {
+    public static final String padl(final String s, final int size, final char c) {
         final StringBuilder sb = new StringBuilder(size);
-        if (s != null)
-        {
+        if (s != null) {
             final int len = s.length();
-            if (s.length() <= size)
-            {
-                for (int i = size - len; i > 0; i--)
-                {
+            if (s.length() <= size) {
+                for (int i = size - len; i > 0; i--) {
                     sb.append(c);
                 }
                 sb.append(s);
-            }
-            else
-            {
+            } else {
                 return s.substring(len - size, len);
             }
-        }
-        else
-        {
-            for (int i = size; i > 0; i--)
-            {
+        } else {
+            for (int i = size; i > 0; i--) {
                 sb.append(c);
             }
         }
@@ -637,5 +549,29 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
         return getUUID() + "_" + new SimpleDateFormat("yyyyMMddHHmmssms").format(new Date());
     }
 
+    /**
+     * 获取文件转发地址
+     *
+     * @param filename
+     * @param temp
+     * @return
+     */
+    public static String getFileStaticPath(String filename, String temp) {
+        filename = filename.replaceAll("\\\\", "/");
+        return filename.replace(temp.replaceAll("\\\\", "/"), "/file/statics/");
+    }
+
+    /**
+     * 获取文件绝对地址
+     *
+     * @param filename
+     * @param temp
+     * @return
+     */
+    public static String getFileAbsolutePath(String filename, String temp) {
+        filename = filename.replaceAll("\\\\", "/");
+        return filename.replace("/file/statics/", temp.replaceAll("\\\\", "/"));
+    }
+
 
 }

+ 10 - 1
siwei-modules/siwei-apply/pom.xml

@@ -90,7 +90,16 @@
             <artifactId>httpclient</artifactId>
             <version>4.5.6</version>
         </dependency>
-
+        <dependency>
+            <groupId>org.apache.ant</groupId>
+            <artifactId>ant</artifactId>
+            <version>1.10.5</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>31.1-jre</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 130 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/controller/ThematicController.java

@@ -0,0 +1,130 @@
+package com.siwei.apply.controller;
+
+
+import com.siwei.apply.service.*;
+import com.siwei.common.core.domain.R;
+import com.siwei.common.core.web.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.net.http.HttpResponse;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 专题图制图 控制器
+ */
+@RestController
+@RequestMapping("/thematic")
+public class ThematicController extends BaseController {
+    @Autowired
+    private ThematicService thematicService;
+
+    /**
+     * 查询专题图制图任务列表
+     *
+     * @param name  制图名称
+     * @param rwlx  任务类型  同字典表 ztlx
+     * @param page  页码
+     * @param limit 每页条数
+     * @return
+     */
+    @PostMapping("/list")
+    public R<Object> list(String name, String rwlx, Integer page, Integer limit) {
+        try {
+            R<Object> res = thematicService.list(name, rwlx, page, limit);
+            return res;
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+    }
+
+    /**
+     * 删除专题图制图任务
+     *
+     * @param id   制图任务id
+     * @param type 删除类型 1 : 仅删除任务记录  2:删除任务记录和制图成果
+     * @return
+     */
+    @PostMapping("/drop")
+    public R<Object> drop(String id, String type) {
+        try {
+            R<Object> res = thematicService.drop(id, type);
+            return res;
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+    }
+
+    /**
+     * 执行专题图制图任务
+     *
+     * @param name 制图名称
+     * @param rwlx 任务类型  同字典表 ztlx
+     * @param ztfw 制图范围
+     * @param ztry 制图人员
+     * @return
+     */
+    @PostMapping("/launch")
+    public R<Object> launch(String name, String rwlx, String ztfw, String ztry) {
+        try {
+            R<Object> res = thematicService.launch(name, rwlx, ztfw, ztry);
+            return res;
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+    }
+
+    /**
+     * 查询专题图产品列表
+     *
+     * @param name   名称
+     * @param taskid 任务id
+     * @param page   页码
+     * @param limit  每页条数
+     * @return
+     */
+    @PostMapping("/productList")
+    public R<Object> productList(String name, String taskid, Integer page, Integer limit) {
+        try {
+            R<Object> res = thematicService.productlist(name, taskid, page, limit);
+            return res;
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+    }
+
+    /**
+     * 下载专题图产品集合
+     *
+     * @param ids      id集合
+     * @param response
+     * @return
+     */
+    @RequestMapping("/productDownload")
+    public R<Object> productDownload(String ids, HttpServletResponse response) {
+        try {
+            R<Object> res = thematicService.productDownload(ids, response);
+            return res;
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+    }
+
+    /**
+     * 专题图产品删除
+     *
+     * @param id
+     * @return
+     */
+    @RequestMapping("/productDelete")
+    public R<Object> productDelete(String id) {
+        try {
+            R<Object> res = thematicService.productDelete(id);
+            return res;
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+    }
+}

+ 37 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/domain/ThematicDetails.java

@@ -0,0 +1,37 @@
+package com.siwei.apply.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 专题图制图任务 t_thematic_details
+ */
+@Data
+public class ThematicDetails extends BaseId {
+    /**
+     * id
+     */
+    private String id;
+    /**
+     * 产品名称
+     */
+    private String name;
+    /**
+     * 任务id
+     */
+    private String taskid;
+    /**
+     * 备注  详情
+     */
+    private String msg;
+    /**
+     * 文件 路径
+     */
+    private String filepath;
+    /**
+     * 创建时间
+     */
+    private String cjsj;
+}

+ 59 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/domain/ThematicTask.java

@@ -0,0 +1,59 @@
+package com.siwei.apply.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 专题图制图任务 t_thematic_task
+ */
+@Data
+public class ThematicTask extends BaseId {
+    /**
+     * id
+     */
+    private String id;
+    /**
+     * 制图任务名称
+     */
+    private String name;
+    /**
+     * 任务状态 0 创建 1 执行中 2 成功 3 失败
+     */
+    private String rwzt;
+    /**
+     * 任务类型 1 分幅地籍图 2 自定义地籍图 3 宗地图
+     */
+    private String rwlx;
+    /**
+     * 制图范围 用geojson或者wkt
+     */
+    private String ztfw;
+    /**
+     * 备注  详情
+     */
+    private String msg;
+
+    /**
+     * 制图人员
+     */
+    private String ztry;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date cjsj;
+    /**
+     * 开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date rwkssj;
+
+    /**
+     * 结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date rwjssj;
+}

+ 38 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/mapper/ThematicMapper.java

@@ -0,0 +1,38 @@
+package com.siwei.apply.mapper;
+
+import com.siwei.apply.domain.LandType;
+import com.siwei.apply.domain.ThematicDetails;
+import com.siwei.apply.domain.ThematicTask;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface ThematicMapper {
+
+    List<ThematicTask> list(@Param("name") String name, @Param("rwlx") String rwlx, @Param("offset") Integer offset, @Param("limit") Integer limit, @Param("id") String id);
+
+    Integer count(@Param("name") String name, @Param("rwlx") String rwlx);
+
+    List<ThematicDetails> productlist(@Param("name") String name, @Param("taskid") String taskid, @Param("offset") Integer offset, @Param("limit") Integer limit);
+
+    Integer productlistcount(@Param("name") String name, @Param("taskid") String taskid);
+
+    List<ThematicDetails> productbyid(@Param("ids") String ids);
+
+    void productDelete(@Param("id") String id);
+
+    void addRw(@Param("uuid") String uuid, @Param("name") String name, @Param("rwlx") String rwlx, @Param("ztfw") String ztfw, @Param("ztry") String ztry);
+
+    void updateRwzt(@Param("uuid") String uuid, @Param("rwzt") String rwzt);
+
+    void updateRwzt2(@Param("uuid") String uuid, @Param("rwzt") String rwzt);
+
+    void addDetails(@Param("id") String id, @Param("uuid") String uuid, @Param("name") String name, @Param("filepath") String filepath, @Param("cjsj") String cjsj);
+
+    String productFile(@Param("id") String id);
+
+    void drop(@Param("id") String id);
+}
+

+ 37 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/ThematicService.java

@@ -0,0 +1,37 @@
+package com.siwei.apply.service;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.siwei.apply.domain.Project;
+import com.siwei.apply.domain.ProjectWorkflow;
+import com.siwei.apply.domain.res.ProjectCycleRes;
+import com.siwei.apply.domain.res.ProjectOverviewRes;
+import com.siwei.apply.domain.vo.NodeVo;
+import com.siwei.apply.domain.vo.ProjectFilterVo;
+import com.siwei.apply.domain.vo.ProjectUpdateVo;
+import com.siwei.apply.domain.vo.ProjectVo;
+import com.siwei.common.core.domain.R;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.http.HttpResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 专题制图
+ */
+public interface ThematicService {
+
+    R<Object> list(String name, String rwlx, Integer page, Integer limit);
+
+    R<Object> productlist(String name, String taskid, Integer page, Integer limit);
+
+    R<Object> productDownload(String ids, HttpServletResponse response);
+
+    R<Object> productDelete(String id);
+
+    R<Object> launch(String name, String rwlx, String ztfw, String ztry);
+
+    R<Object> drop(String id, String type);
+}
+

+ 200 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/service/impl/ThematicImpl.java

@@ -0,0 +1,200 @@
+package com.siwei.apply.service.impl;
+
+import com.siwei.apply.domain.*;
+import com.siwei.apply.mapper.*;
+import com.siwei.apply.service.ThematicService;
+import com.siwei.apply.utils.DownloadUtils;
+import com.siwei.apply.utils.FixedThreadUtil;
+import com.siwei.common.core.domain.R;
+import com.siwei.common.core.utils.StringUtils;
+import com.siwei.common.core.utils.file.FileUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.http.HttpResponse;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 专题制图
+ */
+@Service
+public class ThematicImpl implements ThematicService {
+    //默认参数配置
+    private Integer page_default = 1; //页码
+    private Integer limit_default = 10; //每页条数
+    @Resource
+    private ThematicMapper thematicMapper;
+    @Value("${temp}")
+    private String temppath;
+    @Value("${python.home}")
+    private String pythonHome;
+    @Value("${python.cadastralmap}")
+    private String cadastralmapPy;
+    @Value("${python.parcelmap}")
+    private String parcelmapPy;
+
+    @Override
+    public R<Object> list(String name, String rwlx, Integer page, Integer limit) {
+        try {
+            if (page == null) {
+                page = page_default;
+            }
+            if (limit == null) {
+                limit = limit_default;
+            }
+            Integer offset = (page - 1) * limit;
+            List<ThematicTask> datas = thematicMapper.list(name, rwlx, offset, limit, null);
+            Integer count = thematicMapper.count(name, rwlx);
+            Map<String, Object> map = new HashMap<>();
+            map.put("count", count);
+            map.put("data", datas);
+            return R.ok(map, "查询成功!");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return R.fail("查询失败!");
+    }
+
+    @Override
+    public R<Object> drop(String id, String type) {
+        try {
+            List<ThematicTask> datas = thematicMapper.list(null, null, null, null, id);
+            if (datas != null && datas.size() > 0) {
+                thematicMapper.drop(id);
+                if ("1".equals(type)) { //仅删除任务记录
+
+                } else if ("2".equals(type)) { //删除任务记录和制图成果
+                    String filepath = thematicMapper.productFile(id);
+                    File file = new File(filepath);
+                    org.apache.commons.io.FileUtils.deleteDirectory(file.getParentFile());
+                    thematicMapper.productDelete(id);
+                }
+            } else {
+                return R.fail("id参数有误!");
+            }
+            return R.ok(null, "删除成功!");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return R.fail("删除失败!");
+    }
+
+    @Override
+    public R<Object> launch(String name, String rwlx, String ztfw, String ztry) {
+        String uuid = StringUtils.getUUID();
+        // 插入制图任务表
+        thematicMapper.addRw(uuid, name, rwlx, ztfw, ztry);
+        // 判断需要执行的python脚本
+        String pyPath = "";
+        if ("1".equals(rwlx)) {
+            pyPath = cadastralmapPy;
+        } else if ("3".equals(rwlx)) {
+            pyPath = parcelmapPy;
+        }
+        String finalPyPath = pyPath;
+        // 异步线程执行分析
+        FixedThreadUtil.FIXED_THREAD_POOL.execute(() -> {
+            try {
+                // 更新状态为运行中
+                thematicMapper.updateRwzt(uuid, "1");
+                //TODO command ProcessBuilder
+                ProcessBuilder pb = new ProcessBuilder(pythonHome, finalPyPath);
+                pb.redirectErrorStream(true);
+                Process process = null;
+                process = pb.start();
+                BufferedReader reader = new BufferedReader(
+                        new InputStreamReader(process.getInputStream()));
+                String line;
+                ArrayList<String> datas = new ArrayList<>();
+                while ((line = reader.readLine()) != null) {
+                    if (StringUtils.isNotEmpty(line)) {
+                        if (line.contains("||")) {
+                            datas.add(line.split("ERROR")[0]);
+                        }
+                    }
+                }
+                if (datas.size() > 0) {
+                    // 更新状态为成功
+                    thematicMapper.updateRwzt2(uuid, "2");
+                    for (String cur : datas) {
+                        String[] args = cur.split("\\|\\|");
+                        String id = StringUtils.getUUID();
+                        // 插入制图产品表
+                        thematicMapper.addDetails(id, uuid, args[0], args[1], args[2]);
+                    }
+                } else {
+                    // 更新状态为失败
+                    thematicMapper.updateRwzt2(uuid, "3");
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+        });
+        return R.ok("制图任务创建成功!");
+    }
+
+    @Override
+    public R<Object> productlist(String name, String taskid, Integer page, Integer limit) {
+        try {
+            if (page == null) {
+                page = page_default;
+            }
+            if (limit == null) {
+                limit = limit_default;
+            }
+            Integer offset = (page - 1) * limit;
+            List<ThematicDetails> datas = thematicMapper.productlist(name, taskid, offset, limit);
+            for (ThematicDetails cur : datas) {
+                cur.setFilepath(StringUtils.getFileStaticPath(cur.getFilepath(), temppath));
+            }
+            Integer count = thematicMapper.productlistcount(name, taskid);
+            Map<String, Object> map = new HashMap<>();
+            map.put("count", count);
+            map.put("data", datas);
+            return R.ok(map, "查询成功!");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return R.fail("查询失败!");
+    }
+
+    @Override
+    public R<Object> productDownload(String ids, HttpServletResponse response) {
+        try {
+            List<ThematicDetails> datas = thematicMapper.productbyid(ids);
+            ArrayList<String> files = new ArrayList<>();
+            for (ThematicDetails cur : datas) {
+                files.add(cur.getFilepath());
+            }
+            DownloadUtils.DownloadZip(response, files, "download");
+            return R.ok(1, "下载成功!");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return R.fail("查询失败!");
+    }
+
+    @Override
+    public R<Object> productDelete(String id) {
+        try {
+            String filepath = thematicMapper.productFile(id);
+            FileUtils.deleteFile(filepath);
+            thematicMapper.productDelete(id);
+            return R.ok(1, "删除成功!");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return R.fail("查询失败!");
+    }
+}

+ 48 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/utils/DownloadUtils.java

@@ -0,0 +1,48 @@
+package com.siwei.apply.utils;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * 下载工具类
+ */
+public class DownloadUtils {
+    /**
+     * 将所有文件打包成zip并下载
+     *
+     * @param response
+     * @param files    文件地址集合
+     * @param filename zip的文件名
+     */
+    public static void DownloadZip(HttpServletResponse response, ArrayList<String> files, String filename) {
+        ZipOutputStream zipOutputStream = null;
+        try {
+            response.setHeader("Content-Disposition", "attachment;filename=" + new String((filename + ".zip").getBytes("UTF-8"), "ISO-8859-1"));  // 需要编z码否则中文乱码
+            response.setContentType("application/zip;charset=utf-8");
+            response.setCharacterEncoding("UTF-8");
+            // 直接返回zip输出流不生成临时文件。
+            zipOutputStream = new ZipOutputStream(response.getOutputStream());
+            for (String path : files) {
+                File file = new File(path);
+                if (file.exists()) {
+                    byte[] readAllBytes = Files.readAllBytes(file.toPath());
+                    org.apache.tools.zip.ZipEntry zipEntry = new org.apache.tools.zip.ZipEntry(file.getName());
+                    zipOutputStream.putNextEntry(zipEntry);
+                    zipOutputStream.write(readAllBytes);
+                }
+            }
+            zipOutputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                zipOutputStream.close();
+            } catch (Exception e) {
+
+            }
+        }
+    }
+}

+ 43 - 0
siwei-modules/siwei-apply/src/main/java/com/siwei/apply/utils/FixedThreadUtil.java

@@ -0,0 +1,43 @@
+package com.siwei.apply.utils;
+
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 异步线程池
+ *
+ * @author wanger
+ **/
+public class FixedThreadUtil {
+
+    private FixedThreadUtil() {
+
+    }
+
+
+    /**
+     * 线程数
+     */
+    private static final int N_CPUS = Runtime.getRuntime().availableProcessors();
+    /**
+     * 使用 ThreadFactoryBuilder 创建自定义线程名称的 ThreadFactory
+     */
+    private static final ThreadFactory NAMED_THREAD_FACTORY = new ThreadFactoryBuilder()
+            .setNameFormat("hyn-demo-pool-%d").build();
+    /**
+     * 创建线程池,其中任务队列需要结合实际情况设置合理的容量  消费大数据kafka
+     */
+    public static final ThreadPoolExecutor FIXED_THREAD_POOL = new ThreadPoolExecutor(N_CPUS,
+            N_CPUS * 2,
+            0L,
+            TimeUnit.MILLISECONDS,
+            new LinkedBlockingQueue<>(10240),
+            NAMED_THREAD_FACTORY,
+            new ThreadPoolExecutor.CallerRunsPolicy());
+
+
+}

+ 91 - 0
siwei-modules/siwei-apply/src/main/resources/mapper/ThematicMapper.xml

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.siwei.apply.mapper.ThematicMapper">
+
+    <select id="list" resultType="com.siwei.apply.domain.ThematicTask">
+        select * from t_thematic_task where 1 = 1
+        <if test="name != null and name != ''">
+            and name like '%'||#{name}||'%'
+        </if>
+        <if test="rwlx != null and rwlx != ''">
+            and rwlx = #{rwlx}
+        </if>
+        <if test="id != null and id != ''">
+            and id = #{id}
+        </if>
+        <if test="limit != null">
+            limit ${limit}
+        </if>
+        <if test="offset != null">
+            offset ${offset}
+        </if>
+    </select>
+
+    <select id="count" resultType="java.lang.Integer">
+        select count(1) from t_thematic_task where 1 = 1
+        <if test="name != null and name != ''">
+            and name like '%'||#{name}||'%'
+        </if>
+        <if test="rwlx != null and rwlx != ''">
+            and rwlx = #{rwlx}
+        </if>
+    </select>
+
+    <delete id="drop">
+        delete from t_thematic_task where id = #{id}
+    </delete>
+
+    <select id="productlist" resultType="com.siwei.apply.domain.ThematicDetails">
+        select * from t_thematic_details where 1 = 1
+        <if test="name != null and name != ''">
+            and name like '%'||#{name}||'%'
+        </if>
+        <if test="taskid != null and taskid != ''">
+            and taskid = #{taskid}
+        </if>
+        limit ${limit} offset ${offset}
+    </select>
+
+    <select id="productlistcount" resultType="java.lang.Integer">
+        select count(1) from t_thematic_details where 1 = 1
+        <if test="name != null and name != ''">
+            and name like '%'||#{name}||'%'
+        </if>
+        <if test="taskid != null and taskid != ''">
+            and taskid = #{taskid}
+        </if>
+    </select>
+
+    <select id="productbyid" resultType="com.siwei.apply.domain.ThematicDetails" parameterType="java.lang.String">
+        select * from t_thematic_details where id in (
+        SELECT unnest(string_to_array(#{ids}, ','))
+        )
+    </select>
+
+    <select id="productFile" parameterType="java.lang.String" resultType="java.lang.String">
+        select filepath from t_thematic_details where id = #{id} or taskid = #{id} limit 1
+    </select>
+
+    <delete id="productDelete" parameterType="java.lang.String">
+        delete from t_thematic_details where id = #{id} or taskid = #{id}
+    </delete>
+
+    <insert id="addRw" parameterType="java.lang.String">
+        insert into t_thematic_task (id , name , cjsj , rwzt , rwlx , ztfw, ztry) values
+        (#{uuid} , #{name} ,CURRENT_TIMESTAMP , '0' , #{rwlx}, #{ztfw}, #{ztry} )
+    </insert>
+
+    <update id="updateRwzt" parameterType="java.lang.String">
+        update t_thematic_task set rwzt = #{rwzt} ,rwkssj = CURRENT_TIMESTAMP where id = #{uuid}
+    </update>
+
+    <update id="updateRwzt2" parameterType="java.lang.String">
+        update t_thematic_task set rwzt = #{rwzt} ,rwjssj = CURRENT_TIMESTAMP where id = #{uuid}
+    </update>
+
+    <insert id="addDetails" parameterType="java.lang.String">
+        insert into t_thematic_details (id , taskid , name , cjsj , filepath) values
+        (#{id}, #{uuid}, #{name} ,#{cjsj} , #{filepath} )
+    </insert>
+
+</mapper>