Commit 69bc6d9f by guanchen

初始化--代理商每日邮件

parent f826c915
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
!**/src/test/**
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
### VS Code ###
.vscode/
data
src/main/.DS_Store
src/main/java/.DS_Store
src/main/resources/.DS_Store
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
</parent> </parent>
<groupId>com.lanren.huhu</groupId> <groupId>com.lanren.huhu</groupId>
<artifactId>partner</artifactId> <artifactId>report_partner</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
<name>partner</name> <name>partner</name>
<description>呼呼省钱合伙人相关服务</description> <description>呼呼省钱合伙人相关服务</description>
...@@ -137,6 +137,10 @@ ...@@ -137,6 +137,10 @@
<artifactId>redisson</artifactId> <artifactId>redisson</artifactId>
<version>3.7.5</version> <version>3.7.5</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
</dependencies> </dependencies>
<profiles> <profiles>
...@@ -145,7 +149,8 @@ ...@@ -145,7 +149,8 @@
<id>dev</id> <id>dev</id>
<properties> <properties>
<profiles.active>dev</profiles.active> <profiles.active>dev</profiles.active>
<mysql.server>jdbc:mysql://10.9.121.204:3306/huhu_finance</mysql.server> <!--<mysql.server>jdbc:mysql://10.9.121.204:3306/huhu_finance</mysql.server>-->
<mysql.server>jdbc:mysql://10.9.121.204:3306/huhu</mysql.server>
<mysql.username>yanfa</mysql.username> <mysql.username>yanfa</mysql.username>
<mysql.password>cScdKw%ZKC1i$C!1uAz3Kg$c</mysql.password> <mysql.password>cScdKw%ZKC1i$C!1uAz3Kg$c</mysql.password>
<!--<mysql.username>apihu</mysql.username>--> <!--<mysql.username>apihu</mysql.username>-->
...@@ -193,6 +198,7 @@ ...@@ -193,6 +198,7 @@
<redis.password>Ws_LrqD_20180319_REdis_MQLRd</redis.password> <redis.password>Ws_LrqD_20180319_REdis_MQLRd</redis.password>
<spring.profiles.active>prod</spring.profiles.active> <spring.profiles.active>prod</spring.profiles.active>
<logfile_path>/data/logs2/huhu/lanren</logfile_path> <logfile_path>/data/logs2/huhu/lanren</logfile_path>
<!--<logfile_path>/Users/chen/Develop/workspace/partner/data/release/dev/logs</logfile_path>-->
<providers-path>/data/java/service</providers-path> <providers-path>/data/java/service</providers-path>
</properties> </properties>
......
package com.lanren.huhu.partner.controller; package com.lanren.huhu.partner.controller;
import com.lanren.huhu.partner.manager.AgentManager;
import com.lanren.huhu.partner.model.Agent;
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.result.Result;
import com.lanren.huhu.partner.schedule.AgentDailyExpandTask; import com.lanren.huhu.partner.schedule.AgentDailyExpandTask;
import com.lanren.huhu.partner.schedule.AgentSettleTask; import com.lanren.huhu.partner.schedule.AgentDailyMailTask;
import org.slf4j.Logger; 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.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
/** /**
* @author chen * @author chen
*/ */
@RestController @RestController
@RequestMapping("/v1/agent") @RequestMapping("/v1/report/")
public class AgentController { public class AgentController {
private static Logger logger = LoggerFactory.getLogger(AgentController.class); private static Logger logger = LoggerFactory.getLogger(AgentController.class);
@Autowired @Autowired
AgentManager agentManager;
@Autowired
AgentDailyExpandTask agentDailyExpandTask; AgentDailyExpandTask agentDailyExpandTask;
@Autowired @Autowired
AgentSettleTask agentSettleTask; AgentDailyMailTask agentDailyMailTask;
@RequestMapping(value = "/level", method = RequestMethod.POST)
public Result<AgentResponse> getAgentLevel(@RequestBody @Valid Agent agent, @RequestHeader HttpHeaders headers) {
if (logger.isInfoEnabled()) {
logger.info("AgentController getLevel agentId:{},header:{},time:{}", agent.getAgentId(), headers.keySet().toArray(), LocalDateTime.now());
}
return agentManager.getAgentLevel(agent.getAgentId());
}
@RequestMapping(value = "/reward/push", method = RequestMethod.POST) @RequestMapping(value = "/{dat}", method = RequestMethod.GET)
public Result<String> pushReward(@RequestHeader HttpHeaders headers) {
if (logger.isInfoEnabled()) {
logger.info("AgentController pushReward, header:{},time:{}", headers.keySet().toArray(), LocalDateTime.now());
}
return agentManager.pushReward();
}
@RequestMapping(value = "/hierarchy/parent", method = RequestMethod.POST)
public Result<ArrayList<ParentAgent>> getHierarchyParentList(@RequestBody @Valid Agent agent, @RequestHeader HttpHeaders headers) {
if (logger.isInfoEnabled()) {
logger.info("AgentController getHierarchyParentList, header:{},time:{}", headers.keySet().toArray(), LocalDateTime.now());
}
return agentManager.getHierarchyParentList(agent.getAgentId());
}
@RequestMapping(value = "/pingtui/parent", method = RequestMethod.POST)
public Result<ArrayList<ParentAgent>> getPingtuiParentList(@RequestBody @Valid Agent agent, @RequestHeader HttpHeaders headers) {
if (logger.isInfoEnabled()) {
logger.info("AgentController getPingtuiParentList, header:{},time:{}", headers.keySet().toArray(), LocalDateTime.now());
}
return agentManager.getPingtuiParentList(agent.getAgentId());
}
@RequestMapping(value = "/expand/{dat}", method = RequestMethod.GET)
public Result<String> updateOneDayExpand(@PathVariable("dat") String dat) { public Result<String> updateOneDayExpand(@PathVariable("dat") String dat) {
agentDailyExpandTask.runSummary(dat); agentDailyExpandTask.runSummary(dat);
logger.info("============>" + Thread.currentThread().getName()); logger.info("============>" + Thread.currentThread().getName());
...@@ -70,24 +33,16 @@ public class AgentController { ...@@ -70,24 +33,16 @@ public class AgentController {
return result; return result;
} }
/** /**
* 测试使用 结算单个代理商 * 汇总拓展的城市代理商
*/ */
@RequestMapping(value = "/finance", method = RequestMethod.POST) @RequestMapping(value = "/expand/city", method = RequestMethod.GET)
public Result<String> doFinanceSettle(@RequestBody @Valid Agent agent, @RequestHeader HttpHeaders headers) { public Result<String> sumExpandCity(@RequestHeader HttpHeaders headers) {
if (logger.isInfoEnabled()) { if (logger.isInfoEnabled()) {
logger.info("doFinanceSettle userId:{},header:{},time:{}", agent.getAgentId(), headers.keySet().toArray(), LocalDateTime.now()); logger.info("AgentController sumExpandCity, header:{}, time:{}", headers.keySet().toArray(), LocalDateTime.now());
} }
return agentManager.doFinanceSettle(agent.getAgentId()); agentDailyMailTask.runExpandCityAgent();
}
/**
* 结算全部代理商
*/
@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<String> result = new Result<String>();
result.setData("异步,正在执行刷新......"); result.setCode(0);
return result; 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.alibaba.fastjson.JSON;
import com.lanren.huhu.partner.manager.UserManager;
import com.lanren.huhu.partner.model.User;
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.scheduling.annotation.EnableAsync;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.time.LocalDateTime;
/**
* @author chen
*/
@RestController
@EnableAsync
@RequestMapping("/v1/user")
public class UserController {
private static Logger logger = LoggerFactory.getLogger(UserController.class);
@Autowired
private UserManager userManager;
@RequestMapping(value = "/relation", method = RequestMethod.POST)
public Result<User> getRelation(@RequestBody @Valid User user, @RequestHeader HttpHeaders headers) {
if (logger.isInfoEnabled()) {
logger.info("getRelation userId:{},header:{},time:{}", user.getUserId(), headers.keySet().toArray(), LocalDateTime.now());
}
return userManager.getRelationByUserId(user.getUserId());
}
@RequestMapping(value = "/relation/nocache", method = RequestMethod.POST)
public Result<User> getRelationNoCache(@RequestBody @Valid User user, @RequestHeader HttpHeaders headers) {
if (logger.isInfoEnabled()) {
logger.info("getRelationNocache userId:{},header:{},time:{}", user.getUserId(), headers.keySet().toArray(), LocalDateTime.now());
}
Result<User> result = userManager.getRelationNoCache(user.getUserId());
logger.info("uid:{} call /relation/nocache api, return: {}", user.getUserId(), JSON.toJSONString(result));
return result;
}
@RequestMapping(value = "/relation/delete", method = RequestMethod.POST)
public Result<String> deletrRelation(@RequestBody @Valid User user, @RequestHeader HttpHeaders headers) {
if (logger.isInfoEnabled()) {
logger.info("deletrRelation userId:{},header:{},time:{}", user.getUserId(), headers.keySet().toArray(), LocalDateTime.now());
}
return userManager.deleteRalationByUserId(user.getUserId());
}
@RequestMapping(value = "/relation/change", method = RequestMethod.POST)
public Result<String> changeRelation(@RequestBody @Valid User user, @RequestHeader HttpHeaders headers) {
if (logger.isInfoEnabled()) {
logger.info("purgeRelation userId:{},header:{},time:{}", user.getUserId(), headers.keySet().toArray(), LocalDateTime.now());
}
// userManager.purgeRelation(user.getUserId());
logger.info("============>" + Thread.currentThread().getName());
Result<String> result = new Result<String>();
result.setData("异步,正在执行刷新......");
return result;
}
@RequestMapping(value = "/update/relation/{from}/{to}/{type}" ,method = RequestMethod.GET)
public Result<String> updateRelation(@PathVariable("from") String from, @PathVariable("to") String to, @PathVariable("type") int type) {
userManager.updateRelation(from, to, type);
logger.info("============>" + Thread.currentThread().getName());
logger.info("============>from{}, to{}, type{}", from, to, type );
Result<String> result = new Result<String>();
result.setData("异步,正在执行更新新......");
return result;
}
}
...@@ -2,6 +2,7 @@ package com.lanren.huhu.partner.dao; ...@@ -2,6 +2,7 @@ package com.lanren.huhu.partner.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lanren.huhu.partner.domain.AgentExpandDaily; import com.lanren.huhu.partner.domain.AgentExpandDaily;
import com.lanren.huhu.partner.model.MailContentRow;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.UpdateProvider; import org.apache.ibatis.annotations.UpdateProvider;
...@@ -22,4 +23,8 @@ public interface AgentExpandDailyMapper extends BaseMapper<AgentExpandDaily> { ...@@ -22,4 +23,8 @@ public interface AgentExpandDailyMapper extends BaseMapper<AgentExpandDaily> {
int updateByDatByDetail(String datStr); int updateByDatByDetail(String datStr);
Integer getMonthCntByAgent(int agentId, long beginTs, long endTs); Integer getMonthCntByAgent(int agentId, long beginTs, long endTs);
MailContentRow getRegRow(String dat, Integer agentId, String monthBegin, String monthEnd);
List<MailContentRow> getVipRows(String yesterdayBegin, String yesterdayEnd, Integer agentId, String monthBegin, String monthEnd);
} }
\ No newline at end of file
...@@ -2,10 +2,12 @@ package com.lanren.huhu.partner.dao; ...@@ -2,10 +2,12 @@ package com.lanren.huhu.partner.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lanren.huhu.partner.domain.AgentExpandDetail; import com.lanren.huhu.partner.domain.AgentExpandDetail;
import java.util.List; import com.lanren.huhu.partner.model.MailContentRow;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper @Mapper
public interface AgentExpandDetailMapper extends BaseMapper<AgentExpandDetail> { public interface AgentExpandDetailMapper extends BaseMapper<AgentExpandDetail> {
...@@ -16,4 +18,8 @@ public interface AgentExpandDetailMapper extends BaseMapper<AgentExpandDetail> { ...@@ -16,4 +18,8 @@ public interface AgentExpandDetailMapper extends BaseMapper<AgentExpandDetail> {
int insertOrUpdate(AgentExpandDetail record); int insertOrUpdate(AgentExpandDetail record);
int insertOrUpdateSelective(AgentExpandDetail record); int insertOrUpdateSelective(AgentExpandDetail record);
List<MailContentRow> getsVipRows(String yesterdayBegin, String yesterdayEnd, Integer agentId, String monthBegin, String monthEnd);
List<MailContentRow> getCengjiChildRows(String yesterdayBegin, String yesterdayEnd, Integer agentId, String monthBegin, String monthEnd);
} }
\ No newline at end of file
...@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; ...@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lanren.huhu.partner.domain.AgentReward; import com.lanren.huhu.partner.domain.AgentReward;
import com.lanren.huhu.partner.model.AgentSettle; import com.lanren.huhu.partner.model.AgentSettle;
import com.lanren.huhu.partner.model.MailContentRow;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
...@@ -29,4 +30,6 @@ public interface AgentRewardMapper extends BaseMapper<AgentReward> { ...@@ -29,4 +30,6 @@ public interface AgentRewardMapper extends BaseMapper<AgentReward> {
IPage<AgentReward> selectOrderRewardPageByTsAndAgentId(Page<AgentReward> page, long beginTs, long endTs, int agentId); IPage<AgentReward> selectOrderRewardPageByTsAndAgentId(Page<AgentReward> page, long beginTs, long endTs, int agentId);
int updateRewardStatusByAgentIdAndTs(int agentId, long beginTs, long endTs); int updateRewardStatusByAgentIdAndTs(int agentId, long beginTs, long endTs);
List<MailContentRow> getsVipRows(String yesterdayBegin, String yesterdayEnd, Integer agentId, String monthBegin, String monthEnd);
} }
\ No newline at end of file
...@@ -8,7 +8,6 @@ import lombok.Data; ...@@ -8,7 +8,6 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
@Data @Data
...@@ -39,7 +38,7 @@ public class AgentReward implements Serializable { ...@@ -39,7 +38,7 @@ public class AgentReward implements Serializable {
private Integer userId; private Integer userId;
/** /**
* 奖励类型 40 开卡奖励 50 充值奖励 30 购买VIP会员 20 购买超级VIP会员 60 分享赚 300 自购省 * 奖励类型 40 开卡奖励 50 充值奖励 30 购买VIP会员 20 购买超级VIP会员 60 分享赚 300 自购省 得的购买年-VIP; 720 城市代理商所得的购买半年-VIP; 730 城市代理商所得的购买超级VIP收益; 740 城市代理商的红包收益; 750 城市代理商的自购省收益; 760 城市代理商的分享赚收益
*/ */
@TableField(value = "reward_type") @TableField(value = "reward_type")
private Integer rewardType; private Integer rewardType;
...@@ -189,7 +188,7 @@ public class AgentReward implements Serializable { ...@@ -189,7 +188,7 @@ public class AgentReward implements Serializable {
* 创建时间 * 创建时间
*/ */
@TableField(value = "create_time") @TableField(value = "create_time")
private LocalDateTime createTime; private Date createTime;
/** /**
* 来源基础金额 * 来源基础金额
...@@ -203,6 +202,18 @@ public class AgentReward implements Serializable { ...@@ -203,6 +202,18 @@ public class AgentReward implements Serializable {
@TableField(value = "ratio_all") @TableField(value = "ratio_all")
private String ratioAll; private String ratioAll;
/**
* 结算奖励的时间: 淘宝客/京东联盟为确认收货时间, 其他类型奖励同于recharge_time
*/
@TableField(value = "settle_time")
private Date settleTime;
/**
* 是否提前结算: 1是,0否
*/
@TableField(value = "settle_in_advance")
private Integer settleInAdvance;
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public static final String COL_AGENT_ID = "agent_id"; public static final String COL_AGENT_ID = "agent_id";
...@@ -268,4 +279,8 @@ public class AgentReward implements Serializable { ...@@ -268,4 +279,8 @@ public class AgentReward implements Serializable {
public static final String COL_ALL_MONEY_ORI = "all_money_ori"; public static final String COL_ALL_MONEY_ORI = "all_money_ori";
public static final String COL_RATIO_ALL = "ratio_all"; public static final String COL_RATIO_ALL = "ratio_all";
public static final String COL_SETTLE_TIME = "settle_time";
public static final String COL_SETTLE_IN_ADVANCE = "settle_in_advance";
} }
\ No newline at end of file
...@@ -6,7 +6,6 @@ import com.lanren.huhu.partner.model.AgentResponse; ...@@ -6,7 +6,6 @@ import com.lanren.huhu.partner.model.AgentResponse;
import com.lanren.huhu.partner.model.AgentRewardMessage; import com.lanren.huhu.partner.model.AgentRewardMessage;
import com.lanren.huhu.partner.model.ParentAgent; import com.lanren.huhu.partner.model.ParentAgent;
import com.lanren.huhu.partner.result.Result; 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.UserAgentService;
import com.lanren.huhu.partner.service.UserService; import com.lanren.huhu.partner.service.UserService;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -34,8 +33,6 @@ public class AgentManager { ...@@ -34,8 +33,6 @@ public class AgentManager {
@Autowired @Autowired
StringRedisTemplate redisTemplate; StringRedisTemplate redisTemplate;
@Autowired @Autowired
AgentSettleTask agentSettleTask;
@Autowired
UserService userService; UserService userService;
/*** /***
...@@ -106,14 +103,4 @@ public class AgentManager { ...@@ -106,14 +103,4 @@ public class AgentManager {
result.setData(parentAgents); result.setData(parentAgents);
return result; 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.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.lanren.huhu.partner.domain.OrderTaobaoJdCommission;import com.lanren.huhu.partner.service.OrderTaobaoJdCommissionService;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component; /** * @author houseme * @date 2019-07-01 14:45 * @Project partner * @Package com.lanren.huhu.partner.manager * @File: OrderTaobaoJdCommissionManager */@Componentpublic class OrderTaobaoJdCommissionManager { private static Logger logger = LoggerFactory.getLogger(OrderTaobaoJdCommissionManager.class); @Autowired private OrderTaobaoJdCommissionService orderTaobaoJdCommissionService; public void one() { QueryWrapper<OrderTaobaoJdCommission> queryWrapper = new QueryWrapper<OrderTaobaoJdCommission>(); queryWrapper.eq("order_sn", "511853890422935938 "); System.out.println(queryWrapper); System.out.println(orderTaobaoJdCommissionService.getOne(queryWrapper)); }}
\ 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.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.domain.UserAgent;
import com.lanren.huhu.partner.model.*;
import com.lanren.huhu.partner.result.Result;
import com.lanren.huhu.partner.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import static com.lanren.huhu.partner.constants.Constants.PARENT_COLUMN_NAME_CENGJI;
import static com.lanren.huhu.partner.constants.Constants.PARENT_COLUMN_NAME_PINGTUI;
/**
* @author houseme
*/
@Component
public class UserManager {
private static Logger logger = LoggerFactory.getLogger(UserManager.class);
@Autowired
UserService userService;
public Result<User> getRelationByUserId(int userId) {
User resutrnUser = userService.getRelationByUserId(userId);
Result<User> result = new Result<User>();
result.setData(resutrnUser);
return result;
}
public Result<String> deleteRalationByUserId(int userId) {
Result<String> result = new Result<String>();
if (userService.deleteRalationByUserId(userId)) {
result.setData("删除成功");
} else {
result.setCode(500);
}
return result;
}
/**
* 根据输入的userId, 完成递归查找
* @param userId
*/
@Async
public Result<String> purgeRelation(Integer userId) {
Result<String> result = new Result<String>();
try{
logger.info("start purgeRelation for userId: {} ...", userId);
PartnerAccount partnerAccount = userService.getPartnerAccountByUserId(userId);
if (partnerAccount == null) {
result.setCode(413);
}
int partnerLevel = partnerAccount.getIsSuperPartner() == 1 ? 30 : partnerAccount.getPartnerLevel();
/**
* 合伙人按邀请关系
*/
PartnerTree root = new PartnerTree();
root.setUserId(partnerAccount.getUserId());
root.setLevel(partnerLevel);
root.setParentList(new ArrayList<ParentPartner>());
recursiveSet(root);
/**
* 如果这个用户还是代理商身份, 也要处理他的代理商下级(层级下级 和 平推下级)
*/
UserAgent agent = userService.getUserAgentByUserId(partnerAccount.getUserId());
if (null != agent) {
AgentTree agentRoot = new AgentTree();
agentRoot.setUserId(partnerAccount.getUserId());
agentRoot.setAgentId(agent.getAgentId());
agentRoot.setLevel(partnerLevel);
agentRoot.setParentList(new ArrayList<ParentAgent>());
recursiveSet(agentRoot, PARENT_COLUMN_NAME_CENGJI);
recursiveSet(agentRoot, PARENT_COLUMN_NAME_PINGTUI);
}
logger.info("done purgeRelation for userId: {}", userId);
result.setData("用户刷新成功");
} catch (Exception e) {
logger.error(e.getMessage(), e);
result.setCode(500);
}
return result;
}
/**
* ****************************************分割线****合伙人***************************************************************
*/
/**
* 递归查找, 完成输入的tree的所有下级查找
* @param tree
*/
private void recursiveSet(PartnerTree tree) {
logger.info("do recursiveSet for userId: {}", tree.getUserId());
if (logger.isDebugEnabled()) {
logger.info("do recursiveSet for userId: {}", tree.getUserId());
}
/**
* 先找到直接下级
*/
setChildList(tree);
ArrayList<PartnerTree> children = tree.getChildList();
/**
* 如果没有下级了 那么直接输出结果
*/
if (children.size() == 0) {
outputTree(tree);
} else {
/**
* 如果有直接下级, 遍历下级, 对每个下级再执行recursiveSet
*/
for (PartnerTree child : children) {
recursiveSet(child);
/**
* 当完成 对每个下级再执行recursiveSet 之后
* 判断一下, 每个下级是否有直接下级
* 如果有 那么在各自的recursiveSet中 应该没有走到 line:52 的outputTree 方法
* 所以要在这里执行一次, 把他们自己输出
*/
if (child.getChildList().size() > 0) {
outputTree(child);
}
}
/**
* 最后输出自己
*/
outputTree(tree);
}
}
/**
* 完成刷新用户缓存数据
* @param tree
*/
private void outputTree(PartnerTree tree) {
StringBuilder sb = new StringBuilder();
ArrayList<ParentPartner> list = tree.getParentList();
for (ParentPartner p : list) {
sb.append(p.getUserId()).append(",");
}
if (logger.isDebugEnabled()) {
logger.info("begin to clean cache......");
logger.info("userId: {}, parent is: {}", tree.getUserId(), sb.toString());
}
deleteRalationByUserId(tree.getUserId());
/**
* 加快接口返回速度 不再为每一个叶子做刷新
* 只做清楚缓存的操作
*/
// getRelationByUserId(tree.getUserId());
}
/**
* 无递归操作, 只往下查找一级
* 把下级的数据, 设置到输入的tree中的childrenList
* @param tree
*/
private void setChildList(PartnerTree tree) {
ArrayList<PartnerAccount> partnerAccountArrayList = (ArrayList<PartnerAccount>) userService.getPartnerAccountChildListByUserId(tree.getUserId());
for (PartnerAccount partnerAccount : partnerAccountArrayList) {
Integer childId = partnerAccount.getUserId();
Integer childLevel = partnerAccount.getIsSuperPartner() == 1 ? 30 : partnerAccount.getPartnerLevel();
if (!tree.getParentList().contains(childId)) {
ArrayList<ParentPartner> parentList4Child = tree.cloneParent();
parentList4Child.add(new ParentPartner(tree.getUserId(), tree.getLevel()));
PartnerTree oneChild = new PartnerTree();
oneChild.setUserId(childId);
oneChild.setLevel(childLevel);
oneChild.setParentList(parentList4Child);
tree.getChildList().add(oneChild);
}
}
}
/**
* ****************************************分割线****代理商***************************************************************
*/
/**
* 递归查找, 完成输入的tree的所有下级查找
* @param tree
*/
private void recursiveSet(AgentTree tree, String parentColumnName) {
logger.info("do recursiveSet for userId: {}", tree.getUserId());
if (logger.isDebugEnabled()) {
logger.info("do recursiveSet for userId: {}", tree.getUserId());
}
/**
* 先找到直接下级
*/
setChildList(tree, parentColumnName);
ArrayList<AgentTree> children = tree.getChildList();
/**
* 如果没有下级了 那么直接输出结果
*/
if (children.size() == 0) {
outputTree(tree);
} else {
/**
* 如果有直接下级, 遍历下级, 对每个下级再执行recursiveSet
*/
for (AgentTree child : children) {
recursiveSet(child, parentColumnName);
/**
* 当完成 对每个下级再执行recursiveSet 之后
* 判断一下, 每个下级是否有直接下级
* 如果有 那么在各自的recursiveSet中 应该没有走到 line:52 的outputTree 方法
* 所以要在这里执行一次, 把他们自己输出
*/
if (child.getChildList().size() > 0) {
outputTree(child);
}
}
/**
* 最后输出自己
*/
outputTree(tree);
}
}
/**
* 完成刷新用户缓存数据
* @param tree
*/
private void outputTree(AgentTree tree) {
StringBuilder sb = new StringBuilder();
ArrayList<ParentAgent> list = tree.getParentList();
for (ParentAgent p : list) {
sb.append(p.getUserId()).append(",");
}
if (logger.isDebugEnabled()) {
logger.info("begin to clean cache......");
logger.info("userId: {}, parent is: {}", tree.getUserId(), sb.toString());
}
deleteRalationByUserId(tree.getUserId());
}
/**
* 无递归操作, 只往下查找一级
* 把下级的数据, 设置到输入的tree中的childrenList
* @param tree
*/
private void setChildList(AgentTree tree, String parentColumnName) {
ArrayList<UserAgent> partnerAccountArrayList = (ArrayList<UserAgent>) userService.getUserAgentChildListByUserId(tree.getUserId(), parentColumnName);
for (UserAgent userAgent : partnerAccountArrayList) {
Integer childId = userAgent.getUserId();
Integer agentId = userAgent.getAgentId();
Integer childLevel = userAgent.getAgentLevel();
if (!tree.getParentList().contains(childId)) {
ArrayList<ParentAgent> parentList4Child = tree.cloneParent();
parentList4Child.add(new ParentAgent(tree.getUserId(), tree.getAgentId(), tree.getLevel()));
AgentTree oneChild = new AgentTree();
oneChild.setUserId(childId);
oneChild.setAgentId(agentId);
oneChild.setLevel(childLevel);
oneChild.setParentList(parentList4Child);
tree.getChildList().add(oneChild);
}
}
}
/**
* 变更 代理商 或 用户的 上级
* 变更类型: 1改层级关系 2改推荐关系 3改层级和推荐关系 4改C端邀请关系 5全部都改
*/
@Async
public Result<String> updateRelation(String from, String to, int type) {
if (type == 1 || type == 3 || type == 5) {
int cnt = updateCengjiRelation(from, to);
logger.info("更新代理商层级关系, 将{}的上级改为{},更新{}行数据", from, to, cnt);
}
if (type == 2 || type == 3 || type == 5) {
int cnt = updatePingtuiRelation(from, to);
logger.info("更新代理商推荐关系, 将{}的上级改为{},更新{}行数据", from, to, cnt);
}
if (type == 4 || type == 5) {
int cnt = updatePartnerRelation(from, to);
logger.info("更新合伙人推荐关系, 将{}的上级改为{},更新{}行数据", from, to, cnt);
}
PartnerAccount partnerAccount = userService.getPartnerAccountByPhone(from);
return purgeRelation(partnerAccount.getUserId());
}
private int updatePartnerRelation(String from, String to) {
return userService.updatePartnerRelation(from, to);
}
private int updatePingtuiRelation(String from, String to) {
return userService.updatePingtuiRelation(from, to);
}
private int updateCengjiRelation(String from, String to) {
return userService.updateCengjiRelation(from, to);
}
public Result<User> getRelationNoCache(int userId) {
User resutrnUser = userService.getRelationByUserIdRealtime(userId);
Result<User> result = new Result<User>();
result.setData(resutrnUser);
return result;
}
}
package com.lanren.huhu.partner.schedule;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
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.model.AgentRewardMessage;
import com.lanren.huhu.partner.model.AgentRewardQueueMessage;
import com.lanren.huhu.partner.model.ParentAgent;
import com.lanren.huhu.partner.service.AgentRewardService;
import com.lanren.huhu.partner.service.PartnerAccountService;
import com.lanren.huhu.partner.service.UserAgentService;
import com.lanren.huhu.partner.service.UserService;
import com.lanren.huhu.partner.util.DateUtils;
import com.lanren.huhu.partner.util.LockUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static com.lanren.huhu.partner.constants.Constants.*;
/**
* @author chen
* @title: AgentRewardQueueTask
* @projectName partner
* @description: 消费 代理商奖励的消息队列, 处理代理商奖励, 写到agent_reward
* @package com.lanren.huhu.partner.schedule
* @date 2019-06-29 15:39
*/
@Component
public class AgentRewardQueueTask {
private static Logger logger = LoggerFactory.getLogger(AgentRewardQueueTask.class);
@Autowired
StringRedisTemplate stringRedisTemplate;
@Autowired
UserAgentService userAgentService;
@Autowired
UserService userService;
@Autowired
AgentRewardService agentRewardService;
@Autowired
PartnerAccountService partnerAccountService;
@Autowired
RedisTemplate redisTemplatePush;
@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
@Autowired
TransactionDefinition transactionDefinition;
// @Scheduled(fixedDelay = 5000L)
public void runScheduledTask() {
logger.info("run AgentRewardQueueTask");
runConsume();
}
private void runConsume() {
ListOperations<String, String> ops = stringRedisTemplate.opsForList();
while(null != ops && null != ops.size(AGENT_REWARD_QUEUE_KEY) && ops.size(AGENT_REWARD_QUEUE_KEY) > 0L) {
String msg = "";
try {
/**
* 加分布式锁
*/
LockUtil.lock(DISTRIBUTE_REDIS_LOCK_KEY);
try {
msg = ops.rightPop(AGENT_REWARD_QUEUE_KEY);
} catch (Exception e) {
logger.error(e.getMessage(), e);
continue;
} finally{
LockUtil.unlock(DISTRIBUTE_REDIS_LOCK_KEY);
}
logger.info("msg is {}", msg);
JSONObject json = JSON.parseObject(msg);
AgentRewardMessage message = json.toJavaObject(AgentRewardMessage.class);
processReward(message);
} catch (Exception e) {
logger.error("process agent reward message failed", msg);
logger.error(e.getMessage(), e);
}
}
}
@Async
public void processReward(AgentRewardMessage message) {
ListOperations<String, String> ops = stringRedisTemplate.opsForList();
logger.info("异步处理 agent reward: {}", message);
int rewardType = message.getRewardType();
Map<Integer, BigDecimal> rateMap;
if (!AGENT_RATE_MAP.keySet().contains(rewardType)) {
logger.info("未知的奖励类型 跳过不处理: {}", message);
return;
} else {
if ((rewardType == AGENT_REWARD_TYPE_SELF_ORDER || rewardType == AGENT_REWARD_TYPE_SHARE_ORDER)
&& message.getOrderType().equals(ORDER_TYPE_JD) ) {
rateMap = AGENT_RATE_MAP.get(rewardType + JD_OFFSET);
} else {
rateMap = AGENT_RATE_MAP.get(rewardType);
}
}
UserAgent userAgent = userAgentService.getOneByAgentId(message.getAgentId());
if (userAgent == null) {
logger.info("代理商id: {} 不存在, 跳过不处理", message);
return;
}
// if (userAgent.getAgentLevel() != AGENT_LEVEL_4 &&
// (rewardType == AGENT_REWARD_TYPE_SELF_ORDER || rewardType == AGENT_REWARD_TYPE_SHARE_ORDER || rewardType == AGENT_REWARD_TYPE_REDPACK) ) {
// logger.info("奖励类型{}, 代理商id: {} 不是城市代理, 跳过不处理", rewardType, message);
// return;
// }
/**
* 直属层级代理 是总代 没有平推, 是授权公司 只奖励自购省和分享赚
*/
if (userAgent.getAgentLevel() == AGENT_LEVEL_1 ||
(userAgent.getAgentLevel() == AGENT_LEVEL_2 && (rewardType != AGENT_REWARD_TYPE_SELF_ORDER && rewardType != AGENT_REWARD_TYPE_SHARE_ORDER))) {
logger.info("奖励类型{}, 代理商id: {} , 不在奖励范围内, 跳过不处理", rewardType, message);
return;
}
/**
* 这里的逻辑有问题, 不能用这个接口找上级, 因为会先找一次直接邀请人,
* 只能按message.getAgentId()的代理商id, 找user_agent表里的平推关系
* 已修复
*/
ArrayList<ParentAgent> parentList = (ArrayList<ParentAgent>) userService.getAgentListByUserId(userAgent.getUserId(), PARENT_COLUMN_NAME_PINGTUI);
if (parentList.size() > 0) {
/**
* 扫描agentlist中的平推城市代理
* 最多只需要找2个
*/
int rewardCnt = 0;
ArrayList<ParentAgent> rewardList = new ArrayList<ParentAgent>();
for (ParentAgent agent : parentList) {
/**
* 奖励次数不够2, 写到rewardList
*/
if (rewardCnt < 2){
rewardList.add(agent);
rewardCnt++;
/**
* 如果找到总代 就不再往上找了 都给总代
*/
if (agent.getLevel() == AGENT_LEVEL_1) {
break;
}
/**
* 如果是AGENT_LEVEL_2 奖励类型 750 或 760, 只奖励1个人 并且只拿1份
*/
if (userAgent.getAgentLevel() == AGENT_LEVEL_2 && (rewardType == AGENT_REWARD_TYPE_SELF_ORDER || rewardType == AGENT_REWARD_TYPE_SHARE_ORDER)) {
break;
}
} else {
break;
}
}
if (rewardList.size() > 2) {
logger.error("代理商推荐奖励处理异常 奖励人数超出2人, 奖励消息: {}", message);
return;
}
/**
* 如果上面检查通过, 证明代理商关系没问题, 后面处理只看rewardList的size
* 决定比例怎么分: 1个人-拿2份; 2个人-各1份
*/
List<BigDecimal> rateList = new ArrayList<BigDecimal>();
if (rewardList.size() == 1) {
/**
* 如果直属层级代理商是AGENT_LEVEL_2 奖励类型 750 或 760 只拿1份
*/
if (userAgent.getAgentLevel() == AGENT_LEVEL_2 &&
(rewardType == AGENT_REWARD_TYPE_SELF_ORDER || rewardType == AGENT_REWARD_TYPE_SHARE_ORDER) ) {
rateList.add(rateMap.get(0));
} else {
rateList.add(rateMap.get(0).add(rateMap.get(1)));
}
} else if (rewardList.size() == 2) {
if (userAgent.getAgentLevel() == AGENT_LEVEL_2 &&
(rewardType == AGENT_REWARD_TYPE_SELF_ORDER || rewardType == AGENT_REWARD_TYPE_SHARE_ORDER) ) {
logger.error("代理商推荐奖励逻辑处理错误, 直属代理商id: {}, rewardList[1]: {}", userAgent.getAgentId(), rewardList.get(1));
}
rateList.add(rateMap.get(0));
rateList.add(rateMap.get(1));
}
TransactionStatus transactionStatus = null;
List<AgentReward> pushList = new ArrayList<AgentReward>();
// List<AgentReward> pushRewardList = new ArrayList<AgentReward>();
try {
/**
* 开启事务, 如果rewardList中的奖励 都插入成功, 才提交事务
* 并发送redis消息, 否则, 进行回滚, 并把读入的消息塞回队列
*/
transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
for (int i=0; i<rewardList.size(); i++) {
BigDecimal commissionRate = rateList.get(i);
AgentReward reward = doInsert(commissionRate, rewardList.get(i), message.clone());
if (reward != null) {
pushList.add(reward);
/**
* 如果是城市代理获得的佣金 或 红包奖励 需要 再往上分
* 已废弃
*/
// if (reward.getAgentLevel() == AGENT_LEVEL_4 &&
// (rewardType == AGENT_REWARD_TYPE_SELF_ORDER || rewardType == AGENT_REWARD_TYPE_SHARE_ORDER || rewardType == AGENT_REWARD_TYPE_REDPACK)
// ) {
// pushRewardList.add(reward);
// }
}
}
/**
* 提交事务
*/
dataSourceTransactionManager.commit(transactionStatus);
/**
* 数据库写入成功后 发推送
*/
for (AgentReward reward : pushList) {
doPush(reward);
}
// for (AgentReward reward : pushRewardList) {
// pushRewardQueue(reward, message.clone());
// }
} catch (Exception e) {
logger.error(e.getMessage(), e);
logger.error("插入代理商分成奖励失败, 奖励 {}", message);
/**
* 回滚事务
*/
if (transactionStatus != null) {
dataSourceTransactionManager.rollback(transactionStatus);
}
/**
* 消息处理失败 丢回队列
*/
ops.leftPush(AGENT_REWARD_QUEUE_KEY, JSON.toJSONString(message));
/**
* 休眠
*/
try {
Thread.sleep(5 * 1000L);
} catch (Exception e1) {
logger.error(e.getMessage(), e1);
}
}
}
}
// private void pushRewardQueue(AgentReward reward, AgentRewardMessage message) {
// logger.info("处理循环上供奖励.......");
// logger.info("reward is :{}", reward);
// logger.info("message is :{}", message);
// message.setAgentId(reward.getAgentId());
// message.setAgentReward(reward.getAmount());
// String rateArray;
// if (StringUtils.isEmpty(reward.getRatioAll())) {
// rateArray = "[" + reward.getCommissionRate() + "]";
// } else {
// rateArray = reward.getRatioAll().replaceAll("\\]", "");
// rateArray = rateArray + reward.getCommissionRate() + "]";
// }
// message.setOrderRateArray(rateArray);
// logger.info("推送循环上供奖励: {}", message);
// stringRedisTemplate.opsForList().leftPush(AGENT_REWARD_QUEUE_KEY, JSON.toJSONString(message));
// }
private AgentReward doInsert(BigDecimal commissionRate, ParentAgent agent, AgentRewardMessage message) {
try {
int rewardType = message.getRewardType();
int sourceUserLevel = partnerAccountService.getOneByUserId(message.getSourceUserId()).getPartnerLevel();
AgentReward agentReward = new AgentReward();
agentReward.setRewardType(message.getRewardType());
agentReward.setRechargeTime(DateUtils.parse(message.getRechargeTime(), DateUtils.FORMAT_LONG));
agentReward.setSourceUserId(message.getSourceUserId());
agentReward.setReferenceId(Long.parseLong(message.getReferenceId()));
agentReward.setAgentId(agent.getAgentId());
agentReward.setSettleState(message.getSettleState());
agentReward.setOrderType(message.getOrderType());
agentReward.setOrderSn(message.getOrderSn());
agentReward.setSubOrderSn(message.getSubOrderSn());
agentReward.setGoodsId(message.getOrderGoodsId());
agentReward.setTitle(message.getOrderTitle());
agentReward.setAgentLevel(agent.getLevel());
agentReward.setUserId(agent.getUserId());
agentReward.setRewardRemark(AGENT_REWARD_REMARK.get(message.getRewardType()));
if (StringUtils.isEmpty(message.getSourceOrder())) {
agentReward.setSourceOrder(message.getReferenceId());
} else {
agentReward.setSourceOrder(message.getSourceOrder());
}
agentReward.setSourceUserLevel(sourceUserLevel);
agentReward.setCreatedAt(System.currentTimeMillis() / 1000L);
agentReward.setCommissionRate(commissionRate);
agentReward.setRewardTypeChild(message.getRewardTypeChild() == null ? "" : message.getRewardTypeChild());
/**
* agent_reward里:
* money 面额(message里, 需要上供的代理商自己获得的奖励)
* commission_account 面额
* amount 奖励金额
* commission 奖励金额
* cash_code 支付金额
*/
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) {
rewardBasement = message.getSourceUserPayment();
} else {
/**
* 订单相关, 还需要写入两个字段:all_money_ori 原始佣金, 继承下来的比例数组
*/
rewardBasement = message.getOrderCommission();
agentReward.setAllMoneyOri(message.getOrderCommission());
agentReward.setRatioAll("");
}
logger.info("rewardBasement is: {}", rewardBasement);
logger.info("commissionRate is: {}", commissionRate);
BigDecimal reward = rewardBasement.multiply(commissionRate);
/**
* 小于0.000001的奖励 不写入
*/
if (reward.compareTo(MIN_REWARD) < 0) {
logger.info("代理商({})平推奖励金额小于0.000001, 忽略不写入. msg:{}", agent.getAgentId(), message);
return null;
} else {
agentReward.setMoney(rewardBasement);
agentReward.setCommissionAcount(rewardBasement);
agentReward.setAmount(reward);
agentReward.setCommission(reward);
agentReward.setCashCode("0");
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);
logger.info("推送奖励通知 {}", message);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
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;
// }
// }
}
package com.lanren.huhu.partner.schedule;
import com.lanren.huhu.partner.domain.AgentRevokeRecords;
import com.lanren.huhu.partner.domain.AgentReward;
import com.lanren.huhu.partner.service.AgentRevokeRecordsService;
import com.lanren.huhu.partner.service.AgentRewardService;
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.util.ArrayList;
import java.util.List;
import static com.lanren.huhu.partner.constants.Constants.*;
/**
* @author chen
* @title: RevokeAgentRewardTask
* @projectName partner
* @description: 扣回代理商的奖励
* @package com.lanren.huhu.partner.schedule
* @date 2019-07-04 11:41
*/
@Component
public class RevokeAgentRewardTask {
private static Logger logger = LoggerFactory.getLogger(RevokeAgentRewardTask.class);
@Autowired
AgentRevokeRecordsService agentRevokeRecordsService;
@Autowired
AgentRewardService agentRewardService;
@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
@Autowired
TransactionDefinition transactionDefinition;
// @Scheduled(fixedDelay = 5000L)
public void runScheduledTask() {
logger.info("run RevokeAgentRewardTask");
runConsume();
}
private void runConsume() {
List<AgentRevokeRecords> revokeRecordList = null;
try {
revokeRecordList = agentRevokeRecordsService.getAllPending();
if (null == revokeRecordList || revokeRecordList.size() == 0) {
return;
}
process(revokeRecordList);
} catch (Exception e) {
logger.error("process revoke failed. {}", revokeRecordList);
logger.error(e.getMessage(), e);
}
}
@Async
public void process(List<AgentRevokeRecords> revokeRecordList) {
for (AgentRevokeRecords agentRevokeRecord : revokeRecordList) {
process(agentRevokeRecord);
}
}
private void process(AgentRevokeRecords revokeRecord) {
TransactionStatus transactionStatus = null;
try {
int revokeType = revokeRecord.getRevokeType();
if (!AGENT_REVOKE_TYPE_MAP.keySet().contains(revokeType)) {
logger.info("未知的奖励类型 跳过不处理: {}", revokeRecord);
return;
}
/**
* 开启事务
*/
transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
List<AgentReward> agentRewardList = null;
List<AgentReward> insertList = new ArrayList<AgentReward>();
List<AgentReward> updateList = new ArrayList<AgentReward>();
if (revokeType == AGENT_REVOKE_TYPE_ACTIVATION || revokeType == AGENT_REVOKE_TYPE_SELF_ORDER) {
agentRewardList = agentRewardService.getListByRefId(revokeRecord.getRefId());
} else if (revokeType == AGENT_REVOKE_TYPE_SHARE_ORDER) {
agentRewardList = agentRewardService.getListBySubOrderSn(revokeRecord.getOrderType(), revokeRecord.getOrderSn(), revokeRecord.getSubOrderSn());
} else {
revokeRecord.setState(REVOKE_STATE_DO_NOTHING);
}
/**
* 已结算状态 插负, 未结算状态 抹平
*/
if (null != agentRewardList && agentRewardList.size() > 0) {
for (AgentReward agentReward : agentRewardList) {
if (agentReward.getSettleState() == SETTLE_STATE_DONE) {
agentReward.setAmount(agentReward.getAmount().negate());
agentReward.setCommission(agentReward.getCommission().negate());
insertList.add(agentReward);
} else if (agentReward.getSettleState() == SETTLE_STATE_ON_THE_WAY || agentReward.getSettleState() == SETTLE_STATE_PRE) {
agentReward.setAmount(new BigDecimal(0));
agentReward.setCommission(new BigDecimal(0));
updateList.add(agentReward);
}
}
if (updateList.size() > 0) {
agentRewardService.updateBatch(updateList);
}
if (insertList.size() > 0) {
agentRewardService.batchInsert(insertList);
}
revokeRecord.setState(REVOKE_STATE_DONE);
} else {
revokeRecord.setState(REVOKE_STATE_DO_NOTHING);
}
agentRevokeRecordsService.updateById(revokeRecord);
/**
* 提交事务
*/
dataSourceTransactionManager.commit(transactionStatus);
} catch (Exception e) {
/**
* 回滚事务
*/
dataSourceTransactionManager.rollback(transactionStatus);
logger.error(e.getMessage(), e);
revokeRecord.setState(REVOKE_STATE_FAILED);
agentRevokeRecordsService.updateById(revokeRecord);
}
}
}
...@@ -2,6 +2,7 @@ package com.lanren.huhu.partner.service; ...@@ -2,6 +2,7 @@ package com.lanren.huhu.partner.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.lanren.huhu.partner.domain.AgentExpandDaily; import com.lanren.huhu.partner.domain.AgentExpandDaily;
import com.lanren.huhu.partner.model.MailContentRow;
import java.util.List; import java.util.List;
...@@ -27,6 +28,10 @@ public interface AgentExpandDailyService extends IService<AgentExpandDaily> { ...@@ -27,6 +28,10 @@ public interface AgentExpandDailyService extends IService<AgentExpandDaily> {
int updateByDatByDetail(String datStr); int updateByDatByDetail(String datStr);
Integer getMonthCntByAgent(int agentId, long beginTs, long endTs); Integer getMonthCntByAgent(int agentId, long beginTs, long endTs);
MailContentRow getRegRow(String dat, Integer agentId, String monthBegin, String monthEnd);
List<MailContentRow> getVipRows(String yesterdayBegin, String yesterdayEnd, Integer agentId, String monthBegin, String monthEnd);
} }
package com.lanren.huhu.partner.service; package com.lanren.huhu.partner.service;
import java.util.List;
import com.lanren.huhu.partner.domain.AgentExpandDetail;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
/** import com.lanren.huhu.partner.domain.AgentExpandDetail;
import com.lanren.huhu.partner.model.MailContentRow;
import java.util.List;
/**
* @title: ${NAME} * @title: ${NAME}
* @projectName partner * @projectName partner
* @description: TODO * @description: TODO
...@@ -22,4 +25,7 @@ public interface AgentExpandDetailService extends IService<AgentExpandDetail>{ ...@@ -22,4 +25,7 @@ public interface AgentExpandDetailService extends IService<AgentExpandDetail>{
int insertOrUpdateSelective(AgentExpandDetail record); int insertOrUpdateSelective(AgentExpandDetail record);
List<MailContentRow> getsVipRows(String yesterdayBegin, String yesterdayEnd, Integer agentId, String monthBegin, String monthEnd);
List<MailContentRow> getCengjiChildRows(String yesterdayBegin, String yesterdayEnd, Integer agentId, String monthBegin, String monthEnd);
} }
...@@ -21,4 +21,6 @@ public interface UserAgentService extends IService<UserAgent> { ...@@ -21,4 +21,6 @@ public interface UserAgentService extends IService<UserAgent> {
* @return * @return
*/ */
UserAgent getOneByAgentId(Integer agentId); UserAgent getOneByAgentId(Integer agentId);
List<UserAgent> selectCityAgentList();
} }
...@@ -3,6 +3,7 @@ package com.lanren.huhu.partner.service.impl; ...@@ -3,6 +3,7 @@ package com.lanren.huhu.partner.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lanren.huhu.partner.dao.AgentExpandDailyMapper; import com.lanren.huhu.partner.dao.AgentExpandDailyMapper;
import com.lanren.huhu.partner.domain.AgentExpandDaily; import com.lanren.huhu.partner.domain.AgentExpandDaily;
import com.lanren.huhu.partner.model.MailContentRow;
import com.lanren.huhu.partner.service.AgentExpandDailyService; import com.lanren.huhu.partner.service.AgentExpandDailyService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -48,6 +49,16 @@ public class AgentExpandDailyServiceImpl extends ServiceImpl<AgentExpandDailyMap ...@@ -48,6 +49,16 @@ public class AgentExpandDailyServiceImpl extends ServiceImpl<AgentExpandDailyMap
public Integer getMonthCntByAgent(int agentId, long beginTs, long endTs) { public Integer getMonthCntByAgent(int agentId, long beginTs, long endTs) {
return baseMapper.getMonthCntByAgent(agentId, beginTs, endTs); return baseMapper.getMonthCntByAgent(agentId, beginTs, endTs);
} }
@Override
public MailContentRow getRegRow(String dat, Integer agentId, String monthBegin, String monthEnd) {
return baseMapper.getRegRow(dat, agentId, monthBegin, monthEnd);
}
@Override
public List<MailContentRow> getVipRows(String yesterdayBegin, String yesterdayEnd, Integer agentId, String monthBegin, String monthEnd) {
return baseMapper.getVipRows(yesterdayBegin, yesterdayEnd, agentId, monthBegin, monthEnd);
}
} }
package com.lanren.huhu.partner.service.impl; package com.lanren.huhu.partner.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.List;
import com.lanren.huhu.partner.dao.AgentExpandDetailMapper; import com.lanren.huhu.partner.dao.AgentExpandDetailMapper;
import com.lanren.huhu.partner.domain.AgentExpandDetail; import com.lanren.huhu.partner.domain.AgentExpandDetail;
import com.lanren.huhu.partner.model.MailContentRow;
import com.lanren.huhu.partner.service.AgentExpandDetailService; import com.lanren.huhu.partner.service.AgentExpandDetailService;
import org.springframework.stereotype.Service;
import java.util.List;
/** /**
* @title: ${NAME} * @title: ${NAME}
* @projectName partner * @projectName partner
...@@ -36,4 +35,14 @@ public class AgentExpandDetailServiceImpl extends ServiceImpl<AgentExpandDetailM ...@@ -36,4 +35,14 @@ public class AgentExpandDetailServiceImpl extends ServiceImpl<AgentExpandDetailM
public int insertOrUpdateSelective(AgentExpandDetail record) { public int insertOrUpdateSelective(AgentExpandDetail record) {
return baseMapper.insertOrUpdateSelective(record); return baseMapper.insertOrUpdateSelective(record);
} }
@Override
public List<MailContentRow> getsVipRows(String yesterdayBegin, String yesterdayEnd, Integer agentId, String monthBegin, String monthEnd) {
return baseMapper.getsVipRows(yesterdayBegin, yesterdayEnd, agentId, monthBegin, monthEnd);
}
@Override
public List<MailContentRow> getCengjiChildRows(String yesterdayBegin, String yesterdayEnd, Integer agentId, String monthBegin, String monthEnd) {
return baseMapper.getCengjiChildRows(yesterdayBegin, yesterdayEnd, agentId, monthBegin, monthEnd);
}
} }
...@@ -49,4 +49,11 @@ public class UserAgentServiceImpl extends ServiceImpl<UserAgentMapper, UserAgent ...@@ -49,4 +49,11 @@ public class UserAgentServiceImpl extends ServiceImpl<UserAgentMapper, UserAgent
; ;
return baseMapper.selectOne(queryWrapper); return baseMapper.selectOne(queryWrapper);
} }
@Override
public List<UserAgent> selectCityAgentList() {
QueryWrapper<UserAgent> wrapper = new QueryWrapper<UserAgent>();
wrapper.eq("agent_level", 4).eq("agent_state", 1);
return baseMapper.selectList(wrapper);
}
} }
...@@ -83,6 +83,21 @@ spring: ...@@ -83,6 +83,21 @@ spring:
force: true force: true
converters: converters:
preferred-json-mapper: fastjson preferred-json-mapper: fastjson
#邮箱配置
mail:
host: smtp.exmail.qq.com #发送邮件服务器
username: report@wasair.com #发送邮件的邮箱地址
password: Wasai123 #客户端授权码,不是邮箱密码,这个在qq邮箱设置里面自动生成的
port: 25 #端口号465或587
from: report@wasair.com # 发送邮件的地址,和上面username一致
properties:
mail:
smtp:
auth: true
# properties.mail.smtp.starttls.enable: true
# properties.mail.smtp.starttls.required: true
# properties.mail.smtp.ssl.enable: true
# default-encoding: utf-8
server: server:
port: 8099 port: 8099
http2: http2:
...@@ -100,10 +115,12 @@ mybatis-plus: ...@@ -100,10 +115,12 @@ mybatis-plus:
type-aliases-package: com.lanren.huhu.partner.domain type-aliases-package: com.lanren.huhu.partner.domain
mapper-locations: classpath*:mapper/*.xml mapper-locations: classpath*:mapper/*.xml
logging: logging:
level: level:
#打印SQL信息 #打印SQL信息
com.lanren.huhu.partner.dao: info com.lanren.huhu.partner.dao: debug
......
...@@ -185,4 +185,29 @@ ...@@ -185,4 +185,29 @@
WHERE agent_id=#{agentId} WHERE agent_id=#{agentId}
AND dat BETWEEN FROM_UNIXTIME(#{beginTs}) AND FROM_UNIXTIME(#{endTs}) AND dat BETWEEN FROM_UNIXTIME(#{beginTs}) AND FROM_UNIXTIME(#{endTs})
</select> </select>
<select id="getRegRow" resultType="com.lanren.huhu.partner.model.MailContentRow">
SELECT
'注册并登录用户' c1,
'共计' c2,
sum(case when dat=#{dat} then cnt_expand else 0 end) c3,
sum(case when dat>='2019-08-16' then cnt_expand else 0 end) c4,
sum(case when dat between date(#{monthBegin}) and date(#{monthEnd}) then cnt_expand else 0 end) c5,
sum(cnt_expand) c6
FROM agent_expand_daily
WHERE agent_id=#{agentId}
</select>
<select id="getVipRows" resultType="com.lanren.huhu.partner.model.MailContentRow">
SELECT
'Vip会员' c1,
case when b.invite_user_id = a.user_id then '直接' else '间接' end c2,
COUNT(a.recharge_time between #{yesterdayBegin} and #{yesterdayEnd} or NULL) c3,
COUNT(a.recharge_time >= '2019-08-16 23:59:59' or NULL) c4,
COUNT(a.recharge_time between #{monthBegin} and #{monthEnd} or NULL) c5,
COUNT(*) c6
FROM agent_reward a
LEFT JOIN partner_invite_relation b on a.source_user_id=b.user_id
WHERE a.agent_id = #{agentId}
AND a.reward_type in (30,20,710,720,730)
GROUP BY 1,2
</select>
</mapper> </mapper>
\ No newline at end of file
...@@ -141,4 +141,31 @@ ...@@ -141,4 +141,31 @@
</if> </if>
</trim> </trim>
</insert> </insert>
<select id="getsVipRows" resultType="com.lanren.huhu.partner.model.MailContentRow">
SELECT
'超级Vip会员' c1,
case when c.invite_user_id=a.user_id then '直接' else '间接' end c2,
COUNT(b.become_super_time between #{yesterdayBegin} and #{yesterdayEnd} or NULL) c3,
COUNT(b.become_super_time >= '2019-08-16 23:59:59' or NULL) c4,
COUNT(b.become_super_time between #{monthBegin} and #{monthEnd} or NULL) c5,
COUNT(*) c6
FROM agent_expand_detail a
JOIN partner_account b on a.expand_user_id=b.user_id and b.is_super_partner=1
JOIN partner_invite_relation c on a.expand_user_id=c.user_id
WHERE a.agent_id = #{agentId}
GROUP BY 1,2
</select>
<select id="getCengjiChildRows" resultType="com.lanren.huhu.partner.model.MailContentRow">
SELECT
case when b.agent_level in (4,3) then '城市代理' when b.agent_level=2 then '分公司' end c1,
case when b.parent_agent_id=a.agent_id then '直接' else '间接' end c2,
COUNT(b.active_time between UNIX_TIMESTAMP(#{yesterdayBegin}) and UNIX_TIMESTAMP(#{yesterdayEnd}) or NULL) c3,
COUNT(b.active_time >= UNIX_TIMESTAMP('2019-08-16 00:00:00') or NULL) c4,
COUNT(b.active_time between UNIX_TIMESTAMP(#{monthBegin}) and UNIX_TIMESTAMP(#{monthEnd}) or NULL) c5,
COUNT(*) c6
FROM agent_expand_detail a
JOIN user_agent b on a.expand_user_id=b.user_id and b.agent_level between 2 and 4 and b.agent_state=1
WHERE a.agent_id = #{agentId}
GROUP BY 1,2
</select>
</mapper> </mapper>
\ No newline at end of file
...@@ -36,6 +36,8 @@ ...@@ -36,6 +36,8 @@
<result column="create_time" property="createTime" /> <result column="create_time" property="createTime" />
<result column="all_money_ori" property="allMoneyOri" /> <result column="all_money_ori" property="allMoneyOri" />
<result column="ratio_all" property="ratioAll" /> <result column="ratio_all" property="ratioAll" />
<result column="settle_time" property="settleTime" />
<result column="settle_in_advance" property="settleInAdvance" />
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
<!--@mbg.generated--> <!--@mbg.generated-->
...@@ -43,7 +45,8 @@ ...@@ -43,7 +45,8 @@
reward_remark, reward_status, money, amount, cash_code, recharge_time, commission_acount, reward_remark, reward_status, money, amount, cash_code, recharge_time, commission_acount,
commission_rate, commission, reference_id, settle_state, source_order, source_user_id, commission_rate, commission, reference_id, settle_state, source_order, source_user_id,
source_user_level, goods_id, title, order_type, order_sn, sub_order_sn, reward_extend, source_user_level, goods_id, title, order_type, order_sn, sub_order_sn, reward_extend,
created_at, updated_at, deleted_at, create_time, all_money_ori, ratio_all created_at, updated_at, deleted_at, create_time, all_money_ori, ratio_all, settle_time,
settle_in_advance
</sql> </sql>
<update id="updateBatch" parameterType="java.util.List"> <update id="updateBatch" parameterType="java.util.List">
<!--@mbg.generated--> <!--@mbg.generated-->
...@@ -209,6 +212,16 @@ ...@@ -209,6 +212,16 @@
when id = #{item.id} then #{item.ratioAll} when id = #{item.id} then #{item.ratioAll}
</foreach> </foreach>
</trim> </trim>
<trim prefix="settle_time = case" suffix="end,">
<foreach collection="list" index="index" item="item">
when id = #{item.id} then #{item.settleTime}
</foreach>
</trim>
<trim prefix="settle_in_advance = case" suffix="end,">
<foreach collection="list" index="index" item="item">
when id = #{item.id} then #{item.settleInAdvance}
</foreach>
</trim>
</trim> </trim>
where id in where id in
<foreach close=")" collection="list" item="item" open="(" separator=", "> <foreach close=")" collection="list" item="item" open="(" separator=", ">
...@@ -222,7 +235,8 @@ ...@@ -222,7 +235,8 @@
reward_status, money, amount, cash_code, recharge_time, commission_acount, commission_rate, reward_status, money, amount, cash_code, recharge_time, commission_acount, commission_rate,
commission, reference_id, settle_state, source_order, source_user_id, source_user_level, commission, reference_id, settle_state, source_order, source_user_id, source_user_level,
goods_id, title, order_type, order_sn, sub_order_sn, reward_extend, created_at, goods_id, title, order_type, order_sn, sub_order_sn, reward_extend, created_at,
updated_at, deleted_at, create_time, all_money_ori, ratio_all) updated_at, deleted_at, create_time, all_money_ori, ratio_all, settle_time, settle_in_advance
)
values values
<foreach collection="list" item="item" separator=","> <foreach collection="list" item="item" separator=",">
(#{item.agentId}, #{item.agentLevel}, #{item.userId}, #{item.rewardType}, #{item.rewardTypeChild}, (#{item.agentId}, #{item.agentLevel}, #{item.userId}, #{item.rewardType}, #{item.rewardTypeChild},
...@@ -232,7 +246,7 @@ ...@@ -232,7 +246,7 @@
#{item.sourceOrder}, #{item.sourceUserId}, #{item.sourceUserLevel}, #{item.goodsId}, #{item.sourceOrder}, #{item.sourceUserId}, #{item.sourceUserLevel}, #{item.goodsId},
#{item.title}, #{item.orderType}, #{item.orderSn}, #{item.subOrderSn}, #{item.rewardExtend}, #{item.title}, #{item.orderType}, #{item.orderSn}, #{item.subOrderSn}, #{item.rewardExtend},
#{item.createdAt}, #{item.updatedAt}, #{item.deletedAt}, #{item.createTime}, #{item.allMoneyOri}, #{item.createdAt}, #{item.updatedAt}, #{item.deletedAt}, #{item.createTime}, #{item.allMoneyOri},
#{item.ratioAll}) #{item.ratioAll}, #{item.settleTime}, #{item.settleInAdvance})
</foreach> </foreach>
</insert> </insert>
<insert id="insertOrUpdate" keyColumn="id" keyProperty="id" parameterType="com.lanren.huhu.partner.domain.AgentReward" useGeneratedKeys="true"> <insert id="insertOrUpdate" keyColumn="id" keyProperty="id" parameterType="com.lanren.huhu.partner.domain.AgentReward" useGeneratedKeys="true">
...@@ -274,6 +288,8 @@ ...@@ -274,6 +288,8 @@
create_time, create_time,
all_money_ori, all_money_ori,
ratio_all, ratio_all,
settle_time,
settle_in_advance,
</trim> </trim>
values values
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
...@@ -312,6 +328,8 @@ ...@@ -312,6 +328,8 @@
#{createTime}, #{createTime},
#{allMoneyOri}, #{allMoneyOri},
#{ratioAll}, #{ratioAll},
#{settleTime},
#{settleInAdvance},
</trim> </trim>
on duplicate key update on duplicate key update
<trim suffixOverrides=","> <trim suffixOverrides=",">
...@@ -350,6 +368,8 @@ ...@@ -350,6 +368,8 @@
create_time = #{createTime}, create_time = #{createTime},
all_money_ori = #{allMoneyOri}, all_money_ori = #{allMoneyOri},
ratio_all = #{ratioAll}, ratio_all = #{ratioAll},
settle_time = #{settleTime},
settle_in_advance = #{settleInAdvance},
</trim> </trim>
</insert> </insert>
<insert id="insertOrUpdateSelective" keyColumn="id" keyProperty="id" parameterType="com.lanren.huhu.partner.domain.AgentReward" useGeneratedKeys="true"> <insert id="insertOrUpdateSelective" keyColumn="id" keyProperty="id" parameterType="com.lanren.huhu.partner.domain.AgentReward" useGeneratedKeys="true">
...@@ -455,6 +475,12 @@ ...@@ -455,6 +475,12 @@
<if test="ratioAll != null"> <if test="ratioAll != null">
ratio_all, ratio_all,
</if> </if>
<if test="settleTime != null">
settle_time,
</if>
<if test="settleInAdvance != null">
settle_in_advance,
</if>
</trim> </trim>
values values
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
...@@ -557,6 +583,12 @@ ...@@ -557,6 +583,12 @@
<if test="ratioAll != null"> <if test="ratioAll != null">
#{ratioAll}, #{ratioAll},
</if> </if>
<if test="settleTime != null">
#{settleTime},
</if>
<if test="settleInAdvance != null">
#{settleInAdvance},
</if>
</trim> </trim>
on duplicate key update on duplicate key update
<trim suffixOverrides=","> <trim suffixOverrides=",">
...@@ -659,6 +691,12 @@ ...@@ -659,6 +691,12 @@
<if test="ratioAll != null"> <if test="ratioAll != null">
ratio_all = #{ratioAll}, ratio_all = #{ratioAll},
</if> </if>
<if test="settleTime != null">
settle_time = #{settleTime},
</if>
<if test="settleInAdvance != null">
settle_in_advance = #{settleInAdvance},
</if>
</trim> </trim>
</insert> </insert>
<select id="selectAgentSettlePageByTs" resultType="com.lanren.huhu.partner.model.AgentSettle"> <select id="selectAgentSettlePageByTs" resultType="com.lanren.huhu.partner.model.AgentSettle">
...@@ -680,8 +718,8 @@ ...@@ -680,8 +718,8 @@
0 tax, 0 tax,
a.place_cash, a.place_cash,
a.place_num, a.place_num,
a.recharge_cash, a.onlinerechargeCash,
a.recharge_num, a.onlinerechargeNum,
a.open_card_cash, a.open_card_cash,
a.open_card_num, a.open_card_num,
a.upgrade_partner_cash, a.upgrade_partner_cash,
...@@ -693,9 +731,9 @@ ...@@ -693,9 +731,9 @@
SELECT SELECT
agent_id, agent_id,
SUM(amount) balance, SUM(amount) balance,
SUM(case when agent_level=4 and reward_type in (50,740,60,760,300,750) then amount * 0.06 else 0 end) techCharge, SUM(case when recharge_time &lt; '2019-08-16 12:03:50' and agent_level=4 and reward_type in (50,740,60,760,300,750) then amount * 0.06 else 0 end) techCharge,
SUM(case when agent_level=4 and reward_type in (50,740) then amount * 0.06 else 0 end) techChargeRedpack, SUM(case when recharge_time &lt; '2019-08-16 12:03:50' and agent_level=4 and reward_type in (50,740) then amount * 0.06 else 0 end) techChargeRedpack,
SUM(case when agent_level=4 and reward_type in (60,760,300,750) then amount * 0.06 else 0 end) techChargeOrder, SUM(case when recharge_time &lt; '2019-08-16 12:03:50' and agent_level=4 and reward_type in (60,760,300,750) then amount * 0.06 else 0 end) techChargeOrder,
SUM(case when reward_type in (40) then amount else 0 end) opencardBalance, SUM(case when reward_type in (40) then amount else 0 end) opencardBalance,
SUM(case when reward_type in (50,740) then amount else 0 end) rechargeBalance, SUM(case when reward_type in (50,740) then amount else 0 end) rechargeBalance,
SUM(case when reward_type in (30,710,720) then amount else 0 end) upgradeBalance, SUM(case when reward_type in (30,710,720) then amount else 0 end) upgradeBalance,
...@@ -705,8 +743,8 @@ ...@@ -705,8 +743,8 @@
SUM(0) pingtuiBalance, SUM(0) pingtuiBalance,
SUM(if(reward_type IN (60, 750, 300, 760),amount, 0)) AS place_cash, SUM(if(reward_type IN (60, 750, 300, 760),amount, 0)) AS place_cash,
COUNT(reward_type IN (60, 750, 300, 760) OR NULL) AS place_num, COUNT(reward_type IN (60, 750, 300, 760) OR NULL) AS place_num,
SUM(if(reward_type IN (50, 740),amount, 0)) AS recharge_cash, SUM(if(reward_type IN (50, 740),amount, 0)) AS onlinerechargeCash,
COUNT(reward_type IN (50, 740) OR NULL) AS recharge_num, COUNT(reward_type IN (50, 740) OR NULL) AS onlinerechargeNum,
SUM(if(reward_type=40, amount, 0)) AS open_card_cash, SUM(if(reward_type=40, amount, 0)) AS open_card_cash,
COUNT(reward_type=40 OR NULL) AS open_card_num, COUNT(reward_type=40 OR NULL) AS open_card_num,
SUM(if(reward_type IN (30, 20, 710, 720, 730),amount, 0)) AS upgrade_partner_cash, SUM(if(reward_type IN (30, 20, 710, 720, 730),amount, 0)) AS upgrade_partner_cash,
...@@ -715,12 +753,13 @@ ...@@ -715,12 +753,13 @@
SUM(if(reward_type IN (30, 20),cash_code, 0)) AS upgrade_market_cash, SUM(if(reward_type IN (30, 20),cash_code, 0)) AS upgrade_market_cash,
SUM(if(reward_type=50, cash_code, 0)) AS recharge_market_cash SUM(if(reward_type=50, cash_code, 0)) AS recharge_market_cash
FROM agent_reward FROM agent_reward
WHERE recharge_time WHERE settle_time
BETWEEN FROM_UNIXTIME(#{beginTs}) AND FROM_UNIXTIME(#{endTs}) BETWEEN FROM_UNIXTIME(#{beginTs}) AND FROM_UNIXTIME(#{endTs})
AND reward_status=100 AND reward_status = 100
AND settle_in_advance = 0
GROUP BY 1 GROUP BY 1
) a ) a
JOIN user_agent b ON a.agent_id=b.agent_id JOIN user_agent b ON a.agent_id = b.agent_id
ORDER BY 1,2,3 ORDER BY 1,2,3
</select> </select>
<select id="selectAgentSettleByTsAndAgentId" resultType="com.lanren.huhu.partner.model.AgentSettle"> <select id="selectAgentSettleByTsAndAgentId" resultType="com.lanren.huhu.partner.model.AgentSettle">
...@@ -742,8 +781,8 @@ ...@@ -742,8 +781,8 @@
0 tax, 0 tax,
a.place_cash, a.place_cash,
a.place_num, a.place_num,
a.recharge_cash, a.onlinerechargeCash,
a.recharge_num, a.onlinerechargeNum,
a.open_card_cash, a.open_card_cash,
a.open_card_num, a.open_card_num,
a.upgrade_partner_cash, a.upgrade_partner_cash,
...@@ -755,9 +794,9 @@ ...@@ -755,9 +794,9 @@
SELECT SELECT
agent_id, agent_id,
SUM(amount) balance, SUM(amount) balance,
SUM(case when agent_level=4 and reward_type in (50,740,60,760,300,750) then amount * 0.06 else 0 end) techCharge, SUM(case when recharge_time &lt; '2019-08-16 12:03:50' and agent_level=4 and reward_type in (50,740,60,760,300,750) then amount * 0.06 else 0 end) techCharge,
SUM(case when agent_level=4 and reward_type in (50,740) then amount * 0.06 else 0 end) techChargeRedpack, SUM(case when recharge_time &lt; '2019-08-16 12:03:50' and agent_level=4 and reward_type in (50,740) then amount * 0.06 else 0 end) techChargeRedpack,
SUM(case when agent_level=4 and reward_type in (60,760,300,750) then amount * 0.06 else 0 end) techChargeOrder, SUM(case when recharge_time &lt; '2019-08-16 12:03:50' and agent_level=4 and reward_type in (60,760,300,750) then amount * 0.06 else 0 end) techChargeOrder,
SUM(case when reward_type in (40) then amount else 0 end) opencardBalance, SUM(case when reward_type in (40) then amount else 0 end) opencardBalance,
SUM(case when reward_type in (50,740) then amount else 0 end) rechargeBalance, SUM(case when reward_type in (50,740) then amount else 0 end) rechargeBalance,
SUM(case when reward_type in (30,710,720) then amount else 0 end) upgradeBalance, SUM(case when reward_type in (30,710,720) then amount else 0 end) upgradeBalance,
...@@ -767,8 +806,8 @@ ...@@ -767,8 +806,8 @@
SUM(0) pingtuiBalance, SUM(0) pingtuiBalance,
SUM(if(reward_type IN (60, 750, 300, 760),amount, 0)) AS place_cash, SUM(if(reward_type IN (60, 750, 300, 760),amount, 0)) AS place_cash,
COUNT(reward_type IN (60, 750, 300, 760) OR NULL) AS place_num, COUNT(reward_type IN (60, 750, 300, 760) OR NULL) AS place_num,
SUM(if(reward_type IN (50, 740),amount, 0)) AS recharge_cash, SUM(if(reward_type IN (50, 740),amount, 0)) AS onlinerechargeCash,
COUNT(reward_type IN (50, 740) OR NULL) AS recharge_num, COUNT(reward_type IN (50, 740) OR NULL) AS onlinerechargeNum,
SUM(if(reward_type=40, amount, 0)) AS open_card_cash, SUM(if(reward_type=40, amount, 0)) AS open_card_cash,
COUNT(reward_type=40 OR NULL) AS open_card_num, COUNT(reward_type=40 OR NULL) AS open_card_num,
SUM(if(reward_type IN (30, 20, 710, 720, 730),amount, 0)) AS upgrade_partner_cash, SUM(if(reward_type IN (30, 20, 710, 720, 730),amount, 0)) AS upgrade_partner_cash,
...@@ -777,10 +816,11 @@ ...@@ -777,10 +816,11 @@
SUM(if(reward_type IN (30, 20),cash_code, 0)) AS upgrade_market_cash, SUM(if(reward_type IN (30, 20),cash_code, 0)) AS upgrade_market_cash,
SUM(if(reward_type=50, cash_code, 0)) AS recharge_market_cash SUM(if(reward_type=50, cash_code, 0)) AS recharge_market_cash
FROM agent_reward FROM agent_reward
WHERE recharge_time WHERE settle_time
BETWEEN FROM_UNIXTIME(#{beginTs}) AND FROM_UNIXTIME(#{endTs}) BETWEEN FROM_UNIXTIME(#{beginTs}) AND FROM_UNIXTIME(#{endTs})
AND reward_status = 100 AND reward_status = 100
AND agent_id = #{agentId} AND agent_id = #{agentId}
AND settle_in_advance = 0
GROUP BY 1 GROUP BY 1
) a ) a
JOIN user_agent b ON a.agent_id = b.agent_id JOIN user_agent b ON a.agent_id = b.agent_id
...@@ -820,11 +860,14 @@ ...@@ -820,11 +860,14 @@
deleted_at, deleted_at,
create_time, create_time,
all_money_ori, all_money_ori,
ratio_all ratio_all,
settle_time,
settle_in_advance
FROM agent_reward FROM agent_reward
WHERE recharge_time BETWEEN FROM_UNIXTIME(#{beginTs}) AND FROM_UNIXTIME(#{endTs}) WHERE settle_time BETWEEN FROM_UNIXTIME(#{beginTs}) AND FROM_UNIXTIME(#{endTs})
AND reward_status = 100 AND reward_status = 100
AND reward_type in (60,760,300,750) AND reward_type in (60,760,300,750)
AND settle_in_advance = 0
ORDER BY id ORDER BY id
</select> </select>
<select id="selectOrderRewardPageByTsAndAgentId" resultMap="BaseResultMap"> <select id="selectOrderRewardPageByTsAndAgentId" resultMap="BaseResultMap">
...@@ -861,20 +904,24 @@ ...@@ -861,20 +904,24 @@
deleted_at, deleted_at,
create_time, create_time,
all_money_ori, all_money_ori,
ratio_all ratio_all,
settle_time,
settle_in_advance
FROM agent_reward FROM agent_reward
WHERE recharge_time BETWEEN FROM_UNIXTIME(#{beginTs}) AND FROM_UNIXTIME(#{endTs}) WHERE settle_time BETWEEN FROM_UNIXTIME(#{beginTs}) AND FROM_UNIXTIME(#{endTs})
AND reward_status = 100 AND reward_status = 100
AND agent_id = #{agentId} AND agent_id = #{agentId}
AND reward_type in (60,760,300,750) AND reward_type in (60,760,300,750)
AND settle_in_advance = 0
ORDER BY id ORDER BY id
</select> </select>
<update id="updateRewardStatusByAgentIdAndTs"> <update id="updateRewardStatusByAgentIdAndTs">
UPDATE agent_reward UPDATE agent_reward
SET reward_status=120, settle_state=case when settle_state>=0 then 300 else settle_state end SET reward_status=120, settle_state=CASE WHEN settle_state>0 THEN 300 WHEN settle_state&lt;0 THEN settle_state ELSE 0 END
WHERE recharge_time WHERE settle_time
BETWEEN FROM_UNIXTIME(#{beginTs}) AND FROM_UNIXTIME(#{endTs}) BETWEEN FROM_UNIXTIME(#{beginTs}) AND FROM_UNIXTIME(#{endTs})
AND agent_id = #{agentId} AND agent_id = #{agentId}
AND reward_status=100 AND reward_status=100
AND settle_in_advance = 0
</update> </update>
</mapper> </mapper>
\ No newline at end of file
...@@ -217,3 +217,17 @@ ADD COLUMN `settle_time` datetime(0) NULL COMMENT '结算奖励的时间: 淘宝 ...@@ -217,3 +217,17 @@ ADD COLUMN `settle_time` datetime(0) NULL COMMENT '结算奖励的时间: 淘宝
ALTER TABLE `huhu`.`agent_reward` ALTER TABLE `huhu`.`agent_reward`
ADD COLUMN `settle_time` datetime(0) NULL COMMENT '结算奖励的时间: 淘宝客/京东联盟为确认收货时间, 其他类型奖励同于recharge_time' AFTER `ratio_all`; ADD COLUMN `settle_time` datetime(0) NULL COMMENT '结算奖励的时间: 淘宝客/京东联盟为确认收货时间, 其他类型奖励同于recharge_time' AFTER `ratio_all`;
添加拓展城市代理商数据
CREATE TABLE `agent_expand_city_agent_detail` (
`dat` date NOT NULL,
`agent_id` int(11) unsigned NOT NULL,
`user_id` int(11) unsigned NOT NULL,
`expand_user_id` int(11) unsigned NOT NULL,
`expand_agent_id` int(11) unsigned NOT NULL,
`expand_agent_time` datetime NOT NULL,
`created_at` int(11) unsigned DEFAULT NULL,
`updated_at` int(11) unsigned DEFAULT NULL,
PRIMARY KEY (`dat`,`agent_id`,`expand_agent_id`) USING BTREE,
KEY `eaid` (`expand_agent_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
\ No newline at end of file
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