diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml deleted file mode 100644 index b5ab91f5b202bc85819083ec71dbd7bea0fbc9eb..0000000000000000000000000000000000000000 --- a/.idea/sqldialects.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/IDCCService.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/IDCCService.java new file mode 100644 index 0000000000000000000000000000000000000000..7872558e37bbce2d5685f0c66a6fd2131f3d5a60 --- /dev/null +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/IDCCService.java @@ -0,0 +1,14 @@ +package cn.bugstack.trigger.api; + +import cn.bugstack.trigger.api.response.Response; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description DCC 动态配置中心 + * @create 2024-07-13 08:58 + */ +public interface IDCCService { + + Response updateConfig(String key, String value); + +} diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/IRaffleActivityService.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/IRaffleActivityService.java index c6e3478c36511f003fdbb993271013a2283ee6bc..d075dd90fa1c8a5df82849e60f279fdf4c211c92 100644 --- a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/IRaffleActivityService.java +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/IRaffleActivityService.java @@ -1,10 +1,10 @@ package cn.bugstack.trigger.api; -import cn.bugstack.trigger.api.dto.ActivityDrawRequestDTO; -import cn.bugstack.trigger.api.dto.ActivityDrawResponseDTO; -import cn.bugstack.trigger.api.dto.UserActivityAccountRequestDTO; -import cn.bugstack.trigger.api.dto.UserActivityAccountResponseDTO; -import cn.bugstack.types.model.Response; +import cn.bugstack.trigger.api.dto.*; +import cn.bugstack.trigger.api.response.Response; + +import java.math.BigDecimal; +import java.util.List; /* * @return @@ -14,37 +14,66 @@ import cn.bugstack.types.model.Response; public interface IRaffleActivityService { /** * 活动装配,数据预热缓存 + * * @param activityId 活动ID * @return 装配结果 */ - Response armory(Long activityId); + cn.bugstack.trigger.api.response.Response armory(Long activityId); /** * 活动抽奖接口 + * * @param request 请求对象 * @return 返回结果 */ - Response draw(ActivityDrawRequestDTO request); + cn.bugstack.trigger.api.response.Response draw(ActivityDrawRequestDTO request); + /** * 日历签到返利接口 * * @param userId 用户ID * @return 签到结果 */ - Response calendarSignRebate(String userId); + cn.bugstack.trigger.api.response.Response calendarSignRebate(String userId); + /** * 判断是否完成日历签到返利接口 * * @param userId 用户ID * @return 签到结果 true 已签到,false 未签到 */ - Response isCalendarSignRebate(String userId); + cn.bugstack.trigger.api.response.Response isCalendarSignRebate(String userId); + /** * 查询用户活动账户 * * @param request 请求对象「活动ID、用户ID」 * @return 返回结果「总额度、月额度、日额度」 */ - Response queryUserActivityAccount(UserActivityAccountRequestDTO request); + cn.bugstack.trigger.api.response.Response queryUserActivityAccount(UserActivityAccountRequestDTO request); + + /** + * 查询sku商品集合 + * + * @param activityId 活动ID + * @return 商品集合 + */ + cn.bugstack.trigger.api.response.Response> querySkuProductListByActivityId(Long activityId); + + /** + * 查询用户积分值 + * + * @param userId 用户ID + * @return 可用积分 + */ + cn.bugstack.trigger.api.response.Response queryUserCreditAccount(String userId); + + /** + * 积分支付兑换商品 + * + * @param request 请求对象「用户ID、商品ID」 + * @return 兑换结果 + */ + Response creditPayExchangeSku(SkuProductShopCartRequestDTO request); } diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/IRaffleStrategyService.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/IRaffleStrategyService.java index c2a5c5505bb4b768d880876b69c207c764fc4a74..24c4f0f43f911c910a2a0d866721033a11b77511 100644 --- a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/IRaffleStrategyService.java +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/IRaffleStrategyService.java @@ -1,7 +1,7 @@ package cn.bugstack.trigger.api; import cn.bugstack.trigger.api.dto.*; -import cn.bugstack.types.model.Response; +import cn.bugstack.trigger.api.response.Response; import java.util.List; /* @@ -18,30 +18,31 @@ public interface IRaffleStrategyService { * @param strategyId 策略ID * @return 装配结果 */ - Response strategyArmory(Long strategyId); + cn.bugstack.trigger.api.response.Response strategyArmory(Long strategyId); /** * 查询抽奖奖品列表配置 * - * @param requestDTO 抽奖奖品列表查询请求参数 + * @param request 抽奖奖品列表查询请求参数 * @return 奖品列表数据 */ - Response> queryRaffleAwardList(RaffleAwardListRequestDTO requestDTO); + cn.bugstack.trigger.api.response.Response> queryRaffleAwardList(RaffleAwardListRequestDTO request); - /** - * 随机抽奖接口 - * - * @param requestDTO 请求参数 - * @return 抽奖结果 - */ - Response randomRaffle(RaffleRequestDTO requestDTO); /** * 查询抽奖策略权重规则,给用户展示出抽奖N次后必中奖奖品范围 * * @param request 请求对象 * @return 权重奖品配置列表「这里会返回全部,前端可按需展示一条已达标的,或者一条要达标的」 */ - Response> queryRaffleStrategyRuleWeight(RaffleStrategyRuleWeightRequestDTO request); + cn.bugstack.trigger.api.response.Response> queryRaffleStrategyRuleWeight(RaffleStrategyRuleWeightRequestDTO request); + + /** + * 随机抽奖接口 + * + * @param request 请求参数 + * @return 抽奖结果 + */ + Response randomRaffle(RaffleStrategyRequestDTO request); } diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/ActivityDrawRequestDTO.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/ActivityDrawRequestDTO.java index d59547bca2179ec1698603515ddd929e445e8403..0e173904f9ada14da609a5cd56e9c673978bb321 100644 --- a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/ActivityDrawRequestDTO.java +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/ActivityDrawRequestDTO.java @@ -2,14 +2,16 @@ package cn.bugstack.trigger.api.dto; import lombok.Data; +import java.io.Serializable; + /** - * @ClassName: ActivityDrawRequestDTO - * @Description: 活动抽奖请求对象 - * @Author: zhaoyongfeng - * @Date: 2024/12/10 22:06 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 活动抽奖请求对象 + * @create 2024-04-13 09:29 */ @Data -public class ActivityDrawRequestDTO { +public class ActivityDrawRequestDTO implements Serializable { + /** * 用户ID */ @@ -19,4 +21,5 @@ public class ActivityDrawRequestDTO { * 活动ID */ private Long activityId; + } diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/ActivityDrawResponseDTO.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/ActivityDrawResponseDTO.java index 838a076bf9773adbf02a34edfa2e37a13eb05ac5..7432173c16d1f3c92255f46fef134e86f775b092 100644 --- a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/ActivityDrawResponseDTO.java +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/ActivityDrawResponseDTO.java @@ -5,16 +5,18 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -/* - * @return - * @author zhaoyongfeng - * @description 活动抽奖返回对象 +import java.io.Serializable; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description + * @create 2024-04-13 09:34 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor -public class ActivityDrawResponseDTO { +public class ActivityDrawResponseDTO implements Serializable { // 奖品ID private Integer awardId; diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleAwardListRequestDTO.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleAwardListRequestDTO.java index 8336692d7300f752f519d842776bef2e8619ead5..38832dabfab4be195021c367d7604c14aaae1191 100644 --- a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleAwardListRequestDTO.java +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleAwardListRequestDTO.java @@ -2,14 +2,15 @@ package cn.bugstack.trigger.api.dto; import lombok.Data; +import java.io.Serializable; + /** - * @ClassName: RaffleAwardListRequestDTO - * @Description: 抽奖奖品列表,请求对象 - * @Author: zhaoyongfeng - * @Date: 2024/11/22 16:35 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖奖品列表,请求对象 + * @create 2024-02-14 09:46 */ @Data -public class RaffleAwardListRequestDTO { +public class RaffleAwardListRequestDTO implements Serializable { // 用户ID private String userId; @@ -17,4 +18,3 @@ public class RaffleAwardListRequestDTO { private Long activityId; } - diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleAwardListResponseDTO.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleAwardListResponseDTO.java index b7229db6f80aefe0a1d19ca8f2955a518d8cdb9e..c6e670ea668eb29274ef7ccc6a78203c664e1cca 100644 --- a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleAwardListResponseDTO.java +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleAwardListResponseDTO.java @@ -5,17 +5,18 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serializable; + /** - * @ClassName: RaffleAwardListRequestDTO - * @Description: 抽奖奖品列表,应答对象 - * @Author: zhaoyongfeng - * @Date: 2024/11/22 16:35 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖奖品列表,应答对象 + * @create 2024-02-14 09:43 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor -public class RaffleAwardListResponseDTO { +public class RaffleAwardListResponseDTO implements Serializable { // 奖品ID private Integer awardId; @@ -33,5 +34,3 @@ public class RaffleAwardListResponseDTO { private Integer waitUnLockCount; } - - diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyRequestDTO.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyRequestDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..8b6a8a6057e8efe71c22e0e9e290264d18b11c47 --- /dev/null +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyRequestDTO.java @@ -0,0 +1,18 @@ +package cn.bugstack.trigger.api.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖请求参数 + * @create 2024-02-14 17:26 + */ +@Data +public class RaffleStrategyRequestDTO implements Serializable { + + // 抽奖策略ID + private Long strategyId; + +} diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyResponseDTO.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyResponseDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..1f42c9fc529f81a47984182c7bc54244700479b9 --- /dev/null +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyResponseDTO.java @@ -0,0 +1,26 @@ +package cn.bugstack.trigger.api.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖应答结果 + * @create 2024-02-14 17:26 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RaffleStrategyResponseDTO implements Serializable { + + // 奖品ID + private Integer awardId; + // 排序编号【策略奖品配置的奖品顺序编号】 + private Integer awardIndex; + +} diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyRuleWeightRequestDTO.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyRuleWeightRequestDTO.java index 3b18e5c870b533b65ddf671eaf611104583ad5a9..2e5a5a05b375b475cfbb962d49b45e5aa2a81204 100644 --- a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyRuleWeightRequestDTO.java +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyRuleWeightRequestDTO.java @@ -2,16 +2,19 @@ package cn.bugstack.trigger.api.dto; import lombok.Data; +import java.io.Serializable; + /** - * @ClassName: RaffleStrategyRuleWeightRequestDTO - * @Description: 抽奖策略规则,权重配置,查询N次抽奖可解锁奖品范围,请求对象 - * @Author: zhaoyongfeng - * @Date: 2024/12/26 0:14 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖策略规则,权重配置,查询N次抽奖可解锁奖品范围,请求对象 + * @create 2024-05-03 09:35 */ @Data -public class RaffleStrategyRuleWeightRequestDTO { +public class RaffleStrategyRuleWeightRequestDTO implements Serializable { + // 用户ID private String userId; // 抽奖活动ID private Long activityId; + } diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyRuleWeightResponseDTO.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyRuleWeightResponseDTO.java index 12cbfff35bc42de502b815c1b6e6a94a25425647..8fba965b8b5d52f1037912c0e8ad2019e45809ba 100644 --- a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyRuleWeightResponseDTO.java +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/RaffleStrategyRuleWeightResponseDTO.java @@ -2,16 +2,17 @@ package cn.bugstack.trigger.api.dto; import lombok.Data; +import java.io.Serializable; import java.util.List; /** - * @ClassName: RaffleStrategyRuleWeightResponseDTO - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/26 0:13 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖策略规则,权重配置,查询N次抽奖可解锁奖品范围,应答对象 + * @create 2024-05-03 09:35 */ @Data -public class RaffleStrategyRuleWeightResponseDTO { +public class RaffleStrategyRuleWeightResponseDTO implements Serializable { + // 权重规则配置的抽奖次数 private Integer ruleWeightCount; // 用户在一个活动下完成的总抽奖次数 @@ -26,4 +27,5 @@ public class RaffleStrategyRuleWeightResponseDTO { // 奖品标题 private String awardTitle; } + } diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/SkuProductResponseDTO.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/SkuProductResponseDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..054fe569f23f33878838f39d5fcbb3d601fa7a60 --- /dev/null +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/SkuProductResponseDTO.java @@ -0,0 +1,64 @@ +package cn.bugstack.trigger.api.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description sku商品对象 + * @create 2024-06-15 09:12 + */ +@Data +public class SkuProductResponseDTO implements Serializable { + + /** + * 商品sku + */ + private Long sku; + /** + * 活动ID + */ + private Long activityId; + /** + * 活动个人参与次数ID + */ + private Long activityCountId; + /** + * 库存总量 + */ + private Integer stockCount; + /** + * 剩余库存 + */ + private Integer stockCountSurplus; + /** + * 商品金额【积分】 + */ + private BigDecimal productAmount; + + /** + * 活动商品数量 + */ + private ActivityCount activityCount; + + @Data + public static class ActivityCount { + /** + * 总次数 + */ + private Integer totalCount; + + /** + * 日次数 + */ + private Integer dayCount; + + /** + * 月次数 + */ + private Integer monthCount; + } + +} diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/SkuProductShopCartRequestDTO.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/SkuProductShopCartRequestDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..cee2b2b73675abb1c3381288fb0593d58d03e8e5 --- /dev/null +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/SkuProductShopCartRequestDTO.java @@ -0,0 +1,24 @@ +package cn.bugstack.trigger.api.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 商品购物车请求对象 + * @create 2024-06-15 08:03 + */ +@Data +public class SkuProductShopCartRequestDTO implements Serializable { + + /** + * 用户ID + */ + private String userId; + /** + * sku 商品 + */ + private Long sku; + +} diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/UserActivityAccountRequestDTO.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/UserActivityAccountRequestDTO.java index b8adb219cafd9af31b8bd38d403dac52efde74fa..2dc0abf6fb36e4f3428f72975ada85909a9e6f13 100644 --- a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/UserActivityAccountRequestDTO.java +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/UserActivityAccountRequestDTO.java @@ -2,14 +2,16 @@ package cn.bugstack.trigger.api.dto; import lombok.Data; +import java.io.Serializable; + /** - * @ClassName: UserActivityAccountRequestDTO - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/25 23:25 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 用户活动账户请求对象 + * @create 2024-05-03 07:17 */ @Data -public class UserActivityAccountRequestDTO { +public class UserActivityAccountRequestDTO implements Serializable { + /** * 用户ID */ @@ -19,4 +21,5 @@ public class UserActivityAccountRequestDTO { * 活动ID */ private Long activityId; + } diff --git a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/UserActivityAccountResponseDTO.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/UserActivityAccountResponseDTO.java index 1d5f01d3d130e3131aed78639b9e2c3b05b16a9c..c4a4dbb5a5a7211781173df406d6390a05edc321 100644 --- a/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/UserActivityAccountResponseDTO.java +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/dto/UserActivityAccountResponseDTO.java @@ -5,17 +5,19 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serializable; + /** - * @ClassName: UserActivityAccountReponseDTO - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/25 23:22 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 用户活动账户应答对象 + * @create 2024-05-03 07:18 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor -public class UserActivityAccountResponseDTO { +public class UserActivityAccountResponseDTO implements Serializable { + /** * 总次数 */ @@ -45,4 +47,5 @@ public class UserActivityAccountResponseDTO { * 月次数-剩余 */ private Integer monthCountSurplus; + } diff --git a/bigmarket-types/src/main/java/cn/bugstack/types/model/Response.java b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/response/Response.java similarity index 70% rename from bigmarket-types/src/main/java/cn/bugstack/types/model/Response.java rename to bigmarket-api/src/main/java/cn/bugstack/trigger/api/response/Response.java index 43a3c91c7cb7bb7dc742d11ddc05fd48a8f6b7fc..0df2db8ae06426cb3449fc286d97d07e9977928d 100644 --- a/bigmarket-types/src/main/java/cn/bugstack/types/model/Response.java +++ b/bigmarket-api/src/main/java/cn/bugstack/trigger/api/response/Response.java @@ -1,4 +1,4 @@ -package cn.bugstack.types.model; +package cn.bugstack.trigger.api.response; import lombok.AllArgsConstructor; import lombok.Builder; @@ -7,12 +7,6 @@ import lombok.NoArgsConstructor; import java.io.Serializable; -/** - * @ClassName: Response - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/11/22 16:44 - */ @Data @Builder @NoArgsConstructor diff --git a/bigmarket-app/pom.xml b/bigmarket-app/pom.xml index 8750971d6035d8961c4d04104248e5e862c43940..f56b694f134785a576c28f05191d2de0357d27e3 100644 --- a/bigmarket-app/pom.xml +++ b/bigmarket-app/pom.xml @@ -82,6 +82,10 @@ org.redisson redisson-spring-boot-starter + + org.jeasy + easy-random-core + cn.bugstack.middleware db-router-spring-boot-starter @@ -90,6 +94,29 @@ org.springframework.boot spring-boot-starter-amqp + + + org.apache.dubbo + dubbo + + + org.apache.dubbo + dubbo-spring-boot-starter + + + com.alibaba.nacos + nacos-client + + + org.springframework.cloud + spring-cloud-starter-zookeeper-discovery + + + + plus.gaga + business-behavior-monitor-sdk + 1.1 + cn.bugstack diff --git a/bigmarket-app/src/main/java/cn/bugstack/Application.java b/bigmarket-app/src/main/java/cn/bugstack/Application.java index 37beaba6c9cb543dc220827915d300b4f228b61e..a048a62e4f10c1aeb837848cdd71c6a8b9022be9 100644 --- a/bigmarket-app/src/main/java/cn/bugstack/Application.java +++ b/bigmarket-app/src/main/java/cn/bugstack/Application.java @@ -1,5 +1,6 @@ package cn.bugstack; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -8,6 +9,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @Configurable @EnableScheduling +@EnableDubbo public class Application { public static void main(String[] args){ diff --git a/bigmarket-app/src/main/java/cn/bugstack/config/DCCValueBeanFactory.java b/bigmarket-app/src/main/java/cn/bugstack/config/DCCValueBeanFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..2a217b41aea4a844f1edf58aaba9936754b9cb29 --- /dev/null +++ b/bigmarket-app/src/main/java/cn/bugstack/config/DCCValueBeanFactory.java @@ -0,0 +1,114 @@ +package cn.bugstack.config; + +import cn.bugstack.types.annotations.DCCValue; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.framework.recipes.cache.CuratorCache; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.annotation.Configuration; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +/** + * 基于 Zookeeper 的配置中心实现原理 + */ +@Slf4j +@Configuration +public class DCCValueBeanFactory implements BeanPostProcessor { + + private static final String BASE_CONFIG_PATH = "/big-market-dcc"; + private static final String BASE_CONFIG_PATH_CONFIG = BASE_CONFIG_PATH + "/config"; + + private final CuratorFramework client; + + private final Map dccObjGroup = new HashMap<>(); + + public DCCValueBeanFactory(CuratorFramework client) throws Exception { + this.client = client; + + // 节点判断 + if (null == client.checkExists().forPath(BASE_CONFIG_PATH_CONFIG)) { + client.create().creatingParentsIfNeeded().forPath(BASE_CONFIG_PATH_CONFIG); + log.info("DCC 节点监听 base node {} not absent create new done!", BASE_CONFIG_PATH_CONFIG); + } + + CuratorCache curatorCache = CuratorCache.build(client, BASE_CONFIG_PATH_CONFIG); + curatorCache.start(); + + curatorCache.listenable().addListener((type, oldData, data) -> { + switch (type) { + case NODE_CHANGED: + String dccValuePath = data.getPath(); + Object objBean = dccObjGroup.get(dccValuePath); + if (null == objBean) return; + try { + // 1. getDeclaredField 方法用于获取指定类中声明的所有字段,包括私有字段、受保护字段和公共字段。 + // 2. getField 方法用于获取指定类中的公共字段,即只能获取到公共访问修饰符(public)的字段。 + Field field = objBean.getClass().getDeclaredField(dccValuePath.substring(dccValuePath.lastIndexOf("/") + 1)); + field.setAccessible(true); + field.set(objBean, new String(data.getData())); + field.setAccessible(false); + } catch (Exception e) { + throw new RuntimeException(e); + } + break; + default: + break; + } + }); + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + Class beanClass = bean.getClass(); + Field[] fields = beanClass.getDeclaredFields(); + for (Field field : fields) { + if (!field.isAnnotationPresent(DCCValue.class)) { + continue; + } + + DCCValue dccValue = field.getAnnotation(DCCValue.class); + + String value = dccValue.value(); + if (StringUtils.isBlank(value)) { + throw new RuntimeException(field.getName() + " @DCCValue is not config value config case 「isSwitch/isSwitch:1」"); + } + + String[] splits = value.split(":"); + String key = splits[0]; + String defaultValue = splits.length == 2 ? splits[1] : null; + + try { + // 判断当前节点是否存在,不存在则创建出 Zookeeper 节点 + String keyPath = BASE_CONFIG_PATH_CONFIG.concat("/").concat(key); + if (null == client.checkExists().forPath(keyPath)) { + client.create().creatingParentsIfNeeded().forPath(keyPath); + if (StringUtils.isNotBlank(defaultValue)) { + field.setAccessible(true); + field.set(bean, defaultValue); + field.setAccessible(false); + } + log.info("DCC 节点监听 创建节点 {}", keyPath); + } else { + String configValue = new String(client.getData().forPath(keyPath)); + if (StringUtils.isNotBlank(configValue)) { + field.setAccessible(true); + field.set(bean, configValue); + field.setAccessible(false); + log.info("DCC 节点监听 设置配置 {} {} {}", keyPath, field.getName(), configValue); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + + dccObjGroup.put(BASE_CONFIG_PATH_CONFIG.concat("/").concat(key), bean); + } + return bean; + } + +} diff --git a/bigmarket-app/src/main/java/cn/bugstack/config/ZooKeeperClientConfig.java b/bigmarket-app/src/main/java/cn/bugstack/config/ZooKeeperClientConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..87d323810475cff1f0303ed991b890fee89d48a6 --- /dev/null +++ b/bigmarket-app/src/main/java/cn/bugstack/config/ZooKeeperClientConfig.java @@ -0,0 +1,32 @@ +package cn.bugstack.config; + +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.framework.CuratorFrameworkFactory; +import org.apache.curator.retry.ExponentialBackoffRetry; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(ZookeeperClientConfigProperties.class) +public class ZooKeeperClientConfig { + + /** + * 多参数构建ZooKeeper客户端连接 + * + * @return client + */ + @Bean(name = "zookeeperClient") + public CuratorFramework createWithOptions(ZookeeperClientConfigProperties properties) { + ExponentialBackoffRetry backoffRetry = new ExponentialBackoffRetry(properties.getBaseSleepTimeMs(), properties.getMaxRetries()); + CuratorFramework client = CuratorFrameworkFactory.builder() + .connectString(properties.getConnectString()) + .retryPolicy(backoffRetry) + .sessionTimeoutMs(properties.getSessionTimeoutMs()) + .connectionTimeoutMs(properties.getConnectionTimeoutMs()) + .build(); + client.start(); + return client; + } + +} diff --git a/bigmarket-app/src/main/java/cn/bugstack/config/ZookeeperClientConfigProperties.java b/bigmarket-app/src/main/java/cn/bugstack/config/ZookeeperClientConfigProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..eca779c487ed100524c8274adfc4de4deecfc28e --- /dev/null +++ b/bigmarket-app/src/main/java/cn/bugstack/config/ZookeeperClientConfigProperties.java @@ -0,0 +1,16 @@ +package cn.bugstack.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@Data +@ConfigurationProperties(prefix = "zookeeper.sdk.config", ignoreInvalidFields = true) +public class ZookeeperClientConfigProperties { + + private String connectString; + private int baseSleepTimeMs; + private int maxRetries; + private int sessionTimeoutMs; + private int connectionTimeoutMs; + +} diff --git a/bigmarket-app/src/main/resources/application-dev.yml b/bigmarket-app/src/main/resources/application-dev.yml index 1e34460542cc3a82d936a52a3c27f10515684fbc..b7de5f1dbf9b82e033f1f4c13fba56ba17d3a8b8 100644 --- a/bigmarket-app/src/main/resources/application-dev.yml +++ b/bigmarket-app/src/main/resources/application-dev.yml @@ -27,6 +27,7 @@ spring: activity_sku_stock_zero: activity_sku_stock_zero send_award: send_award send_rebate: send_rebate + credit_adjust_success: credit_adjust_success # 线程池配置 thread: pool: @@ -115,6 +116,27 @@ redis: retry-interval: 1000 ping-interval: 60000 keep-alive: true +dubbo: + application: + name: big-market + version: 1.0 + registry: + id: nacos-registry + address: nacos://127.0.0.1:8848 + protocol: + name: dubbo + port: -1 + scan: + base-packages: cn.bugstack.trigger.api + +zookeeper: + sdk: + config: + connect-string: 127.0.0.1:2181 + base-sleep-time-ms: 1000 + max-retries: 3 + session-timeout-ms: 18000 + connection-timeout-ms: 30000 # 日志 logging: diff --git a/bigmarket-app/src/main/resources/mybatis/mapper/raffle_activity_account_mapper.xml b/bigmarket-app/src/main/resources/mybatis/mapper/raffle_activity_account_mapper.xml index dc2552efa4ea6401ab5fee7e2d13ecfab3b2f048..c9acfa2d487a1c2549d918627c55328d35d13863 100644 --- a/bigmarket-app/src/main/resources/mybatis/mapper/raffle_activity_account_mapper.xml +++ b/bigmarket-app/src/main/resources/mybatis/mapper/raffle_activity_account_mapper.xml @@ -75,4 +75,11 @@ where user_id = #{userId} and activity_id = #{activityId} + + diff --git a/bigmarket-app/src/main/resources/mybatis/mapper/raffle_activity_order_mapper.xml b/bigmarket-app/src/main/resources/mybatis/mapper/raffle_activity_order_mapper.xml index ddd634858408ddceeeb249bcd0c396ce727b5d98..56b08c343f6dbef6f09c19a75508349e01e2a425 100644 --- a/bigmarket-app/src/main/resources/mybatis/mapper/raffle_activity_order_mapper.xml +++ b/bigmarket-app/src/main/resources/mybatis/mapper/raffle_activity_order_mapper.xml @@ -14,6 +14,7 @@ + @@ -22,17 +23,35 @@ insert into raffle_activity_order - (user_id, sku, activity_id, activity_name, strategy_id, order_id, order_time, state, out_business_no, total_count, day_count, month_count, + (user_id, sku, activity_id, activity_name, strategy_id, order_id, order_time, pay_amount, state, out_business_no, total_count, day_count, month_count, create_time, update_time) values - (#{userId}, #{sku}, #{activityId}, #{activityName}, #{strategyId}, #{orderId}, #{orderTime}, #{state}, #{outBusinessNo}, #{totalCount}, #{dayCount}, #{monthCount}, + (#{userId}, #{sku}, #{activityId}, #{activityName}, #{strategyId}, #{orderId}, #{orderTime}, #{payAmount}, #{state}, #{outBusinessNo}, #{totalCount}, #{dayCount}, #{monthCount}, now(), now()) + + + + update raffle_activity_order set state = 'completed', update_time = now() + where user_id = #{userId} and out_business_no = #{outBusinessNo} and state = 'wait_pay' + + + + diff --git a/bigmarket-app/src/main/resources/mybatis/mapper/raffle_activity_sku_mapper.xml b/bigmarket-app/src/main/resources/mybatis/mapper/raffle_activity_sku_mapper.xml index 148c428e549dc0c35a0118ee771952d9c40d71b6..0510c92aca41ccf3cb75709bdb8ba65225f21e88 100644 --- a/bigmarket-app/src/main/resources/mybatis/mapper/raffle_activity_sku_mapper.xml +++ b/bigmarket-app/src/main/resources/mybatis/mapper/raffle_activity_sku_mapper.xml @@ -9,12 +9,13 @@ + @@ -32,7 +33,9 @@ diff --git a/bigmarket-app/src/main/resources/mybatis/mapper/user_credit_account_mapper.xml b/bigmarket-app/src/main/resources/mybatis/mapper/user_credit_account_mapper.xml index acca50733c188bf92eed17d024a2d29ad33a3b7f..aaa85afca6d65f24c9d0a7003e3eb98afa12456c 100644 --- a/bigmarket-app/src/main/resources/mybatis/mapper/user_credit_account_mapper.xml +++ b/bigmarket-app/src/main/resources/mybatis/mapper/user_credit_account_mapper.xml @@ -12,14 +12,20 @@ - + update user_credit_account set total_amount = total_amount + #{totalAmount}, available_amount = available_amount + #{availableAmount} where user_id = #{userId} - + + update user_credit_account set + available_amount = available_amount + #{availableAmount} + where user_id = #{userId} and available_amount > 0 + + + insert into user_credit_account( user_id, total_amount, available_amount, account_status, create_time, update_time ) values ( @@ -27,4 +33,9 @@ ) + + diff --git a/bigmarket-app/src/main/resources/mybatis/mapper/user_credit_order_mapper.xml b/bigmarket-app/src/main/resources/mybatis/mapper/user_credit_order_mapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..b6941c734af9f58a190a0b319bce00673a5283ee --- /dev/null +++ b/bigmarket-app/src/main/resources/mybatis/mapper/user_credit_order_mapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + insert into user_credit_order(user_id, order_id, trade_name, trade_type, trade_amount, out_business_no, create_time, update_time) + values( + #{userId},#{orderId},#{tradeName},#{tradeType},#{tradeAmount},#{outBusinessNo},now(),now() + ) + + + diff --git a/bigmarket-app/src/main/resources/mybatis/mapper/user_raffle_order_mapper.xml b/bigmarket-app/src/main/resources/mybatis/mapper/user_raffle_order_mapper.xml index 10988f6e41e8d00e4fbaf4b4638ef3a9e69beb65..39b51a94a9860cc856c589e0f92c67eabf473dd0 100644 --- a/bigmarket-app/src/main/resources/mybatis/mapper/user_raffle_order_mapper.xml +++ b/bigmarket-app/src/main/resources/mybatis/mapper/user_raffle_order_mapper.xml @@ -28,6 +28,8 @@ select user_id, activity_id, activity_name, strategy_id, order_id, order_time, order_state from user_raffle_order where user_id = #{userId} and activity_id = #{activityId} and order_state = 'create' + order by create_time desc + limit 1 diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/ApiTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/ApiTest.java index 9bc1a201d91950bc85a3ad92354618d6b3c5f2a0..5f13fcc070e19fa9d1c0d40036064e0d1981dd77 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/ApiTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/ApiTest.java @@ -1,19 +1,46 @@ package cn.bugstack.test; +import cn.bugstack.trigger.api.dto.RaffleAwardListRequestDTO; +import com.alibaba.fastjson2.JSON; import lombok.extern.slf4j.Slf4j; import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 功能测试 + * @create 2023-12-23 11:39 + */ @Slf4j -@RunWith(SpringRunner.class) -@SpringBootTest +//@RunWith(SpringRunner.class) +//@SpringBootTest public class ApiTest { + @Test + public void test_integer(){ + System.out.println(Integer.parseInt("aaa")); + } + @Test public void test() { - log.info("测试完成"); + RaffleAwardListRequestDTO requestDTO = new RaffleAwardListRequestDTO(); + requestDTO.setUserId("xiaofuge"); + requestDTO.setActivityId(100301L); + log.info(JSON.toJSONString(requestDTO)); + } + + public static void main(String[] args) { + double convert = convert(0.0018); + System.out.println(convert); + } + + private static double convert(double min){ + double current = min; + double max = 1; + while (current % 1 != 0){ + current = current * 10; + max = max * 10; + } + return max; } } diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/ZookeeperTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/ZookeeperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..5fc82793de7469762a2ee99f79bb2be532a51ce1 --- /dev/null +++ b/bigmarket-app/src/test/java/cn/bugstack/test/ZookeeperTest.java @@ -0,0 +1,148 @@ +package cn.bugstack.test; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.framework.api.CuratorEventType; +import org.apache.curator.framework.api.CuratorListener; +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.data.Stat; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.nio.charset.StandardCharsets; +import java.util.List; + +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class ZookeeperTest { + + @Resource + private CuratorFramework curatorFramework; + + @Test + public void test_all() throws Exception { + String path = "/big-market-dcc/config/downgradeSwitch"; + String data = "0"; + curatorFramework.create().withMode(CreateMode.EPHEMERAL).forPath(path, data.getBytes(StandardCharsets.UTF_8)); + + for (int i = 0; i < 2; i++) { + curatorFramework.setData().forPath(path, String.valueOf(i).getBytes(StandardCharsets.UTF_8)); + } + } + + /** + * 创建永久节点 + */ + @Test + public void createNode() throws Exception { + String path = "/big-market-dcc/config/downgradeSwitch/test/a"; + String data = "0"; + if (null == curatorFramework.checkExists().forPath(path)) { + curatorFramework.create().creatingParentsIfNeeded().forPath(path); + } + } + + /** + * 创建临时节点 + */ + @Test + public void createEphemeralNode() throws Exception { + String path = "/big-market-dcc/config/epnode"; + String data = "0"; + curatorFramework.create().withMode(CreateMode.EPHEMERAL).forPath(path, data.getBytes(StandardCharsets.UTF_8)); + } + + /** + * 创建临时有序节点 + */ + @Test + public void crateEphemeralSequentialNode() throws Exception { + String path = "/big-market-dcc/config/epsnode"; + String data = "0"; + curatorFramework.create() + .withMode(CreateMode.EPHEMERAL_SEQUENTIAL) + .forPath(path, data.getBytes(StandardCharsets.UTF_8)); + } + + /** + * 往节点种设置数据 + */ + @Test + public void setData() throws Exception { + curatorFramework.setData().forPath("/big-market-dcc/config/downgradeSwitch", "111".getBytes(StandardCharsets.UTF_8)); + curatorFramework.setData().forPath("/big-market-dcc/config/userWhiteList", "222".getBytes(StandardCharsets.UTF_8)); + } + + @Test + public void getData() throws Exception { + String downgradeSwitch = new String(curatorFramework.getData().forPath("/big-market-dcc/config/downgradeSwitch"), StandardCharsets.UTF_8); + log.info("测试结果: {}", downgradeSwitch); + String userWhiteList = new String(curatorFramework.getData().forPath("/big-market-dcc/config/userWhiteList"), StandardCharsets.UTF_8); + log.info("测试结果: {}", userWhiteList); + } + + /** + * 异步修改数据 + */ + @Test + public void setDataAsync() throws Exception { + String path = "/big-market-dcc/config/downgradeSwitch"; + String data = "0"; + CuratorListener listener = (client, event) -> { + Stat stat = event.getStat(); + log.info("stat=" + JSON.toJSONString(stat)); + CuratorEventType eventType = event.getType(); + log.info("eventType=" + eventType.name()); + }; + curatorFramework.getCuratorListenable().addListener(listener); + curatorFramework.setData().inBackground().forPath(path, data.getBytes(StandardCharsets.UTF_8)); + } + + + /** + * 删除节点 + */ + @Test + public void deleteData() throws Exception { + String path = "/big-market-dcc/config/downgradeSwitch"; + curatorFramework.delete().deletingChildrenIfNeeded().forPath(path); + } + + /** + * 安全删除节点 + */ + @Test + public void guaranteedDeleteData() throws Exception { + String path = "/big-market-dcc/config/downgradeSwitch"; + curatorFramework.delete().guaranteed().forPath(path); + } + + /** + * 获取子节点下的全部子节点路径集合 + */ + @Test + public void watchedGetChildren() throws Exception { + String path = "/big-market-dcc"; + List children = curatorFramework.getChildren().watched().forPath(path); + log.info("测试结果:{}", JSON.toJSONString(children)); + } + + + /** + * 获取节点数据 + */ + @Test + public void getDataByPath() throws Exception { + String path = "/big-market-dcc/config/downgradeSwitch"; + String fullClassName = ""; + String jsonStr = new String(curatorFramework.getData().forPath(path), StandardCharsets.UTF_8); + Class clazz = Class.forName(fullClassName); + log.info("测试结果:{}", JSON.parseObject(jsonStr, clazz)); + } + +} diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/domain/activity/RaffleActivityAccountQuotaServiceTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/domain/activity/RaffleActivityAccountQuotaServiceTest.java index 336876d5e4d050223c75cf4aa81e82b87b559e15..712af98a888318d01350e0b6134640f2fbae3dc1 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/domain/activity/RaffleActivityAccountQuotaServiceTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/domain/activity/RaffleActivityAccountQuotaServiceTest.java @@ -1,9 +1,12 @@ package cn.bugstack.test.domain.activity; import cn.bugstack.domain.activity.model.entity.SkuRechargeEntity; +import cn.bugstack.domain.activity.model.entity.UnpaidActivityOrderEntity; +import cn.bugstack.domain.activity.model.valobj.OrderTradeTypeVO; import cn.bugstack.domain.activity.service.IRaffleActivityAccountQuotaService; import cn.bugstack.domain.activity.service.armory.IActivityArmory; import cn.bugstack.types.exception.AppException; +import com.alibaba.fastjson2.JSON; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; import org.junit.Before; @@ -43,8 +46,9 @@ public class RaffleActivityAccountQuotaServiceTest { skuRechargeEntity.setSku(9011L); // outBusinessNo 作为幂等仿重使用,同一个业务单号2次使用会抛出索引冲突 Duplicate entry '700091009111' for key 'uq_out_business_no' 确保唯一性。 skuRechargeEntity.setOutBusinessNo("700091009119"); - String orderId = raffleActivityAccountQuotaService.createOrder(skuRechargeEntity); - log.info("测试结果:{}", orderId); + skuRechargeEntity.setOrderTradeType(OrderTradeTypeVO.rebate_no_pay_trade); + UnpaidActivityOrderEntity unpaidActivityOrder = raffleActivityAccountQuotaService.createOrder(skuRechargeEntity); + log.info("测试结果:{}", JSON.toJSONString(unpaidActivityOrder)); } /** @@ -62,8 +66,9 @@ public class RaffleActivityAccountQuotaServiceTest { skuRechargeEntity.setSku(9011L); // outBusinessNo 作为幂等仿重使用,同一个业务单号2次使用会抛出索引冲突 Duplicate entry '700091009111' for key 'uq_out_business_no' 确保唯一性。 skuRechargeEntity.setOutBusinessNo(RandomStringUtils.randomNumeric(12)); - String orderId = raffleActivityAccountQuotaService.createOrder(skuRechargeEntity); - log.info("测试结果:{}", orderId); + skuRechargeEntity.setOrderTradeType(OrderTradeTypeVO.rebate_no_pay_trade); + UnpaidActivityOrderEntity unpaidActivityOrder = raffleActivityAccountQuotaService.createOrder(skuRechargeEntity); + log.info("测试结果:{}", JSON.toJSONString(unpaidActivityOrder)); } catch (AppException e) { log.warn(e.getInfo()); } @@ -72,4 +77,16 @@ public class RaffleActivityAccountQuotaServiceTest { new CountDownLatch(1).await(); } + @Test + public void test_credit_pay_trade() { + SkuRechargeEntity skuRechargeEntity = new SkuRechargeEntity(); + skuRechargeEntity.setUserId("xiaofuge"); + skuRechargeEntity.setSku(9011L); + // outBusinessNo 作为幂等仿重使用,同一个业务单号2次使用会抛出索引冲突 Duplicate entry '700091009111' for key 'uq_out_business_no' 确保唯一性。 + skuRechargeEntity.setOutBusinessNo("70009240609001"); + skuRechargeEntity.setOrderTradeType(OrderTradeTypeVO.credit_pay_trade); + UnpaidActivityOrderEntity unpaidActivityOrder = raffleActivityAccountQuotaService.createOrder(skuRechargeEntity); + log.info("测试结果:{}", JSON.toJSONString(unpaidActivityOrder)); + } + } diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/domain/activity/RaffleActivityPartakeServiceTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/domain/activity/RaffleActivityPartakeServiceTest.java index 9261962930e56a043a85d372d377217810000d49..63aef699efc18416685e79253b34b190c1c61e65 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/domain/activity/RaffleActivityPartakeServiceTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/domain/activity/RaffleActivityPartakeServiceTest.java @@ -13,7 +13,7 @@ import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; /** - * @author zyf + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 抽奖活动订单单测 * @create 2024-03-16 11:51 */ diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/domain/award/AwardServiceTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/domain/award/AwardServiceTest.java index bcfa5b68841e3b41be90849a003469bfaaaaab4c..19e29e620734f7adec531e1d1191ba3783b66c8c 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/domain/award/AwardServiceTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/domain/award/AwardServiceTest.java @@ -1,5 +1,6 @@ package cn.bugstack.test.domain.award; +import cn.bugstack.domain.award.model.entity.DistributeAwardEntity; import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity; import cn.bugstack.domain.award.model.valobj.AwardStateVO; import cn.bugstack.domain.award.service.IAwardService; @@ -15,7 +16,7 @@ import java.util.Date; import java.util.concurrent.CountDownLatch; /** - * @author zyf + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 奖品服务测试 * @create 2024-04-06 11:27 */ @@ -32,9 +33,9 @@ public class AwardServiceTest { */ @Test public void test_saveUserAwardRecord() throws InterruptedException { - for (int i = 0; i < 10; i++) { + for (int i = 0; i < 100; i++) { UserAwardRecordEntity userAwardRecordEntity = new UserAwardRecordEntity(); - userAwardRecordEntity.setUserId("zyf"); + userAwardRecordEntity.setUserId("xiaofuge"); userAwardRecordEntity.setActivityId(100301L); userAwardRecordEntity.setStrategyId(100006L); userAwardRecordEntity.setOrderId(RandomStringUtils.randomNumeric(12)); @@ -49,4 +50,15 @@ public class AwardServiceTest { new CountDownLatch(1).await(); } + @Test + public void test_distributeAward() throws InterruptedException { + DistributeAwardEntity distributeAwardEntity = new DistributeAwardEntity(); + distributeAwardEntity.setUserId("xiaofuge"); + distributeAwardEntity.setOrderId("690124733440"); + distributeAwardEntity.setAwardId(101); + distributeAwardEntity.setAwardConfig("0.01,1"); // 0.01,1 黑名单指定积分值 + + awardService.distributeAward(distributeAwardEntity); + } + } diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/domain/credit/CreditAdjustServiceTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/domain/credit/CreditAdjustServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..9700913714d99c822d8654ad338927b3be106325 --- /dev/null +++ b/bigmarket-app/src/test/java/cn/bugstack/test/domain/credit/CreditAdjustServiceTest.java @@ -0,0 +1,65 @@ +package cn.bugstack.test.domain.credit; + +import cn.bugstack.domain.credit.model.entity.TradeEntity; +import cn.bugstack.domain.credit.model.valobj.TradeNameVO; +import cn.bugstack.domain.credit.model.valobj.TradeTypeVO; +import cn.bugstack.domain.credit.service.ICreditAdjustService; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.concurrent.CountDownLatch; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 积分额度增加服务测试 + * @create 2024-06-01 10:22 + */ +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class CreditAdjustServiceTest { + + @Resource + private ICreditAdjustService creditAdjustService; + + @Test + public void test_createOrder_forward() { + TradeEntity tradeEntity = new TradeEntity(); + tradeEntity.setUserId("xiaofuge"); + tradeEntity.setTradeName(TradeNameVO.REBATE); + tradeEntity.setTradeType(TradeTypeVO.FORWARD); + tradeEntity.setAmount(new BigDecimal("10.19")); + tradeEntity.setOutBusinessNo("12406039900002"); + creditAdjustService.createOrder(tradeEntity); + } + + @Test + public void test_createOrder_reverse() { + TradeEntity tradeEntity = new TradeEntity(); + tradeEntity.setUserId("xiaofuge"); + tradeEntity.setTradeName(TradeNameVO.REBATE); + tradeEntity.setTradeType(TradeTypeVO.REVERSE); + tradeEntity.setAmount(new BigDecimal("-10.19")); + tradeEntity.setOutBusinessNo("20000990991"); + creditAdjustService.createOrder(tradeEntity); + } + + @Test + public void test_createOrder_pay() throws InterruptedException { + TradeEntity tradeEntity = new TradeEntity(); + tradeEntity.setUserId("xiaofuge"); + tradeEntity.setTradeName(TradeNameVO.CONVERT_SKU); + tradeEntity.setTradeType(TradeTypeVO.REVERSE); + tradeEntity.setAmount(new BigDecimal("-1.68")); + tradeEntity.setOutBusinessNo("70009240609001"); + creditAdjustService.createOrder(tradeEntity); + + new CountDownLatch(1).await(); + } + +} diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/domain/rebate/BehaviorRebateServiceTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/domain/rebate/BehaviorRebateServiceTest.java index 7dfb6d414e2a4d36999195c8b12e38e2d1eeef2a..39a3b9bcb3cf48911530e1f48f34542cda715fa1 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/domain/rebate/BehaviorRebateServiceTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/domain/rebate/BehaviorRebateServiceTest.java @@ -1,10 +1,12 @@ package cn.bugstack.test.domain.rebate; +import cn.bugstack.domain.activity.service.armory.IActivityArmory; import cn.bugstack.domain.rebate.model.entity.BehaviorEntity; import cn.bugstack.domain.rebate.model.valobj.BehaviorTypeVO; import cn.bugstack.domain.rebate.service.IBehaviorRebateService; import com.alibaba.fastjson2.JSON; import lombok.extern.slf4j.Slf4j; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; @@ -12,6 +14,7 @@ import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; import java.util.List; +import java.util.concurrent.CountDownLatch; /** * @author Fuzhengwei bugstack.cn @小傅哥 @@ -26,17 +29,27 @@ public class BehaviorRebateServiceTest { @Resource private IBehaviorRebateService behaviorRebateService; + @Resource + private IActivityArmory activityArmory; + + @Before + public void init() { + activityArmory.assembleActivitySkuByActivityId(100301L); + } + @Test - public void test_createOrder() { + public void test_createOrder() throws InterruptedException { BehaviorEntity behaviorEntity = new BehaviorEntity(); behaviorEntity.setUserId("xiaofuge"); behaviorEntity.setBehaviorTypeVO(BehaviorTypeVO.SIGN); // 重复的 OutBusinessNo 会报错唯一索引冲突,这也是保证幂等的手段,确保不会多记账 - behaviorEntity.setOutBusinessNo("20240429"); + behaviorEntity.setOutBusinessNo("20240601006"); List orderIds = behaviorRebateService.createOrder(behaviorEntity); log.info("请求参数:{}", JSON.toJSONString(behaviorEntity)); log.info("测试结果:{}", JSON.toJSONString(orderIds)); + + new CountDownLatch(1).await(); } } diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/LogicChainTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/LogicChainTest.java index 2ad879799593730b7d26e820d11a36abf0544159..9d263007b280e81e918794c53a662dc1e1dcb3fb 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/LogicChainTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/LogicChainTest.java @@ -4,6 +4,7 @@ import cn.bugstack.domain.strategy.service.armory.IStrategyArmory; import cn.bugstack.domain.strategy.service.rule.chain.ILogicChain; import cn.bugstack.domain.strategy.service.rule.chain.factory.DefaultChainFactory; import cn.bugstack.domain.strategy.service.rule.chain.impl.RuleWeightLogicChain; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.junit.Before; import org.junit.Test; @@ -15,15 +16,15 @@ import org.springframework.test.util.ReflectionTestUtils; import javax.annotation.Resource; /** - * @ClassName: LogicChainTest - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/11/18 22:49 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖责任链测试,验证不同的规则走不同的责任链 + * @create 2024-01-20 11:20 */ @Slf4j @RunWith(SpringRunner.class) @SpringBootTest public class LogicChainTest { + @Resource private IStrategyArmory strategyArmory; @Resource @@ -41,9 +42,9 @@ public class LogicChainTest { @Test public void test_LogicChain_rule_blacklist() { - ILogicChain logicChain = defaultChainFactory.openLogicChain(100001L); - DefaultChainFactory.StrategyAwardVO awardId = logicChain.logic("user001", 100001L); - log.info("测试结果:{}", awardId); + ILogicChain logicChain = defaultChainFactory.openLogicChain(100003L); + DefaultChainFactory.StrategyAwardVO strategyAwardVO = logicChain.logic("user001", 100003L); + log.info("测试结果:{}", JSON.toJSONString(strategyAwardVO)); } @Test @@ -52,16 +53,15 @@ public class LogicChainTest { ReflectionTestUtils.setField(ruleWeightLogicChain, "userScore", 4900L); ILogicChain logicChain = defaultChainFactory.openLogicChain(100001L); - DefaultChainFactory.StrategyAwardVO awardId = logicChain.logic("xiaofuge", 100001L); - log.info("测试结果:{}", awardId); + DefaultChainFactory.StrategyAwardVO strategyAwardVO = logicChain.logic("xiaofuge", 100001L); + log.info("测试结果:{}", JSON.toJSONString(strategyAwardVO)); } @Test public void test_LogicChain_rule_default() { ILogicChain logicChain = defaultChainFactory.openLogicChain(100001L); - DefaultChainFactory.StrategyAwardVO awardId = logicChain.logic("xiaofuge", 100001L); - log.info("测试结果:{}", awardId); + DefaultChainFactory.StrategyAwardVO strategyAwardVO = logicChain.logic("xiaofuge", 100001L); + log.info("测试结果:{}", JSON.toJSONString(strategyAwardVO)); } } - diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/LogicTreeTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/LogicTreeTest.java index ede56f8cb07816aacd38b11cf4fd17a72e74d0a6..01d886b1efe6d193b1aee5697e88cc4b161c423d 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/LogicTreeTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/LogicTreeTest.java @@ -1,9 +1,9 @@ package cn.bugstack.test.domain.strategy; import cn.bugstack.domain.strategy.model.valobj.*; -import cn.bugstack.domain.strategy.service.rule.tree.factory.DefaultTreeFactory; import cn.bugstack.domain.strategy.service.rule.tree.factory.engine.IDecisionTreeEngine; -import com.alibaba.fastjson.JSON; +import cn.bugstack.domain.strategy.service.rule.tree.factory.DefaultTreeFactory; +import com.alibaba.fastjson2.JSON; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.junit.runner.RunWith; @@ -15,10 +15,9 @@ import java.util.ArrayList; import java.util.HashMap; /** - * @ClassName: LogicTreeTest - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/11/20 16:58 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 规则树测试 + * @create 2024-01-27 13:23 */ @Slf4j @RunWith(SpringRunner.class) @@ -97,10 +96,9 @@ public class LogicTreeTest { IDecisionTreeEngine treeEngine = defaultTreeFactory.openLogicTree(ruleTreeVO); - DefaultTreeFactory.StrategyAwardVO data = treeEngine.process("xiaofuge", 100001L, 100,null); + DefaultTreeFactory.StrategyAwardVO data = treeEngine.process("xiaofuge", 100001L, 100, null); log.info("测试结果:{}", JSON.toJSONString(data)); } } - diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/RaffleStrategyTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/RaffleStrategyTest.java index 7d4b7cfc189644d062da66b218242716b4bb980b..bc1f6c511f6aa8b604f7ced2b0655913214f697c 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/RaffleStrategyTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/RaffleStrategyTest.java @@ -2,34 +2,41 @@ package cn.bugstack.test.domain.strategy; import cn.bugstack.domain.strategy.model.entity.RaffleAwardEntity; import cn.bugstack.domain.strategy.model.entity.RaffleFactorEntity; +import cn.bugstack.domain.strategy.model.valobj.RuleWeightVO; +import cn.bugstack.domain.strategy.model.valobj.StrategyAwardStockKeyVO; +import cn.bugstack.domain.strategy.service.IRaffleRule; import cn.bugstack.domain.strategy.service.IRaffleStock; import cn.bugstack.domain.strategy.service.IRaffleStrategy; -import cn.bugstack.domain.strategy.model.valobj.StrategyAwardStockKeyVO; import cn.bugstack.domain.strategy.service.armory.IStrategyArmory; import cn.bugstack.domain.strategy.service.rule.chain.impl.RuleWeightLogicChain; import cn.bugstack.domain.strategy.service.rule.tree.impl.RuleLockLogicTreeNode; +import cn.bugstack.types.common.Constants; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.redisson.api.RBlockingQueue; +import org.redisson.api.RDelayedQueue; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.util.ReflectionTestUtils; import javax.annotation.Resource; +import java.util.List; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; /** - * @ClassName: RaffleStrategyTest - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/11/17 17:11 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖策略测试 + * @create 2024-01-06 13:28 */ -@SpringBootTest @Slf4j @RunWith(SpringRunner.class) +@SpringBootTest public class RaffleStrategyTest { + @Resource private IStrategyArmory strategyArmory; @Resource @@ -40,23 +47,23 @@ public class RaffleStrategyTest { private RuleLockLogicTreeNode ruleLockLogicTreeNode; @Resource private IRaffleStock raffleStock; - + @Resource + private IRaffleRule raffleRule; @Before public void setUp() { // 策略装配 100001、100002、100003 -// log.info("测试结果:{}", strategyArmory.assembleLotteryStrategy(100001L)); + log.info("测试结果:{}", strategyArmory.assembleLotteryStrategy(100001L)); log.info("测试结果:{}", strategyArmory.assembleLotteryStrategy(100006L)); - // 通过反射 mock 规则中的值 - ReflectionTestUtils.setField(ruleWeightLogicChain, "userScore", 4900L); - ReflectionTestUtils.setField(ruleLockLogicTreeNode, "userRaffleCount", 10L); + // 通过反射 mock 规则中的值;到本节不需要在使用了。 + /*ReflectionTestUtils.setField(ruleWeightLogicChain, "userScore", 4900L);*/ + /*ReflectionTestUtils.setField(ruleLockLogicTreeNode, "userRaffleCount", 10L);*/ } - @Test public void test_performRaffle() throws InterruptedException { - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 1; i++) { RaffleFactorEntity raffleFactorEntity = RaffleFactorEntity.builder() .userId("xiaofuge") .strategyId(100006L) @@ -72,7 +79,6 @@ public class RaffleStrategyTest { new CountDownLatch(1).await(); } - @Test public void test_performRaffle_blacklist() { RaffleFactorEntity raffleFactorEntity = RaffleFactorEntity.builder() @@ -91,7 +97,7 @@ public class RaffleStrategyTest { * ReflectionTestUtils.setField(ruleLockLogicFilter, "userRaffleCount", 10L); */ @Test - public void test_raffle_center_rule_lock(){ + public void test_raffle_center_rule_lock() { RaffleFactorEntity raffleFactorEntity = RaffleFactorEntity.builder() .userId("xiaofuge") .strategyId(100003L) @@ -103,12 +109,16 @@ public class RaffleStrategyTest { log.info("测试结果:{}", JSON.toJSONString(raffleAwardEntity)); } - @Test public void test_takeQueueValue() throws InterruptedException { StrategyAwardStockKeyVO strategyAwardStockKeyVO = raffleStock.takeQueueValue(); log.info("测试结果:{}", JSON.toJSONString(strategyAwardStockKeyVO)); } + @Test + public void test_raffleRule() { + List ruleWeightVOS = raffleRule.queryAwardRuleWeightByActivityId(100301L); + log.info("测试结果:{}", JSON.toJSONString(ruleWeightVOS)); + } } diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/StrategyTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/StrategyTest.java index fb00c42cb2b5fe81f3b89b0cc26a8b6735cd6758..f1b9416b597aa903bfbfb2e957be9b3211a4d8e4 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/StrategyTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/domain/strategy/StrategyTest.java @@ -15,10 +15,9 @@ import javax.annotation.Resource; import java.util.*; /** - * @ClassName: StrategyTest - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/11/17 17:18 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 策略领域测试 + * @create 2023-12-23 11:33 */ @Slf4j @RunWith(SpringRunner.class) @@ -36,7 +35,7 @@ public class StrategyTest { */ @Before public void test_strategyArmory() { - boolean success = strategyArmory.assembleLotteryStrategy(100001L); + boolean success = strategyArmory.assembleLotteryStrategy(100005L); log.info("测试结果:{}", success); } @@ -45,7 +44,7 @@ public class StrategyTest { */ @Test public void test_getRandomAwardId() { - log.info("测试结果:{} - 奖品ID值", strategyDispatch.getRandomAwardId(100001L)); + log.info("测试结果:{} - 奖品ID值", strategyDispatch.getRandomAwardId(100001L)); } /** @@ -107,4 +106,3 @@ public class StrategyTest { } } - diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/AwardDaoTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/AwardDaoTest.java index 00de8a65ef97393e764d2eb25d6d3106ae6369d3..48b4bdd5578c5e5f92a6351fb68fba012b58660a 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/AwardDaoTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/AwardDaoTest.java @@ -2,7 +2,7 @@ package cn.bugstack.test.infrastructure; import cn.bugstack.infrastructure.persistent.dao.IAwardDao; import cn.bugstack.infrastructure.persistent.po.Award; - +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.junit.runner.RunWith; @@ -13,22 +13,22 @@ import javax.annotation.Resource; import java.util.List; /** - * @ClassName: AwardDaoTest - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/11/13 21:12 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 奖品持久化单元测试 + * @create 2023-12-16 13:36 */ -@SpringBootTest @Slf4j @RunWith(SpringRunner.class) +@SpringBootTest public class AwardDaoTest { @Resource private IAwardDao awardDao; @Test - public void Test_queryAwardList(){ + public void test_queryAwardList() { List awards = awardDao.queryAwardList(); - log.info("测试结果:{}",awards); + log.info("测试结果:{}", JSON.toJSONString(awards)); } + } diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RaffleActivityAccountDayDaoTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RaffleActivityAccountDayDaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..69b03ebd31c8ba47a4cc5a54de41aa81ce6bf50b --- /dev/null +++ b/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RaffleActivityAccountDayDaoTest.java @@ -0,0 +1,36 @@ +package cn.bugstack.test.infrastructure; + +import cn.bugstack.infrastructure.persistent.dao.IRaffleActivityAccountDayDao; +import cn.bugstack.infrastructure.persistent.po.RaffleActivityAccountDay; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 活动日账户DAO + * @create 2024-04-20 10:15 + */ +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class RaffleActivityAccountDayDaoTest { + + @Resource + private IRaffleActivityAccountDayDao raffleActivityAccountDayDao; + + @Test + public void test_queryRaffleActivityAccountDayPartakeCount() { + RaffleActivityAccountDay raffleActivityAccountDay = new RaffleActivityAccountDay(); + raffleActivityAccountDay.setActivityId(100301L); + raffleActivityAccountDay.setUserId("xiaofuge"); + raffleActivityAccountDay.setDay(raffleActivityAccountDay.currentDay()); + Integer dayPartakeCount = raffleActivityAccountDayDao.queryRaffleActivityAccountDayPartakeCount(raffleActivityAccountDay); + log.info("测试结果:{}", dayPartakeCount); + } + +} diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RaffleActivityDaoTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RaffleActivityDaoTest.java index a9ed289df375976fec1a208f3cb4f90389147ade..4f7ae9ed1e37adffb5acc84be5fd9db118774713 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RaffleActivityDaoTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RaffleActivityDaoTest.java @@ -2,7 +2,7 @@ package cn.bugstack.test.infrastructure; import cn.bugstack.infrastructure.persistent.dao.IRaffleActivityDao; import cn.bugstack.infrastructure.persistent.po.RaffleActivity; -import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSON; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.junit.runner.RunWith; @@ -12,15 +12,15 @@ import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; /** - * @ClassName: RaffleActivityDaoTest - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/11/26 14:41 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖活动配置Dao测试 + * @create 2024-03-09 11:30 */ @Slf4j @RunWith(SpringRunner.class) @SpringBootTest public class RaffleActivityDaoTest { + @Resource private IRaffleActivityDao raffleActivityDao; @@ -29,4 +29,5 @@ public class RaffleActivityDaoTest { RaffleActivity raffleActivity = raffleActivityDao.queryRaffleActivityByActivityId(100301L); log.info("测试结果:{}", JSON.toJSONString(raffleActivity)); } + } diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RaffleActivityOrderDaoTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RaffleActivityOrderDaoTest.java index d4996d4afe32eaabaedbead676424007c692f122..3d552d979fcd078d772885114ada85bda0bdda42 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RaffleActivityOrderDaoTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RaffleActivityOrderDaoTest.java @@ -5,6 +5,7 @@ import cn.bugstack.infrastructure.persistent.po.RaffleActivityOrder; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.RandomStringUtils; +import org.jeasy.random.EasyRandom; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; @@ -15,10 +16,9 @@ import java.util.Date; import java.util.List; /** - * @ClassName: RaffleActivityOrderDaoTest - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/11/26 14:46 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖活动订单测试 + * @create 2024-03-09 10:51 */ @Slf4j @RunWith(SpringRunner.class) @@ -28,6 +28,25 @@ public class RaffleActivityOrderDaoTest { @Resource private IRaffleActivityOrderDao raffleActivityOrderDao; + private final EasyRandom easyRandom = new EasyRandom(); + + @Test + public void test_insert_random() { + for (int i = 0; i < 5; i++) { + RaffleActivityOrder raffleActivityOrder = new RaffleActivityOrder(); + // EasyRandom 可以通过指定对象类的方式,随机生成对象值。如;easyRandom.nextObject(String.class)、easyRandom.nextObject(RaffleActivityOrder.class) + raffleActivityOrder.setUserId(easyRandom.nextObject(String.class)); + raffleActivityOrder.setActivityId(100301L); + raffleActivityOrder.setActivityName("测试活动"); + raffleActivityOrder.setStrategyId(100006L); + raffleActivityOrder.setOrderId(RandomStringUtils.randomNumeric(12)); + raffleActivityOrder.setOrderTime(new Date()); + raffleActivityOrder.setState("not_used"); + // 插入数据 + raffleActivityOrderDao.insert(raffleActivityOrder); + } + } + @Test public void test_insert() { RaffleActivityOrder raffleActivityOrder = new RaffleActivityOrder(); diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RuleTreeNodeDaoTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RuleTreeNodeDaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..932d4b11e1523d624d7a487e0a7a9b374de0b02a --- /dev/null +++ b/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/RuleTreeNodeDaoTest.java @@ -0,0 +1,34 @@ +package cn.bugstack.test.infrastructure; + +import cn.bugstack.infrastructure.persistent.dao.IRuleTreeNodeDao; +import cn.bugstack.infrastructure.persistent.po.RuleTreeNode; +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 规则单元测试 + * @create 2024-04-20 09:40 + */ +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class RuleTreeNodeDaoTest { + + @Resource + private IRuleTreeNodeDao ruleTreeNodeDao; + + @Test + public void test_queryRuleLocks() { + List ruleTreeNodes = ruleTreeNodeDao.queryRuleLocks(new String[]{"tree_lock_1", "tree_lock_2"}); + log.info("测试结果:{}", JSON.toJSONString(ruleTreeNodes)); + } + +} diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/StrategyRepositoryTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/StrategyRepositoryTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6309103966b5c3db0a1f0696da7bae650eb50186 --- /dev/null +++ b/bigmarket-app/src/test/java/cn/bugstack/test/infrastructure/StrategyRepositoryTest.java @@ -0,0 +1,74 @@ +package cn.bugstack.test.infrastructure; + +import cn.bugstack.domain.strategy.model.valobj.RuleTreeVO; +import cn.bugstack.domain.strategy.model.valobj.StrategyAwardStockKeyVO; +import cn.bugstack.domain.strategy.repository.IStrategyRepository; +import cn.bugstack.infrastructure.persistent.redis.IRedisService; +import cn.bugstack.types.common.Constants; +import com.alibaba.fastjson2.JSON; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.redisson.api.RBlockingQueue; +import org.redisson.api.RDelayedQueue; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 策略仓储测试 + * @create 2024-02-03 09:43 + */ +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest +public class StrategyRepositoryTest { + + @Resource + private IStrategyRepository strategyRepository; + @Resource + private IRedisService redisService; + + @Test + public void queryRuleTreeVOByTreeId() { + RuleTreeVO ruleTreeVO = strategyRepository.queryRuleTreeVOByTreeId("tree_lock"); + log.info("测试结果:{}", JSON.toJSONString(ruleTreeVO)); + } + + @Test + public void test_cacheStrategyAwardCount() { + String cacheKey = Constants.RedisKey.STRATEGY_AWARD_COUNT_KEY + "300001" + Constants.UNDERLINE + "102"; + strategyRepository.cacheStrategyAwardCount(cacheKey, 10); + } + + @Test + public void test_subtractionAwardStock() { + String cacheKey = Constants.RedisKey.STRATEGY_AWARD_COUNT_KEY + "300001" + Constants.UNDERLINE + "102"; + strategyRepository.subtractionAwardStock(cacheKey); + } + + @Test + public void test_getValue() { + String cacheKey = Constants.RedisKey.STRATEGY_AWARD_COUNT_KEY + "300001" + Constants.UNDERLINE + "102"; + Integer value = redisService.getValue(cacheKey); + log.info("测试结果:{}", value); + } + + @Test + public void test_queue() throws InterruptedException { + String cacheKey = Constants.RedisKey.STRATEGY_AWARD_COUNT_QUERY_KEY; + RBlockingQueue blockingQueue = redisService.getBlockingQueue(cacheKey); + RDelayedQueue delayedQueue = redisService.getDelayedQueue(blockingQueue); + delayedQueue.offer(StrategyAwardStockKeyVO.builder() + .strategyId(100001L) + .awardId(102) + .build(), 3, TimeUnit.SECONDS); + + new CountDownLatch(1).await(); + } + +} diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/trigger/RaffleActivityControllerTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/trigger/RaffleActivityControllerTest.java index b233ceeefd22545575424139e294d10e21d6e495..111cfeae61c73b9f8cc478dcdcfb06e14664e26d 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/trigger/RaffleActivityControllerTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/trigger/RaffleActivityControllerTest.java @@ -1,17 +1,21 @@ package cn.bugstack.test.trigger; import cn.bugstack.trigger.api.IRaffleActivityService; -import cn.bugstack.trigger.api.dto.ActivityDrawRequestDTO; -import cn.bugstack.trigger.api.dto.ActivityDrawResponseDTO; -import cn.bugstack.types.model.Response; +import cn.bugstack.trigger.api.dto.*; +import cn.bugstack.trigger.api.response.Response; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; +import org.apache.curator.framework.CuratorFramework; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.concurrent.CountDownLatch; /** * @author Fuzhengwei bugstack.cn @小傅哥 @@ -26,21 +30,101 @@ public class RaffleActivityControllerTest { @Resource private IRaffleActivityService raffleActivityService; + @Resource + private CuratorFramework curatorFramework; + @Test public void test_armory() { Response response = raffleActivityService.armory(100301L); log.info("测试结果:{}", JSON.toJSONString(response)); } + @Test + public void test_set_dcc_value() throws Exception { + curatorFramework.setData().forPath("/big-market-dcc/config/degradeSwitch", "close".getBytes(StandardCharsets.UTF_8)); + } + @Test public void test_draw() { + for (int i = 0; i < 1; i++) { + ActivityDrawRequestDTO request = new ActivityDrawRequestDTO(); + request.setActivityId(100301L); + request.setUserId("xiaofuge"); + Response response = raffleActivityService.draw(request); + + log.info("请求参数:{}", JSON.toJSONString(request)); + log.info("测试结果:{}", JSON.toJSONString(response)); + } + } + + @Test + public void test_blacklist_draw() throws InterruptedException { ActivityDrawRequestDTO request = new ActivityDrawRequestDTO(); request.setActivityId(100301L); - request.setUserId("xiaofuge"); + request.setUserId("user001"); Response response = raffleActivityService.draw(request); log.info("请求参数:{}", JSON.toJSONString(request)); log.info("测试结果:{}", JSON.toJSONString(response)); + + // 让程序挺住方便测试,也可以去掉 +// new CountDownLatch(1).await(); + } + + @Test + public void test_calendarSignRebate() throws InterruptedException { + Response response = raffleActivityService.calendarSignRebate("user002"); + log.info("测试结果:{}", JSON.toJSONString(response)); + + // 让程序挺住方便测试,也可以去掉 + new CountDownLatch(1).await(); + } + + @Test + public void test_isCalendarSignRebate() { + Response response = raffleActivityService.isCalendarSignRebate("xiaofuge"); + log.info("测试结果:{}", JSON.toJSONString(response)); + } + + @Test + public void test_queryUserActivityAccount() { + UserActivityAccountRequestDTO request = new UserActivityAccountRequestDTO(); + request.setActivityId(100301L); + request.setUserId("xiaofuge"); + + // 查询数据 + Response response = raffleActivityService.queryUserActivityAccount(request); + + log.info("请求参数:{}", JSON.toJSONString(request)); + log.info("测试结果:{}", JSON.toJSONString(response)); + } + + @Test + public void test_querySkuProductListByActivityId() { + Long request = 100301L; + Response> response = raffleActivityService.querySkuProductListByActivityId(request); + log.info("请求参数:{}", JSON.toJSONString(request)); + log.info("测试结果:{}", JSON.toJSONString(response)); + } + + @Test + public void test_queryUserCreditAccount() { + String request = "xiaofuge"; + Response response = raffleActivityService.queryUserCreditAccount(request); + log.info("请求参数:{}", JSON.toJSONString(request)); + log.info("测试结果:{}", JSON.toJSONString(response)); + } + + @Test + public void test_creditPayExchangeSku() throws InterruptedException { + SkuProductShopCartRequestDTO request = new SkuProductShopCartRequestDTO(); + request.setUserId("xiaofuge"); + request.setSku(9014L); + Response response = raffleActivityService.creditPayExchangeSku(request); + log.info("请求参数:{}", JSON.toJSONString(request)); + log.info("测试结果:{}", JSON.toJSONString(response)); + + new CountDownLatch(1).await(); } } diff --git a/bigmarket-app/src/test/java/cn/bugstack/test/trigger/RaffleStrategyControllerTest.java b/bigmarket-app/src/test/java/cn/bugstack/test/trigger/RaffleStrategyControllerTest.java index ee787c4847125a22acd7e2c7ad10aa77d2b24317..f7e8b1e86bd263f09624ba9a241c06ab0800fe7b 100644 --- a/bigmarket-app/src/test/java/cn/bugstack/test/trigger/RaffleStrategyControllerTest.java +++ b/bigmarket-app/src/test/java/cn/bugstack/test/trigger/RaffleStrategyControllerTest.java @@ -1,9 +1,8 @@ package cn.bugstack.test.trigger; import cn.bugstack.trigger.api.IRaffleStrategyService; -import cn.bugstack.trigger.api.dto.RaffleAwardListRequestDTO; -import cn.bugstack.trigger.api.dto.RaffleAwardListResponseDTO; -import cn.bugstack.types.model.Response; +import cn.bugstack.trigger.api.dto.*; +import cn.bugstack.trigger.api.response.Response; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.junit.Test; @@ -38,4 +37,15 @@ public class RaffleStrategyControllerTest { log.info("测试结果:{}", JSON.toJSONString(response)); } + @Test + public void test_queryRaffleStrategyRuleWeight() { + RaffleStrategyRuleWeightRequestDTO request = new RaffleStrategyRuleWeightRequestDTO(); + request.setUserId("xiaofuge"); + request.setActivityId(100301L); + + Response> response = raffleStrategyService.queryRaffleStrategyRuleWeight(request); + log.info("请求参数:{}", JSON.toJSONString(request)); + log.info("测试结果:{}", JSON.toJSONString(response)); + } + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/event/ActivitySkuStockZeroMessageEvent.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/event/ActivitySkuStockZeroMessageEvent.java index 808686f979047076628661e051369d30fef26df4..fa071a888c1179d0ac264411f01751dbb3d9bf6d 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/event/ActivitySkuStockZeroMessageEvent.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/event/ActivitySkuStockZeroMessageEvent.java @@ -4,12 +4,11 @@ import cn.bugstack.types.event.BaseEvent; import org.apache.commons.lang3.RandomStringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; import java.util.Date; /** - * @author zhaoyongfeng + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 活动sku库存清空消息 * @create 2024-03-30 12:43 */ diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/aggregate/CreatePartakeOrderAggregate.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/aggregate/CreatePartakeOrderAggregate.java index 7670cd4bdff10d47258a4115cb78fa9e0d6f26ef..b1a81601bcb33ed27dd7faf9c584667eee9f0cf4 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/aggregate/CreatePartakeOrderAggregate.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/aggregate/CreatePartakeOrderAggregate.java @@ -10,16 +10,16 @@ import lombok.Data; import lombok.NoArgsConstructor; /** - * @ClassName: CreatePartakeOrderAggregate - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/6 23:59 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 参与活动订单聚合对象 + * @create 2024-04-05 08:31 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class CreatePartakeOrderAggregate { + /** * 用户ID */ diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/aggregate/CreateQuotaOrderAggregate.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/aggregate/CreateQuotaOrderAggregate.java index bc493f884307656635999abac3ebef566a9afc8b..664a28db240410a50f61afa915b124eb39ce58c1 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/aggregate/CreateQuotaOrderAggregate.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/aggregate/CreateQuotaOrderAggregate.java @@ -1,6 +1,7 @@ package cn.bugstack.domain.activity.model.aggregate; import cn.bugstack.domain.activity.model.entity.ActivityOrderEntity; +import cn.bugstack.domain.activity.model.valobj.OrderStateVO; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -47,4 +48,8 @@ public class CreateQuotaOrderAggregate { */ private ActivityOrderEntity activityOrderEntity; + public void setOrderState(OrderStateVO orderState) { + this.activityOrderEntity.setState(orderState); + } + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityAccountDayEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityAccountDayEntity.java index 71cb0600f3dd0b28456e6d6c23816a0bdb720bc7..3a3a6c8eeb2a6a0a8f1d1b4e933d087629a82430 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityAccountDayEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityAccountDayEntity.java @@ -6,16 +6,16 @@ import lombok.Data; import lombok.NoArgsConstructor; /** - * @ClassName: ActivityAccountDayEntity - * @Description: 活动账户(日)实体对象 - * @Author: zhaoyongfeng - * @Date: 2024/12/6 23:40 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 活动账户(日)实体对象 + * @create 2024-04-05 08:37 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class ActivityAccountDayEntity { + /** 用户ID */ private String userId; /** 活动ID */ diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityAccountEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityAccountEntity.java index c4b3cc46453c084f9ee89c4ddc45de760a37452a..02d4400e3243e513a3b638825a6a99cb0a87ba5e 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityAccountEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityAccountEntity.java @@ -6,8 +6,8 @@ import lombok.Data; import lombok.NoArgsConstructor; /** - * @author zhaoyongfeng - * @description 活动账户实体对象 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 活动账户(总)实体对象 * @create 2024-03-16 10:43 */ @Data diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityAccountMonthEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityAccountMonthEntity.java index d2efe25ad74a0a4eb503928370be4bb550474cf5..b21821acb31802dcd7c0e0292d72e4466331672c 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityAccountMonthEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityAccountMonthEntity.java @@ -6,16 +6,16 @@ import lombok.Data; import lombok.NoArgsConstructor; /** - * @ClassName: ActivityAccountMonthEntity - * @Description: 活动账户(月)实体对象 - * @Author: zhaoyongfeng - * @Date: 2024/12/6 23:40 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 活动账户(月)实体对象 + * @create 2024-04-05 08:38 */ @Data @Builder -@NoArgsConstructor @AllArgsConstructor +@NoArgsConstructor public class ActivityAccountMonthEntity { + /** 用户ID */ private String userId; /** 活动ID */ @@ -26,4 +26,5 @@ public class ActivityAccountMonthEntity { private Integer monthCount; /** 月次数-剩余 */ private Integer monthCountSurplus; + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityCountEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityCountEntity.java index 86d1496608eabd9ec739583bb046e63d220755d0..7d918f8b968317228d9a4ee98c97e6b8f65cae65 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityCountEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityCountEntity.java @@ -6,7 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; /** - * @author zhaoyongfeng + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 活动次数实体对象 * @create 2024-03-16 11:19 */ diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityEntity.java index 0144222bb7d82d1a19e9a8149cfd202de4b8b940..6580c9f8939c5856bb93fe4e2c9edfaae514e095 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityEntity.java @@ -9,7 +9,7 @@ import lombok.NoArgsConstructor; import java.util.Date; /** - * @author zhaoyongfeng + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 活动实体对象 * @create 2024-03-16 11:15 */ diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityOrderEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityOrderEntity.java index 2872a667c3196c6f2068dc9050224565960c9307..0dc37b5ca1a2551b6c8b8813097a7cd44f0c9646 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityOrderEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivityOrderEntity.java @@ -6,10 +6,11 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.math.BigDecimal; import java.util.Date; /** - * @author zhaoyongfeng + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 活动参与实体对象 * @create 2024-03-16 09:02 */ @@ -69,6 +70,11 @@ public class ActivityOrderEntity { */ private Integer monthCount; + /** + * 支付金额 + */ + private BigDecimal payAmount; + /** * 订单状态 */ diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivitySkuEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivitySkuEntity.java index 67a1ede1f6160e11b81cfb9907c536e08e2f5b77..86790f4489bd3e4c0101bb6d9f5b8d5ce0882086 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivitySkuEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/ActivitySkuEntity.java @@ -5,8 +5,10 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.math.BigDecimal; + /** - * @author zhaoyongfeng + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 活动sku实体对象 * @create 2024-03-16 10:29 */ @@ -26,5 +28,7 @@ public class ActivitySkuEntity { private Integer stockCount; /** 剩余库存 */ private Integer stockCountSurplus; + /** 商品金额【积分】 */ + private BigDecimal productAmount; } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/DeliveryOrderEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/DeliveryOrderEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..1b6b6c4fec777300d63bce14abf12baaddb6042f --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/DeliveryOrderEntity.java @@ -0,0 +1,28 @@ +package cn.bugstack.domain.activity.model.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 出货单实体对象 + * @create 2024-06-08 20:02 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class DeliveryOrderEntity { + + /** + * 用户ID + */ + private String userId; + /** + * 业务仿重ID - 外部透传。返利、行为等唯一标识 + */ + private String outBusinessNo; + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/PartakeRaffleActivityEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/PartakeRaffleActivityEntity.java index 70df39abfe1e8dabbc31c974261578ca5300d915..ec2ed37de9a85c2f3420039f91565efbefc65d3b 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/PartakeRaffleActivityEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/PartakeRaffleActivityEntity.java @@ -6,16 +6,16 @@ import lombok.Data; import lombok.NoArgsConstructor; /** - * @ClassName: PartakeRaffleActivityEntity - * @Description: 参与抽奖活动实体对象 - * @Author: zhaoyongfeng - * @Date: 2024/12/6 21:21 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 参与抽奖活动实体对象 + * @create 2024-04-04 20:02 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class PartakeRaffleActivityEntity { + /** * 用户ID */ @@ -25,4 +25,5 @@ public class PartakeRaffleActivityEntity { * 活动ID */ private Long activityId; + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/SkuProductEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/SkuProductEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..35dd5f07469cb5f7825b8590324630c275702784 --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/SkuProductEntity.java @@ -0,0 +1,69 @@ +package cn.bugstack.domain.activity.model.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description sku商品实体对象 + * @create 2024-06-15 09:17 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SkuProductEntity { + + /** + * 商品sku + */ + private Long sku; + /** + * 活动ID + */ + private Long activityId; + /** + * 活动个人参与次数ID + */ + private Long activityCountId; + /** + * 库存总量 + */ + private Integer stockCount; + /** + * 剩余库存 + */ + private Integer stockCountSurplus; + /** + * 商品金额【积分】 + */ + private BigDecimal productAmount; + + /** + * 活动配置的次数 - 购买商品后可以获得的次数 + */ + private ActivityCount activityCount; + + @Data + public static class ActivityCount { + /** + * 总次数 + */ + private Integer totalCount; + + /** + * 日次数 + */ + private Integer dayCount; + + /** + * 月次数 + */ + private Integer monthCount; + } + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/SkuRechargeEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/SkuRechargeEntity.java index ec4b575c37a4a8f24d66cbffe6e1f66089bd9052..4aa2453e8baf874ad39dd7e2f9f6ed2764ad7abe 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/SkuRechargeEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/SkuRechargeEntity.java @@ -1,13 +1,20 @@ package cn.bugstack.domain.activity.model.entity; +import cn.bugstack.domain.activity.model.valobj.OrderTradeTypeVO; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** - * @author zhaoyongfeng + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 活动商品充值实体对象 * @create 2024-03-23 09:11 */ @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class SkuRechargeEntity { /** 用户ID */ @@ -16,5 +23,7 @@ public class SkuRechargeEntity { private Long sku; /** 幂等业务单号,外部谁充值谁透传,这样来保证幂等(多次调用也能确保结果唯一,不会多次充值)。 */ private String outBusinessNo; + /** 用户ID */ + private OrderTradeTypeVO orderTradeType = OrderTradeTypeVO.rebate_no_pay_trade; } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/UnpaidActivityOrderEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/UnpaidActivityOrderEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..68e94e31e8c720cdabc6d6aab27257dcdfc5c38a --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/UnpaidActivityOrderEntity.java @@ -0,0 +1,30 @@ +package cn.bugstack.domain.activity.model.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 未完成支付的活动单 + * @create 2024-06-15 08:31 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class UnpaidActivityOrderEntity { + + // 用户ID + private String userId; + // 订单ID + private String orderId; + // 外部透传ID + private String outBusinessNo; + // 订单金额 + private BigDecimal payAmount; + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/UserRaffleOrderEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/UserRaffleOrderEntity.java index 6cab339e40d1dbce87e17f854f2f2c66ee023b77..0cb5a2f11908e8a681289f9109c64fc1345e8591 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/UserRaffleOrderEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/entity/UserRaffleOrderEntity.java @@ -1,7 +1,6 @@ package cn.bugstack.domain.activity.model.entity; import cn.bugstack.domain.activity.model.valobj.UserRaffleOrderStateVO; -import cn.bugstack.domain.award.model.valobj.AwardStateVO; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -10,10 +9,9 @@ import lombok.NoArgsConstructor; import java.util.Date; /** - * @ClassName: UserRaffleOrderEntity - * @Description: 用户抽奖订单实体对象 - * @Author: zhaoyongfeng - * @Date: 2024/12/6 21:21 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 用户抽奖订单实体对象 + * @create 2024-04-04 18:53 */ @Data @Builder @@ -37,4 +35,5 @@ public class UserRaffleOrderEntity { private UserRaffleOrderStateVO orderState; /** 结束时间 */ private Date endDateTime; + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/ActivitySkuStockKeyVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/ActivitySkuStockKeyVO.java index 5289f95e423fd2460984af975703744db005dbb9..d3c3e45f9fd6b7d1afd8fba7dc391745cc40ece9 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/ActivitySkuStockKeyVO.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/ActivitySkuStockKeyVO.java @@ -6,7 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; /** - * @author zhaoyongfeng + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 活动sku库存 key 值对象 * @create 2024-03-30 09:44 */ diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/ActivityStateVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/ActivityStateVO.java index 4d4d5692cfbc26d1252046908a15df5d06307912..4959023153d2c88c81e106f6cc4006b0cbc84f7e 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/ActivityStateVO.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/ActivityStateVO.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * @author zhaoyongfeng + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 活动状态值对象 * @create 2024-03-16 11:16 */ diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/OrderStateVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/OrderStateVO.java index 2c3336b33b7353880eff0664beeea1b7d546ba78..c9164a4ce94eb499a8a7b2dc61bf35d5484eb5c7 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/OrderStateVO.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/OrderStateVO.java @@ -1,11 +1,10 @@ package cn.bugstack.domain.activity.model.valobj; import lombok.AllArgsConstructor; -import lombok.Data; import lombok.Getter; /** - * @author zhaoyongfeng + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 订单状态枚举值对象(用于描述对象属性的值,如枚举,不影响数据库操作的对象,无生命周期) * @create 2024-03-16 10:34 */ @@ -13,7 +12,9 @@ import lombok.Getter; @AllArgsConstructor public enum OrderStateVO { - completed("completed", "完成"); + wait_pay("wait_pay","待支付"), + completed("completed", "完成"), + ; private final String code; private final String desc; diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/OrderTradeTypeVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/OrderTradeTypeVO.java new file mode 100644 index 0000000000000000000000000000000000000000..ea2b9da9bf3eacb848be67aa97462214c746d402 --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/OrderTradeTypeVO.java @@ -0,0 +1,22 @@ +package cn.bugstack.domain.activity.model.valobj; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 订单交易类型 + * @create 2024-06-08 18:27 + */ +@Getter +@AllArgsConstructor +public enum OrderTradeTypeVO { + + credit_pay_trade("credit_pay_trade","积分兑换,需要支付类交易"), + rebate_no_pay_trade("rebate_no_pay_trade", "返利奖品,不需要支付类交易"), + ; + + private final String code; + private final String desc; + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/UserRaffleOrderStateVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/UserRaffleOrderStateVO.java index 53da3f19151f5361d9a52c22ab356e1d03fbb088..18ebc41fa6c1ef23721da8eb9d73962dd5e06231 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/UserRaffleOrderStateVO.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/model/valobj/UserRaffleOrderStateVO.java @@ -4,14 +4,14 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * @ClassName: UserRaffleOrderStateVO - * @Description: 用户抽奖订单状态枚举 - * @Author: zhaoyongfeng - * @Date: 2024/12/6 21:22 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 用户抽奖订单状态枚举 + * @create 2024-04-04 18:55 */ @Getter @AllArgsConstructor public enum UserRaffleOrderStateVO { + create("create", "创建"), used("used", "已使用"), cancel("cancel", "已作废"), diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/repository/IActivityRepository.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/repository/IActivityRepository.java index f31d259cddab681e115b99490206e4429754f67b..469d2bced79de190bd729c13277ea9e75361a769 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/repository/IActivityRepository.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/repository/IActivityRepository.java @@ -5,24 +5,26 @@ import cn.bugstack.domain.activity.model.aggregate.CreateQuotaOrderAggregate; import cn.bugstack.domain.activity.model.entity.*; import cn.bugstack.domain.activity.model.valobj.ActivitySkuStockKeyVO; +import java.math.BigDecimal; import java.util.Date; import java.util.List; -/* - * @return - * @author zhaoyongfeng +/** + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 活动仓储接口 - * - * @param null + * @create 2024-03-16 10:31 */ public interface IActivityRepository { + ActivitySkuEntity queryActivitySku(Long sku); ActivityEntity queryRaffleActivityByActivityId(Long activityId); ActivityCountEntity queryRaffleActivityCountByActivityCountId(Long activityCountId); - void doSaveOrder(CreateQuotaOrderAggregate createOrderAggregate); + void doSaveNoPayOrder(CreateQuotaOrderAggregate createOrderAggregate); + + void doSaveCreditPayOrder(CreateQuotaOrderAggregate createQuotaOrderAggregate); void cacheActivitySkuStockCount(String cacheKey, Integer stockCount); @@ -55,4 +57,13 @@ public interface IActivityRepository { ActivityAccountEntity queryActivityAccountEntity(Long activityId, String userId); Integer queryRaffleActivityAccountPartakeCount(Long activityId, String userId); + + void updateOrder(DeliveryOrderEntity deliveryOrderEntity); + + UnpaidActivityOrderEntity queryUnpaidActivityOrder(SkuRechargeEntity skuRechargeEntity); + + List querySkuProductEntityListByActivityId(Long activityId); + + BigDecimal queryUserCreditAccountAmount(String userId); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivityAccountQuotaService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivityAccountQuotaService.java index a5c440846a1d52cd2968547bdb8f6430cfb2afd3..282e57d13f1668425c20abef0cace40e31258b43 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivityAccountQuotaService.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivityAccountQuotaService.java @@ -1,14 +1,17 @@ package cn.bugstack.domain.activity.service; import cn.bugstack.domain.activity.model.entity.ActivityAccountEntity; +import cn.bugstack.domain.activity.model.entity.DeliveryOrderEntity; import cn.bugstack.domain.activity.model.entity.SkuRechargeEntity; +import cn.bugstack.domain.activity.model.entity.UnpaidActivityOrderEntity; -/* - * @return - * @author zhaoyongfeng - * @description 抽奖活动订单接口 +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖活动账户额度服务 + * @create 2024-03-16 08:38 */ public interface IRaffleActivityAccountQuotaService { + /** * 创建 sku 账户充值订单,给用户增加抽奖次数 *

@@ -16,31 +19,41 @@ public interface IRaffleActivityAccountQuotaService { * 2. 对于用户可获得的抽奖次数,比如首次进来就有一次,则是依赖于运营配置的动作,在前端页面上。用户点击后,可以获得一次抽奖次数。 * * @param skuRechargeEntity 活动商品充值实体对象 - * @return 活动ID + * @return 未支付订单 */ - String createOrder(SkuRechargeEntity skuRechargeEntity); + UnpaidActivityOrderEntity createOrder(SkuRechargeEntity skuRechargeEntity); + /** - * 查询活动账户 - 日,参与次数 + * 订单出货 - 积分充值 + * @param deliveryOrderEntity 出货单实体对象 + */ + void updateOrder(DeliveryOrderEntity deliveryOrderEntity); + + /** + * 查询活动账户 - 总,参与次数 * * @param activityId 活动ID * @param userId 用户ID * @return 参与次数 */ - Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId); + Integer queryRaffleActivityAccountPartakeCount(Long activityId, String userId); + /** - * 查询活动账户额度「总、月、日」 + * 查询活动账户 - 日,参与次数 * * @param activityId 活动ID * @param userId 用户ID - * @return 账户实体 + * @return 参与次数 */ - ActivityAccountEntity queryActivityAccountEntity(Long activityId, String userId); + Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId); + /** - * 查询活动账户 - 总,参与次数 + * 查询活动账户额度「总、月、日」 * * @param activityId 活动ID * @param userId 用户ID - * @return 参与次数 + * @return 账户实体 */ - Integer queryRaffleActivityAccountPartakeCount(Long activityId, String userId); + ActivityAccountEntity queryActivityAccountEntity(Long activityId, String userId); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivityPartakeService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivityPartakeService.java index c43b9c6938a5cf4f3c7abbf3985268cf26c8e63b..bf541ac42a526abcc16d45de756eab2da5b092cd 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivityPartakeService.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivityPartakeService.java @@ -2,27 +2,29 @@ package cn.bugstack.domain.activity.service; import cn.bugstack.domain.activity.model.entity.PartakeRaffleActivityEntity; import cn.bugstack.domain.activity.model.entity.UserRaffleOrderEntity; -/* - * @return - * @author zhaoyongfeng + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 抽奖活动参与服务 + * @create 2024-04-04 19:50 */ public interface IRaffleActivityPartakeService { + /** * 创建抽奖单;用户参与抽奖活动,扣减活动账户库存,产生抽奖单。如存在未被使用的抽奖单则直接返回已存在的抽奖单。 * - * @param partakeRaffleActivityEntity 参与抽奖活动实体对象 + * @param userId 用户ID + * @param activityId 活动ID * @return 用户抽奖订单实体对象 */ - UserRaffleOrderEntity createOrder(PartakeRaffleActivityEntity partakeRaffleActivityEntity); + UserRaffleOrderEntity createOrder(String userId, Long activityId); /** * 创建抽奖单;用户参与抽奖活动,扣减活动账户库存,产生抽奖单。如存在未被使用的抽奖单则直接返回已存在的抽奖单。 * - * @param userId 用户ID - * @param activityId 活动ID + * @param partakeRaffleActivityEntity 参与抽奖活动实体对象 * @return 用户抽奖订单实体对象 */ - UserRaffleOrderEntity createOrder(String userId, Long activityId); + UserRaffleOrderEntity createOrder(PartakeRaffleActivityEntity partakeRaffleActivityEntity); } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivitySkuProductService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivitySkuProductService.java new file mode 100644 index 0000000000000000000000000000000000000000..ee3d92331fcb9c80dbaecb78a0a058a501618e51 --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivitySkuProductService.java @@ -0,0 +1,21 @@ +package cn.bugstack.domain.activity.service; + +import cn.bugstack.domain.activity.model.entity.SkuProductEntity; + +import java.util.List; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description sku商品服务接口 + * @create 2024-06-15 09:14 + */ +public interface IRaffleActivitySkuProductService { + + /** + * 查询当前活动ID下,创建的 sku 商品。「sku可以兑换活动抽奖次数」 + * @param activityId 活动ID + * @return 返回sku商品集合 + */ + List querySkuProductEntityListByActivityId(Long activityId); + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivitySkuStockService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivitySkuStockService.java index e475e6e9ce6c18deb69ce1471fe64541a869c397..a802b42cc30b3bff06b276577f6759adb75053bc 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivitySkuStockService.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/IRaffleActivitySkuStockService.java @@ -2,12 +2,13 @@ package cn.bugstack.domain.activity.service; import cn.bugstack.domain.activity.model.valobj.ActivitySkuStockKeyVO; -/* - * @return - * @author zhaoyongfeng - * @description 活动sku库存处理接口 +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖活动SKU库存服务 + * @create 2024-03-30 09:55 */ public interface IRaffleActivitySkuStockService { + /** * 获取活动sku库存消耗队列 * @@ -34,4 +35,5 @@ public interface IRaffleActivitySkuStockService { * @param sku 活动商品 */ void clearActivitySkuStock(Long sku); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/armory/ActivityArmory.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/armory/ActivityArmory.java index 29802b456eac1c9ade2a9250683935fe1cb14da5..f0fb864f4611ee3ec3272a1ea1898976bd37b246 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/armory/ActivityArmory.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/armory/ActivityArmory.java @@ -1,9 +1,7 @@ package cn.bugstack.domain.activity.service.armory; import cn.bugstack.domain.activity.model.entity.ActivitySkuEntity; -import cn.bugstack.domain.activity.model.valobj.ActivitySkuStockKeyVO; import cn.bugstack.domain.activity.repository.IActivityRepository; -import cn.bugstack.domain.strategy.model.valobj.StrategyAwardStockKeyVO; import cn.bugstack.types.common.Constants; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -11,7 +9,6 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Date; import java.util.List; -import java.util.concurrent.TimeUnit; /** * @author Fuzhengwei bugstack.cn @小傅哥 @@ -25,21 +22,6 @@ public class ActivityArmory implements IActivityArmory, IActivityDispatch { @Resource private IActivityRepository activityRepository; - @Override - public boolean assembleActivitySku(Long sku) { - // 预热活动sku库存 - ActivitySkuEntity activitySkuEntity = activityRepository.queryActivitySku(sku); - cacheActivitySkuStockCount(sku, activitySkuEntity.getStockCount()); - - // 预热活动【查询时预热到缓存】 - activityRepository.queryRaffleActivityByActivityId(activitySkuEntity.getActivityId()); - - // 预热活动次数【查询时预热到缓存】 - activityRepository.queryRaffleActivityCountByActivityCountId(activitySkuEntity.getActivityCountId()); - - return true; - } - @Override public boolean assembleActivitySkuByActivityId(Long activityId) { List activitySkuEntities = activityRepository.queryActivitySkuListByActivityId(activityId); @@ -55,6 +37,21 @@ public class ActivityArmory implements IActivityArmory, IActivityDispatch { return true; } + @Override + public boolean assembleActivitySku(Long sku) { + // 预热活动sku库存 + ActivitySkuEntity activitySkuEntity = activityRepository.queryActivitySku(sku); + cacheActivitySkuStockCount(sku, activitySkuEntity.getStockCountSurplus()); + + // 预热活动【查询时预热到缓存】 + activityRepository.queryRaffleActivityByActivityId(activitySkuEntity.getActivityId()); + + // 预热活动次数【查询时预热到缓存】 + activityRepository.queryRaffleActivityCountByActivityCountId(activitySkuEntity.getActivityCountId()); + + return true; + } + private void cacheActivitySkuStockCount(Long sku, Integer stockCount) { String cacheKey = Constants.RedisKey.ACTIVITY_SKU_STOCK_COUNT_KEY + sku; activityRepository.cacheActivitySkuStockCount(cacheKey, stockCount); diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/armory/IActivityArmory.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/armory/IActivityArmory.java index 664b42149035cde7e0f7fa8a93b640e35fe1131d..02ca521e3d45b89bf38d9eee131b5799cac037ba 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/armory/IActivityArmory.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/armory/IActivityArmory.java @@ -7,7 +7,8 @@ package cn.bugstack.domain.activity.service.armory; */ public interface IActivityArmory { + boolean assembleActivitySkuByActivityId(Long activityId); + boolean assembleActivitySku(Long sku); - boolean assembleActivitySkuByActivityId(Long activityId); } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/armory/IActivityDispatch.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/armory/IActivityDispatch.java index f0f8c2857355cdd41d8b78c6f6068183a45bb917..1d623c077f5a4edef226b18ec21d2ea6b2503551 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/armory/IActivityDispatch.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/armory/IActivityDispatch.java @@ -1,7 +1,5 @@ package cn.bugstack.domain.activity.service.armory; -import cn.bugstack.domain.activity.model.valobj.ActivitySkuStockKeyVO; - import java.util.Date; /** diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/partake/AbstractRaffleActivityPartake.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/partake/AbstractRaffleActivityPartake.java index 60bd1304953c4cc80fb10a18804a62f71b9d2d99..60956ced7889ec57dd0bb1cd58e194486000c7cd 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/partake/AbstractRaffleActivityPartake.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/partake/AbstractRaffleActivityPartake.java @@ -12,23 +12,22 @@ import cn.bugstack.types.exception.AppException; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; -import javax.annotation.Resource; import java.util.Date; /** - * @ClassName: AbstractRaffleActivityPartake - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/6 23:34 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖活动参与抽奖类 + * @create 2024-04-05 07:53 */ @Slf4j public abstract class AbstractRaffleActivityPartake implements IRaffleActivityPartakeService { - @Resource + protected final IActivityRepository activityRepository; public AbstractRaffleActivityPartake(IActivityRepository activityRepository) { this.activityRepository = activityRepository; } + @Override public UserRaffleOrderEntity createOrder(String userId, Long activityId) { return createOrder(PartakeRaffleActivityEntity.builder() @@ -36,29 +35,32 @@ public abstract class AbstractRaffleActivityPartake implements IRaffleActivityPa .activityId(activityId) .build()); } + @Override public UserRaffleOrderEntity createOrder(PartakeRaffleActivityEntity partakeRaffleActivityEntity) { // 0. 基础信息 String userId = partakeRaffleActivityEntity.getUserId(); Long activityId = partakeRaffleActivityEntity.getActivityId(); Date currentDate = new Date(); - + log.info("创建活动抽奖单开始 userId:{} activityId:{}", userId, activityId); // 1. 活动查询 ActivityEntity activityEntity = activityRepository.queryRaffleActivityByActivityId(activityId); // 校验;活动状态 if (!ActivityStateVO.open.equals(activityEntity.getState())) { + log.error("创建活动抽奖单失败,活动状态未开启 activityId:{} state:{}", activityId, activityEntity.getState()); throw new AppException(ResponseCode.ACTIVITY_STATE_ERROR.getCode(), ResponseCode.ACTIVITY_STATE_ERROR.getInfo()); } // 校验;活动日期「开始时间 <- 当前时间 -> 结束时间」 if (activityEntity.getBeginDateTime().after(currentDate) || activityEntity.getEndDateTime().before(currentDate)) { + log.error("创建活动抽奖单失败,活动时间未开始 activityId:{} state:{}", activityId, activityEntity.getState()); throw new AppException(ResponseCode.ACTIVITY_DATE_ERROR.getCode(), ResponseCode.ACTIVITY_DATE_ERROR.getInfo()); } // 2. 查询未被使用的活动参与订单记录 UserRaffleOrderEntity userRaffleOrderEntity = activityRepository.queryNoUsedRaffleOrder(partakeRaffleActivityEntity); if (null != userRaffleOrderEntity) { - log.info("创建参与活动订单 userId:{} activityId:{} userRaffleOrderEntity:{}", userId, activityId, JSON.toJSONString(userRaffleOrderEntity)); + log.info("创建参与活动订单存在 userId:{} activityId:{} userRaffleOrderEntity:{}", userId, activityId, JSON.toJSONString(userRaffleOrderEntity)); return userRaffleOrderEntity; } @@ -73,14 +75,13 @@ public abstract class AbstractRaffleActivityPartake implements IRaffleActivityPa // 6. 保存聚合对象 - 一个领域内的一个聚合是一个事务操作 activityRepository.saveCreatePartakeOrderAggregate(createPartakeOrderAggregate); - + log.info("创建活动抽奖单完成 userId:{} activityId:{} orderId:{}", userId, activityId, userRaffleOrder.getOrderId()); // 7. 返回订单信息 return userRaffleOrder; } - - protected abstract CreatePartakeOrderAggregate doFilterAccount(String userId, Long activityId, Date currentDate); protected abstract UserRaffleOrderEntity buildUserRaffleOrder(String userId, Long activityId, Date currentDate); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/partake/RaffleActivityPartakeService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/partake/RaffleActivityPartakeService.java index 6cae6703f4f0d705210e446559378dc3e91338be..e38f6319eb8b680f6d45d9442fc3a4de40dc5ea7 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/partake/RaffleActivityPartakeService.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/partake/RaffleActivityPartakeService.java @@ -13,13 +13,13 @@ import java.text.SimpleDateFormat; import java.util.Date; /** - * @ClassName: RaffleActivityPartakeService - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/7 0:00 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description + * @create 2024-04-05 07:53 */ @Service public class RaffleActivityPartakeService extends AbstractRaffleActivityPartake{ + private final SimpleDateFormat dateFormatMonth = new SimpleDateFormat("yyyy-MM"); private final SimpleDateFormat dateFormatDay = new SimpleDateFormat("yyyy-MM-dd"); @@ -54,7 +54,7 @@ public class RaffleActivityPartakeService extends AbstractRaffleActivityPartake{ activityAccountMonthEntity.setActivityId(activityId); activityAccountMonthEntity.setMonth(month); activityAccountMonthEntity.setMonthCount(activityAccountEntity.getMonthCount()); - activityAccountMonthEntity.setMonthCountSurplus(activityAccountEntity.getMonthCountSurplus()); + activityAccountMonthEntity.setMonthCountSurplus(activityAccountEntity.getMonthCount()); } // 查询日账户额度 @@ -71,7 +71,7 @@ public class RaffleActivityPartakeService extends AbstractRaffleActivityPartake{ activityAccountDayEntity.setActivityId(activityId); activityAccountDayEntity.setDay(day); activityAccountDayEntity.setDayCount(activityAccountEntity.getDayCount()); - activityAccountDayEntity.setDayCountSurplus(activityAccountEntity.getDayCountSurplus()); + activityAccountDayEntity.setDayCountSurplus(activityAccountEntity.getDayCount()); } // 构建对象 @@ -99,6 +99,7 @@ public class RaffleActivityPartakeService extends AbstractRaffleActivityPartake{ userRaffleOrder.setOrderId(RandomStringUtils.randomNumeric(12)); userRaffleOrder.setOrderTime(currentDate); userRaffleOrder.setOrderState(UserRaffleOrderStateVO.create); + userRaffleOrder.setEndDateTime(activityEntity.getEndDateTime()); return userRaffleOrder; } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/product/RaffleActivitySkuProductService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/product/RaffleActivitySkuProductService.java new file mode 100644 index 0000000000000000000000000000000000000000..8cabac83fc7633918d520e9e137c38a7a8f2c351 --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/product/RaffleActivitySkuProductService.java @@ -0,0 +1,27 @@ +package cn.bugstack.domain.activity.service.product; + +import cn.bugstack.domain.activity.model.entity.SkuProductEntity; +import cn.bugstack.domain.activity.repository.IActivityRepository; +import cn.bugstack.domain.activity.service.IRaffleActivitySkuProductService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description sku商品服务 + * @create 2024-06-15 09:30 + */ +@Service +public class RaffleActivitySkuProductService implements IRaffleActivitySkuProductService { + + @Resource + private IActivityRepository repository; + + @Override + public List querySkuProductEntityListByActivityId(Long activityId) { + return repository.querySkuProductEntityListByActivityId(activityId); + } + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/AbstractRaffleActivityAccountQuota.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/AbstractRaffleActivityAccountQuota.java index 18d10e18288cc494022f6a058bec7e6e4c3ca9f6..3860ece2cadffaf6f813a1607d454e8b90fbd734 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/AbstractRaffleActivityAccountQuota.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/AbstractRaffleActivityAccountQuota.java @@ -2,8 +2,10 @@ package cn.bugstack.domain.activity.service.quota; import cn.bugstack.domain.activity.model.aggregate.CreateQuotaOrderAggregate; import cn.bugstack.domain.activity.model.entity.*; +import cn.bugstack.domain.activity.model.valobj.OrderTradeTypeVO; import cn.bugstack.domain.activity.repository.IActivityRepository; import cn.bugstack.domain.activity.service.IRaffleActivityAccountQuotaService; +import cn.bugstack.domain.activity.service.quota.policy.ITradePolicy; import cn.bugstack.domain.activity.service.quota.rule.IActionChain; import cn.bugstack.domain.activity.service.quota.rule.factory.DefaultActivityChainFactory; import cn.bugstack.types.enums.ResponseCode; @@ -11,18 +13,27 @@ import cn.bugstack.types.exception.AppException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -/* - * @return - * @author zhaoyongfeng +import java.math.BigDecimal; +import java.util.Map; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 抽奖活动抽象类,定义标准的流程 + * @create 2024-03-16 08:42 */ @Slf4j public abstract class AbstractRaffleActivityAccountQuota extends RaffleActivityAccountQuotaSupport implements IRaffleActivityAccountQuotaService { - public AbstractRaffleActivityAccountQuota(IActivityRepository activityRepository, DefaultActivityChainFactory defaultActivityChainFactory) { + + // 不同类型的交易策略实现类,通过构造函数注入到 Map 中,教程;https://bugstack.cn/md/road-map/spring-dependency-injection.html + private final Map tradePolicyGroup; + + public AbstractRaffleActivityAccountQuota(IActivityRepository activityRepository, DefaultActivityChainFactory defaultActivityChainFactory, Map tradePolicyGroup) { super(activityRepository, defaultActivityChainFactory); + this.tradePolicyGroup = tradePolicyGroup; } + @Override - public String createOrder(SkuRechargeEntity skuRechargeEntity) { + public UnpaidActivityOrderEntity createOrder(SkuRechargeEntity skuRechargeEntity) { // 1. 参数校验 String userId = skuRechargeEntity.getUserId(); Long sku = skuRechargeEntity.getSku(); @@ -31,31 +42,46 @@ public abstract class AbstractRaffleActivityAccountQuota extends RaffleActivityA throw new AppException(ResponseCode.ILLEGAL_PARAMETER.getCode(), ResponseCode.ILLEGAL_PARAMETER.getInfo()); } - // 2. 查询基础信息 - // 2.1 通过sku查询活动信息 + // 2. 查询未支付订单「一个月以内的未支付订单」& 支付类型查询,非支付的走兑换 + if (OrderTradeTypeVO.credit_pay_trade.equals(skuRechargeEntity.getOrderTradeType())){ + UnpaidActivityOrderEntity unpaidCreditOrder = activityRepository.queryUnpaidActivityOrder(skuRechargeEntity); + if (null != unpaidCreditOrder) return unpaidCreditOrder; + } + + // 3. 查询基础信息「sku、活动、次数」 ActivitySkuEntity activitySkuEntity = queryActivitySku(sku); - // 2.2 查询活动信息 ActivityEntity activityEntity = queryRaffleActivityByActivityId(activitySkuEntity.getActivityId()); - // 2.3 查询次数信息(用户在活动上可参与的次数) ActivityCountEntity activityCountEntity = queryRaffleActivityCountByActivityCountId(activitySkuEntity.getActivityCountId()); - // 3. 活动动作规则校验 「过滤失败则直接抛异常」 + // 4. 账户额度 【交易属性的兑换,需要校验额度账户】 + if (OrderTradeTypeVO.credit_pay_trade.equals(skuRechargeEntity.getOrderTradeType())){ + BigDecimal availableAmount = activityRepository.queryUserCreditAccountAmount(userId); + if (availableAmount.compareTo(activitySkuEntity.getProductAmount()) < 0) { + throw new AppException(ResponseCode.USER_CREDIT_ACCOUNT_NO_AVAILABLE_AMOUNT.getCode(), ResponseCode.USER_CREDIT_ACCOUNT_NO_AVAILABLE_AMOUNT.getInfo()); + } + } + + // 5. 活动动作规则校验 「过滤失败则直接抛异常」- 责任链扣减sku库存 IActionChain actionChain = defaultActivityChainFactory.openActionChain(); actionChain.action(activitySkuEntity, activityEntity, activityCountEntity); - // 4. 构建订单聚合对象 + // 6. 构建订单聚合对象 CreateQuotaOrderAggregate createOrderAggregate = buildOrderAggregate(skuRechargeEntity, activitySkuEntity, activityEntity, activityCountEntity); - // 5. 保存订单 - doSaveOrder(createOrderAggregate); + // 7. 交易策略 - 【积分兑换,支付类订单】【返利无支付交易订单,直接充值到账】【订单状态变更交易类型策略】 + ITradePolicy tradePolicy = tradePolicyGroup.get(skuRechargeEntity.getOrderTradeType().getCode()); + tradePolicy.trade(createOrderAggregate); - // 6. 返回单号 - return createOrderAggregate.getActivityOrderEntity().getOrderId(); + // 8. 返回订单信息 + ActivityOrderEntity activityOrderEntity = createOrderAggregate.getActivityOrderEntity(); + return UnpaidActivityOrderEntity.builder() + .userId(userId) + .orderId(activityOrderEntity.getOrderId()) + .outBusinessNo(activityOrderEntity.getOutBusinessNo()) + .payAmount(activityOrderEntity.getPayAmount()) + .build(); } - protected abstract CreateQuotaOrderAggregate buildOrderAggregate(SkuRechargeEntity skuRechargeEntity, ActivitySkuEntity activitySkuEntity, ActivityEntity activityEntity, ActivityCountEntity activityCountEntity); - protected abstract void doSaveOrder(CreateQuotaOrderAggregate createOrderAggregate); - } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/RaffleActivityAccountQuotaService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/RaffleActivityAccountQuotaService.java index c03e0b7a413d1b548e2e8ad0a251e9c1b2f379b4..e293c352c9762843768067d11d90376c0d732f39 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/RaffleActivityAccountQuotaService.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/RaffleActivityAccountQuotaService.java @@ -3,24 +3,26 @@ package cn.bugstack.domain.activity.service.quota; import cn.bugstack.domain.activity.model.aggregate.CreateQuotaOrderAggregate; import cn.bugstack.domain.activity.model.entity.*; import cn.bugstack.domain.activity.model.valobj.ActivitySkuStockKeyVO; -import cn.bugstack.domain.activity.model.valobj.OrderStateVO; import cn.bugstack.domain.activity.repository.IActivityRepository; import cn.bugstack.domain.activity.service.IRaffleActivitySkuStockService; +import cn.bugstack.domain.activity.service.quota.policy.ITradePolicy; import cn.bugstack.domain.activity.service.quota.rule.factory.DefaultActivityChainFactory; import org.apache.commons.lang3.RandomStringUtils; import org.springframework.stereotype.Service; import java.util.Date; +import java.util.Map; -/* - * @return - * @author zhaoyongfeng +/** + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 抽奖活动服务 + * @create 2024-03-16 08:41 */ @Service public class RaffleActivityAccountQuotaService extends AbstractRaffleActivityAccountQuota implements IRaffleActivitySkuStockService { - public RaffleActivityAccountQuotaService(IActivityRepository activityRepository, DefaultActivityChainFactory defaultActivityChainFactory) { - super(activityRepository, defaultActivityChainFactory); + + public RaffleActivityAccountQuotaService(IActivityRepository activityRepository, DefaultActivityChainFactory defaultActivityChainFactory, Map tradePolicyGroup) { + super(activityRepository, defaultActivityChainFactory, tradePolicyGroup); } @Override @@ -38,7 +40,7 @@ public class RaffleActivityAccountQuotaService extends AbstractRaffleActivityAcc activityOrderEntity.setTotalCount(activityCountEntity.getTotalCount()); activityOrderEntity.setDayCount(activityCountEntity.getDayCount()); activityOrderEntity.setMonthCount(activityCountEntity.getMonthCount()); - activityOrderEntity.setState(OrderStateVO.completed); + activityOrderEntity.setPayAmount(activitySkuEntity.getProductAmount()); activityOrderEntity.setOutBusinessNo(skuRechargeEntity.getOutBusinessNo()); // 构建聚合对象 @@ -52,11 +54,6 @@ public class RaffleActivityAccountQuotaService extends AbstractRaffleActivityAcc .build(); } - @Override - protected void doSaveOrder(CreateQuotaOrderAggregate createOrderAggregate) { - activityRepository.doSaveOrder(createOrderAggregate); - } - @Override public ActivitySkuStockKeyVO takeQueueValue() throws InterruptedException { return activityRepository.takeQueueValue(); @@ -77,6 +74,16 @@ public class RaffleActivityAccountQuotaService extends AbstractRaffleActivityAcc activityRepository.clearActivitySkuStock(sku); } + @Override + public void updateOrder(DeliveryOrderEntity deliveryOrderEntity) { + activityRepository.updateOrder(deliveryOrderEntity); + } + + @Override + public Integer queryRaffleActivityAccountPartakeCount(Long activityId, String userId) { + return activityRepository.queryRaffleActivityAccountPartakeCount(activityId, userId); + } + @Override public Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId) { return activityRepository.queryRaffleActivityAccountDayPartakeCount(activityId, userId); @@ -87,8 +94,4 @@ public class RaffleActivityAccountQuotaService extends AbstractRaffleActivityAcc return activityRepository.queryActivityAccountEntity(activityId, userId); } - @Override - public Integer queryRaffleActivityAccountPartakeCount(Long activityId, String userId) { - return activityRepository.queryRaffleActivityAccountPartakeCount(activityId, userId); - } } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/RaffleActivityAccountQuotaSupport.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/RaffleActivityAccountQuotaSupport.java index d853c6fae199e7c39d08a446846760f9279161a4..e6a8cc013fbe801bf826f34941c251e3a96059db 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/RaffleActivityAccountQuotaSupport.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/RaffleActivityAccountQuotaSupport.java @@ -6,12 +6,13 @@ import cn.bugstack.domain.activity.model.entity.ActivitySkuEntity; import cn.bugstack.domain.activity.repository.IActivityRepository; import cn.bugstack.domain.activity.service.quota.rule.factory.DefaultActivityChainFactory; -/* - * @return - * @author zhaoyongfeng +/** + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 抽奖活动的支撑类 + * @create 2024-03-23 09:27 */ public class RaffleActivityAccountQuotaSupport { + protected DefaultActivityChainFactory defaultActivityChainFactory; protected IActivityRepository activityRepository; @@ -32,4 +33,5 @@ public class RaffleActivityAccountQuotaSupport { public ActivityCountEntity queryRaffleActivityCountByActivityCountId(Long activityCountId) { return activityRepository.queryRaffleActivityCountByActivityCountId(activityCountId); } + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/policy/ITradePolicy.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/policy/ITradePolicy.java new file mode 100644 index 0000000000000000000000000000000000000000..be87d483021ae5a4e8b9ed481c2f3569df584fce --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/policy/ITradePolicy.java @@ -0,0 +1,14 @@ +package cn.bugstack.domain.activity.service.quota.policy; + +import cn.bugstack.domain.activity.model.aggregate.CreateQuotaOrderAggregate; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 交易策略接口,包括;返利兑换(不用支付),积分订单(需要支付) + * @create 2024-06-08 18:04 + */ +public interface ITradePolicy { + + void trade(CreateQuotaOrderAggregate createQuotaOrderAggregate); + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/policy/impl/CreditPayTradePolicy.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/policy/impl/CreditPayTradePolicy.java new file mode 100644 index 0000000000000000000000000000000000000000..ad7c56fa42e65f6a51bfb7fe9806c55e2c9d2ad8 --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/policy/impl/CreditPayTradePolicy.java @@ -0,0 +1,29 @@ +package cn.bugstack.domain.activity.service.quota.policy.impl; + +import cn.bugstack.domain.activity.model.aggregate.CreateQuotaOrderAggregate; +import cn.bugstack.domain.activity.model.valobj.OrderStateVO; +import cn.bugstack.domain.activity.repository.IActivityRepository; +import cn.bugstack.domain.activity.service.quota.policy.ITradePolicy; +import org.springframework.stereotype.Service; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 积分兑换,支付类订单 + * @create 2024-06-08 18:12 + */ +@Service("credit_pay_trade") +public class CreditPayTradePolicy implements ITradePolicy { + + private final IActivityRepository activityRepository; + + public CreditPayTradePolicy(IActivityRepository activityRepository) { + this.activityRepository = activityRepository; + } + + @Override + public void trade(CreateQuotaOrderAggregate createQuotaOrderAggregate) { + createQuotaOrderAggregate.setOrderState(OrderStateVO.wait_pay); + activityRepository.doSaveCreditPayOrder(createQuotaOrderAggregate); + } + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/policy/impl/RebateNoPayTradePolicy.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/policy/impl/RebateNoPayTradePolicy.java new file mode 100644 index 0000000000000000000000000000000000000000..3c886638fe4e9d0144be897dd21439fe15c18519 --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/activity/service/quota/policy/impl/RebateNoPayTradePolicy.java @@ -0,0 +1,33 @@ +package cn.bugstack.domain.activity.service.quota.policy.impl; + +import cn.bugstack.domain.activity.model.aggregate.CreateQuotaOrderAggregate; +import cn.bugstack.domain.activity.model.valobj.OrderStateVO; +import cn.bugstack.domain.activity.repository.IActivityRepository; +import cn.bugstack.domain.activity.service.quota.policy.ITradePolicy; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 返利无支付交易订单,直接充值到账 + * @create 2024-06-08 18:10 + */ +@Service("rebate_no_pay_trade") +public class RebateNoPayTradePolicy implements ITradePolicy { + + private final IActivityRepository activityRepository; + + public RebateNoPayTradePolicy(IActivityRepository activityRepository) { + this.activityRepository = activityRepository; + } + + @Override + public void trade(CreateQuotaOrderAggregate createQuotaOrderAggregate) { + // 不需要支付则修改订单金额为0,状态为完成,直接给用户账户充值 + createQuotaOrderAggregate.setOrderState(OrderStateVO.completed); + createQuotaOrderAggregate.getActivityOrderEntity().setPayAmount(BigDecimal.ZERO); + activityRepository.doSaveNoPayOrder(createQuotaOrderAggregate); + } + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/event/SendAwardMessageEvent.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/event/SendAwardMessageEvent.java index 24bee0ffaf70a264346eaf2bf521ab0c68586681..e061fc9cc9dceb929e434c3a4c98a1751e602d5a 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/event/SendAwardMessageEvent.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/event/SendAwardMessageEvent.java @@ -12,7 +12,7 @@ import org.springframework.stereotype.Component; import java.util.Date; /** - * @author zyf + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 用户奖品记录事件消息 * @create 2024-04-06 09:43 */ diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/aggregate/UserAwardRecordAggregate.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/aggregate/UserAwardRecordAggregate.java index 629a331815f6e789e5b14496f48c407d5d81f8a7..2316aa7d6cc4d3ff9605a095ab815310695963a9 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/aggregate/UserAwardRecordAggregate.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/aggregate/UserAwardRecordAggregate.java @@ -8,17 +8,18 @@ import lombok.Data; import lombok.NoArgsConstructor; /** - * @ClassName: UserAwardRecordAggregate - * @Description: 用户中奖记录聚合对象 【聚合代表一个事务操作】 - * @Author: zhaoyongfeng - * @Date: 2024/12/9 16:24 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 用户中奖记录聚合对象 【聚合代表一个事务操作】 + * @create 2024-04-06 09:40 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class UserAwardRecordAggregate { + private UserAwardRecordEntity userAwardRecordEntity; private TaskEntity taskEntity; + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/entity/TaskEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/entity/TaskEntity.java index 20b21e53f00d6287a44d3b6ba1d823ea43802c7c..e60c052b41da529b928c3cc8b509b9cf8b213c69 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/entity/TaskEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/entity/TaskEntity.java @@ -9,16 +9,16 @@ import lombok.Data; import lombok.NoArgsConstructor; /** - * @ClassName: TaskEntity - * @Description: 任务实体对象 - * @Author: zhaoyongfeng - * @Date: 2024/12/9 16:22 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 任务实体对象 + * @create 2024-04-06 09:38 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class TaskEntity { + /** 活动ID */ private String userId; /** 消息主题 */ @@ -29,4 +29,5 @@ public class TaskEntity { private BaseEvent.EventMessage message; /** 任务状态;create-创建、completed-完成、fail-失败 */ private TaskStateVO state; + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/entity/UserAwardRecordEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/entity/UserAwardRecordEntity.java index 6602fff0a209fcdb5343b0268e52fab3eceab97c..0bb133a3383c5fc90f6d354434ca112dc659cdfb 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/entity/UserAwardRecordEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/entity/UserAwardRecordEntity.java @@ -9,16 +9,16 @@ import lombok.NoArgsConstructor; import java.util.Date; /** - * @ClassName: UserAwardEntity - * @Description: 用户中奖记录实体对象 - * @Author: zhaoyongfeng - * @Date: 2024/12/9 15:44 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 用户中奖记录实体对象 + * @create 2024-04-06 09:06 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class UserAwardRecordEntity { + /** 用户ID */ private String userId; /** 活动ID */ @@ -37,4 +37,5 @@ public class UserAwardRecordEntity { private AwardStateVO awardState; /** 奖品配置信息;发奖的时候,可以根据 */ private String awardConfig; + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/valobj/AwardStateVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/valobj/AwardStateVO.java index 90b5448c9484f7d95294d97a3be247ce04f2971b..dbf3d0c743bf85a6921b2a448f8dc9a133c941e4 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/valobj/AwardStateVO.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/valobj/AwardStateVO.java @@ -3,9 +3,10 @@ package cn.bugstack.domain.award.model.valobj; import lombok.AllArgsConstructor; import lombok.Getter; -/* - * @author zhaoyongfeng - * @description 奖品状态枚举值对象 +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 奖品状态枚举值对象 【值对象,用于描述对象属性的值,一个对象中,一个属性,有多个状态值。】 + * @create 2024-04-06 09:13 */ @Getter @AllArgsConstructor diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/valobj/TaskStateVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/valobj/TaskStateVO.java index 29cb95852113013353f980e13dc1a3cee38be1b8..7c42d741f6c336975e0cb58455b309424884033f 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/valobj/TaskStateVO.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/model/valobj/TaskStateVO.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * @author zhaoyongfeng + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 任务状态值对象 * @create 2024-04-06 10:00 */ diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/repository/IAwardRepository.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/repository/IAwardRepository.java index 725d9cbe09ccea3a57c9b57f281970d1b56c4a41..198a529f4a971f1cc8a37eed090a9b6c54398a3d 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/repository/IAwardRepository.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/repository/IAwardRepository.java @@ -2,12 +2,14 @@ package cn.bugstack.domain.award.repository; import cn.bugstack.domain.award.model.aggregate.GiveOutPrizesAggregate; import cn.bugstack.domain.award.model.aggregate.UserAwardRecordAggregate; -/* - * @return 奖品仓储服务 - * @author zhaoyongfeng + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 奖品仓储服务 + * @create 2024-04-06 09:02 */ public interface IAwardRepository { + void saveUserAwardRecord(UserAwardRecordAggregate userAwardRecordAggregate); String queryAwardConfig(Integer awardId); diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/AwardService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/AwardService.java index f2dc3621e286d5f8bea04cc6f6ed527f76c8c019..9f0a7a917062e35a92a736cee74c386f3a18deae 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/AwardService.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/AwardService.java @@ -1,7 +1,7 @@ package cn.bugstack.domain.award.service; -import cn.bugstack.domain.award.model.aggregate.UserAwardRecordAggregate; import cn.bugstack.domain.award.event.SendAwardMessageEvent; +import cn.bugstack.domain.award.model.aggregate.UserAwardRecordAggregate; import cn.bugstack.domain.award.model.entity.DistributeAwardEntity; import cn.bugstack.domain.award.model.entity.TaskEntity; import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity; @@ -12,18 +12,16 @@ import cn.bugstack.types.event.BaseEvent; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import javax.annotation.Resource; import java.util.Map; /** - * @ClassName: AwardService - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/9 15:41 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 奖品服务 + * @create 2024-04-06 09:39 */ -@Service @Slf4j -public class AwardService implements IAwardService{ +@Service +public class AwardService implements IAwardService { private final IAwardRepository awardRepository; private final SendAwardMessageEvent sendAwardMessageEvent; @@ -34,6 +32,7 @@ public class AwardService implements IAwardService{ this.sendAwardMessageEvent = sendAwardMessageEvent; this.distributeAwardMap = distributeAwardMap; } + @Override public void saveUserAwardRecord(UserAwardRecordEntity userAwardRecordEntity) { // 构建消息对象 @@ -62,6 +61,8 @@ public class AwardService implements IAwardService{ // 存储聚合对象 - 一个事务下,用户的中奖记录 awardRepository.saveUserAwardRecord(userAwardRecordAggregate); + + log.info("中奖记录保存完成 userId:{} orderId:{}", userAwardRecordEntity.getUserId(), userAwardRecordEntity.getOrderId()); } @Override @@ -72,13 +73,17 @@ public class AwardService implements IAwardService{ log.error("分发奖品,奖品ID不存在。awardKey:{}", awardKey); return; } + // 奖品服务 IDistributeAward distributeAward = distributeAwardMap.get(awardKey); + if (null == distributeAward) { log.error("分发奖品,对应的服务不存在。awardKey:{}", awardKey); throw new RuntimeException("分发奖品,奖品" + awardKey + "对应的服务不存在"); } + // 发放奖品 distributeAward.giveOutPrizes(distributeAwardEntity); } + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/IAwardService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/IAwardService.java index 80b16d84af60ee2a81b4a8f72e7d455d989e8278..c9cb892b5eacd1df4645d164773168c5f131c84c 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/IAwardService.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/IAwardService.java @@ -3,17 +3,18 @@ package cn.bugstack.domain.award.service; import cn.bugstack.domain.award.model.entity.DistributeAwardEntity; import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity; -/* - * @return - * @author zhaoyongfeng - * @description - * - * @param null +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 奖品服务接口 + * @create 2024-04-06 09:03 */ public interface IAwardService { + void saveUserAwardRecord(UserAwardRecordEntity userAwardRecordEntity); + /** * 配送发货奖品 */ void distributeAward(DistributeAwardEntity distributeAwardEntity); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/distribute/IDistributeAward.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/distribute/IDistributeAward.java index e705dab4dadcf41d32a53f226c1f2158c257eec3..29fad4118910b21dad629a01c524ca99d9c10274 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/distribute/IDistributeAward.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/distribute/IDistributeAward.java @@ -2,11 +2,13 @@ package cn.bugstack.domain.award.service.distribute; import cn.bugstack.domain.award.model.entity.DistributeAwardEntity; -/* - * @return - * @author zhaoyongfeng +/** + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 分发奖品接口 + * @create 2024-05-18 08:22 */ public interface IDistributeAward { + void giveOutPrizes(DistributeAwardEntity distributeAwardEntity); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/distribute/impl/UserCreditRandomAward.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/distribute/impl/UserCreditRandomAward.java index c9ec172cd2fce2cb7ec37fbee824835b5f64961f..1ef116506a9f624a902a22ea3865450039bf0de7 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/distribute/impl/UserCreditRandomAward.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/award/service/distribute/impl/UserCreditRandomAward.java @@ -10,22 +10,22 @@ import cn.bugstack.domain.award.service.distribute.IDistributeAward; import cn.bugstack.types.common.Constants; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.MathContext; /** - * @ClassName: UserCreditRandomAward - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/28 17:55 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 用户积分奖品,支持 award_config 透传,满足黑名单积分奖励。 + * @create 2024-05-18 08:53 */ @Component("user_credit_random") public class UserCreditRandomAward implements IDistributeAward { + @Resource private IAwardRepository repository; + @Override public void giveOutPrizes(DistributeAwardEntity distributeAwardEntity) { // 奖品ID @@ -35,12 +35,15 @@ public class UserCreditRandomAward implements IDistributeAward { if (StringUtils.isBlank(awardConfig)) { awardConfig = repository.queryAwardConfig(awardId); } + String[] creditRange = awardConfig.split(Constants.SPLIT); if (creditRange.length != 2) { throw new RuntimeException("award_config 「" + awardConfig + "」配置不是一个范围值,如 1,100"); } + // 生成随机积分值 BigDecimal creditAmount = generateRandom(new BigDecimal(creditRange[0]), new BigDecimal(creditRange[1])); + // 构建聚合对象 UserAwardRecordEntity userAwardRecordEntity = GiveOutPrizesAggregate.buildDistributeUserAwardRecordEntity( distributeAwardEntity.getUserId(), @@ -48,6 +51,7 @@ public class UserCreditRandomAward implements IDistributeAward { distributeAwardEntity.getAwardId(), AwardStateVO.complete ); + UserCreditAwardEntity userCreditAwardEntity = GiveOutPrizesAggregate.buildUserCreditAwardEntity(distributeAwardEntity.getUserId(), creditAmount); GiveOutPrizesAggregate giveOutPrizesAggregate = new GiveOutPrizesAggregate(); @@ -58,9 +62,11 @@ public class UserCreditRandomAward implements IDistributeAward { // 存储发奖对象 repository.saveGiveOutPrizesAggregate(giveOutPrizesAggregate); } + private BigDecimal generateRandom(BigDecimal min, BigDecimal max) { if (min.equals(max)) return min; BigDecimal randomBigDecimal = min.add(BigDecimal.valueOf(Math.random()).multiply(max.subtract(min))); return randomBigDecimal.round(new MathContext(3)); } + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/event/CreditAdjustSuccessMessageEvent.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/event/CreditAdjustSuccessMessageEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..f2f03dbf054d284cde3fe6683d157179261a8c90 --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/event/CreditAdjustSuccessMessageEvent.java @@ -0,0 +1,64 @@ +package cn.bugstack.domain.credit.event; + +import cn.bugstack.types.event.BaseEvent; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.commons.lang3.RandomStringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 积分账户调整成功消息【充值、支付,成功消息】 + * @create 2024-06-08 19:19 + */ +@Component +public class CreditAdjustSuccessMessageEvent extends BaseEvent { + + @Value("${spring.rabbitmq.topic.credit_adjust_success}") + private String topic; + + @Override + public EventMessage buildEventMessage(CreditAdjustSuccessMessage data) { + return EventMessage.builder() + .id(RandomStringUtils.randomNumeric(11)) + .timestamp(new Date()) + .data(data) + .build(); + } + + @Override + public String topic() { + return topic; + } + + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class CreditAdjustSuccessMessage { + + /** + * 用户ID + */ + private String userId; + /** + * 订单ID + */ + private String orderId; + /** + * 交易金额 + */ + private BigDecimal amount; + /** + * 业务仿重ID - 外部透传。返利、行为等唯一标识 + */ + private String outBusinessNo; + } + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/aggregate/TradeAggregate.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/aggregate/TradeAggregate.java new file mode 100644 index 0000000000000000000000000000000000000000..dfc6cf08eec0fb733eef623f6bde12f0a34cbcca --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/aggregate/TradeAggregate.java @@ -0,0 +1,68 @@ +package cn.bugstack.domain.credit.model.aggregate; + +import cn.bugstack.domain.award.model.valobj.TaskStateVO; +import cn.bugstack.domain.credit.event.CreditAdjustSuccessMessageEvent; +import cn.bugstack.domain.credit.model.entity.CreditAccountEntity; +import cn.bugstack.domain.credit.model.entity.CreditOrderEntity; +import cn.bugstack.domain.credit.model.entity.TaskEntity; +import cn.bugstack.domain.credit.model.valobj.TradeNameVO; +import cn.bugstack.domain.credit.model.valobj.TradeTypeVO; +import cn.bugstack.types.event.BaseEvent; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.commons.lang3.RandomStringUtils; + +import java.math.BigDecimal; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 交易聚合对象 + * @create 2024-06-01 09:48 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TradeAggregate { + + // 用户ID + private String userId; + // 积分账户实体 + private CreditAccountEntity creditAccountEntity; + // 积分订单实体 + private CreditOrderEntity creditOrderEntity; + // 任务实体 - 补偿 MQ 消息 + private TaskEntity taskEntity; + + public static CreditAccountEntity createCreditAccountEntity(String userId, BigDecimal adjustAmount) { + return CreditAccountEntity.builder().userId(userId).adjustAmount(adjustAmount).build(); + } + + public static CreditOrderEntity createCreditOrderEntity(String userId, + TradeNameVO tradeName, + TradeTypeVO tradeType, + BigDecimal tradeAmount, + String outBusinessNo) { + return CreditOrderEntity.builder() + .userId(userId) + .orderId(RandomStringUtils.randomNumeric(12)) + .tradeName(tradeName) + .tradeType(tradeType) + .tradeAmount(tradeAmount) + .outBusinessNo(outBusinessNo) + .build(); + } + + public static TaskEntity createTaskEntity(String userId, String topic, String messageId, BaseEvent.EventMessage message) { + TaskEntity taskEntity = new TaskEntity(); + taskEntity.setUserId(userId); + taskEntity.setTopic(topic); + taskEntity.setMessageId(messageId); + taskEntity.setMessage(message); + taskEntity.setState(TaskStateVO.create); + return taskEntity; + } + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/entity/CreditAccountEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/entity/CreditAccountEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..d3f714b747953b89b8ca8f43b4b912eebbfb9762 --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/entity/CreditAccountEntity.java @@ -0,0 +1,26 @@ +package cn.bugstack.domain.credit.model.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 积分账户实体 + * @create 2024-06-01 09:08 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class CreditAccountEntity { + + /** 用户ID */ + private String userId; + /** 可用积分,每次扣减的值 */ + private BigDecimal adjustAmount; + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/entity/CreditOrderEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/entity/CreditOrderEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..6e808746f610e16ece5a28a23783811b500d19c7 --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/entity/CreditOrderEntity.java @@ -0,0 +1,36 @@ +package cn.bugstack.domain.credit.model.entity; + +import cn.bugstack.domain.credit.model.valobj.TradeNameVO; +import cn.bugstack.domain.credit.model.valobj.TradeTypeVO; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 积分订单实体 + * @create 2024-06-01 09:08 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class CreditOrderEntity { + + /** 用户ID */ + private String userId; + /** 订单ID */ + private String orderId; + /** 交易名称 */ + private TradeNameVO tradeName; + /** 交易类型;交易类型;forward-正向、reverse-逆向 */ + private TradeTypeVO tradeType; + /** 交易金额 */ + private BigDecimal tradeAmount; + /** 业务仿重ID - 外部透传。返利、行为等唯一标识 */ + private String outBusinessNo; + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/entity/TaskEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/entity/TaskEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..f15cd489f6b088bf99f64a76480d3cb3eaf4ba7a --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/entity/TaskEntity.java @@ -0,0 +1,33 @@ +package cn.bugstack.domain.credit.model.entity; + +import cn.bugstack.domain.award.model.valobj.TaskStateVO; +import cn.bugstack.domain.credit.event.CreditAdjustSuccessMessageEvent; +import cn.bugstack.types.event.BaseEvent; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 任务实体对象 + * @create 2024-04-06 09:38 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TaskEntity { + + /** 活动ID */ + private String userId; + /** 消息主题 */ + private String topic; + /** 消息编号 */ + private String messageId; + /** 消息主体 */ + private BaseEvent.EventMessage message; + /** 任务状态;create-创建、completed-完成、fail-失败 */ + private TaskStateVO state; + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/entity/TradeEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/entity/TradeEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..e96fb9333bee47ee42cefa2c26f323424717d838 --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/entity/TradeEntity.java @@ -0,0 +1,34 @@ +package cn.bugstack.domain.credit.model.entity; + +import cn.bugstack.domain.credit.model.valobj.TradeNameVO; +import cn.bugstack.domain.credit.model.valobj.TradeTypeVO; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 增加额度实体 + * @create 2024-06-01 09:38 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TradeEntity { + + /** 用户ID */ + private String userId; + /** 交易名称 */ + private TradeNameVO tradeName; + /** 交易类型;交易类型;forward-正向、reverse-逆向 */ + private TradeTypeVO tradeType; + /** 交易金额 */ + private BigDecimal amount; + /** 业务仿重ID - 外部透传。返利、行为等唯一标识 */ + private String outBusinessNo; + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/valobj/TradeNameVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/valobj/TradeNameVO.java new file mode 100644 index 0000000000000000000000000000000000000000..9df083c4bd4d7d1c7c145d9d713a83666e611c95 --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/valobj/TradeNameVO.java @@ -0,0 +1,22 @@ +package cn.bugstack.domain.credit.model.valobj; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 交易名称枚举值 + * @create 2024-06-01 09:04 + */ +@Getter +@AllArgsConstructor +public enum TradeNameVO { + + REBATE("行为返利"), + CONVERT_SKU("兑换抽奖"), + + ; + + private final String name; + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/valobj/TradeTypeVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/valobj/TradeTypeVO.java new file mode 100644 index 0000000000000000000000000000000000000000..3823db6e01c2b1110ce133153a1dd14234202ecf --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/model/valobj/TradeTypeVO.java @@ -0,0 +1,23 @@ +package cn.bugstack.domain.credit.model.valobj; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 交易类型枚举值 + * @create 2024-06-01 09:02 + */ +@Getter +@AllArgsConstructor +public enum TradeTypeVO { + + FORWARD("forward", "正向交易,+ 积分"), + REVERSE("reverse", "逆向交易,- 积分"), + + ; + + private final String code; + private final String info; + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/repository/ICreditRepository.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/repository/ICreditRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..ee5e1b09452074cf687e3158bf62c8dc20be345d --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/repository/ICreditRepository.java @@ -0,0 +1,17 @@ +package cn.bugstack.domain.credit.repository; + +import cn.bugstack.domain.credit.model.aggregate.TradeAggregate; +import cn.bugstack.domain.credit.model.entity.CreditAccountEntity; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 用户积分仓储 + * @create 2024-06-01 09:11 + */ +public interface ICreditRepository { + + void saveUserCreditTradeOrder(TradeAggregate tradeAggregate); + + CreditAccountEntity queryUserCreditAccount(String userId); + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/service/ICreditAdjustService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/service/ICreditAdjustService.java new file mode 100644 index 0000000000000000000000000000000000000000..2122d8cfb8acd3a46ab0d49b5117d30d00ae614c --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/service/ICreditAdjustService.java @@ -0,0 +1,27 @@ +package cn.bugstack.domain.credit.service; + +import cn.bugstack.domain.credit.model.entity.CreditAccountEntity; +import cn.bugstack.domain.credit.model.entity.TradeEntity; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 积分调额接口【正逆向,增减积分】 + * @create 2024-06-01 09:35 + */ +public interface ICreditAdjustService { + + /** + * 创建增加积分额度订单 + * @param tradeEntity 交易实体对象 + * @return 单号 + */ + String createOrder(TradeEntity tradeEntity); + + /** + * 查询用户积分账户 + * @param userId 用户ID + * @return 积分账户实体 + */ + CreditAccountEntity queryUserCreditAccount(String userId); + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/service/adjust/CreditAdjustService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/service/adjust/CreditAdjustService.java new file mode 100644 index 0000000000000000000000000000000000000000..6225d8433e90dfd0e0cbd9a9e9306d9642f68d2a --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/credit/service/adjust/CreditAdjustService.java @@ -0,0 +1,77 @@ +package cn.bugstack.domain.credit.service.adjust; + +import cn.bugstack.domain.credit.event.CreditAdjustSuccessMessageEvent; +import cn.bugstack.domain.credit.model.aggregate.TradeAggregate; +import cn.bugstack.domain.credit.model.entity.CreditAccountEntity; +import cn.bugstack.domain.credit.model.entity.CreditOrderEntity; +import cn.bugstack.domain.credit.model.entity.TaskEntity; +import cn.bugstack.domain.credit.model.entity.TradeEntity; +import cn.bugstack.domain.credit.repository.ICreditRepository; +import cn.bugstack.domain.credit.service.ICreditAdjustService; +import cn.bugstack.types.event.BaseEvent; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 积分调额服务【正逆向,增减积分】 + * @create 2024-06-01 09:36 + */ +@Slf4j +@Service +public class CreditAdjustService implements ICreditAdjustService { + + @Resource + private ICreditRepository creditRepository; + @Resource + private CreditAdjustSuccessMessageEvent creditAdjustSuccessMessageEvent; + + @Override + public String createOrder(TradeEntity tradeEntity) { + log.info("账户积分额度开始 userId:{} tradeName:{} amount:{}", tradeEntity.getUserId(), tradeEntity.getTradeName(), tradeEntity.getAmount()); + // 1. 创建账户积分实体 + CreditAccountEntity creditAccountEntity = TradeAggregate.createCreditAccountEntity( + tradeEntity.getUserId(), + tradeEntity.getAmount()); + + // 2. 创建账户订单实体 + CreditOrderEntity creditOrderEntity = TradeAggregate.createCreditOrderEntity( + tradeEntity.getUserId(), + tradeEntity.getTradeName(), + tradeEntity.getTradeType(), + tradeEntity.getAmount(), + tradeEntity.getOutBusinessNo()); + + // 3. 构建消息任务对象 + CreditAdjustSuccessMessageEvent.CreditAdjustSuccessMessage creditAdjustSuccessMessage = new CreditAdjustSuccessMessageEvent.CreditAdjustSuccessMessage(); + creditAdjustSuccessMessage.setUserId(tradeEntity.getUserId()); + creditAdjustSuccessMessage.setOrderId(creditOrderEntity.getOrderId()); + creditAdjustSuccessMessage.setAmount(tradeEntity.getAmount()); + creditAdjustSuccessMessage.setOutBusinessNo(tradeEntity.getOutBusinessNo()); + BaseEvent.EventMessage creditAdjustSuccessMessageEventMessage = creditAdjustSuccessMessageEvent.buildEventMessage(creditAdjustSuccessMessage); + + TaskEntity taskEntity = TradeAggregate.createTaskEntity(tradeEntity.getUserId(), creditAdjustSuccessMessageEvent.topic(), creditAdjustSuccessMessageEventMessage.getId(), creditAdjustSuccessMessageEventMessage); + + // 4. 构建交易聚合对象 + TradeAggregate tradeAggregate = TradeAggregate.builder() + .userId(tradeEntity.getUserId()) + .creditAccountEntity(creditAccountEntity) + .creditOrderEntity(creditOrderEntity) + .taskEntity(taskEntity) + .build(); + + // 5. 保存积分交易订单 + creditRepository.saveUserCreditTradeOrder(tradeAggregate); + log.info("账户积分额度完成 userId:{} orderId:{}", tradeEntity.getUserId(), creditOrderEntity.getOrderId()); + + return creditOrderEntity.getOrderId(); + } + + @Override + public CreditAccountEntity queryUserCreditAccount(String userId) { + return creditRepository.queryUserCreditAccount(userId); + } + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/event/SendRebateMessageEvent.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/event/SendRebateMessageEvent.java index 6920c13a8355fa77708c858688e9a9c755500c71..a749bba87a983fd2f1865a4f22ba8c2f8a8ec15c 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/event/SendRebateMessageEvent.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/event/SendRebateMessageEvent.java @@ -12,20 +12,22 @@ import org.springframework.stereotype.Component; import java.util.Date; /** - * @ClassName: SendRebateMessageEvent - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/21 19:05 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 发送返利消息事件 + * @create 2024-04-30 15:34 */ @Component public class SendRebateMessageEvent extends BaseEvent { + @Value("${spring.rabbitmq.topic.send_rebate}") private String topic; - public EventMessage buildEventMessage(RebateMessage rebateMessage){ - return EventMessage.builder() + + @Override + public EventMessage buildEventMessage(RebateMessage data) { + return EventMessage.builder() .id(RandomStringUtils.randomNumeric(11)) .timestamp(new Date()) - .data(rebateMessage) + .data(data) .build(); } @@ -50,4 +52,5 @@ public class SendRebateMessageEvent extends BaseEvent message; /** 任务状态;create-创建、completed-完成、fail-失败 */ private TaskStateVO state; + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/BehaviorTypeVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/BehaviorTypeVO.java index 2e2e74854ff8c85042ca6363beb11064ff7da8f2..55d635e124e6bd6ddde4897098770c262f3f2a25 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/BehaviorTypeVO.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/BehaviorTypeVO.java @@ -4,10 +4,9 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * @ClassName: BehaviorTypeVO - * @Description: 行为类型枚举值对象 - * @Author: zhaoyongfeng - * @Date: 2024/12/21 19:19 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 行为类型枚举值对象 + * @create 2024-04-30 14:36 */ @Getter @AllArgsConstructor @@ -19,4 +18,5 @@ public enum BehaviorTypeVO { private final String code; private final String info; + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/DailyBehaviorRebateVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/DailyBehaviorRebateVO.java index ee063ca174c65ab6d83d0ba27b7f67b37140e66b..e888a25b480adedbe0a23924adfc92a427d78260 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/DailyBehaviorRebateVO.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/DailyBehaviorRebateVO.java @@ -6,16 +6,16 @@ import lombok.Getter; import lombok.NoArgsConstructor; /** - * @ClassName: DailyBehaviorRebateVO - * @Description: 日常行为返利配置值对象 - * @Author: zhaoyongfeng - * @Date: 2024/12/21 19:12 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 日常行为返利配置值对象 + * @create 2024-04-30 16:17 */ @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class DailyBehaviorRebateVO { + /** 行为类型(sign 签到、openai_pay 支付) */ private String behaviorType; /** 返利描述 */ @@ -24,4 +24,5 @@ public class DailyBehaviorRebateVO { private String rebateType; /** 返利配置 */ private String rebateConfig; + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/RebateTypeVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/RebateTypeVO.java index bedfd69a61affba84f87d3e2b90018bb19514c97..287a690724e36edb873ebc4d9143893af00d7a50 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/RebateTypeVO.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/RebateTypeVO.java @@ -1,17 +1,17 @@ package cn.bugstack.domain.rebate.model.valobj; import lombok.AllArgsConstructor; -import lombok.Data; import lombok.Getter; -/* - * @return - * @author zhaoyongfeng + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 返利类型(sku 活动库存充值商品、integral 用户活动积分) + * @create 2024-05-01 14:09 */ - @Getter @AllArgsConstructor public enum RebateTypeVO { + SKU("sku", "活动库存充值商品"), INTEGRAL("integral", "用户活动积分"), ; diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/TaskStateVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/TaskStateVO.java index 99ae56d96ca3ebe3e60b4cd14ed2f1fc13ce48d5..103aef523d21ab5c6f23c91835d8bc086d2b59fc 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/TaskStateVO.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/model/valobj/TaskStateVO.java @@ -2,13 +2,11 @@ package cn.bugstack.domain.rebate.model.valobj; import lombok.AllArgsConstructor; import lombok.Getter; -import org.checkerframework.checker.units.qual.A; /** - * @ClassName: TaskStateVO - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/21 19:46 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 任务状态值对象 + * @create 2024-04-06 10:00 */ @Getter @AllArgsConstructor @@ -21,4 +19,5 @@ public enum TaskStateVO { private final String code; private final String desc; + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/repository/IBehaviorRebateRepository.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/repository/IBehaviorRebateRepository.java index 07bea3916ddaf5d2d3fecc4c8a1fd2f1aaca6a99..7c78c3a690a52158b35931c276ec664fba2e661d 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/repository/IBehaviorRebateRepository.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/repository/IBehaviorRebateRepository.java @@ -1,7 +1,6 @@ package cn.bugstack.domain.rebate.repository; -import cn.bugstack.domain.rebate.aggregate.BehaviorRebateAggregate; -import cn.bugstack.domain.rebate.model.entity.BehaviorEntity; +import cn.bugstack.domain.rebate.model.aggregate.BehaviorRebateAggregate; import cn.bugstack.domain.rebate.model.entity.BehaviorRebateOrderEntity; import cn.bugstack.domain.rebate.model.valobj.BehaviorTypeVO; import cn.bugstack.domain.rebate.model.valobj.DailyBehaviorRebateVO; @@ -9,15 +8,16 @@ import cn.bugstack.domain.rebate.model.valobj.DailyBehaviorRebateVO; import java.util.List; /** - * @ClassName: IBehaviorRebateRepository - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/21 18:53 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 行为返利服务仓储接口 + * @create 2024-04-30 14:58 */ public interface IBehaviorRebateRepository { - List queryDailyBehaviorRebateConfig (BehaviorTypeVO behaviorTypeVO); + + List queryDailyBehaviorRebateConfig(BehaviorTypeVO behaviorTypeVO); void saveUserRebateRecord(String userId, List behaviorRebateAggregates); List queryOrderByOutBusinessNo(String userId, String outBusinessNo); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/service/BehaviorRebateService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/service/BehaviorRebateService.java index 528ccf92a789e764f0d9d67adc0c64184378e86a..aefb4e83b731f0af0f90c743631c5023773fa70f 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/service/BehaviorRebateService.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/service/BehaviorRebateService.java @@ -1,7 +1,7 @@ package cn.bugstack.domain.rebate.service; import cn.bugstack.domain.rebate.event.SendRebateMessageEvent; -import cn.bugstack.domain.rebate.aggregate.BehaviorRebateAggregate; +import cn.bugstack.domain.rebate.model.aggregate.BehaviorRebateAggregate; import cn.bugstack.domain.rebate.model.entity.BehaviorEntity; import cn.bugstack.domain.rebate.model.entity.BehaviorRebateOrderEntity; import cn.bugstack.domain.rebate.model.entity.TaskEntity; @@ -18,13 +18,13 @@ import java.util.ArrayList; import java.util.List; /** - * @ClassName: BehaviorRebateService - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/21 18:50 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 行为返利服务实现 + * @create 2024-04-30 15:31 */ @Service -public class BehaviorRebateService implements IBehaviorRebateService{ +public class BehaviorRebateService implements IBehaviorRebateService { + @Resource private IBehaviorRebateRepository behaviorRebateRepository; @Resource @@ -39,26 +39,29 @@ public class BehaviorRebateService implements IBehaviorRebateService{ // 2. 构建聚合对象 List orderIds = new ArrayList<>(); List behaviorRebateAggregates = new ArrayList<>(); - for(DailyBehaviorRebateVO dailyBehaviorRebateVO : dailyBehaviorRebateVOS){ + for (DailyBehaviorRebateVO dailyBehaviorRebateVO : dailyBehaviorRebateVOS) { + // 拼装业务ID;用户ID_返利类型_外部透彻业务ID String bizId = behaviorEntity.getUserId() + Constants.UNDERLINE + dailyBehaviorRebateVO.getRebateType() + Constants.UNDERLINE + behaviorEntity.getOutBusinessNo(); BehaviorRebateOrderEntity behaviorRebateOrderEntity = BehaviorRebateOrderEntity.builder() - .userId(behaviorEntity.getUserId()) - .orderId(RandomStringUtils.randomNumeric(12)) - .behaviorType(dailyBehaviorRebateVO.getBehaviorType()) - .rebateDesc(dailyBehaviorRebateVO.getRebateDesc()) - .rebateType(dailyBehaviorRebateVO.getRebateType()) - .rebateConfig(dailyBehaviorRebateVO.getRebateConfig()) - .bizId(bizId) - .build(); + .userId(behaviorEntity.getUserId()) + .orderId(RandomStringUtils.randomNumeric(12)) + .behaviorType(dailyBehaviorRebateVO.getBehaviorType()) + .rebateDesc(dailyBehaviorRebateVO.getRebateDesc()) + .rebateType(dailyBehaviorRebateVO.getRebateType()) + .rebateConfig(dailyBehaviorRebateVO.getRebateConfig()) + .outBusinessNo(behaviorEntity.getOutBusinessNo()) + .bizId(bizId) + .build(); orderIds.add(behaviorRebateOrderEntity.getOrderId()); // MQ 消息对象 SendRebateMessageEvent.RebateMessage rebateMessage = SendRebateMessageEvent.RebateMessage.builder() .userId(behaviorEntity.getUserId()) - .rebateType(dailyBehaviorRebateVO.getBehaviorType()) + .rebateType(dailyBehaviorRebateVO.getRebateType()) .rebateConfig(dailyBehaviorRebateVO.getRebateConfig()) .bizId(bizId) .build(); + // 构建事件消息 BaseEvent.EventMessage rebateMessageEventMessage = sendRebateMessageEvent.buildEventMessage(rebateMessage); @@ -71,10 +74,10 @@ public class BehaviorRebateService implements IBehaviorRebateService{ taskEntity.setState(TaskStateVO.create); BehaviorRebateAggregate behaviorRebateAggregate = BehaviorRebateAggregate.builder() - .userId(behaviorEntity.getUserId()) - .behaviorRebateOrderEntity(behaviorRebateOrderEntity) - .taskEntity(taskEntity) - .build(); + .userId(behaviorEntity.getUserId()) + .behaviorRebateOrderEntity(behaviorRebateOrderEntity) + .taskEntity(taskEntity) + .build(); behaviorRebateAggregates.add(behaviorRebateAggregate); } @@ -90,4 +93,5 @@ public class BehaviorRebateService implements IBehaviorRebateService{ public List queryOrderByOutBusinessNo(String userId, String outBusinessNo) { return behaviorRebateRepository.queryOrderByOutBusinessNo(userId, outBusinessNo); } + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/service/IBehaviorRebateService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/service/IBehaviorRebateService.java index 62919444b98d5fa1e533d2fc4bfca76996482b2e..0347192467a9121a25b3c6b07e090b9f6a2386f9 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/service/IBehaviorRebateService.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/rebate/service/IBehaviorRebateService.java @@ -4,19 +4,22 @@ import cn.bugstack.domain.rebate.model.entity.BehaviorEntity; import cn.bugstack.domain.rebate.model.entity.BehaviorRebateOrderEntity; import java.util.List; -/* - * @return - * @author zhaoyongfeng - * @description 行为返利服务接口 + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 行为返利服务接口 + * @create 2024-04-30 14:05 */ public interface IBehaviorRebateService { - /* + + /** * 创建行为动作的入账订单 * * @param behaviorEntity 行为实体对象 * @return 订单ID */ List createOrder(BehaviorEntity behaviorEntity); + /** * 根据外部单号查询订单 * @@ -25,4 +28,5 @@ public interface IBehaviorRebateService { * @return 返利订单实体 */ List queryOrderByOutBusinessNo(String userId, String outBusinessNo); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/model/aggregate/package-info.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/model/aggregate/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..3b714ac72ff8bf39585eaaba02c1b1a895d42130 --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/model/aggregate/package-info.java @@ -0,0 +1,6 @@ +/** + * @description 当有需要写库的时候再创建聚合 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @create 2024-04-20 09:08 + */ +package cn.bugstack.domain.strategy.model.aggregate; \ No newline at end of file diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/model/entity/RaffleFactorEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/model/entity/RaffleFactorEntity.java index a75ae9b2ddfe054706fae4563ed8c1ebea2d79d6..88f8ba82d30012314ee5795e732b007956e13561 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/model/entity/RaffleFactorEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/model/entity/RaffleFactorEntity.java @@ -25,5 +25,4 @@ public class RaffleFactorEntity { /** 结束时间 */ private Date endDateTime; - } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/model/valobj/RuleWeightVO.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/model/valobj/RuleWeightVO.java index 0a8db1832f8516af8a4d0a96eef6fb01f17b5ce3..6c4981254310f49bccf943b9ce1598054c71de78 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/model/valobj/RuleWeightVO.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/model/valobj/RuleWeightVO.java @@ -8,16 +8,16 @@ import lombok.NoArgsConstructor; import java.util.List; /** - * @ClassName: RuleWeightVO - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/26 0:18 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 权重规则值对象 + * @create 2024-05-03 09:53 */ @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class RuleWeightVO { + // 原始规则值配置 private String ruleValue; // 权重值 @@ -35,4 +35,5 @@ public class RuleWeightVO { private Integer awardId; private String awardTitle; } + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/repository/IStrategyRepository.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/repository/IStrategyRepository.java index ad79676643c27daf8fd549328b7d11c3bed108fd..616a59546176f649775f4ca8458838a33120dbb6 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/repository/IStrategyRepository.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/repository/IStrategyRepository.java @@ -62,10 +62,11 @@ public interface IStrategyRepository { * @return 扣减结果 */ Boolean subtractionAwardStock(String cacheKey); + /** * 缓存key,decr 方式扣减库存 * - * @param cacheKey 缓存Key + * @param cacheKey 缓存Key * @param endDateTime 活动结束时间 * @return 扣减结果 */ @@ -99,6 +100,7 @@ public interface IStrategyRepository { * @return 奖品信息 */ StrategyAwardEntity queryStrategyAwardEntity(Long strategyId, Integer awardId); + /** * 查询策略ID * @@ -106,6 +108,7 @@ public interface IStrategyRepository { * @return 策略ID */ Long queryStrategyIdByActivityId(Long activityId); + /** * 查询用户抽奖次数 - 当天的;策略ID:活动ID 1:1 的配置,可以直接用 strategyId 查询。 * @@ -114,13 +117,24 @@ public interface IStrategyRepository { * @return 用户今日参与次数 */ Integer queryTodayUserRaffleCount(String userId, Long strategyId); + /** * 根据规则树ID集合查询奖品中加锁数量的配置「部分奖品需要抽奖N次解锁」 * * @param treeIds 规则树ID值 * @return key 规则树,value rule_lock 加锁值 */ - Map queryAwardRuleLockCount(String... treeIds); + Map queryAwardRuleLockCount(String[] treeIds); + + /** + * 根据用户ID、策略ID,查询用户活动账户总使用量 + * + * @param userId 用户ID + * @param strategyId 策略ID + * @return 使用总量 + */ + Integer queryActivityAccountTotalUseCount(String userId, Long strategyId); + /** * 查询奖品权重配置 * @@ -128,4 +142,5 @@ public interface IStrategyRepository { * @return 权重规则 */ List queryAwardRuleWeight(Long strategyId); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/AbstractRaffleStrategy.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/AbstractRaffleStrategy.java index a74e6dcc8dcb56c40a7fe7237ae4b724f825c9e4..6dadaeb17a1d2c1e84519e0c86a6e5c83c5051d7 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/AbstractRaffleStrategy.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/AbstractRaffleStrategy.java @@ -47,6 +47,7 @@ public abstract class AbstractRaffleStrategy implements IRaffleStrategy { if (null == strategyId || StringUtils.isBlank(userId)) { throw new AppException(ResponseCode.ILLEGAL_PARAMETER.getCode(), ResponseCode.ILLEGAL_PARAMETER.getInfo()); } + log.info("抽奖策略计算 userId:{} strategyId:{}", userId, strategyId); // 2. 责任链抽奖计算【这步拿到的是初步的抽奖ID,之后需要根据ID处理抽奖】注意;黑名单、权重等非默认抽奖的直接返回抽奖结果 DefaultChainFactory.StrategyAwardVO chainStrategyAwardVO = raffleLogicChain(userId, strategyId); diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/IRaffleAward.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/IRaffleAward.java index 3e39412a6989f008a82ab1d5353b8a76eac28b51..2e0d6bbe5f9c016e70eeb633afb5e9043dc92c30 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/IRaffleAward.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/IRaffleAward.java @@ -19,5 +19,12 @@ public interface IRaffleAward { */ List queryRaffleStrategyAwardList(Long strategyId); + /** + * 根据策略ID查询抽奖奖品列表配置 + * + * @param activityId 策略ID + * @return 奖品列表 + */ List queryRaffleStrategyAwardListByActivityId(Long activityId); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/IRaffleRule.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/IRaffleRule.java index dd08a6d61d34df32551bc67a4a7b7bbc3b7528ea..97438628c12ca59b3582ca9a750d36601238c808 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/IRaffleRule.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/IRaffleRule.java @@ -5,12 +5,13 @@ import cn.bugstack.domain.strategy.model.valobj.RuleWeightVO; import java.util.List; import java.util.Map; -/* - * @return - * @author zhaoyongfeng +/** + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 抽奖规则接口;提供对规则的业务功能查询 + * @create 2024-04-20 09:17 */ public interface IRaffleRule { + /** * 根据规则树ID集合查询奖品中加锁数量的配置「部分奖品需要抽奖N次解锁」 * @@ -18,6 +19,7 @@ public interface IRaffleRule { * @return key 规则树,value rule_lock 加锁值 */ Map queryAwardRuleLockCount(String[] treeIds); + /** * 查询奖品权重配置 * @@ -25,6 +27,8 @@ public interface IRaffleRule { * @return 权重规则 */ List queryAwardRuleWeight(Long strategyId); + + /** * 查询奖品权重配置 * @@ -32,4 +36,5 @@ public interface IRaffleRule { * @return 权重规则 */ List queryAwardRuleWeightByActivityId(Long activityId); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/IRaffleStock.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/IRaffleStock.java index a2617853ba3f45d9873e6bab8bc647a7a18a16af..7bdb8e675b99579294ca74ecb41ea80413a0f67b 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/IRaffleStock.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/IRaffleStock.java @@ -3,7 +3,7 @@ package cn.bugstack.domain.strategy.service; import cn.bugstack.domain.strategy.model.valobj.StrategyAwardStockKeyVO; /** - * @author + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 抽奖库存相关服务,获取库存消耗队列 * @create 2024-02-09 12:17 */ diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/armory/IStrategyArmory.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/armory/IStrategyArmory.java index 2fe0765ec26a5af3d93446bd9f62566626f81754..a15bee492753e2d67528bef0a0646084a069b219 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/armory/IStrategyArmory.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/armory/IStrategyArmory.java @@ -14,6 +14,7 @@ public interface IStrategyArmory { * @return 装配结果 */ boolean assembleLotteryStrategy(Long strategyId); + /** * 装配抽奖策略配置「触发的时机可以为活动审核通过后进行调用」 * @@ -21,4 +22,5 @@ public interface IStrategyArmory { * @return 装配结果 */ boolean assembleLotteryStrategyByActivityId(Long activityId); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/armory/IStrategyDispatch.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/armory/IStrategyDispatch.java index f6fdd06231e3efc80f7f71ccf5472468e1ea4b4f..eb818f2d81350921488cf41f86c7014a6e8f7d4a 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/armory/IStrategyDispatch.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/armory/IStrategyDispatch.java @@ -36,8 +36,9 @@ public interface IStrategyDispatch { /** * 根据策略ID和奖品ID,扣减奖品缓存库存 * - * @param strategyId 策略ID - * @param awardId 奖品ID + * @param strategyId 策略ID + * @param awardId 奖品ID + * @param endDateTime 活动结束时间 * @return 扣减结果 */ Boolean subtractionAwardStock(Long strategyId, Integer awardId, Date endDateTime); diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/armory/StrategyArmoryDispatch.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/armory/StrategyArmoryDispatch.java index 9abb1fe12a62d1a5ac68b7d5c865d3d3a4e64fa3..9aaf28db29b1c2b90b6dca495895fdf7b7f65ab6 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/armory/StrategyArmoryDispatch.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/armory/StrategyArmoryDispatch.java @@ -29,6 +29,12 @@ public class StrategyArmoryDispatch implements IStrategyArmory, IStrategyDispatc private final SecureRandom secureRandom = new SecureRandom(); + @Override + public boolean assembleLotteryStrategyByActivityId(Long activityId) { + Long strategyId = repository.queryStrategyIdByActivityId(activityId); + return assembleLotteryStrategy(strategyId); + } + @Override public boolean assembleLotteryStrategy(Long strategyId) { // 1. 查询策略配置 @@ -37,7 +43,7 @@ public class StrategyArmoryDispatch implements IStrategyArmory, IStrategyDispatc // 2 缓存奖品库存【用于decr扣减库存使用】 for (StrategyAwardEntity strategyAward : strategyAwardEntities) { Integer awardId = strategyAward.getAwardId(); - Integer awardCount = strategyAward.getAwardCount(); + Integer awardCount = strategyAward.getAwardCountSurplus(); cacheStrategyAwardCount(strategyId, awardId, awardCount); } @@ -66,12 +72,6 @@ public class StrategyArmoryDispatch implements IStrategyArmory, IStrategyDispatc return true; } - @Override - public boolean assembleLotteryStrategyByActivityId(Long activityId) { - Long strategyId = repository.queryStrategyIdByActivityId(activityId); - return assembleLotteryStrategy(strategyId); - } - /** * 计算公式; * 1. 找到范围内最小的概率值,比如 0.1、0.02、0.003,需要找到的值是 0.003 @@ -116,18 +116,54 @@ public class StrategyArmoryDispatch implements IStrategyArmory, IStrategyDispatc /** * 转换计算,只根据小数位来计算。如【0.01返回100】、【0.009返回1000】、【0.0018返回10000】 */ - private double convert(double min) { - if(0 == min) return 1D; + private double convertOld1(double min) { + if (0 == min) return 1D; double current = min; double max = 1; - while (current < 1) { + while (current % 1 != 0) { current = current * 10; max = max * 10; } return max; } + private double convertOld2(double min) { + if (min == 0) return 1D; + + String minStr = Double.toString(min); + int decimalPlaces = 0; + + int decimalPointIndex = minStr.indexOf('.'); + if (decimalPointIndex != -1) { + decimalPlaces = minStr.length() - decimalPointIndex - 1; + } + + return Math.pow(10, decimalPlaces); + } + + private double convert(double min) { + if (0 == min) return 1D; + + String minStr = String.valueOf(min); + + // 小数点前 + String beginVale = minStr.substring(0, minStr.indexOf(".")); + int beginLength = 0; + if (Double.parseDouble(beginVale) > 0) { + beginLength = minStr.substring(0, minStr.indexOf(".")).length(); + } + + // 小数点后 + String endValue = minStr.substring(minStr.indexOf(".") + 1); + int endLength = 0; + if (Double.parseDouble(endValue) > 0) { + endLength = minStr.substring(minStr.indexOf(".") + 1).length(); + } + + return Math.pow(10, beginLength + endLength); + } + /** * 缓存奖品库存到Redis * diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/raffle/DefaultRaffleStrategy.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/raffle/DefaultRaffleStrategy.java index 2b3dbd8cb86578353b2a0dc029c0bb5e981ef2fe..8a303463860d6e54ac95e2ca7b260c2c5be26c2b 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/raffle/DefaultRaffleStrategy.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/raffle/DefaultRaffleStrategy.java @@ -29,7 +29,7 @@ import java.util.Map; */ @Slf4j @Service -public class DefaultRaffleStrategy extends AbstractRaffleStrategy implements IRaffleStock, IRaffleAward , IRaffleRule { +public class DefaultRaffleStrategy extends AbstractRaffleStrategy implements IRaffleStock, IRaffleAward, IRaffleRule { public DefaultRaffleStrategy(IStrategyRepository repository, IStrategyDispatch strategyDispatch, DefaultChainFactory defaultChainFactory, DefaultTreeFactory defaultTreeFactory) { super(repository, strategyDispatch, defaultChainFactory, defaultTreeFactory); @@ -37,6 +37,7 @@ public class DefaultRaffleStrategy extends AbstractRaffleStrategy implements IRa @Override public DefaultChainFactory.StrategyAwardVO raffleLogicChain(String userId, Long strategyId) { + log.info("抽奖策略-责任链 userId:{} strategyId:{}", userId, strategyId); ILogicChain logicChain = defaultChainFactory.openLogicChain(strategyId); return logicChain.logic(userId, strategyId); } @@ -52,6 +53,7 @@ public class DefaultRaffleStrategy extends AbstractRaffleStrategy implements IRa if (null == strategyAwardRuleModelVO) { return DefaultTreeFactory.StrategyAwardVO.builder().awardId(awardId).build(); } + log.info("抽奖策略-规则树 userId:{} strategyId:{} awardId:{}", userId, strategyId, awardId); RuleTreeVO ruleTreeVO = repository.queryRuleTreeVOByTreeId(strategyAwardRuleModelVO.getRuleModels()); if (null == ruleTreeVO) { throw new RuntimeException("存在抽奖策略配置的规则模型 Key,未在库表 rule_tree、rule_tree_node、rule_tree_line 配置对应的规则树信息 " + strategyAwardRuleModelVO.getRuleModels()); @@ -85,13 +87,16 @@ public class DefaultRaffleStrategy extends AbstractRaffleStrategy implements IRa public Map queryAwardRuleLockCount(String[] treeIds) { return repository.queryAwardRuleLockCount(treeIds); } + @Override public List queryAwardRuleWeight(Long strategyId) { return repository.queryAwardRuleWeight(strategyId); } + @Override public List queryAwardRuleWeightByActivityId(Long activityId) { Long strategyId = repository.queryStrategyIdByActivityId(activityId); return queryAwardRuleWeight(strategyId); } + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/factory/DefaultChainFactory.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/factory/DefaultChainFactory.java index a0c4063ea40526b4f01a8c7dd220ad2d3c4a1ef4..7a4ca6bbd6ca507fa90e9bf8ef0dc17a2a59ef4c 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/factory/DefaultChainFactory.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/factory/DefaultChainFactory.java @@ -7,7 +7,6 @@ import lombok.*; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/impl/BlackListLogicChain.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/impl/BlackListLogicChain.java new file mode 100644 index 0000000000000000000000000000000000000000..5c332a068ac2facaafd1d6341040eb1be1ad4ef1 --- /dev/null +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/impl/BlackListLogicChain.java @@ -0,0 +1,60 @@ +package cn.bugstack.domain.strategy.service.rule.chain.impl; + +import cn.bugstack.domain.strategy.repository.IStrategyRepository; +import cn.bugstack.domain.strategy.service.rule.chain.AbstractLogicChain; +import cn.bugstack.domain.strategy.service.rule.chain.factory.DefaultChainFactory; +import cn.bugstack.types.common.Constants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 黑名单责任链 + * @create 2024-01-20 10:23 + */ +@Slf4j +@Component("rule_blacklist") +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class BlackListLogicChain extends AbstractLogicChain { + + @Resource + private IStrategyRepository repository; + + @Override + public DefaultChainFactory.StrategyAwardVO logic(String userId, Long strategyId) { + log.info("抽奖责任链-黑名单开始 userId:{} strategyId:{} ruleModel:{}", userId, strategyId, ruleModel()); + + // 查询规则值配置 + String ruleValue = repository.queryStrategyRuleValue(strategyId, ruleModel()); + String[] splitRuleValue = ruleValue.split(Constants.COLON); + Integer awardId = Integer.parseInt(splitRuleValue[0]); + + // 黑名单抽奖判断 + String[] userBlackIds = splitRuleValue[1].split(Constants.SPLIT); + for (String userBlackId : userBlackIds) { + if (userId.equals(userBlackId)) { + log.info("抽奖责任链-黑名单接管 userId: {} strategyId: {} ruleModel: {} awardId: {}", userId, strategyId, ruleModel(), awardId); + return DefaultChainFactory.StrategyAwardVO.builder() + .awardId(awardId) + .logicModel(ruleModel()) + // 写入默认配置黑名单奖品值 0.01 ~ 1 积分,也可以配置到数据库表中 + .awardRuleValue("0.01,1") + .build(); + } + } + + // 过滤其他责任链 + log.info("抽奖责任链-黑名单放行 userId:{} strategyId:{} ruleModel:{}", userId, strategyId, ruleModel()); + return next().logic(userId, strategyId); + } + + @Override + protected String ruleModel() { + return DefaultChainFactory.LogicModel.RULE_BLACKLIST.getCode(); + } + +} diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/impl/DefaultLogicChain.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/impl/DefaultLogicChain.java index d32dce7530057989abc31f8e97b4861652b281c1..935b2a1ed06ca62f3e11dff46863112224c47224 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/impl/DefaultLogicChain.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/impl/DefaultLogicChain.java @@ -26,7 +26,7 @@ public class DefaultLogicChain extends AbstractLogicChain { @Override public DefaultChainFactory.StrategyAwardVO logic(String userId, Long strategyId) { Integer awardId = strategyDispatch.getRandomAwardId(strategyId); - log.info("抽奖责任链-默认处理 userId: {} strategyId: {} ruleModel: {} awardId: {}", userId, strategyId, ruleModel(), awardId); + log.info("抽奖责任链-默认处理 userId:{} strategyId:{} ruleModel:{} awardId:{}", userId, strategyId, ruleModel(), awardId); return DefaultChainFactory.StrategyAwardVO.builder() .awardId(awardId) .logicModel(ruleModel()) diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/impl/RuleWeightLogicChain.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/impl/RuleWeightLogicChain.java index 44f299c1339d79a9a85268ad467510fcd302313d..73103ac838edb6e82d74de75b5ce4ec7a5a8d4f1 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/impl/RuleWeightLogicChain.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/chain/impl/RuleWeightLogicChain.java @@ -29,8 +29,8 @@ public class RuleWeightLogicChain extends AbstractLogicChain { @Resource protected IStrategyDispatch strategyDispatch; - // 根据用户ID查询用户抽奖消耗的积分值,本章节我们先写死为固定的值。后续需要从数据库中查询。 - public Long userScore = 0L; + // 按需选择需要的计算策略,旧版是 AnalyticalNotEqual 算法,新增加 = 算法。使用时可以实例化 AnalyticalEqual 即可。这个操作也可以从数据库中配置处理。 + private final IAnalytical analytical = new AnalyticalNotEqual(); /** * 权重责任链过滤; @@ -39,45 +39,26 @@ public class RuleWeightLogicChain extends AbstractLogicChain { */ @Override public DefaultChainFactory.StrategyAwardVO logic(String userId, Long strategyId) { - log.info("抽奖责任链-权重开始 userId: {} strategyId: {} ruleModel: {}", userId, strategyId, ruleModel()); + log.info("抽奖责任链-权重开始 userId:{} strategyId:{} ruleModel:{}", userId, strategyId, ruleModel()); String ruleValue = repository.queryStrategyRuleValue(strategyId, ruleModel()); - // 1. 解析权重规则值 4000:102,103,104,105 拆解为;4000 -> 4000:102,103,104,105 便于比对判断 - Map analyticalValueGroup = getAnalyticalValue(ruleValue); + Map analyticalValueGroup = getAnalyticalValue(ruleValue); if (null == analyticalValueGroup || analyticalValueGroup.isEmpty()) { - log.warn("抽奖责任链-权重告警【策略配置权重,但ruleValue未配置相应值】 userId: {} strategyId: {} ruleModel: {}", userId, strategyId, ruleModel()); + log.warn("抽奖责任链-权重告警【策略配置权重,但ruleValue未配置相应值】 userId:{} strategyId:{} ruleModel:{}", userId, strategyId, ruleModel()); return next().logic(userId, strategyId); } - // 2. 转换Keys值,并默认排序 - List analyticalSortedKeys = new ArrayList<>(analyticalValueGroup.keySet()); - Collections.sort(analyticalSortedKeys); - - // 3. 找出最小符合的值,也就是【4500 积分,能找到 4000:102,103,104,105】、【5000 积分,能找到 5000:102,103,104,105,106,107】 - /* 找到最后一个符合的值[如用户传了一个 5900 应该返回正确结果为 5000],如果使用 Lambda findFirst 需要注意使用 sorted 反转结果 - * Long nextValue = null; - * for (Long analyticalSortedKeyValue : analyticalSortedKeys) { - * if (userScore >= analyticalSortedKeyValue){ - * nextValue = analyticalSortedKeyValue; - * } - * } - * 星球伙伴 @慢慢来 ID 6267 提供 - * Long nextValue = analyticalSortedKeys.stream() - * .filter(key -> userScore >= key) - * .max(Comparator.naturalOrder()) - * .orElse(null); - */ - Long nextValue = analyticalSortedKeys.stream() - .sorted(Comparator.reverseOrder()) - .filter(analyticalSortedKeyValue -> userScore >= analyticalSortedKeyValue) - .findFirst() - .orElse(null); + // 2. 用户分值 + Integer userScore = repository.queryActivityAccountTotalUseCount(userId, strategyId); + + // 3. 获取权重对应key + String analyticalValue = analytical.getAnalyticalValue(analyticalValueGroup, userScore); // 4. 权重抽奖 - if (null != nextValue) { - Integer awardId = strategyDispatch.getRandomAwardId(strategyId, analyticalValueGroup.get(nextValue)); - log.info("抽奖责任链-权重接管 userId: {} strategyId: {} ruleModel: {} awardId: {}", userId, strategyId, ruleModel(), awardId); + if (null != analyticalValue) { + Integer awardId = strategyDispatch.getRandomAwardId(strategyId, analyticalValue); + log.info("抽奖责任链-权重接管 userId:{} strategyId:{} ruleModel:{} awardId:{}", userId, strategyId, ruleModel(), awardId); return DefaultChainFactory.StrategyAwardVO.builder() .awardId(awardId) .logicModel(ruleModel()) @@ -85,7 +66,7 @@ public class RuleWeightLogicChain extends AbstractLogicChain { } // 5. 过滤其他责任链 - log.info("抽奖责任链-权重放行 userId: {} strategyId: {} ruleModel: {}", userId, strategyId, ruleModel()); + log.info("抽奖责任链-权重放行 userId:{} strategyId:{} ruleModel:{}", userId, strategyId, ruleModel()); return next().logic(userId, strategyId); } @@ -94,9 +75,9 @@ public class RuleWeightLogicChain extends AbstractLogicChain { return DefaultChainFactory.LogicModel.RULE_WEIGHT.getCode(); } - private Map getAnalyticalValue(String ruleValue) { + private Map getAnalyticalValue(String ruleValue) { String[] ruleValueGroups = ruleValue.split(Constants.SPACE); - Map ruleValueMap = new HashMap<>(); + Map ruleValueMap = new HashMap<>(); for (String ruleValueKey : ruleValueGroups) { // 检查输入是否为空 if (ruleValueKey == null || ruleValueKey.isEmpty()) { @@ -107,9 +88,57 @@ public class RuleWeightLogicChain extends AbstractLogicChain { if (parts.length != 2) { throw new IllegalArgumentException("rule_weight rule_rule invalid input format" + ruleValueKey); } - ruleValueMap.put(Long.parseLong(parts[0]), ruleValueKey); + ruleValueMap.put(Integer.parseInt(parts[0]), ruleValueKey); } return ruleValueMap; } + interface IAnalytical { + String getAnalyticalValue(Map analyticalValueGroup, Integer userScore); + } + + // 获得指定权重值 = n + static class AnalyticalEqual implements IAnalytical { + + @Override + public String getAnalyticalValue(Map analyticalValueGroup, Integer userScore) { + return analyticalValueGroup.get(userScore); + } + } + + // 获取范围权重值 > n + static class AnalyticalNotEqual implements IAnalytical { + + @Override + public String getAnalyticalValue(Map analyticalValueGroup, Integer userScore) { + // 2. 转换Keys值,并默认排序 + List analyticalSortedKeys = new ArrayList<>(analyticalValueGroup.keySet()); + Collections.sort(analyticalSortedKeys); + + // 3. 找出最小符合的值,也就是【4500 积分,能找到 4000:102,103,104,105】、【5000 积分,能找到 5000:102,103,104,105,106,107】 + /* 找到最后一个符合的值[如用户传了一个 5900 应该返回正确结果为 5000],如果使用 Lambda findFirst 需要注意使用 sorted 反转结果 + * Long nextValue = null; + * for (Long analyticalSortedKeyValue : analyticalSortedKeys){ + * if (userScore >= analyticalSortedKeyValue){ + * nextValue = analyticalSortedKeyValue; + * } + * } + * 星球伙伴 @慢慢来 ID 6267 提供 + * Long nextValue = analyticalSortedKeys.stream() + * .filter(key -> userScore >= key) + * .max(Comparator.naturalOrder()) + * .orElse(null); + */ + Integer nextValue = analyticalSortedKeys.stream() + .sorted(Comparator.reverseOrder()) + .filter(analyticalSortedKeyValue -> userScore >= analyticalSortedKeyValue) + .findFirst() + .orElse(null); + + // 返回权重范围的 key值 + return analyticalValueGroup.get(nextValue); + } + } + + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/ILogicTreeNode.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/ILogicTreeNode.java index 5afc4c360bc1a35f4a5c35fe5af817231378df16..9878b51b57dbbaf6b90f0484dfc0750974c8e134 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/ILogicTreeNode.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/ILogicTreeNode.java @@ -11,6 +11,6 @@ import java.util.Date; */ public interface ILogicTreeNode { - DefaultTreeFactory.TreeActionEntity logic(String userId, Long strategyId, Integer awardId, String ruleValue, Date endDateTime); + DefaultTreeFactory.TreeActionEntity logic(String userId, Long strategyId, Integer awardId, String ruleValue, Date endDateTime); } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/factory/DefaultTreeFactory.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/factory/DefaultTreeFactory.java index 9171a652b147f01f872319240c101295ed2a9575..d4ec73be1498de0614476da404d728570cd3d932 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/factory/DefaultTreeFactory.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/factory/DefaultTreeFactory.java @@ -5,7 +5,10 @@ import cn.bugstack.domain.strategy.model.valobj.RuleTreeVO; import cn.bugstack.domain.strategy.service.rule.tree.ILogicTreeNode; import cn.bugstack.domain.strategy.service.rule.tree.factory.engine.IDecisionTreeEngine; import cn.bugstack.domain.strategy.service.rule.tree.factory.engine.impl.DecisionTreeEngine; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import org.springframework.stereotype.Service; import java.util.Map; diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/factory/engine/impl/DecisionTreeEngine.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/factory/engine/impl/DecisionTreeEngine.java index af3f6a1823cdd5c4f45ebde880f010cc8b112b4a..bec187a57692414e8b4ef84c0ee8113b588bceca 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/factory/engine/impl/DecisionTreeEngine.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/factory/engine/impl/DecisionTreeEngine.java @@ -1,6 +1,9 @@ package cn.bugstack.domain.strategy.service.rule.tree.factory.engine.impl; -import cn.bugstack.domain.strategy.model.valobj.*; +import cn.bugstack.domain.strategy.model.valobj.RuleLogicCheckTypeVO; +import cn.bugstack.domain.strategy.model.valobj.RuleTreeNodeLineVO; +import cn.bugstack.domain.strategy.model.valobj.RuleTreeNodeVO; +import cn.bugstack.domain.strategy.model.valobj.RuleTreeVO; import cn.bugstack.domain.strategy.service.rule.tree.ILogicTreeNode; import cn.bugstack.domain.strategy.service.rule.tree.factory.DefaultTreeFactory; import cn.bugstack.domain.strategy.service.rule.tree.factory.engine.IDecisionTreeEngine; diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/impl/RuleLuckAwardLogicTreeNode.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/impl/RuleLuckAwardLogicTreeNode.java index 6df880846a98b691729f47809d29079737aac448..eb81e9fa1b293ce39f403da20328b31ffcef325a 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/impl/RuleLuckAwardLogicTreeNode.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/impl/RuleLuckAwardLogicTreeNode.java @@ -1,12 +1,15 @@ package cn.bugstack.domain.strategy.service.rule.tree.impl; import cn.bugstack.domain.strategy.model.valobj.RuleLogicCheckTypeVO; +import cn.bugstack.domain.strategy.model.valobj.StrategyAwardStockKeyVO; +import cn.bugstack.domain.strategy.repository.IStrategyRepository; import cn.bugstack.domain.strategy.service.rule.tree.ILogicTreeNode; import cn.bugstack.domain.strategy.service.rule.tree.factory.DefaultTreeFactory; import cn.bugstack.types.common.Constants; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.Date; /** @@ -18,6 +21,9 @@ import java.util.Date; @Component("rule_luck_award") public class RuleLuckAwardLogicTreeNode implements ILogicTreeNode { + @Resource + private IStrategyRepository strategyRepository; + @Override public DefaultTreeFactory.TreeActionEntity logic(String userId, Long strategyId, Integer awardId, String ruleValue, Date endDateTime) { log.info("规则过滤-兜底奖品 userId:{} strategyId:{} awardId:{} ruleValue:{}", userId, strategyId, awardId, ruleValue); @@ -29,6 +35,13 @@ public class RuleLuckAwardLogicTreeNode implements ILogicTreeNode { // 兜底奖励配置 Integer luckAwardId = Integer.valueOf(split[0]); String awardRuleValue = split.length > 1 ? split[1] : ""; + + // 写入延迟队列,延迟消费更新数据库记录。【在trigger的job;UpdateAwardStockJob 下消费队列,更新数据库记录】 + strategyRepository.awardStockConsumeSendQueue(StrategyAwardStockKeyVO.builder() + .strategyId(strategyId) + .awardId(luckAwardId) + .build()); + // 返回兜底奖品 log.info("规则过滤-兜底奖品 userId:{} strategyId:{} awardId:{} awardRuleValue:{}", userId, strategyId, luckAwardId, awardRuleValue); return DefaultTreeFactory.TreeActionEntity.builder() diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/impl/RuleStockLogicTreeNode.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/impl/RuleStockLogicTreeNode.java index 7da209a7063bacff394a220c09d8b9aaa996cf72..3676118efa18335df5cb750672608949880254f0 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/impl/RuleStockLogicTreeNode.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/impl/RuleStockLogicTreeNode.java @@ -41,6 +41,7 @@ public class RuleStockLogicTreeNode implements ILogicTreeNode { .awardId(awardId) .build()); + // 注意;根据数据库表中配置走不同的节点。目前数据库配置 ALLOW 是走到下一个节点。 return DefaultTreeFactory.TreeActionEntity.builder() .ruleLogicCheckType(RuleLogicCheckTypeVO.TAKE_OVER) .strategyAwardVO(DefaultTreeFactory.StrategyAwardVO.builder() diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/task/model/entity/TaskEntity.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/task/model/entity/TaskEntity.java index d2acb331c7cc9f57324643d521fba79889b97bd4..16b02208210619c0b2b3ebb961e6380070fbdf3b 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/task/model/entity/TaskEntity.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/task/model/entity/TaskEntity.java @@ -3,10 +3,9 @@ package cn.bugstack.domain.task.model.entity; import lombok.Data; /** - * @ClassName: TaskEntity - * @Description: 任务实体对象 - * @Author: zhaoyongfeng - * @Date: 2024/12/9 17:08 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 任务实体对象 + * @create 2024-04-06 10:49 */ @Data public class TaskEntity { @@ -19,4 +18,5 @@ public class TaskEntity { private String messageId; /** 消息主体 */ private String message; + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/task/repository/ITaskRepository.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/task/repository/ITaskRepository.java index 765e1482d22cfa0e6f6cc5098b72a5444d3d7b69..bb83fc0b9a8766868477f13a4ce355a9e8229fcb 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/task/repository/ITaskRepository.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/task/repository/ITaskRepository.java @@ -4,17 +4,19 @@ import cn.bugstack.domain.task.model.entity.TaskEntity; import java.util.List; -/* - * @return 任务服务仓储接口 - * @author zhaoyongfeng - * @description +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 任务服务仓储接口 + * @create 2024-04-06 10:51 */ public interface ITaskRepository { - void updateTaskSendMessageCompleted(String userId, String messageId); + + List queryNoSendMessageTaskList(); void sendMessage(TaskEntity taskEntity); - List queryNoSendMessageTaskList(); + void updateTaskSendMessageCompleted(String userId, String messageId); void updateTaskSendMessageFail(String userId, String messageId); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/task/service/ITaskService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/task/service/ITaskService.java index 88540528715928bcab306d0962529dff9fbc8dcc..3312fb8fcff3c759ed25bf9e3baa4544ccd0345d 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/task/service/ITaskService.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/task/service/ITaskService.java @@ -4,12 +4,13 @@ import cn.bugstack.domain.task.model.entity.TaskEntity; import java.util.List; -/* - * @return - * @author zhaoyongfeng +/** + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 消息任务服务接口 + * @create 2024-04-06 10:49 */ public interface ITaskService { + /** * 查询发送MQ失败和超时1分钟未发送的MQ * @@ -22,4 +23,5 @@ public interface ITaskService { void updateTaskSendMessageCompleted(String userId, String messageId); void updateTaskSendMessageFail(String userId, String messageId); + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/task/service/TaskService.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/task/service/TaskService.java index a9f3c6c7ce46b14cc00f523cfaafecaf848ba606..8d9c5bd1561f9227b19f743ce555247b0497c119 100644 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/task/service/TaskService.java +++ b/bigmarket-domain/src/main/java/cn/bugstack/domain/task/service/TaskService.java @@ -2,22 +2,22 @@ package cn.bugstack.domain.task.service; import cn.bugstack.domain.task.model.entity.TaskEntity; import cn.bugstack.domain.task.repository.ITaskRepository; -import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; /** - * @ClassName: TaskService - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/9 17:07 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 消息任务服务 + * @create 2024-04-06 10:54 */ @Service -public class TaskService implements ITaskService{ +public class TaskService implements ITaskService { + @Resource private ITaskRepository taskRepository; + @Override public List queryNoSendMessageTaskList() { return taskRepository.queryNoSendMessageTaskList(); @@ -30,11 +30,12 @@ public class TaskService implements ITaskService{ @Override public void updateTaskSendMessageCompleted(String userId, String messageId) { - taskRepository.updateTaskSendMessageCompleted(userId,messageId); + taskRepository.updateTaskSendMessageCompleted(userId, messageId); } @Override public void updateTaskSendMessageFail(String userId, String messageId) { - taskRepository.updateTaskSendMessageFail(userId,messageId); + taskRepository.updateTaskSendMessageFail(userId, messageId); } + } diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/yyy/model/aggregate/package-info.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/yyy/model/aggregate/package-info.java deleted file mode 100644 index 43fd7a750be936f8d61a052e617fb33032caf4b6..0000000000000000000000000000000000000000 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/yyy/model/aggregate/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * 聚合对象; - * 1. 聚合实体和值对象 - * 2. 聚合是聚合的对象,和提供基础处理对象的方法。但不建议在聚合中引入仓储和接口来做过大的逻辑。而这些复杂的操作应该放到service中处理 - * 3. 对象名称 XxxAggregate - */ -package cn.bugstack.domain.yyy.model.aggregate; \ No newline at end of file diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/yyy/model/entity/package-info.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/yyy/model/entity/package-info.java deleted file mode 100644 index 4e4401cfbbe7b8129c43892f4e4ef8c3bc2a1737..0000000000000000000000000000000000000000 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/yyy/model/entity/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * 实体对象; - * 1. 一般和数据库持久化对象1v1的关系,但因各自开发系统的不同,也有1vn的可能。 - * 2. 如果是老系统改造,那么旧的库表冗余了太多的字段,可能会有nv1的情况 - * 3. 对象名称 XxxEntity - */ -package cn.bugstack.domain.yyy.model.entity; \ No newline at end of file diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/yyy/repository/package-info.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/yyy/repository/package-info.java deleted file mode 100644 index 8ad830443a62efe546d6d4777e489abe954e119b..0000000000000000000000000000000000000000 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/yyy/repository/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -/** - * 仓储服务 - * 1. 定义仓储接口,之后由基础设施层做具体实现 - */ -package cn.bugstack.domain.yyy.repository; \ No newline at end of file diff --git a/bigmarket-domain/src/main/java/cn/bugstack/domain/yyy/service/package-info.java b/bigmarket-domain/src/main/java/cn/bugstack/domain/yyy/service/package-info.java deleted file mode 100644 index 7e73392e3a9b40f5c5b44c1ce18211d6d280c110..0000000000000000000000000000000000000000 --- a/bigmarket-domain/src/main/java/cn/bugstack/domain/yyy/service/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.bugstack.domain.yyy.service; \ No newline at end of file diff --git a/bigmarket-infrastructure/pom.xml b/bigmarket-infrastructure/pom.xml index 583ccba7443e16100dc627ea98548532740764cd..ead73c9d9ba0658469a052cbec154f08c9de4250 100644 --- a/bigmarket-infrastructure/pom.xml +++ b/bigmarket-infrastructure/pom.xml @@ -27,8 +27,8 @@ db-router-spring-boot-starter - org.springframework.boot - spring-boot-starter-amqp + org.springframework.boot + spring-boot-starter-amqp diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/adapter/port/package-info.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/adapter/port/package-info.java deleted file mode 100644 index 6a4e83b7ea630790b36a566411960fc3270b2f1b..0000000000000000000000000000000000000000 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/adapter/port/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 实现对外部的api调用,类的名称为 XxxPort 接口定义在 domain 中 - */ -package cn.bugstack.infrastructure.adapter.port; \ No newline at end of file diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/adapter/repository/package-info.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/adapter/repository/package-info.java deleted file mode 100644 index e9f7a345b9b3fb61db5a841837d77513eebbc72c..0000000000000000000000000000000000000000 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/adapter/repository/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 仓储实现;用于实现 domain 中定义的仓储接口,如;IXxxRepository 在 Repository 中调用服务 - */ -package cn.bugstack.infrastructure.adapter.repository; \ No newline at end of file diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/event/EventPublisher.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/event/EventPublisher.java index 699860e471826e611f724346f4640bac76364b65..a672a46f9b8f154f93480fefce88f18b909e6e03 100644 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/event/EventPublisher.java +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/event/EventPublisher.java @@ -8,7 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** - * @author + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 消息发送 * @create 2024-03-30 12:40 */ @@ -29,13 +29,13 @@ public class EventPublisher { throw e; } } - public void publish(String topic, String eventMessage) { + + public void publish(String topic, String eventMessageJSON){ try { - String messageJson = JSON.toJSONString(eventMessage); - rabbitTemplate.convertAndSend(topic, messageJson); - log.info("发送MQ消息 topic:{} message:{}", topic, messageJson); + rabbitTemplate.convertAndSend(topic, eventMessageJSON); + log.info("发送MQ消息 topic:{} message:{}", topic, eventMessageJSON); } catch (Exception e) { - log.error("发送MQ消息失败 topic:{} message:{}", topic, JSON.toJSONString(eventMessage), e); + log.error("发送MQ消息失败 topic:{} message:{}", topic, eventMessageJSON, e); throw e; } } diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IRaffleActivityAccountDao.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IRaffleActivityAccountDao.java index e3547233e860b4cd98a9cfecfdb0e602436ec12e..4316cddbb8b4e88cc7b2021050e774f1fb6c48b1 100644 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IRaffleActivityAccountDao.java +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IRaffleActivityAccountDao.java @@ -29,4 +29,6 @@ public interface IRaffleActivityAccountDao { void updateActivityAccountDaySurplusImageQuota(RaffleActivityAccount raffleActivityAccount); + RaffleActivityAccount queryAccountByUserId(RaffleActivityAccount raffleActivityAccount); + } diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IRaffleActivityOrderDao.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IRaffleActivityOrderDao.java index 7e1576912212d726b9961896bb444066f0a3aea1..fa9b0a85d35d55c1f03ea8b933df6bd5ba929a85 100644 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IRaffleActivityOrderDao.java +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IRaffleActivityOrderDao.java @@ -22,4 +22,12 @@ public interface IRaffleActivityOrderDao { @DBRouter List queryRaffleActivityOrderByUserId(String userId); + @DBRouter + RaffleActivityOrder queryRaffleActivityOrder(RaffleActivityOrder raffleActivityOrderReq); + + int updateOrderCompleted(RaffleActivityOrder raffleActivityOrderReq); + + @DBRouter + RaffleActivityOrder queryUnpaidActivityOrder(RaffleActivityOrder raffleActivityOrderReq); + } diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IUserCreditAccountDao.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IUserCreditAccountDao.java index f63fea2b0b55c91283b4fce8d7f77791f654e7c9..d3ca0a947f07ecfd9bf0d7ba85f9f7869213e5ea 100644 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IUserCreditAccountDao.java +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IUserCreditAccountDao.java @@ -15,4 +15,8 @@ public interface IUserCreditAccountDao { int updateAddAmount(UserCreditAccount userCreditAccountReq); + UserCreditAccount queryUserCreditAccount(UserCreditAccount userCreditAccountReq); + + int updateSubtractionAmount(UserCreditAccount userCreditAccountReq); + } diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IUserCreditOrderDao.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IUserCreditOrderDao.java new file mode 100644 index 0000000000000000000000000000000000000000..45494f0019a8737dfe0775ce409aef122eda2700 --- /dev/null +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/dao/IUserCreditOrderDao.java @@ -0,0 +1,18 @@ +package cn.bugstack.infrastructure.persistent.dao; + +import cn.bugstack.infrastructure.persistent.po.UserCreditOrder; +import cn.bugstack.middleware.db.router.annotation.DBRouterStrategy; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 用户积分流水单 DAO + * @create 2024-06-01 08:55 + */ +@Mapper +@DBRouterStrategy(splitTable = true) +public interface IUserCreditOrderDao { + + void insert(UserCreditOrder userCreditOrderReq); + +} diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/po/RaffleActivityOrder.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/po/RaffleActivityOrder.java index 9bfa6b54cd109f28a035e5a18120a290e2992d64..0ebd3f46969abbf373a1d93605ec7c06bcd0137b 100644 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/po/RaffleActivityOrder.java +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/po/RaffleActivityOrder.java @@ -2,6 +2,7 @@ package cn.bugstack.infrastructure.persistent.po; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -67,6 +68,11 @@ public class RaffleActivityOrder { */ private Integer monthCount; + /** + * 支付金额【积分】 + */ + private BigDecimal payAmount; + /** * 订单状态 */ diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/po/RaffleActivitySku.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/po/RaffleActivitySku.java index 65ed3eea86f5f00821613036961ee3ed149ef2e7..abf3ab4f197202fc6fd7771ec1839829953bb3cf 100644 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/po/RaffleActivitySku.java +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/po/RaffleActivitySku.java @@ -2,6 +2,7 @@ package cn.bugstack.infrastructure.persistent.po; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -12,6 +13,10 @@ import java.util.Date; @Data public class RaffleActivitySku { + /** + * 自增ID + */ + private Long id; /** * 商品sku */ @@ -32,6 +37,10 @@ public class RaffleActivitySku { * 剩余库存 */ private Integer stockCountSurplus; + /** + * 商品金额【积分】 + */ + private BigDecimal productAmount; /** * 创建时间 */ diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/po/UserCreditOrder.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/po/UserCreditOrder.java new file mode 100644 index 0000000000000000000000000000000000000000..a9cf4ed1bcbbf90b3c02c9e3ef1eb814d102f285 --- /dev/null +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/po/UserCreditOrder.java @@ -0,0 +1,35 @@ +package cn.bugstack.infrastructure.persistent.po; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 用户积分流水单 + * @create 2024-06-01 08:48 + */ +@Data +public class UserCreditOrder { + + /** 自增ID */ + private Long id; + /** 用户ID */ + private String userId; + /** 订单ID */ + private String orderId; + /** 交易名称 */ + private String tradeName; + /** 交易类型;交易类型;forward-正向、reverse-逆向 */ + private String tradeType; + /** 交易金额 */ + private BigDecimal tradeAmount; + /** 业务仿重ID - 外部透传。返利、行为等唯一标识 */ + private String outBusinessNo; + /** 创建时间 */ + private Date createTime; + /** 更新时间 */ + private Date updateTime; + +} diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/redis/RedissonService.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/redis/RedissonService.java index c82fcde6b65a5076d84fe270487c8875fcaca142..e08faca93716bfe8fbade9ebdfd85fa39a8ec376 100644 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/redis/RedissonService.java +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/redis/RedissonService.java @@ -1,7 +1,6 @@ package cn.bugstack.infrastructure.persistent.redis; import org.redisson.api.*; -import org.springframework.data.mapping.AccessOptions; import org.springframework.stereotype.Service; import javax.annotation.Resource; diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/ActivityRepository.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/ActivityRepository.java index f14103256ad3b0e469fc664b05bfd79e2624fd98..59132300249b5cfe04460236cb3a6760870447be 100644 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/ActivityRepository.java +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/ActivityRepository.java @@ -19,18 +19,20 @@ import cn.bugstack.types.exception.AppException; import lombok.extern.slf4j.Slf4j; import org.redisson.api.RBlockingQueue; import org.redisson.api.RDelayedQueue; +import org.redisson.api.RLock; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Repository; import org.springframework.transaction.support.TransactionTemplate; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; /** - * @author zyf + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 活动仓储服务 * @create 2024-03-16 11:03 */ @@ -55,6 +57,8 @@ public class ActivityRepository implements IActivityRepository { @Resource private IRaffleActivityAccountDayDao raffleActivityAccountDayDao; @Resource + private IUserCreditAccountDao userCreditAccountDao; + @Resource private TransactionTemplate transactionTemplate; @Resource private IUserRaffleOrderDao userRaffleOrderDao; @@ -79,6 +83,7 @@ public class ActivityRepository implements IActivityRepository { .activityCountId(raffleActivitySku.getActivityCountId()) .stockCount(raffleActivitySku.getStockCount()) .stockCountSurplus(cacheSkuStock.intValue()) + .productAmount(raffleActivitySku.getProductAmount()) .build(); } @@ -122,8 +127,10 @@ public class ActivityRepository implements IActivityRepository { } @Override - public void doSaveOrder(CreateQuotaOrderAggregate createOrderAggregate) { + public void doSaveNoPayOrder(CreateQuotaOrderAggregate createOrderAggregate) { + RLock lock = redisService.getLock(Constants.RedisKey.ACTIVITY_ACCOUNT_LOCK + createOrderAggregate.getUserId() + Constants.UNDERLINE + createOrderAggregate.getActivityId()); try { + lock.lock(3, TimeUnit.SECONDS); // 订单对象 ActivityOrderEntity activityOrderEntity = createOrderAggregate.getActivityOrderEntity(); RaffleActivityOrder raffleActivityOrder = new RaffleActivityOrder(); @@ -140,6 +147,7 @@ public class ActivityRepository implements IActivityRepository { raffleActivityOrder.setTotalCount(createOrderAggregate.getTotalCount()); raffleActivityOrder.setDayCount(createOrderAggregate.getDayCount()); raffleActivityOrder.setMonthCount(createOrderAggregate.getMonthCount()); + raffleActivityOrder.setPayAmount(activityOrderEntity.getPayAmount()); raffleActivityOrder.setState(activityOrderEntity.getState().getCode()); raffleActivityOrder.setOutBusinessNo(activityOrderEntity.getOutBusinessNo()); @@ -158,7 +166,7 @@ public class ActivityRepository implements IActivityRepository { RaffleActivityAccountMonth raffleActivityAccountMonth = new RaffleActivityAccountMonth(); raffleActivityAccountMonth.setUserId(createOrderAggregate.getUserId()); raffleActivityAccountMonth.setActivityId(createOrderAggregate.getActivityId()); - raffleActivityAccountMonth.setMonth(raffleActivityAccountMonth.currentMonth()); + raffleActivityAccountMonth.setMonth(RaffleActivityAccountMonth.currentMonth()); raffleActivityAccountMonth.setMonthCount(createOrderAggregate.getMonthCount()); raffleActivityAccountMonth.setMonthCountSurplus(createOrderAggregate.getMonthCount()); @@ -166,11 +174,10 @@ public class ActivityRepository implements IActivityRepository { RaffleActivityAccountDay raffleActivityAccountDay = new RaffleActivityAccountDay(); raffleActivityAccountDay.setUserId(createOrderAggregate.getUserId()); raffleActivityAccountDay.setActivityId(createOrderAggregate.getActivityId()); - raffleActivityAccountDay.setDay(raffleActivityAccountDay.currentDay()); + raffleActivityAccountDay.setDay(RaffleActivityAccountDay.currentDay()); raffleActivityAccountDay.setDayCount(createOrderAggregate.getDayCount()); raffleActivityAccountDay.setDayCountSurplus(createOrderAggregate.getDayCount()); - // 以用户ID作为切分键,通过 doRouter 设定路由【这样就保证了下面的操作,都是同一个链接下,也就保证了事务的特性】 dbRouter.doRouter(createOrderAggregate.getUserId()); // 编程式事务 @@ -178,11 +185,12 @@ public class ActivityRepository implements IActivityRepository { try { // 1. 写入订单 raffleActivityOrderDao.insert(raffleActivityOrder); - // 2. 更新账户 - int count = raffleActivityAccountDao.updateAccountQuota(raffleActivityAccount); - // 3. 创建账户 - 更新为0,则账户不存在,创新新账户。 - if (0 == count) { + // 2. 更新账户 - 总 + RaffleActivityAccount raffleActivityAccountRes = raffleActivityAccountDao.queryAccountByUserId(raffleActivityAccount); + if (null == raffleActivityAccountRes) { raffleActivityAccountDao.insert(raffleActivityAccount); + } else { + raffleActivityAccountDao.updateAccountQuota(raffleActivityAccount); } // 4. 更新账户 - 月 raffleActivityAccountMonthDao.addAccountQuota(raffleActivityAccountMonth); @@ -195,6 +203,49 @@ public class ActivityRepository implements IActivityRepository { throw new AppException(ResponseCode.INDEX_DUP.getCode(), e); } }); + } finally { + dbRouter.clear(); + lock.unlock(); + } + } + + @Override + public void doSaveCreditPayOrder(CreateQuotaOrderAggregate createOrderAggregate) { + try { + // 创建交易订单 + ActivityOrderEntity activityOrderEntity = createOrderAggregate.getActivityOrderEntity(); + RaffleActivityOrder raffleActivityOrder = new RaffleActivityOrder(); + raffleActivityOrder.setUserId(activityOrderEntity.getUserId()); + raffleActivityOrder.setSku(activityOrderEntity.getSku()); + raffleActivityOrder.setActivityId(activityOrderEntity.getActivityId()); + raffleActivityOrder.setActivityName(activityOrderEntity.getActivityName()); + raffleActivityOrder.setStrategyId(activityOrderEntity.getStrategyId()); + raffleActivityOrder.setOrderId(activityOrderEntity.getOrderId()); + raffleActivityOrder.setOrderTime(activityOrderEntity.getOrderTime()); + raffleActivityOrder.setTotalCount(activityOrderEntity.getTotalCount()); + raffleActivityOrder.setDayCount(activityOrderEntity.getDayCount()); + raffleActivityOrder.setMonthCount(activityOrderEntity.getMonthCount()); + raffleActivityOrder.setTotalCount(createOrderAggregate.getTotalCount()); + raffleActivityOrder.setDayCount(createOrderAggregate.getDayCount()); + raffleActivityOrder.setMonthCount(createOrderAggregate.getMonthCount()); + raffleActivityOrder.setPayAmount(activityOrderEntity.getPayAmount()); + raffleActivityOrder.setState(activityOrderEntity.getState().getCode()); + raffleActivityOrder.setOutBusinessNo(activityOrderEntity.getOutBusinessNo()); + + // 以用户ID作为切分键,通过 doRouter 设定路由【这样就保证了下面的操作,都是同一个链接下,也就保证了事务的特性】 + dbRouter.doRouter(createOrderAggregate.getUserId()); + + // 编程式事务 + transactionTemplate.execute(status -> { + try { + raffleActivityOrderDao.insert(raffleActivityOrder); + return 1; + } catch (DuplicateKeyException e) { + status.setRollbackOnly(); + log.error("写入订单记录,唯一索引冲突 userId: {} activityId: {} sku: {}", activityOrderEntity.getUserId(), activityOrderEntity.getActivityId(), activityOrderEntity.getSku(), e); + throw new AppException(ResponseCode.INDEX_DUP.getCode(), e); + } + }); } finally { dbRouter.clear(); } @@ -212,7 +263,6 @@ public class ActivityRepository implements IActivityRepository { if (surplus == 0) { // 库存消耗没了以后,发送MQ消息,更新数据库库存 eventPublisher.publish(activitySkuStockZeroMessageEvent.topic(), activitySkuStockZeroMessageEvent.buildEventMessage(sku)); - return false; } else if (surplus < 0) { // 库存小于0,恢复为0个 redisService.setAtomicLong(cacheKey, 0); @@ -382,6 +432,12 @@ public class ActivityRepository implements IActivityRepository { log.warn("写入创建参与活动记录,更新月账户额度不足,异常 userId: {} activityId: {} month: {}", userId, activityId, activityAccountMonthEntity.getMonth()); throw new AppException(ResponseCode.ACCOUNT_MONTH_QUOTA_ERROR.getCode(), ResponseCode.ACCOUNT_MONTH_QUOTA_ERROR.getInfo()); } + // 更新总账户中月镜像库存 + raffleActivityAccountDao.updateActivityAccountMonthSubtractionQuota( + RaffleActivityAccount.builder() + .userId(userId) + .activityId(activityId) + .build()); } else { raffleActivityAccountMonthDao.insertActivityAccountMonth(RaffleActivityAccountMonth.builder() .userId(activityAccountMonthEntity.getUserId()) @@ -411,6 +467,12 @@ public class ActivityRepository implements IActivityRepository { log.warn("写入创建参与活动记录,更新日账户额度不足,异常 userId: {} activityId: {} day: {}", userId, activityId, activityAccountDayEntity.getDay()); throw new AppException(ResponseCode.ACCOUNT_DAY_QUOTA_ERROR.getCode(), ResponseCode.ACCOUNT_DAY_QUOTA_ERROR.getInfo()); } + // 更新总账户中日镜像库存 + raffleActivityAccountDao.updateActivityAccountDaySubtractionQuota( + RaffleActivityAccount.builder() + .userId(userId) + .activityId(activityId) + .build()); } else { raffleActivityAccountDayDao.insertActivityAccountDay(RaffleActivityAccountDay.builder() .userId(activityAccountDayEntity.getUserId()) @@ -454,7 +516,7 @@ public class ActivityRepository implements IActivityRepository { public List queryActivitySkuListByActivityId(Long activityId) { List raffleActivitySkus = raffleActivitySkuDao.queryActivitySkuListByActivityId(activityId); List activitySkuEntities = new ArrayList<>(raffleActivitySkus.size()); - for (RaffleActivitySku raffleActivitySku:raffleActivitySkus){ + for (RaffleActivitySku raffleActivitySku : raffleActivitySkus) { ActivitySkuEntity activitySkuEntity = new ActivitySkuEntity(); activitySkuEntity.setSku(raffleActivitySku.getSku()); activitySkuEntity.setActivityCountId(raffleActivitySku.getActivityCountId()); @@ -483,6 +545,7 @@ public class ActivityRepository implements IActivityRepository { .activityId(activityId) .userId(userId) .build()); + if (null == raffleActivityAccount) { return ActivityAccountEntity.builder() .activityId(activityId) @@ -495,16 +558,19 @@ public class ActivityRepository implements IActivityRepository { .dayCountSurplus(0) .build(); } + // 2. 查询月账户额度 RaffleActivityAccountMonth raffleActivityAccountMonth = raffleActivityAccountMonthDao.queryActivityAccountMonthByUserId(RaffleActivityAccountMonth.builder() .activityId(activityId) .userId(userId) + .month(RaffleActivityAccountMonth.currentMonth()) .build()); // 3. 查询日账户额度 RaffleActivityAccountDay raffleActivityAccountDay = raffleActivityAccountDayDao.queryActivityAccountDayByUserId(RaffleActivityAccountDay.builder() .activityId(activityId) .userId(userId) + .day(RaffleActivityAccountDay.currentDay()) .build()); // 组装对象 @@ -513,6 +579,7 @@ public class ActivityRepository implements IActivityRepository { activityAccountEntity.setActivityId(activityId); activityAccountEntity.setTotalCount(raffleActivityAccount.getTotalCount()); activityAccountEntity.setTotalCountSurplus(raffleActivityAccount.getTotalCountSurplus()); + // 如果没有创建日账户,则从总账户中获取日总额度填充。「当新创建日账户时,会获得总账户额度」 if (null == raffleActivityAccountDay) { activityAccountEntity.setDayCount(raffleActivityAccount.getDayCount()); @@ -521,6 +588,7 @@ public class ActivityRepository implements IActivityRepository { activityAccountEntity.setDayCount(raffleActivityAccountDay.getDayCount()); activityAccountEntity.setDayCountSurplus(raffleActivityAccountDay.getDayCountSurplus()); } + // 如果没有创建月账户,则从总账户中获取月总额度填充。「当新创建日账户时,会获得总账户额度」 if (null == raffleActivityAccountMonth) { activityAccountEntity.setMonthCount(raffleActivityAccount.getMonthCount()); @@ -529,6 +597,7 @@ public class ActivityRepository implements IActivityRepository { activityAccountEntity.setMonthCount(raffleActivityAccountMonth.getMonthCount()); activityAccountEntity.setMonthCountSurplus(raffleActivityAccountMonth.getMonthCountSurplus()); } + return activityAccountEntity; } @@ -538,7 +607,144 @@ public class ActivityRepository implements IActivityRepository { .activityId(activityId) .userId(userId) .build()); + if (null == raffleActivityAccount) return 0; return raffleActivityAccount.getTotalCount() - raffleActivityAccount.getTotalCountSurplus(); } + @Override + public void updateOrder(DeliveryOrderEntity deliveryOrderEntity) { + RLock lock = redisService.getLock(Constants.RedisKey.ACTIVITY_ACCOUNT_UPDATE_LOCK + deliveryOrderEntity.getUserId() + Constants.UNDERLINE + deliveryOrderEntity.getOutBusinessNo()); + try { + lock.lock(3, TimeUnit.SECONDS); + + // 查询订单 + RaffleActivityOrder raffleActivityOrderReq = new RaffleActivityOrder(); + raffleActivityOrderReq.setUserId(deliveryOrderEntity.getUserId()); + raffleActivityOrderReq.setOutBusinessNo(deliveryOrderEntity.getOutBusinessNo()); + RaffleActivityOrder raffleActivityOrderRes = raffleActivityOrderDao.queryRaffleActivityOrder(raffleActivityOrderReq); + + if (null == raffleActivityOrderRes) { + if (lock.isLocked()) lock.unlock(); + return; + } + + // 账户对象 - 总 + RaffleActivityAccount raffleActivityAccount = new RaffleActivityAccount(); + raffleActivityAccount.setUserId(raffleActivityOrderRes.getUserId()); + raffleActivityAccount.setActivityId(raffleActivityOrderRes.getActivityId()); + raffleActivityAccount.setTotalCount(raffleActivityOrderRes.getTotalCount()); + raffleActivityAccount.setTotalCountSurplus(raffleActivityOrderRes.getTotalCount()); + raffleActivityAccount.setDayCount(raffleActivityOrderRes.getDayCount()); + raffleActivityAccount.setDayCountSurplus(raffleActivityOrderRes.getDayCount()); + raffleActivityAccount.setMonthCount(raffleActivityOrderRes.getMonthCount()); + raffleActivityAccount.setMonthCountSurplus(raffleActivityOrderRes.getMonthCount()); + + // 账户对象 - 月 + RaffleActivityAccountMonth raffleActivityAccountMonth = new RaffleActivityAccountMonth(); + raffleActivityAccountMonth.setUserId(raffleActivityOrderRes.getUserId()); + raffleActivityAccountMonth.setActivityId(raffleActivityOrderRes.getActivityId()); + raffleActivityAccountMonth.setMonth(RaffleActivityAccountMonth.currentMonth()); + raffleActivityAccountMonth.setMonthCount(raffleActivityOrderRes.getMonthCount()); + raffleActivityAccountMonth.setMonthCountSurplus(raffleActivityOrderRes.getMonthCount()); + + // 账户对象 - 日 + RaffleActivityAccountDay raffleActivityAccountDay = new RaffleActivityAccountDay(); + raffleActivityAccountDay.setUserId(raffleActivityOrderRes.getUserId()); + raffleActivityAccountDay.setActivityId(raffleActivityOrderRes.getActivityId()); + raffleActivityAccountDay.setDay(RaffleActivityAccountDay.currentDay()); + raffleActivityAccountDay.setDayCount(raffleActivityOrderRes.getDayCount()); + raffleActivityAccountDay.setDayCountSurplus(raffleActivityOrderRes.getDayCount()); + + + dbRouter.doRouter(deliveryOrderEntity.getUserId()); + // 编程式事务 + transactionTemplate.execute(status -> { + try { + // 1. 更新订单 + int updateCount = raffleActivityOrderDao.updateOrderCompleted(raffleActivityOrderReq); + if (1 != updateCount) { + status.setRollbackOnly(); + return 1; + } + // 2. 更新账户 - 总 + RaffleActivityAccount raffleActivityAccountRes = raffleActivityAccountDao.queryAccountByUserId(raffleActivityAccount); + if (null == raffleActivityAccountRes) { + raffleActivityAccountDao.insert(raffleActivityAccount); + } else { + raffleActivityAccountDao.updateAccountQuota(raffleActivityAccount); + } + // 4. 更新账户 - 月 + raffleActivityAccountMonthDao.addAccountQuota(raffleActivityAccountMonth); + // 5. 更新账户 - 日 + raffleActivityAccountDayDao.addAccountQuota(raffleActivityAccountDay); + return 1; + } catch (DuplicateKeyException e) { + status.setRollbackOnly(); + log.error("更新订单记录,完成态,唯一索引冲突 userId: {} outBusinessNo: {}", deliveryOrderEntity.getUserId(), deliveryOrderEntity.getOutBusinessNo(), e); + throw new AppException(ResponseCode.INDEX_DUP.getCode(), e); + } + }); + } finally { + dbRouter.clear(); + if (lock.isLocked()) { + lock.unlock(); + } + } + } + + @Override + public UnpaidActivityOrderEntity queryUnpaidActivityOrder(SkuRechargeEntity skuRechargeEntity) { + RaffleActivityOrder raffleActivityOrderReq = new RaffleActivityOrder(); + raffleActivityOrderReq.setUserId(skuRechargeEntity.getUserId()); + raffleActivityOrderReq.setSku(skuRechargeEntity.getSku()); + RaffleActivityOrder raffleActivityOrderRes = raffleActivityOrderDao.queryUnpaidActivityOrder(raffleActivityOrderReq); + if (null == raffleActivityOrderRes) return null; + return UnpaidActivityOrderEntity.builder() + .userId(raffleActivityOrderRes.getUserId()) + .orderId(raffleActivityOrderRes.getOrderId()) + .outBusinessNo(raffleActivityOrderRes.getOutBusinessNo()) + .payAmount(raffleActivityOrderRes.getPayAmount()) + .build(); + } + + @Override + public List querySkuProductEntityListByActivityId(Long activityId) { + List raffleActivitySkus = raffleActivitySkuDao.queryActivitySkuListByActivityId(activityId); + List skuProductEntities = new ArrayList<>(raffleActivitySkus.size()); + for (RaffleActivitySku raffleActivitySku : raffleActivitySkus) { + RaffleActivityCount raffleActivityCount = raffleActivityCountDao.queryRaffleActivityCountByActivityCountId(raffleActivitySku.getActivityCountId()); + + SkuProductEntity.ActivityCount activityCount = new SkuProductEntity.ActivityCount(); + activityCount.setTotalCount(raffleActivityCount.getTotalCount()); + activityCount.setMonthCount(raffleActivityCount.getMonthCount()); + activityCount.setDayCount(raffleActivityCount.getDayCount()); + + skuProductEntities.add(SkuProductEntity.builder() + .sku(raffleActivitySku.getSku()) + .activityId(raffleActivitySku.getActivityId()) + .activityCountId(raffleActivitySku.getActivityCountId()) + .stockCount(raffleActivitySku.getStockCount()) + .stockCountSurplus(raffleActivitySku.getStockCountSurplus()) + .productAmount(raffleActivitySku.getProductAmount()) + .activityCount(activityCount) + .build()); + + } + return skuProductEntities; + } + + @Override + public BigDecimal queryUserCreditAccountAmount(String userId) { + try { + dbRouter.doRouter(userId); + UserCreditAccount userCreditAccountReq = new UserCreditAccount(); + userCreditAccountReq.setUserId(userId); + UserCreditAccount userCreditAccount = userCreditAccountDao.queryUserCreditAccount(userCreditAccountReq); + if (null == userCreditAccount) return BigDecimal.ZERO; + return userCreditAccount.getAvailableAmount(); + } finally { + dbRouter.clear(); + } + } + } diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/AwardRepository.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/AwardRepository.java index be04468d05577a4a2e7f9103ffea1d14122fbe60..c9fbb4fbbfa260cc9399997a14ce8c34165baf3a 100644 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/AwardRepository.java +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/AwardRepository.java @@ -13,45 +13,52 @@ import cn.bugstack.infrastructure.persistent.po.Task; import cn.bugstack.infrastructure.persistent.po.UserAwardRecord; import cn.bugstack.infrastructure.persistent.po.UserCreditAccount; import cn.bugstack.infrastructure.persistent.po.UserRaffleOrder; +import cn.bugstack.infrastructure.persistent.redis.IRedisService; import cn.bugstack.middleware.db.router.strategy.IDBRouterStrategy; +import cn.bugstack.types.common.Constants; import cn.bugstack.types.enums.ResponseCode; import cn.bugstack.types.exception.AppException; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Component; import org.springframework.transaction.support.TransactionTemplate; import javax.annotation.Resource; +import java.util.concurrent.TimeUnit; /** - * @ClassName: AwardRepository - * @Description: 奖品仓储服务 - * @Author: zhaoyongfeng - * @Date: 2024/12/9 16:25 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 奖品仓储服务 + * @create 2024-04-06 10:09 */ @Slf4j @Component public class AwardRepository implements IAwardRepository { - @Resource - private ITaskDao taskDao; + @Resource private IAwardDao awardDao; @Resource - private IUserAwardRecordDao userAwardRecordDao; + private ITaskDao taskDao; @Resource - private IUserCreditAccountDao userCreditAccountDao; + private IUserAwardRecordDao userAwardRecordDao; @Resource private IUserRaffleOrderDao userRaffleOrderDao; @Resource + private IUserCreditAccountDao userCreditAccountDao; + @Resource private IDBRouterStrategy dbRouter; @Resource private TransactionTemplate transactionTemplate; @Resource private EventPublisher eventPublisher; + @Resource + private IRedisService redisService; @Override public void saveUserAwardRecord(UserAwardRecordAggregate userAwardRecordAggregate) { + UserAwardRecordEntity userAwardRecordEntity = userAwardRecordAggregate.getUserAwardRecordEntity(); TaskEntity taskEntity = userAwardRecordAggregate.getTaskEntity(); String userId = userAwardRecordEntity.getUserId(); @@ -78,6 +85,7 @@ public class AwardRepository implements IAwardRepository { UserRaffleOrder userRaffleOrderReq = new UserRaffleOrder(); userRaffleOrderReq.setUserId(userAwardRecordEntity.getUserId()); userRaffleOrderReq.setOrderId(userAwardRecordEntity.getOrderId()); + try { dbRouter.doRouter(userId); transactionTemplate.execute(status -> { @@ -93,7 +101,7 @@ public class AwardRepository implements IAwardRepository { log.error("写入中奖记录,用户抽奖单已使用过,不可重复抽奖 userId: {} activityId: {} awardId: {}", userId, activityId, awardId); throw new AppException(ResponseCode.ACTIVITY_ORDER_ERROR.getCode(), ResponseCode.ACTIVITY_ORDER_ERROR.getInfo()); } - return null; + return 1; } catch (DuplicateKeyException e) { status.setRollbackOnly(); log.error("写入中奖记录,唯一索引冲突 userId: {} activityId: {} awardId: {}", userId, activityId, awardId, e); @@ -103,11 +111,13 @@ public class AwardRepository implements IAwardRepository { } finally { dbRouter.clear(); } + try { // 发送消息【在事务外执行,如果失败还有任务补偿】 eventPublisher.publish(task.getTopic(), task.getMessage()); // 更新数据库记录,task 任务表 taskDao.updateTaskSendMessageCompleted(task); + log.info("写入中奖记录,发送MQ消息完成 userId: {} orderId:{} topic: {}", userId, userAwardRecordEntity.getOrderId(), task.getTopic()); } catch (Exception e) { log.error("写入中奖记录,发送MQ消息失败 userId: {} topic: {}", userId, task.getTopic()); taskDao.updateTaskSendMessageFail(task); @@ -125,25 +135,32 @@ public class AwardRepository implements IAwardRepository { String userId = giveOutPrizesAggregate.getUserId(); UserCreditAwardEntity userCreditAwardEntity = giveOutPrizesAggregate.getUserCreditAwardEntity(); UserAwardRecordEntity userAwardRecordEntity = giveOutPrizesAggregate.getUserAwardRecordEntity(); + // 更新发奖记录 UserAwardRecord userAwardRecordReq = new UserAwardRecord(); userAwardRecordReq.setUserId(userId); userAwardRecordReq.setOrderId(userAwardRecordEntity.getOrderId()); userAwardRecordReq.setAwardState(userAwardRecordEntity.getAwardState().getCode()); + // 更新用户积分 「首次则插入数据」 UserCreditAccount userCreditAccountReq = new UserCreditAccount(); userCreditAccountReq.setUserId(userCreditAwardEntity.getUserId()); userCreditAccountReq.setTotalAmount(userCreditAwardEntity.getCreditAmount()); userCreditAccountReq.setAvailableAmount(userCreditAwardEntity.getCreditAmount()); userCreditAccountReq.setAccountStatus(AccountStatusVO.open.getCode()); + + RLock lock = redisService.getLock(Constants.RedisKey.ACTIVITY_ACCOUNT_LOCK + userId); try { + lock.lock(3, TimeUnit.SECONDS); dbRouter.doRouter(giveOutPrizesAggregate.getUserId()); transactionTemplate.execute(status -> { try { // 更新积分 || 创建积分账户 - int updateAccountCount = userCreditAccountDao.updateAddAmount(userCreditAccountReq); - if (0 == updateAccountCount) { + UserCreditAccount userCreditAccountRes = userCreditAccountDao.queryUserCreditAccount(userCreditAccountReq); + if (null == userCreditAccountRes) { userCreditAccountDao.insert(userCreditAccountReq); + } else { + userCreditAccountDao.updateAddAmount(userCreditAccountReq); } // 更新奖品记录 @@ -161,6 +178,7 @@ public class AwardRepository implements IAwardRepository { }); } finally { dbRouter.clear(); + lock.unlock(); } } @@ -168,4 +186,5 @@ public class AwardRepository implements IAwardRepository { public String queryAwardKey(Integer awardId) { return awardDao.queryAwardKeyByAwardId(awardId); } + } diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/BehaviorRebateRepository.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/BehaviorRebateRepository.java index 7b2cafe72f50ca7da707ad1e6033ea42fe69a495..ec71726f5eca29784739c3a0368e77f5df213a6a 100644 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/BehaviorRebateRepository.java +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/BehaviorRebateRepository.java @@ -1,6 +1,6 @@ package cn.bugstack.infrastructure.persistent.repository; -import cn.bugstack.domain.rebate.aggregate.BehaviorRebateAggregate; +import cn.bugstack.domain.rebate.model.aggregate.BehaviorRebateAggregate; import cn.bugstack.domain.rebate.model.entity.BehaviorRebateOrderEntity; import cn.bugstack.domain.rebate.model.entity.TaskEntity; import cn.bugstack.domain.rebate.model.valobj.BehaviorTypeVO; @@ -27,14 +27,14 @@ import java.util.ArrayList; import java.util.List; /** - * @ClassName: BehaviorRebateRepository - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/21 21:58 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 行为返利服务仓储实现 + * @create 2024-04-30 16:21 */ @Slf4j @Component public class BehaviorRebateRepository implements IBehaviorRebateRepository { + @Resource private IDailyBehaviorRebateDao dailyBehaviorRebateDao; @Resource @@ -71,16 +71,18 @@ public class BehaviorRebateRepository implements IBehaviorRebateRepository { try { for (BehaviorRebateAggregate behaviorRebateAggregate : behaviorRebateAggregates) { BehaviorRebateOrderEntity behaviorRebateOrderEntity = behaviorRebateAggregate.getBehaviorRebateOrderEntity(); + // 用户行为返利订单对象 UserBehaviorRebateOrder userBehaviorRebateOrder = new UserBehaviorRebateOrder(); - userBehaviorRebateOrder.setUserId(behaviorRebateOrderEntity.getUserId()); userBehaviorRebateOrder.setOrderId(behaviorRebateOrderEntity.getOrderId()); userBehaviorRebateOrder.setBehaviorType(behaviorRebateOrderEntity.getBehaviorType()); userBehaviorRebateOrder.setRebateDesc(behaviorRebateOrderEntity.getRebateDesc()); userBehaviorRebateOrder.setRebateType(behaviorRebateOrderEntity.getRebateType()); userBehaviorRebateOrder.setRebateConfig(behaviorRebateOrderEntity.getRebateConfig()); + userBehaviorRebateOrder.setOutBusinessNo(behaviorRebateOrderEntity.getOutBusinessNo()); userBehaviorRebateOrder.setBizId(behaviorRebateOrderEntity.getBizId()); userBehaviorRebateOrderDao.insert(userBehaviorRebateOrder); + // 任务对象 TaskEntity taskEntity = behaviorRebateAggregate.getTaskEntity(); Task task = new Task(); @@ -91,32 +93,34 @@ public class BehaviorRebateRepository implements IBehaviorRebateRepository { task.setState(taskEntity.getState().getCode()); taskDao.insert(task); } - return null; + return 1; } catch (DuplicateKeyException e) { status.setRollbackOnly(); log.error("写入返利记录,唯一索引冲突 userId: {}", userId, e); - throw new AppException(ResponseCode.INDEX_DUP.getCode(), e); + throw new AppException(ResponseCode.INDEX_DUP.getCode(), ResponseCode.INDEX_DUP.getInfo()); } }); } finally { dbRouter.clear(); } + // 同步发送MQ消息 - for (BehaviorRebateAggregate behaviorRebateAggregate :behaviorRebateAggregates){ + for (BehaviorRebateAggregate behaviorRebateAggregate : behaviorRebateAggregates) { TaskEntity taskEntity = behaviorRebateAggregate.getTaskEntity(); Task task = new Task(); task.setUserId(taskEntity.getUserId()); task.setMessageId(taskEntity.getMessageId()); - try{ - // 发送消息 在事务外执行,如果失败还有任务表兜底 - eventPublisher.publish(taskEntity.getTopic(),taskEntity.getMessage()); - // 更新数据库记录,task任务表 + try { + // 发送消息【在事务外执行,如果失败还有任务补偿】 + eventPublisher.publish(taskEntity.getTopic(), taskEntity.getMessage()); + // 更新数据库记录,task 任务表 taskDao.updateTaskSendMessageCompleted(task); - }catch (Exception e){ + } catch (Exception e) { log.error("写入返利记录,发送MQ消息失败 userId: {} topic: {}", userId, task.getTopic()); taskDao.updateTaskSendMessageFail(task); } } + } @Override @@ -130,17 +134,18 @@ public class BehaviorRebateRepository implements IBehaviorRebateRepository { List behaviorRebateOrderEntities = new ArrayList<>(userBehaviorRebateOrderResList.size()); for (UserBehaviorRebateOrder userBehaviorRebateOrder : userBehaviorRebateOrderResList) { BehaviorRebateOrderEntity behaviorRebateOrderEntity = BehaviorRebateOrderEntity.builder() - .userId(userBehaviorRebateOrder.getUserId()) - .orderId(userBehaviorRebateOrder.getOrderId()) - .behaviorType(userBehaviorRebateOrder.getBehaviorType()) - .rebateDesc(userBehaviorRebateOrder.getRebateDesc()) - .rebateType(userBehaviorRebateOrder.getRebateType()) - .rebateConfig(userBehaviorRebateOrder.getRebateConfig()) - .outBusinessNo(userBehaviorRebateOrder.getOutBusinessNo()) - .bizId(userBehaviorRebateOrder.getBizId()) - .build(); + .userId(userBehaviorRebateOrder.getUserId()) + .orderId(userBehaviorRebateOrder.getOrderId()) + .behaviorType(userBehaviorRebateOrder.getBehaviorType()) + .rebateDesc(userBehaviorRebateOrder.getRebateDesc()) + .rebateType(userBehaviorRebateOrder.getRebateType()) + .rebateConfig(userBehaviorRebateOrder.getRebateConfig()) + .outBusinessNo(userBehaviorRebateOrder.getOutBusinessNo()) + .bizId(userBehaviorRebateOrder.getBizId()) + .build(); behaviorRebateOrderEntities.add(behaviorRebateOrderEntity); } return behaviorRebateOrderEntities; } + } diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/CreditRepository.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/CreditRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..61b65a7e7ff6f68820ce5b0a02efac4b7cf75db8 --- /dev/null +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/CreditRepository.java @@ -0,0 +1,161 @@ +package cn.bugstack.infrastructure.persistent.repository; + +import cn.bugstack.domain.award.model.valobj.AccountStatusVO; +import cn.bugstack.domain.credit.model.aggregate.TradeAggregate; +import cn.bugstack.domain.credit.model.entity.CreditAccountEntity; +import cn.bugstack.domain.credit.model.entity.CreditOrderEntity; +import cn.bugstack.domain.credit.model.entity.TaskEntity; +import cn.bugstack.domain.credit.repository.ICreditRepository; +import cn.bugstack.infrastructure.event.EventPublisher; +import cn.bugstack.infrastructure.persistent.dao.ITaskDao; +import cn.bugstack.infrastructure.persistent.dao.IUserCreditAccountDao; +import cn.bugstack.infrastructure.persistent.dao.IUserCreditOrderDao; +import cn.bugstack.infrastructure.persistent.po.Task; +import cn.bugstack.infrastructure.persistent.po.UserCreditAccount; +import cn.bugstack.infrastructure.persistent.po.UserCreditOrder; +import cn.bugstack.infrastructure.persistent.redis.IRedisService; +import cn.bugstack.middleware.db.router.strategy.IDBRouterStrategy; +import cn.bugstack.types.common.Constants; +import cn.bugstack.types.enums.ResponseCode; +import cn.bugstack.types.exception.AppException; +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.concurrent.TimeUnit; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 用户积分仓储 + * @create 2024-06-01 10:07 + */ +@Slf4j +@Repository +public class CreditRepository implements ICreditRepository { + + @Resource + private IRedisService redisService; + @Resource + private IUserCreditAccountDao userCreditAccountDao; + @Resource + private IUserCreditOrderDao userCreditOrderDao; + @Resource + private ITaskDao taskDao; + @Resource + private IDBRouterStrategy dbRouter; + @Resource + private TransactionTemplate transactionTemplate; + @Resource + private EventPublisher eventPublisher; + + @Override + public void saveUserCreditTradeOrder(TradeAggregate tradeAggregate) { + String userId = tradeAggregate.getUserId(); + CreditAccountEntity creditAccountEntity = tradeAggregate.getCreditAccountEntity(); + CreditOrderEntity creditOrderEntity = tradeAggregate.getCreditOrderEntity(); + TaskEntity taskEntity = tradeAggregate.getTaskEntity(); + + // 积分账户 + UserCreditAccount userCreditAccountReq = new UserCreditAccount(); + userCreditAccountReq.setUserId(userId); + userCreditAccountReq.setTotalAmount(creditAccountEntity.getAdjustAmount()); + // 知识;仓储往上有业务语义,仓储往下到 dao 操作是没有业务语义的。所以不用在乎这块使用的字段名称,直接用持久化对象即可。 + userCreditAccountReq.setAvailableAmount(creditAccountEntity.getAdjustAmount()); + userCreditAccountReq.setAccountStatus(AccountStatusVO.open.getCode()); + + // 积分订单 + UserCreditOrder userCreditOrderReq = new UserCreditOrder(); + userCreditOrderReq.setUserId(creditOrderEntity.getUserId()); + userCreditOrderReq.setOrderId(creditOrderEntity.getOrderId()); + userCreditOrderReq.setTradeName(creditOrderEntity.getTradeName().getName()); + userCreditOrderReq.setTradeType(creditOrderEntity.getTradeType().getCode()); + userCreditOrderReq.setTradeAmount(creditOrderEntity.getTradeAmount()); + userCreditOrderReq.setOutBusinessNo(creditOrderEntity.getOutBusinessNo()); + + Task task = new Task(); + task.setUserId(taskEntity.getUserId()); + task.setTopic(taskEntity.getTopic()); + task.setMessageId(taskEntity.getMessageId()); + task.setMessage(JSON.toJSONString(taskEntity.getMessage())); + task.setState(taskEntity.getState().getCode()); + + RLock lock = redisService.getLock(Constants.RedisKey.USER_CREDIT_ACCOUNT_LOCK + userId + Constants.UNDERLINE + creditOrderEntity.getOutBusinessNo()); + try { + lock.lock(3, TimeUnit.SECONDS); + dbRouter.doRouter(userId); + // 编程式事务 + transactionTemplate.execute(status -> { + try { + // 1. 保存账户积分 + UserCreditAccount userCreditAccount = userCreditAccountDao.queryUserCreditAccount(userCreditAccountReq); + if (null == userCreditAccount) { + userCreditAccountDao.insert(userCreditAccountReq); + } else { + BigDecimal availableAmount = userCreditAccountReq.getAvailableAmount(); + if (availableAmount.compareTo(BigDecimal.ZERO) >= 0) { + userCreditAccountDao.updateAddAmount(userCreditAccountReq); + } else { + int subtractionCount = userCreditAccountDao.updateSubtractionAmount(userCreditAccountReq); + if (1 != subtractionCount) { + status.setRollbackOnly(); + throw new AppException(ResponseCode.USER_CREDIT_ACCOUNT_NO_AVAILABLE_AMOUNT.getCode(), ResponseCode.USER_CREDIT_ACCOUNT_NO_AVAILABLE_AMOUNT.getInfo()); + } + } + } + // 2. 保存账户订单 + userCreditOrderDao.insert(userCreditOrderReq); + // 3. 写入任务 + taskDao.insert(task); + } catch (DuplicateKeyException e) { + status.setRollbackOnly(); + log.error("调整账户积分额度异常,唯一索引冲突 userId:{} orderId:{}", userId, creditOrderEntity.getOrderId(), e); + } catch (Exception e) { + status.setRollbackOnly(); + log.error("调整账户积分额度失败 userId:{} orderId:{}", userId, creditOrderEntity.getOrderId(), e); + } + return 1; + }); + } finally { + dbRouter.clear(); + if (lock.isLocked()) { + lock.unlock(); + } + } + + try { + // 发送消息【在事务外执行,如果失败还有任务补偿】 + eventPublisher.publish(task.getTopic(), task.getMessage()); + // 更新数据库记录,task 任务表 + taskDao.updateTaskSendMessageCompleted(task); + log.info("调整账户积分记录,发送MQ消息完成 userId: {} orderId:{} topic: {}", userId, creditOrderEntity.getOrderId(), task.getTopic()); + } catch (Exception e) { + log.error("调整账户积分记录,发送MQ消息失败 userId: {} topic: {}", userId, task.getTopic()); + taskDao.updateTaskSendMessageFail(task); + } + + } + + @Override + public CreditAccountEntity queryUserCreditAccount(String userId) { + UserCreditAccount userCreditAccountReq = new UserCreditAccount(); + userCreditAccountReq.setUserId(userId); + try { + dbRouter.doRouter(userId); + UserCreditAccount userCreditAccount = userCreditAccountDao.queryUserCreditAccount(userCreditAccountReq); + BigDecimal availableAmount = BigDecimal.ZERO; + if (null != userCreditAccount) { + availableAmount = userCreditAccount.getAvailableAmount(); + } + return CreditAccountEntity.builder().userId(userId).adjustAmount(availableAmount).build(); + } finally { + dbRouter.clear(); + } + + } + +} diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/StrategyRepository.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/StrategyRepository.java index aa577f33d8688f0f24012a8c190b0003b95c3006..cb85187ed98d5a0ec9857477b98a677933d9e430 100644 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/StrategyRepository.java +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/StrategyRepository.java @@ -40,6 +40,8 @@ public class StrategyRepository implements IStrategyRepository { @Resource private IStrategyAwardDao strategyAwardDao; @Resource + private IRaffleActivityAccountDao raffleActivityAccountDao; + @Resource private IRaffleActivityAccountDayDao raffleActivityAccountDayDao; @Resource private IRedisService redisService; @@ -193,8 +195,9 @@ public class StrategyRepository implements IStrategyRepository { .ruleLimitValue(RuleLogicCheckTypeVO.valueOf(ruleTreeNodeLine.getRuleLimitValue())) .build(); - List ruleTreeNodeLineVOList = ruleTreeNodeLineMap.computeIfAbsent(ruleTreeNodeLine.getRuleNodeFrom(), k -> new ArrayList<>()); - ruleTreeNodeLineVOList.add(ruleTreeNodeLineVO); + ruleTreeNodeLineMap + .computeIfAbsent(ruleTreeNodeLine.getRuleNodeFrom(), k -> new ArrayList<>()) + .add(ruleTreeNodeLineVO); } // 2. tree node 转换为Map结构 @@ -342,12 +345,24 @@ public class StrategyRepository implements IStrategyRepository { return resultMap; } + @Override + public Integer queryActivityAccountTotalUseCount(String userId, Long strategyId) { + Long activityId = raffleActivityDao.queryActivityIdByStrategyId(strategyId); + RaffleActivityAccount raffleActivityAccount = raffleActivityAccountDao.queryActivityAccountByUserId(RaffleActivityAccount.builder() + .userId(userId) + .activityId(activityId) + .build()); + // 返回计算使用量 + return raffleActivityAccount.getTotalCount() - raffleActivityAccount.getTotalCountSurplus(); + } + @Override public List queryAwardRuleWeight(Long strategyId) { // 优先从缓存获取 String cacheKey = Constants.RedisKey.STRATEGY_RULE_WEIGHT_KEY + strategyId; List ruleWeightVOS = redisService.getValue(cacheKey); if (null != ruleWeightVOS) return ruleWeightVOS; + ruleWeightVOS = new ArrayList<>(); // 1. 查询权重规则配置 StrategyRule strategyRuleReq = new StrategyRule(); @@ -375,6 +390,7 @@ public class StrategyRepository implements IStrategyRepository { .awardTitle(strategyAward.getAwardTitle()) .build()); } + ruleWeightVOS.add(RuleWeightVO.builder() .ruleValue(ruleValue) .weight(Integer.valueOf(ruleWeightKey.split(Constants.COLON)[0])) @@ -382,8 +398,10 @@ public class StrategyRepository implements IStrategyRepository { .awardList(awardList) .build()); } + // 设置缓存 - 实际场景中,这类数据,可以在活动下架的时候统一清空缓存。 redisService.setValue(cacheKey, ruleWeightVOS); + return ruleWeightVOS; } diff --git a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/TaskRepository.java b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/TaskRepository.java index 0c57ba810eb2319c0b488e3d11de78cfb00dae1f..f0bc454d442b9fc75580ae4893f495b940b3c4b9 100644 --- a/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/TaskRepository.java +++ b/bigmarket-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/TaskRepository.java @@ -5,7 +5,6 @@ import cn.bugstack.domain.task.repository.ITaskRepository; import cn.bugstack.infrastructure.event.EventPublisher; import cn.bugstack.infrastructure.persistent.dao.ITaskDao; import cn.bugstack.infrastructure.persistent.po.Task; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; import javax.annotation.Resource; @@ -13,23 +12,18 @@ import java.util.ArrayList; import java.util.List; /** - * @ClassName: TaskRepository - * @Description: 任务服务仓储实现 - * @Author: zhaoyongfeng - * @Date: 2024/12/9 17:12 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 任务服务仓储实现 + * @create 2024-04-06 10:57 */ @Repository public class TaskRepository implements ITaskRepository { + @Resource private ITaskDao taskDao; @Resource private EventPublisher eventPublisher; - @Override - public void sendMessage(TaskEntity taskEntity) { - eventPublisher.publish(taskEntity.getTopic(), taskEntity.getMessage()); - } - @Override public List queryNoSendMessageTaskList() { List tasks = taskDao.queryNoSendMessageTaskList(); @@ -46,18 +40,24 @@ public class TaskRepository implements ITaskRepository { } @Override - public void updateTaskSendMessageFail(String userId, String messageId) { - Task task = new Task(); - task.setUserId(userId); - task.setMessageId(messageId); - taskDao.updateTaskSendMessageFail(task); + public void sendMessage(TaskEntity taskEntity) { + eventPublisher.publish(taskEntity.getTopic(), taskEntity.getMessage()); } @Override public void updateTaskSendMessageCompleted(String userId, String messageId) { - Task task = new Task(); - task.setUserId(userId); - task.setMessageId(messageId); - taskDao.updateTaskSendMessageCompleted(task); + Task taskReq = new Task(); + taskReq.setUserId(userId); + taskReq.setMessageId(messageId); + taskDao.updateTaskSendMessageCompleted(taskReq); } + + @Override + public void updateTaskSendMessageFail(String userId, String messageId) { + Task taskReq = new Task(); + taskReq.setUserId(userId); + taskReq.setMessageId(messageId); + taskDao.updateTaskSendMessageFail(taskReq); + } + } diff --git a/bigmarket-trigger/pom.xml b/bigmarket-trigger/pom.xml index ab6a4d1072913a8e5a67ff3012392d6cb0f8769b..26e1b537fd83b116b05e809b86fe6ce87057580d 100644 --- a/bigmarket-trigger/pom.xml +++ b/bigmarket-trigger/pom.xml @@ -34,6 +34,18 @@ cn.bugstack.middleware db-router-spring-boot-starter + + org.apache.dubbo + dubbo + + + org.apache.dubbo + dubbo-spring-boot-starter + + + org.springframework.cloud + spring-cloud-starter-zookeeper-discovery + cn.bugstack diff --git a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/http/DCCController.java b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/http/DCCController.java new file mode 100644 index 0000000000000000000000000000000000000000..dfb1d4bca6fc3d44c4cf1609283666aa1eba6369 --- /dev/null +++ b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/http/DCCController.java @@ -0,0 +1,61 @@ +package cn.bugstack.trigger.http; + +import cn.bugstack.trigger.api.IDCCService; +import cn.bugstack.trigger.api.response.Response; +import cn.bugstack.types.enums.ResponseCode; +import lombok.extern.slf4j.Slf4j; +import org.apache.curator.framework.CuratorFramework; +import org.apache.zookeeper.data.Stat; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.nio.charset.StandardCharsets; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 动态配置管理 + * @create 2024-07-13 08:57 + */ +@Slf4j +@RestController() +@CrossOrigin("${app.config.cross-origin}") +@RequestMapping("/api/${app.config.api-version}/raffle/dcc/") +public class DCCController implements IDCCService { + + @Resource + private CuratorFramework client; + + private static final String BASE_CONFIG_PATH = "/big-market-dcc"; + private static final String BASE_CONFIG_PATH_CONFIG = BASE_CONFIG_PATH + "/config"; + + /** + * 更新配置 + *

+ * curl --request GET --url 'http://localhost:8091/api/v1/raffle/dcc/update_config?key=degradeSwitch&value=close' + */ + @RequestMapping(value = "update_config", method = RequestMethod.GET) + @Override + public Response updateConfig(@RequestParam String key, @RequestParam String value) { + try { + log.info("DCC 动态配置值变更开始 key:{} value:{}", key, value); + String keyPath = BASE_CONFIG_PATH_CONFIG.concat("/").concat(key); + if (null == client.checkExists().forPath(keyPath)) { + client.create().creatingParentsIfNeeded().forPath(keyPath); + log.info("DCC 节点监听 base node {} not absent create new done!", keyPath); + } + Stat stat = client.setData().forPath(keyPath, value.getBytes(StandardCharsets.UTF_8)); + log.info("DCC 动态配置值变更完成 key:{} value:{} time:{}", key, value, stat.getCtime()); + return Response.builder() + .code(ResponseCode.SUCCESS.getCode()) + .info(ResponseCode.SUCCESS.getInfo()) + .build(); + } catch (Exception e) { + log.error("DCC 动态配置值变更失败 key:{} value:{}", key, value, e); + return Response.builder() + .code(ResponseCode.UN_ERROR.getCode()) + .info(ResponseCode.UN_ERROR.getInfo()) + .build(); + } + } + +} diff --git a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/http/RaffleActivityController.java b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/http/RaffleActivityController.java index 02d2e9e3b3d722961b2b8542ae6f7f5651aa7334..e81ce3c24a9a07c33874f2df799e85d6c9f8ee48 100644 --- a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/http/RaffleActivityController.java +++ b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/http/RaffleActivityController.java @@ -1,13 +1,19 @@ package cn.bugstack.trigger.http; -import cn.bugstack.domain.activity.model.entity.ActivityAccountEntity; -import cn.bugstack.domain.activity.model.entity.UserRaffleOrderEntity; +import cn.bugstack.domain.activity.model.entity.*; +import cn.bugstack.domain.activity.model.valobj.OrderTradeTypeVO; import cn.bugstack.domain.activity.service.IRaffleActivityAccountQuotaService; import cn.bugstack.domain.activity.service.IRaffleActivityPartakeService; +import cn.bugstack.domain.activity.service.IRaffleActivitySkuProductService; import cn.bugstack.domain.activity.service.armory.IActivityArmory; import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity; import cn.bugstack.domain.award.model.valobj.AwardStateVO; import cn.bugstack.domain.award.service.IAwardService; +import cn.bugstack.domain.credit.model.entity.CreditAccountEntity; +import cn.bugstack.domain.credit.model.entity.TradeEntity; +import cn.bugstack.domain.credit.model.valobj.TradeNameVO; +import cn.bugstack.domain.credit.model.valobj.TradeTypeVO; +import cn.bugstack.domain.credit.service.ICreditAdjustService; import cn.bugstack.domain.rebate.model.entity.BehaviorEntity; import cn.bugstack.domain.rebate.model.entity.BehaviorRebateOrderEntity; import cn.bugstack.domain.rebate.model.valobj.BehaviorTypeVO; @@ -17,49 +23,62 @@ import cn.bugstack.domain.strategy.model.entity.RaffleFactorEntity; import cn.bugstack.domain.strategy.service.IRaffleStrategy; import cn.bugstack.domain.strategy.service.armory.IStrategyArmory; import cn.bugstack.trigger.api.IRaffleActivityService; -import cn.bugstack.trigger.api.dto.ActivityDrawRequestDTO; -import cn.bugstack.trigger.api.dto.ActivityDrawResponseDTO; -import cn.bugstack.trigger.api.dto.UserActivityAccountRequestDTO; -import cn.bugstack.trigger.api.dto.UserActivityAccountResponseDTO; +import cn.bugstack.trigger.api.dto.*; +import cn.bugstack.trigger.api.response.Response; +import cn.bugstack.types.annotations.DCCValue; import cn.bugstack.types.enums.ResponseCode; import cn.bugstack.types.exception.AppException; -import cn.bugstack.types.model.Response; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.math.BigDecimal; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.List; /** - * @ClassName: RaffleActivityController - * @Description: - * @Author: zhaoyongfeng - * @Date: 2024/12/10 22:11 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 抽奖活动服务 注意;在不引用 application/case 层的时候,就需要让接口实现层来做领域的串联。一些较大规模的系统,需要加入 case 层。 + * @create 2024-04-13 09:42 */ @Slf4j @RestController() @CrossOrigin("${app.config.cross-origin}") @RequestMapping("/api/${app.config.api-version}/raffle/activity/") +@DubboService(version = "1.0") public class RaffleActivityController implements IRaffleActivityService { + private final SimpleDateFormat dateFormatDay = new SimpleDateFormat("yyyyMMdd"); + @Resource private IRaffleActivityPartakeService raffleActivityPartakeService; @Resource private IRaffleActivityAccountQuotaService raffleActivityAccountQuotaService; @Resource - private IActivityArmory activityArmory; - @Resource - private IStrategyArmory strategyArmory; + private IRaffleActivitySkuProductService raffleActivitySkuProductService; @Resource private IRaffleStrategy raffleStrategy; @Resource private IAwardService awardService; @Resource + private IActivityArmory activityArmory; + @Resource + private IStrategyArmory strategyArmory; + @Resource private IBehaviorRebateService behaviorRebateService; + @Resource + private ICreditAdjustService creditAdjustService; + + // dcc 统一配置中心动态配置降级开关 + @DCCValue("degradeSwitch:open") + private String degradeSwitch; + /** * 活动装配 - 数据预热 | 把活动配置的对应的 sku 一起装配 * @@ -68,14 +87,14 @@ public class RaffleActivityController implements IRaffleActivityService { *

* 接口:/api/v1/raffle/activity/armory * 入参:{"activityId":100001,"userId":"xiaofuge"} - * + *

* curl --request GET \ - * --url 'http://localhost:8091/api/v1/raffle/activity/armory?activityId=100301' + * --url 'http://localhost:8091/api/v1/raffle/activity/armory?activityId=100301' */ - @RequestMapping(value = "armory",method = RequestMethod.GET) + @RequestMapping(value = "armory", method = RequestMethod.GET) @Override public Response armory(@RequestParam Long activityId) { - try{ + try { log.info("活动装配,数据预热,开始 activityId:{}", activityId); // 1. 活动装配 activityArmory.assembleActivitySkuByActivityId(activityId); @@ -88,7 +107,7 @@ public class RaffleActivityController implements IRaffleActivityService { .build(); log.info("活动装配,数据预热,完成 activityId:{}", activityId); return response; - }catch (Exception e){ + } catch (Exception e) { log.error("活动装配,数据预热,失败 activityId:{}", activityId, e); return Response.builder() .code(ResponseCode.UN_ERROR.getCode()) @@ -105,20 +124,27 @@ public class RaffleActivityController implements IRaffleActivityService { *

* 接口:/api/v1/raffle/activity/draw * 入参:{"activityId":100001,"userId":"xiaofuge"} - * + *

* curl --request POST \ - * --url http://localhost:8091/api/v1/raffle/activity/draw \ - * --header 'content-type: application/json' \ - * --data '{ - * "userId":"xiaofuge", - * "activityId": 100301 + * --url http://localhost:8091/api/v1/raffle/activity/draw \ + * --header 'content-type: application/json' \ + * --data '{ + * "userId":"xiaofuge", + * "activityId": 100301 * }' */ - @RequestMapping(value = "draw",method = RequestMethod.POST) + @RequestMapping(value = "draw", method = RequestMethod.POST) @Override public Response draw(@RequestBody ActivityDrawRequestDTO request) { try { - log.info("活动抽奖 userId:{} activityId:{}", request.getUserId(), request.getActivityId()); + log.info("活动抽奖开始 userId:{} activityId:{}", request.getUserId(), request.getActivityId()); + if (!"open".equals(degradeSwitch)) { + return Response.builder() + .code(ResponseCode.DEGRADE_SWITCH.getCode()) + .info(ResponseCode.DEGRADE_SWITCH.getInfo()) + .build(); + } + // 1. 参数校验 if (StringUtils.isBlank(request.getUserId()) || null == request.getActivityId()) { throw new AppException(ResponseCode.ILLEGAL_PARAMETER.getCode(), ResponseCode.ILLEGAL_PARAMETER.getInfo()); @@ -174,6 +200,7 @@ public class RaffleActivityController implements IRaffleActivityService { .build(); } } + /** * 日历签到返利接口 * @@ -185,9 +212,9 @@ public class RaffleActivityController implements IRaffleActivityService { *

* curl -X POST http://localhost:8091/api/v1/raffle/activity/calendar_sign_rebate -d "userId=xiaofuge" -H "Content-Type: application/x-www-form-urlencoded" */ - @RequestMapping(value = "calendar_sign_rebate",method = RequestMethod.POST) + @RequestMapping(value = "calendar_sign_rebate", method = RequestMethod.POST) @Override - public Response calendarSignRebate(@RequestParam String userId){ + public Response calendarSignRebate(@RequestParam String userId) { try { log.info("日历签到返利开始 userId:{}", userId); BehaviorEntity behaviorEntity = new BehaviorEntity(); @@ -216,15 +243,16 @@ public class RaffleActivityController implements IRaffleActivityService { .build(); } } + /** * 判断是否签到接口 *

* curl -X POST http://localhost:8091/api/v1/raffle/activity/is_calendar_sign_rebate -d "userId=xiaofuge" -H "Content-Type: application/x-www-form-urlencoded" */ - @RequestMapping(value = "is_calendar_sign_rebate",method = RequestMethod.POST) + @RequestMapping(value = "is_calendar_sign_rebate", method = RequestMethod.POST) @Override - public Response isCalendarSignRebate(String userId) { - try{ + public Response isCalendarSignRebate(@RequestParam String userId) { + try { log.info("查询用户是否完成日历签到返利开始 userId:{}", userId); String outBusinessNo = dateFormatDay.format(new Date()); List behaviorRebateOrderEntities = behaviorRebateService.queryOrderByOutBusinessNo(userId, outBusinessNo); @@ -232,10 +260,9 @@ public class RaffleActivityController implements IRaffleActivityService { return Response.builder() .code(ResponseCode.SUCCESS.getCode()) .info(ResponseCode.SUCCESS.getInfo()) - // 只要不为空,则表示已经做了签到 - .data(!behaviorRebateOrderEntities.isEmpty()) + .data(!behaviorRebateOrderEntities.isEmpty()) // 只要不为空,则表示已经做了签到 .build(); - }catch (Exception e) { + } catch (Exception e) { log.error("查询用户是否完成日历签到返利失败 userId:{}", userId, e); return Response.builder() .code(ResponseCode.UN_ERROR.getCode()) @@ -244,6 +271,7 @@ public class RaffleActivityController implements IRaffleActivityService { .build(); } } + /** * 查询账户额度 *

@@ -257,7 +285,7 @@ public class RaffleActivityController implements IRaffleActivityService { */ @RequestMapping(value = "query_user_activity_account", method = RequestMethod.POST) @Override - public Response queryUserActivityAccount(UserActivityAccountRequestDTO request) { + public Response queryUserActivityAccount(@RequestBody UserActivityAccountRequestDTO request) { try { log.info("查询用户活动账户开始 userId:{} activityId:{}", request.getUserId(), request.getActivityId()); // 1. 参数校验 @@ -279,7 +307,7 @@ public class RaffleActivityController implements IRaffleActivityService { .info(ResponseCode.SUCCESS.getInfo()) .data(userActivityAccountResponseDTO) .build(); - }catch (Exception e){ + } catch (Exception e) { log.error("查询用户活动账户失败 userId:{} activityId:{}", request.getUserId(), request.getActivityId(), e); return Response.builder() .code(ResponseCode.UN_ERROR.getCode()) @@ -287,4 +315,117 @@ public class RaffleActivityController implements IRaffleActivityService { .build(); } } + + @RequestMapping(value = "query_sku_product_list_by_activity_id", method = RequestMethod.POST) + @Override + public Response> querySkuProductListByActivityId(Long activityId) { + try { + log.info("查询sku商品集合开始 activityId:{}", activityId); + // 1. 参数校验 + if (null == activityId) { + throw new AppException(ResponseCode.ILLEGAL_PARAMETER.getCode(), ResponseCode.ILLEGAL_PARAMETER.getInfo()); + } + // 2. 查询商品&封装数据 + List skuProductEntities = raffleActivitySkuProductService.querySkuProductEntityListByActivityId(activityId); + List skuProductResponseDTOS = new ArrayList<>(skuProductEntities.size()); + for (SkuProductEntity skuProductEntity : skuProductEntities) { + + SkuProductResponseDTO.ActivityCount activityCount = new SkuProductResponseDTO.ActivityCount(); + activityCount.setTotalCount(skuProductEntity.getActivityCount().getTotalCount()); + activityCount.setMonthCount(skuProductEntity.getActivityCount().getMonthCount()); + activityCount.setDayCount(skuProductEntity.getActivityCount().getDayCount()); + + SkuProductResponseDTO skuProductResponseDTO = new SkuProductResponseDTO(); + skuProductResponseDTO.setSku(skuProductEntity.getSku()); + skuProductResponseDTO.setActivityId(skuProductEntity.getActivityId()); + skuProductResponseDTO.setActivityCountId(skuProductEntity.getActivityCountId()); + skuProductResponseDTO.setStockCount(skuProductEntity.getStockCount()); + skuProductResponseDTO.setStockCountSurplus(skuProductEntity.getStockCountSurplus()); + skuProductResponseDTO.setProductAmount(skuProductEntity.getProductAmount()); + skuProductResponseDTO.setActivityCount(activityCount); + skuProductResponseDTOS.add(skuProductResponseDTO); + } + + log.info("查询sku商品集合完成 activityId:{} skuProductResponseDTOS:{}", activityId, JSON.toJSONString(skuProductResponseDTOS)); + return Response.>builder() + .code(ResponseCode.SUCCESS.getCode()) + .info(ResponseCode.SUCCESS.getInfo()) + .data(skuProductResponseDTOS) + .build(); + } catch (Exception e) { + log.error("查询sku商品集合失败 activityId:{}", activityId, e); + return Response.>builder() + .code(ResponseCode.UN_ERROR.getCode()) + .info(ResponseCode.UN_ERROR.getInfo()) + .build(); + } + } + + @RequestMapping(value = "query_user_credit_account", method = RequestMethod.POST) + @Override + public Response queryUserCreditAccount(String userId) { + try { + log.info("查询用户积分值开始 userId:{}", userId); + CreditAccountEntity creditAccountEntity = creditAdjustService.queryUserCreditAccount(userId); + log.info("查询用户积分值完成 userId:{} adjustAmount:{}", userId, creditAccountEntity.getAdjustAmount()); + return Response.builder() + .code(ResponseCode.SUCCESS.getCode()) + .info(ResponseCode.SUCCESS.getInfo()) + .data(creditAccountEntity.getAdjustAmount()) + .build(); + } catch (Exception e) { + log.error("查询用户积分值失败 userId:{}", userId, e); + return Response.builder() + .code(ResponseCode.UN_ERROR.getCode()) + .info(ResponseCode.UN_ERROR.getInfo()) + .build(); + } + } + + + @RequestMapping(value = "credit_pay_exchange_sku", method = RequestMethod.POST) + @Override + public Response creditPayExchangeSku(@RequestBody SkuProductShopCartRequestDTO request) { + try { + log.info("积分兑换商品开始 userId:{} sku:{}", request.getUserId(), request.getSku()); + // 1. 创建兑换商品sku订单,outBusinessNo 每次创建出一个单号。 + UnpaidActivityOrderEntity unpaidActivityOrder = raffleActivityAccountQuotaService.createOrder(SkuRechargeEntity.builder() + .userId(request.getUserId()) + .sku(request.getSku()) + .outBusinessNo(RandomStringUtils.randomNumeric(12)) + .orderTradeType(OrderTradeTypeVO.credit_pay_trade) + .build()); + log.info("积分兑换商品,创建订单完成 userId:{} sku:{} outBusinessNo:{}", request.getUserId(), request.getSku(), unpaidActivityOrder.getOutBusinessNo()); + + // 2.支付兑换商品 + String orderId = creditAdjustService.createOrder(TradeEntity.builder() + .userId(unpaidActivityOrder.getUserId()) + .tradeName(TradeNameVO.CONVERT_SKU) + .tradeType(TradeTypeVO.REVERSE) + .amount(unpaidActivityOrder.getPayAmount().negate()) + .outBusinessNo(unpaidActivityOrder.getOutBusinessNo()) + .build()); + log.info("积分兑换商品,支付订单完成 userId:{} sku:{} orderId:{}", request.getUserId(), request.getSku(), orderId); + + return Response.builder() + .code(ResponseCode.SUCCESS.getCode()) + .info(ResponseCode.SUCCESS.getInfo()) + .data(true) + .build(); + } catch (AppException e) { + log.error("积分兑换商品失败 userId:{} activityId:{}", request.getUserId(), request.getSku(), e); + return Response.builder() + .code(e.getCode()) + .info(e.getInfo()) + .build(); + } catch (Exception e) { + log.error("积分兑换商品失败 userId:{} sku:{}", request.getUserId(), request.getSku(), e); + return Response.builder() + .code(ResponseCode.UN_ERROR.getCode()) + .info(ResponseCode.UN_ERROR.getInfo()) + .data(false) + .build(); + } + } + } diff --git a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/http/RaffleStrategyController.java b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/http/RaffleStrategyController.java index 0ba75a0b39291427b250e37b090d94d3e6b12ebd..491dee6330dc883f32724302e4392280c4a60982 100644 --- a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/http/RaffleStrategyController.java +++ b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/http/RaffleStrategyController.java @@ -11,12 +11,13 @@ import cn.bugstack.domain.strategy.service.IRaffleStrategy; import cn.bugstack.domain.strategy.service.armory.IStrategyArmory; import cn.bugstack.trigger.api.IRaffleStrategyService; import cn.bugstack.trigger.api.dto.*; +import cn.bugstack.trigger.api.response.Response; import cn.bugstack.types.enums.ResponseCode; import cn.bugstack.types.exception.AppException; -import cn.bugstack.types.model.Response; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -25,14 +26,15 @@ import java.util.List; import java.util.Map; /** - * @author + * @author Fuzhengwei bugstack.cn @小傅哥 * @description 营销抽奖服务 * @create 2024-02-14 09:21 */ @Slf4j @RestController() @CrossOrigin("${app.config.cross-origin}") -@RequestMapping("/api/${app.config.api-version}/raffle/") +@RequestMapping("/api/${app.config.api-version}/raffle/strategy/") +@DubboService(version = "1.0") public class RaffleStrategyController implements IRaffleStrategyService { @Resource @@ -48,7 +50,7 @@ public class RaffleStrategyController implements IRaffleStrategyService { /** * 策略装配,将策略信息装配到缓存中 - * /api/v1/raffle/strategy_armory + * /api/v1/raffle/strategy/strategy_armory * * @param strategyId 策略ID * @return 装配结果 @@ -77,10 +79,10 @@ public class RaffleStrategyController implements IRaffleStrategyService { /** * 查询奖品列表 - * /api/v1/raffle/query_raffle_award_list + * /api/v1/raffle/strategy/query_raffle_award_list * 请求参数 raw json * - * @param request {"strategyId":1000001} + * @param request {"activityId":100301,"userId":"xiaofuge"} * @return 奖品列表 */ @RequestMapping(value = "query_raffle_award_list", method = RequestMethod.POST) @@ -135,49 +137,7 @@ public class RaffleStrategyController implements IRaffleStrategyService { } /** - * 随机抽奖接口 - * /api/v1/raffle/random_raffle - * - * @param requestDTO 请求参数 {"strategyId":1000001} - * @return 抽奖结果 - */ - @RequestMapping(value = "random_raffle", method = RequestMethod.POST) - @Override - public Response randomRaffle(@RequestBody RaffleRequestDTO requestDTO) { - try { - log.info("随机抽奖开始 strategyId: {}", requestDTO.getStrategyId()); - // 调用抽奖接口 - RaffleAwardEntity raffleAwardEntity = raffleStrategy.performRaffle(RaffleFactorEntity.builder() - .userId("system") - .strategyId(requestDTO.getStrategyId()) - .build()); - // 封装返回结果 - Response response = Response.builder() - .code(ResponseCode.SUCCESS.getCode()) - .info(ResponseCode.SUCCESS.getInfo()) - .data(RaffleResponseDTO.builder() - .awardId(raffleAwardEntity.getAwardId()) - .awardIndex(raffleAwardEntity.getSort()) - .build()) - .build(); - log.info("随机抽奖完成 strategyId: {} response: {}", requestDTO.getStrategyId(), JSON.toJSONString(response)); - return response; - } catch (AppException e) { - log.error("随机抽奖失败 strategyId:{} {}", requestDTO.getStrategyId(), e.getInfo()); - return Response.builder() - .code(e.getCode()) - .info(e.getInfo()) - .build(); - } catch (Exception e) { - log.error("随机抽奖失败 strategyId:{}", requestDTO.getStrategyId(), e); - return Response.builder() - .code(ResponseCode.UN_ERROR.getCode()) - .info(ResponseCode.UN_ERROR.getInfo()) - .build(); - } - } - /** - * 查询抽奖策略权重规则,给用户展示出抽奖N次后必中奖奖品范围 + * 查询策略抽奖权重规则 * curl --request POST \ * --url http://localhost:8091/api/v1/raffle/strategy/query_raffle_strategy_rule_weight \ * --header 'content-type: application/json' \ @@ -189,7 +149,7 @@ public class RaffleStrategyController implements IRaffleStrategyService { @RequestMapping(value = "query_raffle_strategy_rule_weight", method = RequestMethod.POST) @Override - public Response> queryRaffleStrategyRuleWeight(RaffleStrategyRuleWeightRequestDTO request) { + public Response> queryRaffleStrategyRuleWeight(@RequestBody RaffleStrategyRuleWeightRequestDTO request) { try { log.info("查询抽奖策略权重规则配置开始 userId:{} activityId:{}", request.getUserId(), request.getActivityId()); // 1. 参数校验 @@ -226,7 +186,7 @@ public class RaffleStrategyController implements IRaffleStrategyService { .build(); log.info("查询抽奖策略权重规则配置完成 userId:{} activityId:{} response: {}", request.getUserId(), request.getActivityId(), JSON.toJSONString(response)); return response; - }catch (Exception e) { + } catch (Exception e) { log.error("查询抽奖策略权重规则配置失败 userId:{} activityId:{}", request.getUserId(), request.getActivityId(), e); return Response.>builder() .code(ResponseCode.UN_ERROR.getCode()) @@ -235,4 +195,47 @@ public class RaffleStrategyController implements IRaffleStrategyService { } } + /** + * 随机抽奖接口 + * /api/v1/raffle/random_raffle + * + * @param requestDTO 请求参数 {"strategyId":1000001} + * @return 抽奖结果 + */ + @RequestMapping(value = "random_raffle", method = RequestMethod.POST) + @Override + public Response randomRaffle(@RequestBody RaffleStrategyRequestDTO requestDTO) { + try { + log.info("随机抽奖开始 strategyId: {}", requestDTO.getStrategyId()); + // 调用抽奖接口 + RaffleAwardEntity raffleAwardEntity = raffleStrategy.performRaffle(RaffleFactorEntity.builder() + .userId("system") + .strategyId(requestDTO.getStrategyId()) + .build()); + // 封装返回结果 + Response response = Response.builder() + .code(ResponseCode.SUCCESS.getCode()) + .info(ResponseCode.SUCCESS.getInfo()) + .data(RaffleStrategyResponseDTO.builder() + .awardId(raffleAwardEntity.getAwardId()) + .awardIndex(raffleAwardEntity.getSort()) + .build()) + .build(); + log.info("随机抽奖完成 strategyId: {} response: {}", requestDTO.getStrategyId(), JSON.toJSONString(response)); + return response; + } catch (AppException e) { + log.error("随机抽奖失败 strategyId:{} {}", requestDTO.getStrategyId(), e.getInfo()); + return Response.builder() + .code(e.getCode()) + .info(e.getInfo()) + .build(); + } catch (Exception e) { + log.error("随机抽奖失败 strategyId:{}", requestDTO.getStrategyId(), e); + return Response.builder() + .code(ResponseCode.UN_ERROR.getCode()) + .info(ResponseCode.UN_ERROR.getInfo()) + .build(); + } + } + } diff --git a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/job/SendMessageTaskJob.java b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/job/SendMessageTaskJob.java index a9bd944054d1bf9e2dc6f30d4ab63e1b157984c9..ec4795e1dc37539a1a5d42d187fb80a2d0535a72 100644 --- a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/job/SendMessageTaskJob.java +++ b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/job/SendMessageTaskJob.java @@ -12,14 +12,14 @@ import java.util.List; import java.util.concurrent.ThreadPoolExecutor; /** - * @ClassName: SendMessageTask - * @Description: 发送MQ消息任务队列 - * @Author: zhaoyongfeng - * @Date: 2024/12/9 17:28 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 发送MQ消息任务队列 + * @create 2024-04-06 10:47 */ @Slf4j @Component() public class SendMessageTaskJob { + @Resource private ITaskService taskService; @Resource @@ -27,38 +27,50 @@ public class SendMessageTaskJob { @Resource private IDBRouterStrategy dbRouter; - @Scheduled(cron = "0 * * * * ?") - public void exec() { + @Scheduled(cron = "0/5 * * * * ?") + public void exec_db01() { try { - // 获取分库数量 - int dbCount = dbRouter.dbCount(); - // 逐个库扫描表【每个库一个任务表】 - for (int dbIdx = 1; dbIdx <= dbCount; dbIdx++) { - int finalDbIdx = dbIdx; - executor.execute(() -> { - try { - dbRouter.setDBKey(finalDbIdx); - dbRouter.setTBKey(0); // 默认值为0,表示不分表 - List taskEntities = taskService.queryNoSendMessageTaskList(); - if (taskEntities.isEmpty()) return; - // 发送MQ消息 - for (TaskEntity taskEntity : taskEntities) { - // 开启线程发送,提高发送效率。配置的线程池策略为 CallerRunsPolicy,在 ThreadPoolConfig 配置中有4个策略,面试中容易对比提问。可以检索下相关资料。 - executor.execute(() -> { - try { - taskService.sendMessage(taskEntity); - taskService.updateTaskSendMessageCompleted(taskEntity.getUserId(), taskEntity.getMessageId()); - } catch (Exception e) { - log.error("定时任务,发送MQ消息失败 userId: {} topic: {}", taskEntity.getUserId(), taskEntity.getTopic()); - taskService.updateTaskSendMessageFail(taskEntity.getUserId(), taskEntity.getMessageId()); - } - }); - } - } finally { - dbRouter.clear(); - } + // 设置库表 + dbRouter.setDBKey(1); + dbRouter.setTBKey(0); + // 查询未发送的任务 + List taskEntities = taskService.queryNoSendMessageTaskList(); + if (taskEntities.isEmpty()) return; + // 发送MQ消息 + for (TaskEntity taskEntity : taskEntities) { + try { + taskService.sendMessage(taskEntity); + taskService.updateTaskSendMessageCompleted(taskEntity.getUserId(), taskEntity.getMessageId()); + } catch (Exception e) { + log.error("定时任务,发送MQ消息失败 userId: {} topic: {}", taskEntity.getUserId(), taskEntity.getTopic()); + taskService.updateTaskSendMessageFail(taskEntity.getUserId(), taskEntity.getMessageId()); + } + } + } catch (Exception e) { + log.error("定时任务,扫描MQ任务表发送消息失败。", e); + } finally { + dbRouter.clear(); + } + } - }); + @Scheduled(cron = "0/5 * * * * ?") + public void exec_db02() { + try { + // 设置库表 + dbRouter.setDBKey(2); + dbRouter.setTBKey(0); + // 查询未发送的任务 + List taskEntities = taskService.queryNoSendMessageTaskList(); + if (taskEntities.isEmpty()) return; + // 发送MQ消息 + for (TaskEntity taskEntity : taskEntities) { + try { + taskService.sendMessage(taskEntity); + taskService.updateTaskSendMessageCompleted(taskEntity.getUserId(), taskEntity.getMessageId()); + } catch (Exception e) { + log.error("定时任务,发送MQ消息失败 userId: {} topic: {}", taskEntity.getUserId(), taskEntity.getTopic()); + taskService.updateTaskSendMessageFail(taskEntity.getUserId(), taskEntity.getMessageId()); + } } } catch (Exception e) { log.error("定时任务,扫描MQ任务表发送消息失败。", e); @@ -66,4 +78,5 @@ public class SendMessageTaskJob { dbRouter.clear(); } } + } diff --git a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/job/UpdateActivitySkuStockJob.java b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/job/UpdateActivitySkuStockJob.java index 4bfa245348241681b6fd300216dd818b7b0d4527..b2c0ab8c5269c2ad5db0b51e4cfcbacab0ab331a 100644 --- a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/job/UpdateActivitySkuStockJob.java +++ b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/job/UpdateActivitySkuStockJob.java @@ -20,10 +20,9 @@ public class UpdateActivitySkuStockJob { @Resource private IRaffleActivitySkuStockService skuStock; - @Scheduled(cron = "0 * * * * ?") + @Scheduled(cron = "0/5 * * * * ?") public void exec() { try { - log.info("定时任务,更新活动sku库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】"); ActivitySkuStockKeyVO activitySkuStockKeyVO = skuStock.takeQueueValue(); if (null == activitySkuStockKeyVO) return; log.info("定时任务,更新活动sku库存 sku:{} activityId:{}", activitySkuStockKeyVO.getSku(), activitySkuStockKeyVO.getActivityId()); diff --git a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/job/UpdateAwardStockJob.java b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/job/UpdateAwardStockJob.java index 928709b114ee8b7b16d63d00b6f7e29ed8084c52..d1103b701b5c5371345ff388c8638fdcc053d53c 100644 --- a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/job/UpdateAwardStockJob.java +++ b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/job/UpdateAwardStockJob.java @@ -20,10 +20,9 @@ public class UpdateAwardStockJob { @Resource private IRaffleStock raffleStock; - @Scheduled(cron = "0 * * * * ?") + @Scheduled(cron = "0/5 * * * * ?") public void exec() { try { - log.info("定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】"); StrategyAwardStockKeyVO strategyAwardStockKeyVO = raffleStock.takeQueueValue(); if (null == strategyAwardStockKeyVO) return; log.info("定时任务,更新奖品消耗库存 strategyId:{} awardId:{}", strategyAwardStockKeyVO.getStrategyId(), strategyAwardStockKeyVO.getAwardId()); diff --git a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/ActivitySkuStockZeroCustomer.java b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/ActivitySkuStockZeroCustomer.java index 32e913cf3ccf81752ff58c905d30a05158240641..ab3e44bbc0b99f4b552c5fafad16af01b4d2c8f4 100644 --- a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/ActivitySkuStockZeroCustomer.java +++ b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/ActivitySkuStockZeroCustomer.java @@ -27,7 +27,7 @@ public class ActivitySkuStockZeroCustomer { @Resource private IRaffleActivitySkuStockService skuStock; - @RabbitListener(queuesToDeclare = @Queue(value = "activity_sku_stock_zero")) + @RabbitListener(queuesToDeclare = @Queue(value = "${spring.rabbitmq.topic.activity_sku_stock_zero}")) public void listener(String message) { try { log.info("监听活动sku库存消耗为0消息 topic: {} message: {}", topic, message); @@ -37,7 +37,7 @@ public class ActivitySkuStockZeroCustomer { Long sku = eventMessage.getData(); // 更新库存 skuStock.clearActivitySkuStock(sku); - // 清空队列 「此时就不需要延迟更新数据库记录了」 + // 清空队列 「此时就不需要延迟更新数据库记录了」todo 清空时,需要设定sku标识,不能全部清空。 skuStock.clearQueueValue(); } catch (Exception e) { log.error("监听活动sku库存消耗为0消息,消费失败 topic: {} message: {}", topic, message); diff --git a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/CreditAdjustSuccessCustomer.java b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/CreditAdjustSuccessCustomer.java new file mode 100644 index 0000000000000000000000000000000000000000..8df2de30d620dd1b503ed3ed75dd342888f7b62f --- /dev/null +++ b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/CreditAdjustSuccessCustomer.java @@ -0,0 +1,58 @@ +package cn.bugstack.trigger.listener; + +import cn.bugstack.domain.activity.model.entity.DeliveryOrderEntity; +import cn.bugstack.domain.activity.service.IRaffleActivityAccountQuotaService; +import cn.bugstack.domain.credit.event.CreditAdjustSuccessMessageEvent; +import cn.bugstack.types.enums.ResponseCode; +import cn.bugstack.types.event.BaseEvent; +import cn.bugstack.types.exception.AppException; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.TypeReference; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 积分调整成功消息 + * @create 2024-06-08 19:38 + */ +@Slf4j +@Component +public class CreditAdjustSuccessCustomer { + + @Value("${spring.rabbitmq.topic.credit_adjust_success}") + private String topic; + @Resource + private IRaffleActivityAccountQuotaService raffleActivityAccountQuotaService; + + @RabbitListener(queuesToDeclare = @Queue(value = "${spring.rabbitmq.topic.credit_adjust_success}")) + public void listener(String message) { + try { + log.info("监听积分账户调整成功消息,进行交易商品发货 topic: {} message: {}", topic, message); + BaseEvent.EventMessage eventMessage = JSON.parseObject(message, new TypeReference>() { + }.getType()); + CreditAdjustSuccessMessageEvent.CreditAdjustSuccessMessage creditAdjustSuccessMessage = eventMessage.getData(); + + // 积分发货 + DeliveryOrderEntity deliveryOrderEntity = new DeliveryOrderEntity(); + deliveryOrderEntity.setUserId(creditAdjustSuccessMessage.getUserId()); + deliveryOrderEntity.setOutBusinessNo(creditAdjustSuccessMessage.getOutBusinessNo()); + raffleActivityAccountQuotaService.updateOrder(deliveryOrderEntity); + } catch (AppException e) { + if (ResponseCode.INDEX_DUP.getCode().equals(e.getCode())) { + log.warn("监听积分账户调整成功消息,进行交易商品发货,消费重复 topic: {} message: {}", topic, message, e); + return; + } + throw e; + } catch (Exception e) { + log.error("监听积分账户调整成功消息,进行交易商品发货失败 topic: {} message: {}", topic, message, e); + throw e; + } + } + +} diff --git a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/RebateMessageCustomer.java b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/RebateMessageCustomer.java index 3ba11e6f1e82d4e06cffaa820c3eb7443ccd803b..82ebd82bccfdcffeaea9b80135de0f1dd4672f0f 100644 --- a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/RebateMessageCustomer.java +++ b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/RebateMessageCustomer.java @@ -1,9 +1,13 @@ package cn.bugstack.trigger.listener; import cn.bugstack.domain.activity.model.entity.SkuRechargeEntity; +import cn.bugstack.domain.activity.model.valobj.OrderTradeTypeVO; import cn.bugstack.domain.activity.service.IRaffleActivityAccountQuotaService; +import cn.bugstack.domain.credit.model.entity.TradeEntity; +import cn.bugstack.domain.credit.model.valobj.TradeNameVO; +import cn.bugstack.domain.credit.model.valobj.TradeTypeVO; +import cn.bugstack.domain.credit.service.ICreditAdjustService; import cn.bugstack.domain.rebate.event.SendRebateMessageEvent; -import cn.bugstack.domain.rebate.model.valobj.RebateTypeVO; import cn.bugstack.types.enums.ResponseCode; import cn.bugstack.types.event.BaseEvent; import cn.bugstack.types.exception.AppException; @@ -16,46 +20,60 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.Resource; - +import java.math.BigDecimal; /** - * @ClassName: RebateMessageCustomer - * @Description: 监听;行为返利消息 - * @Author: zhaoyongfeng - * @Date: 2024/12/24 20:57 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 监听;行为返利消息 + * @create 2024-05-01 13:58 */ @Slf4j @Component public class RebateMessageCustomer { + @Value("${spring.rabbitmq.topic.send_rebate}") private String topic; @Resource private IRaffleActivityAccountQuotaService raffleActivityAccountQuotaService; + @Resource + private ICreditAdjustService creditAdjustService; + @RabbitListener(queuesToDeclare = @Queue(value = "${spring.rabbitmq.topic.send_rebate}")) - public void listener(String message){ - try{ + public void listener(String message) { + try { log.info("监听用户行为返利消息 topic: {} message: {}", topic, message); // 1. 转换消息 BaseEvent.EventMessage eventMessage = JSON.parseObject(message, new TypeReference>() { }.getType()); SendRebateMessageEvent.RebateMessage rebateMessage = eventMessage.getData(); - if(!RebateTypeVO.SKU.getCode().equals(rebateMessage.getRebateType())){ - log.info("监听用户行为返利消息 - 非sku奖励暂时不处理 topic: {} message: {}", topic, message); - return ; + + // 2. 入账奖励 + switch (rebateMessage.getRebateType()) { + case "sku": + SkuRechargeEntity skuRechargeEntity = new SkuRechargeEntity(); + skuRechargeEntity.setUserId(rebateMessage.getUserId()); + skuRechargeEntity.setSku(Long.valueOf(rebateMessage.getRebateConfig())); + skuRechargeEntity.setOutBusinessNo(rebateMessage.getBizId()); + skuRechargeEntity.setOrderTradeType(OrderTradeTypeVO.rebate_no_pay_trade); + raffleActivityAccountQuotaService.createOrder(skuRechargeEntity); + break; + case "integral": + TradeEntity tradeEntity = new TradeEntity(); + tradeEntity.setUserId(rebateMessage.getUserId()); + tradeEntity.setTradeName(TradeNameVO.REBATE); + tradeEntity.setTradeType(TradeTypeVO.FORWARD); + tradeEntity.setAmount(new BigDecimal(rebateMessage.getRebateConfig())); + tradeEntity.setOutBusinessNo(rebateMessage.getBizId()); + creditAdjustService.createOrder(tradeEntity); + break; } - // 2.入账奖励 - SkuRechargeEntity skuRechargeEntity = new SkuRechargeEntity(); - skuRechargeEntity.setUserId(rebateMessage.getUserId()); - skuRechargeEntity.setSku(Long.valueOf(rebateMessage.getRebateConfig())); - skuRechargeEntity.setOutBusinessNo(rebateMessage.getBizId()); - raffleActivityAccountQuotaService.createOrder(skuRechargeEntity); - }catch (AppException e){ + } catch (AppException e) { if (ResponseCode.INDEX_DUP.getCode().equals(e.getCode())) { log.warn("监听用户行为返利消息,消费重复 topic: {} message: {}", topic, message, e); return; } throw e; - }catch (Exception e){ + } catch (Exception e) { log.error("监听用户行为返利消息,消费失败 topic: {} message: {}", topic, message, e); throw e; } diff --git a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/SendAwardCustomer.java b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/SendAwardCustomer.java index 9bcf2ddd517efbf676338ab29f38f241c2c044ae..619231efb65ac6937377f3029abf409d54bec734 100644 --- a/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/SendAwardCustomer.java +++ b/bigmarket-trigger/src/main/java/cn/bugstack/trigger/listener/SendAwardCustomer.java @@ -15,10 +15,9 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; /** - * @ClassName: SendAwardCustomer - * @Description: 用户奖品记录消息消费者 - * @Author: zhaoyongfeng - * @Date: 2024/12/10 16:47 + * @author Fuzhengwei bugstack.cn @小傅哥 + * @description 用户奖品记录消息消费者 + * @create 2024-04-06 12:09 */ @Slf4j @Component @@ -26,12 +25,14 @@ public class SendAwardCustomer { @Value("${spring.rabbitmq.topic.send_award}") private String topic; + @Resource private IAwardService awardService; + @RabbitListener(queuesToDeclare = @Queue(value = "${spring.rabbitmq.topic.send_award}")) public void listener(String message) { try { - log.info("监听用户奖品发送消息 topic: {} message: {}", topic, message); + log.info("监听用户奖品发送消息,发奖开始 topic: {} message: {}", topic, message); BaseEvent.EventMessage eventMessage = JSON.parseObject(message, new TypeReference>() { }.getType()); SendAwardMessageEvent.SendAwardMessage sendAwardMessage = eventMessage.getData(); @@ -43,10 +44,12 @@ public class SendAwardCustomer { distributeAwardEntity.setAwardId(sendAwardMessage.getAwardId()); distributeAwardEntity.setAwardConfig(sendAwardMessage.getAwardConfig()); awardService.distributeAward(distributeAwardEntity); + + log.info("监听用户奖品发送消息,发奖完成 topic: {} message: {}", topic, message); } catch (Exception e) { log.error("监听用户奖品发送消息,消费失败 topic: {} message: {}", topic, message); - throw e; +// throw e; } } -} \ No newline at end of file +} diff --git a/bigmarket-types/src/main/java/cn/bugstack/types/annotations/DCCValue.java b/bigmarket-types/src/main/java/cn/bugstack/types/annotations/DCCValue.java new file mode 100644 index 0000000000000000000000000000000000000000..55bb2f07d0c2be36fe4015e5d7713b3e30051930 --- /dev/null +++ b/bigmarket-types/src/main/java/cn/bugstack/types/annotations/DCCValue.java @@ -0,0 +1,13 @@ +package cn.bugstack.types.annotations; + +import java.lang.annotation.*; + +/** + * 注解,动态配置中心 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +@Documented +public @interface DCCValue { + String value() default ""; +} diff --git a/bigmarket-types/src/main/java/cn/bugstack/types/common/Constants.java b/bigmarket-types/src/main/java/cn/bugstack/types/common/Constants.java index 91d153bb8246c1cb151ba6e656f5d4c168cc351b..06ab2d6ce42dfc2b8f51644c0e2360706464f9e0 100644 --- a/bigmarket-types/src/main/java/cn/bugstack/types/common/Constants.java +++ b/bigmarket-types/src/main/java/cn/bugstack/types/common/Constants.java @@ -26,6 +26,9 @@ public class Constants { public static String ACTIVITY_SKU_COUNT_QUERY_KEY = "activity_sku_count_query_key"; public static String ACTIVITY_SKU_STOCK_COUNT_KEY = "activity_sku_stock_count_key_"; public static String ACTIVITY_SKU_COUNT_CLEAR_KEY = "activity_sku_count_clear_key_"; + public static String ACTIVITY_ACCOUNT_LOCK = "activity_account_lock_"; + public static String ACTIVITY_ACCOUNT_UPDATE_LOCK = "activity_account_update_lock_"; + public static String USER_CREDIT_ACCOUNT_LOCK = "user_credit_account_lock_"; } diff --git a/bigmarket-types/src/main/java/cn/bugstack/types/enums/ResponseCode.java b/bigmarket-types/src/main/java/cn/bugstack/types/enums/ResponseCode.java index 694555aae5d6a0f26a41c5ea0ec94c8a2a7d3715..591553c92d5a54c448e0249e054141c05fe645be 100644 --- a/bigmarket-types/src/main/java/cn/bugstack/types/enums/ResponseCode.java +++ b/bigmarket-types/src/main/java/cn/bugstack/types/enums/ResponseCode.java @@ -9,26 +9,25 @@ import lombok.NoArgsConstructor; @Getter public enum ResponseCode { - SUCCESS("0000", "调用成功"), UN_ERROR("0001", "调用失败"), ILLEGAL_PARAMETER("0002", "非法参数"), INDEX_DUP("0003", "唯一索引冲突"), + DEGRADE_SWITCH("0004", "活动已降级"), STRATEGY_RULE_WEIGHT_IS_NULL("ERR_BIZ_001", "业务异常,策略规则中 rule_weight 权重规则已适用但未配置"), UN_ASSEMBLED_STRATEGY_ARMORY("ERR_BIZ_002", "抽奖策略配置未装配,请通过IStrategyArmory完成装配"), ACTIVITY_STATE_ERROR("ERR_BIZ_003", "活动未开启(非open状态)"), ACTIVITY_DATE_ERROR("ERR_BIZ_004", "非活动日期范围"), ACTIVITY_SKU_STOCK_ERROR("ERR_BIZ_005", "活动库存不足"), - ACCOUNT_QUOTA_ERROR("ERR_BIZ_006","账户总额度不足"), - ACCOUNT_MONTH_QUOTA_ERROR("ERR_BIZ_007","账户月额度不足"), - ACCOUNT_DAY_QUOTA_ERROR("ERR_BIZ_008","账户日额度不足"), + ACCOUNT_QUOTA_ERROR("ERR_BIZ_006", "账户总额度不足"), + ACCOUNT_MONTH_QUOTA_ERROR("ERR_BIZ_007", "账户月额度不足"), + ACCOUNT_DAY_QUOTA_ERROR("ERR_BIZ_008", "账户日额度不足"), ACTIVITY_ORDER_ERROR("ERR_BIZ_009", "用户抽奖单已使用过,不可重复抽奖"), + AWARD_CONFIG_ERROR("ERR_CONFIG_001", "award_config 配置不是一个范围值,如 1,100"), + USER_CREDIT_ACCOUNT_NO_AVAILABLE_AMOUNT("ERR_CREDIT_001", "用户积分账户额度不足"), ; - private String code; private String info; - - } diff --git a/docs/dev-ops/docker-compose-environment.yml b/docs/dev-ops/docker-compose-environment.yml index aaaee0a301c210d431f11da7fef0cc6f02f73b87..a3fd348e44e943937f4f6058fce8e3da2f9a2be2 100644 --- a/docs/dev-ops/docker-compose-environment.yml +++ b/docs/dev-ops/docker-compose-environment.yml @@ -1,6 +1,33 @@ # 命令执行 docker-compose -f docker-compose-environment.yml up -d version: '3.9' services: + # 注册中心 https://github.com/nacos-group/nacos-docker - 其他配置可参考(集群) + # http://127.0.0.1:8848/nacos 【账号:nacos 密码:nacos】 + nacos: + image: nacos/nacos-server:v2.2.3-slim + container_name: nacos + restart: always + ports: + - "8848:8848" + - "9848:9848" + environment: + - PREFER_HOST_MODE=hostname + - MODE=standalone + - SPRING_DATASOURCE_PLATFORM=mysql + - MYSQL_SERVICE_HOST=mysql + - MYSQL_SERVICE_DB_NAME=nacos_config + - MYSQL_SERVICE_PORT=3306 + - MYSQL_SERVICE_USER=root + - MYSQL_SERVICE_PASSWORD=123456 + - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true + - NACOS_AUTH_IDENTITY_KEY=2222 + - NACOS_AUTH_IDENTITY_VALUE=2xxx + - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789 + networks: + - my-network + depends_on: + mysql: + condition: service_healthy mysql: image: mysql:8.0.32 container_name: mysql @@ -9,10 +36,6 @@ services: environment: TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: 123456 - networks: - - my-network - depends_on: - - mysql-job-dbdata ports: - "13306:3306" volumes: @@ -23,17 +46,10 @@ services: timeout: 10s retries: 10 start_period: 15s - volumes_from: - - mysql-job-dbdata - - # 自动加载数据 - mysql-job-dbdata: - image: alpine:3.18.2 - container_name: mysql-job-dbdata - volumes: - - /var/lib/mysql + networks: + - my-network - # phpmyadmin https://hub.docker.com/_/phpmyadmin + # phpmyadmin https://hub.docker.com/_/phpmyadmin phpmyadmin: image: phpmyadmin:5.2.1 container_name: phpmyadmin @@ -50,6 +66,7 @@ services: networks: - my-network + # Redis redis: image: redis:6.2 @@ -106,6 +123,19 @@ services: command: rabbitmq-server volumes: - ./rabbitmq/enabled_plugins:/etc/rabbitmq/enabled_plugins + + zookeeper: + image: zookeeper:3.9.0 + container_name: zookeeper + restart: always + hostname: zoo1 + ports: + - 2181:2181 + environment: + ZOO_MY_ID: 1 + ZOO_SERVERS: server.1=zookeeper:2888:3888;2181 + networks: + - my-network networks: my-network: driver: bridge diff --git a/docs/dev-ops/docker-compose.yml b/docs/dev-ops/docker-compose.yml deleted file mode 100644 index 7bcafd07999da086334c81ee1e0654e25b7c5612..0000000000000000000000000000000000000000 --- a/docs/dev-ops/docker-compose.yml +++ /dev/null @@ -1,98 +0,0 @@ -# 命令执行 docker-compose -f docker-compose.yml up -d -version: '3.9' -services: - mysql: - image: mysql:8.0.32 - container_name: mysql - hostname: mysql - command: --default-authentication-plugin=mysql_native_password - restart: always - environment: - TZ: Asia/Shanghai - MYSQL_ROOT_PASSWORD: 123456 - MYSQL_USER: xfg - MYSQL_PASSWORD: 123456 - networks: - - my-network - depends_on: - - mysql-job-dbdata - ports: - - "13306:3306" - volumes: - - ./mysql/sql:/docker-entrypoint-initdb.d - healthcheck: - test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ] - interval: 5s - timeout: 10s - retries: 10 - start_period: 15s - deploy: - resources: - limits: - cpus: '1.00' - memory: 512M - volumes_from: - - mysql-job-dbdata - - # 自动加载数据 - mysql-job-dbdata: - image: alpine:3.18.2 - container_name: mysql-job-dbdata - volumes: - - /var/lib/mysql - - # phpmyadmin https://hub.docker.com/_/phpmyadmin - phpmyadmin: - image: phpmyadmin:5.2.1 - container_name: phpmyadmin - hostname: phpmyadmin - ports: - - 8899:80 - environment: - - PMA_HOST=mysql - - PMA_PORT=3306 - - MYSQL_ROOT_PASSWORD=123456 - networks: - - my-network - - # RedisAdmin https://github.com/joeferner/redis-commander - redis-admin: - image: spryker/redis-commander:0.8.0 - container_name: redis-admin - hostname: redis-commander - restart: always - ports: - - 8081:8081 - environment: - - REDIS_HOSTS=local:redis:6379 -# - REDIS_HOSTS=local:admin:admin@redis:6379 # redis 配置 users.acl 账密则启动此配置,注释掉上一个配置【不使用密码的方式】。 - - HTTP_USER=admin - - HTTP_PASSWORD=admin - networks: - - my-network - depends_on: - redis: - condition: service_healthy - - # 配置密码的情况下,volumes 添加 ./redis/users.acl:/usr/local/etc/redis/users.acl redis.conf 需要补充 aclfile /usr/local/etc/redis/users.acl - redis: - image: redis:7.2.0 - container_name: redis - restart: always - hostname: redis - ports: - - 6379:6379 - volumes: - - ./redis/redis.conf:/usr/local/etc/redis/redis.conf - command: redis-server /usr/local/etc/redis/redis.conf - networks: - - my-network - healthcheck: - test: [ "CMD", "redis-cli", "ping" ] - interval: 10s - timeout: 5s - retries: 3 - -networks: - my-network: - driver: bridge diff --git a/docs/dev-ops/log/log-info-2024-12-13.0.log b/docs/dev-ops/log/log-info-2024-12-13.0.log deleted file mode 100644 index 79d6ac8578a3138433368d77c12cee806acc06a2..0000000000000000000000000000000000000000 --- a/docs/dev-ops/log/log-info-2024-12-13.0.log +++ /dev/null @@ -1,88 +0,0 @@ -24-12-13.15:06:04.680 [main ] INFO Application - Starting Application v1.0-SNAPSHOT using Java 1.8.0_342 on 9b0494bbcd7f with PID 7 (/big-market-app.jar started by root in /) -24-12-13.15:06:04.686 [main ] INFO Application - The following 1 profile is active: "dev" -24-12-13.15:06:05.854 [main ] INFO RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode -24-12-13.15:06:05.858 [main ] INFO RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode. -24-12-13.15:06:05.892 [main ] INFO RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 14 ms. Found 0 Redis repository interfaces. -24-12-13.15:06:07.032 [main ] INFO TomcatWebServer - Tomcat initialized with port(s): 8091 (http) -24-12-13.15:06:07.043 [main ] INFO Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8091"] -24-12-13.15:06:07.045 [main ] INFO StandardService - Starting service [Tomcat] -24-12-13.15:06:07.045 [main ] INFO StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.75] -24-12-13.15:06:07.148 [main ] INFO [/] - Initializing Spring embedded WebApplicationContext -24-12-13.15:06:07.148 [main ] INFO ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2362 ms -24-12-13.15:06:08.070 [main ] INFO Version - Redisson 3.23.4 -24-12-13.15:06:08.537 [redisson-netty-2-6] INFO MasterPubSubConnectionPool - 1 connections initialized for redis/172.19.0.2:6379 -24-12-13.15:06:08.661 [redisson-netty-2-14] INFO MasterConnectionPool - 5 connections initialized for redis/172.19.0.2:6379 -24-12-13.15:06:09.740 [main ] INFO EndpointLinksResolver - Exposing 1 endpoint(s) beneath base path '/actuator' -24-12-13.15:06:09.767 [main ] INFO Http11NioProtocol - Starting ProtocolHandler ["http-nio-8091"] -24-12-13.15:06:09.791 [main ] INFO TomcatWebServer - Tomcat started on port(s): 8091 (http) with context path '' -24-12-13.15:06:09.810 [main ] INFO Application - Started Application in 6.24 seconds (JVM running for 7.617) -24-12-13.15:06:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:06:10.083 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存 strategyId:100006 awardId:105 -24-12-13.15:06:10.102 [scheduling-1 ] INFO HikariDataSource - HikariPool-1 - Starting... -24-12-13.15:06:10.538 [scheduling-1 ] INFO HikariDataSource - HikariPool-1 - Start completed. -24-12-13.15:06:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:06:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:06:25.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:06:29.998 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:06:35.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:06:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:06:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:06:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:06:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:06:59.998 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:07:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:07:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:07:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:07:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:07:25.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:07:29.998 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:07:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:07:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:07:45.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:07:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:07:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:07:59.998 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:08:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:08:10.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:08:15.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:08:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:08:25.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:08:29.999 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:08:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:08:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:08:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:08:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:08:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:08:59.998 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:09:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:09:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:09:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:09:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:09:25.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:09:29.998 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:09:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:09:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:09:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:09:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:09:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:09:59.999 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:10:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:10:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:10:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:10:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:10:25.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:10:29.998 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:10:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:10:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:10:45.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:10:50.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:10:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:10:59.999 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:11:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:11:10.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:11:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:11:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:11:25.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:11:29.999 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:11:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-13.15:11:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 diff --git a/docs/dev-ops/log/log-info-2024-12-14.0.log b/docs/dev-ops/log/log-info-2024-12-14.0.log deleted file mode 100644 index 99224274e8bc2d2aea33228bccf29ed94144558d..0000000000000000000000000000000000000000 --- a/docs/dev-ops/log/log-info-2024-12-14.0.log +++ /dev/null @@ -1,33 +0,0 @@ -24-12-14.21:21:06.360 [main ] INFO Application - Starting Application v1.0-SNAPSHOT using Java 1.8.0_342 on 9b0494bbcd7f with PID 7 (/big-market-app.jar started by root in /) -24-12-14.21:21:06.364 [main ] INFO Application - The following 1 profile is active: "dev" -24-12-14.21:21:07.517 [main ] INFO RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode -24-12-14.21:21:07.521 [main ] INFO RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode. -24-12-14.21:21:07.553 [main ] INFO RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 13 ms. Found 0 Redis repository interfaces. -24-12-14.21:21:08.578 [main ] INFO TomcatWebServer - Tomcat initialized with port(s): 8091 (http) -24-12-14.21:21:08.589 [main ] INFO Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8091"] -24-12-14.21:21:08.590 [main ] INFO StandardService - Starting service [Tomcat] -24-12-14.21:21:08.590 [main ] INFO StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.75] -24-12-14.21:21:08.674 [main ] INFO [/] - Initializing Spring embedded WebApplicationContext -24-12-14.21:21:08.674 [main ] INFO ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2222 ms -24-12-14.21:21:09.452 [main ] INFO Version - Redisson 3.23.4 -24-12-14.21:21:09.920 [redisson-netty-2-5] INFO MasterPubSubConnectionPool - 1 connections initialized for redis/172.19.0.2:6379 -24-12-14.21:21:10.027 [redisson-netty-2-14] INFO MasterConnectionPool - 5 connections initialized for redis/172.19.0.2:6379 -24-12-14.21:21:11.005 [main ] INFO EndpointLinksResolver - Exposing 1 endpoint(s) beneath base path '/actuator' -24-12-14.21:21:11.030 [main ] INFO Http11NioProtocol - Starting ProtocolHandler ["http-nio-8091"] -24-12-14.21:21:11.056 [main ] INFO TomcatWebServer - Tomcat started on port(s): 8091 (http) with context path '' -24-12-14.21:21:11.080 [main ] INFO Application - Started Application in 5.675 seconds (JVM running for 6.971) -24-12-14.21:21:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:21:20.002 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:21:25.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:21:29.999 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:21:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:21:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:21:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:21:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:21:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:22:00.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:22:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:22:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:22:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:22:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-14.21:22:25.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 diff --git a/docs/dev-ops/log/log-info-2024-12-23.0.log b/docs/dev-ops/log/log-info-2024-12-23.0.log deleted file mode 100644 index af7c841c255a478dd616bf24bc7dc74b6bffc966..0000000000000000000000000000000000000000 --- a/docs/dev-ops/log/log-info-2024-12-23.0.log +++ /dev/null @@ -1,62 +0,0 @@ -24-12-23.21:35:25.368 [main ] INFO Application - Starting Application v1.0-SNAPSHOT using Java 1.8.0_342 on 9b0494bbcd7f with PID 7 (/big-market-app.jar started by root in /) -24-12-23.21:35:25.373 [main ] INFO Application - The following 1 profile is active: "dev" -24-12-23.21:35:27.194 [main ] INFO RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode -24-12-23.21:35:27.204 [main ] INFO RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode. -24-12-23.21:35:27.258 [main ] INFO RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 20 ms. Found 0 Redis repository interfaces. -24-12-23.21:35:29.565 [main ] INFO TomcatWebServer - Tomcat initialized with port(s): 8091 (http) -24-12-23.21:35:29.600 [main ] INFO Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8091"] -24-12-23.21:35:29.602 [main ] INFO StandardService - Starting service [Tomcat] -24-12-23.21:35:29.602 [main ] INFO StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.75] -24-12-23.21:35:29.813 [main ] INFO [/] - Initializing Spring embedded WebApplicationContext -24-12-23.21:35:29.813 [main ] INFO ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 4323 ms -24-12-23.21:35:31.395 [main ] INFO Version - Redisson 3.23.4 -24-12-23.21:35:32.080 [redisson-netty-2-6] INFO MasterPubSubConnectionPool - 1 connections initialized for redis/172.19.0.4:6379 -24-12-23.21:35:32.201 [redisson-netty-2-14] INFO MasterConnectionPool - 5 connections initialized for redis/172.19.0.4:6379 -24-12-23.21:35:33.873 [main ] INFO EndpointLinksResolver - Exposing 1 endpoint(s) beneath base path '/actuator' -24-12-23.21:35:34.115 [main ] INFO Http11NioProtocol - Starting ProtocolHandler ["http-nio-8091"] -24-12-23.21:35:34.153 [main ] INFO TomcatWebServer - Tomcat started on port(s): 8091 (http) with context path '' -24-12-23.21:35:34.195 [main ] INFO Application - Started Application in 9.906 seconds (JVM running for 11.546) -24-12-23.21:35:35.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:35:40.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:35:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:35:49.994 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:35:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:36:00.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:36:05.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:36:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:36:15.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:36:05.557 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:36:25.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:36:30.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:36:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:36:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:36:45.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:36:50.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:36:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:37:00.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:37:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:37:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:37:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:37:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:37:25.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:37:30.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:37:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:37:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:37:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:37:50.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:37:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:38:00.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:38:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:38:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:38:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:38:20.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:38:25.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:38:30.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:38:34.999 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:38:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:38:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:38:50.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:38:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:39:00.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:39:04.999 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-23.21:39:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 diff --git a/docs/dev-ops/log/log_info.log b/docs/dev-ops/log/log_info.log index 2dce956e02c1c7435ccdd9c179397d61f7508798..3fe066b7f17b3070fbf9ca513f243c45e43f7f51 100644 --- a/docs/dev-ops/log/log_info.log +++ b/docs/dev-ops/log/log_info.log @@ -1,40 +1,25 @@ -24-12-27.12:03:18.772 [main ] INFO Application - Starting Application v1.0-SNAPSHOT using Java 1.8.0_342 on 9b0494bbcd7f with PID 7 (/big-market-app.jar started by root in /) -24-12-27.12:03:18.776 [main ] INFO Application - The following 1 profile is active: "dev" -24-12-27.12:03:22.430 [main ] INFO RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode -24-12-27.12:03:22.444 [main ] INFO RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode. -24-12-27.12:03:22.580 [main ] INFO RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 41 ms. Found 0 Redis repository interfaces. -24-12-27.12:03:25.800 [main ] INFO TomcatWebServer - Tomcat initialized with port(s): 8091 (http) -24-12-27.12:03:25.836 [main ] INFO Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8091"] -24-12-27.12:03:25.838 [main ] INFO StandardService - Starting service [Tomcat] -24-12-27.12:03:25.839 [main ] INFO StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.75] -24-12-27.12:03:26.127 [main ] INFO [/] - Initializing Spring embedded WebApplicationContext -24-12-27.12:03:26.128 [main ] INFO ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 7149 ms -24-12-27.12:03:27.790 [main ] INFO Version - Redisson 3.23.4 -24-12-27.12:03:28.556 [redisson-netty-2-6] INFO MasterPubSubConnectionPool - 1 connections initialized for redis/172.19.0.3:6379 -24-12-27.12:03:28.681 [redisson-netty-2-14] INFO MasterConnectionPool - 5 connections initialized for redis/172.19.0.3:6379 -24-12-27.12:03:30.368 [main ] INFO EndpointLinksResolver - Exposing 1 endpoint(s) beneath base path '/actuator' -24-12-27.12:03:30.401 [main ] INFO Http11NioProtocol - Starting ProtocolHandler ["http-nio-8091"] -24-12-27.12:03:30.426 [main ] INFO TomcatWebServer - Tomcat started on port(s): 8091 (http) with context path '' -24-12-27.12:03:30.450 [main ] INFO Application - Started Application in 14.265 seconds (JVM running for 16.245) -24-12-27.12:03:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-27.12:03:39.995 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-27.12:03:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 -24-12-27.19:33:41.509 [main ] INFO Application - Starting Application v1.0-SNAPSHOT using Java 1.8.0_342 on 9b0494bbcd7f with PID 7 (/big-market-app.jar started by root in /) -24-12-27.19:33:41.513 [main ] INFO Application - The following 1 profile is active: "dev" -24-12-27.19:33:43.129 [main ] INFO RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode -24-12-27.19:33:43.135 [main ] INFO RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode. -24-12-27.19:33:43.189 [main ] INFO RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 25 ms. Found 0 Redis repository interfaces. -24-12-27.19:33:44.740 [main ] INFO TomcatWebServer - Tomcat initialized with port(s): 8091 (http) -24-12-27.19:33:44.758 [main ] INFO Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8091"] -24-12-27.19:33:44.760 [main ] INFO StandardService - Starting service [Tomcat] -24-12-27.19:33:44.760 [main ] INFO StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.75] -24-12-27.19:33:44.882 [main ] INFO [/] - Initializing Spring embedded WebApplicationContext -24-12-27.19:33:44.882 [main ] INFO ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 3282 ms -24-12-27.19:33:45.952 [main ] INFO Version - Redisson 3.23.4 -24-12-27.19:33:46.751 [redisson-netty-2-6] INFO MasterPubSubConnectionPool - 1 connections initialized for redis/172.19.0.3:6379 -24-12-27.19:33:46.859 [redisson-netty-2-14] INFO MasterConnectionPool - 5 connections initialized for redis/172.19.0.3:6379 -24-12-27.19:33:48.478 [main ] INFO EndpointLinksResolver - Exposing 1 endpoint(s) beneath base path '/actuator' -24-12-27.19:33:48.525 [main ] INFO Http11NioProtocol - Starting ProtocolHandler ["http-nio-8091"] -24-12-27.19:33:48.706 [main ] INFO TomcatWebServer - Tomcat started on port(s): 8091 (http) with context path '' -24-12-27.19:33:48.753 [main ] INFO Application - Started Application in 8.214 seconds (JVM running for 9.024) -24-12-27.19:33:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 +25-01-17.14:35:43.459 [main ] INFO Application - Starting Application v1.0-SNAPSHOT using Java 1.8.0_342 on 9b0494bbcd7f with PID 7 (/big-market-app.jar started by root in /) +25-01-17.14:35:43.463 [main ] INFO Application - The following 1 profile is active: "dev" +25-01-17.14:35:44.817 [main ] INFO RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode +25-01-17.14:35:44.821 [main ] INFO RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode. +25-01-17.14:35:44.858 [main ] INFO RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 15 ms. Found 0 Redis repository interfaces. +25-01-17.14:35:46.050 [main ] INFO TomcatWebServer - Tomcat initialized with port(s): 8091 (http) +25-01-17.14:35:46.061 [main ] INFO Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8091"] +25-01-17.14:35:46.063 [main ] INFO StandardService - Starting service [Tomcat] +25-01-17.14:35:46.063 [main ] INFO StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.75] +25-01-17.14:35:46.186 [main ] INFO [/] - Initializing Spring embedded WebApplicationContext +25-01-17.14:35:46.186 [main ] INFO ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2581 ms +25-01-17.14:35:47.059 [main ] INFO Version - Redisson 3.23.4 +25-01-17.14:35:47.706 [redisson-netty-2-5] INFO MasterPubSubConnectionPool - 1 connections initialized for redis/172.19.0.3:6379 +25-01-17.14:35:47.786 [redisson-netty-2-14] INFO MasterConnectionPool - 5 connections initialized for redis/172.19.0.3:6379 +25-01-17.14:35:48.762 [main ] INFO EndpointLinksResolver - Exposing 1 endpoint(s) beneath base path '/actuator' +25-01-17.14:35:48.929 [main ] INFO Http11NioProtocol - Starting ProtocolHandler ["http-nio-8091"] +25-01-17.14:35:48.949 [main ] INFO TomcatWebServer - Tomcat started on port(s): 8091 (http) with context path '' +25-01-17.14:35:48.967 [main ] INFO Application - Started Application in 6.581 seconds (JVM running for 7.857) +25-01-17.14:35:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 +25-01-17.14:35:55.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 +25-01-17.14:36:00.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 +25-01-17.14:36:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 +25-01-17.14:36:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 +25-01-17.14:36:15.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 +25-01-17.14:36:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 diff --git a/docs/dev-ops/mysql/docker-compose.yml b/docs/dev-ops/mysql/docker-compose.yml deleted file mode 100644 index f7930e8d2714b7052365255ee7d90a89f44bab0e..0000000000000000000000000000000000000000 --- a/docs/dev-ops/mysql/docker-compose.yml +++ /dev/null @@ -1,29 +0,0 @@ -# 命令执行 docker-compose up -d -version: '3.9' -services: - mysql: - image: mysql:8.0.32 - container_name: mysql - command: --default-authentication-plugin=mysql_native_password - restart: always - environment: - TZ: Asia/Shanghai - # MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' # 可配置无密码,注意配置 SPRING_DATASOURCE_PASSWORD= - MYSQL_ROOT_PASSWORD: 123456 - MYSQL_USER: xfg - MYSQL_PASSWORD: 123456 - depends_on: - - mysql-job-dbdata - ports: - - "3306:3306" - volumes: - - ./sql:/docker-entrypoint-initdb.d - volumes_from: - - mysql-job-dbdata - - # 自动加载数据 - mysql-job-dbdata: - image: alpine:3.18.2 - container_name: mysql-job-dbdata - volumes: - - /var/lib/mysql \ No newline at end of file diff --git a/docs/dev-ops/mysql/sql/big_market.sql b/docs/dev-ops/mysql/sql/big_market.sql index 6fa600ae69da821c4e978aa26420d16d6c03ad5a..42bf836a8ed5d0718c311fee1afe47c6a28d917c 100644 --- a/docs/dev-ops/mysql/sql/big_market.sql +++ b/docs/dev-ops/mysql/sql/big_market.sql @@ -7,7 +7,7 @@ # # 主机: 127.0.0.1 (MySQL 5.6.39) # 数据库: big_market -# 生成时间: 2024-05-25 02:56:19 +0000 +# 生成时间: 2024-06-22 04:19:57 +0000 # ************************************************************ @@ -82,7 +82,7 @@ LOCK TABLES `daily_behavior_rebate` WRITE; INSERT INTO `daily_behavior_rebate` (`id`, `behavior_type`, `rebate_desc`, `rebate_type`, `rebate_config`, `state`, `create_time`, `update_time`) VALUES - (1,'sign','签到返利-sku额度','sku','9011','open','2024-04-30 09:32:46','2024-04-30 18:05:23'), + (1,'sign','签到返利-sku额度','sku','9014','open','2024-04-30 09:32:46','2024-06-22 09:52:39'), (2,'sign','签到返利-积分','integral','10','open','2024-04-30 09:32:46','2024-04-30 18:05:27'); /*!40000 ALTER TABLE `daily_behavior_rebate` ENABLE KEYS */; @@ -145,7 +145,10 @@ LOCK TABLES `raffle_activity_count` WRITE; INSERT INTO `raffle_activity_count` (`id`, `activity_count_id`, `total_count`, `day_count`, `month_count`, `create_time`, `update_time`) VALUES - (1,11101,100,100,100,'2024-03-09 10:15:42','2024-05-04 13:06:45'); + (1,11101,150,150,150,'2024-03-09 10:15:42','2024-06-22 08:52:19'), + (2,11102,50,50,50,'2024-06-22 08:48:34','2024-06-22 08:49:42'), + (3,11103,5,5,5,'2024-06-22 08:48:34','2024-06-22 08:52:23'), + (4,11104,1,1,1,'2024-06-22 08:48:34','2024-06-22 08:52:23'); /*!40000 ALTER TABLE `raffle_activity_count` ENABLE KEYS */; UNLOCK TABLES; @@ -163,6 +166,7 @@ CREATE TABLE `raffle_activity_sku` ( `activity_count_id` bigint(12) NOT NULL COMMENT '活动个人参与次数ID', `stock_count` int(11) NOT NULL COMMENT '商品库存', `stock_count_surplus` int(11) NOT NULL COMMENT '剩余库存', + `product_amount` decimal(10,2) NOT NULL COMMENT '商品金额【积分】', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), @@ -173,9 +177,12 @@ CREATE TABLE `raffle_activity_sku` ( LOCK TABLES `raffle_activity_sku` WRITE; /*!40000 ALTER TABLE `raffle_activity_sku` DISABLE KEYS */; -INSERT INTO `raffle_activity_sku` (`id`, `sku`, `activity_id`, `activity_count_id`, `stock_count`, `stock_count_surplus`, `create_time`, `update_time`) +INSERT INTO `raffle_activity_sku` (`id`, `sku`, `activity_id`, `activity_count_id`, `stock_count`, `stock_count_surplus`, `product_amount`, `create_time`, `update_time`) VALUES - (1,9011,100301,11101,100000,99909,'2024-03-16 11:41:09','2024-05-25 10:53:20'); + (1,9011,100301,11101,100000,99887,200.00,'2024-03-16 11:41:09','2024-06-22 08:49:32'), + (2,9012,100301,11102,100000,99885,100.00,'2024-03-16 11:41:09','2024-06-22 11:46:15'), + (3,9013,100301,11103,100000,99884,20.00,'2024-03-16 11:41:09','2024-06-22 11:45:55'), + (4,9014,100301,11104,100000,99866,5.00,'2024-03-16 11:41:09','2024-06-22 11:45:50'); /*!40000 ALTER TABLE `raffle_activity_sku` ENABLE KEYS */; UNLOCK TABLES; @@ -366,14 +373,14 @@ VALUES (19,100005,103,'随机积分',NULL,80000,80000,0.0300,'tree_luck_award',1,'2023-12-09 09:38:31','2024-02-15 07:42:50'), (20,100005,104,'随机积分',NULL,80000,80000,0.0300,'tree_luck_award',1,'2023-12-09 09:38:31','2024-02-15 07:42:51'), (21,100005,105,'随机积分',NULL,80000,80000,0.0010,'tree_luck_award',1,'2023-12-09 09:38:31','2024-02-15 07:42:52'), - (22,100006,101,'随机积分',NULL,100,57,0.0200,'tree_luck_award',1,'2023-12-09 09:38:31','2024-05-04 15:37:00'), - (23,100006,102,'OpenAI会员卡',NULL,100,17,0.0300,'tree_luck_award',2,'2023-12-09 09:38:31','2024-05-04 13:00:15'), - (24,100006,103,'支付优惠券',NULL,100,40,0.0300,'tree_luck_award',3,'2023-12-09 09:38:31','2024-05-04 15:36:15'), - (25,100006,104,'小米台灯',NULL,100,31,0.0300,'tree_luck_award',4,'2023-12-09 09:38:31','2024-05-04 15:36:45'), - (26,100006,105,'小米su7周体验','抽奖3次后解锁',100,38,0.0300,'tree_lock_3',5,'2023-12-09 09:38:31','2024-04-27 13:08:16'), - (27,100006,106,'轻奢办公椅','抽奖2次后解锁',100,23,0.0300,'tree_lock_2',6,'2023-12-09 09:38:31','2024-05-04 15:31:45'), - (28,100006,107,'小霸王游戏机','抽奖1次后解锁',100,22,0.0300,'tree_lock_1',7,'2023-12-09 09:38:31','2024-05-04 15:31:55'), - (29,100006,108,'暴走玩偶',NULL,100,27,0.0300,'tree_luck_award',8,'2023-12-09 09:38:31','2024-05-04 15:37:05'); + (22,100006,101,'随机积分',NULL,10000,9982,0.7900,'tree_luck_award',1,'2023-12-09 09:38:31','2024-06-22 11:53:30'), + (23,100006,102,'OpenAI会员卡',NULL,100,15,0.0300,'tree_luck_award',2,'2023-12-09 09:38:31','2024-06-22 09:59:55'), + (24,100006,103,'支付优惠券',NULL,100,38,0.0300,'tree_luck_award',3,'2023-12-09 09:38:31','2024-06-22 10:00:00'), + (25,100006,104,'小米台灯',NULL,100,28,0.0300,'tree_luck_award',4,'2023-12-09 09:38:31','2024-06-22 10:00:05'), + (26,100006,105,'小米su7周体验','抽奖3次后解锁',100,37,0.0300,'tree_lock_3',5,'2023-12-09 09:38:31','2024-06-22 09:59:45'), + (27,100006,106,'轻奢办公椅','抽奖2次后解锁',100,22,0.0300,'tree_lock_2',6,'2023-12-09 09:38:31','2024-06-22 10:00:25'), + (28,100006,107,'小霸王游戏机','抽奖1次后解锁',100,21,0.0300,'tree_lock_1',7,'2023-12-09 09:38:31','2024-06-22 10:00:10'), + (29,100006,108,'暴走玩偶',NULL,100,25,0.0300,'tree_luck_award',8,'2023-12-09 09:38:31','2024-06-22 10:00:20'); /*!40000 ALTER TABLE `strategy_award` ENABLE KEYS */; UNLOCK TABLES; diff --git a/docs/dev-ops/mysql/sql/big_market_01.sql b/docs/dev-ops/mysql/sql/big_market_01.sql index 445261f97bd44ba6f897a65e8ac4864f5a784700..dd9ee7a76567abc587532325e67a667d4e7e606c 100644 --- a/docs/dev-ops/mysql/sql/big_market_01.sql +++ b/docs/dev-ops/mysql/sql/big_market_01.sql @@ -7,7 +7,7 @@ # # 主机: 127.0.0.1 (MySQL 5.6.39) # 数据库: big_market_01 -# 生成时间: 2024-05-25 02:56:28 +0000 +# 生成时间: 2024-06-22 04:20:08 +0000 # ************************************************************ @@ -48,11 +48,12 @@ LOCK TABLES `raffle_activity_account` WRITE; INSERT INTO `raffle_activity_account` (`id`, `user_id`, `activity_id`, `total_count`, `total_count_surplus`, `day_count`, `day_count_surplus`, `month_count`, `month_count_surplus`, `create_time`, `update_time`) VALUES - (3,'xiaofuge',100301,160,67,160,105,160,105,'2024-03-23 16:38:57','2024-05-04 15:29:56'), + (3,'xiaofuge',100301,1188,1161,1188,1161,1188,1161,'2024-03-23 16:38:57','2024-06-22 11:11:02'), (4,'12345',100301,10,10,10,10,10,10,'2024-05-01 15:28:50','2024-05-01 15:28:50'), (5,'liergou',100301,20,6,20,6,20,6,'2024-05-04 15:30:21','2024-05-04 15:34:10'), (6,'liergou2',100301,100,86,100,86,100,86,'2024-05-04 15:35:52','2024-05-04 15:37:37'), - (7,'user003',100301,100,98,100,98,100,98,'2024-05-25 10:52:19','2024-05-25 10:54:30'); + (7,'user003',100301,100,98,100,98,100,98,'2024-05-25 10:52:19','2024-05-25 10:54:30'), + (8,'xiaofuge26',100301,1,1,1,1,1,1,'2024-06-22 10:22:35','2024-06-22 10:22:35'); /*!40000 ALTER TABLE `raffle_activity_account` ENABLE KEYS */; UNLOCK TABLES; @@ -90,7 +91,11 @@ VALUES (13,'xiaofuge',100301,'2024-05-04',160,131,'2024-05-04 09:32:02','2024-05-04 15:29:56'), (14,'liergou',100301,'2024-05-04',20,6,'2024-05-04 15:30:36','2024-05-04 15:34:10'), (15,'liergou2',100301,'2024-05-04',100,86,'2024-05-04 15:35:56','2024-05-04 15:37:37'), - (16,'user003',100301,'2024-05-25',100,98,'2024-05-25 10:53:19','2024-05-25 10:54:30'); + (16,'user003',100301,'2024-05-25',100,98,'2024-05-25 10:53:19','2024-05-25 10:54:30'), + (17,'xiaofuge',100301,'2024-05-30',160,154,'2024-05-30 07:24:01','2024-05-30 08:02:18'), + (18,'xiaofuge',100301,'2024-06-09',660,659,'2024-06-09 16:39:17','2024-06-09 18:44:43'), + (19,'xiaofuge',100301,'2024-06-10',660,637,'2024-06-10 08:16:55','2024-06-10 09:36:26'), + (20,'xiaofuge',100301,'2024-06-15',1160,1157,'2024-06-15 20:02:16','2024-06-15 20:19:36'); /*!40000 ALTER TABLE `raffle_activity_account_day` ENABLE KEYS */; UNLOCK TABLES; @@ -119,10 +124,11 @@ LOCK TABLES `raffle_activity_account_month` WRITE; INSERT INTO `raffle_activity_account_month` (`id`, `user_id`, `activity_id`, `month`, `month_count`, `month_count_surplus`, `create_time`, `update_time`) VALUES - (7,'xiaofuge',100301,'2024-05',140,85,'2024-05-01 14:51:45','2024-05-04 15:29:56'), + (7,'xiaofuge',100301,'2024-05',140,79,'2024-05-01 14:51:45','2024-05-30 08:02:18'), (8,'liergou',100301,'2024-05',20,6,'2024-05-04 15:30:36','2024-05-04 15:34:10'), (9,'liergou2',100301,'2024-05',100,86,'2024-05-04 15:35:56','2024-05-04 15:37:37'), - (10,'user003',100301,'2024-05',100,98,'2024-05-25 10:53:19','2024-05-25 10:54:30'); + (10,'user003',100301,'2024-05',100,98,'2024-05-25 10:53:19','2024-05-25 10:54:30'), + (11,'xiaofuge',100301,'2024-06',1188,1161,'2024-06-09 16:39:17','2024-06-22 11:11:02'); /*!40000 ALTER TABLE `raffle_activity_account_month` ENABLE KEYS */; UNLOCK TABLES; @@ -145,6 +151,7 @@ CREATE TABLE `raffle_activity_order_000` ( `total_count` int(8) NOT NULL COMMENT '总次数', `day_count` int(8) NOT NULL COMMENT '日次数', `month_count` int(8) NOT NULL COMMENT '月次数', + `pay_amount` decimal(10,2) DEFAULT NULL COMMENT '支付金额【积分】', `state` varchar(16) NOT NULL DEFAULT 'complete' COMMENT '订单状态(complete)', `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传的,确保幂等', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -174,6 +181,7 @@ CREATE TABLE `raffle_activity_order_001` ( `total_count` int(8) NOT NULL COMMENT '总次数', `day_count` int(8) NOT NULL COMMENT '日次数', `month_count` int(8) NOT NULL COMMENT '月次数', + `pay_amount` decimal(10,2) DEFAULT NULL COMMENT '支付金额【积分】', `state` varchar(16) NOT NULL DEFAULT 'complete' COMMENT '订单状态(complete)', `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传的,确保幂等', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -187,23 +195,41 @@ CREATE TABLE `raffle_activity_order_001` ( LOCK TABLES `raffle_activity_order_001` WRITE; /*!40000 ALTER TABLE `raffle_activity_order_001` DISABLE KEYS */; -INSERT INTO `raffle_activity_order_001` (`id`, `user_id`, `sku`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `total_count`, `day_count`, `month_count`, `state`, `out_business_no`, `create_time`, `update_time`) +INSERT INTO `raffle_activity_order_001` (`id`, `user_id`, `sku`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `total_count`, `day_count`, `month_count`, `pay_amount`, `state`, `out_business_no`, `create_time`, `update_time`) VALUES - (71,'xiaofuge',9011,100301,'测试活动',100006,'761345538871','2024-04-21 10:40:25',1,1,1,'completed','073735003829','2024-04-21 18:40:25','2024-04-21 18:40:25'), - (72,'xiaofuge',9011,100301,'测试活动',100006,'837744050164','2024-04-21 10:40:25',1,1,1,'completed','613036507854','2024-04-21 18:40:25','2024-04-21 18:40:25'), - (73,'xiaofuge',9011,100301,'测试活动',100006,'766742523760','2024-04-21 10:40:25',1,1,1,'completed','649099837249','2024-04-21 18:40:25','2024-04-21 18:40:25'), - (74,'xiaofuge',9011,100301,'测试活动',100006,'856474163547','2024-04-21 10:40:25',1,1,1,'completed','652903372986','2024-04-21 18:40:25','2024-04-21 18:40:25'), - (75,'xiaofuge',9011,100301,'测试活动',100006,'668775949799','2024-04-21 10:40:25',1,1,1,'completed','097066347980','2024-04-21 18:40:25','2024-04-21 18:40:25'), - (76,'xiaofuge',9011,100301,'测试活动',100006,'164452591012','2024-05-01 06:44:26',10,10,10,'completed','xiaofuge_sku_2024042903','2024-05-01 14:44:26','2024-05-01 14:44:26'), - (77,'xiaofuge',9011,100301,'测试活动',100006,'492597085813','2024-05-01 06:51:45',10,10,10,'completed','xiaofuge_sku_2024042904','2024-05-01 14:51:45','2024-05-01 14:51:45'), - (78,'xiaofuge',9011,100301,'测试活动',100006,'031706643902','2024-05-01 06:54:36',10,10,10,'completed','xiaofuge_sku_2024042905','2024-05-01 14:54:36','2024-05-01 14:54:36'), - (79,'xiaofuge',9011,100301,'测试活动',100006,'460855930969','2024-05-01 07:00:12',10,10,10,'completed','xiaofuge_sku_2024042906','2024-05-01 15:00:12','2024-05-01 15:00:12'), - (1096,'xiaofuge',9011,100301,'测试活动',100006,'364757830401','2024-05-01 09:14:43',10,10,10,'completed','xiaofuge_sku_20240501','2024-05-01 17:14:43','2024-05-01 17:14:43'), - (1097,'xiaofuge',9011,100301,'测试活动',100006,'157026402583','2024-05-01 09:39:40',10,10,10,'completed','xiaofuge_sku_20240420','2024-05-01 17:39:40','2024-05-01 17:39:40'), - (1098,'xiaofuge',9011,100301,'测试活动',100006,'481116019750','2024-05-01 09:41:53',10,10,10,'completed','xiaofuge_sku_20240401','2024-05-01 17:41:53','2024-05-01 17:41:53'), - (1099,'xiaofuge',9011,100301,'测试活动',100006,'639151059221','2024-05-01 09:45:10',10,10,10,'completed','xiaofuge_sku_20240402','2024-05-01 17:45:10','2024-05-01 17:45:10'), - (4234,'xiaofuge',9011,100301,'测试活动',100006,'129360973197','2024-05-03 05:28:43',10,10,10,'completed','xiaofuge_sku_20240503','2024-05-03 13:28:42','2024-05-03 13:28:42'), - (4247,'liergou',9011,100301,'测试活动',100006,'151494600661','2024-05-04 07:32:26',10,10,10,'completed','liergou_sku_20240504','2024-05-04 15:32:25','2024-05-04 15:32:25'); + (71,'xiaofuge',9011,100301,'测试活动',100006,'761345538871','2024-04-21 10:40:25',1,1,1,0.00,'completed','073735003829','2024-04-21 18:40:25','2024-04-21 18:40:25'), + (72,'xiaofuge',9011,100301,'测试活动',100006,'837744050164','2024-04-21 10:40:25',1,1,1,0.00,'completed','613036507854','2024-04-21 18:40:25','2024-04-21 18:40:25'), + (73,'xiaofuge',9011,100301,'测试活动',100006,'766742523760','2024-04-21 10:40:25',1,1,1,0.00,'completed','649099837249','2024-04-21 18:40:25','2024-04-21 18:40:25'), + (74,'xiaofuge',9011,100301,'测试活动',100006,'856474163547','2024-04-21 10:40:25',1,1,1,0.00,'completed','652903372986','2024-04-21 18:40:25','2024-04-21 18:40:25'), + (75,'xiaofuge',9011,100301,'测试活动',100006,'668775949799','2024-04-21 10:40:25',1,1,1,0.00,'completed','097066347980','2024-04-21 18:40:25','2024-04-21 18:40:25'), + (76,'xiaofuge',9011,100301,'测试活动',100006,'164452591012','2024-05-01 06:44:26',10,10,10,0.00,'completed','xiaofuge_sku_2024042903','2024-05-01 14:44:26','2024-05-01 14:44:26'), + (77,'xiaofuge',9011,100301,'测试活动',100006,'492597085813','2024-05-01 06:51:45',10,10,10,0.00,'completed','xiaofuge_sku_2024042904','2024-05-01 14:51:45','2024-05-01 14:51:45'), + (78,'xiaofuge',9011,100301,'测试活动',100006,'031706643902','2024-05-01 06:54:36',10,10,10,0.00,'completed','xiaofuge_sku_2024042905','2024-05-01 14:54:36','2024-05-01 14:54:36'), + (79,'xiaofuge',9011,100301,'测试活动',100006,'460855930969','2024-05-01 07:00:12',10,10,10,0.00,'completed','xiaofuge_sku_2024042906','2024-05-01 15:00:12','2024-05-01 15:00:12'), + (1096,'xiaofuge',9011,100301,'测试活动',100006,'364757830401','2024-05-01 09:14:43',10,10,10,0.00,'completed','xiaofuge_sku_20240501','2024-05-01 17:14:43','2024-05-01 17:14:43'), + (1097,'xiaofuge',9011,100301,'测试活动',100006,'157026402583','2024-05-01 09:39:40',10,10,10,0.00,'completed','xiaofuge_sku_20240420','2024-05-01 17:39:40','2024-05-01 17:39:40'), + (1098,'xiaofuge',9011,100301,'测试活动',100006,'481116019750','2024-05-01 09:41:53',10,10,10,0.00,'completed','xiaofuge_sku_20240401','2024-05-01 17:41:53','2024-05-01 17:41:53'), + (1099,'xiaofuge',9011,100301,'测试活动',100006,'639151059221','2024-05-01 09:45:10',10,10,10,0.00,'completed','xiaofuge_sku_20240402','2024-05-01 17:45:10','2024-05-01 17:45:10'), + (4234,'xiaofuge',9011,100301,'测试活动',100006,'129360973197','2024-05-03 05:28:43',10,10,10,0.00,'completed','xiaofuge_sku_20240503','2024-05-03 13:28:42','2024-05-03 13:28:42'), + (4247,'liergou',9011,100301,'测试活动',100006,'151494600661','2024-05-04 07:32:26',10,10,10,0.00,'completed','liergou_sku_20240504','2024-05-04 15:32:25','2024-05-04 15:32:25'), + (4248,'xiaofuge',9011,100301,'测试活动',100006,'398083697802','2024-06-08 10:38:59',100,100,100,1.68,'completed','70009240608001','2024-06-08 18:38:59','2024-06-15 10:19:14'), + (4249,'xiaofuge',9011,100301,'测试活动',100006,'356030049461','2024-06-08 10:54:33',100,100,100,1.68,'completed','70009240608002','2024-06-08 18:54:32','2024-06-15 11:17:24'), + (4250,'xiaofuge',9011,100301,'测试活动',100006,'605318523315','2024-06-08 10:55:50',100,100,100,1.68,'completed','70009240608003','2024-06-08 18:55:49','2024-06-08 20:29:30'), + (4251,'xiaofuge',9011,100301,'测试活动',100006,'127654026777','2024-06-08 10:56:28',100,100,100,0.00,'completed','70009240608004','2024-06-08 18:56:27','2024-06-08 18:56:27'), + (4252,'xiaofuge',9011,100301,'测试活动',100006,'932526349433','2024-06-08 12:33:09',100,100,100,1.68,'completed','70009240608007','2024-06-08 20:33:09','2024-06-08 20:34:13'), + (4253,'xiaofuge',9011,100301,'测试活动',100006,'073017788455','2024-06-09 01:07:48',100,100,100,1.68,'completed','70009240609001','2024-06-09 09:07:47','2024-06-09 09:11:24'), + (4254,'xiaofuge',9011,100301,'测试活动',100006,'590031092982','2024-06-09 02:33:49',100,100,100,1.68,'completed','70009240610001','2024-06-09 10:33:48','2024-06-15 11:18:50'), + (4255,'xiaofuge',9011,100301,'测试活动',100006,'732573213062','2024-06-09 02:43:18',100,100,100,1.68,'completed','70009240610002','2024-06-09 10:43:18','2024-06-09 10:45:11'), + (4256,'xiaofuge',9011,100301,'测试活动',100006,'046375714484','2024-06-15 03:20:31',100,100,100,1.68,'completed','930967287605','2024-06-15 11:20:31','2024-06-15 11:20:31'), + (4257,'xiaofuge',9011,100301,'测试活动',100006,'544463875146','2024-06-15 06:46:29',100,100,100,1.68,'completed','737554528904','2024-06-15 14:46:28','2024-06-15 14:46:29'), + (4258,'xiaofuge',9014,100301,'测试活动',100006,'683837315428','2024-06-22 01:26:03',5,5,5,1.00,'completed','581102699959','2024-06-22 09:26:03','2024-06-22 09:31:17'), + (4259,'xiaofuge',9014,100301,'测试活动',100006,'175011819792','2024-06-22 01:45:46',5,5,5,1.00,'completed','558549576217','2024-06-22 09:45:46','2024-06-22 09:45:46'), + (4260,'xiaofuge',9014,100301,'测试活动',100006,'810424954024','2024-06-22 01:45:52',5,5,5,1.00,'completed','512408648536','2024-06-22 09:45:52','2024-06-22 09:45:52'), + (4261,'xiaofuge',9014,100301,'测试活动',100006,'657692221061','2024-06-22 01:45:54',5,5,5,1.00,'completed','954851009052','2024-06-22 09:45:54','2024-06-22 09:45:54'), + (4262,'xiaofuge',9014,100301,'测试活动',100006,'447545046420','2024-06-22 01:45:58',5,5,5,1.00,'completed','156304594063','2024-06-22 09:45:58','2024-06-22 09:45:58'), + (4263,'xiaofuge',9014,100301,'测试活动',100006,'923077693728','2024-06-22 01:49:28',1,1,1,5.00,'completed','844410851560','2024-06-22 09:49:28','2024-06-22 09:49:28'), + (4264,'xiaofuge',9014,100301,'测试活动',100006,'752103319491','2024-06-22 01:49:32',1,1,1,5.00,'completed','450478498484','2024-06-22 09:49:31','2024-06-22 09:49:31'), + (4265,'xiaofuge',9014,100301,'测试活动',100006,'749849999347','2024-06-22 03:11:03',1,1,1,5.00,'completed','489789224063','2024-06-22 11:11:02','2024-06-22 11:11:02'); /*!40000 ALTER TABLE `raffle_activity_order_001` ENABLE KEYS */; UNLOCK TABLES; @@ -226,6 +252,7 @@ CREATE TABLE `raffle_activity_order_002` ( `total_count` int(8) NOT NULL COMMENT '总次数', `day_count` int(8) NOT NULL COMMENT '日次数', `month_count` int(8) NOT NULL COMMENT '月次数', + `pay_amount` decimal(10,2) DEFAULT NULL COMMENT '支付金额【积分】', `state` varchar(16) NOT NULL DEFAULT 'complete' COMMENT '订单状态(complete)', `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传的,确保幂等', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -239,10 +266,10 @@ CREATE TABLE `raffle_activity_order_002` ( LOCK TABLES `raffle_activity_order_002` WRITE; /*!40000 ALTER TABLE `raffle_activity_order_002` DISABLE KEYS */; -INSERT INTO `raffle_activity_order_002` (`id`, `user_id`, `sku`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `total_count`, `day_count`, `month_count`, `state`, `out_business_no`, `create_time`, `update_time`) +INSERT INTO `raffle_activity_order_002` (`id`, `user_id`, `sku`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `total_count`, `day_count`, `month_count`, `pay_amount`, `state`, `out_business_no`, `create_time`, `update_time`) VALUES - (1,'liergou2',9011,100301,'测试活动',100006,'987026967898','2024-05-04 07:35:53',100,100,100,'completed','liergou2_sku_20240504','2024-05-04 15:35:52','2024-05-04 15:35:52'), - (2,'user003',9011,100301,'测试活动',100006,'700446814309','2024-05-25 02:52:20',100,100,100,'completed','user003_sku_20240525','2024-05-25 10:52:19','2024-05-25 10:52:19'); + (1,'liergou2',9011,100301,'测试活动',100006,'987026967898','2024-05-04 07:35:53',100,100,100,0.00,'completed','liergou2_sku_20240504','2024-05-04 15:35:52','2024-05-04 15:35:52'), + (2,'user003',9011,100301,'测试活动',100006,'700446814309','2024-05-25 02:52:20',100,100,100,0.00,'completed','user003_sku_20240525','2024-05-25 10:52:19','2024-05-25 10:52:19'); /*!40000 ALTER TABLE `raffle_activity_order_002` ENABLE KEYS */; UNLOCK TABLES; @@ -265,6 +292,7 @@ CREATE TABLE `raffle_activity_order_003` ( `total_count` int(8) NOT NULL COMMENT '总次数', `day_count` int(8) NOT NULL COMMENT '日次数', `month_count` int(8) NOT NULL COMMENT '月次数', + `pay_amount` decimal(10,2) DEFAULT NULL COMMENT '支付金额【积分】', `state` varchar(16) NOT NULL DEFAULT 'complete' COMMENT '订单状态(complete)', `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传的,确保幂等', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -275,6 +303,15 @@ CREATE TABLE `raffle_activity_order_003` ( KEY `idx_user_id_activity_id` (`user_id`,`activity_id`,`state`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='抽奖活动单'; +LOCK TABLES `raffle_activity_order_003` WRITE; +/*!40000 ALTER TABLE `raffle_activity_order_003` DISABLE KEYS */; + +INSERT INTO `raffle_activity_order_003` (`id`, `user_id`, `sku`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `total_count`, `day_count`, `month_count`, `pay_amount`, `state`, `out_business_no`, `create_time`, `update_time`) +VALUES + (1,'xiaofuge26',9014,100301,'测试活动',100006,'197003210793','2024-06-22 02:22:35',1,1,1,0.00,'completed','xiaofuge26_sku_20240622','2024-06-22 10:22:35','2024-06-22 10:22:35'); + +/*!40000 ALTER TABLE `raffle_activity_order_003` ENABLE KEYS */; +UNLOCK TABLES; # 转储表 task @@ -534,7 +571,76 @@ VALUES (230,'user003','send_rebate','76631988985','{\"data\":{\"bizId\":\"user003_sku_20240525\",\"rebateConfig\":\"9011\",\"rebateType\":\"sku\",\"userId\":\"user003\"},\"id\":\"76631988985\",\"timestamp\":1716605538812}','completed','2024-05-25 10:52:19','2024-05-25 10:52:19'), (231,'user003','send_rebate','97630347951','{\"data\":{\"bizId\":\"user003_integral_20240525\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"user003\"},\"id\":\"97630347951\",\"timestamp\":1716605538817}','completed','2024-05-25 10:52:19','2024-05-25 10:52:19'), (232,'user003','send_award','22110596663','{\"data\":{\"awardConfig\":\"0.01,1\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"248641902208\",\"userId\":\"user003\"},\"id\":\"22110596663\",\"timestamp\":1716605600148}','completed','2024-05-25 10:53:20','2024-05-25 10:53:20'), - (233,'user003','send_award','55709995622','{\"data\":{\"awardConfig\":\"0.01,1\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"020196190863\",\"userId\":\"user003\"},\"id\":\"55709995622\",\"timestamp\":1716605670613}','completed','2024-05-25 10:54:31','2024-05-25 10:54:31'); + (233,'user003','send_award','55709995622','{\"data\":{\"awardConfig\":\"0.01,1\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"020196190863\",\"userId\":\"user003\"},\"id\":\"55709995622\",\"timestamp\":1716605670613}','completed','2024-05-25 10:54:31','2024-05-25 10:54:31'), + (234,'xiaofuge','send_award','79454943847','{\"data\":{\"awardId\":106,\"awardTitle\":\"轻奢办公椅\",\"orderId\":\"472964574229\",\"userId\":\"xiaofuge\"},\"id\":\"79454943847\",\"timestamp\":1717025041975}','completed','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (235,'xiaofuge','send_award','09860278655','{\"data\":{\"awardId\":107,\"awardTitle\":\"小霸王游戏机\",\"orderId\":\"096000668706\",\"userId\":\"xiaofuge\"},\"id\":\"09860278655\",\"timestamp\":1717025042498}','completed','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (236,'xiaofuge','send_award','43408061670','{\"data\":{\"awardId\":107,\"awardTitle\":\"小霸王游戏机\",\"orderId\":\"053808941529\",\"userId\":\"xiaofuge\"},\"id\":\"43408061670\",\"timestamp\":1717025042660}','completed','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (237,'xiaofuge','send_award','98270300001','{\"data\":{\"awardId\":106,\"awardTitle\":\"轻奢办公椅\",\"orderId\":\"546003504055\",\"userId\":\"xiaofuge\"},\"id\":\"98270300001\",\"timestamp\":1717025042832}','completed','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (238,'xiaofuge','send_award','19901700385','{\"data\":{\"awardId\":107,\"awardTitle\":\"小霸王游戏机\",\"orderId\":\"531425424850\",\"userId\":\"xiaofuge\"},\"id\":\"19901700385\",\"timestamp\":1717025042964}','completed','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (239,'xiaofuge','send_rebate','99298867364','{\"data\":{\"bizId\":\"xiaofuge_integral_20240601001\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge\"},\"id\":\"99298867364\",\"timestamp\":1717210140295}','completed','2024-06-01 10:49:00','2024-06-01 10:49:00'), + (240,'xiaofuge','send_rebate','84156214268','{\"data\":{\"bizId\":\"xiaofuge_integral_20240601002\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge\"},\"id\":\"84156214268\",\"timestamp\":1717210318593}','completed','2024-06-01 10:51:58','2024-06-01 10:52:03'), + (241,'xiaofuge','send_rebate','74711058753','{\"data\":{\"bizId\":\"xiaofuge_integral_20240601003\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge\"},\"id\":\"74711058753\",\"timestamp\":1717210372351}','completed','2024-06-01 10:52:52','2024-06-01 10:52:52'), + (242,'xiaofuge','send_rebate','11611351139','{\"data\":{\"bizId\":\"xiaofuge_integral_20240601004\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge\"},\"id\":\"11611351139\",\"timestamp\":1717210470349}','completed','2024-06-01 10:54:30','2024-06-01 10:55:17'), + (243,'xiaofuge','send_rebate','53202882014','{\"data\":{\"bizId\":\"xiaofuge_integral_20240601005\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge\"},\"id\":\"53202882014\",\"timestamp\":1717210629229}','completed','2024-06-01 10:57:09','2024-06-01 10:57:09'), + (244,'xiaofuge','send_rebate','61165550239','{\"data\":{\"bizId\":\"xiaofuge_integral_20240601006\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge\"},\"id\":\"61165550239\",\"timestamp\":1717210827931}','completed','2024-06-01 11:00:28','2024-06-01 11:00:31'), + (245,'xiaofuge','send_rebate','67030345130','{\"data\":{\"bizId\":\"xiaofuge_integral_20240601101\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge\"},\"id\":\"67030345130\",\"timestamp\":1717221767862}','completed','2024-06-01 14:02:48','2024-06-01 14:02:48'), + (246,'xiaofuge','credit_adjust_success','42778910768','{\"data\":{\"amount\":-1.68,\"orderId\":\"313070417337\",\"outBusinessNo\":\"70009240608003\",\"userId\":\"xiaofuge\"},\"id\":\"42778910768\",\"timestamp\":1717849623150}','completed','2024-06-08 20:27:03','2024-06-08 20:27:15'), + (247,'xiaofuge','credit_adjust_success','53121094706','{\"data\":{\"amount\":-1.68,\"orderId\":\"956437348272\",\"outBusinessNo\":\"70009240608007\",\"userId\":\"xiaofuge\"},\"id\":\"53121094706\",\"timestamp\":1717850053164}','completed','2024-06-08 20:34:13','2024-06-08 20:34:13'), + (248,'xiaofuge','credit_adjust_success','04087257219','{\"data\":{\"amount\":-1.68,\"orderId\":\"825697847616\",\"outBusinessNo\":\"70009240609001\",\"userId\":\"xiaofuge\"},\"id\":\"04087257219\",\"timestamp\":1717895483369}','completed','2024-06-09 09:11:23','2024-06-09 09:11:24'), + (249,'xiaofuge','credit_adjust_success','50806088557','{\"data\":{\"amount\":-1.68,\"orderId\":\"528225981137\",\"outBusinessNo\":\"70009240610002\",\"userId\":\"xiaofuge\"},\"id\":\"50806088557\",\"timestamp\":1717901110572}','completed','2024-06-09 10:45:11','2024-06-09 10:45:11'), + (250,'xiaofuge','send_award','26927754819','{\"data\":{\"awardId\":106,\"awardTitle\":\"轻奢办公椅\",\"orderId\":\"101866910505\",\"userId\":\"xiaofuge\"},\"id\":\"26927754819\",\"timestamp\":1717922288328}','completed','2024-06-09 16:38:08','2024-06-09 16:38:08'), + (251,'xiaofuge','send_award','46601016382','{\"data\":{\"awardId\":107,\"awardTitle\":\"小霸王游戏机\",\"orderId\":\"982300492592\",\"userId\":\"xiaofuge\"},\"id\":\"46601016382\",\"timestamp\":1717922357941}','completed','2024-06-09 16:39:18','2024-06-09 16:39:18'), + (252,'xiaofuge','send_award','22347117561','{\"data\":{\"awardId\":107,\"awardTitle\":\"小霸王游戏机\",\"orderId\":\"910742677700\",\"userId\":\"xiaofuge\"},\"id\":\"22347117561\",\"timestamp\":1717922426837}','completed','2024-06-09 16:40:27','2024-06-09 16:40:27'), + (253,'xiaofuge','send_award','58851591615','{\"data\":{\"awardId\":107,\"awardTitle\":\"小霸王游戏机\",\"orderId\":\"491443986394\",\"userId\":\"xiaofuge\"},\"id\":\"58851591615\",\"timestamp\":1717922910000}','completed','2024-06-09 16:48:30','2024-06-09 16:48:30'), + (254,'xiaofuge','send_award','90231733191','{\"data\":{\"awardId\":107,\"awardTitle\":\"小霸王游戏机\",\"orderId\":\"185144859882\",\"userId\":\"xiaofuge\"},\"id\":\"90231733191\",\"timestamp\":1717923112036}','completed','2024-06-09 16:51:52','2024-06-09 16:51:52'), + (255,'xiaofuge','send_award','34803792655','{\"data\":{\"awardId\":106,\"awardTitle\":\"轻奢办公椅\",\"orderId\":\"824053366847\",\"userId\":\"xiaofuge\"},\"id\":\"34803792655\",\"timestamp\":1717923291510}','completed','2024-06-09 16:54:51','2024-06-09 16:54:51'), + (256,'xiaofuge','send_award','95397769059','{\"data\":{\"awardId\":107,\"awardTitle\":\"小霸王游戏机\",\"orderId\":\"261041879408\",\"userId\":\"xiaofuge\"},\"id\":\"95397769059\",\"timestamp\":1717923424701}','completed','2024-06-09 16:57:04','2024-06-09 16:57:04'), + (257,'xiaofuge','send_award','37263373718','{\"data\":{\"awardId\":107,\"awardTitle\":\"小霸王游戏机\",\"orderId\":\"347687076714\",\"userId\":\"xiaofuge\"},\"id\":\"37263373718\",\"timestamp\":1717926604262}','completed','2024-06-09 17:50:04','2024-06-09 17:50:04'), + (258,'xiaofuge','send_award','59545478396','{\"data\":{\"awardId\":107,\"awardTitle\":\"小霸王游戏机\",\"orderId\":\"686437761355\",\"userId\":\"xiaofuge\"},\"id\":\"59545478396\",\"timestamp\":1717927280830}','completed','2024-06-09 18:01:21','2024-06-09 18:01:21'), + (259,'xiaofuge','send_award','08906900453','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"785085017376\",\"userId\":\"xiaofuge\"},\"id\":\"08906900453\",\"timestamp\":1717929883683}','completed','2024-06-09 18:44:43','2024-06-09 18:44:43'), + (260,'xiaofuge','send_award','69014264277','{\"data\":{\"awardId\":104,\"awardTitle\":\"小米台灯\",\"orderId\":\"621539805309\",\"userId\":\"xiaofuge\"},\"id\":\"69014264277\",\"timestamp\":1717978615661}','completed','2024-06-10 08:16:55','2024-06-10 08:16:56'), + (261,'xiaofuge','send_award','80351397542','{\"data\":{\"awardId\":102,\"awardTitle\":\"OpenAI会员卡\",\"orderId\":\"409116465954\",\"userId\":\"xiaofuge\"},\"id\":\"80351397542\",\"timestamp\":1717983120987}','completed','2024-06-10 09:32:01','2024-06-10 09:32:01'), + (262,'xiaofuge','send_award','17346228082','{\"data\":{\"awardConfig\":\"1,100\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"425949139982\",\"userId\":\"xiaofuge\"},\"id\":\"17346228082\",\"timestamp\":1717983121787}','completed','2024-06-10 09:32:01','2024-06-10 09:32:01'), + (263,'xiaofuge','send_award','78676905226','{\"data\":{\"awardId\":104,\"awardTitle\":\"小米台灯\",\"orderId\":\"495003911464\",\"userId\":\"xiaofuge\"},\"id\":\"78676905226\",\"timestamp\":1717983122042}','completed','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (264,'xiaofuge','send_award','48405748157','{\"data\":{\"awardId\":102,\"awardTitle\":\"OpenAI会员卡\",\"orderId\":\"995078901219\",\"userId\":\"xiaofuge\"},\"id\":\"48405748157\",\"timestamp\":1717983122250}','completed','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (265,'xiaofuge','send_award','67359117900','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"858859626738\",\"userId\":\"xiaofuge\"},\"id\":\"67359117900\",\"timestamp\":1717983122494}','completed','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (266,'xiaofuge','send_award','90382887428','{\"data\":{\"awardId\":104,\"awardTitle\":\"小米台灯\",\"orderId\":\"053708718603\",\"userId\":\"xiaofuge\"},\"id\":\"90382887428\",\"timestamp\":1717983122667}','completed','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (267,'xiaofuge','send_award','28629141959','{\"data\":{\"awardId\":107,\"awardTitle\":\"小霸王游戏机\",\"orderId\":\"297260334918\",\"userId\":\"xiaofuge\"},\"id\":\"28629141959\",\"timestamp\":1717983122882}','completed','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (268,'xiaofuge','send_award','87621753567','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"167963236057\",\"userId\":\"xiaofuge\"},\"id\":\"87621753567\",\"timestamp\":1717983123033}','completed','2024-06-10 09:32:03','2024-06-10 09:32:03'), + (269,'xiaofuge','send_award','19681781897','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"653777558291\",\"userId\":\"xiaofuge\"},\"id\":\"19681781897\",\"timestamp\":1717983123178}','completed','2024-06-10 09:32:03','2024-06-10 09:32:03'), + (270,'xiaofuge','send_award','56368602597','{\"data\":{\"awardId\":102,\"awardTitle\":\"OpenAI会员卡\",\"orderId\":\"281047495461\",\"userId\":\"xiaofuge\"},\"id\":\"56368602597\",\"timestamp\":1717983123377}','completed','2024-06-10 09:32:03','2024-06-10 09:32:03'), + (271,'xiaofuge','send_award','42947550170','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"880920828501\",\"userId\":\"xiaofuge\"},\"id\":\"42947550170\",\"timestamp\":1717983223442}','completed','2024-06-10 09:33:43','2024-06-10 09:33:44'), + (272,'xiaofuge','send_award','25433533860','{\"data\":{\"awardId\":102,\"awardTitle\":\"OpenAI会员卡\",\"orderId\":\"082869528704\",\"userId\":\"xiaofuge\"},\"id\":\"25433533860\",\"timestamp\":1717983330869}','completed','2024-06-10 09:35:31','2024-06-10 09:35:31'), + (273,'xiaofuge','send_award','88623042077','{\"data\":{\"awardId\":102,\"awardTitle\":\"OpenAI会员卡\",\"orderId\":\"775059128414\",\"userId\":\"xiaofuge\"},\"id\":\"88623042077\",\"timestamp\":1717983384190}','completed','2024-06-10 09:36:24','2024-06-10 09:36:24'), + (274,'xiaofuge','send_award','70095826976','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"156151328815\",\"userId\":\"xiaofuge\"},\"id\":\"70095826976\",\"timestamp\":1717983384838}','completed','2024-06-10 09:36:24','2024-06-10 09:36:24'), + (275,'xiaofuge','send_award','48727596578','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"118558329771\",\"userId\":\"xiaofuge\"},\"id\":\"48727596578\",\"timestamp\":1717983385056}','completed','2024-06-10 09:36:25','2024-06-10 09:36:25'), + (276,'xiaofuge','send_award','33923911862','{\"data\":{\"awardId\":102,\"awardTitle\":\"OpenAI会员卡\",\"orderId\":\"427636834661\",\"userId\":\"xiaofuge\"},\"id\":\"33923911862\",\"timestamp\":1717983385308}','completed','2024-06-10 09:36:25','2024-06-10 09:36:25'), + (277,'xiaofuge','send_award','89445645254','{\"data\":{\"awardId\":102,\"awardTitle\":\"OpenAI会员卡\",\"orderId\":\"135758549193\",\"userId\":\"xiaofuge\"},\"id\":\"89445645254\",\"timestamp\":1717983385499}','completed','2024-06-10 09:36:25','2024-06-10 09:36:25'), + (278,'xiaofuge','send_award','40271574409','{\"data\":{\"awardId\":102,\"awardTitle\":\"OpenAI会员卡\",\"orderId\":\"596222110197\",\"userId\":\"xiaofuge\"},\"id\":\"40271574409\",\"timestamp\":1717983385799}','completed','2024-06-10 09:36:25','2024-06-10 09:36:25'), + (279,'xiaofuge','send_award','42927059557','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"133465033320\",\"userId\":\"xiaofuge\"},\"id\":\"42927059557\",\"timestamp\":1717983385992}','completed','2024-06-10 09:36:25','2024-06-10 09:36:26'), + (280,'xiaofuge','send_award','17144609943','{\"data\":{\"awardId\":102,\"awardTitle\":\"OpenAI会员卡\",\"orderId\":\"473872104570\",\"userId\":\"xiaofuge\"},\"id\":\"17144609943\",\"timestamp\":1717983386224}','completed','2024-06-10 09:36:26','2024-06-10 09:36:26'), + (281,'xiaofuge','send_award','30715094825','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"423248249261\",\"userId\":\"xiaofuge\"},\"id\":\"30715094825\",\"timestamp\":1717983386422}','completed','2024-06-10 09:36:26','2024-06-10 09:36:26'), + (282,'xiaofuge','send_award','38211485616','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"308631038775\",\"userId\":\"xiaofuge\"},\"id\":\"38211485616\",\"timestamp\":1717983386611}','completed','2024-06-10 09:36:26','2024-06-10 09:36:26'), + (283,'xiaofuge','credit_adjust_success','18537451448','{\"data\":{\"amount\":1.68,\"orderId\":\"564697903775\",\"outBusinessNo\":\"930967287605\",\"userId\":\"xiaofuge\"},\"id\":\"18537451448\",\"timestamp\":1718421631362}','completed','2024-06-15 11:20:31','2024-06-15 11:20:31'), + (284,'xiaofuge','credit_adjust_success','40550073689','{\"data\":{\"amount\":1.68,\"orderId\":\"628209301378\",\"outBusinessNo\":\"737554528904\",\"userId\":\"xiaofuge\"},\"id\":\"40550073689\",\"timestamp\":1718433988638}','completed','2024-06-15 14:46:29','2024-06-15 14:46:29'), + (285,'xiaofuge','send_award','20664492845','{\"data\":{\"awardId\":102,\"awardTitle\":\"OpenAI会员卡\",\"orderId\":\"519396224936\",\"userId\":\"xiaofuge\"},\"id\":\"20664492845\",\"timestamp\":1718452937177}','completed','2024-06-15 20:02:17','2024-06-15 20:02:17'), + (286,'xiaofuge','send_award','71555553172','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"670420154694\",\"userId\":\"xiaofuge\"},\"id\":\"71555553172\",\"timestamp\":1718453975872}','completed','2024-06-15 20:19:36','2024-06-15 20:19:36'), + (287,'xiaofuge','send_award','90817491211','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"698760826583\",\"userId\":\"xiaofuge\"},\"id\":\"90817491211\",\"timestamp\":1718453976598}','completed','2024-06-15 20:19:36','2024-06-15 20:19:36'), + (288,'xiaofuge','send_rebate','01818426310','{\"data\":{\"bizId\":\"xiaofuge_integral_20240621\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge\"},\"id\":\"01818426310\",\"timestamp\":1718977807980}','completed','2024-06-21 21:50:08','2024-06-21 21:50:08'), + (289,'xiaofuge','credit_adjust_success','08341234374','{\"data\":{\"amount\":10,\"orderId\":\"783120384577\",\"outBusinessNo\":\"xiaofuge_integral_20240621\",\"userId\":\"xiaofuge\"},\"id\":\"08341234374\",\"timestamp\":1718977808400}','completed','2024-06-21 21:50:08','2024-06-21 21:50:08'), + (290,'xiaofuge','send_rebate','07126882927','{\"data\":{\"bizId\":\"xiaofuge_integral_20240622\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge\"},\"id\":\"07126882927\",\"timestamp\":1719017605989}','completed','2024-06-22 08:53:26','2024-06-22 08:53:26'), + (291,'xiaofuge','credit_adjust_success','29078560886','{\"data\":{\"amount\":10,\"orderId\":\"629518620287\",\"outBusinessNo\":\"xiaofuge_integral_20240622\",\"userId\":\"xiaofuge\"},\"id\":\"29078560886\",\"timestamp\":1719017610679}','completed','2024-06-22 08:53:30','2024-06-22 08:53:30'), + (292,'xiaofuge','credit_adjust_success','17799929018','{\"data\":{\"amount\":-1.00,\"orderId\":\"569328797999\",\"outBusinessNo\":\"581102699959\",\"userId\":\"xiaofuge\"},\"id\":\"17799929018\",\"timestamp\":1719019563097}','completed','2024-06-22 09:31:17','2024-06-22 09:31:17'), + (293,'xiaofuge','credit_adjust_success','95287430620','{\"data\":{\"amount\":-1.00,\"orderId\":\"181899571891\",\"outBusinessNo\":\"558549576217\",\"userId\":\"xiaofuge\"},\"id\":\"95287430620\",\"timestamp\":1719020746528}','completed','2024-06-22 09:45:46','2024-06-22 09:45:46'), + (294,'xiaofuge','credit_adjust_success','00851412651','{\"data\":{\"amount\":-1.00,\"orderId\":\"887819413964\",\"outBusinessNo\":\"512408648536\",\"userId\":\"xiaofuge\"},\"id\":\"00851412651\",\"timestamp\":1719020752255}','completed','2024-06-22 09:45:52','2024-06-22 09:45:52'), + (295,'xiaofuge','credit_adjust_success','67882279573','{\"data\":{\"amount\":-1.00,\"orderId\":\"876139557832\",\"outBusinessNo\":\"954851009052\",\"userId\":\"xiaofuge\"},\"id\":\"67882279573\",\"timestamp\":1719020754236}','completed','2024-06-22 09:45:54','2024-06-22 09:45:54'), + (296,'xiaofuge','credit_adjust_success','95808375372','{\"data\":{\"amount\":-1.00,\"orderId\":\"369045346137\",\"outBusinessNo\":\"156304594063\",\"userId\":\"xiaofuge\"},\"id\":\"95808375372\",\"timestamp\":1719020758207}','completed','2024-06-22 09:45:58','2024-06-22 09:45:58'), + (297,'xiaofuge','credit_adjust_success','97653280629','{\"data\":{\"amount\":-5.00,\"orderId\":\"896456690441\",\"outBusinessNo\":\"844410851560\",\"userId\":\"xiaofuge\"},\"id\":\"97653280629\",\"timestamp\":1719020968120}','completed','2024-06-22 09:49:28','2024-06-22 09:49:28'), + (298,'xiaofuge','credit_adjust_success','04579107755','{\"data\":{\"amount\":-5.00,\"orderId\":\"781364485025\",\"outBusinessNo\":\"450478498484\",\"userId\":\"xiaofuge\"},\"id\":\"04579107755\",\"timestamp\":1719020971511}','completed','2024-06-22 09:49:31','2024-06-22 09:49:31'), + (299,'xiaofuge26','send_rebate','47191139595','{\"data\":{\"bizId\":\"xiaofuge26_sku_20240622\",\"rebateConfig\":\"9014\",\"rebateType\":\"sku\",\"userId\":\"xiaofuge26\"},\"id\":\"47191139595\",\"timestamp\":1719022955379}','completed','2024-06-22 10:22:35','2024-06-22 10:22:35'), + (300,'xiaofuge26','send_rebate','58249350879','{\"data\":{\"bizId\":\"xiaofuge26_integral_20240622\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge26\"},\"id\":\"58249350879\",\"timestamp\":1719022955379}','completed','2024-06-22 10:22:35','2024-06-22 10:22:35'), + (301,'xiaofuge26','credit_adjust_success','72206280277','{\"data\":{\"amount\":10,\"orderId\":\"633312779415\",\"outBusinessNo\":\"xiaofuge26_integral_20240622\",\"userId\":\"xiaofuge26\"},\"id\":\"72206280277\",\"timestamp\":1719022955463}','completed','2024-06-22 10:22:35','2024-06-22 10:22:35'), + (302,'xiaofuge','credit_adjust_success','86345258917','{\"data\":{\"amount\":-5.00,\"orderId\":\"169352244168\",\"outBusinessNo\":\"489789224063\",\"userId\":\"xiaofuge\"},\"id\":\"86345258917\",\"timestamp\":1719025862657}','completed','2024-06-22 11:11:02','2024-06-22 11:11:02'); /*!40000 ALTER TABLE `task` ENABLE KEYS */; UNLOCK TABLES; @@ -746,7 +852,48 @@ VALUES (152,'liergou',100301,100006,'502088692031',103,'支付优惠券','2024-05-04 07:32:29','create','2024-05-04 15:32:29','2024-05-04 15:32:29'), (153,'liergou',100301,100006,'983938339728',103,'支付优惠券','2024-05-04 07:32:36','create','2024-05-04 15:32:35','2024-05-04 15:32:35'), (154,'liergou',100301,100006,'300359343610',103,'支付优惠券','2024-05-04 07:32:42','create','2024-05-04 15:32:42','2024-05-04 15:32:42'), - (155,'liergou',100301,100006,'205701271412',102,'OpenAI会员卡','2024-05-04 07:34:11','create','2024-05-04 15:34:10','2024-05-04 15:34:10'); + (155,'liergou',100301,100006,'205701271412',102,'OpenAI会员卡','2024-05-04 07:34:11','create','2024-05-04 15:34:10','2024-05-04 15:34:10'), + (156,'xiaofuge',100301,100006,'472964574229',106,'轻奢办公椅','2024-05-29 23:24:02','create','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (157,'xiaofuge',100301,100006,'096000668706',107,'小霸王游戏机','2024-05-29 23:24:02','create','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (158,'xiaofuge',100301,100006,'053808941529',107,'小霸王游戏机','2024-05-29 23:24:03','create','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (159,'xiaofuge',100301,100006,'546003504055',106,'轻奢办公椅','2024-05-29 23:24:03','create','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (160,'xiaofuge',100301,100006,'531425424850',107,'小霸王游戏机','2024-05-29 23:24:03','create','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (161,'xiaofuge',100301,100006,'101866910505',106,'轻奢办公椅','2024-06-09 08:38:08','create','2024-06-09 16:38:08','2024-06-09 16:38:08'), + (162,'xiaofuge',100301,100006,'982300492592',107,'小霸王游戏机','2024-06-09 08:39:18','create','2024-06-09 16:39:18','2024-06-09 16:39:18'), + (163,'xiaofuge',100301,100006,'910742677700',107,'小霸王游戏机','2024-06-09 08:40:27','create','2024-06-09 16:40:27','2024-06-09 16:40:27'), + (164,'xiaofuge',100301,100006,'491443986394',107,'小霸王游戏机','2024-06-09 08:48:30','create','2024-06-09 16:48:30','2024-06-09 16:48:30'), + (165,'xiaofuge',100301,100006,'185144859882',107,'小霸王游戏机','2024-06-09 08:51:52','create','2024-06-09 16:51:52','2024-06-09 16:51:52'), + (166,'xiaofuge',100301,100006,'824053366847',106,'轻奢办公椅','2024-06-09 08:54:52','create','2024-06-09 16:54:51','2024-06-09 16:54:51'), + (167,'xiaofuge',100301,100006,'261041879408',107,'小霸王游戏机','2024-06-09 08:57:05','create','2024-06-09 16:57:04','2024-06-09 16:57:04'), + (168,'xiaofuge',100301,100006,'347687076714',107,'小霸王游戏机','2024-06-09 09:50:04','create','2024-06-09 17:50:04','2024-06-09 17:50:04'), + (169,'xiaofuge',100301,100006,'686437761355',107,'小霸王游戏机','2024-06-09 10:01:21','create','2024-06-09 18:01:21','2024-06-09 18:01:21'), + (170,'xiaofuge',100301,100006,'785085017376',103,'支付优惠券','2024-06-09 10:44:44','create','2024-06-09 18:44:43','2024-06-09 18:44:43'), + (171,'xiaofuge',100301,100006,'621539805309',104,'小米台灯','2024-06-10 00:16:56','create','2024-06-10 08:16:55','2024-06-10 08:16:55'), + (172,'xiaofuge',100301,100006,'409116465954',102,'OpenAI会员卡','2024-06-10 01:32:01','create','2024-06-10 09:32:01','2024-06-10 09:32:01'), + (173,'xiaofuge',100301,100006,'425949139982',101,'随机积分','2024-06-10 01:32:02','completed','2024-06-10 09:32:01','2024-06-10 09:32:01'), + (174,'xiaofuge',100301,100006,'495003911464',104,'小米台灯','2024-06-10 01:32:02','create','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (175,'xiaofuge',100301,100006,'995078901219',102,'OpenAI会员卡','2024-06-10 01:32:02','create','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (176,'xiaofuge',100301,100006,'858859626738',103,'支付优惠券','2024-06-10 01:32:02','create','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (177,'xiaofuge',100301,100006,'053708718603',104,'小米台灯','2024-06-10 01:32:03','create','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (178,'xiaofuge',100301,100006,'297260334918',107,'小霸王游戏机','2024-06-10 01:32:03','create','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (179,'xiaofuge',100301,100006,'167963236057',103,'支付优惠券','2024-06-10 01:32:03','create','2024-06-10 09:32:03','2024-06-10 09:32:03'), + (180,'xiaofuge',100301,100006,'653777558291',103,'支付优惠券','2024-06-10 01:32:03','create','2024-06-10 09:32:03','2024-06-10 09:32:03'), + (181,'xiaofuge',100301,100006,'281047495461',102,'OpenAI会员卡','2024-06-10 01:32:03','create','2024-06-10 09:32:03','2024-06-10 09:32:03'), + (182,'xiaofuge',100301,100006,'880920828501',103,'支付优惠券','2024-06-10 01:33:43','create','2024-06-10 09:33:43','2024-06-10 09:33:43'), + (183,'xiaofuge',100301,100006,'082869528704',102,'OpenAI会员卡','2024-06-10 01:35:31','create','2024-06-10 09:35:31','2024-06-10 09:35:31'), + (184,'xiaofuge',100301,100006,'775059128414',102,'OpenAI会员卡','2024-06-10 01:36:24','create','2024-06-10 09:36:24','2024-06-10 09:36:24'), + (185,'xiaofuge',100301,100006,'156151328815',103,'支付优惠券','2024-06-10 01:36:25','create','2024-06-10 09:36:24','2024-06-10 09:36:24'), + (186,'xiaofuge',100301,100006,'118558329771',103,'支付优惠券','2024-06-10 01:36:25','create','2024-06-10 09:36:25','2024-06-10 09:36:25'), + (187,'xiaofuge',100301,100006,'427636834661',102,'OpenAI会员卡','2024-06-10 01:36:25','create','2024-06-10 09:36:25','2024-06-10 09:36:25'), + (188,'xiaofuge',100301,100006,'135758549193',102,'OpenAI会员卡','2024-06-10 01:36:25','create','2024-06-10 09:36:25','2024-06-10 09:36:25'), + (189,'xiaofuge',100301,100006,'596222110197',102,'OpenAI会员卡','2024-06-10 01:36:26','create','2024-06-10 09:36:25','2024-06-10 09:36:25'), + (190,'xiaofuge',100301,100006,'133465033320',103,'支付优惠券','2024-06-10 01:36:26','create','2024-06-10 09:36:25','2024-06-10 09:36:25'), + (191,'xiaofuge',100301,100006,'473872104570',102,'OpenAI会员卡','2024-06-10 01:36:26','create','2024-06-10 09:36:26','2024-06-10 09:36:26'), + (192,'xiaofuge',100301,100006,'423248249261',103,'支付优惠券','2024-06-10 01:36:26','create','2024-06-10 09:36:26','2024-06-10 09:36:26'), + (193,'xiaofuge',100301,100006,'308631038775',103,'支付优惠券','2024-06-10 01:36:27','create','2024-06-10 09:36:26','2024-06-10 09:36:26'), + (194,'xiaofuge',100301,100006,'519396224936',102,'OpenAI会员卡','2024-06-15 12:02:17','create','2024-06-15 20:02:17','2024-06-15 20:02:17'), + (195,'xiaofuge',100301,100006,'670420154694',103,'支付优惠券','2024-06-15 12:19:36','create','2024-06-15 20:19:36','2024-06-15 20:19:36'), + (196,'xiaofuge',100301,100006,'698760826583',103,'支付优惠券','2024-06-15 12:19:37','create','2024-06-15 20:19:36','2024-06-15 20:19:36'); /*!40000 ALTER TABLE `user_award_record_001` ENABLE KEYS */; UNLOCK TABLES; @@ -884,7 +1031,16 @@ VALUES (5,'xiaofuge','630841674684','sign','签到返利-sku额度','sku','9011','20240503','xiaofuge_sku_20240503','2024-05-03 13:28:42','2024-05-03 13:28:42'), (6,'xiaofuge','552413408368','sign','签到返利-积分','integral','10','20240503','xiaofuge_integral_20240503','2024-05-03 13:28:42','2024-05-03 13:28:42'), (33,'liergou','658660043956','sign','签到返利-sku额度','sku','9011','20240504','liergou_sku_20240504','2024-05-04 15:32:25','2024-05-04 15:32:25'), - (34,'liergou','659440313972','sign','签到返利-积分','integral','10','20240504','liergou_integral_20240504','2024-05-04 15:32:25','2024-05-04 15:32:25'); + (34,'liergou','659440313972','sign','签到返利-积分','integral','10','20240504','liergou_integral_20240504','2024-05-04 15:32:25','2024-05-04 15:32:25'), + (35,'xiaofuge','577047817885','sign','签到返利-积分','integral','10','20240601001','xiaofuge_integral_20240601001','2024-06-01 10:49:00','2024-06-01 10:49:00'), + (37,'xiaofuge','060366280132','sign','签到返利-积分','integral','10','20240601002','xiaofuge_integral_20240601002','2024-06-01 10:51:58','2024-06-01 10:51:58'), + (38,'xiaofuge','735771087688','sign','签到返利-积分','integral','10','20240601003','xiaofuge_integral_20240601003','2024-06-01 10:52:52','2024-06-01 10:52:52'), + (39,'xiaofuge','890916856671','sign','签到返利-积分','integral','10','20240601004','xiaofuge_integral_20240601004','2024-06-01 10:54:30','2024-06-01 10:54:30'), + (40,'xiaofuge','881155696490','sign','签到返利-积分','integral','10','20240601005','xiaofuge_integral_20240601005','2024-06-01 10:57:09','2024-06-01 10:57:09'), + (41,'xiaofuge','213871507610','sign','签到返利-积分','integral','10','20240601006','xiaofuge_integral_20240601006','2024-06-01 11:00:27','2024-06-01 11:00:27'), + (43,'xiaofuge','031074415283','sign','签到返利-积分','integral','10','20240601101','xiaofuge_integral_20240601101','2024-06-01 14:02:47','2024-06-01 14:02:47'), + (44,'xiaofuge','361978465199','sign','签到返利-积分','integral','10','20240621','xiaofuge_integral_20240621','2024-06-21 21:50:08','2024-06-21 21:50:08'), + (45,'xiaofuge','494235657121','sign','签到返利-积分','integral','10','20240622','xiaofuge_integral_20240622','2024-06-22 08:53:26','2024-06-22 08:53:26'); /*!40000 ALTER TABLE `user_behavior_rebate_order_001` ENABLE KEYS */; UNLOCK TABLES; @@ -950,6 +1106,16 @@ CREATE TABLE `user_behavior_rebate_order_003` ( KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户行为返利流水订单表'; +LOCK TABLES `user_behavior_rebate_order_003` WRITE; +/*!40000 ALTER TABLE `user_behavior_rebate_order_003` DISABLE KEYS */; + +INSERT INTO `user_behavior_rebate_order_003` (`id`, `user_id`, `order_id`, `behavior_type`, `rebate_desc`, `rebate_type`, `rebate_config`, `out_business_no`, `biz_id`, `create_time`, `update_time`) +VALUES + (1,'xiaofuge26','075434688710','sign','签到返利-sku额度','sku','9014','20240622','xiaofuge26_sku_20240622','2024-06-22 10:22:35','2024-06-22 10:22:35'), + (2,'xiaofuge26','318331403679','sign','签到返利-积分','integral','10','20240622','xiaofuge26_integral_20240622','2024-06-22 10:22:35','2024-06-22 10:22:35'); + +/*!40000 ALTER TABLE `user_behavior_rebate_order_003` ENABLE KEYS */; +UNLOCK TABLES; # 转储表 user_credit_account @@ -973,13 +1139,147 @@ LOCK TABLES `user_credit_account` WRITE; INSERT INTO `user_credit_account` (`id`, `user_id`, `total_amount`, `available_amount`, `account_status`, `create_time`, `update_time`) VALUES - (1,'xiaofuge',52.19,52.19,'open','2024-05-24 22:11:59','2024-05-24 22:14:22'), - (2,'user003',0.96,0.96,'open','2024-05-25 10:53:20','2024-05-25 10:54:31'); + (1,'xiaofuge',150.91,130.91,'open','2024-05-24 22:11:59','2024-06-22 11:11:02'), + (2,'user003',0.96,0.96,'open','2024-05-25 10:53:20','2024-05-25 10:54:31'), + (3,'xiaofuge26',10.00,10.00,'open','2024-06-22 10:22:35','2024-06-22 10:22:35'); /*!40000 ALTER TABLE `user_credit_account` ENABLE KEYS */; UNLOCK TABLES; +# 转储表 user_credit_order_000 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_credit_order_000`; + +CREATE TABLE `user_credit_order_000` ( + `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `user_id` varchar(32) NOT NULL COMMENT '用户ID', + `order_id` varchar(12) NOT NULL COMMENT '订单ID', + `trade_name` varchar(32) NOT NULL COMMENT '交易名称', + `trade_type` varchar(8) NOT NULL DEFAULT 'forward' COMMENT '交易类型;forward-正向、reverse-逆向', + `trade_amount` decimal(10,2) NOT NULL COMMENT '交易金额', + `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传。返利、行为等唯一标识', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_order_id` (`order_id`), + UNIQUE KEY `uq_out_business_no` (`out_business_no`), + KEY `idx_user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户积分订单记录'; + + + +# 转储表 user_credit_order_001 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_credit_order_001`; + +CREATE TABLE `user_credit_order_001` ( + `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `user_id` varchar(32) NOT NULL COMMENT '用户ID', + `order_id` varchar(12) NOT NULL COMMENT '订单ID', + `trade_name` varchar(32) NOT NULL COMMENT '交易名称', + `trade_type` varchar(8) NOT NULL DEFAULT 'forward' COMMENT '交易类型;forward-正向、reverse-逆向', + `trade_amount` decimal(10,2) NOT NULL COMMENT '交易金额', + `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传。返利、行为等唯一标识', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_order_id` (`order_id`), + UNIQUE KEY `uq_out_business_no` (`out_business_no`), + KEY `idx_user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户积分订单记录'; + +LOCK TABLES `user_credit_order_001` WRITE; +/*!40000 ALTER TABLE `user_credit_order_001` DISABLE KEYS */; + +INSERT INTO `user_credit_order_001` (`id`, `user_id`, `order_id`, `trade_name`, `trade_type`, `trade_amount`, `out_business_no`, `create_time`, `update_time`) +VALUES + (1,'xiaofuge','950333991038','行为返利','forward',10.19,'10000990990','2024-06-01 10:31:16','2024-06-01 10:31:16'), + (4,'xiaofuge','957646101468','行为返利','forward',-10.19,'10000990991','2024-06-01 10:33:26','2024-06-01 10:33:26'), + (5,'xiaofuge','105601831431','行为返利','forward',10.00,'xiaofuge_integral_20240601006','2024-06-01 11:00:45','2024-06-01 11:00:45'), + (6,'xiaofuge','120781019441','行为返利','forward',10.19,'100009900001','2024-06-01 13:57:22','2024-06-01 13:57:22'), + (7,'xiaofuge','626373070354','行为返利','reverse',-10.19,'100009900002','2024-06-01 13:58:23','2024-06-01 13:58:23'), + (8,'xiaofuge','726664203611','行为返利','forward',10.00,'xiaofuge_integral_20240601101','2024-06-01 14:02:48','2024-06-01 14:02:48'), + (9,'xiaofuge','337035866234','行为返利','forward',10.19,'100009909911','2024-06-01 14:27:20','2024-06-01 14:27:20'), + (11,'xiaofuge','904262714981','行为返利','forward',10.19,'12406039900002','2024-06-03 07:28:02','2024-06-03 07:28:02'), + (12,'xiaofuge','313070417337','兑换抽奖','reverse',-1.68,'70009240608003','2024-06-08 20:27:03','2024-06-08 20:27:03'), + (15,'xiaofuge','956437348272','兑换抽奖','reverse',-1.68,'70009240608007','2024-06-08 20:34:13','2024-06-08 20:34:13'), + (16,'xiaofuge','825697847616','兑换抽奖','reverse',-1.68,'70009240609001','2024-06-09 09:11:23','2024-06-09 09:11:23'), + (17,'xiaofuge','528225981137','兑换抽奖','reverse',-1.68,'70009240610002','2024-06-09 10:45:11','2024-06-09 10:45:11'), + (18,'xiaofuge','564697903775','兑换抽奖','reverse',1.68,'930967287605','2024-06-15 11:20:31','2024-06-15 11:20:31'), + (19,'xiaofuge','628209301378','兑换抽奖','reverse',1.68,'737554528904','2024-06-15 14:46:29','2024-06-15 14:46:29'), + (20,'xiaofuge','783120384577','行为返利','forward',10.00,'xiaofuge_integral_20240621','2024-06-21 21:50:08','2024-06-21 21:50:08'), + (21,'xiaofuge','629518620287','行为返利','forward',10.00,'xiaofuge_integral_20240622','2024-06-22 08:53:30','2024-06-22 08:53:30'), + (22,'xiaofuge','569328797999','兑换抽奖','reverse',-1.00,'581102699959','2024-06-22 09:31:16','2024-06-22 09:31:16'), + (23,'xiaofuge','181899571891','兑换抽奖','reverse',-1.00,'558549576217','2024-06-22 09:45:46','2024-06-22 09:45:46'), + (24,'xiaofuge','887819413964','兑换抽奖','reverse',-1.00,'512408648536','2024-06-22 09:45:52','2024-06-22 09:45:52'), + (25,'xiaofuge','876139557832','兑换抽奖','reverse',-1.00,'954851009052','2024-06-22 09:45:54','2024-06-22 09:45:54'), + (26,'xiaofuge','369045346137','兑换抽奖','reverse',-1.00,'156304594063','2024-06-22 09:45:58','2024-06-22 09:45:58'), + (27,'xiaofuge','896456690441','兑换抽奖','reverse',-5.00,'844410851560','2024-06-22 09:49:28','2024-06-22 09:49:28'), + (28,'xiaofuge','781364485025','兑换抽奖','reverse',-5.00,'450478498484','2024-06-22 09:49:31','2024-06-22 09:49:31'), + (29,'xiaofuge','169352244168','兑换抽奖','reverse',-5.00,'489789224063','2024-06-22 11:11:02','2024-06-22 11:11:02'); + +/*!40000 ALTER TABLE `user_credit_order_001` ENABLE KEYS */; +UNLOCK TABLES; + + +# 转储表 user_credit_order_002 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_credit_order_002`; + +CREATE TABLE `user_credit_order_002` ( + `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `user_id` varchar(32) NOT NULL COMMENT '用户ID', + `order_id` varchar(12) NOT NULL COMMENT '订单ID', + `trade_name` varchar(32) NOT NULL COMMENT '交易名称', + `trade_type` varchar(8) NOT NULL DEFAULT 'forward' COMMENT '交易类型;forward-正向、reverse-逆向', + `trade_amount` decimal(10,2) NOT NULL COMMENT '交易金额', + `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传。返利、行为等唯一标识', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_order_id` (`order_id`), + UNIQUE KEY `uq_out_business_no` (`out_business_no`), + KEY `idx_user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户积分订单记录'; + + + +# 转储表 user_credit_order_003 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_credit_order_003`; + +CREATE TABLE `user_credit_order_003` ( + `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `user_id` varchar(32) NOT NULL COMMENT '用户ID', + `order_id` varchar(12) NOT NULL COMMENT '订单ID', + `trade_name` varchar(32) NOT NULL COMMENT '交易名称', + `trade_type` varchar(8) NOT NULL DEFAULT 'forward' COMMENT '交易类型;forward-正向、reverse-逆向', + `trade_amount` decimal(10,2) NOT NULL COMMENT '交易金额', + `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传。返利、行为等唯一标识', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_order_id` (`order_id`), + UNIQUE KEY `uq_out_business_no` (`out_business_no`), + KEY `idx_user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户积分订单记录'; + +LOCK TABLES `user_credit_order_003` WRITE; +/*!40000 ALTER TABLE `user_credit_order_003` DISABLE KEYS */; + +INSERT INTO `user_credit_order_003` (`id`, `user_id`, `order_id`, `trade_name`, `trade_type`, `trade_amount`, `out_business_no`, `create_time`, `update_time`) +VALUES + (1,'xiaofuge26','633312779415','行为返利','forward',10.00,'xiaofuge26_integral_20240622','2024-06-22 10:22:35','2024-06-22 10:22:35'); + +/*!40000 ALTER TABLE `user_credit_order_003` ENABLE KEYS */; +UNLOCK TABLES; + + # 转储表 user_raffle_order_000 # ------------------------------------------------------------ @@ -1145,7 +1445,48 @@ VALUES (118,'liergou',100301,'测试活动',100006,'502088692031','2024-05-04 07:32:29','used','2024-05-04 15:32:29','2024-05-04 15:32:29'), (119,'liergou',100301,'测试活动',100006,'983938339728','2024-05-04 07:32:36','used','2024-05-04 15:32:35','2024-05-04 15:32:35'), (120,'liergou',100301,'测试活动',100006,'300359343610','2024-05-04 07:32:42','used','2024-05-04 15:32:42','2024-05-04 15:32:42'), - (121,'liergou',100301,'测试活动',100006,'205701271412','2024-05-04 07:34:11','used','2024-05-04 15:34:10','2024-05-04 15:34:10'); + (121,'liergou',100301,'测试活动',100006,'205701271412','2024-05-04 07:34:11','used','2024-05-04 15:34:10','2024-05-04 15:34:10'), + (122,'xiaofuge',100301,'测试活动',100006,'472964574229','2024-05-29 23:24:01','used','2024-05-30 07:24:01','2024-05-30 07:24:02'), + (123,'xiaofuge',100301,'测试活动',100006,'096000668706','2024-05-29 23:24:02','used','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (124,'xiaofuge',100301,'测试活动',100006,'053808941529','2024-05-29 23:24:03','used','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (125,'xiaofuge',100301,'测试活动',100006,'546003504055','2024-05-29 23:24:03','used','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (126,'xiaofuge',100301,'测试活动',100006,'531425424850','2024-05-29 23:24:03','used','2024-05-30 07:24:02','2024-05-30 07:24:02'), + (127,'xiaofuge',100301,'测试活动',100006,'101866910505','2024-05-30 00:02:18','used','2024-05-30 08:02:18','2024-06-09 16:38:08'), + (128,'xiaofuge',100301,'测试活动',100006,'982300492592','2024-06-09 08:39:17','used','2024-06-09 16:39:17','2024-06-09 16:39:18'), + (129,'xiaofuge',100301,'测试活动',100006,'910742677700','2024-06-09 08:40:26','used','2024-06-09 16:40:26','2024-06-09 16:40:27'), + (130,'xiaofuge',100301,'测试活动',100006,'491443986394','2024-06-09 08:48:29','used','2024-06-09 16:48:29','2024-06-09 16:48:30'), + (131,'xiaofuge',100301,'测试活动',100006,'185144859882','2024-06-09 08:51:51','used','2024-06-09 16:51:51','2024-06-09 16:51:52'), + (132,'xiaofuge',100301,'测试活动',100006,'824053366847','2024-06-09 08:54:51','used','2024-06-09 16:54:51','2024-06-09 16:54:51'), + (133,'xiaofuge',100301,'测试活动',100006,'261041879408','2024-06-09 08:57:04','used','2024-06-09 16:57:04','2024-06-09 16:57:04'), + (134,'xiaofuge',100301,'测试活动',100006,'347687076714','2024-06-09 09:50:04','used','2024-06-09 17:50:04','2024-06-09 17:50:04'), + (135,'xiaofuge',100301,'测试活动',100006,'686437761355','2024-06-09 10:01:21','used','2024-06-09 18:01:20','2024-06-09 18:01:21'), + (136,'xiaofuge',100301,'测试活动',100006,'785085017376','2024-06-09 10:44:43','used','2024-06-09 18:44:43','2024-06-09 18:44:43'), + (137,'xiaofuge',100301,'测试活动',100006,'621539805309','2024-06-10 00:16:55','used','2024-06-10 08:16:55','2024-06-10 08:16:55'), + (138,'xiaofuge',100301,'测试活动',100006,'409116465954','2024-06-10 01:32:00','used','2024-06-10 09:32:00','2024-06-10 09:32:01'), + (139,'xiaofuge',100301,'测试活动',100006,'425949139982','2024-06-10 01:32:02','used','2024-06-10 09:32:01','2024-06-10 09:32:01'), + (140,'xiaofuge',100301,'测试活动',100006,'495003911464','2024-06-10 01:32:02','used','2024-06-10 09:32:01','2024-06-10 09:32:02'), + (141,'xiaofuge',100301,'测试活动',100006,'995078901219','2024-06-10 01:32:02','used','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (142,'xiaofuge',100301,'测试活动',100006,'858859626738','2024-06-10 01:32:02','used','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (143,'xiaofuge',100301,'测试活动',100006,'053708718603','2024-06-10 01:32:03','used','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (144,'xiaofuge',100301,'测试活动',100006,'297260334918','2024-06-10 01:32:03','used','2024-06-10 09:32:02','2024-06-10 09:32:02'), + (145,'xiaofuge',100301,'测试活动',100006,'167963236057','2024-06-10 01:32:03','used','2024-06-10 09:32:02','2024-06-10 09:32:03'), + (146,'xiaofuge',100301,'测试活动',100006,'653777558291','2024-06-10 01:32:03','used','2024-06-10 09:32:03','2024-06-10 09:32:03'), + (147,'xiaofuge',100301,'测试活动',100006,'281047495461','2024-06-10 01:32:03','used','2024-06-10 09:32:03','2024-06-10 09:32:03'), + (148,'xiaofuge',100301,'测试活动',100006,'880920828501','2024-06-10 01:33:42','used','2024-06-10 09:33:43','2024-06-10 09:33:43'), + (149,'xiaofuge',100301,'测试活动',100006,'082869528704','2024-06-10 01:35:30','used','2024-06-10 09:35:30','2024-06-10 09:35:31'), + (150,'xiaofuge',100301,'测试活动',100006,'775059128414','2024-06-10 01:36:23','used','2024-06-10 09:36:23','2024-06-10 09:36:24'), + (151,'xiaofuge',100301,'测试活动',100006,'156151328815','2024-06-10 01:36:25','used','2024-06-10 09:36:24','2024-06-10 09:36:24'), + (152,'xiaofuge',100301,'测试活动',100006,'118558329771','2024-06-10 01:36:25','used','2024-06-10 09:36:24','2024-06-10 09:36:25'), + (153,'xiaofuge',100301,'测试活动',100006,'427636834661','2024-06-10 01:36:25','used','2024-06-10 09:36:25','2024-06-10 09:36:25'), + (154,'xiaofuge',100301,'测试活动',100006,'135758549193','2024-06-10 01:36:25','used','2024-06-10 09:36:25','2024-06-10 09:36:25'), + (155,'xiaofuge',100301,'测试活动',100006,'596222110197','2024-06-10 01:36:26','used','2024-06-10 09:36:25','2024-06-10 09:36:25'), + (156,'xiaofuge',100301,'测试活动',100006,'133465033320','2024-06-10 01:36:26','used','2024-06-10 09:36:25','2024-06-10 09:36:25'), + (157,'xiaofuge',100301,'测试活动',100006,'473872104570','2024-06-10 01:36:26','used','2024-06-10 09:36:26','2024-06-10 09:36:26'), + (158,'xiaofuge',100301,'测试活动',100006,'423248249261','2024-06-10 01:36:26','used','2024-06-10 09:36:26','2024-06-10 09:36:26'), + (159,'xiaofuge',100301,'测试活动',100006,'308631038775','2024-06-10 01:36:26','used','2024-06-10 09:36:26','2024-06-10 09:36:26'), + (160,'xiaofuge',100301,'测试活动',100006,'519396224936','2024-06-15 12:02:16','used','2024-06-15 20:02:16','2024-06-15 20:02:17'), + (161,'xiaofuge',100301,'测试活动',100006,'670420154694','2024-06-15 12:19:35','used','2024-06-15 20:19:35','2024-06-15 20:19:36'), + (162,'xiaofuge',100301,'测试活动',100006,'698760826583','2024-06-15 12:19:36','used','2024-06-15 20:19:36','2024-06-15 20:19:36'); /*!40000 ALTER TABLE `user_raffle_order_001` ENABLE KEYS */; UNLOCK TABLES; diff --git a/docs/dev-ops/mysql/sql/big_market_02.sql b/docs/dev-ops/mysql/sql/big_market_02.sql index 68139598d207aa019e3ab580638618a54e1c4054..70ccb94558998db74267e481d3f271facb81f1dd 100644 --- a/docs/dev-ops/mysql/sql/big_market_02.sql +++ b/docs/dev-ops/mysql/sql/big_market_02.sql @@ -7,7 +7,7 @@ # # 主机: 127.0.0.1 (MySQL 5.6.39) # 数据库: big_market_02 -# 生成时间: 2024-05-25 02:56:37 +0000 +# 生成时间: 2024-06-22 04:20:20 +0000 # ************************************************************ @@ -51,8 +51,14 @@ VALUES (2,'xiaofuge',100301,4,3,4,3,4,3,'2024-03-23 12:40:56','2024-03-23 13:16:40'), (3,'xiaofuge1',100301,10,9,10,9,10,9,'2024-05-03 16:01:44','2024-05-04 12:51:32'), (4,'xiaofuge2',100301,20,5,20,5,20,5,'2024-05-04 12:52:58','2024-05-04 13:57:32'), - (5,'user001',100301,100,96,100,96,100,96,'2024-05-24 22:30:54','2024-05-24 22:34:37'), - (6,'user002',100301,100,100,100,100,100,100,'2024-05-24 22:30:54','2024-05-24 22:30:54'); + (5,'user001',100301,100,91,100,91,100,91,'2024-05-24 22:30:54','2024-05-30 07:22:10'), + (6,'user002',100301,200,200,200,200,200,200,'2024-05-24 22:30:54','2024-05-27 22:42:17'), + (7,'xiaofuge22',100301,1,1,1,1,1,1,'2024-06-22 09:55:08','2024-06-22 09:55:08'), + (8,'xiaofuge23',100301,1,1,1,1,1,1,'2024-06-22 09:57:00','2024-06-22 09:57:00'), + (9,'xiaofuge24',100301,3,0,3,0,3,0,'2024-06-22 09:59:19','2024-06-22 09:59:55'), + (10,'xiaofuge25',100301,6,0,6,0,6,0,'2024-06-22 10:07:41','2024-06-22 10:20:54'), + (11,'xiaofuge100',100301,59,44,59,44,59,44,'2024-06-22 11:30:38','2024-06-22 11:37:25'), + (12,'xiaofuge101',100301,57,54,57,54,57,54,'2024-06-22 11:44:50','2024-06-22 11:53:25'); /*!40000 ALTER TABLE `raffle_activity_account` ENABLE KEYS */; UNLOCK TABLES; @@ -83,7 +89,13 @@ INSERT INTO `raffle_activity_account_day` (`id`, `user_id`, `activity_id`, `day` VALUES (1,'xiaofuge1',100301,'2024-05-04',10,9,'2024-05-04 12:51:32','2024-05-04 12:51:32'), (2,'xiaofuge2',100301,'2024-05-04',20,5,'2024-05-04 12:53:01','2024-05-04 13:57:32'), - (3,'user001',100301,'2024-05-24',100,96,'2024-05-24 22:31:47','2024-05-24 22:34:37'); + (3,'user001',100301,'2024-05-24',100,96,'2024-05-24 22:31:47','2024-05-24 22:34:37'), + (4,'user001',100301,'2024-05-27',100,97,'2024-05-27 22:39:24','2024-05-27 22:42:17'), + (5,'user001',100301,'2024-05-30',100,98,'2024-05-30 07:20:49','2024-05-30 07:22:10'), + (6,'xiaofuge24',100301,'2024-06-22',3,0,'2024-06-22 09:59:40','2024-06-22 09:59:55'), + (7,'xiaofuge25',100301,'2024-06-22',6,0,'2024-06-22 10:07:54','2024-06-22 10:20:54'), + (8,'xiaofuge100',100301,'2024-06-22',59,44,'2024-06-22 11:31:43','2024-06-22 11:37:25'), + (9,'xiaofuge101',100301,'2024-06-22',57,54,'2024-06-22 11:44:59','2024-06-22 11:53:25'); /*!40000 ALTER TABLE `raffle_activity_account_day` ENABLE KEYS */; UNLOCK TABLES; @@ -114,7 +126,11 @@ INSERT INTO `raffle_activity_account_month` (`id`, `user_id`, `activity_id`, `mo VALUES (1,'xiaofuge1',100301,'2024-05',10,9,'2024-05-04 12:51:32','2024-05-04 12:51:32'), (2,'xiaofuge2',100301,'2024-05',20,5,'2024-05-04 12:53:01','2024-05-04 13:57:32'), - (3,'user001',100301,'2024-05',100,96,'2024-05-24 22:31:47','2024-05-24 22:34:37'); + (3,'user001',100301,'2024-05',100,91,'2024-05-24 22:31:47','2024-05-30 07:22:10'), + (4,'xiaofuge24',100301,'2024-06',3,0,'2024-06-22 09:59:40','2024-06-22 09:59:55'), + (5,'xiaofuge25',100301,'2024-06',6,0,'2024-06-22 10:07:54','2024-06-22 10:20:54'), + (6,'xiaofuge100',100301,'2024-06',59,44,'2024-06-22 11:31:43','2024-06-22 11:37:25'), + (7,'xiaofuge101',100301,'2024-06',57,54,'2024-06-22 11:44:59','2024-06-22 11:53:25'); /*!40000 ALTER TABLE `raffle_activity_account_month` ENABLE KEYS */; UNLOCK TABLES; @@ -137,6 +153,7 @@ CREATE TABLE `raffle_activity_order_000` ( `total_count` int(8) NOT NULL COMMENT '总次数', `day_count` int(8) NOT NULL COMMENT '日次数', `month_count` int(8) NOT NULL COMMENT '月次数', + `pay_amount` decimal(10,2) DEFAULT NULL COMMENT '支付金额【积分】', `state` varchar(16) NOT NULL DEFAULT 'complete' COMMENT '订单状态(complete)', `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传的,确保幂等', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -150,10 +167,12 @@ CREATE TABLE `raffle_activity_order_000` ( LOCK TABLES `raffle_activity_order_000` WRITE; /*!40000 ALTER TABLE `raffle_activity_order_000` DISABLE KEYS */; -INSERT INTO `raffle_activity_order_000` (`id`, `user_id`, `sku`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `total_count`, `day_count`, `month_count`, `state`, `out_business_no`, `create_time`, `update_time`) +INSERT INTO `raffle_activity_order_000` (`id`, `user_id`, `sku`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `total_count`, `day_count`, `month_count`, `pay_amount`, `state`, `out_business_no`, `create_time`, `update_time`) VALUES - (1,'xiaofuge1',9011,100301,'测试活动',100006,'831917125310','2024-05-03 08:01:44',10,10,10,'completed','xiaofuge1_sku_20240503','2024-05-03 16:01:44','2024-05-03 16:01:44'), - (2,'user001',9011,100301,'测试活动',100006,'923549663927','2024-05-24 14:30:55',100,100,100,'completed','user001_sku_20240524','2024-05-24 22:30:54','2024-05-24 22:30:54'); + (1,'xiaofuge1',9011,100301,'测试活动',100006,'831917125310','2024-05-03 08:01:44',10,10,10,NULL,'completed','xiaofuge1_sku_20240503','2024-05-03 16:01:44','2024-05-03 16:01:44'), + (2,'user001',9011,100301,'测试活动',100006,'923549663927','2024-05-24 14:30:55',100,100,100,NULL,'completed','user001_sku_20240524','2024-05-24 22:30:54','2024-05-24 22:30:54'), + (3,'xiaofuge25',9014,100301,'测试活动',100006,'155563940984','2024-06-22 02:07:41',1,1,1,0.00,'completed','xiaofuge25_sku_20240622','2024-06-22 10:07:41','2024-06-22 10:07:41'), + (4,'xiaofuge25',9013,100301,'测试活动',100006,'760862950352','2024-06-22 02:11:51',5,5,5,20.00,'completed','404066146511','2024-06-22 10:11:50','2024-06-22 10:11:50'); /*!40000 ALTER TABLE `raffle_activity_order_000` ENABLE KEYS */; UNLOCK TABLES; @@ -176,6 +195,7 @@ CREATE TABLE `raffle_activity_order_001` ( `total_count` int(8) NOT NULL COMMENT '总次数', `day_count` int(8) NOT NULL COMMENT '日次数', `month_count` int(8) NOT NULL COMMENT '月次数', + `pay_amount` decimal(10,2) DEFAULT NULL COMMENT '支付金额【积分】', `state` varchar(16) NOT NULL DEFAULT 'complete' COMMENT '订单状态(complete)', `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传的,确保幂等', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -189,10 +209,20 @@ CREATE TABLE `raffle_activity_order_001` ( LOCK TABLES `raffle_activity_order_001` WRITE; /*!40000 ALTER TABLE `raffle_activity_order_001` DISABLE KEYS */; -INSERT INTO `raffle_activity_order_001` (`id`, `user_id`, `sku`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `total_count`, `day_count`, `month_count`, `state`, `out_business_no`, `create_time`, `update_time`) +INSERT INTO `raffle_activity_order_001` (`id`, `user_id`, `sku`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `total_count`, `day_count`, `month_count`, `pay_amount`, `state`, `out_business_no`, `create_time`, `update_time`) VALUES - (3,'xiaofuge',9011,100301,'测试活动',100006,'383240888158','2024-03-23 04:38:23',1,1,1,'completed','700091009111','2024-03-23 12:38:23','2024-03-23 12:38:23'), - (4,'user002',9011,100301,'测试活动',100006,'165083654323','2024-05-24 14:30:55',100,100,100,'completed','user002_sku_20240524','2024-05-24 22:30:54','2024-05-24 22:30:54'); + (3,'xiaofuge',9011,100301,'测试活动',100006,'383240888158','2024-03-23 04:38:23',1,1,1,NULL,'completed','700091009111','2024-03-23 12:38:23','2024-03-23 12:38:23'), + (4,'user002',9011,100301,'测试活动',100006,'165083654323','2024-05-24 14:30:55',100,100,100,NULL,'completed','user002_sku_20240524','2024-05-24 22:30:54','2024-05-24 22:30:54'), + (261,'user002',9011,100301,'测试活动',100006,'762873325216','2024-05-27 14:42:18',100,100,100,NULL,'completed','user002_sku_20240527','2024-05-27 22:42:17','2024-05-27 22:42:17'), + (262,'xiaofuge24',9014,100301,'测试活动',100006,'887306802600','2024-06-22 01:59:20',1,1,1,0.00,'completed','xiaofuge24_sku_20240622','2024-06-22 09:59:19','2024-06-22 09:59:19'), + (263,'xiaofuge24',9014,100301,'测试活动',100006,'440886795182','2024-06-22 01:59:25',1,1,1,5.00,'completed','750705533475','2024-06-22 09:59:24','2024-06-22 09:59:24'), + (264,'xiaofuge24',9014,100301,'测试活动',100006,'282163537675','2024-06-22 01:59:27',1,1,1,5.00,'completed','738796690867','2024-06-22 09:59:26','2024-06-22 09:59:26'), + (265,'xiaofuge100',9014,100301,'测试活动',100006,'197607904157','2024-06-22 03:30:38',1,1,1,0.00,'completed','xiaofuge100_sku_20240622','2024-06-22 11:30:38','2024-06-22 11:30:38'), + (266,'xiaofuge100',9014,100301,'测试活动',100006,'505791980195','2024-06-22 03:33:39',1,1,1,5.00,'completed','761630034156','2024-06-22 11:33:39','2024-06-22 11:33:39'), + (267,'xiaofuge100',9014,100301,'测试活动',100006,'958788244292','2024-06-22 03:33:41',1,1,1,5.00,'completed','698976521368','2024-06-22 11:33:41','2024-06-22 11:33:41'), + (268,'xiaofuge100',9014,100301,'测试活动',100006,'302080018611','2024-06-22 03:33:42',1,1,1,5.00,'completed','313351791785','2024-06-22 11:33:42','2024-06-22 11:33:42'), + (269,'xiaofuge100',9013,100301,'测试活动',100006,'586835924975','2024-06-22 03:33:44',5,5,5,20.00,'completed','074754086575','2024-06-22 11:33:44','2024-06-22 11:33:44'), + (270,'xiaofuge100',9012,100301,'测试活动',100006,'333711998605','2024-06-22 03:34:23',50,50,50,100.00,'completed','776248180705','2024-06-22 11:34:22','2024-06-22 11:34:22'); /*!40000 ALTER TABLE `raffle_activity_order_001` ENABLE KEYS */; UNLOCK TABLES; @@ -215,6 +245,7 @@ CREATE TABLE `raffle_activity_order_002` ( `total_count` int(8) NOT NULL COMMENT '总次数', `day_count` int(8) NOT NULL COMMENT '日次数', `month_count` int(8) NOT NULL COMMENT '月次数', + `pay_amount` decimal(10,2) DEFAULT NULL COMMENT '支付金额【积分】', `state` varchar(16) NOT NULL DEFAULT 'complete' COMMENT '订单状态(complete)', `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传的,确保幂等', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -225,6 +256,19 @@ CREATE TABLE `raffle_activity_order_002` ( KEY `idx_user_id_activity_id` (`user_id`,`activity_id`,`state`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='抽奖活动单'; +LOCK TABLES `raffle_activity_order_002` WRITE; +/*!40000 ALTER TABLE `raffle_activity_order_002` DISABLE KEYS */; + +INSERT INTO `raffle_activity_order_002` (`id`, `user_id`, `sku`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `total_count`, `day_count`, `month_count`, `pay_amount`, `state`, `out_business_no`, `create_time`, `update_time`) +VALUES + (1,'xiaofuge23',9014,100301,'测试活动',100006,'695621433142','2024-06-22 01:57:01',1,1,1,0.00,'completed','xiaofuge23_sku_20240622','2024-06-22 09:57:00','2024-06-22 09:57:00'), + (2,'xiaofuge101',9014,100301,'测试活动',100006,'979296847664','2024-06-22 03:44:50',1,1,1,0.00,'completed','xiaofuge101_sku_20240622','2024-06-22 11:44:50','2024-06-22 11:44:50'), + (3,'xiaofuge101',9014,100301,'测试活动',100006,'260145574246','2024-06-22 03:45:46',1,1,1,5.00,'completed','647675002899','2024-06-22 11:45:46','2024-06-22 11:45:46'), + (4,'xiaofuge101',9013,100301,'测试活动',100006,'062133331093','2024-06-22 03:45:49',5,5,5,20.00,'completed','945591704953','2024-06-22 11:45:48','2024-06-22 11:45:49'), + (5,'xiaofuge101',9012,100301,'测试活动',100006,'702656117291','2024-06-22 03:46:07',50,50,50,100.00,'completed','371514189773','2024-06-22 11:46:07','2024-06-22 11:46:07'); + +/*!40000 ALTER TABLE `raffle_activity_order_002` ENABLE KEYS */; +UNLOCK TABLES; # 转储表 raffle_activity_order_003 @@ -244,6 +288,7 @@ CREATE TABLE `raffle_activity_order_003` ( `total_count` int(8) NOT NULL COMMENT '总次数', `day_count` int(8) NOT NULL COMMENT '日次数', `month_count` int(8) NOT NULL COMMENT '月次数', + `pay_amount` decimal(10,2) DEFAULT NULL COMMENT '支付金额【积分】', `state` varchar(16) NOT NULL DEFAULT 'complete' COMMENT '订单状态(complete)', `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传的,确保幂等', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -257,9 +302,10 @@ CREATE TABLE `raffle_activity_order_003` ( LOCK TABLES `raffle_activity_order_003` WRITE; /*!40000 ALTER TABLE `raffle_activity_order_003` DISABLE KEYS */; -INSERT INTO `raffle_activity_order_003` (`id`, `user_id`, `sku`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `total_count`, `day_count`, `month_count`, `state`, `out_business_no`, `create_time`, `update_time`) +INSERT INTO `raffle_activity_order_003` (`id`, `user_id`, `sku`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `total_count`, `day_count`, `month_count`, `pay_amount`, `state`, `out_business_no`, `create_time`, `update_time`) VALUES - (2,'xiaofuge2',9011,100301,'测试活动',100006,'942458887115','2024-05-04 05:07:53',10,10,10,'completed','xiaofuge2_sku_20240504','2024-05-04 13:07:53','2024-05-04 13:07:53'); + (2,'xiaofuge2',9011,100301,'测试活动',100006,'942458887115','2024-05-04 05:07:53',10,10,10,NULL,'completed','xiaofuge2_sku_20240504','2024-05-04 13:07:53','2024-05-04 13:07:53'), + (3,'xiaofuge22',9014,100301,'测试活动',100006,'384557932017','2024-06-22 01:55:09',1,1,1,0.00,'completed','xiaofuge22_sku_20240622','2024-06-22 09:55:08','2024-06-22 09:55:08'); /*!40000 ALTER TABLE `raffle_activity_order_003` ENABLE KEYS */; UNLOCK TABLES; @@ -319,7 +365,69 @@ VALUES (27,'user001','send_award','97971125221','{\"data\":{\"awardConfig\":\"0.01,1\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"391668886086\",\"userId\":\"user001\"},\"id\":\"97971125221\",\"timestamp\":1716561114657}','completed','2024-05-24 22:31:55','2024-05-24 22:31:55'), (28,'user001','send_award','89552334625','{\"data\":{\"awardConfig\":\"0.01,1\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"179191128326\",\"userId\":\"user001\"},\"id\":\"89552334625\",\"timestamp\":1716561182606}','completed','2024-05-24 22:33:02','2024-05-24 22:33:02'), (29,'user001','send_award','12743392424','{\"data\":{\"awardConfig\":\"0.01,1\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"320625987421\",\"userId\":\"user001\"},\"id\":\"12743392424\",\"timestamp\":1716561244275}','completed','2024-05-24 22:34:04','2024-05-24 22:34:04'), - (30,'user001','send_award','50175032521','{\"data\":{\"awardConfig\":\"0.01,1\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"290879207548\",\"userId\":\"user001\"},\"id\":\"50175032521\",\"timestamp\":1716561277990}','completed','2024-05-24 22:34:38','2024-05-24 22:34:38'); + (30,'user001','send_award','50175032521','{\"data\":{\"awardConfig\":\"0.01,1\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"290879207548\",\"userId\":\"user001\"},\"id\":\"50175032521\",\"timestamp\":1716561277990}','completed','2024-05-24 22:34:38','2024-05-24 22:34:38'), + (31,'user002','send_rebate','33869647355','{\"data\":{\"bizId\":\"user002_sku_20240527\",\"rebateConfig\":\"9011\",\"rebateType\":\"sku\",\"userId\":\"user002\"},\"id\":\"33869647355\",\"timestamp\":1716820626795}','completed','2024-05-27 22:37:07','2024-05-27 22:37:07'), + (32,'user002','send_rebate','66382556237','{\"data\":{\"bizId\":\"user002_integral_20240527\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"user002\"},\"id\":\"66382556237\",\"timestamp\":1716820626797}','completed','2024-05-27 22:37:07','2024-05-27 22:37:07'), + (33,'user001','send_award','61143330592','{\"data\":{\"awardConfig\":\"0.01,1\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"539811500095\",\"userId\":\"user001\"},\"id\":\"61143330592\",\"timestamp\":1716820764302}','completed','2024-05-27 22:39:24','2024-05-27 22:39:24'), + (34,'user001','send_award','93461178922','{\"data\":{\"awardConfig\":\"0.01,1\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"405619392079\",\"userId\":\"user001\"},\"id\":\"93461178922\",\"timestamp\":1716820886701}','completed','2024-05-27 22:41:26','2024-05-27 22:41:26'), + (35,'user001','send_award','00073222856','{\"data\":{\"awardConfig\":\"0.01,1\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"130698860415\",\"userId\":\"user001\"},\"id\":\"00073222856\",\"timestamp\":1716820937997}','completed','2024-05-27 22:42:18','2024-05-27 22:42:18'), + (36,'user001','send_award','79139422874','{\"data\":{\"awardConfig\":\"0.01,1\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"777907205658\",\"userId\":\"user001\"},\"id\":\"79139422874\",\"timestamp\":1717024849194}','completed','2024-05-30 07:20:49','2024-05-30 07:20:49'), + (37,'user001','send_award','19870027158','{\"data\":{\"awardConfig\":\"0.01,1\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"037106411824\",\"userId\":\"user001\"},\"id\":\"19870027158\",\"timestamp\":1717024930458}','completed','2024-05-30 07:22:10','2024-05-30 07:22:10'), + (38,'xiaofuge22','send_rebate','74434256061','{\"data\":{\"bizId\":\"xiaofuge22_sku_20240622\",\"rebateConfig\":\"9014\",\"rebateType\":\"sku\",\"userId\":\"xiaofuge22\"},\"id\":\"74434256061\",\"timestamp\":1719021178881}','completed','2024-06-22 09:52:58','2024-06-22 09:52:58'), + (39,'xiaofuge22','send_rebate','11615452652','{\"data\":{\"bizId\":\"xiaofuge22_integral_20240622\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge22\"},\"id\":\"11615452652\",\"timestamp\":1719021178886}','completed','2024-06-22 09:52:58','2024-06-22 09:52:58'), + (40,'xiaofuge23','send_rebate','64531943772','{\"data\":{\"bizId\":\"xiaofuge23_sku_20240622\",\"rebateConfig\":\"9014\",\"rebateType\":\"sku\",\"userId\":\"xiaofuge23\"},\"id\":\"64531943772\",\"timestamp\":1719021420428}','completed','2024-06-22 09:57:00','2024-06-22 09:57:00'), + (41,'xiaofuge23','send_rebate','32940966305','{\"data\":{\"bizId\":\"xiaofuge23_integral_20240622\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge23\"},\"id\":\"32940966305\",\"timestamp\":1719021420431}','completed','2024-06-22 09:57:00','2024-06-22 09:57:00'), + (42,'xiaofuge23','credit_adjust_success','24009811387','{\"data\":{\"amount\":10,\"orderId\":\"724677881464\",\"outBusinessNo\":\"xiaofuge23_integral_20240622\",\"userId\":\"xiaofuge23\"},\"id\":\"24009811387\",\"timestamp\":1719021420760}','completed','2024-06-22 09:57:00','2024-06-22 09:57:00'), + (43,'xiaofuge24','send_rebate','93076650934','{\"data\":{\"bizId\":\"xiaofuge24_sku_20240622\",\"rebateConfig\":\"9014\",\"rebateType\":\"sku\",\"userId\":\"xiaofuge24\"},\"id\":\"93076650934\",\"timestamp\":1719021559510}','completed','2024-06-22 09:59:19','2024-06-22 09:59:19'), + (44,'xiaofuge24','send_rebate','02279664282','{\"data\":{\"bizId\":\"xiaofuge24_integral_20240622\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge24\"},\"id\":\"02279664282\",\"timestamp\":1719021559510}','completed','2024-06-22 09:59:19','2024-06-22 09:59:19'), + (45,'xiaofuge24','credit_adjust_success','05811142160','{\"data\":{\"amount\":10,\"orderId\":\"929908709864\",\"outBusinessNo\":\"xiaofuge24_integral_20240622\",\"userId\":\"xiaofuge24\"},\"id\":\"05811142160\",\"timestamp\":1719021559672}','completed','2024-06-22 09:59:19','2024-06-22 09:59:19'), + (46,'xiaofuge24','credit_adjust_success','28326779079','{\"data\":{\"amount\":-5.00,\"orderId\":\"209411906995\",\"outBusinessNo\":\"750705533475\",\"userId\":\"xiaofuge24\"},\"id\":\"28326779079\",\"timestamp\":1719021564708}','completed','2024-06-22 09:59:24','2024-06-22 09:59:24'), + (47,'xiaofuge24','credit_adjust_success','93156684477','{\"data\":{\"amount\":-5.00,\"orderId\":\"470247343587\",\"outBusinessNo\":\"738796690867\",\"userId\":\"xiaofuge24\"},\"id\":\"93156684477\",\"timestamp\":1719021566642}','completed','2024-06-22 09:59:26','2024-06-22 09:59:26'), + (48,'xiaofuge24','send_award','96731396756','{\"data\":{\"awardId\":108,\"awardTitle\":\"暴走玩偶\",\"orderId\":\"837829954453\",\"userId\":\"xiaofuge24\"},\"id\":\"96731396756\",\"timestamp\":1719021580424}','completed','2024-06-22 09:59:40','2024-06-22 09:59:40'), + (49,'xiaofuge24','send_award','27216247558','{\"data\":{\"awardId\":108,\"awardTitle\":\"暴走玩偶\",\"orderId\":\"692282780900\",\"userId\":\"xiaofuge24\"},\"id\":\"27216247558\",\"timestamp\":1719021588332}','completed','2024-06-22 09:59:48','2024-06-22 09:59:48'), + (50,'xiaofuge24','send_award','08301307816','{\"data\":{\"awardId\":106,\"awardTitle\":\"轻奢办公椅\",\"orderId\":\"998461237887\",\"userId\":\"xiaofuge24\"},\"id\":\"08301307816\",\"timestamp\":1719021596087}','completed','2024-06-22 09:59:56','2024-06-22 09:59:56'), + (51,'xiaofuge25','send_rebate','99512680174','{\"data\":{\"bizId\":\"xiaofuge25_sku_20240622\",\"rebateConfig\":\"9014\",\"rebateType\":\"sku\",\"userId\":\"xiaofuge25\"},\"id\":\"99512680174\",\"timestamp\":1719022060809}','completed','2024-06-22 10:07:40','2024-06-22 10:07:40'), + (52,'xiaofuge25','send_rebate','49590114210','{\"data\":{\"bizId\":\"xiaofuge25_integral_20240622\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge25\"},\"id\":\"49590114210\",\"timestamp\":1719022060818}','completed','2024-06-22 10:07:40','2024-06-22 10:07:40'), + (53,'xiaofuge25','credit_adjust_success','26340747168','{\"data\":{\"amount\":10,\"orderId\":\"479481818661\",\"outBusinessNo\":\"xiaofuge25_integral_20240622\",\"userId\":\"xiaofuge25\"},\"id\":\"26340747168\",\"timestamp\":1719022061708}','completed','2024-06-22 10:07:41','2024-06-22 10:07:41'), + (54,'xiaofuge25','send_award','40237601404','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"067670700350\",\"userId\":\"xiaofuge25\"},\"id\":\"40237601404\",\"timestamp\":1719022074559}','completed','2024-06-22 10:07:54','2024-06-22 10:07:54'), + (55,'xiaofuge25','credit_adjust_success','13286186376','{\"data\":{\"amount\":-20.00,\"orderId\":\"981030218405\",\"outBusinessNo\":\"404066146511\",\"userId\":\"xiaofuge25\"},\"id\":\"13286186376\",\"timestamp\":1719022310843}','completed','2024-06-22 10:11:50','2024-06-22 10:11:50'), + (56,'xiaofuge25','send_award','18165161268','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"733298505993\",\"userId\":\"xiaofuge25\"},\"id\":\"18165161268\",\"timestamp\":1719022318849}','completed','2024-06-22 10:11:58','2024-06-22 10:11:58'), + (57,'xiaofuge25','send_award','40972020012','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"148282410120\",\"userId\":\"xiaofuge25\"},\"id\":\"40972020012\",\"timestamp\":1719022366759}','completed','2024-06-22 10:12:46','2024-06-22 10:12:46'), + (58,'xiaofuge25','send_award','43532053705','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"068213439911\",\"userId\":\"xiaofuge25\"},\"id\":\"43532053705\",\"timestamp\":1719022642908}','completed','2024-06-22 10:17:22','2024-06-22 10:17:22'), + (59,'xiaofuge25','send_award','57020293715','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"355946005992\",\"userId\":\"xiaofuge25\"},\"id\":\"57020293715\",\"timestamp\":1719022843337}','completed','2024-06-22 10:20:43','2024-06-22 10:20:43'), + (60,'xiaofuge25','send_award','83244065969','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"010903932739\",\"userId\":\"xiaofuge25\"},\"id\":\"83244065969\",\"timestamp\":1719022854058}','completed','2024-06-22 10:20:54','2024-06-22 10:20:54'), + (61,'xiaofuge100','send_rebate','38566670630','{\"data\":{\"bizId\":\"xiaofuge100_sku_20240622\",\"rebateConfig\":\"9014\",\"rebateType\":\"sku\",\"userId\":\"xiaofuge100\"},\"id\":\"38566670630\",\"timestamp\":1719027037814}','completed','2024-06-22 11:30:37','2024-06-22 11:30:37'), + (62,'xiaofuge100','send_rebate','44646981368','{\"data\":{\"bizId\":\"xiaofuge100_integral_20240622\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge100\"},\"id\":\"44646981368\",\"timestamp\":1719027037836}','completed','2024-06-22 11:30:37','2024-06-22 11:30:37'), + (63,'xiaofuge100','credit_adjust_success','50575383439','{\"data\":{\"amount\":10,\"orderId\":\"084053486083\",\"outBusinessNo\":\"xiaofuge100_integral_20240622\",\"userId\":\"xiaofuge100\"},\"id\":\"50575383439\",\"timestamp\":1719027038114}','completed','2024-06-22 11:30:38','2024-06-22 11:30:38'), + (64,'xiaofuge100','send_award','93400504062','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"438098073325\",\"userId\":\"xiaofuge100\"},\"id\":\"93400504062\",\"timestamp\":1719027103972}','completed','2024-06-22 11:31:43','2024-06-22 11:31:44'), + (65,'xiaofuge100','credit_adjust_success','25836549674','{\"data\":{\"amount\":-5.00,\"orderId\":\"615817318859\",\"outBusinessNo\":\"761630034156\",\"userId\":\"xiaofuge100\"},\"id\":\"25836549674\",\"timestamp\":1719027219385}','completed','2024-06-22 11:33:39','2024-06-22 11:33:39'), + (66,'xiaofuge100','credit_adjust_success','10704990246','{\"data\":{\"amount\":-5.00,\"orderId\":\"305661362619\",\"outBusinessNo\":\"698976521368\",\"userId\":\"xiaofuge100\"},\"id\":\"10704990246\",\"timestamp\":1719027221168}','completed','2024-06-22 11:33:41','2024-06-22 11:33:41'), + (67,'xiaofuge100','credit_adjust_success','76886376162','{\"data\":{\"amount\":-5.00,\"orderId\":\"159597937845\",\"outBusinessNo\":\"313351791785\",\"userId\":\"xiaofuge100\"},\"id\":\"76886376162\",\"timestamp\":1719027222129}','completed','2024-06-22 11:33:42','2024-06-22 11:33:42'), + (68,'xiaofuge100','credit_adjust_success','48346636873','{\"data\":{\"amount\":-20.00,\"orderId\":\"482204967835\",\"outBusinessNo\":\"074754086575\",\"userId\":\"xiaofuge100\"},\"id\":\"48346636873\",\"timestamp\":1719027224068}','completed','2024-06-22 11:33:44','2024-06-22 11:33:44'), + (69,'xiaofuge100','send_award','81839810710','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"649778516231\",\"userId\":\"xiaofuge100\"},\"id\":\"81839810710\",\"timestamp\":1719027234563}','completed','2024-06-22 11:33:54','2024-06-22 11:33:54'), + (70,'xiaofuge100','send_award','80359413706','{\"data\":{\"awardConfig\":\"1,100\",\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"703127392964\",\"userId\":\"xiaofuge100\"},\"id\":\"80359413706\",\"timestamp\":1719027244594}','completed','2024-06-22 11:34:04','2024-06-22 11:34:04'), + (71,'xiaofuge100','send_award','38835607635','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"735180280972\",\"userId\":\"xiaofuge100\"},\"id\":\"38835607635\",\"timestamp\":1719027255729}','completed','2024-06-22 11:34:15','2024-06-22 11:34:15'), + (72,'xiaofuge100','credit_adjust_success','68488779767','{\"data\":{\"amount\":-100.00,\"orderId\":\"634804779698\",\"outBusinessNo\":\"776248180705\",\"userId\":\"xiaofuge100\"},\"id\":\"68488779767\",\"timestamp\":1719027262797}','completed','2024-06-22 11:34:22','2024-06-22 11:34:22'), + (73,'xiaofuge100','send_award','02924268577','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"735049174888\",\"userId\":\"xiaofuge100\"},\"id\":\"02924268577\",\"timestamp\":1719027270469}','completed','2024-06-22 11:34:30','2024-06-22 11:34:30'), + (74,'xiaofuge100','send_award','63987547257','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"489474305920\",\"userId\":\"xiaofuge100\"},\"id\":\"63987547257\",\"timestamp\":1719027278809}','completed','2024-06-22 11:34:38','2024-06-22 11:34:38'), + (75,'xiaofuge100','send_award','30589146577','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"366923803771\",\"userId\":\"xiaofuge100\"},\"id\":\"30589146577\",\"timestamp\":1719027285737}','completed','2024-06-22 11:34:45','2024-06-22 11:34:45'), + (76,'xiaofuge100','send_award','77183962291','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"288120745406\",\"userId\":\"xiaofuge100\"},\"id\":\"77183962291\",\"timestamp\":1719027292897}','completed','2024-06-22 11:34:52','2024-06-22 11:34:52'), + (77,'xiaofuge100','send_award','03028752574','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"334527462588\",\"userId\":\"xiaofuge100\"},\"id\":\"03028752574\",\"timestamp\":1719027300160}','completed','2024-06-22 11:35:00','2024-06-22 11:35:00'), + (78,'xiaofuge100','send_award','94248581780','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"056158603651\",\"userId\":\"xiaofuge100\"},\"id\":\"94248581780\",\"timestamp\":1719027307778}','completed','2024-06-22 11:35:07','2024-06-22 11:35:07'), + (79,'xiaofuge100','send_award','55852600106','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"369341382235\",\"userId\":\"xiaofuge100\"},\"id\":\"55852600106\",\"timestamp\":1719027321175}','completed','2024-06-22 11:35:21','2024-06-22 11:35:21'), + (80,'xiaofuge100','send_award','16980276024','{\"data\":{\"awardId\":102,\"awardTitle\":\"OpenAI会员卡\",\"orderId\":\"383018329411\",\"userId\":\"xiaofuge100\"},\"id\":\"16980276024\",\"timestamp\":1719027328789}','completed','2024-06-22 11:35:28','2024-06-22 11:35:28'), + (81,'xiaofuge100','send_award','36942780204','{\"data\":{\"awardId\":102,\"awardTitle\":\"OpenAI会员卡\",\"orderId\":\"062927684538\",\"userId\":\"xiaofuge100\"},\"id\":\"36942780204\",\"timestamp\":1719027403846}','completed','2024-06-22 11:36:44','2024-06-22 11:36:44'), + (82,'xiaofuge100','send_award','99791280875','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"865157771554\",\"userId\":\"xiaofuge100\"},\"id\":\"99791280875\",\"timestamp\":1719027431483}','completed','2024-06-22 11:37:11','2024-06-22 11:37:11'), + (83,'xiaofuge100','send_award','53816527649','{\"data\":{\"awardId\":103,\"awardTitle\":\"支付优惠券\",\"orderId\":\"339567817759\",\"userId\":\"xiaofuge100\"},\"id\":\"53816527649\",\"timestamp\":1719027445422}','completed','2024-06-22 11:37:25','2024-06-22 11:37:25'), + (84,'xiaofuge101','send_rebate','04851408102','{\"data\":{\"bizId\":\"xiaofuge101_sku_20240622\",\"rebateConfig\":\"9014\",\"rebateType\":\"sku\",\"userId\":\"xiaofuge101\"},\"id\":\"04851408102\",\"timestamp\":1719027890200}','completed','2024-06-22 11:44:50','2024-06-22 11:44:50'), + (85,'xiaofuge101','send_rebate','84997259654','{\"data\":{\"bizId\":\"xiaofuge101_integral_20240622\",\"rebateConfig\":\"10\",\"rebateType\":\"integral\",\"userId\":\"xiaofuge101\"},\"id\":\"84997259654\",\"timestamp\":1719027890206}','completed','2024-06-22 11:44:50','2024-06-22 11:44:50'), + (86,'xiaofuge101','credit_adjust_success','04559967533','{\"data\":{\"amount\":10,\"orderId\":\"425407842825\",\"outBusinessNo\":\"xiaofuge101_integral_20240622\",\"userId\":\"xiaofuge101\"},\"id\":\"04559967533\",\"timestamp\":1719027890421}','completed','2024-06-22 11:44:50','2024-06-22 11:44:50'), + (87,'xiaofuge101','send_award','86675040094','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"003840436800\",\"userId\":\"xiaofuge101\"},\"id\":\"86675040094\",\"timestamp\":1719027899661}','completed','2024-06-22 11:44:59','2024-06-22 11:44:59'), + (88,'xiaofuge101','credit_adjust_success','21099377099','{\"data\":{\"amount\":-5.00,\"orderId\":\"215791493342\",\"outBusinessNo\":\"647675002899\",\"userId\":\"xiaofuge101\"},\"id\":\"21099377099\",\"timestamp\":1719027946359}','completed','2024-06-22 11:45:46','2024-06-22 11:45:46'), + (89,'xiaofuge101','credit_adjust_success','41718311389','{\"data\":{\"amount\":-20.00,\"orderId\":\"022638554686\",\"outBusinessNo\":\"945591704953\",\"userId\":\"xiaofuge101\"},\"id\":\"41718311389\",\"timestamp\":1719027949001}','completed','2024-06-22 11:45:49','2024-06-22 11:45:49'), + (90,'xiaofuge101','send_award','62652401481','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"261982488893\",\"userId\":\"xiaofuge101\"},\"id\":\"62652401481\",\"timestamp\":1719027960311}','completed','2024-06-22 11:46:00','2024-06-22 11:46:00'), + (91,'xiaofuge101','credit_adjust_success','55874129101','{\"data\":{\"amount\":-100.00,\"orderId\":\"631098732490\",\"outBusinessNo\":\"371514189773\",\"userId\":\"xiaofuge101\"},\"id\":\"55874129101\",\"timestamp\":1719027967263}','completed','2024-06-22 11:46:07','2024-06-22 11:46:07'), + (92,'xiaofuge101','send_award','28244124087','{\"data\":{\"awardId\":101,\"awardTitle\":\"随机积分\",\"orderId\":\"509036893328\",\"userId\":\"xiaofuge101\"},\"id\":\"28244124087\",\"timestamp\":1719028405863}','completed','2024-06-22 11:53:25','2024-06-22 11:53:25'); /*!40000 ALTER TABLE `task` ENABLE KEYS */; UNLOCK TABLES; @@ -358,7 +466,18 @@ VALUES (2,'user001',100301,100006,'391668886086',101,'随机积分','2024-05-24 14:31:47','create','2024-05-24 22:31:55','2024-05-24 22:31:55'), (3,'user001',100301,100006,'179191128326',101,'随机积分','2024-05-24 14:33:03','create','2024-05-24 22:33:02','2024-05-24 22:33:02'), (4,'user001',100301,100006,'320625987421',101,'随机积分','2024-05-24 14:34:02','completed','2024-05-24 22:34:04','2024-05-24 22:34:19'), - (5,'user001',100301,100006,'290879207548',101,'随机积分','2024-05-24 14:34:38','completed','2024-05-24 22:34:38','2024-05-24 22:34:38'); + (5,'user001',100301,100006,'290879207548',101,'随机积分','2024-05-24 14:34:38','completed','2024-05-24 22:34:38','2024-05-24 22:34:38'), + (6,'user001',100301,100006,'539811500095',101,'随机积分','2024-05-27 14:39:24','completed','2024-05-27 22:39:24','2024-05-27 22:41:26'), + (7,'user001',100301,100006,'405619392079',101,'随机积分','2024-05-27 14:41:27','completed','2024-05-27 22:41:26','2024-05-27 22:41:26'), + (8,'user001',100301,100006,'130698860415',101,'随机积分','2024-05-27 14:42:18','completed','2024-05-27 22:42:18','2024-05-27 22:42:18'), + (9,'user001',100301,100006,'777907205658',101,'随机积分','2024-05-29 23:20:49','completed','2024-05-30 07:20:49','2024-05-30 07:20:49'), + (10,'user001',100301,100006,'037106411824',101,'随机积分','2024-05-29 23:22:10','completed','2024-05-30 07:22:10','2024-05-30 07:22:10'), + (11,'xiaofuge25',100301,100006,'067670700350',101,'随机积分','2024-06-22 02:07:55','completed','2024-06-22 10:07:54','2024-06-22 10:07:54'), + (12,'xiaofuge25',100301,100006,'733298505993',101,'随机积分','2024-06-22 02:11:59','completed','2024-06-22 10:11:58','2024-06-22 10:11:58'), + (13,'xiaofuge25',100301,100006,'148282410120',101,'随机积分','2024-06-22 02:12:47','completed','2024-06-22 10:12:46','2024-06-22 10:12:46'), + (14,'xiaofuge25',100301,100006,'068213439911',101,'随机积分','2024-06-22 02:17:23','completed','2024-06-22 10:17:22','2024-06-22 10:17:22'), + (15,'xiaofuge25',100301,100006,'355946005992',101,'随机积分','2024-06-22 02:20:43','completed','2024-06-22 10:20:43','2024-06-22 10:20:43'), + (16,'xiaofuge25',100301,100006,'010903932739',101,'随机积分','2024-06-22 02:20:54','completed','2024-06-22 10:20:54','2024-06-22 10:20:54'); /*!40000 ALTER TABLE `user_award_record_000` ENABLE KEYS */; UNLOCK TABLES; @@ -388,6 +507,32 @@ CREATE TABLE `user_award_record_001` ( KEY `idx_award_id` (`strategy_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户中奖记录表'; +LOCK TABLES `user_award_record_001` WRITE; +/*!40000 ALTER TABLE `user_award_record_001` DISABLE KEYS */; + +INSERT INTO `user_award_record_001` (`id`, `user_id`, `activity_id`, `strategy_id`, `order_id`, `award_id`, `award_title`, `award_time`, `award_state`, `create_time`, `update_time`) +VALUES + (1,'xiaofuge24',100301,100006,'837829954453',108,'暴走玩偶','2024-06-22 01:59:40','create','2024-06-22 09:59:40','2024-06-22 09:59:40'), + (2,'xiaofuge24',100301,100006,'692282780900',108,'暴走玩偶','2024-06-22 01:59:48','create','2024-06-22 09:59:48','2024-06-22 09:59:48'), + (3,'xiaofuge24',100301,100006,'998461237887',106,'轻奢办公椅','2024-06-22 01:59:56','create','2024-06-22 09:59:56','2024-06-22 09:59:56'), + (4,'xiaofuge100',100301,100006,'438098073325',101,'随机积分','2024-06-22 03:31:44','completed','2024-06-22 11:31:43','2024-06-22 11:31:44'), + (5,'xiaofuge100',100301,100006,'649778516231',101,'随机积分','2024-06-22 03:33:55','completed','2024-06-22 11:33:54','2024-06-22 11:33:54'), + (6,'xiaofuge100',100301,100006,'703127392964',101,'随机积分','2024-06-22 03:34:05','completed','2024-06-22 11:34:04','2024-06-22 11:34:04'), + (7,'xiaofuge100',100301,100006,'735180280972',101,'随机积分','2024-06-22 03:34:16','completed','2024-06-22 11:34:15','2024-06-22 11:34:15'), + (8,'xiaofuge100',100301,100006,'735049174888',101,'随机积分','2024-06-22 03:34:30','completed','2024-06-22 11:34:30','2024-06-22 11:34:30'), + (9,'xiaofuge100',100301,100006,'489474305920',101,'随机积分','2024-06-22 03:34:39','completed','2024-06-22 11:34:38','2024-06-22 11:34:38'), + (10,'xiaofuge100',100301,100006,'366923803771',101,'随机积分','2024-06-22 03:34:46','completed','2024-06-22 11:34:45','2024-06-22 11:34:45'), + (11,'xiaofuge100',100301,100006,'288120745406',101,'随机积分','2024-06-22 03:34:53','completed','2024-06-22 11:34:52','2024-06-22 11:34:52'), + (12,'xiaofuge100',100301,100006,'334527462588',101,'随机积分','2024-06-22 03:35:00','completed','2024-06-22 11:35:00','2024-06-22 11:35:00'), + (13,'xiaofuge100',100301,100006,'056158603651',103,'支付优惠券','2024-06-22 03:35:08','create','2024-06-22 11:35:07','2024-06-22 11:35:07'), + (14,'xiaofuge100',100301,100006,'369341382235',103,'支付优惠券','2024-06-22 03:35:21','create','2024-06-22 11:35:21','2024-06-22 11:35:21'), + (15,'xiaofuge100',100301,100006,'383018329411',102,'OpenAI会员卡','2024-06-22 03:35:29','create','2024-06-22 11:35:28','2024-06-22 11:35:28'), + (16,'xiaofuge100',100301,100006,'062927684538',102,'OpenAI会员卡','2024-06-22 03:36:44','create','2024-06-22 11:36:44','2024-06-22 11:36:44'), + (17,'xiaofuge100',100301,100006,'865157771554',103,'支付优惠券','2024-06-22 03:37:11','create','2024-06-22 11:37:11','2024-06-22 11:37:11'), + (18,'xiaofuge100',100301,100006,'339567817759',103,'支付优惠券','2024-06-22 03:37:25','create','2024-06-22 11:37:25','2024-06-22 11:37:25'); + +/*!40000 ALTER TABLE `user_award_record_001` ENABLE KEYS */; +UNLOCK TABLES; # 转储表 user_award_record_002 @@ -414,6 +559,17 @@ CREATE TABLE `user_award_record_002` ( KEY `idx_award_id` (`strategy_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户中奖记录表'; +LOCK TABLES `user_award_record_002` WRITE; +/*!40000 ALTER TABLE `user_award_record_002` DISABLE KEYS */; + +INSERT INTO `user_award_record_002` (`id`, `user_id`, `activity_id`, `strategy_id`, `order_id`, `award_id`, `award_title`, `award_time`, `award_state`, `create_time`, `update_time`) +VALUES + (1,'xiaofuge101',100301,100006,'003840436800',101,'随机积分','2024-06-22 03:45:00','completed','2024-06-22 11:44:59','2024-06-22 11:44:59'), + (2,'xiaofuge101',100301,100006,'261982488893',101,'随机积分','2024-06-22 03:46:00','completed','2024-06-22 11:46:00','2024-06-22 11:46:00'), + (3,'xiaofuge101',100301,100006,'509036893328',101,'随机积分','2024-06-22 03:53:26','completed','2024-06-22 11:53:25','2024-06-22 11:53:25'); + +/*!40000 ALTER TABLE `user_award_record_002` ENABLE KEYS */; +UNLOCK TABLES; # 转储表 user_award_record_003 @@ -496,7 +652,9 @@ VALUES (5,'xiaofuge1','883971522401','sign','签到返利-sku额度','sku','9011','20240503','xiaofuge1_sku_20240503','2024-05-03 16:01:42','2024-05-03 16:01:42'), (6,'xiaofuge1','995944930386','sign','签到返利-积分','integral','10','20240503','xiaofuge1_integral_20240503','2024-05-03 16:01:43','2024-05-03 16:01:43'), (7,'user001','153309768984','sign','签到返利-sku额度','sku','9011','20240524','user001_sku_20240524','2024-05-24 22:25:09','2024-05-24 22:25:09'), - (8,'user001','922397055482','sign','签到返利-积分','integral','10','20240524','user001_integral_20240524','2024-05-24 22:25:09','2024-05-24 22:25:09'); + (8,'user001','922397055482','sign','签到返利-积分','integral','10','20240524','user001_integral_20240524','2024-05-24 22:25:09','2024-05-24 22:25:09'), + (9,'xiaofuge25','049961446285','sign','签到返利-sku额度','sku','9014','20240622','xiaofuge25_sku_20240622','2024-06-22 10:07:40','2024-06-22 10:07:40'), + (10,'xiaofuge25','311903567924','sign','签到返利-积分','integral','10','20240622','xiaofuge25_integral_20240622','2024-06-22 10:07:40','2024-06-22 10:07:40'); /*!40000 ALTER TABLE `user_behavior_rebate_order_000` ENABLE KEYS */; UNLOCK TABLES; @@ -531,7 +689,13 @@ LOCK TABLES `user_behavior_rebate_order_001` WRITE; INSERT INTO `user_behavior_rebate_order_001` (`id`, `user_id`, `order_id`, `behavior_type`, `rebate_desc`, `rebate_type`, `rebate_config`, `out_business_no`, `biz_id`, `create_time`, `update_time`) VALUES (1,'user002','791847185524','sign','签到返利-sku额度','sku','9011','20240524','user002_sku_20240524','2024-05-24 22:29:11','2024-05-24 22:29:11'), - (2,'user002','119018837248','sign','签到返利-积分','integral','10','20240524','user002_integral_20240524','2024-05-24 22:29:11','2024-05-24 22:29:11'); + (2,'user002','119018837248','sign','签到返利-积分','integral','10','20240524','user002_integral_20240524','2024-05-24 22:29:11','2024-05-24 22:29:11'), + (3,'user002','031618502370','sign','签到返利-sku额度','sku','9011','20240527','user002_sku_20240527','2024-05-27 22:37:06','2024-05-27 22:37:06'), + (4,'user002','591157608900','sign','签到返利-积分','integral','10','20240527','user002_integral_20240527','2024-05-27 22:37:07','2024-05-27 22:37:07'), + (5,'xiaofuge24','532714815440','sign','签到返利-sku额度','sku','9014','20240622','xiaofuge24_sku_20240622','2024-06-22 09:59:19','2024-06-22 09:59:19'), + (6,'xiaofuge24','886487876823','sign','签到返利-积分','integral','10','20240622','xiaofuge24_integral_20240622','2024-06-22 09:59:19','2024-06-22 09:59:19'), + (7,'xiaofuge100','114867898811','sign','签到返利-sku额度','sku','9014','20240622','xiaofuge100_sku_20240622','2024-06-22 11:30:37','2024-06-22 11:30:37'), + (8,'xiaofuge100','846316816808','sign','签到返利-积分','integral','10','20240622','xiaofuge100_integral_20240622','2024-06-22 11:30:37','2024-06-22 11:30:37'); /*!40000 ALTER TABLE `user_behavior_rebate_order_001` ENABLE KEYS */; UNLOCK TABLES; @@ -560,6 +724,18 @@ CREATE TABLE `user_behavior_rebate_order_002` ( KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户行为返利流水订单表'; +LOCK TABLES `user_behavior_rebate_order_002` WRITE; +/*!40000 ALTER TABLE `user_behavior_rebate_order_002` DISABLE KEYS */; + +INSERT INTO `user_behavior_rebate_order_002` (`id`, `user_id`, `order_id`, `behavior_type`, `rebate_desc`, `rebate_type`, `rebate_config`, `out_business_no`, `biz_id`, `create_time`, `update_time`) +VALUES + (1,'xiaofuge23','674540833668','sign','签到返利-sku额度','sku','9014','20240622','xiaofuge23_sku_20240622','2024-06-22 09:57:00','2024-06-22 09:57:00'), + (2,'xiaofuge23','682003973896','sign','签到返利-积分','integral','10','20240622','xiaofuge23_integral_20240622','2024-06-22 09:57:00','2024-06-22 09:57:00'), + (3,'xiaofuge101','016416761475','sign','签到返利-sku额度','sku','9014','20240622','xiaofuge101_sku_20240622','2024-06-22 11:44:50','2024-06-22 11:44:50'), + (4,'xiaofuge101','836048823314','sign','签到返利-积分','integral','10','20240622','xiaofuge101_integral_20240622','2024-06-22 11:44:50','2024-06-22 11:44:50'); + +/*!40000 ALTER TABLE `user_behavior_rebate_order_002` ENABLE KEYS */; +UNLOCK TABLES; # 转储表 user_behavior_rebate_order_003 @@ -591,7 +767,9 @@ LOCK TABLES `user_behavior_rebate_order_003` WRITE; INSERT INTO `user_behavior_rebate_order_003` (`id`, `user_id`, `order_id`, `behavior_type`, `rebate_desc`, `rebate_type`, `rebate_config`, `out_business_no`, `biz_id`, `create_time`, `update_time`) VALUES (7,'xiaofuge2','298513989210','sign','签到返利-sku额度','sku','9011','20240504','xiaofuge2_sku_20240504','2024-05-04 13:07:53','2024-05-04 13:07:53'), - (8,'xiaofuge2','352651244433','sign','签到返利-积分','integral','10','20240504','xiaofuge2_integral_20240504','2024-05-04 13:07:53','2024-05-04 13:07:53'); + (8,'xiaofuge2','352651244433','sign','签到返利-积分','integral','10','20240504','xiaofuge2_integral_20240504','2024-05-04 13:07:53','2024-05-04 13:07:53'), + (9,'xiaofuge22','769157142538','sign','签到返利-sku额度','sku','9014','20240622','xiaofuge22_sku_20240622','2024-06-22 09:52:58','2024-06-22 09:52:58'), + (10,'xiaofuge22','718932497750','sign','签到返利-积分','integral','10','20240622','xiaofuge22_integral_20240622','2024-06-22 09:52:58','2024-06-22 09:52:58'); /*!40000 ALTER TABLE `user_behavior_rebate_order_003` ENABLE KEYS */; UNLOCK TABLES; @@ -618,12 +796,149 @@ LOCK TABLES `user_credit_account` WRITE; INSERT INTO `user_credit_account` (`id`, `user_id`, `total_amount`, `available_amount`, `account_status`, `create_time`, `update_time`) VALUES - (2,'user001',0.71,0.71,'open','2024-05-24 22:34:19','2024-05-24 22:34:38'); + (2,'user001',3.65,3.65,'open','2024-05-24 22:34:19','2024-05-30 07:22:10'), + (3,'xiaofuge23',10.00,10.00,'open','2024-06-22 09:57:00','2024-06-22 09:57:00'), + (4,'xiaofuge24',10.00,0.00,'open','2024-06-22 09:59:19','2024-06-22 09:59:26'), + (5,'xiaofuge25',363.30,343.30,'open','2024-06-22 10:07:41','2024-06-22 10:20:54'), + (6,'xiaofuge100',400.61,265.61,'open','2024-06-22 11:30:38','2024-06-22 11:35:00'), + (7,'xiaofuge101',175.80,50.80,'open','2024-06-22 11:44:50','2024-06-22 11:53:25'); /*!40000 ALTER TABLE `user_credit_account` ENABLE KEYS */; UNLOCK TABLES; +# 转储表 user_credit_order_000 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_credit_order_000`; + +CREATE TABLE `user_credit_order_000` ( + `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `user_id` varchar(32) NOT NULL COMMENT '用户ID', + `order_id` varchar(12) NOT NULL COMMENT '订单ID', + `trade_name` varchar(32) NOT NULL COMMENT '交易名称', + `trade_type` varchar(8) NOT NULL DEFAULT 'forward' COMMENT '交易类型;forward-正向、reverse-逆向', + `trade_amount` decimal(10,2) NOT NULL COMMENT '交易金额', + `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传。返利、行为等唯一标识', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_order_id` (`order_id`), + UNIQUE KEY `uq_out_business_no` (`out_business_no`), + KEY `idx_user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户积分订单记录'; + +LOCK TABLES `user_credit_order_000` WRITE; +/*!40000 ALTER TABLE `user_credit_order_000` DISABLE KEYS */; + +INSERT INTO `user_credit_order_000` (`id`, `user_id`, `order_id`, `trade_name`, `trade_type`, `trade_amount`, `out_business_no`, `create_time`, `update_time`) +VALUES + (1,'xiaofuge25','479481818661','行为返利','forward',10.00,'xiaofuge25_integral_20240622','2024-06-22 10:07:41','2024-06-22 10:07:41'), + (2,'xiaofuge25','981030218405','兑换抽奖','reverse',-20.00,'404066146511','2024-06-22 10:11:50','2024-06-22 10:11:50'); + +/*!40000 ALTER TABLE `user_credit_order_000` ENABLE KEYS */; +UNLOCK TABLES; + + +# 转储表 user_credit_order_001 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_credit_order_001`; + +CREATE TABLE `user_credit_order_001` ( + `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `user_id` varchar(32) NOT NULL COMMENT '用户ID', + `order_id` varchar(12) NOT NULL COMMENT '订单ID', + `trade_name` varchar(32) NOT NULL COMMENT '交易名称', + `trade_type` varchar(8) NOT NULL DEFAULT 'forward' COMMENT '交易类型;forward-正向、reverse-逆向', + `trade_amount` decimal(10,2) NOT NULL COMMENT '交易金额', + `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传。返利、行为等唯一标识', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_order_id` (`order_id`), + UNIQUE KEY `uq_out_business_no` (`out_business_no`), + KEY `idx_user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户积分订单记录'; + +LOCK TABLES `user_credit_order_001` WRITE; +/*!40000 ALTER TABLE `user_credit_order_001` DISABLE KEYS */; + +INSERT INTO `user_credit_order_001` (`id`, `user_id`, `order_id`, `trade_name`, `trade_type`, `trade_amount`, `out_business_no`, `create_time`, `update_time`) +VALUES + (1,'xiaofuge24','929908709864','行为返利','forward',10.00,'xiaofuge24_integral_20240622','2024-06-22 09:59:19','2024-06-22 09:59:19'), + (2,'xiaofuge24','209411906995','兑换抽奖','reverse',-5.00,'750705533475','2024-06-22 09:59:24','2024-06-22 09:59:24'), + (3,'xiaofuge24','470247343587','兑换抽奖','reverse',-5.00,'738796690867','2024-06-22 09:59:26','2024-06-22 09:59:26'), + (4,'xiaofuge100','084053486083','行为返利','forward',10.00,'xiaofuge100_integral_20240622','2024-06-22 11:30:38','2024-06-22 11:30:38'), + (5,'xiaofuge100','615817318859','兑换抽奖','reverse',-5.00,'761630034156','2024-06-22 11:33:39','2024-06-22 11:33:39'), + (6,'xiaofuge100','305661362619','兑换抽奖','reverse',-5.00,'698976521368','2024-06-22 11:33:41','2024-06-22 11:33:41'), + (7,'xiaofuge100','159597937845','兑换抽奖','reverse',-5.00,'313351791785','2024-06-22 11:33:42','2024-06-22 11:33:42'), + (8,'xiaofuge100','482204967835','兑换抽奖','reverse',-20.00,'074754086575','2024-06-22 11:33:44','2024-06-22 11:33:44'), + (9,'xiaofuge100','634804779698','兑换抽奖','reverse',-100.00,'776248180705','2024-06-22 11:34:22','2024-06-22 11:34:22'); + +/*!40000 ALTER TABLE `user_credit_order_001` ENABLE KEYS */; +UNLOCK TABLES; + + +# 转储表 user_credit_order_002 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_credit_order_002`; + +CREATE TABLE `user_credit_order_002` ( + `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `user_id` varchar(32) NOT NULL COMMENT '用户ID', + `order_id` varchar(12) NOT NULL COMMENT '订单ID', + `trade_name` varchar(32) NOT NULL COMMENT '交易名称', + `trade_type` varchar(8) NOT NULL DEFAULT 'forward' COMMENT '交易类型;forward-正向、reverse-逆向', + `trade_amount` decimal(10,2) NOT NULL COMMENT '交易金额', + `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传。返利、行为等唯一标识', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_order_id` (`order_id`), + UNIQUE KEY `uq_out_business_no` (`out_business_no`), + KEY `idx_user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户积分订单记录'; + +LOCK TABLES `user_credit_order_002` WRITE; +/*!40000 ALTER TABLE `user_credit_order_002` DISABLE KEYS */; + +INSERT INTO `user_credit_order_002` (`id`, `user_id`, `order_id`, `trade_name`, `trade_type`, `trade_amount`, `out_business_no`, `create_time`, `update_time`) +VALUES + (1,'xiaofuge23','724677881464','行为返利','forward',10.00,'xiaofuge23_integral_20240622','2024-06-22 09:57:00','2024-06-22 09:57:00'), + (2,'xiaofuge101','425407842825','行为返利','forward',10.00,'xiaofuge101_integral_20240622','2024-06-22 11:44:50','2024-06-22 11:44:50'), + (3,'xiaofuge101','215791493342','兑换抽奖','reverse',-5.00,'647675002899','2024-06-22 11:45:46','2024-06-22 11:45:46'), + (4,'xiaofuge101','022638554686','兑换抽奖','reverse',-20.00,'945591704953','2024-06-22 11:45:49','2024-06-22 11:45:49'), + (5,'xiaofuge101','631098732490','兑换抽奖','reverse',-100.00,'371514189773','2024-06-22 11:46:07','2024-06-22 11:46:07'); + +/*!40000 ALTER TABLE `user_credit_order_002` ENABLE KEYS */; +UNLOCK TABLES; + + +# 转储表 user_credit_order_003 +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `user_credit_order_003`; + +CREATE TABLE `user_credit_order_003` ( + `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `user_id` varchar(32) NOT NULL COMMENT '用户ID', + `order_id` varchar(12) NOT NULL COMMENT '订单ID', + `trade_name` varchar(32) NOT NULL COMMENT '交易名称', + `trade_type` varchar(8) NOT NULL DEFAULT 'forward' COMMENT '交易类型;forward-正向、reverse-逆向', + `trade_amount` decimal(10,2) NOT NULL COMMENT '交易金额', + `out_business_no` varchar(64) NOT NULL COMMENT '业务仿重ID - 外部透传。返利、行为等唯一标识', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uq_order_id` (`order_id`), + UNIQUE KEY `uq_out_business_no` (`out_business_no`), + KEY `idx_user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户积分订单记录'; + + + # 转储表 user_raffle_order_000 # ------------------------------------------------------------ @@ -654,7 +969,18 @@ VALUES (2,'user001',100301,'测试活动',100006,'391668886086','2024-05-24 14:31:46','used','2024-05-24 22:31:47','2024-05-24 22:31:55'), (3,'user001',100301,'测试活动',100006,'179191128326','2024-05-24 14:33:02','used','2024-05-24 22:33:02','2024-05-24 22:33:02'), (4,'user001',100301,'测试活动',100006,'320625987421','2024-05-24 14:34:01','used','2024-05-24 22:34:01','2024-05-24 22:34:04'), - (5,'user001',100301,'测试活动',100006,'290879207548','2024-05-24 14:34:37','used','2024-05-24 22:34:37','2024-05-24 22:34:38'); + (5,'user001',100301,'测试活动',100006,'290879207548','2024-05-24 14:34:37','used','2024-05-24 22:34:37','2024-05-24 22:34:38'), + (6,'user001',100301,'测试活动',100006,'539811500095','2024-05-27 14:39:24','used','2024-05-27 22:39:24','2024-05-27 22:39:24'), + (7,'user001',100301,'测试活动',100006,'405619392079','2024-05-27 14:41:26','used','2024-05-27 22:41:26','2024-05-27 22:41:26'), + (8,'user001',100301,'测试活动',100006,'130698860415','2024-05-27 14:42:18','used','2024-05-27 22:42:17','2024-05-27 22:42:18'), + (9,'user001',100301,'测试活动',100006,'777907205658','2024-05-29 23:20:49','used','2024-05-30 07:20:49','2024-05-30 07:20:49'), + (10,'user001',100301,'测试活动',100006,'037106411824','2024-05-29 23:22:10','used','2024-05-30 07:22:10','2024-05-30 07:22:10'), + (11,'xiaofuge25',100301,'测试活动',100006,'067670700350','2024-06-22 02:07:54','used','2024-06-22 10:07:54','2024-06-22 10:07:54'), + (12,'xiaofuge25',100301,'测试活动',100006,'733298505993','2024-06-22 02:11:59','used','2024-06-22 10:11:58','2024-06-22 10:11:58'), + (13,'xiaofuge25',100301,'测试活动',100006,'148282410120','2024-06-22 02:12:47','used','2024-06-22 10:12:46','2024-06-22 10:12:46'), + (14,'xiaofuge25',100301,'测试活动',100006,'068213439911','2024-06-22 02:17:23','used','2024-06-22 10:17:22','2024-06-22 10:17:22'), + (15,'xiaofuge25',100301,'测试活动',100006,'355946005992','2024-06-22 02:20:43','used','2024-06-22 10:20:43','2024-06-22 10:20:43'), + (16,'xiaofuge25',100301,'测试活动',100006,'010903932739','2024-06-22 02:20:54','used','2024-06-22 10:20:54','2024-06-22 10:20:54'); /*!40000 ALTER TABLE `user_raffle_order_000` ENABLE KEYS */; UNLOCK TABLES; @@ -681,6 +1007,32 @@ CREATE TABLE `user_raffle_order_001` ( KEY `idx_user_id_activity_id` (`user_id`,`activity_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户抽奖订单表'; +LOCK TABLES `user_raffle_order_001` WRITE; +/*!40000 ALTER TABLE `user_raffle_order_001` DISABLE KEYS */; + +INSERT INTO `user_raffle_order_001` (`id`, `user_id`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `order_state`, `create_time`, `update_time`) +VALUES + (1,'xiaofuge24',100301,'测试活动',100006,'837829954453','2024-06-22 01:59:40','used','2024-06-22 09:59:40','2024-06-22 09:59:40'), + (2,'xiaofuge24',100301,'测试活动',100006,'692282780900','2024-06-22 01:59:48','used','2024-06-22 09:59:48','2024-06-22 09:59:48'), + (3,'xiaofuge24',100301,'测试活动',100006,'998461237887','2024-06-22 01:59:56','used','2024-06-22 09:59:55','2024-06-22 09:59:56'), + (4,'xiaofuge100',100301,'测试活动',100006,'438098073325','2024-06-22 03:31:43','used','2024-06-22 11:31:43','2024-06-22 11:31:43'), + (5,'xiaofuge100',100301,'测试活动',100006,'649778516231','2024-06-22 03:33:54','used','2024-06-22 11:33:54','2024-06-22 11:33:54'), + (6,'xiaofuge100',100301,'测试活动',100006,'703127392964','2024-06-22 03:34:04','used','2024-06-22 11:34:04','2024-06-22 11:34:04'), + (7,'xiaofuge100',100301,'测试活动',100006,'735180280972','2024-06-22 03:34:16','used','2024-06-22 11:34:15','2024-06-22 11:34:15'), + (8,'xiaofuge100',100301,'测试活动',100006,'735049174888','2024-06-22 03:34:30','used','2024-06-22 11:34:30','2024-06-22 11:34:30'), + (9,'xiaofuge100',100301,'测试活动',100006,'489474305920','2024-06-22 03:34:39','used','2024-06-22 11:34:38','2024-06-22 11:34:38'), + (10,'xiaofuge100',100301,'测试活动',100006,'366923803771','2024-06-22 03:34:46','used','2024-06-22 11:34:45','2024-06-22 11:34:45'), + (11,'xiaofuge100',100301,'测试活动',100006,'288120745406','2024-06-22 03:34:53','used','2024-06-22 11:34:52','2024-06-22 11:34:52'), + (12,'xiaofuge100',100301,'测试活动',100006,'334527462588','2024-06-22 03:35:00','used','2024-06-22 11:35:00','2024-06-22 11:35:00'), + (13,'xiaofuge100',100301,'测试活动',100006,'056158603651','2024-06-22 03:35:08','used','2024-06-22 11:35:07','2024-06-22 11:35:07'), + (14,'xiaofuge100',100301,'测试活动',100006,'369341382235','2024-06-22 03:35:21','used','2024-06-22 11:35:21','2024-06-22 11:35:21'), + (15,'xiaofuge100',100301,'测试活动',100006,'383018329411','2024-06-22 03:35:29','used','2024-06-22 11:35:28','2024-06-22 11:35:28'), + (16,'xiaofuge100',100301,'测试活动',100006,'062927684538','2024-06-22 03:36:43','used','2024-06-22 11:36:43','2024-06-22 11:36:44'), + (17,'xiaofuge100',100301,'测试活动',100006,'865157771554','2024-06-22 03:37:11','used','2024-06-22 11:37:11','2024-06-22 11:37:11'), + (18,'xiaofuge100',100301,'测试活动',100006,'339567817759','2024-06-22 03:37:25','used','2024-06-22 11:37:25','2024-06-22 11:37:25'); + +/*!40000 ALTER TABLE `user_raffle_order_001` ENABLE KEYS */; +UNLOCK TABLES; # 转储表 user_raffle_order_002 @@ -704,6 +1056,17 @@ CREATE TABLE `user_raffle_order_002` ( KEY `idx_user_id_activity_id` (`user_id`,`activity_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户抽奖订单表'; +LOCK TABLES `user_raffle_order_002` WRITE; +/*!40000 ALTER TABLE `user_raffle_order_002` DISABLE KEYS */; + +INSERT INTO `user_raffle_order_002` (`id`, `user_id`, `activity_id`, `activity_name`, `strategy_id`, `order_id`, `order_time`, `order_state`, `create_time`, `update_time`) +VALUES + (1,'xiaofuge101',100301,'测试活动',100006,'003840436800','2024-06-22 03:44:59','used','2024-06-22 11:44:59','2024-06-22 11:44:59'), + (2,'xiaofuge101',100301,'测试活动',100006,'261982488893','2024-06-22 03:46:00','used','2024-06-22 11:46:00','2024-06-22 11:46:00'), + (3,'xiaofuge101',100301,'测试活动',100006,'509036893328','2024-06-22 03:53:26','used','2024-06-22 11:53:25','2024-06-22 11:53:25'); + +/*!40000 ALTER TABLE `user_raffle_order_002` ENABLE KEYS */; +UNLOCK TABLES; # 转储表 user_raffle_order_003 diff --git a/docs/dev-ops/mysql/sql/nacos.sql b/docs/dev-ops/mysql/sql/nacos.sql new file mode 100644 index 0000000000000000000000000000000000000000..b2d0725bf099dbd86cb17aa38538ae137662a602 --- /dev/null +++ b/docs/dev-ops/mysql/sql/nacos.sql @@ -0,0 +1,302 @@ +# ************************************************************ +# Sequel Ace SQL dump +# 版本号: 20050 +# +# https://sequel-ace.com/ +# https://github.com/Sequel-Ace/Sequel-Ace +# +# 主机: 127.0.0.1 (MySQL 8.0.32) +# 数据库: nacos_config +# 生成时间: 2023-11-03 06:44:40 +0000 +# ************************************************************ + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +SET NAMES utf8mb4; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE='NO_AUTO_VALUE_ON_ZERO', SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +CREATE database if NOT EXISTS `nacos_config` default character set utf8mb4 collate utf8mb4_0900_ai_ci; + +use `nacos_config`; + +# 转储表 config_info +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `config_info`; + +CREATE TABLE `config_info` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) COLLATE utf8mb3_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) COLLATE utf8mb3_bin DEFAULT NULL, + `content` longtext COLLATE utf8mb3_bin NOT NULL COMMENT 'content', + `md5` varchar(32) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + `src_user` text COLLATE utf8mb3_bin COMMENT 'source user', + `src_ip` varchar(20) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'source ip', + `app_name` varchar(128) COLLATE utf8mb3_bin DEFAULT NULL, + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT '租户字段', + `c_desc` varchar(256) COLLATE utf8mb3_bin DEFAULT NULL, + `c_use` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL, + `effect` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL, + `type` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL, + `c_schema` text COLLATE utf8mb3_bin, + `encrypted_data_key` text COLLATE utf8mb3_bin NOT NULL COMMENT '秘钥', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='config_info'; + + + +# 转储表 config_info_aggr +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `config_info_aggr`; + +CREATE TABLE `config_info_aggr` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) COLLATE utf8mb3_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'group_id', + `datum_id` varchar(255) COLLATE utf8mb3_bin NOT NULL COMMENT 'datum_id', + `content` longtext COLLATE utf8mb3_bin NOT NULL COMMENT '内容', + `gmt_modified` datetime NOT NULL COMMENT '修改时间', + `app_name` varchar(128) COLLATE utf8mb3_bin DEFAULT NULL, + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT '租户字段', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='增加租户字段'; + + + +# 转储表 config_info_beta +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `config_info_beta`; + +CREATE TABLE `config_info_beta` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) COLLATE utf8mb3_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'group_id', + `app_name` varchar(128) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'app_name', + `content` longtext COLLATE utf8mb3_bin NOT NULL COMMENT 'content', + `beta_ips` varchar(1024) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'betaIps', + `md5` varchar(32) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + `src_user` text COLLATE utf8mb3_bin COMMENT 'source user', + `src_ip` varchar(20) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'source ip', + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` text COLLATE utf8mb3_bin NOT NULL COMMENT '秘钥', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='config_info_beta'; + + + +# 转储表 config_info_tag +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `config_info_tag`; + +CREATE TABLE `config_info_tag` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) COLLATE utf8mb3_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT 'tenant_id', + `tag_id` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'tag_id', + `app_name` varchar(128) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'app_name', + `content` longtext COLLATE utf8mb3_bin NOT NULL COMMENT 'content', + `md5` varchar(32) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + `src_user` text COLLATE utf8mb3_bin COMMENT 'source user', + `src_ip` varchar(20) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'source ip', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='config_info_tag'; + + + +# 转储表 config_tags_relation +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `config_tags_relation`; + +CREATE TABLE `config_tags_relation` ( + `id` bigint NOT NULL COMMENT 'id', + `tag_name` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'tag_name', + `tag_type` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'tag_type', + `data_id` varchar(255) COLLATE utf8mb3_bin NOT NULL COMMENT 'data_id', + `group_id` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT 'tenant_id', + `nid` bigint NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`nid`), + UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='config_tag_relation'; + + + +# 转储表 group_capacity +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `group_capacity`; + +CREATE TABLE `group_capacity` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `group_id` varchar(128) COLLATE utf8mb3_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', + `quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', + `usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量', + `max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值', + `max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', + `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_group_id` (`group_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='集群、各Group容量信息表'; + + + +# 转储表 his_config_info +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `his_config_info`; + +CREATE TABLE `his_config_info` ( + `id` bigint unsigned NOT NULL, + `nid` bigint unsigned NOT NULL AUTO_INCREMENT, + `data_id` varchar(255) COLLATE utf8mb3_bin NOT NULL, + `group_id` varchar(128) COLLATE utf8mb3_bin NOT NULL, + `app_name` varchar(128) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'app_name', + `content` longtext COLLATE utf8mb3_bin NOT NULL, + `md5` varchar(32) COLLATE utf8mb3_bin DEFAULT NULL, + `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00', + `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00', + `src_user` text COLLATE utf8mb3_bin, + `src_ip` varchar(20) COLLATE utf8mb3_bin DEFAULT NULL, + `op_type` char(10) COLLATE utf8mb3_bin DEFAULT NULL, + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` text COLLATE utf8mb3_bin NOT NULL COMMENT '秘钥', + PRIMARY KEY (`nid`), + KEY `idx_gmt_create` (`gmt_create`), + KEY `idx_gmt_modified` (`gmt_modified`), + KEY `idx_did` (`data_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='多租户改造'; + + + +# 转储表 permissions +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `permissions`; + +CREATE TABLE `permissions` ( + `role` varchar(50) NOT NULL, + `resource` varchar(512) NOT NULL, + `action` varchar(8) NOT NULL, + UNIQUE KEY `uk_role_permission` (`role`,`resource`,`action`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + + + +# 转储表 roles +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `roles`; + +CREATE TABLE `roles` ( + `username` varchar(50) NOT NULL, + `role` varchar(50) NOT NULL, + UNIQUE KEY `uk_username_role` (`username`,`role`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +LOCK TABLES `roles` WRITE; +/*!40000 ALTER TABLE `roles` DISABLE KEYS */; + +INSERT INTO `roles` (`username`, `role`) +VALUES + ('nacos','ROLE_ADMIN'); + +/*!40000 ALTER TABLE `roles` ENABLE KEYS */; +UNLOCK TABLES; + + +# 转储表 tenant_capacity +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `tenant_capacity`; + +CREATE TABLE `tenant_capacity` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenant_id` varchar(128) COLLATE utf8mb3_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID', + `quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', + `usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量', + `max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数', + `max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', + `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='租户容量信息表'; + + + +# 转储表 tenant_info +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `tenant_info`; + +CREATE TABLE `tenant_info` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `kp` varchar(128) COLLATE utf8mb3_bin NOT NULL COMMENT 'kp', + `tenant_id` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT 'tenant_id', + `tenant_name` varchar(128) COLLATE utf8mb3_bin DEFAULT '' COMMENT 'tenant_name', + `tenant_desc` varchar(256) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'tenant_desc', + `create_source` varchar(32) COLLATE utf8mb3_bin DEFAULT NULL COMMENT 'create_source', + `gmt_create` bigint NOT NULL COMMENT '创建时间', + `gmt_modified` bigint NOT NULL COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='tenant_info'; + + + +# 转储表 users +# ------------------------------------------------------------ + +DROP TABLE IF EXISTS `users`; + +CREATE TABLE `users` ( + `username` varchar(50) NOT NULL, + `password` varchar(500) NOT NULL, + `enabled` tinyint(1) NOT NULL, + PRIMARY KEY (`username`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +LOCK TABLES `users` WRITE; +/*!40000 ALTER TABLE `users` DISABLE KEYS */; + +INSERT INTO `users` (`username`, `password`, `enabled`) +VALUES + ('nacos','$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu',1); + +/*!40000 ALTER TABLE `users` ENABLE KEYS */; +UNLOCK TABLES; + + + +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/docs/dev-ops/redis/users.acl b/docs/dev-ops/redis/users.acl deleted file mode 100644 index b56c1f47326a5cf5cf8900f8ebcec6aacf7cabc2..0000000000000000000000000000000000000000 --- a/docs/dev-ops/redis/users.acl +++ /dev/null @@ -1 +0,0 @@ -user admin on >admin allcommands allkeys \ No newline at end of file diff --git a/docs/dev-ops/zkCli.sh b/docs/dev-ops/zkCli.sh new file mode 100644 index 0000000000000000000000000000000000000000..116e972014ce65169d1cf55a079f3a83f6ed0830 --- /dev/null +++ b/docs/dev-ops/zkCli.sh @@ -0,0 +1 @@ +zkCli.sh -server 192.168.1.67:2181 diff --git a/docs/dev-ops/zookeeper.sh b/docs/dev-ops/zookeeper.sh new file mode 100644 index 0000000000000000000000000000000000000000..cc6250b57b4853b94856541fe0718aba414037b8 --- /dev/null +++ b/docs/dev-ops/zookeeper.sh @@ -0,0 +1 @@ +docker exec -it zookeeper bash \ No newline at end of file diff --git a/pom.xml b/pom.xml index c9f1fe362c91cef2d380046f2f82644212a84fd5..8fd55be0efbfd29690fd7ec2e3042b5b4b96cfdd 100644 --- a/pom.xml +++ b/pom.xml @@ -103,23 +103,45 @@ org.redisson redisson-spring-boot-starter - 3.23.4 - - - cn.bugstack.middleware - db-router-spring-boot-starter - 1.0.2 + 3.26.0 org.jeasy easy-random-core 4.3.0 + + + cn.bugstack.middleware + db-router-spring-boot-starter + 1.0.2 + + org.springframework.boot spring-boot-starter-amqp 3.2.0 + + org.apache.dubbo + dubbo + 3.0.9 + + + org.apache.dubbo + dubbo-spring-boot-starter + 3.0.9 + + + com.alibaba.nacos + nacos-client + 2.1.0 + + + org.springframework.cloud + spring-cloud-starter-zookeeper-discovery + 3.1.4 + cn.bugstack