2 Commits

Author SHA1 Message Date
72581ab9d5 土耳其实时薪资fixed 2025-10-17 14:15:08 +08:00
3a985c1869 土耳其实时薪资 2025-10-17 14:15:08 +08:00
26 changed files with 420 additions and 415 deletions

View File

@@ -1,61 +0,0 @@
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

@@ -1,74 +0,0 @@
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/hourDiamondStatistics")
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

@@ -38,7 +38,6 @@ public class DateTimeUtil {
public static final String DEFAULT_DATE_PATTERN__ = "yyyyMMddHHmmss"; public static final String DEFAULT_DATE_PATTERN__ = "yyyyMMddHHmmss";
public static final String DEFAULT_TIME_PATTERN = "HH:mm:ss"; 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_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 SIMPLE_MONTH_DATE_PATTERN = "M月d日";
public static final String DATE_HOUR_PATTERN = "yyyyMMddHH"; public static final String DATE_HOUR_PATTERN = "yyyyMMddHH";
public static final String DATE_FORMAT_YEAR_MONTH = "yyyyMM"; public static final String DATE_FORMAT_YEAR_MONTH = "yyyyMM";
@@ -66,7 +65,6 @@ public class DateTimeUtil {
public static final DateTimeFormatter hoursFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.DATE_HOUR_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 monthWithoutZeroDateFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.MONTH_WITHOUT_ZERO_DATE_PATTERN);
public static final DateTimeFormatter datetimeReverseFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.ZONE_DATETIME_REVERSE_PATTERN); public static final DateTimeFormatter datetimeReverseFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.ZONE_DATETIME_REVERSE_PATTERN);
public static final DateTimeFormatter dayHourFormatter = DateTimeFormatter.ofPattern(DateTimeUtil.DEFAULT_DATE_HOUR_PATTERN);
public static final DateTimeFormatter yyyyMMdd = DateTimeFormatter.ofPattern("yyyyMMdd"); public static final DateTimeFormatter yyyyMMdd = DateTimeFormatter.ofPattern("yyyyMMdd");
@@ -1150,9 +1148,14 @@ public class DateTimeUtil {
return Date.from(eastEightZonedDateTime.toInstant()); return Date.from(eastEightZonedDateTime.toInstant());
} }
public static String getDayHourDate(Date time, String zoneId) { public static Date convertToEastEightZone(Date date, String originalZoneId) {
ZonedDateTime zdt = DateTimeUtil.convertWithZoneId(time, zoneId); ZonedDateTime cycleBeginDateZoneDate = DateTimeUtil.convertWithZoneId(date, originalZoneId);
return zdt.format(dayHourFormatter); // 2. 转换为东八区时间
ZonedDateTime eastEightZonedDateTime = cycleBeginDateZoneDate
.withZoneSameInstant(ZoneId.of("Asia/Shanghai"));
// 3. 返回Date对象
return Date.from(eastEightZonedDateTime.toInstant());
} }
} }

View File

@@ -319,9 +319,9 @@ public enum I18nAlertEnum {
GOLD_BEAN_NAME("Gold Bean"), GOLD_BEAN_NAME("Gold Bean"),
DIAMOND_NAME("DIAMOND"), DIAMOND_NAME("DIAMOND"),
GUILD_CREATE_TASK_MSG("你在公会的卓越表现,获得了精美奖励。快去背包看看吧!"), GUILD_CREATE_TASK_MSG("你在公会的卓越表现,获得了精美奖励。快去背包看看吧!"),
EXTRA_GUILD_MSG("尊敬的用户,根据政策,您的公会长次日奖励{0}钻石已到账,您可以前往【我的钱包】查看"), EXTRA_GUILD_MSG("你的钻石奖励已经发放,请注意查收"),
EXTRA_GUILD_MEMBER_MSG("尊敬的用户,根据政策,您的主播次日奖励{0}钻石已到账,您可以前往【我的钱包】查看"), EXTRA_GUILD_MEMBER_MSG("你的钻石奖励已经发放,请注意查收"),
EXTRA_ROOM_MSG("尊敬的用户,根据政策,您每周一结算的奖励{0}钻石已到账,您可以前往【我的钱包】查看"), EXTRA_ROOM_MSG("你的钻石奖励已经发放,请注意查收"),
; ;
private final String defaultStr; private final String defaultStr;

View File

@@ -82,4 +82,7 @@ public interface ChargeRecordMapperMgr {
@Param("startTime") Date startTime, @Param("endTime") Date endTime); @Param("startTime") Date startTime, @Param("endTime") Date endTime);
List<ChargeRecord> getAllChargeUserAmount(@Param("list") List<Long> uids, @Param("startTime") Date startTime, List<ChargeRecord> getAllChargeUserAmount(@Param("list") List<Long> uids, @Param("startTime") Date startTime,
@Param("endTime") Date endTime); @Param("endTime") Date endTime);
List<ChargeRecord> getRefundGroupUidDateMap(@Param("uids") List<Long> uids, @Param("startTime") Date startTime,
@Param("endTime") Date endTime);
} }

View File

