mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-26 01:01:52 +08:00
Merge remote-tracking branch 'origin/develop' into develop
This commit is contained in:
commit
75f2b207a4
@ -84,5 +84,6 @@ public interface ErrorCodeConstants {
|
|||||||
|
|
||||||
// ========== 跟进记录 1_020_013_000 ==========
|
// ========== 跟进记录 1_020_013_000 ==========
|
||||||
ErrorCode FOLLOW_UP_RECORD_NOT_EXISTS = new ErrorCode(1_020_013_000, "跟进记录不存在");
|
ErrorCode FOLLOW_UP_RECORD_NOT_EXISTS = new ErrorCode(1_020_013_000, "跟进记录不存在");
|
||||||
|
ErrorCode FOLLOW_UP_RECORD_DELETE_DENIED = new ErrorCode(1_020_013_001, "删除跟进记录失败,原因:没有权限");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -125,11 +125,8 @@ public class CrmContactController {
|
|||||||
@Operation(summary = "获得联系人的精简列表")
|
@Operation(summary = "获得联系人的精简列表")
|
||||||
@PreAuthorize("@ss.hasPermission('crm:contact:query')")
|
@PreAuthorize("@ss.hasPermission('crm:contact:query')")
|
||||||
public CommonResult<List<CrmContactRespVO>> getSimpleContactList() {
|
public CommonResult<List<CrmContactRespVO>> getSimpleContactList() {
|
||||||
// TODO @puhui999:这种还是搞个 getContactList 方法好点哈;
|
List<CrmContactDO> list = contactService.getSimpleContactList(getLoginUserId());
|
||||||
CrmContactPageReqVO reqVO = new CrmContactPageReqVO();
|
return success(convertList(list, contact -> // 只返回 id、name 字段
|
||||||
reqVO.setPageSize(PAGE_SIZE_NONE); // 不分页
|
|
||||||
PageResult<CrmContactDO> pageResult = contactService.getContactPage(reqVO, getLoginUserId());
|
|
||||||
return success(convertList(pageResult.getList(), contact -> // 只返回 id、name 字段
|
|
||||||
new CrmContactRespVO().setId(contact.getId()).setName(contact.getName())));
|
new CrmContactRespVO().setId(contact.getId()).setName(contact.getName())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,83 +1,116 @@
|
|||||||
package cn.iocoder.yudao.module.crm.controller.admin.contract.vo;
|
package cn.iocoder.yudao.module.crm.controller.admin.contract.vo;
|
||||||
|
|
||||||
|
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
// TODO @puhui999:导出注解哈
|
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||||
|
|
||||||
@Schema(description = "管理后台 - CRM 合同 Response VO")
|
@Schema(description = "管理后台 - CRM 合同 Response VO")
|
||||||
@Data
|
@Data
|
||||||
|
@ExcelIgnoreUnannotated
|
||||||
public class CrmContractRespVO {
|
public class CrmContractRespVO {
|
||||||
|
|
||||||
@Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
|
@Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
|
||||||
|
@ExcelProperty("合同编号")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Schema(description = "合同名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
|
@Schema(description = "合同名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
|
||||||
|
@ExcelProperty("合同名称")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18336")
|
@Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18336")
|
||||||
|
@ExcelProperty("客户编号")
|
||||||
private Long customerId;
|
private Long customerId;
|
||||||
|
|
||||||
@Schema(description = "商机编号", example = "10864")
|
@Schema(description = "商机编号", example = "10864")
|
||||||
|
@ExcelProperty("商机编号")
|
||||||
private Long businessId;
|
private Long businessId;
|
||||||
|
|
||||||
@Schema(description = "工作流编号", example = "1043")
|
@Schema(description = "工作流编号", example = "1043")
|
||||||
|
@ExcelProperty("工作流编号")
|
||||||
private Long processInstanceId;
|
private Long processInstanceId;
|
||||||
|
|
||||||
@Schema(description = "下单日期", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "下单日期", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
@ExcelProperty("下单日期")
|
||||||
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
private LocalDateTime orderDate;
|
private LocalDateTime orderDate;
|
||||||
|
|
||||||
@Schema(description = "负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17144")
|
@Schema(description = "负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17144")
|
||||||
|
@ExcelProperty("负责人的用户编号")
|
||||||
private Long ownerUserId;
|
private Long ownerUserId;
|
||||||
|
|
||||||
// TODO @芋艿:未来应该支持自动生成;
|
// TODO @芋艿:未来应该支持自动生成;
|
||||||
@Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20230101")
|
@Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20230101")
|
||||||
|
@ExcelProperty("合同编号")
|
||||||
private String no;
|
private String no;
|
||||||
|
|
||||||
@Schema(description = "开始时间")
|
@Schema(description = "开始时间")
|
||||||
|
@ExcelProperty("开始时间")
|
||||||
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
private LocalDateTime startTime;
|
private LocalDateTime startTime;
|
||||||
|
|
||||||
@Schema(description = "结束时间")
|
@Schema(description = "结束时间")
|
||||||
|
@ExcelProperty("结束时间")
|
||||||
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
private LocalDateTime endTime;
|
private LocalDateTime endTime;
|
||||||
|
|
||||||
@Schema(description = "合同金额", example = "5617")
|
@Schema(description = "合同金额", example = "5617")
|
||||||
|
@ExcelProperty("合同金额")
|
||||||
private Integer price;
|
private Integer price;
|
||||||
|
|
||||||
@Schema(description = "整单折扣")
|
@Schema(description = "整单折扣")
|
||||||
|
@ExcelProperty("整单折扣")
|
||||||
private Integer discountPercent;
|
private Integer discountPercent;
|
||||||
|
|
||||||
@Schema(description = "产品总金额", example = "19510")
|
@Schema(description = "产品总金额", example = "19510")
|
||||||
|
@ExcelProperty("产品总金额")
|
||||||
private Integer productPrice;
|
private Integer productPrice;
|
||||||
|
|
||||||
@Schema(description = "联系人编号", example = "18546")
|
@Schema(description = "联系人编号", example = "18546")
|
||||||
|
@ExcelProperty("联系人编号")
|
||||||
private Long contactId;
|
private Long contactId;
|
||||||
|
|
||||||
@Schema(description = "公司签约人", example = "14036")
|
@Schema(description = "公司签约人", example = "14036")
|
||||||
|
@ExcelProperty("公司签约人")
|
||||||
private Long signUserId;
|
private Long signUserId;
|
||||||
|
|
||||||
@Schema(description = "最后跟进时间")
|
@Schema(description = "最后跟进时间")
|
||||||
|
@ExcelProperty("最后跟进时间")
|
||||||
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
private LocalDateTime contactLastTime;
|
private LocalDateTime contactLastTime;
|
||||||
|
|
||||||
@Schema(description = "备注", example = "你猜")
|
@Schema(description = "备注", example = "你猜")
|
||||||
|
@ExcelProperty("备注")
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
@ExcelProperty("创建时间")
|
||||||
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
private LocalDateTime createTime;
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
@Schema(description = "创建人", example = "25682")
|
@Schema(description = "创建人", example = "25682")
|
||||||
|
@ExcelProperty("创建人")
|
||||||
private String creator;
|
private String creator;
|
||||||
|
|
||||||
@Schema(description = "创建人名字", example = "test")
|
@Schema(description = "创建人名字", example = "test")
|
||||||
|
@ExcelProperty("创建人名字")
|
||||||
private String creatorName;
|
private String creatorName;
|
||||||
|
|
||||||
@Schema(description = "客户名字", example = "test")
|
@Schema(description = "客户名字", example = "test")
|
||||||
|
@ExcelProperty("客户名字")
|
||||||
private String customerName;
|
private String customerName;
|
||||||
|
|
||||||
@Schema(description = "负责人", example = "test")
|
@Schema(description = "负责人", example = "test")
|
||||||
|
@ExcelProperty("负责人")
|
||||||
private String ownerUserName;
|
private String ownerUserName;
|
||||||
|
|
||||||
@Schema(description = "审批状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
|
@Schema(description = "审批状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
|
||||||
|
@ExcelProperty("审批状态")
|
||||||
private Integer auditStatus;
|
private Integer auditStatus;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ import java.util.Map;
|
|||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap;
|
||||||
|
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||||
|
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 跟进记录")
|
@Tag(name = "管理后台 - 跟进记录")
|
||||||
@ -50,20 +51,12 @@ public class CrmFollowUpRecordController {
|
|||||||
return success(crmFollowUpRecordService.createFollowUpRecord(createReqVO));
|
return success(crmFollowUpRecordService.createFollowUpRecord(createReqVO));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PutMapping("/update")
|
|
||||||
@Operation(summary = "更新跟进记录")
|
|
||||||
@PreAuthorize("@ss.hasPermission('crm:follow-up-record:update')")
|
|
||||||
public CommonResult<Boolean> updateFollowUpRecord(@Valid @RequestBody CrmFollowUpRecordSaveReqVO updateReqVO) {
|
|
||||||
crmFollowUpRecordService.updateFollowUpRecord(updateReqVO);
|
|
||||||
return success(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@DeleteMapping("/delete")
|
@DeleteMapping("/delete")
|
||||||
@Operation(summary = "删除跟进记录")
|
@Operation(summary = "删除跟进记录")
|
||||||
@Parameter(name = "id", description = "编号", required = true)
|
@Parameter(name = "id", description = "编号", required = true)
|
||||||
@PreAuthorize("@ss.hasPermission('crm:follow-up-record:delete')")
|
@PreAuthorize("@ss.hasPermission('crm:follow-up-record:delete')")
|
||||||
public CommonResult<Boolean> deleteFollowUpRecord(@RequestParam("id") Long id) {
|
public CommonResult<Boolean> deleteFollowUpRecord(@RequestParam("id") Long id) {
|
||||||
crmFollowUpRecordService.deleteFollowUpRecord(id);
|
crmFollowUpRecordService.deleteFollowUpRecord(id, getLoginUserId());
|
||||||
return success(true);
|
return success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusi
|
|||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
||||||
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.service.business.bo.CrmBusinessUpdateFollowUpReqBO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -35,6 +36,13 @@ public interface CrmBusinessService {
|
|||||||
*/
|
*/
|
||||||
void updateBusiness(@Valid CrmBusinessSaveReqVO updateReqVO);
|
void updateBusiness(@Valid CrmBusinessSaveReqVO updateReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新商机相关跟进信息
|
||||||
|
*
|
||||||
|
* @param updateFollowUpReqBOList 跟进信息
|
||||||
|
*/
|
||||||
|
void updateContactFollowUpBatch(List<CrmBusinessUpdateFollowUpReqBO> updateFollowUpReqBOList);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除商机
|
* 删除商机
|
||||||
*
|
*
|
||||||
|
@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusi
|
|||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessSaveReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessTransferReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessTransferReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.product.CrmBusinessProductSaveReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.business.vo.product.CrmBusinessProductSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductSaveReqVO;
|
|
||||||
import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
|
import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
|
||||||
import cn.iocoder.yudao.module.crm.convert.businessproduct.CrmBusinessProductConvert;
|
import cn.iocoder.yudao.module.crm.convert.businessproduct.CrmBusinessProductConvert;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
|
||||||
@ -22,6 +21,7 @@ import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper;
|
|||||||
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
||||||
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
||||||
import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
|
import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.business.bo.CrmBusinessUpdateFollowUpReqBO;
|
||||||
import cn.iocoder.yudao.module.crm.service.contact.CrmContactBusinessService;
|
import cn.iocoder.yudao.module.crm.service.contact.CrmContactBusinessService;
|
||||||
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
||||||
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
|
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
|
||||||
@ -33,7 +33,6 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -95,6 +94,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|||||||
LogRecordContext.putVariable("business", business);
|
LogRecordContext.putVariable("business", business);
|
||||||
return business.getId();
|
return business.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param businessId 商机id
|
* @param businessId 商机id
|
||||||
* @param contactId 联系人id
|
* @param contactId 联系人id
|
||||||
@ -163,6 +163,11 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|||||||
LogRecordContext.putVariable("businessName", oldBusiness.getName());
|
LogRecordContext.putVariable("businessName", oldBusiness.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateContactFollowUpBatch(List<CrmBusinessUpdateFollowUpReqBO> updateFollowUpReqBOList) {
|
||||||
|
businessMapper.updateBatch(BeanUtils.toBean(updateFollowUpReqBOList, CrmBusinessDO.class));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@LogRecord(type = CRM_BUSINESS_TYPE, subType = CRM_BUSINESS_DELETE_SUB_TYPE, bizNo = "{{#id}}",
|
@LogRecord(type = CRM_BUSINESS_TYPE, subType = CRM_BUSINESS_DELETE_SUB_TYPE, bizNo = "{{#id}}",
|
||||||
@ -191,7 +196,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
|
|||||||
*/
|
*/
|
||||||
private void validateContractExists(Long businessId) {
|
private void validateContractExists(Long businessId) {
|
||||||
CrmContractDO contract = contractMapper.selectByBizId(businessId);
|
CrmContractDO contract = contractMapper.selectByBizId(businessId);
|
||||||
if(contract != null) {
|
if (contract != null) {
|
||||||
throw exception(BUSINESS_CONTRACT_EXISTS);
|
throw exception(BUSINESS_CONTRACT_EXISTS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.business.bo;
|
||||||
|
|
||||||
|
import com.mzt.logapi.starter.annotation.DiffLogField;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商机跟进信息 Update Req BO
|
||||||
|
*
|
||||||
|
* @author HUIHUI
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class CrmBusinessUpdateFollowUpReqBO {
|
||||||
|
|
||||||
|
@Schema(description = "商机编号", example = "3167")
|
||||||
|
@NotNull(message = "商机编号不能为空")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "最后跟进时间")
|
||||||
|
@DiffLogField(name = "最后跟进时间")
|
||||||
|
@NotNull(message = "最后跟进时间不能为空")
|
||||||
|
private LocalDateTime contactLastTime;
|
||||||
|
|
||||||
|
@Schema(description = "下次联系时间")
|
||||||
|
@DiffLogField(name = "下次联系时间")
|
||||||
|
@NotNull(message = "下次联系时间不能为空")
|
||||||
|
private LocalDateTime contactNextTime;
|
||||||
|
|
||||||
|
@Schema(description = "最后更进内容")
|
||||||
|
@DiffLogField(name = "最后更进内容")
|
||||||
|
@NotNull(message = "最后更进内容不能为空")
|
||||||
|
private String contactLastContent;
|
||||||
|
|
||||||
|
}
|
@ -6,6 +6,7 @@ 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.CrmClueTransformReqVO;
|
||||||
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.clue.bo.CrmClueUpdateFollowUpReqBO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -33,6 +34,13 @@ public interface CrmClueService {
|
|||||||
*/
|
*/
|
||||||
void updateClue(@Valid CrmClueSaveReqVO updateReqVO);
|
void updateClue(@Valid CrmClueSaveReqVO updateReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新线索相关的跟进信息
|
||||||
|
*
|
||||||
|
* @param clueUpdateFollowUpReqBO 信息
|
||||||
|
*/
|
||||||
|
void updateClueFollowUp(CrmClueUpdateFollowUpReqBO clueUpdateFollowUpReqBO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除线索
|
* 删除线索
|
||||||
*
|
*
|
||||||
|
@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.crm.dal.mysql.clue.CrmClueMapper;
|
|||||||
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
||||||
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
||||||
import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
|
import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.clue.bo.CrmClueUpdateFollowUpReqBO;
|
||||||
import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
|
import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
|
||||||
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
||||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
@ -82,6 +83,11 @@ public class CrmClueServiceImpl implements CrmClueService {
|
|||||||
clueMapper.updateById(updateObj);
|
clueMapper.updateById(updateObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateClueFollowUp(CrmClueUpdateFollowUpReqBO clueUpdateFollowUpReqBO) {
|
||||||
|
clueMapper.updateById(BeanUtils.toBean(clueUpdateFollowUpReqBO, CrmClueDO.class));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@CrmPermission(bizType = CrmBizTypeEnum.CRM_LEADS, bizId = "#id", level = CrmPermissionLevelEnum.OWNER)
|
@CrmPermission(bizType = CrmBizTypeEnum.CRM_LEADS, bizId = "#id", level = CrmPermissionLevelEnum.OWNER)
|
||||||
public void deleteClue(Long id) {
|
public void deleteClue(Long id) {
|
||||||
@ -159,7 +165,7 @@ public class CrmClueServiceImpl implements CrmClueService {
|
|||||||
// 1. 创建客户
|
// 1. 创建客户
|
||||||
CrmCustomerSaveReqVO customerSaveReqVO = BeanUtils.toBean(clue, CrmCustomerSaveReqVO.class).setId(null);
|
CrmCustomerSaveReqVO customerSaveReqVO = BeanUtils.toBean(clue, CrmCustomerSaveReqVO.class).setId(null);
|
||||||
Long customerId = customerService.createCustomer(customerSaveReqVO, userId);
|
Long customerId = customerService.createCustomer(customerSaveReqVO, userId);
|
||||||
// TODO @puhui999:如果有跟进记录,需要一起转过去;
|
// TODO @puhui999:如果有跟进记录,需要一起转过去;提问:艿艿这里是复制线索所有的跟进吗?还是直接把线索相关的跟进 bizType、bizId 全改为关联客户?
|
||||||
// 2. 更新线索
|
// 2. 更新线索
|
||||||
clueMapper.updateById(new CrmClueDO().setId(clue.getId())
|
clueMapper.updateById(new CrmClueDO().setId(clue.getId())
|
||||||
.setTransformStatus(Boolean.TRUE).setCustomerId(customerId));
|
.setTransformStatus(Boolean.TRUE).setCustomerId(customerId));
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.clue.bo;
|
||||||
|
|
||||||
|
import com.mzt.logapi.starter.annotation.DiffLogField;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 线索跟进信息 Update Req BO
|
||||||
|
*
|
||||||
|
* @author HUIHUI
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class CrmClueUpdateFollowUpReqBO {
|
||||||
|
|
||||||
|
@Schema(description = "线索编号", example = "3167")
|
||||||
|
@NotNull(message = "线索编号不能为空")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "最后跟进时间")
|
||||||
|
@DiffLogField(name = "最后跟进时间")
|
||||||
|
@NotNull(message = "最后跟进时间不能为空")
|
||||||
|
private LocalDateTime contactLastTime;
|
||||||
|
|
||||||
|
@Schema(description = "下次联系时间")
|
||||||
|
@DiffLogField(name = "下次联系时间")
|
||||||
|
@NotNull(message = "下次联系时间不能为空")
|
||||||
|
private LocalDateTime contactNextTime;
|
||||||
|
|
||||||
|
@Schema(description = "最后更进内容")
|
||||||
|
@DiffLogField(name = "最后更进内容")
|
||||||
|
@NotNull(message = "最后更进内容不能为空")
|
||||||
|
private String contactLastContent;
|
||||||
|
|
||||||
|
}
|
@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactSaveReq
|
|||||||
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactTransferReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactTransferReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
|
||||||
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.service.contact.bo.CrmContactUpdateFollowUpReqBO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -57,6 +58,14 @@ public interface CrmContactService {
|
|||||||
*/
|
*/
|
||||||
void updateOwnerUserIdByCustomerId(Long customerId, Long ownerUserId);
|
void updateOwnerUserIdByCustomerId(Long customerId, Long ownerUserId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新联系人相关跟进信息
|
||||||
|
*
|
||||||
|
* @param updateFollowUpReqBOList 跟进信息
|
||||||
|
*/
|
||||||
|
void updateContactFollowUpBatch(List<CrmContactUpdateFollowUpReqBO> updateFollowUpReqBOList);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得联系人
|
* 获得联系人
|
||||||
*
|
*
|
||||||
@ -89,6 +98,14 @@ public interface CrmContactService {
|
|||||||
*/
|
*/
|
||||||
List<CrmContactDO> getContactList();
|
List<CrmContactDO> getContactList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取联系人列表(校验权限)
|
||||||
|
*
|
||||||
|
* @param userId 用户编号
|
||||||
|
* @return 联系人列表
|
||||||
|
*/
|
||||||
|
List<CrmContactDO> getSimpleContactList(Long userId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得联系人分页
|
* 获得联系人分页
|
||||||
*
|
*
|
||||||
|
@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
|||||||
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
||||||
import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
|
import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
|
||||||
import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
|
import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.contact.bo.CrmContactUpdateFollowUpReqBO;
|
||||||
import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
|
import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
|
||||||
import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
|
import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
|
||||||
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
||||||
@ -32,6 +33,7 @@ import java.util.Collection;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE;
|
||||||
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
|
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
|
||||||
import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.*;
|
import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.*;
|
||||||
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS;
|
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS;
|
||||||
@ -192,6 +194,11 @@ public class CrmContactServiceImpl implements CrmContactService {
|
|||||||
contactMapper.updateOwnerUserIdByCustomerId(customerId, ownerUserId);
|
contactMapper.updateOwnerUserIdByCustomerId(customerId, ownerUserId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateContactFollowUpBatch(List<CrmContactUpdateFollowUpReqBO> updateFollowUpReqBOList) {
|
||||||
|
contactMapper.updateBatch(BeanUtils.toBean(updateFollowUpReqBOList, CrmContactDO.class));
|
||||||
|
}
|
||||||
|
|
||||||
//======================= 查询相关 =======================
|
//======================= 查询相关 =======================
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -221,6 +228,13 @@ public class CrmContactServiceImpl implements CrmContactService {
|
|||||||
return contactMapper.selectList();
|
return contactMapper.selectList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<CrmContactDO> getSimpleContactList(Long userId) {
|
||||||
|
CrmContactPageReqVO reqVO = new CrmContactPageReqVO();
|
||||||
|
reqVO.setPageSize(PAGE_SIZE_NONE); // 不分页
|
||||||
|
return contactMapper.selectPage(reqVO, userId).getList();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<CrmContactDO> getContactPage(CrmContactPageReqVO pageReqVO, Long userId) {
|
public PageResult<CrmContactDO> getContactPage(CrmContactPageReqVO pageReqVO, Long userId) {
|
||||||
return contactMapper.selectPage(pageReqVO, userId);
|
return contactMapper.selectPage(pageReqVO, userId);
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.contact.bo;
|
||||||
|
|
||||||
|
import com.mzt.logapi.starter.annotation.DiffLogField;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 联系人跟进信息 Update Req BO
|
||||||
|
*
|
||||||
|
* @author HUIHUI
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class CrmContactUpdateFollowUpReqBO {
|
||||||
|
|
||||||
|
@Schema(description = "联系人编号", example = "3167")
|
||||||
|
@NotNull(message = "联系人编号不能为空")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "最后跟进时间")
|
||||||
|
@DiffLogField(name = "最后跟进时间")
|
||||||
|
@NotNull(message = "最后跟进时间不能为空")
|
||||||
|
private LocalDateTime contactLastTime;
|
||||||
|
|
||||||
|
@Schema(description = "下次联系时间")
|
||||||
|
@DiffLogField(name = "下次联系时间")
|
||||||
|
@NotNull(message = "下次联系时间不能为空")
|
||||||
|
private LocalDateTime contactNextTime;
|
||||||
|
|
||||||
|
@Schema(description = "最后更进内容")
|
||||||
|
@DiffLogField(name = "最后更进内容")
|
||||||
|
@NotNull(message = "最后更进内容不能为空")
|
||||||
|
private String contactLastContent;
|
||||||
|
|
||||||
|
}
|
@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractSaveR
|
|||||||
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractTransferReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractTransferReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
|
||||||
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.service.contract.bo.CrmContractUpdateFollowUpReqBO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -41,6 +42,21 @@ public interface CrmContractService {
|
|||||||
*/
|
*/
|
||||||
void deleteContract(Long id);
|
void deleteContract(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合同转移
|
||||||
|
*
|
||||||
|
* @param reqVO 请求
|
||||||
|
* @param userId 用户编号
|
||||||
|
*/
|
||||||
|
void transferContract(CrmContractTransferReqVO reqVO, Long userId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新合同相关的更进信息
|
||||||
|
*
|
||||||
|
* @param contractUpdateFollowUpReqBO 信息
|
||||||
|
*/
|
||||||
|
void updateContractFollowUp(CrmContractUpdateFollowUpReqBO contractUpdateFollowUpReqBO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得合同
|
* 获得合同
|
||||||
*
|
*
|
||||||
@ -78,14 +94,6 @@ public interface CrmContractService {
|
|||||||
*/
|
*/
|
||||||
PageResult<CrmContractDO> getContractPageByCustomerId(CrmContractPageReqVO pageReqVO);
|
PageResult<CrmContractDO> getContractPageByCustomerId(CrmContractPageReqVO pageReqVO);
|
||||||
|
|
||||||
/**
|
|
||||||
* 合同转移
|
|
||||||
*
|
|
||||||
* @param reqVO 请求
|
|
||||||
* @param userId 用户编号
|
|
||||||
*/
|
|
||||||
void transferContract(CrmContractTransferReqVO reqVO, Long userId);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询属于某个联系人的合同数量
|
* 查询属于某个联系人的合同数量
|
||||||
*
|
*
|
||||||
|
@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper;
|
|||||||
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
||||||
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
||||||
import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
|
import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.contract.bo.CrmContractUpdateFollowUpReqBO;
|
||||||
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
||||||
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
|
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
|
||||||
import com.mzt.logapi.context.LogRecordContext;
|
import com.mzt.logapi.context.LogRecordContext;
|
||||||
@ -135,6 +136,11 @@ public class CrmContractServiceImpl implements CrmContractService {
|
|||||||
LogRecordContext.putVariable("contract", contract);
|
LogRecordContext.putVariable("contract", contract);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateContractFollowUp(CrmContractUpdateFollowUpReqBO contractUpdateFollowUpReqBO) {
|
||||||
|
contractMapper.updateById(BeanUtils.toBean(contractUpdateFollowUpReqBO, CrmContractDO.class));
|
||||||
|
}
|
||||||
|
|
||||||
//======================= 查询相关 =======================
|
//======================= 查询相关 =======================
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.contract.bo;
|
||||||
|
|
||||||
|
import com.mzt.logapi.starter.annotation.DiffLogField;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合同跟进信息 Update Req BO
|
||||||
|
*
|
||||||
|
* @author HUIHUI
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class CrmContractUpdateFollowUpReqBO {
|
||||||
|
|
||||||
|
@Schema(description = "合同编号", example = "3167")
|
||||||
|
@NotNull(message = "合同编号不能为空")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "最后跟进时间")
|
||||||
|
@DiffLogField(name = "最后跟进时间")
|
||||||
|
@NotNull(message = "最后跟进时间不能为空")
|
||||||
|
private LocalDateTime contactLastTime;
|
||||||
|
|
||||||
|
@Schema(description = "下次联系时间")
|
||||||
|
@DiffLogField(name = "下次联系时间")
|
||||||
|
@NotNull(message = "下次联系时间不能为空")
|
||||||
|
private LocalDateTime contactNextTime;
|
||||||
|
|
||||||
|
@Schema(description = "最后更进内容")
|
||||||
|
@DiffLogField(name = "最后更进内容")
|
||||||
|
@NotNull(message = "最后更进内容不能为空")
|
||||||
|
private String contactLastContent;
|
||||||
|
|
||||||
|
}
|
@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageR
|
|||||||
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.controller.admin.customer.vo.CrmCustomerTransferReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTransferReqVO;
|
||||||
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.service.customer.bo.CrmCustomerUpdateFollowUpReqBO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -90,6 +91,13 @@ public interface CrmCustomerService {
|
|||||||
*/
|
*/
|
||||||
void lockCustomer(@Valid CrmCustomerLockReqVO lockReqVO, Long userId);
|
void lockCustomer(@Valid CrmCustomerLockReqVO lockReqVO, Long userId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新客户相关更进信息
|
||||||
|
*
|
||||||
|
* @param customerUpdateFollowUpReqBO 请求
|
||||||
|
*/
|
||||||
|
void updateCustomerFollowUp(CrmCustomerUpdateFollowUpReqBO customerUpdateFollowUpReqBO);
|
||||||
|
|
||||||
// ==================== 公海相关操作 ====================
|
// ==================== 公海相关操作 ====================
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -21,6 +21,7 @@ import cn.iocoder.yudao.module.crm.framework.permission.core.util.CrmPermissionU
|
|||||||
import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
|
import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
|
||||||
import cn.iocoder.yudao.module.crm.service.contact.CrmContactService;
|
import cn.iocoder.yudao.module.crm.service.contact.CrmContactService;
|
||||||
import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
|
import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.customer.bo.CrmCustomerUpdateFollowUpReqBO;
|
||||||
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
||||||
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
|
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
|
||||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
@ -203,6 +204,11 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
|
|||||||
LogRecordContext.putVariable("customer", customer);
|
LogRecordContext.putVariable("customer", customer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateCustomerFollowUp(CrmCustomerUpdateFollowUpReqBO customerUpdateFollowUpReqBO) {
|
||||||
|
customerMapper.updateById(BeanUtils.toBean(customerUpdateFollowUpReqBO, CrmCustomerDO.class));
|
||||||
|
}
|
||||||
|
|
||||||
// ==================== 公海相关操作 ====================
|
// ==================== 公海相关操作 ====================
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -229,8 +235,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
|
|||||||
// 3. 删除负责人数据权限
|
// 3. 删除负责人数据权限
|
||||||
permissionService.deletePermission(CrmBizTypeEnum.CRM_CUSTOMER.getType(), customer.getId(),
|
permissionService.deletePermission(CrmBizTypeEnum.CRM_CUSTOMER.getType(), customer.getId(),
|
||||||
CrmPermissionLevelEnum.OWNER.getLevel());
|
CrmPermissionLevelEnum.OWNER.getLevel());
|
||||||
// TODO @puhui999:联系人的负责人,也要设置为 null;这块和领取是对应的;因为领取后,负责人也要关联过来;
|
// 联系人的负责人,也要设置为 null;这块和领取是对应的;因为领取后,负责人也要关联过来;
|
||||||
// 提问:那是不是可以这样理解客户所有联系人的负责人默认为客户的负责人,然后添加客户团队成员时才存在“同时分配给”的操作?
|
|
||||||
contactService.updateOwnerUserIdByCustomerId(customer.getId(), null);
|
contactService.updateOwnerUserIdByCustomerId(customer.getId(), null);
|
||||||
|
|
||||||
// 记录操作日志上下文
|
// 记录操作日志上下文
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.customer.bo;
|
||||||
|
|
||||||
|
import com.mzt.logapi.starter.annotation.DiffLogField;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跟进信息 Update Req BO
|
||||||
|
*
|
||||||
|
* @author HUIHUI
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class CrmCustomerUpdateFollowUpReqBO {
|
||||||
|
|
||||||
|
@Schema(description = "主键", example = "3167")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "最后跟进时间")
|
||||||
|
@DiffLogField(name = "最后跟进时间")
|
||||||
|
private LocalDateTime contactLastTime;
|
||||||
|
|
||||||
|
@Schema(description = "下次联系时间")
|
||||||
|
@DiffLogField(name = "下次联系时间")
|
||||||
|
private LocalDateTime contactNextTime;
|
||||||
|
|
||||||
|
@Schema(description = "最后更进内容")
|
||||||
|
@DiffLogField(name = "最后更进内容")
|
||||||
|
private String contactLastContent;
|
||||||
|
|
||||||
|
}
|
@ -14,7 +14,7 @@ import jakarta.validation.Valid;
|
|||||||
public interface CrmFollowUpRecordService {
|
public interface CrmFollowUpRecordService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建跟进记录
|
* 创建跟进记录 (数据权限基于 bizType、 bizId)
|
||||||
*
|
*
|
||||||
* @param createReqVO 创建信息
|
* @param createReqVO 创建信息
|
||||||
* @return 编号
|
* @return 编号
|
||||||
@ -22,18 +22,12 @@ public interface CrmFollowUpRecordService {
|
|||||||
Long createFollowUpRecord(@Valid CrmFollowUpRecordSaveReqVO createReqVO);
|
Long createFollowUpRecord(@Valid CrmFollowUpRecordSaveReqVO createReqVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新跟进记录
|
* 删除跟进记录 (数据权限基于 bizType、 bizId)
|
||||||
*
|
|
||||||
* @param updateReqVO 更新信息
|
|
||||||
*/
|
|
||||||
void updateFollowUpRecord(@Valid CrmFollowUpRecordSaveReqVO updateReqVO);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除跟进记录
|
|
||||||
*
|
*
|
||||||
* @param id 编号
|
* @param id 编号
|
||||||
|
* @param userId 用户编号
|
||||||
*/
|
*/
|
||||||
void deleteFollowUpRecord(Long id);
|
void deleteFollowUpRecord(Long id, Long userId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得跟进记录
|
* 获得跟进记录
|
||||||
@ -44,7 +38,7 @@ public interface CrmFollowUpRecordService {
|
|||||||
CrmFollowUpRecordDO getFollowUpRecord(Long id);
|
CrmFollowUpRecordDO getFollowUpRecord(Long id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得跟进记录分页
|
* 获得跟进记录分页 (数据权限基于 bizType、 bizId)
|
||||||
*
|
*
|
||||||
* @param pageReqVO 分页查询
|
* @param pageReqVO 分页查询
|
||||||
* @return 跟进记录分页
|
* @return 跟进记录分页
|
||||||
|
@ -1,16 +1,33 @@
|
|||||||
package cn.iocoder.yudao.module.crm.service.followup;
|
package cn.iocoder.yudao.module.crm.service.followup;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.util.ObjUtil;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.followup.vo.CrmFollowUpRecordPageReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.followup.vo.CrmFollowUpRecordPageReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.followup.vo.CrmFollowUpRecordSaveReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.followup.vo.CrmFollowUpRecordSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.followup.CrmFollowUpRecordMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.followup.CrmFollowUpRecordMapper;
|
||||||
|
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
||||||
|
import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.business.bo.CrmBusinessUpdateFollowUpReqBO;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.contact.CrmContactService;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.contact.bo.CrmContactUpdateFollowUpReqBO;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.followup.handle.CrmFollowUpHandler;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
||||||
|
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.FOLLOW_UP_RECORD_DELETE_DENIED;
|
||||||
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.FOLLOW_UP_RECORD_NOT_EXISTS;
|
import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.FOLLOW_UP_RECORD_NOT_EXISTS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -25,39 +42,69 @@ public class CrmFollowUpRecordServiceImpl implements CrmFollowUpRecordService {
|
|||||||
@Resource
|
@Resource
|
||||||
private CrmFollowUpRecordMapper crmFollowUpRecordMapper;
|
private CrmFollowUpRecordMapper crmFollowUpRecordMapper;
|
||||||
|
|
||||||
// TODO @puhui999:数据权限
|
@Resource
|
||||||
|
private CrmPermissionService permissionService;
|
||||||
|
@Resource
|
||||||
|
private List<CrmFollowUpHandler> followUpHandlers;
|
||||||
|
@Resource
|
||||||
|
private CrmBusinessService businessService;
|
||||||
|
@Resource
|
||||||
|
private CrmContactService contactService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@CrmPermission(bizTypeValue = "#createReqVO.bizType", bizId = "#createReqVO.bizId", level = CrmPermissionLevelEnum.WRITE)
|
||||||
public Long createFollowUpRecord(CrmFollowUpRecordSaveReqVO createReqVO) {
|
public Long createFollowUpRecord(CrmFollowUpRecordSaveReqVO createReqVO) {
|
||||||
|
// 创建更进记录
|
||||||
CrmFollowUpRecordDO followUpRecord = BeanUtils.toBean(createReqVO, CrmFollowUpRecordDO.class);
|
CrmFollowUpRecordDO followUpRecord = BeanUtils.toBean(createReqVO, CrmFollowUpRecordDO.class);
|
||||||
crmFollowUpRecordMapper.insert(followUpRecord);
|
crmFollowUpRecordMapper.insert(followUpRecord);
|
||||||
// TODO @puhui999:需要更新 bizId 对应的记录;
|
|
||||||
// TODO @puhui999:需要更新 businessIds、contactIds 对应的记录;
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
// 更新 bizId 对应的记录;
|
||||||
|
followUpHandlers.forEach(handler -> handler.execute(followUpRecord, now));
|
||||||
|
// 更新 contactIds 对应的记录
|
||||||
|
if (CollUtil.isNotEmpty(createReqVO.getContactIds())) {
|
||||||
|
contactService.updateContactFollowUpBatch(convertList(createReqVO.getContactIds(), contactId -> {
|
||||||
|
CrmContactUpdateFollowUpReqBO crmContactUpdateFollowUpReqBO = new CrmContactUpdateFollowUpReqBO();
|
||||||
|
crmContactUpdateFollowUpReqBO.setId(contactId).setContactNextTime(followUpRecord.getNextTime())
|
||||||
|
.setContactLastTime(now).setContactLastContent(followUpRecord.getContent());
|
||||||
|
return crmContactUpdateFollowUpReqBO;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
// 需要更新 businessIds、contactIds 对应的记录
|
||||||
|
if (CollUtil.isNotEmpty(createReqVO.getBusinessIds())) {
|
||||||
|
businessService.updateContactFollowUpBatch(convertList(createReqVO.getBusinessIds(), businessId -> {
|
||||||
|
CrmBusinessUpdateFollowUpReqBO crmBusinessUpdateFollowUpReqBO = new CrmBusinessUpdateFollowUpReqBO();
|
||||||
|
crmBusinessUpdateFollowUpReqBO.setId(businessId).setContactNextTime(followUpRecord.getNextTime())
|
||||||
|
.setContactLastTime(now).setContactLastContent(followUpRecord.getContent());
|
||||||
|
return crmBusinessUpdateFollowUpReqBO;
|
||||||
|
}));
|
||||||
|
}
|
||||||
return followUpRecord.getId();
|
return followUpRecord.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO @puhui999:不能编辑~~~
|
|
||||||
@Override
|
@Override
|
||||||
public void updateFollowUpRecord(CrmFollowUpRecordSaveReqVO updateReqVO) {
|
public void deleteFollowUpRecord(Long id, Long userId) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
validateFollowUpRecordExists(updateReqVO.getId());
|
CrmFollowUpRecordDO followUpRecord = validateFollowUpRecordExists(id);
|
||||||
// 更新
|
// 校验权限
|
||||||
CrmFollowUpRecordDO updateObj = BeanUtils.toBean(updateReqVO, CrmFollowUpRecordDO.class);
|
List<CrmPermissionDO> permissionList = permissionService.getPermissionListByBiz(
|
||||||
crmFollowUpRecordMapper.updateById(updateObj);
|
followUpRecord.getBizType(), followUpRecord.getBizId());
|
||||||
|
boolean condition = anyMatch(permissionList, permission ->
|
||||||
|
ObjUtil.equal(permission.getUserId(), userId) && ObjUtil.equal(permission.getLevel(), CrmPermissionLevelEnum.OWNER.getLevel()));
|
||||||
|
if (!condition) {
|
||||||
|
throw exception(FOLLOW_UP_RECORD_DELETE_DENIED);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO @puhui999:数据权限
|
|
||||||
@Override
|
|
||||||
public void deleteFollowUpRecord(Long id) {
|
|
||||||
// 校验存在
|
|
||||||
validateFollowUpRecordExists(id);
|
|
||||||
// 删除
|
// 删除
|
||||||
crmFollowUpRecordMapper.deleteById(id);
|
crmFollowUpRecordMapper.deleteById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void validateFollowUpRecordExists(Long id) {
|
private CrmFollowUpRecordDO validateFollowUpRecordExists(Long id) {
|
||||||
if (crmFollowUpRecordMapper.selectById(id) == null) {
|
CrmFollowUpRecordDO followUpRecord = crmFollowUpRecordMapper.selectById(id);
|
||||||
|
if (followUpRecord == null) {
|
||||||
throw exception(FOLLOW_UP_RECORD_NOT_EXISTS);
|
throw exception(FOLLOW_UP_RECORD_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
|
return followUpRecord;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -65,8 +112,9 @@ public class CrmFollowUpRecordServiceImpl implements CrmFollowUpRecordService {
|
|||||||
return crmFollowUpRecordMapper.selectById(id);
|
return crmFollowUpRecordMapper.selectById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO @puhui999:数据权限
|
|
||||||
@Override
|
@Override
|
||||||
|
@CrmPermission(bizTypeValue = "#pageReqVO.bizType", bizId = "#pageReqVO.bizId", level = CrmPermissionLevelEnum.READ)
|
||||||
public PageResult<CrmFollowUpRecordDO> getFollowUpRecordPage(CrmFollowUpRecordPageReqVO pageReqVO) {
|
public PageResult<CrmFollowUpRecordDO> getFollowUpRecordPage(CrmFollowUpRecordPageReqVO pageReqVO) {
|
||||||
return crmFollowUpRecordMapper.selectPage(pageReqVO);
|
return crmFollowUpRecordMapper.selectPage(pageReqVO);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.followup.handle;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjUtil;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.business.bo.CrmBusinessUpdateFollowUpReqBO;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CRM 商机的 {@link CrmFollowUpHandler} 实现类
|
||||||
|
*
|
||||||
|
* @author HUIHUI
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class CrmBusinessFollowUpHandler implements CrmFollowUpHandler {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CrmBusinessService businessService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(CrmFollowUpRecordDO followUpRecord, LocalDateTime now) {
|
||||||
|
if (ObjUtil.notEqual(CrmBizTypeEnum.CRM_BUSINESS.getType(), followUpRecord.getBizType())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新商机跟进信息
|
||||||
|
CrmBusinessUpdateFollowUpReqBO businessUpdateFollowUpReqBO = new CrmBusinessUpdateFollowUpReqBO();
|
||||||
|
businessUpdateFollowUpReqBO.setId(followUpRecord.getBizId()).setContactNextTime(followUpRecord.getNextTime())
|
||||||
|
.setContactLastTime(now).setContactLastContent(followUpRecord.getContent());
|
||||||
|
businessService.updateContactFollowUpBatch(Collections.singletonList(businessUpdateFollowUpReqBO));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.followup.handle;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjUtil;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.clue.CrmClueService;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.clue.bo.CrmClueUpdateFollowUpReqBO;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CRM 线索的 {@link CrmFollowUpHandler} 实现类
|
||||||
|
*
|
||||||
|
* @author HUIHUI
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class CrmClueFollowUpHandler implements CrmFollowUpHandler {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CrmClueService clueService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(CrmFollowUpRecordDO followUpRecord, LocalDateTime now) {
|
||||||
|
if (ObjUtil.notEqual(CrmBizTypeEnum.CRM_LEADS.getType(), followUpRecord.getBizType())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新线索跟进信息
|
||||||
|
CrmClueUpdateFollowUpReqBO clueUpdateFollowUpReqBO = new CrmClueUpdateFollowUpReqBO();
|
||||||
|
clueUpdateFollowUpReqBO.setId(followUpRecord.getBizId()).setContactNextTime(followUpRecord.getNextTime())
|
||||||
|
.setContactLastTime(now).setContactLastContent(followUpRecord.getContent());
|
||||||
|
clueService.updateClueFollowUp(clueUpdateFollowUpReqBO);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.followup.handle;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjUtil;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.contact.CrmContactService;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.contact.bo.CrmContactUpdateFollowUpReqBO;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CRM 联系人的 {@link CrmFollowUpHandler} 实现类
|
||||||
|
*
|
||||||
|
* @author HUIHUI
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class CrmContactFollowUpHandler implements CrmFollowUpHandler {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CrmContactService contactService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(CrmFollowUpRecordDO followUpRecord, LocalDateTime now) {
|
||||||
|
if (ObjUtil.notEqual(CrmBizTypeEnum.CRM_CONTACT.getType(), followUpRecord.getBizType())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新联系人跟进信息
|
||||||
|
CrmContactUpdateFollowUpReqBO contactUpdateFollowUpReqBO = new CrmContactUpdateFollowUpReqBO();
|
||||||
|
contactUpdateFollowUpReqBO.setId(followUpRecord.getBizId()).setContactNextTime(followUpRecord.getNextTime())
|
||||||
|
.setContactLastTime(now).setContactLastContent(followUpRecord.getContent());
|
||||||
|
contactService.updateContactFollowUpBatch(Collections.singletonList(contactUpdateFollowUpReqBO));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.followup.handle;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjUtil;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.contract.bo.CrmContractUpdateFollowUpReqBO;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CRM 合同的 {@link CrmFollowUpHandler} 实现类
|
||||||
|
*
|
||||||
|
* @author HUIHUI
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class CrmContractFollowUpHandler implements CrmFollowUpHandler {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CrmContractService contractService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(CrmFollowUpRecordDO followUpRecord, LocalDateTime now) {
|
||||||
|
if (ObjUtil.notEqual(CrmBizTypeEnum.CRM_CONTRACT.getType(), followUpRecord.getBizType())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新合同跟进信息
|
||||||
|
CrmContractUpdateFollowUpReqBO contractUpdateFollowUpReqBO = new CrmContractUpdateFollowUpReqBO();
|
||||||
|
contractUpdateFollowUpReqBO.setId(followUpRecord.getBizId()).setContactNextTime(followUpRecord.getNextTime())
|
||||||
|
.setContactLastTime(now).setContactLastContent(followUpRecord.getContent());
|
||||||
|
contractService.updateContractFollowUp(contractUpdateFollowUpReqBO);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.followup.handle;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjUtil;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.customer.bo.CrmCustomerUpdateFollowUpReqBO;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CRM 客户的 {@link CrmFollowUpHandler} 实现类
|
||||||
|
*
|
||||||
|
* @author HUIHUI
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class CrmCustomerFollowUpHandler implements CrmFollowUpHandler {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CrmCustomerService customerService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(CrmFollowUpRecordDO followUpRecord, LocalDateTime now) {
|
||||||
|
if (ObjUtil.notEqual(CrmBizTypeEnum.CRM_CUSTOMER.getType(), followUpRecord.getBizType())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新客户跟进信息
|
||||||
|
CrmCustomerUpdateFollowUpReqBO customerUpdateFollowUpReqBO = new CrmCustomerUpdateFollowUpReqBO();
|
||||||
|
customerUpdateFollowUpReqBO.setId(followUpRecord.getBizId()).setContactNextTime(followUpRecord.getNextTime())
|
||||||
|
.setContactLastTime(now).setContactLastContent(followUpRecord.getContent());
|
||||||
|
customerService.updateCustomerFollowUp(customerUpdateFollowUpReqBO);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.followup.handle;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CRM 跟进信息处理器 handler 接口
|
||||||
|
*
|
||||||
|
* @author HUIHUI
|
||||||
|
*/
|
||||||
|
public interface CrmFollowUpHandler {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行更新
|
||||||
|
*
|
||||||
|
* @param followUpRecord 跟进记录
|
||||||
|
* @param now 跟进时间
|
||||||
|
*/
|
||||||
|
void execute(CrmFollowUpRecordDO followUpRecord, LocalDateTime now);
|
||||||
|
|
||||||
|
}
|
@ -2,16 +2,15 @@ package cn.iocoder.yudao.module.product.service.category;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
||||||
import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO;
|
|
||||||
import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO;
|
import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO;
|
||||||
import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategorySaveReqVO;
|
import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategorySaveReqVO;
|
||||||
import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO;
|
import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO;
|
||||||
import cn.iocoder.yudao.module.product.dal.mysql.category.ProductCategoryMapper;
|
import cn.iocoder.yudao.module.product.dal.mysql.category.ProductCategoryMapper;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
import org.junit.jupiter.api.Disabled;
|
import org.junit.jupiter.api.Disabled;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
|
|
||||||
import jakarta.annotation.Resource;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
|
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
|
||||||
@ -21,7 +20,8 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId
|
|||||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
|
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
|
||||||
import static cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO.PARENT_ID_NULL;
|
import static cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO.PARENT_ID_NULL;
|
||||||
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.CATEGORY_NOT_EXISTS;
|
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.CATEGORY_NOT_EXISTS;
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link ProductCategoryServiceImpl} 的单元测试类
|
* {@link ProductCategoryServiceImpl} 的单元测试类
|
||||||
@ -41,22 +41,22 @@ public class ProductCategoryServiceImplTest extends BaseDbUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testCreateCategory_success() {
|
public void testCreateCategory_success() {
|
||||||
// 准备参数
|
// 准备参数
|
||||||
ProductCategoryCreateReqVO reqVO = randomPojo(ProductCategoryCreateReqVO.class);
|
//ProductCategoryCreateReqVO reqVO = randomPojo(ProductCategoryCreateReqVO.class);
|
||||||
|
|
||||||
// mock 父类
|
// mock 父类
|
||||||
ProductCategoryDO parentProductCategory = randomPojo(ProductCategoryDO.class, o -> {
|
//ProductCategoryDO parentProductCategory = randomPojo(ProductCategoryDO.class, o -> {
|
||||||
reqVO.setParentId(o.getId());
|
// reqVO.setParentId(o.getId());
|
||||||
o.setParentId(PARENT_ID_NULL);
|
// o.setParentId(PARENT_ID_NULL);
|
||||||
});
|
//});
|
||||||
productCategoryMapper.insert(parentProductCategory);
|
//productCategoryMapper.insert(parentProductCategory);
|
||||||
|
//
|
||||||
// 调用
|
//// 调用
|
||||||
Long categoryId = productCategoryService.createCategory(reqVO);
|
//Long categoryId = productCategoryService.createCategory(reqVO);
|
||||||
// 断言
|
//// 断言
|
||||||
assertNotNull(categoryId);
|
//assertNotNull(categoryId);
|
||||||
// 校验记录的属性是否正确
|
//// 校验记录的属性是否正确
|
||||||
ProductCategoryDO category = productCategoryMapper.selectById(categoryId);
|
//ProductCategoryDO category = productCategoryMapper.selectById(categoryId);
|
||||||
assertPojoEquals(reqVO, category);
|
//assertPojoEquals(reqVO, category);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
Loading…
Reference in New Issue
Block a user