diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java index 84cc65300..c7deb2030 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java @@ -4,22 +4,14 @@ 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 +725,26 @@ public class TempController extends BaseController { return response; } + /** + * 查询订单折扣接口 + * http://localhost:8080/order/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; + } + /** * 重试订单退款接口/重试退款按钮 (批量) diff --git a/jsowell-admin/src/main/java/com/jsowell/service/TempService.java b/jsowell-admin/src/main/java/com/jsowell/service/TempService.java index 459ce9651..28090ef5c 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/TempService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/TempService.java @@ -29,9 +29,7 @@ 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.vo.web.*; import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,6 +38,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; import java.util.Map; import java.util.Set; @@ -67,6 +66,9 @@ public class TempService { @Autowired private AdapayCallbackRecordService adapayCallbackRecordService; + @Autowired + protected MemberGroupService memberGroupService; + @Autowired private WxpayRefundCallbackService wxpayRefundCallbackService; @@ -724,5 +726,146 @@ public class TempService { // 关闭未支付订单 orderBasicInfoService.closeUnpaidOrders(unpaidOrderList); } + + public void calculateOrderDiscountsV2(OrderBasicInfo orderBasicInfo, OrderDetail orderDetail) { + String memberId = orderBasicInfo.getMemberId(); // 会员id + String stationId = orderBasicInfo.getStationId(); // 站点id + String merchantId = orderBasicInfo.getMerchantId(); // 运营商id + + if (orderDetail == null) { + logger.info("计算订单折扣V2, OrderDetail为空(orderCode:{}, transactionCode:{}), 直接返回!", + orderBasicInfo.getOrderCode(), orderBasicInfo.getTransactionCode()); + return; + } + + // 原始电费金额 + BigDecimal originalTotalElectricityAmount = orderDetail.getTotalElectricityAmount(); + // 原始服务费金额 + BigDecimal originalTotalServiceAmount = orderDetail.getTotalServiceAmount(); + // 电费折扣金额 初始值为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); + } + + // 峰时段用电量 + 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); + } + + // 平时段用电量 + 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); + } + + // 谷时段用电量 + 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); + } + + // 计算优惠了多少钱 + // 电费折扣金额 = 优惠前电费 - 优惠后电费 + 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:{}, 订单折扣金额:{}, 电费折扣金额:{}, 服务费折扣金额:{}, 优惠后总消费金额:{}", + orderBasicInfo.getOrderCode(), memberId, discountAmount, electricityAmountDiscount, serviceAmountDiscount, totalConsumeAmount); + } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java index 0f45f4876..88ed10cbe 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java @@ -550,4 +550,11 @@ public interface OrderBasicInfoService{ * @return */ List queryUserFrequentedStation(String memberId); + + /** + * 通过订单编号列表查询订单信息 + * @param orderCodeList + * @return + */ + List queryAfterSettleOrderDTOList(List orderCodeList); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index f511ec2c3..ea94bcac4 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -7,8 +7,8 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.huifu.adapay.core.exception.BaseAdaPayException; import com.jsowell.adapay.common.DivMember; -import com.jsowell.adapay.dto.PaymentConfirmParam; import com.jsowell.adapay.common.PaymentConfirmInfo; +import com.jsowell.adapay.dto.PaymentConfirmParam; import com.jsowell.adapay.dto.QueryConfirmReverseDTO; import com.jsowell.adapay.dto.QueryPaymentConfirmDTO; import com.jsowell.adapay.dto.SplitData; @@ -17,7 +17,6 @@ import com.jsowell.adapay.response.*; import com.jsowell.adapay.service.AdapayService; import com.jsowell.adapay.vo.OrderSplitResult; import com.jsowell.adapay.vo.PaymentInfo; -import com.jsowell.common.YouDianUtils; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; import com.jsowell.common.core.domain.vo.AuthorizedDeptVO; @@ -30,7 +29,6 @@ import com.jsowell.common.enums.MemberWalletEnum; import com.jsowell.common.enums.adapay.AdapayPayChannelEnum; import com.jsowell.common.enums.adapay.AdapayStatusEnum; import com.jsowell.common.enums.adapay.MerchantDelayModeEnum; -import com.jsowell.common.enums.ebike.EBikeStopReasonEnum; import com.jsowell.common.enums.thirdparty.ThirdPartyOperatorIdEnum; import com.jsowell.common.enums.thirdparty.ThirdPlatformTypeEnum; import com.jsowell.common.enums.ykc.*; @@ -41,7 +39,6 @@ import com.jsowell.common.util.id.IdUtils; import com.jsowell.common.util.id.SnowflakeIdWorker; import com.jsowell.common.util.spring.SpringUtils; import com.jsowell.pile.domain.*; -import com.jsowell.pile.domain.ebike.deviceupload.EBikeMessageCmd03; import com.jsowell.pile.dto.*; import com.jsowell.pile.dto.nanrui.NRQueryOrderDTO; import com.jsowell.pile.dto.ningxiajiaotou.NXJTQueryOrdersInfoDTO; @@ -4968,5 +4965,10 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { return orderBasicInfoMapper.queryUserFrequentedStation(memberId, startTime, endTime); } + @Override + public List queryAfterSettleOrderDTOList(List orderCodeList) { + return null; + } + }