浏览代码

2022年9月9日17:37:54

纪新园 3 年之前
父节点
当前提交
63fee6db2c
共有 18 个文件被更改,包括 2135 次插入18 次删除
  1. 6 0
      blade-common/pom.xml
  2. 33 0
      blade-common/src/main/java/org/springblade/common/config/ServerConfig.java
  3. 0 1
      blade-common/src/main/java/org/springblade/common/utils/BarCodeTest.java
  4. 85 0
      blade-common/src/main/java/org/springblade/common/utils/CharsetKit.java
  5. 999 0
      blade-common/src/main/java/org/springblade/common/utils/Convert.java
  6. 136 0
      blade-common/src/main/java/org/springblade/common/utils/ServletUtils.java
  7. 90 0
      blade-common/src/main/java/org/springblade/common/utils/StrFormatter.java
  8. 482 0
      blade-common/src/main/java/org/springblade/common/utils/StringUtils.java
  9. 1 1
      blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/order/entity/OrderItems.java
  10. 59 0
      blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/order/vo/OrderTotalDTO.java
  11. 1 1
      blade-service/blade-client/src/main/java/org/springblade/client/goods/service/impl/GoodsDescServiceImpl.java
  12. 1 1
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/controller/OrderController.java
  13. 2 1
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderMapper.xml
  14. 31 3
      blade-service/trade-purchase/src/main/java/com/trade/purchase/order/controller/WoodHarvestingCloudController.java
  15. 18 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/order/mapper/OrderMapper.java
  16. 131 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/order/mapper/OrderMapper.xml
  17. 17 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/order/service/IOrderService.java
  18. 43 10
      blade-service/trade-purchase/src/main/java/com/trade/purchase/order/service/impl/OrderServiceImpl.java

+ 6 - 0
blade-common/pom.xml

@@ -35,6 +35,12 @@
             <version>2.1</version>
         </dependency>
 
+        <!--常用工具类 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+
 
         <dependency>
             <groupId>org.springblade</groupId>

+ 33 - 0
blade-common/src/main/java/org/springblade/common/config/ServerConfig.java

@@ -0,0 +1,33 @@
+package org.springblade.common.config;
+
+import org.springblade.common.utils.ServletUtils;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 服务相关配置
+ *
+ * @author ruoyi
+ */
+@Component
+public class ServerConfig
+{
+    /**
+     * 获取完整的请求路径,包括:域名,端口,上下文访问路径
+     *
+     * @return 服务地址
+     */
+    public String getUrl()
+    {
+        HttpServletRequest request = ServletUtils.getRequest();
+        return getDomain(request);
+    }
+
+    public static String getDomain(HttpServletRequest request)
+    {
+        StringBuffer url = request.getRequestURL();
+        String contextPath = request.getServletContext().getContextPath();
+        return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString();
+    }
+}

+ 0 - 1
blade-common/src/main/java/org/springblade/common/utils/BarCodeTest.java

@@ -52,7 +52,6 @@ public class BarCodeTest {
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-
 		return file.getAbsolutePath();
 	}
 

+ 85 - 0
blade-common/src/main/java/org/springblade/common/utils/CharsetKit.java

@@ -0,0 +1,85 @@
+package org.springblade.common.utils;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 字符集工具类
+ *
+ * @author ruoyi
+ */
+public class CharsetKit
+{
+    /** ISO-8859-1 */
+    public static final String ISO_8859_1 = "ISO-8859-1";
+    /** UTF-8 */
+    public static final String UTF_8 = "UTF-8";
+    /** GBK */
+    public static final String GBK = "GBK";
+
+    /** ISO-8859-1 */
+    public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1);
+    /** UTF-8 */
+    public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8);
+    /** GBK */
+    public static final Charset CHARSET_GBK = Charset.forName(GBK);
+
+    /**
+     * 转换为Charset对象
+     *
+     * @param charset 字符集,为空则返回默认字符集
+     * @return Charset
+     */
+    public static Charset charset(String charset)
+    {
+        return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
+    }
+
+    /**
+     * 转换字符串的字符集编码
+     *
+     * @param source 字符串
+     * @param srcCharset 源字符集,默认ISO-8859-1
+     * @param destCharset 目标字符集,默认UTF-8
+     * @return 转换后的字符集
+     */
+    public static String convert(String source, String srcCharset, String destCharset)
+    {
+        return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
+    }
+
+    /**
+     * 转换字符串的字符集编码
+     *
+     * @param source 字符串
+     * @param srcCharset 源字符集,默认ISO-8859-1
+     * @param destCharset 目标字符集,默认UTF-8
+     * @return 转换后的字符集
+     */
+    public static String convert(String source, Charset srcCharset, Charset destCharset)
+    {
+        if (null == srcCharset)
+        {
+            srcCharset = StandardCharsets.ISO_8859_1;
+        }
+
+        if (null == destCharset)
+        {
+            destCharset = StandardCharsets.UTF_8;
+        }
+
+        if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))
+        {
+            return source;
+        }
+        return new String(source.getBytes(srcCharset), destCharset);
+    }
+
+    /**
+     * @return 系统字符集编码
+     */
+    public static String systemCharset()
+    {
+        return Charset.defaultCharset().name();
+    }
+}

+ 999 - 0
blade-common/src/main/java/org/springblade/common/utils/Convert.java

