Compare commits
53 Commits
aed0db32f7
...
dev
Author | SHA1 | Date | |
---|---|---|---|
6f5dc9cdb7 | |||
eb9254e0e0 | |||
a42eac5619 | |||
2da21820da | |||
52b79449f8 | |||
8b7728f705 | |||
5e72759177 | |||
c33c444e1f | |||
63e339c40a | |||
2014a01c7b | |||
d99dbe96d1 | |||
abcb90315c | |||
72a66ce628 | |||
da69ed63a8 | |||
754031c039 | |||
0d5e1c5cda | |||
45ee2a163f | |||
9670fe8e86 | |||
0c52961043 | |||
991a245d41 | |||
d53afa7423 | |||
37fb11f45b | |||
c0ca68f20b | |||
48531e353d | |||
accafa97cd | |||
684192bf6c | |||
68fdd6e991 | |||
32677520ac | |||
85f512c12c | |||
25269feaf0 | |||
cd4a62fdd9 | |||
f747974578 | |||
0d0f6b7ced | |||
da71e06374 | |||
cbb742a26e | |||
383e64fef4 | |||
0062bbf995 | |||
c568e38b8e | |||
e5b375b603 | |||
ed61992c9d | |||
a4768691bb | |||
230f81fd98 | |||
4564cfbbf2 | |||
3ebfa34e88 | |||
bccd82f021 | |||
b4a3e3f37a | |||
7819a92f27 | |||
4184e3210c | |||
89bea63b86 | |||
d4c256c522 | |||
37fc0a79c3 | |||
a788956f90 | |||
c19589c674 |
@@ -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;
|
||||
}
|
||||
|
||||
}
|
@@ -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/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());
|
||||
}
|
||||
|
||||
}
|
@@ -1903,7 +1903,7 @@ public class Constant {
|
||||
public static final Byte invalid = 0; //无效
|
||||
}
|
||||
|
||||
public static String DEFAULT_DOMAIN = "https://img.molistar.xyz";
|
||||
public static String DEFAULT_DOMAIN = "https://cdn.moliparty.com";
|
||||
public static String DEFAULT_NICK = "Platform New User";
|
||||
public static String DEFAULT_AVATAR = DEFAULT_DOMAIN + "/default_avatar_molistar.png";
|
||||
public static String DEFAULT_CAR = DEFAULT_DOMAIN + "/default_car.png";
|
||||
|
@@ -38,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";
|
||||
@@ -65,6 +66,7 @@ public class DateTimeUtil {
|
||||
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 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");
|
||||
|
||||
@@ -1148,4 +1150,19 @@ public class DateTimeUtil {
|
||||
return Date.from(eastEightZonedDateTime.toInstant());
|
||||
}
|
||||
|
||||
public static Date convertToEastEightZone(Date date, String originalZoneId) {
|
||||
ZonedDateTime cycleBeginDateZoneDate = DateTimeUtil.convertWithZoneId(date, originalZoneId);
|
||||
// 2. 转换为东八区时间
|
||||
ZonedDateTime eastEightZonedDateTime = cycleBeginDateZoneDate
|
||||
.withZoneSameInstant(ZoneId.of("Asia/Shanghai"));
|
||||
|
||||
// 3. 返回Date对象
|
||||
return Date.from(eastEightZonedDateTime.toInstant());
|
||||
}
|
||||
|
||||
public static String getDayHourDate(Date time, String zoneId) {
|
||||
ZonedDateTime zdt = DateTimeUtil.convertWithZoneId(time, zoneId);
|
||||
return zdt.format(dayHourFormatter);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -319,9 +319,9 @@ public enum I18nAlertEnum {
|
||||
GOLD_BEAN_NAME("Gold Bean"),
|
||||
DIAMOND_NAME("DIAMOND"),
|
||||
GUILD_CREATE_TASK_MSG("你在公会的卓越表现,获得了精美奖励。快去背包看看吧!"),
|
||||
EXTRA_GUILD_MSG("你的钻石奖励已经发放,请注意查收。"),
|
||||
EXTRA_GUILD_MEMBER_MSG("你的钻石奖励已经发放,请注意查收。"),
|
||||
EXTRA_ROOM_MSG("你的钻石奖励已经发放,请注意查收。"),
|
||||
EXTRA_GUILD_MSG("尊敬的用户,根据政策,您的公会长次日奖励{0}钻石已到账,您可以前往【我的钱包】查看。"),
|
||||
EXTRA_GUILD_MEMBER_MSG("尊敬的用户,根据政策,您的主播次日奖励{0}钻石已到账,您可以前往【我的钱包】查看。"),
|
||||
EXTRA_ROOM_MSG("尊敬的用户,根据政策,您每周一结算的奖励{0}钻石已到账,您可以前往【我的钱包】查看。"),
|
||||
;
|
||||
|
||||
private final String defaultStr;
|
||||
|
@@ -82,4 +82,7 @@ public interface ChargeRecordMapperMgr {
|
||||
@Param("startTime") Date startTime, @Param("endTime") Date endTime);
|
||||
List<ChargeRecord> getAllChargeUserAmount(@Param("list") List<Long> uids, @Param("startTime") Date startTime,
|
||||
@Param("endTime") Date endTime);
|
||||
|
||||
List<ChargeRecord> getRefundGroupUidDateMap(@Param("uids") List<Long> uids, @Param("startTime") Date startTime,
|
||||
@Param("endTime") Date endTime);
|
||||
}
|
||||
|
@@ -19,7 +19,11 @@ import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
public class ChargeRecordService extends BaseService {
|
||||
@@ -177,4 +181,12 @@ public class ChargeRecordService extends BaseService {
|
||||
public ChargeRecordMapper getChargeRecordMapper() {
|
||||
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()));
|
||||
}
|
||||
}
|
||||
|
@@ -399,4 +399,18 @@
|
||||
group by uid
|
||||
</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 >= #{startTime}
|
||||
and create_time < #{endTime}
|
||||
<foreach collection="uids" item="u" open="and uid in(" separator="," close=")">
|
||||
#{u}
|
||||
</foreach>
|
||||
group by uid
|
||||
</select>
|
||||
|
||||
</mapper>
|
@@ -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;
|
||||
|
||||
|
||||
}
|
@@ -53,6 +53,10 @@ public class GuildDiamondStatisticsPolicy2Settle implements Serializable {
|
||||
* 公会长薪资
|
||||
*/
|
||||
private BigDecimal ownerSalary;
|
||||
/**
|
||||
* 问题薪资
|
||||
*/
|
||||
private BigDecimal issueSalary;
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
|
@@ -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;
|
||||
}
|
@@ -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();
|
||||
}
|
@@ -14,4 +14,12 @@ public class GuildPolicy2MemberVo extends SimpleUserVo {
|
||||
private BigDecimal diamondNum;
|
||||
@ApiModelProperty("有效天数")
|
||||
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;
|
||||
}
|
||||
|
@@ -10,23 +10,22 @@ import java.util.List;
|
||||
|
||||
@ApiModel
|
||||
@Data
|
||||
public class GuildPolicy2Vo {
|
||||
public class GuildPolicy2MyVo {
|
||||
@ApiModelProperty("周期开始日期yyyy-MM-dd")
|
||||
private String cycleDate;
|
||||
@ApiModelProperty("当前")
|
||||
private String curCycleDate;
|
||||
|
||||
@ApiModelProperty("钻石数量")
|
||||
private BigDecimal diamondNum = BigDecimal.ZERO;
|
||||
|
||||
@ApiModelProperty("公会钻石数量")
|
||||
private BigDecimal guildDiamondNum = BigDecimal.ZERO;
|
||||
|
||||
@ApiModelProperty("上麦有效天数")
|
||||
private Integer micDay = 0;
|
||||
|
||||
@ApiModelProperty("成员数据")
|
||||
private List<GuildPolicy2MemberVo> memberData = new ArrayList<>();
|
||||
|
||||
@ApiModelProperty("我的数据")
|
||||
private List<GuildPolicy2PersonalVo> myData = new ArrayList<>();
|
||||
|
||||
@ApiModelProperty("我的薪资")
|
||||
private GuildPolicy2SalaryVo mySalary;
|
||||
|
||||
}
|
@@ -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 = "";
|
||||
|
||||
|
||||
}
|
@@ -0,0 +1,84 @@
|
||||
package com.accompany.business.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
@TableName("lucky_24_y_user")
|
||||
public class Lucky24YUser {
|
||||
|
||||
@TableId(type = IdType.INPUT)
|
||||
/**
|
||||
* 用户ID,主键
|
||||
*/
|
||||
private Long uid;
|
||||
|
||||
/**
|
||||
* 统计日期
|
||||
*/
|
||||
private String statDate;
|
||||
|
||||
/**
|
||||
* 自动染色标识
|
||||
*/
|
||||
private Integer autoDye;
|
||||
|
||||
/**
|
||||
* 管理员ID
|
||||
*/
|
||||
private Integer adminId;
|
||||
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private Byte status;
|
||||
|
||||
/**
|
||||
* 输出差值
|
||||
*/
|
||||
private Long outputDiff;
|
||||
|
||||
/**
|
||||
* 当天次数
|
||||
*/
|
||||
private Integer todayNum;
|
||||
|
||||
/**
|
||||
* 当天投产比
|
||||
*/
|
||||
private BigDecimal todayProductionRatio;
|
||||
|
||||
/**
|
||||
* 昨天次数
|
||||
*/
|
||||
private Integer yesterdayNum;
|
||||
|
||||
/**
|
||||
* 昨天投产比
|
||||
*/
|
||||
private BigDecimal yesterdayProductionRatio;
|
||||
|
||||
/**
|
||||
* 两天前次数
|
||||
*/
|
||||
private Integer twoDaysAgoNum;
|
||||
|
||||
/**
|
||||
* 两天前投产比
|
||||
*/
|
||||
private BigDecimal twoDaysAgoProductionRatio;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private Date createTime;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
private Date updateTime;
|
||||
}
|
@@ -3,10 +3,7 @@ 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.guildsoviet.ExtraDiamondDayService;
|
||||
import com.accompany.business.service.user.UsersService;
|
||||
@@ -45,6 +42,8 @@ public class SuperLuckyGiftDiamondIncomeListener implements ApplicationListener<
|
||||
private GuildDiamondStatisticsPolicy2Service guildDiamondStatisticsPolicy2Service;
|
||||
@Autowired
|
||||
private ExtraDiamondDayService extraDiamondDayService;
|
||||
@Autowired
|
||||
private GuildDiamondStatisticsHourService guildDiamondStatisticsHourService;
|
||||
|
||||
@Async
|
||||
@Override
|
||||
@@ -84,6 +83,9 @@ public class SuperLuckyGiftDiamondIncomeListener implements ApplicationListener<
|
||||
}
|
||||
//todo 时区 zoneId
|
||||
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) {
|
||||
|
@@ -0,0 +1,8 @@
|
||||
package com.accompany.business.mapper;
|
||||
|
||||
import com.accompany.business.entity.Lucky24YUser;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
public interface Lucky24YUserMapper extends BaseMapper<Lucky24YUser> {
|
||||
|
||||
}
|
@@ -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);
|
||||
}
|
@@ -24,4 +24,7 @@ public interface GuildDiamondStatisticsPolicy2SettleMapper extends BaseMapper<Gu
|
||||
@Param("startDate")String startDate,
|
||||
@Param("guildId") Integer guildId, @Param("uid") Long uid,
|
||||
@Param("partitionId") Integer partitionId);
|
||||
|
||||
List<GuildDiamondStatisticsPolicy2Settle> groupByMemberStatDate(@Param("cycleDate") String cycleDate, @Param("partitionId") Integer partitionId,
|
||||
@Param("guildMemberId") Long guildMemberId, @Param("guildId") Integer guildId);
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -52,6 +52,8 @@ public class GuildGiftRecordService extends ServiceImpl<GuildGiftRecordMapper, G
|
||||
private GuildDiamondStatisticsPolicy2Service guildDiamondStatisticsPolicy2Service;
|
||||
@Autowired
|
||||
private ExtraDiamondDayService extraDiamondDayService;
|
||||
@Autowired
|
||||
private GuildDiamondStatisticsHourService guildDiamondStatisticsHourService;
|
||||
|
||||
@Async
|
||||
public void insertGuildGiftRecord(GiftSendRecord giftSendRecord) {
|
||||
@@ -97,9 +99,11 @@ public class GuildGiftRecordService extends ServiceImpl<GuildGiftRecordMapper, G
|
||||
statDate = CycleTimeUtil.getCycleDay(createTime, partitionInfo.getZoneId());
|
||||
extraDiamondDayService.updateGuildExtraDiamond(guildMember, cycleDate, statDate, totalDiamondNum, 0D, createTime);
|
||||
}
|
||||
|
||||
guildRankService.updateRank(guildGiftRecord);
|
||||
|
||||
String dayHourDate = DateTimeUtil.getDayHourDate(createTime, partitionInfo.getZoneId());
|
||||
guildDiamondStatisticsHourService.updateHourDiamondStatistics(statDate, dayHourDate, guildMember, totalDiamondNum);
|
||||
|
||||
Date zoneTime = DateTimeUtil.withZoneSameInstant(giftSendRecord.getCreateTime(), partitionInfo.getZoneId());
|
||||
String monday = DateTimeUtil.convertDate(DateTimeUtil.getMondayDate(zoneTime), DateTimeUtil.DEFAULT_DATE_PATTERN);
|
||||
guildMemberWeekLevelRewardSelectService.addProcess(guildMember.getId(), guildMember.getPartitionId(), monday, giftSendRecord.getTotalDiamondNum());
|
||||
|
@@ -547,15 +547,12 @@ public class GuildManagerService {
|
||||
Collections.shuffle(guildList);
|
||||
guildList = guildList.subList(0, 10);
|
||||
}
|
||||
List<Integer> guildIds = guildList.stream().map(Guild::getId).collect(Collectors.toList());
|
||||
Map<Integer, GuildSSRankDetailVo> ssMarkMap = ssGuildService.getSSMarkByGuildId(partitionInfo.getId(), guildIds);
|
||||
Map<Integer, Integer> memberNumMap = guildService.getGuildMemberNumMapByGuildIds(guildIds);
|
||||
for (Guild guild: guildList){
|
||||
SimpleGuildVo vo = new SimpleGuildVo();
|
||||
vo.setGuildId(guild.getId());
|
||||
vo.setGuildName(guild.getName());
|
||||
vo.setMemberNumLimit(guild.getMemberNumLimit());
|
||||
|
||||
vo.setOwnerUid(guild.getOwnerUid());
|
||||
vo.setWeekIncome(weekIncomeMap.getOrDefault(guild.getId(), 0D));
|
||||
voList.add(vo);
|
||||
}
|
||||
|
@@ -6,6 +6,7 @@ import com.accompany.business.vo.guildpolicy.GuildPolicy2MemberAdminVo;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
@@ -31,4 +32,20 @@ public class GuildDiamondStatisticsPolicy2SettleService extends ServiceImpl<Guil
|
||||
Page<GuildPolicy2MemberAdminVo> page = new Page<>(pageNo, pageSize);
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -2,6 +2,7 @@ package com.accompany.business.service.guildpolicy2;
|
||||
|
||||
import com.accompany.business.model.guildpolicy2.GuildDiamondWagePolicy2;
|
||||
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.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -77,11 +78,35 @@ public class GuildDiamondWagePolicy2Service extends ServiceImpl<GuildDiamondWage
|
||||
if (CollectionUtils.isEmpty(wageList)){
|
||||
return map;
|
||||
}
|
||||
|
||||
for (GuildDiamondWagePolicy2 wage : wageList) {
|
||||
map.put(wage.getDiamondNum(), wage);
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -11,24 +11,26 @@ import com.accompany.business.service.guild.GuildAuthService;
|
||||
import com.accompany.business.service.guild.GuildMemberService;
|
||||
import com.accompany.business.service.guild.GuildMemberWeekLevelRewardV2Service;
|
||||
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.util.CycleTimeUtil;
|
||||
import com.accompany.business.util.FullMonthCycleTimeUtil;
|
||||
import com.accompany.business.vo.guild.CycleDateVo;
|
||||
import com.accompany.business.vo.guildpolicy.GuildPolicy2PersonalVo;
|
||||
import com.accompany.business.vo.guildpolicy.GuildPolicy2Vo;
|
||||
import com.accompany.business.vo.guildpolicy.*;
|
||||
import com.accompany.common.constant.Constant;
|
||||
import com.accompany.common.result.BusiResult;
|
||||
import com.accompany.common.status.BusiStatus;
|
||||
import com.accompany.common.utils.DateTimeUtil;
|
||||
import com.accompany.common.utils.StringUtils;
|
||||
import com.accompany.core.enumeration.BillObjTypeEnum;
|
||||
import com.accompany.core.enumeration.PartitionEnum;
|
||||
import com.accompany.core.exception.ServiceException;
|
||||
import com.accompany.core.model.Users;
|
||||
import com.accompany.payment.model.ChargeRecord;
|
||||
import com.accompany.payment.service.ChargeRecordService;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@@ -54,8 +56,6 @@ public class GuildPolicy2Service {
|
||||
@Autowired
|
||||
private GuildAuthService guildAuthService;
|
||||
@Autowired
|
||||
private RoomMicService roomMicService;
|
||||
@Autowired
|
||||
private GuildMicStatisticsPolicy2Service guildMicStatisticsPolicy2Service;
|
||||
@Autowired
|
||||
private UsersService usersService;
|
||||
@@ -73,10 +73,13 @@ public class GuildPolicy2Service {
|
||||
private GuildDiamondWagePolicy2Service guildDiamondWagePolicy2Service;
|
||||
@Autowired
|
||||
private GuildDiamondStatisticsPolicy2SettleService guildDiamondStatisticsPolicy2SettleService;
|
||||
public BusiResult<GuildPolicy2Vo> getGuildPolicy2(Long uid, String cycleBeginDate) {
|
||||
GuildPolicy2Vo guildPolicy2Vo = new GuildPolicy2Vo();
|
||||
guildPolicy2Vo.setCycleDate(cycleBeginDate);
|
||||
@Autowired
|
||||
private ChargeRecordService chargeRecordService;
|
||||
|
||||
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);
|
||||
if (null == guildMember){
|
||||
throw new ServiceException(BusiStatus.FAMILY_NOT_EXIST);
|
||||
@@ -87,55 +90,72 @@ public class GuildPolicy2Service {
|
||||
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();
|
||||
|
||||
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);
|
||||
Integer micDay = 0;
|
||||
if (CollectionUtils.isNotEmpty(myMicData)) {
|
||||
micDay = myMicData.stream().collect(Collectors.summingInt(GuildPolicy2PersonalVo::getMicDay));
|
||||
}
|
||||
guildPolicy2MyVo.setMicDay(micDay);
|
||||
|
||||
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(), micDay);
|
||||
guildPolicy2MyVo.setMySalary(salaryVo);
|
||||
} else {
|
||||
GuildDiamondStatisticsPolicy2Settle settleMap = guildDiamondStatisticsPolicy2SettleService
|
||||
.groupByMemberStatDate(cycleBeginDate, partitionEnum.getId(), guildMemberId);
|
||||
if (settleMap == null || !settleMap.getGuildMemberId().equals(guildMemberId)) {//历史周期是否有结算,或者不在当前公会
|
||||
return BusiResult.success(guildPolicy2MyVo);
|
||||
}
|
||||
|
||||
if (CollectionUtils.isNotEmpty(myData)) {
|
||||
guildPolicy2Vo.setMicDay(myData.stream().collect(Collectors.summingInt(GuildPolicy2PersonalVo::getMicDay)));
|
||||
guildPolicy2MyVo.setDiamondNum(settleMap.getDiamondNum());
|
||||
guildPolicy2MyVo.setMySalary(GuildPolicy2SalaryVo.builder()
|
||||
.diamondNum(settleMap.getDiamondNum())
|
||||
.diamondSalary(settleMap.getAnchorSalary())
|
||||
.micSalary(settleMap.getAnchorMicSalary())
|
||||
.ownerSalary(settleMap.getOwnerSalary())
|
||||
.micDay(micDay)
|
||||
.build());
|
||||
}
|
||||
|
||||
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);
|
||||
this.fillPersonDetailData(cycleBeginDate, guildMemberId, myMicData, guildPolicy2MyVo, partitionEnum, micDay);
|
||||
return BusiResult.success(guildPolicy2MyVo);
|
||||
}
|
||||
|
||||
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) {
|
||||
private void fillPersonDetailData(String cycleBeginDate, Long guildMemberId, List<GuildPolicy2PersonalVo> myMicData, GuildPolicy2MyVo guildPolicy2MyVo, PartitionEnum partitionEnum, Integer micDay) {
|
||||
List<GuildPolicy2PersonalVo> myDiamondData = guildDiamondStatisticsPolicy2Service.listPersonalDiamondData(cycleBeginDate, guildMemberId);
|
||||
List<GuildPolicy2PersonalVo> myData = this.mergeMyDataLists(myDiamondData, myMicData);
|
||||
//填满整月天数
|
||||
List<GuildPolicy2PersonalVo> resultMyDate = new ArrayList<>();
|
||||
ZonedDateTime nowZoneDateTime = DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId());
|
||||
Map<String, GuildPolicy2PersonalVo> realMap = new HashMap<>();
|
||||
@@ -160,7 +180,117 @@ public class GuildPolicy2Service {
|
||||
resultMyDate.add(guildPolicy2PersonalVo);
|
||||
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) {
|
||||
@@ -288,7 +418,7 @@ public class GuildPolicy2Service {
|
||||
}
|
||||
|
||||
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);
|
||||
return;
|
||||
}
|
||||
@@ -298,6 +428,14 @@ public class GuildPolicy2Service {
|
||||
log.info("Policy2Settle.emptyData");
|
||||
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();
|
||||
TreeMap<BigDecimal, GuildDiamondWagePolicy2> diamondWageMap = guildDiamondWagePolicy2Service.getDiamondWageMap(partitionId);
|
||||
for (GuildDiamondStatisticsPolicy2Settle settle : list) {
|
||||
@@ -311,6 +449,8 @@ public class GuildPolicy2Service {
|
||||
settle.setAnchorSalary(diamondWagePolicy2.getAnchorDiamondSalary());
|
||||
settle.setOwnerSalary(diamondWagePolicy2.getOwnerSalary());
|
||||
settle.setAnchorMicSalary(diamondWagePolicy2.getAnchorMicSalary());
|
||||
ChargeRecord chargeRecord = refundGroupUidDateMap.get(settle.getUid());
|
||||
settle.setIssueSalary(this.getIssiueSalary(chargeRecord));
|
||||
}
|
||||
guildDiamondStatisticsPolicy2SettleService.saveBatch(list);
|
||||
}
|
||||
|
@@ -138,19 +138,20 @@ public class ExtraDiamondDayService {
|
||||
boolean updateBatchById = guildExtraDiamondDayService.updateBatchById(guildExtraDiamondDays);
|
||||
if (!updateBatchById) {
|
||||
}
|
||||
HashSet<Long> uids = new HashSet<>();
|
||||
Map<Long, BigDecimal> sendGoldMap = new HashMap<>();
|
||||
for (GuildExtraDiamondDay extraDiamondDay : guildExtraDiamondDays) {
|
||||
BigDecimal sendGold = BigDecimal.ZERO;
|
||||
if (extraDiamondDay.getAnchorExtraNum().compareTo(BigDecimal.ZERO) > 0) {
|
||||
userPurseService.addGold(extraDiamondDay.getUid(), extraDiamondDay.getAnchorExtraNum().doubleValue(), ANCHOR_EXTRA_GOLD);
|
||||
uids.add(extraDiamondDay.getUid());
|
||||
sendGold = sendGold.add(extraDiamondDay.getAnchorExtraNum());
|
||||
}
|
||||
if (extraDiamondDay.getAnchorExtraLuckyNum().compareTo(BigDecimal.ZERO) > 0) {
|
||||
userPurseService.addGold(extraDiamondDay.getUid(), extraDiamondDay.getAnchorExtraLuckyNum().doubleValue(), ANCHOR_EXTRA_LUCKY_GOLD);
|
||||
uids.add(extraDiamondDay.getUid());
|
||||
sendGold = sendGold.add(extraDiamondDay.getAnchorExtraLuckyNum());
|
||||
}
|
||||
sendGoldMap.put(extraDiamondDay.getUid(), sendGold);
|
||||
}
|
||||
String message = I18NMessageSourceUtil.getMessage(I18nAlertEnum.EXTRA_GUILD_MEMBER_MSG, partitionId);
|
||||
this.sendMessage(message, uids);
|
||||
this.sendMessage(I18nAlertEnum.EXTRA_GUILD_MEMBER_MSG, sendGoldMap, partitionId);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("sendGuildMemberExtraDiamondTask anchor error" , e);
|
||||
@@ -204,15 +205,14 @@ public class ExtraDiamondDayService {
|
||||
ownerExtra = ownerExtra == null ? add : ownerExtra.add(add);
|
||||
ownerExtraMap.put(ownerUid, ownerExtra);
|
||||
}
|
||||
HashSet<Long> uids = new HashSet<>();
|
||||
Map<Long, BigDecimal> sendGoldMap = new HashMap<>();
|
||||
for (Map.Entry<Long, BigDecimal> decimalEntry : ownerExtraMap.entrySet()) {
|
||||
if (decimalEntry.getValue().compareTo(BigDecimal.ZERO) > 0) {
|
||||
userPurseService.addGold(decimalEntry.getKey(), decimalEntry.getValue().doubleValue(), OWNER_EXTRA_GOLD);
|
||||
uids.add(decimalEntry.getKey());
|
||||
sendGoldMap.put(decimalEntry.getKey(), decimalEntry.getValue());
|
||||
}
|
||||
}
|
||||
String message = I18NMessageSourceUtil.getMessage(I18nAlertEnum.EXTRA_GUILD_MSG, partitionId);
|
||||
this.sendMessage(message, uids);
|
||||
this.sendMessage(I18nAlertEnum.EXTRA_GUILD_MSG, sendGoldMap, partitionId);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("sendGuildExtraDiamondTask anchor error" , e);
|
||||
@@ -258,18 +258,17 @@ public class ExtraDiamondDayService {
|
||||
},
|
||||
BigDecimal::add
|
||||
));
|
||||
HashSet<Long> uids = new HashSet<>();
|
||||
Map<Long, BigDecimal> sendGoldMap = new HashMap<>();
|
||||
extraDiamondMap.entrySet().stream()
|
||||
.filter(entry -> entry.getValue().compareTo(BigDecimal.ZERO) > 0)
|
||||
.forEach(entry -> {
|
||||
Long roomUid = entry.getKey();
|
||||
BigDecimal extraDiamond = entry.getValue();
|
||||
userPurseService.addGold(roomUid, extraDiamond.doubleValue(), ROOM_EXTRA_GOLD);
|
||||
uids.add(roomUid);
|
||||
sendGoldMap.put(roomUid, extraDiamond);
|
||||
});
|
||||
|
||||
String message = I18NMessageSourceUtil.getMessage(I18nAlertEnum.EXTRA_GUILD_MEMBER_MSG, partitionId);
|
||||
this.sendMessage(message, uids);
|
||||
this.sendMessage(I18nAlertEnum.EXTRA_ROOM_MSG, sendGoldMap, partitionId);
|
||||
} catch (Exception e) {
|
||||
log.error("sendLastDayDiamondtask room error" , e);
|
||||
} finally {
|
||||
@@ -280,9 +279,13 @@ public class ExtraDiamondDayService {
|
||||
}
|
||||
|
||||
@Async
|
||||
public void sendMessage(String msg, Set<Long> uids) {
|
||||
uids.forEach(uid -> {
|
||||
baseSendService.sendSystemMsg(uid.toString(), msg);
|
||||
public void sendMessage(I18nAlertEnum msg, Map<Long, BigDecimal> sendGoldMap, Integer partitionId) {
|
||||
sendGoldMap.entrySet().forEach(entry -> {
|
||||
if (entry.getValue().compareTo(BigDecimal.ZERO) <= 0) {
|
||||
return;
|
||||
}
|
||||
String message = I18NMessageSourceUtil.getMessage(msg, new Object[]{entry.getValue()}, partitionId);
|
||||
baseSendService.sendSystemMsg(entry.getKey().toString(), message);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -133,7 +133,7 @@ public class Lucky24ExtraService {
|
||||
long todayTimes = userMetaMapSnapshot.getOrDefault(todayTimesKey, 0L).longValue();
|
||||
String todayInputKey = String.join("_", today, INPUT_KEY);
|
||||
long todayInput = userMetaMapSnapshot.getOrDefault(todayInputKey, 0L).longValue();
|
||||
String todayOutputKey = String.join("_", today, INPUT_KEY);
|
||||
String todayOutputKey = String.join("_", today, OUTPUT_KEY);
|
||||
long todayOutput = userMetaMapSnapshot.getOrDefault(todayOutputKey, 0L).longValue();
|
||||
|
||||
// 第一层
|
||||
|
@@ -2,6 +2,7 @@ package com.accompany.business.service.lucky;
|
||||
|
||||
import com.accompany.business.dto.lucky.Lucky24GiftConfig;
|
||||
import com.accompany.business.dto.lucky.Lucky24Result;
|
||||
import com.accompany.common.constant.Constant;
|
||||
import com.accompany.common.redis.RedisKey;
|
||||
import com.accompany.common.utils.DateTimeUtil;
|
||||
import com.accompany.core.enumeration.PartitionEnum;
|
||||
@@ -32,6 +33,8 @@ public class Lucky24UserMetaService {
|
||||
|
||||
public static final String EXTRA_POOL_COUNT = "extra_pool_count";
|
||||
|
||||
public static final String Y = "y";
|
||||
|
||||
private static final int HISTORY_QUEUE_SIZE = 40000;
|
||||
|
||||
@Autowired
|
||||
@@ -143,25 +146,6 @@ public class Lucky24UserMetaService {
|
||||
return stockResultVo;
|
||||
}
|
||||
|
||||
public void updateExtraUserMeta(long senderUid, Integer partitionId, long input, long output) {
|
||||
RMap<String, Number> userMetaMap = getUserMeta(senderUid);
|
||||
long times = userMetaMap.addAndGet(TIMES_KEY, 1L).longValue();
|
||||
|
||||
PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId);
|
||||
long todayStartTimeLong = DateTimeUtil.getZonedTodayTime(partitionEnum.getZoneId());
|
||||
|
||||
String today = String.valueOf(todayStartTimeLong);
|
||||
String todayTimesKey = String.join("_", today, TIMES_KEY);
|
||||
long todayTimes = userMetaMap.addAndGet(todayTimesKey, 1L).longValue();
|
||||
String todayInputKey = String.join("_", today, INPUT_KEY);
|
||||
long todayInput = userMetaMap.addAndGet(todayInputKey, input).longValue();
|
||||
String todayOutputKey = String.join("_", today, OUTPUT_KEY);
|
||||
long todayOutput = userMetaMap.addAndGet(todayOutputKey, output).longValue();
|
||||
|
||||
log.info("[Lucky24] updateExtraUserMeta uid {} times {} today {} todayTime {} todayInput {} todayOutput {}",
|
||||
senderUid, times, todayStartTimeLong, todayTimes, todayInput, todayOutput);
|
||||
}
|
||||
|
||||
public void updateUserMeta(long senderUid, int partitionId, long input, long output) {
|
||||
RList<Lucky24Result> historyQueue = getUserHistoryQueue(senderUid);
|
||||
historyQueue.add(0, new Lucky24Result(null, null, input, output, null));
|
||||
@@ -260,10 +244,48 @@ public class Lucky24UserMetaService {
|
||||
}
|
||||
}
|
||||
|
||||
//Y用户
|
||||
if (userMetaMap.containsKey(Y)){
|
||||
String yInputKey = String.join("_", Y, INPUT_KEY);
|
||||
long yInput = userMetaMap.addAndGet(yInputKey, input).longValue();
|
||||
String yOutputKey = String.join("_", Y, OUTPUT_KEY);
|
||||
long yOutput = userMetaMap.addAndGet(yOutputKey, output).longValue();
|
||||
|
||||
log.info("[Lucky24] updateUserMeta Y uid {} YInput {} YOutput {}", senderUid, yInput, yOutput);
|
||||
}
|
||||
|
||||
log.info("[Lucky24] updateUserMeta uid {} times {} todayInput {} todayOutput {} today {} todayTimes {} todayIntput {} todayOutput {}",
|
||||
senderUid, times, totalInput, totalOutput, todayStartTimeLong, todayTimes, todayInput, todayOutput);
|
||||
}
|
||||
|
||||
public void dyeYUser(Long uid) {
|
||||
RMap<String, Number> userMetaMap = getUserMeta(uid);
|
||||
userMetaMap.putIfAbsent(Y, Constant.Yes1No0.YES);
|
||||
log.info("[Lucky24] dyeYUser uid {}", uid);
|
||||
}
|
||||
|
||||
public boolean judgeYDiff(Long uid, long outputDiff) {
|
||||
RMap<String, Number> userMetaMap = getUserMeta(uid);
|
||||
|
||||
String yInputKey = String.join("_", Y, INPUT_KEY);
|
||||
long yInput = userMetaMap.getOrDefault(yInputKey, 0L).longValue();
|
||||
String yOutputKey = String.join("_", Y, OUTPUT_KEY);
|
||||
long yOutput = userMetaMap.getOrDefault(yOutputKey, 0L).longValue();
|
||||
|
||||
long judgeDiff = yInput - yOutput;
|
||||
|
||||
if (judgeDiff < outputDiff){
|
||||
log.info("[Lucky24] judgeYDiff false uid {} judgeDiff {} outputDiff {}", uid, judgeDiff, outputDiff);
|
||||
return false;
|
||||
}
|
||||
|
||||
log.info("[Lucky24] judgeYDiff true uid {} judgeDiff {} outputDiff {}", uid, judgeDiff, outputDiff);
|
||||
|
||||
userMetaMap.fastRemove(Y, yInputKey, yOutputKey);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public RMap<String, Number> getUserMeta(Long uid) {
|
||||
return redissonClient.getMap(RedisKey.lucky_24_user_meta.getKey(uid.toString()));
|
||||
}
|
||||
|
@@ -0,0 +1,139 @@
|
||||
package com.accompany.business.service.lucky;
|
||||
|
||||
import com.accompany.business.entity.Lucky24YUser;
|
||||
import com.accompany.business.mybatismapper.lucky.Lucky24StatMapper;
|
||||
import com.accompany.common.constant.Constant;
|
||||
import com.accompany.common.utils.DateTimeUtil;
|
||||
import com.accompany.sharding.mapper.Lucky24RecordMapper;
|
||||
import com.accompany.sharding.vo.Lucky24PersonalStat;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
||||
@Service
|
||||
public class Lucky24YService {
|
||||
|
||||
@Autowired
|
||||
private Lucky24RecordMapper recordMapper;
|
||||
@Autowired
|
||||
private Lucky24StatMapper statMapper;
|
||||
@Autowired
|
||||
private Lucky24YUserService lucky24YUserService;
|
||||
@Autowired
|
||||
private Lucky24UserMetaService userMetaService;
|
||||
|
||||
@Resource(name = "biz-executor")
|
||||
private ThreadPoolExecutor bizExecutor;
|
||||
|
||||
public void dye(Integer partitionId, Date systemStartTime, Date systemEndTime, ZonedDateTime zdt) {
|
||||
String zoneDate = zdt.format(DateTimeUtil.dateFormatter);
|
||||
|
||||
Map<Long, List<Lucky24PersonalStat>> personalStatMap = new HashMap<>();
|
||||
|
||||
List<Lucky24PersonalStat> todayPersonalStatList = recordMapper.listPersonal(zoneDate, partitionId, null, systemStartTime, systemEndTime, null, null);
|
||||
|
||||
for (Lucky24PersonalStat item : todayPersonalStatList){
|
||||
List<Lucky24PersonalStat> statList = personalStatMap.get(item.getUid());
|
||||
if (CollectionUtils.isEmpty(statList)){
|
||||
statList = new ArrayList<>();
|
||||
personalStatMap.put(item.getUid(), statList);
|
||||
}
|
||||
statList.add(item);
|
||||
}
|
||||
|
||||
String zoneYesterday = zdt.minusDays(1L).format(DateTimeUtil.dateFormatter);
|
||||
String zoneTwoDayAgo = zdt.minusDays(2L).format(DateTimeUtil.dateFormatter);
|
||||
|
||||
List<Lucky24PersonalStat> twoDayAgePersonalStatList = statMapper.listPersonalStat(partitionId, null, null, null, zoneTwoDayAgo, zoneYesterday);
|
||||
|
||||
for (Lucky24PersonalStat item : twoDayAgePersonalStatList){
|
||||
List<Lucky24PersonalStat> statList = personalStatMap.get(item.getUid());
|
||||
if (CollectionUtils.isEmpty(statList)){
|
||||
statList = new ArrayList<>();
|
||||
personalStatMap.put(item.getUid(), statList);
|
||||
}
|
||||
statList.add(item);
|
||||
}
|
||||
|
||||
Map<Long, Lucky24YUser> yUserMap = lucky24YUserService.mapValidYUser();
|
||||
|
||||
for (Map.Entry<Long, List<Lucky24PersonalStat>> entry : personalStatMap.entrySet()){
|
||||
Long uid = entry.getKey();
|
||||
|
||||
Lucky24YUser yUser = yUserMap.get(uid);
|
||||
if (yUser != null){
|
||||
if (Constant.Yes1No0.YES == yUser.getAutoDye()){
|
||||
bizExecutor.execute(() -> {
|
||||
tryClearYUser(yUser);
|
||||
});
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
List<Lucky24PersonalStat> personalStatList = entry.getValue();
|
||||
if (CollectionUtils.isEmpty(personalStatList) || personalStatList.size() <= 2){
|
||||
continue;
|
||||
}
|
||||
|
||||
long totalNum = personalStatList.stream().mapToLong(Lucky24PersonalStat::getNum).sum();
|
||||
boolean threeDayProductionRatioOverThreshold = personalStatList.stream().anyMatch(item -> item.getProductionRatio().compareTo(BigDecimal.ONE) > 0);
|
||||
if (totalNum < 2000L || !threeDayProductionRatioOverThreshold){
|
||||
continue;
|
||||
}
|
||||
|
||||
bizExecutor.execute(() -> {
|
||||
tryDyeYUser(uid, zoneDate, personalStatList);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void tryDyeYUser(Long uid, String statDate, List<Lucky24PersonalStat> personalStatList) {
|
||||
Date now = new Date();
|
||||
|
||||
Lucky24YUser yUser = new Lucky24YUser();
|
||||
yUser.setUid(uid);
|
||||
yUser.setStatDate(statDate);
|
||||
yUser.setAutoDye(Constant.Yes1No0.YES);
|
||||
yUser.setStatus(Constant.StatusV2.valid);
|
||||
|
||||
List<Lucky24PersonalStat> sortedPersonalStatList = personalStatList.stream().sorted(Comparator.comparing(Lucky24PersonalStat::getDate).reversed()).toList();
|
||||
|
||||
Lucky24PersonalStat todayStat = sortedPersonalStatList.get(0);
|
||||
yUser.setTodayNum(todayStat.getNum().intValue());
|
||||
yUser.setTodayProductionRatio(todayStat.getProductionRatio());
|
||||
|
||||
Lucky24PersonalStat yesterdayStat = sortedPersonalStatList.get(1);
|
||||
yUser.setYesterdayNum(yesterdayStat.getNum().intValue());
|
||||
yUser.setYesterdayProductionRatio(yesterdayStat.getProductionRatio());
|
||||
|
||||
Lucky24PersonalStat twoDaysAgoStat = sortedPersonalStatList.get(2);
|
||||
yUser.setTwoDaysAgoNum(twoDaysAgoStat.getNum().intValue());
|
||||
yUser.setTwoDaysAgoProductionRatio(twoDaysAgoStat.getProductionRatio());
|
||||
|
||||
yUser.setCreateTime(now);
|
||||
yUser.setUpdateTime(now);
|
||||
|
||||
lucky24YUserService.saveOrUpdate(yUser);
|
||||
|
||||
userMetaService.dyeYUser(uid);
|
||||
}
|
||||
|
||||
private void tryClearYUser(Lucky24YUser yUser) {
|
||||
if (!userMetaService.judgeYDiff(yUser.getUid(), yUser.getOutputDiff())){
|
||||
return;
|
||||
}
|
||||
|
||||
Date now = new Date();
|
||||
yUser.setStatus(Constant.StatusV2.invalid);
|
||||
yUser.setUpdateTime(now);
|
||||
lucky24YUserService.updateById(yUser);
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,23 @@
|
||||
package com.accompany.business.service.lucky;
|
||||
|
||||
import com.accompany.business.entity.Lucky24YUser;
|
||||
import com.accompany.business.mapper.Lucky24YUserMapper;
|
||||
import com.accompany.common.constant.Constant;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
public class Lucky24YUserService extends ServiceImpl<Lucky24YUserMapper, Lucky24YUser> {
|
||||
|
||||
public Map<Long, Lucky24YUser> mapValidYUser(){
|
||||
return lambdaQuery()
|
||||
.eq(Lucky24YUser::getStatus, Constant.StatusV2.valid)
|
||||
.list().stream()
|
||||
.collect(Collectors.toMap(Lucky24YUser::getUid, v -> v));
|
||||
}
|
||||
|
||||
}
|
@@ -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 >= #{startDate}
|
||||
and gd.stat_hour <= #{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>
|
@@ -59,4 +59,30 @@
|
||||
group by gm.id
|
||||
ORDER BY diamondNum desc
|
||||
</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>
|
||||
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.accompany.business.mapper.Lucky24YUserMapper">
|
||||
|
||||
</mapper>
|
@@ -4,7 +4,8 @@ import cn.hutool.core.date.DateUtil;
|
||||
import com.accompany.business.service.guildpolicy2.GuildPolicy2Service;
|
||||
import com.accompany.business.service.room.GuildMemberRoomMicRecordService;
|
||||
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.result.BusiResult;
|
||||
import com.accompany.core.enumeration.PartitionEnum;
|
||||
@@ -39,10 +40,21 @@ public class GuildPolicy2Controller {
|
||||
})
|
||||
@Authorization
|
||||
@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);
|
||||
}
|
||||
|
||||
@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")
|
||||
public BusiResult<List<CycleDateVo>> getCycleDates(@RequestHeader(PUB_UID) Long uid) {
|
||||
return guildPolicy2Service.getCycleDates(uid);
|
||||
|
@@ -61,7 +61,7 @@ public class MonthRankTask extends BaseTask {
|
||||
public void monthRankTaskGMT8() {
|
||||
Date date = new Date();
|
||||
Date lastMonthDate = DateUtil.offsetMonth(date, -1);
|
||||
List<PartitionEnum> partitionEnumList = List.of(PartitionEnum.ENGLISH, PartitionEnum.ENGLISH2);
|
||||
List<PartitionEnum> partitionEnumList = List.of(PartitionEnum.ENGLISH, PartitionEnum.ENGLISH2, PartitionEnum.SOVIET);
|
||||
for (PartitionEnum partitionEnum : partitionEnumList) {
|
||||
try {
|
||||
log.info("=-=monthRankTaskGMT8.krypton_rank=-=:date:{},lastMonthDate:{}", DateUtil.formatDateTime(date), lastMonthDate);
|
||||
|
@@ -3,6 +3,7 @@ package com.accompany.scheduler.task.luckyBag;
|
||||
import com.accompany.business.message.Lucky24Message;
|
||||
import com.accompany.business.service.gift.Lucky24MessageService;
|
||||
import com.accompany.business.service.lucky.Lucky24RecordService;
|
||||
import com.accompany.business.service.lucky.Lucky24YService;
|
||||
import com.accompany.common.utils.DateTimeUtil;
|
||||
import com.accompany.core.model.PartitionInfo;
|
||||
import com.accompany.core.service.partition.PartitionInfoService;
|
||||
@@ -29,6 +30,8 @@ public class Lucky24Task {
|
||||
private Lucky24RecordService service;
|
||||
@Autowired
|
||||
private Lucky24MessageService lucky24MessageService;
|
||||
@Autowired
|
||||
private Lucky24YService lucky24YService;
|
||||
|
||||
/**
|
||||
* 重新消费队列的消息
|
||||
@@ -97,4 +100,41 @@ public class Lucky24Task {
|
||||
}
|
||||
}
|
||||
|
||||
@Scheduled(cron = "0 0 * * * ? ")
|
||||
public void lucky24DyeY() {
|
||||
Date now = new Date();
|
||||
List<PartitionInfo> partitionInfoList = partitionInfoService.listAll();
|
||||
for (PartitionInfo partitionInfo : partitionInfoList) {
|
||||
ZonedDateTime zdt = DateTimeUtil.convertWithZoneId(now, partitionInfo.getZoneId());
|
||||
int times = zdt.getHour() / 3;
|
||||
int mod = zdt.getHour() % 3;
|
||||
|
||||
log.info("[lucky24DyeY] zdt {} zdtHour {} times {} mod {}",
|
||||
zdt, zdt.getHour(), times, mod);
|
||||
|
||||
if (times == 0 || mod > 0){
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// 获取当天的第一秒
|
||||
ZonedDateTime startOfDay = zdt.withHour(0)
|
||||
.withMinute(0)
|
||||
.withSecond(0)
|
||||
.withNano(0);
|
||||
Date systemStartTime = DateTimeUtil.converLocalDateTimeToDate(startOfDay.withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime());
|
||||
Date startTime = DateTimeUtil.converLocalDateTimeToDate(startOfDay.toLocalDateTime());
|
||||
|
||||
// 获取当天的最后一秒
|
||||
ZonedDateTime endOfDay = zdt;
|
||||
Date systemEndTime = DateTimeUtil.converLocalDateTimeToDate(endOfDay.withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime());
|
||||
|
||||
lucky24YService.dye(partitionInfo.getId(), systemStartTime, systemEndTime, zdt);
|
||||
|
||||
} catch (Exception e){
|
||||
log.error("[lucky24DyeY] exception {}", e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user