Преглед изворни кода

Merge branch 'test-user' into develop-pay

* test-user:
  添加公共模块,接口幂等性,去除重复的请求
  修改了收支明细列表搜索规则,修改筛选变动类型接口为获取收益及支出类别接口,新增接口获取类别明细
  广电报备MQ通信已完成
  广电报备排序默认倒序
  每日晨会同步开始时间和结束时间
  训练营版本回退
  切换为rabbitmq,目前已封装完成
  新增了已结束训练营不可再导入人员,修改了校验人员是否参加其他未结束的训练的规则
  新增了 机具回收-可回收机具品牌列表 接口,机具回收-可回收机具列表 新增了品牌搜索条件,返回数据中增加brandId,删除了testMq
  去除rocketmq
  去除rocketmq
  修改了商学院-创客学堂一级分类isUpdate字段childCount字段的返回
  修改了商学院-创客学堂一级分类isUpdate字段childCount字段的返回
  修复了获取协议内容bug,修复了个人消息-消息列表未返回字段bug,新增了商品列表接口,新增了服务中心-服务分类列表接口,新增了服务中心-服务详情接口,修复了市场活动-市场活动列表bug
mac пре 2 година
родитељ
комит
731e8cb737
87 измењених фајлова са 2413 додато и 359 уклоњено
  1. 12 0
      kxs-common/kxs-common-core/pom.xml
  2. 5 0
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/constant/CommonConstants.java
  3. 4 4
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/exception/GlobalBizExceptionHandler.java
  4. 7 0
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/util/SpringContextHolder.java
  5. 29 0
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/NormMonth.java
  6. 40 0
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/impl/NormMonthValidator.java
  7. 3 0
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/impl/PhoneValidator.java
  8. 5 2
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/impl/SnValidator.java
  9. 56 0
      kxs-common/kxs-common-idempotent/pom.xml
  10. 58 0
      kxs-common/kxs-common-idempotent/src/main/java/com/kxs/common/idempotent/IdempotentAutoConfiguration.java
  11. 51 0
      kxs-common/kxs-common-idempotent/src/main/java/com/kxs/common/idempotent/annotation/Idempotent.java
  12. 142 0
      kxs-common/kxs-common-idempotent/src/main/java/com/kxs/common/idempotent/aspect/IdempotentAspect.java
  13. 33 0
      kxs-common/kxs-common-idempotent/src/main/java/com/kxs/common/idempotent/exception/IdempotentException.java
  14. 66 0
      kxs-common/kxs-common-idempotent/src/main/java/com/kxs/common/idempotent/expression/ExpressionResolver.java
  15. 23 0
      kxs-common/kxs-common-idempotent/src/main/java/com/kxs/common/idempotent/expression/KeyResolver.java
  16. 1 0
      kxs-common/kxs-common-idempotent/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  17. 6 2
      kxs-common/kxs-common-mq/pom.xml
  18. 143 0
      kxs-common/kxs-common-mq/src/main/java/com/kxs/common/mq/config/RabbitConfiguration.java
  19. 79 0
      kxs-common/kxs-common-mq/src/main/java/com/kxs/common/mq/config/RabbitMQBeanProcessor.java
  20. 18 0
      kxs-common/kxs-common-mq/src/main/java/com/kxs/common/mq/enums/MQSendTypeEnum.java
  21. 21 0
      kxs-common/kxs-common-mq/src/main/java/com/kxs/common/mq/handlers/IMQSender.java
  22. 49 0
      kxs-common/kxs-common-mq/src/main/java/com/kxs/common/mq/handlers/rabbit/RabbitMQSender.java
  23. 34 0
      kxs-common/kxs-common-mq/src/main/java/com/kxs/common/mq/model/AbstractMQ.java
  24. 3 1
      kxs-common/kxs-common-mq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  25. 12 0
      kxs-common/kxs-common-mybatis/pom.xml
  26. 12 0
      kxs-common/kxs-common-oss/pom.xml
  27. 12 0
      kxs-common/kxs-common-security/pom.xml
  28. 1 0
      kxs-common/pom.xml
  29. 8 0
      kxs-gateway/pom.xml
  30. 4 0
      kxs-product/kxs-product-api/pom.xml
  31. 166 0
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/amqp/rabbit/RabbitGdActQueueMQ.java
  32. 1 1
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/model/KxsMachine.java
  33. 5 2
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/vo/kxsapp/machine/MachineRecycleListVO.java
  34. 12 0
      kxs-product/kxs-product-biz/pom.xml
  35. 6 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/controller/admin/SysGdController.java
  36. 11 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/controller/kxsapp/MachineController.java
  37. 8 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/mapper/KxsMachineMapper.java
  38. 0 9
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/KxsGdService.java
  39. 7 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/KxsMachineService.java
  40. 22 14
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsGdServiceImpl.java
  41. 7 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsMachineServiceImpl.java
  42. 1 0
      kxs-product/kxs-product-biz/src/main/resources/mapper/KxsGdReportMapper.xml
  43. 17 2
      kxs-product/kxs-product-biz/src/main/resources/mapper/KxsMachineMapper.xml
  44. 1 1
      kxs-product/kxs-product-biz/src/main/resources/mapper/KxsShopGoodsMapper.xml
  45. 8 0
      kxs-store/kxs-store-biz/pom.xml
  46. 4 0
      kxs-system/kxs-system-api/pom.xml
  47. 119 0
      kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/amqp/rabbit/RabbitOrderQueueMQ.java
  48. 9 0
      kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/RecycleBrandListVO.java
  49. 108 0
      kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/school/SchoolFirstMenuVO.java
  50. 102 0
      kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/school/SchoolListVO.java
  51. 66 0
      kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/serviceCenter/ServiceCenterGetByIdVO.java
  52. 45 0
      kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/serviceCenter/ServiceCenterListVO.java
  53. 52 0
      kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/serviceCenter/ServiceCenterMenuListVO.java
  54. 8 4
      kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/userMsg/UserMsgPageVO.java
  55. 8 0
      kxs-system/kxs-system-biz/pom.xml
  56. 87 0
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/amqp/rabbit/RabbitOrderQueueListener.java
  57. 2 4
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/controller/kxsapp/MorningController.java
  58. 2 3
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/controller/kxsapp/SchoolController.java
  59. 77 0
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/controller/kxsapp/ServiceCenterController.java
  60. 4 0
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/mapper/KxsCampMapper.java
  61. 5 0
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/mapper/KxsServiceCenterMapper.java
  62. 2 1
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/KxsCampService.java
  63. 2 0
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/KxsSchoolMenuService.java
  64. 3 0
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/KxsSchoolStudyService.java
  65. 4 0
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/KxsServiceCenterService.java
  66. 245 207
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/impl/KxsCampServiceImpl.java
  67. 40 1
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/impl/KxsSchoolMenuServiceImpl.java
  68. 31 0
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/impl/KxsSchoolStudyServiceImpl.java
  69. 10 1
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/impl/KxsServiceCenterServiceImpl.java
  70. 1 1
      kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/task/KxsSystemTask.java
  71. 1 1
      kxs-system/kxs-system-biz/src/main/resources/mapper/KxsActivityMarketMapper.xml
  72. 30 0
      kxs-system/kxs-system-biz/src/main/resources/mapper/KxsCampMapper.xml
  73. 3 0
      kxs-system/kxs-system-biz/src/main/resources/mapper/KxsServiceCenterMapper.xml
  74. 1 1
      kxs-system/kxs-system-biz/src/main/resources/mapper/KxsUserMsgMapper.xml
  75. 8 0
      kxs-transfer/src/main/java/com/kxs/transfer/api/service/sys/impl/KxsMorningServiceImpl.java
  76. 16 9
      kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/dto/kxsapp/userAccount/UserAmountVariationListDTO.java
  77. 5 1
      kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/vo/kxsapp/userAccount/UserAmountVariationListVO.java
  78. 11 0
      kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/vo/kxsapp/userAccount/VariationListVO.java
  79. 3 3
      kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/vo/kxsapp/userAccount/VariationTypeListVO.java
  80. 8 5
      kxs-user/kxs-user-biz/pom.xml
  81. 0 42
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/controller/kxsapp/TestMq.java
  82. 13 4
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/controller/kxsapp/UserAccountController.java
  83. 9 2
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/mapper/KxsUserAmountLogMapper.java
  84. 2 0
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/KxsUserAmountLogService.java
  85. 15 22
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/impl/KxsUserAmountLogServiceImpl.java
  86. 38 9
      kxs-user/kxs-user-biz/src/main/resources/mapper/KxsUserAmountLogMapper.xml
  87. 5 0
      pom.xml

+ 12 - 0
kxs-common/kxs-common-core/pom.xml

@@ -71,4 +71,16 @@
             <scope>provided</scope>
         </dependency>
     </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>14</source>
+                    <target>14</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>

+ 5 - 0
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/constant/CommonConstants.java

