wangweiyu 4 年之前
父節點
當前提交
80cc59a8eb
共有 100 個文件被更改,包括 7675 次插入0 次删除
  1. 248 0
      pom.xml
  2. 26 0
      src/main/java/com/aoyang/tms/TmsApplication.java
  3. 35 0
      src/main/java/com/aoyang/tms/common/AuthLogConstant.java
  4. 110 0
      src/main/java/com/aoyang/tms/common/DefaultConstant.java
  5. 225 0
      src/main/java/com/aoyang/tms/common/ResultStatus.java
  6. 30 0
      src/main/java/com/aoyang/tms/common/TmsOrderStatus.java
  7. 24 0
      src/main/java/com/aoyang/tms/common/TmsTruckStatus.java
  8. 31 0
      src/main/java/com/aoyang/tms/common/TruckLogConstant.java
  9. 38 0
      src/main/java/com/aoyang/tms/config/ConfigInit.java
  10. 25 0
      src/main/java/com/aoyang/tms/config/MybatisPlusConfig.java
  11. 32 0
      src/main/java/com/aoyang/tms/config/RabbitConfig.java
  12. 38 0
      src/main/java/com/aoyang/tms/config/RedissonConfig.java
  13. 66 0
      src/main/java/com/aoyang/tms/config/XxlJobConfig.java
  14. 86 0
      src/main/java/com/aoyang/tms/controller/AppVersionController.java
  15. 17 0
      src/main/java/com/aoyang/tms/controller/param/AppVersionParam.java
  16. 36 0
      src/main/java/com/aoyang/tms/controller/vo/WarnVo.java
  17. 73 0
      src/main/java/com/aoyang/tms/entity/AppVersion.java
  18. 18 0
      src/main/java/com/aoyang/tms/entity/feignEntity/Org.java
  19. 96 0
      src/main/java/com/aoyang/tms/entity/feignEntity/OrgAccount.java
  20. 70 0
      src/main/java/com/aoyang/tms/entity/feignEntity/SmsSendLog.java
  21. 45 0
      src/main/java/com/aoyang/tms/entity/feignEntity/TransferOrder.java
  22. 114 0
      src/main/java/com/aoyang/tms/entity/feignEntity/TruckAccount.java
  23. 75 0
      src/main/java/com/aoyang/tms/entity/feignEntity/TruckDriverNoteVO.java
  24. 138 0
      src/main/java/com/aoyang/tms/entity/feignEntity/User.java
  25. 46 0
      src/main/java/com/aoyang/tms/entity/feignEntity/UserRole.java
  26. 57 0
      src/main/java/com/aoyang/tms/entity/feignEntity/WrapperUser.java
  27. 55 0
      src/main/java/com/aoyang/tms/entity/vo/DriverListAll.java
  28. 57 0
      src/main/java/com/aoyang/tms/entity/vo/GasOrderVo.java
  29. 92 0
      src/main/java/com/aoyang/tms/entity/vo/GasstationAppVO.java
  30. 48 0
      src/main/java/com/aoyang/tms/entity/vo/GasstationStoreListVO.java
  31. 112 0
      src/main/java/com/aoyang/tms/entity/vo/GasstationVO.java
  32. 108 0
      src/main/java/com/aoyang/tms/entity/vo/GctOrder.java
  33. 16 0
      src/main/java/com/aoyang/tms/entity/vo/StockLogReq.java
  34. 20 0
      src/main/java/com/aoyang/tms/entity/vo/StockLogVO.java
  35. 64 0
      src/main/java/com/aoyang/tms/entity/vo/TruckDriverTransferVO.java
  36. 83 0
      src/main/java/com/aoyang/tms/entity/vo/TruckDriverVO.java
  37. 220 0
      src/main/java/com/aoyang/tms/entity/vo/TruckVO.java
  38. 49 0
      src/main/java/com/aoyang/tms/exception/GeneralException.java
  39. 32 0
      src/main/java/com/aoyang/tms/exception/GlobalExceptionHandler.java
  40. 111 0
      src/main/java/com/aoyang/tms/feign/AccountFeign.java
  41. 26 0
      src/main/java/com/aoyang/tms/feign/AllinpayFeign.java
  42. 31 0
      src/main/java/com/aoyang/tms/feign/GasDataFeign.java
  43. 37 0
      src/main/java/com/aoyang/tms/feign/MessageFeign.java
  44. 70 0
      src/main/java/com/aoyang/tms/feign/PayFeign.java
  45. 51 0
      src/main/java/com/aoyang/tms/feign/SettleFeign.java
  46. 192 0
      src/main/java/com/aoyang/tms/feign/UserFeign.java
  47. 122 0
      src/main/java/com/aoyang/tms/feign/fallback/AccountFeignFallBack.java
  48. 31 0
      src/main/java/com/aoyang/tms/feign/fallback/AllinpayFeignFallBack.java
  49. 43 0
      src/main/java/com/aoyang/tms/feign/fallback/GasDataFeignFallBack.java
  50. 50 0
      src/main/java/com/aoyang/tms/feign/fallback/MessageFeignFallBack.java
  51. 87 0
      src/main/java/com/aoyang/tms/feign/fallback/PayFeignFallBack.java
  52. 53 0
      src/main/java/com/aoyang/tms/feign/fallback/SettleFeignFallBack.java
  53. 223 0
      src/main/java/com/aoyang/tms/feign/fallback/UserFeignFallBack.java
  54. 52 0
      src/main/java/com/aoyang/tms/feign/param/AuthLog.java
  55. 16 0
      src/main/java/com/aoyang/tms/feign/param/CarrierBalanceParam.java
  56. 24 0
      src/main/java/com/aoyang/tms/feign/param/CashbackParam.java
  57. 23 0
      src/main/java/com/aoyang/tms/feign/param/DistrictOrgIdsParam.java
  58. 29 0
      src/main/java/com/aoyang/tms/feign/param/DriverGctOrderParam.java
  59. 47 0
      src/main/java/com/aoyang/tms/feign/param/GasstationWeekAverageQty.java
  60. 18 0
      src/main/java/com/aoyang/tms/feign/param/StatisticsGasstationParam.java
  61. 19 0
      src/main/java/com/aoyang/tms/feign/param/findTruckBalancesParam.java
  62. 98 0
      src/main/java/com/aoyang/tms/feign/result/DriverApply.java
  63. 86 0
      src/main/java/com/aoyang/tms/feign/result/DriverWhiteList.java
  64. 66 0
      src/main/java/com/aoyang/tms/feign/result/GasstationCardVO.java
  65. 58 0
      src/main/java/com/aoyang/tms/feign/result/GasstationTradeSum.java
  66. 62 0
      src/main/java/com/aoyang/tms/util/BadRequestExceptionHandler.java
  67. 55 0
      src/main/java/com/aoyang/tms/util/BaseLocalDateFormatUtils.java
  68. 37 0
      src/main/java/com/aoyang/tms/util/BigDecimalUtils.java
  69. 433 0
      src/main/java/com/aoyang/tms/util/DateUtils.java
  70. 159 0
      src/main/java/com/aoyang/tms/util/ErrCodeEnum.java
  71. 151 0
      src/main/java/com/aoyang/tms/util/FileUtil.java
  72. 78 0
      src/main/java/com/aoyang/tms/util/Hanzi2Pinyin.java
  73. 55 0
      src/main/java/com/aoyang/tms/util/InputCheckUtils.java
  74. 181 0
      src/main/java/com/aoyang/tms/util/JxlsUtils.java
  75. 147 0
      src/main/java/com/aoyang/tms/util/LocalDateTimeFormatUtil.java
  76. 171 0
      src/main/java/com/aoyang/tms/util/LocalDateTimeUtils.java
  77. 128 0
      src/main/java/com/aoyang/tms/util/Md5SaltPassword.java
  78. 33 0
      src/main/java/com/aoyang/tms/util/NumberUtils.java
  79. 303 0
      src/main/java/com/aoyang/tms/util/QRCodeUtils.java
  80. 159 0
      src/main/java/com/aoyang/tms/util/ReadExcelTools.java
  81. 41 0
      src/main/java/com/aoyang/tms/util/RequestInfoUtil.java
  82. 84 0
      src/main/java/com/aoyang/tms/util/Result.java
  83. 143 0
      src/main/java/com/aoyang/tms/util/ValidList.java
  84. 8 0
      src/main/java/com/aoyang/tms/util/validUtil/Group.java
  85. 5 0
      src/main/java/com/aoyang/tms/util/validUtil/Insert.java
  86. 5 0
      src/main/java/com/aoyang/tms/util/validUtil/Query.java
  87. 5 0
      src/main/java/com/aoyang/tms/util/validUtil/Update.java
  88. 59 0
      src/main/profiles/dev/bootstrap.yml
  89. 155 0
      src/main/profiles/dev/logback-spring.xml
  90. 67 0
      src/main/profiles/local/bootstrap.yml
  91. 104 0
      src/main/profiles/local/logback-spring.xml
  92. 59 0
      src/main/profiles/prod/bootstrap.yml
  93. 117 0
      src/main/profiles/prod/logback-spring.xml
  94. 60 0
      src/main/profiles/test/bootstrap.yml
  95. 154 0
      src/main/profiles/test/logback-spring.xml
  96. 39 0
      src/main/resources/application.yml
  97. 二進制
      src/main/resources/exceltpl/Lng_tpl.xlsx
  98. 二進制
      src/main/resources/exceltpl/download_stock_log_tpl.xlsx
  99. 二進制
      src/main/resources/exceltpl/stock_log_list_tpl.xlsx
  100. 0 0
      src/main/resources/exceltpl/store_list_tpl.xlsx

+ 248 - 0
pom.xml

@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>auyen</artifactId>
+        <groupId>com.aoyang</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>tms</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <name>tms-运力服务</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>eu.bitwalker</groupId>
+            <artifactId>UserAgentUtils</artifactId>
+            <version>1.21</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>javax.mail</groupId>
+            <artifactId>mail</artifactId>
+            <version>1.4.7</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <!-- 导出excel -->
+        <dependency>
+            <groupId>org.jxls</groupId>
+            <artifactId>jxls</artifactId>
+            <version>2.4.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jxls</groupId>
+            <artifactId>jxls-poi</artifactId>
+            <version>1.0.15</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.15</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.15</version>
+        </dependency>
+
+
+        <!-- 注册中心 -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+        <!-- 配置中心 -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-client</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-spring-context</artifactId>
+            <version>1.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+        </dependency>
+        <!-- mysql -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <!-- mybatis plus -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+        <!-- 引入Lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!-- 引入aoyang swagger -->
+        <dependency>
+            <groupId>com.aoyang</groupId>
+            <artifactId>swagger</artifactId>
+            <version>1.1-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <artifactId>common</artifactId>
+            <groupId>com.aoyang</groupId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.belerweb</groupId>
+            <artifactId>pinyin4j</artifactId>
+            <version>2.5.0</version>
+        </dependency>
+        <!-- xxl-job-core -->
+        <dependency>
+            <groupId>com.xuxueli</groupId>
+            <artifactId>xxl-job-core</artifactId>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-logback-1.x -->
+        <dependency>
+            <groupId>org.apache.skywalking</groupId>
+            <artifactId>apm-toolkit-logback-1.x</artifactId>
+            <version>8.5.0</version>
+        </dependency>
+
+
+    </dependencies>
+
+    <profiles>
+        <!-- 本地环境 -->
+        <profile>
+            <id>local</id>
+            <properties>
+                <ENV>local</ENV>
+            </properties>
+            <build>
+                <resources>
+                    <resource>
+                        <directory>src/main/profiles/local</directory>
+                        <filtering>true</filtering>
+                    </resource>
+                </resources>
+            </build>
+        </profile>
+        <!-- 开发环境 -->
+        <profile>
+            <id>dev</id>
+            <properties>
+                <ENV>dev</ENV>
+            </properties>
+            <build>
+                <resources>
+                    <resource>
+                        <directory>src/main/profiles/dev</directory>
+                        <filtering>true</filtering>
+                    </resource>
+                </resources>
+            </build>
+        </profile>
+        <!-- 测试环境 -->
+        <profile>
+            <id>test</id>
+            <properties>
+                <ENV>test</ENV>
+            </properties>
+            <build>
+                <resources>
+                    <resource>
+                        <directory>src/main/profiles/test</directory>
+                        <filtering>true</filtering>
+                    </resource>
+                </resources>
+            </build>
+        </profile>
+        <!-- 生产环境 -->
+        <profile>
+            <id>prod</id>
+            <properties>
+                <ENV>prod</ENV>
+            </properties>
+            <build>
+                <resources>
+                    <resource>
+                        <directory>src/main/profiles/prod</directory>
+                        <filtering>true</filtering>
+                    </resource>
+                </resources>
+            </build>
+        </profile>
+    </profiles>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*.*</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <configuration>
+                    <!-- 指定该Main Class为全局的唯一入口 -->
+                    <mainClass>com.aoyang.tms.TmsApplication</mainClass>
+                    <layout>ZIP</layout>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 26 - 0
src/main/java/com/aoyang/tms/TmsApplication.java

@@ -0,0 +1,26 @@
+package com.aoyang.tms;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import com.aoyang.swagger.annotation.EnableAoYangSwagger2;
+
+/**
+ * @Description: 启动类
+ * @Author: panenming
+ * @CreateDate: 2019/12/4 下午9:28
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableTransactionManagement
+@EnableAoYangSwagger2
+@EnableFeignClients(basePackages = "com.aoyang.tms.feign")
+public class TmsApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(TmsApplication.class, args);
+    }
+
+}

+ 35 - 0
src/main/java/com/aoyang/tms/common/AuthLogConstant.java

@@ -0,0 +1,35 @@
+package com.aoyang.tms.common;
+
+/**
+ * @author zhuangxl
+ * @description 个人身份证认证、驾驶证认证、行驶证认证常量
+ * @since 2021-03-23 10:23
+ */
+public class AuthLogConstant {
+
+    /**
+     * 认证成功
+     **/
+    public static final Integer AUTH_SUCCESS = 1;
+
+    /**
+     * 认证失败
+     **/
+    public static final Integer AUTH_FAILURE = 0;
+
+    /**
+     * 认证类型:个人身份证二要素认证
+     **/
+    public static final Integer AUTH_TYPE_IDCARD = 1;
+
+    /**
+     * 认证类型:驾驶证认证
+     **/
+    public static final Integer AUTH_TYPE_DRIVER_LICENSE = 2;
+
+    /**
+     * 认证类型:行驶证认证
+     **/
+    public static final Integer AUTH_TYPE_VEHICLE_LICENSE = 3;
+
+}

+ 110 - 0
src/main/java/com/aoyang/tms/common/DefaultConstant.java

@@ -0,0 +1,110 @@
+package com.aoyang.tms.common;
+
+/**
+ * @author zhuangxl
+ * @description 默认配置信息
+ * @since 2021-03-10 11:44
+ */
+public class DefaultConstant {
+
+    /**
+     * 默认组织:用于无组织用户默认的组织
+     * 默认组织id(原固定写死,700157450778984448 不可更改。2021-08-02修改为读取配置文件)
+     **/
+    public static Long DEFAULT_ORG_ID;
+
+    /**
+     * 默认组织:用于无组织用户默认的组织
+     * 默认组织名称
+     **/
+    public static String DEFAULT_ORG_NAME="平台加气集体户";
+
+    /**
+     * 营销组织id
+     **/
+    public static Long MARKETING_ORG_ID;
+
+    /**
+     * 默认角色:用于无角色用户默认的角色
+     * 默认基本角色ID
+     **/
+    public static final String DEFAULT_BASE_ROLE_ID = "register";
+    /**
+     * 默认角色:用于无角色用户默认的角色
+     * 默认基本角色名称
+     **/
+    public static final String DEFAULT_BASE_ROLE_NAME = "平台用户";
+
+
+    /**
+     * 默认角色:用于无端用户默认的端
+     * 默认端ID
+     **/
+    public static final String DEFAULT_CLIENT_ID = "mwxservice";
+
+    /**
+     * 微信公众号
+     **/
+    public static final String WX_CLIENT_ID = "mwxservice";
+    /**
+     * 物流公司
+     **/
+    public static final String CARRIER_CLIENT_ID = "wcarrier";
+
+    /**
+     * 加气站
+     **/
+    public static final String GAS_STATION_CLIENT_ID = "wfiller";
+
+    /**
+     * 物流公司管理员角色id
+     **/
+    public static final String CARRIER_ADMIN_ROLE_ID = "carrier";
+    /**
+     * 物流公司管理员角色名称
+     **/
+    public static final String CARRIER_ADMIN_ROLE_NAME = "物流公司管理员";
+    /**
+     * 加气站管理员角色id
+     **/
+    public static final String GAS_STATION_ADMIN_ROLE_ID = "filler";
+    /**
+     * 加气站管理员角色名称
+     **/
+    public static final String GAS_STATION_ADMIN_ROLE_NAME = "加气站管理员";
+    /**
+     * 司机角色id
+     **/
+    public static final String DRIVER_ROLE_ID = "driver";
+    /**
+     * 司机角色名称
+     **/
+    public static final String DRIVER_ROLE_NAME = "司机";
+
+    /**
+     * 收银员角色id
+     **/
+    public static final String CASHIER_ROLE_ID = "cashier";
+    /**
+     * 收银员角色名称
+     **/
+    public static final String CASHIER_ROLE_NAME = "收银员";
+
+    /**
+     * 用户类型:0 平台方用户  1加气企业用户 2物流公司 用户 3卡车经销商用户 10 平台用户
+     **/
+    public static final Integer DEFAULT_USER_TYPE = 10;
+    public static final Integer REGISTER_USER_TYPE = 10;
+    public static final Integer PLATFORM_OWNER_USER_TPYE = 0;
+    public static final Integer GAS_STATION_USER_TPYE = 1;
+    public static final Integer CARRIER_USER_TPYE = 2;
+
+    /**
+     * 组织类型:(0:平台方企业 1:加气站  2:物流公司 3:卡车经销商
+     **/
+    public static final Integer PLATFORM_ORG_TPYE = 0;
+    public static final Integer GAS_STATION_ORG_TPYE = 1;
+    public static final Integer CARRIER_ORG_TPYE = 2;
+
+
+}

+ 225 - 0
src/main/java/com/aoyang/tms/common/ResultStatus.java

@@ -0,0 +1,225 @@
+package com.aoyang.tms.common;
+
+/**
+ * @author liujiren
+ */
+
+public enum ResultStatus {
+    /**
+     * 请求头中Authorization,identifier不存在或错误
+     */
+    AUTHORIZATION_HEADER(2800, "请求头中参数不存在或错误"),
+    /**
+     * 请求认证类型参数auth_type, 授权类型参数grant_type不存在或错误
+     */
+    AUTHORIZATION_TYPE(2801, "请求认证授权类型参数不存在或错误"),
+    /**
+     * 请求参数username或password为空
+     */
+    USER_PASSWORD_EMPTY(2803, "用户名或密码不能为空"),
+    /**
+     * 客户端ID错误
+     */
+    CLIENT_NOT_EXIST(2804, "客户端不存在"),
+    /**
+     * 客户端密钥错误
+     */
+    CLIENT_SECRET_ERROR(2805, "客户端密钥错误"),
+    /**
+     * 用户username错误
+     */
+    USER_NOT_EXSIT(2806, "用户不存在"),
+    /**
+     * 用户密码错误
+     */
+    USER_PASSWORD_ERROR(2807, "用户密码错误"),
+    /**
+     * 用户没有授权组织及角色
+     */
+    NO_ORG_ROLE(2808, "用户没有授权"),
+    /**
+     * 用户账户状态为停用
+     */
+    USER_IS_INVALID(2809, "您的账号已停用"),
+    /**
+     * Authorization携带的access_token解析出错
+     */
+    TOKEN_PARSE_ERROR(2810, "您提供的TOKEN解析错误"),
+    /**
+     * Identifier解析出错
+     */
+    IDENTIFIER_ERROR(2811, "您提供的Identifier解析错误"),
+    /**
+     * Token和Identifier内容不匹配
+     */
+    TOKEN_NOT_MATCH(2812, "您的Identifier与TOKEN不匹配"),
+    /**
+     * Identifier提供的角色在Token授权中不存在
+     */
+    ROLE_NOT_MATCH(2813, "您提供角色不在授权范围内"),
+    /**
+     * TOKEN过期或提供的Token与服务端保存的Token一致
+     */
+    TOKEN_EXPIRE(2814, "登录已超时,请重新登录"),
+    /**
+     *  userCode 已存在
+     */
+    USER_CODE_EXITS(2815,"该账号已存在"),
+    /**
+     * 校验码错误
+     */
+    BAD_VERIFY_CODE(2816, "校验码错误"),
+    /**
+     * 修改手机号码失败
+     */
+    MOBILE_RESET_FAIL(2817, "修改手机号码失败"),
+
+    /**
+     * 提交参数中没有手机号或组织编号
+     */
+    MOBILE_IS_REQUIRED(2860, "创建用户需要手机号"),
+    /**
+     * 提交参数中用户手机号已存在,说明用户已经存在
+     */
+    MOBILE_IS_EXIST(2861, "用户手机号系统已存在"),
+    /**
+     * 系统保存用户失败
+     */
+    USER_SAVE_ERROR(2862, "系统保存用户失败"),
+
+    /**
+     * 系统保存用户失败
+     */
+    USER_REGISTER_ERROR(2863, "用户注册失败"),
+    /**
+     * 请求参数错误
+     */
+    BAD_PARAM(2863, "请求参数错误"),
+    /**
+     * 熔断
+     */
+    CARRIER_FALL_BACK(2864, "修改司机信息进入熔断"),
+    /**
+     * 熔断
+     */
+    GASSTATION_FALL_BACK(2865, "进入熔断"),
+    /**
+     * 重置密码
+     */
+    PASSWORD_RESET_FAIL(2866, "重置密码失败"),
+    /**
+     * 系统更新用户失败
+     */
+    USER_UPDATE_ERROR(2867, "系统更新用户失败"),
+    /**
+     * 密码中不能包含空格
+     */
+    PASSWORD_HAVE_SPACE(2868, "密码中不能包含空格"),
+    /**
+     * 密码长度6-12位
+     */
+    PASSWORD_LENGTH_ERROR(2869, "请输入6-12位密码"),
+
+    /**
+     * 新旧密码相同
+     */
+    PASSWORD_EQUAL_OLD(2873, "新旧密码相同"),
+
+    /**
+     * 组织类型错误
+     */
+    ORG_TYPE_ERROR(2870, "组织类型不存在"),
+    /**
+     * 组织ID错误
+     */
+    ORG_ID_ERROR(2871, "组织ID不存在"),
+    /**
+     * 组织名称为空
+     */
+    ORG_NAME_EMPTY(2872, "组织名称为空"),
+    /**
+     * 组织不存在
+     */
+    ORG_NOT_EXITS(2873,"组织不存在"),
+
+    /**
+     * 组织不存在
+     */
+    COMPANY_START_EXITS(2874,"请先启动所属公司"),
+
+    /**
+     * 无修改权限
+     */
+    HAVE_NOT_AUTH(2875,"无权限"),
+
+    /**
+     * 组织认证中
+     */
+    COMPANY_AUTH_STATUS(2876,"组织认证中"),
+    /**
+     * 组织已认证
+     */
+    COMPANY_AUTH_READY(2877,"组织已认证"),
+
+    /**
+     * 手机号不足11位
+     */
+    MOBILE_LENGTH_ERROR(2878,"手机号不足11位"),
+
+    /**
+     * 导入失败
+     */
+    IMPORT_ERROR(2879,"导入用户失败"),
+
+    /**
+     * 密码连续错误
+     */
+    PASSWORD_CONTINUE_ERROR(2880, "密码需复杂一些,不要输入类似12345678,87654321等连续性的密码"),
+    /**
+     * 密码重复错误
+     */
+    PASSWORD_REPEAT_ERROR(2881, "密码需复杂一些,不要输入类似11111111,22222222等连重复性的密码"),
+    /**
+     * 用户首次登录选择角色,保存更新失败
+     */
+    ROLE_CHOOSE_UPDATE_ERROR(2882, "入驻角色选择更新失败"),
+    /**
+     * 用户首次登录选择角色,保存更新失败
+     */
+    IDCARD_AUTH_ERROR(2883, "身份证认证失败"),
+
+    /**
+     * account 熔断
+     */
+    ACCOUNT_FEIGN_ERROR(2900, "进入account 熔断"),
+
+    /**
+     * 更新加气基本信息失败
+     */
+    UPDATE_GASSTATION_ERROR(2901, "更新加气基本信息失败"),
+
+    /**
+     * 加气站简介长度过长
+     */
+    GASSTATION_INTRODUCE_TOO_LONG(2902, "加气站简介不能超过400字"),
+
+    /**
+     * 进入熔断
+     */
+    FALL_BACK_ERROR(4000, "进入熔断"),
+
+    ;
+
+    private int code;
+    private String message;
+    public int getCode() {
+        return code;
+    }
+    public String getMessage() {
+        return message;
+    }
+    ResultStatus(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+}

+ 30 - 0
src/main/java/com/aoyang/tms/common/TmsOrderStatus.java

@@ -0,0 +1,30 @@
+package com.aoyang.tms.common;
+
+/**
+ * @Description: TMS运单作业状态常量类
+ */
+public class TmsOrderStatus {
+
+    //已取消
+    public static final int CONCELED = -1;
+
+    //待执行
+    public static final int TODO = 0;
+
+    //前往装卸车点
+    public static final int ON_WAY = 1;
+
+    //装卸车等待
+    public static final int QUEUE = 2;
+
+    //成果报备中
+    public static final int SUBMIT = 3;
+
+    //已完成
+    public static final int COMPLETED = 4;
+
+    //已关闭
+    public static final int CLOSED = 5;
+
+
+}

+ 24 - 0
src/main/java/com/aoyang/tms/common/TmsTruckStatus.java

@@ -0,0 +1,24 @@
+package com.aoyang.tms.common;
+
+/**
+ * @Description: TMS卡车状态常量类
+ */
+public class TmsTruckStatus {
+
+    //已收车
+    public static final int DONE = 0;
+
+    //出车前检查
+    public static final int PRE_CHECK = 1;
+
+    //出车作业中
+    public static final int WORKING = 2;
+
+    //收车中
+    public static final int RETURNING = 3;
+
+    //收车后检查
+    public static final int AFTER_CHECK = 4;
+
+
+}

+ 31 - 0
src/main/java/com/aoyang/tms/common/TruckLogConstant.java

@@ -0,0 +1,31 @@
+package com.aoyang.tms.common;
+
+/**
+ * @author zhuangxl
+ * @description 车辆日志类型
+ * @since 2021-06-04 13:58
+ */
+public class TruckLogConstant {
+
+    /**
+     * 日志类型
+     * 0-基本信息修改
+     * 1-新增
+     * 2-绑定
+     * 3-司机退出物流公司解绑车辆
+     * 4-卡车退出物流公司,进入资源池
+     * 5-司机和车辆同时退出,其他司机解绑
+     * 6-卡车停用,解绑司机
+     * 20-转移组织
+     * 30-卡车停用
+     * 31-卡车启用
+     * 40-车辆认证
+     * 50-变更车辆性质或圈存方式
+     * 60-车辆组合支付启用
+     * 61-车辆组合支付停用
+     * 62-车辆组合支付协议上传
+     **/
+    public static final Integer COM_STATUS_START = 60;
+    public static final Integer COM_STATUS_STOP = 61;
+    public static final Integer COM_STATUS_CONTRACT_UPLOAD = 62;
+}

+ 38 - 0
src/main/java/com/aoyang/tms/config/ConfigInit.java

@@ -0,0 +1,38 @@
+package com.aoyang.tms.config;
+
+import com.aoyang.tms.common.DefaultConstant;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+
+/**
+ * @author zhuangxl
+ * @description
+ * @since 2021-07-22 16:15
+ */
+@Configuration
+@RefreshScope
+@Data
+@Slf4j
+public class ConfigInit {
+
+    @Value("${auyen.default-org-id}")
+    private Long defaultOrgId;
+
+    @Value("${auyen.marketing-org-id}")
+    private Long marketingOrgId;
+
+    @PostConstruct
+    public void init() throws Exception{
+
+        DefaultConstant.DEFAULT_ORG_ID = defaultOrgId;
+        log.info("important-----------获取配置中的默认组织ID(orgId):{}", DefaultConstant.DEFAULT_ORG_ID);
+
+        DefaultConstant.MARKETING_ORG_ID = marketingOrgId;
+        log.info("important-----------获取配置中的营销组织ID(orgId):{}", DefaultConstant.MARKETING_ORG_ID);
+    }
+}

+ 25 - 0
src/main/java/com/aoyang/tms/config/MybatisPlusConfig.java

@@ -0,0 +1,25 @@
+package com.aoyang.tms.config;
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Description: mybatis plus config
+ * @Author: panenming
+ * @CreateDate: 2019/12/5 下午6:40
+ */
+@Configuration
+@MapperScan("com.aoyang.strategy.mapper")
+public class MybatisPlusConfig {
+    /**
+     * 分页插件,自动识别数据库类型
+     *
+     * @return
+     */
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        return new PaginationInterceptor();
+    }
+}

