mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	CRM:【线索】增加字段
This commit is contained in:
		| @@ -99,7 +99,7 @@ public class CrmClueController { | ||||
|     @PostMapping("/transform") | ||||
|     @Operation(summary = "线索转化为客户") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:clue:update')") | ||||
|     public CommonResult<Boolean> translateCustomer(@Valid @RequestBody CrmClueTransformReqVO reqVO) { | ||||
|     public CommonResult<Boolean> translateCustomer(@Valid @RequestBody CrmClueTranslateReqVO reqVO) { | ||||
|         clueService.translateCustomer(reqVO, getLoginUserId()); | ||||
|         return success(Boolean.TRUE); | ||||
|     } | ||||
|   | ||||
| @@ -30,4 +30,13 @@ public class CrmCluePageReqVO extends PageParam { | ||||
|     @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") | ||||
|     private Boolean pool; // null 则表示为不是公海数据 | ||||
|  | ||||
|     @Schema(description = "所属行业", example = "1") | ||||
|     private Integer industryId; | ||||
|  | ||||
|     @Schema(description = "客户等级", example = "1") | ||||
|     private Integer level; | ||||
|  | ||||
|     @Schema(description = "客户来源", example = "1") | ||||
|     private Integer source; | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -77,4 +77,38 @@ public class CrmClueRespVO { | ||||
|     @ExcelProperty("创建时间") | ||||
|     private LocalDateTime createTime; | ||||
|  | ||||
|     @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 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; | ||||
| } | ||||
|   | ||||
| @@ -1,16 +1,25 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.clue.vo; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.validation.InEnum; | ||||
| import cn.iocoder.yudao.framework.common.validation.Mobile; | ||||
| import cn.iocoder.yudao.framework.common.validation.Telephone; | ||||
| import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; | ||||
| import cn.iocoder.yudao.module.crm.enums.customer.CrmCustomerLevelEnum; | ||||
| import cn.iocoder.yudao.module.crm.framework.operatelog.core.CrmCustomerIndustryParseFunction; | ||||
| import cn.iocoder.yudao.module.crm.framework.operatelog.core.CrmCustomerLevelParseFunction; | ||||
| import cn.iocoder.yudao.module.crm.framework.operatelog.core.CrmCustomerSourceParseFunction; | ||||
| import com.mzt.logapi.starter.annotation.DiffLogField; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import jakarta.validation.constraints.Email; | ||||
| import jakarta.validation.constraints.NotEmpty; | ||||
| import jakarta.validation.constraints.Size; | ||||
| import lombok.Data; | ||||
| import org.springframework.format.annotation.DateTimeFormat; | ||||
|  | ||||
| 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; | ||||
|  | ||||
| @Schema(description = "管理后台 - CRM 线索 创建/更新 Request VO") | ||||
| @Data | ||||
| @@ -55,4 +64,42 @@ public class CrmClueSaveReqVO { | ||||
|     @DiffLogField(name = "备注") | ||||
|     private String remark; | ||||
|  | ||||
|     @Schema(description = "所属行业", example = "1") | ||||
|     @DiffLogField(name = "所属行业", function = CrmCustomerIndustryParseFunction.NAME) | ||||
|     @DictFormat(CRM_CUSTOMER_INDUSTRY) | ||||
|     private Integer industryId; | ||||
|  | ||||
|     @Schema(description = "客户等级", example = "2") | ||||
|     @DiffLogField(name = "客户等级", function = CrmCustomerLevelParseFunction.NAME) | ||||
|     @InEnum(CrmCustomerLevelEnum.class) | ||||
|     private Integer level; | ||||
|  | ||||
|     @Schema(description = "客户来源", example = "3") | ||||
|     @DiffLogField(name = "客户来源", function = CrmCustomerSourceParseFunction.NAME) | ||||
|     private Integer source; | ||||
|  | ||||
|     @Schema(description = "网址", example = "https://www.baidu.com") | ||||
|     @DiffLogField(name = "网址") | ||||
|     private String website; | ||||
|  | ||||
|     @Schema(description = "QQ", example = "123456789") | ||||
|     @DiffLogField(name = "QQ") | ||||
|     @Size(max = 20, message = "QQ长度不能超过 20 个字符") | ||||
|     private String qq; | ||||
|  | ||||
|     @Schema(description = "微信", example = "123456789") | ||||
|     @DiffLogField(name = "微信") | ||||
|     @Size(max = 255, message = "微信长度不能超过 255 个字符") | ||||
|     private String wechat; | ||||
|  | ||||
|     @Schema(description = "邮箱", example = "123456789@qq.com") | ||||
|     @DiffLogField(name = "邮箱") | ||||
|     @Email(message = "邮箱格式不正确") | ||||
|     @Size(max = 255, message = "邮箱长度不能超过 255 个字符") | ||||
|     private String email; | ||||
|  | ||||
|     @Schema(description = "客户描述", example = "任意文字") | ||||
|     @DiffLogField(name = "客户描述") | ||||
|     @Size(max = 4096, message = "客户描述长度不能超过 4096 个字符") | ||||
|     private String description; | ||||
| } | ||||
|   | ||||
| @@ -8,7 +8,7 @@ import java.util.Set; | ||||
| 
 | ||||
| @Schema(description = "管理后台 - 线索转化为客户 Request VO") | ||||
| @Data | ||||
| public class CrmClueTransformReqVO { | ||||
| public class CrmClueTranslateReqVO { | ||||
| 
 | ||||
|     @Schema(description = "线索编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1024, 1025]") | ||||
|     @NotEmpty(message = "线索编号不能为空") | ||||
| @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.dal.dataobject.clue; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||||
| import cn.iocoder.yudao.module.crm.enums.DictTypeConstants; | ||||
| import com.baomidou.mybatisplus.annotation.KeySequence; | ||||
| import com.baomidou.mybatisplus.annotation.TableId; | ||||
| import com.baomidou.mybatisplus.annotation.TableName; | ||||
| @@ -72,16 +73,44 @@ public class CrmClueDO extends BaseDO { | ||||
|      * 备注 | ||||
|      */ | ||||
|     private String remark; | ||||
|  | ||||
|     /** | ||||
|      * 负责人的用户编号 | ||||
|      * | ||||
|      * 关联 AdminUserDO 的 id 字段 | ||||
|      */ | ||||
|     private Long ownerUserId; | ||||
|  | ||||
|     // TODO 芋艿:客户级别; | ||||
|     // TODO 芋艿:线索来源; | ||||
|     // TODO 芋艿:客户行业; | ||||
|  | ||||
|     /** | ||||
|      * 所属行业 | ||||
|      * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_INDUSTRY} | ||||
|      */ | ||||
|     private Integer industryId; | ||||
|     /** | ||||
|      * 客户等级 | ||||
|      * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_LEVEL} | ||||
|      */ | ||||
|     private Integer level; | ||||
|     /** | ||||
|      * 客户来源 | ||||
|      * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_SOURCE} | ||||
|      */ | ||||
|     private Integer source; | ||||
|     /** | ||||
|      * 网址 | ||||
|      */ | ||||
|     private String website; | ||||
|     /** | ||||
|      * QQ | ||||
|      */ | ||||
|     private String qq; | ||||
|     /** | ||||
|      * wechat | ||||
|      */ | ||||
|     private String wechat; | ||||
|     /** | ||||
|      * email | ||||
|      */ | ||||
|     private String email; | ||||
|     /** | ||||
|      * 客户描述 | ||||
|      */ | ||||
|     private String description; | ||||
| } | ||||
|   | ||||
| @@ -37,6 +37,9 @@ public interface CrmClueMapper extends BaseMapperX<CrmClueDO> { | ||||
|                 .likeIfPresent(CrmClueDO::getName, pageReqVO.getName()) | ||||
|                 .likeIfPresent(CrmClueDO::getTelephone, pageReqVO.getTelephone()) | ||||
|                 .likeIfPresent(CrmClueDO::getMobile, pageReqVO.getMobile()) | ||||
|                 .eqIfPresent(CrmClueDO::getIndustryId, pageReqVO.getIndustryId()) | ||||
|                 .eqIfPresent(CrmClueDO::getLevel, pageReqVO.getLevel()) | ||||
|                 .eqIfPresent(CrmClueDO::getSource, pageReqVO.getSource()) | ||||
|                 .orderByDesc(CrmClueDO::getId); | ||||
|         return selectJoinPage(pageReqVO, CrmClueDO.class, query); | ||||
|     } | ||||
|   | ||||
| @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTransferReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTransformReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTranslateReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO; | ||||
| import cn.iocoder.yudao.module.crm.service.followup.bo.CrmUpdateFollowUpReqBO; | ||||
| import jakarta.validation.Valid; | ||||
| @@ -88,6 +88,6 @@ public interface CrmClueService { | ||||
|      * @param reqVO  线索编号 | ||||
|      * @param userId 用户编号 | ||||
|      */ | ||||
|     void translateCustomer(CrmClueTransformReqVO reqVO, Long userId); | ||||
|     void translateCustomer(CrmClueTranslateReqVO reqVO, Long userId); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -11,7 +11,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTransferReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTransformReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTranslateReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerSaveReqVO; | ||||
| import cn.iocoder.yudao.module.crm.convert.clue.CrmClueConvert; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO; | ||||
| @@ -177,7 +177,7 @@ public class CrmClueServiceImpl implements CrmClueService { | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_LEADS, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) | ||||
|     public void translateCustomer(CrmClueTransformReqVO reqVO, Long userId) { | ||||
|     public void translateCustomer(CrmClueTranslateReqVO reqVO, Long userId) { | ||||
|         // 1.1 校验线索都存在 | ||||
|         Set<Long> clueIds = reqVO.getIds(); | ||||
|         List<CrmClueDO> clues = getClueList(clueIds, userId); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 min
					min