diff --git a/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java index 1e5f81f2b..d9f54108c 100644 --- a/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java @@ -78,7 +78,7 @@ public class BDPrizeServiceImpl implements BDPrizeService { private static BigDecimal percent = new BigDecimal(100); - private static String[] channels = new String[]{"Wechat", "Alipay", "Bestpay", "jd", "AlipayOnline"}; + private static String[] channels = new String[]{"Wechat", "Alipay", "Bestpay", "jd", "AlipayOnline","hf"}; @Override public void generateRecord() { @@ -133,10 +133,14 @@ public class BDPrizeServiceImpl implements BDPrizeService { } } //BD Leader Prize + //bd_type:1 销售总监 2 大客户经理 3悉尼分公司经理 4 COO 5 NGDepartment + //todo 10月开始悉尼分公司经理不享受悉尼销售组提成 List bdLeaders = managerMapper.listByRole(1, ManagerRole.BD_LEADER.getMask()); for (JSONObject leader : bdLeaders) { BigDecimal groupAmount = transactionMapper.TotalAmountForBDLeaderPrize(now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1,leader.getString("manager_id")); - JSONObject rateJson = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, groupAmount.toString(), 1); + JSONObject bdConfig = financialBDConfigMapper.getBdConfig(leader.getString("manager_id")); + int bd_type = ("Sydney").equals(bdConfig.getString("city"))?2:1;//sydney leader 即悉尼大客户经理 + JSONObject rateJson = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, groupAmount.toString(), bd_type); BigDecimal groupPrize = new BigDecimal(0); if (rateJson != null) { groupPrize = groupAmount.multiply(new BigDecimal(rateJson.getString("commission_rate")).divide(percent)).setScale(2, BigDecimal.ROUND_DOWN); @@ -212,28 +216,44 @@ public class BDPrizeServiceImpl implements BDPrizeService { DateTime monthDate = new DateTime(month); //bd manager commission - JSONObject cityPrizeLog = new JSONObject(); - cityPrizeLog.put("total_amount", cplTotalprize); - JSONObject cplRate = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, cplTotalprize.toString(), 2); - if (cplRate == null) { - cityPrizeLog.put("total_prize", 0.00); +// JSONObject cityPrizeLog = new JSONObject(); +// cityPrizeLog.put("total_amount", cplTotalprize); +// JSONObject cplRate = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, cplTotalprize.toString(), 2); +// if (cplRate == null) { +// cityPrizeLog.put("total_prize", 0.00); +// } else { +// BigDecimal _commission_rate = new BigDecimal(cplRate.getString("commission_rate")); +// BigDecimal _total_amount = new BigDecimal(cityPrizeLog.getString("total_amount")); +// BigDecimal total_prize = _total_amount.multiply(_commission_rate.divide(percent)).setScale(2, BigDecimal.ROUND_DOWN); +// cityPrizeLog.put("total_prize", total_prize); +// } +// report.put("cityPrizeLogs", cityPrizeLog); + + //bd_type=3 悉尼分公司经理 悉尼销售组和大客户组流水提成 + + JSONObject sydneyPrizeLog = new JSONObject(); + BigDecimal sydneyAmount = transactionMapper.TotalAmountForSydneyGMPrize(monthDate.getYear(), monthDate.getMonthOfYear()); + sydneyPrizeLog.put("total_amount",sydneyAmount); + JSONObject sydneyGMRate = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, sydneyAmount.toString(), 3); + if (sydneyGMRate == null) { + sydneyPrizeLog.put("total_prize", 0.00); } else { - BigDecimal _commission_rate = new BigDecimal(cplRate.getString("commission_rate")); - BigDecimal _total_amount = new BigDecimal(cityPrizeLog.getString("total_amount")); - BigDecimal total_prize = _total_amount.multiply(_commission_rate.divide(percent)).setScale(2, BigDecimal.ROUND_DOWN); - cityPrizeLog.put("total_prize", total_prize); + BigDecimal sydney_commission_rate = new BigDecimal(sydneyGMRate.getString("commission_rate")); + BigDecimal total_prize = sydneyAmount.multiply(sydney_commission_rate.divide(percent)).setScale(2, BigDecimal.ROUND_DOWN); + sydneyPrizeLog.put("total_prize", total_prize); } - report.put("cityPrizeLogs", cityPrizeLog); + report.put("sydneyPrizeLog", sydneyPrizeLog); - //Director commission - JSONObject directPrizeLogs = new JSONObject(); + //COO & NJ commission JSONObject params = new JSONObject(); params.put("begin", TimeZoneUtils.beginDate(TimeZoneUtils.getFirstDay(monthDate.toString()))); params.put("end", TimeZoneUtils.getPerFirstDayOfMonth(TimeZoneUtils.getLastDay(monthDate.toString()))); BigDecimal totalprize = transactionAnalysisMapper.analysisTotalAmount(params); + + JSONObject directPrizeLogs = new JSONObject(); directPrizeLogs.put("total_amount", totalprize); - JSONObject rate = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, totalprize.toString(), 3); + JSONObject rate = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, totalprize.toString(), 4); if (rate == null) { directPrizeLogs.put("total_prize", 0.00); } else { @@ -243,6 +263,18 @@ public class BDPrizeServiceImpl implements BDPrizeService { directPrizeLogs.put("total_prize", total_prize); } report.put("directPrizeLogs", directPrizeLogs); + + JSONObject ngDepartmentPrizeLog = new JSONObject(); + ngDepartmentPrizeLog.put("total_amount", totalprize); + JSONObject ngRate = financialBDCommissionConfigMapper.findCurrentCommissionRate(month, totalprize.toString(), 5); + if (ngRate == null) { + ngDepartmentPrizeLog.put("total_prize", 0.00); + } else { + BigDecimal ng_commission_rate = new BigDecimal(ngRate.getString("commission_rate")); + BigDecimal ng_total_prize = totalprize.multiply(ng_commission_rate.divide(percent)).setScale(2, BigDecimal.ROUND_DOWN); + ngDepartmentPrizeLog.put("total_prize", ng_total_prize); + } + report.put("ngDepartmentPrizeLog", ngDepartmentPrizeLog); return report; } diff --git a/src/main/java/au/com/royalpay/payment/manage/bdprize/support/impls/BDPrizeCalculatorDefaultImpl.java b/src/main/java/au/com/royalpay/payment/manage/bdprize/support/impls/BDPrizeCalculatorDefaultImpl.java index b9033b60d..0ea9da667 100644 --- a/src/main/java/au/com/royalpay/payment/manage/bdprize/support/impls/BDPrizeCalculatorDefaultImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/bdprize/support/impls/BDPrizeCalculatorDefaultImpl.java @@ -46,16 +46,16 @@ public class BDPrizeCalculatorDefaultImpl implements BDPrizeCalculator { public BDPrizeCalculatorDefaultImpl rateConfig(List rateConfig) { for (JSONObject rateCfgItem : rateConfig) { int level = rateCfgItem.getIntValue("bd_level"); - int monthLevel = rateCfgItem.getIntValue("time_range"); + int kpiRange = rateCfgItem.getIntValue("kpi_range"); Map> rates = rateConfigMap.get(level); if (rates == null) { rates = new HashMap<>(); rateConfigMap.put(level, rates); } - List rate = rates.get(monthLevel); + List rate = rates.get(kpiRange); if (rate == null) { rate = new ArrayList<>(); - rates.put(monthLevel, rate); + rates.put(kpiRange, rate); } rate.add(rateCfgItem); } @@ -90,10 +90,12 @@ public class BDPrizeCalculatorDefaultImpl implements BDPrizeCalculator { for (Map.Entry detail : resultItem.getValue().entrySet()) { JSONObject detailItem = detail.getValue(); int clientId = detailItem.getIntValue("client_id"); - int months = detailItem.getIntValue("client_create_months"); - BigDecimal bdRate = getRate(bdLevel, months, detailItem.getIntValue("client_source"), detailItem.getBigDecimal("rate_value")); +// int months = detailItem.getIntValue("client_create_months"); BigDecimal totalTransaction = detailItem.getBigDecimal("total_transaction"); BigDecimal coefficient = detailItem.getBigDecimal("coefficient"); + BigDecimal realTransaction = totalTransaction.multiply(coefficient).setScale(2,BigDecimal.ROUND_DOWN); + int prizeLevel = getKpiPrizeLevel(realTransaction,log.getBigDecimal("kpi_amount")); + BigDecimal bdRate = getNewRate(bdLevel, prizeLevel, detailItem.getIntValue("client_source"), detailItem.getBigDecimal("rate_value")); BigDecimal prizeValue = totalTransaction.multiply(coefficient).multiply(bdRate).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN); BigDecimal donation = BigDecimal.ZERO; if (clientsWithBDAwayDeterminor.clientWithBDAway(clientId, month)) { @@ -209,4 +211,39 @@ public class BDPrizeCalculatorDefaultImpl implements BDPrizeCalculator { } throw new ServerErrorException("Prize Rate Config has no equalize:bdLevel=" + bdLevel + ",months=" + months + ",clientRate=" + clientRate.doubleValue()); } + + + private BigDecimal getNewRate(int bdLevel, int kpiRange, int clientSource, BigDecimal clientRate) { + BigDecimal prizeRate = BigDecimal.ZERO; + Map> rates = rateConfigMap.get(bdLevel); + List rate = rates.get(kpiRange); + for (JSONObject rateCfg : rate) { + if (rateCfg.getBigDecimal("rate_from").compareTo(clientRate) <= 0 && rateCfg.getBigDecimal("rate_to").compareTo(clientRate) >= 0) { + prizeRate= rateCfg.getBigDecimal("prize_rate"); + continue; + } + } + if (clientSource == 1) { + return prizeRate; + } else { + return prizeRate.divide(BigDecimal.valueOf(2),3,BigDecimal.ROUND_HALF_DOWN); + } + } + + private int getKpiPrizeLevel(BigDecimal transactionAmount,BigDecimal kpiAmount){ + BigDecimal rate = transactionAmount.divide(kpiAmount,2,BigDecimal.ROUND_HALF_DOWN); + if (rate.compareTo(BigDecimal.valueOf(0.5))<0){ + return 1; + } + if (rate.compareTo(BigDecimal.valueOf(0.8))<0){ + return 2; + } + if (rate.compareTo(BigDecimal.valueOf(1))<0){ + return 3; + } + if (rate.compareTo(BigDecimal.valueOf(1.2))<0){ + return 4; + } + return 5; + } } 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 5e153fda9..be48b0efc 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 @@ -94,6 +94,8 @@ public interface TransactionMapper { List listTransactionsForBDPrize(@Param("year") int year, @Param("month") int month, @Param("channel") String channel); BigDecimal TotalAmountForBDLeaderPrize(@Param("year") int year, @Param("month") int month, @Param("bd_group") String bd_group); + BigDecimal TotalAmountForSydneyGMPrize(@Param("year") int year, @Param("month") int month); + List listTransactionsForCityPartnerCommission(@Param("year") int year, @Param("month") int month); 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 ad74bfa4d..a6480b29e 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 @@ -495,10 +495,7 @@ INNER JOIN pmt_orders o ON o.order_id = t.order_id INNER JOIN sys_clients c ON c.client_id = o.client_id AND c.org_id = 1 WHERE year(o.create_time) = #{year} AND month(o.create_time) = #{month} AND t.channel != 'Settlement' - - and t.channel not in ('Alipay','Bestpay') - - + and t.channel = #{channel} GROUP BY o.client_id, trade_date @@ -528,6 +525,30 @@ where b.is_valid=1 and b.start_date<=now() and (b.end_date is null or b.end_date >= now()) AND c.bd_group=#{bd_group} or c.manager_id=#{bd_group}) + +