bravo-后台

This commit is contained in:
khalil
2025-03-21 11:18:35 +08:00
parent 1ba2c7d0a7
commit 7e983e7102
10 changed files with 745 additions and 11 deletions

View File

@@ -0,0 +1,34 @@
package com.accompany.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@Data
@ApiModel
public class BravoConfigAdminVo {
@ApiModelProperty("分区id")
private Integer partitionId;
@ApiModelProperty("库存")
private BigDecimal stock;
@ApiModelProperty("平台抽成")
private BigDecimal platformRatio;
@ApiModelProperty("主播钻石分成")
private BigDecimal receiverRatio;
@ApiModelProperty("对比值N")
private BigDecimal productionRatio;
@ApiModelProperty("通知倍")
private Long warnMulti;
@ApiModelProperty("关注用户id列表")
private List<Long> followErbanNoList;
@ApiModelProperty("黑名单用户id列表")
private List<Long> blackErbanNoList;
@ApiModelProperty("白名单用户id对比值N对应表")
private Map<Long, BigDecimal> whiteErbanNoProductionRatioMap;
}

View File

@@ -0,0 +1,34 @@
package com.accompany.admin.vo.luckybag;
import com.accompany.common.result.PageResult;
import com.accompany.sharding.vo.BravoPersonalStat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@AllArgsConstructor
@NoArgsConstructor
@Data
@ApiModel
public class BravoPersonalStatVo {
@ApiModelProperty("总投入")
private BigDecimal totalInput;
@ApiModelProperty("总产出")
private BigDecimal totalOutput;
@ApiModelProperty("总投产比")
private BigDecimal totalProductionRatio;
@ApiModelProperty("列表")
private PageResult<BravoPersonalStat> dataPage;
public BravoPersonalStatVo(PageResult<BravoPersonalStat> dataPage) {
this.totalInput = BigDecimal.ZERO;
this.totalOutput = BigDecimal.ZERO;
this.totalProductionRatio = BigDecimal.ZERO;
this.dataPage = dataPage;
}
}

View File

@@ -0,0 +1,27 @@
package com.accompany.admin.vo.luckybag;
import com.accompany.sharding.vo.BravoPlatformStat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Data
@ApiModel
public class BravoPlatformStatVo {
@ApiModelProperty("总投入")
private BigDecimal totalInput;
@ApiModelProperty("总产出")
private BigDecimal totalOutput;
@ApiModelProperty("总投产比")
private BigDecimal totalProductionRatio;
@ApiModelProperty("列表")
private List<BravoPlatformStat> dataList;
}

View File

