5 Commits

Author SHA1 Message Date
934f91221a 公会小时流水统计 2025-10-20 11:57:50 +08:00
a2bc44371a 公会小时流水模型 2025-10-20 11:47:54 +08:00
057e675ac8 公聊房-改造sendSysMsgService里发送全服房间消息的公共方法 2025-10-20 11:01:35 +08:00
13944c5fc3 公聊房-后台-myApi-创建公聊房 2025-10-20 11:01:35 +08:00
3e4bb0e532 eparty-测试环境 2025-10-20 11:01:35 +08:00
21 changed files with 460 additions and 77 deletions

View File

@@ -0,0 +1,61 @@
package com.accompany.admin.service.guild;
import cn.hutool.core.date.DateUtil;
import com.accompany.business.model.guild.Guild;
import com.accompany.business.service.guild.GuildDiamondStatisticsHourService;
import com.accompany.business.service.guild.GuildService;
import com.accompany.business.service.user.UsersService;
import com.accompany.business.vo.guild.GuildDiamondStatisticsHourVo;
import com.accompany.common.status.BusiStatus;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Users;
import com.accompany.core.util.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
@Service
public class GuildDiamondStatisticsHourAdminService {
@Autowired
private GuildService guildService;
@Autowired
private UsersService usersService;
@Autowired
private GuildDiamondStatisticsHourService guildDiamondStatisticsHourService;
public Page<GuildDiamondStatisticsHourVo> list(String startDate, String endDate,
Integer partitionId, Integer regionId,
Integer guildId, Long ownerErbanNo,
Integer pageNo, Integer pageSize, Long inviteUid) {
if (StringUtils.isEmpty(startDate) || StringUtils.isEmpty(endDate)) {
Date date = new Date();
startDate = DateUtil.formatDate(DateUtil.offsetDay(date, -30));
endDate = DateUtil.formatDate(date);
}
if (guildId == null && ownerErbanNo != null) {
Users users = usersService.getUserByErbanNo(ownerErbanNo);
if (users == null) {
throw new ServiceException(BusiStatus.SERVERERROR,"公会长信息不存在");
}
Long ownerUid = users.getUid();
Guild guild = guildService.getVaildGuildByOwnerUid(ownerUid);
if (guild == null) {
throw new ServiceException(BusiStatus.SERVERERROR,"公会不存在");
}
guildId = guild.getId();
}
Page<GuildDiamondStatisticsHourVo> guildDiamondStatisticsHourVoPage =
guildDiamondStatisticsHourService.listGuildByStatDate(startDate, endDate, partitionId, regionId, guildId, pageNo, pageSize, inviteUid);
if (!CollectionUtils.isEmpty(guildDiamondStatisticsHourVoPage.getRecords())) {
for (GuildDiamondStatisticsHourVo vo: guildDiamondStatisticsHourVoPage.getRecords()) {
vo.setPartitionDesc(PartitionEnum.getByPartitionId(vo.getPartitionId()).getDesc());
}
}
return guildDiamondStatisticsHourVoPage;
}
}

View File

@@ -334,6 +334,15 @@ public class MyApiController {
return BusiResult.success();
}
@RequestMapping("/createPublicRoom")
@ResponseBody
public BusiResult<Void> createPublicRoom(Long roomId, Integer partitionId) {
if (null == roomId || !roomId.equals(603L) || null == partitionId) {
throw new AdminServiceException(BusiStatus.PARAMERROR);
}
myApiService.createPublicRoom(partitionId);
return BusiResult.success();
}
@Autowired
private GoogleTokenVerifier googleTokenVerifier;

View File