@@ -0,0 +1,999 @@
+package org.springblade.common.utils;
+
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.text.NumberFormat;
+import java.util.Set;
+
+/**
+ * 类型转换器
+ *
+ * @author ruoyi
+ */
+public class Convert
+{
+    /**
+     * 转换为字符串<br>
+     * 如果给定的值为null,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static String toStr(Object value, String defaultValue)
+    {
+        if (null == value)
+        {
+            return defaultValue;
+        }
+        if (value instanceof String)
+        {
+            return (String) value;
+        }
+        return value.toString();
+    }
+
+    /**
+     * 转换为字符串<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static String toStr(Object value)
+    {
+        return toStr(value, null);
+    }
+
+    /**
+     * 转换为字符<br>
+     * 如果给定的值为null,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Character toChar(Object value, Character defaultValue)
+    {
+        if (null == value)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Character)
+        {
+            return (Character) value;
+        }
+
+        final String valueStr = toStr(value, null);
+        return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
+    }
+
+    /**
+     * 转换为字符<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Character toChar(Object value)
+    {
+        return toChar(value, null);
+    }
+
+    /**
+     * 转换为byte<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Byte toByte(Object value, Byte defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Byte)
+        {
+            return (Byte) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).byteValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Byte.parseByte(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为byte<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Byte toByte(Object value)
+    {
+        return toByte(value, null);
+    }
+
+    /**
+     * 转换为Short<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Short toShort(Object value, Short defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Short)
+        {
+            return (Short) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).shortValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Short.parseShort(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Short<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Short toShort(Object value)
+    {
+        return toShort(value, null);
+    }
+
+    /**
+     * 转换为Number<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Number toNumber(Object value, Number defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Number)
+        {
+            return (Number) value;
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return NumberFormat.getInstance().parse(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Number<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Number toNumber(Object value)
+    {
+        return toNumber(value, null);
+    }
+
+    /**
+     * 转换为int<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Integer toInt(Object value, Integer defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Integer)
+        {
+            return (Integer) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).intValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Integer.parseInt(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为int<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Integer toInt(Object value)
+    {
+        return toInt(value, null);
+    }
+
+    /**
+     * 转换为Integer数组<br>
+     *
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static Integer[] toIntArray(String str)
+    {
+        return toIntArray(",", str);
+    }
+
+    /**
+     * 转换为Long数组<br>
+     *
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static Long[] toLongArray(String str)
+    {
+        return toLongArray(",", str);
+    }
+
+    /**
+     * 转换为Integer数组<br>
+     *
+     * @param split 分隔符
+     * @param split 被转换的值
+     * @return 结果
+     */
+    public static Integer[] toIntArray(String split, String str)
+    {
+        if (StringUtils.isEmpty(str))
+        {
+            return new Integer[] {};
+        }
+        String[] arr = str.split(split);
+        final Integer[] ints = new Integer[arr.length];
+        for (int i = 0; i < arr.length; i++)
+        {
+            final Integer v = toInt(arr[i], 0);
+            ints[i] = v;
+        }
+        return ints;
+    }
+
+    /**
+     * 转换为Long数组<br>
+     *
+     * @param split 分隔符
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static Long[] toLongArray(String split, String str)
+    {
+        if (StringUtils.isEmpty(str))
+        {
+            return new Long[] {};
+        }
+        String[] arr = str.split(split);
+        final Long[] longs = new Long[arr.length];
+        for (int i = 0; i < arr.length; i++)
+        {
+            final Long v = toLong(arr[i], null);
+            longs[i] = v;
+        }
+        return longs;
+    }
+
+    /**
+     * 转换为String数组<br>
+     *
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static String[] toStrArray(String str)
+    {
+        return toStrArray(",", str);
+    }
+
+    /**
+     * 转换为String数组<br>
+     *
+     * @param split 分隔符
+     * @param split 被转换的值
+     * @return 结果
+     */
+    public static String[] toStrArray(String split, String str)
+    {
+        return str.split(split);
+    }
+
+    /**
+     * 转换为long<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Long toLong(Object value, Long defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Long)
+        {
+            return (Long) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).longValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            // 支持科学计数法
+            return new BigDecimal(valueStr.trim()).longValue();
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为long<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Long toLong(Object value)
+    {
+        return toLong(value, null);
+    }
+
+    /**
+     * 转换为double<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Double toDouble(Object value, Double defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Double)
+        {
+            return (Double) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).doubleValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            // 支持科学计数法
+            return new BigDecimal(valueStr.trim()).doubleValue();
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为double<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Double toDouble(Object value)
+    {
+        return toDouble(value, null);
+    }
+
+    /**
+     * 转换为Float<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Float toFloat(Object value, Float defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Float)
+        {
+            return (Float) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).floatValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Float.parseFloat(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Float<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Float toFloat(Object value)
+    {
+        return toFloat(value, null);
+    }
+
+    /**
+     * 转换为boolean<br>
+     * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Boolean toBool(Object value, Boolean defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Boolean)
+        {
+            return (Boolean) value;
+        }
+        String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        valueStr = valueStr.trim().toLowerCase();
+        switch (valueStr)
+        {
+            case "true":
+                return true;
+            case "false":
+                return false;
+            case "yes":
+                return true;
+            case "ok":
+                return true;
+            case "no":
+                return false;
+            case "1":
+                return true;
+            case "0":
+                return false;
+            default:
+                return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为boolean<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Boolean toBool(Object value)
+    {
+        return toBool(value, null);
+    }
+
+    /**
+     * 转换为Enum对象<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     *
+     * @param clazz Enum的Class
+     * @param value 值
+     * @param defaultValue 默认值
+     * @return Enum
+     */
+    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value, E defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (clazz.isAssignableFrom(value.getClass()))
+        {
+            @SuppressWarnings("unchecked")
+            E myE = (E) value;
+            return myE;
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Enum.valueOf(clazz, valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Enum对象<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     *
+     * @param clazz Enum的Class
+     * @param value 值
+     * @return Enum
+     */
+    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value)
+    {
+        return toEnum(clazz, value, null);
+    }
+
+    /**
+     * 转换为BigInteger<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static BigInteger toBigInteger(Object value, BigInteger defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof BigInteger)
+        {
+            return (BigInteger) value;
+        }
+        if (value instanceof Long)
+        {
+            return BigInteger.valueOf((Long) value);
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return new BigInteger(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为BigInteger<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static BigInteger toBigInteger(Object value)
+    {
+        return toBigInteger(value, null);
+    }
+
+    /**
+     * 转换为BigDecimal<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof BigDecimal)
+        {
+            return (BigDecimal) value;
+        }
+        if (value instanceof Long)
+        {
+            return new BigDecimal((Long) value);
+        }
+        if (value instanceof Double)
+        {
+            return new BigDecimal((Double) value);
+        }
+        if (value instanceof Integer)
+        {
+            return new BigDecimal((Integer) value);
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return new BigDecimal(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为BigDecimal<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     *
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static BigDecimal toBigDecimal(Object value)
+    {
+        return toBigDecimal(value, null);
+    }
+
+    /**
+     * 将对象转为字符串<br>
+     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
+     *
+     * @param obj 对象
+     * @return 字符串
+     */
+    public static String utf8Str(Object obj)
+    {
+        return str(obj, CharsetKit.CHARSET_UTF_8);
+    }
+
+    /**
+     * 将对象转为字符串<br>
+     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
+     *
+     * @param obj 对象
+     * @param charsetName 字符集
+     * @return 字符串
+     */
+    public static String str(Object obj, String charsetName)
+    {
+        return str(obj, Charset.forName(charsetName));
+    }
+
+    /**
+     * 将对象转为字符串<br>
+     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
+     *
+     * @param obj 对象
+     * @param charset 字符集
+     * @return 字符串
+     */
+    public static String str(Object obj, Charset charset)
+    {
+        if (null == obj)
+        {
+            return null;
+        }
+
+        if (obj instanceof String)
+        {
+            return (String) obj;
+        }
+        else if (obj instanceof byte[] || obj instanceof Byte[])
+        {
+            return str((Byte[]) obj, charset);
+        }
+        else if (obj instanceof ByteBuffer)
+        {
+            return str((ByteBuffer) obj, charset);
+        }
+        return obj.toString();
+    }
+
+    /**
+     * 将byte数组转为字符串
+     *
+     * @param bytes byte数组
+     * @param charset 字符集
+     * @return 字符串
+     */
+    public static String str(byte[] bytes, String charset)
+    {
+        return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset));
+    }
+
+    /**
+     * 解码字节码
+     *
+     * @param data 字符串
+     * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
+     * @return 解码后的字符串
+     */
+    public static String str(byte[] data, Charset charset)
+    {
+        if (data == null)
+        {
+            return null;
+        }
+
+        if (null == charset)
+        {
+            return new String(data);
+        }
+        return new String(data, charset);
+    }
+
+    /**
+     * 将编码的byteBuffer数据转换为字符串
+     *
+     * @param data 数据
+     * @param charset 字符集,如果为空使用当前系统字符集
+     * @return 字符串
+     */
+    public static String str(ByteBuffer data, String charset)
+    {
+        if (data == null)
+        {
+            return null;
+        }
+
+        return str(data, Charset.forName(charset));
+    }
+
+    /**
+     * 将编码的byteBuffer数据转换为字符串
+     *
+     * @param data 数据
+     * @param charset 字符集,如果为空使用当前系统字符集
+     * @return 字符串
+     */
+    public static String str(ByteBuffer data, Charset charset)
+    {
+        if (null == charset)
+        {
+            charset = Charset.defaultCharset();
+        }
+        return charset.decode(data).toString();
+    }
+
+    // ----------------------------------------------------------------------- 全角半角转换
+    /**
+     * 半角转全角
+     *
+     * @param input String.
+     * @return 全角字符串.
+     */
+    public static String toSBC(String input)
+    {
+        return toSBC(input, null);
+    }
+
+    /**
+     * 半角转全角
+     *
+     * @param input String
+     * @param notConvertSet 不替换的字符集合
+     * @return 全角字符串.
+     */
+    public static String toSBC(String input, Set<Character> notConvertSet)
+    {
+        char c[] = input.toCharArray();
+        for (int i = 0; i < c.length; i++)
+        {
+            if (null != notConvertSet && notConvertSet.contains(c[i]))
+            {
+                // 跳过不替换的字符
+                continue;
+            }
+
+            if (c[i] == ' ')
+            {
+                c[i] = '\u3000';
+            }
+            else if (c[i] < '\177')
+            {
+                c[i] = (char) (c[i] + 65248);
+
+            }
+        }
+        return new String(c);
+    }
+
+    /**
+     * 全角转半角
+     *
+     * @param input String.
+     * @return 半角字符串
+     */
+    public static String toDBC(String input)
+    {
+        return toDBC(input, null);
+    }
+
+    /**
+     * 替换全角为半角
+     *
+     * @param text 文本
+     * @param notConvertSet 不替换的字符集合
+     * @return 替换后的字符
+     */
+    public static String toDBC(String text, Set<Character> notConvertSet)
+    {
+        char c[] = text.toCharArray();
+        for (int i = 0; i < c.length; i++)
+        {
+            if (null != notConvertSet && notConvertSet.contains(c[i]))
+            {
+                // 跳过不替换的字符
+                continue;
+            }
+
+            if (c[i] == '\u3000')
+            {
+                c[i] = ' ';
+            }
+            else if (c[i] > '\uFF00' && c[i] < '\uFF5F')
+            {
+                c[i] = (char) (c[i] - 65248);
+            }
+        }
+        String returnString = new String(c);
+
+        return returnString;
+    }
+
+    /**
+     * 数字金额大写转换 先写个完整的然后将如零拾替换成零
+     *
+     * @param n 数字
+     * @return 中文大写数字
+     */
+    public static String digitUppercase(double n)
+    {
+        String[] fraction = { "角", "分" };
+        String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
+        String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } };
+
+        String head = n < 0 ? "负" : "";
+        n = Math.abs(n);
+
+        String s = "";
+        for (int i = 0; i < fraction.length; i++)
+        {
+            s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", "");
+        }
+        if (s.length() < 1)
+        {
+            s = "整";
+        }
+        int integerPart = (int) Math.floor(n);
+
+        for (int i = 0; i < unit[0].length && integerPart > 0; i++)
+        {
+            String p = "";
+            for (int j = 0; j < unit[1].length && n > 0; j++)
+            {
+                p = digit[integerPart % 10] + unit[1][j] + p;
+                integerPart = integerPart / 10;
+            }
+            s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s;
+        }
+        return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整");
+    }
+}