@@ -0,0 +1,447 @@
package com.accompany.admin.service.lucky;
import cn.hippo4j.common.toolkit.CollectionUtil;
import com.accompany.admin.service.system.SysConfAdminService;
import com.accompany.admin.vo.BravoConfigAdminVo;
import com.accompany.admin.vo.luckybag.BravoPersonalStatVo;
import com.accompany.admin.vo.luckybag.BravoPlatformStatVo;
import com.accompany.business.dto.lucky.BravoGiftConfig;
import com.accompany.business.model.lucky.BravoPool;
import com.accompany.business.mybatismapper.lucky.BravoPoolMapper;
import com.accompany.business.mybatismapper.lucky.BravoStatMapper;
import com.accompany.business.service.gift.BravoGiftSendService;
import com.accompany.business.service.lucky.BravoPoolService;
import com.accompany.business.service.lucky.BravoStockService;
import com.accompany.business.service.user.UsersService;
import com.accompany.common.constant.Constant;
import com.accompany.common.result.PageResult;
import com.accompany.common.status.BusiStatus;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.exception.AdminServiceException;
import com.accompany.core.model.PartitionInfo;
import com.accompany.core.model.SysConf;
import com.accompany.core.model.Users;
import com.accompany.core.service.partition.PartitionInfoService;
import com.accompany.sharding.mapper.BravoRecordMapper;
import com.accompany.sharding.vo.BravoPersonalStat;
import com.accompany.sharding.vo.BravoPlatformStat;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Duration;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.stream.Collectors;
@Slf4j
@Service
public class BravoPoolAdminService {
@Autowired
private BravoPoolMapper mapper;
@Autowired
private BravoGiftSendService giftSendService;
@Autowired
private BravoStockService stockService;
@Autowired
private UsersService usersService;
@Autowired
private SysConfAdminService sysConfAdminService;
@Autowired
private PartitionInfoService partitionInfoService;
@Autowired
private BravoPoolService poolService;
@Autowired
private BravoStatMapper statMapper;
@Autowired
private BravoRecordMapper recordMapper;
@Resource(name = "bizExecutor")
private ThreadPoolExecutor bizExecutor;
private String minStartDate = "2025-03-20";
public List<BravoPool> listPoolByType(Integer type) {
return mapper.selectList(Wrappers.<BravoPool>lambdaQuery().eq(BravoPool::getType, type).orderByDesc(BravoPool::getExpect));
}
public void save(Integer type, List<BravoPool> poolList) {
BravoGiftConfig config = giftSendService.getConfig();
Date now = new Date();
List<BravoPool> poList = listPoolByType(type);
Map<Integer, BravoPool> poMap = !CollectionUtil.isEmpty(poList)?
poList.stream().collect(Collectors.toMap(BravoPool::getId, po->po)):
new HashMap<>();
List<BravoPool> addList = new ArrayList<>();
List<BravoPool> updateList = new ArrayList<>();
for (BravoPool vo: poolList) {
int production = vo.getItemList().stream().filter(item->Objects.nonNull(item.getMulti()) && Objects.nonNull(item.getNum()))
.mapToInt(item->item.getMulti() * item.getNum()).sum();
vo.setExpect(BigDecimal.valueOf(production).divide(BigDecimal.valueOf(config.getPoolSize()), 2, RoundingMode.HALF_UP));
int winNum = vo.getItemList().stream().map(BravoPool.BravoPoolItem::getNum)
.filter(Objects::nonNull).mapToInt(Integer::intValue).sum();
vo.setWinRate(BigDecimal.valueOf(winNum).divide(BigDecimal.valueOf(config.getPoolSize()), 4, RoundingMode.HALF_UP));
vo.setUpdateTime(now);
if (null == vo.getId() || null == poMap.remove(vo.getId())) {
addList.add(vo);
} else {
updateList.add(vo);
}
}
for (BravoPool insertObj: addList) {
mapper.insert(insertObj);
}
for (BravoPool updateObj: updateList) {
mapper.updateById(updateObj);
}
if (!poMap.isEmpty()){
mapper.deleteBatchIds(poMap.keySet());
}
}
public BravoConfigAdminVo getConfig(Integer partitionId) {
BravoGiftConfig config = giftSendService.getConfig();
BravoGiftConfig partitionConfig = config.getRatioByPartitionId(partitionId);
BravoConfigAdminVo vo = new BravoConfigAdminVo();
vo.setPartitionId(partitionId);
vo.setStock(stockService.addStock(partitionId, BigDecimal.ZERO));
vo.setWarnMulti(config.getWarnMulti());
Map<Long, Users> followUserMap = usersService.getUsersMapByUids(config.getFollowUidList());
vo.setFollowErbanNoList(followUserMap.values().stream().map(Users::getErbanNo).collect(Collectors.toList()));
vo.setPlatformRatio(partitionConfig.getPlatformRatio());
vo.setReceiverRatio(partitionConfig.getReceiverRatio());
vo.setProductionRatio(partitionConfig.getProductionRatio_N());
Map<Long, Users> blackUserMap = usersService.getUsersMapByUids(config.getBlackUidList());
vo.setBlackErbanNoList(blackUserMap.values().stream().map(Users::getErbanNo).collect(Collectors.toList()));
Map<Long, BigDecimal> erbanNoProductionRatioMap = new HashMap<>();
Map<Long, Users> whiteUserMap = usersService.getUsersMapByUids(new ArrayList<>(config.getWhiteUidProductionRatioMap().keySet()));
for (Long uid: whiteUserMap.keySet()){
Users u = whiteUserMap.get(uid);
erbanNoProductionRatioMap.put(u.getErbanNo(), config.getWhiteUidProductionRatioMap().get(uid));
}
vo.setWhiteErbanNoProductionRatioMap(erbanNoProductionRatioMap);
return vo;
}
@SneakyThrows
public void updateConfig(BravoConfigAdminVo vo) {
BravoGiftConfig config = giftSendService.getConfig();
BravoGiftConfig partitionConfig = config.getRatioPartitionMap().computeIfAbsent(vo.getPartitionId(), k->new BravoGiftConfig());
if (null != vo.getPlatformRatio()){
partitionConfig.setPlatformRatio(vo.getPlatformRatio());
}
if (null != vo.getReceiverRatio()) {
partitionConfig.setReceiverRatio(vo.getReceiverRatio());
}
if (null != vo.getProductionRatio()) {
partitionConfig.setProductionRatio_N(vo.getProductionRatio());
}
if (null != vo.getStock()) {
stockService.setStock(vo.getPartitionId(), vo.getStock());
}
if (null != vo.getWarnMulti()){
config.setWarnMulti(vo.getWarnMulti());
}
if (null != vo.getFollowErbanNoList()){
if (CollectionUtils.isEmpty(vo.getFollowErbanNoList())){
config.setFollowUidList(Collections.emptyList());
} else {
List<Long> uidList = vo.getFollowErbanNoList().stream().map(erbanNo->{
Users u = usersService.getUserByErbanNo(erbanNo);
if (null != u){
return u.getUid();
}
return null;
}).filter(Objects::nonNull).distinct().collect(Collectors.toList());
config.setFollowUidList(uidList);
}
}
if (null != vo.getBlackErbanNoList()){
if (CollectionUtils.isEmpty(vo.getBlackErbanNoList())){
config.setBlackUidList(Collections.emptyList());
} else {
List<Long> uidList = vo.getBlackErbanNoList().stream().map(erbanNo->{
Users u = usersService.getUserByErbanNo(erbanNo);
if (null != u){
return u.getUid();
}
return null;
}).filter(Objects::nonNull).distinct().collect(Collectors.toList());
config.setBlackUidList(uidList);
}
}
if (null != vo.getWhiteErbanNoProductionRatioMap()){
if (CollectionUtils.isEmpty(vo.getWhiteErbanNoProductionRatioMap())){
config.setWhiteUidProductionRatioMap(Collections.emptyMap());
} else {
Map<Long, BigDecimal> whiteUidProductionRatioMap = vo.getWhiteErbanNoProductionRatioMap().keySet().stream().map(erbanNo->{
Users u = usersService.getUserByErbanNo(erbanNo);
if (null != u){
return u;
}
return null;
}).filter(Objects::nonNull).distinct().collect(Collectors.toMap(Users::getUid, u->vo.getWhiteErbanNoProductionRatioMap().get(u.getErbanNo())));
config.setWhiteUidProductionRatioMap(whiteUidProductionRatioMap);
}
}
SysConf sysConf = sysConfAdminService.getSysConfById(Constant.SysConfId.BRAVO_GIFT_CONFIG);
sysConf.setConfigValue(JSON.toJSONString(config));
sysConfAdminService.saveOrUpdate(sysConf);
}
public BravoPlatformStatVo getPlatform(Integer partitionId) {
List<BravoPlatformStat> list = listPlatform(partitionId);
BigDecimal totalInput = list.stream().map(BravoPlatformStat::getTotalInput).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalOutput = list.stream().map(BravoPlatformStat::getTotalOutput).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalProductionRatio = BigDecimal.ZERO.compareTo(totalOutput) >= 0?
BigDecimal.ZERO: totalOutput.divide(totalInput, 4, RoundingMode.HALF_UP);
return new BravoPlatformStatVo(totalInput, totalOutput, totalProductionRatio, list);
}
@SneakyThrows
public List<BravoPlatformStat> listPlatform(Integer partitionId) {
PartitionInfo partitionInfo = partitionInfoService.getById(partitionId);
String startDate = minStartDate;
String endDate = DateTimeUtil.getZonedTodayStr(partitionInfo.getZoneId());
List<String> dateStrList = DateTimeUtil.getDateListBetweenTwoDates(startDate, endDate, endDate);
Map<String, BravoPlatformStat> statMap = new HashMap<>(dateStrList.size());
CountDownLatch cdl = new CountDownLatch(2);
bizExecutor.execute(()->{
try {
Date startTime = DateTimeUtil.getBeginTimeOfDay(DateTimeUtil.convertStrToDate(endDate, DateTimeUtil.DEFAULT_DATE_PATTERN));
ZonedDateTime zonedStartTime = startTime.toInstant().atZone(ZoneId.systemDefault());
Date systemStartTime = Date.from(zonedStartTime.withZoneSameLocal(ZoneId.of(partitionInfo.getZoneId())).toInstant());
long zoneIdHour = Duration.between(systemStartTime.toInstant(), startTime.toInstant()).toHours();
Date endTime = DateTimeUtil.getEndTimeOfDay(DateTimeUtil.convertStrToDate(endDate, DateTimeUtil.DEFAULT_DATE_PATTERN));
ZonedDateTime zonedEndTime = endTime.toInstant().atZone(ZoneId.systemDefault());
Date systemEndTime = Date.from(zonedEndTime.withZoneSameLocal(ZoneId.of(partitionInfo.getZoneId())).toInstant());
List<BravoPlatformStat> list = recordMapper.listPlatform(partitionId, systemStartTime, systemEndTime, zoneIdHour);
for (BravoPlatformStat stat: list) {
statMap.put(stat.getDate(), stat);
}
} catch (Exception e) {
log.error("[listPlatform] {}", e.getMessage());
} finally {
cdl.countDown();
}
});
bizExecutor.execute(()->{
try {
String historyStartDate = dateStrList.get(0);
String historyEndDate = dateStrList.get(dateStrList.size() - 1);
List<BravoPlatformStat> statList = statMapper.listPlatformStat(partitionId, historyStartDate, historyEndDate);
if (!CollectionUtils.isEmpty(statList)) {
Map<String, BravoPlatformStat> historyStatMap = statList.stream().collect(Collectors.toMap(BravoPlatformStat::getDate, s->s));
statMap.putAll(historyStatMap);
}
} catch (Exception e) {
log.error("[listPlatform] {}", e.getMessage());
} finally {
cdl.countDown();
}
});
cdl.await();
dateStrList.add(endDate);
return dateStrList.parallelStream().sorted(Comparator.reverseOrder()).map(dateStr->{
BravoPlatformStat stat = statMap.get(dateStr);
if (null == stat) {
stat = new BravoPlatformStat(dateStr, partitionId);
} else {
BigDecimal productionRatio = BigDecimal.ZERO.compareTo(stat.getTotalInput()) >= 0?
BigDecimal.ZERO: stat.getTotalOutput().divide(stat.getTotalInput(), 4, RoundingMode.HALF_UP);
stat.setProductionRatio(productionRatio);
}
return stat;
}).collect(Collectors.toList());
}
@SneakyThrows
public BravoPersonalStatVo getPersonal(Integer partitionId, Long erbanNo, String date,
int pageNo, int pageSize) {
Page<BravoPersonalStat> page = new Page<>(pageNo, pageSize);
Long uid = null;
if (null != erbanNo){
Users u = usersService.getUserByErbanNo(erbanNo);
if (null == u || !u.getPartitionId().equals(partitionId)){
return new BravoPersonalStatVo(new PageResult<>(page));
}
uid = u.getUid();
}
PartitionInfo partitionInfo = partitionInfoService.getById(partitionId);
String zonedDateStr = DateTimeUtil.getZonedTodayStr(partitionInfo.getZoneId());
if (StringUtils.hasText(date)){
List<BravoPersonalStat> list = zonedDateStr.equals(date)? listPersonal(partitionId, partitionInfo.getZoneId(), uid, date):
statMapper.listPersonalStat(partitionId, uid, date, date);
if (CollectionUtils.isEmpty(list)) {
return new BravoPersonalStatVo(new PageResult<>(page));
}
BigDecimal totalInput = list.stream().map(BravoPersonalStat::getTotalInput).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalOutput = list.stream().map(BravoPersonalStat::getTotalOutput).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalProductionRatio = totalOutput.divide(totalInput, 4, RoundingMode.HALF_UP);
// 按大到小排序
list.sort(Comparator.comparing(BravoPersonalStat::getTotalInput).reversed());
int startIndex = (pageNo -1) * pageSize;
int endIndex = Math.min(startIndex + pageSize, list.size());
List<BravoPersonalStat> subList = list.subList(startIndex, endIndex);
List<Long> uidList = subList.stream().map(BravoPersonalStat::getUid).collect(Collectors.toList());
Map<Long, Users> usersMap = usersService.getUsersMapByUids(uidList);
for (BravoPersonalStat stat: subList) {
Users u = usersMap.get(stat.getUid());
if (null != u){
stat.setErbanNo(u.getErbanNo());
}
BigDecimal outPut = stat.getTotalOutput();
BigDecimal inPut = stat.getTotalInput();
BigDecimal productionRatio = outPut.divide(inPut, 4, RoundingMode.HALF_UP);
stat.setProductionRatio(productionRatio);
BigDecimal production = inPut.subtract(outPut);
stat.setProduction(production);
}
page.setRecords(subList);
page.setTotal(list.size());
return new BravoPersonalStatVo(totalInput, totalOutput, totalProductionRatio, new PageResult<>(page));
}
String startDate = minStartDate;
String endDate = DateTimeUtil.getZonedTodayStr(partitionInfo.getZoneId());
List<String> dateStrList = DateTimeUtil.getDateListBetweenTwoDates(startDate, endDate, endDate);
Map<String, BravoPersonalStat> statMap = new HashMap<>(dateStrList.size());
CountDownLatch cdl = new CountDownLatch(2);
Long finalUid = uid;
bizExecutor.execute(()->{
try {
List<BravoPersonalStat> list = listPersonal(partitionId, partitionInfo.getZoneId(), finalUid, zonedDateStr);
for (BravoPersonalStat stat: list) {
statMap.put(stat.getDate(), stat);
BigDecimal outPut = stat.getTotalOutput();
BigDecimal inPut = stat.getTotalInput();
BigDecimal productionRatio = outPut.divide(inPut, 4, RoundingMode.HALF_UP);
stat.setProductionRatio(productionRatio);
BigDecimal production = inPut.subtract(outPut);
stat.setProduction(production);
}
} catch (Exception e) {
log.error("[listPersonal] {}", e.getMessage());
} finally {
cdl.countDown();
}
});
bizExecutor.execute(()->{
try {
String historyStartDate = dateStrList.get(0);
String historyEndDate = dateStrList.get(dateStrList.size() - 1);
List<BravoPersonalStat> statList = statMapper.listPersonalStat(partitionId, finalUid, historyStartDate, historyEndDate);
if (!CollectionUtils.isEmpty(statList)) {
for (BravoPersonalStat stat: statList) {
statMap.put(stat.getDate(), stat);
BigDecimal outPut = stat.getTotalOutput();
BigDecimal inPut = stat.getTotalInput();
BigDecimal productionRatio = outPut.divide(inPut, 4, RoundingMode.HALF_UP);
stat.setProductionRatio(productionRatio);
BigDecimal production = inPut.subtract(outPut);
stat.setProduction(production);
}
}
} catch (Exception e) {
log.error("[listPersonal] {}", e.getMessage());
} finally {
cdl.countDown();
}
});
cdl.await();
BigDecimal totalInput = statMap.values().stream().map(BravoPersonalStat::getTotalInput).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalOutput = statMap.values().stream().map(BravoPersonalStat::getTotalOutput).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalProductionRatio = totalInput.compareTo(BigDecimal.ZERO) > 0?
totalOutput.divide(totalInput, 4, RoundingMode.HALF_UP):BigDecimal.ZERO;
dateStrList.add(endDate);
dateStrList.sort(Comparator.reverseOrder());
// 按大到小排序
int startIndex = (pageNo -1) * pageSize;
int endIndex = Math.min(startIndex + pageSize, dateStrList.size());
page.setTotal(dateStrList.size());
List<String> subDateStrList = dateStrList.subList(startIndex, endIndex);
page.setRecords(subDateStrList.parallelStream().map(dateStr->{
BravoPersonalStat stat = statMap.get(dateStr);
if (null == stat) {
stat = new BravoPersonalStat(dateStr, partitionId, finalUid, erbanNo);
} else {
stat.setErbanNo(erbanNo);
}
return stat;
}).collect(Collectors.toList()));
return new BravoPersonalStatVo(totalInput, totalOutput, totalProductionRatio, new PageResult<>(page));
}
private List<BravoPersonalStat> listPersonal(int partitionId, String zonedId, Long uid, String date) {
ZoneId zoneId = ZoneId.of(zonedId);
Date startTime = DateTimeUtil.getBeginTimeOfDay(DateTimeUtil.convertStrToDate(date, DateTimeUtil.DEFAULT_DATE_PATTERN));
ZonedDateTime zonedStartTime = startTime.toInstant().atZone(ZoneId.systemDefault());
Date systemStartTime = Date.from(zonedStartTime.withZoneSameLocal(zoneId).toInstant());
long zoneIdHour = Duration.between(systemStartTime.toInstant(), startTime.toInstant()).toHours();
Date endTime = DateTimeUtil.getEndTimeOfDay(DateTimeUtil.convertStrToDate(date, DateTimeUtil.DEFAULT_DATE_PATTERN));
ZonedDateTime zonedEndTime = endTime.toInstant().atZone(ZoneId.systemDefault());
Date systemEndTime = Date.from(zonedEndTime.withZoneSameLocal(zoneId).toInstant());
return recordMapper.listPersonal(partitionId, uid, systemStartTime, systemEndTime, zoneIdHour);
}
public void updateUserMulti(Long erbanNo) {
Users u = usersService.getUserByErbanNo(erbanNo);
if (null == u){
throw new AdminServiceException(BusiStatus.USER_NOT_EXISTED);
}
poolService.updateUserMulti(u.getUid());
}
}

