diff --git a/play-admin/src/main/java/com/starry/admin/common/task/ClerkWagesSettlementTask.java b/play-admin/src/main/java/com/starry/admin/common/task/ClerkWagesSettlementTask.java index 8350694..6a4afe8 100644 --- a/play-admin/src/main/java/com/starry/admin/common/task/ClerkWagesSettlementTask.java +++ b/play-admin/src/main/java/com/starry/admin/common/task/ClerkWagesSettlementTask.java @@ -13,6 +13,7 @@ import com.starry.admin.modules.platform.entity.SysTenantEntity; import com.starry.admin.modules.platform.service.ISysTenantService; import com.starry.admin.utils.SecurityUtils; import com.starry.common.utils.IdUtils; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -53,14 +54,14 @@ public class ClerkWagesSettlementTask { * 每分钟查询未结算订单 * 如果订单完成时间超过24小时,可进行结算,生成工资 */ -// @Scheduled(cron = "0 0/1 * * * ?") + @Scheduled(cron = "0 0/1 * * * ?") public void dailyRanking() { - //1、查询所有的租户信息 + // 1、查询所有的租户信息 List tenantEntities = sysTenantService.listAll(); for (SysTenantEntity tenantEntity : tenantEntities) { SecurityUtils.setTenantId(tenantEntity.getTenantId()); List clerkUserReturnVos = clerkUserInfoService.listAll(); - //生成每个人的工资信息 + // 生成每个人的工资信息 for (PlayClerkUserInfoEntity clerkUserInfo : clerkUserReturnVos) { updateClerkWagesInfo(clerkUserInfo.getId()); } @@ -74,12 +75,12 @@ public class ClerkWagesSettlementTask { * @param clerkId 店员ID */ public void updateClerkWagesInfo(String clerkId) { - //获得24小时前完成,并且未结算的订单 + // 获得24小时前完成,并且未结算的订单 LocalDateTime lastTime = LocalDateTime.now().minusDays(1); - //查询当前店员上次结算工资到现在的订单 + // 查询当前店员上次结算工资到现在的订单 List orderInfoEntities = playOrderInfoService.listByEndTime(clerkId, lastTime); PlayClerkWagesInfoEntity entity = playClerkWagesInfoService.getLastSettlement(clerkId); - //更新订单信息 + // 更新订单信息 updateClerkWagesInfo(clerkId, entity == null ? IdUtils.getUuid() : entity.getId(), orderInfoEntities); } @@ -91,9 +92,9 @@ public class ClerkWagesSettlementTask { * @param orderInfoEntities 订单列表 */ public void updateClerkWagesInfo(String clerkId, String wagesId, List orderInfoEntities) { - //修改订单状态并且新增订单结算详情 + // 修改订单状态并且新增订单结算详情 for (PlayOrderInfoEntity orderInfo : orderInfoEntities) { - //修改订单状态 + // 修改订单状态 orderInfo.setOrderSettlementState("1"); orderInfo.setOrderSettlementTime(LocalDateTime.now()); playOrderInfoService.update(orderInfo); @@ -103,7 +104,7 @@ public class ClerkWagesSettlementTask { wagesDetailsInfo = new PlayClerkWagesDetailsInfoEntity(); wagesDetailsInfo.setId(IdUtils.getUuid()); } - //新增订单结算详情 + // 新增订单结算详情 wagesDetailsInfo.setWagesId(wagesId); wagesDetailsInfo.setClerkId(clerkId); wagesDetailsInfo.setOrderId(orderInfo.getId()); @@ -113,7 +114,7 @@ public class ClerkWagesSettlementTask { wagesDetailsInfo.setEndOrderTime(orderInfo.getOrderEndTime()); playClerkWagesDetailsInfoService.saveOrUpdate(wagesDetailsInfo); } - //新增订单结算信息 + // 新增订单结算信息 BigDecimal finalAmount = BigDecimal.ZERO; Integer orderContinueNumber = 0; BigDecimal orderContinueMoney = BigDecimal.ZERO; diff --git a/play-admin/src/main/java/com/starry/admin/common/task/OrderRankingSettlementTask.java b/play-admin/src/main/java/com/starry/admin/common/task/OrderRankingSettlementTask.java index 0e12a0a..f5bf0f6 100644 --- a/play-admin/src/main/java/com/starry/admin/common/task/OrderRankingSettlementTask.java +++ b/play-admin/src/main/java/com/starry/admin/common/task/OrderRankingSettlementTask.java @@ -10,12 +10,16 @@ import com.starry.admin.modules.platform.entity.SysTenantEntity; import com.starry.admin.modules.platform.service.ISysTenantService; import com.starry.admin.utils.SecurityUtils; import com.starry.common.utils.IdUtils; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDate; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * 订单排名结算信息 @@ -42,27 +46,26 @@ public class OrderRankingSettlementTask { * 当日订单结算,查询前一日的订单信息,生成订单排名数据 * 每天凌晨0点5分0秒时触发执行 */ -// @Scheduled(cron = "0 10 0 * * ?") + @Scheduled(cron = "0 10 0 * * ?") public void dailyRanking() { - //1、查询所有的租户信息 + // 1、查询所有的租户信息 List tenantEntities = sysTenantService.listAll(); LocalDate startTime = LocalDate.now().minusDays(1); LocalDate endTime = LocalDate.now(); - //2、查询每个租户的用户,以及他们的订单信息 - Integer newSerialNumber = clerkRankingInfoService.selectSerialNumber(); + // 2、查询每个租户的用户,以及他们的订单信息 + Integer newSerialNumber = clerkRankingInfoService.selectSerialNumber("0"); for (SysTenantEntity tenantEntity : tenantEntities) { SecurityUtils.setTenantId(tenantEntity.getTenantId()); List clerkUserReturnVos = clerkUserInfoService.listAll(); - //生成每个人的订单排行信息 + // 生成每个人的订单排行信息 for (PlayClerkUserInfoEntity clerkUserInfo : clerkUserReturnVos) { - //查询当前店员一定时间的订单信息 - List orderInfoEntities = orderInfoService.listByTime(clerkUserInfo.getId(), startTime, endTime); - PlayClerkRankingInfoEntity rankingInfo = clerkRankingInfoService.selectByTime(clerkUserInfo.getId(), startTime, endTime); - //3、根据订单信息,生成对应排名数据 - updateClerkRanking(clerkUserInfo.getId(), startTime, endTime, rankingInfo, orderInfoEntities, newSerialNumber); + // 查询当前店员一定时间的订单信息 + String rankId = IdUtils.getUuid(); + // 3、根据订单信息,生成对应排名数据 + createClerkRanking(clerkUserInfo.getId(), startTime, endTime, rankId, newSerialNumber); } - //根据订单数量,更新排行名次 - List list = clerkRankingInfoService.selectMaxSerialNumber(); + // 根据订单数量,更新排行名次 + List list = clerkRankingInfoService.selectMaxSerialNumber("0"); // 使用匿名比较器排序 list.sort((p1, p2) -> p2.getOrderNumber() - p1.getOrderNumber()); for (int i = 0; i < list.size(); i++) { @@ -76,41 +79,54 @@ public class OrderRankingSettlementTask { } } + /** - * 更新当前店员的排名信息 + * 生产当前排行信息 * - * @param clerkId 店员ID - * @param rankingInfo 店员排名信息 - * @param orderInfoEntities 店员订单信息 - */ - public void updateClerkRanking(String clerkId, LocalDate startTime, LocalDate endTime, PlayClerkRankingInfoEntity rankingInfo, List orderInfoEntities, Integer newSerialNumber) { - //排行-订单信息 + * @param clerkId 店员ID + * @param startTime 排行开始统计日期 + * @param endTime 排行结束统计日期 + * @param rankingId 排行榜ID + * @param newSerialNumber 统计批次 + * @author admin + * @since 2024/6/7 11:43 + **/ + public void createClerkRanking(String clerkId, LocalDate startTime, LocalDate endTime, String rankingId, Integer newSerialNumber) { + List orderInfoEntities = orderInfoService.listByTime(clerkId, startTime, endTime); + int orderNumber = orderInfoEntities.size(); BigDecimal orderMoney = BigDecimal.ZERO; Integer orderContinueNumber = 0; BigDecimal orderContinueMoney = BigDecimal.ZERO; - Integer ordersExpiredNumber = 0; + int ordersExpiredNumber = 0; + Set customIds = new HashSet<>(); for (PlayOrderInfoEntity orderInfoEntity : orderInfoEntities) { + customIds.add(orderInfoEntity.getAcceptBy()); orderMoney = orderMoney.add(orderInfoEntity.getOrderMoney()); if ("0".equals(orderInfoEntity.getFirstOrder())) { orderContinueNumber++; 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.setStartCountDate(startTime); rankingInfo.setEndCountDate(endTime); rankingInfo.setOrderNumber(orderInfoEntities.size()); - rankingInfo.setSerialNumber(newSerialNumber); + rankingInfo.setSerialNumber(newSerialNumber + 1); rankingInfo.setOrderMoney(orderMoney); rankingInfo.setOrderContinueMoney(orderContinueMoney); rankingInfo.setOrderContinueNumber(orderContinueNumber); rankingInfo.setOrdersExpiredNumber(ordersExpiredNumber); + rankingInfo.setOrderContinueProportion(orderContinueProportion); + rankingInfo.setCustomNumber(customIds.size()); + rankingInfo.setAverageUnitPrice(averageUnitPrice); + rankingInfo.setSettlementDate(LocalDate.now()); clerkRankingInfoService.saveOrUpdate(rankingInfo); } diff --git a/play-admin/src/main/java/com/starry/admin/modules/clerk/module/entity/IPlayClerkRankingInfoReturnVo.java b/play-admin/src/main/java/com/starry/admin/modules/clerk/module/entity/IPlayClerkRankingInfoReturnVo.java index deead45..d3e7209 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clerk/module/entity/IPlayClerkRankingInfoReturnVo.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clerk/module/entity/IPlayClerkRankingInfoReturnVo.java @@ -1,10 +1,7 @@ package com.starry.admin.modules.clerk.module.entity; import com.fasterxml.jackson.annotation.JsonFormat; -import com.starry.common.domain.BasePageEntity; -import io.swagger.models.auth.In; import lombok.Data; -import lombok.EqualsAndHashCode; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; @@ -15,7 +12,7 @@ import java.time.LocalDate; * @since 2024/6/7 上午9:49 **/ @Data -public class IPlayClerkRankingInfoReturnVo { +public class IPlayClerkRankingInfoReturnVo { /** * UUID @@ -99,9 +96,8 @@ public class IPlayClerkRankingInfoReturnVo { */ private Integer customNumber; - /** - * 评价单价 + * 订单平均价格 */ private BigDecimal averageUnitPrice = BigDecimal.ZERO; /** diff --git a/play-admin/src/main/java/com/starry/admin/modules/clerk/module/entity/PlayClerkRankingInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/clerk/module/entity/PlayClerkRankingInfoEntity.java index 5906fd5..cb56b82 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clerk/module/entity/PlayClerkRankingInfoEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clerk/module/entity/PlayClerkRankingInfoEntity.java @@ -97,7 +97,20 @@ public class PlayClerkRankingInfoEntity extends BaseEntity selectMaxSerialNumber(); + * @param weeklyRanking 日排名还是周排名(0:每日排名;1:每周排名) + * @return List + * @author 杭州世平信息科技有限公司-xuhq + * @since 2024/6/7 11:55 + **/ + List selectMaxSerialNumber(String weeklyRanking); /** * 根据时间查询店员排行 * - * @param clerkId 店员ID + * @param clerkId 店员ID * @param startTime 开始时间 * @param endTime 结束时间 * @return 店员排行集合 diff --git a/play-admin/src/main/java/com/starry/admin/modules/clerk/service/impl/PlayClerkRankingInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/clerk/service/impl/PlayClerkRankingInfoServiceImpl.java index bc9eb7e..08ca1b6 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clerk/service/impl/PlayClerkRankingInfoServiceImpl.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clerk/service/impl/PlayClerkRankingInfoServiceImpl.java @@ -36,7 +36,7 @@ public class PlayClerkRankingInfoServiceImpl extends ServiceImpl selectByPage(IPlayClerkRankingInfoQueryVo vo) { MPJLambdaWrapper lambdaQueryWrapper = new MPJLambdaWrapper<>(); lambdaQueryWrapper.selectAll(PlayClerkRankingInfoEntity.class); - //拼接店员表 + // 拼接店员表 lambdaQueryWrapper.selectAs(PlayClerkUserInfoEntity::getNickname, "clerkNickName"); lambdaQueryWrapper.leftJoin(PlayClerkUserInfoEntity.class, PlayClerkUserInfoEntity::getId, PlayClerkRankingInfoEntity::getClerkId); if (StrUtil.isNotBlank(vo.getClerkId())) { @@ -65,7 +65,7 @@ public class PlayClerkRankingInfoServiceImpl extends ServiceImpl selectHistoryRanking(String clerkId) { - long serialNumber = selectSerialNumber(); + long serialNumber = selectSerialNumber("1"); MPJLambdaWrapper lambdaQueryWrapper = new MPJLambdaWrapper<>(); // 根据排行序号和用户ID查询 lambdaQueryWrapper.ne(PlayClerkRankingInfoEntity::getSerialNumber, serialNumber); @@ -75,13 +75,13 @@ public class PlayClerkRankingInfoServiceImpl extends ServiceImpl lambdaQueryWrapper = new MPJLambdaWrapper<>(); lambdaQueryWrapper.selectAll(PlayClerkRankingInfoEntity.class); - //店员信息 + // 店员信息 lambdaQueryWrapper.selectAs(PlayClerkUserInfoEntity::getId, "clerkId").selectAs(PlayClerkUserInfoEntity::getNickname, "clerkNickname").selectAs(PlayClerkUserInfoEntity::getAvatar, "clerkAvatar").selectAs(PlayClerkUserInfoEntity::getSex, "clerkSex"); lambdaQueryWrapper.leftJoin(PlayClerkUserInfoEntity.class, PlayClerkUserInfoEntity::getId, PlayClerkRankingInfoEntity::getClerkId); - //店员等级 + // 店员等级 lambdaQueryWrapper.selectAs(PlayClerkLevelInfoEntity::getId, "levelId").selectAs(PlayClerkLevelInfoEntity::getName, "levelName"); lambdaQueryWrapper.leftJoin(PlayClerkLevelInfoEntity.class, PlayClerkLevelInfoEntity::getId, PlayClerkUserInfoEntity::getLevelId); // 根据排行序号和用户ID查询 @@ -97,9 +97,9 @@ public class PlayClerkRankingInfoServiceImpl extends ServiceImpl selectMaxSerialNumber() { + public List selectMaxSerialNumber(String weeklyRanking) { MPJLambdaWrapper lambdaQueryWrapper = new MPJLambdaWrapper<>(); - lambdaQueryWrapper.eq(PlayClerkRankingInfoEntity::getSerialNumber, this.selectSerialNumber()); + lambdaQueryWrapper.eq(PlayClerkRankingInfoEntity::getSerialNumber, this.selectSerialNumber(weeklyRanking)); return this.baseMapper.selectList(lambdaQueryWrapper); } @@ -109,8 +109,9 @@ public class PlayClerkRankingInfoServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PlayClerkRankingInfoEntity::getWeeklyRanking, weeklyRanking); lambdaQueryWrapper.orderByDesc(PlayClerkRankingInfoEntity::getSerialNumber).last("limit 1"); PlayClerkRankingInfoEntity entity = this.baseMapper.selectOne(lambdaQueryWrapper); if (entity == null || entity.getSerialNumber() == null) { @@ -125,10 +126,10 @@ public class PlayClerkRankingInfoServiceImpl extends ServiceImpl