生成合同

This commit is contained in:
1073413548 2024-08-26 18:08:49 +08:00
parent 1abd107478
commit f42d14706b
36 changed files with 493 additions and 107 deletions

View File

@ -4,16 +4,22 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pusong.business.domain.PsContractInfo; import com.pusong.business.domain.PsContractInfo;
import com.pusong.business.domain.PsContractPay;
import com.pusong.business.domain.PsSalary; import com.pusong.business.domain.PsSalary;
import com.pusong.business.domain.PsSalaryConfig; import com.pusong.business.domain.PsSalaryConfig;
import com.pusong.business.domain.vo.PsContractBusinessDetailVo; import com.pusong.business.domain.vo.PsContractBusinessDetailVo;
import com.pusong.business.domain.vo.PsContractBusinessVo; import com.pusong.business.domain.vo.PsContractBusinessVo;
import com.pusong.business.domain.vo.PsContractPayVo;
import com.pusong.business.enums.CommonStatusEnum;
import com.pusong.business.enums.ContractStatusEnum; import com.pusong.business.enums.ContractStatusEnum;
import com.pusong.business.enums.PayStatusEnum;
import com.pusong.business.mapper.PsContractInfoMapper; import com.pusong.business.mapper.PsContractInfoMapper;
import com.pusong.business.mapper.PsContractPayMapper;
import com.pusong.business.mapper.PsSalaryConfigMapper; import com.pusong.business.mapper.PsSalaryConfigMapper;
import com.pusong.business.mapper.PsSalaryMapper; import com.pusong.business.mapper.PsSalaryMapper;
import com.pusong.business.service.IPsContractBusinessService; import com.pusong.business.service.IPsContractBusinessService;
import com.pusong.common.core.utils.DateUtils; import com.pusong.common.core.utils.DateUtils;
import com.pusong.common.core.utils.StringUtils;
import com.pusong.system.domain.SysUser; import com.pusong.system.domain.SysUser;
import com.pusong.system.domain.SysUserPost; import com.pusong.system.domain.SysUserPost;
import com.pusong.system.mapper.SysUserMapper; import com.pusong.system.mapper.SysUserMapper;
@ -31,7 +37,9 @@ import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
@Component @Component
@ -47,7 +55,10 @@ public class CalSalaryBatch {
private SysUserPostMapper sysUserPostMapper; private SysUserPostMapper sysUserPostMapper;
@Resource @Resource
private PsSalaryConfigMapper psSalaryConfigMapper; private PsSalaryConfigMapper psSalaryConfigMapper;
@Resource
private PsSalaryMapper psSalaryMapper; private PsSalaryMapper psSalaryMapper;
@Resource
private PsContractPayMapper payMapper;
/** /**
* 每月1日凌晨1点执行 * 每月1日凌晨1点执行
*/ */
@ -65,21 +76,26 @@ public class CalSalaryBatch {
log.info("查询本月所有已完成的合同"); log.info("查询本月所有已完成的合同");
List<PsContractInfo> contractInfos = psContractInfoMapper.selectList(Wrappers.<PsContractInfo>lambdaQuery() List<PsContractInfo> contractInfos = psContractInfoMapper.selectList(Wrappers.<PsContractInfo>lambdaQuery()
.eq(PsContractInfo::getContractStatus, ContractStatusEnum.SUCCESS.getCode()) .ne(PsContractInfo::getIsCancel, CommonStatusEnum.SUCCESS.getCode())
.between(PsContractInfo::getFinishDate, firstDayOfLastMonth, lastDayOfLastMonth)); .between(PsContractInfo::getFinishDate, firstDayOfLastMonth, lastDayOfLastMonth));
log.info("查询本月所有已完成的合同{}", contractInfos.size()); log.info("查询本月所有的合同{}", contractInfos.size());
if(CollectionUtils.isEmpty(contractInfos)){ if(CollectionUtils.isEmpty(contractInfos)){
log.info("本月无已完成合同"); log.info("本月无已完成合同");
contractInfos = new ArrayList<>(); contractInfos = new ArrayList<>();
} }
//转换 客户经理有的合同编码 List<PsContractInfo> finists = contractInfos.stream().filter(item -> StringUtils.equals(item.getContractStatus(), ContractStatusEnum.SUCCESS.getCode())).toList();
Map<Long, List<String>> map = contractInfos.stream().collect(Collectors.groupingBy(PsContractInfo::getCustomManager, List<PsContractInfo> unfinists = contractInfos.stream().filter(item -> !StringUtils.equals(item.getContractStatus(), ContractStatusEnum.SUCCESS.getCode())).toList();
Collectors.mapping(PsContractInfo::getContractCode,Collectors.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()));;
//查询所有岗位配置信息 //查询所有岗位配置信息
List<PsSalaryConfig> configs = psSalaryConfigMapper.selectList(); List<PsSalaryConfig> configs = psSalaryConfigMapper.selectList();
Map<Long, Map<String, BigDecimal>> configMap = configs.stream().collect(Collectors.groupingBy(PsSalaryConfig::getPostId, Map<Long, Map<String, BigDecimal>> configMap = configs.stream().collect(Collectors.groupingBy(PsSalaryConfig::getPostId,
Collectors.toMap(PsSalaryConfig::getServiceProject, PsSalaryConfig::getSalaryRatio))); Collectors.toMap(PsSalaryConfig::getServiceProject, PsSalaryConfig::getSalaryRatio)));
Map<Long, Map<String, BigDecimal>> costMap = configs.stream().collect(Collectors.groupingBy(PsSalaryConfig::getPostId,
Collectors.toMap(PsSalaryConfig::getServiceProject, PsSalaryConfig::getCost)));
//循环计算每个员工的提成 //循环计算每个员工的提成
for (SysUser user : list){ for (SysUser user : list){
Long userId = user.getUserId(); Long userId = user.getUserId();
@ -89,9 +105,17 @@ public class CalSalaryBatch {
if(post == null){continue;} if(post == null){continue;}
log.info("查询员工岗位{}",post.getPostId()); log.info("查询员工岗位{}",post.getPostId());
//服务列表 //服务列表
List<PsContractBusinessVo> busin = businessService.selectBusinessList(map.get(userId)); List<String> codeList = finistMap.get(userId).stream().map(PsContractInfo::getContractCode).toList();
List<PsContractBusinessVo> busin = businessService.selectBusinessList(codeList);
//所有合同的退款列表
codeList.addAll(unfinistMap.get(userId).stream().map(PsContractInfo::getContractCode).toList());
log.info("进行计算提成计算"); log.info("进行计算提成计算");
BigDecimal salary = calSalary(busin, configMap.get(post.getPostId())); BigDecimal salary = calSalary(busin, configMap.get(post.getPostId()),costMap.get(post.getPostId()));
List<PsContractPay> payList = payMapper.selectList(Wrappers.<PsContractPay>lambdaQuery().in(PsContractPay::getContractCode, codeList).
eq(PsContractPay::getPayStatus, PayStatusEnum.SUCCESS.getCode()).eq(PsContractPay::getBusinessType,"2"));
//salary- 退费金额*服务项目最高提成
salary = salary.subtract(this.calReturnSalary(payList,configMap.get(post.getPostId())));
log.info("进行计算提成计算{}",salary); log.info("进行计算提成计算{}",salary);
log.info("进行存表"); log.info("进行存表");
PsSalary psSalary = new PsSalary(); PsSalary psSalary = new PsSalary();
@ -100,37 +124,67 @@ public class CalSalaryBatch {
psSalary.setSalaryDate(DateUtils.toDate(firstDayOfLastMonth)); psSalary.setSalaryDate(DateUtils.toDate(firstDayOfLastMonth));
psSalary.setPostId(post.getPostId()); psSalary.setPostId(post.getPostId());
psSalary.setUserId(userId); psSalary.setUserId(userId);
// psSalaryMapper.insert(psSalary); //已完成合同数量
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.setFinistContractNum(finishNum);
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);
//未完成合同金额
BigDecimal unFinishMoney = CollectionUtils.isEmpty(unfinistMap.get(userId))?BigDecimal.ZERO:
unfinistMap.get(userId).stream().map(PsContractInfo::getContractAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);;
psSalary.setContractMoney(finishMoney.add(unFinishMoney));
psSalary.setFinistContractMoney(finishMoney);
psSalary.setUnfinistContractMoney(unFinishMoney);
psSalaryMapper.insert(psSalary);
} }
log.info("员工提成批处理结束"); log.info("员工提成批处理结束");
} }
/** /**
* 服务项目1收费-服务项目1成本*服务项目1提成比例+服务项目2收费-服务项目2成本*服务项目2提成比例
* +服务项目3收费-服务项目3成本*服务项目3提成比例
* *
* @param businessVo 服务项目 * @param businessVo 服务项目
* @param configMap 配置map * @param configMap 配置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){
String cbStr = "0.0";
String rateStr = "0.1";
BigDecimal salary = BigDecimal.ZERO; BigDecimal salary = BigDecimal.ZERO;
for(PsContractBusinessVo item : businessVo){ for(PsContractBusinessVo item : businessVo){
//如果详情没有填写金额的话按照详情中最低的提成比例进行计算按照详情算 //如果详情没有填写金额的话按照详情中最低的提成比例进行计算按照详情算
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("0.1"); BigDecimal rate = new BigDecimal(cbStr);
BigDecimal cb = 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()));
} }
//服务类型金额 //服务类型金额 - 成本
BigDecimal amount = item.getBusinessAmount(); BigDecimal amount = item.getBusinessAmount().subtract(cb);
// ×比例
salary = salary.add(amount.multiply(rate)); salary = salary.add(amount.multiply(rate));
}else{//按照类型算 }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());
salary = salary.add(detail.getAmount().multiply(rateConfig)); //成本
BigDecimal rateCost = costMap.get(detail.getBusinessProject()) == null ? new BigDecimal(cbStr):costMap.get(detail.getBusinessProject());
//项目金额-成本 *比例
salary = salary.add(detail.getAmount().subtract(rateCost).multiply(rateConfig));
} }
} }
@ -138,4 +192,28 @@ public class CalSalaryBatch {
return salary; return salary;
} }
/**
* 算退费金额
* @param payList
* @param configMap
* @return
*/
private BigDecimal calReturnSalary(List<PsContractPay> payList,Map<String, BigDecimal> configMap){
String cbStr = "0.0";
BigDecimal retur = BigDecimal.ZERO;
if(CollectionUtils.isEmpty(payList)){return retur;}
for(PsContractPay pay : payList){
List<PsContractBusinessVo> list = businessService.selectBusinessList(List.of(pay.getContractCode()));
BigDecimal rate = new BigDecimal(cbStr);
for(PsContractBusinessVo item : list){
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;
}
}
retur = retur.add(pay.getMoney().multiply(rate));
}
return retur;
}
} }