@@ -54,6 +54,11 @@ public interface CommonConstants {
 	 */
 	String BACK_END_PROJECT = "kxs";
 
+	/**
+	 * 包名
+	 */
+	String PACKAGE_NAME = "com.kxs";
+
 	/**
 	 * 成功标记
 	 */

+ 4 - 4
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/exception/GlobalBizExceptionHandler.java

@@ -140,13 +140,13 @@ public class GlobalBizExceptionHandler {
 
 	/**
 	 * 自定义异常
-	 * @param e 错误类型
+	 * @param exception 错误类型
 	 * @return {@link R}
 	 */
 	@ExceptionHandler(GlobalCustomerException.class)
-	public R handlerCustomException(GlobalCustomerException e){
-
-		return R.failed(e.getMessage());
+	public R handlerCustomException(GlobalCustomerException exception){
+		log.info("自定义异常:{}", exception.getMessage());
+		return R.failed(exception.getMessage());
 	}
 
 	/**

+ 7 - 0
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/util/SpringContextHolder.java

@@ -52,6 +52,13 @@ public class SpringContextHolder implements ApplicationContextAware, DisposableB
 		return applicationContext.getBean(requiredType);
 	}
 
+	/**
+	 * 通过name,以及Clazz返回指定的Bean
+	 */
+	public static <T> T getBean(String name, Class<T> clazz){
+		return applicationContext.getBean(name, clazz);
+	}
+
 	/**
 	 * 清除SpringContextHolder中的ApplicationContext为Null.
 	 */

+ 29 - 0
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/NormMonth.java

@@ -0,0 +1,29 @@
+package com.kxs.common.core.valid;
+
+import com.kxs.common.core.valid.impl.NormMonthValidator;
+import com.kxs.common.core.valid.impl.PhoneValidator;
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
+
+import java.lang.annotation.*;
+
+/**
+ * 时间格式校验标准月份yyyy-MM
+ * @author Pota1ovO
+ */
+@Target({ElementType.FIELD,ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Constraint(validatedBy = {NormMonthValidator.class})// 指定约束处理器,也就是时间格式验证是哪个类来做校验
+public @interface NormMonth {
+
+    String pattern() default "^\\d{4}-(0[1-9]|1[0-2])$";
+
+    String message() default "时间格式错误yyyy-MM";
+
+    Class<?>[] groups() default { }; // groups用来指定分组,可以让校验采取不同的机制,当前默认未指定任何分组机制,默认每次都要进行校验
+
+    Class<? extends Payload>[] payload() default { };
+
+
+}

+ 40 - 0
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/impl/NormMonthValidator.java

@@ -0,0 +1,40 @@
+package com.kxs.common.core.valid.impl;
+
+import com.kxs.common.core.valid.NormMonth;
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 校验处理器:做时间格式验证的核心类
+ *
+ * @author Pota1ovO
+ * @date 2024-04-26
+ */
+public class NormMonthValidator implements ConstraintValidator<NormMonth, String> {
+
+    // 注解对象
+    private NormMonth normMonth;
+
+    // 初始化【NormMonth】对象
+    @Override
+    public void initialize(NormMonth constraintAnnotation) {
+        normMonth = constraintAnnotation;
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (value == null || value.equals("")){
+            return false;
+        }
+        // 获取【Phone】对象的手机格式验证表达式
+        String pattern = normMonth.pattern();
+        Pattern compile = Pattern.compile(pattern);
+        Matcher matcher = compile.matcher(value);
+        return matcher.matches();
+    }
+}
+

+ 3 - 0
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/impl/PhoneValidator.java

@@ -26,6 +26,9 @@ public class PhoneValidator implements ConstraintValidator<Phone, String> {
 
     @Override
     public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (value == null || value.equals("")){
+            return false;
+        }
         // 获取【Phone】对象的手机格式验证表达式
         String pattern = phone.pattern();
         Pattern compile = Pattern.compile(pattern);

+ 5 - 2
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/valid/impl/SnValidator.java

@@ -18,7 +18,7 @@ public class SnValidator implements ConstraintValidator<Sn, String> {
     // 注解对象
     private Sn sn;
 
-    // 初始化【Phone】对象
+    // 初始化【sn】对象
     @Override
     public void initialize(Sn constraintAnnotation) {
         sn = constraintAnnotation;
@@ -26,7 +26,10 @@ public class SnValidator implements ConstraintValidator<Sn, String> {
 
     @Override
     public boolean isValid(String value, ConstraintValidatorContext context) {
-        // 获取【Phone】对象的手机格式验证表达式
+        if (value == null || value.equals("")){
+            return false;
+        }
+        // 获取【sn】对象的手机格式验证表达式
         String pattern = sn.pattern();
         Pattern compile = Pattern.compile(pattern);
         Matcher matcher = compile.matcher(value);

+ 56 - 0
kxs-common/kxs-common-idempotent/pom.xml

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.kxs</groupId>
+        <artifactId>kxs-common</artifactId>
+        <version>1.1.0</version>
+    </parent>
+
+    <artifactId>kxs-common-idempotent</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <mica.version>3.0.0</mica.version>
+<!--        <redisson.version>3.24.3</redisson.version>-->
+        <redisson.version>3.16.2</redisson.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!--aop-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <!--redisson-->
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson-spring-boot-starter</artifactId>
+            <version>${redisson.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>net.dreamlu</groupId>
+            <artifactId>mica-auto</artifactId>
+            <version>${mica.version}</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>

+ 58 - 0
kxs-common/kxs-common-idempotent/src/main/java/com/kxs/common/idempotent/IdempotentAutoConfiguration.java

@@ -0,0 +1,58 @@
+package com.kxs.common.idempotent;
+
+import com.kxs.common.idempotent.aspect.IdempotentAspect;
+import com.kxs.common.idempotent.expression.ExpressionResolver;
+import com.kxs.common.idempotent.expression.KeyResolver;
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author lengleng
+ * @date 2020/9/25
+ * <p>
+ * 幂等插件初始化
+ */
+@AutoConfiguration
+@Configuration(proxyBeanMethods = false)
+@AutoConfigureAfter(RedisAutoConfiguration.class)
+public class IdempotentAutoConfiguration {
+
+	@Value("${spring.data.redis.host}")
+	private String host;
+
+	/**
+	 * 切面 拦截处理所有 @Idempotent
+	 * @return Aspect
+	 */
+	@Bean
+	public IdempotentAspect idempotentAspect() {
+		return new IdempotentAspect();
+	}
+
+	/**
+	 * key 解析器
+	 * @return KeyResolver
+	 */
+	@Bean
+	@ConditionalOnMissingBean(KeyResolver.class)
+	public KeyResolver keyResolver() {
+		return new ExpressionResolver();
+	}
+
+	@Bean
+	@ConditionalOnMissingBean
+	public RedissonClient redissonClient() {
+		Config config = new Config();
+		config.useSingleServer().setAddress("redis://"+host+":6379");
+		return Redisson.create(config);
+	}
+
+}

+ 51 - 0
kxs-common/kxs-common-idempotent/src/main/java/com/kxs/common/idempotent/annotation/Idempotent.java

@@ -0,0 +1,51 @@
+package com.kxs.common.idempotent.annotation;
+
+import java.lang.annotation.*;
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * 接口幂等
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-26
+ */
+@Inherited
+@Target(ElementType.METHOD)
+@Retention(value = RetentionPolicy.RUNTIME)
+public @interface Idempotent {
+
+	/**
+	 * <p>
+	 * 如果是实体类的话,默认拦截不会生效. objects.toString()会返回不同地址.
+	 * </p>
+	 * 幂等操作的唯一标识,使用spring el表达式 用#来引用方法参数
+	 * @return Spring-EL expression
+	 */
+	String key() default "";
+
+	/**
+	 * 有效期 默认:1 有效期要大于程序执行时间,否则请求还是可能会进来
+	 * @return expireTime
+	 */
+	int expireTime() default 1;
+
+	/**
+	 * 时间单位 默认:s
+	 * @return TimeUnit
+	 */
+	TimeUnit timeUnit() default TimeUnit.SECONDS;
+
+	/**
+	 * 提示信息,可自定义
+	 * @return String
+	 */
+	String info() default "重复请求,请稍后重试";
+
+	/**
+	 * 是否在业务完成后删除key true:删除 false:不删除
+	 * @return boolean
+	 */
+	boolean delKey() default false;
+
+}

+ 142 - 0
kxs-common/kxs-common-idempotent/src/main/java/com/kxs/common/idempotent/aspect/IdempotentAspect.java

@@ -0,0 +1,142 @@
+package com.kxs.common.idempotent.aspect;
+
+import com.kxs.common.core.exception.GlobalCustomerException;
+import com.kxs.common.idempotent.annotation.Idempotent;
+import com.kxs.common.idempotent.exception.IdempotentException;
+import com.kxs.common.idempotent.expression.KeyResolver;
+import jakarta.servlet.http.HttpServletRequest;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.redisson.api.RMapCache;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.lang.reflect.Method;
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * The Idempotent Aspect
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-26
+ */
+@Aspect
+public class IdempotentAspect {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(IdempotentAspect.class);
+
+	private static final ThreadLocal<Map<String, Object>> THREAD_CACHE = ThreadLocal.withInitial(HashMap::new);
+
+	private static final String RMAPCACHE_KEY = "idempotent";
+
+	private static final String KEY = "key";
+
+	private static final String DELKEY = "delKey";
+
+	@Autowired
+	private RedissonClient redissonClient;
+
+	@Autowired
+	private KeyResolver keyResolver;
+
+	@Pointcut("@annotation(com.kxs.common.idempotent.annotation.Idempotent)")
+	public void pointCut() {
+	}
+
+	@Before("pointCut()")
+	public void beforePointCut(JoinPoint joinPoint) {
+		ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
+				.getRequestAttributes();
+		HttpServletRequest request = requestAttributes.getRequest();
+
+		MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+		Method method = signature.getMethod();
+		if (!method.isAnnotationPresent(Idempotent.class)) {
+			return;
+		}
+		Idempotent idempotent = method.getAnnotation(Idempotent.class);
+
+		String key;
+
+		// 若没有配置 幂等 标识编号,则使用 url + 参数列表作为区分
+		if (!StringUtils.hasLength(idempotent.key())) {
+			String url = request.getRequestURL().toString();
+			String argString = Arrays.asList(joinPoint.getArgs()).toString();
+			key = url + argString;
+		}
+		else {
+			// 使用jstl 规则区分
+			key = keyResolver.resolver(idempotent, joinPoint);
+		}
+		// 当配置了el表达式但是所选字段为空时,会抛出异常,兜底使用url做标识
+		if (key == null) {
+			key = request.getRequestURL().toString();
+		}
+
+		long expireTime = idempotent.expireTime();
+		String info = idempotent.info();
+		TimeUnit timeUnit = idempotent.timeUnit();
+		boolean delKey = idempotent.delKey();
+
+		// do not need check null
+		RMapCache<String, Object> rMapCache = redissonClient.getMapCache(RMAPCACHE_KEY);
+		String value = LocalDateTime.now().toString().replace("T", " ");
+		Object v1;
+		if (null != rMapCache.get(key)) {
+			// 自定义异常
+			throw new GlobalCustomerException(info);
+		}
+		synchronized (this) {
+			v1 = rMapCache.putIfAbsent(key, value, expireTime, timeUnit);
+			if (null != v1) {
+				throw new IdempotentException(info);
+			}
+			else {
+				LOGGER.info("[idempotent]:has stored key={},value={},expireTime={}{},now={}", key, value, expireTime,
+						timeUnit, LocalDateTime.now().toString());
+			}
+		}
+
+		Map<String, Object> map = THREAD_CACHE.get();
+		map.put(KEY, key);
+		map.put(DELKEY, delKey);
+	}
+
+	@After("pointCut()")
+	public void afterPointCut(JoinPoint joinPoint) {
+		Map<String, Object> map = THREAD_CACHE.get();
+		if (CollectionUtils.isEmpty(map)) {
+			return;
+		}
+
+		RMapCache<Object, Object> mapCache = redissonClient.getMapCache(RMAPCACHE_KEY);
+		if (mapCache.size() == 0) {
+			return;
+		}
+
+		String key = map.get(KEY).toString();
+		boolean delKey = (boolean) map.get(DELKEY);
+
+		if (delKey) {
+			mapCache.fastRemove(key);
+			LOGGER.info("[idempotent]:has removed key={}", key);
+		}
+		THREAD_CACHE.remove();
+	}
+
+}

+ 33 - 0
kxs-common/kxs-common-idempotent/src/main/java/com/kxs/common/idempotent/exception/IdempotentException.java

@@ -0,0 +1,33 @@
+package com.kxs.common.idempotent.exception;
+
+
+/**
+ * 幂等异常
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-26
+ */
+public class IdempotentException extends RuntimeException {
+
+	public IdempotentException() {
+		super();
+	}
+
+	public IdempotentException(String message) {
+		super(message);
+	}
+
+	public IdempotentException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+	public IdempotentException(Throwable cause) {
+		super(cause);
+	}
+
+	protected IdempotentException(String message, Throwable cause, boolean enableSuppression,
+			boolean writableStackTrace) {
+		super(message, cause, enableSuppression, writableStackTrace);
+	}
+
+}

+ 66 - 0
kxs-common/kxs-common-idempotent/src/main/java/com/kxs/common/idempotent/expression/ExpressionResolver.java

@@ -0,0 +1,66 @@
+package com.kxs.common.idempotent.expression;
+
+
+
+import com.kxs.common.idempotent.annotation.Idempotent;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.core.DefaultParameterNameDiscoverer;
+import org.springframework.core.ParameterNameDiscoverer;
+import org.springframework.expression.Expression;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+
+import java.lang.reflect.Method;
+
+
+/**
+ * <p>
+ * 默认key 抽取, 优先根据 spel 处理
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-26
+ */
+public class ExpressionResolver implements KeyResolver {
+
+	private static final SpelExpressionParser PARSER = new SpelExpressionParser();
+
+	private static final ParameterNameDiscoverer DISCOVERER = new DefaultParameterNameDiscoverer();
+
+	@Override
+	public String resolver(Idempotent idempotent, JoinPoint point) {
+		Object[] arguments = point.getArgs();
+		String[] params = DISCOVERER.getParameterNames(getMethod(point));
+		StandardEvaluationContext context = new StandardEvaluationContext();
+
+		if (params != null && params.length > 0) {
+			for (int len = 0; len < params.length; len++) {
+				context.setVariable(params[len], arguments[len]);
+			}
+		}
+
+		Expression expression = PARSER.parseExpression(idempotent.key());
+		return expression.getValue(context, String.class);
+	}
+
+	/**
+	 * 根据切点解析方法信息
+	 * @param joinPoint 切点信息
+	 * @return Method 原信息
+	 */
+	private Method getMethod(JoinPoint joinPoint) {
+		MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+		Method method = signature.getMethod();
+		if (method.getDeclaringClass().isInterface()) {
+			try {
+				method = joinPoint.getTarget().getClass().getDeclaredMethod(joinPoint.getSignature().getName(),
+						method.getParameterTypes());
+			}
+			catch (SecurityException | NoSuchMethodException e) {
+				throw new RuntimeException(e);
+			}
+		}
+		return method;
+	}
+
+}

+ 23 - 0
kxs-common/kxs-common-idempotent/src/main/java/com/kxs/common/idempotent/expression/KeyResolver.java

@@ -0,0 +1,23 @@
+package com.kxs.common.idempotent.expression;
+
+import com.kxs.common.idempotent.annotation.Idempotent;
+import org.aspectj.lang.JoinPoint;
+
+
+/**
+ * 唯一标志处理器
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-26
+ */
+public interface KeyResolver {
+
+	/**
+	 * 解析处理 key
+	 * @param idempotent 接口注解标识
+	 * @param point 接口切点信息
+	 * @return 处理结果
+	 */
+	String resolver(Idempotent idempotent, JoinPoint point);
+
+}

+ 1 - 0
kxs-common/kxs-common-idempotent/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -0,0 +1 @@
+com.kxs.common.idempotent.IdempotentAutoConfiguration

+ 6 - 2
kxs-common/kxs-common-mq/pom.xml

@@ -19,8 +19,12 @@
     </properties>
     <dependencies>
         <dependency>
-            <groupId>org.apache.rocketmq</groupId>
-            <artifactId>rocketmq-spring-boot-starter</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-core</artifactId>
         </dependency>
     </dependencies>
 </project>

+ 143 - 0
kxs-common/kxs-common-mq/src/main/java/com/kxs/common/mq/config/RabbitConfiguration.java

@@ -0,0 +1,143 @@
+package com.kxs.common.mq.config;
+
+import cn.hutool.core.util.ClassUtil;
+import cn.hutool.core.util.ReflectUtil;
+import com.kxs.common.core.constant.CommonConstants;
+import com.kxs.common.core.util.SpringContextHolder;
+import com.kxs.common.mq.enums.MQSendTypeEnum;
+import com.kxs.common.mq.model.AbstractMQ;
+import jakarta.annotation.PostConstruct;
+import org.springframework.amqp.core.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.stereotype.Component;
+
+import java.util.Objects;
+import java.util.Set;
+
+
+/**
+ * rabbitmq队列配置
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-24
+ */
+@Component
+public class RabbitConfiguration {
+
+	@Autowired
+	private RabbitMQBeanProcessor rabbitMqBeanProcessor;
+
+	public static final String BIND_PREFIX = "BIND_";
+
+	/**
+	 * 普通交换机
+	 */
+	public static final String EXCHANGE_TOPIC_RANCH ="kxs_direct_ranch";
+
+	/**
+	 * 死信交换机
+	 */
+	public static final String EXCHANGE_DEAD_RANCH ="kxs_dead_ranch";
+
+	/**
+	 * 广播交换机
+	 */
+	public static final String EXCHANGE_FANOUT_RANCH ="kxs_fanout_ranch";
+
+	/**
+	 * 延时交换机
+	 */
+	public static final String EXCHANGE_DELAY_RANCH="kxs_delay_ranch";
+
+	/** 注入延迟交换机Bean **/
+	@Autowired
+	@Qualifier(EXCHANGE_TOPIC_RANCH)
+	private DirectExchange directExchange;
+
+	/** 注入延迟交换机Bean **/
+	@Autowired
+	@Qualifier(EXCHANGE_FANOUT_RANCH)
+	private FanoutExchange fanoutExchange;
+
+	/** 注入延迟交换机Bean **/
+	@Autowired
+	@Qualifier(EXCHANGE_DELAY_RANCH)
+	private CustomExchange delayedExchange;
+
+	/** 死信交换机 **/
+	@Autowired
+	@Qualifier(EXCHANGE_DEAD_RANCH)
+	private DirectExchange deadExchange;
+
+
+	@PostConstruct
+	public void init(){
+
+		// 获取到所有的MQ定义
+		Set<Class<?>> set = ClassUtil.scanPackageBySuper(CommonConstants.PACKAGE_NAME, AbstractMQ.class);
+
+		for (Class<?> aClass : set) {
+			// 实例化
+			AbstractMQ amq = (AbstractMQ) ReflectUtil.newInstance(aClass);
+
+			// 注册正常Queue 需判断是否有死信队列
+			if(amq.getDeadQueueName() != null){
+				rabbitMqBeanProcessor.beanDefinitionRegistry.registerBeanDefinition(amq.getQueueName(),
+						BeanDefinitionBuilder.genericBeanDefinition(Queue.class, () ->
+								QueueBuilder.durable(amq.getQueueName()).deadLetterExchange(EXCHANGE_DEAD_RANCH)
+										.deadLetterRoutingKey(amq.getDeadQueueName()).build()
+						).getBeanDefinition());
+				//  注册死信队列
+				rabbitMqBeanProcessor.beanDefinitionRegistry.registerBeanDefinition(amq.getDeadQueueName(),
+						BeanDefinitionBuilder.rootBeanDefinition(Queue.class).addConstructorArgValue(amq.getDeadQueueName()).getBeanDefinition());
+
+				//死信队列绑定死信交换机
+				rabbitMqBeanProcessor.beanDefinitionRegistry.registerBeanDefinition(BIND_PREFIX + amq.getDeadQueueName(),
+						BeanDefinitionBuilder.genericBeanDefinition(Binding.class, () ->
+								BindingBuilder.bind(SpringContextHolder.getBean( amq.getDeadQueueName(), Queue.class))
+										.to(deadExchange).with(amq.getDeadQueueName())
+						).getBeanDefinition()
+				);
+			}else{
+				rabbitMqBeanProcessor.beanDefinitionRegistry.registerBeanDefinition(amq.getQueueName(),
+						BeanDefinitionBuilder.genericBeanDefinition(Queue.class, () ->
+								QueueBuilder.durable(amq.getQueueName()).build()
+						).getBeanDefinition());
+			}
+
+			//普通队列
+			if(amq.getMqType() == MQSendTypeEnum.QUEUE){
+				rabbitMqBeanProcessor.beanDefinitionRegistry.registerBeanDefinition(BIND_PREFIX + amq.getQueueName(),
+						BeanDefinitionBuilder.genericBeanDefinition(Binding.class, () ->
+								BindingBuilder.bind(SpringContextHolder.getBean(amq.getQueueName(), Queue.class))
+										.to(directExchange).with(amq.getQueueName())
+						).getBeanDefinition()
+				);
+			}
+			// 广播模式
+			if(amq.getMqType() == MQSendTypeEnum.FANOUT){
+				rabbitMqBeanProcessor.beanDefinitionRegistry.registerBeanDefinition(BIND_PREFIX + amq.getQueueName(),
+						BeanDefinitionBuilder.genericBeanDefinition(Binding.class, () ->
+								BindingBuilder.bind(Objects.requireNonNull(SpringContextHolder.getBean(amq.getQueueName(), Queue.class)))
+										.to(fanoutExchange)
+						).getBeanDefinition()
+				);
+			}
+			//延迟队列
+			if(amq.getMqType()== MQSendTypeEnum.DELAY){
+				// 延迟交换机与Queue进行绑定, 绑定Bean名称 = mqName_DelayedBind
+				rabbitMqBeanProcessor.beanDefinitionRegistry.registerBeanDefinition(BIND_PREFIX + amq.getQueueName() + "_delayed",
+						BeanDefinitionBuilder.genericBeanDefinition(Binding.class, () ->
+								BindingBuilder.bind(Objects.requireNonNull(SpringContextHolder.getBean(amq.getQueueName(), Queue.class)))
+										.to(delayedExchange).with(amq.getQueueName()).noargs()
+
+						).getBeanDefinition()
+				);
+			}
+
+		}
+	}
+
+}

+ 79 - 0
kxs-common/kxs-common-mq/src/main/java/com/kxs/common/mq/config/RabbitMQBeanProcessor.java

@@ -0,0 +1,79 @@
+package com.kxs.common.mq.config;
+
+import org.springframework.amqp.core.*;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ *   将spring容器的 [bean注册器]放置到属性中,为 RabbitConfig提供访问。
+ *   顺序:
+ *   1. postProcessBeanDefinitionRegistry (存放注册器)
+ *   2. postProcessBeanFactory (没有使用)
+ *   3. 注册延迟消息交换机的bean: delayedExchange
+ *   4. 动态配置RabbitMQ所需的bean。
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-25
+ */
+@Configuration
+public class RabbitMQBeanProcessor implements BeanDefinitionRegistryPostProcessor {
+
+    /** bean注册器 **/
+    protected BeanDefinitionRegistry beanDefinitionRegistry;
+
+    @Override
+    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
+        this.beanDefinitionRegistry = beanDefinitionRegistry;
+    }
+
+    @Override
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
+    }
+
+
+
+    /**
+     *  普通交换机
+     */
+    @Bean(name = RabbitConfiguration.EXCHANGE_TOPIC_RANCH)
+    DirectExchange directExchange(){
+
+        return new DirectExchange(RabbitConfiguration.EXCHANGE_TOPIC_RANCH,true,false);
+    }
+
+    /**
+     *  死信交换机
+     */
+    @Bean(name = RabbitConfiguration.EXCHANGE_DEAD_RANCH)
+    DirectExchange deadExchange(){
+
+        return new DirectExchange(RabbitConfiguration.EXCHANGE_DEAD_RANCH,true,false);
+    }
+
+    /**
+     * 广播交换机
+     */
+    @Bean(name = RabbitConfiguration.EXCHANGE_FANOUT_RANCH)
+    FanoutExchange fanoutExchange(){
+        return new FanoutExchange(RabbitConfiguration.EXCHANGE_FANOUT_RANCH, true, false);
+    }
+
+    /**
+     * 延时交换机
+     */
+    @Bean(name = RabbitConfiguration.EXCHANGE_DELAY_RANCH)
+    CustomExchange delayExchange(){
+        Map<String, Object> args = new HashMap<>();
+        args.put("x-delayed-type", "direct");
+        return new CustomExchange(RabbitConfiguration.EXCHANGE_DELAY_RANCH,"x-delayed-message",true, false, args);
+    }
+}

+ 18 - 0
kxs-common/kxs-common-mq/src/main/java/com/kxs/common/mq/enums/MQSendTypeEnum.java

@@ -0,0 +1,18 @@
+
+package com.kxs.common.mq.enums;
+
+
+/**
+ * 定义MQ消息类型
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-25
+ */
+public enum MQSendTypeEnum {
+    /** QUEUE - 点对点 (只有1个消费者可消费。 ActiveMQ的queue模式 ) **/
+    QUEUE,
+    /** 广播模式 **/
+    FANOUT,
+    /** 延时消息 **/
+    DELAY
+}

+ 21 - 0
kxs-common/kxs-common-mq/src/main/java/com/kxs/common/mq/handlers/IMQSender.java

@@ -0,0 +1,21 @@
+package com.kxs.common.mq.handlers;
+
+
+import com.kxs.common.mq.model.AbstractMQ;
+
+
+/**
+ * MQ 消息发送器 接口定义
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-25
+ */
+public interface IMQSender {
+
+    /** 推送MQ消息, 实时 **/
+    void send(AbstractMQ mqModel);
+
+    /** 推送MQ消息, 延迟接收,单位:s **/
+    void send(AbstractMQ mqModel, int delay);
+
+}

+ 49 - 0
kxs-common/kxs-common-mq/src/main/java/com/kxs/common/mq/handlers/rabbit/RabbitMQSender.java

@@ -0,0 +1,49 @@
+package com.kxs.common.mq.handlers.rabbit;
+
+import com.kxs.common.mq.config.RabbitConfiguration;
+import com.kxs.common.mq.enums.MQSendTypeEnum;
+import com.kxs.common.mq.handlers.IMQSender;
+import com.kxs.common.mq.model.AbstractMQ;
+import lombok.RequiredArgsConstructor;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.stereotype.Component;
+
+/**
+ * rabbitMQ 消息发送器的实现
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-25
+ */
+@Component
+@RequiredArgsConstructor
+public class RabbitMQSender implements IMQSender {
+
+    private final RabbitTemplate rabbitTemplate;
+
+    @Override
+    public void send(AbstractMQ mqModel) {
+
+        if(mqModel.getMqType() == MQSendTypeEnum.QUEUE){
+
+            rabbitTemplate.convertAndSend(mqModel.getQueueName(), mqModel.toMessage());
+        }
+        if(mqModel.getMqType() == MQSendTypeEnum.FANOUT){
+
+            rabbitTemplate.convertAndSend(RabbitConfiguration.EXCHANGE_FANOUT_RANCH + mqModel.getQueueName(), mqModel.getQueueName() + "_ROUTE", mqModel.toMessage());
+        }
+
+    }
+
+    @Override
+    public void send(AbstractMQ mqModel, int delay) {
+
+        if(mqModel.getMqType() == MQSendTypeEnum.DELAY){
+
+            rabbitTemplate.convertAndSend(RabbitConfiguration.EXCHANGE_DELAY_RANCH, mqModel.getQueueName(), mqModel.toMessage(), messagePostProcessor ->{
+                messagePostProcessor.getMessageProperties().setDelay(Math.toIntExact(delay * 1000L));
+                return messagePostProcessor;
+            });
+        }
+    }
+
+}

+ 34 - 0
kxs-common/kxs-common-mq/src/main/java/com/kxs/common/mq/model/AbstractMQ.java

@@ -0,0 +1,34 @@
+package com.kxs.common.mq.model;
+
+import com.kxs.common.mq.enums.MQSendTypeEnum;
+import org.springframework.amqp.core.Message;
+
+/**
+ * 全局顶级 MQ队列配置
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-25
+ */
+public abstract class AbstractMQ {
+
+
+    /**
+     * MQ队列名称
+     */
+    public abstract String getQueueName();
+
+    /**
+     * MQ死信队列名称
+     */
+    public abstract String getDeadQueueName();
+
+    /**
+     * MQ 类型
+     */
+    public abstract MQSendTypeEnum getMqType();
+
+    /**
+     * 构造MQ消息体 String类型
+     */
+    public abstract Message toMessage();
+}

+ 3 - 1
kxs-common/kxs-common-mq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -1 +1,3 @@
-org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration
+com.kxs.common.mq.config.RabbitConfiguration
+com.kxs.common.mq.config.RabbitMQBeanProcessor
+com.kxs.common.mq.handlers.rabbit.RabbitMQSender

+ 12 - 0
kxs-common/kxs-common-mybatis/pom.xml

@@ -60,4 +60,16 @@
             <artifactId>kxs-common-core</artifactId>
         </dependency>
     </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>16</source>
+                    <target>16</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>

+ 12 - 0
kxs-common/kxs-common-oss/pom.xml

@@ -29,4 +29,16 @@
             <artifactId>aliyun-sdk-oss</artifactId>
         </dependency>
     </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>14</source>
+                    <target>14</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>

+ 12 - 0
kxs-common/kxs-common-security/pom.xml

@@ -62,4 +62,16 @@
             <artifactId>kxs-user-api</artifactId>
         </dependency>
     </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>16</source>
+                    <target>16</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>

+ 1 - 0
kxs-common/pom.xml

@@ -26,6 +26,7 @@
         <module>kxs-common-oss</module>
         <module>kxs-common-pay</module>
         <module>kxs-common-mq</module>
+        <module>kxs-common-idempotent</module>
     </modules>
     <dependencyManagement>
         <dependencies>

+ 8 - 0
kxs-gateway/pom.xml

@@ -167,6 +167,14 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>10</source>
+                    <target>10</target>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>

+ 4 - 0
kxs-product/kxs-product-api/pom.xml

@@ -50,6 +50,10 @@
             <groupId>com.kxs</groupId>
             <artifactId>kxs-common-seata</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-mq</artifactId>
+        </dependency>
         <!-- excel 导入导出 https://github.com/sky-mesh/excel-spring-boot-starter -->
         <dependency>
             <groupId>com.pig4cloud.excel</groupId>

+ 166 - 0
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/amqp/rabbit/RabbitGdActQueueMQ.java

@@ -0,0 +1,166 @@
+package com.kxs.product.api.amqp.rabbit;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.kxs.common.mq.enums.MQSendTypeEnum;
+import com.kxs.common.mq.model.AbstractMQ;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessageBuilder;
+import org.springframework.amqp.core.MessageDeliveryMode;
+import org.springframework.amqp.core.MessageProperties;
+
+import java.math.BigDecimal;
+import java.util.UUID;
+
+/**
+ * mq 订单普通队列 配置
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class RabbitGdActQueueMQ extends AbstractMQ {
+
+
+    /**
+     * 订单交易队列
+     */
+    public static final String QUEUE_NAME = "QUEUE_GD_ACT_DIVISION";
+
+    /**
+     * 死队列名称
+     */
+    public static final String DEAD_QUEUE_NAME = "DEAD_QUEUE_GD_ACT_DIVISION";
+
+    /**
+     * 内置msg 消息体定义
+     **/
+    private MsgEntity msgEntity;
+
+    /**
+     *  定义Msg消息载体
+     **/
+    @Data
+    public static class MsgEntity {
+
+        /**
+         * 订单号
+         */
+        private String orderNo;
+        /**
+         * 订单创建时间
+         */
+        private String orderCreateTime;
+        /**
+         * 用户选择号码
+         */
+        private String phoneNo;
+        /**
+         * 是否首充(中文):是,否
+         */
+        private String firstCharge;
+        /**
+         * 首充金额(元)
+         */
+        private BigDecimal initialChargeAmount;
+        /**
+         * 省
+         */
+        private String province;
+        /**
+         * 城市
+         */
+        private String city;
+        /**
+         * 商品名称
+         */
+        private String productName;
+        /**
+         * 促销活动名称
+         */
+        private String promotionName;
+        /**
+         * 商品类型名称
+         */
+        private String productTypeName;
+        /**
+         * 实付金额(元)
+         */
+        private BigDecimal paidInAmount;
+        /**
+         * 订单状态(中文):待
+         * 激活、已完成、退款
+         * 中、未知
+         */
+        private String orderStatus;
+        /**
+         * 激活状态(中文):待激活、已激活、未知
+         */
+        private String activationStatusName;
+        /**
+         * 激活时间
+         */
+        private String activationTime;
+        /**
+         * 开卡人工号
+         */
+        private String jobId;
+        /**
+         * SIM 卡号
+         */
+        private String iccId;
+
+    }
+
+    @Override
+    public String getQueueName() {
+
+        return QUEUE_NAME;
+    }
+
+    @Override
+    public String getDeadQueueName() {
+
+        return DEAD_QUEUE_NAME;
+    }
+
+    @Override
+    public MQSendTypeEnum getMqType() {
+
+        return MQSendTypeEnum.QUEUE;
+    }
+
+    @Override
+    public Message toMessage() {
+        String message = JSONObject.toJSONString(msgEntity);
+        // 构建消息体
+        return MessageBuilder.withBody(message.getBytes())
+                .setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN)
+                .setDeliveryMode(MessageDeliveryMode.PERSISTENT)
+                .setMessageId(UUID.randomUUID().toString())
+                .build();
+    }
+
+    /**
+     * 构造发送消息
+     */
+    public static RabbitGdActQueueMQ build(MsgEntity message){
+
+        return new RabbitGdActQueueMQ(message);
+    }
+
+    /**
+     * 解析MQ消息, 一般用于接收MQ消息时
+     */
+    public static MsgEntity parse(String msg){
+        return JSON.parseObject(msg, MsgEntity.class);
+    }
+
+}

+ 1 - 1
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/model/KxsMachine.java

@@ -209,7 +209,7 @@ public class KxsMachine extends Model<KxsMachine> implements Serializable {
     /**
      * 状态 0在库 1出库
      */
-    @Schema(description = "状态 0在库 1出库")
+    @Schema(description = "状态 0在库 1出库 2已退回 3可回收 4回收中 5已回收 6已预发")
     private Integer status;
 
     /**

+ 5 - 2
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/vo/kxsapp/machine/MachineRecycleListVO.java

@@ -35,8 +35,11 @@ public class MachineRecycleListVO implements Serializable {
      */
     @Schema(description = "循环结束时间")
     private LocalDateTime recycleEndTime;
-
-
+    /**
+     * 品牌id
+     */
+    @Schema(description = "品牌id")
+    private int brandId;
 
 
 

+ 12 - 0
kxs-product/kxs-product-biz/pom.xml

@@ -79,6 +79,10 @@
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-json</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-idempotent</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
@@ -177,6 +181,14 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>16</source>
+                    <target>16</target>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>

+ 6 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/controller/admin/SysGdController.java

@@ -4,9 +4,11 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kxs.common.core.util.R;
+import com.kxs.common.idempotent.annotation.Idempotent;
 import com.kxs.product.api.model.KxsGdReport;
 import com.kxs.product.biz.service.KxsGdReportService;
 import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -41,6 +43,7 @@ public class SysGdController {
                         .eq(StrUtil.isNotBlank(param.getGdMobile()),KxsGdReport::getGdMobile, param.getGdMobile())
                         .eq(StrUtil.isNotBlank(param.getUserCode()),KxsGdReport::getUserCode, param.getUserCode())
                         .eq(param.getIsCheck() != null, KxsGdReport::getIsCheck, param.getIsCheck())
+                        .orderByDesc(KxsGdReport::getId)
                 ));
     }
 
@@ -51,6 +54,7 @@ public class SysGdController {
      * @param param 实体对象
      * @return 广电报备-编辑
      */
+//    @PreAuthorize("@pms.hasPermission('sys_gd_report_edit')")
     @PutMapping("/update")
     public R update(@RequestBody KxsGdReport param) {
 
@@ -64,6 +68,8 @@ public class SysGdController {
      * @param endTime 结束时间
      * @return 广电报备-编辑
      */
+    @Idempotent(key = "#startTime", expireTime = 15, info = "请于15秒后重试")
+//    @PreAuthorize("@pms.hasPermission('sys_gd_report_check')")
     @GetMapping("/check")
     public R check(@RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime) {
 

+ 11 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/controller/kxsapp/MachineController.java

@@ -180,6 +180,17 @@ public class MachineController {
         return R.ok(kxsMachineService.recycleList(page, param));
     }
 
+    /**
+     * 可回收机具品牌列表
+     *
+     * @return 机具可回收列表
+     */
+    @GetMapping("/recycleBrandList")
+    public R recycleBrandList() {
+
+        return R.ok(kxsMachineService.recycleBrandList());
+    }
+
     /**
      * 可回收数量 内部调用
      *

+ 8 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/mapper/KxsMachineMapper.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kxs.product.api.dto.kxsapp.machine.*;
 import com.kxs.product.api.model.KxsMachine;
 import com.kxs.product.api.vo.kxsapp.machine.*;
+import com.kxs.system.api.vo.kxsapp.RecycleBrandListVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -119,5 +120,12 @@ public interface KxsMachineMapper extends BaseMapper<KxsMachine> {
      * @return {@link List}<{@link KxsMachine}>
      */
     List<KxsMachine> selectExpireDeductList(LocalDateTime endDay);
+
+    /**
+     * 可回收机具品牌列表
+     * @param userId 用户id
+     * @return 机具可回收列表
+     */
+    List<RecycleBrandListVO> recycleBrandList(Long userId);
 }
 

+ 0 - 9
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/KxsGdService.java

@@ -13,15 +13,6 @@ import java.util.List;
 public interface KxsGdService {
 
 
-    /**
-     * 查询开卡订单数据
-     *
-     * @param startTime 开始时间
-     * @param endTime   结束时间
-     * @param pageNo
-     * @param pageSize
-     */
-    List<GdQueryOrderRes.GdQueryOrder> queryCardOrders(String startTime, String endTime, int pageNo, int pageSize);
 
     /**
      * 匹配 广电 开卡数据

+ 7 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/KxsMachineService.java

@@ -137,5 +137,12 @@ public interface KxsMachineService extends IService<KxsMachine> {
      * @param para 段落
      */
     void recycleMachineSchedule(String para);
+    /**
+     * 可回收机具品牌列表
+     *
+     * @return 机具可回收列表
+     */
+    Object recycleBrandList();
+
 }
 

+ 22 - 14
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsGdServiceImpl.java

@@ -7,10 +7,12 @@ import cn.hutool.http.HttpRequest;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.kxs.common.core.exception.GlobalCustomerException;
+import com.kxs.common.mq.handlers.IMQSender;
 import com.kxs.product.api.model.KxsGdReport;
 import com.kxs.product.api.req.gd.GdQueryCardOrderReq;
 import com.kxs.product.api.res.gd.GdCommRes;
 import com.kxs.product.api.res.gd.GdQueryOrderRes;
+import com.kxs.product.api.amqp.rabbit.RabbitGdActQueueMQ;
 import com.kxs.product.biz.config.RsaProperties;
 import com.kxs.product.biz.constant.enums.GdReportEnum;
 import com.kxs.product.biz.mapper.KxsGdReportMapper;
@@ -39,8 +41,11 @@ public class KxsGdServiceImpl implements KxsGdService {
 
     private final KxsGdReportMapper kxsGdReportMapper;
 
+    private final IMQSender mqSender;
+
     @Async("getAsyncExecutor")
-    public void checkGdAsyncData(String startTime, String endTime){
+    @Override
+    public void checkGdAsyncData(String startTime, String endTime) {
         int pageNo = 1;
         int pageSize = 50;
 
@@ -48,28 +53,30 @@ public class KxsGdServiceImpl implements KxsGdService {
             List<GdQueryOrderRes.GdQueryOrder> list = this.queryCardOrders(startTime, endTime, pageNo, pageSize);
             if (list.isEmpty()) {
                 pageNo = -1;
-            }else{
+            } else {
                 for (GdQueryOrderRes.GdQueryOrder gdQueryOrder : list) {
-                    if("已激活".equals(gdQueryOrder.getActivationStatusName())){
+                    if ("已激活".equals(gdQueryOrder.getActivationStatusName())) {
                         KxsGdReport kxsGdReport = kxsGdReportMapper.selectOne(Wrappers.<KxsGdReport>lambdaQuery()
-                                        .eq(KxsGdReport::getGdSn, gdQueryOrder.getIccId())
+                                .eq(KxsGdReport::getIsCheck, GdReportEnum.CHECK_NO.getType())
+                                .eq(KxsGdReport::getGdSn, gdQueryOrder.getIccId())
                                 .eq(KxsGdReport::getGdMobile, gdQueryOrder.getPhoneNo()));
-                        if(kxsGdReport != null){
+                        if (kxsGdReport != null) {
                             kxsGdReportMapper.update(null, Wrappers.<KxsGdReport>lambdaUpdate().eq(KxsGdReport::getId, kxsGdReport.getId())
-                                            .set(KxsGdReport::getIsCheck, GdReportEnum.CHECK_SUC.getType())
-                                            .set(KxsGdReport::getGdMobile, gdQueryOrder.getPhoneNo()));
-                            //TODO 调用激活接口
-
+                                    .set(KxsGdReport::getIsCheck, GdReportEnum.CHECK_SUC.getType())
+                                    .set(KxsGdReport::getGdMobile, gdQueryOrder.getPhoneNo()));
+                            //发送广电激活MQ消息
+                            RabbitGdActQueueMQ.MsgEntity msgEntity = new RabbitGdActQueueMQ.MsgEntity();
+                            BeanUtil.copyProperties(gdQueryOrder, msgEntity);
+                            mqSender.send(RabbitGdActQueueMQ.build(msgEntity));
                         }
                     }
                 }
                 pageNo++;
             }
-        }while (pageNo != -1);
+        } while (pageNo != -1);
 
     }
 
-    @Override
     public List<GdQueryOrderRes.GdQueryOrder> queryCardOrders(String startTime, String endTime, int pageNo, int pageSize) {
 
         try {
@@ -93,10 +100,11 @@ public class KxsGdServiceImpl implements KxsGdService {
                     .timeout(50000)//超时,毫秒
                     .execute().body();
             Optional.ofNullable(response).orElseThrow(() -> new GlobalCustomerException("调用接口失败"));
-            GdCommRes<GdQueryOrderRes> commRes = JSONUtil.toBean(response, new TypeReference<GdCommRes<GdQueryOrderRes>>() {}, true);
-            if(commRes.getResultCode() == 1){
+            GdCommRes<GdQueryOrderRes> commRes = JSONUtil.toBean(response, new TypeReference<GdCommRes<GdQueryOrderRes>>() {
+            }, true);
+            if (commRes.getResultCode() == 1) {
                 return commRes.getData().getRecords();
-            }else{
+            } else {
                 throw new GlobalCustomerException(commRes.getErrorDesc());
             }
 

+ 7 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsMachineServiceImpl.java

@@ -23,6 +23,7 @@ import com.kxs.product.biz.mapper.*;
 import com.kxs.product.biz.service.KxsMachineService;
 import com.kxs.store.api.feign.RemoteKxsStoreService;
 import com.kxs.system.api.feign.RemoteOldService;
+import com.kxs.system.api.vo.kxsapp.RecycleBrandListVO;
 import com.kxs.user.api.feign.RemoteKxsUserService;
 import com.kxs.user.api.model.KxsUser;
 import lombok.RequiredArgsConstructor;
@@ -335,6 +336,12 @@ public class KxsMachineServiceImpl extends ServiceImpl<KxsMachineMapper, KxsMach
         }
     }
 
+    @Override
+    public Object recycleBrandList() {
+        Long userId = SecurityUtils.getUser().getId();
+        return baseMapper.recycleBrandList(userId);
+    }
+
 
 }
 

+ 1 - 0
kxs-product/kxs-product-biz/src/main/resources/mapper/KxsGdReportMapper.xml

@@ -33,6 +33,7 @@
                 and (put_name = #{keyword} or put_mobile = #{keyword})
             </if>
         </where>
+        order by id desc
     </select>
 
 </mapper>

+ 17 - 2
kxs-product/kxs-product-biz/src/main/resources/mapper/KxsMachineMapper.xml

@@ -133,14 +133,21 @@
             </if>
         </where>
     </select>
+
     <select id="recyclePageList" resultType="com.kxs.product.api.vo.kxsapp.machine.MachineRecycleListVO">
-        select recycle_end_time, pos_sn from kxs_machine
-        where del_flag = 0 and status = 3 and user_id = #{query.userId}
+        select recycle_end_time, pos_sn, brand_id from kxs_machine
+        where del_flag = 0
+          and status = 3
+          and user_id = #{query.userId}
         <if test="query.posSn != null and query.posSn != ''">
             and pos_sn like concat('%', #{query.posSn}, '%')
         </if>
+        <if test="query.brandId != null and query.brandId != ''">
+            and brand_id = #{query.brandId}
+        </if>
         order by recycle_end_time desc
     </select>
+
     <select id="activateMachineMonthTotal"
             resultType="com.kxs.product.api.vo.kxsapp.machine.StoreActMachineMonthTotalVO">
         select * from
@@ -200,5 +207,13 @@
           order by recycle_end_time desc
           limit 1000
     </select>
+    <select id="recycleBrandList" resultType="com.kxs.system.api.vo.kxsapp.RecycleBrandListVO">
+        select DISTINCT kb.id,kb.name from kxs_machine km
+        left join  kxs_brand kb on km.brand_id = kb.id
+        where km.del_flag = 0
+        and km.status = 3
+        and km.user_id = #{query.userId}
+    </select>
+
 
 </mapper>

+ 1 - 1
kxs-product/kxs-product-biz/src/main/resources/mapper/KxsShopGoodsMapper.xml

@@ -30,7 +30,7 @@
             a.del_flag = 0
             and a.status = 1
             <if test="colId != null">
-                a.col_id like concat('%' #{colId} '%')
+                and a.col_id like concat('%', #{colId} ,'%')
             </if>
         </where>
     </select>

+ 8 - 0
kxs-store/kxs-store-biz/pom.xml

@@ -185,6 +185,14 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>16</source>
+                    <target>16</target>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 

+ 4 - 0
kxs-system/kxs-system-api/pom.xml

@@ -49,5 +49,9 @@
             <groupId>com.kxs</groupId>
             <artifactId>kxs-common-seata</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-mq</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 119 - 0
kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/amqp/rabbit/RabbitOrderQueueMQ.java

@@ -0,0 +1,119 @@
+package com.kxs.system.api.amqp.rabbit;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.kxs.common.mq.enums.MQSendTypeEnum;
+import com.kxs.common.mq.model.AbstractMQ;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessageBuilder;
+import org.springframework.amqp.core.MessageDeliveryMode;
+import org.springframework.amqp.core.MessageProperties;
+
+import java.math.BigDecimal;
+import java.util.UUID;
+
+/**
+ * mq 订单普通队列 配置
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class RabbitOrderQueueMQ extends AbstractMQ {
+
+
+    /**
+     * 订单交易队列
+     */
+    public static final String QUEUE_NAME = "QUEUE_ORDER_DIVISION";
+
+    /**
+     * 死信队列名称
+     */
+    public static final String DEAD_QUEUE_NAME = "DEAD_QUEUE_ORDER_DIVISION";
+
+    /**
+     * 内置msg 消息体定义
+     **/
+    private MsgEntity msgEntity;
+
+    /**
+     *  定义Msg消息载体
+     **/
+    @Data
+    public static class MsgEntity {
+
+        /**
+         * 支付订单号
+         **/
+        private String orderId;
+
+        /**
+         * 用户 ID
+         */
+        private Integer userId;
+
+        /**
+         * 商品ID
+         */
+        private Integer goodsId;
+
+        /**
+         * 订单金额
+         */
+        private BigDecimal totalPrice;
+
+    }
+
+    @Override
+    public String getQueueName() {
+
+        return QUEUE_NAME;
+    }
+
+    @Override
+    public String getDeadQueueName() {
+
+        return DEAD_QUEUE_NAME;
+    }
+
+    @Override
+    public MQSendTypeEnum getMqType() {
+
+        return MQSendTypeEnum.QUEUE;
+    }
+
+    @Override
+    public Message toMessage() {
+        String message = JSONObject.toJSONString(msgEntity);
+        // 构建消息体
+        return MessageBuilder.withBody(message.getBytes())
+                .setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN)
+                .setDeliveryMode(MessageDeliveryMode.PERSISTENT)
+                .setMessageId(UUID.randomUUID().toString())
+                .build();
+    }
+
+    /**
+     * 构造发送消息
+     */
+    public static RabbitOrderQueueMQ build(MsgEntity message){
+
+        return new RabbitOrderQueueMQ(message);
+    }
+
+    /**
+     * 解析MQ消息, 一般用于接收MQ消息时
+     */
+    public static MsgEntity parse(String msg){
+        return JSON.parseObject(msg, MsgEntity.class);
+    }
+
+}

+ 9 - 0
kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/RecycleBrandListVO.java

@@ -0,0 +1,9 @@
+package com.kxs.system.api.vo.kxsapp;
+
+import lombok.Data;
+
+@Data
+public class RecycleBrandListVO {
+    private int id;
+    private String name;
+}

+ 108 - 0
kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/school/SchoolFirstMenuVO.java

@@ -0,0 +1,108 @@
+package com.kxs.system.api.vo.kxsapp.school;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class SchoolFirstMenuVO {
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    private String delFlag;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 分类名称
+     */
+    @Schema(description = "分类名称")
+    private String colName;
+
+    /**
+     * 老库分类标识
+     */
+    @Schema(description = "分类标识")
+    private String colId;
+
+
+    /**
+     * 分类封面图
+     */
+    @Schema(description = "分类封面图")
+    private String colPicPath;
+
+
+    /**
+     * 分类描述
+     */
+    @Schema(description = "分类描述")
+    private String colDetail;
+
+
+    /**
+     * 父级ID
+     */
+    @Schema(description = "父级ID")
+    private Integer pid;
+
+
+    /**
+     * 排序
+     */
+    @Schema(description = "排序")
+    private Integer sort;
+
+
+    /**
+     * 是否开发 0否 1开放
+     */
+    @Schema(description = "是否开发 0否 1开放")
+    private Integer isOpen;
+
+
+    /**
+     * 起始交易额查看权限
+     */
+    @Schema(description = "起始交易额查看权限")
+    private BigDecimal startAmount;
+    private long childCount;
+    private int isUpdate;
+}

+ 102 - 0
kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/school/SchoolListVO.java

@@ -0,0 +1,102 @@
+package com.kxs.system.api.vo.kxsapp.school;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class SchoolListVO {
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 新增时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.UPDATE)
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+    /**
+     * 删除标记,0未删除,1已删除
+     */
+    @Schema(description = "删除标记,0未删除,1已删除")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String delFlag;
+
+
+    /**
+     * 版本
+     */
+    @Schema(description = "版本")
+    private Integer version;
+
+
+    /**
+     * 标题
+     */
+    @Schema(description = "标题")
+    private String title;
+
+
+    /**
+     * 详情描述
+     */
+    @Schema(description = "详情描述")
+    private String detail;
+
+
+    /**
+     * 学习人数
+     */
+    @Schema(description = "学习人数")
+    private Integer studyPerson;
+
+
+    /**
+     * 作者
+     */
+    @Schema(description = "作者")
+    private String lecturer;
+
+
+    /**
+     * 外链
+     */
+    @Schema(description = "外链")
+    private String url;
+
+
+    /**
+     * 封面
+     */
+    @Schema(description = "封面")
+    private String listPic;
+
+
+    /**
+     * 分类ID
+     */
+    @Schema(description = "分类ID")
+    private Integer menuId;
+    /**
+     * 是否最新
+     */
+    private int isUpdate;
+}

+ 66 - 0
kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/serviceCenter/ServiceCenterGetByIdVO.java

@@ -0,0 +1,66 @@
+package com.kxs.system.api.vo.kxsapp.serviceCenter;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 服务中心-服务详情vo
+ *
+ * @author 系统
+ * @date 2024-04-24 16:19:08
+ */
+@Data
+@Schema(description = "服务中心-服务详情返回实体")
+public class ServiceCenterGetByIdVO implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    private Integer id;
+
+
+    /**
+     * 新增时间
+     */
+    @Schema(description = "新增时间")
+    private LocalDateTime createTime;
+
+
+    /**
+     * 标题
+     */
+    @Schema(description = "标题")
+    private String title;
+
+
+    /**
+     * 内容
+     */
+    @Schema(description = "内容")
+    private String content;
+
+
+    /**
+     * 创建人
+     */
+    @Schema(description = "创建人")
+    private String createBy;
+
+
+
+
+
+	
+
+}

+ 45 - 0
kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/serviceCenter/ServiceCenterListVO.java

@@ -0,0 +1,45 @@
+package com.kxs.system.api.vo.kxsapp.serviceCenter;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 服务中心-服务列表vo
+ *
+ * @author 系统
+ * @date 2024-04-24 16:19:08
+ */
+@Data
+@Schema(description = "服务中心-服务列表返回实体")
+public class ServiceCenterListVO implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    private Integer id;
+
+
+    /**
+     * 标题
+     */
+    @Schema(description = "标题")
+    private String title;
+
+
+
+
+
+	
+
+}

+ 52 - 0
kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/serviceCenter/ServiceCenterMenuListVO.java

@@ -0,0 +1,52 @@
+package com.kxs.system.api.vo.kxsapp.serviceCenter;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 服务中心-服务分类列表vo
+ *
+ * @author 系统
+ * @date 2024-04-24 16:19:08
+ */
+@Data
+@Schema(description = "服务中心-服务分类列表返回实体")
+public class ServiceCenterMenuListVO implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    private Integer id;
+
+
+    /**
+     * 分类名称
+     */
+    @Schema(description = "分类名称")
+    private String title;
+
+
+    /**
+     * 排序
+     */
+    @Schema(description = "排序")
+    private Integer sort;
+
+
+
+
+
+	
+
+}

+ 8 - 4
kxs-system/kxs-system-api/src/main/java/com/kxs/system/api/vo/kxsapp/userMsg/UserMsgPageVO.java

@@ -63,10 +63,14 @@ public class UserMsgPageVO implements Serializable {
     @Schema(description = "跳转地址")
     private String url;
 
-
-
-
-
+    /**
+     *0未读 1已读
+     */
+    private Integer readFlag;
+    /**
+     * 背景图片
+     */
+    private String bgPic;
 	
 
 }

+ 8 - 0
kxs-system/kxs-system-biz/pom.xml

@@ -191,6 +191,14 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>16</source>
+                    <target>16</target>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 

+ 87 - 0
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/amqp/rabbit/RabbitOrderQueueListener.java

@@ -0,0 +1,87 @@
+package com.kxs.system.biz.amqp.rabbit;
+
+import com.kxs.common.mq.config.RabbitConfiguration;
+import com.kxs.product.api.amqp.rabbit.RabbitGdActQueueMQ;
+import com.kxs.system.api.amqp.rabbit.RabbitOrderQueueMQ;
+import com.kxs.system.biz.service.KxsCampService;
+import com.rabbitmq.client.Channel;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * rabbit 队列侦听器
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-25
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class RabbitOrderQueueListener {
+
+	private final KxsCampService kxsCampService;
+
+	/**
+	 * 监听 hello 队列的处理器
+	 *
+	 * @param message 消息
+	 */
+	@RabbitListener(queues = RabbitOrderQueueMQ.QUEUE_NAME, ackMode = "MANUAL")
+	@RabbitHandler
+	public void onMessage(String msg, Message message, Channel channel){
+		log.info("消费端Payload: " + RabbitOrderQueueMQ.parse(msg));
+        try {
+			RabbitOrderQueueMQ.MsgEntity parse = RabbitOrderQueueMQ.parse(msg);
+			//统计到奖金池
+			kxsCampService.prizePoolIsRefreshed(parse);
+			channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
+        } catch (Exception e) {
+			log.error(e.getMessage(), e);
+			try {
+				channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
+			} catch (IOException ex) {
+				log.error("进入死信队列失败" + ex.getMessage(), ex);
+			}
+        }
+    }
+
+	/**
+	 * 监听死信 队列的处理器
+	 *
+	 * @param message 消息
+	 */
+	@RabbitListener(queues = RabbitOrderQueueMQ.DEAD_QUEUE_NAME)
+	@RabbitHandler
+	public void onDeadMessage(String msg, Message message, Channel channel){
+		log.info("死信队列Payload: " + RabbitOrderQueueMQ.parse(msg));
+        try {
+			RabbitOrderQueueMQ.MsgEntity parse = RabbitOrderQueueMQ.parse(msg);
+        } catch (Exception e) {
+			log.error(e.getMessage(), e);
+
+        }
+    }
+
+//	/**
+//	 * 监听死信 队列的处理器
+//	 *
+//	 * @param message 消息
+//	 */
+//	@RabbitListener(queues = RabbitGdActQueueMQ.QUEUE_NAME)
+//	@RabbitHandler
+//	public void onGdMessage(String msg, Message message, Channel channel){
+//		log.info("广电报备队列Payload: " + RabbitGdActQueueMQ.parse(msg));
+//        try {
+//			RabbitGdActQueueMQ.MsgEntity parse = RabbitGdActQueueMQ.parse(msg);
+//        } catch (Exception e) {
+//			log.error(e.getMessage(), e);
+//
+//        }
+//    }
+}

+ 2 - 4
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/controller/kxsapp/MorningController.java

@@ -41,7 +41,7 @@ public class MorningController {
         AssertUtil.isYyyyMM(month);
         String skbYear = month.substring(0, 4);
         String subMonth = month.substring(5, 7);
-        //拼接
+        //拼接sql
         return R.ok(kxsMorningService.page(page,
                 new QueryWrapper<KxsMorning>()
                         .apply("YEAR(create_time) = {0} AND MONTH(create_time) = {1}", skbYear, subMonth)
@@ -56,10 +56,8 @@ public class MorningController {
      * @param addStudyPersonDTO 参数对象
      * @return 商学院-晨会列表
      */
-    @GetMapping("/addStudyPerson")
+    @PostMapping("/addStudyPerson")
     public R addStudyPerson(@Valid @RequestBody AddStudyPersonDTO addStudyPersonDTO) {
-
-        //拼接
         return kxsMorningService.addStudyPerson(addStudyPersonDTO.getId(),addStudyPersonDTO.getType());
     }
 

+ 2 - 3
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/controller/kxsapp/SchoolController.java

@@ -41,7 +41,7 @@ public class SchoolController {
     @GetMapping("/firstMenu")
     public R firstMenu() {
 
-        return R.ok(kxsSchoolMenuService.list(Wrappers.emptyWrapper()));
+        return R.ok(kxsSchoolMenuService.firstMenu());
     }
 
 
@@ -54,8 +54,7 @@ public class SchoolController {
     @GetMapping("/page")
     public R page(@ParameterObject Page<KxsSchoolStudy> page, @RequestParam("menuId") Integer menuId) {
 
-        return R.ok(kxsSchoolStudyService
-                .page(page, Wrappers.<KxsSchoolStudy>lambdaQuery().eq(KxsSchoolStudy::getMenuId, menuId)));
+        return R.ok(kxsSchoolStudyService.schoolList(page,menuId));
     }
 
 

+ 77 - 0
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/controller/kxsapp/ServiceCenterController.java

@@ -0,0 +1,77 @@
+package com.kxs.system.biz.controller.kxsapp;
+
+
+import com.kxs.common.core.util.R;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kxs.system.api.vo.kxsapp.serviceCenter.ServiceCenterListVO;
+import com.kxs.system.biz.service.KxsServiceMenuService;
+import org.springdoc.core.annotations.ParameterObject;
+import com.kxs.system.api.model.KxsServiceMenu;
+
+
+import com.kxs.system.biz.service.KxsServiceCenterService;
+
+import org.springframework.web.bind.annotation.*;
+
+import lombok.RequiredArgsConstructor;
+
+/**
+ * 首页(ServiceCenter)控制层
+ *
+ * @author 系统
+ * @since 2024-04-24 16:19:09
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("serviceCenter")
+public class ServiceCenterController {
+
+    /**
+     * 服务对象
+     */
+    private final KxsServiceMenuService kxsServiceMenuService;
+    private final KxsServiceCenterService kxsServiceCenterService;
+
+
+
+    /**
+     * 服务中心-服务分类列表
+     *
+     * @param page 分页对象
+     * @return 服务中心-服务分类列表
+     */
+    @GetMapping("/menuList")
+    public R menuList(@ParameterObject Page<KxsServiceMenu> page) {
+        return R.ok(kxsServiceMenuService.page(page));
+    }
+
+
+    /**
+     * 服务中心-服务列表
+     *
+     * @param page 分页对象
+     * @return 服务中心-服务列表
+     */
+    @GetMapping("/list")
+    public R list(@ParameterObject Page<ServiceCenterListVO> page, @RequestParam("menuId")Long menuId) {
+        return R.ok(kxsServiceCenterService.ServiceCenterList(page,menuId));
+    }
+
+
+    /**
+     * 服务中心-服务详情
+     *
+     * @param id 主键ID
+     * @return 服务中心-服务详情
+     */
+    @GetMapping("/getById")
+    public R getById(@RequestParam("id") Integer id) {
+        return R.ok(kxsServiceCenterService.getById(id));
+    }
+
+
+
+
+
+}
+

+ 4 - 0
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/mapper/KxsCampMapper.java

@@ -37,5 +37,9 @@ public interface KxsCampMapper extends BaseMapper<KxsCamp> {
      * @return {@link KxsCampUser}
      */
     KxsCampUser selectByUserId(@Param("userId") Integer userId, @Param("now") LocalDateTime now);
+
+    KxsCamp selectUserCamp(@Param("userId") Integer userId, @Param("now") LocalDateTime now);
+
+    KxsCampUser selectUsersCamp(@Param("pids") String[] pids, LocalDateTime now);
 }
 

+ 5 - 0
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/mapper/KxsServiceCenterMapper.java

@@ -1,8 +1,12 @@
 package com.kxs.system.biz.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kxs.system.api.model.KxsServiceCenter;
+import com.kxs.system.api.vo.kxsapp.serviceCenter.ServiceCenterListVO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 服务中心(KxsServiceCenter)表数据库访问层
@@ -13,5 +17,6 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface KxsServiceCenterMapper extends BaseMapper<KxsServiceCenter> {
 
+    IPage<ServiceCenterListVO> ServiceCenterList(Page<ServiceCenterListVO> page, @Param("menuId")Long menuId);
 }
 

+ 2 - 1
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/KxsCampService.java

@@ -8,6 +8,7 @@ import com.kxs.system.api.model.KxsCamp;
 import com.kxs.system.api.vo.admin.CampUserExcelVO;
 import com.kxs.system.api.vo.kxsapp.camp.CampGetByIdVO;
 import com.kxs.system.api.vo.kxsapp.camp.CampPageVO;
+import com.kxs.system.api.amqp.rabbit.RabbitOrderQueueMQ;
 import org.springframework.validation.BindingResult;
 
 import java.util.List;
@@ -64,7 +65,7 @@ public interface KxsCampService extends IService<KxsCamp> {
     /**
      * 奖池已刷新
      */
-    void prizePoolIsRefreshed();
+    void prizePoolIsRefreshed(RabbitOrderQueueMQ.MsgEntity parse);
 
     /**
      * 后台分页 页面

+ 2 - 0
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/KxsSchoolMenuService.java

@@ -11,5 +11,7 @@ import com.kxs.system.api.model.KxsSchoolMenu;
  */
 public interface KxsSchoolMenuService extends IService<KxsSchoolMenu> {
 
+    Object firstMenu();
+
 }
 

+ 3 - 0
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/KxsSchoolStudyService.java

@@ -1,5 +1,6 @@
 package com.kxs.system.biz.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.kxs.system.api.model.KxsSchoolStudy;
 
@@ -11,5 +12,7 @@ import com.kxs.system.api.model.KxsSchoolStudy;
  */
 public interface KxsSchoolStudyService extends IService<KxsSchoolStudy> {
 
+
+    Object schoolList(Page<KxsSchoolStudy> page, Integer menuId);
 }
 

+ 4 - 0
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/KxsServiceCenterService.java

@@ -1,7 +1,10 @@
 package com.kxs.system.biz.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.kxs.system.api.model.KxsServiceCenter;
+import com.kxs.system.api.vo.kxsapp.serviceCenter.ServiceCenterListVO;
 
 /**
  * 服务中心(KxsServiceCenter)表服务接口
@@ -11,5 +14,6 @@ import com.kxs.system.api.model.KxsServiceCenter;
  */
 public interface KxsServiceCenterService extends IService<KxsServiceCenter> {
 
+    IPage<ServiceCenterListVO> ServiceCenterList(Page<ServiceCenterListVO> page, Long menuId);
 }
 

+ 245 - 207
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/impl/KxsCampServiceImpl.java

@@ -2,54 +2,42 @@ package com.kxs.system.biz.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kxs.common.core.constant.SecurityConstants;
 import com.kxs.common.core.constant.enums.ErrorTypeEnum;
-import com.kxs.common.core.constant.enums.LeaderTypeEnum;
 import com.kxs.common.core.exception.GlobalCustomerException;
 import com.kxs.common.core.util.R;
 import com.kxs.common.core.util.RetOps;
-import com.kxs.common.core.util.SysUtils;
 import com.kxs.common.security.util.SecurityUtils;
 import com.kxs.product.api.feign.RemoteKxsProductService;
-import com.kxs.product.api.model.KxsMachine;
-import com.kxs.product.api.vo.kxsapp.shop.ShopOrderGoodsUserVO;
 import com.kxs.system.api.feign.RemoteOldService;
 import com.kxs.system.api.model.KxsCampUser;
 import com.kxs.system.api.vo.admin.CampUserExcelVO;
 import com.kxs.system.api.vo.kxsapp.camp.CampGetByIdVO;
 import com.kxs.system.api.vo.kxsapp.camp.CampPageVO;
+import com.kxs.system.api.amqp.rabbit.RabbitOrderQueueMQ;
 import com.kxs.system.biz.constant.enums.CampStatusEnum;
 import com.kxs.system.biz.constant.enums.SysErrorTypeEnum;
 import com.kxs.system.biz.mapper.KxsCampMapper;
 import com.kxs.system.api.model.KxsCamp;
-import com.kxs.system.biz.mapper.KxsCampUserMapper;
-import com.kxs.system.biz.service.KxsCampBonusLogService;
 import com.kxs.system.biz.service.KxsCampService;
 import com.kxs.system.biz.service.KxsCampUserService;
 import com.kxs.user.api.feign.RemoteKxsUserService;
-import com.kxs.user.api.model.KxsLeader;
 import com.kxs.user.api.model.KxsUser;
 import com.pig4cloud.plugin.excel.vo.ErrorMessage;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.BindingResult;
 
-import javax.json.Json;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.*;
@@ -76,7 +64,6 @@ public class KxsCampServiceImpl extends ServiceImpl<KxsCampMapper, KxsCamp> impl
     private final KxsCampUserService kxsCampUserService;
 
 
-
     @Override
     public R addData(KxsCamp param) {
 
@@ -94,11 +81,11 @@ public class KxsCampServiceImpl extends ServiceImpl<KxsCampMapper, KxsCamp> impl
     @Override
     public R updateData(KxsCamp param) {
 
-        if(param.getId() == null){
+        if (param.getId() == null) {
             return R.failed(SysErrorTypeEnum.PARAM_ERROR.getDescription());
         }
         KxsCamp kxsCamp = baseMapper.selectById(param.getId());
-        if(kxsCamp == null){
+        if (kxsCamp == null) {
             return R.failed(SysErrorTypeEnum.NOT_DATA.getDescription());
         }
 
@@ -134,19 +121,19 @@ public class KxsCampServiceImpl extends ServiceImpl<KxsCampMapper, KxsCamp> impl
                     .getData()
                     .orElse(null);
             KxsCamp kxsCamp = baseMapper.selectById(excel.getCampId());
-            if(kxsCamp == null){
+            if (kxsCamp == null) {
                 return R.failed(excel.getCampId() + "训练营编号不存在,请重新上传!");
             }
 
             if (Objects.isNull(user)) {
                 errorMsg.add(excel.getUserCode() + "创客未找到!");
-            }else{
-                if(user.getRealStatus() != 1){
+            } else {
+                if (user.getRealStatus() != 1) {
                     errorMsg.add(excel.getUserCode() + "创客未实名!");
                 }
                 //判断创客是否已在其他训练营
                 KxsCampUser kxsCampUser = baseMapper.selectByUserId(user.getId(), now);
-                if(kxsCampUser != null){
+                if (kxsCampUser != null) {
                     errorMsg.add(excel.getUserCode() + "已在训练营!");
                 }
             }
@@ -164,8 +151,7 @@ public class KxsCampServiceImpl extends ServiceImpl<KxsCampMapper, KxsCamp> impl
                 campUser.setUsername(user.getUsername());
                 campUser.setUserCode(user.getUserCode());
                 kxsCampUserService.save(campUser);
-            }
-            else {
+            } else {
                 // 数据不合法
                 errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg));
             }
@@ -197,7 +183,7 @@ public class KxsCampServiceImpl extends ServiceImpl<KxsCampMapper, KxsCamp> impl
     @Override
     public R getByData(Integer id) {
         KxsCamp kxsCamp = baseMapper.selectById(id);
-        if(kxsCamp == null){
+        if (kxsCamp == null) {
             return R.failed(SysErrorTypeEnum.NOT_DATA.getDescription());
         }
         statusChange(kxsCamp, LocalDateTime.now());
@@ -206,6 +192,60 @@ public class KxsCampServiceImpl extends ServiceImpl<KxsCampMapper, KxsCamp> impl
         return R.ok(campGetByIdVO);
     }
 
+    @Override
+    public void prizePoolIsRefreshed(RabbitOrderQueueMQ.MsgEntity parse) {
+        //查询正在进行中的活动
+        LocalDateTime now = LocalDateTime.now();
+        //兑换券下单
+        if(parse.getGoodsId() == 11 || parse.getGoodsId() == 12) {
+
+            //订单奖金
+            BigDecimal amount = NumberUtil.mul(NumberUtil.div(parse.getTotalPrice(), 600), 90);
+            //查询此用户是否参加进行中的训练营
+            KxsCamp kxsCamp = baseMapper.selectUserCamp(parse.getUserId(), now);
+            if (kxsCamp != null) {
+                //给训练营加金额
+                kxsCamp.setBonusPool(NumberUtil.add(kxsCamp.getBonusPool(), amount));
+                kxsCamp.setOrderNum(kxsCamp.getOrderNum() + 1);
+                baseMapper.updateById(kxsCamp);
+
+                //给创客团队加金额
+                KxsCampUser kxsCampUser = kxsCampUserService.getOne(Wrappers.<KxsCampUser>lambdaQuery()
+                        .eq(KxsCampUser::getCampId, kxsCamp.getId())
+                        .eq(KxsCampUser::getUserId, parse.getUserId()));
+                kxsCampUser.setTeamOrderPool(NumberUtil.add(kxsCampUser.getTeamOrderPool(), amount));
+                kxsCampUser.setTeamOrderNum(kxsCampUser.getTeamOrderNum() + 1);
+                kxsCampUserService.updateById(kxsCampUser);
+                log.info("用户{}参加训练营{},订单ID{}, 奖金池{},订单数{}", parse.getUserId(), kxsCamp.getId(), parse.getOrderId(), kxsCamp.getBonusPool(), kxsCamp.getOrderNum());
+                return;
+            }
+            //查找此用户上级倒序后参加了训练营,把奖金加入到自己和训练营里
+            R<KxsUser> kxsUserR = remoteKxsUserService.loadUserById(parse.getUserId(), SecurityConstants.FROM_IN);
+            KxsUser user = RetOps.of(kxsUserR)
+                    .getData()
+                    .orElseThrow(() -> new GlobalCustomerException(ErrorTypeEnum.USER_NOT_FOUND.getDescription()));
+            //下单用户的上级路径
+            String[] pidPaths = user.getPidPath().split(",");
+            //翻转上级从最近的开始查询
+            Arrays.sort(pidPaths, Collections.reverseOrder());
+            KxsCampUser campUser = baseMapper.selectUsersCamp(pidPaths, now);
+            if (campUser != null) {
+                //给训练营加金额
+                KxsCamp camp = baseMapper.selectById(campUser.getCampId());
+                camp.setBonusPool(NumberUtil.add(camp.getBonusPool(), amount));
+                camp.setOrderNum(camp.getOrderNum() + 1);
+                baseMapper.updateById(camp);
+
+                //给创客团队加金额
+                campUser.setTeamOrderPool(NumberUtil.add(campUser.getTeamOrderPool(), amount));
+                campUser.setTeamOrderNum(campUser.getTeamOrderNum() + 1);
+                kxsCampUserService.updateById(campUser);
+                log.info("用户{}的上级{}参加训练营{},订单ID{}, 奖金池{},订单数{}", parse.getUserId(), campUser.getUserId(), camp.getId(), parse.getOrderId(), camp.getBonusPool(), camp.getOrderNum());
+            }
+        }
+
+    }
+
     @Override
     public IPage<KxsCamp> getBySysPage(Page<KxsCamp> page, KxsCamp param) {
         LocalDateTime now = LocalDateTime.now();
@@ -217,208 +257,206 @@ public class KxsCampServiceImpl extends ServiceImpl<KxsCampMapper, KxsCamp> impl
         return pageData;
     }
 
-    @Override
-    @Async("getAsyncExecutor")
-    public void prizePoolIsRefreshed() {
-        //查询正在进行中的活动
-        LocalDateTime now = LocalDateTime.now();
-        //定时任务执行中时,查询当前正在进行的活动,由于定时任务执行时间偏差,当前时间减1一分钟判断
-        List<KxsCamp> list = baseMapper.selectList(Wrappers.<KxsCamp>lambdaQuery().le(KxsCamp::getStartTime, now).ge(KxsCamp::getEndTime, now.minusMinutes(1)));
-        //查询活动参与的创客
-        for (KxsCamp kxsCamp : list) {
-            //初始化奖金池
-            BigDecimal totalBonusPool = BigDecimal.ZERO;
-            //开机数
-            int openNum = 0;
-            //下单数
-            int orderNum = 0;
-
-            List<KxsCampUser> campUsers = kxsCampUserService.list(Wrappers.<KxsCampUser>lambdaQuery().eq(KxsCampUser::getCampId, kxsCamp.getId()));
-            //清除参与创客的所有统计数据然后封装在map里方便统计
-            Map<Integer, KxsCampUser> campUsersMap = new HashMap<>();
-            for (KxsCampUser campUser : campUsers) {
-                KxsCampUser kxsCampUser = new KxsCampUser();
-                BeanUtil.copyProperties(campUser, kxsCampUser);
-                kxsCampUser.setTeamOrderPool(BigDecimal.ZERO);
-                kxsCampUser.setTeamLeaderPool(BigDecimal.ZERO);
-                kxsCampUser.setTeamOrderNum(0);
-                kxsCampUser.setTeamLeaderNum(0);
-                kxsCampUser.setTeamOpenNum(0);
-                campUsersMap.put(campUser.getUserId(), kxsCampUser);
-            }
-
-            //转换为userID集合
-            List<Integer> userIds = campUsers.stream().map(KxsCampUser::getUserId).toList();
-
-
-            /*
-             * 查询当前活动的时间区间所有电签大机的订单
-             */
-            R<List<ShopOrderGoodsUserVO>> ordersR = remoteKxsProductService.getDateBetweenOrders(LocalDateTimeUtil.format(kxsCamp.getStartTime(), DatePattern.NORM_DATETIME_PATTERN)
-                    , LocalDateTimeUtil.format(kxsCamp.getEndTime(), DatePattern.NORM_DATETIME_PATTERN), SecurityConstants.FROM_IN);
-            List<ShopOrderGoodsUserVO> orders = RetOps.of(ordersR)
-                    .getData()
-                    .orElse(Collections.emptyList());
-            //循环区间订单查询用户的上级是否包含参与创客的ID
-            for (ShopOrderGoodsUserVO order : orders) {
-                //如果是参与者自己下的单
-                if (userIds.contains(order.getUserId())) {
-                    int currentNum = NumberUtil.div(order.getTotalPrice(), 600).intValue();
-                    //刷新参与创客的团队累计
-                    KxsCampUser kxsCampUser = campUsersMap.get(order.getUserId());
-                    BigDecimal amount = NumberUtil.mul(NumberUtil.div(order.getTotalPrice(), 600), 90);
-                    totalBonusPool = NumberUtil.add(totalBonusPool, amount);
-                    //兑换券下单
-                    kxsCampUser.setTeamOrderPool(NumberUtil.add(kxsCampUser.getTeamOrderPool(), amount));
-                    kxsCampUser.setTeamOrderNum(kxsCampUser.getTeamOrderNum() + currentNum);
-//                    if(order.getId() == 27 || order.getId() == 28){
-//                        //大小盟主下单, 奖金池+60,订单数+1
-//                        kxsCampUser.setTeamLeaderPool(NumberUtil.add(kxsCampUser.getTeamLeaderPool(), 60));
-//                        kxsCampUser.setTeamLeaderNum(kxsCampUser.getTeamLeaderNum() + 1);
-//                        currentNum = 1;
+//    @Override
+//    public void prizePoolIsRefreshed(RabbitOrderQueueMQ.MsgEntity parse) {
+//        //查询正在进行中的活动
+//        LocalDateTime now = LocalDateTime.now();
+//        //定时任务执行中时,查询当前正在进行的活动,由于定时任务执行时间偏差,当前时间减1一分钟判断
+//        List<KxsCamp> list = baseMapper.selectList(Wrappers.<KxsCamp>lambdaQuery().le(KxsCamp::getStartTime, now).ge(KxsCamp::getEndTime, now.minusMinutes(1)));
+//        //查询活动参与的创客
+//        for (KxsCamp kxsCamp : list) {
+//            //初始化奖金池
+//            BigDecimal totalBonusPool = BigDecimal.ZERO;
+//            //开机数
+//            int openNum = 0;
+//            //下单数
+//            int orderNum = 0;
+//
+//            List<KxsCampUser> campUsers = kxsCampUserService.list(Wrappers.<KxsCampUser>lambdaQuery().eq(KxsCampUser::getCampId, kxsCamp.getId()));
+//            //清除参与创客的所有统计数据然后封装在map里方便统计
+//            Map<Integer, KxsCampUser> campUsersMap = new HashMap<>();
+//            for (KxsCampUser campUser : campUsers) {
+//                KxsCampUser kxsCampUser = new KxsCampUser();
+//                BeanUtil.copyProperties(campUser, kxsCampUser);
+//                kxsCampUser.setTeamOrderPool(BigDecimal.ZERO);
+//                kxsCampUser.setTeamLeaderPool(BigDecimal.ZERO);
+//                kxsCampUser.setTeamOrderNum(0);
+//                kxsCampUser.setTeamLeaderNum(0);
+//                kxsCampUser.setTeamOpenNum(0);
+//                campUsersMap.put(campUser.getUserId(), kxsCampUser);
+//            }
+//
+//            //转换为userID集合
+//            List<Integer> userIds = campUsers.stream().map(KxsCampUser::getUserId).toList();
+//
+//
+//            /*
+//             * 查询当前活动的时间区间所有电签大机的订单
+//             */
+//            R<List<ShopOrderGoodsUserVO>> ordersR = remoteKxsProductService.getDateBetweenOrders(LocalDateTimeUtil.format(kxsCamp.getStartTime(), DatePattern.NORM_DATETIME_PATTERN)
+//                    , LocalDateTimeUtil.format(kxsCamp.getEndTime(), DatePattern.NORM_DATETIME_PATTERN), SecurityConstants.FROM_IN);
+//            List<ShopOrderGoodsUserVO> orders = RetOps.of(ordersR)
+//                    .getData()
+//                    .orElse(Collections.emptyList());
+//            //循环区间订单查询用户的上级是否包含参与创客的ID
+//            for (ShopOrderGoodsUserVO order : orders) {
+//                //如果是参与者自己下的单
+//                if (userIds.contains(order.getUserId())) {
+//                    int currentNum = NumberUtil.div(order.getTotalPrice(), 600).intValue();
+//                    //刷新参与创客的团队累计
+//                    KxsCampUser kxsCampUser = campUsersMap.get(order.getUserId());
+//                    BigDecimal amount = NumberUtil.mul(NumberUtil.div(order.getTotalPrice(), 600), 90);
+//                    totalBonusPool = NumberUtil.add(totalBonusPool, amount);
+//                    //兑换券下单
+//                    kxsCampUser.setTeamOrderPool(NumberUtil.add(kxsCampUser.getTeamOrderPool(), amount));
+//                    kxsCampUser.setTeamOrderNum(kxsCampUser.getTeamOrderNum() + currentNum);
+////                    if(order.getId() == 27 || order.getId() == 28){
+////                        //大小盟主下单, 奖金池+60,订单数+1
+////                        kxsCampUser.setTeamLeaderPool(NumberUtil.add(kxsCampUser.getTeamLeaderPool(), 60));
+////                        kxsCampUser.setTeamLeaderNum(kxsCampUser.getTeamLeaderNum() + 1);
+////                        currentNum = 1;
+////                    }
+//                    orderNum += currentNum;
+//                    continue;
+//                }
+//
+//                R<KxsUser> kxsUserR = remoteKxsUserService.loadUserById(order.getUserId(), SecurityConstants.FROM_IN);
+//                KxsUser user = RetOps.of(kxsUserR)
+//                        .getData()
+//                        .orElseThrow(() -> new GlobalCustomerException(ErrorTypeEnum.USER_NOT_FOUND.getDescription()));
+//                //下单用户的上级路径
+//                String[] pidPaths = user.getPidPath().split(",");
+//                //通过用户的pidPath倒序查找最近所属的上级
+//                Integer userId = SysUtils.checkUserIsChildren(pidPaths, userIds);
+//                if(userId != null){
+//                    int currentNum = NumberUtil.div(order.getTotalPrice(), 600).intValue();
+//                    //刷新参与创客的团队累计
+//                    KxsCampUser kxsCampUser = campUsersMap.get(userId);
+//                    BigDecimal amount = NumberUtil.mul(NumberUtil.div(order.getTotalPrice(), 600), 90);
+//                    totalBonusPool = NumberUtil.add(totalBonusPool, amount);
+//
+//                    kxsCampUser.setTeamOrderPool(NumberUtil.add(kxsCampUser.getTeamOrderPool(), amount));
+//                    kxsCampUser.setTeamOrderNum(kxsCampUser.getTeamOrderNum() + currentNum);
+////                    if(order.getId() == 27 || order.getId() == 28){
+////                        //大小盟主下单, 奖金池+60,订单数+1
+////                        kxsCampUser.setTeamLeaderPool(NumberUtil.add(kxsCampUser.getTeamLeaderPool(), 60));
+////                        kxsCampUser.setTeamLeaderNum(kxsCampUser.getTeamLeaderNum() + 1);
+////                        currentNum = 1;
+////                    }
+//                    orderNum += currentNum;
+//                }
+//            }
+//
+//            /*
+//             * 查询活动区间开通的大盟主添加到奖金池
+//             */
+//            R<List<KxsLeader>> leadersR = remoteKxsUserService.getDateBetweenLeaders(LocalDateTimeUtil.format(kxsCamp.getStartTime(), DatePattern.NORM_DATETIME_PATTERN)
+//                    , LocalDateTimeUtil.format(kxsCamp.getEndTime(), DatePattern.NORM_DATETIME_PATTERN), SecurityConstants.FROM_IN);
+//            List<KxsLeader> leaders = RetOps.of(leadersR)
+//                    .getData()
+//                    .orElse(Collections.emptyList());
+//            for (KxsLeader leader : leaders) {
+//                //如果是参与者自己下的单
+//                if (userIds.contains(leader.getUserId())) {
+//                    BigDecimal amount;
+//                    if(leader.getLeaderType().equals(LeaderTypeEnum.SMALL_LEADER.getType())){
+//                        amount = new BigDecimal("2000");
+//                    }else{
+//                        amount = new BigDecimal("8000");
 //                    }
-                    orderNum += currentNum;
-                    continue;
-                }
-
-                R<KxsUser> kxsUserR = remoteKxsUserService.loadUserById(order.getUserId(), SecurityConstants.FROM_IN);
-                KxsUser user = RetOps.of(kxsUserR)
-                        .getData()
-                        .orElseThrow(() -> new GlobalCustomerException(ErrorTypeEnum.USER_NOT_FOUND.getDescription()));
-                //下单用户的上级路径
-                String[] pidPaths = user.getPidPath().split(",");
-                //通过用户的pidPath倒序查找最近所属的上级
-                Integer userId = SysUtils.checkUserIsChildren(pidPaths, userIds);
-                if(userId != null){
-                    int currentNum = NumberUtil.div(order.getTotalPrice(), 600).intValue();
-                    //刷新参与创客的团队累计
-                    KxsCampUser kxsCampUser = campUsersMap.get(userId);
-                    BigDecimal amount = NumberUtil.mul(NumberUtil.div(order.getTotalPrice(), 600), 90);
-                    totalBonusPool = NumberUtil.add(totalBonusPool, amount);
-
-                    kxsCampUser.setTeamOrderPool(NumberUtil.add(kxsCampUser.getTeamOrderPool(), amount));
-                    kxsCampUser.setTeamOrderNum(kxsCampUser.getTeamOrderNum() + currentNum);
-//                    if(order.getId() == 27 || order.getId() == 28){
-//                        //大小盟主下单, 奖金池+60,订单数+1
-//                        kxsCampUser.setTeamLeaderPool(NumberUtil.add(kxsCampUser.getTeamLeaderPool(), 60));
-//                        kxsCampUser.setTeamLeaderNum(kxsCampUser.getTeamLeaderNum() + 1);
-//                        currentNum = 1;
+//                    totalBonusPool = NumberUtil.add(totalBonusPool, amount);
+//
+//                    //刷新参与创客的团队累计
+//                    KxsCampUser kxsCampUser = campUsersMap.get(leader.getUserId());
+//                    kxsCampUser.setTeamLeaderPool(NumberUtil.add(kxsCampUser.getTeamLeaderPool(), amount));
+//                    kxsCampUser.setTeamLeaderNum(kxsCampUser.getTeamLeaderNum() + 1);
+//                    orderNum += 1;
+//                    log.info("参与者{}自己下单盟主,进入到{}奖金池", leader.getUserId(), kxsCamp.getTitle());
+//                    continue;
+//                }
+//                //查询此盟主的上级
+//                R<KxsUser> kxsUserR = remoteKxsUserService.loadUserById(leader.getUserId(), SecurityConstants.FROM_IN);
+//                KxsUser user = RetOps.of(kxsUserR)
+//                        .getData()
+//                        .orElseThrow(() -> new GlobalCustomerException(ErrorTypeEnum.USER_NOT_FOUND.getDescription()));
+//                //下单用户的上级路径
+//                String[] pidPaths = user.getPidPath().split(",");
+//                //通过用户的pidPath倒序查找最近所属的上级
+//                Integer userId = SysUtils.checkUserIsChildren(pidPaths, userIds);
+//                if(userId != null){
+//                    BigDecimal amount;
+//                    if(leader.getLeaderType().equals(LeaderTypeEnum.SMALL_LEADER.getType())){
+//                        amount = new BigDecimal("2000");
+//                    }else{
+//                        amount = new BigDecimal("8000");
 //                    }
-                    orderNum += currentNum;
-                }
-            }
-
-            /*
-             * 查询活动区间开通的大盟主添加到奖金池
-             */
-            R<List<KxsLeader>> leadersR = remoteKxsUserService.getDateBetweenLeaders(LocalDateTimeUtil.format(kxsCamp.getStartTime(), DatePattern.NORM_DATETIME_PATTERN)
-                    , LocalDateTimeUtil.format(kxsCamp.getEndTime(), DatePattern.NORM_DATETIME_PATTERN), SecurityConstants.FROM_IN);
-            List<KxsLeader> leaders = RetOps.of(leadersR)
-                    .getData()
-                    .orElse(Collections.emptyList());
-            for (KxsLeader leader : leaders) {
-                //如果是参与者自己下的单
-                if (userIds.contains(leader.getUserId())) {
-                    BigDecimal amount;
-                    if(leader.getLeaderType().equals(LeaderTypeEnum.SMALL_LEADER.getType())){
-                        amount = new BigDecimal("2000");
-                    }else{
-                        amount = new BigDecimal("8000");
-                    }
-                    totalBonusPool = NumberUtil.add(totalBonusPool, amount);
-
-                    //刷新参与创客的团队累计
-                    KxsCampUser kxsCampUser = campUsersMap.get(leader.getUserId());
-                    kxsCampUser.setTeamLeaderPool(NumberUtil.add(kxsCampUser.getTeamLeaderPool(), amount));
-                    kxsCampUser.setTeamLeaderNum(kxsCampUser.getTeamLeaderNum() + 1);
-                    orderNum += 1;
-                    log.info("参与者{}自己下单盟主,进入到{}奖金池", leader.getUserId(), kxsCamp.getTitle());
-                    continue;
-                }
-                //查询此盟主的上级
-                R<KxsUser> kxsUserR = remoteKxsUserService.loadUserById(leader.getUserId(), SecurityConstants.FROM_IN);
-                KxsUser user = RetOps.of(kxsUserR)
-                        .getData()
-                        .orElseThrow(() -> new GlobalCustomerException(ErrorTypeEnum.USER_NOT_FOUND.getDescription()));
-                //下单用户的上级路径
-                String[] pidPaths = user.getPidPath().split(",");
-                //通过用户的pidPath倒序查找最近所属的上级
-                Integer userId = SysUtils.checkUserIsChildren(pidPaths, userIds);
-                if(userId != null){
-                    BigDecimal amount;
-                    if(leader.getLeaderType().equals(LeaderTypeEnum.SMALL_LEADER.getType())){
-                        amount = new BigDecimal("2000");
-                    }else{
-                        amount = new BigDecimal("8000");
-                    }
-                    totalBonusPool = NumberUtil.add(totalBonusPool, amount);
-
-                    //刷新参与创客的团队累计
-                    KxsCampUser kxsCampUser = campUsersMap.get(userId);
-                    kxsCampUser.setTeamLeaderPool(NumberUtil.add(kxsCampUser.getTeamLeaderPool(), amount));
-                    kxsCampUser.setTeamLeaderNum(kxsCampUser.getTeamLeaderNum() + 1);
-                    orderNum += 1;
-                    log.info("创客:{}的团队购买盟主:{},进入到:{}奖金池", userId, leader.getUserId(), kxsCamp.getTitle());
-                }
-            }
-
-            /*
-             * 查询活动区间开机数
-             */
-            for (Integer userId : campUsersMap.keySet()) {
-                KxsCampUser kxsCampUser = campUsersMap.get(userId);
-                HashMap<String, Object> data = new HashMap<>();
-                data.put("UserId", userId);
-                data.put("StartTime", LocalDateTimeUtil.format(kxsCamp.getStartTime(), DatePattern.PURE_DATE_PATTERN));
-                data.put("EndTime", LocalDateTimeUtil.format(kxsCamp.getStartTime(), DatePattern.PURE_DATE_PATTERN));
-                R resR = remoteOldService.teamOpenTotalData(JSON.toJSONString(data));
-                if(resR.getStatus() == 1){
-                    if(resR.getData() != null){
-                        JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(resR.getData()));
-                        int total = jsonObject.getInteger("TeamPosMerchantCount")
-                                + jsonObject.getInteger("TeamSimMerchantCount")
-                                + jsonObject.getInteger("TeamMpMerchantCount");
-                        openNum += total;
-                        kxsCampUser.setTeamOpenNum(kxsCampUser.getTeamOpenNum() + total);
-                    }
-                }
-            }
-
-            kxsCamp.setBonusPool(totalBonusPool);
-            kxsCamp.setOrderNum(orderNum);
-            kxsCamp.setOpenNum(openNum);
-            baseMapper.updateById(kxsCamp);
-            //刷新参与创客的统计
-            kxsCampUserService.updateBatchById(new ArrayList<>(campUsersMap.values()));
-            log.info("训练营{}统计结束", kxsCamp.getCampNum());
-        }
-
-    }
-
+//                    totalBonusPool = NumberUtil.add(totalBonusPool, amount);
+//
+//                    //刷新参与创客的团队累计
+//                    KxsCampUser kxsCampUser = campUsersMap.get(userId);
+//                    kxsCampUser.setTeamLeaderPool(NumberUtil.add(kxsCampUser.getTeamLeaderPool(), amount));
+//                    kxsCampUser.setTeamLeaderNum(kxsCampUser.getTeamLeaderNum() + 1);
+//                    orderNum += 1;
+//                    log.info("创客:{}的团队购买盟主:{},进入到:{}奖金池", userId, leader.getUserId(), kxsCamp.getTitle());
+//                }
+//            }
+//
+//            /*
+//             * 查询活动区间开机数
+//             */
+//            for (Integer userId : campUsersMap.keySet()) {
+//                KxsCampUser kxsCampUser = campUsersMap.get(userId);
+//                HashMap<String, Object> data = new HashMap<>();
+//                data.put("UserId", userId);
+//                data.put("StartTime", LocalDateTimeUtil.format(kxsCamp.getStartTime(), DatePattern.PURE_DATE_PATTERN));
+//                data.put("EndTime", LocalDateTimeUtil.format(kxsCamp.getStartTime(), DatePattern.PURE_DATE_PATTERN));
+//                R resR = remoteOldService.teamOpenTotalData(JSON.toJSONString(data));
+//                if(resR.getStatus() == 1){
+//                    if(resR.getData() != null){
+//                        JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(resR.getData()));
+//                        int total = jsonObject.getInteger("TeamPosMerchantCount")
+//                                + jsonObject.getInteger("TeamSimMerchantCount")
+//                                + jsonObject.getInteger("TeamMpMerchantCount");
+//                        openNum += total;
+//                        kxsCampUser.setTeamOpenNum(kxsCampUser.getTeamOpenNum() + total);
+//                    }
+//                }
+//            }
+//
+//            kxsCamp.setBonusPool(totalBonusPool);
+//            kxsCamp.setOrderNum(orderNum);
+//            kxsCamp.setOpenNum(openNum);
+//            baseMapper.updateById(kxsCamp);
+//            //刷新参与创客的统计
+//            kxsCampUserService.updateBatchById(new ArrayList<>(campUsersMap.values()));
+//            log.info("训练营{}统计结束", kxsCamp.getCampNum());
+//        }
+//
+//    }
 
 
     /**
      * 状态变更
      *
      * @param campT 营地
-     * @param now  现在
+     * @param now   现在
      */
-    private <T> void statusChange(T campT, LocalDateTime now){
-        if(campT instanceof KxsCamp camp){
-            if(camp.getEndTime().isBefore(now)){
+    private <T> void statusChange(T campT, LocalDateTime now) {
+        if (campT instanceof KxsCamp camp) {
+            if (camp.getEndTime().isBefore(now)) {
                 camp.setStatus(CampStatusEnum.STATUS_END.getType());
             } else if (LocalDateTimeUtil.isIn(now, camp.getStartTime(), camp.getEndTime(), false, false)) {
                 camp.setStatus(CampStatusEnum.STATUS_NORMAL.getType());
-            }else {
+            } else {
                 camp.setStatus(CampStatusEnum.STATUS_CLOSE.getType());
             }
         }
-        if(campT instanceof CampPageVO camp){
-            if(camp.getEndTime().isBefore(now)){
+        if (campT instanceof CampPageVO camp) {
+            if (camp.getEndTime().isBefore(now)) {
                 camp.setStatus(CampStatusEnum.STATUS_END.getType());
             } else if (LocalDateTimeUtil.isIn(now, camp.getStartTime(), camp.getEndTime(), false, false)) {
                 camp.setStatus(CampStatusEnum.STATUS_NORMAL.getType());
-            }else {
+            } else {
                 camp.setStatus(CampStatusEnum.STATUS_CLOSE.getType());
             }
         }

+ 40 - 1
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/impl/KxsSchoolMenuServiceImpl.java

@@ -1,11 +1,23 @@
 package com.kxs.system.biz.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kxs.system.api.model.KxsSchoolStudy;
+import com.kxs.system.api.vo.kxsapp.school.SchoolFirstMenuVO;
 import com.kxs.system.biz.mapper.KxsSchoolMenuMapper;
 import com.kxs.system.api.model.KxsSchoolMenu;
+import com.kxs.system.biz.mapper.KxsSchoolStudyMapper;
 import com.kxs.system.biz.service.KxsSchoolMenuService;
+import com.kxs.system.biz.service.KxsSchoolStudyService;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 商学院创客学堂分类(KxsSchoolMenu)表服务实现类
  *
@@ -13,7 +25,34 @@ import org.springframework.stereotype.Service;
  * @since 2023-12-15 12:16:31
  */
 @Service("kxsSchoolMenuService")
+@RequiredArgsConstructor
 public class KxsSchoolMenuServiceImpl extends ServiceImpl<KxsSchoolMenuMapper, KxsSchoolMenu> implements KxsSchoolMenuService {
-
+    private final KxsSchoolMenuMapper kxsSchoolMenuMapper;
+    private final KxsSchoolStudyMapper kxsSchoolStudyMapper;
+    @Override
+    public Object firstMenu() {
+        List<KxsSchoolMenu> list = list(Wrappers.<KxsSchoolMenu>query().lambda().isNotNull(KxsSchoolMenu::getPid).ne(KxsSchoolMenu::getPid,0));
+        ArrayList<SchoolFirstMenuVO> schoolFirstMenuVOS = new ArrayList<>();
+        for (KxsSchoolMenu kxsSchoolMenu : list) {
+            SchoolFirstMenuVO schoolFirstMenuVO = new SchoolFirstMenuVO();
+            BeanUtil.copyProperties(kxsSchoolMenu,schoolFirstMenuVO);
+            //获取pid为当前类型id的类型
+            long count = count(Wrappers.<KxsSchoolMenu>query().lambda().eq(KxsSchoolMenu::getPid, kxsSchoolMenu.getId()));
+            schoolFirstMenuVO.setChildCount(count);//下级数量
+            //获取当前时间
+            LocalDateTime now = LocalDateTime.now();
+            //获取当前时间之前三天的时间
+            LocalDateTime threeDaysBefore = now.minusDays(3);
+            List<KxsSchoolStudy> kxsSchoolStudies = kxsSchoolStudyMapper.selectList(Wrappers.<KxsSchoolStudy>query().lambda().eq(KxsSchoolStudy::getMenuId,kxsSchoolMenu.getId()).between(KxsSchoolStudy::getCreateTime, threeDaysBefore, now));
+            //三天内存在数据则返回有更新
+            if (kxsSchoolStudies != null && kxsSchoolStudies.size() != 0){
+                schoolFirstMenuVO.setIsUpdate(1);//是否更新
+            }else {
+                schoolFirstMenuVO.setIsUpdate(0);//是否更新
+            }
+            schoolFirstMenuVOS.add(schoolFirstMenuVO);
+        }
+        return schoolFirstMenuVOS;
+    }
 }
 

+ 31 - 0
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/impl/KxsSchoolStudyServiceImpl.java

@@ -1,11 +1,18 @@
 package com.kxs.system.biz.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kxs.system.api.vo.kxsapp.school.SchoolListVO;
 import com.kxs.system.biz.mapper.KxsSchoolStudyMapper;
 import com.kxs.system.api.model.KxsSchoolStudy;
 import com.kxs.system.biz.service.KxsSchoolStudyService;
+import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+
 /**
  * 商学院创客学堂(KxsSchoolStudy)表服务实现类
  *
@@ -15,5 +22,29 @@ import org.springframework.stereotype.Service;
 @Service("kxsSchoolStudyService")
 public class KxsSchoolStudyServiceImpl extends ServiceImpl<KxsSchoolStudyMapper, KxsSchoolStudy> implements KxsSchoolStudyService {
 
+    @Override
+    public Object schoolList(Page<KxsSchoolStudy> page, Integer menuId) {
+        //根据创建时间获取数据
+        Page<KxsSchoolStudy> kxsSchoolStudyPage = page(page, Wrappers.<KxsSchoolStudy>lambdaQuery().eq(KxsSchoolStudy::getMenuId, menuId).orderByDesc(KxsSchoolStudy::getCreateTime));
+        ArrayList<SchoolListVO> schoolListVOS = new ArrayList<>();
+        //最新标记
+        int isUpdate = 1;
+        //根据取出顺序第一条数据既是最新数据
+        for (KxsSchoolStudy record : kxsSchoolStudyPage.getRecords()) {
+            SchoolListVO schoolListVO = new SchoolListVO();
+            BeanUtil.copyProperties(record,schoolListVO);
+            schoolListVO.setIsUpdate(isUpdate);
+            schoolListVOS.add(schoolListVO);
+            //取出第一条数据后修改标记
+            if (isUpdate == 1){
+                isUpdate = 0;
+            }
+        }
+        //构造返回数据
+        Page<SchoolListVO> schoolListVOPage = new Page<>();
+        schoolListVOPage.setTotal(kxsSchoolStudyPage.getTotal());
+        schoolListVOPage.setRecords(schoolListVOS);
+        return schoolListVOPage;
+    }
 }
 

+ 10 - 1
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/impl/KxsServiceCenterServiceImpl.java

@@ -1,9 +1,13 @@
 package com.kxs.system.biz.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kxs.system.api.vo.kxsapp.serviceCenter.ServiceCenterListVO;
 import com.kxs.system.biz.mapper.KxsServiceCenterMapper;
 import com.kxs.system.api.model.KxsServiceCenter;
 import com.kxs.system.biz.service.KxsServiceCenterService;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 /**
@@ -13,7 +17,12 @@ import org.springframework.stereotype.Service;
  * @since 2024-03-01 17:26:39
  */
 @Service("kxsServiceCenterService")
+@RequiredArgsConstructor
 public class KxsServiceCenterServiceImpl extends ServiceImpl<KxsServiceCenterMapper, KxsServiceCenter> implements KxsServiceCenterService {
-
+    private final KxsServiceCenterMapper kxsServiceCenterMapper;
+    @Override
+    public IPage<ServiceCenterListVO> ServiceCenterList(Page<ServiceCenterListVO> page, Long menuId) {
+        return kxsServiceCenterMapper.ServiceCenterList(page,menuId);
+    }
 }
 

+ 1 - 1
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/task/KxsSystemTask.java

@@ -44,7 +44,7 @@ public class KxsSystemTask {
     @GetMapping("/prizePoolIsRefreshed")
     public void prizePoolIsRefreshed(@RequestParam("param") String para)  {
 
-        kxsCampService.prizePoolIsRefreshed();
+//        kxsCampService.prizePoolIsRefreshed();
 
     }
 

+ 1 - 1
kxs-system/kxs-system-biz/src/main/resources/mapper/KxsActivityMarketMapper.xml

@@ -21,7 +21,7 @@
         <where>
             a.del_flag = '0'
             <if test="menuId != null and menuId != ''">
-                AND u.menu_id = #{menuId}
+                AND a.menu_id = #{menuId}
             </if>
         </where>
     </select>

+ 30 - 0
kxs-system/kxs-system-biz/src/main/resources/mapper/KxsCampMapper.xml

@@ -38,6 +38,8 @@
         group by a.id
         order by id desc
     </select>
+
+
     <select id="selectByUserId" resultType="com.kxs.system.api.model.KxsCampUser">
         SELECT a.id, a.status, a.camp_num, a.camp_type, a.pic_url, a.title
         from kxs_camp a
@@ -48,5 +50,33 @@
             and a.end_time <![CDATA[ >= ]]> #{now}
         </where>
     </select>
+    <select id="selectUserCamp" resultType="com.kxs.system.api.model.KxsCamp">
+        SELECT a.id, a.status, a.camp_num, a.camp_type, a.pic_url, a.title, bonus_pool, open_num, order_num
+        from kxs_camp a
+        left join kxs_camp_user b on a.id = b.camp_id
+        <where>
+            and a.del_flag = 0
+            and b.user_id =  #{userId}
+            and a.start_time <![CDATA[ <= ]]> #{now}
+            and a.end_time <![CDATA[ >= ]]> #{now}
+        </where>
+        limit 1
+    </select>
+    <select id="selectUsersCamp" resultType="com.kxs.system.api.model.KxsCampUser">
+        SELECT b.id, b.camp_id, b.user_id, b.team_order_num, b.team_order_pool, b.team_leader_pool, b.team_open_num, b.team_leader_num
+        from kxs_camp a
+        left join kxs_camp_user b on a.id = b.camp_id
+        <where>
+            and a.del_flag = 0
+            and b.user_id in
+            <foreach collection="pids" item="userId" index="index" open="(" close=")" separator=",">
+                #{userId}
+            </foreach>
+            and a.start_time <![CDATA[ <= ]]> #{now}
+            and a.end_time <![CDATA[ >= ]]> #{now}
+        </where>
+        ORDER BY FIELD(id, <foreach collection="pids" item="userId" separator=","> #{userId} </foreach>)
+        limit 1
+    </select>
 
 </mapper>

+ 3 - 0
kxs-system/kxs-system-biz/src/main/resources/mapper/KxsServiceCenterMapper.xml

@@ -16,5 +16,8 @@
         <result column="update_by" property="updateBy" />
 
     </resultMap>
+    <select id="ServiceCenterList" resultType="com.kxs.system.api.vo.kxsapp.serviceCenter.ServiceCenterListVO">
+        select id,title,sort from kxs_service_center where menu_id = #{menuId}
+    </select>
 
 </mapper>

+ 1 - 1
kxs-system/kxs-system-biz/src/main/resources/mapper/KxsUserMsgMapper.xml

@@ -22,7 +22,7 @@
 
     </resultMap>
     <select id="getByPage" resultType="com.kxs.system.api.vo.kxsapp.userMsg.UserMsgPageVO">
-        select id, title, summary, msg_type, push_time, url from kxs_user_msg a
+        select id, title, summary, msg_type, push_time, url,bg_pic,read_flag from kxs_user_msg a
         <where>
             a.del_flag = '0'
         </where>

+ 8 - 0
kxs-transfer/src/main/java/com/kxs/transfer/api/service/sys/impl/KxsMorningServiceImpl.java

@@ -76,6 +76,14 @@ public class KxsMorningServiceImpl extends ServiceImpl<KxsMorningMapper, KxsMorn
                 case "BannerPhoto":
                     morning.setBannerPhoto(validFieldDataMap.get(field).toString());
                     break;
+                case "Sort":
+                    long start = Long.parseLong(validFieldDataMap.get(field).toString());
+                    morning.setStartDate(LocalDateTimeUtil.ofUTC(start * 60000));
+                    break;
+                case "QueryCount":
+                    long end = Long.parseLong(validFieldDataMap.get(field).toString());
+                    morning.setEndDate(LocalDateTimeUtil.ofUTC(end * 60000));
+                    break;
                 case "CreateDate":
                     morning.setCreateTime(LocalDateTimeUtil.parse(validFieldDataMap.get(field).toString(), DatePattern.NORM_DATETIME_PATTERN));
                     break;

+ 16 - 9
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/dto/kxsapp/userAccount/UserAmountVariationListDTO.java

@@ -1,9 +1,14 @@
 package com.kxs.user.api.dto.kxsapp.userAccount;
 
+import com.kxs.common.core.valid.NormMonth;
+import com.kxs.common.core.valid.Phone;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
 import lombok.Data;
 
+import java.util.List;
+
 
 /**
  * 收支明细-列表-dto
@@ -15,31 +20,33 @@ import lombok.Data;
 public class UserAmountVariationListDTO {
 
     private Long userId;
-
     /**
-     * 金额类型
+     * 日志类型 add新增 sub减少
      */
-    @Schema(description = "金额类型")
-    private Integer variationType;
+    @Schema(description = "日志类型 1新增 2减少")
+    private String kind;
 
     /**
-     * 日志类型 add新增 sub减少
+     * 收益或支出类型
      */
-    @Schema(description = "日志类型 add新增 sub减少")
-    private String kind;
+    @Schema(description = "收益或支出类型")
+    private List<Integer> changeType;
+
+
 
     /**
      * 月份 2023-08
      */
     @Schema(description = "月份 2023-08")
-    @NotBlank(message = "月份不能为空")
+//    @NotBlank(message = "月份不能为空")
+    @NormMonth
     private String tradeMonth;
 
     /**
      * 品牌机型
      */
     @Schema(description = "品牌机型")
-    private Integer brandId;
+    private List<Integer> brandIds;
 
 
 

+ 5 - 1
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/vo/kxsapp/userAccount/UserAmountVariationListVO.java

@@ -58,7 +58,11 @@ public class UserAmountVariationListVO implements Serializable {
     private String variationCause;
 
 
-
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
 
 
 	

+ 11 - 0
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/vo/kxsapp/userAccount/VariationListVO.java

@@ -0,0 +1,11 @@
+package com.kxs.user.api.vo.kxsapp.userAccount;
+
+import lombok.Data;
+
+@Data
+public class VariationListVO {
+    private Long id;
+    private Long changeTypeId;
+    private String name;
+    private String kind;
+}

+ 3 - 3
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/vo/kxsapp/userAccount/VariationTypeListVO.java

@@ -25,17 +25,17 @@ public class VariationTypeListVO implements Serializable {
      * 变动类型名称
      */
     @Schema(description = "变动类型名称")
-    private String changeType;
+    private String name;
 
 
     /**
      * 变动类型标识
      */
     @Schema(description = "变动类型标识")
-    private Integer changeTypeId;
-
+    private Integer id;
 
 
+    private Integer kind;
 
 
 	

+ 8 - 5
kxs-user/kxs-user-biz/pom.xml

@@ -79,11 +79,6 @@
             <groupId>com.kxs</groupId>
             <artifactId>kxs-product-api</artifactId>
         </dependency>
-        <!-- 实现对 RocketMQ 的自动化配置 -->
-        <dependency>
-            <groupId>com.kxs</groupId>
-            <artifactId>kxs-common-mq</artifactId>
-        </dependency>
 
     </dependencies>
 
@@ -183,6 +178,14 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>15</source>
+                    <target>15</target>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>

+ 0 - 42
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/controller/kxsapp/TestMq.java

@@ -1,42 +0,0 @@
-package com.kxs.user.biz.controller.kxsapp;
-
-import com.kxs.common.core.util.R;
-import com.kxs.common.security.annotation.Inner;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.rocketmq.client.producer.SendResult;
-import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
-import org.apache.rocketmq.spring.core.RocketMQListener;
-import org.apache.rocketmq.spring.core.RocketMQTemplate;
-import org.springframework.messaging.Message;
-import org.springframework.messaging.support.MessageBuilder;
-import org.springframework.stereotype.Service;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@Slf4j
-@RestController
-@RequiredArgsConstructor
-@RocketMQMessageListener(topic = "test-topic-1", consumerGroup = "test-group")
-public class TestMq implements RocketMQListener<String> {
-
-    private final RocketMQTemplate rocketMQTemplate;
-
-    public void onMessage(String message) {
-        log.info("received message: {}", message);
-    }
-
-
-    @Inner(value = false)
-    @GetMapping("/send/msg")
-    public R sendMsg1 (){
-        try {
-            Message<String> msg = MessageBuilder.withPayload("Hello,RocketMQ").build();
-            //发送信息
-            rocketMQTemplate.send("test-topic-1", msg);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return R.ok();
-    }
-}

+ 13 - 4
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/controller/kxsapp/UserAccountController.java

@@ -146,16 +146,25 @@ public class UserAccountController {
 
 
     /**
-     * 收支明细-筛选变动类型
+     * 收支明细-获取收益及支出类别
      *
-     * @return 收支明细-筛选变动类型
+     * @return 收支明细-获取收益及支出类别
      */
     @GetMapping("/variationTypeList")
-    public R variationTypeList(@RequestParam("kind") String kind) {
+    public R variationTypeList(@RequestParam("type") String type) {
 
-        return R.ok(kxsUserAmountLogService.variationTypeList(kind));
+        return R.ok(kxsUserAmountLogService.variationTypeList(type));
     }
+    /**
+     * 收支明细-获取收益及支出类别明细
+     *
+     * @return 收支明细-获取收益及支出类别明细
+     */
+    @GetMapping("/variationList")
+    public R variationList(@RequestParam("changeTypeId") String changeTypeId) {
 
+        return R.ok(kxsUserAmountLogService.variationList(changeTypeId));
+    }
     /**
      * 余额变动
      *

+ 9 - 2
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/mapper/KxsUserAmountLogMapper.java

@@ -5,11 +5,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kxs.user.api.dto.kxsapp.userAccount.UserAmountVariationListDTO;
 import com.kxs.user.api.model.KxsUserAmountLog;
-import com.kxs.user.api.vo.kxsapp.userAccount.AmountInExpendTotalVO;
 import com.kxs.user.api.vo.kxsapp.userAccount.UserAmountVariationListVO;
+import com.kxs.user.api.vo.kxsapp.userAccount.VariationListVO;
+import com.kxs.user.api.vo.kxsapp.userAccount.VariationTypeListVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 用户余额记录日志表(KxsUserAmountLog)表数据库访问层
  *
@@ -19,8 +22,12 @@ import org.apache.ibatis.annotations.Param;
 @Mapper
 public interface KxsUserAmountLogMapper extends BaseMapper<KxsUserAmountLog> {
 
-    IPage<UserAmountVariationListVO> getByPage(Page<UserAmountVariationListVO> page, @Param("query") UserAmountVariationListDTO param);
+    IPage<UserAmountVariationListVO> getByPage(Page<UserAmountVariationListVO> page, @Param("query") UserAmountVariationListDTO param, @Param("tableName")String tableName);
 
     void automaticTableCreationTasks(String tableName);
+
+    List<VariationTypeListVO> variationTypeList(String kind);
+
+    List<VariationListVO> variationList(String changeTypeId);
 }
 

+ 2 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/KxsUserAmountLogService.java

@@ -40,5 +40,7 @@ public interface KxsUserAmountLogService extends IService<KxsUserAmountLog> {
      * @return {@link Object}
      */
     Object variationTypeList(String kind);
+
+    Object variationList(String changeTypeId);
 }
 

+ 15 - 22
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/impl/KxsUserAmountLogServiceImpl.java

@@ -1,21 +1,26 @@
 package com.kxs.user.biz.service.impl;
 
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.util.EnumUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kxs.common.core.constant.enums.KindTypeEnum;
+import com.kxs.common.mybatis.handler.MonthTableNameHandler;
 import com.kxs.common.security.util.SecurityUtils;
 import com.kxs.user.api.dto.kxsapp.userAccount.UserAmountVariationListDTO;
 import com.kxs.user.api.vo.kxsapp.userAccount.AmountInExpendTotalVO;
 import com.kxs.user.api.vo.kxsapp.userAccount.UserAmountVariationListVO;
 import com.kxs.common.core.constant.enums.VariationTypeEnum;
+import com.kxs.user.api.vo.kxsapp.userAccount.VariationTypeListVO;
 import com.kxs.user.biz.mapper.KxsUserAmountLogMapper;
 import com.kxs.user.api.model.KxsUserAmountLog;
 import com.kxs.user.biz.service.KxsUserAmountLogService;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -34,7 +39,11 @@ public class KxsUserAmountLogServiceImpl extends ServiceImpl<KxsUserAmountLogMap
     public IPage<UserAmountVariationListVO> getByPage(Page<UserAmountVariationListVO> page, UserAmountVariationListDTO param) {
 
         param.setUserId(SecurityUtils.getUser().getId());
-        return baseMapper.getByPage(page, param);
+        //拼接表名
+        String tableName = param.getTradeMonth();
+        String[] split = tableName.split("-");
+        tableName = "kxs_user_amount_log_" + split[0] + split[1];
+        return baseMapper.getByPage(page, param,tableName);
     }
 
     @Override
@@ -66,28 +75,12 @@ public class KxsUserAmountLogServiceImpl extends ServiceImpl<KxsUserAmountLogMap
 
     @Override
     public Object variationTypeList(String kind) {
+        return baseMapper.variationTypeList(kind);
+    }
 
-        //查询枚举类封装为list
-        List<Object> types = EnumUtil.getFieldValues(VariationTypeEnum.class, "type");
-        List<Object> description = EnumUtil.getFieldValues(VariationTypeEnum.class, "description");
-
-        ArrayList<Map<String, Object>> result = new ArrayList<>();
-        for (int i = 0; i < types.size(); i++) {
-            if(KindTypeEnum.ADD.getType().equals(kind) && (int)types.get(i) < 100){
-                HashMap<String, Object> accountChangeType = new HashMap<>();
-                accountChangeType.put("changeTypeId", types.get(i));
-                accountChangeType.put("changeType", description.get(i));
-                result.add(accountChangeType);
-            }
-            if(KindTypeEnum.SUB.getType().equals(kind) && (int)types.get(i) > 100){
-                HashMap<String, Object> accountChangeType = new HashMap<>();
-                accountChangeType.put("changeTypeId", types.get(i));
-                accountChangeType.put("changeType", description.get(i));
-                result.add(accountChangeType);
-            }
-        }
-
-        return result;
+    @Override
+    public Object variationList(String changeTypeId) {
+        return baseMapper.variationList(changeTypeId);
     }
 }
 

+ 38 - 9
kxs-user/kxs-user-biz/src/main/resources/mapper/KxsUserAmountLogMapper.xml

@@ -26,20 +26,49 @@
         CREATE  TABLE IF NOT EXISTS `${tableName}` LIKE kxs_user_amount_log;
     </update>
     <select id="getByPage" resultType="com.kxs.user.api.vo.kxsapp.userAccount.UserAmountVariationListVO">
-        SELECT * from kxs_user_amount_log
+        SELECT * FROM ${tableName}
         <where>
-            and del_flag = 0
-            and user_id = #{query.userId}
-            <if test="query.brandId != null">
-                and brand_id = #{query.brandId}
-            </if>
+            AND del_flag = 0
+            AND user_id = #{query.userId}
             <if test="query.kind != null and query.kind != ''">
-                and kind = #{query.kind}
+                AND kind = #{query.kind}
+            </if>
+            <if test="query.brandIds != null">
+                AND ${tableName}.brand_id IN
+                <foreach item="brandId" index="index" collection="query.brandIds" open="(" separator="," close=")">
+                    #{brandId}
+                </foreach>
             </if>
-            <if test="query.variationType != null">
-                and variation_type = #{query.variationType}
+            <if test="query.changeType != null">
+                AND variation_type IN (
+                     SELECT
+                        kctk.id
+                    FROM
+                        kxs_change_type_kind kctk
+                        LEFT JOIN
+                            kxs_change_type kct
+                        ON
+                        kctk.change_type_id = kct.id
+                    WHERE
+                 kct.id In
+                <foreach item="ct" index="index" collection="query.changeType" open="(" separator="," close=")">
+                    #{ct}
+                </foreach>
+                 )
             </if>
         </where>
     </select>
+    <select id="variationTypeList" resultType="com.kxs.user.api.vo.kxsapp.userAccount.VariationTypeListVO">
+        SELECT * FROM kxs_change_type WHERE del_flag = 0
+        <if test="kind != null and kind != '' and kind != 3">
+            AND kind = #{kind}
+        </if>
+    </select>
+    <select id="variationList" resultType="com.kxs.user.api.vo.kxsapp.userAccount.VariationListVO">
+        SELECT * FROM kxs_change_type_kind WHERE del_flag = 0
+        <if test="changeTypeId != null and changeTypeId != '' and changeTypeId != 0">
+            AND change_type_id = #{changeTypeId}
+        </if>
+    </select>
 
 </mapper>

+ 5 - 0
pom.xml

@@ -235,6 +235,11 @@
                 <artifactId>kxs-common-mybatis</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.kxs</groupId>
+                <artifactId>kxs-common-idempotent</artifactId>
+                <version>${project.version}</version>
+            </dependency>
             <dependency>
                 <groupId>com.kxs</groupId>
                 <artifactId>kxs-common-seata</artifactId>