From 7ad3c813a003a5bed3526046de85b7d38ae0b2cd Mon Sep 17 00:00:00 2001 From: yixian Date: Thu, 21 Mar 2019 10:49:01 +0800 Subject: [PATCH] revoke settlement pay back to distributed surcharge --- .../clearing/core/impl/CleanServiceImpl.java | 55 +++++++++++++++++++ .../ClientsSurchargeAccountsMapper.java | 5 +- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java index 3dfcdfb49..b225324dc 100644 --- a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java @@ -31,6 +31,7 @@ import au.com.royalpay.payment.tools.exceptions.BadRequestException; import au.com.royalpay.payment.tools.exceptions.ForbiddenException; import au.com.royalpay.payment.tools.exceptions.NotFoundException; import au.com.royalpay.payment.tools.locale.LocaleSupport; +import au.com.royalpay.payment.tools.lock.Locker; import au.com.royalpay.payment.tools.permission.enums.ManagerRole; import au.com.royalpay.payment.tools.tasksupport.TaskFinishNotifyEvent; import au.com.royalpay.payment.tools.utils.PageListUtils; @@ -153,6 +154,12 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider private ClientConfigService clientConfigService; @Resource private SysConfigManager sysConfigManager; + @Resource + private ClientsSurchargeAccountsMapper clientsSurchargeAccountsMapper; + @Resource + private ClearingDistributedSurchargeMapper clearingDistributedSurchargeMapper; + @Resource + private Locker locker; @Resource private ClientDeviceMapper clientDeviceMapper; @@ -1241,6 +1248,13 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider if (!log.getBooleanValue("editable")) { throw new ForbiddenException("Settlement log has been sent and unable to edit"); } + List details = clearingDetailMapper.listReportsOfSettlement(clearingId); + List detailsWithDistributedSurcharge = details.stream().filter(detail -> detail.getBigDecimal("distributed_surcharge").compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList()); + if (!detailsWithDistributedSurcharge.isEmpty()) { + for (JSONObject detail : detailsWithDistributedSurcharge) { + releaseDistributedSurcharge(detail); + } + } transactionMapper.deleteSettlementTransaction(clearingId); transactionMapper.removeSettleRemark(clearingId); clearingDetailAnalysisMapper.clearAnalysis(clearingId); @@ -1249,6 +1263,47 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider clearingLogMapper.deleteSettleLogs(clearingId); } + private void releaseDistributedSurcharge(JSONObject clearingDetail) { + int clientId = clearingDetail.getIntValue("client_id"); + BigDecimal distributedSurcharge = clearingDetail.getBigDecimal("distributed_surcharge"); + String lockKey = "client_surcharge_account_processing:" + clientId; + locker.lock(lockKey, 30_000, 1000); + try { + JSONObject account = getClientSurchargeAccount(clientId); + BigDecimal balance = account.getBigDecimal("balance"); + BigDecimal newBalance = balance.add(distributedSurcharge); + JSONObject surchargeLog = new JSONObject(); + String logId = DateFormatUtils.format(new Date(), "yyyyMMdd") + clientId + RandomStringUtils.random(5, true, true).toUpperCase(); + surchargeLog.put("log_id", logId); + surchargeLog.put("client_id", clientId); + surchargeLog.put("clearing_detail_id", clearingDetail.getString("clear_detail_id")); + surchargeLog.put("settle_date", clearingDetail.getDate("report_date")); + surchargeLog.put("create_time", new Date()); + surchargeLog.put("amount", distributedSurcharge); + surchargeLog.put("total_surcharge", clearingDetail.getBigDecimal("total_charge")); + surchargeLog.put("tax_amount", clearingDetail.getBigDecimal("tax_amount")); + surchargeLog.put("type", "Credit"); + surchargeLog.put("post_balance", newBalance); + surchargeLog.put("remark", "settle revoke"); + clearingDistributedSurchargeMapper.save(surchargeLog); + clientsSurchargeAccountsMapper.updateBalance(clientId, newBalance); + } finally { + locker.unlock(lockKey); + } + } + + private JSONObject getClientSurchargeAccount(int clientId) { + JSONObject account = clientsSurchargeAccountsMapper.find(clientId); + if (account == null) { + account = new JSONObject(); + account.put("client_id", clientId); + account.put("create_time", new Date()); + account.put("balance", 0); + clientsSurchargeAccountsMapper.save(account); + } + return account; + } + private byte[] getZipByteArr(List fileByteArrWithName) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ZipOutputStream zos = new ZipOutputStream(bos); diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientsSurchargeAccountsMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientsSurchargeAccountsMapper.java index 2e28ec96b..69884bfcd 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientsSurchargeAccountsMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientsSurchargeAccountsMapper.java @@ -7,7 +7,7 @@ import cn.yixblog.support.mybatis.autosql.annotations.SqlType; import com.alibaba.fastjson.JSONObject; import org.apache.ibatis.annotations.Param; -import java.util.List; +import java.math.BigDecimal; @AutoMapper(tablename = "sys_clients_surcharge_accounts", pkName = "client_id") @@ -22,4 +22,7 @@ public interface ClientsSurchargeAccountsMapper { @AutoSql(type = SqlType.UPDATE) void update(JSONObject surchargeAccount); + + @AutoSql(type = SqlType.UPDATE) + void updateBalance(@Param("client_id") int clientId, @Param("balance") BigDecimal balance); }