Merge branch 'dev' into dev-zza

This commit is contained in:
Lemon
2025-03-27 08:40:10 +08:00
12 changed files with 785 additions and 149 deletions

View File

@@ -4,22 +4,15 @@ import com.alibaba.fastjson2.JSON;
import com.google.common.collect.ImmutableMap;
import com.jsowell.adapay.dto.BalancePaymentRequestDTO;
import com.jsowell.adapay.service.AdapayService;
import com.jsowell.common.YouDianUtils;
import com.jsowell.common.annotation.Anonymous;
import com.jsowell.common.core.controller.BaseController;
import com.jsowell.common.core.domain.AjaxResult;
import com.jsowell.common.core.domain.ykc.TransactionRecordsData;
import com.jsowell.common.enums.ebike.EBikeStopReasonEnum;
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.response.RestApiResponse;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.SecurityUtils;
import com.jsowell.pile.domain.AdapayMemberAccount;
import com.jsowell.pile.domain.MemberPlateNumberRelation;
import com.jsowell.pile.domain.OrderBasicInfo;
import com.jsowell.pile.domain.PileMerchantInfo;
import com.jsowell.pile.domain.ebike.deviceupload.EBikeMessageCmd03;
import com.jsowell.pile.domain.*;
import com.jsowell.pile.domain.ykcCommond.EBikeStartChargingCommand;
import com.jsowell.pile.domain.ykcCommond.ReservationChargingCommand;
import com.jsowell.pile.domain.ykcCommond.StopChargingCommand;
@@ -733,6 +726,64 @@ public class TempController extends BaseController {
return response;
}
/**
* 查询订单折扣接口
* http://localhost:8080/temp/queryOrderDiscount
*/
@PostMapping("/queryOrderDiscount")
public RestApiResponse<?> queryOrderDiscount(@RequestBody QueryOrderDTO dto) {
RestApiResponse<?> response;
try {
OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(dto.getOrderCode());
OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(orderBasicInfo.getOrderCode());
// 计算订单折扣
tempService.calculateOrderDiscountsV2(orderBasicInfo, orderDetail);
response = new RestApiResponse<>();
} catch (Exception e) {
logger.error("查询订单折扣接口 error,", e);
response = new RestApiResponse<>();
}
return response;
}
/**
* 调试结算订单逻辑
* http://localhost:8080/temp/testSettleOrderLogic
*/
@PostMapping("/testSettleOrderLogic")
public RestApiResponse<?> testSettleOrderLogic(@RequestBody TransactionRecordsData data) {
RestApiResponse<?> response;
try {
String transactionCode = data.getTransactionCode();
OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByTransactionCode(transactionCode);
// 调试结算订单逻辑
tempService.testSettleOrderLogic(data, orderBasicInfo);
response = new RestApiResponse<>();
} catch (Exception e) {
logger.error("调试结算订单逻辑error,", e);
response = new RestApiResponse<>();
}
return response;
}
/**
* 调试结算订单逻辑
* http://localhost:8080/temp/testSettleOrderLogic
*/
@PostMapping("/testSettleOrderLogicV2")
public RestApiResponse<?> testSettleOrderLogicV2(@RequestBody QueryOrderDTO dto) {
RestApiResponse<?> response;
try {
// 调试结算订单逻辑
tempService.testSettleOrderLogicV2(dto.getOrderCode());
response = new RestApiResponse<>();
} catch (Exception e) {
logger.error("调试结算订单逻辑V2error,", e);
response = new RestApiResponse<>();
}
return response;
}
/**
* 重试订单退款接口/重试退款按钮 (批量)

View File

@@ -16,6 +16,8 @@ import com.jsowell.adapay.service.AdapayService;
import com.jsowell.adapay.vo.OrderSplitResult;
import com.jsowell.adapay.vo.PaymentInfo;
import com.jsowell.common.annotation.CostTime;
import com.jsowell.common.constant.RabbitConstants;
import com.jsowell.common.core.domain.ykc.TransactionRecordsData;
import com.jsowell.common.core.redis.RedisCache;
import com.jsowell.common.enums.adapay.AdapayStatusEnum;
import com.jsowell.common.enums.ykc.*;
@@ -23,23 +25,28 @@ import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.StringUtils;
import com.jsowell.pile.domain.*;
import com.jsowell.pile.dto.AfterSettleOrderDTO;
import com.jsowell.pile.dto.ApplyRefundDTO;
import com.jsowell.pile.dto.QueryOrderDTO;
import com.jsowell.pile.dto.SettleOrderReportDTO;
import com.jsowell.pile.mapper.OrderBasicInfoMapper;
import com.jsowell.pile.mapper.PileMsgRecordMapper;
import com.jsowell.pile.service.*;
import com.jsowell.pile.vo.web.ClearingBillVO;
import com.jsowell.pile.vo.web.OrderListVO;
import com.jsowell.pile.vo.web.OrderPaymentDetailVO;
import com.jsowell.pile.service.programlogic.AbstractProgramLogic;
import com.jsowell.pile.service.programlogic.ProgramLogicFactory;
import com.jsowell.pile.transaction.dto.OrderTransactionDTO;
import com.jsowell.pile.transaction.service.TransactionService;
import com.jsowell.pile.vo.web.*;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -67,6 +74,15 @@ public class TempService {
@Autowired
private AdapayCallbackRecordService adapayCallbackRecordService;
@Autowired
protected TransactionService transactionService;
@Autowired
protected RabbitTemplate rabbitTemplate;
@Autowired
protected MemberGroupService memberGroupService;
@Autowired
private WxpayRefundCallbackService wxpayRefundCallbackService;
@@ -86,7 +102,7 @@ public class TempService {
private MemberAdapayRecordService memberAdapayRecordService;
@Autowired
private PileMsgRecordMapper pileMsgRecordMapper;
private PileMsgRecordService pileMsgRecordService;
@Autowired
private OrderDetailService orderDetailService;
@@ -110,7 +126,7 @@ public class TempService {
// 根据充电桩编号,查询报文
for (OrderListVO orderVO : orderListVOS) {
String pileSn = orderVO.getPileSn();
List<PileMsgRecord> pileFeedList = pileMsgRecordMapper.getPileFeedList(pileSn);
// List<PileMsgRecord> pileFeedList = pileMsgRecordMapper.getPileFeedList(pileSn);
}
//
@@ -724,5 +740,225 @@ public class TempService {
// 关闭未支付订单
orderBasicInfoService.closeUnpaidOrders(unpaidOrderList);
}
public void calculateOrderDiscountsV2(OrderBasicInfo orderBasicInfo, OrderDetail orderDetail) {
String orderCode = orderBasicInfo.getOrderCode();
String transactionCode = orderBasicInfo.getTransactionCode();
String memberId = orderBasicInfo.getMemberId(); // 会员id
String stationId = orderBasicInfo.getStationId(); // 站点id
String merchantId = orderBasicInfo.getMerchantId(); // 运营商id
if (orderDetail == null) {
logger.info("计算订单折扣V2, OrderDetail为空(orderCode:{}, transactionCode:{}), 直接返回!", orderCode, transactionCode);
return;
}
// 原始电费金额
BigDecimal originalTotalElectricityAmount = orderDetail.getTotalElectricityAmount();
// 原始服务费金额
BigDecimal originalTotalServiceAmount = orderDetail.getTotalServiceAmount();
logger.info("计算订单折扣V2, orderCode:{}, 原始电费金额:{}, 原始服务费金额:{}", orderCode, originalTotalElectricityAmount, originalTotalServiceAmount);
// 电费折扣金额 初始值为0
BigDecimal electricityAmountDiscount = BigDecimal.ZERO;
// 服务费折扣金额 初始值为0
BigDecimal serviceAmountDiscount = BigDecimal.ZERO;
// 优惠后电费金额 初始值为优惠前金额
BigDecimal afterDiscountElectricityAmount = BigDecimal.ZERO;
// 优惠后服务费金额 初始值为优惠前金额
BigDecimal afterDiscountServiceAmount = BigDecimal.ZERO;
// 查询会员在该站点享受的优惠
MemberDiscountVO memberDiscountVO = memberGroupService.queryMemberDiscountV2(merchantId, stationId, memberId);
if (memberDiscountVO == null) {
// 如果没有优惠,则优惠后金额 等于优惠前金额
afterDiscountServiceAmount = orderDetail.getTotalServiceAmount();
afterDiscountElectricityAmount = orderDetail.getTotalElectricityAmount();
} else {
// 集团会员的订单,记录集团编号
orderBasicInfo.setGroupCode(memberDiscountVO.getGroupCode());
// 集团会员的优惠计费模板
BillingTemplateVO billingTemplateVO = memberDiscountVO.getBillingTemplateVO();
// 尖时段用电量
BigDecimal sharpUsedElectricity = orderDetail.getSharpUsedElectricity();
if (sharpUsedElectricity != null) {
// 计算该时段电费 = 电费单价 x 用电量
BigDecimal sharpElectricityAmount = billingTemplateVO.getSharpElectricityPrice()
.multiply(sharpUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 计算该时段服务费
BigDecimal sharpServiceAmount = billingTemplateVO.getSharpServicePrice()
.multiply(sharpUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 汇总
afterDiscountElectricityAmount = afterDiscountElectricityAmount.add(sharpElectricityAmount);
afterDiscountServiceAmount = afterDiscountServiceAmount.add(sharpServiceAmount);
logger.info("计算订单折扣V2, orderCode:{}, 尖时段用电量:{}, 电费单价:{}, 电费金额:{}, 服务费单价:{}, 服务费金额:{}", orderCode, sharpUsedElectricity,
billingTemplateVO.getSharpElectricityPrice(), sharpElectricityAmount, billingTemplateVO.getSharpServicePrice(), sharpServiceAmount);
}
// 峰时段用电量
BigDecimal peakUsedElectricity = orderDetail.getPeakUsedElectricity();
if (peakUsedElectricity != null) {
// 计算该时段电费 = 电费单价 x 用电量
BigDecimal peakElectricityAmount = billingTemplateVO.getPeakElectricityPrice()
.multiply(peakUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 计算该时段服务费
BigDecimal peakServiceAmount = billingTemplateVO.getPeakServicePrice()
.multiply(peakUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 汇总
afterDiscountElectricityAmount = afterDiscountElectricityAmount.add(peakElectricityAmount);
afterDiscountServiceAmount = afterDiscountServiceAmount.add(peakServiceAmount);
logger.info("计算订单折扣V2, orderCode:{}, 峰时段用电量:{}, 电费单价:{}, 电费金额:{}, 服务费单价:{}, 服务费金额:{}", orderCode, peakUsedElectricity,
billingTemplateVO.getPeakElectricityPrice(), peakElectricityAmount, billingTemplateVO.getPeakServicePrice(), peakServiceAmount);
}
// 平时段用电量
BigDecimal flatUsedElectricity = orderDetail.getFlatUsedElectricity();
if (flatUsedElectricity != null) {
// 计算该时段电费 = 电费单价 x 用电量
BigDecimal flatElectricityAmount = billingTemplateVO.getFlatElectricityPrice()
.multiply(flatUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 计算该时段服务费
BigDecimal flatServiceAmount = billingTemplateVO.getFlatServicePrice()
.multiply(flatUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 汇总
afterDiscountElectricityAmount = afterDiscountElectricityAmount.add(flatElectricityAmount);
afterDiscountServiceAmount = afterDiscountServiceAmount.add(flatServiceAmount);
logger.info("计算订单折扣V2, orderCode:{}, 平时段用电量:{}, 电费单价:{}, 电费金额:{}, 服务费单价:{}, 服务费金额:{}", orderCode, flatUsedElectricity,
billingTemplateVO.getFlatElectricityPrice(), flatElectricityAmount, billingTemplateVO.getFlatServicePrice(), flatServiceAmount);
}
// 谷时段用电量
BigDecimal valleyUsedElectricity = orderDetail.getValleyUsedElectricity();
if (valleyUsedElectricity != null) {
// 计算该时段电费 = 电费单价 x 用电量
BigDecimal valleyElectricityAmount = billingTemplateVO.getValleyElectricityPrice()
.multiply(valleyUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 计算该时段服务费
BigDecimal valleyServiceAmount = billingTemplateVO.getValleyServicePrice()
.multiply(valleyUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 汇总
afterDiscountElectricityAmount = afterDiscountElectricityAmount.add(valleyElectricityAmount);
afterDiscountServiceAmount = afterDiscountServiceAmount.add(valleyServiceAmount);
logger.info("计算订单折扣V2, orderCode:{}, 谷时段用电量:{}, 电费单价:{}, 电费金额:{}, 服务费单价:{}, 服务费金额:{}", orderCode, valleyUsedElectricity,
billingTemplateVO.getValleyElectricityPrice(), valleyElectricityAmount, billingTemplateVO.getValleyServicePrice(), valleyServiceAmount);
}
// 计算优惠了多少钱
// 电费折扣金额 = 优惠前电费 - 优惠后电费
electricityAmountDiscount = originalTotalElectricityAmount.subtract(afterDiscountElectricityAmount);
// 服务费折扣金额 = 优惠前服务费 - 优惠后服务费
serviceAmountDiscount = originalTotalServiceAmount.subtract(afterDiscountServiceAmount);
}
/*
更新 数据
*/
// 订单折扣金额 = 电费折扣金额 + 服务费折扣金额
BigDecimal discountAmount = electricityAmountDiscount.add(serviceAmountDiscount);
orderBasicInfo.setDiscountAmount(discountAmount);
// 更新结算金额 结算金额 = 消费金额 - 虚拟金额 - 优惠金额
BigDecimal newSettleAmount = orderBasicInfo.getSettleAmount().subtract(discountAmount);
if (newSettleAmount.compareTo(BigDecimal.ZERO) < 0) {
// 如果结算金额为0减去优惠金额后为负数还设置为0
newSettleAmount = BigDecimal.ZERO;
}
orderBasicInfo.setSettleAmount(newSettleAmount);
// 优惠后总消费金额 = 折扣后电费 + 折扣后服务费
BigDecimal totalConsumeAmount = afterDiscountServiceAmount.add(afterDiscountElectricityAmount);
// 更新退款金额 = 支付金额 - 优惠后总消费金额
BigDecimal refundAmount = orderBasicInfo.getPayAmount().subtract(totalConsumeAmount).setScale(2, RoundingMode.DOWN);
orderBasicInfo.setRefundAmount(refundAmount);
// 电费折扣金额(电费便宜了多少钱)
orderDetail.setDiscountElectricityAmount(electricityAmountDiscount);
// 服务费折扣金额(服务费便宜了多少钱)
orderDetail.setDiscountServiceAmount(serviceAmountDiscount);
logger.info("计算订单折扣, orderCode:{}, memberId:{}, 订单折扣金额:{}, 电费折扣金额:{}, 服务费折扣金额:{}, 优惠后总消费金额:{}",
orderCode, memberId, discountAmount, electricityAmountDiscount, serviceAmountDiscount, totalConsumeAmount);
}
public void testSettleOrderLogicV2(String orderCode) {
// 查询订单主表
OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(orderCode);
LocalDateTime localDateTime = DateUtils.date2LocalDateTime(orderBasicInfo.getSettlementTime());
// 开始时间为localDateTime减30秒
LocalDateTime startTime = localDateTime.minusSeconds(30);
// 结束时间为localDateTime加30秒
LocalDateTime endTime = localDateTime.plusSeconds(30);
// logger.info("testSettleOrderLogicV2, orderCode:{}, settlementTime:{}, startTime:{}, endTime:{}", orderCode, orderBasicInfo.getSettlementTime(), startTime, endTime);
// logger.info("转换为Date类型, settlementTime:{}, startTime:{}, endTime:{}", orderBasicInfo.getSettlementTime(), DateUtils.localDateTime2Date(startTime), DateUtils.localDateTime2Date(endTime));
// 查询这笔订单的交易记录原始数据
List<PileMsgRecord> pileFeedListV2 = pileMsgRecordService.getPileFeedListV2(orderBasicInfo.getPileSn(), "0x3B", startTime, endTime);
// logger.info("testSettleOrderLogicV2, orderCode:{}, pileSn:{}, startTime:{}, endTime:{}, pileFeedListV2:{}",
// orderCode, orderBasicInfo.getPileSn(), startTime, endTime, JSON.toJSONString(pileFeedListV2));
TransactionRecordsData data = null;
for (PileMsgRecord pileMsgRecord : pileFeedListV2) {
TransactionRecordsData parse = JSONObject.parseObject(pileMsgRecord.getJsonMsg(), TransactionRecordsData.class);
if (StringUtils.equals(parse.getTransactionCode(), orderBasicInfo.getTransactionCode())) {
data = parse;
}
}
logger.info("testSettleOrderLogicV2, orderCode:{}, data:{}", orderCode, JSON.toJSONString(data));
if (data != null) {
testSettleOrderLogic(data, orderBasicInfo);
}
}
public void testSettleOrderLogic(TransactionRecordsData data, OrderBasicInfo orderBasicInfo) {
AbstractProgramLogic programLogic = ProgramLogicFactory.getProgramLogic("1");
// 查询订单详情
OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(orderBasicInfo.getOrderCode());
programLogic.updateOrderBasicInfoAndOrderDetail(data, orderBasicInfo, orderDetail);
// 计算订单折扣
programLogic.calculateOrderDiscountsV2(orderBasicInfo, orderDetail);
logger.info("testSettleOrderLogic, orderCode:{}, 支付金额:{}, 消费金额:{}, 折扣金额:{}, 退款金额:{}, 结算金额:{}",
orderBasicInfo.getOrderCode(), orderBasicInfo.getPayAmount(), orderBasicInfo.getOrderAmount(),
orderBasicInfo.getDiscountAmount(), orderBasicInfo.getRefundAmount(), orderBasicInfo.getSettleAmount());
// 更新数据库
OrderTransactionDTO dto = new OrderTransactionDTO();
dto.setOrderBasicInfo(orderBasicInfo);
dto.setOrderDetail(orderDetail);
transactionService.doUpdateOrder(dto);
// 组装after参数
AfterSettleOrderDTO afterSettleOrderDTO = AfterSettleOrderDTO.builder()
.orderCode(orderBasicInfo.getOrderCode())
.merchantId(orderBasicInfo.getMerchantId())
.stationId(orderBasicInfo.getStationId())
.orderPayAmount(orderBasicInfo.getPayAmount()) // 支付金额
.orderConsumeAmount(orderBasicInfo.getOrderAmount()) // 消费金额
.orderSettleAmount(orderBasicInfo.getSettleAmount()) // 结算金额
.orderElectricityAmount(orderDetail.getTotalElectricityAmount()) // 电费金额
.orderElectricityDiscountAmount(orderDetail.getDiscountElectricityAmount()) // 电费折扣金额
.orderServiceAmount(orderDetail.getTotalServiceAmount()) // 服务费金额
.orderServiceDiscountAmount(orderDetail.getDiscountServiceAmount()) // 服务费折扣金额
.orderRefundAmount(orderBasicInfo.getRefundAmount()) // 退款金额
.build();
logger.info("testSettleOrderLogic, afterSettleOrderDTO:{}", JSON.toJSONString(afterSettleOrderDTO));
rabbitTemplate.convertAndSend(RabbitConstants.YKC_EXCHANGE_NAME, RabbitConstants.QUEUE_CHARGE_ORDER_DATA, afterSettleOrderDTO);
}
}