From 53230083b5bf4ae78a3a4d725b78dbed54798751 Mon Sep 17 00:00:00 2001 From: mx <1289317512@qq.com> Date: Sun, 1 Dec 2024 01:02:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E6=88=90=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pusong/common/core/utils/DateUtils.java | 34 +++++++++ .../pusong/business/batch/CalSalaryBatch.java | 74 ++++++++++++------- .../controller/PsSalaryController.java | 10 ++- .../service/impl/PsSalaryServiceImpl.java | 21 ++++++ 4 files changed, 110 insertions(+), 29 deletions(-) diff --git a/pusong-common/pusong-common-core/src/main/java/com/pusong/common/core/utils/DateUtils.java b/pusong-common/pusong-common-core/src/main/java/com/pusong/common/core/utils/DateUtils.java index 4835e1b..19c535d 100644 --- a/pusong-common/pusong-common-core/src/main/java/com/pusong/common/core/utils/DateUtils.java +++ b/pusong-common/pusong-common-core/src/main/java/com/pusong/common/core/utils/DateUtils.java @@ -239,4 +239,38 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { } return 0; } + + public static Date getFirstDayZeroTimeByMonth() { + // 获取当前日期的Calendar对象 + Calendar calendar = Calendar.getInstance(); + + // 将日期设置为当前月的第一天 + calendar.set(Calendar.DAY_OF_MONTH, 1); + + // 将时间设置为0点0分0秒 + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + + // 获取本月第一天的0点日期 + Date firstDayOfMonth = calendar.getTime(); + +// System.out.println("本月第一天的0点日期: " + firstDayOfMonth); + return firstDayOfMonth; + } + public static Date getEndTimeByMonth(Date date) { + // 获取当前日期的Calendar对象 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); + // 将时间设置为0点0分0秒 + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 999); + + return calendar.getTime(); + } } diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/batch/CalSalaryBatch.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/batch/CalSalaryBatch.java index a952d0b..c5b50f4 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/batch/CalSalaryBatch.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/batch/CalSalaryBatch.java @@ -23,6 +23,7 @@ import jakarta.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -36,6 +37,7 @@ import java.util.stream.Stream; @Component +@EnableScheduling public class CalSalaryBatch { private static final Logger log = LoggerFactory.getLogger(CalSalaryBatch.class); @Resource @@ -65,17 +67,24 @@ public class CalSalaryBatch { * 每月1日凌晨1点执行 */ @Transactional(rollbackFor = Exception.class) - @Scheduled(cron = "30 40 23 * * ?") +// @Scheduled(cron = "1 * * * * ?") + @Scheduled(cron = "0 0 1 1 * ?") public void execute(){ log.info("员工提成批处理开始"); LocalDate now = this.now == null ? LocalDate.now(): this.now; // LocalDate lastDayOfLastMonth = now.with(TemporalAdjusters.firstDayOfMonth());//这个月第一天0分0秒 // LocalDate firstDayOfLastMonth = lastDayOfLastMonth.minusMonths(1);//上个月第一天0分0秒 - LocalDate firstDayOfLastMonth = now.with(TemporalAdjusters.firstDayOfMonth());//这个月第一天0分0秒 - LocalDate lastDayOfLastMonth = firstDayOfLastMonth.plusMonths(1);//下个月第一天0分0秒 + LocalDate deadline = now.with(TemporalAdjusters.firstDayOfMonth());//这个月第一天0分0秒,统计的截止时间 + LocalDate thisMonth = deadline.minusMonths(1);//上个月第一天0分0秒 + calcData(deadline, thisMonth, true); + } + + public List calcData(LocalDate deadline, LocalDate thisMonth, boolean save){ + + List psSalaryList = new ArrayList<>(); //删除该月历史数据 - psSalaryMapper.delete(Wrappers.lambdaQuery().eq(PsSalary::getSalaryMonth,DateUtils.toString(firstDayOfLastMonth,"yyyy-MM"))); + psSalaryMapper.delete(Wrappers.lambdaQuery().eq(PsSalary::getSalaryMonth,DateUtils.toString(thisMonth,"yyyy-MM"))); log.info("查询所有员工"); List list = sysUserMapper.selectList(Wrappers.lambdaQuery().select(SysUser::getUserId).eq(SysUser::getStatus, 0)); log.info("查询所有员工{}", list.size()); @@ -84,7 +93,7 @@ public class CalSalaryBatch { //当月新签+当月之前未完成合同数 = 全部合同 - 完成时间在当月之前的 List contractInfos = psContractInfoMapper.selectList(Wrappers.lambdaQuery() .ne(PsContractInfo::getIsCancel, CommonStatusEnum.SUCCESS.getCode()) - .and(wq->wq.lt(PsContractInfo::getFinishDate, firstDayOfLastMonth).or().isNull(PsContractInfo::getFinishDate))); + .and(wq -> wq.lt(PsContractInfo::getFinishDate, deadline).or().isNull(PsContractInfo::getFinishDate))); // List contractInfos = psContractInfoMapper.selectList(Wrappers.lambdaQuery() // .ne(PsContractInfo::getIsCancel, CommonStatusEnum.SUCCESS.getCode()) @@ -119,7 +128,7 @@ public class CalSalaryBatch { // codeList.addAll(unfinistMap.get(userId) == null ? new ArrayList<>() : unfinistMap.get(userId).stream().map(PsContractInfo::getContractCode).toList()); log.info("进行计算提成计算"); - BigDecimal salary = calSalary(busin, configMap.get(post.getPostId()),costMap.get(post.getPostId())); + BigDecimal salary = calSalary(busin, configMap.get(post.getPostId()), costMap.get(post.getPostId())); List payList = new ArrayList<>(); //查询已完成合同的退款列表 if(CollectionUtils.isNotEmpty(codeList)){ @@ -129,20 +138,20 @@ public class CalSalaryBatch { .eq("pay.business_type","2").eq("pay.pay_status",PayStatusEnum.SUCCESS.getCode())); } //salary- 退费金额*服务项目最高提成 - salary = salary.subtract(this.calReturnSalary(payList,configMap.get(post.getPostId()))); - log.info("进行计算提成计算{}",salary); + salary = salary.subtract(this.calReturnSalary(payList, configMap.get(post.getPostId()))); + log.info("进行计算提成计算{}", salary); log.info("进行存表"); PsSalary psSalary = new PsSalary(); psSalary.setSalaryMoney(salary); - psSalary.setSalaryMonth(DateUtils.toString(firstDayOfLastMonth,"yyyy-MM")); - psSalary.setSalaryDate(DateUtils.toDate(firstDayOfLastMonth)); + psSalary.setSalaryMonth(DateUtils.toString(thisMonth,"yyyy-MM")); + psSalary.setSalaryDate(DateUtils.toDate(thisMonth)); psSalary.setPostId(post.getPostId()); psSalary.setUserId(userId); //已完成合同数量 int finishNum = CollectionUtils.isEmpty(finistMap.get(userId))?0:finistMap.get(userId).size(); //未完成合同数量 int unFinishNum = CollectionUtils.isEmpty(unfinistMap.get(userId))?0:unfinistMap.get(userId).size(); - psSalary.setContractNum(finishNum+unFinishNum); + psSalary.setContractNum(finishNum + unFinishNum); psSalary.setFinistContractNum(finishNum); psSalary.setUnfinistContractNum(unFinishNum); //已完成合同金额 @@ -154,6 +163,12 @@ public class CalSalaryBatch { psSalary.setContractMoney(finishMoney.add(unFinishMoney)); psSalary.setFinistContractMoney(finishMoney); psSalary.setUnfinistContractMoney(unFinishMoney); + + if (!save){ + psSalaryList.add(psSalary); + continue; + } + //已完成合同编码 List finCode = new ArrayList<>(); //未完成合同编码 @@ -166,6 +181,7 @@ public class CalSalaryBatch { } // psSalary.setFinishContractCode(String.join(",",finCode)); // psSalary.setUnfinishContractCode(String.join(",",unfinCode)); + psSalaryMapper.insert(psSalary); List lis = new ArrayList<>(); if(CollectionUtils.isNotEmpty(finCode)) { @@ -182,14 +198,14 @@ public class CalSalaryBatch { lis.addAll(unfin); } } - lis.forEach(item->{ + lis.forEach(item -> { item.setUserId(user.getUserId()); - item.setSalaryRatioDate(DateUtils.toDate(firstDayOfLastMonth)); + item.setSalaryRatioDate(DateUtils.toDate(thisMonth)); }); salaryContractMapper.insertBatch(lis); } - log.info("员工提成批处理结束"); + return psSalaryList; } /** @@ -201,13 +217,12 @@ public class CalSalaryBatch { * @param costMap 成本map * @return */ - private BigDecimal calSalary(List businessVo,Map configMap, - Map costMap){ + private BigDecimal calSalary(List businessVo, Map configMap, Map costMap){ String cbStr = "0.0"; String rateStr = "0.1"; - configMap = CollectionUtils.isEmpty(configMap)?new HashMap<>():configMap; - costMap = CollectionUtils.isEmpty(costMap)?new HashMap<>():costMap; + configMap = CollectionUtils.isEmpty(configMap) ? new HashMap<>() : configMap; + costMap = CollectionUtils.isEmpty(costMap) ? new HashMap<>() : costMap; BigDecimal salary = BigDecimal.ZERO; for(PsContractBusinessVo item : businessVo){ @@ -215,24 +230,29 @@ public class CalSalaryBatch { if(item.getDetailVoList().get(0).getAmount() == null || BigDecimal.ZERO.compareTo(item.getDetailVoList().get(0).getAmount()) == 0){ BigDecimal rate = new BigDecimal(cbStr); - BigDecimal cb = new BigDecimal(rateStr); - for (PsContractBusinessDetailVo detail:item.getDetailVoList()){ - BigDecimal rateConfig = configMap.get(detail.getBusinessProject()) == null?new BigDecimal("0.1"):configMap.get(detail.getBusinessProject()); - rate = rate.compareTo(rateConfig)<0?rate:rateConfig; - cb = cb.add(costMap.get(detail.getBusinessProject()) == null ? new BigDecimal(cbStr):costMap.get(detail.getBusinessProject())); + BigDecimal cost = new BigDecimal(rateStr); + for (PsContractBusinessDetailVo detail : item.getDetailVoList()){ + BigDecimal rateConfig = configMap.get(detail.getBusinessProject()) == null ? new BigDecimal("0.1") : configMap.get(detail.getBusinessProject()); + rate = rate.compareTo(rateConfig) < 0 ? rate : rateConfig; + cost = cost.add(costMap.get(detail.getBusinessProject()) == null ? new BigDecimal(cbStr) : costMap.get(detail.getBusinessProject())); } //服务类型金额 - 成本 - BigDecimal amount = item.getBusinessAmount().subtract(cb); + BigDecimal amount = item.getBusinessAmount().subtract(cost); // ×比例 salary = salary.add(amount.multiply(rate)); }else{//(按照类型算) - for (PsContractBusinessDetailVo detail:item.getDetailVoList()){ + for (PsContractBusinessDetailVo detail : item.getDetailVoList()){ //比例 - BigDecimal rateConfig = configMap.get(detail.getBusinessProject()) == null?new BigDecimal("0.1"):configMap.get(detail.getBusinessProject()); + BigDecimal rateConfig = configMap.get(detail.getBusinessProject()) == null ? new BigDecimal("0.1") : configMap.get(detail.getBusinessProject()); //成本 BigDecimal rateCost = costMap.get(detail.getBusinessProject()) == null ? new BigDecimal(cbStr):costMap.get(detail.getBusinessProject()); + + BigDecimal amount = detail.getAmount(); + if (detail.getAmount() == null){ + amount = new BigDecimal(0); + } //(项目金额-成本)) *比例 - salary = salary.add(detail.getAmount().subtract(rateCost).multiply(rateConfig)); + salary = salary.add(amount.subtract(rateCost).multiply(rateConfig)); } } diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/PsSalaryController.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/PsSalaryController.java index 7dcf8a5..13c17fe 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/PsSalaryController.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/PsSalaryController.java @@ -3,7 +3,9 @@ package com.pusong.business.controller; import java.util.List; import cn.dev33.satoken.annotation.SaIgnore; +import com.pusong.business.batch.CalSalaryBatch; import com.pusong.business.domain.vo.PsSalaryContractVo; +import com.pusong.common.core.utils.DateUtils; import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; @@ -38,12 +40,16 @@ public class PsSalaryController extends BaseController { private final IPsSalaryService psSalaryService; + /** * 提成列表查询 */ @SaCheckPermission("business:salary:list") @GetMapping("/list") public TableDataInfo list(PsSalaryBo bo, PageQuery pageQuery) { + if (bo.getEndDate() != null){ + bo.setEndDate(DateUtils.getEndTimeByMonth(bo.getEndDate())); + } return psSalaryService.queryPageList(bo, pageQuery); } @@ -54,8 +60,8 @@ public class PsSalaryController extends BaseController { * @return */ @GetMapping("/queryContractPageList") - public TableDataInfo queryContractPageList(Long id,String status, PageQuery pageQuery) { - return psSalaryService.queryContractPageList(id,status, pageQuery); + public TableDataInfo queryContractPageList(Long id, String status, PageQuery pageQuery) { + return psSalaryService.queryContractPageList(id, status, pageQuery); } // /** diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsSalaryServiceImpl.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsSalaryServiceImpl.java index b3eaa8a..3832151 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsSalaryServiceImpl.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsSalaryServiceImpl.java @@ -1,8 +1,11 @@ package com.pusong.business.service.impl; +import com.pusong.business.batch.CalSalaryBatch; +import com.pusong.business.domain.PsCustomPrice; import com.pusong.business.domain.PsSalaryContract; import com.pusong.business.domain.vo.PsSalaryContractVo; import com.pusong.business.mapper.PsSalaryContractMapper; +import com.pusong.common.core.utils.DateUtils; import com.pusong.common.core.utils.MapstructUtils; import com.pusong.common.mybatis.core.page.TableDataInfo; import com.pusong.common.mybatis.core.page.PageQuery; @@ -18,6 +21,8 @@ import com.pusong.business.domain.PsSalary; import com.pusong.business.mapper.PsSalaryMapper; import com.pusong.business.service.IPsSalaryService; +import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Collection; @@ -35,6 +40,7 @@ public class PsSalaryServiceImpl implements IPsSalaryService { private final PsSalaryMapper baseMapper; private final PsSalaryContractMapper salaryContractMapper; + private final CalSalaryBatch calSalaryBatch; /** * 分页查询员工提成提成列表 * @@ -46,6 +52,21 @@ public class PsSalaryServiceImpl implements IPsSalaryService { public TableDataInfo queryPageList(PsSalaryBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + + if (bo.getStartDate().getTime() <= DateUtils.getFirstDayZeroTimeByMonth().getTime() && bo.getEndDate().getTime() >= DateUtils.getFirstDayZeroTimeByMonth().getTime()){ + LocalDate deadline = LocalDate.now(); + LocalDate thisMonth = LocalDate.now(); + List psSalaries = calSalaryBatch.calcData(deadline, thisMonth, false); + List adds = MapstructUtils.convert(psSalaries, PsSalaryVo.class); + + List records= new ArrayList<>(); + records.addAll(result.getRecords()); + records.addAll(adds); + result.setRecords(records); + result.setTotal(result.getTotal() + adds.size()); + } + + return TableDataInfo.build(result); } private LambdaQueryWrapper buildQueryWrapper(PsSalaryBo bo) {