View File

@@ -0,0 +1,58 @@
package com.accompany.admin.controller.lucky;
import com.accompany.admin.service.lucky.BravoPoolAdminService;
import com.accompany.admin.vo.BravoConfigAdminVo;
import com.accompany.common.result.BusiResult;
import com.accompany.common.status.BusiStatus;
import com.accompany.core.exception.AdminServiceException;
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.*;
@Api(tags = "Bravo")
@RestController
@RequestMapping("/admin/bravo/config")
public class BravoConfigAdminController {
@Autowired
private BravoPoolAdminService service;
@ApiOperation("类型列表")
@ApiImplicitParams({
@ApiImplicitParam(value = "partitionId", name = "分区Id")
})
@GetMapping("/getConfig")
public BusiResult<BravoConfigAdminVo> getConfig(Integer partitionId) {
if (null == partitionId){
throw new AdminServiceException(BusiStatus.PARAMERROR);
}
return BusiResult.success(service.getConfig(partitionId));
}
@ApiOperation("修改")
@PostMapping("/update")
public BusiResult<Void> update(@RequestBody BravoConfigAdminVo vo) {
if (null == vo || null == vo.getPartitionId()){
throw new AdminServiceException(BusiStatus.PARAMERROR);
}
service.updateConfig(vo);
return BusiResult.success();
}
@ApiOperation("修改用户")
@ApiImplicitParams({
@ApiImplicitParam(value = "erbanNo", name = "用户Id")
})
@PostMapping("/updateUserMulti")
public BusiResult<Void> updateUserMulti(Long erbanNo) {
if (null == erbanNo){
throw new AdminServiceException(BusiStatus.PARAMERROR);
}
service.updateUserMulti(erbanNo);
return BusiResult.success();
}
}

