1. 回款相关

This commit is contained in:
zhaowenyuan 2024-06-17 16:26:56 +08:00
parent 8f4e2a7bf8
commit 1c23791f02
14 changed files with 404 additions and 67 deletions

View File

@ -23,14 +23,10 @@ import java.lang.annotation.*;
public @interface SysLog {
String value() default "";
/**
* 操作类型
*/
BusinessType businessType() default BusinessType.OTHER;
boolean export() default false;
/**
* 是否 入库
*/

View File

@ -19,7 +19,6 @@ import java.lang.reflect.Field;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class WrapperUtils {
@ -29,9 +28,11 @@ public class WrapperUtils {
if (null != columns) {
queryWrapper = queryWrapper.select(columns);
}
if (null != commonParam){
// 构造Wrapper
queryWrapper = queryWrapper
.orderBy(true, "asc".equals(commonParam.getIsAsc()), commonParam.getOrderBy());
}
if (query == null) {
return queryWrapper.lambda();
}

View File

@ -16,6 +16,10 @@ import java.time.LocalDateTime;
*/
@Data
public class ContractDTO {
/**
* 新增合同时
*/
private Long projectId;
/**
* 合同Id
*/

View File

@ -0,0 +1,41 @@
package com.chushang.inspection.project.entity.dto;
import com.chushang.common.core.validator.Create;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/**
* 回款
* @auther: zhao
* @date: 2024/6/17 15:30
*/
@Data
public class PaymentDTO {
/**
* 项目id
*/
@NotNull(message = "项目id不能为空", groups = {Create.class})
private Long projectId;
/**
* 合同Id
*/
@NotNull(message = "合同id不能为空", groups = {Create.class})
private Long contractId;
/**
* 回款金额
*/
@NotNull(message = "回款金额不能为空", groups = {Create.class})
private BigDecimal paymentAmount;
/**
* 回款备注
*/
private String remark;
/**
* 回款文件证明
*/
@NotNull(message = "回款证明文件不能为空", groups = {Create.class})
private String paymentReceipt;
}

View File

@ -1,14 +1,12 @@
package com.chushang.inspection.project.entity.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.chushang.common.core.validator.Create;
import com.chushang.common.core.validator.Update;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
/**
* @auther: zhao
@ -31,7 +29,7 @@ public class ProjectDTO {
* 项目合同
*/
@NotNull(message = "项目合同不能为空", groups = Create.class)
@NotNull(message = "项目合同不能为空", groups = Update.class)
@Null(message = "项目合同不能为空", groups = Update.class)
@Valid
private ContractDTO contract;

View File

@ -76,4 +76,11 @@ public class WrkProject extends BaseEntity {
@TableField(value = "update_by", fill = FieldFill.UPDATE)
@Condition(name = "update_by", type = Condition.ConditionType.eq)
private String updateBy;
/**
* 项目有效状态, 合同处于有效时, 项目就是有效
*/
@TableField(value = "project_effect")
@DictFormat(dictType = "project_effect")
private Integer projectEffect;
}

View File

@ -67,6 +67,11 @@ public class WrkProjectContract extends BaseEntity {
*/
@TableField(value = "contract_amount")
private BigDecimal contractAmount;
/**
* 项目已经 回款金额
*/
@TableField(value = "payment_amount")
private BigDecimal paymentAmount;
/**
* 审核状态 项目审核状态 待初审 待复审 初审驳回 复审驳回 初审通过=待复审 复审通过
@ -85,6 +90,8 @@ public class WrkProjectContract extends BaseEntity {
/**
* 回款状态 是否已经回款完成
* 0 未完成
* 1 已完成
*/
@TableField(value = "payment_state")
@DictFormat(dictType = "payment_state")

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.chushang.common.mybatis.base.BaseEntity;
import java.math.BigDecimal;
import java.time.LocalDate;
import lombok.AllArgsConstructor;
import lombok.Data;
@ -38,8 +39,8 @@ public class WrkProjectPayment extends BaseEntity {
/**
* 回款合同id
*/
@TableField(value = "contracty_id")
private Long contractyId;
@TableField(value = "contract_id")
private Long contractId;
/**
* 项目名称

View File

@ -1,15 +0,0 @@
package com.chushang.inspection.project.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @auther: zhao
* @date: 2024/6/15 11:22
*/
@Slf4j
@RestController
@RequestMapping(value = "/project/contract")
public class WrkProjectContractController {
}

View File

@ -1,6 +1,5 @@
package com.chushang.inspection.project.controller;
import cn.hutool.core.bean.BeanUtil;
import com.chushang.common.core.exception.utils.AssertUtil;
import com.chushang.common.core.validator.Create;
import com.chushang.common.core.validator.Update;
@ -9,13 +8,12 @@ import com.chushang.common.log.annotation.SysLog;
import com.chushang.common.log.enums.BusinessType;
import com.chushang.common.mybatis.page.CommonParam;
import com.chushang.common.mybatis.utils.PageResult;
import com.chushang.inspection.project.entity.dto.ContractDTO;
import com.chushang.inspection.project.entity.dto.ProjectDTO;
import com.chushang.inspection.project.entity.po.WrkProject;
import com.chushang.inspection.project.entity.po.WrkProjectContract;
import com.chushang.inspection.project.service.WrkProjectContractService;
import com.chushang.inspection.project.service.WrkProjectService;
import com.chushang.security.annotation.RequiresPermissions;
import com.chushang.security.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -32,8 +30,8 @@ public class WrkProjectController {
@Resource
WrkProjectService projectService;
@Resource
WrkProjectContractService contractService;
/**
* 获取项目列表
*/
@ -50,7 +48,7 @@ public class WrkProjectController {
* 新增项目 -- 暂存 + 提交审核
*/
@PostMapping(value = "/save")
// @RequiresPermissions("inspection:project:save")
@RequiresPermissions("inspection:project:save")
@SysLog(value = "项目",businessType = BusinessType.INSERT)
public AjaxResult save(@RequestBody @Validated(Create.class) ProjectDTO project){
return AjaxResult.success(projectService.save(project));
@ -60,7 +58,7 @@ public class WrkProjectController {
* 修改 项目
*/
@PostMapping(value = "/update")
// @RequiresPermissions("inspection:project:save")
@RequiresPermissions("inspection:project:save")
@SysLog(value = "项目",businessType = BusinessType.UPDATE)
public AjaxResult update(@RequestBody @Validated(Update.class) ProjectDTO project){
Long projectId = project.getProjectId();
@ -68,6 +66,66 @@ public class WrkProjectController {
return AjaxResult.success(projectService.update(project));
}
/**
* 删除项目
*/
@DeleteMapping(value = "/{projectId}")
@RequiresPermissions("inspection:project:del")
@SysLog(value = "项目",businessType = BusinessType.DELETE)
public AjaxResult delProject(@PathVariable Long projectId)
{
return AjaxResult.success(projectService.delete(projectId));
}
/**
* 合同新增
*/
@PostMapping(value = "/contract/save")
@SysLog(value = "合同", businessType = BusinessType.INSERT)
@RequiresPermissions("inspection:contract:save")
public AjaxResult save(@RequestBody @Validated(Create.class) ContractDTO contract)
{
Long projectId = contract.getProjectId();
AssertUtil.invalidate(null == projectId, "新增合同时, 项目id 不能为空");
return AjaxResult.success(projectService.saveContract(contract));
}
/**
* 修改 合同
*/
@PostMapping(value = "/contract/update")
@SysLog(value = "合同", businessType = BusinessType.UPDATE)
@RequiresPermissions("inspection:contract:update")
public AjaxResult update(@RequestBody @Validated(Update.class) ContractDTO contract){
Long contractId = contract.getContractId();
AssertUtil.invalidate(null == contractId, "修改合同时, 合同id 不能为空");
return AjaxResult.success(projectService.updateContract(contract));
}
/**
* 删除 合同
*/
@DeleteMapping(value = "/contract/{contractId}")
@RequiresPermissions("inspection:contract:del")
@SysLog(value = "合同", businessType = BusinessType.DELETE)
public AjaxResult del(@PathVariable Long contractId){
projectService.deleteContract(contractId);
return AjaxResult.success();
}
/**
* 获取 项目合同列表
* 根据 项目Id 获取
*/
@GetMapping(value = "/contract/list")
@RequiresPermissions("inspection:contract:list")
public AjaxResult list(Long projectId)
{
CommonParam commonParam = CommonParam.buildPageRequest();
return AjaxResult.success(contractService.pageList(projectId, commonParam));
}
// /**
//
// /**

View File

@ -1,10 +1,22 @@
package com.chushang.inspection.project.controller;
import com.chushang.common.core.validator.Create;
import com.chushang.common.core.web.AjaxResult;
import com.chushang.common.log.annotation.SysLog;
import com.chushang.common.log.enums.BusinessType;
import com.chushang.common.mybatis.page.CommonParam;
import com.chushang.inspection.project.entity.dto.PaymentDTO;
import com.chushang.inspection.project.service.WrkProjectPaymentService;
import com.chushang.security.annotation.RequiresPermissions;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.aspectj.weaver.loadtime.Aj;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* 回款
* @auther: zhao
* @date: 2024/6/15 11:22
*/
@ -12,4 +24,31 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/project/payment")
public class WrkProjectPaymentController {
@Resource
WrkProjectPaymentService paymentService;
@SysLog(value = "回款", businessType = BusinessType.INSERT)
@PostMapping(value = "/save")
@RequiresPermissions("project:payment:save")
public AjaxResult save(@RequestBody @Validated(Create.class)PaymentDTO payment){
return AjaxResult.success(paymentService.save(payment));
}
@GetMapping(value = "/list")
@RequiresPermissions("project:payment:list")
public AjaxResult list(PaymentDTO payment)
{
CommonParam commonParam = CommonParam.buildPageRequest();
return AjaxResult.success(paymentService.pageList(payment.getProjectId(), payment.getContractId(),commonParam));
}
@SysLog(value = "合同回款", businessType = BusinessType.DELETE)
@DeleteMapping(value = "/{paymentId}")
@RequiresPermissions("project:payment:del")
public AjaxResult del(@PathVariable Long paymentId){
paymentService.removeById(paymentId);
return AjaxResult.success();
}
}

View File

@ -1,11 +1,23 @@
package com.chushang.inspection.project.service;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.chushang.common.mybatis.page.CommonParam;
import com.chushang.common.mybatis.utils.PageResult;
import com.chushang.common.mybatis.utils.WrapperUtils;
import com.chushang.inspection.project.entity.dto.ContractDTO;
import com.chushang.inspection.project.entity.po.WrkProject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chushang.inspection.project.mapper.WrkProjectContractMapper;
import com.chushang.inspection.project.entity.po.WrkProjectContract;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
/**
* @auther: zhao
@ -14,5 +26,30 @@ import com.chushang.inspection.project.entity.po.WrkProjectContract;
@Slf4j
@Service
public class WrkProjectContractService extends ServiceImpl<WrkProjectContractMapper, WrkProjectContract> implements IService<WrkProjectContract> {
/**
* 删除合同
*/
@Transactional
public void delete(Long contractId) {
WrkProjectContract contract = getById(contractId);
Integer auditStatus = contract.getAuditStatus();
if (3 == auditStatus || 4 == auditStatus){
log.info("删除已经审核通过的项目");
}
removeById(contractId);
}
public PageResult pageList(Long projectId, CommonParam commonParam) {
WrkProjectContract contract = WrkProjectContract.builder().projectId(projectId).build();
return pageList(contract, commonParam);
}
public PageResult pageList(WrkProjectContract contract, CommonParam commonParam) {
LambdaQueryWrapper<WrkProjectContract> queryWrapper = WrapperUtils.builder(contract, contract, commonParam);
IPage<WrkProjectContract> page = this.page(
new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(commonParam.getPage(), commonParam.getLimit()),
queryWrapper
);
return new PageResult(page);
}
}

View File

@ -1,12 +1,31 @@
package com.chushang.inspection.project.service;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.chushang.common.core.exception.ResultException;
import com.chushang.common.core.exception.utils.AssertUtil;
import com.chushang.common.core.util.DateUtils;
import com.chushang.common.mybatis.enums.Operator;
import com.chushang.common.mybatis.page.CommonParam;
import com.chushang.common.mybatis.utils.PageResult;
import com.chushang.common.mybatis.utils.WrapperUtils;
import com.chushang.inspection.project.entity.dto.PaymentDTO;
import com.chushang.inspection.project.entity.po.WrkProject;
import com.chushang.inspection.project.entity.po.WrkProjectContract;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chushang.inspection.project.entity.po.WrkProjectPayment;
import com.chushang.inspection.project.mapper.WrkProjectPaymentMapper;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* @auther: zhao
* @date: 2024/6/15 10:51
@ -14,5 +33,86 @@ import com.chushang.inspection.project.mapper.WrkProjectPaymentMapper;
@Slf4j
@Service
public class WrkProjectPaymentService extends ServiceImpl<WrkProjectPaymentMapper, WrkProjectPayment> implements IService<WrkProjectPayment> {
@Resource
WrkProjectService projectService;
@Resource
WrkProjectContractService contractService;
public Long save(PaymentDTO payment)
{
WrkProjectPayment projectPayment = new WrkProjectPayment();
BeanUtil.copyProperties(payment, projectPayment);
Long projectId = payment.getProjectId();
Long contractId = payment.getContractId();
WrkProject project = new WrkProject();
project.setProjectId(projectId);
LambdaQueryWrapper<WrkProject> projectSql = WrapperUtils.builder(project, project, null)
.last(Operator.LIMIT_ONE.getCharacter());
project = projectService.getOne(projectSql);
AssertUtil.invalidate(null == project, "查询不到对应的项目");
WrkProjectContract projectContract = new WrkProjectContract();
projectContract.setProjectId(projectId);
projectContract.setContractId(contractId);
LambdaQueryWrapper<WrkProjectContract> contractSql = WrapperUtils.builder(projectContract, projectContract, null)
.last(Operator.LIMIT_ONE.getCharacter());
projectContract = contractService.getOne(contractSql);
AssertUtil.invalidate(null == projectContract, "查询不到对应的项目合同");
projectPayment.setProjectName(project.getProjectName());
projectPayment.setDeptId(project.getDeptId());
LocalDate now = LocalDate.now();
//
projectPayment.setPaymentDate(DateUtils.format(now));
//
projectPayment.setPaymentMonth(DateUtils.format(now, "yyyy-MM"));
// 合同金额
BigDecimal contractAmount = projectContract.getContractAmount();
// 已经回款的金额
BigDecimal countPaymentAmount = projectPayment.getPaymentAmount();
// 当前回款金额
BigDecimal paymentAmount = payment.getPaymentAmount();
// 待回款金额
BigDecimal subtract = contractAmount.subtract(countPaymentAmount);
int i = subtract.compareTo(paymentAmount);
// 说明已经回款完毕
if (i == 0){
// 总回款金额
projectPayment.setPaymentAmount(paymentAmount.add(countPaymentAmount));
// 修改 回款 金额完成
WrkProjectContract contract = new WrkProjectContract();
contract.setContractId(contractId);
contract.setPaymentState(1);
contractService.updateById(contract);
}
// 未回款完成
else if (i > 0){
projectPayment.setPaymentAmount(paymentAmount.add(countPaymentAmount));
}
// 回款超了
else {
throw new ResultException("回款金额已经大于合同金额");
}
save(projectPayment);
return projectPayment.getPaymentId();
}
public PageResult pageList(Long projectId, Long contractId, CommonParam commonParam)
{
WrkProjectPayment projectPayment = new WrkProjectPayment();
projectPayment.setPaymentId(projectId);
projectPayment.setContractId(contractId);
return pageList(projectPayment, commonParam);
}
public PageResult pageList(WrkProjectPayment projectPayment, CommonParam commonParam)
{
LambdaQueryWrapper<WrkProjectPayment> queryWrapper = WrapperUtils.builder(projectPayment, projectPayment, commonParam);
IPage<WrkProjectPayment> page = this.page(
new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(commonParam.getPage(), commonParam.getLimit()),
queryWrapper
);
return new PageResult(page);
}
}

View File

@ -8,8 +8,10 @@ import com.chushang.common.mybatis.page.CommonParam;
import com.chushang.common.mybatis.utils.PageResult;
import com.chushang.common.mybatis.utils.WrapperUtils;
import com.chushang.datascope.annotation.DataScope;
import com.chushang.inspection.project.entity.dto.ContractDTO;
import com.chushang.inspection.project.entity.dto.ProjectDTO;
import com.chushang.inspection.project.entity.po.WrkProjectContract;
import com.chushang.security.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -48,32 +50,28 @@ public class WrkProjectService extends ServiceImpl<WrkProjectMapper, WrkProject>
{
WrkProject wrkProject = new WrkProject();
BeanUtil.copyProperties(project, wrkProject);
// Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
Long deptId = 200L;
Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
// Long deptId = 200L;
wrkProject.setDeptId(deptId);
ContractDTO contract = project.getContract();
LocalDateTime now = LocalDateTime.now();
// 项目合同
if (now.isBefore(contract.getContractStartTime()) && now.isAfter(contract.getContractEndTime())) {
wrkProject.setProjectEffect(0);
}else {
wrkProject.setProjectEffect(1);
}
this.save(wrkProject);
// 项目合同
WrkProjectContract contract = WrkProjectContract.builder().build();
BeanUtil.copyProperties(project.getContract(), contract);
contract.setProjectId(wrkProject.getProjectId());
saveContract(contract);
LocalDateTime now = LocalDateTime.now();
// 之前 && 之后 无效
if (now.isBefore(contract.getContractStartTime()) && now.isAfter(contract.getContractEndTime())) {
contract.setProjectEffect(0);
}else {
contract.setProjectEffect(1);
}
// 未回款完成
contract.setPaymentState(0);
// 项目合同
contractService.save(contract);
return wrkProject.getProjectId();
}
/**
* 修改项目
* 修改项目 -- 不同时修改 合同
*/
@Transactional
public Long update(ProjectDTO project)
@ -82,19 +80,84 @@ public class WrkProjectService extends ServiceImpl<WrkProjectMapper, WrkProject>
BeanUtil.copyProperties(project, wrkProject);
this.updateById(wrkProject);
// 项目合同
WrkProjectContract contract = WrkProjectContract.builder().build();
BeanUtil.copyProperties(project.getContract(), contract);
LocalDateTime now = LocalDateTime.now();
// 之前 && 之后 无效
if (now.isBefore(contract.getContractStartTime()) && now.isAfter(contract.getContractEndTime())) {
contract.setProjectEffect(0);
}else {
contract.setProjectEffect(1);
}
// 未回款完成
contract.setPaymentState(0);
// WrkProjectContract contract = WrkProjectContract.builder().build();
// BeanUtil.copyProperties(project.getContract(), contract);
// LocalDateTime now = LocalDateTime.now();
// // 之前 && 之后 无效
// if (now.isBefore(contract.getContractStartTime()) && now.isAfter(contract.getContractEndTime())) {
// contract.setProjectEffect(0);
// }else {
// contract.setProjectEffect(1);
// }
// // 未回款完成
// contract.setPaymentState(0);
// 项目合同 修改时不需要 项目id
contractService.updateById(contract);
// contractService.updateById(contract);
return wrkProject.getProjectId();
}
public void updateState(Long projectId, Integer projectEffect)
{
WrkProject project = new WrkProject();
project.setProjectId(projectId);
project.setProjectEffect(projectEffect);
updateById(project);
}
@Transactional
public Long delete(Long projectId)
{
WrkProject project = getById(projectId);
if (null != project){
// 项目有效状态
Integer projectEffect = project.getProjectEffect();
if (1 == projectEffect){
log.info("删除了有效项目, 但是此处不管");
}
}
removeById(projectId);
return projectId;
}
@Transactional
public Long saveContract(ContractDTO contract) {
// 项目合同
WrkProjectContract projectContract = WrkProjectContract.builder().build();
BeanUtil.copyProperties(contract, projectContract);
projectContract.setProjectId(contract.getProjectId());
// 未回款完成
projectContract.setPaymentState(0);
LocalDateTime now = LocalDateTime.now();
boolean projectEffect = !now.isBefore(contract.getContractStartTime()) || !now.isAfter(contract.getContractEndTime());
// 之前 && 之后 无效
projectContract.setProjectEffect(projectEffect ? 1 : 0);
contractService.save(projectContract);
updateState(contract.getProjectId(), projectEffect ? 1 : 0 );
return projectContract.getContractId();
}
@Transactional
public Long updateContract(ContractDTO contract) {
// 项目合同
WrkProjectContract projectContract = WrkProjectContract.builder().build();
BeanUtil.copyProperties(contract, projectContract);
projectContract.setProjectId(null);
LocalDateTime now = LocalDateTime.now();
boolean projectEffect = !now.isBefore(contract.getContractStartTime()) || !now.isAfter(contract.getContractEndTime());
// 之前 && 之后 无效
projectContract.setProjectEffect(projectEffect ? 1 : 0);
// 未回款完成
projectContract.setPaymentState(0);
contractService.updateById(projectContract);
updateState(contract.getProjectId(), projectEffect ? 1 : 0 );
return projectContract.getContractId();
}
public void deleteContract(Long contractId) {
contractService.delete(contractId);
}
}