提成列表

This commit is contained in:
mx 2024-12-01 01:02:06 +08:00
parent 67ee820b88
commit 53230083b5
4 changed files with 110 additions and 29 deletions

View File

@ -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();
}
}

View File

@ -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<PsSalary> calcData(LocalDate deadline, LocalDate thisMonth, boolean save){
List<PsSalary> psSalaryList = new ArrayList<>();
//删除该月历史数据
psSalaryMapper.delete(Wrappers.<PsSalary>lambdaQuery().eq(PsSalary::getSalaryMonth,DateUtils.toString(firstDayOfLastMonth,"yyyy-MM")));
psSalaryMapper.delete(Wrappers.<PsSalary>lambdaQuery().eq(PsSalary::getSalaryMonth,DateUtils.toString(thisMonth,"yyyy-MM")));
log.info("查询所有员工");
List<SysUser> list = sysUserMapper.selectList(Wrappers.<SysUser>lambdaQuery().select(SysUser::getUserId).eq(SysUser::getStatus, 0));
log.info("查询所有员工{}", list.size());
@ -84,7 +93,7 @@ public class CalSalaryBatch {
//当月新签+当月之前未完成合同数 = 全部合同 - 完成时间在当月之前的
List<PsContractInfo> contractInfos = psContractInfoMapper.selectList(Wrappers.<PsContractInfo>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<PsContractInfo> contractInfos = psContractInfoMapper.selectList(Wrappers.<PsContractInfo>lambdaQuery()
// .ne(PsContractInfo::getIsCancel, CommonStatusEnum.SUCCESS.getCode())
@ -134,8 +143,8 @@ public class CalSalaryBatch {
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);
//已完成合同数量
@ -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<String> finCode = new ArrayList<>();
//未完成合同编码
@ -166,6 +181,7 @@ public class CalSalaryBatch {
}
// psSalary.setFinishContractCode(String.join(",",finCode));
// psSalary.setUnfinishContractCode(String.join(",",unfinCode));
psSalaryMapper.insert(psSalary);
List<PsSalaryContract> lis = new ArrayList<>();
if(CollectionUtils.isNotEmpty(finCode)) {
@ -184,12 +200,12 @@ public class CalSalaryBatch {
}
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,8 +217,7 @@ public class CalSalaryBatch {
* @param costMap 成本map
* @return
*/
private BigDecimal calSalary(List<PsContractBusinessVo> businessVo,Map<String, BigDecimal> configMap,
Map<String, BigDecimal> costMap){
private BigDecimal calSalary(List<PsContractBusinessVo> businessVo, Map<String, BigDecimal> configMap, Map<String, BigDecimal> costMap){
String cbStr = "0.0";
String rateStr = "0.1";
@ -215,14 +230,14 @@ 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);
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;
cb = cb.add(costMap.get(detail.getBusinessProject()) == null ? new BigDecimal(cbStr):costMap.get(detail.getBusinessProject()));
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{//按照类型算
@ -231,8 +246,13 @@ public class CalSalaryBatch {
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));
}
}

View File

@ -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<PsSalaryVo> list(PsSalaryBo bo, PageQuery pageQuery) {
if (bo.getEndDate() != null){
bo.setEndDate(DateUtils.getEndTimeByMonth(bo.getEndDate()));
}
return psSalaryService.queryPageList(bo, pageQuery);
}

View File

@ -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<PsSalaryVo> queryPageList(PsSalaryBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<PsSalary> lqw = buildQueryWrapper(bo);
Page<PsSalaryVo> 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<PsSalary> psSalaries = calSalaryBatch.calcData(deadline, thisMonth, false);
List<PsSalaryVo> adds = MapstructUtils.convert(psSalaries, PsSalaryVo.class);
List<PsSalaryVo> 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<PsSalary> buildQueryWrapper(PsSalaryBo bo) {