薪酬列表分页问题

This commit is contained in:
mx 2024-11-27 17:07:51 +08:00
parent eab0fb95dd
commit c2df4242ce
12 changed files with 160 additions and 62 deletions

View File

@ -60,7 +60,7 @@ public class MybatisPlusConfig {
public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 分页合理化
paginationInnerInterceptor.setOverflow(true);
paginationInnerInterceptor.setOverflow(false);
return paginationInnerInterceptor;
}

View File

@ -21,7 +21,10 @@ public class TableDataInfo<T> implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 当前页
*/
private long current;
/**
* 总记录数
*/
@ -59,6 +62,7 @@ public class TableDataInfo<T> implements Serializable {
rspData.setMsg("查询成功");
rspData.setRows(page.getRecords());
rspData.setTotal(page.getTotal());
rspData.setCurrent(page.getCurrent());
return rspData;
}

View File

@ -5,15 +5,14 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pusong.business.domain.*;
import com.pusong.business.domain.vo.PsContractBusinessDetailVo;
import com.pusong.business.domain.vo.PsContractBusinessVo;
import com.pusong.business.domain.vo.PsContractPayVo;
import com.pusong.business.domain.vo.*;
import com.pusong.business.enums.CommonStatusEnum;
import com.pusong.business.enums.ContractStatusEnum;
import com.pusong.business.enums.PayStatusEnum;
import com.pusong.business.mapper.*;
import com.pusong.business.service.IPsContractBusinessService;
import com.pusong.common.core.utils.DateUtils;
import com.pusong.common.core.utils.MapstructUtils;
import com.pusong.common.core.utils.StringUtils;
import com.pusong.system.domain.SysUser;
import com.pusong.system.domain.SysUserPost;
@ -81,18 +80,18 @@ public class CalSalaryBatch {
calcData(deadline, thisMonth, true);
}
public List<PsSalary> calcData(Temporal deadline, LocalDate thisMonth, boolean save){
public List<PsSalaryVo> calcData(Temporal deadline, LocalDate thisMonth, boolean save){
List<PsSalary> psSalaryList = new ArrayList<>();
List<PsSalaryVo> psSalaryList = new ArrayList<>();
//删除该月历史数据
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));
List<SysUser> list = sysUserMapper.selectList(Wrappers.<SysUser>lambdaQuery().select(SysUser::getUserId, SysUser::getNickName).eq(SysUser::getStatus, 0));
log.info("查询所有员工{}", list.size());
log.info("查询符合条件的合同");
//当月新签+当月之前未完成合同数 = 全部合同 - 完成时间在当月之前的
List<PsContractInfo> contractInfos = psContractInfoMapper.selectList(Wrappers.<PsContractInfo>lambdaQuery()
List<PsSalaryContractVo> contractInfos = psContractInfoMapper.querySalaryListByCodes(Wrappers.<PsContractInfo>lambdaQuery()
.ne(PsContractInfo::getIsCancel, CommonStatusEnum.SUCCESS.getCode())
.and(wq -> wq.le(PsContractInfo::getFinishDate, deadline).or().isNull(PsContractInfo::getFinishDate)));
@ -100,13 +99,14 @@ public class CalSalaryBatch {
// .ne(PsContractInfo::getIsCancel, CommonStatusEnum.SUCCESS.getCode())
// .between(PsContractInfo::getFinishDate, firstDayOfLastMonth, lastDayOfLastMonth));
log.info("查询本月所有的合同{}", contractInfos.size());
List<PsContractInfo> finists = contractInfos.stream().filter(item -> StringUtils.equals(item.getContractStatus(), ContractStatusEnum.SUCCESS.getCode())).toList();
List<PsContractInfo> unfinists = contractInfos.stream().filter(item -> !StringUtils.equals(item.getContractStatus(), ContractStatusEnum.SUCCESS.getCode())).toList();
List<PsSalaryContractVo> finists = contractInfos.stream().filter(item -> StringUtils.equals(item.getContractStatus(), ContractStatusEnum.SUCCESS.getCode())).toList();
List<PsSalaryContractVo> unfinists = contractInfos.stream().filter(item -> !StringUtils.equals(item.getContractStatus(), ContractStatusEnum.SUCCESS.getCode())).toList();
log.info("本月已完成合同数量{},未完成数量{}", finists.size(),unfinists.size());
//转换 客户经理有的合同编码
Map<Long, List<PsContractInfo>> finistMap = finists.stream().collect(Collectors.groupingBy(PsContractInfo::getCustomManager,Collectors.toList()));
Map<Long, List<PsContractInfo>> unfinistMap = unfinists.stream().collect(Collectors.groupingBy(PsContractInfo::getCustomManager,Collectors.toList()));;
Map<Long, List<PsSalaryContractVo>> finistMap = finists.stream().collect(Collectors.groupingBy(PsSalaryContractVo::getCustomManager, Collectors.toList()));
Map<Long, List<PsSalaryContractVo>> unfinistMap = unfinists.stream().collect(Collectors.groupingBy(PsSalaryContractVo::getCustomManager, Collectors.toList()));;
//查询所有岗位配置信息
List<PsSalaryConfig> configs = psSalaryConfigMapper.selectList();
Map<Long, Map<String, BigDecimal>> configMap = configs.stream().collect(Collectors.groupingBy(PsSalaryConfig::getPostId,
@ -117,12 +117,12 @@ public class CalSalaryBatch {
for (SysUser user : list){
Long userId = user.getUserId();
//默认员工仅有一个岗位
log.info("查询员工岗位{}",userId);
log.info("查询员工岗位{}", userId);
SysUserPost post = sysUserPostMapper.selectOne(new LambdaQueryWrapper<SysUserPost>().eq(SysUserPost::getUserId, userId).last("limit 1"));
if(post == null){continue;}
log.info("查询员工岗位{}",post.getPostId());
log.info("查询员工岗位{}", post.getPostId());
//已完成合同的合同编码
List<String> codeList = new ArrayList<>(finistMap.get(userId) == null ? new ArrayList<>() : finistMap.get(userId).stream().map(PsContractInfo::getContractCode).toList());
List<String> codeList = new ArrayList<>(finistMap.get(userId) == null ? new ArrayList<>() : finistMap.get(userId).stream().map(PsSalaryContractVo::getContractCode).toList());
//服务列表
List<PsContractBusinessVo> busin = businessService.selectBusinessList(codeList);
//所有合同的退款列表
@ -157,52 +157,74 @@ public class CalSalaryBatch {
psSalary.setUnfinistContractNum(unFinishNum);
//已完成合同金额
BigDecimal finishMoney = CollectionUtils.isEmpty(finistMap.get(userId))?BigDecimal.ZERO:
finistMap.get(userId).stream().map(PsContractInfo::getContractAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
finistMap.get(userId).stream().map(PsSalaryContractVo::getContractAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
//未完成合同金额
BigDecimal unFinishMoney = CollectionUtils.isEmpty(unfinistMap.get(userId))?BigDecimal.ZERO:
unfinistMap.get(userId).stream().map(PsContractInfo::getContractAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);;
unfinistMap.get(userId).stream().map(PsSalaryContractVo::getContractAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);;
psSalary.setContractMoney(finishMoney.add(unFinishMoney));
psSalary.setFinistContractMoney(finishMoney);
psSalary.setUnfinistContractMoney(unFinishMoney);
if (!save){
psSalaryList.add(psSalary);
PsSalaryVo convert = MapstructUtils.convert(psSalary, PsSalaryVo.class);
convert.setNickName(user.getNickName());
psSalaryList.add(convert);
continue;
}
//已完成合同编码
List<String> finCode = new ArrayList<>();
List<PsSalaryContractVo> finCode = new ArrayList<>();
//未完成合同编码
List<String> unfinCode = new ArrayList<>();
List<PsSalaryContractVo> unfinCode = new ArrayList<>();
if(CollectionUtils.isNotEmpty(finistMap.get(userId))){
finCode = finistMap.get(userId).stream().map(PsContractInfo::getContractCode).toList();
finCode = finistMap.get(userId);
}
if(CollectionUtils.isNotEmpty(unfinistMap.get(userId))){
unfinCode = unfinistMap.get(userId).stream().map(PsContractInfo::getContractCode).toList();
unfinCode = unfinistMap.get(userId);
}
// psSalary.setFinishContractCode(String.join(",",finCode));
// psSalary.setUnfinishContractCode(String.join(",",unfinCode));
psSalaryMapper.insert(psSalary);
List<PsSalaryContract> lis = new ArrayList<>();
if(CollectionUtils.isNotEmpty(finCode)) {
List<PsSalaryContract> fin = psContractInfoMapper.querySalaryListByCodes(new QueryWrapper<PsContractInfo>().in("info.contract_code", finCode));
if(CollectionUtils.isNotEmpty(fin)) {
fin.forEach(item->{item.setStatus("1");item.setSalaryId(psSalary.getId());});
lis.addAll(fin);
PsSalaryContract psSalaryContract;
for (PsSalaryContractVo psContractInfo : finCode) {
psSalaryContract = MapstructUtils.convert(psContractInfo, PsSalaryContract.class);
psSalaryContract.setStatus("1");
psSalaryContract.setSalaryId(psSalary.getId());
psSalaryContract.setUserId(user.getUserId());
psSalaryContract.setSalaryRatioDate(DateUtils.toDate(thisMonth));
lis.add(psSalaryContract);
}
// List<PsSalaryContract> fin = psContractInfoMapper.querySalaryListByCodes(new QueryWrapper<PsContractInfo>().in("info.contract_code", finCode));
// if(CollectionUtils.isNotEmpty(fin)) {
// fin.forEach(item->{item.setStatus("1");item.setSalaryId(psSalary.getId());});
// lis.addAll(fin);
// }
}
if(CollectionUtils.isNotEmpty(unfinCode)) {
List<PsSalaryContract> unfin = psContractInfoMapper.querySalaryListByCodes(new QueryWrapper<PsContractInfo>().in("info.contract_code", unfinCode));
if(CollectionUtils.isNotEmpty(unfin)) {
unfin.forEach(item->{item.setStatus("2");item.setSalaryId(psSalary.getId());});
lis.addAll(unfin);
// List<PsSalaryContract> unfin = psContractInfoMapper.querySalaryListByCodes(new QueryWrapper<PsContractInfo>().in("info.contract_code", unfinCode));
// if(CollectionUtils.isNotEmpty(unfin)) {
// unfin.forEach(item->{item.setStatus("2");item.setSalaryId(psSalary.getId());});
// lis.addAll(unfin);
// }
PsSalaryContract psSalaryContract;
for (PsSalaryContractVo psContractInfo : unfinCode) {
psSalaryContract = MapstructUtils.convert(psContractInfo, PsSalaryContract.class);
psSalaryContract.setStatus("2");
psSalaryContract.setSalaryId(psSalary.getId());
psSalaryContract.setUserId(user.getUserId());
psSalaryContract.setSalaryRatioDate(DateUtils.toDate(thisMonth));
lis.add(psSalaryContract);
}
}
lis.forEach(item -> {
item.setUserId(user.getUserId());
item.setSalaryRatioDate(DateUtils.toDate(thisMonth));
});
salaryContractMapper.insertBatch(lis);
}
log.info("员工提成批处理结束");

View File

@ -60,8 +60,8 @@ public class PsSalaryController extends BaseController {
* @return
*/
@GetMapping("/queryContractPageList")
public TableDataInfo<PsSalaryContractVo> queryContractPageList(Long id, String status, PageQuery pageQuery) {
return psSalaryService.queryContractPageList(id, status, pageQuery);
public TableDataInfo<PsSalaryContractVo> queryContractPageList(Long id, Long userId, String status, PageQuery pageQuery) {
return psSalaryService.queryContractPageList(id, userId, status, pageQuery);
}
// /**

View File

@ -2,6 +2,8 @@ package com.pusong.business.domain.vo;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.pusong.business.domain.PsSalaryContract;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
@ -90,4 +92,8 @@ public class PsSalaryContractVo implements Serializable {
*/
private String status;
private String contractStatus;
}

View File

@ -41,8 +41,13 @@ public class PsSalaryVo implements Serializable {
/**
* 员工id
*/
@Translation(type = TransConstant.USER_ID_TO_NICKNAME)
private Long userId;
/**
* 员工id
*/
private String nickName;
/**
* 员工岗位
*/

View File

@ -50,7 +50,9 @@ public interface PsContractInfoMapper extends BaseMapperPlus<PsContractInfo, PsC
List<PsContractInfoVo> selectContractList(@Param(Constants.WRAPPER) Wrapper<PsContractInfo> queryWrapper);
List<PsSalaryContract> querySalaryListByCodes(@Param(Constants.WRAPPER) Wrapper<PsContractInfo> queryWrapper);
Page<PsSalaryContractVo> querySalaryListByCodes(@Param("page") Page<PsContractInfo> page, @Param(Constants.WRAPPER) Wrapper<PsContractInfo> queryWrapper);
List<PsSalaryContractVo> querySalaryListByCodes(@Param(Constants.WRAPPER) Wrapper<PsContractInfo> queryWrapper);
List<Map<String,Object>> homePageReturnMoneyInfo(@Param("queryParam") Map<String, Object> queryParam);
List<UserContractAmountInfo> getUserContractSourceAmountsByDeptId(@Param("queryParam") Map<String, Object> queryParam, @Param(Constants.WRAPPER) Wrapper<PsContractInfo> queryWrapper);

View File

@ -1,8 +1,14 @@
package com.pusong.business.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pusong.business.domain.PsContractInfo;
import com.pusong.business.domain.PsSalary;
import com.pusong.business.domain.vo.PsSalaryContractVo;
import com.pusong.business.domain.vo.PsSalaryVo;
import com.pusong.common.mybatis.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
/**
* 员工提成提成Mapper接口
@ -11,5 +17,6 @@ import com.pusong.common.mybatis.core.mapper.BaseMapperPlus;
* @date 2024-08-23
*/
public interface PsSalaryMapper extends BaseMapperPlus<PsSalary, PsSalaryVo> {
Page<PsSalaryVo> querySalaryList(@Param("page") Page<PsContractInfo> page, @Param(Constants.WRAPPER) Wrapper<PsSalary> queryWrapper);
}

View File

@ -36,7 +36,7 @@ public interface IPsSalaryService {
* @param pageQuery
* @return
*/
TableDataInfo<PsSalaryContractVo> queryContractPageList(Long id, String status, PageQuery pageQuery);
TableDataInfo<PsSalaryContractVo> queryContractPageList(Long id, Long customManagerId, String status, PageQuery pageQuery);
// /**
// * 查询员工提成提成

View File

@ -1,9 +1,13 @@
package com.pusong.business.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.pusong.business.batch.CalSalaryBatch;
import com.pusong.business.domain.PsContractInfo;
import com.pusong.business.domain.PsCustomPrice;
import com.pusong.business.domain.PsSalaryContract;
import com.pusong.business.domain.vo.PsSalaryContractVo;
import com.pusong.business.enums.CommonStatusEnum;
import com.pusong.business.mapper.PsContractInfoMapper;
import com.pusong.business.mapper.PsSalaryContractMapper;
import com.pusong.common.core.utils.DateUtils;
import com.pusong.common.core.utils.MapstructUtils;
@ -24,10 +28,7 @@ import com.pusong.business.service.IPsSalaryService;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.*;
/**
* 员工提成提成Service业务层处理
@ -42,7 +43,11 @@ public class PsSalaryServiceImpl implements IPsSalaryService {
private final PsSalaryMapper baseMapper;
private final PsSalaryContractMapper salaryContractMapper;
private final PsContractInfoMapper psContractInfoMapper;
private final CalSalaryBatch calSalaryBatch;
/**
* 分页查询员工提成提成列表
*
@ -52,29 +57,54 @@ public class PsSalaryServiceImpl implements IPsSalaryService {
*/
@Override
public TableDataInfo<PsSalaryVo> queryPageList(PsSalaryBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<PsSalary> lqw = buildQueryWrapper(bo);
Page<PsSalaryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
QueryWrapper<PsSalary> lqw = buildQueryWrapper(bo);
lqw.eq("salary.del_flag", 0);
Page<PsSalaryVo> result = baseMapper.querySalaryList(pageQuery.build(), lqw);
if (bo.getStartDate().getTime() <= DateUtils.getFirstDayZeroTimeByMonth().getTime() && bo.getEndDate().getTime() >= DateUtils.getFirstDayZeroTimeByMonth().getTime()){
LocalDateTime deadline = bo.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
LocalDate thisMonth = LocalDate.now();
List<PsSalary> psSalaries = calSalaryBatch.calcData(deadline, thisMonth, false);
List<PsSalaryVo> adds = MapstructUtils.convert(psSalaries, PsSalaryVo.class);
List<PsSalaryVo> adds = calSalaryBatch.calcData(deadline, thisMonth, false);
List<PsSalaryVo> records= new ArrayList<>();
records.addAll(result.getRecords());
records.addAll(adds);
result.setRecords(records);
result.setTotal(result.getTotal() + adds.size());
}
// long diffNum = result.getSize() - result.getRecords().size();
// diffNum = diffNum > adds.size() ? adds.size() : diffNum;
//
// long remainder = result.getTotal() % result.getPages();
// long replenishment = result.getPages() - remainder;
// long maxPage = result.getTotal() / result.getPages() + 1;
if (result.getTotal() < pageQuery.getPageNum() * result.getSize()){
//需要补本月的
long diffNum = pageQuery.getPageNum() * result.getSize() - result.getTotal();//到该页结尾总共需要补多少
int startIndex;
int endIndex;
if (diffNum >= result.getSize()){
startIndex = (int)(diffNum - result.getSize());
endIndex = startIndex + (int)result.getSize();
}else{
startIndex = 0;
endIndex = (int)diffNum;
}
endIndex = endIndex > adds.size() ? adds.size() : endIndex;
records.addAll(adds.subList(startIndex, endIndex));
result.setRecords(records);
}
result.setTotal(result.getTotal() + adds.size());
}
return TableDataInfo.build(result);
}
private LambdaQueryWrapper<PsSalary> buildQueryWrapper(PsSalaryBo bo) {
LambdaQueryWrapper<PsSalary> lqw = Wrappers.lambdaQuery();
lqw.le(bo.getEndDate() != null,PsSalary::getSalaryDate,bo.getEndDate());
lqw.ge(bo.getStartDate() != null,PsSalary::getSalaryDate,bo.getStartDate());
private QueryWrapper<PsSalary> buildQueryWrapper(PsSalaryBo bo) {
QueryWrapper<PsSalary> lqw = new QueryWrapper<PsSalary>();
lqw.le(bo.getEndDate() != null, "salary_date", bo.getEndDate());
lqw.ge(bo.getStartDate() != null, "salary_date", bo.getStartDate());
lqw.exists(StringUtils.isNotBlank(bo.getName()),"select 1 from sys_user su where su.user_id = ps_salary.user_id and su.nick_name like %"+bo.getName()+"%");
return lqw;
}
@ -85,10 +115,23 @@ public class PsSalaryServiceImpl implements IPsSalaryService {
* @param pageQuery
* @return
*/
public TableDataInfo<PsSalaryContractVo> queryContractPageList(Long id, String status, PageQuery pageQuery){
Page<PsSalaryContractVo> result = salaryContractMapper.selectVoPage( pageQuery.build(),Wrappers.<PsSalaryContract>lambdaQuery()
.eq(PsSalaryContract::getSalaryId ,id)
.eq(StringUtils.isNotBlank(status),PsSalaryContract::getStatus,status));
public TableDataInfo<PsSalaryContractVo> queryContractPageList(Long id, Long customManagerId, String status, PageQuery pageQuery){
Page<PsSalaryContractVo> result;
if (id == null){
LocalDateTime deadline = DateUtils.getEndTimeByMonth(new Date()).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
QueryWrapper<PsContractInfo> wrapper = new QueryWrapper<PsContractInfo>()
.ne("is_cancel", CommonStatusEnum.SUCCESS.getCode())
.and(wq -> wq.le("finish_date", deadline).or().isNull("finish_date"))
.eq("info.custom_manager", customManagerId);
result = psContractInfoMapper.querySalaryListByCodes(pageQuery.build(), wrapper);
} else{
result = salaryContractMapper.selectVoPage(pageQuery.build(), Wrappers.<PsSalaryContract>lambdaQuery()
.eq(PsSalaryContract::getSalaryId, id)
.eq(StringUtils.isNotBlank(status), PsSalaryContract::getStatus, status));
}
return TableDataInfo.build(result);
}

View File

@ -57,7 +57,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
${ew.getCustomSqlSegment}
</select>
<select id="querySalaryListByCodes" resultType="com.pusong.business.domain.PsSalaryContract">
<select id="querySalaryListByCodes" resultType="com.pusong.business.domain.vo.PsSalaryContractVo">
select
info.contract_code
,info.custom_manager
@ -66,6 +66,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
,com.company_name
,info.contract_amount
,info.start_service_date service_start_date
,info.contract_status
from ps_contract_info info
left join ps_custom_info cus on info.custom_id = cus.id
left join ps_company_info com on info.company_id = com.id

View File

@ -3,5 +3,13 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pusong.business.mapper.PsSalaryMapper">
<select id="querySalaryList" resultType="com.pusong.business.domain.vo.PsSalaryVo">
select
salary.*, usr.nick_name
from ps_salary salary
left join sys_user usr on usr.user_id = salary.user_id
${ew.getCustomSqlSegment}
</select>
</mapper>