@@ -0,0 +1,74 @@
package com.accompany.admin.controller.guild;
import com.accompany.admin.service.guild.GuildDiamondStatisticsHourAdminService;
import com.accompany.business.param.BasePageParams;
import com.accompany.business.vo.guild.GuildDiamondStatisticsHourVo;
import com.accompany.core.vo.BaseResponseVO;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@Api(tags = "公会小时钻石流水")
@RestController
@RequestMapping("/admin/guild/diamondStatistics")
public class GuildDiamondStatisticsHourAdminController {
@Autowired
private GuildDiamondStatisticsHourAdminService guildDiamondStatisticsHourAdminService;
@ApiImplicitParams({
@ApiImplicitParam(name = "partitionId", value = "分区id", required = true),
@ApiImplicitParam(name = "ownerErbanNo", value = "公会长id"),
@ApiImplicitParam(name = "guildId", value = "公会id"),
@ApiImplicitParam(name = "startTime", value = "开始时间 yyyy-mm-dd", dataType = "string"),
@ApiImplicitParam(name = "endTime", value = "结束时间 yyyy-mm-dd", dataType = "string"),
@ApiImplicitParam(name = "pageNo", value = "页码", required = true),
@ApiImplicitParam(name = "pageSize", value = "页长", required = true)
})
@ApiOperation(value = "公会小时钻石流水列表", httpMethod = "GET")
@GetMapping("")
public BaseResponseVO<Page<GuildDiamondStatisticsHourVo>> list(BasePageParams basePageParams,
int partitionId, Integer regionId,
Integer guildId, Long ownerErbanNo) {
return new BaseResponseVO<>(guildDiamondStatisticsHourAdminService.list(basePageParams.getStartTime(), basePageParams.getEndTime(),
partitionId, regionId, guildId, ownerErbanNo, basePageParams.getPageNo(), basePageParams.getPageSize(), null));
}
@ApiImplicitParams({
@ApiImplicitParam(name = "partitionId", value = "分区id", required = true),
@ApiImplicitParam(name = "ownerErbanNo", value = "公会长id"),
@ApiImplicitParam(name = "guildId", value = "公会id"),
@ApiImplicitParam(name = "startTime", value = "开始时间 yyyy-mm-dd", dataType = "string"),
@ApiImplicitParam(name = "endTime", value = "结束时间 yyyy-mm-dd", dataType = "string"),
@ApiImplicitParam(name = "pageNo", value = "页码", required = true),
@ApiImplicitParam(name = "pageSize", value = "页长", required = true)
})
@ApiOperation(value = "公会小时钻石流水列表-导出", httpMethod = "GET")
@GetMapping("/export")
public void export(HttpServletResponse response, BasePageParams basePageParams,
Integer regionId,
Integer guildId, Long ownerErbanNo) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码
String excelName = URLEncoder.encode("公会小时钻石流水列表", StandardCharsets.UTF_8);
Page<GuildDiamondStatisticsHourVo> list = guildDiamondStatisticsHourAdminService.list(basePageParams.getStartTime(), basePageParams.getEndTime(),
basePageParams.getPartitionId(), regionId, guildId, ownerErbanNo, 1, -1, null);
response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue());
EasyExcel.write(response.getOutputStream(), GuildDiamondStatisticsHourVo.class).sheet("公会小时钻石流水列表").doWrite(list.getRecords());
}
}

View File

@@ -3,9 +3,9 @@ spring:
dynamic-datasource:
master:
poolName: master
jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false&useCursorFetch=true
jdbcUrl: jdbc:mysql://129.226.62.202:3306/eparty?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false&useCursorFetch=true
username: root
password: anan@dev##
password: eparty@dev##
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
hikari:
@@ -15,9 +15,9 @@ spring:
max-lifetime: 7000
slave:
poolName: slave
jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false&useCursorFetch=true
jdbcUrl: jdbc:mysql://129.226.62.202:3306/eparty?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false&useCursorFetch=true
username: root
password: anan@dev##
password: eparty@dev##
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
hikari:
@@ -26,20 +26,20 @@ spring:
connection-test-query: select 1
max-lifetime: 7000
redis:
host: 124.156.164.187
host: 129.226.62.202
port: 6200
maxTotal: 100
maxIdle: 50
maxWait: 2500
testOnBorrow: true
testOnReturn: true
password: anan@dev@redis@#!
password: pc8DphhaXwTe2jyv
redisson:
# file: classpath:redisson.yaml
config: |
singleServerConfig:
address: redis://124.156.164.187:6200
password: anan@dev@redis@#!
address: redis://129.226.62.202:6200
password: pc8DphhaXwTe2jyv
connectionMinimumIdleSize: 4
timeout: 10000
threads: 8
@@ -47,17 +47,9 @@ spring:
codec: !<org.redisson.codec.JsonJacksonCodec> {}
transportMode: "NIO"
##activemq 配置
activemq:
brokerUrl: tcp://124.156.164.187:61619
user: system
password: manager
maxConnections: 50
idleTimeout: 30000
## rocketmq 配置
rocketmq:
name-server: 124.156.164.187:9876
name-server: 129.226.62.202:9876
producer:
group: peko-group
group: eparty-group
sendMessageTimeout: 300000

View File