View File

@@ -0,0 +1,74 @@
package com.accompany.admin.controller.lucky;
import com.accompany.admin.service.lucky.BravoPoolAdminService;
import com.accompany.business.constant.BravoPoolTypeEnum;
import com.accompany.business.model.lucky.BravoPool;
import com.accompany.common.result.BusiResult;
import com.accompany.common.status.BusiStatus;
import com.accompany.core.exception.AdminServiceException;
import com.alibaba.fastjson.JSON;
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.*;
import java.util.*;
import java.util.stream.Collectors;
@Api(tags = "Bravo")
@RestController
@RequestMapping("/admin/bravo/pool")
public class BravoPoolAdminController {
@Autowired
private BravoPoolAdminService service;
@ApiOperation("类型列表")
@GetMapping("/listType")
public BusiResult<List<Map<String, Object>>> listType() {
return BusiResult.success(Arrays.stream(BravoPoolTypeEnum.values())
.sorted(Comparator.comparing(BravoPoolTypeEnum::getType).reversed())
.map(typeEnum -> {
Map<String, Object> map = new HashMap<>();
map.put("type", typeEnum.getType());
map.put("name", typeEnum.getName());
return map;
}).collect(Collectors.toList()));
}
@ApiOperation("池子列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "type", value = "类型", required = true)
})
@GetMapping("/list")
public BusiResult<List<BravoPool>> list(Integer type) {
if (null == type) {
throw new AdminServiceException(BusiStatus.PARAMERROR);
}
BravoPoolTypeEnum typeEnum = BravoPoolTypeEnum.get(type);
List<BravoPool> poolList = service.listPoolByType(typeEnum.getType());
return BusiResult.success(poolList);
}
@ApiOperation("保存")
@ApiImplicitParams({
@ApiImplicitParam(name = "type", value = "类型", required = true),
@ApiImplicitParam(name = "poolList", value = "池子列表")
})
@PostMapping("/save")
public BusiResult<Void> save(@RequestBody String body) {
JSONObject params = JSON.parseObject(body);
Integer type = params.getInteger("type");
List<BravoPool> poolList = params.getJSONArray("poolList").toJavaList(BravoPool.class);
if (null == type) {
throw new AdminServiceException(BusiStatus.PARAMERROR);
}
BravoPoolTypeEnum typeEnum = BravoPoolTypeEnum.get(type);
service.save(typeEnum.getType(), poolList);
return BusiResult.success();
}
}