@@ -19,7 +19,11 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service @Service
public class ChargeRecordService extends BaseService { public class ChargeRecordService extends BaseService {
@@ -177,4 +181,12 @@ public class ChargeRecordService extends BaseService {
public ChargeRecordMapper getChargeRecordMapper() { public ChargeRecordMapper getChargeRecordMapper() {
return chargeRecordMapper; return chargeRecordMapper;
} }
public Map<Long, ChargeRecord> getRefundGroupUidDateMap(List<Long> uids, Date startTime, Date endTime) {
List<ChargeRecord> refundGroupUidDateMap = chargeRecordMapperMgr.getRefundGroupUidDateMap(uids, startTime, endTime);
if (CollectionUtils.isEmpty(refundGroupUidDateMap)) {
return new HashMap<>();
}
return refundGroupUidDateMap.stream().collect(Collectors.toMap(ChargeRecord::getUid, Function.identity()));
}
} }

View File

@@ -404,4 +404,18 @@
group by uid group by uid
</select> </select>
<select id="getRefundGroupUidDateMap" resultType="com.accompany.payment.model.ChargeRecord">
select uid,
sum(amount) amount,
sum(total_gold) totalGold
from charge_record
where refund = 1
and create_time &gt;= #{startTime}
and create_time &lt; #{endTime}
<foreach collection="uids" item="u" open="and uid in(" separator="," close=")">
#{u}
</foreach>
group by uid
</select>
</mapper> </mapper>

View File

@@ -1,44 +0,0 @@
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

@@ -53,6 +53,10 @@ public class GuildDiamondStatisticsPolicy2Settle implements Serializable {
* 公会长薪资 * 公会长薪资
*/ */
private BigDecimal ownerSalary; private BigDecimal ownerSalary;
/**
* 问题薪资
*/
private BigDecimal issueSalary;
/** /**
* 创建时间 * 创建时间
*/ */

View File

@@ -1,27 +0,0 @@
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

@@ -0,0 +1,22 @@
package com.accompany.business.vo.guildpolicy;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@Data
public class GuildPolicy2AgencyVo {
@ApiModelProperty("周期开始日期yyyy-MM-dd")
private String cycleDate;
@ApiModelProperty("钻石数量")
private BigDecimal diamondNum = BigDecimal.ZERO;
@ApiModelProperty("成员数据")
private List<GuildPolicy2MemberVo> memberData = new ArrayList<>();
private GuildPolicy2SalaryVo guildSalary = new GuildPolicy2SalaryVo();
}

View File

@@ -14,4 +14,12 @@ public class GuildPolicy2MemberVo extends SimpleUserVo {
private BigDecimal diamondNum; private BigDecimal diamondNum;
@ApiModelProperty("有效天数") @ApiModelProperty("有效天数")
private Integer micDay; private Integer micDay;
@ApiModelProperty("钻石薪资")
private BigDecimal diamondSalary = BigDecimal.ZERO;
@ApiModelProperty("时长薪资")
private BigDecimal micSalary = BigDecimal.ZERO;
@ApiModelProperty("公会长薪资")
private BigDecimal ownerSalary = BigDecimal.ZERO;
@ApiModelProperty("问题薪资")
private BigDecimal issueSalary = BigDecimal.ZERO;
} }

View File

@@ -10,23 +10,22 @@ import java.util.List;
@ApiModel @ApiModel
@Data @Data
public class GuildPolicy2Vo { public class GuildPolicy2MyVo {
@ApiModelProperty("周期开始日期yyyy-MM-dd") @ApiModelProperty("周期开始日期yyyy-MM-dd")
private String cycleDate; private String cycleDate;
@ApiModelProperty("当前")
private String curCycleDate;
@ApiModelProperty("钻石数量") @ApiModelProperty("钻石数量")
private BigDecimal diamondNum = BigDecimal.ZERO; private BigDecimal diamondNum = BigDecimal.ZERO;
@ApiModelProperty("公会钻石数量")
private BigDecimal guildDiamondNum = BigDecimal.ZERO;
@ApiModelProperty("上麦有效天数") @ApiModelProperty("上麦有效天数")
private Integer micDay = 0; private Integer micDay = 0;
@ApiModelProperty("成员数据")
private List<GuildPolicy2MemberVo> memberData = new ArrayList<>();
@ApiModelProperty("我的数据") @ApiModelProperty("我的数据")
private List<GuildPolicy2PersonalVo> myData = new ArrayList<>(); private List<GuildPolicy2PersonalVo> myData = new ArrayList<>();
@ApiModelProperty("我的薪资")
private GuildPolicy2SalaryVo mySalary;
} }

View File

@@ -0,0 +1,45 @@
package com.accompany.business.vo.guildpolicy;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel
@Data
public class GuildPolicy2SalaryVo {
@ApiModelProperty("钻石薪资")
private BigDecimal diamondSalary = BigDecimal.ZERO;
@ApiModelProperty("时长薪资")
private BigDecimal micSalary = BigDecimal.ZERO;
@ApiModelProperty("公会长薪资")
private BigDecimal ownerSalary = BigDecimal.ZERO;
@ApiModelProperty("问题薪资")
private BigDecimal issueSalary = BigDecimal.ZERO;
@ApiModelProperty("钻石数量")
private BigDecimal diamondNum = BigDecimal.ZERO;
@ApiModelProperty("有效天数")
private Integer micDay = 0;
@ApiModelProperty("当前档位流水开始值")
private BigDecimal curLevelDiamondNum = BigDecimal.ZERO;
@ApiModelProperty("当前档位流水开始值描述")
private String curLevelName = "";
@ApiModelProperty("当前档位在麦时长达标值")
private Integer curLevelMicDay = 0;
@ApiModelProperty("下一档开始值")
private BigDecimal nextLevelDiamondNum = BigDecimal.ZERO;
@ApiModelProperty("下一档开始值描述")
private String nextLevelName = "";
}

View File

@@ -3,7 +3,10 @@ package com.accompany.business.event.listener;
import com.accompany.business.event.SuperLuckyGiftDiamondIncomeMessageEvent; import com.accompany.business.event.SuperLuckyGiftDiamondIncomeMessageEvent;
import com.accompany.business.message.SuperLuckyGiftDiamondIncomeMessage; import com.accompany.business.message.SuperLuckyGiftDiamondIncomeMessage;
import com.accompany.business.model.guild.GuildMember; import com.accompany.business.model.guild.GuildMember;
import com.accompany.business.service.guild.*; 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.guildpolicy2.GuildDiamondStatisticsPolicy2Service; import com.accompany.business.service.guildpolicy2.GuildDiamondStatisticsPolicy2Service;
import com.accompany.business.service.guildsoviet.ExtraDiamondDayService; import com.accompany.business.service.guildsoviet.ExtraDiamondDayService;
import com.accompany.business.service.user.UsersService; import com.accompany.business.service.user.UsersService;
@@ -42,8 +45,6 @@ public class SuperLuckyGiftDiamondIncomeListener implements ApplicationListener<
private GuildDiamondStatisticsPolicy2Service guildDiamondStatisticsPolicy2Service; private GuildDiamondStatisticsPolicy2Service guildDiamondStatisticsPolicy2Service;
@Autowired @Autowired
private ExtraDiamondDayService extraDiamondDayService; private ExtraDiamondDayService extraDiamondDayService;
@Autowired
private GuildDiamondStatisticsHourService guildDiamondStatisticsHourService;
@Async @Async
@Override @Override
@@ -83,9 +84,6 @@ public class SuperLuckyGiftDiamondIncomeListener implements ApplicationListener<
} }
//todo 时区 zoneId //todo 时区 zoneId
guildRankService.updateRank(guildMember.getGuildId(), guildMember.getUid(), totalDiamondNum, receiver.getPartitionId()); guildRankService.updateRank(guildMember.getGuildId(), guildMember.getUid(), totalDiamondNum, receiver.getPartitionId());
String dayHourDate = DateTimeUtil.getDayHourDate(time, partitionInfo.getZoneId());
guildDiamondStatisticsHourService.updateHourDiamondStatistics(statDate, dayHourDate, guildMember, totalDiamondNum);
} }
if (Constant.ClanMode.SOVIET.equals(partitionInfo.getClanMode()) && roomUid != null && roomUid > 0L) { if (Constant.ClanMode.SOVIET.equals(partitionInfo.getClanMode()) && roomUid != null && roomUid > 0L) {

View File

@@ -1,29 +0,0 @@
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

@@ -24,4 +24,7 @@ public interface GuildDiamondStatisticsPolicy2SettleMapper extends BaseMapper<Gu
@Param("startDate")String startDate, @Param("startDate")String startDate,
@Param("guildId") Integer guildId, @Param("uid") Long uid, @Param("guildId") Integer guildId, @Param("uid") Long uid,
@Param("partitionId") Integer partitionId); @Param("partitionId") Integer partitionId);
List<GuildDiamondStatisticsPolicy2Settle> groupByMemberStatDate(@Param("cycleDate") String cycleDate, @Param("partitionId") Integer partitionId,
@Param("guildMemberId") Long guildMemberId, @Param("guildId") Integer guildId);
} }

