公会钻石流水薪资明细

This commit is contained in:
2025-08-13 16:22:40 +08:00
parent 2c093030c0
commit 90add981b1
10 changed files with 250 additions and 6 deletions

View File

@@ -74,7 +74,7 @@ public class GuildDiamondStatisticsDayAdminService {
Page<GuildDiamondStatisticsDayVo> guildDiamondStatisticsDayPage;
if (GUILD_POLICY2.equals(partitionEnum.getClanMode())) {
guildDiamondStatisticsDayPage =
guildDiamondStatisticsPolicy2Service.listByStatDate(startDate, endDate, partitionId, regionId, guildId, pageNo, pageSize, inviteUid);
guildDiamondStatisticsPolicy2Service.listByStatDate4OldPolicy(startDate, endDate, partitionId, regionId, guildId, pageNo, pageSize, inviteUid);
} else {
guildDiamondStatisticsDayPage =
guildDiamondStatisticsDayService.listByStatDate(startDate, endDate, partitionId, regionId, guildId, pageNo, pageSize, inviteUid);

View File

@@ -0,0 +1,73 @@
package com.accompany.admin.service.guildpolicy2;
import com.accompany.business.model.guild.Guild;
import com.accompany.business.model.guildpolicy2.GuildDiamondWagePolicy2;
import com.accompany.business.service.guild.GuildService;
import com.accompany.business.service.guildpolicy2.GuildDiamondStatisticsPolicy2Service;
import com.accompany.business.service.guildpolicy2.GuildDiamondWagePolicy2Service;
import com.accompany.business.service.user.UsersService;
import com.accompany.business.vo.guildpolicy.GuildPolicy2MemberAdminVo;
import com.accompany.common.result.PageResult;
import com.accompany.core.exception.AdminServiceException;
import com.accompany.core.model.Users;
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.math.BigDecimal;
import java.util.List;
import java.util.TreeMap;
@Service
public class GuildPolicy2AdminService {
@Autowired
private GuildDiamondStatisticsPolicy2Service guildDiamondStatisticsPolicy2Service;
@Autowired
private GuildDiamondWagePolicy2Service guildDiamondWagePolicy2Service;
@Autowired
private UsersService usersService;
@Autowired
private GuildService guildService;
public PageResult<GuildPolicy2MemberAdminVo> queryMemberPage(Long ownerErbanNo, Integer guildId, Long erbanNo,
Integer partitionId, String startDate, String endDate, Integer pageNo, Integer pageSize) {
Long uid = null;
if (erbanNo != null) {
Users user = usersService.getUserByErbanNo(erbanNo);
if (user == null) {
throw new AdminServiceException("主播ID:" + erbanNo + ",不存在");
}
uid = user.getUid();
}
if (guildId == null && ownerErbanNo != null) {
Users user = usersService.getUserByErbanNo(ownerErbanNo);
if (user == null) {
throw new AdminServiceException("公会长ID:" + ownerErbanNo + ",不存在");
}
Guild vaildGuildByOwnerUid = guildService.getVaildGuildByOwnerUid(user.getUid());
if (vaildGuildByOwnerUid == null) {
throw new AdminServiceException("公会长ID:" + ownerErbanNo + ",不存在公会");
}
guildId = vaildGuildByOwnerUid.getId();
}
Page<GuildPolicy2MemberAdminVo> voPage = guildDiamondStatisticsPolicy2Service.listByStatDate(startDate, endDate, partitionId, guildId, uid, pageNo, pageSize);
List<GuildPolicy2MemberAdminVo> records = voPage.getRecords();
PageResult<GuildPolicy2MemberAdminVo> pageResult = new PageResult<>(voPage);
if (CollectionUtils.isEmpty(records)) {
return pageResult;
}
TreeMap<BigDecimal, GuildDiamondWagePolicy2> diamondWageMap = guildDiamondWagePolicy2Service.getDiamondWageMap(partitionId);
for (GuildPolicy2MemberAdminVo record : records) {
GuildDiamondWagePolicy2 diamondWagePolicy2 = guildDiamondWagePolicy2Service.calDiamondWageVo(diamondWageMap, record.getDiamondNum(), record.getMicDay());
if (diamondWagePolicy2 == null) {
continue;
}
record.setAnchorMicSalary(diamondWagePolicy2.getAnchorMicSalary());
record.setOwnerSalary(diamondWagePolicy2.getOwnerSalary());
record.setAnchorMicSalary(diamondWagePolicy2.getAnchorMicSalary());
}
return pageResult;
}
}

View File

@@ -0,0 +1,66 @@
package com.accompany.admin.controller.guildpolicy;
import com.accompany.admin.service.guildpolicy2.GuildPolicy2AdminService;
import com.accompany.business.vo.guildpolicy.GuildPolicy2MemberAdminVo;
import com.accompany.common.result.BusiResult;
import com.accompany.common.result.PageResult;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
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.RequestParam;
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 = "公会政策2", value = "公会政策2")
@RestController
@RequestMapping("/admin/guildPolicy2")
public class GuildPolicy2AdminController {
@Autowired
private GuildPolicy2AdminService guildPolicy2AdminService;
@ApiImplicitParams({
@ApiImplicitParam(name = "ownerErbanNo", value = "公会主号", required = true, dataType = "Long"),
@ApiImplicitParam(name = "guildId", value = "公会ID", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "erbanNo", value = "成员号", required = true, dataType = "Long"),
@ApiImplicitParam(name = "startDate", value = "开始时间yyyy-MM-dd", required = true, dataType = "String"),
@ApiImplicitParam(name = "endDate", value = "结束时间yyyy-MM-dd", required = true, dataType = "String"),
@ApiImplicitParam(name = "pageNo", value = "页码", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "pageSize", value = "每页数量", required = true, dataType = "Integer")
})
@ApiOperation(value = "查询公会成员薪资明细", httpMethod = "GET")
@GetMapping("/queryMemberPage")
public BusiResult<PageResult<GuildPolicy2MemberAdminVo>> queryMemberPage(Long ownerErbanNo, Integer guildId, Long erbanNo,
@RequestParam(defaultValue = "8") Integer partitionId,
String startDate, String endDate, Integer pageNo, Integer pageSize) {
PageResult<GuildPolicy2MemberAdminVo> pageResult = guildPolicy2AdminService
.queryMemberPage(ownerErbanNo, guildId, erbanNo, partitionId, startDate, endDate, pageNo, pageSize);
return BusiResult.success(pageResult);
}
@ApiOperation(value = "查询公会成员薪资明细导出", httpMethod = "GET")
@GetMapping("/queryMemberExport")
public void queryMemberExport(HttpServletResponse response, Long ownerErbanNo, Integer guildId, Long erbanNo,
Integer partitionId, String startDate, String endDate) throws IOException {
PageResult<GuildPolicy2MemberAdminVo> pageResult = guildPolicy2AdminService
.queryMemberPage(ownerErbanNo, guildId, erbanNo, partitionId, startDate, endDate, -1, -1);
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码
String excelName = URLEncoder.encode("薪资明细", StandardCharsets.UTF_8);
response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue());
EasyExcel.write(response.getOutputStream(), GuildPolicy2MemberAdminVo.class).sheet("薪资明细").doWrite(pageResult.getRows());
}
}

