diff --git a/src/db/modify.sql b/src/db/modify.sql
index e67bdfd22..41c6cf7c8 100644
--- a/src/db/modify.sql
+++ b/src/db/modify.sql
@@ -139,10 +139,49 @@ ALTER TABLE sys_clients_customers ADD COLUMN channel varchar(15) not NULL ;
ALTER TABLE sys_clients_customers ADD COLUMN last_payment_time datetime DEFAULT NULL COMMENT '最后一次付款时间';
ALTER TABLE sys_org ADD COLUMN parent_org_id int(11) DEFAULT NULL;
-ALTER TABLE sys_org ADD COLUMN min_wechat_rate DECIMAL(3,2) DEFAULT 'NULL' COMMENT '旗下商户最低微信费率';
-ALTER TABLE sys_org ADD COLUMN min_alipay_rate DECIMAL(3,2) DEFAULT 'NULL' COMMENT '旗下商户最低支付宝费率';
-ALTER TABLE sys_org ADD COLUMN min_alipayonline_rate DECIMAL(3,2) DEFAULT 'NULL' COMMENT '旗下商户最低支付宝线上费率';
-ALTER TABLE sys_org ADD COLUMN min_bestpay_rate DECIMAL(3,2) DEFAULT 'NULL' COMMENT '旗下商户最低翼支付费率';
-ALTER TABLE sys_org ADD COLUMN min_jd_rate DECIMAL(3,2) DEFAULT 'NULL' COMMENT '旗下商户最低京东费率';
+ALTER TABLE sys_org ADD COLUMN min_wechat_rate DECIMAL(3,2) DEFAULT NULL COMMENT '旗下商户最低微信费率';
+ALTER TABLE sys_org ADD COLUMN min_alipay_rate DECIMAL(3,2) DEFAULT NULL COMMENT '旗下商户最低支付宝费率';
+ALTER TABLE sys_org ADD COLUMN min_alipayonline_rate DECIMAL(3,2) DEFAULT NULL COMMENT '旗下商户最低支付宝线上费率';
+ALTER TABLE sys_org ADD COLUMN min_bestpay_rate DECIMAL(3,2) DEFAULT NULL COMMENT '旗下商户最低翼支付费率';
+ALTER TABLE sys_org ADD COLUMN min_jd_rate DECIMAL(3,2) DEFAULT NULL COMMENT '旗下商户最低京东费率';
ALTER TABLE sys_org ADD COLUMN commission_type SMALLINT(1) DEFAULT '1' COMMENT '提成类型 1:渠道计算法 2:总交易额比例 3:收益比例';
+
+
+--agent_commission
+
+CREATE TABLE `financial_agent_commission` (
+ `record_id` varchar(50) NOT NULL,
+ `org_id` int(11) NOT NULL,
+ `year` smallint(6) NOT NULL,
+ `month` smallint(6) NOT NULL,
+ `create_time` datetime NOT NULL,
+ `org_rate` decimal(5,2) DEFAULT NULL COMMENT '保底费率(RoyalPay抽取)',
+ `gross_amount` decimal(12,2) NOT NULL COMMENT '支付-退款',
+ `total_charge` decimal(12,2) NOT NULL COMMENT '总手续费',
+ `org_charge` decimal(12,2) NOT NULL COMMENT '合伙人手续',
+ `channel` varchar(12) NOT NULL,
+ `org_net_charge` decimal(12,2) DEFAULT NULL COMMENT '净值',
+ PRIMARY KEY (`record_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='二级代理商提成';
+
+CREATE TABLE `financial_agent_commission_detail` (
+ `detail_id` varchar(50) NOT NULL,
+ `year` smallint(6) NOT NULL,
+ `month` smallint(6) NOT NULL,
+ `record_id` varchar(50) NOT NULL,
+ `client_id` int(11) NOT NULL,
+ `client_rate` decimal(5,2) NOT NULL,
+ `date_from` date NOT NULL,
+ `date_to` date NOT NULL,
+ `gross_amount` decimal(12,2) NOT NULL COMMENT '总支付-总退款',
+ `total_charge` decimal(12,2) NOT NULL COMMENT '总手续费',
+ `org_charge` decimal(12,2) NOT NULL COMMENT '合伙人所得手续费',
+ `channel` varchar(15) NOT NULL,
+ `org_net_charge` decimal(12,2) DEFAULT NULL COMMENT '净值',
+ PRIMARY KEY (`detail_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
+
+
+alter table financial_partner_commission add column commission_type smallint(1) DEFAULT 1 COMMENT '提成类型 1:渠道计算法 2:总交易额比例 3:收益比例';
+alter table financial_partner_commission_detail add column commission_type smallint(1) DEFAULT 1 COMMENT '提成类型 1:渠道计算法 2:总交易额比例 3:收益比例';
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
new file mode 100644
index 000000000..d6d98fc9c
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/citypartner/beans/AgentCommissionAnalysis.java
@@ -0,0 +1,145 @@
+package au.com.royalpay.payment.manage.citypartner.beans;
+
+import au.com.royalpay.payment.tools.CommonConsts;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by yixian on 2017-03-08.
+ */
+public class AgentCommissionAnalysis {
+ private int orgId;
+ private int year;
+ private int month;
+ private BigDecimal rate;
+ private String channel;
+ private Map> clientAnalysis = new HashMap<>();
+ private BigDecimal totalGrossAmount = 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,JSONObject org,JSONObject parentOrg) {
+ this.orgId = orgId;
+ this.year = year;
+ this.month = month;
+ this.rate = rate;
+ this.channel = channel;
+ this.org = org;
+ this.parentOrg = parentOrg;
+ }
+
+ public AgentCommissionAnalysis attachAnalysis(JSONObject dayAnalysis,String channel) {
+ int clientId = dayAnalysis.getIntValue("client_id");
+ List clientTrades = clientAnalysis.get(clientId);
+ if (clientTrades == null) {
+ clientTrades = new ArrayList<>();
+ clientAnalysis.put(clientId, clientTrades);
+ }
+ Date tradeDate = dayAnalysis.getDate("trade_date");
+ BigDecimal grossAmount = dayAnalysis.getBigDecimal("total");
+ BigDecimal dayRate = dayAnalysis.getBigDecimal(channel+"_rate_value");
+ 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":
+ 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":
+ 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":
+ 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":
+ 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;
+ }
+
+
+ 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(grossAmount);
+ item.put("gross_amount", gross);
+ BigDecimal totalCharge = item.getBigDecimal("total_charge").add(agentCharge);
+ item.put("total_charge", totalCharge);
+ BigDecimal totalOrgCharge = item.getBigDecimal("org_charge").add(orgCharge);
+ item.put("org_charge", totalOrgCharge);
+ 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;
+ to = to.after(tradeDate) ? to : tradeDate;
+ item.put("date_from", from);
+ item.put("date_to", to);
+ return this;
+ }
+ }
+ JSONObject item = new JSONObject();
+ item.put("year", year);
+ item.put("month", month);
+ item.put("date_from", tradeDate);
+ item.put("date_to", tradeDate);
+ item.put("client_rate", dayRate);
+ item.put("gross_amount", grossAmount);
+ item.put("total_charge", agentCharge);
+ item.put("org_charge", orgCharge);
+ item.put("channel",channel);
+ item.put("org_net_charge",orgNetCharge);
+ clientTrades.add(item);
+ return this;
+ }
+
+ public JSONObject totalCommission() {
+ JSONObject result = new JSONObject();
+ result.put("org_id", orgId);
+ result.put("year", year);
+ result.put("month", month);
+ result.put("create_time", new Date());
+ result.put("org_rate", rate);
+ result.put("gross_amount", totalGrossAmount);
+ result.put("total_charge", totalAgentCharge);
+ result.put("org_charge", totalOrgCharge);
+ result.put("org_net_charge",totalOrgNetCharge);
+ result.put("channel",channel);
+ return result;
+ }
+
+ public List getCommissionDetails(String recordId) {
+ List list = new ArrayList<>();
+ for (Map.Entry> entry : clientAnalysis.entrySet()) {
+ int clientId = entry.getKey();
+ for (JSONObject item : entry.getValue()) {
+ item.put("client_id", clientId);
+ item.put("record_id", recordId);
+ list.add(item);
+ }
+ }
+ return list;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/au/com/royalpay/payment/manage/citypartner/beans/CityPartnerCommissionAnalysis.java b/src/main/java/au/com/royalpay/payment/manage/citypartner/beans/CityPartnerCommissionAnalysis.java
index 932b55ec3..b026765bc 100644
--- a/src/main/java/au/com/royalpay/payment/manage/citypartner/beans/CityPartnerCommissionAnalysis.java
+++ b/src/main/java/au/com/royalpay/payment/manage/citypartner/beans/CityPartnerCommissionAnalysis.java
@@ -1,6 +1,8 @@
package au.com.royalpay.payment.manage.citypartner.beans;
import au.com.royalpay.payment.tools.CommonConsts;
+import au.com.royalpay.payment.tools.exceptions.ServerErrorException;
+
import com.alibaba.fastjson.JSONObject;
import java.math.BigDecimal;
@@ -18,7 +20,9 @@ public class CityPartnerCommissionAnalysis {
private BigDecimal jdChargeRate;
private BigDecimal alipayonlineChargeRate;
private BigDecimal rate;
+ private BigDecimal orgRate;
private String channel;
+ private int commissionType;
private Map> clientAnalysis = new HashMap<>();
private BigDecimal totalGrossAmount = BigDecimal.ZERO;
private BigDecimal totalChargeSum = BigDecimal.ZERO;
@@ -26,19 +30,34 @@ public class CityPartnerCommissionAnalysis {
private BigDecimal totalOrgChargeSum = BigDecimal.ZERO;
private BigDecimal totalnetCharge = BigDecimal.ZERO;
- public CityPartnerCommissionAnalysis(int orgId, int year, int month, BigDecimal rate,String channel,BigDecimal alipayChargeRate,BigDecimal wechatChargeRate,BigDecimal jdChargeRate,BigDecimal alipayonlineChargeRate) {
+ public CityPartnerCommissionAnalysis(int orgId, int year, int month, BigDecimal rate, String channel, BigDecimal alipayChargeRate,
+ BigDecimal wechatChargeRate, BigDecimal jdChargeRate, BigDecimal alipayonlineChargeRate, BigDecimal orgRate,int commissionType) {
this.orgId = orgId;
this.year = year;
this.month = month;
this.rate = rate;
this.channel = channel;
+ this.commissionType = commissionType;
this.alipayChargeRate = alipayChargeRate;
this.wechatChargeRate = wechatChargeRate;
this.jdChargeRate = jdChargeRate;
this.alipayonlineChargeRate = alipayonlineChargeRate;
+ this.orgRate = orgRate;
}
- public CityPartnerCommissionAnalysis attachAnalysis(JSONObject dayAnalysis,String channel) {
+ public CityPartnerCommissionAnalysis calculator(JSONObject dayAnalysis, String channel, int type) {
+ switch (type) {
+ case 1:
+ return attachAnalysis(dayAnalysis, channel);
+ case 3:
+ return attachNetCommissionAnalysis(dayAnalysis, channel);
+ default:
+ throw new ServerErrorException("unkonw calculate type");
+ }
+
+ }
+
+ public CityPartnerCommissionAnalysis attachAnalysis(JSONObject dayAnalysis, String channel) {
int clientId = dayAnalysis.getIntValue("client_id");
List clientTrades = clientAnalysis.get(clientId);
if (clientTrades == null) {
@@ -47,31 +66,13 @@ public class CityPartnerCommissionAnalysis {
}
Date tradeDate = dayAnalysis.getDate("trade_date");
BigDecimal total = dayAnalysis.getBigDecimal("total");
- BigDecimal dayRate = dayAnalysis.getBigDecimal(channel+"_rate_value");
+ 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;
- switch (channel){
- case "alipay":
- thirdPartyPaymentCharge = total.multiply(alipayChargeRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP);
- break;
- case "wechat":
- thirdPartyPaymentCharge = total.multiply(wechatChargeRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP);
- break;
- case "jd":
- thirdPartyPaymentCharge = total.multiply(jdChargeRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP);
- break;
- case "alipayonline":
- thirdPartyPaymentCharge = total.multiply(alipayonlineChargeRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP);
- break;
- default:
- break;
- }
-
- BigDecimal netCharge = royalpayCharge.subtract(thirdPartyPaymentCharge);
-
+ BigDecimal thirdPartyPaymentCharge = getThirdPartyCharge(channel, total);
+ BigDecimal netCharge = royalpayCharge.subtract(thirdPartyPaymentCharge);
BigDecimal orgCharge = dayCharge.subtract(royalpayCharge);
@@ -113,8 +114,9 @@ public class CityPartnerCommissionAnalysis {
item.put("total_charge", dayCharge);
item.put("royalpay_charge", royalpayCharge);
item.put("org_charge", orgCharge);
- item.put("channel",channel);
- item.put("net_charge",netCharge);
+ item.put("channel", channel);
+ item.put("net_charge", netCharge);
+ item.put("commission_type",commissionType);
clientTrades.add(item);
return this;
}
@@ -130,8 +132,9 @@ public class CityPartnerCommissionAnalysis {
result.put("total_charge", totalChargeSum);
result.put("royalpay_charge", totalRoyalPayCharge);
result.put("org_charge", totalOrgChargeSum);
- result.put("net_charge",totalnetCharge);
- result.put("channel",channel);
+ result.put("net_charge", totalnetCharge);
+ result.put("channel", channel);
+ result.put("commission_type",commissionType);
return result;
}
@@ -147,4 +150,87 @@ public class CityPartnerCommissionAnalysis {
}
return list;
}
+
+ public CityPartnerCommissionAnalysis attachNetCommissionAnalysis(JSONObject dayAnalysis, String channel) {
+ int clientId = dayAnalysis.getIntValue("client_id");
+ List clientTrades = clientAnalysis.get(clientId);
+ if (clientTrades == null) {
+ clientTrades = new ArrayList<>();
+ clientAnalysis.put(clientId, clientTrades);
+ }
+ Date tradeDate = dayAnalysis.getDate("trade_date");
+ BigDecimal total = 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 = getThirdPartyCharge(channel, total);
+ BigDecimal netCharge = royalpayCharge.subtract(thirdPartyPaymentCharge);
+ BigDecimal orgCharge = netCharge.multiply(orgRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP);
+ totalGrossAmount = totalGrossAmount.add(total);
+ totalChargeSum = totalChargeSum.add(dayCharge);
+ totalRoyalPayCharge = totalRoyalPayCharge.add(royalpayCharge);
+ totalOrgChargeSum = totalOrgChargeSum.add(orgCharge);
+ totalnetCharge = totalnetCharge.add(netCharge);
+ 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);
+ item.put("gross_amount", gross);
+ BigDecimal totalCharge = item.getBigDecimal("total_charge").add(dayCharge);
+ 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);
+ Date from = item.getDate("date_from");
+ Date to = item.getDate("date_to");
+ from = from.before(tradeDate) ? from : tradeDate;
+ to = to.after(tradeDate) ? to : tradeDate;
+ item.put("date_from", from);
+ item.put("date_to", to);
+ return this;
+ }
+ }
+ JSONObject item = new JSONObject();
+ item.put("year", year);
+ item.put("month", month);
+ 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("org_charge", orgCharge);
+ item.put("channel", channel);
+ item.put("net_charge", netCharge);
+ clientTrades.add(item);
+ return this;
+ }
+
+ private BigDecimal getThirdPartyCharge(String channel, BigDecimal total) {
+ BigDecimal thirdPartyPaymentCharge = BigDecimal.ZERO;
+ switch (channel) {
+ case "alipay":
+ thirdPartyPaymentCharge = total.multiply(alipayChargeRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP);
+ break;
+ case "wechat":
+ thirdPartyPaymentCharge = total.multiply(wechatChargeRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP);
+ break;
+ case "jd":
+ thirdPartyPaymentCharge = total.multiply(jdChargeRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP);
+ break;
+ case "alipayonline":
+ thirdPartyPaymentCharge = total.multiply(alipayonlineChargeRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP);
+ break;
+ default:
+ break;
+ }
+ return thirdPartyPaymentCharge;
+ }
+
}
diff --git a/src/main/java/au/com/royalpay/payment/manage/citypartner/beans/ReferrerCommissionAnalysis.java b/src/main/java/au/com/royalpay/payment/manage/citypartner/beans/ReferrerCommissionAnalysis.java
index 8aa123851..f3c71e8b6 100644
--- a/src/main/java/au/com/royalpay/payment/manage/citypartner/beans/ReferrerCommissionAnalysis.java
+++ b/src/main/java/au/com/royalpay/payment/manage/citypartner/beans/ReferrerCommissionAnalysis.java
@@ -36,7 +36,6 @@ public class ReferrerCommissionAnalysis {
BigDecimal total = dayAnalysis.getBigDecimal("total");
BigDecimal orgCharge = total.multiply(referrerRate).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP);
Date tradeDate = dayAnalysis.getDate("trade_date");
- BigDecimal dayRate = dayAnalysis.getBigDecimal("rate_value");
totalGrossAmount = totalGrossAmount.add(total);
totalOrgChargeSum = totalOrgChargeSum.add(orgCharge);
diff --git a/src/main/java/au/com/royalpay/payment/manage/citypartner/core/CityPartnerPrizeService.java b/src/main/java/au/com/royalpay/payment/manage/citypartner/core/CityPartnerPrizeService.java
index 2d432e60f..23817ffa3 100644
--- a/src/main/java/au/com/royalpay/payment/manage/citypartner/core/CityPartnerPrizeService.java
+++ b/src/main/java/au/com/royalpay/payment/manage/citypartner/core/CityPartnerPrizeService.java
@@ -29,5 +29,15 @@ public interface CityPartnerPrizeService {
List getReferrerPrizeInfoList(String monthStr);
+ void generateAgent(String month,int orgId);
+
+ List listAgentAvailableMonths(String year);
+
+ JSONObject getAgentPrizeInfo(String monthStr);
+
+ JSONObject getAgentPrizeDetail(String monthStr, String orgId);
+
+ List getAgentPrizeInfoList(String monthStr);
+
}
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 08d9a8bc8..71f147ec8 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,8 +1,33 @@
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.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+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;
+import au.com.royalpay.payment.manage.mappers.financial.FinancialAgentCommissionDetailMapper;
+import au.com.royalpay.payment.manage.mappers.financial.FinancialAgentCommissionMapper;
import au.com.royalpay.payment.manage.mappers.financial.FinancialPartnerCommissionDetailMapper;
import au.com.royalpay.payment.manage.mappers.financial.FinancialPartnerCommissionMapper;
import au.com.royalpay.payment.manage.mappers.financial.FinancialReferrerCommissionDetailMapper;
@@ -12,18 +37,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.
@@ -41,6 +54,10 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService {
@Resource
private FinancialReferrerCommissionDetailMapper financialReferrerCommissionDetailMapper;
@Resource
+ private FinancialAgentCommissionDetailMapper financialAgentCommissionDetailMapper;
+ @Resource
+ private FinancialAgentCommissionMapper financialAgentCommissionMapper;
+ @Resource
private FinancialReferrerCommissionMapper financialReferrerCommissionMapper;
@Resource
private SysConfigManager sysConfigManager;
@@ -180,6 +197,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService {
BigDecimal netCharge = BigDecimal.ZERO;
BigDecimal orgCharge = BigDecimal.ZERO;
String clientMoniker = "";
+ int type = 1;
for (JSONObject jsonObject : entry.getValue()) {
grossAmount = grossAmount.add(jsonObject.getBigDecimal("gross_amount"));
totalCharge = totalCharge.add(jsonObject.getBigDecimal("total_charge"));
@@ -189,6 +207,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService {
netCharge = netCharge.add(jsonObject.getBigDecimal("net_charge"));
}
clientMoniker = jsonObject.getString("client_moniker");
+ type = jsonObject.getIntValue("type");
}
resultGrossAmount = resultGrossAmount.add(grossAmount);
resultTotalCharge = resultTotalCharge.add(totalCharge);
@@ -202,6 +221,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService {
sumResult.put("net_charge", netCharge);
sumResult.put("client_moniker", clientMoniker);
sumResult.put("channel_detail", entry.getValue());
+ sumResult.put("type",type);
partnerClientInfos.add(sumResult);
}
result.put("partner_client_infos", partnerClientInfos);
@@ -227,8 +247,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService {
int year = monthCal.get(Calendar.YEAR);
int month = monthCal.get(Calendar.MONTH) + 1;
- financialPartnerCommissionDetailMapper.clearData(year, month);
- financialPartnerCommissionMapper.clearData(year, month);
+
JSONObject sysConfig = sysConfigManager.getSysConfig();
BigDecimal alipayChargeRate = new BigDecimal("0.6");
BigDecimal wechatChargeRate = new BigDecimal("0.6");
@@ -250,31 +269,38 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService {
channelMap.put("Alipay", "Alipay");
channelMap.put("Wechat", "Wechat");
channelMap.put("Bestpay", "Bestpay");
- channelMap.put("jd","jd");
- channelMap.put("AlipayOnline","AlipayOnline");
+ channelMap.put("jd", "jd");
+ channelMap.put("AlipayOnline", "AlipayOnline");
+ Set orgIds = new HashSet<>();
List transactionAnalysis = transactionMapper.listTransactionsForCityPartnerCommission(year, month);
Map results = new HashMap<>();
for (JSONObject analysisDay : transactionAnalysis) {
- String key = analysisDay.getString("channel");
- String channel = analysisDay.getString("channel");
- if (!channelMap.containsKey(key)) {
- continue;
- }
int orgId = analysisDay.getIntValue("org_id");
-
JSONObject org = orgMapper.findOne(orgId);
+ if(org.getIntValue("parent_org_id")>0){
+ orgIds.add(orgId);
+ }
if (org == null) {
// shall never happen
throw new ServerErrorException("Organization Id not exists:" + orgId);
}
+ financialPartnerCommissionDetailMapper.clearData(year, month,org.getIntValue("commission_type"));
+ financialPartnerCommissionMapper.clearData(year, month,org.getIntValue("commission_type"));
+
+
+ String key = analysisDay.getString("channel");
+ String channel = analysisDay.getString("channel");
+ if (!channelMap.containsKey(key)) {
+ continue;
+ }
channel = channel.toLowerCase();
CityPartnerCommissionAnalysis orgAnalysis = results.get(orgId + channel);
if (orgAnalysis == null) {
orgAnalysis = new CityPartnerCommissionAnalysis(orgId, year, month, org.getBigDecimal(channel + "_rate_value"), key, alipayChargeRate,
- wechatChargeRate,jdChargeRate,alipayonlineChargeRate);
+ wechatChargeRate, jdChargeRate, alipayonlineChargeRate,org.getBigDecimal("rate_value"),org.getIntValue("commission_type"));
results.put(orgId + channel, orgAnalysis);
}
- orgAnalysis.attachAnalysis(analysisDay, channel);
+ orgAnalysis.calculator(analysisDay, channel,org.getIntValue("commission_type"));
}
for (CityPartnerCommissionAnalysis commission : results.values()) {
@@ -286,7 +312,12 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService {
financialPartnerCommissionDetailMapper.save(detail);
}
}
-
+ Runnable task = ()->{
+ orgIds.forEach((p)->{
+ generateAgent(monthStr,p);
+ });
+ };
+ new Thread(task).start();
}
@Override
@@ -323,6 +354,62 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService {
}
}
+ @Override
+ @Transactional
+ public void generateAgent(String monthStr, int orgId) {
+ 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"));
+ }
+
+ Date mon = checkMonth(monthStr);
+ Calendar monthCal = Calendar.getInstance();
+ monthCal.setTime(mon);
+ int year = monthCal.get(Calendar.YEAR);
+ int month = monthCal.get(Calendar.MONTH) + 1;
+
+ financialAgentCommissionDetailMapper.clearData(year, month);
+ financialAgentCommissionMapper.clearData(year, month);
+ 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, org.getIntValue("parent_org_id"));
+ Map results = new HashMap<>();
+ for (JSONObject analysisDay : transactionAnalysis) {
+ String key = analysisDay.getString("channel");
+ String channel = analysisDay.getString("channel");
+ if (!channelMap.containsKey(key)) {
+ continue;
+ }
+ 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 (AgentCommissionAnalysis commission : results.values()) {
+ JSONObject commissionAnalysis = commission.totalCommission();
+ financialAgentCommissionMapper.save(commissionAnalysis);
+ String recordId = commissionAnalysis.getString("record_id");
+ List details = commission.getCommissionDetails(recordId);
+ for (JSONObject detail : details) {
+ financialAgentCommissionDetailMapper.save(detail);
+ }
+ }
+ }
+
@Override
public List listReferrerAvailableMonths(String year) {
int yearNum = checkValidYear(year);
@@ -438,4 +525,176 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService {
}
}
+ @Override
+ public List listAgentAvailableMonths(String year) {
+ int yearNum = checkValidYear(year);
+ List months = financialAgentCommissionMapper.listAvailableMonths(yearNum);
+ List monthObjs = new ArrayList<>();
+ for (Integer mon : months) {
+ JSONObject item = new JSONObject();
+ item.put("month", mon);
+ item.put("monthstr", year + "-" + StringUtils.substring("00" + mon, -2));
+ JSONObject chargeInfo = getAgentPrizeInfo(item.getString("monthstr"));
+ item.put("org_charge", chargeInfo.getString("org_charge"));
+ item.put("gross_amount", chargeInfo.getString("gross_amount"));
+ item.put("total_charge", chargeInfo.getString("total_charge"));
+ monthObjs.add(item);
+ }
+ return monthObjs;
+ }
+
+ @Override
+ public JSONObject getAgentPrizeInfo(String monthStr) {
+ Date monthDate = parseMonth(monthStr);
+ Calendar monthCal = Calendar.getInstance();
+ monthCal.setTime(monthDate);
+ int year = monthCal.get(Calendar.YEAR);
+ int month = monthCal.get(Calendar.MONTH) + 1;
+ JSONObject sum = new JSONObject();
+ sum.put("gross_amount", 0);
+ sum.put("org_charge", 0);
+ sum.put("total_charge",0);
+ List referrerPrizes = financialAgentCommissionMapper.list(year, month);
+ for (JSONObject prize : referrerPrizes) {
+ plusKey(sum, prize, "gross_amount");
+ plusKey(sum, prize, "org_charge");
+ plusKey(sum, prize, "total_charge");
+ prize.put("monthstr", monthStr);
+ }
+ sum.put("referrer", referrerPrizes);
+ sum.put("monthstr", monthStr);
+ return sum;
+ }
+
+ @Override
+ public JSONObject getAgentPrizeDetail(String monthStr, String orgId) {
+
+ Date monthDate = parseMonth(monthStr);
+ Calendar monthCal = Calendar.getInstance();
+ monthCal.setTime(monthDate);
+ int year = monthCal.get(Calendar.YEAR);
+ int month = monthCal.get(Calendar.MONTH) + 1;
+ JSONObject result = new JSONObject();
+
+ List total = financialAgentCommissionMapper.find(year, month, orgId);
+ if (CollectionUtils.isEmpty(total)) {
+ return null;
+ }
+ BigDecimal royalpay_charge = BigDecimal.ZERO;
+ List partnerPrizeList = financialPartnerCommissionDetailMapper.listDetailByMonth(year,month);
+ Map countPartnerPrizeMap = new HashMap<>();
+ for (JSONObject p : partnerPrizeList) {
+ royalpay_charge = royalpay_charge.add(p.getBigDecimal("royalpay_charge"));
+ String key = p.getString("client_id")+p.getString("channel").toLowerCase();
+ JSONObject partnerTmp = countPartnerPrizeMap.get(key);
+ if (partnerTmp == null) {
+ JSONObject partner = new JSONObject();
+ partner.put("royalpay_charge", p.getBigDecimal("royalpay_charge"));
+ countPartnerPrizeMap.put(key, partner);
+ } else {
+ partnerTmp.put("royalpay_charge", partnerTmp.getBigDecimal("royalpay_charge").add(p.getBigDecimal("royalpay_charge")));
+ }
+ }
+
+ String tableColumn[] = { "gross_amount", "total_charge", "org_charge", "org_net_charge" };
+
+ List recordIds = new ArrayList<>();
+ Map chargeResultMap = new HashMap<>();
+ for (JSONObject jsonObject : total) {
+ result.put("name", jsonObject.getString("name"));
+ recordIds.add(jsonObject.getString("record_id"));
+ for (String s : tableColumn) {
+ String key = jsonObject.getString("channel") + "_" + s;
+ if (chargeResultMap.containsKey(key)) {
+ chargeResultMap.put(key, chargeResultMap.get(key).add(jsonObject.getBigDecimal(s)));
+ } else {
+ chargeResultMap.put(key, jsonObject.getBigDecimal(s));
+ }
+ }
+ }
+
+ List details = financialAgentCommissionDetailMapper.listDetailsByRecordIds(recordIds);
+ Map> detailMap = new HashMap<>();
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+ for (JSONObject detail : details) {
+ detail.put("date_from", format.format(detail.get("date_from")));
+ detail.put("date_to", format.format(detail.get("date_to")));
+ String key = detail.getString("client_id");
+ detail.put("royalpay_charge",BigDecimal.ZERO);
+ if(countPartnerPrizeMap.get(key+detail.getString("channel").toLowerCase())!=null){
+ detail.put("royalpay_charge",countPartnerPrizeMap.get(key+detail.getString("channel")).getBigDecimal("royalpay_charge"));
+ }else {
+ detail.put("royalpay_charge",BigDecimal.ZERO);
+ }
+ if (detailMap.containsKey(key)) {
+ detailMap.get(key).add(detail);
+ } else {
+ List tmpList = new ArrayList<>();
+ tmpList.add(detail);
+ detailMap.put(key, tmpList);
+ }
+ }
+
+ List partnerClientInfos = new ArrayList<>();
+ BigDecimal resultGrossAmount = BigDecimal.ZERO;
+ BigDecimal resultTotalCharge = BigDecimal.ZERO;
+ BigDecimal resultRoyalpayCharge = BigDecimal.ZERO;
+ BigDecimal resultOrgCharge = BigDecimal.ZERO;
+ BigDecimal resultNetCharge = BigDecimal.ZERO;
+ for (Map.Entry> entry : detailMap.entrySet()) {
+ JSONObject sumResult = new JSONObject();
+ BigDecimal grossAmount = BigDecimal.ZERO;
+ BigDecimal totalCharge = BigDecimal.ZERO;
+ BigDecimal royalpayCharge = BigDecimal.ZERO;
+ BigDecimal netCharge = BigDecimal.ZERO;
+ BigDecimal orgCharge = BigDecimal.ZERO;
+ String clientMoniker = "";
+ for (JSONObject jsonObject : entry.getValue()) {
+ grossAmount = grossAmount.add(jsonObject.getBigDecimal("gross_amount"));
+ totalCharge = totalCharge.add(jsonObject.getBigDecimal("total_charge"));
+ royalpayCharge = royalpayCharge.add(jsonObject.getBigDecimal("royalpay_charge"));
+ orgCharge = orgCharge.add(jsonObject.getBigDecimal("org_charge"));
+ if (jsonObject.getBigDecimal("net_charge") != null) {
+ netCharge = netCharge.add(jsonObject.getBigDecimal("org_net_charge"));
+ }
+ clientMoniker = jsonObject.getString("client_moniker");
+ }
+ resultGrossAmount = resultGrossAmount.add(grossAmount);
+ resultTotalCharge = resultTotalCharge.add(totalCharge);
+ resultRoyalpayCharge = resultRoyalpayCharge.add(royalpayCharge);
+ resultOrgCharge = resultOrgCharge.add(orgCharge);
+ resultNetCharge = resultNetCharge.add(netCharge);
+ sumResult.put("gross_amount", grossAmount);
+ sumResult.put("total_charge", totalCharge);
+ sumResult.put("royalpay_charge", royalpayCharge);
+ sumResult.put("org_charge", orgCharge);
+ sumResult.put("org_net_charge", netCharge);
+ sumResult.put("client_moniker", clientMoniker);
+ sumResult.put("channel_detail", entry.getValue());
+ partnerClientInfos.add(sumResult);
+ }
+ result.put("partner_client_infos", partnerClientInfos);
+
+ for (Map.Entry entry : chargeResultMap.entrySet()) {
+ result.put(entry.getKey(), entry.getValue());
+ }
+ result.put("monthstr", monthStr);
+ result.put("total_transaction", resultGrossAmount);
+ result.put("total_charge", resultTotalCharge);
+ result.put("royalPay_charge", resultRoyalpayCharge);
+ result.put("org_net_charge", resultNetCharge);
+ result.put("city_partner_charge", resultOrgCharge);
+ return result;
+ }
+
+ @Override
+ public List getAgentPrizeInfoList(String monthStr) {
+ Date monthDate = parseMonth(monthStr);
+ Calendar monthCal = Calendar.getInstance();
+ monthCal.setTime(monthDate);
+ int year = monthCal.get(Calendar.YEAR);
+ int month = monthCal.get(Calendar.MONTH) + 1;
+ return financialAgentCommissionMapper.list(year, month);
+ }
+
}
diff --git a/src/main/java/au/com/royalpay/payment/manage/citypartner/web/CityPartnerPrizeController.java b/src/main/java/au/com/royalpay/payment/manage/citypartner/web/CityPartnerPrizeController.java
index eb62f6b82..3e53c6041 100644
--- a/src/main/java/au/com/royalpay/payment/manage/citypartner/web/CityPartnerPrizeController.java
+++ b/src/main/java/au/com/royalpay/payment/manage/citypartner/web/CityPartnerPrizeController.java
@@ -2,17 +2,27 @@ package au.com.royalpay.payment.manage.citypartner.web;
import au.com.royalpay.payment.manage.citypartner.core.CityPartnerPrizeService;
import au.com.royalpay.payment.manage.permission.manager.ManagerMapping;
+import au.com.royalpay.payment.tools.CommonConsts;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
+
import com.alibaba.fastjson.JSONObject;
-import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import javax.annotation.Resource;
+
/**
* Created by yixian on 2017-03-08.
*/
@@ -63,16 +73,18 @@ public class CityPartnerPrizeController {
BigDecimal netCharge = BigDecimal.ZERO;
String cityPartnerName = "";
int org_id = 0;
+ int type = 1;
for (JSONObject jsonObject : entry.getValue()) {
- grossAmount = grossAmount.add(jsonObject.getBigDecimal("gross_amount"));
- totalCharge = totalCharge.add(jsonObject.getBigDecimal("total_charge"));
- royalpayCharge = royalpayCharge.add(jsonObject.getBigDecimal("royalpay_charge"));
+ grossAmount = grossAmount.add(jsonObject.getBigDecimal("gross_amount"));
+ totalCharge = totalCharge.add(jsonObject.getBigDecimal("total_charge"));
+ royalpayCharge = royalpayCharge.add(jsonObject.getBigDecimal("royalpay_charge"));
orgCharge = orgCharge.add(jsonObject.getBigDecimal("org_charge"));
- if(jsonObject.getBigDecimal("net_charge")!=null) {
+ if (jsonObject.getBigDecimal("net_charge") != null) {
netCharge = netCharge.add(jsonObject.getBigDecimal("net_charge"));
}
org_id = jsonObject.getIntValue("org_id");
cityPartnerName = jsonObject.getString("name");
+ type = jsonObject.getIntValue("commission_type");
}
sumResult.put("gross_amount", grossAmount);
sumResult.put("total_charge", totalCharge);
@@ -80,7 +92,8 @@ public class CityPartnerPrizeController {
sumResult.put("org_charge", orgCharge);
sumResult.put("org_name", cityPartnerName);
sumResult.put("org_id", org_id);
- sumResult.put("net_charge",netCharge);
+ sumResult.put("net_charge", netCharge);
+ sumResult.put("type",type);
sumResult.put("channel_detail", entry.getValue());
resultTotalCharge = resultTotalCharge.add(totalCharge);
resultRoyalpayCharge = resultRoyalpayCharge.add(royalpayCharge);
@@ -89,11 +102,11 @@ public class CityPartnerPrizeController {
partnerInfos.add(sumResult);
}
result.put("monthstr", monthStr);
- result.put("total_charge",resultTotalCharge);
- result.put("royalpay_charge",resultRoyalpayCharge);
- result.put("net_charge",resultNetCharge);
- result.put("org_charge",resultOrgCharge);
- result.put("partner_info_list",partnerInfos);
+ result.put("total_charge", resultTotalCharge);
+ result.put("royalpay_charge", resultRoyalpayCharge);
+ result.put("net_charge", resultNetCharge);
+ result.put("org_charge", resultOrgCharge);
+ result.put("partner_info_list", partnerInfos);
return result;
}
@@ -107,14 +120,17 @@ public class CityPartnerPrizeController {
String month = param.getString("month");
cityPartnerPrizeService.generateReferrer(month);
}
+
@ManagerMapping("/referrer/months/{monthStr}/orgs/{orgId}")
public JSONObject getreferrerPrizeDetail(@PathVariable String monthStr, @PathVariable String orgId) {
return cityPartnerPrizeService.getReferrerPrizeDetail(monthStr, orgId);
}
+
@RequestMapping("/referrer/months")
public List listReferrerAvailableMonths(@RequestParam String year) {
return cityPartnerPrizeService.listReferrerAvailableMonths(year);
}
+
@RequestMapping(value = "/referrer/months/{monthStr}")
public JSONObject getReferrerPrizeInfo(@PathVariable String monthStr) {
List partnerPrizeInfos = cityPartnerPrizeService.getReferrerPrizeInfoList(monthStr);
@@ -140,24 +156,121 @@ public class CityPartnerPrizeController {
String cityPartnerName = "";
int org_id = 0;
for (JSONObject jsonObject : entry.getValue()) {
- grossAmount = grossAmount.add(jsonObject.getBigDecimal("gross_amount"));
+ grossAmount = grossAmount.add(jsonObject.getBigDecimal("gross_amount"));
+ orgCharge = orgCharge.add(jsonObject.getBigDecimal("org_charge"));
+ org_id = jsonObject.getIntValue("org_id");
+ cityPartnerName = jsonObject.getString("name");
+ }
+ sumResult.put("gross_amount", grossAmount);
+ sumResult.put("org_charge", orgCharge);
+ sumResult.put("org_name", cityPartnerName);
+ sumResult.put("org_id", org_id);
+ sumResult.put("channel_detail", entry.getValue());
+ resultGrossAmount = resultGrossAmount.add(grossAmount);
+ resultOrgCharge = resultOrgCharge.add(orgCharge);
+ partnerInfos.add(sumResult);
+ }
+ result.put("monthstr", monthStr);
+ result.put("gross_amount", resultGrossAmount);
+ result.put("org_charge", resultOrgCharge);
+ result.put("partner_info_list", partnerInfos);
+ return result;
+ }
+
+ @ManagerMapping("/agent/months/{monthStr}/orgs/{orgId}")
+ public JSONObject getAgentPrizeDetail(@PathVariable String monthStr, @PathVariable String orgId) {
+ return cityPartnerPrizeService.getAgentPrizeDetail(monthStr, orgId);
+ }
+
+ @RequestMapping("/agent/months")
+ public List listAgentAvailableMonths(@RequestParam String year) {
+ return cityPartnerPrizeService.listAgentAvailableMonths(year);
+ }
+
+ @RequestMapping(value = "/agent/months/{monthStr}")
+ public JSONObject getAgentPrizeInfo(@PathVariable String monthStr) {
+ List partnerPrizeList = cityPartnerPrizeService.getCityPartnerPrizeInfoList(monthStr);
+ Map countPartnerPrizeMap = new HashMap<>();
+ for (JSONObject p : partnerPrizeList) {
+ String key = p.getString("org_id");
+ JSONObject partnerTmp = countPartnerPrizeMap.get(key);
+ if (partnerTmp == null) {
+ JSONObject partner = new JSONObject();
+ partner.put("royalpay_charge", p.getBigDecimal("royalpay_charge"));
+ countPartnerPrizeMap.put(key, partner);
+ } else {
+ partnerTmp.put("royalpay_charge", partnerTmp.getBigDecimal("royalpay_charge").add(p.getBigDecimal("royalpay_charge")));
+ }
+ }
+
+ List partnerPrizeInfos = cityPartnerPrizeService.getAgentPrizeInfoList(monthStr);
+ Map> partenerPrizeMap = new HashMap<>();
+ for (JSONObject partnerPrizeInfo : partnerPrizeInfos) {
+ String key = partnerPrizeInfo.getString("org_id");
+ if(countPartnerPrizeMap.containsKey(key)){
+ partnerPrizeInfo.put("royalpay_charge",countPartnerPrizeMap.get(key).getBigDecimal("royalpay_charge"));
+ }else {
+ partnerPrizeInfo.put("royalpay_charge",BigDecimal.ZERO);
+ }
+ if (partenerPrizeMap.containsKey(key)) {
+ partenerPrizeMap.get(key).add(partnerPrizeInfo);
+ } else {
+ List tmpList = new ArrayList<>();
+ tmpList.add(partnerPrizeInfo);
+ partenerPrizeMap.put(key, tmpList);
+ }
+ }
+
+
+
+
+ JSONObject result = new JSONObject();
+ List partnerInfos = new ArrayList<>(partenerPrizeMap.size());
+ BigDecimal resultGrossAmount = BigDecimal.ZERO;
+ BigDecimal resultOrgCharge = BigDecimal.ZERO;
+ BigDecimal resultAgentCharge = BigDecimal.ZERO;
+ BigDecimal resultOrgNetCharge = BigDecimal.ZERO;
+ BigDecimal resultRoyalpayCharge = BigDecimal.ZERO;
+
+ for (Map.Entry> entry : partenerPrizeMap.entrySet()) {
+ JSONObject sumResult = new JSONObject();
+ BigDecimal grossAmount = BigDecimal.ZERO;
+ BigDecimal orgCharge = BigDecimal.ZERO;
+ BigDecimal agentCharge = BigDecimal.ZERO;
+ BigDecimal orgNetCharge = BigDecimal.ZERO;
+ BigDecimal royalpayCharge = BigDecimal.ZERO;
+ String cityPartnerName = "";
+ int org_id = 0;
+ for (JSONObject jsonObject : entry.getValue()) {
+ grossAmount = grossAmount.add(jsonObject.getBigDecimal("gross_amount"));
orgCharge = orgCharge.add(jsonObject.getBigDecimal("org_charge"));
+ agentCharge = agentCharge.add(jsonObject.getBigDecimal("total_charge"));
+ orgNetCharge = orgNetCharge.add(jsonObject.getBigDecimal("org_net_charge"));
+ royalpayCharge = royalpayCharge.add(jsonObject.getBigDecimal("royalpay_charge"));
org_id = jsonObject.getIntValue("org_id");
cityPartnerName = jsonObject.getString("name");
}
sumResult.put("gross_amount", grossAmount);
sumResult.put("org_charge", orgCharge);
+ sumResult.put("org_net_charge",orgNetCharge);
sumResult.put("org_name", cityPartnerName);
sumResult.put("org_id", org_id);
sumResult.put("channel_detail", entry.getValue());
+ sumResult.put("royalpay_charge",royalpayCharge);
resultGrossAmount = resultGrossAmount.add(grossAmount);
resultOrgCharge = resultOrgCharge.add(orgCharge);
+ resultAgentCharge = resultAgentCharge.add(agentCharge);
+ resultOrgNetCharge = resultOrgNetCharge.add(orgNetCharge);
partnerInfos.add(sumResult);
}
+
+ result.put("royalpay_charge", resultRoyalpayCharge);
result.put("monthstr", monthStr);
- result.put("gross_amount",resultGrossAmount);
- result.put("org_charge",resultOrgCharge);
- result.put("partner_info_list",partnerInfos);
+ result.put("gross_amount", resultGrossAmount);
+ result.put("agent_total_charge", resultAgentCharge);
+ result.put("org_charge", resultOrgCharge);
+ result.put("org_net_charge", resultOrgNetCharge);
+ result.put("partner_info_list", partnerInfos);
return result;
}
}
diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialAgentCommissionDetailMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialAgentCommissionDetailMapper.java
new file mode 100644
index 000000000..394ed637d
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialAgentCommissionDetailMapper.java
@@ -0,0 +1,27 @@
+package au.com.royalpay.payment.manage.mappers.financial;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.alibaba.fastjson.JSONObject;
+
+import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
+import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
+import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
+
+/**
+ * Created by yixian on 2017-03-08.
+ */
+@AutoMapper(tablename = "financial_agent_commission_detail", pkName = "detail_id")
+public interface FinancialAgentCommissionDetailMapper {
+ @AutoSql(type = SqlType.DELETE)
+ void clearData(@Param("year") int year, @Param("month") int month);
+
+ @AutoSql(type = SqlType.INSERT)
+ void save(JSONObject detail);
+
+ List listDetails(@Param("record_id") String recordId);
+
+ List listDetailsByRecordIds(List recordId);
+}
diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialAgentCommissionMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialAgentCommissionMapper.java
new file mode 100644
index 000000000..c0b847a56
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialAgentCommissionMapper.java
@@ -0,0 +1,31 @@
+package au.com.royalpay.payment.manage.mappers.financial;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.alibaba.fastjson.JSONObject;
+
+import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
+import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
+import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
+
+/**
+ * Created by yixian on 2017-03-08.
+ */
+@AutoMapper(tablename = "financial_agent_commission", pkName = "record_id")
+public interface FinancialAgentCommissionMapper {
+ @AutoSql(type = SqlType.INSERT)
+ void save(JSONObject commissionAnalysis);
+
+ @AutoSql(type = SqlType.DELETE)
+ void clearData(@Param("year") int year, @Param("month") int month);
+
+ List listAvailableMonths(@Param("year") int year);
+
+ List find(@Param("year") int year, @Param("month") int month, @Param("org_id") String orgId);
+
+ List list(@Param("year") int year, @Param("month") int month);
+
+
+}
diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialPartnerCommissionDetailMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialPartnerCommissionDetailMapper.java
index ff8692851..3efb8de35 100644
--- a/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialPartnerCommissionDetailMapper.java
+++ b/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialPartnerCommissionDetailMapper.java
@@ -14,7 +14,7 @@ import java.util.List;
@AutoMapper(tablename = "financial_partner_commission_detail", pkName = "detail_id")
public interface FinancialPartnerCommissionDetailMapper {
@AutoSql(type = SqlType.DELETE)
- void clearData(@Param("year") int year, @Param("month") int month);
+ void clearData(@Param("year") int year, @Param("month") int month,@Param("commission_type") int commission_type);
@AutoSql(type = SqlType.INSERT)
void save(JSONObject detail);
@@ -22,4 +22,7 @@ public interface FinancialPartnerCommissionDetailMapper {
List listDetails(@Param("record_id") String recordId);
List listDetailsByRecordIds(List recordId);
+
+ @AutoSql(type = SqlType.SELECT)
+ List listDetailByMonth(@Param("year") int year, @Param("month") int month);
}
diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialPartnerCommissionMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialPartnerCommissionMapper.java
index 720b8b371..cd44243f5 100644
--- a/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialPartnerCommissionMapper.java
+++ b/src/main/java/au/com/royalpay/payment/manage/mappers/financial/FinancialPartnerCommissionMapper.java
@@ -14,7 +14,7 @@ import java.util.List;
@AutoMapper(tablename = "financial_partner_commission", pkName = "record_id")
public interface FinancialPartnerCommissionMapper {
@AutoSql(type = SqlType.DELETE)
- void clearData(@Param("year") int year, @Param("month") int month);
+ void clearData(@Param("year") int year, @Param("month") int month,@Param("commission_type") int commission_type);
@AutoSql(type = SqlType.INSERT)
void save(JSONObject commissionAnalysis);
diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.java
index 05cf97958..97622c602 100644
--- a/src/main/java/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.java
+++ b/src/main/java/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.java
@@ -96,6 +96,8 @@ public interface TransactionMapper {
List listTransactionsForReferrerCommission(@Param("year") int year, @Param("month") int month);
+ List listTransactionsForAgentCommission(@Param("year") int year, @Param("month") int month,@Param("parent_org_id") int parent_org_id);
+
BigDecimal checkBalance(@Param("end") Date endDate);
@AutoSql(type = SqlType.COUNT)
diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java
index dacf64869..1b1b54812 100644
--- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java
+++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java
@@ -1164,6 +1164,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
}
checkOrgPermission(manager, client);
int clientId = client.getIntValue("client_id");
+ JSONObject org = orgMapper.findOne(client.getIntValue("org_id"));
if (config == null) {
throw new ForbiddenException(clientId + "费率参数配置不完整,请重新输入===>");
}
@@ -1174,15 +1175,22 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
config.put("update_time", new Date());
config.put("active_time", DateFormatUtils.format(config.getDate("active_time"), "yyyy-MM-dd"));
config.put("expiry_time", DateFormatUtils.format(config.getDate("expiry_time"), "yyyy-MM-dd"));
- configNewClientRate(config, clientId, "Alipay", "alipay_rate_value");
- configNewClientRate(config, clientId, "AlipayOnline", "alipayonline_rate_value");
- configNewClientRate(config, clientId, "Wechat", "wechat_rate_value");
- configNewClientRate(config, clientId, "jd", "jd_rate_value");
- configNewClientRate(config, clientId, "Bestpay", "bestpay_rate_value");
+
+ checkAddRate(config,"Wechat", "wechat_rate_value",org,"min_wechat_rate");
+ checkAddRate(config,"Alipay", "alipay_rate_value",org,"min_alipay_rate");
+ checkAddRate(config,"AlipayOnline", "alipayonline_rate_value",org,"min_alipayonline_rate");
+ checkAddRate(config,"Bestpay", "bestpay_rate_value",org,"min_bestpay_rate");
+ checkAddRate(config,"jd", "jd_rate_value",org,"min_jd_rate");
+
+ configNewClientRate(config, clientId, "Wechat", "wechat_rate_value",org,"min_wechat_rate");
+ configNewClientRate(config, clientId, "Alipay", "alipay_rate_value",org,"min_alipay_rate");
+ configNewClientRate(config, clientId, "AlipayOnline", "alipayonline_rate_value",org,"min_alipayonline_rate");
+ configNewClientRate(config, clientId, "Bestpay", "bestpay_rate_value",org,"min_bestpay_rate");
+ configNewClientRate(config, clientId, "jd", "jd_rate_value",org,"min_jd_rate");
}
- private void configNewClientRate(JSONObject config, int clientId, String channel, String rateKey) {
+ private void configNewClientRate(JSONObject config, int clientId, String channel, String rateKey,JSONObject org,String rateValueKey) {
if (config.containsKey(rateKey)) {
JSONObject newConfig = new JSONObject();
newConfig.putAll(config);
@@ -1210,6 +1218,12 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
}
checkOrgPermission(manager, client);
JSONObject configJson = config.toJSON();
+ JSONObject org = orgMapper.findOne(client.getIntValue("org_id"));
+ checkModifyRate(org,configJson,"Wechat","min_wechat_rate");
+ checkModifyRate(org,configJson,"Alipay","min_alipay_rate");
+ checkModifyRate(org,configJson,"AlipayOnline","min_alipayonline_rate");
+ checkModifyRate(org,configJson,"jd","min_jd_rate");
+ checkModifyRate(org,configJson,"Bestpay","min_bestpay_rate");
configJson.put("client_rate_id", rateId);
configJson.put("manager_id", manager.getString("manager_id"));
configJson.put("manager_name", manager.getString("username"));
@@ -1223,6 +1237,24 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
}
// clientMapper.updateCleanDays(clientId, config.getCleanDays());
}
+ private void checkModifyRate(JSONObject org,JSONObject configJson,String rateName,String rateValueKey){
+ if(configJson.getString("rate_name").equals(rateName)){
+ if(org.containsKey(rateValueKey)){
+ if(configJson.getDouble("rate_value").compareTo(org.getDouble(rateValueKey)) > 0){
+ throw new ForbiddenException("费率参数大于旗下商户最低"+rateName+"费率,请重新输入===>");
+ };
+ }
+ }
+ }
+ private void checkAddRate(JSONObject config,String channel, String rateKey,JSONObject org,String rateValueKey){
+ if(config.containsKey(rateKey)){
+ if(org.containsKey(rateValueKey)){
+ if(config.getBigDecimal(rateKey).compareTo(org.getBigDecimal(rateValueKey)) > 0){
+ throw new ForbiddenException("费率参数大于旗下商户最低"+channel+"费率,请重新输入===>");
+ };
+ }
+ }
+ }
@Override
public List listSubClients(JSONObject manager, String clientMoniker) {
diff --git a/src/main/java/au/com/royalpay/payment/manage/organizations/beans/OrgInfo.java b/src/main/java/au/com/royalpay/payment/manage/organizations/beans/OrgInfo.java
index 3eda2a10d..04b119196 100644
--- a/src/main/java/au/com/royalpay/payment/manage/organizations/beans/OrgInfo.java
+++ b/src/main/java/au/com/royalpay/payment/manage/organizations/beans/OrgInfo.java
@@ -34,6 +34,12 @@ public class OrgInfo {
private int limit = 10;
private String parent_org_id;
private String org_id;
+ private String commission_type;
+ private Double min_wechat_rate;
+ private Double min_alipay_rate;
+ private Double min_bestpay_rate;
+ private Double min_jd_rate;
+ private Double min_alipayonline_rate;
public JSONObject toJsonParam() {
JSONObject param = new JSONObject();
@@ -229,4 +235,52 @@ public class OrgInfo {
public void setOrg_id(String org_id) {
this.org_id = org_id;
}
+
+ public String getCommission_type() {
+ return commission_type;
+ }
+
+ public void setCommission_type(String commission_type) {
+ this.commission_type = commission_type;
+ }
+
+ public Double getMin_wechat_rate() {
+ return min_wechat_rate;
+ }
+
+ public void setMin_wechat_rate(Double min_wechat_rate) {
+ this.min_wechat_rate = min_wechat_rate;
+ }
+
+ public Double getMin_alipay_rate() {
+ return min_alipay_rate;
+ }
+
+ public void setMin_alipay_rate(Double min_alipay_rate) {
+ this.min_alipay_rate = min_alipay_rate;
+ }
+
+ public Double getMin_bestpay_rate() {
+ return min_bestpay_rate;
+ }
+
+ public void setMin_bestpay_rate(Double min_bestpay_rate) {
+ this.min_bestpay_rate = min_bestpay_rate;
+ }
+
+ public Double getMin_jd_rate() {
+ return min_jd_rate;
+ }
+
+ public void setMin_jd_rate(Double min_jd_rate) {
+ this.min_jd_rate = min_jd_rate;
+ }
+
+ public Double getMin_alipayonline_rate() {
+ return min_alipayonline_rate;
+ }
+
+ public void setMin_alipayonline_rate(Double min_alipayonline_rate) {
+ this.min_alipayonline_rate = min_alipayonline_rate;
+ }
}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 40af310fa..48b29bfd1 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -96,6 +96,3 @@ app.foreign-currency=AUD
app.ofei.md5-key=Khjx6wejblaJzmG0JBWFlPFKAUxhFIXQ
app.ofei.pwd=aomi@8888
app.ofei.sp-code=A1407200
-
-android.message.secret=2b96d9bc6169c9554218aab1
-android.message.appkey=3f33a10d0a7d4ac94d8f2431
\ No newline at end of file
diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/customers/CustomerMembershipMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/customers/CustomerMembershipMapper.xml
index 387f73791..df98c4b89 100644
--- a/src/main/resources/au/com/royalpay/payment/manage/mappers/customers/CustomerMembershipMapper.xml
+++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/customers/CustomerMembershipMapper.xml
@@ -52,8 +52,9 @@
0 or s.role & 10000000 >0)
+ SELECT DISTINCT scr.kanga_openid FROM sys_customer_relation scr, sys_managers sm
+ WHERE scr.wechat_openid = sm.wx_openid AND scr.kanga_openid IS NOT NULL
+ AND sm.role & 10000001 > 0
]]>
\ No newline at end of file
diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialAgentCommissionDetailMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialAgentCommissionDetailMapper.xml
new file mode 100644
index 000000000..a4c412d42
--- /dev/null
+++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialAgentCommissionDetailMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+ SELECT
+ d.*,
+ c.client_moniker
+ FROM financial_agent_commission_detail d
+ INNER JOIN sys_clients c ON c.client_id = d.client_id
+ WHERE d.record_id in
+
+ #{item}
+
+ ORDER BY c.client_moniker ASC
+
+
\ No newline at end of file
diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialAgentCommissionMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialAgentCommissionMapper.xml
new file mode 100644
index 000000000..0a2b3df45
--- /dev/null
+++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialAgentCommissionMapper.xml
@@ -0,0 +1,26 @@
+
+
+
+
+ SELECT DISTINCT `month`
+ FROM financial_agent_commission
+ WHERE `year` = #{year}
+ ORDER BY `month` ASC
+
+
+ SELECT
+ c.*,
+ o.name `name`
+ FROM financial_agent_commission c
+ INNER JOIN sys_org o ON o.org_id = c.org_id and o.parent_org_id is null
+ WHERE c.year = #{year} AND c.month = #{month} and c.org_id=#{org_id}
+
+
+ SELECT
+ c.*,
+ o.name
+ FROM financial_agent_commission c
+ INNER JOIN sys_org o ON o.org_id = c.org_id and o.parent_org_id is null
+ WHERE c.year = #{year} AND c.month = #{month}
+
+
\ No newline at end of file
diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialPartnerCommissionDetailMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialPartnerCommissionDetailMapper.xml
index d4fa79e43..539bb7de5 100644
--- a/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialPartnerCommissionDetailMapper.xml
+++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/financial/FinancialPartnerCommissionDetailMapper.xml
@@ -23,4 +23,5 @@
ORDER BY c.client_moniker ASC, d.date_from ASC
+
\ No newline at end of file
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 141aa0ba3..119671664 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
@@ -515,6 +515,52 @@
ORDER BY c.org_id ASC, t.client_id ASC, trade_date ASC
+
+ = t.transaction_time AND
+ r.rate_name = 'Wechat'), 1) wechat_rate_value,
+ ifnull((SELECT min(r.rate_value)
+ FROM sys_client_rates r
+ WHERE r.client_id = t.client_id AND r.active_time <= t.transaction_time AND
+ r.expiry_time >= t.transaction_time AND
+ r.rate_name = 'Alipay'), 1) alipay_rate_value,
+ ifnull((SELECT min(r.rate_value)
+ FROM sys_client_rates r
+ WHERE r.client_id = t.client_id AND r.active_time <= t.transaction_time AND
+ r.expiry_time >= t.transaction_time AND
+ r.rate_name = 'Bestpay'), 1) bestpay_rate_value,
+ ifnull((SELECT min(r.rate_value)
+ FROM sys_client_rates r
+ WHERE r.client_id = t.client_id AND r.active_time <= t.transaction_time AND
+ r.expiry_time >= t.transaction_time AND
+ r.rate_name = 'jd'), 1) jd_rate_value,
+ ifnull((SELECT min(r.rate_value)
+ FROM sys_client_rates r
+ WHERE r.client_id = t.client_id AND r.active_time <= t.transaction_time AND
+ r.expiry_time >= t.transaction_time AND
+ r.rate_name = 'AlipayOnline'), 2.0) AlipayOnline_rate_value
+ FROM pmt_transactions t
+ INNER JOIN sys_clients c ON c.client_id = t.client_id
+ INNER JOIN sys_org so
+ ON c.org_id = so.org_id AND so.is_valid = 1 AND so.type = 0 AND so.parent_org_id = #{parent_org_id}
+ WHERE year(t.transaction_time) = #{year} AND month(t.transaction_time) = #{month} AND t.channel != 'Settlement'
+ GROUP BY t.client_id, trade_date, channel
+ ORDER BY c.org_id ASC, t.client_id ASC, trade_date ASC
+ ]]>
+
+
ng-class="{'text-orange':!('10000000000'|withRole),'text-gray':('10000000000'|withRole)}">
+
@@ -326,6 +328,13 @@ margin-bottom: 10%;"/>
周末费率减半活动
+
+
+
+ 机构数据分析|Agent Analysis
+
+
+
diff --git a/src/main/ui/static/agent/commission/commission.js b/src/main/ui/static/agent/commission/commission.js
new file mode 100644
index 000000000..0ede01505
--- /dev/null
+++ b/src/main/ui/static/agent/commission/commission.js
@@ -0,0 +1,108 @@
+/**
+ * Created by yixian on 2017-03-08.
+ */
+define(['angular','../../agent/commission/commission'], function (angular) {
+ 'use strict';
+ var app = angular.module('agentCommission', ['ui.router']);
+ app.config(['$stateProvider', function ($stateProvider) {
+ $stateProvider.state('analysis_agent', {
+ url: '/analysis_agent',
+ templateUrl: '/static/agent/commission/templates/agent_commission_root.html',
+ controller: 'agentCommissionRootCtrl'
+ }).state('analysis_agent.agentcommission', {
+ url:'/agentcommission',
+ template:'
',
+ controller:['$scope',function ($scope) {
+ }]
+ }).state('analysis_agent.agentcommission.month', {
+ url: '/months/{monthStr}',
+ templateUrl: '/static/agent/commission/templates/agent_commission_month.html',
+ controller: 'agentCommissionMonthViewCtrl',
+ resolve: {
+ monthData: ['$http', '$stateParams', function ($http, $stateParams) {
+ return $http.get('/sys/citypartner_prizes/agent/months/' + $stateParams.monthStr);
+ }]
+ }
+ }).state('analysis_agent.agentcommission.month.agentdetail', {
+ url: '/orgs/{orgId}',
+ templateUrl: '/static/agent/commission/templates/agent_commission_detail.html',
+ controller: 'agentCommissionagentDetailCtrl',
+ resolve: {
+ detail: ['$http', '$stateParams', function ($http, $stateParams) {
+ return $http.get('/sys/citypartner_prizes/agent/months/' + $stateParams.monthStr + '/orgs/' + $stateParams.orgId);
+ }]
+ }
+ })
+ }]);
+
+ app.controller('agentCommissionRootCtrl', ['$scope', '$http', '$filter', '$state', 'commonDialog',
+ function ($scope, $http, $filter, $state, commonDialog) {
+ $scope.generate = {};
+ $scope.generateAgentCommission = function () {
+ $scope.generate.status = {};
+ if (!$scope.generate.month) {
+ commonDialog.alert({
+ type: 'error', title: 'Error', content: 'Select a month first!'
+ });
+ return;
+ }
+ commonDialog.confirm({
+ title: 'Confirm',
+ content: 'This operation will clear the data generated before, Are you sure?'
+ }).then(function () {
+ var params = {month: $filter('date')($scope.generate.month, 'yyyy-MM')};
+ $http.post('/sys/citypartner_prizes/agent/generate', params).then(function () {
+ $state.go('analysis_agent.agentcommission.month', {monthStr: params.month})
+ $scope.generate.status = null;
+ }, function (resp) {
+ commonDialog.alert({type: 'error', title: 'Error', content: resp.data.message});
+ })
+ })
+ };
+ $scope.params = {year: new Date()};
+ $scope.months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
+ $scope.loadAvailableMonths = function () {
+ $http.get('/sys/citypartner_prizes/agent/months', {params: {year: $scope.params.year.getFullYear()}}).then(function (resp) {
+ $scope.availableMonths = resp.data;
+ });
+ };
+
+ $scope.loadAvailableMonths();
+ $scope.hasReport = function (mon) {
+ var has = false;
+ angular.forEach($scope.availableMonths, function (m) {
+ if (mon == m.month) {
+ has = true;
+ }
+ });
+ return has;
+ };
+ $scope.gotoMonth = function (mon) {
+ var monthStr = $scope.params.year.getFullYear() + '-' + (('0' + mon).substr(-2));
+ $state.go('analysis_agent.agentcommission.month', {monthStr: monthStr})
+ };
+ }]);
+ app.controller('agentCommissionMonthViewCtrl', ['$scope', 'monthData', function ($scope, monthData) {
+ $scope.monthData = monthData.data;
+ $scope.ctrl = {};
+ $scope.active = function (log) {
+ if($scope.ctrl.activeLog && $scope.ctrl.activeLog.org_id==log.org_id){
+ $scope.ctrl.activeLog=null;
+ return;
+ }
+ $scope.ctrl.activeLog=log;
+ }
+ }]);
+ app.controller('agentCommissionagentDetailCtrl', ['$scope', 'detail', function ($scope, detail) {
+ $scope.detail = detail.data;
+ $scope.ctrl = {};
+ $scope.active = function (log) {
+ if($scope.ctrl.activeLog && $scope.ctrl.activeLog.client_moniker==log.client_moniker){
+ $scope.ctrl.activeLog=null;
+ return;
+ }
+ $scope.ctrl.activeLog=log;
+ }
+ }]);
+ return app;
+});
\ No newline at end of file
diff --git a/src/main/ui/static/agent/commission/templates/agent_commission_detail.html b/src/main/ui/static/agent/commission/templates/agent_commission_detail.html
new file mode 100644
index 000000000..aa1b08abe
--- /dev/null
+++ b/src/main/ui/static/agent/commission/templates/agent_commission_detail.html
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+ City Partner:
+
+
+ Month:
+
+
+ Total Transaction:{{detail.total_transaction}}
+
+
+ Total Charge:{{detail.total_charge}}
+
+
+ RoyalPay Charge:{{detail.royalPay_charge}}
+
+
+ Org Net Charge:{{detail.org_net_charge}}
+
+
+ City Partner Charge:{{detail.city_partner_charge}}
+
+
+
+
+
+
+
+
+
Total Transaction:
+ Total Charge:
+ RoyalPay Charge:
+ Org Net Charge:
+ City Partner Charge:
+
+
+
+
+
+
+
+
+
+
+
Total Transaction:
+ Total Charge:
+ RoyalPay Charge:
+ Org Net Charge:
+ City Partner Charge:
+
+
+
+
+
+
+
+
+
+
+
Total Transaction:
+ Total Charge:
+ RoyalPay Charge:
+ Org Net Charge:
+ City Partner Charge:
+
+
+
+
+
+
+
+
+
+
+
Total Transaction:
+ Total Charge:
+ RoyalPay Charge:
+ Org Net Charge:
+ City Partner Charge:
+
+
+
+
+
+
+
+
+
+
+
+ Client Moniker
+ Transaction
+ Total Charge
+ RoyalPay Charge
+ Org Net Charge
+ City Partner Charge
+ Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Order Date Range
+ Client Rate
+ Transaction Amount
+ Total Charge
+ RoyalPay Charge
+ Org Net Charge
+ City Partner Charge
+ channel
+
+
+
+
+
+ {{detail.date_from|date:'dd/MMM/yyyy'}}~{{detail.date_to|date:'dd/MMM/yyyy'}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/ui/static/agent/commission/templates/agent_commission_month.html b/src/main/ui/static/agent/commission/templates/agent_commission_month.html
new file mode 100644
index 000000000..d96820aac
--- /dev/null
+++ b/src/main/ui/static/agent/commission/templates/agent_commission_month.html
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+ Month:
+
+
+ Total Charge:
+
+
+ Gross Amount:
+
+
+ RoyalPay Charge:
+
+
+ Org Net Charge:
+
+
+ Org Charge:
+
+
+
+
+
+
+
+
+
+
+ City Partner Name
+ Transaction Amount
+ Total Charge
+ RoyalPay Charge
+ Net Charge
+ Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Keep Rate
+ Transaction Amount
+ Total Charge
+ RoyalPay Charge
+ Org Net Charge
+ City Partner Charge
+ channel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/ui/static/agent/commission/templates/agent_commission_root.html b/src/main/ui/static/agent/commission/templates/agent_commission_root.html
new file mode 100644
index 000000000..22fcff5cd
--- /dev/null
+++ b/src/main/ui/static/agent/commission/templates/agent_commission_root.html
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Total Charge:
+
+
+
+ Org Charge:
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/ui/static/config/organizations/organizations.js b/src/main/ui/static/config/organizations/organizations.js
index 175906192..7a2973e40 100644
--- a/src/main/ui/static/config/organizations/organizations.js
+++ b/src/main/ui/static/config/organizations/organizations.js
@@ -11,6 +11,13 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
"label": "推荐人",
"value": 1
}];
+ var commission_types = [{
+ "label": "渠道计算法",
+ "value": 1
+ }, {
+ "label": "收益比例",
+ "value": 3
+ }];
var app = angular.module('organizations', ['ui.router', 'ui.bootstrap']);
app.config(['$stateProvider', function ($stateProvider) {
$stateProvider.state('organizations', {
@@ -43,7 +50,7 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
}]);
app.controller('orgsCtrl', ['$scope', '$http','commonDialog', function ($scope, $http,commonDialog ) {
$scope.params = {};
- if($scope.currentUser.org_id !=null && !angular.equals({}, $scope.currentUser.org_id)) {
+ if(($scope.currentUser.role & parseInt('1000000000000', 2)) > 0 && $scope.currentUser.org_id) {
$scope.params.org_id = $scope.currentUser.org_id;
}
$scope.pagination = {};
@@ -80,8 +87,9 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
}]);
app.controller('orgDetailCtrl', ['$scope', '$http', '$state', 'Upload', '$uibModal','commonDialog', 'org', function ($scope, $http, $state, Upload,$uibModal,commonDialog, org) {
$scope.types = angular.copy(types);
+ $scope.commission_types = angular.copy(commission_types);
$scope.org = angular.copy(org.data);
- if ($scope.currentUser.org_id != null) {
+ if (($scope.currentUser.role & parseInt('1000000000000', 2)) > 0 && $scope.currentUser.org_id) {
$scope.org.type = 0;
}
$scope.uploadLogo = function (file) {
@@ -111,6 +119,9 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
});
return;
}
+ if($scope.org.type == 1){
+ $scope.org.commission_type = 2;
+ }
$http.put('/sys/orgs/' + $scope.org.org_id, $scope.org).then(function () {
commonDialog.alert({title: 'Succeed', content: 'Organization update succeeded', type: 'success'});
$state.reload();
@@ -177,8 +188,9 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
}]);
app.controller('orgDetailParentCtrl', ['$scope', '$http', '$state', 'Upload', '$uibModal','commonDialog', 'org', function ($scope, $http, $state, Upload,$uibModal,commonDialog, org) {
$scope.types = angular.copy(types);
+ $scope.commission_types = angular.copy(commission_types);
$scope.org = angular.copy(org.data);
- if ($scope.currentUser.org_id != null) {
+ if (($scope.currentUser.role & parseInt('1000000000000', 2)) > 0 && $scope.currentUser.org_id) {
$scope.org.type = 0;
}
$scope.uploadLogo = function (file) {
@@ -274,6 +286,7 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
}]);
app.controller('newOrgCtrl', ['$scope', '$http', '$state', 'Upload', 'commonDialog', function ($scope, $http, $state, Upload, commonDialog) {
$scope.types = angular.copy(types);
+ $scope.commission_types = angular.copy(commission_types);
$scope.uploadLogo = function (file) {
if (file == null) {
return;
@@ -301,7 +314,10 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
});
return;
}
- if($scope.currentUser.org_id !=null && !angular.equals({}, $scope.currentUser.org_id)) {
+ if($scope.org.type == 1){
+ $scope.org.commission_type = 2;
+ }
+ if(($scope.currentUser.role & parseInt('1000000000000', 2)) > 0 && $scope.currentUser.org_id) {
$scope.org.parent_org_id = angular.copy($scope.currentUser.org.org_id);
$scope.org.type = '0';
}
diff --git a/src/main/ui/static/config/organizations/templates/new_org.html b/src/main/ui/static/config/organizations/templates/new_org.html
index 0682ae4c9..6b54fde0c 100644
--- a/src/main/ui/static/config/organizations/templates/new_org.html
+++ b/src/main/ui/static/config/organizations/templates/new_org.html
@@ -65,7 +65,7 @@
+
-