+ 32 - 0
src/main/java/com/aoyang/tms/config/RabbitConfig.java

@@ -0,0 +1,32 @@
+package com.aoyang.tms.config;
+
+import org.springframework.amqp.core.Queue;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author liujiren
+ */
+@Configuration
+public class RabbitConfig {
+    @Bean
+    public Queue orgAdd() {
+        return new Queue("orgAdd", true);
+    }
+
+    @Bean
+    public Queue gasstationAdd() {
+        return new Queue("gasstationAdd", true);
+    }
+
+    @Bean
+    public Queue gasOrderStrategy() {
+        return new Queue("gasOrderStrategy", true);
+    }
+
+    @Bean
+    public Queue Msg() {
+        return new Queue("msg", true);
+    }
+
+}

+ 38 - 0
src/main/java/com/aoyang/tms/config/RedissonConfig.java

@@ -0,0 +1,38 @@
+package com.aoyang.tms.config;
+
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Data;
+
+/**
+ * @author liujiren
+ */
+@RefreshScope
+@Data
+@Configuration
+public class RedissonConfig {
+    @Value("${spring.redis.host}")
+    private String host = "";
+    @Value("${spring.redis.port}")
+    private String port = "";
+    @Value("${spring.redis.password}")
+    private String password = "";
+
+    /**
+     * 配置单节点模式
+     *
+     * @return 配置好的redisson
+     */
+    @Bean
+    public RedissonClient redissonClient() {
+        Config config = new Config();
+        config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(password);
+        return Redisson.create(config);
+    }
+}

+ 66 - 0
src/main/java/com/aoyang/tms/config/XxlJobConfig.java

@@ -0,0 +1,66 @@
+package com.aoyang.tms.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
+
+import lombok.Data;
+
+@Configuration
+@RefreshScope
+@Data
+public class XxlJobConfig {
+
+    @Value("${xxl.job.admin.addresses}")
+    private String adminAddresses;
+
+    @Value("${xxl.job.accessToken}")
+    private String accessToken;
+
+    @Value("${xxl.job.executor.appname}")
+    private String appname;
+
+    @Value("${xxl.job.executor.address}")
+    private String address;
+
+    @Value("${xxl.job.executor.ip}")
+    private String ip;
+
+    @Value("${xxl.job.executor.port}")
+    private int port;
+
+    @Value("${xxl.job.executor.logpath}")
+    private String logPath;
+
+    @Value("${xxl.job.executor.logretentiondays}")
+    private int logRetentionDays;
+
+    @Bean
+    public XxlJobSpringExecutor xxlJobExecutor() {
+        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
+        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
+        xxlJobSpringExecutor.setAppname(appname);
+        xxlJobSpringExecutor.setAddress(address);
+        xxlJobSpringExecutor.setIp(ip);
+        xxlJobSpringExecutor.setPort(port);
+        xxlJobSpringExecutor.setAccessToken(accessToken);
+        xxlJobSpringExecutor.setLogPath(logPath);
+        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
+        return xxlJobSpringExecutor;
+    }
+
+    /**
+     * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
+     *
+     * 1、引入依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-commons</artifactId>
+     * <version>${version}</version> </dependency>
+     *
+     * 2、配置文件,或者容器启动变量 spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
+     *
+     * 3、获取IP String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
+     */
+
+}

+ 86 - 0
src/main/java/com/aoyang/tms/controller/AppVersionController.java

@@ -0,0 +1,86 @@
+package com.aoyang.tms.controller;
+
+
+import com.alibaba.fastjson.JSON;
+import com.aoyang.tms.controller.param.AppVersionParam;
+import com.aoyang.tms.util.ErrCodeEnum;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.annotation.Resource;
+
+import com.aoyang.tms.service.AppVersionService;
+import com.aoyang.tms.entity.AppVersion;
+import com.aoyang.common.result.Result;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.aoyang.common.param.PageParam;
+
+
+/**
+ * <p>
+ * APP版本管理 控制器
+ * </p>
+ *
+ * @author guoyong
+ * @since 2021-04-12
+ */
+@RestController
+@Slf4j
+@Api(value = "app_versionCRUD接口")
+@RequestMapping("/strategy/app_version")
+public class AppVersionController {
+
+    @Resource
+    private AppVersionService appVersionService;
+
+    @ApiOperation(value = "检查版本", notes = "获取最新一条版本信息,客户端进行对比,判断强制更新以及提示更新")
+    @PostMapping("/check_version")
+    public Result check(@RequestBody AppVersionParam appVersionParam) {
+        log.info("获取最新APP版本,/strategy/app_version/check_version,参数:{}", JSON.toJSONString(appVersionParam));
+        if (appVersionParam == null || appVersionParam.getOsType() == null) {
+            return new Result<>(ErrCodeEnum.BAD_PARAM.getCode(), ErrCodeEnum.BAD_PARAM.getMessage());
+        }
+        AppVersion lasted = appVersionService.getLatestVersion(appVersionParam.getOsType());
+        return new Result<>(lasted);
+    }
+
+
+    @ApiOperation(value = "获取app_version列表", notes = "")
+    @PostMapping("/list")
+    public Result list(@RequestBody PageParam<AppVersion> pageParam) {
+        log.info("获取APP版本列表,/strategy/app_version/list,参数:{}", JSON.toJSONString(pageParam));
+        Page<AppVersion> page = new Page<>(pageParam.getPage(), pageParam.getSize());
+        IPage<AppVersion> records = appVersionService.page(page, Wrappers.query(pageParam.getParam()));
+        return new Result<>(records);
+    }
+
+    @ApiOperation(value = "修改app_version", notes = "根据id修改app_version")
+    @PostMapping("/update")
+    public Result update(@RequestBody AppVersion appVersion) {
+        log.info("更新app版本,/strategy/app_version/update,参数:{}", JSON.toJSONString(appVersion));
+        if (appVersion == null || appVersion.getId() == null) {
+            return new Result<>(ErrCodeEnum.BAD_PARAM.getCode(), ErrCodeEnum.BAD_PARAM.getMessage());
+        }
+        Boolean flag = appVersionService.updateById(appVersion);
+        return new Result<>(flag);
+    }
+
+    @ApiOperation(value = "添加app_version", notes = "新增一条app_version")
+    @PostMapping("/add")
+    public Result add(@RequestBody AppVersion appVersion) {
+        log.info("添加app版本,/strategy/app_version/add,参数:{}", JSON.toJSONString(appVersion));
+        if (appVersion == null || appVersion.getOsType() == null || appVersion.getMinVersion() == null || StringUtils.isBlank(appVersion.getVersionName()) || StringUtils.isBlank(appVersion.getNote())) {
+            return new Result<>(ErrCodeEnum.BAD_PARAM.getCode(), ErrCodeEnum.BAD_PARAM.getMessage());
+        }
+        Boolean flag = appVersionService.save(appVersion);
+        return new Result<>(flag);
+    }
+
+}

+ 17 - 0
src/main/java/com/aoyang/tms/controller/param/AppVersionParam.java

@@ -0,0 +1,17 @@
+package com.aoyang.tms.controller.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Description: APP版本查询参数类
+ * @Author guoyong
+ * @Date 2021/4/12 15:32
+ * @Version 1.0
+ */
+@Data
+public class AppVersionParam {
+
+    @ApiModelProperty(value = "1.andriod、2.ios")
+    private Integer osType;
+}

+ 36 - 0
src/main/java/com/aoyang/tms/controller/vo/WarnVo.java

@@ -0,0 +1,36 @@
+package com.aoyang.tms.controller.vo;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Description: 预警配置列表
+ * @author: lishanglei
+ * @version: v1.0.0
+ * @date: 2021-07-16 14:09:32
+ */
+@Data
+@ApiModel(value = "预警配置列表", description = "预警配置列表")
+public class WarnVo {
+
+    @ApiModelProperty(value = "物流公司id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    @ApiModelProperty(value = "物流公司名称")
+    private String orgName;
+
+    @ApiModelProperty(value = "物流公司简称")
+    private String orgShortName;
+
+    @ApiModelProperty(value = "预警值")
+    private BigDecimal warnValue;
+
+    @ApiModelProperty(value = "预警人员信息")
+    private String warnObject;
+}

+ 73 - 0
src/main/java/com/aoyang/tms/entity/AppVersion.java

@@ -0,0 +1,73 @@
+package com.aoyang.tms.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * APP版本管理
+ * </p>
+ *
+ * @author guoyong
+ * @since 2021-04-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("app_version")
+@ApiModel(value = "AppVersion对象", description = "APP版本管理")
+public class AppVersion implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "1.andriod、2.ios")
+    @TableField("os_type")
+    private Integer osType;
+
+    @ApiModelProperty(value = "版本名")
+    @TableField("version_name")
+    private String versionName;
+
+    @ApiModelProperty(value = "支持最小版本号")
+    @TableField("min_version")
+    private Integer minVersion;
+
+    @ApiModelProperty(value = "APK下载地址")
+    @TableField("apk_url")
+    private String apkUrl;
+
+    @ApiModelProperty(value = "文件大小(单位KB)")
+    @TableField("apk_size")
+    private String apkSize;
+
+    @ApiModelProperty(value = "版本更新提示内容")
+    @TableField("updateDescription")
+    private String updateDescription;
+
+    @ApiModelProperty(value = "当前版本备注(运维用)")
+    @TableField("note")
+    private String note;
+
+    @ApiModelProperty(value = "发布时间")
+    @TableField("publish_time")
+    private LocalDateTime publishTime;
+
+
+}

+ 18 - 0
src/main/java/com/aoyang/tms/entity/feignEntity/Org.java

@@ -0,0 +1,18 @@
+package com.aoyang.tms.entity.feignEntity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+/**
+ * @author xumingrui
+ * @date 2020/7/13 10:07 上午
+ * @Description:<描述> TODO
+ */
+@Data
+public class Org {
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long orgId;
+    private Integer status;
+    private Integer tradeType;
+    private String orgName;
+}

+ 96 - 0
src/main/java/com/aoyang/tms/entity/feignEntity/OrgAccount.java

@@ -0,0 +1,96 @@
+package com.aoyang.tms.entity.feignEntity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author panenming
+ * @since 2020-02-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("org_account")
+@ApiModel(value = "OrgAccount对象", description = "")
+public class OrgAccount implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "组织id(user.org.org_id)")
+    @TableField("org_id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long orgId;
+
+
+    @ApiModelProperty(value = "组织名称(user.org.org_name)")
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "组织简称(user.org.org_short_name)")
+    @TableField("org_short_name")
+    private String orgShortName;
+
+    @ApiModelProperty(value = "账户id(调用API生成)")
+    @TableId(value = "account_id", type = IdType.INPUT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long accountId;
+
+    @ApiModelProperty(value = "账户密码")
+    @TableField("account_password")
+    private String accountPassword;
+
+    @ApiModelProperty(value = "账户金额")
+    @TableField("balance")
+    private BigDecimal balance;
+
+    @ApiModelProperty(value = "组织类型(0:奥扬 1:加气企业 2:物流公司 3:卡车经销商)")
+    @TableField("org_type")
+    private Integer orgType;
+
+    @ApiModelProperty(value = "账户类型(0:现金账户)")
+    @TableField("account_type")
+    private Integer accountType;
+
+    @ApiModelProperty(value = "是否可自动划账(1:自动划账)(只对org_type=2有效)")
+    @TableField("auto_account")
+    private Integer autoAccount;
+
+    @ApiModelProperty(value = "创建人id")
+    @TableField("creater")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long creater;
+
+    @ApiModelProperty(value = "创建人名称")
+    @TableField("creater_name")
+    private String createrName;
+
+    @ApiModelProperty(value = "创建日期时间")
+    @TableField("create_date")
+    private LocalDateTime createDate;
+
+    @ApiModelProperty(value = "状态(0:启用 1:停用)")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty(value = "银行余额")
+    @TableField("bank_balance")
+    private BigDecimal bankBalance;
+
+
+}

+ 70 - 0
src/main/java/com/aoyang/tms/entity/feignEntity/SmsSendLog.java

@@ -0,0 +1,70 @@
+package com.aoyang.tms.entity.feignEntity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+    * 
+    * </p>
+ *
+ * @author panenming
+ * @since 2020-03-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sms_send_log")
+@ApiModel(value="SmsSendLog对象", description="")
+public class SmsSendLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long id;
+
+    @ApiModelProperty(value = "组织id(user.org.org_id)")
+    @TableField("org_id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long orgId;
+
+    @ApiModelProperty(value = "用户id(user.user.user_id)")
+    @TableField("user_id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long userId;
+
+    @ApiModelProperty(value = "哪一端")
+    @TableField("client_id")
+    private String clientId;
+
+    @ApiModelProperty(value = "0.身份验证1.登录确认2.注册用户3.修改密码 ")
+    @TableField("type")
+    private Integer type;
+
+    @ApiModelProperty(value = "手机号")
+    @TableField("mobile")
+    private String mobile;
+
+    @ApiModelProperty(value = "发送内容")
+    @TableField("content")
+    private String content;
+
+    @ApiModelProperty(value = "发送日期")
+    @TableField("send_time")
+    private LocalDateTime sendTime;
+
+
+}

+ 45 - 0
src/main/java/com/aoyang/tms/entity/feignEntity/TransferOrder.java

@@ -0,0 +1,45 @@
+package com.aoyang.tms.entity.feignEntity;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Setter
+@Getter
+@ToString
+public class TransferOrder {
+
+    private Long orgId;
+
+    private String orgName;
+
+    private Long truckId;
+
+    private String carNumber;
+
+    private BigDecimal amount;
+
+    private Long creater;
+
+    private String createrName;
+
+    private LocalDateTime createDate;
+
+    private String note;
+
+    // 支付渠道
+    private String payChannelId;
+
+    // 不需要填写的参数
+    private Long accountId;
+
+    private BigDecimal balance;
+
+    private Integer type;
+
+    private Long orderId;
+
+}

+ 114 - 0
src/main/java/com/aoyang/tms/entity/feignEntity/TruckAccount.java

@@ -0,0 +1,114 @@
+package com.aoyang.tms.entity.feignEntity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author panenming
+ * @since 2020-02-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("truck_account")
+@ApiModel(value = "TruckAccount对象", description = "")
+public class TruckAccount implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "组织id(user.org.org_id)")
+    @TableField("org_id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long orgId;
+
+
+    @ApiModelProperty(value = "交易模式(1经销模式;2直销模式,默认经销模式1)")
+    @TableField("trade_type")
+    private Integer tradeType;
+
+    @ApiModelProperty(value = "组织名称(user.org.org_name)")
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "组织简称")
+    @TableField("org_short_name")
+    private String orgShortName;
+
+    @ApiModelProperty(value = "卡车id")
+    @TableField("truck_id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long truckId;
+
+    @ApiModelProperty(value = "账户id(调用API生成)")
+    @TableId(value = "account_id", type = IdType.INPUT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long accountId;
+
+    @ApiModelProperty(value = "账户密码")
+    @TableField("account_password")
+    private String accountPassword;
+
+    @ApiModelProperty(value = "账户金额")
+    @TableField("balance")
+    private BigDecimal balance;
+
+    @ApiModelProperty(value = "车牌号")
+    @TableField("car_number")
+    private String carNumber;
+
+    @ApiModelProperty(value = "账户类型(0:现金账户)")
+    @TableField("account_type")
+    private Integer accountType;
+
+    @ApiModelProperty(value = "创建人id")
+    @TableField("creater")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long creater;
+
+    @ApiModelProperty(value = "创建日期时间")
+    @TableField("create_date")
+    private LocalDateTime createDate;
+
+    @ApiModelProperty(value = "修改人id")
+    @TableField("updater")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long updater;
+
+    @ApiModelProperty(value = "修改日期时间")
+    @TableField("update_date")
+    private LocalDateTime updateDate;
+
+    @ApiModelProperty(value = "创建人姓名")
+    @TableField("creater_name")
+    private String createrName;
+
+
+    @ApiModelProperty(value = "0=自有车辆 1=挂靠车辆")
+    @TableField("linked")
+    private Integer linked;
+
+    @ApiModelProperty(value = "0=账户消费 1=自动圈存")
+    @TableField("auto_account")
+    private Integer autoAccount;
+
+    @ApiModelProperty(value = "状态(0:启用 1:停用)")
+    @TableField("status")
+    private Integer status;
+
+}

+ 75 - 0
src/main/java/com/aoyang/tms/entity/feignEntity/TruckDriverNoteVO.java

@@ -0,0 +1,75 @@
+package com.aoyang.tms.entity.feignEntity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author xumingrui
+ * @since 2020-02-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="TruckDriverNote对象", description="")
+public class TruckDriverNoteVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long id;
+
+    @ApiModelProperty(value = "组织id(user.org.org_id)")
+    @TableField("org_id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long orgId;
+
+    @ApiModelProperty(value = "卡车id")
+    @TableField("truck_id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long truckId;
+
+    @ApiModelProperty(value = "司机id(user.user.user_id)")
+    @TableField("driver_id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long driverId;
+
+    @ApiModelProperty(value = "司机名称(user.user.user_name)")
+    @TableField("driver_name")
+    private String driverName;
+
+    @ApiModelProperty(value = "创建人id")
+    @TableField("creater")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long creater;
+
+    @ApiModelProperty(value = "创建人姓名")
+    @TableField("creater_name")
+    private String createrName;
+
+    @ApiModelProperty(value = "创建日期时间")
+    @TableField("create_date")
+    private LocalDateTime createDate;
+
+    @ApiModelProperty(value = "绑定标识:未绑定, 默认:1:绑定")
+    @TableField(exist = false)
+    private  Integer flag = 1;
+
+    @ApiModelProperty(value = "备注信息")
+    private String note;
+
+}

+ 138 - 0
src/main/java/com/aoyang/tms/entity/feignEntity/User.java

@@ -0,0 +1,138 @@
+package com.aoyang.tms.entity.feignEntity;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author panenming
+ * @since 2020-02-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "User对象", description = "")
+public class User implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "组织id(user.org.org_id)")
+    @TableField("org_id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long orgId;
+
+    @ApiModelProperty(value = "用户id(调用API生成)")
+    @TableId(value = "user_id", type = IdType.INPUT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long userId;
+
+    @ApiModelProperty(value = "登录用户")
+    @TableField("user_code")
+    private String userCode;
+
+    @ApiModelProperty(value = "用户名")
+    @TableField("user_name")
+    private String userName;
+
+    @ApiModelProperty(value = "密码")
+    @TableField("password")
+    private String password;
+
+    @ApiModelProperty(value = "手机号")
+    @TableField("mobile")
+    private String mobile;
+
+    @ApiModelProperty(value = "身份证编号")
+    @TableField("id_card_no")
+    private String idCardNo;
+
+    @ApiModelProperty(value = "微信绑定信息(openid)")
+    @TableField("open_id")
+    private String openId;
+
+    @ApiModelProperty(value = "状态(0:启用 1:停用)")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty(value = "用户类型(0 平台用户 1加气企业用户 2物流公司 用户 3卡车经销商用户 4司机 5收银员")
+    @TableField("user_type")
+    private Integer userType;
+
+    @ApiModelProperty(value = "1-平台管理员 2-平台运营人员  3 物流公司管理者 4 司机  5 加气站企业管理者 6 收银员")
+    @TableField("base_role")
+    private String baseRole;
+
+    @ApiModelProperty(value = "创建人id")
+    @TableField("creater")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long creater;
+
+    @ApiModelProperty(value = "创建日期时间")
+    @TableField("create_date")
+    private LocalDateTime createDate;
+
+    @ApiModelProperty(value = "修改人id")
+    @TableField("updater")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long updater;
+
+    @ApiModelProperty(value = "修改日期时间")
+    @TableField("update_date")
+    private LocalDateTime updateDate;
+
+    @ApiModelProperty(value = "组织name(user.org.org_name)")
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "创建人Name")
+    @TableField("creater_name")
+    private String createrName;
+
+    @ApiModelProperty(value = "修改人Name")
+    @TableField("updater_name")
+    private String updaterName;
+
+    @ApiModelProperty(value = "绑定标识 0未绑定 1已绑定")
+    @TableField(exist = false)
+    private int flag;
+
+    @ApiModelProperty(value = "车牌号")
+    private String carNumber;
+
+    @ApiModelProperty(value = "卡车id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long truckId;
+
+    @ApiModelProperty(value = "关键字")
+    private String keyWord;
+
+    @ApiModelProperty(value = "最后登陆时间")
+    private String lastLoginDate;
+
+    public User() {
+        super();
+    }
+
+    public User(Long userId) {
+        this.userId = userId;
+    }
+
+    public User(String mobile) {
+        this.mobile = mobile;
+    }
+
+}

+ 46 - 0
src/main/java/com/aoyang/tms/entity/feignEntity/UserRole.java

@@ -0,0 +1,46 @@
+package com.aoyang.tms.entity.feignEntity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author panenming
+ * @since 2020-02-12
+ */
+@Data
+public class UserRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id主键")
+    private Long id;
+
+    @ApiModelProperty(value = "客户端id,司机端,默认为mwxservice")
+    private String clientId="mwxservice";
+
+    @ApiModelProperty(value = "组织id(如果user_id是收银员,则org_id是加气站id,如果user_id是驾驶员,则org_id是org_id)")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long orgId;
+
+    @ApiModelProperty(value = "组织名称")
+    private String orgName;
+
+    @ApiModelProperty(value = "操作员id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long userId;
+
+    @ApiModelProperty(value = "角色id")
+    private String roleId="driver";
+
+    @ApiModelProperty(value = "角色名称")
+    private String roleName="司机";
+
+
+}

+ 57 - 0
src/main/java/com/aoyang/tms/entity/feignEntity/WrapperUser.java

@@ -0,0 +1,57 @@
+package com.aoyang.tms.entity.feignEntity;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author panenming
+ * @since 2020-02-12
+ */
+@Data
+@ApiModel(value = "User对象")
+public class WrapperUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "组织id(user.org.org_id)")
+    private Long orgId;
+
+    @ApiModelProperty(value = "用户id(调用API生成)")
+    private Long userId;
+
+    @ApiModelProperty(value = "用户名")
+    private String userName;
+
+    @ApiModelProperty(value = "手机号")
+    private String mobile;
+
+    @ApiModelProperty(value = "关键字查询")
+    private String keyWord;
+
+    @ApiModelProperty(value = "用户类型(0 平台用户 1加气企业用户 2物流公司 用户 3卡车经销商用户 4司机 5收银员")
+    private Integer userType;
+
+    @ApiModelProperty(value = "1-平台管理员 2-平台运营人员  3 物流公司管理者 4 司机  5 加气站企业管理者 6 收银员")
+    private String baseRole;
+
+    @ApiModelProperty(value = "组织name(user.org.org_name)")
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "排除掉的用户id")
+    private List<Long> excludeList;
+
+    @ApiModelProperty(value = "已选标识")
+    private Integer flag;
+
+}

+ 55 - 0
src/main/java/com/aoyang/tms/entity/vo/DriverListAll.java

@@ -0,0 +1,55 @@
+package com.aoyang.tms.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonFormat.Shape;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author xumingrui
+ * @since 2020-02-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("driver")
+@ApiModel(value="Driver对象", description="")
+public class DriverListAll implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "司机id(user.user.user_id)")
+    @JsonFormat(shape = Shape.STRING)
+    @TableId(value="driver_id",type = IdType.INPUT)
+    private Long driverId;
+
+    @ApiModelProperty(value = "司机名称(user.user.user_name)")
+    @TableField("driver_name")
+    private String driverName;
+
+
+    @ApiModelProperty(value = "手机号")
+    @TableField("mobile")
+    @Pattern(regexp = "[0-9]\\d{10}",message = "请填写正确的手机号")
+    @NotNull(message = "请填写11位手机号")
+    private String mobile;
+
+    @TableField(exist = false)
+    private  Integer flag;
+
+}

+ 57 - 0
src/main/java/com/aoyang/tms/entity/vo/GasOrderVo.java

@@ -0,0 +1,57 @@
+package com.aoyang.tms.entity.vo;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import lombok.Data;
+
+@Data
+public class GasOrderVo implements Serializable {
+
+    private Long orderId;
+    private Long gasstationId;
+    private String gasstationName;
+    private String nickName;
+    private Long cashierId;
+    private String cashierName;
+    private Long carrierOrgId;
+    private String carrierOrgName;
+    private Long truckId;
+    private String carNumber;
+    private Long driverId;
+    private String driverName;
+    private BigDecimal gasQty;
+    private BigDecimal listPrice;
+    private BigDecimal platformPrice;
+    private BigDecimal actualPrice;
+    private BigDecimal discountAmount;
+    private BigDecimal amount;
+    private BigDecimal gasstationFee;
+    private BigDecimal directGasstationFee;
+    private BigDecimal platformFee;
+    private BigDecimal serviceFee;
+    private Integer payType;
+    private Integer orderStatus;
+    private String createRole;
+    private Long canceler;
+    private String cancelerName;
+    private LocalDateTime cancelDate;
+    private Long creater;
+    private String createrName;
+    private LocalDateTime createDate;
+    private LocalDateTime updateDate;
+    private BigDecimal harbourPrice;
+    private BigDecimal benefit;
+    private BigDecimal carrierRebate;
+    private BigDecimal freight;
+    private BigDecimal rebate;
+    private BigDecimal gasprice;
+    private BigDecimal preGasprice;
+    private BigDecimal gasamount;
+    private BigDecimal gwayprice;
+    private BigDecimal gwayamount;
+    private BigDecimal comAmount;
+    private String payChannelId;
+    private Integer tradeType;
+}

+ 92 - 0
src/main/java/com/aoyang/tms/entity/vo/GasstationAppVO.java