View File

@@ -0,0 +1,43 @@
package com.accompany.business.vo.guildpolicy;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@ApiModel
@Data
public class GuildPolicy2MemberAdminVo {
@ExcelProperty("公会id")
@ApiModelProperty("公会id")
private Integer guildId;
@ExcelProperty("公会长id")
@ApiModelProperty("公会长id")
private Long ownerErbanNo;
@ExcelProperty("主播id")
@ApiModelProperty("主播id")
private Long erbanNo;
@ExcelProperty("主播昵称")
@ApiModelProperty("主播昵称")
private String nick;
@ApiModelProperty("钻石收入")
@ExcelProperty("钻石收入")
private BigDecimal diamondNum;
@ExcelProperty("活跃时长(分钟)")
@ApiModelProperty("活跃时长(分钟)")
private Integer micMinutes;
@ExcelProperty("活跃天数")
@ApiModelProperty("活跃天数")
private Integer micDay;
@ExcelProperty("主播钻石薪资")
@ApiModelProperty("主播钻石薪资")
private BigDecimal anchorDiamondSalary;
@ExcelProperty("主播时长薪资")
@ApiModelProperty("主播时长薪资")
private BigDecimal anchorMicSalary;
@ApiModelProperty("公会长薪资")
@ExcelProperty("公会长薪资")
private BigDecimal ownerSalary;
}