View File

@@ -1,33 +0,0 @@
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

@@ -52,8 +52,6 @@ public class GuildGiftRecordService extends ServiceImpl<GuildGiftRecordMapper, G
private GuildDiamondStatisticsPolicy2Service guildDiamondStatisticsPolicy2Service; private GuildDiamondStatisticsPolicy2Service guildDiamondStatisticsPolicy2Service;
@Autowired @Autowired
private ExtraDiamondDayService extraDiamondDayService; private ExtraDiamondDayService extraDiamondDayService;
@Autowired
private GuildDiamondStatisticsHourService guildDiamondStatisticsHourService;
@Async @Async
public void insertGuildGiftRecord(GiftSendRecord giftSendRecord) { public void insertGuildGiftRecord(GiftSendRecord giftSendRecord) {
@@ -99,10 +97,8 @@ public class GuildGiftRecordService extends ServiceImpl<GuildGiftRecordMapper, G
statDate = CycleTimeUtil.getCycleDay(createTime, partitionInfo.getZoneId()); statDate = CycleTimeUtil.getCycleDay(createTime, partitionInfo.getZoneId());
extraDiamondDayService.updateGuildExtraDiamond(guildMember, cycleDate, statDate, totalDiamondNum, 0D, createTime); extraDiamondDayService.updateGuildExtraDiamond(guildMember, cycleDate, statDate, totalDiamondNum, 0D, createTime);
} }
guildRankService.updateRank(guildGiftRecord);
String dayHourDate = DateTimeUtil.getDayHourDate(createTime, partitionInfo.getZoneId()); guildRankService.updateRank(guildGiftRecord);
guildDiamondStatisticsHourService.updateHourDiamondStatistics(statDate, dayHourDate, guildMember, totalDiamondNum);
Date zoneTime = DateTimeUtil.withZoneSameInstant(giftSendRecord.getCreateTime(), partitionInfo.getZoneId()); Date zoneTime = DateTimeUtil.withZoneSameInstant(giftSendRecord.getCreateTime(), partitionInfo.getZoneId());
String monday = DateTimeUtil.convertDate(DateTimeUtil.getMondayDate(zoneTime), DateTimeUtil.DEFAULT_DATE_PATTERN); String monday = DateTimeUtil.convertDate(DateTimeUtil.getMondayDate(zoneTime), DateTimeUtil.DEFAULT_DATE_PATTERN);

View File

@@ -6,6 +6,7 @@ import com.accompany.business.vo.guildpolicy.GuildPolicy2MemberAdminVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
@@ -31,4 +32,20 @@ public class GuildDiamondStatisticsPolicy2SettleService extends ServiceImpl<Guil
Page<GuildPolicy2MemberAdminVo> page = new Page<>(pageNo, pageSize); Page<GuildPolicy2MemberAdminVo> page = new Page<>(pageNo, pageSize);
return baseMapper.listByStatDate(page, cycleDate, guildId, uid, partitionId); return baseMapper.listByStatDate(page, cycleDate, guildId, uid, partitionId);
} }
public GuildDiamondStatisticsPolicy2Settle groupByMemberStatDate(String cycleDate, Integer partitionId,
Long guildMemberId) {
List<GuildDiamondStatisticsPolicy2Settle> guildDiamondStatisticsPolicy2Settles =
baseMapper.groupByMemberStatDate(cycleDate, partitionId, guildMemberId, null);
if (CollectionUtils.isEmpty(guildDiamondStatisticsPolicy2Settles)) {
return null;
}
return guildDiamondStatisticsPolicy2Settles.get(0);
}
public List<GuildDiamondStatisticsPolicy2Settle> groupByGuildMemberStatDate(String cycleDate, Integer partitionId,
Integer guildId) {
return baseMapper.groupByMemberStatDate(cycleDate, partitionId, null, guildId);
}
} }

View File

@@ -2,6 +2,7 @@ package com.accompany.business.service.guildpolicy2;
import com.accompany.business.model.guildpolicy2.GuildDiamondWagePolicy2; import com.accompany.business.model.guildpolicy2.GuildDiamondWagePolicy2;
import com.accompany.business.mybatismapper.guildpolicy2.GuildDiamondWagePolicy2Mapper; import com.accompany.business.mybatismapper.guildpolicy2.GuildDiamondWagePolicy2Mapper;
import com.accompany.business.vo.guildpolicy.GuildPolicy2SalaryVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -77,11 +78,35 @@ public class GuildDiamondWagePolicy2Service extends ServiceImpl<GuildDiamondWage
if (CollectionUtils.isEmpty(wageList)){ if (CollectionUtils.isEmpty(wageList)){
return map; return map;
} }
for (GuildDiamondWagePolicy2 wage : wageList) { for (GuildDiamondWagePolicy2 wage : wageList) {
map.put(wage.getDiamondNum(), wage); map.put(wage.getDiamondNum(), wage);
} }
return map; return map;
} }
public GuildPolicy2SalaryVo getSalaryVo(TreeMap<BigDecimal, GuildDiamondWagePolicy2> treeMap, BigDecimal diamondNum, Integer micDay) {
GuildPolicy2SalaryVo salaryVo = new GuildPolicy2SalaryVo();
salaryVo.setDiamondNum(diamondNum);
salaryVo.setMicDay(micDay);
Map.Entry<BigDecimal, GuildDiamondWagePolicy2> curDiamondLevel = treeMap.headMap(diamondNum, true).lastEntry();
Map.Entry<BigDecimal, GuildDiamondWagePolicy2> nextDiamondLevel = treeMap.tailMap(diamondNum, false).firstEntry();
GuildDiamondWagePolicy2 curLevel = curDiamondLevel.getValue();
salaryVo.setDiamondSalary(curLevel.getAnchorDiamondSalary());
salaryVo.setMicSalary(micDay < curLevel.getMicDay() ? BigDecimal.ZERO : curLevel.getAnchorMicSalary());
salaryVo.setOwnerSalary(curLevel.getOwnerSalary());
salaryVo.setCurLevelName(curLevel.getLevel());
salaryVo.setCurLevelDiamondNum(curLevel.getDiamondNum());
salaryVo.setCurLevelMicDay(curLevel.getMicDay());
if (nextDiamondLevel != null) {
GuildDiamondWagePolicy2 nextLevel = nextDiamondLevel.getValue();
salaryVo.setNextLevelDiamondNum(nextLevel.getDiamondNum());
salaryVo.setNextLevelName(nextLevel.getLevel());
}
return salaryVo;
}
} }