@@ -19,7 +19,7 @@ spring:
nacos:
config:
server-addr: 124.156.164.187:8848
namespace: 8c62facb-be55-4bd3-9120-0c0c2ff564e9
namespace: a08ed001-51c0-4dbf-a1df-6e13e0edf1a8
file-extension: yml
shared-configs:
- data-id: application.yml
@@ -42,7 +42,7 @@ spring:
nacos:
config:
server-addr: 124.156.164.187:8848
namespace: 8c62facb-be55-4bd3-9120-0c0c2ff564e9
namespace: a08ed001-51c0-4dbf-a1df-6e13e0edf1a8
file-extension: yml
shared-configs:
- data-id: application.yml

View File

@@ -15,9 +15,20 @@ public class Attach {
private String message;
private Object data;
//用于携带给客户端用于区分同一组first和second的消息是单房间消息还是轮询全服房间遍历发送的单房间消息
//已使用公聊房机制解决轮询全服房间发送消息的云信im限频问题
private Integer allRoomMsg;
public Attach(int first, int second, Object data) {
this.first = first;
this.second = second;
this.data = data;
}
public Attach(int first, int second, Object data, int allRoomMsg) {
this.first = first;
this.second = second;
this.data = data;
this.allRoomMsg = allRoomMsg;
}
}

View File

@@ -1,6 +1,5 @@
package com.accompany.common.utils;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.accompany.common.status.BusiStatus;
import com.accompany.core.exception.ServiceException;
@@ -39,6 +38,7 @@ public class DateTimeUtil {
public static final String DEFAULT_DATE_PATTERN__ = "yyyyMMddHHmmss";
public static final String DEFAULT_TIME_PATTERN = "HH:mm:ss";
public static final String DEFAULT_DATE_MINUTE_PATTERN = "yyyy-MM-dd HH:mm";
public static final String DEFAULT_DATE_HOUR_PATTERN = "yyyy-MM-dd HH";
public static final String SIMPLE_MONTH_DATE_PATTERN = "M月d日";
public static final String DATE_HOUR_PATTERN = "yyyyMMddHH";
public static final String DATE_FORMAT_YEAR_MONTH = "yyyyMM";
@@ -61,9 +61,10 @@ public class DateTimeUtil {
public static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.DEFAULT_DATE_PATTERN);
public static final DateTimeFormatter datetimeFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.DEFAULT_DATETIME_PATTERN);
public static final DateTimeFormatter dateHourFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.DEFAULT_DATE_MINUTE_PATTERN);
public static final DateTimeFormatter dateHourMinutesFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.DEFAULT_DATE_MINUTE_PATTERN);
public static final DateTimeFormatter hoursFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.DATE_HOUR_PATTERN);
public static final DateTimeFormatter monthWithoutZeroDateFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.MONTH_WITHOUT_ZERO_DATE_PATTERN);
public static final DateTimeFormatter dateHourFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.DEFAULT_DATE_HOUR_PATTERN);
public static final DateTimeFormatter yyyyMMdd = DateTimeFormatter.ofPattern("yyyyMMdd");
@@ -1147,4 +1148,9 @@ public class DateTimeUtil {
return Date.from(eastEightZonedDateTime.toInstant());
}
public static String getDayHourDate(Date time, String zoneId) {
ZonedDateTime zdt = DateTimeUtil.convertWithZoneId(time, zoneId);
return zdt.format(dateHourFormatter);
}
}

View File

@@ -0,0 +1,44 @@
package com.accompany.business.model.guild;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 公会钻石流水统计按小时实体类
*
* @author
* @since 2025-10-17
*/
@Data
public class GuildDiamondStatisticsHour implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id" , type = IdType.AUTO)
private Long id;
private String statDate;
private Integer partitionId;
/**
* 统计日期yyyy--MM-dd HH
*/
private String statHour;
private Long guildMemberId;
private Long uid;
/**
* 所属厅id
*/
private Integer guildId;
private BigDecimal diamondNum;
/**
* 创建时间
*/
private Date createTime;
private Date updateTime;
}

View File

@@ -0,0 +1,27 @@
package com.accompany.business.vo.guild;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class GuildDiamondStatisticsHourVo {
@ExcelProperty("分区")
private String partitionDesc;
@ExcelProperty("公会id")
private Integer guildId;
@ExcelProperty("公会昵称")
private String guildName;
@ExcelProperty("公会长id")
private Long ownerErbanNo;
@ExcelProperty("公会长地区")
private String ownerRegionDesc;
@ExcelProperty("公会操作人")
private String adminUsername;
@ExcelProperty("主播人数")
private Integer memberNum;
@ExcelIgnore
private Integer partitionId;
@ExcelProperty("钻石流水")
private Double diamondNum;
}

