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,99 @@
package com.klp.crm.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.crm.domain.vo.CrmContractVo;
import com.klp.crm.domain.bo.CrmContractBo;
import com.klp.crm.service.ICrmContractService;
import com.klp.common.core.page.TableDataInfo;
/**
* 合同信息
*
* @author klp
* @date 2026-03-30
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/crm/contract")
public class CrmContractController extends BaseController {
private final ICrmContractService iCrmContractService;
/**
* 查询合同信息列表
*/
@GetMapping("/list")
public TableDataInfo<CrmContractVo> list(CrmContractBo bo, PageQuery pageQuery) {
return iCrmContractService.queryPageList(bo, pageQuery);
}
/**
* 导出合同信息列表
*/
@Log(title = "合同信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CrmContractBo bo, HttpServletResponse response) {
List<CrmContractVo> list = iCrmContractService.queryList(bo);
ExcelUtil.exportExcel(list, "合同信息", CrmContractVo.class, response);
}
/**
* 获取合同信息详细信息
*
* @param contractId 主键
*/
@GetMapping("/{contractId}")
public R<CrmContractVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long contractId) {
return R.ok(iCrmContractService.queryById(contractId));
}
/**
* 新增合同信息
*/
@Log(title = "合同信息", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CrmContractBo bo) {
return toAjax(iCrmContractService.insertByBo(bo));
}
/**
* 修改合同信息
*/
@Log(title = "合同信息", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CrmContractBo bo) {
return toAjax(iCrmContractService.updateByBo(bo));
}
/**
* 删除合同信息
*
* @param contractIds 主键串
*/
@Log(title = "合同信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{contractIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] contractIds) {
return toAjax(iCrmContractService.deleteWithValidByIds(Arrays.asList(contractIds), true));
}
}

View File

@@ -0,0 +1,99 @@
package com.klp.crm.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.crm.domain.vo.CrmContractProductVo;
import com.klp.crm.domain.bo.CrmContractProductBo;
import com.klp.crm.service.ICrmContractProductService;
import com.klp.common.core.page.TableDataInfo;
/**
* 合同产品明细
*
* @author klp
* @date 2026-03-30
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/crm/contractProduct")
public class CrmContractProductController extends BaseController {
private final ICrmContractProductService iCrmContractProductService;
/**
* 查询合同产品明细列表
*/
@GetMapping("/list")
public TableDataInfo<CrmContractProductVo> list(CrmContractProductBo bo, PageQuery pageQuery) {
return iCrmContractProductService.queryPageList(bo, pageQuery);
}
/**
* 导出合同产品明细列表
*/
@Log(title = "合同产品明细", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CrmContractProductBo bo, HttpServletResponse response) {
List<CrmContractProductVo> list = iCrmContractProductService.queryList(bo);
ExcelUtil.exportExcel(list, "合同产品明细", CrmContractProductVo.class, response);
}
/**
* 获取合同产品明细详细信息
*
* @param contractProductId 主键
*/
@GetMapping("/{contractProductId}")
public R<CrmContractProductVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long contractProductId) {
return R.ok(iCrmContractProductService.queryById(contractProductId));
}
/**
* 新增合同产品明细
*/
@Log(title = "合同产品明细", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CrmContractProductBo bo) {
return toAjax(iCrmContractProductService.insertByBo(bo));
}
/**
* 修改合同产品明细
*/
@Log(title = "合同产品明细", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CrmContractProductBo bo) {
return toAjax(iCrmContractProductService.updateByBo(bo));
}
/**
* 删除合同产品明细
*
* @param contractProductIds 主键串
*/
@Log(title = "合同产品明细", businessType = BusinessType.DELETE)
@DeleteMapping("/{contractProductIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] contractProductIds) {
return toAjax(iCrmContractProductService.deleteWithValidByIds(Arrays.asList(contractProductIds), true));
}
}

View File