View File

@@ -3,6 +3,7 @@ package com.accompany.business.mybatismapper.guildpolicy2;
import com.accompany.business.model.guildpolicy2.GuildDiamondStatisticsPolicy2;
import com.accompany.business.vo.guild.GuildDiamondStatisticsDayVo;
import com.accompany.business.vo.guild.GuildMemberDiamondStatisticsDayVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2MemberAdminVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2MemberVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2PersonalVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -39,10 +40,15 @@ public interface GuildDiamondStatisticsPolicy2Mapper extends BaseMapper<GuildDia
@Param("guildId") Integer guildId, @Param("uid") Long uid,
@Param("partitionId") Integer partitionId, @Param("regionId") Integer regionId);
Page<GuildDiamondStatisticsDayVo> listByStatDate(@Param("ipage") Page<GuildDiamondStatisticsDayVo> ipage,
Page<GuildDiamondStatisticsDayVo> listByStatDate4OldPolicy(@Param("ipage") Page<GuildDiamondStatisticsDayVo> 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);
Page<GuildPolicy2MemberAdminVo> listByStatDate(@Param("ipage") Page<GuildPolicy2MemberAdminVo> ipage,
@Param("startDate")String startDate, @Param("endDate")String endDate,
@Param("guildId") Integer guildId, @Param("uid") Long uid,
@Param("partitionId") Integer partitionIdd);
}

View File

@@ -5,6 +5,7 @@ import com.accompany.business.model.guildpolicy2.GuildDiamondStatisticsPolicy2;
import com.accompany.business.mybatismapper.guildpolicy2.GuildDiamondStatisticsPolicy2Mapper;
import com.accompany.business.vo.guild.GuildDiamondStatisticsDayVo;
import com.accompany.business.vo.guild.GuildMemberDiamondStatisticsDayVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2MemberAdminVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2MemberVo;
import com.accompany.business.vo.guildpolicy.GuildPolicy2PersonalVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -53,10 +54,16 @@ public class GuildDiamondStatisticsPolicy2Service extends ServiceImpl<GuildDiamo
return baseMapper.listMemberByStatDate(page, statDate, endDate, guildId, uid, partitionId, regionId);
}
public Page<GuildDiamondStatisticsDayVo> listByStatDate(String statDate, String endDate, Integer partitionId, Integer regionId,
public Page<GuildDiamondStatisticsDayVo> listByStatDate4OldPolicy(String statDate, String endDate, Integer partitionId, Integer regionId,
Integer guildId, Integer pageNo, Integer pageSize, Long inviteUid) {
Page<GuildDiamondStatisticsDayVo> page = new Page<>(pageNo, pageSize);
return baseMapper.listByStatDate(page, statDate, endDate, guildId, partitionId, regionId, inviteUid);
return baseMapper.listByStatDate4OldPolicy(page, statDate, endDate, guildId, partitionId, regionId, inviteUid);
}
public Page<GuildPolicy2MemberAdminVo> listByStatDate(String statDate, String endDate, Integer partitionId,
Integer guildId, Long uid, Integer pageNo, Integer pageSize) {
Page<GuildPolicy2MemberAdminVo> page = new Page<>(pageNo, pageSize);
return baseMapper.listByStatDate(page, statDate, endDate, guildId, uid, partitionId);
}
}

View File

