From 112bf13c95c8bd7b2deaf3cc578091ec0b8fcf64 Mon Sep 17 00:00:00 2001 From: hy001 Date: Fri, 15 May 2026 20:41:24 +0800 Subject: [PATCH] feat: sync badge resource config --- .../impl/PropsSourceClientServiceImpl.java | 226 +++++++++++++----- 1 file changed, 164 insertions(+), 62 deletions(-) diff --git a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/material/props/impl/PropsSourceClientServiceImpl.java b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/material/props/impl/PropsSourceClientServiceImpl.java index 4e4a916d..daa3a94f 100644 --- a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/material/props/impl/PropsSourceClientServiceImpl.java +++ b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/material/props/impl/PropsSourceClientServiceImpl.java @@ -1,39 +1,44 @@ package com.red.circle.other.app.inner.service.material.props.impl; -import com.alibaba.fastjson.JSON; -import com.red.circle.component.redis.service.RedisService; -import com.red.circle.framework.dto.PageResult; -import com.red.circle.other.app.inner.convertor.material.PropsResourcesInnerConvertor; -import com.red.circle.other.app.inner.service.material.props.PropsBackpackClientService; -import com.red.circle.other.app.inner.service.material.props.PropsSourceClientService; -import com.red.circle.other.infra.common.props.PropsResourcesCommon; -import com.red.circle.other.infra.database.cache.key.AdminFreeKeys; -import com.red.circle.other.infra.database.cache.key.GameListKeys; -import com.red.circle.other.infra.database.rds.entity.family.FamilyLevelConfig; -import com.red.circle.other.infra.database.rds.entity.props.PropsRedPacketSkin; -import com.red.circle.other.infra.database.rds.entity.props.PropsSourceRecord; -import com.red.circle.other.infra.database.rds.service.family.FamilyLevelConfigService; -import com.red.circle.other.infra.database.rds.service.props.PropsRedPacketSkinService; -import com.red.circle.other.infra.database.rds.service.props.PropsSourceRecordService; -import com.red.circle.other.infra.utils.RedisUtils; -import com.red.circle.other.inner.enums.material.ConsolePropsTypeEnum; -import com.red.circle.other.inner.enums.material.PropsTypeEnum; -import com.red.circle.other.inner.model.cmd.material.PropsResourcesMergeCmd; -import com.red.circle.other.inner.model.cmd.material.PropsSourceRecordQryCmd; -import com.red.circle.other.inner.model.dto.material.PropsRedPacketSkinDTO; -import com.red.circle.other.inner.model.dto.material.PropsResourcesDTO; -import com.red.circle.other.inner.model.dto.material.PropsResourcesMergeDTO; -import com.red.circle.tool.core.collection.CollectionUtils; -import com.red.circle.tool.core.text.StringUtils; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.red.circle.component.redis.service.RedisService; +import com.red.circle.framework.dto.PageResult; +import com.red.circle.other.app.inner.convertor.material.PropsResourcesInnerConvertor; +import com.red.circle.other.app.inner.service.material.props.PropsSourceClientService; +import com.red.circle.other.infra.common.props.PropsResourcesCommon; +import com.red.circle.other.infra.database.cache.key.AdminFreeKeys; +import com.red.circle.other.infra.database.rds.entity.badge.BadgeConfig; +import com.red.circle.other.infra.database.rds.entity.badge.BadgePictureConfig; +import com.red.circle.other.infra.database.rds.entity.family.FamilyLevelConfig; +import com.red.circle.other.infra.database.rds.entity.props.PropsRedPacketSkin; +import com.red.circle.other.infra.database.rds.entity.props.PropsSourceRecord; +import com.red.circle.other.infra.database.rds.service.badge.BadgeConfigService; +import com.red.circle.other.infra.database.rds.service.badge.BadgePictureConfigService; +import com.red.circle.other.infra.database.rds.service.family.FamilyLevelConfigService; +import com.red.circle.other.infra.database.rds.service.props.PropsRedPacketSkinService; +import com.red.circle.other.infra.database.rds.service.props.PropsSourceRecordService; +import com.red.circle.other.infra.utils.RedisUtils; +import com.red.circle.other.inner.enums.material.ConsolePropsTypeEnum; +import com.red.circle.other.inner.enums.material.PropsTypeEnum; +import com.red.circle.other.inner.enums.sys.SysBadgeConfigTypeEnum; +import com.red.circle.other.inner.model.cmd.material.PropsResourcesMergeCmd; +import com.red.circle.other.inner.model.cmd.material.PropsSourceRecordQryCmd; +import com.red.circle.other.inner.model.dto.material.PropsRedPacketSkinDTO; +import com.red.circle.other.inner.model.dto.material.PropsResourcesDTO; +import com.red.circle.other.inner.model.dto.material.PropsResourcesMergeDTO; +import com.red.circle.tool.core.collection.CollectionUtils; +import com.red.circle.tool.core.text.StringUtils; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * 道具资源. @@ -42,16 +47,21 @@ import org.springframework.stereotype.Service; */ @Service @RequiredArgsConstructor -public class PropsSourceClientServiceImpl implements PropsSourceClientService { - - private final PropsResourcesCommon propsResourcesCommon; - private final FamilyLevelConfigService familyLevelConfigService; - private final PropsSourceRecordService propsSourceRecordService; - private final PropsRedPacketSkinService propsRedPacketSkinService; - private final RedisService redisService; - @Autowired - @Qualifier("propsResourcesInnerConvertorImplNew") - private PropsResourcesInnerConvertor propsResourcesInnerConvertor; +public class PropsSourceClientServiceImpl implements PropsSourceClientService { + + private static final String BADGE_TYPE = PropsTypeEnum.BADGE.name(); + private static final String DEFAULT_BADGE_SOURCE_TYPE = SysBadgeConfigTypeEnum.ACTIVITY.getName(); + + private final PropsResourcesCommon propsResourcesCommon; + private final FamilyLevelConfigService familyLevelConfigService; + private final PropsSourceRecordService propsSourceRecordService; + private final PropsRedPacketSkinService propsRedPacketSkinService; + private final BadgeConfigService badgeConfigService; + private final BadgePictureConfigService badgePictureConfigService; + private final RedisService redisService; + @Autowired + @Qualifier("propsResourcesInnerConvertorImplNew") + private PropsResourcesInnerConvertor propsResourcesInnerConvertor; @Override public PropsResourcesDTO getById(Long id) { @@ -95,10 +105,18 @@ public class PropsSourceClientServiceImpl implements PropsSourceClientService { return props; } - @Override - public void offShelfPropsResources(Long id, Boolean offShelf) { - propsSourceRecordService.offShelf(id, offShelf); - } + @Override + @Transactional(rollbackFor = Exception.class) + public void offShelfPropsResources(Long id, Boolean offShelf) { + PropsSourceRecord sourceRecord = propsSourceRecordService.getById(id); + propsSourceRecordService.offShelf(id, offShelf); + if (Objects.nonNull(sourceRecord) && Objects.equals(BADGE_TYPE, sourceRecord.getType())) { + badgeConfigService.update() + .set(BadgeConfig::getDel, Boolean.TRUE.equals(offShelf)) + .eq(BadgeConfig::getId, id) + .execute(); + } + } @Override public PageResult pagePropsResourcesOps(PropsSourceRecordQryCmd qryCmd) { @@ -118,13 +136,18 @@ public class PropsSourceClientServiceImpl implements PropsSourceClientService { ); } - @Override - public void addOrUpdatePropsResources(PropsResourcesDTO dto) { - PropsSourceRecord propsSourceRecord = propsResourcesInnerConvertor.toPropsSourceRecord(dto); - if (Objects.isNull(dto.getId())) { - propsSourceRecordService.save(propsSourceRecord); - if (Objects.equals(PropsTypeEnum.RED_PACKET.name(), propsSourceRecord.getType())) { - propsRedPacketSkinService.save(new PropsRedPacketSkin().setId(propsSourceRecord.getId()) + @Override + @Transactional(rollbackFor = Exception.class) + public void addOrUpdatePropsResources(PropsResourcesDTO dto) { + PropsSourceRecord propsSourceRecord = propsResourcesInnerConvertor.toPropsSourceRecord(dto); + PropsSourceRecord beforeUpdate = Objects.nonNull(dto.getId()) + ? propsSourceRecordService.getById(dto.getId()) + : null; + if (Objects.isNull(dto.getId())) { + propsSourceRecordService.save(propsSourceRecord); + syncBadgeConfig(dto, propsSourceRecord); + if (Objects.equals(PropsTypeEnum.RED_PACKET.name(), propsSourceRecord.getType())) { + propsRedPacketSkinService.save(new PropsRedPacketSkin().setId(propsSourceRecord.getId()) .setImNotOpenedUrl(dto.getImNotOpenedUrl()) .setImOpenedUrl(dto.getImOpenedUrl()) .setImSendCoverUrl(dto.getImSendCoverUrl()) @@ -133,12 +156,20 @@ public class PropsSourceClientServiceImpl implements PropsSourceClientService { .setRoomOpenedUrl(dto.getRoomOpenedUrl()) .setImOpenedUrlTwo(dto.getImOpenedUrlTwo()) .setSysOrigin(dto.getSysOrigin())); - } - return; - } - propsSourceRecordService.updateSelectiveById(propsSourceRecord); - - if (Objects.equals(PropsTypeEnum.RED_PACKET.name(), propsSourceRecord.getType())) { + } + return; + } + propsSourceRecordService.updateSelectiveById(propsSourceRecord); + if (Objects.nonNull(beforeUpdate) && Objects.equals(BADGE_TYPE, beforeUpdate.getType()) + && !Objects.equals(BADGE_TYPE, propsSourceRecord.getType())) { + badgeConfigService.update() + .set(BadgeConfig::getDel, Boolean.TRUE) + .eq(BadgeConfig::getId, propsSourceRecord.getId()) + .execute(); + } + syncBadgeConfig(dto, propsSourceRecord); + + if (Objects.equals(PropsTypeEnum.RED_PACKET.name(), propsSourceRecord.getType())) { propsRedPacketSkinService.updateSelectiveById( new PropsRedPacketSkin().setId(propsSourceRecord.getId()) @@ -150,8 +181,79 @@ public class PropsSourceClientServiceImpl implements PropsSourceClientService { .setRoomOpenedUrl(dto.getRoomOpenedUrl()) .setImOpenedUrlTwo(dto.getImOpenedUrlTwo()) .setSysOrigin(dto.getSysOrigin())); - } - } + } + } + + private void syncBadgeConfig(PropsResourcesDTO dto, PropsSourceRecord propsSourceRecord) { + if (!Objects.equals(BADGE_TYPE, propsSourceRecord.getType())) { + return; + } + Long badgeId = propsSourceRecord.getId(); + if (Objects.isNull(badgeId)) { + return; + } + JSONObject expand = parseExpand(dto.getExpand()); + String badgeSourceType = normalizeBadgeSourceType(expand.getString("badgeType")); + Integer badgeLevel = expand.getInteger("badgeLevel"); + Long milestone = expand.getLong("milestone"); + String badgeKey = StringUtils.isNotBlank(expand.getString("badgeKey")) + ? expand.getString("badgeKey") + : propsSourceRecord.getCode(); + + BadgeConfig badgeConfig = new BadgeConfig() + .setId(badgeId) + .setType(badgeSourceType) + .setBadgeLevel(Objects.nonNull(badgeLevel) ? badgeLevel : 0) + .setMilestone(milestone) + .setBadgeName(propsSourceRecord.getName()) + .setBadgeKey(badgeKey) + .setDel(Boolean.TRUE.equals(propsSourceRecord.getDel())); + if (Objects.isNull(badgeConfigService.getById(badgeId))) { + badgeConfigService.save(badgeConfig); + } else { + badgeConfigService.updateSelectiveById(badgeConfig); + } + + BadgePictureConfig pictureConfig = badgePictureConfigService + .getByConfigIdBySysOrigin(badgeId, propsSourceRecord.getSysOrigin()); + String notSelectUrl = expand.getString("notSelectUrl"); + if (Objects.isNull(pictureConfig)) { + badgePictureConfigService.save(new BadgePictureConfig() + .setBadgeConfigId(badgeId) + .setSysOrigin(propsSourceRecord.getSysOrigin()) + .setSelectUrl(propsSourceRecord.getCover()) + .setNotSelectUrl(notSelectUrl) + .setAnimationUrl(propsSourceRecord.getSourceUrl())); + return; + } + pictureConfig.setSelectUrl(propsSourceRecord.getCover()); + pictureConfig.setNotSelectUrl(notSelectUrl); + pictureConfig.setAnimationUrl(propsSourceRecord.getSourceUrl()); + badgePictureConfigService.updateSelectiveById(pictureConfig); + } + + private JSONObject parseExpand(String expand) { + if (StringUtils.isBlank(expand)) { + return new JSONObject(); + } + try { + return JSON.parseObject(expand); + } catch (Exception ex) { + return new JSONObject(); + } + } + + private String normalizeBadgeSourceType(String badgeType) { + if (StringUtils.isBlank(badgeType)) { + return DEFAULT_BADGE_SOURCE_TYPE; + } + for (SysBadgeConfigTypeEnum value : SysBadgeConfigTypeEnum.values()) { + if (Objects.equals(value.getName(), badgeType)) { + return badgeType; + } + } + return DEFAULT_BADGE_SOURCE_TYPE; + } @Override public PropsRedPacketSkinDTO getPropsRedPacketSkin(Long id) {