+ 136 - 0
blade-common/src/main/java/org/springblade/common/utils/ServletUtils.java

@@ -0,0 +1,136 @@
+package org.springblade.common.utils;
+
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.IOException;
+
+/**
+ * 客户端工具类
+ *
+ * @author ruoyi
+ */
+public class ServletUtils
+{
+    /**
+     * 获取String参数
+     */
+    public static String getParameter(String name)
+    {
+        return getRequest().getParameter(name);
+    }
+
+    /**
+     * 获取String参数
+     */
+    public static String getParameter(String name, String defaultValue)
+    {
+        return Convert.toStr(getRequest().getParameter(name), defaultValue);
+    }
+
+    /**
+     * 获取Integer参数
+     */
+    public static Integer getParameterToInt(String name)
+    {
+        return Convert.toInt(getRequest().getParameter(name));
+    }
+
+    /**
+     * 获取Integer参数
+     */
+    public static Integer getParameterToInt(String name, Integer defaultValue)
+    {
+        return Convert.toInt(getRequest().getParameter(name), defaultValue);
+    }
+
+    /**
+     * 获取request
+     */
+    public static HttpServletRequest getRequest()
+    {
+        return getRequestAttributes().getRequest();
+    }
+
+    /**
+     * 获取response
+     */
+    public static HttpServletResponse getResponse()
+    {
+        return getRequestAttributes().getResponse();
+    }
+
+    /**
+     * 获取session
+     */
+    public static HttpSession getSession()
+    {
+        return getRequest().getSession();
+    }
+
+    public static ServletRequestAttributes getRequestAttributes()
+    {
+        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
+        return (ServletRequestAttributes) attributes;
+    }
+
+    /**
+     * 将字符串渲染到客户端
+     *
+     * @param response 渲染对象
+     * @param string 待渲染的字符串
+     * @return null
+     */
+    public static String renderString(HttpServletResponse response, String string)
+    {
+        try
+        {
+            response.setStatus(200);
+            response.setContentType("application/json");
+            response.setCharacterEncoding("utf-8");
+            response.getWriter().print(string);
+        }
+        catch (IOException e)
+        {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 是否是Ajax异步请求
+     *
+     * @param request
+     */
+    public static boolean isAjaxRequest(HttpServletRequest request)
+    {
+        String accept = request.getHeader("accept");
+        if (accept != null && accept.indexOf("application/json") != -1)
+        {
+            return true;
+        }
+
+        String xRequestedWith = request.getHeader("X-Requested-With");
+        if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1)
+        {
+            return true;
+        }
+
+        String uri = request.getRequestURI();
+        if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml"))
+        {
+            return true;
+        }
+
+        String ajax = request.getParameter("__ajax");
+        if (StringUtils.inStringIgnoreCase(ajax, "json", "xml"))
+        {
+            return true;
+        }
+        return false;
+    }
+}

+ 90 - 0
blade-common/src/main/java/org/springblade/common/utils/StrFormatter.java

@@ -0,0 +1,90 @@
+package org.springblade.common.utils;
+
+/**
+ * 字符串格式化
+ *
+ * @author ruoyi
+ */
+public class StrFormatter
+{
+    public static final String EMPTY_JSON = "{}";
+    public static final char C_BACKSLASH = '\\';
+    public static final char C_DELIM_START = '{';
+    public static final char C_DELIM_END = '}';
+
+    /**
+     * 格式化字符串<br>
+     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
+     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
+     * 例:<br>
+     * 通常使用: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 strPattern 字符串模板
+     * @param argArray 参数列表
+     * @return 结果
+     */
+    public static String format(final String strPattern, final Object... argArray)
+    {
+        if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray))
+        {
+            return strPattern;
+        }
+        final int strPatternLength = strPattern.length();
+
+        // 初始化定义好的长度以获得更好的性能
+        StringBuilder sbuf = new StringBuilder(strPatternLength + 50);
+
+        int handledPosition = 0;
+        int delimIndex;// 占位符所在位置
+        for (int argIndex = 0; argIndex < argArray.length; argIndex++)
+        {
+            delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
+            if (delimIndex == -1)
+            {
+                if (handledPosition == 0)
+                {
+                    return strPattern;
+                }
+                else
+                { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
+                    sbuf.append(strPattern, handledPosition, strPatternLength);
+                    return sbuf.toString();
+                }
+            }
+            else
+            {
+                if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH)
+                {
+                    if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH)
+                    {
+                        // 转义符之前还有一个转义符,占位符依旧有效
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
+                        sbuf.append(Convert.utf8Str(argArray[argIndex]));
+                        handledPosition = delimIndex + 2;
+                    }
+                    else
+                    {
+                        // 占位符被转义
+                        argIndex--;
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
+                        sbuf.append(C_DELIM_START);
+                        handledPosition = delimIndex + 1;
+                    }
+                }
+                else
+                {
+                    // 正常占位符
+                    sbuf.append(strPattern, handledPosition, delimIndex);
+                    sbuf.append(Convert.utf8Str(argArray[argIndex]));
+                    handledPosition = delimIndex + 2;
+                }
+            }
+        }
+        // 加入最后一个占位符后所有的字符
+        sbuf.append(strPattern, handledPosition, strPattern.length());
+
+        return sbuf.toString();
+    }
+}

