mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	CRM-客户:精简 VO
This commit is contained in:
		| @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer; | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||
| import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; | ||||
| import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*; | ||||
| @@ -19,7 +18,6 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | ||||
| import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | ||||
| import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.Parameters; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.annotation.Resource; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| @@ -58,28 +56,24 @@ public class CrmCustomerController { | ||||
|     @Resource | ||||
|     private OperateLogApi operateLogApi; | ||||
|  | ||||
|     // TODO @puhui999:把 CrmCustomerCreateReqVO、CrmCustomerUpdateReqVO、CrmCustomerRespVO 按照新的规范,搞一下哈; | ||||
|     @PostMapping("/create") | ||||
|     @Operation(summary = "创建客户") | ||||
|     @OperateLog(enable = false) // TODO 关闭原有日志记录;@puhui999:注解都先删除。先记录,没关系。我们下个迭代,就都删除掉操作日志了; | ||||
|     @PreAuthorize("@ss.hasPermission('crm:customer:create')") | ||||
|     public CommonResult<Long> createCustomer(@Valid @RequestBody CrmCustomerCreateReqVO createReqVO) { | ||||
|     public CommonResult<Long> createCustomer(@Valid @RequestBody CrmCustomerSaveReqVO createReqVO) { | ||||
|         return success(customerService.createCustomer(createReqVO, getLoginUserId())); | ||||
|     } | ||||
|  | ||||
|     @PutMapping("/update") | ||||
|     @Operation(summary = "更新客户") | ||||
|     @OperateLog(enable = false) // TODO 关闭原有日志记录 | ||||
|     @PreAuthorize("@ss.hasPermission('crm:customer:update')") | ||||
|     public CommonResult<Boolean> updateCustomer(@Valid @RequestBody CrmCustomerUpdateReqVO updateReqVO) { | ||||
|     public CommonResult<Boolean> updateCustomer(@Valid @RequestBody CrmCustomerSaveReqVO updateReqVO) { | ||||
|         customerService.updateCustomer(updateReqVO); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|     @DeleteMapping("/delete") | ||||
|     @Operation(summary = "删除客户") | ||||
|     @OperateLog(enable = false) // TODO 关闭原有日志记录 | ||||
|     @Parameter(name = "id", description = "编号", required = true) | ||||
|     @Parameter(name = "id", description = "客户编号", required = true) | ||||
|     @PreAuthorize("@ss.hasPermission('crm:customer:delete')") | ||||
|     public CommonResult<Boolean> deleteCustomer(@RequestParam("id") Long id) { | ||||
|         customerService.deleteCustomer(id); | ||||
| @@ -103,7 +97,6 @@ public class CrmCustomerController { | ||||
|         return success(CrmCustomerConvert.INSTANCE.convert(customer, userMap, deptMap)); | ||||
|     } | ||||
|  | ||||
|     // TODO @puhui999:这个查询会查出多个;微信发你图了 | ||||
|     @GetMapping("/page") | ||||
|     @Operation(summary = "获得客户分页") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:customer:query')") | ||||
| @@ -131,32 +124,32 @@ public class CrmCustomerController { | ||||
|         pageVO.setPageSize(PAGE_SIZE_NONE); // 不分页 | ||||
|         List<CrmCustomerDO> list = customerService.getCustomerPage(pageVO, getLoginUserId()).getList(); | ||||
|         // 导出 Excel | ||||
|         List<CrmCustomerExcelVO> datas = CrmCustomerConvert.INSTANCE.convertList02(list); | ||||
|         ExcelUtils.write(response, "客户.xls", "数据", CrmCustomerExcelVO.class, datas); | ||||
|         List<CrmCustomerRespVO> datas = CrmCustomerConvert.INSTANCE.convertList02(list); | ||||
|         ExcelUtils.write(response, "客户.xls", "数据", CrmCustomerRespVO.class, datas); | ||||
|     } | ||||
|  | ||||
|     @PutMapping("/transfer") | ||||
|     @Operation(summary = "转移客户") | ||||
|     @OperateLog(enable = false) // TODO 关闭原有日志记录 | ||||
|     @PreAuthorize("@ss.hasPermission('crm:customer:update')") | ||||
|     public CommonResult<Boolean> transfer(@Valid @RequestBody CrmCustomerTransferReqVO reqVO) { | ||||
|         customerService.transferCustomer(reqVO, getLoginUserId()); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|     // TODO @puhui999:是不是接口只要传递 bizId,由 Controller 自己组装出 OperateLogV2PageReqDTO | ||||
|     @GetMapping("/operate-log-page") | ||||
|     @Operation(summary = "获得客户操作日志") | ||||
|     @Parameter(name = "id", description = "客户编号", required = true) | ||||
|     @PreAuthorize("@ss.hasPermission('crm:customer:query')") | ||||
|     public CommonResult<PageResult<OperateLogV2RespDTO>> getCustomerOperateLog(CrmCustomerOperateLogPageReqVO reqVO) { | ||||
|         reqVO.setPageSize(PAGE_SIZE_NONE); // 不分页 | ||||
|         reqVO.setBizType(CRM_CUSTOMER); | ||||
|         return success(operateLogApi.getOperateLogPage(BeanUtils.toBean(reqVO, OperateLogV2PageReqDTO.class))); | ||||
|     public CommonResult<PageResult<OperateLogV2RespDTO>> getCustomerOperateLog(@RequestParam("id") Long id) { | ||||
|         OperateLogV2PageReqDTO reqDTO = new OperateLogV2PageReqDTO(); | ||||
|         reqDTO.setPageSize(PAGE_SIZE_NONE); // 不分页 | ||||
|         reqDTO.setBizType(CRM_CUSTOMER); | ||||
|         reqDTO.setBizId(id); | ||||
|         return success(operateLogApi.getOperateLogPage(reqDTO)); | ||||
|     } | ||||
|  | ||||
|     @PutMapping("/lock") | ||||
|     @Operation(summary = "锁定/解锁客户") | ||||
|     @OperateLog(enable = false) // TODO 关闭原有日志记录 | ||||
|     @PreAuthorize("@ss.hasPermission('crm:customer:update')") | ||||
|     public CommonResult<Boolean> lockCustomer(@Valid @RequestBody CrmCustomerLockReqVO lockReqVO) { | ||||
|         customerService.lockCustomer(lockReqVO, getLoginUserId()); | ||||
| @@ -167,7 +160,6 @@ public class CrmCustomerController { | ||||
|  | ||||
|     @PutMapping("/put-pool") | ||||
|     @Operation(summary = "数据放入公海") | ||||
|     @OperateLog(enable = false) // TODO 关闭原有日志记录 | ||||
|     @Parameter(name = "id", description = "客户编号", required = true, example = "1024") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:customer:update')") | ||||
|     public CommonResult<Boolean> putCustomerPool(@RequestParam("id") Long id) { | ||||
| @@ -184,28 +176,22 @@ public class CrmCustomerController { | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|     // TODO @puhui999:需要搞个 VO 类 | ||||
|     @PutMapping("/distribute") | ||||
|     @Operation(summary = "分配公海给对应负责人") | ||||
|     @Parameters({ | ||||
|             @Parameter(name = "ids", description = "客户编号数组", required = true, example = "1,2,3"), | ||||
|             @Parameter(name = "ownerUserId", description = "分配的负责人编号", required = true, example = "12345") | ||||
|     }) | ||||
|     @PreAuthorize("@ss.hasPermission('crm:customer:distribute')") | ||||
|     public CommonResult<Boolean> distributeCustomer(@RequestParam(value = "ids") List<Long> ids, | ||||
|                                                     @RequestParam(value = "ownerUserId") Long ownerUserId) { | ||||
|         customerService.receiveCustomer(ids, ownerUserId); | ||||
|     public CommonResult<Boolean> distributeCustomer(@Valid @RequestBody CrmCustomerDistributeReqVO distributeReqVO) { | ||||
|         customerService.receiveCustomer(distributeReqVO.getIds(), distributeReqVO.getOwnerUserId()); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|     // TODO 芋艿:这个接口要调整下 | ||||
|     @GetMapping("/query-all-list") | ||||
|     @Operation(summary = "查询客户列表") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:customer:all')") | ||||
|     public CommonResult<List<CrmCustomerQueryAllRespVO>> queryAll() { | ||||
|         List<CrmCustomerDO> crmCustomerDOList = customerService.getCustomerList(); | ||||
|         List<CrmCustomerQueryAllRespVO> data = CrmCustomerConvert.INSTANCE.convertQueryAll(crmCustomerDOList); | ||||
|         return success(data); | ||||
|     } | ||||
|     //@GetMapping("/query-all-list") | ||||
|     //@Operation(summary = "查询客户列表") | ||||
|     //@PreAuthorize("@ss.hasPermission('crm:customer:all')") | ||||
|     //public CommonResult<List<CrmCustomerQueryAllRespVO>> queryAll() { | ||||
|     //    List<CrmCustomerDO> crmCustomerDOList = customerService.getCustomerList(); | ||||
|     //    List<CrmCustomerQueryAllRespVO> data = CrmCustomerConvert.INSTANCE.convertQueryAll(crmCustomerDOList); | ||||
|     //    return success(data); | ||||
|     //} | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,20 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| import lombok.ToString; | ||||
|  | ||||
| import jakarta.validation.constraints.NotNull; | ||||
|  | ||||
| @Schema(description = "管理后台 - CRM 客户创建 Request VO") | ||||
| @Data | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| @ToString(callSuper = true) | ||||
| public class CrmCustomerCreateReqVO extends CrmCustomerBaseVO { | ||||
|  | ||||
|     @Schema(description = "负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | ||||
|     @NotNull(message = "负责人不能为空") | ||||
|     private Long ownerUserId; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,21 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import jakarta.validation.constraints.NotNull; | ||||
| import lombok.Data; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| @Schema(description = "管理后台 - CRM 客户分配公海给对应负责人 Request VO") | ||||
| @Data | ||||
| public class CrmCustomerDistributeReqVO { | ||||
|  | ||||
|     @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1024]") | ||||
|     @NotNull(message = "客户编号不能为空") | ||||
|     private List<Long> ids; | ||||
|  | ||||
|     @Schema(description = "负责人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | ||||
|     @NotNull(message = "负责人不能为空") | ||||
|     private Long ownerUserId; | ||||
|  | ||||
| } | ||||
| @@ -1,93 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; | ||||
| import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; | ||||
| import cn.iocoder.yudao.module.infra.enums.DictTypeConstants; | ||||
| import com.alibaba.excel.annotation.ExcelProperty; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
|  | ||||
| // TODO 芋艿:导出最后做,等基本确认的差不多之后; | ||||
| /** | ||||
|  * CRM 客户 Excel VO | ||||
|  * | ||||
|  * @author Wanwan | ||||
|  */ | ||||
| @Data | ||||
| public class CrmCustomerExcelVO { | ||||
|  | ||||
|     @ExcelProperty("编号") | ||||
|     private Long id; | ||||
|  | ||||
|     @ExcelProperty("客户名称") | ||||
|     private String name; | ||||
|  | ||||
|     @ExcelProperty(value = "跟进状态", converter = DictConvert.class) | ||||
|     @DictFormat(DictTypeConstants.BOOLEAN_STRING) | ||||
|     private Boolean followUpStatus; | ||||
|  | ||||
|     @ExcelProperty(value = "锁定状态", converter = DictConvert.class) | ||||
|     @DictFormat(DictTypeConstants.BOOLEAN_STRING) | ||||
|     private Boolean lockStatus; | ||||
|  | ||||
|     @ExcelProperty(value = "成交状态", converter = DictConvert.class) | ||||
|     @DictFormat(DictTypeConstants.BOOLEAN_STRING) | ||||
|     private Boolean dealStatus; | ||||
|  | ||||
|     @ExcelProperty(value = "所属行业", converter = DictConvert.class) | ||||
|     @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_INDUSTRY) | ||||
|     private Integer industryId; | ||||
|  | ||||
|     @ExcelProperty(value = "客户等级", converter = DictConvert.class) | ||||
|     @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_LEVEL) | ||||
|     private Integer level; | ||||
|  | ||||
|     @ExcelProperty(value = "客户来源", converter = DictConvert.class) | ||||
|     @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_SOURCE) | ||||
|     private Integer source; | ||||
|  | ||||
|     @ExcelProperty("手机") | ||||
|     private String mobile; | ||||
|  | ||||
|     @ExcelProperty("电话") | ||||
|     private String telephone; | ||||
|  | ||||
|     @ExcelProperty("网址") | ||||
|     private String website; | ||||
|  | ||||
|     @ExcelProperty("QQ") | ||||
|     private String qq; | ||||
|  | ||||
|     @ExcelProperty("wechat") | ||||
|     private String wechat; | ||||
|  | ||||
|     @ExcelProperty("email") | ||||
|     private String email; | ||||
|  | ||||
|     @ExcelProperty("客户描述") | ||||
|     private String description; | ||||
|  | ||||
|     @ExcelProperty("备注") | ||||
|     private String remark; | ||||
|  | ||||
|     @ExcelProperty("负责人的用户编号") | ||||
|     private Long ownerUserId; | ||||
|  | ||||
|     @ExcelProperty("地区编号") | ||||
|     private Integer areaId; | ||||
|  | ||||
|     @ExcelProperty("详细地址") | ||||
|     private String detailAddress; | ||||
|  | ||||
|     @ExcelProperty("最后跟进时间") | ||||
|     private LocalDateTime contactLastTime; | ||||
|  | ||||
|     @ExcelProperty("下次联系时间") | ||||
|     private LocalDateTime contactNextTime; | ||||
|  | ||||
|     @ExcelProperty("创建时间") | ||||
|     private LocalDateTime createTime; | ||||
|  | ||||
| } | ||||
| @@ -1,20 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
|  | ||||
| @Schema(description = "管理后台 - crm 客户操作日志分页 Request VO") | ||||
| @Data | ||||
| public class CrmCustomerOperateLogPageReqVO extends PageParam { | ||||
|  | ||||
|     @Schema(description = "模块数据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | ||||
|     private Long bizId; | ||||
|  | ||||
|     @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     private Long userId; | ||||
|  | ||||
|     @Schema(description = "模块类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     private String bizType; | ||||
|  | ||||
| } | ||||
| @@ -1,17 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
|  | ||||
| // TODO 芋艿:这块要统一下; | ||||
| @Schema(description = "管理后台 - CRM 全部客户 Response VO") | ||||
| @Data | ||||
| public class CrmCustomerQueryAllRespVO{ | ||||
|  | ||||
|     @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | ||||
|     private Long id; | ||||
|  | ||||
|     @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") | ||||
|     private String name; | ||||
|  | ||||
| } | ||||
| @@ -1,9 +1,12 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; | ||||
| import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; | ||||
| import cn.iocoder.yudao.module.infra.enums.DictTypeConstants; | ||||
| import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||
| import com.alibaba.excel.annotation.ExcelProperty; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| import lombok.ToString; | ||||
| import org.springframework.format.annotation.DateTimeFormat; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
| @@ -12,45 +15,121 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ | ||||
|  | ||||
| @Schema(description = "管理后台 - CRM 客户 Response VO") | ||||
| @Data | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| @ToString(callSuper = true) | ||||
| public class CrmCustomerRespVO extends CrmCustomerBaseVO { | ||||
| @ExcelIgnoreUnannotated | ||||
| public class CrmCustomerRespVO { | ||||
|  | ||||
|     @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | ||||
|     @ExcelProperty("编号") | ||||
|     private Long id; | ||||
|  | ||||
|     @Schema(description = "跟进状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") | ||||
|     @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | ||||
|     @ExcelProperty("客户名称") | ||||
|     private String name; | ||||
|  | ||||
|     @Schema(description = "跟进状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | ||||
|     @ExcelProperty(value = "跟进状态", converter = DictConvert.class) | ||||
|     @DictFormat(DictTypeConstants.BOOLEAN_STRING) | ||||
|     private Boolean followUpStatus; | ||||
|  | ||||
|     @Schema(description = "锁定状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") | ||||
|     @Schema(description = "锁定状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | ||||
|     @ExcelProperty(value = "锁定状态", converter = DictConvert.class) | ||||
|     @DictFormat(DictTypeConstants.BOOLEAN_STRING) | ||||
|     private Boolean lockStatus; | ||||
|  | ||||
|     @Schema(description = "成交状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") | ||||
|     @Schema(description = "成交状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | ||||
|     @ExcelProperty(value = "成交状态", converter = DictConvert.class) | ||||
|     @DictFormat(DictTypeConstants.BOOLEAN_STRING) | ||||
|     private Boolean dealStatus; | ||||
|  | ||||
|     @Schema(description = "所属行业", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | ||||
|     @ExcelProperty(value = "所属行业", converter = DictConvert.class) | ||||
|     @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_INDUSTRY) | ||||
|     private Integer industryId; | ||||
|  | ||||
|     @Schema(description = "客户等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | ||||
|     @ExcelProperty(value = "客户等级", converter = DictConvert.class) | ||||
|     @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_LEVEL) | ||||
|     private Integer level; | ||||
|  | ||||
|     @Schema(description = "客户来源", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | ||||
|     @ExcelProperty(value = "客户来源", converter = DictConvert.class) | ||||
|     @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_SOURCE) | ||||
|     private Integer source; | ||||
|  | ||||
|     @Schema(description = "负责人的用户编号", example = "25682") | ||||
|     @ExcelProperty("手机") | ||||
|     private String mobile; | ||||
|  | ||||
|     @Schema(description = "负责人的用户编号", example = "25682") | ||||
|     @ExcelProperty("电话") | ||||
|     private String telephone; | ||||
|  | ||||
|     @Schema(description = "负责人的用户编号", example = "25682") | ||||
|     @ExcelProperty("网址") | ||||
|     private String website; | ||||
|  | ||||
|     @Schema(description = "负责人的用户编号", example = "25682") | ||||
|     @ExcelProperty("QQ") | ||||
|     private String qq; | ||||
|  | ||||
|     @Schema(description = "负责人的用户编号", example = "25682") | ||||
|     @ExcelProperty("wechat") | ||||
|     private String wechat; | ||||
|  | ||||
|     @Schema(description = "负责人的用户编号", example = "25682") | ||||
|     @ExcelProperty("email") | ||||
|     private String email; | ||||
|  | ||||
|     @Schema(description = "负责人的用户编号", example = "25682") | ||||
|     @ExcelProperty("客户描述") | ||||
|     private String description; | ||||
|  | ||||
|     @Schema(description = "负责人的用户编号", example = "25682") | ||||
|     @ExcelProperty("备注") | ||||
|     private String remark; | ||||
|  | ||||
|     @Schema(description = "负责人的用户编号", example = "25682") | ||||
|     @ExcelProperty("负责人的用户编号") | ||||
|     private Long ownerUserId; | ||||
|     @Schema(description = "负责人名字", example = "25682") | ||||
|     @ExcelProperty("负责人名字") | ||||
|     private String ownerUserName; | ||||
|     @Schema(description = "负责人部门") | ||||
|     @ExcelProperty("负责人部门") | ||||
|     private String ownerUserDeptName; | ||||
|  | ||||
|     @Schema(description = "地区编号", example = "1024") | ||||
|     @ExcelProperty("地区编号") | ||||
|     private Integer areaId; | ||||
|     @Schema(description = "地区名称", example = "北京市") | ||||
|     @ExcelProperty("地区名称") | ||||
|     private String areaName; | ||||
|     @Schema(description = "详细地址", example = "北京市成华大道") | ||||
|     @ExcelProperty("详细地址") | ||||
|     private String detailAddress; | ||||
|  | ||||
|     @Schema(description = "最后跟进时间") | ||||
|     @ExcelProperty("最后跟进时间") | ||||
|     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||||
|     private LocalDateTime contactLastTime; | ||||
|  | ||||
|     @Schema(description = "下次联系时间") | ||||
|     @ExcelProperty("下次联系时间") | ||||
|     private LocalDateTime contactNextTime; | ||||
|  | ||||
|     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | ||||
|     @ExcelProperty("创建时间") | ||||
|     private LocalDateTime createTime; | ||||
|  | ||||
|     @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) | ||||
|     @ExcelProperty("更新时间") | ||||
|     private LocalDateTime updateTime; | ||||
|  | ||||
|     @Schema(description = "创建人") | ||||
|     @Schema(description = "创建人", example = "1024") | ||||
|     @ExcelProperty("创建人") | ||||
|     private String creator; | ||||
|     @Schema(description = "创建人名字") | ||||
|     @Schema(description = "创建人名字", example = "芋道源码") | ||||
|     @ExcelProperty("创建人名字") | ||||
|     private String creatorName; | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -18,12 +18,12 @@ import java.time.LocalDateTime; | ||||
| import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | ||||
| import static cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_INDUSTRY; | ||||
| 
 | ||||
| /** | ||||
|  * 客户 Base VO,提供给添加、修改、详细的子 VO 使用 | ||||
|  * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 | ||||
|  */ | ||||
| @Schema(description = "管理后台 - CRM 客户新增/修改 Request VO") | ||||
| @Data | ||||
| public class CrmCustomerBaseVO { | ||||
| public class CrmCustomerSaveReqVO { | ||||
| 
 | ||||
|     @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | ||||
|     private Long id; | ||||
| 
 | ||||
|     @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") | ||||
|     @DiffLogField(name = "客户名称") | ||||
| @@ -96,4 +96,7 @@ public class CrmCustomerBaseVO { | ||||
|     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||||
|     private LocalDateTime contactNextTime; | ||||
| 
 | ||||
|     @Schema(description = "负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | ||||
|     private Long ownerUserId; | ||||
| 
 | ||||
| } | ||||
| @@ -1,20 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.customer.vo; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| import lombok.ToString; | ||||
|  | ||||
| import jakarta.validation.constraints.NotNull; | ||||
|  | ||||
| @Schema(description = "管理后台 - CRM 客户更新 Request VO") | ||||
| @Data | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| @ToString(callSuper = true) | ||||
| public class CrmCustomerUpdateReqVO extends CrmCustomerBaseVO { | ||||
|  | ||||
|     @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563") | ||||
|     @NotNull(message = "编号不能为空") | ||||
|     private Long id; | ||||
|  | ||||
| } | ||||
| @@ -2,7 +2,9 @@ package cn.iocoder.yudao.module.crm.convert.customer; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||||
| @@ -29,9 +31,7 @@ public interface CrmCustomerConvert { | ||||
|  | ||||
|     CrmCustomerConvert INSTANCE = Mappers.getMapper(CrmCustomerConvert.class); | ||||
|  | ||||
|     CrmCustomerDO convert(CrmCustomerCreateReqVO bean); | ||||
|  | ||||
|     CrmCustomerDO convert(CrmCustomerUpdateReqVO bean); | ||||
|     CrmCustomerDO convert(CrmCustomerSaveReqVO bean); | ||||
|  | ||||
|     CrmCustomerRespVO convert(CrmCustomerDO bean); | ||||
|  | ||||
| @@ -51,7 +51,7 @@ public interface CrmCustomerConvert { | ||||
|         findAndThen(userMap, Long.parseLong(customer.getCreator()), user -> customer.setCreatorName(user.getNickname())); | ||||
|     } | ||||
|  | ||||
|     List<CrmCustomerExcelVO> convertList02(List<CrmCustomerDO> list); | ||||
|     List<CrmCustomerRespVO> convertList02(List<CrmCustomerDO> list); | ||||
|  | ||||
|     @Mapping(target = "bizId", source = "reqVO.id") | ||||
|     CrmPermissionTransferReqBO convert(CrmCustomerTransferReqVO reqVO, Long userId); | ||||
| @@ -76,6 +76,4 @@ public interface CrmCustomerConvert { | ||||
|  | ||||
|     CrmCustomerPoolConfigDO convert(CrmCustomerPoolConfigSaveReqVO updateReqVO); | ||||
|  | ||||
|     List<CrmCustomerQueryAllRespVO> convertQueryAll(List<CrmCustomerDO> crmCustomerDO); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,7 +1,10 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.customer; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLockReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||||
| import jakarta.validation.Valid; | ||||
|  | ||||
| @@ -22,14 +25,14 @@ public interface CrmCustomerService { | ||||
|      * @param userId      用户编号 | ||||
|      * @return 编号 | ||||
|      */ | ||||
|     Long createCustomer(@Valid CrmCustomerCreateReqVO createReqVO, Long userId); | ||||
|     Long createCustomer(@Valid CrmCustomerSaveReqVO createReqVO, Long userId); | ||||
|  | ||||
|     /** | ||||
|      * 更新客户 | ||||
|      * | ||||
|      * @param updateReqVO 更新信息 | ||||
|      */ | ||||
|     void updateCustomer(@Valid CrmCustomerUpdateReqVO updateReqVO); | ||||
|     void updateCustomer(@Valid CrmCustomerSaveReqVO updateReqVO); | ||||
|  | ||||
|     /** | ||||
|      * 删除客户 | ||||
|   | ||||
| @@ -1,10 +1,14 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.customer; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.lang.Assert; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLockReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO; | ||||
| import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO; | ||||
| @@ -24,7 +28,10 @@ import org.springframework.transaction.annotation.Transactional; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
| import java.util.*; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||
| import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; | ||||
| @@ -56,8 +63,10 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||||
|  | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @LogRecord(type = CRM_CUSTOMER, subType = "创建客户", bizNo = "{{#customerId}}", success = "创建了客户") // TODO @puhui999:创建了客户【客户名】,要记录进去;不然在展示操作日志的全列表,看不清楚是哪个客户哈; | ||||
|     public Long createCustomer(CrmCustomerCreateReqVO createReqVO, Long userId) { | ||||
|     @LogRecord(type = CRM_CUSTOMER, subType = "创建客户", bizNo = "{{#customerId}}", success = "创建了客户") | ||||
|     // TODO @puhui999:创建了客户【客户名】,要记录进去;不然在展示操作日志的全列表,看不清楚是哪个客户哈; | ||||
|     public Long createCustomer(CrmCustomerSaveReqVO createReqVO, Long userId) { | ||||
|         createReqVO.setId(null); | ||||
|         // 1. 校验拥有客户是否到达上限 | ||||
|         validateCustomerExceedOwnerLimit(createReqVO.getOwnerUserId(), 1); | ||||
|  | ||||
| @@ -81,8 +90,10 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @LogRecord(type = CRM_CUSTOMER, subType = "更新客户", bizNo = "{{#updateReqVO.id}}", success = "更新了客户{_DIFF{#updateReqVO}}", extra = "{{#extra}}") | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE) | ||||
|     public void updateCustomer(CrmCustomerUpdateReqVO updateReqVO) { | ||||
|         // TODO @puhui999:更新的时候,要把 updateReqVO 负责人设置为空,避免修改。 | ||||
|     public void updateCustomer(CrmCustomerSaveReqVO updateReqVO) { | ||||
|         Assert.notNull(updateReqVO.getId(), "客户编号不能为空"); | ||||
|         // 更新的时候,要把 updateReqVO 负责人设置为空,避免修改。 | ||||
|         updateReqVO.setOwnerUserId(null); | ||||
|         // 1. 校验存在 | ||||
|         CrmCustomerDO oldCustomer = validateCustomerExists(updateReqVO.getId()); | ||||
|  | ||||
| @@ -91,11 +102,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||||
|         customerMapper.updateById(updateObj); | ||||
|  | ||||
|         // 3. 记录操作日志 | ||||
|         LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(oldCustomer, CrmCustomerUpdateReqVO.class)); | ||||
|         // TODO 扩展信息测试 @puhui999:看着没啥问题,可以删除啦; | ||||
|         HashMap<String, Object> extra = new HashMap<>(); | ||||
|         extra.put("tips", "随便记录一点啦"); | ||||
|         LogRecordContext.putVariable("extra", extra); | ||||
|         LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(oldCustomer, CrmCustomerSaveReqVO.class)); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -197,7 +204,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||||
|     /** | ||||
|      * 校验用户拥有的客户数量,是否到达上限 | ||||
|      * | ||||
|      * @param userId 用户编号 | ||||
|      * @param userId   用户编号 | ||||
|      * @param newCount 附加数量 | ||||
|      */ | ||||
|     private void validateCustomerExceedOwnerLimit(Long userId, int newCount) { | ||||
| @@ -237,7 +244,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||||
|  | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @LogRecord(type = CRM_CUSTOMER, subType = "客户放入公海", bizNo = "{{#id}}", success = "将客户放入了公海") // TODO @puhui999:将客户【】放入了公海 | ||||
|     @LogRecord(type = CRM_CUSTOMER, subType = "客户放入公海", bizNo = "{{#id}}", success = "将客户放入了公海") | ||||
|     // TODO @puhui999:将客户【】放入了公海 | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) | ||||
|     public void putCustomerPool(Long id) { | ||||
|         // 1. 校验存在 | ||||
|   | ||||
| @@ -2,19 +2,17 @@ package cn.iocoder.yudao.module.crm.service.customer; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerCreateReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerUpdateReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper; | ||||
| import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.junit.jupiter.api.Disabled; | ||||
| import org.junit.jupiter.api.Test; | ||||
| import org.springframework.boot.test.mock.mockito.MockBean; | ||||
| import org.springframework.context.annotation.Import; | ||||
|  | ||||
| import jakarta.annotation.Resource; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE; | ||||
| import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; | ||||
| import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | ||||
| @@ -47,7 +45,7 @@ public class CrmCustomerServiceImplTest extends BaseDbUnitTest { | ||||
|     @Test | ||||
|     public void testCreateCustomer_success() { | ||||
|         // 准备参数 | ||||
|         CrmCustomerCreateReqVO reqVO = randomPojo(CrmCustomerCreateReqVO.class); | ||||
|         CrmCustomerSaveReqVO reqVO = randomPojo(CrmCustomerSaveReqVO.class); | ||||
|  | ||||
|         // 调用 | ||||
|         Long customerId = customerService.createCustomer(reqVO, getLoginUserId()); | ||||
| @@ -64,7 +62,7 @@ public class CrmCustomerServiceImplTest extends BaseDbUnitTest { | ||||
|         CrmCustomerDO dbCustomer = randomPojo(CrmCustomerDO.class); | ||||
|         customerMapper.insert(dbCustomer);// @Sql: 先插入出一条存在的数据 | ||||
|         // 准备参数 | ||||
|         CrmCustomerUpdateReqVO reqVO = randomPojo(CrmCustomerUpdateReqVO.class, o -> { | ||||
|         CrmCustomerSaveReqVO reqVO = randomPojo(CrmCustomerSaveReqVO.class, o -> { | ||||
|             o.setId(dbCustomer.getId()); // 设置更新的 ID | ||||
|         }); | ||||
|  | ||||
| @@ -78,7 +76,7 @@ public class CrmCustomerServiceImplTest extends BaseDbUnitTest { | ||||
|     @Test | ||||
|     public void testUpdateCustomer_notExists() { | ||||
|         // 准备参数 | ||||
|         CrmCustomerUpdateReqVO reqVO = randomPojo(CrmCustomerUpdateReqVO.class); | ||||
|         CrmCustomerSaveReqVO reqVO = randomPojo(CrmCustomerSaveReqVO.class); | ||||
|  | ||||
|         // 调用, 并断言异常 | ||||
|         assertServiceException(() -> customerService.updateCustomer(reqVO), CUSTOMER_NOT_EXISTS); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 puhui999
					puhui999