Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
J
jiedao-api-boot-master
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lanbaoming
jiedao-api-boot-master
Commits
26c696cf
Commit
26c696cf
authored
Sep 20, 2024
by
yanghao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: 1、客户合并bug修复 2、添加事务
parent
49d9dfc1
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
382 additions
and
299 deletions
+382
-299
CustomerComplaintMapper.java
.../customer/dal/mysql/customer/CustomerComplaintMapper.java
+1
-1
CustomerMapper.java
...ao/module/customer/dal/mysql/customer/CustomerMapper.java
+3
-3
CustomerComplaintServiceImpl.java
...vice/customer/complaint/CustomerComplaintServiceImpl.java
+1
-1
CustomerController.http
...ustomer/controller/admin/customer/CustomerController.http
+1
-1
CustomerController.java
...ustomer/controller/admin/customer/CustomerController.java
+14
-293
CustomerMergeService.java
...tomer/controller/admin/customer/CustomerMergeService.java
+10
-0
CustomerMergeServiceImpl.java
...r/controller/admin/customer/CustomerMergeServiceImpl.java
+352
-0
No files found.
yudao-module-customer/yudao-module-customer-core/src/main/java/cn/iocoder/yudao/module/customer/dal/mysql/customer/CustomerComplaintMapper.java
View file @
26c696cf
...
@@ -122,7 +122,7 @@ public interface CustomerComplaintMapper extends BaseMapperX<CustomerComplaintDO
...
@@ -122,7 +122,7 @@ public interface CustomerComplaintMapper extends BaseMapperX<CustomerComplaintDO
"</script>"
"</script>"
})
})
List
<
CustomerComplaintExcelVO
>
selectList
(
@Param
(
"query"
)
CustomerComplaintExportReqVO
query
);
List
<
CustomerComplaintExcelVO
>
select
Excel
List
(
@Param
(
"query"
)
CustomerComplaintExportReqVO
query
);
}
}
yudao-module-customer/yudao-module-customer-core/src/main/java/cn/iocoder/yudao/module/customer/dal/mysql/customer/CustomerMapper.java
View file @
26c696cf
...
@@ -25,13 +25,13 @@ import java.util.List;
...
@@ -25,13 +25,13 @@ import java.util.List;
public
interface
CustomerMapper
extends
BaseMapperX
<
CustomerDO
>
{
public
interface
CustomerMapper
extends
BaseMapperX
<
CustomerDO
>
{
//合并操作日志
//合并操作日志
void
doMergeCustomerOperateLog
(
long
customer_id1
,
l
ong
customer_id2
);
void
doMergeCustomerOperateLog
(
@Param
(
"customer_id1"
)
Long
customer_id1
,
@Param
(
"customer_id2"
)
L
ong
customer_id2
);
//合并客户信用日志
//合并客户信用日志
void
doMergeCustomerCreditLog
(
long
customer_id1
,
l
ong
customer_id2
);
void
doMergeCustomerCreditLog
(
@Param
(
"customer_id1"
)
Long
customer_id1
,
@Param
(
"customer_id2"
)
L
ong
customer_id2
);
//合并客户登记日志
//合并客户登记日志
void
doMergeCustomerLevelLog
(
long
customer_id1
,
l
ong
customer_id2
);
void
doMergeCustomerLevelLog
(
@Param
(
"customer_id1"
)
Long
customer_id1
,
@Param
(
"customer_id2"
)
L
ong
customer_id2
);
IPage
<
CustomerDO
>
getPage
(
IPage
<
CustomerDO
>
page
,
IPage
<
CustomerDO
>
getPage
(
IPage
<
CustomerDO
>
page
,
@Param
(
Constants
.
WRAPPER
)
Wrapper
<
CustomerDO
>
queryWrapper
);
@Param
(
Constants
.
WRAPPER
)
Wrapper
<
CustomerDO
>
queryWrapper
);
...
...
yudao-module-customer/yudao-module-customer-core/src/main/java/cn/iocoder/yudao/module/customer/service/customer/complaint/CustomerComplaintServiceImpl.java
View file @
26c696cf
...
@@ -131,7 +131,7 @@ public class CustomerComplaintServiceImpl extends AbstractService<CustomerCompla
...
@@ -131,7 +131,7 @@ public class CustomerComplaintServiceImpl extends AbstractService<CustomerCompla
@Override
@Override
public
List
<
CustomerComplaintExcelVO
>
getCustomerComplaintList
(
CustomerComplaintExportReqVO
exportReqVO
)
{
public
List
<
CustomerComplaintExcelVO
>
getCustomerComplaintList
(
CustomerComplaintExportReqVO
exportReqVO
)
{
return
customerComplaintMapper
.
selectList
(
exportReqVO
);
return
customerComplaintMapper
.
select
Excel
List
(
exportReqVO
);
}
}
}
}
yudao-module-customer/yudao-module-customer-rest/src/main/java/cn/iocoder/yudao/module/customer/controller/admin/customer/CustomerController.http
View file @
26c696cf
...
@@ -15,7 +15,7 @@ Content-Type: application/json
...
@@ -15,7 +15,7 @@ Content-Type: application/json
### 合并客户
### 合并客户
GET {{baseUrl}}/ecw/customer/mergeCus?customerIdSaved=520
09&customerIdDeleted=51966
GET {{baseUrl}}/ecw/customer/mergeCus?customerIdSaved=520
43&customerIdDeleted=52042
Authorization: Bearer {{token}}
Authorization: Bearer {{token}}
tenant-id: {{adminTenentId}}
tenant-id: {{adminTenentId}}
Content-Type: application/json
Content-Type: application/json
...
...
yudao-module-customer/yudao-module-customer-rest/src/main/java/cn/iocoder/yudao/module/customer/controller/admin/customer/CustomerController.java
View file @
26c696cf
...
@@ -89,6 +89,7 @@ import lombok.extern.slf4j.Slf4j;
...
@@ -89,6 +89,7 @@ import lombok.extern.slf4j.Slf4j;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.annotations.NotNull
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.*
;
...
@@ -117,6 +118,9 @@ public class CustomerController {
...
@@ -117,6 +118,9 @@ public class CustomerController {
@Resource
@Resource
private
CustomerService
customerService
;
private
CustomerService
customerService
;
@Resource
private
CustomerMergeService
customerMergeService
;
@Resource
@Resource
private
CustomerBankService
customerBankService
;
private
CustomerBankService
customerBankService
;
...
@@ -126,9 +130,6 @@ public class CustomerController {
...
@@ -126,9 +130,6 @@ public class CustomerController {
@Resource
@Resource
private
AdminUserApi
adminUserApi
;
private
AdminUserApi
adminUserApi
;
@Resource
private
OrderApi
orderApi
;
@Resource
@Resource
private
CountryService
countryService
;
private
CountryService
countryService
;
...
@@ -151,12 +152,6 @@ public class CustomerController {
...
@@ -151,12 +152,6 @@ public class CustomerController {
private
ParamValidatorService
paramValidatorService
;
private
ParamValidatorService
paramValidatorService
;
@Resource
@Resource
private
InternalMessageService
internalMessageService
;
private
InternalMessageService
internalMessageService
;
@Resource
private
CustomerLevelService
customerLevelService
;
@Resource
private
CustomerCreditService
customerCreditService
;
@Resource
@Resource
private
ParamValidatorApi
paramValidatorApi
;
private
ParamValidatorApi
paramValidatorApi
;
...
@@ -167,38 +162,8 @@ public class CustomerController {
...
@@ -167,38 +162,8 @@ public class CustomerController {
@Resource
@Resource
CustomerDetailMapper
customerDetailMapper
;
CustomerDetailMapper
customerDetailMapper
;
@Resource
OfferService
offerService
;
//客户跟进
@Resource
CustomerFollowService
customerFollowService
;
@Resource
private
CustomerComplaintService
customerComplaintService
;
@Resource
private
ReceiptServiceImpl
receiptService
;
@Resource
private
ProductBrandEmpowerServiceImpl
productBrandEmpowerService
;
//客户登记日志
@Resource
private
CustomerLevelLogServiceImpl
customerLevelLogService
;
@Resource
private
CustomerOperateLogService
customerOperateLogService
;
@Resource
private
TargetLogService
targetLogService
;
@Resource
private
CommissionPayableService
commissionPayableService
;
@Resource
private
CommissionPaymentService
commissionPaymentService
;
public
CustomerController
()
{
public
CustomerController
()
{
}
}
...
@@ -400,6 +365,7 @@ public class CustomerController {
...
@@ -400,6 +365,7 @@ public class CustomerController {
@GetMapping
(
"/mergeCus"
)
@GetMapping
(
"/mergeCus"
)
@ApiOperation
(
"合并客户信息"
)
@ApiOperation
(
"合并客户信息"
)
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
CommonResult
<
Boolean
>
mergeCus
(
public
CommonResult
<
Boolean
>
mergeCus
(
@Valid
CustomerMerge
par
)
{
@Valid
CustomerMerge
par
)
{
//1. 保留客户和非主客户,不能在两个不同的客户经理名下,
//1. 保留客户和非主客户,不能在两个不同的客户经理名下,
...
@@ -409,278 +375,33 @@ public class CustomerController {
...
@@ -409,278 +375,33 @@ public class CustomerController {
// 客户投诉,品牌授权都迁移到保留客户中,其他信息不会迁移,
// 客户投诉,品牌授权都迁移到保留客户中,其他信息不会迁移,
// 如需要维护非主客户的客户档案信息到保留客户中,请先维护好再操作
// 如需要维护非主客户的客户档案信息到保留客户中,请先维护好再操作
CustomerDO
customerDO
1
=
customerService
.
getById
(
par
.
getCustomerIdSaved
());
CustomerDO
customerDO
Saved
=
customerService
.
getById
(
par
.
getCustomerIdSaved
());
if
(
customerDO
1
==
null
)
{
if
(
customerDO
Saved
==
null
)
{
throw
exception
(
ErrorCodeConstants
.
CUSTOMER_SAVED_NOT_EXISTS
);
throw
exception
(
ErrorCodeConstants
.
CUSTOMER_SAVED_NOT_EXISTS
);
}
}
if
(
customerDO
1
.
getCustomerService
()
==
null
)
{
if
(
customerDO
Saved
.
getCustomerService
()
==
null
)
{
throw
exception
(
ErrorCodeConstants
.
CUSTOMER_SAVED_CUSTOMER_SERVICE_IS_NULL
);
throw
exception
(
ErrorCodeConstants
.
CUSTOMER_SAVED_CUSTOMER_SERVICE_IS_NULL
);
}
}
CustomerDO
customerDO
2
=
customerService
.
getById
(
par
.
getCustomerIdDeleted
());
CustomerDO
customerDO
Deleted
=
customerService
.
getById
(
par
.
getCustomerIdDeleted
());
if
(
customerDO
2
==
null
)
{
if
(
customerDO
Deleted
==
null
)
{
throw
exception
(
ErrorCodeConstants
.
CUSTOMER_DELETED_NOT_EXISTS
);
throw
exception
(
ErrorCodeConstants
.
CUSTOMER_DELETED_NOT_EXISTS
);
}
}
if
(
customerDO
2
.
getCustomerService
()
==
null
)
{
if
(
customerDO
Deleted
.
getCustomerService
()
==
null
)
{
throw
exception
(
ErrorCodeConstants
.
CUSTOMER_DELETED_CUSTOMER_SERVICE_IS_NULL
);
throw
exception
(
ErrorCodeConstants
.
CUSTOMER_DELETED_CUSTOMER_SERVICE_IS_NULL
);
}
}
if
(
customerDO
1
.
getCustomerService
()
!=
customerDO2
.
getCustomerService
())
{
if
(
customerDO
Saved
.
getCustomerService
()
!=
customerDODeleted
.
getCustomerService
())
{
throw
exception
(
ErrorCodeConstants
.
CUSTOMER_MERGE_CUSTOMER_SERVICE_NOT_SAME
);
throw
exception
(
ErrorCodeConstants
.
CUSTOMER_MERGE_CUSTOMER_SERVICE_NOT_SAME
);
}
}
// 验证非主客户是否有客户业务审批中
// 验证非主客户是否有客户业务审批中
customerService
.
validateCustomerApproval
(
customerDO
2
);
customerService
.
validateCustomerApproval
(
customerDO
Deleted
);
boolean
merge
=
customerMergeService
.
doMergeCus
(
customerDOSaved
,
customerDODeleted
,
SecurityFrameworkUtils
.
getLoginUserId
());
boolean
merge
=
doMergeCus
(
customerDO1
,
customerDO2
,
SecurityFrameworkUtils
.
getLoginUserId
());
return
success
(
merge
);
return
success
(
merge
);
}
}
private
boolean
doMergeCus
(
CustomerDO
customerDO1
,
CustomerDO
customerDO2
,
long
loginUserId
)
{
/*
提交验证:
当保留客户和非主客户的客户经理均不为空且不是同一个用户(允许客户在公海),
弹出提示:保留客户和非主客户,不能在两个不同的客户经理名下,
请先确认两个客户在同一个客户经理名下,不允许提交
当非主客户/保留客户在移交过程中,不允许合并,弹出提示
当允许提交,先弹出上面的注意事项提示,确认后提交
1. 非主客户中的客户联系人所有信息追加到保留客户中,注意:关联账号也需要一并追加
2. 非主客户中的所有关联订单中的客户编号需要更新为保留客户,业绩归属为非主客户,
也需要同时更新为保留客户(此处需要注意有一些订单的收发货人是同一个客户,
还需要注意控货订单的情况,控货权)
3. 非主客户的跟进记录,报价单,客户投诉,品牌授权,
财务相关单据(收款单,佣金请款单,佣金付款单),都需要更新为保留客户
4. 非主客户关联的注册会员信息
4. 提交成功后,非主客户删除,插入记录到保留客户,
备注:客户合并,删除XXX非主客户编号
注意:此处要求是在保留客户中能查询到非主客户的所有信息,
不清楚数据库逻辑结构,此处需要开发查找出所有的关联关系
非主客户关联的订单/收款单/佣金情况单,佣金付款单有在途流程,
需要测试这种情况是否影响合并
*/
//合并订单 在合并订单前会验证非主客户是否有审批中的订单,若存在则不能合并抛出异常
orderApi
.
mergeOrder
(
customerDO1
.
getId
(),
customerDO2
.
getId
());
//把客户2的联系方式合并到客户1 1
doMogeContact
(
customerDO1
,
customerDO2
,
loginUserId
);
//合并报价单 2
doMogeOffer
(
customerDO1
,
customerDO2
,
loginUserId
);
//合并跟进记录 3
doMergeCustomerFollow
(
customerDO1
,
customerDO2
,
loginUserId
);
//合并客户投诉 4
doMergeCustomerComplaint
(
customerDO1
,
customerDO2
,
loginUserId
);
//合并产品品牌授权 6
doMergeProductBrandEmpower
(
customerDO1
,
customerDO2
,
loginUserId
);
//合并客户登记日志 7
doMergeCustomerLevelLog
(
customerDO1
,
customerDO2
,
loginUserId
);
//合并信用日志 8
customerService
.
doMergeCustomerCreditLog
(
customerDO1
.
getId
(),
customerDO2
.
getId
());
//合并操作日志 9
// customerService.doMergeCustomerOperateLog(customerDO1.getId(),
// customerDO2.getId());
//合并收款单信息 5
doMergeeReceipt
(
customerDO1
,
customerDO2
,
loginUserId
);
// 合并订单佣金应付款
doMergeComissionPayable
(
customerDO1
,
customerDO2
);
// 合并佣金付款单
doMergeCommissionPayment
(
customerDO1
,
customerDO2
);
// 合并业绩
doMergeTargetLog
(
customerDO1
,
customerDO2
);
// 纪录客户合并日志
LoginUser
loginUser
=
SecurityFrameworkUtils
.
getLoginUser
();
CustomerOperateLogCreateReqVO
customerOperateLogCreateReqVO
=
new
CustomerOperateLogCreateReqVO
()
.
setOperator
(
loginUser
==
null
?
null
:
loginUser
.
getId
())
.
setOperatorName
(
loginUser
==
null
?
null
:
loginUser
.
getNickname
())
.
setCustomerId
(
customerDO1
.
getId
())
.
setNumber
(
customerDO1
.
getNumber
())
.
setName
(
customerDO1
.
getName
())
.
setOldCustomerService
(
null
)
.
setNewCustomerService
(
customerDO1
.
getCustomerService
())
.
setOldEstimateEnterOpenSeaTime
(
null
)
.
setNewEstimateEnterOpenSeaTime
(
customerDO1
.
getEstimateEnterOpenSeaTime
())
.
setOrderId
(
null
)
.
setOrderNo
(
null
)
.
setOperateType
(
CustomerOperateTypeEnum
.
CUSTOMER_MERGE
.
getValue
())
.
setRemark
(
String
.
format
(
"客户合并,删除非主客户【%d-%s-%s】"
,
customerDO2
.
getId
(),
customerDO2
.
getNumber
(),
customerDO2
.
getName
()));
customerOperateLogService
.
createOperateLog
(
customerOperateLogCreateReqVO
);
//纪录被删除的客户的日志
CustomerOperateLogCreateReqVO
customerOperateLogCreateReqVO2
=
new
CustomerOperateLogCreateReqVO
()
.
setOperator
(
loginUser
==
null
?
null
:
loginUser
.
getId
())
.
setOperatorName
(
loginUser
==
null
?
null
:
loginUser
.
getNickname
())
.
setCustomerId
(
customerDO2
.
getId
())
.
setNumber
(
customerDO2
.
getNumber
())
.
setName
(
customerDO2
.
getName
())
.
setOldCustomerService
(
null
)
.
setNewCustomerService
(
customerDO2
.
getCustomerService
())
.
setOldEstimateEnterOpenSeaTime
(
null
)
.
setNewEstimateEnterOpenSeaTime
(
customerDO2
.
getEstimateEnterOpenSeaTime
())
.
setOrderId
(
null
)
.
setOrderNo
(
null
)
.
setOperateType
(
CustomerOperateTypeEnum
.
CUSTOMER_MERGE
.
getValue
())
.
setRemark
(
String
.
format
(
"客户合并,将此客户合并到主客户【%d-%s-%s】"
,
customerDO1
.
getId
(),
customerDO1
.
getNumber
(),
customerDO1
.
getName
()));
customerOperateLogService
.
createOperateLog
(
customerOperateLogCreateReqVO2
);
return
true
;
}
private
void
doMergeCommissionPayment
(
CustomerDO
customerDO1
,
CustomerDO
customerDO2
)
{
commissionPaymentService
.
update
(
new
LambdaUpdateWrapper
<
CommissionPaymentDO
>()
.
set
(
CommissionPaymentDO:
:
getCustomerId
,
customerDO1
.
getId
())
.
set
(
CommissionPaymentDO:
:
getCustomerName
,
customerDO1
.
getName
())
.
eq
(
CommissionPaymentDO:
:
getCustomerId
,
customerDO2
.
getId
()));
}
private
void
doMergeTargetLog
(
CustomerDO
customerDO1
,
CustomerDO
customerDO2
)
{
targetLogService
.
update
(
new
LambdaUpdateWrapper
<
TargetLogDO
>()
.
set
(
TargetLogDO:
:
getCustomerId
,
customerDO1
.
getId
())
.
set
(
TargetLogDO:
:
getCustomerType
,
customerDO1
.
getType
())
.
eq
(
TargetLogDO:
:
getCustomerId
,
customerDO2
.
getId
()));
}
private
void
doMergeComissionPayable
(
CustomerDO
customerDO1
,
CustomerDO
customerDO2
)
{
commissionPayableService
.
update
(
new
LambdaUpdateWrapper
<
CommissionPayableDO
>()
.
set
(
CommissionPayableDO:
:
getCustomerId
,
customerDO1
.
getId
())
.
set
(
CommissionPayableDO:
:
getCustomerName
,
customerDO1
.
getName
())
.
eq
(
CommissionPayableDO:
:
getCustomerId
,
customerDO2
.
getId
()));
}
//合并客户信用日志
private
void
doMergeCustomerLevelLog
(
CustomerDO
customerDO1
,
CustomerDO
customerDO2
,
long
loginUserId
)
{
customerService
.
doMergeCustomerLevelLog
(
customerDO1
.
getId
(),
customerDO2
.
getId
());
}
//合并产品品牌授权
private
void
doMergeProductBrandEmpower
(
CustomerDO
customerDO1
,
CustomerDO
customerDO2
,
long
loginUserId
)
{
LambdaQueryWrapperX
q2
=
new
LambdaQueryWrapperX
<
ProductBrandEmpowerDO
>().
eq
(
ProductBrandEmpowerDO:
:
getCustomerId
,
customerDO2
.
getId
());
List
<
ProductBrandEmpowerDO
>
list
=
productBrandEmpowerService
.
selectList
(
q2
);
if
(
CollectionUtil
.
isEmpty
(
list
))
return
;
for
(
ProductBrandEmpowerDO
d
:
list
)
{
d
.
setCustomerId
(
customerDO1
.
getId
());
productBrandEmpowerService
.
updateById
(
d
);
}
}
private
void
doMergeCustomerComplaint
(
CustomerDO
customerDO1
,
CustomerDO
customerDO2
,
long
loginUserId
)
{
LambdaQueryWrapperX
q2
=
new
LambdaQueryWrapperX
<
CustomerComplaintDO
>().
eq
(
CustomerComplaintDO:
:
getCustomerId
,
customerDO2
.
getId
());
List
<
CustomerComplaintDO
>
list
=
customerComplaintService
.
selectList
(
q2
);
if
(
CollectionUtil
.
isEmpty
(
list
))
return
;
for
(
CustomerComplaintDO
d
:
list
)
{
d
.
setCustomerId
(
customerDO1
.
getId
());
customerComplaintService
.
updateById
(
d
);
}
}
//合并收款单
private
void
doMergeeReceipt
(
CustomerDO
customerDO1
,
CustomerDO
customerDO2
,
long
loginUserId
)
{
LambdaQueryWrapperX
q2
=
new
LambdaQueryWrapperX
<
ReceiptDO
>().
eq
(
ReceiptDO:
:
getCustomerId
,
customerDO2
.
getId
());
List
<
ReceiptDO
>
list
=
receiptService
.
selectList
(
q2
);
if
(
CollectionUtil
.
isEmpty
(
list
))
return
;
for
(
ReceiptDO
d
:
list
)
{
d
.
setCustomerId
(
customerDO1
.
getId
());
receiptService
.
updateById
(
d
);
}
}
//合并客户跟进
private
void
doMergeCustomerFollow
(
CustomerDO
customerDO1
,
CustomerDO
customerDO2
,
long
loginUserId
)
{
LambdaQueryWrapperX
q2
=
new
LambdaQueryWrapperX
<
CustomerFollowDO
>().
eq
(
CustomerFollowDO:
:
getCustomerId
,
customerDO2
.
getId
());
List
<
CustomerFollowDO
>
list
=
customerFollowService
.
selectList
(
q2
);
if
(
CollectionUtil
.
isEmpty
(
list
))
return
;
for
(
CustomerFollowDO
d
:
list
)
{
d
.
setCustomerId
(
customerDO1
.
getId
());
customerFollowService
.
updateById
(
d
);
}
}
//合并报价单
private
void
doMogeOffer
(
CustomerDO
customerDO1
,
CustomerDO
customerDO2
,
long
loginUserId
)
{
LambdaQueryWrapperX
q2
=
new
LambdaQueryWrapperX
<
OfferDO
>().
eq
(
OfferDO:
:
getRelationId
,
customerDO2
.
getId
());
List
<
OfferDO
>
list
=
offerService
.
selectList
(
q2
);
if
(
CollectionUtil
.
isEmpty
(
list
))
return
;
for
(
OfferDO
o
:
list
)
{
o
.
setRelationId
(
customerDO1
.
getId
());
o
.
setUpdateTime
(
new
Date
());
offerService
.
updateById
(
o
);
}
}
//合并联系人
private
void
doMogeContact
(
CustomerDO
customerDO1
,
CustomerDO
customerDO2
,
long
loginUserId
)
{
LambdaQueryWrapperX
q2
=
new
LambdaQueryWrapperX
<
CustomerContactsDO
>().
eq
(
CustomerContactsDO:
:
getCustomerId
,
customerDO2
.
getId
());
List
<
CustomerContactsDO
>
cuscontactList2
=
customerContactsService
.
selectList
(
q2
);
if
(
CollectionUtil
.
isNotEmpty
(
cuscontactList2
))
{
for
(
CustomerContactsDO
d
:
cuscontactList2
)
{
d
.
setCustomerId
(
customerDO1
.
getId
());
//被合并的客户联系人,默认为非默认
d
.
setIsDefault
(
0
);
d
.
setUpdateTime
(
new
Date
());
d
.
setUpdater
(
String
.
valueOf
(
loginUserId
));
customerContactsService
.
updateById
(
d
);
}
}
}
@GetMapping
(
"/get"
)
@GetMapping
(
"/get"
)
@ApiOperation
(
"获得客户详情"
)
@ApiOperation
(
"获得客户详情"
)
...
...
yudao-module-customer/yudao-module-customer-rest/src/main/java/cn/iocoder/yudao/module/customer/controller/admin/customer/CustomerMergeService.java
0 → 100644
View file @
26c696cf
package
cn
.
iocoder
.
yudao
.
module
.
customer
.
controller
.
admin
.
customer
;
import
cn.iocoder.yudao.module.customer.dal.dataobject.customer.CustomerDO
;
public
interface
CustomerMergeService
{
boolean
doMergeCus
(
CustomerDO
customerDOSaved
,
CustomerDO
customerDODeleted
,
long
loginUserId
);
}
yudao-module-customer/yudao-module-customer-rest/src/main/java/cn/iocoder/yudao/module/customer/controller/admin/customer/CustomerMergeServiceImpl.java
0 → 100644
View file @
26c696cf
package
cn
.
iocoder
.
yudao
.
module
.
customer
.
controller
.
admin
.
customer
;
import
cn.hutool.core.collection.CollectionUtil
;
import
cn.iocoder.boot.module.order.api.OrderApi
;
import
cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX
;
import
cn.iocoder.yudao.framework.security.core.LoginUser
;
import
cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils
;
import
cn.iocoder.yudao.module.customer.dal.dataobject.customer.CustomerDO
;
import
cn.iocoder.yudao.module.customer.dal.dataobject.customer.complaint.CustomerComplaintDO
;
import
cn.iocoder.yudao.module.customer.dal.dataobject.customer.follow.CustomerFollowDO
;
import
cn.iocoder.yudao.module.customer.dal.dataobject.customerContacts.CustomerContactsDO
;
import
cn.iocoder.yudao.module.customer.service.customer.CustomerService
;
import
cn.iocoder.yudao.module.customer.service.customer.commission.CustomerCommissionService
;
import
cn.iocoder.yudao.module.customer.service.customer.complaint.CustomerComplaintService
;
import
cn.iocoder.yudao.module.customer.service.customer.complaint.follow.CustomerFollowService
;
import
cn.iocoder.yudao.module.customer.service.customerContacts.CustomerContactsService
;
import
cn.iocoder.yudao.module.customer.service.customerCredit.CustomerCreditService
;
import
cn.iocoder.yudao.module.customer.service.customerLevel.CustomerLevelService
;
import
cn.iocoder.yudao.module.customer.service.customerLevelLog.CustomerLevelLogService
;
import
cn.iocoder.yudao.module.customer.service.customerLevelLog.CustomerLevelLogServiceImpl
;
import
cn.iocoder.yudao.module.customer.service.customerOperateLog.CustomerOperateLogService
;
import
cn.iocoder.yudao.module.customer.vo.customerOperateLog.CustomerOperateLogCreateReqVO
;
import
cn.iocoder.yudao.module.ecw.enums.CustomerOperateTypeEnum
;
import
cn.iocoder.yudao.module.order.dal.dataobject.targetLog.TargetLogDO
;
import
cn.iocoder.yudao.module.order.service.targetLog.TargetLogService
;
import
cn.iocoder.yudao.module.product.dal.dataobject.productbrandempower.ProductBrandEmpowerDO
;
import
cn.iocoder.yudao.module.product.service.productbrandempower.ProductBrandEmpowerServiceImpl
;
import
cn.iocoder.yudao.module.sale.dal.dataobject.offer.OfferDO
;
import
cn.iocoder.yudao.module.sale.service.offer.OfferService
;
import
cn.iocoder.yudao.module.wealth.dal.dataobject.commissionPayable.CommissionPayableDO
;
import
cn.iocoder.yudao.module.wealth.dal.dataobject.commissionPayment.CommissionPaymentDO
;
import
cn.iocoder.yudao.module.wealth.dal.dataobject.receipt.ReceiptDO
;
import
cn.iocoder.yudao.module.wealth.service.commissionPayable.CommissionPayableService
;
import
cn.iocoder.yudao.module.wealth.service.commissionPayment.CommissionPaymentService
;
import
cn.iocoder.yudao.module.wealth.service.receipt.ReceiptServiceImpl
;
import
com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper
;
import
lombok.extern.log4j.Log4j2
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.validation.annotation.Validated
;
import
javax.annotation.Resource
;
import
java.util.Date
;
import
java.util.List
;
@Log4j2
@Service
@Validated
public
class
CustomerMergeServiceImpl
implements
CustomerMergeService
{
@Resource
private
OrderApi
orderApi
;
@Resource
OfferService
offerService
;
//客户跟进
@Resource
CustomerFollowService
customerFollowService
;
@Resource
private
CustomerComplaintService
customerComplaintService
;
@Resource
private
ReceiptServiceImpl
receiptService
;
@Resource
private
ProductBrandEmpowerServiceImpl
productBrandEmpowerService
;
//客户登记日志
@Resource
private
CustomerLevelLogService
customerLevelLogService
;
@Resource
private
CustomerOperateLogService
customerOperateLogService
;
@Resource
private
TargetLogService
targetLogService
;
@Resource
private
CommissionPayableService
commissionPayableService
;
@Resource
private
CommissionPaymentService
commissionPaymentService
;
@Resource
private
CustomerContactsService
customerContactsService
;
@Resource
private
CustomerCommissionService
customerCommissionService
;
@Resource
private
CustomerService
customerService
;
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
public
boolean
doMergeCus
(
CustomerDO
customerDOSaved
,
CustomerDO
customerDODeleted
,
long
loginUserId
)
{
/*
提交验证:
当保留客户和非主客户的客户经理均不为空且不是同一个用户(允许客户在公海),
弹出提示:保留客户和非主客户,不能在两个不同的客户经理名下,
请先确认两个客户在同一个客户经理名下,不允许提交
当非主客户/保留客户在移交过程中,不允许合并,弹出提示
当允许提交,先弹出上面的注意事项提示,确认后提交
1. 非主客户中的客户联系人所有信息追加到保留客户中,注意:关联账号也需要一并追加
2. 非主客户中的所有关联订单中的客户编号需要更新为保留客户,业绩归属为非主客户,
也需要同时更新为保留客户(此处需要注意有一些订单的收发货人是同一个客户,
还需要注意控货订单的情况,控货权)
3. 非主客户的跟进记录,报价单,客户投诉,品牌授权,
财务相关单据(收款单,佣金请款单,佣金付款单),都需要更新为保留客户
4. 非主客户关联的注册会员信息
4. 提交成功后,非主客户删除,插入记录到保留客户,
备注:客户合并,删除XXX非主客户编号
注意:此处要求是在保留客户中能查询到非主客户的所有信息,
不清楚数据库逻辑结构,此处需要开发查找出所有的关联关系
非主客户关联的订单/收款单/佣金情况单,佣金付款单有在途流程,
需要测试这种情况是否影响合并
*/
//合并订单 在合并订单前会验证非主客户是否有审批中的订单,若存在则不能合并抛出异常
orderApi
.
mergeOrder
(
customerDOSaved
.
getId
(),
customerDODeleted
.
getId
());
//把客户2的联系方式合并到客户1 1
doMogeContact
(
customerDOSaved
,
customerDODeleted
,
loginUserId
);
//合并报价单 2
doMogeOffer
(
customerDOSaved
,
customerDODeleted
,
loginUserId
);
//合并跟进记录 3
doMergeCustomerFollow
(
customerDOSaved
,
customerDODeleted
,
loginUserId
);
//合并客户投诉 4
doMergeCustomerComplaint
(
customerDOSaved
,
customerDODeleted
,
loginUserId
);
//合并产品品牌授权 6
doMergeProductBrandEmpower
(
customerDOSaved
,
customerDODeleted
,
loginUserId
);
//合并客户登记日志 7
doMergeCustomerLevelLog
(
customerDOSaved
,
customerDODeleted
,
loginUserId
);
//合并信用日志 8
customerService
.
doMergeCustomerCreditLog
(
customerDOSaved
.
getId
(),
customerDODeleted
.
getId
());
//合并操作日志 9
// customerService.doMergeCustomerOperateLog(customerDO1.getId(),
// customerDODeleted.getId());
//合并收款单信息 5
doMergeeReceipt
(
customerDOSaved
,
customerDODeleted
,
loginUserId
);
// 合并订单佣金应付款
doMergeComissionPayable
(
customerDOSaved
,
customerDODeleted
);
// 合并佣金付款单
doMergeCommissionPayment
(
customerDOSaved
,
customerDODeleted
);
// 合并业绩
doMergeTargetLog
(
customerDOSaved
,
customerDODeleted
);
// 删除客户
customerService
.
deleteCustomer
(
customerDODeleted
.
getId
());
// 纪录客户合并日志
LoginUser
loginUser
=
SecurityFrameworkUtils
.
getLoginUser
();
CustomerOperateLogCreateReqVO
customerOperateLogCreateReqVO
=
new
CustomerOperateLogCreateReqVO
()
.
setOperator
(
loginUser
==
null
?
null
:
loginUser
.
getId
())
.
setOperatorName
(
loginUser
==
null
?
null
:
loginUser
.
getNickname
())
.
setCustomerId
(
customerDOSaved
.
getId
())
.
setNumber
(
customerDOSaved
.
getNumber
())
.
setName
(
customerDOSaved
.
getName
())
.
setOldCustomerService
(
null
)
.
setNewCustomerService
(
customerDOSaved
.
getCustomerService
())
.
setOldEstimateEnterOpenSeaTime
(
null
)
.
setNewEstimateEnterOpenSeaTime
(
customerDOSaved
.
getEstimateEnterOpenSeaTime
())
.
setOrderId
(
null
)
.
setOrderNo
(
null
)
.
setOperateType
(
CustomerOperateTypeEnum
.
CUSTOMER_MERGE
.
getValue
())
.
setRemark
(
String
.
format
(
"客户合并,删除非主客户【%d-%s-%s】"
,
customerDODeleted
.
getId
(),
customerDODeleted
.
getNumber
(),
customerDODeleted
.
getName
()));
customerOperateLogService
.
createOperateLog
(
customerOperateLogCreateReqVO
);
//纪录被删除的客户的日志
CustomerOperateLogCreateReqVO
customerOperateLogCreateReqVO2
=
new
CustomerOperateLogCreateReqVO
()
.
setOperator
(
loginUser
==
null
?
null
:
loginUser
.
getId
())
.
setOperatorName
(
loginUser
==
null
?
null
:
loginUser
.
getNickname
())
.
setCustomerId
(
customerDODeleted
.
getId
())
.
setNumber
(
customerDODeleted
.
getNumber
())
.
setName
(
customerDODeleted
.
getName
())
.
setOldCustomerService
(
null
)
.
setNewCustomerService
(
customerDODeleted
.
getCustomerService
())
.
setOldEstimateEnterOpenSeaTime
(
null
)
.
setNewEstimateEnterOpenSeaTime
(
customerDODeleted
.
getEstimateEnterOpenSeaTime
())
.
setOrderId
(
null
)
.
setOrderNo
(
null
)
.
setOperateType
(
CustomerOperateTypeEnum
.
CUSTOMER_MERGE
.
getValue
())
.
setRemark
(
String
.
format
(
"客户合并,将此客户合并到主客户【%d-%s-%s】"
,
customerDOSaved
.
getId
(),
customerDOSaved
.
getNumber
(),
customerDOSaved
.
getName
()));
customerOperateLogService
.
createOperateLog
(
customerOperateLogCreateReqVO2
);
return
true
;
}
private
void
doMergeCommissionPayment
(
CustomerDO
customerDOSaved
,
CustomerDO
customerDODeleted
)
{
commissionPaymentService
.
update
(
new
LambdaUpdateWrapper
<
CommissionPaymentDO
>()
.
set
(
CommissionPaymentDO:
:
getCustomerId
,
customerDOSaved
.
getId
())
.
set
(
CommissionPaymentDO:
:
getCustomerName
,
customerDOSaved
.
getName
())
.
eq
(
CommissionPaymentDO:
:
getCustomerId
,
customerDODeleted
.
getId
()));
}
private
void
doMergeTargetLog
(
CustomerDO
customerDOSaved
,
CustomerDO
customerDODeleted
)
{
targetLogService
.
update
(
new
LambdaUpdateWrapper
<
TargetLogDO
>()
.
set
(
TargetLogDO:
:
getCustomerId
,
customerDOSaved
.
getId
())
.
set
(
TargetLogDO:
:
getCustomerType
,
customerDOSaved
.
getType
())
.
eq
(
TargetLogDO:
:
getCustomerId
,
customerDODeleted
.
getId
()));
}
private
void
doMergeComissionPayable
(
CustomerDO
customerDOSaved
,
CustomerDO
customerDODeleted
)
{
commissionPayableService
.
update
(
new
LambdaUpdateWrapper
<
CommissionPayableDO
>()
.
set
(
CommissionPayableDO:
:
getCustomerId
,
customerDOSaved
.
getId
())
.
set
(
CommissionPayableDO:
:
getCustomerName
,
customerDOSaved
.
getName
())
.
eq
(
CommissionPayableDO:
:
getCustomerId
,
customerDODeleted
.
getId
()));
}
//合并客户信用日志
private
void
doMergeCustomerLevelLog
(
CustomerDO
customerDOSaved
,
CustomerDO
customerDODeleted
,
long
loginUserId
)
{
customerService
.
doMergeCustomerLevelLog
(
customerDOSaved
.
getId
(),
customerDODeleted
.
getId
());
}
//合并产品品牌授权
private
void
doMergeProductBrandEmpower
(
CustomerDO
customerDOSaved
,
CustomerDO
customerDODeleted
,
long
loginUserId
)
{
LambdaQueryWrapperX
q2
=
new
LambdaQueryWrapperX
<
ProductBrandEmpowerDO
>().
eq
(
ProductBrandEmpowerDO:
:
getCustomerId
,
customerDODeleted
.
getId
());
List
<
ProductBrandEmpowerDO
>
list
=
productBrandEmpowerService
.
selectList
(
q2
);
if
(
CollectionUtil
.
isEmpty
(
list
))
return
;
for
(
ProductBrandEmpowerDO
d
:
list
)
{
d
.
setCustomerId
(
customerDOSaved
.
getId
());
productBrandEmpowerService
.
updateById
(
d
);
}
}
private
void
doMergeCustomerComplaint
(
CustomerDO
customerDOSaved
,
CustomerDO
customerDODeleted
,
long
loginUserId
)
{
LambdaQueryWrapperX
q2
=
new
LambdaQueryWrapperX
<
CustomerComplaintDO
>().
eq
(
CustomerComplaintDO:
:
getCustomerId
,
customerDODeleted
.
getId
());
List
<
CustomerComplaintDO
>
list
=
customerComplaintService
.
selectList
(
q2
);
if
(
CollectionUtil
.
isEmpty
(
list
))
return
;
for
(
CustomerComplaintDO
d
:
list
)
{
d
.
setCustomerId
(
customerDOSaved
.
getId
());
customerComplaintService
.
updateById
(
d
);
}
}
//合并收款单
private
void
doMergeeReceipt
(
CustomerDO
customerDOSaved
,
CustomerDO
customerDODeleted
,
long
loginUserId
)
{
LambdaQueryWrapperX
q2
=
new
LambdaQueryWrapperX
<
ReceiptDO
>().
eq
(
ReceiptDO:
:
getCustomerId
,
customerDODeleted
.
getId
());
List
<
ReceiptDO
>
list
=
receiptService
.
selectList
(
q2
);
if
(
CollectionUtil
.
isEmpty
(
list
))
return
;
for
(
ReceiptDO
d
:
list
)
{
d
.
setCustomerId
(
customerDOSaved
.
getId
());
receiptService
.
updateById
(
d
);
}
}
//合并客户跟进
private
void
doMergeCustomerFollow
(
CustomerDO
customerDOSaved
,
CustomerDO
customerDODeleted
,
long
loginUserId
)
{
LambdaQueryWrapperX
q2
=
new
LambdaQueryWrapperX
<
CustomerFollowDO
>().
eq
(
CustomerFollowDO:
:
getCustomerId
,
customerDODeleted
.
getId
());
List
<
CustomerFollowDO
>
list
=
customerFollowService
.
selectList
(
q2
);
if
(
CollectionUtil
.
isEmpty
(
list
))
return
;
for
(
CustomerFollowDO
d
:
list
)
{
d
.
setCustomerId
(
customerDOSaved
.
getId
());
customerFollowService
.
updateById
(
d
);
}
}
//合并报价单
private
void
doMogeOffer
(
CustomerDO
customerDOSaved
,
CustomerDO
customerDODeleted
,
long
loginUserId
)
{
LambdaQueryWrapperX
q2
=
new
LambdaQueryWrapperX
<
OfferDO
>().
eq
(
OfferDO:
:
getRelationId
,
customerDODeleted
.
getId
());
List
<
OfferDO
>
list
=
offerService
.
selectList
(
q2
);
if
(
CollectionUtil
.
isEmpty
(
list
))
return
;
for
(
OfferDO
o
:
list
)
{
o
.
setRelationId
(
customerDOSaved
.
getId
());
o
.
setUpdateTime
(
new
Date
());
offerService
.
updateById
(
o
);
}
}
//合并联系人
private
void
doMogeContact
(
CustomerDO
customerDOSaved
,
CustomerDO
customerDODeleted
,
long
loginUserId
)
{
LambdaQueryWrapperX
q2
=
new
LambdaQueryWrapperX
<
CustomerContactsDO
>().
eq
(
CustomerContactsDO:
:
getCustomerId
,
customerDODeleted
.
getId
());
List
<
CustomerContactsDO
>
cuscontactList2
=
customerContactsService
.
selectList
(
q2
);
if
(
CollectionUtil
.
isNotEmpty
(
cuscontactList2
))
{
for
(
CustomerContactsDO
d
:
cuscontactList2
)
{
d
.
setCustomerId
(
customerDOSaved
.
getId
());
//被合并的客户联系人,默认为非默认
d
.
setIsDefault
(
0
);
d
.
setUpdateTime
(
new
Date
());
d
.
setUpdater
(
String
.
valueOf
(
loginUserId
));
customerContactsService
.
updateById
(
d
);
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment