mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 10:18:42 +08:00 
			
		
		
		
	| @@ -99,7 +99,7 @@ public class CrmClueController { | |||||||
|     @PostMapping("/transform") |     @PostMapping("/transform") | ||||||
|     @Operation(summary = "线索转化为客户") |     @Operation(summary = "线索转化为客户") | ||||||
|     @PreAuthorize("@ss.hasPermission('crm:clue:update')") |     @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()); |         clueService.translateCustomer(reqVO, getLoginUserId()); | ||||||
|         return success(Boolean.TRUE); |         return success(Boolean.TRUE); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -30,4 +30,13 @@ public class CrmCluePageReqVO extends PageParam { | |||||||
|     @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") |     @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") | ||||||
|     private Boolean pool; // null 则表示为不是公海数据 |     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("创建时间") |     @ExcelProperty("创建时间") | ||||||
|     private LocalDateTime createTime; |     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 = "QQ", example = "25682") | ||||||
|  |     @ExcelProperty("QQ") | ||||||
|  |     private String qq; | ||||||
|  |  | ||||||
|  |     @Schema(description = "wechat", example = "25682") | ||||||
|  |     @ExcelProperty("wechat") | ||||||
|  |     private String wechat; | ||||||
|  |  | ||||||
|  |     @Schema(description = "email", 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; | 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.Mobile; | ||||||
| import cn.iocoder.yudao.framework.common.validation.Telephone; | 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 com.mzt.logapi.starter.annotation.DiffLogField; | ||||||
| import io.swagger.v3.oas.annotations.media.Schema; | import io.swagger.v3.oas.annotations.media.Schema; | ||||||
|  | import jakarta.validation.constraints.Email; | ||||||
| import jakarta.validation.constraints.NotEmpty; | import jakarta.validation.constraints.NotEmpty; | ||||||
|  | import jakarta.validation.constraints.Size; | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
| import org.springframework.format.annotation.DateTimeFormat; | import org.springframework.format.annotation.DateTimeFormat; | ||||||
|  |  | ||||||
| import java.time.LocalDateTime; | 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.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") | @Schema(description = "管理后台 - CRM 线索 创建/更新 Request VO") | ||||||
| @Data | @Data | ||||||
| @@ -55,4 +64,42 @@ public class CrmClueSaveReqVO { | |||||||
|     @DiffLogField(name = "备注") |     @DiffLogField(name = "备注") | ||||||
|     private String remark; |     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") | @Schema(description = "管理后台 - 线索转化为客户 Request VO") | ||||||
| @Data | @Data | ||||||
| public class CrmClueTransformReqVO { | public class CrmClueTranslateReqVO { | ||||||
| 
 | 
 | ||||||
|     @Schema(description = "线索编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1024, 1025]") |     @Schema(description = "线索编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1024, 1025]") | ||||||
|     @NotEmpty(message = "线索编号不能为空") |     @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.framework.mybatis.core.dataobject.BaseDO; | ||||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | 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.KeySequence; | ||||||
| import com.baomidou.mybatisplus.annotation.TableId; | import com.baomidou.mybatisplus.annotation.TableId; | ||||||
| import com.baomidou.mybatisplus.annotation.TableName; | import com.baomidou.mybatisplus.annotation.TableName; | ||||||
| @@ -72,16 +73,44 @@ public class CrmClueDO extends BaseDO { | |||||||
|      * 备注 |      * 备注 | ||||||
|      */ |      */ | ||||||
|     private String remark; |     private String remark; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 负责人的用户编号 |      * 负责人的用户编号 | ||||||
|      * |  | ||||||
|      * 关联 AdminUserDO 的 id 字段 |      * 关联 AdminUserDO 的 id 字段 | ||||||
|      */ |      */ | ||||||
|     private Long ownerUserId; |     private Long ownerUserId; | ||||||
|  |     /** | ||||||
|     // TODO 芋艿:客户级别; |      * 所属行业 | ||||||
|     // TODO 芋艿:线索来源; |      * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_INDUSTRY} | ||||||
|     // TODO 芋艿:客户行业; |      */ | ||||||
|  |     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::getName, pageReqVO.getName()) | ||||||
|                 .likeIfPresent(CrmClueDO::getTelephone, pageReqVO.getTelephone()) |                 .likeIfPresent(CrmClueDO::getTelephone, pageReqVO.getTelephone()) | ||||||
|                 .likeIfPresent(CrmClueDO::getMobile, pageReqVO.getMobile()) |                 .likeIfPresent(CrmClueDO::getMobile, pageReqVO.getMobile()) | ||||||
|  |                 .eqIfPresent(CrmClueDO::getIndustryId, pageReqVO.getIndustryId()) | ||||||
|  |                 .eqIfPresent(CrmClueDO::getLevel, pageReqVO.getLevel()) | ||||||
|  |                 .eqIfPresent(CrmClueDO::getSource, pageReqVO.getSource()) | ||||||
|                 .orderByDesc(CrmClueDO::getId); |                 .orderByDesc(CrmClueDO::getId); | ||||||
|         return selectJoinPage(pageReqVO, CrmClueDO.class, query); |         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.CrmCluePageReqVO; | ||||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueSaveReqVO; | 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.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.dal.dataobject.clue.CrmClueDO; | ||||||
| import cn.iocoder.yudao.module.crm.service.followup.bo.CrmUpdateFollowUpReqBO; | import cn.iocoder.yudao.module.crm.service.followup.bo.CrmUpdateFollowUpReqBO; | ||||||
| import jakarta.validation.Valid; | import jakarta.validation.Valid; | ||||||
| @@ -88,6 +88,6 @@ public interface CrmClueService { | |||||||
|      * @param reqVO  线索编号 |      * @param reqVO  线索编号 | ||||||
|      * @param userId 用户编号 |      * @param userId 用户编号 | ||||||
|      */ |      */ | ||||||
|     void translateCustomer(CrmClueTransformReqVO reqVO, Long userId); |     void translateCustomer(CrmClueTranslateReqVO reqVO, Long userId); | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -10,7 +10,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.CrmCluePageReqVO; | ||||||
| import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueSaveReqVO; | 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.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.controller.admin.customer.vo.CrmCustomerSaveReqVO; | ||||||
| import cn.iocoder.yudao.module.crm.convert.clue.CrmClueConvert; | import cn.iocoder.yudao.module.crm.convert.clue.CrmClueConvert; | ||||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO; | import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO; | ||||||
| @@ -175,7 +175,7 @@ public class CrmClueServiceImpl implements CrmClueService { | |||||||
|     @Override |     @Override | ||||||
|     @Transactional(rollbackFor = Exception.class) |     @Transactional(rollbackFor = Exception.class) | ||||||
|     @CrmPermission(bizType = CrmBizTypeEnum.CRM_LEADS, bizId = "#id", level = CrmPermissionLevelEnum.OWNER) |     @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 校验线索都存在 |         // 1.1 校验线索都存在 | ||||||
|         Set<Long> clueIds = reqVO.getIds(); |         Set<Long> clueIds = reqVO.getIds(); | ||||||
|         List<CrmClueDO> clues = getClueList(clueIds, userId); |         List<CrmClueDO> clues = getClueList(clueIds, userId); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 芋道源码
					芋道源码