订单排行

This commit is contained in:
admin
2024-06-07 13:16:43 +08:00
parent f066b40309
commit a8323387ae
6 changed files with 98 additions and 59 deletions

View File

@@ -13,6 +13,7 @@ import com.starry.admin.modules.platform.entity.SysTenantEntity;
import com.starry.admin.modules.platform.service.ISysTenantService; import com.starry.admin.modules.platform.service.ISysTenantService;
import com.starry.admin.utils.SecurityUtils; import com.starry.admin.utils.SecurityUtils;
import com.starry.common.utils.IdUtils; import com.starry.common.utils.IdUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -53,7 +54,7 @@ public class ClerkWagesSettlementTask {
* 每分钟查询未结算订单 * 每分钟查询未结算订单
* 如果订单完成时间超过24小时可进行结算生成工资 * 如果订单完成时间超过24小时可进行结算生成工资
*/ */
// @Scheduled(cron = "0 0/1 * * * ?") @Scheduled(cron = "0 0/1 * * * ?")
public void dailyRanking() { public void dailyRanking() {
// 1、查询所有的租户信息 // 1、查询所有的租户信息
List<SysTenantEntity> tenantEntities = sysTenantService.listAll(); List<SysTenantEntity> tenantEntities = sysTenantService.listAll();

View File

@@ -10,12 +10,16 @@ import com.starry.admin.modules.platform.entity.SysTenantEntity;
import com.starry.admin.modules.platform.service.ISysTenantService; import com.starry.admin.modules.platform.service.ISysTenantService;
import com.starry.admin.utils.SecurityUtils; import com.starry.admin.utils.SecurityUtils;
import com.starry.common.utils.IdUtils; import com.starry.common.utils.IdUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* 订单排名结算信息 * 订单排名结算信息
@@ -42,27 +46,26 @@ public class OrderRankingSettlementTask {
* 当日订单结算,查询前一日的订单信息,生成订单排名数据 * 当日订单结算,查询前一日的订单信息,生成订单排名数据
* 每天凌晨0点5分0秒时触发执行 * 每天凌晨0点5分0秒时触发执行
*/ */
// @Scheduled(cron = "0 10 0 * * ?") @Scheduled(cron = "0 10 0 * * ?")
public void dailyRanking() { public void dailyRanking() {
// 1、查询所有的租户信息 // 1、查询所有的租户信息
List<SysTenantEntity> tenantEntities = sysTenantService.listAll(); List<SysTenantEntity> tenantEntities = sysTenantService.listAll();
LocalDate startTime = LocalDate.now().minusDays(1); LocalDate startTime = LocalDate.now().minusDays(1);
LocalDate endTime = LocalDate.now(); LocalDate endTime = LocalDate.now();
// 2、查询每个租户的用户以及他们的订单信息 // 2、查询每个租户的用户以及他们的订单信息
Integer newSerialNumber = clerkRankingInfoService.selectSerialNumber(); Integer newSerialNumber = clerkRankingInfoService.selectSerialNumber("0");
for (SysTenantEntity tenantEntity : tenantEntities) { for (SysTenantEntity tenantEntity : tenantEntities) {
SecurityUtils.setTenantId(tenantEntity.getTenantId()); SecurityUtils.setTenantId(tenantEntity.getTenantId());
List<PlayClerkUserInfoEntity> clerkUserReturnVos = clerkUserInfoService.listAll(); List<PlayClerkUserInfoEntity> clerkUserReturnVos = clerkUserInfoService.listAll();
// 生成每个人的订单排行信息 // 生成每个人的订单排行信息
for (PlayClerkUserInfoEntity clerkUserInfo : clerkUserReturnVos) { for (PlayClerkUserInfoEntity clerkUserInfo : clerkUserReturnVos) {
// 查询当前店员一定时间的订单信息 // 查询当前店员一定时间的订单信息
List<PlayOrderInfoEntity> orderInfoEntities = orderInfoService.listByTime(clerkUserInfo.getId(), startTime, endTime); String rankId = IdUtils.getUuid();
PlayClerkRankingInfoEntity rankingInfo = clerkRankingInfoService.selectByTime(clerkUserInfo.getId(), startTime, endTime);
// 3、根据订单信息生成对应排名数据 // 3、根据订单信息生成对应排名数据
updateClerkRanking(clerkUserInfo.getId(), startTime, endTime, rankingInfo, orderInfoEntities, newSerialNumber); createClerkRanking(clerkUserInfo.getId(), startTime, endTime, rankId, newSerialNumber);
} }
// 根据订单数量,更新排行名次 // 根据订单数量,更新排行名次
List<PlayClerkRankingInfoEntity> list = clerkRankingInfoService.selectMaxSerialNumber(); List<PlayClerkRankingInfoEntity> list = clerkRankingInfoService.selectMaxSerialNumber("0");
// 使用匿名比较器排序 // 使用匿名比较器排序
list.sort((p1, p2) -> p2.getOrderNumber() - p1.getOrderNumber()); list.sort((p1, p2) -> p2.getOrderNumber() - p1.getOrderNumber());
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
@@ -76,41 +79,54 @@ public class OrderRankingSettlementTask {
} }
} }
/** /**
* 更新当前店员的排名信息 * 生产当前排行信息
* *
* @param clerkId 店员ID * @param clerkId 店员ID
* @param rankingInfo 店员排名信息 * @param startTime 排行开始统计日期
* @param orderInfoEntities 店员订单信息 * @param endTime 排行结束统计日期
*/ * @param rankingId 排行榜ID
public void updateClerkRanking(String clerkId, LocalDate startTime, LocalDate endTime, PlayClerkRankingInfoEntity rankingInfo, List<PlayOrderInfoEntity> orderInfoEntities, Integer newSerialNumber) { * @param newSerialNumber 统计批次
//排行-订单信息 * @author admin
* @since 2024/6/7 11:43
**/
public void createClerkRanking(String clerkId, LocalDate startTime, LocalDate endTime, String rankingId, Integer newSerialNumber) {
List<PlayOrderInfoEntity> orderInfoEntities = orderInfoService.listByTime(clerkId, startTime, endTime);
int orderNumber = orderInfoEntities.size();
BigDecimal orderMoney = BigDecimal.ZERO; BigDecimal orderMoney = BigDecimal.ZERO;
Integer orderContinueNumber = 0; Integer orderContinueNumber = 0;
BigDecimal orderContinueMoney = BigDecimal.ZERO; BigDecimal orderContinueMoney = BigDecimal.ZERO;
Integer ordersExpiredNumber = 0; int ordersExpiredNumber = 0;
Set<String> customIds = new HashSet<>();
for (PlayOrderInfoEntity orderInfoEntity : orderInfoEntities) { for (PlayOrderInfoEntity orderInfoEntity : orderInfoEntities) {
customIds.add(orderInfoEntity.getAcceptBy());
orderMoney = orderMoney.add(orderInfoEntity.getOrderMoney()); orderMoney = orderMoney.add(orderInfoEntity.getOrderMoney());
if ("0".equals(orderInfoEntity.getFirstOrder())) { if ("0".equals(orderInfoEntity.getFirstOrder())) {
orderContinueNumber++; orderContinueNumber++;
orderContinueMoney = orderContinueMoney.add(orderInfoEntity.getOrderMoney()); orderContinueMoney = orderContinueMoney.add(orderInfoEntity.getOrderMoney());
} }
if ("1".equals(orderInfoEntity.getOrdersExpiredState())) {
ordersExpiredNumber++;
} }
if (rankingInfo == null) {
rankingInfo = new PlayClerkRankingInfoEntity();
rankingInfo.setId(IdUtils.getUuid());
rankingInfo.setSerialNumber(newSerialNumber + 1);
} }
BigDecimal orderContinueProportion = new BigDecimal(ordersExpiredNumber).divide(new BigDecimal(orderNumber), 4, RoundingMode.HALF_UP).add(new BigDecimal(100));
BigDecimal averageUnitPrice = orderMoney.divide(new BigDecimal(customIds.size()), 4, RoundingMode.HALF_UP);
PlayClerkRankingInfoEntity rankingInfo = new PlayClerkRankingInfoEntity();
rankingInfo.setId(rankingId);
rankingInfo.setClerkId(clerkId); rankingInfo.setClerkId(clerkId);
rankingInfo.setStartCountDate(startTime); rankingInfo.setStartCountDate(startTime);
rankingInfo.setEndCountDate(endTime); rankingInfo.setEndCountDate(endTime);
rankingInfo.setOrderNumber(orderInfoEntities.size()); rankingInfo.setOrderNumber(orderInfoEntities.size());
rankingInfo.setSerialNumber(newSerialNumber); rankingInfo.setSerialNumber(newSerialNumber + 1);
rankingInfo.setOrderMoney(orderMoney); rankingInfo.setOrderMoney(orderMoney);
rankingInfo.setOrderContinueMoney(orderContinueMoney); rankingInfo.setOrderContinueMoney(orderContinueMoney);
rankingInfo.setOrderContinueNumber(orderContinueNumber); rankingInfo.setOrderContinueNumber(orderContinueNumber);
rankingInfo.setOrdersExpiredNumber(ordersExpiredNumber); rankingInfo.setOrdersExpiredNumber(ordersExpiredNumber);
rankingInfo.setOrderContinueProportion(orderContinueProportion);
rankingInfo.setCustomNumber(customIds.size());
rankingInfo.setAverageUnitPrice(averageUnitPrice);
rankingInfo.setSettlementDate(LocalDate.now());
clerkRankingInfoService.saveOrUpdate(rankingInfo); clerkRankingInfoService.saveOrUpdate(rankingInfo);
} }

View File

@@ -1,10 +1,7 @@
package com.starry.admin.modules.clerk.module.entity; package com.starry.admin.modules.clerk.module.entity;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.starry.common.domain.BasePageEntity;
import io.swagger.models.auth.In;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -99,9 +96,8 @@ public class IPlayClerkRankingInfoReturnVo {
*/ */
private Integer customNumber; private Integer customNumber;
/** /**
* 评价单价 * 订单平均价格
*/ */
private BigDecimal averageUnitPrice = BigDecimal.ZERO; private BigDecimal averageUnitPrice = BigDecimal.ZERO;
/** /**

View File

@@ -97,7 +97,20 @@ public class PlayClerkRankingInfoEntity extends BaseEntity<PlayClerkRankingInfoE
*/ */
private Integer ordersExpiredNumber = 0; private Integer ordersExpiredNumber = 0;
/**
* 续单比例
*/
private BigDecimal orderContinueProportion = BigDecimal.ZERO;
/**
* 客户数
*/
private Integer customNumber;
/**
* 订单平均价格
*/
private BigDecimal averageUnitPrice = BigDecimal.ZERO;
/** /**
* 距离前一名相差金额 * 距离前一名相差金额
*/ */

View File

@@ -22,6 +22,7 @@ public interface IPlayClerkRankingInfoService extends IService<PlayClerkRankingI
/** /**
* 分页查询店员排行 * 分页查询店员排行
*
* @param vo 店员排行查询对象 * @param vo 店员排行查询对象
* @return 店员排查询对象 * @return 店员排查询对象
*/ */
@@ -48,15 +49,26 @@ public interface IPlayClerkRankingInfoService extends IService<PlayClerkRankingI
* *
* @return PlayClerkRankingInfoEntity * @return PlayClerkRankingInfoEntity
*/ */
Integer selectSerialNumber(); /**
* 查询当前排行榜最后一个批次值
*
* @param weeklyRanking 日排名还是周排名0:每日排名;1:每周排名)
* @return Integer 当前排行榜最后一个批次值
* @author 杭州世平信息科技有限公司-xuhq
* @since 2024/6/7 11:53
**/
Integer selectSerialNumber(String weeklyRanking);
/** /**
* 查询最后一次排行统计列表 * 查询当前排行榜最大批次
* *
* @return 排行信息列表 * @param weeklyRanking 日排名还是周排名0:每日排名;1:每周排名)
*/ * @return List<com.starry.admin.modules.clerk.module.entity.PlayClerkRankingInfoEntity>
List<PlayClerkRankingInfoEntity> selectMaxSerialNumber(); * @author 杭州世平信息科技有限公司-xuhq
* @since 2024/6/7 11:55
**/
List<PlayClerkRankingInfoEntity> selectMaxSerialNumber(String weeklyRanking);
/** /**
* 根据时间查询店员排行 * 根据时间查询店员排行

View File

@@ -65,7 +65,7 @@ public class PlayClerkRankingInfoServiceImpl extends ServiceImpl<PlayClerkRankin
@Override @Override
public List<PlayOrderHistoryRankingReturnVo> selectHistoryRanking(String clerkId) { public List<PlayOrderHistoryRankingReturnVo> selectHistoryRanking(String clerkId) {
long serialNumber = selectSerialNumber(); long serialNumber = selectSerialNumber("1");
MPJLambdaWrapper<PlayClerkRankingInfoEntity> lambdaQueryWrapper = new MPJLambdaWrapper<>(); MPJLambdaWrapper<PlayClerkRankingInfoEntity> lambdaQueryWrapper = new MPJLambdaWrapper<>();
// 根据排行序号和用户ID查询 // 根据排行序号和用户ID查询
lambdaQueryWrapper.ne(PlayClerkRankingInfoEntity::getSerialNumber, serialNumber); lambdaQueryWrapper.ne(PlayClerkRankingInfoEntity::getSerialNumber, serialNumber);
@@ -75,7 +75,7 @@ public class PlayClerkRankingInfoServiceImpl extends ServiceImpl<PlayClerkRankin
@Override @Override
public PlayOrderRankingReturnVo selectCurrentRanking(String clerkId) { public PlayOrderRankingReturnVo selectCurrentRanking(String clerkId) {
long serialNumber = selectSerialNumber(); long serialNumber = selectSerialNumber("1");
MPJLambdaWrapper<PlayClerkRankingInfoEntity> lambdaQueryWrapper = new MPJLambdaWrapper<>(); MPJLambdaWrapper<PlayClerkRankingInfoEntity> lambdaQueryWrapper = new MPJLambdaWrapper<>();
lambdaQueryWrapper.selectAll(PlayClerkRankingInfoEntity.class); lambdaQueryWrapper.selectAll(PlayClerkRankingInfoEntity.class);
// 店员信息 // 店员信息
@@ -97,9 +97,9 @@ public class PlayClerkRankingInfoServiceImpl extends ServiceImpl<PlayClerkRankin
@Override @Override
public List<PlayClerkRankingInfoEntity> selectMaxSerialNumber() { public List<PlayClerkRankingInfoEntity> selectMaxSerialNumber(String weeklyRanking) {
MPJLambdaWrapper<PlayClerkRankingInfoEntity> lambdaQueryWrapper = new MPJLambdaWrapper<>(); MPJLambdaWrapper<PlayClerkRankingInfoEntity> lambdaQueryWrapper = new MPJLambdaWrapper<>();
lambdaQueryWrapper.eq(PlayClerkRankingInfoEntity::getSerialNumber, this.selectSerialNumber()); lambdaQueryWrapper.eq(PlayClerkRankingInfoEntity::getSerialNumber, this.selectSerialNumber(weeklyRanking));
return this.baseMapper.selectList(lambdaQueryWrapper); return this.baseMapper.selectList(lambdaQueryWrapper);
} }
@@ -109,8 +109,9 @@ public class PlayClerkRankingInfoServiceImpl extends ServiceImpl<PlayClerkRankin
* @return PlayClerkRankingInfoEntity * @return PlayClerkRankingInfoEntity
*/ */
@Override @Override
public Integer selectSerialNumber() { public Integer selectSerialNumber(String weeklyRanking) {
LambdaQueryWrapper<PlayClerkRankingInfoEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<PlayClerkRankingInfoEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(PlayClerkRankingInfoEntity::getWeeklyRanking, weeklyRanking);
lambdaQueryWrapper.orderByDesc(PlayClerkRankingInfoEntity::getSerialNumber).last("limit 1"); lambdaQueryWrapper.orderByDesc(PlayClerkRankingInfoEntity::getSerialNumber).last("limit 1");
PlayClerkRankingInfoEntity entity = this.baseMapper.selectOne(lambdaQueryWrapper); PlayClerkRankingInfoEntity entity = this.baseMapper.selectOne(lambdaQueryWrapper);
if (entity == null || entity.getSerialNumber() == null) { if (entity == null || entity.getSerialNumber() == null) {