View File

@@ -0,0 +1,61 @@
package com.accompany.admin.controller.lucky;
import com.accompany.admin.service.lucky.BravoPoolAdminService;
import com.accompany.admin.service.lucky.Lucky24PoolAdminService;
import com.accompany.admin.vo.luckybag.BravoPersonalStatVo;
import com.accompany.admin.vo.luckybag.BravoPlatformStatVo;
import com.accompany.admin.vo.luckybag.Lucky24PersonalStatVo;
import com.accompany.admin.vo.luckybag.Lucky24PlatformStatVo;
import com.accompany.common.result.BusiResult;
import com.accompany.common.status.BusiStatus;
import com.accompany.core.exception.ServiceException;
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.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "Bravo")
@RestController
@RequestMapping("/admin/bravo/record")
public class BravoRecordAdminController {
@Autowired
private BravoPoolAdminService service;
@ApiOperation("平台数据")
@ApiImplicitParams({
@ApiImplicitParam(value = "partitionId", name = "分区ID", required = true),
})
@GetMapping("/platform")
public BusiResult<BravoPlatformStatVo> platform(Integer partitionId) {
if (null == partitionId) {
throw new ServiceException(BusiStatus.PARAMERROR);
}
BravoPlatformStatVo platformStat = service.getPlatform(partitionId);
return BusiResult.success(platformStat);
}
@ApiOperation("个人数据")
@ApiImplicitParams({
@ApiImplicitParam(value = "partitionId", name = "分区ID", required = true),
@ApiImplicitParam(value = "erbanNo", name = "用户ID"),
@ApiImplicitParam(value = "date", name = "开始日期", required = true),
@ApiImplicitParam(value = "pageNo", name = "页号", required = true),
@ApiImplicitParam(value = "pageSize", name = "页长", required = true),
})
@GetMapping("/personal")
public BusiResult<BravoPersonalStatVo> personal(Integer partitionId, Long erbanNo, String date,
int pageNo, int pageSize) {
if (null == partitionId || (null == erbanNo && !StringUtils.hasText(date))) {
throw new ServiceException(BusiStatus.PARAMERROR);
}
BravoPersonalStatVo vo = service.getPersonal(partitionId, erbanNo, date, pageNo, pageSize);
return BusiResult.success(vo);
}
}

