礼包后台

礼包后台

礼包中心-礼包配置
This commit is contained in:
2025-07-03 18:28:06 +08:00
parent 49d212d5dd
commit 379e9cef31
40 changed files with 1203 additions and 8 deletions

View File

@@ -11,6 +11,8 @@ import java.math.BigDecimal;
@ApiModel
@Data
public class ActivityDayTotalVo {
@ExcelIgnore
private Integer partitionId;
@ApiModelProperty("日期")
@ExcelProperty("日期")
private String statDate;

View File

@@ -11,6 +11,6 @@ public class ActivityUserVo extends SimpleUserVo {
private Integer rank;
private String regionName;
private String partitionDesc;
private Long chargeGoleNUm;
private Long chargeGoleNum;
private String signTime;
}

View File

@@ -0,0 +1,13 @@
package com.accompany.admin.vo.packcenter;
import lombok.Data;
@Data
public class PackAwardVo {
private Long awardId;
private String awardName;
private String awardPic;
private String awardTypeName;
private Integer awardNum;
private Integer itemId;
}

View File

@@ -0,0 +1,29 @@
package com.accompany.admin.vo.packcenter;
import com.accompany.core.annotation.I18n;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel
@Data
public class PackInfoAdminVo {
@ApiModelProperty("礼包ID")
private Integer packId;
@ApiModelProperty("分区ID")
private Integer partitionId;
@ApiModelProperty("分区")
private String partitionDesc;
@ApiModelProperty("礼包名称")
@I18n(className = "PackInfo")
private String packName;
@ApiModelProperty("状态.1-有效,0-无效")
private Byte status;
@ApiModelProperty("礼包样式")
private String imgUrl;
@ApiModelProperty("礼包赠送过期天数(需求上写过期时间,避免混淆,显示这个)")
private Integer expireDay;
@ApiModelProperty()
private String createTime;
}

View File

@@ -0,0 +1,37 @@
package com.accompany.admin.vo.packcenter;
import com.accompany.core.annotation.I18n;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
public class UserPackRecordAdminVo {
@ApiModelProperty(value = "ID")
private Long id;
private Long uid;
@ApiModelProperty(value = "平台ID")
private Long erbanNo;
@ApiModelProperty(value = "礼包名称")
@I18n(className = "PackInfo")
private String packName;
@ApiModelProperty(value = "礼包ID")
private Integer packId;
@ApiModelProperty(value = "数量")
private Integer packNum;
@ApiModelProperty(value = "来源.1-官方赠送,2-用户赠送")
private Byte source;
@ApiModelProperty(value = "状态.1-正常,2-撤回")
private Byte status;
@ApiModelProperty(value = "操作人")
private String adminUser;
@ApiModelProperty(value = "原由")
private String remark;
@ApiModelProperty(value = "撤回人")
private String recallAdminUser;
@ApiModelProperty(value = "过期时间")
private Date expireTime;
@ApiModelProperty(value = "发放时间")
private Date createTime;
}

View File

@@ -173,10 +173,10 @@ public class ActivityDayTotalAdminService {
}
for (ActivityUserVo activityUserVo : resultList) {
activityUserVo.setChargeGoleNUm(uidGoldMap.getOrDefault(activityUserVo.getUid(), 0L));
activityUserVo.setChargeGoleNum(uidGoldMap.getOrDefault(activityUserVo.getUid(), 0L));
}
resultList.sort(Comparator.comparing(ActivityUserVo::getChargeGoleNUm).reversed());
resultList.sort(Comparator.comparing(ActivityUserVo::getChargeGoleNum).reversed());
resultList = PageUtil.page(resultList, pageNo, pageSize);
if (CollectionUtils.isEmpty(resultList)) {

View File

@@ -0,0 +1,141 @@
package com.accompany.admin.service.packcenter;
import cn.hutool.core.date.DateUtil;
import com.accompany.admin.vo.packcenter.PackAwardVo;
import com.accompany.admin.vo.packcenter.PackInfoAdminVo;
import com.accompany.business.common.constant.RewardTypeEnum;
import com.accompany.business.common.vo.RewardVo;
import com.accompany.business.constant.activity.ActivityType;
import com.accompany.business.model.activity.h5.ActivityH5LevelAward;
import com.accompany.business.model.packcenter.PackInfo;
import com.accompany.business.model.packcenter.PackItem;
import com.accompany.business.service.activity.h5.ActivityH5LevelAwardService;
import com.accompany.business.service.packcenter.PackInfoService;
import com.accompany.business.service.packcenter.PackItemService;
import com.accompany.common.result.BusiResult;
import com.accompany.common.result.PageResult;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.AdminServiceException;
import com.accompany.core.util.I18NMessageSourceUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
import static java.util.Collections.EMPTY_MAP;
@Service
public class PackInfoAdminService {
@Autowired
private PackInfoService packInfoService;
@Autowired
private PackItemService packItemService;
@Autowired
private ActivityH5LevelAwardService activityH5LevelAwardService;
public BusiResult<PageResult<PackInfoAdminVo>> list(Integer pageNo, Integer pageSize) {
PageResult<PackInfoAdminVo> pageResult = new PageResult<>();
IPage<PackInfo> page = new Page<>(pageNo, pageSize);
List<PackInfo> list = packInfoService.list(page);
pageResult.setTotal((int)page.getTotal());
List<PackInfoAdminVo> resultVo = new ArrayList<>();
pageResult.setRows(resultVo);
if (CollectionUtils.isEmpty(list)) {
return BusiResult.success(pageResult);
}
for (PackInfo packInfo : list) {
PackInfoAdminVo packInfoAdminVo = new PackInfoAdminVo();
packInfoAdminVo.setPackName(packInfo.getPackName());
packInfoAdminVo.setPartitionId(packInfo.getPartitionId());
packInfoAdminVo.setPartitionDesc(PartitionEnum.getByPartitionId(packInfo.getPartitionId()).getDesc());
packInfoAdminVo.setStatus(packInfo.getStatus());
packInfoAdminVo.setCreateTime(DateUtil.formatDateTime(packInfo.getCreateTime()));
packInfoAdminVo.setImgUrl(packInfo.getImgUrl());
packInfoAdminVo.setExpireDay(packInfo.getExpireDay());
packInfoAdminVo.setPackId(packInfo.getPackId());
resultVo.add(packInfoAdminVo);
}
return BusiResult.success(pageResult);
}
public BusiResult<Void> save(PackInfoAdminVo vo) {
I18NMessageSourceUtil.deserialization(vo, Collections.singletonList("name"));
PackInfo packInfo = new PackInfo();
packInfo.setUpdateTime(new Date());
BeanUtils.copyProperties(vo, packInfo);
packInfoService.saveOrUpdate(packInfo);
return BusiResult.success();
}
public BusiResult<List<PackAwardVo>> awards(Integer partitionId) {
List<ActivityH5LevelAward> records = activityH5LevelAwardService.listByPartition(partitionId, ActivityType.PACK_CENTER_REWARD.getType());
List<PackAwardVo> resultList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(records)) {
for (ActivityH5LevelAward record : records) {
resultList.add(coverAwardVo(record, EMPTY_MAP));
}
}
return BusiResult.success(resultList);
}
public BusiResult<List<PackAwardVo>> itemList(Integer packId) {
List<PackAwardVo> resultList = new ArrayList<>();
List<PackItem> packItems = packItemService.listByPackId(packId);
if (CollectionUtils.isEmpty(packItems)) {
return BusiResult.success(resultList);
}
Map<Long, PackItem> awardItemMap = packItems.stream().collect(Collectors.toMap(PackItem::getAwardId, x -> x));
List<Long> awardIds = packItems.stream().map(PackItem::getAwardId).collect(Collectors.toList());
List<ActivityH5LevelAward> activityH5LevelAwards = activityH5LevelAwardService.listByIds(awardIds);
if (CollectionUtils.isEmpty(activityH5LevelAwards)) {
return BusiResult.success(resultList);
}
for (ActivityH5LevelAward record : activityH5LevelAwards) {
resultList.add(coverAwardVo(record, awardItemMap));
}
return BusiResult.success(resultList);
}
private PackAwardVo coverAwardVo(ActivityH5LevelAward award, Map<Long, PackItem> awardItemMap) {
PackAwardVo awardVo = new PackAwardVo();
awardVo.setAwardId(award.getId());
RewardVo rewardVo = activityH5LevelAwardService.coverRewardByType(award.getAwardType(), award.getAwardId().intValue());
if (rewardVo != null) {
awardVo.setAwardName(rewardVo.getName());
awardVo.setAwardPic(rewardVo.getPic());
}
RewardTypeEnum byRewardType = RewardTypeEnum.getByRewardType(award.getAwardType());
awardVo.setAwardNum(award.getAwardNum());
awardVo.setAwardTypeName(byRewardType.getDesc());
PackItem packItem = awardItemMap.get(award.getId());
if (packItem != null) {
awardVo.setItemId(packItem.getId());
}
return awardVo;
}
public BusiResult<Void> itemAdd(PackItem packItem) {
LambdaQueryWrapper<PackItem> wrapper = Wrappers.lambdaQuery();
wrapper.eq(PackItem::getPackId, packItem.getPackId());
wrapper.eq(PackItem::getAwardId, packItem.getAwardId());
if (packItemService.count(wrapper) > 0) {
throw new AdminServiceException("重复添加");
}
packItem.setCreateTime(new Date());
packItemService.save(packItem);
return BusiResult.success();
}
public BusiResult<Void> itemDel(Integer itemId) {
packItemService.removeById(itemId);
return BusiResult.success();
}
}

View File

@@ -0,0 +1,182 @@
package com.accompany.admin.service.packcenter;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.accompany.admin.service.system.AdminUserService;
import com.accompany.admin.vo.packcenter.UserPackRecordAdminVo;
import com.accompany.business.constant.PackConstant;
import com.accompany.business.model.packcenter.PackInfo;
import com.accompany.business.model.packcenter.UserPack;
import com.accompany.business.model.packcenter.UserPackRecord;
import com.accompany.business.service.packcenter.PackInfoService;
import com.accompany.business.service.packcenter.UserPackRecordService;
import com.accompany.business.service.packcenter.UserPackService;
import com.accompany.business.service.user.UsersService;
import com.accompany.common.constant.Constant;
import com.accompany.common.result.BusiResult;
import com.accompany.common.result.PageResult;
import com.accompany.common.status.BusiStatus;
import com.accompany.core.exception.AdminServiceException;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Users;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.collections.CollectionUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static com.accompany.common.redis.RedisKey.lock_user_pack;
@Service
public class UserPackRecordAdminService {
@Autowired
private UserPackRecordService userPackRecordService;
@Autowired
private UserPackService userPackService;
@Autowired
private PackInfoService packInfoService;
@Autowired
private UsersService usersService;
@Autowired
private AdminUserService adminUserService;
@Autowired
private RedissonClient redissonClient;
public BusiResult<PageResult<UserPackRecordAdminVo>> list(Integer pageNo, Integer pageSize, Integer packId, Long erbanNo) {
PageResult<UserPackRecordAdminVo> pageResult = new PageResult<>();
Page<UserPackRecord> page = new Page<>(pageNo, pageSize);
Long uid = null;
if (erbanNo != null) {
Users user = usersService.getUserByErbanNo(erbanNo);
if (user == null) {
throw new AdminServiceException("ID:" + erbanNo + ",不存在");
}
uid = user.getUid();
}
LambdaQueryWrapper<UserPackRecord> wrapper = Wrappers.lambdaQuery();
wrapper.eq(uid != null, UserPackRecord::getUid, uid);
wrapper.eq(packId != null, UserPackRecord::getPackId, packId);
wrapper.eq(UserPackRecord::getSource, PackConstant.PackSource.SYSTEM);
List<UserPackRecord> list = userPackRecordService.list(page, wrapper);
List<UserPackRecordAdminVo> resultList = new ArrayList<>();
pageResult.setRows(resultList);
pageResult.setTotal((int)page.getTotal());
if (CollectionUtils.isEmpty(list)) {
return BusiResult.success(pageResult);
}
List<Long> uids = list.stream().map(UserPackRecord::getUid).collect(Collectors.toList());
List<Integer> packIds = list.stream().map(UserPackRecord::getPackId).collect(Collectors.toList());
Map<Long, Users> usersMap = usersService.getUsersMapByUids(uids);
Map<Integer, PackInfo> packInfoMap = packInfoService.mapByPackIds(packIds);
Map<Integer, String> adminUserMap = adminUserService.adminUserMap();
for (UserPackRecord packRecord : list) {
UserPackRecordAdminVo vo = new UserPackRecordAdminVo();
BeanUtils.copyProperties(packRecord, vo);
Users users = usersMap.get(packRecord.getUid());
if (users != null) {
vo.setErbanNo(users.getErbanNo());
}
PackInfo packInfo = packInfoMap.get(packRecord.getPackId());
if (packInfo != null) {
vo.setPackName(packInfo.getPackName());
}
vo.setAdminUser(adminUserMap.get(packRecord.getAdminId()));
resultList.add(vo);
}
return BusiResult.success(pageResult);
}
@Transactional(rollbackFor = RuntimeException.class)
public BusiResult<Void> packSend(Integer packId, Long erbanNo, Integer packNum, String remark, Integer adminId) {
PackInfo packInfo = packInfoService.getById(packId);
if (packInfo == null || Constant.StatusV2.invalid.equals(packInfo.getStatus())) {
throw new AdminServiceException("该礼包不存在或无效");
}
Users user = usersService.getUserByErbanNo(erbanNo);
if (user == null) {
throw new AdminServiceException("ID:" + erbanNo + ",不存在");
}
Date createTime = new Date();
Integer expireDay = packInfo.getExpireDay();
DateTime expireTime = DateUtil.offsetDay(createTime, expireDay);
UserPack pack = new UserPack();
pack.setPackId(packId);
pack.setUid(user.getUid());
pack.setPackNum(packNum);
pack.setSource(PackConstant.PackSource.SYSTEM);
pack.setStatus(PackConstant.UserPackStatus.valid);
pack.setCreateTime(createTime);
pack.setExpireTime(expireTime);
pack.setUpdateTime(createTime);
userPackService.save(pack);
UserPackRecord packRecord = new UserPackRecord();
packRecord.setPackId(packId);
Long uid = user.getUid();
packRecord.setUid(uid);
packRecord.setUserPackId(pack.getId());
packRecord.setPackNum(packNum);
packRecord.setRemark(remark);
packRecord.setAdminId(adminId);
packRecord.setSource(PackConstant.PackSource.SYSTEM);
packRecord.setStatus(PackConstant.UserPackRecordStatus.NORMAL);
packRecord.setCreateTime(createTime);
packRecord.setExpireDay(expireDay);
packRecord.setExpireTime(expireTime);
userPackRecordService.save(packRecord);
return BusiResult.success("赠送成功", null);
}
@Transactional
public BusiResult<Void> packRecall(Long recordId, Integer recallAdminId) {
UserPackRecord record = userPackRecordService.getById(recordId);
String lockKey = lock_user_pack.getKey(record.getUserPackId().toString());
RLock lock = redissonClient.getLock(lockKey);
boolean isLocked = false;
try {
isLocked = lock.tryLock(3, TimeUnit.SECONDS);
if (!isLocked){
throw new ServiceException(BusiStatus.SERVERBUSY);
}
UserPack userPack = userPackService.getById(record.getUserPackId());
if (userPack == null) {
throw new AdminServiceException("记录不存在");
}
if (userPack.getPackNum() - userPack.getUseNum() <= 0) {
throw new AdminServiceException("该用户礼包已经使用完,不可撤回");
}
if (userPack.getExpireTime().before(new Date())) {
throw new AdminServiceException("该用户礼包已经过期,不可撤回");
}
userPack.setStatus(PackConstant.UserPackStatus.invalid);
userPack.setUpdateTime(new Date());
record.setRecallAdminId(recallAdminId);
record.setStatus(PackConstant.UserPackRecordStatus.RE_CALL);
userPackService.updateById(userPack);
userPackRecordService.updateById(record);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
if (isLocked){
lock.unlock();
}
}
return BusiResult.success();
}
}

View File

@@ -0,0 +1,82 @@
package com.accompany.admin.controller.packcenter;
import com.accompany.admin.controller.BaseController;
import com.accompany.admin.service.packcenter.PackInfoAdminService;
import com.accompany.admin.service.system.AdminLogService;
import com.accompany.admin.vo.packcenter.PackAwardVo;
import com.accompany.admin.vo.packcenter.PackInfoAdminVo;
import com.accompany.business.model.packcenter.PackItem;
import com.accompany.common.result.BusiResult;
import com.accompany.common.result.PageResult;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Api(tags = "礼包配置中心", value = "礼包配置中心")
@RestController
@RequestMapping("/admin/packCenter")
public class PackInfoAdminController extends BaseController {
@Autowired
private PackInfoAdminService packInfoAdminService;
@Autowired
private AdminLogService adminLogService;
@ApiOperation(value = "礼包配置列表", httpMethod = "GET")
@GetMapping("/configList")
public BusiResult<PageResult<PackInfoAdminVo>> list(Integer pageNo, Integer pageSize) {
return packInfoAdminService.list(pageNo, pageSize);
}
@ApiOperation(value = "礼包配置保存更新", httpMethod = "POST")
@PostMapping("/configSave")
public BusiResult<Void> save(PackInfoAdminVo vo) {
adminLogService.insertLog(getAdminId(), getClass().getCanonicalName(), "PackInfoAdminController.save" , JSONObject.toJSONString(vo));
return packInfoAdminService.save(vo);
}
@ApiImplicitParams({
@ApiImplicitParam(name = "partitionId", value = "分区id", required = true)
})
@ApiOperation(value = "奖励列表传礼包的分区id,添加礼包的是时候下拉选)", httpMethod = "GET")
@GetMapping("/awards")
public BusiResult<List<PackAwardVo>> awards(Integer partitionId) {
return packInfoAdminService.awards(partitionId);
}
@ApiOperation(value = "根据礼包ID获取奖品列表", httpMethod = "GET")
@GetMapping("/itemList")
public BusiResult<List<PackAwardVo>> itemList(Integer packId) {
return packInfoAdminService.itemList(packId);
}
@ApiImplicitParams({
@ApiImplicitParam(name = "packId", value = "packId", required = true),
@ApiImplicitParam(name = "awardId", value = "奖品ID", required = true)
})
@ApiOperation(value = "添加奖品", httpMethod = "POST")
@PostMapping("/itemAdd")
public BusiResult<Void> itemAdd(PackItem packItem) {
adminLogService.insertLog(getAdminId(), getClass().getCanonicalName(), "PackInfoAdminController.itemAdd" , JSONObject.toJSONString(packItem));
return packInfoAdminService.itemAdd(packItem);
}
@ApiImplicitParams({
@ApiImplicitParam(name = "itemId", value = "别传错itemList返回的itemId", required = true)
})
@ApiOperation(value = "奖品删除", httpMethod = "POST")
@PostMapping("/itemDel")
public BusiResult<Void> itemDel(Integer itemId) {
adminLogService.insertLog(getAdminId(), getClass().getCanonicalName(), "PackInfoAdminController.itemDel" , itemId.toString());
return packInfoAdminService.itemDel(itemId);
}
}

View File

@@ -0,0 +1,65 @@
package com.accompany.admin.controller.packcenter;
import com.accompany.admin.controller.BaseController;
import com.accompany.admin.service.packcenter.UserPackRecordAdminService;
import com.accompany.admin.service.system.AdminLogService;
import com.accompany.admin.vo.packcenter.UserPackRecordAdminVo;
import com.accompany.common.result.BusiResult;
import com.accompany.common.result.PageResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "礼包发放记录", value = "礼包发放记录")
@RestController
@RequestMapping("/admin/userPackRecord")
public class UserPackRecordAdminController extends BaseController {
@Autowired
private UserPackRecordAdminService userPackRecordAdminService;
@Autowired
private AdminLogService adminLogService;
@ApiImplicitParams({
@ApiImplicitParam(name = "packId", value = "礼包id", required = true),
@ApiImplicitParam(name = "erbanNo", value = "用户id", required = true)
})
@ApiOperation(value = "发放记录", httpMethod = "GET")
@GetMapping("/recordList")
public BusiResult<PageResult<UserPackRecordAdminVo>> list(Integer pageNo, Integer pageSize, Integer packId, Long erbanNo) {
return userPackRecordAdminService.list(pageNo, pageSize, packId, erbanNo);
}
@ApiImplicitParams({
@ApiImplicitParam(name = "packId", value = "packId", required = true),
@ApiImplicitParam(name = "erbanNo", value = "用户ID", required = true),
@ApiImplicitParam(name = "packNum", value = "礼包数量", required = true),
@ApiImplicitParam(name = "remark", value = "理由", required = true),
})
@ApiOperation(value = "赠送礼包", httpMethod = "POST")
@PostMapping("/send")
public BusiResult<Void> packSend(Integer packId, Long erbanNo, Integer packNum, String remark) {
adminLogService.insertLog(getAdminId(), getClass().getCanonicalName(), "PackInfoAdminController.packSend" ,
String.format("packId:%s,erbanNo:%s,packNum%s", packId, erbanNo, packNum));
return userPackRecordAdminService.packSend(packId, erbanNo, packNum, remark, getAdminId());
}
@ApiImplicitParams({
@ApiImplicitParam(name = "recordId", value = "记录ID", required = true),
})
@ApiOperation(value = "撤回礼包", httpMethod = "POST")
@PostMapping("/packRecall")
public BusiResult<Void> packRecall(Long recordId) {
adminLogService.insertLog(getAdminId(), getClass().getCanonicalName(), "PackInfoAdminController.packRecall" ,
String.format("recordId:%s", recordId));
return userPackRecordAdminService.packRecall(recordId, getAdminId());
}
}