View File

@@ -3,14 +3,12 @@ package com.accompany.business.event.listener;
import com.accompany.business.event.SuperLuckyGiftDiamondIncomeMessageEvent;
import com.accompany.business.message.SuperLuckyGiftDiamondIncomeMessage;
import com.accompany.business.model.guild.GuildMember;
import com.accompany.business.service.guild.GuildDiamondStatisticsDayService;
import com.accompany.business.service.guild.GuildMemberDiamondStatisticsService;
import com.accompany.business.service.guild.GuildMemberService;
import com.accompany.business.service.guild.GuildRankService;
import com.accompany.business.service.guild.*;
import com.accompany.business.service.guildpolicy2.GuildDiamondStatisticsPolicy2Service;
import com.accompany.business.service.user.UsersService;
import com.accompany.business.util.FullMonthCycleTimeUtil;
import com.accompany.common.constant.Constant;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.model.PartitionInfo;
import com.accompany.core.model.Users;
import com.accompany.core.service.partition.PartitionInfoService;
@@ -38,6 +36,8 @@ public class SuperLuckyGiftDiamondIncomeListener implements ApplicationListener<
private GuildDiamondStatisticsDayService guildDiamondStatisticsDayService;
@Autowired
private GuildDiamondStatisticsPolicy2Service guildDiamondStatisticsPolicy2Service;
@Autowired
private GuildDiamondStatisticsHourService guildDiamondStatisticsHourService;
@Async
@Override
@@ -59,16 +59,20 @@ public class SuperLuckyGiftDiamondIncomeListener implements ApplicationListener<
}
Date time = message.getCreateTime();
Double totalDiamondNum = message.getTotalDiamondNum();
String statDate = FullMonthCycleTimeUtil.getCycleDay(time, partitionInfo.getZoneId());
if (Constant.ClanMode.GUILD.equals(partitionInfo.getClanMode())) {
String cycleDate = FullMonthCycleTimeUtil.getCycleDateByZoneId(time, partitionInfo.getZoneId());
String statDate = FullMonthCycleTimeUtil.getCycleDay(time, partitionInfo.getZoneId());
statDate = FullMonthCycleTimeUtil.getCycleDay(time, partitionInfo.getZoneId());
guildMemberDiamondStatisticsService.update(cycleDate, guildMember, totalDiamondNum);
guildDiamondStatisticsDayService.updateDayDiamondStatistics(cycleDate, statDate, guildMember, totalDiamondNum);
} else if (Constant.ClanMode.GUILD_POLICY2.equals(partitionInfo.getClanMode())) {
String cycleDate = FullMonthCycleTimeUtil.getCycleDateByZoneId(time, partitionInfo.getZoneId());
String statDate = FullMonthCycleTimeUtil.getCycleDay(time, partitionInfo.getZoneId());
statDate = FullMonthCycleTimeUtil.getCycleDay(time, partitionInfo.getZoneId());
guildDiamondStatisticsPolicy2Service.updateDayDiamondStatistics(cycleDate, statDate, guildMember, totalDiamondNum);
}
String dayHourDate = DateTimeUtil.getDayHourDate(time, partitionInfo.getZoneId());
guildDiamondStatisticsHourService.updateHourDiamondStatistics(statDate, dayHourDate, guildMember, totalDiamondNum);
//todo 时区 zoneId
guildRankService.updateRank(guildMember.getGuildId(), guildMember.getUid(), totalDiamondNum, receiver.getPartitionId());
}

View File

@@ -0,0 +1,29 @@
package com.accompany.business.mybatismapper.guild;
import com.accompany.business.model.guild.GuildDiamondStatisticsHour;
import com.accompany.business.vo.guild.GuildDiamondStatisticsHourVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
/**
* 公会钻石流水统计按小时 Mapper 接口
*
* @author
* @since 2025-10-17
*/
public interface GuildDiamondStatisticsHourMapper extends BaseMapper<GuildDiamondStatisticsHour> {
int updateHourDiamondStatistics(@Param("statDate")String statDate, @Param("hourDate")String hourDate,
@Param("guildMemberId")Long guildMemberId, @Param("partitionId") Integer partitionId, @Param("guildId")Integer guildId, @Param("uid")Long uid,
@Param("diamond")Double diamond, @Param("time") Date time);
Page<GuildDiamondStatisticsHourVo> listGuildByStatDate(@Param("ipage") Page<GuildDiamondStatisticsHourVo> ipage,
@Param("startDate")String startDate, @Param("endDate")String endDate,
@Param("guildId") Integer guildId,
@Param("partitionId") Integer partitionId,
@Param("regionId") Integer regionId,
@Param("inviteUid") Long inviteUid);
}

