勋章广场fixed

勋章广场
This commit is contained in:
2025-06-06 19:21:19 +08:00
parent b544f7b124
commit 5ef02952b5
12 changed files with 311 additions and 27 deletions

View File

@@ -7,6 +7,6 @@ import lombok.Data;
import java.util.List;
@Data
public class MedalSeriesVo extends MedalSeries {
public class MedalSeriesAdminVo extends MedalSeries {
List<MedalSeriesRef> medalSeriesRefs;
}

View File

@@ -1,6 +1,6 @@
package com.accompany.admin.service.medal;
import com.accompany.admin.vo.MedalSeriesVo;
import com.accompany.admin.vo.MedalSeriesAdminVo;
import com.accompany.business.model.medal.Medal;
import com.accompany.business.model.medal.MedalSeries;
import com.accompany.business.model.medal.MedalSeriesRef;
@@ -38,12 +38,12 @@ public class MedalSeriesAdminService {
@Transactional
public BusiResult<Void> saveOrUpdate(MedalSeriesVo medalSeriesVo) {
List<MedalSeriesRef> medalSeriesRefs = medalSeriesVo.getMedalSeriesRefs();
public BusiResult<Void> saveOrUpdate(MedalSeriesAdminVo medalSeriesAdminVo) {
List<MedalSeriesRef> medalSeriesRefs = medalSeriesAdminVo.getMedalSeriesRefs();
if (CollectionUtils.isEmpty(medalSeriesRefs)) {
throw new AdminServiceException("请配置勋章ID");
}
if (medalSeriesVo.getMedalLevel() != medalSeriesRefs.size()) {
if (medalSeriesAdminVo.getMedalLevel() != medalSeriesRefs.size()) {
throw new AdminServiceException("勋章等级配置不一致,");
}
for (MedalSeriesRef medalSeriesRef : medalSeriesRefs) {
@@ -51,10 +51,13 @@ public class MedalSeriesAdminService {
if (medal == null) {
throw new AdminServiceException(String.format("勋章ID:%s不存在", medalSeriesRef.getMedalId()));
}
if (medal.getEnable() == Boolean.TRUE) {
throw new AdminServiceException(String.format("勋章ID:%s状态为无效", medalSeriesRef.getMedalId()));
}
}
MedalSeries medalSeries = new MedalSeries();
BeanUtils.copyProperties(medalSeriesVo, medalSeries);
if (medalSeriesVo.getSeriesId() == null) {
BeanUtils.copyProperties(medalSeriesAdminVo, medalSeries);
if (medalSeriesAdminVo.getSeriesId() == null) {
medalSeries.setCreateTime(new Date());
}
medalSeries.setUpdateTime(new Date());
@@ -73,9 +76,9 @@ public class MedalSeriesAdminService {
return BusiResult.success();
}
public BusiResult<PageResult<MedalSeriesVo>> list(Integer type, Integer level, Integer partitionId, Integer pageNo, Integer pageSize) {
PageResult<MedalSeriesVo> pageResult = new PageResult<>();
List<MedalSeriesVo> resultVo = new ArrayList<>();
public BusiResult<PageResult<MedalSeriesAdminVo>> list(Integer type, Integer level, Integer partitionId, Integer pageNo, Integer pageSize) {
PageResult<MedalSeriesAdminVo> pageResult = new PageResult<>();
List<MedalSeriesAdminVo> resultVo = new ArrayList<>();
pageResult.setRows(resultVo);
LambdaQueryWrapper<MedalSeries> wrapper = Wrappers.lambdaQuery();
wrapper.eq(type != null && type != 0, MedalSeries::getType, type)
@@ -88,23 +91,19 @@ public class MedalSeriesAdminService {
return BusiResult.success(pageResult);
}
for (MedalSeries record : records) {
MedalSeriesVo medalSeriesVo = new MedalSeriesVo();
BeanUtils.copyProperties(record, medalSeriesVo);
resultVo.add(medalSeriesVo);
MedalSeriesAdminVo medalSeriesAdminVo = new MedalSeriesAdminVo();
BeanUtils.copyProperties(record, medalSeriesAdminVo);
resultVo.add(medalSeriesAdminVo);
}
List<Integer> seriesIds = records.stream().map(MedalSeries::getSeriesId).collect(Collectors.toList());
LambdaQueryWrapper<MedalSeriesRef> refWrapper = Wrappers.lambdaQuery();
refWrapper.in(MedalSeriesRef::getSeriesId, seriesIds);
List<MedalSeriesRef> list = medalSeriesRefService.list(refWrapper);
List<MedalSeriesRef> list = medalSeriesRefService.listBySeriesIds(seriesIds);
if (CollectionUtils.isNotEmpty(list)) {
Map<Integer, List<MedalSeriesRef>> seriesIdMap = list.stream().collect(Collectors.groupingBy(MedalSeriesRef::getSeriesId));
for (MedalSeriesVo medalSeriesVo : resultVo) {
medalSeriesVo.setMedalSeriesRefs(seriesIdMap.getOrDefault(medalSeriesVo.getSeriesId(), EMPTY_LIST));
for (MedalSeriesAdminVo medalSeriesAdminVo : resultVo) {
medalSeriesAdminVo.setMedalSeriesRefs(seriesIdMap.getOrDefault(medalSeriesAdminVo.getSeriesId(), EMPTY_LIST));
}
}
return BusiResult.success(pageResult);
}
public BusiResult<Void> updateStatus(Integer seriesId, Integer status) {

View File

@@ -1,6 +1,6 @@
package com.accompany.admin.controller.medal;
import com.accompany.admin.vo.MedalSeriesVo;
import com.accompany.admin.vo.MedalSeriesAdminVo;
import com.accompany.admin.service.medal.MedalSeriesAdminService;
import com.accompany.common.result.BusiResult;
import com.accompany.common.result.PageResult;
@@ -17,15 +17,15 @@ import org.springframework.web.bind.annotation.RestController;
@Api(tags = "勋章等级管理")
@RestController
@RequestMapping("/admin/medalSeries")
public class MedalSeriesController {
public class MedalSeriesAdminController {
@Autowired
private MedalSeriesAdminService medalSeriesAdminService;
@ApiOperation(value = "新增更新", httpMethod = "POST")
@PostMapping("/saveOrUpdate")
public BusiResult<Void> saveOrUpdate(MedalSeriesVo medalSeriesVo) {
return medalSeriesAdminService.saveOrUpdate(medalSeriesVo);
public BusiResult<Void> saveOrUpdate(MedalSeriesAdminVo medalSeriesAdminVo) {
return medalSeriesAdminService.saveOrUpdate(medalSeriesAdminVo);
}
@ApiImplicitParams({
@@ -37,7 +37,7 @@ public class MedalSeriesController {
})
@ApiOperation(value = "列表", httpMethod = "GET")
@GetMapping("/list")
public BusiResult<PageResult<MedalSeriesVo>> list(Integer type, Integer level, Integer partitionId, Integer pageNo, Integer pageSize) {
public BusiResult<PageResult<MedalSeriesAdminVo>> list(Integer type, Integer level, Integer partitionId, Integer pageNo, Integer pageSize) {
return medalSeriesAdminService.list(type, level, partitionId, pageNo, pageSize);
}

View File

@@ -0,0 +1,28 @@
package com.accompany.business.vo.medal;
import com.accompany.common.annotation.ReplaceAppDomain;
import com.accompany.core.annotation.I18n;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel
@Data
public class MedalSeriesRefVo {
@ApiModelProperty("勋章id")
private Integer medalId;
@ApiModelProperty("勋章名称")
@I18n(className = "Medal", fieldName = "name")
private String name;
@ApiModelProperty("勋章描述")
@I18n(className = "Medal", fieldName = "medalDesc")
private String medalDesc;
@ApiModelProperty("勋章静态图")
@ReplaceAppDomain
private String picUrl;
@ApiModelProperty("勋章mp4")
@ReplaceAppDomain
private String mp4Url;
@ApiModelProperty("勋章等级")
private Integer level;
}

View File

@@ -0,0 +1,16 @@
package com.accompany.business.vo.medal;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@ApiModel
@Data
public class MedalSeriesSquareVo {
@ApiModelProperty("勋章类型 1任务勋章 2成就勋章,3荣耀勋章")
private Integer type;
@ApiModelProperty("勋章系列")
private List<MedalSeriesVo> medalSeries;
}

View File

@@ -0,0 +1,20 @@
package com.accompany.business.vo.medal;
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 MedalSeriesVo {
@ApiModelProperty("勋章系列名")
@I18n(className = "MedalSeries")
private String seriesName;
@ApiModelProperty("(勋章最高级)")
private Integer medalLevel;
@ApiModelProperty("勋章详情")
List<MedalSeriesRefVo> medalVos;
}

View File

@@ -3,6 +3,8 @@ package com.accompany.business.service.medal;
import com.accompany.business.model.medal.MedalSeriesRef;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 勋章-勋章序列-关联表 服务类
*
@@ -11,5 +13,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface MedalSeriesRefService extends IService<MedalSeriesRef> {
List<MedalSeriesRef> listBySeriesIds(List<Integer> seriesIds);
}

View File

@@ -3,6 +3,9 @@ package com.accompany.business.service.medal;
import com.accompany.business.model.medal.MedalSeries;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 勋章序列 服务类
*
@@ -12,4 +15,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
public interface MedalSeriesService extends IService<MedalSeries> {
List<MedalSeries> listSquareValid(Integer partitionId);
}

View File

@@ -0,0 +1,149 @@
package com.accompany.business.service.medal;
import com.accompany.business.model.medal.Medal;
import com.accompany.business.model.medal.MedalSeries;
import com.accompany.business.model.medal.MedalSeriesRef;
import com.accompany.business.service.user.UsersService;
import com.accompany.business.vo.medal.MedalSeriesRefVo;
import com.accompany.business.vo.medal.MedalSeriesSquareVo;
import com.accompany.business.vo.medal.MedalSeriesVo;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Users;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import lombok.Data;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static com.accompany.common.status.BusiStatus.SERIES_CONFIG_ERROR;
@Service
@Data
public class MedalSeriesSquareService {
@Autowired
private MedalSeriesService medalSeriesService;
@Autowired
private MedalSeriesRefService medalSeriesRefService;
@Autowired
private MedalService medalService;
@Autowired
private UsersService usersService;
public List<MedalSeriesSquareVo> seriesSquareVos(Long uid) throws ExecutionException {
Users users = usersService.getUsersByUid(uid);
Integer partitionId = users.getPartitionId();
return squaresMedal.get(partitionId);
}
public List<MedalSeriesSquareVo> squaresDb(Integer partitionId) {
List<MedalSeriesSquareVo> resultList = new ArrayList<>();
List<MedalSeries> medalSeries = medalSeriesService.listSquareValid(partitionId);
if (CollectionUtils.isEmpty(medalSeries)) {
return resultList;
}
List<Integer> seriesIds = medalSeries
.stream()
.map(MedalSeries::getSeriesId)
.collect(Collectors.toList());
List<MedalSeriesRef> medalSeriesRefs = medalSeriesRefService.listBySeriesIds(seriesIds);
if (CollectionUtils.isEmpty(medalSeriesRefs)) {
throw new ServiceException(SERIES_CONFIG_ERROR);
}
List<Integer> medalIds = medalSeriesRefs
.stream()
.map(MedalSeriesRef::getMedalId)
.collect(Collectors.toList());
Map<Integer, Medal> medalMap = medalService.getMedalMap(medalIds);
Map<Integer, List<MedalSeries>> typeMap = medalSeries
.stream()
.collect(Collectors.groupingBy(MedalSeries::getType));//分类
Map<Integer, List<MedalSeriesRef>> refMap = medalSeriesRefs
.stream()
.collect(Collectors.groupingBy(MedalSeriesRef::getSeriesId));//分系列
return typeMap.entrySet().stream()
.map(entry -> buildSquareVo(entry.getKey(), entry.getValue(), refMap, medalMap))
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
private MedalSeriesSquareVo buildSquareVo(Integer type,
List<MedalSeries> seriesList,
Map<Integer, List<MedalSeriesRef>> refMap,
Map<Integer, Medal> medalMap) {
List<MedalSeriesVo> medalSeriesVos = seriesList.stream()
.map(series -> buildSeriesVo(series, refMap.get(series.getSeriesId()), medalMap))
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(medalSeriesVos)) {
return null;
}
MedalSeriesSquareVo squareVo = new MedalSeriesSquareVo();
squareVo.setType(type);
squareVo.setMedalSeries(medalSeriesVos);
return squareVo;
}
private MedalSeriesVo buildSeriesVo(MedalSeries series,
List<MedalSeriesRef> seriesRefs,
Map<Integer, Medal> medalMap) {
if (CollectionUtils.isEmpty(seriesRefs)) {
return null;
}
List<MedalSeriesRefVo> medalVos = seriesRefs.stream()
.map(ref -> buildMedalVo(ref, medalMap.get(ref.getMedalId())))
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(medalVos)) {
return null;
}
MedalSeriesVo medalSeriesVo = new MedalSeriesVo();
medalSeriesVo.setMedalLevel(series.getMedalLevel());
medalSeriesVo.setSeriesName(series.getSeriesName());
medalSeriesVo.setMedalVos(medalVos);
return medalSeriesVo;
}
private MedalSeriesRefVo buildMedalVo(MedalSeriesRef seriesRef, Medal medal) {
if (medal == null) {
return null;
}
MedalSeriesRefVo vo = new MedalSeriesRefVo();
vo.setMedalDesc(medal.getMedalDesc());
vo.setMedalId(medal.getId());
vo.setLevel(seriesRef.getLevel());
vo.setPicUrl(medal.getPicUrl());
vo.setMp4Url(medal.getMp4Url());
vo.setName(medal.getName());
return vo;
}
public final LoadingCache<Integer, List<MedalSeriesSquareVo>> squaresMedal = CacheBuilder.newBuilder()
.maximumSize(8)
.expireAfterWrite(10, TimeUnit.MINUTES) // 设置写入后10分钟过期
.build(new CacheLoader<>() {
@Override
public List<MedalSeriesSquareVo> load(Integer partitionId) {
return squaresDb(partitionId);
}
});
}

View File

@@ -3,9 +3,13 @@ package com.accompany.business.service.medal.impl;
import com.accompany.business.model.medal.MedalSeriesRef;
import com.accompany.business.mybatismapper.medal.MedalSeriesRefMapper;
import com.accompany.business.service.medal.MedalSeriesRefService;
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;
/**
* 勋章-勋章序列-关联表 服务实现类
*
@@ -16,4 +20,11 @@ import org.springframework.stereotype.Service;
public class MedalSeriesRefServiceImpl extends ServiceImpl<MedalSeriesRefMapper, MedalSeriesRef> implements MedalSeriesRefService {
@Override
public List<MedalSeriesRef> listBySeriesIds(List<Integer> seriesIds) {
LambdaQueryWrapper<MedalSeriesRef> refWrapper = Wrappers.lambdaQuery();
refWrapper.in(MedalSeriesRef::getSeriesId, seriesIds)
.orderByAsc(MedalSeriesRef::getSeriesId, MedalSeriesRef::getLevel);
return baseMapper.selectList(refWrapper);
}
}

View File

@@ -3,9 +3,16 @@ package com.accompany.business.service.medal.impl;
import com.accompany.business.model.medal.MedalSeries;
import com.accompany.business.mybatismapper.medal.MedalSeriesMapper;
import com.accompany.business.service.medal.MedalSeriesService;
import com.accompany.business.vo.medal.MedalSeriesSquareVo;
import com.accompany.common.constant.Constant;
import com.accompany.common.result.BusiResult;
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;
/**
* 勋章序列 服务实现类
*
@@ -15,5 +22,18 @@ import org.springframework.stereotype.Service;
@Service
public class MedalSeriesServiceImpl extends ServiceImpl<MedalSeriesMapper, MedalSeries> implements MedalSeriesService {
@Override
public List<MedalSeries> listSquareValid(Integer partitionId) {
LambdaQueryWrapper<MedalSeries> wrapper = Wrappers.lambdaQuery();
wrapper.select(MedalSeries::getSeriesId,
MedalSeries::getMedalLevel,
MedalSeries::getSeriesName,
MedalSeries::getType,
MedalSeries::getSeq,
MedalSeries::getProgress)
.eq(MedalSeries::getSquareShow, 1)
.apply("(partition_flag = 0 or (partition_flag & {0}) != 0)", partitionId)
.eq(MedalSeries::getStatus, Constant.StatusV2.valid);
return baseMapper.selectList(wrapper);
}
}

View File

@@ -0,0 +1,35 @@
package com.accompany.business.controller;
import com.accompany.business.common.BaseController;
import com.accompany.business.service.medal.MedalSeriesSquareService;
import com.accompany.business.vo.medal.MedalSeriesSquareVo;
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 java.util.concurrent.ExecutionException;
import static com.accompany.common.constant.ApplicationConstant.PublicParameters.PUB_UID;
@Api(tags = "勋章管理", value = "勋章管理")
@Slf4j
@RestController
@RequestMapping("/medal")
public class MedalSeriesController extends BaseController {
@Autowired
private MedalSeriesSquareService medalSeriesSquareService;
@GetMapping("/square")
@ApiOperation(value = "勋章广场", httpMethod = "GET")
public BusiResult<List<MedalSeriesSquareVo>> squares(@RequestHeader(PUB_UID) Long uid) throws ExecutionException {
return BusiResult.success(medalSeriesSquareService.seriesSquareVos(uid));
}
}