礼包中心model

礼包中心model
This commit is contained in:
2025-07-04 18:55:23 +08:00
parent b415a7d50c
commit 54c9d61832
14 changed files with 359 additions and 5 deletions

View File

@@ -967,6 +967,8 @@ public enum BusiStatus {
SERIES_MEDAL_LIMIT(20515, "超过可设置上限请升级VIP获取更多位置"),
GUILD_USD_WITHDRAW_ACCOUNT_TYPE_ERROR(500, "提現方式錯誤,請重新綁定帳戶後重試。"),
PACK_NUM_NOT_ENOUGH(500, "礼包数量不足"),
;
private final int value;

View File

@@ -313,6 +313,8 @@ public enum I18nAlertEnum {
ACCOUNT_CANCEL_TOAST("ACCOUNT CANCEL SUCCESS"),
GUILD_USD_TO_RECHARGE_USER_DAY_OF_MONTH_LIMIT("该功能仅在本月的【{0}】号可以操作"),
PACK_SEND_SYS("【{0}】给你赠送了【{1}】*【{2}】快去礼包中心查看使用吧!"),
PACK_USE_SELF_SYS("你已经使用了【礼包名称】,对应的奖励已经放入你的背包啦!记得查收~"),
;
private final String defaultStr;

View File

@@ -7,6 +7,11 @@ public interface PackConstant {
byte USER_SEND = 2;
}
interface PackUseType {
byte SELF = 1;
byte SEND = 2;
}
interface UserPackRecordStatus {
byte NORMAL = 1;
byte RE_CALL = 2;

View File

@@ -1,12 +1,13 @@
package com.accompany.business.model.packcenter;
import com.accompany.core.mybatis.typehandler.IntegerListTypeHandler;
import com.accompany.core.mybatis.typehandler.LongListTypeHandler;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
@@ -42,8 +43,8 @@ public class UserUsePackRecord implements Serializable {
/**
* 礼包奖励id
*/
@TableField(typeHandler = IntegerListTypeHandler.class)
private List<Integer> numberList;
@TableField(typeHandler = LongListTypeHandler.class)
private List<Long> numberList;
/**
* 礼包数量
*/
@@ -51,11 +52,11 @@ public class UserUsePackRecord implements Serializable {
/**
* 使用类型.1-自己用,2-赠送
*/
private Integer useType;
private Byte useType;
/**
* 创建时间
*/
private Byte createTime;
private Date createTime;
}

View File

@@ -0,0 +1,24 @@
package com.accompany.business.vo.packcenter;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class PackItemRewardVo {
@ApiModelProperty("奖励图片")
private String pic;
@ApiModelProperty("奖励名称")
private String rewardName;
@ApiModelProperty("奖励类型")
private Byte rewardType;
@ApiModelProperty("*D")
private String unit;
@ApiModelProperty("奖励数量")
private Integer awardNum;
}

View File

@@ -0,0 +1,26 @@
package com.accompany.business.vo.packcenter;
import com.accompany.core.annotation.I18n;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@ApiModel
@Data
public class UserPackVo {
@ApiModelProperty("赠送或者使用的时候用的ID")
private Long userPackId;
@ApiModelProperty("礼包名称")
@I18n(className = "PackInfo")
private String packName;
@ApiModelProperty("过期剩余秒数")
private Long expireSeconds;
@ApiModelProperty("礼包数量")
private Integer packNum;
@ApiModelProperty("礼包使用数量")
private Integer useNum;
@ApiModelProperty("奖励信息")
private List<PackItemRewardVo> rewardList;
}

View File

@@ -2,6 +2,7 @@ package com.accompany.business.mybatismapper.packcenter;
import com.accompany.business.model.packcenter.UserPack;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
/**
* 用户礼包 Mapper 接口
@@ -11,4 +12,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface UserPackMapper extends BaseMapper<UserPack> {
int packUseNumAdd(@Param("userPackId") Long userPackId, @Param("useNum") Integer useNum);
}

View File

@@ -0,0 +1,201 @@
package com.accompany.business.service.packcenter;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.accompany.business.common.constant.RewardTypeEnum;
import com.accompany.business.common.vo.RewardVo;
import com.accompany.business.constant.PackConstant;
import com.accompany.business.constant.activity.ActivityType;
import com.accompany.business.model.activity.h5.ActivityH5LevelAward;
import com.accompany.business.model.packcenter.*;
import com.accompany.business.service.BaseSendService;
import com.accompany.business.service.activity.h5.ActivityH5AwardRecordService;
import com.accompany.business.service.activity.h5.ActivityH5LevelAwardService;
import com.accompany.business.service.user.UsersService;
import com.accompany.business.vo.packcenter.PackItemRewardVo;
import com.accompany.business.vo.packcenter.UserPackVo;
import com.accompany.common.result.BusiResult;
import com.accompany.common.utils.PageUtil;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Users;
import com.accompany.core.util.I18NMessageSourceUtil;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static com.accompany.common.status.BusiStatus.PACK_NUM_NOT_ENOUGH;
import static com.accompany.core.enumeration.I18nAlertEnum.PACK_SEND_SYS;
import static com.accompany.core.enumeration.I18nAlertEnum.PACK_USE_SELF_SYS;
@Service
public class PackCenterService {
@Autowired
private UsersService usersService;
@Autowired
private UserPackService userPackService;
@Autowired
private UserPackRecordService userPackRecordService;
@Autowired
private UserUsePackRecordService userUsePackRecordService;
@Autowired
private PackItemService packItemService;
@Autowired
private PackInfoService packInfoService;
@Autowired
private ActivityH5LevelAwardService activityH5LevelAwardService;
@Autowired
private ActivityH5AwardRecordService activityH5AwardRecordService;
@Autowired
private BaseSendService baseSendService;
public List<UserPackVo> userPackList(Long uid, Integer pageNo, Integer pageSize) {
Users users = usersService.getUsersByUid(uid);
Integer partitionId = users.getPartitionId();
List<UserPackVo> resultList = new ArrayList<>();
List<UserPack> userPacks = userPackService.listByUid(uid);
userPacks = PageUtil.page(userPacks, pageNo, pageSize);
if (CollectionUtils.isEmpty(userPacks)) {
return resultList;
}
List<Integer> packIds = userPacks.stream().map(UserPack::getPackId).collect(Collectors.toList());
Map<Integer, PackInfo> packInfoMap = packInfoService.mapByPackIds(packIds);
if (packInfoMap.size() <= 0) {
return resultList;
}
List<PackItem> packItems = packItemService.listByPackIds(packIds);
if (CollectionUtils.isEmpty(packItems)) {
return resultList;
}
List<Long> awardIds = packItems.stream().map(PackItem::getAwardId).collect(Collectors.toList());
List<ActivityH5LevelAward> activityH5LevelAwards = activityH5LevelAwardService.listByIds(awardIds);
if (CollectionUtils.isEmpty(activityH5LevelAwards)) {
return resultList;
}
Map<Long, ActivityH5LevelAward> awardMap = activityH5LevelAwards.stream().collect(Collectors.toMap(ActivityH5LevelAward::getId, x -> x));
Map<Integer, List<PackItem>> packItemMap = packItems.stream().collect(Collectors.groupingBy(PackItem::getPackId));
Date date = new Date();
for (UserPack userPack : userPacks) {
UserPackVo vo = new UserPackVo();
PackInfo packInfo = packInfoMap.get(userPack.getPackId());
List<PackItem> itemList = packItemMap.get(userPack.getPackId());
if (CollectionUtils.isEmpty(itemList)) {
continue;
}
vo.setUserPackId(userPack.getId());
vo.setPackName(packInfo.getPackName());
vo.setPackNum(userPack.getPackNum());
vo.setUseNum(userPack.getUseNum());
vo.setExpireSeconds(DateUtil.between(date, userPack.getExpireTime(), DateUnit.SECOND));
List<PackItemRewardVo> rewardList = new ArrayList<>();
vo.setRewardList(rewardList);
for (PackItem packItem : itemList) {
ActivityH5LevelAward award = awardMap.get(packItem.getAwardId());
if (award == null) {
continue;
}
RewardVo rewardVo = activityH5LevelAwardService.covertI18nRewardInfo(RewardTypeEnum.getByRewardType(award.getAwardType()),
award.getAwardId().intValue(), partitionId);
rewardList.add(PackItemRewardVo.builder()
.awardNum(rewardVo.getNum())
.pic(rewardVo.getPic())
.unit(rewardVo.getUnit())
.rewardName(rewardVo.getName())
.rewardType(rewardVo.getType())
.build());
}
resultList.add(vo);
}
return resultList;
}
public BusiResult<Void> usePack(Long uid, Long targetUid, Long userPackId, Integer useNum) {
Users users = usersService.getUsersByUid(uid);
Users targetUser = usersService.getUsersByUid(targetUid);
if (!users.getPartitionId().equals(targetUser.getPartitionId())) {
throw new ServiceException("PARTITION ERROR");
}
UserPack userPack = userPackService.getById(userPackId);
Integer remainNum = userPack.getPackNum() - userPack.getUseNum();
if (remainNum < useNum) {
throw new ServiceException(PACK_NUM_NOT_ENOUGH);
}
userPackService.packUseNumAdd(userPackId, useNum);
Date createTime = new Date();
UserUsePackRecord usePackRecord = new UserUsePackRecord();
usePackRecord.setUserPackId(userPackId);
usePackRecord.setTargetUid(targetUid);
usePackRecord.setUid(uid);
usePackRecord.setPackId(userPack.getPackId());
usePackRecord.setPackNum(useNum);
usePackRecord.setCreateTime(createTime);
PackInfo packInfo = packInfoService.getById(userPack.getPackId());
String i18nId = PackInfo.class.getSimpleName() + StrUtil.DOT + packInfo.getPackName();
String packName = I18NMessageSourceUtil.getMessage(i18nId, packInfo.getPackName(), targetUid);
String message;
if (uid.equals(targetUid)) {
usePackRecord.setUseType(PackConstant.PackUseType.SELF);
List<PackItem> packItems = packItemService.listByPackId(userPack.getPackId());
List<Long> awardIds = packItems.stream().map(PackItem::getAwardId).collect(Collectors.toList());
List<ActivityH5LevelAward> activityH5LevelAwards = activityH5LevelAwardService.listByIds(awardIds);
for (int i = 0; i < useNum; i++) {
for (ActivityH5LevelAward award : activityH5LevelAwards) {
award.setAwardNum(award.getAwardNum() * useNum);
activityH5AwardRecordService.sendDetailAward(targetUid, targetUser.getPartitionId(), "", award, ActivityType.PACK_CENTER_REWARD);
}
}
usePackRecord.setNumberList(awardIds);
message = I18NMessageSourceUtil.getMessage(PACK_USE_SELF_SYS, new Object[]{packName}, targetUser.getPartitionId());
} else {
usePackRecord.setUseType(PackConstant.PackUseType.SEND);
UserPack pack = new UserPack();
Integer packId = userPack.getPackId();
pack.setPackId(packId);
pack.setUid(targetUid);
pack.setPackNum(useNum);
pack.setSource(PackConstant.PackSource.USER_SEND);
pack.setStatus(PackConstant.UserPackStatus.valid);
pack.setCreateTime(createTime);
pack.setExpireTime(userPack.getExpireTime());
pack.setUpdateTime(createTime);
userPackService.save(pack);
UserPackRecord packRecord = new UserPackRecord();
packRecord.setPackId(packId);
packRecord.setUid(uid);
packRecord.setUserPackId(pack.getId());
packRecord.setPackNum(useNum);
packRecord.setSendUid(uid);
packRecord.setSource(PackConstant.PackSource.USER_SEND);
packRecord.setStatus(PackConstant.UserPackRecordStatus.NORMAL);
packRecord.setCreateTime(createTime);
packRecord.setExpireDay(0);
packRecord.setExpireTime(userPack.getExpireTime());
userPackRecordService.save(packRecord);
message = I18NMessageSourceUtil.getMessage(PACK_SEND_SYS, new Object[]{users.getNick(), packName, useNum}, targetUid);
}
userUsePackRecordService.save(usePackRecord);
baseSendService.sendSystemMsg(targetUid.toString(), message);
return BusiResult.success();
}
}

View File

@@ -4,6 +4,7 @@ import com.accompany.business.model.packcenter.PackItem;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
* 礼包内容 服务类
@@ -14,4 +15,8 @@ import java.util.List;
public interface PackItemService extends IService<PackItem> {
List<PackItem> listByPackId(Integer packId);
Map<Integer, List<PackItem>> mapByList(List<Integer> packIds);
List<PackItem> listByPackIds(List<Integer> packIds);
}

View File

@@ -3,6 +3,8 @@ package com.accompany.business.service.packcenter;
import com.accompany.business.model.packcenter.UserPack;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 用户礼包 服务类
*
@@ -13,4 +15,8 @@ public interface UserPackService extends IService<UserPack> {
UserPack getByUidPackId(Long uid, Integer packId);
List<UserPack> listByUid(Long uid);
Integer packUseNumAdd(Long userPackId, Integer useNum);
}

View File

@@ -6,9 +6,13 @@ import com.accompany.business.service.packcenter.PackItemService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 礼包内容 服务实现类
@@ -26,4 +30,20 @@ public class PackItemServiceImpl extends ServiceImpl<PackItemMapper, PackItem> i
wrapper.eq(PackItem::getPackId, packId);
return baseMapper.selectList(wrapper);
}
@Override
public Map<Integer, List<PackItem>> mapByList(List<Integer> packIds) {
List<PackItem> packItems = this.listByPackIds(packIds);
if (CollectionUtils.isEmpty(packItems)) {
return Collections.EMPTY_MAP;
}
return packItems.stream().collect(Collectors.groupingBy(PackItem::getPackId));
}
@Override
public List<PackItem> listByPackIds(List<Integer> packIds) {
LambdaQueryWrapper<PackItem> wrapper = Wrappers.lambdaQuery();
wrapper.in(PackItem::getPackId, packIds);
return baseMapper.selectList(wrapper);
}
}

View File

@@ -1,5 +1,6 @@
package com.accompany.business.service.packcenter.impl;
import com.accompany.business.constant.PackConstant;
import com.accompany.business.model.packcenter.UserPack;
import com.accompany.business.mybatismapper.packcenter.UserPackMapper;
import com.accompany.business.service.packcenter.UserPackService;
@@ -8,6 +9,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 用户礼包 服务实现类
*
@@ -25,4 +28,18 @@ public class UserPackServiceImpl extends ServiceImpl<UserPackMapper, UserPack> i
.eq(UserPack::getPackId, packId);
return baseMapper.selectOne(wrapper, false);
}
@Override
public List<UserPack> listByUid(Long uid) {
LambdaQueryWrapper<UserPack> wrapper = Wrappers.lambdaQuery();
wrapper.eq(UserPack::getUid, uid);
wrapper.eq(UserPack::getStatus, PackConstant.UserPackStatus.valid)
.orderByAsc(UserPack::getExpireTime);
return baseMapper.selectList(wrapper);
}
@Override
public Integer packUseNumAdd(Long userPackId, Integer useNum) {
return baseMapper.packUseNumAdd(userPackId, useNum);
}
}

View File

@@ -2,4 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.accompany.business.mybatismapper.packcenter.UserPackMapper">
<update id="packUseNumAdd">
update user_pack set use_num = use_num + #{useNum} where id = #{userPackId}
</update>
</mapper>

View File

@@ -0,0 +1,40 @@
package com.accompany.business.controller;
import com.accompany.business.service.packcenter.PackCenterService;
import com.accompany.business.vo.packcenter.UserPackVo;
import com.accompany.common.result.BusiResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import static com.accompany.common.constant.ApplicationConstant.PublicParameters.PUB_UID;
@Api(tags = "礼包中心", value = "礼包中心")
@Slf4j
@RestController
@RequestMapping("/packCenter")
public class PackCenterController {
@Autowired
private PackCenterService packCenterService;
@ApiOperation(value = "礼包中心", httpMethod = "GET")
@GetMapping("/list")
public BusiResult<List<UserPackVo>> userPackList(@RequestHeader(PUB_UID) Long uid, Integer pageNo, Integer pageSize) {
List<UserPackVo> userPackVos = packCenterService.userPackList(uid, pageNo, pageSize);
return BusiResult.success(userPackVos);
}
@ApiOperation(value = "使用礼包", httpMethod = "GET")
@GetMapping("/usePack")
public BusiResult<Void> usePack(@RequestHeader(PUB_UID) Long uid, Long targetUid, Long userPackId, Integer useNum) {
return packCenterService.usePack(uid, targetUid, userPackId, useNum);
}
}