Merge branch 'hotfix_hfSettle'

master
kira 6 years ago
commit 37256a6f15

@ -14,4 +14,5 @@ public interface PlatformClearService {
void generateSettleLogs();
void doVerifyHFSettleLog(JSONObject param);
}

@ -8,33 +8,50 @@ import au.com.royalpay.payment.channels.wechat.runtime.beans.SettlementLog;
import au.com.royalpay.payment.manage.analysis.core.PlatformClearService;
import au.com.royalpay.payment.manage.analysis.mappers.EstimateAnalysisMapper;
import au.com.royalpay.payment.manage.mappers.log.PlatformSettlementMapper;
import au.com.royalpay.payment.tools.connections.attachment.core.AttachmentClient;
import au.com.royalpay.payment.tools.utils.PageListUtils;
import au.com.royalpay.payment.tools.utils.TimeZoneUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import cn.yixblog.platform.http.HttpRequestGenerator;
@Service
public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
private Logger logger = LoggerFactory.getLogger(getClass());
public static final SimpleDateFormat sdfClear = new SimpleDateFormat("yyyy-MM-dd");
public static final SimpleDateFormat sdfNormal = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");
public static final SimpleDateFormat sdfNormal = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Resource
private MpPaymentApi mpPaymentApi;
@ -44,10 +61,13 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
private PlatformSettlementMapper platformSettlementMapper;
@Resource
private EstimateAnalysisMapper estimateAnalysisMapper;
@Resource
private AttachmentClient attachmentClient;
@Override
public JSONObject getPlatformSettleLog(String channel, int page, int limit) {
PageList<JSONObject> list = platformSettlementMapper.findSettleLogsAllMerchant(channel, new PageBounds(page, limit, Order.formString("settle_date.desc")));
PageList<JSONObject> list = platformSettlementMapper.findSettleLogsAllMerchant(channel,
new PageBounds(page, limit, Order.formString("settle_date.desc")));
return PageListUtils.buildPageListResult(list);
}
@ -62,9 +82,10 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
sysLogs.put("surcharge", creditLogs.getBigDecimal("charge_amount").subtract(debitLogs.getBigDecimal("charge_amount")));
sysLogs.put("sys_settle_amount", sysLogs.getBigDecimal("sys_pay_fee").subtract(sysLogs.getBigDecimal("sys_refund_fee")).subtract(sysLogs.getBigDecimal("surcharge")));
sysLogs.put("start_date","2018-04-05");
sysLogs.put("end_date",sdfClear.format(new Date()));
sysLogs.put("sys_settle_amount",
sysLogs.getBigDecimal("sys_pay_fee").subtract(sysLogs.getBigDecimal("sys_refund_fee")).subtract(sysLogs.getBigDecimal("surcharge")));
sysLogs.put("start_date", "2018-04-05");
sysLogs.put("end_date", sdfClear.format(new Date()));
return sysLogs;
}
@ -86,11 +107,11 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
}
if (StringUtils.equals("Wechat", channel)) {
try {
Map<String, Date> settleDate = new HashMap<>();
settleDate.put("from",sdfClear.parse(start_date));
settleDate.put("to",sdfClear.parse(end_date));
Map<String, Date> settleDate = new HashMap<>();
settleDate.put("from", sdfClear.parse(start_date));
settleDate.put("to", sdfClear.parse(end_date));
doVerifyWechatSettleLog(settleDate);
}catch (Exception e){
} catch (Exception e) {
logger.error("PlatformClearAnalysisServiceImpl.verifySettleLogByDate ==> 校验" + end_date + "微信到账失败:", e);
}
@ -98,9 +119,9 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
}
@Override
// @Transactional
// @Transactional
public void generateSettleLogs() {
// deleteSettleLogs();
// deleteSettleLogs();
generateWechatSettleLogs();
generateAlipaySettleLogs();
generateAlipayOnlineSettleLogs();
@ -109,7 +130,7 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
@Transactional
public void generateWechatSettleLogs() {
try {
Map<String, Date> settleDate = TimeZoneUtils.getStatetimeDays();
Map<String, Date> settleDate = TimeZoneUtils.getStatetimeDays();
logger.info("开始查询" + settleDate.get("from") + "到" + settleDate.get("to") + "的微信清算记录");
doVerifyWechatSettleLog(settleDate);
} catch (ParseException e) {
@ -193,8 +214,7 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
}
}
public void doVerifyWechatSettleLog(Map<String, Date> settleDate){
public void doVerifyWechatSettleLog(Map<String, Date> settleDate) {
List<SettlementLog> tencentSettle = new ArrayList<>();
for (WeChatPayConfig.Merchant mch : WechatPayEnvironment.getEnv().getWechatMerchantConfigs()) {
try {
@ -209,15 +229,15 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
params.put("end_date", settle.getEnd());
params.put("channel", "Wechat");
params.put("last_update_date", new Date());
JSONObject sysClearData = getSystemClearingAmount(null,settle,"Wechat");
if(sysClearData!=null && sysClearData.size()>0){
params.put("sys_pay_fee",sysClearData.getBigDecimal("sys_pay_fee"));
params.put("sys_refund_fee",sysClearData.getBigDecimal("sys_refund_fee"));
params.put("sys_net_fee",sysClearData.getBigDecimal("sys_net_fee"));
params.put("sys_surcharge",sysClearData.getBigDecimal("sys_surcharge"));
params.put("sys_settlement_fee",sysClearData.getBigDecimal("sys_settle_fee"));
JSONObject sysClearData = getSystemClearingAmount(null, settle, "Wechat");
if (sysClearData != null && sysClearData.size() > 0) {
params.put("sys_pay_fee", sysClearData.getBigDecimal("sys_pay_fee"));
params.put("sys_refund_fee", sysClearData.getBigDecimal("sys_refund_fee"));
params.put("sys_net_fee", sysClearData.getBigDecimal("sys_net_fee"));
params.put("sys_surcharge", sysClearData.getBigDecimal("sys_surcharge"));
params.put("sys_settlement_fee", sysClearData.getBigDecimal("sys_settle_fee"));
}
params.put("merchants",mch.getMerchantId());
params.put("merchants", mch.getMerchantId());
params.put("pay_fee", settle.getPayFee());
params.put("refund_fee", settle.getRefundFee());
params.put("net_fee", settle.getPayNetFee());
@ -225,7 +245,8 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
params.put("surcharge", settle.getPoundageFee());
params.put("unsettle_fee", settle.getUnsettlementFee());
JSONObject check = platformSettlementMapper.findByDateMerchant(sdfClear.format(settle.getSettlementDate()), "Wechat", mch.getMerchantId());
JSONObject check = platformSettlementMapper.findByDateMerchant(sdfClear.format(settle.getSettlementDate()), "Wechat",
mch.getMerchantId());
if (check != null) {
params.put("log_id", check.getString("log_id"));
platformSettlementMapper.update(params);
@ -242,7 +263,6 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
}
}
public JSONObject getAliSettle(JSONObject aliSettleLog) {
JSONObject alipaySettleLog = new JSONObject();
@ -269,7 +289,7 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
JSONArray refunds = aliSettleLog.getJSONArray("refunds");
logger.info("alipay的refunds清算总信息" + refunds.toJSONString());
BigDecimal debit = new BigDecimal(0.00);
BigDecimal debitFee = new BigDecimal(0.00);
BigDecimal debitFee = new BigDecimal(0.00);
BigDecimal debitSettle = new BigDecimal(0.00);
if (refunds != null) {
for (int i = 0; i < refunds.size(); i++) {
@ -287,8 +307,8 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
}
alipaySettleLog.put("debit", debit);
alipaySettleLog.put("net_fee", credit.subtract(debit));
alipaySettleLog.put("surcharge",creditFee.subtract(debitFee));
alipaySettleLog.put("settlement_fee",creditSettle.subtract(debitSettle));
alipaySettleLog.put("surcharge", creditFee.subtract(debitFee));
alipaySettleLog.put("settlement_fee", creditSettle.subtract(debitSettle));
logger.info("阿里清算日志:" + alipaySettleLog.toJSONString());
return alipaySettleLog;
}
@ -317,11 +337,11 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
return null;
}
//2017-11-01后微信手续费0.5
// 2017-11-01后微信手续费0.5
BigDecimal wechat_rate;
if(end_date.compareTo("2017-11-01 03:00:00")<=0){
if (end_date.compareTo("2017-11-01 03:00:00") <= 0) {
wechat_rate = new BigDecimal("0.006");
}else {
} else {
wechat_rate = new BigDecimal("0.005");
}
@ -344,9 +364,126 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
return sysLogs;
} catch (Exception e) {
//do nothing
// do nothing
e.printStackTrace();
}
return null;
}
@Override
public void doVerifyHFSettleLog(JSONObject param) {
String end = param.getString("end");
String start = param.getString("start");
JSONObject hfSettle = handleHFSettleFile(param.getString("fileId"));
if (hfSettle == null) {
return;
}
JSONObject record = new JSONObject();
record.put("settle_date", end);
record.put("start_date", start);
record.put("end_date", end);
record.put("channel", "hf");
record.put("last_update_date", new Date());
JSONObject syscleardata = getHFSystemClearingAmount(start, end);
if (syscleardata != null && syscleardata.size() > 0) {
record.put("sys_pay_fee", syscleardata.getBigDecimal("sys_pay_fee"));
record.put("sys_refund_fee", syscleardata.getBigDecimal("sys_refund_fee"));
record.put("sys_net_fee", syscleardata.getBigDecimal("sys_net_fee"));
record.put("sys_surcharge", syscleardata.getBigDecimal("sys_surcharge"));
record.put("sys_settlement_fee", syscleardata.getBigDecimal("sys_settle_fee"));
}
record.put("pay_fee", BigDecimal.ZERO);
record.put("refund_fee", BigDecimal.ZERO);
record.put("net_fee", hfSettle.getBigDecimal("orderAmount"));
record.put("settlement_fee", hfSettle.getBigDecimal("clearingAmount"));
record.put("surcharge", hfSettle.getBigDecimal("surcharge"));
record.put("unsettle_fee", BigDecimal.ZERO);
List<JSONObject> check = null;
try {
check = platformSettlementMapper.findBySettleDate(DateUtils.parseDate(end, "yyyy-MM-dd"), "hf");
} catch (ParseException e) {
e.printStackTrace();
}
if (CollectionUtils.isNotEmpty(check)) {
record.put("log_id", check.get(0).getString("log_id"));
platformSettlementMapper.update(record);
} else {
platformSettlementMapper.save(record);
}
logger.info("汇付清算记录查询完成");
}
private JSONObject handleHFSettleFile(String fileId) {
try {
HttpRequestGenerator gen = new HttpRequestGenerator(attachmentClient.getFileUrl(fileId), RequestMethod.GET);
HSSFWorkbook workbook = new HSSFWorkbook(gen.execute().getResponseContentStream());
HSSFSheet sheet = workbook.getSheetAt(0);
Iterator<Row> rowIterator = sheet.rowIterator();
Row row = null;
Cell cell = null;
// 跳过第一行
rowIterator.next();
JSONObject result = new JSONObject();
BigDecimal orderAmount = BigDecimal.ZERO;
BigDecimal surcharge = BigDecimal.ZERO;
BigDecimal clearingAmount = BigDecimal.ZERO;
while (rowIterator.hasNext()) {
row = rowIterator.next();
cell = row.getCell(0);
if (cell != null) {
continue;
}
cell = row.getCell(15);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
if (cell != null) {
String orderAmountStr = cell.getStringCellValue().trim();
if (StringUtils.isNotEmpty(orderAmountStr)) {
result.put("orderAmount", new BigDecimal(orderAmountStr));
}
}
cell = row.getCell(16);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
if (cell != null) {
String surchargeStr = cell.getStringCellValue().trim();
if (StringUtils.isNotEmpty(surchargeStr)) {
result.put("surcharge", new BigDecimal(surchargeStr));
}
}
cell = row.getCell(17);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
if (cell != null) {
String clearingAmounStr = cell.getStringCellValue().trim();
if (StringUtils.isNotEmpty(clearingAmounStr)) {
result.put("clearingAmount", new BigDecimal(clearingAmounStr));
}
}
}
return result;
} catch (Exception e) {
logger.debug("处理汇付清算文件出错", e);
}
return null;
}
private JSONObject getHFSystemClearingAmount(String start, String end) {
JSONObject result = new JSONObject();
try {
JSONObject creditLogs = platformSettlementMapper.calculateSysSettleLog(start, end, "hf", "Credit", new BigDecimal(0.008));
result.put("sys_pay_fee", creditLogs.getBigDecimal("aud_amount"));
JSONObject debitLogs = platformSettlementMapper.calculateSysSettleLog(start, end, "hf", "Debit", new BigDecimal(0.008));
result.put("sys_surcharge", platformSettlementMapper.calculateRmbCharge(start, end, "hf", new BigDecimal(0.008)));
result.put("sys_refund_fee", debitLogs.getBigDecimal("aud_amount"));
result.put("sys_net_fee", creditLogs.getBigDecimal("aud_amount").subtract(debitLogs.getBigDecimal("aud_amount")));
result.put("sys_settle_fee", result.getBigDecimal("sys_net_fee").subtract(result.getBigDecimal("sys_surcharge")));
return result;
} catch (Exception ignore) {
ignore.printStackTrace();
}
return null;
}
}

@ -3,12 +3,20 @@ package au.com.royalpay.payment.manage.analysis.web;
import au.com.royalpay.payment.manage.analysis.core.PlatformClearService;
import au.com.royalpay.payment.manage.permission.manager.ManagerMapping;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
import javax.annotation.Resource;
@RestController
@RequestMapping(value = "/platform/analysis")
public class PlatformClearAController {
@ -35,4 +43,9 @@ public class PlatformClearAController {
public void generateSettleLogs() {
platformClearService.generateSettleLogs();
}
@ManagerMapping(value = "/generate/hf/settle", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.DEVELOPER})
public void generatehfSettleLogs(@RequestBody JSONObject param) {
platformClearService.doVerifyHFSettleLog(param);
}
}

@ -16,7 +16,8 @@ define(['angular', 'decimal', 'uiRouter', 'angularEcharts', '../../analysis/repo
});
}]);
app.controller('platformSettleLogCtrl', ['$scope', '$http', '$state','commonDialog', function ($scope, $http, $state, commonDialog) {
app.controller('platformSettleLogCtrl', ['$scope', '$http', '$state','$filter','Upload','commonDialog', function ($scope, $http, $state,$filter,Upload, commonDialog) {
$scope.wechatPagination = {};
$scope.loadWechatLogs = function (page) {
var params = $scope.queryParams || {};
@ -88,6 +89,56 @@ define(['angular', 'decimal', 'uiRouter', 'angularEcharts', '../../analysis/repo
$state.reload();
}
$scope.hfParam={};
$scope.hfPagination = {};
$scope.loadhfLogs = function (page) {
var params = $scope.queryParams || {};
params.page = page || $scope.hfPagination.page || 1;
params.limit = 20;
params.channel = 'hf';
$http.get('/platform/analysis/settle/log', {params: params}).then(function (resp) {
$scope.hfLogs = resp.data.data;
$scope.hfPagination = resp.data.pagination;
});
};
$scope.loadhfLogs(1);
$scope.uploadhfSettleFile = function (file) {
if (file != null) {
Upload.upload({
url: '/attachment/secret_files',
data: {file: file}
}).then(function (resp) {
$scope.hfParam.fileId = resp.data.fileid;
commonDialog.alert({title: 'Upload Success', content:'', type: 'success'})
}, function (resp) {
}, function (evt) {
})
}
};
$scope.dohfSettle = function () {
var param = angular.copy($scope.hfParam);
if(!param.start){
alert("请先选择开始时间");
}
if(!param.end){
alert("请先选择结束时间");
}
if(!param.fileId){
alert("请先上传汇付清算文件");
}
param.start = $filter('date')(param.start, "yyyy-MM-dd");
param.end = $filter('date')(param.end, "yyyy-MM-dd");
$http.put('/platform/analysis/generate/hf/settle',param).then(function (resp) {
});
}
}]);
app.controller('platformRevenueRootCtrl', ['$scope', '$http', '$filter', 'chartParser', function ($scope, $http, $filter, chartParser) {
$scope.params = {year: new Date().getFullYear()};

@ -271,5 +271,107 @@
</div>
</div>
</div>
<div class="box box-warning">
<div class="box-header">
<h4 class="text-green">HF Logs</h4>
</div>
<div style="display: inline-block">
<input class="form-control"
ng-model="hfParam.start"
uib-datepicker-popup size="10" placeholder="start"
is-open="start.open"
ng-click="start.open=true"
datepicker-options="{maxDate:hfParam.end}">
</div>
<div style="display: inline-block">
<input class="form-control"
ng-model="hfParam.end"
uib-datepicker-popup size="10" placeholder="end"
is-open="end.open"
ng-click="end.open=true"
datepicker-options="{maxDate:hfParam.end||today}">
</div>
<button class="btn btn-primary" type="button"
ngf-select="uploadhfSettleFile($file)">
<i class="fa fa-upload"></i> Upload Settle File
</button>
<button class="btn btn-primary" type="button"
ng-click="dohfSettle()">
<i class="fa fa-upload"></i> Do Settlement
</button>
<div class="box-body table-responsive">
<p ng-if="!hfLogs.length">No Data</p>
<table class="table table-hover" ng-if="hfLogs.length">
<thead>
<tr>
<th>Date Start</th>
<th>Date End</th>
<th>Settle Date</th>
<th>Pay Fee</th>
<th>Refund Fee</th>
<th>Net Fee</th>
<th>Poundage</th>
<th>Settlement Fee</th>
<th>Unsettled</th>
<th style="text-align: center;">Validation</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="log in hfLogs">
<td ng-bind="log.start_date.substr(0,10)"></td>
<td ng-bind="log.end_date.substr(0,10)"></td>
<td ng-bind="log.settle_date.substr(0,10)"></td>
<td ng-bind="log.pay_fee"></td>
<td ng-bind="log.refund_fee"></td>
<td>{{log.net_fee}}
<span ng-if="log.sys_net_fee==log.net_fee" style="color: #0BB20C">&nbsp;&nbsp;(System:{{log.sys_net_fee}})</span>
<span ng-if="log.sys_net_fee!=log.net_fee" style="color: crimson">&nbsp;&nbsp;(System:{{log.sys_net_fee}})</span>
</td>
<td>{{log.surcharge}}
<span ng-if="log.sys_surcharge==log.surcharge" style="color: #0BB20C">&nbsp;&nbsp;(System:{{log.sys_surcharge}})</span>
<span ng-if="log.sys_surcharge!=log.surcharge" style="color: crimson">&nbsp;&nbsp;(System:{{log.sys_surcharge}})</span>
</td>
<td>{{log.settlement_fee}}
<span ng-if="log.sys_settlement_fee==log.settlement_fee" style="color: #0BB20C">&nbsp;&nbsp;(System:{{log.sys_settlement_fee}})</span>
<span ng-if="log.sys_settlement_fee!=log.settlement_fee" style="color: crimson">&nbsp;&nbsp;(System:{{log.sys_settlement_fee}})</span>
</td>
<td ng-bind="log.unsettle_fee"></td>
<td ng-if="log.sys_settlement_fee==log.settlement_fee" style="font-size:25px;text-align: center;"><a
role="button" ng-click="verifySettleLog(log)"><i
class="fa fa-check-circle text-green" uib-tooltip="校验通过"></i></a></td>
<td ng-if="log.sys_settlement_fee!=log.settlement_fee" style="font-size:25px;text-align: center;"><a
role="button" ng-click="verifySettleLog(log)"><i
class="fa fa-exclamation-circle text-red" uib-tooltip="校验未通过:点击重新验证"></i></a></td>
</tr>
</tbody>
</table>
<div class="panel-footer">
<div class="row">
<uib-pagination ng-if="hfLogs.length"
class="pagination"
total-items="hfPagination.totalCount"
boundary-links="true"
ng-model="wechatPagination.page"
items-per-page="hfPagination.limit"
max-size="10"
ng-change="loadhfLogs()"
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
<div class="col-xs-12">Total Records:{{hfPagination.totalCount}};Total
Pages:{{hfPagination.totalPages}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
Loading…
Cancel
Save