订单排行
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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;
|
||||||
/**
|
/**
|
||||||
* 距离前一名相差金额
|
* 距离前一名相差金额
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据时间查询店员排行
|
* 根据时间查询店员排行
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user