From c40e0d8bb131e60604f830815aacd355ebc18613 Mon Sep 17 00:00:00 2001 From: yangkai Date: Tue, 15 Jan 2019 14:30:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E6=88=B7=E6=B8=85=E7=AE=97=E6=96=87?= =?UTF-8?q?=E4=BB=B6pdf=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/tradelog/core/TradeLogService.java | 2 + .../core/impls/TradeLogServiceImpl.java | 54 +++++++++++++++++- .../tradelog/web/TradeFlowController.java | 6 ++ .../jasper/partner_settlement_detail.jasper | Bin 0 -> 61964 bytes .../tradelog/partner-settlement-log.js | 5 +- .../templates/partner_settlement_logs.html | 12 +++- 6 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/jasper/partner_settlement_detail.jasper 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 1fb0b3185..954cc6cc5 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 @@ -52,4 +52,6 @@ public interface TradeLogService { PageList listPreRefundClients(PreRefundQueryBean params); void exportSettlementLog(TradeLogQuery query, JSONObject partner, HttpServletResponse response); + + void exportPDFSettlement(TradeLogQuery query, JSONObject partner, HttpServletResponse response); } 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 a992efea2..3b7ca7ca5 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 @@ -156,6 +156,8 @@ public class TradeLogServiceImpl implements TradeLogService { private org.springframework.core.io.Resource trans_excel; @Value("classpath:/jasper/austrac_report.jasper") private org.springframework.core.io.Resource austrac_report; + @Value("classpath:/jasper/partner_settlement_detail.jasper") + private org.springframework.core.io.Resource partner_settlement_flow; @Override public JSONObject listPartnerTradeLogs(JSONObject manager, JSONObject account, String shortId, TradeLogQuery query, String timezone) throws Exception { @@ -1246,7 +1248,7 @@ public class TradeLogServiceImpl implements TradeLogService { row.createCell(11, Cell.CELL_TYPE_STRING).setCellValue(settle.getBigDecimal("rate") == null? "": settle.getBigDecimal("rate").toPlainString() + "%"); row.createCell(12, Cell.CELL_TYPE_STRING).setCellValue(settle.getBigDecimal("settle_amount") == null ? "" : settle.getBigDecimal("settle_amount").setScale(2, BigDecimal.ROUND_DOWN).toPlainString()); - row.createCell(13, Cell.CELL_TYPE_STRING).setCellValue(settle.getString("order_detail")); + row.createCell(13, Cell.CELL_TYPE_STRING).setCellValue(settle.getString("remark")); device = clientDeviceMapper.find(settle.getString("dev_id")); if (device != null) clientDevId = device.getString("client_dev_id"); @@ -1273,4 +1275,54 @@ public class TradeLogServiceImpl implements TradeLogService { IOUtils.closeQuietly(ous); } } + + @Override + public void exportPDFSettlement(TradeLogQuery query, JSONObject partner, HttpServletResponse response) { + int client_id = partner.getIntValue("client_id"); + String begin = query.getDatefrom() == null ?"":query.getDatefrom(); + String end = query.getDateto() == null ?"":query.getDateto(); + JSONObject client = partner.getJSONObject("client"); + String timezone = client.getString("timezone"); + JSONObject params = query.toParams(timezone); + params.put("client_id", client_id); + List clientOrderList = transactionMapper.getClientOrderByTransactionTime(params); + List clientOrders = new ArrayList<>(clientOrderList.size()); + clientOrderList.parallelStream().forEach(p->{ + clientOrders.add(p.getInteger("clearing_order")); + }); + List settlementLogDetailList = transactionMapper.getSettlementLogDetailList(clientOrders, client_id); + TimeZoneUtils.switchTimeZoneToString(settlementLogDetailList, timezone, "yyyy-MM-dd HH:mm:ss", Arrays.asList("transaction_time")); + try { + + 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")); + parmerters.put("logo", logo.getInputStream()); + 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, BigDecimal.ROUND_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); + response.setContentType("application/pdf"); + String fileName = partner.getString("client_moniker") + "_" + parmerters.getString("dateRange").replaceAll("/", ""); + response.setHeader("Content-Disposition", "attachment;fileName=" + fileName + ".pdf"); + OutputStream outs = response.getOutputStream(); + byte[] bytes = JasperRunManager.runReportToPdf(partner_settlement_flow.getInputStream(), parmerters, jrDataSource); + outs.write(bytes, 0, bytes.length); + outs.flush(); + outs.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/web/TradeFlowController.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/web/TradeFlowController.java index 27275b973..fef98d397 100644 --- a/src/main/java/au/com/royalpay/payment/manage/tradelog/web/TradeFlowController.java +++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/web/TradeFlowController.java @@ -65,4 +65,10 @@ public class TradeFlowController { tradeLogService.exportSettlementLog(query, partner, response); } + @PartnerMapping(value = "/settlement/log/pdf",method = RequestMethod.GET) + @ResponseBody + public void exportLogPDF(TradeLogQuery query, @ModelAttribute(CommonConsts.PARTNER_STATUS) JSONObject partner, HttpServletResponse response) { + tradeLogService.exportPDFSettlement(query, partner, response); + } + } diff --git a/src/main/resources/jasper/partner_settlement_detail.jasper b/src/main/resources/jasper/partner_settlement_detail.jasper new file mode 100644 index 0000000000000000000000000000000000000000..caeb59160c4a886e9844026a5e065c4268d2938b GIT binary patch literal 61964 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 CF Search - - export - +
+ + +