家族-FamilyMemberSerial

This commit is contained in:
2025-09-19 18:18:00 +08:00
parent d88bc50a5a
commit eb01c3250b
13 changed files with 190 additions and 72 deletions

View File

@@ -127,6 +127,7 @@ public class FamilyManageAdminService {
Date now = new Date();
Family family = new Family();
family.setPartitionId(u.getPartitionId());
family.setOwnerUid(u.getUid());
family.setName(u.getNick() + I18NMessageSourceUtil.getMessage(FamilyConstant.DefaultInfo.DEFAULT_NAME_SUFFIX_I18N_ID,
FamilyConstant.DefaultInfo.DEFAULT_NAME_SUFFIX, partitionInfo.getId()));
@@ -146,6 +147,7 @@ public class FamilyManageAdminService {
FamilyMember familyMember = new FamilyMember();
familyMember.setUid(u.getUid());
familyMember.setFamilyId(family.getId());
familyMember.setPartitionId(family.getPartitionId());
familyMember.setRoleType(FamilyConstant.RoleType.OWNER);
familyMember.setCreateTime(now);
familyMember.setUpdateTime(now);
@@ -672,6 +674,7 @@ public class FamilyManageAdminService {
familyMember = new FamilyMember();
familyMember.setUid(u.getUid());
familyMember.setFamilyId(family.getId());
familyMember.setPartitionId(family.getPartitionId());
familyMember.setRoleType(FamilyConstant.RoleType.NORMAL);
familyMember.setCreateTime(new Date());
familyMember.setUpdateTime(new Date());

View File

@@ -11,6 +11,7 @@ public class Family {
@TableId(type= IdType.AUTO)
private Integer id;
private Integer partitionId;
private String name;
private Long ownerUid;
private String avatar;
@@ -38,4 +39,4 @@ public class Family {
* 邀请人证明
*/
private String inviteCheck;
}
}

View File

@@ -12,10 +12,11 @@ public class FamilyMember {
@TableId(type= IdType.AUTO)
private Long id;
private Integer familyId;
private Integer partitionId;
private Long uid;
private Byte roleType;
private Date createTime;
private Date updateTime;
private Boolean enable;
}
}

View File

@@ -0,0 +1,16 @@
package com.accompany.business.model.family;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class FamilyMemberSerial {
private String cycleDate;
private Long familyMemberId;
private Integer familyId;
private Long uid;
private BigDecimal serialValue;
private Date createTime;
private Date updateTime;
}

View File

@@ -5,15 +5,15 @@ import com.accompany.business.event.SuperLuckyGiftDiamondIncomeMessageEvent;
import com.accompany.business.message.GuildMemberIncreaseFlowMessage;
import com.accompany.business.message.SuperLuckyGiftDiamondIncomeMessage;
import com.accompany.business.model.family.FamilyMember;
import com.accompany.business.service.family.FamilyMemberSerialService;
import com.accompany.business.service.family.FamilyMemberService;
import com.accompany.business.service.family.FamilyMemberWeekLevelRewardService;
import com.accompany.business.service.user.UsersService;
import com.accompany.business.util.CycleTimeUtil;
import com.accompany.common.constant.Constant;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.model.PartitionInfo;
import com.accompany.core.model.Users;
import com.accompany.core.service.partition.PartitionInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
@@ -29,13 +29,13 @@ public class FamilyMemberWeekLevelRewardDiamondListener implements ApplicationLi
@Autowired
private UsersService usersService;
@Autowired
private PartitionInfoService partitionInfoService;
@Autowired
private FamilyMemberService familyMemberService;
@Autowired
private FamilyMemberWeekLevelRewardService familyMemberWeekDiamondLevelRewardService;
@Autowired
private ApplicationContext applicationContext;
@Autowired
private FamilyMemberSerialService familyMemberSerialService;
@Async
@Override
@@ -45,10 +45,8 @@ public class FamilyMemberWeekLevelRewardDiamondListener implements ApplicationLi
Users receiver = usersService.getNotNullUsersByUid(receiverUid);
PartitionInfo partitionInfo = partitionInfoService.getById(receiver.getPartitionId());
if (null == receiver.getPartitionId()
|| !Constant.ClanMode.FAMILY.equals(partitionInfo.getClanMode())
|| PartitionEnum.ENGLISH.getId() != receiver.getPartitionId()) {
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(receiver.getPartitionId());
if (!Constant.ClanMode.FAMILY.equals(partitionEnum.getClanMode())){
return;
}
@@ -58,10 +56,14 @@ public class FamilyMemberWeekLevelRewardDiamondListener implements ApplicationLi
}
Date time = message.getCreateTime();
Date zoneTime = DateTimeUtil.withZoneSameInstant(time, partitionInfo.getZoneId());
String monday = DateTimeUtil.convertDate(DateTimeUtil.getMondayDate(zoneTime), DateTimeUtil.DEFAULT_DATE_PATTERN);
Double totalDiamondNum = message.getTotalDiamondNum();
BigDecimal goldNum = BigDecimal.valueOf(totalDiamondNum);
String cycleDate = CycleTimeUtil.getCycleDateByZoneId(time, partitionEnum.getZoneId());
familyMemberSerialService.update(cycleDate, familyMember, goldNum);
Date zoneTime = DateTimeUtil.withZoneSameInstant(time, partitionEnum.getZoneId());
String monday = DateTimeUtil.convertDate(DateTimeUtil.getMondayDate(zoneTime), DateTimeUtil.DEFAULT_DATE_PATTERN);
familyMemberWeekDiamondLevelRewardService.addProcess(familyMember.getId(), receiver.getPartitionId(), monday, totalDiamondNum);
applicationContext.publishEvent(new GuildMemberIncreaseFlowEvent(new GuildMemberIncreaseFlowMessage(receiver.getPartitionId(),

View File

@@ -0,0 +1,24 @@
package com.accompany.business.mybatismapper.family;
import com.accompany.business.model.family.FamilyMemberSerial;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
public interface FamilyMemberSerialMapper extends BaseMapper<FamilyMemberSerial> {
void updateSerial(@Param("cycleDate") String cycleDate,
@Param("familyMemberId") Long familyMemberId,
@Param("familyId") Integer familyId,
@Param("uid") Long uid,
@Param("serialValue") BigDecimal serialValue,
@Param("time") Date time);
BigDecimal getTotalSerialInCycle(@Param("cycleDate") String cycleDate,
@Param("familyId") Integer familyId);
List<FamilyMemberSerial> listMemberTotalSerialInCycle(@Param("cycleDate") String cycleDate,
@Param("familyId") Integer familyId);
}

View File

@@ -1,28 +1,16 @@
package com.accompany.business.service.family;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.event.GuildMemberIncreaseFlowEvent;
import com.accompany.business.message.GuildMemberIncreaseFlowMessage;
import com.accompany.business.model.family.FamilyGiftRecord;
import com.accompany.business.model.family.FamilyMember;
import com.accompany.business.mybatismapper.family.FamilyGiftRecordMapper;
import com.accompany.business.vo.family.FamilyIncomeAdminVo;
import com.accompany.business.vo.family.FamilyMemberAdminVo;
import com.accompany.business.vo.family.FamilyMemberIncomeAdminVo;
import com.accompany.business.vo.family.FamilyUserIncomeItemVo;
import com.accompany.business.vo.guild.GuildDiamondStatisticsDayVo;
import com.accompany.business.vo.guild.GuildInfoVo;
import com.accompany.common.status.BusiStatus;
import com.accompany.core.base.SpringContextHolder;
import com.accompany.core.exception.ServiceException;
import com.accompany.sharding.model.GiftSendRecord;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@@ -35,40 +23,6 @@ import java.util.stream.Collectors;
@Service
public class FamilyGiftRecordService extends ServiceImpl<FamilyGiftRecordMapper, FamilyGiftRecord> {
@Autowired
private FamilyRankService familyRankService;
@Autowired
private ApplicationContext applicationContext;
@Async
public void insertFamilyGiftRecord(GiftSendRecord giftSendRecord) {
if (giftSendRecord == null) {
throw new ServiceException(BusiStatus.HALL_GIFT_SEND_RECORD_NULL);
}
FamilyMember familyMember = SpringContextHolder.getBean(FamilyMemberService.class).getVaildFamilyMemberByUid(giftSendRecord.getReciveUid());
if (null == familyMember) {
return;
}
FamilyGiftRecord familyGiftRecord = new FamilyGiftRecord();
familyGiftRecord.setGiftSendRecordId(giftSendRecord.getSendRecordId());
familyGiftRecord.setCreateTime(giftSendRecord.getCreateTime());
familyGiftRecord.setFamilyId(familyMember.getFamilyId());
familyGiftRecord.setSenderUid(giftSendRecord.getUid());
familyGiftRecord.setReceiverUid(giftSendRecord.getReciveUid());
familyGiftRecord.setTotalGoldNum(giftSendRecord.getTotalGoldNum());
save(familyGiftRecord);
familyRankService.updateRank(familyGiftRecord);
applicationContext.publishEvent(new GuildMemberIncreaseFlowEvent(new GuildMemberIncreaseFlowMessage(giftSendRecord.getPartitionId(),
familyMember.getFamilyId(), familyMember.getUid(),
BigDecimal.valueOf(giftSendRecord.getTotalGoldNum()),
BigDecimal.valueOf(giftSendRecord.getTotalDiamondNum()),
giftSendRecord.getCreateTime())));
}
public List<FamilyUserIncomeItemVo> listTotalGoldGroupByDate(Date startTime, Date endTime, Long uid, Integer familyId) {
return this.baseMapper.listTotalGoldGroupByDate(startTime, endTime, uid, familyId);
}

View File

@@ -0,0 +1,30 @@
package com.accompany.business.service.family;
import com.accompany.business.model.family.FamilyMember;
import com.accompany.business.model.family.FamilyMemberSerial;
import com.accompany.business.mybatismapper.family.FamilyMemberSerialMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Service
public class FamilyMemberSerialService extends ServiceImpl<FamilyMemberSerialMapper, FamilyMemberSerial> {
public void update(String cycleDate, FamilyMember familyMember, BigDecimal serialValue) {
Date now = new Date();
this.baseMapper.updateSerial(cycleDate, familyMember.getId(),
familyMember.getFamilyId(), familyMember.getUid(),
serialValue, now);
}
public BigDecimal getTotalSerialInCycle(String cycleDate, Integer familyId) {
BigDecimal totalSerial = this.baseMapper.getTotalSerialInCycle(cycleDate, familyId);
return null != totalSerial ? totalSerial : BigDecimal.ZERO;
}
public List<FamilyMemberSerial> listMemberSerialInCycle(String cycleDate, Integer familyId) {
return this.baseMapper.listMemberTotalSerialInCycle(cycleDate, familyId);
}
}

View File

@@ -65,6 +65,7 @@ public class FamilyRankService {
.collect(Collectors.toList());
}
@Async
public void updateRank(Integer familyId, Long uid, Long totalGoldNum, Integer partitionId){
RScoredSortedSet<Integer> weekRank = getWeekRank(partitionId);
weekRank.addScore(familyId, totalGoldNum);
@@ -73,24 +74,13 @@ public class FamilyRankService {
RScoredSortedSet<Integer> monthRank = getMonthRank(partitionId, RankConstant.PeriodType.nowadays);
monthRank.addScore(familyId, totalGoldNum);
monthRank.expire(60, TimeUnit.DAYS);
RScoredSortedSet<Long> monthMemberRank = getMonthMemberRank(familyId, partitionId, RankConstant.PeriodType.nowadays);
monthMemberRank.addScore(uid, totalGoldNum);
monthMemberRank.expire(60, TimeUnit.DAYS);
}
@Async
public void updateRank(FamilyGiftRecord familyGiftRecord) {
if (null == familyGiftRecord.getTotalGoldNum()
|| 0L >= familyGiftRecord.getTotalGoldNum()){
return;
}
Users u = usersService.getNotNullUsersByUid(familyGiftRecord.getReceiverUid());
updateRank(familyGiftRecord.getFamilyId(), familyGiftRecord.getReceiverUid(), familyGiftRecord.getTotalGoldNum(), u.getPartitionId());
log.info("[familyRank] addScore success, familyId {} totalGoldNum {} uid {} partitionId {}",
familyGiftRecord.getFamilyId(), familyGiftRecord.getTotalGoldNum(), u.getUid(), u.getPartitionId());
familyId, totalGoldNum, uid, partitionId);
}
public Map<Integer, Double> getWeekRankScoreMap(Integer partitionId){

View File

@@ -257,6 +257,7 @@ public class FamilyRelationService {
familyMember = new FamilyMember();
familyMember.setUid(targetUid);
familyMember.setFamilyId(family.getId());
familyMember.setPartitionId(family.getPartitionId());
familyMember.setRoleType(FamilyConstant.RoleType.NORMAL);
familyMember.setCreateTime(new Date());
familyMember.setUpdateTime(new Date());

View File

@@ -0,0 +1,60 @@
package com.accompany.business.service.family;
import com.accompany.business.event.GuildMemberIncreaseFlowEvent;
import com.accompany.business.message.GuildMemberIncreaseFlowMessage;
import com.accompany.business.model.family.FamilyMember;
import com.accompany.business.util.CycleTimeUtil;
import com.accompany.common.status.BusiStatus;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.ServiceException;
import com.accompany.sharding.model.GiftSendRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@Service
public class FamilySerialRecordService {
@Autowired
private FamilyMemberService familyMemberService;
@Autowired
private FamilyRankService familyRankService;
@Autowired
private ApplicationContext applicationContext;
@Autowired
private FamilyMemberSerialService familyMemberSerialService;
@Async
public void update(GiftSendRecord giftSendRecord) {
if (giftSendRecord == null) {
throw new ServiceException(BusiStatus.HALL_GIFT_SEND_RECORD_NULL);
}
if (null == giftSendRecord.getTotalGoldNum() || giftSendRecord.getTotalGoldNum() <= 0){
return;
}
FamilyMember familyMember = familyMemberService.getVaildFamilyMemberByUid(giftSendRecord.getReciveUid());
if (null == familyMember) {
return;
}
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(familyMember.getPartitionId());
String cycleDate = CycleTimeUtil.getCurCycleDateByZoneId(partitionEnum.getZoneId());
BigDecimal goldNum = BigDecimal.valueOf(giftSendRecord.getTotalGoldNum());
familyMemberSerialService.update(cycleDate, familyMember, goldNum);
familyRankService.updateRank(familyMember.getFamilyId(), giftSendRecord.getUid(), giftSendRecord.getTotalGoldNum(), giftSendRecord.getPartitionId());
applicationContext.publishEvent(new GuildMemberIncreaseFlowEvent(new GuildMemberIncreaseFlowMessage(giftSendRecord.getPartitionId(),
familyMember.getFamilyId(), familyMember.getUid(),
BigDecimal.valueOf(giftSendRecord.getTotalGoldNum()),
BigDecimal.valueOf(giftSendRecord.getTotalDiamondNum()),
giftSendRecord.getCreateTime())));
}
}

View File

@@ -13,6 +13,7 @@ import com.accompany.business.service.clan.ClanAccountAssociateService;
import com.accompany.business.service.clan.ClanAssociateTransferRecordService;
import com.accompany.business.service.clan.ClanService;
import com.accompany.business.service.family.FamilyGiftRecordService;
import com.accompany.business.service.family.FamilySerialRecordService;
import com.accompany.business.service.guild.GuildGiftRecordService;
import com.accompany.business.service.hall.HallGiftRecordService;
import com.accompany.business.service.hall.HallRoomGiftRecordService;
@@ -73,6 +74,8 @@ public class GiftEarnAllotService {
private GuildGiftRecordService guildGiftRecordService;
@Autowired
private ApplicationContext applicationContext;
@Autowired
private FamilySerialRecordService familySerialRecordService;
public Double allotGiftEarn(GiftSendRecord record, String objId, BillObjTypeEnum inEnum) {
long uid = record.getReciveUid();
@@ -143,7 +146,7 @@ public class GiftEarnAllotService {
Double amount = golds.multiply(rate).doubleValue();
record.setTotalDiamondNum(amount);
familyGiftRecordService.insertFamilyGiftRecord(record);
familySerialRecordService.update(record);
if (Double.compare(amount, 0d) <= 0){
return;

View File

@@ -0,0 +1,33 @@
<?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.family.FamilyMemberSerialMapper">
<update id="updateSerial">
INSERT INTO family_member_serial (cycle_date, family_member_id, family_id, uid, serial_value, create_time, update_time)
VALUES (#{cycleDate}, #{familyMemberId}, #{familyId}, #{uid}, #{serialValue}, #{time}, #{time})
ON DUPLICATE KEY UPDATE
serial_value = serial_value + #{serialValue},
update_time = #{time}
</update>
<select id="getTotalSerialInCycle" resultType="java.math.BigDecimal">
SELECT SUM(serial_value)
FROM family_member_serial
WHERE cycle_date = #{cycleDate} AND family_id = #{familyId}
</select>
<select id="listMemberTotalSerialInCycle" resultType="com.accompany.business.model.family.FamilyMemberSerial">
SELECT
cycle_date as cycleDate,
family_member_id as familyMemberId,
family_id as familyId,
uid,
SUM(serial_value) as serialValue,
MIN(create_time) as createTime,
MAX(update_time) as updateTime
FROM family_member_serial
WHERE cycle_date = #{cycleDate} AND family_id = #{familyId}
GROUP BY cycle_date, family_member_id, family_id, uid
</select>
</mapper>