feat(crm): 初始化客户与订单模块基础代码

- 新增客户信息实体类及对应业务对象、控制器、服务实现
- 新增正式订单主表与明细表相关实体类和业务逻辑
- 新增订单操作追溯表结构定义
- 配置MyBatis映射文件及基础CRUD接口
- 实现客户与订单的分页查询、导出、新增、修改、删除功能
- 添加Excel导入导出支持及相关VO转换配置
This commit is contained in:
2025-12-15 16:11:16 +08:00
parent d809fc489d
commit e67bb0525b
51 changed files with 3409 additions and 1 deletions

View File

@@ -112,13 +112,17 @@
<groupId>com.klp</groupId>
<artifactId>klp-hrm</artifactId>
</dependency>
<dependency>
<groupId>com.klp</groupId>
<artifactId>klp-crm</artifactId>
</dependency>
<!-- 扫码枪模块-->
<dependency>
<groupId>com.klp</groupId>
<artifactId>klp-reader</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>

47
klp-crm/pom.xml Normal file
View File

@@ -0,0 +1,47 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.klp</groupId>
<artifactId>klp-oa</artifactId>
<version>0.8.3</version>
</parent>
<artifactId>klp-crm</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>3.5.9</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.klp</groupId>
<artifactId>klp-common</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.35</version>
</dependency>
<dependency>
<groupId>com.klp</groupId>
<artifactId>klp-wms</artifactId>
</dependency>
</dependencies>
</project>

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.CrmCustomerVo;
import com.klp.crm.domain.bo.CrmCustomerBo;
import com.klp.crm.service.ICrmCustomerService;
import com.klp.common.core.page.TableDataInfo;
/**
* 客户信息
*
* @author klp
* @date 2025-12-15
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/crm/customer")
public class CrmCustomerController extends BaseController {
private final ICrmCustomerService iCrmCustomerService;
/**
* 查询客户信息列表
*/
@GetMapping("/list")
public TableDataInfo<CrmCustomerVo> list(CrmCustomerBo bo, PageQuery pageQuery) {
return iCrmCustomerService.queryPageList(bo, pageQuery);
}
/**
* 导出客户信息列表
*/
@Log(title = "客户信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CrmCustomerBo bo, HttpServletResponse response) {
List<CrmCustomerVo> list = iCrmCustomerService.queryList(bo);
ExcelUtil.exportExcel(list, "客户信息", CrmCustomerVo.class, response);
}
/**
* 获取客户信息详细信息
*
* @param customerId 主键
*/
@GetMapping("/{customerId}")
public R<CrmCustomerVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable String customerId) {
return R.ok(iCrmCustomerService.queryById(customerId));
}
/**
* 新增客户信息
*/
@Log(title = "客户信息", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CrmCustomerBo bo) {
return toAjax(iCrmCustomerService.insertByBo(bo));
}
/**
* 修改客户信息
*/
@Log(title = "客户信息", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CrmCustomerBo bo) {
return toAjax(iCrmCustomerService.updateByBo(bo));
}
/**
* 删除客户信息
*
* @param customerIds 主键串
*/
@Log(title = "客户信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{customerIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] customerIds) {
return toAjax(iCrmCustomerService.deleteWithValidByIds(Arrays.asList(customerIds), 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.CrmOrderVo;
import com.klp.crm.domain.bo.CrmOrderBo;
import com.klp.crm.service.ICrmOrderService;
import com.klp.common.core.page.TableDataInfo;
/**
* 正式订单主
*
* @author klp
* @date 2025-12-15
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/crm/order")
public class CrmOrderController extends BaseController {
private final ICrmOrderService iCrmOrderService;
/**
* 查询正式订单主列表
*/
@GetMapping("/list")
public TableDataInfo<CrmOrderVo> list(CrmOrderBo bo, PageQuery pageQuery) {
return iCrmOrderService.queryPageList(bo, pageQuery);
}
/**
* 导出正式订单主列表
*/
@Log(title = "正式订单主", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CrmOrderBo bo, HttpServletResponse response) {
List<CrmOrderVo> list = iCrmOrderService.queryList(bo);
ExcelUtil.exportExcel(list, "正式订单主", CrmOrderVo.class, response);
}
/**
* 获取正式订单主详细信息
*
* @param orderId 主键
*/
@GetMapping("/{orderId}")
public R<CrmOrderVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable String orderId) {
return R.ok(iCrmOrderService.queryById(orderId));
}
/**
* 新增正式订单主
*/
@Log(title = "正式订单主", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CrmOrderBo bo) {
return toAjax(iCrmOrderService.insertByBo(bo));
}
/**
* 修改正式订单主
*/
@Log(title = "正式订单主", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CrmOrderBo bo) {
return toAjax(iCrmOrderService.updateByBo(bo));
}
/**
* 删除正式订单主
*
* @param orderIds 主键串
*/
@Log(title = "正式订单主", businessType = BusinessType.DELETE)
@DeleteMapping("/{orderIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] orderIds) {
return toAjax(iCrmOrderService.deleteWithValidByIds(Arrays.asList(orderIds), 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.CrmOrderItemVo;
import com.klp.crm.domain.bo.CrmOrderItemBo;
import com.klp.crm.service.ICrmOrderItemService;
import com.klp.common.core.page.TableDataInfo;
/**
* 正式订单明细
*
* @author klp
* @date 2025-12-15
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/crm/orderItem")
public class CrmOrderItemController extends BaseController {
private final ICrmOrderItemService iCrmOrderItemService;
/**
* 查询正式订单明细列表
*/
@GetMapping("/list")
public TableDataInfo<CrmOrderItemVo> list(CrmOrderItemBo bo, PageQuery pageQuery) {
return iCrmOrderItemService.queryPageList(bo, pageQuery);
}
/**
* 导出正式订单明细列表
*/
@Log(title = "正式订单明细", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CrmOrderItemBo bo, HttpServletResponse response) {
List<CrmOrderItemVo> list = iCrmOrderItemService.queryList(bo);
ExcelUtil.exportExcel(list, "正式订单明细", CrmOrderItemVo.class, response);
}
/**
* 获取正式订单明细详细信息
*
* @param itemId 主键
*/
@GetMapping("/{itemId}")
public R<CrmOrderItemVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable String itemId) {
return R.ok(iCrmOrderItemService.queryById(itemId));
}
/**
* 新增正式订单明细
*/
@Log(title = "正式订单明细", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CrmOrderItemBo bo) {
return toAjax(iCrmOrderItemService.insertByBo(bo));
}
/**
* 修改正式订单明细
*/
@Log(title = "正式订单明细", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CrmOrderItemBo bo) {
return toAjax(iCrmOrderItemService.updateByBo(bo));
}
/**
* 删除正式订单明细
*
* @param itemIds 主键串
*/
@Log(title = "正式订单明细", businessType = BusinessType.DELETE)
@DeleteMapping("/{itemIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] itemIds) {
return toAjax(iCrmOrderItemService.deleteWithValidByIds(Arrays.asList(itemIds), 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.CrmOrderOperationTraceVo;
import com.klp.crm.domain.bo.CrmOrderOperationTraceBo;
import com.klp.crm.service.ICrmOrderOperationTraceService;
import com.klp.common.core.page.TableDataInfo;
/**
* 订单操作追溯
*
* @author klp
* @date 2025-12-15
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/crm/orderOperationTrace")
public class CrmOrderOperationTraceController extends BaseController {
private final ICrmOrderOperationTraceService iCrmOrderOperationTraceService;
/**
* 查询订单操作追溯列表
*/
@GetMapping("/list")
public TableDataInfo<CrmOrderOperationTraceVo> list(CrmOrderOperationTraceBo bo, PageQuery pageQuery) {
return iCrmOrderOperationTraceService.queryPageList(bo, pageQuery);
}
/**
* 导出订单操作追溯列表
*/
@Log(title = "订单操作追溯", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CrmOrderOperationTraceBo bo, HttpServletResponse response) {
List<CrmOrderOperationTraceVo> list = iCrmOrderOperationTraceService.queryList(bo);
ExcelUtil.exportExcel(list, "订单操作追溯", CrmOrderOperationTraceVo.class, response);
}
/**
* 获取订单操作追溯详细信息
*
* @param traceId 主键
*/
@GetMapping("/{traceId}")
public R<CrmOrderOperationTraceVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable String traceId) {
return R.ok(iCrmOrderOperationTraceService.queryById(traceId));
}
/**
* 新增订单操作追溯
*/
@Log(title = "订单操作追溯", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CrmOrderOperationTraceBo bo) {
return toAjax(iCrmOrderOperationTraceService.insertByBo(bo));
}
/**
* 修改订单操作追溯
*/
@Log(title = "订单操作追溯", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CrmOrderOperationTraceBo bo) {
return toAjax(iCrmOrderOperationTraceService.updateByBo(bo));
}
/**
* 删除订单操作追溯
*
* @param traceIds 主键串
*/
@Log(title = "订单操作追溯", businessType = BusinessType.DELETE)
@DeleteMapping("/{traceIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] traceIds) {
return toAjax(iCrmOrderOperationTraceService.deleteWithValidByIds(Arrays.asList(traceIds), 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.CrmSalesContractVo;
import com.klp.crm.domain.bo.CrmSalesContractBo;
import com.klp.crm.service.ICrmSalesContractService;
import com.klp.common.core.page.TableDataInfo;
/**
* 销售合同
*
* @author klp
* @date 2025-12-15
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/crm/salesContract")
public class CrmSalesContractController extends BaseController {
private final ICrmSalesContractService iCrmSalesContractService;
/**
* 查询销售合同列表
*/
@GetMapping("/list")
public TableDataInfo<CrmSalesContractVo> list(CrmSalesContractBo bo, PageQuery pageQuery) {
return iCrmSalesContractService.queryPageList(bo, pageQuery);
}
/**
* 导出销售合同列表
*/
@Log(title = "销售合同", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CrmSalesContractBo bo, HttpServletResponse response) {
List<CrmSalesContractVo> list = iCrmSalesContractService.queryList(bo);
ExcelUtil.exportExcel(list, "销售合同", CrmSalesContractVo.class, response);
}
/**
* 获取销售合同详细信息
*
* @param contractId 主键
*/
@GetMapping("/{contractId}")
public R<CrmSalesContractVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable String contractId) {
return R.ok(iCrmSalesContractService.queryById(contractId));
}
/**
* 新增销售合同
*/
@Log(title = "销售合同", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CrmSalesContractBo bo) {
return toAjax(iCrmSalesContractService.insertByBo(bo));
}
/**
* 修改销售合同
*/
@Log(title = "销售合同", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CrmSalesContractBo bo) {
return toAjax(iCrmSalesContractService.updateByBo(bo));
}
/**
* 删除销售合同
*
* @param contractIds 主键串
*/
@Log(title = "销售合同", businessType = BusinessType.DELETE)
@DeleteMapping("/{contractIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] contractIds) {
return toAjax(iCrmSalesContractService.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.CrmSalesObjectionVo;
import com.klp.crm.domain.bo.CrmSalesObjectionBo;
import com.klp.crm.service.ICrmSalesObjectionService;
import com.klp.common.core.page.TableDataInfo;
/**
* 销售异议管理
*
* @author klp
* @date 2025-12-15
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/crm/salesObjection")
public class CrmSalesObjectionController extends BaseController {
private final ICrmSalesObjectionService iCrmSalesObjectionService;
/**
* 查询销售异议管理列表
*/
@GetMapping("/list")
public TableDataInfo<CrmSalesObjectionVo> list(CrmSalesObjectionBo bo, PageQuery pageQuery) {
return iCrmSalesObjectionService.queryPageList(bo, pageQuery);
}
/**
* 导出销售异议管理列表
*/
@Log(title = "销售异议管理", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CrmSalesObjectionBo bo, HttpServletResponse response) {
List<CrmSalesObjectionVo> list = iCrmSalesObjectionService.queryList(bo);
ExcelUtil.exportExcel(list, "销售异议管理", CrmSalesObjectionVo.class, response);
}
/**
* 获取销售异议管理详细信息
*
* @param objectionId 主键
*/
@GetMapping("/{objectionId}")
public R<CrmSalesObjectionVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable String objectionId) {
return R.ok(iCrmSalesObjectionService.queryById(objectionId));
}
/**
* 新增销售异议管理
*/
@Log(title = "销售异议管理", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CrmSalesObjectionBo bo) {
return toAjax(iCrmSalesObjectionService.insertByBo(bo));
}
/**
* 修改销售异议管理
*/
@Log(title = "销售异议管理", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CrmSalesObjectionBo bo) {
return toAjax(iCrmSalesObjectionService.updateByBo(bo));
}
/**
* 删除销售异议管理
*
* @param objectionIds 主键串
*/
@Log(title = "销售异议管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{objectionIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] objectionIds) {
return toAjax(iCrmSalesObjectionService.deleteWithValidByIds(Arrays.asList(objectionIds), true));
}
}

View File

@@ -0,0 +1,69 @@
package com.klp.crm.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 客户信息对象 crm_customer
*
* @author klp
* @date 2025-12-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("crm_customer")
public class CrmCustomer extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 客户ID主键
*/
@TableId(value = "customer_id")
private String customerId;
/**
* 客户统一编码
*/
private String customerCode;
/**
* 公司名称
*/
private String companyName;
/**
* 联系人
*/
private String contactPerson;
/**
* 联系方式(电话/微信等)
*/
private String contactWay;
/**
* 所属行业
*/
private String industry;
/**
* 客户等级VIP/普通)
*/
private String customerLevel;
/**
* 客户地址(需权限查看)
*/
private String address;
/**
* 银行信息多条需权限查看JSON格式存储
*/
private String bankInfo;
/**
* 备注
*/
private String remark;
/**
* 删除标识 0正常 2删除
*/
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,87 @@
package com.klp.crm.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 正式订单主对象 crm_order
*
* @author klp
* @date 2025-12-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("crm_order")
public class CrmOrder extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 订单ID主键
*/
@TableId(value = "order_id")
private String orderId;
/**
* 订单编号
*/
private String orderCode;
/**
* 订单类型pre-预订单formal-正式订单
*/
private Long orderType;
/**
* 关联客户ID
*/
private String customerId;
/**
* 订单总金额
*/
private BigDecimal orderAmount;
/**
* 销售员
*/
private String salesman;
/**
* 交货日期
*/
private Date deliveryDate;
/**
* 预订单状态
*/
private Long preOrderStatus;
/**
* 审核人
*/
private String auditUser;
/**
* 审核时间
*/
private Date auditTime;
/**
* 订单状态
*/
private Long orderStatus;
/**
* 财务状态
*/
private Long financeStatus;
/**
* 未结款数额
*/
private BigDecimal unpaidAmount;
/**
* 备注
*/
private String remark;
/**
* 删除标识 0正常 2删除
*/
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,61 @@
package com.klp.crm.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* 正式订单明细对象 crm_order_item
*
* @author klp
* @date 2025-12-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("crm_order_item")
public class CrmOrderItem extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 正式订单明细ID主键
*/
@TableId(value = "item_id")
private String itemId;
/**
* 关联正式订单ID外键
*/
private String orderId;
/**
* 产品类型
*/
private String productType;
/**
* 规格要求
*/
private String specRequire;
/**
* 产品数量
*/
private Long productNum;
/**
* 特殊要求
*/
private String specialRequire;
/**
* 明细金额(单商品金额)
*/
private BigDecimal itemAmount;
/**
* 备注
*/
private String remark;
/**
* 删除标识 0正常 2删除
*/
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,66 @@
package com.klp.crm.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 订单操作追溯对象 crm_order_operation_trace
*
* @author klp
* @date 2025-12-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("crm_order_operation_trace")
public class CrmOrderOperationTrace extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 追溯ID主键
*/
@TableId(value = "trace_id")
private String traceId;
/**
* 关联订单ID外键
*/
private String orderId;
/**
* 操作类型(如:创建/修改/审核/取消/发货等)
*/
private String operationType;
/**
* 操作前状态
*/
private String oldStatus;
/**
* 操作后状态
*/
private String newStatus;
/**
* 操作内容(如:修改了交货日期)
*/
private String operationContent;
/**
* 操作人
*/
private String operator;
/**
* 操作时间
*/
private Date operationTime;
/**
* 备注
*/
private String remark;
/**
* 删除标识 0正常 2删除
*/
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,91 @@
package com.klp.crm.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 销售合同对象 crm_sales_contract
*
* @author klp
* @date 2025-12-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("crm_sales_contract")
public class CrmSalesContract extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 合同ID主键
*/
@TableId(value = "contract_id")
private String contractId;
/**
* 合同编号
*/
private String contractCode;
/**
* 合同类型
*/
private Long contractType;
/**
* 关联客户ID外键
*/
private String customerId;
/**
* 合同总金额
*/
private BigDecimal totalAmount;
/**
* 交货日期
*/
private Date deliveryDate;
/**
* 合同状态
*/
private Long contractStatus;
/**
* 录入人
*/
private String createUser;
/**
* 评审人
*/
private String reviewUser;
/**
* 评审时间
*/
private Date reviewTime;
/**
* 审核人
*/
private String auditUser;
/**
* 审核时间
*/
private Date auditTime;
/**
* 下发人
*/
private String issueUser;
/**
* 下发时间
*/
private Date issueTime;
/**
* 备注
*/
private String remark;
/**
* 删除标识 0正常 2删除
*/
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,78 @@
package com.klp.crm.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 销售异议管理对象 crm_sales_objection
*
* @author klp
* @date 2025-12-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("crm_sales_objection")
public class CrmSalesObjection extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 异议ID主键
*/
@TableId(value = "objection_id")
private String objectionId;
/**
* 异议编号
*/
private String objectionCode;
/**
* 关联订单ID外键
*/
private String orderId;
/**
* 关联客户ID外键
*/
private String customerId;
/**
* 异议类型(如:质量异议)
*/
private String objectionType;
/**
* 异议内容
*/
private String objectionContent;
/**
* 异议状态
*/
private Long objectionStatus;
/**
* 处理内容
*/
private String handleContent;
/**
* 处理人
*/
private String handleUser;
/**
* 处理时间
*/
private Date handleTime;
/**
* 结案时间
*/
private Date closeTime;
/**
* 备注
*/
private String remark;
/**
* 删除标识 0正常 2删除
*/
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,71 @@
package com.klp.crm.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
/**
* 客户信息业务对象 crm_customer
*
* @author klp
* @date 2025-12-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class CrmCustomerBo extends BaseEntity {
/**
* 客户ID主键
*/
private String customerId;
/**
* 客户统一编码
*/
private String customerCode;
/**
* 公司名称
*/
private String companyName;
/**
* 联系人
*/
private String contactPerson;
/**
* 联系方式(电话/微信等)
*/
private String contactWay;
/**
* 所属行业
*/
private String industry;
/**
* 客户等级VIP/普通)
*/
private String customerLevel;
/**
* 客户地址(需权限查看)
*/
private String address;
/**
* 银行信息多条需权限查看JSON格式存储
*/
private String bankInfo;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,94 @@
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;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 正式订单主业务对象 crm_order
*
* @author klp
* @date 2025-12-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class CrmOrderBo extends BaseEntity {
/**
* 订单ID主键
*/
private String orderId;
/**
* 订单编号
*/
private String orderCode;
/**
* 订单类型pre-预订单formal-正式订单
*/
private Long orderType;
/**
* 关联客户ID
*/
private String customerId;
/**
* 订单总金额
*/
private BigDecimal orderAmount;
/**
* 销售员
*/
private String salesman;
/**
* 交货日期
*/
private Date deliveryDate;
/**
* 预订单状态
*/
private Long preOrderStatus;
/**
* 审核人
*/
private String auditUser;
/**
* 审核时间
*/
private Date auditTime;
/**
* 订单状态
*/
private Long orderStatus;
/**
* 财务状态
*/
private Long financeStatus;
/**
* 未结款数额
*/
private BigDecimal unpaidAmount;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,62 @@
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_order_item
*
* @author klp
* @date 2025-12-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class CrmOrderItemBo extends BaseEntity {
/**
* 正式订单明细ID主键
*/
private String itemId;
/**
* 关联正式订单ID外键
*/
private String orderId;
/**
* 产品类型
*/
private String productType;
/**
* 规格要求
*/
private String specRequire;
/**
* 产品数量
*/
private Long productNum;
/**
* 特殊要求
*/
private String specialRequire;
/**
* 明细金额(单商品金额)
*/
private BigDecimal itemAmount;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,68 @@
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_order_operation_trace
*
* @author klp
* @date 2025-12-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class CrmOrderOperationTraceBo extends BaseEntity {
/**
* 追溯ID主键
*/
private String traceId;
/**
* 关联订单ID外键
*/
private String orderId;
/**
* 操作类型(如:创建/修改/审核/取消/发货等)
*/
private String operationType;
/**
* 操作前状态
*/
private String oldStatus;
/**
* 操作后状态
*/
private String newStatus;
/**
* 操作内容(如:修改了交货日期)
*/
private String operationContent;
/**
* 操作人
*/
private String operator;
/**
* 操作时间
*/
private Date operationTime;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,99 @@
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;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 销售合同业务对象 crm_sales_contract
*
* @author klp
* @date 2025-12-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class CrmSalesContractBo extends BaseEntity {
/**
* 合同ID主键
*/
private String contractId;
/**
* 合同编号
*/
private String contractCode;
/**
* 合同类型
*/
private Long contractType;
/**
* 关联客户ID外键
*/
private String customerId;
/**
* 合同总金额
*/
private BigDecimal totalAmount;
/**
* 交货日期
*/
private Date deliveryDate;
/**
* 合同状态
*/
private Long contractStatus;
/**
* 录入人
*/
private String createUser;
/**
* 评审人
*/
private String reviewUser;
/**
* 评审时间
*/
private Date reviewTime;
/**
* 审核人
*/
private String auditUser;
/**
* 审核时间
*/
private Date auditTime;
/**
* 下发人
*/
private String issueUser;
/**
* 下发时间
*/
private Date issueTime;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,83 @@
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_sales_objection
*
* @author klp
* @date 2025-12-15
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class CrmSalesObjectionBo extends BaseEntity {
/**
* 异议ID主键
*/
private String objectionId;
/**
* 异议编号
*/
private String objectionCode;
/**
* 关联订单ID外键
*/
private String orderId;
/**
* 关联客户ID外键
*/
private String customerId;
/**
* 异议类型(如:质量异议)
*/
private String objectionType;
/**
* 异议内容
*/
private String objectionContent;
/**
* 异议状态
*/
private Long objectionStatus;
/**
* 处理内容
*/
private String handleContent;
/**
* 处理人
*/
private String handleUser;
/**
* 处理时间
*/
private Date handleTime;
/**
* 结案时间
*/
private Date closeTime;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,88 @@
package com.klp.crm.domain.vo;
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_customer
*
* @author klp
* @date 2025-12-15
*/
@Data
@ExcelIgnoreUnannotated
public class CrmCustomerVo {
private static final long serialVersionUID = 1L;
/**
* 客户ID主键
*/
@ExcelProperty(value = "客户ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "主=键")
private String customerId;
/**
* 客户统一编码
*/
@ExcelProperty(value = "客户统一编码")
private String customerCode;
/**
* 公司名称
*/
@ExcelProperty(value = "公司名称")
private String companyName;
/**
* 联系人
*/
@ExcelProperty(value = "联系人")
private String contactPerson;
/**
* 联系方式(电话/微信等)
*/
@ExcelProperty(value = "联系方式", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "电=话/微信等")
private String contactWay;
/**
* 所属行业
*/
@ExcelProperty(value = "所属行业")
private String industry;
/**
* 客户等级VIP/普通)
*/
@ExcelProperty(value = "客户等级", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "如=VIP/普通")
private String customerLevel;
/**
* 客户地址(需权限查看)
*/
@ExcelProperty(value = "客户地址", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "需=权限查看")
private String address;
/**
* 银行信息多条需权限查看JSON格式存储
*/
@ExcelProperty(value = "银行信息", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "多=条需权限查看JSON格式存储")
private String bankInfo;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,75 @@
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_order_item
*
* @author klp
* @date 2025-12-15
*/
@Data
@ExcelIgnoreUnannotated
public class CrmOrderItemVo {
private static final long serialVersionUID = 1L;
/**
* 正式订单明细ID主键
*/
@ExcelProperty(value = "正式订单明细ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "主=键")
private String itemId;
/**
* 关联正式订单ID外键
*/
@ExcelProperty(value = "关联正式订单ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "外=键")
private String orderId;
/**
* 产品类型
*/
@ExcelProperty(value = "产品类型")
private String productType;
/**
* 规格要求
*/
@ExcelProperty(value = "规格要求")
private String specRequire;
/**
* 产品数量
*/
@ExcelProperty(value = "产品数量")
private Long productNum;
/**
* 特殊要求
*/
@ExcelProperty(value = "特殊要求")
private String specialRequire;
/**
* 明细金额(单商品金额)
*/
@ExcelProperty(value = "明细金额", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "单=商品金额")
private BigDecimal itemAmount;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,83 @@
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_order_operation_trace
*
* @author klp
* @date 2025-12-15
*/
@Data
@ExcelIgnoreUnannotated
public class CrmOrderOperationTraceVo {
private static final long serialVersionUID = 1L;
/**
* 追溯ID主键
*/
@ExcelProperty(value = "追溯ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "主=键")
private String traceId;
/**
* 关联订单ID外键
*/
@ExcelProperty(value = "关联订单ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "外=键")
private String orderId;
/**
* 操作类型(如:创建/修改/审核/取消/发货等)
*/
@ExcelProperty(value = "操作类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "如=:创建/修改/审核/取消/发货等")
private String operationType;
/**
* 操作前状态
*/
@ExcelProperty(value = "操作前状态")
private String oldStatus;
/**
* 操作后状态
*/
@ExcelProperty(value = "操作后状态")
private String newStatus;
/**
* 操作内容(如:修改了交货日期)
*/
@ExcelProperty(value = "操作内容", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "如=:修改了交货日期")
private String operationContent;
/**
* 操作人
*/
@ExcelProperty(value = "操作人")
private String operator;
/**
* 操作时间
*/
@ExcelProperty(value = "操作时间")
private Date operationTime;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,111 @@
package com.klp.crm.domain.vo;
import java.math.BigDecimal;
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_order
*
* @author klp
* @date 2025-12-15
*/
@Data
@ExcelIgnoreUnannotated
public class CrmOrderVo {
private static final long serialVersionUID = 1L;
/**
* 订单ID主键
*/
@ExcelProperty(value = "订单ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "主=键")
private String orderId;
/**
* 订单编号
*/
@ExcelProperty(value = "订单编号")
private String orderCode;
/**
* 订单类型pre-预订单formal-正式订单
*/
@ExcelProperty(value = "订单类型pre-预订单formal-正式订单")
private Long orderType;
/**
* 关联客户ID
*/
@ExcelProperty(value = "关联客户ID")
private String customerId;
/**
* 订单总金额
*/
@ExcelProperty(value = "订单总金额")
private BigDecimal orderAmount;
/**
* 销售员
*/
@ExcelProperty(value = "销售员")
private String salesman;
/**
* 交货日期
*/
@ExcelProperty(value = "交货日期")
private Date deliveryDate;
/**
* 预订单状态
*/
@ExcelProperty(value = "预订单状态")
private Long preOrderStatus;
/**
* 审核人
*/
@ExcelProperty(value = "审核人")
private String auditUser;
/**
* 审核时间
*/
@ExcelProperty(value = "审核时间")
private Date auditTime;
/**
* 订单状态
*/
@ExcelProperty(value = "订单状态")
private Long orderStatus;
/**
* 财务状态
*/
@ExcelProperty(value = "财务状态")
private Long financeStatus;
/**
* 未结款数额
*/
@ExcelProperty(value = "未结款数额")
private BigDecimal unpaidAmount;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,118 @@
package com.klp.crm.domain.vo;
import java.math.BigDecimal;
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_sales_contract
*
* @author klp
* @date 2025-12-15
*/
@Data
@ExcelIgnoreUnannotated
public class CrmSalesContractVo {
private static final long serialVersionUID = 1L;
/**
* 合同ID主键
*/
@ExcelProperty(value = "合同ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "主=键")
private String contractId;
/**
* 合同编号
*/
@ExcelProperty(value = "合同编号")
private String contractCode;
/**
* 合同类型
*/
@ExcelProperty(value = "合同类型")
private Long contractType;
/**
* 关联客户ID外键
*/
@ExcelProperty(value = "关联客户ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "外=键")
private String customerId;
/**
* 合同总金额
*/
@ExcelProperty(value = "合同总金额")
private BigDecimal totalAmount;
/**
* 交货日期
*/
@ExcelProperty(value = "交货日期")
private Date deliveryDate;
/**
* 合同状态
*/
@ExcelProperty(value = "合同状态")
private Long contractStatus;
/**
* 录入人
*/
@ExcelProperty(value = "录入人")
private String createUser;
/**
* 评审人
*/
@ExcelProperty(value = "评审人")
private String reviewUser;
/**
* 评审时间
*/
@ExcelProperty(value = "评审时间")
private Date reviewTime;
/**
* 审核人
*/
@ExcelProperty(value = "审核人")
private String auditUser;
/**
* 审核时间
*/
@ExcelProperty(value = "审核时间")
private Date auditTime;
/**
* 下发人
*/
@ExcelProperty(value = "下发人")
private String issueUser;
/**
* 下发时间
*/
@ExcelProperty(value = "下发时间")
private Date issueTime;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,101 @@
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_sales_objection
*
* @author klp
* @date 2025-12-15
*/
@Data
@ExcelIgnoreUnannotated
public class CrmSalesObjectionVo {
private static final long serialVersionUID = 1L;
/**
* 异议ID主键
*/
@ExcelProperty(value = "异议ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "主=键")
private String objectionId;
/**
* 异议编号
*/
@ExcelProperty(value = "异议编号")
private String objectionCode;
/**
* 关联订单ID外键
*/
@ExcelProperty(value = "关联订单ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "外=键")
private String orderId;
/**
* 关联客户ID外键
*/
@ExcelProperty(value = "关联客户ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "外=键")
private String customerId;
/**
* 异议类型(如:质量异议)
*/
@ExcelProperty(value = "异议类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "如=:质量异议")
private String objectionType;
/**
* 异议内容
*/
@ExcelProperty(value = "异议内容")
private String objectionContent;
/**
* 异议状态
*/
@ExcelProperty(value = "异议状态")
private Long objectionStatus;
/**
* 处理内容
*/
@ExcelProperty(value = "处理内容")
private String handleContent;
/**
* 处理人
*/
@ExcelProperty(value = "处理人")
private String handleUser;
/**
* 处理时间
*/
@ExcelProperty(value = "处理时间")
private Date handleTime;
/**
* 结案时间
*/
@ExcelProperty(value = "结案时间")
private Date closeTime;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,15 @@
package com.klp.crm.mapper;
import com.klp.crm.domain.CrmCustomer;
import com.klp.crm.domain.vo.CrmCustomerVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 客户信息Mapper接口
*
* @author klp
* @date 2025-12-15
*/
public interface CrmCustomerMapper extends BaseMapperPlus<CrmCustomerMapper, CrmCustomer, CrmCustomerVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.crm.mapper;
import com.klp.crm.domain.CrmOrderItem;
import com.klp.crm.domain.vo.CrmOrderItemVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 正式订单明细Mapper接口
*
* @author klp
* @date 2025-12-15
*/
public interface CrmOrderItemMapper extends BaseMapperPlus<CrmOrderItemMapper, CrmOrderItem, CrmOrderItemVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.crm.mapper;
import com.klp.crm.domain.CrmOrder;
import com.klp.crm.domain.vo.CrmOrderVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 正式订单主Mapper接口
*
* @author klp
* @date 2025-12-15
*/
public interface CrmOrderMapper extends BaseMapperPlus<CrmOrderMapper, CrmOrder, CrmOrderVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.crm.mapper;
import com.klp.crm.domain.CrmOrderOperationTrace;
import com.klp.crm.domain.vo.CrmOrderOperationTraceVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 订单操作追溯Mapper接口
*
* @author klp
* @date 2025-12-15
*/
public interface CrmOrderOperationTraceMapper extends BaseMapperPlus<CrmOrderOperationTraceMapper, CrmOrderOperationTrace, CrmOrderOperationTraceVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.crm.mapper;
import com.klp.crm.domain.CrmSalesContract;
import com.klp.crm.domain.vo.CrmSalesContractVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 销售合同Mapper接口
*
* @author klp
* @date 2025-12-15
*/
public interface CrmSalesContractMapper extends BaseMapperPlus<CrmSalesContractMapper, CrmSalesContract, CrmSalesContractVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.crm.mapper;
import com.klp.crm.domain.CrmSalesObjection;
import com.klp.crm.domain.vo.CrmSalesObjectionVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 销售异议管理Mapper接口
*
* @author klp
* @date 2025-12-15
*/
public interface CrmSalesObjectionMapper extends BaseMapperPlus<CrmSalesObjectionMapper, CrmSalesObjection, CrmSalesObjectionVo> {
}

View File

@@ -0,0 +1,49 @@
package com.klp.crm.service;
import com.klp.crm.domain.CrmCustomer;
import com.klp.crm.domain.vo.CrmCustomerVo;
import com.klp.crm.domain.bo.CrmCustomerBo;
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 2025-12-15
*/
public interface ICrmCustomerService {
/**
* 查询客户信息
*/
CrmCustomerVo queryById(String customerId);
/**
* 查询客户信息列表
*/
TableDataInfo<CrmCustomerVo> queryPageList(CrmCustomerBo bo, PageQuery pageQuery);
/**
* 查询客户信息列表
*/
List<CrmCustomerVo> queryList(CrmCustomerBo bo);
/**
* 新增客户信息
*/
Boolean insertByBo(CrmCustomerBo bo);
/**
* 修改客户信息
*/
Boolean updateByBo(CrmCustomerBo bo);
/**
* 校验并批量删除客户信息信息
*/
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
}

View File

@@ -0,0 +1,49 @@
package com.klp.crm.service;
import com.klp.crm.domain.CrmOrderItem;
import com.klp.crm.domain.vo.CrmOrderItemVo;
import com.klp.crm.domain.bo.CrmOrderItemBo;
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 2025-12-15
*/
public interface ICrmOrderItemService {
/**
* 查询正式订单明细
*/
CrmOrderItemVo queryById(String itemId);
/**
* 查询正式订单明细列表
*/
TableDataInfo<CrmOrderItemVo> queryPageList(CrmOrderItemBo bo, PageQuery pageQuery);
/**
* 查询正式订单明细列表
*/
List<CrmOrderItemVo> queryList(CrmOrderItemBo bo);
/**
* 新增正式订单明细
*/
Boolean insertByBo(CrmOrderItemBo bo);
/**
* 修改正式订单明细
*/
Boolean updateByBo(CrmOrderItemBo bo);
/**
* 校验并批量删除正式订单明细信息
*/
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
}

View File

@@ -0,0 +1,49 @@
package com.klp.crm.service;
import com.klp.crm.domain.CrmOrderOperationTrace;
import com.klp.crm.domain.vo.CrmOrderOperationTraceVo;
import com.klp.crm.domain.bo.CrmOrderOperationTraceBo;
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 2025-12-15
*/
public interface ICrmOrderOperationTraceService {
/**
* 查询订单操作追溯
*/
CrmOrderOperationTraceVo queryById(String traceId);
/**
* 查询订单操作追溯列表
*/
TableDataInfo<CrmOrderOperationTraceVo> queryPageList(CrmOrderOperationTraceBo bo, PageQuery pageQuery);
/**
* 查询订单操作追溯列表
*/
List<CrmOrderOperationTraceVo> queryList(CrmOrderOperationTraceBo bo);
/**
* 新增订单操作追溯
*/
Boolean insertByBo(CrmOrderOperationTraceBo bo);
/**
* 修改订单操作追溯
*/
Boolean updateByBo(CrmOrderOperationTraceBo bo);
/**
* 校验并批量删除订单操作追溯信息
*/
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
}

View File

@@ -0,0 +1,49 @@
package com.klp.crm.service;
import com.klp.crm.domain.CrmOrder;
import com.klp.crm.domain.vo.CrmOrderVo;
import com.klp.crm.domain.bo.CrmOrderBo;
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 2025-12-15
*/
public interface ICrmOrderService {
/**
* 查询正式订单主
*/
CrmOrderVo queryById(String orderId);
/**
* 查询正式订单主列表
*/
TableDataInfo<CrmOrderVo> queryPageList(CrmOrderBo bo, PageQuery pageQuery);
/**
* 查询正式订单主列表
*/
List<CrmOrderVo> queryList(CrmOrderBo bo);
/**
* 新增正式订单主
*/
Boolean insertByBo(CrmOrderBo bo);
/**
* 修改正式订单主
*/
Boolean updateByBo(CrmOrderBo bo);
/**
* 校验并批量删除正式订单主信息
*/
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
}

View File

@@ -0,0 +1,49 @@
package com.klp.crm.service;
import com.klp.crm.domain.CrmSalesContract;
import com.klp.crm.domain.vo.CrmSalesContractVo;
import com.klp.crm.domain.bo.CrmSalesContractBo;
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 2025-12-15
*/
public interface ICrmSalesContractService {
/**
* 查询销售合同
*/
CrmSalesContractVo queryById(String contractId);
/**
* 查询销售合同列表
*/
TableDataInfo<CrmSalesContractVo> queryPageList(CrmSalesContractBo bo, PageQuery pageQuery);
/**
* 查询销售合同列表
*/
List<CrmSalesContractVo> queryList(CrmSalesContractBo bo);
/**
* 新增销售合同
*/
Boolean insertByBo(CrmSalesContractBo bo);
/**
* 修改销售合同
*/
Boolean updateByBo(CrmSalesContractBo bo);
/**
* 校验并批量删除销售合同信息
*/
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
}

View File

@@ -0,0 +1,49 @@
package com.klp.crm.service;
import com.klp.crm.domain.CrmSalesObjection;
import com.klp.crm.domain.vo.CrmSalesObjectionVo;
import com.klp.crm.domain.bo.CrmSalesObjectionBo;
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 2025-12-15
*/
public interface ICrmSalesObjectionService {
/**
* 查询销售异议管理
*/
CrmSalesObjectionVo queryById(String objectionId);
/**
* 查询销售异议管理列表
*/
TableDataInfo<CrmSalesObjectionVo> queryPageList(CrmSalesObjectionBo bo, PageQuery pageQuery);
/**
* 查询销售异议管理列表
*/
List<CrmSalesObjectionVo> queryList(CrmSalesObjectionBo bo);
/**
* 新增销售异议管理
*/
Boolean insertByBo(CrmSalesObjectionBo bo);
/**
* 修改销售异议管理
*/
Boolean updateByBo(CrmSalesObjectionBo bo);
/**
* 校验并批量删除销售异议管理信息
*/
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
}

View File

@@ -0,0 +1,116 @@
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.CrmCustomerBo;
import com.klp.crm.domain.vo.CrmCustomerVo;
import com.klp.crm.domain.CrmCustomer;
import com.klp.crm.mapper.CrmCustomerMapper;
import com.klp.crm.service.ICrmCustomerService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 客户信息Service业务层处理
*
* @author klp
* @date 2025-12-15
*/
@RequiredArgsConstructor
@Service
public class CrmCustomerServiceImpl implements ICrmCustomerService {
private final CrmCustomerMapper baseMapper;
/**
* 查询客户信息
*/
@Override
public CrmCustomerVo queryById(String customerId){
return baseMapper.selectVoById(customerId);
}
/**
* 查询客户信息列表
*/
@Override
public TableDataInfo<CrmCustomerVo> queryPageList(CrmCustomerBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CrmCustomer> lqw = buildQueryWrapper(bo);
Page<CrmCustomerVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询客户信息列表
*/
@Override
public List<CrmCustomerVo> queryList(CrmCustomerBo bo) {
LambdaQueryWrapper<CrmCustomer> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<CrmCustomer> buildQueryWrapper(CrmCustomerBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<CrmCustomer> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getCustomerCode()), CrmCustomer::getCustomerCode, bo.getCustomerCode());
lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), CrmCustomer::getCompanyName, bo.getCompanyName());
lqw.eq(StringUtils.isNotBlank(bo.getContactPerson()), CrmCustomer::getContactPerson, bo.getContactPerson());
lqw.eq(StringUtils.isNotBlank(bo.getContactWay()), CrmCustomer::getContactWay, bo.getContactWay());
lqw.eq(StringUtils.isNotBlank(bo.getIndustry()), CrmCustomer::getIndustry, bo.getIndustry());
lqw.eq(StringUtils.isNotBlank(bo.getCustomerLevel()), CrmCustomer::getCustomerLevel, bo.getCustomerLevel());
lqw.eq(StringUtils.isNotBlank(bo.getAddress()), CrmCustomer::getAddress, bo.getAddress());
lqw.eq(StringUtils.isNotBlank(bo.getBankInfo()), CrmCustomer::getBankInfo, bo.getBankInfo());
return lqw;
}
/**
* 新增客户信息
*/
@Override
public Boolean insertByBo(CrmCustomerBo bo) {
CrmCustomer add = BeanUtil.toBean(bo, CrmCustomer.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setCustomerId(add.getCustomerId());
}
return flag;
}
/**
* 修改客户信息
*/
@Override
public Boolean updateByBo(CrmCustomerBo bo) {
CrmCustomer update = BeanUtil.toBean(bo, CrmCustomer.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CrmCustomer entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除客户信息
*/
@Override
public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,114 @@
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.CrmOrderItemBo;
import com.klp.crm.domain.vo.CrmOrderItemVo;
import com.klp.crm.domain.CrmOrderItem;
import com.klp.crm.mapper.CrmOrderItemMapper;
import com.klp.crm.service.ICrmOrderItemService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 正式订单明细Service业务层处理
*
* @author klp
* @date 2025-12-15
*/
@RequiredArgsConstructor
@Service
public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
private final CrmOrderItemMapper baseMapper;
/**
* 查询正式订单明细
*/
@Override
public CrmOrderItemVo queryById(String itemId){
return baseMapper.selectVoById(itemId);
}
/**
* 查询正式订单明细列表
*/
@Override
public TableDataInfo<CrmOrderItemVo> queryPageList(CrmOrderItemBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CrmOrderItem> lqw = buildQueryWrapper(bo);
Page<CrmOrderItemVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询正式订单明细列表
*/
@Override
public List<CrmOrderItemVo> queryList(CrmOrderItemBo bo) {
LambdaQueryWrapper<CrmOrderItem> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<CrmOrderItem> buildQueryWrapper(CrmOrderItemBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<CrmOrderItem> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getOrderId()), CrmOrderItem::getOrderId, bo.getOrderId());
lqw.eq(StringUtils.isNotBlank(bo.getProductType()), CrmOrderItem::getProductType, bo.getProductType());
lqw.eq(StringUtils.isNotBlank(bo.getSpecRequire()), CrmOrderItem::getSpecRequire, bo.getSpecRequire());
lqw.eq(bo.getProductNum() != null, CrmOrderItem::getProductNum, bo.getProductNum());
lqw.eq(StringUtils.isNotBlank(bo.getSpecialRequire()), CrmOrderItem::getSpecialRequire, bo.getSpecialRequire());
lqw.eq(bo.getItemAmount() != null, CrmOrderItem::getItemAmount, bo.getItemAmount());
return lqw;
}
/**
* 新增正式订单明细
*/
@Override
public Boolean insertByBo(CrmOrderItemBo bo) {
CrmOrderItem add = BeanUtil.toBean(bo, CrmOrderItem.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setItemId(add.getItemId());
}
return flag;
}
/**
* 修改正式订单明细
*/
@Override
public Boolean updateByBo(CrmOrderItemBo bo) {
CrmOrderItem update = BeanUtil.toBean(bo, CrmOrderItem.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CrmOrderItem entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除正式订单明细
*/
@Override
public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,115 @@
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.CrmOrderOperationTraceBo;
import com.klp.crm.domain.vo.CrmOrderOperationTraceVo;
import com.klp.crm.domain.CrmOrderOperationTrace;
import com.klp.crm.mapper.CrmOrderOperationTraceMapper;
import com.klp.crm.service.ICrmOrderOperationTraceService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 订单操作追溯Service业务层处理
*
* @author klp
* @date 2025-12-15
*/
@RequiredArgsConstructor
@Service
public class CrmOrderOperationTraceServiceImpl implements ICrmOrderOperationTraceService {
private final CrmOrderOperationTraceMapper baseMapper;
/**
* 查询订单操作追溯
*/
@Override
public CrmOrderOperationTraceVo queryById(String traceId){
return baseMapper.selectVoById(traceId);
}
/**
* 查询订单操作追溯列表
*/
@Override
public TableDataInfo<CrmOrderOperationTraceVo> queryPageList(CrmOrderOperationTraceBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CrmOrderOperationTrace> lqw = buildQueryWrapper(bo);
Page<CrmOrderOperationTraceVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询订单操作追溯列表
*/
@Override
public List<CrmOrderOperationTraceVo> queryList(CrmOrderOperationTraceBo bo) {
LambdaQueryWrapper<CrmOrderOperationTrace> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<CrmOrderOperationTrace> buildQueryWrapper(CrmOrderOperationTraceBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<CrmOrderOperationTrace> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getOrderId()), CrmOrderOperationTrace::getOrderId, bo.getOrderId());
lqw.eq(StringUtils.isNotBlank(bo.getOperationType()), CrmOrderOperationTrace::getOperationType, bo.getOperationType());
lqw.eq(StringUtils.isNotBlank(bo.getOldStatus()), CrmOrderOperationTrace::getOldStatus, bo.getOldStatus());
lqw.eq(StringUtils.isNotBlank(bo.getNewStatus()), CrmOrderOperationTrace::getNewStatus, bo.getNewStatus());
lqw.eq(StringUtils.isNotBlank(bo.getOperationContent()), CrmOrderOperationTrace::getOperationContent, bo.getOperationContent());
lqw.eq(StringUtils.isNotBlank(bo.getOperator()), CrmOrderOperationTrace::getOperator, bo.getOperator());
lqw.eq(bo.getOperationTime() != null, CrmOrderOperationTrace::getOperationTime, bo.getOperationTime());
return lqw;
}
/**
* 新增订单操作追溯
*/
@Override
public Boolean insertByBo(CrmOrderOperationTraceBo bo) {
CrmOrderOperationTrace add = BeanUtil.toBean(bo, CrmOrderOperationTrace.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setTraceId(add.getTraceId());
}
return flag;
}
/**
* 修改订单操作追溯
*/
@Override
public Boolean updateByBo(CrmOrderOperationTraceBo bo) {
CrmOrderOperationTrace update = BeanUtil.toBean(bo, CrmOrderOperationTrace.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CrmOrderOperationTrace entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除订单操作追溯
*/
@Override
public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,120 @@
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.CrmOrderBo;
import com.klp.crm.domain.vo.CrmOrderVo;
import com.klp.crm.domain.CrmOrder;
import com.klp.crm.mapper.CrmOrderMapper;
import com.klp.crm.service.ICrmOrderService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 正式订单主Service业务层处理
*
* @author klp
* @date 2025-12-15
*/
@RequiredArgsConstructor
@Service
public class CrmOrderServiceImpl implements ICrmOrderService {
private final CrmOrderMapper baseMapper;
/**
* 查询正式订单主
*/
@Override
public CrmOrderVo queryById(String orderId){
return baseMapper.selectVoById(orderId);
}
/**
* 查询正式订单主列表
*/
@Override
public TableDataInfo<CrmOrderVo> queryPageList(CrmOrderBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CrmOrder> lqw = buildQueryWrapper(bo);
Page<CrmOrderVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询正式订单主列表
*/
@Override
public List<CrmOrderVo> queryList(CrmOrderBo bo) {
LambdaQueryWrapper<CrmOrder> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<CrmOrder> buildQueryWrapper(CrmOrderBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<CrmOrder> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getOrderCode()), CrmOrder::getOrderCode, bo.getOrderCode());
lqw.eq(bo.getOrderType() != null, CrmOrder::getOrderType, bo.getOrderType());
lqw.eq(StringUtils.isNotBlank(bo.getCustomerId()), CrmOrder::getCustomerId, bo.getCustomerId());
lqw.eq(bo.getOrderAmount() != null, CrmOrder::getOrderAmount, bo.getOrderAmount());
lqw.eq(StringUtils.isNotBlank(bo.getSalesman()), CrmOrder::getSalesman, bo.getSalesman());
lqw.eq(bo.getDeliveryDate() != null, CrmOrder::getDeliveryDate, bo.getDeliveryDate());
lqw.eq(bo.getPreOrderStatus() != null, CrmOrder::getPreOrderStatus, bo.getPreOrderStatus());
lqw.eq(StringUtils.isNotBlank(bo.getAuditUser()), CrmOrder::getAuditUser, bo.getAuditUser());
lqw.eq(bo.getAuditTime() != null, CrmOrder::getAuditTime, bo.getAuditTime());
lqw.eq(bo.getOrderStatus() != null, CrmOrder::getOrderStatus, bo.getOrderStatus());
lqw.eq(bo.getFinanceStatus() != null, CrmOrder::getFinanceStatus, bo.getFinanceStatus());
lqw.eq(bo.getUnpaidAmount() != null, CrmOrder::getUnpaidAmount, bo.getUnpaidAmount());
return lqw;
}
/**
* 新增正式订单主
*/
@Override
public Boolean insertByBo(CrmOrderBo bo) {
CrmOrder add = BeanUtil.toBean(bo, CrmOrder.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setOrderId(add.getOrderId());
}
return flag;
}
/**
* 修改正式订单主
*/
@Override
public Boolean updateByBo(CrmOrderBo bo) {
CrmOrder update = BeanUtil.toBean(bo, CrmOrder.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CrmOrder entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除正式订单主
*/
@Override
public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,121 @@
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.CrmSalesContractBo;
import com.klp.crm.domain.vo.CrmSalesContractVo;
import com.klp.crm.domain.CrmSalesContract;
import com.klp.crm.mapper.CrmSalesContractMapper;
import com.klp.crm.service.ICrmSalesContractService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 销售合同Service业务层处理
*
* @author klp
* @date 2025-12-15
*/
@RequiredArgsConstructor
@Service
public class CrmSalesContractServiceImpl implements ICrmSalesContractService {
private final CrmSalesContractMapper baseMapper;
/**
* 查询销售合同
*/
@Override
public CrmSalesContractVo queryById(String contractId){
return baseMapper.selectVoById(contractId);
}
/**
* 查询销售合同列表
*/
@Override
public TableDataInfo<CrmSalesContractVo> queryPageList(CrmSalesContractBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CrmSalesContract> lqw = buildQueryWrapper(bo);
Page<CrmSalesContractVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询销售合同列表
*/
@Override
public List<CrmSalesContractVo> queryList(CrmSalesContractBo bo) {
LambdaQueryWrapper<CrmSalesContract> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<CrmSalesContract> buildQueryWrapper(CrmSalesContractBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<CrmSalesContract> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getContractCode()), CrmSalesContract::getContractCode, bo.getContractCode());
lqw.eq(bo.getContractType() != null, CrmSalesContract::getContractType, bo.getContractType());
lqw.eq(StringUtils.isNotBlank(bo.getCustomerId()), CrmSalesContract::getCustomerId, bo.getCustomerId());
lqw.eq(bo.getTotalAmount() != null, CrmSalesContract::getTotalAmount, bo.getTotalAmount());
lqw.eq(bo.getDeliveryDate() != null, CrmSalesContract::getDeliveryDate, bo.getDeliveryDate());
lqw.eq(bo.getContractStatus() != null, CrmSalesContract::getContractStatus, bo.getContractStatus());
lqw.eq(StringUtils.isNotBlank(bo.getCreateUser()), CrmSalesContract::getCreateUser, bo.getCreateUser());
lqw.eq(StringUtils.isNotBlank(bo.getReviewUser()), CrmSalesContract::getReviewUser, bo.getReviewUser());
lqw.eq(bo.getReviewTime() != null, CrmSalesContract::getReviewTime, bo.getReviewTime());
lqw.eq(StringUtils.isNotBlank(bo.getAuditUser()), CrmSalesContract::getAuditUser, bo.getAuditUser());
lqw.eq(bo.getAuditTime() != null, CrmSalesContract::getAuditTime, bo.getAuditTime());
lqw.eq(StringUtils.isNotBlank(bo.getIssueUser()), CrmSalesContract::getIssueUser, bo.getIssueUser());
lqw.eq(bo.getIssueTime() != null, CrmSalesContract::getIssueTime, bo.getIssueTime());
return lqw;
}
/**
* 新增销售合同
*/
@Override
public Boolean insertByBo(CrmSalesContractBo bo) {
CrmSalesContract add = BeanUtil.toBean(bo, CrmSalesContract.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setContractId(add.getContractId());
}
return flag;
}
/**
* 修改销售合同
*/
@Override
public Boolean updateByBo(CrmSalesContractBo bo) {
CrmSalesContract update = BeanUtil.toBean(bo, CrmSalesContract.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CrmSalesContract entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除销售合同
*/
@Override
public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,118 @@
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.CrmSalesObjectionBo;
import com.klp.crm.domain.vo.CrmSalesObjectionVo;
import com.klp.crm.domain.CrmSalesObjection;
import com.klp.crm.mapper.CrmSalesObjectionMapper;
import com.klp.crm.service.ICrmSalesObjectionService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 销售异议管理Service业务层处理
*
* @author klp
* @date 2025-12-15
*/
@RequiredArgsConstructor
@Service
public class CrmSalesObjectionServiceImpl implements ICrmSalesObjectionService {
private final CrmSalesObjectionMapper baseMapper;
/**
* 查询销售异议管理
*/
@Override
public CrmSalesObjectionVo queryById(String objectionId){
return baseMapper.selectVoById(objectionId);
}
/**
* 查询销售异议管理列表
*/
@Override
public TableDataInfo<CrmSalesObjectionVo> queryPageList(CrmSalesObjectionBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CrmSalesObjection> lqw = buildQueryWrapper(bo);
Page<CrmSalesObjectionVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询销售异议管理列表
*/
@Override
public List<CrmSalesObjectionVo> queryList(CrmSalesObjectionBo bo) {
LambdaQueryWrapper<CrmSalesObjection> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<CrmSalesObjection> buildQueryWrapper(CrmSalesObjectionBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<CrmSalesObjection> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getObjectionCode()), CrmSalesObjection::getObjectionCode, bo.getObjectionCode());
lqw.eq(StringUtils.isNotBlank(bo.getOrderId()), CrmSalesObjection::getOrderId, bo.getOrderId());
lqw.eq(StringUtils.isNotBlank(bo.getCustomerId()), CrmSalesObjection::getCustomerId, bo.getCustomerId());
lqw.eq(StringUtils.isNotBlank(bo.getObjectionType()), CrmSalesObjection::getObjectionType, bo.getObjectionType());
lqw.eq(StringUtils.isNotBlank(bo.getObjectionContent()), CrmSalesObjection::getObjectionContent, bo.getObjectionContent());
lqw.eq(bo.getObjectionStatus() != null, CrmSalesObjection::getObjectionStatus, bo.getObjectionStatus());
lqw.eq(StringUtils.isNotBlank(bo.getHandleContent()), CrmSalesObjection::getHandleContent, bo.getHandleContent());
lqw.eq(StringUtils.isNotBlank(bo.getHandleUser()), CrmSalesObjection::getHandleUser, bo.getHandleUser());
lqw.eq(bo.getHandleTime() != null, CrmSalesObjection::getHandleTime, bo.getHandleTime());
lqw.eq(bo.getCloseTime() != null, CrmSalesObjection::getCloseTime, bo.getCloseTime());
return lqw;
}
/**
* 新增销售异议管理
*/
@Override
public Boolean insertByBo(CrmSalesObjectionBo bo) {
CrmSalesObjection add = BeanUtil.toBean(bo, CrmSalesObjection.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setObjectionId(add.getObjectionId());
}
return flag;
}
/**
* 修改销售异议管理
*/
@Override
public Boolean updateByBo(CrmSalesObjectionBo bo) {
CrmSalesObjection update = BeanUtil.toBean(bo, CrmSalesObjection.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CrmSalesObjection entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除销售异议管理
*/
@Override
public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,26 @@
<?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.CrmCustomerMapper">
<resultMap type="com.klp.crm.domain.CrmCustomer" id="CrmCustomerResult">
<result property="customerId" column="customer_id"/>
<result property="customerCode" column="customer_code"/>
<result property="companyName" column="company_name"/>
<result property="contactPerson" column="contact_person"/>
<result property="contactWay" column="contact_way"/>
<result property="industry" column="industry"/>
<result property="customerLevel" column="customer_level"/>
<result property="address" column="address"/>
<result property="bankInfo" column="bank_info"/>
<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,24 @@
<?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.CrmOrderItemMapper">
<resultMap type="com.klp.crm.domain.CrmOrderItem" id="CrmOrderItemResult">
<result property="itemId" column="item_id"/>
<result property="orderId" column="order_id"/>
<result property="productType" column="product_type"/>
<result property="specRequire" column="spec_require"/>
<result property="productNum" column="product_num"/>
<result property="specialRequire" column="special_require"/>
<result property="itemAmount" column="item_amount"/>
<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,30 @@
<?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.CrmOrderMapper">
<resultMap type="com.klp.crm.domain.CrmOrder" id="CrmOrderResult">
<result property="orderId" column="order_id"/>
<result property="orderCode" column="order_code"/>
<result property="orderType" column="order_type"/>
<result property="customerId" column="customer_id"/>
<result property="orderAmount" column="order_amount"/>
<result property="salesman" column="salesman"/>
<result property="deliveryDate" column="delivery_date"/>
<result property="preOrderStatus" column="pre_order_status"/>
<result property="auditUser" column="audit_user"/>
<result property="auditTime" column="audit_time"/>
<result property="orderStatus" column="order_status"/>
<result property="financeStatus" column="finance_status"/>
<result property="unpaidAmount" column="unpaid_amount"/>
<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,25 @@
<?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.CrmOrderOperationTraceMapper">
<resultMap type="com.klp.crm.domain.CrmOrderOperationTrace" id="CrmOrderOperationTraceResult">
<result property="traceId" column="trace_id"/>
<result property="orderId" column="order_id"/>
<result property="operationType" column="operation_type"/>
<result property="oldStatus" column="old_status"/>
<result property="newStatus" column="new_status"/>
<result property="operationContent" column="operation_content"/>
<result property="operator" column="operator"/>
<result property="operationTime" column="operation_time"/>
<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,31 @@
<?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.CrmSalesContractMapper">
<resultMap type="com.klp.crm.domain.CrmSalesContract" id="CrmSalesContractResult">
<result property="contractId" column="contract_id"/>
<result property="contractCode" column="contract_code"/>
<result property="contractType" column="contract_type"/>
<result property="customerId" column="customer_id"/>
<result property="totalAmount" column="total_amount"/>
<result property="deliveryDate" column="delivery_date"/>
<result property="contractStatus" column="contract_status"/>
<result property="createUser" column="create_user"/>
<result property="reviewUser" column="review_user"/>
<result property="reviewTime" column="review_time"/>
<result property="auditUser" column="audit_user"/>
<result property="auditTime" column="audit_time"/>
<result property="issueUser" column="issue_user"/>
<result property="issueTime" column="issue_time"/>
<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,28 @@
<?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.CrmSalesObjectionMapper">
<resultMap type="com.klp.crm.domain.CrmSalesObjection" id="CrmSalesObjectionResult">
<result property="objectionId" column="objection_id"/>
<result property="objectionCode" column="objection_code"/>
<result property="orderId" column="order_id"/>
<result property="customerId" column="customer_id"/>
<result property="objectionType" column="objection_type"/>
<result property="objectionContent" column="objection_content"/>
<result property="objectionStatus" column="objection_status"/>
<result property="handleContent" column="handle_content"/>
<result property="handleUser" column="handle_user"/>
<result property="handleTime" column="handle_time"/>
<result property="closeTime" column="close_time"/>
<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

@@ -396,6 +396,11 @@
<artifactId>klp-hrm</artifactId>
<version>${klp-flowable-plus.version}</version>
</dependency>
<dependency>
<groupId>com.klp</groupId>
<artifactId>klp-crm</artifactId>
<version>${klp-flowable-plus.version}</version>
</dependency>
</dependencies>
@@ -420,6 +425,7 @@
<module>klp-pocket</module>
<module>klp-erp</module>
<module>klp-hrm</module>
<module>klp-crm</module>
</modules>
<packaging>pom</packaging>