Merge branch 'develop'

master
yixian 4 years ago
commit 1ed31f8b9d

@ -50,7 +50,7 @@ public interface CleanService {
List<JSONObject> getSettleLogs(Date dt, List<String> clearIds);
List<ABAFile> getAba(Date dt, String bank, List<JSONObject> logs) throws IOException;
List<ABAFile> getAba(Date dt, List<JSONObject> logs) throws IOException;
void settlementAba(Date date, HttpServletResponse response) throws IOException;
@ -105,4 +105,6 @@ public interface CleanService {
void undoSettle(Date date, int clearingId);
ByteArrayResource downloadBatchSettleReportXlsx(int batchId);
JSONObject findSettleLog(int clearingId);
}

@ -3,6 +3,7 @@ package au.com.royalpay.payment.manage.management.clearing.core.impl;
import au.com.royalpay.payment.core.PaymentApi;
import au.com.royalpay.payment.core.exceptions.InvalidShortIdException;
import au.com.royalpay.payment.core.tasksupport.SettlementSupport;
import au.com.royalpay.payment.core.utils.ExtParamsUtils;
import au.com.royalpay.payment.manage.management.clearing.core.CleanService;
import au.com.royalpay.payment.manage.mappers.log.*;
import au.com.royalpay.payment.manage.mappers.payment.TaskManualSettleMapper;
@ -32,6 +33,7 @@ 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.merchants.beans.BalanceGroup;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.tools.tasksupport.TaskFinishNotifyEvent;
import au.com.royalpay.payment.tools.utils.DateVaildUtil;
@ -536,15 +538,16 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
}
@Override
public List<ABAFile> getAba(Date dt, String bank, List<JSONObject> logs) {
public List<ABAFile> getAba(Date dt, List<JSONObject> logs) {
List<ABAFile> files = new ArrayList<>();
for (JSONObject log : logs) {
List<JSONObject> details = clearingDetailMapper.listReportsOfSettlement(log.getIntValue("clearing_id"));
details = mergeBatchSettleClients(details);
String remark = extractSettleRemark(log);
files.addAll(generateSettleAbaFiles(dt, details, log.getDate("operate_time"), remark));
BalanceGroup group = BalanceGroup.valueOf(log.getString("balance_group"));
files.addAll(generateSettleAbaFiles(dt, group, details, log.getDate("operate_time"), remark));
}
return files.stream().filter(file -> bank.equals(file.bank())).collect(Collectors.toList());
return files;
}
public String extractSettleRemark(JSONObject log) {
@ -589,7 +592,8 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
for (JSONObject log : logs) {
List<JSONObject> details = clearingDetailMapper.listReportsOfSettlement(log.getIntValue("clearing_id"));
details = mergeBatchSettleClients(details);
files.addAll(generateSettleAbaFiles(dt, details, log.getDate("operate_time"), extractSettleRemark(log)));
BalanceGroup group = BalanceGroup.valueOf(log.getString("balance_group"));
files.addAll(generateSettleAbaFiles(dt, group, details, log.getDate("operate_time"), extractSettleRemark(log)));
}
OutputStream ous = resp.getOutputStream();
if (files.size() == 1) {
@ -633,7 +637,8 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
resp.addHeader("Content-Disposition", "attachment; filename=" + zipName);
OutputStream ous = resp.getOutputStream();
List<ABAFile> abaFiles = generateSettleAbaFiles(settleDate, details, opTime, extractSettleRemark(clearing));
BalanceGroup group = BalanceGroup.valueOf(clearing.getString("balance_group"));
List<ABAFile> abaFiles = generateSettleAbaFiles(settleDate, group, details, opTime, extractSettleRemark(clearing));
try (ZipOutputStream zos = new ZipOutputStream(ous)) {
for (ABAFile aba : abaFiles) {
zos.putNextEntry(new ZipEntry(aba.filename()));
@ -644,16 +649,16 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
}
}
private List<ABAFile> generateSettleAbaFiles(Date dt, List<JSONObject> settlements, Date operateTime, String remark) {
private List<ABAFile> generateSettleAbaFiles(Date dt, BalanceGroup group, List<JSONObject> settlements, Date operateTime, String remark) {
List<String> banks = settlements.stream().map(detail -> detail.getString("settle_bank")).distinct().collect(Collectors.toList());
return banks.stream().map(bank -> generateSettleAbaFile(bank, dt, settlements))
return banks.stream().map(bank -> generateSettleAbaFile(bank, group, dt, settlements))
.peek(file -> file.setOperateTime(operateTime))
.peek(file -> file.setRemark(remark))
.collect(Collectors.toList());
}
private ABAFile generateSettleAbaFile(String bank, Date dt, List<JSONObject> settlements) {
ABAFile aba = ABATemplate.getConfig().initFile(bank, dt);
private ABAFile generateSettleAbaFile(String bank, BalanceGroup group, Date dt, List<JSONObject> settlements) {
ABAFile aba = ABATemplate.getConfig().initFile(group, bank, dt);
for (JSONObject settle : settlements) {
if (!bank.equals(settle.getString("settle_bank"))) {
continue;
@ -1026,10 +1031,10 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
}
@Override
public void exportListClearingTransactions(int client_id, String clearingDetailId, JSONObject partner, HttpServletResponse resp) {
public void exportListClearingTransactions(int clientId, String clearingDetailId, JSONObject partner, HttpServletResponse resp) {
OutputStream ous = null;
try {
JSONObject clearTransation = listClearingTransactions(client_id, clearingDetailId, partner);
JSONObject clearTransation = listClearingTransactions(clientId, clearingDetailId, partner);
resp.setContentType("application/octet-stream;");
Date reportDate = clearTransation.getDate("report_date");
resp.addHeader("Content-Disposition",
@ -1380,7 +1385,7 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
attachList.add(attach1);
JSONObject attach2 = new JSONObject();
List<ABAFile> abaFileList = getAba(date, "CBA", clearLogs);
List<ABAFile> abaFileList = getAba(date, clearLogs);
String fileName2 = "Merchant_Settlement_Info_aba_" + DateFormatUtils.format(date, "yyyyMMdd");
if (abaFileList.size() > 1) {
fileName2 += ".zip";
@ -1429,7 +1434,12 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
settleMailRecord.put("notice_status", 0);
logSettleMailMapper.save(settleMailRecord);
}
sendTaskFinishMessages(ManagerRole.FINANCIAL_STAFF, "清算文件已发送清算方", "发送清算通知");
String detailDescription = clearLogs.stream()
.map(log -> String.format("[%s]%s", log.getString("clearing_id"),
ExtParamsUtils.getExtParamsValue(log.getString("plan_detail"),
detail -> StringUtils.defaultIfEmpty(detail.getString("remark"), detail.getString("plan_id")))))
.collect(Collectors.joining(","));
sendTaskFinishMessages(ManagerRole.FINANCIAL_STAFF, "清算文件已发送清算方:"+detailDescription, "发送清算通知");
if (autoMarkSent) {
if (!clearIds.isEmpty()) {
clearingLogMapper.lockSettlementsById(clearLogs.stream().map(log -> log.getString("clearing_id")).collect(Collectors.toList()));
@ -1523,7 +1533,8 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
throw new ForbiddenException("Settlement log has been sent and unable to edit");
}
ABAConfig config = ABATemplate.getConfig();
String defaultBank = config.getRemainsTo();
BalanceGroup group = BalanceGroup.valueOf(log.getString("balance_group"));
String defaultBank = config.getRemainsTo(group);
clearingDetailMapper.updateAllBanks(defaultBank, clearingId);
List<JSONObject> details = clearingDetailMapper.listReportsOfSettlement(clearingId);
details = mergeBatchSettleClients(details);
@ -1547,6 +1558,9 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
if (base == null) {
throw new BadRequestException("Invalid bank code:" + bank);
}
if (base.acceptBalanceGroup(group)) {
throw new BadRequestException("Balance group not match:" + group + ":" + bank);
}
BigDecimal bankAmount = bankDistribution.getBigDecimal(bank);
for (JSONObject detail : details) {
String detailBank = detail.getString("settle_bank");
@ -1639,6 +1653,15 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
}
}
@Override
public JSONObject findSettleLog(int clearingId) {
JSONObject clearing = clearingLogMapper.findById(clearingId);
if (clearing == null) {
throw new NotFoundException("Settle record not found:" + clearingId);
}
return clearing;
}
private void releaseDistributedSurcharge(JSONObject clearingDetail) {
int clientId = clearingDetail.getIntValue("client_id");
BigDecimal distributedSurcharge = clearingDetail.getBigDecimal("distributed_surcharge");

@ -6,6 +6,7 @@ import au.com.royalpay.payment.manage.permission.manager.RequireManager;
import au.com.royalpay.payment.manage.support.abafile.ABATemplate;
import au.com.royalpay.payment.tools.CommonConsts;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.merchants.beans.BalanceGroup;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject;
import org.springframework.core.io.ByteArrayResource;
@ -56,11 +57,13 @@ public class SettlementDevController {
}
}
@GetMapping("/available_banks")
public JSONObject getAvailableBanks() {
List<String> banks = ABATemplate.getConfig().availableBanks();
@GetMapping("/clearings/{clearingId}/available_banks")
public JSONObject getAvailableBanks(@PathVariable int clearingId) {
JSONObject clearing = cleanService.findSettleLog(clearingId);
BalanceGroup group = BalanceGroup.valueOf(clearing.getString("balance_group"));
List<String> banks = ABATemplate.getConfig().availableBanks(group);
JSONObject res = new JSONObject();
res.put("remains_to", ABATemplate.getConfig().getRemainsTo());
res.put("remains_to", ABATemplate.getConfig().getRemainsTo(group));
res.put("banks", banks);
return res;
}

@ -1,9 +1,12 @@
package au.com.royalpay.payment.manage.support.abafile;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.merchants.beans.BalanceGroup;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.*;
import java.util.stream.Collectors;
/**
* Create by yixian at 2018-06-25 17:39
@ -12,24 +15,24 @@ import java.util.*;
public class ABAConfig {
private Map<String, ABABase> bank = new HashMap<>();
private String defaultBank;
private String remainsTo;
public ABAFile initFile(String bank, Date settleDate) {
public ABAFile initFile(BalanceGroup group, String bank, Date settleDate) {
ABABase base = this.bank.get(bank);
if (base == null) {
throw new BadRequestException("Invalid bank:" + bank);
}
return base.initFile(settleDate);
if (!base.acceptBalanceGroup(group)) {
throw new BadRequestException("Balance group not match:" + group + "," + bank);
}
public String getDefaultBank() {
return defaultBank;
return base.initFile(settleDate);
}
public ABAConfig setDefaultBank(String defaultBank) {
this.defaultBank = defaultBank;
return this;
public String getRemainsTo(BalanceGroup group) {
return bank.entrySet().stream()
.filter(entry -> entry.getValue().acceptBalanceGroup(group))
.filter(entry -> !entry.getValue().isManualSending())
.map(Map.Entry::getKey)
.findFirst().orElse(null);
}
public Map<String, ABABase> getBank() {
@ -45,17 +48,11 @@ public class ABAConfig {
return this;
}
public String getRemainsTo() {
return remainsTo;
}
public ABAConfig setRemainsTo(String remainsTo) {
this.remainsTo = remainsTo;
return this;
}
public List<String> availableBanks() {
return new ArrayList<>(bank.keySet());
public List<String> availableBanks(BalanceGroup group) {
return bank.entrySet().stream()
.filter(entry -> entry.getValue().acceptBalanceGroup(group))
.map(Map.Entry::getKey)
.collect(Collectors.toList());
}
public static class ABABase {
@ -65,6 +62,7 @@ public class ABAConfig {
private String bsb;
private String accountNo;
private String accountName;
private BalanceGroup[] balanceGroup;
public ABAFile initFile(Date settleDate) {
return new ABAFile(this, settleDate);
@ -123,5 +121,18 @@ public class ABAConfig {
this.accountName = accountName;
return this;
}
public BalanceGroup[] getBalanceGroup() {
return balanceGroup;
}
public ABABase setBalanceGroup(BalanceGroup[] balanceGroup) {
this.balanceGroup = balanceGroup;
return this;
}
public boolean acceptBalanceGroup(BalanceGroup group) {
return ArrayUtils.contains(balanceGroup, group);
}
}
}

@ -13,7 +13,6 @@ import javax.annotation.PostConstruct;
@EnableConfigurationProperties(ABAConfig.class)
public class ABATemplate {
private static ABATemplate tpl;
@Autowired
private ABAConfig config;
@PostConstruct
@ -24,4 +23,10 @@ public class ABATemplate {
public static ABAConfig getConfig() {
return tpl.config;
}
@Autowired
public ABATemplate setConfig(ABAConfig config) {
this.config = config;
return this;
}
}

@ -121,26 +121,39 @@ settle:
bank:
ANZ:
account-name: Tunnel Show Pty Ltd
account-no: 837022519
apca: 514624
account-no: '837022519'
apca: '514624'
bank: ANZ
bsb: 13006
bsb: '013006'
manual-sending: true
balance-group:
- NORMAL_CROSS_BORDER
CBA:
account-name: Tunnel Show Pty Ltd
account-no: 11655861
apca: 301500
account-no: '11655861'
apca: '301500'
bank: CBA
bsb: 63109
bsb: '063109'
balance-group:
- NORMAL_CROSS_BORDER
NAB:
account-name: Tunnel Show Pty Ltd
account-no: 837022519
apca: 514624
account-no: '837022519'
apca: '514624'
bank: NAB
bsb: 13006
bsb: '013006'
manual-sending: true
default-bank: CBA
remains-to: ANZ
balance-group:
- NORMAL_CROSS_BORDER
CARD:
account-name: UPay Pty Ltd
account-no: '13677888'
apca: '301500'
bank: CBA
bsb: '063010'
balance-group:
- RPAY_SVC_CARD
- RPAY_SVC_DIRECTDEBIT
spring:
mail:
host: smtp.office365.com

@ -387,7 +387,7 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
};
$scope.distributeBankDialog = function () {
var log = $scope.getCurrentLog();
let log = $scope.getCurrentLog();
$uibModal.open({
templateUrl: '/static/analysis/templates/settlement_bank_distribution_dialog.html',
controller: 'bankDistributionDialogCtrl',
@ -396,7 +396,7 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
return log;
},
banksConfig: ['$http', function ($http) {
return $http.get('/sys/settlement/available_banks')
return $http.get('/sys/settlement/clearings/' + log.clearing_id + '/available_banks')
}],
settleDate: function () {
return $stateParams.date;
@ -522,7 +522,10 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
$scope.error_msg = '正在发送,请稍后。';
$scope.sendMailButton = true;
$http.post('/sys/settlement/reports/' + $stateParams.date + '/send_settlement_xlsx',
{clearing_ids:$scope.settleLogs.filter(log=>log.send).map(log=>log.id),mark_sent:$scope.config.mark_sent}).then(function (resp) {
{
clearing_ids: $scope.settleLogs.filter(log => log.send).map(log => log.id),
mark_sent: $scope.config.mark_sent
}).then(function (resp) {
$scope.error_msg = resp.data.msg;
$scope.sendMailButton = false;
if (resp.data.result == 0) {

@ -1,7 +1,7 @@
$(function () {
let $container = $('.card-input-box')[0];
let ctrl = {ready: false, pending: false}
let cardFrame = window.channel_account_id ? new TokenInputFrame($container, window.channel_account_id) : new CardInputFrame($container);
let cardFrame = new CardInputFrame($container, window.card_input_appid, window.card_input_token);
let $errorMsgBox = $('#errorMsgBox');
let loading = $('.loading-container');
cardFrame.onSuccess = function (secretData) {

@ -0,0 +1,34 @@
package au.com.royalpay.payment.manage.task;
import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.RPayPaymentCardSvcApi;
import au.com.royalpay.payment.manage.mappers.system.ManagerMapper;
import au.com.royalpay.payment.manage.tradelog.refund.RefundService;
import com.alibaba.fastjson.JSONObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.math.BigDecimal;
/**
* Create by davep at 2020-04-17 15:37
*/
@SpringBootTest
@ActiveProfiles("officedev,wechat,jd,alipay,bestpay,rpay,yeepay,lakala,rppaysvc")
@RunWith(SpringJUnit4ClassRunner.class)
public class RefundTest {
@Resource
private RPayPaymentCardSvcApi rPayPaymentCardSvcApi;
@Resource
private ManagerMapper managerMapper;
@Test
public void test() throws InterruptedException {
String refundId = "8956ae96-44c0-48e8-9865-865c05fd3831";
rPayPaymentCardSvcApi.checkRefundStatus(refundId);
Thread.sleep(60_000);
}
}

@ -35,7 +35,7 @@ public class SettleMailTest {
public void parse() throws IOException {
Date date = DateUtils.truncate(new Date(), Calendar.DATE);
final ArrayList<String> clearIds = new ArrayList<>();
List<ABAFile> abaFileList = cleanService.getAba(date, "CBA", cleanService.getSettleLogs(date, clearIds));
List<ABAFile> abaFileList = cleanService.getAba(date, cleanService.getSettleLogs(date, clearIds));
Context ctx = new Context();
ctx.setVariable("date", DateFormatUtils.format(date, "dd-MM-yyyy"));

Loading…
Cancel
Save