Commit 0e42deca by guanchen

添加代理商奖励推送

bug修复
parent ff529cf2
...@@ -2,17 +2,24 @@ package com.lanren.huhu.partner.config; ...@@ -2,17 +2,24 @@ package com.lanren.huhu.partner.config;
import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.util.ObjectUtils;
/** /**
* @author houseme * @author houseme
...@@ -60,4 +67,22 @@ public class RedisConfiguration { ...@@ -60,4 +67,22 @@ public class RedisConfiguration {
return redisTemplate; return redisTemplate;
} }
@Bean
public RedisTemplate redisTemplatePush(@Value("${spring.redis.database2}") int pushDb,
@Value("${spring.redis.host}") String host,
@Value("${spring.redis.port}") int port,
@Value("${spring.redis.password}") String password) {
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
configuration.setHostName(host);
configuration.setPort(port);
configuration.setDatabase(pushDb);
RedisPassword redisPassword = RedisPassword.of(password);
configuration.setPassword(redisPassword);
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
builder.poolConfig(genericObjectPoolConfig);
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(configuration, builder.build());
connectionFactory.afterPropertiesSet();
return redisTemplate(connectionFactory);
}
} }
...@@ -68,6 +68,11 @@ public class Constants { ...@@ -68,6 +68,11 @@ public class Constants {
*/ */
public static final BigDecimal MIN_REWARD = new BigDecimal("0.000001"); public static final BigDecimal MIN_REWARD = new BigDecimal("0.000001");
/**
* 代理商奖励push队列
*/
public static final String AGENT_REWARD_PUSH_KEY = "agent:reward:queue";
static { static {
/** /**
* 代理商平推奖励比例配置 * 代理商平推奖励比例配置
......
...@@ -18,8 +18,7 @@ import java.math.BigDecimal; ...@@ -18,8 +18,7 @@ import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import static com.lanren.huhu.partner.constants.Constants.PARENT_COLUMN_NAME_CENGJI; import static com.lanren.huhu.partner.constants.Constants.*;
import static com.lanren.huhu.partner.constants.Constants.PARENT_COLUMN_NAME_PINGTUI;
/** /**
* @author chen * @author chen
...@@ -66,12 +65,14 @@ public class AgentManager { ...@@ -66,12 +65,14 @@ public class AgentManager {
agentRewardMessage.setReferenceId("9999"); agentRewardMessage.setReferenceId("9999");
agentRewardMessage.setAgentId(33); agentRewardMessage.setAgentId(33);
agentRewardMessage.setAgentReward(new BigDecimal(5)); agentRewardMessage.setAgentReward(new BigDecimal(5));
agentRewardMessage.setSourceUserPayment(new BigDecimal(5));
agentRewardMessage.setSettleState(-100); agentRewardMessage.setSettleState(-100);
agentRewardMessage.setOrderType("taobao"); agentRewardMessage.setOrderType("taobao");
agentRewardMessage.setOrderSn("507596802910534728"); agentRewardMessage.setOrderSn("507596802910534728");
agentRewardMessage.setSubOrderSn("507596802910534728"); agentRewardMessage.setSubOrderSn("507596802910534728");
agentRewardMessage.setOrderCommission(new BigDecimal("35.400000")); agentRewardMessage.setOrderCommission(new BigDecimal("35.400000"));
ops.leftPush("agent_reward_redis_city_key", JSON.toJSONString(agentRewardMessage)); logger.info("写入队列");
ops.leftPush(AGENT_REWARD_QUEUE_KEY, JSON.toJSONString(agentRewardMessage));
return new Result<>(); return new Result<>();
} }
/** /**
......
package com.lanren.huhu.partner.model;
import com.lanren.huhu.partner.model.base.BaseModel;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author chen
* @title: AgentRewardQueueMessage
* @projectName partner
* @description: TODO
* @package com.lanren.huhu.partner.model
* @date 2019-07-09 16:05
*/
@Data
public class AgentRewardQueueMessage extends BaseModel {
private int userId;
private int sourceUserId;
private String money;
private int partnerLevel;
private long time;
private int rewardType;
}
...@@ -3,8 +3,10 @@ package com.lanren.huhu.partner.schedule; ...@@ -3,8 +3,10 @@ package com.lanren.huhu.partner.schedule;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.lanren.huhu.partner.domain.AgentReward; import com.lanren.huhu.partner.domain.AgentReward;
import com.lanren.huhu.partner.domain.PartnerAccount;
import com.lanren.huhu.partner.domain.UserAgent; import com.lanren.huhu.partner.domain.UserAgent;
import com.lanren.huhu.partner.model.AgentRewardMessage; import com.lanren.huhu.partner.model.AgentRewardMessage;
import com.lanren.huhu.partner.model.AgentRewardQueueMessage;
import com.lanren.huhu.partner.model.ParentAgent; import com.lanren.huhu.partner.model.ParentAgent;
import com.lanren.huhu.partner.service.AgentRewardService; import com.lanren.huhu.partner.service.AgentRewardService;
import com.lanren.huhu.partner.service.PartnerAccountService; import com.lanren.huhu.partner.service.PartnerAccountService;
...@@ -15,10 +17,16 @@ import org.slf4j.Logger; ...@@ -15,10 +17,16 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ListOperations; import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import sun.management.resources.agent;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
...@@ -51,6 +59,12 @@ public class AgentRewardQueueTask { ...@@ -51,6 +59,12 @@ public class AgentRewardQueueTask {
AgentRewardService agentRewardService; AgentRewardService agentRewardService;
@Autowired @Autowired
PartnerAccountService partnerAccountService; PartnerAccountService partnerAccountService;
@Autowired
RedisTemplate redisTemplatePush;
@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
@Autowired
TransactionDefinition transactionDefinition;
@Scheduled(fixedDelay = 5000L) @Scheduled(fixedDelay = 5000L)
public void runScheduledTask() { public void runScheduledTask() {
...@@ -111,8 +125,6 @@ public class AgentRewardQueueTask { ...@@ -111,8 +125,6 @@ public class AgentRewardQueueTask {
* 这里的逻辑有问题, 不能用这个接口找上级, 因为会先找一次直接邀请人, * 这里的逻辑有问题, 不能用这个接口找上级, 因为会先找一次直接邀请人,
* 只能按message.getAgentId()的代理商id, 找user_agent表里的平推关系 * 只能按message.getAgentId()的代理商id, 找user_agent表里的平推关系
*/ */
// User user = userService.getRelationByUserId(userAgent.getUserId());
// ArrayList<ParentAgent> parentList = user.getAgentList();
ArrayList<ParentAgent> parentList = (ArrayList<ParentAgent>) userAgentService.getParentAgentListByAgentId(userAgent.getAgentId(), PARENT_COLUMN_NAME_PINGTUI); ArrayList<ParentAgent> parentList = (ArrayList<ParentAgent>) userAgentService.getParentAgentListByAgentId(userAgent.getAgentId(), PARENT_COLUMN_NAME_PINGTUI);
ArrayList<ParentAgent> level4List = new ArrayList<ParentAgent>(); ArrayList<ParentAgent> level4List = new ArrayList<ParentAgent>();
if (parentList.size() > 0) { if (parentList.size() > 0) {
...@@ -159,24 +171,57 @@ public class AgentRewardQueueTask { ...@@ -159,24 +171,57 @@ public class AgentRewardQueueTask {
rateList.add(rateMap.get(1)); rateList.add(rateMap.get(1));
rateList.add(rateMap.get(2)); rateList.add(rateMap.get(2));
} }
TransactionStatus transactionStatus = null;
List<AgentReward> pushList = new ArrayList<AgentReward>();
try {
/**
* 开启事务, 如果rewardList中的奖励 都插入成功, 才提交事务
* 并发送redis消息, 否则, 进行回滚, 并把读入的消息塞回队列
*/
transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
for (int i=0; i<rewardList.size(); i++) { for (int i=0; i<rewardList.size(); i++) {
BigDecimal commissionRate = rateList.get(i); BigDecimal commissionRate = rateList.get(i);
if (doInsert(commissionRate, rewardList.get(i), message)) { AgentReward reward = doInsert(commissionRate, rewardList.get(i), message);
logger.info("插入代理商分成奖励,奖励比例: {}, 代理商: {}", commissionRate, rewardList.get(i)); if (reward != null) {
} else { pushList.add(reward);
logger.error("插入失败, 写回到队列"); }
}
/**
* 提交事务
*/
dataSourceTransactionManager.commit(transactionStatus);
/**
* 数据库写入成功后 发推送
*/
for (AgentReward reward : pushList) {
doPush(reward);
}
} catch (Exception e) {
logger.error("插入代理商分成奖励失败, 奖励 {}", message);
/**
* 回滚事务
*/
if (transactionStatus != null) {
dataSourceTransactionManager.rollback(transactionStatus);
}
/**
* 消息处理失败 丢回队列
*/
ops.leftPush(AGENT_REWARD_QUEUE_KEY, JSON.toJSONString(message)); ops.leftPush(AGENT_REWARD_QUEUE_KEY, JSON.toJSONString(message));
/**
* 休眠
*/
try { try {
Thread.sleep(5 * 1000L); Thread.sleep(5 * 1000L);
} catch (InterruptedException e) { } catch (Exception e1) {
logger.error(e.getMessage(), e); logger.error(e.getMessage(), e1);
}
} }
} }
} }
} }
private boolean doInsert(BigDecimal commissionRate, ParentAgent agent, AgentRewardMessage message) { private AgentReward doInsert(BigDecimal commissionRate, ParentAgent agent, AgentRewardMessage message) {
try { try {
int rewardType = message.getRewardType(); int rewardType = message.getRewardType();
int sourceUserLevel = partnerAccountService.getOneByUserId(message.getSourceUserId()).getPartnerLevel(); int sourceUserLevel = partnerAccountService.getOneByUserId(message.getSourceUserId()).getPartnerLevel();
...@@ -219,24 +264,45 @@ public class AgentRewardQueueTask { ...@@ -219,24 +264,45 @@ public class AgentRewardQueueTask {
agentReward.setAllMoneyOri(message.getOrderCommission()); agentReward.setAllMoneyOri(message.getOrderCommission());
agentReward.setRatioAll(message.getOrderRateArray()); agentReward.setRatioAll(message.getOrderRateArray());
} }
logger.info("rewardBasement is: {}", rewardBasement);
logger.info("commissionRate is: {}", commissionRate);
BigDecimal reward = rewardBasement.multiply(commissionRate); BigDecimal reward = rewardBasement.multiply(commissionRate);
/** /**
* 小于0.000001的奖励 不写入 * 小于0.000001的奖励 不写入
*/ */
if (reward.compareTo(MIN_REWARD) < 0) { if (reward.compareTo(MIN_REWARD) < 0) {
logger.info("代理商({})平推奖励金额小于0.000001, 忽略不写入. msg:{}", agent.getAgentId(), message); logger.info("代理商({})平推奖励金额小于0.000001, 忽略不写入. msg:{}", agent.getAgentId(), message);
return true; return null;
} else { } else {
agentReward.setMoney(rewardBasement); agentReward.setMoney(rewardBasement);
agentReward.setCommissionAcount(rewardBasement); agentReward.setCommissionAcount(rewardBasement);
agentReward.setAmount(reward); agentReward.setAmount(reward);
agentReward.setCommission(reward); agentReward.setCommission(reward);
agentReward.setCashCode("0"); agentReward.setCashCode("0");
return agentRewardService.save(agentReward); doPush(agentReward);
agentRewardService.save(agentReward);
return agentReward;
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
return null;
} }
}
private void doPush(AgentReward agentReward) {
try {
JSONObject json = new JSONObject();
PartnerAccount partnerAccount = partnerAccountService.getOneByUserId(agentReward.getUserId());
AgentRewardQueueMessage message = new AgentRewardQueueMessage();
message.setUserId(agentReward.getUserId());
message.setSourceUserId(agentReward.getSourceUserId());
message.setMoney(agentReward.getCommission().toString());
message.setPartnerLevel(partnerAccount.getIsSuperPartner() == 1 ? 30 : partnerAccount.getPartnerLevel());
message.setTime(agentReward.getCreatedAt());
message.setRewardType(agentReward.getRewardType());
redisTemplatePush.opsForList().leftPush(AGENT_REWARD_PUSH_KEY, message);
} catch (Exception e) { } catch (Exception e) {
logger.error(e.getMessage(), e); logger.error(e.getMessage(), e);
return false;
} }
} }
} }
...@@ -54,6 +54,7 @@ spring: ...@@ -54,6 +54,7 @@ spring:
## Redis数据库索引(默认为0) ## Redis数据库索引(默认为0)
redis: redis:
database: 13 database: 13
database2: 5
## Redis测试服务器地址 ## Redis测试服务器地址
host: @redis.host@ host: @redis.host@
## Redis测试服务器连接端口 ## Redis测试服务器连接端口
......
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