bravo-后台
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
@@ -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());
|
||||
}
|
||||
}
|
@@ -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();
|
||||
}
|
||||
|
||||
}
|
@@ -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();
|
||||
}
|
||||
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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">
|
||||
|
Reference in New Issue
Block a user