@@ -2,9 +2,11 @@ package cn.iocoder.yudao.module.crm.service.customer;
import cn.hutool.core.collection.CollUtil ;
import cn.hutool.core.lang.Assert ;
import cn.hutool.core.util.ObjUtil ;
import cn.hutool.extra.spring.SpringUtil ;
import cn.iocoder.yudao.framework.common.pojo.PageResult ;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils ;
import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils ;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils ;
import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLockReqVO ;
import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO ;
@@ -13,6 +15,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerTrans
import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert ;
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO ;
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO ;
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO ;
import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper ;
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum ;
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum ;
@@ -31,6 +34,7 @@ import com.mzt.logapi.context.LogRecordContext;
import com.mzt.logapi.service.impl.DiffParseFunction ;
import com.mzt.logapi.starter.annotation.LogRecord ;
import jakarta.annotation.Resource ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.context.annotation.Lazy ;
import org.springframework.stereotype.Service ;
import org.springframework.transaction.annotation.Transactional ;
@@ -55,6 +59,7 @@ import static java.util.Collections.singletonList;
* @author Wanwan
*/
@Service
@Slf4j
@Validated
public class CrmCustomerServiceImpl implements CrmCustomerService {
@@ -67,6 +72,9 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
private CrmCustomerLimitConfigService customerLimitConfigService ;
@Resource
@Lazy
private CrmCustomerPoolConfigService customerPoolConfigService ;
@Resource
@Lazy
private CrmContactService contactService ;
@Resource
@Lazy
@@ -245,17 +253,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
// 1.3. 校验客户是否锁定
validateCustomerIsLocked ( customer , true ) ;
// 2.1 设置负责人为 NULL
int updateOwnerUserIncr = customerMapper . updateOwnerUserIdById ( customer . getId ( ) , null ) ;
if ( updateOwnerUserIncr = = 0 ) {
throw exception ( CUSTOMER_UPDATE_OWNER_USER_FAIL ) ;
}
// 2.2 删除负责人数据权限
permissionService . deletePermission ( CrmBizTypeEnum . CRM_CUSTOMER . getType ( ) , customer . getId ( ) ,
CrmPermissionLevelEnum . OWNER . getLevel ( ) ) ;
// 3. 联系人的负责人,也要设置为 null。因为: 因为领取后, 负责人也要关联过来, 这块和 receiveCustomer 是对应的
contactService . updateOwnerUserIdByCustomerId ( customer . getId ( ) , null ) ;
// 2. 客户放入公海
putCustomerPool ( customer ) ;
// 记录操作日志上下文
LogRecordContext . putVariable ( " customerName " , customer . getName ( ) ) ;
@@ -313,6 +312,49 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
}
}
@Override
public int customerAutoPutPoolBySystem ( ) {
CrmCustomerPoolConfigDO poolConfig = customerPoolConfigService . getCustomerPoolConfig ( ) ;
if ( poolConfig = = null | | ! poolConfig . getEnabled ( ) ) {
return 0 ;
}
// 获取没有锁定的不在公海的客户
List < CrmCustomerDO > customerList = customerMapper . selectListByLockStatusAndOwnerUserIdNotNull ( Boolean . FALSE ) ;
List < CrmCustomerDO > poolCustomerList = CollectionUtils . filterList ( customerList , customer - > {
// 1.1 未成交放入公海
if ( ! customer . getDealStatus ( ) ) {
return ( poolConfig . getDealExpireDays ( ) - LocalDateTimeUtils . between ( customer . getCreateTime ( ) ) ) < = 0 ;
}
// 1.2 未跟进放入公海
LocalDateTime lastTime = ObjUtil . defaultIfNull ( customer . getContactLastTime ( ) , customer . getCreateTime ( ) ) ;
return ( poolConfig . getContactExpireDays ( ) - LocalDateTimeUtils . between ( lastTime ) ) < = 0 ;
} ) ;
int count = 0 ;
for ( CrmCustomerDO customer : poolCustomerList ) {
try {
getSelf ( ) . putCustomerPool ( customer ) ;
count + + ;
} catch ( Throwable e ) {
log . error ( " [customerAutoPutPoolBySystem][Customer 客户({}) 放入公海异常] " , customer . getId ( ) , e ) ;
}
}
return count ;
}
private void putCustomerPool ( CrmCustomerDO customer ) {
// 1. 设置负责人为 NULL
int updateOwnerUserIncr = customerMapper . updateOwnerUserIdById ( customer . getId ( ) , null ) ;
if ( updateOwnerUserIncr = = 0 ) {
throw exception ( CUSTOMER_UPDATE_OWNER_USER_FAIL ) ;
}
// 2. 删除负责人数据权限
permissionService . deletePermission ( CrmBizTypeEnum . CRM_CUSTOMER . getType ( ) , customer . getId ( ) ,
CrmPermissionLevelEnum . OWNER . getLevel ( ) ) ;
// 3. 联系人的负责人,也要设置为 null。因为: 因为领取后, 负责人也要关联过来, 这块和 receiveCustomer 是对应的
contactService . updateOwnerUserIdByCustomerId ( customer . getId ( ) , null ) ;
}
@LogRecord ( type = CRM_CUSTOMER_TYPE , subType = CRM_CUSTOMER_RECEIVE_SUB_TYPE , bizNo = " {{#customer.id}} " ,
success = CRM_CUSTOMER_RECEIVE_SUCCESS )
public void receiveCustomerLog ( CrmCustomerDO customer , String ownerUserName ) {