View File

@@ -1460,6 +1460,7 @@ public enum RedisKey {
first_charge_ip, //首充ip状态
first_charge_device, //首充设备状态
lock_user_pack; //礼包锁
;
public String getKey() {

View File

@@ -0,0 +1,20 @@
package com.accompany.business.constant;
public interface PackConstant {
interface PackSource {
byte SYSTEM = 1;
byte USER_SEND = 2;
}
interface UserPackRecordStatus {
byte NORMAL = 1;
byte RE_CALL = 2;
}
interface UserPackStatus {
byte invalid = 0;
byte valid = 1;
byte empty = 2;
}
}

View File

@@ -36,6 +36,7 @@ public enum ActivityType {
DAILY_SHOP(20, "日常任务兑换商城", ACTIVITY_FIRST_COMMON, true),
CHARGE_TREASURE(21, "充值寻宝活动", ACTIVITY_FIRST_COMMON, true),
FIRST_CHARGE(22, "首充活动", ACTIVITY_FIRST_COMMON, true),
PACK_CENTER_REWARD(23, "礼包中心奖励", ACTIVITY_FIRST_COMMON, true),
;
private Integer type;

View File

@@ -0,0 +1,66 @@
package com.accompany.business.model.packcenter;
import com.accompany.core.annotation.I18n;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 礼包中心实体类
*
* @author
* @since 2025-07-03
*/
@Data
public class PackInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "pack_id" , type = IdType.AUTO)
private Integer packId;
/**
* 礼包名称
*/
private Integer partitionId;
/**
* 礼包名称
*/
@I18n(className = "PackInfo")
private String packName;
/**
* 礼包类型.1-普通礼包 2-特殊礼包
*/
private Integer type;
/**
* 礼包图片地址
*/
private String imgUrl;
/**
* 送出过期天数
*/
private Integer expireDay;
/**
* 状态.1-有效,0-无效
*/
private Byte status;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 序号
*/
private Integer seqNo;
}

View File

@@ -0,0 +1,40 @@
package com.accompany.business.model.packcenter;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 礼包内容实体类
*
* @author
* @since 2025-07-03
*/
@Data
public class PackItem implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id" , type = IdType.AUTO)
private Integer id;
/**
* 礼包id
*/
private Integer packId;
/**
* 奖品id, 对应表activity_h5_level_award type=23的id
*/
private Long awardId;
/**
* 创建时间
*/
private Date createTime;
}

