clean detail view

master
yixian 5 years ago
parent 4eb160239d
commit 0ebc79f80b

@ -107,4 +107,6 @@ public interface CleanService {
ByteArrayResource downloadBatchSettleReportXlsx(int batchId); ByteArrayResource downloadBatchSettleReportXlsx(int batchId);
JSONObject findSettleLog(int clearingId); JSONObject findSettleLog(int clearingId);
JSONObject findClearingDetail(int clearingId, String clientMoniker);
} }

@ -84,6 +84,7 @@ import java.text.NumberFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@ -236,7 +237,6 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
total.put("tax_amount", 0); total.put("tax_amount", 0);
total.put("charge_cashback", 0); total.put("charge_cashback", 0);
List<JSONObject> details = new ArrayList<>();
for (JSONObject log : logs) { for (JSONObject log : logs) {
addBigDecimal(total, log, "total_credit"); addBigDecimal(total, log, "total_credit");
addBigDecimal(total, log, "total_debit"); addBigDecimal(total, log, "total_debit");
@ -249,22 +249,38 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
addBigDecimal(total, log, "tax_amount"); addBigDecimal(total, log, "tax_amount");
int clearingId = log.getIntValue("clearing_id"); int clearingId = log.getIntValue("clearing_id");
List<JSONObject> logDetails = clearingDetailMapper.listReportsOfSettlement(clearingId); List<JSONObject> logDetails = clearingDetailMapper.listReportsOfSettlement(clearingId);
details.addAll(logDetails);
List<String> banks = logDetails.stream().map(detail -> detail.getString("settle_bank")).distinct().collect(Collectors.toList()); List<String> banks = logDetails.stream().map(detail -> detail.getString("settle_bank")).distinct().collect(Collectors.toList());
List<JSONObject> bankStatistics = banks.stream().map(bank -> { List<JSONObject> bankStatistics = banks.stream().map(bank -> {
JSONObject data = new JSONObject(); JSONObject data = new JSONObject();
data.put("bank", bank); data.put("bank", bank);
data.put("total_settle", logDetails.stream() List<JSONObject> bankCleanLogs = logDetails.stream()
.filter(detail -> bank.equals(detail.getString("settle_bank"))) .filter(detail -> bank.equals(detail.getString("settle_bank")))
.collect(Collectors.toList());
data.put("total_settle", bankCleanLogs.stream()
.map(detail -> detail.getBigDecimal("clearing_amount")) .map(detail -> detail.getBigDecimal("clearing_amount"))
.reduce(BigDecimal::add) .reduce(BigDecimal::add)
.orElse(BigDecimal.ZERO)
); );
data.put("clients", logDetails.stream() data.put("clients", bankCleanLogs.size());
.filter(detail -> bank.equals(detail.getString("settle_bank")))
.count());
return data; return data;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
log.put("bank_statistics", bankStatistics); log.put("bank_statistics", bankStatistics);
Map<String, JSONObject> cleanDaysStatistics = Stream.of(1, 2, 3).map(cleanDays -> {
JSONObject data = new JSONObject();
List<JSONObject> cleanDaysDetails = logDetails.stream()
.filter(detail -> detail.getIntValue("clear_days") == cleanDays)
.collect(Collectors.toList());
data.put("clean_days", cleanDays);
data.put("total_settle", cleanDaysDetails.stream()
.map(detail -> detail.getBigDecimal("clearing_amount"))
.reduce(BigDecimal::add)
.orElse(BigDecimal.ZERO));
data.put("clients", cleanDaysDetails.size());
data.put("reports", cleanDaysDetails.size() < 20 ? cleanDaysDetails : cleanDaysDetails.subList(0, 20));
return data;
}).collect(HashMap::new, (map, data) -> map.put("T+" + data.getIntValue("clean_days"), data), Map::putAll);
log.put("clean_days", cleanDaysStatistics);
if (StringUtils.isNotEmpty(log.getString("plan_detail"))) { if (StringUtils.isNotEmpty(log.getString("plan_detail"))) {
try { try {
log.put("plan_detail", JSON.parseObject(log.getString("plan_detail"))); log.put("plan_detail", JSON.parseObject(log.getString("plan_detail")));
@ -274,8 +290,15 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
log.put("editable", DateUtils.isSameDay(log.getDate("settle_date"), new Date()) && log.getBooleanValue("editable")); log.put("editable", DateUtils.isSameDay(log.getDate("settle_date"), new Date()) && log.getBooleanValue("editable"));
log.put("channel_analysis", clearingDetailAnalysisMapper.analysisChannelReport(clearingId)); log.put("channel_analysis", clearingDetailAnalysisMapper.analysisChannelReport(clearingId));
} }
Map<String, JSONObject> totalCleanDaysSatistics = Stream.of(1, 2, 3).map(cleanDays -> {
JSONObject cleanDaysReport = new JSONObject();
cleanDaysReport.put("clean_days", "T+" + cleanDays);
cleanDaysReport.put("clients", logs.stream().mapToInt(log -> log.getJSONObject("clean_days").getJSONObject("T+" + cleanDays).getIntValue("clients")).sum());
cleanDaysReport.put("amount", logs.stream().map(log -> log.getJSONObject("clean_days").getJSONObject("T+" + cleanDays).getBigDecimal("total_settle")).reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
return cleanDaysReport;
}).collect(HashMap::new, (map, report) -> map.put(report.getString("clean_days"), report), Map::putAll);
total.put("logs", logs); total.put("logs", logs);
total.put("details", details); total.put("clean_days", totalCleanDaysSatistics);
List<JSONObject> channels = clearingDetailAnalysisMapper.analysisChannelReportDaily(settleDate); List<JSONObject> channels = clearingDetailAnalysisMapper.analysisChannelReportDaily(settleDate);
total.put("channel_analysis", channels); total.put("channel_analysis", channels);
return total; return total;
@ -1048,7 +1071,7 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
Sheet sheet = wb.createSheet("Merchant_Settlement_Info_" + DateFormatUtils.format(reportDate, "yyyyMMdd")); Sheet sheet = wb.createSheet("Merchant_Settlement_Info_" + DateFormatUtils.format(reportDate, "yyyyMMdd"));
int rowNum = 0; int rowNum = 0;
Row row = sheet.createRow(rowNum); Row row = sheet.createRow(rowNum);
String[] title = {"process date","description","order Id", "Client Order Id", "Transaction Time", "Channel", "Gateway", "Exchange Rate", "Transaction Type", "Currency", String[] title = {"process date", "description", "order Id", "Client Order Id", "Transaction Time", "Channel", "Gateway", "Exchange Rate", "Transaction Type", "Currency",
"Input Amount", "Total Amount", "Clearing Amount(AUD)", "Sruchange Rate", "Surcharge(AUD)", "GST(AUD)", "Settle Amount(AUD)", "Remark", "Dev No", "Dev Remark"}; "Input Amount", "Total Amount", "Clearing Amount(AUD)", "Sruchange Rate", "Surcharge(AUD)", "GST(AUD)", "Settle Amount(AUD)", "Remark", "Dev No", "Dev Remark"};
String[] analysis = {"Total Credit(AUD)", "Total Debit(AUD)", "Gross Amount(AUD)", "Total GST(AUD)", "Total Charge(AUD)", "Net Amount(AUD)"}; String[] analysis = {"Total Credit(AUD)", "Total Debit(AUD)", "Gross Amount(AUD)", "Total GST(AUD)", "Total Charge(AUD)", "Net Amount(AUD)"};
for (int i = 0; i < title.length; i++) { for (int i = 0; i < title.length; i++) {
@ -1656,6 +1679,13 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider
return clearing; return clearing;
} }
@Override
public JSONObject findClearingDetail(int clearingId, String clientMoniker) {
List<JSONObject> reports = clearingDetailMapper.listReportsOfSettlement(clearingId);
return reports.stream().filter(report -> report.getString("client_moniker").equals(clientMoniker)).findFirst()
.orElseThrow(() -> new NotFoundException("No clearing log found for " + clientMoniker));
}
private void releaseDistributedSurcharge(JSONObject clearingDetail) { private void releaseDistributedSurcharge(JSONObject clearingDetail) {
int clientId = clearingDetail.getIntValue("client_id"); int clientId = clearingDetail.getIntValue("client_id");
BigDecimal distributedSurcharge = clearingDetail.getBigDecimal("distributed_surcharge"); BigDecimal distributedSurcharge = clearingDetail.getBigDecimal("distributed_surcharge");

@ -10,7 +10,6 @@ import au.com.royalpay.payment.tools.merchants.beans.BalanceGroup;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole; import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@ -68,6 +67,11 @@ public class SettlementDevController {
return res; return res;
} }
@GetMapping("/clearing/{clearingId}/client_detail/{clientMoniker}")
public JSONObject getClientSettleDetail(@PathVariable int clearingId, @PathVariable String clientMoniker) {
return cleanService.findClearingDetail(clearingId, clientMoniker);
}
@PutMapping("/reports/{date}/clearings/{clearingId}/bank_distribution") @PutMapping("/reports/{date}/clearings/{clearingId}/bank_distribution")
public void modifyClearingBank(@PathVariable String date, @PathVariable int clearingId, @RequestBody JSONObject bankDistribution) { public void modifyClearingBank(@PathVariable String date, @PathVariable int clearingId, @RequestBody JSONObject bankDistribution) {
try { try {

@ -1,7 +1,7 @@
define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], function (angular, Decimal) { define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], function (angular, Decimal) {
'use strict'; 'use strict';
var colors = ['#00c0ef', '#00a65a', '#ff851b', '#f39c12', '#d81b60', '#605ca8', '#dd4b39', '#008080', '#8B008B', '#D2691E', '#708090']; let colors = ['#00c0ef', '#00a65a', '#ff851b', '#f39c12', '#d81b60', '#605ca8', '#dd4b39', '#008080', '#8B008B', '#D2691E', '#708090'];
var app = angular.module('clearingLogs', ['ui.bootstrap', 'ui.router', 'ngEcharts']); let app = angular.module('clearingLogs', ['ui.bootstrap', 'ui.router', 'ngEcharts']);
app.config(['$stateProvider', function ($stateProvider) { app.config(['$stateProvider', function ($stateProvider) {
$stateProvider.state('clearingLogs', { $stateProvider.state('clearingLogs', {
url: '/analysis/clearing_logs', url: '/analysis/clearing_logs',
@ -54,7 +54,7 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
app.controller('clearingLogsCtrl', ['$scope', '$http', '$filter', '$timeout', '$uibModal', 'commonDialog', 'chartParser', app.controller('clearingLogsCtrl', ['$scope', '$http', '$filter', '$timeout', '$uibModal', 'commonDialog', 'chartParser',
function ($scope, $http, $filter, $timeout, $uibModal, commonDialog, chartParser) { function ($scope, $http, $filter, $timeout, $uibModal, commonDialog, chartParser) {
$scope.loadMonthLog = function (month) { $scope.loadMonthLog = function (month) {
var monthStr = $filter('date')(month, 'yyyyMM'); let monthStr = $filter('date')(month, 'yyyyMM');
$http.get('/sys/settlement/month/' + monthStr + '/settled_dates').then(function (resp) { $http.get('/sys/settlement/month/' + monthStr + '/settled_dates').then(function (resp) {
$scope.settledDates = resp.data; $scope.settledDates = resp.data;
}); });
@ -68,39 +68,39 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
$scope.loadClearingLogs(1); $scope.loadClearingLogs(1);
}; };
$scope.chooseYesterday = function () { $scope.chooseYesterday = function () {
var yesterday = new Date(); let yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1); yesterday.setDate(yesterday.getDate() - 1);
$scope.params.begin = $scope.params.end = yesterday; $scope.params.begin = $scope.params.end = yesterday;
$scope.loadClearingLogs(1); $scope.loadClearingLogs(1);
}; };
$scope.chooseLast7Days = function () { $scope.chooseLast7Days = function () {
$scope.params.end = new Date(); $scope.params.end = new Date();
var day = new Date(); let day = new Date();
day.setDate(day.getDate() - 7); day.setDate(day.getDate() - 7);
$scope.params.begin = day; $scope.params.begin = day;
$scope.loadClearingLogs(1); $scope.loadClearingLogs(1);
}; };
$scope.thisMonth = function () { $scope.thisMonth = function () {
$scope.params.end = new Date(); $scope.params.end = new Date();
var monthBegin = new Date(); let monthBegin = new Date();
monthBegin.setDate(1); monthBegin.setDate(1);
$scope.params.begin = monthBegin; $scope.params.begin = monthBegin;
$scope.loadClearingLogs(1); $scope.loadClearingLogs(1);
}; };
$scope.lastMonth = function () { $scope.lastMonth = function () {
var monthFinish = new Date(); let monthFinish = new Date();
monthFinish.setDate(0); monthFinish.setDate(0);
$scope.params.end = monthFinish; $scope.params.end = monthFinish;
var monthBegin = new Date(); let monthBegin = new Date();
monthBegin.setDate(0); monthBegin.setDate(0);
monthBegin.setDate(1); monthBegin.setDate(1);
$scope.params.begin = monthBegin; $scope.params.begin = monthBegin;
$scope.loadClearingLogs(1); $scope.loadClearingLogs(1);
}; };
$scope.thisYear = function () { $scope.thisYear = function () {
var yearFinish = new Date(); let yearFinish = new Date();
$scope.params.end = yearFinish; $scope.params.end = yearFinish;
var currentYearFirstDate = new Date(new Date().getFullYear(), 0, 1); let currentYearFirstDate = new Date(new Date().getFullYear(), 0, 1);
$scope.params.begin = currentYearFirstDate; $scope.params.begin = currentYearFirstDate;
$scope.loadClearingLogs(1); $scope.loadClearingLogs(1);
}; };
@ -124,7 +124,7 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
}; };
$scope.loadClearingLogs = function (page) { $scope.loadClearingLogs = function (page) {
var params = angular.copy($scope.params); let params = angular.copy($scope.params);
params.page = page || $scope.pagination.page || 1; params.page = page || $scope.pagination.page || 1;
if (params.begin) { if (params.begin) {
params.begin = $filter('date')(params.begin, 'yyyyMMdd'); params.begin = $filter('date')(params.begin, 'yyyyMMdd');
@ -140,15 +140,15 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
}); });
analysisLog(params); analysisLog(params);
}; };
var analysisLog = function (params) { let analysisLog = function (params) {
$http.get('/sys/clean_logs/analysis', {params: params}).then(function (resp) { $http.get('/sys/clean_logs/analysis', {params: params}).then(function (resp) {
$scope.analysis = resp.data; $scope.analysis = resp.data;
}) })
}; };
$scope.loadClearingLogsHistory = function (days) { $scope.loadClearingLogsHistory = function (days) {
var endDate = new Date(); let endDate = new Date();
var startDate = new Date(); let startDate = new Date();
startDate.setDate(startDate.getDate() - days); startDate.setDate(startDate.getDate() - days);
$http.get('/sys/clean_logs/logs', { $http.get('/sys/clean_logs/logs', {
params: { params: {
@ -160,7 +160,7 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
}) })
}; };
$scope.loadClearingLogsHistory(7); $scope.loadClearingLogsHistory(7);
var clearingHistoryConfig = { let clearingHistoryConfig = {
chart: { chart: {
tooltip: { tooltip: {
trigger: 'axis', trigger: 'axis',
@ -224,7 +224,7 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
$scope.generateRate = function (client) { $scope.generateRate = function (client) {
commonDialog.confirm({title: 'Confirm Required', content: '根据上季度总交易额自动计算下周期费率,确定执行?'}).then(function () { commonDialog.confirm({title: 'Confirm Required', content: '根据上季度总交易额自动计算下周期费率,确定执行?'}).then(function () {
$http.put('/manage/clearing/clients/' + client.client_moniker + '/auto_rate').then(function (resp) { $http.put('/manage/clearing/clients/' + client.client_moniker + '/auto_rate').then(function (resp) {
var content = 'New Rate value=' + resp.data.rate_value + '; expiry_time=' + $filter('date')(resp.data.expiry_time, 'dd/MMM/yyyy'); let content = 'New Rate value=' + resp.data.rate_value + '; expiry_time=' + $filter('date')(resp.data.expiry_time, 'dd/MMM/yyyy');
commonDialog.alert({ commonDialog.alert({
type: 'success', type: 'success',
title: 'New Rate Generated', title: 'New Rate Generated',
@ -248,77 +248,28 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
$scope.analysisFilter = {}; $scope.analysisFilter = {};
$scope.currentAnalysis = $scope.detail; $scope.currentAnalysis = $scope.detail;
$scope.pageCtrl = {visible: {}}; $scope.pageCtrl = {visible: {}};
$scope.searchingClient = null;
function getAnalysisTemplate() { $scope.search = {client_moniker: null};
return [
{settleDays: 1, clients: 0, settleAmount: 0, settles: []},
{settleDays: 2, clients: 0, settleAmount: 0, settles: []},
{settleDays: 3, clients: 0, settleAmount: 0, settles: []}
];
}
$scope.reloadPage = function () {
$state.reload();
};
$scope.settleAnalysis = getAnalysisTemplate();
$scope.batchAnalysis = {
'All': $scope.settleAnalysis
};
angular.forEach($scope.detail.logs, function (batch) {
$scope.batchAnalysis[batch.clearing_id + ''] = getAnalysisTemplate();
});
$scope.endIndexMap = {};
$scope.initEndIndex = 20;
$scope.more = function (key) { $scope.searchClient = function () {
if (!$scope.search.client_moniker) {
var endIndex = $scope.endIndexMap[key] + $scope.initEndIndex; $scope.searchingClient = null;
$scope.endIndexMap[key] = endIndex; }
if (endIndex > $scope.clientsMap[key].clients) { if ($scope.currentAnalysis.clearing_id) {
$scope.endIndexMap[key] = $scope.clientsMap[key].clients; $http.get('/sys/settlement/clearing/' + $scope.currentAnalysis.clearing_id + '/client_detail/' + $scope.search.client_moniker).then(function (resp) {
$scope.searchingClient = resp.data;
}, function (resp) {
commonDialog.alert({type: 'error', title: 'Error', content: resp.data.message});
})
} }
};
$scope.packup = function (key) {
$scope.endIndexMap[key] = $scope.initEndIndex;
var length = $scope.clientsMap[key].clients;
if (length <= $scope.initEndIndex)
$scope.endIndexMap[key] = length;
}; };
$scope.displayAll = function (key) { $scope.reloadPage = function () {
var length = $scope.clientsMap[key].clients; $state.reload();
$scope.endIndexMap[key] = length;
}; };
let nowStr = $filter('date')(new Date(), "yyyy-MM-dd");
angular.forEach($scope.detail.details, function (settleItem) {
var settleDays = settleItem.clear_days;
attachAnalysis($scope.settleAnalysis[Math.min(settleDays - 1, 2)]);
attachAnalysis($scope.batchAnalysis[settleItem.clearing_id + ''][Math.min(settleDays - 1, 2)]);
function attachAnalysis(analysisItem) {
analysisItem.settles.push(settleItem);
analysisItem.clients++;
analysisItem.settleAmount = Decimal.add(analysisItem.settleAmount, settleItem.clearing_amount).toFixed(2, Decimal.ROUND_FLOOR);
}
});
$scope.clientsMap = $scope.settleAnalysis;
for (var key in $scope.clientsMap) {
$scope.endIndexMap[key] = $scope.initEndIndex;
var length = $scope.clientsMap[key].clients;
if (length <= $scope.initEndIndex)
$scope.endIndexMap[key] = length;
}
var nowStr = $filter('date')(new Date(), "yyyy-MM-dd");
$scope.datePattern = $stateParams.date; $scope.datePattern = $stateParams.date;
if ($scope.datePattern == nowStr) { if ($scope.datePattern == nowStr) {
$scope.sendNotice = true; $scope.sendNotice = true;
@ -336,6 +287,8 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
}; };
$scope.switchSettleBatch = function (batch) { $scope.switchSettleBatch = function (batch) {
$scope.search.client_moniker = null;
$scope.searchingClient = null;
if (batch == null) { if (batch == null) {
$scope.currentAnalysis = $scope.detail; $scope.currentAnalysis = $scope.detail;
$scope.analysisFilter.clearing_id = null; $scope.analysisFilter.clearing_id = null;
@ -408,10 +361,11 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
}; };
$scope.rollbackSettlement = function () { $scope.rollbackSettlement = function () {
var log = $scope.getCurrentLog(); let log = $scope.getCurrentLog();
commonDialog.confirm({ commonDialog.dangerConfirm({
title: '确认操作', title: '确认操作',
content: '回滚当前清算id=' + log.clearing_id + ',确认?' operation: '回滚当前清算id=' + log.clearing_id + ',确认?',
content: 'Undo Settlement'
}).then(function () { }).then(function () {
$http.delete('/sys/settlement/reports/' + $stateParams.date + '/clearings/' + log.clearing_id).then(function () { $http.delete('/sys/settlement/reports/' + $stateParams.date + '/clearings/' + log.clearing_id).then(function () {
$state.reload(); $state.reload();
@ -436,7 +390,7 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
} }
}); });
$scope.remainingAmount = function () { $scope.remainingAmount = function () {
var total = clearingBatch.net_amount; let total = clearingBatch.net_amount;
angular.forEach($scope.bankData, function (config) { angular.forEach($scope.bankData, function (config) {
total = Decimal.sub(total, config.amount); total = Decimal.sub(total, config.amount);
}); });
@ -444,7 +398,7 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func
}; };
$scope.submitDistribution = function () { $scope.submitDistribution = function () {
$scope.errmsg = null; $scope.errmsg = null;
var data = {}; let data = {};
angular.forEach($scope.bankData, function (config) { angular.forEach($scope.bankData, function (config) {
data[config.bank] = config.amount; data[config.bank] = config.amount;
}); });

@ -81,13 +81,13 @@
</div> </div>
</div> </div>
</div> </div>
<div class="row" ng-if="analysisFilter.clearing_id!=null"> <div class="row" ng-if="currentAnalysis.clearing_id!=null">
<div class="col-xs-12"> <div class="col-xs-12">
<ul class="list-group"> <ul class="list-group">
<li class="list-group-item"> <li class="list-group-item">
<span class="list-group-item-heading">Bank Statistics</span> <span class="list-group-item-heading">Bank Statistics</span>
</li> </li>
<li class="list-group-item" ng-repeat="bank in getCurrentLog().bank_statistics"> <li class="list-group-item" ng-repeat="bank in currentAnalysis.bank_statistics">
<div class="row"> <div class="row">
<span class="col-xs-1 text-bold" ng-bind="bank.bank"></span> <span class="col-xs-1 text-bold" ng-bind="bank.bank"></span>
<span class="col-xs-11"> <span class="col-xs-11">
@ -181,15 +181,73 @@
</div> </div>
</div> </div>
<div class="box box-success settle-result-box" ng-if="currentAnalysis.clean_days">
<div class="box-header">
<div class="form-inline">
<div class="input-group">
<input class="form-control" ng-model="search.client_moniker">
<div class="input-group-addon">
<button class="input-group-btn" type="button" ng-click="searchClient()"><i
class="fa fa-search"></i></button>
</div>
</div>
</div>
</div>
<div class="box-body table-responsive" ng-if="searchingClient">
<table class="table table-bordered table-striped table-hover settle-result-table">
<thead>
<tr>
<th>Client Moniker</th>
<th>Transaction Date</th>
<th>Gross Amount</th>
<th>Rate</th>
<th>Total Charge</th>
<th>Net Amount</th>
<th>Tax Amount</th>
<th>Settle Days</th>
<th>Transactions</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<img ng-src="/static/images/bank/{{searchingClient.settle_bank|uppercase}}.png"
class="bank-logo" title="{{searchingClient.settle_bank}}">
<span ng-bind="searchingClient.client_moniker"></span>
</td>
<td>
{{searchingClient.settle_date_from|limitTo:10}}
~
{{searchingClient.settle_date_to|limitTo:10}}
</td>
<td ng-bind="searchingClient.gross_amount|currency:''"></td>
<td ng-bind="searchingClient.rate"></td>
<td ng-bind="searchingClient.total_charge|currency:''"></td>
<td ng-bind="searchingClient.clearing_amount|currency:''"></td>
<td ng-bind="searchingClient.tax_amount"></td>
<td ng-bind="'T+'+searchingClient.clear_days"></td>
<td>
<a ui-sref=".transactions({detailId:searchingClient.clear_detail_id})"
title="View Transactions">
<i class="fa fa-eye"></i>
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="box box-success settle-result-box" <div class="box box-success settle-result-box"
ng-repeat=" (key, group) in batchAnalysis[analysisFilter.clearing_id==null?'All':analysisFilter.clearing_id+'']"> ng-repeat=" (key, group) in currentAnalysis.clean_days">
<div class="box-header" ng-click="pageCtrl.visible[group.settleDays]=!pageCtrl.visible[group.settleDays]"> <div class="box-header" ng-click="pageCtrl.visible[group.clean_days]=!pageCtrl.visible[group.clean_days]">
T+{{group.settleDays}}: Clients:{{group.clients}} {{group.clean_days}}: Clients:{{group.clients}}
Amount:{{group.settleAmount|currency:''}} Amount:{{group.total_settle|currency:''}}
<span class="pull-right" ng-if="pageCtrl.visible[group.settleDays]">Click to show</span> <span class="pull-right" ng-if="pageCtrl.visible[group.clean_days]">Click to show</span>
<span class="pull-right" ng-if="!pageCtrl.visible[group.settleDays]">Click to hide</span> <span class="pull-right" ng-if="!pageCtrl.visible[group.clean_days]">Click to hide</span>
</div> </div>
<div class="box-body table-responsive" ng-hide="pageCtrl.visible[group.settleDays]"> <div class="box-body table-responsive" ng-if="currentAnalysis.clearing_id"
ng-hide="pageCtrl.visible[group.clean_days]">
<table class="table table-bordered table-striped table-hover settle-result-table"> <table class="table table-bordered table-striped table-hover settle-result-table">
<thead> <thead>
<tr> <tr>
@ -205,9 +263,10 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr ng-repeat="settleItem in group.settles.slice(0, endIndexMap[key])"> <tr ng-repeat="settleItem in group.reports">
<td> <td>
<img ng-src="/static/images/bank/{{settleItem.settle_bank|uppercase}}.png" class="bank-logo" title="{{settleItem.settle_bank}}"> <img ng-src="/static/images/bank/{{settleItem.settle_bank|uppercase}}.png" class="bank-logo"
title="{{settleItem.settle_bank}}">
<span ng-bind="settleItem.client_moniker"></span> <span ng-bind="settleItem.client_moniker"></span>
</td> </td>
<td> <td>
@ -229,23 +288,6 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
<a ng-if="group.clients > initEndIndex" class="list-group-item col-sm-12 col-xs-12 text-center" style="width: 49.5%;border: 0;" >
<span style="cursor: pointer;" class="small-box-footer cursor" ng-click="more(key)" ng-if="endIndexMap[key]< group.clients">
更多 <i class="fa fa-arrow-circle-down"></i>
</span>
</a>
<a ng-if="endIndexMap[key]< group.clients" class="list-group-item col-sm-12 col-xs-12 text-center" style="width: 1%;color: #ddd;border: 0;font-size: 30px;padding: 0">|</a>
<a class="list-group-item col-sm-12 col-xs-12 text-center" style="width: 49.5%;border: 0;">
<span style="cursor: pointer;" class="small-box-footer cursor" ng-click="displayAll(key)" ng-if="endIndexMap[key]< group.clients">
全部 <i class="fa fa-arrow-circle-down"></i>
</span>
<span style="cursor: pointer;" class="small-box-footer cursor pull-right"
ng-click="packup(key)"
ng-if="endIndexMap[key] > initEndIndex">
收起 <i class="fa fa-arrow-circle-up"></i>
</span>
</a>
</div> </div>
</div> </div>
</section> </section>

@ -4,7 +4,7 @@
*/ */
define(['../app', 'angular'], function (app, angular) { define(['../app', 'angular'], function (app, angular) {
'use strict'; 'use strict';
var defaultCfg = { let defaultCfg = {
size: null, size: null,
backdrop: true, backdrop: true,
type: 'default' type: 'default'
@ -12,8 +12,8 @@ define(['../app', 'angular'], function (app, angular) {
app.factory('commonDialog', ['$q', '$uibModal', function ($q, $uibModal) { app.factory('commonDialog', ['$q', '$uibModal', function ($q, $uibModal) {
return { return {
alert: function (cfg) { alert: function (cfg) {
var choises = [{label: 'OK', className: 'btn-default', key: '1'}]; let choises = [{label: 'OK', className: 'btn-default', key: '1'}];
var config = { let config = {
title: cfg.title, title: cfg.title,
content: cfg.content, content: cfg.content,
contentHtml: cfg.contentHtml, contentHtml: cfg.contentHtml,
@ -22,7 +22,7 @@ define(['../app', 'angular'], function (app, angular) {
choises: choises, choises: choises,
type: cfg.type type: cfg.type
}; };
var defer = $q.defer(); let defer = $q.defer();
showModalDialog(config).then(function () { showModalDialog(config).then(function () {
defer.resolve(); defer.resolve();
}, function () { }, function () {
@ -31,18 +31,18 @@ define(['../app', 'angular'], function (app, angular) {
return defer.promise; return defer.promise;
}, },
confirm: function (cfg) { confirm: function (cfg) {
var choises = [{label: 'OK', className: 'btn-success', key: '1'}, let choises = [{label: 'OK', className: 'btn-success', key: '1'},
{label: 'Cancel', className: 'btn-danger', key: '2', dismiss: true}]; {label: 'Cancel', className: 'btn-danger', key: '2', dismiss: true}];
var config = { let config = {
title: cfg.title, title: cfg.title,
content: cfg.content, content: cfg.content,
contentHtml: cfg.contentHtml, contentHtml: cfg.contentHtml,
json:cfg.json, json: cfg.json,
backdrop: cfg.backdrop, backdrop: cfg.backdrop,
size: cfg.size, size: cfg.size,
choises: cfg.choises || choises choises: cfg.choises || choises
}; };
var deferred = $q.defer(); let deferred = $q.defer();
showModalDialog(config).then(function (choice) { showModalDialog(config).then(function (choice) {
if (choice.dismiss) { if (choice.dismiss) {
deferred.reject(); deferred.reject();
@ -54,6 +54,29 @@ define(['../app', 'angular'], function (app, angular) {
}); });
return deferred.promise; return deferred.promise;
}, },
dangerConfirm: function (cfg) {
return $uibModal.open({
backdrop: 'static', keyboard: false,
templateUrl: '/static/commons/templates/danger_confirm.html',
size: cfg.size || 'sm',
resolve: {
cfg: function () {
return cfg;
}
},
controller: ['$scope', 'cfg', function ($scope, cfg) {
$scope.title = cfg.title || 'Confirm Operation';
$scope.operation = cfg.operation;
$scope.content = cfg.content || 'Confirm Operation';
$scope.data = {};
$scope.submit = function () {
if ($scope.content === $scope.data.text) {
$scope.$close();
}
};
}]
}).result;
},
inputNum: function (cfg) { inputNum: function (cfg) {
return $uibModal.open({ return $uibModal.open({
templateUrl: '/static/commons/templates/num_input.html', templateUrl: '/static/commons/templates/num_input.html',
@ -109,12 +132,12 @@ define(['../app', 'angular'], function (app, angular) {
} }
}]); }]);
app.controller('commonModalCtrl', ['$scope', '$timeout', 'cfg', function ($scope, $timeout, cfg) { app.controller('commonModalCtrl', ['$scope', '$timeout', 'cfg', function ($scope, $timeout, cfg) {
var bgClasses = { let bgClasses = {
success: 'bg-success', success: 'bg-success',
error: 'bg-warning', error: 'bg-warning',
info: 'bg-info' info: 'bg-info'
}; };
var glyIcons = { let glyIcons = {
success: 'glyphicon-ok-circle', success: 'glyphicon-ok-circle',
error: 'glyphicon-remove-circle', error: 'glyphicon-remove-circle',
info: 'glyphicon-info-sign' info: 'glyphicon-info-sign'

@ -0,0 +1,25 @@
<div class="modal-header">
<h4 ng-bind="title"></h4>
</div>
<div class="modal-body">
<p ng-bind="operation" ng-if="operation"></p>
<p class="text-danger">
Dangerous operation! Please type in <span class="text-bold" ng-bind="content"></span> to confirm
</p>
<div class="form-group">
<input type="text" class="form-control" ng-model="data.text" placeholder="Confirm">
</div>
</div>
<div class="modal-footer">
<div class="pull-right">
<div class="btn-group">
<button class="btn btn-danger" ng-disabled="data.text===content" ng-click="submit()"><i
class="glyphicon glyphicon-ok"></i> OK
</button>
</div>
<div class="btn-group">
<button class="btn btn-default" ng-click="$dismiss()"><i class="glyphicon glyphicon-remove"></i> Cancel
</button>
</div>
</div>
</div>
Loading…
Cancel
Save