feat(crm): 添加合同管理功能模块

- 新增合同信息实体类、业务对象和视图对象
- 创建合同产品明细相关的实体、业务对象和视图对象
- 实现合同信息的增删改查和分页查询功能
- 实现合同产品明细的增删改查和分页查询功能
- 添加合同信息和产品明细的导出Excel功能
- 创建合同信息和产品明细的数据库映射配置
- 实现合同服务层业务逻辑和数据校验功能
- 配置合同相关控制器接口和请求映射关系
This commit is contained in:
2026-03-30 13:28:37 +08:00
parent d26bdb38ca
commit ca176de4ef
16 changed files with 1321 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
package com.klp.crm.service;
import com.klp.crm.domain.CrmContractProduct;
import com.klp.crm.domain.vo.CrmContractProductVo;
import com.klp.crm.domain.bo.CrmContractProductBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 合同产品明细Service接口
*
* @author klp
* @date 2026-03-30
*/
public interface ICrmContractProductService {
/**
* 查询合同产品明细
*/
CrmContractProductVo queryById(Long contractProductId);
/**
* 查询合同产品明细列表
*/
TableDataInfo<CrmContractProductVo> queryPageList(CrmContractProductBo bo, PageQuery pageQuery);
/**
* 查询合同产品明细列表
*/
List<CrmContractProductVo> queryList(CrmContractProductBo bo);
/**
* 新增合同产品明细
*/
Boolean insertByBo(CrmContractProductBo bo);
/**
* 修改合同产品明细
*/
Boolean updateByBo(CrmContractProductBo bo);
/**
* 校验并批量删除合同产品明细信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,49 @@
package com.klp.crm.service;
import com.klp.crm.domain.CrmContract;
import com.klp.crm.domain.vo.CrmContractVo;
import com.klp.crm.domain.bo.CrmContractBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 合同信息Service接口
*
* @author klp
* @date 2026-03-30
*/
public interface ICrmContractService {
/**
* 查询合同信息
*/
CrmContractVo queryById(Long contractId);
/**
* 查询合同信息列表
*/
TableDataInfo<CrmContractVo> queryPageList(CrmContractBo bo, PageQuery pageQuery);
/**
* 查询合同信息列表
*/
List<CrmContractVo> queryList(CrmContractBo bo);
/**
* 新增合同信息
*/
Boolean insertByBo(CrmContractBo bo);
/**
* 修改合同信息
*/
Boolean updateByBo(CrmContractBo bo);
/**
* 校验并批量删除合同信息信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,117 @@
package com.klp.crm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.crm.domain.bo.CrmContractProductBo;
import com.klp.crm.domain.vo.CrmContractProductVo;
import com.klp.crm.domain.CrmContractProduct;
import com.klp.crm.mapper.CrmContractProductMapper;
import com.klp.crm.service.ICrmContractProductService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 合同产品明细Service业务层处理
*
* @author klp
* @date 2026-03-30
*/
@RequiredArgsConstructor
@Service
public class CrmContractProductServiceImpl implements ICrmContractProductService {
private final CrmContractProductMapper baseMapper;
/**
* 查询合同产品明细
*/
@Override
public CrmContractProductVo queryById(Long contractProductId){
return baseMapper.selectVoById(contractProductId);
}
/**
* 查询合同产品明细列表
*/
@Override
public TableDataInfo<CrmContractProductVo> queryPageList(CrmContractProductBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CrmContractProduct> lqw = buildQueryWrapper(bo);
Page<CrmContractProductVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询合同产品明细列表
*/
@Override
public List<CrmContractProductVo> queryList(CrmContractProductBo bo) {
LambdaQueryWrapper<CrmContractProduct> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<CrmContractProduct> buildQueryWrapper(CrmContractProductBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<CrmContractProduct> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getContractId() != null, CrmContractProduct::getContractId, bo.getContractId());
lqw.like(StringUtils.isNotBlank(bo.getProductName()), CrmContractProduct::getProductName, bo.getProductName());
lqw.eq(bo.getSpecMin() != null, CrmContractProduct::getSpecMin, bo.getSpecMin());
lqw.eq(bo.getSpecMax() != null, CrmContractProduct::getSpecMax, bo.getSpecMax());
lqw.eq(StringUtils.isNotBlank(bo.getMaterial()), CrmContractProduct::getMaterial, bo.getMaterial());
lqw.eq(bo.getQuantity() != null, CrmContractProduct::getQuantity, bo.getQuantity());
lqw.eq(bo.getTaxInclusiveUnitPrice() != null, CrmContractProduct::getTaxInclusiveUnitPrice, bo.getTaxInclusiveUnitPrice());
lqw.eq(bo.getExTaxUnitPrice() != null, CrmContractProduct::getExTaxUnitPrice, bo.getExTaxUnitPrice());
lqw.eq(bo.getTaxInclusiveAmount() != null, CrmContractProduct::getTaxInclusiveAmount, bo.getTaxInclusiveAmount());
return lqw;
}
/**
* 新增合同产品明细
*/
@Override
public Boolean insertByBo(CrmContractProductBo bo) {
CrmContractProduct add = BeanUtil.toBean(bo, CrmContractProduct.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setContractProductId(add.getContractProductId());
}
return flag;
}
/**
* 修改合同产品明细
*/
@Override
public Boolean updateByBo(CrmContractProductBo bo) {
CrmContractProduct update = BeanUtil.toBean(bo, CrmContractProduct.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CrmContractProduct entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除合同产品明细
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,130 @@
package com.klp.crm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.crm.domain.bo.CrmContractBo;
import com.klp.crm.domain.vo.CrmContractVo;
import com.klp.crm.domain.CrmContract;
import com.klp.crm.mapper.CrmContractMapper;
import com.klp.crm.service.ICrmContractService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 合同信息Service业务层处理
*
* @author klp
* @date 2026-03-30
*/
@RequiredArgsConstructor
@Service
public class CrmContractServiceImpl implements ICrmContractService {
private final CrmContractMapper baseMapper;
/**
* 查询合同信息
*/
@Override
public CrmContractVo queryById(Long contractId){
return baseMapper.selectVoById(contractId);
}
/**
* 查询合同信息列表
*/
@Override
public TableDataInfo<CrmContractVo> queryPageList(CrmContractBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CrmContract> lqw = buildQueryWrapper(bo);
Page<CrmContractVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询合同信息列表
*/
@Override
public List<CrmContractVo> queryList(CrmContractBo bo) {
LambdaQueryWrapper<CrmContract> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<CrmContract> buildQueryWrapper(CrmContractBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<CrmContract> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getContractName()), CrmContract::getContractName, bo.getContractName());
lqw.eq(StringUtils.isNotBlank(bo.getContractNo()), CrmContract::getContractNo, bo.getContractNo());
lqw.eq(StringUtils.isNotBlank(bo.getSupplier()), CrmContract::getSupplier, bo.getSupplier());
lqw.eq(StringUtils.isNotBlank(bo.getCustomer()), CrmContract::getCustomer, bo.getCustomer());
lqw.eq(bo.getSignTime() != null, CrmContract::getSignTime, bo.getSignTime());
lqw.eq(StringUtils.isNotBlank(bo.getSignLocation()), CrmContract::getSignLocation, bo.getSignLocation());
lqw.eq(StringUtils.isNotBlank(bo.getProductContent()), CrmContract::getProductContent, bo.getProductContent());
lqw.eq(StringUtils.isNotBlank(bo.getContractContent()), CrmContract::getContractContent, bo.getContractContent());
lqw.eq(StringUtils.isNotBlank(bo.getSupplierAddress()), CrmContract::getSupplierAddress, bo.getSupplierAddress());
lqw.eq(StringUtils.isNotBlank(bo.getSupplierPhone()), CrmContract::getSupplierPhone, bo.getSupplierPhone());
lqw.eq(StringUtils.isNotBlank(bo.getSupplierBank()), CrmContract::getSupplierBank, bo.getSupplierBank());
lqw.eq(StringUtils.isNotBlank(bo.getSupplierAccount()), CrmContract::getSupplierAccount, bo.getSupplierAccount());
lqw.eq(StringUtils.isNotBlank(bo.getSupplierTaxNo()), CrmContract::getSupplierTaxNo, bo.getSupplierTaxNo());
lqw.eq(StringUtils.isNotBlank(bo.getCustomerAddress()), CrmContract::getCustomerAddress, bo.getCustomerAddress());
lqw.eq(StringUtils.isNotBlank(bo.getCustomerPhone()), CrmContract::getCustomerPhone, bo.getCustomerPhone());
lqw.eq(StringUtils.isNotBlank(bo.getCustomerBank()), CrmContract::getCustomerBank, bo.getCustomerBank());
lqw.eq(StringUtils.isNotBlank(bo.getCustomerAccount()), CrmContract::getCustomerAccount, bo.getCustomerAccount());
lqw.eq(StringUtils.isNotBlank(bo.getCustomerTaxNo()), CrmContract::getCustomerTaxNo, bo.getCustomerTaxNo());
lqw.eq(StringUtils.isNotBlank(bo.getTechAnnex()), CrmContract::getTechAnnex, bo.getTechAnnex());
lqw.eq(StringUtils.isNotBlank(bo.getBusinessAnnex()), CrmContract::getBusinessAnnex, bo.getBusinessAnnex());
lqw.eq(StringUtils.isNotBlank(bo.getProductionSchedule()), CrmContract::getProductionSchedule, bo.getProductionSchedule());
lqw.eq(bo.getStatus() != null, CrmContract::getStatus, bo.getStatus());
return lqw;
}
/**
* 新增合同信息
*/
@Override
public Boolean insertByBo(CrmContractBo bo) {
CrmContract add = BeanUtil.toBean(bo, CrmContract.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setContractId(add.getContractId());
}
return flag;
}
/**
* 修改合同信息
*/
@Override
public Boolean updateByBo(CrmContractBo bo) {
CrmContract update = BeanUtil.toBean(bo, CrmContract.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CrmContract entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除合同信息
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}