家族-定时任务-钻石每日余额

This commit is contained in:
khalil
2024-05-21 21:54:10 +08:00
parent 351cb2de93
commit c680e8da7c
15 changed files with 179 additions and 241 deletions

View File

@@ -2,7 +2,16 @@ package com.accompany.sharding.mapper;
import com.accompany.sharding.model.FamilyMemberRoomMicRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
public interface FamilyMemberRoomMicRecordMapper extends BaseMapper<FamilyMemberRoomMicRecord> {
List<FamilyMemberRoomMicRecord> listTotalRemainTimeByFamilyMember(@Param("upTime") Date upTime,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime,
@Param("downTime") Date downTime);
}

View File

@@ -2,4 +2,16 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.accompany.sharding.mapper.FamilyMemberRoomMicRecordMapper">
<select id="listTotalRemainTimeByFamilyMember"
resultType="com.accompany.sharding.model.FamilyMemberRoomMicRecord">
select uid, family_id,
sum((case when up_time &lt; #{startTime} then TIMESTAMPDIFF(SECOND, #{startTime}, down_time)
when down_time &gt; #{endTime} then TIMESTAMPDIFF(SECOND, up_time, #{endTime})
else remain_time / 1000 end)) remain_time
from family_member_room_mic_record r
where r.up_time between #{upTime} and #{endTime}
and r.down_time between #{startTime} and #{downTime}
group by uid, family_id
</select>
</mapper>

View File