View File

@@ -18,10 +18,12 @@ import com.accompany.common.utils.ReplaceAppDomainUtils;
import com.accompany.common.utils.UUIDUtil;
import com.accompany.core.base.SpringContextHolder;
import com.accompany.core.enumeration.I18nAlertEnum;
import com.accompany.core.model.PartitionInfo;
import com.accompany.core.model.Room;
import com.accompany.core.model.Users;
import com.accompany.core.mybatismapper.RoomMapperExpand;
import com.accompany.core.service.base.BaseService;
import com.accompany.core.service.partition.PartitionInfoService;
import com.accompany.core.util.I18NMessageSourceUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
@@ -61,6 +63,8 @@ public class SendSysMsgService extends BaseService {
@Autowired
private RoomMapperExpand roomMapperExpand;
@Autowired
private PartitionInfoService partitionInfoService;
/**
* 发送系统通知,捕获异常不抛出。
@@ -546,13 +550,33 @@ public class SendSysMsgService extends BaseService {
});
}
public void sendMessageToPartition(Integer partitionId, int first, int second, Object data) {
public void sendSingleRoomMessage(long roomId, String fromAccId, BaseChatRoomMsg msg) {
try {
String msgId = UUIDUtil.get();
this.erBanNetEaseService.sendChatRoomMsg(roomId, msgId, fromAccId,
msg.getMsgType(), msg.getAttach(), msg.getExt());
} catch (Exception e) {
log.error("发送房间消息失败[roomId : {}, fromAccId : {}, message : {}]",
roomId, fromAccId, msg, e);
}
}
public void sendMessageToPartition(int partitionId, int first, int second, Object data) {
Attach attach = new Attach(first, second, data);
sendMessageToPartition(partitionId, attach);
}
public void sendMessageToPartition(Integer partitionId, Attach attach) {
public void sendMessageToPartition(int partitionId, Attach attach) {
attach.setAllRoomMsg(Constant.Yes1No0.YES);
BaseChatRoomMsg msg = BaseChatRoomMsg.buildBaseChatRoomMsg(attach);
PartitionInfo partitionInfo = partitionInfoService.getById(partitionId);
if (partitionInfo == null){
return;
}
sendSingleRoomMessage(partitionInfo.getPublicChatRoomId(), SystemConfig.secretaryUid, attach);
sendMessageToPartition(partitionId, msg);
}
@@ -562,7 +586,16 @@ public class SendSysMsgService extends BaseService {
}
public void sendMessageToPartition(Room curRoom, Attach attach) {
attach.setAllRoomMsg(Constant.Yes1No0.YES);
BaseChatRoomMsg msg = BaseChatRoomMsg.buildBaseChatRoomMsg(attach);
PartitionInfo partitionInfo = partitionInfoService.getById(curRoom.getPartitionId());
if (partitionInfo == null){
return;
}
sendSingleRoomMessage(partitionInfo.getPublicChatRoomId(), SystemConfig.secretaryUid, attach);
sendMessageToPartition(curRoom, msg);
}
@@ -608,6 +641,15 @@ public class SendSysMsgService extends BaseService {
}
public void sendFloatingMessageForRoom(FloatingMessageTemplate message) {
int partitionId = message.getPartitionId();
PartitionInfo partitionInfo = partitionInfoService.getById(partitionId);
if (partitionInfo == null){
return;
}
sendFloatingMessageForRoom(partitionInfo.getPublicChatRoomId(), Long.parseLong(SystemConfig.secretaryUid), message);
List<Room> validRooms = this.roomMapperExpand.listValidRoomsByPartitionId(null, message.getPartitionId());
if (CollectionUtils.isEmpty(validRooms)){
return;

View File

@@ -141,7 +141,7 @@ public class LuckyNumberActService {
vo.setLuckyNumber(round.getLuckyNumber());
ZonedDateTime zdt = ZonedDateTime.parse(round.getEndTime(), DateTimeFormatter.ISO_ZONED_DATE_TIME);
vo.setEndTime(zdt.format(DateTimeUtil.dateHourFormatter));
vo.setEndTime(zdt.format(DateTimeUtil.dateHourMinutesFormatter));
return vo;
}).collect(Collectors.toList());
@@ -205,7 +205,7 @@ public class LuckyNumberActService {
vo.setDate(record.getDate());
ZonedDateTime zdt = ZonedDateTime.parse(round.getEndTime(), DateTimeFormatter.ISO_ZONED_DATE_TIME);
vo.setEndTime(zdt.format(DateTimeUtil.dateHourFormatter));
vo.setEndTime(zdt.format(DateTimeUtil.dateHourMinutesFormatter));
vo.setLuckyNumber(round.getLuckyNumber());
vo.setNumberList(record.getNumberList());

View File

@@ -0,0 +1,33 @@
package com.accompany.business.service.guild;
import com.accompany.business.model.guild.GuildDiamondStatisticsHour;
import com.accompany.business.model.guild.GuildMember;
import com.accompany.business.mybatismapper.guild.GuildDiamondStatisticsHourMapper;
import com.accompany.business.vo.guild.GuildDiamondStatisticsHourVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* 公会钻石流水统计按小时 服务实现类
*
* @author
* @since 2025-10-17
*/
@Service
public class GuildDiamondStatisticsHourService extends ServiceImpl<GuildDiamondStatisticsHourMapper, GuildDiamondStatisticsHour> {
public int updateHourDiamondStatistics(String statDate, String hourDate, GuildMember guildMember, double diamond) {
Date time = new Date();
int updated = baseMapper.updateHourDiamondStatistics(statDate, hourDate, guildMember.getId(), guildMember.getPartitionId(), guildMember.getGuildId(), guildMember.getUid(), diamond, time);
return updated;
}
public Page<GuildDiamondStatisticsHourVo> listGuildByStatDate(String statDate, String endDate, Integer partitionId, Integer regionId,
Integer guildId, Integer pageNo, Integer pageSize, Long inviteUid) {
Page<GuildDiamondStatisticsHourVo> page = new Page<>(pageNo, pageSize);
return baseMapper.listGuildByStatDate(page, statDate, endDate, guildId, partitionId, regionId, inviteUid);
}
}

View File

@@ -46,6 +46,9 @@ public class GuildGiftRecordService extends ServiceImpl<GuildGiftRecordMapper, G
private ApplicationContext applicationContext;
@Autowired
private GuildDiamondStatisticsPolicy2Service guildDiamondStatisticsPolicy2Service;
@Autowired
private GuildDiamondStatisticsHourService guildDiamondStatisticsHourService;
@Async
public void insertGuildGiftRecord(GiftSendRecord giftSendRecord) {
@@ -76,16 +79,20 @@ public class GuildGiftRecordService extends ServiceImpl<GuildGiftRecordMapper, G
}
Date createTime = giftSendRecord.getCreateTime();
String statDate = FullMonthCycleTimeUtil.getCycleDay(createTime, partitionInfo.getZoneId());
Double totalDiamondNum = giftSendRecord.getTotalDiamondNum();
if (Constant.ClanMode.GUILD.equals(partitionInfo.getClanMode())) {
String cycleDate = FullMonthCycleTimeUtil.getCycleDateByZoneId(createTime, partitionInfo.getZoneId());
guildMemberDiamondStatisticsService.update(cycleDate, guildMember, giftSendRecord.getTotalDiamondNum());
String statDate = FullMonthCycleTimeUtil.getCycleDay(createTime, partitionInfo.getZoneId());
guildDiamondStatisticsDayService.updateDayDiamondStatistics(cycleDate, statDate, guildMember, giftSendRecord.getTotalDiamondNum());
guildMemberDiamondStatisticsService.update(cycleDate, guildMember, totalDiamondNum);
statDate = FullMonthCycleTimeUtil.getCycleDay(createTime, partitionInfo.getZoneId());
guildDiamondStatisticsDayService.updateDayDiamondStatistics(cycleDate, statDate, guildMember, totalDiamondNum);
} else if (Constant.ClanMode.GUILD_POLICY2.equals(partitionInfo.getClanMode())) {
String cycleDate = FullMonthCycleTimeUtil.getCycleDateByZoneId(createTime, partitionInfo.getZoneId());
String statDate = FullMonthCycleTimeUtil.getCycleDay(createTime, partitionInfo.getZoneId());
guildDiamondStatisticsPolicy2Service.updateDayDiamondStatistics(cycleDate, statDate, guildMember, giftSendRecord.getTotalDiamondNum());
statDate = FullMonthCycleTimeUtil.getCycleDay(createTime, partitionInfo.getZoneId());
guildDiamondStatisticsPolicy2Service.updateDayDiamondStatistics(cycleDate, statDate, guildMember, totalDiamondNum);
}
String dayHourDate = DateTimeUtil.getDayHourDate(createTime, partitionInfo.getZoneId());
guildDiamondStatisticsHourService.updateHourDiamondStatistics(statDate, dayHourDate, guildMember, totalDiamondNum);
guildRankService.updateRank(guildGiftRecord);

View File

@@ -0,0 +1,48 @@
<?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.guild.GuildDiamondStatisticsHourMapper">
<update id="updateHourDiamondStatistics">
INSERT INTO `guild_diamond_statistics_hour` (`stat_date`, `stat_hour`, `guild_member_id`, `partition_id`, `uid`,
`guild_id`, `diamond_num`, `create_time`, `update_time`)
VALUES (#{statDate}, #{hourDate}, #{guildMemberId}, #{partitionId}, #{uid}, #{guildId}, #{diamond}, #{time},
#{time}) ON DUPLICATE KEY
UPDATE
diamond_num = diamond_num +
values (diamond_num), update_time =
values (update_time)
</update>
<select id="listGuildByStatDate" resultType="com.accompany.business.vo.guild.GuildDiamondStatisticsHourVo">
select gd.guild_id guildId,
ANY_VALUE(g.name) guildName,
sum(gd.diamond_num) diamondNum,
ANY_VALUE(u.erban_no) ownerErbanNo,
ANY_VALUE(ri.name) ownerRegionDesc,
ANY_VALUE(au.username) adminUsername,
ifnull(a.memberNum, 0) memberNum,
gd.partition_id partitionId
from guild_diamond_statistics_hour gd
inner join guild g on g.id = gd.guild_id
inner join users u on u.uid = g.owner_uid
left join region_info ri on ri.id = u.region_id
left join admin_user au on au.id = g.admin_id
left join (select guild_id, count(distinct uid) memberNum from guild_member where `enable` = 1 and role_type != 1 GROUP BY guild_id) a on a.guild_id = g.id
where gd.stat_hour &gt;= #{startDate}
and gd.stat_hour &lt;= #{endDate}
<if test="partitionId != null and partitionId != 0">
and gd.partition_id = #{partitionId}
</if>
<if test="regionId != null and regionId != 0">
and u.region_id = #{regionId}
</if>
<if test="guildId != null">
and gd.guild_id = #{guildId}
</if>
<if test="inviteUid != null">
and g.invite_uid = #{inviteUid}
</if>
group by gd.guild_id
ORDER BY diamondNum desc,memberNum desc, gd.guild_id desc
</select>
</mapper>

View File

@@ -3,59 +3,55 @@ spring:
dynamic-datasource:
master:
poolName: master
jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false&useCursorFetch=true
jdbcUrl: jdbc:mysql://129.226.62.202:3306/eparty?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false&useCursorFetch=true
username: root
password: anan@dev##
password: eparty@dev##
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
hikari:
minimum-idle: 4
maximum-pool-size: 16
minimum-idle: 10
maximum-pool-size: 20
connection-test-query: select 1
max-lifetime: 1800000 # 30分钟
validation-timeout: 6000 # 验证连接的最大等待时间
idle-timeout: 600000 # 空闲连接超时时间10分钟
max-lifetime: 7000
slave:
poolName: slave
jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false&useCursorFetch=true
jdbcUrl: jdbc:mysql://129.226.62.202:3306/eparty?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false&useCursorFetch=true
username: root
password: anan@dev##
password: eparty@dev##
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
hikari:
minimum-idle: 4
maximum-pool-size: 32
minimum-idle: 10
maximum-pool-size: 20
connection-test-query: select 1
max-lifetime: 1800000 # 30分钟
validation-timeout: 6000 # 验证连接的最大等待时间
idle-timeout: 600000 # 空闲连接超时时间10分钟
max-lifetime: 7000
redis:
host: 124.156.164.187
host: 129.226.62.202
port: 6200
maxTotal: 24
maxIdle: 12
maxTotal: 100
maxIdle: 50
maxWait: 2500
testOnBorrow: true
testOnReturn: true
password: anan@dev@redis@#!
password: pc8DphhaXwTe2jyv
redisson:
# file: classpath:redisson.yaml
config: |
singleServerConfig:
address: redis://124.156.164.187:6200
password: anan@dev@redis@#!
address: redis://129.226.62.202:6200
password: pc8DphhaXwTe2jyv
connectionMinimumIdleSize: 4
timeout: 10000
threads: 2
nettyThreads: 4
threads: 8
nettyThreads: 16
codec: !<org.redisson.codec.JsonJacksonCodec> {}
transportMode: "NIO"
## rocketmq 配置
rocketmq:
name-server: 124.156.164.187:9876
name-server: 129.226.62.202:9876
producer:
group: peko-group
group: eparty-group
sendMessageTimeout: 300000
server:

View File

@@ -19,7 +19,7 @@ spring:
nacos:
config:
server-addr: 124.156.164.187:8848
namespace: 8c62facb-be55-4bd3-9120-0c0c2ff564e9
namespace: a08ed001-51c0-4dbf-a1df-6e13e0edf1a8
file-extension: yml
shared-configs:
- data-id: application.yml
@@ -42,7 +42,7 @@ spring:
nacos:
config:
server-addr: 124.156.164.187:8848
namespace: 8c62facb-be55-4bd3-9120-0c0c2ff564e9
namespace: a08ed001-51c0-4dbf-a1df-6e13e0edf1a8
file-extension: yml
shared-configs:
- data-id: application.yml

View File

@@ -3,9 +3,9 @@ spring:
dynamic-datasource:
master:
poolName: master
jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false&useCursorFetch=true
jdbcUrl: jdbc:mysql://129.226.62.202:3306/eparty?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false&useCursorFetch=true
username: root
password: anan@dev##
password: eparty@dev##
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
hikari:
@@ -15,9 +15,9 @@ spring:
max-lifetime: 7000
slave:
poolName: slave
jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false&useCursorFetch=true
jdbcUrl: jdbc:mysql://129.226.62.202:3306/eparty?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false&useCursorFetch=true
username: root
password: anan@dev##
password: eparty@dev##
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
hikari:
@@ -26,20 +26,20 @@ spring:
connection-test-query: select 1
max-lifetime: 7000
redis:
host: 124.156.164.187
host: 129.226.62.202
port: 6200
maxTotal: 100
maxIdle: 50
maxWait: 2500
testOnBorrow: true
testOnReturn: true
password: anan@dev@redis@#!
password: pc8DphhaXwTe2jyv
redisson:
# file: classpath:redisson.yaml
config: |
singleServerConfig:
address: redis://124.156.164.187:6200
password: anan@dev@redis@#!
address: redis://129.226.62.202:6200
password: pc8DphhaXwTe2jyv
connectionMinimumIdleSize: 4
timeout: 10000
threads: 8
@@ -49,9 +49,9 @@ spring:
## rocketmq 配置
rocketmq:
name-server: 124.156.164.187:9876
name-server: 129.226.62.202:9876
producer:
group: peko-group
group: eparty-group
sendMessageTimeout: 300000
server:

View File

@@ -19,7 +19,7 @@ spring:
nacos:
config:
server-addr: 124.156.164.187:8848
namespace: 8c62facb-be55-4bd3-9120-0c0c2ff564e9
namespace: a08ed001-51c0-4dbf-a1df-6e13e0edf1a8
file-extension: yml
shared-configs:
- data-id: application.yml
@@ -42,7 +42,7 @@ spring:
nacos:
config:
server-addr: 124.156.164.187:8848
namespace: 8c62facb-be55-4bd3-9120-0c0c2ff564e9
namespace: a08ed001-51c0-4dbf-a1df-6e13e0edf1a8
file-extension: yml
shared-configs:
- data-id: application.yml

View File

@@ -16,7 +16,7 @@ spring:
nacos:
config:
server-addr: 124.156.164.187:8848
namespace: 8c62facb-be55-4bd3-9120-0c0c2ff564e9
namespace: a08ed001-51c0-4dbf-a1df-6e13e0edf1a8
file-extension: yml
shared-configs:
- data-id: application.yml
@@ -39,7 +39,7 @@ spring:
nacos:
config:
server-addr: 124.156.164.187:8848
namespace: 8c62facb-be55-4bd3-9120-0c0c2ff564e9
namespace: a08ed001-51c0-4dbf-a1df-6e13e0edf1a8
file-extension: yml
shared-configs:
- data-id: application.yml