公会薪资流水-清钻石fixed

公会薪资流水-清钻石
This commit is contained in:
2025-08-13 19:06:15 +08:00
parent 3e1964a6e3
commit e940ce9a3c
16 changed files with 318 additions and 3 deletions

View File

@@ -17,6 +17,7 @@ import com.accompany.core.exception.AdminServiceException;
import com.accompany.core.model.Users;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -42,6 +43,9 @@ public class GuildPolicy2AdminService {
public PageResult<GuildPolicy2MemberAdminVo> queryMemberPage(Long ownerErbanNo, Integer guildId, Long erbanNo,
Integer partitionId, String startDate, String endDate, Integer pageNo, Integer pageSize) {
if (StringUtils.isEmpty(startDate) || StringUtils.isEmpty(endDate)) {
throw new AdminServiceException("请选择周期");
}
Long uid = null;
if (erbanNo != null) {
Users user = usersService.getUserByErbanNo(erbanNo);

View File

@@ -30,6 +30,7 @@ public enum BillDomainTypeEnum {
USER_EVENT(23, "用户活动"),
FIRST_CHARGE(24, "首充"),
GAME_USD(25, "游戏薪资"),
GUILD_POLICY2(25, "土耳其公会政策2"),
;
private int value;

View File

@@ -267,6 +267,10 @@ public enum BillObjTypeEnum {
PLUS_GAME_USD( 178, "官方增加游戏薪资", BillTypeEnum.IN, CurrencyEnum.GAME_USD, BillDomainTypeEnum.GAME_USD),
MIUNS_GAME_USD( 179, "官方扣除游戏薪资", BillTypeEnum.OUT, CurrencyEnum.GAME_USD, BillDomainTypeEnum.GAME_USD),
GUILD_POLICY2_SUB_GUILD_USD( 180, "土耳其公会结算扣除薪资", BillTypeEnum.OUT, CurrencyEnum.GUILD_USD, BillDomainTypeEnum.GUILD_POLICY2),
GUILD_POLICY2_SUB_GOLDS( 181, "土耳其公会结算扣除钻石", BillTypeEnum.OUT, CurrencyEnum.GOLD, BillDomainTypeEnum.GUILD_POLICY2),
;
BillObjTypeEnum(int value, String desc, BillTypeEnum type, CurrencyEnum currency, BillDomainTypeEnum domain) {

View File

@@ -0,0 +1,47 @@
package com.accompany.business.model.guildpolicy2;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 公会钻石清理记录实体类
*
* @author
* @since 2025-08-13
*/
@Data
public class GuildDiamondClearPolicy2 implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 清理周期
*/
private String cycleDate;
private Integer partitionId;
private Long guildMemberId;
private Long uid;
/**
* 公会id
*/
private Integer guildId;
/**
* 清理钻石
*/
private BigDecimal diamondNum;
private BigDecimal guildUsd;
/**
* 清理时间
*/
private Date createTime;
private Date updateTime;
}

View File

@@ -0,0 +1,17 @@
package com.accompany.business.vo.guildpolicy;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class GuildPolicy2ClearDiamondVo {
private Long guildMemberId;
private Integer guildId;
private Long uid;//用户id
private Integer partitionId;//分区id
private BigDecimal purseGolds;//钱包钻石数量
private BigDecimal guildUsd;
}

View File

@@ -16,6 +16,9 @@ public class GuildPolicy2MemberAdminVo {
@ExcelProperty("公会id")
@ApiModelProperty("公会id")
private Integer guildId;
@ExcelProperty("公会名称")
@ApiModelProperty("公会名称")
private String guildName;
@ExcelProperty("公会长id")
@ApiModelProperty("公会长id")
private Long ownerErbanNo;

View File

@@ -0,0 +1,14 @@
package com.accompany.business.mybatismapper.guildpolicy2;
import com.accompany.business.model.guildpolicy2.GuildDiamondClearPolicy2;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 公会钻石清理记录 Mapper 接口
*
* @author
* @since 2025-08-13
*/
public interface GuildDiamondClearPolicy2Mapper extends BaseMapper<GuildDiamondClearPolicy2> {
}

View File

@@ -3,6 +3,7 @@ package com.accompany.business.mybatismapper.guildpolicy2;
import com.accompany.business.model.guildpolicy2.GuildDiamondStatisticsPolicy2;
import com.accompany.business.vo.guild.GuildDiamondStatisticsDayVo;
import com.accompany.business.vo.guild.GuildMemberDiamondStatisticsDayVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2ClearDiamondVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2MemberAdminVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2MemberVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2PersonalVo;
@@ -51,4 +52,7 @@ public interface GuildDiamondStatisticsPolicy2Mapper extends BaseMapper<GuildDia
@Param("startDate")String startDate, @Param("endDate")String endDate,
@Param("guildId") Integer guildId, @Param("uid") Long uid,
@Param("partitionId") Integer partitionIdd);
List<GuildPolicy2ClearDiamondVo> listClearDaimondData(@Param("partitionId")Integer partitionId);
}

View File

@@ -0,0 +1,18 @@
package com.accompany.business.service.guildpolicy2;
import com.accompany.business.model.guildpolicy2.GuildDiamondClearPolicy2;
import com.accompany.business.mybatismapper.guildpolicy2.GuildDiamondClearPolicy2Mapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* 公会钻石清理记录 服务实现类
*
* @author
* @since 2025-08-13
*/
@Service
public class GuildDiamondClearPolicy2Service extends ServiceImpl<GuildDiamondClearPolicy2Mapper, GuildDiamondClearPolicy2> {
}

View File

@@ -5,6 +5,7 @@ import com.accompany.business.model.guildpolicy2.GuildDiamondStatisticsPolicy2;
import com.accompany.business.mybatismapper.guildpolicy2.GuildDiamondStatisticsPolicy2Mapper;
import com.accompany.business.vo.guild.GuildDiamondStatisticsDayVo;
import com.accompany.business.vo.guild.GuildMemberDiamondStatisticsDayVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2ClearDiamondVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2MemberAdminVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2MemberVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2PersonalVo;
@@ -66,4 +67,8 @@ public class GuildDiamondStatisticsPolicy2Service extends ServiceImpl<GuildDiamo
return baseMapper.listByStatDate(page, statDate, endDate, guildId, uid, partitionId);
}
public List<GuildPolicy2ClearDiamondVo> listClearDaimondData(Integer partitionId) {
return baseMapper.listClearDaimondData(partitionId);
}
}

View File

@@ -3,29 +3,38 @@ package com.accompany.business.service.guildpolicy2;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.constant.guild.GuildConstant;
import com.accompany.business.model.guild.GuildMember;
import com.accompany.business.model.guildpolicy2.GuildDiamondClearPolicy2;
import com.accompany.business.service.guild.GuildAuthService;
import com.accompany.business.service.guild.GuildMemberService;
import com.accompany.business.service.purse.UserPurseService;
import com.accompany.business.service.room.RoomMicService;
import com.accompany.business.service.user.UsersService;
import com.accompany.business.util.FullMonthCycleTimeUtil;
import com.accompany.business.vo.guild.CycleDateVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2ClearDiamondVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2PersonalVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2Vo;
import com.accompany.common.result.BusiResult;
import com.accompany.common.status.BusiStatus;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.enumeration.BillObjTypeEnum;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Users;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.*;
import java.util.concurrent.ThreadPoolExecutor;
import static com.accompany.common.constant.Constant.ClanMode.GUILD_POLICY2;
@Slf4j
@Service
@@ -42,6 +51,12 @@ public class GuildPolicy2Service {
private GuildMicStatisticsPolicy2Service guildMicStatisticsPolicy2Service;
@Autowired
private UsersService usersService;
@Autowired
private GuildDiamondClearPolicy2Service guildDiamondClearPolicy2Service;
@Autowired
private UserPurseService userPurseService;
@Resource(name = "bizExecutor")
private ThreadPoolExecutor bizExecutor;
public BusiResult<GuildPolicy2Vo> getGuildPolicy2(Long uid, String cycleBeginDate) {
GuildPolicy2Vo guildPolicy2Vo = new GuildPolicy2Vo();
@@ -132,4 +147,59 @@ public class GuildPolicy2Service {
}
}
}
public void clearDiamond(PartitionEnum partitionEnum, Date lastMonthDate) {
if (!GUILD_POLICY2.equals(partitionEnum.getClanMode())) {
log.info("clearDiamond partitionEnum:{}, clanMode:{} lastMonthDate:{}", partitionEnum, partitionEnum.getClanMode(), lastMonthDate);
return;
}
List<GuildPolicy2ClearDiamondVo> policy2ClearDiamondVos = guildDiamondStatisticsPolicy2Service.listClearDaimondData(partitionEnum.getId());
if (CollectionUtils.isEmpty(policy2ClearDiamondVos)) {
log.info("clearDiamond partitionEnum:{}, clanMode:{} lastMonthDate:{} no data", partitionEnum, partitionEnum.getClanMode(), lastMonthDate);
return;
}
String cycleDate = DateUtil.formatDate(lastMonthDate);
Date date = new Date();
List<GuildDiamondClearPolicy2> clearDiamondVos = new ArrayList<>();
for (GuildPolicy2ClearDiamondVo policy2ClearDiamondVo : policy2ClearDiamondVos) {
GuildDiamondClearPolicy2 policy2 = new GuildDiamondClearPolicy2();
policy2.setCycleDate(cycleDate);
policy2.setGuildId(policy2ClearDiamondVo.getGuildId());
policy2.setGuildMemberId(policy2ClearDiamondVo.getGuildMemberId());
policy2.setUid(policy2ClearDiamondVo.getUid());
policy2.setPartitionId(partitionEnum.getId());
if (policy2ClearDiamondVo.getPurseGolds() == null) {
policy2.setDiamondNum(BigDecimal.ZERO);
} else {
policy2.setDiamondNum(policy2ClearDiamondVo.getPurseGolds());
}
if (policy2ClearDiamondVo.getGuildUsd() == null) {
policy2.setGuildUsd(BigDecimal.ZERO);
} else {
policy2.setGuildUsd(policy2ClearDiamondVo.getGuildUsd());
}
policy2.setCreateTime(date);
policy2.setUpdateTime(date);
clearDiamondVos.add(policy2);
}
guildDiamondClearPolicy2Service.saveOrUpdateBatch(clearDiamondVos);
for (GuildDiamondClearPolicy2 clearDiamondVo : clearDiamondVos) {
bizExecutor.execute(() -> {
try {
log.info("clearDiamond partitionEnum:{}, clearDiamondVo:{}", partitionEnum, JSONObject.toJSONString(clearDiamondVo));
if (clearDiamondVo.getDiamondNum().compareTo(BigDecimal.ZERO) > 0) {
userPurseService.clearGolds(clearDiamondVo.getUid(), clearDiamondVo.getDiamondNum().doubleValue(),
BillObjTypeEnum.GUILD_POLICY2_SUB_GOLDS);
}
if (clearDiamondVo.getGuildUsd().compareTo(BigDecimal.ZERO) > 0) {
userPurseService.clearGuildUsd(clearDiamondVo.getUid(), clearDiamondVo.getGuildUsd(),
BillObjTypeEnum.GUILD_POLICY2_SUB_GUILD_USD);
}
} catch (Exception e) {
log.error("clearDiamond partitionEnum:{}, clearDiamondVo:{} error:{}", partitionEnum, JSONObject.toJSONString(clearDiamondVo), e);
}
});
}
}
}

View File

@@ -44,7 +44,6 @@ import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -583,4 +582,64 @@ public class UserPurseService extends ServiceImpl<UserPurseMapper,UserPurse> {
return purseInUids.stream().collect(Collectors.toMap(UserPurse::getUid,Function.identity()));
}
@Frozen
@Transactional(rollbackFor = Exception.class, transactionManager = "mybatisplusTransactionManager")
public UserPurse clearGolds(Long uid, Double goldNum, BillObjTypeEnum objTypeEnum) {
if (goldNum <= 0d) {
throw new ServiceException(BusiStatus.AMOUNT_PARAM_ERROR);
}
String desc = objTypeEnum.getDesc();
UserPurse after = withLock(uid, RedisKey.lock_user_gold, userPurse -> {
double restGold = userPurse.getGolds() - goldNum;
double subGolds = goldNum;
if (restGold < 0d){
subGolds = userPurse.getGolds();
}
log.info("subGold 操作前,buss:{},userPurse:{}", desc, gson.toJson(userPurse));
int ret = baseMapper.updateMinusGolds(uid,subGolds);
boolean result = SqlHelper.retBool(ret);
if(!result) {
throw new ServiceException(BusiStatus.SERVERBUSY);
}
userPurse.setGolds(DoubleUtil.sub(userPurse.getGolds(), subGolds));
userPurse.setUpdateTime(new Date());
log.info("subGold 操作后,buss:{},userPurse:{}", desc, gson.toJson(userPurse));
return userPurse;
});
billRecordService.insertGeneralBillRecord(uid, objTypeEnum, goldNum, after);
return after;
}
@Frozen
@Transactional(rollbackFor = Exception.class, transactionManager = "mybatisplusTransactionManager")
public UserPurse clearGuildUsd(Long uid, BigDecimal guildUsdNum, BillObjTypeEnum objTypeEnum) {
if (BigDecimal.ZERO.compareTo(guildUsdNum) > 0) {
throw new ServiceException(BusiStatus.AMOUNT_PARAM_ERROR);
}
String desc = objTypeEnum.getDesc();
UserPurse after = withLock(uid, RedisKey.lock_user_guild_usd, userPurse -> {
BigDecimal purseGuildUsd = BigDecimal.valueOf(userPurse.getGuildUsd());
BigDecimal subGuildUsd = guildUsdNum;
if (purseGuildUsd.compareTo(guildUsdNum) < 0){
subGuildUsd = purseGuildUsd;
}
log.info("subGuildUsd 操作前,buss:{},userPurse:{}", desc, gson.toJson(userPurse));
int ret = baseMapper.updateMinusGuildUsd(uid, subGuildUsd.doubleValue());
boolean result = SqlHelper.retBool(ret);
if (!result){
throw new ServiceException(BusiStatus.SERVERBUSY);
}
BigDecimal afterGuildUsd = purseGuildUsd.subtract(subGuildUsd);
userPurse.setGuildUsd(afterGuildUsd.doubleValue());
userPurse.setUpdateTime(new Date());
log.info("subGold 操作后,buss:{},userPurse:{}", desc, gson.toJson(userPurse));
return userPurse;
});
billRecordService.insertGeneralBillRecord(uid, objTypeEnum, guildUsdNum.doubleValue(), after);
return after;
}
}

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.accompany.business.mybatismapper.guildpolicy2.GuildDiamondClearPolicy2Mapper">
</mapper>

