土耳其实时薪资

This commit is contained in:
2025-10-16 19:14:23 +08:00
parent 4564cfbbf2
commit 3a985c1869
11 changed files with 263 additions and 42 deletions

View File

@@ -1148,4 +1148,13 @@ public class DateTimeUtil {
return Date.from(eastEightZonedDateTime.toInstant());
}
public static Date convertToEastEightZone(ZonedDateTime originalDate) {
// 2. 转换为东八区时间
ZonedDateTime eastEightZonedDateTime = originalDate
.withZoneSameInstant(ZoneId.of("Asia/Shanghai"));
// 3. 返回Date对象
return Date.from(eastEightZonedDateTime.toInstant());
}
}

View File

@@ -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);
}

View File

@@ -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()));
}
}

View File

@@ -404,4 +404,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 &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>

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;
@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;
}

View File

@@ -10,23 +10,20 @@ import java.util.List;
@ApiModel
@Data
public class GuildPolicy2Vo {
public class GuildPolicy2MyVo {
@ApiModelProperty("周期开始日期yyyy-MM-dd")
private String cycleDate;
@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;
}

View File

@@ -0,0 +1,39 @@
package com.accompany.business.vo.guildpolicy;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@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

@@ -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;
}
}

View File

@@ -11,13 +11,11 @@ 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;
@@ -26,6 +24,8 @@ 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;
@@ -54,8 +54,6 @@ public class GuildPolicy2Service {
@Autowired
private GuildAuthService guildAuthService;
@Autowired
private RoomMicService roomMicService;
@Autowired
private GuildMicStatisticsPolicy2Service guildMicStatisticsPolicy2Service;
@Autowired
private UsersService usersService;
@@ -73,10 +71,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,30 +88,48 @@ public class GuildPolicy2Service {
throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED);
}
Long guildMemberId = guildMember.getId();
guildPolicy2Vo.setDiamondNum(guildDiamondStatisticsPolicy2Service.getTotalDiamondInCycleMember(cycleBeginDate, guildMemberId));
List<GuildPolicy2PersonalVo> myDiamondData = guildDiamondStatisticsPolicy2Service.listPersonalDiamondData(cycleBeginDate, guildMemberId);
List<GuildPolicy2PersonalVo> myMicData = guildMicStatisticsPolicy2Service.listPersonalMicData(cycleBeginDate, guildMemberId);
List<GuildPolicy2PersonalVo> myData = mergeMyDataLists(myDiamondData, myMicData);
if (CollectionUtils.isNotEmpty(myData)) {
guildPolicy2Vo.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);
return guildMember;
}
public List<GuildPolicy2PersonalVo> mergeMyDataLists(List<GuildPolicy2PersonalVo> list1, List<GuildPolicy2PersonalVo> list2) {
private boolean isCurrentOrPastCycle(String cycleBeginDate, String curCycleBeginDate) {
return cycleBeginDate.equals(curCycleBeginDate) || cycleBeginDate.compareTo(MIN_CYCLE_DATE) < 0;
}
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();
String curCycleBeginDate = FullMonthCycleTimeUtil.getCycleDate(DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId()));
List<GuildPolicy2PersonalVo> myMicData = guildMicStatisticsPolicy2Service.listPersonalMicData(cycleBeginDate, guildMemberId);
if (isCurrentOrPastCycle(cycleBeginDate, curCycleBeginDate)) {// 当前周期
guildPolicy2MyVo.setDiamondNum(guildDiamondStatisticsPolicy2Service.getTotalDiamondInCycleMember(cycleBeginDate, guildMemberId));
List<GuildPolicy2PersonalVo> myDiamondData = guildDiamondStatisticsPolicy2Service.listPersonalDiamondData(cycleBeginDate, guildMemberId);
List<GuildPolicy2PersonalVo> myData = this.mergeMyDataLists(myDiamondData, myMicData);
if (CollectionUtils.isNotEmpty(myData)) {
guildPolicy2MyVo.setMicDay(myData.stream().collect(Collectors.summingInt(GuildPolicy2PersonalVo::getMicDay)));
}
//填满整月天数
this.fillAllDayOfMonth(guildPolicy2MyVo, myData, cycleBeginDate, partitionEnum);
TreeMap<BigDecimal, GuildDiamondWagePolicy2> diamondWageMap = guildDiamondWagePolicy2Service.getDiamondWageMap(partitionEnum.getId());
GuildPolicy2SalaryVo salaryVo = guildDiamondWagePolicy2Service.getSalaryVo(diamondWageMap, guildPolicy2MyVo.getDiamondNum(), guildPolicy2MyVo.getMicDay());
guildPolicy2MyVo.setMySalary(salaryVo);
} else {
//to-do
}
return BusiResult.success(guildPolicy2MyVo);
}
//合并流水与在麦天数数据
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;
@@ -135,7 +154,7 @@ public class GuildPolicy2Service {
return new ArrayList<>(mergedMap.values());
}
private void fillAllDayOfMonth(GuildPolicy2Vo guildPolicy2Vo, List<GuildPolicy2PersonalVo> myData, String cycleBeginDate, PartitionEnum partitionEnum) {
private void fillAllDayOfMonth(GuildPolicy2MyVo guildPolicy2MyVo, List<GuildPolicy2PersonalVo> myData, String cycleBeginDate, PartitionEnum partitionEnum) {
List<GuildPolicy2PersonalVo> resultMyDate = new ArrayList<>();
ZonedDateTime nowZoneDateTime = DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId());
Map<String, GuildPolicy2PersonalVo> realMap = new HashMap<>();
@@ -160,7 +179,68 @@ public class GuildPolicy2Service {
resultMyDate.add(guildPolicy2PersonalVo);
monthEnd = DateUtil.offsetDay(monthEnd, -1);
}
guildPolicy2Vo.setMyData(resultMyDate);
guildPolicy2MyVo.setMyData(resultMyDate);
}
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.parseDate(cycleBeginDate);
Date cycleEnd = DateUtil.endOfMonth(cycleBegin);
ZonedDateTime cycleBeginDateZoneDate = DateTimeUtil.convertWithZoneId(cycleBegin, partitionEnum.getZoneId());
ZonedDateTime zoneBeginTime = cycleBeginDateZoneDate.withHour(0).withMinute(0).withSecond(0).withNano(0);
ZonedDateTime cycleEndDateZoneDate = DateTimeUtil.convertWithZoneId(cycleEnd, partitionEnum.getZoneId());
ZonedDateTime zoneEndTime = cycleEndDateZoneDate.withHour(23).withMinute(59).withSecond(59).withNano(999_999_999);
Date beginOfMonth = DateTimeUtil.convertToEastEightZone(zoneBeginTime);
Date endOfMonth = DateTimeUtil.convertToEastEightZone(zoneEndTime);
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());
if (chargeRecord != null) {
BigDecimal refundAmount = BigDecimal.valueOf(chargeRecord.getAmount() != null ? chargeRecord.getAmount() : 0D)
.divide(BigDecimal.valueOf(100))
.multiply(ISSUE_SALARY_RATE);
item.setIssueSalary(refundAmount);
}
});
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 {
//to-do
}
return BusiResult.success(guildPolicy2AgencyVo);
}
public BusiResult<List<CycleDateVo>> getCycleDatesV2(Integer partitionId) {

View File

@@ -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);