提成列表
This commit is contained in:
parent
67ee820b88
commit
53230083b5
@ -239,4 +239,38 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
|||||||
}
|
}
|
||||||
return 0;
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ import jakarta.annotation.Resource;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
@ -36,6 +37,7 @@ import java.util.stream.Stream;
|
|||||||
|
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
|
@EnableScheduling
|
||||||
public class CalSalaryBatch {
|
public class CalSalaryBatch {
|
||||||
private static final Logger log = LoggerFactory.getLogger(CalSalaryBatch.class);
|
private static final Logger log = LoggerFactory.getLogger(CalSalaryBatch.class);
|
||||||
@Resource
|
@Resource
|
||||||
@ -65,17 +67,24 @@ public class CalSalaryBatch {
|
|||||||
* 每月1日凌晨1点执行
|
* 每月1日凌晨1点执行
|
||||||
*/
|
*/
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Scheduled(cron = "30 40 23 * * ?")
|
// @Scheduled(cron = "1 * * * * ?")
|
||||||
|
@Scheduled(cron = "0 0 1 1 * ?")
|
||||||
public void execute(){
|
public void execute(){
|
||||||
log.info("员工提成批处理开始");
|
log.info("员工提成批处理开始");
|
||||||
LocalDate now = this.now == null ? LocalDate.now(): this.now;
|
LocalDate now = this.now == null ? LocalDate.now(): this.now;
|
||||||
// LocalDate lastDayOfLastMonth = now.with(TemporalAdjusters.firstDayOfMonth());//这个月第一天0分0秒
|
// LocalDate lastDayOfLastMonth = now.with(TemporalAdjusters.firstDayOfMonth());//这个月第一天0分0秒
|
||||||
// LocalDate firstDayOfLastMonth = lastDayOfLastMonth.minusMonths(1);//上个月第一天0分0秒
|
// LocalDate firstDayOfLastMonth = lastDayOfLastMonth.minusMonths(1);//上个月第一天0分0秒
|
||||||
LocalDate firstDayOfLastMonth = now.with(TemporalAdjusters.firstDayOfMonth());//这个月第一天0分0秒
|
LocalDate deadline = now.with(TemporalAdjusters.firstDayOfMonth());//这个月第一天0分0秒,统计的截止时间
|
||||||
LocalDate lastDayOfLastMonth = firstDayOfLastMonth.plusMonths(1);//下个月第一天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("查询所有员工");
|
log.info("查询所有员工");
|
||||||
List<SysUser> list = sysUserMapper.selectList(Wrappers.<SysUser>lambdaQuery().select(SysUser::getUserId).eq(SysUser::getStatus, 0));
|
List<SysUser> list = sysUserMapper.selectList(Wrappers.<SysUser>lambdaQuery().select(SysUser::getUserId).eq(SysUser::getStatus, 0));
|
||||||
log.info("查询所有员工{}", list.size());
|
log.info("查询所有员工{}", list.size());
|
||||||
@ -84,7 +93,7 @@ public class CalSalaryBatch {
|
|||||||
//当月新签+当月之前未完成合同数 = 全部合同 - 完成时间在当月之前的
|
//当月新签+当月之前未完成合同数 = 全部合同 - 完成时间在当月之前的
|
||||||
List<PsContractInfo> contractInfos = psContractInfoMapper.selectList(Wrappers.<PsContractInfo>lambdaQuery()
|
List<PsContractInfo> contractInfos = psContractInfoMapper.selectList(Wrappers.<PsContractInfo>lambdaQuery()
|
||||||
.ne(PsContractInfo::getIsCancel, CommonStatusEnum.SUCCESS.getCode())
|
.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()
|
// List<PsContractInfo> contractInfos = psContractInfoMapper.selectList(Wrappers.<PsContractInfo>lambdaQuery()
|
||||||
// .ne(PsContractInfo::getIsCancel, CommonStatusEnum.SUCCESS.getCode())
|
// .ne(PsContractInfo::getIsCancel, CommonStatusEnum.SUCCESS.getCode())
|
||||||
@ -134,8 +143,8 @@ public class CalSalaryBatch {
|
|||||||
log.info("进行存表");
|
log.info("进行存表");
|
||||||
PsSalary psSalary = new PsSalary();
|
PsSalary psSalary = new PsSalary();
|
||||||
psSalary.setSalaryMoney(salary);
|
psSalary.setSalaryMoney(salary);
|
||||||
psSalary.setSalaryMonth(DateUtils.toString(firstDayOfLastMonth,"yyyy-MM"));
|
psSalary.setSalaryMonth(DateUtils.toString(thisMonth,"yyyy-MM"));
|
||||||
psSalary.setSalaryDate(DateUtils.toDate(firstDayOfLastMonth));
|
psSalary.setSalaryDate(DateUtils.toDate(thisMonth));
|
||||||
psSalary.setPostId(post.getPostId());
|
psSalary.setPostId(post.getPostId());
|
||||||
psSalary.setUserId(userId);
|
psSalary.setUserId(userId);
|
||||||
//已完成合同数量
|
//已完成合同数量
|
||||||
@ -154,6 +163,12 @@ public class CalSalaryBatch {
|
|||||||
psSalary.setContractMoney(finishMoney.add(unFinishMoney));
|
psSalary.setContractMoney(finishMoney.add(unFinishMoney));
|
||||||
psSalary.setFinistContractMoney(finishMoney);
|
psSalary.setFinistContractMoney(finishMoney);
|
||||||
psSalary.setUnfinistContractMoney(unFinishMoney);
|
psSalary.setUnfinistContractMoney(unFinishMoney);
|
||||||
|
|
||||||
|
if (!save){
|
||||||
|
psSalaryList.add(psSalary);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
//已完成合同编码
|
//已完成合同编码
|
||||||
List<String> finCode = new ArrayList<>();
|
List<String> finCode = new ArrayList<>();
|
||||||
//未完成合同编码
|
//未完成合同编码
|
||||||
@ -166,6 +181,7 @@ public class CalSalaryBatch {
|
|||||||
}
|
}
|
||||||
// psSalary.setFinishContractCode(String.join(",",finCode));
|
// psSalary.setFinishContractCode(String.join(",",finCode));
|
||||||
// psSalary.setUnfinishContractCode(String.join(",",unfinCode));
|
// psSalary.setUnfinishContractCode(String.join(",",unfinCode));
|
||||||
|
|
||||||
psSalaryMapper.insert(psSalary);
|
psSalaryMapper.insert(psSalary);
|
||||||
List<PsSalaryContract> lis = new ArrayList<>();
|
List<PsSalaryContract> lis = new ArrayList<>();
|
||||||
if(CollectionUtils.isNotEmpty(finCode)) {
|
if(CollectionUtils.isNotEmpty(finCode)) {
|
||||||
@ -184,12 +200,12 @@ public class CalSalaryBatch {
|
|||||||
}
|
}
|
||||||
lis.forEach(item -> {
|
lis.forEach(item -> {
|
||||||
item.setUserId(user.getUserId());
|
item.setUserId(user.getUserId());
|
||||||
item.setSalaryRatioDate(DateUtils.toDate(firstDayOfLastMonth));
|
item.setSalaryRatioDate(DateUtils.toDate(thisMonth));
|
||||||
});
|
});
|
||||||
salaryContractMapper.insertBatch(lis);
|
salaryContractMapper.insertBatch(lis);
|
||||||
}
|
}
|
||||||
|
|
||||||
log.info("员工提成批处理结束");
|
log.info("员工提成批处理结束");
|
||||||
|
return psSalaryList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -201,8 +217,7 @@ public class CalSalaryBatch {
|
|||||||
* @param costMap 成本map
|
* @param costMap 成本map
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private BigDecimal calSalary(List<PsContractBusinessVo> businessVo,Map<String, BigDecimal> configMap,
|
private BigDecimal calSalary(List<PsContractBusinessVo> businessVo, Map<String, BigDecimal> configMap, Map<String, BigDecimal> costMap){
|
||||||
Map<String, BigDecimal> costMap){
|
|
||||||
String cbStr = "0.0";
|
String cbStr = "0.0";
|
||||||
String rateStr = "0.1";
|
String rateStr = "0.1";
|
||||||
|
|
||||||
@ -215,14 +230,14 @@ public class CalSalaryBatch {
|
|||||||
if(item.getDetailVoList().get(0).getAmount() == null
|
if(item.getDetailVoList().get(0).getAmount() == null
|
||||||
|| BigDecimal.ZERO.compareTo(item.getDetailVoList().get(0).getAmount()) == 0){
|
|| BigDecimal.ZERO.compareTo(item.getDetailVoList().get(0).getAmount()) == 0){
|
||||||
BigDecimal rate = new BigDecimal(cbStr);
|
BigDecimal rate = new BigDecimal(cbStr);
|
||||||
BigDecimal cb = new BigDecimal(rateStr);
|
BigDecimal cost = new BigDecimal(rateStr);
|
||||||
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());
|
||||||
rate = rate.compareTo(rateConfig) < 0 ? rate : rateConfig;
|
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));
|
salary = salary.add(amount.multiply(rate));
|
||||||
}else{//(按照类型算)
|
}else{//(按照类型算)
|
||||||
@ -231,8 +246,13 @@ public class CalSalaryBatch {
|
|||||||
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 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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,9 @@ package com.pusong.business.controller;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaIgnore;
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
|
import com.pusong.business.batch.CalSalaryBatch;
|
||||||
import com.pusong.business.domain.vo.PsSalaryContractVo;
|
import com.pusong.business.domain.vo.PsSalaryContractVo;
|
||||||
|
import com.pusong.common.core.utils.DateUtils;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import jakarta.validation.constraints.*;
|
import jakarta.validation.constraints.*;
|
||||||
@ -38,12 +40,16 @@ public class PsSalaryController extends BaseController {
|
|||||||
|
|
||||||
private final IPsSalaryService psSalaryService;
|
private final IPsSalaryService psSalaryService;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 提成列表查询
|
* 提成列表查询
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("business:salary:list")
|
@SaCheckPermission("business:salary:list")
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
public TableDataInfo<PsSalaryVo> list(PsSalaryBo bo, PageQuery pageQuery) {
|
public TableDataInfo<PsSalaryVo> list(PsSalaryBo bo, PageQuery pageQuery) {
|
||||||
|
if (bo.getEndDate() != null){
|
||||||
|
bo.setEndDate(DateUtils.getEndTimeByMonth(bo.getEndDate()));
|
||||||
|
}
|
||||||
return psSalaryService.queryPageList(bo, pageQuery);
|
return psSalaryService.queryPageList(bo, pageQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
package com.pusong.business.service.impl;
|
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.PsSalaryContract;
|
||||||
import com.pusong.business.domain.vo.PsSalaryContractVo;
|
import com.pusong.business.domain.vo.PsSalaryContractVo;
|
||||||
import com.pusong.business.mapper.PsSalaryContractMapper;
|
import com.pusong.business.mapper.PsSalaryContractMapper;
|
||||||
|
import com.pusong.common.core.utils.DateUtils;
|
||||||
import com.pusong.common.core.utils.MapstructUtils;
|
import com.pusong.common.core.utils.MapstructUtils;
|
||||||
import com.pusong.common.mybatis.core.page.TableDataInfo;
|
import com.pusong.common.mybatis.core.page.TableDataInfo;
|
||||||
import com.pusong.common.mybatis.core.page.PageQuery;
|
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.mapper.PsSalaryMapper;
|
||||||
import com.pusong.business.service.IPsSalaryService;
|
import com.pusong.business.service.IPsSalaryService;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -35,6 +40,7 @@ public class PsSalaryServiceImpl implements IPsSalaryService {
|
|||||||
private final PsSalaryMapper baseMapper;
|
private final PsSalaryMapper baseMapper;
|
||||||
private final PsSalaryContractMapper salaryContractMapper;
|
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) {
|
public TableDataInfo<PsSalaryVo> queryPageList(PsSalaryBo bo, PageQuery pageQuery) {
|
||||||
LambdaQueryWrapper<PsSalary> lqw = buildQueryWrapper(bo);
|
LambdaQueryWrapper<PsSalary> lqw = buildQueryWrapper(bo);
|
||||||
Page<PsSalaryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
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);
|
return TableDataInfo.build(result);
|
||||||
}
|
}
|
||||||
private LambdaQueryWrapper<PsSalary> buildQueryWrapper(PsSalaryBo bo) {
|
private LambdaQueryWrapper<PsSalary> buildQueryWrapper(PsSalaryBo bo) {
|
||||||
|
Loading…
Reference in New Issue
Block a user