公会-土耳其-钱包-增加紫晶类型

This commit is contained in:
2025-08-20 12:07:44 +08:00
parent cae4550e96
commit e832871488
6 changed files with 98 additions and 0 deletions

View File

@@ -58,6 +58,7 @@ public enum RedisKey {
lock_user_diamond, // 钻石分布式锁
lock_user_crystal, // 水晶分布式锁
lock_user_guild_usd, // 公会usd分布式锁
lock_user_guild_crystal, // 公会usd分布式锁
lock_gift_message, // 消费送礼物消息锁
mq_gift_status, // 礼物消息的状态
mq_prize_status, // 中奖消息的状态

View File

@@ -16,6 +16,7 @@ public enum CurrencyEnum {
GOLD((byte)3, "钻石", 0.0001),
GUILD_USD((byte)4, "公会薪资", 1),
GAME_USD((byte)5, "游戏薪资", 1),
GUILD_CRYSTAL((byte)6, "公会紫晶", 0.0000625),
;
CurrencyEnum(byte value, String desc, double exchangeRate) {

View File

@@ -28,6 +28,8 @@ public class UserPurse {
private Double guildUsd;
private Double guildCrystal;
private Boolean firstCharge;
private Date updateTime;
@@ -41,6 +43,8 @@ public class UserPurse {
return diamonds;
} else if (CurrencyEnum.GUILD_USD.equals(currency)) {
return guildUsd;
} else if (CurrencyEnum.GUILD_CRYSTAL.equals(currency)) {
return guildCrystal;
}
throw new ServiceException(BusiStatus.PARAMETERILLEGAL);
}

View File

@@ -28,6 +28,10 @@ public interface UserPurseMapper extends BaseMapper<UserPurse> {
int updateMinusGuildUsd(@Param("uid") Long uid, @Param("guildUsd") Double guildUsd);
int updateAddGuildCrystal(@Param("uid") Long uid, @Param("guildCrystal") Double guildCrystal);
int updateMinusGuildCrystal(@Param("uid") Long uid, @Param("guildCrystal") Double guildCrystal);
int excGoldToDiamond(@Param("uid") Long uid, @Param("excNum") Double excNum, @Param("diamondNum") Double diamondNum);
int exCrystalToGold(@Param("uid") Long uid, @Param("excNum") Double excNum, @Param("goldNum") Double goldNum);

View File

@@ -502,6 +502,85 @@ public class UserPurseService extends ServiceImpl<UserPurseMapper,UserPurse> {
return after;
}
public UserPurse subGuildCrystal(Long uid, Double guildCrystalNum, BillObjTypeEnum objTypeEnum) {
return SpringContextHolder.getBean(UserPurseService.class).subGuildCrystal(uid, guildCrystalNum, objTypeEnum, BusiStatus.PURSE_MONEY_NOT_ENOUGH, null);
}
public UserPurse subGuildCrystal(Long uid, Double guildCrystalNum, BillObjTypeEnum objTypeEnum, Consumer<UserPurse> billConsumer) {
return SpringContextHolder.getBean(UserPurseService.class).subGuildCrystal(uid, guildCrystalNum, objTypeEnum, BusiStatus.PURSE_MONEY_NOT_ENOUGH, billConsumer);
}
@Frozen
@Transactional(rollbackFor = Exception.class, transactionManager = "mybatisplusTransactionManager")
public UserPurse subGuildCrystal(Long uid, Double guildCrystalNum, BillObjTypeEnum objTypeEnum, BusiStatus busiStatus, Consumer<UserPurse> billConsumer) {
if (guildCrystalNum <= 0d) {
throw new ServiceException(BusiStatus.AMOUNT_PARAM_ERROR);
}
String desc = objTypeEnum.getDesc();
UserPurse after = withLock(uid, RedisKey.lock_user_guild_crystal, userPurse -> {
double restGold = DoubleUtil.sub(userPurse.getGuildCrystal(), guildCrystalNum);
if (restGold < 0d){
throw new ServiceException(busiStatus);
}
//todo
if (familyDiamondSettlementPurseService.inSettlement(uid)){
throw new ServiceException(BusiStatus.CLAN_GOLD_SETTLEMENT);
}
log.info("subGuildCrystalNum 操作前,buss:{},userPurse:{}", desc, gson.toJson(userPurse));
int ret = baseMapper.updateMinusGuildCrystal(uid, guildCrystalNum);
boolean result = SqlHelper.retBool(ret);
if(!result) {
throw new ServiceException(BusiStatus.SERVERBUSY);
}
userPurse.setGuildCrystal(DoubleUtil.sub(userPurse.getGuildCrystal(), guildCrystalNum));
userPurse.setUpdateTime(new Date());
log.info("subGuildCrystalNum 操作后,buss:{},userPurse:{}", desc, gson.toJson(userPurse));
return userPurse;
});
if (null != billConsumer) {
billConsumer.accept(after);
} else {
billRecordService.insertGeneralBillRecord(uid, objTypeEnum, guildCrystalNum, after);
}
return after;
}
public UserPurse addGuildCrystal(Long uid, Double guildCrystal, BillObjTypeEnum objTypeEnum) {
return SpringContextHolder.getBean(UserPurseService.class).addGuildCrystal(uid, guildCrystal, objTypeEnum, null);
}
@Transactional(rollbackFor = Exception.class, transactionManager = "mybatisplusTransactionManager")
public UserPurse addGuildCrystal(Long uid, Double guildCrystalNum, BillObjTypeEnum objTypeEnum, Consumer<UserPurse> billConsumer) {
if (guildCrystalNum <= 0d) {
throw new ServiceException(BusiStatus.AMOUNT_PARAM_ERROR);
}
String desc = objTypeEnum.getDesc();
UserPurse after = withLock(uid, RedisKey.lock_user_guild_crystal, userPurse -> {
log.info("addGuildCrystal 操作前,buss:{},userPurse:{}", desc, gson.toJson(userPurse));
int ret = baseMapper.updateAddGuildCrystal(uid, guildCrystalNum);
boolean result = SqlHelper.retBool(ret);
if(!result) {
throw new ServiceException(BusiStatus.SERVERBUSY);
}
userPurse.setGuildCrystal(DoubleUtil.add(guildCrystalNum, userPurse.getGuildCrystal()));
userPurse.setUpdateTime(new Date());
log.info("addGuildCrystal 操作后,buss:{},userPurse:{}", desc, gson.toJson(userPurse));
return userPurse;
});
if (null != billConsumer) {
billConsumer.accept(after);
} else {
billRecordService.insertGeneralBillRecord(uid, objTypeEnum, guildCrystalNum, after);
}
return after;
}
private <R> R withLock(Long uid, RedisKey redisKey, Function<UserPurse, R> function){
String lockKey = redisKey.getKey(String.valueOf(uid));
RLock lock = redissonClient.getLock(lockKey);

View File

@@ -39,6 +39,15 @@
where uid=#{uid} and guild_usd &gt;= #{guildUsd}
</update>
<update id="updateAddGuildCrystal">
update user_purse set guild_crystal = guild_crystal + #{guildCrystal},update_time=now() where uid=#{uid}
</update>
<update id="updateMinusGuildCrystal">
update user_purse set guild_crystal = guild_crystal - #{guildCrystal},update_time=now()
where uid=#{uid} and guild_crystal &gt;= #{guildCrystal}
</update>
<update id="excGoldToDiamond" parameterType="com.accompany.business.model.UserPurse">
update user_purse set golds = golds - #{excNum},diamonds = diamonds + #{diamondNum}, update_time=now()
where uid=#{uid} and golds &gt;= #{excNum}