Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yd-csf
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
xingmin
yd-csf
Commits
2dc97703
Commit
2dc97703
authored
Apr 23, 2026
by
zhangxingmin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
push
parent
1ac1bbf9
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
72 additions
and
69 deletions
+72
-69
yd-csf-api/src/main/java/com/yd/csf/api/handler/CalmSendJobHandler.java
+72
-69
No files found.
yd-csf-api/src/main/java/com/yd/csf/api/handler/CalmSendJobHandler.java
View file @
2dc97703
...
@@ -5,15 +5,13 @@ import com.xxl.job.core.context.XxlJobHelper;
...
@@ -5,15 +5,13 @@ import com.xxl.job.core.context.XxlJobHelper;
import
com.xxl.job.core.handler.annotation.XxlJob
;
import
com.xxl.job.core.handler.annotation.XxlJob
;
import
com.yd.common.enums.CommonEnum
;
import
com.yd.common.enums.CommonEnum
;
import
com.yd.common.utils.RandomStringGenerator
;
import
com.yd.common.utils.RandomStringGenerator
;
import
com.yd.csf.api.service.ApiAgentDetailFycService
;
import
com.yd.csf.feign.enums.FycSourceTypeEnum
;
import
com.yd.csf.feign.enums.OprSourceEnum
;
import
com.yd.csf.feign.enums.OprSourceEnum
;
import
com.yd.csf.service.enums.RuleItemEnum
;
import
com.yd.csf.service.enums.RuleItemEnum
;
import
com.yd.csf.service.model.*
;
import
com.yd.csf.service.model.*
;
import
com.yd.csf.service.service.*
;
import
com.yd.csf.service.service.*
;
import
com.yd.framework.config.LockExecutor
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
javax.annotation.Resource
;
...
@@ -22,14 +20,16 @@ import java.time.LocalDateTime;
...
@@ -22,14 +20,16 @@ import java.time.LocalDateTime;
import
java.util.Objects
;
import
java.util.Objects
;
/**
/**
* 冷静期定时发送任务处理器 - XXL-Job定时任务执行器
* 冷静期定时发送任务处理器
* 使用@XxlJob注解方式
*/
*/
@Component
@Component
@Slf4j
@Slf4j
public
class
CalmSendJobHandler
{
public
class
CalmSendJobHandler
{
@Resource
@Resource
private
LockExecutor
lockExecutor
;
@Resource
private
ICalmTaskService
iCalmTaskService
;
private
ICalmTaskService
iCalmTaskService
;
@Resource
@Resource
private
IAgentDetailFycService
iAgentDetailFycService
;
private
IAgentDetailFycService
iAgentDetailFycService
;
...
@@ -43,118 +43,122 @@ public class CalmSendJobHandler {
...
@@ -43,118 +43,122 @@ public class CalmSendJobHandler {
*/
*/
@XxlJob
(
"calmSendJobHandler"
)
@XxlJob
(
"calmSendJobHandler"
)
public
void
execute
()
throws
Exception
{
public
void
execute
()
throws
Exception
{
//主任务发送时间
LocalDateTime
taskSendTime
=
LocalDateTime
.
now
();
LocalDateTime
taskSendTime
=
LocalDateTime
.
now
();
// 从XXL-Job参数中获取任务ID
String
param
=
XxlJobHelper
.
getJobParam
();
String
param
=
XxlJobHelper
.
getJobParam
();
// 记录任务开始日志
log
.
info
(
"开始冷静期定时发送任务,参数: {}"
,
param
);
log
.
info
(
"开始冷静期定时发送任务,参数: {}"
,
param
);
// 解析任务参数(参数为冷静期定时任务业务ID)
String
taskBizId
=
param
;
String
taskBizId
=
param
;
// 根据冷静期定时任务业务ID查询冷静期定时任务信息
CalmTask
calmTask
=
iCalmTaskService
.
queryOne
(
taskBizId
);
CalmTask
calmTask
=
iCalmTaskService
.
queryOne
(
taskBizId
);
log
.
info
(
"根据冷静期定时发送任务业务ID查询冷静期定时任务信息: {}:
"
+
JSON
.
toJSONString
(
calmTask
));
log
.
info
(
"根据冷静期定时发送任务业务ID查询冷静期定时任务信息: {}:
{}"
,
taskBizId
,
JSON
.
toJSONString
(
calmTask
));
// 检查冷静期定时任务是否存在
if
(
Objects
.
isNull
(
calmTask
))
{
if
(
Objects
.
isNull
(
calmTask
))
{
// 记录错误并返回
XxlJobHelper
.
log
(
"冷静期定时发送任务不存在: "
+
taskBizId
);
XxlJobHelper
.
log
(
"冷静期定时发送任务不存在: "
+
taskBizId
);
XxlJobHelper
.
handleFail
(
"冷静期定时发送任务不存在"
);
XxlJobHelper
.
handleFail
(
"冷静期定时发送任务不存在"
);
return
;
return
;
}
}
//更新保单冷静期定时任务对象字段
// 更新任务状态
//执行状态: 2-已执行
calmTask
.
setExecutionStatus
(
"2"
);
calmTask
.
setExecutionStatus
(
"2"
);
iCalmTaskService
.
saveOrUpdate
(
calmTask
);
iCalmTaskService
.
saveOrUpdate
(
calmTask
);
//更新保单冷静期定时任务对应的积分明细对象字段
// 更新积分明细状态
//查询积分明细
AgentDetailFyc
agentDetailFyc
=
iAgentDetailFycService
.
queryOne
(
calmTask
.
getDetailFycBizId
());
AgentDetailFyc
agentDetailFyc
=
iAgentDetailFycService
.
queryOne
(
calmTask
.
getDetailFycBizId
());
if
(
agentDetailFyc
!=
null
)
{
if
(
agentDetailFyc
!=
null
)
{
//状态:生效
agentDetailFyc
.
setStatus
(
1
);
agentDetailFyc
.
setStatus
(
1
);
iAgentDetailFycService
.
saveOrUpdate
(
agentDetailFyc
);
iAgentDetailFycService
.
saveOrUpdate
(
agentDetailFyc
);
}
}
// 更新积分总表的字段(此时积分都已经生效)
// 使用分布式锁保护积分总表更新(流式调用)
AgentAccumulatedFyc
agentAccumulatedFyc
=
iAgentAccumulatedFycService
.
queryOne
(
calmTask
.
getBrokerBizId
());
String
brokerBizId
=
calmTask
.
getBrokerBizId
();
if
(
agentAccumulatedFyc
!=
null
)
{
String
lockKey
=
"calm:accumulated:lock:"
+
brokerBizId
;
// 安全获取任务佣金增量值,若为 null 则用 0 代替
lockExecutor
.
executeWithLock
(
lockKey
,
()
->
{
// 锁内业务逻辑
updateAccumulatedFyc
(
calmTask
);
});
}
/**
* 积分总表累计更新逻辑(原 execute 内的积分部分)
* 在分布式锁保护下执行,确保同一经纪人串行处理
*/
private
void
updateAccumulatedFyc
(
CalmTask
calmTask
)
{
String
brokerBizId
=
calmTask
.
getBrokerBizId
();
AgentAccumulatedFyc
agentAccumulatedFyc
=
iAgentAccumulatedFycService
.
queryOne
(
brokerBizId
);
if
(
agentAccumulatedFyc
==
null
)
{
log
.
warn
(
"经纪人积分总表记录不存在,brokerBizId: {}"
,
brokerBizId
);
return
;
}
// 安全获取任务佣金增量值
BigDecimal
fycValue
=
calmTask
.
getAfterFyc
()
==
null
?
BigDecimal
.
ZERO
:
calmTask
.
getAfterFyc
();
BigDecimal
fycValue
=
calmTask
.
getAfterFyc
()
==
null
?
BigDecimal
.
ZERO
:
calmTask
.
getAfterFyc
();
// 安全获取原有字段值,若为 null 则视为 0
// 安全获取原有字段值(null -> 0)
BigDecimal
noEffectOld
=
agentAccumulatedFyc
.
getNoEffect
()
==
null
?
BigDecimal
.
ZERO
:
agentAccumulatedFyc
.
getNoEffect
(
);
BigDecimal
noEffectOld
=
nvl
(
agentAccumulatedFyc
.
getNoEffect
()
);
BigDecimal
effectOld
=
agentAccumulatedFyc
.
getEffect
()
==
null
?
BigDecimal
.
ZERO
:
agentAccumulatedFyc
.
getEffect
(
);
BigDecimal
effectOld
=
nvl
(
agentAccumulatedFyc
.
getEffect
()
);
BigDecimal
firstCommissionOld
=
agentAccumulatedFyc
.
getFirstCommission
()
==
null
?
BigDecimal
.
ZERO
:
agentAccumulatedFyc
.
getFirstCommission
(
);
BigDecimal
firstCommissionOld
=
nvl
(
agentAccumulatedFyc
.
getFirstCommission
()
);
BigDecimal
noFirstCommissionOld
=
agentAccumulatedFyc
.
getNoFirstCommission
()
==
null
?
BigDecimal
.
ZERO
:
agentAccumulatedFyc
.
getNoFirstCommission
(
);
BigDecimal
noFirstCommissionOld
=
nvl
(
agentAccumulatedFyc
.
getNoFirstCommission
()
);
BigDecimal
rycOld
=
agentAccumulatedFyc
.
getRyc
()
==
null
?
BigDecimal
.
ZERO
:
agentAccumulatedFyc
.
getRyc
(
);
BigDecimal
rycOld
=
nvl
(
agentAccumulatedFyc
.
getRyc
()
);
BigDecimal
noRycOld
=
agentAccumulatedFyc
.
getNoRyc
()
==
null
?
BigDecimal
.
ZERO
:
agentAccumulatedFyc
.
getNoRyc
(
);
BigDecimal
noRycOld
=
nvl
(
agentAccumulatedFyc
.
getNoRyc
()
);
BigDecimal
firstSalesCommissionOld
=
agentAccumulatedFyc
.
getFirstSalesCommission
()
==
null
?
BigDecimal
.
ZERO
:
agentAccumulatedFyc
.
getFirstSalesCommission
(
);
BigDecimal
firstSalesCommissionOld
=
nvl
(
agentAccumulatedFyc
.
getFirstSalesCommission
()
);
BigDecimal
noFirstSalesCommissionOld
=
agentAccumulatedFyc
.
getNoFirstSalesCommission
()
==
null
?
BigDecimal
.
ZERO
:
agentAccumulatedFyc
.
getNoFirstSalesCommission
(
);
BigDecimal
noFirstSalesCommissionOld
=
nvl
(
agentAccumulatedFyc
.
getNoFirstSalesCommission
()
);
//未生效累计积分(不限业务场景)= 未生效累计积分(不限业务场景) - 增量
积分
// 未生效/已生效累计
积分
BigDecimal
noEffect
=
noEffectOld
.
subtract
(
fycValue
);
BigDecimal
noEffect
=
noEffectOld
.
subtract
(
fycValue
);
agentAccumulatedFyc
.
setNoEffect
(
noEffect
.
compareTo
(
BigDecimal
.
ZERO
)
<=
0
?
BigDecimal
.
ZERO
:
noEffect
);
agentAccumulatedFyc
.
setNoEffect
(
noEffect
.
max
(
BigDecimal
.
ZERO
));
//已生效累计积分(不限业务场景) = 已生效累计积分(不限业务场景) + 增量积分
BigDecimal
effect
=
effectOld
.
add
(
fycValue
);
BigDecimal
effect
=
effectOld
.
add
(
fycValue
);
agentAccumulatedFyc
.
setEffect
(
effect
);
agentAccumulatedFyc
.
setEffect
(
effect
);
//累计积分 = 未生效累计积分 + 已生效累计积分
agentAccumulatedFyc
.
setTotalFyc
(
agentAccumulatedFyc
.
getNoEffect
().
add
(
agentAccumulatedFyc
.
getEffect
()));
agentAccumulatedFyc
.
setTotalFyc
(
agentAccumulatedFyc
.
getNoEffect
().
add
(
agentAccumulatedFyc
.
getEffect
()));
if
(
calmTask
.
getFortunePeriod
()
!=
null
&&
calmTask
.
getFortunePeriod
()
==
1
)
{
if
(
calmTask
.
getFortunePeriod
()
!=
null
&&
calmTask
.
getFortunePeriod
()
==
1
)
{
//首期
// 首期佣金
//已生效累计首期佣金积分值(佣金场景) = 已生效累计首期佣金积分值(佣金场景) + 增量积分
BigDecimal
firstCommission
=
firstCommissionOld
.
add
(
fycValue
);
BigDecimal
firstCommission
=
firstCommissionOld
.
add
(
fycValue
);
agentAccumulatedFyc
.
setFirstCommission
(
firstCommission
);
agentAccumulatedFyc
.
setFirstCommission
(
firstCommission
);
//未生效累计首期佣金积分值(佣金场景)= 未生效累计首期佣金积分值(佣金场景)- 增量积分
BigDecimal
noFirstCommission
=
noFirstCommissionOld
.
subtract
(
fycValue
);
BigDecimal
noFirstCommission
=
noFirstCommissionOld
.
subtract
(
fycValue
);
agentAccumulatedFyc
.
setNoFirstCommission
(
noFirstCommission
.
compareTo
(
BigDecimal
.
ZERO
)
<=
0
?
BigDecimal
.
ZERO
:
noFirstCommission
);
agentAccumulatedFyc
.
setNoFirstCommission
(
noFirstCommission
.
max
(
BigDecimal
.
ZERO
)
);
if
(
RuleItemEnum
.
SALES
.
getRuleItemBizId
().
equals
(
calmTask
.
getRuleItemBizId
()))
{
if
(
RuleItemEnum
.
SALES
.
getRuleItemBizId
().
equals
(
calmTask
.
getRuleItemBizId
()))
{
//销售佣金项目
//已生效累计首期销售佣金积分值(销售佣金场景(佣金场景的其中一个)) = 已生效累计首期销售佣金积分值(销售佣金场景(佣金场景的其中一个)) + 增量积分
BigDecimal
firstSalesCommission
=
firstSalesCommissionOld
.
add
(
fycValue
);
BigDecimal
firstSalesCommission
=
firstSalesCommissionOld
.
add
(
fycValue
);
agentAccumulatedFyc
.
setFirstSalesCommission
(
firstSalesCommission
);
agentAccumulatedFyc
.
setFirstSalesCommission
(
firstSalesCommission
);
//未生效累计首期销售佣金积分值(销售佣金场景(佣金场景的其中一个))= 未生效累计首期销售佣金积分值(销售佣金场景(佣金场景的其中一个))- 增量积分
BigDecimal
noFirstSalesCommission
=
noFirstSalesCommissionOld
.
subtract
(
fycValue
);
BigDecimal
noFirstSalesCommission
=
noFirstSalesCommissionOld
.
subtract
(
fycValue
);
agentAccumulatedFyc
.
setNoFirstSalesCommission
(
noFirstSalesCommission
.
compareTo
(
BigDecimal
.
ZERO
)
<=
0
?
BigDecimal
.
ZERO
:
noFirstSalesCommission
);
agentAccumulatedFyc
.
setNoFirstSalesCommission
(
noFirstSalesCommission
.
max
(
BigDecimal
.
ZERO
)
);
}
}
}
else
{
}
else
{
//非首期
// 非首期佣金
//已生效累计非首期佣金积分值(佣金场景) = 已生效累计非首期佣金积分值(佣金场景) + 增量积分
BigDecimal
ryc
=
rycOld
.
add
(
fycValue
);
BigDecimal
ryc
=
rycOld
.
add
(
fycValue
);
agentAccumulatedFyc
.
setRyc
(
ryc
);
agentAccumulatedFyc
.
setRyc
(
ryc
);
//未生效累计非首期佣金积分值(佣金场景)= 未生效累计非首期佣金积分值(佣金场景)- 增量积分
BigDecimal
noRyc
=
noRycOld
.
subtract
(
fycValue
);
BigDecimal
noRyc
=
noRycOld
.
subtract
(
fycValue
);
agentAccumulatedFyc
.
setNoRyc
(
noRyc
.
compareTo
(
BigDecimal
.
ZERO
)
<=
0
?
BigDecimal
.
ZERO
:
noRyc
);
agentAccumulatedFyc
.
setNoRyc
(
noRyc
.
max
(
BigDecimal
.
ZERO
)
);
}
}
//晋升职级累计积分 = 初始化已生效积分(不限业务场景) + 已生效累计首期销售佣金积分值(销售佣金场景(佣金场景的其中一个))
BigDecimal
initEffect
=
agentAccumulatedFyc
.
getInitEffect
()
==
null
?
BigDecimal
.
ZERO
:
agentAccumulatedFyc
.
getInitEffect
();
// 晋升职级累计积分
BigDecimal
firstSalesCommission
=
agentAccumulatedFyc
.
getFirstSalesCommission
()
==
null
?
BigDecimal
.
ZERO
:
agentAccumulatedFyc
.
getFirstSalesCommission
();
BigDecimal
initEffect
=
nvl
(
agentAccumulatedFyc
.
getInitEffect
());
BigDecimal
firstSalesCommission
=
nvl
(
agentAccumulatedFyc
.
getFirstSalesCommission
());
BigDecimal
promotion
=
initEffect
.
add
(
firstSalesCommission
);
BigDecimal
promotion
=
initEffect
.
add
(
firstSalesCommission
);
agentAccumulatedFyc
.
setPromotion
(
promotion
.
compareTo
(
BigDecimal
.
ZERO
)
<=
0
?
BigDecimal
.
ZERO
:
promotion
);
agentAccumulatedFyc
.
setPromotion
(
promotion
.
max
(
BigDecimal
.
ZERO
)
);
//最后计算日期,记录最后一次计算累计FYC的日期
agentAccumulatedFyc
.
setLastCalcDate
(
LocalDateTime
.
now
());
agentAccumulatedFyc
.
setLastCalcDate
(
LocalDateTime
.
now
());
iAgentAccumulatedFycService
.
saveOrUpdate
(
agentAccumulatedFyc
);
iAgentAccumulatedFycService
.
saveOrUpdate
(
agentAccumulatedFyc
);
//新增积分总表日志表
// 新增积分总表日志
AgentAccumulatedFycLog
log
=
new
AgentAccumulatedFycLog
();
AgentAccumulatedFycLog
logObj
=
new
AgentAccumulatedFycLog
();
BeanUtils
.
copyProperties
(
agentAccumulatedFyc
,
log
);
BeanUtils
.
copyProperties
(
agentAccumulatedFyc
,
logObj
);
log
.
setId
(
null
);
logObj
.
setId
(
null
);
log
.
setFycBizId
(
agentAccumulatedFyc
.
getFycBizId
());
logObj
.
setFycBizId
(
agentAccumulatedFyc
.
getFycBizId
());
log
.
setFycLogBizId
(
RandomStringGenerator
.
generateBizId16
(
CommonEnum
.
UID_TYPE_AGENT_ACCUMULATED_FYC_LOG
.
getCode
()));
logObj
.
setFycLogBizId
(
RandomStringGenerator
.
generateBizId16
(
//操作来源枚举-解冻
CommonEnum
.
UID_TYPE_AGENT_ACCUMULATED_FYC_LOG
.
getCode
()));
log
.
setSourceType
(
OprSourceEnum
.
CALM_TASK_FREEZE
.
getItemValue
());
logObj
.
setSourceType
(
OprSourceEnum
.
CALM_TASK_FREEZE
.
getItemValue
());
log
.
setCreateTime
(
LocalDateTime
.
now
());
logObj
.
setCreateTime
(
LocalDateTime
.
now
());
log
.
setUpdateTime
(
LocalDateTime
.
now
());
logObj
.
setUpdateTime
(
LocalDateTime
.
now
());
iAgentAccumulatedFycLogService
.
saveOrUpdate
(
log
);
iAgentAccumulatedFycLogService
.
saveOrUpdate
(
logObj
);
log
.
debug
(
"经纪人积分累算完成,brokerBizId: {}, 本次增量: {}"
,
brokerBizId
,
fycValue
);
}
}
/**
* BigDecimal 空值安全转零
*/
private
BigDecimal
nvl
(
BigDecimal
val
)
{
return
val
==
null
?
BigDecimal
.
ZERO
:
val
;
}
}
}
}
\ No newline at end of file
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