Commit b8246889 by guanchen

上线美团酒店,途牛,饿了么平推奖励

parent 1a9bd326
......@@ -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);
......
......@@ -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;
}
}
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
......
......@@ -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;
}
}
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 */@Componentpublic 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 */@Componentpublic 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
......
......@@ -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 {
/**
......
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;
}
}
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;
// }
// }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment