排行fix

This commit is contained in:
admin
2024-06-12 20:51:49 +08:00
parent 58d411b227
commit 8bbd74c5f1
7 changed files with 114 additions and 232 deletions

View File

@@ -3,7 +3,6 @@ package com.starry.admin.common.task;
import com.starry.admin.modules.clerk.module.entity.PlayClerkUserInfoEntity;
import com.starry.admin.modules.clerk.module.entity.PlayClerkWagesDetailsInfoEntity;
import com.starry.admin.modules.clerk.module.entity.PlayClerkWagesInfoEntity;
import com.starry.admin.modules.clerk.service.IPlayClerkRankingInfoService;
import com.starry.admin.modules.clerk.service.IPlayClerkUserInfoService;
import com.starry.admin.modules.clerk.service.IPlayClerkWagesDetailsInfoService;
import com.starry.admin.modules.clerk.service.IPlayClerkWagesInfoService;
@@ -41,8 +40,6 @@ public class ClerkWagesSettlementTask {
@Resource
private IPlayOrderInfoService playOrderInfoService;
@Resource
private IPlayClerkRankingInfoService clerkRankingInfoService;
@Resource
private IPlayClerkWagesInfoService playClerkWagesInfoService;

View File

@@ -17,6 +17,10 @@ import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -42,56 +46,88 @@ public class OrderRankingSettlementTask {
@Resource
private IPlayClerkRankingInfoService clerkRankingInfoService;
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/**
* 当日订单结算,查询前一日的订单信息,生成订单排名数据
* 每天凌晨0点5分0秒时触发执行
*/
// @Scheduled(cron = "0 0/1 * * * ?")
@Scheduled(cron = "0 5 0 * * ?")
public void dailyRanking() {
// 1、查询所有的租户信息
List<SysTenantEntity> tenantEntities = sysTenantService.listAll();
LocalDate startTime = LocalDate.now().minusDays(1);
LocalDate endTime = LocalDate.now();
// 2、查询每个租户的用户以及他们的订单信息
Integer newSerialNumber = clerkRankingInfoService.selectSerialNumber("0");
for (SysTenantEntity tenantEntity : tenantEntities) {
SecurityUtils.setTenantId(tenantEntity.getTenantId());
List<PlayClerkUserInfoEntity> clerkUserReturnVos = clerkUserInfoService.listAll();
// 生成每个人的订单排行信息
for (PlayClerkUserInfoEntity clerkUserInfo : clerkUserReturnVos) {
// 查询当前店员一定时间的订单信息
String rankId = IdUtils.getUuid();
// 3、根据订单信息生成对应排名数据
createClerkRanking(clerkUserInfo.getId(), startTime, endTime, rankId, newSerialNumber);
}
// 根据订单数量,更新排行名次
List<PlayClerkRankingInfoEntity> list = clerkRankingInfoService.selectMaxSerialNumber("0");
// 使用匿名比较器排序
list.sort((p1, p2) -> p2.getOrderNumber() - p1.getOrderNumber());
for (int i = 0; i < list.size(); i++) {
PlayClerkRankingInfoEntity item = list.get(i);
item.setRankingIndex(i + 1);
if (i > 0) {
item.setPreviousMoney(list.get(i - 1).getOrderMoney().subtract(item.getOrderMoney()));
}
clerkRankingInfoService.update(item);
}
}
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String startTime = LocalDate.now().minusDays(1).atStartOfDay().format(df);
String endTime = LocalDateTime.of(LocalDate.now().minusDays(1), LocalTime.MAX).format(df);
rankingSettlement(startTime, endTime, "0");
}
/**
* 每周订单结算周一凌晨30分执行查询上一周的订单然后生成订单排行数据
* 每周一凌晨0点30分0秒时触发执行
*/
@Scheduled(cron = "0 30 0 ? * MON")
public void weeklyRankingSettlement() {
String startTime = LocalDate.now().minusDays(8).atStartOfDay().format(df);
String endTime = LocalDateTime.of(LocalDate.now().minusDays(1), LocalTime.MAX).format(df);
rankingSettlement(startTime, endTime, "1");
}
/**
* 生产排行信息
* 1、查询所有的租户信息
* 2、查询每个租户的用户以及他们在对应时间段的订单
* 3、根据订单生产排行信息
*
* @param startTime 接单开始时间
* @param endTime 接单截至时间
* @param weeklyRanking weeklyRanking 日排名还是周排名0:每日排名;1:每周排名)
* @author admin
* @since 2024/6/12 15:21
**/
public void rankingSettlement(String startTime, String endTime, String weeklyRanking) {
// 1、查询所有的租户信息
List<SysTenantEntity> tenantEntities = sysTenantService.listAll();
// 2、查询每个租户的用户以及他们的订单信息
for (SysTenantEntity tenantEntity : tenantEntities) {
SecurityUtils.setTenantId(tenantEntity.getTenantId());
// 当前租户用户列表
List<PlayClerkUserInfoEntity> clerkUserReturnVos = clerkUserInfoService.listAll();
List<PlayClerkRankingInfoEntity> clerkRankingInfoEntities = new ArrayList<>();
// 查询当前租户、当前排行、的最后一次统计编号
Integer newSerialNumber = clerkRankingInfoService.selectSerialNumber(weeklyRanking);
// 生成每个人的订单排行信息
for (PlayClerkUserInfoEntity clerkUserInfo : clerkUserReturnVos) {
// 生成订单排行数据
clerkRankingInfoEntities.add(getClerkRanking(clerkUserInfo.getId(), startTime, endTime, weeklyRanking, newSerialNumber));
}
// 更新排行名次
clerkRankingInfoEntities.sort((p1, p2) -> p2.getOrderNumber() - p1.getOrderNumber());
for (int i = 0; i < clerkRankingInfoEntities.size(); i++) {
PlayClerkRankingInfoEntity item = clerkRankingInfoEntities.get(i);
item.setRankingIndex(i + 1);
if (i > 0) {
item.setPreviousMoney(clerkRankingInfoEntities.get(i - 1).getOrderMoney().subtract(item.getOrderMoney()));
}
}
// 排名数据生成后,将以往排名状态标记为历史排名
clerkRankingInfoService.updateClerkRankingInfo(weeklyRanking, newSerialNumber);
// 插入本次排名数据
clerkRankingInfoService.saveBatch(clerkRankingInfoEntities);
}
}
/**
* 生产当前排行信息
*
* @param clerkId 店员ID
* @param startTime 排行开始统计日期
* @param endTime 排行结束统计日期
* @param rankingId 排行榜ID
* @param newSerialNumber 统计批次
* @param clerkId 店员ID
* @param startTime 排行开始统计日期 yyyy-mm-dd 00:00:00
* @param endTime 排行结束统计日期 yyyy-mm-dd 23:59:59
* @param weeklyRanking 日排名还是周排名0:每日排名;1:每周排名)
* @param serialNumber 查询当前租户、当前排行、的最后一次统计编号
* @author admin
* @since 2024/6/7 11:43
**/
public void createClerkRanking(String clerkId, LocalDate startTime, LocalDate endTime, String rankingId, Integer newSerialNumber) {
public PlayClerkRankingInfoEntity getClerkRanking(String clerkId, String startTime, String endTime, String weeklyRanking, Integer serialNumber) {
List<PlayOrderInfoEntity> orderInfoEntities = orderInfoService.listByTime(clerkId, startTime, endTime);
int orderNumber = orderInfoEntities.size();
BigDecimal orderMoney = BigDecimal.ZERO;
@@ -113,22 +149,29 @@ public class OrderRankingSettlementTask {
BigDecimal orderContinueProportion = orderNumber == 0 ? BigDecimal.ZERO : new BigDecimal(ordersExpiredNumber).divide(new BigDecimal(orderNumber), 4, RoundingMode.HALF_UP).add(new BigDecimal(100));
BigDecimal averageUnitPrice = customIds.isEmpty() ? BigDecimal.ZERO : orderMoney.divide(new BigDecimal(customIds.size()), 4, RoundingMode.HALF_UP);
PlayClerkRankingInfoEntity rankingInfo = new PlayClerkRankingInfoEntity();
rankingInfo.setId(rankingId);
rankingInfo.setId(IdUtils.getUuid());
rankingInfo.setClerkId(clerkId);
rankingInfo.setStartCountDate(startTime);
rankingInfo.setEndCountDate(endTime);
rankingInfo.setWeeklyRanking("0");
// 默认为当前统计
rankingInfo.setHistoricalStatistics("0");
rankingInfo.setWeeklyRanking(weeklyRanking);
// 当前统计编号+1
rankingInfo.setSerialNumber(serialNumber + 1);
// 每个人的名次默认为1后面在进行排序更新名次
rankingInfo.setRankingIndex(1);
// 统计时间
rankingInfo.setStartCountDate(LocalDate.parse(startTime, df));
rankingInfo.setEndCountDate(LocalDate.parse(endTime, df));
rankingInfo.setOrderNumber(orderInfoEntities.size());
rankingInfo.setSerialNumber(newSerialNumber + 1);
rankingInfo.setOrderMoney(orderMoney);
rankingInfo.setOrderContinueMoney(orderContinueMoney);
rankingInfo.setOrderContinueNumber(orderContinueNumber);
rankingInfo.setOrdersExpiredNumber(ordersExpiredNumber);
rankingInfo.setOrderContinueProportion(orderContinueProportion);
rankingInfo.setOrdersExpiredNumber(ordersExpiredNumber);
rankingInfo.setCustomNumber(customIds.size());
rankingInfo.setAverageUnitPrice(averageUnitPrice);
rankingInfo.setPreviousMoney(BigDecimal.ZERO);
rankingInfo.setSettlementDate(LocalDate.now());
clerkRankingInfoService.saveOrUpdate(rankingInfo);
return rankingInfo;
}

View File

@@ -45,12 +45,22 @@ public interface IPlayClerkRankingInfoService extends IService<PlayClerkRankingI
IPage<PlayClerkRankingInfoEntity> selectPlayClerkRankingInfoByPage(PlayClerkRankingInfoEntity playClerkRankingInfo);
/**
* 根据统计批次更新排名数据
*
* @param weeklyRanking 日排名还是周排名0:每日排名;1:每周排名)
* @param serialNumber 统计批次
* @author admin
* @since 2024/6/12 15:47
**/
void updateClerkRankingInfo(String weeklyRanking, Integer serialNumber);
/**
* 查询当前排行榜最后一个批次值
*
* @param weeklyRanking 日排名还是周排名0:每日排名;1:每周排名)
* @return Integer 当前排行榜最后一个批次值
* @author 杭州世平信息科技有限公司-xuhq
* @author admin
* @since 2024/6/7 11:53
**/
Integer selectSerialNumber(String weeklyRanking);
@@ -61,7 +71,7 @@ public interface IPlayClerkRankingInfoService extends IService<PlayClerkRankingI
*
* @param weeklyRanking 日排名还是周排名0:每日排名;1:每周排名)
* @return List<com.starry.admin.modules.clerk.module.entity.PlayClerkRankingInfoEntity>
* @author 杭州世平信息科技有限公司-xuhq
* @author admin
* @since 2024/6/7 11:55
**/
List<PlayClerkRankingInfoEntity> selectMaxSerialNumber(String weeklyRanking);

View File

@@ -2,6 +2,7 @@ package com.starry.admin.modules.clerk.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -37,7 +38,7 @@ public class PlayClerkRankingInfoServiceImpl extends ServiceImpl<PlayClerkRankin
MPJLambdaWrapper<PlayClerkRankingInfoEntity> lambdaQueryWrapper = new MPJLambdaWrapper<>();
lambdaQueryWrapper.selectAll(PlayClerkRankingInfoEntity.class);
// 拼接店员表
lambdaQueryWrapper.selectAs(PlayClerkUserInfoEntity::getNickname, "clerkNickname").selectAs(PlayClerkUserInfoEntity::getSex,"clerkSex");
lambdaQueryWrapper.selectAs(PlayClerkUserInfoEntity::getNickname, "clerkNickname").selectAs(PlayClerkUserInfoEntity::getSex, "clerkSex");
lambdaQueryWrapper.leftJoin(PlayClerkUserInfoEntity.class, PlayClerkUserInfoEntity::getId, PlayClerkRankingInfoEntity::getClerkId);
if (StrUtil.isNotBlank(vo.getClerkId())) {
lambdaQueryWrapper.eq(PlayClerkRankingInfoEntity::getClerkId, vo.getClerkId());
@@ -110,6 +111,16 @@ public class PlayClerkRankingInfoServiceImpl extends ServiceImpl<PlayClerkRankin
return this.baseMapper.selectList(lambdaQueryWrapper);
}
@Override
public void updateClerkRankingInfo(String weeklyRanking, Integer serialNumber) {
LambdaUpdateWrapper<PlayClerkRankingInfoEntity> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(PlayClerkRankingInfoEntity::getWeeklyRanking, weeklyRanking);
lambdaUpdateWrapper.eq(PlayClerkRankingInfoEntity::getSerialNumber, serialNumber);
lambdaUpdateWrapper.set(PlayClerkRankingInfoEntity::getHistoricalStatistics, "1");
this.baseMapper.update(null, lambdaUpdateWrapper);
}
/**
* 获取当前期排名序号
*

View File

@@ -8,7 +8,6 @@ import com.starry.admin.modules.weichat.entity.order.*;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@@ -87,74 +86,6 @@ public interface IPlayOrderInfoService extends IService<PlayOrderInfoEntity> {
* @since 2024/6/3 11:12
**/
Integer getEstimatedRevenueRatio(String clerkId, String placeType, String firstOrder);
/**
* 新增打赏单
*
* @param orderId 订单ID
* @param orderMoney 订单金额
* @param finalAmount 订单最终金额(支付金额)
* @param purchaserBy 下单人ID
* @param acceptBy 接单人ID
* @param remark 订单备注
* @param weiChatCode 微信号码
*/
void createRewardOrder(String orderId, BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy, String acceptBy, String remark, String weiChatCode);
/**
* 新增赠送礼物订单
*
* @param orderId 订单ID
* @param commodityId 商品ID礼物ID
* @param commodityPrice 商品单价(礼物单价)
* @param commodityNumber 商品数量(礼物数量)
* @param orderMoney 订单金额
* @param finalAmount 订单最终金额(支付金额)
* @param purchaserBy 下单人ID
* @param acceptBy 接单人ID
* @param remark 订单备注
* @param weiChatCode 微信号码
*/
void createGiftOrder(String orderId, String commodityId, BigDecimal commodityPrice, String commodityNumber, BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy, String acceptBy, String remark, String weiChatCode);
/**
* 新增指定订单
*
* @param orderId 订单ID
* @param commodityId 商品ID
* @param commodityPrice 商品单价
* @param commodityNumber 商品数量
* @param serviceDuration 服务时长
* @param commodityName 商品名称
* @param orderMoney 订单金额
* @param finalAmount 订单最终金额(支付金额)
* @param purchaserBy 下单人ID
* @param acceptBy 接单人ID
* @param remark 订单备注
* @param weiChatCode 微信号码
*/
void createOrdinaryOrder(String orderId, String commodityId, BigDecimal commodityPrice, String commodityNumber, String serviceDuration, String commodityName, BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy, String acceptBy, String remark, String weiChatCode);
/**
* 新增指定订单
*
* @param orderId 订单ID
* @param commodityId 商品ID
* @param commodityPrice 商品单价
* @param commodityNumber 商品数量
* @param serviceDuration 服务时长
* @param commodityName 商品名称
* @param orderMoney 订单金额
* @param finalAmount 订单最终金额(支付金额)
* @param purchaserBy 下单人ID
* @param remark 订单备注
* @param weiChatCode 微信号码
*/
void createRandomOrder(String orderId, String commodityId, BigDecimal commodityPrice, String commodityNumber, String serviceDuration, String commodityName, BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy, String remark, String weiChatCode);
/**
* 根据订单结算状态查询订单
*
@@ -182,7 +113,7 @@ public interface IPlayOrderInfoService extends IService<PlayOrderInfoEntity> {
* @param endTime 结束时间
* @return List<PlayOrderInfoEntity>
*/
List<PlayOrderInfoEntity> listByTime(String clerkId, LocalDate startTime, LocalDate endTime);
List<PlayOrderInfoEntity> listByTime(String clerkId, String startTime, String endTime);
/**
* 分页查询打赏订单

View File

@@ -35,7 +35,6 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
@@ -202,119 +201,11 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
}
}
/**
* 新增打赏单
* 打赏订单直接完成
*
* @param orderMoney 订单金额
* @param finalAmount 订单最终金额(支付金额)
* @param purchaserBy 下单人ID
*/
@Override
public void createRewardOrder(String orderId, BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy, String acceptBy, String remark, String weiChatCode) {
PlayOrderInfoEntity entity = new PlayOrderInfoEntity(orderId, ORDER_STATUS_3, "2", "2");
entity.setOrderMoney(orderMoney);
entity.setRefundType("0");
entity.setFinalAmount(finalAmount);
entity.setPurchaserBy(purchaserBy);
entity.setPurchaserTime(LocalDateTime.now());
entity.setAcceptBy(acceptBy);
entity.setAcceptTime(LocalDateTime.now());
entity.setRemark(remark);
entity.setWeiChatCode(weiChatCode);
this.baseMapper.insert(entity);
}
/**
* 新增赠送礼物订单
*
* @param commodityId 商品ID礼物ID
* @param commodityPrice 商品单价(礼物单价)
* @param commodityNumber 商品数量(礼物数量)
* @param orderMoney 订单金额
* @param finalAmount 订单最终金额(支付金额)
* @param purchaserBy 下单人ID
* @param acceptBy 接单人ID
*/
@Override
public void createGiftOrder(String orderId, String commodityId, BigDecimal commodityPrice, String commodityNumber, BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy, String acceptBy, String remark, String weiChatCode) {
PlayOrderInfoEntity entity = new PlayOrderInfoEntity(orderId, ORDER_STATUS_3, "2", "2");
entity.setOrderNo(this.getOrderNo());
entity.setRefundType("1");
entity.setCommodityId(commodityId);
entity.setCommodityPrice(commodityPrice);
entity.setCommodityNumber(commodityNumber);
entity.setCommodityType("0");
entity.setOrderMoney(orderMoney);
entity.setFinalAmount(finalAmount);
entity.setPurchaserBy(purchaserBy);
entity.setPurchaserTime(LocalDateTime.now());
entity.setAcceptBy(acceptBy);
entity.setAcceptTime(LocalDateTime.now());
entity.setRemark(remark);
entity.setWeiChatCode(weiChatCode);
this.baseMapper.insert(entity);
}
/**
* 新增指定订单
*
* @param commodityId 商品ID
* @param commodityPrice 商品单价
* @param commodityNumber 商品数量
* @param orderMoney 订单金额
* @param finalAmount 订单最终金额(支付金额)
* @param purchaserBy 下单人ID
* @param acceptBy 接单人ID
*/
@Override
public void createOrdinaryOrder(String orderId, String commodityId, BigDecimal commodityPrice, String commodityNumber, String serviceDuration, String commodityName, BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy, String acceptBy, String remark, String weiChatCode) {
PlayOrderInfoEntity entity = new PlayOrderInfoEntity(orderId, OrderConstant.ORDER_STATUS_0, "2", "0");
entity.setOrderNo(this.getOrderNo());
entity.setCommodityId(commodityId);
entity.setCommodityPrice(commodityPrice);
entity.setCommodityNumber(commodityNumber);
entity.setCommodityName(commodityName);
entity.setServiceDuration(serviceDuration);
entity.setCommodityType("1");
entity.setOrderMoney(orderMoney);
entity.setFinalAmount(finalAmount);
entity.setPurchaserBy(purchaserBy);
entity.setPurchaserTime(LocalDateTime.now());
entity.setAcceptBy(acceptBy);
entity.setAcceptTime(LocalDateTime.now());
entity.setRemark(remark);
entity.setWeiChatCode(weiChatCode);
this.baseMapper.insert(entity);
}
@Override
public void createRandomOrder(String orderId, String commodityId, BigDecimal commodityPrice, String commodityNumber, String serviceDuration, String commodityName, BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy, String remark, String weiChatCode) {
PlayOrderInfoEntity entity = new PlayOrderInfoEntity(orderId, OrderConstant.ORDER_STATUS_0, "2", "1");
entity.setOrderNo(this.getOrderNo());
entity.setCommodityId(commodityId);
entity.setCommodityPrice(commodityPrice);
entity.setCommodityNumber(commodityNumber);
entity.setCommodityName(commodityName);
entity.setServiceDuration(serviceDuration);
entity.setCommodityType("1");
entity.setOrderMoney(orderMoney);
entity.setFinalAmount(finalAmount);
entity.setPurchaserBy(purchaserBy);
entity.setPurchaserTime(LocalDateTime.now());
entity.setAcceptTime(LocalDateTime.now());
entity.setRemark(remark);
entity.setWeiChatCode(weiChatCode);
this.baseMapper.insert(entity);
}
/**
* 新增充值订单
*
* @param orderOn 订单编号
* @param orderId 订单编号
* @param orderMoney 订单金额
* @param finalAmount 订单最终金额(支付金额)
* @param purchaserBy 下单人ID
@@ -369,7 +260,7 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
}
@Override
public List<PlayOrderInfoEntity> listByTime(String clerkId, LocalDate startTime, LocalDate endTime) {
public List<PlayOrderInfoEntity> listByTime(String clerkId, String startTime, String endTime) {
MPJLambdaWrapper<PlayOrderInfoEntity> lambdaQueryWrapper = new MPJLambdaWrapper<>();
lambdaQueryWrapper.eq(PlayOrderInfoEntity::getAcceptBy, clerkId);
lambdaQueryWrapper.between(PlayOrderInfoEntity::getAcceptTime, startTime, endTime);