View File

@@ -24,11 +24,11 @@ public class BravoPersonalStat {
private Long erbanNo;
@ApiModelProperty("送礼金币总额")
private Long totalInput;
private BigDecimal totalInput;
@ApiModelProperty("送礼返币总额")
private Long totalOutput;
private BigDecimal totalOutput;
@ApiModelProperty("相差")
private Long production;
private BigDecimal production;
@ApiModelProperty("投产比")
private BigDecimal productionRatio;
@ApiModelProperty("平均投入金额")
@@ -45,9 +45,9 @@ public class BravoPersonalStat {
this.partitionId = partitionId;
this.uid = uid;
this.erbanNo = erbanNo;
this.totalInput = 0L;
this.totalOutput = 0L;
this.production = 0L;
this.totalInput = BigDecimal.ZERO;
this.totalOutput = BigDecimal.ZERO;
this.production = BigDecimal.ZERO;
this.productionRatio = BigDecimal.ZERO;
this.avgInput = BigDecimal.ZERO;
this.num = 0L;

View File

@@ -19,9 +19,9 @@ public class BravoPlatformStat {
@ApiModelProperty("分区id")
private Integer partitionId;
@ApiModelProperty("送礼金币总额")
private Long totalInput;
private BigDecimal totalInput;
@ApiModelProperty("送礼返币总额")
private Long totalOutput;
private BigDecimal totalOutput;
@ApiModelProperty("投产比")
private BigDecimal productionRatio;
@ApiModelProperty("参与次数")
@@ -38,8 +38,8 @@ public class BravoPlatformStat {
public BravoPlatformStat(String date, Integer partitionId) {
this.date = date;
this.partitionId = partitionId;
this.totalInput = 0L;
this.totalOutput = 0L;
this.totalInput = BigDecimal.ZERO;
this.totalOutput = BigDecimal.ZERO;
this.productionRatio = BigDecimal.ZERO;
this.num = 0L;
this.count = 0L;

View File

@@ -1,4 +1,3 @@
<?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.sharding.mapper.BravoRecordMapper">