Переглянути джерело

Merge branch 'mp-server-test' into 'master'

Mp server test

See merge request quanshu/mp-server!187
zhong chunping 3 роки тому
батько
коміт
d4b4c80ce5
100 змінених файлів з 7804 додано та 711 видалено
  1. 107 78
      mp-admin/.factorypath
  2. 1 0
      mp-admin/.gitignore
  3. 9 9
      mp-admin/pom.xml
  4. 8 22
      mp-admin/src/main/java/com/qs/mp/handler/auth/SignInterceptor.java
  5. 4 4
      mp-admin/src/main/java/com/qs/mp/handler/auth/SignUtils.java
  6. 107 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/AreaMgrController.java
  7. 337 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelMgrController.java
  8. 103 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java
  9. 310 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponMgrController.java
  10. 279 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsMgrController.java
  11. 285 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java
  12. 353 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  13. 212 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserDeliverOrderMgrController.java
  14. 3 3
      mp-admin/src/main/java/com/qs/mp/web/controller/api/callback/PayCallBackController.java
  15. 598 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelController.java
  16. 100 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelInviteController.java
  17. 70 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelMoneyController.java
  18. 160 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelWithdrawController.java
  19. 96 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelCartController.java
  20. 231 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java
  21. 81 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelTicketController.java
  22. 43 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/common/AreaQueryController.java
  23. 122 27
      mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java
  24. 1 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/sms/SmsController.java
  25. 157 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserAddrController.java
  26. 200 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java
  27. 124 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserExchangeController.java
  28. 140 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserMineController.java
  29. 213 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java
  30. 195 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java
  31. 1 1
      mp-admin/src/main/java/com/qs/mp/web/controller/common/FileDownloadController.java
  32. 4 9
      mp-admin/src/main/java/com/qs/mp/web/controller/common/FileUploadController.java
  33. 60 0
      mp-admin/src/main/java/com/qs/mp/web/controller/common/WxServerController.java
  34. 16 10
      mp-admin/src/main/java/com/qs/mp/web/controller/system/SysLoginController.java
  35. 16 21
      mp-admin/src/main/java/com/qs/mp/web/controller/system/SysProfileController.java
  36. 7 10
      mp-admin/src/main/resources/application-8100.yml
  37. 7 10
      mp-admin/src/main/resources/application-8200.yml
  38. 22 17
      mp-admin/src/main/resources/application-dev.yml
  39. 19 13
      mp-admin/src/main/resources/application-test.yml
  40. 35 13
      mp-admin/src/main/resources/application.yml
  41. 1 1
      mp-admin/src/main/resources/logback-spring.xml
  42. 338 0
      mp-admin/src/test/java/com/qs/mp/api/ChannelControllerTest.java
  43. 24 0
      mp-admin/src/test/java/com/qs/mp/api/UserControllerTest.java
  44. 69 0
      mp-admin/src/test/java/com/qs/mp/common/BaseControllerTest.java
  45. 71 0
      mp-admin/src/test/java/com/qs/mp/service/ChannelServiceTest.java
  46. 77 0
      mp-admin/src/test/java/com/qs/mp/service/ServiceImplTest.java
  47. 82 56
      mp-common/.factorypath
  48. 40 10
      mp-common/pom.xml
  49. 35 0
      mp-common/src/main/java/com/qs/mp/common/config/OrikaConfig.java
  50. 6 1
      mp-common/src/main/java/com/qs/mp/common/constant/Constants.java
  51. 35 29
      mp-common/src/main/java/com/qs/mp/common/core/domain/AjaxResult.java
  52. 9 0
      mp-common/src/main/java/com/qs/mp/common/core/redis/RedisCache.java
  53. 42 0
      mp-common/src/main/java/com/qs/mp/common/enums/BizTypeEnum.java
  54. 43 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelCertifyStatusEnum.java
  55. 51 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelMoneyEnum.java
  56. 45 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelOrderStatusEnum.java
  57. 43 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelRoleEnum.java
  58. 42 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelStatusEnum.java
  59. 44 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelVerifyStatusEnum.java
  60. 54 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelWithdrawStatusEnum.java
  61. 49 0
      mp-common/src/main/java/com/qs/mp/common/enums/CoinLogTypeEnum.java
  62. 43 0
      mp-common/src/main/java/com/qs/mp/common/enums/CommStatusEnum.java
  63. 42 0
      mp-common/src/main/java/com/qs/mp/common/enums/CouponDiscountTypeEnum.java
  64. 41 0
      mp-common/src/main/java/com/qs/mp/common/enums/CouponDistributeTypeEnum.java
  65. 44 0
      mp-common/src/main/java/com/qs/mp/common/enums/CouponStatusEnum.java
  66. 43 0
      mp-common/src/main/java/com/qs/mp/common/enums/CouponTypeEnum.java
  67. 42 0
      mp-common/src/main/java/com/qs/mp/common/enums/CouponUseAreaEnum.java
  68. 49 0
      mp-common/src/main/java/com/qs/mp/common/enums/DeliverOrderStatusEnum.java
  69. 6 1
      mp-common/src/main/java/com/qs/mp/common/enums/ErrorCodeEnum.java
  70. 53 0
      mp-common/src/main/java/com/qs/mp/common/enums/GoodsStatusEnum.java
  71. 28 0
      mp-common/src/main/java/com/qs/mp/common/enums/MqTopicType.java
  72. 6 4
      mp-common/src/main/java/com/qs/mp/common/enums/PayTypeEnum.java
  73. 39 0
      mp-common/src/main/java/com/qs/mp/common/enums/PrizeStorageInTypeEnum.java
  74. 38 0
      mp-common/src/main/java/com/qs/mp/common/enums/PrizeStorageStatusEnum.java
  75. 2 2
      mp-common/src/main/java/com/qs/mp/common/enums/RoleTypeEnum.java
  76. 42 0
      mp-common/src/main/java/com/qs/mp/common/enums/SiteTypeEnum.java
  77. 47 0
      mp-common/src/main/java/com/qs/mp/common/enums/TicketBoxStatusEnum.java
  78. 43 0
      mp-common/src/main/java/com/qs/mp/common/enums/TicketPkgStatusEnum.java
  79. 44 0
      mp-common/src/main/java/com/qs/mp/common/enums/TicketPrizeTypeEnum.java
  80. 43 0
      mp-common/src/main/java/com/qs/mp/common/enums/TicketStatusEnum.java
  81. 43 0
      mp-common/src/main/java/com/qs/mp/common/enums/TicketTypeEnum.java
  82. 41 0
      mp-common/src/main/java/com/qs/mp/common/enums/UserCouponStatusEnum.java
  83. 29 0
      mp-common/src/main/java/com/qs/mp/common/enums/UserIdentityEnum.java
  84. 43 0
      mp-common/src/main/java/com/qs/mp/common/enums/UserTicketOrderStatusEnum.java
  85. 52 0
      mp-common/src/main/java/com/qs/mp/common/exception/DataOperationException.java
  86. 6 2
      mp-common/src/main/java/com/qs/mp/common/exception/ServiceException.java
  87. 7 31
      mp-common/src/main/java/com/qs/mp/common/jsms/JSMSUtils.java
  88. 2 1
      mp-common/src/main/java/com/qs/mp/common/json/EnumValueDeserializer.java
  89. 178 0
      mp-common/src/main/java/com/qs/mp/common/pulsar/PulsarClientService.java
  90. 12 0
      mp-common/src/main/java/com/qs/mp/common/pulsar/PulsarConsumer.java
  91. 89 6
      mp-common/src/main/java/com/qs/mp/common/utils/DateUtils.java
  92. 130 0
      mp-common/src/main/java/com/qs/mp/common/utils/RSAUtil.java
  93. 84 3
      mp-common/src/main/java/com/qs/mp/common/utils/http/HttpUtils.java
  94. 105 76
      mp-framework/.factorypath
  95. 10 4
      mp-framework/src/main/java/com/qs/mp/framework/config/SecurityConfig.java
  96. 61 107
      mp-framework/src/main/java/com/qs/mp/framework/web/service/SysLoginService.java
  97. 94 60
      mp-generator/.factorypath
  98. 2 10
      mp-generator/src/main/java/com/qs/mp/generator/DbGenerator.java
  99. 83 57
      mp-quartz/.factorypath
  100. 2 2
      mp-quartz/pom.xml

+ 107 - 78
mp-admin/.factorypath

@@ -1,11 +1,9 @@
 <factorypath>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-devtools/2.2.13.RELEASE/spring-boot-devtools-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot/2.2.13.RELEASE/spring-boot-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-core/5.2.12.RELEASE/spring-core-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jcl/5.2.12.RELEASE/spring-jcl-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context/5.2.12.RELEASE/spring-context-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-expression/5.2.12.RELEASE/spring-expression-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-autoconfigure/2.2.13.RELEASE/spring-boot-autoconfigure-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-devtools/2.5.4/spring-boot-devtools-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot/2.5.4/spring-boot-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context/5.3.9/spring-context-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-expression/5.3.9/spring-expression-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-autoconfigure/2.5.4/spring-boot-autoconfigure-2.5.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-boot-starter/3.0.0/springfox-boot-starter-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-oas/3.0.0/springfox-oas-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/swagger/core/v3/swagger-annotations/2.1.2/swagger-annotations-2.1.2.jar" enabled="true" runInBatchMode="false"/>
@@ -13,7 +11,6 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spi/3.0.0/springfox-spi-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-schema/3.0.0/springfox-schema-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-core/3.0.0/springfox-core-3.0.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/net/bytebuddy/byte-buddy/1.10.19/byte-buddy-1.10.19.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spring-web/3.0.0/springfox-spring-web-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/github/classgraph/classgraph/4.8.83/classgraph-4.8.83.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spring-webmvc/3.0.0/springfox-spring-webmvc-3.0.0.jar" enabled="true" runInBatchMode="false"/>
@@ -25,40 +22,28 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-swagger2/3.0.0/springfox-swagger2-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-swagger-ui/3.0.0/springfox-swagger-ui-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/plugin/spring-plugin-core/2.0.0.RELEASE/spring-plugin-core-2.0.0.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-beans/5.2.12.RELEASE/spring-beans-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-aop/5.2.12.RELEASE/spring-aop-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-beans/5.3.9/spring-beans-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-aop/5.3.9/spring-aop-5.3.9.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/plugin/spring-plugin-metadata/2.0.0.RELEASE/spring-plugin-metadata-2.0.0.RELEASE.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/swagger/swagger-models/1.6.2/swagger-models-1.6.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-annotations/2.10.5/jackson-annotations-2.10.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-annotations/2.12.4/jackson-annotations-2.12.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/swagger/swagger-annotations/1.6.2/swagger-annotations-1.6.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/mysql/mysql-connector-java/8.0.22/mysql-connector-java-8.0.22.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-web/2.2.13.RELEASE/spring-boot-starter-web-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter/2.2.13.RELEASE/spring-boot-starter-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-logging/2.2.13.RELEASE/spring-boot-starter-logging-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-to-slf4j/2.12.1/log4j-to-slf4j-2.12.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-json/2.2.13.RELEASE/spring-boot-starter-json-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.5/jackson-datatype-jdk8-2.10.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.5/jackson-datatype-jsr310-2.10.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/module/jackson-module-parameter-names/2.10.5/jackson-module-parameter-names-2.10.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-tomcat/2.2.13.RELEASE/spring-boot-starter-tomcat-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/tomcat/embed/tomcat-embed-core/9.0.41/tomcat-embed-core-9.0.41.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/tomcat/embed/tomcat-embed-el/9.0.41/tomcat-embed-el-9.0.41.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.41/tomcat-embed-websocket-9.0.41.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-validation/2.2.13.RELEASE/spring-boot-starter-validation-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/hibernate/validator/hibernate-validator/6.0.22.Final/hibernate-validator-6.0.22.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/jboss/logging/jboss-logging/3.4.1.Final/jboss-logging-3.4.1.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-web/5.2.12.RELEASE/spring-web-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-webmvc/5.2.12.RELEASE/spring-webmvc-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-aop/2.2.13.RELEASE/spring-boot-starter-aop-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/aspectj/aspectjweaver/1.9.6/aspectjweaver-1.9.6.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/mysql/mysql-connector-java/8.0.26/mysql-connector-java-8.0.26.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-web/2.5.4/spring-boot-starter-web-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-json/2.5.4/spring-boot-starter-json-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.12.4/jackson-datatype-jdk8-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.4/jackson-datatype-jsr310-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/module/jackson-module-parameter-names/2.12.4/jackson-module-parameter-names-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-tomcat/2.5.4/spring-boot-starter-tomcat-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/tomcat/embed/tomcat-embed-core/9.0.52/tomcat-embed-core-9.0.52.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/tomcat/embed/tomcat-embed-el/9.0.52/tomcat-embed-el-9.0.52.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.52/tomcat-embed-websocket-9.0.52.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-web/5.3.9/spring-web-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-webmvc/5.3.9/spring-webmvc-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-aop/2.5.4/spring-boot-starter-aop-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/alibaba/druid-spring-boot-starter/1.2.6/druid-spring-boot-starter-1.2.6.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/alibaba/druid/1.2.6/druid-1.2.6.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/penggle/kaptcha/2.3.2/kaptcha-2.3.2.jar" enabled="true" runInBatchMode="false"/>
@@ -66,30 +51,75 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/oshi/oshi-core/5.8.0/oshi-core-5.8.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/net/java/dev/jna/jna-platform/5.8.0/jna-platform-5.8.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-extension/3.4.1/mybatis-plus-extension-3.4.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-core/3.4.1/mybatis-plus-core-3.4.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-annotation/3.4.1/mybatis-plus-annotation-3.4.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/jsqlparser/jsqlparser/3.2/jsqlparser-3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis/3.5.6/mybatis-3.5.6.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis-spring/2.0.5/mybatis-spring-2.0.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-data-redis/2.5.4/spring-boot-starter-data-redis-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-redis/2.5.4/spring-data-redis-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-keyvalue/2.5.4/spring-data-keyvalue-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-commons/2.5.4/spring-data-commons-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-tx/5.3.9/spring-tx-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-oxm/5.3.9/spring-oxm-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/lettuce/lettuce-core/6.1.4.RELEASE/lettuce-core-6.1.4.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.67.Final/netty-common-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler/4.1.67.Final/netty-handler-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.67.Final/netty-resolver-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.67.Final/netty-buffer-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.67.Final/netty-codec-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.67.Final/netty-transport-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/projectreactor/reactor-core/3.4.9/reactor-core-3.4.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/integration/spring-integration-redis/5.5.3/spring-integration-redis-5.5.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/integration/spring-integration-core/5.5.3/spring-integration-core-5.5.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-messaging/5.3.9/spring-messaging-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/retry/spring-retry/1.3.1/spring-retry-1.3.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/redis/clients/jedis/3.6.3/jedis-3.6.3.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/quartz-scheduler/quartz/2.3.2/quartz-2.3.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/mchange/mchange-commons-java/0.2.15/mchange-commons-java-0.2.15.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context-support/5.2.12.RELEASE/spring-context-support-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-security/2.2.13.RELEASE/spring-boot-starter-security-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-config/5.2.8.RELEASE/spring-security-config-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-core/5.2.8.RELEASE/spring-security-core-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-web/5.2.8.RELEASE/spring-security-web-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context-support/5.3.9/spring-context-support-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-security/2.5.4/spring-boot-starter-security-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-config/5.5.2/spring-security-config-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-core/5.5.2/spring-security-core-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-crypto/5.5.2/spring-security-crypto-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-web/5.5.2/spring-security-web-5.5.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper-spring-boot-starter/1.3.1/pagehelper-spring-boot-starter-1.3.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-starter/2.1.4/mybatis-spring-boot-starter-2.1.4.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.1.4/mybatis-spring-boot-autoconfigure-2.1.4.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis/3.5.6/mybatis-3.5.6.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper-spring-boot-autoconfigure/1.3.1/pagehelper-spring-boot-autoconfigure-1.3.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper/5.2.1/pagehelper-5.2.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/jsqlparser/jsqlparser/4.0/jsqlparser-4.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-databind/2.10.5.1/jackson-databind-2.10.5.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-core/2.10.5/jackson-core-2.10.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-databind/2.12.4/jackson-databind-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-core/2.12.4/jackson-core-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/dataformat/jackson-dataformat-xml/2.12.4/jackson-dataformat-xml-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.12.4/jackson-module-jaxb-annotations-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/codehaus/woodstox/stax2-api/4.2.1/stax2-api-4.2.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/woodstox/woodstox-core/6.2.4/woodstox-core-6.2.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/alibaba/fastjson/1.2.76/fastjson-1.2.76.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-fileupload/commons-fileupload/1.4/commons-fileupload-1.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/qcloud/cos_api/5.6.54/cos_api-5.6.54.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/httpcomponents/httpcore/4.4.14/httpcore-4.4.14.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/commons-codec/commons-codec/1.15/commons-codec-1.15.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/joda-time/joda-time/2.9.9/joda-time-2.9.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/tencentcloudapi/tencentcloud-sdk-java-kms/3.1.213/tencentcloud-sdk-java-kms-3.1.213.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/tencentcloudapi/tencentcloud-sdk-java-common/3.1.213/tencentcloud-sdk-java-common-3.1.213.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp/logging-interceptor/2.7.5/logging-interceptor-2.7.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/bouncycastle/bcprov-jdk15on/1.64/bcprov-jdk15on-1.64.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/cn/jpush/api/jiguang-common/1.0.8/jiguang-common-1.0.8.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-all/4.1.67.Final/netty-all-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.7/gson-2.8.7.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/cn/jpush/api/jsms-client/1.2.9/jsms-client-1.2.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/net/coobird/thumbnailator/0.4.8/thumbnailator-0.4.8.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/poi/poi-ooxml/4.1.2/poi-ooxml-4.1.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/poi/poi/4.1.2/poi-4.1.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/commons-codec/commons-codec/1.13/commons-codec-1.13.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-collections4/4.4/commons-collections4-4.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/SparseBitSet/1.2/SparseBitSet-1.2.jar" enabled="true" runInBatchMode="false"/>
@@ -97,38 +127,37 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/xmlbeans/xmlbeans/3.1.0/xmlbeans-3.1.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-compress/1.19/commons-compress-1.19.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/virtuald/curvesapi/1.06/curvesapi-1.06.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.28/snakeyaml-1.28.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/jsonwebtoken/jjwt/0.9.1/jjwt-0.9.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-data-redis/2.2.13.RELEASE/spring-boot-starter-data-redis-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-redis/2.2.12.RELEASE/spring-data-redis-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-keyvalue/2.2.12.RELEASE/spring-data-keyvalue-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-commons/2.2.12.RELEASE/spring-data-commons-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-tx/5.2.12.RELEASE/spring-tx-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-oxm/5.2.12.RELEASE/spring-oxm-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/lettuce/lettuce-core/5.2.2.RELEASE/lettuce-core-5.2.2.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.58.Final/netty-common-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler/4.1.58.Final/netty-handler-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.58.Final/netty-resolver-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.58.Final/netty-buffer-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.58.Final/netty-codec-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.58.Final/netty-transport-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/projectreactor/reactor-core/3.3.13.RELEASE/reactor-core-3.3.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-pool2/2.7.0/commons-pool2-2.7.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-pool2/2.9.0/commons-pool2-2.9.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/eu/bitwalker/UserAgentUtils/1.21/UserAgentUtils-1.21.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okio/okio/1.17.2/okio-1.17.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/javax/servlet/javax.servlet-api/4.0.1/javax.servlet-api-4.0.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-boot-starter/3.3.0/mybatis-plus-boot-starter-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus/3.3.0/mybatis-plus-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-extension/3.3.0/mybatis-plus-extension-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-core/3.3.0/mybatis-plus-core-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-annotation/3.3.0/mybatis-plus-annotation-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-jdbc/2.2.13.RELEASE/spring-boot-starter-jdbc-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/HikariCP/3.4.5/HikariCP-3.4.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jdbc/5.2.12.RELEASE/spring-jdbc-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis-spring/2.0.0/mybatis-spring-2.0.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-starter/2.1.2/mybatis-spring-boot-starter-2.1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-jdbc/2.5.4/spring-boot-starter-jdbc-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/HikariCP/4.0.3/HikariCP-4.0.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jdbc/5.3.9/spring-jdbc-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.1.2/mybatis-spring-boot-autoconfigure-2.1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-boot-starter/3.4.3.2/mybatis-plus-boot-starter-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus/3.4.3.2/mybatis-plus-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/cn/hutool/hutool-all/5.3.1/hutool-all-5.3.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.16/lombok-1.18.16.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.20/lombok-1.18.20.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/velocity/velocity/1.7/velocity-1.7.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-lang/commons-lang/2.4/commons-lang-2.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-generator/3.4.1/mybatis-plus-generator-3.4.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter/2.5.4/spring-boot-starter-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-logging/2.5.4/spring-boot-starter-logging-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-classic/1.2.5/logback-classic-1.2.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-core/1.2.5/logback-core-1.2.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-to-slf4j/2.14.1/log4j-to-slf4j-2.14.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.14.1/log4j-api-2.14.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/jul-to-slf4j/1.7.32/jul-to-slf4j-1.7.32.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/xml/bind/jakarta.xml.bind-api/2.3.3/jakarta.xml.bind-api-2.3.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/net/bytebuddy/byte-buddy/1.10.22/byte-buddy-1.10.22.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-core/5.3.9/spring-core-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jcl/5.3.9/spring-jcl-5.3.9.jar" enabled="true" runInBatchMode="false"/>
 </factorypath>

+ 1 - 0
mp-admin/.gitignore

@@ -0,0 +1 @@
+/bin/

+ 9 - 9
mp-admin/pom.xml

@@ -60,7 +60,7 @@
             <groupId>com.qs.mp</groupId>
             <artifactId>mp-generator</artifactId>
         </dependency>
-        
+
         <dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-test</artifactId>
@@ -76,7 +76,7 @@
 				</exclusion>
 			</exclusions>
 		</dependency>
-        
+
 
     </dependencies>
 
@@ -97,17 +97,17 @@
                     </execution>
                 </executions>
             </plugin>
-            <plugin>   
-                <groupId>org.apache.maven.plugins</groupId>   
-                <artifactId>maven-war-plugin</artifactId>   
-                <version>3.1.0</version>   
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.1.0</version>
                 <configuration>
                     <failOnMissingWebXml>false</failOnMissingWebXml>
                     <warName>${project.artifactId}</warName>
-                </configuration>   
-           </plugin>   
+                </configuration>
+           </plugin>
         </plugins>
         <finalName>${project.artifactId}</finalName>
     </build>
 
-</project>
+</project>

+ 8 - 22
mp-admin/src/main/java/com/qs/mp/handler/auth/SignInterceptor.java

@@ -53,6 +53,12 @@ public class SignInterceptor implements HandlerInterceptor {
             //进行sign验证
             String[] signs = request.getParameterValues("sign");
 
+            if (request.getRequestURI().equals("/api/v1/mp/wx/urlschema/generate")
+                || request.getRequestURI().equals("/api/v1/mp/wx/code/generate")) {
+                // 小程序跳转页面请求
+                LogUtil.debug(logger, "requestURI:" + request.getRequestURI());
+                return true;
+            }
             if(null == signs || signs.length == 0) {
                 logger.error("sign参数为空 request url:"+getRequestInfo(request));
                 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
@@ -61,13 +67,6 @@ public class SignInterceptor implements HandlerInterceptor {
             if(StringUtils.isBlank(body)){
                 logger.info("request body is null. request url:"+getRequestInfo(request));
                 //response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-                // 上传文件的时候,body里只有文件流,custId在request参数里
-                String custId = request.getParameter("custId");
-                if(!StringUtils.isBlank(custId)){
-                    LoginUser loginUser = hostHolder.getUser();
-//                    loginUser.setCustId(custId);
-                    hostHolder.setUser(loginUser);
-                }
                 return true;
             }
 
@@ -88,27 +87,14 @@ public class SignInterceptor implements HandlerInterceptor {
                 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
                 return false;
             }*/
-            //特殊处理,通过拦截器注入线程对象属性custId modify by duota 2021.09.09
-            try {
-                if (JSONObject.isValidObject(body)) {
-                    JSONObject jsonObject = JSONObject.parseObject(body);
-                    String custId = jsonObject.getString("custId");
-                    if (!StringUtils.isBlank(custId)) {
-                        LoginUser loginUser = hostHolder.getUser();
-//                        loginUser.setCustId(custId);
-                        hostHolder.setUser(loginUser);
-                    }
-                }
-            }catch (Exception e){
-                LogUtil.error(logger, e, "拦截器处理custId异常,body:{0}", body );
-            }
+
         }
         return true;
     }
 
     @Override
     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
-        
+
     }
 
     private String getRequestInfo(HttpServletRequest request) {

+ 4 - 4
mp-admin/src/main/java/com/qs/mp/handler/auth/SignUtils.java

@@ -15,7 +15,7 @@ import org.springframework.beans.factory.annotation.Value;
  *
  */
 public class SignUtils {
-    
+
     protected static Logger logger = LoggerFactory.getLogger(SignUtils.class);
     @Value("${sign.md5key}")
     private static String md5key = "3Jr8S1K18rcC1wAfv8";
@@ -36,12 +36,12 @@ public class SignUtils {
         }
         return hex.toString();
     }
-    
+
     public static boolean verifySign(String sign,String body,String timestamp) {
         String l = body+ "nonce"+ timestamp + md5key;
-        //logger.info("sign str:"+l);
+        logger.debug("sign str:"+l);
         String mySign = Md5Utils.hash(l);
-        //logger.info("mySign:"+mySign+" sign:"+sign);
+        logger.debug("mySign:"+mySign+" sign:"+sign);
         return mySign.equals(sign);
     }
 }

+ 107 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/AreaMgrController.java

@@ -0,0 +1,107 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.domain.Area;
+import com.qs.mp.common.service.IAreaService;
+import com.qs.mp.web.controller.common.BaseApiController;
+import java.util.List;
+import javax.validation.Valid;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author lgh on 2018/10/26.
+ */
+@RestController
+@RequestMapping("/api/v1/mp")
+public class AreaMgrController extends BaseApiController {
+
+    @Autowired
+    private IAreaService areaService;
+
+    /**
+     * 分页获取
+     */
+    @GetMapping("/admin/area/list")
+//    @PreAuthorize("@pms.hasPermission('admin:area:page')")
+    public TableDataInfo page(Area area) {
+        startPage();
+        List<Area> areaList = areaService.list(new LambdaQueryWrapper<Area>());
+        return getDataTable(areaList);
+    }
+
+    /**
+     * 获取省市
+     */
+    @GetMapping("/list")
+//    @PreAuthorize("@pms.hasPermission('admin:area:list')")
+    public ResponseEntity<List<Area>> list(Area area) {
+        List<Area> areas = areaService.list(new LambdaQueryWrapper<Area>()
+                .like(area.getAreaName() != null, Area::getAreaName, area.getAreaName()));
+        return ResponseEntity.ok(areas);
+    }
+
+    /**
+     * 通过父级id获取区域列表
+     */
+    @GetMapping("/listByPid")
+    public ResponseEntity<List<Area>> listByPid(Long pid) {
+        List<Area> list = areaService.listByPid(pid);
+        return ResponseEntity.ok(list);
+    }
+
+    /**
+     * 获取信息
+     */
+    @GetMapping("/info/{id}")
+//    @PreAuthorize("@pms.hasPermission('admin:area:info')")
+    public ResponseEntity<Area> info(@PathVariable("id") Long id) {
+        Area area = areaService.getById(id);
+        return ResponseEntity.ok(area);
+    }
+
+    /**
+     * 保存
+     */
+    @PostMapping
+//    @PreAuthorize("@pms.hasPermission('admin:area:save')")
+    public ResponseEntity<Void> save(@Valid @RequestBody Area area) {
+        if (area.getParentId() != null) {
+            Area parentArea = areaService.getById(area.getParentId());
+            area.setLevel(parentArea.getLevel() + 1);
+        }
+        areaService.save(area);
+        return ResponseEntity.ok().build();
+    }
+
+    /**
+     * 修改
+     */
+    @PutMapping
+//    @PreAuthorize("@pms.hasPermission('admin:area:update')")
+    public ResponseEntity<Void> update(@Valid @RequestBody Area area) {
+        areaService.updateById(area);
+        return ResponseEntity.ok().build();
+    }
+
+    /**
+     * 删除
+     */
+    @DeleteMapping("/{id}")
+//    @PreAuthorize("@pms.hasPermission('admin:area:delete')")
+    public ResponseEntity<Void> delete(@PathVariable Long id) {
+        Area area = areaService.getById(id);
+        areaService.removeById(id);
+        return ResponseEntity.ok().build();
+    }
+
+}

+ 337 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelMgrController.java

@@ -0,0 +1,337 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.param.ChannelParam;
+import com.qs.mp.channel.domain.vo.ChannelOperDataVO;
+import com.qs.mp.channel.domain.vo.ChannelVO;
+import com.qs.mp.channel.service.IChannelOrderService;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.common.constant.UserConstants;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ChannelRoleEnum;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.system.domain.SysUser;
+import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import ma.glasnost.orika.MapperFacade;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @auther zhongcp
+ * @create 2022-02-28 16:17:48
+ * @describe 渠道管理前端控制器
+ */
+@Api("渠道管理API")
+@RestController
+@RequestMapping("/api/v1/mp/admin/channel/*")
+@Component
+public class ChannelMgrController extends BaseApiController {
+
+	@Autowired
+	private IChannelService channelService;
+	
+	@Autowired
+	private IChannelUserRelService channelUserRelService;
+	
+	@Autowired
+	private IChannelOrderService channelOrderService;
+	
+	@Autowired
+	private ISysUserService userService;
+	
+	@Autowired
+	private MapperFacade mapperFacade;
+
+	/**
+	 * 获取我的下级渠道列表信息,LIMIT 50
+	 *
+	 * @return
+	 */
+	@PostMapping("/tree")
+	public AjaxResult treeChannel(@RequestBody Channel channel) {
+		List<ChannelVO> list = new ArrayList<ChannelVO>();
+		QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("t1.parent_id", null!=channel && null != channel.getParentId()?channel.getParentId():0);
+		queryWrapper.gt("t1.level", 0);
+		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getMobile()), "t1.mobile", channel.getMobile());
+		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getName()), "t1.name", channel.getName());
+		queryWrapper.orderByDesc("t1.channel_id");
+		queryWrapper.last("limit 50");
+		list = channelService.selectChannelVoList(queryWrapper);
+		if(null != list && list.size() > 0) {
+			for(ChannelVO channelVO : list) {
+				if(null != channelVO && StringUtils.isNotBlank(channelVO.getChannelNo())) {
+//					int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
+//					int userCnt = channelUserRelService.getChannelUserCnt(channelVO.getChannelNo());
+//					channelVO.setSiteCnt(siteCnt);
+//					channelVO.setUserCnt(userCnt);
+					// 查询子渠道数量
+					int childCnt = channelService.count(
+							new LambdaQueryWrapper<Channel>().eq(Channel::getParentId, channelVO.getChannelId())
+							.gt(Channel::getLevel, 0));
+					channelVO.setChildCnt(childCnt);
+				}
+			}
+		}
+		return AjaxResult.success(list);
+	}
+	
+	
+	/**
+	 * 查询所有渠道列表
+	 *
+	 * @return
+	 */
+	@PostMapping("/listAll")
+	public AjaxResult listAllChannel() {
+		List<Channel> list = new ArrayList<Channel>();
+		LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
+		queryWrapper.gt(Channel::getLevel, 0);
+		queryWrapper.orderByDesc(Channel::getChannelId);
+		list = channelService.list(queryWrapper);
+		return AjaxResult.success(list);
+	}
+	
+	
+	/**
+	 * 获取我的下级渠道列表信息,支持翻页
+	 *
+	 * @return
+	 */
+	@PostMapping("/list")
+	public TableDataInfo listChannel(@RequestBody Channel channel) {
+		List<ChannelVO> list = new ArrayList<ChannelVO>();
+		startPage();
+		QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
+		if(null!=channel && null != channel.getParentId()) {
+			queryWrapper.eq("t1.parent_id", channel.getParentId());
+		}
+		queryWrapper.gt("t1.level", 0);
+		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getMobile()), "t1.mobile", channel.getMobile());
+		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getName()), "t1.name", channel.getName());
+		queryWrapper.eq(null != channel && null != channel.getProvinceId(), "t1.province_id", channel.getProvinceId());
+		queryWrapper.eq(null != channel && null != channel.getCityId(), "t1.city_id", channel.getCityId());
+		queryWrapper.eq(null != channel && null != channel.getAreaId(), "t1.area_id", channel.getAreaId());
+		queryWrapper.orderByDesc("t1.channel_id");
+		list = channelService.selectChannelVoList(queryWrapper);
+		if(null != list && list.size() > 0) {
+			for(ChannelVO channelVO : list) {
+				if(null != channelVO && StringUtils.isNotBlank(channelVO.getChannelNo())) {
+					int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
+					int userCnt = channelUserRelService.getChannelTotalUserCnt(channelVO.getChannelNo());
+					channelVO.setSiteCnt(siteCnt);
+					channelVO.setUserCnt(userCnt);
+					// 查询用户信息
+					// SysUser sysUser = userService.selectUserById(channelVO.getUserId());
+					// channelVO.setSysUser(sysUser);
+ 				}
+			}
+		}
+		return getDataTable(list);
+	}
+	
+	
+	/**
+	 * 渠道管理新增一级渠道信息
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "新增子渠道信息", notes = "渠道端新增子渠道")
+	@PostMapping("/create")
+	public AjaxResult channelCreate(@Validated @RequestBody ChannelParam channelParam) {
+		if (channelParam.getChannelId() != null && channelParam.getChannelId() != 0) {
+			return AjaxResult.error("该渠道已存在");
+		}
+		Channel channel = mapperFacade.map(channelParam, Channel.class);
+		// 1、校验名称是否重复、手机号是否存在(渠道表)
+		LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(Channel::getName, channel.getName());
+		queryWrapper.gt(Channel::getLevel, 0);
+		int nameCount = channelService.count(queryWrapper);
+		if(nameCount > 0) {
+			return AjaxResult.error("渠道名称" + channel.getName() + "已存在!");
+		}
+		int mobileCount = channelService.count(
+		        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
+		if(mobileCount > 0) {
+			 return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+		}
+		// 2.校验佣金比例,不能高于其父渠道的佣金比例
+//		if(null != channel.getParentId() && channel.getParentId() != 0) {
+//			Channel parentChannel = channelService.getById(channel.getParentId());
+//			if(null != parentChannel) {
+//				 if(null != parentChannel.getCommRate() 
+//						 && channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
+//					 return AjaxResult.error("佣金比例不能高于父渠道的佣金比例");
+//				 }
+//				 channel.setLevel(parentChannel.getLevel()+1);
+//				 channel.setChannelNo(parentChannel.getChannelNo()+".");
+//			}else {
+//				return AjaxResult.error("父渠道不存在");
+//			}
+//		}else {
+//			channel.setLevel(1);
+//			channel.setChannelNo("");
+//		}
+		channel.setParentId(0L);
+		channel.setLevel(1);
+		channel.setChannelNo("");
+		// 3.插入数据
+		try {
+			channelService.saveChannel(channel,ChannelRoleEnum.CHANNEL);
+		} catch (Exception e) {
+			return AjaxResult.error("渠道'" + channel.getName() + "'新增失败" + e.getMessage());
+		}
+		
+		return AjaxResult.success("渠道'" + channel.getName() + "'新增成功");
+	}
+
+	/**
+	 * 编辑一级子渠道信息
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "编辑子渠道信息", notes = "渠道端编辑子渠道")
+	@PostMapping("/update")
+	public AjaxResult channelUpdate(@Validated @RequestBody ChannelParam channelParam) {
+		if (null == channelParam || null == channelParam.getChannelId()) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		Channel channel = mapperFacade.map(channelParam, Channel.class);
+		// 1、校验修改子渠道是否为当前用户的子渠道
+		Channel oldChannel = channelService.getById(channel.getChannelId());
+		if(null == oldChannel || null == oldChannel.getChannelId()) {
+			return AjaxResult.error("渠道'" + oldChannel.getName() + "'编辑失败,渠道ID异常");
+		}
+		// 2.校验名称是否重复、手机号是否存在(渠道表);
+		if(!channel.getName().equals(oldChannel.getName())) {
+			LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<>();
+			queryWrapper.eq(Channel::getName, channel.getName());
+			queryWrapper.gt(Channel::getLevel, 0);
+			int nameCount = channelService.count(queryWrapper);
+			if(nameCount > 0) {
+				return AjaxResult.error("渠道名称" + channel.getName() + "已存在!");
+			}
+		}
+		boolean mobileChange = false;  // 手机号码是否有变更
+		if(!channel.getMobile().equals(oldChannel.getMobile())) {
+			int mobileCount = channelService.count(
+			        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
+			if(mobileCount > 0) {
+				return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+			}
+			if(UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(channel.getMobile()))) {
+				return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+			}
+			mobileChange = true;
+		}
+		// 3.校验佣金比例,不能高于其父渠道的佣金比例,不能低于其子渠道的最大佣金比例
+//		Channel parentChannel = channelService.getById(oldChannel.getParentId());
+//		if(null != parentChannel) {
+//			 if(null != parentChannel.getCommRate() 
+//					 && channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
+//				 return AjaxResult.error("佣金比例不能高于父渠道的佣金比例");
+//			 }
+//			 channel.setLevel(parentChannel.getLevel()+1);
+//			 channel.setChannelNo(parentChannel.getChannelNo()+".");
+//		}else {
+//			return AjaxResult.error("父渠道不存在");
+//		}
+		// 查询子渠道的最大佣金比例
+		QueryWrapper<Channel> queryWrapper = new QueryWrapper<Channel>();
+		queryWrapper.select("IFNULL(max(comm_rate),0) as commRate");
+		queryWrapper.lambda().eq(Channel::getParentId, channel.getChannelId());
+		Map<String, Object> map = channelService.getMap(queryWrapper);
+		if(null != map && map.containsKey("commRate")) {
+			BigDecimal commRate = new BigDecimal(map.get("commRate").toString());
+			if(!commRate.equals(BigDecimal.ZERO) && channel.getCommRate().compareTo(commRate) < 0) {
+				return AjaxResult.error("不能低于其子渠道的最大佣金比例");
+			}
+		}
+		try {
+			channelService.updateChannel(channel, mobileChange);
+		} catch (Exception e) {
+			return AjaxResult.error(e.getMessage());
+		}
+		return AjaxResult.success("渠道'" + channel.getName() + "'编辑成功");
+	}
+	
+	
+	/**
+	 * 停用、启用渠道
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "停用、启用渠道信息", notes = "渠道管理编辑子渠道")
+	@PostMapping("/status")
+	public AjaxResult channelStatus(@RequestBody JSONObject jsonObject) {
+		String channelId = jsonObject.containsKey("channelId")?jsonObject.get("channelId").toString():"";
+		String status = jsonObject.containsKey("status")?jsonObject.get("status").toString():"";
+		if (null == jsonObject || StringUtils.isBlank(channelId)
+				|| StringUtils.isBlank(status)) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		try {
+			channelService.lambdaUpdate().set(Channel::getStatus, status).eq(Channel::getChannelId, channelId).update();
+		} catch (Exception e) {
+			return AjaxResult.error("操作失败");
+		}
+		return AjaxResult.success("操作成功");
+	}
+	
+	
+	/**
+	 * 查询渠道详情
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "查询渠道详情信息", notes = "渠道管理编辑子渠道查询渠道详情")
+	@PostMapping("/detail")
+	public AjaxResult getChannelDetail(@RequestBody JSONObject jsonObject) {
+		String channelId = (null != jsonObject && jsonObject.containsKey("channelId"))?jsonObject.getString("channelId"):"";
+		if (StringUtils.isBlank(channelId)) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		ChannelVO channelVO = channelService.getChannelVoById(Long.valueOf(channelId));
+		if(null == channelVO || null == channelVO.getChannelId()) {
+			 return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		if(null != channelVO && StringUtils.isNotBlank(channelVO.getChannelNo())) {
+			int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
+			int userCnt = channelUserRelService.getChannelTotalUserCnt(channelVO.getChannelNo());
+			channelVO.setSiteCnt(siteCnt);
+			channelVO.setUserCnt(userCnt);
+		}
+	    // 查询渠道销售额、佣金收入、订单数等
+	    ChannelOperDataVO channelOperDataVO = channelService.getChannelTotalOperData(channelVO.getChannelNo());
+		LambdaQueryWrapper<ChannelOrder> queryWrapper = new LambdaQueryWrapper<ChannelOrder>();
+		queryWrapper.eq(ChannelOrder::getChannelId, channelId);
+		int orderCnt = channelOrderService.count(queryWrapper);
+		channelOperDataVO.setOrderCnt(orderCnt);
+	    channelVO.setOperData(channelOperDataVO);
+		return AjaxResult.success(channelVO);
+	}
+	
+}

+ 103 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java

@@ -0,0 +1,103 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.ChannelOrderItem;
+import com.qs.mp.channel.domain.vo.ChannelOrderVO;
+import com.qs.mp.channel.service.IChannelOrderItemService;
+import com.qs.mp.channel.service.IChannelOrderService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/admin/channel/order")
+@Api(tags = "渠道订单管理接口")
+@AllArgsConstructor
+public class ChannelOrderMgrController extends BaseApiController {
+
+  @Autowired
+  private IChannelOrderService channelOrderService;
+
+  @Autowired
+  private IChannelOrderItemService channelOrderItemService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  @Autowired
+  private RedisCache redisCache;
+
+  /**
+   * 订单列表
+   */
+  @PostMapping("/list")
+  @ApiOperation(value = "订单列表" , notes = "获取所有订单信息")
+  public TableDataInfo list(@RequestBody JSONObject param) {
+   // Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    Integer status = param.getInteger("status");
+    startPage();
+    LambdaQueryWrapper<ChannelOrder> queryWrapper = new LambdaQueryWrapper<ChannelOrder>();
+    // queryWrapper.eq(ChannelOrder::getChannelId, channelId);
+    queryWrapper.eq(null != status, ChannelOrder::getStatus, status);
+    queryWrapper.orderByDesc(ChannelOrder::getCreatedTime);
+    List<ChannelOrder> channelOrders = channelOrderService.list(queryWrapper);
+    List<ChannelOrderVO> channelOrderVOList = mapperFacade.mapAsList(channelOrders, ChannelOrderVO.class);
+    for (ChannelOrderVO channelOrderVO : channelOrderVOList) {
+      channelOrderVO.setItems(channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
+          .eq(ChannelOrderItem::getOrderId, channelOrderVO.getOrderId())));
+    }
+    TableDataInfo rspData = getDataTable(channelOrders);
+    rspData.setRows(channelOrderVOList);
+    return rspData;
+  }
+
+  /**
+   * 订单详情
+   */
+  @PostMapping("/detail")
+  @ApiOperation(value = "订单详情" , notes = "在订单列表页面查看详情")
+  public AjaxResult query(@RequestBody ChannelOrder order) {
+    if(null == order || StringUtils.isBlank(order.getOrderId())) {
+    	return error(ErrorCodeEnum.ERROR_CODE_1001);
+    }    
+    LambdaQueryWrapper<ChannelOrder> queryWrapper = new LambdaQueryWrapper<ChannelOrder>();
+    queryWrapper.eq(ChannelOrder::getOrderId, order.getOrderId());
+    
+    ChannelOrder channelOrder = channelOrderService.getOne(queryWrapper);
+    ChannelOrderVO channelOrderVO = mapperFacade.map(channelOrder, ChannelOrderVO.class);
+    channelOrderVO.setItems(channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
+        .eq(ChannelOrderItem::getOrderId, channelOrderVO.getOrderId())));
+    return AjaxResult.success(channelOrderVO);
+  }
+
+  
+
+  /**
+   * 订单发货
+   */
+  @PostMapping("/ship")
+  @ApiOperation(value = "订单发货" , notes = "在订单发货页面提交")
+  public AjaxResult ship(@RequestBody ChannelOrder order) {
+
+    return AjaxResult.success();
+  }
+
+
+}

+ 310 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponMgrController.java

@@ -0,0 +1,310 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.admin.domain.CouponChannel;
+import com.qs.mp.admin.domain.CouponTicket;
+import com.qs.mp.admin.domain.Goods;
+import com.qs.mp.admin.domain.GoodsSku;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.param.CouponParam;
+import com.qs.mp.admin.domain.param.GoodsParam;
+import com.qs.mp.admin.domain.vo.CouponVO;
+import com.qs.mp.admin.domain.vo.GoodsVO;
+import com.qs.mp.admin.service.ICouponChannelService;
+import com.qs.mp.admin.service.ICouponService;
+import com.qs.mp.admin.service.ICouponTicketService;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.common.constant.UserConstants;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.CouponStatusEnum;
+import com.qs.mp.common.enums.CouponUseAreaEnum;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.system.domain.SysUser;
+import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import ma.glasnost.orika.MapperFacade;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @auther liugl
+ * @create 2022-03-09 23:45:48
+ * @describe 代金券管理前端控制器
+ */
+@Api("代金券管理API")
+@RestController
+@RequestMapping("/api/v1/mp/admin/coupon/*")
+@Component
+public class CouponMgrController extends BaseApiController {
+
+	@Autowired
+	private ICouponService couponService;
+
+	@Autowired
+	private ICouponTicketService couponTicketService;
+	
+	@Autowired
+	private ITicketBoxService ticketBoxService;
+	
+	@Autowired
+	private ICouponChannelService couponChannelService;
+	
+	@Autowired
+	private IChannelService channelService;
+
+	@Autowired
+	private ISysUserService userService;
+
+	@Autowired
+	private MapperFacade mapperFacade;
+
+	/**
+	 * 获取代金券列表信息,支持翻页
+	 *
+	 * @return
+	 */
+	@PostMapping("/list")
+	public TableDataInfo listCoupon(@RequestBody Coupon coupon) {
+		List<Coupon> list = new ArrayList<Coupon>();
+		startPage();
+		QueryWrapper<Coupon> queryWrapper = new QueryWrapper<Coupon>();
+		queryWrapper.lambda().like(null != coupon && StringUtils.isNotBlank(coupon.getTitle()), Coupon::getTitle, coupon.getTitle());
+		queryWrapper.lambda().eq(null != coupon && null != coupon.getStatus(), Coupon::getStatus, coupon.getStatus());
+		queryWrapper.lambda().eq(null != coupon && null != coupon.getType(), Coupon::getType, coupon.getType());
+		queryWrapper.lambda().eq(Coupon::getIsDeleted, 0);
+		queryWrapper.orderByAsc("FIELD(`status`, 'init', 'on', 'off')");
+		queryWrapper.lambda().orderByDesc(Coupon::getCouponId);
+		list = couponService.list(queryWrapper);
+		return getDataTable(list);
+	}
+	
+	
+	/**
+	 * 获取代金券详情信息
+	 *
+	 * @param
+	 * @return
+	 */
+	@PostMapping(value = "/detail")
+	public AjaxResult getCouponDetail(@RequestBody JSONObject jsonObject) {
+		String couponId = jsonObject.getString("couponId");
+	    if (StringUtils.isBlank(couponId)){
+	      return error(ErrorCodeEnum.ERROR_CODE_1001);
+	    }
+	    Coupon coupon = couponService.getById(couponId);
+		if(null == coupon || StringUtils.isBlank(coupon.getCouponId())) {
+			 return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		CouponVO couponVO = new CouponVO();
+		BeanUtils.copyProperties(coupon, couponVO);
+		List<TicketBox> ticketBoxList = new ArrayList<>();
+		// 查询盲票限制列表
+		List<CouponTicket> ticketList = new ArrayList<>();
+		LambdaQueryWrapper<CouponTicket> ticketQueryWrapper = new LambdaQueryWrapper<>();
+		ticketQueryWrapper.eq(CouponTicket::getCouponId, coupon.getCouponId());
+		ticketQueryWrapper.orderByDesc(CouponTicket::getCreatedTime);
+		ticketList = couponTicketService.list(ticketQueryWrapper);
+		if(null != ticketList && ticketList.size() > 0) {
+			List<String> boxIdList = ticketList.stream().map(CouponTicket::getBoxId).collect(Collectors.toList());
+			if(null != boxIdList && boxIdList.size() > 0) {
+				LambdaQueryWrapper<TicketBox> ticketBoxQueryWrapper = new LambdaQueryWrapper<>();
+				ticketBoxQueryWrapper.in(TicketBox::getBoxId, boxIdList);
+				ticketBoxQueryWrapper.orderByDesc(TicketBox::getCreatedTime);
+				ticketBoxList = ticketBoxService.list(ticketBoxQueryWrapper);
+				couponVO.setTicketBoxList(ticketBoxList);
+			}
+		}
+		// 查询门店限制列表
+		List<Channel> channelList = new ArrayList<>();
+		List<CouponChannel> couponChannelList = new ArrayList<>();
+		LambdaQueryWrapper<CouponChannel> couponChanneQueryWrapper = new LambdaQueryWrapper<>();
+		couponChanneQueryWrapper.eq(CouponChannel::getCouponId, coupon.getCouponId());
+		couponChanneQueryWrapper.orderByDesc(CouponChannel::getCreatedTime);
+		couponChannelList = couponChannelService.list(couponChanneQueryWrapper);
+		if(null != couponChannelList && couponChannelList.size() > 0) {
+			List<Long> channelIdList = couponChannelList.stream().map(CouponChannel::getChannelId).collect(Collectors.toList());
+			if(null != channelIdList && channelIdList.size() > 0) {
+				LambdaQueryWrapper<Channel> channelQueryWrapper = new LambdaQueryWrapper<>();
+				channelQueryWrapper.in(Channel::getChannelId, channelIdList);
+				channelQueryWrapper.orderByDesc(Channel::getCreatedTime);
+				channelList = channelService.list(channelQueryWrapper);
+				couponVO.setChannelList(channelList);
+			}
+		}
+		return AjaxResult.success(couponVO);
+	}
+
+	/**
+	 * 新增代金券信息
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "新增代金券信息", notes = "代金券端新增代金券")
+	@PostMapping("/create")
+	public AjaxResult couponCreate(@Validated @RequestBody CouponParam couponParam) {
+		if (StringUtils.isNotBlank(couponParam.getCouponId())) {
+			return AjaxResult.error("该代金券已存在");
+		}
+		Coupon coupon = mapperFacade.map(couponParam, Coupon.class);
+		// 1、校验名称是否重复(代金券表)
+		LambdaQueryWrapper<Coupon> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(Coupon::getTitle, coupon.getTitle());
+		queryWrapper.eq(Coupon::getIsDeleted, 0);
+		int nameCount = couponService.count(queryWrapper);
+		if(nameCount > 0) {
+			return AjaxResult.error("代金券名称" + coupon.getTitle() + "已存在!");
+		}
+		// 使用范围
+		List<CouponTicket> ticketList = new ArrayList<>();
+		if(StringUtils.isNotBlank(couponParam.getBoxIds())) {
+			String[] boxIdArray = couponParam.getBoxIds().split(",");
+	        for (int i = 0; i < boxIdArray.length; i++) {
+	        	String boxId = boxIdArray[i];
+	        	CouponTicket couponTicket = new CouponTicket();
+	        	couponTicket.setBoxId(boxId);
+	        	ticketList.add(couponTicket);
+	        }
+		}
+//		if(coupon.getUseArea() != CouponUseAreaEnum.COMMON 
+//				&& ticketList.size() == 0) {
+//			return AjaxResult.error("使用范围为指定盲票时需要至少选择一种盲票");
+//		}
+		if(StringUtils.isBlank(coupon.getPicUrl())) {
+			coupon.setPicUrl("coupon_def.jpeg");
+		}
+		// 3.插入数据
+		try {
+			couponService.saveCoupon(coupon,ticketList);
+		} catch (Exception e) {
+			return AjaxResult.error("代金券'" + coupon.getTitle() + "'新增失败" + e.getMessage());
+		}
+
+		return AjaxResult.success("代金券'" + coupon.getTitle() + "'新增成功");
+	}
+
+	/**
+	 * 编辑代金券信息
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "编辑代金券信息", notes = "代金券端编辑代金券")
+	@PostMapping("/update")
+	public AjaxResult couponUpdate(@Validated @RequestBody CouponParam couponParam) {
+		if (null == couponParam || StringUtils.isBlank(couponParam.getCouponId())) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		Coupon coupon = mapperFacade.map(couponParam, Coupon.class);
+		// 1、校验修改代金券是否为当前用户的代金券
+		Coupon oldCoupon = couponService.getById(coupon.getCouponId());
+		if(null == oldCoupon || null == oldCoupon.getCouponId()) {
+			return AjaxResult.error("代金券'" + oldCoupon.getTitle() + "'编辑失败,代金券ID异常");
+		}
+		// 2.校验名称是否重复(代金券表);
+		if(!coupon.getTitle().equals(oldCoupon.getTitle())) {
+			LambdaQueryWrapper<Coupon> queryWrapper = new LambdaQueryWrapper<>();
+			queryWrapper.eq(Coupon::getTitle, coupon.getTitle());
+			queryWrapper.eq(Coupon::getIsDeleted, 0);
+			int nameCount = couponService.count(queryWrapper);
+			if(nameCount > 0) {
+				return AjaxResult.error("代金券名称" + coupon.getTitle() + "已存在!");
+			}
+		}
+		// 使用范围
+		List<CouponTicket> ticketList = new ArrayList<>();
+		if(StringUtils.isNotBlank(couponParam.getBoxIds())) {
+			String[] boxIdArray = couponParam.getBoxIds().split(",");
+	        for (int i = 0; i < boxIdArray.length; i++) {
+	        	String boxId = boxIdArray[i];
+	        	CouponTicket couponTicket = new CouponTicket();
+	        	couponTicket.setBoxId(boxId);
+	        	couponTicket.setCouponId(coupon.getCouponId());
+	        }
+		}
+		try {
+			couponService.updateCoupon(coupon, ticketList);
+		} catch (Exception e) {
+			return AjaxResult.error(e.getMessage());
+		}
+		return AjaxResult.success("代金券'" + coupon.getTitle() + "'编辑成功");
+	}
+
+
+	/**
+	 * 停用、启用代金券
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "停用、启用代金券信息", notes = "代金券管理编辑代金券")
+	@PostMapping("/status")
+	public AjaxResult couponStatus(@RequestBody JSONObject jsonObject) {
+		String couponId = jsonObject.getString("couponId");
+		String status = jsonObject.getString("status");
+		if (StringUtils.isBlank(couponId) || StringUtils.isBlank(status)) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		try {
+			couponService.lambdaUpdate().set(Coupon::getStatus, CouponStatusEnum.PUT_ON.getValue().equals(status)?CouponStatusEnum.PUT_ON:CouponStatusEnum.PUT_OFF).eq(Coupon::getCouponId, couponId).update();
+			// 查询代金券信息
+		} catch (Exception e) {
+			return AjaxResult.error("操作失败");
+		}
+		return AjaxResult.success("操作成功");
+	}
+	
+	
+	/**
+	 * 删除代金券商品(假删)
+	 *
+	 * @param
+	 * @return
+	 */
+	@PostMapping(value = "/remove")
+	public AjaxResult removeCoupon(@RequestBody JSONObject jsonObject) {
+		String couponId = jsonObject.getString("couponId");
+	    if (StringUtils.isBlank(couponId)){
+	      return error(ErrorCodeEnum.ERROR_CODE_1001);
+	    }
+	    Coupon coupon = couponService.getById(couponId);
+		if(null == coupon || StringUtils.isBlank(coupon.getCouponId())) {
+			 return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		// 商品未下架, 不允许删除
+		if(coupon.getStatus().equals("on")) {
+			return AjaxResult.error("代金券未下架,不允许删除");
+		}
+		LambdaUpdateWrapper<Coupon> updateWrapper = new LambdaUpdateWrapper<>();
+		updateWrapper.set(Coupon::getIsDeleted, 1);
+		updateWrapper.eq(Coupon::getCouponId, coupon.getCouponId());
+		boolean res = couponService.update(updateWrapper);
+		if(!res) {
+			return AjaxResult.error("代金券删除失败");
+		}
+		return AjaxResult.success("代金券删除成功");
+	}
+
+}

+ 279 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsMgrController.java

@@ -0,0 +1,279 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.Goods;
+import com.qs.mp.admin.domain.GoodsSku;
+import com.qs.mp.admin.domain.param.GoodsParam;
+import com.qs.mp.admin.domain.param.GoodsQueryParam;
+import com.qs.mp.admin.domain.vo.GoodsVO;
+import com.qs.mp.admin.service.IGoodsService;
+import com.qs.mp.admin.service.IGoodsSkuService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.GoodsStatusEnum;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import ma.glasnost.orika.MapperFacade;
+
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @auther liugl
+ * @create 2022-03-09 23:45:48
+ * @describe 商品管理前端控制器
+ */
+@Api("渠道管理API")
+@RestController
+@RequestMapping("/api/v1/mp/admin/goods/*")
+@Component
+public class GoodsMgrController extends BaseApiController {
+
+	@Autowired
+	private IGoodsService goodsService;
+
+	@Autowired
+	private IGoodsSkuService goodsSkuService;
+
+	@Autowired
+	private MapperFacade mapperFacade;
+
+
+	/**
+	 * 查询商品列表, 支持翻页
+	 *
+	 * @return
+	 */
+	@PostMapping("/list")
+	public TableDataInfo list(@RequestBody GoodsQueryParam queryParam) {
+		startPage();
+		QueryWrapper<Goods> queryWrapper = new QueryWrapper<Goods>();
+		queryWrapper.lambda().like(null != queryParam && StringUtils.isNotBlank(queryParam.getTitle()), Goods::getTitle, queryParam.getTitle());
+		queryWrapper.lambda()
+					.eq(null != queryParam && null != queryParam.getGoodsId() && 0 != queryParam.getGoodsId(),
+							Goods::getGoodsId, queryParam.getGoodsId());
+		// 成本
+		queryWrapper.lambda().ge(null != queryParam && null != queryParam.getMinCost(), Goods::getCost, queryParam.getMinCost());
+		queryWrapper.lambda().le(null != queryParam && null != queryParam.getMaxCost(), Goods::getCost, queryParam.getMaxCost());
+		// 价格
+		queryWrapper.lambda().ge(null != queryParam && null != queryParam.getMinValue(), Goods::getValue, queryParam.getMinValue());
+		queryWrapper.lambda().le(null != queryParam && null != queryParam.getMaxValue(), Goods::getValue, queryParam.getMaxValue());
+		// 状态
+		queryWrapper.lambda().eq(null != queryParam && null != queryParam.getStatus(), Goods::getStatus, queryParam.getStatus());
+		queryWrapper.lambda().eq(Goods::getIsDeleted, 0);
+		queryWrapper.orderByAsc("FIELD(`status`, 'init', 'on', 'off')");
+		queryWrapper.lambda().orderByDesc(Goods::getGoodsId);
+		List<Goods> goodsList = goodsService.list(queryWrapper);
+		TableDataInfo res = getDataTable(goodsList);
+		res.setRows(goodsList);
+		return res;
+	}
+
+	/**
+	 * 获取商品详情信息
+	 *
+	 * @param
+	 * @return
+	 */
+	@PostMapping(value = "/detail")
+	public AjaxResult getGoodsDetail(@RequestBody JSONObject jsonObject) {
+		Long goodsId = jsonObject.getLong("goodsId");
+	    if (null == goodsId || 0 == goodsId){
+	      return error(ErrorCodeEnum.ERROR_CODE_1001);
+	    }
+		Goods goods = goodsService.getById(goodsId);
+		if(null == goods) {
+			 return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		GoodsVO goodsVo = new GoodsVO();
+		BeanUtils.copyProperties(goods, goodsVo);
+		// 查询SKU列表
+		List<GoodsSku> skuList = new ArrayList<>();
+		LambdaQueryWrapper<GoodsSku> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(GoodsSku::getGoodsId, goods.getGoodsId());
+		queryWrapper.orderByDesc(GoodsSku::getCreatedTime);
+		skuList = goodsSkuService.list(queryWrapper);
+		if(null != skuList && skuList.size() > 0) {
+			goodsVo.setSkuList(skuList);
+		}
+		return AjaxResult.success(goodsVo);
+	}
+
+
+	/**
+	 * 新增商品信息
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "新增商品信息", notes = "后台商品管理新增商品")
+	@PostMapping("/create")
+	public AjaxResult goodsCreate(@Validated @RequestBody GoodsParam goodsParam) {
+		Goods goods = mapperFacade.map(goodsParam, Goods.class);
+		// 1、校验名称是否重复(商品表)
+		LambdaQueryWrapper<Goods> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(Goods::getTitle, goods.getTitle());
+		queryWrapper.eq(Goods::getIsDeleted, 0);
+		int titleCount = goodsService.count(queryWrapper);
+		if(titleCount > 0) {
+			return AjaxResult.error("商品名称" + goods.getTitle() + "已存在!");
+		}
+		String description = URLDecoder.decode(goodsParam.getDescription());
+		goods.setDescription(description);
+		goods.setStatus(GoodsStatusEnum.PUT_INIT);
+		// 多SKU
+		List<GoodsSku> skuList = goodsParam.getSkuList();
+		if(goods.getMultiSku() == 1) { //
+			if((null == skuList || skuList.size() == 0)) {
+				return AjaxResult.error("商品" + goods.getTitle() + "不满足多SKU条件!");
+			}else {
+				GoodsSku firstGoodsSku = skuList.get(0);
+				goods.setOriginPrice(firstGoodsSku.getOriginPrice());
+				goods.setExchangePrice(firstGoodsSku.getExchangePrice());
+				goods.setValue(firstGoodsSku.getValue());
+				goods.setCost(firstGoodsSku.getCost());
+				// 累计库存
+				int totalQuantity = skuList.stream().mapToInt(GoodsSku::getQuantity).sum();
+				goods.setQuantity(totalQuantity);
+			}
+		}
+		if(null == goods.getOriginPrice()) {
+			goods.setOriginPrice(goods.getExchangePrice());
+		}
+		// 3.插入数据
+		try {
+			goodsService.saveGoods(goods, skuList);
+		} catch (Exception e) {
+			return AjaxResult.error("商品'" + goods.getTitle() + "'新增失败" + e.getMessage());
+		}
+		return AjaxResult.success("商品'" + goods.getTitle() + "'新增成功");
+	}
+
+	/**
+	 * 编辑商品信息
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "编辑商品信息", notes = "后台商品管理修改商品信息")
+	@PostMapping("/update")
+	public AjaxResult goodsUpdate(@Validated @RequestBody GoodsParam goodsParam) {
+		if (null == goodsParam || null == goodsParam.getGoodsId() || 0 == goodsParam.getGoodsId()) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		Goods oldGoods = goodsService.getById(goodsParam.getGoodsId());
+		if(null == oldGoods || null == oldGoods.getGoodsId()) {
+			return AjaxResult.error("商品'" + oldGoods.getTitle() + "'编辑失败,商品ID异常");
+		}
+		Goods goods = mapperFacade.map(goodsParam, Goods.class);
+		// 1、校验名称是否重复(商品表)
+		if(!goods.getTitle().equals(oldGoods.getTitle())) {
+			LambdaQueryWrapper<Goods> queryWrapper = new LambdaQueryWrapper<>();
+			queryWrapper.eq(Goods::getTitle, goods.getTitle());
+			queryWrapper.eq(Goods::getIsDeleted, 0);
+			int titleCount = goodsService.count(queryWrapper);
+			if(titleCount > 0) {
+				return AjaxResult.error("商品名称" + goods.getTitle() + "已存在!");
+			}
+		}
+		String description = URLDecoder.decode(goodsParam.getDescription());
+		goods.setDescription(description);
+		// 多SKU
+		List<GoodsSku> skuList = goodsParam.getSkuList();
+		if(goods.getMultiSku() == 1) {
+			if((null == skuList || skuList.size() == 0)) {
+				return AjaxResult.error("商品" + goods.getTitle() + "不满足多SKU条件!");
+			}else {
+				GoodsSku firstGoodsSku = skuList.get(0);
+				goods.setExchangePrice(firstGoodsSku.getExchangePrice());
+				goods.setValue(firstGoodsSku.getValue());
+				goods.setCost(firstGoodsSku.getCost());
+				if(null == firstGoodsSku.getOriginPrice()) {
+					goods.setOriginPrice(firstGoodsSku.getExchangePrice());
+				}else {
+					goods.setOriginPrice(firstGoodsSku.getOriginPrice());
+				}
+				// 累计库存
+				int totalQuantity = skuList.stream().mapToInt(GoodsSku::getQuantity).sum();
+				goods.setQuantity(totalQuantity);
+			}
+		}
+		// 3.插入数据
+		try {
+			goodsService.updateGoods(goods, skuList);
+		} catch (Exception e) {
+			return AjaxResult.error("商品'" + goods.getTitle() + "'新增失败" + e.getMessage());
+		}
+		return AjaxResult.success("商品'" + goods.getTitle() + "'新增成功");
+	}
+
+
+
+	/**
+	 * 停用、启用商品
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "停用、启用商品", notes = "停用、启用商品")
+	@PostMapping("/status")
+	public AjaxResult goodsStatus(@RequestBody JSONObject jsonObject) {
+		String goodsId = jsonObject.getString("goodsId");
+
+		GoodsStatusEnum status = GoodsStatusEnum.getStatusEnum(jsonObject.getString("status"));
+		if (StringUtils.isBlank(goodsId) || null == status) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		try {
+			goodsService.lambdaUpdate().set(Goods::getStatus, status).eq(Goods::getGoodsId, goodsId).update();
+			// 查询代金券信息
+		} catch (Exception e) {
+			return AjaxResult.error("操作失败");
+		}
+		return AjaxResult.success("操作成功");
+	}
+
+
+	/**
+	 * 删除商品(假删)
+	 *
+	 * @param
+	 * @return
+	 */
+	@PostMapping(value = "/remove")
+	public AjaxResult removeGoods(@RequestBody JSONObject jsonObject) {
+		Long goodsId = jsonObject.getLong("goodsId");
+	    if (null == goodsId || 0 == goodsId){
+	      return error(ErrorCodeEnum.ERROR_CODE_1001);
+	    }
+		Goods goods = goodsService.getById(goodsId);
+		if(null == goods || null == goods.getGoodsId() || 0 == goods.getGoodsId()) {
+			 return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		// 商品未下架, 不允许删除
+		if(goods.getStatus().equals("on")) {
+			return AjaxResult.error("商品未下架,不允许删除");
+		}
+		LambdaUpdateWrapper<Goods> updateWrapper = new LambdaUpdateWrapper<>();
+		updateWrapper.set(Goods::getIsDeleted, 1);
+		updateWrapper.eq(Goods::getGoodsId, goods.getGoodsId());
+		boolean res = goodsService.update(updateWrapper);
+		if(!res) {
+			return AjaxResult.error("商品删除失败");
+		}
+		return AjaxResult.success("商品删除成功");
+	}
+
+}

+ 285 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java

@@ -0,0 +1,285 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.ChannelUserRel;
+import com.qs.mp.channel.domain.param.ChannelParam;
+import com.qs.mp.channel.domain.param.SaleSiteParam;
+import com.qs.mp.channel.domain.vo.ChannelOperDataVO;
+import com.qs.mp.channel.domain.vo.ChannelVO;
+import com.qs.mp.channel.service.IChannelOrderService;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.common.constant.UserConstants;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ChannelRoleEnum;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.system.domain.SysUser;
+import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import ma.glasnost.orika.MapperFacade;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @auther zhongcp
+ * @create 2022-02-28 16:17:48
+ * @describe 经销商管理前端控制器
+ */
+@Api("经销商管理API")
+@RestController
+@RequestMapping("/api/v1/mp/admin/salesite/*")
+@Component
+public class SaleSiteMgrController extends BaseApiController {
+
+	@Autowired
+	private IChannelService channelService;
+	
+	@Autowired
+	private IChannelUserRelService channelUserRelService;
+	
+	@Autowired
+	private IChannelOrderService channelOrderService;
+	
+	@Autowired
+	private ISysUserService userService;
+	
+	@Autowired
+	private MapperFacade mapperFacade;
+
+
+	/**
+	 * 获取经销商列表信息,支持翻页
+	 *
+	 * @return
+	 */
+	@PostMapping("/list")
+	public TableDataInfo listChannel(@RequestBody Channel channel) {
+		List<ChannelVO> list = new ArrayList<ChannelVO>();
+		startPage();
+		QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
+		if(null!=channel && null != channel.getParentId()) {
+			queryWrapper.eq("t1.parent_id", channel.getParentId());
+		}
+		queryWrapper.eq("t1.level", 0);
+		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getMobile()), "t1.mobile", channel.getMobile());
+		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getName()), "t1.name", channel.getName());
+		queryWrapper.eq(null != channel && null != channel.getProvinceId(), "t1.province_id", channel.getProvinceId());
+		queryWrapper.eq(null != channel && null != channel.getCityId(), "t1.city_id", channel.getCityId());
+		queryWrapper.eq(null != channel && null != channel.getAreaId(), "t1.area_id", channel.getAreaId());
+		queryWrapper.orderByDesc("t1.channel_id");
+		list = channelService.selectChannelVoList(queryWrapper);
+		if(null != list && list.size() > 0) {
+			for(ChannelVO channelVO : list) {
+				if(null != channelVO && StringUtils.isNotBlank(channelVO.getChannelNo())) {
+					// int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
+					LambdaQueryWrapper<ChannelUserRel> userCntQueryWrapper = new LambdaQueryWrapper<ChannelUserRel>();
+					userCntQueryWrapper.eq(ChannelUserRel::getChannelId, channelVO.getChannelId());
+					int userCnt = channelUserRelService.count(userCntQueryWrapper);
+					channelVO.setUserCnt(userCnt);
+					// 查询用户信息
+					//SysUser sysUser = userService.selectUserById(channelVO.getUserId());
+					// channelVO.setSysUser(sysUser);
+ 				}
+			}
+		}
+		return getDataTable(list);
+	}
+	
+	
+	/**
+	 * 新增经销商信息
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "新增经销商信息", notes = "经销商端新增经销商")
+	@PostMapping("/create")
+	public AjaxResult channelCreate(@Validated @RequestBody SaleSiteParam channelParam) {
+		if (channelParam.getChannelId() != null && channelParam.getChannelId() != 0) {
+			return AjaxResult.error("该经销商已存在");
+		}
+		Channel channel = mapperFacade.map(channelParam, Channel.class);
+		// 1、校验名称是否重复、手机号是否存在(经销商表)
+		LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(Channel::getName, channel.getName());
+		queryWrapper.eq(Channel::getLevel, 0);
+		int nameCount = channelService.count(queryWrapper);
+		if(nameCount > 0) {
+			return AjaxResult.error("经销商名称" + channel.getName() + "已存在!");
+		}
+		int mobileCount = channelService.count(
+		        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
+		if(mobileCount > 0) {
+			 return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+		}
+		// 2.校验佣金比例,不能高于其父经销商的佣金比例
+		if(null != channel.getParentId() && channel.getParentId() != 0) {
+			Channel parentChannel = channelService.getById(channel.getParentId());
+			if(null != parentChannel) {
+				 if(null != parentChannel.getCommRate() 
+						 && channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
+					 return AjaxResult.error("佣金比例不能高于父经销商的佣金比例");
+				 }
+				 channel.setLevel(parentChannel.getLevel()+1);
+				 channel.setChannelNo(parentChannel.getChannelNo()+".");
+			}else {
+				return AjaxResult.error("父经销商不存在");
+			}
+			
+		}else {
+			channel.setLevel(1);
+			channel.setChannelNo("");
+		}
+		// 3.插入数据
+		try {
+			channelService.saveChannel(channel,ChannelRoleEnum.SALESITE);
+		} catch (Exception e) {
+			return AjaxResult.error("经销商'" + channel.getName() + "'新增失败" + e.getMessage());
+		}
+		
+		return AjaxResult.success("经销商'" + channel.getName() + "'新增成功");
+	}
+
+	/**
+	 * 编辑经销商信息
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "编辑经销商信息", notes = "经销商端编辑经销商")
+	@PostMapping("/update")
+	public AjaxResult channelUpdate(@Validated @RequestBody ChannelParam channelParam) {
+		if (null == channelParam || null == channelParam.getChannelId()) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		Channel channel = mapperFacade.map(channelParam, Channel.class);
+		// 1、校验修改子经销商是否为当前用户的子经销商
+		Channel oldChannel = channelService.getById(channel.getChannelId());
+		if(null == oldChannel || null == oldChannel.getChannelId()) {
+			return AjaxResult.error("经销商'" + oldChannel.getName() + "'编辑失败,ID异常");
+		}
+		// 2.校验名称是否重复、手机号是否存在(经销商表);
+		if(!channel.getName().equals(oldChannel.getName())) {
+			LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<>();
+			queryWrapper.eq(Channel::getName, channel.getName());
+			queryWrapper.eq(Channel::getLevel, 0);
+			int nameCount = channelService.count(queryWrapper);
+			if(nameCount > 0) {
+				return AjaxResult.error("经销商名称" + channel.getName() + "已存在!");
+			}
+		}
+		boolean mobileChange = false;  // 手机号码是否有变更
+		if(!channel.getMobile().equals(oldChannel.getMobile())) {
+			int mobileCount = channelService.count(
+			        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
+			if(mobileCount > 0) {
+				return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+			}
+			if(UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(channel.getMobile()))) {
+				return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+			}
+			mobileChange = true;
+		}
+		// 3.校验佣金比例,不能高于其父经销商的佣金比例,不能低于其子经销商的最大佣金比例
+		Channel parentChannel = channelService.getById(oldChannel.getParentId());
+		if(null != parentChannel) {
+			 if(null != parentChannel.getCommRate() 
+					 && channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
+				 return AjaxResult.error("佣金比例不能高于父经销商的佣金比例");
+			 }
+			 channel.setLevel(parentChannel.getLevel()+1);
+			 channel.setChannelNo(parentChannel.getChannelNo()+".");
+		}else {
+			return AjaxResult.error("父经销商不存在");
+		}
+		try {
+			channelService.updateChannel(channel, mobileChange);
+		} catch (Exception e) {
+			return AjaxResult.error(e.getMessage());
+		}
+		return AjaxResult.success("经销商'" + channel.getName() + "'编辑成功");
+	}
+	
+	
+	/**
+	 * 停用、启用经销商
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "停用、启用经销商信息", notes = "经销商管理编辑经销商")
+	@PostMapping("/status")
+	public AjaxResult channelStatus(@RequestBody JSONObject jsonObject) {
+		String channelId = jsonObject.containsKey("channelId")?jsonObject.get("channelId").toString():"";
+		String status = jsonObject.containsKey("status")?jsonObject.get("status").toString():"";
+		if (null == jsonObject || StringUtils.isBlank(channelId)
+				|| StringUtils.isBlank(status)) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		try {
+			channelService.lambdaUpdate().set(Channel::getStatus, status).eq(Channel::getChannelId, channelId).update();
+			// 查询经销商信息
+//			Channel channel = channelService.getById(channelId);
+//			if(null != channel && null != channel.getUserId()) {
+//				SysUser sysUser = new SysUser();
+//				sysUser.setUserId(channel.getUserId());
+//				sysUser.setStatus(status);
+//				userService.updateUserStatus(sysUser);
+//			}
+		} catch (Exception e) {
+			return AjaxResult.error("操作失败");
+		}
+		return AjaxResult.success("操作成功");
+	}
+	
+	
+	/**
+	 * 查询经销商详情
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "查询经销商详情信息", notes = "经销商管理编辑子经销商查询经销商详情")
+	@PostMapping("/detail")
+	public AjaxResult getChannelDetail(@RequestBody JSONObject jsonObject) {
+		String channelId = (null != jsonObject && jsonObject.containsKey("channelId"))?jsonObject.getString("channelId"):"";
+		if (StringUtils.isBlank(channelId)) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		ChannelVO channelVO = channelService.getChannelVoById(Long.valueOf(channelId));
+		if(null == channelVO || null == channelVO.getChannelId()) {
+			 return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		if(null != channelVO && StringUtils.isNotBlank(channelVO.getChannelNo())) {
+			// int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
+			LambdaQueryWrapper<ChannelUserRel> userCntQueryWrapper = new LambdaQueryWrapper<ChannelUserRel>();
+			userCntQueryWrapper.eq(ChannelUserRel::getChannelId, channelVO.getChannelId());
+			int userCnt = channelUserRelService.count(userCntQueryWrapper);
+			channelVO.setUserCnt(userCnt);
+		}
+	    // 查询经销商销售额、佣金收入、订单数等
+	    ChannelOperDataVO channelOperDataVO = channelService.getChannelTotalOperData(channelVO.getChannelNo());
+		LambdaQueryWrapper<ChannelOrder> queryWrapper = new LambdaQueryWrapper<ChannelOrder>();
+		queryWrapper.eq(ChannelOrder::getChannelId, channelId);
+		int orderCnt = channelOrderService.count(queryWrapper);
+		channelOperDataVO.setOrderCnt(orderCnt);
+	    channelVO.setOperData(channelOperDataVO);
+		return AjaxResult.success(channelVO);
+	}
+	
+}

+ 353 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java

@@ -0,0 +1,353 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.excel.TicketExcel;
+import com.qs.mp.admin.domain.param.BathIdParam;
+import com.qs.mp.admin.domain.param.TicketBoxCreateParam;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.param.ChannelParam;
+import com.qs.mp.channel.domain.vo.ChannelVO;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.common.annotation.Log;
+import com.qs.mp.common.constant.UserConstants;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.BusinessType;
+import com.qs.mp.common.enums.ChannelRoleEnum;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.common.utils.RSAUtil;
+import com.qs.mp.system.domain.SysUser;
+import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.utils.ExcelUtil;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import ma.glasnost.orika.MapperFacade;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @auther zhongcp
+ * @create 2022-02-28 16:17:48
+ * @describe 盲票管理前端控制器
+ */
+@Api("渠道管理API")
+@RestController
+@RequestMapping("/api/v1/mp/admin/ticket/box/*")
+@Component
+public class TicketBoxMgrController extends BaseApiController {
+
+	@Autowired
+	private ITicketBoxService ticketBoxService;
+
+	@Autowired
+	private IChannelUserRelService channelUserRelService;
+
+	@Autowired
+	private ISysUserService userService;
+
+	@Autowired
+	private ITicketService ticketService;
+
+	@Autowired
+	private MapperFacade mapperFacade;
+
+
+	@Value("${wx-channel.appId}")
+	private String channelAppId;
+
+
+	@Value("${mp.exportUrl}")
+	private String exportUrl;
+
+	@Value("${export.page-size}")
+	private int pageSize;
+
+	/**
+	 * 查询所有盲票组列表
+	 *
+	 * @return
+	 */
+	@PostMapping("/list")
+	public TableDataInfo list(@RequestBody TicketBox ticketBox) {
+		startPage();
+		List<TicketBox> list = ticketBoxService.list(new QueryWrapper<>());
+		return getDataTable(list);
+	}
+
+	/**
+	 * 新增盲票
+	 *
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "新增盲票", notes = "管理端创建盲票")
+	@PostMapping("/create")
+	public AjaxResult create(@Validated @RequestBody TicketBoxCreateParam param) {
+		if (param.getType() == TicketTypeEnum.OFFLINE) {
+			if (param.getPkgSalePrice() == null || param.getPkgSalePrice() == 0) {
+				return AjaxResult.error("采购单价必须大于0");
+			}
+			if (param.getPkgUnit() == null || param.getPkgUnit() == 0) {
+				return AjaxResult.error("每包张数必须大于0");
+			}
+		}
+		boolean rtn = ticketBoxService.createTicketBox(param);
+		return rtn ? AjaxResult.success() : AjaxResult.error("创建失败");
+	}
+
+	/**
+	 * 盲票上下架
+	 *
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "盲票上下架", notes = "管理端盲票上下架")
+	@PostMapping("/put")
+	public AjaxResult putOnOff(@RequestBody TicketBox param) {
+		if (StringUtils.isBlank(param.getBoxId()) || param.getStatus() == null) {
+				return AjaxResult.error("参数缺失");
+		}
+		TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+		if (param.getStatus() == TicketBoxStatusEnum.PUT_OFF) {
+			if (ticketBox.getStatus() != TicketBoxStatusEnum.PUT_ON) {
+				return AjaxResult.error("当前状态不是已上架,不能下架");
+			}
+			ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
+					.set(TicketBox::getStatus, TicketBoxStatusEnum.PUT_OFF)
+					.set(TicketBox::getManualOff, 1)
+					.eq(TicketBox::getBoxId, ticketBox.getBoxId()));
+		} else if (param.getStatus() == TicketBoxStatusEnum.PUT_ON) {
+			if (ticketBox.getStatus() != TicketBoxStatusEnum.PUT_OFF && ticketBox.getStatus() != TicketBoxStatusEnum.DONE) {
+				return AjaxResult.error("当前状态不是待上架或已下架,不能上架");
+			}
+			ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
+					.eq(TicketBox::getBoxId, ticketBox.getBoxId()));
+		}
+
+		return AjaxResult.success("操作成功");
+	}
+
+	/**
+	 * 盲票删除
+	 *
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "盲票删除", notes = "管理端盲票删除")
+	@PostMapping("/remove")
+	public AjaxResult remove(@RequestBody TicketBox param) {
+		if (StringUtils.isBlank(param.getBoxId())) {
+			return AjaxResult.error("参数缺失");
+		}
+		TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+		if (ticketBox.getStatus() != TicketBoxStatusEnum.DONE) {
+			return AjaxResult.error("当前状态不是待上架,不能删除");
+		}
+		ticketBoxService.removeTicketBox(param.getBoxId());
+		return AjaxResult.success("删除成功");
+	}
+
+	@Log(title = "盲票导出", businessType = BusinessType.EXPORT)
+	@PostMapping("/export")
+	public AjaxResult exportTicket(@RequestBody BathIdParam ids) {
+		if (null == ids || null == ids.getIds() || ids.getIds().size() == 0) {
+			return AjaxResult.error("请选择需要导出的盲票组");
+		}
+		TicketBox ticketBox = ticketBoxService.getById(ids.getIds().get(0));
+		if (null == ticketBox || StringUtils.isBlank(ticketBox.getBoxId())) {
+			return AjaxResult.error("选择的盲票组数据异常, 请联系管理员或重试");
+		}
+		List<TicketExcel> excelList = new ArrayList<TicketExcel>();
+		List<Ticket> listAll = new ArrayList<Ticket>();
+		// 首先查询要导出的数据总数
+		LambdaQueryWrapper<Ticket> queryWrapper = new LambdaQueryWrapper<Ticket>();
+		queryWrapper.eq(Ticket::getBoxId, ids.getIds().get(0));
+		int totalSize = ticketService.count(queryWrapper);
+		if (totalSize == 0) {
+			return AjaxResult.error("选择的盲票组中没有可导出的数据");
+		}
+
+		if(totalSize > pageSize) {
+			int totalPage = totalSize%pageSize == 0 ? totalSize/pageSize : totalSize/pageSize+1;
+			for (int i = 0; i < totalPage; i++) {
+				LambdaQueryWrapper<Ticket> pageQueryWrapper = new LambdaQueryWrapper<Ticket>();
+				pageQueryWrapper.select(Ticket::getSerialNo, Ticket::getDrawNum, Ticket::getCipherLuckyNum);
+				pageQueryWrapper.eq(Ticket::getBoxId, ids.getIds().get(0));
+				pageQueryWrapper.last("limit "+ (i*pageSize) +", " + pageSize);
+				List<Ticket> list = ticketService.list(pageQueryWrapper);
+				if(null != list && list.size() > 0 ) {
+					listAll.addAll(list);
+				}
+			}
+		}else {
+			listAll = ticketService.list(queryWrapper);
+		}
+
+		if(null != listAll && listAll.size() > 0 ) {
+			listAll.sort(Comparator.comparing(Ticket::getSerialNo));
+			for (Ticket ticket : listAll) {
+				if (null != ticket && StringUtils.isNotBlank(ticket.getSerialNo())
+						&& StringUtils.isNotBlank(ticket.getDrawNum())
+						&& StringUtils.isNotBlank(ticket.getCipherLuckyNum())) {
+					TicketExcel ticketExcel = new TicketExcel();
+					ticketExcel.setSerialNo(ticket.getSerialNo());
+					ticketExcel.setUrl(exportUrl + ticket.getSerialNo());
+					ticketExcel.setDrawNum(ticket.getDrawNum());
+					ticketExcel.setCipherLuckyNum(RSAUtil.decrypt(ticket.getCipherLuckyNum()));
+					excelList.add(ticketExcel);
+				}
+			}
+		}
+
+		ExcelUtil<TicketExcel> util = new ExcelUtil<TicketExcel>(TicketExcel.class);
+		return util.exportExcel(excelList, ticketBox.getTitle(), false);
+	}
+
+
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<TicketExcel> util = new ExcelUtil<TicketExcel>(TicketExcel.class);
+        return util.importTemplateExcel("盲票导出数据",false);
+    }
+
+	@Log(title = "盲票导入", businessType = BusinessType.IMPORT)
+	@PostMapping("/importTicket")
+	public AjaxResult importTicket(MultipartFile file) {
+		// 获取文件内的盲票数据列表
+		try {
+			ExcelUtil<TicketExcel> util = new ExcelUtil<TicketExcel>(TicketExcel.class);
+			List<TicketExcel> ticketExcelList = util.importExcel(file.getInputStream());
+			if(null == ticketExcelList || ticketExcelList.size() == 0) {
+				return AjaxResult.error("导入失败,选择的导入文件中没有有效的数据");
+			}
+			int successNum = ticketService.importTicket(ticketExcelList);
+			if(successNum == 0) {
+				return AjaxResult.error("导入失败,请联系管理员");
+			}
+			return AjaxResult.success("导入成功, 导入数据条数:"+successNum);
+			// 数据处理 TODO
+		} catch (Exception e) {
+			return AjaxResult.error("导入失败,请联系管理员");
+		}
+	}
+
+
+	@Log(title = "导出印刷", businessType = BusinessType.EXPORT)
+	@PostMapping("/exportDraw")
+	public AjaxResult exportDraw(@RequestBody BathIdParam ids) {
+		if (null == ids || null == ids.getIds() || ids.getIds().size() == 0) {
+			return AjaxResult.error("请选择需要导出的盲票组");
+		}
+		TicketBox ticketBox = ticketBoxService.getById(ids.getIds().get(0));
+		if (null == ticketBox || StringUtils.isBlank(ticketBox.getBoxId())) {
+			return AjaxResult.error("选择的盲票组数据异常, 请联系管理员或重试");
+		}
+		List<TicketExcel> excelList = new ArrayList<TicketExcel>();
+		List<Ticket> listAll = new ArrayList<Ticket>();
+		// 首先查询要导出的数据总数
+		LambdaQueryWrapper<Ticket> queryWrapper = new LambdaQueryWrapper<Ticket>();
+		queryWrapper.eq(Ticket::getBoxId, ids.getIds().get(0));
+		int totalSize = ticketService.count(queryWrapper);
+		if (totalSize == 0) {
+			return AjaxResult.error("选择的盲票组中没有可导出的数据");
+		}
+
+		if(totalSize > pageSize) {
+			int totalPage = totalSize%pageSize == 0 ? totalSize/pageSize : totalSize/pageSize+1;
+			for (int i = 0; i < totalPage; i++) {
+				LambdaQueryWrapper<Ticket> pageQueryWrapper = new LambdaQueryWrapper<Ticket>();
+				pageQueryWrapper.select(Ticket::getSerialNo, Ticket::getDrawNum, Ticket::getCipherLuckyNum);
+				pageQueryWrapper.eq(Ticket::getBoxId, ids.getIds().get(0));
+				pageQueryWrapper.last("limit "+ (i*pageSize) +", " + pageSize);
+				List<Ticket> list = ticketService.list(pageQueryWrapper);
+				if(null != list && list.size() > 0 ) {
+					listAll.addAll(list);
+				}
+			}
+		}else {
+			listAll = ticketService.list(queryWrapper);
+		}
+
+		if(null != listAll && listAll.size() > 0 ) {
+			listAll.sort(Comparator.comparing(Ticket::getSerialNo));
+			for (Ticket ticket : listAll) {
+				if (null != ticket && StringUtils.isNotBlank(ticket.getSerialNo())
+						&& StringUtils.isNotBlank(ticket.getDrawNum())
+						&& StringUtils.isNotBlank(ticket.getCipherLuckyNum())) {
+					TicketExcel ticketExcel = new TicketExcel();
+					ticketExcel.setSerialNo(ticket.getSerialNo());
+					ticketExcel.setUrl(exportUrl + ticket.getSerialNo());
+					ticketExcel.setDrawNum(formatDraw(ticket.getDrawNum()));
+					ticketExcel.setCipherLuckyNum(RSAUtil.decrypt(ticket.getCipherLuckyNum()));
+					excelList.add(ticketExcel);
+				}
+			}
+		}
+
+		ExcelUtil<TicketExcel> util = new ExcelUtil<TicketExcel>(TicketExcel.class);
+		return util.exportExcel(excelList, ticketBox.getTitle(), false);
+	}
+
+
+	/**
+	 * 导出印刷格式化
+	 * @param drawNum
+	 * @return
+	 */
+	private String formatDraw(String drawNum) {
+		if(StringUtils.isNotBlank(drawNum)) {
+			try {
+				List<String> drawList = new ArrayList<String>();
+				JSONArray jsonArray = JSONArray.parseArray(drawNum);
+				if(null != jsonArray && jsonArray.size() > 0) {
+					for (int i = 0; i < jsonArray.size(); i++) {
+						JSONObject jo = jsonArray.getJSONObject(i);
+						if(null != jo && jo.containsKey("name")
+								&& jo.containsKey("num")) {
+							drawList.add(jo.getString("name")+jo.getString("num"));
+						}
+					}
+				}
+				if(null != drawList && drawList.size() >0) {
+					return StringUtils.join(drawList.toArray(), " ");
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return "";
+
+	}
+
+
+}

+ 212 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserDeliverOrderMgrController.java

@@ -0,0 +1,212 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.excel.TicketExcel;
+import com.qs.mp.admin.domain.param.BathIdParam;
+import com.qs.mp.admin.domain.param.UserDeliverOrderQueryParam;
+import com.qs.mp.channel.domain.param.OrderPayParam;
+import com.qs.mp.common.annotation.Log;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.BizTypeEnum;
+import com.qs.mp.common.enums.BusinessType;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.PrizeStorageStatusEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.RSAUtil;
+import com.qs.mp.framework.redis.RedisKey;
+import com.qs.mp.pay.service.IWalletService;
+import com.qs.mp.user.domain.UserAddr;
+import com.qs.mp.user.domain.UserDeliverOrder;
+import com.qs.mp.user.domain.UserDeliverOrderItem;
+import com.qs.mp.user.domain.UserPrizeStorage;
+import com.qs.mp.user.domain.excel.DeliverOrderExcel;
+import com.qs.mp.user.domain.param.DeliverOrderParam;
+import com.qs.mp.user.domain.vo.DeliverOrderSettleVO;
+import com.qs.mp.user.domain.vo.UserDeliverOrderVO;
+import com.qs.mp.user.service.IUserAddrService;
+import com.qs.mp.user.service.IUserDeliverOrderItemService;
+import com.qs.mp.user.service.IUserDeliverOrderService;
+import com.qs.mp.user.service.IUserPrizeStorageService;
+import com.qs.mp.utils.ExcelUtil;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import javax.validation.Valid;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/v1/admin/deliver/order")
+@Api(tags = "用户提货订单接口")
+@AllArgsConstructor
+public class UserDeliverOrderMgrController extends BaseApiController {
+
+	@Autowired
+	private IUserDeliverOrderService userDeliverOrderService;
+
+	@Autowired
+	private IUserDeliverOrderItemService userDeliverOrderItemService;
+
+	@Autowired
+	private IUserPrizeStorageService userPrizeStorageService;
+
+	@Autowired
+	private IUserAddrService userAddrService;
+
+	@Autowired
+	private IWalletService walletService;
+
+	@Autowired
+	private MapperFacade mapperFacade;
+
+	@Autowired
+	private RedisCache redisCache;
+
+	/**
+	 * 用户提货订单列表
+	 */
+	@PostMapping("/list")
+	@ApiOperation(value = "用户提货订单列表", notes = "获取用户提货订单列表")
+	public TableDataInfo list(@RequestBody UserDeliverOrderQueryParam queryParam) {
+		startPage();
+		QueryWrapper<UserDeliverOrder> queryWrapper = new QueryWrapper<UserDeliverOrder>();
+		queryWrapper.eq(null != queryParam && StringUtils.isNotBlank(queryParam.getOrderId()), "t1.order_id" ,queryParam.getOrderId());
+		queryWrapper.eq(null != queryParam && null != queryParam.getStatus(), "t1.`status`" ,queryParam.getStatus());
+		queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "t1.create_time", queryParam.getStartTime());
+		queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.create_time", queryParam.getEndTime());
+		queryWrapper.like(null != queryParam && StringUtils.isNotBlank(queryParam.getNickName()), "t2.nick_name", queryParam.getNickName());
+		queryWrapper.like(null != queryParam && StringUtils.isNotBlank(queryParam.getTitle()), "t3.title", queryParam.getTitle());
+		queryWrapper.orderByDesc("t1.order_id");
+		List<UserDeliverOrderVO> userDeliverOrderVOList = userDeliverOrderService.selectUserDeliverOrderVoList(queryWrapper);
+		for (UserDeliverOrderVO userDeliverOrderVO : userDeliverOrderVOList) {
+			userDeliverOrderVO.setItems(userDeliverOrderItemService.list(new LambdaQueryWrapper<UserDeliverOrderItem>()
+					.eq(UserDeliverOrderItem::getOrderId, userDeliverOrderVO.getOrderId())));
+		}
+		TableDataInfo rspData = getDataTable(userDeliverOrderVOList);
+		return rspData;
+	}
+
+	/**
+	 * 订单详情
+	 */
+	@PostMapping("/detail")
+	@ApiOperation(value = "订单详情", notes = "在订单列表页面查看详情")
+	public AjaxResult query(@RequestBody UserDeliverOrder order) {
+		if (null == order || StringUtils.isBlank(order.getOrderId())) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		LambdaQueryWrapper<UserDeliverOrder> queryWrapper = new LambdaQueryWrapper<UserDeliverOrder>();
+		queryWrapper.eq(UserDeliverOrder::getOrderId, order.getOrderId());
+		UserDeliverOrder userDeliverOrder = userDeliverOrderService.getOne(queryWrapper);
+		UserDeliverOrderVO userDeliverOrderVO = mapperFacade.map(userDeliverOrder, UserDeliverOrderVO.class);
+		userDeliverOrderVO.setItems(userDeliverOrderItemService.list(new LambdaQueryWrapper<UserDeliverOrderItem>()
+				.eq(UserDeliverOrderItem::getOrderId, userDeliverOrderVO.getOrderId())));
+		return AjaxResult.success(userDeliverOrderVO);
+	}
+
+	/**
+	 * 订单发货
+	 */
+	@PostMapping("/ship")
+	@ApiOperation(value = "订单发货", notes = "在订单发货页面提交")
+	public AjaxResult ship(@RequestBody UserDeliverOrder order) {
+
+		return AjaxResult.success();
+	}
+
+	@Log(title = "导出", businessType = BusinessType.EXPORT)
+	@PostMapping("/export")
+	public AjaxResult export(@RequestBody UserDeliverOrderQueryParam queryParam) {
+
+		List<DeliverOrderExcel> excelList = new ArrayList<DeliverOrderExcel>();
+		List<UserDeliverOrderVO> listAll = new ArrayList<UserDeliverOrderVO>();
+		// 首先查询要导出的数据总数
+		QueryWrapper<UserDeliverOrder> queryWrapper = new QueryWrapper<UserDeliverOrder>();
+		queryWrapper.eq(null != queryParam && StringUtils.isNotBlank(queryParam.getOrderId()), "t1.order_id" ,queryParam.getOrderId());
+		queryWrapper.eq(null != queryParam && null != queryParam.getStatus(), "t1.`status`" ,queryParam.getStatus());
+		queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "t1.create_time", queryParam.getStartTime());
+		queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.create_time", queryParam.getEndTime());
+		queryWrapper.like(null != queryParam && StringUtils.isNotBlank(queryParam.getNickName()), "t2.nick_name", queryParam.getNickName());
+		queryWrapper.like(null != queryParam && StringUtils.isNotBlank(queryParam.getTitle()), "t3.title", queryParam.getTitle());
+		queryWrapper.orderByDesc("t1.order_id");
+		int totalSize = userDeliverOrderService.selectUserDeliverOrderCount(queryWrapper);
+		if (totalSize == 0) {
+			return AjaxResult.error("没有符合条件的用户提货订单");
+		}
+		int pageSize = 2000;
+		if (totalSize > pageSize) {
+			int totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
+			for (int i = 0; i < totalPage; i++) {
+				queryWrapper.last("limit " + (i * pageSize) + ", " + pageSize);
+				List<UserDeliverOrderVO> userDeliverOrderVOList = userDeliverOrderService.selectUserDeliverOrderVoList(queryWrapper);
+				for (UserDeliverOrderVO userDeliverOrderVO : userDeliverOrderVOList) {
+					userDeliverOrderVO.setItems(userDeliverOrderItemService.list(new LambdaQueryWrapper<UserDeliverOrderItem>()
+							.eq(UserDeliverOrderItem::getOrderId, userDeliverOrderVO.getOrderId())));
+				}
+				if (null != userDeliverOrderVOList && userDeliverOrderVOList.size() > 0) {
+					listAll.addAll(userDeliverOrderVOList);
+				}
+			}
+		} else {
+			listAll = userDeliverOrderService.selectUserDeliverOrderVoList(queryWrapper);
+			for (UserDeliverOrderVO userDeliverOrderVO : listAll) {
+				userDeliverOrderVO.setItems(userDeliverOrderItemService.list(new LambdaQueryWrapper<UserDeliverOrderItem>()
+						.eq(UserDeliverOrderItem::getOrderId, userDeliverOrderVO.getOrderId())));
+			}
+		}
+
+		if (null != listAll && listAll.size() > 0) {
+			listAll.sort(Comparator.comparing(UserDeliverOrderVO::getOrderId));
+			for (UserDeliverOrderVO deliverOrder : listAll) {
+				if (null != deliverOrder && StringUtils.isNotBlank(deliverOrder.getOrderId())
+						&& StringUtils.isNotBlank(deliverOrder.getReceiver())
+						&& StringUtils.isNotBlank(deliverOrder.getTel())
+						&& StringUtils.isNotBlank(deliverOrder.getProvince())
+						&& StringUtils.isNotBlank(deliverOrder.getCity())
+						&& StringUtils.isNotBlank(deliverOrder.getArea())
+						&& StringUtils.isNotBlank(deliverOrder.getAddress()) && null != deliverOrder.getItems()
+						&& deliverOrder.getItems().size() > 0) {
+					for (UserDeliverOrderItem userDeliverOrderItem : deliverOrder.getItems()) {
+						if (null != userDeliverOrderItem) {
+							DeliverOrderExcel deliverOrderExcel = new DeliverOrderExcel();
+							deliverOrderExcel.setTitle(userDeliverOrderItem.getTitle());
+							deliverOrderExcel.setProperties(userDeliverOrderItem.getProperties());
+							deliverOrderExcel.setGoodsNum(userDeliverOrderItem.getGoodsNum());
+							deliverOrderExcel.setCreatedTime(deliverOrder.getCreatedTime());
+							deliverOrderExcel.setOrderId(deliverOrder.getOrderId());
+							deliverOrderExcel.setReceiver(deliverOrder.getReceiver());
+							deliverOrderExcel.setTel(deliverOrder.getTel());
+							String address = deliverOrder.getProvince() + deliverOrder.getCity()
+									+ deliverOrder.getArea() + deliverOrder.getAddress();
+							deliverOrderExcel.setAddress(address);
+							deliverOrderExcel.setStatus(deliverOrder.getStatus().getDesc());
+							deliverOrderExcel.setItemStatus(StringUtils.isNotBlank(userDeliverOrderItem.getDeliveryFlowId())?"已发货":"未发货");
+							excelList.add(deliverOrderExcel);
+						}
+					}
+				}
+			}
+		}
+		ExcelUtil<DeliverOrderExcel> util = new ExcelUtil<DeliverOrderExcel>(DeliverOrderExcel.class);
+		return util.exportExcel(excelList, "用户提货订单导出", false);
+	}
+}

+ 3 - 3
mp-admin/src/main/java/com/qs/mp/web/controller/api/callback/PayCallBackController.java

@@ -76,14 +76,14 @@ public class PayCallBackController {
     payOrder.setOrderNo(orderNo);
     payOrder.setCompleteDate(completeDate);
     payOrder.setChannelNo(channelNo);
-    payOrder.setOrderstatus(orderStatus);
+    payOrder.setOrderStatus(orderStatus);
     // 订单支付状态单独保存
     LambdaUpdateWrapper<PayOrder> updateWrapper = new LambdaUpdateWrapper<>();
-    updateWrapper.eq(PayOrder::getOrderstatus,2);
+    updateWrapper.eq(PayOrder::getOrderStatus,2);
     updateWrapper.eq(PayOrder::getOrderId,shopOrderNo);
     boolean ret = payOrderService.update(payOrder,updateWrapper);
     if(ret){
-      //Todo 更新账户余额,单独封装一个事物接口服务
+      // 更新订单,单独封装一个事物接口服务
       logger.info("支付回调消息更新成功 shopOrderNo:"+shopOrderNo);
       walletService.payOrderStatusHandle(shopOrderNo);
       responseWrite(response,"success");

+ 598 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelController.java

@@ -0,0 +1,598 @@
+package com.qs.mp.web.controller.api.channel;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelCommission;
+import com.qs.mp.channel.domain.param.ChannelParam;
+import com.qs.mp.channel.domain.param.SiteQueryParam;
+import com.qs.mp.channel.domain.param.VerifyParam;
+import com.qs.mp.channel.domain.vo.ChannelOperDataVO;
+import com.qs.mp.channel.domain.vo.ChannelVO;
+import com.qs.mp.channel.service.IChannelCommissionService;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.common.constant.UserConstants;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ChannelCertifyStatusEnum;
+import com.qs.mp.common.enums.ChannelRoleEnum;
+import com.qs.mp.common.enums.ChannelVerifyStatusEnum;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import ma.glasnost.orika.MapperFacade;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @auther zhongcp
+ * @create 2022-02-28 16:17:48
+ * @describe 渠道管理前端控制器
+ */
+@Api("渠道管理API")
+@RestController
+@RequestMapping("/api/v1/mp/channel/*")
+@Component
+public class ChannelController extends BaseApiController {
+
+	@Autowired
+	private IChannelService channelService;
+
+	@Autowired
+	private IChannelCommissionService channelCommissionService;
+
+	@Autowired
+	private IChannelUserRelService channelUserRelService;
+
+    @Autowired
+    private ISysUserService userService;
+
+	@Autowired
+	private MapperFacade mapperFacade;
+
+	/**
+	 * 获取我的下级渠道列表信息,支持翻页
+	 *
+	 * @return
+	 */
+	@PostMapping("subchannel/list")
+	public TableDataInfo listChannel(@RequestBody Channel channel) {
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		List<ChannelVO> list = new ArrayList<ChannelVO>();
+		if(null != channelId) {
+			channel.setParentId(channelId);
+			startPage();
+			QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
+			queryWrapper.eq("t1.parent_id", channel.getParentId());
+			queryWrapper.gt("t1.level", 0);
+			queryWrapper.orderByAsc("t1.channel_id");
+			list = channelService.selectChannelVoList(queryWrapper);
+			if(null != list && list.size() > 0) {
+				for(ChannelVO channelVO : list) {
+					if(null != channelVO && StringUtils.isNotBlank(channelVO.getChannelNo())) {
+						int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
+						int userCnt = channelUserRelService.getChannelTotalUserCnt(channelVO.getChannelNo());
+						channelVO.setSiteCnt(siteCnt);
+						channelVO.setUserCnt(userCnt);
+					}
+				}
+			}
+		}
+		return getDataTable(list);
+	}
+
+	/**
+	 * 获取我的下级渠道详情信息
+	 *
+	 * @param
+	 * @return
+	 */
+	@PostMapping(value = "subchannel/detail")
+	public AjaxResult getChannelDetail(@RequestBody Channel channel) {
+		if (null == channel || null == channel.getChannelId()) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		Long parentlId = SecurityUtils.getLoginUser().getChannelId();
+		ChannelVO channelVO = new ChannelVO();
+		Channel queryChannel = channelService.getById(channel.getChannelId());
+		if(null == queryChannel || null == queryChannel.getChannelId()) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		if(!parentlId.equals(queryChannel.getParentId())) {
+			return AjaxResult.error("非当前用户的子渠道,查询失败");
+		}
+	    BeanUtils.copyProperties(queryChannel, channelVO);
+	    // 查询今日的销售额、佣金收入、新增用户数
+	    ChannelOperDataVO channelOperDataVO = channelService.getChannelOperData(channelVO.getChannelNo(), 1);
+	    channelVO.setOperData(channelOperDataVO);
+		return AjaxResult.success(channelVO);
+	}
+
+	/**
+	 * 新增子渠道信息
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "新增子渠道信息", notes = "渠道端新增子渠道")
+	@PostMapping("subchannel/create")
+	public AjaxResult channelCreate(@Validated @RequestBody ChannelParam channelParam) {
+		if (channelParam.getChannelId() != null && channelParam.getChannelId() != 0) {
+			return AjaxResult.error("该渠道已存在");
+		}
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		Channel channel = mapperFacade.map(channelParam, Channel.class);
+		channel.setParentId(channelId);
+		// 1、校验名称是否重复、手机号是否存在(渠道表)
+		LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(Channel::getName, channel.getName());
+		queryWrapper.gt(Channel::getLevel, 0);
+		int nameCount = channelService.count(queryWrapper);
+		if(nameCount > 0) {
+			return AjaxResult.error("渠道名称" + channel.getName() + "已存在!");
+		}
+		int mobileCount = channelService.count(
+		        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
+		if(mobileCount > 0) {
+			 return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+		}
+		// 2.校验佣金比例,不能高于其父渠道的佣金比例
+		Channel parentChannel = channelService.getById(channel.getParentId());
+		if(null != parentChannel && null != parentChannel.getCommRate()) {
+			 if(channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
+				 return AjaxResult.error("佣金比例不能高于父渠道的佣金比例");
+			 }
+		}
+		channel.setLevel(parentChannel.getLevel()+1);
+		// 3.插入数据
+		channel.setChannelNo(parentChannel.getChannelNo()+".");
+		try {
+			channelService.saveChannel(channel, ChannelRoleEnum.CHANNEL);
+		} catch (Exception e) {
+			return AjaxResult.error("渠道'" + channel.getName() + "'新增失败" + e.getMessage());
+		}
+
+		return AjaxResult.success("渠道'" + channel.getName() + "'新增成功");
+	}
+
+	/**
+	 * 编辑子渠道信息
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "编辑子渠道信息", notes = "渠道端编辑子渠道")
+	@PostMapping("subchannel/update")
+	public AjaxResult channelUpdate(@Validated @RequestBody ChannelParam channelParam) {
+
+		if (null == channelParam || null == channelParam.getChannelId()) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		Channel channel = mapperFacade.map(channelParam, Channel.class);
+		// 1、校验修改子渠道是否为当前用户的子渠道
+		Channel oldChannel = channelService.getById(channel.getChannelId());
+		if(null == oldChannel || null == oldChannel.getChannelId()) {
+			return AjaxResult.error("渠道'" + oldChannel.getName() + "'编辑失败,渠道ID异常");
+		}
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		if(!oldChannel.getParentId().equals(channelId)) {
+			return AjaxResult.error("渠道'" + oldChannel.getName() + "'编辑失败,非当前用户子渠道");
+		}
+		// 2.校验名称是否重复、手机号是否存在(渠道表);
+		if(!channel.getName().equals(oldChannel.getName())) {
+			LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<>();
+			queryWrapper.eq(Channel::getName, channel.getName());
+			queryWrapper.gt(Channel::getLevel, 0);
+			int nameCount = channelService.count(queryWrapper);
+			if(nameCount > 0) {
+				return AjaxResult.error("渠道名称" + channel.getName() + "已存在!");
+			}
+		}
+		boolean mobileChange = false;  // 手机号码是否有变更
+		if(!channel.getMobile().equals(oldChannel.getMobile())) {
+			int mobileCount = channelService.count(
+			        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
+			if(mobileCount > 0) {
+				return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+			}
+			if(UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(channel.getMobile()))) {
+				return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+			}
+			mobileChange = true;
+		}
+		// 3.校验佣金比例,不能高于其父渠道的佣金比例,不能低于其子渠道的最大佣金比例
+		Channel parentChannel = channelService.getById(oldChannel.getParentId());
+		if(null != parentChannel && null != parentChannel.getCommRate()) {
+			 if(channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
+				 return AjaxResult.error("佣金比例不能高于父渠道的佣金比例");
+			 }
+		}
+		// 查询子渠道的最大佣金比例
+		QueryWrapper<Channel> queryWrapper = new QueryWrapper<Channel>();
+		queryWrapper.select("IFNULL(max(comm_rate),0) as commRate");
+		queryWrapper.lambda().eq(Channel::getParentId, channel.getChannelId());
+		Map<String, Object> map = channelService.getMap(queryWrapper);
+		if(null != map && map.containsKey("commRate")) {
+			BigDecimal commRate = new BigDecimal(map.get("commRate").toString());
+			if(!commRate.equals(BigDecimal.ZERO) && channel.getCommRate().compareTo(commRate) < 0) {
+				return AjaxResult.error("不能低于其子渠道的最大佣金比例");
+			}
+		}
+		try {
+			channel.setUserId(oldChannel.getUserId());
+			channelService.updateChannel(channel, mobileChange);
+		} catch (Exception e) {
+			return AjaxResult.error(e.getMessage());
+		}
+		return AjaxResult.success("渠道'" + channel.getName() + "'编辑成功");
+	}
+
+
+	/**
+	 *获取当前用户渠道或者某个子渠道的经营数据
+	 *
+	 * @param
+	 * @return
+	 */
+	@PostMapping(value = "subchannel/operdata/query")
+	public AjaxResult getOperData(@RequestBody JSONObject jsonObject) {
+		if (null == jsonObject) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		int days = jsonObject.getIntValue("days");;
+		if(StringUtils.isNotBlank(jsonObject.getString("channelId"))) {
+			Long _channelId = jsonObject.getLong("channelId");
+			Channel queryChannel = channelService.getById(_channelId);
+			if(null == queryChannel || null == queryChannel.getChannelId()) {
+				return error(ErrorCodeEnum.ERROR_CODE_1001);
+			}
+			if(!channelId.equals(queryChannel.getParentId())) {
+				return AjaxResult.error("非当前用户的子渠道,查询失败");
+			}
+			channelId = _channelId;
+		}
+		days = days > 0?days:1;
+		Channel channel = channelService.getById(channelId);
+		// 查询今日的销售额、佣金收入、新增用户数
+		ChannelOperDataVO channelOperDataVO = channelService.getChannelOperData(channel.getChannelNo(), days);
+		return AjaxResult.success(channelOperDataVO);
+	}
+
+	/**
+	 * 获取子渠道的经营数据列表
+	 *
+	 * @param
+	 * @return
+	 */
+	@PostMapping(value = "subchannel/operdata/list")
+	public TableDataInfo getOperDataList(@RequestBody JSONObject jsonObject) {
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		int days = jsonObject.getIntValue("days");;
+		if(StringUtils.isNotBlank(jsonObject.getString("channelId"))) {
+			channelId = jsonObject.getLong("channelId");
+		}
+		days = days > 0?days:1;
+		startPage();
+		List<Channel> list = channelService.list(
+		        new LambdaQueryWrapper<Channel>().eq(Channel::getParentId, channelId).gt(Channel::getLevel, 0)
+		            .orderByDesc(Channel::getChannelId));
+
+		List<ChannelOperDataVO> dataList = new ArrayList<ChannelOperDataVO>();
+		if(null != list && list.size() > 0) {
+			for(Channel channel : list) {
+				if(null != channel && null != channel.getChannelNo()) {
+				    // 查询今日的销售额、佣金收入、新增用户数
+				    ChannelOperDataVO channelOperDataVO = channelService.getChannelOperData(channel.getChannelNo(), days);
+				    if(null != channelOperDataVO) {
+				    	channelOperDataVO.setName(channel.getName());
+							channelOperDataVO.setMobile(channel.getMobile());
+				    	dataList.add(channelOperDataVO);
+				    }
+				}
+			}
+		}
+		TableDataInfo resData = getDataTable(list);
+		resData.setRows(dataList);
+		return resData;
+	}
+
+
+	/**
+	 * 获取我的经销商列表信息,支持翻页
+	 *
+	 * @return
+	 */
+	@PostMapping("site/list")
+	public TableDataInfo listSite(@RequestBody SiteQueryParam siteParam) {
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		List<ChannelVO> list = new ArrayList<ChannelVO>();
+		if(null != channelId) {
+			startPage();
+			QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
+			queryWrapper.eq("t1.parent_id", channelId);
+			queryWrapper.eq("t1.level", 0);
+			if(!CollectionUtils.isEmpty(siteParam.getVerifyStatus())) {
+				queryWrapper.in("t1.verify_status", siteParam.getVerifyStatus());
+			}
+			if(StringUtils.isNotBlank(siteParam.getCertifyStatus())) {
+				queryWrapper.eq("t1.certify_status", siteParam.getCertifyStatus());
+			}
+			list = channelService.selectChannelVoList(queryWrapper);
+		}
+		return getDataTable(list);
+	}
+
+	/**
+	 * 获取我的下级渠道详情信息
+	 *
+	 * @param
+	 * @return
+	 */
+	@PostMapping(value = "site/detail")
+	public AjaxResult getSiteDetail(@RequestBody Channel channel) {
+		if (null == channel || null == channel.getChannelId()) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		Long parentlId = SecurityUtils.getLoginUser().getChannelId();
+		ChannelVO channelVO = new ChannelVO();
+		Channel queryChannel = channelService.getById(channel.getChannelId());
+		if(null == queryChannel || null == queryChannel.getChannelId()) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		if(!parentlId.equals(queryChannel.getParentId())) {
+			return AjaxResult.error("非当前用户的经销商,查询失败");
+		}
+	    BeanUtils.copyProperties(queryChannel, channelVO);
+	    // 查询今日的销售额、佣金收入、新增用户数
+	    ChannelOperDataVO channelOperDataVO = channelService.getChannelOperData(channelVO.getChannelNo(), 1);
+	    channelVO.setOperData(channelOperDataVO);
+		return AjaxResult.success(channelVO);
+	}
+
+	/**
+	 * 新增经销商信息
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "渠道端新增经销商", notes = "渠道端新增经销商")
+	@PostMapping("site/create")
+	public AjaxResult siteCreate(@Validated @RequestBody ChannelParam channelParam) {
+		if (channelParam.getChannelId() != null && channelParam.getChannelId() != 0) {
+			return AjaxResult.error("该经销商已存在");
+		}
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+
+		Channel channel = mapperFacade.map(channelParam, Channel.class);
+		channel.setParentId(channelId);
+		// 1、校验名称是否重复、手机号是否存在(渠道表)
+		LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(Channel::getName, channel.getName());
+		queryWrapper.eq(Channel::getLevel, 0);
+		int nameCount = channelService.count(queryWrapper);
+		if(nameCount > 0) {
+			return AjaxResult.error("经销商名称" + channel.getName() + "已存在!");
+		}
+		int mobileCount = channelService.count(
+		        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
+		if(mobileCount > 0) {
+			 return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+		}
+		// 2.校验佣金比例,不能高于其父渠道的佣金比例
+		Channel parentChannel = channelService.getById(channel.getParentId());
+		if(null != parentChannel && null != parentChannel.getCommRate()) {
+			 if(channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
+				 return AjaxResult.error("佣金比例不能高于父渠道的佣金比例");
+			 }
+		}
+		channel.setLevel(0);
+		// 3.插入数据
+		channel.setChannelNo(parentChannel.getChannelNo()+".");
+		try {
+			channelService.saveChannel(channel,ChannelRoleEnum.SALESITE);
+		} catch (Exception e) {
+			return AjaxResult.error("经销商'" + channel.getName() + "'新增失败"+e.getMessage());
+		}
+		return AjaxResult.success("经销商'" + channel.getName() + "'新增成功");
+	}
+
+	/**
+	 * 编辑经销商信息
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "编辑经销商信息", notes = "渠道端编辑经销商")
+	@PostMapping("site/update")
+	public AjaxResult siteUpdate(@Validated @RequestBody ChannelParam channelParam) {
+
+		if (null == channelParam || null == channelParam.getChannelId()) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		Channel channel = mapperFacade.map(channelParam, Channel.class);
+
+		// 1、校验修改子渠道是否为当前用户的子渠道
+		Channel oldChannel = channelService.getById(channel.getChannelId());
+		if(null == oldChannel || null == oldChannel.getChannelId()) {
+			return AjaxResult.error("经销商'" + oldChannel.getName() + "'编辑失败,渠道ID异常");
+		}
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		if(!oldChannel.getParentId().equals(channelId)) {
+			return AjaxResult.error("经销商'" + oldChannel.getName() + "'编辑失败,非当前用户子渠道");
+		}
+		// 2.校验名称是否重复、手机号是否存在(渠道表);
+		if(!channel.getName().equals(oldChannel.getName())) {
+
+			LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<>();
+			queryWrapper.eq(Channel::getName, channel.getName());
+			queryWrapper.eq(Channel::getLevel, 0);
+			int nameCount = channelService.count(queryWrapper);
+			if(nameCount > 0) {
+				return AjaxResult.error("经销商名称" + channel.getName() + "已存在!");
+			}
+		}
+		boolean mobileChange = false;  // 手机号码是否有变更
+		if(!channel.getMobile().equals(oldChannel.getMobile())) {
+			int mobileCount = channelService.count(
+			        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
+			if(mobileCount > 0) {
+				return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+			}
+			if(UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(channel.getMobile()))) {
+				return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+			}
+			mobileChange = true;
+		}
+		// 3.校验佣金比例,不能高于其父渠道的佣金比例,不能低于其子渠道的最大佣金比例
+		Channel parentChannel = channelService.getById(oldChannel.getParentId());
+		if(null != parentChannel && null != parentChannel.getCommRate()) {
+			 if(channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
+				 return AjaxResult.error("佣金比例不能高于父渠道的佣金比例");
+			 }
+		}
+		try {
+			channel.setUserId(oldChannel.getUserId());
+			channelService.updateChannel(channel, mobileChange);
+		} catch (Exception e) {
+			return AjaxResult.error("经销商'" + channel.getName() + "'编辑失败");
+		}
+		return AjaxResult.success("经销商'" + channel.getName() + "'编辑成功");
+	}
+
+
+	/**
+	 * 经销商认证审核
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "经销商认证审核", notes = "经销商认证审核")
+	@PostMapping("site/verify")
+	public AjaxResult siteVerify(@RequestBody Channel channel) {
+
+		if (null == channel || null == channel.getChannelId() || null == channel.getVerifyStatus()) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+
+		Long parentlId = SecurityUtils.getLoginUser().getChannelId();
+		Channel queryChannel = channelService.getById(channel.getChannelId());
+		if(null == queryChannel || null == queryChannel.getChannelId()) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		if(!parentlId.equals(queryChannel.getParentId())) {
+			return AjaxResult.error(queryChannel.getName() + "非当前用户的经销商, 认证审核失败");
+		}
+		try {
+			if(channel.getVerifyStatus() == ChannelVerifyStatusEnum.ACCEPT) {
+				channel.setCertifyStatus(ChannelCertifyStatusEnum.CERTIFIED);
+			}else {
+				channel.setCertifyStatus(ChannelCertifyStatusEnum.NOT_CERTIFIED);
+			}
+			channelService.updateById(channel);
+		} catch (Exception e) {
+			return AjaxResult.error("经销商'" + channel.getName() + "'认证审核失败");
+		}
+		return AjaxResult.success("经销商'" + channel.getName() + "'认证审核成功");
+	}
+
+	/**
+	 * 经销商认证页面点提交
+	 * @param
+	 * @return
+	 */
+	@ApiOperation(value = "经销商认证信息提交", notes = "经销商认证页面点提交")
+	@PostMapping("site/verify/submit")
+	public AjaxResult siteVerifySubmit(@Validated @RequestBody VerifyParam verifyParam) {
+
+		if (null == verifyParam || null == verifyParam.getChannelId()) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		Channel channel = mapperFacade.map(verifyParam, Channel.class);
+		try {
+			channel.setVerifyStatus(ChannelVerifyStatusEnum.WAIT);
+			channelService.updateById(channel);
+		} catch (Exception e) {
+			return AjaxResult.error("经销商'" + channel.getName() + "'提交认证信息失败");
+		}
+		return AjaxResult.success("经销商'" + channel.getName() + "'提交认证信息成功");
+	}
+
+
+	/**
+	 * 我的(经销商)
+	 *
+	 * @param
+	 * @return
+	 */
+	@PostMapping(value = "/site/mine/detail")
+	@ApiOperation(value = "经销商查看我的信息", notes = "经销商端点击我的")
+	public AjaxResult getSiteMineDetail() {
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		if (null == channelId) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		ChannelVO channelVO = new ChannelVO();
+		Channel queryChannel = channelService.getById(channelId);
+	    BeanUtils.copyProperties(queryChannel, channelVO);
+	    // 查询今日的销售额、佣金收入、新增用户数
+	    Channel parentChannel = channelService.getById(queryChannel.getParentId());
+	    channelVO.setParentName(parentChannel.getName());
+		return AjaxResult.success(channelVO);
+	}
+
+	/**
+	 * 我的(渠道)
+	 *
+	 * @param
+	 * @return
+	 */
+	@PostMapping(value = "/mine/detail")
+	@ApiOperation(value = "渠道端查看我的信息", notes = "渠道端点击我的")
+	public AjaxResult getChannelMineDetail() {
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		if (null == channelId) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		ChannelVO channelVO = new ChannelVO();
+		Channel queryChannel = channelService.getById(channelId);
+		BeanUtils.copyProperties(queryChannel, channelVO);
+		// 查询今日的销售额、佣金收入、新增用户数
+		Channel parentChannel = channelService.getById(queryChannel.getParentId());
+		if (null != parentChannel) {
+			channelVO.setParentName(parentChannel.getName());
+		}
+		// 统计今天的分润金额
+		Date zero = DateUtils.getToday(); // 获取当天零点零分时间
+		QueryWrapper<ChannelCommission> queryWrapper = new QueryWrapper<ChannelCommission>();
+		queryWrapper.select("IFNULL(sum(comm_amt) ,0) as commAmt");
+		queryWrapper.lambda().eq(ChannelCommission::getChannelId, channelId);
+		queryWrapper.lambda().gt(ChannelCommission::getCreatedTime, zero);
+		Map<String, Object> map = channelCommissionService.getMap(queryWrapper);
+		if(null != map && map.containsKey("commAmt")) {
+			BigDecimal commAmt = new BigDecimal(map.get("commAmt").toString());
+			ChannelOperDataVO channelOperDataVO = new ChannelOperDataVO();
+			channelOperDataVO.setCommAmt(commAmt.longValue());
+			channelVO.setOperData(channelOperDataVO);
+		}
+		return AjaxResult.success(channelVO);
+	}
+}

+ 100 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelInviteController.java

@@ -0,0 +1,100 @@
+package com.qs.mp.web.controller.api.channel;
+
+import cn.jsms.api.ValidSMSResult;
+import com.alibaba.fastjson.JSONObject;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.param.ChannelInviteParam;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.domain.AjaxResult.Type;
+import com.qs.mp.common.enums.ChannelRoleEnum;
+import com.qs.mp.common.jsms.JSMSUtils;
+import com.qs.mp.framework.service.IWxUrlLinkService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import ma.glasnost.orika.MapperFacade;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @auther zhongcp
+ * @create 2022-02-28 16:17:48
+ * @describe 渠道邀请前端控制器
+ */
+@Api("渠道邀请API")
+@RestController
+@RequestMapping("/api/v1/mp/channel/*")
+@Component
+public class ChannelInviteController extends BaseApiController {
+
+	@Autowired
+	private IChannelService channelService;
+
+	@Autowired
+	private IWxUrlLinkService wxUrlLinkService;
+
+	@Autowired
+	private MapperFacade mapperFacade;
+
+	@Value("${wx-channel.appId}")
+	private String channelAppId;
+
+	/**
+	 * 生成邀请码
+	 *
+	 * @return
+	 */
+	@PostMapping("invite/generate")
+	public AjaxResult generateInviteCode(@RequestBody  JSONObject jsonObject) {
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		Channel channel = channelService.getById(channelId);
+		if (StringUtils.isNotBlank(channel.getInvitePic())){
+			return new AjaxResult(Type.SUCCESS, "", channel.getInvitePic());
+		}
+		String type = jsonObject.getString("type");
+		String rst = wxUrlLinkService.generateCode("pages/login/invitation", "id=" + channelId + "&type=" + type, channelAppId);
+		channel.setInvitePic(rst);
+		channelService.updateById(channel);
+		return new AjaxResult(Type.SUCCESS, "", rst);
+	}
+
+	/**
+	 * 注册成为经销商
+	 *
+	 * @param
+	 * @return
+	 */
+	@PostMapping(value = "invite/register")
+	public AjaxResult register(@RequestBody ChannelInviteParam param) {
+
+		Channel parent = channelService.getById(param.getChannelId());
+		if(null == parent || parent.getLevel() == 0) {
+			return error("渠道不存在");
+		}
+		ValidSMSResult res = JSMSUtils.sendValidSMSCode(param.getMessageId(), param.getCode());
+		if (res == null || !res.getIsValid()) {
+			return error("短信验证码错误");
+		}
+
+		// 创建经销商
+		Channel channel = new Channel();
+		channel.setChannelNo(parent.getChannelNo() + ".");
+		//if (ChannelRoleEnum.CHANNEL.getValue().equals(param.getType())) {
+			channel.setLevel(0);
+		/*} else if (ChannelRoleEnum.SALESITE.getValue().equals(param.getType())) {
+			channel.setLevel(parent.getLevel() + 1);
+		}*/
+		channel.setParentId(parent.getChannelId());
+		channel.setMobile(param.getMobile());
+		channel.setName(param.getMobile());
+		channelService.saveChannel(channel,  ChannelRoleEnum.SALESITE);
+		return AjaxResult.success();
+	}
+}

+ 70 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelMoneyController.java

@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
+ *
+ * https://www.mall4j.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.qs.mp.web.controller.api.channel;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.channel.domain.ChannelMoneyLog;
+import com.qs.mp.channel.domain.ChannelWithdraw;
+import com.qs.mp.channel.domain.vo.ChannelMoneyLogVO;
+import com.qs.mp.channel.service.IChannelMoneyLogService;
+import com.qs.mp.channel.service.IChannelWithdrawService;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ChannelMoneyEnum;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/channel")
+@Api(tags = "账户明细接口")
+@AllArgsConstructor
+public class ChannelMoneyController extends BaseApiController {
+
+  @Autowired
+  private IChannelMoneyLogService channelMoneyLogService;
+
+  @Autowired
+  private IChannelWithdrawService channelWithdrawService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  @RequestMapping(value = "/money/log", method = RequestMethod.POST)
+  @ResponseBody
+  public TableDataInfo listMoneyLog(@RequestBody ChannelMoneyLog channelMoneyLog) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    QueryWrapper<ChannelMoneyLog> queryWrapper = new QueryWrapper();
+    queryWrapper.lambda().eq(ChannelMoneyLog::getChannelId, channelId);
+    queryWrapper.lambda().orderByDesc(ChannelMoneyLog::getBizTime);
+    startPage();
+    List<ChannelMoneyLog> list = channelMoneyLogService.list(queryWrapper);
+    List<ChannelMoneyLogVO> channelMoneyLogVOS = mapperFacade.mapAsList(list, ChannelMoneyLogVO.class);
+    for (ChannelMoneyLogVO logVO : channelMoneyLogVOS) {
+      if (logVO.getType() == ChannelMoneyEnum.WITHDRAW) {
+        ChannelWithdraw channelWithdraw = channelWithdrawService.getById(logVO.getRefId());
+        logVO.setWithdrawStatus(channelWithdraw.getStatus());
+      }
+    }
+    TableDataInfo resp = getDataTable(list);
+    resp.setRows(channelMoneyLogVOS);
+    return resp;
+  }
+}

+ 160 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelWithdrawController.java

@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
+ *
+ * https://www.mall4j.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.qs.mp.web.controller.api.channel;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelBankCard;
+import com.qs.mp.channel.domain.ChannelCart;
+import com.qs.mp.channel.domain.ChannelWithdraw;
+import com.qs.mp.channel.domain.param.ChannelCartParam;
+import com.qs.mp.channel.domain.param.ChannelWithdrawParam;
+import com.qs.mp.channel.domain.vo.ChannelCartVO;
+import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
+import com.qs.mp.channel.service.IChannelBankCardService;
+import com.qs.mp.channel.service.IChannelCartService;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.channel.service.IChannelWithdrawService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.domain.param.BatchLongIdsParam;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.system.service.ISysConfigService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import javax.validation.Valid;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/channel")
+@Api(tags = "渠道提现接口")
+@AllArgsConstructor
+public class ChannelWithdrawController extends BaseApiController {
+
+
+  @Autowired
+  private IChannelWithdrawService channelWithdrawService;
+
+  @Autowired
+  private IChannelService channelService;
+
+  @Autowired
+  private IChannelBankCardService channelBankCardService;
+
+  @Autowired
+  private RedisCache redisCache;
+
+  private final String CHANNEL_WITHDRAW_CACHE_KEY = "channel_settle_withdraw_";
+
+  @Autowired
+  private ISysConfigService configService;
+
+  /**
+   * 提现费率配置key
+   */
+  private final String FEE_RATE_CONFIG_KEY = "channel.withdraw.feeRate";
+  /**
+   * 提现费率默认值
+   */
+  private final String FEE_RATE_DEFAULT_VALUE = "0.8";
+
+  /**
+   * 渠道提现计算手续费
+   */
+  @PostMapping("/withdraw/settle")
+  @ApiOperation(value = "提现" , notes = "提现计费")
+  public AjaxResult settle(@Valid @RequestBody ChannelWithdrawParam param) {
+    String feeRateValue = configService.selectConfigByKey(FEE_RATE_CONFIG_KEY);
+    BigDecimal feeRate = new BigDecimal(
+        StringUtils.isNotBlank(feeRateValue) ? feeRateValue : FEE_RATE_DEFAULT_VALUE);
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    Channel channel = channelService.getById(channelId);
+    if (channel.getMoney() < 50000) {
+      return AjaxResult.error("账户余额不足500元");
+    }
+    int feeAmt = new BigDecimal(param.getMoney()).multiply(feeRate)
+        .divide(new BigDecimal(100), 0, RoundingMode.HALF_UP).intValue();
+    ChannelWithdraw channelWithdraw = new ChannelWithdraw();
+    if (param.getMoney() + feeAmt > channel.getMoney()) {
+      channelWithdraw.setMoney(new BigDecimal(channel.getMoney()).divide(new BigDecimal(1).add(feeRate.divide(new BigDecimal(100), 4, RoundingMode.HALF_UP)), 0, RoundingMode.HALF_UP).intValue());
+      channelWithdraw.setChargeAmt(channel.getMoney() - channelWithdraw.getMoney());
+    } else {
+      channelWithdraw.setMoney(param.getMoney());
+      channelWithdraw.setChargeAmt(feeAmt);
+  }
+    channelWithdraw.setUserName(param.getUserName());
+    channelWithdraw.setCardNo(param.getCardNo());
+    channelWithdraw.setBranchName(param.getBranchName());
+
+    // 缓存订单结算对象
+    redisCache.setCacheObject(CHANNEL_WITHDRAW_CACHE_KEY + channelId, channelWithdraw, 1, TimeUnit.MINUTES);
+
+    JSONObject jsonObject = new JSONObject();
+    jsonObject.put("chargeAmt", channelWithdraw.getChargeAmt());
+    jsonObject.put("chargeRate", feeRate);
+    return AjaxResult.success(jsonObject);
+  }
+
+  /**
+   * 渠道提现申请提交
+   */
+  @PostMapping("/withdraw/apply")
+  @ApiOperation(value = "提交提现申请" , notes = "确认服务费后提交")
+  public AjaxResult apply(@RequestBody ChannelWithdrawParam param) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    ChannelWithdraw channelWithdraw = redisCache.getCacheObject(CHANNEL_WITHDRAW_CACHE_KEY + channelId);
+    if (null == channelWithdraw) {
+      return AjaxResult.error("申请已过期,请重新提交");
+    }
+    Channel channel = channelService.getById(channelId);
+    if (channelWithdraw.getMoney() + channelWithdraw.getChargeAmt() > channel.getMoney() ) {
+      return AjaxResult.error("提现金额超出账户余额");
+    }
+
+    channelWithdraw.setChannelId(channelId);
+    channelWithdraw.setAvailableMoney(channel.getMoney());
+
+    channelWithdrawService.apply(channel, channelWithdraw);
+
+    // 缓存提现结算对象
+    redisCache.deleteObject(CHANNEL_WITHDRAW_CACHE_KEY + channelId);
+
+    return AjaxResult.success("提现申请成功");
+  }
+
+  /**
+   * 渠道提现查询银行卡
+   */
+  @PostMapping("/withdraw/card/query")
+  @ApiOperation(value = "查询银行卡" , notes = "查询银行卡信息")
+  public AjaxResult queryCard(@RequestBody ChannelWithdrawParam param) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    ChannelBankCard bankCard = channelBankCardService.getOne(new LambdaQueryWrapper<ChannelBankCard>()
+        .eq(ChannelBankCard::getChannelId, channelId));
+
+    return AjaxResult.success(bankCard);
+  }
+}

+ 96 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelCartController.java

@@ -0,0 +1,96 @@
+package com.qs.mp.web.controller.api.channel.mall;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.channel.domain.ChannelCart;
+import com.qs.mp.channel.domain.param.ChannelCartParam;
+import com.qs.mp.channel.domain.vo.ChannelCartVO;
+import com.qs.mp.channel.service.IChannelCartService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.domain.param.BatchLongIdsParam;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/channel/mall")
+@Api(tags = "渠道盲票商城购物车接口")
+@AllArgsConstructor
+public class ChannelCartController extends BaseApiController {
+
+
+  @Autowired
+  private IChannelCartService channelCartService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  /**
+   * 购物车列表
+   */
+  @PostMapping("/cart/list")
+  @ApiOperation(value = "购物车列表" , notes = "获取所有购物车盲票信息")
+  public AjaxResult list(@RequestBody ChannelCart param) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    startPage();
+    List<ChannelCartVO> channelCartVOS = channelCartService.listCartVO(
+        new LambdaQueryWrapper<ChannelCart>().eq(ChannelCart::getChannelId, channelId)
+            .orderByDesc(ChannelCart::getUpdatedTime));
+    return AjaxResult.success(channelCartVOS);
+  }
+
+
+  /**
+   * 盲票列表页面点加购
+   */
+  @PostMapping("/cart/add")
+  @ApiOperation(value = "加购物车" , notes = "渠道经销商加购物车")
+  public AjaxResult add(@RequestBody ChannelCartParam param) {
+    boolean rtn = channelCartService.addToCart(param);
+    if (!rtn) {
+      return AjaxResult.error("操作失败");
+    }
+    return AjaxResult.success("操作成功");
+  }
+
+  /**
+   * 修改购物车数量
+   */
+  @PostMapping("/cart/update")
+  @ApiOperation(value = "修改购物车数量" , notes = "渠道经销商购物车列表页面直接修改")
+  public AjaxResult update(@RequestBody ChannelCartParam param) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    boolean rtn = channelCartService.update(new LambdaUpdateWrapper<ChannelCart>()
+            .set(ChannelCart::getOrderNum, param.getOrderNum())
+        .eq(ChannelCart::getChannelId, channelId)
+        .eq(ChannelCart::getCartId, param.getCartId()));
+    if (!rtn) {
+      return AjaxResult.error("更新失败");
+    }
+    return AjaxResult.success("更新成功");
+  }
+
+  /**
+   * 删除购物清单项
+   */
+  @PostMapping("/cart/remove")
+  @ApiOperation(value = "删除购物清单" , notes = "购物车里点删除")
+  public AjaxResult remove(@RequestBody BatchLongIdsParam param) {
+    boolean rtn = channelCartService.removeByIds(param.getIds());
+    if (!rtn) {
+      return AjaxResult.error("操作失败");
+    }
+    return AjaxResult.success("操作成功");
+  }
+
+}

+ 231 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java

@@ -0,0 +1,231 @@
+package com.qs.mp.web.controller.api.channel.mall;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.user.domain.UserAddr;
+import com.qs.mp.channel.domain.ChannelCart;
+import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.ChannelOrderItem;
+import com.qs.mp.channel.domain.param.ChannelOrderParam;
+import com.qs.mp.channel.domain.param.OrderPayParam;
+import com.qs.mp.channel.domain.vo.ChannelCartVO;
+import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
+import com.qs.mp.channel.domain.vo.ChannelOrderVO;
+import com.qs.mp.user.service.IUserAddrService;
+import com.qs.mp.channel.service.IChannelCartService;
+import com.qs.mp.channel.service.IChannelOrderItemService;
+import com.qs.mp.channel.service.IChannelOrderService;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.BizTypeEnum;
+import com.qs.mp.common.enums.ChannelCertifyStatusEnum;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.framework.redis.RedisKey;
+import com.qs.mp.pay.service.IWalletService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import javax.validation.Valid;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/channel/mall")
+@Api(tags = "渠道盲票商城订单接口")
+@AllArgsConstructor
+public class ChannelOrderController extends BaseApiController {
+
+
+  @Autowired
+  private IChannelCartService channelCartService;
+
+  @Autowired
+  private IChannelOrderService channelOrderService;
+
+  @Autowired
+  private IChannelOrderItemService channelOrderItemService;
+
+  @Autowired
+  private ITicketBoxService ticketBoxService;
+
+  @Autowired
+  private IUserAddrService userAddrService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  @Autowired
+  private IWalletService walletService;
+
+  @Autowired
+  private IChannelService channelService;
+
+  @Autowired
+  private RedisCache redisCache;
+
+
+
+  /**
+   * 订单列表
+   */
+  @PostMapping("/order/list")
+  @ApiOperation(value = "订单列表" , notes = "获取所有订单信息")
+  public TableDataInfo list(@RequestBody JSONObject param) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    Integer status = param.getInteger("status");
+    startPage();
+    List<ChannelOrder> channelOrders = channelOrderService.list(
+        new LambdaQueryWrapper<ChannelOrder>().eq(ChannelOrder::getChannelId, channelId)
+            .eq(null != status, ChannelOrder::getStatus, status)
+            .orderByDesc(ChannelOrder::getCreatedTime));
+    List<ChannelOrderVO> channelOrderVOList = mapperFacade.mapAsList(channelOrders, ChannelOrderVO.class);
+    for (ChannelOrderVO channelOrderVO : channelOrderVOList) {
+      channelOrderVO.setItems(channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
+          .eq(ChannelOrderItem::getOrderId, channelOrderVO.getOrderId())));
+    }
+    TableDataInfo rspData = getDataTable(channelOrders);
+    rspData.setRows(channelOrderVOList);
+    return rspData;
+  }
+
+  /**
+   * 订单详情
+   */
+  @PostMapping("/order/detail")
+  @ApiOperation(value = "订单详情" , notes = "在订单列表页面查看详情")
+  public AjaxResult query(@RequestBody ChannelOrder order) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    ChannelOrder channelOrder = channelOrderService.getOne(new LambdaQueryWrapper<ChannelOrder>()
+        .eq(ChannelOrder::getOrderId, order.getOrderId()).eq(ChannelOrder::getChannelId, channelId));
+    ChannelOrderVO channelOrderVO = mapperFacade.map(channelOrder, ChannelOrderVO.class);
+    channelOrderVO.setItems(channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
+        .eq(ChannelOrderItem::getOrderId, channelOrderVO.getOrderId())));
+    return AjaxResult.success(channelOrderVO);
+  }
+
+  /**
+   * 订单结算,每次更换地址或优惠券时需重新请求此接口
+   */
+  @PostMapping("/order/settle")
+  @ApiOperation(value = "订单结算" , notes = "购物车里点结算或者单个盲票组商品上点立即购买")
+  public AjaxResult settle(@Valid @RequestBody ChannelOrderParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+
+    ChannelOrderSettleVO orderSettleVO = new ChannelOrderSettleVO();
+
+    // 收货地址,如果用户选了地址,则此处不做处理
+    if (null == param.getAddrId() || 0 == param.getAddrId()) {
+      //读取默认地址
+      UserAddr addr = userAddrService.getDefaultChannelAddr(userId);
+      if (null != addr) {
+        orderSettleVO.setAddr(addr);
+      }
+    }
+
+    // 订单金额计算
+    Integer orderAmt = 0;
+    Integer pkgNum = 0;
+    if (!CollectionUtils.isEmpty(param.getCartIds())){
+      // 购物车里下单的
+      List<ChannelCart> channelCarts = channelCartService.listByIds(param.getCartIds());
+      for (ChannelCart channelCart : channelCarts) {
+        TicketBox ticketBox = ticketBoxService.getById(channelCart.getBoxId());
+        orderAmt += ticketBox.getPkgSalePrice() * channelCart.getOrderNum();
+        ChannelCartVO cartVO = mapperFacade.map(ticketBox, ChannelCartVO.class);
+        cartVO.setCartId(channelCart.getCartId());
+        cartVO.setOrderNum(channelCart.getOrderNum());
+        orderSettleVO.getItems().add(cartVO);
+        pkgNum += channelCart.getOrderNum();
+      }
+    } else {
+      TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+      orderAmt += ticketBox.getPkgSalePrice() * param.getOrderNum();
+      ChannelCartVO cartVO = mapperFacade.map(ticketBox, ChannelCartVO.class);
+      cartVO.setOrderNum(param.getOrderNum());
+      orderSettleVO.getItems().add(cartVO);
+      pkgNum += param.getOrderNum();
+    }
+    orderSettleVO.setOrderAmt(orderAmt);
+    // 当前没有运费和优惠,实付金额=订单金额
+    orderSettleVO.setPayAmt(orderAmt);
+    orderSettleVO.setPkgNum(pkgNum);
+
+    // 缓存订单结算对象
+    redisCache.setCacheObject(RedisKey.build(RedisKey.CHANNEL_ORDER_KEY, channelId), orderSettleVO, 10, TimeUnit.MINUTES);
+    return AjaxResult.success(orderSettleVO);
+  }
+
+  /**
+   * 提交订单
+   */
+  @PostMapping("/order/submit")
+  @ApiOperation(value = "提交订单" , notes = "在订单确认页面提交")
+  public AjaxResult submit(@RequestBody ChannelOrder order) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    Channel channel = channelService.getById(channelId);
+    if (channel.getCertifyStatus() != ChannelCertifyStatusEnum.CERTIFIED) {
+      LogUtil.info(logger, "账号未认证。channelId:{0}", channelId);
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1016);
+    }
+    ChannelOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.CHANNEL_ORDER_KEY, channelId));
+    if (null == orderSettleVO) {
+      return AjaxResult.error("订单已过期,请重新下单");
+    }
+    if (null == orderSettleVO.getAddr()) {
+      return AjaxResult.error("收货地址缺失,请重新下单");
+    }
+    String orderId = channelOrderService.submitOrder(channelId, order.getMemo(), orderSettleVO);
+
+    // 清除缓存的订单
+    redisCache.deleteObject(RedisKey.build(RedisKey.CHANNEL_ORDER_KEY, channelId));
+
+    return AjaxResult.success(orderId);
+  }
+
+
+  /**
+   * 取消订单
+   */
+  @PostMapping("/order/cancel")
+  @ApiOperation(value = "取消订单" , notes = "在订单列表页面取消")
+  public AjaxResult cancel(@RequestBody ChannelOrder order) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    channelOrderService.cancelOrder(channelId, order.getOrderId());
+    return AjaxResult.success("取消成功");
+  }
+
+  /**
+   * 订单支付
+   */
+  @PostMapping("/order/pay")
+  @ApiOperation(value = "订单支付" , notes = "在订单列表页面支付")
+  public AjaxResult pay(@Valid @RequestBody OrderPayParam param) {
+    String openId = SecurityUtils.getLoginUser().getUser().getChannelOpenId();
+    ChannelOrder channelOrder = channelOrderService.getById(param.getOrderId());
+    JSONObject jsonObject;
+    try {
+      jsonObject = walletService.pay(BizTypeEnum.CHANNEL_ORDER, param.getOrderId(), openId, channelOrder.getPayAmt());
+    }catch (ServiceException e) {
+      return AjaxResult.error(e.getMessage());
+    }
+    return AjaxResult.success(jsonObject);
+  }
+}

+ 81 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelTicketController.java

@@ -0,0 +1,81 @@
+package com.qs.mp.web.controller.api.channel.mall;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.vo.TicketBoxListVO;
+import com.qs.mp.admin.domain.param.TicketBoxParam;
+import com.qs.mp.admin.domain.vo.TicketBoxVO;
+import com.qs.mp.admin.service.ITicketAwardsPrizeService;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/channel/mall")
+@Api(tags = "渠道盲票商城接口")
+@AllArgsConstructor
+public class ChannelTicketController extends BaseApiController {
+
+
+  @Autowired
+  private ITicketBoxService ticketBoxService;
+
+  @Autowired
+  private ITicketAwardsPrizeService ticketAwardsPrizeService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  /**
+   * 盲票进货列表
+   */
+  @PostMapping("/ticket/list")
+  @ApiOperation(value = "盲票组列表" , notes = "获取所有盲票信息")
+  public TableDataInfo list(@RequestBody TicketBoxParam param) {
+    // TODO 根据标签过滤
+    startPage();
+    List<TicketBox> ticketBoxes = ticketBoxService.list(
+        new LambdaQueryWrapper<TicketBox>().eq(TicketBox::getType, param.getType())
+            .eq(null != param.getCategoryId() && 0 != param.getCategoryId(), TicketBox::getCategoryId, param.getCategoryId())
+            .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON));
+    List<TicketBoxListVO> ticketBoxListVOList = mapperFacade.mapAsList(ticketBoxes, TicketBoxListVO.class);
+    TableDataInfo rspData = getDataTable(ticketBoxes);
+    rspData.setRows(ticketBoxListVOList);
+    return rspData;
+  }
+
+
+  /**
+   * 查看盲票详情
+   */
+  @PostMapping("/ticket/detail")
+  @ApiOperation(value = "查看盲票详情" , notes = "根据盲票组ID,获取盲票信息")
+  public AjaxResult getInfo(@RequestBody TicketBoxParam param) {
+    if (StringUtils.isBlank(param.getBoxId())) {
+      return AjaxResult.error("参数异常,盲票组ID缺失");
+    }
+    TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+    TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
+    ticketBoxVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
+        .eq("t1.box_id", ticketBox.getBoxId()).orderByAsc("t1.sort").orderByDesc("t2.value")));
+    return AjaxResult.success(ticketBoxVO);
+  }
+
+}

+ 43 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/common/AreaQueryController.java

@@ -0,0 +1,43 @@
+package com.qs.mp.web.controller.api.common;
+
+import com.alibaba.fastjson.JSONObject;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.domain.Area;
+import com.qs.mp.common.service.IAreaService;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 省市区通用查询,渠道、用户端共用
+ * @author zhongcp on 2022/3/2.
+ */
+@RestController
+@RequestMapping("/api/v1/mp")
+@Api(tags="省市区接口")
+public class AreaQueryController extends BaseApiController {
+
+    @Autowired
+    private IAreaService areaService;
+
+    /**
+	 * 分页获取
+	 */
+    @PostMapping("/area/listByPid")
+    @ApiOperation(value="获取省市区信息", notes="根据省市区的pid获取地址信息")
+	public AjaxResult listByPid(@RequestBody JSONObject jsonObject){
+      Long pid = jsonObject.getLong("pid");
+		  List<Area> list = areaService.listByPid(pid);
+		  return AjaxResult.success(list);
+	}
+
+}

+ 122 - 27
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserController.java → mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java

@@ -1,10 +1,14 @@
-package com.qs.mp.web.controller.api.user;
+package com.qs.mp.web.controller.api.common;
 
 import cn.jsms.api.ValidSMSResult;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.common.constant.Constants;
 import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.enums.UserIdentityEnum;
 import com.qs.mp.common.enums.WxActTypeEnum;
 import com.qs.mp.common.jsms.JSMSUtils;
 import com.qs.mp.common.qcloud.QcloudFileUtils;
@@ -15,7 +19,9 @@ import com.qs.mp.common.utils.http.HttpUtils;
 import com.qs.mp.core.domain.LoginUser;
 import com.qs.mp.framework.domain.WxAccount;
 import com.qs.mp.framework.security.handle.HostHolder;
+import com.qs.mp.framework.service.IAppTokenService;
 import com.qs.mp.framework.service.IWxAccountService;
+import com.qs.mp.framework.web.service.SysLoginService;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.domain.vo.WxLoginParams;
 import com.qs.mp.system.service.ISysUserService;
@@ -45,9 +51,9 @@ import org.springframework.web.bind.annotation.RestController;
  * @describe
  */
 
-@Api("户钱包API")
+@Api("户钱包API")
 @RestController
-@RequestMapping("/api/v1/ygp")
+@RequestMapping("/api/v1/mp")
 @Component
 public class UserController extends BaseApiController {
 
@@ -60,10 +66,18 @@ public class UserController extends BaseApiController {
   @Autowired
   private IWxAccountService wxAccountService;
 
-  @Value("${wx.appId}")
-  private String appId;
-  @Value("${wx.appSecret}")
-  private String appSecret;
+  @Autowired
+  private IChannelService channelService;
+
+  @Value("${wx-channel.appId}")
+  private String channelAppId;
+  @Value("${wx-channel.appSecret}")
+  private String channelAppSecret;
+
+  @Value("${wx-user.appId}")
+  private String userAppId;
+  @Value("${wx-user.appSecret}")
+  private String userAppSecret;
 
   /**
    * 文件上传路径
@@ -77,12 +91,24 @@ public class UserController extends BaseApiController {
   @Value("${cloud.public-bucket-name}")
   private String publicBucketName;
 
+  @Autowired
+  private IAppTokenService appTokenService;
+
+  @Autowired
+  private SysLoginService sysLoginService;
+
 
   @RequestMapping(value = "/user/wxauth", method = RequestMethod.POST)
   @ResponseBody
   public AjaxResult wxauth(@RequestBody WxLoginParams wxLoginParams) {
+    String appId = channelAppId;
+    String appSecret = channelAppSecret;
+    if (wxLoginParams.getIdentity() == UserIdentityEnum.USER.ordinal()) {
+      appId = userAppId;
+      appSecret = userAppSecret;
+    }
     //调用微信后台接口获取openId
-    String res = wxLoginCheck(wxLoginParams, appSecret);
+    String res = wxLoginCheck(wxLoginParams, appId, appSecret);
     JSONObject jsonObject = JSONObject.parseObject(res);
     String openId = jsonObject.getString("openid");
     String sessionKey = jsonObject.getString("session_key");
@@ -96,7 +122,12 @@ public class UserController extends BaseApiController {
     LoginUser loginUser = hostHolder.getUser();
     SysUser user = new SysUser();
     user.setUserId(loginUser.getUserId());
-    user.setOpenId(openId);
+    if (wxLoginParams.getIdentity() == UserIdentityEnum.USER.ordinal()) {
+      user.setOpenId(openId);
+    } else {
+      user.setChannelOpenId(openId);
+    }
+
     user.setSessionKey(sessionKey);
     user.setUnionId(unionId);
     user.setLoginDate(new Date());
@@ -131,6 +162,51 @@ public class UserController extends BaseApiController {
     return success("微信授权成功");
   }
 
+
+  @RequestMapping(value = "/user/wxauth/mobile", method = RequestMethod.POST)
+  @ResponseBody
+  public AjaxResult wxauthMobile(@RequestBody WxLoginParams wxLoginParams) {
+    String appId = userAppId;
+    String appSecret = userAppSecret;
+    if (UserIdentityEnum.isChannel(wxLoginParams.getIdentity())) {
+      appId = channelAppId;
+      appSecret = channelAppSecret;
+    }
+    //调用微信后台接口获取openId
+    String res = getWxMobile(wxLoginParams, appId);
+    JSONObject jsonObject = JSONObject.parseObject(res);
+    int errcode = jsonObject.getIntValue("errcode");
+    if (errcode != 0 ) {
+      LogUtil.error(logger, "手机号获取失败:" + res);
+      return error("手机号获取失败");
+    }
+    JSONObject phoneInfo = jsonObject.getJSONObject("phone_info");
+    String phoneNumber = phoneInfo.getString("phoneNumber");
+
+    if (StringUtils.isBlank(phoneNumber)) {
+      LogUtil.error(logger, "微信手机号不存在:" + res);
+      return error("手机号获取失败");
+    }
+    AjaxResult ajax = AjaxResult.success();
+
+    SysUser sysUser = sysUserService.selectUserByUserName(phoneNumber);
+    if (null == sysUser) {
+      if (wxLoginParams.getIdentity() != UserIdentityEnum.USER.ordinal()) {
+        return error("用户不存在,请联系客服");
+      }
+      // C端直接注册新用户
+      sysUser = new SysUser();
+      sysUser.setUserName(phoneNumber);
+      sysUser.setNickName(phoneNumber);
+      sysUserService.registerUser(sysUser);
+    }
+    Map<String, String> result = sysLoginService.wxAuthLogin(phoneNumber, wxLoginParams.getIdentity());
+    for (String key : result.keySet()) {
+      ajax.put(key, result.get(key));
+    }
+    return ajax;
+  }
+
   /**
    * 重置密码
    */
@@ -158,10 +234,18 @@ public class UserController extends BaseApiController {
   @RequestMapping(value = "/user/getLoginUserinfo", method = RequestMethod.POST)
   public AjaxResult getLoginUserinfo(@RequestBody JSONObject params) {
     LoginUser loginUser = hostHolder.getUser();
+
     JSONObject jsonObject = new JSONObject();
     jsonObject.put("userName", loginUser.getUsername());
     jsonObject.put("avatar", loginUser.getUser().getAvatar());
-    jsonObject.put("nickName", loginUser.getUser().getNickName());
+    if(loginUser.getIdentity() == UserIdentityEnum.CHANNEL) {
+      Channel channel = channelService.getById(loginUser.getChannelId());
+      jsonObject.put("nickName", channel.getName());
+    } else {
+      jsonObject.put("nickName", loginUser.getUser().getNickName());
+    }
+    jsonObject.put("openId", loginUser.getUser().getOpenId());
+    jsonObject.put("channelOpenId", loginUser.getUser().getChannelOpenId());
     JSONArray roleKeys = new JSONArray();
     JSONArray roles = new JSONArray();
     loginUser.getUser().getRoles().forEach(sysRole -> roles.add(sysRole.getRoleName()));
@@ -179,13 +263,40 @@ public class UserController extends BaseApiController {
    * @param
    * @return
    */
-  private String wxLoginCheck(WxLoginParams params, String appSecret) {
+  private String wxLoginCheck(WxLoginParams params, String appId, String appSecret) {
     String param = "appid=" + appId + "&secret=" + appSecret + "&js_code=" + params.getCode()
         + "&grant_type=authorization_code";
     String res = HttpUtils.sendGet("https://api.weixin.qq.com/sns/jscode2session", param);
     return res;
   }
 
+  /**
+   * code 换取 手机号
+   *{
+   *     "errcode":0,
+   *     "errmsg":"ok",
+   *     "phone_info": {
+   *         "phoneNumber":"xxxxxx",
+   *         "purePhoneNumber": "xxxxxx",
+   *         "countryCode": 86,
+   *         "watermark": {
+   *             "timestamp": 1637744274,
+   *             "appid": "xxxx"
+   *         }
+   *     }
+   * }
+   * @param
+   * @return
+   */
+  private String getWxMobile(WxLoginParams params, String appId) {
+    String accessToken = appTokenService.getAccessToken(appId);
+    JSONObject jsonObject = new JSONObject();
+    jsonObject.put("code", params.getCode());
+    LogUtil.info(logger, JSONObject.toJSONString(params));
+    String res = HttpUtils.sendPost("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken, jsonObject.toJSONString());
+    return res;
+  }
+
   /**
    * { "subscribe": 1, "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", "nickname": "Band", "sex": 1,
    * "language": "zh_CN", "city": "广州", "province": "广东", "country": "中国", "headimgurl":
@@ -204,22 +315,6 @@ public class UserController extends BaseApiController {
     return res;
   }
 
-  /**
-   * {"access_token":"ACCESS_TOKEN","expires_in":7200}
-   *
-   * @param appId
-   * @param appSecret
-   * @return
-   */
-  private String wxGetAccessToken(String appId, String appSecret) {
-    String param = "appid=" + appId + "&secret=" + appSecret + "&grant_type=client_credential";
-    String res = HttpUtils.sendGet("https://api.weixin.qq.com/cgi-bin/token", param);
-    JSONObject tokenJson = JSONObject.parseObject(res);
-    String token = tokenJson.getString("access_token");
-    return token;
-
-  }
-
   private JSONObject saveHeadImage(String serverUrl,String userId) throws Exception {
     String outFilePath = filePath+"/headImage";
     File outPath = new File(outFilePath);

+ 1 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/sms/SmsController.java

@@ -25,7 +25,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 @Api("短信验证码服务")
 @RestController
-@RequestMapping("/api/v1/ygp/*")
+@RequestMapping("/api/v1/mp/*")
 @Component
 public class SmsController extends BaseApiController {
 

+ 157 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserAddrController.java

@@ -0,0 +1,157 @@
+package com.qs.mp.web.controller.api.user;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.user.domain.UserAddr;
+import com.qs.mp.channel.domain.param.AddrParam;
+import com.qs.mp.user.service.IUserAddrService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.utils.SecurityUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.Date;
+import java.util.List;
+import javax.validation.Valid;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/user")
+@Api(tags = "地址接口")
+@AllArgsConstructor
+public class UserAddrController {
+
+
+  @Autowired
+  private IUserAddrService userAddrService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  /**
+   * 选择订单配送地址
+   */
+  @PostMapping("/addr/list")
+  @ApiOperation(value = "渠道地址列表" , notes = "获取渠道的所有地址信息")
+  public AjaxResult list(@RequestBody AddrParam addrParam) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    List<UserAddr> userAddrs = userAddrService.list(
+        new LambdaQueryWrapper<UserAddr>().eq(UserAddr::getUserId, userId)
+            .orderByDesc(UserAddr::getCommonAddr).orderByDesc(UserAddr::getUpdateTime));
+    return AjaxResult.success(userAddrs);
+  }
+
+  @PostMapping("/addr/create")
+  @ApiOperation(value = "新增用户地址" , notes = "新增用户地址")
+  public AjaxResult create(@Valid @RequestBody AddrParam addrParam) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+
+    if (addrParam.getAddrId() != null && addrParam.getAddrId() != 0) {
+      return AjaxResult.error("该地址已存在");
+    }
+    int addrCount = userAddrService.count(
+        new LambdaQueryWrapper<UserAddr>().eq(UserAddr::getUserId, userId));
+    UserAddr userAddr = mapperFacade.map(addrParam, UserAddr.class);
+
+    if (addrCount == 0) {
+      userAddr.setCommonAddr(1);
+    } else {
+      userAddr.setCommonAddr(0);
+    }
+    userAddr.setUserId(userId);
+    userAddr.setStatus(1);
+    userAddr.setCreateTime(new Date());
+    userAddr.setUpdateTime(new Date());
+    userAddrService.save(userAddr);
+
+    return AjaxResult.success("添加地址成功");
+  }
+
+  /**
+   * 修改订单配送地址
+   */
+  @PostMapping("/addr/update")
+  @ApiOperation(value = "修改订单用户地址" , notes = "修改用户地址")
+  public AjaxResult update(@Valid @RequestBody AddrParam addrParam) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+
+    UserAddr dbChannelAddr = userAddrService.getChannelAddrByUserId(addrParam.getAddrId(),
+        userId);
+    if (dbChannelAddr == null) {
+      return AjaxResult.error("该地址已被删除");
+    }
+
+    UserAddr userAddr = mapperFacade.map(addrParam, UserAddr.class);
+    userAddr.setUserId(userId);
+    userAddrService.updateById(userAddr);
+    return AjaxResult.success("修改地址成功");
+  }
+
+  /**
+   * 删除订单配送地址
+   */
+  @PostMapping("/addr/remove")
+  @ApiOperation(value = "删除订单用户地址" , notes = "根据地址id,删除用户地址")
+  public AjaxResult remove(@RequestBody AddrParam addrParam) {
+    if (addrParam.getAddrId() == null || addrParam.getAddrId() == 0) {
+      return AjaxResult.error("参数异常,地址ID缺失");
+    }
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    UserAddr channelAddr = userAddrService.getChannelAddrByUserId(addrParam.getAddrId(),
+        userId);
+    if (channelAddr == null) {
+      return AjaxResult.error("该地址已被删除");
+    }
+    if (channelAddr.getCommonAddr() == 1) {
+      return AjaxResult.error("默认地址无法删除");
+    }
+    userAddrService.removeById(addrParam.getAddrId());
+    return AjaxResult.success();
+  }
+
+  /**
+   * 设置默认地址
+   */
+  @PostMapping("/addr/setDefault")
+  @ApiOperation(value = "设置默认地址" , notes = "根据地址id,设置默认地址")
+  public AjaxResult defaultAddr(@RequestBody AddrParam addrParam) {
+    if (addrParam.getAddrId() == null || addrParam.getAddrId() == 0) {
+      return AjaxResult.error("参数异常,地址ID缺失");
+    }
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    userAddrService.updateDefaultChannelAddr(addrParam.getAddrId(), userId);
+    return AjaxResult.success();
+  }
+
+  /**
+   * 查询默认地址
+   */
+  @PostMapping("/addr/queryDefault")
+  @ApiOperation(value = "查询默认地址" , notes = "查询默认地址")
+  public AjaxResult queryDefaultAddr(@RequestBody AddrParam addrParam) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    UserAddr addr = userAddrService.getDefaultChannelAddr(userId);
+    return AjaxResult.success(addr);
+  }
+
+  /**
+   * 获取配送地址
+   */
+  @PostMapping("/addr/query")
+  @ApiOperation(value = "获取地址信息" , notes = "根据地址id,获取地址信息")
+  public AjaxResult info(@RequestBody AddrParam addrParam) {
+    if (addrParam.getAddrId() == null || addrParam.getAddrId() == 0) {
+      return AjaxResult.error("参数异常,地址ID缺失");
+    }
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    UserAddr channelAddr = userAddrService.getChannelAddrByUserId(addrParam.getAddrId(),
+        userId);
+    return AjaxResult.success(channelAddr);
+  }
+
+}

+ 200 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java

@@ -0,0 +1,200 @@
+package com.qs.mp.web.controller.api.user;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.ChannelOrderItem;
+import com.qs.mp.channel.domain.param.OrderPayParam;
+import com.qs.mp.channel.domain.vo.ChannelOrderVO;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.BizTypeEnum;
+import com.qs.mp.common.enums.PrizeStorageStatusEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.framework.redis.RedisKey;
+import com.qs.mp.pay.service.IWalletService;
+import com.qs.mp.user.domain.UserAddr;
+import com.qs.mp.user.domain.UserDeliverOrder;
+import com.qs.mp.user.domain.UserDeliverOrderItem;
+import com.qs.mp.user.domain.UserPrizeStorage;
+import com.qs.mp.user.domain.param.DeliverOrderParam;
+import com.qs.mp.user.domain.vo.DeliverOrderSettleVO;
+import com.qs.mp.user.domain.vo.DeliverOrderVO;
+import com.qs.mp.user.service.IUserAddrService;
+import com.qs.mp.user.service.IUserDeliverOrderItemService;
+import com.qs.mp.user.service.IUserDeliverOrderService;
+import com.qs.mp.user.service.IUserPrizeStorageService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import javax.validation.Valid;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/user/deliver")
+@Api(tags = "用户端奖品提货接口")
+@AllArgsConstructor
+public class UserDeliverOrderController extends BaseApiController {
+
+  @Autowired
+  private IUserPrizeStorageService userPrizeStorageService;
+
+  @Autowired
+  private IUserAddrService userAddrService;
+
+  @Autowired
+  private IUserDeliverOrderService userDeliverOrderService;
+
+  @Autowired
+  private IUserDeliverOrderItemService userDeliverOrderItemService;
+
+  @Autowired
+  private IWalletService walletService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  @Autowired
+  private RedisCache redisCache;
+
+  /**
+   * 订单列表
+   */
+  @PostMapping("/order/list")
+  @ApiOperation(value = "订单列表" , notes = "获取所有订单信息")
+  public TableDataInfo list(@RequestBody JSONObject param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    Integer status = param.getInteger("status");
+    startPage();
+    List<UserDeliverOrder> deliverOrders = userDeliverOrderService.list(
+        new LambdaQueryWrapper<UserDeliverOrder>().eq(UserDeliverOrder::getUserId, userId)
+            .eq(null != status, UserDeliverOrder::getStatus, status)
+            .orderByDesc(UserDeliverOrder::getCreatedTime));
+    List<DeliverOrderVO> deliverOrderVOList = mapperFacade.mapAsList(deliverOrders, DeliverOrderVO.class);
+    for (DeliverOrderVO deliverOrderVO : deliverOrderVOList) {
+      deliverOrderVO.setItems(userDeliverOrderItemService.list(new LambdaQueryWrapper<UserDeliverOrderItem>()
+          .eq(UserDeliverOrderItem::getOrderId, deliverOrderVO.getOrderId())));
+    }
+    TableDataInfo rspData = getDataTable(deliverOrders);
+    rspData.setRows(deliverOrderVOList);
+    return rspData;
+  }
+
+  /**
+   * 订单详情
+   */
+  @PostMapping("/order/detail")
+  @ApiOperation(value = "订单详情" , notes = "在订单列表页面查看详情")
+  public AjaxResult query(@RequestBody UserDeliverOrder order) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    UserDeliverOrder deliverOrder = userDeliverOrderService.getOne(new LambdaQueryWrapper<UserDeliverOrder>()
+        .eq(UserDeliverOrder::getOrderId, order.getOrderId()).eq(UserDeliverOrder::getUserId, userId));
+    DeliverOrderVO deliverOrderVO = mapperFacade.map(deliverOrder, DeliverOrderVO.class);
+    deliverOrderVO.setItems(userDeliverOrderItemService.list(new LambdaQueryWrapper<UserDeliverOrderItem>()
+        .eq(UserDeliverOrderItem::getOrderId, deliverOrderVO.getOrderId())));
+    return AjaxResult.success(deliverOrderVO);
+  }
+
+  /**
+   * 订单结算,每次更换地址时需重新请求此接口
+   */
+  @PostMapping("/order/settle")
+  @ApiOperation(value = "订单结算" , notes = "奖品库里点提货")
+  public AjaxResult settle(@Valid @RequestBody DeliverOrderParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+
+    DeliverOrderSettleVO orderSettleVO = new DeliverOrderSettleVO();
+
+    // 收货地址,如果用户选了地址,则此处不做处理
+    if (null == param.getAddrId() || 0 == param.getAddrId()) {
+      //读取默认地址
+      UserAddr addr = userAddrService.getDefaultChannelAddr(userId);
+      if (null != addr) {
+        orderSettleVO.setAddr(addr);
+      }
+    }
+
+    // 订单金额计算
+    Integer orderAmt = 0;
+    Integer freightAmt = 0;
+
+    List<UserPrizeStorage> prizeStorageList = userPrizeStorageService.list(new LambdaQueryWrapper<UserPrizeStorage>()
+        .eq(UserPrizeStorage::getUserId, userId).eq(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.NOT_DISTRIBUTED)
+        .in(UserPrizeStorage::getStorageId, param.getIds()));
+
+
+    orderSettleVO.setOrderAmt(orderAmt);
+    orderSettleVO.setFreightAmt(freightAmt);
+    orderSettleVO.setPayAmt(orderAmt + freightAmt);
+    orderSettleVO.setPrizeList(prizeStorageList);
+
+    // 缓存订单结算对象
+    redisCache.setCacheObject(RedisKey.build(RedisKey.USER_DELIVER_ORDER_KEY, userId), orderSettleVO, 10, TimeUnit.MINUTES);
+    return AjaxResult.success(orderSettleVO);
+  }
+
+  /**
+   * 提交订单
+   */
+  @PostMapping("/order/submit")
+  @ApiOperation(value = "提交订单" , notes = "在订单确认页面提交")
+  public AjaxResult submit(@RequestBody UserDeliverOrder order) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    DeliverOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_DELIVER_ORDER_KEY, userId));
+    if (null == orderSettleVO) {
+      return AjaxResult.error("订单已过期,请重新下单");
+    }
+    String orderId = userDeliverOrderService.submitOrder(userId, orderSettleVO);
+    JSONObject jsonObject = new JSONObject();
+    jsonObject.put("orderId", orderId);
+    if (orderSettleVO.getPayAmt() > 0) {
+      jsonObject.put("needPay", 1);
+    } else {
+      jsonObject.put("needPay", 0);
+    }
+    // 清除缓存的订单
+    redisCache.deleteObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
+
+    return AjaxResult.success(jsonObject);
+  }
+
+
+  /**
+   * 取消订单
+   */
+  @PostMapping("/order/cancel")
+  @ApiOperation(value = "取消订单" , notes = "在订单列表页面取消")
+  public AjaxResult cancel(@RequestBody ChannelOrder order) {
+    userDeliverOrderService.cancelOrder(order.getOrderId());
+    return AjaxResult.success("取消成功");
+  }
+
+  /**
+   * 订单支付
+   */
+  @PostMapping("/order/pay")
+  @ApiOperation(value = "订单支付" , notes = "订单支付")
+  public AjaxResult pay(@Valid @RequestBody OrderPayParam param) {
+    String openId = SecurityUtils.getLoginUser().getUser().getOpenId();
+    UserDeliverOrder deliverOrder = userDeliverOrderService.getById(param.getOrderId());
+    JSONObject jsonObject;
+    try {
+      jsonObject = walletService.pay(BizTypeEnum.DELIVER_ORDER, param.getOrderId(), openId, deliverOrder.getPayAmt());
+    }catch (ServiceException e) {
+      return AjaxResult.error(e.getMessage());
+    }
+    return AjaxResult.success(jsonObject);
+  }
+
+}

+ 124 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserExchangeController.java

@@ -0,0 +1,124 @@
+package com.qs.mp.web.controller.api.user;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.Goods;
+import com.qs.mp.admin.domain.GoodsSku;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.param.TicketBoxParam;
+import com.qs.mp.admin.domain.param.TicketParam;
+import com.qs.mp.admin.domain.vo.GoodsListVO;
+import com.qs.mp.admin.domain.vo.GoodsVO;
+import com.qs.mp.admin.domain.vo.TicketBoxListVO;
+import com.qs.mp.admin.domain.vo.TicketBoxVO;
+import com.qs.mp.admin.domain.vo.TicketVO;
+import com.qs.mp.admin.service.IGoodsService;
+import com.qs.mp.admin.service.IGoodsSkuService;
+import com.qs.mp.admin.service.ITicketAwardsPrizeService;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.GoodsStatusEnum;
+import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.user.domain.param.ExchangeOrderParam;
+import com.qs.mp.user.service.IUserExchangeOrderService;
+import com.qs.mp.user.service.IUserHitPrizeService;
+import com.qs.mp.user.service.IUserTicketOrderItemService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.ArrayList;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/user/exchange")
+@Api(tags = "盲票商城接口")
+@AllArgsConstructor
+public class UserExchangeController extends BaseApiController {
+
+
+  @Autowired
+  private IGoodsService goodsService;
+
+  @Autowired
+  private IGoodsSkuService goodsSkuService;
+
+  @Autowired
+  private IUserExchangeOrderService userExchangeOrderService;
+
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  /**
+   * 商品列表
+   */
+  @PostMapping("/goods/list")
+  @ApiOperation(value = "商品列表" , notes = "获取所有可兑换商品")
+  public TableDataInfo list(@RequestBody Goods goods) {
+    startPage();
+    List<Goods> goodsList = goodsService.list(new LambdaQueryWrapper<Goods>()
+        .eq(null != goods.getCategoryId() && 0 != goods.getCategoryId(), Goods::getCategoryId, goods.getCategoryId())
+        .eq(Goods::getStatus, GoodsStatusEnum.PUT_ON));
+    List<GoodsListVO> goodsListVOList = mapperFacade.mapAsList(goodsList, GoodsListVO.class);
+    TableDataInfo rspData = getDataTable(goodsList);
+    rspData.setRows(goodsListVOList);
+    return rspData;
+  }
+
+
+  /**
+   * 查看商品详情
+   */
+  @PostMapping("/goods/detail")
+  @ApiOperation(value = "查看商品详情" , notes = "根据商品ID,获取商品信息")
+  public AjaxResult getInfo(@RequestBody Goods param) {
+    if (null == param.getGoodsId() || 0 == param.getGoodsId()) {
+      return AjaxResult.error("参数异常,商品ID缺失");
+    }
+    Goods goods = goodsService.getById(param.getGoodsId());
+    GoodsVO goodsVo = new GoodsVO();
+    BeanUtils.copyProperties(goods, goodsVo);
+    // 查询SKU列表
+    LambdaQueryWrapper<GoodsSku> queryWrapper = new LambdaQueryWrapper<>();
+    queryWrapper.eq(GoodsSku::getGoodsId, goods.getGoodsId());
+    queryWrapper.orderByDesc(GoodsSku::getCreatedTime);
+    List<GoodsSku> skuList = goodsSkuService.list(queryWrapper);
+    if(null != skuList && skuList.size() > 0) {
+      goodsVo.setSkuList(skuList);
+    }
+    return AjaxResult.success(goodsVo);
+  }
+
+  /**
+   * 提交兑换订单
+   */
+  @PostMapping("/submit")
+  @ApiOperation(value = "提交兑换订单" , notes = "提交兑换订单")
+  public AjaxResult submit(@RequestBody ExchangeOrderParam param) {
+    Long userId = SecurityUtils.getUserId();
+    if (null == param.getGoodsId() || 0 == param.getGoodsId() || null == param.getOrderNum()
+        || param.getOrderNum() == 0) {
+      return AjaxResult.error("参数缺失");
+    }
+    userExchangeOrderService.exchange(userId, param.getGoodsId(), param.getSkuId(), param.getOrderNum());
+    return AjaxResult.success();
+  }
+
+}

+ 140 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserMineController.java

@@ -0,0 +1,140 @@
+package com.qs.mp.web.controller.api.user;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.vo.TicketListVO;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.PrizeStorageStatusEnum;
+import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.user.domain.UserCoin;
+import com.qs.mp.user.domain.UserCoinLog;
+import com.qs.mp.user.domain.UserCoupon;
+import com.qs.mp.user.domain.UserPrizeStorage;
+import com.qs.mp.user.domain.vo.UserCouponVO;
+import com.qs.mp.user.service.IUserCoinLogService;
+import com.qs.mp.user.service.IUserCoinService;
+import com.qs.mp.user.service.IUserCouponService;
+import com.qs.mp.user.service.IUserPrizeStorageService;
+import com.qs.mp.user.service.IUserTicketOrderItemService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import java.util.Map;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/user/mine")
+@Api(tags = "我的接口")
+@AllArgsConstructor
+public class UserMineController extends BaseApiController {
+
+
+  @Autowired
+  private IUserTicketOrderItemService userTicketOrderItemService;
+
+  @Autowired
+  private IUserPrizeStorageService userPrizeStorageService;
+
+  @Autowired
+  private IUserCoinService userCoinService;
+
+  @Autowired
+  private IUserCouponService userCouponService;
+
+  @Autowired
+  private IUserCoinLogService userCoinLogService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  /**
+   * 我的票包
+   */
+  @PostMapping("/ticket/list")
+  @ApiOperation(value = "我的盲票列表", notes = "获取我的盲票列表")
+  public TableDataInfo listTicket(@RequestBody Ticket param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    startPage();
+    List<TicketListVO> ticketListVOS = userTicketOrderItemService.listMyTicketVO(userId,
+        param.getStatus());
+    return getDataTable(ticketListVOS);
+  }
+
+  /**
+   * 我的优惠券
+   */
+  @PostMapping("/coupon/list")
+  @ApiOperation(value = "我的优惠券列表", notes = "获取我的优惠券列表")
+  public TableDataInfo listCoupon(@RequestBody UserCoupon param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    startPage();
+    List<UserCouponVO> userCouponVOList = userCouponService.listCoupon(userId, param.getStatus());
+    return getDataTable(userCouponVOList);
+  }
+
+  /**
+   * 我的盲豆
+   */
+  @PostMapping("/coin/log/list")
+  @ApiOperation(value = "我的盲豆记录", notes = "获取我的盲豆记录")
+  public TableDataInfo listCoinLog(@RequestBody JSONObject param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    startPage();
+    List<UserCoinLog> userCoinLogList = userCoinLogService.list(
+        new LambdaQueryWrapper<UserCoinLog>()
+            .eq(UserCoinLog::getUserId, userId).orderByDesc(UserCoinLog::getBizTime));
+    return getDataTable(userCoinLogList);
+  }
+
+  /**
+   * 我的实物奖品库
+   */
+  @PostMapping("/prize/list")
+  @ApiOperation(value = "我的实物奖品库", notes = "获取我的实物奖品库")
+  public TableDataInfo listPrize(@RequestBody JSONObject param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    startPage();
+    List<UserPrizeStorage> userPrizeStorageList = userPrizeStorageService.list(
+        new LambdaQueryWrapper<UserPrizeStorage>()
+            .eq(UserPrizeStorage::getUserId, userId)
+            .eq(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.NOT_DISTRIBUTED)
+            .orderByDesc(UserPrizeStorage::getCreatedTime));
+    return getDataTable(userPrizeStorageList);
+  }
+
+
+  /**
+   * 我的
+   */
+  @PostMapping("/init")
+  @ApiOperation(value = "查看我的", notes = "查看我的")
+  public AjaxResult getInfo(@RequestBody JSONObject param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    Map<String, Object> storageMap = userPrizeStorageService.getMap(
+        new QueryWrapper<UserPrizeStorage>()
+            .select("IFNULL(goods_num,0) as total")
+            .eq("user_id", userId).eq("status", PrizeStorageStatusEnum.NOT_DISTRIBUTED));
+    JSONObject result = new JSONObject();
+    result.put("prizeNum", Integer.valueOf(String.valueOf(null != storageMap ? storageMap.get("total") : 0)));
+
+    int ticketNum = userTicketOrderItemService.countMyTicket(userId, TicketStatusEnum.ACTIVATED);
+    result.put("ticketNum", ticketNum);
+
+    UserCoin userCoin = userCoinService.getById(userId);
+    result.put("coinNum", null != userCoin ? userCoin.getCoin() : 0);
+    return AjaxResult.success(result);
+  }
+
+}

+ 213 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java

@@ -0,0 +1,213 @@
+package com.qs.mp.web.controller.api.user;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.param.TicketBoxParam;
+import com.qs.mp.admin.domain.param.TicketParam;
+import com.qs.mp.admin.domain.vo.TicketBoxListVO;
+import com.qs.mp.admin.domain.vo.TicketBoxVO;
+import com.qs.mp.admin.domain.vo.TicketVO;
+import com.qs.mp.admin.service.ITicketAwardsPrizeService;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.user.domain.UserDeliverOrderItem;
+import com.qs.mp.user.domain.UserTicketOrderItem;
+import com.qs.mp.user.service.IUserHitPrizeService;
+import com.qs.mp.user.service.IUserTicketOrderItemService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/user")
+@Api(tags = "盲票商城接口")
+@AllArgsConstructor
+public class UserTicketController extends BaseApiController {
+
+
+  @Autowired
+  private ITicketBoxService ticketBoxService;
+
+  @Autowired
+  private ITicketAwardsPrizeService ticketAwardsPrizeService;
+
+  @Autowired
+  private ITicketService ticketService;
+
+  @Autowired
+  private IUserTicketOrderItemService userTicketOrderItemService;
+
+  @Autowired
+  private IUserHitPrizeService userHitPrizeService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  /**
+   * 盲票进货列表
+   */
+  @PostMapping("/mall/ticket/list")
+  @ApiOperation(value = "盲票组列表" , notes = "获取所有盲票信息")
+  public TableDataInfo list(@RequestBody TicketBoxParam param) {
+    // TODO 根据标签过滤
+    startPage();
+    List<TicketBox> ticketBoxes = ticketBoxService.list(
+        new LambdaQueryWrapper<TicketBox>().eq(TicketBox::getType, param.getType())
+            .eq(null != param.getCategoryId() && 0 != param.getCategoryId(), TicketBox::getCategoryId, param.getCategoryId())
+            .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON));
+    List<TicketBoxListVO> ticketBoxListVOList = mapperFacade.mapAsList(ticketBoxes, TicketBoxListVO.class);
+    TableDataInfo rspData = getDataTable(ticketBoxes);
+    rspData.setRows(ticketBoxListVOList);
+    return rspData;
+  }
+
+
+  /**
+   * 查看盲票详情
+   */
+  @PostMapping("/mall/ticket/detail")
+  @ApiOperation(value = "查看盲票详情" , notes = "根据盲票组ID,获取盲票信息")
+  public AjaxResult getInfo(@RequestBody TicketBoxParam param) {
+    if (StringUtils.isBlank(param.getBoxId())) {
+      return AjaxResult.error("参数异常,盲票组ID缺失");
+    }
+    TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+    TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
+    ticketBoxVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
+        .eq("t1.box_id", ticketBox.getBoxId()).orderByAsc("t1.sort").orderByDesc("t2.value")));
+    return AjaxResult.success(ticketBoxVO);
+  }
+
+  /**
+   * 扫码查看盲票幸运数字
+   */
+  @PostMapping("/ticket/queryLuckyNum")
+  @ApiOperation(value = "查看盲票幸运数字" , notes = "根据盲票组ID,获取盲票幸运数字")
+  public AjaxResult queryLuckyNum(@RequestBody TicketParam param) {
+
+    if (StringUtils.isBlank(param.getSerialNo())) {
+      return AjaxResult.error("参数异常,盲票序列号缺失");
+    }
+
+    Ticket ticket = ticketService.getOne(new LambdaQueryWrapper<Ticket>().eq(Ticket::getSerialNo, param.getSerialNo()));
+    if (null == ticket) {
+      return AjaxResult.error("参数异常,盲票不存在");
+    }
+
+    /*if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
+    }*/
+
+    // 已付款的盲票,需要校验当前用户是否有权限查看
+    /*if (ticket.getStatus() == TicketStatusEnum.ACTIVATED) {
+      Long userId = SecurityUtils.getLoginUser().getUserId();
+      UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId, ticket.getTicketId());
+      if (null == orderItem) {
+        return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1018);
+      }
+    }*/
+
+    TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
+
+    TicketVO ticketVO = new TicketVO();
+    ticketVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
+        .eq("t1.box_id", ticketBox.getBoxId()).orderByAsc("t1.sort").orderByDesc("t2.value")));
+    ticketVO.setTicketId(ticket.getTicketId());
+    ticketVO.setBoxId(ticket.getBoxId());
+    ticketVO.setTitle(ticketBox.getTitle());
+    ticketVO.setSerialNo(ticket.getSerialNo());
+    ticketVO.setFacePrice(ticket.getFacePrice());
+    ticketVO.setSalePrice(ticketBox.getSalePrice());
+    ticketVO.setPlainLuckyNum(ticket.getPlainLuckyNum());
+    ticketVO.setStatus(ticket.getStatus().getValue());
+    ticketVO.setPicUrl(ticketBox.getPicUrl());
+
+    return AjaxResult.success(ticketVO);
+  }
+
+  /**
+   * 查看能兑奖的奖品
+   */
+  @PostMapping("/ticket/queryHitPrizeList")
+  @ApiOperation(value = "查看兑奖奖品" , notes = "根据盲票ID,查看兑奖奖品")
+  public AjaxResult queryHitPrizeList(@RequestBody TicketParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    if (StringUtils.isBlank(param.getTicketId()) && StringUtils.isBlank(param.getOrderId())) {
+      return AjaxResult.error("参数缺失");
+    }
+    String ticketId = param.getTicketId();
+    if (StringUtils.isBlank(ticketId)) {
+      List<UserTicketOrderItem> orderItemList = userTicketOrderItemService.list(new LambdaQueryWrapper<UserTicketOrderItem>()
+          .eq(UserTicketOrderItem::getOrderId, param.getOrderId()));
+      if (CollectionUtils.isEmpty(orderItemList)) {
+        return AjaxResult.error("参数异常,盲票不存在");
+      }
+      ticketId = orderItemList.get(0).getTicketId();
+    }
+    Ticket ticket = ticketService.getById(ticketId);
+
+    if (null == ticket) {
+      return AjaxResult.error("参数异常,盲票不存在");
+    }
+    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
+    }
+    if (ticket.getStatus() != TicketStatusEnum.ACTIVATED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1019);
+    }
+    List<TicketAwardsPrize> ticketAwardsPrizes = userHitPrizeService.listPrize(ticket, userId);
+    JSONObject jsonObject = new JSONObject();
+    jsonObject.put("prizeList", ticketAwardsPrizes);
+    jsonObject.put("ticketId", ticket.getTicketId());
+    return AjaxResult.success(jsonObject);
+  }
+
+  /**
+   * 兑奖
+   */
+  @PostMapping("/ticket/cashPrize")
+  @ApiOperation(value = "兑奖" , notes = "选择奖品兑奖")
+  public AjaxResult cashPrize(@RequestBody TicketParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    if (StringUtils.isBlank(param.getTicketId()) || StringUtils.isBlank(param.getAwardsId())
+    || StringUtils.isBlank(param.getPrizeId())) {
+      return AjaxResult.error("参数缺失");
+    }
+
+    Ticket ticket = ticketService.getById(param.getTicketId());
+    if (null == ticket) {
+      return AjaxResult.error("参数异常,盲票不存在");
+    }
+    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
+    }
+    if (ticket.getStatus() != TicketStatusEnum.ACTIVATED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1019);
+    }
+
+    userHitPrizeService.cashPrize(ticket, userId, param.getAwardsId(), param.getPrizeId());
+    return AjaxResult.success();
+  }
+
+}

+ 195 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java

@@ -0,0 +1,195 @@
+package com.qs.mp.web.controller.api.user;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.CouponTicket;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.service.ICouponTicketService;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.param.OrderPayParam;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.BizTypeEnum;
+import com.qs.mp.common.enums.CouponUseAreaEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.framework.redis.RedisKey;
+import com.qs.mp.pay.service.IWalletService;
+import com.qs.mp.user.domain.UserTicketOrder;
+import com.qs.mp.user.domain.param.TicketOrderParam;
+import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
+import com.qs.mp.user.domain.vo.UserCouponVO;
+import com.qs.mp.user.service.IUserCouponService;
+import com.qs.mp.user.service.IUserTicketOrderService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import javax.validation.Valid;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/user/ticket")
+@Api(tags = "用户端购买盲票接口")
+@AllArgsConstructor
+public class UserTicketOrderController extends BaseApiController {
+
+
+  @Autowired
+  private ITicketBoxService ticketBoxService;
+
+  @Autowired
+  private IUserTicketOrderService userTicketOrderService;
+
+  @Autowired
+  private ITicketService ticketService;
+
+  @Autowired
+  private IUserCouponService userCouponService;
+
+  @Autowired
+  private ICouponTicketService couponTicketService;
+
+  @Autowired
+  private IWalletService walletService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  @Autowired
+  private RedisCache redisCache;
+
+
+  /**
+   * 订单结算,每次更换优惠券时需重新请求此接口
+   */
+  @PostMapping("/order/settle")
+  @ApiOperation(value = "订单结算" , notes = "单个盲票商品上点立即购买")
+  public AjaxResult settle(@Valid @RequestBody TicketOrderParam param) {
+    if (StringUtils.isBlank(param.getTicketId()) && StringUtils.isBlank(param.getBoxId())) {
+      return AjaxResult.error("参数缺失");
+    }
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+
+    TicketOrderSettleVO orderSettleVO = new TicketOrderSettleVO();
+
+
+    // 订单金额计算
+    Integer orderAmt = 0;
+    Integer discountAmt = 0;
+    TicketBox ticketBox;
+    if (StringUtils.isNotBlank(param.getTicketId())) {
+      // 线下扫码购票
+      Ticket ticket = ticketService.getById(param.getTicketId());
+      ticketBox = ticketBoxService.getById(ticket.getBoxId());
+      orderAmt = ticketBox.getSalePrice();
+    } else {
+      // 线上购票
+      ticketBox = ticketBoxService.getById(param.getBoxId());
+      orderAmt = ticketBox.getSalePrice() * param.getOrderNum();
+    }
+
+    if (param.getAutoCoupon() == 1) {
+      // 系统自动选择优惠券,按照金额从大到小排序
+      List<UserCouponVO> userCouponList = userCouponService.listTicketOrderCoupon(userId);
+      for (UserCouponVO userCouponVO : userCouponList) {
+        if (orderAmt >= userCouponVO.getMinOrderAmt() && orderAmt >= userCouponVO.getDiscount()) {
+          if (userCouponVO.getUseArea() == CouponUseAreaEnum.PRE_SCOPE) {
+            // 使用范围验证
+            List<CouponTicket> couponTicketList = couponTicketService.list(new LambdaQueryWrapper<CouponTicket>()
+                .eq(CouponTicket::getCouponId, userCouponVO.getCouponId()).eq(CouponTicket::getBoxId, ticketBox.getBoxId()));
+            if (CollectionUtils.isEmpty(couponTicketList)) {
+              continue;
+            }
+          }
+          orderSettleVO.getCouponList().add(userCouponVO);
+          discountAmt = userCouponVO.getDiscount();
+        }
+      }
+    } else if (!CollectionUtils.isEmpty(param.getUserCouponIds())){
+      // 查询指定券
+      orderSettleVO.setCouponList(userCouponService.listTicketOrderCouponByIds(param.getUserCouponIds()));
+    }
+
+    orderSettleVO.setOrderAmt(orderAmt);
+    orderSettleVO.setDiscountAmt(discountAmt);
+    // 当前没有运费和优惠,实付金额=订单金额
+    orderSettleVO.setPayAmt(orderAmt - discountAmt);
+    orderSettleVO.setOrderNum(param.getOrderNum());
+    orderSettleVO.setBoxId(param.getBoxId());
+    orderSettleVO.setTicketId(param.getTicketId());
+    orderSettleVO.setPicUrl(ticketBox.getPicUrl());
+
+    // 缓存订单结算对象
+    redisCache.setCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId), orderSettleVO, 10, TimeUnit.MINUTES);
+    return AjaxResult.success(orderSettleVO);
+  }
+
+
+  /**
+   * 提交订单
+   */
+  @PostMapping("/order/submit")
+  @ApiOperation(value = "提交订单" , notes = "在订单确认页面提交")
+  public AjaxResult submit(@RequestBody UserTicketOrder order) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
+    if (null == orderSettleVO) {
+      return AjaxResult.error("订单已过期,请重新下单");
+    }
+    String orderId = userTicketOrderService.submitOrder(userId, orderSettleVO);
+    JSONObject jsonObject = new JSONObject();
+    jsonObject.put("orderId", orderId);
+    if (orderSettleVO.getPayAmt() > 0) {
+      jsonObject.put("needPay", 1);
+    } else {
+      jsonObject.put("needPay", 0);
+    }
+    // 清除缓存的订单
+    redisCache.deleteObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
+
+    return AjaxResult.success(jsonObject);
+  }
+
+
+  /**
+   * 取消订单
+   */
+  @PostMapping("/order/cancel")
+  @ApiOperation(value = "取消订单" , notes = "在订单列表页面取消")
+  public AjaxResult cancel(@RequestBody ChannelOrder order) {
+    userTicketOrderService.cancelOrder(order.getOrderId());
+    return AjaxResult.success("取消成功");
+  }
+
+  /**
+   * 订单支付
+   */
+  @PostMapping("/order/pay")
+  @ApiOperation(value = "订单支付" , notes = "在盲票页面支付")
+  public AjaxResult pay(@Valid @RequestBody OrderPayParam param) {
+    String openId = SecurityUtils.getLoginUser().getUser().getOpenId();
+    UserTicketOrder ticketOrder = userTicketOrderService.getById(param.getOrderId());
+    JSONObject jsonObject;
+    try {
+      jsonObject = walletService.pay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), openId, ticketOrder.getPayAmt());
+    }catch (ServiceException e) {
+      return AjaxResult.error(e.getMessage());
+    }
+    return AjaxResult.success(jsonObject);
+  }
+
+}

+ 1 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/common/FileDownloadController.java

@@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-@RequestMapping("/api/v1/qs/*")
+@RequestMapping("/api/v1/mp/*")
 @RestController
 @Component
 public class FileDownloadController extends BaseApiController {

+ 4 - 9
mp-admin/src/main/java/com/qs/mp/web/controller/common/FileUploadController.java

@@ -28,7 +28,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
-@RequestMapping("/api/v1/ygp/*")
+@RequestMapping("/api/v1/mp/*")
 @RestController
 @Component
 public class FileUploadController extends BaseApiController {
@@ -52,11 +52,6 @@ public class FileUploadController extends BaseApiController {
     @Value("${cloud.private-bucket-name}")
     private String privateBucketName;
 
-    /**
-     * 模板原稿文件目录
-     */
-    @Value("${cloud.template-dir}")
-    private String tempSrcDir;
 
     @Autowired
     protected HostHolder hostHolder;
@@ -81,9 +76,9 @@ public class FileUploadController extends BaseApiController {
             LogUtil.info(log, "文件上传,fileName:{0}, ContentType:{1}", new Object[]{file.getOriginalFilename(), mimeType});
             String fileName = file.getOriginalFilename();
             String saveAs = fileName;
-            // 模板原稿文件保存到指定目录
-            if ("template".equals(fileType)){
-                saveAs = tempSrcDir + fileName;
+            // 指定目录
+            if (StringUtils.isNotBlank(fileType)){
+                saveAs = fileType + "/" + fileName;
             }
             QcloudFileUtils.putStream(file.getInputStream(), saveAs,
                 privateBucketName, mimeType);

+ 60 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/common/WxServerController.java

@@ -0,0 +1,60 @@
+package com.qs.mp.web.controller.common;
+
+import com.alibaba.fastjson.JSONObject;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.domain.AjaxResult.Type;
+import com.qs.mp.framework.service.IWxUrlLinkService;
+import com.qs.mp.utils.SecurityUtils;
+import io.swagger.annotations.Api;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @auther zhongcp
+ * @create 2022-02-28 16:17:48
+ * @describe 渠道邀请前端控制器
+ */
+@Api("微信服务端调用API")
+@RestController
+@RequestMapping("/api/v1/mp/wx/*")
+@Component
+public class WxServerController extends BaseApiController {
+
+	@Autowired
+	private IWxUrlLinkService wxUrlLinkService;
+
+	@Value("${wx-user.appId}")
+	private String userAppId;
+
+	/**
+	 * 用户扫描盲票二维码,生成schemaUrl,每天限量50w个
+	 *
+	 * @return
+	 */
+	@PostMapping("urlschema/generate")
+	public AjaxResult generateUrlSchema(@RequestBody  JSONObject jsonObject) {
+		String query = jsonObject.getString("query");
+		String path = jsonObject.getString("path"); // "/pages/deposit/index"
+		String rst = wxUrlLinkService.generateUrlSchema(path, query, userAppId);
+		return new AjaxResult(Type.SUCCESS, "", rst);
+	}
+
+	/**
+	 * 生成盲票购买小程序码
+	 *
+	 * @return
+	 */
+	@PostMapping("code/generate")
+	public AjaxResult generateInviteCode(@RequestBody  JSONObject jsonObject) {
+		String id = jsonObject.getString("id");
+		String rst = wxUrlLinkService.generateCode("pages/lucky/index", "id=" + id, userAppId);
+		return new AjaxResult(Type.SUCCESS, "", rst);
+	}
+}

+ 16 - 10
mp-admin/src/main/java/com/qs/mp/web/controller/system/SysLoginController.java

@@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 /**
  * 登录验证
- * 
+ *
  * @author ygp
  */
 @RestController
@@ -46,7 +46,7 @@ public class SysLoginController
 
     /**
      * 登录方法
-     * 
+     *
      * @param loginBody 登录信息
      * @return 结果
      */
@@ -59,9 +59,11 @@ public class SysLoginController
             loginBody.getUuid());
 
         // 生成令牌
-        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
+        Map<String, String> result = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
                 loginBody.getUuid(), loginBody.getIdentity());
-        ajax.put(Constants.TOKEN, token);
+        for (String key : result.keySet()) {
+            ajax.put(key, result.get(key));
+        }
         return ajax;
     }
 
@@ -70,9 +72,11 @@ public class SysLoginController
     {
         AjaxResult ajax = AjaxResult.success();
         // 生成令牌
-        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
+        Map<String, String> result = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
             loginBody.getUuid(), loginBody.getIdentity());
-        ajax.put(Constants.TOKEN, token);
+        for (String key : result.keySet()) {
+            ajax.put(key, result.get(key));
+        }
         return ajax;
     }
 
@@ -84,14 +88,16 @@ public class SysLoginController
             return AjaxResult.error("请输入6位验证码");
         }
         AjaxResult ajax = AjaxResult.success();
-        String token = loginService.login(smsCode);
-        ajax.put(Constants.TOKEN, token);
+        Map<String, String> result = loginService.login(smsCode);
+        for (String key : result.keySet()) {
+            ajax.put(key, result.get(key));
+        }
         return ajax;
     }
 
     /**
      * 获取用户信息
-     * 
+     *
      * @return 用户信息
      */
     @GetMapping("getInfo")
@@ -111,7 +117,7 @@ public class SysLoginController
 
     /**
      * 获取路由信息
-     * 
+     *
      * @return 路由信息
      */
     @GetMapping("getRouters")

+ 16 - 21
mp-admin/src/main/java/com/qs/mp/web/controller/system/SysProfileController.java

@@ -42,42 +42,37 @@ import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 个人信息 业务处理
- * 
+ *
  * @author ygp
  */
 @RestController
 @RequestMapping("/system/user/profile")
 public class SysProfileController extends BaseController
 {
-	
+
 	private static final Logger log = LoggerFactory.getLogger(FileUploadController.class);
-	
+
     @Autowired
     private ISysUserService userService;
 
     @Autowired
     private TokenService tokenService;
-    
+
     @Autowired
     protected HostHolder hostHolder;
-    
+
     /**
      * 文件上传路径
      */
     @Value("${mp.profile}")
     public String filePath;
-    
+
     /**
      * 公开
      */
     @Value("${cloud.public-bucket-name}")
     private String publicBucketName;
-    
-    /**
-     * 模板原稿文件目录
-     */
-    @Value("${cloud.template-dir}")
-    private String tempSrcDir;
+
 
     /**
      * 个人信息
@@ -137,8 +132,8 @@ public class SysProfileController extends BaseController
         LoginUser loginUser = SecurityUtils.getLoginUser();
         String userName = loginUser.getUsername();
         String password = loginUser.getPassword();
-        
-    
+
+
         if (!SecurityUtils.matchesPassword(oldPassword, password))
         {
             return AjaxResult.error("修改密码失败,旧密码错误");
@@ -156,7 +151,7 @@ public class SysProfileController extends BaseController
         }
         return AjaxResult.error("修改密码异常,请联系管理员");
     }
-    
+
     /**
      * 重置密码
      */
@@ -167,7 +162,7 @@ public class SysProfileController extends BaseController
         LoginUser loginUser = SecurityUtils.getLoginUser();
         String userName = loginUser.getUsername();
         String password = loginUser.getPassword();
-        
+
         //校验短信验证码
         ValidSMSResult res = JSMSUtils.sendValidSMSCode(
         		messageId, authCode);
@@ -175,7 +170,7 @@ public class SysProfileController extends BaseController
         if(res == null || !res.getIsValid()){
             throw new CaptchaExpireException();
         }
-        
+
         if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0)
         {
             // 更新缓存用户密码
@@ -210,8 +205,8 @@ public class SysProfileController extends BaseController
         }
         return AjaxResult.error("上传图片异常,请联系管理员");
     }
-    
-    
+
+
     private AjaxResult uploadAvatar(MultipartFile file) {
         try {
             if (null == file) {
@@ -237,7 +232,7 @@ public class SysProfileController extends BaseController
                 LogUtil.error(logger, "头像上传失败.");
                 return AjaxResult.error("头像上传失败.");
             }
-            
+
             if (userService.updateUserAvatar(loginUser.getUsername(), name))
             {
                 AjaxResult ajax = AjaxResult.success();
@@ -253,7 +248,7 @@ public class SysProfileController extends BaseController
             return AjaxResult.error("头像上传失败.");
         }
     }
-    
+
     private String commpressPicAndUpLoadOSS(String userId,MultipartFile file,String mimeType,int width,int height,String bucketName) {
         String fileName = file.getOriginalFilename();
         int idx = fileName.lastIndexOf('.');

+ 7 - 10
mp-admin/src/main/resources/application-8100.yml

@@ -1,13 +1,6 @@
 #三方支付配置
 pay:
-  notify:
-    url: https://www.quanshu123.com
-  call:
-    backUrl: https://api.quanshu123.com/service/notify/payCallback
-  base:
-    url: https://jlpays.kakapaypay.com
-  shopNo: 1631243148392
-  sign: 121bb2b8446b48979958542749df9ee3
+  callbackUrl: https://api.quanshu123.com/service/notify/payCallback
 
 # 日志配置
 logging:
@@ -116,11 +109,15 @@ client:
 # cloud
 cloud:
   # 存储对象公开可访问
-  public-bucket-name: ygp-public-1307117429
+  public-bucket-name: mp-public-1307117429
   # 存储对象公开不可访问,需要通过应用下载
-  private-bucket-name: ygp-auth-1307117429
+  private-bucket-name: mp-auth-1307117429
 
 # 小程序
 miniprogram:
   # 接收通知的状态
   state: formal
+
+# 盲票导出每页查询数量
+export:
+  page-size: 1000

+ 7 - 10
mp-admin/src/main/resources/application-8200.yml

@@ -1,13 +1,6 @@
 #三方支付配置
 pay:
-  notify:
-    url: https://www.quanshu123.com
-  call:
-    backUrl: https://api.quanshu123.com/service/notify/payCallback
-  base:
-    url: https://jlpays.kakapaypay.com
-  shopNo: 1631243148392
-  sign: 121bb2b8446b48979958542749df9ee3
+  callbackUrl: https://api.quanshu123.com/service/notify/payCallback
 
 # 日志配置
 logging:
@@ -116,11 +109,15 @@ client:
 # cloud
 cloud:
   # 存储对象公开可访问
-  public-bucket-name: ygp-public-1307117429
+  public-bucket-name: mp-public-1307117429
   # 存储对象公开不可访问,需要通过应用下载
-  private-bucket-name: ygp-auth-1307117429
+  private-bucket-name: mp-auth-1307117429
 
 # 小程序
 miniprogram:
   # 接收通知的状态
   state: formal
+
+# 盲票导出每页查询数量
+export:
+  page-size: 1000

+ 22 - 17
mp-admin/src/main/resources/application-dev.yml

@@ -1,19 +1,12 @@
 pay:
-    notify:
-        url: https://www.quanshu123.com
-    call:
-        backUrl: https://api.quanshu123.com/service/notify/payCallback
-    base:
-        url: https://jlpays.kakapaypay.com
-    shopNo: 1631243148392
-    sign: 121bb2b8446b48979958542749df9ee3
+    callbackUrl: https://test-mp.quanshu123.com/service/notify/payCallback
 
 # 数据源配置
 spring:
     redis:
-        host: 113.31.162.168
+        host: 110.40.236.236
         port: 6379
-        password: CjPfyr77Bbdfg
+        password: '@9(s2sWppxkess'
         # 连接超时时间(毫秒)
         timeout: 10000
         jedis:
@@ -32,16 +25,16 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://113.31.162.168:3306/mpdb_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
+                url: jdbc:mysql://110.40.236.236:3306/mpdb_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: mptest
                 password: wan789*@dfhzHu518!dr2xosn
                 # 从库数据源
             slave:
                 # 从数据源开关/默认关闭
                 enabled: false
-                url: 
-                username: 
-                password: 
+                url:
+                username:
+                password:
             # 初始连接数
             initialSize: 5
             # 最小连接池数量
@@ -61,7 +54,7 @@ spring:
             testWhileIdle: true
             testOnBorrow: false
             testOnReturn: false
-            webStatFilter: 
+            webStatFilter:
                 enabled: true
             statViewServlet:
                 enabled: true
@@ -109,12 +102,24 @@ client:
 # cloud
 cloud:
     # 存储对象公开可访问
-    public-bucket-name: ygp-public-test-1307117429
+    public-bucket-name: mp-public-test-1307117429
     # 存储对象公开不可访问,需要通过应用下载
-    private-bucket-name: ygp-auth-test-1307117429
+    private-bucket-name: mp-auth-test-1307117429
+
+mq:
+    consumer-conn: false
+    service-url: http://pulsar-rkrxw2wx8zeo.tdmq-pulsar.ap-sh.public.tencenttdmq.com:8080
+    auth-token: eyJrZXlJZCI6InB1bHNhci1ya3J4dzJ3eDh6ZW8iLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJwdWxzYXItcmtyeHcyd3g4emVvX21wLXNlcnZlci10ZXN0In0.12cemXSqXGn9beDFnB-uUe477G6pP9bNbDUA4fIRsgk
+    topic-ticket-generate: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-generate
+    topic-ticket-pay: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-pay
+    consumer-topics: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-generate,pulsar-rkrxw2wx8zeo/test-share/topic-ticket-pay
 
 # 小程序
 miniprogram:
     # 接收通知的状态
     state: developer
 
+# 盲票导出每页查询数量
+export:
+    page-size: 200
+

+ 19 - 13
mp-admin/src/main/resources/application-test.yml

@@ -1,12 +1,5 @@
 pay:
-  notify:
-    url: https://www.quanshu123.com
-  call:
-    backUrl: https://test-api.quanshu123.com/service/notify/payCallback
-  base:
-    url: https://jlpays.kakapaypay.com
-  shopNo: 1631243148392
-  sign: 121bb2b8446b48979958542749df9ee3
+  callbackUrl: https://test-mp.quanshu123.com/service/notify/payCallback
 
 # 日志配置
 logging:
@@ -21,9 +14,9 @@ logging:
 # 数据源配置
 spring:
     redis:
-      host: 113.31.162.168
+      host: 172.17.16.14
       port: 6379
-      password: CjPfyr77Bbdfg
+      password: '@9(s2sWppxkess'
       # 连接超时时间(毫秒)
       timeout: 10000
       jedis:
@@ -42,7 +35,7 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://113.31.162.168:3306/mpdb_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
+                url: jdbc:mysql://172.17.16.14:3306/mpdb_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: mptest
                 password: wan789*@dfhzHu518!dr2xosn
             # 从库数据源
@@ -114,11 +107,24 @@ client:
 # cloud
 cloud:
   # 存储对象公开可访问
-  public-bucket-name: ygp-public-test-1307117429
+  public-bucket-name: mp-public-test-1307117429
   # 存储对象公开不可访问,需要通过应用下载
-  private-bucket-name: ygp-auth-test-1307117429
+  private-bucket-name: mp-auth-test-1307117429
+
+mq:
+  consumer-conn: true
+  service-url: http://pulsar-rkrxw2wx8zeo.tdmq-pulsar.ap-sh.public.tencenttdmq.com:8080
+  auth-token: eyJrZXlJZCI6InB1bHNhci1ya3J4dzJ3eDh6ZW8iLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJwdWxzYXItcmtyeHcyd3g4emVvX21wLXNlcnZlci10ZXN0In0.12cemXSqXGn9beDFnB-uUe477G6pP9bNbDUA4fIRsgk
+  topic-ticket-generate: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-generate
+  topic-ticket-pay: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-pay
+  consumer-topics: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-generate,pulsar-rkrxw2wx8zeo/test-share/topic-ticket-pay
+
 
 # 小程序
 miniprogram:
   # 接收通知的状态
   state: developer
+
+# 盲票导出每页查询数量
+export:
+  page-size: 200

+ 35 - 13
mp-admin/src/main/resources/application.yml

@@ -9,11 +9,13 @@ mp:
   # 实例演示开关
   demoEnabled: true
   # 文件路径 示例( Windows配置D:/ygp/uploadPath,Linux配置 /home/ygp/uploadPath)
-  profile: /Users/steven/Documents
+  profile: /home/quanshu/mp-server
   # 获取ip地址开关
   addressEnabled: false
   # 验证码类型 math 数组计算 char 字符验证
   captchaType: math
+  # 盲票导出baseUrl
+  exportUrl: https://mp-agent.51jiazhu.com/jump.html?id=
 
 # 开发环境配置
 server:
@@ -29,7 +31,7 @@ spring:
   messages:
     # 国际化资源文件路径
     basename: i18n/messages
-  profiles: 
+  profiles:
     active: dev
   # 文件上传
   servlet:
@@ -52,7 +54,7 @@ spring:
     # 数据库索引
     database: 0
     # 密码
-    password: 
+    password:
     # 连接超时时间
     timeout: 10s
     lettuce:
@@ -77,10 +79,10 @@ token:
 
 
 # PageHelper分页插件
-pagehelper: 
+pagehelper:
   helperDialect: mysql
   supportMethodsArguments: true
-  params: count=countSql 
+  params: count=countSql
 
 # Swagger配置
 swagger:
@@ -90,7 +92,7 @@ swagger:
   pathMapping: /dev-api
 
 # 防止XSS攻击
-xss: 
+xss:
   # 过滤开关
   enabled: true
   # 排除链接(多个用逗号分隔)
@@ -121,14 +123,34 @@ cloud:
   #public-bucket-name: ygp-public
   # 存储对象公开不可访问,需要通过应用下载
   #private-bucket-name: ygp-auth
-  # 合同模板存放目录
-  template-dir: files/template/
-  # 签署好的合同文件存放目录
-  contract-dir: files/contract/
 
-wx:
-  appId: wxb86cb7f459fc3675
-  appSecret: 5413864d90c2a447f8f3e4ae897dfae2
 
+#渠道端小程序appid和密钥
+wx-channel:
+  appId: wxc3a684f1196f6e15
+  appSecret: 7708655ba65f04de2a42f23d20ab4134
+#用户端小程序appid和密钥
+wx-user:
+  appId: wx8533800e393dbd6b
+  #appId: wxb86cb7f459fc3675
+  appSecret: f7a104e09d6c2e55445be2a45c4ab551
+#公众号appid
 wxgzh:
   appId: wxfe9785e665c741a2
+
+#三方支付配置
+pay:
+  notifyUrl: https://www.quanshu123.com
+  #callbackUrl: https://api.quanshu123.com/service/notify/payCallback
+  baseUrl: https://jlpays.kakapaypay.com
+  user-shopNo: 1646882813774
+  user-sign: 614140724fb74085be8aef8bebc538ed
+  channel-shopNo: 1647504328218
+  channel-sign: 0e0c00555fee4549b1a88af4d988415b
+
+#幸运数字加密密钥对
+rsa:
+  private-key: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJsdnYuNQGwzutcBPzVXXP9oizi5nVMlI4IohcoLH5iV2dZ39XkcWMbjithn4FBe2Y7N7lougVCRtSyOCLc63vJ9V2w7NrqHnQVIOkse9XhiBNEpQy9PKEm1lM9lZZL6fya4UDaYzGZUD9qq7FzNBBvXwhlXP3Bj4uSodf1M4HmBAgMBAAECgYB43EJ9Ebo4lLXoANi3PzL+7v5LXJTwy+c260wTeUdNJLVvHljt3OBvV6w/ofBtrvnlAx/MtJ+dn2qDJMg1vHEpWPVwTvL+8cqih5RwD6TBG9WH4ERF1fb40Z5FD+muDHK5ubgZNGicPH7T0/L6GYrGCeF9PS6sP+FvdywE5xHKgQJBANI2cpqM8B4c+LC3yQEQDJFbid1EaJEWeX9pHglAn7HhAJgpVCPO3vLainZ9Y2mgyR9ZntWW46YmtRWEOha/Lp0CQQC85u9CE1JPJGyYhIPw8+VVvdWlXzOzYIxtuQjr7ryMMYJttXLbp2q30rCRICyzsmpR26s+GXFGgo5XusvRoS81AkEAwID8EmxeuDTvyWWEvWRlHfgmGGs9FyDtwrAQwYhcthjG4pF2bBRWNy/K/Rd2opSLmhoISrETaGSqEDo2t/38QQJAK69sXWeCfXL6+jqLGMoOm0mPgvMFTdJiJ23HNmi7ieBZPW3c5hdNgr1iv+0k6Vm1ZMDcVTwlCh1fNcKpKA2SkQJBAL0DAXA26tk6LUWdBkXp54dJV/nm4/NDN6KWB+Tu5kcqteW7qCqgBToWJsxv6wLIcd5T20875gns1Btt1Vsq9Ss=
+  public-key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbHZ2LjUBsM7rXAT81V1z/aIs4uZ1TJSOCKIXKCx+YldnWd/V5HFjG44rYZ+BQXtmOze5aLoFQkbUsjgi3Ot7yfVdsOza6h50FSDpLHvV4YgTRKUMvTyhJtZTPZWWS+n8muFA2mMxmVA/aquxczQQb18IZVz9wY+LkqHX9TOB5gQIDAQAB
+
+

+ 1 - 1
mp-admin/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-	<property name="log.path" value="/Users/steven/Documents/logs" />
+	<property name="log.path" value="/Users/daixiaodan/Documents/logs" />
     <!-- 日志输出格式 -->
     <!-- You can override this to have a custom pattern -->
 	<property name="CONSOLE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

+ 338 - 0
mp-admin/src/test/java/com/qs/mp/api/ChannelControllerTest.java

@@ -0,0 +1,338 @@
+package com.qs.mp.api;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+
+import com.alibaba.fastjson.JSON;
+import com.qs.mp.common.BaseControllerTest;
+
+/**
+ * @auther duota
+ * @create 2021 2021/9/7 6:36 下午
+ * @describe
+ */
+public class ChannelControllerTest extends BaseControllerTest {
+
+	/**
+	 * 获取我的下级渠道列表信息,支持翻页
+	 * 调用场景:渠道端查询子渠道列表
+	 */
+	@Test
+	public void testGetSubChannelList() {
+		Map<String, Object> map = new HashMap<String, Object>();
+		int pageNum = 1;
+		int pageSize = 10;
+		map.put("pageNum", pageNum);
+		map.put("pageSize", pageSize);
+		String params = JSON.toJSONString(map);
+		System.out.println("params = " + params);
+		String url = "http://localhost:8080/api/v1/mp/channel/subchannel/list?";
+		System.out.println(request(url, params));
+	}
+
+	/**
+	 * 获取我的下级渠道详情信息
+	 * 调用场景:渠道端查询子渠道详情
+	 */
+	@Test
+	public void testGetChannelDetail() {
+		String channelId = "4";
+		String params = "{\"channelId\":\"" + channelId + "\"}";
+		String url = "http://localhost:8080/api/v1/mp/channel/subchannel/detail?";
+		System.out.println(request(url, params));
+	}
+
+	/**
+	 * 渠道端新增子渠道
+	 * 调用场景:渠道端新增子渠道
+	 */
+	@Test
+	public void testSubChannelAdd() {
+		String mobile = "15112682431";
+		String name = "西湖渠道";
+		Long provinceId = 330000000000L;
+		String province = "浙江省";
+		Long cityId = 330100000000L;
+		String city = "杭州市";
+		Long areaId = 330106000000L;
+		String area = "西湖区";
+		BigDecimal commRate = new BigDecimal(10);
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("mobile", mobile);
+		map.put("name", name);
+		map.put("provinceId", provinceId);
+		map.put("province", province);
+		map.put("cityId", cityId);
+		map.put("city", city);
+		map.put("areaId", areaId);
+		map.put("area", area);
+		map.put("commRate", commRate);
+		String params = JSON.toJSONString(map);
+		System.out.println("params = " + params);
+		String url = "http://localhost:8080/api/v1/mp/channel/subchannel/create?";
+		System.out.println(request(url, params));
+	}
+
+	/**
+	 * 渠道端编辑子渠道信息
+	 * 调用场景:渠道端编辑子渠道信息
+	 */
+	@Test
+	public void testSubChannelEdit() {
+		Long channelId = 2L;
+		String mobile = "15112682435";
+		String name = "西湖渠道";
+		Long provinceId = 330000000000L;
+		String province = "浙江省";
+		Long cityId = 330100000000L;
+		String city = "杭州市";
+		Long areaId = 330106000000L;
+		String area = "西湖区";
+		BigDecimal commRate = new BigDecimal(10);
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("channelId", channelId);
+		map.put("mobile", mobile);
+		map.put("name", name);
+		map.put("provinceId", provinceId);
+		map.put("province", province);
+		map.put("cityId", cityId);
+		map.put("city", city);
+		map.put("areaId", areaId);
+		map.put("area", area);
+		map.put("commRate", commRate);
+		String params = JSON.toJSONString(map);
+		System.out.println("params = " + params);
+		String url = "http://localhost:8080/api/v1/mp/channel/subchannel/update?";
+		System.out.println(request(url, params));
+	}
+	
+	
+	/**
+	 * 获取当前用户渠道或者某个子渠道的经营数据
+	 * 调用场景:渠道端首页查询当前渠道经营数据、子渠道详情页面查询经营数据
+	 */
+	@Test
+	public void testGetSubChannelOperData() {
+		Long channelId = 1L;
+		int days =1;
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("channelId", channelId);
+		map.put("days", days);
+		String params = JSON.toJSONString(map);
+		System.out.println("params = " + params);
+		String url = "http://localhost:8080/api/v1/mp/channel/subchannel/operdata/query?";
+		System.out.println(request(url, params));
+	}
+	
+	/**
+	 * 获取子渠道的经营数据列表
+	 * 调用场景:渠道端首页子渠道经营数据列表
+	 */
+	@Test
+	public void testGetSubChannelOperDataList() {
+		int days =1;
+		int pageNum = 1;
+		int pageSize = 10;
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("days", days);
+		map.put("pageNum", pageNum);
+		map.put("pageSize", pageSize);
+		String params = JSON.toJSONString(map);
+		System.out.println("params = " + params);
+		String url = "http://localhost:8080/api/v1/mp/channel/subchannel/operdata/list?";
+		System.out.println(request(url, params));
+	}
+	
+	
+	/**
+	 * 获取我的经销商列表信息,支持翻页
+	 * 调用场景:渠道端查询经销商列表
+	 */
+	@Test
+	public void testGetSiteList() {
+		Map<String, Object> map = new HashMap<String, Object>();
+		int pageNum = 1;
+		int pageSize = 10;
+		String certifyStatus = "y";
+		String verifyStatus = "wait";
+		map.put("pageNum", pageNum);
+		map.put("pageSize", pageSize);
+		map.put("certifyStatus", certifyStatus);
+		map.put("verifyStatus", verifyStatus);
+		String params = JSON.toJSONString(map);
+		System.out.println("params = " + params);
+		String url = "http://localhost:8080/api/v1/mp/channel/site/list?";
+		System.out.println(request(url, params));
+	}
+
+	/**
+	 * 获取我的经销商详情信息
+	 * 调用场景:渠道端查询经销商详情
+	 */
+	@Test
+	public void testGetSiteDetail() {
+		String channelId = "1";
+		String params = "{\"channelId\":\"" + channelId + "\"}";
+		String url = "http://localhost:8080/api/v1/mp/channel/site/detail?";
+		System.out.println(request(url, params));
+	}
+
+	/**
+	 * 新增经销商信息
+	 * 调用场景:渠道端新增经销商
+	 */
+	@Test
+	public void testSiteAdd() {
+		String mobile = "15112682436";
+		String name = "西湖第一经销商";
+		String contact = "张三";
+		Long provinceId = 330000000000L;
+		String province = "浙江省";
+		Long cityId = 330100000000L;
+		String city = "杭州市";
+		Long areaId = 330106000000L;
+		String area = "西湖区";
+		String address = "趵突泉往前100米";
+		BigDecimal commRate = new BigDecimal(10);
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("mobile", mobile);
+		map.put("name", name);
+		map.put("contact", contact);
+		map.put("provinceId", provinceId);
+		map.put("province", province);
+		map.put("cityId", cityId);
+		map.put("city", city);
+		map.put("areaId", areaId);
+		map.put("area", area);
+		map.put("address", address);
+		map.put("commRate", commRate);
+		String params = JSON.toJSONString(map);
+		System.out.println("params = " + params);
+		String url = "http://localhost:8080/api/v1/mp/channel/site/create?";
+		System.out.println(request(url, params));
+	}
+
+	/**
+	 * 渠编辑经销商信息
+	 * 调用场景:渠道端编辑经销商信息
+	 */
+	@Test
+	public void testSiteEdit() {
+		Long channelId = 2L;
+		String mobile = "15112682436";
+		String name = "西湖第一经销商";
+		String contact = "张三";
+		Long provinceId = 330000000000L;
+		String province = "浙江省";
+		Long cityId = 330100000000L;
+		String city = "杭州市";
+		Long areaId = 330106000000L;
+		String area = "西湖区";
+		String address = "趵突泉往前100米";
+		BigDecimal commRate = new BigDecimal(10);
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("channelId", channelId);
+		map.put("mobile", mobile);
+		map.put("contact", contact);
+		map.put("provinceId", provinceId);
+		map.put("province", province);
+		map.put("cityId", cityId);
+		map.put("city", city);
+		map.put("areaId", areaId);
+		map.put("area", area);
+		map.put("address", address);
+		map.put("commRate", commRate);
+		String params = JSON.toJSONString(map);
+		System.out.println("params = " + params);
+		String url = "http://localhost:8080/api/v1/mp/channel/site/update?";
+		System.out.println(request(url, params));
+	}
+	
+	
+	/**
+	 * 经销商认证审核
+	 * 调用场景:渠道端审核经销商认证
+	 */
+	@Test
+	public void testSiteVerify() {
+		Long channelId = 2L;
+		String verifyStatus = "accept";
+		String memo = "备注,拒绝时必填";
+		BigDecimal commRate = new BigDecimal(10);  // 分润比例,通过时必填
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("channelId", channelId);
+		map.put("verifyStatus", verifyStatus);
+		map.put("memo", memo);
+		map.put("commRate", commRate);
+		String params = JSON.toJSONString(map);
+		System.out.println("params = " + params);
+		String url = "http://localhost:8080/api/v1/mp/channel/site/verify?";
+		System.out.println(request(url, params));
+	}
+	
+	
+	/**
+	 * 提交认证
+	 * 调用场景:经销商认证页面点提交
+	 */
+	@Test
+	public void testSiteVerifySubmit() {
+		Long channelId = 2L;
+		String contact = "张三";
+		String siteType = "1";
+		Long provinceId = 330000000000L;
+		String province = "浙江省";
+		Long cityId = 330100000000L;
+		String city = "杭州市";
+		Long areaId = 330106000000L;
+		String area = "西湖区";
+		String address = "趵突泉往前100米";
+		String bizLicensePic = "111.png";  // 营业执照,多张图用逗号隔开
+		String doorPic = "222.png";// 门店照片,多张图用逗号隔开
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("channelId", channelId);
+		map.put("contact", contact);
+		map.put("siteType", siteType);
+		map.put("provinceId", provinceId);
+		map.put("province", province);
+		map.put("cityId", cityId);
+		map.put("city", city);
+		map.put("areaId", areaId);
+		map.put("area", area);
+		map.put("address", address);
+		map.put("bizLicensePic", bizLicensePic);
+		map.put("doorPic", doorPic);
+		String params = JSON.toJSONString(map);
+		System.out.println("params = " + params);
+		String url = "http://localhost:8080/api/v1/mp/channel/site/verify/submit?";
+		System.out.println(request(url, params));
+	}
+	
+	
+	/**
+	 * 我的(渠道)
+	 * 调用场景:渠道端点击我的
+	 */
+	@Test
+	public void testGetChannelMineDetail() {
+		String params = "{}";
+		String url = "http://localhost:8080/api/v1/mp/channel/mine/detail?";
+		System.out.println(request(url, params));
+	}
+	
+	
+	/**
+	 * 我的(经销商)
+	 * 调用场景:经销商端点击我的
+	 */
+	@Test
+	public void testGetSiteMineDetail() {
+		String params = "{}";
+		String url = "http://localhost:8080/api/v1/mp/channel/site/mine/detail?";
+		System.out.println(request(url, params));
+	}
+
+}

+ 24 - 0
mp-admin/src/test/java/com/qs/mp/api/UserControllerTest.java

@@ -0,0 +1,24 @@
+package com.qs.mp.api;
+
+import org.junit.jupiter.api.Test;
+
+import com.qs.mp.common.BaseControllerTest;
+
+/**
+ * @auther duota
+ * @create 2021 2021/9/7 6:36 下午
+ * @describe
+ */
+public class UserControllerTest extends BaseControllerTest {
+
+  /**
+   * 发送短信验证码接口
+   */
+  @Test
+  public void testSendSmsCode(){
+    String mobile  = "15112682435";
+    String params = "{\"mobile\":\""+mobile+"\"}";
+    String url = "http://localhost:8080/api/v1/mp/sms/sendSmsCode?";
+    System.out.println(request(url, params));
+  }
+}

+ 69 - 0
mp-admin/src/test/java/com/qs/mp/common/BaseControllerTest.java

@@ -0,0 +1,69 @@
+package com.qs.mp.common;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.qs.mp.common.utils.RandomUtils;
+import com.qs.mp.common.utils.http.OkHttpUtil;
+import com.qs.mp.common.utils.sign.Md5Utils;
+
+/**
+ * @auther duota
+ * @create 2021 2021/9/3 11:57 上午
+ * @describe
+ */
+public class BaseControllerTest {
+
+  protected String request(String url, String params) {
+    String nonce = RandomUtils.generateString(20);
+    Date nowTime = new Date();
+    String timestamp = String.valueOf(nowTime.getTime());
+
+    String md5key = "3Jr8S1K18rcC1wAfv8";
+    String l = params + "nonce" + timestamp + md5key;
+    System.out.println("sign str:" + l);
+    String sign = Md5Utils.hash(l);
+    System.out.println("sign rst:" + sign);
+    Map<String, String> headers = new HashMap<String, String>();
+    headers.put("content-type", "application/json; charset=UTF-8");
+    headers.put("x-zz-timestamp", timestamp);
+    // 本地登录状态
+    String token = "eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjEyY2NjMzUyLTZmZWQtNDVlNC04NzIzLWJlNjliOWM0Zjg0NCJ9.GAYmA8UEM3Tt97rAGl6PHSAC1wMqrxIlsbmBIpDXdmOACyYcYBgatAxLArovIJlEs1kYDVw_Z64nkE46I6Im2g";
+
+    if (!StringUtils.isBlank(token)) {
+      headers.put("Authorization", "Bearer "+token);
+    }
+    String reqUrl = url + "sign=" + sign + "&nonce=" + nonce;
+    return OkHttpUtil.post(reqUrl, params, headers);
+  }
+
+  protected String upload(String url, String params, String filePath, String fileName) {
+    String nonce = RandomUtils.generateString(20);
+    Date nowTime = new Date();
+    String timestamp = String.valueOf(nowTime.getTime());
+
+    String md5key = "3Jr8S1K18rcC1wAfv8";
+    String l = params + "nonce" + timestamp + md5key;
+    System.out.println("sign str:" + l);
+    String sign = Md5Utils.hash(l);
+
+    Map<String, String> headers = new HashMap<String, String>();
+    headers.put("x-zz-timestamp", timestamp);
+    String token = "eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE1OTE3NTIwOTQsInVzZXJJZCI6IkU1TDNTUUs2NDlVSUhJVVpDRURLIiwibWdyQ3VsbElkcyI6WyJFNU05V1lRQlkySUs3OVgyQ1QwUyIsIkU1TURLVFowSU0xVFc3N0FXNFFFIiwiRTVPUVJHUkRQQURSMTRYUDYzVTgiLCJFNVFNQUpPSjQ5MkZDQ1M3TkJGSyIsIkU1VUZIRU80UVlWNzYzUVBZOURIIl0sIm93bmVyQ29sbElkIjoiRTVVRkhFTzRRWVY3NjNRUFk5REgifQ.DslDTpM2CELG9BqKr55flZLyS06I8V8RfY3CSUCm12uQAt1mHd3ImpzrXDpHcFdVpyf2_za_JFRVXJ7tv4MstQ"; // 本地登录状态
+    if (!StringUtils.isBlank(token)) {
+      headers.put("b2b-authorization", token);
+    }
+    String reqUrl = url + "sign=" + sign + "&nonce=" + nonce;
+    //String reqUrl = url;
+    try {
+      //  return OkHttpUtil.upload(reqUrl, filePath, fileName, headers);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return "";
+
+  }
+}

+ 71 - 0
mp-admin/src/test/java/com/qs/mp/service/ChannelServiceTest.java

@@ -0,0 +1,71 @@
+package com.qs.mp.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.MpApplication;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.vo.ChannelVO;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.channel.service.IChannelUserRelService;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.TestPropertySource;
+
+@AutoConfigureMockMvc
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = MpApplication.class)
+@TestPropertySource(locations = "classpath:application-dev.yml")
+@ActiveProfiles("dev")
+public class ChannelServiceTest {
+
+	@Autowired
+	private IChannelService channelService;
+	
+	@Autowired
+	private IChannelUserRelService channelUserRelService;
+
+	@Test
+	public void testListChannel() {
+		Channel channel = new Channel();
+		channel.setParentId(1L);
+		List<ChannelVO> list = new ArrayList<ChannelVO>();
+		QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("t1.parent_id", channel.getParentId());
+		queryWrapper.gt("t1.level", 0);
+		queryWrapper.orderByAsc("t1.channel_id");
+		list = channelService.selectChannelVoList(queryWrapper);
+		if(null != list && list.size() > 0) {
+			for(ChannelVO channelVO : list) {
+				if(null != channelVO && StringUtils.isNotBlank(channelVO.getChannelNo())) {
+					int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
+					int userCnt = channelUserRelService.getChannelTotalUserCnt(channelVO.getChannelNo());
+					channelVO.setSiteCnt(siteCnt);
+					channelVO.setUserCnt(userCnt);
+				}
+			}
+		}
+		System.out.println("result:"+list.toString());
+	}
+	
+	@Test
+	public void testAddChannel() {
+		Channel channel = new Channel();
+
+	}
+	
+	
+	@Test
+	public void testEditChannel() {
+		Channel channel = new Channel();
+
+	}
+	
+	
+
+}

+ 77 - 0
mp-admin/src/test/java/com/qs/mp/service/ServiceImplTest.java

@@ -0,0 +1,77 @@
+package com.qs.mp.service;
+
+import com.qs.mp.MpApplication;
+import com.qs.mp.admin.service.ITicketBoxSerialService;
+import com.qs.mp.framework.service.IWxUrlLinkService;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.TestPropertySource;
+
+/**
+ * @author zhongcp
+ * @Date 2021/8/31
+ */
+@AutoConfigureMockMvc
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = MpApplication.class)
+@TestPropertySource(locations = "classpath:application-dev.yml")
+@ActiveProfiles("dev")
+public class ServiceImplTest {
+
+  protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+  @Autowired
+  private IWxUrlLinkService wxUrlLinkService;
+
+  @Autowired
+  private ITicketBoxSerialService ticketBoxSerialService;
+
+  @Test
+  public void testGenerateQrCode() {
+    System.out.println(wxUrlLinkService.generateCode("pages/index/index", "id=1", "wx8533800e393dbd6b"));
+
+  }
+
+  @Test
+  public void testGenerateUrlSchema() {
+    System.out.println(wxUrlLinkService.generateUrlSchema("/pages/login/invitation", "", "wxc3a684f1196f6e15"));
+
+  }
+
+  @Test
+  public void testGenerateSerial() {
+    System.out.println(ticketBoxSerialService.generateSerial(null));
+
+  }
+
+
+
+  public static void main(String[] args) {
+    /*int n = 500;
+    Random rand = new Random();
+    boolean[] bool = new boolean[n];
+    int randInt = 0;
+    for(int i = 0; i < 50 ; i++) {
+      do {
+        randInt = rand.nextInt(n);
+      }while(bool[randInt]);
+      bool[randInt] = true;
+      System.out.println(randInt);
+    }
+  */
+    String s = "z";
+
+    int i = Character.codePointAt(s, 0);
+
+    System.out.println(i + "");
+
+    char[] a = Character.toChars(72);
+
+    System.out.println(new String(a));
+  }
+
+  }

+ 82 - 56
mp-common/.factorypath

@@ -1,43 +1,65 @@
 <factorypath>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context-support/5.2.12.RELEASE/spring-context-support-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-beans/5.2.12.RELEASE/spring-beans-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context/5.2.12.RELEASE/spring-context-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-expression/5.2.12.RELEASE/spring-expression-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-core/5.2.12.RELEASE/spring-core-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jcl/5.2.12.RELEASE/spring-jcl-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-web/5.2.12.RELEASE/spring-web-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-security/2.2.13.RELEASE/spring-boot-starter-security-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter/2.2.13.RELEASE/spring-boot-starter-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot/2.2.13.RELEASE/spring-boot-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-logging/2.2.13.RELEASE/spring-boot-starter-logging-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-to-slf4j/2.12.1/log4j-to-slf4j-2.12.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context-support/5.3.9/spring-context-support-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-beans/5.3.9/spring-beans-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context/5.3.9/spring-context-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-expression/5.3.9/spring-expression-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-core/5.3.9/spring-core-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jcl/5.3.9/spring-jcl-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-web/5.3.9/spring-web-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-security/2.5.4/spring-boot-starter-security-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter/2.5.4/spring-boot-starter-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot/2.5.4/spring-boot-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-logging/2.5.4/spring-boot-starter-logging-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-classic/1.2.5/logback-classic-1.2.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-core/1.2.5/logback-core-1.2.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-to-slf4j/2.14.1/log4j-to-slf4j-2.14.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.14.1/log4j-api-2.14.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/jul-to-slf4j/1.7.32/jul-to-slf4j-1.7.32.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-aop/5.2.12.RELEASE/spring-aop-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-config/5.2.8.RELEASE/spring-security-config-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-core/5.2.8.RELEASE/spring-security-core-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-web/5.2.8.RELEASE/spring-security-web-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-aop/5.3.9/spring-aop-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-config/5.5.2/spring-security-config-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-core/5.5.2/spring-security-core-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-crypto/5.5.2/spring-security-crypto-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-web/5.5.2/spring-security-web-5.5.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper-spring-boot-starter/1.3.1/pagehelper-spring-boot-starter-1.3.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-starter/2.1.4/mybatis-spring-boot-starter-2.1.4.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.1.4/mybatis-spring-boot-autoconfigure-2.1.4.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis/3.5.6/mybatis-3.5.6.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper-spring-boot-autoconfigure/1.3.1/pagehelper-spring-boot-autoconfigure-1.3.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper/5.2.1/pagehelper-5.2.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/jsqlparser/jsqlparser/4.0/jsqlparser-4.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-databind/2.10.5.1/jackson-databind-2.10.5.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-annotations/2.10.5/jackson-annotations-2.10.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-core/2.10.5/jackson-core-2.10.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-databind/2.12.4/jackson-databind-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-annotations/2.12.4/jackson-annotations-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-core/2.12.4/jackson-core-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/dataformat/jackson-dataformat-xml/2.12.4/jackson-dataformat-xml-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.12.4/jackson-module-jaxb-annotations-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/xml/bind/jakarta.xml.bind-api/2.3.3/jakarta.xml.bind-api-2.3.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/codehaus/woodstox/stax2-api/4.2.1/stax2-api-4.2.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/woodstox/woodstox-core/6.2.4/woodstox-core-6.2.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/alibaba/fastjson/1.2.76/fastjson-1.2.76.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-fileupload/commons-fileupload/1.4/commons-fileupload-1.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/qcloud/cos_api/5.6.54/cos_api-5.6.54.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/httpcomponents/httpcore/4.4.14/httpcore-4.4.14.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/commons-codec/commons-codec/1.15/commons-codec-1.15.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/joda-time/joda-time/2.9.9/joda-time-2.9.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/tencentcloudapi/tencentcloud-sdk-java-kms/3.1.213/tencentcloud-sdk-java-kms-3.1.213.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/tencentcloudapi/tencentcloud-sdk-java-common/3.1.213/tencentcloud-sdk-java-common-3.1.213.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp/logging-interceptor/2.7.5/logging-interceptor-2.7.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/bouncycastle/bcprov-jdk15on/1.64/bcprov-jdk15on-1.64.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/cn/jpush/api/jiguang-common/1.0.8/jiguang-common-1.0.8.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-all/4.1.67.Final/netty-all-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.7/gson-2.8.7.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/cn/jpush/api/jsms-client/1.2.9/jsms-client-1.2.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/net/coobird/thumbnailator/0.4.8/thumbnailator-0.4.8.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/poi/poi-ooxml/4.1.2/poi-ooxml-4.1.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/poi/poi/4.1.2/poi-4.1.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/commons-codec/commons-codec/1.13/commons-codec-1.13.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-collections4/4.4/commons-collections4-4.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/SparseBitSet/1.2/SparseBitSet-1.2.jar" enabled="true" runInBatchMode="false"/>
@@ -45,36 +67,41 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/xmlbeans/xmlbeans/3.1.0/xmlbeans-3.1.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-compress/1.19/commons-compress-1.19.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/virtuald/curvesapi/1.06/curvesapi-1.06.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.28/snakeyaml-1.28.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/jsonwebtoken/jjwt/0.9.1/jjwt-0.9.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-data-redis/2.2.13.RELEASE/spring-boot-starter-data-redis-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-redis/2.2.12.RELEASE/spring-data-redis-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-keyvalue/2.2.12.RELEASE/spring-data-keyvalue-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-commons/2.2.12.RELEASE/spring-data-commons-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-tx/5.2.12.RELEASE/spring-tx-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-oxm/5.2.12.RELEASE/spring-oxm-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/lettuce/lettuce-core/5.2.2.RELEASE/lettuce-core-5.2.2.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.58.Final/netty-common-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler/4.1.58.Final/netty-handler-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.58.Final/netty-resolver-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.58.Final/netty-buffer-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.58.Final/netty-codec-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.58.Final/netty-transport-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/projectreactor/reactor-core/3.3.13.RELEASE/reactor-core-3.3.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-data-redis/2.5.4/spring-boot-starter-data-redis-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-redis/2.5.4/spring-data-redis-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-keyvalue/2.5.4/spring-data-keyvalue-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-commons/2.5.4/spring-data-commons-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-tx/5.3.9/spring-tx-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-oxm/5.3.9/spring-oxm-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/lettuce/lettuce-core/6.1.4.RELEASE/lettuce-core-6.1.4.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.67.Final/netty-common-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler/4.1.67.Final/netty-handler-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.67.Final/netty-resolver-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.67.Final/netty-buffer-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.67.Final/netty-codec-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.67.Final/netty-transport-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/projectreactor/reactor-core/3.4.9/reactor-core-3.4.9.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-pool2/2.7.0/commons-pool2-2.7.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-pool2/2.9.0/commons-pool2-2.9.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/eu/bitwalker/UserAgentUtils/1.21/UserAgentUtils-1.21.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp3/okhttp/3.10.0/okhttp-3.10.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okio/okio/1.14.0/okio-1.14.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/javax/servlet/javax.servlet-api/4.0.1/javax.servlet-api-4.0.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-boot-starter/3.3.0/mybatis-plus-boot-starter-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus/3.3.0/mybatis-plus-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-extension/3.3.0/mybatis-plus-extension-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-core/3.3.0/mybatis-plus-core-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-annotation/3.3.0/mybatis-plus-annotation-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-autoconfigure/2.2.13.RELEASE/spring-boot-autoconfigure-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-jdbc/2.2.13.RELEASE/spring-boot-starter-jdbc-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/HikariCP/3.4.5/HikariCP-3.4.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jdbc/5.2.12.RELEASE/spring-jdbc-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis-spring/2.0.0/mybatis-spring-2.0.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-starter/2.1.2/mybatis-spring-boot-starter-2.1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-jdbc/2.5.4/spring-boot-starter-jdbc-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/HikariCP/4.0.3/HikariCP-4.0.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jdbc/5.3.9/spring-jdbc-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.1.2/mybatis-spring-boot-autoconfigure-2.1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis/3.5.4/mybatis-3.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis-spring/2.0.4/mybatis-spring-2.0.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-boot-starter/3.4.3.2/mybatis-plus-boot-starter-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus/3.4.3.2/mybatis-plus-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-extension/3.4.3.2/mybatis-plus-extension-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-core/3.4.3.2/mybatis-plus-core-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-annotation/3.4.3.2/mybatis-plus-annotation-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-autoconfigure/2.5.4/spring-boot-autoconfigure-2.5.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/cn/hutool/hutool-all/5.3.1/hutool-all-5.3.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-boot-starter/3.0.0/springfox-boot-starter-3.0.0.jar" enabled="true" runInBatchMode="false"/>
@@ -84,7 +111,7 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spi/3.0.0/springfox-spi-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-schema/3.0.0/springfox-schema-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-core/3.0.0/springfox-core-3.0.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/net/bytebuddy/byte-buddy/1.10.19/byte-buddy-1.10.19.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/net/bytebuddy/byte-buddy/1.10.22/byte-buddy-1.10.22.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spring-web/3.0.0/springfox-spring-web-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/github/classgraph/classgraph/4.8.83/classgraph-4.8.83.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spring-webmvc/3.0.0/springfox-spring-webmvc-3.0.0.jar" enabled="true" runInBatchMode="false"/>
@@ -97,7 +124,6 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/io/swagger/swagger-annotations/1.5.20/swagger-annotations-1.5.20.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-swagger-ui/3.0.0/springfox-swagger-ui-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/plugin/spring-plugin-core/2.0.0.RELEASE/spring-plugin-core-2.0.0.RELEASE.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/plugin/spring-plugin-metadata/2.0.0.RELEASE/spring-plugin-metadata-2.0.0.RELEASE.jar" enabled="true" runInBatchMode="false"/>
 </factorypath>

+ 40 - 10
mp-common/pom.xml

@@ -14,7 +14,7 @@
     <description>
         common通用工具
     </description>
-    
+
      <properties>
         <hutool.version>5.3.1</hutool.version>
         <lombok.version>1.18.10</lombok.version>
@@ -49,8 +49,8 @@
 
         <!-- 自定义验证注解 -->
         <dependency>
-            <groupId>javax.validation</groupId>
-            <artifactId>validation-api</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
 
         <!--常用工具类 -->
@@ -58,7 +58,11 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
-  
+
+        <dependency>
+            <groupId>org.apache.pulsar</groupId>
+            <artifactId>pulsar-client</artifactId>
+        </dependency>
         <!-- JSON工具类 -->
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
@@ -125,10 +129,36 @@
             <artifactId>jjwt</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>ma.glasnost.orika</groupId>
+            <artifactId>orika-core</artifactId>
+        </dependency>
+
         <!-- redis 缓存操作 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>redis.clients</groupId>
+                    <artifactId>jedis</artifactId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>lettuce-core</artifactId>
+                    <groupId>io.lettuce</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- jedis客户端 -->
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
+
+        <!-- spring2.X集成redis所需common-pool2,使用jedis必须依赖它-->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
         </dependency>
 
         <!-- pool 对象池 -->
@@ -148,7 +178,7 @@
 			<artifactId>okhttp</artifactId>
 			<version>3.10.0</version>
 		</dependency>
-		
+
         <!-- servlet包 -->
         <dependency>
             <groupId>javax.servlet</groupId>
@@ -163,15 +193,15 @@
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>
         </dependency>
-        
+
         <!--工具包-->
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
             <version>${hutool.version}</version>
         </dependency>
-        
-                    
+
+
         <!--使用 lombok 简化 Java 代码-->
         <dependency>
            <groupId>org.projectlombok</groupId>
@@ -179,7 +209,7 @@
            <version>${lombok.version}</version>
            <scope>compile</scope>
         </dependency>
-        
+
          <!-- Swagger3依赖 -->
          <dependency>
              <groupId>io.springfox</groupId>
@@ -195,4 +225,4 @@
 
     </dependencies>
 
-</project>
+</project>

+ 35 - 0
mp-common/src/main/java/com/qs/mp/common/config/OrikaConfig.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
+ *
+ * https://www.mall4j.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.qs.mp.common.config;
+
+import ma.glasnost.orika.MapperFacade;
+import ma.glasnost.orika.MapperFactory;
+import ma.glasnost.orika.impl.DefaultMapperFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * MapperFacade 用于dto ->entity的转换
+ * @author zhongcp
+ */
+@Configuration
+public class OrikaConfig {
+
+	@Bean
+	public MapperFactory mapperFactory() {
+		return new DefaultMapperFactory.Builder().build();
+	}
+
+	@Bean
+	public MapperFacade mapperFacade() {
+		return mapperFactory().getMapperFacade();
+	}
+}

+ 6 - 1
mp-common/src/main/java/com/qs/mp/common/constant/Constants.java

@@ -4,7 +4,7 @@ import io.jsonwebtoken.Claims;
 
 /**
  * 通用常量信息
- * 
+ *
  * @author ygp
  */
 public class Constants
@@ -94,6 +94,11 @@ public class Constants
      */
     public static final String TOKEN = "token";
 
+    /**
+     * 渠道端角色
+     */
+    public static final String CHANNEL_ROLE = "channelRole";
+
     /**
      * 令牌前缀
      */

+ 35 - 29
mp-common/src/main/java/com/qs/mp/common/core/domain/AjaxResult.java

@@ -1,12 +1,13 @@
 package com.qs.mp.common.core.domain;
 
+import com.qs.mp.common.enums.ErrorCodeEnum;
 import java.util.HashMap;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
 /**
  * 操作消息提醒
- * 
+ *
  * @author eepay
  */
 public class AjaxResult extends HashMap<String, Object>
@@ -32,8 +33,8 @@ public class AjaxResult extends HashMap<String, Object>
         ERROR(500),
     	/** 登陆超时 */
     	TIMEOUT(401);
-    	
-    	
+
+
         private final int value;
 
         Type(int value)
@@ -65,11 +66,11 @@ public class AjaxResult extends HashMap<String, Object>
     public AjaxResult()
     {
     }
-    
+
 
     /**
      * 初始化一个新创建的 AjaxResult 对象
-     * 
+     *
      * @param type 状态类型
      * @param msg 返回内容
      */
@@ -81,7 +82,7 @@ public class AjaxResult extends HashMap<String, Object>
 
     /**
      * 初始化一个新创建的 AjaxResult 对象
-     * 
+     *
      * @param type 状态类型
      * @param msg 返回内容
      * @param data 数据对象
@@ -92,10 +93,10 @@ public class AjaxResult extends HashMap<String, Object>
         super.put(MSG_TAG, msg);
         super.put(DATA_TAG, data);
     }
-    
+
     /**
      * 初始化一个新创建的 AjaxResult 对象
-     * 
+     *
      * @param code 状态码
      * @param msg 返回内容
      */
@@ -105,9 +106,9 @@ public class AjaxResult extends HashMap<String, Object>
         super.put(MSG_TAG, msg);
     }
 
-    
+
     /**
-     * 
+     *
      * @param code
      * @param msg
      * @param data
@@ -117,11 +118,11 @@ public class AjaxResult extends HashMap<String, Object>
         super.put(CODE_TAG, code);
         super.put(MSG_TAG, msg);
         super.put(DATA_TAG, data);
-    } 
-    
+    }
+
     /**
      * 返回成功消息
-     * 
+     *
      * @return 成功消息
      */
     public static AjaxResult success()
@@ -131,7 +132,7 @@ public class AjaxResult extends HashMap<String, Object>
 
     /**
      * 返回成功消息
-     * 
+     *
      * @param msg 返回内容
      * @return 成功消息
      */
@@ -139,10 +140,10 @@ public class AjaxResult extends HashMap<String, Object>
     {
         return AjaxResult.success(msg, null);
     }
-    
+
     /**
      * 返回成功消息
-     * 
+     *
      * @param msg 返回内容
      * @param data 数据对象
      * @return 成功消息
@@ -154,7 +155,7 @@ public class AjaxResult extends HashMap<String, Object>
 
     /**
      * 返回成功消息
-     * 
+     *
      * @param msg 返回内容
      * @param data 数据对象
      * @return 成功消息
@@ -166,7 +167,7 @@ public class AjaxResult extends HashMap<String, Object>
 
     /**
      * 返回警告消息
-     * 
+     *
      * @param msg 返回内容
      * @return 警告消息
      */
@@ -177,7 +178,7 @@ public class AjaxResult extends HashMap<String, Object>
 
     /**
      * 返回警告消息
-     * 
+     *
      * @param msg 返回内容
      * @param data 数据对象
      * @return 警告消息
@@ -189,7 +190,7 @@ public class AjaxResult extends HashMap<String, Object>
 
     /**
      * 返回错误消息
-     * 
+     *
      * @return
      */
     public static AjaxResult error()
@@ -199,7 +200,7 @@ public class AjaxResult extends HashMap<String, Object>
 
     /**
      * 返回错误消息
-     * 
+     *
      * @param msg 返回内容
      * @return 警告消息
      */
@@ -208,9 +209,14 @@ public class AjaxResult extends HashMap<String, Object>
         return AjaxResult.error(msg, null);
     }
 
+    public static AjaxResult error(ErrorCodeEnum errorCodeEnum)
+    {
+        return new AjaxResult(errorCodeEnum.getCode(), errorCodeEnum.getMsg());
+    }
+
     /**
      * 返回错误消息
-     * 
+     *
      * @param msg 返回内容
      * @param data 数据对象
      * @return 警告消息
@@ -219,30 +225,30 @@ public class AjaxResult extends HashMap<String, Object>
     {
         return new AjaxResult(Type.ERROR, msg, data);
     }
-    
+
     public static AjaxResult error(int code,String msg)
     {
         return new AjaxResult(code, msg);
     }
-    
+
     public static AjaxResult error(int code,String msg, Object data)
     {
         return new AjaxResult(code, msg, data);
     }
-    
+
     /**
      * 返回错误消息
-     * 
+     *
      * @return
      */
     public static AjaxResult timeout()
     {
         return AjaxResult.timeout("登陆超时");
     }
-    
+
     /**
      * 返回警告消息
-     * 
+     *
      * @param msg 返回内容
      * @return 警告消息
      */
@@ -253,7 +259,7 @@ public class AjaxResult extends HashMap<String, Object>
 
     /**
      * 返回警告消息
-     * 
+     *
      * @param msg 返回内容
      * @param data 数据对象
      * @return 警告消息

+ 9 - 0
mp-common/src/main/java/com/qs/mp/common/core/redis/RedisCache.java

@@ -231,4 +231,13 @@ public class RedisCache
     {
         return redisTemplate.keys(pattern);
     }
+
+    /**
+     * 校验key是否存在
+     * @param key
+     * @return
+     */
+    public boolean hasKey(String key) {
+        return null != redisTemplate.opsForValue().get(key);
+    }
 }

+ 42 - 0
mp-common/src/main/java/com/qs/mp/common/enums/BizTypeEnum.java

@@ -0,0 +1,42 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ *
+ * 支付订单枚举类型
+ *
+ */
+public enum BizTypeEnum implements IEnum<Integer> {
+
+  CHANNEL_ORDER(1, "渠道盲票采购订单"),
+  TICKET_ORDER(2, "用户盲票购买订单"),
+  DELIVER_ORDER(3, "用户提货订单");
+
+
+  private final int value;
+  private final String desc;
+
+  BizTypeEnum(final int value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 43 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelCertifyStatusEnum.java

@@ -0,0 +1,43 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 渠道认证状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum ChannelCertifyStatusEnum implements IEnum<String> {
+
+  NOT_CERTIFIED("n", "未认证"),
+  CERTIFIED("y", "已认证");
+
+  private final String value;
+  private final String desc;
+
+  ChannelCertifyStatusEnum(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 51 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelMoneyEnum.java

@@ -0,0 +1,51 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+public enum ChannelMoneyEnum implements IEnum<Integer> {
+
+  COMMISSION(1, "佣金收入"),
+  WITHDRAW(2, "提现"),
+  WITHDRAW_FEE(3, "提现手续费"),
+  PURCHASE(4, "进票");
+
+
+  private final int value;
+  private final String desc;
+  public static final int INCOME = 1;   //收支类型 1收入
+  public static final int EXPENSES = 0;  //0支出
+
+  ChannelMoneyEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  public static ChannelMoneyEnum getChannelMoneyTypeEnum(int value) {
+    for (ChannelMoneyEnum channelMoneyTypeEnum : ChannelMoneyEnum.values()) {
+      if (channelMoneyTypeEnum.getValue() == value) {
+        return channelMoneyTypeEnum;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 45 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelOrderStatusEnum.java

@@ -0,0 +1,45 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 渠道订单状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum ChannelOrderStatusEnum implements IEnum<Integer> {
+  CANCELED(-1, "已取消"),
+  NOT_PAY(0, "待付款"),
+  NOT_DELIVER(1, "待发货"),
+  NOT_CONFIRM(2, "待收货"),
+  FINISHED(3, "已完成");
+
+  private final int value;
+  private final String desc;
+
+  ChannelOrderStatusEnum(final int value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 43 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelRoleEnum.java

@@ -0,0 +1,43 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 渠道角色
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum ChannelRoleEnum implements IEnum<String> {
+
+  CHANNEL("channel", "渠道"),
+  SALESITE("salesite", "经销商");
+
+  private final String value;
+  private final String desc;
+
+  ChannelRoleEnum(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 42 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelStatusEnum.java

@@ -0,0 +1,42 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 渠道状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum ChannelStatusEnum implements IEnum<Integer> {
+  ON(1, "启用"),
+  OFF(2, "停用");
+
+  private final int value;
+  private final String desc;
+
+  ChannelStatusEnum(final int value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 44 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelVerifyStatusEnum.java

@@ -0,0 +1,44 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 渠道认证审核状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum ChannelVerifyStatusEnum implements IEnum<String> {
+
+  WAIT("wait", "待审核"),
+  ACCEPT("accept", "已通过"),
+  REJECT("reject", "已拒绝");
+
+  private final String value;
+  private final String desc;
+
+  ChannelVerifyStatusEnum(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 54 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelWithdrawStatusEnum.java

@@ -0,0 +1,54 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum ChannelWithdrawStatusEnum implements IEnum<Integer> {
+
+  WITHDRAWING(1, "提现中"),
+  FINISHED(2, "已完成"),
+  FAILED(3, "提现失败");
+
+
+  private final int value;
+  private final String desc;
+
+  ChannelWithdrawStatusEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  public static ChannelWithdrawStatusEnum getChannelMoneyTypeEnum(int value) {
+    for (ChannelWithdrawStatusEnum channelMoneyTypeEnum : ChannelWithdrawStatusEnum.values()) {
+      if (channelMoneyTypeEnum.getValue() == value) {
+        return channelMoneyTypeEnum;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+  public String getDesc() {
+    return desc;
+  }
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 49 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CoinLogTypeEnum.java

@@ -0,0 +1,49 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+public enum CoinLogTypeEnum implements IEnum<Integer> {
+
+  PRIZE(1, "盲票奖品"),
+  EXCHANGE(2, "商品兑换");
+
+
+  private final int value;
+  private final String desc;
+  public static final int INCOME = 1;   //收支类型 1收入
+  public static final int EXPENSES = 0;  //0支出
+
+  CoinLogTypeEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  public static CoinLogTypeEnum getCoinLogTypeEnum(int value) {
+    for (CoinLogTypeEnum coinLogTypeEnum : CoinLogTypeEnum.values()) {
+      if (coinLogTypeEnum.getValue() == value) {
+        return coinLogTypeEnum;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 43 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CommStatusEnum.java

@@ -0,0 +1,43 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 渠道结佣状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum CommStatusEnum implements IEnum<Integer> {
+  NO(0, "未结佣"),
+  YES(1, "已结佣"),
+  DOING(2, "结佣中");
+
+  private final int value;
+  private final String desc;
+
+  CommStatusEnum(final int value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 42 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CouponDiscountTypeEnum.java

@@ -0,0 +1,42 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum CouponDiscountTypeEnum implements IEnum<Integer> {
+
+  MONEY_OFF(1, "代金券"),
+  DISCOUNT(2, "折扣券"),
+  EXCHANGE(3, "兑换券");
+
+
+  private final int value;
+  private final String desc;
+
+  CouponDiscountTypeEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 41 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CouponDistributeTypeEnum.java

@@ -0,0 +1,41 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum CouponDistributeTypeEnum implements IEnum<Integer> {
+
+  SYSTEM(1, "系统发放"),
+  USER_DRAW(2, "用户主动领取");
+
+
+  private final int value;
+  private final String desc;
+
+  CouponDistributeTypeEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 44 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CouponStatusEnum.java

@@ -0,0 +1,44 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 卡券上下架状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum CouponStatusEnum implements IEnum<String> {
+
+  PUT_ON("on", "已上架"),
+  PUT_OFF("off", "已下架"),
+  PUT_INIT("init", "待上架");
+
+  private final String value;
+  private final String desc;
+
+  CouponStatusEnum(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 43 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CouponTypeEnum.java

@@ -0,0 +1,43 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * 优惠券类型(按使用场景划分)
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum CouponTypeEnum implements IEnum<Integer> {
+
+  TICKET_ORDER(1, "盲票购买"),
+  SITE_CONSUME(2, "门店消费"),
+  CHANNEL(3, "经销商采购");
+
+
+  private final int value;
+  private final String desc;
+
+  CouponTypeEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 42 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CouponUseAreaEnum.java

@@ -0,0 +1,42 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum CouponUseAreaEnum implements IEnum<Integer> {
+
+  COMMON(0, "通用"),
+  PRE_SCOPE(1, "指定范围"), // 生成优惠券的时候设定使用范围
+  POST_SCOPE(2, "指定范围"); // 发放的时候动态设定使用范围
+
+
+  private final int value;
+  private final String desc;
+
+  CouponUseAreaEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 49 - 0
mp-common/src/main/java/com/qs/mp/common/enums/DeliverOrderStatusEnum.java

@@ -0,0 +1,49 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 提货订单状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum DeliverOrderStatusEnum implements IEnum<Integer> {
+  CANCELED(-1, "已取消"),
+  NOT_PAY(0, "待付款"),
+  NOT_DELIVER(1, "待发货"),
+  NOT_CONFIRM(2, "待收货"),
+  FINISHED(3, "已完成");
+
+  private final int value;
+  private final String desc;
+
+  DeliverOrderStatusEnum(final int value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+  
+  public String getDesc() {
+	return desc;
+}
+
+/**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 6 - 1
mp-common/src/main/java/com/qs/mp/common/enums/ErrorCodeEnum.java

@@ -22,7 +22,12 @@ public enum ErrorCodeEnum {
   ERROR_CODE_1013(1013, "账号不存在"),
   ERROR_CODE_1014(1014, "当前账号不能删除"),
   ERROR_CODE_1015(1015, "保存失败"),
-
+  ERROR_CODE_1016(1016, "账号未认证,请先完成认证再提交"),
+  ERROR_CODE_1017(1017, "盲票已兑奖"),
+  ERROR_CODE_1018(1018, "无权限查看"),
+  ERROR_CODE_1019(1019, "盲票未付款"),
+  ERROR_CODE_1020(1020, "库存不足"),
+  ERROR_CODE_1021(1021, "盲豆余额不足"),
   ;
   private int code;
   private String msg;

+ 53 - 0
mp-common/src/main/java/com/qs/mp/common/enums/GoodsStatusEnum.java

@@ -0,0 +1,53 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 商品上下架状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum GoodsStatusEnum implements IEnum<String> {
+
+  PUT_ON("on", "已上架"),
+  PUT_OFF("off", "已下架"),
+  PUT_INIT("init", "待上架");
+
+  private final String value;
+  private final String desc;
+
+  public static GoodsStatusEnum getStatusEnum(String value) {
+    for (GoodsStatusEnum statusEnum : GoodsStatusEnum.values()) {
+      if (statusEnum.getValue().equals(value)) {
+        return statusEnum;
+      }
+    }
+    return null;
+  }
+
+  GoodsStatusEnum(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 28 - 0
mp-common/src/main/java/com/qs/mp/common/enums/MqTopicType.java

@@ -0,0 +1,28 @@
+package com.qs.mp.common.enums;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ * @auther duota
+ * @create 2021 2021/9/19 5:28 下午
+ * @describe
+ */
+public enum MqTopicType implements IEnum<String> {
+
+  ticket_generate("1", "盲票生成"),
+  ticket_pay("2", "盲票付款"),;
+
+
+  private final String value;
+  private final String desc;
+
+  MqTopicType(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+}

+ 6 - 4
mp-common/src/main/java/com/qs/mp/common/enums/PayOrderTypeEnum.java → mp-common/src/main/java/com/qs/mp/common/enums/PayTypeEnum.java

@@ -4,18 +4,20 @@ import com.baomidou.mybatisplus.annotation.IEnum;
 
 /**
  *
- * 支付订单枚举类型
+ * 前端选择的支付类型
  *
  */
-public enum PayOrderTypeEnum implements IEnum<Integer> {
+public enum PayTypeEnum implements IEnum<Integer> {
 
-  ORDER_MERCH_RECHARGE(1, "商户充值");
+  ALIPAY(1, "支付宝"),
+  WXPAY(2, "微信支付"),
+  ACCTPAY(3,"余额支付");
 
 
   private final int value;
   private final String desc;
 
-  PayOrderTypeEnum(final int value, final String desc) {
+  PayTypeEnum(final int value, final String desc) {
     this.value = value;
     this.desc = desc;
   }

+ 39 - 0
mp-common/src/main/java/com/qs/mp/common/enums/PrizeStorageInTypeEnum.java

@@ -0,0 +1,39 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ * 奖品入库类型
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+public enum PrizeStorageInTypeEnum implements IEnum<Integer> {
+
+  TICKET_CASHED(1, "奖品兑奖"),
+  COIN_EXCHANGE(2, "盲豆兑换");
+
+
+  private final int value;
+  private final String desc;
+
+  PrizeStorageInTypeEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 38 - 0
mp-common/src/main/java/com/qs/mp/common/enums/PrizeStorageStatusEnum.java

@@ -0,0 +1,38 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+public enum PrizeStorageStatusEnum implements IEnum<Integer> {
+
+  NOT_DISTRIBUTED(1, "待提货"),
+  HAS_DISTRIBUTED(2, "已提货");
+
+
+  private final int value;
+  private final String desc;
+
+  PrizeStorageStatusEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 2 - 2
mp-common/src/main/java/com/qs/mp/common/enums/RoleTypeEnum.java

@@ -13,8 +13,8 @@ import org.apache.commons.compress.utils.Lists;
 public enum RoleTypeEnum {
 	
 	  SYS_ROLE("1", "系统角色"),
-	  CUSTOMER_ROLE("2", "门店角色"),
-	  MERCHANT_ROLE("3", "商户端角色");
+	  CHANNEL_ROLE("2", "渠道商角色"),
+	  SALESITE_ROLE("3", "经销商角色");
 	
 
 	  private String value;

+ 42 - 0
mp-common/src/main/java/com/qs/mp/common/enums/SiteTypeEnum.java

@@ -0,0 +1,42 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ *
+ * 经销商门店类型
+ *
+ */
+public enum SiteTypeEnum implements IEnum<Integer> {
+
+  STREET_STORE(1, "临街门店"),
+  ENTERTAINMENT(2, "娱乐场所"),
+  CINEMA(3, "电影院"),
+  CHAIN_STORE(4, "品牌连锁店");
+
+  private final int value;
+  private final String desc;
+
+  SiteTypeEnum(final int value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 47 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketBoxStatusEnum.java

@@ -0,0 +1,47 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 盲票组上下架状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum TicketBoxStatusEnum implements IEnum<String> {
+
+
+  WAIT("wait", "待出票"),
+  DOING("doing", "出票中"),
+  DONE("done", "待上架"),
+  PUT_ON("on", "已上架"),
+  PUT_OFF("off", "已下架");
+
+  private final String value;
+  private final String desc;
+
+  TicketBoxStatusEnum(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 43 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketPkgStatusEnum.java

@@ -0,0 +1,43 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 盲票包销售状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum TicketPkgStatusEnum implements IEnum<String> {
+
+  FOR_SALE("forSale", "待售"),
+  SOLD("sold", "已售");
+
+  private final String value;
+  private final String desc;
+
+  TicketPkgStatusEnum(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 44 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketPrizeTypeEnum.java

@@ -0,0 +1,44 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 盲票奖品类型
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum TicketPrizeTypeEnum implements IEnum<String> {
+
+  GOODS("goods", "商品"),
+  COUPON("coupon", "优惠券"),
+  COIN("coin", "盲豆");
+
+  private final String value;
+  private final String desc;
+
+  TicketPrizeTypeEnum(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 43 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketStatusEnum.java

@@ -0,0 +1,43 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 盲票状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum TicketStatusEnum implements IEnum<Integer> {
+  NOT_PAY(1, "未付款"),
+  ACTIVATED(2, "待兑奖"),
+  CASHED(3, "已兑奖"),;
+
+  private final int value;
+  private final String desc;
+
+  TicketStatusEnum(final int value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 43 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketTypeEnum.java

@@ -0,0 +1,43 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 盲票实体形式
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum TicketTypeEnum implements IEnum<String> {
+
+  ONLINE("online", "线上票"),
+  OFFLINE("offline", "线下票");
+
+  private final String value;
+  private final String desc;
+
+  TicketTypeEnum(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 41 - 0
mp-common/src/main/java/com/qs/mp/common/enums/UserCouponStatusEnum.java

@@ -0,0 +1,41 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ *
+ * 用户卡券使用状态
+ *
+ */
+public enum UserCouponStatusEnum implements IEnum<Integer> {
+
+  UNUSED(1, "未使用"),
+  USED(2, "已使用"),
+  OVERDUE(3, "已过期"),;
+
+  private final Integer value;
+  private final String desc;
+
+  UserCouponStatusEnum(final Integer value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 29 - 0
mp-common/src/main/java/com/qs/mp/common/enums/UserIdentityEnum.java

@@ -0,0 +1,29 @@
+package com.qs.mp.common.enums;
+
+/**
+ * 用户身份
+ *
+ * @author liugl
+ * @Date 2022/03/01
+ */
+public enum UserIdentityEnum {
+
+	CHANNEL, // 渠道端
+	USER, // 用户
+	ADMIN // 管理后台
+	;
+	public static boolean isChannel(int identity) {
+		return identity == CHANNEL.ordinal();
+	}
+	public static boolean isUser(int identity) {
+		return identity == USER.ordinal();
+	}
+
+	public static UserIdentityEnum valueOf(int ordinal) {
+		if (ordinal < 0 || ordinal >= values().length) {
+			throw new IndexOutOfBoundsException("Invalid ordinal");
+		}
+		return values()[ordinal];
+	}
+
+}

+ 43 - 0
mp-common/src/main/java/com/qs/mp/common/enums/UserTicketOrderStatusEnum.java

@@ -0,0 +1,43 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 用户盲票购买订单状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum UserTicketOrderStatusEnum implements IEnum<Integer> {
+  CANCELED(-1, "已取消"),
+  NOT_PAY(0, "待付款"),
+  FINISHED(1, "已完成");
+
+  private final int value;
+  private final String desc;
+
+  UserTicketOrderStatusEnum(final int value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 52 - 0
mp-common/src/main/java/com/qs/mp/common/exception/DataOperationException.java

@@ -0,0 +1,52 @@
+package com.qs.mp.common.exception;
+
+import com.qs.mp.common.enums.ErrorCodeEnum;
+
+/**
+ * 
+ * 数据库接口访问异常,所有涉及到service事物调用接口都统一抛异常为失败操作。
+ * 
+ * @author duota
+ *
+ */
+public class DataOperationException extends RuntimeException {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    protected final int code;
+    protected final String message;
+
+    public DataOperationException() {
+        this.code = 1001; // 系统错误
+        this.message = "数据操作失败.";
+    }
+
+    public DataOperationException(ErrorCodeEnum errorCodeEnum){
+        this.code = errorCodeEnum.getCode();
+        this.message = errorCodeEnum.getMsg();
+    }
+
+    public DataOperationException(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public DataOperationException(int code, String message, Throwable e) {
+        super(message, e);
+        this.code = code;
+        this.message = message;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+}

+ 6 - 2
mp-common/src/main/java/com/qs/mp/common/exception/ServiceException.java

@@ -4,7 +4,7 @@ import com.qs.mp.common.enums.ErrorCodeEnum;
 
 /**
  * 业务异常
- * 
+ *
  * @author ygp
  */
 public final class ServiceException extends RuntimeException
@@ -40,6 +40,10 @@ public final class ServiceException extends RuntimeException
         this.code = errorCodeEnum.getCode();
     }
 
+    public ServiceException( String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
 
     public ServiceException(String message)
     {
@@ -78,4 +82,4 @@ public final class ServiceException extends RuntimeException
         this.detailMessage = detailMessage;
         return this;
     }
-}
+}

+ 7 - 31
mp-common/src/main/java/com/qs/mp/common/jsms/JSMSUtils.java

@@ -36,11 +36,11 @@ public class JSMSUtils {
 
     protected static final Logger logger = LoggerFactory.getLogger(JSMSUtils.class);
 
-    private static final String appkey = "538a7546412c8630bdd6138a";
-    private static final String masterSecret = "5d0471cedfc2edd72641a241";
-
+    private static final String appkey = "2f17e0698d004ca7411a9ef6";
+    private static final String masterSecret = "a6446a6b8bf8a4be72bf86d4";
+/*
     private static final String devKey = "242780bfdd7315dc1989fedb";
-    private static final String devSecret = "2f5ced2bef64167950e63d13";
+    private static final String devSecret = "2f5ced2bef64167950e63d13";*/
     private static String env;
 
     @Value("${server.env}")
@@ -78,34 +78,10 @@ public class JSMSUtils {
         return null;
     }
 
-    public static SendSMSResult sendMerchAct(String mobile) {
-        SMSClient client = new SMSClient(masterSecret, appkey);
-        SMSPayload payload = SMSPayload.newBuilder().setMobileNumber(mobile).setTempId(203647).build();
-        try {
-            if (ServerEnvEnum.PROD.getCode().equals(env)) {
-                SendSMSResult res = client.sendTemplateSMS(payload);
-                LogUtil.info(logger, "商户账户创建短信发送结果,mobile:{0}, res:{1}", new Object[]{mobile, JSON.toJSONString(res)});
-                return res;
-            } else {
-                logger.info("非生产环境,不发送商户账号通知短信!" + mobile);
-                return (new GsonBuilder()).excludeFieldsWithoutExposeAnnotation().create().fromJson("{\"msg_id\":\"123456789\"}", SendSMSResult.class);
-
-            }
-        } catch (APIConnectionException e) {
-            LogUtil.error(logger, e, "商户账户创建短信发送失败,mobile:{0}", mobile);
-        } catch (APIRequestException e) {
-            LogUtil.error(logger, e, "商户账户创建短信发送失败,mobile:{0}", mobile);
-        }
-        return null;
-    }
-
-    public static SendSMSResult sendBillPayFail(String mobile) {
-        return sendSMSResult(mobile, 201476);
+    public static SendSMSResult sendChannelActNotify(String mobile) {
+        return sendSMSResult(mobile, 206374);
     }
 
-    public static SendSMSResult sendBillPayFailLastDay(String mobile) {
-        return sendSMSResult(mobile, 202305);
-    }
 
 
     private static SendSMSResult sendSMSResult(String mobile, int tempId) {
@@ -318,7 +294,7 @@ public class JSMSUtils {
     }
 
     public static void testGetAccountSMSBalance() {
-        SMSClient client = new SMSClient(devSecret, devKey);
+        SMSClient client = new SMSClient(masterSecret, appkey);
         try {
             AccountBalanceResult result = client.getSMSBalance();
             logger.info(result.toString());

+ 2 - 1
mp-common/src/main/java/com/qs/mp/common/json/EnumValueDeserializer.java

@@ -22,7 +22,8 @@ public class EnumValueDeserializer implements ObjectDeserializer {
     Object[] enumConstants = cls.getEnumConstants();
     if (IEnum.class.isAssignableFrom(cls)) {
       for (Object enumConstant : enumConstants) {
-        if (((IEnum) enumConstant).getValue().equals(lexer.stringVal())) {
+        if (((IEnum) enumConstant).getValue().equals(lexer.stringVal())
+        || ((IEnum) enumConstant).getValue().equals(lexer.intValue())) {
           return (T) enumConstant;
         }
       }

+ 178 - 0
mp-common/src/main/java/com/qs/mp/common/pulsar/PulsarClientService.java

@@ -0,0 +1,178 @@
+package com.qs.mp.common.pulsar;
+
+import com.qs.mp.common.enums.MqTopicType;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.common.utils.StringUtils;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import javax.annotation.PostConstruct;
+import org.apache.pulsar.client.api.AuthenticationFactory;
+import org.apache.pulsar.client.api.Consumer;
+import org.apache.pulsar.client.api.Message;
+import org.apache.pulsar.client.api.MessageId;
+import org.apache.pulsar.client.api.Producer;
+import org.apache.pulsar.client.api.PulsarClient;
+import org.apache.pulsar.client.api.PulsarClientException;
+import org.apache.pulsar.client.api.SubscriptionInitialPosition;
+import org.apache.pulsar.client.api.SubscriptionType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * @auther duota
+ * @create 2021 2021/9/19 2:27 下午
+ * @describe
+ */
+@Component
+public class PulsarClientService {
+
+  protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+  private PulsarClient client;
+  private Consumer<byte[]> consumer;
+
+  @Value("${mq.service-url}")
+  private String serviceUrl;
+
+  @Value("${mq.auth-token}")
+  private String authToken;
+
+  @Value("${mq.topic-ticket-generate}")
+  private String topicTicketGenerate;
+
+  @Value("${mq.topic-ticket-pay}")
+  private String topicTicketPay;
+
+  @Value("${mq.consumer-conn}")
+  private boolean consumerConn;
+
+  @Value("${mq.consumer-topics}")
+  private String topics;
+
+  @Autowired
+  private PulsarConsumer pulsarConsumer;
+
+  private final ConcurrentHashMap<String, Producer<byte[]>> Producers = new ConcurrentHashMap<String, Producer<byte[]>>();
+
+  @PostConstruct
+  public void init() throws PulsarClientException {
+    client = PulsarClient.builder()
+        .serviceUrl(serviceUrl)//【集群管理】接入地址处复制
+        .authentication(AuthenticationFactory.token(authToken))
+        .build();
+
+    if (consumerConn) {
+      consumer = client.newConsumer()
+          .topic(topics.split(","))//topic完整路径,格式为persistent://集群(租户)ID/命名空间/Topic名称
+          .subscriptionName("ygp")//需要现在控制台或者通过控制台API创建好一个订阅,此处填写订阅名
+          .subscriptionType(SubscriptionType.Exclusive)//声明消费模式为exclusive(独占)模式
+          .subscriptionInitialPosition(
+              SubscriptionInitialPosition.Earliest)//配置从最早开始消费,否则可能会消费不到历史消息
+          .subscribe();
+      new Thread(() -> {
+        try {
+          loop();
+        } catch (Exception e) {
+          logger.error("消费Pulsar数据异常,停止Pulsar连接:", e);
+          close();
+        }
+      }).start();
+    }
+  }
+
+  private void loop() throws Exception {
+    //消费消息
+    while (true) {
+      Message message = consumer.receive();
+      String[] keyArr = message.getKey().split("_");
+      String topicName = message.getTopicName();
+      String key = message.getKey();
+      String jsons = new String(message.getData());
+      if (!StringUtils.isBlank(jsons)) {
+        try {
+          pulsarConsumer.wsConsumer(key, jsons);
+          logger.info("receive data>>>>>>" + jsons);
+          consumer.acknowledge(message);
+        } catch (Exception e) {
+          LogUtil.error(logger, e, "消费Pulsar数据异常,key【{0}】,json【{1}】:", new Object[]{message.getKey(), jsons});
+        }
+      }
+
+    }
+  }
+
+  /**
+   * @param mqTopicType
+   * @param data        内容为json格式
+   * @throws PulsarClientException
+   */
+  public void producer(MqTopicType mqTopicType, String data) throws PulsarClientException {
+    logger.info("start producer mq data:" + data);
+    String topic = "";
+    if (mqTopicType.getValue() == MqTopicType.ticket_generate.getValue()) {
+      topic = topicTicketGenerate; // 盲票生成
+    } else if (mqTopicType.getValue() == MqTopicType.ticket_pay.getValue()) {
+      topic = topicTicketPay; // 盲票付款成功
+    }
+    Producer<byte[]> producer = null;
+    if (Producers.containsKey(mqTopicType.getValue())) {
+      producer = Producers.get(mqTopicType.getValue());
+    } else {
+      producer = client.newProducer()
+          .topic(topic)//topic完整路径,格式为persistent://集群(租户)ID/命名空间/Topic名称
+          .enableBatching(true)
+          .create();
+      Producers.put(mqTopicType.getValue(), producer);
+    }
+
+    /*
+    producer.newMessage()//发送消息
+        .key(mqTopicType.getValue())
+        .value(data.getBytes())
+            .send();
+
+
+     */
+    CompletableFuture<MessageId> messageIdFuture = producer.newMessage()
+        .key(mqTopicType.getValue())
+        .value(data.getBytes())
+        .sendAsync();
+    Producer<byte[]> finalProducer = producer;
+    messageIdFuture.whenComplete(((messageId, throwable) -> {
+      if (null != throwable) {
+        logger.error("【消息投递异常,开始重试】", throwable);
+        //todo 失败重试策略
+        try {
+          finalProducer.newMessage().deliverAfter(5, TimeUnit.SECONDS
+          ).key(mqTopicType.getValue()).value(data.getBytes()).send();
+        } catch (PulsarClientException e) {
+          logger.error("重试投递失败", e);
+          //todo 保存数据库,增加失败重试,通过体系化重试框架保证消息投递完整性
+        }
+      } else {
+        logger.info("【消息成功投递】");
+      }
+    }));
+
+  }
+
+  public void consumer() throws PulsarClientException {
+
+  }
+
+  public void close() {
+    try {
+      consumer.close();
+    } catch (PulsarClientException e) {
+      logger.error("关闭Pulsar消费者失败:", e);
+    }
+    try {
+      client.close();
+    } catch (PulsarClientException e) {
+      logger.error("关闭Pulsar连接失败:", e);
+    }
+  }
+}

+ 12 - 0
mp-common/src/main/java/com/qs/mp/common/pulsar/PulsarConsumer.java

@@ -0,0 +1,12 @@
+package com.qs.mp.common.pulsar;
+
+/**
+ * @auther duota
+ * @create 2021 2021/9/20 10:19 上午
+ * @describe
+ */
+public interface PulsarConsumer {
+
+  public void wsConsumer(String topicType,String mqData);
+
+}

+ 89 - 6
mp-common/src/main/java/com/qs/mp/common/utils/DateUtils.java

@@ -3,12 +3,18 @@ package com.qs.mp.common.utils;
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.Calendar;
 import java.util.Date;
 import org.apache.commons.lang3.time.DateFormatUtils;
+import org.joda.time.DateTime;
+import org.joda.time.Days;
+import org.joda.time.Months;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
 
 /**
  * 时间工具类
- * 
+ *
  * @author ygp
  */
 public class DateUtils extends org.apache.commons.lang3.time.DateUtils
@@ -17,20 +23,26 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 
     public static String YYYY_MM = "yyyy-MM";
 
+    public static String YYYYMM = "yyyyMM";
+
     public static String YYYY_MM_DD = "yyyy-MM-dd";
 
     public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
 
+    public static String YYYYMMDD = "yyyyMMdd";
+
+    public static String YYYYDOTMMDOTDD = "yyyy.MM.dd";
+
     public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
-    
+
     private static String[] parsePatterns = {
-            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", 
+            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
             "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
             "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
 
     /**
      * 获取当前Date型日期
-     * 
+     *
      * @return Date() 当前日期
      */
     public static Date getNowDate()
@@ -38,9 +50,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return new Date();
     }
 
+    public static Date getToday() {
+        String s = parseDateToStr(YYYY_MM_DD, new Date());
+        return dateTime(YYYY_MM_DD, s);
+    }
+
     /**
      * 获取当前日期, 默认格式为yyyy-MM-dd
-     * 
+     *
      * @return String
      */
     public static String getDate()
@@ -85,6 +102,45 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         }
     }
 
+    public static final Date parseDateToDay(Date date) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        String s = sdf.format(date);
+        try {
+            return sdf.parse(s);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 计算两个日期之间相差多少天,一个月按30天算
+     * @param begin
+     * @param end
+     * @return
+     */
+    public static final int diff(Date begin, Date end) {
+        DateTimeFormatter formatter = DateTimeFormat.forPattern(YYYY_MM_DD);
+        DateTime startDay = formatter.parseDateTime(parseDateToStr(YYYY_MM_DD, begin));
+        DateTime endDay = formatter.parseDateTime(parseDateToStr(YYYY_MM_DD, end));
+        int days = Days.daysBetween(startDay, endDay).getDays();
+        return days;
+    }
+
+    /**
+     * 计算两个日期之间相差多少个月
+     * @param begin
+     * @param end
+     * @return
+     */
+    public static final int diffMonth(Date begin, Date end) {
+
+        DateTimeFormatter formatter = DateTimeFormat.forPattern(YYYY_MM_DD);
+        DateTime startDay = formatter.parseDateTime(parseDateToStr(YYYY_MM_DD, begin));
+        DateTime endDay = formatter.parseDateTime(parseDateToStr(YYYY_MM_DD, end));
+        int months = Months.monthsBetween(startDay, endDay).getMonths();
+        return months;
+    }
+
     /**
      * 日期路径 即年/月/日 如2018/08/08
      */
@@ -103,6 +159,20 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return DateFormatUtils.format(now, "yyyyMMdd");
     }
 
+    public static final Date parseStrToDate(String str, String pattern){
+        if (str == null)
+        {
+            return null;
+        }
+        try
+        {
+            return parseDate(str, pattern);
+        }
+        catch (ParseException e)
+        {
+            return null;
+        }
+    }
     /**
      * 日期型字符串转化为日期 格式
      */
@@ -121,7 +191,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
             return null;
         }
     }
-    
+
     /**
      * 获取服务器启动时间
      */
@@ -152,4 +222,17 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         // long sec = diff % nd % nh % nm / ns;
         return day + "天" + hour + "小时" + min + "分钟";
     }
+
+    public static Date getNowAddMonth(Date now, int months) {
+    	SimpleDateFormat sj = new SimpleDateFormat("yyyyMMdd");
+        try {
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(now);
+            calendar.add(Calendar.MONTH, months);
+            return calendar.getTime();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 }

+ 130 - 0
mp-common/src/main/java/com/qs/mp/common/utils/RSAUtil.java

@@ -0,0 +1,130 @@
+package com.qs.mp.common.utils;
+
+import com.qs.mp.common.exception.ServiceException;
+import java.nio.charset.StandardCharsets;
+import java.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.HashMap;
+import java.util.Map;
+import javax.crypto.Cipher;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class RSAUtil {
+
+  private static String privateKey;
+
+  @Value("${rsa.private-key}")
+  public void setPrivateKey(String priKey) {
+    privateKey = priKey;
+  }
+
+  private static String publicKey;
+
+  @Value("${rsa.public-key}")
+  public void setPublicKey(String pubKey) {
+    publicKey = pubKey;
+  }
+
+  private static final Map<Integer, String> keyMap = new HashMap<Integer, String>();  //用于封装随机产生的公钥与私钥
+
+  public static void main(String[] args) throws Exception {
+    //生成公钥和私钥
+    genKeyPair();
+    //加密字符串
+    String message = "5";
+    System.out.println("随机生成的公钥为:" + keyMap.get(0));
+    System.out.println("随机生成的私钥为:" + keyMap.get(1));
+//    String messageEn = encrypt(message,keyMap.get(0));
+//    System.out.println(message + "\t加密后的字符串为:" + messageEn);
+//    String messageDe = decrypt(messageEn,keyMap.get(1));
+//    System.out.println("还原后的字符串为:" + messageDe);
+  }
+
+  /**
+   * 随机生成密钥对
+   *
+   * @throws NoSuchAlgorithmException
+   */
+  public static void genKeyPair() throws NoSuchAlgorithmException {
+    // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
+    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
+    // 初始化密钥对生成器,密钥大小为96-1024位
+    keyPairGen.initialize(1024, new SecureRandom());
+    // 生成一个密钥对,保存在keyPair中
+    KeyPair keyPair = keyPairGen.generateKeyPair();
+    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();   // 得到私钥
+    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  // 得到公钥
+    String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));
+    // 得到私钥字符串
+    String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));
+    // 将公钥和私钥保存到Map
+    keyMap.put(0, publicKeyString);  //0表示公钥
+    keyMap.put(1, privateKeyString);  //1表示私钥
+  }
+
+  /**
+   * RSA公钥加密
+   *
+   * @param str       加密字符串
+   * @param publicKey 公钥
+   * @return 密文
+   * @throws Exception 加密过程中的异常信息
+   */
+  public static String encrypt(String str) {
+    try {
+
+      //base64编码的公钥
+      byte[] decoded = Base64.decodeBase64(publicKey);
+      RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA")
+          .generatePublic(new X509EncodedKeySpec(decoded));
+      //RSA加密
+      Cipher cipher = Cipher.getInstance("RSA");
+      cipher.init(Cipher.ENCRYPT_MODE, pubKey);
+      String outStr = Base64.encodeBase64String(
+          cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)));
+      return outStr;
+    } catch (Exception e) {
+      throw new ServiceException("加密幸运数字异常,str:" + str, e);
+    }
+  }
+
+  /**
+   * RSA私钥解密
+   *
+   * @param str        加密字符串
+   * @param privateKey 私钥
+   * @return 铭文
+   * @throws Exception 解密过程中的异常信息
+   */
+  public static String decrypt(String str) {
+    try {
+
+      //64位解码加密后的字符串
+      byte[] inputByte = Base64.decodeBase64(str.getBytes(StandardCharsets.UTF_8));
+      //base64编码的私钥
+      byte[] decoded = Base64.decodeBase64(privateKey);
+      RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA")
+          .generatePrivate(new PKCS8EncodedKeySpec(decoded));
+      //RSA解密
+      Cipher cipher = Cipher.getInstance("RSA");
+      cipher.init(Cipher.DECRYPT_MODE, priKey);
+      String outStr = new String(cipher.doFinal(inputByte));
+      return outStr;
+    } catch (Exception e) {
+      throw new ServiceException("解密幸运数字异常,str:" + str, e);
+    }
+  }
+
+}
+
+

+ 84 - 3
mp-common/src/main/java/com/qs/mp/common/utils/http/HttpUtils.java

@@ -1,6 +1,8 @@
 package com.qs.mp.common.utils.http;
 
+import cn.hutool.http.ssl.TrustAnyHostnameVerifier;
 import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -16,13 +18,14 @@ import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSession;
 import javax.net.ssl.TrustManager;
 import javax.net.ssl.X509TrustManager;
+import org.apache.commons.codec.binary.Base64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import com.qs.mp.common.constant.Constants;
 
 /**
  * 通用http发送方法
- * 
+ *
  * @author ygp
  */
 public class HttpUtils
@@ -119,7 +122,7 @@ public class HttpUtils
         try
         {
             String urlNameString = url;
-            log.info("sendPost - {}", urlNameString);
+            log.info("sendPost - {}", urlNameString, param);
             URL realUrl = new URL(urlNameString);
             URLConnection conn = realUrl.openConnection();
             conn.setRequestProperty("accept", "*/*");
@@ -177,6 +180,84 @@ public class HttpUtils
         return result.toString();
     }
 
+    /**
+     * 向指定 URL 发送POST方法的请求,返回图片buffer对象
+     *
+     * @param url 发送请求的 URL
+     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
+     * @return 所代表远程资源的响应结果
+     */
+    public static InputStream sendImagePost(String url, String param)
+    {
+        PrintWriter out = null;
+        InputStream in = null;
+        String result = "";
+        try
+        {
+            String urlNameString = url;
+            log.info("sendPost - {}", urlNameString, param);
+            URL realUrl = new URL(urlNameString);
+            URLConnection conn = realUrl.openConnection();
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            conn.setRequestProperty("Accept-Charset", "utf-8");
+            conn.setRequestProperty("contentType", "utf-8");
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            out = new PrintWriter(conn.getOutputStream());
+            out.print(param);
+            out.flush();
+            in = conn.getInputStream();
+            return in;
+            /*byte[] data = null;
+            // 读取图片字节数组
+            ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
+            byte[] buff = new byte[100];
+            int rc = 0;
+            while ((rc = in.read(buff, 0, 100)) > 0) {
+                swapStream.write(buff, 0, rc);
+            }
+            data = swapStream.toByteArray();
+            return new String(Base64.encodeBase64(data));*/
+        }
+        catch (ConnectException e)
+        {
+            log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
+        }
+        catch (SocketTimeoutException e)
+        {
+            log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+        }
+        catch (IOException e)
+        {
+            log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
+        }
+        catch (Exception e)
+        {
+            log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
+        }
+        finally
+        {
+            try
+            {
+                if (out != null)
+                {
+                    out.close();
+                }
+                /*if (in != null)
+                {
+                    in.close();
+                }*/
+            }
+            catch (Exception ex)
+            {
+                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
+            }
+        }
+        return null;
+    }
+
     public static String sendSSLPost(String url, String param)
     {
         StringBuilder result = new StringBuilder();
@@ -259,4 +340,4 @@ public class HttpUtils
             return true;
         }
     }
-}
+}

+ 105 - 76
mp-framework/.factorypath

@@ -1,70 +1,91 @@
 <factorypath>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-web/2.2.13.RELEASE/spring-boot-starter-web-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter/2.2.13.RELEASE/spring-boot-starter-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot/2.2.13.RELEASE/spring-boot-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-logging/2.2.13.RELEASE/spring-boot-starter-logging-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-to-slf4j/2.12.1/log4j-to-slf4j-2.12.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-web/2.5.4/spring-boot-starter-web-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter/2.5.4/spring-boot-starter-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot/2.5.4/spring-boot-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-logging/2.5.4/spring-boot-starter-logging-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-classic/1.2.5/logback-classic-1.2.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-core/1.2.5/logback-core-1.2.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-to-slf4j/2.14.1/log4j-to-slf4j-2.14.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.14.1/log4j-api-2.14.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/jul-to-slf4j/1.7.32/jul-to-slf4j-1.7.32.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-core/5.2.12.RELEASE/spring-core-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jcl/5.2.12.RELEASE/spring-jcl-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-json/2.2.13.RELEASE/spring-boot-starter-json-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-databind/2.10.5.1/jackson-databind-2.10.5.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-annotations/2.10.5/jackson-annotations-2.10.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-core/2.10.5/jackson-core-2.10.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.5/jackson-datatype-jdk8-2.10.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.5/jackson-datatype-jsr310-2.10.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/module/jackson-module-parameter-names/2.10.5/jackson-module-parameter-names-2.10.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-tomcat/2.2.13.RELEASE/spring-boot-starter-tomcat-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/tomcat/embed/tomcat-embed-core/9.0.41/tomcat-embed-core-9.0.41.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/tomcat/embed/tomcat-embed-el/9.0.41/tomcat-embed-el-9.0.41.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.41/tomcat-embed-websocket-9.0.41.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-validation/2.2.13.RELEASE/spring-boot-starter-validation-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/hibernate/validator/hibernate-validator/6.0.22.Final/hibernate-validator-6.0.22.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/jboss/logging/jboss-logging/3.4.1.Final/jboss-logging-3.4.1.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-web/5.2.12.RELEASE/spring-web-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-beans/5.2.12.RELEASE/spring-beans-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-webmvc/5.2.12.RELEASE/spring-webmvc-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context/5.2.12.RELEASE/spring-context-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-expression/5.2.12.RELEASE/spring-expression-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-aop/2.2.13.RELEASE/spring-boot-starter-aop-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-aop/5.2.12.RELEASE/spring-aop-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/aspectj/aspectjweaver/1.9.6/aspectjweaver-1.9.6.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-core/5.3.9/spring-core-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jcl/5.3.9/spring-jcl-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.28/snakeyaml-1.28.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-json/2.5.4/spring-boot-starter-json-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-databind/2.12.4/jackson-databind-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-annotations/2.12.4/jackson-annotations-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-core/2.12.4/jackson-core-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.12.4/jackson-datatype-jdk8-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.4/jackson-datatype-jsr310-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/module/jackson-module-parameter-names/2.12.4/jackson-module-parameter-names-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-tomcat/2.5.4/spring-boot-starter-tomcat-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/tomcat/embed/tomcat-embed-core/9.0.52/tomcat-embed-core-9.0.52.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/tomcat/embed/tomcat-embed-el/9.0.52/tomcat-embed-el-9.0.52.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.52/tomcat-embed-websocket-9.0.52.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-web/5.3.9/spring-web-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-beans/5.3.9/spring-beans-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-webmvc/5.3.9/spring-webmvc-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context/5.3.9/spring-context-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-expression/5.3.9/spring-expression-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-aop/2.5.4/spring-boot-starter-aop-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-aop/5.3.9/spring-aop-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/alibaba/druid-spring-boot-starter/1.2.6/druid-spring-boot-starter-1.2.6.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/alibaba/druid/1.2.6/druid-1.2.6.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-autoconfigure/2.2.13.RELEASE/spring-boot-autoconfigure-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-autoconfigure/2.5.4/spring-boot-autoconfigure-2.5.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/penggle/kaptcha/2.3.2/kaptcha-2.3.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/jhlabs/filters/2.0.235-1/filters-2.0.235-1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/oshi/oshi-core/5.8.0/oshi-core-5.8.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/net/java/dev/jna/jna-platform/5.8.0/jna-platform-5.8.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context-support/5.2.12.RELEASE/spring-context-support-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-security/2.2.13.RELEASE/spring-boot-starter-security-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-config/5.2.8.RELEASE/spring-security-config-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-core/5.2.8.RELEASE/spring-security-core-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-web/5.2.8.RELEASE/spring-security-web-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper-spring-boot-starter/1.3.1/pagehelper-spring-boot-starter-1.3.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-starter/2.1.4/mybatis-spring-boot-starter-2.1.4.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.1.4/mybatis-spring-boot-autoconfigure-2.1.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-extension/3.4.1/mybatis-plus-extension-3.4.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-core/3.4.1/mybatis-plus-core-3.4.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-annotation/3.4.1/mybatis-plus-annotation-3.4.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/jsqlparser/jsqlparser/3.2/jsqlparser-3.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis/3.5.6/mybatis-3.5.6.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis-spring/2.0.5/mybatis-spring-2.0.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context-support/5.3.9/spring-context-support-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-security/2.5.4/spring-boot-starter-security-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-config/5.5.2/spring-security-config-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-core/5.5.2/spring-security-core-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-crypto/5.5.2/spring-security-crypto-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-web/5.5.2/spring-security-web-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper-spring-boot-starter/1.3.1/pagehelper-spring-boot-starter-1.3.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper-spring-boot-autoconfigure/1.3.1/pagehelper-spring-boot-autoconfigure-1.3.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper/5.2.1/pagehelper-5.2.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/jsqlparser/jsqlparser/4.0/jsqlparser-4.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/dataformat/jackson-dataformat-xml/2.12.4/jackson-dataformat-xml-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.12.4/jackson-module-jaxb-annotations-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/xml/bind/jakarta.xml.bind-api/2.3.3/jakarta.xml.bind-api-2.3.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/codehaus/woodstox/stax2-api/4.2.1/stax2-api-4.2.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/woodstox/woodstox-core/6.2.4/woodstox-core-6.2.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/alibaba/fastjson/1.2.76/fastjson-1.2.76.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-fileupload/commons-fileupload/1.4/commons-fileupload-1.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/qcloud/cos_api/5.6.54/cos_api-5.6.54.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/httpcomponents/httpcore/4.4.14/httpcore-4.4.14.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/commons-codec/commons-codec/1.15/commons-codec-1.15.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/joda-time/joda-time/2.9.9/joda-time-2.9.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/tencentcloudapi/tencentcloud-sdk-java-kms/3.1.213/tencentcloud-sdk-java-kms-3.1.213.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/tencentcloudapi/tencentcloud-sdk-java-common/3.1.213/tencentcloud-sdk-java-common-3.1.213.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp/logging-interceptor/2.7.5/logging-interceptor-2.7.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/bouncycastle/bcprov-jdk15on/1.64/bcprov-jdk15on-1.64.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/cn/jpush/api/jiguang-common/1.0.8/jiguang-common-1.0.8.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-all/4.1.67.Final/netty-all-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.7/gson-2.8.7.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/cn/jpush/api/jsms-client/1.2.9/jsms-client-1.2.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/net/coobird/thumbnailator/0.4.8/thumbnailator-0.4.8.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/poi/poi-ooxml/4.1.2/poi-ooxml-4.1.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/poi/poi/4.1.2/poi-4.1.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/commons-codec/commons-codec/1.13/commons-codec-1.13.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-collections4/4.4/commons-collections4-4.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/SparseBitSet/1.2/SparseBitSet-1.2.jar" enabled="true" runInBatchMode="false"/>
@@ -73,35 +94,20 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-compress/1.19/commons-compress-1.19.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/virtuald/curvesapi/1.06/curvesapi-1.06.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/jsonwebtoken/jjwt/0.9.1/jjwt-0.9.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-data-redis/2.2.13.RELEASE/spring-boot-starter-data-redis-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-redis/2.2.12.RELEASE/spring-data-redis-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-keyvalue/2.2.12.RELEASE/spring-data-keyvalue-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-commons/2.2.12.RELEASE/spring-data-commons-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-tx/5.2.12.RELEASE/spring-tx-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-oxm/5.2.12.RELEASE/spring-oxm-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/lettuce/lettuce-core/5.2.2.RELEASE/lettuce-core-5.2.2.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.58.Final/netty-common-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler/4.1.58.Final/netty-handler-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.58.Final/netty-resolver-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.58.Final/netty-buffer-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.58.Final/netty-codec-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.58.Final/netty-transport-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/projectreactor/reactor-core/3.3.13.RELEASE/reactor-core-3.3.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-pool2/2.7.0/commons-pool2-2.7.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-pool2/2.9.0/commons-pool2-2.9.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/eu/bitwalker/UserAgentUtils/1.21/UserAgentUtils-1.21.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okio/okio/1.17.2/okio-1.17.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/javax/servlet/javax.servlet-api/4.0.1/javax.servlet-api-4.0.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-boot-starter/3.3.0/mybatis-plus-boot-starter-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus/3.3.0/mybatis-plus-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-extension/3.3.0/mybatis-plus-extension-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-core/3.3.0/mybatis-plus-core-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-annotation/3.3.0/mybatis-plus-annotation-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-jdbc/2.2.13.RELEASE/spring-boot-starter-jdbc-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/HikariCP/3.4.5/HikariCP-3.4.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jdbc/5.2.12.RELEASE/spring-jdbc-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis-spring/2.0.0/mybatis-spring-2.0.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-starter/2.1.2/mybatis-spring-boot-starter-2.1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-jdbc/2.5.4/spring-boot-starter-jdbc-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/HikariCP/4.0.3/HikariCP-4.0.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jdbc/5.3.9/spring-jdbc-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.1.2/mybatis-spring-boot-autoconfigure-2.1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-boot-starter/3.4.3.2/mybatis-plus-boot-starter-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus/3.4.3.2/mybatis-plus-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/cn/hutool/hutool-all/5.3.1/hutool-all-5.3.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.16/lombok-1.18.16.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.20/lombok-1.18.20.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-boot-starter/3.0.0/springfox-boot-starter-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-oas/3.0.0/springfox-oas-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/swagger/core/v3/swagger-annotations/2.1.2/swagger-annotations-2.1.2.jar" enabled="true" runInBatchMode="false"/>
@@ -109,7 +115,7 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spi/3.0.0/springfox-spi-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-schema/3.0.0/springfox-schema-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-core/3.0.0/springfox-core-3.0.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/net/bytebuddy/byte-buddy/1.10.19/byte-buddy-1.10.19.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/net/bytebuddy/byte-buddy/1.10.22/byte-buddy-1.10.22.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spring-web/3.0.0/springfox-spring-web-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/github/classgraph/classgraph/4.8.83/classgraph-4.8.83.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spring-webmvc/3.0.0/springfox-spring-webmvc-3.0.0.jar" enabled="true" runInBatchMode="false"/>
@@ -121,6 +127,29 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-swagger2/3.0.0/springfox-swagger2-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/swagger/swagger-annotations/1.5.20/swagger-annotations-1.5.20.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-swagger-ui/3.0.0/springfox-swagger-ui-3.0.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/plugin/spring-plugin-core/2.0.0.RELEASE/spring-plugin-core-2.0.0.RELEASE.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/plugin/spring-plugin-metadata/2.0.0.RELEASE/spring-plugin-metadata-2.0.0.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-data-redis/2.5.4/spring-boot-starter-data-redis-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-redis/2.5.4/spring-data-redis-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-keyvalue/2.5.4/spring-data-keyvalue-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-commons/2.5.4/spring-data-commons-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-tx/5.3.9/spring-tx-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-oxm/5.3.9/spring-oxm-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/lettuce/lettuce-core/6.1.4.RELEASE/lettuce-core-6.1.4.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.67.Final/netty-common-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler/4.1.67.Final/netty-handler-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.67.Final/netty-resolver-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.67.Final/netty-buffer-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.67.Final/netty-codec-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.67.Final/netty-transport-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/projectreactor/reactor-core/3.4.9/reactor-core-3.4.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/integration/spring-integration-redis/5.5.3/spring-integration-redis-5.5.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/integration/spring-integration-core/5.5.3/spring-integration-core-5.5.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-messaging/5.3.9/spring-messaging-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/retry/spring-retry/1.3.1/spring-retry-1.3.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/redis/clients/jedis/3.6.3/jedis-3.6.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-generator/3.4.1/mybatis-plus-generator-3.4.1.jar" enabled="true" runInBatchMode="false"/>
 </factorypath>

+ 10 - 4
mp-framework/src/main/java/com/qs/mp/framework/config/SecurityConfig.java

@@ -21,7 +21,7 @@ import org.springframework.web.filter.CorsFilter;
 
 /**
  * spring security配置
- * 
+ *
  * @author ygp
  */
 @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
@@ -32,7 +32,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
      */
     @Autowired
     private UserDetailsService userDetailsService;
-    
+
     /**
      * 认证失败处理类
      */
@@ -59,7 +59,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
      */
     @Autowired
     private CorsFilter corsFilter;
-    
+
     /**
      * 解决 无法直接注入 AuthenticationManager
      *
@@ -106,7 +106,12 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                     "/captchaImage",
                     "/auth/mobile",
                     "/wxlogin",
-                    "/api/v1/ygp/sms/sendSmsCode").anonymous()
+                    "/api/v1/mp/sms/sendSmsCode",
+                    "/api/v1/mp/user/wxauth/mobile",
+                    "/api/v1/mp/channel/invite/register",
+                    "/api/v1/mp/wx/urlschema/generate",
+                    "/api/v1/mp/wx/code/generate",
+                    "/api/v1/mp/user/ticket/queryLuckyNum").anonymous()
                 .antMatchers(
                         HttpMethod.GET,
                         "/",
@@ -124,6 +129,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/*/api-docs").anonymous()
                 .antMatchers("/druid/**").anonymous()
                 .antMatchers("/service/notify/**").anonymous()
+                .antMatchers("/api/v1/mp/user/mall/**").anonymous()
 
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()

+ 61 - 107
mp-framework/src/main/java/com/qs/mp/framework/web/service/SysLoginService.java

@@ -1,7 +1,12 @@
 package com.qs.mp.framework.web.service;
 
+import com.alibaba.fastjson.JSONObject;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.common.constant.Constants;
 import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.ChannelRoleEnum;
+import com.qs.mp.common.enums.UserIdentityEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.exception.user.CaptchaException;
 import com.qs.mp.common.exception.user.CaptchaExpireException;
@@ -18,6 +23,9 @@ import com.qs.mp.sms.domain.SmsCode;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysConfigService;
 import com.qs.mp.system.service.ISysUserService;
+
+import java.util.HashMap;
+import java.util.Map;
 import javax.annotation.Resource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -26,11 +34,12 @@ import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
+import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.stereotype.Component;
 
 /**
  * 登录校验方法
- * 
+ *
  * @author ygp
  */
 @Component
@@ -47,16 +56,22 @@ public class SysLoginService
 
     @Autowired
     private RedisCache redisCache;
-    
+
     @Autowired
     private ISysUserService userService;
 
     @Autowired
     private ISysConfigService configService;
 
+    @Autowired
+    private IChannelService channelService;
+
+    @Autowired
+    private UserDetailsService userDetailsService;
+
     /**
      * 登录验证
-     * 
+     *
      * @param username 用户名
      * @param password 密码
      * @param code 验证码
@@ -64,7 +79,7 @@ public class SysLoginService
      * @param identity 唯一标识
      * @return 结果
      */
-    public String login(String username, String password, String code, String uuid, int identity)
+    public Map<String, String> login(String username, String password, String code, String uuid, int identity)
     {
         // 用户验证
         Authentication authentication = null;
@@ -90,74 +105,35 @@ public class SysLoginService
         }
         AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
+        return buildUserToken(identity, loginUser);
+    }
+
+    private Map<String, String> buildUserToken(int identity, LoginUser loginUser) {
         recordLoginInfo(loginUser.getUser());
-/*
-        // 根据用户身份,设置对应的属性
+        HashMap<String, String> result = new HashMap<>();
+
         loginUser.setIdentity(UserIdentityEnum.valueOf(identity));
+        if (!loginUser.getUsername().equals("admin") && UserIdentityEnum.isChannel(
+            loginUser.getIdentity().ordinal())) {
+            ChannelRoleEnum roleEnum = fillChannelInfo(loginUser);
+            result.put(Constants.CHANNEL_ROLE, roleEnum.getValue());
+        }
 
-        if(loginUser.isCustomer()){
-            fillCustomerInfo(loginUser);
-        }*/
-//        if(loginUser.isMerchant()){
-//            fillMerchantInfoByStaffs(loginUser);
-//        }
         // 生成token
-        return tokenService.createToken(loginUser);
+        String token = tokenService.createToken(loginUser);
+        result.put(Constants.TOKEN, token);
+
+        return result;
     }
-    
-    /**
-     * 登录验证
-     * 
-     * @param username 用户名
-     * @param code 验证码
-     * @param uuid 唯一标识
-     * @param identity 唯一标识
-     * @return 结果
-     */
-    public String loginBySms(String username, String code, String uuid, int identity)
+
+    public Map<String, String> wxAuthLogin(String username, int identity)
     {
-        // 校验短信验证码
-        validateSMSCaptcha(username, code, uuid);
-        
-        // 用户验证
-        Authentication authentication = null;
-        try
-        {
-            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
-            authentication = authenticationManager
-                    .authenticate(new UsernamePasswordAuthenticationToken(username, code));
-        }
-        catch (Exception e)
-        {
-            if (e instanceof BadCredentialsException)
-            {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
-                throw new UserPasswordNotMatchException();
-            }
-            else
-            {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
-                throw new ServiceException(e.getMessage());
-            }
-        }
         AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
-        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
-        recordLoginInfo(loginUser.getUser());
-/*
-        // 根据用户身份,设置对应的属性
-        loginUser.setIdentity(UserIdentityEnum.valueOf(identity));
-
-        if(loginUser.isCustomer()){
-            fillCustomerInfo(loginUser);
-        }*/
-//        if(loginUser.isMerchant()){
-//            fillMerchantInfoByStaffs(loginUser);
-//        }
-        // 生成token
-        return tokenService.createToken(loginUser);
+        LoginUser loginUser = (LoginUser) userDetailsService.loadUserByUsername(username);
+        return buildUserToken(identity, loginUser);
     }
 
-    public String login(SmsCode smsCode)
+    public Map<String, String> login(SmsCode smsCode)
     {
         // 用户验证
         Authentication authentication = null;
@@ -184,29 +160,12 @@ public class SysLoginService
         }
         AsyncManager.me().execute(AsyncFactory.recordLogininfor(smsCode.getMobile(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
-        recordLoginInfo(loginUser.getUser());
-/*
-        // 根据用户身份,设置对应的属性
-        loginUser.setIdentity(UserIdentityEnum.valueOf(smsCode.getIdentity()));
-        logger.info("login user info :"+ JSONObject.toJSONString(loginUser));
-
-        if(loginUser.isCustomer()){
-            fillCustomerInfo(loginUser);
-        }*/
-//        if(loginUser.isMerchant()){
-//            fillMerchantInfoByStaffs(loginUser);
-//        }
-
-        logger.info("prepare create token 。。。");
-        String token = tokenService.createToken(loginUser);
-        logger.info("token:"+token);
-        // 生成token
-        return token;
+        return buildUserToken(smsCode.getIdentity(), loginUser);
     }
 
     /**
      * 校验验证码
-     * 
+     *
      * @param username 用户名
      * @param code 验证码
      * @param uuid 唯一标识
@@ -228,31 +187,6 @@ public class SysLoginService
             throw new CaptchaException();
         }
     }
-    
-    /**
-     * 校验验证码
-     * 
-     * @param username 用户名
-     * @param code 短信验证码
-     * @param uuid 唯一标识
-     * @return 结果
-     */
-    public void validateSMSCaptcha(String username, String code, String uuid)
-    {
-        String verifyKey = Constants.SMS_CAPTCHA_CODE_KEY + uuid;
-        String captcha = redisCache.getCacheObject(verifyKey);
-        redisCache.deleteObject(verifyKey);
-        if (captcha == null)
-        {
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
-            throw new CaptchaExpireException();
-        }
-        if (!code.equalsIgnoreCase(captcha))
-        {
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
-            throw new CaptchaException();
-        }
-    }
 
     /**
      * 记录登录信息
@@ -264,4 +198,24 @@ public class SysLoginService
         userService.updateUserProfile(user);
     }
 
+    /**
+     * 填充注入Channel 渠道/经销商  信息
+     * @param loginUser
+     */
+    public ChannelRoleEnum fillChannelInfo(LoginUser loginUser){
+    	Channel channel = channelService.getChannelByUserId(loginUser.getUserId());
+        if (null != channel && null != channel.getChannelId()){
+          loginUser.setChannelId(channel.getChannelId());
+          loginUser.setChannelNo(channel.getChannelNo());
+          if (channel.getLevel() == 0) {
+              return ChannelRoleEnum.SALESITE;
+          } else {
+              return ChannelRoleEnum.CHANNEL;
+          }
+        } else {
+            throw new ServiceException("登录账号不存在");
+        }
+    }
+
+
 }

+ 94 - 60
mp-generator/.factorypath

@@ -2,45 +2,64 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/velocity/velocity/1.7/velocity-1.7.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-lang/commons-lang/2.4/commons-lang-2.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context-support/5.2.12.RELEASE/spring-context-support-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-beans/5.2.12.RELEASE/spring-beans-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context/5.2.12.RELEASE/spring-context-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-expression/5.2.12.RELEASE/spring-expression-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-core/5.2.12.RELEASE/spring-core-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jcl/5.2.12.RELEASE/spring-jcl-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-web/5.2.12.RELEASE/spring-web-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-security/2.2.13.RELEASE/spring-boot-starter-security-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter/2.2.13.RELEASE/spring-boot-starter-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot/2.2.13.RELEASE/spring-boot-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-logging/2.2.13.RELEASE/spring-boot-starter-logging-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-to-slf4j/2.12.1/log4j-to-slf4j-2.12.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-aop/5.2.12.RELEASE/spring-aop-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-config/5.2.8.RELEASE/spring-security-config-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-core/5.2.8.RELEASE/spring-security-core-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-web/5.2.8.RELEASE/spring-security-web-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper-spring-boot-starter/1.3.1/pagehelper-spring-boot-starter-1.3.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-starter/2.1.4/mybatis-spring-boot-starter-2.1.4.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.1.4/mybatis-spring-boot-autoconfigure-2.1.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-generator/3.4.1/mybatis-plus-generator-3.4.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-extension/3.4.1/mybatis-plus-extension-3.4.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-core/3.4.1/mybatis-plus-core-3.4.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-annotation/3.4.1/mybatis-plus-annotation-3.4.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/jsqlparser/jsqlparser/3.2/jsqlparser-3.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis/3.5.6/mybatis-3.5.6.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis-spring/2.0.5/mybatis-spring-2.0.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/mysql/mysql-connector-java/8.0.26/mysql-connector-java-8.0.26.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context-support/5.3.9/spring-context-support-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-beans/5.3.9/spring-beans-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context/5.3.9/spring-context-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-expression/5.3.9/spring-expression-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-core/5.3.9/spring-core-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jcl/5.3.9/spring-jcl-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-web/5.3.9/spring-web-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-security/2.5.4/spring-boot-starter-security-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-aop/5.3.9/spring-aop-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-config/5.5.2/spring-security-config-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-core/5.5.2/spring-security-core-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-crypto/5.5.2/spring-security-crypto-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-web/5.5.2/spring-security-web-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper-spring-boot-starter/1.3.1/pagehelper-spring-boot-starter-1.3.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper-spring-boot-autoconfigure/1.3.1/pagehelper-spring-boot-autoconfigure-1.3.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper/5.2.1/pagehelper-5.2.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/github/jsqlparser/jsqlparser/4.0/jsqlparser-4.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-databind/2.10.5.1/jackson-databind-2.10.5.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-annotations/2.10.5/jackson-annotations-2.10.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-core/2.10.5/jackson-core-2.10.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-databind/2.12.4/jackson-databind-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-annotations/2.12.4/jackson-annotations-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-core/2.12.4/jackson-core-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/dataformat/jackson-dataformat-xml/2.12.4/jackson-dataformat-xml-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.12.4/jackson-module-jaxb-annotations-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/xml/bind/jakarta.xml.bind-api/2.3.3/jakarta.xml.bind-api-2.3.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/codehaus/woodstox/stax2-api/4.2.1/stax2-api-4.2.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/woodstox/woodstox-core/6.2.4/woodstox-core-6.2.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/alibaba/fastjson/1.2.76/fastjson-1.2.76.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-fileupload/commons-fileupload/1.4/commons-fileupload-1.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/qcloud/cos_api/5.6.54/cos_api-5.6.54.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/httpcomponents/httpcore/4.4.14/httpcore-4.4.14.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/commons-codec/commons-codec/1.15/commons-codec-1.15.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/joda-time/joda-time/2.9.9/joda-time-2.9.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/tencentcloudapi/tencentcloud-sdk-java-kms/3.1.213/tencentcloud-sdk-java-kms-3.1.213.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/tencentcloudapi/tencentcloud-sdk-java-common/3.1.213/tencentcloud-sdk-java-common-3.1.213.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp/logging-interceptor/2.7.5/logging-interceptor-2.7.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/bouncycastle/bcprov-jdk15on/1.64/bcprov-jdk15on-1.64.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/cn/jpush/api/jiguang-common/1.0.8/jiguang-common-1.0.8.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-all/4.1.67.Final/netty-all-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.7/gson-2.8.7.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/cn/jpush/api/jsms-client/1.2.9/jsms-client-1.2.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/net/coobird/thumbnailator/0.4.8/thumbnailator-0.4.8.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/poi/poi-ooxml/4.1.2/poi-ooxml-4.1.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/poi/poi/4.1.2/poi-4.1.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/commons-codec/commons-codec/1.13/commons-codec-1.13.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-collections4/4.4/commons-collections4-4.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/SparseBitSet/1.2/SparseBitSet-1.2.jar" enabled="true" runInBatchMode="false"/>
@@ -48,38 +67,23 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/xmlbeans/xmlbeans/3.1.0/xmlbeans-3.1.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-compress/1.19/commons-compress-1.19.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/virtuald/curvesapi/1.06/curvesapi-1.06.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.28/snakeyaml-1.28.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/jsonwebtoken/jjwt/0.9.1/jjwt-0.9.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-data-redis/2.2.13.RELEASE/spring-boot-starter-data-redis-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-redis/2.2.12.RELEASE/spring-data-redis-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-keyvalue/2.2.12.RELEASE/spring-data-keyvalue-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-commons/2.2.12.RELEASE/spring-data-commons-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-tx/5.2.12.RELEASE/spring-tx-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-oxm/5.2.12.RELEASE/spring-oxm-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/lettuce/lettuce-core/5.2.2.RELEASE/lettuce-core-5.2.2.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.58.Final/netty-common-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler/4.1.58.Final/netty-handler-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.58.Final/netty-resolver-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.58.Final/netty-buffer-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.58.Final/netty-codec-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.58.Final/netty-transport-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/projectreactor/reactor-core/3.3.13.RELEASE/reactor-core-3.3.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-pool2/2.7.0/commons-pool2-2.7.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-pool2/2.9.0/commons-pool2-2.9.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/eu/bitwalker/UserAgentUtils/1.21/UserAgentUtils-1.21.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okio/okio/1.17.2/okio-1.17.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/javax/servlet/javax.servlet-api/4.0.1/javax.servlet-api-4.0.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-boot-starter/3.3.0/mybatis-plus-boot-starter-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus/3.3.0/mybatis-plus-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-extension/3.3.0/mybatis-plus-extension-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-core/3.3.0/mybatis-plus-core-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-annotation/3.3.0/mybatis-plus-annotation-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-autoconfigure/2.2.13.RELEASE/spring-boot-autoconfigure-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-jdbc/2.2.13.RELEASE/spring-boot-starter-jdbc-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/HikariCP/3.4.5/HikariCP-3.4.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jdbc/5.2.12.RELEASE/spring-jdbc-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis-spring/2.0.0/mybatis-spring-2.0.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-starter/2.1.2/mybatis-spring-boot-starter-2.1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-jdbc/2.5.4/spring-boot-starter-jdbc-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/HikariCP/4.0.3/HikariCP-4.0.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jdbc/5.3.9/spring-jdbc-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.1.2/mybatis-spring-boot-autoconfigure-2.1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-boot-starter/3.4.3.2/mybatis-plus-boot-starter-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus/3.4.3.2/mybatis-plus-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-autoconfigure/2.5.4/spring-boot-autoconfigure-2.5.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/cn/hutool/hutool-all/5.3.1/hutool-all-5.3.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.16/lombok-1.18.16.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.20/lombok-1.18.20.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-boot-starter/3.0.0/springfox-boot-starter-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-oas/3.0.0/springfox-oas-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/swagger/core/v3/swagger-annotations/2.1.2/swagger-annotations-2.1.2.jar" enabled="true" runInBatchMode="false"/>
@@ -87,7 +91,7 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spi/3.0.0/springfox-spi-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-schema/3.0.0/springfox-schema-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-core/3.0.0/springfox-core-3.0.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/net/bytebuddy/byte-buddy/1.10.19/byte-buddy-1.10.19.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/net/bytebuddy/byte-buddy/1.10.22/byte-buddy-1.10.22.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spring-web/3.0.0/springfox-spring-web-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/github/classgraph/classgraph/4.8.83/classgraph-4.8.83.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spring-webmvc/3.0.0/springfox-spring-webmvc-3.0.0.jar" enabled="true" runInBatchMode="false"/>
@@ -100,7 +104,37 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/io/swagger/swagger-annotations/1.5.20/swagger-annotations-1.5.20.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-swagger-ui/3.0.0/springfox-swagger-ui-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/plugin/spring-plugin-core/2.0.0.RELEASE/spring-plugin-core-2.0.0.RELEASE.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/plugin/spring-plugin-metadata/2.0.0.RELEASE/spring-plugin-metadata-2.0.0.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-data-redis/2.5.4/spring-boot-starter-data-redis-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter/2.5.4/spring-boot-starter-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot/2.5.4/spring-boot-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-logging/2.5.4/spring-boot-starter-logging-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-classic/1.2.5/logback-classic-1.2.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-core/1.2.5/logback-core-1.2.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-to-slf4j/2.14.1/log4j-to-slf4j-2.14.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.14.1/log4j-api-2.14.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/jul-to-slf4j/1.7.32/jul-to-slf4j-1.7.32.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-redis/2.5.4/spring-data-redis-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-keyvalue/2.5.4/spring-data-keyvalue-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-commons/2.5.4/spring-data-commons-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-tx/5.3.9/spring-tx-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-oxm/5.3.9/spring-oxm-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/lettuce/lettuce-core/6.1.4.RELEASE/lettuce-core-6.1.4.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.67.Final/netty-common-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler/4.1.67.Final/netty-handler-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.67.Final/netty-resolver-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.67.Final/netty-buffer-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.67.Final/netty-codec-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.67.Final/netty-transport-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/projectreactor/reactor-core/3.4.9/reactor-core-3.4.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/integration/spring-integration-redis/5.5.3/spring-integration-redis-5.5.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/integration/spring-integration-core/5.5.3/spring-integration-core-5.5.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-messaging/5.3.9/spring-messaging-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/retry/spring-retry/1.3.1/spring-retry-1.3.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/redis/clients/jedis/3.6.3/jedis-3.6.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar" enabled="true" runInBatchMode="false"/>
 </factorypath>

+ 2 - 10
mp-generator/src/main/java/com/qs/mp/generator/DbGenerator.java

@@ -49,11 +49,11 @@ public class DbGenerator {
      */
     private static final boolean REST_CONTROLLER_STYLE = true;
 
-    public static final String JDBC_MYSQL_URL = "jdbc:mysql://113.31.162.168:3306/ygpdb_test?useUnicode=true&useSSL=false&characterEncoding=utf8";
+    public static final String JDBC_MYSQL_URL = "jdbc:mysql://110.40.236.236:3306/mpdb_test?useUnicode=true&useSSL=false&characterEncoding=utf8";
 
     public static final String JDBC_DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
 
-    public static final String JDBC_USERNAME = "ygptest";
+    public static final String JDBC_USERNAME = "mptest";
 
     public static final String JDBC_PASSWORD = "wan789*@dfhzHu518!dr2xosn";
 
@@ -99,14 +99,6 @@ public class DbGenerator {
                                 moduleName + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
                     }
                 });
-                /*fileOutConfigList.add(new FileOutConfig("templates-generator/controller.java.vm") {
-                    @Override
-                    public String outputFile(TableInfo tableInfo) {
-                        // 自定义输出文件名
-                        return projectPath + "/" + WEB_MODULAR_NAME + SRC_MAIN_JAVA + "com/qs/ygp/"  +
-                                moduleName + "/controller/" + tableInfo.getEntityName() + "Controller" + StringPool.DOT_JAVA;
-                    }
-                });*/
                 setFileOutConfigList(fileOutConfigList);
 
             }

+ 83 - 57
mp-quartz/.factorypath

@@ -1,46 +1,67 @@
 <factorypath>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/quartz-scheduler/quartz/2.3.2/quartz-2.3.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/mchange/mchange-commons-java/0.2.15/mchange-commons-java-0.2.15.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context-support/5.2.12.RELEASE/spring-context-support-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-beans/5.2.12.RELEASE/spring-beans-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context/5.2.12.RELEASE/spring-context-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-expression/5.2.12.RELEASE/spring-expression-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-core/5.2.12.RELEASE/spring-core-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jcl/5.2.12.RELEASE/spring-jcl-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-web/5.2.12.RELEASE/spring-web-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-security/2.2.13.RELEASE/spring-boot-starter-security-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter/2.2.13.RELEASE/spring-boot-starter-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot/2.2.13.RELEASE/spring-boot-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-logging/2.2.13.RELEASE/spring-boot-starter-logging-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-to-slf4j/2.12.1/log4j-to-slf4j-2.12.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context-support/5.3.9/spring-context-support-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-beans/5.3.9/spring-beans-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-context/5.3.9/spring-context-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-expression/5.3.9/spring-expression-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-core/5.3.9/spring-core-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jcl/5.3.9/spring-jcl-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-web/5.3.9/spring-web-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-security/2.5.4/spring-boot-starter-security-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter/2.5.4/spring-boot-starter-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot/2.5.4/spring-boot-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-logging/2.5.4/spring-boot-starter-logging-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-classic/1.2.5/logback-classic-1.2.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/ch/qos/logback/logback-core/1.2.5/logback-core-1.2.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-to-slf4j/2.14.1/log4j-to-slf4j-2.14.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.14.1/log4j-api-2.14.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/jul-to-slf4j/1.7.32/jul-to-slf4j-1.7.32.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-aop/5.2.12.RELEASE/spring-aop-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-config/5.2.8.RELEASE/spring-security-config-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-core/5.2.8.RELEASE/spring-security-core-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-web/5.2.8.RELEASE/spring-security-web-5.2.8.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-aop/5.3.9/spring-aop-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-config/5.5.2/spring-security-config-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-core/5.5.2/spring-security-core-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-crypto/5.5.2/spring-security-crypto-5.5.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/security/spring-security-web/5.5.2/spring-security-web-5.5.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper-spring-boot-starter/1.3.1/pagehelper-spring-boot-starter-1.3.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-starter/2.1.4/mybatis-spring-boot-starter-2.1.4.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.1.4/mybatis-spring-boot-autoconfigure-2.1.4.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis/3.5.6/mybatis-3.5.6.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper-spring-boot-autoconfigure/1.3.1/pagehelper-spring-boot-autoconfigure-1.3.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/pagehelper/pagehelper/5.2.1/pagehelper-5.2.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/jsqlparser/jsqlparser/4.0/jsqlparser-4.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-databind/2.10.5.1/jackson-databind-2.10.5.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-annotations/2.10.5/jackson-annotations-2.10.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-core/2.10.5/jackson-core-2.10.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-databind/2.12.4/jackson-databind-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-annotations/2.12.4/jackson-annotations-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/core/jackson-core/2.12.4/jackson-core-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/dataformat/jackson-dataformat-xml/2.12.4/jackson-dataformat-xml-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.12.4/jackson-module-jaxb-annotations-2.12.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/xml/bind/jakarta.xml.bind-api/2.3.3/jakarta.xml.bind-api-2.3.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/codehaus/woodstox/stax2-api/4.2.1/stax2-api-4.2.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/fasterxml/woodstox/woodstox-core/6.2.4/woodstox-core-6.2.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/alibaba/fastjson/1.2.76/fastjson-1.2.76.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/commons-fileupload/commons-fileupload/1.4/commons-fileupload-1.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/qcloud/cos_api/5.6.54/cos_api-5.6.54.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/httpcomponents/httpcore/4.4.14/httpcore-4.4.14.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/commons-codec/commons-codec/1.15/commons-codec-1.15.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/joda-time/joda-time/2.9.9/joda-time-2.9.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/tencentcloudapi/tencentcloud-sdk-java-kms/3.1.213/tencentcloud-sdk-java-kms-3.1.213.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/tencentcloudapi/tencentcloud-sdk-java-common/3.1.213/tencentcloud-sdk-java-common-3.1.213.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp/logging-interceptor/2.7.5/logging-interceptor-2.7.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/bouncycastle/bcprov-jdk15on/1.64/bcprov-jdk15on-1.64.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/cn/jpush/api/jiguang-common/1.0.8/jiguang-common-1.0.8.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-all/4.1.67.Final/netty-all-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.7/gson-2.8.7.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/cn/jpush/api/jsms-client/1.2.9/jsms-client-1.2.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/net/coobird/thumbnailator/0.4.8/thumbnailator-0.4.8.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/poi/poi-ooxml/4.1.2/poi-ooxml-4.1.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/poi/poi/4.1.2/poi-4.1.2.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/commons-codec/commons-codec/1.13/commons-codec-1.13.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-collections4/4.4/commons-collections4-4.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/SparseBitSet/1.2/SparseBitSet-1.2.jar" enabled="true" runInBatchMode="false"/>
@@ -48,38 +69,43 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/xmlbeans/xmlbeans/3.1.0/xmlbeans-3.1.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-compress/1.19/commons-compress-1.19.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/com/github/virtuald/curvesapi/1.06/curvesapi-1.06.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.28/snakeyaml-1.28.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/jsonwebtoken/jjwt/0.9.1/jjwt-0.9.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-data-redis/2.2.13.RELEASE/spring-boot-starter-data-redis-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-redis/2.2.12.RELEASE/spring-data-redis-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-keyvalue/2.2.12.RELEASE/spring-data-keyvalue-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-commons/2.2.12.RELEASE/spring-data-commons-2.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-tx/5.2.12.RELEASE/spring-tx-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-oxm/5.2.12.RELEASE/spring-oxm-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/lettuce/lettuce-core/5.2.2.RELEASE/lettuce-core-5.2.2.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.58.Final/netty-common-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler/4.1.58.Final/netty-handler-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.58.Final/netty-resolver-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.58.Final/netty-buffer-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.58.Final/netty-codec-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.58.Final/netty-transport-4.1.58.Final.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/io/projectreactor/reactor-core/3.3.13.RELEASE/reactor-core-3.3.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-data-redis/2.5.4/spring-boot-starter-data-redis-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-redis/2.5.4/spring-data-redis-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-keyvalue/2.5.4/spring-data-keyvalue-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/data/spring-data-commons/2.5.4/spring-data-commons-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-tx/5.3.9/spring-tx-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-oxm/5.3.9/spring-oxm-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/lettuce/lettuce-core/6.1.4.RELEASE/lettuce-core-6.1.4.RELEASE.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.67.Final/netty-common-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler/4.1.67.Final/netty-handler-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.67.Final/netty-resolver-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.67.Final/netty-buffer-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.67.Final/netty-codec-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.67.Final/netty-transport-4.1.67.Final.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/io/projectreactor/reactor-core/3.4.9/reactor-core-3.4.9.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-pool2/2.7.0/commons-pool2-2.7.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-pool2/2.9.0/commons-pool2-2.9.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/eu/bitwalker/UserAgentUtils/1.21/UserAgentUtils-1.21.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/squareup/okio/okio/1.17.2/okio-1.17.2.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/javax/servlet/javax.servlet-api/4.0.1/javax.servlet-api-4.0.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-boot-starter/3.3.0/mybatis-plus-boot-starter-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus/3.3.0/mybatis-plus-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-extension/3.3.0/mybatis-plus-extension-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-core/3.3.0/mybatis-plus-core-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-annotation/3.3.0/mybatis-plus-annotation-3.3.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-autoconfigure/2.2.13.RELEASE/spring-boot-autoconfigure-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-jdbc/2.2.13.RELEASE/spring-boot-starter-jdbc-2.2.13.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/HikariCP/3.4.5/HikariCP-3.4.5.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jdbc/5.2.12.RELEASE/spring-jdbc-5.2.12.RELEASE.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis-spring/2.0.0/mybatis-spring-2.0.0.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-starter/2.1.2/mybatis-spring-boot-starter-2.1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-starter-jdbc/2.5.4/spring-boot-starter-jdbc-2.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/zaxxer/HikariCP/4.0.3/HikariCP-4.0.3.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/spring-jdbc/5.3.9/spring-jdbc-5.3.9.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.1.2/mybatis-spring-boot-autoconfigure-2.1.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis/3.5.4/mybatis-3.5.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/mybatis/mybatis-spring/2.0.4/mybatis-spring-2.0.4.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-boot-starter/3.4.3.2/mybatis-plus-boot-starter-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus/3.4.3.2/mybatis-plus-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-extension/3.4.3.2/mybatis-plus-extension-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-core/3.4.3.2/mybatis-plus-core-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/com/baomidou/mybatis-plus-annotation/3.4.3.2/mybatis-plus-annotation-3.4.3.2.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/springframework/boot/spring-boot-autoconfigure/2.5.4/spring-boot-autoconfigure-2.5.4.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/cn/hutool/hutool-all/5.3.1/hutool-all-5.3.1.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.16/lombok-1.18.16.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.20/lombok-1.18.20.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-boot-starter/3.0.0/springfox-boot-starter-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-oas/3.0.0/springfox-oas-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/swagger/core/v3/swagger-annotations/2.1.2/swagger-annotations-2.1.2.jar" enabled="true" runInBatchMode="false"/>
@@ -87,7 +113,7 @@
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spi/3.0.0/springfox-spi-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-schema/3.0.0/springfox-schema-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-core/3.0.0/springfox-core-3.0.0.jar" enabled="true" runInBatchMode="false"/>
-    <factorypathentry kind="VARJAR" id="M2_REPO/net/bytebuddy/byte-buddy/1.10.19/byte-buddy-1.10.19.jar" enabled="true" runInBatchMode="false"/>
+    <factorypathentry kind="VARJAR" id="M2_REPO/net/bytebuddy/byte-buddy/1.10.22/byte-buddy-1.10.22.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spring-web/3.0.0/springfox-spring-web-3.0.0.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/github/classgraph/classgraph/4.8.83/classgraph-4.8.83.jar" enabled="true" runInBatchMode="false"/>
     <factorypathentry kind="VARJAR" id="M2_REPO/io/springfox/springfox-spring-webmvc/3.0.0/springfox-spring-webmvc-3.0.0.jar" enabled="true" runInBatchMode="false"/>

+ 2 - 2
mp-quartz/pom.xml

@@ -32,9 +32,9 @@
         <!-- 通用工具-->
         <dependency>
             <groupId>com.qs.mp</groupId>
-            <artifactId>mp-common</artifactId>
+            <artifactId>mp-service</artifactId>
         </dependency>
 
     </dependencies>
 
-</project>
+</project>

Деякі файли не було показано, через те що забагато файлів було змінено