From c8cce87fe2bda14d41d9bcc687d34e4eebd8eca1 Mon Sep 17 00:00:00 2001 From: liuzongkun999 Date: Wed, 12 Mar 2025 12:56:45 +0800 Subject: [PATCH] =?UTF-8?q?CRM=E5=90=8E=E7=AB=AF=E5=85=AD=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oa/controller/OaBusinessController.java | 108 +++++++++++++ .../OaBusinessProductController.java | 108 +++++++++++++ .../ruoyi/oa/controller/OaClueController.java | 108 +++++++++++++ .../oa/controller/OaCustomerController.java | 108 +++++++++++++ .../OaFollowUpRecordController.java | 108 +++++++++++++ .../oa/controller/OaProductController.java | 108 +++++++++++++ .../java/com/ruoyi/oa/domain/OaBusiness.java | 99 ++++++++++++ .../ruoyi/oa/domain/OaBusinessProduct.java | 61 ++++++++ .../main/java/com/ruoyi/oa/domain/OaClue.java | 114 ++++++++++++++ .../java/com/ruoyi/oa/domain/OaCustomer.java | 114 ++++++++++++++ .../com/ruoyi/oa/domain/OaFollowUpRecord.java | 70 +++++++++ .../java/com/ruoyi/oa/domain/OaProduct.java | 68 ++++++++ .../com/ruoyi/oa/domain/bo/OaBusinessBo.java | 124 +++++++++++++++ .../oa/domain/bo/OaBusinessProductBo.java | 68 ++++++++ .../java/com/ruoyi/oa/domain/bo/OaClueBo.java | 147 ++++++++++++++++++ .../com/ruoyi/oa/domain/bo/OaCustomerBo.java | 147 ++++++++++++++++++ .../oa/domain/bo/OaFollowUpRecordBo.java | 81 ++++++++++ .../com/ruoyi/oa/domain/bo/OaProductBo.java | 86 ++++++++++ .../oa/domain/vo/OaBusinessProductVo.java | 68 ++++++++ .../com/ruoyi/oa/domain/vo/OaBusinessVo.java | 124 +++++++++++++++ .../java/com/ruoyi/oa/domain/vo/OaClueVo.java | 147 ++++++++++++++++++ .../com/ruoyi/oa/domain/vo/OaCustomerVo.java | 147 ++++++++++++++++++ .../oa/domain/vo/OaFollowUpRecordVo.java | 81 ++++++++++ .../com/ruoyi/oa/domain/vo/OaProductVo.java | 86 ++++++++++ .../com/ruoyi/oa/mapper/OaBusinessMapper.java | 15 ++ .../oa/mapper/OaBusinessProductMapper.java | 15 ++ .../com/ruoyi/oa/mapper/OaClueMapper.java | 15 ++ .../com/ruoyi/oa/mapper/OaCustomerMapper.java | 15 ++ .../oa/mapper/OaFollowUpRecordMapper.java | 15 ++ .../com/ruoyi/oa/mapper/OaProductMapper.java | 15 ++ .../oa/service/IOaBusinessProductService.java | 49 ++++++ .../ruoyi/oa/service/IOaBusinessService.java | 49 ++++++ .../com/ruoyi/oa/service/IOaClueService.java | 49 ++++++ .../ruoyi/oa/service/IOaCustomerService.java | 49 ++++++ .../oa/service/IOaFollowUpRecordService.java | 49 ++++++ .../ruoyi/oa/service/IOaProductService.java | 49 ++++++ .../impl/OaBusinessProductServiceImpl.java | 114 ++++++++++++++ .../service/impl/OaBusinessServiceImpl.java | 122 +++++++++++++++ .../oa/service/impl/OaClueServiceImpl.java | 126 +++++++++++++++ .../service/impl/OaCustomerServiceImpl.java | 126 +++++++++++++++ .../impl/OaFollowUpRecordServiceImpl.java | 116 ++++++++++++++ .../oa/service/impl/OaProductServiceImpl.java | 117 ++++++++++++++ .../resources/mapper/oa/OaBusinessMapper.xml | 34 ++++ .../mapper/oa/OaBusinessProductMapper.xml | 24 +++ .../main/resources/mapper/oa/OaClueMapper.xml | 37 +++++ .../resources/mapper/oa/OaCustomerMapper.xml | 37 +++++ .../mapper/oa/OaFollowUpRecordMapper.xml | 27 ++++ .../resources/mapper/oa/OaProductMapper.xml | 26 ++++ 48 files changed, 3770 insertions(+) create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaBusinessController.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaBusinessProductController.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaClueController.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaCustomerController.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaFollowUpRecordController.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProductController.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaBusiness.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaBusinessProduct.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaClue.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaCustomer.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaFollowUpRecord.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaProduct.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaBusinessBo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaBusinessProductBo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaClueBo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaCustomerBo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaFollowUpRecordBo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProductBo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaBusinessProductVo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaBusinessVo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaClueVo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaCustomerVo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaFollowUpRecordVo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProductVo.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaBusinessMapper.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaBusinessProductMapper.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaClueMapper.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaCustomerMapper.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaFollowUpRecordMapper.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaProductMapper.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaBusinessProductService.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaBusinessService.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaClueService.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaCustomerService.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaFollowUpRecordService.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProductService.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaBusinessProductServiceImpl.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaBusinessServiceImpl.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaClueServiceImpl.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaCustomerServiceImpl.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaFollowUpRecordServiceImpl.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProductServiceImpl.java create mode 100644 ruoyi-oa/src/main/resources/mapper/oa/OaBusinessMapper.xml create mode 100644 ruoyi-oa/src/main/resources/mapper/oa/OaBusinessProductMapper.xml create mode 100644 ruoyi-oa/src/main/resources/mapper/oa/OaClueMapper.xml create mode 100644 ruoyi-oa/src/main/resources/mapper/oa/OaCustomerMapper.xml create mode 100644 ruoyi-oa/src/main/resources/mapper/oa/OaFollowUpRecordMapper.xml create mode 100644 ruoyi-oa/src/main/resources/mapper/oa/OaProductMapper.xml diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaBusinessController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaBusinessController.java new file mode 100644 index 0000000..b94ee3c --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaBusinessController.java @@ -0,0 +1,108 @@ +package com.ruoyi.oa.controller; + +import java.util.List; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.core.validate.QueryGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.oa.domain.vo.OaBusinessVo; +import com.ruoyi.oa.domain.bo.OaBusinessBo; +import com.ruoyi.oa.service.IOaBusinessService; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * CRM 商机 + * + * @author ruoyi + * @date 2025-03-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/business") +public class OaBusinessController extends BaseController { + + private final IOaBusinessService iOaBusinessService; + + /** + * 查询CRM 商机列表 + */ + @SaCheckPermission("oa:business:list") + @GetMapping("/list") + public TableDataInfo list(OaBusinessBo bo, PageQuery pageQuery) { + return iOaBusinessService.queryPageList(bo, pageQuery); + } + + /** + * 导出CRM 商机列表 + */ + @SaCheckPermission("oa:business:export") + @Log(title = "CRM 商机", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(OaBusinessBo bo, HttpServletResponse response) { + List list = iOaBusinessService.queryList(bo); + ExcelUtil.exportExcel(list, "CRM 商机", OaBusinessVo.class, response); + } + + /** + * 获取CRM 商机详细信息 + * + * @param businessId 主键 + */ + @SaCheckPermission("oa:business:query") + @GetMapping("/{businessId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long businessId) { + return R.ok(iOaBusinessService.queryById(businessId)); + } + + /** + * 新增CRM 商机 + */ + @SaCheckPermission("oa:business:add") + @Log(title = "CRM 商机", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody OaBusinessBo bo) { + return toAjax(iOaBusinessService.insertByBo(bo)); + } + + /** + * 修改CRM 商机 + */ + @SaCheckPermission("oa:business:edit") + @Log(title = "CRM 商机", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody OaBusinessBo bo) { + return toAjax(iOaBusinessService.updateByBo(bo)); + } + + /** + * 删除CRM 商机 + * + * @param businessIds 主键串 + */ + @SaCheckPermission("oa:business:remove") + @Log(title = "CRM 商机", businessType = BusinessType.DELETE) + @DeleteMapping("/{businessIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] businessIds) { + return toAjax(iOaBusinessService.deleteWithValidByIds(Arrays.asList(businessIds), true)); + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaBusinessProductController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaBusinessProductController.java new file mode 100644 index 0000000..370386f --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaBusinessProductController.java @@ -0,0 +1,108 @@ +package com.ruoyi.oa.controller; + +import java.util.List; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.core.validate.QueryGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.oa.domain.vo.OaBusinessProductVo; +import com.ruoyi.oa.domain.bo.OaBusinessProductBo; +import com.ruoyi.oa.service.IOaBusinessProductService; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * CRM 商机产品关联 + * + * @author ruoyi + * @date 2025-03-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/businessProduct") +public class OaBusinessProductController extends BaseController { + + private final IOaBusinessProductService iOaBusinessProductService; + + /** + * 查询CRM 商机产品关联列表 + */ + @SaCheckPermission("oa:businessProduct:list") + @GetMapping("/list") + public TableDataInfo list(OaBusinessProductBo bo, PageQuery pageQuery) { + return iOaBusinessProductService.queryPageList(bo, pageQuery); + } + + /** + * 导出CRM 商机产品关联列表 + */ + @SaCheckPermission("oa:businessProduct:export") + @Log(title = "CRM 商机产品关联", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(OaBusinessProductBo bo, HttpServletResponse response) { + List list = iOaBusinessProductService.queryList(bo); + ExcelUtil.exportExcel(list, "CRM 商机产品关联", OaBusinessProductVo.class, response); + } + + /** + * 获取CRM 商机产品关联详细信息 + * + * @param businessProductId 主键 + */ + @SaCheckPermission("oa:businessProduct:query") + @GetMapping("/{businessProductId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long businessProductId) { + return R.ok(iOaBusinessProductService.queryById(businessProductId)); + } + + /** + * 新增CRM 商机产品关联 + */ + @SaCheckPermission("oa:businessProduct:add") + @Log(title = "CRM 商机产品关联", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody OaBusinessProductBo bo) { + return toAjax(iOaBusinessProductService.insertByBo(bo)); + } + + /** + * 修改CRM 商机产品关联 + */ + @SaCheckPermission("oa:businessProduct:edit") + @Log(title = "CRM 商机产品关联", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody OaBusinessProductBo bo) { + return toAjax(iOaBusinessProductService.updateByBo(bo)); + } + + /** + * 删除CRM 商机产品关联 + * + * @param businessProductIds 主键串 + */ + @SaCheckPermission("oa:businessProduct:remove") + @Log(title = "CRM 商机产品关联", businessType = BusinessType.DELETE) + @DeleteMapping("/{businessProductIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] businessProductIds) { + return toAjax(iOaBusinessProductService.deleteWithValidByIds(Arrays.asList(businessProductIds), true)); + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaClueController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaClueController.java new file mode 100644 index 0000000..2a909bb --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaClueController.java @@ -0,0 +1,108 @@ +package com.ruoyi.oa.controller; + +import java.util.List; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.core.validate.QueryGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.oa.domain.vo.OaClueVo; +import com.ruoyi.oa.domain.bo.OaClueBo; +import com.ruoyi.oa.service.IOaClueService; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * CRM 线索 + * + * @author ruoyi + * @date 2025-03-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/clue") +public class OaClueController extends BaseController { + + private final IOaClueService iOaClueService; + + /** + * 查询CRM 线索列表 + */ + @SaCheckPermission("oa:clue:list") + @GetMapping("/list") + public TableDataInfo list(OaClueBo bo, PageQuery pageQuery) { + return iOaClueService.queryPageList(bo, pageQuery); + } + + /** + * 导出CRM 线索列表 + */ + @SaCheckPermission("oa:clue:export") + @Log(title = "CRM 线索", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(OaClueBo bo, HttpServletResponse response) { + List list = iOaClueService.queryList(bo); + ExcelUtil.exportExcel(list, "CRM 线索", OaClueVo.class, response); + } + + /** + * 获取CRM 线索详细信息 + * + * @param clueId 主键 + */ + @SaCheckPermission("oa:clue:query") + @GetMapping("/{clueId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long clueId) { + return R.ok(iOaClueService.queryById(clueId)); + } + + /** + * 新增CRM 线索 + */ + @SaCheckPermission("oa:clue:add") + @Log(title = "CRM 线索", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody OaClueBo bo) { + return toAjax(iOaClueService.insertByBo(bo)); + } + + /** + * 修改CRM 线索 + */ + @SaCheckPermission("oa:clue:edit") + @Log(title = "CRM 线索", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody OaClueBo bo) { + return toAjax(iOaClueService.updateByBo(bo)); + } + + /** + * 删除CRM 线索 + * + * @param clueIds 主键串 + */ + @SaCheckPermission("oa:clue:remove") + @Log(title = "CRM 线索", businessType = BusinessType.DELETE) + @DeleteMapping("/{clueIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] clueIds) { + return toAjax(iOaClueService.deleteWithValidByIds(Arrays.asList(clueIds), true)); + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaCustomerController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaCustomerController.java new file mode 100644 index 0000000..6cb2f04 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaCustomerController.java @@ -0,0 +1,108 @@ +package com.ruoyi.oa.controller; + +import java.util.List; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.core.validate.QueryGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.oa.domain.vo.OaCustomerVo; +import com.ruoyi.oa.domain.bo.OaCustomerBo; +import com.ruoyi.oa.service.IOaCustomerService; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * CRM 客户 + * + * @author ruoyi + * @date 2025-03-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/customer") +public class OaCustomerController extends BaseController { + + private final IOaCustomerService iOaCustomerService; + + /** + * 查询CRM 客户列表 + */ + @SaCheckPermission("oa:customer:list") + @GetMapping("/list") + public TableDataInfo list(OaCustomerBo bo, PageQuery pageQuery) { + return iOaCustomerService.queryPageList(bo, pageQuery); + } + + /** + * 导出CRM 客户列表 + */ + @SaCheckPermission("oa:customer:export") + @Log(title = "CRM 客户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(OaCustomerBo bo, HttpServletResponse response) { + List list = iOaCustomerService.queryList(bo); + ExcelUtil.exportExcel(list, "CRM 客户", OaCustomerVo.class, response); + } + + /** + * 获取CRM 客户详细信息 + * + * @param customerId 主键 + */ + @SaCheckPermission("oa:customer:query") + @GetMapping("/{customerId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long customerId) { + return R.ok(iOaCustomerService.queryById(customerId)); + } + + /** + * 新增CRM 客户 + */ + @SaCheckPermission("oa:customer:add") + @Log(title = "CRM 客户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody OaCustomerBo bo) { + return toAjax(iOaCustomerService.insertByBo(bo)); + } + + /** + * 修改CRM 客户 + */ + @SaCheckPermission("oa:customer:edit") + @Log(title = "CRM 客户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody OaCustomerBo bo) { + return toAjax(iOaCustomerService.updateByBo(bo)); + } + + /** + * 删除CRM 客户 + * + * @param customerIds 主键串 + */ + @SaCheckPermission("oa:customer:remove") + @Log(title = "CRM 客户", businessType = BusinessType.DELETE) + @DeleteMapping("/{customerIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] customerIds) { + return toAjax(iOaCustomerService.deleteWithValidByIds(Arrays.asList(customerIds), true)); + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaFollowUpRecordController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaFollowUpRecordController.java new file mode 100644 index 0000000..c86d37a --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaFollowUpRecordController.java @@ -0,0 +1,108 @@ +package com.ruoyi.oa.controller; + +import java.util.List; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.core.validate.QueryGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.oa.domain.vo.OaFollowUpRecordVo; +import com.ruoyi.oa.domain.bo.OaFollowUpRecordBo; +import com.ruoyi.oa.service.IOaFollowUpRecordService; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * CRM 跟进记录 + * + * @author ruoyi + * @date 2025-03-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/followUpRecord") +public class OaFollowUpRecordController extends BaseController { + + private final IOaFollowUpRecordService iOaFollowUpRecordService; + + /** + * 查询CRM 跟进记录列表 + */ + @SaCheckPermission("system:followUpRecord:list") + @GetMapping("/list") + public TableDataInfo list(OaFollowUpRecordBo bo, PageQuery pageQuery) { + return iOaFollowUpRecordService.queryPageList(bo, pageQuery); + } + + /** + * 导出CRM 跟进记录列表 + */ + @SaCheckPermission("system:followUpRecord:export") + @Log(title = "CRM 跟进记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(OaFollowUpRecordBo bo, HttpServletResponse response) { + List list = iOaFollowUpRecordService.queryList(bo); + ExcelUtil.exportExcel(list, "CRM 跟进记录", OaFollowUpRecordVo.class, response); + } + + /** + * 获取CRM 跟进记录详细信息 + * + * @param followId 主键 + */ + @SaCheckPermission("system:followUpRecord:query") + @GetMapping("/{followId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long followId) { + return R.ok(iOaFollowUpRecordService.queryById(followId)); + } + + /** + * 新增CRM 跟进记录 + */ + @SaCheckPermission("system:followUpRecord:add") + @Log(title = "CRM 跟进记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody OaFollowUpRecordBo bo) { + return toAjax(iOaFollowUpRecordService.insertByBo(bo)); + } + + /** + * 修改CRM 跟进记录 + */ + @SaCheckPermission("system:followUpRecord:edit") + @Log(title = "CRM 跟进记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody OaFollowUpRecordBo bo) { + return toAjax(iOaFollowUpRecordService.updateByBo(bo)); + } + + /** + * 删除CRM 跟进记录 + * + * @param followIds 主键串 + */ + @SaCheckPermission("system:followUpRecord:remove") + @Log(title = "CRM 跟进记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{followIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] followIds) { + return toAjax(iOaFollowUpRecordService.deleteWithValidByIds(Arrays.asList(followIds), true)); + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProductController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProductController.java new file mode 100644 index 0000000..e8287c5 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProductController.java @@ -0,0 +1,108 @@ +package com.ruoyi.oa.controller; + +import java.util.List; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.core.validate.QueryGroup; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.oa.domain.vo.OaProductVo; +import com.ruoyi.oa.domain.bo.OaProductBo; +import com.ruoyi.oa.service.IOaProductService; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * CRM 产品 + * + * @author ruoyi + * @date 2025-03-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/product") +public class OaProductController extends BaseController { + + private final IOaProductService iOaProductService; + + /** + * 查询CRM 产品列表 + */ + @SaCheckPermission("oa:product:list") + @GetMapping("/list") + public TableDataInfo list(OaProductBo bo, PageQuery pageQuery) { + return iOaProductService.queryPageList(bo, pageQuery); + } + + /** + * 导出CRM 产品列表 + */ + @SaCheckPermission("oa:product:export") + @Log(title = "CRM 产品", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(OaProductBo bo, HttpServletResponse response) { + List list = iOaProductService.queryList(bo); + ExcelUtil.exportExcel(list, "CRM 产品", OaProductVo.class, response); + } + + /** + * 获取CRM 产品详细信息 + * + * @param productId 主键 + */ + @SaCheckPermission("oa:product:query") + @GetMapping("/{productId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long productId) { + return R.ok(iOaProductService.queryById(productId)); + } + + /** + * 新增CRM 产品 + */ + @SaCheckPermission("oa:product:add") + @Log(title = "CRM 产品", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody OaProductBo bo) { + return toAjax(iOaProductService.insertByBo(bo)); + } + + /** + * 修改CRM 产品 + */ + @SaCheckPermission("oa:product:edit") + @Log(title = "CRM 产品", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody OaProductBo bo) { + return toAjax(iOaProductService.updateByBo(bo)); + } + + /** + * 删除CRM 产品 + * + * @param productIds 主键串 + */ + @SaCheckPermission("oa:product:remove") + @Log(title = "CRM 产品", businessType = BusinessType.DELETE) + @DeleteMapping("/{productIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] productIds) { + return toAjax(iOaProductService.deleteWithValidByIds(Arrays.asList(productIds), true)); + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaBusiness.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaBusiness.java new file mode 100644 index 0000000..a788fa0 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaBusiness.java @@ -0,0 +1,99 @@ +package com.ruoyi.oa.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * CRM 商机对象 oa_business + * + * @author ruoyi + * @date 2025-03-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("oa_business") +public class OaBusiness extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 编号 + */ + @TableId(value = "business_id") + private Long businessId; + /** + * 商机名称 + */ + private String name; + /** + * 客户编号 + */ + private Long customerId; + /** + * 跟进状态 + */ + private Integer followUpStatus; + /** + * 最后跟进时间 + */ + private Date contactLastTime; + /** + * 下次联系时间 + */ + private Date contactNextTime; + /** + * 负责人的用户编号 + */ + private Long ownerUserId; + /** + * 商机状态类型编号 + */ + private Long statusTypeId; + /** + * 商机状态编号 + */ + private Long statusId; + /** + * 结束状态:1-赢单 2-输单3-无效 + */ + private Long endStatus; + /** + * 预计成交日期 + */ + private Date dealTime; + /** + * 产品总金额,单位:元 + */ + private BigDecimal totalProductPrice; + /** + * 整单折扣,百分比 + */ + private BigDecimal discountPercent; + /** + * 商机总金额,单位:元 + */ + private BigDecimal totalPrice; + /** + * 备注 + */ + private String remark; + /** + * 结束时的备注 + */ + private String endRemark; + /** + * 逻辑删除 + */ + @TableLogic + private Long delFlag; + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaBusinessProduct.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaBusinessProduct.java new file mode 100644 index 0000000..b53c51b --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaBusinessProduct.java @@ -0,0 +1,61 @@ +package com.ruoyi.oa.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * CRM 商机产品关联对象 oa_business_product + * + * @author ruoyi + * @date 2025-03-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("oa_business_product") +public class OaBusinessProduct extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 主键 + */ + @TableId(value = "business_product_id") + private Long businessProductId; + /** + * 商机编号 + */ + private Long businessId; + /** + * 产品编号 + */ + private Long productId; + /** + * 产品单价 + */ + private BigDecimal productPrice; + /** + * 商机价格 + */ + private BigDecimal businessPrice; + /** + * 数量 + */ + private BigDecimal count; + /** + * 总计价格 + */ + private BigDecimal totalPrice; + /** + * 是否删除 + */ + @TableLogic + private Long delFlag; + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaClue.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaClue.java new file mode 100644 index 0000000..eaf98c0 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaClue.java @@ -0,0 +1,114 @@ +package com.ruoyi.oa.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * CRM 线索对象 oa_clue + * + * @author ruoyi + * @date 2025-03-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("oa_clue") +public class OaClue extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 编号,主键自增 + */ + @TableId(value = "clue_id") + private Long clueId; + /** + * 线索名称 + */ + private String clueName; + /** + * 跟进状态 + */ + private Integer followUpStatus; + /** + * 最后跟进时间 + */ + private Date contactLastTime; + /** + * 最后跟进内容 + */ + private String contactLastContent; + /** + * 下次联系时间 + */ + private Date contactNextTime; + /** + * 负责人的用户编号 + */ + private Long ownerUserId; + /** + * 转化状态 + */ + private Integer transformStatus; + /** + * 客户编号 + */ + private Long customerId; + /** + * 手机号 + */ + private String mobile; + /** + * 电话 + */ + private String telephone; + /** + * QQ + */ + private String qq; + /** + * 微信 + */ + private String wechat; + /** + * 邮箱 + */ + private String email; + /** + * 地区编号 + */ + private Long areaId; + /** + * 详细地址 + */ + private String detailAddress; + /** + * 所属行业 + */ + private Long industryId; + /** + * 客户等级 + */ + private Long level; + /** + * 客户来源 + */ + private Long source; + /** + * 备注 + */ + private String remark; + /** + * 是否删除 + */ + @TableLogic + private Long delFlag; + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaCustomer.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaCustomer.java new file mode 100644 index 0000000..8e1ee5e --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaCustomer.java @@ -0,0 +1,114 @@ +package com.ruoyi.oa.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * CRM 客户对象 oa_customer + * + * @author ruoyi + * @date 2025-03-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("oa_customer") +public class OaCustomer extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 编号,主键自增 + */ + @TableId(value = "customer_id") + private Long customerId; + /** + * 客户名称 + */ + private String name; + /** + * 跟进状态 + */ + private Integer followUpStatus; + /** + * 最后跟进时间 + */ + private Date contactLastTime; + /** + * 最后跟进内容 + */ + private String contactLastContent; + /** + * 下次联系时间 + */ + private Date contactNextTime; + /** + * 负责人的用户编号 + */ + private Long ownerUserId; + /** + * 成为负责人的时间 + */ + private Date ownerTime; + /** + * 成交状态 + */ + private Long dealStatus; + /** + * 手机 + */ + private String mobile; + /** + * 电话 + */ + private String telephone; + /** + * QQ + */ + private String qq; + /** + * 微信 + */ + private String wechat; + /** + * 邮箱 + */ + private String email; + /** + * 地区编号 + */ + private Long areaId; + /** + * 详细地址 + */ + private String detailAddress; + /** + * 所属行业 + */ + private Long industryId; + /** + * 客户等级 + */ + private Long level; + /** + * 客户来源 + */ + private Long source; + /** + * 备注 + */ + private String remark; + /** + * 是否删除 + */ + @TableLogic + private Long delFlag; + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaFollowUpRecord.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaFollowUpRecord.java new file mode 100644 index 0000000..cc4ef8c --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaFollowUpRecord.java @@ -0,0 +1,70 @@ +package com.ruoyi.oa.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * CRM 跟进记录对象 oa_follow_up_record + * + * @author ruoyi + * @date 2025-03-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("oa_follow_up_record") +public class OaFollowUpRecord extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 编号 + */ + @TableId(value = "follow_id") + private Long followId; + /** + * 跟进类型 + */ + private Long type; + /** + * 跟进内容 + */ + private String content; + /** + * 下次联系时间 + */ + private Date nextTime; + /** + * 图片 + */ + private String picUrls; + /** + * 附件 + */ + private String fileUrls; + /** + * 关联的商机编号数组 + */ + private String businessIds; + /** + * 暂用此代替商机记录 + */ + private Long businessId; + /** + * 关联的联系人编号数组 + */ + private String contactIds; + /** + * 是否删除 + */ + @TableLogic + private Long delFlag; + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaProduct.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaProduct.java new file mode 100644 index 0000000..b1e99f0 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaProduct.java @@ -0,0 +1,68 @@ +package com.ruoyi.oa.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * CRM 产品对象 oa_product + * + * @author ruoyi + * @date 2025-03-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("oa_product") +public class OaProduct extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 产品编号 + */ + @TableId(value = "product_id") + private Long productId; + /** + * 产品名称 + */ + private String productName; + /** + * 产品编码 + */ + private String productNumber; + /** + * 单位 + */ + private Long unit; + /** + * 价格,单位:元 + */ + private BigDecimal price; + /** + * 状态 + */ + private Long status; + /** + * 产品分类编号 + */ + private Long categoryId; + /** + * 产品描述 + */ + private String description; + /** + * 负责人的用户编号 + */ + private Long ownerUserId; + /** + * 是否删除 + */ + private Long deleted; + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaBusinessBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaBusinessBo.java new file mode 100644 index 0000000..0fddeda --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaBusinessBo.java @@ -0,0 +1,124 @@ +package com.ruoyi.oa.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * CRM 商机业务对象 oa_business + * + * @author ruoyi + * @date 2025-03-12 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class OaBusinessBo extends BaseEntity { + + /** + * 编号 + */ + @NotNull(message = "编号不能为空", groups = { EditGroup.class }) + private Long businessId; + + /** + * 商机名称 + */ + @NotBlank(message = "商机名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 客户编号 + */ + @NotNull(message = "客户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long customerId; + + /** + * 跟进状态 + */ + @NotNull(message = "跟进状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer followUpStatus; + + /** + * 最后跟进时间 + */ + @NotNull(message = "最后跟进时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date contactLastTime; + + /** + * 下次联系时间 + */ + @NotNull(message = "下次联系时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date contactNextTime; + + /** + * 负责人的用户编号 + */ + @NotNull(message = "负责人的用户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long ownerUserId; + + /** + * 商机状态类型编号 + */ + @NotNull(message = "商机状态类型编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long statusTypeId; + + /** + * 商机状态编号 + */ + @NotNull(message = "商机状态编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long statusId; + + /** + * 结束状态:1-赢单 2-输单3-无效 + */ + @NotNull(message = "结束状态:1-赢单 2-输单3-无效不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long endStatus; + + /** + * 预计成交日期 + */ + @NotNull(message = "预计成交日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date dealTime; + + /** + * 产品总金额,单位:元 + */ + @NotNull(message = "产品总金额,单位:元不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal totalProductPrice; + + /** + * 整单折扣,百分比 + */ + @NotNull(message = "整单折扣,百分比不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal discountPercent; + + /** + * 商机总金额,单位:元 + */ + @NotNull(message = "商机总金额,单位:元不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal totalPrice; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + /** + * 结束时的备注 + */ + @NotBlank(message = "结束时的备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String endRemark; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaBusinessProductBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaBusinessProductBo.java new file mode 100644 index 0000000..fb61458 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaBusinessProductBo.java @@ -0,0 +1,68 @@ +package com.ruoyi.oa.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * CRM 商机产品关联业务对象 oa_business_product + * + * @author ruoyi + * @date 2025-03-12 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class OaBusinessProductBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long businessProductId; + + /** + * 商机编号 + */ + @NotNull(message = "商机编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long businessId; + + /** + * 产品编号 + */ + @NotNull(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long productId; + + /** + * 产品单价 + */ + @NotNull(message = "产品单价不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal productPrice; + + /** + * 商机价格 + */ + @NotNull(message = "商机价格不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal businessPrice; + + /** + * 数量 + */ + @NotNull(message = "数量不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal count; + + /** + * 总计价格 + */ + @NotNull(message = "总计价格不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal totalPrice; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaClueBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaClueBo.java new file mode 100644 index 0000000..8090af8 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaClueBo.java @@ -0,0 +1,147 @@ +package com.ruoyi.oa.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * CRM 线索业务对象 oa_clue + * + * @author ruoyi + * @date 2025-03-12 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class OaClueBo extends BaseEntity { + + /** + * 编号,主键自增 + */ + @NotNull(message = "编号,主键自增不能为空", groups = { EditGroup.class }) + private Long clueId; + + /** + * 线索名称 + */ + @NotBlank(message = "线索名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String clueName; + + /** + * 跟进状态 + */ + @NotNull(message = "跟进状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer followUpStatus; + + /** + * 最后跟进时间 + */ + @NotNull(message = "最后跟进时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date contactLastTime; + + /** + * 最后跟进内容 + */ + @NotBlank(message = "最后跟进内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactLastContent; + + /** + * 下次联系时间 + */ + @NotNull(message = "下次联系时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date contactNextTime; + + /** + * 负责人的用户编号 + */ + @NotNull(message = "负责人的用户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long ownerUserId; + + /** + * 转化状态 + */ + @NotNull(message = "转化状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer transformStatus; + + /** + * 客户编号 + */ + @NotNull(message = "客户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long customerId; + + /** + * 手机号 + */ + @NotBlank(message = "手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String mobile; + + /** + * 电话 + */ + @NotBlank(message = "电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String telephone; + + /** + * QQ + */ + @NotBlank(message = "QQ不能为空", groups = { AddGroup.class, EditGroup.class }) + private String qq; + + /** + * 微信 + */ + @NotBlank(message = "微信不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wechat; + + /** + * 邮箱 + */ + @NotBlank(message = "邮箱不能为空", groups = { AddGroup.class, EditGroup.class }) + private String email; + + /** + * 地区编号 + */ + @NotNull(message = "地区编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long areaId; + + /** + * 详细地址 + */ + @NotBlank(message = "详细地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String detailAddress; + + /** + * 所属行业 + */ + @NotNull(message = "所属行业不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long industryId; + + /** + * 客户等级 + */ + @NotNull(message = "客户等级不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long level; + + /** + * 客户来源 + */ + @NotNull(message = "客户来源不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long source; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaCustomerBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaCustomerBo.java new file mode 100644 index 0000000..d93a13e --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaCustomerBo.java @@ -0,0 +1,147 @@ +package com.ruoyi.oa.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * CRM 客户业务对象 oa_customer + * + * @author ruoyi + * @date 2025-03-12 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class OaCustomerBo extends BaseEntity { + + /** + * 编号,主键自增 + */ + @NotNull(message = "编号,主键自增不能为空", groups = { EditGroup.class }) + private Long customerId; + + /** + * 客户名称 + */ + @NotBlank(message = "客户名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 跟进状态 + */ + @NotNull(message = "跟进状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer followUpStatus; + + /** + * 最后跟进时间 + */ + @NotNull(message = "最后跟进时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date contactLastTime; + + /** + * 最后跟进内容 + */ + @NotBlank(message = "最后跟进内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactLastContent; + + /** + * 下次联系时间 + */ + @NotNull(message = "下次联系时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date contactNextTime; + + /** + * 负责人的用户编号 + */ + @NotNull(message = "负责人的用户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long ownerUserId; + + /** + * 成为负责人的时间 + */ + @NotNull(message = "成为负责人的时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date ownerTime; + + /** + * 成交状态 + */ + @NotNull(message = "成交状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long dealStatus; + + /** + * 手机 + */ + @NotBlank(message = "手机不能为空", groups = { AddGroup.class, EditGroup.class }) + private String mobile; + + /** + * 电话 + */ + @NotBlank(message = "电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String telephone; + + /** + * QQ + */ + @NotBlank(message = "QQ不能为空", groups = { AddGroup.class, EditGroup.class }) + private String qq; + + /** + * 微信 + */ + @NotBlank(message = "微信不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wechat; + + /** + * 邮箱 + */ + @NotBlank(message = "邮箱不能为空", groups = { AddGroup.class, EditGroup.class }) + private String email; + + /** + * 地区编号 + */ + @NotNull(message = "地区编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long areaId; + + /** + * 详细地址 + */ + @NotBlank(message = "详细地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String detailAddress; + + /** + * 所属行业 + */ + @NotNull(message = "所属行业不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long industryId; + + /** + * 客户等级 + */ + @NotNull(message = "客户等级不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long level; + + /** + * 客户来源 + */ + @NotNull(message = "客户来源不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long source; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaFollowUpRecordBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaFollowUpRecordBo.java new file mode 100644 index 0000000..78a5a81 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaFollowUpRecordBo.java @@ -0,0 +1,81 @@ +package com.ruoyi.oa.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * CRM 跟进记录业务对象 oa_follow_up_record + * + * @author ruoyi + * @date 2025-03-12 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class OaFollowUpRecordBo extends BaseEntity { + + /** + * 编号 + */ + @NotNull(message = "编号不能为空", groups = { EditGroup.class }) + private Long followId; + + /** + * 跟进类型 + */ + @NotNull(message = "跟进类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long type; + + /** + * 跟进内容 + */ + @NotBlank(message = "跟进内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String content; + + /** + * 下次联系时间 + */ + @NotNull(message = "下次联系时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date nextTime; + + /** + * 图片 + */ + @NotBlank(message = "图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String picUrls; + + /** + * 附件 + */ + @NotBlank(message = "附件不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fileUrls; + + /** + * 关联的商机编号数组 + */ + @NotBlank(message = "关联的商机编号数组不能为空", groups = { AddGroup.class, EditGroup.class }) + private String businessIds; + + /** + * 暂用此代替商机记录 + */ + @NotNull(message = "暂用此代替商机记录不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long businessId; + + /** + * 关联的联系人编号数组 + */ + @NotBlank(message = "关联的联系人编号数组不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactIds; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProductBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProductBo.java new file mode 100644 index 0000000..2b92a2e --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProductBo.java @@ -0,0 +1,86 @@ +package com.ruoyi.oa.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import java.math.BigDecimal; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * CRM 产品业务对象 oa_product + * + * @author ruoyi + * @date 2025-03-12 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class OaProductBo extends BaseEntity { + + /** + * 产品编号 + */ + @NotNull(message = "产品编号不能为空", groups = { EditGroup.class }) + private Long productId; + + /** + * 产品名称 + */ + @NotBlank(message = "产品名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String productName; + + /** + * 产品编码 + */ + @NotBlank(message = "产品编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String productNumber; + + /** + * 单位 + */ + @NotNull(message = "单位不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long unit; + + /** + * 价格,单位:元 + */ + @NotNull(message = "价格,单位:元不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal price; + + /** + * 状态 + */ + @NotNull(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long status; + + /** + * 产品分类编号 + */ + @NotNull(message = "产品分类编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long categoryId; + + /** + * 产品描述 + */ + @NotBlank(message = "产品描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String description; + + /** + * 负责人的用户编号 + */ + @NotNull(message = "负责人的用户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long ownerUserId; + + /** + * 是否删除 + */ + @NotNull(message = "是否删除不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long deleted; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaBusinessProductVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaBusinessProductVo.java new file mode 100644 index 0000000..549ac86 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaBusinessProductVo.java @@ -0,0 +1,68 @@ +package com.ruoyi.oa.domain.vo; + +import java.math.BigDecimal; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; +import lombok.Data; +import java.util.Date; + + + +/** + * CRM 商机产品关联视图对象 oa_business_product + * + * @author ruoyi + * @date 2025-03-12 + */ +@Data +@ExcelIgnoreUnannotated +public class OaBusinessProductVo { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long businessProductId; + + /** + * 商机编号 + */ + @ExcelProperty(value = "商机编号") + private Long businessId; + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private Long productId; + + /** + * 产品单价 + */ + @ExcelProperty(value = "产品单价") + private BigDecimal productPrice; + + /** + * 商机价格 + */ + @ExcelProperty(value = "商机价格") + private BigDecimal businessPrice; + + /** + * 数量 + */ + @ExcelProperty(value = "数量") + private BigDecimal count; + + /** + * 总计价格 + */ + @ExcelProperty(value = "总计价格") + private BigDecimal totalPrice; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaBusinessVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaBusinessVo.java new file mode 100644 index 0000000..e6c3b7f --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaBusinessVo.java @@ -0,0 +1,124 @@ +package com.ruoyi.oa.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.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; +import lombok.Data; +import java.util.Date; + + + +/** + * CRM 商机视图对象 oa_business + * + * @author ruoyi + * @date 2025-03-12 + */ +@Data +@ExcelIgnoreUnannotated +public class OaBusinessVo { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @ExcelProperty(value = "编号") + private Long businessId; + + /** + * 商机名称 + */ + @ExcelProperty(value = "商机名称") + private String name; + + /** + * 客户编号 + */ + @ExcelProperty(value = "客户编号") + private Long customerId; + + /** + * 跟进状态 + */ + @ExcelProperty(value = "跟进状态") + private Integer followUpStatus; + + /** + * 最后跟进时间 + */ + @ExcelProperty(value = "最后跟进时间") + private Date contactLastTime; + + /** + * 下次联系时间 + */ + @ExcelProperty(value = "下次联系时间") + private Date contactNextTime; + + /** + * 负责人的用户编号 + */ + @ExcelProperty(value = "负责人的用户编号") + private Long ownerUserId; + + /** + * 商机状态类型编号 + */ + @ExcelProperty(value = "商机状态类型编号") + private Long statusTypeId; + + /** + * 商机状态编号 + */ + @ExcelProperty(value = "商机状态编号") + private Long statusId; + + /** + * 结束状态:1-赢单 2-输单3-无效 + */ + @ExcelProperty(value = "结束状态:1-赢单 2-输单3-无效") + private Long endStatus; + + /** + * 预计成交日期 + */ + @ExcelProperty(value = "预计成交日期") + private Date dealTime; + + /** + * 产品总金额,单位:元 + */ + @ExcelProperty(value = "产品总金额,单位:元") + private BigDecimal totalProductPrice; + + /** + * 整单折扣,百分比 + */ + @ExcelProperty(value = "整单折扣,百分比") + private BigDecimal discountPercent; + + /** + * 商机总金额,单位:元 + */ + @ExcelProperty(value = "商机总金额,单位:元") + private BigDecimal totalPrice; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 结束时的备注 + */ + @ExcelProperty(value = "结束时的备注") + private String endRemark; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaClueVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaClueVo.java new file mode 100644 index 0000000..0eb17f9 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaClueVo.java @@ -0,0 +1,147 @@ +package com.ruoyi.oa.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.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; +import lombok.Data; +import java.util.Date; + + + +/** + * CRM 线索视图对象 oa_clue + * + * @author ruoyi + * @date 2025-03-12 + */ +@Data +@ExcelIgnoreUnannotated +public class OaClueVo { + + private static final long serialVersionUID = 1L; + + /** + * 编号,主键自增 + */ + @ExcelProperty(value = "编号,主键自增") + private Long clueId; + + /** + * 线索名称 + */ + @ExcelProperty(value = "线索名称") + private String clueName; + + /** + * 跟进状态 + */ + @ExcelProperty(value = "跟进状态") + private Integer followUpStatus; + + /** + * 最后跟进时间 + */ + @ExcelProperty(value = "最后跟进时间") + private Date contactLastTime; + + /** + * 最后跟进内容 + */ + @ExcelProperty(value = "最后跟进内容") + private String contactLastContent; + + /** + * 下次联系时间 + */ + @ExcelProperty(value = "下次联系时间") + private Date contactNextTime; + + /** + * 负责人的用户编号 + */ + @ExcelProperty(value = "负责人的用户编号") + private Long ownerUserId; + + /** + * 转化状态 + */ + @ExcelProperty(value = "转化状态") + private Integer transformStatus; + + /** + * 客户编号 + */ + @ExcelProperty(value = "客户编号") + private Long customerId; + + /** + * 手机号 + */ + @ExcelProperty(value = "手机号") + private String mobile; + + /** + * 电话 + */ + @ExcelProperty(value = "电话") + private String telephone; + + /** + * QQ + */ + @ExcelProperty(value = "QQ") + private String qq; + + /** + * 微信 + */ + @ExcelProperty(value = "微信") + private String wechat; + + /** + * 邮箱 + */ + @ExcelProperty(value = "邮箱") + private String email; + + /** + * 地区编号 + */ + @ExcelProperty(value = "地区编号") + private Long areaId; + + /** + * 详细地址 + */ + @ExcelProperty(value = "详细地址") + private String detailAddress; + + /** + * 所属行业 + */ + @ExcelProperty(value = "所属行业") + private Long industryId; + + /** + * 客户等级 + */ + @ExcelProperty(value = "客户等级") + private Long level; + + /** + * 客户来源 + */ + @ExcelProperty(value = "客户来源") + private Long source; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaCustomerVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaCustomerVo.java new file mode 100644 index 0000000..6687743 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaCustomerVo.java @@ -0,0 +1,147 @@ +package com.ruoyi.oa.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.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; +import lombok.Data; +import java.util.Date; + + + +/** + * CRM 客户视图对象 oa_customer + * + * @author ruoyi + * @date 2025-03-12 + */ +@Data +@ExcelIgnoreUnannotated +public class OaCustomerVo { + + private static final long serialVersionUID = 1L; + + /** + * 编号,主键自增 + */ + @ExcelProperty(value = "编号,主键自增") + private Long customerId; + + /** + * 客户名称 + */ + @ExcelProperty(value = "客户名称") + private String name; + + /** + * 跟进状态 + */ + @ExcelProperty(value = "跟进状态") + private Integer followUpStatus; + + /** + * 最后跟进时间 + */ + @ExcelProperty(value = "最后跟进时间") + private Date contactLastTime; + + /** + * 最后跟进内容 + */ + @ExcelProperty(value = "最后跟进内容") + private String contactLastContent; + + /** + * 下次联系时间 + */ + @ExcelProperty(value = "下次联系时间") + private Date contactNextTime; + + /** + * 负责人的用户编号 + */ + @ExcelProperty(value = "负责人的用户编号") + private Long ownerUserId; + + /** + * 成为负责人的时间 + */ + @ExcelProperty(value = "成为负责人的时间") + private Date ownerTime; + + /** + * 成交状态 + */ + @ExcelProperty(value = "成交状态") + private Long dealStatus; + + /** + * 手机 + */ + @ExcelProperty(value = "手机") + private String mobile; + + /** + * 电话 + */ + @ExcelProperty(value = "电话") + private String telephone; + + /** + * QQ + */ + @ExcelProperty(value = "QQ") + private String qq; + + /** + * 微信 + */ + @ExcelProperty(value = "微信") + private String wechat; + + /** + * 邮箱 + */ + @ExcelProperty(value = "邮箱") + private String email; + + /** + * 地区编号 + */ + @ExcelProperty(value = "地区编号") + private Long areaId; + + /** + * 详细地址 + */ + @ExcelProperty(value = "详细地址") + private String detailAddress; + + /** + * 所属行业 + */ + @ExcelProperty(value = "所属行业") + private Long industryId; + + /** + * 客户等级 + */ + @ExcelProperty(value = "客户等级") + private Long level; + + /** + * 客户来源 + */ + @ExcelProperty(value = "客户来源") + private Long source; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaFollowUpRecordVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaFollowUpRecordVo.java new file mode 100644 index 0000000..35dd880 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaFollowUpRecordVo.java @@ -0,0 +1,81 @@ +package com.ruoyi.oa.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.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; +import lombok.Data; +import java.util.Date; + + + +/** + * CRM 跟进记录视图对象 oa_follow_up_record + * + * @author ruoyi + * @date 2025-03-12 + */ +@Data +@ExcelIgnoreUnannotated +public class OaFollowUpRecordVo { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @ExcelProperty(value = "编号") + private Long followId; + + /** + * 跟进类型 + */ + @ExcelProperty(value = "跟进类型") + private Long type; + + /** + * 跟进内容 + */ + @ExcelProperty(value = "跟进内容") + private String content; + + /** + * 下次联系时间 + */ + @ExcelProperty(value = "下次联系时间") + private Date nextTime; + + /** + * 图片 + */ + @ExcelProperty(value = "图片") + private String picUrls; + + /** + * 附件 + */ + @ExcelProperty(value = "附件") + private String fileUrls; + + /** + * 关联的商机编号数组 + */ + @ExcelProperty(value = "关联的商机编号数组") + private String businessIds; + + /** + * 暂用此代替商机记录 + */ + @ExcelProperty(value = "暂用此代替商机记录") + private Long businessId; + + /** + * 关联的联系人编号数组 + */ + @ExcelProperty(value = "关联的联系人编号数组") + private String contactIds; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProductVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProductVo.java new file mode 100644 index 0000000..ba16fda --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProductVo.java @@ -0,0 +1,86 @@ +package com.ruoyi.oa.domain.vo; + +import java.math.BigDecimal; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; +import lombok.Data; +import java.util.Date; + + + +/** + * CRM 产品视图对象 oa_product + * + * @author ruoyi + * @date 2025-03-12 + */ +@Data +@ExcelIgnoreUnannotated +public class OaProductVo { + + private static final long serialVersionUID = 1L; + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private Long productId; + + /** + * 产品名称 + */ + @ExcelProperty(value = "产品名称") + private String productName; + + /** + * 产品编码 + */ + @ExcelProperty(value = "产品编码") + private String productNumber; + + /** + * 单位 + */ + @ExcelProperty(value = "单位") + private Long unit; + + /** + * 价格,单位:元 + */ + @ExcelProperty(value = "价格,单位:元") + private BigDecimal price; + + /** + * 状态 + */ + @ExcelProperty(value = "状态") + private Long status; + + /** + * 产品分类编号 + */ + @ExcelProperty(value = "产品分类编号") + private Long categoryId; + + /** + * 产品描述 + */ + @ExcelProperty(value = "产品描述") + private String description; + + /** + * 负责人的用户编号 + */ + @ExcelProperty(value = "负责人的用户编号") + private Long ownerUserId; + + /** + * 是否删除 + */ + @ExcelProperty(value = "是否删除") + private Long deleted; + + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaBusinessMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaBusinessMapper.java new file mode 100644 index 0000000..2a27f0a --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaBusinessMapper.java @@ -0,0 +1,15 @@ +package com.ruoyi.oa.mapper; + +import com.ruoyi.oa.domain.OaBusiness; +import com.ruoyi.oa.domain.vo.OaBusinessVo; +import com.ruoyi.common.core.mapper.BaseMapperPlus; + +/** + * CRM 商机Mapper接口 + * + * @author ruoyi + * @date 2025-03-12 + */ +public interface OaBusinessMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaBusinessProductMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaBusinessProductMapper.java new file mode 100644 index 0000000..4619e24 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaBusinessProductMapper.java @@ -0,0 +1,15 @@ +package com.ruoyi.oa.mapper; + +import com.ruoyi.oa.domain.OaBusinessProduct; +import com.ruoyi.oa.domain.vo.OaBusinessProductVo; +import com.ruoyi.common.core.mapper.BaseMapperPlus; + +/** + * CRM 商机产品关联Mapper接口 + * + * @author ruoyi + * @date 2025-03-12 + */ +public interface OaBusinessProductMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaClueMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaClueMapper.java new file mode 100644 index 0000000..0ecc882 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaClueMapper.java @@ -0,0 +1,15 @@ +package com.ruoyi.oa.mapper; + +import com.ruoyi.oa.domain.OaClue; +import com.ruoyi.oa.domain.vo.OaClueVo; +import com.ruoyi.common.core.mapper.BaseMapperPlus; + +/** + * CRM 线索Mapper接口 + * + * @author ruoyi + * @date 2025-03-12 + */ +public interface OaClueMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaCustomerMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaCustomerMapper.java new file mode 100644 index 0000000..ffc264e --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaCustomerMapper.java @@ -0,0 +1,15 @@ +package com.ruoyi.oa.mapper; + +import com.ruoyi.oa.domain.OaCustomer; +import com.ruoyi.oa.domain.vo.OaCustomerVo; +import com.ruoyi.common.core.mapper.BaseMapperPlus; + +/** + * CRM 客户Mapper接口 + * + * @author ruoyi + * @date 2025-03-12 + */ +public interface OaCustomerMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaFollowUpRecordMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaFollowUpRecordMapper.java new file mode 100644 index 0000000..bdf1d24 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaFollowUpRecordMapper.java @@ -0,0 +1,15 @@ +package com.ruoyi.oa.mapper; + +import com.ruoyi.oa.domain.OaFollowUpRecord; +import com.ruoyi.oa.domain.vo.OaFollowUpRecordVo; +import com.ruoyi.common.core.mapper.BaseMapperPlus; + +/** + * CRM 跟进记录Mapper接口 + * + * @author ruoyi + * @date 2025-03-12 + */ +public interface OaFollowUpRecordMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaProductMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaProductMapper.java new file mode 100644 index 0000000..9aad6a9 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaProductMapper.java @@ -0,0 +1,15 @@ +package com.ruoyi.oa.mapper; + +import com.ruoyi.oa.domain.OaProduct; +import com.ruoyi.oa.domain.vo.OaProductVo; +import com.ruoyi.common.core.mapper.BaseMapperPlus; + +/** + * CRM 产品Mapper接口 + * + * @author ruoyi + * @date 2025-03-12 + */ +public interface OaProductMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaBusinessProductService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaBusinessProductService.java new file mode 100644 index 0000000..ff2bf28 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaBusinessProductService.java @@ -0,0 +1,49 @@ +package com.ruoyi.oa.service; + +import com.ruoyi.oa.domain.OaBusinessProduct; +import com.ruoyi.oa.domain.vo.OaBusinessProductVo; +import com.ruoyi.oa.domain.bo.OaBusinessProductBo; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * CRM 商机产品关联Service接口 + * + * @author ruoyi + * @date 2025-03-12 + */ +public interface IOaBusinessProductService { + + /** + * 查询CRM 商机产品关联 + */ + OaBusinessProductVo queryById(Long businessProductId); + + /** + * 查询CRM 商机产品关联列表 + */ + TableDataInfo queryPageList(OaBusinessProductBo bo, PageQuery pageQuery); + + /** + * 查询CRM 商机产品关联列表 + */ + List queryList(OaBusinessProductBo bo); + + /** + * 新增CRM 商机产品关联 + */ + Boolean insertByBo(OaBusinessProductBo bo); + + /** + * 修改CRM 商机产品关联 + */ + Boolean updateByBo(OaBusinessProductBo bo); + + /** + * 校验并批量删除CRM 商机产品关联信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaBusinessService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaBusinessService.java new file mode 100644 index 0000000..e81dcfd --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaBusinessService.java @@ -0,0 +1,49 @@ +package com.ruoyi.oa.service; + +import com.ruoyi.oa.domain.OaBusiness; +import com.ruoyi.oa.domain.vo.OaBusinessVo; +import com.ruoyi.oa.domain.bo.OaBusinessBo; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * CRM 商机Service接口 + * + * @author ruoyi + * @date 2025-03-12 + */ +public interface IOaBusinessService { + + /** + * 查询CRM 商机 + */ + OaBusinessVo queryById(Long businessId); + + /** + * 查询CRM 商机列表 + */ + TableDataInfo queryPageList(OaBusinessBo bo, PageQuery pageQuery); + + /** + * 查询CRM 商机列表 + */ + List queryList(OaBusinessBo bo); + + /** + * 新增CRM 商机 + */ + Boolean insertByBo(OaBusinessBo bo); + + /** + * 修改CRM 商机 + */ + Boolean updateByBo(OaBusinessBo bo); + + /** + * 校验并批量删除CRM 商机信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaClueService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaClueService.java new file mode 100644 index 0000000..bf1c1f4 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaClueService.java @@ -0,0 +1,49 @@ +package com.ruoyi.oa.service; + +import com.ruoyi.oa.domain.OaClue; +import com.ruoyi.oa.domain.vo.OaClueVo; +import com.ruoyi.oa.domain.bo.OaClueBo; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * CRM 线索Service接口 + * + * @author ruoyi + * @date 2025-03-12 + */ +public interface IOaClueService { + + /** + * 查询CRM 线索 + */ + OaClueVo queryById(Long clueId); + + /** + * 查询CRM 线索列表 + */ + TableDataInfo queryPageList(OaClueBo bo, PageQuery pageQuery); + + /** + * 查询CRM 线索列表 + */ + List queryList(OaClueBo bo); + + /** + * 新增CRM 线索 + */ + Boolean insertByBo(OaClueBo bo); + + /** + * 修改CRM 线索 + */ + Boolean updateByBo(OaClueBo bo); + + /** + * 校验并批量删除CRM 线索信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaCustomerService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaCustomerService.java new file mode 100644 index 0000000..7a6b208 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaCustomerService.java @@ -0,0 +1,49 @@ +package com.ruoyi.oa.service; + +import com.ruoyi.oa.domain.OaCustomer; +import com.ruoyi.oa.domain.vo.OaCustomerVo; +import com.ruoyi.oa.domain.bo.OaCustomerBo; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * CRM 客户Service接口 + * + * @author ruoyi + * @date 2025-03-12 + */ +public interface IOaCustomerService { + + /** + * 查询CRM 客户 + */ + OaCustomerVo queryById(Long customerId); + + /** + * 查询CRM 客户列表 + */ + TableDataInfo queryPageList(OaCustomerBo bo, PageQuery pageQuery); + + /** + * 查询CRM 客户列表 + */ + List queryList(OaCustomerBo bo); + + /** + * 新增CRM 客户 + */ + Boolean insertByBo(OaCustomerBo bo); + + /** + * 修改CRM 客户 + */ + Boolean updateByBo(OaCustomerBo bo); + + /** + * 校验并批量删除CRM 客户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaFollowUpRecordService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaFollowUpRecordService.java new file mode 100644 index 0000000..421af46 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaFollowUpRecordService.java @@ -0,0 +1,49 @@ +package com.ruoyi.oa.service; + +import com.ruoyi.oa.domain.OaFollowUpRecord; +import com.ruoyi.oa.domain.vo.OaFollowUpRecordVo; +import com.ruoyi.oa.domain.bo.OaFollowUpRecordBo; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * CRM 跟进记录Service接口 + * + * @author ruoyi + * @date 2025-03-12 + */ +public interface IOaFollowUpRecordService { + + /** + * 查询CRM 跟进记录 + */ + OaFollowUpRecordVo queryById(Long followId); + + /** + * 查询CRM 跟进记录列表 + */ + TableDataInfo queryPageList(OaFollowUpRecordBo bo, PageQuery pageQuery); + + /** + * 查询CRM 跟进记录列表 + */ + List queryList(OaFollowUpRecordBo bo); + + /** + * 新增CRM 跟进记录 + */ + Boolean insertByBo(OaFollowUpRecordBo bo); + + /** + * 修改CRM 跟进记录 + */ + Boolean updateByBo(OaFollowUpRecordBo bo); + + /** + * 校验并批量删除CRM 跟进记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProductService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProductService.java new file mode 100644 index 0000000..b9eab30 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProductService.java @@ -0,0 +1,49 @@ +package com.ruoyi.oa.service; + +import com.ruoyi.oa.domain.OaProduct; +import com.ruoyi.oa.domain.vo.OaProductVo; +import com.ruoyi.oa.domain.bo.OaProductBo; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * CRM 产品Service接口 + * + * @author ruoyi + * @date 2025-03-12 + */ +public interface IOaProductService { + + /** + * 查询CRM 产品 + */ + OaProductVo queryById(Long productId); + + /** + * 查询CRM 产品列表 + */ + TableDataInfo queryPageList(OaProductBo bo, PageQuery pageQuery); + + /** + * 查询CRM 产品列表 + */ + List queryList(OaProductBo bo); + + /** + * 新增CRM 产品 + */ + Boolean insertByBo(OaProductBo bo); + + /** + * 修改CRM 产品 + */ + Boolean updateByBo(OaProductBo bo); + + /** + * 校验并批量删除CRM 产品信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaBusinessProductServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaBusinessProductServiceImpl.java new file mode 100644 index 0000000..190ecee --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaBusinessProductServiceImpl.java @@ -0,0 +1,114 @@ +package com.ruoyi.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.ruoyi.oa.domain.bo.OaBusinessProductBo; +import com.ruoyi.oa.domain.vo.OaBusinessProductVo; +import com.ruoyi.oa.domain.OaBusinessProduct; +import com.ruoyi.oa.mapper.OaBusinessProductMapper; +import com.ruoyi.oa.service.IOaBusinessProductService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * CRM 商机产品关联Service业务层处理 + * + * @author ruoyi + * @date 2025-03-12 + */ +@RequiredArgsConstructor +@Service +public class OaBusinessProductServiceImpl implements IOaBusinessProductService { + + private final OaBusinessProductMapper baseMapper; + + /** + * 查询CRM 商机产品关联 + */ + @Override + public OaBusinessProductVo queryById(Long businessProductId){ + return baseMapper.selectVoById(businessProductId); + } + + /** + * 查询CRM 商机产品关联列表 + */ + @Override + public TableDataInfo queryPageList(OaBusinessProductBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询CRM 商机产品关联列表 + */ + @Override + public List queryList(OaBusinessProductBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(OaBusinessProductBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getBusinessId() != null, OaBusinessProduct::getBusinessId, bo.getBusinessId()); + lqw.eq(bo.getProductId() != null, OaBusinessProduct::getProductId, bo.getProductId()); + lqw.eq(bo.getProductPrice() != null, OaBusinessProduct::getProductPrice, bo.getProductPrice()); + lqw.eq(bo.getBusinessPrice() != null, OaBusinessProduct::getBusinessPrice, bo.getBusinessPrice()); + lqw.eq(bo.getCount() != null, OaBusinessProduct::getCount, bo.getCount()); + lqw.eq(bo.getTotalPrice() != null, OaBusinessProduct::getTotalPrice, bo.getTotalPrice()); + return lqw; + } + + /** + * 新增CRM 商机产品关联 + */ + @Override + public Boolean insertByBo(OaBusinessProductBo bo) { + OaBusinessProduct add = BeanUtil.toBean(bo, OaBusinessProduct.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setBusinessProductId(add.getBusinessProductId()); + } + return flag; + } + + /** + * 修改CRM 商机产品关联 + */ + @Override + public Boolean updateByBo(OaBusinessProductBo bo) { + OaBusinessProduct update = BeanUtil.toBean(bo, OaBusinessProduct.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(OaBusinessProduct entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除CRM 商机产品关联 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaBusinessServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaBusinessServiceImpl.java new file mode 100644 index 0000000..d998832 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaBusinessServiceImpl.java @@ -0,0 +1,122 @@ +package com.ruoyi.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.ruoyi.oa.domain.bo.OaBusinessBo; +import com.ruoyi.oa.domain.vo.OaBusinessVo; +import com.ruoyi.oa.domain.OaBusiness; +import com.ruoyi.oa.mapper.OaBusinessMapper; +import com.ruoyi.oa.service.IOaBusinessService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * CRM 商机Service业务层处理 + * + * @author ruoyi + * @date 2025-03-12 + */ +@RequiredArgsConstructor +@Service +public class OaBusinessServiceImpl implements IOaBusinessService { + + private final OaBusinessMapper baseMapper; + + /** + * 查询CRM 商机 + */ + @Override + public OaBusinessVo queryById(Long businessId){ + return baseMapper.selectVoById(businessId); + } + + /** + * 查询CRM 商机列表 + */ + @Override + public TableDataInfo queryPageList(OaBusinessBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询CRM 商机列表 + */ + @Override + public List queryList(OaBusinessBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(OaBusinessBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getName()), OaBusiness::getName, bo.getName()); + lqw.eq(bo.getCustomerId() != null, OaBusiness::getCustomerId, bo.getCustomerId()); + lqw.eq(bo.getFollowUpStatus() != null, OaBusiness::getFollowUpStatus, bo.getFollowUpStatus()); + lqw.eq(bo.getContactLastTime() != null, OaBusiness::getContactLastTime, bo.getContactLastTime()); + lqw.eq(bo.getContactNextTime() != null, OaBusiness::getContactNextTime, bo.getContactNextTime()); + lqw.eq(bo.getOwnerUserId() != null, OaBusiness::getOwnerUserId, bo.getOwnerUserId()); + lqw.eq(bo.getStatusTypeId() != null, OaBusiness::getStatusTypeId, bo.getStatusTypeId()); + lqw.eq(bo.getStatusId() != null, OaBusiness::getStatusId, bo.getStatusId()); + lqw.eq(bo.getEndStatus() != null, OaBusiness::getEndStatus, bo.getEndStatus()); + lqw.eq(bo.getDealTime() != null, OaBusiness::getDealTime, bo.getDealTime()); + lqw.eq(bo.getTotalProductPrice() != null, OaBusiness::getTotalProductPrice, bo.getTotalProductPrice()); + lqw.eq(bo.getDiscountPercent() != null, OaBusiness::getDiscountPercent, bo.getDiscountPercent()); + lqw.eq(bo.getTotalPrice() != null, OaBusiness::getTotalPrice, bo.getTotalPrice()); + lqw.eq(StringUtils.isNotBlank(bo.getEndRemark()), OaBusiness::getEndRemark, bo.getEndRemark()); + return lqw; + } + + /** + * 新增CRM 商机 + */ + @Override + public Boolean insertByBo(OaBusinessBo bo) { + OaBusiness add = BeanUtil.toBean(bo, OaBusiness.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setBusinessId(add.getBusinessId()); + } + return flag; + } + + /** + * 修改CRM 商机 + */ + @Override + public Boolean updateByBo(OaBusinessBo bo) { + OaBusiness update = BeanUtil.toBean(bo, OaBusiness.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(OaBusiness entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除CRM 商机 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaClueServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaClueServiceImpl.java new file mode 100644 index 0000000..b6534f7 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaClueServiceImpl.java @@ -0,0 +1,126 @@ +package com.ruoyi.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.ruoyi.oa.domain.bo.OaClueBo; +import com.ruoyi.oa.domain.vo.OaClueVo; +import com.ruoyi.oa.domain.OaClue; +import com.ruoyi.oa.mapper.OaClueMapper; +import com.ruoyi.oa.service.IOaClueService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * CRM 线索Service业务层处理 + * + * @author ruoyi + * @date 2025-03-12 + */ +@RequiredArgsConstructor +@Service +public class OaClueServiceImpl implements IOaClueService { + + private final OaClueMapper baseMapper; + + /** + * 查询CRM 线索 + */ + @Override + public OaClueVo queryById(Long clueId){ + return baseMapper.selectVoById(clueId); + } + + /** + * 查询CRM 线索列表 + */ + @Override + public TableDataInfo queryPageList(OaClueBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询CRM 线索列表 + */ + @Override + public List queryList(OaClueBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(OaClueBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getClueName()), OaClue::getClueName, bo.getClueName()); + lqw.eq(bo.getFollowUpStatus() != null, OaClue::getFollowUpStatus, bo.getFollowUpStatus()); + lqw.eq(bo.getContactLastTime() != null, OaClue::getContactLastTime, bo.getContactLastTime()); + lqw.eq(StringUtils.isNotBlank(bo.getContactLastContent()), OaClue::getContactLastContent, bo.getContactLastContent()); + lqw.eq(bo.getContactNextTime() != null, OaClue::getContactNextTime, bo.getContactNextTime()); + lqw.eq(bo.getOwnerUserId() != null, OaClue::getOwnerUserId, bo.getOwnerUserId()); + lqw.eq(bo.getTransformStatus() != null, OaClue::getTransformStatus, bo.getTransformStatus()); + lqw.eq(bo.getCustomerId() != null, OaClue::getCustomerId, bo.getCustomerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMobile()), OaClue::getMobile, bo.getMobile()); + lqw.eq(StringUtils.isNotBlank(bo.getTelephone()), OaClue::getTelephone, bo.getTelephone()); + lqw.eq(StringUtils.isNotBlank(bo.getQq()), OaClue::getQq, bo.getQq()); + lqw.eq(StringUtils.isNotBlank(bo.getWechat()), OaClue::getWechat, bo.getWechat()); + lqw.eq(StringUtils.isNotBlank(bo.getEmail()), OaClue::getEmail, bo.getEmail()); + lqw.eq(bo.getAreaId() != null, OaClue::getAreaId, bo.getAreaId()); + lqw.like(StringUtils.isNotBlank(bo.getDetailAddress()), OaClue::getDetailAddress, bo.getDetailAddress()); + lqw.eq(bo.getIndustryId() != null, OaClue::getIndustryId, bo.getIndustryId()); + lqw.eq(bo.getLevel() != null, OaClue::getLevel, bo.getLevel()); + lqw.eq(bo.getSource() != null, OaClue::getSource, bo.getSource()); + return lqw; + } + + /** + * 新增CRM 线索 + */ + @Override + public Boolean insertByBo(OaClueBo bo) { + OaClue add = BeanUtil.toBean(bo, OaClue.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setClueId(add.getClueId()); + } + return flag; + } + + /** + * 修改CRM 线索 + */ + @Override + public Boolean updateByBo(OaClueBo bo) { + OaClue update = BeanUtil.toBean(bo, OaClue.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(OaClue entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除CRM 线索 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaCustomerServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaCustomerServiceImpl.java new file mode 100644 index 0000000..b4670fd --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaCustomerServiceImpl.java @@ -0,0 +1,126 @@ +package com.ruoyi.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.ruoyi.oa.domain.bo.OaCustomerBo; +import com.ruoyi.oa.domain.vo.OaCustomerVo; +import com.ruoyi.oa.domain.OaCustomer; +import com.ruoyi.oa.mapper.OaCustomerMapper; +import com.ruoyi.oa.service.IOaCustomerService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * CRM 客户Service业务层处理 + * + * @author ruoyi + * @date 2025-03-12 + */ +@RequiredArgsConstructor +@Service +public class OaCustomerServiceImpl implements IOaCustomerService { + + private final OaCustomerMapper baseMapper; + + /** + * 查询CRM 客户 + */ + @Override + public OaCustomerVo queryById(Long customerId){ + return baseMapper.selectVoById(customerId); + } + + /** + * 查询CRM 客户列表 + */ + @Override + public TableDataInfo queryPageList(OaCustomerBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询CRM 客户列表 + */ + @Override + public List queryList(OaCustomerBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(OaCustomerBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getName()), OaCustomer::getName, bo.getName()); + lqw.eq(bo.getFollowUpStatus() != null, OaCustomer::getFollowUpStatus, bo.getFollowUpStatus()); + lqw.eq(bo.getContactLastTime() != null, OaCustomer::getContactLastTime, bo.getContactLastTime()); + lqw.eq(StringUtils.isNotBlank(bo.getContactLastContent()), OaCustomer::getContactLastContent, bo.getContactLastContent()); + lqw.eq(bo.getContactNextTime() != null, OaCustomer::getContactNextTime, bo.getContactNextTime()); + lqw.eq(bo.getOwnerUserId() != null, OaCustomer::getOwnerUserId, bo.getOwnerUserId()); + lqw.eq(bo.getOwnerTime() != null, OaCustomer::getOwnerTime, bo.getOwnerTime()); + lqw.eq(bo.getDealStatus() != null, OaCustomer::getDealStatus, bo.getDealStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getMobile()), OaCustomer::getMobile, bo.getMobile()); + lqw.eq(StringUtils.isNotBlank(bo.getTelephone()), OaCustomer::getTelephone, bo.getTelephone()); + lqw.eq(StringUtils.isNotBlank(bo.getQq()), OaCustomer::getQq, bo.getQq()); + lqw.eq(StringUtils.isNotBlank(bo.getWechat()), OaCustomer::getWechat, bo.getWechat()); + lqw.eq(StringUtils.isNotBlank(bo.getEmail()), OaCustomer::getEmail, bo.getEmail()); + lqw.eq(bo.getAreaId() != null, OaCustomer::getAreaId, bo.getAreaId()); + lqw.like(StringUtils.isNotBlank(bo.getDetailAddress()), OaCustomer::getDetailAddress, bo.getDetailAddress()); + lqw.eq(bo.getIndustryId() != null, OaCustomer::getIndustryId, bo.getIndustryId()); + lqw.eq(bo.getLevel() != null, OaCustomer::getLevel, bo.getLevel()); + lqw.eq(bo.getSource() != null, OaCustomer::getSource, bo.getSource()); + return lqw; + } + + /** + * 新增CRM 客户 + */ + @Override + public Boolean insertByBo(OaCustomerBo bo) { + OaCustomer add = BeanUtil.toBean(bo, OaCustomer.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setCustomerId(add.getCustomerId()); + } + return flag; + } + + /** + * 修改CRM 客户 + */ + @Override + public Boolean updateByBo(OaCustomerBo bo) { + OaCustomer update = BeanUtil.toBean(bo, OaCustomer.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(OaCustomer entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除CRM 客户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaFollowUpRecordServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaFollowUpRecordServiceImpl.java new file mode 100644 index 0000000..1b5a0d7 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaFollowUpRecordServiceImpl.java @@ -0,0 +1,116 @@ +package com.ruoyi.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.ruoyi.oa.domain.bo.OaFollowUpRecordBo; +import com.ruoyi.oa.domain.vo.OaFollowUpRecordVo; +import com.ruoyi.oa.domain.OaFollowUpRecord; +import com.ruoyi.oa.mapper.OaFollowUpRecordMapper; +import com.ruoyi.oa.service.IOaFollowUpRecordService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * CRM 跟进记录Service业务层处理 + * + * @author ruoyi + * @date 2025-03-12 + */ +@RequiredArgsConstructor +@Service +public class OaFollowUpRecordServiceImpl implements IOaFollowUpRecordService { + + private final OaFollowUpRecordMapper baseMapper; + + /** + * 查询CRM 跟进记录 + */ + @Override + public OaFollowUpRecordVo queryById(Long followId){ + return baseMapper.selectVoById(followId); + } + + /** + * 查询CRM 跟进记录列表 + */ + @Override + public TableDataInfo queryPageList(OaFollowUpRecordBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询CRM 跟进记录列表 + */ + @Override + public List queryList(OaFollowUpRecordBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(OaFollowUpRecordBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getType() != null, OaFollowUpRecord::getType, bo.getType()); + lqw.like(StringUtils.isNotBlank(bo.getContent()), OaFollowUpRecord::getContent, bo.getContent()); + lqw.eq(bo.getNextTime() != null, OaFollowUpRecord::getNextTime, bo.getNextTime()); + lqw.eq(StringUtils.isNotBlank(bo.getPicUrls()), OaFollowUpRecord::getPicUrls, bo.getPicUrls()); + lqw.eq(StringUtils.isNotBlank(bo.getFileUrls()), OaFollowUpRecord::getFileUrls, bo.getFileUrls()); + lqw.eq(StringUtils.isNotBlank(bo.getBusinessIds()), OaFollowUpRecord::getBusinessIds, bo.getBusinessIds()); + lqw.eq(bo.getBusinessId() != null, OaFollowUpRecord::getBusinessId, bo.getBusinessId()); + lqw.eq(StringUtils.isNotBlank(bo.getContactIds()), OaFollowUpRecord::getContactIds, bo.getContactIds()); + return lqw; + } + + /** + * 新增CRM 跟进记录 + */ + @Override + public Boolean insertByBo(OaFollowUpRecordBo bo) { + OaFollowUpRecord add = BeanUtil.toBean(bo, OaFollowUpRecord.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setFollowId(add.getFollowId()); + } + return flag; + } + + /** + * 修改CRM 跟进记录 + */ + @Override + public Boolean updateByBo(OaFollowUpRecordBo bo) { + OaFollowUpRecord update = BeanUtil.toBean(bo, OaFollowUpRecord.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(OaFollowUpRecord entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除CRM 跟进记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProductServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProductServiceImpl.java new file mode 100644 index 0000000..619970b --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProductServiceImpl.java @@ -0,0 +1,117 @@ +package com.ruoyi.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.ruoyi.oa.domain.bo.OaProductBo; +import com.ruoyi.oa.domain.vo.OaProductVo; +import com.ruoyi.oa.domain.OaProduct; +import com.ruoyi.oa.mapper.OaProductMapper; +import com.ruoyi.oa.service.IOaProductService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * CRM 产品Service业务层处理 + * + * @author ruoyi + * @date 2025-03-12 + */ +@RequiredArgsConstructor +@Service +public class OaProductServiceImpl implements IOaProductService { + + private final OaProductMapper baseMapper; + + /** + * 查询CRM 产品 + */ + @Override + public OaProductVo queryById(Long productId){ + return baseMapper.selectVoById(productId); + } + + /** + * 查询CRM 产品列表 + */ + @Override + public TableDataInfo queryPageList(OaProductBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询CRM 产品列表 + */ + @Override + public List queryList(OaProductBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(OaProductBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getProductName()), OaProduct::getProductName, bo.getProductName()); + lqw.eq(StringUtils.isNotBlank(bo.getProductNumber()), OaProduct::getProductNumber, bo.getProductNumber()); + lqw.eq(bo.getUnit() != null, OaProduct::getUnit, bo.getUnit()); + lqw.eq(bo.getPrice() != null, OaProduct::getPrice, bo.getPrice()); + lqw.eq(bo.getStatus() != null, OaProduct::getStatus, bo.getStatus()); + lqw.eq(bo.getCategoryId() != null, OaProduct::getCategoryId, bo.getCategoryId()); + lqw.like(StringUtils.isNotBlank(bo.getDescription()), OaProduct::getDescription, bo.getDescription()); + lqw.eq(bo.getOwnerUserId() != null, OaProduct::getOwnerUserId, bo.getOwnerUserId()); + lqw.eq(bo.getDeleted() != null, OaProduct::getDeleted, bo.getDeleted()); + return lqw; + } + + /** + * 新增CRM 产品 + */ + @Override + public Boolean insertByBo(OaProductBo bo) { + OaProduct add = BeanUtil.toBean(bo, OaProduct.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setProductId(add.getProductId()); + } + return flag; + } + + /** + * 修改CRM 产品 + */ + @Override + public Boolean updateByBo(OaProductBo bo) { + OaProduct update = BeanUtil.toBean(bo, OaProduct.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(OaProduct entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除CRM 产品 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaBusinessMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaBusinessMapper.xml new file mode 100644 index 0000000..15817df --- /dev/null +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaBusinessMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaBusinessProductMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaBusinessProductMapper.xml new file mode 100644 index 0000000..69adff8 --- /dev/null +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaBusinessProductMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaClueMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaClueMapper.xml new file mode 100644 index 0000000..c4941e4 --- /dev/null +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaClueMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaCustomerMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaCustomerMapper.xml new file mode 100644 index 0000000..6d5ec22 --- /dev/null +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaCustomerMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaFollowUpRecordMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaFollowUpRecordMapper.xml new file mode 100644 index 0000000..68f4a39 --- /dev/null +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaFollowUpRecordMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaProductMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaProductMapper.xml new file mode 100644 index 0000000..c277e68 --- /dev/null +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaProductMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + +