diff --git a/pom.xml b/pom.xml
index 4c9989945..330d44d93 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,7 +9,7 @@
4.0.0
manage
- 2.3.47
+ 2.3.48
UTF-8
2.4.0
diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.java b/src/main/java/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.java
index 2a0978077..e1bc95f50 100644
--- a/src/main/java/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.java
+++ b/src/main/java/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.java
@@ -51,4 +51,6 @@ public interface ClientAnalysisMapper {
List tradeSubMerchantIdBy60Days(@Param("begin") Date begin);
List countClientsSettlementCycle(JSONObject params);
+
+ List listSecurePayMchs();
}
diff --git a/src/main/java/au/com/royalpay/payment/manage/dev/web/TestController.java b/src/main/java/au/com/royalpay/payment/manage/dev/web/TestController.java
index 6a7c5f977..fcdf0bccf 100644
--- a/src/main/java/au/com/royalpay/payment/manage/dev/web/TestController.java
+++ b/src/main/java/au/com/royalpay/payment/manage/dev/web/TestController.java
@@ -579,4 +579,9 @@ public class TestController {
params.put("client_moniker", clientMoniker);
return params;
}
+
+ @GetMapping(value = "/securepay/settle/file")
+ public void sendSecurePaySettleFile() {
+ tradeSecureService.sendSecurePaySettleFile("20200803");
+ }
}
diff --git a/src/main/java/au/com/royalpay/payment/manage/system/core/TradeSecureService.java b/src/main/java/au/com/royalpay/payment/manage/system/core/TradeSecureService.java
index 599bfd2ca..33dcb175f 100644
--- a/src/main/java/au/com/royalpay/payment/manage/system/core/TradeSecureService.java
+++ b/src/main/java/au/com/royalpay/payment/manage/system/core/TradeSecureService.java
@@ -16,4 +16,6 @@ public interface TradeSecureService {
void manualDownloadHanyinSecureReport(Date date, boolean upload, HttpServletResponse resp);
TradeSecureFile getSecureReportFile(Date date);
+
+ void sendSecurePaySettleFile(String dateStr);
}
diff --git a/src/main/java/au/com/royalpay/payment/manage/system/core/impl/TradeSecureServiceHanyinImpl.java b/src/main/java/au/com/royalpay/payment/manage/system/core/impl/TradeSecureServiceHanyinImpl.java
index 060a41e1b..23ee9beaa 100644
--- a/src/main/java/au/com/royalpay/payment/manage/system/core/impl/TradeSecureServiceHanyinImpl.java
+++ b/src/main/java/au/com/royalpay/payment/manage/system/core/impl/TradeSecureServiceHanyinImpl.java
@@ -1,12 +1,17 @@
package au.com.royalpay.payment.manage.system.core.impl;
import au.com.royalpay.payment.core.exceptions.ChannelNetworkException;
+import au.com.royalpay.payment.manage.analysis.mappers.ClientAnalysisMapper;
import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper;
import au.com.royalpay.payment.manage.system.core.TradeSecureService;
import au.com.royalpay.payment.manage.system.core.beans.TradeSecureFile;
+import au.com.royalpay.payment.manage.tradelog.beans.TradeLogQuery;
+import au.com.royalpay.payment.manage.tradelog.core.TradeLogService;
import au.com.royalpay.payment.tools.env.SysConfigManager;
import com.alibaba.fastjson.JSONObject;
import com.jcraft.jsch.*;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.commons.vfs2.FileSystemOptions;
import org.apache.commons.vfs2.provider.sftp.SftpClientFactory;
import org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder;
@@ -40,10 +45,18 @@ public class TradeSecureServiceHanyinImpl implements TradeSecureService {
private String sftpUsername;
@Value("${app.hanyin-secure.sftp-pwd}")
private String sftpPwd;
+ @Value("${app.securepay.sftp.username:upitest}")
+ private String securePaySftpName;
+ @Value("${app.securepay.sftp.password:upitest}")
+ private String securePaySftpPwd;
@Resource
private TransactionMapper transactionMapper;
@Resource
+ private ClientAnalysisMapper clientAnalysisMapper;
+ @Resource
private SysConfigManager sysConfigManager;
+ @Resource
+ private TradeLogService tradeLogService;
@Override
public void uploadSecureReportYesterday() {
@@ -119,4 +132,51 @@ public class TradeSecureServiceHanyinImpl implements TradeSecureService {
file.addTransactions(debits);
return file;
}
+
+ @Override
+ public void sendSecurePaySettleFile(String dateStr) {
+ List scpayMchs = clientAnalysisMapper.listSecurePayMchs();
+ scpayMchs.forEach(mch -> {
+ TradeLogQuery query = new TradeLogQuery();
+ query.setDatefrom(dateStr);
+ query.setDatefrom(dateStr);
+ byte[] fileData = tradeLogService.exportPDFSettlement(query, mch);
+ String fileName = dateStr + "-SETTLEMENT-" + RandomStringUtils.random(9, true, true).toUpperCase() + "-"
+ + mch.getString("client_moniker") + ".pdf";
+ sendSftpFile(dateStr, fileName, fileData);
+ });
+
+ }
+
+ private void sendSftpFile(String dateStr, String fileName, byte[] data) {
+ Session session = null;
+ ChannelSftp command = null;
+ try {
+ session = initSFTPConnection(securePaySftpName, securePaySftpPwd);
+ Channel channel = session.openChannel("sftp");
+ channel.connect();
+ command = (ChannelSftp) channel;
+ try {
+ command.put(new ByteArrayInputStream(data), "/" + StringUtils.substring(dateStr, 0, 6) + "/" + fileName);
+ logger.info("文件发送成功!");
+ } catch (SftpException e) {
+ logger.error(e.getMessage());
+ }
+ } catch (IOException | JSchException e) {
+ throw new ChannelNetworkException("Send Settlement file failed", e);
+ } finally {
+ if (command != null && command.isConnected()) {
+ command.exit();
+ session.disconnect();
+ }
+ }
+ }
+
+ private Session initSFTPConnection(String sftpUsername, String sftpPassword) throws IOException {
+ FileSystemOptions fso = new FileSystemOptions();
+ return SftpClientFactory.createConnection("124.156.126.236", 2022,
+ sftpUsername.toCharArray(), sftpPassword.toCharArray(), fso);
+ }
+
+
}
diff --git a/src/main/java/au/com/royalpay/payment/manage/task/SecurePaySettleFileTask.java b/src/main/java/au/com/royalpay/payment/manage/task/SecurePaySettleFileTask.java
new file mode 100644
index 000000000..70f58b530
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/task/SecurePaySettleFileTask.java
@@ -0,0 +1,28 @@
+package au.com.royalpay.payment.manage.task;
+
+import au.com.royalpay.payment.manage.system.core.TradeSecureService;
+import au.com.royalpay.payment.tools.scheduler.SynchronizedScheduler;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+@Component
+@ConditionalOnProperty(value = "app.run-tasks", havingValue = "true")
+public class SecurePaySettleFileTask {
+
+ @Resource
+ private SynchronizedScheduler synchronizedScheduler;
+ @Resource
+ private TradeSecureService tradeSecureService;
+
+ @Scheduled(cron = "0 0 3 * * *")
+ public void sendSecurePaySettleFile() {
+ synchronizedScheduler.executeProcess("task:securepay_settle_file_sending", 60_000, () ->
+ tradeSecureService.sendSecurePaySettleFile(DateFormatUtils.format(new Date(), "yyyyMMdd"))
+ );
+ }
+}
diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/TradeLogService.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/TradeLogService.java
index 7dcf8e398..e79e3201a 100644
--- a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/TradeLogService.java
+++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/TradeLogService.java
@@ -69,6 +69,8 @@ public interface TradeLogService {
void exportPDFSettlement(TradeLogQuery query, JSONObject partner, HttpServletResponse response);
+ byte[] exportPDFSettlement(TradeLogQuery query, JSONObject client);
+
void exportExcelAllPartner(TradeLogQuery query, JSONObject partner, HttpServletResponse httpResponse) throws Exception;
}
diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java
index d7ebb7de5..e8e35e2cb 100644
--- a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java
+++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java
@@ -1975,6 +1975,50 @@ public class TradeLogServiceImpl implements TradeLogService {
}
}
+ @Override
+ public byte[] exportPDFSettlement(TradeLogQuery query, JSONObject client) {
+ String begin = query.getDatefrom() == null ? "" : query.getDatefrom();
+ String end = query.getDateto() == null ? "" : query.getDateto();
+ String timezone = client.getString("timezone");
+ JSONObject params = query.toParams(timezone);
+ if (params.get("client_ids") == null) {
+ params.put("client_id", client.getString("client_id"));
+ }
+ clientManager.queryModifyClientIds(client.getIntValue("client_id"), params);
+ List clientOrderList = transactionMapper.getClientOrderByTransactionTime(params);
+ JSONObject parmerters = new JSONObject();
+ parmerters.put("dateRange", "(Statement Period " + begin + "~"
+ + end + ")");
+ parmerters.put("clientName", client.getString("company_name"));
+ parmerters.put("clientAddress", client.getString("address"));
+ parmerters.put("clientLocation", client.getString("suburb") + "," + client.getString("state") + "," + client.getString("postcode"));
+ List settlementLogDetailList = new ArrayList<>();
+ try {
+ parmerters.put("logo", logo.getInputStream());
+ if (clientOrderList.size() > 0) {
+ List clientOrders = new ArrayList<>(clientOrderList.size());
+ clientOrderList.parallelStream().forEach(p -> clientOrders.add(p.getInteger("clearing_order")));
+ settlementLogDetailList = transactionMapper.getSettlementLogDetailList(clientOrders);
+ TimeZoneUtils.switchTimeZoneToString(settlementLogDetailList, timezone, "yyyy-MM-dd HH:mm:ss", Collections.singletonList("transaction_time"));
+ settlementLogDetailList.parallelStream().forEach(item -> {
+ scaleDecimalVal(item, "display_amount", item.getString("transaction_currency"));
+ String platformCurrency = PlatformEnvironment.getEnv().getForeignCurrency();
+ scaleDecimalVal(item, "clearing_amount", platformCurrency);
+ scaleDecimalVal(item, "settle_amount", platformCurrency);
+ scaleDecimalVal(item, "total_surcharge", platformCurrency);
+ scaleDecimalVal(item, "transaction_amount", platformCurrency);
+ item.put("exchange_rate", item.getBigDecimal("exchange_rate").setScale(5, RoundingMode.DOWN));
+ item.put("gateway", item.getInteger("gateway") == null ? "-" : TradeType.fromGatewayNumber(item.getIntValue("gateway")).getTradeType());
+ item.put("rate", item.getBigDecimal("rate") == null ? "-" : item.getBigDecimal("rate").toPlainString() + "%");
+ });
+ }
+ JRDataSource jrDataSource = new JRBeanCollectionDataSource(settlementLogDetailList);
+ return JasperRunManager.runReportToPdf(partner_settlement_flow.getInputStream(), parmerters, jrDataSource);
+ } catch (Exception e) {
+ throw new ServerErrorException(e);
+ }
+ }
+
@Override
public void exportExcelAllPartner(TradeLogQuery query, JSONObject partner, HttpServletResponse resp) throws
Exception {
diff --git a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.xml
index a04331f11..74eed6179 100644
--- a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.xml
+++ b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.xml
@@ -10,7 +10,8 @@
]]>
and org_id=#{org_id}
and org_id in
- #{org_id}
+ #{org_id}
+
@@ -77,7 +80,8 @@
]]>
and org_id=#{org_id}
and org_id in
- #{org_id}
+ #{org_id}
+
GROUP BY YEAR(create_time),MONTH(create_time),DAY(create_time) ORDER BY create_time desc
@@ -90,7 +94,8 @@
]]>
and org_id=#{org_id}
and org_id in
- #{org_id}
+ #{org_id}
+
+
+ SELECT COUNT(DISTINCT c.client_id) client_count,
+ c.sub_merchant_id,
+ c.merchant_id
+ FROM sys_clients c
+ WHERE c.sub_merchant_id not in
+ (SELECT p.sub_merchant_id FROM sys_clients p INNER JOIN pmt_orders o ON o.client_id = p.client_id AND o.status >4 AND o.confirm_time IS NOT NULL
+ WHERE datediff(now(), o.create_time) <= 25 AND p.sub_merchant_id is not null GROUP BY p.sub_merchant_id) AND c.sub_merchant_id IS not null AND c.merchant_id IS NOT NULL
+ AND (c.approve_result = 1 OR c.approve_result= 2) AND c.is_valid = 1
+ AND c.enable_wechat = 1
+ ]]>
+ GROUP by c.sub_merchant_id
+
+
+ SELECT COUNT(DISTINCT c.client_id) client_count,
+ c.sub_merchant_id,
+ c.merchant_id,
+ tmp.create_time last_trade_time,
+ datediff(now(), tmp.create_time) diff_days
+ FROM sys_clients c INNER JOIN (SELECT sub_merchant_id, max(create_time) create_time
+ FROM pmt_orders where status>=5 and create_time>=#{begin} and create_time<=now()
+ and channel='Wechat'
+ GROUP BY sub_merchant_id
+ ) tmp on c.sub_merchant_id = tmp.sub_merchant_id
+ WHERE
+ c.sub_merchant_id IS not null AND c.merchant_id IS NOT NULL
+ AND (c.approve_result = 1 OR c.approve_result= 2) AND c.is_valid = 1
+ AND c.enable_wechat = 1
+ ]]>
+ GROUP BY c.sub_merchant_id ORDER BY diff_days desc
+
+