@@ -31,6 +31,16 @@ public class GuildDiamondWagePolicy2Service extends ServiceImpl<GuildDiamondWage
return value;
}
public GuildDiamondWagePolicy2 calDiamondWageVo(TreeMap<BigDecimal, GuildDiamondWagePolicy2> diamondWageMap, BigDecimal diamond, Integer micDay) {
Map.Entry<BigDecimal, GuildDiamondWagePolicy2> curDiamondLevel = diamondWageMap.headMap(diamond, true).lastEntry();
GuildDiamondWagePolicy2 value = curDiamondLevel.getValue();
if (micDay < value.getMicDay()) {
value.setAnchorMicSalary(BigDecimal.ZERO);
}
return value;
}
public TreeMap<BigDecimal, GuildDiamondWagePolicy2> getDiamondWageMap(Integer partitionId) {
List<GuildDiamondWagePolicy2> wageList = lambdaQuery()
.eq(GuildDiamondWagePolicy2::getPartitionId, partitionId).list();

View File

@@ -35,4 +35,12 @@ public class GuildMicStatisticsPolicy2Service extends ServiceImpl<GuildMicStatis
}
return memberMicDayVos.stream().collect(Collectors.toMap(GuildMemberMicDayVo::getGuildMemberId, GuildMemberMicDayVo::getMicDay));
}
public Map<Long, GuildMemberMicDayVo> mapVoByStatDate(String statDate, String endDate, int partitionId, List<Long> guildMemberIds) {
List<GuildMemberMicDayVo> memberMicDayVos = baseMapper.groupByStatDate(statDate, endDate, partitionId, guildMemberIds);
if (CollectionUtils.isEmpty(memberMicDayVos)) {
return new HashMap<>();
}
return memberMicDayVos.stream().collect(Collectors.toMap(GuildMemberMicDayVo::getGuildMemberId, x -> x));
}
}

View File

@@ -99,7 +99,7 @@
ORDER BY gm.`enable` desc, diamondNum desc, gm.guild_id desc
</select>
<select id="listByStatDate" resultType="com.accompany.business.vo.guild.GuildDiamondStatisticsDayVo">
<select id="listByStatDate4OldPolicy" resultType="com.accompany.business.vo.guild.GuildDiamondStatisticsDayVo">
select gd.guild_id guildId,
ANY_VALUE(g.name) guildName,
sum(gd.diamond_num) diamondNum,
@@ -132,4 +132,35 @@
ORDER BY diamondNum desc,memberNum desc, gd.guild_id desc
</select>
<select id="listByStatDate" resultType="com.accompany.business.vo.guildpolicy.GuildPolicy2MemberAdminVo">
select gd.guild_id guildId,
ANY_VALUE(u.erban_no) ownerErbanNo,
ANY_VALUE(um.erban_no) erbanNo,
ANY_VALUE(um.nick) nick,
sum(gd.diamond_num) diamondNum,
ifnull(sum(gmp.mic_minutes), 0) micMinutes,
COUNT(DISTINCT CASE WHEN gmp.mic_minutes >= 120 THEN gdsp.stat_date END) AS micDay
from guild_diamond_statistics_policy2 gd
left join guild_mic_statistics_policy2 gmp on gmp.guild_member_id = gd.guild_member_id
and gmp.stat_date &gt;= #{startDate}
and gmp.stat_date &lt;= #{endDate}
left join users um on um.uid = gd.uid
left join guild_member gm on gm.uid = gd.uid
left join guild g on g.id = gd.guild_id
left join users u on u.uid = g.owner_uid
where gm.`enable` = 1 and gd.stat_date &gt;= #{startDate}
and gd.stat_date &lt;= #{endDate}
<if test="partitionId != null">
and gd.partition_id = #{partitionId}
</if>
<if test="guildId != null">
and gd.guild_id = #{guildId}
</if>
<if test="uid != null">
and gd.uid = #{uid}
</if>
group by gd.uid
ORDER BY diamondNum desc
</select>
</mapper>

View File

@@ -13,7 +13,7 @@
<select id="groupByStatDate" resultType="com.accompany.business.vo.guildpolicy.GuildMemberMicDayVo">
select guild_member_id guildMemberId,
mic_minutes micMinutes,
sum(mic_minutes) micMinutes,
COUNT(DISTINCT CASE WHEN mic_minutes >= 120 THEN stat_date END) AS micDay
from guild_mic_statistics_policy2
where stat_date >= #{statDate} and stat_date &lt;= #{endDate}