@@ -0,0 +1,127 @@
package com.klp.crm.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 合同信息对象 crm_contract
*
* @author klp
* @date 2026-03-30
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("crm_contract")
public class CrmContract extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 合同主键ID
*/
@TableId(value = "contract_id")
private Long contractId;
/**
* 合同名称
*/
private String contractName;
/**
* 合同编号
*/
private String contractNo;
/**
* 供方
*/
private String supplier;
/**
* 需方
*/
private String customer;
/**
* 签订时间
*/
private Date signTime;
/**
* 签订地点
*/
private String signLocation;
/**
* 产品内容
*/
private String productContent;
/**
* 合同内容
*/
private String contractContent;
/**
* 供方地址
*/
private String supplierAddress;
/**
* 供方电话
*/
private String supplierPhone;
/**
* 供方开户行
*/
private String supplierBank;
/**
* 供方账号
*/
private String supplierAccount;
/**
* 供方税号
*/
private String supplierTaxNo;
/**
* 需方地址
*/
private String customerAddress;
/**
* 需方电话
*/
private String customerPhone;
/**
* 需方开户行
*/
private String customerBank;
/**
* 需方账号
*/
private String customerAccount;
/**
* 需方税号
*/
private String customerTaxNo;
/**
* 技术附件
*/
private String techAnnex;
/**
* 商务附件
*/
private String businessAnnex;
/**
* 排产函
*/
private String productionSchedule;
/**
* 合同状态 0=草稿 1=生效 2=作废 3=已完成
*/
private Long status;
/**
* 备注
*/
private String remark;
/**
* 删除标识 0正常 2删除
*/
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,74 @@
package com.klp.crm.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* 合同产品明细对象 crm_contract_product
*
* @author klp
* @date 2026-03-30
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("crm_contract_product")
public class CrmContractProduct extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 合同产品主键ID
*/
@TableId(value = "contract_product_id")
private Long contractProductId;
/**
* 关联合同ID绑定wms_contract表主键
*/
private Long contractId;
/**
* 产品名称
*/
private String productName;
/**
* 规格最小值(mm)
*/
private BigDecimal specMin;
/**
* 规格最大值(mm)
*/
private BigDecimal specMax;
/**
* 材质
*/
private String material;
/**
* 数量(吨)
*/
private BigDecimal quantity;
/**
* 含税单价(元/吨)
*/
private BigDecimal taxInclusiveUnitPrice;
/**
* 不含税单价(元/吨)
*/
private BigDecimal exTaxUnitPrice;
/**
* 含税总额(元)
*/
private BigDecimal taxInclusiveAmount;
/**
* 删除标识 0正常 2删除
*/
@TableLogic
private Long delFlag;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,143 @@
package com.klp.crm.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 合同信息业务对象 crm_contract
*
* @author klp
* @date 2026-03-30
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class CrmContractBo extends BaseEntity {
/**
* 合同主键ID
*/
private Long contractId;
/**
* 合同名称
*/
private String contractName;
/**
* 合同编号
*/
private String contractNo;
/**
* 供方
*/
private String supplier;
/**
* 需方
*/
private String customer;
/**
* 签订时间
*/
private Date signTime;
/**
* 签订地点
*/
private String signLocation;
/**
* 产品内容
*/
private String productContent;
/**
* 合同内容
*/
private String contractContent;
/**
* 供方地址
*/
private String supplierAddress;
/**
* 供方电话
*/
private String supplierPhone;
/**
* 供方开户行
*/
private String supplierBank;
/**
* 供方账号
*/
private String supplierAccount;
/**
* 供方税号
*/
private String supplierTaxNo;
/**
* 需方地址
*/
private String customerAddress;
/**
* 需方电话
*/
private String customerPhone;
/**
* 需方开户行
*/
private String customerBank;
/**
* 需方账号
*/
private String customerAccount;
/**
* 需方税号
*/
private String customerTaxNo;
/**
* 技术附件
*/
private String techAnnex;
/**
* 商务附件
*/
private String businessAnnex;
/**
* 排产函
*/
private String productionSchedule;
/**
* 合同状态 0=草稿 1=生效 2=作废 3=已完成
*/
private Long status;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,77 @@
package com.klp.crm.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.math.BigDecimal;
/**
* 合同产品明细业务对象 crm_contract_product
*
* @author klp
* @date 2026-03-30
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class CrmContractProductBo extends BaseEntity {
/**
* 合同产品主键ID
*/
private Long contractProductId;
/**
* 关联合同ID绑定wms_contract表主键
*/
private Long contractId;
/**
* 产品名称
*/
private String productName;
/**
* 规格最小值(mm)
*/
private BigDecimal specMin;
/**
* 规格最大值(mm)
*/
private BigDecimal specMax;
/**
* 材质
*/
private String material;
/**
* 数量(吨)
*/
private BigDecimal quantity;
/**
* 含税单价(元/吨)
*/
private BigDecimal taxInclusiveUnitPrice;
/**
* 不含税单价(元/吨)
*/
private BigDecimal exTaxUnitPrice;
/**
* 含税总额(元)
*/
private BigDecimal taxInclusiveAmount;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,91 @@
package com.klp.crm.domain.vo;
import java.math.BigDecimal;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 合同产品明细视图对象 crm_contract_product
*
* @author klp
* @date 2026-03-30
*/
@Data
@ExcelIgnoreUnannotated
public class CrmContractProductVo {
private static final long serialVersionUID = 1L;
/**
* 合同产品主键ID
*/
@ExcelProperty(value = "合同产品主键ID")
private Long contractProductId;
/**
* 关联合同ID绑定wms_contract表主键
*/
@ExcelProperty(value = "关联合同ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "绑=定wms_contract表主键")
private Long contractId;
/**
* 产品名称
*/
@ExcelProperty(value = "产品名称")
private String productName;
/**
* 规格最小值(mm)
*/
@ExcelProperty(value = "规格最小值(mm)")
private BigDecimal specMin;
/**
* 规格最大值(mm)
*/
@ExcelProperty(value = "规格最大值(mm)")
private BigDecimal specMax;
/**
* 材质
*/
@ExcelProperty(value = "材质")
private String material;
/**
* 数量(吨)
*/
@ExcelProperty(value = "数量(吨)")
private BigDecimal quantity;
/**
* 含税单价(元/吨)
*/
@ExcelProperty(value = "含税单价(元/吨)")
private BigDecimal taxInclusiveUnitPrice;
/**
* 不含税单价(元/吨)
*/
@ExcelProperty(value = "不含税单价(元/吨)")
private BigDecimal exTaxUnitPrice;
/**
* 含税总额(元)
*/
@ExcelProperty(value = "含税总额(元)")
private BigDecimal taxInclusiveAmount;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,169 @@
package com.klp.crm.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 合同信息视图对象 crm_contract
*
* @author klp
* @date 2026-03-30
*/
@Data
@ExcelIgnoreUnannotated
public class CrmContractVo {
private static final long serialVersionUID = 1L;
/**
* 合同主键ID
*/
@ExcelProperty(value = "合同主键ID")
private Long contractId;
/**
* 合同名称
*/
@ExcelProperty(value = "合同名称")
private String contractName;
/**
* 合同编号
*/
@ExcelProperty(value = "合同编号")
private String contractNo;
/**
* 供方
*/
@ExcelProperty(value = "供方")
private String supplier;
/**
* 需方
*/
@ExcelProperty(value = "需方")
private String customer;
/**
* 签订时间
*/
@ExcelProperty(value = "签订时间")
private Date signTime;
/**
* 签订地点
*/
@ExcelProperty(value = "签订地点")
private String signLocation;
/**
* 产品内容
*/
@ExcelProperty(value = "产品内容")
private String productContent;
/**
* 合同内容
*/
@ExcelProperty(value = "合同内容")
private String contractContent;
/**
* 供方地址
*/
@ExcelProperty(value = "供方地址")
private String supplierAddress;
/**
* 供方电话
*/
@ExcelProperty(value = "供方电话")
private String supplierPhone;
/**
* 供方开户行
*/
@ExcelProperty(value = "供方开户行")
private String supplierBank;
/**
* 供方账号
*/
@ExcelProperty(value = "供方账号")
private String supplierAccount;
/**
* 供方税号
*/
@ExcelProperty(value = "供方税号")
private String supplierTaxNo;
/**
* 需方地址
*/
@ExcelProperty(value = "需方地址")
private String customerAddress;
/**
* 需方电话
*/
@ExcelProperty(value = "需方电话")
private String customerPhone;
/**
* 需方开户行
*/
@ExcelProperty(value = "需方开户行")
private String customerBank;
/**
* 需方账号
*/
@ExcelProperty(value = "需方账号")
private String customerAccount;
/**
* 需方税号
*/
@ExcelProperty(value = "需方税号")
private String customerTaxNo;
/**
* 技术附件
*/
@ExcelProperty(value = "技术附件")
private String techAnnex;
/**
* 商务附件
*/
@ExcelProperty(value = "商务附件")
private String businessAnnex;
/**
* 排产函
*/
@ExcelProperty(value = "排产函")
private String productionSchedule;
/**
* 合同状态 0=草稿 1=生效 2=作废 3=已完成
*/
@ExcelProperty(value = "合同状态 0=草稿 1=生效 2=作废 3=已完成")
private Long status;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,15 @@
package com.klp.crm.mapper;
import com.klp.crm.domain.CrmContract;
import com.klp.crm.domain.vo.CrmContractVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 合同信息Mapper接口
*
* @author klp
* @date 2026-03-30
*/
public interface CrmContractMapper extends BaseMapperPlus<CrmContractMapper, CrmContract, CrmContractVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.crm.mapper;
import com.klp.crm.domain.CrmContractProduct;
import com.klp.crm.domain.vo.CrmContractProductVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 合同产品明细Mapper接口
*
* @author klp
* @date 2026-03-30
*/
public interface CrmContractProductMapper extends BaseMapperPlus<CrmContractProductMapper, CrmContractProduct, CrmContractProductVo> {
}

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;
}
}

View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.klp.crm.mapper.CrmContractMapper">
<resultMap type="com.klp.crm.domain.CrmContract" id="CrmContractResult">
<result property="contractId" column="contract_id"/>
<result property="contractName" column="contract_name"/>
<result property="contractNo" column="contract_no"/>
<result property="supplier" column="supplier"/>
<result property="customer" column="customer"/>
<result property="signTime" column="sign_time"/>
<result property="signLocation" column="sign_location"/>
<result property="productContent" column="product_content"/>
<result property="contractContent" column="contract_content"/>
<result property="supplierAddress" column="supplier_address"/>
<result property="supplierPhone" column="supplier_phone"/>
<result property="supplierBank" column="supplier_bank"/>
<result property="supplierAccount" column="supplier_account"/>
<result property="supplierTaxNo" column="supplier_tax_no"/>
<result property="customerAddress" column="customer_address"/>
<result property="customerPhone" column="customer_phone"/>
<result property="customerBank" column="customer_bank"/>
<result property="customerAccount" column="customer_account"/>
<result property="customerTaxNo" column="customer_tax_no"/>
<result property="techAnnex" column="tech_annex"/>
<result property="businessAnnex" column="business_annex"/>
<result property="productionSchedule" column="production_schedule"/>
<result property="status" column="status"/>
<result property="remark" column="remark"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
</mapper>

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.klp.crm.mapper.CrmContractProductMapper">
<resultMap type="com.klp.crm.domain.CrmContractProduct" id="CrmContractProductResult">
<result property="contractProductId" column="contract_product_id"/>
<result property="contractId" column="contract_id"/>
<result property="productName" column="product_name"/>
<result property="specMin" column="spec_min"/>
<result property="specMax" column="spec_max"/>
<result property="material" column="material"/>
<result property="quantity" column="quantity"/>
<result property="taxInclusiveUnitPrice" column="tax_inclusive_unit_price"/>
<result property="exTaxUnitPrice" column="ex_tax_unit_price"/>
<result property="taxInclusiveAmount" column="tax_inclusive_amount"/>
<result property="delFlag" column="del_flag"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="remark" column="remark"/>
</resultMap>
</mapper>