# Conflicts: # src/main/java/au/com/royalpay/payment/manage/organizations/beans/OrgInfo.java # src/main/ui/static/config/organizations/organizations.js # src/test/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionImplTest.javamaster
commit
9ea1dabc33
@ -0,0 +1,241 @@
|
|||||||
|
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;
|
||||||
|
import java.math.RoundingMode;
|
||||||
|
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 CityPartnerSeniorCommissionAnalysis {
|
||||||
|
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 BigDecimal orgRate;
|
||||||
|
private String channel;
|
||||||
|
private int commissionType;
|
||||||
|
private Map<Integer, List<JSONObject>> 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;
|
||||||
|
|
||||||
|
public CityPartnerSeniorCommissionAnalysis(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 CityPartnerSeniorCommissionAnalysis 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 CityPartnerSeniorCommissionAnalysis attachAnalysis(JSONObject dayAnalysis, String channel) {
|
||||||
|
int clientId = dayAnalysis.getIntValue("client_id");
|
||||||
|
List<JSONObject> 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, RoundingMode.HALF_UP);
|
||||||
|
|
||||||
|
BigDecimal royalpayCharge = total.multiply(rate).divide(CommonConsts.HUNDRED, 2, RoundingMode.HALF_UP);
|
||||||
|
|
||||||
|
BigDecimal thirdPartyPaymentCharge = getThirdPartyCharge(channel, total);
|
||||||
|
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);
|
||||||
|
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);
|
||||||
|
item.put("commission_type",commissionType);
|
||||||
|
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", totalChargeSum);
|
||||||
|
result.put("royalpay_charge", totalRoyalPayCharge);
|
||||||
|
result.put("org_charge", totalOrgChargeSum);
|
||||||
|
result.put("net_charge", totalnetCharge);
|
||||||
|
result.put("channel", channel);
|
||||||
|
result.put("commission_type",commissionType);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<JSONObject> getCommissionDetails(String recordId) {
|
||||||
|
List<JSONObject> list = new ArrayList<>();
|
||||||
|
for (Map.Entry<Integer, List<JSONObject>> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CityPartnerSeniorCommissionAnalysis attachNetCommissionAnalysis(JSONObject dayAnalysis, String channel) {
|
||||||
|
int clientId = dayAnalysis.getIntValue("client_id");
|
||||||
|
List<JSONObject> 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, RoundingMode.HALF_UP);
|
||||||
|
|
||||||
|
BigDecimal royalpayCharge = total.multiply(rate).divide(CommonConsts.HUNDRED, 2, RoundingMode.HALF_UP);
|
||||||
|
|
||||||
|
BigDecimal thirdPartyPaymentCharge = getThirdPartyCharge(channel, total);
|
||||||
|
BigDecimal netCharge = royalpayCharge.subtract(thirdPartyPaymentCharge);
|
||||||
|
BigDecimal orgCharge = netCharge.multiply(orgRate).divide(CommonConsts.HUNDRED, 2, RoundingMode.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, RoundingMode.HALF_UP);
|
||||||
|
break;
|
||||||
|
case "wechat":
|
||||||
|
thirdPartyPaymentCharge = total.multiply(wechatChargeRate).divide(CommonConsts.HUNDRED, 2, RoundingMode.HALF_UP);
|
||||||
|
break;
|
||||||
|
case "jd":
|
||||||
|
thirdPartyPaymentCharge = total.multiply(jdChargeRate).divide(CommonConsts.HUNDRED, 2, RoundingMode.HALF_UP);
|
||||||
|
break;
|
||||||
|
case "alipayonline":
|
||||||
|
thirdPartyPaymentCharge = total.multiply(alipayonlineChargeRate).divide(CommonConsts.HUNDRED, 2, RoundingMode.HALF_UP);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return thirdPartyPaymentCharge;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
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_senior_partner_commission_detail", pkName = "id")
|
||||||
|
public interface FinancialSeniorPartnerCommissionDetailMapper {
|
||||||
|
@AutoSql(type = SqlType.DELETE)
|
||||||
|
void clearData(@Param("year") int year, @Param("month") int month,@Param("commission_type") int commission_type);
|
||||||
|
|
||||||
|
@AutoSql(type = SqlType.INSERT)
|
||||||
|
void save(JSONObject detail);
|
||||||
|
|
||||||
|
List<JSONObject> listDetails(@Param("record_id") String recordId);
|
||||||
|
|
||||||
|
List<JSONObject> listDetailsByRecordIds(List<String> recordId);
|
||||||
|
|
||||||
|
@AutoSql(type = SqlType.SELECT)
|
||||||
|
List<JSONObject> listDetailByMonth(@Param("year") int year, @Param("month") int month);
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
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_senior_partner_commission", pkName = "id")
|
||||||
|
public interface FinancialSeniorPartnerCommissionMapper {
|
||||||
|
@AutoSql(type = SqlType.DELETE)
|
||||||
|
void clearData(@Param("year") int year, @Param("month") int month);
|
||||||
|
|
||||||
|
@AutoSql(type = SqlType.INSERT)
|
||||||
|
void save(JSONObject commissionAnalysis);
|
||||||
|
|
||||||
|
@AutoSql(type = SqlType.SELECT)
|
||||||
|
JSONObject find(@Param("year") int year, @Param("month") int month, @Param("org_id") String orgId);
|
||||||
|
}
|
Loading…
Reference in new issue