提成列表
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;
|
||||
}
|
||||
|
||||
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.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));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user