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

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

上级 d47fb273
...@@ -2,6 +2,8 @@ package cn.bugstack.trigger.api; ...@@ -2,6 +2,8 @@ package cn.bugstack.trigger.api;
import cn.bugstack.trigger.api.dto.ActivityDrawRequestDTO; import cn.bugstack.trigger.api.dto.ActivityDrawRequestDTO;
import cn.bugstack.trigger.api.dto.ActivityDrawResponseDTO; 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.types.model.Response;
/* /*
...@@ -30,4 +32,19 @@ public interface IRaffleActivityService { ...@@ -30,4 +32,19 @@ public interface IRaffleActivityService {
* @return 签到结果 * @return 签到结果
*/ */
Response<Boolean> calendarSignRebate(String userId); 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; package cn.bugstack.trigger.api;
import cn.bugstack.trigger.api.dto.RaffleAwardListRequestDTO; import cn.bugstack.trigger.api.dto.*;
import cn.bugstack.trigger.api.dto.RaffleAwardListResponseDTO;
import cn.bugstack.trigger.api.dto.RaffleRequestDTO;
import cn.bugstack.trigger.api.dto.RaffleResponseDTO;
import cn.bugstack.types.model.Response; import cn.bugstack.types.model.Response;
import java.util.List; import java.util.List;
/*
* @return
* @author zhaoyongfeng
* @description 抽奖服务接口
*/
public interface IRaffleStrategyService { public interface IRaffleStrategyService {
...@@ -33,6 +35,13 @@ public interface IRaffleStrategyService { ...@@ -33,6 +35,13 @@ public interface IRaffleStrategyService {
* @return 抽奖结果 * @return 抽奖结果
*/ */
Response<RaffleResponseDTO> randomRaffle(RaffleRequestDTO requestDTO); 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 @@ ...@@ -18,4 +18,12 @@
limit 10 limit 10
</select> </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> </mapper>
...@@ -15,9 +15,9 @@ ...@@ -15,9 +15,9 @@
<insert id="insertActivityAccountDay" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityAccountDay"> <insert id="insertActivityAccountDay" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityAccountDay">
insert into raffle_activity_account_day( 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 values
(#{userId}, #{activityId}, #{day}, #{dayCount}, #{dayCountSurplus}, now(), now()) (#{userId}, #{activityId}, #{day}, #{dayCount}, #{dayCountSurplus}, now(), now())
</insert> </insert>
<update id="updateActivityAccountDaySubtractionQuota" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityAccountDay"> <update id="updateActivityAccountDaySubtractionQuota" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityAccountDay">
...@@ -45,4 +45,5 @@ ...@@ -45,4 +45,5 @@
update_time = now() update_time = now()
where user_id = #{userId} and activity_id = #{activityId} and day = #{day} where user_id = #{userId} and activity_id = #{activityId} and day = #{day}
</update> </update>
</mapper> </mapper>
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
set month_count_surplus = month_count_surplus - 1, update_time = now() 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 where user_id = #{userId} and activity_id = #{activityId} and month = #{month} and month_count_surplus > 0
</update> </update>
<update id="addAccountQuota" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityAccountMonth"> <update id="addAccountQuota" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityAccountMonth">
update raffle_activity_account_month update raffle_activity_account_month
set month_count_surplus = month_count_surplus + #{monthCountSurplus}, set month_count_surplus = month_count_surplus + #{monthCountSurplus},
...@@ -38,4 +39,5 @@ ...@@ -38,4 +39,5 @@
update_time = now() update_time = now()
where user_id = #{userId} and activity_id = #{activityId} and month = #{month} where user_id = #{userId} and activity_id = #{activityId} and month = #{month}
</update> </update>
</mapper> </mapper>
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
<mapper namespace="cn.bugstack.infrastructure.persistent.dao.IRaffleActivitySkuDao"> <mapper namespace="cn.bugstack.infrastructure.persistent.dao.IRaffleActivitySkuDao">
<resultMap id="dataMap" type="cn.bugstack.infrastructure.persistent.po.RaffleActivitySku"> <resultMap id="dataMap" type="cn.bugstack.infrastructure.persistent.po.RaffleActivitySku">
<id column="id" property="id"/>
<result column="sku" property="sku"/> <result column="sku" property="sku"/>
<result column="activity_id" property="activityId"/> <result column="activity_id" property="activityId"/>
<result column="activity_count_id" property="activityCountId"/> <result column="activity_count_id" property="activityCountId"/>
......
...@@ -24,4 +24,9 @@ ...@@ -24,4 +24,9 @@
) )
</insert> </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> </mapper>
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
<result column="rebate_desc" property="rebateDesc"/> <result column="rebate_desc" property="rebateDesc"/>
<result column="rebate_type" property="rebateType"/> <result column="rebate_type" property="rebateType"/>
<result column="rebate_config" property="rebateConfig"/> <result column="rebate_config" property="rebateConfig"/>
<result column="out_business_no" property="outBusinessNo"/>
<result column="biz_id" property="bizId"/> <result column="biz_id" property="bizId"/>
<result column="create_time" property="createTime"/> <result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/> <result column="update_time" property="updateTime"/>
...@@ -17,10 +18,16 @@ ...@@ -17,10 +18,16 @@
<insert id="insert" parameterType="cn.bugstack.infrastructure.persistent.po.UserBehaviorRebateOrder"> <insert id="insert" parameterType="cn.bugstack.infrastructure.persistent.po.UserBehaviorRebateOrder">
insert into user_behavior_rebate_order( 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( ) values(
#{userId}, #{orderId}, #{behaviorType}, #{rebateDesc}, #{rebateType}, #{rebateConfig}, #{bizId}, now(), now() #{userId}, #{orderId}, #{behaviorType}, #{rebateDesc}, #{rebateType}, #{rebateConfig}, #{outBusinessNo}, #{bizId}, now(), now()
) )
</insert> </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> </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 { ...@@ -51,4 +51,8 @@ public interface IActivityRepository {
List<ActivitySkuEntity> queryActivitySkuListByActivityId(Long activityId); List<ActivitySkuEntity> queryActivitySkuListByActivityId(Long activityId);
Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId); Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId);
ActivityAccountEntity queryActivityAccountEntity(Long activityId, String userId);
Integer queryRaffleActivityAccountPartakeCount(Long activityId, String userId);
} }
package cn.bugstack.domain.activity.service; package cn.bugstack.domain.activity.service;
import cn.bugstack.domain.activity.model.entity.ActivityAccountEntity;
import cn.bugstack.domain.activity.model.entity.SkuRechargeEntity; import cn.bugstack.domain.activity.model.entity.SkuRechargeEntity;
/* /*
...@@ -26,4 +27,20 @@ public interface IRaffleActivityAccountQuotaService { ...@@ -26,4 +27,20 @@ public interface IRaffleActivityAccountQuotaService {
* @return 参与次数 * @return 参与次数
*/ */
Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId); 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 ...@@ -53,6 +53,7 @@ public abstract class AbstractRaffleActivityAccountQuota extends RaffleActivityA
return createOrderAggregate.getActivityOrderEntity().getOrderId(); return createOrderAggregate.getActivityOrderEntity().getOrderId();
} }
protected abstract CreateQuotaOrderAggregate buildOrderAggregate(SkuRechargeEntity skuRechargeEntity, ActivitySkuEntity activitySkuEntity, ActivityEntity activityEntity, ActivityCountEntity activityCountEntity); protected abstract CreateQuotaOrderAggregate buildOrderAggregate(SkuRechargeEntity skuRechargeEntity, ActivitySkuEntity activitySkuEntity, ActivityEntity activityEntity, ActivityCountEntity activityCountEntity);
protected abstract void doSaveOrder(CreateQuotaOrderAggregate createOrderAggregate); protected abstract void doSaveOrder(CreateQuotaOrderAggregate createOrderAggregate);
......
...@@ -81,4 +81,14 @@ public class RaffleActivityAccountQuotaService extends AbstractRaffleActivityAcc ...@@ -81,4 +81,14 @@ public class RaffleActivityAccountQuotaService extends AbstractRaffleActivityAcc
public Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId) { public Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId) {
return activityRepository.queryRaffleActivityAccountDayPartakeCount(activityId, 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 ...@@ -45,6 +45,10 @@ public class SendAwardMessageEvent extends BaseEvent<SendAwardMessageEvent.SendA
* 用户ID * 用户ID
*/ */
private String userId; private String userId;
/**
* 订单ID
*/
private String orderId;
/** /**
* 奖品ID * 奖品ID
*/ */
...@@ -53,6 +57,10 @@ public class SendAwardMessageEvent extends BaseEvent<SendAwardMessageEvent.SendA ...@@ -53,6 +57,10 @@ public class SendAwardMessageEvent extends BaseEvent<SendAwardMessageEvent.SendA
* 奖品标题(名称) * 奖品标题(名称)
*/ */
private String awardTitle; 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 { ...@@ -35,4 +35,6 @@ public class UserAwardRecordEntity {
private Date awardTime; private Date awardTime;
/** 奖品状态;create-创建、completed-发奖完成 */ /** 奖品状态;create-创建、completed-发奖完成 */
private AwardStateVO awardState; 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; package cn.bugstack.domain.award.repository;
import cn.bugstack.domain.award.model.aggregate.GiveOutPrizesAggregate;
import cn.bugstack.domain.award.model.aggregate.UserAwardRecordAggregate; import cn.bugstack.domain.award.model.aggregate.UserAwardRecordAggregate;
/* /*
* @return 奖品仓储服务 * @return 奖品仓储服务
...@@ -8,4 +9,11 @@ import cn.bugstack.domain.award.model.aggregate.UserAwardRecordAggregate; ...@@ -8,4 +9,11 @@ import cn.bugstack.domain.award.model.aggregate.UserAwardRecordAggregate;
*/ */
public interface IAwardRepository { public interface IAwardRepository {
void saveUserAwardRecord(UserAwardRecordAggregate userAwardRecordAggregate); 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; ...@@ -2,14 +2,18 @@ package cn.bugstack.domain.award.service;
import cn.bugstack.domain.award.model.aggregate.UserAwardRecordAggregate; import cn.bugstack.domain.award.model.aggregate.UserAwardRecordAggregate;
import cn.bugstack.domain.award.event.SendAwardMessageEvent; 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.TaskEntity;
import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity; import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity;
import cn.bugstack.domain.award.model.valobj.TaskStateVO; import cn.bugstack.domain.award.model.valobj.TaskStateVO;
import cn.bugstack.domain.award.repository.IAwardRepository; import cn.bugstack.domain.award.repository.IAwardRepository;
import cn.bugstack.domain.award.service.distribute.IDistributeAward;
import cn.bugstack.types.event.BaseEvent; import cn.bugstack.types.event.BaseEvent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Map;
/** /**
* @ClassName: AwardService * @ClassName: AwardService
...@@ -18,19 +22,27 @@ import javax.annotation.Resource; ...@@ -18,19 +22,27 @@ import javax.annotation.Resource;
* @Date: 2024/12/9 15:41 * @Date: 2024/12/9 15:41
*/ */
@Service @Service
@Slf4j
public class AwardService implements IAwardService{ public class AwardService implements IAwardService{
@Resource private final IAwardRepository awardRepository;
private IAwardRepository awardRepository; private final SendAwardMessageEvent sendAwardMessageEvent;
@Resource private final Map<String, IDistributeAward> distributeAwardMap;
private SendAwardMessageEvent sendAwardMessageEvent;
public AwardService(IAwardRepository awardRepository, SendAwardMessageEvent sendAwardMessageEvent, Map<String, IDistributeAward> distributeAwardMap) {
this.awardRepository = awardRepository;
this.sendAwardMessageEvent = sendAwardMessageEvent;
this.distributeAwardMap = distributeAwardMap;
}
@Override @Override
public void saveUserAwardRecord(UserAwardRecordEntity userAwardRecordEntity) { public void saveUserAwardRecord(UserAwardRecordEntity userAwardRecordEntity) {
// 构建消息对象 // 构建消息对象
SendAwardMessageEvent.SendAwardMessage sendAwardMessage = new SendAwardMessageEvent.SendAwardMessage(); SendAwardMessageEvent.SendAwardMessage sendAwardMessage = new SendAwardMessageEvent.SendAwardMessage();
sendAwardMessage.setUserId(userAwardRecordEntity.getUserId()); sendAwardMessage.setUserId(userAwardRecordEntity.getUserId());
sendAwardMessage.setOrderId(userAwardRecordEntity.getOrderId());
sendAwardMessage.setAwardId(userAwardRecordEntity.getAwardId()); sendAwardMessage.setAwardId(userAwardRecordEntity.getAwardId());
sendAwardMessage.setAwardTitle(userAwardRecordEntity.getAwardTitle()); sendAwardMessage.setAwardTitle(userAwardRecordEntity.getAwardTitle());
sendAwardMessage.setAwardConfig(userAwardRecordEntity.getAwardConfig());
BaseEvent.EventMessage<SendAwardMessageEvent.SendAwardMessage> sendAwardMessageEventMessage = sendAwardMessageEvent.buildEventMessage(sendAwardMessage); BaseEvent.EventMessage<SendAwardMessageEvent.SendAwardMessage> sendAwardMessageEventMessage = sendAwardMessageEvent.buildEventMessage(sendAwardMessage);
...@@ -41,12 +53,32 @@ public class AwardService implements IAwardService{ ...@@ -41,12 +53,32 @@ public class AwardService implements IAwardService{
taskEntity.setMessageId(sendAwardMessageEventMessage.getId()); taskEntity.setMessageId(sendAwardMessageEventMessage.getId());
taskEntity.setMessage(sendAwardMessageEventMessage); taskEntity.setMessage(sendAwardMessageEventMessage);
taskEntity.setState(TaskStateVO.create); taskEntity.setState(TaskStateVO.create);
// 构建聚合对象 // 构建聚合对象
UserAwardRecordAggregate userAwardRecordAggregate = UserAwardRecordAggregate.builder() UserAwardRecordAggregate userAwardRecordAggregate = UserAwardRecordAggregate.builder()
.taskEntity(taskEntity) .taskEntity(taskEntity)
.userAwardRecordEntity(userAwardRecordEntity) .userAwardRecordEntity(userAwardRecordEntity)
.build(); .build();
// 存储聚合对象 - 一个事务下,用户的中奖记录 // 存储聚合对象 - 一个事务下,用户的中奖记录
awardRepository.saveUserAwardRecord(userAwardRecordAggregate); 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; package cn.bugstack.domain.award.service;
import cn.bugstack.domain.award.model.entity.DistributeAwardEntity;
import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity; import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity;
/* /*
...@@ -11,4 +12,8 @@ import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity; ...@@ -11,4 +12,8 @@ import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity;
*/ */
public interface IAwardService { public interface IAwardService {
void saveUserAwardRecord(UserAwardRecordEntity userAwardRecordEntity); 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 { ...@@ -29,6 +29,8 @@ public class BehaviorRebateOrderEntity {
private String rebateType; private String rebateType;
/** 返利配置【sku值,积分值】 */ /** 返利配置【sku值,积分值】 */
private String rebateConfig; private String rebateConfig;
/** 业务仿重ID - 外部透传,方便查询使用 */
private String outBusinessNo;
/** 业务ID - 拼接的唯一值 */ /** 业务ID - 拼接的唯一值 */
private String bizId; private String bizId;
} }
...@@ -2,6 +2,7 @@ package cn.bugstack.domain.rebate.repository; ...@@ -2,6 +2,7 @@ package cn.bugstack.domain.rebate.repository;
import cn.bugstack.domain.rebate.aggregate.BehaviorRebateAggregate; import cn.bugstack.domain.rebate.aggregate.BehaviorRebateAggregate;
import cn.bugstack.domain.rebate.model.entity.BehaviorEntity; 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.BehaviorTypeVO;
import cn.bugstack.domain.rebate.model.valobj.DailyBehaviorRebateVO; import cn.bugstack.domain.rebate.model.valobj.DailyBehaviorRebateVO;
...@@ -17,4 +18,6 @@ public interface IBehaviorRebateRepository { ...@@ -17,4 +18,6 @@ public interface IBehaviorRebateRepository {
List<DailyBehaviorRebateVO> queryDailyBehaviorRebateConfig (BehaviorTypeVO behaviorTypeVO); List<DailyBehaviorRebateVO> queryDailyBehaviorRebateConfig (BehaviorTypeVO behaviorTypeVO);
void saveUserRebateRecord(String userId, List<BehaviorRebateAggregate> behaviorRebateAggregates); void saveUserRebateRecord(String userId, List<BehaviorRebateAggregate> behaviorRebateAggregates);
List<BehaviorRebateOrderEntity> queryOrderByOutBusinessNo(String userId, String outBusinessNo);
} }
...@@ -85,4 +85,9 @@ public class BehaviorRebateService implements IBehaviorRebateService{ ...@@ -85,4 +85,9 @@ public class BehaviorRebateService implements IBehaviorRebateService{
// 4. 返回订单ID集合 // 4. 返回订单ID集合
return orderIds; return orderIds;
} }
@Override
public List<BehaviorRebateOrderEntity> queryOrderByOutBusinessNo(String userId, String outBusinessNo) {
return behaviorRebateRepository.queryOrderByOutBusinessNo(userId, outBusinessNo);
}
} }
package cn.bugstack.domain.rebate.service; package cn.bugstack.domain.rebate.service;
import cn.bugstack.domain.rebate.model.entity.BehaviorEntity; import cn.bugstack.domain.rebate.model.entity.BehaviorEntity;
import cn.bugstack.domain.rebate.model.entity.BehaviorRebateOrderEntity;
import java.util.List; import java.util.List;
/* /*
...@@ -16,4 +17,12 @@ public interface IBehaviorRebateService { ...@@ -16,4 +17,12 @@ public interface IBehaviorRebateService {
* @return 订单ID * @return 订单ID
*/ */
List<String> createOrder(BehaviorEntity behaviorEntity); 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; ...@@ -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.StrategyEntity;
import cn.bugstack.domain.strategy.model.entity.StrategyRuleEntity; import cn.bugstack.domain.strategy.model.entity.StrategyRuleEntity;
import cn.bugstack.domain.strategy.model.valobj.RuleTreeVO; 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.StrategyAwardRuleModelVO;
import cn.bugstack.domain.strategy.model.valobj.StrategyAwardStockKeyVO; import cn.bugstack.domain.strategy.model.valobj.StrategyAwardStockKeyVO;
...@@ -120,4 +121,11 @@ public interface IStrategyRepository { ...@@ -120,4 +121,11 @@ public interface IStrategyRepository {
* @return key 规则树,value rule_lock 加锁值 * @return key 规则树,value rule_lock 加锁值
*/ */
Map<String, Integer> queryAwardRuleLockCount(String... treeIds); 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 { ...@@ -52,8 +52,7 @@ public abstract class AbstractRaffleStrategy implements IRaffleStrategy {
DefaultChainFactory.StrategyAwardVO chainStrategyAwardVO = raffleLogicChain(userId, strategyId); DefaultChainFactory.StrategyAwardVO chainStrategyAwardVO = raffleLogicChain(userId, strategyId);
log.info("抽奖策略计算-责任链 {} {} {} {}", userId, strategyId, chainStrategyAwardVO.getAwardId(), chainStrategyAwardVO.getLogicModel()); log.info("抽奖策略计算-责任链 {} {} {} {}", userId, strategyId, chainStrategyAwardVO.getAwardId(), chainStrategyAwardVO.getLogicModel());
if (!DefaultChainFactory.LogicModel.RULE_DEFAULT.getCode().equals(chainStrategyAwardVO.getLogicModel())) { if (!DefaultChainFactory.LogicModel.RULE_DEFAULT.getCode().equals(chainStrategyAwardVO.getLogicModel())) {
// TODO awardConfig 暂时为空。黑名单指定积分奖品,后续需要在库表中配置上对应的1积分值,并获取到。 return buildRaffleAwardEntity(strategyId, chainStrategyAwardVO.getAwardId(), chainStrategyAwardVO.getAwardRuleValue());
return buildRaffleAwardEntity(strategyId, chainStrategyAwardVO.getAwardId(), null);
} }
// 3. 规则树抽奖过滤【奖品ID,会根据抽奖次数判断、库存判断、兜底兜里返回最终的可获得奖品信息】 // 3. 规则树抽奖过滤【奖品ID,会根据抽奖次数判断、库存判断、兜底兜里返回最终的可获得奖品信息】
......
package cn.bugstack.domain.strategy.service; package cn.bugstack.domain.strategy.service;
import cn.bugstack.domain.strategy.model.valobj.RuleWeightVO;
import java.util.List;
import java.util.Map; import java.util.Map;
/* /*
...@@ -15,4 +18,18 @@ public interface IRaffleRule { ...@@ -15,4 +18,18 @@ public interface IRaffleRule {
* @return key 规则树,value rule_lock 加锁值 * @return key 规则树,value rule_lock 加锁值
*/ */
Map<String, Integer> queryAwardRuleLockCount(String[] treeIds); 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; ...@@ -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.entity.StrategyAwardEntity;
import cn.bugstack.domain.strategy.model.valobj.RuleTreeVO; 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.StrategyAwardRuleModelVO;
import cn.bugstack.domain.strategy.model.valobj.StrategyAwardStockKeyVO; import cn.bugstack.domain.strategy.model.valobj.StrategyAwardStockKeyVO;
import cn.bugstack.domain.strategy.repository.IStrategyRepository; import cn.bugstack.domain.strategy.repository.IStrategyRepository;
...@@ -84,4 +85,13 @@ public class DefaultRaffleStrategy extends AbstractRaffleStrategy implements IRa ...@@ -84,4 +85,13 @@ public class DefaultRaffleStrategy extends AbstractRaffleStrategy implements IRa
public Map<String, Integer> queryAwardRuleLockCount(String[] treeIds) { public Map<String, Integer> queryAwardRuleLockCount(String[] treeIds) {
return repository.queryAwardRuleLockCount(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 { ...@@ -78,9 +78,13 @@ public class DefaultChainFactory {
*/ */
private Integer awardId; private Integer awardId;
/** /**
* * 抽奖类型;黑名单抽奖、权重规则、默认抽奖
*/ */
private String logicModel; private String logicModel;
/**
* 抽奖奖品规则
*/
private String awardRuleValue;
} }
@Getter @Getter
......
...@@ -41,6 +41,8 @@ public class BackListLogicChain extends AbstractLogicChain { ...@@ -41,6 +41,8 @@ public class BackListLogicChain extends AbstractLogicChain {
return DefaultChainFactory.StrategyAwardVO.builder() return DefaultChainFactory.StrategyAwardVO.builder()
.awardId(awardId) .awardId(awardId)
.logicModel(ruleModel()) .logicModel(ruleModel())
// 写入默认配置黑名单奖品值 0.01 ~ 1 积分,也可以配置到数据库表中
.awardRuleValue("0.01,1")
.build(); .build();
} }
} }
......
...@@ -15,4 +15,8 @@ public interface IAwardDao { ...@@ -15,4 +15,8 @@ public interface IAwardDao {
List<Award> queryAwardList(); List<Award> queryAwardList();
String queryAwardConfigByAwardId(Integer awardId);
String queryAwardKeyByAwardId(Integer awardId);
} }
...@@ -23,4 +23,5 @@ public interface IRaffleActivityAccountDayDao { ...@@ -23,4 +23,5 @@ public interface IRaffleActivityAccountDayDao {
Integer queryRaffleActivityAccountDayPartakeCount(RaffleActivityAccountDay raffleActivityAccountDay); Integer queryRaffleActivityAccountDayPartakeCount(RaffleActivityAccountDay raffleActivityAccountDay);
void addAccountQuota(RaffleActivityAccountDay raffleActivityAccountDay); void addAccountQuota(RaffleActivityAccountDay raffleActivityAccountDay);
} }
...@@ -20,4 +20,5 @@ public interface IRaffleActivityAccountMonthDao { ...@@ -20,4 +20,5 @@ public interface IRaffleActivityAccountMonthDao {
void insertActivityAccountMonth(RaffleActivityAccountMonth raffleActivityAccountMonth); void insertActivityAccountMonth(RaffleActivityAccountMonth raffleActivityAccountMonth);
void addAccountQuota(RaffleActivityAccountMonth raffleActivityAccountMonth); void addAccountQuota(RaffleActivityAccountMonth raffleActivityAccountMonth);
} }
...@@ -15,4 +15,6 @@ public interface IUserAwardRecordDao { ...@@ -15,4 +15,6 @@ public interface IUserAwardRecordDao {
void insert(UserAwardRecord userAwardRecord); void insert(UserAwardRecord userAwardRecord);
int updateAwardRecordCompletedState(UserAwardRecord userAwardRecordReq);
} }
package cn.bugstack.infrastructure.persistent.dao; package cn.bugstack.infrastructure.persistent.dao;
import cn.bugstack.infrastructure.persistent.po.UserBehaviorRebateOrder; import cn.bugstack.infrastructure.persistent.po.UserBehaviorRebateOrder;
import cn.bugstack.middleware.db.router.annotation.DBRouter;
import cn.bugstack.middleware.db.router.annotation.DBRouterStrategy; import cn.bugstack.middleware.db.router.annotation.DBRouterStrategy;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/** /**
* @author Fuzhengwei bugstack.cn @小傅哥 * @author Fuzhengwei bugstack.cn @小傅哥
* @description 用户行为返利流水订单表 * @description 用户行为返利流水订单表
...@@ -15,4 +18,7 @@ public interface IUserBehaviorRebateOrderDao { ...@@ -15,4 +18,7 @@ public interface IUserBehaviorRebateOrderDao {
void insert(UserBehaviorRebateOrder userBehaviorRebateOrder); 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; ...@@ -19,12 +19,12 @@ import java.util.Date;
@NoArgsConstructor @NoArgsConstructor
public class RaffleActivityAccountDay { public class RaffleActivityAccountDay {
private final SimpleDateFormat dateFormatDay = new SimpleDateFormat("yyyy-MM-dd"); private final static SimpleDateFormat dateFormatDay = new SimpleDateFormat("yyyy-MM-dd");
/** /**
* 自增ID * 自增ID
*/ */
private String id; private Long id;
/** /**
* 用户ID * 用户ID
*/ */
...@@ -54,7 +54,7 @@ public class RaffleActivityAccountDay { ...@@ -54,7 +54,7 @@ public class RaffleActivityAccountDay {
*/ */
private Date updateTime; private Date updateTime;
public String currentDay() { public static String currentDay() {
return dateFormatDay.format(new Date()); return dateFormatDay.format(new Date());
} }
......
...@@ -18,10 +18,11 @@ import java.util.Date; ...@@ -18,10 +18,11 @@ import java.util.Date;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class RaffleActivityAccountMonth { public class RaffleActivityAccountMonth {
private final SimpleDateFormat dateFormatMonth = new SimpleDateFormat("yyyy-MM");
private final static SimpleDateFormat dateFormatMonth = new SimpleDateFormat("yyyy-MM");
/** 自增ID */ /** 自增ID */
private String id; private Long id;
/** 用户ID */ /** 用户ID */
private String userId; private String userId;
/** 活动ID */ /** 活动ID */
...@@ -36,7 +37,9 @@ public class RaffleActivityAccountMonth { ...@@ -36,7 +37,9 @@ public class RaffleActivityAccountMonth {
private Date createTime; private Date createTime;
/** 更新时间 */ /** 更新时间 */
private Date updateTime; private Date updateTime;
public String currentMonth() {
public static String currentMonth() {
return dateFormatMonth.format(new Date()); return dateFormatMonth.format(new Date());
} }
} }
...@@ -26,6 +26,8 @@ public class UserBehaviorRebateOrder { ...@@ -26,6 +26,8 @@ public class UserBehaviorRebateOrder {
private String rebateType; private String rebateType;
/** 返利配置【sku值,积分值】 */ /** 返利配置【sku值,积分值】 */
private String rebateConfig; private String rebateConfig;
/** 业务仿重ID - 外部透传,方便查询使用 */
private String outBusinessNo;
/** 业务ID - 拼接的唯一值 */ /** 业务ID - 拼接的唯一值 */
private String bizId; 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 { ...@@ -476,4 +476,69 @@ public class ActivityRepository implements IActivityRepository {
return null == dayPartakeCount ? 0 : dayPartakeCount; 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; 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.aggregate.UserAwardRecordAggregate;
import cn.bugstack.domain.award.model.entity.TaskEntity; import cn.bugstack.domain.award.model.entity.TaskEntity;
import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity; 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.domain.award.repository.IAwardRepository;
import cn.bugstack.infrastructure.event.EventPublisher; import cn.bugstack.infrastructure.event.EventPublisher;
import cn.bugstack.infrastructure.persistent.dao.ITaskDao; import cn.bugstack.infrastructure.persistent.dao.*;
import cn.bugstack.infrastructure.persistent.dao.IUserAwardRecordDao;
import cn.bugstack.infrastructure.persistent.dao.IUserRaffleOrderDao;
import cn.bugstack.infrastructure.persistent.po.Task; import cn.bugstack.infrastructure.persistent.po.Task;
import cn.bugstack.infrastructure.persistent.po.UserAwardRecord; 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.po.UserRaffleOrder;
import cn.bugstack.middleware.db.router.strategy.IDBRouterStrategy; import cn.bugstack.middleware.db.router.strategy.IDBRouterStrategy;
import cn.bugstack.types.enums.ResponseCode; import cn.bugstack.types.enums.ResponseCode;
...@@ -34,8 +36,12 @@ public class AwardRepository implements IAwardRepository { ...@@ -34,8 +36,12 @@ public class AwardRepository implements IAwardRepository {
@Resource @Resource
private ITaskDao taskDao; private ITaskDao taskDao;
@Resource @Resource
private IAwardDao awardDao;
@Resource
private IUserAwardRecordDao userAwardRecordDao; private IUserAwardRecordDao userAwardRecordDao;
@Resource @Resource
private IUserCreditAccountDao userCreditAccountDao;
@Resource
private IUserRaffleOrderDao userRaffleOrderDao; private IUserRaffleOrderDao userRaffleOrderDao;
@Resource @Resource
private IDBRouterStrategy dbRouter; private IDBRouterStrategy dbRouter;
...@@ -108,4 +114,58 @@ public class AwardRepository implements IAwardRepository { ...@@ -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 { ...@@ -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; ...@@ -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.entity.StrategyRuleEntity;
import cn.bugstack.domain.strategy.model.valobj.*; import cn.bugstack.domain.strategy.model.valobj.*;
import cn.bugstack.domain.strategy.repository.IStrategyRepository; 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.dao.*;
import cn.bugstack.infrastructure.persistent.po.*; import cn.bugstack.infrastructure.persistent.po.*;
import cn.bugstack.infrastructure.persistent.redis.IRedisService; import cn.bugstack.infrastructure.persistent.redis.IRedisService;
...@@ -341,4 +342,49 @@ public class StrategyRepository implements IStrategyRepository { ...@@ -341,4 +342,49 @@ public class StrategyRepository implements IStrategyRepository {
return resultMap; 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; 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.UserRaffleOrderEntity;
import cn.bugstack.domain.activity.service.IRaffleActivityAccountQuotaService;
import cn.bugstack.domain.activity.service.IRaffleActivityPartakeService; import cn.bugstack.domain.activity.service.IRaffleActivityPartakeService;
import cn.bugstack.domain.activity.service.armory.IActivityArmory; import cn.bugstack.domain.activity.service.armory.IActivityArmory;
import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity; import cn.bugstack.domain.award.model.entity.UserAwardRecordEntity;
import cn.bugstack.domain.award.model.valobj.AwardStateVO; import cn.bugstack.domain.award.model.valobj.AwardStateVO;
import cn.bugstack.domain.award.service.IAwardService; import cn.bugstack.domain.award.service.IAwardService;
import cn.bugstack.domain.rebate.model.entity.BehaviorEntity; 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.BehaviorTypeVO;
import cn.bugstack.domain.rebate.service.IBehaviorRebateService; import cn.bugstack.domain.rebate.service.IBehaviorRebateService;
import cn.bugstack.domain.strategy.model.entity.RaffleAwardEntity; import cn.bugstack.domain.strategy.model.entity.RaffleAwardEntity;
...@@ -16,6 +19,8 @@ import cn.bugstack.domain.strategy.service.armory.IStrategyArmory; ...@@ -16,6 +19,8 @@ import cn.bugstack.domain.strategy.service.armory.IStrategyArmory;
import cn.bugstack.trigger.api.IRaffleActivityService; import cn.bugstack.trigger.api.IRaffleActivityService;
import cn.bugstack.trigger.api.dto.ActivityDrawRequestDTO; import cn.bugstack.trigger.api.dto.ActivityDrawRequestDTO;
import cn.bugstack.trigger.api.dto.ActivityDrawResponseDTO; 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.enums.ResponseCode;
import cn.bugstack.types.exception.AppException; import cn.bugstack.types.exception.AppException;
import cn.bugstack.types.model.Response; import cn.bugstack.types.model.Response;
...@@ -44,6 +49,8 @@ public class RaffleActivityController implements IRaffleActivityService { ...@@ -44,6 +49,8 @@ public class RaffleActivityController implements IRaffleActivityService {
@Resource @Resource
private IRaffleActivityPartakeService raffleActivityPartakeService; private IRaffleActivityPartakeService raffleActivityPartakeService;
@Resource @Resource
private IRaffleActivityAccountQuotaService raffleActivityAccountQuotaService;
@Resource
private IActivityArmory activityArmory; private IActivityArmory activityArmory;
@Resource @Resource
private IStrategyArmory strategyArmory; private IStrategyArmory strategyArmory;
...@@ -110,15 +117,17 @@ public class RaffleActivityController implements IRaffleActivityService { ...@@ -110,15 +117,17 @@ public class RaffleActivityController implements IRaffleActivityService {
@RequestMapping(value = "draw",method = RequestMethod.POST) @RequestMapping(value = "draw",method = RequestMethod.POST)
@Override @Override
public Response<ActivityDrawResponseDTO> draw(@RequestBody ActivityDrawRequestDTO request) { public Response<ActivityDrawResponseDTO> draw(@RequestBody ActivityDrawRequestDTO request) {
try{ try {
log.info("活动抽奖 userId:{} activityId:{}", request.getUserId(), request.getActivityId()); log.info("活动抽奖 userId:{} activityId:{}", request.getUserId(), request.getActivityId());
// 1. 参数校验 // 1. 参数校验
if (StringUtils.isBlank(request.getUserId()) || null == request.getActivityId()) { if (StringUtils.isBlank(request.getUserId()) || null == request.getActivityId()) {
throw new AppException(ResponseCode.ILLEGAL_PARAMETER.getCode(), ResponseCode.ILLEGAL_PARAMETER.getInfo()); throw new AppException(ResponseCode.ILLEGAL_PARAMETER.getCode(), ResponseCode.ILLEGAL_PARAMETER.getInfo());
} }
// 2. 参与活动 - 创建参与记录订单 // 2. 参与活动 - 创建参与记录订单
UserRaffleOrderEntity orderEntity = raffleActivityPartakeService.createOrder(request.getUserId(), request.getActivityId()); UserRaffleOrderEntity orderEntity = raffleActivityPartakeService.createOrder(request.getUserId(), request.getActivityId());
log.info("活动抽奖,创建订单 userId:{} activityId:{} orderId:{}", request.getUserId(), request.getActivityId(), orderEntity.getOrderId()); log.info("活动抽奖,创建订单 userId:{} activityId:{} orderId:{}", request.getUserId(), request.getActivityId(), orderEntity.getOrderId());
// 3. 抽奖策略 - 执行抽奖 // 3. 抽奖策略 - 执行抽奖
RaffleAwardEntity raffleAwardEntity = raffleStrategy.performRaffle(RaffleFactorEntity.builder() RaffleAwardEntity raffleAwardEntity = raffleStrategy.performRaffle(RaffleFactorEntity.builder()
.userId(orderEntity.getUserId()) .userId(orderEntity.getUserId())
...@@ -136,8 +145,11 @@ public class RaffleActivityController implements IRaffleActivityService { ...@@ -136,8 +145,11 @@ public class RaffleActivityController implements IRaffleActivityService {
.awardTitle(raffleAwardEntity.getAwardTitle()) .awardTitle(raffleAwardEntity.getAwardTitle())
.awardTime(new Date()) .awardTime(new Date())
.awardState(AwardStateVO.create) .awardState(AwardStateVO.create)
.awardConfig(raffleAwardEntity.getAwardConfig())
.build(); .build();
awardService.saveUserAwardRecord(userAwardRecord); awardService.saveUserAwardRecord(userAwardRecord);
// 5. 返回结果 // 5. 返回结果
return Response.<ActivityDrawResponseDTO>builder() return Response.<ActivityDrawResponseDTO>builder()
.code(ResponseCode.SUCCESS.getCode()) .code(ResponseCode.SUCCESS.getCode())
...@@ -148,13 +160,13 @@ public class RaffleActivityController implements IRaffleActivityService { ...@@ -148,13 +160,13 @@ public class RaffleActivityController implements IRaffleActivityService {
.awardIndex(raffleAwardEntity.getSort()) .awardIndex(raffleAwardEntity.getSort())
.build()) .build())
.build(); .build();
}catch(AppException e){ } catch (AppException e) {
log.error("活动抽奖失败 userId:{} activityId:{}", request.getUserId(), request.getActivityId(), e); log.error("活动抽奖失败 userId:{} activityId:{}", request.getUserId(), request.getActivityId(), e);
return Response.<ActivityDrawResponseDTO>builder() return Response.<ActivityDrawResponseDTO>builder()
.code(e.getCode()) .code(e.getCode())
.info(e.getInfo()) .info(e.getInfo())
.build(); .build();
}catch (Exception e) { } catch (Exception e) {
log.error("活动抽奖失败 userId:{} activityId:{}", request.getUserId(), request.getActivityId(), e); log.error("活动抽奖失败 userId:{} activityId:{}", request.getUserId(), request.getActivityId(), e);
return Response.<ActivityDrawResponseDTO>builder() return Response.<ActivityDrawResponseDTO>builder()
.code(ResponseCode.UN_ERROR.getCode()) .code(ResponseCode.UN_ERROR.getCode())
...@@ -204,4 +216,75 @@ public class RaffleActivityController implements IRaffleActivityService { ...@@ -204,4 +216,75 @@ public class RaffleActivityController implements IRaffleActivityService {
.build(); .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; ...@@ -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.RaffleAwardEntity;
import cn.bugstack.domain.strategy.model.entity.RaffleFactorEntity; import cn.bugstack.domain.strategy.model.entity.RaffleFactorEntity;
import cn.bugstack.domain.strategy.model.entity.StrategyAwardEntity; 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.IRaffleAward;
import cn.bugstack.domain.strategy.service.IRaffleRule; import cn.bugstack.domain.strategy.service.IRaffleRule;
import cn.bugstack.domain.strategy.service.IRaffleStrategy; import cn.bugstack.domain.strategy.service.IRaffleStrategy;
import cn.bugstack.domain.strategy.service.armory.IStrategyArmory; import cn.bugstack.domain.strategy.service.armory.IStrategyArmory;
import cn.bugstack.trigger.api.IRaffleStrategyService; import cn.bugstack.trigger.api.IRaffleStrategyService;
import cn.bugstack.trigger.api.dto.RaffleAwardListRequestDTO; import cn.bugstack.trigger.api.dto.*;
import cn.bugstack.trigger.api.dto.RaffleRequestDTO;
import cn.bugstack.trigger.api.dto.RaffleAwardListResponseDTO;
import cn.bugstack.trigger.api.dto.RaffleResponseDTO;
import cn.bugstack.types.enums.ResponseCode; import cn.bugstack.types.enums.ResponseCode;
import cn.bugstack.types.exception.AppException; import cn.bugstack.types.exception.AppException;
import cn.bugstack.types.model.Response; import cn.bugstack.types.model.Response;
...@@ -178,5 +176,63 @@ public class RaffleStrategyController implements IRaffleStrategyService { ...@@ -178,5 +176,63 @@ public class RaffleStrategyController implements IRaffleStrategyService {
.build(); .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; 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 lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Queue; import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/** /**
* @ClassName: SendAwardCustomer * @ClassName: SendAwardCustomer
* @Description: 用户奖品记录消息消费者 * @Description: 用户奖品记录消息消费者
...@@ -18,11 +26,23 @@ public class SendAwardCustomer { ...@@ -18,11 +26,23 @@ public class SendAwardCustomer {
@Value("${spring.rabbitmq.topic.send_award}") @Value("${spring.rabbitmq.topic.send_award}")
private String topic; private String topic;
@Resource
private IAwardService awardService;
@RabbitListener(queuesToDeclare = @Queue(value = "${spring.rabbitmq.topic.send_award}")) @RabbitListener(queuesToDeclare = @Queue(value = "${spring.rabbitmq.topic.send_award}"))
public void listener(String message) { public void listener(String message) {
try { 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();
// 发放奖品
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) { } catch (Exception e) {
log.error("监听用户奖品发送消息,消费失败 topic: {} message: {}", topic, message); log.error("监听用户奖品发送消息,消费失败 topic: {} message: {}", topic, message);
throw e; throw e;
......
...@@ -22,8 +22,10 @@ public class Constants { ...@@ -22,8 +22,10 @@ public class Constants {
public static String RULE_TREE_VO_KEY = "rule_tree_vo_key_"; 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_KEY = "strategy_award_count_key_";
public static String STRATEGY_AWARD_COUNT_QUERY_KEY = "strategy_award_count_query_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_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_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 - 定时任务,更新奖品消耗库存失败 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@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 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:40)
at org.redisson.spring.data.connection.RedissonExceptionConverter.convert(RedissonExceptionConverter.java:35) at org.redisson.spring.data.connection.RedissonExceptionConverter.convert(RedissonExceptionConverter.java:35)
at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:44) at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:44)
...@@ -26,7 +26,7 @@ org.springframework.data.redis.RedisConnectionFailureException: Unable to write ...@@ -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.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750) 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.checkWriteFuture(RedisExecutor.java:345)
at org.redisson.command.RedisExecutor.lambda$execute$3(RedisExecutor.java:188) at org.redisson.command.RedisExecutor.lambda$execute$3(RedisExecutor.java:188)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590) 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-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-24.10:14:26.905 [main ] INFO Application - The following 1 profile is active: "dev" 24-12-27.12:03:18.776 [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-27.12:03:22.430 [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-27.12:03:22.444 [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-27.12:03:22.580 [main ] INFO RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 41 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-27.12:03:25.800 [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-27.12:03:25.836 [main ] INFO Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8091"]
24-12-24.10:14:32.911 [main ] INFO StandardService - Starting service [Tomcat] 24-12-27.12:03:25.838 [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-27.12:03:25.839 [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-27.12:03:26.127 [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-27.12:03:26.128 [main ] INFO ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 7149 ms
24-12-24.10:14:34.724 [main ] INFO Version - Redisson 3.23.4 24-12-27.12:03:27.790 [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-27.12:03:28.556 [redisson-netty-2-6] INFO MasterPubSubConnectionPool - 1 connections initialized for redis/172.19.0.3: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-27.12:03:28.681 [redisson-netty-2-14] INFO MasterConnectionPool - 5 connections initialized for redis/172.19.0.3:6379
24-12-24.10:14:37.838 [main ] INFO EndpointLinksResolver - Exposing 1 endpoint(s) beneath base path '/actuator' 24-12-27.12:03:30.368 [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-27.12:03:30.401 [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-27.12:03:30.426 [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-27.12:03:30.450 [main ] INFO Application - Started Application in 14.265 seconds (JVM running for 16.245)
24-12-24.10:14:40.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 24-12-27.12:03:35.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-24.10:14:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 24-12-27.12:03:39.995 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-24.10:14:50.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 24-12-27.12:03:45.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】
24-12-24.10:14:55.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-24.10:15:00.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 24-12-27.19:33:41.513 [main ] INFO Application - The following 1 profile is active: "dev"
24-12-24.10:15:05.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 24-12-27.19:33:43.129 [main ] INFO RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
24-12-24.10:15:10.000 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 24-12-27.19:33:43.135 [main ] INFO RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
24-12-24.10:15:15.001 [scheduling-1 ] INFO UpdateAwardStockJob - 定时任务,更新奖品消耗库存【延迟队列获取,降低对数据库的更新频次,不要产生竞争】 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 @@ ...@@ -7,7 +7,7 @@
# #
# 主机: 127.0.0.1 (MySQL 5.6.39) # 主机: 127.0.0.1 (MySQL 5.6.39)
# 数据库: big_market # 数据库: big_market
# 生成时间: 2024-04-30 10:19:11 +0000 # 生成时间: 2024-05-25 02:56:19 +0000
# ************************************************************ # ************************************************************
...@@ -35,7 +35,8 @@ CREATE TABLE `award` ( ...@@ -35,7 +35,8 @@ CREATE TABLE `award` (
`award_desc` varchar(128) NOT NULL COMMENT '奖品内容描述', `award_desc` varchar(128) NOT NULL COMMENT '奖品内容描述',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 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='奖品表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='奖品表';
LOCK TABLES `award` WRITE; LOCK TABLES `award` WRITE;
...@@ -144,7 +145,7 @@ LOCK TABLES `raffle_activity_count` 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`) INSERT INTO `raffle_activity_count` (`id`, `activity_count_id`, `total_count`, `day_count`, `month_count`, `create_time`, `update_time`)
VALUES 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 */; /*!40000 ALTER TABLE `raffle_activity_count` ENABLE KEYS */;
UNLOCK TABLES; UNLOCK TABLES;
...@@ -174,7 +175,7 @@ LOCK TABLES `raffle_activity_sku` WRITE; ...@@ -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`) INSERT INTO `raffle_activity_sku` (`id`, `sku`, `activity_id`, `activity_count_id`, `stock_count`, `stock_count_surplus`, `create_time`, `update_time`)
VALUES 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 */; /*!40000 ALTER TABLE `raffle_activity_sku` ENABLE KEYS */;
UNLOCK TABLES; UNLOCK TABLES;
...@@ -311,7 +312,7 @@ VALUES ...@@ -311,7 +312,7 @@ VALUES
(3,100002,'抽奖策略-非完整1概率',NULL,'2023-12-09 09:37:19','2024-02-03 10:14:17'), (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'), (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'), (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 */; /*!40000 ALTER TABLE `strategy` ENABLE KEYS */;
UNLOCK TABLES; UNLOCK TABLES;
...@@ -365,14 +366,14 @@ VALUES ...@@ -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'), (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'), (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'), (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'), (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,19,0.0300,'tree_luck_award',2,'2023-12-09 09:38:31','2024-04-27 15:00:20'), (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,43,0.0300,'tree_luck_award',3,'2023-12-09 09:38:31','2024-04-27 13:29:35'), (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,36,0.0300,'tree_luck_award',4,'2023-12-09 09:38:31','2024-04-27 15:00:30'), (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'), (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'), (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,24,0.0300,'tree_lock_1',7,'2023-12-09 09:38:31','2024-04-27 13:36:35'), (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,33,0.0300,'tree_luck_award',8,'2023-12-09 09:38:31','2024-04-27 13:19:45'); (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 */; /*!40000 ALTER TABLE `strategy_award` ENABLE KEYS */;
UNLOCK TABLES; UNLOCK TABLES;
...@@ -394,6 +395,7 @@ CREATE TABLE `strategy_rule` ( ...@@ -394,6 +395,7 @@ CREATE TABLE `strategy_rule` (
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 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_strategy_id_rule_model` (`strategy_id`,`rule_model`),
KEY `idx_strategy_id_award_id` (`strategy_id`,`award_id`) KEY `idx_strategy_id_award_id` (`strategy_id`,`award_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='抽奖策略规则'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='抽奖策略规则';
...@@ -402,8 +404,10 @@ LOCK TABLES `strategy_rule` WRITE; ...@@ -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`) INSERT INTO `strategy_rule` (`id`, `strategy_id`, `award_id`, `rule_type`, `rule_model`, `rule_value`, `rule_desc`, `create_time`, `update_time`)
VALUES 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'), (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'); (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 */; /*!40000 ALTER TABLE `strategy_rule` ENABLE KEYS */;
UNLOCK TABLES; UNLOCK TABLES;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册