Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
H
huhu-partner
Project
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
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
guanchen
huhu-partner
Commits
b8246889
Commit
b8246889
authored
Dec 05, 2019
by
guanchen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
上线美团酒店,途牛,饿了么平推奖励
parent
1a9bd326
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
36 additions
and
1550 deletions
+36
-1550
Constants.java
...ain/java/com/lanren/huhu/partner/constants/Constants.java
+22
-65
AgentController.java
...a/com/lanren/huhu/partner/controller/AgentController.java
+0
-24
PartnerController.java
...com/lanren/huhu/partner/controller/PartnerController.java
+2
-2
AgentManager.java
...in/java/com/lanren/huhu/partner/manager/AgentManager.java
+0
-13
PartnerManager.java
.../java/com/lanren/huhu/partner/manager/PartnerManager.java
+2
-2
AgentRewardQueueTask.java
...om/lanren/huhu/partner/schedule/AgentRewardQueueTask.java
+10
-1
AgentSettleTask.java
...ava/com/lanren/huhu/partner/schedule/AgentSettleTask.java
+0
-689
PartnerSettleTask.java
...a/com/lanren/huhu/partner/schedule/PartnerSettleTask.java
+0
-754
No files found.
src/main/java/com/lanren/huhu/partner/constants/Constants.java
View file @
b8246889
...
...
@@ -29,8 +29,13 @@ public class Constants {
public
static
final
String
AGENT_REWARD_TYPE_SELF_ORDER_REMARK
=
"推荐奖励-自购省"
;
public
static
final
int
AGENT_REWARD_TYPE_SHARE_ORDER
=
760
;
public
static
final
String
AGENT_REWARD_TYPE_SHARE_ORDER_REMARK
=
"推荐奖励-分享赚"
;
public
static
final
int
AGENT_REWARD_TYPE_VIP_PACKAGE
=
780
;
public
static
final
String
AGENT_REWARD_TYPE_VIP_PACKAGE_REMARK
=
"推荐奖励-VIP礼包"
;
public
static
final
int
JD_OFFSET
=
1000
;
//用于查找京东的平推奖励比例
public
static
final
int
MT_OFFSET
=
2000
;
//用于查找美团的平推奖励比例
public
static
final
int
TN_OFFSET
=
3000
;
//用于查找途牛的平推奖励比例
public
static
final
int
MTJD_OFFSET
=
4000
;
//用于查找美团酒店的平推奖励比例
public
static
final
int
ELM_OFFSET
=
5000
;
//用于查找饿了么的平推奖励比例
public
static
Map
<
Integer
,
Map
<
Integer
,
BigDecimal
>>
AGENT_RATE_MAP
=
new
HashMap
<
Integer
,
Map
<
Integer
,
BigDecimal
>>();
public
static
Map
<
Integer
,
String
>
AGENT_REWARD_REMARK
=
new
HashMap
<
Integer
,
String
>();
public
static
final
int
AGENT_LEVEL_1
=
1
;
...
...
@@ -42,6 +47,9 @@ public class Constants {
public
static
final
String
PARENT_COLUMN_NAME_PINGTUI
=
"presenter_id"
;
public
static
final
String
ORDER_TYPE_JD
=
"jd"
;
public
static
final
String
ORDER_TYPE_MT
=
"mt"
;
public
static
final
String
ORDER_TYPE_TN
=
"tuniu"
;
public
static
final
String
ORDER_TYPE_MTJD
=
"mt_jd"
;
public
static
final
String
ORDER_TYPE_ELM
=
"elm"
;
/**
* 回扣类型
*/
...
...
@@ -66,12 +74,7 @@ public class Constants {
public
static
final
int
SETTLE_STATE_PRE
=
200
;
public
static
final
int
SETTLE_STATE_DONE
=
300
;
public
static
final
int
SETTLE_STATE_FAILED
=
-
300
;
/**
* 财务结算状态
*/
public
static
final
int
REWARD_STATUS_UNSETTLE
=
100
;
public
static
final
int
REWARD_STATUS_SETTLE
=
120
;
// public static final int REWARD_STATUS_FAILED = 99;
/**
* 最小奖励金额 小于此不写入
*/
...
...
@@ -82,63 +85,12 @@ public class Constants {
*/
public
static
final
String
AGENT_REWARD_PUSH_KEY
=
"agent:reward:queue"
;
/**
* 合伙人
*/
public
static
final
int
PARTNER_REWARD_TYPE_REDPACK
=
60
;
public
static
final
String
PARTNER_REWARD_TYPE_REDPACK_REMARK
=
"用户在线充值"
;
public
static
final
int
PARTNER_REWARD_TYPE_VIP
=
70
;
public
static
final
String
PARTNER_REWARD_TYPE_VIP_REMARK
=
"升高开户充值"
;
public
static
final
int
PARTNER_REWARD_TYPE_INVITE
=
80
;
public
static
final
String
PARTNER_REWARD_TYPE_INVITE_REMARK
=
"邀请奖励"
;
public
static
final
int
PARTNER_REWARD_TYPE_ORDER_ACTIVE
=
90
;
public
static
final
String
PARTNER_REWARD_TYPE_ORDER_ACTIVE_REMARK
=
"下单奖励"
;
public
static
final
int
PARTNER_REWARD_TYPE_SVIP
=
100
;
public
static
final
String
PARTNER_REWARD_TYPE_SVIP_REMARK
=
"购买超级VIP会员"
;
public
static
final
int
PARTNER_REWARD_TYPE_PURCHASE
=
110
;
public
static
final
String
PARTNER_REWARD_TYPE_PURCHASE_REMARK
=
"购物奖励"
;
public
static
final
int
PARTNER_REWARD_TYPE_SHARE
=
120
;
public
static
final
String
PARTNER_REWARD_TYPE_SHARE_REMARK
=
"分享赚奖励"
;
/**
* 订单状态
*/
public
static
final
int
ORDER_STATE_FAILED
=
-
3
;
public
static
final
int
ORDER_STATE_PAID
=
1
;
public
static
final
int
ORDER_STATE_SETTLED
=
3
;
/**
* 阶梯算税
*/
public
static
final
BigDecimal
TAX_STAGE_FREE_BASE
=
new
BigDecimal
(
"800"
);
public
static
final
BigDecimal
TAX_STAGE_1
=
new
BigDecimal
(
"4000"
);
public
static
final
BigDecimal
TAX_STAGE_1_RATE1
=
new
BigDecimal
(
"0.2"
);
//800-4000
public
static
final
BigDecimal
TAX_STAGE_1_RATE2
=
new
BigDecimal
(
"0.76"
);
public
static
final
BigDecimal
TAX_STAGE_WX_MAX
=
new
BigDecimal
(
"17076.5"
);
//4000-17076.5
public
static
final
BigDecimal
TAX_STAGE_WX_MAX_RATE1
=
new
BigDecimal
(
"0.8"
);
//
public
static
final
BigDecimal
TAX_STAGE_WX_MAX_RATE2
=
new
BigDecimal
(
"0.2"
);
//
public
static
final
BigDecimal
TAX_STAGE_WX_MAX_RATE3
=
new
BigDecimal
(
"0.76"
);
//
public
static
final
BigDecimal
BANK_RATE
=
new
BigDecimal
(
"0.1"
);
/**
* 合伙人变更记录
*/
public
static
final
int
PARTNER_ACCOUNT_LOG_TYPE_SETTLE
=
50
;
public
static
final
String
PARTNER_ACCOUNT_LOG_TYPE_SETTLE_REMARK
=
"月结发钱"
;
public
static
final
int
PARTNER_ACCOUNT_LOG_TYPE_TECH_CHARGE
=
80
;
public
static
final
String
PARTNER_ACCOUNT_LOG_TYPE_TECH_CHARGE_REMARK
=
"平台技术服务费"
;
public
static
final
int
PARTNER_ACCOUNT_LOG_TYPE_TAX
=
70
;
public
static
final
String
PARTNER_ACCOUNT_LOG_TYPE_TAX_REMARK
=
"代扣个人所得税"
;
/**
* 代理商奖励类型
*/
public
static
final
int
AGENT_REWARD_TYPE_PURCHASE
=
300
;
public
static
final
int
AGENT_REWARD_TYPE_SHARE
=
60
;
static
{
/**
* 代理商平推奖励比例配置
*/
AGENT_RATE_MAP
.
put
(
AGENT_REWARD_TYPE_YEAR_VIP
,
new
HashMap
<
Integer
,
BigDecimal
>());
AGENT_RATE_MAP
.
put
(
AGENT_REWARD_TYPE_VIP_PACKAGE
,
new
HashMap
<
Integer
,
BigDecimal
>());
// AGENT_RATE_MAP.put(AGENT_REWARD_TYPE_HALF_YEAR_VIP, new HashMap<Integer, BigDecimal>());
// AGENT_RATE_MAP.put(AGENT_REWARD_TYPE_SVIP, new HashMap<Integer, BigDecimal>());
AGENT_RATE_MAP
.
put
(
AGENT_REWARD_TYPE_REDPACK
,
new
HashMap
<
Integer
,
BigDecimal
>());
...
...
@@ -147,17 +99,15 @@ public class Constants {
AGENT_RATE_MAP
.
put
(
AGENT_REWARD_TYPE_SELF_ORDER
+
JD_OFFSET
,
new
HashMap
<
Integer
,
BigDecimal
>());
AGENT_RATE_MAP
.
put
(
AGENT_REWARD_TYPE_SHARE_ORDER
+
JD_OFFSET
,
new
HashMap
<
Integer
,
BigDecimal
>());
AGENT_RATE_MAP
.
put
(
AGENT_REWARD_TYPE_SELF_ORDER
+
MT_OFFSET
,
new
HashMap
<
Integer
,
BigDecimal
>());
AGENT_RATE_MAP
.
put
(
AGENT_REWARD_TYPE_SELF_ORDER
+
TN_OFFSET
,
new
HashMap
<
Integer
,
BigDecimal
>());
AGENT_RATE_MAP
.
put
(
AGENT_REWARD_TYPE_SELF_ORDER
+
MTJD_OFFSET
,
new
HashMap
<
Integer
,
BigDecimal
>());
AGENT_RATE_MAP
.
put
(
AGENT_REWARD_TYPE_SELF_ORDER
+
ELM_OFFSET
,
new
HashMap
<
Integer
,
BigDecimal
>());
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_YEAR_VIP
).
put
(
0
,
new
BigDecimal
(
"0.02512563"
));
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_YEAR_VIP
).
put
(
1
,
new
BigDecimal
(
"0.01507538"
));
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_VIP_PACKAGE
).
put
(
0
,
new
BigDecimal
(
"0.02512563"
));
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_VIP_PACKAGE
).
put
(
1
,
new
BigDecimal
(
"0.01507538"
));
// AGENT_RATE_MAP.get(AGENT_REWARD_TYPE_HALF_YEAR_VIP).put(0, new BigDecimal("0.03015075"));
// AGENT_RATE_MAP.get(AGENT_REWARD_TYPE_HALF_YEAR_VIP).put(1, new BigDecimal("0.01256281"));
// AGENT_RATE_MAP.get(AGENT_REWARD_TYPE_HALF_YEAR_VIP).put(2, new BigDecimal("0.00753769"));
//
// AGENT_RATE_MAP.get(AGENT_REWARD_TYPE_SVIP).put(0, new BigDecimal("0.02500000"));
// AGENT_RATE_MAP.get(AGENT_REWARD_TYPE_SVIP).put(1, new BigDecimal("0.01111111"));
// AGENT_RATE_MAP.get(AGENT_REWARD_TYPE_SVIP).put(2, new BigDecimal("0.00555556"));
/**
* 红包
*/
...
...
@@ -172,6 +122,12 @@ public class Constants {
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_SELF_ORDER
+
JD_OFFSET
).
put
(
1
,
new
BigDecimal
(
"0.0087"
));
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_SELF_ORDER
+
MT_OFFSET
).
put
(
0
,
new
BigDecimal
(
"0.01"
));
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_SELF_ORDER
+
MT_OFFSET
).
put
(
1
,
new
BigDecimal
(
"0.01"
));
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_SELF_ORDER
+
TN_OFFSET
).
put
(
0
,
new
BigDecimal
(
"0.01"
));
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_SELF_ORDER
+
TN_OFFSET
).
put
(
1
,
new
BigDecimal
(
"0.01"
));
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_SELF_ORDER
+
MTJD_OFFSET
).
put
(
0
,
new
BigDecimal
(
"0.01"
));
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_SELF_ORDER
+
MTJD_OFFSET
).
put
(
1
,
new
BigDecimal
(
"0.01"
));
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_SELF_ORDER
+
ELM_OFFSET
).
put
(
0
,
new
BigDecimal
(
"0.01"
));
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_SELF_ORDER
+
ELM_OFFSET
).
put
(
1
,
new
BigDecimal
(
"0.01"
));
/**
* 分享赚
*/
...
...
@@ -181,6 +137,7 @@ public class Constants {
AGENT_RATE_MAP
.
get
(
AGENT_REWARD_TYPE_SHARE_ORDER
+
JD_OFFSET
).
put
(
1
,
new
BigDecimal
(
"0.0087"
));
AGENT_REWARD_REMARK
.
put
(
AGENT_REWARD_TYPE_YEAR_VIP
,
AGENT_REWARD_TYPE_YEAR_VIP_REMARK
);
AGENT_REWARD_REMARK
.
put
(
AGENT_REWARD_TYPE_VIP_PACKAGE
,
AGENT_REWARD_TYPE_VIP_PACKAGE_REMARK
);
// AGENT_REWARD_REMARK.put(AGENT_REWARD_TYPE_HALF_YEAR_VIP, AGENT_REWARD_TYPE_HALF_YEAR_VIP_REMARK);
// AGENT_REWARD_REMARK.put(AGENT_REWARD_TYPE_SVIP, AGENT_REWARD_TYPE_SVIP_REMARK);
AGENT_REWARD_REMARK
.
put
(
AGENT_REWARD_TYPE_REDPACK
,
AGENT_REWARD_TYPE_REDPACK_REMARK
);
...
...
src/main/java/com/lanren/huhu/partner/controller/AgentController.java
View file @
b8246889
...
...
@@ -6,7 +6,6 @@ import com.lanren.huhu.partner.model.AgentResponse;
import
com.lanren.huhu.partner.model.ParentAgent
;
import
com.lanren.huhu.partner.result.Result
;
import
com.lanren.huhu.partner.schedule.AgentDailyExpandTask
;
import
com.lanren.huhu.partner.schedule.AgentSettleTask
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -29,8 +28,6 @@ public class AgentController {
AgentManager
agentManager
;
@Autowired
AgentDailyExpandTask
agentDailyExpandTask
;
@Autowired
AgentSettleTask
agentSettleTask
;
@RequestMapping
(
value
=
"/level"
,
method
=
RequestMethod
.
POST
)
public
Result
<
AgentResponse
>
getAgentLevel
(
@RequestBody
@Valid
Agent
agent
,
@RequestHeader
HttpHeaders
headers
)
{
...
...
@@ -69,25 +66,4 @@ public class AgentController {
result
.
setData
(
"异步,正在执行刷新......"
);
return
result
;
}
/**
* 测试使用 结算单个代理商
*/
@RequestMapping
(
value
=
"/finance"
,
method
=
RequestMethod
.
POST
)
public
Result
<
String
>
doFinanceSettle
(
@RequestBody
@Valid
Agent
agent
,
@RequestHeader
HttpHeaders
headers
)
{
if
(
logger
.
isInfoEnabled
())
{
logger
.
info
(
"doFinanceSettle userId:{},header:{},time:{}"
,
agent
.
getAgentId
(),
headers
.
keySet
().
toArray
(),
LocalDateTime
.
now
());
}
return
agentManager
.
doFinanceSettle
(
agent
.
getAgentId
());
}
/**
* 结算全部代理商
*/
@RequestMapping
(
value
=
"/finance"
,
method
=
RequestMethod
.
GET
)
public
Result
<
String
>
doFinanceSettle
(
@RequestHeader
HttpHeaders
headers
)
{
agentSettleTask
.
runScheduledTask
();
logger
.
info
(
"============>"
+
Thread
.
currentThread
().
getName
());
Result
<
String
>
result
=
new
Result
<
String
>();
result
.
setData
(
"异步,正在执行刷新......"
);
return
result
;
}
}
src/main/java/com/lanren/huhu/partner/controller/PartnerController.java
View file @
b8246889
package
com
.
lanren
.
huhu
.
partner
.
controller
;
import
com.lanren.huhu.partner.manager.PartnerManager
;
import
com.lanren.huhu.partner.model.Partner
;
import
com.lanren.huhu.partner.model.PartnerResponse
;
import
com.lanren.huhu.partner.result.Result
;
import
com.lanren.huhu.partner.schedule.PartnerSettleTask
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.HttpHeaders
;
import
org.springframework.web.bind.annotation.*
;
import
javax.validation.Valid
;
import
java.time.LocalDateTime
;
/** * @Author houseme * @Date 2019-06-26 11:00 * @Project partner * @Package com.lanren.huhu.partner.controller * @File: PartnerController */
@RestController
@RequestMapping
(
"/v1/partner"
)
public
class
PartnerController
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
PartnerController
.
class
);
@Autowired
private
PartnerManager
partnerManager
;
@Autowired
private
PartnerSettleTask
partnerSettleTask
;
@RequestMapping
(
value
=
"/level"
,
method
=
RequestMethod
.
POST
)
public
Result
<
PartnerResponse
>
getPartnerLevel
(
@RequestBody
@Valid
Partner
partner
,
@RequestHeader
HttpHeaders
headers
)
{
if
(
logger
.
isInfoEnabled
())
{
logger
.
info
(
"getPartnerLevel userId:{},header:{},time:{}"
,
partner
.
getUserId
(),
headers
.
keySet
().
toArray
(),
LocalDateTime
.
now
());
}
return
partnerManager
.
getPartnerLevel
(
partner
.
getUserId
());
}
/** * 测试使用 结算单个用户 */
@RequestMapping
(
value
=
"/finance"
,
method
=
RequestMethod
.
POST
)
public
Result
<
String
>
doFinanceSettle
(
@RequestBody
@Valid
Partner
partner
,
@RequestHeader
HttpHeaders
headers
)
{
if
(
logger
.
isInfoEnabled
())
{
logger
.
info
(
"doFinanceSettle userId:{},header:{},time:{}"
,
partner
.
getUserId
(),
headers
.
keySet
().
toArray
(),
LocalDateTime
.
now
());
}
return
partnerManager
.
doFinanceSettle
(
partner
.
getUserId
());
}
/** * 结算全部用户 */
@RequestMapping
(
value
=
"/finance"
,
method
=
RequestMethod
.
GET
)
public
Result
<
String
>
doFinanceSettle
(
@RequestHeader
HttpHeaders
headers
)
{
partnerSettleTask
.
runSettle
();
logger
.
info
(
"============>"
+
Thread
.
currentThread
().
getName
());
Result
<
String
>
result
=
new
Result
<
String
>();
result
.
setData
(
"异步,正在执行刷新......"
);
return
result
;
}
// /** // * 汇总合伙人已结算数据 // */ // @RequestMapping(value = "/summary/{dateStr}/{uid}", method = RequestMethod.GET) // public Result<String> doSummarySettled(@PathVariable("dateStr") String dateStr, @PathVariable("uid") int uid, @RequestHeader HttpHeaders headers) { // return partnerManager.runSummary(dateStr, uid); // } }
\ No newline at end of file
package
com
.
lanren
.
huhu
.
partner
.
controller
;
import
com.lanren.huhu.partner.manager.PartnerManager
;
import
com.lanren.huhu.partner.model.Partner
;
import
com.lanren.huhu.partner.model.PartnerResponse
;
import
com.lanren.huhu.partner.result.Result
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.HttpHeaders
;
import
org.springframework.web.bind.annotation.*
;
import
javax.validation.Valid
;
import
java.time.LocalDateTime
;
/** * @Author houseme * @Date 2019-06-26 11:00 * @Project partner * @Package com.lanren.huhu.partner.controller * @File: PartnerController */
@RestController
@RequestMapping
(
"/v1/partner"
)
public
class
PartnerController
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
PartnerController
.
class
);
@Autowired
private
PartnerManager
partnerManager
;
@RequestMapping
(
value
=
"/level"
,
method
=
RequestMethod
.
POST
)
public
Result
<
PartnerResponse
>
getPartnerLevel
(
@RequestBody
@Valid
Partner
partner
,
@RequestHeader
HttpHeaders
headers
)
{
if
(
logger
.
isInfoEnabled
())
{
logger
.
info
(
"getPartnerLevel userId:{},header:{},time:{}"
,
partner
.
getUserId
(),
headers
.
keySet
().
toArray
(),
LocalDateTime
.
now
());
}
return
partnerManager
.
getPartnerLevel
(
partner
.
getUserId
());
}
}
\ No newline at end of file
...
...
src/main/java/com/lanren/huhu/partner/manager/AgentManager.java
View file @
b8246889
...
...
@@ -6,7 +6,6 @@ import com.lanren.huhu.partner.model.AgentResponse;
import
com.lanren.huhu.partner.model.AgentRewardMessage
;
import
com.lanren.huhu.partner.model.ParentAgent
;
import
com.lanren.huhu.partner.result.Result
;
import
com.lanren.huhu.partner.schedule.AgentSettleTask
;
import
com.lanren.huhu.partner.service.UserAgentService
;
import
com.lanren.huhu.partner.service.UserService
;
import
org.slf4j.Logger
;
...
...
@@ -34,8 +33,6 @@ public class AgentManager {
@Autowired
StringRedisTemplate
redisTemplate
;
@Autowired
AgentSettleTask
agentSettleTask
;
@Autowired
UserService
userService
;
/***
...
...
@@ -106,14 +103,4 @@ public class AgentManager {
result
.
setData
(
parentAgents
);
return
result
;
}
public
Result
<
String
>
doFinanceSettle
(
int
agentId
)
{
Result
<
String
>
result
=
new
Result
<
String
>();
if
(
agentSettleTask
.
doOneAgentSettle
(
agentId
))
{
result
.
setCode
(
0
);
}
else
{
result
.
setCode
(
500
);
}
return
result
;
}
}
src/main/java/com/lanren/huhu/partner/manager/PartnerManager.java
View file @
b8246889
package
com
.
lanren
.
huhu
.
partner
.
manager
;
import
com.lanren.huhu.partner.domain.PartnerAccount
;
import
com.lanren.huhu.partner.model.PartnerResponse
;
import
com.lanren.huhu.partner.result.Result
;
import
com.lanren.huhu.partner.schedule.PartnerSettleTask
;
import
com.lanren.huhu.partner.service.PartnerAccountService
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
java.time.LocalDateTime
;
/** * @author houseme * @date 2019-06-26 10:56 * @Project partner * @Package com.lanren.huhu.partner.manager * @File: PartnerAccountManager */
@Component
public
class
PartnerManager
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
PartnerManager
.
class
);
@Autowired
private
PartnerAccountService
partnerAccountService
;
@Autowired
private
PartnerSettleTask
partnerSettleTask
;
/*** * 获取合伙人账户信息 * @param userId * @return */
public
Result
<
PartnerAccount
>
findByUserId
(
Integer
userId
)
{
Result
<
PartnerAccount
>
result
=
new
Result
<>();
if
(
logger
.
isDebugEnabled
())
{
logger
.
info
(
"PartnerAccountManager findByUserId userId:{},time:{}"
,
userId
,
LocalDateTime
.
now
());
}
PartnerAccount
partnerAccount
=
partnerAccountService
.
getOneByUserId
(
userId
);
result
.
setData
(
partnerAccount
);
return
result
;
}
/*** * 获取合伙人等级 10 普通, 20 高级, 30 超级 * @param userId * @return */
public
Result
<
PartnerResponse
>
getPartnerLevel
(
Integer
userId
)
{
if
(
logger
.
isDebugEnabled
())
{
logger
.
info
(
"PartnerAccountManager getPartnerLevel userId:{},time:{}"
,
userId
,
LocalDateTime
.
now
());
}
Result
<
PartnerResponse
>
result
=
new
Result
<>();
PartnerAccount
partnerAccount
=
partnerAccountService
.
getOneByUserId
(
userId
);
if
(
null
!=
partnerAccount
)
{
int
partnerLevel
;
if
(
partnerAccount
.
getIsSuperPartner
()
==
1
)
{
partnerLevel
=
30
;
}
else
{
partnerLevel
=
partnerAccount
.
getPartnerLevel
();
}
result
.
setData
(
new
PartnerResponse
(
partnerLevel
));
}
else
{
result
.
setCode
(
601
);
}
return
result
;
}
public
Result
<
String
>
doFinanceSettle
(
int
userId
)
{
Result
<
String
>
result
=
new
Result
<>();
if
(
partnerSettleTask
.
doOneUserSettle
(
userId
))
{
result
.
setCode
(
0
);
}
else
{
result
.
setCode
(
500
);
}
return
result
;
}
// public Result<String> runSummary(String dateStr, int userId) { // Result<String> result = new Result<>(); // if (partnerSettleTask.runSummary(dateStr, userId)) { // result.setCode(0); // } else { // result.setCode(500); // } // return result; // } }
\ No newline at end of file
package
com
.
lanren
.
huhu
.
partner
.
manager
;
import
com.lanren.huhu.partner.domain.PartnerAccount
;
import
com.lanren.huhu.partner.model.PartnerResponse
;
import
com.lanren.huhu.partner.result.Result
;
import
com.lanren.huhu.partner.service.PartnerAccountService
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
java.time.LocalDateTime
;
/** * @author houseme * @date 2019-06-26 10:56 * @Project partner * @Package com.lanren.huhu.partner.manager * @File: PartnerAccountManager */
@Component
public
class
PartnerManager
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
PartnerManager
.
class
);
@Autowired
private
PartnerAccountService
partnerAccountService
;
/*** * 获取合伙人账户信息 * @param userId * @return */
public
Result
<
PartnerAccount
>
findByUserId
(
Integer
userId
)
{
Result
<
PartnerAccount
>
result
=
new
Result
<>();
if
(
logger
.
isDebugEnabled
())
{
logger
.
info
(
"PartnerAccountManager findByUserId userId:{},time:{}"
,
userId
,
LocalDateTime
.
now
());
}
PartnerAccount
partnerAccount
=
partnerAccountService
.
getOneByUserId
(
userId
);
result
.
setData
(
partnerAccount
);
return
result
;
}
/*** * 获取合伙人等级 10 普通, 20 高级, 30 超级 * @param userId * @return */
public
Result
<
PartnerResponse
>
getPartnerLevel
(
Integer
userId
)
{
if
(
logger
.
isDebugEnabled
())
{
logger
.
info
(
"PartnerAccountManager getPartnerLevel userId:{},time:{}"
,
userId
,
LocalDateTime
.
now
());
}
Result
<
PartnerResponse
>
result
=
new
Result
<>();
PartnerAccount
partnerAccount
=
partnerAccountService
.
getOneByUserId
(
userId
);
if
(
null
!=
partnerAccount
)
{
int
partnerLevel
;
if
(
partnerAccount
.
getIsSuperPartner
()
==
1
)
{
partnerLevel
=
30
;
}
else
{
partnerLevel
=
partnerAccount
.
getPartnerLevel
();
}
result
.
setData
(
new
PartnerResponse
(
partnerLevel
));
}
else
{
result
.
setCode
(
601
);
}
return
result
;
}
}
\ No newline at end of file
...
...
src/main/java/com/lanren/huhu/partner/schedule/AgentRewardQueueTask.java
View file @
b8246889
...
...
@@ -113,6 +113,15 @@ public class AgentRewardQueueTask {
}
else
if
(
rewardType
==
AGENT_REWARD_TYPE_SELF_ORDER
&&
message
.
getOrderType
().
equals
(
ORDER_TYPE_MT
)
)
{
rateMap
=
AGENT_RATE_MAP
.
get
(
rewardType
+
MT_OFFSET
);
}
else
if
(
rewardType
==
AGENT_REWARD_TYPE_SELF_ORDER
&&
message
.
getOrderType
().
equals
(
ORDER_TYPE_TN
)
)
{
rateMap
=
AGENT_RATE_MAP
.
get
(
rewardType
+
TN_OFFSET
);
}
else
if
(
rewardType
==
AGENT_REWARD_TYPE_SELF_ORDER
&&
message
.
getOrderType
().
equals
(
ORDER_TYPE_MTJD
)
)
{
rateMap
=
AGENT_RATE_MAP
.
get
(
rewardType
+
MTJD_OFFSET
);
}
else
if
(
rewardType
==
AGENT_REWARD_TYPE_SELF_ORDER
&&
message
.
getOrderType
().
equals
(
ORDER_TYPE_ELM
)
)
{
rateMap
=
AGENT_RATE_MAP
.
get
(
rewardType
+
ELM_OFFSET
);
}
else
{
rateMap
=
AGENT_RATE_MAP
.
get
(
rewardType
);
}
...
...
@@ -318,7 +327,7 @@ public class AgentRewardQueueTask {
*/
BigDecimal
rewardBasement
;
// if (rewardType == AGENT_REWARD_TYPE_YEAR_VIP || rewardType == AGENT_REWARD_TYPE_HALF_YEAR_VIP || rewardType == AGENT_REWARD_TYPE_SVIP) {
if
(
rewardType
==
AGENT_REWARD_TYPE_YEAR_VIP
||
rewardType
==
AGENT_REWARD_TYPE_REDPACK
)
{
if
(
rewardType
==
AGENT_REWARD_TYPE_YEAR_VIP
||
rewardType
==
AGENT_REWARD_TYPE_REDPACK
||
rewardType
==
AGENT_REWARD_TYPE_VIP_PACKAGE
)
{
rewardBasement
=
message
.
getSourceUserPayment
();
}
else
{
/**
...
...
src/main/java/com/lanren/huhu/partner/schedule/AgentSettleTask.java
deleted
100644 → 0
View file @
1a9bd326
package
com
.
lanren
.
huhu
.
partner
.
schedule
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.lanren.huhu.partner.constants.Constants
;
import
com.lanren.huhu.partner.domain.*
;
import
com.lanren.huhu.partner.model.*
;
import
com.lanren.huhu.partner.service.*
;
import
com.lanren.huhu.partner.util.DateUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.jdbc.datasource.DataSourceTransactionManager
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.stereotype.Component
;
import
org.springframework.transaction.TransactionDefinition
;
import
org.springframework.transaction.TransactionStatus
;
import
java.math.BigDecimal
;
import
java.math.RoundingMode
;
import
java.util.*
;
import
static
org
.
springframework
.
util
.
StringUtils
.
isEmpty
;
/**
* @author chen
* @title: AgentSettleTask
* @projectName partner
* @description: 代理商结算
* @package com.lanren.huhu.partner.schedule
* @date 2019-07-23 10:31
*/
@Component
public
class
AgentSettleTask
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
AgentSettleTask
.
class
);
private
static
final
int
PAGE_SIZE
=
1000
;
private
static
final
BigDecimal
ZERO
=
new
BigDecimal
(
0
);
@Autowired
AgentRewardService
agentRewardService
;
@Autowired
OrdersActiveService
ordersActiveService
;
@Autowired
OrderTaobaoJdCommissionService
orderTaobaoJdCommissionService
;
@Autowired
OrderTaobaoJdGoodsCommissionService
orderTaobaoJdGoodsCommissionService
;
@Autowired
DataSourceTransactionManager
dataSourceTransactionManager
;
@Autowired
TransactionDefinition
transactionDefinition
;
@Autowired
AgentAccountService
agentAccountService
;
@Autowired
AgentIncomeSummaryService
agentIncomeSummaryService
;
@Autowired
AgentAccountLogService
agentAccountLogService
;
@Autowired
AgentBankCardService
agentBankCardService
;
@Autowired
AgentSalaryService
agentSalaryService
;
@Autowired
AgentExpandDailyService
agentExpandDailyService
;
@Async
public
void
runScheduledTask
()
{
logger
.
info
(
"run AgentSettleTask"
);
try
{
long
input
=
DateUtils
.
getLastMonth1stTimestamp
(
System
.
currentTimeMillis
());
long
beginTs
=
DateUtils
.
getMonth1stTimestamp
(
input
)
/
1000L
;
long
endTs
=
DateUtils
.
getMonthLastTimestamp
(
input
)
/
1000L
;
updateAll
(
beginTs
,
endTs
);
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
logger
.
info
(
"run AgentSettleTask done"
);
}
private
void
updateAll
(
long
beginTs
,
long
endTs
)
{
updateOrderCommission
(
beginTs
,
endTs
,
0
,
0
);
doSettle
(
beginTs
,
endTs
);
}
private
void
doSettle
(
long
beginTs
,
long
endTs
)
{
AgentSettle
errAgentSettle
=
null
;
try
{
int
cnt
=
0
;
while
(
true
)
{
int
pageNo
=
1
;
Page
<
AgentSettle
>
page
=
new
Page
<
AgentSettle
>(
pageNo
,
PAGE_SIZE
);
page
.
setOptimizeCountSql
(
false
);
page
.
setSearchCount
(
false
);
IPage
<
AgentSettle
>
ipage
=
agentRewardService
.
selectAgentSettlePageByTs
(
page
,
beginTs
,
endTs
);
List
<
AgentSettle
>
agentSettleList
=
ipage
.
getRecords
();
if
(
agentSettleList
!=
null
&&
agentSettleList
.
size
()
>
0
)
{
for
(
AgentSettle
agentSettle
:
agentSettleList
)
{
try
{
updateTax
(
agentSettle
);
errAgentSettle
=
agentSettle
;
if
(
agentSettle
!=
null
)
{
if
(!
doDbUpdate
(
agentSettle
,
beginTs
,
endTs
))
{
logger
.
error
(
"doDbUpdate failed for agent {}"
,
agentSettle
.
getAgentId
());
}
}
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
cnt
++;
}
}
else
{
break
;
}
}
logger
.
info
(
"cnt is {}"
,
cnt
);
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
logger
.
error
(
"errAgentSettle is {}"
,
errAgentSettle
);
}
}
private
void
updateTax
(
AgentSettle
agentSettle
)
{
BigDecimal
tax
=
agentSettle
.
getBalance
()
.
subtract
(
agentSettle
.
getZigoushengBalance
())
.
subtract
(
agentSettle
.
getShareBalance
())
.
subtract
(
agentSettle
.
getTechChargeRedpack
())
.
subtract
(
BigDecimal
.
valueOf
(
800L
))
.
multiply
(
BigDecimal
.
valueOf
(
0.1d
));
if
(
tax
.
compareTo
(
BigDecimal
.
ZERO
)
<=
0
)
{
tax
=
BigDecimal
.
ZERO
;
}
agentSettle
.
setTax
(
tax
);
}
/**
* 自购省和分享赚的奖励金额 需要根据最终的实际原始佣金 重新计算
* @param beginTs
* @param endTs
*/
private
void
updateOrderCommission
(
long
beginTs
,
long
endTs
,
int
runType
,
int
agentId
)
{
AgentReward
errAgentReward
=
null
;
try
{
int
pageNo
=
1
;
int
total
=
0
;
int
totalPage
=
0
;
int
cnt
=
0
;
while
(
true
)
{
Page
<
AgentReward
>
page
=
new
Page
<
AgentReward
>(
pageNo
,
PAGE_SIZE
);
page
.
setOptimizeCountSql
(
false
);
IPage
<
AgentReward
>
ipage
;
if
(
runType
==
0
)
{
ipage
=
agentRewardService
.
selectOrderRewardPageByTs
(
page
,
beginTs
,
endTs
);
}
else
{
ipage
=
agentRewardService
.
selectOrderRewardPageByTsAndAgentId
(
page
,
beginTs
,
endTs
,
agentId
);
}
if
(
total
==
0
)
{
total
=
(
int
)
ipage
.
getTotal
();
totalPage
=
total
%
PAGE_SIZE
==
0
?
total
/
PAGE_SIZE
:
total
/
PAGE_SIZE
+
1
;
logger
.
info
(
"totalPage is {} "
,
totalPage
);
}
List
<
AgentReward
>
agentRewardList
=
ipage
.
getRecords
();
List
<
AgentReward
>
updateCommisionList
=
new
ArrayList
<
AgentReward
>();
List
<
AgentReward
>
update2FailedList
=
new
ArrayList
<
AgentReward
>();
if
(
agentRewardList
!=
null
&&
agentRewardList
.
size
()
>
0
)
{
/**
* 加载ordersActiveMap orderMap subOrderMap
*/
Set
<
OrderParam
>
orderParamsSet
=
generateOrderParamsSet
(
agentRewardList
);
Set
<
SubOrderParam
>
subOrderParamsSet
=
generateSubOrderParamsSet
(
agentRewardList
);
Map
<
OrderParam
,
OrdersActive
>
ordersActiveMap
=
generateOrdersActiveMap
(
orderParamsSet
);
Map
<
OrderParam
,
OrderTaobaoJdCommission
>
orderMap
=
generateOrderMap
(
orderParamsSet
);
Map
<
SubOrderParam
,
OrderTaobaoJdGoodsCommission
>
subOrderMap
=
generateSubOrderMap
(
subOrderParamsSet
);
/**
* 循环处理每条奖励
*/
for
(
AgentReward
agentReward
:
agentRewardList
)
{
try
{
errAgentReward
=
agentReward
;
/**
* 自购省奖励: reward_type: 300 或 750, settle_state > 0 且 != 300
* 需要根据订单号查找最终的真实的原始佣金 并 按比例快照重新计算奖励金额,
* 更新字段: all_money_ori cash commission_account
* 如果订单失效: 更新settle_state, all_money_ori/cash/commission_account 抹平, 跳过处理, 循环到下一条
*/
if
(
(
agentReward
.
getRewardType
()
==
Constants
.
AGENT_REWARD_TYPE_PURCHASE
||
agentReward
.
getRewardType
()
==
Constants
.
AGENT_REWARD_TYPE_SELF_ORDER
)
&&
agentReward
.
getSettleState
()
!=
Constants
.
SETTLE_STATE_DONE
)
{
if
(
isEmpty
(
agentReward
.
getOrderType
())
||
isEmpty
(
agentReward
.
getOrderSn
())
||
isEmpty
(
agentReward
.
getRatioAll
()))
{
/**
* 历史数据: 没有记录订单号 或者 没有记录比例 不更新奖励金额
*/
}
else
if
(
agentReward
.
getSettleState
()
<
0
)
{
add2UpdateReward2Failed
(
agentReward
,
update2FailedList
);
}
else
{
/**
* 有订单号 和 比例快照 可以更新金额
*/
OrderParam
orderParam
=
new
OrderParam
();
orderParam
.
setOrderType
(
agentReward
.
getOrderType
());
orderParam
.
setOrderSn
(
agentReward
.
getOrderSn
());
OrdersActive
ordersActive
=
ordersActiveMap
.
get
(
orderParam
);
OrderTaobaoJdCommission
order
=
orderMap
.
get
(
orderParam
);
if
(
null
==
ordersActive
||
null
==
order
)
{
/**
* 如果没有找到active 或者 没有找到commission
* 不更新奖励金额
*/
}
else
{
/**
* 订单状态只有三种: -3, 1, 3
*/
if
(
order
.
getStatus
()
==
Constants
.
ORDER_STATE_FAILED
)
{
/**
* 订单失效 订单付款 跳过, 处理下一条奖励
*/
add2UpdateReward2Failed
(
agentReward
,
update2FailedList
);
continue
;
}
else
if
(
order
.
getStatus
()
==
Constants
.
ORDER_STATE_PAID
)
{
/**
* 订单还是付款状态 更新奖励时间 下个月再处理
*/
long
newRechargeTime
=
DateUtils
.
getNextMonth1stTimestamp
(
agentReward
.
getRechargeTime
().
getTime
());
agentReward
.
setRechargeTime
(
new
Date
(
newRechargeTime
));
agentReward
.
setUpdatedAt
(
System
.
currentTimeMillis
()
/
1000L
);
agentRewardService
.
updateById
(
agentReward
);
continue
;
}
else
if
(
order
.
getStatus
()
==
Constants
.
ORDER_STATE_SETTLED
)
{
/**
* 订单结算 更新金额
*/
if
(
ordersActive
.
getIsForNew
()
==
1
)
{
/**
* 新人专享订单 不给合伙人奖励 跳过
*/
add2UpdateReward2Failed
(
agentReward
,
update2FailedList
);
continue
;
}
else
{
/**
* 正常订单 更新原始佣金
* all_money_ori: 原始佣金
* cash: all_money_ori 乘以 ratio_all中的每个比例
* commission_account: cash 乘以 commission_rate
*/
add2UpdateRewardCommission
(
agentReward
,
order
.
getAllMoney
(),
updateCommisionList
);
}
}
}
}
}
/**
* 分享赚订单: 按子订单号更新奖励金额 60 或 760
*/
if
(
(
agentReward
.
getRewardType
()
==
Constants
.
AGENT_REWARD_TYPE_SHARE
||
agentReward
.
getRewardType
()
==
Constants
.
AGENT_REWARD_TYPE_SHARE_ORDER
)
&&
agentReward
.
getSettleState
()
>
0
&&
agentReward
.
getSettleState
()
!=
Constants
.
SETTLE_STATE_DONE
)
{
if
(
isEmpty
(
agentReward
.
getOrderType
())
||
isEmpty
(
agentReward
.
getOrderSn
())
||
isEmpty
(
agentReward
.
getSubOrderSn
())
||
isEmpty
(
agentReward
.
getRatioAll
()))
{
/**
* 历史数据: 没有记录子订单号 或者 没有记录比例 不更新奖励金额
*/
}
else
if
(
agentReward
.
getSettleState
()
<
0
)
{
add2UpdateReward2Failed
(
agentReward
,
update2FailedList
);
}
else
{
/**
* 有订单号 和 比例快照 可以更新金额
*/
SubOrderParam
subOrderParam
=
new
SubOrderParam
();
subOrderParam
.
setOrderType
(
agentReward
.
getOrderType
());
subOrderParam
.
setOrderSn
(
agentReward
.
getOrderSn
());
subOrderParam
.
setSubOrderSn
(
agentReward
.
getSubOrderSn
());
OrderTaobaoJdGoodsCommission
subOrder
=
subOrderMap
.
get
(
subOrderParam
);
if
(
null
==
subOrder
)
{
/**
* 如果没有找到子订单
* 不更新奖励金额
*/
}
else
{
/**
* 订单状态只有三种: -3, 1, 3
*/
if
(
subOrder
.
getOrderState
()
==
Constants
.
ORDER_STATE_FAILED
)
{
/**
* 订单失效 订单付款 跳过, 处理下一条奖励
*/
add2UpdateReward2Failed
(
agentReward
,
update2FailedList
);
}
else
if
(
subOrder
.
getOrderState
()
==
Constants
.
ORDER_STATE_PAID
)
{
/**
* 订单还是付款状态 更新奖励时间 下个月再处理
*/
long
newRechargeTime
=
DateUtils
.
getNextMonth1stTimestamp
(
agentReward
.
getRechargeTime
().
getTime
());
agentReward
.
setRechargeTime
(
new
Date
(
newRechargeTime
));
agentReward
.
setUpdatedAt
(
System
.
currentTimeMillis
()
/
1000L
);
agentRewardService
.
updateById
(
agentReward
);
continue
;
}
else
if
(
subOrder
.
getOrderState
()
==
Constants
.
ORDER_STATE_SETTLED
)
{
/**
* 正常订单 更新原始佣金
* all_money_ori: 原始佣金
* cash: all_money_ori 乘以 ratio_all中的每个比例
* commission_account: cash 乘以 commission_rate
*/
add2UpdateRewardCommission
(
agentReward
,
subOrder
.
getAllMoney
(),
updateCommisionList
);
}
}
}
}
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
cnt
++;
}
}
if
(
updateCommisionList
.
size
()
>
0
)
{
agentRewardService
.
updateBatch
(
updateCommisionList
);
}
if
(
update2FailedList
.
size
()
>
0
)
{
agentRewardService
.
updateBatch
(
update2FailedList
);
}
if
(
pageNo
>=
totalPage
)
{
break
;
}
pageNo
++;
}
logger
.
info
(
"cnt is {}"
,
cnt
);
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
logger
.
error
(
"errAgentReward is {}"
,
errAgentReward
);
}
}
private
Map
<
SubOrderParam
,
OrderTaobaoJdGoodsCommission
>
generateSubOrderMap
(
Set
<
SubOrderParam
>
subOrderParamsSet
)
{
Map
<
SubOrderParam
,
OrderTaobaoJdGoodsCommission
>
map
=
new
HashMap
<
SubOrderParam
,
OrderTaobaoJdGoodsCommission
>();
List
<
OrderTaobaoJdGoodsCommission
>
list
=
orderTaobaoJdGoodsCommissionService
.
selectListBySubOrderParamsSet
(
subOrderParamsSet
);
for
(
OrderTaobaoJdGoodsCommission
subOrder
:
list
)
{
SubOrderParam
key
=
new
SubOrderParam
();
key
.
setOrderType
(
subOrder
.
getType
());
key
.
setOrderSn
(
subOrder
.
getOrderSn
());
key
.
setSubOrderSn
(
subOrder
.
getSubOrderSn
());
map
.
put
(
key
,
subOrder
);
}
return
map
;
}
private
Map
<
OrderParam
,
OrderTaobaoJdCommission
>
generateOrderMap
(
Set
<
OrderParam
>
orderParamsSet
)
{
Map
<
OrderParam
,
OrderTaobaoJdCommission
>
map
=
new
HashMap
<
OrderParam
,
OrderTaobaoJdCommission
>();
List
<
OrderTaobaoJdCommission
>
list
=
orderTaobaoJdCommissionService
.
selectListByOrderParamSet
(
orderParamsSet
);
for
(
OrderTaobaoJdCommission
order
:
list
)
{
OrderParam
key
=
new
OrderParam
();
key
.
setOrderType
(
order
.
getType
());
key
.
setOrderSn
(
order
.
getOrderSn
());
map
.
put
(
key
,
order
);
}
return
map
;
}
private
Map
<
OrderParam
,
OrdersActive
>
generateOrdersActiveMap
(
Set
<
OrderParam
>
orderParamSet
)
{
Map
<
OrderParam
,
OrdersActive
>
map
=
new
HashMap
<
OrderParam
,
OrdersActive
>();
List
<
OrdersActive
>
list
=
ordersActiveService
.
selectListByOrderParamSet
(
orderParamSet
);
for
(
OrdersActive
order
:
list
)
{
OrderParam
key
=
new
OrderParam
();
key
.
setOrderType
(
order
.
getType
());
key
.
setOrderSn
(
order
.
getOrderSn
());
map
.
put
(
key
,
order
);
}
return
map
;
}
private
Set
<
SubOrderParam
>
generateSubOrderParamsSet
(
List
<
AgentReward
>
agentRewardList
)
{
Set
<
SubOrderParam
>
set
=
new
HashSet
<
SubOrderParam
>();
for
(
AgentReward
reward
:
agentRewardList
)
{
SubOrderParam
orderParam
=
new
SubOrderParam
();
orderParam
.
setOrderType
(
reward
.
getOrderType
());
orderParam
.
setOrderSn
(
reward
.
getOrderSn
());
orderParam
.
setSubOrderSn
(
reward
.
getSubOrderSn
());
set
.
add
(
orderParam
);
}
return
set
;
}
private
Set
<
OrderParam
>
generateOrderParamsSet
(
List
<
AgentReward
>
agentRewardList
)
{
Set
<
OrderParam
>
set
=
new
HashSet
<
OrderParam
>();
for
(
AgentReward
reward
:
agentRewardList
)
{
OrderParam
orderParam
=
new
OrderParam
();
orderParam
.
setOrderType
(
reward
.
getOrderType
());
orderParam
.
setOrderSn
(
reward
.
getOrderSn
());
set
.
add
(
orderParam
);
}
return
set
;
}
private
void
add2UpdateRewardCommission
(
AgentReward
agentReward
,
BigDecimal
allMoney
,
List
<
AgentReward
>
updateCommisionList
)
{
try
{
agentReward
.
setAllMoneyOri
(
allMoney
);
String
ratioAllStr
=
agentReward
.
getRatioAll
().
replaceAll
(
"[\\[\\]\"]"
,
""
);
if
(!
isEmpty
(
ratioAllStr
))
{
String
[]
strs
=
ratioAllStr
.
split
(
","
);
if
(
strs
.
length
>
0
)
{
BigDecimal
cash
=
allMoney
;
for
(
String
s
:
strs
)
{
BigDecimal
ratio
=
new
BigDecimal
(
s
);
cash
=
cash
.
multiply
(
ratio
);
}
agentReward
.
setMoney
(
cash
);
agentReward
.
setCommissionAcount
(
cash
);
BigDecimal
commission
=
cash
.
multiply
(
agentReward
.
getCommissionRate
());
agentReward
.
setAmount
(
commission
);
agentReward
.
setCommission
(
commission
);
agentReward
.
setSettleState
(
Constants
.
SETTLE_STATE_DONE
);
agentReward
.
setUpdatedAt
(
System
.
currentTimeMillis
()
/
1000L
);
updateCommisionList
.
add
(
agentReward
);
}
}
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
}
/**
* money 面额(message里, 需要上供的代理商自己获得的奖励)
* commission_account 面额
* cash_code 支付金额
* amount 奖励金额
* commission 奖励金额
*/
private
void
add2UpdateReward2Failed
(
AgentReward
agentReward
,
List
<
AgentReward
>
update2FailedList
)
{
if
(
agentReward
.
getAmount
().
compareTo
(
BigDecimal
.
ZERO
)
>=
0
)
{
agentReward
.
setMoney
(
ZERO
);
agentReward
.
setCommissionAcount
(
ZERO
);
agentReward
.
setAmount
(
ZERO
);
agentReward
.
setCommission
(
ZERO
);
}
agentReward
.
setAllMoneyOri
(
ZERO
);
agentReward
.
setCashCode
(
"0"
);
agentReward
.
setSettleState
(
Constants
.
SETTLE_STATE_FAILED
);
agentReward
.
setUpdatedAt
(
System
.
currentTimeMillis
()
/
1000L
);
update2FailedList
.
add
(
agentReward
);
}
public
boolean
doOneAgentSettle
(
Integer
agentId
)
{
long
input
=
DateUtils
.
getLastMonth1stTimestamp
(
System
.
currentTimeMillis
());
long
beginTs
=
DateUtils
.
getMonth1stTimestamp
(
input
)
/
1000L
;
long
endTs
=
DateUtils
.
getMonthLastTimestamp
(
input
)
/
1000L
;
AgentSettle
errAgentSettle
=
null
;
try
{
updateOrderCommission
(
beginTs
,
endTs
,
1
,
agentId
);
AgentSettle
agentSettle
=
agentRewardService
.
selectAgentSettleByTsAndAgentId
(
beginTs
,
endTs
,
agentId
);
/**
* 更新税
*/
errAgentSettle
=
agentSettle
;
if
(
agentSettle
!=
null
)
{
updateTax
(
agentSettle
);
return
doDbUpdate
(
agentSettle
,
beginTs
,
endTs
);
}
else
{
logger
.
info
(
"没有待奖励记录 跳过不处理, 代理商{}"
,
agentId
);
return
true
;
}
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
logger
.
error
(
"agentId is {}, errAgentSettle is {}"
,
agentId
,
errAgentSettle
);
return
false
;
}
}
private
boolean
doDbUpdate
(
AgentSettle
agentSettle
,
long
beginTs
,
long
endTs
)
{
TransactionStatus
transactionStatus
=
null
;
try
{
logger
.
info
(
"agentSettle is {}"
,
agentSettle
);
/**
* 开启事务
*/
transactionStatus
=
dataSourceTransactionManager
.
getTransaction
(
transactionDefinition
);
/**
* 获取合伙人账户 锁定行
*/
AgentAccount
agentAccount
=
agentAccountService
.
getOneByUserIdForUpdate
(
agentSettle
.
getAgentId
());
/**
* 插入变更记录
*/
AgentSalary
agentSalary
=
insertAgentSalary
(
agentSettle
,
beginTs
);
insertIntoAgentAccountLog
(
agentSettle
,
agentAccount
,
agentSalary
,
beginTs
);
updateAgentAccount
(
agentSettle
,
agentAccount
);
updateAgentRewardStatus
(
agentSettle
.
getAgentId
(),
beginTs
,
endTs
);
insertAgentIncomeSummary
(
agentSettle
,
beginTs
,
endTs
);
/**
* 提交事务
*/
dataSourceTransactionManager
.
commit
(
transactionStatus
);
// dataSourceTransactionManager.rollback(transactionStatus);
return
true
;
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
/**
* 回滚事务
*/
if
(
transactionStatus
!=
null
)
{
logger
.
info
(
"do settle failed, rollback"
);
dataSourceTransactionManager
.
rollback
(
transactionStatus
);
}
return
false
;
}
}
private
AgentSalary
insertAgentSalary
(
AgentSettle
agentSettle
,
long
beginTs
)
{
Date
now
=
new
Date
(
beginTs
*
1000L
);
int
yeartime
=
Integer
.
parseInt
(
DateUtils
.
getYear
(
now
));
int
monthtime
=
Integer
.
parseInt
(
DateUtils
.
getMonth
(
now
));
AgentBankCard
agentBankCard
=
agentBankCardService
.
getOneByAgentId
(
agentSettle
.
getAgentId
());
AgentSalary
agentSalary
=
new
AgentSalary
();
agentSalary
.
setUserId
(
agentSettle
.
getUserId
());
agentSalary
.
setAgentId
(
agentSettle
.
getAgentId
());
agentSalary
.
setYeartime
(
yeartime
);
agentSalary
.
setMonthtime
(
monthtime
);
agentSalary
.
setMonth
(
DateUtils
.
format
(
now
,
"yyyy-MM"
));
agentSalary
.
setBalance
(
agentSettle
.
getBalance
());
agentSalary
.
setOpencardBalance
(
agentSettle
.
getOpencardBalance
());
agentSalary
.
setRechargeBalance
(
agentSettle
.
getRechargeBalance
());
agentSalary
.
setUpgradeBalance
(
agentSettle
.
getUpgradeBalance
());
agentSalary
.
setUpgradeSuperBalance
(
agentSettle
.
getUpgradeSuperBalance
());
agentSalary
.
setTaxBalance
(
agentSettle
.
getTax
());
agentSalary
.
setShareBalance
(
agentSettle
.
getShareBalance
());
agentSalary
.
setZigoushengBalance
(
agentSettle
.
getZigoushengBalance
());
agentSalary
.
setPingtuiBalance
(
agentSettle
.
getPingtuiBalance
());
agentSalary
.
setTechCharge
(
agentSettle
.
getTechCharge
());
agentSalary
.
setTechChargeRedpack
(
agentSettle
.
getTechChargeRedpack
());
agentSalary
.
setTechChargeOrder
(
agentSettle
.
getTechChargeOrder
());
agentSalary
.
setBankAccount
(
agentBankCard
==
null
?
""
:
agentBankCard
.
getBankAccount
());
agentSalary
.
setBankCardNumber
(
agentBankCard
==
null
?
""
:
agentBankCard
.
getBankCardNumber
());
agentSalary
.
setBankName
(
agentBankCard
==
null
?
""
:
agentBankCard
.
getBankName
());
agentSalary
.
setBranchName
(
agentBankCard
==
null
?
""
:
agentBankCard
.
getBranchName
());
agentSalary
.
setReferenceId
(
agentBankCard
==
null
?
0
:
agentBankCard
.
getId
());
agentSalary
.
setStatus
(
10
);
agentSalary
.
setCreateTime
(
now
);
agentSalary
.
setModifyTime
(
null
);
agentSalary
.
setCreatedAt
(
now
.
getTime
()
/
1000L
);
agentSalary
.
setUpdatedAt
(
now
.
getTime
()
/
1000L
);
agentSalaryService
.
insert
(
agentSalary
);
return
agentSalary
;
}
private
void
insertAgentIncomeSummary
(
AgentSettle
agentSettle
,
long
beginTs
,
long
endTs
)
{
Date
dat
=
new
Date
(
beginTs
*
1000L
);
int
now
=
(
int
)
(
System
.
currentTimeMillis
()
/
1000L
);
int
yeartime
=
Integer
.
parseInt
(
DateUtils
.
getYear
(
dat
));
int
monthtime
=
Integer
.
parseInt
(
DateUtils
.
getMonth
(
dat
));
AgentIncomeSummary
agentIncomeSummary
=
agentIncomeSummaryService
.
getOneByAgentidYearMonth
(
agentSettle
.
getAgentId
(),
yeartime
,
monthtime
);
/**
* 生成content字段
*/
AgentSummaryContent
agentSummaryContent
=
new
AgentSummaryContent
();
agentSummaryContent
.
setPlaceCash
(
agentSettle
.
getPlaceCash
().
setScale
(
2
,
RoundingMode
.
HALF_UP
));
agentSummaryContent
.
setPlaceNum
(
agentSettle
.
getPlaceNum
());
agentSummaryContent
.
setOnlinerechargeCash
(
agentSettle
.
getOnlinerechargeCash
().
setScale
(
2
,
RoundingMode
.
HALF_UP
));
agentSummaryContent
.
setOnlinerechargeNum
(
agentSettle
.
getOnlinerechargeNum
());
agentSummaryContent
.
setOpencardCash
(
agentSettle
.
getOpenCardCash
().
setScale
(
2
,
RoundingMode
.
HALF_UP
));
agentSummaryContent
.
setOpencardNum
(
agentSettle
.
getOpenCardNum
());
agentSummaryContent
.
setUpgradePartnerCash
(
agentSettle
.
getUpgradePartnerCash
().
setScale
(
2
,
RoundingMode
.
HALF_UP
));
agentSummaryContent
.
setUpgradePartnerNum
(
agentSettle
.
getUpgradePartnerNum
());
agentSummaryContent
.
setMarketPerformance
(
agentSettle
.
getMarketPerformance
().
setScale
(
2
,
RoundingMode
.
HALF_UP
));
agentSummaryContent
.
setUpgradeMarketCash
(
agentSettle
.
getUpgradeMarketCash
().
setScale
(
2
,
RoundingMode
.
HALF_UP
));
agentSummaryContent
.
setRechargeMarketCash
(
agentSettle
.
getRechargeMarketCash
().
setScale
(
2
,
RoundingMode
.
HALF_UP
));
Integer
expandUsers
=
agentExpandDailyService
.
getMonthCntByAgent
(
agentSettle
.
getAgentId
(),
beginTs
,
endTs
);
expandUsers
=
expandUsers
==
null
?
0
:
expandUsers
;
agentSummaryContent
.
setExpandUsers
(
expandUsers
);
/**
* 生成income字段
*/
BigDecimal
sum1
=
agentSettle
.
getBalance
();
BigDecimal
sum2
=
agentSettle
.
getPlaceCash
()
.
add
(
agentSettle
.
getOnlinerechargeCash
())
.
add
(
agentSettle
.
getOpenCardCash
())
.
add
(
agentSettle
.
getUpgradePartnerCash
());
if
(
sum1
.
compareTo
(
sum2
)
!=
0
)
{
logger
.
error
(
"代理商奖励结算-对账异常: 求和1:{}, 求和2:{}, 奖励字段:{}"
,
sum1
,
sum2
,
agentSettle
);
throw
new
RuntimeException
();
}
if
(
null
==
agentIncomeSummary
)
{
agentIncomeSummary
=
new
AgentIncomeSummary
();
agentIncomeSummary
.
setUserId
(
agentSettle
.
getUserId
());
agentIncomeSummary
.
setAgentId
(
agentSettle
.
getAgentId
());
agentIncomeSummary
.
setYeartime
(
yeartime
);
agentIncomeSummary
.
setMonthtime
(
monthtime
);
agentIncomeSummary
.
setState
(
20
);
agentIncomeSummary
.
setCreatedAt
(
now
);
agentIncomeSummary
.
setUpdatedAt
(
now
);
agentIncomeSummary
.
setSettleTime
(
now
);
agentIncomeSummary
.
setContent
(
JSON
.
toJSONString
(
agentSummaryContent
));
agentIncomeSummary
.
setIncome
(
sum2
);
agentIncomeSummaryService
.
save
(
agentIncomeSummary
);
}
else
{
agentIncomeSummary
.
setState
(
20
);
agentIncomeSummary
.
setSettleTime
(
now
);
agentIncomeSummary
.
setUpdatedAt
(
now
);
agentIncomeSummary
.
setContent
(
JSON
.
toJSONString
(
agentSummaryContent
));
agentIncomeSummary
.
setIncome
(
sum2
);
agentIncomeSummaryService
.
updateById
(
agentIncomeSummary
);
}
}
private
int
updateAgentRewardStatus
(
int
agentId
,
long
beginTs
,
long
endTs
)
{
return
agentRewardService
.
updateRewardStatusByUidAndTs
(
agentId
,
beginTs
,
endTs
);
}
private
void
updateAgentAccount
(
AgentSettle
agentSettle
,
AgentAccount
agentAccount
)
{
/**
* 更新合伙人账户金额
*/
agentAccount
.
setBalance
(
agentAccount
.
getBalance
()
.
add
(
agentSettle
.
getBalance
())
.
subtract
(
agentSettle
.
getTechCharge
())
.
subtract
(
agentSettle
.
getTax
())
);
agentAccountService
.
updateById
(
agentAccount
);
}
private
void
insertIntoAgentAccountLog
(
AgentSettle
agentSettle
,
AgentAccount
agentAccount
,
AgentSalary
agentSalary
,
long
beginTs
)
{
Date
dat
=
new
Date
(
beginTs
*
1000L
);
/**
* 月结发钱
*/
AgentSnapshot
snapshot
=
new
AgentSnapshot
();
snapshot
.
setAgentId
(
agentAccount
.
getAgentId
());
snapshot
.
setBalance
(
agentAccount
.
getBalance
());
BigDecimal
changeNum
=
agentSettle
.
getBalance
();
BigDecimal
changedAmount
=
agentAccount
.
getBalance
().
add
(
changeNum
);
AgentAccountLog
log
=
createNewAgentAccountLog
(
agentSettle
,
Constants
.
PARTNER_ACCOUNT_LOG_TYPE_SETTLE
,
changeNum
,
changedAmount
,
DateUtils
.
format
(
dat
,
"yyyy-MM"
)
+
Constants
.
PARTNER_ACCOUNT_LOG_TYPE_SETTLE_REMARK
,
snapshot
.
toString
(),
agentSalary
.
getId
());
agentAccountLogService
.
save
(
log
);
/**
* 平台技术服务费
*/
changeNum
=
agentSettle
.
getTechCharge
().
negate
();
changedAmount
=
changedAmount
.
add
(
changeNum
);
if
(
changeNum
.
compareTo
(
ZERO
)
<
0
)
{
log
=
createNewAgentAccountLog
(
agentSettle
,
Constants
.
PARTNER_ACCOUNT_LOG_TYPE_TECH_CHARGE
,
changeNum
,
changedAmount
,
DateUtils
.
format
(
dat
,
"yyyy-MM"
)
+
Constants
.
PARTNER_ACCOUNT_LOG_TYPE_TECH_CHARGE_REMARK
,
""
,
agentSalary
.
getId
());
agentAccountLogService
.
save
(
log
);
}
/**
* 个人所得税
*/
changeNum
=
agentSettle
.
getTax
().
negate
();
if
(
changeNum
.
compareTo
(
ZERO
)
<
0
)
{
changedAmount
=
changedAmount
.
add
(
changeNum
);
log
=
createNewAgentAccountLog
(
agentSettle
,
Constants
.
PARTNER_ACCOUNT_LOG_TYPE_TAX
,
changeNum
,
changedAmount
,
DateUtils
.
format
(
dat
,
"yyyy-MM"
)
+
Constants
.
PARTNER_ACCOUNT_LOG_TYPE_TAX_REMARK
,
""
,
agentSalary
.
getId
());
agentAccountLogService
.
save
(
log
);
}
}
private
AgentAccountLog
createNewAgentAccountLog
(
AgentSettle
agentSettle
,
int
type
,
BigDecimal
changeNum
,
BigDecimal
changedAmount
,
String
payRemark
,
String
snapshot
,
long
agentSalaryId
)
{
Date
now
=
new
Date
();
int
yeartime
=
Integer
.
parseInt
(
DateUtils
.
getYear
(
now
));
int
monthtime
=
Integer
.
parseInt
(
DateUtils
.
getMonth
(
now
));
int
daytime
=
Integer
.
parseInt
(
DateUtils
.
getDay
(
now
));
AgentAccountLog
log
=
new
AgentAccountLog
();
log
.
setUserId
(
agentSettle
.
getUserId
());
log
.
setAgentId
(
agentSettle
.
getAgentId
());
log
.
setType
(
type
);
log
.
setChangeNum
(
changeNum
);
log
.
setChangedAmount
(
changedAmount
);
log
.
setPayRemark
(
payRemark
);
log
.
setPayType
(
false
);
log
.
setYeartime
(
yeartime
);
log
.
setMonthtime
(
monthtime
);
log
.
setDaytime
(
daytime
);
log
.
setSnapshot
(
snapshot
);
log
.
setChangeTime
((
int
)(
now
.
getTime
()
/
1000
));
log
.
setPayState
(
20
);
log
.
setPayPlatform
(
"hupay"
);
log
.
setPayInfo
(
payRemark
);
log
.
setReferenceId
(
agentSalaryId
+
""
);
return
log
;
}
}
src/main/java/com/lanren/huhu/partner/schedule/PartnerSettleTask.java
deleted
100644 → 0
View file @
1a9bd326
package
com
.
lanren
.
huhu
.
partner
.
schedule
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.lanren.huhu.partner.constants.Constants
;
import
com.lanren.huhu.partner.domain.*
;
import
com.lanren.huhu.partner.model.*
;
import
com.lanren.huhu.partner.service.*
;
import
com.lanren.huhu.partner.util.DateUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.jdbc.datasource.DataSourceTransactionManager
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.stereotype.Component
;
import
org.springframework.transaction.TransactionDefinition
;
import
org.springframework.transaction.TransactionStatus
;
import
java.math.BigDecimal
;
import
java.math.RoundingMode
;
import
java.util.*
;
import
static
org
.
springframework
.
util
.
StringUtils
.
isEmpty
;
/**
* @author chen
* @title: PartnerSettleTask
* @projectName partner
* @description: 合伙人结算
* @package com.lanren.huhu.partner.schedule
* @date 2019-07-02 15:45
*/
@Component
public
class
PartnerSettleTask
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
PartnerSettleTask
.
class
);
private
static
final
int
PAGE_SIZE
=
1000
;
private
static
final
BigDecimal
ZERO
=
new
BigDecimal
(
0
);
@Autowired
PartnerRewardService
partnerRewardService
;
@Autowired
OrdersActiveService
ordersActiveService
;
@Autowired
OrderTaobaoJdCommissionService
orderTaobaoJdCommissionService
;
@Autowired
OrderTaobaoJdGoodsCommissionService
orderTaobaoJdGoodsCommissionService
;
@Autowired
DataSourceTransactionManager
dataSourceTransactionManager
;
@Autowired
TransactionDefinition
transactionDefinition
;
@Autowired
PartnerAccountService
partnerAccountService
;
@Autowired
PartnerAccountLogService
partnerAccountLogService
;
@Autowired
PartnerIncomeSummaryService
partnerIncomeSummaryService
;
@Async
public
void
runSettle
()
{
logger
.
info
(
"run PartnerSettleTask"
);
try
{
long
input
=
DateUtils
.
getLastMonth1stTimestamp
(
System
.
currentTimeMillis
());
long
beginTs
=
DateUtils
.
getMonth1stTimestamp
(
input
)
/
1000L
;
long
endTs
=
DateUtils
.
getMonthLastTimestamp
(
input
)
/
1000L
;
updateAll
(
beginTs
,
endTs
);
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
logger
.
info
(
"run PartnerSettleTask done"
);
}
private
void
updateAll
(
long
beginTs
,
long
endTs
)
{
updateOrderCommission
(
beginTs
,
endTs
,
0
,
0
);
doSettle
(
beginTs
,
endTs
);
}
public
boolean
doOneUserSettle
(
Integer
userId
)
{
long
input
=
DateUtils
.
getLastMonth1stTimestamp
(
System
.
currentTimeMillis
());
long
beginTs
=
DateUtils
.
getMonth1stTimestamp
(
input
)
/
1000L
;
long
endTs
=
DateUtils
.
getMonthLastTimestamp
(
input
)
/
1000L
;
PartnerSettle
errPartnerSettle
=
null
;
try
{
updateOrderCommission
(
beginTs
,
endTs
,
1
,
userId
);
PartnerSettle
partnerSettle
=
partnerRewardService
.
selectPartnerSettleByTsAndUid
(
beginTs
,
endTs
,
userId
);
errPartnerSettle
=
partnerSettle
;
if
(
partnerSettle
!=
null
&&
setIncomeAndTax
(
partnerSettle
))
{
logger
.
info
(
"partner settle is {}"
,
partnerSettle
.
toString
());
return
doDbUpdate
(
partnerSettle
,
beginTs
,
endTs
);
}
else
{
logger
.
info
(
"没有待奖励记录 跳过不处理, 用户{}"
,
userId
);
return
true
;
}
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
logger
.
error
(
"userId is {}, errPartnerSettle is {}"
,
userId
,
errPartnerSettle
);
return
false
;
}
}
/**
* 使用mybatisplus分页插件时需要注意:
* !!! 如果取出每一页的数据后, 在处理时更改了分页查询的一些字段, 那么后面翻页的时候 查出来的数据就会错乱了
* !!! 要么就是 在循环的时候不更新用于查询的字段
* !!! 要么就是 永远都只取第一页, 直到取不到数据
*/
private
void
doSettle
(
long
beginTs
,
long
endTs
)
{
PartnerSettle
errPartnerSettle
=
null
;
try
{
int
cnt
=
0
;
while
(
true
)
{
int
pageNo
=
1
;
Page
<
PartnerSettle
>
page
=
new
Page
<
PartnerSettle
>(
pageNo
,
PAGE_SIZE
);
page
.
setOptimizeCountSql
(
false
);
page
.
setSearchCount
(
false
);
IPage
<
PartnerSettle
>
ipage
=
partnerRewardService
.
selectPartnerSettlePageByTs
(
page
,
beginTs
,
endTs
);
List
<
PartnerSettle
>
partnerSettleList
=
ipage
.
getRecords
();
if
(
partnerSettleList
!=
null
&&
partnerSettleList
.
size
()
>
0
)
{
for
(
PartnerSettle
partnerSettle
:
partnerSettleList
)
{
try
{
errPartnerSettle
=
partnerSettle
;
if
(
partnerSettle
!=
null
&&
setIncomeAndTax
(
partnerSettle
))
{
if
(!
doDbUpdate
(
partnerSettle
,
beginTs
,
endTs
))
{
logger
.
error
(
"doDbUpdate failed for user {}"
,
partnerSettle
.
getUserId
());
}
}
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
cnt
++;
}
}
else
{
break
;
}
}
logger
.
info
(
"cnt is {}"
,
cnt
);
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
logger
.
error
(
"errPartnerSettle is {}"
,
errPartnerSettle
);
}
}
private
boolean
doDbUpdate
(
PartnerSettle
partnerSettle
,
long
beginTs
,
long
endTs
)
{
TransactionStatus
transactionStatus
=
null
;
try
{
logger
.
info
(
"partnerSettle is {}"
,
partnerSettle
);
/**
* 开启事务
*/
transactionStatus
=
dataSourceTransactionManager
.
getTransaction
(
transactionDefinition
);
/**
* 获取合伙人账户 锁定行
*/
PartnerAccount
partnerAccount
=
partnerAccountService
.
getOneByUserIdForUpdate
(
partnerSettle
.
getUserId
());
/**
* 插入变更记录
*/
insertIntoPartnerAccountLog
(
partnerSettle
,
partnerAccount
,
beginTs
);
updatePartnerAccount
(
partnerSettle
,
partnerAccount
);
updatePartnerRewardStatus
(
partnerSettle
.
getUserId
(),
beginTs
,
endTs
);
insertPartnerIncomeSummary
(
partnerSettle
,
partnerAccount
,
beginTs
);
/**
* 提交事务
*/
dataSourceTransactionManager
.
commit
(
transactionStatus
);
// dataSourceTransactionManager.rollback(transactionStatus);
return
true
;
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
/**
* 回滚事务
*/
if
(
transactionStatus
!=
null
)
{
logger
.
info
(
"do settle failed, rollback"
);
dataSourceTransactionManager
.
rollback
(
transactionStatus
);
}
return
false
;
}
}
private
void
insertPartnerIncomeSummary
(
PartnerSettle
partnerSettle
,
PartnerAccount
partnerAccount
,
long
beginTs
)
{
Date
dat
=
new
Date
(
beginTs
*
1000L
);
int
now
=
(
int
)
(
System
.
currentTimeMillis
()
/
1000L
);
int
yeartime
=
Integer
.
parseInt
(
DateUtils
.
getYear
(
dat
));
int
monthtime
=
Integer
.
parseInt
(
DateUtils
.
getMonth
(
dat
));
PartnerIncomeSummary
partnerIncomeSummary
=
partnerIncomeSummaryService
.
getOneByUidYearMonth
(
partnerSettle
.
getUserId
(),
yeartime
,
monthtime
);
/**
* 生成content字段
*/
PartnerSummaryContent
partnerSummaryContent
=
new
PartnerSummaryContent
();
partnerSummaryContent
.
setCash
(
partnerSettle
.
getCash
().
setScale
(
2
,
RoundingMode
.
HALF_UP
));
partnerSummaryContent
.
setUpCash
(
partnerSettle
.
getUpCash
().
setScale
(
2
,
RoundingMode
.
HALF_UP
));
partnerSummaryContent
.
setIcash
(
partnerSettle
.
getIcash
().
setScale
(
2
,
RoundingMode
.
HALF_UP
));
partnerSummaryContent
.
setPcash
(
partnerSettle
.
getPcash
().
setScale
(
2
,
RoundingMode
.
HALF_UP
));
partnerSummaryContent
.
setScash
(
partnerSettle
.
getScash
().
setScale
(
2
,
RoundingMode
.
HALF_UP
));
partnerSummaryContent
.
setRcash
(
partnerSettle
.
getRcash
().
setScale
(
2
,
RoundingMode
.
HALF_UP
));
partnerSummaryContent
.
setTechChargeOrder
(
partnerSettle
.
getTechChargeOrder
());
partnerSummaryContent
.
setTechChargeRedpack
(
partnerSettle
.
getTechChargeRedpack
());
partnerSummaryContent
.
setWxIncome
(
partnerSettle
.
getWxIncome
());
partnerSummaryContent
.
setWxTax
(
partnerSettle
.
getWxTax
());
partnerSummaryContent
.
setBankIncome
(
partnerSettle
.
getBankIncome
());
partnerSummaryContent
.
setBankTax
(
partnerSettle
.
getBankTax
());
partnerSummaryContent
.
setWxFreeBalance
(
partnerAccount
.
getWxFreeBalance
());
partnerSummaryContent
.
setBankFreeBalance
(
partnerAccount
.
getBankFreeBalance
());
partnerSummaryContent
.
setSumOrderCommission
(
partnerSettle
.
getSumOrderCommission
());
partnerSummaryContent
.
setSumRedpack
(
partnerSettle
.
getSumRedpack
());
partnerSummaryContent
.
setSumOthers
(
partnerSettle
.
getSumOthers
());
/**
* 生成income字段
*/
BigDecimal
sum1
=
partnerSettle
.
getCash
()
.
add
(
partnerSettle
.
getUpCash
())
.
add
(
partnerSettle
.
getIcash
())
.
add
(
partnerSettle
.
getPcash
())
.
add
(
partnerSettle
.
getScash
())
.
add
(
partnerSettle
.
getRcash
());
BigDecimal
sum2
=
partnerSettle
.
getSumOrderCommission
()
.
add
(
partnerSettle
.
getSumRedpack
())
.
add
(
partnerSettle
.
getSumOthers
())
.
add
(
partnerSettle
.
getTechChargeOrder
())
.
add
(
partnerSettle
.
getTechChargeRedpack
());
if
(
sum1
.
compareTo
(
sum2
)
!=
0
)
{
logger
.
error
(
"合伙人奖励结算-对账异常: 求和1:{}, 求和2:{}, 奖励字段:{}"
,
sum1
,
sum2
,
partnerSettle
);
}
if
(
null
==
partnerIncomeSummary
)
{
partnerIncomeSummary
=
new
PartnerIncomeSummary
();
partnerIncomeSummary
.
setUserId
(
partnerSettle
.
getUserId
());
partnerIncomeSummary
.
setYeartime
(
yeartime
);
partnerIncomeSummary
.
setMonthtime
(
monthtime
);
partnerIncomeSummary
.
setState
(
20
);
partnerIncomeSummary
.
setCreatedAt
(
now
);
partnerIncomeSummary
.
setUpdatedAt
(
now
);
partnerIncomeSummary
.
setSettleTime
(
now
);
partnerIncomeSummary
.
setContent
(
JSON
.
toJSONString
(
partnerSummaryContent
));
partnerIncomeSummary
.
setIncome
(
sum2
);
partnerIncomeSummaryService
.
save
(
partnerIncomeSummary
);
}
else
{
partnerIncomeSummary
.
setState
(
20
);
partnerIncomeSummary
.
setUpdatedAt
(
now
);
partnerIncomeSummary
.
setSettleTime
(
now
);
partnerIncomeSummary
.
setContent
(
JSON
.
toJSONString
(
partnerSummaryContent
));
partnerIncomeSummary
.
setIncome
(
sum2
);
partnerIncomeSummaryService
.
updateById
(
partnerIncomeSummary
);
}
}
private
int
updatePartnerRewardStatus
(
int
userId
,
long
beginTs
,
long
endTs
)
{
return
partnerRewardService
.
updateRewardStatusByUidAndTs
(
userId
,
beginTs
,
endTs
);
}
private
void
updatePartnerAccount
(
PartnerSettle
partnerSettle
,
PartnerAccount
partnerAccount
)
{
/**
* 更新合伙人账户金额
*/
BigDecimal
wxIncomeAdd
=
partnerSettle
.
getWxIncome
();
BigDecimal
bankIncomeAdd
=
partnerSettle
.
getBankIncome
();
partnerAccount
.
setAllIncome
(
partnerAccount
.
getAllIncome
().
add
(
wxIncomeAdd
).
add
(
bankIncomeAdd
));
partnerAccount
.
setIncomeAfterTax
(
partnerAccount
.
getIncomeAfterTax
().
add
(
wxIncomeAdd
).
add
(
bankIncomeAdd
));
partnerAccount
.
setWxFreeBalance
(
partnerAccount
.
getWxFreeBalance
().
add
(
wxIncomeAdd
));
partnerAccount
.
setBankFreeBalance
(
partnerAccount
.
getBankFreeBalance
().
add
(
bankIncomeAdd
));
partnerAccountService
.
updateById
(
partnerAccount
);
}
private
void
insertIntoPartnerAccountLog
(
PartnerSettle
partnerSettle
,
PartnerAccount
partnerAccount
,
long
beginTs
)
{
Date
dat
=
new
Date
(
beginTs
*
1000L
);
/**
* 月结发钱
*/
BigDecimal
changeNum
=
partnerSettle
.
getSumOrderCommission
()
.
add
(
partnerSettle
.
getSumRedpack
())
.
add
(
partnerSettle
.
getSumOthers
())
.
add
(
partnerSettle
.
getTechChargeRedpack
())
.
add
(
partnerSettle
.
getTechChargeOrder
());
BigDecimal
changedAmount
=
partnerAccount
.
getWxFreeBalance
().
add
(
partnerAccount
.
getBankFreeBalance
()).
add
(
changeNum
);
PartnerSnapshot
snapshot
=
new
PartnerSnapshot
();
snapshot
.
setUserId
(
partnerAccount
.
getUserId
());
snapshot
.
setWxFreeBalance
(
partnerAccount
.
getWxFreeBalance
());
snapshot
.
setBankFreeBalance
(
partnerAccount
.
getBankFreeBalance
());
PartnerAccountLog
log
=
createNewPartnerAccountLog
(
partnerSettle
.
getUserId
(),
Constants
.
PARTNER_ACCOUNT_LOG_TYPE_SETTLE
,
changeNum
,
changedAmount
,
DateUtils
.
format
(
dat
,
"yyyy-MM"
)
+
Constants
.
PARTNER_ACCOUNT_LOG_TYPE_SETTLE_REMARK
,
snapshot
.
toString
());
partnerAccountLogService
.
save
(
log
);
/**
* 平台技术服务费
*/
changeNum
=
partnerSettle
.
getTechChargeRedpack
()
.
add
(
partnerSettle
.
getTechChargeOrder
())
.
negate
();
changedAmount
=
changedAmount
.
add
(
changeNum
);
if
(
changeNum
.
compareTo
(
ZERO
)
<
0
)
{
log
=
createNewPartnerAccountLog
(
partnerSettle
.
getUserId
(),
Constants
.
PARTNER_ACCOUNT_LOG_TYPE_TECH_CHARGE
,
changeNum
,
changedAmount
,
DateUtils
.
format
(
dat
,
"yyyy-MM"
)
+
Constants
.
PARTNER_ACCOUNT_LOG_TYPE_TECH_CHARGE_REMARK
,
""
);
partnerAccountLogService
.
save
(
log
);
}
/**
* 个人所得税
*/
changeNum
=
partnerSettle
.
getWxTax
().
add
(
partnerSettle
.
getBankTax
()).
negate
();
changedAmount
=
changedAmount
.
add
(
changeNum
);
snapshot
.
setWxFreeBalance
(
snapshot
.
getWxFreeBalance
().
add
(
partnerSettle
.
getWxIncome
()).
add
(
partnerSettle
.
getWxTax
()));
snapshot
.
setBankFreeBalance
(
snapshot
.
getBankFreeBalance
().
add
(
partnerSettle
.
getBankIncome
()).
add
(
partnerSettle
.
getBankTax
()));
if
(
changeNum
.
compareTo
(
ZERO
)
<
0
)
{
log
=
createNewPartnerAccountLog
(
partnerSettle
.
getUserId
(),
Constants
.
PARTNER_ACCOUNT_LOG_TYPE_TAX
,
changeNum
,
changedAmount
,
DateUtils
.
format
(
dat
,
"yyyy-MM"
)
+
Constants
.
PARTNER_ACCOUNT_LOG_TYPE_TAX_REMARK
,
snapshot
.
toString
());
partnerAccountLogService
.
save
(
log
);
}
}
private
PartnerAccountLog
createNewPartnerAccountLog
(
int
userId
,
int
type
,
BigDecimal
changeNum
,
BigDecimal
changedAmount
,
String
payRemark
,
String
snapshot
)
{
Date
now
=
new
Date
();
int
yeartime
=
Integer
.
parseInt
(
DateUtils
.
getYear
(
now
));
int
monthtime
=
Integer
.
parseInt
(
DateUtils
.
getMonth
(
now
));
int
daytime
=
Integer
.
parseInt
(
DateUtils
.
getDay
(
now
));
PartnerAccountLog
log
=
new
PartnerAccountLog
();
log
.
setUserId
(
userId
);
log
.
setType
(
type
);
log
.
setChangeNum
(
changeNum
);
log
.
setChangedAmount
(
changedAmount
);
log
.
setPayRemark
(
payRemark
);
log
.
setPayType
(
false
);
log
.
setYeartime
(
yeartime
);
log
.
setMonthtime
(
monthtime
);
log
.
setDaytime
(
daytime
);
log
.
setSnapshot
(
snapshot
.
toString
());
log
.
setPayState
(
20
);
log
.
setPayPlatform
(
"hupay"
);
log
.
setPayInfo
(
payRemark
);
log
.
setChangeTime
((
int
)
(
now
.
getTime
()
/
1000L
));
return
log
;
}
private
void
add2UpdateRewardCommission
(
PartnerReward
partnerReward
,
BigDecimal
allMoney
,
List
<
PartnerReward
>
updateCommisionList
)
{
try
{
partnerReward
.
setAllMoneyOri
(
allMoney
);
String
ratioAllStr
=
partnerReward
.
getRatioAll
().
replaceAll
(
"[\\[\\]\"]"
,
""
);
if
(!
isEmpty
(
ratioAllStr
))
{
String
[]
strs
=
ratioAllStr
.
split
(
","
);
if
(
strs
.
length
>
0
)
{
BigDecimal
cash
=
allMoney
;
for
(
String
s
:
strs
)
{
BigDecimal
ratio
=
new
BigDecimal
(
s
);
cash
=
cash
.
multiply
(
ratio
);
}
partnerReward
.
setCash
(
cash
);
BigDecimal
commission
=
cash
.
multiply
(
partnerReward
.
getCommissionRate
());
partnerReward
.
setCommissionAcount
(
commission
);
partnerReward
.
setSettleState
(
Constants
.
SETTLE_STATE_DONE
);
partnerReward
.
setUpdatedAt
(
System
.
currentTimeMillis
()
/
1000L
);
// partnerRewardService.updateById(partnerReward);
updateCommisionList
.
add
(
partnerReward
);
}
}
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
logger
.
error
(
"partnerReward id is {}"
,
partnerReward
.
getId
());
}
}
/**
* 更新至 失效, 结算完成
* 不再参与后续结算计算
* @param partnerReward
*/
private
void
add2UpdateReward2Failed
(
PartnerReward
partnerReward
,
List
<
PartnerReward
>
update2FailedList
)
{
if
(
partnerReward
.
getCommissionAcount
().
compareTo
(
BigDecimal
.
ZERO
)
>=
0
)
{
partnerReward
.
setCommissionAcount
(
ZERO
);
}
partnerReward
.
setAllMoneyOri
(
ZERO
);
partnerReward
.
setCash
(
ZERO
);
partnerReward
.
setSettleState
(
Constants
.
SETTLE_STATE_FAILED
);
partnerReward
.
setUpdatedAt
(
System
.
currentTimeMillis
()
/
1000L
);
// partnerRewardService.updateById(partnerReward);
update2FailedList
.
add
(
partnerReward
);
}
/**
* 自购省和分享赚的奖励金额 需要根据最终的实际原始佣金 重新计算
* @param beginTs
* @param endTs
*/
private
void
updateOrderCommission
(
long
beginTs
,
long
endTs
,
int
runType
,
int
userId
)
{
PartnerReward
errPartnerReward
=
null
;
try
{
int
pageNo
=
1
;
int
total
=
0
;
int
totalPage
=
0
;
int
cnt
=
0
;
while
(
true
)
{
Page
<
PartnerReward
>
page
=
new
Page
<
PartnerReward
>(
pageNo
,
PAGE_SIZE
);
page
.
setOptimizeCountSql
(
false
);
IPage
<
PartnerReward
>
ipage
;
if
(
runType
==
0
)
{
ipage
=
partnerRewardService
.
selectOrderRewardPageByTs
(
page
,
beginTs
,
endTs
);
}
else
{
ipage
=
partnerRewardService
.
selectOrderRewardPageByTsAndUid
(
page
,
beginTs
,
endTs
,
userId
);
}
if
(
total
==
0
)
{
total
=
(
int
)
ipage
.
getTotal
();
totalPage
=
total
%
PAGE_SIZE
==
0
?
total
/
PAGE_SIZE
:
total
/
PAGE_SIZE
+
1
;
logger
.
info
(
"totalPage is {} "
,
totalPage
);
}
List
<
PartnerReward
>
partnerRewardList
=
ipage
.
getRecords
();
List
<
PartnerReward
>
updateCommisionList
=
new
ArrayList
<
PartnerReward
>();
List
<
PartnerReward
>
update2FailedList
=
new
ArrayList
<
PartnerReward
>();
if
(
partnerRewardList
!=
null
&&
partnerRewardList
.
size
()
>
0
)
{
/**
* 加载ordersActiveMap orderMap subOrderMap
*/
Set
<
OrderParam
>
orderParamsList
=
generateOrderParamsSet
(
partnerRewardList
);
Set
<
SubOrderParam
>
subOrderParamsList
=
generateSubOrderParamsSet
(
partnerRewardList
);
Map
<
OrderParam
,
OrdersActive
>
ordersActiveMap
=
generateOrdersActiveMap
(
orderParamsList
);
Map
<
OrderParam
,
OrderTaobaoJdCommission
>
orderMap
=
generateOrderMap
(
orderParamsList
);
Map
<
SubOrderParam
,
OrderTaobaoJdGoodsCommission
>
subOrderMap
=
generateSubOrderMap
(
subOrderParamsList
);
/**
* 循环处理每条奖励
*/
for
(
PartnerReward
partnerReward
:
partnerRewardList
)
{
try
{
errPartnerReward
=
partnerReward
;
/**
* 购物奖励: reward_type: 110, settle_state > 0 且 != 300
* 需要根据订单号查找最终的真实的原始佣金 并 按比例快照重新计算奖励金额,
* 更新字段: all_money_ori cash commission_account
* 如果订单失效: 更新settle_state, all_money_ori/cash/commission_account 抹平, 跳过处理, 循环到下一条
*/
if
(
partnerReward
.
getRewardType
()
==
Constants
.
PARTNER_REWARD_TYPE_PURCHASE
&&
partnerReward
.
getSettleState
()
>
0
&&
partnerReward
.
getSettleState
()
!=
Constants
.
SETTLE_STATE_DONE
)
{
if
(
isEmpty
(
partnerReward
.
getOrderType
())
||
isEmpty
(
partnerReward
.
getOrderSn
())
||
isEmpty
(
partnerReward
.
getRatioAll
()))
{
/**
* 历史数据: 没有记录订单号 或者 没有记录比例 不更新奖励金额
*/
}
else
if
(
partnerReward
.
getSettleState
()
<
0
)
{
add2UpdateReward2Failed
(
partnerReward
,
update2FailedList
);
}
else
{
/**
* 有订单号 和 比例快照 可以更新金额
*/
// OrdersActive ordersActive = ordersActiveService.getOneByOrderSn(partnerReward.getOrderType(), partnerReward.getOrderSn());
// OrderTaobaoJdCommission order = orderTaobaoJdCommissionService.getOneByOrderSn(partnerReward.getOrderType(), partnerReward.getOrderSn());
OrderParam
orderParam
=
new
OrderParam
();
orderParam
.
setOrderType
(
partnerReward
.
getOrderType
());
orderParam
.
setOrderSn
(
partnerReward
.
getOrderSn
());
OrdersActive
ordersActive
=
ordersActiveMap
.
get
(
orderParam
);
OrderTaobaoJdCommission
order
=
orderMap
.
get
(
orderParam
);
if
(
null
==
ordersActive
||
null
==
order
)
{
/**
* 如果没有找到active 或者 没有找到commission
* 不更新奖励金额
*/
}
else
{
/**
* 订单状态只有三种: -3, 1, 3
*/
if
(
order
.
getStatus
()
==
Constants
.
ORDER_STATE_FAILED
)
{
/**
* 订单失效 订单付款 跳过, 处理下一条奖励
*/
add2UpdateReward2Failed
(
partnerReward
,
update2FailedList
);
continue
;
}
else
if
(
order
.
getStatus
()
==
Constants
.
ORDER_STATE_PAID
)
{
/**
* 订单还是付款状态 更新奖励时间 下个月再处理
*/
long
newRechargeTime
=
DateUtils
.
getNextMonth1stTimestamp
(
partnerReward
.
getRechargeTime
().
getTime
());
partnerReward
.
setRechargeTime
(
new
Date
(
newRechargeTime
));
partnerReward
.
setUpdatedAt
(
System
.
currentTimeMillis
()
/
1000L
);
partnerRewardService
.
updateById
(
partnerReward
);
continue
;
}
else
if
(
order
.
getStatus
()
==
Constants
.
ORDER_STATE_SETTLED
)
{
/**
* 订单结算 更新金额
*/
if
(
ordersActive
.
getIsForNew
()
==
1
)
{
/**
* 新人专享订单 不给合伙人奖励 跳过
*/
add2UpdateReward2Failed
(
partnerReward
,
update2FailedList
);
continue
;
}
else
{
/**
* 正常订单 更新原始佣金
* all_money_ori: 原始佣金
* cash: all_money_ori 乘以 ratio_all中的每个比例
* commission_account: cash 乘以 commission_rate
*/
add2UpdateRewardCommission
(
partnerReward
,
order
.
getAllMoney
(),
updateCommisionList
);
}
}
}
}
}
/**
* 分享赚订单: 按子订单号更新奖励金额
*/
if
(
partnerReward
.
getRewardType
()
==
Constants
.
PARTNER_REWARD_TYPE_SHARE
&&
partnerReward
.
getSettleState
()
>
0
&&
partnerReward
.
getSettleState
()
!=
Constants
.
SETTLE_STATE_DONE
)
{
if
(
isEmpty
(
partnerReward
.
getOrderType
())
||
isEmpty
(
partnerReward
.
getOrderSn
())
||
isEmpty
(
partnerReward
.
getSubOrderSn
())
||
isEmpty
(
partnerReward
.
getRatioAll
()))
{
/**
* 历史数据: 没有记录子订单号 或者 没有记录比例 不更新奖励金额
*/
}
else
if
(
partnerReward
.
getSettleState
()
<
0
)
{
add2UpdateReward2Failed
(
partnerReward
,
update2FailedList
);
}
else
{
/**
* 有订单号 和 比例快照 可以更新金额
*/
// OrderTaobaoJdGoodsCommission subOrder = orderTaobaoJdGoodsCommissionService.getOneByOrderSn(partnerReward.getOrderType(), partnerReward.getOrderSn(), partnerReward.getSubOrderSn());
SubOrderParam
subOrderParam
=
new
SubOrderParam
();
subOrderParam
.
setOrderType
(
partnerReward
.
getOrderType
());
subOrderParam
.
setOrderSn
(
partnerReward
.
getOrderSn
());
subOrderParam
.
setSubOrderSn
(
partnerReward
.
getSubOrderSn
());
OrderTaobaoJdGoodsCommission
subOrder
=
subOrderMap
.
get
(
subOrderParam
);
if
(
null
==
subOrder
)
{
/**
* 如果没有找到子订单
* 不更新奖励金额
*/
}
else
{
/**
* 订单状态只有三种: -3, 1, 3
*/
if
(
subOrder
.
getOrderState
()
==
Constants
.
ORDER_STATE_FAILED
)
{
/**
* 订单失效 订单付款 跳过, 处理下一条奖励
*/
add2UpdateReward2Failed
(
partnerReward
,
update2FailedList
);
}
else
if
(
subOrder
.
getOrderState
()
==
Constants
.
ORDER_STATE_PAID
)
{
/**
* 订单还是付款状态 更新奖励时间 下个月再处理
*/
long
newRechargeTime
=
DateUtils
.
getNextMonth1stTimestamp
(
partnerReward
.
getRechargeTime
().
getTime
());
partnerReward
.
setRechargeTime
(
new
Date
(
newRechargeTime
));
partnerReward
.
setUpdatedAt
(
System
.
currentTimeMillis
()
/
1000L
);
partnerRewardService
.
updateById
(
partnerReward
);
continue
;
}
else
if
(
subOrder
.
getOrderState
()
==
Constants
.
ORDER_STATE_SETTLED
)
{
/**
* 正常订单 更新原始佣金
* all_money_ori: 原始佣金
* cash: all_money_ori 乘以 ratio_all中的每个比例
* commission_account: cash 乘以 commission_rate
*/
add2UpdateRewardCommission
(
partnerReward
,
subOrder
.
getAllMoney
(),
updateCommisionList
);
}
}
}
}
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
cnt
++;
}
}
if
(
updateCommisionList
.
size
()
>
0
)
{
partnerRewardService
.
updateBatch
(
updateCommisionList
);
}
if
(
update2FailedList
.
size
()
>
0
)
{
partnerRewardService
.
updateBatch
(
update2FailedList
);
}
if
(
pageNo
>=
totalPage
)
{
break
;
}
pageNo
++;
}
logger
.
info
(
"cnt is {}"
,
cnt
);
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
logger
.
error
(
"errPartnerReward is {}"
,
errPartnerReward
);
}
}
private
Set
<
OrderParam
>
generateOrderParamsSet
(
List
<
PartnerReward
>
partnerRewardList
)
{
Set
<
OrderParam
>
set
=
new
HashSet
<
OrderParam
>();
for
(
PartnerReward
reward
:
partnerRewardList
)
{
OrderParam
orderParam
=
new
OrderParam
();
orderParam
.
setOrderType
(
reward
.
getOrderType
());
orderParam
.
setOrderSn
(
reward
.
getOrderSn
());
set
.
add
(
orderParam
);
}
return
set
;
}
private
Set
<
SubOrderParam
>
generateSubOrderParamsSet
(
List
<
PartnerReward
>
partnerRewardList
)
{
Set
<
SubOrderParam
>
set
=
new
HashSet
<
SubOrderParam
>();
for
(
PartnerReward
reward
:
partnerRewardList
)
{
SubOrderParam
orderParam
=
new
SubOrderParam
();
orderParam
.
setOrderType
(
reward
.
getOrderType
());
orderParam
.
setOrderSn
(
reward
.
getOrderSn
());
orderParam
.
setSubOrderSn
(
reward
.
getSubOrderSn
());
set
.
add
(
orderParam
);
}
return
set
;
}
private
Map
<
SubOrderParam
,
OrderTaobaoJdGoodsCommission
>
generateSubOrderMap
(
Set
<
SubOrderParam
>
subOrderParamsSet
)
{
Map
<
SubOrderParam
,
OrderTaobaoJdGoodsCommission
>
map
=
new
HashMap
<
SubOrderParam
,
OrderTaobaoJdGoodsCommission
>();
List
<
OrderTaobaoJdGoodsCommission
>
list
=
orderTaobaoJdGoodsCommissionService
.
selectListBySubOrderParamsSet
(
subOrderParamsSet
);
for
(
OrderTaobaoJdGoodsCommission
subOrder
:
list
)
{
SubOrderParam
key
=
new
SubOrderParam
();
key
.
setOrderType
(
subOrder
.
getType
());
key
.
setOrderSn
(
subOrder
.
getOrderSn
());
key
.
setSubOrderSn
(
subOrder
.
getSubOrderSn
());
map
.
put
(
key
,
subOrder
);
}
return
map
;
}
private
Map
<
OrderParam
,
OrderTaobaoJdCommission
>
generateOrderMap
(
Set
<
OrderParam
>
orderParamSet
)
{
Map
<
OrderParam
,
OrderTaobaoJdCommission
>
map
=
new
HashMap
<
OrderParam
,
OrderTaobaoJdCommission
>();
List
<
OrderTaobaoJdCommission
>
list
=
orderTaobaoJdCommissionService
.
selectListByOrderParamSet
(
orderParamSet
);
for
(
OrderTaobaoJdCommission
order
:
list
)
{
OrderParam
key
=
new
OrderParam
();
key
.
setOrderType
(
order
.
getType
());
key
.
setOrderSn
(
order
.
getOrderSn
());
map
.
put
(
key
,
order
);
}
return
map
;
}
private
Map
<
OrderParam
,
OrdersActive
>
generateOrdersActiveMap
(
Set
<
OrderParam
>
orderParamSet
)
{
Map
<
OrderParam
,
OrdersActive
>
map
=
new
HashMap
<
OrderParam
,
OrdersActive
>();
List
<
OrdersActive
>
list
=
ordersActiveService
.
selectListByOrderParamSet
(
orderParamSet
);
for
(
OrdersActive
order
:
list
)
{
OrderParam
key
=
new
OrderParam
();
key
.
setOrderType
(
order
.
getType
());
key
.
setOrderSn
(
order
.
getOrderSn
());
map
.
put
(
key
,
order
);
}
return
map
;
}
private
static
boolean
setIncomeAndTax
(
PartnerSettle
partnerSettle
)
{
try
{
BigDecimal
base
=
partnerSettle
.
getSumRedpack
().
add
(
partnerSettle
.
getSumOthers
());
/**
* 订单收入全部计入微信 并且不计税
* wxIncome 和 bankIncome 均为扣税后的收入
*/
BigDecimal
wxIncome
=
partnerSettle
.
getSumOrderCommission
();
BigDecimal
wxTax
=
ZERO
;
BigDecimal
bankIncome
=
ZERO
;
BigDecimal
bankTax
=
ZERO
;
// 所有按左开右闭统计
if
(
base
.
compareTo
(
Constants
.
TAX_STAGE_FREE_BASE
)
<=
0
)
{
/**
* [0,800]
*/
wxIncome
=
wxIncome
.
add
(
base
);
}
else
if
(
base
.
compareTo
(
Constants
.
TAX_STAGE_FREE_BASE
)
==
1
&&
base
.
compareTo
(
Constants
.
TAX_STAGE_1
)
<=
0
)
{
/**
* (800,4000]
*/
wxTax
=
base
.
subtract
(
Constants
.
TAX_STAGE_FREE_BASE
).
multiply
(
Constants
.
TAX_STAGE_1_RATE1
).
multiply
(
Constants
.
TAX_STAGE_1_RATE2
);
wxIncome
=
wxIncome
.
add
(
base
).
subtract
(
wxTax
);
}
else
if
(
base
.
compareTo
(
Constants
.
TAX_STAGE_1
)
==
1
&&
base
.
compareTo
(
Constants
.
TAX_STAGE_WX_MAX
)
<=
0
)
{
/**
* (4000-17076.5]
*/
wxTax
=
base
.
multiply
(
Constants
.
TAX_STAGE_WX_MAX_RATE1
).
multiply
(
Constants
.
TAX_STAGE_WX_MAX_RATE2
).
multiply
(
Constants
.
TAX_STAGE_WX_MAX_RATE3
);
wxIncome
=
wxIncome
.
add
(
base
).
subtract
(
wxTax
);
}
else
{
/**
* (17076.5,)
*
* 微信收入: 17076.5-17076.5*0.8*0.2*0.76
*/
wxTax
=
Constants
.
TAX_STAGE_WX_MAX
.
multiply
(
Constants
.
TAX_STAGE_WX_MAX_RATE1
).
multiply
(
Constants
.
TAX_STAGE_WX_MAX_RATE2
).
multiply
(
Constants
.
TAX_STAGE_WX_MAX_RATE3
);
wxIncome
=
wxIncome
.
add
(
Constants
.
TAX_STAGE_WX_MAX
).
subtract
(
wxTax
);
bankTax
=
base
.
subtract
(
Constants
.
TAX_STAGE_WX_MAX
).
multiply
(
Constants
.
BANK_RATE
);
bankIncome
=
base
.
subtract
(
Constants
.
TAX_STAGE_WX_MAX
).
subtract
(
bankTax
);
}
partnerSettle
.
setWxIncome
(
wxIncome
);
partnerSettle
.
setWxTax
(
wxTax
);
partnerSettle
.
setBankIncome
(
bankIncome
);
partnerSettle
.
setBankTax
(
bankTax
);
return
true
;
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
return
false
;
}
}
// public boolean runSummary(String dateStr, int userId) {
// try {
// /**
// * partner_account_log 跑结算日期
// */
// Date dat = DateUtils.parse(dateStr, "yyyy-MM-dd");
// int yeartime = Integer.parseInt(DateUtils.getYear(dat));
// int monthtime = Integer.parseInt(DateUtils.getMonth(dat));
// int daytime = Integer.parseInt(DateUtils.format(dat, "dd"));
// PartnerAccountLog partnerAccountLog = partnerAccountLogService.getOneByUidAndDay(userId, yeartime, monthtime, daytime);
// /**
// * partner_income_summary 结算的数据月份 比dat早一个月
// */
// long beginTs = DateUtils.getLastMonth1stTimestamp(dat.getTime()) / 1000L;
// long endTs = DateUtils.getMonthLastTimestamp(dat.getTime()) / 1000L;
// Date dat2 = new Date(beginTs * 1000L);
// int yeartime2 = Integer.parseInt(DateUtils.getYear(dat2));
// int monthtime2 = Integer.parseInt(DateUtils.getMonth(dat2));
// PartnerIncomeSummary partnerIncomeSummary = partnerIncomeSummaryService.getOneByUidYearMonth(userId, yeartime2, monthtime2);
//
// /**
// * 获取显示的汇总数据
// */
// PartnerSummaryContent partnerSummaryContent = partnerRewardService.getPartnerSummaryContentByUidAndTime(userId, beginTs, endTs);
// /**
// * 补差额
// */
// BigDecimal sum = partnerSummaryContent.getCash()
// .add(partnerSummaryContent.getUpCash())
// .add(partnerSummaryContent.getIcash())
// .add(partnerSummaryContent.getPcash())
// .add(partnerSummaryContent.getScash())
// .add(partnerSummaryContent.getRcash());
// BigDecimal delta = partnerAccountLog.getChangeNum().subtract(sum);
// partnerSummaryContent.setRcash(partnerSummaryContent.getRcash().add(delta));
// /**
// * 显示精度
// */
// partnerSummaryContent.setCash(partnerSummaryContent.getCash().setScale(2, RoundingMode.HALF_UP));
// partnerSummaryContent.setUpCash(partnerSummaryContent.getUpCash().setScale(2, RoundingMode.HALF_UP));
// partnerSummaryContent.setIcash(partnerSummaryContent.getIcash().setScale(2, RoundingMode.HALF_UP));
// partnerSummaryContent.setPcash(partnerSummaryContent.getPcash().setScale(2, RoundingMode.HALF_UP));
// partnerSummaryContent.setScash(partnerSummaryContent.getScash().setScale(2, RoundingMode.HALF_UP));
// partnerSummaryContent.setRcash(partnerSummaryContent.getRcash().setScale(2, RoundingMode.HALF_UP));
// /**
// * 更新数据
// */
// partnerIncomeSummary.setContent(JSON.toJSONString(partnerSummaryContent));
// partnerIncomeSummary.setIncome(partnerAccountLog.getChangeNum());
// partnerIncomeSummaryService.updateById(partnerIncomeSummary);
// return true;
// } catch (Exception e) {
// logger.error(e.getMessage(), e);
// return false;
// }
// }
}
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