From c161422b3223bb3a3885545a6cdb794d0fa358a7 Mon Sep 17 00:00:00 2001 From: khalil <842328916@qq.com> Date: Wed, 20 Aug 2025 15:13:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=AC=E4=BC=9A-=E5=9C=9F=E8=80=B3=E5=85=B6-?= =?UTF-8?q?=E5=85=AC=E4=BC=9A=E6=B0=B4=E6=99=B6=E7=BB=93=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/accompany/common/redis/RedisKey.java | 1 + .../core/enumeration/BillObjTypeEnum.java | 1 + .../GuildMemberCrystalSettlementRecord.java | 24 +++ ...ldMemberCrystalSettlementRecordMapper.java | 7 + .../mybatismapper/UserPurseMapper.java | 4 + .../FamilyDiamondSettlementService.java | 3 +- .../service/guild/GuildMemberService.java | 5 +- .../GuildCrystalSettlementService.java | 139 ++++++++++++++++++ ...dMemberCrystalSettlementRecordService.java | 11 ++ .../guildpolicy2/GuildPolicy2Service.java | 10 ++ .../GuildCrystalSettlementPurseService.java | 62 ++++++++ .../service/purse/UserPurseService.java | 4 +- ...ildMemberCrystalSettlementRecordMapper.xml | 23 +++ .../accompany/sqlmappers/UserPurseMapper.xml | 12 ++ .../task/FamilyDiamondSettlementTask.java | 2 +- ...k.java => GuildPolicy2SettlementTask.java} | 21 ++- 16 files changed, 322 insertions(+), 7 deletions(-) create mode 100644 accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildpolicy2/GuildMemberCrystalSettlementRecord.java create mode 100644 accompany-business/accompany-business-service/src/main/java/com/accompany/business/mapper/GuildMemberCrystalSettlementRecordMapper.java rename accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/{clan => family}/FamilyDiamondSettlementService.java (98%) create mode 100644 accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildCrystalSettlementService.java create mode 100644 accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildMemberCrystalSettlementRecordService.java create mode 100644 accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/GuildCrystalSettlementPurseService.java create mode 100644 accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildMemberCrystalSettlementRecordMapper.xml rename accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/guild/{GuildPolicy2ClearDiamondTask.java => GuildPolicy2SettlementTask.java} (65%) diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java b/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java index 25c4868e2..1c333ec67 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java @@ -1328,6 +1328,7 @@ public enum RedisKey { guild_member_room_mic_record_vo, guild_week_rank, guild_month_rank, + guild_crystal_settlement, //幸运24 lucky_24_stock, diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/core/enumeration/BillObjTypeEnum.java b/accompany-base/accompany-core/src/main/java/com/accompany/core/enumeration/BillObjTypeEnum.java index bd9aecd9a..b042cfd5e 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/core/enumeration/BillObjTypeEnum.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/core/enumeration/BillObjTypeEnum.java @@ -274,6 +274,7 @@ public enum BillObjTypeEnum { LUCKY_GIFT_INCOME_ALLOT( 182, "幸运礼物价值分成", BillTypeEnum.IN, CurrencyEnum.GUILD_CRYSTAL, BillDomainTypeEnum.GUILD_POLICY2), NORMAL_GIFT_INCOME_ALLOT( 183, "普通礼物价值分成", BillTypeEnum.IN, CurrencyEnum.GUILD_CRYSTAL, BillDomainTypeEnum.GUILD_POLICY2), + GUILD_POLICY2_CRYSTAL_SETTLEMENT( 184, "公会紫晶结算", BillTypeEnum.OUT, CurrencyEnum.GUILD_CRYSTAL, BillDomainTypeEnum.GUILD_POLICY2), ; BillObjTypeEnum(int value, String desc, BillTypeEnum type, CurrencyEnum currency, BillDomainTypeEnum domain) { diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildpolicy2/GuildMemberCrystalSettlementRecord.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildpolicy2/GuildMemberCrystalSettlementRecord.java new file mode 100644 index 000000000..fb8b4b62f --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildpolicy2/GuildMemberCrystalSettlementRecord.java @@ -0,0 +1,24 @@ +package com.accompany.business.model.guildpolicy2; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class GuildMemberCrystalSettlementRecord { + + @TableId(type = IdType.AUTO) + private Long id; + private String cycleDate; + private Integer partitionId; + private Long guildMemberId; + private Integer guildId; + private Byte roleType; + private Long uid; + private Double crystalNum; + private Date createTime; + +} \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mapper/GuildMemberCrystalSettlementRecordMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mapper/GuildMemberCrystalSettlementRecordMapper.java new file mode 100644 index 000000000..0193a556a --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mapper/GuildMemberCrystalSettlementRecordMapper.java @@ -0,0 +1,7 @@ +package com.accompany.business.mapper; + +import com.accompany.business.model.guildpolicy2.GuildMemberCrystalSettlementRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface GuildMemberCrystalSettlementRecordMapper extends BaseMapper { +} \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/UserPurseMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/UserPurseMapper.java index cb2928d51..2a8807e1d 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/UserPurseMapper.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/UserPurseMapper.java @@ -44,6 +44,10 @@ public interface UserPurseMapper extends BaseMapper { int excGoldToGuildUsd(@Param("uid") Long uid, @Param("goldNum") Double goldNum, @Param("guildUsdNum") Double guildUsdNum); + List selectGuildCrystalByUids(@Param("uids") List uids); + + int updateSettlementGuildCrystal(@Param("uid") Long uid, @Param("guildCrystal") Double guildCrystal); + UserPurse queryByUid(@Param("uid") Long uid); } \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/clan/FamilyDiamondSettlementService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/family/FamilyDiamondSettlementService.java similarity index 98% rename from accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/clan/FamilyDiamondSettlementService.java rename to accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/family/FamilyDiamondSettlementService.java index 61a762f73..a7e60e070 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/clan/FamilyDiamondSettlementService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/family/FamilyDiamondSettlementService.java @@ -1,11 +1,10 @@ -package com.accompany.business.service.clan; +package com.accompany.business.service.family; import com.accompany.business.model.UserPurse; import com.accompany.business.model.family.FamilyMember; import com.accompany.business.model.family.FamilyMemberDiamondSettlementRecord; import com.accompany.business.mybatismapper.UserPurseMapper; import com.accompany.business.mybatismapper.family.FamilyMemberDiamondSettlementRecordMapper; -import com.accompany.business.service.family.FamilyMemberService; import com.accompany.business.service.purse.FamilyDiamondSettlementPurseService; import com.accompany.business.service.purse.UserPurseService; import com.accompany.business.service.record.BillRecordService; diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildMemberService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildMemberService.java index cece4c181..69517419f 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildMemberService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildMemberService.java @@ -77,7 +77,6 @@ public class GuildMemberService extends ServiceImpl listVaildGuildMember(Integer familyId) { List guildMembers = this.lambdaQuery() .eq(null != familyId, GuildMember::getGuildId, familyId) @@ -96,4 +95,8 @@ public class GuildMemberService extends ServiceImpl listByPartitionId(int partitionId) { return this.lambdaQuery().eq(GuildMember::getPartitionId, partitionId).list(); } + + public List listValidGuildMemberByPartitionId(int partitionId) { + return this.lambdaQuery().eq(GuildMember::getEnable, Boolean.TRUE).eq(GuildMember::getPartitionId, partitionId).list(); + } } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildCrystalSettlementService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildCrystalSettlementService.java new file mode 100644 index 000000000..2f264214c --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildCrystalSettlementService.java @@ -0,0 +1,139 @@ +package com.accompany.business.service.guildpolicy2; + +import com.accompany.business.model.UserPurse; +import com.accompany.business.model.guild.GuildMember; +import com.accompany.business.model.guildpolicy2.GuildMemberCrystalSettlementRecord; +import com.accompany.business.mybatismapper.UserPurseMapper; +import com.accompany.business.service.guild.GuildMemberService; +import com.accompany.business.service.purse.GuildCrystalSettlementPurseService; +import com.accompany.business.service.record.BillRecordService; +import com.accompany.common.utils.DateTimeUtil; +import com.accompany.core.enumeration.BillObjTypeEnum; +import com.alibaba.fastjson.JSON; +import com.google.common.collect.Lists; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLocalCachedMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class GuildCrystalSettlementService { + + @Autowired + private UserPurseMapper userPurseMapper; + @Autowired + private GuildMemberService guildMemberService; + @Autowired + private GuildCrystalSettlementPurseService guildCrystalSettlementPurseService; + @Autowired + private BillRecordService billRecordService; + @Autowired + private GuildMemberCrystalSettlementRecordService guildMemberCrystalSettlementRecordService; + + @SneakyThrows + public void settlement(Integer partitionId, Date cycleTime, Integer waitSecond) { + //当天零点再前推1秒,相当于昨天23:59:59 给客户端周查询 + Date now = null == cycleTime? DateTimeUtil.addSeconds(DateTimeUtil.getBeginTimeOfDay(new Date()),-1): DateTimeUtil.getEndTimeOfDay(cycleTime); + String cycleDate = DateTimeUtil.convertDate(now, DateTimeUtil.DEFAULT_DATE_PATTERN); + + List guildMemberList = guildMemberService.listValidGuildMemberByPartitionId(partitionId); + if (CollectionUtils.isEmpty(guildMemberList)){ + return; + } + + RLocalCachedMap settlementCrystalMap = guildCrystalSettlementPurseService.getGuildCrystalSettlementMap(); + + // uid: golds + List uidList = guildMemberList.stream().map(GuildMember::getUid).distinct().collect(Collectors.toList()); + Map memberCrystalMap = userPurseMapper.selectGuildCrystalByUids(uidList) + .stream().collect(Collectors.toMap(UserPurse::getUid, UserPurse::getGuildCrystal)); + + //先把他们设置为结算状态 + settlementCrystalMap.putAll(memberCrystalMap); + log.info("[guild crystal 结算] 设置结算状态 uids: {}", uidList.stream().map(Object::toString).collect(Collectors.joining(", "))); + log.info("[guild crystal 结算] 获得当前公会成员(除会长)的guild crystal快照 {}", JSON.toJSONString(memberCrystalMap)); + + //冷却3秒,等已经抢到lock准备subGuildCrystal都差不多执行完,再结算 + Thread.sleep(3 * 1000); + + //因为没有获取每个成员的钱包锁,间接用double check方法,但不能在极端情况下保持最终一致性,例如先减少后加 + //再查一次,获取冷却后的最新值,取两者最小值,确保在不扣结算等待期间的所加的金币 + Map memberCrystalMapSecond = userPurseMapper.selectGuildCrystalByUids(uidList) + .stream().collect(Collectors.toMap(UserPurse::getUid, UserPurse::getGuildCrystal)); + log.info("[guild crystal 结算] 获得当前公会成员冷却后的紫晶快照 {}", JSON.toJSONString(memberCrystalMap)); + + for (Map.Entry entry: memberCrystalMap.entrySet()){ + Double newCrystalNum = memberCrystalMapSecond.get(entry.getKey()); + if (null != newCrystalNum && Double.compare(entry.getValue(), newCrystalNum) > 0){ + entry.setValue(newCrystalNum); + } + } + log.info("[guild crystal 结算] 获得当前公会成员的紫晶快照(冷却前后取最小值) {}", JSON.toJSONString(memberCrystalMap)); + + //留给测试去结算状态下测试 + if (null == waitSecond || waitSecond < 3){ + waitSecond = 0; + } + if (waitSecond > 0){ + Thread.sleep(waitSecond * 1000); + } + + int batchSize = 30; + + List> batchList = Lists.partition(guildMemberList, batchSize); + for (List batch: batchList){ + List recordList = batch.parallelStream() + .map(guildMember -> { + Long uid = guildMember.getUid(); + Double guildCrystal = memberCrystalMap.get(uid); + + if (Double.compare(guildCrystal, 0d) > 0){ + //扣金币 + userPurseMapper.updateSettlementGolds(uid, guildCrystal); + } + + //结算记录 + GuildMemberCrystalSettlementRecord settlementRecord = new GuildMemberCrystalSettlementRecord(); + settlementRecord.setPartitionId(partitionId); + settlementRecord.setCycleDate(cycleDate); + settlementRecord.setGuildMemberId(guildMember.getId()); + settlementRecord.setGuildId(guildMember.getGuildId()); + settlementRecord.setRoleType(guildMember.getRoleType()); + settlementRecord.setUid(uid); + settlementRecord.setCrystalNum(guildCrystal); + settlementRecord.setCreateTime(now); + + return settlementRecord; + }).toList(); + + guildMemberCrystalSettlementRecordService.saveBatch(recordList); + + saveBillRecord(recordList); + } + + //清空结算状态 + settlementCrystalMap.clear(); + log.info("[guild crystal 结算] 清除结算状态"); + + } + + private void saveBillRecord(List recordList) { + recordList.parallelStream().filter(record->record.getCrystalNum() > 0d) + .forEach(record -> { + UserPurse up = new UserPurse(); + up.setUid(record.getUid()); + up.setGuildCrystal(0D); + billRecordService.insertGeneralBillRecord(record.getUid(), record.getId().toString(), + BillObjTypeEnum.GUILD_POLICY2_CRYSTAL_SETTLEMENT, record.getCrystalNum(), up); + }); + } + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildMemberCrystalSettlementRecordService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildMemberCrystalSettlementRecordService.java new file mode 100644 index 000000000..e9ec765de --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildMemberCrystalSettlementRecordService.java @@ -0,0 +1,11 @@ +package com.accompany.business.service.guildpolicy2; + +import com.accompany.business.mapper.GuildMemberCrystalSettlementRecordMapper; +import com.accompany.business.model.guildpolicy2.GuildMemberCrystalSettlementRecord; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service +public class GuildMemberCrystalSettlementRecordService extends ServiceImpl { + +} \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java index 006d4044a..2945ef534 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildpolicy2/GuildPolicy2Service.java @@ -14,6 +14,7 @@ import com.accompany.business.util.FullMonthCycleTimeUtil; import com.accompany.business.vo.guild.CycleDateVo; import com.accompany.business.vo.guildpolicy.GuildPolicy2PersonalVo; import com.accompany.business.vo.guildpolicy.GuildPolicy2Vo; +import com.accompany.common.constant.Constant; import com.accompany.common.result.BusiResult; import com.accompany.common.status.BusiStatus; import com.accompany.common.utils.DateTimeUtil; @@ -59,6 +60,8 @@ public class GuildPolicy2Service { private UserPurseService userPurseService; @Resource(name = "bizExecutor") private ThreadPoolExecutor bizExecutor; + @Autowired + private GuildCrystalSettlementService guildCrystalSettlementService; public BusiResult getGuildPolicy2(Long uid, String cycleBeginDate) { GuildPolicy2Vo guildPolicy2Vo = new GuildPolicy2Vo(); @@ -236,4 +239,11 @@ public class GuildPolicy2Service { }); } } + + public void clearGuildCrystal(PartitionEnum partitionEnum, Date lastMonthDate) { + if (!Constant.ClanMode.GUILD_POLICY2.equals(partitionEnum.getClanMode())) { + return; + } + guildCrystalSettlementService.settlement(partitionEnum.getId(), lastMonthDate, null); + } } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/GuildCrystalSettlementPurseService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/GuildCrystalSettlementPurseService.java new file mode 100644 index 000000000..395705b1c --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/GuildCrystalSettlementPurseService.java @@ -0,0 +1,62 @@ +package com.accompany.business.service.purse; + +import com.accompany.common.redis.RedisKey; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.LocalCachedMapOptions; +import org.redisson.api.RLocalCachedMap; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + +@Slf4j +@Service +public class GuildCrystalSettlementPurseService implements InitializingBean { + + @Autowired + private RedissonClient redissonClient; + + @Getter + private RLocalCachedMap guildCrystalSettlementMap; + + public boolean inSettlement(Long uid){ + return guildCrystalSettlementMap.containsKey(uid); + } + + @Override + public void afterPropertiesSet() throws Exception { + LocalCachedMapOptions options = LocalCachedMapOptions.defaults() + // 用于淘汰清除本地缓存内的元素 + // 共有以下几种选择: + // LFU - 统计元素的使用频率,淘汰用得最少(最不常用)的。 + // LRU - 按元素使用时间排序比较,淘汰最早(最久远)的。 + // SOFT - 元素用Java的WeakReference来保存,缓存元素通过GC过程清除。 + // WEAK - 元素用Java的SoftReference来保存, 缓存元素通过GC过程清除。 + // NONE - 永不淘汰清除缓存元素。 + .evictionPolicy(LocalCachedMapOptions.EvictionPolicy.SOFT) + // 如果缓存容量值为0表示不限制本地缓存容量大小 + .cacheSize(1000) + // 以下选项适用于断线原因造成了未收到本地缓存更新消息的情况。 + // 断线重连的策略有以下几种: + // CLEAR - 如果断线一段时间以后则在重新建立连接以后清空本地缓存 + // LOAD - 在服务端保存一份10分钟的作废日志 + // 如果10分钟内重新建立连接,则按照作废日志内的记录清空本地缓存的元素 + // 如果断线时间超过了这个时间,则将清空本地缓存中所有的内容 + // NONE - 默认值。断线重连时不做处理。 + .reconnectionStrategy(LocalCachedMapOptions.ReconnectionStrategy.CLEAR) + // 以下选项适用于不同本地缓存之间相互保持同步的情况 + // 缓存同步策略有以下几种: + // INVALIDATE - 默认值。当本地缓存映射的某条元素发生变动时,同时驱逐所有相同本地缓存映射内的该元素 + // UPDATE - 当本地缓存映射的某条元素发生变动时,同时更新所有相同本地缓存映射内的该元素 + // NONE - 不做任何同步处理 + .syncStrategy(LocalCachedMapOptions.SyncStrategy.INVALIDATE) + // 每个Map本地缓存里元素的有效时间,默认毫秒为单位 + .timeToLive(2, TimeUnit.SECONDS) + // 每个Map本地缓存里元素的最长闲置时间,默认毫秒为单位 + .maxIdle(2, TimeUnit.SECONDS); + guildCrystalSettlementMap = redissonClient.getLocalCachedMap(RedisKey.guild_crystal_settlement.getKey(), options); + } +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/UserPurseService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/UserPurseService.java index 1493e39a6..4303493c2 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/UserPurseService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/UserPurseService.java @@ -76,6 +76,8 @@ public class UserPurseService extends ServiceImpl { private FamilyDiamondSettlementPurseService familyDiamondSettlementPurseService; @Autowired private BillRecordService billRecordService; + @Autowired + private GuildCrystalSettlementPurseService guildCrystalSettlementPurseService; private final Gson gson = new Gson(); @@ -524,7 +526,7 @@ public class UserPurseService extends ServiceImpl { } //todo - if (familyDiamondSettlementPurseService.inSettlement(uid)){ + if (guildCrystalSettlementPurseService.inSettlement(uid)){ throw new ServiceException(BusiStatus.CLAN_GOLD_SETTLEMENT); } diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildMemberCrystalSettlementRecordMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildMemberCrystalSettlementRecordMapper.xml new file mode 100644 index 000000000..f627804c6 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildMemberCrystalSettlementRecordMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + id, cycle_date, partition_id, guild_member_id, guild_id, role_type, uid, crystal_num, create_time + + + \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserPurseMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserPurseMapper.xml index eebe5f319..745635b59 100644 --- a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserPurseMapper.xml +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserPurseMapper.xml @@ -59,6 +59,7 @@ @@ -92,4 +93,15 @@ group by u.partition_id + + + + update user_purse set guild_crystal = (case when guild_crystal - #{guildCrystal} > 0 then guild_crystal - #{guildCrystal} else 0 end), update_time=now() + where uid=#{uid} + + \ No newline at end of file diff --git a/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/FamilyDiamondSettlementTask.java b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/FamilyDiamondSettlementTask.java index 50e0e8b09..5802c0374 100644 --- a/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/FamilyDiamondSettlementTask.java +++ b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/FamilyDiamondSettlementTask.java @@ -1,6 +1,6 @@ package com.accompany.scheduler.task; -import com.accompany.business.service.clan.FamilyDiamondSettlementService; +import com.accompany.business.service.family.FamilyDiamondSettlementService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; diff --git a/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/guild/GuildPolicy2ClearDiamondTask.java b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/guild/GuildPolicy2SettlementTask.java similarity index 65% rename from accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/guild/GuildPolicy2ClearDiamondTask.java rename to accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/guild/GuildPolicy2SettlementTask.java index 994aba14e..87225fe26 100644 --- a/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/guild/GuildPolicy2ClearDiamondTask.java +++ b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/guild/GuildPolicy2SettlementTask.java @@ -8,16 +8,19 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.Date; import java.util.List; +import java.util.concurrent.ThreadPoolExecutor; @Component @Slf4j -public class GuildPolicy2ClearDiamondTask { +public class GuildPolicy2SettlementTask { @Autowired private GuildPolicy2Service guildPolicy2Service; - + @Resource(name = "bizExecutor") + private ThreadPoolExecutor bizExecutor; /** * 公户月结算,用户明细 @@ -38,4 +41,18 @@ public class GuildPolicy2ClearDiamondTask { } } } + + /** + * 公户月结算,用户明细 + * 每月1号凌晨0点0分15秒执行 + */ + @Scheduled(cron = "0 0 0 1 * ?", zone = "Etc/GMT-3") + public void guildPolicy2Settlement() { + List partitionEnumList = List.of(PartitionEnum.TURKEY); + for (PartitionEnum partitionEnum : partitionEnumList) { + bizExecutor.execute(()->{ + guildPolicy2Service.clearGuildCrystal(partitionEnum, DateUtil.offsetMonth(new Date(), -1)); + }); + } + } }