This commit is contained in:
777
2025-09-13 01:06:44 +08:00
parent 8c98c6928c
commit 77e19742e7
25 changed files with 748 additions and 12 deletions

View File

@@ -0,0 +1,56 @@
package com.ruoyi.cai.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.FastPayTotal;
import com.ruoyi.cai.domain.UnionTotal;
import com.ruoyi.cai.service.FastPayTotalService;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/cai/fastPayTotal")
public class FastPayTotalController extends BaseController {
private final FastPayTotalService fastPayTotalService;
@GetMapping("/getCurrentDay")
public R<Long> getCurrentDay() {
Long page = fastPayTotalService.getCurrentDay();
return R.ok(page);
}
@GetMapping("/list")
public TableDataInfo<FastPayTotal> list(FastPayTotal bo, PageQuery pageQuery) {
Page<FastPayTotal> page = fastPayTotalService.page(pageQuery.build(),
Wrappers.lambdaQuery(bo).orderByDesc(FastPayTotal::getCountDate));
return TableDataInfo.build(page);
}
@Log(title = "刷新今日首充统计", businessType = BusinessType.DELETE)
@GetMapping("/refreshData")
public R<Void> remove(String date) {
if(StringUtils.isBlank(date)){
fastPayTotalService.refreshAll();
}else{
LocalDate parse = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
fastPayTotalService.refreshDate(parse);
}
return R.ok();
}
}

View File

@@ -0,0 +1,73 @@
package com.ruoyi.cai.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.UnionTotal;
import com.ruoyi.cai.service.UnionTotalService;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
* 工会每日收益
*
* @author 77
* @date 2025-09-11
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/cai/unionTotal")
public class UnionTotalController extends BaseController {
private final UnionTotalService unionTotalService;
/**
* 查询工会每日收益列表
*/
@SaCheckPermission("cai:unionTotal:list")
@GetMapping("/list")
public TableDataInfo<UnionTotal> list(UnionTotal bo, PageQuery pageQuery) {
Page<UnionTotal> page = unionTotalService.page(pageQuery.build(), Wrappers.lambdaQuery(bo));
return TableDataInfo.build(page);
}
@Log(title = "刷新工会每日收益", businessType = BusinessType.DELETE)
@GetMapping("/refreshData")
public R<Void> refreshData(String date) {
if(StringUtils.isBlank(date)){
unionTotalService.refreshAll();
}else{
LocalDate parse = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
unionTotalService.refreshData(parse);
}
return R.ok();
}
@Log(title = "刷新所有工会总收益")
@GetMapping("/refreshAllUnion")
public R<Void> refreshAllUnion() {
unionTotalService.refreshUnionTotalAll();
return R.ok();
}
@Log(title = "刷新指定工会总收益")
@GetMapping("/refreshUnionTotal")
public R<Void> refreshUnionTotal(Long unionId) {
unionTotalService.refreshUnionTotal(unionId);
return R.ok();
}
}

View File

@@ -0,0 +1,33 @@
package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.constant.DateConstant;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@TableName("cai_fast_pay_total")
public class FastPayTotal implements Serializable {
private static final long serialVersionUID=1L;
/**
* 子账户ID
*/
@TableId(value = "id",type = IdType.AUTO)
private Long id;
@DateTimeFormat(pattern = DateConstant.PATTERN_DATE)
private LocalDate countDate;
private Long count;
private LocalDateTime refreshTime;
private LocalDateTime createTime;
}

View File

@@ -87,6 +87,8 @@ public class RechargeOrder implements Serializable {
private String remark;
private Boolean fastPay;
private LocalDateTime createTime;
}

View File

