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

用户积分入栈规则、积分库表设计

上级 d47fb273
......@@ -2,6 +2,8 @@ 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;
/*
......@@ -30,4 +32,19 @@ public interface IRaffleActivityService {
* @return 签到结果
*/
Response<Boolean> calendarSignRebate(String userId);
/**
* 判断是否完成日历签到返利接口
*
* @param userId 用户ID
* @return 签到结果 true 已签到,false 未签到
*/
Response<Boolean> isCalendarSignRebate(String userId);
/**
* 查询用户活动账户
*
* @param request 请求对象「活动ID、用户ID」
* @return 返回结果「总额度、月额度、日额度」
*/
Response<UserActivityAccountResponseDTO> queryUserActivityAccount(UserActivityAccountRequestDTO request);
}
package cn.bugstack.trigger.api;
import cn.bugstack.trigger.api.dto.RaffleAwardListRequestDTO;
import cn.bugstack.trigger.api.dto.RaffleAwardListResponseDTO;
import cn.bugstack.trigger.api.dto.RaffleRequestDTO;
import cn.bugstack.trigger.api.dto.RaffleResponseDTO;
import cn.bugstack.trigger.api.dto.*;
import cn.bugstack.types.model.Response;
import java.util.List;
/*
* @return
* @author zhaoyongfeng
* @description 抽奖服务接口
*/
public interface IRaffleStrategyService {
......@@ -33,6 +35,13 @@ public interface IRaffleStrategyService {
* @return 抽奖结果
*/
Response<RaffleResponseDTO> randomRaffle(RaffleRequestDTO requestDTO);
/**
* 查询抽奖策略权重规则,给用户展示出抽奖N次后必中奖奖品范围
*
* @param request 请求对象
* @return 权重奖品配置列表「这里会返回全部,前端可按需展示一条已达标的,或者一条要达标的」
*/
Response<List<RaffleStrategyRuleWeightResponseDTO>> queryRaffleStrategyRuleWeight(RaffleStrategyRuleWeightRequestDTO request);
}
package cn.bugstack.trigger.api.dto;
import lombok.Data;
/**
* @ClassName: RaffleStrategyRuleWeightRequestDTO
* @Description: 抽奖策略规则,权重配置,查询N次抽奖可解锁奖品范围,请求对象
* @Author: zhaoyongfeng
* @Date: 2024/12/26 0:14
*/
@Data
public class RaffleStrategyRuleWeightRequestDTO {
// 用户ID
private String userId;
// 抽奖活动ID
private Long activityId;
}
package cn.bugstack.trigger.api.dto;
import lombok.Data;
import java.util.List;
/**
* @ClassName: RaffleStrategyRuleWeightResponseDTO
* @Description:
* @Author: zhaoyongfeng
* @Date: 2024/12/26 0:13
*/
@Data
public class RaffleStrategyRuleWeightResponseDTO {
// 权重规则配置的抽奖次数
private Integer ruleWeightCount;
// 用户在一个活动下完成的总抽奖次数
private Integer userActivityAccountTotalUseCount;
// 当前权重可抽奖范围
private List<StrategyAward> strategyAwards;
@Data
public static class StrategyAward {
// 奖品ID
private Integer awardId;
// 奖品标题
private String awardTitle;
}
}
package cn.bugstack.trigger.api.dto;
import lombok.Data;
/**
* @ClassName: UserActivityAccountRequestDTO
* @Description:
* @Author: zhaoyongfeng
* @Date: 2024/12/25 23:25
*/
@Data
public class UserActivityAccountRequestDTO {
/**
* 用户ID
*/
private String userId;
/**
* 活动ID
*/
private Long activityId;
}
package cn.bugstack.trigger.api.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName: UserActivityAccountReponseDTO
* @Description:
* @Author: zhaoyongfeng
* @Date: 2024/12/25 23:22
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserActivityAccountResponseDTO {
/**
* 总次数
*/
private Integer totalCount;
/**
* 总次数-剩余
*/
private Integer totalCountSurplus;
/**
* 日次数
*/
private Integer dayCount;
/**
* 日次数-剩余
*/
private Integer dayCountSurplus;
/**
* 月次数
*/
private Integer monthCount;
/**
* 月次数-剩余
*/
private Integer monthCountSurplus;
}
......@@ -18,4 +18,12 @@
limit 10
</select>
<select id="queryAwardConfigByAwardId" parameterType="java.lang.Integer" resultType="java.lang.String">
select award_config from award where award_id = #{awardId}
</select>
<select id="queryAwardKeyByAwardId" parameterType="java.lang.Integer" resultType="java.lang.String">
select award_key from award where award_id = #{awardId}
</select>
</mapper>
......@@ -15,9 +15,9 @@
<insert id="insertActivityAccountDay" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityAccountDay">
insert into raffle_activity_account_day(
user_id, activity_id, day, day_count, day_count_surplus, create_time, update_time)
user_id, activity_id, day, day_count, day_count_surplus, create_time, update_time)
values
(#{userId}, #{activityId}, #{day}, #{dayCount}, #{dayCountSurplus}, now(), now())
(#{userId}, #{activityId}, #{day}, #{dayCount}, #{dayCountSurplus}, now(), now())
</insert>
<update id="updateActivityAccountDaySubtractionQuota" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityAccountDay">
......@@ -45,4 +45,5 @@
update_time = now()
where user_id = #{userId} and activity_id = #{activityId} and day = #{day}
</update>
</mapper>
......@@ -31,6 +31,7 @@
set month_count_surplus = month_count_surplus - 1, update_time = now()
where user_id = #{userId} and activity_id = #{activityId} and month = #{month} and month_count_surplus > 0
</update>
<update id="addAccountQuota" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityAccountMonth">
update raffle_activity_account_month
set month_count_surplus = month_count_surplus + #{monthCountSurplus},
......@@ -38,4 +39,5 @@
update_time = now()
where user_id = #{userId} and activity_id = #{activityId} and month = #{month}
</update>
</mapper>
......@@ -3,6 +3,7 @@
<mapper namespace="cn.bugstack.infrastructure.persistent.dao.IRaffleActivitySkuDao">
<resultMap id="dataMap" type="cn.bugstack.infrastructure.persistent.po.RaffleActivitySku">
<id column="id" property="id"/>
<result column="sku" property="sku"/>
<result column="activity_id" property="activityId"/>
<result column="activity_count_id" property="activityCountId"/>
......
......@@ -24,4 +24,9 @@
)
</insert>
<update id="updateAwardRecordCompletedState" parameterType="cn.bugstack.infrastructure.persistent.po.UserAwardRecord">
update user_award_record set award_state = 'completed'
where user_id = #{userId} and order_id = #{orderId} and award_state = 'create'
</update>
</mapper>
......@@ -10,6 +10,7 @@
<result column="rebate_desc" property="rebateDesc"/>
<result column="rebate_type" property="rebateType"/>
<result column="rebate_config" property="rebateConfig"/>
<result column="out_business_no" property="outBusinessNo"/>
<result column="biz_id" property="bizId"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
......@@ -17,10 +18,16 @@
<insert id="insert" parameterType="cn.bugstack.infrastructure.persistent.po.UserBehaviorRebateOrder">
insert into user_behavior_rebate_order(
user_id, order_id, behavior_type, rebate_desc, rebate_type, rebate_config, biz_id, create_time, update_time
user_id, order_id, behavior_type, rebate_desc, rebate_type, rebate_config, out_business_no, biz_id, create_time, update_time
) values(
#{userId}, #{orderId}, #{behaviorType}, #{rebateDesc}, #{rebateType}, #{rebateConfig}, #{bizId}, now(), now()
#{userId}, #{orderId}, #{behaviorType}, #{rebateDesc}, #{rebateType}, #{rebateConfig}, #{outBusinessNo}, #{bizId}, now(), now()
)
</insert>
<select id="queryOrderByOutBusinessNo" parameterType="cn.bugstack.infrastructure.persistent.po.UserBehaviorRebateOrder" resultMap="dataMap">
select user_id, order_id, behavior_type, rebate_desc, rebate_type, rebate_config, out_business_no, biz_id
from user_behavior_rebate_order
where user_id = #{userId} and out_business_no = #{outBusinessNo}
</select>
</mapper>
\ No newline at end of file
<?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.IUserCreditAccountDao">
<resultMap id="dataMap" type="cn.bugstack.infrastructure.persistent.po.UserCreditAccount">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="total_amount" property="totalAmount"/>
<result column="available_amount" property="availableAmount"/>
<result column="account_status" property="accountStatus"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
</resultMap>
<update id="updateAddAmount" parameterType="cn.bugstack.infrastructure.persistent.po.UserAwardRecord">
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">
insert into user_credit_account(
user_id, total_amount, available_amount, account_status, create_time, update_time
) values (
#{userId}, #{totalAmount}, #{availableAmount}, #{accountStatus}, now(), now()
)
</insert>
</mapper>
......@@ -51,4 +51,8 @@ public interface IActivityRepository {
List<ActivitySkuEntity> queryActivitySkuListByActivityId(Long activityId);
Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId);
ActivityAccountEntity queryActivityAccountEntity(Long activityId, String userId);
Integer queryRaffleActivityAccountPartakeCount(Long activityId, String userId);
}
package cn.bugstack.domain.activity.service;
import cn.bugstack.domain.activity.model.entity.ActivityAccountEntity;
import cn.bugstack.domain.activity.model.entity.SkuRechargeEntity;
/*
......@@ -26,4 +27,20 @@ public interface IRaffleActivityAccountQuotaService {
* @return 参与次数
*/
Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId);
/**
* 查询活动账户额度「总、月、日」
*
* @param activityId 活动ID
* @param userId 用户ID
* @return 账户实体
*/
ActivityAccountEntity queryActivityAccountEntity(Long activityId, String userId);
/**
* 查询活动账户 - 总,参与次数
*
* @param activityId 活动ID
* @param userId 用户ID
* @return 参与次数
*/
Integer queryRaffleActivityAccountPartakeCount(Long activityId, String userId);
}
......@@ -53,6 +53,7 @@ public abstract class AbstractRaffleActivityAccountQuota extends RaffleActivityA
return createOrderAggregate.getActivityOrderEntity().getOrderId();
}
protected abstract CreateQuotaOrderAggregate buildOrderAggregate(SkuRechargeEntity skuRechargeEntity, ActivitySkuEntity activitySkuEntity, ActivityEntity activityEntity, ActivityCountEntity activityCountEntity);
protected abstract void doSaveOrder(CreateQuotaOrderAggregate createOrderAggregate);
......
......@@ -81,4 +81,14 @@ public class RaffleActivityAccountQuotaService extends AbstractRaffleActivityAcc
public Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId) {
return activityRepository.queryRaffleActivityAccountDayPartakeCount(activityId, userId);
}
@Override
public ActivityAccountEntity queryActivityAccountEntity(Long activityId, String userId) {
return activityRepository.queryActivityAccountEntity(activityId, userId);
}
@Override
public Integer queryRaffleActivityAccountPartakeCount(Long activityId, String userId) {
return activityRepository.queryRaffleActivityAccountPartakeCount(activityId, userId);
}
}
......@@ -45,6 +45,10 @@ public class SendAwardMessageEvent extends BaseEvent<SendAwardMessageEvent.SendA
* 用户ID
*/
private String userId;
/**
* 订单ID
*/
private String orderId;
/**
* 奖品ID
*/
......@@ -53,6 +57,10 @@ public class SendAwardMessageEvent extends BaseEvent<SendAwardMessageEvent.SendA
* 奖品标题(名称)
*/
private String awardTitle;
/**
* 奖品配置信息
*/
private String awardConfig;
}
}
package cn.bugstack.domain.award.model.aggregate;
import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity;
import cn.bugstack.domain.award.model.entity.UserCreditAwardEntity;
import cn.bugstack.domain.award.model.valobj.AwardStateVO;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @author Fuzhengwei bugstack.cn @小傅哥
* @description 发放奖品聚合对象
* @create 2024-05-18 09:26
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class GiveOutPrizesAggregate {
/** 用户ID */
private String userId;
/** 用户发奖记录 */
private UserAwardRecordEntity userAwardRecordEntity;
/** 用户积分奖品 */
private UserCreditAwardEntity userCreditAwardEntity;
public static UserAwardRecordEntity buildDistributeUserAwardRecordEntity(String userId, String orderId, Integer awardId, AwardStateVO awardState) {
UserAwardRecordEntity userAwardRecord = new UserAwardRecordEntity();
userAwardRecord.setUserId(userId);
userAwardRecord.setOrderId(orderId);
userAwardRecord.setAwardId(awardId);
userAwardRecord.setAwardState(awardState);
return userAwardRecord;
}
public static UserCreditAwardEntity buildUserCreditAwardEntity(String userId, BigDecimal creditAmount) {
return UserCreditAwardEntity.builder().userId(userId).creditAmount(creditAmount).build();
}
}
package cn.bugstack.domain.award.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Fuzhengwei bugstack.cn @小傅哥
* @description 分发奖品实体
* @create 2024-05-18 08:34
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DistributeAwardEntity {
/**
* 用户ID
*/
private String userId;
/**
* 订单ID
*/
private String orderId;
/**
* 奖品ID
*/
private Integer awardId;
/**
* 奖品配置信息
*/
private String awardConfig;
}
......@@ -35,4 +35,6 @@ public class UserAwardRecordEntity {
private Date awardTime;
/** 奖品状态;create-创建、completed-发奖完成 */
private AwardStateVO awardState;
/** 奖品配置信息;发奖的时候,可以根据 */
private String awardConfig;
}
package cn.bugstack.domain.award.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-05-18 09:15
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserCreditAwardEntity {
/** 用户ID */
private String userId;
/** 积分值 */
private BigDecimal creditAmount;
}
package cn.bugstack.domain.award.model.valobj;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author Fuzhengwei bugstack.cn @小傅哥
* @description 账户状态枚举
* @create 2024-05-24 22:10
*/
@Getter
@AllArgsConstructor
public enum AccountStatusVO {
open("open", "开启"),
close("close", "冻结"),
;
private final String code;
private final String desc;
}
package cn.bugstack.domain.award.repository;
import cn.bugstack.domain.award.model.aggregate.GiveOutPrizesAggregate;
import cn.bugstack.domain.award.model.aggregate.UserAwardRecordAggregate;
/*
* @return 奖品仓储服务
......@@ -8,4 +9,11 @@ import cn.bugstack.domain.award.model.aggregate.UserAwardRecordAggregate;
*/
public interface IAwardRepository {
void saveUserAwardRecord(UserAwardRecordAggregate userAwardRecordAggregate);
String queryAwardConfig(Integer awardId);
void saveGiveOutPrizesAggregate(GiveOutPrizesAggregate giveOutPrizesAggregate);
String queryAwardKey(Integer awardId);
}
......@@ -2,14 +2,18 @@ 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.entity.DistributeAwardEntity;
import cn.bugstack.domain.award.model.entity.TaskEntity;
import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity;
import cn.bugstack.domain.award.model.valobj.TaskStateVO;
import cn.bugstack.domain.award.repository.IAwardRepository;
import cn.bugstack.domain.award.service.distribute.IDistributeAward;
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
......@@ -18,19 +22,27 @@ import javax.annotation.Resource;
* @Date: 2024/12/9 15:41
*/
@Service
@Slf4j
public class AwardService implements IAwardService{
@Resource
private IAwardRepository awardRepository;
@Resource
private SendAwardMessageEvent sendAwardMessageEvent;
private final IAwardRepository awardRepository;
private final SendAwardMessageEvent sendAwardMessageEvent;
private final Map<String, IDistributeAward> distributeAwardMap;
public AwardService(IAwardRepository awardRepository, SendAwardMessageEvent sendAwardMessageEvent, Map<String, IDistributeAward> distributeAwardMap) {
this.awardRepository = awardRepository;
this.sendAwardMessageEvent = sendAwardMessageEvent;
this.distributeAwardMap = distributeAwardMap;
}
@Override
public void saveUserAwardRecord(UserAwardRecordEntity userAwardRecordEntity) {
// 构建消息对象
SendAwardMessageEvent.SendAwardMessage sendAwardMessage = new SendAwardMessageEvent.SendAwardMessage();
sendAwardMessage.setUserId(userAwardRecordEntity.getUserId());
sendAwardMessage.setOrderId(userAwardRecordEntity.getOrderId());
sendAwardMessage.setAwardId(userAwardRecordEntity.getAwardId());
sendAwardMessage.setAwardTitle(userAwardRecordEntity.getAwardTitle());
sendAwardMessage.setAwardConfig(userAwardRecordEntity.getAwardConfig());
BaseEvent.EventMessage<SendAwardMessageEvent.SendAwardMessage> sendAwardMessageEventMessage = sendAwardMessageEvent.buildEventMessage(sendAwardMessage);
......@@ -41,12 +53,32 @@ public class AwardService implements IAwardService{
taskEntity.setMessageId(sendAwardMessageEventMessage.getId());
taskEntity.setMessage(sendAwardMessageEventMessage);
taskEntity.setState(TaskStateVO.create);
// 构建聚合对象
UserAwardRecordAggregate userAwardRecordAggregate = UserAwardRecordAggregate.builder()
.taskEntity(taskEntity)
.userAwardRecordEntity(userAwardRecordEntity)
.build();
// 存储聚合对象 - 一个事务下,用户的中奖记录
awardRepository.saveUserAwardRecord(userAwardRecordAggregate);
}
@Override
public void distributeAward(DistributeAwardEntity distributeAwardEntity) {
// 奖品Key
String awardKey = awardRepository.queryAwardKey(distributeAwardEntity.getAwardId());
if (null == awardKey) {
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);
}
}
package cn.bugstack.domain.award.service;
import cn.bugstack.domain.award.model.entity.DistributeAwardEntity;
import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity;
/*
......@@ -11,4 +12,8 @@ import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity;
*/
public interface IAwardService {
void saveUserAwardRecord(UserAwardRecordEntity userAwardRecordEntity);
/**
* 配送发货奖品
*/
void distributeAward(DistributeAwardEntity distributeAwardEntity);
}
package cn.bugstack.domain.award.service.distribute;
import cn.bugstack.domain.award.model.entity.DistributeAwardEntity;
/*
* @return
* @author zhaoyongfeng
* @description 分发奖品接口
*/
public interface IDistributeAward {
void giveOutPrizes(DistributeAwardEntity distributeAwardEntity);
}
package cn.bugstack.domain.award.service.distribute.impl;
import cn.bugstack.domain.award.model.aggregate.GiveOutPrizesAggregate;
import cn.bugstack.domain.award.model.entity.DistributeAwardEntity;
import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity;
import cn.bugstack.domain.award.model.entity.UserCreditAwardEntity;
import cn.bugstack.domain.award.model.valobj.AwardStateVO;
import cn.bugstack.domain.award.repository.IAwardRepository;
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
*/
@Component("user_credit_random")
public class UserCreditRandomAward implements IDistributeAward {
@Resource
private IAwardRepository repository;
@Override
public void giveOutPrizes(DistributeAwardEntity distributeAwardEntity) {
// 奖品ID
Integer awardId = distributeAwardEntity.getAwardId();
// 查询奖品ID 「优先走透传的随机积分奖品配置」
String awardConfig = distributeAwardEntity.getAwardConfig();
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(),
distributeAwardEntity.getOrderId(),
distributeAwardEntity.getAwardId(),
AwardStateVO.complete
);
UserCreditAwardEntity userCreditAwardEntity = GiveOutPrizesAggregate.buildUserCreditAwardEntity(distributeAwardEntity.getUserId(), creditAmount);
GiveOutPrizesAggregate giveOutPrizesAggregate = new GiveOutPrizesAggregate();
giveOutPrizesAggregate.setUserId(distributeAwardEntity.getUserId());
giveOutPrizesAggregate.setUserAwardRecordEntity(userAwardRecordEntity);
giveOutPrizesAggregate.setUserCreditAwardEntity(userCreditAwardEntity);
// 存储发奖对象
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));
}
}
......@@ -29,6 +29,8 @@ public class BehaviorRebateOrderEntity {
private String rebateType;
/** 返利配置【sku值,积分值】 */
private String rebateConfig;
/** 业务仿重ID - 外部透传,方便查询使用 */
private String outBusinessNo;
/** 业务ID - 拼接的唯一值 */
private String bizId;
}
......@@ -2,6 +2,7 @@ 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.entity.BehaviorRebateOrderEntity;
import cn.bugstack.domain.rebate.model.valobj.BehaviorTypeVO;
import cn.bugstack.domain.rebate.model.valobj.DailyBehaviorRebateVO;
......@@ -17,4 +18,6 @@ public interface IBehaviorRebateRepository {
List<DailyBehaviorRebateVO> queryDailyBehaviorRebateConfig (BehaviorTypeVO behaviorTypeVO);
void saveUserRebateRecord(String userId, List<BehaviorRebateAggregate> behaviorRebateAggregates);
List<BehaviorRebateOrderEntity> queryOrderByOutBusinessNo(String userId, String outBusinessNo);
}
......@@ -85,4 +85,9 @@ public class BehaviorRebateService implements IBehaviorRebateService{
// 4. 返回订单ID集合
return orderIds;
}
@Override
public List<BehaviorRebateOrderEntity> queryOrderByOutBusinessNo(String userId, String outBusinessNo) {
return behaviorRebateRepository.queryOrderByOutBusinessNo(userId, outBusinessNo);
}
}
package cn.bugstack.domain.rebate.service;
import cn.bugstack.domain.rebate.model.entity.BehaviorEntity;
import cn.bugstack.domain.rebate.model.entity.BehaviorRebateOrderEntity;
import java.util.List;
/*
......@@ -16,4 +17,12 @@ public interface IBehaviorRebateService {
* @return 订单ID
*/
List<String> createOrder(BehaviorEntity behaviorEntity);
/**
* 根据外部单号查询订单
*
* @param userId 用户ID
* @param outBusinessNo 业务ID;签到则是日期字符串,支付则是外部的业务ID
* @return 返利订单实体
*/
List<BehaviorRebateOrderEntity> queryOrderByOutBusinessNo(String userId, String outBusinessNo);
}
package cn.bugstack.domain.strategy.model.valobj;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @ClassName: RuleWeightVO
* @Description:
* @Author: zhaoyongfeng
* @Date: 2024/12/26 0:18
*/
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RuleWeightVO {
// 原始规则值配置
private String ruleValue;
// 权重值
private Integer weight;
// 奖品配置
private List<Integer> awardIds;
// 奖品列表
private List<Award> awardList;
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class Award {
private Integer awardId;
private String awardTitle;
}
}
......@@ -4,6 +4,7 @@ import cn.bugstack.domain.strategy.model.entity.StrategyAwardEntity;
import cn.bugstack.domain.strategy.model.entity.StrategyEntity;
import cn.bugstack.domain.strategy.model.entity.StrategyRuleEntity;
import cn.bugstack.domain.strategy.model.valobj.RuleTreeVO;
import cn.bugstack.domain.strategy.model.valobj.RuleWeightVO;
import cn.bugstack.domain.strategy.model.valobj.StrategyAwardRuleModelVO;
import cn.bugstack.domain.strategy.model.valobj.StrategyAwardStockKeyVO;
......@@ -120,4 +121,11 @@ public interface IStrategyRepository {
* @return key 规则树,value rule_lock 加锁值
*/
Map<String, Integer> queryAwardRuleLockCount(String... treeIds);
/**
* 查询奖品权重配置
*
* @param strategyId 策略ID
* @return 权重规则
*/
List<RuleWeightVO> queryAwardRuleWeight(Long strategyId);
}
......@@ -52,8 +52,7 @@ public abstract class AbstractRaffleStrategy implements IRaffleStrategy {
DefaultChainFactory.StrategyAwardVO chainStrategyAwardVO = raffleLogicChain(userId, strategyId);
log.info("抽奖策略计算-责任链 {} {} {} {}", userId, strategyId, chainStrategyAwardVO.getAwardId(), chainStrategyAwardVO.getLogicModel());
if (!DefaultChainFactory.LogicModel.RULE_DEFAULT.getCode().equals(chainStrategyAwardVO.getLogicModel())) {
// TODO awardConfig 暂时为空。黑名单指定积分奖品,后续需要在库表中配置上对应的1积分值,并获取到。
return buildRaffleAwardEntity(strategyId, chainStrategyAwardVO.getAwardId(), null);
return buildRaffleAwardEntity(strategyId, chainStrategyAwardVO.getAwardId(), chainStrategyAwardVO.getAwardRuleValue());
}
// 3. 规则树抽奖过滤【奖品ID,会根据抽奖次数判断、库存判断、兜底兜里返回最终的可获得奖品信息】
......
package cn.bugstack.domain.strategy.service;
import cn.bugstack.domain.strategy.model.valobj.RuleWeightVO;
import java.util.List;
import java.util.Map;
/*
......@@ -15,4 +18,18 @@ public interface IRaffleRule {
* @return key 规则树,value rule_lock 加锁值
*/
Map<String, Integer> queryAwardRuleLockCount(String[] treeIds);
/**
* 查询奖品权重配置
*
* @param strategyId 策略ID
* @return 权重规则
*/
List<RuleWeightVO> queryAwardRuleWeight(Long strategyId);
/**
* 查询奖品权重配置
*
* @param activityId 活动ID
* @return 权重规则
*/
List<RuleWeightVO> queryAwardRuleWeightByActivityId(Long activityId);
}
......@@ -2,6 +2,7 @@ package cn.bugstack.domain.strategy.service.raffle;
import cn.bugstack.domain.strategy.model.entity.StrategyAwardEntity;
import cn.bugstack.domain.strategy.model.valobj.RuleTreeVO;
import cn.bugstack.domain.strategy.model.valobj.RuleWeightVO;
import cn.bugstack.domain.strategy.model.valobj.StrategyAwardRuleModelVO;
import cn.bugstack.domain.strategy.model.valobj.StrategyAwardStockKeyVO;
import cn.bugstack.domain.strategy.repository.IStrategyRepository;
......@@ -84,4 +85,13 @@ 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);
}
}
......@@ -78,9 +78,13 @@ public class DefaultChainFactory {
*/
private Integer awardId;
/**
*
* 抽奖类型;黑名单抽奖、权重规则、默认抽奖
*/
private String logicModel;
/**
* 抽奖奖品规则
*/
private String awardRuleValue;
}
@Getter
......
......@@ -41,6 +41,8 @@ public class BackListLogicChain extends AbstractLogicChain {
return DefaultChainFactory.StrategyAwardVO.builder()
.awardId(awardId)
.logicModel(ruleModel())
// 写入默认配置黑名单奖品值 0.01 ~ 1 积分,也可以配置到数据库表中
.awardRuleValue("0.01,1")
.build();
}
}
......
......@@ -15,4 +15,8 @@ public interface IAwardDao {
List<Award> queryAwardList();
String queryAwardConfigByAwardId(Integer awardId);
String queryAwardKeyByAwardId(Integer awardId);
}
......@@ -23,4 +23,5 @@ public interface IRaffleActivityAccountDayDao {
Integer queryRaffleActivityAccountDayPartakeCount(RaffleActivityAccountDay raffleActivityAccountDay);
void addAccountQuota(RaffleActivityAccountDay raffleActivityAccountDay);
}
......@@ -20,4 +20,5 @@ public interface IRaffleActivityAccountMonthDao {
void insertActivityAccountMonth(RaffleActivityAccountMonth raffleActivityAccountMonth);
void addAccountQuota(RaffleActivityAccountMonth raffleActivityAccountMonth);
}
......@@ -15,4 +15,6 @@ public interface IUserAwardRecordDao {
void insert(UserAwardRecord userAwardRecord);
int updateAwardRecordCompletedState(UserAwardRecord userAwardRecordReq);
}
package cn.bugstack.infrastructure.persistent.dao;
import cn.bugstack.infrastructure.persistent.po.UserBehaviorRebateOrder;
import cn.bugstack.middleware.db.router.annotation.DBRouter;
import cn.bugstack.middleware.db.router.annotation.DBRouterStrategy;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @author Fuzhengwei bugstack.cn @小傅哥
* @description 用户行为返利流水订单表
......@@ -15,4 +18,7 @@ public interface IUserBehaviorRebateOrderDao {
void insert(UserBehaviorRebateOrder userBehaviorRebateOrder);
@DBRouter
List<UserBehaviorRebateOrder> queryOrderByOutBusinessNo(UserBehaviorRebateOrder userBehaviorRebateOrderReq);
}
package cn.bugstack.infrastructure.persistent.dao;
import cn.bugstack.infrastructure.persistent.po.UserCreditAccount;
import org.apache.ibatis.annotations.Mapper;
/**
* @author Fuzhengwei bugstack.cn @小傅哥
* @description 用户积分账户
* @create 2024-05-24 21:11
*/
@Mapper
public interface IUserCreditAccountDao {
void insert(UserCreditAccount userCreditAccountReq);
int updateAddAmount(UserCreditAccount userCreditAccountReq);
}
......@@ -19,12 +19,12 @@ import java.util.Date;
@NoArgsConstructor
public class RaffleActivityAccountDay {
private final SimpleDateFormat dateFormatDay = new SimpleDateFormat("yyyy-MM-dd");
private final static SimpleDateFormat dateFormatDay = new SimpleDateFormat("yyyy-MM-dd");
/**
* 自增ID
*/
private String id;
private Long id;
/**
* 用户ID
*/
......@@ -54,7 +54,7 @@ public class RaffleActivityAccountDay {
*/
private Date updateTime;
public String currentDay() {
public static String currentDay() {
return dateFormatDay.format(new Date());
}
......
......@@ -18,10 +18,11 @@ import java.util.Date;
@AllArgsConstructor
@NoArgsConstructor
public class RaffleActivityAccountMonth {
private final SimpleDateFormat dateFormatMonth = new SimpleDateFormat("yyyy-MM");
private final static SimpleDateFormat dateFormatMonth = new SimpleDateFormat("yyyy-MM");
/** 自增ID */
private String id;
private Long id;
/** 用户ID */
private String userId;
/** 活动ID */
......@@ -36,7 +37,9 @@ public class RaffleActivityAccountMonth {
private Date createTime;
/** 更新时间 */
private Date updateTime;
public String currentMonth() {
public static String currentMonth() {
return dateFormatMonth.format(new Date());
}
}
......@@ -26,6 +26,8 @@ public class UserBehaviorRebateOrder {
private String rebateType;
/** 返利配置【sku值,积分值】 */
private String rebateConfig;
/** 业务仿重ID - 外部透传,方便查询使用 */
private String outBusinessNo;
/** 业务ID - 拼接的唯一值 */
private String bizId;
/** 创建时间 */
......
package cn.bugstack.infrastructure.persistent.po;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author Fuzhengwei bugstack.cn @小傅哥
* @description 用户积分账户
* @create 2024-05-18 09:10
*/
@Data
public class UserCreditAccount {
/** 自增ID */
private Long id;
/** 用户ID */
private String userId;
/** 总积分,显示总账户值,记得一个人获得的总积分 */
private BigDecimal totalAmount;
/** 可用积分,每次扣减的值 */
private BigDecimal availableAmount;
/** 账户状态【open - 可用,close - 冻结】 */
private String accountStatus;
/** 创建时间 */
private Date createTime;
/** 更新时间 */
private Date updateTime;
}
......@@ -476,4 +476,69 @@ public class ActivityRepository implements IActivityRepository {
return null == dayPartakeCount ? 0 : dayPartakeCount;
}
@Override
public ActivityAccountEntity queryActivityAccountEntity(Long activityId, String userId) {
// 1. 查询总账户额度
RaffleActivityAccount raffleActivityAccount = raffleActivityAccountDao.queryActivityAccountByUserId(RaffleActivityAccount.builder()
.activityId(activityId)
.userId(userId)
.build());
if (null == raffleActivityAccount) {
return ActivityAccountEntity.builder()
.activityId(activityId)
.userId(userId)
.totalCount(0)
.totalCountSurplus(0)
.monthCount(0)
.monthCountSurplus(0)
.dayCount(0)
.dayCountSurplus(0)
.build();
}
// 2. 查询月账户额度
RaffleActivityAccountMonth raffleActivityAccountMonth = raffleActivityAccountMonthDao.queryActivityAccountMonthByUserId(RaffleActivityAccountMonth.builder()
.activityId(activityId)
.userId(userId)
.build());
// 3. 查询日账户额度
RaffleActivityAccountDay raffleActivityAccountDay = raffleActivityAccountDayDao.queryActivityAccountDayByUserId(RaffleActivityAccountDay.builder()
.activityId(activityId)
.userId(userId)
.build());
// 组装对象
ActivityAccountEntity activityAccountEntity = new ActivityAccountEntity();
activityAccountEntity.setUserId(userId);
activityAccountEntity.setActivityId(activityId);
activityAccountEntity.setTotalCount(raffleActivityAccount.getTotalCount());
activityAccountEntity.setTotalCountSurplus(raffleActivityAccount.getTotalCountSurplus());
// 如果没有创建日账户,则从总账户中获取日总额度填充。「当新创建日账户时,会获得总账户额度」
if (null == raffleActivityAccountDay) {
activityAccountEntity.setDayCount(raffleActivityAccount.getDayCount());
activityAccountEntity.setDayCountSurplus(raffleActivityAccount.getDayCount());
} else {
activityAccountEntity.setDayCount(raffleActivityAccountDay.getDayCount());
activityAccountEntity.setDayCountSurplus(raffleActivityAccountDay.getDayCountSurplus());
}
// 如果没有创建月账户,则从总账户中获取月总额度填充。「当新创建日账户时,会获得总账户额度」
if (null == raffleActivityAccountMonth) {
activityAccountEntity.setMonthCount(raffleActivityAccount.getMonthCount());
activityAccountEntity.setMonthCountSurplus(raffleActivityAccount.getMonthCount());
} else {
activityAccountEntity.setMonthCount(raffleActivityAccountMonth.getMonthCount());
activityAccountEntity.setMonthCountSurplus(raffleActivityAccountMonth.getMonthCountSurplus());
}
return activityAccountEntity;
}
@Override
public Integer queryRaffleActivityAccountPartakeCount(Long activityId, String userId) {
RaffleActivityAccount raffleActivityAccount = raffleActivityAccountDao.queryActivityAccountByUserId(RaffleActivityAccount.builder()
.activityId(activityId)
.userId(userId)
.build());
return raffleActivityAccount.getTotalCount() - raffleActivityAccount.getTotalCountSurplus();
}
}
package cn.bugstack.infrastructure.persistent.repository;
import cn.bugstack.domain.award.model.aggregate.GiveOutPrizesAggregate;
import cn.bugstack.domain.award.model.aggregate.UserAwardRecordAggregate;
import cn.bugstack.domain.award.model.entity.TaskEntity;
import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity;
import cn.bugstack.domain.award.model.entity.UserCreditAwardEntity;
import cn.bugstack.domain.award.model.valobj.AccountStatusVO;
import cn.bugstack.domain.award.repository.IAwardRepository;
import cn.bugstack.infrastructure.event.EventPublisher;
import cn.bugstack.infrastructure.persistent.dao.ITaskDao;
import cn.bugstack.infrastructure.persistent.dao.IUserAwardRecordDao;
import cn.bugstack.infrastructure.persistent.dao.IUserRaffleOrderDao;
import cn.bugstack.infrastructure.persistent.dao.*;
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.middleware.db.router.strategy.IDBRouterStrategy;
import cn.bugstack.types.enums.ResponseCode;
......@@ -34,8 +36,12 @@ public class AwardRepository implements IAwardRepository {
@Resource
private ITaskDao taskDao;
@Resource
private IAwardDao awardDao;
@Resource
private IUserAwardRecordDao userAwardRecordDao;
@Resource
private IUserCreditAccountDao userCreditAccountDao;
@Resource
private IUserRaffleOrderDao userRaffleOrderDao;
@Resource
private IDBRouterStrategy dbRouter;
......@@ -108,4 +114,58 @@ public class AwardRepository implements IAwardRepository {
}
}
@Override
public String queryAwardConfig(Integer awardId) {
return awardDao.queryAwardConfigByAwardId(awardId);
}
@Override
public void saveGiveOutPrizesAggregate(GiveOutPrizesAggregate giveOutPrizesAggregate) {
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());
try {
dbRouter.doRouter(giveOutPrizesAggregate.getUserId());
transactionTemplate.execute(status -> {
try {
// 更新积分 || 创建积分账户
int updateAccountCount = userCreditAccountDao.updateAddAmount(userCreditAccountReq);
if (0 == updateAccountCount) {
userCreditAccountDao.insert(userCreditAccountReq);
}
// 更新奖品记录
int updateAwardCount = userAwardRecordDao.updateAwardRecordCompletedState(userAwardRecordReq);
if (0 == updateAwardCount) {
log.warn("更新中奖记录,重复更新拦截 userId:{} giveOutPrizesAggregate:{}", userId, JSON.toJSONString(giveOutPrizesAggregate));
status.setRollbackOnly();
}
return 1;
} catch (DuplicateKeyException e) {
status.setRollbackOnly();
log.error("更新中奖记录,唯一索引冲突 userId: {} ", userId, e);
throw new AppException(ResponseCode.INDEX_DUP.getCode(), e);
}
});
} finally {
dbRouter.clear();
}
}
@Override
public String queryAwardKey(Integer awardId) {
return awardDao.queryAwardKeyByAwardId(awardId);
}
}
......@@ -118,4 +118,29 @@ public class BehaviorRebateRepository implements IBehaviorRebateRepository {
}
}
}
@Override
public List<BehaviorRebateOrderEntity> queryOrderByOutBusinessNo(String userId, String outBusinessNo) {
// 1. 请求对象
UserBehaviorRebateOrder userBehaviorRebateOrderReq = new UserBehaviorRebateOrder();
userBehaviorRebateOrderReq.setUserId(userId);
userBehaviorRebateOrderReq.setOutBusinessNo(outBusinessNo);
// 2. 查询结果
List<UserBehaviorRebateOrder> userBehaviorRebateOrderResList = userBehaviorRebateOrderDao.queryOrderByOutBusinessNo(userBehaviorRebateOrderReq);
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();
behaviorRebateOrderEntities.add(behaviorRebateOrderEntity);
}
return behaviorRebateOrderEntities;
}
}
......@@ -5,6 +5,7 @@ import cn.bugstack.domain.strategy.model.entity.StrategyEntity;
import cn.bugstack.domain.strategy.model.entity.StrategyRuleEntity;
import cn.bugstack.domain.strategy.model.valobj.*;
import cn.bugstack.domain.strategy.repository.IStrategyRepository;
import cn.bugstack.domain.strategy.service.rule.chain.factory.DefaultChainFactory;
import cn.bugstack.infrastructure.persistent.dao.*;
import cn.bugstack.infrastructure.persistent.po.*;
import cn.bugstack.infrastructure.persistent.redis.IRedisService;
......@@ -341,4 +342,49 @@ public class StrategyRepository implements IStrategyRepository {
return resultMap;
}
@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();
strategyRuleReq.setStrategyId(strategyId);
strategyRuleReq.setRuleModel(DefaultChainFactory.LogicModel.RULE_WEIGHT.getCode());
String ruleValue = strategyRuleDao.queryStrategyRuleValue(strategyRuleReq);
// 2. 借助实体对象转换规则
StrategyRuleEntity strategyRuleEntity = new StrategyRuleEntity();
strategyRuleEntity.setRuleModel(DefaultChainFactory.LogicModel.RULE_WEIGHT.getCode());
strategyRuleEntity.setRuleValue(ruleValue);
Map<String, List<Integer>> ruleWeightValues = strategyRuleEntity.getRuleWeightValues();
// 3. 遍历规则组装奖品配置
Set<String> ruleWeightKeys = ruleWeightValues.keySet();
for (String ruleWeightKey : ruleWeightKeys) {
List<Integer> awardIds = ruleWeightValues.get(ruleWeightKey);
List<RuleWeightVO.Award> awardList = new ArrayList<>();
// 也可以修改为一次从数据库查询
for (Integer awardId : awardIds) {
StrategyAward strategyAwardReq = new StrategyAward();
strategyAwardReq.setStrategyId(strategyId);
strategyAwardReq.setAwardId(awardId);
StrategyAward strategyAward = strategyAwardDao.queryStrategyAward(strategyAwardReq);
awardList.add(RuleWeightVO.Award.builder()
.awardId(strategyAward.getAwardId())
.awardTitle(strategyAward.getAwardTitle())
.build());
}
ruleWeightVOS.add(RuleWeightVO.builder()
.ruleValue(ruleValue)
.weight(Integer.valueOf(ruleWeightKey.split(Constants.COLON)[0]))
.awardIds(awardIds)
.awardList(awardList)
.build());
}
// 设置缓存 - 实际场景中,这类数据,可以在活动下架的时候统一清空缓存。
redisService.setValue(cacheKey, ruleWeightVOS);
return ruleWeightVOS;
}
}
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.service.IRaffleActivityAccountQuotaService;
import cn.bugstack.domain.activity.service.IRaffleActivityPartakeService;
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.rebate.model.entity.BehaviorEntity;
import cn.bugstack.domain.rebate.model.entity.BehaviorRebateOrderEntity;
import cn.bugstack.domain.rebate.model.valobj.BehaviorTypeVO;
import cn.bugstack.domain.rebate.service.IBehaviorRebateService;
import cn.bugstack.domain.strategy.model.entity.RaffleAwardEntity;
......@@ -16,6 +19,8 @@ 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.types.enums.ResponseCode;
import cn.bugstack.types.exception.AppException;
import cn.bugstack.types.model.Response;
......@@ -44,6 +49,8 @@ public class RaffleActivityController implements IRaffleActivityService {
@Resource
private IRaffleActivityPartakeService raffleActivityPartakeService;
@Resource
private IRaffleActivityAccountQuotaService raffleActivityAccountQuotaService;
@Resource
private IActivityArmory activityArmory;
@Resource
private IStrategyArmory strategyArmory;
......@@ -110,15 +117,17 @@ public class RaffleActivityController implements IRaffleActivityService {
@RequestMapping(value = "draw",method = RequestMethod.POST)
@Override
public Response<ActivityDrawResponseDTO> draw(@RequestBody ActivityDrawRequestDTO request) {
try{
try {
log.info("活动抽奖 userId:{} activityId:{}", request.getUserId(), request.getActivityId());
// 1. 参数校验
if (StringUtils.isBlank(request.getUserId()) || null == request.getActivityId()) {
throw new AppException(ResponseCode.ILLEGAL_PARAMETER.getCode(), ResponseCode.ILLEGAL_PARAMETER.getInfo());
}
// 2. 参与活动 - 创建参与记录订单
UserRaffleOrderEntity orderEntity = raffleActivityPartakeService.createOrder(request.getUserId(), request.getActivityId());
log.info("活动抽奖,创建订单 userId:{} activityId:{} orderId:{}", request.getUserId(), request.getActivityId(), orderEntity.getOrderId());
// 3. 抽奖策略 - 执行抽奖
RaffleAwardEntity raffleAwardEntity = raffleStrategy.performRaffle(RaffleFactorEntity.builder()
.userId(orderEntity.getUserId())
......@@ -136,8 +145,11 @@ public class RaffleActivityController implements IRaffleActivityService {
.awardTitle(raffleAwardEntity.getAwardTitle())
.awardTime(new Date())
.awardState(AwardStateVO.create)
.awardConfig(raffleAwardEntity.getAwardConfig())
.build();
awardService.saveUserAwardRecord(userAwardRecord);
// 5. 返回结果
return Response.<ActivityDrawResponseDTO>builder()
.code(ResponseCode.SUCCESS.getCode())
......@@ -148,13 +160,13 @@ public class RaffleActivityController implements IRaffleActivityService {
.awardIndex(raffleAwardEntity.getSort())
.build())
.build();
}catch(AppException e){
} catch (AppException e) {
log.error("活动抽奖失败 userId:{} activityId:{}", request.getUserId(), request.getActivityId(), e);
return Response.<ActivityDrawResponseDTO>builder()
.code(e.getCode())
.info(e.getInfo())
.build();
}catch (Exception e) {
} catch (Exception e) {
log.error("活动抽奖失败 userId:{} activityId:{}", request.getUserId(), request.getActivityId(), e);
return Response.<ActivityDrawResponseDTO>builder()
.code(ResponseCode.UN_ERROR.getCode())
......@@ -204,4 +216,75 @@ 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)
@Override
public Response<Boolean> isCalendarSignRebate(String userId) {
try{
log.info("查询用户是否完成日历签到返利开始 userId:{}", userId);
String outBusinessNo = dateFormatDay.format(new Date());
List<BehaviorRebateOrderEntity> behaviorRebateOrderEntities = behaviorRebateService.queryOrderByOutBusinessNo(userId, outBusinessNo);
log.info("查询用户是否完成日历签到返利完成 userId:{} orders.size:{}", userId, behaviorRebateOrderEntities.size());
return Response.<Boolean>builder()
.code(ResponseCode.SUCCESS.getCode())
.info(ResponseCode.SUCCESS.getInfo())
// 只要不为空,则表示已经做了签到
.data(!behaviorRebateOrderEntities.isEmpty())
.build();
}catch (Exception e) {
log.error("查询用户是否完成日历签到返利失败 userId:{}", userId, e);
return Response.<Boolean>builder()
.code(ResponseCode.UN_ERROR.getCode())
.info(ResponseCode.UN_ERROR.getInfo())
.data(false)
.build();
}
}
/**
* 查询账户额度
* <p>
* curl --request POST \
* --url http://localhost:8091/api/v1/raffle/activity/query_user_activity_account \
* --header 'content-type: application/json' \
* --data '{
* "userId":"xiaofuge",
* "activityId": 100301
* }'
*/
@RequestMapping(value = "query_user_activity_account", method = RequestMethod.POST)
@Override
public Response<UserActivityAccountResponseDTO> queryUserActivityAccount(UserActivityAccountRequestDTO request) {
try {
log.info("查询用户活动账户开始 userId:{} activityId:{}", request.getUserId(), request.getActivityId());
// 1. 参数校验
if (StringUtils.isBlank(request.getUserId()) || null == request.getActivityId()) {
throw new AppException(ResponseCode.ILLEGAL_PARAMETER.getCode(), ResponseCode.ILLEGAL_PARAMETER.getInfo());
}
ActivityAccountEntity activityAccountEntity = raffleActivityAccountQuotaService.queryActivityAccountEntity(request.getActivityId(), request.getUserId());
UserActivityAccountResponseDTO userActivityAccountResponseDTO = UserActivityAccountResponseDTO.builder()
.totalCount(activityAccountEntity.getTotalCount())
.totalCountSurplus(activityAccountEntity.getTotalCountSurplus())
.dayCount(activityAccountEntity.getDayCount())
.dayCountSurplus(activityAccountEntity.getDayCountSurplus())
.monthCount(activityAccountEntity.getMonthCount())
.monthCountSurplus(activityAccountEntity.getMonthCountSurplus())
.build();
log.info("查询用户活动账户完成 userId:{} activityId:{} dto:{}", request.getUserId(), request.getActivityId(), JSON.toJSONString(userActivityAccountResponseDTO));
return Response.<UserActivityAccountResponseDTO>builder()
.code(ResponseCode.SUCCESS.getCode())
.info(ResponseCode.SUCCESS.getInfo())
.data(userActivityAccountResponseDTO)
.build();
}catch (Exception e){
log.error("查询用户活动账户失败 userId:{} activityId:{}", request.getUserId(), request.getActivityId(), e);
return Response.<UserActivityAccountResponseDTO>builder()
.code(ResponseCode.UN_ERROR.getCode())
.info(ResponseCode.UN_ERROR.getInfo())
.build();
}
}
}
......@@ -4,15 +4,13 @@ import cn.bugstack.domain.activity.service.IRaffleActivityAccountQuotaService;
import cn.bugstack.domain.strategy.model.entity.RaffleAwardEntity;
import cn.bugstack.domain.strategy.model.entity.RaffleFactorEntity;
import cn.bugstack.domain.strategy.model.entity.StrategyAwardEntity;
import cn.bugstack.domain.strategy.model.valobj.RuleWeightVO;
import cn.bugstack.domain.strategy.service.IRaffleAward;
import cn.bugstack.domain.strategy.service.IRaffleRule;
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.RaffleAwardListRequestDTO;
import cn.bugstack.trigger.api.dto.RaffleRequestDTO;
import cn.bugstack.trigger.api.dto.RaffleAwardListResponseDTO;
import cn.bugstack.trigger.api.dto.RaffleResponseDTO;
import cn.bugstack.trigger.api.dto.*;
import cn.bugstack.types.enums.ResponseCode;
import cn.bugstack.types.exception.AppException;
import cn.bugstack.types.model.Response;
......@@ -178,5 +176,63 @@ public class RaffleStrategyController implements IRaffleStrategyService {
.build();
}
}
/**
* 查询抽奖策略权重规则,给用户展示出抽奖N次后必中奖奖品范围
* curl --request POST \
* --url http://localhost:8091/api/v1/raffle/strategy/query_raffle_strategy_rule_weight \
* --header 'content-type: application/json' \
* --data '{
* "userId":"xiaofuge",
* "activityId": 100301
* }'
*/
@RequestMapping(value = "query_raffle_strategy_rule_weight", method = RequestMethod.POST)
@Override
public Response<List<RaffleStrategyRuleWeightResponseDTO>> queryRaffleStrategyRuleWeight(RaffleStrategyRuleWeightRequestDTO request) {
try {
log.info("查询抽奖策略权重规则配置开始 userId:{} activityId:{}", request.getUserId(), request.getActivityId());
// 1. 参数校验
if (StringUtils.isBlank(request.getUserId()) || null == request.getActivityId()) {
throw new AppException(ResponseCode.ILLEGAL_PARAMETER.getCode(), ResponseCode.ILLEGAL_PARAMETER.getInfo());
}
// 2. 查询用户抽奖总次数
Integer userActivityAccountTotalUseCount = raffleActivityAccountQuotaService.queryRaffleActivityAccountPartakeCount(request.getActivityId(), request.getUserId());
// 3. 查询规则
List<RaffleStrategyRuleWeightResponseDTO> raffleStrategyRuleWeightList = new ArrayList<>();
List<RuleWeightVO> ruleWeightVOList = raffleRule.queryAwardRuleWeightByActivityId(request.getActivityId());
for (RuleWeightVO ruleWeightVO : ruleWeightVOList) {
// 转换对象
List<RaffleStrategyRuleWeightResponseDTO.StrategyAward> strategyAwards = new ArrayList<>();
List<RuleWeightVO.Award> awardList = ruleWeightVO.getAwardList();
for (RuleWeightVO.Award award : awardList) {
RaffleStrategyRuleWeightResponseDTO.StrategyAward strategyAward = new RaffleStrategyRuleWeightResponseDTO.StrategyAward();
strategyAward.setAwardId(award.getAwardId());
strategyAward.setAwardTitle(award.getAwardTitle());
strategyAwards.add(strategyAward);
}
// 封装对象
RaffleStrategyRuleWeightResponseDTO raffleStrategyRuleWeightResponseDTO = new RaffleStrategyRuleWeightResponseDTO();
raffleStrategyRuleWeightResponseDTO.setRuleWeightCount(ruleWeightVO.getWeight());
raffleStrategyRuleWeightResponseDTO.setStrategyAwards(strategyAwards);
raffleStrategyRuleWeightResponseDTO.setUserActivityAccountTotalUseCount(userActivityAccountTotalUseCount);
raffleStrategyRuleWeightList.add(raffleStrategyRuleWeightResponseDTO);
}
Response<List<RaffleStrategyRuleWeightResponseDTO>> response = Response.<List<RaffleStrategyRuleWeightResponseDTO>>builder()
.code(ResponseCode.SUCCESS.getCode())
.info(ResponseCode.SUCCESS.getInfo())
.data(raffleStrategyRuleWeightList)
.build();
log.info("查询抽奖策略权重规则配置完成 userId:{} activityId:{} response: {}", request.getUserId(), request.getActivityId(), JSON.toJSONString(response));
return response;
}catch (Exception e) {
log.error("查询抽奖策略权重规则配置失败 userId:{} activityId:{}", request.getUserId(), request.getActivityId(), e);
return Response.<List<RaffleStrategyRuleWeightResponseDTO>>builder()
.code(ResponseCode.UN_ERROR.getCode())
.info(ResponseCode.UN_ERROR.getInfo())
.build();
}
}
}
package cn.bugstack.trigger.listener;
import cn.bugstack.domain.award.event.SendAwardMessageEvent;
import cn.bugstack.domain.award.model.entity.DistributeAwardEntity;
import cn.bugstack.domain.award.service.IAwardService;
import cn.bugstack.types.event.BaseEvent;
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;
/**
* @ClassName: SendAwardCustomer
* @Description: 用户奖品记录消息消费者
......@@ -18,11 +26,23 @@ 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);
BaseEvent.EventMessage<SendAwardMessageEvent.SendAwardMessage> eventMessage = JSON.parseObject(message, new TypeReference<BaseEvent.EventMessage<SendAwardMessageEvent.SendAwardMessage>>() {
}.getType());
SendAwardMessageEvent.SendAwardMessage sendAwardMessage = eventMessage.getData();
// 发放奖品
DistributeAwardEntity distributeAwardEntity = new DistributeAwardEntity();
distributeAwardEntity.setUserId(sendAwardMessage.getUserId());
distributeAwardEntity.setOrderId(sendAwardMessage.getOrderId());
distributeAwardEntity.setAwardId(sendAwardMessage.getAwardId());
distributeAwardEntity.setAwardConfig(sendAwardMessage.getAwardConfig());
awardService.distributeAward(distributeAwardEntity);
} catch (Exception e) {
log.error("监听用户奖品发送消息,消费失败 topic: {} message: {}", topic, message);
throw e;
......
......@@ -22,8 +22,10 @@ public class Constants {
public static String RULE_TREE_VO_KEY = "rule_tree_vo_key_";
public static String STRATEGY_AWARD_COUNT_KEY = "strategy_award_count_key_";
public static String STRATEGY_AWARD_COUNT_QUERY_KEY = "strategy_award_count_query_key";
public static String STRATEGY_RULE_WEIGHT_KEY = "strategy_rule_weight_key_";
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_";
}
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
24-12-10.15:43:56.582 [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-10.15:43:56.585 [main ] INFO Application - The following 1 profile is active: "dev"
24-12-10.15:43:57.724 [main ] INFO RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
24-12-10.15:43:57.727 [main ] INFO RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
24-12-10.15:43:57.758 [main ] INFO RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 12 ms. Found 0 Redis repository interfaces.
24-12-10.15:43:58.921 [main ] INFO TomcatWebServer - Tomcat initialized with port(s): 8091 (http)
24-12-10.15:43:58.934 [main ] INFO Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8091"]
24-12-10.15:43:58.936 [main ] INFO StandardService - Starting service [Tomcat]
24-12-10.15:43:58.936 [main ] INFO StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.75]
24-12-10.15:43:59.029 [main ] INFO [/] - Initializing Spring embedded WebApplicationContext
24-12-10.15:43:59.029 [main ] INFO ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2343 ms
24-12-10.15:43:59.840 [main ] INFO Version - Redisson 3.23.4
24-12-10.15:44:00.337 [redisson-netty-2-5] INFO MasterPubSubConnectionPool - 1 connections initialized for redis/172.19.0.4:6379
24-12-10.15:44:00.422 [redisson-netty-2-14] INFO MasterConnectionPool - 5 connections initialized for redis/172.19.0.4:6379
24-12-10.15:44:01.293 [main ] INFO EndpointLinksResolver - Exposing 1 endpoint(s) beneath base path '/actuator'
24-12-10.15:44:01.443 [main ] INFO Http11NioProtocol - Starting ProtocolHandler ["http-nio-8091"]
24-12-10.15:44:01.462 [main ] INFO TomcatWebServer - Tomcat started on port(s): 8091 (http) with context path ''
24-12-10.15:44:01.479 [main ] INFO Application - Started Application in 5.895 seconds (JVM running for 7.099)
24-12-10.15:44:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:44:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:44:15.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:44:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:44:24.995 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:44:30.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:44:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:44:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:44:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:44:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:44:54.995 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:45:00.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:45:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:45:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:45:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:45:20.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:45:24.997 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:45:30.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:45:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:45:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:45:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:45:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:45:54.997 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:46:00.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:46:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:46:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:46:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:46:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:46:24.998 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:46:30.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:46:35.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:46:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.15:46:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.22:32:45.666 [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-10.22:32:45.669 [main ] INFO Application - The following 1 profile is active: "dev"
24-12-10.22:32:46.486 [main ] INFO RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
24-12-10.22:32:46.488 [main ] INFO RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
24-12-10.22:32:46.514 [main ] INFO RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 10 ms. Found 0 Redis repository interfaces.
24-12-10.22:32:47.461 [main ] INFO TomcatWebServer - Tomcat initialized with port(s): 8091 (http)
24-12-10.22:32:47.471 [main ] INFO Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8091"]
24-12-10.22:32:47.472 [main ] INFO StandardService - Starting service [Tomcat]
24-12-10.22:32:47.472 [main ] INFO StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.75]
24-12-10.22:32:47.549 [main ] INFO [/] - Initializing Spring embedded WebApplicationContext
24-12-10.22:32:47.550 [main ] INFO ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1818 ms
24-12-10.22:32:48.207 [main ] INFO Version - Redisson 3.23.4
24-12-10.22:32:48.672 [redisson-netty-2-5] INFO MasterPubSubConnectionPool - 1 connections initialized for redis/172.19.0.4:6379
24-12-10.22:32:48.722 [redisson-netty-2-14] INFO MasterConnectionPool - 5 connections initialized for redis/172.19.0.4:6379
24-12-10.22:32:49.465 [main ] INFO EndpointLinksResolver - Exposing 1 endpoint(s) beneath base path '/actuator'
24-12-10.22:32:49.613 [main ] INFO Http11NioProtocol - Starting ProtocolHandler ["http-nio-8091"]
24-12-10.22:32:49.634 [main ] INFO TomcatWebServer - Tomcat started on port(s): 8091 (http) with context path ''
24-12-10.22:32:49.653 [main ] INFO Application - Started Application in 4.491 seconds (JVM running for 4.849)
24-12-10.22:32:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.22:32:50.930 [http-nio-8091-exec-1] INFO [/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
24-12-10.22:32:50.930 [http-nio-8091-exec-1] INFO DispatcherServlet - Initializing Servlet 'dispatcherServlet'
24-12-10.22:32:50.931 [http-nio-8091-exec-1] INFO DispatcherServlet - Completed initialization in 1 ms
24-12-10.22:32:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.22:33:00.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.22:33:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-10.22:33:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:18:14.182 [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-11.16:18:14.187 [main ] INFO Application - The following 1 profile is active: "dev"
24-12-11.16:18:15.757 [main ] INFO RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
24-12-11.16:18:15.774 [main ] INFO RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
24-12-11.16:18:15.882 [main ] INFO RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 38 ms. Found 0 Redis repository interfaces.
24-12-11.16:18:17.392 [main ] INFO TomcatWebServer - Tomcat initialized with port(s): 8091 (http)
24-12-11.16:18:17.407 [main ] INFO Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8091"]
24-12-11.16:18:17.408 [main ] INFO StandardService - Starting service [Tomcat]
24-12-11.16:18:17.408 [main ] INFO StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.75]
24-12-11.16:18:17.509 [main ] INFO [/] - Initializing Spring embedded WebApplicationContext
24-12-11.16:18:17.509 [main ] INFO ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 3214 ms
24-12-11.16:18:18.541 [main ] INFO Version - Redisson 3.23.4
24-12-11.16:18:19.057 [redisson-netty-2-5] INFO MasterPubSubConnectionPool - 1 connections initialized for redis/172.19.0.3:6379
24-12-11.16:18:19.180 [redisson-netty-2-14] INFO MasterConnectionPool - 5 connections initialized for redis/172.19.0.3:6379
24-12-11.16:18:20.168 [main ] INFO EndpointLinksResolver - Exposing 1 endpoint(s) beneath base path '/actuator'
24-12-11.16:18:20.326 [main ] INFO Http11NioProtocol - Starting ProtocolHandler ["http-nio-8091"]
24-12-11.16:18:20.348 [main ] INFO TomcatWebServer - Tomcat started on port(s): 8091 (http) with context path ''
24-12-11.16:18:20.367 [main ] INFO Application - Started Application in 7.199 seconds (JVM running for 9.001)
24-12-11.16:18:25.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:18:30.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:18:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:18:40.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:18:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:18:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:18:55.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:19:00.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:19:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:19:10.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:19:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:19:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:19:25.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:19:30.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:19:34.999 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:19:40.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:19:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:19:50.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:19:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:20:00.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:20:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:20:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:20:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:20:20.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:20:25.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:20:30.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:20:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:20:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:20:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:20:50.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:20:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:21:00.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:21:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:21:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:21:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:21:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:21:25.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:21:30.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:21:34.999 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:21:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:21:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:21:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:21:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:22:00.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:22:05.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:22:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:22:15.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:22:20.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:22:25.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:22:30.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:22:34.999 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:22:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:22:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:22:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-11.16:22:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-11-26.12:53:53.296 [scheduling-1 ] ERROR UpdateAwardStockJob - 定时任务,更新奖品消耗库存失败
org.springframework.data.redis.RedisConnectionFailureException: Unable to write command into connection! Increase nettyThreads setting. Node source: NodeSource [slot=0, addr=null, redisClient=null, redirect=null, entry=null], connection: RedisConnection@1693037281 [redisClient=[addr=redis://redis:6379], channel=[id: 0x6328a656, L:0.0.0.0/0.0.0.0:49448], currentCommand=null, usage=1], command: (LPOP), params: [strategy_award_count_query_key] after 3 retry attempts; nested exception is org.redisson.client.WriteRedisConnectionException: Unable to write command into connection! Increase nettyThreads setting. Node source: NodeSource [slot=0, addr=null, redisClient=null, redirect=null, entry=null], connection: RedisConnection@1693037281 [redisClient=[addr=redis://redis:6379], channel=[id: 0x6328a656, L:0.0.0.0/0.0.0.0:49448], currentCommand=null, usage=1], command: (LPOP), params: [strategy_award_count_query_key] after 3 retry attempts
24-12-26.20:28:28.217 [scheduling-1 ] ERROR UpdateAwardStockJob - 定时任务,更新奖品消耗库存失败
org.springframework.data.redis.RedisConnectionFailureException: Unable to write command into connection! Increase nettyThreads setting. Node source: NodeSource [slot=0, addr=null, redisClient=null, redirect=null, entry=null], connection: RedisConnection@1261146604 [redisClient=[addr=redis://redis:6379], channel=[id: 0x4ec2c37a, L:0.0.0.0/0.0.0.0:54446], currentCommand=null, usage=1], command: (LPOP), params: [strategy_award_count_query_key] after 3 retry attempts; nested exception is org.redisson.client.WriteRedisConnectionException: Unable to write command into connection! Increase nettyThreads setting. Node source: NodeSource [slot=0, addr=null, redisClient=null, redirect=null, entry=null], connection: RedisConnection@1261146604 [redisClient=[addr=redis://redis:6379], channel=[id: 0x4ec2c37a, L:0.0.0.0/0.0.0.0:54446], currentCommand=null, usage=1], command: (LPOP), params: [strategy_award_count_query_key] after 3 retry attempts
at org.redisson.spring.data.connection.RedissonExceptionConverter.convert(RedissonExceptionConverter.java:40)
at org.redisson.spring.data.connection.RedissonExceptionConverter.convert(RedissonExceptionConverter.java:35)
at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:44)
......@@ -26,7 +26,7 @@ org.springframework.data.redis.RedisConnectionFailureException: Unable to write
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
Caused by: org.redisson.client.WriteRedisConnectionException: Unable to write command into connection! Increase nettyThreads setting. Node source: NodeSource [slot=0, addr=null, redisClient=null, redirect=null, entry=null], connection: RedisConnection@1693037281 [redisClient=[addr=redis://redis:6379], channel=[id: 0x6328a656, L:0.0.0.0/0.0.0.0:49448], currentCommand=null, usage=1], command: (LPOP), params: [strategy_award_count_query_key] after 3 retry attempts
Caused by: org.redisson.client.WriteRedisConnectionException: Unable to write command into connection! Increase nettyThreads setting. Node source: NodeSource [slot=0, addr=null, redisClient=null, redirect=null, entry=null], connection: RedisConnection@1261146604 [redisClient=[addr=redis://redis:6379], channel=[id: 0x4ec2c37a, L:0.0.0.0/0.0.0.0:54446], currentCommand=null, usage=1], command: (LPOP), params: [strategy_award_count_query_key] after 3 retry attempts
at org.redisson.command.RedisExecutor.checkWriteFuture(RedisExecutor.java:345)
at org.redisson.command.RedisExecutor.lambda$execute$3(RedisExecutor.java:188)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
......
24-12-24.10:14:26.902 [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-24.10:14:26.905 [main ] INFO Application - The following 1 profile is active: "dev"
24-12-24.10:14:30.138 [main ] INFO RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
24-12-24.10:14:30.145 [main ] INFO RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
24-12-24.10:14:30.264 [main ] INFO RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 46 ms. Found 0 Redis repository interfaces.
24-12-24.10:14:32.875 [main ] INFO TomcatWebServer - Tomcat initialized with port(s): 8091 (http)
24-12-24.10:14:32.909 [main ] INFO Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8091"]
24-12-24.10:14:32.911 [main ] INFO StandardService - Starting service [Tomcat]
24-12-24.10:14:32.911 [main ] INFO StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.75]
24-12-24.10:14:33.165 [main ] INFO [/] - Initializing Spring embedded WebApplicationContext
24-12-24.10:14:33.166 [main ] INFO ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 5829 ms
24-12-24.10:14:34.724 [main ] INFO Version - Redisson 3.23.4
24-12-24.10:14:35.843 [redisson-netty-2-5] INFO MasterPubSubConnectionPool - 1 connections initialized for redis/172.19.0.2:6379
24-12-24.10:14:35.968 [redisson-netty-2-14] INFO MasterConnectionPool - 5 connections initialized for redis/172.19.0.2:6379
24-12-24.10:14:37.838 [main ] INFO EndpointLinksResolver - Exposing 1 endpoint(s) beneath base path '/actuator'
24-12-24.10:14:37.883 [main ] INFO Http11NioProtocol - Starting ProtocolHandler ["http-nio-8091"]
24-12-24.10:14:37.921 [main ] INFO TomcatWebServer - Tomcat started on port(s): 8091 (http) with context path ''
24-12-24.10:14:37.952 [main ] INFO Application - Started Application in 13.364 seconds (JVM running for 15.871)
24-12-24.10:14:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-24.10:14:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-24.10:14:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-24.10:14:55.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-24.10:15:00.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-24.10:15:05.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-24.10:15:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-24.10:15:15.001 [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 - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
......@@ -7,7 +7,7 @@
#
# 主机: 127.0.0.1 (MySQL 5.6.39)
# 数据库: big_market
# 生成时间: 2024-04-30 10:19:11 +0000
# 生成时间: 2024-05-25 02:56:19 +0000
# ************************************************************
......@@ -35,7 +35,8 @@ CREATE TABLE `award` (
`award_desc` varchar(128) 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`)
PRIMARY KEY (`id`),
UNIQUE KEY `uq_award_id` (`award_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='奖品表';
LOCK TABLES `award` WRITE;
......@@ -144,7 +145,7 @@ 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,10000,1000,1000,'2024-03-09 10:15:42','2024-04-27 15:49:37');
(1,11101,100,100,100,'2024-03-09 10:15:42','2024-05-04 13:06:45');
/*!40000 ALTER TABLE `raffle_activity_count` ENABLE KEYS */;
UNLOCK TABLES;
......@@ -174,7 +175,7 @@ LOCK TABLES `raffle_activity_sku` WRITE;
INSERT INTO `raffle_activity_sku` (`id`, `sku`, `activity_id`, `activity_count_id`, `stock_count`, `stock_count_surplus`, `create_time`, `update_time`)
VALUES
(1,9011,100301,11101,100000,100000,'2024-03-16 11:41:09','2024-04-27 15:49:25');
(1,9011,100301,11101,100000,99909,'2024-03-16 11:41:09','2024-05-25 10:53:20');
/*!40000 ALTER TABLE `raffle_activity_sku` ENABLE KEYS */;
UNLOCK TABLES;
......@@ -311,7 +312,7 @@ VALUES
(3,100002,'抽奖策略-非完整1概率',NULL,'2023-12-09 09:37:19','2024-02-03 10:14:17'),
(4,100004,'抽奖策略-随机抽奖',NULL,'2023-12-09 09:37:19','2024-01-20 19:21:03'),
(5,100005,'抽奖策略-测试概率计算',NULL,'2023-12-09 09:37:19','2024-01-21 21:54:58'),
(6,100006,'抽奖策略-规则树',NULL,'2024-02-03 09:53:40','2024-02-03 09:53:40');
(6,100006,'抽奖策略-规则树','rule_blacklist,rule_weight','2024-02-03 09:53:40','2024-05-03 09:02:38');
/*!40000 ALTER TABLE `strategy` ENABLE KEYS */;
UNLOCK TABLES;
......@@ -365,14 +366,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,61,0.0200,'tree_luck_award',1,'2023-12-09 09:38:31','2024-04-27 13:38:05'),
(23,100006,102,'OpenAI会员卡',NULL,100,19,0.0300,'tree_luck_award',2,'2023-12-09 09:38:31','2024-04-27 15:00:20'),
(24,100006,103,'支付优惠券',NULL,100,43,0.0300,'tree_luck_award',3,'2023-12-09 09:38:31','2024-04-27 13:29:35'),
(25,100006,104,'小米台灯',NULL,100,36,0.0300,'tree_luck_award',4,'2023-12-09 09:38:31','2024-04-27 15:00:30'),
(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,25,0.0300,'tree_lock_2',6,'2023-12-09 09:38:31','2024-04-27 13:30:05'),
(28,100006,107,'小霸王游戏机','抽奖1次后解锁',100,24,0.0300,'tree_lock_1',7,'2023-12-09 09:38:31','2024-04-27 13:36:35'),
(29,100006,108,'暴走玩偶',NULL,100,33,0.0300,'tree_luck_award',8,'2023-12-09 09:38:31','2024-04-27 13:19:45');
(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');
/*!40000 ALTER TABLE `strategy_award` ENABLE KEYS */;
UNLOCK TABLES;
......@@ -394,6 +395,7 @@ CREATE TABLE `strategy_rule` (
`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_strategy_id_rule_model` (`strategy_id`,`rule_model`),
KEY `idx_strategy_id_award_id` (`strategy_id`,`award_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='抽奖策略规则';
......@@ -402,8 +404,10 @@ LOCK TABLES `strategy_rule` WRITE;
INSERT INTO `strategy_rule` (`id`, `strategy_id`, `award_id`, `rule_type`, `rule_model`, `rule_value`, `rule_desc`, `create_time`, `update_time`)
VALUES
(13,100001,NULL,1,'rule_weight','4000:102,103,104,105 5000:102,103,104,105,106,107 6000:102,103,104,105,106,107,108,109','消耗6000分,必中奖范围','2023-12-09 10:30:43','2023-12-31 14:51:50'),
(14,100001,NULL,1,'rule_blacklist','101:user001,user002,user003','黑名单抽奖,积分兜底','2023-12-09 12:59:45','2024-02-14 18:16:20');
(13,100001,NULL,1,'rule_weight','60:102,103,104,105 200:106,107 1000:105','消耗6000分,必中奖范围','2023-12-09 10:30:43','2024-05-04 12:44:47'),
(14,100001,NULL,1,'rule_blacklist','101:user001,user002,user003','黑名单抽奖,积分兜底','2023-12-09 12:59:45','2024-02-14 18:16:20'),
(15,100006,NULL,1,'rule_weight','10:102,103 70:106,107 1000:104,105','消耗6000分,必中奖范围','2023-12-09 10:30:43','2024-05-04 15:41:16'),
(16,100006,NULL,1,'rule_blacklist','101:user001,user002,user003','黑名单抽奖,积分兜底','2023-12-09 12:59:45','2024-02-14 18:16:20');
/*!40000 ALTER TABLE `strategy_rule` ENABLE KEYS */;
UNLOCK TABLES;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册