From d28313c06a25bd978fa3f86bc2abe86c6da84d49 Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Tue, 9 Jan 2018 17:20:49 +0800 Subject: [PATCH] agentCommission --- .../beans/AgentCommissionAnalysis.java | 86 ++++++++--------- .../impls/CityPartnerPrizeServiceImpl.java | 95 ++++++++++++++----- .../mappers/payment/TransactionMapper.xml | 49 ++++++++-- .../CityPartnerPrizeServiceImplTest.java | 27 ++++++ 4 files changed, 176 insertions(+), 81 deletions(-) create mode 100644 src/test/java/au/com/royalpay/payment/manage/citypartner/core/impls/CityPartnerPrizeServiceImplTest.java diff --git a/src/main/java/au/com/royalpay/payment/manage/citypartner/beans/AgentCommissionAnalysis.java b/src/main/java/au/com/royalpay/payment/manage/citypartner/beans/AgentCommissionAnalysis.java index 96386d03b..d6d98fc9c 100644 --- a/src/main/java/au/com/royalpay/payment/manage/citypartner/beans/AgentCommissionAnalysis.java +++ b/src/main/java/au/com/royalpay/payment/manage/citypartner/beans/AgentCommissionAnalysis.java @@ -18,32 +18,28 @@ public class AgentCommissionAnalysis { private int orgId; private int year; private int month; - private BigDecimal alipayChargeRate; - private BigDecimal wechatChargeRate; - private BigDecimal jdChargeRate; - private BigDecimal alipayonlineChargeRate; private BigDecimal rate; private String channel; private Map> clientAnalysis = new HashMap<>(); private BigDecimal totalGrossAmount = BigDecimal.ZERO; - private BigDecimal totalChargeSum = BigDecimal.ZERO; - private BigDecimal totalRoyalPayCharge = BigDecimal.ZERO; - private BigDecimal totalOrgChargeSum = BigDecimal.ZERO; - private BigDecimal totalnetCharge = BigDecimal.ZERO; + private BigDecimal totalAgentCharge = BigDecimal.ZERO; + private BigDecimal totalAgentNetCharge = BigDecimal.ZERO; + private BigDecimal totalOrgCharge = BigDecimal.ZERO; + private BigDecimal totalOrgNetCharge = BigDecimal.ZERO; + private JSONObject org; + private JSONObject parentOrg; - public AgentCommissionAnalysis(int orgId, int year, int month, BigDecimal rate, String channel, BigDecimal alipayChargeRate, BigDecimal wechatChargeRate, BigDecimal jdChargeRate, BigDecimal alipayonlineChargeRate) { + public AgentCommissionAnalysis(int orgId, int year, int month, BigDecimal rate,String channel,JSONObject org,JSONObject parentOrg) { this.orgId = orgId; this.year = year; this.month = month; this.rate = rate; this.channel = channel; - this.alipayChargeRate = alipayChargeRate; - this.wechatChargeRate = wechatChargeRate; - this.jdChargeRate = jdChargeRate; - this.alipayonlineChargeRate = alipayonlineChargeRate; + this.org = org; + this.parentOrg = parentOrg; } - public AgentCommissionAnalysis attachAnalysis(JSONObject dayAnalysis, String channel) { + public AgentCommissionAnalysis attachAnalysis(JSONObject dayAnalysis,String channel) { int clientId = dayAnalysis.getIntValue("client_id"); List clientTrades = clientAnalysis.get(clientId); if (clientTrades == null) { @@ -51,54 +47,50 @@ public class AgentCommissionAnalysis { clientAnalysis.put(clientId, clientTrades); } Date tradeDate = dayAnalysis.getDate("trade_date"); - BigDecimal total = dayAnalysis.getBigDecimal("total"); + BigDecimal grossAmount = dayAnalysis.getBigDecimal("total"); BigDecimal dayRate = dayAnalysis.getBigDecimal(channel+"_rate_value"); - BigDecimal dayCharge = total.multiply(dayRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP); - - BigDecimal royalpayCharge = total.multiply(rate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP); - - BigDecimal thirdPartyPaymentCharge = BigDecimal.ZERO; + BigDecimal agentCharge = grossAmount.multiply(dayRate.divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP)); + BigDecimal orgCharge = BigDecimal.ZERO; + BigDecimal orgNetCharge = BigDecimal.ZERO; switch (channel){ case "alipay": - thirdPartyPaymentCharge = total.multiply(alipayChargeRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP); + orgCharge = grossAmount.multiply(org.getBigDecimal("alipay_rate_value").divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP)); + orgNetCharge = orgCharge.subtract(grossAmount.multiply(parentOrg.getBigDecimal("alipay_rate_value").divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP))); break; case "wechat": - thirdPartyPaymentCharge = total.multiply(wechatChargeRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP); + orgCharge = grossAmount.multiply(org.getBigDecimal("wechat_rate_value").divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP)); + orgNetCharge = orgCharge.subtract(grossAmount.multiply(parentOrg.getBigDecimal("wechat_rate_value").divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP))); break; case "jd": - thirdPartyPaymentCharge = total.multiply(jdChargeRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP); + orgCharge = grossAmount.multiply(org.getBigDecimal("jd_rate_value").divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP)); + orgNetCharge = orgCharge.subtract(grossAmount.multiply(parentOrg.getBigDecimal("jd_rate_value").divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP))); break; case "alipayonline": - thirdPartyPaymentCharge = total.multiply(alipayonlineChargeRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP); + orgCharge = grossAmount.multiply(org.getBigDecimal("alipayonline_rate_value").divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP)); + orgNetCharge = orgCharge.subtract(grossAmount.multiply(parentOrg.getBigDecimal("alipayonline_rate_value").divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP))); break; default: break; } - BigDecimal netCharge = royalpayCharge.subtract(thirdPartyPaymentCharge); - - - BigDecimal orgCharge = dayCharge.subtract(royalpayCharge); - totalGrossAmount = totalGrossAmount.add(total); - totalChargeSum = totalChargeSum.add(dayCharge); - totalRoyalPayCharge = totalRoyalPayCharge.add(royalpayCharge); - totalOrgChargeSum = totalOrgChargeSum.add(orgCharge); - totalnetCharge = totalnetCharge.add(netCharge); + totalGrossAmount = totalGrossAmount.add(grossAmount); + totalAgentCharge = totalAgentCharge.add(agentCharge); + totalAgentNetCharge = totalAgentNetCharge.add(orgNetCharge); + totalOrgCharge = totalOrgCharge.add(orgCharge); + totalOrgNetCharge = totalOrgNetCharge.add(orgNetCharge); if (!clientTrades.isEmpty()) { JSONObject item = clientTrades.get(clientTrades.size() - 1); BigDecimal rate = item.getBigDecimal("client_rate"); if (rate.compareTo(dayRate) == 0) { - BigDecimal gross = item.getBigDecimal("gross_amount").add(total); + BigDecimal gross = item.getBigDecimal("gross_amount").add(grossAmount); item.put("gross_amount", gross); - BigDecimal totalCharge = item.getBigDecimal("total_charge").add(dayCharge); + BigDecimal totalCharge = item.getBigDecimal("total_charge").add(agentCharge); item.put("total_charge", totalCharge); - BigDecimal totalRoyalCharge = item.getBigDecimal("royalpay_charge").add(royalpayCharge); - item.put("royalpay_charge", totalRoyalCharge); BigDecimal totalOrgCharge = item.getBigDecimal("org_charge").add(orgCharge); item.put("org_charge", totalOrgCharge); - BigDecimal totalRoyalpayClearingCharge = item.getBigDecimal("net_charge").add(netCharge); - item.put("net_charge", totalRoyalpayClearingCharge); + BigDecimal totalRoyalpayClearingCharge = item.getBigDecimal("org_net_charge").add(orgNetCharge); + item.put("org_net_charge", totalRoyalpayClearingCharge); Date from = item.getDate("date_from"); Date to = item.getDate("date_to"); from = from.before(tradeDate) ? from : tradeDate; @@ -114,12 +106,11 @@ public class AgentCommissionAnalysis { item.put("date_from", tradeDate); item.put("date_to", tradeDate); item.put("client_rate", dayRate); - item.put("gross_amount", total); - item.put("total_charge", dayCharge); - item.put("royalpay_charge", royalpayCharge); + item.put("gross_amount", grossAmount); + item.put("total_charge", agentCharge); item.put("org_charge", orgCharge); item.put("channel",channel); - item.put("net_charge",netCharge); + item.put("org_net_charge",orgNetCharge); clientTrades.add(item); return this; } @@ -132,10 +123,9 @@ public class AgentCommissionAnalysis { result.put("create_time", new Date()); result.put("org_rate", rate); result.put("gross_amount", totalGrossAmount); - result.put("total_charge", totalChargeSum); - result.put("royalpay_charge", totalRoyalPayCharge); - result.put("org_charge", totalOrgChargeSum); - result.put("net_charge",totalnetCharge); + result.put("total_charge", totalAgentCharge); + result.put("org_charge", totalOrgCharge); + result.put("org_net_charge",totalOrgNetCharge); result.put("channel",channel); return result; } @@ -152,4 +142,4 @@ public class AgentCommissionAnalysis { } return list; } -} +} \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/citypartner/core/impls/CityPartnerPrizeServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/citypartner/core/impls/CityPartnerPrizeServiceImpl.java index a29ccdb5c..dfb0606cf 100644 --- a/src/main/java/au/com/royalpay/payment/manage/citypartner/core/impls/CityPartnerPrizeServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/citypartner/core/impls/CityPartnerPrizeServiceImpl.java @@ -1,5 +1,26 @@ package au.com.royalpay.payment.manage.citypartner.core.impls; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.alibaba.fastjson.JSONObject; + +import au.com.royalpay.payment.manage.citypartner.beans.AgentCommissionAnalysis; import au.com.royalpay.payment.manage.citypartner.beans.CityPartnerCommissionAnalysis; import au.com.royalpay.payment.manage.citypartner.beans.ReferrerCommissionAnalysis; import au.com.royalpay.payment.manage.citypartner.core.CityPartnerPrizeService; @@ -14,18 +35,6 @@ import au.com.royalpay.payment.manage.mappers.system.OrgMapper; import au.com.royalpay.payment.tools.env.SysConfigManager; import au.com.royalpay.payment.tools.exceptions.BadRequestException; import au.com.royalpay.payment.tools.exceptions.ServerErrorException; -import com.alibaba.fastjson.JSONObject; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.time.DateUtils; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.math.BigDecimal; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; /** * Created by yixian on 2017-03-08. @@ -339,25 +348,65 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService { financialAgentCommissionDetailMapper.clearData(year, month); financialAgentCommissionMapper.clearData(year, month); - + JSONObject sysConfig = sysConfigManager.getSysConfig(); + BigDecimal alipayChargeRate = new BigDecimal("0.6"); + BigDecimal wechatChargeRate = new BigDecimal("0.6"); + BigDecimal jdChargeRate = new BigDecimal("0.9"); + BigDecimal alipayonlineChargeRate = new BigDecimal("2.0"); + if (sysConfig.getBigDecimal("Alipay_charge_rate") != null) { + alipayChargeRate = sysConfig.getBigDecimal("Alipay_charge_rate"); + } + if (sysConfig.getBigDecimal("Wechat_charge_rate") != null) { + wechatChargeRate = sysConfig.getBigDecimal("Wechat_charge_rate"); + } + if (sysConfig.getBigDecimal("jd_charge_rate") != null) { + jdChargeRate = sysConfig.getBigDecimal("jd_charge_rate"); + } + if (sysConfig.getBigDecimal("alipayonline_charge_rate") != null) { + alipayonlineChargeRate = sysConfig.getBigDecimal("alipayonline_charge_rate"); + } + HashMap channelMap = new HashMap<>(); + channelMap.put("Alipay", "Alipay"); + channelMap.put("Wechat", "Wechat"); + channelMap.put("Bestpay", "Bestpay"); + channelMap.put("jd","jd"); + channelMap.put("AlipayOnline","AlipayOnline"); List transactionAnalysis = transactionMapper.listTransactionsForAgentCommission(year, month); - Map results = new HashMap<>(); + Map results = new HashMap<>(); for (JSONObject analysisDay : transactionAnalysis) { - Integer orgId = analysisDay.getInteger("org_id"); - ReferrerCommissionAnalysis referrerCommissionAnalysis = results.get(orgId); - if (referrerCommissionAnalysis == null) { - referrerCommissionAnalysis = new ReferrerCommissionAnalysis(orgId, year, month, analysisDay.getBigDecimal("rate_value")); - results.put(orgId, referrerCommissionAnalysis); + String key = analysisDay.getString("channel"); + String channel = analysisDay.getString("channel"); + if (!channelMap.containsKey(key)) { + continue; } - referrerCommissionAnalysis.attachAnalysis(analysisDay); + int orgId = analysisDay.getIntValue("org_id"); + + JSONObject org = orgMapper.findOne(orgId); + if (org == null) { + // shall never happen + throw new ServerErrorException("Organization Id not exists:" + orgId); + } + JSONObject parnetOrg = orgMapper.findOne(org.getIntValue("parent_org_id")); + if (parnetOrg == null) { + // shall never happen + throw new ServerErrorException("Organization Parent Id not exists:" + org.getIntValue("parent_org_id")); + } + channel = channel.toLowerCase(); + AgentCommissionAnalysis agentCommissionAnalysis = results.get(orgId + channel); + if (agentCommissionAnalysis == null) { + agentCommissionAnalysis = new AgentCommissionAnalysis(orgId, year, month, org.getBigDecimal(channel + "_rate_value"), key,org,parnetOrg); + results.put(orgId + channel, agentCommissionAnalysis); + } + agentCommissionAnalysis.attachAnalysis(analysisDay, channel); + } - for (ReferrerCommissionAnalysis commission : results.values()) { + for (AgentCommissionAnalysis commission : results.values()) { JSONObject commissionAnalysis = commission.totalCommission(); - financialReferrerCommissionMapper.save(commissionAnalysis); + financialAgentCommissionMapper.save(commissionAnalysis); String recordId = commissionAnalysis.getString("record_id"); List details = commission.getCommissionDetails(recordId); for (JSONObject detail : details) { - financialReferrerCommissionDetailMapper.save(detail); + financialAgentCommissionDetailMapper.save(detail); } } } diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml index 0e95f42a4..7289e89f3 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml @@ -510,21 +510,50 @@ diff --git a/src/test/java/au/com/royalpay/payment/manage/citypartner/core/impls/CityPartnerPrizeServiceImplTest.java b/src/test/java/au/com/royalpay/payment/manage/citypartner/core/impls/CityPartnerPrizeServiceImplTest.java new file mode 100644 index 000000000..b172dd524 --- /dev/null +++ b/src/test/java/au/com/royalpay/payment/manage/citypartner/core/impls/CityPartnerPrizeServiceImplTest.java @@ -0,0 +1,27 @@ +package au.com.royalpay.payment.manage.citypartner.core.impls; + +import au.com.royalpay.payment.manage.citypartner.core.CityPartnerPrizeService; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; + +/** + * Created by wangning on 09/01/2018. + */ +@SpringBootTest +@ActiveProfiles({"local","alipay","wechat","jd","bestpay"}) +@RunWith(SpringRunner.class) +public class CityPartnerPrizeServiceImplTest { + @Resource + private CityPartnerPrizeService cityPartnerPrizeService; + @Test + public void generateAgent() throws Exception { + cityPartnerPrizeService.generateAgent("2017-06"); + } + +} \ No newline at end of file