diff --git a/accompany-base/accompany-common/src/main/java/com/accompany/common/status/BusiStatus.java b/accompany-base/accompany-common/src/main/java/com/accompany/common/status/BusiStatus.java index e990c2a1f..c5c06397e 100644 --- a/accompany-base/accompany-common/src/main/java/com/accompany/common/status/BusiStatus.java +++ b/accompany-base/accompany-common/src/main/java/com/accompany/common/status/BusiStatus.java @@ -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; diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/core/enumeration/I18nAlertEnum.java b/accompany-base/accompany-core/src/main/java/com/accompany/core/enumeration/I18nAlertEnum.java index 735a17cec..9814951f0 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/core/enumeration/I18nAlertEnum.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/core/enumeration/I18nAlertEnum.java @@ -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; diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/PackConstant.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/PackConstant.java index a9e09c951..3f2e78591 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/PackConstant.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/PackConstant.java @@ -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; diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/packcenter/UserUsePackRecord.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/packcenter/UserUsePackRecord.java index 616601e80..cf235ff5d 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/packcenter/UserUsePackRecord.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/packcenter/UserUsePackRecord.java @@ -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 numberList; + @TableField(typeHandler = LongListTypeHandler.class) + private List numberList; /** * 礼包数量 */ @@ -51,11 +52,11 @@ public class UserUsePackRecord implements Serializable { /** * 使用类型.1-自己用,2-赠送 */ - private Integer useType; + private Byte useType; /** * 创建时间 */ - private Byte createTime; + private Date createTime; } diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/packcenter/PackItemRewardVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/packcenter/PackItemRewardVo.java new file mode 100644 index 000000000..c108f1383 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/packcenter/PackItemRewardVo.java @@ -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; +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/packcenter/UserPackVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/packcenter/UserPackVo.java new file mode 100644 index 000000000..d5f3f6a3f --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/packcenter/UserPackVo.java @@ -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 rewardList; +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/packcenter/UserPackMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/packcenter/UserPackMapper.java index 634e00fdc..a09f4695e 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/packcenter/UserPackMapper.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/packcenter/UserPackMapper.java @@ -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 { + int packUseNumAdd(@Param("userPackId") Long userPackId, @Param("useNum") Integer useNum); } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/PackCenterService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/PackCenterService.java new file mode 100644 index 000000000..4cf43678d --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/PackCenterService.java @@ -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 userPackList(Long uid, Integer pageNo, Integer pageSize) { + Users users = usersService.getUsersByUid(uid); + Integer partitionId = users.getPartitionId(); + + List resultList = new ArrayList<>(); + List userPacks = userPackService.listByUid(uid); + + userPacks = PageUtil.page(userPacks, pageNo, pageSize); + if (CollectionUtils.isEmpty(userPacks)) { + return resultList; + } + + List packIds = userPacks.stream().map(UserPack::getPackId).collect(Collectors.toList()); + Map packInfoMap = packInfoService.mapByPackIds(packIds); + if (packInfoMap.size() <= 0) { + return resultList; + } + List packItems = packItemService.listByPackIds(packIds); + if (CollectionUtils.isEmpty(packItems)) { + return resultList; + } + List awardIds = packItems.stream().map(PackItem::getAwardId).collect(Collectors.toList()); + List activityH5LevelAwards = activityH5LevelAwardService.listByIds(awardIds); + + if (CollectionUtils.isEmpty(activityH5LevelAwards)) { + return resultList; + } + Map awardMap = activityH5LevelAwards.stream().collect(Collectors.toMap(ActivityH5LevelAward::getId, x -> x)); + Map> 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 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 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 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 packItems = packItemService.listByPackId(userPack.getPackId()); + List awardIds = packItems.stream().map(PackItem::getAwardId).collect(Collectors.toList()); + List 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(); + } + + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/PackItemService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/PackItemService.java index 48cada0d7..bcaad903f 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/PackItemService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/PackItemService.java @@ -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 { List listByPackId(Integer packId); + + Map> mapByList(List packIds); + + List listByPackIds(List packIds); } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/UserPackService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/UserPackService.java index 52e46b956..814ab4563 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/UserPackService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/UserPackService.java @@ -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 getByUidPackId(Long uid, Integer packId); + List listByUid(Long uid); + + Integer packUseNumAdd(Long userPackId, Integer useNum); + } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/impl/PackItemServiceImpl.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/impl/PackItemServiceImpl.java index 173c5ff69..a4d147b2c 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/impl/PackItemServiceImpl.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/impl/PackItemServiceImpl.java @@ -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 i wrapper.eq(PackItem::getPackId, packId); return baseMapper.selectList(wrapper); } + + @Override + public Map> mapByList(List packIds) { + List packItems = this.listByPackIds(packIds); + if (CollectionUtils.isEmpty(packItems)) { + return Collections.EMPTY_MAP; + } + return packItems.stream().collect(Collectors.groupingBy(PackItem::getPackId)); + } + + @Override + public List listByPackIds(List packIds) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.in(PackItem::getPackId, packIds); + return baseMapper.selectList(wrapper); + } } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/impl/UserPackServiceImpl.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/impl/UserPackServiceImpl.java index ab88f867b..f562199e8 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/impl/UserPackServiceImpl.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/packcenter/impl/UserPackServiceImpl.java @@ -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 i .eq(UserPack::getPackId, packId); return baseMapper.selectOne(wrapper, false); } + + @Override + public List listByUid(Long uid) { + LambdaQueryWrapper 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); + } } diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserPackMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserPackMapper.xml index ef287339c..1d33b5c9c 100644 --- a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserPackMapper.xml +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserPackMapper.xml @@ -2,4 +2,7 @@ + + update user_pack set use_num = use_num + #{useNum} where id = #{userPackId} + diff --git a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/PackCenterController.java b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/PackCenterController.java new file mode 100644 index 000000000..1de7f0e43 --- /dev/null +++ b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/PackCenterController.java @@ -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> userPackList(@RequestHeader(PUB_UID) Long uid, Integer pageNo, Integer pageSize) { + List userPackVos = packCenterService.userPackList(uid, pageNo, pageSize); + return BusiResult.success(userPackVos); + } + + @ApiOperation(value = "使用礼包", httpMethod = "GET") + @GetMapping("/usePack") + public BusiResult usePack(@RequestHeader(PUB_UID) Long uid, Long targetUid, Long userPackId, Integer useNum) { + return packCenterService.usePack(uid, targetUid, userPackId, useNum); + } +}