View File

@ -87,6 +87,18 @@ public class PsContractOperateController extends BaseController {
return R.ok(); return R.ok();
} }
/**
* 回传合同
*/
@SaCheckPermission("business:contractOperate:confirm")
@PostMapping(value = "/confirm", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> confirm(@RequestPart("file") MultipartFile file,@NotBlank String contractCode )throws Exception {
operateService.confirm( file, contractCode);
return R.ok();
}
// //

View File

@ -0,0 +1,49 @@
package com.pusong.business.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.pusong.business.domain.bo.PsCustomCallbackBo;
import com.pusong.business.domain.bo.PsCustomInfoBo;
import com.pusong.business.domain.bo.PsCustomPriceBo;
import com.pusong.business.domain.vo.PsCustomInfoVo;
import com.pusong.business.domain.vo.PsCustomerRecordVo;
import com.pusong.business.service.IPsCustomInfoService;
import com.pusong.common.core.domain.R;
import com.pusong.common.core.validate.AddGroup;
import com.pusong.common.core.validate.EditGroup;
import com.pusong.common.idempotent.annotation.RepeatSubmit;
import com.pusong.common.log.annotation.Log;
import com.pusong.common.log.enums.BusinessType;
import com.pusong.common.mybatis.core.page.PageQuery;
import com.pusong.common.mybatis.core.page.TableDataInfo;
import com.pusong.common.web.core.BaseController;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 客户基本信息
*
* @author Lion Li
* @date 2024-07-25
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/business/home")
public class PsHomeController extends BaseController {
private final IPsCustomInfoService psCustomInfoService;
/**
* 查询登陆人下所有的客户名称和id
*/
@SaCheckPermission("business:customInfo:list")
@GetMapping("/listByLoginUser")
public R<List<PsCustomInfoVo>> listByLoginUser() {
return R.ok(psCustomInfoService.listByLoginUser());
}
}

View File

@ -2,6 +2,7 @@ package com.pusong.business.controller;
import java.util.List; import java.util.List;
import com.pusong.business.domain.bo.PsSalaryConfigAddVo;
import com.pusong.business.domain.vo.PsSalaryConfigInfoVo; import com.pusong.business.domain.vo.PsSalaryConfigInfoVo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
@ -56,6 +57,17 @@ public class PsSalaryConfigController extends BaseController {
return R.ok(psSalaryConfigService.queryByTemplateCode(templateCode)); return R.ok(psSalaryConfigService.queryByTemplateCode(templateCode));
} }
/**
* 新增提成配置
*/
@Log(title = "新增提成配置")
@SaCheckPermission("business:salaryConfig:add")
@PostMapping("/add")
public R<Void> add(PsSalaryConfigAddVo addVo) {
psSalaryConfigService.add(addVo);
return R.ok();
}
// /** // /**

View File

@ -10,6 +10,7 @@ import com.pusong.common.core.domain.R;
import com.pusong.common.core.validate.QueryGroup; import com.pusong.common.core.validate.QueryGroup;
import com.pusong.common.log.annotation.Log; import com.pusong.common.log.annotation.Log;
import com.pusong.common.log.enums.BusinessType; import com.pusong.common.log.enums.BusinessType;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -75,7 +76,7 @@ public class PsTaskController extends BaseController {
@Log(title = "根据任务id查询任务的公司信息和资料信息") @Log(title = "根据任务id查询任务的公司信息和资料信息")
@SaCheckPermission("business:task:list") @SaCheckPermission("business:task:list")
@GetMapping("/info") @GetMapping("/info")
public R<PsTaskMainVo> info(@NotNull Long id) { public R<PsTaskMainVo> info(@NotBlank String id) {
return R.ok(psTaskMainService.queryInfo(id)); return R.ok(psTaskMainService.queryInfo(id));
} }

View File

@ -55,4 +55,12 @@ public class ServiceConfigController {
configService.delete(dictCode); configService.delete(dictCode);
return R.ok(); return R.ok();
} }
/**
* 根据合同编码查询资料配置信息
*/
@PostMapping("/getByContractCode")
public R<List<String>> getByContractCode(String contractCode) {
return R.ok(configService.getByContractCode(contractCode));
}
} }

