Merge branch 'dev' into dev-g

This commit is contained in:
Guoqs
2025-06-24 16:14:20 +08:00
20 changed files with 1766 additions and 69 deletions

View File

@@ -2046,35 +2046,11 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
// 根据站点id查询分账配置(如果未配置则初始化)
List<StationSplitConfig> stationSplitConfigList = stationSplitConfigService.queryByStationIdWithInit(stationId);
// 查字典是否开启收取平台支持服务费
// 查字典是否开启收取平台支持服务费 1-开启; 0-关闭
String dictValue = DictUtils.getDictValue("platform_service_flag", "status");
if (StringUtils.equals(dictValue, Constants.ONE)) { // 开启收取平台支持服务费
// 根据站点id查询平台支持服务费率
PileStationInfo pileStationInfo = pileStationInfoService.selectPileStationInfoById(Long.parseLong(stationId));
// 如果是否对接高德为1, 并且支持服务费率大于0, 则收取平台支持服务费
if (pileStationInfo != null
&& StringUtils.equals(pileStationInfo.getAMapFlag(), Constants.ONE)
&& pileStationInfo.getServiceRate().compareTo(BigDecimal.ZERO) > 0) {
// 获取平台支持服务费率
BigDecimal serviceRate = pileStationInfo.getServiceRate();
// 取出stationSplitConfigList中手续费承担方, 并把电费分成比例和服务费分成比例减去serviceRate
for (StationSplitConfig stationSplitConfig : stationSplitConfigList) {
if (Constants.ONE.equals(stationSplitConfig.getFeeFlag())) {
stationSplitConfig.setElectricitySplitRatio(stationSplitConfig.getElectricitySplitRatio().subtract(serviceRate));
stationSplitConfig.setServiceSplitRatio(stationSplitConfig.getServiceSplitRatio().subtract(serviceRate));
}
}
// 添加一个账户, adapayMemberId为0, 电费分成比例为serviceRate, 服务费分成比例为serviceRate
stationSplitConfigList.add(StationSplitConfig.builder()
.adapayMemberId(Constants.ZERO)
.electricitySplitRatio(serviceRate)
.serviceSplitRatio(serviceRate)
.feeFlag(Constants.ZERO)
.build()
);
logger.info("realTimeOrderSplit-订单:{}, 收取平台支持服务费, 平台分成比例为:{}, stationSplitConfigList:{}",
orderCode, serviceRate, JSON.toJSONString(stationSplitConfigList));
}
if (StringUtils.equals(dictValue, Constants.ONE)) {
// 开启收取平台支持服务费, 更新参与分账的账户列表
updateSplitConfigList(stationId, stationSplitConfigList, orderCode);
}
// 计算每个参与分账的用户, 应分多少钱
@@ -2100,12 +2076,72 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
.wechatAppId(appId)
.build();
PaymentConfirmResponse paymentConfirmRequest = adapayService.createPaymentConfirmRequest(param);
// 保存订单分账记录
OrderInfoDetailVO orderInfoDetailVO = getOrderInfoDetailVO(orderCode);
orderSplitRecordService.saveOrderSplitRecord(param, paymentConfirmRequest, splitDataList, orderInfoDetailVO);
// 更新订单实收金额
updateOrderReceivedAmount(orderCode, splitDataList);
return paymentConfirmRequest;
}
/**
* 开启了收取平台支持服务费, 更新订单分账账户列表
* @param stationId
* @param stationSplitConfigList
* @param orderCode
*/
private void updateSplitConfigList(String stationId, List<StationSplitConfig> stationSplitConfigList, String orderCode) {
// 根据站点id查询平台支持服务费率
PileStationInfo pileStationInfo = pileStationInfoService.selectPileStationInfoById(Long.parseLong(stationId));
// 如果是否对接高德为1, 并且支持服务费率大于0, 则收取平台支持服务费
if (pileStationInfo != null
&& StringUtils.equals(pileStationInfo.getAMapFlag(), Constants.ONE)
&& pileStationInfo.getServiceRate().compareTo(BigDecimal.ZERO) > 0) {
// 获取平台支持服务费率
BigDecimal serviceRate = pileStationInfo.getServiceRate();
// 取出stationSplitConfigList中手续费承担方, 并把电费分成比例和服务费分成比例减去serviceRate
for (StationSplitConfig stationSplitConfig : stationSplitConfigList) {
if (Constants.ONE.equals(stationSplitConfig.getFeeFlag())) {
stationSplitConfig.setElectricitySplitRatio(stationSplitConfig.getElectricitySplitRatio().subtract(serviceRate));
stationSplitConfig.setServiceSplitRatio(stationSplitConfig.getServiceSplitRatio().subtract(serviceRate));
}
}
// 添加一个账户, adapayMemberId为0, 电费分成比例为serviceRate, 服务费分成比例为serviceRate
stationSplitConfigList.add(StationSplitConfig.builder()
.adapayMemberId(Constants.ZERO)
.electricitySplitRatio(serviceRate)
.serviceSplitRatio(serviceRate)
.feeFlag(Constants.ZERO)
.build()
);
logger.info("realTimeOrderSplit-订单:{}, 收取平台支持服务费, 平台分成比例为:{}, stationSplitConfigList:{}",
orderCode, serviceRate, JSON.toJSONString(stationSplitConfigList));
}
}
/**
* 更新订单实收金额
*/
private void updateOrderReceivedAmount(String orderCode, List<SplitData> splitDataList) {
BigDecimal actualReceivedAmount = BigDecimal.ZERO;
for (SplitData splitData : splitDataList) {
// 如果是手续费承担方, 计算实收金额
if (StringUtils.equals(splitData.getFeeFlag(), Constants.Y)) {
actualReceivedAmount = splitData.getElecAmount().add(splitData.getServiceAmount());
}
}
// 先查再更新
OrderBasicInfo orderInfo = getOrderInfoByOrderCode(orderCode);
if (orderInfo != null && actualReceivedAmount.compareTo(BigDecimal.ZERO) > 0) {
orderInfo.setActualReceivedAmount(actualReceivedAmount);
orderInfo.setUpdateBy(Constants.SYSTEM);
orderInfo.setUpdateTime(DateUtils.getNowDate());
this.updateOrderBasicInfo(orderInfo);
}
}
/**
* 计算每个账户需要分账的金额
* @param stationSplitConfigList 参与分账的账户信息

View File

@@ -17,6 +17,7 @@ import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.PageUtils;
import com.jsowell.common.util.StringUtils;
import com.jsowell.common.util.YKCUtils;
import com.jsowell.common.util.id.IdUtils;
import com.jsowell.pile.domain.PileStationInfo;
import com.jsowell.pile.domain.SettleOrderReport;
@@ -399,6 +400,12 @@ public class SettleOrderReportServiceImpl implements SettleOrderReportService {
return vo;
}
/**
* 查询运营商订单报告
* 财务中心-财务详情-运营汇总
* @param dto
* @return
*/
private OrderReportDetail queryMerchantOrderReport(MerchantOrderReportDTO dto) {
// 进行数据汇总
OrderReportDetail report = new OrderReportDetail();
@@ -420,6 +427,10 @@ public class SettleOrderReportServiceImpl implements SettleOrderReportService {
BigDecimal amount = settleOrderReportVO.getSettleAmount() != null
? settleOrderReportVO.getSettleAmount()
: settleOrderReportVO.getTotalAmount();
// 2025年6月19日15点11分 修改逻辑, 使用实收金额进行计算
totalAmount = totalAmount.add(amount);
virtualAmount = virtualAmount.add(settleOrderReportVO.getVirtualAmount());
}
@@ -437,10 +448,6 @@ public class SettleOrderReportServiceImpl implements SettleOrderReportService {
report.setTotalAmount(totalAmount);
// 虚拟金额
report.setVirtualAmount(virtualAmount);
// 交易金额
// report.setTradeAmount(list.stream().map(SettleOrderReportVO::getTradeAmount).reduce(BigDecimal.ZERO, BigDecimal::add));
// 交易手续费
// report.setTradeFee(list.stream().map(SettleOrderReportVO::getTradeFee).reduce(BigDecimal.ZERO, BigDecimal::add));
// 从清分账单中计算交易金额,交易手续费
GetClearingBillDTO clearingBillDTO = GetClearingBillDTO.builder()
@@ -676,10 +683,9 @@ public class SettleOrderReportServiceImpl implements SettleOrderReportService {
BigDecimal settleAmount = StringUtils.isBlank(vo.getSettleAmount())
? BigDecimal.ZERO
: new BigDecimal(vo.getSettleAmount());
// if (settleAmount.compareTo(BigDecimal.ZERO) <= 0) {
// // 只统计用电量大于0的
// continue;
// }
// 实收金额
BigDecimal actualReceivedAmount = vo.getActualReceivedAmount();
// 用电度数
BigDecimal chargingDegree = StringUtils.isBlank(vo.getChargingDegree())
@@ -698,6 +704,9 @@ public class SettleOrderReportServiceImpl implements SettleOrderReportService {
continue;
}
// 结算金额与实收金额取大于0的最小值
settleAmount = YKCUtils.getMinBigDecimal(settleAmount, actualReceivedAmount);
String orderAmount = vo.getOrderAmount(); // 订单消费金额
useElectricity = useElectricity.add(chargingDegree); // 充电度数累计

View File

@@ -495,11 +495,13 @@ public abstract class AbstractProgramLogic implements InitializingBean {
// 该时段电费单价
BigDecimal electricityPrice = orderDetail.getSharpElectricityPrice();
// 计算该时段电费 = 电费单价 x 用电量
BigDecimal electricityAmount = electricityPrice.multiply(sharpUsedElectricity).setScale(2, RoundingMode.DOWN);
// BigDecimal electricityAmount = electricityPrice.multiply(sharpUsedElectricity).setScale(2, RoundingMode.DOWN);
BigDecimal electricityAmount = electricityPrice.multiply(sharpUsedElectricity);
// 该时段服务费单价
BigDecimal servicePrice = orderDetail.getSharpServicePrice();
// 计算该时段服务费 = 服务费单价 x 用电量
BigDecimal serviceAmount = servicePrice.multiply(sharpUsedElectricity).setScale(2, RoundingMode.DOWN);
// BigDecimal serviceAmount = servicePrice.multiply(sharpUsedElectricity).setScale(2, RoundingMode.DOWN);
BigDecimal serviceAmount = servicePrice.multiply(sharpUsedElectricity);
// 汇总
totalElectricityAmount = totalElectricityAmount.add(electricityAmount);
totalServiceAmount = totalServiceAmount.add(serviceAmount);
@@ -519,11 +521,13 @@ public abstract class AbstractProgramLogic implements InitializingBean {
// 该时段电费单价
BigDecimal electricityPrice = orderDetail.getPeakElectricityPrice();
// 计算该时段电费 = 电费单价 x 用电量
BigDecimal electricityAmount = electricityPrice.multiply(peakUsedElectricity).setScale(2, RoundingMode.DOWN);
// BigDecimal electricityAmount = electricityPrice.multiply(peakUsedElectricity).setScale(2, RoundingMode.DOWN);
BigDecimal electricityAmount = electricityPrice.multiply(peakUsedElectricity);
// 该时段服务费单价
BigDecimal servicePrice = orderDetail.getPeakServicePrice();
// 计算该时段服务费 = 服务费单价 x 用电量
BigDecimal serviceAmount = servicePrice.multiply(peakUsedElectricity).setScale(2, RoundingMode.DOWN);
// BigDecimal serviceAmount = servicePrice.multiply(peakUsedElectricity).setScale(2, RoundingMode.DOWN);
BigDecimal serviceAmount = servicePrice.multiply(peakUsedElectricity);
// 汇总
totalElectricityAmount = totalElectricityAmount.add(electricityAmount);
totalServiceAmount = totalServiceAmount.add(serviceAmount);
@@ -543,11 +547,13 @@ public abstract class AbstractProgramLogic implements InitializingBean {
// 该时段电费单价
BigDecimal electricityPrice = orderDetail.getFlatElectricityPrice();
// 计算该时段电费 = 电费单价 x 用电量
BigDecimal electricityAmount = electricityPrice.multiply(flatUsedElectricity).setScale(2, RoundingMode.DOWN);
// BigDecimal electricityAmount = electricityPrice.multiply(flatUsedElectricity).setScale(2, RoundingMode.DOWN);
BigDecimal electricityAmount = electricityPrice.multiply(flatUsedElectricity);
// 该时段服务费单价
BigDecimal servicePrice = orderDetail.getFlatServicePrice();
// 计算该时段服务费 = 服务费单价 x 用电量
BigDecimal serviceAmount = servicePrice.multiply(flatUsedElectricity).setScale(2, RoundingMode.DOWN);
// BigDecimal serviceAmount = servicePrice.multiply(flatUsedElectricity).setScale(2, RoundingMode.DOWN);
BigDecimal serviceAmount = servicePrice.multiply(flatUsedElectricity);
// 汇总
totalElectricityAmount = totalElectricityAmount.add(electricityAmount);
totalServiceAmount = totalServiceAmount.add(serviceAmount);
@@ -567,11 +573,13 @@ public abstract class AbstractProgramLogic implements InitializingBean {
// 该时段电费单价
BigDecimal electricityPrice = orderDetail.getValleyElectricityPrice();
// 计算该时段电费 = 电费单价 x 用电量
BigDecimal electricityAmount = electricityPrice.multiply(valleyUsedElectricity).setScale(2, RoundingMode.DOWN);
// BigDecimal electricityAmount = electricityPrice.multiply(valleyUsedElectricity).setScale(2, RoundingMode.DOWN);
BigDecimal electricityAmount = electricityPrice.multiply(valleyUsedElectricity);
// 该时段服务费单价
BigDecimal servicePrice = orderDetail.getValleyServicePrice();
// 计算该时段服务费 = 服务费单价 x 用电量
BigDecimal serviceAmount = servicePrice.multiply(valleyUsedElectricity).setScale(2, RoundingMode.DOWN);
// BigDecimal serviceAmount = servicePrice.multiply(valleyUsedElectricity).setScale(2, RoundingMode.DOWN);
BigDecimal serviceAmount = servicePrice.multiply(valleyUsedElectricity);
// 汇总
totalElectricityAmount = totalElectricityAmount.add(electricityAmount);
totalServiceAmount = totalServiceAmount.add(serviceAmount);
@@ -588,8 +596,8 @@ public abstract class AbstractProgramLogic implements InitializingBean {
// 尖峰平谷用电量汇总
BigDecimal sumUsedElectricity = sharpUsedElectricity.add(peakUsedElectricity).add(flatUsedElectricity).add(valleyUsedElectricity);
// 平台计算的总消费金额 平台计算总电费金额 + 平台计算总服务费金额
BigDecimal computeTotalAmount = totalElectricityAmount.add(totalServiceAmount);
// 平台计算的总消费金额 平台计算总电费金额 + 平台计算总服务费金额, 保留2位小数
BigDecimal computeTotalAmount = totalElectricityAmount.add(totalServiceAmount).setScale(2, RoundingMode.DOWN);
/*
如果算出来的 电费金额 + 服务费金额 != 总消费金额并且尖峰平谷总用电量大于0, 则使用平台计算金额
@@ -623,6 +631,8 @@ public abstract class AbstractProgramLogic implements InitializingBean {
// 如果totalElectricityAmount + totalServiceAmount != dataOrderAmount则totalElectricityAmount = dataOrderAmount - totalServiceAmount
if (totalElectricityAmount.add(totalServiceAmount).compareTo(dataOrderAmount) != 0) {
logger.info("updateOrderBasicInfoAndOrderDetail结算订单:【{}】, 电费金额({}) + 服务费金额({}) != 订单金额({}), 电费金额设置为订单金额- 服务费金额", orderCode, totalElectricityAmount, totalServiceAmount, dataOrderAmount);
// 订单总服务费金额保留2位小数
totalServiceAmount = totalServiceAmount.setScale(2, RoundingMode.DOWN);
totalElectricityAmount = dataOrderAmount.subtract(totalServiceAmount);
}

View File

@@ -1,6 +1,7 @@
package com.jsowell.pile.vo.uniapp.customer;
import com.jsowell.common.annotation.Excel;
import com.jsowell.common.enums.MemberWalletEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -30,9 +31,14 @@ public class MemberWalletLogVO {
/**
* 子类型 10-充值, 11-赠送, 12-订单结算退款20-后管扣款, 21-订单付款, 22-用户退款
*/
@Excel(name = "操作类型(10-充值, 11-赠送, 12-订单结算退款20-后管扣款, 21-订单付款, 22-用户退款)")
private String subType;
/**
* 子类型名称
*/
@Excel(name = "操作类型")
private String subTypeName;
/**
* 出账/入账金额
*/
@@ -52,6 +58,7 @@ public class MemberWalletLogVO {
/**
* 关联订单
*/
@Excel(name = "关联订单号")
private String relatedOrderCode;
/**
@@ -75,15 +82,21 @@ public class MemberWalletLogVO {
/**
* 变动前金额
*/
@Excel(name = "变动前金额")
private BigDecimal beforeAmount;
/**
* 变动后金额
*/
@Excel(name = "变动后金额")
private BigDecimal afterAmount;
/**
* 操作人员
*/
private String createBy;
public String getSubTypeName() {
return MemberWalletEnum.getLabelByValue(this.subType);
}
}

View File

@@ -248,6 +248,11 @@ public class OrderListVO {
@Excel(name = "结算金额")
private String settleAmount;
/**
* 实收金额
*/
private BigDecimal actualReceivedAmount;
/**
* 交易服务费/通道手续费
*/