@@ -33,6 +33,8 @@ public class Union implements Serializable {
* 工会名称
*/
private String name;
private Long unionEarningsTotal;
private Long anchorEarningsTotal;
/**
* 是否开启提成
*/

View File

@@ -0,0 +1,56 @@
package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.constant.DateConstant;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 工会每日收益对象 cai_union_total
*
* @author 77
* @date 2025-09-11
*/
@Data
@TableName("cai_union_total")
public class UnionTotal implements Serializable {
private static final long serialVersionUID=1L;
/**
*
*/
@TableId(value = "id",type = IdType.AUTO)
private String id;
private Long unionId;
private String unionName;
/**
* 工会收益
*/
private Long unionEarningsTotal;
/**
* 工会主播收入
*/
private Long anchorEarningsTotal;
/**
* 时间
*/
@DateTimeFormat(pattern = DateConstant.PATTERN_DATE)
private LocalDate countDate;
/**
* 刷新时间
*/
private LocalDateTime refreshTime;
/**
* 日期类型
*/
private Integer dataType;
private LocalDateTime createTime;
}

View File

@@ -49,6 +49,7 @@ public class UserInfo {
* 是否领取首充奖励true领取 false未领取
*/
private Boolean fastPay;
private LocalDateTime fastPayTime;
/**
* 最后登录IP
*/

View File

@@ -12,6 +12,7 @@ public class RechargeConsumerResp {
* 充值金额
*/
private BigDecimal price;
private String orderNo;
/**
* 充值彩贝
*/

View File

@@ -142,6 +142,7 @@ public enum SystemConfigEnum {
// 七牛云 ?imageView2/2/w/120/h/120
// 腾讯云 ?thumbnail=120y120&imageView
IM_ICON_SUFFIX("?thumbnail=120y120&imageView", "im头像后缀",SystemConfigGroupEnum.SYSTEM),
IM_ICON_PREFIX("0", "是否加im头像前缀域名",SystemConfigGroupEnum.SYSTEM, new BooleanSystemConfigCheck()),
;

View File

@@ -102,10 +102,13 @@ public class ImManager {
uinfoReq.setAccid(userId+"");
if(StringUtils.isNotBlank(avatar)){
String icon = avatar;
// if(!avatar.startsWith("http")){
// String cosDomain = systemConfigManager.getSystemConfig(SystemConfigEnum.COS_DOMAIN);
// icon = cosDomain + avatar;
// }
boolean imIconPrefix = systemConfigManager.getSystemConfigOfBool(SystemConfigEnum.IM_ICON_PREFIX);
if(imIconPrefix){
if (!avatar.startsWith("http")) {
String cosDomain = systemConfigManager.getSystemConfig(SystemConfigEnum.COS_DOMAIN);
icon = cosDomain + avatar;
}
}
String iconSuffix = systemConfigManager.getSystemConfig(SystemConfigEnum.IM_ICON_SUFFIX);
uinfoReq.setIcon(icon+iconSuffix);
}

View File

@@ -24,6 +24,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Component
@Slf4j
@@ -45,6 +46,8 @@ public class AwardManager {
private YunxinHttpService yunxinHttpService;
@Autowired
private UserInviteService userInviteService;
@Autowired
private RechargeOrderService rechargeOrderService;
public void giveJoinAnchorAsync(Long anchorUserId){
AwardManager bean = SpringUtil.getBean(AwardManager.class);
@@ -130,11 +133,13 @@ public class AwardManager {
boolean update = userInfoService.update(Wrappers.lambdaUpdate(UserInfo.class)
.eq(UserInfo::getId, userInfo.getId())
.eq(UserInfo::getFastPay, false)
.set(UserInfo::getFastPay, true));
.set(UserInfo::getFastPay, true)
.set(UserInfo::getFastPayTime, LocalDateTime.now()));
if(!update){
log.warn("首充奖励领取失败 用户已领取 无需二次领取 136 userId={}",userId);
return;
}
rechargeOrderService.setFastPay(resp.getOrderNo());
UserInvite userInvite = userInviteService.getByUserId(userId);
if(userInvite == null){
log.warn("首充奖励分发失败 用户无邀请人,首冲奖励流失");

View File

@@ -0,0 +1,7 @@
package com.ruoyi.cai.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.cai.domain.FastPayTotal;
public interface FastPayTotalMapper extends BaseMapper<FastPayTotal> {
}

View File

@@ -0,0 +1,22 @@
package com.ruoyi.cai.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.cai.domain.UnionTotal;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 工会每日收益Mapper接口
*
* @author 77
* @date 2025-09-11
*/
public interface UnionTotalMapper extends BaseMapper<UnionTotal> {
List<UnionTotal> countUnionTotal(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
UnionTotal countUnion(@Param("unionId") Long unionId);
}

View File

@@ -0,0 +1,14 @@
package com.ruoyi.cai.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.domain.FastPayTotal;
import java.time.LocalDate;
public interface FastPayTotalService extends IService<FastPayTotal> {
void refreshDate(LocalDate date);
void refreshAll();
Long getCurrentDay();
}

View File

@@ -30,4 +30,6 @@ public interface RechargeOrderService extends IService<RechargeOrder> {
RechargeConsumerResp orderSuccess(String orderNo, Map<String,String> params, String appId, PayTypeEnum payTypeEnum);
RechargeOrder updateAdminRechargeOrder(AddRechargeOrderAdminDto dto);
void setFastPay(String orderNo);
}

View File

@@ -0,0 +1,26 @@
package com.ruoyi.cai.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.domain.UnionTotal;
import com.ruoyi.cai.enums.rank.RankDataTypeEnum;
import java.time.LocalDate;
/**
* 工会每日收益Service接口
*
* @author 77
* @date 2025-09-11
*/
public interface UnionTotalService extends IService<UnionTotal> {
void refreshData(LocalDate localDate);
void refreshData(RankDataTypeEnum dataType, LocalDate localDate);
void refreshAll();
void refreshUnionTotalAll();
void refreshUnionTotal(Long unionId);
}

View File

@@ -0,0 +1,86 @@
package com.ruoyi.cai.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cai.domain.FastPayTotal;
import com.ruoyi.cai.domain.RechargeOrder;
import com.ruoyi.cai.mapper.FastPayTotalMapper;
import com.ruoyi.cai.service.FastPayTotalService;
import com.ruoyi.cai.service.RechargeOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@Service
public class FastPayTotalServiceImpl extends ServiceImpl<FastPayTotalMapper, FastPayTotal> implements FastPayTotalService {
@Autowired
private RechargeOrderService rechargeOrderService;
@Override
public Long getCurrentDay() {
LocalDate date = LocalDate.now();
LocalDateTime startTime = date.atTime(LocalTime.MIN);
LocalDateTime endTime = date.atTime(LocalTime.MAX);
long count = rechargeOrderService.count(Wrappers.lambdaQuery(RechargeOrder.class)
.eq(RechargeOrder::getFastPay, true)
.eq(RechargeOrder::getAdmin, false)
.between(RechargeOrder::getPayTime, startTime, endTime));
return count;
}
@Override
public void refreshDate(LocalDate date) {
LocalDateTime startTime = date.atTime(LocalTime.MIN);
LocalDateTime endTime = date.atTime(LocalTime.MAX);
long count = rechargeOrderService.count(Wrappers.lambdaQuery(RechargeOrder.class)
.eq(RechargeOrder::getFastPay, true)
.eq(RechargeOrder::getAdmin, false)
.between(RechargeOrder::getPayTime, startTime, endTime));
FastPayTotal one = this.getOne(Wrappers.lambdaQuery(FastPayTotal.class)
.eq(FastPayTotal::getCountDate, date)
.last("limit 1"));
if(one == null){
one = new FastPayTotal();
one.setCountDate(date);
one.setCount(count);
one.setRefreshTime(LocalDateTime.now());
this.save(one);
}else{
FastPayTotal update = new FastPayTotal();
update.setRefreshTime(LocalDateTime.now());
update.setCount(count);
update.setId(one.getId());
this.updateById(update);
}
}
@Override
public void refreshAll(){
RechargeOrder one = rechargeOrderService.getOne(Wrappers.lambdaQuery(RechargeOrder.class)
.eq(RechargeOrder::getPayStatus,1)
.eq(RechargeOrder::getFastPay, true)
.eq(RechargeOrder::getAdmin, false)
.orderByAsc(RechargeOrder::getPayTime)
.last("limit 1"));
if(one == null){
log.error("无数据,不用刷");
return;
}
LocalDate localDate = one.getPayTime().toLocalDate();
while (true){
if(localDate.equals(LocalDate.now())){
return;
}
refreshDate(localDate);
localDate = localDate.plusDays(1);
}
}
}

View File

@@ -136,6 +136,7 @@ public class RechargeOrderServiceImpl extends ServiceImpl<RechargeOrderMapper,Re
resp.setTraceId(traceId);
resp.setPrice(rechargeOrder.getPrice());
resp.setRechargeCoin(rechargeOrder.getRechargeCoin());
resp.setOrderNo(rechargeOrder.getOrderNo());
return resp;
}
@@ -202,5 +203,12 @@ public class RechargeOrderServiceImpl extends ServiceImpl<RechargeOrderMapper,Re
return order;
}
@Override
public void setFastPay(String orderNo) {
if(orderNo != null){
this.update(Wrappers.<RechargeOrder>lambdaUpdate().set(RechargeOrder::getFastPay,true).eq(RechargeOrder::getOrderNo, orderNo));
}
}
}

View File

@@ -0,0 +1,165 @@
package com.ruoyi.cai.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cai.domain.ConsumeLog;
import com.ruoyi.cai.domain.Union;
import com.ruoyi.cai.domain.UnionTotal;
import com.ruoyi.cai.enums.rank.RankDataTypeEnum;
import com.ruoyi.cai.mapper.UnionTotalMapper;
import com.ruoyi.cai.service.ConsumeLogService;
import com.ruoyi.cai.service.UnionService;
import com.ruoyi.cai.service.UnionTotalService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
/**
* 工会每日收益Service业务层处理
*
* @author 77
* @date 2025-09-11
*/
@Service
public class UnionTotalServiceImpl extends ServiceImpl<UnionTotalMapper, UnionTotal> implements UnionTotalService {
@Resource
private UnionTotalMapper unionTotalMapper;
@Autowired
private ConsumeLogService consumeLogService;
@Autowired
private UnionService unionService;
@Override
public void refreshData(LocalDate localDate) {
this.refreshData(RankDataTypeEnum.DAY,localDate);
if(localDate.getDayOfWeek() == DayOfWeek.MONDAY){
this.refreshData(RankDataTypeEnum.WEEK,localDate);
}
}
@Override
public void refreshData(RankDataTypeEnum dataType, LocalDate localDate) {
if (dataType == RankDataTypeEnum.DAY) {
refreshDataDay(localDate);
} else if (dataType == RankDataTypeEnum.WEEK) {
refreshDataWeek(localDate);
}
}
@Override
public void refreshAll() {
ConsumeLog one = consumeLogService.getOne(Wrappers.lambdaQuery(ConsumeLog.class)
.orderByAsc(ConsumeLog::getCreateTime)
.last("limit 1"));
if(one == null){
log.error("无数据,不用刷");
return;
}
LocalDate localDate = one.getCreateTime().toLocalDate();
while (true){
if(localDate.equals(LocalDate.now())){
return;
}
this.refreshData(localDate);
localDate = localDate.plusDays(1);
}
}
@Override
public void refreshUnionTotalAll() {
int current = 0;
int pageSize = 10;
Page<Union> page = new Page<>(0, pageSize);
while (true){
current++;
page.setCurrent(current);
Page<Union> userPage = unionService.page(page);
List<Union> records = userPage.getRecords();
for (Union union : records) {
this.refreshUnionTotal(union.getId());
}
if(records.isEmpty() || records.size() < pageSize){
break;
}
}
}
@Override
public void refreshUnionTotal(Long unionId) {
UnionTotal unionTotal = unionTotalMapper.countUnion(unionId);
unionService.update(Wrappers.lambdaUpdate(Union.class)
.eq(Union::getId, unionId)
.set(Union::getAnchorEarningsTotal, unionTotal.getAnchorEarningsTotal())
.set(Union::getUnionEarningsTotal, unionTotal.getUnionEarningsTotal()));
}
private void refreshDataDay(LocalDate localDate) {
LocalDateTime minTime = localDate.atTime(LocalTime.MIN);
LocalDateTime maxTime = localDate.atTime(LocalTime.MAX);
List<UnionTotal> unionTotalList = unionTotalMapper.countUnionTotal(minTime, maxTime);
for (UnionTotal unionTotal : unionTotalList) {
UnionTotal one = this.getOne(Wrappers.lambdaQuery(UnionTotal.class).eq(UnionTotal::getCountDate, localDate)
.eq(UnionTotal::getDataType, RankDataTypeEnum.DAY.getCode()).last("limit 1"));
if (one == null) {
one = new UnionTotal();
one.setUnionId(unionTotal.getUnionId());
one.setUnionName(unionTotal.getUnionName());
one.setUnionEarningsTotal(unionTotal.getUnionEarningsTotal());
one.setAnchorEarningsTotal(unionTotal.getAnchorEarningsTotal());
one.setCountDate(localDate);
one.setRefreshTime(LocalDateTime.now());
one.setDataType(RankDataTypeEnum.DAY.getCode());
this.save(one);
} else {
UnionTotal update = new UnionTotal();
update.setUnionEarningsTotal(unionTotal.getUnionEarningsTotal());
update.setAnchorEarningsTotal(unionTotal.getAnchorEarningsTotal());
update.setRefreshTime(LocalDateTime.now());
update.setUnionId(unionTotal.getUnionId());
update.setUnionName(unionTotal.getUnionName());
update.setId(one.getId());
this.updateById(update);
}
}
}
private void refreshDataWeek(LocalDate localDate) {
LocalDateTime minTime = localDate.atTime(LocalTime.MIN);
LocalDateTime maxTime = localDate.plusDays(6).atTime(LocalTime.MAX);
List<UnionTotal> unionTotalList = unionTotalMapper.countUnionTotal(minTime, maxTime);
for (UnionTotal unionTotal : unionTotalList) {
UnionTotal one = this.getOne(Wrappers.lambdaQuery(UnionTotal.class).eq(UnionTotal::getCountDate, localDate)
.eq(UnionTotal::getDataType, RankDataTypeEnum.WEEK.getCode()).last("limit 1"));
if (one == null) {
one = new UnionTotal();
one.setUnionId(unionTotal.getUnionId());
one.setUnionName(unionTotal.getUnionName());
one.setUnionEarningsTotal(unionTotal.getUnionEarningsTotal());
one.setAnchorEarningsTotal(unionTotal.getAnchorEarningsTotal());
one.setCountDate(localDate);
one.setRefreshTime(LocalDateTime.now());
one.setDataType(RankDataTypeEnum.WEEK.getCode());
this.save(one);
} else {
UnionTotal update = new UnionTotal();
update.setUnionEarningsTotal(unionTotal.getUnionEarningsTotal());
update.setAnchorEarningsTotal(unionTotal.getAnchorEarningsTotal());
update.setRefreshTime(LocalDateTime.now());
update.setId(one.getId());
this.updateById(update);
}
}
}
}