|
@@ -23,6 +23,7 @@ import java.util.stream.Collectors;
|
|
|
|
|
|
import static org.jebot.constant.Constant.*;
|
|
import static org.jebot.constant.Constant.*;
|
|
import static org.jebot.util.DateUtil.getTodayMidnight;
|
|
import static org.jebot.util.DateUtil.getTodayMidnight;
|
|
|
|
+import static org.jebot.util.DateUtil.getYesnight;
|
|
|
|
|
|
@Slf4j
|
|
@Slf4j
|
|
public class MerchantOneClickSettlementHandler extends AbstractHandler {
|
|
public class MerchantOneClickSettlementHandler extends AbstractHandler {
|
|
@@ -42,7 +43,7 @@ public class MerchantOneClickSettlementHandler extends AbstractHandler {
|
|
|
|
|
|
//一键所有商户结算
|
|
//一键所有商户结算
|
|
if (SETTLE_MCH.equals(message.getMessageText())) {
|
|
if (SETTLE_MCH.equals(message.getMessageText())) {
|
|
- Date endDate = new Date();
|
|
|
|
|
|
+ Date endDate = getYesnight();
|
|
Date todayMidnight = getTodayMidnight(endDate);
|
|
Date todayMidnight = getTodayMidnight(endDate);
|
|
List<BotGroup> botGroups = handlerManager.getGroupRepository().findAllByAgentWarningThresholdOrPaymentWarningThresholdGreaterThanZero();
|
|
List<BotGroup> botGroups = handlerManager.getGroupRepository().findAllByAgentWarningThresholdOrPaymentWarningThresholdGreaterThanZero();
|
|
List<BotGroup> mchGroups = botGroups.stream().filter(botGroup -> Constant.DATA_TYPE_MERCHANT.equals(botGroup.getDataType())).collect(Collectors.toList());
|
|
List<BotGroup> mchGroups = botGroups.stream().filter(botGroup -> Constant.DATA_TYPE_MERCHANT.equals(botGroup.getDataType())).collect(Collectors.toList());
|
|
@@ -110,7 +111,7 @@ public class MerchantOneClickSettlementHandler extends AbstractHandler {
|
|
|
|
|
|
//结算指定商户
|
|
//结算指定商户
|
|
if (SETTLE_MCH_ID.matcher(message.getMessageText()).find()) {
|
|
if (SETTLE_MCH_ID.matcher(message.getMessageText()).find()) {
|
|
- Date endDate = new Date();
|
|
|
|
|
|
+ Date endDate = getYesnight();
|
|
Date todayMidnight = getTodayMidnight(endDate);
|
|
Date todayMidnight = getTodayMidnight(endDate);
|
|
Long mchId = Long.valueOf(message.getMessageText().replace(SETTLE_MCH, ""));
|
|
Long mchId = Long.valueOf(message.getMessageText().replace(SETTLE_MCH, ""));
|
|
BotGroup mchGroup = handlerManager.getGroupRepository().findBotGroupByDataIdAndDataType(mchId, DATA_TYPE_MERCHANT);
|
|
BotGroup mchGroup = handlerManager.getGroupRepository().findBotGroupByDataIdAndDataType(mchId, DATA_TYPE_MERCHANT);
|
|
@@ -154,10 +155,9 @@ public class MerchantOneClickSettlementHandler extends AbstractHandler {
|
|
|
|
|
|
private boolean SettlementMch(BotMessage message, BotGroup mchGroup, List<PayOrder> payOrderList, Date todayMidnight, Date endDate) {
|
|
private boolean SettlementMch(BotMessage message, BotGroup mchGroup, List<PayOrder> payOrderList, Date todayMidnight, Date endDate) {
|
|
|
|
|
|
-
|
|
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|
|
|
|
|
- // 计算总金额
|
|
|
|
|
|
+ // 计算总金额(未扣手续费)
|
|
BigDecimal totalAmount = payOrderList.stream()
|
|
BigDecimal totalAmount = payOrderList.stream()
|
|
.map(PayOrder::getAmount)
|
|
.map(PayOrder::getAmount)
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
@@ -165,51 +165,54 @@ public class MerchantOneClickSettlementHandler extends AbstractHandler {
|
|
// 成功总笔数
|
|
// 成功总笔数
|
|
long totalOrders = payOrderList.size();
|
|
long totalOrders = payOrderList.size();
|
|
|
|
|
|
- // 扣除手续费总跑量
|
|
|
|
|
|
+ // 扣除手续费后的总跑量
|
|
BigDecimal totalAmountByMchRate = payOrderList.stream()
|
|
BigDecimal totalAmountByMchRate = payOrderList.stream()
|
|
- .map(order -> BigDecimal.valueOf(1).subtract(order.getMchRate().movePointLeft(Constant.AMOUNT_MOVE_POINT)).multiply(order.getAmount()))
|
|
|
|
|
|
+ .map(order -> BigDecimal.ONE
|
|
|
|
+ .subtract(order.getMchRate().movePointLeft(Constant.AMOUNT_MOVE_POINT))
|
|
|
|
+ .multiply(order.getAmount()))
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
+
|
|
stringBuilder.append(DateUtil.formatDate(endDate)).append("账单,请核对:\n");
|
|
stringBuilder.append(DateUtil.formatDate(endDate)).append("账单,请核对:\n");
|
|
stringBuilder.append("总跑量: ").append(totalAmount.movePointLeft(Constant.AMOUNT_MOVE_POINT).doubleValue()).append("\n");
|
|
stringBuilder.append("总跑量: ").append(totalAmount.movePointLeft(Constant.AMOUNT_MOVE_POINT).doubleValue()).append("\n");
|
|
stringBuilder.append("成功笔数: ").append(totalOrders).append("\n");
|
|
stringBuilder.append("成功笔数: ").append(totalOrders).append("\n");
|
|
stringBuilder.append("扣除手续费总跑量: ").append(totalAmountByMchRate.movePointLeft(Constant.AMOUNT_MOVE_POINT).doubleValue()).append("\n");
|
|
stringBuilder.append("扣除手续费总跑量: ").append(totalAmountByMchRate.movePointLeft(Constant.AMOUNT_MOVE_POINT).doubleValue()).append("\n");
|
|
- BigDecimal deductionAmount = totalAmount.subtract(totalAmountByMchRate).add(totalAmount).movePointLeft(AMOUNT_MOVE_POINT);
|
|
|
|
-
|
|
|
|
- //根据通道ID分组
|
|
|
|
- Map<Long, List<PayOrder>> groupedByPassageId = payOrderList.stream()
|
|
|
|
- .collect(Collectors.groupingBy(PayOrder::getPassageId));
|
|
|
|
-
|
|
|
|
- for (Map.Entry<Long, List<PayOrder>> entry : groupedByPassageId.entrySet()) {
|
|
|
|
- stringBuilder.append(entry.getKey()).append(":\n");
|
|
|
|
- //根据商户费率分组
|
|
|
|
- Map<BigDecimal, List<PayOrder>> groupedByMchRate = entry.getValue().stream().collect(Collectors.groupingBy(PayOrder::getMchRate)).entrySet().stream()
|
|
|
|
- .sorted(Map.Entry.comparingByKey()) // 根据 getMchRate 排序
|
|
|
|
- .collect(Collectors.toMap(
|
|
|
|
- Map.Entry::getKey,
|
|
|
|
- Map.Entry::getValue,
|
|
|
|
- (e1, e2) -> e1,
|
|
|
|
- HashMap::new // 保证顺序
|
|
|
|
- ));
|
|
|
|
-
|
|
|
|
- //根据费率计算金额
|
|
|
|
- for (Map.Entry<BigDecimal, List<PayOrder>> rateEntry : groupedByMchRate.entrySet()) {
|
|
|
|
- //费率
|
|
|
|
- BigDecimal mchRate = rateEntry.getKey();
|
|
|
|
-
|
|
|
|
- // 计算金额
|
|
|
|
- BigDecimal amount = rateEntry.getValue().stream()
|
|
|
|
- .map(PayOrder::getAmount)
|
|
|
|
- .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
- stringBuilder.append("费率").append(mchRate.doubleValue()).append(": ").append(amount.movePointLeft(AMOUNT_MOVE_POINT).doubleValue()).append("\n");
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+ // 扣除金额(手续费)
|
|
|
|
+ // 下发金额 = 总跑量 - 手续费
|
|
|
|
+ BigDecimal deductionAmount = totalAmountByMchRate.movePointLeft(Constant.AMOUNT_MOVE_POINT);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // ================= 按费率分组汇总 =================
|
|
|
|
+ stringBuilder.append("按费率统计:\n");
|
|
|
|
+
|
|
|
|
+ Map<BigDecimal, List<PayOrder>> groupedByMchRate = payOrderList.stream()
|
|
|
|
+ .collect(Collectors.groupingBy(PayOrder::getMchRate));
|
|
|
|
+
|
|
|
|
+ groupedByMchRate.entrySet().stream()
|
|
|
|
+ .sorted(Map.Entry.comparingByKey()) // 按费率排序
|
|
|
|
+ .forEach(entry -> {
|
|
|
|
+ BigDecimal mchRate = entry.getKey();
|
|
|
|
+ BigDecimal amount = entry.getValue().stream()
|
|
|
|
+ .map(PayOrder::getAmount)
|
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
+
|
|
|
|
+ stringBuilder.append("费率").append(mchRate.doubleValue())
|
|
|
|
+ .append(": ")
|
|
|
|
+ .append(amount.movePointLeft(Constant.AMOUNT_MOVE_POINT).doubleValue())
|
|
|
|
+ .append("\n");
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // ================= 发送账单 =================
|
|
SendMessage sendMessage = new SendMessage(mchGroup.getGroupId(), stringBuilder.toString());
|
|
SendMessage sendMessage = new SendMessage(mchGroup.getGroupId(), stringBuilder.toString());
|
|
SendResponse execute = message.getTelegramBot().execute(sendMessage);
|
|
SendResponse execute = message.getTelegramBot().execute(sendMessage);
|
|
if (!execute.isOk()) {
|
|
if (!execute.isOk()) {
|
|
log.error("一键结算发送消息失败, 错误信息: {}", execute.description());
|
|
log.error("一键结算发送消息失败, 错误信息: {}", execute.description());
|
|
return false;
|
|
return false;
|
|
} else {
|
|
} else {
|
|
- BotAccountBook accountBook = handlerManager.getAccountBookRepository().findByBelongIdAndType(mchGroup.getDataId(), DATA_TYPE_MERCHANT);
|
|
|
|
|
|
+ // ================= 更新商户账本 =================
|
|
|
|
+ BotAccountBook accountBook = handlerManager.getAccountBookRepository()
|
|
|
|
+ .findByBelongIdAndType(mchGroup.getDataId(), DATA_TYPE_MERCHANT);
|
|
|
|
+
|
|
if (accountBook == null) {
|
|
if (accountBook == null) {
|
|
accountBook = new BotAccountBook();
|
|
accountBook = new BotAccountBook();
|
|
accountBook.setBelongId(mchGroup.getDataId());
|
|
accountBook.setBelongId(mchGroup.getDataId());
|
|
@@ -218,12 +221,17 @@ public class MerchantOneClickSettlementHandler extends AbstractHandler {
|
|
accountBook.setAgentBalance(0);
|
|
accountBook.setAgentBalance(0);
|
|
handlerManager.getAccountBookRepository().save(accountBook);
|
|
handlerManager.getAccountBookRepository().save(accountBook);
|
|
}
|
|
}
|
|
|
|
+
|
|
log.info("一键结算发送消息成功, 群组ID: {}, 结算记录: {}", mchGroup.getGroupId(), stringBuilder.toString());
|
|
log.info("一键结算发送消息成功, 群组ID: {}, 结算记录: {}", mchGroup.getGroupId(), stringBuilder.toString());
|
|
|
|
+
|
|
double oldPaymentBalance = accountBook.getPaymentBalance();
|
|
double oldPaymentBalance = accountBook.getPaymentBalance();
|
|
- double newPaymentBalance = BigDecimal.valueOf(oldPaymentBalance).subtract(deductionAmount).doubleValue();
|
|
|
|
|
|
+ double newPaymentBalance = BigDecimal.valueOf(oldPaymentBalance)
|
|
|
|
+ .subtract(deductionAmount).doubleValue();
|
|
|
|
+
|
|
BotMessage botMessage = new BotMessage();
|
|
BotMessage botMessage = new BotMessage();
|
|
botMessage.setBotGroup(mchGroup);
|
|
botMessage.setBotGroup(mchGroup);
|
|
botMessage.setBotUser(message.getBotUser());
|
|
botMessage.setBotUser(message.getBotUser());
|
|
|
|
+
|
|
try {
|
|
try {
|
|
UpdateBalance updateMerchantPaymentBalance = new UpdateBalance();
|
|
UpdateBalance updateMerchantPaymentBalance = new UpdateBalance();
|
|
updateMerchantPaymentBalance.setId(accountBook.getId());
|
|
updateMerchantPaymentBalance.setId(accountBook.getId());
|
|
@@ -231,20 +239,33 @@ public class MerchantOneClickSettlementHandler extends AbstractHandler {
|
|
updateMerchantPaymentBalance.setNewBalance(newPaymentBalance);
|
|
updateMerchantPaymentBalance.setNewBalance(newPaymentBalance);
|
|
updateMerchantPaymentBalance.setAmount(deductionAmount.doubleValue());
|
|
updateMerchantPaymentBalance.setAmount(deductionAmount.doubleValue());
|
|
updateMerchantPaymentBalance.setMessage(botMessage);
|
|
updateMerchantPaymentBalance.setMessage(botMessage);
|
|
- handlerManager.getAccountBookService().updatePaymentBalanceByIdAndPaymentBalance(updateMerchantPaymentBalance);
|
|
|
|
- sendMessage = new SendMessage(mchGroup.getGroupId(), String.format("下发提醒\n下发金额: %.2f\n下发前: %.2f\n下发后: %.2f", deductionAmount.doubleValue(), oldPaymentBalance, newPaymentBalance));
|
|
|
|
|
|
+
|
|
|
|
+ handlerManager.getAccountBookService()
|
|
|
|
+ .updatePaymentBalanceByIdAndPaymentBalance(updateMerchantPaymentBalance);
|
|
|
|
+
|
|
|
|
+ sendMessage = new SendMessage(mchGroup.getGroupId(),
|
|
|
|
+ String.format("下发提醒\n下发金额: %.2f\n下发前: %.2f\n下发后: %.2f",
|
|
|
|
+ deductionAmount.doubleValue(), oldPaymentBalance, newPaymentBalance));
|
|
|
|
+
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
- log.error("更新商户群组账本失败,群组ID:{},群组名称:{},用户ID:{},用户名称:{},金额:{},错误信息:{}", message.getBotGroup().getDataId(), message.getBotGroup().getDataName(), message.getBotUser().getUserId(), message.getBotUser().getUserName(), deductionAmount.doubleValue(), e.getMessage());
|
|
|
|
|
|
+ log.error("更新商户群组账本失败,群组ID:{},群组名称:{},用户ID:{},用户名称:{},金额:{},错误信息:{}",
|
|
|
|
+ message.getBotGroup().getDataId(),
|
|
|
|
+ message.getBotGroup().getDataName(),
|
|
|
|
+ message.getBotUser().getUserId(),
|
|
|
|
+ message.getBotUser().getUserName(),
|
|
|
|
+ deductionAmount.doubleValue(),
|
|
|
|
+ e.getMessage());
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
- sendMessage = new SendMessage(message.getMessage().chat().id(), "下发处理失败,请手动处理");
|
|
|
|
|
|
+ sendMessage = new SendMessage(message.getMessage().chat().id(),
|
|
|
|
+ "下发处理失败,请手动处理");
|
|
} finally {
|
|
} finally {
|
|
if (sendMessage != null) {
|
|
if (sendMessage != null) {
|
|
message.getTelegramBot().execute(sendMessage);
|
|
message.getTelegramBot().execute(sendMessage);
|
|
log.info("一键结算发送消息成功, 群组ID: {}, 结算记录: {}", message.getMessage().chat().id(), sendMessage);
|
|
log.info("一键结算发送消息成功, 群组ID: {}, 结算记录: {}", message.getMessage().chat().id(), sendMessage);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- //记录结算记录
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|