+ 482 - 0
blade-common/src/main/java/org/springblade/common/utils/StringUtils.java

@@ -0,0 +1,482 @@
+package org.springblade.common.utils;
+
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 字符串工具类
+ *
+ * @author ruoyi
+ */
+public class StringUtils extends org.apache.commons.lang3.StringUtils {
+    /**
+     * 空字符串
+     */
+    private static final String NULLSTR = "";
+
+    /**
+     * 下划线
+     */
+    private static final char SEPARATOR = '_';
+
+    /**
+     * 获取参数不为空值
+     *
+     * @param value defaultValue 要判断的value
+     * @return value 返回值
+     */
+    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) {
+        return isNull(coll) || coll.isEmpty();
+    }
+
+    /**
+     * * 判断一个Collection是否非空,包含List,Set,Queue
+     *
+     * @param coll 要判断的Collection
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Collection<?> coll) {
+        return !isEmpty(coll);
+    }
+
+    // 整数集合去重
+    public static List<Long> integerDeduplication(List<Long> integerList) {
+        List<Long> listTemp = new ArrayList();
+        for (int i = 0; i < integerList.size(); i++) {
+            if (!listTemp.contains(integerList.get(i))) {
+                listTemp.add(integerList.get(i));
+            }
+        }
+        return listTemp;
+    }
+
+    /**
+     * * 判断一个对象数组是否为空
+     *
+     * @param objects 要判断的对象数组
+     *                * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Object[] objects) {
+        return isNull(objects) || (objects.length == 0);
+    }
+
+    /**
+     * * 判断一个对象数组是否非空
+     *
+     * @param objects 要判断的对象数组
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Object[] objects) {
+        return !isEmpty(objects);
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     *
+     * @param map 要判断的Map
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Map<?, ?> map) {
+        return isNull(map) || map.isEmpty();
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     *
+     * @param map 要判断的Map
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Map<?, ?> map) {
+        return !isEmpty(map);
+    }
+
+    /**
+     * * 判断一个字符串是否为空串
+     *
+     * @param str String
+     * @return true:为空 false:非空
+     */
+    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) {
+        return !isEmpty(str);
+    }
+
+    /**
+     * * 判断一个对象是否为空
+     *
+     * @param object Object
+     * @return true:为空 false:非空
+     */
+    public static boolean isNull(Object object) {
+        return object == null;
+    }
+
+    /**
+     * * 判断一个对象是否非空
+     *
+     * @param object Object
+     * @return true:非空 false:空
+     */
+    public static boolean isNotNull(Object object) {
+        return !isNull(object);
+    }
+
+    /**
+     * * 判断一个对象是否是数组类型(Java基本型别的数组)
+     *
+     * @param object 对象
+     * @return true:是数组 false:不是数组
+     */
+    public static boolean isArray(Object object) {
+        return isNotNull(object) && object.getClass().isArray();
+    }
+
+    /**
+     * 去空格
+     */
+    public static String trim(String str) {
+        return (str == null ? "" : str.trim());
+    }
+
+    /**
+     * 截取字符串
+     *
+     * @param str   字符串
+     * @param start 开始
+     * @return 结果
+     */
+    public static String substring(final String str, int start) {
+        if (str == null) {
+            return NULLSTR;
+        }
+
+        if (start < 0) {
+            start = str.length() + start;
+        }
+
+        if (start < 0) {
+            start = 0;
+        }
+        if (start > str.length()) {
+            return NULLSTR;
+        }
+
+        return str.substring(start);
+    }
+
+    /**
+     * 截取字符串
+     *
+     * @param str   字符串
+     * @param start 开始
+     * @param end   结束
+     * @return 结果
+     */
+    public static String substring(final String str, int start, int end) {
+        if (str == null) {
+            return NULLSTR;
+        }
+
+        if (end < 0) {
+            end = str.length() + end;
+        }
+        if (start < 0) {
+            start = str.length() + start;
+        }
+
+        if (end > str.length()) {
+            end = str.length();
+        }
+
+        if (start > end) {
+            return NULLSTR;
+        }
+
+        if (start < 0) {
+            start = 0;
+        }
+        if (end < 0) {
+            end = 0;
+        }
+
+        return str.substring(start, end);
+    }
+
+    /**
+     * 格式化文本, {} 表示占位符<br>
+     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
+     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
+     * 例:<br>
+     * 通常使用: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   参数值
+     * @return 格式化后的文本
+     */
+    public static String format(String template, Object... params) {
+        if (isEmpty(params) || isEmpty(template)) {
+            return template;
+        }
+        return StrFormatter.format(template, params);
+    }
+
+    /**
+     * 字符串转set
+     *
+     * @param str 字符串
+     * @param sep 分隔符
+     * @return set集合
+     */
+    public static final Set<String> str2Set(String str, String sep) {
+        return new HashSet<String>(str2List(str, sep, true, false));
+    }
+
+    /**
+     * 字符串转list
+     *
+     * @param str         字符串
+     * @param sep         分隔符
+     * @param filterBlank 过滤纯空白
+     * @param trim        去掉首尾空白
+     * @return list集合
+     */
+    public static final List<String> str2List(String str, String sep, boolean filterBlank, boolean trim) {
+        List<String> list = new ArrayList<String>();
+        if (StringUtils.isEmpty(str)) {
+            return list;
+        }
+
+        // 过滤空白字符串
+        if (filterBlank && StringUtils.isBlank(str)) {
+            return list;
+        }
+        String[] split = str.split(sep);
+        for (String string : split) {
+            if (filterBlank && StringUtils.isBlank(string)) {
+                continue;
+            }
+            if (trim) {
+                string = string.trim();
+            }
+            list.add(string);
+        }
+
+        return list;
+    }
+
+    /**
+     * 下划线转驼峰命名
+     */
+    public static String toUnderScoreCase(String str) {
+        if (str == null) {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        // 前置字符是否大写
+        boolean preCharIsUpperCase = true;
+        // 当前字符是否大写
+        boolean curreCharIsUpperCase = true;
+        // 下一字符是否大写
+        boolean nexteCharIsUpperCase = true;
+        for (int i = 0; i < str.length(); i++) {
+            char c = str.charAt(i);
+            if (i > 0) {
+                preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
+            } else {
+                preCharIsUpperCase = false;
+            }
+
+            curreCharIsUpperCase = Character.isUpperCase(c);
+
+            if (i < (str.length() - 1)) {
+                nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
+            }
+
+            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) {
+                sb.append(SEPARATOR);
+            } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) {
+                sb.append(SEPARATOR);
+            }
+            sb.append(Character.toLowerCase(c));
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * 是否包含字符串
+     *
+     * @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))) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
+     *
+     * @param name 转换前的下划线大写方式命名的字符串
+     * @return 转换后的驼峰式命名的字符串
+     */
+    public static String convertToCamelCase(String name) {
+        StringBuilder result = new StringBuilder();
+        // 快速检查
+        if (name == null || name.isEmpty()) {
+            // 没必要转换
+            return "";
+        } else if (!name.contains("_")) {
+            // 不含下划线,仅将首字母大写
+            return name.substring(0, 1).toUpperCase() + name.substring(1);
+        }
+        // 用下划线将原始字符串分割
+        String[] camels = name.split("_");
+        for (String camel : camels) {
+            // 跳过原始字符串中开头、结尾的下换线或双重下划线
+            if (camel.isEmpty()) {
+                continue;
+            }
+            // 首字母大写
+            result.append(camel.substring(0, 1).toUpperCase());
+            result.append(camel.substring(1).toLowerCase());
+        }
+        return result.toString();
+    }
+
+    /**
+     * 驼峰式命名法 例如:user_name->userName
+     */
+    public static String toCamelCase(String s) {
+        if (s == null) {
+            return null;
+        }
+        s = s.toLowerCase();
+        StringBuilder sb = new StringBuilder(s.length());
+        boolean upperCase = false;
+        for (int i = 0; i < s.length(); i++) {
+            char c = s.charAt(i);
+
+            if (c == SEPARATOR) {
+                upperCase = true;
+            } else if (upperCase) {
+                sb.append(Character.toUpperCase(c));
+                upperCase = false;
+            } else {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+
+    public static String objToStr(Object obj) {
+        return obj == null ? "" : String.valueOf(obj);
+    }
+
+    public static String numHandle(String num) {
+        String[] valueSplit = num.split("\\.");
+        if (StringUtils.isNumeric(valueSplit[0]) && valueSplit.length > 1) {
+            if (StringUtils.isNumeric(valueSplit[1])) {
+                int valueInt = Integer.parseInt(valueSplit[1]);
+                if (valueInt > 0) {
+                    num = valueSplit[0] + "." + valueSplit[1].substring(0, 2);
+                } else {
+                    num = valueSplit[0];
+                }
+            }
+        }
+        return num;
+    }
+
+    /**
+     * 去掉字符串末尾逗号
+     */
+    public static StringBuilder removeTheLastComma(StringBuilder builder){
+        if (builder.length() > 0) {
+            builder.deleteCharAt(builder.length()-1);
+        }
+        return builder;
+    }
+
+    /**
+     * 将字符串中存的带双引号的数组,转换成 int 数组
+     */
+    public static int[] stringArrayDQMToInt(String content){
+        // 提取字符串中 [] 中的内容
+        String stringOne = StringUtils.strip(content,"[]");
+        // 提取字符串中 “” 中的内容
+        String stringTwo = stringOne.replace("\"","");
+        // 提取字符串中逗号分隔的内容并形成 String[]
+        String[] strings = stringTwo.split(",");
+        // 将 String[] 转换成 int[]
+        return Arrays.stream(strings).mapToInt(Integer::parseInt).toArray();
+    }
+
+    /**
+     * 将字符串中存的数组,转换成 int 数组
+     */
+    public static int[] stringArrayToIntArray(String content){
+        // 提取字符串中 [] 中的内容
+        String stringOne = StringUtils.strip(content,"[]");
+        // 提取字符串中逗号分隔的内容并形成 String[]
+        String[] strings = stringOne.split(",");
+        // 将 String[] 转换成 int[]
+        return Arrays.stream(strings).mapToInt(Integer::parseInt).toArray();
+    }
+
+    /**
+     * 获取当前时间字符串
+     */
+    public static String nowTimeStr(){
+        // 获取用户当前登录时间
+        Date nowTime = new Date();
+        // 简单时间参数设定
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        // 将简单时间转换成字符串
+        return df.format(nowTime);
+    }
+
+    /**
+     * 转换时间字符串
+     */
+    public static String nowTimeStr(Object o) {
+        // 简单时间参数设定
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        // 将简单时间转换成字符串
+        return df.format(o);
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> T cast(Object obj) {
+        return (T) obj;
+    }
+}

+ 1 - 1
blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/order/entity/OrderItems.java

@@ -564,7 +564,7 @@ public class OrderItems extends OrderBase {
 	 * 二维码
 	 */
 	@ApiModelProperty(value = "二维码")
-	private String qRCode;
+	private String qrCode;
 
 	/**
 	 * 扫描比对

+ 59 - 0
blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/order/vo/OrderTotalDTO.java

@@ -0,0 +1,59 @@
+package com.trade.purchase.order.vo;
+
+import com.trade.purchase.order.entity.OrderItems;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "OrderTotalDTO对象", description = "库存明细")
+public class OrderTotalDTO extends OrderItems {
+
+	/**
+	 * 系统编号
+	 */
+	@ApiModelProperty(value = "系统编号")
+	private String sysNo;
+	/**
+	 * 主订单号
+	 */
+	@ApiModelProperty(value = "主订单号")
+	private String morderNo;
+	/**
+	 * 订单开始日期
+	 */
+	@ApiModelProperty(value = "订单开始日期", required = true)
+	private Date businesStartDate;
+
+	/**
+	 * 订单结束日期
+	 */
+	@ApiModelProperty(value = "订单结束日期", required = true)
+	private Date businesEndDate;
+	/**
+	 * 客户或供应商id(全称)
+	 */
+	@ApiModelProperty(value = "客户或供应商id(全称)")
+	private Long corpId;
+	/**
+	 * 采购商id
+	 */
+	@ApiModelProperty(value = "采购商id")
+	private Long purchaserId;
+	/**
+	 * 仓库id
+	 */
+	@ApiModelProperty(value = "仓库id")
+	private Long storageId;
+
+	/**
+	 * 车船号
+	 */
+	@ApiModelProperty(value = "车船号")
+	private String vehicleShipNumber;
+
+}

+ 1 - 1
blade-service/blade-client/src/main/java/org/springblade/client/goods/service/impl/GoodsDescServiceImpl.java

@@ -232,7 +232,7 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, GoodsDesc
 					goodsPriceMapper.insert(e);
 				});
 			}