View File

@@ -0,0 +1,64 @@
package com.accompany.business.model.packcenter;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 用户礼包实体类
*
* @author
* @since 2025-07-03
*/
@Data
public class UserPack implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id" , type = IdType.AUTO)
private Long id;
/**
* 用户uid
*/
private Long uid;
/**
* 礼包id
*/
private Integer packId;
/**
* 礼包数量
*/
private Integer packNum;
/**
* 礼包使用数量
*/
private Integer useNum;
/**
* 来源.1-官方赠送,2-用户赠送
*/
private Byte source;
/**
* 状态.1-有效,0-无效, 2-已用完
*/
private Byte status;
/**
* 礼包过期时间
*/
private Date expireTime;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
}

View File

@@ -0,0 +1,79 @@
package com.accompany.business.model.packcenter;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 用户礼包获得记录实体类
*
* @author
* @since 2025-07-03
*/
@Data
public class UserPackRecord implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id" , type = IdType.AUTO)
private Long id;
private Long userPackId;
/**
* 用户uid
*/
private Long uid;
/**
* 礼包id
*/
private Integer packId;
/**
* 礼包数量
*/
private Integer packNum;
/**
* 过期天数
*/
private Integer expireDay;
/**
* 来源.1-官方赠送,2-用户赠送
*/
private Byte source;
/**
* 状态.1-正常,2-撤回
*/
private Byte status;
/**
* 后台操作人
*/
private Integer adminId;
/**
* 原由
*/
private String remark;
/**
* 赠送人uid
*/
private Long sendUid;
/**
* 后台操作人
*/
private Integer recallAdminId;
/**
* 礼包截止时间-
*/
private Date expireTime;
/**
* 创建时间
*/
private Date createTime;
}

