From 708dbfcd443f9edd6db0bf2a45351838b3b33dd8 Mon Sep 17 00:00:00 2001 From: yixian Date: Mon, 15 Jan 2018 18:05:28 +0800 Subject: [PATCH] settle delay cashback --- .../core/impl/SettleDelayConfigurerImpl.java | 107 ++++++++++-------- 1 file changed, 59 insertions(+), 48 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/SettleDelayConfigurerImpl.java b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/SettleDelayConfigurerImpl.java index c5b9ce5a5..96b5e91c2 100644 --- a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/SettleDelayConfigurerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/SettleDelayConfigurerImpl.java @@ -13,6 +13,7 @@ import au.com.royalpay.payment.manage.merchants.core.ClientManager; import au.com.royalpay.payment.tools.CommonConsts; import au.com.royalpay.payment.tools.env.PlatformEnvironment; import au.com.royalpay.payment.tools.exceptions.BadRequestException; +import au.com.royalpay.payment.tools.lock.Locker; import au.com.royalpay.payment.tools.utils.CurrencyAmountUtils; import au.com.royalpay.payment.tools.utils.PageListUtils; import com.alibaba.fastjson.JSONObject; @@ -54,6 +55,8 @@ public class SettleDelayConfigurerImpl implements SettleDelayConfigurer { @Resource private ClearingDetailMapper clearingDetailMapper; @Resource + private Locker locker; + @Resource private RetailAppService retailAppService; private Logger logger = LoggerFactory.getLogger(getClass()); @@ -199,62 +202,70 @@ public class SettleDelayConfigurerImpl implements SettleDelayConfigurer { @Override @Transactional public void addCashback(Date date) { - date = DateUtils.truncate(date, Calendar.DATE); - LocalDate processDate = LocalDate.fromDateFields(date); - if (processDate.getDayOfWeek() != DateTimeConstants.TUESDAY) { - throw new BadRequestException("Not tuesday"); + String key = "settle_delay_cashback"; + if (!locker.lock(key, 600_000)) { + return; } - LocalDate sunday = processDate.minusDays(processDate.getDayOfWeek()); - LocalDate saturday = sunday.minusDays(1); - List clientAttends = clientSettleDelayConfMapper.listClients(new JSONObject(), new PageBounds()); - for (JSONObject attend : clientAttends) { - Date monday = DateUtils.addDays(date, -1); - if (attend.getDate("from_date").after(monday) || attend.getDate("to_date").before(monday)) { - continue; - } - int clientId = attend.getIntValue("client_id"); - JSONObject client = clientManager.getClientInfo(clientId); - if (client == null) { - continue; - } - String clientMoniker = client.getString("client_moniker"); - JSONObject clearing = clearingDetailMapper.listReport(date, clientId); - if (clearing == null) { - continue; + try { + date = DateUtils.truncate(date, Calendar.DATE); + LocalDate processDate = LocalDate.fromDateFields(date); + if (processDate.getDayOfWeek() != DateTimeConstants.TUESDAY) { + throw new BadRequestException("Not tuesday"); } - int detailId = clearing.getIntValue("clear_detail_id"); - List settleTrans = transactionMapper.listSettlementTransactions(detailId); - Assert.notEmpty(settleTrans, "No Settle History"); - String transactionOrderId = settleTrans.get(0).getString("order_id"); - List transactions = transactionMapper.listTransactionsOfClearingOrder(detailId, new PageBounds()); - BigDecimal totalSurcharge = BigDecimal.ZERO; - for (JSONObject transaction : transactions) { - Date day = transaction.getDate("transaction_time"); - LocalDate transactionDate = LocalDate.fromDateFields(day); - if (transactionDate.equals(sunday) || transactionDate.equals(saturday)) { + LocalDate sunday = processDate.minusDays(processDate.getDayOfWeek()); + LocalDate saturday = sunday.minusDays(1); + List clientAttends = clientSettleDelayConfMapper.listClients(new JSONObject(), new PageBounds()); + for (JSONObject attend : clientAttends) { + Date monday = DateUtils.addDays(date, -1); + if (attend.getDate("from_date").after(monday) || attend.getDate("to_date").before(monday)) { continue; } - BigDecimal surcharge = transaction.getBigDecimal("clearing_amount").subtract(transaction.getBigDecimal("settle_amount")); - if ("Debit".equals(transaction.getString("transaction_type"))) { - surcharge = surcharge.multiply(BigDecimal.valueOf(-1)); + int clientId = attend.getIntValue("client_id"); + JSONObject client = clientManager.getClientInfo(clientId); + if (client == null) { + continue; } - totalSurcharge = totalSurcharge.add(surcharge); - } - BigDecimal cashbackAmount = CurrencyAmountUtils.scale(totalSurcharge.multiply(attend.getBigDecimal("surcharge_discount")).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP), PlatformEnvironment.getEnv().getForeignCurrency()); - String remark = "Surcharge cashback for " + saturday.toString("dd/MMM/yyyy", Locale.ENGLISH) + " ~ " + sunday.toString("dd/MMM/yyyy", Locale.ENGLISH); - if (cashbackAmount.compareTo(BigDecimal.ZERO) > 0) { - cashbackService.saveSurchargeDiscountCashback(clientId, clientMoniker, transactionOrderId, cashbackAmount, date, remark); - try { - if (!PlatformEnvironment.getEnv().isDebug()) { - JSONObject order = new JSONObject(); - order.put("order_id", transactionOrderId); - order.put("client_id", clientId); - retailAppService.sendCashbackMessage(cashbackAmount.toPlainString(), order);// app message + String clientMoniker = client.getString("client_moniker"); + JSONObject clearing = clearingDetailMapper.listReport(date, clientId); + if (clearing == null) { + continue; + } + int detailId = clearing.getIntValue("clear_detail_id"); + List settleTrans = transactionMapper.listSettlementTransactions(detailId); + Assert.notEmpty(settleTrans, "No Settle History"); + String transactionOrderId = settleTrans.get(0).getString("order_id"); + List transactions = transactionMapper.listTransactionsOfClearingOrder(detailId, new PageBounds()); + BigDecimal totalSurcharge = BigDecimal.ZERO; + for (JSONObject transaction : transactions) { + Date day = transaction.getDate("transaction_time"); + LocalDate transactionDate = LocalDate.fromDateFields(day); + if (transactionDate.equals(sunday) || transactionDate.equals(saturday)) { + continue; + } + BigDecimal surcharge = transaction.getBigDecimal("clearing_amount").subtract(transaction.getBigDecimal("settle_amount")); + if ("Debit".equals(transaction.getString("transaction_type"))) { + surcharge = surcharge.multiply(BigDecimal.valueOf(-1)); + } + totalSurcharge = totalSurcharge.add(surcharge); + } + BigDecimal cashbackAmount = CurrencyAmountUtils.scale(totalSurcharge.multiply(attend.getBigDecimal("surcharge_discount")).divide(CommonConsts.HUNDRED, 2, BigDecimal.ROUND_HALF_UP), PlatformEnvironment.getEnv().getForeignCurrency()); + String remark = "Surcharge cashback for " + saturday.toString("dd/MMM/yyyy", Locale.ENGLISH) + " ~ " + sunday.toString("dd/MMM/yyyy", Locale.ENGLISH); + if (cashbackAmount.compareTo(BigDecimal.ZERO) > 0) { + cashbackService.saveSurchargeDiscountCashback(clientId, clientMoniker, transactionOrderId, cashbackAmount, date, remark); + try { + if (!PlatformEnvironment.getEnv().isDebug()) { + JSONObject order = new JSONObject(); + order.put("order_id", transactionOrderId); + order.put("client_id", clientId); + retailAppService.sendCashbackMessage(cashbackAmount.toPlainString(), order);// app message + } + } catch (Exception e) { + logger.error("发送App消息失败", e); } - } catch (Exception e) { - logger.error("发送App消息失败", e); } } + } finally { + locker.unlock(key); } }