-			// 文件上传
+			// ExcelProperty
 			if (!CollectionUtils.isEmpty(filesList)) {
 				filesList.forEach(k -> {
 					k.setTenantId(AuthUtil.getTenantId());

+ 1 - 1
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/controller/OrderController.java

@@ -580,7 +580,7 @@ public class OrderController extends BladeController {
 
 
 				//成本单价=(货款+关税+配额)/发票重量---精确小数点2位
-				BigDecimal unitPrice = null;
+				BigDecimal unitPrice = new BigDecimal(0);
 				if (ObjectUtils.isNotNull(service)){
 					if (service.getInvoiceWeight() == null || service.getInvoiceWeight().compareTo(BigDecimal.ZERO) == 0) {
 						unitPrice = BigDecimal.ZERO;

+ 2 - 1
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/mapper/OrderMapper.xml

@@ -431,6 +431,7 @@
         and a.trade_type='JK'
         and a.bill_type='XS'
         and a.tenant_id=#{tenantId}
+        and a.is_deleted = 0
         and b.org_order_no in
         (
            select distinct t.order_no from business_order t where t.tenant_id=#{tenantId} and t.trade_type='JK' and t.bill_type='CG' and t.is_deleted=0
@@ -438,7 +439,7 @@
         )
         order by  a.create_time desc
       )   b  on a.order_no=b.orgOrderNo
-      where  a.bill_type='CG' and  a.trade_type='JK'
+      where  a.bill_type='CG' and  a.trade_type='JK' and a.is_deleted = 0
         <if test='startTime != null and endTime!= null'>
             and a.create_time between #{startTime} and #{endTime}
         </if>

+ 31 - 3
blade-service/trade-purchase/src/main/java/com/trade/purchase/order/controller/WoodHarvestingCloudController.java

@@ -16,6 +16,8 @@ import com.trade.purchase.order.entity.OrderItems;
 import com.trade.purchase.order.enums.OrderTypeEnum;
 import com.trade.purchase.order.service.IOrderItemsService;
 import com.trade.purchase.order.service.IOrderService;
+import com.trade.purchase.order.vo.OrderDTO;
+import com.trade.purchase.order.vo.OrderTotalDTO;
 import com.trade.purchase.order.vo.OrderVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -31,6 +33,7 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.system.feign.ISysClient;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -40,6 +43,7 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 采木云入出库控制器
@@ -63,6 +67,8 @@ public class WoodHarvestingCloudController {
 
 	private final IFinancingService financingService;
 
+	private ISysClient sysClient;
+
 	/**
 	 * 导出采木云入库模板
 	 */
@@ -113,16 +119,16 @@ public class WoodHarvestingCloudController {
 			.eq("trade_type", OrderTypeEnum.WOOD_HARVESTING_CLOUD.getType())
 			.eq(ObjectUtils.isNotNull(order.getBusinessType()), "business_type", order.getBusinessType())
 			.eq(ObjectUtils.isNotNull(order.getPurchaserId()), "purchaser_id", order.getPurchaserId())
-			.eq(ObjectUtils.isNotNull(order.getSysNo()), "sys_no", order.getSysNo())
+			.like(ObjectUtils.isNotNull(order.getSysNo()), "sys_no", order.getSysNo())
 			.like(ObjectUtils.isNotNull(order.getBillNo()), "bill_no", order.getBillNo())
 			.eq(ObjectUtils.isNotNull(order.getVehicleShipNumber()), "vehicle_ship_number", order.getVehicleShipNumber())
 			.eq(ObjectUtils.isNotNull(order.getCorpId()), "corp_id", order.getCorpId())
 			.eq(ObjectUtils.isNotNull(order.getStorageId()), "storage_id", order.getStorageId())
-			.eq(ObjectUtils.isNotNull(order.getOrderRemark()), "order_remark", order.getOrderRemark())
+			.like(ObjectUtils.isNotNull(order.getOrderRemark()), "order_remark", order.getOrderRemark())
 			.eq(ObjectUtils.isNotNull(order.getStatus()), "status", order.getStatus())
 			.ge(ObjectUtils.isNotNull(order.getCreateStartTime()), "stock_time", order.getCreateStartTime())
 			.le(ObjectUtils.isNotNull(order.getCreateEndTime()), "stock_time", order.getCreateEndTime())
-			.orderByDesc("stock_time");
+			.orderByDesc("create_time");
 		IPage<Order> pages = orderService.page(Condition.getPage(query), queryWrapper);
 		List<Order> orderList = pages.getRecords();
 		for (Order orders : orderList) {
@@ -347,4 +353,26 @@ public class WoodHarvestingCloudController {
 		return R.data(orderItems);
 	}
 
+	/**
+	 * 库存总账
+	 */
+	@GetMapping("/generalLedgerList")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "库存总账", notes = "传入order")
+	public R<List<Map<String,Object>>> generalLedgerList(OrderTotalDTO order, Query query) {
+		order.setTenantId(AuthUtil.getTenantId());
+		List<Map<String,Object>> mapList = orderService.generalLedgerList(query, order);
+		return R.data(mapList);
+	}
+
+	/**
+	 * 库存总账(商品)
+	 */
+	@GetMapping("/generalLedgerListByGoods")
+	@ApiOperationSupport(order = 2)
+	public R<List<Map<String,Object>>> generalLedgerListByGoods() {
+		List<Map<String,Object>> mapList = orderService.generalLedgerListByGoods();
+		return R.data(mapList);
+	}
+
 }

+ 18 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/order/mapper/OrderMapper.java

@@ -3,11 +3,15 @@ package com.trade.purchase.order.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.trade.purchase.excel.PurchaseOrderExcel;
+import com.trade.purchase.order.vo.OrderDTO;
+import com.trade.purchase.order.vo.OrderTotalDTO;
 import org.apache.ibatis.annotations.Param;
 import com.trade.purchase.order.entity.Order;
 import com.trade.purchase.order.vo.OrderVO;
+import org.springblade.core.mp.support.Query;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 销售或采购订单表 Mapper 接口
@@ -27,4 +31,18 @@ public interface OrderMapper extends BaseMapper<Order> {
 	List<OrderVO> selectOrderPage(IPage page, @Param("Order") OrderVO order);
 
 	List<PurchaseOrderExcel> selOrderListExport(Order order);
+
+	/**
+	 * 库存总账
+	 * @param query
+	 * @param order
+	 * @return
+	 */
+    List<Map<String, Object>> generalLedgerList(@Param("query") Query query, @Param("Order") OrderTotalDTO order);
+
+	/**
+	 * 库存总账(商品)
+	 * @return
+	 */
+	List<Map<String, Object>> generalLedgerListByGoods(@Param("tenantId") String tenantId);
 }

+ 131 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/order/mapper/OrderMapper.xml

@@ -349,4 +349,135 @@
             <if test="order.createEndTime != null and order.createEndTime != ''">and BO.create_time &lt;= #{order.createEndTime}</if>
         </where>
     </select>
+
+    <select id="generalLedgerList" parameterType="com.trade.purchase.order.vo.OrderTotalDTO" resultType="java.util.Map">
+        SELECT
+        boi.id AS id,
+        boi.item_id AS itemId,
+        bgd.cname AS goodsName,
+        bgd.brand AS itemType,
+        bgd.place_production AS itemProp,
+        boi.length AS length,
+        boi.width AS width,
+        boi.width_item AS widthItem,
+        boi.thickness AS thickness,
+        boi.bill_no AS billNo,
+        boi.slice_number AS sliceNumber,
+        boi.balance_number AS balanceNumber,
+        boi.price AS price,
+        boi.balance_money AS balanceMoney,
+        bst.cname AS warehouse,
+        bsc.cname AS storageName,
+        boi.grade AS grade,
+        bcd.cname AS corpName,
+        bo.vehicle_ship_number AS vehicleShipNumber,
+        bcd1.cname AS purchaser,
+        bo.morder_no AS morderNo,
+        bo.sys_no AS sysNo
+        FROM
+        business_order_items boi
+        LEFT JOIN business_order bo ON boi.pid = bo.id
+        LEFT JOIN basic_storage_type bst ON bo.storage_id = bst.id
+        LEFT JOIN basic_storage_desc bsc ON boi.storage_id = bsc.id
+        LEFT JOIN basic_goods_desc bgd ON boi.item_id = bgd.id
+        LEFT JOIN basic_corps_desc bcd ON bo.corp_id = bcd.id
+        LEFT JOIN basic_corps_desc bcd1 ON bo.purchaser_id = bcd1.id
+        WHERE
+        boi.is_deleted = 0
+        AND bo.is_deleted = 0
+        and bo.status = 3
+        and bo.bill_type = 'RK'
+        and bo.trade_type = 'CMY'
+        and bo.confirm_status = 1
+        AND bo.special_check_status = 1
+        <if test="Order.sysNo!=null and Order.sysNo != ''">
+            and bo.sys_no=#{Order.sysNo}
+        </if>
+        <if test="Order.morderNo!=null and Order.morderNo != ''">
+            and bo.morder_no = #{Order.morderNo}
+        </if>
+        <if test="Order.businesStartDate!=null">
+            and bo.busines_date &gt; #{businesStartDate}
+        </if>
+        <if test="Order.businesEndDate!=null">
+            and bo.busines_date &lt;= #{businesEndDate}
+        </if>
+        <if test="Order.corpId!=null">
+            and find_in_set(bo.corp_id,#{Order.corpId})
+        </if>
+        <if test="Order.purchaserId!=null">
+            and find_in_set(bo.purchaser_id,#{Order.purchaserId})
+        </if>
+        <if test="Order.warehouseId!=null">
+            and find_in_set(bo.storage_id,#{Order.warehouseId})
+        </if>
+        <if test="Order.tenantId!=null and Order.tenantId != ''">
+            and bo.tenant_id = #{Order.tenantId}
+        </if>
+        <if test="Order.itemId!=null and Order.itemId != ''">
+            and find_in_set(boi.item_id,#{Order.itemId})
+        </if>
+        <if test="Order.length!=null and Order.length != ''">
+            and boi.length=#{Order.length}
+        </if>
+        <if test="Order.width!=null and Order.width != ''">
+            and boi.width=#{Order.width}
+        </if>
+         <if test="Order.thickness!=null and Order.thickness != ''">
+            and boi.thickness=#{Order.thickness}
+        </if>
+         <if test="Order.vehicleShipNumber!=null and Order.vehicleShipNumber != ''">
+            and bo.vehicle_ship_number=#{Order.vehicleShipNumber}
+        </if>
+         <if test="Order.itemType!=null and Order.itemType != ''">
+            and bo.item_type=#{Order.itemType}
+        </if>
+         <if test="Order.grade!=null and Order.grade != ''">
+            and boi.grade=#{Order.grade}
+        </if>
+         <if test="Order.storageId!=null">
+            and find_in_set(boi.storage_id,#{Order.storageId})
+        </if>
+         <if test="Order.unit!=null and Order.unit != ''">
+            and boi.unit=#{Order.unit}
+        </if>
+        order by bo.busines_date
+        LIMIT #{query.current},#{query.size}
+    </select>
+
+
+    <select id="generalLedgerListByGoods" parameterType="String" resultType="java.util.Map">
+        SELECT
+            bgd.id AS id,
+            bgd.cname AS cname,
+            ifnull( nu.balanceNumber, 0 ) AS balanceNumber,
+            ifnull( nu.sliceNumber, 0 ) AS sliceNumber
+        FROM
+            basic_goods_desc bgd
+                LEFT JOIN (
+                SELECT
+                    bg.id AS id,
+                    sum( boi.balance_number ) AS balanceNumber,
+                    sum( boi.slice_number ) AS sliceNumber
+                FROM
+                    basic_goods_desc bg
+                        JOIN business_order_items boi ON bg.id = boi.item_id
+                        JOIN business_order bo ON boi.pid = bo.id
+                WHERE
+                bg.is_deleted = 0
+                    boi.is_deleted = 0
+                    AND bo.is_deleted = 0
+                    and bo.status = 3
+                    and bo.bill_type = 'RK'
+                    and bo.trade_type = 'CMY'
+                    and bo.confirm_status = 1
+                    AND bo.special_check_status = 1
+                    <if test="tenantId!=null and tenantId != ''">
+                        and bg.tenant_id = #{tenantId}
+                        and bo.tenant_id = #{tenantId}
+                    </if>
+                GROUP BY
+                    boi.item_id
+            ) AS nu ON nu.id = bgd.id
+    </select>
 </mapper>

+ 17 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/order/service/IOrderService.java

@@ -7,12 +7,15 @@ import com.trade.purchase.excel.PurchaseOrderExcel;
 import com.trade.purchase.order.dto.OrderSubmitDto;
 import com.trade.purchase.order.entity.Order;
 import com.trade.purchase.order.vo.OrderDTO;
+import com.trade.purchase.order.vo.OrderTotalDTO;
 import com.trade.purchase.order.vo.OrderVO;
 import lombok.Synchronized;
 import org.apache.ibatis.annotations.Param;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 销售或采购订单表 服务类
@@ -174,4 +177,18 @@ public interface IOrderService extends IService<Order> {
 	R underReview(Long id);
 
 	R passCancel(Long id);
+
+	/**
+	 * 库存总账
+	 * @param query
+	 * @param order
+	 * @return
+	 */
+    List<Map<String, Object>> generalLedgerList(Query query, OrderTotalDTO order);
+
+	/**
+	 * 库存总账(商品)
+	 * @return
+	 */
+	List<Map<String, Object>> generalLedgerListByGoods();
 }

+ 43 - 10
blade-service/trade-purchase/src/main/java/com/trade/purchase/order/service/impl/OrderServiceImpl.java

@@ -28,6 +28,7 @@ import com.trade.purchase.order.service.IOrderFreightService;
 import com.trade.purchase.order.service.IOrderService;
 import com.trade.purchase.order.vo.OrderDTO;
 import com.trade.purchase.order.vo.OrderItemsVO;
+import com.trade.purchase.order.vo.OrderTotalDTO;
 import com.trade.purchase.order.vo.OrderVO;
 import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
@@ -40,6 +41,7 @@ import org.springblade.client.feign.*;
 import org.springblade.client.vo.GoodsDescVO;
 import org.springblade.common.utils.BarCodeTest;
 import org.springblade.common.utils.QRCodeTest;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
@@ -1076,7 +1078,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 			balanceNumber = balanceNumber.add(cMYWarehousingExcel.getStorageQuantity());
 			balanceMoney = balanceMoney.add(cMYWarehousingExcel.getStorageAmount());
 		}
-		order.setPurchaseQuantity(balanceNumber);//入库量
+		order.setStorageQuantity(balanceNumber);//入库量
 		order.setStorageAmount(balanceMoney);//入库金额
 		order.setUpdateUser(AuthUtil.getUserId());
 		order.setUpdateTime(new Date());
@@ -1109,7 +1111,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		submitDto.setCreateTime(new Date());
 		submitDto.setTenantId(AuthUtil.getTenantId());
 		submitDto.setBusinesDate(submitDto.getStockTime());
-		submitDto.setBillNo(orderItemsList.stream().map(OrderItems::getBillNo).collect(Collectors.toList()).toString());
 		baseMapper.insert(submitDto);
 		BigDecimal balanceNumber = new BigDecimal(0);
 		BigDecimal balanceMoney = new BigDecimal(0);
@@ -1125,7 +1126,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 				orderItemsMapper.insert(orderItems);
 				orderItems.setStorageQuantity(ObjectUtils.isNull(orderItems.getStorageQuantity()) ? new BigDecimal(0) : orderItems.getStorageQuantity());
 				orderItems.setStorageAmount(ObjectUtils.isNull(orderItems.getStorageAmount()) ? new BigDecimal(0) : orderItems.getStorageAmount());
-				balanceNumber = balanceNumber.add(orderItems.getStorageQuantity());
+				balanceNumber = balanceNumber.add(orderItems.getStorageInQuantity());
 				balanceMoney = balanceMoney.add(orderItems.getStorageAmount());
 			}
 		}
@@ -1135,6 +1136,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		saveFiles(submitDto.getOrderFilesList(), submitDto.getDelFilesIds(), submitDto.getId());
 		submitDto.setUpdateUser(AuthUtil.getUserId());
 		submitDto.setUpdateTime(new Date());
+		submitDto.setStorageQuantity(balanceNumber);//入库量
+		submitDto.setStorageAmount(balanceMoney);//入库金额
 		baseMapper.updateById(submitDto);
 		return R.data(submitDto);
 	}
@@ -1155,7 +1158,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		submitDto.setCreateTime(new Date());
 		submitDto.setTenantId(AuthUtil.getTenantId());
 		submitDto.setBusinesDate(submitDto.getStockTime());
-		submitDto.setBillNo(orderItemsList.stream().map(OrderItems::getBillNo).collect(Collectors.toList()).toString());
 		baseMapper.insert(submitDto);
 		BigDecimal balanceNumber = new BigDecimal(0);
 		BigDecimal balanceMoney = new BigDecimal(0);
@@ -1171,7 +1173,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 				orderItemsMapper.insert(orderItems);
 				orderItems.setStorageQuantity(ObjectUtils.isNull(orderItems.getStorageQuantity()) ? new BigDecimal(0) : orderItems.getStorageQuantity());
 				orderItems.setStorageAmount(ObjectUtils.isNull(orderItems.getStorageAmount()) ? new BigDecimal(0) : orderItems.getStorageAmount());
-				balanceNumber = balanceNumber.add(orderItems.getStorageQuantity());
+				balanceNumber = balanceNumber.add(orderItems.getStorageInQuantity());
 				balanceMoney = balanceMoney.add(orderItems.getStorageAmount());
 			}
 		}
@@ -1181,6 +1183,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		saveFiles(submitDto.getOrderFilesList(), submitDto.getDelFilesIds(), submitDto.getId());
 		submitDto.setUpdateUser(AuthUtil.getUserId());
 		submitDto.setUpdateTime(new Date());
+		submitDto.setStorageQuantity(balanceNumber);//入库量
+		submitDto.setStorageAmount(balanceMoney);//入库金额
 		baseMapper.updateById(submitDto);
 		return R.data(submitDto);
 	}
@@ -1205,7 +1209,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		submitDto.setTradeType(OrderTypeEnum.WOOD_HARVESTING_CLOUD.getType());//类型
 		submitDto.setTenantId(AuthUtil.getTenantId());
 		submitDto.setBusinesDate(submitDto.getStockTime());
-		submitDto.setBillNo(orderItemsList.stream().map(OrderItems::getBillNo).collect(Collectors.toList()).toString());
 		if (ObjectUtils.isNotNull(submitDto.getId())) {
 			submitDto.setUpdateUser(AuthUtil.getUserId());
 			submitDto.setUpdateTime(new Date());
@@ -1239,7 +1242,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 				}
 				orderItems.setStorageQuantity(ObjectUtils.isNull(orderItems.getStorageQuantity()) ? new BigDecimal(0) : orderItems.getStorageQuantity());
 				orderItems.setStorageAmount(ObjectUtils.isNull(orderItems.getStorageAmount()) ? new BigDecimal(0) : orderItems.getStorageAmount());
-				balanceNumber = balanceNumber.add(orderItems.getStorageQuantity());
+				balanceNumber = balanceNumber.add(orderItems.getStorageInQuantity());
 				balanceMoney = balanceMoney.add(orderItems.getStorageAmount());
 			}
 		}
@@ -1249,6 +1252,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		saveFiles(submitDto.getOrderFilesList(), submitDto.getDelFilesIds(), submitDto.getId());
 		submitDto.setUpdateUser(AuthUtil.getUserId());
 		submitDto.setUpdateTime(new Date());
+		submitDto.setStorageQuantity(balanceNumber);//入库量
+		submitDto.setStorageAmount(balanceMoney);//入库金额
 		baseMapper.updateById(submitDto);
 		return R.data(submitDto);
 	}
@@ -1334,15 +1339,18 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 				auditProecessDTO.setAmount(orderItems.stream().map(OrderItems::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
 				//生成一维码图片
 				for (OrderItems item : orderItems) {
-					String oneCode = BarCodeTest.generateCode(new File("捆包号.png"), item.getBillNo(), 500, 250);
+					String oneCode = BarCodeTest.generateCode(new File(item.getBillNo() + "捆包号.png"), item.getBillNo(), 500, 250);
 					item.setOneCode(oneCode);
-					String qRCode = QRCodeTest.generateQRCode(new File("货物明细.png"), JSONObject.toJSONString(item));
-					item.setQRCode(qRCode);
+					String qRCode = QRCodeTest.generateQRCode(new File(item.getBillNo() + "货物明细.png"), JSONObject.toJSONString(item));
+					item.setQrCode(qRCode);
+					orderItemsMapper.updateById(item);
 				}
 			} else {
 				auditProecessDTO.setOrderQuantity(BigDecimal.ZERO);
 				auditProecessDTO.setAmount(BigDecimal.ZERO);
 			}
+			auditProecessDTO.setOrderQuantity(salesOrder.getStorageQuantity());
+			auditProecessDTO.setAmount(salesOrder.getStorageAmount());
 			auditProecessDTO.setOrderRemark(salesOrder.getOrderRemark());
 			auditProecessDTO.setGrossProfit(salesOrder.getGrossProfit());
 			auditProecessDTO.setGrossProfitRate(salesOrder.getGrossProfitRate());
@@ -1392,6 +1400,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 			LambdaQueryWrapper<Order> RKOrderLambdaQueryWrapper = new LambdaQueryWrapper<>();
 			RKOrderLambdaQueryWrapper
 				.eq(Order::getIsDeleted, 0)
+				.eq(Order::getOrderNo, order.getOrderNo())
 				.eq(Order::getBillType, OrderTypeEnum.WAREHOUSING.getType())
 				.eq(Order::getTenantId, AuthUtil.getTenantId());
 			Order RKOrder = baseMapper.selectOne(RKOrderLambdaQueryWrapper);
@@ -1467,12 +1476,36 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 	}
 
 	/**
+	 * 库存总账
+	 *
+	 * @param query
+	 * @param order
+	 * @return
+	 */
+	@Override
+	public List<Map<String, Object>> generalLedgerList(Query query, OrderTotalDTO order) {
+		List<Map<String, Object>> mapList = baseMapper.generalLedgerList(query, order);
+		return mapList;
+	}
+
+	/**
+	 * 库存总账(商品)
+	 *
+	 * @return
+	 */
+	@Override
+	public List<Map<String, Object>> generalLedgerListByGoods() {
+		return baseMapper.generalLedgerListByGoods(AuthUtil.getTenantId());
+	}
+
+	/**
 	 * 订单生成账单 并且推送财务消息
 	 *
 	 * @param order    订单信息
 	 * @param billType 货款类型: 申请 收费 付费
 	 * @param itemType 付款类型: 采购 销售 收货 发货
 	 */
+	@Transactional
 	public void paymentApply(Order order, String billType, String itemType) {
 		//获取所属公司中文名
 		if (order.getBelongToCorpId() != null) {