@@ -11,6 +11,7 @@ public class FamilyGiftRecord {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer familyId;
private Long senderUid;
private Long receiverUid;
private Long giftSendRecordId;
private Long totalGoldNum;

View File

@@ -7,7 +7,7 @@ import lombok.Data;
import java.util.Date;
@Data
public class FamilyMemberSettlementRecord {
public class FamilyMemberGoldRemainDayRecord {
@TableId(type = IdType.AUTO)
private Long id;
@@ -15,9 +15,6 @@ public class FamilyMemberSettlementRecord {
private Integer familyId;
private Long uid;
private Date createTime;
private Long micRemainSecond;
private Long goldIncome;
private Long diamondRemain;
private Integer sendGiftUserNum;
private Double goldRemain;
}

View File

@@ -2,8 +2,13 @@ package com.accompany.business.mybatismapper.family;
import com.accompany.business.model.family.FamilyGiftRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
public interface FamilyGiftRecordMapper extends BaseMapper<FamilyGiftRecord> {
List<FamilyGiftRecord> listTotalGoldGroupByFamilyMember(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
}

View File

@@ -0,0 +1,8 @@
package com.accompany.business.mybatismapper.family;
import com.accompany.business.model.family.FamilyMemberGoldRemainDayRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface FamilyMemberGoldRemainDayRecordMapper extends BaseMapper<FamilyMemberGoldRemainDayRecord> {
}

View File

@@ -1,8 +0,0 @@
package com.accompany.business.mybatismapper.family;
import com.accompany.business.model.family.FamilyMemberSettlementRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface FamilyMemberSettlementRecordMapper extends BaseMapper<FamilyMemberSettlementRecord> {
}

View File

@@ -11,6 +11,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Service
public class FamilyGiftRecordService extends ServiceImpl<FamilyGiftRecordMapper, FamilyGiftRecord> {
@@ -29,9 +32,14 @@ public class FamilyGiftRecordService extends ServiceImpl<FamilyGiftRecordMapper,
familyGiftRecord.setGiftSendRecordId(giftSendRecord.getSendRecordId());
familyGiftRecord.setCreateTime(giftSendRecord.getCreateTime());
familyGiftRecord.setFamilyId(familyMember.getFamilyId());
familyGiftRecord.setReceiverUid(familyGiftRecord.getReceiverUid());
familyGiftRecord.setTotalGoldNum(familyGiftRecord.getTotalGoldNum());
familyGiftRecord.setSenderUid(giftSendRecord.getUid());
familyGiftRecord.setReceiverUid(giftSendRecord.getReciveUid());
familyGiftRecord.setTotalGoldNum(giftSendRecord.getTotalGoldNum());
save(familyGiftRecord);
}
public List<FamilyGiftRecord> listTotalGoldGroupByFamilyMember(Date startTime, Date endTime) {
return this.baseMapper.listTotalGoldGroupByFamilyMember(startTime, endTime);
}
}

View File

@@ -0,0 +1,89 @@
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.FamilyMemberGoldRemainDayRecord;
import com.accompany.business.mybatismapper.family.FamilyMemberGoldRemainDayRecordMapper;
import com.accompany.business.service.purse.UserPurseService;
import com.accompany.common.utils.DateTimeUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
public class FamilyMemberGoldRemainDayRecordService extends ServiceImpl<FamilyMemberGoldRemainDayRecordMapper, FamilyMemberGoldRemainDayRecord> {
@Autowired
private FamilyMemberService familyMemberService;
@Autowired
private UserPurseService userPurseService;
@Autowired
private SqlSessionFactory sqlSessionFactory;
public void dayStatistic(Date date) {
if (date == null){
date = DateTimeUtil.addDays(new Date(), -1);
}
String dateStr = DateTimeUtil.convertDate(date, DateTimeUtil.DEFAULT_DATE_PATTERN);
Date dateStart = DateTimeUtil.getBeginTimeOfDay(date);
Date dateEnd = DateTimeUtil.getEndTimeOfDay(date);
Map<Long, Double> uidGoldNumMap = new HashMap<>();
List<FamilyMember> memberList = familyMemberService.listValidFamilyMemberByTime(dateStart, dateEnd);
if (CollectionUtils.isEmpty(memberList)){
log.info("[公会金币每日余额统计] memberList为空");
return;
}
List<Long> uidList = memberList.stream().map(FamilyMember::getUid).distinct().collect(Collectors.toList());
List<UserPurse> userPurseList = userPurseService.lambdaQuery().in(UserPurse::getUid, uidList).list();
for (UserPurse userPurse: userPurseList){
uidGoldNumMap.put(userPurse.getUid(), userPurse.getGolds());
}
Date now = new Date();
int batchSize = 100;
SqlSession batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
FamilyMemberGoldRemainDayRecordMapper recordMapper = batchSqlSession.getMapper(FamilyMemberGoldRemainDayRecordMapper.class);
try {
int memberIndex = 0;
for (FamilyMember member: memberList){
Double goldRemain = Boolean.TRUE.equals(member.getEnable())? uidGoldNumMap.getOrDefault(member.getUid(), 0d): 0d;
//结算记录
FamilyMemberGoldRemainDayRecord dayRecord = new FamilyMemberGoldRemainDayRecord();
dayRecord.setUid(member.getUid());
dayRecord.setFamilyId(member.getFamilyId());
dayRecord.setGoldRemain(goldRemain);
dayRecord.setDate(dateStr);
dayRecord.setCreateTime(now);
recordMapper.insert(dayRecord);
if (memberIndex > 0 && memberIndex % batchSize == 0){
batchSqlSession.commit();
}
memberIndex ++;
}
batchSqlSession.commit();
} catch (Exception e){
batchSqlSession.rollback();
log.error("[公会金币每日余额统计] 插入记录发生异常回滚", e);
} finally {
batchSqlSession.close();
}
}
}

View File

@@ -1,11 +0,0 @@
package com.accompany.business.service.family;
import com.accompany.business.model.family.FamilyMemberSettlementRecord;
import com.accompany.business.mybatismapper.family.FamilyMemberSettlementRecordMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class FamilyMemberSettlementDayRecordService extends ServiceImpl<FamilyMemberSettlementRecordMapper, FamilyMemberSettlementRecord> {
}

View File

@@ -1,214 +0,0 @@
package com.accompany.business.service.family;
import com.accompany.business.model.HallGiftRecord;
import com.accompany.business.model.HallGoldExchangeRecord;
import com.accompany.business.model.HallMember;
import com.accompany.business.model.clan.ClanGoldDayFlowRecord;
import com.accompany.business.model.family.FamilyMember;
import com.accompany.business.mybatismapper.clan.ClanGoldDayFlowRecordMapper;
import com.accompany.business.service.purse.UserPurseService;
import com.accompany.business.service.room.FamilyMemberRoomMicRecordService;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.enumeration.BillObjTypeEnum;
import com.accompany.sharding.model.BillRecord;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
public class FamilyMemberSettlementService {
@Autowired
private FamilyMemberService familyMemberService;
@Autowired
private FamilyGiftRecordService familyGiftRecordService;
@Autowired
private FamilyMemberRoomMicRecordService familyMemberRoomMicRecordService;
@Autowired
private UserPurseService userPurseService;
/*public void statistic(Date date) throws InterruptedException {
if (date == null){
date = new Date();
}
String dateStr = DateTimeUtil.convertDate(date, DateTimeUtil.DEFAULT_DATE_PATTERN);
Date dateStart = DateTimeUtil.getBeginTimeOfDay(date);
Date dateEnd = DateTimeUtil.getEndTimeOfDay(date);
Date dateEndLater = DateTimeUtil.getNextMinute(dateEnd, 1);
Map<String, Double> uidGiftDiamondMap = new HashMap<>();
Map<String, Double> uidGiftGoldMap = new HashMap<>();
Map<String, Double> uidEarnGoldMap = new HashMap<>();
List<FamilyMember> memberList = familyMemberService.listValidFamilyMemberByTime(dateStart, dateEnd);
if (CollectionUtils.isEmpty(memberList)){
}
QueryWrapper<HallGiftRecord> queryWrapper = Wrappers.query();
queryWrapper.lambda().between(HallGiftRecord::getCreateTime, dateStart, dateEnd)
.isNotNull(HallGiftRecord::getClanId);
List<HallGiftRecord> hallGiftRecordList = hallGiftRecordService.list(queryWrapper);
if (!CollectionUtils.isEmpty(hallGiftRecordList)){
List<Long> giftSendRecordIds = hallGiftRecordList.stream().map(HallGiftRecord::getGiftSendRecordId).collect(Collectors.toList());
Map<Long, Double> giftDiamondsMap = hallGiftRecordList.stream()
.collect(Collectors.toMap(HallGiftRecord::getGiftSendRecordId, gsr->gsr.getTotalGoldNum().doubleValue()));
List<BillRecord> giftGoldsList = billRecordService.listBillRecordByGiftRecrod(dateStart, dateEndLater, giftSendRecordIds);
Map<Long, Double> giftGoldsMap = giftGoldsList.stream()
.filter(br->br.getObjType().equals(BillObjTypeEnum.GIFT_PERSON_INCOME.getValue())||br.getObjType().equals(BillObjTypeEnum.GIFT_ROOM_INCOME.getValue()))
.collect(Collectors.toMap(br->Long.parseLong(br.getObjId()), br-> br.getAmount().doubleValue()));
Map<Long, BillRecord> earnGoldsMap = giftGoldsList.stream()
.filter(br->br.getObjType().equals(BillObjTypeEnum.ROOM_PERCENTAGE_INCOME.getValue()))
.collect(Collectors.toMap(br->Long.parseLong(br.getObjId()), br-> br));
for (HallGiftRecord record: hallGiftRecordList){
long giftSendRecordId = record.getGiftSendRecordId();
Double giftDiamonds = giftDiamondsMap.get(giftSendRecordId);
if (null != giftDiamonds){
String uid = String.format("%d_%d_%d", record.getClanId(), record.getHallId(), record.getReciveUid());
uidGiftDiamondMap.put(uid, DoubleUtil.add(giftDiamonds, uidGiftDiamondMap.getOrDefault(uid, 0d)));
//签约流水
if (null != record.getRoomUid() && record.getClanId().equals(record.getRoomClanId())
&& (null == record.getHallId() || record.getHallId().equals(record.getRoomHallId()))){
uidHallDiamondMap.put(uid, DoubleUtil.add(giftDiamonds, uidHallDiamondMap.getOrDefault(uid, 0d)));
} else if (null != record.getRoomUid() && record.getClanId().equals(record.getRoomClanId())) {
uidClanDiamondMap.put(uid, DoubleUtil.add(giftDiamonds, uidClanDiamondMap.getOrDefault(uid, 0d)));
} else {
uidOtherDiamondMap.put(uid, DoubleUtil.add(giftDiamonds, uidOtherDiamondMap.getOrDefault(uid, 0d)));
}
}
Double giftGolds = giftGoldsMap.get(giftSendRecordId);
if (null != giftGolds){
String uid = String.format("%d_%d_%d", record.getClanId(), record.getHallId(), record.getReciveUid());
uidGiftGoldMap.put(uid, DoubleUtil.add(giftGolds, uidGiftGoldMap.getOrDefault(uid, 0d)));
}
BillRecord earnGoldsBillRecord = earnGoldsMap.get(giftSendRecordId);
if (null != earnGoldsBillRecord){
String clanElderUid = String.format("%d_%d", record.getClanId(), earnGoldsBillRecord.getUid());
uidEarnGoldMap.put(clanElderUid, DoubleUtil.add(earnGoldsBillRecord.getAmount().doubleValue(), uidEarnGoldMap.getOrDefault(clanElderUid, 0d)));
}
}
}
Map<String, Double> uidExchangeMap = new HashMap<>();
List<HallGoldExchangeRecord> hallGoldExchangeRecordList = hallGoldExchangeService.listByTime(dateStart, dateEnd);
if (!CollectionUtils.isEmpty(hallGoldExchangeRecordList)){
for (HallGoldExchangeRecord record: hallGoldExchangeRecordList){
String uid = String.format("%d_%d_%d", record.getClanId(), record.getHallId(), record.getUid());
uidExchangeMap.put(uid, DoubleUtil.add(record.getGolds(), uidExchangeMap.getOrDefault(uid, 0d)));
}
}
Set<String> uids = new HashSet<>();
uids.addAll(uidGiftDiamondMap.keySet());
uids.addAll(uidGiftGoldMap.keySet());
uids.addAll(uidExchangeMap.keySet());
Date now = new Date();
int batchSize = 100;
SqlSession batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
ClanGoldDayFlowRecordMapper clanGoldDayFlowRecordMapper = batchSqlSession.getMapper(ClanGoldDayFlowRecordMapper.class);
try {
int memberIndex = 0;
for (String uidStr: uids){
String[] uidArray = uidStr.split("_");
Long clanId = Long.parseLong(uidArray[0]);
Long hallId = !"null".equals(uidArray[1])? Long.parseLong(uidArray[1]): null;
Long uid = Long.parseLong(uidArray[2]);
Double giftDiamonds = uidGiftDiamondMap.getOrDefault(uidStr, 0d);
Double hallDiamonds = uidHallDiamondMap.getOrDefault(uidStr, 0d);
Double clanDiamonds = uidClanDiamondMap.getOrDefault(uidStr, 0d);
Double otherDiamonds = uidOtherDiamondMap.getOrDefault(uidStr, 0d);
Double giftGolds = uidGiftGoldMap.getOrDefault(uidStr, 0d);
String clanUidStr = String.format("%d_%d", clanId, uid);
Double earnGolds = Optional.ofNullable(uidEarnGoldMap.remove(clanUidStr)).orElse(0d);
Double exchangeGolds = uidExchangeMap.getOrDefault(uidStr, 0d);
Double remainGolds = DoubleUtil.sub(DoubleUtil.add(giftGolds, earnGolds),exchangeGolds);
//结算记录
ClanGoldDayFlowRecord dayFlowRecord = new ClanGoldDayFlowRecord();
dayFlowRecord.setClanId(clanId);
dayFlowRecord.setHallId(hallId);
dayFlowRecord.setUid(uid);
dayFlowRecord.setGiftDiamonds(giftDiamonds);
dayFlowRecord.setHallDiamonds(hallDiamonds);
dayFlowRecord.setClanDiamonds(clanDiamonds);
dayFlowRecord.setOtherDiamonds(otherDiamonds);
dayFlowRecord.setGiftGolds(giftGolds);
dayFlowRecord.setEarnGolds(earnGolds);
dayFlowRecord.setExchangeGolds(exchangeGolds);
dayFlowRecord.setRemainGolds(remainGolds);
dayFlowRecord.setDate(dateStr);
dayFlowRecord.setCreateTime(now);
clanGoldDayFlowRecordMapper.insert(dayFlowRecord);
if (memberIndex > 0 && memberIndex % batchSize == 0){
batchSqlSession.commit();
}
memberIndex ++;
}
//有会长产生流水分成,但自己在周期内没有收礼和兑换,需要手动添加
if (!uidEarnGoldMap.isEmpty()){
for (Map.Entry<String, Double> clanEarn : uidEarnGoldMap.entrySet()){
String clanUidStr = clanEarn.getKey();
Double earnGolds = clanEarn.getValue();
String[] uidArray = clanUidStr.split("_");
Long clanId = Long.parseLong(uidArray[0]);
Long uid = Long.parseLong(uidArray[1]);
HallMember hallMember = hallService.getHallMember(uid);
Long hallId = null != hallMember? hallMember.getHallId(): null;
//结算记录
ClanGoldDayFlowRecord dayFlowRecord = new ClanGoldDayFlowRecord();
dayFlowRecord.setClanId(clanId);
dayFlowRecord.setHallId(hallId);
dayFlowRecord.setUid(uid);
dayFlowRecord.setGiftDiamonds(0d);
dayFlowRecord.setHallDiamonds(0d);
dayFlowRecord.setClanDiamonds(0d);
dayFlowRecord.setOtherDiamonds(0d);
dayFlowRecord.setGiftGolds(0d);
dayFlowRecord.setEarnGolds(earnGolds);
dayFlowRecord.setExchangeGolds(0d);
dayFlowRecord.setRemainGolds(earnGolds);
dayFlowRecord.setDate(dateStr);
dayFlowRecord.setCreateTime(now);
clanGoldDayFlowRecordMapper.insert(dayFlowRecord);
if (memberIndex > 0 && memberIndex % batchSize == 0){
batchSqlSession.commit();
}
memberIndex ++;
}
}
batchSqlSession.commit();
} catch (Exception e){
batchSqlSession.rollback();
log.error("[公会金币每日流水统计] 插入记录发生异常回滚", e);
} finally {
batchSqlSession.close();
}
}*/
}

View File

@@ -92,6 +92,7 @@ public class FamilyMemberRoomMicRecordService extends ServiceImpl<FamilyMemberRo
record.setFamilyId(familyMember.getFamilyId());
record.setRoomUid(roomUid);
record.setRoomId(roomId);
record.setPos(pos);
record.setUpTime(new Date(entreTimestamp));
record.setDownTime(new Date(timestamp));
record.setRemainTime(remainMillisecond);
@@ -107,4 +108,8 @@ public class FamilyMemberRoomMicRecordService extends ServiceImpl<FamilyMemberRo
private boolean isDownMicActionAction(Integer qEvent) {
return 5 == qEvent;
}
public List<FamilyMemberRoomMicRecord> listTotalRemainTimeByFamilyMember(Date upTime, Date startTime, Date endTime, Date downTime) {
return this.baseMapper.listTotalRemainTimeByFamilyMember(upTime, startTime, endTime, downTime);
}
}

View File

@@ -2,4 +2,12 @@
<!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.FamilyGiftRecordMapper">
<select id="listTotalGoldGroupByFamilyMember"
resultType="com.accompany.business.model.family.FamilyGiftRecord">
select receiver_uid, family_id, sum(total_gold_num) `total_gold_num`, count(distinct sender_uid) gift_send_record_id
from family_gift_record fgr
where fgr.create_time between #{startTime} and #{endTime}
group by receiver_uid, family_id
</select>
</mapper>

View File

@@ -1,5 +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.family.FamilyMemberSettlementRecordMapper">
<mapper namespace="com.accompany.business.mybatismapper.family.FamilyMemberGoldRemainDayRecordMapper">
</mapper>

View File

@@ -0,0 +1,29 @@
package com.accompany.scheduler.task.family;
import com.accompany.business.service.family.FamilyMemberGoldRemainDayRecordService;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class FamilySettlementTask {
@Autowired
private FamilyMemberGoldRemainDayRecordService service;
@SneakyThrows
@Scheduled(cron = "0 0 0 ? * *")
public void dayStatistic(){
long now = System.currentTimeMillis();
log.info("FamilySettlement() start..........");
service.dayStatistic(null);
long finish = System.currentTimeMillis();
log.info("FamilySettlement() cost {}ms finish..........", finish-now);
}
}