View File

@ -146,6 +146,9 @@ public class PsContractInfo extends TenantEntity {
* 合同完成时间 * 合同完成时间
*/ */
private Date finishDate; private Date finishDate;
/**
* 确认单
*/
private Long confirmOssid;
} }

View File

@ -37,7 +37,10 @@ public class PsSalaryConfig extends TenantEntity {
* 服务项目编码 * 服务项目编码
*/ */
private String serviceProject; private String serviceProject;
/**
* 成本
*/
private BigDecimal cost;
/** /**
* 提成比例 * 提成比例
*/ */

View File

@ -0,0 +1,36 @@
package com.pusong.business.domain.bo;
import com.pusong.business.domain.PsSalary;
import com.pusong.business.domain.PsSalaryConfig;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.List;
@Data
@EqualsAndHashCode
@AutoMapper(target = PsSalaryConfig.class)
public class PsSalaryConfigAddVo {
/**
* 模板编码
*/
private String templateCode;
/**
* 模板名称
*/
private String templateName;
/**
* 岗位id
*/
private Long postId;
/**
* 提成详细
*/
@NotEmpty
private List<SalaryConfigVo> salaryConfigVoList;
}

View File

@ -0,0 +1,27 @@
package com.pusong.business.domain.bo;
import com.pusong.business.domain.PsSalaryConfig;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
@Data
@EqualsAndHashCode
@AutoMapper(target = PsSalaryConfig.class)
public class SalaryConfigVo {
/**
* 服务项目编码
*/
private String serviceProject;
/**
* 成本
*/
private BigDecimal cost;
/**
* 提成比例
*/
private BigDecimal salaryRatio;
}

View File

@ -208,4 +208,10 @@ public class PsContractInfoVo implements Serializable {
* 发票ossid * 发票ossid
*/ */
private String invoiceOssid; private String invoiceOssid;
/**
* 确认单
*/
private Long confirmOssid;
} }

View File

@ -10,6 +10,7 @@ import lombok.Data;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -66,6 +67,7 @@ public class PsCustomerRecordVo implements Serializable {
/** /**
* 销售经理 * 销售经理
*/ */
@Translation(type = TransConstant.USER_ID_TO_NICKNAME)
private String customManager; private String customManager;
/** /**
* 所属区域 * 所属区域
@ -104,7 +106,7 @@ public class PsCustomerRecordVo implements Serializable {
/** /**
* 当前服务人名字 * 当前服务人名字
*/ */
@Translation(type = TransConstant.USER_ID_TO_NICKNAME,mapper = "executor") @Translation(type = TransConstant.USER_ID_TO_NICKNAME,mapper = "executors")
private String executorName; private String executorName;
/** /**
@ -112,6 +114,24 @@ public class PsCustomerRecordVo implements Serializable {
*/ */
private String signDesc; private String signDesc;
/**
* 合同完成日期
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
private Date finishDate;
/**
* 审批状态
*/
private String approverStatus;
/**
* 客户创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
private Date createTime;
/**
* 合同总金额
*/
private BigDecimal contractAmount;
} }

View File

@ -57,5 +57,5 @@ public class PsSalaryConfigInfoVo implements Serializable {
/** /**
* 服务类型Map * 服务类型Map
*/ */
private Map<String,Map<String,Object>> serviceTypeMap; private Map<String,Map<String,Map<String,String>>> serviceTypeMap;
} }

View File

@ -6,6 +6,8 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.pusong.common.excel.annotation.ExcelDictFormat; import com.pusong.common.excel.annotation.ExcelDictFormat;
import com.pusong.common.excel.convert.ExcelDictConvert; import com.pusong.common.excel.convert.ExcelDictConvert;
import com.pusong.common.translation.annotation.Translation;
import com.pusong.common.translation.constant.TransConstant;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
@ -37,7 +39,13 @@ public class PsSalaryVo implements Serializable {
/** /**
* 员工id * 员工id
*/ */
@Translation(type = TransConstant.USER_ID_TO_NICKNAME)
private Long userId; private Long userId;
/**
* 员工岗位
*/
@Translation(type = TransConstant.POST_ID_TO_NAME)
private Long postId;
/** /**
* 员工提成金额 * 员工提成金额
@ -49,5 +57,28 @@ public class PsSalaryVo implements Serializable {
*/ */
private String salaryDate; private String salaryDate;
/**
* 合同数量
*/
private Integer contractNum;
/**
* 已完成数量
*/
private Integer finistContractNum;
/**
* 未完成数量
*/
private Integer unfinistContractNum;
/**
* 合同总金额
*/
private BigDecimal contractMoney;
/**
* 已完成金额
*/
private BigDecimal finistContractMoney;
/**
* 未完成金额
*/
private BigDecimal unfinistContractMoney;
} }

View File

@ -125,4 +125,9 @@ public class PsTaskMainVo implements Serializable {
* 特勤是否派单1是0否 * 特勤是否派单1是0否
*/ */
private String secAppo; private String secAppo;
/**
* 任务备注
*/
private String taskDesc;
} }

View File

