mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-30 03:01:53 +08:00
CRM:【线索】增加字段
This commit is contained in:
parent
7bb171512a
commit
ce397d4fbd
@ -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 = "负责人的用户编号", 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;
|
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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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.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;
|
||||||
@ -177,7 +177,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);
|
||||||
|
Loading…
Reference in New Issue
Block a user