@@ -0,0 +1,92 @@
+package com.aoyang.tms.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: xumingrui
+ * @create: 2020 -02 -15 -22:07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "GasstationVO对象", description = "")
+public class GasstationAppVO {
+
+    @ApiModelProperty(value = "加气站id(调用API生成)")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long gasstationId;
+
+    @ApiModelProperty(value = "企业名称")
+    private String gasstationName;
+
+    @ApiModelProperty(value = "加气站名称")
+    private String nickName;
+
+    @ApiModelProperty(value = "收款码类别(0-未设置,1-加气站,2-收银员),默认1")
+    private Integer qrcode;
+
+    @ApiModelProperty(value = "省份")
+    private String province;
+
+    @ApiModelProperty(value = "城市")
+    private String city;
+
+    @ApiModelProperty(value = "地区")
+    private String region;
+
+    @ApiModelProperty(value = "地址")
+    private String address;
+
+    @ApiModelProperty(value = "头像")
+    private String url;
+
+    @ApiModelProperty(value = "平台挂牌价")
+    private BigDecimal platformPrice;
+
+    @ApiModelProperty(value = "两个经纬度之间的直线距离(公里)")
+    private BigDecimal distance;
+
+    @ApiModelProperty(value = "经度")
+    private String longitude;
+
+    @ApiModelProperty(value = "纬度")
+    private String latitude;
+
+    private List<String> tagList;
+
+    private String presentContent;
+
+    @ApiModelProperty(value = "最高优惠")
+    private String discount;
+
+    @ApiModelProperty(value = "加气站宣传文案")
+    private String introduce;
+
+    @ApiModelProperty(value = "加注机数量")
+    private Integer fillingMachineNum;
+
+    @ApiModelProperty(value = "收银员数量")
+    private Integer cashierNum;
+
+    @ApiModelProperty(value = "加气站形象图列表")
+    private List orgPics;
+
+    @ApiModelProperty(value = "手机号")
+    private String mobile;
+
+    @ApiModelProperty(value = "最高优惠")
+    private BigDecimal maxDiscount;
+
+    @ApiModelProperty(value = "优惠后的价格")
+    private BigDecimal discountPrice;
+
+}

+ 48 - 0
src/main/java/com/aoyang/tms/entity/vo/GasstationStoreListVO.java