View File

@@ -11,24 +11,26 @@ import com.accompany.business.service.guild.GuildAuthService;
import com.accompany.business.service.guild.GuildMemberService; import com.accompany.business.service.guild.GuildMemberService;
import com.accompany.business.service.guild.GuildMemberWeekLevelRewardV2Service; import com.accompany.business.service.guild.GuildMemberWeekLevelRewardV2Service;
import com.accompany.business.service.purse.UserPurseService; import com.accompany.business.service.purse.UserPurseService;
import com.accompany.business.service.room.RoomMicService;
import com.accompany.business.service.user.UsersService; import com.accompany.business.service.user.UsersService;
import com.accompany.business.util.CycleTimeUtil; import com.accompany.business.util.CycleTimeUtil;
import com.accompany.business.util.FullMonthCycleTimeUtil; import com.accompany.business.util.FullMonthCycleTimeUtil;
import com.accompany.business.vo.guild.CycleDateVo; import com.accompany.business.vo.guild.CycleDateVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2PersonalVo; import com.accompany.business.vo.guildpolicy.*;
import com.accompany.business.vo.guildpolicy.GuildPolicy2Vo;
import com.accompany.common.constant.Constant; import com.accompany.common.constant.Constant;
import com.accompany.common.result.BusiResult; import com.accompany.common.result.BusiResult;
import com.accompany.common.status.BusiStatus; import com.accompany.common.status.BusiStatus;
import com.accompany.common.utils.DateTimeUtil; import com.accompany.common.utils.DateTimeUtil;
import com.accompany.common.utils.StringUtils;
import com.accompany.core.enumeration.BillObjTypeEnum; import com.accompany.core.enumeration.BillObjTypeEnum;
import com.accompany.core.enumeration.PartitionEnum; import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.exception.ServiceException; import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Users; import com.accompany.core.model.Users;
import com.accompany.payment.model.ChargeRecord;
import com.accompany.payment.service.ChargeRecordService;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -54,8 +56,6 @@ public class GuildPolicy2Service {
@Autowired @Autowired
private GuildAuthService guildAuthService; private GuildAuthService guildAuthService;
@Autowired @Autowired
private RoomMicService roomMicService;
@Autowired
private GuildMicStatisticsPolicy2Service guildMicStatisticsPolicy2Service; private GuildMicStatisticsPolicy2Service guildMicStatisticsPolicy2Service;
@Autowired @Autowired
private UsersService usersService; private UsersService usersService;
@@ -73,10 +73,13 @@ public class GuildPolicy2Service {
private GuildDiamondWagePolicy2Service guildDiamondWagePolicy2Service; private GuildDiamondWagePolicy2Service guildDiamondWagePolicy2Service;
@Autowired @Autowired
private GuildDiamondStatisticsPolicy2SettleService guildDiamondStatisticsPolicy2SettleService; private GuildDiamondStatisticsPolicy2SettleService guildDiamondStatisticsPolicy2SettleService;
public BusiResult<GuildPolicy2Vo> getGuildPolicy2(Long uid, String cycleBeginDate) { @Autowired
GuildPolicy2Vo guildPolicy2Vo = new GuildPolicy2Vo(); private ChargeRecordService chargeRecordService;
guildPolicy2Vo.setCycleDate(cycleBeginDate);
private static final String MIN_CYCLE_DATE = "2025-09-01";
private static final BigDecimal ISSUE_SALARY_RATE = BigDecimal.valueOf(1.2);
private GuildMember validateAndGetGuildMember(Long uid) {
GuildMember guildMember = guildMemberService.getVaildGuildMemberByUid(uid); GuildMember guildMember = guildMemberService.getVaildGuildMemberByUid(uid);
if (null == guildMember){ if (null == guildMember){
throw new ServiceException(BusiStatus.FAMILY_NOT_EXIST); throw new ServiceException(BusiStatus.FAMILY_NOT_EXIST);
@@ -87,55 +90,69 @@ public class GuildPolicy2Service {
throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED); throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED);
} }
return guildMember;
}
private boolean isCurrentOrPastCycle(String cycleBeginDate, String curCycleBeginDate) {
return cycleBeginDate.equals(curCycleBeginDate) || cycleBeginDate.compareTo(MIN_CYCLE_DATE) < 0;
}
@NotNull
private static BigDecimal getIssiueSalary(ChargeRecord chargeRecord) {
if (chargeRecord == null) {
return BigDecimal.ZERO;
}
return BigDecimal.valueOf(chargeRecord.getAmount() != null ? chargeRecord.getAmount() : 0D)
.divide(BigDecimal.valueOf(100))
.multiply(ISSUE_SALARY_RATE);
}
public BusiResult<GuildPolicy2MyVo> getGuildPolicy2(Long uid, String cycleBeginDate) {
GuildPolicy2MyVo guildPolicy2MyVo = new GuildPolicy2MyVo();
guildPolicy2MyVo.setCycleDate(cycleBeginDate);
GuildMember guildMember = this.validateAndGetGuildMember(uid);
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(guildMember.getPartitionId());
Long guildMemberId = guildMember.getId(); Long guildMemberId = guildMember.getId();
guildPolicy2Vo.setDiamondNum(guildDiamondStatisticsPolicy2Service.getTotalDiamondInCycleMember(cycleBeginDate, guildMemberId)); String curCycleBeginDate = FullMonthCycleTimeUtil.getCycleDate(DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId()));
guildPolicy2MyVo.setCurCycleDate(curCycleBeginDate);
List<GuildPolicy2PersonalVo> myDiamondData = guildDiamondStatisticsPolicy2Service.listPersonalDiamondData(cycleBeginDate, guildMemberId);
List<GuildPolicy2PersonalVo> myMicData = guildMicStatisticsPolicy2Service.listPersonalMicData(cycleBeginDate, guildMemberId); List<GuildPolicy2PersonalVo> myMicData = guildMicStatisticsPolicy2Service.listPersonalMicData(cycleBeginDate, guildMemberId);
List<GuildPolicy2PersonalVo> myData = mergeMyDataLists(myDiamondData, myMicData); if (isCurrentOrPastCycle(cycleBeginDate, curCycleBeginDate)) {// 当前周期
guildPolicy2MyVo.setDiamondNum(guildDiamondStatisticsPolicy2Service.getTotalDiamondInCycleMember(cycleBeginDate, guildMemberId));
TreeMap<BigDecimal, GuildDiamondWagePolicy2> diamondWageMap = guildDiamondWagePolicy2Service.getDiamondWageMap(partitionEnum.getId());
GuildPolicy2SalaryVo salaryVo = guildDiamondWagePolicy2Service.getSalaryVo(diamondWageMap, guildPolicy2MyVo.getDiamondNum(), guildPolicy2MyVo.getMicDay());
guildPolicy2MyVo.setMySalary(salaryVo);
} else {
GuildDiamondStatisticsPolicy2Settle settleMap = guildDiamondStatisticsPolicy2SettleService
.groupByMemberStatDate(cycleBeginDate, partitionEnum.getId(), guildMemberId);
if (settleMap == null || !settleMap.getGuildMemberId().equals(guildMemberId)) {//历史周期是否有结算,或者不在当前公会
return BusiResult.success(guildPolicy2MyVo);
}
guildPolicy2MyVo.setDiamondNum(settleMap.getDiamondNum());
guildPolicy2MyVo.setMySalary(GuildPolicy2SalaryVo.builder()
.diamondNum(settleMap.getDiamondNum())
.micSalary(settleMap.getAnchorMicSalary())
.ownerSalary(settleMap.getOwnerSalary())
.build());
}
this.fillPersonDetailData(cycleBeginDate, guildMemberId, myMicData, guildPolicy2MyVo, partitionEnum);
return BusiResult.success(guildPolicy2MyVo);
}
private void fillPersonDetailData(String cycleBeginDate, Long guildMemberId, List<GuildPolicy2PersonalVo> myMicData, GuildPolicy2MyVo guildPolicy2MyVo, PartitionEnum partitionEnum) {
List<GuildPolicy2PersonalVo> myDiamondData = guildDiamondStatisticsPolicy2Service.listPersonalDiamondData(cycleBeginDate, guildMemberId);
List<GuildPolicy2PersonalVo> myData = this.mergeMyDataLists(myDiamondData, myMicData);
if (CollectionUtils.isNotEmpty(myData)) { if (CollectionUtils.isNotEmpty(myData)) {
guildPolicy2Vo.setMicDay(myData.stream().collect(Collectors.summingInt(GuildPolicy2PersonalVo::getMicDay))); guildPolicy2MyVo.setMicDay(myData.stream().collect(Collectors.summingInt(GuildPolicy2PersonalVo::getMicDay)));
} }
//填满整月天数
fillAllDayOfMonth(guildPolicy2Vo, myData, cycleBeginDate, partitionEnum);
if (guildAuthService.hasAuthByRoleType(partitionEnum.getClanMode(), guildMember.getRoleType(), GuildConstant.AuthCode.GUILD_POLICY2_MEMBER)) {
guildPolicy2Vo.setGuildDiamondNum(guildDiamondStatisticsPolicy2Service.getTotalDiamondInCycle(cycleBeginDate, guildMember.getGuildId()));
guildPolicy2Vo.setMemberData(guildDiamondStatisticsPolicy2Service.listMemberData(cycleBeginDate, guildMember.getGuildId()));
}
return BusiResult.success(guildPolicy2Vo);
}
public List<GuildPolicy2PersonalVo> mergeMyDataLists(List<GuildPolicy2PersonalVo> list1, List<GuildPolicy2PersonalVo> list2) {
// 处理空列表情况
if (list1 == null || list1.isEmpty()) return list2 != null ? list2 : new ArrayList<>();
if (list2 == null || list2.isEmpty()) return list1;
// 合并两个列表并按statDate分组
Map<String, GuildPolicy2PersonalVo> mergedMap = Stream.concat(list1.stream(), list2.stream())
.collect(Collectors.toMap(
GuildPolicy2PersonalVo::getStatDate,
vo -> vo,
(vo1, vo2) -> {
// 合并相同statDate的对象
GuildPolicy2PersonalVo merged = new GuildPolicy2PersonalVo();
merged.setStatDate(vo1.getStatDate());
merged.setDiamondNum(vo1.getDiamondNum().add(vo2.getDiamondNum()));
merged.setMicMinute(vo1.getMicMinute() + vo2.getMicMinute());
merged.setMicDay(vo1.getMicDay() + vo2.getMicDay());
merged.setValidMicDay(vo1.getValidMicDay() || vo2.getValidMicDay());
return merged;
}
));
return new ArrayList<>(mergedMap.values());
}
private void fillAllDayOfMonth(GuildPolicy2Vo guildPolicy2Vo, List<GuildPolicy2PersonalVo> myData, String cycleBeginDate, PartitionEnum partitionEnum) {
List<GuildPolicy2PersonalVo> resultMyDate = new ArrayList<>(); List<GuildPolicy2PersonalVo> resultMyDate = new ArrayList<>();
ZonedDateTime nowZoneDateTime = DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId()); ZonedDateTime nowZoneDateTime = DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId());
Map<String, GuildPolicy2PersonalVo> realMap = new HashMap<>(); Map<String, GuildPolicy2PersonalVo> realMap = new HashMap<>();
@@ -160,7 +177,117 @@ public class GuildPolicy2Service {
resultMyDate.add(guildPolicy2PersonalVo); resultMyDate.add(guildPolicy2PersonalVo);
monthEnd = DateUtil.offsetDay(monthEnd, -1); monthEnd = DateUtil.offsetDay(monthEnd, -1);
} }
guildPolicy2Vo.setMyData(resultMyDate); guildPolicy2MyVo.setMyData(resultMyDate);
}
//合并流水与在麦天数数据
private List<GuildPolicy2PersonalVo> mergeMyDataLists(List<GuildPolicy2PersonalVo> list1, List<GuildPolicy2PersonalVo> list2) {
// 处理空列表情况
if (list1 == null || list1.isEmpty()) return list2 != null ? list2 : new ArrayList<>();
if (list2 == null || list2.isEmpty()) return list1;
// 合并两个列表并按statDate分组
Map<String, GuildPolicy2PersonalVo> mergedMap = Stream.concat(list1.stream(), list2.stream())
.collect(Collectors.toMap(
GuildPolicy2PersonalVo::getStatDate,
vo -> vo,
(vo1, vo2) -> {
// 合并相同statDate的对象
GuildPolicy2PersonalVo merged = new GuildPolicy2PersonalVo();
merged.setStatDate(vo1.getStatDate());
merged.setDiamondNum(vo1.getDiamondNum().add(vo2.getDiamondNum()));
merged.setMicMinute(vo1.getMicMinute() + vo2.getMicMinute());
merged.setMicDay(vo1.getMicDay() + vo2.getMicDay());
merged.setValidMicDay(vo1.getValidMicDay() || vo2.getValidMicDay());
return merged;
}
));
return new ArrayList<>(mergedMap.values());
}
public BusiResult<GuildPolicy2AgencyVo> getGuildMemberPolicy2(Long uid, String cycleBeginDate) {
GuildPolicy2AgencyVo guildPolicy2AgencyVo = new GuildPolicy2AgencyVo();
guildPolicy2AgencyVo.setCycleDate(cycleBeginDate);
GuildMember guildMember = this.validateAndGetGuildMember(uid);
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(guildMember.getPartitionId());
if (!guildAuthService.hasAuthByRoleType(partitionEnum.getClanMode(), guildMember.getRoleType(),
GuildConstant.AuthCode.GUILD_POLICY2_MEMBER)){
return BusiResult.success(guildPolicy2AgencyVo);
}
String curCycleBeginDate = FullMonthCycleTimeUtil.getCycleDate(DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId()));
if (isCurrentOrPastCycle(cycleBeginDate, curCycleBeginDate)) {// 当前周期
TreeMap<BigDecimal, GuildDiamondWagePolicy2> diamondWageMap = guildDiamondWagePolicy2Service.getDiamondWageMap(partitionEnum.getId());
guildPolicy2AgencyVo.setDiamondNum(guildDiamondStatisticsPolicy2Service.getTotalDiamondInCycle(cycleBeginDate, guildMember.getGuildId()));
List<GuildPolicy2MemberVo> memberData = guildDiamondStatisticsPolicy2Service.listMemberData(cycleBeginDate, guildMember.getGuildId());
guildPolicy2AgencyVo.setMemberData(memberData);
if (CollectionUtils.isEmpty(memberData)) {
return BusiResult.success(guildPolicy2AgencyVo);
}
List<Long> uids = memberData.stream().map(GuildPolicy2MemberVo::getUid).collect(Collectors.toList());
Date cycleBegin = DateUtil.beginOfDay(DateUtil.parseDate(cycleBeginDate));
Date cycleEnd = DateUtil.endOfMonth(cycleBegin);
Date beginOfMonth = DateTimeUtil.convertToEastEightZone(cycleBegin, partitionEnum.getZoneId());
Date endOfMonth = DateTimeUtil.convertToEastEightZone(cycleEnd, partitionEnum.getZoneId());
Map<Long, ChargeRecord> refundGroupUidDateMap = chargeRecordService.getRefundGroupUidDateMap(uids, beginOfMonth, endOfMonth);
memberData.forEach(item -> {
GuildDiamondWagePolicy2 diamondWageVo = guildDiamondWagePolicy2Service.calDiamondWageVo(diamondWageMap, item.getDiamondNum(), item.getMicDay());
item.setDiamondSalary(item.getDiamondSalary().add(diamondWageVo.getAnchorDiamondSalary()));
item.setMicSalary(item.getMicSalary().add(diamondWageVo.getAnchorMicSalary()));
item.setOwnerSalary(item.getOwnerSalary().add(diamondWageVo.getOwnerSalary()));
ChargeRecord chargeRecord = refundGroupUidDateMap.get(item.getUid());
item.setIssueSalary(this.getIssiueSalary(chargeRecord));
});
GuildPolicy2SalaryVo salaryVo = new GuildPolicy2SalaryVo();
salaryVo.setDiamondSalary(memberData.stream().map(GuildPolicy2MemberVo::getDiamondSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
salaryVo.setMicSalary(memberData.stream().map(GuildPolicy2MemberVo::getMicSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
salaryVo.setOwnerSalary(memberData.stream().map(GuildPolicy2MemberVo::getOwnerSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
salaryVo.setIssueSalary(memberData.stream().map(GuildPolicy2MemberVo::getIssueSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
guildPolicy2AgencyVo.setGuildSalary(salaryVo);
} else {
List<GuildDiamondStatisticsPolicy2Settle> settleList = guildDiamondStatisticsPolicy2SettleService
.groupByGuildMemberStatDate(cycleBeginDate, partitionEnum.getId(), guildMember.getGuildId());
if (CollectionUtils.isEmpty(settleList)) {
return BusiResult.success(guildPolicy2AgencyVo);
}
List<GuildPolicy2MemberVo> memberData = guildPolicy2AgencyVo.getMemberData();
List<Long> uids = settleList.stream().map(GuildDiamondStatisticsPolicy2Settle::getUid).collect(Collectors.toList());
Map<Long, Users> usersMap = usersService.getUsersMapByUids(uids);
for (GuildDiamondStatisticsPolicy2Settle policy2Settle : settleList) {
GuildPolicy2MemberVo memberVo = new GuildPolicy2MemberVo();
memberVo.setUid(policy2Settle.getUid());
memberVo.setMicDay(policy2Settle.getMicDay());
memberVo.setDiamondNum(policy2Settle.getDiamondNum());
memberVo.setDiamondSalary(policy2Settle.getAnchorSalary());
memberVo.setMicSalary(policy2Settle.getAnchorMicSalary());
memberVo.setOwnerSalary(policy2Settle.getOwnerSalary());
memberVo.setIssueSalary(policy2Settle.getIssueSalary());
Users users = usersMap.get(memberVo.getUid());
if (null != users) {
memberVo.setNick(users.getNick());
memberVo.setErbanNo(users.getErbanNo());
memberVo.setAvatar(users.getAvatar());
}
memberData.add(memberVo);
}
GuildPolicy2SalaryVo salaryVo = new GuildPolicy2SalaryVo();
salaryVo.setDiamondSalary(memberData.stream().map(GuildPolicy2MemberVo::getDiamondSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
salaryVo.setMicSalary(memberData.stream().map(GuildPolicy2MemberVo::getMicSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
salaryVo.setOwnerSalary(memberData.stream().map(GuildPolicy2MemberVo::getOwnerSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
salaryVo.setIssueSalary(memberData.stream().map(GuildPolicy2MemberVo::getIssueSalary).reduce(BigDecimal.ZERO, BigDecimal::add));
guildPolicy2AgencyVo.setDiamondNum(memberData.stream().map(GuildPolicy2MemberVo::getDiamondNum).reduce(BigDecimal.ZERO, BigDecimal::add));
guildPolicy2AgencyVo.setGuildSalary(salaryVo);
}
return BusiResult.success(guildPolicy2AgencyVo);
} }
public BusiResult<List<CycleDateVo>> getCycleDatesV2(Integer partitionId) { public BusiResult<List<CycleDateVo>> getCycleDatesV2(Integer partitionId) {
@@ -288,7 +415,7 @@ public class GuildPolicy2Service {
} }
public void settle(PartitionEnum partitionEnum, String cycleDate) { public void settle(PartitionEnum partitionEnum, String cycleDate) {
if (!GUILD_POLICY2.equals(partitionEnum.getClanMode())) { if (!GUILD_POLICY2.equals(partitionEnum.getClanMode()) || StringUtils.isEmpty(cycleDate)) {
log.info("GuildPolicy2Service.settle partitionEnum:{}, clanMode:{} cycleDate:{}", partitionEnum, partitionEnum.getClanMode(), cycleDate); log.info("GuildPolicy2Service.settle partitionEnum:{}, clanMode:{} cycleDate:{}", partitionEnum, partitionEnum.getClanMode(), cycleDate);
return; return;
} }
@@ -298,6 +425,14 @@ public class GuildPolicy2Service {
log.info("Policy2Settle.emptyData"); log.info("Policy2Settle.emptyData");
return; return;
} }
Date cycleBegin = DateUtil.beginOfDay(DateUtil.parseDate(cycleDate));
Date cycleEnd = DateUtil.endOfMonth(cycleBegin);
Date beginOfMonth = DateTimeUtil.convertToEastEightZone(cycleBegin, partitionEnum.getZoneId());
Date endOfMonth = DateTimeUtil.convertToEastEightZone(cycleEnd, partitionEnum.getZoneId());
List<Long> uids = list.stream().map(GuildDiamondStatisticsPolicy2Settle::getUid).collect(Collectors.toList());
Map<Long, ChargeRecord> refundGroupUidDateMap = chargeRecordService.getRefundGroupUidDateMap(uids, beginOfMonth, endOfMonth);
Date date = new Date(); Date date = new Date();
TreeMap<BigDecimal, GuildDiamondWagePolicy2> diamondWageMap = guildDiamondWagePolicy2Service.getDiamondWageMap(partitionId); TreeMap<BigDecimal, GuildDiamondWagePolicy2> diamondWageMap = guildDiamondWagePolicy2Service.getDiamondWageMap(partitionId);
for (GuildDiamondStatisticsPolicy2Settle settle : list) { for (GuildDiamondStatisticsPolicy2Settle settle : list) {
@@ -311,6 +446,8 @@ public class GuildPolicy2Service {
settle.setAnchorSalary(diamondWagePolicy2.getAnchorDiamondSalary()); settle.setAnchorSalary(diamondWagePolicy2.getAnchorDiamondSalary());
settle.setOwnerSalary(diamondWagePolicy2.getOwnerSalary()); settle.setOwnerSalary(diamondWagePolicy2.getOwnerSalary());
settle.setAnchorMicSalary(diamondWagePolicy2.getAnchorMicSalary()); settle.setAnchorMicSalary(diamondWagePolicy2.getAnchorMicSalary());
ChargeRecord chargeRecord = refundGroupUidDateMap.get(settle.getUid());
settle.setIssueSalary(this.getIssiueSalary(chargeRecord));
} }
guildDiamondStatisticsPolicy2SettleService.saveBatch(list); guildDiamondStatisticsPolicy2SettleService.saveBatch(list);
} }

View File

@@ -138,20 +138,19 @@ public class ExtraDiamondDayService {
boolean updateBatchById = guildExtraDiamondDayService.updateBatchById(guildExtraDiamondDays); boolean updateBatchById = guildExtraDiamondDayService.updateBatchById(guildExtraDiamondDays);
if (!updateBatchById) { if (!updateBatchById) {
} }
Map<Long, BigDecimal> sendGoldMap = new HashMap<>(); HashSet<Long> uids = new HashSet<>();
for (GuildExtraDiamondDay extraDiamondDay : guildExtraDiamondDays) { for (GuildExtraDiamondDay extraDiamondDay : guildExtraDiamondDays) {
BigDecimal sendGold = BigDecimal.ZERO;
if (extraDiamondDay.getAnchorExtraNum().compareTo(BigDecimal.ZERO) > 0) { if (extraDiamondDay.getAnchorExtraNum().compareTo(BigDecimal.ZERO) > 0) {
userPurseService.addGold(extraDiamondDay.getUid(), extraDiamondDay.getAnchorExtraNum().doubleValue(), ANCHOR_EXTRA_GOLD); userPurseService.addGold(extraDiamondDay.getUid(), extraDiamondDay.getAnchorExtraNum().doubleValue(), ANCHOR_EXTRA_GOLD);
sendGold = sendGold.add(extraDiamondDay.getAnchorExtraNum()); uids.add(extraDiamondDay.getUid());
} }
if (extraDiamondDay.getAnchorExtraLuckyNum().compareTo(BigDecimal.ZERO) > 0) { if (extraDiamondDay.getAnchorExtraLuckyNum().compareTo(BigDecimal.ZERO) > 0) {
userPurseService.addGold(extraDiamondDay.getUid(), extraDiamondDay.getAnchorExtraLuckyNum().doubleValue(), ANCHOR_EXTRA_LUCKY_GOLD); userPurseService.addGold(extraDiamondDay.getUid(), extraDiamondDay.getAnchorExtraLuckyNum().doubleValue(), ANCHOR_EXTRA_LUCKY_GOLD);
sendGold = sendGold.add(extraDiamondDay.getAnchorExtraLuckyNum()); uids.add(extraDiamondDay.getUid());
} }
sendGoldMap.put(extraDiamondDay.getUid(), sendGold);
} }
this.sendMessage(I18nAlertEnum.EXTRA_GUILD_MEMBER_MSG, sendGoldMap, partitionId); String message = I18NMessageSourceUtil.getMessage(I18nAlertEnum.EXTRA_GUILD_MEMBER_MSG, partitionId);
this.sendMessage(message, uids);
} }
} catch (Exception e) { } catch (Exception e) {
log.error("sendGuildMemberExtraDiamondTask anchor error" , e); log.error("sendGuildMemberExtraDiamondTask anchor error" , e);
@@ -205,14 +204,15 @@ public class ExtraDiamondDayService {
ownerExtra = ownerExtra == null ? add : ownerExtra.add(add); ownerExtra = ownerExtra == null ? add : ownerExtra.add(add);
ownerExtraMap.put(ownerUid, ownerExtra); ownerExtraMap.put(ownerUid, ownerExtra);
} }
Map<Long, BigDecimal> sendGoldMap = new HashMap<>(); HashSet<Long> uids = new HashSet<>();
for (Map.Entry<Long, BigDecimal> decimalEntry : ownerExtraMap.entrySet()) { for (Map.Entry<Long, BigDecimal> decimalEntry : ownerExtraMap.entrySet()) {
if (decimalEntry.getValue().compareTo(BigDecimal.ZERO) > 0) { if (decimalEntry.getValue().compareTo(BigDecimal.ZERO) > 0) {
userPurseService.addGold(decimalEntry.getKey(), decimalEntry.getValue().doubleValue(), OWNER_EXTRA_GOLD); userPurseService.addGold(decimalEntry.getKey(), decimalEntry.getValue().doubleValue(), OWNER_EXTRA_GOLD);
sendGoldMap.put(decimalEntry.getKey(), decimalEntry.getValue()); uids.add(decimalEntry.getKey());
} }
} }
this.sendMessage(I18nAlertEnum.EXTRA_GUILD_MSG, sendGoldMap, partitionId); String message = I18NMessageSourceUtil.getMessage(I18nAlertEnum.EXTRA_GUILD_MSG, partitionId);
this.sendMessage(message, uids);
} }
} catch (Exception e) { } catch (Exception e) {
log.error("sendGuildExtraDiamondTask anchor error" , e); log.error("sendGuildExtraDiamondTask anchor error" , e);
@@ -258,17 +258,18 @@ public class ExtraDiamondDayService {
}, },
BigDecimal::add BigDecimal::add
)); ));
Map<Long, BigDecimal> sendGoldMap = new HashMap<>(); HashSet<Long> uids = new HashSet<>();
extraDiamondMap.entrySet().stream() extraDiamondMap.entrySet().stream()
.filter(entry -> entry.getValue().compareTo(BigDecimal.ZERO) > 0) .filter(entry -> entry.getValue().compareTo(BigDecimal.ZERO) > 0)
.forEach(entry -> { .forEach(entry -> {
Long roomUid = entry.getKey(); Long roomUid = entry.getKey();
BigDecimal extraDiamond = entry.getValue(); BigDecimal extraDiamond = entry.getValue();
userPurseService.addGold(roomUid, extraDiamond.doubleValue(), ROOM_EXTRA_GOLD); userPurseService.addGold(roomUid, extraDiamond.doubleValue(), ROOM_EXTRA_GOLD);
sendGoldMap.put(roomUid, extraDiamond); uids.add(roomUid);
}); });
this.sendMessage(I18nAlertEnum.EXTRA_ROOM_MSG, sendGoldMap, partitionId); String message = I18NMessageSourceUtil.getMessage(I18nAlertEnum.EXTRA_GUILD_MEMBER_MSG, partitionId);
this.sendMessage(message, uids);
} catch (Exception e) { } catch (Exception e) {
log.error("sendLastDayDiamondtask room error" , e); log.error("sendLastDayDiamondtask room error" , e);
} finally { } finally {
@@ -279,13 +280,9 @@ public class ExtraDiamondDayService {
} }
@Async @Async
public void sendMessage(I18nAlertEnum msg, Map<Long, BigDecimal> sendGoldMap, Integer partitionId) { public void sendMessage(String msg, Set<Long> uids) {
sendGoldMap.entrySet().forEach(entry -> { uids.forEach(uid -> {
if (entry.getValue().compareTo(BigDecimal.ZERO) <= 0) { baseSendService.sendSystemMsg(uid.toString(), msg);
return;
}
String message = I18NMessageSourceUtil.getMessage(msg, new Object[]{entry.getValue()}, partitionId);
baseSendService.sendSystemMsg(entry.getKey().toString(), message);
}); });
} }
} }

View File

@@ -1,48 +0,0 @@
<?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

@@ -59,4 +59,30 @@
group by gm.id group by gm.id
ORDER BY diamondNum desc ORDER BY diamondNum desc
</select> </select>
<select id="groupByMemberStatDate" resultType="com.accompany.business.model.guildpolicy2.GuildDiamondStatisticsPolicy2Settle">
select
cycle_date cycleDate,
partition_id partitionId,
guild_member_id guildMemberId,
guild_id guildId,
uid uid,
diamond_num diamondNum,
mic_minutes micMinutes,
mic_day micDay,
issue_salary issueSalary,
anchor_salary anchorSalary,
anchor_mic_salary anchorMicSalary,
owner_salary ownerSalary
from guild_diamond_statistics_policy2_settle
where partition_id = #{partitionId}
and cycle_date = #{cycleDate}
<if test="guildMemberId != null">
and guild_member_id = #{guildMemberId}
</if>
<if test="guildId != null">
and guild_id = #{guildId}
</if>
group by guild_member_id
</select>
</mapper> </mapper>

View File

@@ -4,7 +4,8 @@ import cn.hutool.core.date.DateUtil;
import com.accompany.business.service.guildpolicy2.GuildPolicy2Service; import com.accompany.business.service.guildpolicy2.GuildPolicy2Service;
import com.accompany.business.service.room.GuildMemberRoomMicRecordService; import com.accompany.business.service.room.GuildMemberRoomMicRecordService;
import com.accompany.business.vo.guild.CycleDateVo; import com.accompany.business.vo.guild.CycleDateVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2Vo; import com.accompany.business.vo.guildpolicy.GuildPolicy2AgencyVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2MyVo;
import com.accompany.common.annotation.Authorization; import com.accompany.common.annotation.Authorization;
import com.accompany.common.result.BusiResult; import com.accompany.common.result.BusiResult;
import com.accompany.core.enumeration.PartitionEnum; import com.accompany.core.enumeration.PartitionEnum;
@@ -39,10 +40,21 @@ public class GuildPolicy2Controller {
}) })
@Authorization @Authorization
@GetMapping("/incomeStat") @GetMapping("/incomeStat")
public BusiResult<GuildPolicy2Vo> getGuildPolicy2(@RequestHeader(PUB_UID) Long uid, String cycleBeginDate) { public BusiResult<GuildPolicy2MyVo> getGuildPolicy2(@RequestHeader(PUB_UID) Long uid, String cycleBeginDate) {
return guildPolicy2Service.getGuildPolicy2(uid, cycleBeginDate); return guildPolicy2Service.getGuildPolicy2(uid, cycleBeginDate);
} }
@ApiOperation(value = "公会成员收入统计", httpMethod = "GET")
@ApiImplicitParams({
@ApiImplicitParam(name = "cycleBeginDate", value = "周期开始日期yyyy-MM-dd", required = true, dataType = "String", paramType = "query")
})
@Authorization
@GetMapping("/memberIncomeStat")
public BusiResult<GuildPolicy2AgencyVo> getGuildMemberPolicy2(@RequestHeader(PUB_UID) Long uid, String cycleBeginDate) {
return guildPolicy2Service.getGuildMemberPolicy2(uid, cycleBeginDate);
}
@GetMapping("/cycleDates") @GetMapping("/cycleDates")
public BusiResult<List<CycleDateVo>> getCycleDates(@RequestHeader(PUB_UID) Long uid) { public BusiResult<List<CycleDateVo>> getCycleDates(@RequestHeader(PUB_UID) Long uid) {
return guildPolicy2Service.getCycleDates(uid); return guildPolicy2Service.getCycleDates(uid);