View File

@@ -48,8 +48,8 @@
<select id="listPersonalData" resultType="com.accompany.business.vo.guildpolicy.GuildPolicy2PersonalVo">
select
gdsp.stat_date as statDate,
ifnull(sum(gdsp.diamond_num), 0) as diamondNum,
gmp.mic_minutes as micMinute,
ifnull(gdsp.diamond_num, 0) as diamondNum,
ifnull(gmp.mic_minutes, 0) as micMinute,
if(gmp.mic_minutes >= 120, 1, 0) as validMicDay
from `guild_diamond_statistics_policy2` gdsp
left join guild_mic_statistics_policy2 gmp on gmp.guild_member_id = gdsp.guild_member_id and gmp.cycle_date = #{cycleDate}
@@ -135,6 +135,7 @@
select
gd.guild_member_id guildMemberId,
gd.guild_id guildId,
ANY_VALUE(g.name) guildName,
ANY_VALUE(u.erban_no) ownerErbanNo,
ANY_VALUE(um.erban_no) erbanNo,
ANY_VALUE(um.nick) nick,
@@ -164,4 +165,17 @@
ORDER BY diamondNum desc
</select>
<select id="listClearDaimondData" resultType="com.accompany.business.vo.guildpolicy.GuildPolicy2ClearDiamondVo">
select
gm.uid as uid,
gm.guild_id as guildId,
gm.id as guildMemberId,
gm.partition_id as partitionId,
ifnull(up.golds, 0) as purseGolds,
ifnull(up.guild_usd, 0) as guildUsd
from guild_member gm
left join user_purse up on gm.uid = up.uid
where gm.partition_id = #{partitionId} and gm.`enable` = 1
group by gm.uid
</select>
</mapper>