View File

@@ -0,0 +1,58 @@
package com.accompany.business.model.packcenter;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 用户使用礼包记录实体类
*
* @author
* @since 2025-07-03
*/
@Data
public class UserUsePackRecord implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id" , type = IdType.AUTO)
private Integer id;
/**
* 用户uid
*/
private Long uid;
/**
* 用户uid
*/
private Long target_uid;
private Long userPackId;
/**
* 礼包id
*/
private Integer packId;
/**
* 礼包奖励id
*/
private String numberList;
/**
* 礼包数量
*/
private Integer packNum;
/**
* 使用类型.1-自己用,2-赠送
*/
private Integer useType;
/**
* 创建时间
*/
private Date createTime;
}

View File

@@ -0,0 +1,14 @@
package com.accompany.business.mybatismapper.packcenter;
import com.accompany.business.model.packcenter.PackInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 礼包中心 Mapper 接口
*
* @author
* @since 2025-07-03
*/
public interface PackInfoMapper extends BaseMapper<PackInfo> {
}

View File

@@ -0,0 +1,14 @@
package com.accompany.business.mybatismapper.packcenter;
import com.accompany.business.model.packcenter.PackItem;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 礼包内容 Mapper 接口
*
* @author
* @since 2025-07-03
*/
public interface PackItemMapper extends BaseMapper<PackItem> {
}

