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

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