|
|
|
@ -10,31 +10,45 @@ import au.com.royalpay.payment.manage.analysis.mappers.EstimateAnalysisMapper;
|
|
|
|
|
import au.com.royalpay.payment.manage.mappers.log.PlatformSettlementMapper;
|
|
|
|
|
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.ss.usermodel.Cell;
|
|
|
|
|
import org.apache.poi.ss.usermodel.Row;
|
|
|
|
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
|
|
|
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
@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;
|
|
|
|
@ -47,7 +61,8 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
|
|
|
|
|
|
|
|
|
|
@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 +77,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 +102,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 +114,9 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
// @Transactional
|
|
|
|
|
// @Transactional
|
|
|
|
|
public void generateSettleLogs() {
|
|
|
|
|
// deleteSettleLogs();
|
|
|
|
|
// deleteSettleLogs();
|
|
|
|
|
generateWechatSettleLogs();
|
|
|
|
|
generateAlipaySettleLogs();
|
|
|
|
|
generateAlipayOnlineSettleLogs();
|
|
|
|
@ -109,7 +125,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 +209,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 +224,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 +240,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 +258,6 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public JSONObject getAliSettle(JSONObject aliSettleLog) {
|
|
|
|
|
JSONObject alipaySettleLog = new JSONObject();
|
|
|
|
|
|
|
|
|
@ -269,7 +284,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 +302,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 +332,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 +359,128 @@ public class PlatformClearAnalysisServiceImpl implements PlatformClearService {
|
|
|
|
|
return sysLogs;
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
//do nothing
|
|
|
|
|
// do nothing
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void doVerifyHFSettleLog(MultipartFile file, String start, String end) {
|
|
|
|
|
JSONObject hfSettle = handleHFSettleFile(file);
|
|
|
|
|
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(MultipartFile file) {
|
|
|
|
|
try {
|
|
|
|
|
XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
|
|
|
|
|
XSSFSheet 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(14);
|
|
|
|
|
if (cell != null) {
|
|
|
|
|
String orderAmountStr = cell.getStringCellValue().trim();
|
|
|
|
|
if (StringUtils.isNotEmpty(orderAmountStr)) {
|
|
|
|
|
BigDecimal cellVar = new BigDecimal(orderAmountStr);
|
|
|
|
|
if (orderAmount.compareTo(cellVar) == 0) {
|
|
|
|
|
result.put("orderAmount", orderAmount);
|
|
|
|
|
} else {
|
|
|
|
|
orderAmount = orderAmount.add(cellVar);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
cell = row.getCell(15);
|
|
|
|
|
if (cell != null) {
|
|
|
|
|
String surchargeStr = cell.getStringCellValue().trim();
|
|
|
|
|
if (StringUtils.isNotEmpty(surchargeStr)) {
|
|
|
|
|
BigDecimal cellVar = new BigDecimal(surchargeStr);
|
|
|
|
|
if (surcharge.compareTo(cellVar) == 0) {
|
|
|
|
|
result.put("orderAmount", surcharge);
|
|
|
|
|
} else {
|
|
|
|
|
surcharge = surcharge.add(cellVar);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
cell = row.getCell(16);
|
|
|
|
|
if (cell != null) {
|
|
|
|
|
String clearingAmounStr = cell.getStringCellValue().trim();
|
|
|
|
|
if (StringUtils.isNotEmpty(clearingAmounStr)) {
|
|
|
|
|
BigDecimal cellVar = new BigDecimal(clearingAmounStr);
|
|
|
|
|
if (clearingAmount.compareTo(cellVar) == 0) {
|
|
|
|
|
result.put("clearingAmount", clearingAmount);
|
|
|
|
|
} else {
|
|
|
|
|
clearingAmount = clearingAmount.add(cellVar);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
} catch (IOException 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_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")));
|
|
|
|
|
result.put("sys_surcharge", platformSettlementMapper.calculateRmbCharge(start, end, "hf", new BigDecimal(0.008)));
|
|
|
|
|
return result;
|
|
|
|
|
} catch (Exception ignore) {
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|