@@ -0,0 +1,48 @@
+package com.aoyang.tms.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonFormat.Shape;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+/**
+ * @description:
+ * @author: xumingrui
+ * @create: 2020 -02 -15 -22:07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "GasstationVO对象", description = "")
+public class GasstationStoreListVO {
+
+    @ApiModelProperty(value = "加气站id(调用API生成)")
+    @JsonFormat(shape = Shape.STRING)
+    private Long gasstationId;
+
+    @ApiModelProperty(value = "企业名称")
+    private String gasstationName;
+
+    @ApiModelProperty(value = "加气站名称")
+    private String nickName;
+
+    @ApiModelProperty(value = "库存状态")
+    private String statusStock;
+
+    @ApiModelProperty(value = "库存量")
+    private BigDecimal stock;
+
+    @ApiModelProperty(value = "限制提报计划状态(0开启1关闭)")
+    private Integer purchaseLimitStatus;
+
+    @ApiModelProperty(value = "加气限制状态(0关闭1开启)")
+    private Integer gasLimitStatus;
+
+    @ApiModelProperty(value = "加气限制库存")
+    private BigDecimal gasLimitStock;
+}

+ 112 - 0
src/main/java/com/aoyang/tms/entity/vo/GasstationVO.java

@@ -0,0 +1,112 @@
+package com.aoyang.tms.entity.vo;
+
+import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonFormat.Shape;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @description:
+ * @author: xumingrui
+ * @create: 2020 -02 -15 -22:07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("gasstation")
+@ApiModel(value = "GasstationVO对象", description = "")
+public class GasstationVO {
+
+    @ApiModelProperty(value = "加气站id(调用API生成)")
+    @TableId(value = "gasstation_id", type = IdType.INPUT)
+    @JsonFormat(shape = Shape.STRING)
+    private Long gasstationId;
+
+    @ApiModelProperty(value = "企业名称")
+    @TableField("gasstation_name")
+    private String gasstationName;
+
+    @ApiModelProperty(value = "加气站名称")
+    @TableField("nick_name")
+    private String nickName;
+
+    @ApiModelProperty(value = "交易模式(1经销模式;2直销模式,默认经销模式1)")
+    @TableField("trade_type")
+    private String tradeType;
+
+    @ApiModelProperty(value = "收款码类别(0-未设置,1-加气站,2-收银员),默认1")
+    @TableField("qrcode")
+    private Integer qrcode;
+
+    @ApiModelProperty(value = "省份")
+    @TableField("province")
+    private String province;
+
+    @ApiModelProperty(value = "城市")
+    @TableField("city")
+    private String city;
+
+    @ApiModelProperty(value = "地区")
+    @TableField("region")
+    private String region;
+
+    @ApiModelProperty(value = "地址")
+    @TableField("address")
+    private String address;
+
+    @ApiModelProperty(value = "头像")
+    @TableField("url")
+    private String url;
+
+    @ApiModelProperty(value = "平台挂牌价")
+    @TableField("platform_price")
+    private BigDecimal platformPrice;
+
+    @ApiModelProperty(value = "平台挂牌价")
+    @TableField("direct_sales_price")
+    private BigDecimal directSalesPrice;
+
+    public BigDecimal getDistance() {
+        return distance;
+    }
+
+    public void setDistance(BigDecimal distance) {
+        this.distance = distance.setScale(2, BigDecimal.ROUND_HALF_UP);
+    }
+
+    @ApiModelProperty(value = "两个经纬度之间的直线距离(公里)")
+    @TableField(exist = false)
+    private BigDecimal distance;
+
+    @ApiModelProperty(value = "经度")
+    @TableField("longitude")
+    private String longitude;
+
+    @ApiModelProperty(value = "纬度")
+    @TableField("latitude")
+    private String latitude;
+
+
+    @ApiModelProperty(value = "加气限制状态(0关闭1开启)默认值关闭0")
+    @TableField("gas_limit_status")
+    private Integer gasLimitStatus;
+
+    @ApiModelProperty(value = "加气限制库存量")
+    @TableField("gas_limit_stock")
+    private BigDecimal gasLimitStock;
+
+    @ApiModelProperty(value = "库存量")
+    @TableField("stock")
+    private BigDecimal stock;
+
+}

+ 108 - 0
src/main/java/com/aoyang/tms/entity/vo/GctOrder.java

@@ -0,0 +1,108 @@
+package com.aoyang.tms.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+    * 
+    * </p>
+ *
+ * @author zhuangxl
+ * @since 2021-10-16
+ */
+@Data
+@ApiModel(value="GctOrder对象", description="")
+public class GctOrder implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "订单id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long orderId;
+
+    @ApiModelProperty(value = "加气站id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long gasstationId;
+
+    @ApiModelProperty(value = "加气站名称")
+    private String gasstationName;
+
+    @ApiModelProperty(value = "加气站简称")
+    private String gasstationShortName;
+
+    @ApiModelProperty(value = "物流公司id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long carrierId;
+
+    @ApiModelProperty(value = "物流公司名称")
+    private String carrierName;
+
+    @ApiModelProperty(value = "车辆id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long truckId;
+
+    @ApiModelProperty(value = "车牌号")
+    private String carNumber;
+
+    @ApiModelProperty(value = "气瓶编号")
+    private String gasCylinderNumber;
+
+    @ApiModelProperty(value = "订单状态:1=已预约 2=已支付 3=已取消,默认1")
+    private Integer status;
+
+    @ApiModelProperty(value = "预约开始时间:yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime appointDateStart;
+
+    @ApiModelProperty(value = "预约结束时间:yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime appointDateEnd;
+
+    @ApiModelProperty(value = "支付时间:yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime payDate;
+
+    @ApiModelProperty(value = "支付金额")
+    private BigDecimal payAmount;
+
+    @ApiModelProperty(value = "司机id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long driverId;
+
+    @ApiModelProperty(value = "司机姓名")
+    private String driverName;
+
+    @ApiModelProperty(value = "司机联系方式")
+    private String driverMobile;
+
+    @ApiModelProperty(value = "创建人")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long creatorId;
+
+    @ApiModelProperty(value = "创建人姓名")
+    private String creatorName;
+
+    @ApiModelProperty(value = "创建时间[预约下单时间]")
+    private LocalDateTime createDate;
+
+    @ApiModelProperty(value = "取消原因")
+    private String note;
+
+    @ApiModelProperty(value = "取消人")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long cancelerId;
+
+    @ApiModelProperty(value = "取消人姓名")
+    private String cancelerName;
+
+    @ApiModelProperty(value = "取消日期")
+    private LocalDateTime cancelDate;
+
+    @ApiModelProperty(value = "资料签收返还状态:0=未签收,1=已签收,2=已返还,默认0")
+    private Integer materialStatus;
+
+}

+ 16 - 0
src/main/java/com/aoyang/tms/entity/vo/StockLogReq.java

@@ -0,0 +1,16 @@
+package com.aoyang.tms.entity.vo;
+
+import com.aoyang.tms.controller.param.DateParam;
+import com.aoyang.tms.entity.StockLog;
+import lombok.Data;
+
+/**
+ * @author xumingrui
+ * @date 2020/10/22 11:25 上午
+ * @Description:<描述> TODO
+ */
+@Data
+public class StockLogReq  extends StockLog {
+    private DateParam dateParam;
+
+}

+ 20 - 0
src/main/java/com/aoyang/tms/entity/vo/StockLogVO.java

@@ -0,0 +1,20 @@
+package com.aoyang.tms.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author xumingrui
+ * @date 2020/10/22 11:28 上午
+ * @Description:<描述> TODO
+ */
+@Data
+public class StockLogVO{
+    @ApiModelProperty(value = "1=入库 2=加气 3=手工调整")
+    private Integer stockType;
+    @ApiModelProperty(value = "汇总量")
+    private BigDecimal sumQuantity;
+
+}

+ 64 - 0
src/main/java/com/aoyang/tms/entity/vo/TruckDriverTransferVO.java

@@ -0,0 +1,64 @@
+package com.aoyang.tms.entity.vo;
+
+import com.aoyang.tms.util.validUtil.Insert;
+import com.aoyang.tms.util.validUtil.Query;
+import com.aoyang.tms.util.validUtil.Update;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+
+/**
+ * @author mahuan
+ * @since
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="TruckDriver转移对象", description="")
+public class TruckDriverTransferVO {
+    private static final long serialVersionUID = 1024L;
+    @ApiModelProperty(value = "组织id(user.org.org_id)")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long orgId;
+
+    @ApiModelProperty(value = "组织名称(user.org.org_name)")
+    private String orgName;
+    @ApiModelProperty(value = "卡车id(调用API生成)")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long truckId;
+
+    @ApiModelProperty(value = "车牌号")
+    @NotBlank(message = "卡车牌号不允许为空")
+    @Size(max = 10, message = "卡车车牌号长度不能超过10个字符", groups = {Insert.class, Query.class})
+    @Pattern(regexp = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(?:(?![A-Z]{4})[A-Z0-9]){4}[A-Z0-9挂学警港澳]{1}$",
+            message = "卡车车牌号格式错误", groups = {Insert.class})
+    private String carNumber;
+
+    @ApiModelProperty(value = "0=自有车辆 1=挂靠车辆")
+
+    @NotNull(message = "卡车类型不允许空", groups = {Insert.class, Update.class})
+    private Integer linked;
+
+    @ApiModelProperty(value = "0=账户消费 1=自动圈存")
+    private Integer autoAccount;
+
+    @ApiModelProperty(value = "司机id(user.user.user_id)")
+    @NotNull(message = "司机id 不能为空")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long driverId;
+
+    @ApiModelProperty(value = "司机名称(user.user.user_name)")
+    private String driverName;
+
+    @ApiModelProperty(value = "手机号")
+    private String mobile;
+}

+ 83 - 0
src/main/java/com/aoyang/tms/entity/vo/TruckDriverVO.java

@@ -0,0 +1,83 @@
+package com.aoyang.tms.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonFormat.Shape;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Map;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author xumingrui
+ * @since 2020-02-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("truck_driver")
+@ApiModel(value="TruckDriver对象", description="")
+public class TruckDriverVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "组织id(user.org.org_id)")
+    @TableField("org_id")
+    @NotNull(message = "组织id 不能为空")
+    @JsonFormat(shape = Shape.STRING)
+    private Long orgId;
+
+    @ApiModelProperty(value = "卡车id")
+    @TableField("truck_id")
+    @NotNull(message = "卡车id 不能为空")
+    @JsonFormat(shape = Shape.STRING)
+    private Long truckId;
+
+    @ApiModelProperty(value = "司机id(user.user.user_id)")
+    @TableField("driver_id")
+    @NotNull(message = "司机id 不能为空")
+    @JsonFormat(shape = Shape.STRING)
+    private Long driverId;
+
+    @ApiModelProperty(value = "司机名称(user.user.user_name)")
+    @TableField("driver_name")
+    private String driverName;
+
+    @ApiModelProperty(value = "创建人id")
+    @TableField("creater")
+    @JsonFormat(shape = Shape.STRING)
+    @NotNull(message = "创建人id 不能为空")
+    private Long creater;
+
+    @ApiModelProperty(value = "创建日期时间")
+    @TableField("create_date")
+    private LocalDateTime createDate;
+
+
+    @ApiModelProperty(value = "卡车信息")
+    @TableField(exist = false)
+    private Map<String,Object> truck;
+
+    @ApiModelProperty(value = "司机信息")
+    @TableField(exist = false)
+    private Map<String,Object>  driver;
+
+
+}

+ 220 - 0
src/main/java/com/aoyang/tms/entity/vo/TruckVO.java

@@ -0,0 +1,220 @@
+package com.aoyang.tms.entity.vo;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import javax.validation.constraints.NotNull;
+
+import com.aoyang.tms.entity.feignEntity.User;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonFormat.Shape;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author xumingrui
+ * @since 2020-02-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("truck")
+@ApiModel(value = "Truck对象", description = "")
+public class TruckVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "卡车id(调用API生成)")
+    @TableId(value = "truck_id", type = IdType.INPUT)
+    @JsonFormat(shape = Shape.STRING)
+    private Long truckId;
+
+    @ApiModelProperty(value = "交易模式(1经销模式;2直销模式,默认经销模式1)")
+    @TableField("trade_type")
+    private Integer tradeType;
+
+    @ApiModelProperty(value = "组织id(user.org.org_id)")
+    @TableField("org_id")
+    @NotNull(message = "组织id不能为空")
+    @JsonFormat(shape = Shape.STRING)
+    private Long orgId;
+
+    @ApiModelProperty(value = "组织名称(user.org.org_name)")
+    @TableField("org_name")
+    @NotNull(message = "组织名称不能为空")
+    private String orgName;
+
+    @ApiModelProperty(value = "卡车名称")
+    @TableField("truck_name")
+    private String truckName;
+
+    @ApiModelProperty(value = "车牌号")
+    @TableField("car_number")
+    private String carNumber;
+
+    @ApiModelProperty(value = "购车日期")
+    @TableField("purchase_date")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime purchaseDate;
+
+    @ApiModelProperty(value = "颜色")
+    @TableField("color")
+    private String color;
+
+    @ApiModelProperty(value = "载重量(吨)")
+    @TableField("dead_weight")
+    private BigDecimal deadWeight;
+
+    @ApiModelProperty(value = "储气罐容量(升)")
+    @TableField("capacity")
+    private BigDecimal capacity;
+
+    @ApiModelProperty(value = "生产厂家")
+    @TableField("manufacturer")
+    private String manufacturer;
+
+    @ApiModelProperty(value = "状态(0:启用 1:停用)")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty(value = "创建人id")
+    @TableField("creater")
+    @JsonFormat(shape = Shape.STRING)
+    private Long creater;
+
+    @ApiModelProperty(value = "创建日期时间")
+    @TableField("create_date")
+    private LocalDateTime createDate;
+
+    @ApiModelProperty(value = "修改人id")
+    @JsonFormat(shape = Shape.STRING)
+    @TableField("updater")
+    private Long updater;
+
+    @ApiModelProperty(value = "修改日期时间")
+    @TableField("update_date")
+    private LocalDateTime updateDate;
+
+    @ApiModelProperty(value = "司机列表")
+    @TableField(exist = false)
+    private List<User> driverList;
+
+    @ApiModelProperty(value = "司机列表-新")
+    @TableField(exist = false)
+    private List<DriverListAll> driversList;
+
+    @ApiModelProperty(value = "车辆账户余额")
+    @TableField(exist = false)
+    private BigDecimal balance;
+
+    @ApiModelProperty(value = "组织账户余额")
+    @TableField(exist = false)
+    private BigDecimal orgBalance;
+
+    @ApiModelProperty(value = "车架号")
+    @TableField("frame_number")
+    private String frameNumber;
+
+    @ApiModelProperty(value = "挂车牌号")
+    @TableField("trailer_number")
+    private String trailerNumber;
+
+    @ApiModelProperty(value = "创建者姓名")
+    @TableField("creater_name")
+    private String createrName;
+
+    @ApiModelProperty(value = "修改者姓名")
+    @TableField("updater_name")
+    private String updaterName;
+
+    @ApiModelProperty(value = "0=自有车辆 1=挂靠车辆")
+    @TableField("linked")
+    private Integer linked;
+
+    @ApiModelProperty(value = "0=账户消费 1=自动圈存")
+    @TableField("auto_account")
+    private Integer autoAccount;
+
+    @ApiModelProperty(value = "车辆类型[行驶证上的车辆类型]")
+    @TableField("type_name")
+    private String typeName;
+
+    @ApiModelProperty(value = "车辆所有人")
+    @TableField("owner")
+    private String owner;
+
+    @ApiModelProperty(value = "住址")
+    @TableField("address")
+    private String address;
+
+    @ApiModelProperty(value = "使用性质")
+    @TableField("use_nature")
+    private String useNature;
+
+    @ApiModelProperty(value = "车辆识别码")
+    @TableField("vehicle_id_code")
+    private String vehicleIdCode;
+
+    @ApiModelProperty(value = "注册日期:yyyy-MM-dd")
+    @TableField("register_date")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
+    private LocalDate registerDate;
+
+    @ApiModelProperty(value = "发证日期:yyyy-MM-dd")
+    @TableField("issue_date")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
+    private LocalDate issueDate;
+
+    @ApiModelProperty(value = "档案编号")
+    @TableField("file_no")
+    private String fileNo;
+
+    @ApiModelProperty(value = "能源类型")
+    @TableField("energy_type")
+    private String energyType;
+
+    @ApiModelProperty(value = "行驶证正面图片地址")
+    @TableField("face_url")
+    private String faceUrl;
+
+    @ApiModelProperty(value = "行驶证副页图片地址")
+    @TableField("back_url")
+    private String backUrl;
+
+    @ApiModelProperty(value = "行驶证认证状态:1 待证中 2 已认证 3认证失败")
+    @TableField("auth_status")
+    private Integer authStatus;
+
+    @ApiModelProperty(value = "认证时间")
+    @TableField("auth_date")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime authDate;
+
+    @ApiModelProperty(value = "车辆等级")
+    @TableField("level")
+    private Integer level;
+
+    @ApiModelProperty(value = "车辆组合支付状态(0=启用 1=停用),默认1")
+    @TableField("com_status")
+    private Integer comStatus;
+
+    @ApiModelProperty(value = "组合支付协议上传状态(0=未上传 1=已上传),默认0")
+    @TableField("com_contract_status")
+    private Integer comContractStatus;
+
+}

+ 49 - 0
src/main/java/com/aoyang/tms/exception/GeneralException.java

@@ -0,0 +1,49 @@
+package com.aoyang.tms.exception;
+
+import lombok.Data;
+
+/**
+ * @author zhuangxl
+ * @description
+ * @since 2021-08-07 15:22
+ */
+@Data
+public class GeneralException extends Exception{
+
+    private int code;
+    private String message;
+
+    /**
+     * Constructs a new exception with the specified detail message.  The
+     * cause is not initialized, and may subsequently be initialized by
+     * a call to {@link #initCause}.
+     *
+     * @param message the detail message. The detail message is saved for
+     *                later retrieval by the {@link #getMessage()} method.
+     */
+    public GeneralException(int code, String message) {
+        super(code+":"+message);
+        this.code = code;
+        this.message = message;
+    }
+
+    /**
+     * Constructs a new exception with the specified detail message and
+     * cause.  <p>Note that the detail message associated with
+     * {@code cause} is <i>not</i> automatically incorporated in
+     * this exception's detail message.
+     *
+     * @param message the detail message (which is saved for later retrieval
+     *                by the {@link #getMessage()} method).
+     * @param cause   the cause (which is saved for later retrieval by the
+     *                {@link #getCause()} method).  (A <tt>null</tt> value is
+     *                permitted, and indicates that the cause is nonexistent or
+     *                unknown.)
+     * @since 1.4
+     */
+    public GeneralException(int code, String message, Throwable cause) {
+        super(code+":"+message, cause);
+        this.code = code;
+        this.message = message;
+    }
+}

+ 32 - 0
src/main/java/com/aoyang/tms/exception/GlobalExceptionHandler.java

@@ -0,0 +1,32 @@
+package com.aoyang.tms.exception;
+
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.util.ErrCodeEnum;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.Objects;
+
+/**
+ * @description:
+ * @author: xumingrui
+ * @create: 2020 -01 -28 -20:17
+ */
+@Slf4j
+@ControllerAdvice
+public class GlobalExceptionHandler {
+
+    private final static String EXCEPTION_MSG_KEY = "Exception message : ";
+
+    @ResponseBody
+    @ExceptionHandler({MethodArgumentNotValidException.class })
+    public Result handleValidException(MethodArgumentNotValidException e){
+        //日志记录错误信息
+        log.error( Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
+        //将错误信息返回给前台
+        return new Result (ErrCodeEnum.PARAM_VALID_ERROR.getCode (), Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
+    }
+}

+ 111 - 0
src/main/java/com/aoyang/tms/feign/AccountFeign.java

@@ -0,0 +1,111 @@
+package com.aoyang.tms.feign;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+import com.aoyang.tms.controller.param.IdParam;
+import com.aoyang.tms.controller.vo.CarrierBalanceVO;
+import com.aoyang.tms.feign.param.CarrierBalanceParam;
+import com.aoyang.tms.feign.param.findTruckBalancesParam;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.entity.feignEntity.OrgAccount;
+import com.aoyang.tms.entity.feignEntity.TransferOrder;
+import com.aoyang.tms.entity.feignEntity.TruckAccount;
+
+/**
+ * @author: liujiren
+ */
+
+@FeignClient(name = "account")
+public interface AccountFeign {
+
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 批量获取卡车账户余额
+     * @Date 2021/4/15
+     * @Param
+     **/
+    @PostMapping("/account/truck_account/find_truck_balances")
+    Result<List<TruckAccount>> findTruckBalances(@RequestBody findTruckBalancesParam param);
+
+    /**
+     * 获取组织账户信息
+     *
+     * @param orgAccount 组织账户参数
+     * @return 账户详情或失败信息
+     */
+    @PostMapping(value = "/account/org_account/find_by_param")
+    Result<OrgAccount> findByParam(@RequestBody OrgAccount orgAccount);
+
+    /**
+     * 根据卡车truckId,查询卡车经销账户余额
+     */
+    @PostMapping(value = "/account/truck_account/get_balance_trade_type")
+    Result getBalance(@RequestBody Map<String, Object> map) throws Exception;
+
+    /**
+     * 根据卡车truckId,查询卡车直销账户余额
+     */
+    @PostMapping(value = "/account/directsales/truck_account/get_balance")
+    Result getDirectTruckBalance(@RequestBody Map<String, Object> map) throws Exception;
+
+
+    /**
+     * @Author guoyong
+     * @Description 添加经销户
+     * @Date  2022/2/11
+     * @Param
+     * @return
+    **/
+    @PostMapping("/account/truck_account/add")
+    Result add(@RequestHeader(value = "userId") Long userId, @RequestBody TruckAccount truckAccount);
+
+    /**
+     * @Author guoyong
+     * @Description 创建直销户
+     * @Date  2022/2/11
+     * @Param
+     * @return
+    **/
+    @PostMapping("/account/directsales/truck_account/add")
+    Result addDirectTruckAccount(@RequestHeader(value = "userId") Long userId, @RequestBody TruckAccount truckAccount);
+
+
+    @PostMapping("/account/account_balance/transfer_carrier")
+    Result transferCarrier(@RequestBody TransferOrder transferOrder);
+
+    @PostMapping("/account/truck_account/edit")
+    Result editTruckAccount(@RequestHeader(value = "userId") Long userId, @RequestBody TruckAccount truckAccount);
+
+    /**
+     * @description: 变更车辆账户的组织
+     * @author: zhuangxl
+     * @since: 2021/4/6 11:38
+     **/
+    @PostMapping("/account/truck_account/change_org")
+    Result<Boolean> changeTruckAccountOrg(@RequestBody TruckAccount truckAccount);
+
+    /**
+     * 根据物流公司id,查询物流公司账户余额
+     */
+    @PostMapping("/account/org_account/find_carrier_balance")
+    Result<CarrierBalanceVO> findCarrierBalance(@RequestBody CarrierBalanceParam param);
+
+    /**
+     * @description: 根据组织id查询组织资金账户余额
+     * @author: zhuangxl
+     * @since: 2021/8/14 14:25
+     * @param orgId: 组织id
+     * @return: com.aoyang.common.result.Result<java.math.BigDecimal>
+     **/
+    @PostMapping("/account/org_account/get_balance_by_org_id")
+    Result<BigDecimal> getOrgAccountBalanceByOrgId(@RequestBody IdParam orgId);
+}

+ 26 - 0
src/main/java/com/aoyang/tms/feign/AllinpayFeign.java

@@ -0,0 +1,26 @@
+package com.aoyang.tms.feign;
+
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.feign.fallback.AllinpayFeignFallBack;
+import com.aoyang.tms.feign.param.CashbackParam;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+
+/**
+ * @author guoyong
+ * @description
+ * @since 2021-09-04 17:07
+ */
+@FeignClient(name = "allinpay", fallback = AllinpayFeignFallBack.class)
+public interface AllinpayFeign {
+
+    /**
+     * @param cashbackParam: 返现订单和返现金额
+     * @description: 执行返现转账
+     * @author: zhuangxl
+     * @since: 2021/8/14 15:37
+     * @return: com.aoyang.common.result.Result
+     **/
+    @PostMapping("/allinpay/pay/cashback")
+    Result cashback(CashbackParam cashbackParam);
+}

+ 31 - 0
src/main/java/com/aoyang/tms/feign/GasDataFeign.java

@@ -0,0 +1,31 @@
+package com.aoyang.tms.feign;
+
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.entity.Gasstation;
+import com.aoyang.tms.feign.fallback.GasDataFeignFallBack;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+/**
+ * @author: liujiren
+ */
+
+@FeignClient(name = "gasdata", fallbackFactory = GasDataFeignFallBack.class)
+public interface GasDataFeign {
+
+    /**
+     * 根据区域ID获取加气站组织id列表
+     *
+     * @param
+     * @return
+     */
+    @PostMapping("/gasdata/gasstation/strategy/add")
+    Result strategyAdd(@RequestBody List<Gasstation> list);
+
+    @PostMapping("/gasdata/gasstation/combat")
+    Result combat(@RequestBody List<Gasstation> gasstations);
+
+}

+ 37 - 0
src/main/java/com/aoyang/tms/feign/MessageFeign.java

@@ -0,0 +1,37 @@
+package com.aoyang.tms.feign;
+
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.entity.feignEntity.SmsSendLog;
+import com.aoyang.tms.feign.param.CashbackParam;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+/**
+ * @author liujiren
+ */
+@FeignClient(name = "message")
+public interface MessageFeign {
+    /**
+     * 发送短信通知
+     *
+     * @param smsSendLog 发送内容
+     * @return 成功或失败信息
+     */
+    @PostMapping(value = "/message/notify/send")
+    Result<Boolean> send(@RequestBody SmsSendLog smsSendLog,
+                         @RequestHeader(value = "orgId", required = false) String orgId,
+                         @RequestHeader(value = "userId", required = false) String userId,
+                         @RequestHeader(value = "clientId", required = false) String clientId);
+
+    /**
+     * @description: 发送返现完成的微信模板消息
+     * @author: zhuangxl
+     * @since: 2021/8/14 14:54
+     * @param cashbackMsgParam: 订单信息 和 返现金额
+     * @return: com.aoyang.common.result.Result<java.lang.String>
+     **/
+    @PostMapping("/message/wx_template_message/send_cashback_msg")
+    Result<String> sendCashbackMessage(@RequestBody CashbackParam cashbackMsgParam);
+}

+ 70 - 0
src/main/java/com/aoyang/tms/feign/PayFeign.java

@@ -0,0 +1,70 @@
+package com.aoyang.tms.feign;
+
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.controller.param.IdParam;
+import com.aoyang.tms.entity.vo.GctOrder;
+import com.aoyang.tms.feign.fallback.PayFeignFallBack;
+import com.aoyang.tms.feign.param.DriverGctOrderParam;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhuangxl
+ * @description
+ * @since 2021-03-20 14:07
+ */
+@FeignClient(name = "pay", fallback = PayFeignFallBack.class)
+public interface PayFeign {
+
+    /**
+     * @description: 查询司机是否有待支付的订单
+     * @author: zhuangxl
+     * @since: 2021/4/8 12:45
+     * @param param: 司机id
+     * @return: com.aoyang.common.result.Result<java.lang.Boolean>
+     **/
+
+    @PostMapping("/pay/gas_order/driver_order_check")
+    Result<Boolean> driverOrderCheck(IdParam param);
+
+    /**
+     * @description: 查询车辆是否有待支付的订单
+     * @author: zhuangxl
+     * @since: 2021/4/9 15:04
+     * @param param: 车辆id
+     * @return: com.aoyang.common.result.Result<java.lang.Boolean>
+     **/
+    @PostMapping("/pay/gas_order/truck_order_check")
+    Result<Boolean> truckOrderCheck(IdParam param);
+
+    /**
+     * 根据卡车id,查询卡车账户余额
+     */
+    @PostMapping(value = "/account/truck_account/get_balance")
+    Result getBalance(@RequestBody Map<String, Object> map);
+
+    /**
+     * @description: 根据司机id查询当前司机是否首次下单支付完成
+     * @author: zhuangxl
+     * @since: 2021/8/14 12:00
+     * @param driverId: 司机id
+     * @return: com.aoyang.common.result.Result<java.lang.Boolean>
+     **/
+    @PostMapping("/pay/gas_order/first_finished_order_check")
+    Result<Boolean> firstFinishedOrderCheckByDriverId(IdParam driverId);
+
+    /**
+     * @description: 查询司机在指定的加气站中(多个)预约的订单列表
+     * @author: zhuangxl
+     * @since: 2021/10/16 12:58
+     * @param param: 
+     * @return: com.aoyang.common.result.Result<java.util.List<com.aoyang.strategy.entity.vo.GctOrder>>
+     **/
+    @PostMapping("/pay/gct_order/get_driver_appointed_order")
+    Result<List<GctOrder>> getDriverAppointedGctOrders(@RequestBody DriverGctOrderParam param);
+
+}

+ 51 - 0
src/main/java/com/aoyang/tms/feign/SettleFeign.java

@@ -0,0 +1,51 @@
+package com.aoyang.tms.feign;
+
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.controller.vo.GasstationWeekAverageQtyVO;
+import com.aoyang.tms.feign.param.GasstationWeekAverageQty;
+import com.aoyang.tms.feign.param.StatisticsGasstationParam;
+import com.aoyang.tms.feign.result.GasstationTradeSum;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.math.BigDecimal;
+
+/**
+ * @author: liujiren
+ */
+
+@FeignClient(name = "settle")
+public interface SettleFeign {
+
+    /**
+     * @return
+     * @Author chengang
+     * @Description 根据加气站id和日期获取加气站库存日汇总数据
+     * @Date 2021/3/12
+     * @Param
+     **/
+    @PostMapping("/settle/statistics_gasstation_store/get_day_gasstation_stock")
+    Result<GasstationTradeSum> getDayGasstationStock(@RequestBody StatisticsGasstationParam param);
+
+    /**
+     * 加气站近7日日均销量
+     *
+     * @param
+     * @return
+     */
+    @PostMapping("/settle/statistics_gasstation_gasorder/gas_station_week_avg_qty")
+    Result<BigDecimal> gasStationWeekAvgQty(@RequestBody StatisticsGasstationParam param);
+
+
+    /**
+     * 加气站近7日日均销量
+     *
+     * @param
+     * @return
+     */
+    @PostMapping("/settle/gasstation_week_average_qty/find")
+    Result<GasstationWeekAverageQtyVO> find(@RequestBody GasstationWeekAverageQty param);
+
+
+}

+ 192 - 0
src/main/java/com/aoyang/tms/feign/UserFeign.java

@@ -0,0 +1,192 @@
+package com.aoyang.tms.feign;
+
+import com.alibaba.fastjson.JSONObject;
+import com.aoyang.common.param.PageParam;
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.controller.param.IdParam;
+import com.aoyang.tms.entity.feignEntity.Org;
+import com.aoyang.tms.entity.feignEntity.User;
+import com.aoyang.tms.entity.feignEntity.UserRole;
+import com.aoyang.tms.entity.feignEntity.WrapperUser;
+import com.aoyang.tms.feign.param.AuthLog;
+import com.aoyang.tms.feign.param.DistrictOrgIdsParam;
+import com.aoyang.tms.feign.result.DriverApply;
+import com.aoyang.tms.feign.result.DriverWhiteList;
+import com.aoyang.tms.feign.result.GasstationCardVO;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author: liujiren
+ */
+
+@FeignClient(name = "user")
+public interface UserFeign {
+
+    /**
+     * 根据区域ID获取加气站组织id列表
+     *
+     * @param
+     * @return
+     */
+    @PostMapping("/user/district_gasstation/get_org_ids")
+    Result<List<Long>> getOrgIds(@RequestBody DistrictOrgIdsParam districtOrgIdsParam);
+
+    /**
+     * 添加加气站同时,创建加气站默认收银员
+     * @param c_userId
+     * @param user
+     * @return
+     */
+    @PostMapping("/user/user/add_default_cashier")
+    public Result<User> addDefaultCashier(@RequestHeader("userId") String c_userId, @RequestBody User user);
+    /**
+     * 新增用户
+     */
+    @PostMapping(value = "/user/user/add")
+    Result<User> add(@RequestHeader("userId") String userId, @RequestBody User user);
+
+
+    @PostMapping(value = "/user/user/delete")
+    Result<Boolean> delete(@RequestParam("userId") Long userId);
+
+    @PostMapping("/user/user/list_by_user_ids")
+    Result<List<User>> listByUserIds(@RequestBody List<Long> ids);
+
+
+    @PostMapping("/user/user/binding_list")
+    Result<Page<User>> bindingList(@RequestBody PageParam<WrapperUser> pageParam);
+
+
+    /**
+     * 根据userId 查询用户信息
+     * @param
+     * @return
+     */
+    @PostMapping("/user/user/find")
+    Result<JSONObject> find(@RequestBody User user);
+
+    @PostMapping("/user/org/find")
+    Result<Org> find(@RequestBody Org org);
+
+    /**
+     * 根据orgId,查询用户列表
+     */
+    @PostMapping("/user/user/list_org")
+    Result<Page<User>> listOrg(@RequestBody PageParam<User> pageParam);
+
+    //add userRole
+    @PostMapping("/user/user_role/add")
+    public Result<Boolean> add(@RequestBody UserRole userRole);
+
+
+    /**
+     * @description: 查询司机发起的最新的未完成的车辆单独加入物流公司申请【待审核、已驳回】
+     * @author: zhuangxl
+     * @since: 2021/3/31 14:48
+     **/
+    @PostMapping("/user/driver_apply/last_unfinished_truck_apply")
+    Result<DriverApply> lastUnfinishedTruckApply(@RequestHeader("userId")Long userId);
+
+    /**
+     * @description: 查询司机发起的最新的未完成的司机加入或退出物流公司申请【待审核、已驳回】
+     * @author: zhuangxl
+     * @since: 2021/3/31 14:48
+     **/
+    @PostMapping("/user/driver_apply/last_unfinished_driver_apply")
+    Result<DriverApply> lastUnfinishedDriverApply(@RequestHeader("userId")Long userId);
+
+    /**
+     * @description: 行驶证认证日志保存接口
+     * @author: zhuangxl
+     * @since: 2021/3/31 16:29
+     * @param authLog: 认证日志
+     * @return: com.aoyang.common.result.Result<java.lang.Boolean>
+     **/
+    @PostMapping("/user/auth_log/add")
+    Result<Boolean> addAuthLog(@RequestBody AuthLog authLog);
+
+    /**
+     * @description: 司机发起申请(车辆加入退出、司机加入退出、司机和车辆同时加入退出申请)
+     * @author: zhuangxl
+     * @since: 2021/4/1 13:06
+     * @param driverApply: 司机发起的申请信息
+     * @return: com.aoyang.common.result.Result<java.lang.Boolean>
+     **/
+    @PostMapping("/user/driver_apply/add")
+    Result<Boolean> add(@RequestBody DriverApply driverApply);
+
+
+    /**
+     * @description: 用户组织转移(司机转移,车辆转移)
+     * @author: mahuan
+     * @since: 2021/4/12 13:38
+     * @param
+     * @return: com.aoyang.common.result.Result<java.lang.Boolean>
+     **/
+    @PostMapping("/user/user/transfer")
+    Result<Boolean> transfer(@RequestHeader("userId") String userId, @RequestHeader("userName") String userName,
+                             @RequestBody User user);
+
+
+    /**
+     * 查询redis获取加气站和物流客户
+     * @param userId
+     * @param type 0 加气站  1物流客户
+     * @return
+     */
+    @GetMapping("/user/district/redis/org")
+    List<Long> getOrgList(@RequestParam("userId") Long userId, @RequestParam("type") Integer type);
+
+    /**
+     * 根据gasstationId 查询加气站名片信息
+     * @param
+     * @return
+     */
+    @PostMapping("/user/gasstation_card/find_for_app")
+    Result<GasstationCardVO> findForApp(@RequestBody Long gasstationID);
+
+    /**
+     * @param param: 用户id
+     * @description: 根据id查询用户
+     * @author: zhuangxl
+     * @since: 2021/4/29 13:14
+     * @return: com.aoyang.common.result.Result<com.aoyang.user.entity.User>
+     **/
+    @PostMapping("/user/user/find_by_id")
+    Result<User> findUserById(@RequestBody IdParam param);
+
+    /**
+     * @description: 查询指定的手机号是否有预添加信息
+     * @author: zhuangxl
+     * @since: 2021/5/27 11:02
+     * @param driverWhiteList: 司机手机号
+     * @return: com.aoyang.common.result.Result<com.aoyang.user.entity.DriverWhiteList>
+     **/
+    @PostMapping("/user/driver_white_list/add_check")
+    Result<DriverWhiteList> driverWhiteListAddCheck(@RequestBody DriverWhiteList driverWhiteList);
+
+
+    /**
+     * @description: 撤销司机加入或退出物流公司的申请(包含带车)
+     * @author: zhuangxl
+     * @since: 2021/8/6 18:41
+     * @param param: 司机id
+     * @return: void
+     **/
+    @PostMapping("/user/driver_apply/cancle_driver_apply")
+    Result<String> cancleDriverApply(@RequestBody IdParam param);
+
+
+    /** @description: 撤销车辆加入物流公司的申请
+     * @author: zhuangxl
+     * @since: 2021/8/6 18:41
+     * @param param: 车辆id
+     * @return: void
+     **/
+    @PostMapping("/user/driver_apply/cancle_truck_apply")
+    Result<String> cancleTruckApply(@RequestBody IdParam param);
+}

+ 122 - 0
src/main/java/com/aoyang/tms/feign/fallback/AccountFeignFallBack.java

@@ -0,0 +1,122 @@
+package com.aoyang.tms.feign.fallback;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+import com.aoyang.tms.controller.param.IdParam;
+import com.aoyang.tms.controller.vo.CarrierBalanceVO;
+import com.aoyang.tms.feign.param.CarrierBalanceParam;
+import com.aoyang.tms.feign.param.findTruckBalancesParam;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.entity.feignEntity.OrgAccount;
+import com.aoyang.tms.entity.feignEntity.TransferOrder;
+import com.aoyang.tms.entity.feignEntity.TruckAccount;
+import com.aoyang.tms.feign.AccountFeign;
+import com.aoyang.tms.util.ErrCodeEnum;
+
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author liujiren
+ */
+@Component
+@Slf4j
+public class AccountFeignFallBack implements FallbackFactory<AccountFeign> {
+    @Override
+    public AccountFeign create(Throwable cause) {
+        String msg = cause == null ? "" : cause.getMessage();
+        if (!StringUtils.isEmpty(msg)) {
+            log.error("AccountFeign error : {}", msg);
+        }
+        return new AccountFeign() {
+
+            @Override
+            public Result getBalance(Map<String, Object> map) {
+                return new Result(ErrCodeEnum.ACCOUNTSERVER_ERROR.getCode(),
+                        ErrCodeEnum.ACCOUNTSERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public Result getDirectTruckBalance(Map<String, Object> map) throws Exception {
+                return new Result(ErrCodeEnum.ACCOUNTSERVER_ERROR.getCode(),
+                        ErrCodeEnum.ACCOUNTSERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public Result add(Long userId, TruckAccount truckAccount) {
+                return new Result(ErrCodeEnum.ACCOUNTSERVER_ERROR.getCode(),
+                        ErrCodeEnum.ACCOUNTSERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public Result addDirectTruckAccount(Long userId, TruckAccount truckAccount) {
+                return new Result(ErrCodeEnum.ACCOUNTSERVER_ERROR.getCode(),
+                        ErrCodeEnum.ACCOUNTSERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public Result transferCarrier(TransferOrder transferOrder) {
+                return new Result(ErrCodeEnum.ACCOUNTSERVER_ERROR.getCode(),
+                        ErrCodeEnum.ACCOUNTSERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public Result editTruckAccount(Long userId, TruckAccount truckAccount) {
+                return new Result(ErrCodeEnum.ACCOUNTSERVER_ERROR.getCode(),
+                        ErrCodeEnum.ACCOUNTSERVER_ERROR.getMessage());
+            }
+
+            /**
+             * @param truckAccount
+             * @description: 变更车辆账户的组织
+             * @author: zhuangxl
+             * @since: 2021/4/6 11:38
+             */
+            @Override
+            public Result<Boolean> changeTruckAccountOrg(TruckAccount truckAccount) {
+                log.error("策略中心微服务:feign调用账户中心微服务修改车辆账户的组织,进入熔断");
+                return new Result(ErrCodeEnum.ACCOUNTSERVER_ERROR.getCode(),
+                        ErrCodeEnum.ACCOUNTSERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public Result<CarrierBalanceVO> findCarrierBalance(CarrierBalanceParam param) {
+                log.error("策略中心微服务:feign调用账户中心微服务查询物流公司余额,进入熔断");
+                return new Result(ErrCodeEnum.ACCOUNTSERVER_ERROR.getCode(),
+                        ErrCodeEnum.ACCOUNTSERVER_ERROR.getMessage());
+            }
+
+            /**
+             * @param orgId : 组织id
+             * @description: 根据组织id查询组织资金账户余额
+             * @author: zhuangxl
+             * @since: 2021/8/14 14:25
+             * @return: com.aoyang.common.result.Result<java.math.BigDecimal>
+             **/
+            @Override
+            public Result<BigDecimal> getOrgAccountBalanceByOrgId(IdParam orgId) {
+                log.error("策略中心微服务:根据组织id查询组织资金账户余额,进入熔断");
+                return new Result(ErrCodeEnum.ACCOUNTSERVER_ERROR.getCode(),
+                        ErrCodeEnum.ACCOUNTSERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public Result<List<TruckAccount>> findTruckBalances(findTruckBalancesParam param) {
+                return new Result(ErrCodeEnum.ACCOUNTSERVER_ERROR.getCode(),
+                        ErrCodeEnum.ACCOUNTSERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public Result findByParam(OrgAccount orgAccount) {
+                return new Result(ErrCodeEnum.ACCOUNTSERVER_ERROR.getCode(),
+                        ErrCodeEnum.ACCOUNTSERVER_ERROR.getMessage());
+            }
+        };
+    }
+
+}

+ 31 - 0
src/main/java/com/aoyang/tms/feign/fallback/AllinpayFeignFallBack.java

@@ -0,0 +1,31 @@
+package com.aoyang.tms.feign.fallback;
+
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.common.ResultStatus;
+import com.aoyang.tms.feign.AllinpayFeign;
+import com.aoyang.tms.feign.param.CashbackParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author zhuangxl
+ * @description
+ * @since 2021-03-20 14:09
+ */
+@Component
+@Slf4j
+public class AllinpayFeignFallBack implements AllinpayFeign {
+
+    /**
+     * @param cashbackParam : 返现订单和返现金额
+     * @description: 执行返现转账
+     * @author: zhuangxl
+     * @since: 2021/8/14 15:37
+     * @return: com.aoyang.common.result.Result<java.lang.String>
+     **/
+    @Override
+    public Result cashback(CashbackParam cashbackParam) {
+        log.error("allinpay中心微服务:执行返现转账,进入熔断");
+        return new Result<>(ResultStatus.FALL_BACK_ERROR.getCode(), "allinpay熔断", null);
+    }
+}

+ 43 - 0
src/main/java/com/aoyang/tms/feign/fallback/GasDataFeignFallBack.java

@@ -0,0 +1,43 @@
+package com.aoyang.tms.feign.fallback;
+
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.entity.Gasstation;
+import com.aoyang.tms.feign.GasDataFeign;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author liujiren
+ */
+@Component
+@Slf4j
+public class GasDataFeignFallBack implements FallbackFactory<GasDataFeign> {
+
+    @Override
+    public GasDataFeign create(Throwable cause) {
+        String msg = cause == null ? "" : cause.getMessage();
+        if (!StringUtils.isEmpty(msg)) {
+            log.error("AccountFeign error : {}", msg);
+        }
+        return new GasDataFeign() {
+
+            @Override
+            public Result strategyAdd(List<Gasstation> list) {
+                return new Result(new ArrayList<Gasstation>());
+            }
+
+            @Override
+            public Result combat(List<Gasstation> gasstations) {
+                return null;
+            }
+        };
+
+    }
+
+
+}

+ 50 - 0
src/main/java/com/aoyang/tms/feign/fallback/MessageFeignFallBack.java

@@ -0,0 +1,50 @@
+package com.aoyang.tms.feign.fallback;
+
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.entity.feignEntity.SmsSendLog;
+import com.aoyang.tms.feign.MessageFeign;
+import com.aoyang.tms.feign.param.CashbackParam;
+import com.aoyang.tms.util.ErrCodeEnum;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author liujiren
+ */
+@Component
+@Slf4j
+public class MessageFeignFallBack implements FallbackFactory<MessageFeign> {
+
+    @Override
+    public MessageFeign create(Throwable cause) {
+        String msg = cause == null ? "" : cause.getMessage();
+        if (!StringUtils.isEmpty(msg)) {
+            log.error("AccountFeign error : {}", msg);
+        }
+        return new MessageFeign() {
+            @Override
+            public Result<Boolean> send(SmsSendLog smsSendLog, String orgId, String userId, String clientId) {
+                return new Result(ErrCodeEnum.MESSAGESERVER_ERROR.getCode(),
+                        ErrCodeEnum.MESSAGESERVER_ERROR.getMessage());
+
+            }
+
+            /**
+             * @param cashbackMsgParam : 订单信息 和 返现金额
+             * @description: 发送返现完成的微信模板消息
+             * @author: zhuangxl
+             * @since: 2021/8/14 14:54
+             * @return: com.aoyang.common.result.Result<java.lang.String>
+             **/
+            @Override
+            public Result<String> sendCashbackMessage(CashbackParam cashbackMsgParam) {
+                log.error("feign:/message/wx_template_message/send_cashback_msg,熔断");
+                return new Result(ErrCodeEnum.MESSAGESERVER_ERROR.getCode(),
+                        ErrCodeEnum.MESSAGESERVER_ERROR.getMessage());
+
+            }
+        };
+    }
+}

+ 87 - 0
src/main/java/com/aoyang/tms/feign/fallback/PayFeignFallBack.java

@@ -0,0 +1,87 @@
+package com.aoyang.tms.feign.fallback;
+
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.controller.param.IdParam;
+import com.aoyang.tms.entity.vo.GctOrder;
+import com.aoyang.tms.feign.PayFeign;
+import com.aoyang.tms.common.ResultStatus;
+import com.aoyang.tms.feign.param.DriverGctOrderParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhuangxl
+ * @description
+ * @since 2021-03-20 14:09
+ */
+@Component
+@Slf4j
+public class PayFeignFallBack implements PayFeign {
+
+
+    /**
+     * @param param : 司机id
+     * @description: 查询司机是否有待支付的订单
+     * @author: zhuangxl
+     * @since: 2021/4/8 12:45
+     * @return: com.aoyang.common.result.Result<java.lang.Boolean>
+     **/
+    @Override
+    public Result<Boolean> driverOrderCheck(IdParam param) {
+        log.error("策略中心微服务:调用支付中心微服务查询司机是否有未支付的订单,进入熔断");
+        return new Result<>(ResultStatus.FALL_BACK_ERROR.getCode(), ResultStatus.FALL_BACK_ERROR.getMessage(), false);
+    }
+
+    /**
+     * @param param : 车辆id
+     * @description: 查询车辆是否有待支付的订单
+     * @author: zhuangxl
+     * @since: 2021/4/9 15:04
+     * @return: com.aoyang.common.result.Result<java.lang.Boolean>
+     **/
+    @Override
+    public Result<Boolean> truckOrderCheck(IdParam param) {
+        log.error("策略中心微服务:调用支付中心微服务查询车辆是否有未支付的订单,进入熔断");
+        return new Result<>(ResultStatus.FALL_BACK_ERROR.getCode(), ResultStatus.FALL_BACK_ERROR.getMessage(), false);
+    }
+
+    /**
+     * 根据卡车id,查询卡车账户余额
+     *
+     * @param map
+     */
+    @Override
+    public Result getBalance(Map<String, Object> map) {
+        log.error("策略中心微服务:根据卡车id,查询卡车账户余额,进入熔断");
+        return new Result<>(ResultStatus.FALL_BACK_ERROR.getCode(), ResultStatus.FALL_BACK_ERROR.getMessage(), false);
+    }
+
+    /**
+     * @param driverId : 司机id
+     * @description: 根据司机id查询当前司机是否首次下单支付完成
+     * @author: zhuangxl
+     * @since: 2021/8/14 12:00
+     * @return: com.aoyang.common.result.Result<java.lang.Boolean>
+     **/
+    @Override
+    public Result<Boolean> firstFinishedOrderCheckByDriverId(IdParam driverId) {
+        log.error("策略中心微服务:根据司机id查询当前司机是否首次下单支付完成,进入熔断");
+        return new Result<>(ResultStatus.FALL_BACK_ERROR.getCode(), ResultStatus.FALL_BACK_ERROR.getMessage(), false);
+    }
+
+    /**
+     * @param param :
+     * @description: 查询司机在指定的加气站中(多个)预约的订单列表
+     * @author: zhuangxl
+     * @since: 2021/10/16 12:58
+     * @return: com.aoyang.common.result.Result<java.util.List < com.aoyang.strategy.entity.vo.GctOrder>>
+     **/
+    @Override
+    public Result<List<GctOrder>> getDriverAppointedGctOrders(DriverGctOrderParam param) {
+        log.error("策略中心微服务:查询司机在指定的加气站中(多个)预约的订单列表,进入熔断");
+        return new Result<>(ResultStatus.FALL_BACK_ERROR.getCode(), ResultStatus.FALL_BACK_ERROR.getMessage(), null);
+    }
+}

+ 53 - 0
src/main/java/com/aoyang/tms/feign/fallback/SettleFeignFallBack.java

@@ -0,0 +1,53 @@
+package com.aoyang.tms.feign.fallback;
+
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.controller.vo.GasstationWeekAverageQtyVO;
+import com.aoyang.tms.feign.SettleFeign;
+import com.aoyang.tms.feign.param.GasstationWeekAverageQty;
+import com.aoyang.tms.feign.param.StatisticsGasstationParam;
+import com.aoyang.tms.feign.result.GasstationTradeSum;
+import com.aoyang.tms.util.ErrCodeEnum;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+
+/**
+ * @author liujiren
+ */
+@Component
+@Slf4j
+public class SettleFeignFallBack implements FallbackFactory<SettleFeign> {
+
+    @Override
+    public SettleFeign create(Throwable cause) {
+        String msg = cause == null ? "" : cause.getMessage();
+        if (!StringUtils.isEmpty(msg)) {
+            log.error("AccountFeign error : {}", msg);
+        }
+        return new SettleFeign() {
+
+            @Override
+            public Result<GasstationTradeSum> getDayGasstationStock(StatisticsGasstationParam param) {
+                return new Result<>(ErrCodeEnum.SETTLESERVER_ERROR.getCode(), ErrCodeEnum.SETTLESERVER_ERROR.getMessage(), null);
+            }
+
+            @Override
+            public Result<BigDecimal> gasStationWeekAvgQty(StatisticsGasstationParam param) {
+                return new Result<>(ErrCodeEnum.SETTLESERVER_ERROR.getCode(), ErrCodeEnum.SETTLESERVER_ERROR.getMessage(), null);
+            }
+
+            @Override
+            public Result<GasstationWeekAverageQtyVO> find(GasstationWeekAverageQty param) {
+                return new Result<>(ErrCodeEnum.SETTLESERVER_ERROR.getCode(), ErrCodeEnum.SETTLESERVER_ERROR.getMessage(), null);
+            }
+
+        };
+
+    }
+
+
+
+}

+ 223 - 0
src/main/java/com/aoyang/tms/feign/fallback/UserFeignFallBack.java

@@ -0,0 +1,223 @@
+package com.aoyang.tms.feign.fallback;
+
+import com.alibaba.fastjson.JSONObject;
+import com.aoyang.common.param.PageParam;
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.controller.param.IdParam;
+import com.aoyang.tms.entity.feignEntity.Org;
+import com.aoyang.tms.entity.feignEntity.User;
+import com.aoyang.tms.entity.feignEntity.UserRole;
+import com.aoyang.tms.entity.feignEntity.WrapperUser;
+import com.aoyang.tms.feign.UserFeign;
+import com.aoyang.tms.feign.param.AuthLog;
+import com.aoyang.tms.feign.param.DistrictOrgIdsParam;
+import com.aoyang.tms.feign.result.DriverApply;
+import com.aoyang.tms.feign.result.DriverWhiteList;
+import com.aoyang.tms.feign.result.GasstationCardVO;
+import com.aoyang.tms.util.ErrCodeEnum;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author liujiren
+ */
+@Component
+@Slf4j
+public class UserFeignFallBack implements FallbackFactory<UserFeign> {
+
+    @Override
+    public UserFeign create(Throwable cause) {
+        String msg = cause == null ? "" : cause.getMessage();
+        if (!StringUtils.isEmpty(msg)) {
+            log.error("AccountFeign error : {}", msg);
+        }
+        return new UserFeign() {
+
+            @Override
+            public Result<List<Long>> getOrgIds(DistrictOrgIdsParam districtOrgIdsParam) {
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage(), null);
+            }
+
+            @Override
+            public Result<User> addDefaultCashier(String c_userId, User user) {
+                return new Result(ErrCodeEnum.USER_SERVER_ERROR.getCode(), ErrCodeEnum.USER_SERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public Result<User> add(String userId, User user) {
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage(), null);
+            }
+
+            @Override
+            public Result<Boolean> delete(Long userId) {
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage(), false);
+
+            }
+
+            @Override
+            public Result<List<User>> listByUserIds(List<Long> ids) {
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public Result<Page<User>> bindingList(@RequestBody PageParam<WrapperUser> pageParam) {
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public Result<JSONObject> find(User user) {
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+
+            }
+
+            @Override
+            public Result<Org> find(Org org) {
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+            }
+
+
+            @Override
+            public Result<Page<User>> listOrg(PageParam<User> pageParam) {
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public Result<Boolean> add(UserRole userRole) {
+                return new Result<Boolean>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage(), false);
+            }
+
+
+            /**
+             * @param userId
+             * @description: 查询司机发起的最新的未完成的车辆加入或退出物流公司申请【待审核、已驳回】
+             * @author: zhuangxl
+             * @since: 2021/3/31 14:48
+             */
+            @Override
+            public Result<DriverApply> lastUnfinishedTruckApply(Long userId) {
+                log.error("策略中心微服务:查询司机发起的最新的未完成的车辆加入或退出物流公司申请【待审核、已驳回】,进入熔断");
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+            }
+
+            /**
+             * @param userId
+             * @description: 查询司机发起的最新的未完成的司机加入或退出物流公司申请【待审核、已驳回】
+             * @author: zhuangxl
+             * @since: 2021/3/31 14:48
+             */
+            @Override
+            public Result<DriverApply> lastUnfinishedDriverApply(Long userId) {
+                log.error("策略中心微服务:查询司机发起的最新的未完成的司机加入或退出物流公司申请【待审核、已驳回】,进入熔断");
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+            }
+
+            /**
+             * @param authLog : 认证日志
+             * @description: 行驶证认证日志保存接口
+             * @author: zhuangxl
+             * @since: 2021/3/31 16:29
+             * @return: com.aoyang.common.result.Result<java.lang.Boolean>
+             **/
+            @Override
+            public Result<Boolean> addAuthLog(AuthLog authLog) {
+                log.error("策略中心微服务:feign调用行驶证认证日志保存,进入熔断");
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+            }
+
+            /**
+             * @param driverApply : 司机发起的申请信息
+             * @description: 司机发起申请(车辆加入退出、司机加入退出、司机和车辆同时加入退出申请)
+             * @author: zhuangxl
+             * @since: 2021/4/1 13:06
+             * @return: com.aoyang.common.result.Result<java.lang.Boolean>
+             **/
+            @Override
+            public Result<Boolean> add(DriverApply driverApply) {
+                log.error("策略中心微服务:feign调用 添加司机发起的申请信息,进入熔断");
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public Result<Boolean> transfer(String userId, String userName,
+                                            User user) {
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+            }
+
+            @Override
+            public List<Long> getOrgList(Long userId, Integer type) {
+                List<Long> result = new ArrayList<>(5);
+                result.add(0L);
+                return result;
+            }
+
+            @Override
+            public Result<GasstationCardVO> findForApp(Long gasstationID) {
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+            }
+
+            /**
+             * @param param : 用户id
+             * @description: 根据id查询用户
+             * @author: zhuangxl
+             * @since: 2021/4/29 13:14
+             * @return: com.aoyang.common.result.Result<com.aoyang.user.entity.User>
+             **/
+            @Override
+            public Result<User> findUserById(IdParam param) {
+                log.error("策略中心微服务:feign调用 添加司机发起的申请信息,进入熔断");
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+
+            }
+
+            /**
+             * @param driverWhiteList : 司机手机号
+             * @description: 查询指定的手机号是否有预添加信息
+             * @author: zhuangxl
+             * @since: 2021/5/27 11:02
+             * @return: com.aoyang.common.result.Result<com.aoyang.user.entity.DriverWhiteList>
+             **/
+            @Override
+            public Result<DriverWhiteList> driverWhiteListAddCheck(DriverWhiteList driverWhiteList) {
+                log.error("策略中心微服务:feign调用 查询指定的手机号是否有预添加信息,进入熔断");
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+
+            }
+
+            /**
+             * @param param : 司机id
+             * @description: 撤销司机加入或退出物流公司的申请(包含带车)
+             * @author: zhuangxl
+             * @since: 2021/8/6 18:41
+             * @return: void
+             **/
+            @Override
+            public Result<String> cancleDriverApply(IdParam param) {
+                log.error("策略中心微服务:feign调用 撤销司机加入或退出物流公司的申请(包含带车),进入熔断");
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+            }
+
+            /**
+             * @param param : 车辆id
+             * @description: 撤销车辆加入物流公司的申请
+             * @author: zhuangxl
+             * @since: 2021/8/6 18:41
+             * @return: void
+             **/
+            @Override
+            public Result<String> cancleTruckApply(IdParam param) {
+                log.error("策略中心微服务:feign调用 撤销指定车辆相关的的申请,进入熔断");
+                return new Result<>(ErrCodeEnum.USERSERVER_ERROR.getCode(), ErrCodeEnum.USERSERVER_ERROR.getMessage());
+            }
+        };
+
+    }
+
+
+}

+ 52 - 0
src/main/java/com/aoyang/tms/feign/param/AuthLog.java

@@ -0,0 +1,52 @@
+package com.aoyang.tms.feign.param;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+    * 个人身份证、驾驶证、行驶证认证记录表
+    * </p>
+ *
+ * @author zhuangxl
+ * @since 2021-03-22
+ */
+@Data
+public class AuthLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long id;
+
+    //认证时的目标对象id(身份证用户的id、驾驶证对应司机的id,行驶证对应车辆id)
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long targetId;
+
+    //类型:1=身份证认证 2=驾驶证认证 3=行驶证认证
+    private Integer type;
+
+    //认证状态:1=认证成功 0=认证失败
+    private Integer status;
+
+    //请求内容
+    private String requestContent;
+
+    //响应内容
+    private String responseContent;
+
+    //创建人
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long creater;
+
+    //创建人姓名
+    private String createrName;
+
+    //创建时间
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createDate;
+
+}

+ 16 - 0
src/main/java/com/aoyang/tms/feign/param/CarrierBalanceParam.java

@@ -0,0 +1,16 @@
+package com.aoyang.tms.feign.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Description: 物流公司余额参数类
+ * @Author guoyong
+ * @Date 2021/5/17 10:41
+ * @Version 1.0
+ */
+@Data
+public class CarrierBalanceParam {
+    @ApiModelProperty(value = "组织id")
+    private Long orgId;
+}

+ 24 - 0
src/main/java/com/aoyang/tms/feign/param/CashbackParam.java

@@ -0,0 +1,24 @@
+package com.aoyang.tms.feign.param;
+
+import com.aoyang.tms.entity.vo.GasOrderVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zhuangxl
+ * @description
+ * @since 2021-08-14 14:57
+ */
+@ApiModel(value = "返现微信模板消息参数")
+@Data
+public class CashbackParam {
+
+    @ApiModelProperty(value = "已完成支付和返现的加气订单信息")
+    private GasOrderVo gasOrder;
+
+    @ApiModelProperty(value = "返现金额")
+    private BigDecimal amount;
+}

+ 23 - 0
src/main/java/com/aoyang/tms/feign/param/DistrictOrgIdsParam.java

@@ -0,0 +1,23 @@
+package com.aoyang.tms.feign.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Description: 根据区域id获取加气站id参数类
+ * @Author guoyong
+ * @Date 2021/3/1 11:42
+ * @Version 1.0
+ */
+@Data
+public class DistrictOrgIdsParam {
+
+    @ApiModelProperty(value = "区域id")
+    private  Integer districtId;
+
+    @ApiModelProperty(value = "日期")
+    private  String date;
+
+    @ApiModelProperty(value = "加气站状态,状态(0:启用 1:停用)")
+    private  Integer status;
+}

+ 29 - 0
src/main/java/com/aoyang/tms/feign/param/DriverGctOrderParam.java

@@ -0,0 +1,29 @@
+package com.aoyang.tms.feign.param;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author zhuangxl
+ * @description
+ * @since 2021-10-16 9:33
+ */
+@ApiModel("司机预约检测订单查询参数")
+@Data
+public class DriverGctOrderParam {
+
+    @ApiModelProperty(value = "预约日期")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private String appointDate;
+
+    @ApiModelProperty(value = "加气站ids")
+    private List<Long> idList;
+
+    @ApiModelProperty(value = "司机id")
+    private Long driverId;
+
+}

+ 47 - 0
src/main/java/com/aoyang/tms/feign/param/GasstationWeekAverageQty.java

@@ -0,0 +1,47 @@
+package com.aoyang.tms.feign.param;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * <p>
+    * 加气站近7日日均销量落地表,定时任务每天落地一次
+    * </p>
+ *
+ * @author liujiren
+ * @since 2021-07-12
+ */
+@Data
+public class GasstationWeekAverageQty implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id主键")
+    private Integer id;
+
+    @ApiModelProperty(value = "加气站id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long gasstationId;
+
+    @ApiModelProperty(value = "加气站简称")
+    private String nickName;
+
+    @ApiModelProperty(value = "加气站名称")
+    private String gasstationName;
+
+    @ApiModelProperty(value = "近7日日均销量")
+    private BigDecimal weekAverageQty;
+
+    @ApiModelProperty(value = "存量(站端当日期初库存数+当日配送量[期望到站时间为当日的LNG计划订单])")
+    private BigDecimal stock;
+
+    @ApiModelProperty(value = "年月日,格式如yyyy-mm-dd")
+    private LocalDate curDate;
+
+
+}

+ 18 - 0
src/main/java/com/aoyang/tms/feign/param/StatisticsGasstationParam.java

@@ -0,0 +1,18 @@
+package com.aoyang.tms.feign.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Description: ${DESCRIPTION}
+ * @Author guoyong
+ * @Date 2021/2/25 17:16
+ * @Version 1.0
+ */
+@Data
+public class StatisticsGasstationParam {
+    @ApiModelProperty(value = "加气站ID")
+    private Long gasstationId;
+    @ApiModelProperty(value = "日期")
+    private String date;
+}

+ 19 - 0
src/main/java/com/aoyang/tms/feign/param/findTruckBalancesParam.java

@@ -0,0 +1,19 @@
+package com.aoyang.tms.feign.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Description: 批量查询账户余额
+ * @Author guoyong
+ * @Date 2021/4/14 17:06
+ * @Version 1.0
+ */
+@Data
+public class findTruckBalancesParam {
+
+    @ApiModelProperty(value = "卡车ids")
+    private List<Long> truckIds;
+}

+ 98 - 0
src/main/java/com/aoyang/tms/feign/result/DriverApply.java

@@ -0,0 +1,98 @@
+package com.aoyang.tms.feign.result;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+    * 司机各种申请信息表
+    * </p>
+ *
+ * @author zhuangxl
+ * @since 2021-03-31
+ */
+@Data
+@TableName("driver_apply")
+@ApiModel(value="DriverApply对象", description="司机各种申请信息表")
+public class DriverApply implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id,自增")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long id;
+
+    @ApiModelProperty(value = "组织id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long orgId;
+
+    @ApiModelProperty(value = "组织名称")
+    private String orgName;
+
+    @ApiModelProperty(value = "车辆id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long truckId;
+
+    @ApiModelProperty(value = "车牌号")
+    private String carNumber;
+
+    @ApiModelProperty(value = "司机id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long driverId;
+
+    @ApiModelProperty(value = "司机姓名")
+    private String driverName;
+
+    @ApiModelProperty(value = "司机手机号")
+    private String driverMobile;
+
+    @ApiModelProperty(value = "申请理由")
+    private String reqMsg;
+
+    @ApiModelProperty(value = "创建人id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long creater;
+
+    @ApiModelProperty(value = "创建人姓名")
+    private String createrName;
+
+    @ApiModelProperty(value = "创建日期")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createDate;
+
+    @ApiModelProperty(value = "类型: 1 司机加入申请 2 车辆加入申请 3 司机和车辆同时加入申请 4 司机退出申请 5 车辆退出申请 6 司机和车辆同时退出申请 ")
+    @TableField("type")
+    private Integer type;
+
+    @ApiModelProperty(value = "审核状态: 1 待审核,2 已审核, 3 驳回 ")
+    private Integer auditStatus;
+
+    @ApiModelProperty(value = "驳回原因")
+    private String resMsg;
+
+    @ApiModelProperty(value = "审核人id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long auditor;
+
+    @ApiModelProperty(value = "审核人姓名")
+    private String auditorName;
+
+    @ApiModelProperty(value = "审核时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime auditDate;
+
+    @ApiModelProperty(value = "0=自有车辆 1=其他 ")
+    private Integer linked;
+
+    @ApiModelProperty(value = "0=账户消费 1=自动圈存")
+    @TableField("auto_account")
+    private Integer autoAccount;
+
+}

+ 86 - 0
src/main/java/com/aoyang/tms/feign/result/DriverWhiteList.java

@@ -0,0 +1,86 @@
+package com.aoyang.tms.feign.result;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+    * 物流公司-预添加司机信息表
+    * </p>
+ *
+ * @author zhuangxl
+ * @since 2021-04-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("driver_white_list")
+@ApiModel(value="DriverWhiteList对象", description="物流公司-预添加司机信息表")
+public class DriverWhiteList implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id,自增")
+    @TableId(value = "id", type = IdType.AUTO)
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long id;
+
+    @ApiModelProperty(value = "组织id")
+    @TableField("org_id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long orgId;
+
+    @ApiModelProperty(value = "组织名称")
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "组织简称")
+    @TableField("org_short_name")
+    private String orgShortName;
+
+    @ApiModelProperty(value = "司机手机号")
+    @TableField("driver_mobile")
+    private String driverMobile;
+
+    @ApiModelProperty(value = "司机姓名")
+    @TableField("driver_name")
+    private String driverName;
+
+    @ApiModelProperty(value = "创建人id")
+    @TableField("creater")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long creater;
+
+    @ApiModelProperty(value = "创建人姓名")
+    @TableField("creater_name")
+    private String createrName;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("create_date")
+    private LocalDateTime createDate;
+
+    @ApiModelProperty(value = "司机接受状态: 1=待接受,2=已同意,3=已拒绝")
+    @TableField("accept_status")
+    private Integer acceptStatus;
+
+    @ApiModelProperty(value = "司机是否已注册(是否已激活): 0 未注册 1 已注册")
+    @TableField("register_status")
+    private Integer registerStatus;
+
+    @ApiModelProperty(value = "删除状态:0=显示,1=不显示")
+    @TableField("remove_status")
+    private Integer removeStatus;
+
+
+}

+ 66 - 0
src/main/java/com/aoyang/tms/feign/result/GasstationCardVO.java

@@ -0,0 +1,66 @@
+package com.aoyang.tms.feign.result;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Description: ${DESCRIPTION}
+ * @Author guoyong
+ * @Date 2020/12/7 13:28
+ * @Version 1.0
+ */
+@Data
+public class GasstationCardVO {
+
+    @ApiModelProperty(value = "加气站名称")
+    private String gasstationName;
+
+    @ApiModelProperty(value = "加气站简称")
+    private String nickName;
+
+    @ApiModelProperty(value = "地址")
+    private String address;
+
+    @ApiModelProperty(value = "今日挂牌价-加气站输入的价格")
+    private BigDecimal listPrice;
+
+    @ApiModelProperty(value = "平台挂牌价")
+    private BigDecimal platformPrice;
+
+    @ApiModelProperty(value = "手机号")
+    private String mobile;
+
+    @ApiModelProperty(value = "省份")
+    private String province;
+
+    @ApiModelProperty(value = "城市")
+    private String city;
+
+    @ApiModelProperty(value = "地区")
+    private String region;
+
+    @ApiModelProperty(value = "经度")
+    private String longitude;
+
+    @ApiModelProperty(value = "纬度")
+    private String latitude;
+
+    @ApiModelProperty(value = "加气站logo图片")
+    private String url;
+
+    @ApiModelProperty(value = "加气站形象图列表")
+    private List orgPics;
+
+    @ApiModelProperty(value = "加气站宣传文案")
+    private String introduce;
+
+    @ApiModelProperty(value = "加注机数量")
+    private Integer fillingMachineNum;
+
+    @ApiModelProperty(value = "收银员数量")
+    private Integer cashierNum;
+
+}

+ 58 - 0
src/main/java/com/aoyang/tms/feign/result/GasstationTradeSum.java

@@ -0,0 +1,58 @@
+package com.aoyang.tms.feign.result;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Description: 加气站单日汇总数据
+ * @Author guoyong
+ * @Date 2021/2/25 17:08
+ * @Version 1.0
+ */
+@Data
+public class GasstationTradeSum {
+
+    @ApiModelProperty(value = "加气站id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long gasstationId;
+
+    @ApiModelProperty(value = "加气站名称")
+    private String gasstationName;
+
+    @ApiModelProperty(value = "当日结算价")
+    private BigDecimal actualPrice;
+
+    @ApiModelProperty(value = "进气量汇总(采购量)")
+    private BigDecimal gasQtyTotal;
+
+    @ApiModelProperty(value = "加气量汇总(销售量)")
+    private BigDecimal storeTotal;
+
+    @ApiModelProperty(value = "存量")
+    private BigDecimal stockTotal;
+
+    @ApiModelProperty(value = "在途量")
+    private BigDecimal wayTotal;
+
+    @ApiModelProperty(value = "日活卡车数量汇总")
+    private Integer liveTruckTotal;
+
+    @ApiModelProperty(value = "区域名")
+    private String districtName;
+
+    @ApiModelProperty(value = "区域id")
+    private Integer districtId;
+
+    @ApiModelProperty(value = "区域排名")
+    private String districtRank;
+
+    @ApiModelProperty(value = "全平台排名")
+    private String allDistrictRank;
+
+    @ApiModelProperty(value = "日期")
+    private String date;
+
+}

+ 62 - 0
src/main/java/com/aoyang/tms/util/BadRequestExceptionHandler.java

@@ -0,0 +1,62 @@
+package com.aoyang.tms.util;
+
+import java.util.List;
+
+import org.springframework.http.converter.HttpMessageConversionException;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@RestControllerAdvice
+public class BadRequestExceptionHandler {
+
+    /**
+     * 校验错误拦截处理
+     *
+     * @param exception
+     *            错误信息集合
+     * @return 错误信息
+     */
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public Result validationBodyException(MethodArgumentNotValidException exception) {
+
+        BindingResult result = exception.getBindingResult();
+        StringBuffer message = new StringBuffer();
+        if (result.hasErrors()) {
+
+            List<ObjectError> errors = result.getAllErrors();
+
+            errors.forEach(p -> {
+
+                FieldError fieldError = (FieldError)p;
+                log.error("Data check failure : object{" + fieldError.getObjectName() + "},field{"
+                    + fieldError.getField() + "},errorMessage{" + fieldError.getDefaultMessage() + "}");
+                message.append(fieldError.getDefaultMessage()).append(";");
+            });
+
+        }
+        return new Result<>(20000, message.toString());
+    }
+
+    /**
+     * 参数
+     *
+     * @param exception
+     *            错误
+     * @return 错误信息
+     */
+    @ExceptionHandler(HttpMessageConversionException.class)
+    public Result parameterTypeException(HttpMessageConversionException exception) {
+
+        log.error(exception.getCause().getLocalizedMessage());
+        return new Result(20000, "类型转换错误");
+
+    }
+
+}

+ 55 - 0
src/main/java/com/aoyang/tms/util/BaseLocalDateFormatUtils.java

@@ -0,0 +1,55 @@
+package com.aoyang.tms.util;
+
+/**
+ * @Description: ${DESCRIPTION}
+ * @Author guoyong
+ * @Date 2021/1/27 16:52
+ * @Version 1.0
+ */
+
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Date;
+
+/**
+ * @author wsq
+ * @version BaseLocalDateFormatUtils.java  2020/8/27  上午9:32 下午
+ */
+public class BaseLocalDateFormatUtils {
+
+    /**
+     * Date转LocalDateTime
+     *
+     * @param date Date
+     * @return LocalDateTime
+     */
+    public static LocalDateTime dateToLocalDateTime(Date date) {
+        try {
+            Instant instant = date.toInstant();
+            ZoneId zoneId = ZoneId.systemDefault();
+            return instant.atZone(zoneId).toLocalDateTime();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * LocalDateTime转Date
+     *
+     * @param localDateTime LocalDateTime
+     * @return Date
+     */
+    public static Date localDateTimeToDate(LocalDateTime localDateTime) {
+        try {
+            ZoneId zoneId = ZoneId.systemDefault();
+            ZonedDateTime zdt = localDateTime.atZone(zoneId);
+            return Date.from(zdt.toInstant());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 37 - 0
src/main/java/com/aoyang/tms/util/BigDecimalUtils.java

@@ -0,0 +1,37 @@
+package com.aoyang.tms.util;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+/**
+ * @Description: ${DESCRIPTION}
+ * @Author guoyong
+ * @Date 2020/12/17 15:12
+ * @Version 1.0
+ */
+public class BigDecimalUtils {
+
+    /**
+     * Object转BigDecimal类
+     *
+     * @param value 要转的object类型
+     * @return 转成的BigDecimal类型数据
+     */
+    public static BigDecimal getBigDecimal(Object value) {
+        BigDecimal ret = null;
+        if (value != null) {
+            if (value instanceof BigDecimal) {
+                ret = (BigDecimal) value;
+            } else if (value instanceof String) {
+                ret = new BigDecimal((String) value);
+            } else if (value instanceof BigInteger) {
+                ret = new BigDecimal((BigInteger) value);
+            } else if (value instanceof Number) {
+                ret = new BigDecimal(((Number) value).doubleValue());
+            } else {
+                throw new ClassCastException("Not possible to coerce [" + value + "] from class " + value.getClass() + " into a BigDecimal.");
+            }
+        }
+        return ret;
+    }
+}

+ 433 - 0
src/main/java/com/aoyang/tms/util/DateUtils.java

@@ -0,0 +1,433 @@
+package com.aoyang.tms.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Calendar;
+
+/**
+ * @Description: 日期时间工具类
+ * @Author guoyong
+ * @Date 2020/12/16 15:10
+ * @Version 1.0
+ */
+public class DateUtils {
+
+    public static void main(String[] args) {
+
+//        System.out.println(getCurrentYear());
+//        System.out.println(getCurrentMonth());
+//
+//
+//        int lastMonth = getLastMonth();
+//        System.out.println(lastMonth);
+//        int currentMonth = getCurrentMonth();
+//        System.out.println(currentMonth);
+//        int lastMonthYear = getLastMonthYear();
+//        System.out.println(lastMonthYear);
+//
+//        String start = getLastMonthPeriodInitialTime();
+//        System.out.println(start);
+//        String end = getLastPeriodMonthEndTime();
+//        System.out.println(end);
+//
+//        int lastPyear = getLastPeriodYear();
+//        int latPmonth = getLastPeriodMonth();
+//
+//        System.out.println(lastPyear);
+//        System.out.println(latPmonth);
+//
+//        String aaa = DateUtils.getPeriodStartTime(2020, 10);
+//        String bbb = DateUtils.getPeriodEndTime(2020, 10);
+//        System.out.println(aaa);
+//        System.out.println(bbb);
+//
+//        String ccc = DateUtils.getAfterDays(2);
+//        LocalDateTime date = LocalDateTime.now();
+//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+//        String now = formatter.format(LocalDateTime.now());
+//        int hour = hours(now, ccc);
+//        System.out.println("ccc:" + ccc);
+//        System.out.println(hour);
+//
+//        int hours = hours("2021-03-08 00:00:00", "2021-03-09 23:59:59");
+//        System.out.println(hours);
+//
+//        System.out.println(getLastMonthStr());
+//
+//        int month = 2;
+//        String vo1 = getFirstDayOfMonth(month);
+//        String vo2 = getFirstDayOfMonth(month + 1);
+//        System.out.println(vo1);
+//        System.out.println(vo2);
+//
+//        long time = 30 * 60 * 1000;
+//        String time2 = "2020-06-26 19:00:00";
+//        String time1 = "2020-06-26 19:30:30";
+//        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+//        LocalDateTime ends = LocalDateTime.parse(time1, dtf2);
+//        LocalDateTime nows = LocalDateTime.parse(time2, dtf2);
+//        Duration duration = Duration.between(nows, ends);
+//        long millis = duration.toMillis();
+//        if (millis < time) {
+//            System.out.println("不能保存!!!");
+//        }else{
+//            System.out.println("可以保存!!!");
+//        }
+
+        LocalDateTime nowS = LocalDateTime.now();
+        String operateTime = DateUtils.localDateTimeToString(nowS);
+
+
+        System.out.println(nowS);
+        System.out.println(operateTime);
+
+    }
+
+    /**
+     * 时间格式字符串转LocalDateTime
+     *
+     * @param time
+     * @return
+     */
+    public static LocalDateTime parseStringToDateTime(String time) {
+        String format = "yyyy-MMM-dd HH:mm:ss";
+        DateTimeFormatter df = DateTimeFormatter.ofPattern(format);
+        return LocalDateTime.parse(time, df);
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取当前时间的上个月
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static int getLastMonth() {
+        LocalDate date = LocalDate.now();
+        int lastMonth = date.minusMonths(1).getMonth().getValue();
+        return lastMonth;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取上个月,格式如yyyy-MM
+     * @Date 2021/4/13
+     * @Param
+     **/
+    public static String getLastMonthStr() {
+        LocalDate date = LocalDate.now();
+        date = date.minusMonths(1);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
+        return formatter.format(date);
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取当前时间的当前月
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static int getCurrentMonth() {
+        LocalDate date = LocalDate.now();
+        int lastMonth = date.getMonth().getValue();
+        return lastMonth;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取当前日期
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static int getCurrentDay() {
+        LocalDate date = LocalDate.now();
+        int day = date.getDayOfMonth();
+        return day;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取今天日期,年月日格式
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static String getCurday() {
+        LocalDate date = LocalDate.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        return formatter.format(date);
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取当前时间的上个月的所在年份
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static int getLastMonthYear() {
+        LocalDate date = LocalDate.now();
+        int lastMonthYear = date.minusMonths(1).getYear();
+        return lastMonthYear;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取当前时间的上个月的所在年份
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static int getCurrentYear() {
+        LocalDate date = LocalDate.now();
+        int currentYear = date.getYear();
+        return currentYear;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 上期账单的期初时间点, 上个月的25号00:00:00,注,在筛选数据时大于等于此时间点
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static String getLastMonthPeriodInitialTime() {
+        int currentDay = getCurrentDay();
+        int year = getLastMonthYear();
+        int month = getLastMonth() - 1;
+        if (currentDay >= 25) {
+            month = getLastMonth();
+        }
+        String monthString = month < 10 ? "0" + month : month + "";
+        String lastMonthInitialPeriodTime = year + "-" + monthString + "-" + "25 00:00:00";
+        return lastMonthInitialPeriodTime;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 上期账单的期末时间点,当前月份的25号00:00:00,注,在筛选数据时,小于此时间点,不能等于
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static String getLastPeriodMonthEndTime() {
+        int currentDay = getCurrentDay();
+        int month = getCurrentMonth();
+        if (currentDay < 25) {
+            month = getLastMonth();
+        }
+        int year = getLastMonthYear();
+
+        if (month == 1) {
+            year = getCurrentYear();
+        }
+        String monthString = month < 10 ? "0" + month : month + "";
+        String lastMonthInitialPeriodTime = year + "-" + monthString + "-" + "25 00:00:00";
+        return lastMonthInitialPeriodTime;
+    }
+
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 上个账期的年份
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static int getLastPeriodYear() {
+        int currentDay = getCurrentDay();
+        int month = getCurrentMonth();
+        if (currentDay < 25) {
+            month = getLastMonth();
+        }
+        int year = getLastMonthYear();
+
+        if (month == 1) {
+            year = getCurrentYear();
+        }
+        return year;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 上个账期的月份
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static int getLastPeriodMonth() {
+        int currentDay = getCurrentDay();
+        int month = getCurrentMonth();
+        if (currentDay < 25) {
+            month = getLastMonth();
+        }
+        return month;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 账单的期初时间点, 某年某月的25号00:00:00,注,在筛选数据时大于等于此时间点
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static String getPeriodStartTime(int year, int month) {
+        if (month == 1) {
+            month = 12;
+            year = year - 1;
+        } else {
+            month = month - 1;
+        }
+        String monthString = month < 10 ? "0" + month : month + "";
+        String periodStartTime = year + "-" + monthString + "-" + "25 00:00:00";
+        return periodStartTime;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 账单的期末时间点,某年某月份的25号00:00:00,注,在筛选数据时,小于此时间点,不能等于
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static String getPeriodEndTime(int year, int month) {
+
+        String monthString = month < 10 ? "0" + month : month + "";
+        String periodEndTime = year + "-" + monthString + "-" + "25 00:00:00";
+        return periodEndTime;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取上个账期的年
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static int getLastPeriodYear(int year, int month) {
+        if (month == 1) {
+            year = year - 1;
+        }
+        int lastPeriodYear = year;
+        return lastPeriodYear;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取上个账期的月
+     * @Date 2020/12/16
+     * @Param
+     **/
+
+    public static int getLastPeriodMonth(int year, int month) {
+        if (month == 1) {
+            month = 12;
+        } else {
+            month = month - 1;
+        }
+        int lastPeriodMonth = month;
+        return lastPeriodMonth;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取某天的几天后的日期,年月日格式
+     * @Date 2020/12/16
+     * @Param
+     **/
+    public static String getAfterDays(int days) {
+        LocalDateTime date = LocalDateTime.now();
+        LocalDateTime afterDay = date.plusDays(days);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        return formatter.format(afterDay);
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取两个时间段的小时差
+     * @Date 2021/03/08
+     * @Param
+     **/
+    public static int hours(String fromDate, String toDate) {
+        SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            long from = simpleFormat.parse(fromDate).getTime();
+            long to = simpleFormat.parse(toDate).getTime();
+            int hours = (int) ((to - from) / (1000 * 60 * 60));
+            return hours;
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description LocalDateTime转String
+     * @Date 2021/03/08
+     * @Param
+     **/
+    public static String localDateTimeToString(LocalDateTime date) {
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        String localTimeStr = df.format(date);
+        return localTimeStr;
+    }
+
+    /**
+     * 获取当前月第一天
+     *
+     * @param month
+     * @return
+     */
+    public static String getFirstDayOfMonth(int month) {
+        Calendar calendar = Calendar.getInstance();
+        // 设置月份
+        calendar.set(Calendar.MONTH, month - 1);
+        // 获取某月最小天数
+        int firstDay = calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
+        // 设置日历中月份的最小天数
+        calendar.set(Calendar.DAY_OF_MONTH, firstDay);
+        // 格式化日期
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        String vo = sdf.format(calendar.getTime()) + " 00:00:00";
+        return vo;
+    }
+
+    /**
+     * 时间格式字符串转LocalDate
+     *
+     * @param day
+     * @return
+     */
+    public static LocalDate parseStringToDate(String day) {
+        String format = "yyyy-MM-dd";
+        DateTimeFormatter df = DateTimeFormatter.ofPattern(format);
+        return LocalDate.parse(day, df);
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取指定日期的昨天,年月日格式
+     * @Date 2021/03/12
+     * @Param
+     **/
+    public static String getYesterday(String date) {
+        LocalDate localDate =
+                LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        LocalDate yesterday = localDate.plusDays(-1);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        return formatter.format(yesterday);
+    }
+
+}

+ 159 - 0
src/main/java/com/aoyang/tms/util/ErrCodeEnum.java

@@ -0,0 +1,159 @@
+package com.aoyang.tms.util;
+
+/**
+ * @description:
+ * @author: xumingrui
+ * @create: 2020 -01 -21 -14:47
+ */
+
+public enum ErrCodeEnum {
+    OK(0, "成功"), BAD_PARAM(8901, "参数错误"), PLAT_FORM_PRICE_EXITS(8902, "该组织已维护平台价,请进入修改!"),
+    CARRIER_NOT_EXITS(8903, "物流公司不存在"), GASSTATION_NOT_EXITS(8904, "加气站不存在"), UPLOAD_WEIGHT_ERROR(8905, "出港重量录入错误"),
+    UPLOAD_URL_ERROR(8906, "请上传磅单"), LNG_FROM_ERROR(8907, "请选择液源地"), ORDER_STATUS_ERROR(8908, "订单状态异常"),
+    ORDER_NOT_EXITS(8909, "订单不存在"), DOWNLOAD_WEIGHT_ERROR(8910, "到港重量需大于0"),
+    GASSTATION_STATUS_ERROR(8911, "加气站不存在或状态异常"), OPERATION_ERROR(8912, "操作失败"), LNG_FROM_EMPTY(8913, "液源地不存在"),
+    UN_ABLE_MODIFY_ERROR(8914, "该订单状态下不允许再做修改"),
+    UN_ABLE_CANCEL_ERROR(8915, "此订单不能做取消操作(已提报、已锁定、已确认、变更待处理、已出港状态下可以取消)"),
+    UN_ABLE_MODIFY_HANDLE_ERROR(8916, "此订单不需要进行处理"), UN_ABLE_CONFIRM_ERROR(8917, "此订单不需要进行确认"),
+    UN_ABLE_LEAVE_ERROR(8918, "此订单不能做出港操作"), UN_ABLE_REACH_ERROR(8919, "此订单不能做签收操作"), LEAVE_TIME_ERROR(8920, "请录入出港时间"),
+    DRIVER_NAME_ERROR(8921, "请录入驾驶员姓名"), DRIVER_CELLPHONE_ERROR(8922, "请录入驾驶员联系方式"), CAR_NUMBER_ERROR(8923, "请录入车牌号"),
+    DOWNLOAD_URL_ERROR(8924, "请上传到站磅单"), UN_ABLE_EXCEPTION_APPLY_ERROR(8925, "只有出港状态下的计划可以进行异常申请"),
+    UN_ABLE_EXCEPTION_HANDLE_ERROR(8926, "只有异常待处理下的计划可以进行异常处理"), UN_ABLE_COMPLETE_ERROR(8927, "此订单不能做完成操作"),
+    CHECK_WEIGHT_ERROR(8928, "出港重量录入错误"), OPERATE_TIME_ERROR(8929, "请输入操作开始时间和结束时间"),
+    CAR_NUMBER_CANNOT_UPDATE(8930, "车牌号不允许进行修改!"),
+    UN_ABLE_UPLOAD_URL(8931, "此状态下不能上传到站磅单!"),
+    REACHED_STATUS(8932, "此订单已签收!"),
+
+    ACCOUNTSERVER_ERROR(2418, "进入ACCOUNT熔断"), MESSAGESERVER_ERROR(2419, "进入MESSAGE熔断"),
+    ADD_CARRIAGE_PRICE_ERROR(2500, "运费设置失败"), SET_HARBOUR_PRICE_ERROR(2501, "设置出港价失败"),
+    SET_AREA_BENEFIT_ERROR(2502, "设置区域优惠失败"), DELETE_AREA_BENEFIT_ERROR(2503, "删除区域优惠失败"),
+    SET_CARRIAGE_FEE_BEFORE(2504, "请先设置运费单价"), SET_DEFAULT_PORT_FIRST(2505, "先设置默认港口"),
+    SET_PRICE_CONFIG_ERROR(2506, "设置平台挂牌价失败"), RELEASE_DATA_EMPTY(2507, "无可发布数据"), APPLY_RELEASE_FAIL(2508, "申请发布失败"),
+    AUDIT_RELEASE_FAIL(2509, "审核发布失败"), RELEASE_FAIL(2510, "发布失败"), RELEASE_SATUS_ERROR(2511, "申请单状态异常"),
+    REBATE_PRICE_ERROR(2512, "优惠返利设置失败"), AOYANG_PRICE_ERROR(2513, "奥扬优惠设置失败"), PRICE_CONFIG_ERROR(2514, "请先完善未配置的数据"),
+    USER_SERVER_ERROR(2515, "进入用户服务熔断"), RELEASE_TIME_ERROR(2516, "发布时间应大于当前日期"),
+    ADD_STOCK_LOG_ERROR(2517, "增加库存变动日志失败"), GASSTATION_ID_EMPTY(2401, "加气站id不能为空"),
+    SERVICE_FEE_EMPTY_ERROR(2413, "服务费不能为空"), SET_PLANT_PRICE(2420, "请先设置平台价格"),
+    GASSTATION_SERVIE_FEE_LT_PLANT_PRICE(2421, "不能高于平台服务费"), UPDATE_FEE_ERROR(2425, "修改服务费失败"),
+    UPDATE_SERVICE_FEE_FAIL(2415, "修改服务费失败"), LIST_PRICE_MODIFY_FAIL(2411, "维护气价失败"),
+    LIST_PRICE_MODIFY_LOG_FAIL(2412, "维护气价日志失败"), NO_SYSTEM_CASHIER_ERROR(2426, "加气站默认收银员不存在"),
+    ITUDE_ERROR(2405, "坐标错误"), USER_NOT_EXIT_ERROR(2406, "用户不存在"), DATABASE_ERROR(2301, "数据库操作失败"),
+    DRIVER_ID_EMPTY(2302, "司机id不能为空"), CARRIER_ID_EMPTY(2303, "物流公司id不能为空"), TRUCK_ID_EMPTY(2304, "卡车id不能为空"),
+    TRUCK_NOT_BINDING(2320, "卡车未绑定"), PARAM_VALID_ERROR(2321, "参数错误"), REDISS_CONNECTION_ERROR(3330, "rediss 连接失败"),
+    USERSERVER_ERROR(3301, "进入USER熔断"), USER_ADD_ERROR(2323, "新增司机失败"), DRIVER_MODIFY_FAIL(2323, "修改司机信息失败"),
+    TRUCK_ADD_FAIL(2324, "新增卡车失败"), TRUCK_DRIVER_REF_FAIL(2325, "卡车-司机 失败"), ORG_NAME_EMPTY_ERROR(2326, "组织名称为空"),
+    ORG_ID_EMPTY_ERROR(2327, "组织ID为空"), MOBILE_EMPTY_ERROR(2328, "手机号为空"), TRUCK_EMPTY_ERROR(2329, "该卡车不存在或已停用"),
+    DRIVER_BINDING_ERROR(2330, "司机已绑定"), CAR_NUMBER_EXITS_ERROR(2331, "该车牌号已存在"), NOT_BINDING_ERROR(2332, "未绑定车辆"),
+    CHECK_DRIVER_FIRST(2333, "请选择要绑定的司机"), START_COMPANY_FIRST(2334, "请先启动所属企业"), TRUCK_IS_STOP(2335, "卡车已停用"),
+    FILE_FORMAT_ERROR(2336, "文件格式错误"), FILE_NOT_BELONG_ORG_ERROR(2337, "卡车所属物流公司错误"), FILE_IS_NULL_ERROR(2338, "文件不存在"),
+    IMPORT_ERROR(2339, "导入失败"), SAVE_ERROR(2340, "保存失败"), PRICE_CONFIG_SAVE_ERROR(2341, "同步优惠气价 price_config 失败"),
+    GWAY_SAVE_ERROR(2342, "保存修改日志错误"), ALDEY_PUBLISH_ERROR(2343, "状态异常"), PUBLISH_DATE_ERROR(2344, "发布日期错误"),
+    TRUCK_ACCOUNT_NONZERO_ERROR(2345, "司机账户余额不为空"),
+    SETTLESERVER_ERROR(4301, "进入SETTLE熔断"),
+    /**
+     * 会员账号信息不存在
+     */
+    TSY_NOT_EXIST_ERROR(3009, "信息不存在"),
+    /**
+     * 存在加气站使用该标签,不允许删除
+     */
+    HAVE_GASSTATION(3010, "存在加气站使用该标签,不允许删除"),
+
+    /**
+     * 计划签收中
+     */
+    PURCHASE_IS_REACHING(3011, "计划签收中"),
+
+    /**
+     * 车辆已绑定其他司机
+     */
+    TRUCK_HAS_BINDING_DRIVRER(3022, "车辆已绑定其他司机"),
+
+    /**
+     * 司机有加入物流公司申请
+     */
+    DRIVER_HAS_ENTRY_APPLY(3023, "您有加入物流公司的申请未完成,请结束申请后再添加车辆"),
+
+    /**
+     * 司机有退出物流公司申请
+     */
+    DRIVER_HAS_QUIT_APPLY(3024, "您有退出物流公司的申请未完成,请结束申请后再添加车辆"),
+
+    /**
+     * 车辆已经在您所在的物流公司
+     */
+    TRUCK_HAS_BEEN_IN_YOUR_CARRIER(3025, "车辆已在您所在的物流公司,请联系管理员绑定"),
+
+    /**
+     * 车辆已经在其他物流公司
+     */
+    TRUCK_HAS_BEEN_IN_OTHER_CARRIER(3026, "车辆已在其他物流公司,请联系运营找回"),
+
+    /**
+     * 车辆已经申请加入物流公司
+     */
+    TRUCK_HAS_BEEN_IN_APPLY(3027, "车辆已经申请加入物流公司,请联系管理员审批"),
+
+    /**
+     * 司机更换车辆失败
+     */
+    CHANGE_TRUCK_BY_DRIVER_FAIL(3028, "司机更换车辆失败"),
+
+    /**
+     * 车牌号不一致
+     */
+    CAR_NUMBER_NOT_SAME(3029, "当前行驶证车牌号与保存的车牌号不一致,请更换行驶证再试"),
+
+    /**
+     * 天然气类型
+     */
+    NOT_TYPE_OF_NATURAL_GAS(3030, "行驶证识别的车辆类型不是天然气类型"),
+
+    /**
+     * 车辆有待支付订单
+     */
+    TRUCK_HAS_UNPAY_ORDER(3031, "车辆有待支付订单, 请先处理完成"),
+
+    /**
+     * 车辆账户余额不为0
+     */
+    TRUCK_ACCOUNT_NOT_ZERO(3032, "车辆账户余额不为0,请先处理完成"),
+
+    /**
+     * 车辆加入物流公司申请未处理完成
+     */
+    TRUCK_SELF_ENTRY_UNFINISH(3033, "您有车辆加入物流公司的申请未处理完,请到车辆管理页面查询申请状态"),
+
+    /**
+     * 司机未绑定车辆,不能添加气瓶编号
+     */
+    DRIVER_HAVE_NO_TRUCK_UN_GAS_CYLINDER(3034, "司机未绑定车辆,不能添加气瓶编号"),
+
+    /**
+     * 此车已配置直销模式
+     */
+    DIRECT_SALES_HAVE_CONFIG_TRUCK(3037, "此车已配置直销模式"),
+
+    /**
+     * 经销模式物流公司不能添加直销车辆
+     */
+    DISTRIBUTE_SALES_CAN_NOT_TRUCK(3039, "经销模式物流公司不能添加直销车辆"),
+
+    ;
+
+    private Integer code;
+    private String message;
+
+    ErrCodeEnum(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}

+ 151 - 0
src/main/java/com/aoyang/tms/util/FileUtil.java

@@ -0,0 +1,151 @@
+package com.aoyang.tms.util;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.core.io.ClassPathResource;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @Description: ${DESCRIPTION}
+ * @Author guoyong
+ * @Date 2020/12/24 10:32
+ * @Version 1.0
+ */
+public class FileUtil {
+
+    private static final boolean isWin = System.getProperty("os.name").toLowerCase().contains("win");
+
+    private static final boolean isLinux = System.getProperty("os.name").toLowerCase().indexOf("linux") >= 0;
+
+    /**
+     * @Author guoyong
+     * @Description /获取临时文件路径
+     * @Date  2020/12/25
+     * @Param
+     * @return
+    **/
+    public static String getTempDirectoryPath() {
+        if (isWin) {
+            return FileUtils.getTempDirectoryPath();
+        }
+        if (isLinux) {
+            return "/tmp/";
+        }
+        return "";
+    }
+
+    public static void main(String[] args) {
+
+        File aaa = FileUtils.getTempDirectory();
+        System.out.println(aaa.getName());
+        System.out.println(aaa.length());
+
+        System.out.println("----");
+        String path = FileUtils.getTempDirectoryPath();
+        String tplfileName = "carrier_list_tpl.xlsx";
+        String prefix = FileUtil.getFilePrefix(tplfileName);
+        String tmpFileName = FileUtil.getTmpFileName(prefix);
+
+        File srcFile = FileUtil.getFileTpl(tplfileName);
+        File destFile = new File(path + tmpFileName);
+        try {
+            FileUtils.copyFile(srcFile, destFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        System.out.println(destFile.length());
+        System.out.println(destFile.getName());
+
+
+        String aaaaaa = "aaaa.aaa.jpg";
+        System.out.println(getFileSuffix(aaaaaa));
+
+
+
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取文件名前缀
+     * @Date 2020/12/24
+     * @Param
+     **/
+    public static String getFilePrefix(String fileName) {
+        if (StringUtils.isBlank(fileName)) {
+            return "";
+        }
+        String prefix = fileName.substring(0, fileName.lastIndexOf("."));
+        return prefix;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取文件名后缀
+     * @Date 2020/12/24
+     * @Param
+     **/
+    public static String getFileSuffix(String fileName) {
+        if (StringUtils.isBlank(fileName)) {
+            return "";
+        }
+        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
+        return suffix;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 根据获取临时文件名
+     * @Date 2020/12/24
+     * @Param
+     **/
+    public static String getTmpFileName(String tplfileName) {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmssS");
+        String tmpFileName = tplfileName + "_" + formatter.format(new Date()) + ".xlsx";
+        return tmpFileName;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取模板文件的File
+     * @Date 2020/12/24
+     * @Param
+     **/
+    public static File getFileTpl(String tplfileName) {
+        File tplFile = null;
+        ClassPathResource classPathResource = new ClassPathResource("exceltpl/" + tplfileName);
+        try {
+            tplFile = classPathResource.getFile();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return tplFile;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description 获取模板文件的InputStream
+     * @Date 2020/12/24
+     * @Param
+     **/
+    public static InputStream getFileTplInputStream(String tplfileName) {
+        InputStream tplInputStream = null;
+        ClassPathResource classPathResource = new ClassPathResource("exceltpl/" + tplfileName);
+        try {
+            tplInputStream = classPathResource.getInputStream();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return tplInputStream;
+    }
+}

+ 78 - 0
src/main/java/com/aoyang/tms/util/Hanzi2Pinyin.java

@@ -0,0 +1,78 @@
+package com.aoyang.tms.util;
+import net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+ 
+public class Hanzi2Pinyin {
+ 
+	public static String convertHanzi2Pinyin(String hanzi, boolean full) {
+		/***
+		 * ^[\u2E80-\u9FFF]+$ 匹配所有东亚区的语言 ^[\u4E00-\u9FFF]+$ 匹配简体和繁体
+		 * ^[\u4E00-\u9FA5]+$ 匹配简体
+		 */
+		String regExp = "^[\u4E00-\u9FFF]+$";
+		StringBuffer sb = new StringBuffer();
+		if (hanzi == null || "".equals(hanzi.trim())) {
+			return "";
+		}
+		String pinyin = "";
+		for (int i = 0; i < hanzi.length(); i++) {
+			char unit = hanzi.charAt(i);
+			if (match(String.valueOf(unit), regExp))// 是汉字,则转拼音
+			{
+				pinyin = convertSingleHanzi2Pinyin(unit);
+				if (full) {
+					sb.append(pinyin);
+				} else {
+					sb.append(pinyin.charAt(0));
+				}
+			} else {
+				sb.append(unit);
+			}
+		}
+		return sb.toString();
+	}
+ 
+	/***
+	 * 将单个汉字转成拼音
+	 * 
+	 * @param hanzi
+	 * @return
+	 */
+	private static String convertSingleHanzi2Pinyin(char hanzi) {
+		HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
+		outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+		String[] res;
+		StringBuffer sb = new StringBuffer();
+		try {
+			res = PinyinHelper.toHanyuPinyinStringArray(hanzi, outputFormat);
+			sb.append(res[0]);// 对于多音字,只用第一个拼音
+		} catch (Exception e) {
+			e.printStackTrace();
+			return "";
+		}
+		return sb.toString();
+	}
+ 
+	/***
+	 * @param str
+	 * 源字符串
+	 * @param regex
+	 * 正则表达式
+	 * @return 是否匹配
+	 */
+	public static boolean match(String str, String regex) {
+		Pattern pattern = Pattern.compile(regex);
+		Matcher matcher = pattern.matcher(str);
+		return matcher.find();
+	}
+ 
+	public static void main(String[] args) {
+		// TODO Auto-generated method stub
+		System.out.println(convertHanzi2Pinyin("天津被", true));
+	}
+ 
+}

+ 55 - 0
src/main/java/com/aoyang/tms/util/InputCheckUtils.java

@@ -0,0 +1,55 @@
+package com.aoyang.tms.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static java.util.regex.Pattern.compile;
+
+/**
+ * @Description: 输入项校验
+ * @Author guoyong
+ * @Date 2020/10/21 14:37
+ * @Version 1.0
+ */
+public class InputCheckUtils {
+
+    /**
+     * @Author guoyong
+     * @Description 判断是否数字和字符组合
+     * @Date  2020/10/21
+     * @Param
+     * @return
+    **/
+    public static boolean isLetterDigit(String str) {
+        String regex = "^[a-z0-9A-Z]+$";
+        return str.matches(regex);
+    }
+
+
+    /**
+     * 是否是数字或小数
+     * @tags @return
+     * @exception
+     * @author wanghc
+     * @date 2015-9-16 下午5:50:15
+     * @return boolean
+     */
+    public static boolean isNumber(String str){
+        if(StringUtils.isBlank(str)){
+            return false;
+        }
+        String reg = "\\d+(\\.\\d+)?";
+        return str.matches(reg);
+    }
+
+    public static boolean isCarNo(String carNo){
+        Pattern p = compile("^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(?:(?![A-Z]{4})[A-Z0-9]){4}[A-Z0-9挂学警港澳]{1}$");
+        Matcher m = p.matcher(carNo);
+        if (!m.matches()){
+            return false;
+        }
+        return true;
+    }
+}

+ 181 - 0
src/main/java/com/aoyang/tms/util/JxlsUtils.java

@@ -0,0 +1,181 @@
+package com.aoyang.tms.util;
+
+import org.jxls.common.Context;
+import org.jxls.expression.JexlExpressionEvaluator;
+import org.jxls.transform.Transformer;
+import org.jxls.transform.poi.PoiTransformer;
+import org.jxls.util.JxlsHelper;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.Map;
+
+public class JxlsUtils {
+
+    public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> model) throws IOException {
+        Context context = PoiTransformer.createInitialContext();
+        if (model != null) {
+            for (String key : model.keySet()) {
+                context.putVar(key, model.get(key));
+            }
+        }
+        JxlsHelper jxlsHelper = JxlsHelper.getInstance();
+        Transformer transformer = jxlsHelper.createTransformer(is, os);
+        //获得配置
+        JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
+        //设置静默模式,不报警告
+        //evaluator.getJexlEngine().setSilent(true);
+        //函数强制,自定义功能
+        Map<String, Object> funcs = new HashMap<String, Object>();
+        funcs.put("utils", new JxlsUtils());    //添加自定义功能
+        evaluator.getJexlEngine().setFunctions(funcs);
+        //必须要这个,否则表格函数统计会错乱
+        jxlsHelper.setUseFastFormulaProcessor(false).processTemplate(context, transformer);
+    }
+
+    public static void exportExcel(File xls, File out, Map<String, Object> model) throws FileNotFoundException, IOException {
+        exportExcel(new FileInputStream(xls), new FileOutputStream(out), model);
+    }
+
+    public static void exportExcel(String templatePath, OutputStream os, Map<String, Object> model) throws Exception {
+        File template = getTemplate(templatePath);
+        if (template != null) {
+            exportExcel(new FileInputStream(template), os, model);
+        } else {
+            throw new Exception("Excel 模板未找到。");
+        }
+    }
+
+    //获取jxls模版文件
+    public static File getTemplate(String path) {
+        File template = new File(path);
+        if (template.exists()) {
+            return template;
+        }
+        return null;
+    }
+
+    /**
+     * @return
+     * @Author
+     * @Description 计算 单位利润额
+     * @Date 2021/1/5
+     * @Param
+     **/
+    public static BigDecimal caculateGwayPrice(BigDecimal gwayprice) {
+        try {
+            BigDecimal bignum2 = new BigDecimal("1000");
+            BigDecimal price = null;
+            price = gwayprice.divide(bignum2);
+            return price;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description Long 2 String
+     * @Date 2020/12/31
+     * @Param
+     **/
+    public static String longToStr(Long value) {
+        if (value == null) {
+            return "";
+        }
+        return String.valueOf(value);
+    }
+
+    // 日期格式化
+    public String dateFmt(LocalDateTime localDateTime, String format) {
+        if (localDateTime == null) {
+            return "";
+        }
+        try {
+            DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern(format);
+            String strDate2 = dtf2.format(localDateTime);
+            return strDate2;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+
+    // if判断
+    public Object ifelse(boolean b, Object o1, Object o2) {
+        return b ? o1 : o2;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description stock_type to String 库存操作类型 1=入库 2=出库 3=库存调整
+     * @Date 2020/12/31
+     * @Param
+     **/
+    public static String stockTypeToStr(Integer value) {
+        String str = "";
+        if (value == 1) {
+            str = "入库气量";
+        }
+        if (value == 2) {
+            str = "销售气量";
+        }
+        if (value == 3) {
+            str = "库存调整";
+        }
+        if (value == 4) {
+            str = "核对驳回";
+        }
+        if (value == 5) {
+            str = "退单库存退回";
+        }
+        return str;
+    }
+
+    /**
+     * @return
+     * @Author guoyong
+     * @Description status to String 0:已取消;1:已下单;2:已确认;3:已出港;4:已签收;5:已完成;6已锁定;7变更待处理;8异常待处理
+     * @Date 2020/12/31
+     * @Param
+     **/
+    public static String statusToStr(String value) {
+        String str = "";
+        if (value.equals("0")) {
+            str = "已取消";
+        }
+        if (value.equals("1")) {
+            str = "已提报";
+        }
+        if (value.equals("2")) {
+            str = "已确认";
+        }
+        if (value.equals("3")) {
+            str = "已出港";
+        }
+        if (value.equals("4")) {
+            str = "已签收";
+        }
+        if (value.equals("5")) {
+            str = "已完成";
+        }
+        if (value.equals("6")) {
+            str = "已锁定";
+        }
+        if (value.equals("7")) {
+            str = "变更待处理";
+        }
+        if (value.equals("8")) {
+            str = "异常待处理";
+        }
+        return str;
+    }
+}

+ 147 - 0
src/main/java/com/aoyang/tms/util/LocalDateTimeFormatUtil.java

@@ -0,0 +1,147 @@
+package com.aoyang.tms.util;
+
+/**
+ * @Description: 时间格式化工具类
+ * @Author guoyong
+ * @Date 2021/1/27 16:53
+ * @Version 1.0
+ */
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+
+public class LocalDateTimeFormatUtil extends BaseLocalDateFormatUtils {
+
+    private static final String FULL_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    private static final String YEAR_ONLY_FORMAT = "yyyy";
+    private static final String MONTH_ONLY_FORMAT = "yyyy-MM";
+    private static final String DATE_ONLY_FORMAT = "yyyy-MM-dd";
+    private static final String COMPACT_DATE_ONLY_FORMAT = "yyyyMMdd";
+    private static final String MINUTES_ONLY_FORMAT = "yyyy-MM-dd HH:mm";
+
+    private static final String DATE_COMPACTION_FULL_FORMAT = "yyyyMMddHHmmss";
+    private static final String CHINESE_DATE_ONLY_FORMAT = "yyyy年MM月dd日";
+    private static final String CHINESE_FULL_FORMAT = "yyyy年MM月dd日 HH时mm分ss秒";
+
+    private LocalDateTimeFormatUtil() {
+
+    }
+
+    /**
+     * 格式化成yyyy
+     *
+     * @param date
+     * @return
+     */
+    public static String getYearOnlyString(LocalDateTime date) {
+        return safeFormat(date, YEAR_ONLY_FORMAT);
+    }
+
+    /**
+     * 格式化成yyyy-MM
+     *
+     * @param date
+     * @return
+     */
+    public static String getMonthOnlyString(LocalDateTime date) {
+        return safeFormat(date, MONTH_ONLY_FORMAT);
+    }
+
+    /**
+     * 格式化成yyyy-MM-dd
+     *
+     * @param date
+     * @return
+     */
+    public static String getDateOnlyString(LocalDateTime date) {
+        return safeFormat(date, DATE_ONLY_FORMAT);
+    }
+
+    /**
+     * 格式化成yyyyMMdd
+     *
+     * @param date
+     * @return
+     */
+    public static String getCompactDateOnlyString(LocalDateTime date) {
+        return safeFormat(date, COMPACT_DATE_ONLY_FORMAT);
+    }
+
+    /**
+     * 格式化成yyyy-MM-dd HH:mm
+     *
+     * @param date
+     * @return
+     */
+    public static String getMinutesOnlyString(LocalDateTime date) {
+        return safeFormat(date, MINUTES_ONLY_FORMAT);
+    }
+
+    /**
+     * 格式化成yyyy-MM-dd HH:mm:ss
+     *
+     * @param date
+     * @return
+     */
+    public static String getFullString(LocalDateTime date) {
+        return safeFormat(date, FULL_FORMAT);
+    }
+
+
+    /**
+     * 格式化成yyyyMMddHHmmss
+     *
+     * @param date
+     * @return
+     */
+    public static String getCompactionFullString(LocalDateTime date) {
+        return safeFormat(date, DATE_COMPACTION_FULL_FORMAT);
+    }
+
+    /**
+     * 格式化成yyyy年MM月dd日
+     *
+     * @param date
+     * @return
+     */
+    public static String getChineseDateOnlyString(LocalDateTime date) {
+        return safeFormat(date, CHINESE_DATE_ONLY_FORMAT);
+    }
+
+    /**
+     * 格式化成yyyy年MM月dd日 HH时mm分ss秒
+     *
+     * @param date
+     * @return
+     */
+    public static String getChineseFullString(LocalDateTime date) {
+        return safeFormat(date, CHINESE_FULL_FORMAT);
+    }
+
+    private static String safeFormat(LocalDateTime localDateTime, String pattern) {
+        if (null != localDateTime) {
+            return localDateTime.format(DateTimeFormatter.ofPattern(pattern));
+        }
+        return null;
+    }
+
+    /**
+     * 格式化
+     *
+     * @param date    日期
+     * @param pattern 格式
+     * @return
+     */
+    private static String safeFormat(Date date, String pattern) {
+        if (date == null || pattern == null) {
+            return null;
+        }
+        LocalDateTime localDateTime = dateToLocalDateTime(date);
+        if (null != localDateTime) {
+            return localDateTime.format(DateTimeFormatter.ofPattern(pattern));
+        }
+        return null;
+    }
+
+}

+ 171 - 0
src/main/java/com/aoyang/tms/util/LocalDateTimeUtils.java

@@ -0,0 +1,171 @@
+package com.aoyang.tms.util;
+
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
+import java.util.Date;
+
+/**
+ * @Description: ${DESCRIPTION}
+ * @Author guoyong
+ * @Date 2021/1/25 15:57
+ * @Version 1.0
+ */
+public final class LocalDateTimeUtils {
+
+    /**
+     * 日期格式yyyy-MM-dd
+     */
+    public static String DATE_PATTERN = "yyyy-MM-dd";
+
+    /**
+     * 日期时间格式yyyy-MM-dd HH:mm:ss
+     */
+    public static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
+
+    /**
+     * 构造函数
+     */
+    private LocalDateTimeUtils() {
+        super();
+    }
+
+    /**
+     * Date转LocalDateTime
+     *
+     * @param date Date对象
+     * @return
+     */
+    public static LocalDateTime dateToLocalDateTime(Date date) {
+        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
+    }
+
+    /**
+     * LocalDateTime转换为Date
+     *
+     * @param dateTime LocalDateTime对象
+     * @return
+     */
+    public static Date localDateTimeToDate(LocalDateTime dateTime) {
+        return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    /**
+     * 格式化时间-默认yyyy-MM-dd HH:mm:ss格式
+     *
+     * @param dateTime LocalDateTime对象
+     * @return
+     */
+    public static String formatDateTime(LocalDateTime dateTime) {
+        return formatDateTime(dateTime, DATE_TIME_PATTERN);
+    }
+
+    /**
+     * 按pattern格式化时间-默认yyyy-MM-dd HH:mm:ss格式
+     *
+     * @param dateTime LocalDateTime对象
+     * @param pattern  要格式化的字符串
+     * @return
+     */
+    public static String formatDateTime(LocalDateTime dateTime, String pattern) {
+        if (dateTime == null) {
+            return null;
+        }
+        if (pattern == null || pattern.isEmpty()) {
+            pattern = DATE_TIME_PATTERN;
+        }
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
+        return dateTime.format(formatter);
+    }
+
+    /**
+     * 获取今天的00:00:00
+     *
+     * @return
+     */
+    public static String getDayStart() {
+        return getDayStart(LocalDateTime.now());
+    }
+
+    /**
+     * 获取今天的23:59:59
+     *
+     * @return
+     */
+    public static String getDayEnd() {
+        return getDayEnd(LocalDateTime.now());
+    }
+
+    /**
+     * 获取某天的00:00:00
+     *
+     * @param dateTime
+     * @return
+     */
+    public static String getDayStart(LocalDateTime dateTime) {
+        return formatDateTime(dateTime.with(LocalTime.MIN));
+    }
+
+    /**
+     * 获取某天的23:59:59
+     *
+     * @param dateTime
+     * @return
+     */
+    public static String getDayEnd(LocalDateTime dateTime) {
+        return formatDateTime(dateTime.with(LocalTime.MAX));
+    }
+
+    /**
+     * 获取本月第一天的00:00:00
+     *
+     * @return
+     */
+    public static String getFirstDayOfMonth() {
+        return getFirstDayOfMonth(LocalDateTime.now());
+    }
+
+    /**
+     * 获取本月最后一天的23:59:59
+     *
+     * @return
+     */
+    public static String getLastDayOfMonth() {
+        return getLastDayOfMonth(LocalDateTime.now());
+    }
+
+    /**
+     * 获取某月第一天的00:00:00
+     *
+     * @param dateTime LocalDateTime对象
+     * @return
+     */
+    public static String getFirstDayOfMonth(LocalDateTime dateTime) {
+        return formatDateTime(dateTime.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN));
+    }
+
+    /**
+     * 获取某月最后一天的23:59:59
+     *
+     * @param dateTime LocalDateTime对象
+     * @return
+     */
+    public static String getLastDayOfMonth(LocalDateTime dateTime) {
+        return formatDateTime(dateTime.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX));
+    }
+
+    /**
+     * 测试
+     *
+     * @param args
+     */
+    public static void main(String[] args) {
+        System.out.println(getDayStart());
+        System.out.println(getDayEnd());
+        System.out.println(getFirstDayOfMonth());
+        System.out.println(getLastDayOfMonth());
+    }
+
+}

+ 128 - 0
src/main/java/com/aoyang/tms/util/Md5SaltPassword.java

@@ -0,0 +1,128 @@
+package com.aoyang.tms.util;
+
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.lang3.StringUtils;
+
+import java.security.MessageDigest;
+import java.util.Random;
+
+/**
+ * MD5加盐算法   每个用户随机不同盐值,生成48位密码
+ * <p>
+ * 加盐,是为了防止,因数据库泄露而导致密码被破解
+ * 一般讲用户的password和salt都存在数据库中,先通
+ * 过username查询出密文,然后对md5(明文+salt)与密文对比
+ *
+ * @author Jimmy Liu
+ * @since 2020-01-27
+ */
+
+public class Md5SaltPassword {
+
+
+        public static String getPassword(String password) {
+            if (StringUtils.isNotBlank(password)) {
+                password = password.toLowerCase();
+            }
+            return Md5SaltPassword.md5Hex("JimmyLiu" + Md5SaltPassword
+                    .md5Hex(Md5SaltPassword.md5Hex(password)) + password);
+        }
+
+        /**
+         * 生成含有随机盐的密码
+         */
+        public static String generate(String password) {
+            String salt = getSalt(16);
+
+//		return md5Hex(password+salt);
+            password = md5Hex(password + salt);
+            char[] cs = new char[48];
+            for (int i = 0; i < 48; i += 3) {
+                cs[i] = password.charAt(i / 3 * 2);
+                char c = salt.charAt(i / 3);
+                cs[i + 1] = c;
+                cs[i + 2] = password.charAt(i / 3 * 2 + 1);
+            }
+            return new String(cs);
+        }
+
+        /**
+         * 生成随机盐(一般大于等于16位)
+         */
+        public static String getSalt(int len) {
+            Random r = new Random();
+            StringBuilder sb = new StringBuilder(len);
+            sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));
+            int length = sb.length();
+            if (length < len) {
+                for (int i = 0; i < len - length; i++) {
+                    sb.append("0");
+                }
+            }
+            String salt = sb.toString();
+            return salt;
+        }
+
+        /**
+         * 校验密码是否正确
+         */
+        public static boolean verify(String password, String md5) {
+            char[] cs1 = new char[32];
+            char[] cs2 = new char[16];
+            for (int i = 0; i < 48; i += 3) {
+                cs1[i / 3 * 2] = md5.charAt(i);
+                cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);
+                cs2[i / 3] = md5.charAt(i + 1);
+            }
+            String salt = new String(cs2);
+            return md5Hex(password + salt).equals(new String(cs1));
+        }
+
+        /**
+         * 获取十六进制字符串形式的MD5
+         */
+        public static String md5Hex(String src) {
+            try {
+                MessageDigest md5 = MessageDigest.getInstance("MD5");
+                byte[] bs = md5.digest(src.getBytes());
+                return new String(new Hex().encode(bs));
+            } catch (Exception e) {
+                return null;
+            }
+        }
+
+        public static String md5Small36(String str) {
+            String result = "";
+            try {
+                MessageDigest md5 = MessageDigest.getInstance("MD5");
+                md5.update((str).getBytes("UTF-8"));
+                byte b[] = md5.digest();
+
+                int i;
+                StringBuffer buf = new StringBuffer("");
+
+                for (int offset = 0; offset < b.length; offset++) {
+                    i = b[offset];
+                    if (i < 0) {
+                        i += 256;
+                    }
+                    if (i < 16) {
+                        buf.append("0");
+                    }
+                    buf.append(Integer.toHexString(i));
+                }
+                result = buf.toString();
+            } catch (Exception e) {
+                // TODO: handle exception
+            }
+            return result;
+        }
+
+        public static void main(String[] args) {
+
+           // System.out.println(getPassword("123456"));
+            String a = "12345678901";
+            String b = a.substring ( 5,11 );
+            System.out.println ( b );
+        }
+}

+ 33 - 0
src/main/java/com/aoyang/tms/util/NumberUtils.java

@@ -0,0 +1,33 @@
+package com.aoyang.tms.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * @Description: 数字验证工具类
+ * @Author guoyong
+ * @Date 2021/2/8 13:44
+ * @Version 1.0
+ */
+public class NumberUtils {
+
+    /**
+     * 是否是数字或小数
+     *
+     * @return boolean
+     * @throws
+     * @tags @return
+     * @author wanghc
+     * @date 2015-9-16 下午5:50:15
+     */
+    public static boolean isNumber(String str) {
+        if (StringUtils.isBlank(str)) {
+            return false;
+        }
+        String reg = "\\d+(\\.\\d+)?";
+        return str.matches(reg);
+    }
+
+    public static void main(String[] args) {
+        System.out.println(isNumber("200"));
+    }
+}

+ 303 - 0
src/main/java/com/aoyang/tms/util/QRCodeUtils.java

@@ -0,0 +1,303 @@
+package com.aoyang.tms.util;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
+import com.google.zxing.client.j2se.MatrixToImageConfig;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import org.apache.commons.lang.StringUtils;
+import sun.font.FontDesignMetrics;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.geom.RoundRectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Random;
+
+/**
+ * @description:
+ * @author: xumingrui
+ * @create: 2020 -01 -21 -15:02
+ */
+public class QRCodeUtils {
+    private String CHARSET = "utf-8";
+    private String FORMAT_NAME = "JPG";
+    // 二维码尺寸
+    private int QRCODE_WIDTH = 648;
+    // 二维码尺寸
+    private int QRCODE_HEIGHT = 648;
+    // LOGO宽度
+    private int WIDTH = 60;
+    // LOGO高度
+    private int HEIGHT = 60;
+
+    /**
+     * 司机端调用,返回bufferedImage
+     *
+     * @param content
+     * @return
+     * @throws WriterException
+     */
+    public BufferedImage qrCode(String content) throws WriterException {
+        //1. 生成二维码
+        BitMatrix bitMatrix = encode(content);
+        //2.将BitMatrix 转换为BufferedImage
+        BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix, new MatrixToImageConfig(Color.BLACK.getRGB(), Color.WHITE.getRGB()));
+        return bufferedImage;
+    }
+
+    /**
+     * 生成二维码
+     *
+     * @param contents 二维码内容
+     * @return 二维码的描述对象 BitMatrix
+     * @throws WriterException 编码时出错
+     */
+    private BitMatrix encode(String contents) throws WriterException {
+        final Map<EncodeHintType, Object> hints = new HashMap<>();
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
+        return new QRCodeWriter().encode(contents, BarcodeFormat.QR_CODE, QRCODE_WIDTH, QRCODE_HEIGHT, hints);
+    }
+
+
+    private BufferedImage createImage(String content, String imgPath,
+                                      boolean needCompress) throws Exception {
+        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
+        hints.put(EncodeHintType.MARGIN, 1);
+        BitMatrix bitMatrix = new MultiFormatWriter().encode(content,
+                BarcodeFormat.QR_CODE, QRCODE_WIDTH, QRCODE_HEIGHT, hints);
+        int width = bitMatrix.getWidth();
+        int height = bitMatrix.getHeight();
+        BufferedImage image = new BufferedImage(width, height,
+                BufferedImage.TYPE_INT_RGB);
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000
+                        : 0xFFFFFFFF);
+            }
+        }
+        if (imgPath == null || "".equals(imgPath)) {
+            return image;
+        }
+        // 插入图片
+        insertImage(image, imgPath, needCompress);
+        return image;
+    }
+
+    /**
+     * 插入LOGO
+     *
+     * @param source       二维码图片
+     * @param imgPath      LOGO图片地址
+     * @param needCompress 是否压缩
+     * @throws Exception
+     */
+    private void insertImage(BufferedImage source, String imgPath,
+                             boolean needCompress) throws Exception {
+        File file = new File(imgPath);
+        if (!file.exists()) {
+            System.err.println("" + imgPath + "   该文件不存在!");
+            return;
+        }
+        Image src = ImageIO.read(new File(imgPath));
+        int width = src.getWidth(null);
+        int height = src.getHeight(null);
+        if (needCompress) { // 压缩LOGO
+            if (width > WIDTH) {
+                width = WIDTH;
+            }
+            if (height > HEIGHT) {
+                height = HEIGHT;
+            }
+            Image image = src.getScaledInstance(width, height,
+                    Image.SCALE_SMOOTH);
+            BufferedImage tag = new BufferedImage(width, height,
+                    BufferedImage.TYPE_INT_RGB);
+            Graphics g = tag.getGraphics();
+            g.drawImage(image, 0, 0, null); // 绘制缩小后的图
+            g.dispose();
+            src = image;
+        }
+        // 插入LOGO
+        Graphics2D graph = source.createGraphics();
+        int x = (QRCODE_WIDTH - width) / 2;
+        int y = (QRCODE_HEIGHT - height) / 2;
+        graph.drawImage(src, x, y, width, height, null);
+        Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
+        graph.setStroke(new BasicStroke(3f));
+        graph.draw(shape);
+        graph.dispose();
+    }
+
+    /**
+     * 生成二维码(内嵌LOGO)
+     *
+     * @param content      内容
+     * @param imgPath      LOGO地址
+     * @param destPath     存放目录
+     * @param needCompress 是否压缩LOGO
+     * @throws Exception
+     */
+    public String encode(String content, String imgPath, String destPath,
+                         boolean needCompress) throws Exception {
+        BufferedImage image = createImage(content, imgPath,
+                needCompress);
+        mkdirs(destPath);
+        String file = new Random().nextInt(99999999) + ".jpg";
+        ImageIO.write(image, FORMAT_NAME, new File(destPath + "/" + file));
+        return file;
+    }
+
+    /**
+     * 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
+     *
+     * @param destPath 存放目录
+     * @date 2013-12-11 上午10:16:36
+     */
+    public void mkdirs(String destPath) {
+        File file = new File(destPath);
+        //当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
+        if (!file.exists() && !file.isDirectory()) {
+            file.mkdirs();
+        }
+    }
+
+    /**
+     * 生成二维码(内嵌LOGO)
+     *
+     * @param content  内容
+     * @param imgPath  LOGO地址
+     * @param destPath 存储地址
+     * @throws Exception
+     */
+    public void encode(String content, String imgPath, String destPath)
+            throws Exception {
+        encode(content, imgPath, destPath, false);
+    }
+
+    /**
+     * 生成二维码
+     *
+     * @param content      内容
+     * @param destPath     存储地址
+     * @param needCompress 是否压缩LOGO
+     * @throws Exception
+     */
+    public void encode(String content, String destPath,
+                       boolean needCompress) throws Exception {
+        encode(content, null, destPath, needCompress);
+    }
+
+    /**
+     * 生成二维码
+     *
+     * @param content  内容
+     * @param destPath 存储地址
+     * @throws Exception
+     */
+    public void encode(String content, String destPath) throws Exception {
+        encode(content, null, destPath, false);
+    }
+
+    /**
+     * 生成二维码(内嵌LOGO)
+     *
+     * @param content      内容
+     * @param imgPath      LOGO地址
+     * @param output       输出流
+     * @param needCompress 是否压缩LOGO
+     * @throws Exception
+     */
+    public void encode(String content, String imgPath,
+                       OutputStream output, boolean needCompress) throws Exception {
+        BufferedImage image = createImage(content, imgPath,
+                needCompress);
+        ImageIO.write(image, FORMAT_NAME, output);
+    }
+
+    /**
+     * 生成二维码
+     *
+     * @param content 内容
+     * @param output  输出流
+     * @throws Exception
+     */
+    public void encode(String content, OutputStream output)
+            throws Exception {
+        encode(content, null, output, false);
+    }
+
+
+    /**
+     * 在背景图上插入二维码图片 -- 收银员二维码使用
+     */
+    public BufferedImage backAddQr(BufferedImage backBufferedImage, BufferedImage qrImage, String content) throws IOException {
+        // BufferedImage backBufferedImage = ImageIO.read ( backImage );
+        int width = backBufferedImage.getWidth(null);
+        int height = backBufferedImage.getHeight(null);
+        // 插入LOGO
+        Graphics2D graph = backBufferedImage.createGraphics();
+        int x = (width - QRCODE_WIDTH) / 2;
+        int y = 540;
+        graph.drawImage(qrImage, x, y, QRCODE_WIDTH, QRCODE_WIDTH, null);
+
+        if (StringUtils.isNotBlank(content)) {
+            int contentSize = content.length();
+            Font font = new Font("微软雅黑", Font.PLAIN, 65);
+            graph.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);//设置抗锯齿
+            graph.setPaint(new Color(0, 0, 0, 0));//阴影颜色
+            graph.setFont(font);
+            graph.setColor(Color.white);
+            //加气站名字大于15个字,二维码上换行显示
+            if (contentSize > 15) {
+                int contentLength = getWordWidth(font, content.substring(0, 15));
+                graph.drawString(content.substring(0, 15), (width - contentLength) / 2, 1300);
+                contentLength = getWordWidth(font, content.substring(15, contentSize));
+                graph.drawString(content.substring(15, contentSize), (width - contentLength) / 2, 1400);
+            } else {
+                int contentLength = getWordWidth(font, content);
+                graph.drawString(content, (width - contentLength) / 2, 1300);
+            }
+        }
+
+        Shape shape = new RoundRectangle2D.Float(x, y, QRCODE_WIDTH, QRCODE_WIDTH, 6, 6);
+        graph.setStroke(new BasicStroke(3f));
+        graph.draw(shape);
+        graph.dispose();
+        return backBufferedImage;
+    }
+
+
+    public static int getWordWidth(Font font, String content) {
+        FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
+        int width = 0;
+        for (int i = 0; i < content.length(); i++) {
+            width += metrics.charWidth(content.charAt(i));
+        }
+        return width;
+    }
+
+    public static void main(String[] args) throws Exception {
+        QRCodeUtils utils = new QRCodeUtils();
+        BufferedImage qrBuffered = utils.qrCode("内容");
+        System.out.println(qrBuffered.getWidth() + "," + qrBuffered.getHeight());
+        // BufferedImage finalImage = utils.backAddQr("/Users/xumingrui/Desktop/sback.png",qrBuffered,"");
+        File file = new File("/Users/xumingrui/Desktop/1.jpg");
+        //ImageIO.write(finalImage, "jpg", file);
+    }
+
+
+}

+ 159 - 0
src/main/java/com/aoyang/tms/util/ReadExcelTools.java

@@ -0,0 +1,159 @@
+package com.aoyang.tms.util;
+
+
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @Description: 读取excel工具栏
+ * @Author guoyong
+ * @Date 2020/10/17 9:03
+ * @Version 1.0
+ */
+@Slf4j
+public class ReadExcelTools {
+    private final static String xls = "xls";
+    private final static String xlsx = "xlsx";
+
+    /**
+     * 读入excel文件,解析后返回
+     *
+     * @param file
+     * @throws IOException
+     */
+    public static List<String[]> readExcel(MultipartFile file) throws IOException {
+        //检查文件
+        checkFile(file);
+        //获得Workbook工作薄对象
+        Workbook workbook = getWorkBook(file);
+        //创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回
+        List<String[]> list = new ArrayList<String[]>();
+        if (workbook != null) {
+            for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
+                //获得当前sheet工作表
+                Sheet sheet = workbook.getSheetAt(sheetNum);
+                if (sheet == null) {
+                    continue;
+                }
+                //获得当前sheet的开始行
+                int firstRowNum = sheet.getFirstRowNum();
+                //获得当前sheet的结束行
+                int lastRowNum = sheet.getLastRowNum();
+                //循环除了第一行的所有行
+                for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++) { //为了过滤到第一行因为我的第一行是数据库的列
+                    //获得当前行
+                    Row row = sheet.getRow(rowNum);
+                    if (row == null) {
+                        continue;
+                    }
+                    //获得当前行的开始列
+                    int firstCellNum = row.getFirstCellNum();
+                    //获得当前行的列数
+                    int lastCellNum = row.getLastCellNum();//为空列获取
+//                    int lastCellNum = row.getPhysicalNumberOfCells();//为空列不获取
+//                    String[] cells = new String[row.getPhysicalNumberOfCells()];
+                    String[] cells = new String[row.getLastCellNum()];
+                    //循环当前行
+                    for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
+                        Cell cell = row.getCell(cellNum);
+                        cells[cellNum] = getCellValue(cell);
+                    }
+                    list.add(cells);
+                }
+            }
+        }
+        log.info(JSON.toJSONString(file));
+        return list;
+    }
+
+    public static void checkFile(MultipartFile file) throws IOException {
+        //判断文件是否存在
+        if (null == file) {
+            throw new FileNotFoundException("文件不存在!");
+        }
+        //获得文件名
+        String fileName = file.getOriginalFilename();
+        //判断文件是否是excel文件
+        if (!fileName.endsWith(xls) && !fileName.endsWith(xlsx)) {
+            throw new IOException(fileName + "不是excel文件");
+        }
+    }
+
+    public static Workbook getWorkBook(MultipartFile file) {
+        //获得文件名
+        String fileName = file.getOriginalFilename();
+        //创建Workbook工作薄对象,表示整个excel
+        Workbook workbook = null;
+        try {
+            //获取excel文件的io流
+            InputStream is = file.getInputStream();
+            //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
+            if (fileName.endsWith(xls)) {
+                //2003
+                workbook = new HSSFWorkbook(is);
+            } else if (fileName.endsWith(xlsx)) {
+                //2007
+                workbook = new XSSFWorkbook(is);
+            }
+        } catch (IOException e) {
+            log.error("getWorkBook " + e.getMessage() + ":{}", e);
+        }
+        return workbook;
+    }
+
+    public static String getCellValue(Cell cell) {
+        if (cell == null) {
+            return "";
+        }
+        if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
+            return cell.getStringCellValue();
+        } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
+            return String.valueOf(cell.getBooleanCellValue());
+        } else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
+            return cell.getCellFormula();
+        } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
+            short format = cell.getCellStyle().getDataFormat();
+            System.out.println("format:"+format+";;;;;value:"+cell.getNumericCellValue());
+            SimpleDateFormat sdf = null;
+            if (format == 14 || format == 31 || format == 57 || format == 58
+                    || (176<=format && format<=178) || (182<=format && format<=196)
+                    || (210<=format && format<=213) || (208==format ) ) { // 日期
+                sdf = new SimpleDateFormat("yyyy-MM-dd");
+            } else if (format == 20 || format == 32 || format==183 || (200<=format && format<=209) ) { // 时间
+                sdf = new SimpleDateFormat("HH:mm");
+            } else { // 不是日期格式
+                return String.valueOf(cell.getNumericCellValue());
+            }
+            double value = cell.getNumericCellValue();
+            Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);
+            if(date==null || "".equals(date)){
+                return "";
+            }
+            String result="";
+            try {
+                result = sdf.format(date);
+            } catch (Exception e) {
+                e.printStackTrace();
+                return "";
+            }
+            return result;
+        }
+        return "";
+    }
+}

+ 41 - 0
src/main/java/com/aoyang/tms/util/RequestInfoUtil.java

@@ -0,0 +1,41 @@
+package com.aoyang.tms.util;
+
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.aoyang.tms.entity.RequestInfo;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author xumingrui
+ * @since 2021/4/28 9:46
+ * @comment <接收从geteway 传过来的header值>
+ */
+@Slf4j
+public class RequestInfoUtil {
+    public RequestInfo getRequestInfo() {
+        HttpServletRequest request =
+            ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
+        Enumeration paramNames = request.getHeaderNames();
+        Map<String, String> map = new HashMap<String, String>();
+        while (paramNames.hasMoreElements()) {
+            String key = (String)paramNames.nextElement();
+            String value = request.getHeader(key);
+            map.put(key, value);
+        }
+        JSONObject jsonObject = JSON.parseObject(JSONObject.toJSONString(map));
+        // log.info("map->json:{}", jsonObject);
+        RequestInfo requestInfo = JSONObject.toJavaObject(jsonObject, RequestInfo.class);
+        // log.info("json->requestInfo:{}", requestInfo);
+        return requestInfo;
+    }
+}

+ 84 - 0
src/main/java/com/aoyang/tms/util/Result.java

@@ -0,0 +1,84 @@
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by Fernflower decompiler)
+//
+
+package com.aoyang.tms.util;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("返回值")
+@JsonInclude(Include.NON_NULL)
+public class Result<T>  {
+    @ApiModelProperty(
+        value = "返回码",
+        example = "0 : 成功 1000: 未鉴权 2000:参数错误 3000:服务器错误"
+    )
+    private int code;
+    @ApiModelProperty(
+        value = "返回信息",
+        example = "成功"
+    )
+    private String message;
+    @ApiModelProperty(
+        value = "返回数据",
+        example = "详见每个接口"
+    )
+    private T data;
+
+    public Result() {
+    }
+
+    public Result(T data) {
+        this.code = 0;
+        this.message = "成功!";
+        this.data = data;
+    }
+
+    public Result(ErrCodeEnum enumCode){
+        this.code= enumCode.getCode();
+        this.message = enumCode.getMessage();
+    }
+
+    public Result(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    public int getCode() {
+        return this.code;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+
+    public T getData() {
+        return this.data;
+    }
+
+    public String toString() {
+        return "Result(code=" + this.getCode() + ", message=" + this.getMessage() + ", data=" + this.getData() + ")";
+    }
+
+    public Result(int code, String message, T data) {
+        this.code = code;
+        this.message = message;
+        this.data = data;
+    }
+}

+ 143 - 0
src/main/java/com/aoyang/tms/util/ValidList.java

@@ -0,0 +1,143 @@
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+import javax.validation.Valid;
+
+public class ValidList<E> implements List<E> {
+    @Valid
+    private List<E> list;
+
+    public ValidList() {
+        this.list = new ArrayList<>();
+    }
+
+    public ValidList(List<E> list) {
+        this.list = list;
+    }
+
+    public List<E> getList() {
+        return list;
+    }
+
+    public void setList(List<E> list) {
+        this.list = list;
+    }
+
+    @Override
+    public int size() {
+        return list.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return list.isEmpty();
+    }
+
+    @Override
+    public boolean contains(Object o) {
+        return list.contains(o);
+    }
+
+    @Override
+    public Iterator<E> iterator() {
+        return list.iterator();
+    }
+
+    @Override
+    public Object[] toArray() {
+        return list.toArray();
+    }
+
+    @Override
+    public <T> T[] toArray(T[] a) {
+        return list.toArray(a);
+    }
+
+    @Override
+    public boolean add(E e) {
+        return list.add(e);
+    }
+
+    @Override
+    public boolean remove(Object o) {
+        return list.remove(o);
+    }
+
+    @Override
+    public boolean containsAll(Collection<?> c) {
+        return list.containsAll(c);
+    }
+
+    @Override
+    public boolean addAll(Collection<? extends E> c) {
+        return list.addAll(c);
+    }
+
+    @Override
+    public boolean addAll(int index, Collection<? extends E> c) {
+        return list.addAll(index, c);
+    }
+
+    @Override
+    public boolean removeAll(Collection<?> c) {
+        return list.removeAll(c);
+    }
+
+    @Override
+    public boolean retainAll(Collection<?> c) {
+        return list.retainAll(c);
+    }
+
+    @Override
+    public void clear() {
+        list.clear();
+    }
+
+    @Override
+    public E get(int index) {
+        return list.get(index);
+    }
+
+    @Override
+    public E set(int index, E element) {
+        return list.set(index, element);
+    }
+
+    @Override
+    public void add(int index, E element) {
+        list.add(index, element);
+    }
+
+    @Override
+    public E remove(int index) {
+        return list.remove(index);
+    }
+
+    @Override
+    public int indexOf(Object o) {
+        return list.indexOf(o);
+    }
+
+    @Override
+    public int lastIndexOf(Object o) {
+        return list.lastIndexOf(o);
+    }
+
+    @Override
+    public ListIterator<E> listIterator() {
+        return list.listIterator();
+    }
+
+    @Override
+    public ListIterator<E> listIterator(int index) {
+        return list.listIterator(index);
+    }
+
+    @Override
+    public List<E> subList(int fromIndex, int toIndex) {
+        return list.subList(fromIndex, toIndex);
+    }
+}

+ 8 - 0
src/main/java/com/aoyang/tms/util/validUtil/Group.java

@@ -0,0 +1,8 @@
+package com.aoyang.tms.util.validUtil;
+
+import javax.validation.GroupSequence;
+
+@GroupSequence({Insert.class, Update.class})
+public interface Group {
+
+}

+ 5 - 0
src/main/java/com/aoyang/tms/util/validUtil/Insert.java

@@ -0,0 +1,5 @@
+package com.aoyang.tms.util.validUtil;
+
+public interface Insert {
+
+}

+ 5 - 0
src/main/java/com/aoyang/tms/util/validUtil/Query.java

@@ -0,0 +1,5 @@
+package com.aoyang.tms.util.validUtil;
+
+public interface Query {
+
+}

+ 5 - 0
src/main/java/com/aoyang/tms/util/validUtil/Update.java

@@ -0,0 +1,5 @@
+package com.aoyang.tms.util.validUtil;
+
+public interface Update {
+
+}

+ 59 - 0
src/main/profiles/dev/bootstrap.yml

@@ -0,0 +1,59 @@
+server:
+  port: 8806
+nacos:
+  server-addr: 172.31.58.54:8848
+  username: auyen
+  password: xqkj@ayzl
+  namespace: 14b1b522-6b34-4921-83dd-a2f7e9833f19
+  group: dev
+spring:
+  application:
+    name: tms
+  datasource:
+    url: jdbc:mysql://172.31.58.45:3306/strategy?characterEncoding=utf8&serverTimezone=Asia/Shanghai&connectTimeout=6000&socketTimeout=6000&autoReconnect=true
+  cloud:
+    nacos:
+      server-addr: ${nacos.server-addr}
+      username: ${nacos.username}
+      password: ${nacos.password}
+      discovery:
+        namespace: ${nacos.namespace}
+        group: ${nacos.group}
+      config:
+        file-extension: yml
+        namespace: ${nacos.namespace}
+        group: ${nacos.group}
+        shared-configs[0]:
+          data-id: common.yml
+          group: ${nacos.group}
+          refresh: true
+  redis:
+    host: 172.31.58.45
+    port: 6379
+    password: xqkj@ayzl
+  rabbitmq:
+    host: 172.31.58.45
+    port: 5672
+    username: admin
+    password: xqkj@ayzl
+xxl:
+  job:
+    accessToken:
+    admin:
+      addresses: http://172.31.58.54:8080/xxl-job-admin
+    executor:
+      appname: price-release-executor
+      address:
+      ip:
+      port: 9999
+      logpath: ./logs
+      logretentiondays: 7
+combination:
+  org:
+    limit:
+      balance: 2000
+      bottom: 1.0
+      top: 10.0
+auyen:
+  default-org-id: 720211180626919424
+  marketing-org-id: 700214075283881984

+ 155 - 0
src/main/profiles/dev/logback-spring.xml

@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <contextName>logback</contextName>
+    <!--控制台输出 -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+        </encoder>
+    </appender>
+
+
+    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 设置日志不超过${logMaxSize}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
+        <file>logs/debug.log</file>
+        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>debug/log-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <!-- 当天的日志大小 超过${logMaxSize}时,压缩日志并保存 -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>50MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 日志输出的文件的格式  -->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>DEBUG</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>DEBUG</level>
+        </filter>
+    </appender>
+
+
+    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>logs/info.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>logs/info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>50MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>logs/error.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>logs/error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>50MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--配置邮箱发送错误日志-->
+    <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
+        <!--服务器地址-->
+        <smtpHost>smtp.qq.com</smtpHost>
+        <!--端口(默认为465)-->
+        <smtpPort>465</smtpPort>
+        <!--用户名-->
+        <username>76534267@qq.com</username>
+        <!--smtp授权码-->
+        <password>ldgpfimjvnfhbjje</password>
+        <!--是否开启SSL安全-->
+        <SSL>true</SSL>
+        <!--是否异步发送-->
+        <asynchronousSending>true</asynchronousSending>
+        <!--发送者-->
+        <from>76534267@qq.com</from>
+        <!--接收者-->
+        <to>76534267@qq.com,378455237@qq.com,451101027@qq.com,66723611@qq.com,1002541887@qq.com</to>
+        <!--邮件主题-->
+        <subject>【策略中心异常报警】【开发环境】%logger</subject>
+        <!--编码-->
+        <charsetEncoding>UTF-8</charsetEncoding>
+
+        <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
+            <!-- 每个电子邮件只发送一个日志条目 -->
+            <bufferSize>1</bufferSize>
+        </cyclicBufferTracker>
+
+        <!--HTML展示-->
+        <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <!--错误级别(只会提示大于该级别的错误)-->
+            <level>ERROR</level>
+        </filter>
+    </appender>
+
+    <!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName,下面还有另一种写法,就是涉及到name="关键包的日志输出级别" -->
+    <!--     <logger name="com.lin" additivity="false">   -->
+    <!--         <level value="debug" />   -->
+    <!--         <appender-ref ref="stdout" />   -->
+    <!--         <appender-ref ref="file" />   -->
+    <!--     </logger>   -->
+    <appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
+        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
+            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
+                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
+            </layout>
+        </encoder>
+    </appender>
+    <logger name="jdbc" level="INFO"/>
+    <logger name="org" level="INFO"/>
+    <logger name="net" level="INFO"/>
+    <logger name="sql" level="INFO"/>
+    <logger name="java.sql" level="INFO"/>
+    <logger name="javax" level="INFO"/>
+    <!--打印sql-->
+    <logger name="com.aoyang.tms.mapper" level="debug" />
+    <!--nacos心跳日志级别设置 -->
+    <logger name="com.alibaba.nacos" level="warn" />
+    <!--skywalking grpc日志级别设置-->
+    <logger name="org.apache.skywalking.apm.dependencies" level="warn" />
+
+
+    <!--日志的输出级别由低到高(越来问题越严重)trace->debug->info->warn->error -->
+    <!-- root将级别为DEBUG及大于DEBUG的日志信息交给已经配置好的name='STDOUT'的appender处理,将信息打印到控制台-Console -->
+    <root level="DEBUG">
+        <!-- appender-ref标识这个appender将会添加到本应用的日志系统中 -->
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="INFO"/>
+        <appender-ref ref="DEBUG"/>
+        <appender-ref ref="ERROR"/>
+        <appender-ref ref="EMAIL"/>
+        <appender-ref ref="grpc-log" />
+    </root>
+</configuration>

+ 67 - 0
src/main/profiles/local/bootstrap.yml

@@ -0,0 +1,67 @@
+server:
+  port: 8806
+nacos:
+  server-addr: 127.0.0.1:8848
+  username: nacos
+  password: nacos
+  namespace: 41b1a8c1-42b7-4830-8dad-90616c446a25
+  group: local
+spring:
+  application:
+    name: strategy
+  datasource:
+    type: com.mysql.cj.jdbc.MysqlDataSource
+    url: jdbc:mysql://dev.auyen.com:3306/strategy?characterEncoding=utf8&serverTimezone=Asia/Shanghai&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
+    username: zhuangxueli
+    password: zhuangxueli123
+  cloud:
+    nacos:
+      server-addr: ${nacos.server-addr}
+      username: ${nacos.username}
+      password: ${nacos.password}
+      discovery:
+        namespace: ${nacos.namespace}
+        group: ${nacos.group}
+      config:
+        file-extension: yml
+        namespace: ${nacos.namespace}
+        group: ${nacos.group}
+  redis:
+    host: 127.0.0.1
+    port: 6379
+    password: 123456
+  rabbitmq:
+    host: 127.0.0.1
+    port: 5672
+    username: guest
+    password: guest
+
+feign:
+  sentinel:
+    enabled: true
+ribbon:
+  ConnectTimeout: 10000
+  ReadTimeout: 10000
+swagger2:
+  enable: true
+xxl:
+  job:
+    accessToken:
+    admin:
+      addresses: http://127.0.0.1:8088/xxl-job-admin
+    executor:
+      appname: price-release-executor
+      address:
+      ip:
+      port: 9999
+      logpath: ./logs
+      logretentiondays: 7
+combination:
+  org:
+    limit:
+      balance: 2000
+      bottom: 1.0
+      top: 10.0
+auyen:
+  default-org-id: 720211180626919424
+  marketing-org-id: 700214075283881984

+ 104 - 0
src/main/profiles/local/logback-spring.xml

@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <contextName>logback</contextName>
+    <!--控制台输出 -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+        </encoder>
+    </appender>
+
+
+    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 设置日志不超过${logMaxSize}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
+        <file>logs/debug.log</file>
+        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>debug/log-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <!-- 当天的日志大小 超过${logMaxSize}时,压缩日志并保存 -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>50MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 日志输出的文件的格式  -->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>DEBUG</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>DEBUG</level>
+        </filter>
+    </appender>
+
+
+    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>logs/info.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>logs/info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>50MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>logs/error.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>logs/error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>50MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName,下面还有另一种写法,就是涉及到name="关键包的日志输出级别" -->
+    <!--     <logger name="com.lin" additivity="false">   -->
+    <!--         <level value="debug" />   -->
+    <!--         <appender-ref ref="stdout" />   -->
+    <!--         <appender-ref ref="file" />   -->
+    <!--     </logger>   -->
+    <logger name="jdbc" level="debug"/>
+    <logger name="org" level="error"/>
+    <logger name="net" level="error"/>
+    <logger name="sql" level="debug"/>
+    <logger name="java.sql" level="debug"/>
+    <logger name="javax" level="debug"/>
+    <!--打印sql-->
+    <logger name="com.aoyang.tms.mapper" level="debug"/>
+    <!--日志的输出级别由低到高(越来问题越严重)trace->debug->info->warn->error -->
+    <!-- root将级别为DEBUG及大于DEBUG的日志信息交给已经配置好的name='STDOUT'的appender处理,将信息打印到控制台-Console -->
+    <root level="INFO">
+        <!-- appender-ref标识这个appender将会添加到本应用的日志系统中 -->
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="INFO"/>
+        <appender-ref ref="DEBUG"/>
+        <appender-ref ref="ERROR"/>
+    </root>
+</configuration>

+ 59 - 0
src/main/profiles/prod/bootstrap.yml

@@ -0,0 +1,59 @@
+server:
+  port: 8806
+nacos:
+  server-addr: 172.31.58.48:8848
+  username: auyen
+  password: xqkj@ayzl
+  namespace: ba75d08b-28b4-4c55-902c-7e91b6b8a2dd
+  group: prod
+spring:
+  application:
+    name: strategy
+  datasource:
+    url: jdbc:mysql://172.31.58.52:3306/strategy?characterEncoding=utf8&serverTimezone=Asia/Shanghai&connectTimeout=6000&socketTimeout=6000&autoReconnect=true
+  cloud:
+    nacos:
+      server-addr: ${nacos.server-addr}
+      username: ${nacos.username}
+      password: ${nacos.password}
+      discovery:
+        namespace: ${nacos.namespace}
+        group: ${nacos.group}
+      config:
+        file-extension: yml
+        namespace: ${nacos.namespace}
+        group: ${nacos.group}
+        shared-configs[0]:
+          data-id: common.yml
+          group: ${nacos.group}
+          refresh: true
+  redis:
+    host: 172.31.58.55
+    port: 6379
+    password: xqkj@ayzl
+  rabbitmq:
+    host: 172.31.58.56
+    port: 5672
+    username: admin
+    password: xqkj@ayzl
+xxl:
+  job:
+    accessToken:
+    admin:
+      addresses: http://172.31.58.51:8080/xxl-job-admin
+    executor:
+      appname: price-release-executor
+      address:
+      ip:
+      port: 9999
+      logpath: ./logs
+      logretentiondays: 7
+combination:
+  org:
+    limit:
+      balance: 2000
+      bottom: 1.0
+      top: 10.0
+auyen:
+  default-org-id: 720211450832371712
+  marketing-org-id: 700214080073809920

+ 117 - 0
src/main/profiles/prod/logback-spring.xml

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <contextName>logback</contextName>
+    <!--控制台输出 -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+        </encoder>
+    </appender>
+
+
+    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 设置日志不超过${logMaxSize}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
+        <file>logs/debug.log</file>
+        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>debug/log-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <!-- 当天的日志大小 超过${logMaxSize}时,压缩日志并保存 -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>50MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 日志输出的文件的格式  -->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>DEBUG</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>DEBUG</level>
+        </filter>
+    </appender>
+
+
+    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>logs/info.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>logs/info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>50MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>logs/error.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>logs/error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>50MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+    <!-- skywalking日志收集 -->
+    <appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
+        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
+            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
+                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
+            </layout>
+        </encoder>
+    </appender>
+    <!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName,下面还有另一种写法,就是涉及到name="关键包的日志输出级别" -->
+    <!--     <logger name="com.lin" additivity="false">   -->
+    <!--         <level value="debug" />   -->
+    <!--         <appender-ref ref="stdout" />   -->
+    <!--         <appender-ref ref="file" />   -->
+    <!--     </logger>   -->
+    <logger name="jdbc" level="INFO"/>
+    <logger name="org" level="INFO"/>
+    <logger name="net" level="INFO"/>
+    <logger name="sql" level="INFO"/>
+    <logger name="java.sql" level="INFO"/>
+    <logger name="javax" level="INFO"/>
+    <!--打印sql-->
+    <logger name="com.aoyang.tms.mapper" level="DEBUG"/>
+    <!--nacos心跳日志级别设置 -->
+    <logger name="com.alibaba.nacos" level="WARN"/>
+    <!--skywalking grpc日志级别设置-->
+    <logger name="org.apache.skywalking.apm.dependencies" level="WARN"/>
+
+    <!--日志的输出级别由低到高(越来问题越严重)trace->debug->info->warn->error -->
+    <!-- root将级别为DEBUG及大于DEBUG的日志信息交给已经配置好的name='STDOUT'的appender处理,将信息打印到控制台-Console -->
+    <root level="INFO">
+        <!-- appender-ref标识这个appender将会添加到本应用的日志系统中 -->
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="INFO"/>
+        <appender-ref ref="DEBUG"/>
+        <appender-ref ref="ERROR"/>
+        <appender-ref ref="grpc-log"/>
+    </root>
+</configuration>

+ 60 - 0
src/main/profiles/test/bootstrap.yml

@@ -0,0 +1,60 @@
+server:
+  port: 8806
+nacos:
+  server-addr: 172.31.58.42:8848
+  username: auyen
+  password: xqkj@ayzl
+  namespace: fc890e45-ee88-4760-b37b-39f8187bd971
+  group: test
+spring:
+  application:
+    name: strategy
+  datasource:
+    url: jdbc:mysql://172.31.58.46:3306/strategy?characterEncoding=utf8&serverTimezone=Asia/Shanghai&connectTimeout=6000&socketTimeout=6000&autoReconnect=true
+  cloud:
+    nacos:
+      server-addr: ${nacos.server-addr}
+      username: ${nacos.username}
+      password: ${nacos.password}
+      discovery:
+        namespace: ${nacos.namespace}
+        group: ${nacos.group}
+      config:
+        file-extension: yml
+        namespace: ${nacos.namespace}
+        group: ${nacos.group}
+        shared-configs[0]:
+          data-id: common.yml
+          group: ${nacos.group}
+          refresh: true
+  redis:
+    host: 172.31.58.46
+    port: 6379
+    password: xqkj@ayzl
+  rabbitmq:
+    host: 172.31.58.46
+    port: 5672
+    username: admin
+    password: xqkj@ayzl
+
+xxl:
+  job:
+    accessToken:
+    admin:
+      addresses: http://172.31.58.42:8080/xxl-job-admin
+    executor:
+      appname: price-release-executor
+      address:
+      ip:
+      port: 9999
+      logpath: ./logs
+      logretentiondays: 7
+combination:
+  org:
+    limit:
+      balance: 2000
+      bottom: 1.0
+      top: 10.0
+auyen:
+  default-org-id: 720211478929997824
+  marketing-org-id: 700214071680958464

+ 154 - 0
src/main/profiles/test/logback-spring.xml

@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <contextName>logback</contextName>
+    <!--控制台输出 -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+        </encoder>
+    </appender>
+
+
+    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 设置日志不超过${logMaxSize}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
+        <file>logs/debug.log</file>
+        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>debug/log-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <!-- 当天的日志大小 超过${logMaxSize}时,压缩日志并保存 -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>50MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 日志输出的文件的格式  -->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>DEBUG</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>DEBUG</level>
+        </filter>
+    </appender>
+
+
+    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>logs/info.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>logs/info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>50MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>logs/error.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>logs/error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>50MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--配置邮箱发送错误日志-->
+    <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
+        <!--服务器地址-->
+        <smtpHost>smtp.qq.com</smtpHost>
+        <!--端口(默认为465)-->
+        <smtpPort>465</smtpPort>
+        <!--用户名-->
+        <username>76534267@qq.com</username>
+        <!--smtp授权码-->
+        <password>ldgpfimjvnfhbjje</password>
+        <!--是否开启SSL安全-->
+        <SSL>true</SSL>
+        <!--是否异步发送-->
+        <asynchronousSending>true</asynchronousSending>
+        <!--发送者-->
+        <from>76534267@qq.com</from>
+        <!--接收者-->
+        <to>76534267@qq.com,378455237@qq.com,451101027@qq.com,66723611@qq.com,1002541887@qq.com,215791291@qq.com</to>
+        <!--邮件主题-->
+        <subject>【策略中心异常报警】【测试环境】%logger</subject>
+        <!--编码-->
+        <charsetEncoding>UTF-8</charsetEncoding>
+
+        <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
+            <!-- 每个电子邮件只发送一个日志条目 -->
+            <bufferSize>1</bufferSize>
+        </cyclicBufferTracker>
+
+        <!--HTML展示-->
+        <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <!--错误级别(只会提示大于该级别的错误)-->
+            <level>ERROR</level>
+        </filter>
+    </appender>
+
+    <!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName,下面还有另一种写法,就是涉及到name="关键包的日志输出级别" -->
+    <!--     <logger name="com.lin" additivity="false">   -->
+    <!--         <level value="debug" />   -->
+    <!--         <appender-ref ref="stdout" />   -->
+    <!--         <appender-ref ref="file" />   -->
+    <!--     </logger>   -->
+    <logger name="jdbc" level="debug"/>
+    <logger name="org" level="INFO"/>
+    <logger name="net" level="INFO"/>
+    <logger name="sql" level="debug"/>
+    <logger name="java.sql" level="debug"/>
+    <logger name="javax" level="INFO"/>
+    <!--打印sql-->
+    <logger name="com.aoyang.tms.mapper" level="debug" />
+    <!--nacos心跳日志级别设置 -->
+    <logger name="com.alibaba.nacos" level="WARN" />
+    <!--skywalking grpc日志级别设置-->
+    <logger name="org.apache.skywalking.apm.dependencies" level="WARN" />
+    <!-- skywalking日志收集 -->
+    <appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
+        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
+            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
+                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
+            </layout>
+        </encoder>
+    </appender>
+    <!--日志的输出级别由低到高(越来问题越严重)trace->debug->info->warn->error -->
+    <!-- root将级别为DEBUG及大于DEBUG的日志信息交给已经配置好的name='STDOUT'的appender处理,将信息打印到控制台-Console -->
+    <root level="debug">
+        <!-- appender-ref标识这个appender将会添加到本应用的日志系统中 -->
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="INFO"/>
+        <appender-ref ref="DEBUG"/>
+        <appender-ref ref="ERROR"/>
+        <appender-ref ref="EMAIL"/>
+        <appender-ref ref="grpc-log"/>
+    </root>
+</configuration>

+ 39 - 0
src/main/resources/application.yml

@@ -0,0 +1,39 @@
+mybatis-plus:
+  # 如果是放在resource目录 classpath:/mapper/*Mapper.xml
+  mapper-locations: classpath:/mapper/*Mapper.xml
+  #实体扫描,多个package用逗号或者分号分隔
+  typeAliasesPackage: com.aoyang.strategy.entity
+  global-config:
+    db-config:
+      #主键类型  AUTO:"数据库ID自增", INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
+      id-type: AUTO
+      #mp2.3+ 全局表前缀 mp_
+      #table-prefix: mp_
+      #刷新mapper 调试神器
+      #refresh-mapper: true
+      #数据库大写下划线转换
+      #capital-mode: true
+      #逻辑删除配置(下面3个配置)
+      logic-delete-value: 1
+      logic-not-delete-value: 0
+  configuration:
+    #配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
+    map-underscore-to-camel-case: true
+    cache-enabled: false
+    #配置JdbcTypeForNull, oracle数据库必须配置
+    jdbc-type-for-null: 'null'
+
+### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
+### xxl-job, access token
+#xxl:job.accessToken=
+### xxl-job executor appname
+#xxl:job.executor.appname=xxl-job-executor-sample
+### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
+#xxl.job.executor.address=
+### xxl-job executor server-info
+#xxl.job.executor.ip=
+#xxl.job.executor.port=9999
+### xxl-job executor log-path
+#xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
+### xxl-job executor log-retention-days
+#xxl.job.executor.logretentiondays=30

二進制
src/main/resources/exceltpl/Lng_tpl.xlsx


二進制
src/main/resources/exceltpl/download_stock_log_tpl.xlsx


二進制
src/main/resources/exceltpl/stock_log_list_tpl.xlsx


+ 0 - 0
src/main/resources/exceltpl/store_list_tpl.xlsx


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