View File

@@ -0,0 +1,14 @@
package com.accompany.business.mybatismapper.packcenter;
import com.accompany.business.model.packcenter.UserPack;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 用户礼包 Mapper 接口
*
* @author
* @since 2025-07-03
*/
public interface UserPackMapper extends BaseMapper<UserPack> {
}

View File

@@ -0,0 +1,14 @@
package com.accompany.business.mybatismapper.packcenter;
import com.accompany.business.model.packcenter.UserPackRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 用户礼包获得记录 Mapper 接口
*
* @author
* @since 2025-07-03
*/
public interface UserPackRecordMapper extends BaseMapper<UserPackRecord> {
}

View File

@@ -0,0 +1,14 @@
package com.accompany.business.mybatismapper.packcenter;
import com.accompany.business.model.packcenter.UserUsePackRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 用户使用礼包记录 Mapper 接口
*
* @author
* @since 2025-07-03
*/
public interface UserUsePackRecordMapper extends BaseMapper<UserUsePackRecord> {
}

View File

@@ -26,6 +26,8 @@ public interface ActivityH5LevelAwardService extends IService<ActivityH5LevelAwa
Map<Integer, List<ActivityH5LevelAward>> levelMapByPartition(Integer partitionId, Integer type);
List<ActivityH5LevelAward> listByPartition(Integer partitionId, Integer type);
IPage<ActivityH5LevelAwardVo> listPage(ActivityH5Param param);
RewardVo coverRewardByType(Byte type, Integer refId);