@ -14,7 +14,7 @@ import java.util.List;
public enum TaskStatusEnum { public enum TaskStatusEnum {
INIT("10","任务初始化(待派单)"), INIT("10","任务初始化(待派单)"),
ING("20","进行中"), ING("20","进行中"),
OA("25","完成审批中"), // OA("25","完成审批中"),
FINISH("30","完成"), FINISH("30","完成"),
PAUSE("40","暂停"), PAUSE("40","暂停"),
CANCEL("50","作废"), CANCEL("50","作废"),
@ -56,7 +56,7 @@ public enum TaskStatusEnum {
public static Boolean canFinish(String taskStatus){ public static Boolean canFinish(String taskStatus){
//不能点作废 完成 审批中 //不能点作废 完成 审批中
if(StringUtils.equals(taskStatus,CANCEL.getCode()) || StringUtils.equals(taskStatus,FINISH.getCode()) if(StringUtils.equals(taskStatus,CANCEL.getCode()) || StringUtils.equals(taskStatus,FINISH.getCode())
|| StringUtils.equals(taskStatus,OA.getCode())|| StringUtils.equals(taskStatus,CANCELAPPO.getCode())){ || /*StringUtils.equals(taskStatus,OA.getCode())||*/ StringUtils.equals(taskStatus,CANCELAPPO.getCode())){
return false; return false;
} }
return true; return true;
@ -70,6 +70,7 @@ public enum TaskStatusEnum {
@AllArgsConstructor @AllArgsConstructor
public enum AppointStatusEnum { public enum AppointStatusEnum {
ING("20","进行中"), ING("20","进行中"),
OA("25","完成审批中"),
FINISH("30","完成"), FINISH("30","完成"),
PAUSE("40","暂停"), PAUSE("40","暂停"),
CANCEL("50","作废"); CANCEL("50","作废");

View File

@ -1,17 +1,8 @@
package com.pusong.business.mapper; 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.PsSalary;
import com.pusong.business.domain.PsTaskMain;
import com.pusong.business.domain.vo.PsSalaryVo; import com.pusong.business.domain.vo.PsSalaryVo;
import com.pusong.business.domain.vo.PsTaskMainVo;
import com.pusong.common.mybatis.annotation.DataColumn;
import com.pusong.common.mybatis.annotation.DataPermission;
import com.pusong.common.mybatis.core.mapper.BaseMapperPlus; import com.pusong.common.mybatis.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
/** /**
* 员工提成提成Mapper接口 * 员工提成提成Mapper接口
@ -21,10 +12,4 @@ import org.apache.ibatis.annotations.Param;
*/ */
public interface PsSalaryMapper extends BaseMapperPlus<PsSalary, PsSalaryVo> { public interface PsSalaryMapper extends BaseMapperPlus<PsSalary, PsSalaryVo> {
@DataPermission({
@DataColumn(key = "deptName", value = "use.create_dept"),
@DataColumn(key = "userName", value = "use.create_by")
})
Page<PsSalaryVo> selectSalaryList(@Param("page") Page<PsSalary> page, @Param(Constants.WRAPPER) Wrapper<PsSalary> queryWrapper);
} }

View File

@ -33,4 +33,11 @@ public interface IPsContractOperateService {
* @param contractCode 合同编码 * @param contractCode 合同编码
*/ */
void rollbackContract( MultipartFile file, String contractCode); void rollbackContract( MultipartFile file, String contractCode);
/**
* 确认单
* @param file 回传合同文件
* @param contractCode 合同编码
*/
void confirm( MultipartFile file, String contractCode);
} }

View File

@ -1,5 +1,6 @@
package com.pusong.business.service; package com.pusong.business.service;
import com.pusong.business.domain.bo.PsSalaryConfigAddVo;
import com.pusong.business.domain.vo.PsSalaryConfigInfoVo; import com.pusong.business.domain.vo.PsSalaryConfigInfoVo;
import com.pusong.business.domain.vo.PsSalaryConfigVo; import com.pusong.business.domain.vo.PsSalaryConfigVo;
import com.pusong.business.domain.bo.PsSalaryConfigBo; import com.pusong.business.domain.bo.PsSalaryConfigBo;
@ -35,6 +36,14 @@ public interface IPsSalaryConfigService {
* @return PsSalaryConfigVo * @return PsSalaryConfigVo
*/ */
PsSalaryConfigInfoVo queryByTemplateCode(String templateCode); PsSalaryConfigInfoVo queryByTemplateCode(String templateCode);
/**
* 查询提成配置详情
*
* @param addVo 提成模板信息
* @return PsSalaryConfigVo
*/
void add(PsSalaryConfigAddVo addVo);
// /** // /**
// * 查询提成配置 // * 查询提成配置
// * // *

View File

@ -56,7 +56,7 @@ public interface IPsTaskService {
* @param id 任务主表主键 * @param id 任务主表主键
* @return 公司及资料信息 * @return 公司及资料信息
*/ */
PsTaskMainVo queryInfo(Long id); PsTaskMainVo queryInfo(String id);
/** /**
* 根据合同编码查询任务 * 根据合同编码查询任务
* *

View File

@ -40,4 +40,10 @@ public interface IServiceConfigService {
* @return * @return
*/ */
void delete(Long dictCode); void delete(Long dictCode);
/**
* 根据合同编码查询资料配置信息
* @param contractCode
*/
List<String> getByContractCode(String contractCode);
} }

View File

@ -15,7 +15,7 @@ public interface ApproverService {
* @param desc 审批说明 * @param desc 审批说明
* @param updateData 修改后的数据 * @param updateData 修改后的数据
*/ */
public void apply( String bussinessId,String contractCode, String desc, Object updateData); public void apply( String bussinessId,String contractCode, String desc, String updateData);
/** /**
* 成功 * 成功
*/ */

View File

@ -50,7 +50,7 @@ public abstract class ApproverAbstractServiceImpl implements ApproverService {
* @param desc * @param desc
* @param updateData * @param updateData
*/ */
public void apply(String bussinessId,String contractCode, String desc, Object updateData){ public void apply(String bussinessId,String contractCode, String desc, String updateData){
List<PsApproverRecord> list = approverRecordMapper.selectList(Wrappers.<PsApproverRecord>lambdaQuery().eq(PsApproverRecord::getDelFlag, "0") List<PsApproverRecord> list = approverRecordMapper.selectList(Wrappers.<PsApproverRecord>lambdaQuery().eq(PsApproverRecord::getDelFlag, "0")
.eq(PsApproverRecord::getBusinessId, bussinessId).eq(PsApproverRecord::getBusinessType,approverType()) .eq(PsApproverRecord::getBusinessId, bussinessId).eq(PsApproverRecord::getBusinessType,approverType())
.eq(PsApproverRecord::getApproverStatus, ApproverStatusEnum.INIT.getCode())); .eq(PsApproverRecord::getApproverStatus, ApproverStatusEnum.INIT.getCode()));
@ -63,7 +63,7 @@ public abstract class ApproverAbstractServiceImpl implements ApproverService {
record.setContractCode(contractCode); record.setContractCode(contractCode);
record.setBusinessType(approverType()); record.setBusinessType(approverType());
record.setApplyDesc(desc); record.setApplyDesc(desc);
record.setUpdateData(updateData == null?null:JSON.toJSONString(updateData)); record.setUpdateData(updateData);
record.setApplyDate(new Date()); record.setApplyDate(new Date());
record.setApproverStatus(ApproverStatusEnum.INIT.getCode()); record.setApproverStatus(ApproverStatusEnum.INIT.getCode());
approverRecordMapper.insert(record); approverRecordMapper.insert(record);
@ -83,6 +83,7 @@ public abstract class ApproverAbstractServiceImpl implements ApproverService {
public Page<PsApproverRecordVo> queryList(PsApproverRecordBo bo, PageQuery pageQuery){ public Page<PsApproverRecordVo> queryList(PsApproverRecordBo bo, PageQuery pageQuery){
QueryWrapper<PsApproverRecord> lqw = Wrappers.<PsApproverRecord>query().eq("app.business_type",approverType()) QueryWrapper<PsApproverRecord> lqw = Wrappers.<PsApproverRecord>query().eq("app.business_type",approverType())
.eq(bo.getId()!=null,"app.id",bo.getId()) .eq(bo.getId()!=null,"app.id",bo.getId())
.eq("app.del_flag","0")
.orderByAsc("app.approver_status").orderByAsc("app.approver_date"); .orderByAsc("app.approver_status").orderByAsc("app.approver_date");
Page<PsApproverRecordVo> res = recordMapper.selectPageApproverList(pageQuery.build(), lqw); Page<PsApproverRecordVo> res = recordMapper.selectPageApproverList(pageQuery.build(), lqw);
if(CollectionUtils.isNotEmpty(res.getRecords())){ if(CollectionUtils.isNotEmpty(res.getRecords())){

View File

@ -2,10 +2,12 @@ package com.pusong.business.service.approver.impl;
import com.pusong.business.domain.PsApproverRecord; import com.pusong.business.domain.PsApproverRecord;
import com.pusong.business.domain.PsContractInfo; import com.pusong.business.domain.PsContractInfo;
import com.pusong.business.domain.PsTaskAppoint;
import com.pusong.business.domain.PsTaskMain; import com.pusong.business.domain.PsTaskMain;
import com.pusong.business.enums.ApproverTypeEnum; import com.pusong.business.enums.ApproverTypeEnum;
import com.pusong.business.enums.ContractStatusEnum; import com.pusong.business.enums.ContractStatusEnum;
import com.pusong.business.enums.TaskStatusEnum; import com.pusong.business.enums.TaskStatusEnum;
import com.pusong.business.mapper.PsTaskAppointMapper;
import com.pusong.business.mapper.PsTaskMainMapper; import com.pusong.business.mapper.PsTaskMainMapper;
import com.pusong.business.service.IPsContractInfoService; import com.pusong.business.service.IPsContractInfoService;
import com.pusong.business.service.impl.PsContractInfoServiceImpl; import com.pusong.business.service.impl.PsContractInfoServiceImpl;
@ -24,8 +26,8 @@ public class TaskFinishApproverServiceImpl extends ApproverAbstractServiceImpl {
public String approverType() { public String approverType() {
return ApproverTypeEnum.TASKFINISH.getCode(); return ApproverTypeEnum.TASKFINISH.getCode();
} }
private final PsTaskMainMapper taskMainMapper; private final PsTaskAppointMapper taskAppointMapper;
private final IPsContractInfoService contractInfoService;
/** /**
* 1 审批成功 任务的状态变为成功 * 1 审批成功 任务的状态变为成功
@ -33,9 +35,9 @@ public class TaskFinishApproverServiceImpl extends ApproverAbstractServiceImpl {
*/ */
@Override @Override
public void success(PsApproverRecord psApproverRecord) { public void success(PsApproverRecord psApproverRecord) {
PsTaskMain info = taskMainMapper.selectById(psApproverRecord.getBusinessId()); PsTaskAppoint info = taskAppointMapper.selectById(psApproverRecord.getBusinessId());
info.setTaskStatus(TaskStatusEnum.FINISH.getCode()); info.setAppointStatus(TaskStatusEnum.FINISH.getCode());
taskMainMapper.updateById(info); taskAppointMapper.updateById(info);
} }
/** /**
@ -44,8 +46,8 @@ public class TaskFinishApproverServiceImpl extends ApproverAbstractServiceImpl {
*/ */
@Override @Override
public void fail(PsApproverRecord psApproverRecord) { public void fail(PsApproverRecord psApproverRecord) {
PsTaskMain info = taskMainMapper.selectById(psApproverRecord.getBusinessId()); PsTaskAppoint info = taskAppointMapper.selectById(psApproverRecord.getBusinessId());
info.setTaskStatus(TaskStatusEnum.ING.getCode()); info.setAppointStatus(TaskStatusEnum.ING.getCode());
taskMainMapper.updateById(info); taskAppointMapper.updateById(info);
} }
} }

View File

@ -75,7 +75,7 @@ public class IPsContractOperateServiceImpl implements IPsContractOperateService
SysOssVo vo = ossService.upload(file); SysOssVo vo = ossService.upload(file);
//发起回传合同审批 //发起回传合同审批
ApproverService service = container.getService(ApproverTypeEnum.ROLBACK.getCode()); ApproverService service = container.getService(ApproverTypeEnum.ROLBACK.getCode());
service.apply(contractCode,contractCode,null, vo.getOssId()); service.apply(contractCode,contractCode,null, vo.getOssId()+"");
//修改合同信息 //修改合同信息
PsContractInfo psContractInfo = new PsContractInfo(); PsContractInfo psContractInfo = new PsContractInfo();
psContractInfo.setContractCode(contractCode); psContractInfo.setContractCode(contractCode);
@ -92,5 +92,35 @@ public class IPsContractOperateServiceImpl implements IPsContractOperateService
}
/**
* 确认单
* @param file 确认单
* @param contractCode 合同编码
*/
@Transactional
public void confirm( MultipartFile file, String contractCode){
PsContractInfoVo info = contractInfoService.queryContractByCode(contractCode);
//后续添加校验可再次添加
SysOssVo vo = ossService.upload(file);
//修改合同信息
PsContractInfo psContractInfo = new PsContractInfo();
psContractInfo.setContractCode(contractCode);
psContractInfo.setConfirmOssid(vo.getOssId());
contractInfoService.updateByCode(psContractInfo);
//若已存在确认单则删除
if(info.getRollBackPdf() != null){
try{
ossService.deleteWithValidByIds(List.of(info.getConfirmOssid()),null);
}catch (Exception e){
log.error("删除确认单失败",e);
}
}
} }
} }

View File

@ -189,14 +189,29 @@ public class IServiceConfigServiceImpl implements IServiceConfigService {
if(CollectionUtils.isNotEmpty(list)){throw new ServiceException("服务子项目已使用不可修改");} if(CollectionUtils.isNotEmpty(list)){throw new ServiceException("服务子项目已使用不可修改");}
} }
} }
public static void main(String[] args) { /**
String a = "7_3"; * 根据合同编码查询资料配置信息
String b = "7"; * @param contractCode
System.out.println(a.substring(b.length()+1)); */
List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13); public List<String> getByContractCode(String contractCode){
SysDictDataBo dictData = new SysDictDataBo();
dictData.setInDictType(List.of(SERVICE_PROJECT));
List<SysDictDataVo> configList = dictDataService.selectDictDataList(dictData);
//分组排序
Map<String, String> map = configList.stream().collect(Collectors.toMap(SysDictDataVo::getDictValue, SysDictDataVo::getRemark));
PsContractBusinessDetailBo bo = new PsContractBusinessDetailBo();
bo.setContractCode(contractCode);
List<PsContractBusinessDetailVo> list = detailService.queryList(bo);
List<String> restList = new ArrayList<>();
list.forEach(item ->{ list.forEach(item ->{
if (item==6){return;} String bp = map.get(item.getBusinessProject());
System.out.println(item); if(StringUtils.isNotBlank(bp)){
String cb = JSON.parseObject(bp).getString("cb");
if(StringUtils.isNotBlank(cb)){
restList.addAll(List.of(cb.split(",")));
}
}
}); });
return restList;
} }
} }

View File

@ -72,6 +72,7 @@ public class PsContractBusinessDetailServiceImpl implements IPsContractBusinessD
LambdaQueryWrapper<PsContractBusinessDetail> lqw = Wrappers.lambdaQuery(); LambdaQueryWrapper<PsContractBusinessDetail> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getBusinessProject()), PsContractBusinessDetail::getBusinessProject, bo.getBusinessProject()); lqw.eq(StringUtils.isNotBlank(bo.getBusinessProject()), PsContractBusinessDetail::getBusinessProject, bo.getBusinessProject());
lqw.like(StringUtils.isNotBlank(bo.getExtentInfo()), PsContractBusinessDetail::getExtentInfo, bo.getExtentInfo()); lqw.like(StringUtils.isNotBlank(bo.getExtentInfo()), PsContractBusinessDetail::getExtentInfo, bo.getExtentInfo());
lqw.eq(StringUtils.isNotBlank(bo.getContractCode()), PsContractBusinessDetail::getContractCode, bo.getContractCode());
lqw.eq(PsContractBusinessDetail::getDelFlag, "0"); lqw.eq(PsContractBusinessDetail::getDelFlag, "0");
return lqw; return lqw;
} }

View File

@ -126,7 +126,7 @@ public class PsContractPayServiceImpl implements IPsContractPayService {
baseMapper.insert(pay); baseMapper.insert(pay);
//发起审批 //发起审批
ApproverService service = container.getService(ApproverTypeEnum.RETURN.getCode()); ApproverService service = container.getService(ApproverTypeEnum.RETURN.getCode());
service.apply(pay.getId()+"",pay.getContractCode(),payBo.getPayDesc(), pay.getMoney().stripTrailingZeros()); service.apply(pay.getId()+"",pay.getContractCode(),payBo.getPayDesc(), pay.getMoney().stripTrailingZeros().toString());
} }
/** /**
* 根据主键id查询回款记录 * 根据主键id查询回款记录
@ -159,8 +159,8 @@ public class PsContractPayServiceImpl implements IPsContractPayService {
*/ */
@Override @Override
public TableDataInfo<PsRefundVo> queryRefundList(PageQuery pageQuery,String payStatus){ public TableDataInfo<PsRefundVo> queryRefundList(PageQuery pageQuery,String payStatus){
QueryWrapper<PsContractPay> qw = new QueryWrapper<PsContractPay>().in("pay.pay_stauts", List.of(PayStatusEnum.PAYING.getCode(),PayStatusEnum.SUCCESS.getCode())) QueryWrapper<PsContractPay> qw = new QueryWrapper<PsContractPay>().in("pay.pay_status", List.of(PayStatusEnum.PAYING.getCode(),PayStatusEnum.SUCCESS.getCode()))
.eq(StringUtils.isNotBlank(payStatus), "pay.pay_stauts", payStatus); .eq(StringUtils.isNotBlank(payStatus), "pay.pay_status", payStatus);
Page<PsRefundVo> list = baseMapper.queryRefundList(pageQuery.build(), qw); Page<PsRefundVo> list = baseMapper.queryRefundList(pageQuery.build(), qw);
list.getRecords().forEach(info->{ list.getRecords().forEach(info->{
List<PsContractPayVo> payList = queryListByContractCode(info.getContractCode(),null,PayStatusEnum.SUCCESS); List<PsContractPayVo> payList = queryListByContractCode(info.getContractCode(),null,PayStatusEnum.SUCCESS);

View File

@ -418,7 +418,7 @@ public class PsCustomInfoServiceImpl implements IPsCustomInfoService {
baseMapper.updateById(psCustomInfo); baseMapper.updateById(psCustomInfo);
//发起审批 //发起审批
ApproverService service = approverContainer.getService(ApproverTypeEnum.PUBLIC.getCode()); ApproverService service = approverContainer.getService(ApproverTypeEnum.PUBLIC.getCode());
service.apply(customerId+"",null,null,LoginHelper.getUserId()); service.apply(customerId+"",null,null,LoginHelper.getUserId()+"");
} }
/** /**

View File

@ -2,6 +2,7 @@ package com.pusong.business.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.pusong.business.domain.bo.PsSalaryConfigAddVo;
import com.pusong.business.domain.vo.PsSalaryConfigInfoVo; import com.pusong.business.domain.vo.PsSalaryConfigInfoVo;
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;
@ -11,6 +12,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.pusong.business.domain.bo.PsSalaryConfigBo; import com.pusong.business.domain.bo.PsSalaryConfigBo;
import com.pusong.business.domain.vo.PsSalaryConfigVo; import com.pusong.business.domain.vo.PsSalaryConfigVo;
@ -18,10 +21,7 @@ import com.pusong.business.domain.PsSalaryConfig;
import com.pusong.business.mapper.PsSalaryConfigMapper; import com.pusong.business.mapper.PsSalaryConfigMapper;
import com.pusong.business.service.IPsSalaryConfigService; import com.pusong.business.service.IPsSalaryConfigService;
import java.util.HashMap; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/** /**
* 提成配置Service业务层处理 * 提成配置Service业务层处理
@ -33,6 +33,7 @@ import java.util.Collection;
@Service @Service
public class PsSalaryConfigServiceImpl implements IPsSalaryConfigService { public class PsSalaryConfigServiceImpl implements IPsSalaryConfigService {
private static final Logger log = LoggerFactory.getLogger(PsSalaryConfigServiceImpl.class);
private final PsSalaryConfigMapper baseMapper; private final PsSalaryConfigMapper baseMapper;
@ -69,7 +70,9 @@ public class PsSalaryConfigServiceImpl implements IPsSalaryConfigService {
public PsSalaryConfigInfoVo queryByTemplateCode(String templateCode){ public PsSalaryConfigInfoVo queryByTemplateCode(String templateCode){
List<PsSalaryConfig> list = baseMapper.selectList(Wrappers.<PsSalaryConfig>lambdaQuery().eq(PsSalaryConfig::getTemplateCode, templateCode).eq(PsSalaryConfig::getDelFlag, 0)); List<PsSalaryConfig> list = baseMapper.selectList(Wrappers.<PsSalaryConfig>lambdaQuery().eq(PsSalaryConfig::getTemplateCode, templateCode).eq(PsSalaryConfig::getDelFlag, 0));
PsSalaryConfigInfoVo vo = new PsSalaryConfigInfoVo(); PsSalaryConfigInfoVo vo = new PsSalaryConfigInfoVo();
Map<String,Map<String,String>> map = new HashMap<>(); //服务类型服务项目成本
// 提成比例
Map<String,Map<String,Map<String,String>>> map = new HashMap<>();
list.forEach(item->{ list.forEach(item->{
//服务类型 //服务类型
String serviceType = item.getServiceProject().split("_")[0]; String serviceType = item.getServiceProject().split("_")[0];
@ -78,14 +81,38 @@ public class PsSalaryConfigServiceImpl implements IPsSalaryConfigService {
//岗位id拼接 //岗位id拼接
vo.setPostId((StringUtils.isBlank(vo.getPostId())?"":vo.getPostId()+",")+item.getPostId()); vo.setPostId((StringUtils.isBlank(vo.getPostId())?"":vo.getPostId()+",")+item.getPostId());
//服务项目提成比例 //服务项目提成比例
Map<String, String> project = CollectionUtils.isNotEmpty(map.get(serviceType))?map.get(serviceType):new HashMap<>(); Map<String, Map<String,String>> project = CollectionUtils.isNotEmpty(map.get(serviceType))?map.get(serviceType):new HashMap<>();
project.put(item.getServiceProject(),item.getSalaryRatio().stripTrailingZeros().toString()); Map<String,String> data = new HashMap<>();
data.put("cost",item.getCost().stripTrailingZeros().toString());
data.put("salaryRatio",item.getSalaryRatio().stripTrailingZeros().toString());
project.put(item.getServiceProject(),data);
map.put(serviceType,project); map.put(serviceType,project);
}); });
vo.setServiceTypeMap(map);
vo.setTemplateCode(templateCode); vo.setTemplateCode(templateCode);
vo.setTemplateName(list.get(0).getTemplateName()); vo.setTemplateName(list.get(0).getTemplateName());
return vo; return vo;
} }
/**
* 新增或修改提成配置详情
*
* @param addVo 提成模板信息
*/
public void add(PsSalaryConfigAddVo addVo){
List<PsSalaryConfig> list = MapstructUtils.convert(addVo.getSalaryConfigVoList(), PsSalaryConfig.class);
String code = addVo.getTemplateCode() == null ? UUID.randomUUID().toString() : addVo.getTemplateCode();
list.forEach(item->{
item.setTemplateCode(code);
item.setTemplateName(addVo.getTemplateName());
item.setPostId(addVo.getPostId());
});
if(StringUtils.isNotBlank(addVo.getTemplateCode())){//修改
baseMapper.delete(Wrappers.<PsSalaryConfig>lambdaQuery().eq(PsSalaryConfig::getTemplateCode, code));
log.info("修改配置成功");
}
baseMapper.insertBatch(list);
}
// /** // /**
// * 查询提成配置 // * 查询提成配置
// * // *

View File

@ -41,15 +41,14 @@ public class PsSalaryServiceImpl implements IPsSalaryService {
@Override @Override
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.selectSalaryList(pageQuery.build(), lqw); Page<PsSalaryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result); return TableDataInfo.build(result);
} }
private LambdaQueryWrapper<PsSalary> buildQueryWrapper(PsSalaryBo bo) { private LambdaQueryWrapper<PsSalary> buildQueryWrapper(PsSalaryBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<PsSalary> lqw = Wrappers.lambdaQuery(); LambdaQueryWrapper<PsSalary> lqw = Wrappers.lambdaQuery();
// lqw.eq(bo.getUserId() != null, PsSalary::getUserId, bo.getUserId()); lqw.le(bo.getEndDate() != null,PsSalary::getSalaryDate,bo.getEndDate());
// lqw.eq(bo.getServiceProject() != null, PsSalary::getServiceProject, bo.getServiceProject()); lqw.ge(bo.getStartDate() != null,PsSalary::getSalaryDate,bo.getStartDate());
// lqw.eq(StringUtils.isNotBlank(bo.getSalaryRatio()), PsSalary::getSalaryRatio, bo.getSalaryRatio()); 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; return lqw;
} }

View File

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pusong.business.domain.PsCompanyInfo; import com.pusong.business.domain.PsCompanyInfo;
import com.pusong.business.domain.PsContractInfo;
import com.pusong.business.domain.PsTaskAppoint; import com.pusong.business.domain.PsTaskAppoint;
import com.pusong.business.domain.bo.AppointBo; import com.pusong.business.domain.bo.AppointBo;
import com.pusong.business.domain.bo.MediaCompanySaveBo; import com.pusong.business.domain.bo.MediaCompanySaveBo;
@ -18,6 +19,7 @@ import com.pusong.business.enums.TaskStatusEnum;
import com.pusong.business.enums.TaskStatusEnum.*; import com.pusong.business.enums.TaskStatusEnum.*;
import com.pusong.business.enums.TaskTypeEnum; import com.pusong.business.enums.TaskTypeEnum;
import com.pusong.business.mapper.PsContractBusinessMapper; import com.pusong.business.mapper.PsContractBusinessMapper;
import com.pusong.business.mapper.PsContractInfoMapper;
import com.pusong.business.mapper.PsTaskAppointMapper; import com.pusong.business.mapper.PsTaskAppointMapper;
import com.pusong.business.service.IPsCompanyInfoService; import com.pusong.business.service.IPsCompanyInfoService;
import com.pusong.business.service.IPsContractInfoService; import com.pusong.business.service.IPsContractInfoService;
@ -69,8 +71,8 @@ public class PsTaskServiceImpl implements IPsTaskService {
private final ISysOssService ossService; private final ISysOssService ossService;
@Resource @Resource
private ApproverContainer approverContainer; private ApproverContainer approverContainer;
@Autowired @Resource
private InfoEndpoint infoEndpoint; private PsContractInfoMapper contractInfoMapper;
/** /**
* 新增主任务 * 新增主任务
@ -113,6 +115,7 @@ public class PsTaskServiceImpl implements IPsTaskService {
public TableDataInfo<PsTaskMainVo> queryChildPageList(PsTaskQueryBo bo, PageQuery pageQuery){ public TableDataInfo<PsTaskMainVo> queryChildPageList(PsTaskQueryBo bo, PageQuery pageQuery){
QueryWrapper<PsTaskMain> lqw = buildQueryWrapper(bo); QueryWrapper<PsTaskMain> lqw = buildQueryWrapper(bo);
lqw.eq("appo.appoint_type",bo.getAppointType()); lqw.eq("appo.appoint_type",bo.getAppointType());
lqw.eq(bo.getId() != null,"appo.id",bo.getId());
Page<PsTaskMainVo> page = baseMapper.queryChildTaskPageList(pageQuery.build(), lqw); Page<PsTaskMainVo> page = baseMapper.queryChildTaskPageList(pageQuery.build(), lqw);
for (PsTaskMainVo vo : page.getRecords()) { for (PsTaskMainVo vo : page.getRecords()) {
if(vo.getStartDate() != null){ if(vo.getStartDate() != null){
@ -150,13 +153,24 @@ public class PsTaskServiceImpl implements IPsTaskService {
* @param id 任务主表主键 * @param id 任务主表主键
* @return 公司及资料信息 * @return 公司及资料信息
*/ */
public PsTaskMainVo queryInfo(Long id){ public PsTaskMainVo queryInfo(String id){
//查询任务信息 //查询任务信息
PsTaskMain mainTask = baseMapper.selectById(id); PsTaskMain mainTask = baseMapper.selectById(id);
Long customId ;
Long companyId ;
if(mainTask == null){
PsContractInfo con = contractInfoMapper.selectOne(Wrappers.<PsContractInfo>lambdaQuery().eq(PsContractInfo::getContractCode, id));
customId = con.getCustomId();
companyId = con.getCompanyId();
}else{
customId = mainTask.getCustomId();
companyId = mainTask.getCompanyId();
}
//查询公司信息 //查询公司信息
PsCompanyInfoVo companyInfoVo = companyInfoService.queryById(mainTask.getCompanyId()); PsCompanyInfoVo companyInfoVo = companyInfoService.queryById(companyId);
//查询资料信息 //查询资料信息
List<PsTaskMediaVo> list = mediaService.queryMediaList(mainTask.getCustomId(),mainTask.getCompanyId()); List<PsTaskMediaVo> list = mediaService.queryMediaList(customId,companyId);
PsTaskMainVo psTaskMainVo = new PsTaskMainVo(); PsTaskMainVo psTaskMainVo = new PsTaskMainVo();
psTaskMainVo.setCompanyInfoVo(companyInfoVo); psTaskMainVo.setCompanyInfoVo(companyInfoVo);
psTaskMainVo.setTaskMediaVoList(list); psTaskMainVo.setTaskMediaVoList(list);
@ -282,9 +296,8 @@ public class PsTaskServiceImpl implements IPsTaskService {
if(CollectionUtils.isNotEmpty(list)){ if(CollectionUtils.isNotEmpty(list)){
throw new ServiceException("操作失败,子任务未完成"); throw new ServiceException("操作失败,子任务未完成");
} }
ApproverService service = approverContainer.getService(ApproverTypeEnum.TASKFINISH.getCode()); main.setTaskStatus(TaskStatusEnum.FINISH.getCode());
service.apply(id+"",main.getContractCode(),null,null); baseMapper.updateById(main);
main.setTaskStatus(TaskStatusEnum.OA.getCode());
} }
/** /**
* 子任务完成 * 子任务完成
@ -300,7 +313,9 @@ public class PsTaskServiceImpl implements IPsTaskService {
if(!AppointStatusEnum.canFinish(appoint.getAppointStatus())){ if(!AppointStatusEnum.canFinish(appoint.getAppointStatus())){
throw new ServiceException("此任务无法执行此操作,请刷新页面后重新操作"); throw new ServiceException("此任务无法执行此操作,请刷新页面后重新操作");
} }
appoint.setAppointStatus(AppointStatusEnum.FINISH.getCode()); ApproverService service = approverContainer.getService(ApproverTypeEnum.TASKFINISH.getCode());
service.apply(id+"",appoint.getContractCode(),desc,appoint.getAppointType());
appoint.setAppointStatus(AppointStatusEnum.OA.getCode());
appoint.setTaskDesc(desc); appoint.setTaskDesc(desc);
appointMapper.updateById(appoint); appointMapper.updateById(appoint);
} }
@ -359,7 +374,11 @@ public class PsTaskServiceImpl implements IPsTaskService {
QueryWrapper<PsTaskMain> lqw = new QueryWrapper<PsTaskMain>(); QueryWrapper<PsTaskMain> lqw = new QueryWrapper<PsTaskMain>();
lqw.eq("main.del_flag","0"); lqw.eq("main.del_flag","0");
lqw.ne("main.task_status",TaskStatusEnum.CANCEL.getCode()); lqw.ne("main.task_status",TaskStatusEnum.CANCEL.getCode());
if(StringUtils.equals(bo.getType(),"1")){
lqw.in(StringUtils.isNotBlank(bo.getType()),"main.task_type",List.of("1","2"));
}else{
lqw.eq(StringUtils.isNotBlank(bo.getType()),"main.task_type",bo.getType()); lqw.eq(StringUtils.isNotBlank(bo.getType()),"main.task_type",bo.getType());
}
lqw.eq(bo.getId() != null,"main.id",bo.getId()); lqw.eq(bo.getId() != null,"main.id",bo.getId());
lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), "com.company_name", bo.getCompanyName());//公司地址 lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), "com.company_name", bo.getCompanyName());//公司地址
lqw.like(StringUtils.isNotBlank(bo.getCustomerNum()), "com.customer_num", bo.getCustomerNum());//纳税人识别号 lqw.like(StringUtils.isNotBlank(bo.getCustomerNum()), "com.customer_num", bo.getCustomerNum());//纳税人识别号
@ -390,6 +409,7 @@ public class PsTaskServiceImpl implements IPsTaskService {
} }
SysOssVo vo = ossService.upload(file); SysOssVo vo = ossService.upload(file);
info.setInvoice(vo.getOssId()+""); info.setInvoice(vo.getOssId()+"");
info.setTaskStatus(TaskStatusEnum.FINISH.getCode());
baseMapper.updateById(info); baseMapper.updateById(info);
} }
/** /**

View File

@ -15,6 +15,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
, cus.custom_name , cus.custom_name
, cus.custom_mobile , cus.custom_mobile
, info.roll_back_pdf , info.roll_back_pdf
, info.contract_amount
, (select GROUP_CONCAT(business.business_type SEPARATOR ',') , (select GROUP_CONCAT(business.business_type SEPARATOR ',')
from ps_contract_business business where business.contract_code = info.contract_code) as business_type_name from ps_contract_business business where business.contract_code = info.contract_code) as business_type_name
, info.contract_amount , info.contract_amount

View File

@ -33,7 +33,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectPageCustomerRecordList" resultType="com.pusong.business.domain.vo.PsCustomerRecordVo"> <select id="selectPageCustomerRecordList" resultType="com.pusong.business.domain.vo.PsCustomerRecordVo">
select select
custom.id, custom.id,
con.contractCode, custom.create_time,
custom.custom_status,
con.contract_code,
custom.custom_name, custom.custom_name,
custom.custom_mobile, custom.custom_mobile,
(select GROUP_CONCAT(business.business_type SEPARATOR ',') (select GROUP_CONCAT(business.business_type SEPARATOR ',')
@ -41,16 +43,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
task.start_date, task.start_date,
com.finance_account_no, com.finance_account_no,
custom.custom_manager, custom.custom_manager,
custom.company_adress, com.company_adress,
custom.company_name, com.company_name,
custom.customer_num, com.customer_num,
custom.customer_cert, com.customer_cert,
custom.legal_person_name, com.legal_person_name,
custom.legal_person_idcard, com.legal_person_idcard,
custom.legal_person_phone, com.legal_person_phone,
(select GROUP_CONCAT(appoint.executor SEPARATOR ',') (select GROUP_CONCAT(appoint.executor SEPARATOR ',')
from ps_task_appoint appoint where appoint.task_id = task.id) as executors, from ps_task_appoint appoint where appoint.task_id = task.id) as executors,
info.sign_desc con.sign_desc,
con.contract_amount,
con.finish_date,
(select par.approver_status from ps_approver_record par where par.contract_code = con.contract_code and business_type = 'free' limit 0,1) approver_status
from from
ps_custom_info custom ps_custom_info custom
left join left join

View File

@ -4,19 +4,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pusong.business.mapper.PsSalaryMapper"> <mapper namespace="com.pusong.business.mapper.PsSalaryMapper">
<select id="selectSalaryList" resultType="com.pusong.business.domain.vo.PsSalaryVo">
select
ps.user_id,
ps.salary_money ,
su.nick_name,
sp.post_name,
(select count(*) from ps_contract_info info where info.custom_manager = ps.user_id and info.contract_status != '10' and info.is_cancel != '03') all_contract,
(select count(*) from ps_contract_info inf where inf.custom_manager = ps.user_id and inf.contract_status == '50' and inf.is_cancel != '03') finish_contract,
(select count(*) from ps_contract_info pci where pci.custom_manager = ps.user_id and pci.contract_status not in ('10','50') and pci.is_cancel != '03') unfinish_contract
from ps_salary ps
left join sys_user su on su.user_id = ps.user_id
left join sys_post sp on ps.post_id = sp.post_id
${ew.getCustomSqlSegment}
</select>
</mapper> </mapper>

View File

@ -88,6 +88,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
appo.executor as executors, appo.executor as executors,
appo.appoint_status, appo.appoint_status,
appo.id, appo.id,
appo.task_desc,
(select GROUP_CONCAT(business.business_type SEPARATOR ',') (select GROUP_CONCAT(business.business_type SEPARATOR ',')
from ps_contract_business business where business.contract_code = con.contract_code) as business_type_name from ps_contract_business business where business.contract_code = con.contract_code) as business_type_name
from ps_task_appoint appo from ps_task_appoint appo