提交 a4c8bafb 编写于 作者: 鲸落和鲨掉's avatar 鲸落和鲨掉

引入Dubbo分布式框架和Zookeeper配置中心+添加积分兑换服务和接口

上级 5f0ef351
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/docs/dev-ops/mysql/sql/big_market.sql" dialect="MySQL" />
<file url="file://$PROJECT_DIR$/docs/dev-ops/mysql/sql/big_market_01.sql" dialect="MySQL" />
<file url="file://$PROJECT_DIR$/docs/dev-ops/mysql/sql/big_market_02.sql" dialect="MySQL" />
</component>
</project>
\ No newline at end of file
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<Boolean> updateConfig(String key, String value);
}
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<Boolean> armory(Long activityId);
cn.bugstack.trigger.api.response.Response<Boolean> armory(Long activityId);
/**
* 活动抽奖接口
*
* @param request 请求对象
* @return 返回结果
*/
Response<ActivityDrawResponseDTO> draw(ActivityDrawRequestDTO request);
cn.bugstack.trigger.api.response.Response<ActivityDrawResponseDTO> draw(ActivityDrawRequestDTO request);
/**
* 日历签到返利接口
*
* @param userId 用户ID
* @return 签到结果
*/
Response<Boolean> calendarSignRebate(String userId);
cn.bugstack.trigger.api.response.Response<Boolean> calendarSignRebate(String userId);
/**
* 判断是否完成日历签到返利接口
*
* @param userId 用户ID
* @return 签到结果 true 已签到,false 未签到
*/
Response<Boolean> isCalendarSignRebate(String userId);
cn.bugstack.trigger.api.response.Response<Boolean> isCalendarSignRebate(String userId);
/**
* 查询用户活动账户
*
* @param request 请求对象「活动ID、用户ID」
* @return 返回结果「总额度、月额度、日额度」
*/
Response<UserActivityAccountResponseDTO> queryUserActivityAccount(UserActivityAccountRequestDTO request);
cn.bugstack.trigger.api.response.Response<UserActivityAccountResponseDTO> queryUserActivityAccount(UserActivityAccountRequestDTO request);
/**
* 查询sku商品集合
*
* @param activityId 活动ID
* @return 商品集合
*/
cn.bugstack.trigger.api.response.Response<List<SkuProductResponseDTO>> querySkuProductListByActivityId(Long activityId);
/**
* 查询用户积分值
*
* @param userId 用户ID
* @return 可用积分
*/
cn.bugstack.trigger.api.response.Response<BigDecimal> queryUserCreditAccount(String userId);
/**
* 积分支付兑换商品
*
* @param request 请求对象「用户ID、商品ID」
* @return 兑换结果
*/
Response<Boolean> creditPayExchangeSku(SkuProductShopCartRequestDTO request);
}
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<Boolean> strategyArmory(Long strategyId);
cn.bugstack.trigger.api.response.Response<Boolean> strategyArmory(Long strategyId);
/**
* 查询抽奖奖品列表配置
*
* @param requestDTO 抽奖奖品列表查询请求参数
* @param request 抽奖奖品列表查询请求参数
* @return 奖品列表数据
*/
Response<List<RaffleAwardListResponseDTO>> queryRaffleAwardList(RaffleAwardListRequestDTO requestDTO);
cn.bugstack.trigger.api.response.Response<List<RaffleAwardListResponseDTO>> queryRaffleAwardList(RaffleAwardListRequestDTO request);
/**
* 随机抽奖接口
*
* @param requestDTO 请求参数
* @return 抽奖结果
*/
Response<RaffleResponseDTO> randomRaffle(RaffleRequestDTO requestDTO);
/**
* 查询抽奖策略权重规则,给用户展示出抽奖N次后必中奖奖品范围
*
* @param request 请求对象
* @return 权重奖品配置列表「这里会返回全部,前端可按需展示一条已达标的,或者一条要达标的」
*/
Response<List<RaffleStrategyRuleWeightResponseDTO>> queryRaffleStrategyRuleWeight(RaffleStrategyRuleWeightRequestDTO request);
cn.bugstack.trigger.api.response.Response<List<RaffleStrategyRuleWeightResponseDTO>> queryRaffleStrategyRuleWeight(RaffleStrategyRuleWeightRequestDTO request);
/**
* 随机抽奖接口
*
* @param request 请求参数
* @return 抽奖结果
*/
Response<RaffleStrategyResponseDTO> randomRaffle(RaffleStrategyRequestDTO request);
}
......@@ -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;
}
......@@ -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;
......
......@@ -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;
}
......@@ -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;
}
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;
}
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;
}
......@@ -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;
}
......@@ -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;
}
}
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;
}
}
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;
}
......@@ -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;
}
......@@ -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;
}
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
......
......@@ -82,6 +82,10 @@
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.jeasy</groupId>
<artifactId>easy-random-core</artifactId>
</dependency>
<dependency>
<groupId>cn.bugstack.middleware</groupId>
<artifactId>db-router-spring-boot-starter</artifactId>
......@@ -90,6 +94,29 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- Dubbo + Nacos -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<dependency>
<groupId>plus.gaga</groupId>
<artifactId>business-behavior-monitor-sdk</artifactId>
<version>1.1</version>
</dependency>
<!-- 工程模块;启动依赖 trigger->domain, infrastructure-->
<dependency>
<groupId>cn.bugstack</groupId>
......
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){
......
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<String, Object> 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;
}
}
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;
}
}
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;
}
......@@ -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:
......
......@@ -75,4 +75,11 @@
where user_id = #{userId} and activity_id = #{activityId}
</update>
<select id="queryAccountByUserId" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityAccount" resultMap="dataMap">
select user_id, activity_id, total_count, total_count_surplus, day_count,
day_count_surplus, month_count, month_count_surplus
from raffle_activity_account
where user_id = #{userId} and activity_id = #{activityId}
</select>
</mapper>
......@@ -14,6 +14,7 @@
<result column="total_count" property="totalCount"/>
<result column="day_count" property="dayCount"/>
<result column="month_count" property="monthCount"/>
<result column="pay_amount" property="payAmount"/>
<result column="state" property="state"/>
<result column="out_business_no" property="outBusinessNo"/>
<result column="create_time" property="createTime"/>
......@@ -22,17 +23,35 @@
<insert id="insert" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityOrder">
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())
</insert>
<select id="queryRaffleActivityOrderByUserId" parameterType="java.lang.String" resultMap="dataMap">
select user_id, sku, activity_id, activity_name, strategy_id, order_id, order_time, state
select user_id, sku, activity_id, activity_name, strategy_id, order_id, order_time, pay_amount, state
from raffle_activity_order
where user_id = #{userId}
</select>
<select id="queryRaffleActivityOrder" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityOrder" resultMap="dataMap">
select user_id, sku, activity_id, activity_name, strategy_id, order_id, order_time, total_count, day_count, month_count, pay_amount, state
from raffle_activity_order
where user_id = #{userId} and out_business_no = #{outBusinessNo}
</select>
<update id="updateOrderCompleted" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityOrder">
update raffle_activity_order set state = 'completed', update_time = now()
where user_id = #{userId} and out_business_no = #{outBusinessNo} and state = 'wait_pay'
</update>
<select id="queryUnpaidActivityOrder" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityOrder" resultMap="dataMap">
select user_id, order_id, out_business_no, pay_amount
from raffle_activity_order
where user_id = #{userId} and sku = #{sku} and state = 'wait_pay' and order_time >= NOW() - INTERVAL 1 MONTH
limit 1
</select>
</mapper>
......@@ -9,12 +9,13 @@
<result column="activity_count_id" property="activityCountId"/>
<result column="stock_count" property="stockCount"/>
<result column="stock_count_surplus" property="stockCountSurplus"/>
<result column="product_amount" property="productAmount"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
</resultMap>
<select id="queryActivitySku" parameterType="java.lang.Long" resultMap="dataMap">
select sku, activity_id, activity_count_id, stock_count, stock_count_surplus
select sku, activity_id, activity_count_id, stock_count, stock_count_surplus, product_amount
from raffle_activity_sku
where sku = #{sku}
</select>
......@@ -32,7 +33,9 @@
</update>
<select id="queryActivitySkuListByActivityId" parameterType="java.lang.Long" resultMap="dataMap">
select sku, activity_count_id, stock_count, stock_count_surplus from raffle_activity_sku where activity_id = #{activityId}
select sku, activity_count_id, stock_count, stock_count_surplus, product_amount
from raffle_activity_sku
where activity_id = #{activityId}
</select>
</mapper>
......@@ -12,14 +12,20 @@
<result column="update_time" property="updateTime"/>
</resultMap>
<update id="updateAddAmount" parameterType="cn.bugstack.infrastructure.persistent.po.UserAwardRecord">
<update id="updateAddAmount" parameterType="cn.bugstack.infrastructure.persistent.po.UserCreditAccount">
update user_credit_account set
total_amount = total_amount + #{totalAmount},
available_amount = available_amount + #{availableAmount}
where user_id = #{userId}
</update>
<insert id="insert" parameterType="cn.bugstack.infrastructure.persistent.po.UserAwardRecord">
<update id="updateSubtractionAmount" parameterType="cn.bugstack.infrastructure.persistent.po.UserCreditAccount">
update user_credit_account set
available_amount = available_amount + #{availableAmount}
where user_id = #{userId} and available_amount > 0
</update>
<insert id="insert" parameterType="cn.bugstack.infrastructure.persistent.po.UserCreditAccount">
insert into user_credit_account(
user_id, total_amount, available_amount, account_status, create_time, update_time
) values (
......@@ -27,4 +33,9 @@
)
</insert>
<select id="queryUserCreditAccount" parameterType="cn.bugstack.infrastructure.persistent.po.UserCreditAccount" resultMap="dataMap">
select user_id, total_amount, available_amount, account_status from user_credit_account
where user_id = #{userId}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.bugstack.infrastructure.persistent.dao.IUserCreditOrderDao">
<resultMap id="dataMap" type="cn.bugstack.infrastructure.persistent.po.UserCreditOrder">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="order_id" property="orderId"/>
<result column="trade_name" property="tradeName"/>
<result column="trade_type" property="tradeType"/>
<result column="trade_amount" property="tradeAmount"/>
<result column="out_business_no" property="outBusinessNo"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
</resultMap>
<insert id="insert" parameterType="cn.bugstack.infrastructure.persistent.po.UserCreditOrder">
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()
)
</insert>
</mapper>
......@@ -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
</select>
<update id="updateUserRaffleOrderStateUsed" parameterType="cn.bugstack.infrastructure.persistent.po.UserRaffleOrder">
......
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;
}
}
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<String> 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));
}
}
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));
}
}
......@@ -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
*/
......
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);
}
}
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();
}
}
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<String> orderIds = behaviorRebateService.createOrder(behaviorEntity);
log.info("请求参数:{}", JSON.toJSONString(behaviorEntity));
log.info("测试结果:{}", JSON.toJSONString(orderIds));
new CountDownLatch(1).await();
}
}
......@@ -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));
}
}
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));
}
}
......@@ -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<RuleWeightVO> ruleWeightVOS = raffleRule.queryAwardRuleWeightByActivityId(100301L);
log.info("测试结果:{}", JSON.toJSONString(ruleWeightVOS));
}
}
......@@ -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 {
}
}
......@@ -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<Award> awards = awardDao.queryAwardList();
log.info("测试结果:{}",awards);
log.info("测试结果:{}", JSON.toJSONString(awards));
}
}
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);
}
}
......@@ -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));
}
}
......@@ -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();
......
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<RuleTreeNode> ruleTreeNodes = ruleTreeNodeDao.queryRuleLocks(new String[]{"tree_lock_1", "tree_lock_2"});
log.info("测试结果:{}", JSON.toJSONString(ruleTreeNodes));
}
}
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<StrategyAwardStockKeyVO> blockingQueue = redisService.getBlockingQueue(cacheKey);
RDelayedQueue<StrategyAwardStockKeyVO> delayedQueue = redisService.getDelayedQueue(blockingQueue);
delayedQueue.offer(StrategyAwardStockKeyVO.builder()
.strategyId(100001L)
.awardId(102)
.build(), 3, TimeUnit.SECONDS);
new CountDownLatch(1).await();
}
}
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<Boolean> 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<ActivityDrawResponseDTO> 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<ActivityDrawResponseDTO> 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<Boolean> response = raffleActivityService.calendarSignRebate("user002");
log.info("测试结果:{}", JSON.toJSONString(response));
// 让程序挺住方便测试,也可以去掉
new CountDownLatch(1).await();
}
@Test
public void test_isCalendarSignRebate() {
Response<Boolean> 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<UserActivityAccountResponseDTO> response = raffleActivityService.queryUserActivityAccount(request);
log.info("请求参数:{}", JSON.toJSONString(request));
log.info("测试结果:{}", JSON.toJSONString(response));
}
@Test
public void test_querySkuProductListByActivityId() {
Long request = 100301L;
Response<List<SkuProductResponseDTO>> response = raffleActivityService.querySkuProductListByActivityId(request);
log.info("请求参数:{}", JSON.toJSONString(request));
log.info("测试结果:{}", JSON.toJSONString(response));
}
@Test
public void test_queryUserCreditAccount() {
String request = "xiaofuge";
Response<BigDecimal> 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<Boolean> response = raffleActivityService.creditPayExchangeSku(request);
log.info("请求参数:{}", JSON.toJSONString(request));
log.info("测试结果:{}", JSON.toJSONString(response));
new CountDownLatch(1).await();
}
}
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<List<RaffleStrategyRuleWeightResponseDTO>> response = raffleStrategyService.queryRaffleStrategyRuleWeight(request);
log.info("请求参数:{}", JSON.toJSONString(request));
log.info("测试结果:{}", JSON.toJSONString(response));
}
}
......@@ -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
*/
......
......@@ -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
*/
......
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);
}
}
......@@ -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 */
......
......@@ -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
......
......@@ -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;
}
......@@ -6,7 +6,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author zhaoyongfeng
* @author Fuzhengwei bugstack.cn @小傅哥
* @description 活动次数实体对象
* @create 2024-03-16 11:19
*/
......
......@@ -9,7 +9,7 @@ import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @author zhaoyongfeng
* @author Fuzhengwei bugstack.cn @小傅哥
* @description 活动实体对象
* @create 2024-03-16 11:15
*/
......
......@@ -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;
/**
* 订单状态
*/
......
......@@ -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;
}
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;
}
......@@ -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;
}
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;
}
}
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;
}
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;
}
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;
}
......@@ -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
*/
......
......@@ -4,7 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author zhaoyongfeng
* @author Fuzhengwei bugstack.cn @小傅哥
* @description 活动状态值对象
* @create 2024-03-16 11:16
*/
......
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;
......
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;
}
......@@ -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", "已作废"),
......
......@@ -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<SkuProductEntity> querySkuProductEntityListByActivityId(Long activityId);
BigDecimal queryUserCreditAccountAmount(String userId);
}
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 账户充值订单,给用户增加抽奖次数
* <p>
......@@ -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);
}
......@@ -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);
}
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<SkuProductEntity> querySkuProductEntityListByActivityId(Long activityId);
}
......@@ -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);
}
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<ActivitySkuEntity> 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);
......
......@@ -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);
}
package cn.bugstack.domain.activity.service.armory;
import cn.bugstack.domain.activity.model.valobj.ActivitySkuStockKeyVO;
import java.util.Date;
/**
......
......@@ -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);
}
......@@ -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;
}
......
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<SkuProductEntity> querySkuProductEntityListByActivityId(Long activityId) {
return repository.querySkuProductEntityListByActivityId(activityId);
}
}
......@@ -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<String, ITradePolicy> tradePolicyGroup;
public AbstractRaffleActivityAccountQuota(IActivityRepository activityRepository, DefaultActivityChainFactory defaultActivityChainFactory, Map<String, ITradePolicy> 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);
}
......@@ -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<String, ITradePolicy> 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);
}
}
......@@ -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);
}
}
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);
}
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);
}
}
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);
}
}
......@@ -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
*/
......
......@@ -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;
}
......@@ -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<SendAwardMessageEvent.SendAwardMessage> message;
/** 任务状态;create-创建、completed-完成、fail-失败 */
private TaskStateVO state;
}
......@@ -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;
}
......@@ -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
......
......@@ -4,7 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author zhaoyongfeng
* @author Fuzhengwei bugstack.cn @小傅哥
* @description 任务状态值对象
* @create 2024-04-06 10:00
*/
......
......@@ -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);
......
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);
}
}
......@@ -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);
}
......@@ -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);
}
......@@ -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));
}
}
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<CreditAdjustSuccessMessageEvent.CreditAdjustSuccessMessage> {
@Value("${spring.rabbitmq.topic.credit_adjust_success}")
private String topic;
@Override
public EventMessage<CreditAdjustSuccessMessage> buildEventMessage(CreditAdjustSuccessMessage data) {
return EventMessage.<CreditAdjustSuccessMessage>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;
}
}
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<CreditAdjustSuccessMessageEvent.CreditAdjustSuccessMessage> message) {
TaskEntity taskEntity = new TaskEntity();
taskEntity.setUserId(userId);
taskEntity.setTopic(topic);
taskEntity.setMessageId(messageId);
taskEntity.setMessage(message);
taskEntity.setState(TaskStateVO.create);
return taskEntity;
}
}
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;
}
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;
}
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<CreditAdjustSuccessMessageEvent.CreditAdjustSuccessMessage> message;
/** 任务状态;create-创建、completed-完成、fail-失败 */
private TaskStateVO state;
}
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;
}
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;
}
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;
}
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);
}
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);
}
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<CreditAdjustSuccessMessageEvent.CreditAdjustSuccessMessage> 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);
}
}
......@@ -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<SendRebateMessageEvent.RebateMessage> {
@Value("${spring.rabbitmq.topic.send_rebate}")
private String topic;
public EventMessage<RebateMessage> buildEventMessage(RebateMessage rebateMessage){
return EventMessage.<SendRebateMessageEvent.RebateMessage>builder()
@Override
public EventMessage<RebateMessage> buildEventMessage(RebateMessage data) {
return EventMessage.<RebateMessage>builder()
.id(RandomStringUtils.randomNumeric(11))
.timestamp(new Date())
.data(rebateMessage)
.data(data)
.build();
}
......@@ -50,4 +52,5 @@ public class SendRebateMessageEvent extends BaseEvent<SendRebateMessageEvent.Reb
/** 业务ID - 唯一ID,确保幂等 */
private String bizId;
}
}
package cn.bugstack.domain.rebate.model.aggregate;
import cn.bugstack.domain.rebate.model.entity.BehaviorRebateOrderEntity;
import cn.bugstack.domain.rebate.model.entity.TaskEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Fuzhengwei bugstack.cn @小傅哥
* @description 行为返利聚合对象
* @create 2024-04-30 15:56
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BehaviorRebateAggregate {
/** 用户ID */
private String userId;
/** 行为返利订单实体对象 */
private BehaviorRebateOrderEntity behaviorRebateOrderEntity;
/** 任务实体对象 */
private TaskEntity taskEntity;
}
......@@ -7,16 +7,16 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName: BehaviorEntity
* @Description: 行为实体对象
* @Author: zhaoyongfeng
* @Date: 2024/12/21 18:51
* @author Fuzhengwei bugstack.cn @小傅哥
* @description 行为实体对象
* @create 2024-04-30 14:29
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BehaviorEntity {
/**
* 用户ID
*/
......@@ -29,4 +29,5 @@ public class BehaviorEntity {
* 业务ID;签到则是日期字符串,支付则是外部的业务ID
*/
private String outBusinessNo;
}
......@@ -4,19 +4,18 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.checkerframework.checker.units.qual.A;
/**
* @ClassName: BehaviorRebateOrderEntity
* @Description: 行为返利订单实体对象
* @Author: zhaoyongfeng
* @Date: 2024/12/21 19:23
* @author Fuzhengwei bugstack.cn @小傅哥
* @description 行为返利订单实体对象
* @create 2024-04-30 15:57
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class BehaviorRebateOrderEntity {
/** 用户ID */
private String userId;
/** 订单ID */
......@@ -33,4 +32,5 @@ public class BehaviorRebateOrderEntity {
private String outBusinessNo;
/** 业务ID - 拼接的唯一值 */
private String bizId;
}
......@@ -9,16 +9,16 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName: TaskEntity
* @Description: 任务实体对象
* @Author: zhaoyongfeng
* @Date: 2024/12/21 19:46
* @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<SendRebateMessageEvent.RebateMessage> message;
/** 任务状态;create-创建、completed-完成、fail-失败 */
private TaskStateVO state;
}
......@@ -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;
}
......@@ -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;
}
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", "用户活动积分"),
;
......
......@@ -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;
}
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<DailyBehaviorRebateVO> queryDailyBehaviorRebateConfig (BehaviorTypeVO behaviorTypeVO);
List<DailyBehaviorRebateVO> queryDailyBehaviorRebateConfig(BehaviorTypeVO behaviorTypeVO);
void saveUserRebateRecord(String userId, List<BehaviorRebateAggregate> behaviorRebateAggregates);
List<BehaviorRebateOrderEntity> queryOrderByOutBusinessNo(String userId, String outBusinessNo);
}
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<String> orderIds = new ArrayList<>();
List<BehaviorRebateAggregate> 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<SendRebateMessageEvent.RebateMessage> 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<BehaviorRebateOrderEntity> queryOrderByOutBusinessNo(String userId, String outBusinessNo) {
return behaviorRebateRepository.queryOrderByOutBusinessNo(userId, outBusinessNo);
}
}
......@@ -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<String> createOrder(BehaviorEntity behaviorEntity);
/**
* 根据外部单号查询订单
*
......@@ -25,4 +28,5 @@ public interface IBehaviorRebateService {
* @return 返利订单实体
*/
List<BehaviorRebateOrderEntity> queryOrderByOutBusinessNo(String userId, String outBusinessNo);
}
/**
* @description 当有需要写库的时候再创建聚合
* @author Fuzhengwei bugstack.cn @小傅哥
* @create 2024-04-20 09:08
*/
package cn.bugstack.domain.strategy.model.aggregate;
\ No newline at end of file
......@@ -25,5 +25,4 @@ public class RaffleFactorEntity {
/** 结束时间 */
private Date endDateTime;
}
......@@ -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;
}
}
......@@ -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<String, Integer> queryAwardRuleLockCount(String... treeIds);
Map<String, Integer> 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<RuleWeightVO> queryAwardRuleWeight(Long strategyId);
}
......@@ -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);
......
......@@ -19,5 +19,12 @@ public interface IRaffleAward {
*/
List<StrategyAwardEntity> queryRaffleStrategyAwardList(Long strategyId);
/**
* 根据策略ID查询抽奖奖品列表配置
*
* @param activityId 策略ID
* @return 奖品列表
*/
List<StrategyAwardEntity> queryRaffleStrategyAwardListByActivityId(Long activityId);
}
......@@ -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<String, Integer> queryAwardRuleLockCount(String[] treeIds);
/**
* 查询奖品权重配置
*
......@@ -25,6 +27,8 @@ public interface IRaffleRule {
* @return 权重规则
*/
List<RuleWeightVO> queryAwardRuleWeight(Long strategyId);
/**
* 查询奖品权重配置
*
......@@ -32,4 +36,5 @@ public interface IRaffleRule {
* @return 权重规则
*/
List<RuleWeightVO> queryAwardRuleWeightByActivityId(Long activityId);
}
......@@ -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
*/
......
......@@ -14,6 +14,7 @@ public interface IStrategyArmory {
* @return 装配结果
*/
boolean assembleLotteryStrategy(Long strategyId);
/**
* 装配抽奖策略配置「触发的时机可以为活动审核通过后进行调用」
*
......@@ -21,4 +22,5 @@ public interface IStrategyArmory {
* @return 装配结果
*/
boolean assembleLotteryStrategyByActivityId(Long activityId);
}
......@@ -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);
......
......@@ -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
*
......
......@@ -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<String, Integer> queryAwardRuleLockCount(String[] treeIds) {
return repository.queryAwardRuleLockCount(treeIds);
}
@Override
public List<RuleWeightVO> queryAwardRuleWeight(Long strategyId) {
return repository.queryAwardRuleWeight(strategyId);
}
@Override
public List<RuleWeightVO> queryAwardRuleWeightByActivityId(Long activityId) {
Long strategyId = repository.queryStrategyIdByActivityId(activityId);
return queryAwardRuleWeight(strategyId);
}
}
......@@ -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;
......
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();
}
}
......@@ -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())
......
......@@ -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<Long, String> analyticalValueGroup = getAnalyticalValue(ruleValue);
Map<Integer, String> 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<Long> 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<Long, String> getAnalyticalValue(String ruleValue) {
private Map<Integer, String> getAnalyticalValue(String ruleValue) {
String[] ruleValueGroups = ruleValue.split(Constants.SPACE);
Map<Long, String> ruleValueMap = new HashMap<>();
Map<Integer, String> 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<Integer, String> analyticalValueGroup, Integer userScore);
}
// 获得指定权重值 = n
static class AnalyticalEqual implements IAnalytical {
@Override
public String getAnalyticalValue(Map<Integer, String> analyticalValueGroup, Integer userScore) {
return analyticalValueGroup.get(userScore);
}
}
// 获取范围权重值 > n
static class AnalyticalNotEqual implements IAnalytical {
@Override
public String getAnalyticalValue(Map<Integer, String> analyticalValueGroup, Integer userScore) {
// 2. 转换Keys值,并默认排序
List<Integer> 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);
}
}
}
......@@ -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);
}
......@@ -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;
......
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;
......
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()
......
......@@ -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()
......
......@@ -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;
}
......@@ -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<TaskEntity> queryNoSendMessageTaskList();
void sendMessage(TaskEntity taskEntity);
List<TaskEntity> queryNoSendMessageTaskList();
void updateTaskSendMessageCompleted(String userId, String messageId);
void updateTaskSendMessageFail(String userId, String messageId);
}
......@@ -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);
}
......@@ -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<TaskEntity> 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);
}
}
/**
* 聚合对象;
* 1. 聚合实体和值对象
* 2. 聚合是聚合的对象,和提供基础处理对象的方法。但不建议在聚合中引入仓储和接口来做过大的逻辑。而这些复杂的操作应该放到service中处理
* 3. 对象名称 XxxAggregate
*/
package cn.bugstack.domain.yyy.model.aggregate;
\ No newline at end of file
/**
* 实体对象;
* 1. 一般和数据库持久化对象1v1的关系,但因各自开发系统的不同,也有1vn的可能。
* 2. 如果是老系统改造,那么旧的库表冗余了太多的字段,可能会有nv1的情况
* 3. 对象名称 XxxEntity
*/
package cn.bugstack.domain.yyy.model.entity;
\ No newline at end of file
/**
* 仓储服务
* 1. 定义仓储接口,之后由基础设施层做具体实现
*/
package cn.bugstack.domain.yyy.repository;
\ No newline at end of file
package cn.bugstack.domain.yyy.service;
\ No newline at end of file
......@@ -27,8 +27,8 @@
<artifactId>db-router-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- 系统模块 -->
<dependency>
......
/**
* 实现对外部的api调用,类的名称为 XxxPort 接口定义在 domain 中
*/
package cn.bugstack.infrastructure.adapter.port;
\ No newline at end of file
/**
* 仓储实现;用于实现 domain 中定义的仓储接口,如;IXxxRepository 在 Repository 中调用服务
*/
package cn.bugstack.infrastructure.adapter.repository;
\ No newline at end of file
......@@ -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;
}
}
......
......@@ -29,4 +29,6 @@ public interface IRaffleActivityAccountDao {
void updateActivityAccountDaySurplusImageQuota(RaffleActivityAccount raffleActivityAccount);
RaffleActivityAccount queryAccountByUserId(RaffleActivityAccount raffleActivityAccount);
}
......@@ -22,4 +22,12 @@ public interface IRaffleActivityOrderDao {
@DBRouter
List<RaffleActivityOrder> queryRaffleActivityOrderByUserId(String userId);
@DBRouter
RaffleActivityOrder queryRaffleActivityOrder(RaffleActivityOrder raffleActivityOrderReq);
int updateOrderCompleted(RaffleActivityOrder raffleActivityOrderReq);
@DBRouter
RaffleActivityOrder queryUnpaidActivityOrder(RaffleActivityOrder raffleActivityOrderReq);
}
......@@ -15,4 +15,8 @@ public interface IUserCreditAccountDao {
int updateAddAmount(UserCreditAccount userCreditAccountReq);
UserCreditAccount queryUserCreditAccount(UserCreditAccount userCreditAccountReq);
int updateSubtractionAmount(UserCreditAccount userCreditAccountReq);
}
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);
}
......@@ -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;
/**
* 订单状态
*/
......
......@@ -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;
/**
* 创建时间
*/
......
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;
}
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;
......
......@@ -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<ActivitySkuEntity> queryActivitySkuListByActivityId(Long activityId) {
List<RaffleActivitySku> raffleActivitySkus = raffleActivitySkuDao.queryActivitySkuListByActivityId(activityId);
List<ActivitySkuEntity> 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<SkuProductEntity> querySkuProductEntityListByActivityId(Long activityId) {
List<RaffleActivitySku> raffleActivitySkus = raffleActivitySkuDao.queryActivitySkuListByActivityId(activityId);
List<SkuProductEntity> 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();
}
}
}
......@@ -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);
}
}
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<BehaviorRebateOrderEntity> 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;
}
}
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();
}
}
}
......@@ -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<RuleTreeNodeLineVO> 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<RuleWeightVO> queryAwardRuleWeight(Long strategyId) {
// 优先从缓存获取
String cacheKey = Constants.RedisKey.STRATEGY_RULE_WEIGHT_KEY + strategyId;
List<RuleWeightVO> 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;
}
......
......@@ -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<TaskEntity> queryNoSendMessageTaskList() {
List<Task> 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);
}
}
......@@ -34,6 +34,18 @@
<groupId>cn.bugstack.middleware</groupId>
<artifactId>db-router-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<!-- 系统模块 -->
<dependency>
<groupId>cn.bugstack</groupId>
......
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";
/**
* 更新配置
* <p>
* 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<Boolean> 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.<Boolean>builder()
.code(ResponseCode.SUCCESS.getCode())
.info(ResponseCode.SUCCESS.getInfo())
.build();
} catch (Exception e) {
log.error("DCC 动态配置值变更失败 key:{} value:{}", key, value, e);
return Response.<Boolean>builder()
.code(ResponseCode.UN_ERROR.getCode())
.info(ResponseCode.UN_ERROR.getInfo())
.build();
}
}
}
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 {
* <p>
* 接口:<a href="http://localhost:8091/api/v1/raffle/activity/armory">/api/v1/raffle/activity/armory</a>
* 入参:{"activityId":100001,"userId":"xiaofuge"}
*
* <p>
* 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<Boolean> 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.<Boolean>builder()
.code(ResponseCode.UN_ERROR.getCode())
......@@ -105,20 +124,27 @@ public class RaffleActivityController implements IRaffleActivityService {
* <p>
* 接口:<a href="http://localhost:8091/api/v1/raffle/activity/draw">/api/v1/raffle/activity/draw</a>
* 入参:{"activityId":100001,"userId":"xiaofuge"}
*
* <p>
* 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<ActivityDrawResponseDTO> 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.<ActivityDrawResponseDTO>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 {
* <p>
* 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<Boolean> calendarSignRebate(@RequestParam String userId){
public Response<Boolean> calendarSignRebate(@RequestParam String userId) {
try {
log.info("日历签到返利开始 userId:{}", userId);
BehaviorEntity behaviorEntity = new BehaviorEntity();
......@@ -216,15 +243,16 @@ public class RaffleActivityController implements IRaffleActivityService {
.build();
}
}
/**
* 判断是否签到接口
* <p>
* 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<Boolean> isCalendarSignRebate(String userId) {
try{
public Response<Boolean> isCalendarSignRebate(@RequestParam String userId) {
try {
log.info("查询用户是否完成日历签到返利开始 userId:{}", userId);
String outBusinessNo = dateFormatDay.format(new Date());
List<BehaviorRebateOrderEntity> behaviorRebateOrderEntities = behaviorRebateService.queryOrderByOutBusinessNo(userId, outBusinessNo);
......@@ -232,10 +260,9 @@ public class RaffleActivityController implements IRaffleActivityService {
return Response.<Boolean>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.<Boolean>builder()
.code(ResponseCode.UN_ERROR.getCode())
......@@ -244,6 +271,7 @@ public class RaffleActivityController implements IRaffleActivityService {
.build();
}
}
/**
* 查询账户额度
* <p>
......@@ -257,7 +285,7 @@ public class RaffleActivityController implements IRaffleActivityService {
*/
@RequestMapping(value = "query_user_activity_account", method = RequestMethod.POST)
@Override
public Response<UserActivityAccountResponseDTO> queryUserActivityAccount(UserActivityAccountRequestDTO request) {
public Response<UserActivityAccountResponseDTO> 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.<UserActivityAccountResponseDTO>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<List<SkuProductResponseDTO>> 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<SkuProductEntity> skuProductEntities = raffleActivitySkuProductService.querySkuProductEntityListByActivityId(activityId);
List<SkuProductResponseDTO> 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.<List<SkuProductResponseDTO>>builder()
.code(ResponseCode.SUCCESS.getCode())
.info(ResponseCode.SUCCESS.getInfo())
.data(skuProductResponseDTOS)
.build();
} catch (Exception e) {
log.error("查询sku商品集合失败 activityId:{}", activityId, e);
return Response.<List<SkuProductResponseDTO>>builder()
.code(ResponseCode.UN_ERROR.getCode())
.info(ResponseCode.UN_ERROR.getInfo())
.build();
}
}
@RequestMapping(value = "query_user_credit_account", method = RequestMethod.POST)
@Override
public Response<BigDecimal> queryUserCreditAccount(String userId) {
try {
log.info("查询用户积分值开始 userId:{}", userId);
CreditAccountEntity creditAccountEntity = creditAdjustService.queryUserCreditAccount(userId);
log.info("查询用户积分值完成 userId:{} adjustAmount:{}", userId, creditAccountEntity.getAdjustAmount());
return Response.<BigDecimal>builder()
.code(ResponseCode.SUCCESS.getCode())
.info(ResponseCode.SUCCESS.getInfo())
.data(creditAccountEntity.getAdjustAmount())
.build();
} catch (Exception e) {
log.error("查询用户积分值失败 userId:{}", userId, e);
return Response.<BigDecimal>builder()
.code(ResponseCode.UN_ERROR.getCode())
.info(ResponseCode.UN_ERROR.getInfo())
.build();
}
}
@RequestMapping(value = "credit_pay_exchange_sku", method = RequestMethod.POST)
@Override
public Response<Boolean> 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.<Boolean>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.<Boolean>builder()
.code(e.getCode())
.info(e.getInfo())
.build();
} catch (Exception e) {
log.error("积分兑换商品失败 userId:{} sku:{}", request.getUserId(), request.getSku(), e);
return Response.<Boolean>builder()
.code(ResponseCode.UN_ERROR.getCode())
.info(ResponseCode.UN_ERROR.getInfo())
.data(false)
.build();
}
}
}
......@@ -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 {
/**
* 策略装配,将策略信息装配到缓存中
* <a href="http://localhost:8091/api/v1/raffle/strategy_armory">/api/v1/raffle/strategy_armory</a>
* <a href="http://localhost:8091/api/v1/raffle/strategy/strategy_armory">/api/v1/raffle/strategy/strategy_armory</a>
*
* @param strategyId 策略ID
* @return 装配结果
......@@ -77,10 +79,10 @@ public class RaffleStrategyController implements IRaffleStrategyService {
/**
* 查询奖品列表
* <a href="http://localhost:8091/api/v1/raffle/query_raffle_award_list">/api/v1/raffle/query_raffle_award_list</a>
* <a href="http://localhost:8091/api/v1/raffle/strategy/query_raffle_award_list">/api/v1/raffle/strategy/query_raffle_award_list</a>
* 请求参数 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 {
}
/**
* 随机抽奖接口
* <a href="http://localhost:8091/api/v1/raffle/random_raffle">/api/v1/raffle/random_raffle</a>
*
* @param requestDTO 请求参数 {"strategyId":1000001}
* @return 抽奖结果
*/
@RequestMapping(value = "random_raffle", method = RequestMethod.POST)
@Override
public Response<RaffleResponseDTO> randomRaffle(@RequestBody RaffleRequestDTO requestDTO) {
try {
log.info("随机抽奖开始 strategyId: {}", requestDTO.getStrategyId());
// 调用抽奖接口
RaffleAwardEntity raffleAwardEntity = raffleStrategy.performRaffle(RaffleFactorEntity.builder()
.userId("system")
.strategyId(requestDTO.getStrategyId())
.build());
// 封装返回结果
Response<RaffleResponseDTO> response = Response.<RaffleResponseDTO>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.<RaffleResponseDTO>builder()
.code(e.getCode())
.info(e.getInfo())
.build();
} catch (Exception e) {
log.error("随机抽奖失败 strategyId:{}", requestDTO.getStrategyId(), e);
return Response.<RaffleResponseDTO>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<List<RaffleStrategyRuleWeightResponseDTO>> queryRaffleStrategyRuleWeight(RaffleStrategyRuleWeightRequestDTO request) {
public Response<List<RaffleStrategyRuleWeightResponseDTO>> 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.<List<RaffleStrategyRuleWeightResponseDTO>>builder()
.code(ResponseCode.UN_ERROR.getCode())
......@@ -235,4 +195,47 @@ public class RaffleStrategyController implements IRaffleStrategyService {
}
}
/**
* 随机抽奖接口
* <a href="http://localhost:8091/api/v1/raffle/strategy/random_raffle">/api/v1/raffle/random_raffle</a>
*
* @param requestDTO 请求参数 {"strategyId":1000001}
* @return 抽奖结果
*/
@RequestMapping(value = "random_raffle", method = RequestMethod.POST)
@Override
public Response<RaffleStrategyResponseDTO> randomRaffle(@RequestBody RaffleStrategyRequestDTO requestDTO) {
try {
log.info("随机抽奖开始 strategyId: {}", requestDTO.getStrategyId());
// 调用抽奖接口
RaffleAwardEntity raffleAwardEntity = raffleStrategy.performRaffle(RaffleFactorEntity.builder()
.userId("system")
.strategyId(requestDTO.getStrategyId())
.build());
// 封装返回结果
Response<RaffleStrategyResponseDTO> response = Response.<RaffleStrategyResponseDTO>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.<RaffleStrategyResponseDTO>builder()
.code(e.getCode())
.info(e.getInfo())
.build();
} catch (Exception e) {
log.error("随机抽奖失败 strategyId:{}", requestDTO.getStrategyId(), e);
return Response.<RaffleStrategyResponseDTO>builder()
.code(ResponseCode.UN_ERROR.getCode())
.info(ResponseCode.UN_ERROR.getInfo())
.build();
}
}
}
......@@ -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<TaskEntity> 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<TaskEntity> 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<TaskEntity> 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();
}
}
}
......@@ -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());
......
......@@ -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());
......
......@@ -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);
......
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<CreditAdjustSuccessMessageEvent.CreditAdjustSuccessMessage> eventMessage = JSON.parseObject(message, new TypeReference<BaseEvent.EventMessage<CreditAdjustSuccessMessageEvent.CreditAdjustSuccessMessage>>() {
}.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;
}
}
}
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<SendRebateMessageEvent.RebateMessage> eventMessage = JSON.parseObject(message, new TypeReference<BaseEvent.EventMessage<SendRebateMessageEvent.RebateMessage>>() {
}.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;
}
......
......@@ -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<SendAwardMessageEvent.SendAwardMessage> eventMessage = JSON.parseObject(message, new TypeReference<BaseEvent.EventMessage<SendAwardMessageEvent.SendAwardMessage>>() {
}.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
}
package cn.bugstack.types.annotations;
import java.lang.annotation.*;
/**
* 注解,动态配置中心
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Documented
public @interface DCCValue {
String value() default "";
}
......@@ -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_";
}
......
......@@ -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;
}
# 命令执行 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
# 命令执行 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
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 - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
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 - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
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 - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
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 - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
# 命令执行 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
......@@ -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;
......
......@@ -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;
......
......@@ -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
......
# ************************************************************
# 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 */;
user admin on >admin allcommands allkeys
\ No newline at end of file
zkCli.sh -server 192.168.1.67:2181
docker exec -it zookeeper bash
\ No newline at end of file
......@@ -103,23 +103,45 @@
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.23.4</version>
</dependency>
<dependency>
<groupId>cn.bugstack.middleware</groupId>
<artifactId>db-router-spring-boot-starter</artifactId>
<version>1.0.2</version>
<version>3.26.0</version>
</dependency>
<dependency>
<groupId>org.jeasy</groupId>
<artifactId>easy-random-core</artifactId>
<version>4.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.bugstack.middleware/db-router-spring-boot-starter -->
<dependency>
<groupId>cn.bugstack.middleware</groupId>
<artifactId>db-router-spring-boot-starter</artifactId>
<version>1.0.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>3.0.9</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.9</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<version>3.1.4</version>
</dependency>
<!-- 工程模块 -->
<dependency>
<groupId>cn.bugstack</groupId>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册