View File

@@ -234,17 +234,23 @@ public class ActivityH5LevelAwardServiceImpl extends ServiceImpl<ActivityH5Level
@Override
public Map<Integer, List<ActivityH5LevelAward>> levelMapByPartition(Integer partitionId, Integer type) {
LambdaQueryWrapper<ActivityH5LevelAward> wrapper = Wrappers.lambdaQuery();
wrapper.eq(ActivityH5LevelAward::getType, type)
.eq(ActivityH5LevelAward::getPartitionId, partitionId)
.eq(ActivityH5LevelAward::getAwardStatus, 1);
List<ActivityH5LevelAward> activityH5LevelAwards = baseMapper.selectList(wrapper);
List<ActivityH5LevelAward> activityH5LevelAwards = this.listByPartition(partitionId, type);
if (CollectionUtils.isEmpty(activityH5LevelAwards)) {
return MapUtils.EMPTY_MAP;
}
return activityH5LevelAwards.stream().collect(Collectors.groupingBy(ActivityH5LevelAward::getLevel));
}
@Override
public List<ActivityH5LevelAward> listByPartition(Integer partitionId, Integer type) {
LambdaQueryWrapper<ActivityH5LevelAward> wrapper = Wrappers.lambdaQuery();
wrapper.eq(ActivityH5LevelAward::getType, type)
.eq(ActivityH5LevelAward::getPartitionId, partitionId)
.eq(ActivityH5LevelAward::getAwardStatus, 1)
.orderByDesc(ActivityH5LevelAward::getCreateTime);
return baseMapper.selectList(wrapper);
}
public RewardVo covertI18nRewardInfo(RewardTypeEnum typeEnum, Integer refId, Integer partitionId) {
RewardVo vo = new RewardVo();
vo.setType(typeEnum.getType());

View File

@@ -0,0 +1,19 @@
package com.accompany.business.service.packcenter;
import com.accompany.business.model.packcenter.PackInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
* 礼包中心 服务类
*
* @author
* @since 2025-07-03
*/
public interface PackInfoService extends IService<PackInfo> {
Map<Integer, PackInfo> mapByPackIds(List<Integer> packIds);
}

View File

@@ -0,0 +1,17 @@
package com.accompany.business.service.packcenter;
import com.accompany.business.model.packcenter.PackItem;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 礼包内容 服务类
*
* @author
* @since 2025-07-03
*/
public interface PackItemService extends IService<PackItem> {
List<PackItem> listByPackId(Integer packId);
}

View File

@@ -0,0 +1,15 @@
package com.accompany.business.service.packcenter;
import com.accompany.business.model.packcenter.UserPackRecord;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* 用户礼包获得记录 服务类
*
* @author
* @since 2025-07-03
*/
public interface UserPackRecordService extends IService<UserPackRecord> {
}

View File

@@ -0,0 +1,16 @@
package com.accompany.business.service.packcenter;
import com.accompany.business.model.packcenter.UserPack;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* 用户礼包 服务类
*
* @author
* @since 2025-07-03
*/
public interface UserPackService extends IService<UserPack> {
UserPack getByUidPackId(Long uid, Integer packId);
}

View File

@@ -0,0 +1,15 @@
package com.accompany.business.service.packcenter;
import com.accompany.business.model.packcenter.UserUsePackRecord;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* 用户使用礼包记录 服务类
*
* @author
* @since 2025-07-03
*/
public interface UserUsePackRecordService extends IService<UserUsePackRecord> {
}

View File

@@ -0,0 +1,35 @@
package com.accompany.business.service.packcenter.impl;
import com.accompany.business.model.packcenter.PackInfo;
import com.accompany.business.mybatismapper.packcenter.PackInfoMapper;
import com.accompany.business.service.packcenter.PackInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static java.util.Collections.EMPTY_MAP;
/**
* 礼包中心 服务实现类
*
* @author
* @since 2025-07-03
*/
@Service
public class PackInfoServiceImpl extends ServiceImpl<PackInfoMapper, PackInfo> implements PackInfoService {
@Override
public Map<Integer, PackInfo> mapByPackIds(List<Integer> packIds) {
List<PackInfo> packInfos = baseMapper.selectByIds(packIds);
if (CollectionUtils.isEmpty(packInfos)) {
return EMPTY_MAP;
}
return packInfos.stream().collect(Collectors.toMap(PackInfo::getPackId, x -> x));
}
}

View File

@@ -0,0 +1,29 @@
package com.accompany.business.service.packcenter.impl;
import com.accompany.business.model.packcenter.PackItem;
import com.accompany.business.mybatismapper.packcenter.PackItemMapper;
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.springframework.stereotype.Service;
import java.util.List;
/**
* 礼包内容 服务实现类
*
* @author
* @since 2025-07-03
*/
@Service
public class PackItemServiceImpl extends ServiceImpl<PackItemMapper, PackItem> implements PackItemService {
@Override
public List<PackItem> listByPackId(Integer packId) {
LambdaQueryWrapper<PackItem> wrapper = Wrappers.lambdaQuery();
wrapper.eq(PackItem::getPackId, packId);
return baseMapper.selectList(wrapper);
}
}

View File

@@ -0,0 +1,19 @@
package com.accompany.business.service.packcenter.impl;
import com.accompany.business.model.packcenter.UserPackRecord;
import com.accompany.business.mybatismapper.packcenter.UserPackRecordMapper;
import com.accompany.business.service.packcenter.UserPackRecordService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* 用户礼包获得记录 服务实现类
*
* @author
* @since 2025-07-03
*/
@Service
public class UserPackRecordServiceImpl extends ServiceImpl<UserPackRecordMapper, UserPackRecord> implements UserPackRecordService {
}

View File

@@ -0,0 +1,28 @@
package com.accompany.business.service.packcenter.impl;
import com.accompany.business.model.packcenter.UserPack;
import com.accompany.business.mybatismapper.packcenter.UserPackMapper;
import com.accompany.business.service.packcenter.UserPackService;
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.springframework.stereotype.Service;
/**
* 用户礼包 服务实现类
*
* @author
* @since 2025-07-03
*/
@Service
public class UserPackServiceImpl extends ServiceImpl<UserPackMapper, UserPack> implements UserPackService {
@Override
public UserPack getByUidPackId(Long uid, Integer packId) {
LambdaQueryWrapper<UserPack> wrapper = Wrappers.lambdaQuery();
wrapper.eq(UserPack::getUid, uid)
.eq(UserPack::getPackId, packId);
return baseMapper.selectOne(wrapper, false);
}
}

View File

@@ -0,0 +1,19 @@
package com.accompany.business.service.packcenter.impl;
import com.accompany.business.model.packcenter.UserUsePackRecord;
import com.accompany.business.mybatismapper.packcenter.UserUsePackRecordMapper;
import com.accompany.business.service.packcenter.UserUsePackRecordService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* 用户使用礼包记录 服务实现类
*
* @author
* @since 2025-07-03
*/
@Service
public class UserUsePackRecordServiceImpl extends ServiceImpl<UserUsePackRecordMapper, UserUsePackRecord> implements UserUsePackRecordService {
}

View File

@@ -0,0 +1,5 @@
<?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="com.accompany.business.mybatismapper.packcenter.PackInfoMapper">
</mapper>

View File

@@ -0,0 +1,5 @@
<?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="com.accompany.business.mybatismapper.packcenter.PackItemMapper">
</mapper>

View File

@@ -0,0 +1,5 @@
<?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="com.accompany.business.mybatismapper.packcenter.UserPackMapper">
</mapper>

View File

@@ -0,0 +1,5 @@
<?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="com.accompany.business.mybatismapper.packcenter.UserPackRecordMapper">
</mapper>

View File

@@ -0,0 +1,5 @@
<?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="com.accompany.business.mybatismapper.packcenter.UserUsePackRecordMapper">
</mapper>