View File

@@ -1,11 +1,13 @@
package com.accompany.business.controller.guildpolicy;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.service.guildpolicy2.GuildPolicy2Service;
import com.accompany.business.service.room.GuildMemberRoomMicRecordService;
import com.accompany.business.vo.guild.CycleDateVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2Vo;
import com.accompany.common.annotation.Authorization;
import com.accompany.common.result.BusiResult;
import com.accompany.core.enumeration.PartitionEnum;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -53,4 +55,11 @@ public class GuildPolicy2Controller {
guildMemberRoomMicRecordService.statMicRecordTask4GuildPolicy2();;
return guildPolicy2Service.getCycleDates(uid);
}
@Authorization
@GetMapping("/clearDiamond")
public BusiResult<List<CycleDateVo>> clearDiamond(Integer partitionId, String date) {
guildPolicy2Service.clearDiamond(PartitionEnum.getByPartitionId(partitionId), DateUtil.parseDateTime(date));
return BusiResult.success();
}
}

View File

@@ -0,0 +1,41 @@
package com.accompany.scheduler.task.guild;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.service.guildpolicy2.GuildPolicy2Service;
import com.accompany.core.enumeration.PartitionEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
@Component
@Slf4j
public class GuildPolicy2ClearDiamondTask {
@Autowired
private GuildPolicy2Service guildPolicy2Service;
/**
* 公户月结算,用户明细
* 每月1号凌晨0点0分15秒执行
*/
@Scheduled(cron = "15 0 0 1 * ?", zone = "Etc/GMT-3")
public void guildPolicy2ClearDiamond() {
Date date = new Date();
List<PartitionEnum> partitionEnumList = List.of(PartitionEnum.TURKEY);
for (PartitionEnum partitionEnum : partitionEnumList) {
try {
Date lastMonth = DateUtil.offsetMonth(date, -1);
log.info("=-=GuildPolicy2ClearDiamondTask=-=:begin");
guildPolicy2Service.clearDiamond(partitionEnum, lastMonth);
log.info("=-=GuildPolicy2ClearDiamondTask=-= end");
} catch (Exception e) {
log.error("[GuildPolicy2ClearDiamondTask] 异常", e);
}
}
}
}