From 12eb750cd2391be14cfbfae2af6d0fdf16e1ea0c Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 31 七月 2026 11:18:56 +0800
Subject: [PATCH] 修改管理后台报表统计 1、修改管理后台充电订单统计 2、修改记录分账数据前先软删除之前的数据,然后根据实际支付金额(扣除退款)生成最新的分账记录
---
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 12781 +++++++++++++++++++++++++++++-----------------------------
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java | 281
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml | 11
3 files changed, 6,558 insertions(+), 6,515 deletions(-)
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
index 2343a5a..cf2ff8b 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -28,7 +28,7 @@
/**
* <p>
- * Mapper 接口
+ * Mapper 接口
* </p>
*
* @author xiaochen
@@ -36,54 +36,66 @@
*/
@Mapper
public interface TChargingOrderMapper extends BaseMapper<TChargingOrder> {
-
-
- /**
- * 获取小程序充电记录列表数据
- * @param appUserId
- * @param type
- * @param pageCurr
- * @param pageSize
- * @return
- */
- List<TChargingOrder> getMyChargingOrderList(@Param("appUserId") Long appUserId, @Param("type") Integer type,
- @Param("pageCurr") Integer pageCurr, @Param("pageSize") Integer pageSize);
-
-
- /**
- * 获取待开票订单列表
- * @param month 筛选时间2024-01-01
- * @param pageCurr
- * @param pageSize
- * @return
- */
- List<TChargingOrder> getNoInvoicedOrder(@Param("appUserId") Long appUserId, @Param("month") String month,
- @Param("pageCurr") Integer pageCurr, @Param("pageSize") Integer pageSize);
- List<ChargingOrderVO> chargingOrder(@Param("pageInfo") PageInfo<ChargingOrderVO> pageInfo, @Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11);
- Map<String, Object> chargingOrderBaseSummary(@Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11);
- Map<String, Object> chargingOrderNolimit( @Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11);
- Map<String, Object> chargingOrderFundSummary(@Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11);
- List<Long> chargingOrderSummaryOrderIds(@Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11);
+
+ /**
+ * 获取小程序充电记录列表数据
+ *
+ * @param appUserId
+ * @param type
+ * @param pageCurr
+ * @param pageSize
+ * @return
+ */
+ List<TChargingOrder> getMyChargingOrderList(@Param("appUserId") Long appUserId, @Param("type") Integer type,
+ @Param("pageCurr") Integer pageCurr, @Param("pageSize") Integer pageSize);
+
+
+ /**
+ * 获取待开票订单列表
+ *
+ * @param month 筛选时间2024-01-01
+ * @param pageCurr
+ * @param pageSize
+ * @return
+ */
+ List<TChargingOrder> getNoInvoicedOrder(@Param("appUserId") Long appUserId, @Param("month") String month,
+ @Param("pageCurr") Integer pageCurr, @Param("pageSize") Integer pageSize);
+
+ List<ChargingOrderVO> chargingOrder(@Param("pageInfo") PageInfo<ChargingOrderVO> pageInfo, @Param("req") ChargingOrderQuery dto, @Param("startTime1") String startTime1, @Param("startTime2") String startTime2, @Param("endTime1") String endTime1, @Param("endTime2") String endTime11);
+
+ Map<String, Object> chargingOrderBaseSummary(@Param("req") ChargingOrderQuery dto, @Param("startTime1") String startTime1, @Param("startTime2") String startTime2, @Param("endTime1") String endTime1, @Param("endTime2") String endTime11);
+
+ Map<String, Object> chargingOrderNolimit(@Param("req") ChargingOrderQuery dto, @Param("startTime1") String startTime1, @Param("startTime2") String startTime2, @Param("endTime1") String endTime1, @Param("endTime2") String endTime11);
+
+ Map<String, Object> chargingOrderFundSummary(@Param("req") ChargingOrderQuery dto, @Param("startTime1") String startTime1, @Param("startTime2") String startTime2, @Param("endTime1") String endTime1, @Param("endTime2") String endTime11);
+
+ List<Long> chargingOrderSummaryOrderIds(@Param("req") ChargingOrderQuery dto, @Param("startTime1") String startTime1, @Param("startTime2") String startTime2, @Param("endTime1") String endTime1, @Param("endTime2") String endTime11);
+
Map<String, Object> exchangeCodeBalanceSummary(@Param("orderIds") List<Long> orderIds);
+
List<Map<String, Object>> exchangeCodeBalanceIncomeByOrderIds(@Param("orderIds") List<Long> orderIds);
+
List<ChargingOrderBalanceIncomeDetailVO> exchangeCodeBalanceIncomeDetail(@Param("orderIds") List<Long> orderIds);
+
List<Map<String, Object>> chargingOrderShareIncomeByOrderIds(@Param("orderIds") List<Long> orderIds);
+
Map<String, Object> chargingOrderShareIncomeSummaryByOrderIds(@Param("orderIds") List<Long> orderIds);
- List<PayOrderDto> payOrderQuery(@Param("pageInfo")PageInfo<PayOrderDto> pageInfo,@Param("data") PayOrderQueryDto payOrderQueryDto);
+ List<PayOrderDto> payOrderQuery(@Param("pageInfo") PageInfo<PayOrderDto> pageInfo, @Param("data") PayOrderQueryDto payOrderQueryDto);
+
List<EnterpriseChargingAnalysisVO> enterpriseChargingAnalysis(@Param("pageInfo") PageInfo<EnterpriseChargingAnalysisVO> pageInfo,
@Param("data") EnterpriseChargingAnalysisQuery query);
List<Map<String, Object>> enterpriseTopSites(@Param("data") EnterpriseChargingAnalysisQuery query);
List<Map<String, Object>> enterpriseTopSitesByCompanies(@Param("data") EnterpriseChargingAnalysisQuery query,
- @Param("companyNames") List<String> companyNames);
+ @Param("companyNames") List<String> companyNames);
List<LocalDateTime> enterpriseChargingTimes(@Param("data") EnterpriseChargingAnalysisQuery query);
List<Map<String, Object>> enterpriseChargingTimesByCompanies(@Param("data") EnterpriseChargingAnalysisQuery query,
- @Param("companyNames") List<String> companyNames);
+ @Param("companyNames") List<String> companyNames);
List<Long> enterpriseInvoiceIds(@Param("data") EnterpriseChargingAnalysisQuery query);
@@ -99,12 +111,12 @@
List<Map<String, Object>> enterpriseChargingPeriodCounts(@Param("orderIds") List<Long> orderIds);
- List<TChargingOrderRefund> getRefundList(@Param("pageInfo")PageInfo<TChargingOrderRefund> pageInfo,@Param("data") ChargingRefundDto chargingRefundDto);
+ List<TChargingOrderRefund> getRefundList(@Param("pageInfo") PageInfo<TChargingOrderRefund> pageInfo, @Param("data") ChargingRefundDto chargingRefundDto);
- List<TChargingOrderRefund> getRefundListWithoutOrderJoin(@Param("pageInfo") PageInfo<TChargingOrderRefund> pageInfo,
- @Param("data") ChargingRefundDto chargingRefundDto);
+ List<TChargingOrderRefund> getRefundListWithoutOrderJoin(@Param("pageInfo") PageInfo<TChargingOrderRefund> pageInfo,
+ @Param("data") ChargingRefundDto chargingRefundDto);
- List<ChargingOrderGroup> chargingOrderGroup(@Param("chargingPercentProvinceDto")ChargingPercentProvinceDto chargingPercentProvinceDto);
+ List<ChargingOrderGroup> chargingOrderGroup(@Param("chargingPercentProvinceDto") ChargingPercentProvinceDto chargingPercentProvinceDto);
List<SixChargingDto> chargePartner(@Param("sixBefore") String sixBefore, @Param("siteIds") List<Integer> siteIds);
@@ -112,80 +124,84 @@
List<SixChargingDto> chargeCurrentMonth(@Param("siteIdsCsv") String siteIdsCsv);
- List<SixCircleDto> circle(@Param("siteIds")List<Integer> siteIds,@Param("sixBefore")LocalDate sixBefore, @Param("partnerView") Boolean partnerView);
+ List<SixCircleDto> circle(@Param("siteIds") List<Integer> siteIds, @Param("sixBefore") LocalDate sixBefore, @Param("partnerView") Boolean partnerView);
- BigDecimal sumSuccessfulShareAmount(@Param("siteIds") List<Integer> siteIds);
+ BigDecimal sumSuccessfulShareAmount(@Param("siteIds") List<Integer> siteIds);
- Map<String, Object> countAll(@Param("siteIds")List<Integer> siteIds, @Param("partnerView") Boolean partnerView);
- List<Map<String, Object>> chargingOrderShareIncomeByPayChannel(@Param("sixBefore")LocalDate sixBefore,@Param("siteIds") List<Integer> siteIds);
+ Map<String, Object> countAll(@Param("siteIds") List<Integer> siteIds, @Param("partnerView") Boolean partnerView);
- List<Map<String, Object>> getSumByType(@Param("start")LocalDateTime start,@Param("end")LocalDateTime end,@Param("siteIds")List<Integer> siteIds);
+ List<Map<String, Object>> chargingOrderShareIncomeByPayChannel(@Param("sixBefore") LocalDate sixBefore, @Param("siteIds") List<Integer> siteIds);
- List<Map<String, Object>> getDateData(@Param("start")LocalDateTime start,@Param("end")LocalDateTime end,@Param("siteIds")List<Integer> siteIds);
+ List<Map<String, Object>> getSumByType(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @Param("siteIds") List<Integer> siteIds);
- List<Map<String, Object>> getWeekData(@Param("start")LocalDateTime start,@Param("end")LocalDateTime end,@Param("siteIds")List<Integer> siteIds);
+ List<Map<String, Object>> getDateData(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @Param("siteIds") List<Integer> siteIds);
- List<Map<String, Object>> getMonthData(@Param("start")LocalDateTime start,@Param("end")LocalDateTime end,@Param("siteIds")List<Integer> siteIds);
+ List<Map<String, Object>> getWeekData(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @Param("siteIds") List<Integer> siteIds);
- List<Map<String, Object>> getYearData(@Param("start")LocalDateTime start,@Param("end")LocalDateTime end,@Param("siteIds")List<Integer> siteIds);
+ List<Map<String, Object>> getMonthData(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @Param("siteIds") List<Integer> siteIds);
- List<ChargingOrderListVO> chargingList(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
+ List<Map<String, Object>> getYearData(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @Param("siteIds") List<Integer> siteIds);
- List<Map<String, Object>> chargingList1(@Param("pageInfo")PageInfo<ChargingOrderListVO> pageInfo, @Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
- List<Map<String, Object>> chargingListAccountingSummary(@Param("orderIds") List<Long> orderIds);
+ List<ChargingOrderListVO> chargingList(@Param("req") ChargingListQuery dto, @Param("startTime1") String startTime1, @Param("startTime2") String startTime2, @Param("endTime1") String endTime1, @Param("endTime2") String endTime2);
+
+ List<Map<String, Object>> chargingList1(@Param("pageInfo") PageInfo<ChargingOrderListVO> pageInfo, @Param("req") ChargingListQuery dto, @Param("startTime1") String startTime1, @Param("startTime2") String startTime2, @Param("endTime1") String endTime1, @Param("endTime2") String endTime2);
+
+ List<Map<String, Object>> chargingListAccountingSummary(@Param("orderIds") List<Long> orderIds);
+ Map<String, Object> chargingListSum(@Param("req") ChargingListQuery dto, @Param("startTime1") String startTime1, @Param("startTime2") String startTime2, @Param("endTime1") String endTime1, @Param("endTime2") String endTime2);
- Map<String, Object> chargingListSum(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
- List<Long> chargingListSummaryOrderIds(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
+ List<Long> chargingListSummaryOrderIds(@Param("req") ChargingListQuery dto, @Param("startTime1") String startTime1, @Param("startTime2") String startTime2, @Param("endTime1") String endTime1, @Param("endTime2") String endTime2);
- List<ChargingOrderListVO> chargingListNoPage( @Param("req")ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
+ List<ChargingOrderListVO> chargingListNoPage(@Param("req") ChargingListQuery dto, @Param("startTime1") String startTime1, @Param("startTime2") String startTime2, @Param("endTime1") String endTime1, @Param("endTime2") String endTime2);
- List<Map<String, Object>> getByDate(@Param("start")LocalDateTime start,@Param("end")LocalDateTime end,@Param("siteIds")List<Integer> siteIds);
+ List<Map<String, Object>> getByDate(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @Param("siteIds") List<Integer> siteIds);
- List<Map<String, Object>> queryPower(@Param("siteIds")List<Integer> siteIds);
+ List<Map<String, Object>> queryPower(@Param("siteIds") List<Integer> siteIds);
- Map<String, Object> queryPowerLevel(@Param("siteIds") List<Integer> siteIds,@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
+ Map<String, Object> queryPowerLevel(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
- List<Map<String, Object>> usersDay(@Param("statisticsQueryDto")ChargingStatisticsQueryDto statisticsQueryDto);
+ List<Map<String, Object>> usersDay(@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
+
List<Map<String, Object>> usersDay1();
- List<Map<String, Object>> usersByQuery(@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
- List<Map<String, Object>> usersByQuery1(@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
+ List<Map<String, Object>> usersByQuery(@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
+
+ List<Map<String, Object>> usersByQuery1(@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
List<Map<String, Object>> getUserTagCount();
- List<Map<String, Object>> getVipCount();
+ List<Map<String, Object>> getVipCount();
List<Map<String, Object>> unitConsumption(@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
List<Map<String, Object>> carUserMethod();
- List<Map<String, Object>> carUserBrand();
+ List<Map<String, Object>> carUserBrand();
- Map<String, Object> countLocalCar();
+ Map<String, Object> countLocalCar();
- Double getAver(@Param("siteIds") List<Integer> siteIds);
+ Double getAver(@Param("siteIds") List<Integer> siteIds);
- List<Map<String, Object>> getLevelEvaluate(@Param("siteIds")List<Integer> siteIds);
+ List<Map<String, Object>> getLevelEvaluate(@Param("siteIds") List<Integer> siteIds);
- List<Map<String, Object>> countBySource(@Param("siteIds")List<Integer> siteIds,@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
+ List<Map<String, Object>> countBySource(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
- List<Map<String, Object>> equipmentUserType1(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
+ List<Map<String, Object>> equipmentUserType1(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
- List<Map<String, Object>> equipmentUserType2(@Param("siteIds")List<Integer> siteIds,@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
+ List<Map<String, Object>> equipmentUserType2(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
- List<Map<String, Object>> equipmentMapbroke1(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto")ChargingStatisticsQueryDto statisticsQueryDto);
+ List<Map<String, Object>> equipmentMapbroke1(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
- List<Map<String, Object>> equipmentMapbroke2(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto")ChargingStatisticsQueryDto statisticsQueryDto);
+ List<Map<String, Object>> equipmentMapbroke2(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
- List<Map<String, Object>> equipmentMapOut1(@Param("siteIds")List<Integer> siteIds, @Param("statisticsQueryDto")ChargingStatisticsQueryDto statisticsQueryDto);
+ List<Map<String, Object>> equipmentMapOut1(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
- List<Map<String, Object>> equipmentMapOut2(@Param("siteIds")List<Integer> siteIds,@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
+ List<Map<String, Object>> equipmentMapOut2(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
- List<Map<String, Object>> needElec(@Param("siteIds")List<Integer> siteIds, @Param("statisticsQueryDto")ChargingStatisticsQueryDto statisticsQueryDto);
+ List<Map<String, Object>> needElec(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
Map<String, Object> getChargingOrderCount(@Param("siteIds") List<Integer> siteIds, @Param("time") String time);
@@ -204,82 +220,89 @@
@Param("endTime") String endTime);
- List<Map<String, Object>> getHourType(@Param("siteIds")List<Integer> siteIds, @Param("statisticsQueryDto")ChargingDetailQueryDto statisticsQueryDto);
+ List<Map<String, Object>> getHourType(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingDetailQueryDto statisticsQueryDto);
- List<Map<String, Object>> getDateType(@Param("siteIds")List<Integer> siteIds,@Param("statisticsQueryDto") ChargingDetailQueryDto statisticsQueryDto);
+ List<Map<String, Object>> getDateType(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingDetailQueryDto statisticsQueryDto);
- List<Map<String, Object>> getMonthType(@Param("siteIds")List<Integer> siteIds, @Param("statisticsQueryDto")ChargingDetailQueryDto statisticsQueryDto);
+ List<Map<String, Object>> getMonthType(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingDetailQueryDto statisticsQueryDto);
- List<Map<String, Object>> getchargingCapacity(@Param("siteIds")List<Integer> siteIds,@Param("statisticsQueryDto") ChargingDetailQueryDto statisticsQueryDto);
+ List<Map<String, Object>> getchargingCapacity(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingDetailQueryDto statisticsQueryDto);
- List<Map<String, Object>> countAllUserData();
+ List<Map<String, Object>> countAllUserData();
- List<Map<String, Object>> needElec1(@Param("siteIds")List<Integer> siteIds,@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
+ List<Map<String, Object>> needElec1(@Param("siteIds") List<Integer> siteIds, @Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto);
- Long countNoTag();
+ Long countNoTag();
Long countCar(@Param("brands") List<String> brands);
- List<OrderCountByDate> countOrdersByDate(@Param("startTime")LocalDateTime startTime, @Param("endTime")LocalDateTime endTime,@Param("gunIds")List<Integer> gunIds);
+ List<OrderCountByDate> countOrdersByDate(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("gunIds") List<Integer> gunIds);
- Double getSumDegreeBySiteIds(@Param("siteIds") List<Integer> siteIds);
+ Double getSumDegreeBySiteIds(@Param("siteIds") List<Integer> siteIds);
- List<Long> getAppUserIdsBySiteIds(@Param("siteIds") List<Integer> siteIds);
-
-
- /**
- * 获取启动失败且时间超过1小时的订单
- * @return
- */
- List<TChargingOrder> findFailedStartupOrder();
-
-
- /**
- * 获取停止中的数据
- * @return
- */
- List<TChargingOrder> findStoppedOrder();
-
-
- /**
- * 获取充电中的订单
- * @return
- */
- List<TChargingOrder> findChargingOrder();
+ List<Long> getAppUserIdsBySiteIds(@Param("siteIds") List<Integer> siteIds);
- /**
- * 获取已结束的数据
- * @return
- */
- List<TChargingOrder> findEndChargingOrder();
+ /**
+ * 获取启动失败且时间超过1小时的订单
+ *
+ * @return
+ */
+ List<TChargingOrder> findFailedStartupOrder();
- /**
- * 获取需要手动修改订单状态的数据
- * @return
- */
- List<TChargingOrder> findUpStatusChargingOrder();
+ /**
+ * 获取停止中的数据
+ *
+ * @return
+ */
+ List<TChargingOrder> findStoppedOrder();
- /**
- * 查询充电算账单数据
- * @param startTime
- * @param endTime
- */
- List<Map<String, Object>> getChargingSettlementBill(@Param("startTime") String startTime, @Param("endTime") String endTime,
- @Param("dateType") Integer dateType);
-
- List<Map<String, Object>> queryChargingBillIncome(@Param("billingCycles") List<String> billingCycles,
- @Param("dateType") Integer dateType,
- @Param("siteIds") List<Integer> siteIds);
+ /**
+ * 获取充电中的订单
+ *
+ * @return
+ */
+ List<TChargingOrder> findChargingOrder();
- /**
- * 查询账户结算账单数据
- * @param startTime
- * @param endTime
- */
- List<Map<String, Object>> getAccountSettlementStatement(@Param("startTime") String startTime,
- @Param("endTime") String endTime);
+ /**
+ * 获取已结束的数据
+ *
+ * @return
+ */
+ List<TChargingOrder> findEndChargingOrder();
+
+
+ /**
+ * 获取需要手动修改订单状态的数据
+ *
+ * @return
+ */
+ List<TChargingOrder> findUpStatusChargingOrder();
+
+
+ /**
+ * 查询充电算账单数据
+ *
+ * @param startTime
+ * @param endTime
+ */
+ List<Map<String, Object>> getChargingSettlementBill(@Param("startTime") String startTime, @Param("endTime") String endTime,
+ @Param("dateType") Integer dateType);
+
+ List<Map<String, Object>> queryChargingBillIncome(@Param("billingCycles") List<String> billingCycles,
+ @Param("dateType") Integer dateType,
+ @Param("siteIds") List<Integer> siteIds);
+
+
+ /**
+ * 查询账户结算账单数据
+ *
+ * @param startTime
+ * @param endTime
+ */
+ List<Map<String, Object>> getAccountSettlementStatement(@Param("startTime") String startTime,
+ @Param("endTime") String endTime);
}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
index 454a40b..402834f 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -132,404 +132,404 @@
*/
@Service
public class TChargingOrderServiceImpl extends ServiceImpl<TChargingOrderMapper, TChargingOrder> implements TChargingOrderService {
-
- private Logger log = LoggerFactory.getLogger(TChargingOrderServiceImpl.class);
- private static final int WHITELIST_BENEFIT_ALL_FREE = 1;
- private static final int WHITELIST_BENEFIT_ELECTRIC_FREE = 2;
- private static final int WHITELIST_BENEFIT_SERVICE_FREE = 3;
- private static final String SHARE_AFTER_COMMIT_RESOURCE_PREFIX = "chargingOrderShareAfterCommit:";
- private static final String SPECIAL_REFUND_TITLE = "特殊退款处理";
- private static final int RESERVATION_RECOMMENDATION_HISTORY_DAYS = 30;
- private static final int ENTERPRISE_DETAIL_PERIOD_BATCH_SIZE = 500;
- private static final int ENTERPRISE_INVOICE_BATCH_SIZE = 500;
- private static final int ENTERPRISE_ORDER_ID_BATCH_SIZE = 500;
- private static final int CHARGING_PERIOD_ACCOUNTING_BATCH_SIZE = 500;
- @Override
- public ReservationRecommendationVO getReservationRecommendation(Integer siteId) {
- if (siteId == null) {
- throw new ServiceException("站点不能为空");
- }
- R<List<Site>> siteResult = siteClient.getSiteByIds(Collections.singletonList(siteId));
- List<Site> sites = siteResult == null ? null : siteResult.getData();
- if (sites == null || sites.isEmpty()) {
- throw new ServiceException("站点不存在");
- }
- Site site = sites.get(0);
- if (site.getAccountingStrategyId() == null) {
- throw new ServiceException("该站点尚未配置充电计费模板");
- }
- R<List<TAccountingStrategyDetail>> detailResult = accountingStrategyDetailClient
- .getListByAccountingStrategyId(site.getAccountingStrategyId());
- List<TAccountingStrategyDetail> details = detailResult == null ? null : detailResult.getData();
- if (details == null) {
- throw new ServiceException("计费模板服务暂不可用");
- }
+ private Logger log = LoggerFactory.getLogger(TChargingOrderServiceImpl.class);
+ private static final int WHITELIST_BENEFIT_ALL_FREE = 1;
+ private static final int WHITELIST_BENEFIT_ELECTRIC_FREE = 2;
+ private static final int WHITELIST_BENEFIT_SERVICE_FREE = 3;
+ private static final String SHARE_AFTER_COMMIT_RESOURCE_PREFIX = "chargingOrderShareAfterCommit:";
+ private static final String SPECIAL_REFUND_TITLE = "特殊退款处理";
+ private static final int RESERVATION_RECOMMENDATION_HISTORY_DAYS = 30;
+ private static final int ENTERPRISE_DETAIL_PERIOD_BATCH_SIZE = 500;
+ private static final int ENTERPRISE_INVOICE_BATCH_SIZE = 500;
+ private static final int ENTERPRISE_ORDER_ID_BATCH_SIZE = 500;
+ private static final int CHARGING_PERIOD_ACCOUNTING_BATCH_SIZE = 500;
- LocalDateTime historyEnd = LocalDate.now().atStartOfDay();
- LocalDateTime historyStart = historyEnd.minusDays(RESERVATION_RECOMMENDATION_HISTORY_DAYS);
- List<TChargingOrder> orders = list(Wrappers.<TChargingOrder>lambdaQuery()
- .select(TChargingOrder::getStartTime, TChargingOrder::getEndTime)
- .eq(TChargingOrder::getSiteId, siteId)
- .eq(TChargingOrder::getStatus, 5)
- .eq(TChargingOrder::getDelFlag, 0)
- .isNotNull(TChargingOrder::getStartTime)
- .isNotNull(TChargingOrder::getEndTime)
- .ge(TChargingOrder::getEndTime, historyStart)
- .lt(TChargingOrder::getStartTime, historyEnd));
- ReservationRecommendationCalculator.Recommendation recommendation =
- ReservationRecommendationCalculator.recommend(details, orders, historyStart, historyEnd);
- if (recommendation == null) {
- throw new ServiceException("该站点计费模板未配置谷时段");
- }
- return new ReservationRecommendationVO(recommendation.getStartTime(), recommendation.getEndTime(),
- recommendation.getUtilizationRate());
- }
+ @Override
+ public ReservationRecommendationVO getReservationRecommendation(Integer siteId) {
+ if (siteId == null) {
+ throw new ServiceException("站点不能为空");
+ }
+ R<List<Site>> siteResult = siteClient.getSiteByIds(Collections.singletonList(siteId));
+ List<Site> sites = siteResult == null ? null : siteResult.getData();
+ if (sites == null || sites.isEmpty()) {
+ throw new ServiceException("站点不存在");
+ }
+ Site site = sites.get(0);
+ if (site.getAccountingStrategyId() == null) {
+ throw new ServiceException("该站点尚未配置充电计费模板");
+ }
+ R<List<TAccountingStrategyDetail>> detailResult = accountingStrategyDetailClient
+ .getListByAccountingStrategyId(site.getAccountingStrategyId());
+ List<TAccountingStrategyDetail> details = detailResult == null ? null : detailResult.getData();
+ if (details == null) {
+ throw new ServiceException("计费模板服务暂不可用");
+ }
- @Resource
- private ChargingGunClient chargingGunClient;
- @Resource
- private TSettlementConfirmMapper tSettlementConfirmMapper;
- @Resource
- private PartnerClient partnerClient;
- @Resource
- private SiteClient siteClient;
-
- @Resource
- private AppUserCarClient appUserCarClient;
- @Resource
- private AppUserClient appUserClient;
-
- @Resource
- private ChargingPileClient chargingPileClient;
-
- @Resource
- private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
-
- @Resource
- private TokenService tokenService;
-
- @Resource
- private WxPaymentClient wxPaymentClient;
-
- @Resource
- private AliPaymentClient aliPaymentClient;
- @Resource
- private H5AliPaymentClient h5AliPaymentClient;
- @Resource
- private IcbcPaymentClient icbcPaymentClient;
- @Resource
- private TChargingOrderShareRecordMapper chargingOrderShareRecordMapper;
- @Value("${icbc.share.online-enabled:false}")
- private boolean icbcOnlineShareEnabled;
- @Resource
- private ChargingOrderSettlementExecutor chargingOrderSettlementExecutor;
- @Resource
- private PlatformTransactionManager transactionManager;
-
- @Resource
- private AppCouponClient appCouponClient;
- @Resource
- private AppUserWhitelistClient appUserWhitelistClient;
+ LocalDateTime historyEnd = LocalDate.now().atStartOfDay();
+ LocalDateTime historyStart = historyEnd.minusDays(RESERVATION_RECOMMENDATION_HISTORY_DAYS);
+ List<TChargingOrder> orders = list(Wrappers.<TChargingOrder>lambdaQuery()
+ .select(TChargingOrder::getStartTime, TChargingOrder::getEndTime)
+ .eq(TChargingOrder::getSiteId, siteId)
+ .eq(TChargingOrder::getStatus, 5)
+ .eq(TChargingOrder::getDelFlag, 0)
+ .isNotNull(TChargingOrder::getStartTime)
+ .isNotNull(TChargingOrder::getEndTime)
+ .ge(TChargingOrder::getEndTime, historyStart)
+ .lt(TChargingOrder::getStartTime, historyEnd));
+ ReservationRecommendationCalculator.Recommendation recommendation =
+ ReservationRecommendationCalculator.recommend(details, orders, historyStart, historyEnd);
+ if (recommendation == null) {
+ throw new ServiceException("该站点计费模板未配置谷时段");
+ }
+ return new ReservationRecommendationVO(recommendation.getStartTime(), recommendation.getEndTime(),
+ recommendation.getUtilizationRate());
+ }
- @Resource
- private AppUserVipDetailClient appUserVipDetailClient;
-
- @Resource
- private RedisService redisService;
-
- @Resource
- private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService;
-
- @Resource
- private TCECClient tcecClient;
-
- @Resource
- private SendMessageClient sendMessageClient;
- @Resource
- private WxSubscribeMessageService wxSubscribeMessageService;
-
- @Resource
- private TOrderEvaluateService orderEvaluateService;
-
- @Resource
- private AccountingStrategyDetailClient accountingStrategyDetailClient;
-
- @Resource
- private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient;
-
- @Resource
- private AccountingStrategyClient accountingStrategyClient;
-
- @Resource
- private PlatformStartChargingReplyService platformStartChargingReplyService;
-
- @Resource
- private TChargingOrderRefundService chargingOrderRefundService;
-
- @Resource
- private PlatformStopChargingReplyClient platformStopChargingReplyClient;
-
- @Resource
- private AccountingStrategyOrderService accountingStrategyOrderService;
-
- @Resource
- private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService;
-
- @Resource
- private InviteUserClient inviteUserClient;
-
- @Resource
- private AppUserIntegralChangeClient appUserIntegralChangeClient;
-
- @Resource
- private IntegralRuleClient integralRuleClient;
-
- @Resource
- private VipClient vipClient;
- @Resource
- private OtherClient otherClient;
+ @Resource
+ private ChargingGunClient chargingGunClient;
+ @Resource
+ private TSettlementConfirmMapper tSettlementConfirmMapper;
+ @Resource
+ private PartnerClient partnerClient;
+ @Resource
+ private SiteClient siteClient;
- @Resource
- private UserTagClient userTagClient;
-
- @Resource
- private AppUserTagClient appUserTagClient;
-
- @Resource
- private SecurityDetectionClient securityDetectionClient;
-
- //计数器
- private Map<String, Integer> counter_map = new HashMap<>();
-
- //计数器
- private Map<String, Integer> boot_failed_map = new HashMap<>();
-
- @Resource
- private OperatorClient operatorClient;
-
- @Resource
- private TransactionRecordService transactionRecordService;
-
- @Resource
- private ITChargingOrderSummaryDataService chargingOrderSummaryDataService;
- @Resource
- private TOrderAppealService orderAppealService;
-
- @Autowired
- private RedissonClient redissonClient;
-
- @Resource
- private ChargingMessageClient chargingMessageClient;
+ @Resource
+ private AppUserCarClient appUserCarClient;
+ @Resource
+ private AppUserClient appUserClient;
- @Resource
- private ChengDuJianGuanClient chengDuJianGuanClient;
-
-
- /**
- * 获取小程序充电记录列表数据
- *
- * @param query
- * @return
- */
- @Override
- public Map<String, Object> getMyChargingOrderList(GetMyChargingOrderList query) {
- Long appUserId = tokenService.getLoginUserApplet().getUserId();
- Map<String, Object> map = new HashMap<>();
- int size = this.baseMapper.getMyChargingOrderList(appUserId, 1, null, null).size();
- map.put("number", size);
- Integer pageCurr = query.getPageCurr() == null || query.getPageCurr() < 1 ? 1 : query.getPageCurr();
- Integer pageSize = query.getPageSize() == null || query.getPageSize() < 1 ? 10 : query.getPageSize();
- query.setPageCurr((pageCurr - 1) * pageSize);
- query.setPageSize(pageSize);
- List<TChargingOrder> list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), query.getPageCurr(), query.getPageSize());
- List<MyChargingOrderList> orderLists = new ArrayList<>();
- for (TChargingOrder tChargingOrder : list) {
- MyChargingOrderList myChargingOrderList = new MyChargingOrderList();
- myChargingOrderList.setId(tChargingOrder.getId().toString());
- myChargingOrderList.setSiteId(tChargingOrder.getSiteId());
- myChargingOrderList.setStatus(tChargingOrder.getStatus());
- Site site = getOrderSite(tChargingOrder.getSiteId());
- myChargingOrderList.setTitle(site == null ? "未知电站" : site.getName());
- myChargingOrderList.setChargingDegree(tChargingOrder.getChargingCapacity());
- String name = getChargingGunName(tChargingOrder.getChargingGunId());
- myChargingOrderList.setChargingGunId(tChargingOrder.getChargingGunId());
- myChargingOrderList.setName(name);
- myChargingOrderList.setEndMode(tChargingOrder.getEndMode());
- Integer status = tChargingOrder.getStatus();
- BigDecimal payMoney = status != null && status < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount();
- myChargingOrderList.setPayMoney(payMoney);
- if (tChargingOrder.getCreateTime() != null) {
- myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
- }
- long count = orderEvaluateService.count(new LambdaQueryWrapper<TOrderEvaluate>().eq(TOrderEvaluate::getOrderType, 1)
- .eq(TOrderEvaluate::getOrderId, tChargingOrder.getId()).eq(TOrderEvaluate::getDelFlag, 0));
- myChargingOrderList.setEvaluate(count + 1L);
- orderLists.add(myChargingOrderList);
- }
- list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), null, null);
- map.put("list", orderLists);
- map.put("totle", list.size());
- return map;
- }
+ @Resource
+ private ChargingPileClient chargingPileClient;
- private Site getOrderSite(Integer siteId) {
- if (siteId == null) {
- return null;
- }
- R<List<Site>> result = siteClient.getSiteByIds(Collections.singletonList(siteId));
- List<Site> sites = result == null ? Collections.emptyList() : result.getData();
- return sites == null || sites.isEmpty() ? null : sites.get(0);
- }
+ @Resource
+ private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
- private String getChargingGunName(Integer chargingGunId) {
- if (chargingGunId == null) {
- return "";
- }
- R<String> result = chargingGunClient.getAllName(chargingGunId);
- return result == null || result.getData() == null ? "" : result.getData();
- }
-
-
- /**
- * 获取充电订单明细
- *
- * @param id 订单id
- * @return
- */
- @Override
- public MyChargingOrderInfo getMyChargingOrderInfo(String id) {
- TChargingOrder chargingOrder = this.getById(id);
- MyChargingOrderInfo myChargingOrderInfo = new MyChargingOrderInfo();
- myChargingOrderInfo.setId(id);
- myChargingOrderInfo.setChargingGunId(chargingOrder.getChargingGunId());
- myChargingOrderInfo.setCode(chargingOrder.getCode());
- myChargingOrderInfo.setCreateTime(chargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
- myChargingOrderInfo.setStatus(chargingOrder.getStatus());
- Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0);
- myChargingOrderInfo.setTitle(site.getName());
- TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
- myChargingOrderInfo.setChargeMode(chargingGun.getChargeMode());
- String name = chargingGunClient.getAllName(chargingOrder.getChargingGunId()).getData();
- myChargingOrderInfo.setName(name);
- if (Objects.nonNull(chargingOrder.getAppUserCarId())) {
- TAppUserCar tAppUserCar = appUserCarClient.getCarById(chargingOrder.getAppUserCarId().toString()).getData();
- if (null != tAppUserCar) {
- myChargingOrderInfo.setLicensePlate(tAppUserCar.getLicensePlate());
- } else {
- myChargingOrderInfo.setLicensePlate("无");
- }
- } else {
- myChargingOrderInfo.setLicensePlate(chargingOrder.getPlateNum());
- }
- if (null != chargingOrder.getStartTime()) {
- myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
- }
- if (null != chargingOrder.getEndTime()) {
- myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
- }
- myChargingOrderInfo.setOrderAmount(chargingOrder.getOrderAmount());
- myChargingOrderInfo.setPaymentAmount(chargingOrder.getPaymentAmount());
- myChargingOrderInfo.setRechargeAmount(chargingOrder.getRechargeAmount());
- myChargingOrderInfo.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount());
- myChargingOrderInfo.setVipDiscountAmount(chargingOrder.getVipDiscountAmount());
- myChargingOrderInfo.setRefundAmount(chargingOrder.getRefundAmount());
- List<TChargingOrderAccountingStrategy> stageCost = chargingOrderAccountingStrategyService.list(
- new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, id)
- .orderByAsc(TChargingOrderAccountingStrategy::getStartTime)
- );
- myChargingOrderInfo.setStageCost(stageCost);
- List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
- if (null != dataList) {
- //在MongoDB中获取数据
- SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
- List<UploadRealTimeMonitoringData> dataLists = new ArrayList<>();
- String t = "";
- for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : dataList) {
- if (!sdf.format(uploadRealTimeMonitoringData.getCreate_time()).equals(t)) {
- dataLists.add(uploadRealTimeMonitoringData);
- t = sdf.format(uploadRealTimeMonitoringData.getCreate_time());
- }
- }
-
- List<String> time = dataLists.stream().map(s -> sdf.format(s.getCreate_time())).collect(Collectors.toList());
- List<BigDecimal> outputVoltage = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_voltage).collect(Collectors.toList());
- List<BigDecimal> outputCurrent = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_current).collect(Collectors.toList());
- List<Map<String, Object>> currentAndVoltage = new ArrayList<>();
- for (int i = 0; i < time.size(); i++) {
- Map<String, Object> map = new HashMap<>();
- map.put("time", time.get(i));
- //电流
- map.put("electricity", outputCurrent.get(i));
- //电压
- map.put("voltage", outputVoltage.get(i));
- currentAndVoltage.add(map);
- }
- myChargingOrderInfo.setCurrentAndVoltage(currentAndVoltage);
- //在MongoDB中获取数据
- List<Integer> soc = dataLists.stream().map(UploadRealTimeMonitoringData::getSoc).collect(Collectors.toList());
- List<BigDecimal> po = dataLists.stream().map(s -> s.getOutput_current().multiply(s.getOutput_voltage()).divide(new BigDecimal(1000), 2, RoundingMode.HALF_DOWN)).collect(Collectors.toList());
- List<Map<String, Object>> power = new ArrayList<>();
- for (int i = 0; i < time.size(); i++) {
- Map<String, Object> map = new HashMap<>();
- map.put("time", time.get(i));
- //soc
- map.put("soc", soc.get(i));
- //功率
- map.put("power", po.get(i));
- power.add(map);
- }
- myChargingOrderInfo.setPower(power);
- }
- myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime()==null || myChargingOrderInfo.getEndTime() + 604800000L < System.currentTimeMillis() ? 0 : 1);
- long count = orderAppealService.count(Wrappers.lambdaQuery(TOrderAppeal.class)
- .eq(TOrderAppeal::getOrderId, id));
- myChargingOrderInfo.setIsAppeal(count > 0 ? 0 : 1);
- return myChargingOrderInfo;
- }
-
-
- /**
- * 获取待开票订单列表
- *
- * @param query
- * @return
- */
- @Override
- public List<MyChargingOrderList> getNoInvoicedOrder(GetNoInvoicedOrder query) {
- Long appUserId = tokenService.getLoginUserApplet().getUserId();
-
- query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize());
- List<TChargingOrder> orderList = this.baseMapper.getNoInvoicedOrder(appUserId, query.getMonth(), query.getPageCurr(), query.getPageSize());
- List<MyChargingOrderList> list = new ArrayList<>();
- for (TChargingOrder tChargingOrder : orderList) {
- MyChargingOrderList myChargingOrderList = new MyChargingOrderList();
- myChargingOrderList.setId(tChargingOrder.getId().toString());
- myChargingOrderList.setSiteId(tChargingOrder.getSiteId());
- myChargingOrderList.setStatus(tChargingOrder.getStatus());
- Site site = siteClient.getSiteByIds(Arrays.asList(tChargingOrder.getSiteId())).getData().get(0);
- myChargingOrderList.setTitle(site.getName());
- myChargingOrderList.setChargingDegree(tChargingOrder.getChargingCapacity());
- String name = chargingGunClient.getAllName(tChargingOrder.getChargingGunId()).getData();
- myChargingOrderList.setName(name);
- myChargingOrderList.setEndMode(tChargingOrder.getEndMode());
- BigDecimal payMoney = tChargingOrder.getStatus() < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount();
- myChargingOrderList.setPayMoney(payMoney);
- myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
- myChargingOrderList.setElectricCharge(tChargingOrder.getElectrovalence());
- myChargingOrderList.setServiceCharge(tChargingOrder.getServiceCharge());
- list.add(myChargingOrderList);
- }
- return list;
- }
-
-
- /**
- * 充电支付
- *
- * @param addChargingOrder
- * @return
- */
+ @Resource
+ private TokenService tokenService;
+
+ @Resource
+ private WxPaymentClient wxPaymentClient;
+
+ @Resource
+ private AliPaymentClient aliPaymentClient;
+ @Resource
+ private H5AliPaymentClient h5AliPaymentClient;
+ @Resource
+ private IcbcPaymentClient icbcPaymentClient;
+ @Resource
+ private TChargingOrderShareRecordMapper chargingOrderShareRecordMapper;
+ @Value("${icbc.share.online-enabled:false}")
+ private boolean icbcOnlineShareEnabled;
+ @Resource
+ private ChargingOrderSettlementExecutor chargingOrderSettlementExecutor;
+ @Resource
+ private PlatformTransactionManager transactionManager;
+
+ @Resource
+ private AppCouponClient appCouponClient;
+ @Resource
+ private AppUserWhitelistClient appUserWhitelistClient;
+
+ @Resource
+ private AppUserVipDetailClient appUserVipDetailClient;
+
+ @Resource
+ private RedisService redisService;
+
+ @Resource
+ private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService;
+
+ @Resource
+ private TCECClient tcecClient;
+
+ @Resource
+ private SendMessageClient sendMessageClient;
+ @Resource
+ private WxSubscribeMessageService wxSubscribeMessageService;
+
+ @Resource
+ private TOrderEvaluateService orderEvaluateService;
+
+ @Resource
+ private AccountingStrategyDetailClient accountingStrategyDetailClient;
+
+ @Resource
+ private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient;
+
+ @Resource
+ private AccountingStrategyClient accountingStrategyClient;
+
+ @Resource
+ private PlatformStartChargingReplyService platformStartChargingReplyService;
+
+ @Resource
+ private TChargingOrderRefundService chargingOrderRefundService;
+
+ @Resource
+ private PlatformStopChargingReplyClient platformStopChargingReplyClient;
+
+ @Resource
+ private AccountingStrategyOrderService accountingStrategyOrderService;
+
+ @Resource
+ private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService;
+
+ @Resource
+ private InviteUserClient inviteUserClient;
+
+ @Resource
+ private AppUserIntegralChangeClient appUserIntegralChangeClient;
+
+ @Resource
+ private IntegralRuleClient integralRuleClient;
+
+ @Resource
+ private VipClient vipClient;
+ @Resource
+ private OtherClient otherClient;
+
+ @Resource
+ private UserTagClient userTagClient;
+
+ @Resource
+ private AppUserTagClient appUserTagClient;
+
+ @Resource
+ private SecurityDetectionClient securityDetectionClient;
+
+ //计数器
+ private Map<String, Integer> counter_map = new HashMap<>();
+
+ //计数器
+ private Map<String, Integer> boot_failed_map = new HashMap<>();
+
+ @Resource
+ private OperatorClient operatorClient;
+
+ @Resource
+ private TransactionRecordService transactionRecordService;
+
+ @Resource
+ private ITChargingOrderSummaryDataService chargingOrderSummaryDataService;
+ @Resource
+ private TOrderAppealService orderAppealService;
+
+ @Autowired
+ private RedissonClient redissonClient;
+
+ @Resource
+ private ChargingMessageClient chargingMessageClient;
+
+ @Resource
+ private ChengDuJianGuanClient chengDuJianGuanClient;
+
+
+ /**
+ * 获取小程序充电记录列表数据
+ *
+ * @param query
+ * @return
+ */
+ @Override
+ public Map<String, Object> getMyChargingOrderList(GetMyChargingOrderList query) {
+ Long appUserId = tokenService.getLoginUserApplet().getUserId();
+ Map<String, Object> map = new HashMap<>();
+ int size = this.baseMapper.getMyChargingOrderList(appUserId, 1, null, null).size();
+ map.put("number", size);
+ Integer pageCurr = query.getPageCurr() == null || query.getPageCurr() < 1 ? 1 : query.getPageCurr();
+ Integer pageSize = query.getPageSize() == null || query.getPageSize() < 1 ? 10 : query.getPageSize();
+ query.setPageCurr((pageCurr - 1) * pageSize);
+ query.setPageSize(pageSize);
+ List<TChargingOrder> list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), query.getPageCurr(), query.getPageSize());
+ List<MyChargingOrderList> orderLists = new ArrayList<>();
+ for (TChargingOrder tChargingOrder : list) {
+ MyChargingOrderList myChargingOrderList = new MyChargingOrderList();
+ myChargingOrderList.setId(tChargingOrder.getId().toString());
+ myChargingOrderList.setSiteId(tChargingOrder.getSiteId());
+ myChargingOrderList.setStatus(tChargingOrder.getStatus());
+ Site site = getOrderSite(tChargingOrder.getSiteId());
+ myChargingOrderList.setTitle(site == null ? "未知电站" : site.getName());
+ myChargingOrderList.setChargingDegree(tChargingOrder.getChargingCapacity());
+ String name = getChargingGunName(tChargingOrder.getChargingGunId());
+ myChargingOrderList.setChargingGunId(tChargingOrder.getChargingGunId());
+ myChargingOrderList.setName(name);
+ myChargingOrderList.setEndMode(tChargingOrder.getEndMode());
+ Integer status = tChargingOrder.getStatus();
+ BigDecimal payMoney = status != null && status < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount();
+ myChargingOrderList.setPayMoney(payMoney);
+ if (tChargingOrder.getCreateTime() != null) {
+ myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ }
+ long count = orderEvaluateService.count(new LambdaQueryWrapper<TOrderEvaluate>().eq(TOrderEvaluate::getOrderType, 1)
+ .eq(TOrderEvaluate::getOrderId, tChargingOrder.getId()).eq(TOrderEvaluate::getDelFlag, 0));
+ myChargingOrderList.setEvaluate(count + 1L);
+ orderLists.add(myChargingOrderList);
+ }
+ list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), null, null);
+ map.put("list", orderLists);
+ map.put("totle", list.size());
+ return map;
+ }
+
+ private Site getOrderSite(Integer siteId) {
+ if (siteId == null) {
+ return null;
+ }
+ R<List<Site>> result = siteClient.getSiteByIds(Collections.singletonList(siteId));
+ List<Site> sites = result == null ? Collections.emptyList() : result.getData();
+ return sites == null || sites.isEmpty() ? null : sites.get(0);
+ }
+
+ private String getChargingGunName(Integer chargingGunId) {
+ if (chargingGunId == null) {
+ return "";
+ }
+ R<String> result = chargingGunClient.getAllName(chargingGunId);
+ return result == null || result.getData() == null ? "" : result.getData();
+ }
+
+
+ /**
+ * 获取充电订单明细
+ *
+ * @param id 订单id
+ * @return
+ */
+ @Override
+ public MyChargingOrderInfo getMyChargingOrderInfo(String id) {
+ TChargingOrder chargingOrder = this.getById(id);
+ MyChargingOrderInfo myChargingOrderInfo = new MyChargingOrderInfo();
+ myChargingOrderInfo.setId(id);
+ myChargingOrderInfo.setChargingGunId(chargingOrder.getChargingGunId());
+ myChargingOrderInfo.setCode(chargingOrder.getCode());
+ myChargingOrderInfo.setCreateTime(chargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ myChargingOrderInfo.setStatus(chargingOrder.getStatus());
+ Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0);
+ myChargingOrderInfo.setTitle(site.getName());
+ TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+ myChargingOrderInfo.setChargeMode(chargingGun.getChargeMode());
+ String name = chargingGunClient.getAllName(chargingOrder.getChargingGunId()).getData();
+ myChargingOrderInfo.setName(name);
+ if (Objects.nonNull(chargingOrder.getAppUserCarId())) {
+ TAppUserCar tAppUserCar = appUserCarClient.getCarById(chargingOrder.getAppUserCarId().toString()).getData();
+ if (null != tAppUserCar) {
+ myChargingOrderInfo.setLicensePlate(tAppUserCar.getLicensePlate());
+ } else {
+ myChargingOrderInfo.setLicensePlate("无");
+ }
+ } else {
+ myChargingOrderInfo.setLicensePlate(chargingOrder.getPlateNum());
+ }
+ if (null != chargingOrder.getStartTime()) {
+ myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
+ }
+ if (null != chargingOrder.getEndTime()) {
+ myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
+ }
+ myChargingOrderInfo.setOrderAmount(chargingOrder.getOrderAmount());
+ myChargingOrderInfo.setPaymentAmount(chargingOrder.getPaymentAmount());
+ myChargingOrderInfo.setRechargeAmount(chargingOrder.getRechargeAmount());
+ myChargingOrderInfo.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount());
+ myChargingOrderInfo.setVipDiscountAmount(chargingOrder.getVipDiscountAmount());
+ myChargingOrderInfo.setRefundAmount(chargingOrder.getRefundAmount());
+ List<TChargingOrderAccountingStrategy> stageCost = chargingOrderAccountingStrategyService.list(
+ new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, id)
+ .orderByAsc(TChargingOrderAccountingStrategy::getStartTime)
+ );
+ myChargingOrderInfo.setStageCost(stageCost);
+ List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
+ if (null != dataList) {
+ //在MongoDB中获取数据
+ SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
+ List<UploadRealTimeMonitoringData> dataLists = new ArrayList<>();
+ String t = "";
+ for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : dataList) {
+ if (!sdf.format(uploadRealTimeMonitoringData.getCreate_time()).equals(t)) {
+ dataLists.add(uploadRealTimeMonitoringData);
+ t = sdf.format(uploadRealTimeMonitoringData.getCreate_time());
+ }
+ }
+
+ List<String> time = dataLists.stream().map(s -> sdf.format(s.getCreate_time())).collect(Collectors.toList());
+ List<BigDecimal> outputVoltage = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_voltage).collect(Collectors.toList());
+ List<BigDecimal> outputCurrent = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_current).collect(Collectors.toList());
+ List<Map<String, Object>> currentAndVoltage = new ArrayList<>();
+ for (int i = 0; i < time.size(); i++) {
+ Map<String, Object> map = new HashMap<>();
+ map.put("time", time.get(i));
+ //电流
+ map.put("electricity", outputCurrent.get(i));
+ //电压
+ map.put("voltage", outputVoltage.get(i));
+ currentAndVoltage.add(map);
+ }
+ myChargingOrderInfo.setCurrentAndVoltage(currentAndVoltage);
+ //在MongoDB中获取数据
+ List<Integer> soc = dataLists.stream().map(UploadRealTimeMonitoringData::getSoc).collect(Collectors.toList());
+ List<BigDecimal> po = dataLists.stream().map(s -> s.getOutput_current().multiply(s.getOutput_voltage()).divide(new BigDecimal(1000), 2, RoundingMode.HALF_DOWN)).collect(Collectors.toList());
+ List<Map<String, Object>> power = new ArrayList<>();
+ for (int i = 0; i < time.size(); i++) {
+ Map<String, Object> map = new HashMap<>();
+ map.put("time", time.get(i));
+ //soc
+ map.put("soc", soc.get(i));
+ //功率
+ map.put("power", po.get(i));
+ power.add(map);
+ }
+ myChargingOrderInfo.setPower(power);
+ }
+ myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime() == null || myChargingOrderInfo.getEndTime() + 604800000L < System.currentTimeMillis() ? 0 : 1);
+ long count = orderAppealService.count(Wrappers.lambdaQuery(TOrderAppeal.class)
+ .eq(TOrderAppeal::getOrderId, id));
+ myChargingOrderInfo.setIsAppeal(count > 0 ? 0 : 1);
+ return myChargingOrderInfo;
+ }
+
+
+ /**
+ * 获取待开票订单列表
+ *
+ * @param query
+ * @return
+ */
+ @Override
+ public List<MyChargingOrderList> getNoInvoicedOrder(GetNoInvoicedOrder query) {
+ Long appUserId = tokenService.getLoginUserApplet().getUserId();
+
+ query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize());
+ List<TChargingOrder> orderList = this.baseMapper.getNoInvoicedOrder(appUserId, query.getMonth(), query.getPageCurr(), query.getPageSize());
+ List<MyChargingOrderList> list = new ArrayList<>();
+ for (TChargingOrder tChargingOrder : orderList) {
+ MyChargingOrderList myChargingOrderList = new MyChargingOrderList();
+ myChargingOrderList.setId(tChargingOrder.getId().toString());
+ myChargingOrderList.setSiteId(tChargingOrder.getSiteId());
+ myChargingOrderList.setStatus(tChargingOrder.getStatus());
+ Site site = siteClient.getSiteByIds(Arrays.asList(tChargingOrder.getSiteId())).getData().get(0);
+ myChargingOrderList.setTitle(site.getName());
+ myChargingOrderList.setChargingDegree(tChargingOrder.getChargingCapacity());
+ String name = chargingGunClient.getAllName(tChargingOrder.getChargingGunId()).getData();
+ myChargingOrderList.setName(name);
+ myChargingOrderList.setEndMode(tChargingOrder.getEndMode());
+ BigDecimal payMoney = tChargingOrder.getStatus() < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount();
+ myChargingOrderList.setPayMoney(payMoney);
+ myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ myChargingOrderList.setElectricCharge(tChargingOrder.getElectrovalence());
+ myChargingOrderList.setServiceCharge(tChargingOrder.getServiceCharge());
+ list.add(myChargingOrderList);
+ }
+ return list;
+ }
+
+
+ /**
+ * 充电支付
+ *
+ * @param addChargingOrder
+ * @return
+ */
/**
* 判断订单是否使用余额或余额组合支付
@@ -604,7 +604,7 @@
* 调整用户余额
*
* @param userId 用户ID
- * @param delta 余额变动金额
+ * @param delta 余额变动金额
*/
private void changeUserBalance(Long userId, BigDecimal delta) {
if (userId == null || delta == null || delta.compareTo(BigDecimal.ZERO) == 0) {
@@ -644,8 +644,8 @@
* 记录兑换码余额退款流水
*
* @param chargingOrder 充电订单
- * @param refundAmount 退款金额
- * @param refundNo 退款单号
+ * @param refundAmount 退款金额
+ * @param refundNo 退款单号
*/
private void recordBalanceRefund(TChargingOrder chargingOrder, BigDecimal refundAmount, String refundNo) {
if (chargingOrder == null || chargingOrder.getAppUserId() == null || chargingOrder.getId() == null
@@ -663,17 +663,17 @@
}
}
- /**
- * 完成人工退款结果落库,并同步余额退款流水
- *
- * @param chargingOrder 充电订单
- * @param refund 退款记录
- * @param refundAmount 退款总金额
- * @param balanceRefundAmount 余额退款金额
- * @param thirdRefundAmount 三方退款金额
- */
- private void finishManualChargingRefund(TChargingOrder chargingOrder, TChargingOrderRefund refund,
- BigDecimal refundAmount, BigDecimal balanceRefundAmount, BigDecimal thirdRefundAmount) {
+ /**
+ * 完成人工退款结果落库,并同步余额退款流水
+ *
+ * @param chargingOrder 充电订单
+ * @param refund 退款记录
+ * @param refundAmount 退款总金额
+ * @param balanceRefundAmount 余额退款金额
+ * @param thirdRefundAmount 三方退款金额
+ */
+ private void finishManualChargingRefund(TChargingOrder chargingOrder, TChargingOrderRefund refund,
+ BigDecimal refundAmount, BigDecimal balanceRefundAmount, BigDecimal thirdRefundAmount) {
chargingOrder.setRefundStatus(2);
chargingOrder.setRefundAmount(money(chargingOrder.getRefundAmount()).add(refundAmount));
chargingOrder.setBalanceRefundAmount(money(chargingOrder.getBalanceRefundAmount()).add(balanceRefundAmount));
@@ -688,54 +688,54 @@
triggerChargingOrderShare(chargingOrder);
}
- private boolean refundByIcbcAndFinish(TChargingOrder chargingOrder, TChargingOrderRefund refund, BigDecimal thirdRefundAmount,
- String reason, boolean finishManual, BigDecimal refundAmount, BigDecimal balanceRefundAmount) {
- IcbcRefundReq req = new IcbcRefundReq();
- req.setOutTradeNo(chargingOrder.getCode());
- req.setOrderId(chargingOrder.getRechargeSerialNumber());
- req.setOutRefundNo(refund.getRefundCode());
- req.setRefundAmount(thirdRefundAmount);
- req.setTotalAmount(getRefundableThirdPayAmount(chargingOrder));
- req.setReason(reason);
- R<IcbcRefundResp> result = icbcPaymentClient.refund(req);
- IcbcRefundResp resp = result == null ? null : result.getData();
- if (result == null || result.getCode() != 200 || resp == null || !"SUCCESS".equals(resp.getStatus())) {
- log.error("工行退款失败,订单号:{},退款单号:{},返回:{}", chargingOrder.getCode(), refund.getRefundCode(), result == null ? null : result.getMsg());
- return false;
- }
- if (finishManual) {
- refund.setRefundSerialNumber(firstNotBlank(resp.getRefundId(), resp.getOutRefundNo()));
- refund.setRefundTime(LocalDateTime.now());
- finishManualChargingRefund(chargingOrder, refund, refundAmount, balanceRefundAmount, thirdRefundAmount);
- } else {
- chargingOrderRefundService.save(refund);
- chargingOrderStartupFailureWxRefund(refund.getRefundCode(), firstNotBlank(resp.getRefundId(), resp.getOutRefundNo()), "SUCCESS", resp.getRefundTime());
- }
- return true;
- }
+ private boolean refundByIcbcAndFinish(TChargingOrder chargingOrder, TChargingOrderRefund refund, BigDecimal thirdRefundAmount,
+ String reason, boolean finishManual, BigDecimal refundAmount, BigDecimal balanceRefundAmount) {
+ IcbcRefundReq req = new IcbcRefundReq();
+ req.setOutTradeNo(chargingOrder.getCode());
+ req.setOrderId(chargingOrder.getRechargeSerialNumber());
+ req.setOutRefundNo(refund.getRefundCode());
+ req.setRefundAmount(thirdRefundAmount);
+ req.setTotalAmount(getRefundableThirdPayAmount(chargingOrder));
+ req.setReason(reason);
+ R<IcbcRefundResp> result = icbcPaymentClient.refund(req);
+ IcbcRefundResp resp = result == null ? null : result.getData();
+ if (result == null || result.getCode() != 200 || resp == null || !"SUCCESS".equals(resp.getStatus())) {
+ log.error("工行退款失败,订单号:{},退款单号:{},返回:{}", chargingOrder.getCode(), refund.getRefundCode(), result == null ? null : result.getMsg());
+ return false;
+ }
+ if (finishManual) {
+ refund.setRefundSerialNumber(firstNotBlank(resp.getRefundId(), resp.getOutRefundNo()));
+ refund.setRefundTime(LocalDateTime.now());
+ finishManualChargingRefund(chargingOrder, refund, refundAmount, balanceRefundAmount, thirdRefundAmount);
+ } else {
+ chargingOrderRefundService.save(refund);
+ chargingOrderStartupFailureWxRefund(refund.getRefundCode(), firstNotBlank(resp.getRefundId(), resp.getOutRefundNo()), "SUCCESS", resp.getRefundTime());
+ }
+ return true;
+ }
- private boolean isIcbcOrder(TChargingOrder chargingOrder) {
- return chargingOrder != null && "ICBC".equals(chargingOrder.getSourceName());
- }
+ private boolean isIcbcOrder(TChargingOrder chargingOrder) {
+ return chargingOrder != null && "ICBC".equals(chargingOrder.getSourceName());
+ }
- private void validateSelectedChargingCoupon(Long appCouponId, Long userId) {
- TAppCoupon appCoupon = appCouponClient.getAppCouponById(appCouponId).getData();
- if (appCoupon == null || !userId.equals(appCoupon.getAppUserId())) {
- throw new ServiceException("优惠券不存在或不属于当前用户");
- }
- if (!Integer.valueOf(1).equals(appCoupon.getStatus())) {
- throw new ServiceException("优惠券已使用");
- }
- LocalDateTime now = LocalDateTime.now();
- if ((appCoupon.getStartTime() != null && appCoupon.getStartTime().isAfter(now))
- || (appCoupon.getEndTime() != null && appCoupon.getEndTime().isBefore(now))) {
- throw new ServiceException("优惠券不在有效期内");
- }
- TCoupon coupon = JSON.parseObject(appCoupon.getCouponJson(), TCoupon.class);
- if (coupon == null || !Integer.valueOf(1).equals(coupon.getType())) {
- throw new ServiceException("请选择充电优惠券");
- }
- }
+ private void validateSelectedChargingCoupon(Long appCouponId, Long userId) {
+ TAppCoupon appCoupon = appCouponClient.getAppCouponById(appCouponId).getData();
+ if (appCoupon == null || !userId.equals(appCoupon.getAppUserId())) {
+ throw new ServiceException("优惠券不存在或不属于当前用户");
+ }
+ if (!Integer.valueOf(1).equals(appCoupon.getStatus())) {
+ throw new ServiceException("优惠券已使用");
+ }
+ LocalDateTime now = LocalDateTime.now();
+ if ((appCoupon.getStartTime() != null && appCoupon.getStartTime().isAfter(now))
+ || (appCoupon.getEndTime() != null && appCoupon.getEndTime().isBefore(now))) {
+ throw new ServiceException("优惠券不在有效期内");
+ }
+ TCoupon coupon = JSON.parseObject(appCoupon.getCouponJson(), TCoupon.class);
+ if (coupon == null || !Integer.valueOf(1).equals(coupon.getType())) {
+ throw new ServiceException("请选择充电优惠券");
+ }
+ }
/**
* 判断订单是否为白名单订单
@@ -761,9 +761,9 @@
/**
* 按白名单权益拆分电费和服务费减免金额,财务统计需要分开展示两类退款金额
*
- * @param chargingOrder 充电订单
+ * @param chargingOrder 充电订单
* @param electrovalence 原始电费
- * @param serviceCharge 原始服务费
+ * @param serviceCharge 原始服务费
* @return 数组下标0=电费减免,下标1=服务费减免
*/
private BigDecimal[] calculateWhitelistRefundSplit(TChargingOrder chargingOrder, BigDecimal electrovalence, BigDecimal serviceCharge) {
@@ -773,6 +773,7 @@
electrovalence,
serviceCharge);
}
+
private TVip getVipSnapshot(TAppUserVipDetail vipDetail, Integer vipId) {
if (vipDetail != null && StringUtils.hasLength(vipDetail.getVipJson())) {
return JSON.parseObject(vipDetail.getVipJson(), TVip.class);
@@ -806,1232 +807,1233 @@
boolean shouldConsumeVipDiscount(BigDecimal discountAmount) {
return discountAmount != null && discountAmount.compareTo(BigDecimal.ZERO) > 0;
}
- @Override
- public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) {
- Long userId = tokenService.getLoginUserApplet().getUserId();
- TAppUser appUser = appUserClient.getUserById(userId).getData();
- Integer payMethod = addChargingOrder.getPayMethod() == null ? 3 : addChargingOrder.getPayMethod();
- BigDecimal rechargeAmount = money(addChargingOrder.getPaymentAmount());
- TChargingGun tChargingGun = chargingGunClient.getChargingGunById(addChargingOrder.getId()).getData();
- TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData();
- TAppUserCar selectedCar = null;
- if (addChargingOrder.getAppUserCarId() != null) {
- selectedCar = appUserCarClient.getCarById(addChargingOrder.getAppUserCarId().toString()).getData();
- }
- String selectedVin = selectedCar == null ? null : normalizeVin(selectedCar.getVin());
- if (Integer.valueOf(1).equals(chargingPile.getVinFlag())
- && (!StringUtils.hasLength(selectedVin) || !selectedVin.matches("[A-HJ-NPR-Z0-9]{17}"))) {
- return AjaxResult.error("该充电桩需要17位有效车辆VIN,请先完善所选车辆VIN");
- }
- AppUserWhitelistMatchVO whitelist = appUserWhitelistClient.matchWhitelist(userId, tChargingGun.getSiteId()).getData();
- boolean whitelistMatched = whitelist != null && Boolean.TRUE.equals(whitelist.getMatched());
- if (whitelistMatched) {
- addChargingOrder.setAppUserCouponId(null);
- }
- boolean whitelistAllFree = whitelistMatched
- && Integer.valueOf(WHITELIST_BENEFIT_ALL_FREE).equals(whitelist.getBenefitType());
- BigDecimal userBalance = money(appUser.getBalance());
- BigDecimal balancePayAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
- if (payMethod == 2 && userBalance.compareTo(rechargeAmount) >= 0) {
- payMethod = 1;
- addChargingOrder.setPayMethod(1);
- }
- if (isBalancePayMode(payMethod)) {
- addChargingOrder.setAppUserCouponId(null);
- } else if (!whitelistMatched && addChargingOrder.getAppUserCouponId() != null) {
- // 这里只校验优惠券,不抵扣预付金额;实际门槛和优惠金额在充电结束时计算。
- validateSelectedChargingCoupon(addChargingOrder.getAppUserCouponId(), userId);
- }
- BigDecimal payableAmount = ChargingCouponSupport.calculatePrepaymentAmount(rechargeAmount, whitelistAllFree);
- BigDecimal thirdPayAmount = payableAmount;
- if (isBalancePayMode(payMethod)) {
- if (payMethod == 1 && userBalance.compareTo(payableAmount) < 0) {
- return AjaxResult.error("余额不足,请选择组合支付或第三方支付");
- }
- balancePayAmount = payMethod == 1 ? payableAmount : userBalance.min(payableAmount).setScale(2, RoundingMode.HALF_UP);
- thirdPayAmount = payableAmount.subtract(balancePayAmount).setScale(2, RoundingMode.HALF_UP);
- }
- payMethod = ChargingPaymentSupport.resolvePayMethod(balancePayAmount, thirdPayAmount, payMethod);
- addChargingOrder.setPayMethod(payMethod);
- //检查当前枪是否是正在使用中
- TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId())
- .in(TChargingOrder::getStatus, Arrays.asList(3)).eq(TChargingOrder::getDelFlag, 0));
- if (null != one) {
- return AjaxResult.error("充电枪正在充电中,启动失败");
- }
- //查询当前充电枪是否有正在支付的订单
- one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId())
- .eq(TChargingOrder::getAppUserId, userId).eq(TChargingOrder::getRechargePaymentStatus, 1)
- .eq(TChargingOrder::getDelFlag, 0).last("limit 1"));
- if (null != one) {
- //查询三方支付数据,支付中直接结束三方订单
- if ("ICBC".equals(one.getSourceName())) {
- IcbcPaymentResp data = icbcPaymentClient.query(one.getCode()).getData();
- if (null != data && isIcbcRemovableStatus(data.getStatus(), one)) {
- this.removeById(one.getId());
- } else {
- return AjaxResult.error("存在支付中订单,请稍后再试");
- }
- }
- if (!"ICBC".equals(one.getSourceName()) && 1 == one.getRechargePaymentType()) {
- NotifyV3PayDecodeRespBody data = wxPaymentClient.queryOrderInfo(one.getCode()).getData();
- if (null != data) {
- String trade_state = data.getTrade_state();
- //支付失败,删除无效的订单
- if (trade_state.equals("REFUND") || trade_state.equals("NOTPAY") || trade_state.equals("REVOKED") || trade_state.equals("PAYERROR")) {
- this.removeById(one.getId());
- } else {
- //结束第三方支付,删除订单
- wxPaymentClient.close(one.getCode());
- this.removeById(one.getId());
- }
- }
- }
- if (!"ICBC".equals(one.getSourceName()) && 2 == one.getRechargePaymentType()) {
- AliQueryOrder data = aliPaymentClient.query(one.getCode()).getData();
- if (null != data) {
- String trade_state = data.getTradeStatus();
- //支付失败,删除无效的订单
- if (trade_state.equals("TRADE_CLOSED")) {
- this.removeById(one.getId());
- }
- if (trade_state.equals("WAIT_BUYER_PAY")) {
- //结束第三方支付,删除订单
- aliPaymentClient.close(one.getCode());
- this.removeById(one.getId());
- }
- }
- }
- if (!"ICBC".equals(one.getSourceName()) && 3 == one.getRechargePaymentType()) {
- AliQueryOrder data = h5AliPaymentClient.query(one.getCode()).getData();
- if (null != data) {
- String trade_state = data.getTradeStatus();
- //支付失败,删除无效的订单
- if (trade_state.equals("TRADE_CLOSED")) {
- this.removeById(one.getId());
- }
- if (trade_state.equals("WAIT_BUYER_PAY")) {
- //结束第三方支付,删除订单
- h5AliPaymentClient.close(one.getCode());
- this.removeById(one.getId());
- }
- }
- }
- }
-
-
- //构建新的待支付订单
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
- TChargingOrder chargingOrder = new TChargingOrder();
- String code = "CD" + Double.valueOf(Math.random() * 1000).intValue() + sdf.format(new Date());
- chargingOrder.setCode(code);
- chargingOrder.setOrderType(1);
- chargingOrder.setOrderClassification(1);
- chargingOrder.setAppUserId(userId);
- chargingOrder.setAppUserCarId(addChargingOrder.getAppUserCarId());
- if (selectedCar != null) {
- chargingOrder.setPlateNum(selectedCar.getLicensePlate());
- chargingOrder.setExpectedVin(selectedVin);
- }
- chargingOrder.setReservationTime(addChargingOrder.getReservationTime());
- chargingOrder.setSiteId(tChargingGun.getSiteId());
- chargingOrder.setChargingPileId(tChargingGun.getChargingPileId());
- chargingOrder.setChargingGunId(addChargingOrder.getId());
- chargingOrder.setRechargePaymentType(addChargingOrder.getPaymentType());
- chargingOrder.setRechargePaymentStatus(1);
- chargingOrder.setPayMethod(payMethod);
- chargingOrder.setBalancePayAmount(balancePayAmount);
- chargingOrder.setThirdPayAmount(thirdPayAmount);
- chargingOrder.setBalanceRefundAmount(BigDecimal.ZERO);
- chargingOrder.setThirdRefundAmount(BigDecimal.ZERO);
- chargingOrder.setRechargeAmount(rechargeAmount);
- chargingOrder.setAppCouponId(addChargingOrder.getAppUserCouponId());
- chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
- chargingOrder.setIsWhitelist(whitelistMatched ? 1 : 0);
- chargingOrder.setWhitelistId(whitelistMatched ? whitelist.getWhitelistId() : null);
- chargingOrder.setWhitelistBenefitType(whitelistMatched ? whitelist.getBenefitType() : null);
- chargingOrder.setWhitelistDiscountAmount(BigDecimal.ZERO);
- chargingOrder.setWhitelistElectricRefundAmount(BigDecimal.ZERO);
- chargingOrder.setWhitelistServiceRefundAmount(BigDecimal.ZERO);
- chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
- chargingOrder.setOrderSource(1);
- if (thirdPayAmount.compareTo(BigDecimal.ZERO) > 0 && Integer.valueOf(1).equals(addChargingOrder.getPaymentType())) {
- chargingOrder.setSourceName("ICBC");
- }
- chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪");
-
- Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0);
- AjaxResult reservationValidation = validateReservation(site, addChargingOrder.getReservationTime());
- if (reservationValidation != null) {
- return reservationValidation;
- }
- Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
- if (null == accountingStrategyId) {
- //查询站点上面的计费策略
- accountingStrategyId = site.getAccountingStrategyId();
- }
- TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData();
-
- //会员折扣支持直营网点和加盟商站点
- if (!whitelistMatched && Integer.valueOf(1).equals(site.getMemberDiscountFlag()) && null != appUser.getVipId()) {
- GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
- getAppUserVipDetail.setAppUserId(appUser.getId());
- getAppUserVipDetail.setVipId(appUser.getVipId());
- TAppUserVipDetail vipDetail = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
- TVip vip = getVipSnapshot(vipDetail, appUser.getVipId());
- if (null != vip && null != vipDetail) {
- BigDecimal discount = resolveChargingVipDiscount(vip, accountingStrategy);
- Integer chargeNum = vipDetail.getChargeNum();
- if (null != discount && null != chargeNum && 0 < chargeNum) {
- chargingOrder.setVipDiscount(discount);
- }
- }
- }
- this.save(chargingOrder);
-
- //添加订单的计费策略
- List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData();
- AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder();
- BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder);
- accountingStrategyOrder.setChargingOrderId(chargingOrder.getId());
- accountingStrategyOrderService.save(accountingStrategyOrder);
- List<AccountingStrategyDetailOrder> list1 = new ArrayList<>();
- for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) {
- AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
- BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder);
- accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId());
- accountingStrategyDetailOrder.setCreateTime(LocalDateTime.now());
- accountingStrategyDetailOrder.setDelFlag(false);
- list1.add(accountingStrategyDetailOrder);
- }
- accountingStrategyDetailOrderService.saveBatch(list1);
-
- if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0 && balancePayAmount.compareTo(BigDecimal.ZERO) > 0) {
- changeUserBalance(userId, balancePayAmount.negate());
- recordBalanceConsume(chargingOrder, balancePayAmount);
- }
- if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0) {
- return completeChargingOrderPayment(chargingOrder, whitelistMatched ? "WHITELIST" : "BALANCE");
- }
- //会员优惠折扣将其计入增加充电时长(增加总充电金额)
- //如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额)
- if (Integer.valueOf(1).equals(addChargingOrder.getPaymentType())) {
- IcbcPaymentReq req = new IcbcPaymentReq();
- req.setOutTradeNo(chargingOrder.getCode());
- req.setAmount(thirdPayAmount);
- req.setSubject("充电充值");
- req.setBody("充电充值");
- req.setPaymentType(1);
- req.setNotifyUrl("/payment/icbc/callBack");
- req.setReturnUrl(addChargingOrder.getReturnUrl());
- req.setOpenId(appUser.getWxOpenid());
- req.setProfitSharing(buildIcbcProfitSharing(site));
- R<IcbcPaymentResp> result = icbcPaymentClient.payment(req);
- if (result == null || R.isError(result)) {
- String reason = result == null ? "工行支付服务无响应" : firstNotBlank(result.getMsg(), "工行支付服务调用失败");
- log.error("调起工行支付失败,订单号:{},原因:{}", chargingOrder.getCode(), reason);
- throw new RuntimeException("调起工行支付失败:" + reason);
- }
- IcbcPaymentResp data = result.getData();
- if (isIcbcPaymentCreated(data)) {
- if (StringUtils.hasLength(data.getTradeNo())) {
- chargingOrder.setRechargeSerialNumber(data.getTradeNo());
- this.updateById(chargingOrder);
- }
- return AjaxResult.success(data);
- }
- String reason = buildIcbcPaymentFailReason(data);
- log.error("调起工行支付失败,订单号:{},工行返回:{}", chargingOrder.getCode(), reason);
- throw new RuntimeException("调起工行支付失败:" + reason);
- }
- if (Integer.valueOf(2).equals(addChargingOrder.getPaymentType())) {
- AliPaymentReq req = new AliPaymentReq();
- req.setOutTradeNo(chargingOrder.getCode());
- req.setTotalAmount(thirdPayAmount.toString());
- req.setSubject("充电充值");
- req.setBuyerOpenId(appUser.getAliOpenid());
- req.setBody("充电充值");
- req.setNotifyUrl("/payment/ali/callBack");
- AliPaymentResp data = aliPaymentClient.payment(req).getData();
- if (data != null) {
- return AjaxResult.success(data);
- }
- throw new RuntimeException("调起支付宝支付失败");
- }
- if (Integer.valueOf(3).equals(addChargingOrder.getPaymentType())) {
- AliPaymentReq req = new AliPaymentReq();
- req.setOutTradeNo(chargingOrder.getCode());
- req.setTotalAmount(thirdPayAmount.toString());
- req.setSubject("充电充值");
- req.setBuyerOpenId(appUser.getAliOpenid());
- req.setBody("充电充值");
- req.setNotifyUrl("/payment/aliH5/callBack");
- req.setReturnUrl(addChargingOrder.getReturnUrl());
- String data = h5AliPaymentClient.payment(req).getData();
- if (StringUtils.hasLength(data)) {
- return AjaxResult.success("操作成功", data);
- }
- }
- throw new RuntimeException("无效的支付方式");
- }
- @Override
- public ChargingSimulationVO getCurrentSimulationOrder(Integer gunId) {
- if (gunId == null) {
- throw new ServiceException("充电枪不能为空");
- }
- Long userId = tokenService.getLoginUserApplet().getUserId();
- return buildSimulationVO(findSimulationOrder(userId, gunId));
- }
+ @Override
+ public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) {
+ Long userId = tokenService.getLoginUserApplet().getUserId();
+ TAppUser appUser = appUserClient.getUserById(userId).getData();
+ Integer payMethod = addChargingOrder.getPayMethod() == null ? 3 : addChargingOrder.getPayMethod();
+ BigDecimal rechargeAmount = money(addChargingOrder.getPaymentAmount());
+ TChargingGun tChargingGun = chargingGunClient.getChargingGunById(addChargingOrder.getId()).getData();
+ TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData();
+ TAppUserCar selectedCar = null;
+ if (addChargingOrder.getAppUserCarId() != null) {
+ selectedCar = appUserCarClient.getCarById(addChargingOrder.getAppUserCarId().toString()).getData();
+ }
+ String selectedVin = selectedCar == null ? null : normalizeVin(selectedCar.getVin());
+ if (Integer.valueOf(1).equals(chargingPile.getVinFlag())
+ && (!StringUtils.hasLength(selectedVin) || !selectedVin.matches("[A-HJ-NPR-Z0-9]{17}"))) {
+ return AjaxResult.error("该充电桩需要17位有效车辆VIN,请先完善所选车辆VIN");
+ }
+ AppUserWhitelistMatchVO whitelist = appUserWhitelistClient.matchWhitelist(userId, tChargingGun.getSiteId()).getData();
+ boolean whitelistMatched = whitelist != null && Boolean.TRUE.equals(whitelist.getMatched());
+ if (whitelistMatched) {
+ addChargingOrder.setAppUserCouponId(null);
+ }
+ boolean whitelistAllFree = whitelistMatched
+ && Integer.valueOf(WHITELIST_BENEFIT_ALL_FREE).equals(whitelist.getBenefitType());
+ BigDecimal userBalance = money(appUser.getBalance());
+ BigDecimal balancePayAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ if (payMethod == 2 && userBalance.compareTo(rechargeAmount) >= 0) {
+ payMethod = 1;
+ addChargingOrder.setPayMethod(1);
+ }
+ if (isBalancePayMode(payMethod)) {
+ addChargingOrder.setAppUserCouponId(null);
+ } else if (!whitelistMatched && addChargingOrder.getAppUserCouponId() != null) {
+ // 这里只校验优惠券,不抵扣预付金额;实际门槛和优惠金额在充电结束时计算。
+ validateSelectedChargingCoupon(addChargingOrder.getAppUserCouponId(), userId);
+ }
+ BigDecimal payableAmount = ChargingCouponSupport.calculatePrepaymentAmount(rechargeAmount, whitelistAllFree);
+ BigDecimal thirdPayAmount = payableAmount;
+ if (isBalancePayMode(payMethod)) {
+ if (payMethod == 1 && userBalance.compareTo(payableAmount) < 0) {
+ return AjaxResult.error("余额不足,请选择组合支付或第三方支付");
+ }
+ balancePayAmount = payMethod == 1 ? payableAmount : userBalance.min(payableAmount).setScale(2, RoundingMode.HALF_UP);
+ thirdPayAmount = payableAmount.subtract(balancePayAmount).setScale(2, RoundingMode.HALF_UP);
+ }
+ payMethod = ChargingPaymentSupport.resolvePayMethod(balancePayAmount, thirdPayAmount, payMethod);
+ addChargingOrder.setPayMethod(payMethod);
+ //检查当前枪是否是正在使用中
+ TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId())
+ .in(TChargingOrder::getStatus, Arrays.asList(3)).eq(TChargingOrder::getDelFlag, 0));
+ if (null != one) {
+ return AjaxResult.error("充电枪正在充电中,启动失败");
+ }
+ //查询当前充电枪是否有正在支付的订单
+ one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId())
+ .eq(TChargingOrder::getAppUserId, userId).eq(TChargingOrder::getRechargePaymentStatus, 1)
+ .eq(TChargingOrder::getDelFlag, 0).last("limit 1"));
+ if (null != one) {
+ //查询三方支付数据,支付中直接结束三方订单
+ if ("ICBC".equals(one.getSourceName())) {
+ IcbcPaymentResp data = icbcPaymentClient.query(one.getCode()).getData();
+ if (null != data && isIcbcRemovableStatus(data.getStatus(), one)) {
+ this.removeById(one.getId());
+ } else {
+ return AjaxResult.error("存在支付中订单,请稍后再试");
+ }
+ }
+ if (!"ICBC".equals(one.getSourceName()) && 1 == one.getRechargePaymentType()) {
+ NotifyV3PayDecodeRespBody data = wxPaymentClient.queryOrderInfo(one.getCode()).getData();
+ if (null != data) {
+ String trade_state = data.getTrade_state();
+ //支付失败,删除无效的订单
+ if (trade_state.equals("REFUND") || trade_state.equals("NOTPAY") || trade_state.equals("REVOKED") || trade_state.equals("PAYERROR")) {
+ this.removeById(one.getId());
+ } else {
+ //结束第三方支付,删除订单
+ wxPaymentClient.close(one.getCode());
+ this.removeById(one.getId());
+ }
+ }
+ }
+ if (!"ICBC".equals(one.getSourceName()) && 2 == one.getRechargePaymentType()) {
+ AliQueryOrder data = aliPaymentClient.query(one.getCode()).getData();
+ if (null != data) {
+ String trade_state = data.getTradeStatus();
+ //支付失败,删除无效的订单
+ if (trade_state.equals("TRADE_CLOSED")) {
+ this.removeById(one.getId());
+ }
+ if (trade_state.equals("WAIT_BUYER_PAY")) {
+ //结束第三方支付,删除订单
+ aliPaymentClient.close(one.getCode());
+ this.removeById(one.getId());
+ }
+ }
+ }
+ if (!"ICBC".equals(one.getSourceName()) && 3 == one.getRechargePaymentType()) {
+ AliQueryOrder data = h5AliPaymentClient.query(one.getCode()).getData();
+ if (null != data) {
+ String trade_state = data.getTradeStatus();
+ //支付失败,删除无效的订单
+ if (trade_state.equals("TRADE_CLOSED")) {
+ this.removeById(one.getId());
+ }
+ if (trade_state.equals("WAIT_BUYER_PAY")) {
+ //结束第三方支付,删除订单
+ h5AliPaymentClient.close(one.getCode());
+ this.removeById(one.getId());
+ }
+ }
+ }
+ }
- @Override
- public ChargingSimulationVO completeSimulation(ChargingSimulationReq request) {
- if (request == null || request.getGunId() == null) {
- throw new ServiceException("充电枪不能为空");
- }
- Long userId = tokenService.getLoginUserApplet().getUserId();
- TChargingOrder order = findSimulationOrder(userId, request.getGunId());
- List<UploadRealTimeMonitoringData> monitoringData = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode());
- if (monitoringData != null && !monitoringData.isEmpty()) {
- throw new ServiceException("订单已存在真实充电监控数据,禁止模拟结算");
- }
- BigDecimal electricityFee = money(request.getElectricityFee());
- BigDecimal serviceFee = money(request.getServiceFee());
- BigDecimal simulationTotal = electricityFee.add(serviceFee).setScale(2, RoundingMode.HALF_UP);
- BigDecimal availableAmount = ChargingSimulationSupport.availableAmount(order);
- if (simulationTotal.compareTo(availableAmount) > 0) {
- throw new ServiceException("模拟消费金额不能超过订单可消费金额" + availableAmount.toPlainString() + "元");
- }
- List<AccountingStrategyDetailOrder> tariffs = accountingStrategyDetailOrderService.list(
- new LambdaQueryWrapper<AccountingStrategyDetailOrder>()
- .eq(AccountingStrategyDetailOrder::getChargingOrderId, order.getId())
- .orderByAsc(AccountingStrategyDetailOrder::getStartTime));
- ChargingSimulationSupport.PreparedSimulation prepared;
- try {
- prepared = ChargingSimulationSupport.prepare(order.getCode(), tariffs, electricityFee, serviceFee, LocalDateTime.now());
- } catch (IllegalArgumentException e) {
- throw new ServiceException(e.getMessage());
- }
- accountingStrategyDetailOrderService.updateById(prepared.getTariff());
+ //构建新的待支付订单
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+ TChargingOrder chargingOrder = new TChargingOrder();
+ String code = "CD" + Double.valueOf(Math.random() * 1000).intValue() + sdf.format(new Date());
+ chargingOrder.setCode(code);
+ chargingOrder.setOrderType(1);
+ chargingOrder.setOrderClassification(1);
+ chargingOrder.setAppUserId(userId);
+ chargingOrder.setAppUserCarId(addChargingOrder.getAppUserCarId());
+ if (selectedCar != null) {
+ chargingOrder.setPlateNum(selectedCar.getLicensePlate());
+ chargingOrder.setExpectedVin(selectedVin);
+ }
+ chargingOrder.setReservationTime(addChargingOrder.getReservationTime());
+ chargingOrder.setSiteId(tChargingGun.getSiteId());
+ chargingOrder.setChargingPileId(tChargingGun.getChargingPileId());
+ chargingOrder.setChargingGunId(addChargingOrder.getId());
+ chargingOrder.setRechargePaymentType(addChargingOrder.getPaymentType());
+ chargingOrder.setRechargePaymentStatus(1);
+ chargingOrder.setPayMethod(payMethod);
+ chargingOrder.setBalancePayAmount(balancePayAmount);
+ chargingOrder.setThirdPayAmount(thirdPayAmount);
+ chargingOrder.setBalanceRefundAmount(BigDecimal.ZERO);
+ chargingOrder.setThirdRefundAmount(BigDecimal.ZERO);
+ chargingOrder.setRechargeAmount(rechargeAmount);
+ chargingOrder.setAppCouponId(addChargingOrder.getAppUserCouponId());
+ chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
+ chargingOrder.setIsWhitelist(whitelistMatched ? 1 : 0);
+ chargingOrder.setWhitelistId(whitelistMatched ? whitelist.getWhitelistId() : null);
+ chargingOrder.setWhitelistBenefitType(whitelistMatched ? whitelist.getBenefitType() : null);
+ chargingOrder.setWhitelistDiscountAmount(BigDecimal.ZERO);
+ chargingOrder.setWhitelistElectricRefundAmount(BigDecimal.ZERO);
+ chargingOrder.setWhitelistServiceRefundAmount(BigDecimal.ZERO);
+ chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
+ chargingOrder.setOrderSource(1);
+ if (thirdPayAmount.compareTo(BigDecimal.ZERO) > 0 && Integer.valueOf(1).equals(addChargingOrder.getPaymentType())) {
+ chargingOrder.setSourceName("ICBC");
+ }
+ chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪");
- TChargingGun gun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
- TChargingPile pile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData();
- TransactionRecordMessageVO record = prepared.getRecord();
- record.setCharging_gun_code(gun == null ? null : gun.getCode());
- record.setCharging_pile_code(pile == null ? null : pile.getCode());
- if (Integer.valueOf(2).equals(order.getStatus())) {
- TChargingOrder charging = new TChargingOrder();
- charging.setId(order.getId());
- charging.setStatus(3);
- charging.setStartTime(LocalDateTime.now().minusSeconds(1));
- this.updateById(charging);
- }
- R settlement = chargingOrderSettlementExecutor.settle(record);
- if (R.isError(settlement)) {
- throw new ServiceException(StringUtils.hasLength(settlement.getMsg()) ? settlement.getMsg() : "模拟结算失败");
- }
- return buildSimulationVO(this.getById(order.getId()));
- }
+ Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0);
+ AjaxResult reservationValidation = validateReservation(site, addChargingOrder.getReservationTime());
+ if (reservationValidation != null) {
+ return reservationValidation;
+ }
+ Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
+ if (null == accountingStrategyId) {
+ //查询站点上面的计费策略
+ accountingStrategyId = site.getAccountingStrategyId();
+ }
+ TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData();
- private TChargingOrder findSimulationOrder(Long userId, Integer gunId) {
- TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>()
- .eq(TChargingOrder::getAppUserId, userId)
- .eq(TChargingOrder::getChargingGunId, gunId)
- .eq(TChargingOrder::getRechargePaymentStatus, 2)
- .in(TChargingOrder::getStatus, Arrays.asList(2, 3, 4))
- .eq(TChargingOrder::getDelFlag, 0)
- .isNull(TChargingOrder::getRefundStatus)
- .orderByDesc(TChargingOrder::getId)
- .last("limit 1"));
- if (order == null) {
- throw new ServiceException("当前枪没有属于你的可模拟已支付订单");
- }
- return order;
- }
+ //会员折扣支持直营网点和加盟商站点
+ if (!whitelistMatched && Integer.valueOf(1).equals(site.getMemberDiscountFlag()) && null != appUser.getVipId()) {
+ GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
+ getAppUserVipDetail.setAppUserId(appUser.getId());
+ getAppUserVipDetail.setVipId(appUser.getVipId());
+ TAppUserVipDetail vipDetail = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
+ TVip vip = getVipSnapshot(vipDetail, appUser.getVipId());
+ if (null != vip && null != vipDetail) {
+ BigDecimal discount = resolveChargingVipDiscount(vip, accountingStrategy);
+ Integer chargeNum = vipDetail.getChargeNum();
+ if (null != discount && null != chargeNum && 0 < chargeNum) {
+ chargingOrder.setVipDiscount(discount);
+ }
+ }
+ }
+ this.save(chargingOrder);
- private ChargingSimulationVO buildSimulationVO(TChargingOrder order) {
- ChargingSimulationVO result = new ChargingSimulationVO();
- result.setOrderId(order.getId());
- result.setOrderCode(order.getCode());
- result.setOrderStatus(order.getStatus());
- result.setPaymentMode(ChargingSimulationSupport.paymentMode(order));
- result.setPayMethod(order.getPayMethod());
- result.setRechargePaymentType(order.getRechargePaymentType());
- result.setSourceName(order.getSourceName());
- result.setRechargeAmount(order.getRechargeAmount());
- result.setChargeAmount(order.getChargeAmount());
- result.setAvailableAmount(ChargingSimulationSupport.availableAmount(order));
- result.setBalancePayAmount(order.getBalancePayAmount());
- result.setThirdPayAmount(order.getThirdPayAmount());
- result.setElectricityFee(order.getElectrovalence());
- result.setServiceFee(order.getServiceCharge());
- result.setPaymentAmount(order.getPaymentAmount());
- result.setRefundAmount(order.getRefundAmount());
- result.setBalanceRefundAmount(order.getBalanceRefundAmount());
- result.setThirdRefundAmount(order.getThirdRefundAmount());
- result.setRefundStatus(order.getRefundStatus());
- result.setIcbcOrderId(order.getRechargeSerialNumber());
- TChargingOrderShareRecord shareRecord = chargingOrderShareRecordMapper.selectOne(
- new LambdaQueryWrapper<TChargingOrderShareRecord>()
- .eq(TChargingOrderShareRecord::getChargingOrderId, order.getId())
- .eq(TChargingOrderShareRecord::getPayChannel, "ICBC")
- .eq(TChargingOrderShareRecord::getDelFlag, false)
- .orderByDesc(TChargingOrderShareRecord::getId)
- .last("limit 1"));
- if (shareRecord == null) {
- shareRecord = chargingOrderShareRecordMapper.selectOne(
- new LambdaQueryWrapper<TChargingOrderShareRecord>()
- .eq(TChargingOrderShareRecord::getChargingOrderId, order.getId())
- .eq(TChargingOrderShareRecord::getDelFlag, false)
- .orderByDesc(TChargingOrderShareRecord::getId)
- .last("limit 1"));
- }
- if (shareRecord != null) {
- result.setShareAmount(shareRecord.getShareAmount());
- result.setShareStatus(shareRecord.getOnlineShareStatus());
- result.setSubOrderId(shareRecord.getSubOrderId());
- result.setSubOrderSeq(shareRecord.getSubOrderSeq());
- result.setSubOrderTrxid(shareRecord.getSubOrderTrxid());
- }
- return result;
- }
+ //添加订单的计费策略
+ List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData();
+ AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder();
+ BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder);
+ accountingStrategyOrder.setChargingOrderId(chargingOrder.getId());
+ accountingStrategyOrderService.save(accountingStrategyOrder);
+ List<AccountingStrategyDetailOrder> list1 = new ArrayList<>();
+ for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) {
+ AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
+ BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder);
+ accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId());
+ accountingStrategyDetailOrder.setCreateTime(LocalDateTime.now());
+ accountingStrategyDetailOrder.setDelFlag(false);
+ list1.add(accountingStrategyDetailOrder);
+ }
+ accountingStrategyDetailOrderService.saveBatch(list1);
- @Override
- public IcbcPaymentResp queryIcbcAdminPayment(String orderCode) {
- TChargingOrder order = loadIcbcAdminOrder(orderCode, false);
- return requireFeignData(icbcPaymentClient.query(order.getCode()), "工行支付查询失败");
- }
+ if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0 && balancePayAmount.compareTo(BigDecimal.ZERO) > 0) {
+ changeUserBalance(userId, balancePayAmount.negate());
+ recordBalanceConsume(chargingOrder, balancePayAmount);
+ }
+ if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0) {
+ return completeChargingOrderPayment(chargingOrder, whitelistMatched ? "WHITELIST" : "BALANCE");
+ }
+ //会员优惠折扣将其计入增加充电时长(增加总充电金额)
+ //如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额)
+ if (Integer.valueOf(1).equals(addChargingOrder.getPaymentType())) {
+ IcbcPaymentReq req = new IcbcPaymentReq();
+ req.setOutTradeNo(chargingOrder.getCode());
+ req.setAmount(thirdPayAmount);
+ req.setSubject("充电充值");
+ req.setBody("充电充值");
+ req.setPaymentType(1);
+ req.setNotifyUrl("/payment/icbc/callBack");
+ req.setReturnUrl(addChargingOrder.getReturnUrl());
+ req.setOpenId(appUser.getWxOpenid());
+ req.setProfitSharing(buildIcbcProfitSharing(site));
+ R<IcbcPaymentResp> result = icbcPaymentClient.payment(req);
+ if (result == null || R.isError(result)) {
+ String reason = result == null ? "工行支付服务无响应" : firstNotBlank(result.getMsg(), "工行支付服务调用失败");
+ log.error("调起工行支付失败,订单号:{},原因:{}", chargingOrder.getCode(), reason);
+ throw new RuntimeException("调起工行支付失败:" + reason);
+ }
+ IcbcPaymentResp data = result.getData();
+ if (isIcbcPaymentCreated(data)) {
+ if (StringUtils.hasLength(data.getTradeNo())) {
+ chargingOrder.setRechargeSerialNumber(data.getTradeNo());
+ this.updateById(chargingOrder);
+ }
+ return AjaxResult.success(data);
+ }
+ String reason = buildIcbcPaymentFailReason(data);
+ log.error("调起工行支付失败,订单号:{},工行返回:{}", chargingOrder.getCode(), reason);
+ throw new RuntimeException("调起工行支付失败:" + reason);
+ }
+ if (Integer.valueOf(2).equals(addChargingOrder.getPaymentType())) {
+ AliPaymentReq req = new AliPaymentReq();
+ req.setOutTradeNo(chargingOrder.getCode());
+ req.setTotalAmount(thirdPayAmount.toString());
+ req.setSubject("充电充值");
+ req.setBuyerOpenId(appUser.getAliOpenid());
+ req.setBody("充电充值");
+ req.setNotifyUrl("/payment/ali/callBack");
+ AliPaymentResp data = aliPaymentClient.payment(req).getData();
+ if (data != null) {
+ return AjaxResult.success(data);
+ }
+ throw new RuntimeException("调起支付宝支付失败");
+ }
+ if (Integer.valueOf(3).equals(addChargingOrder.getPaymentType())) {
+ AliPaymentReq req = new AliPaymentReq();
+ req.setOutTradeNo(chargingOrder.getCode());
+ req.setTotalAmount(thirdPayAmount.toString());
+ req.setSubject("充电充值");
+ req.setBuyerOpenId(appUser.getAliOpenid());
+ req.setBody("充电充值");
+ req.setNotifyUrl("/payment/aliH5/callBack");
+ req.setReturnUrl(addChargingOrder.getReturnUrl());
+ String data = h5AliPaymentClient.payment(req).getData();
+ if (StringUtils.hasLength(data)) {
+ return AjaxResult.success("操作成功", data);
+ }
+ }
+ throw new RuntimeException("无效的支付方式");
+ }
- @Transactional
- @Override
- public AjaxResult confirmIcbcPayment(String orderCode) {
- if (!StringUtils.hasLength(orderCode)) {
- return AjaxResult.error("订单号不能为空");
- }
- Long userId = tokenService.getLoginUserApplet().getUserId();
- TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>()
- .eq(TChargingOrder::getCode, orderCode)
- .eq(TChargingOrder::getAppUserId, userId)
- .eq(TChargingOrder::getDelFlag, 0)
- .last("limit 1"));
- if (order == null) {
- return AjaxResult.error("支付订单不存在");
- }
- if (Integer.valueOf(2).equals(order.getRechargePaymentStatus())) {
- return AjaxResult.success(Collections.singletonMap("confirmed", true));
- }
- if (!isIcbcOrder(order)) {
- return AjaxResult.error("当前订单不是工行支付订单");
- }
+ @Override
+ public ChargingSimulationVO getCurrentSimulationOrder(Integer gunId) {
+ if (gunId == null) {
+ throw new ServiceException("充电枪不能为空");
+ }
+ Long userId = tokenService.getLoginUserApplet().getUserId();
+ return buildSimulationVO(findSimulationOrder(userId, gunId));
+ }
- R<IcbcPaymentResp> queryResult = icbcPaymentClient.query(orderCode);
- IcbcPaymentResp payment = queryResult == null ? null : queryResult.getData();
- if (!IcbcAdminFundOperationSupport.isBankPaid(payment)
- || payment == null
- || !orderCode.equals(payment.getOrderId())
- || !StringUtils.hasLength(payment.getTradeNo())) {
- return AjaxResult.success(Collections.singletonMap("confirmed", false));
- }
- AjaxResult callbackResult = chargingOrderCallback(1, orderCode, payment.getTradeNo(), "1");
- if (!Integer.valueOf(200).equals(callbackResult.get("code"))) {
- return callbackResult;
- }
- return AjaxResult.success(Collections.singletonMap("confirmed", true));
- }
+ @Override
+ public ChargingSimulationVO completeSimulation(ChargingSimulationReq request) {
+ if (request == null || request.getGunId() == null) {
+ throw new ServiceException("充电枪不能为空");
+ }
+ Long userId = tokenService.getLoginUserApplet().getUserId();
+ TChargingOrder order = findSimulationOrder(userId, request.getGunId());
+ List<UploadRealTimeMonitoringData> monitoringData = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode());
+ if (monitoringData != null && !monitoringData.isEmpty()) {
+ throw new ServiceException("订单已存在真实充电监控数据,禁止模拟结算");
+ }
+ BigDecimal electricityFee = money(request.getElectricityFee());
+ BigDecimal serviceFee = money(request.getServiceFee());
+ BigDecimal simulationTotal = electricityFee.add(serviceFee).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal availableAmount = ChargingSimulationSupport.availableAmount(order);
+ if (simulationTotal.compareTo(availableAmount) > 0) {
+ throw new ServiceException("模拟消费金额不能超过订单可消费金额" + availableAmount.toPlainString() + "元");
+ }
- @Override
- public IcbcRefundResp refundIcbcAdminPayment(IcbcAdminFundOperationReq request) {
- if (request == null) {
- throw new ServiceException("请求参数不能为空");
- }
- TChargingOrder order = loadIcbcAdminOrder(request.getOrderCode(), false);
- BigDecimal amount;
- try {
- amount = IcbcAdminFundOperationSupport.requireAmount(request.getAmount());
- } catch (IllegalArgumentException e) {
- throw new ServiceException(e.getMessage());
- }
- BigDecimal paidAmount = money(order.getThirdPayAmount()).compareTo(BigDecimal.ZERO) > 0
- ? money(order.getThirdPayAmount()) : money(order.getRechargeAmount());
- if (amount.compareTo(paidAmount) > 0) {
- throw new ServiceException("退款金额不能超过订单第三方支付金额" + paidAmount.toPlainString() + "元");
- }
- RLock lock = redissonClient.getLock("icbcAdminFund:order:" + order.getCode());
- if (!lock.tryLock()) {
- throw new ServiceException("该订单正在执行工行资金操作,请勿重复提交");
- }
- try {
- IcbcPaymentResp payment = requireFeignData(icbcPaymentClient.query(order.getCode()), "工行支付查询失败");
- if (!IcbcAdminFundOperationSupport.isBankPaid(payment)) {
- throw new ServiceException("工行查询未确认该订单支付成功,禁止退款");
- }
- String orderId = extractIcbcOrderId(payment);
- order.setRechargeSerialNumber(orderId);
- // 仅用于本次请求通过退款参数校验,不更新本地订单状态。
- order.setRechargePaymentStatus(2);
- RBucket<String> pendingRefund = redissonClient.getBucket("icbcAdminFund:pending:main:" + order.getCode());
- String generatedRefundNo = "ICBCADMINREFUND" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
- String pendingValue = pendingRefund.get();
- boolean reusingPending = StringUtils.hasLength(pendingValue);
- String refundNo;
- try {
- refundNo = IcbcAdminFundOperationSupport.resolveRefundNo(pendingValue, amount, generatedRefundNo);
- } catch (IllegalArgumentException e) {
- throw new ServiceException(e.getMessage());
- }
- IcbcRefundReq refundRequest = IcbcAdminFundOperationSupport.buildRefundRequest(order, amount, refundNo);
- if (!reusingPending) {
- pendingRefund.set(IcbcAdminFundOperationSupport.buildPendingRefundValue(refundNo, amount));
- }
- IcbcRefundResp response = requireFeignData(icbcPaymentClient.refund(refundRequest), "工行退款调用失败");
- if (IcbcAdminFundOperationSupport.shouldClearPendingRefund(
- reusingPending, response.getStatus(), isDefinitiveIcbcResponse(response.getRawResponse()))) {
- pendingRefund.delete();
- }
- return response;
- } finally {
- if (lock.isHeldByCurrentThread()) {
- lock.unlock();
- }
- }
- }
+ List<AccountingStrategyDetailOrder> tariffs = accountingStrategyDetailOrderService.list(
+ new LambdaQueryWrapper<AccountingStrategyDetailOrder>()
+ .eq(AccountingStrategyDetailOrder::getChargingOrderId, order.getId())
+ .orderByAsc(AccountingStrategyDetailOrder::getStartTime));
+ ChargingSimulationSupport.PreparedSimulation prepared;
+ try {
+ prepared = ChargingSimulationSupport.prepare(order.getCode(), tariffs, electricityFee, serviceFee, LocalDateTime.now());
+ } catch (IllegalArgumentException e) {
+ throw new ServiceException(e.getMessage());
+ }
+ accountingStrategyDetailOrderService.updateById(prepared.getTariff());
- @Override
- public List<IcbcAdminSubOrderVO> queryIcbcAdminSubOrders(String orderCode) {
- TChargingOrder order = loadIcbcAdminOrder(orderCode, true);
- List<TChargingOrderShareRecord> records = chargingOrderShareRecordMapper.selectList(
- new LambdaQueryWrapper<TChargingOrderShareRecord>()
- .eq(TChargingOrderShareRecord::getChargingOrderId, order.getId())
- .eq(TChargingOrderShareRecord::getPayChannel, "ICBC")
- .eq(TChargingOrderShareRecord::getDelFlag, false)
- .orderByAsc(TChargingOrderShareRecord::getId));
- List<IcbcAdminSubOrderVO> result = new ArrayList<>();
- for (TChargingOrderShareRecord record : records) {
- IcbcAdminSubOrderVO item = buildIcbcAdminSubOrderVO(record);
- if (!Boolean.TRUE.equals(record.getNeedOnlineShare())) {
- item.setQueryStatus("SKIP");
- item.setErrorMessage(record.getFailReason());
- result.add(item);
- continue;
- }
- try {
- IcbcSubOrderQueryReq query = IcbcAdminFundOperationSupport.buildSubOrderQueryRequest(order, record);
- item.applyQuery(requireFeignData(icbcPaymentClient.querySubOrder(query), "工行子订单查询失败"));
- } catch (Exception e) {
- item.setQueryStatus("FAIL");
- item.setErrorMessage(e.getMessage());
- }
- result.add(item);
- }
- return result;
- }
+ TChargingGun gun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
+ TChargingPile pile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData();
+ TransactionRecordMessageVO record = prepared.getRecord();
+ record.setCharging_gun_code(gun == null ? null : gun.getCode());
+ record.setCharging_pile_code(pile == null ? null : pile.getCode());
+ if (Integer.valueOf(2).equals(order.getStatus())) {
+ TChargingOrder charging = new TChargingOrder();
+ charging.setId(order.getId());
+ charging.setStatus(3);
+ charging.setStartTime(LocalDateTime.now().minusSeconds(1));
+ this.updateById(charging);
+ }
+ R settlement = chargingOrderSettlementExecutor.settle(record);
+ if (R.isError(settlement)) {
+ throw new ServiceException(StringUtils.hasLength(settlement.getMsg()) ? settlement.getMsg() : "模拟结算失败");
+ }
+ return buildSimulationVO(this.getById(order.getId()));
+ }
- @Override
- public IcbcSubOrderRefundResp refundIcbcAdminSubOrder(IcbcAdminFundOperationReq request) {
- if (request == null || request.getShareRecordId() == null) {
- throw new ServiceException("请选择需要退款的分账子订单");
- }
- TChargingOrder order = loadIcbcAdminOrder(request.getOrderCode(), true);
- TChargingOrderShareRecord shareRecord = chargingOrderShareRecordMapper.selectById(request.getShareRecordId());
- if (shareRecord == null || !order.getId().equals(shareRecord.getChargingOrderId())) {
- throw new ServiceException("分账记录不属于当前订单");
- }
- BigDecimal amount;
- try {
- amount = IcbcAdminFundOperationSupport.requireAmount(request.getAmount());
- } catch (IllegalArgumentException e) {
- throw new ServiceException(e.getMessage());
- }
- if (shareRecord.getShareAmount() != null && amount.compareTo(shareRecord.getShareAmount()) > 0) {
- throw new ServiceException("分账退款金额不能超过分账金额" + shareRecord.getShareAmount().toPlainString() + "元");
- }
- RLock lock = redissonClient.getLock("icbcAdminFund:order:" + order.getCode());
- if (!lock.tryLock()) {
- throw new ServiceException("该分账子订单正在退款,请勿重复提交");
- }
- try {
- String suffix = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
- RBucket<String> pendingRefund = redissonClient.getBucket("icbcAdminFund:pending:sub:" + shareRecord.getId());
- String generatedToken = "ICBCSUBREFUND" + suffix + ":ICBCSUBREFUNDNO" + suffix;
- String pendingValue = pendingRefund.get();
- boolean reusingPending = StringUtils.hasLength(pendingValue);
- String operationToken;
- try {
- operationToken = IcbcAdminFundOperationSupport.resolveRefundNo(pendingValue, amount, generatedToken);
- } catch (IllegalArgumentException e) {
- throw new ServiceException(e.getMessage());
- }
- String[] refundNumbers = operationToken.split(":", 2);
- if (refundNumbers.length != 2) {
- throw new ServiceException("工行分账退款幂等记录格式错误");
- }
- IcbcSubOrderRefundReq refundRequest;
- try {
- refundRequest = IcbcAdminFundOperationSupport.buildSubOrderRefundRequest(
- order, shareRecord, amount, refundNumbers[0], refundNumbers[1]);
- } catch (IllegalArgumentException e) {
- throw new ServiceException(e.getMessage());
- }
- if (!reusingPending) {
- pendingRefund.set(IcbcAdminFundOperationSupport.buildPendingRefundValue(operationToken, amount));
- }
- IcbcSubOrderRefundResp response = requireFeignData(
- icbcPaymentClient.refundSubOrder(refundRequest), "工行分账退款调用失败");
- if (IcbcAdminFundOperationSupport.shouldClearPendingRefund(
- reusingPending, response.getStatus(), isDefinitiveIcbcResponse(response.getRawResponse()))) {
- pendingRefund.delete();
- }
- return response;
- } finally {
- if (lock.isHeldByCurrentThread()) {
- lock.unlock();
- }
- }
- }
+ private TChargingOrder findSimulationOrder(Long userId, Integer gunId) {
+ TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>()
+ .eq(TChargingOrder::getAppUserId, userId)
+ .eq(TChargingOrder::getChargingGunId, gunId)
+ .eq(TChargingOrder::getRechargePaymentStatus, 2)
+ .in(TChargingOrder::getStatus, Arrays.asList(2, 3, 4))
+ .eq(TChargingOrder::getDelFlag, 0)
+ .isNull(TChargingOrder::getRefundStatus)
+ .orderByDesc(TChargingOrder::getId)
+ .last("limit 1"));
+ if (order == null) {
+ throw new ServiceException("当前枪没有属于你的可模拟已支付订单");
+ }
+ return order;
+ }
- private TChargingOrder loadIcbcAdminOrder(String orderCode, boolean requireLocalPaid) {
- if (!StringUtils.hasLength(orderCode)) {
- throw new ServiceException("订单号不能为空");
- }
- TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>()
- .eq(TChargingOrder::getCode, orderCode)
- .eq(TChargingOrder::getDelFlag, 0)
- .last("limit 1"));
- try {
- if (requireLocalPaid) {
- IcbcAdminFundOperationSupport.validateOrder(order);
- } else {
- IcbcAdminFundOperationSupport.validateIcbcOrder(order);
- }
- } catch (IllegalArgumentException e) {
- throw new ServiceException(e.getMessage());
- }
- return order;
- }
+ private ChargingSimulationVO buildSimulationVO(TChargingOrder order) {
+ ChargingSimulationVO result = new ChargingSimulationVO();
+ result.setOrderId(order.getId());
+ result.setOrderCode(order.getCode());
+ result.setOrderStatus(order.getStatus());
+ result.setPaymentMode(ChargingSimulationSupport.paymentMode(order));
+ result.setPayMethod(order.getPayMethod());
+ result.setRechargePaymentType(order.getRechargePaymentType());
+ result.setSourceName(order.getSourceName());
+ result.setRechargeAmount(order.getRechargeAmount());
+ result.setChargeAmount(order.getChargeAmount());
+ result.setAvailableAmount(ChargingSimulationSupport.availableAmount(order));
+ result.setBalancePayAmount(order.getBalancePayAmount());
+ result.setThirdPayAmount(order.getThirdPayAmount());
+ result.setElectricityFee(order.getElectrovalence());
+ result.setServiceFee(order.getServiceCharge());
+ result.setPaymentAmount(order.getPaymentAmount());
+ result.setRefundAmount(order.getRefundAmount());
+ result.setBalanceRefundAmount(order.getBalanceRefundAmount());
+ result.setThirdRefundAmount(order.getThirdRefundAmount());
+ result.setRefundStatus(order.getRefundStatus());
+ result.setIcbcOrderId(order.getRechargeSerialNumber());
+ TChargingOrderShareRecord shareRecord = chargingOrderShareRecordMapper.selectOne(
+ new LambdaQueryWrapper<TChargingOrderShareRecord>()
+ .eq(TChargingOrderShareRecord::getChargingOrderId, order.getId())
+ .eq(TChargingOrderShareRecord::getPayChannel, "ICBC")
+ .eq(TChargingOrderShareRecord::getDelFlag, false)
+ .orderByDesc(TChargingOrderShareRecord::getId)
+ .last("limit 1"));
+ if (shareRecord == null) {
+ shareRecord = chargingOrderShareRecordMapper.selectOne(
+ new LambdaQueryWrapper<TChargingOrderShareRecord>()
+ .eq(TChargingOrderShareRecord::getChargingOrderId, order.getId())
+ .eq(TChargingOrderShareRecord::getDelFlag, false)
+ .orderByDesc(TChargingOrderShareRecord::getId)
+ .last("limit 1"));
+ }
+ if (shareRecord != null) {
+ result.setShareAmount(shareRecord.getShareAmount());
+ result.setShareStatus(shareRecord.getOnlineShareStatus());
+ result.setSubOrderId(shareRecord.getSubOrderId());
+ result.setSubOrderSeq(shareRecord.getSubOrderSeq());
+ result.setSubOrderTrxid(shareRecord.getSubOrderTrxid());
+ }
+ return result;
+ }
- private String extractIcbcOrderId(IcbcPaymentResp payment) {
- try {
- JSONObject response = JSON.parseObject(payment.getRawResponse());
- String orderId = response == null ? null : response.getString("order_id");
- if (StringUtils.hasLength(orderId)) {
- return orderId;
- }
- } catch (Exception ignored) {
- }
- throw new ServiceException("工行支付查询未返回真实order_id,禁止退款");
- }
+ @Override
+ public IcbcPaymentResp queryIcbcAdminPayment(String orderCode) {
+ TChargingOrder order = loadIcbcAdminOrder(orderCode, false);
+ return requireFeignData(icbcPaymentClient.query(order.getCode()), "工行支付查询失败");
+ }
- private boolean isDefinitiveIcbcResponse(String rawResponse) {
- if (!StringUtils.hasLength(rawResponse)) {
- return false;
- }
- try {
- JSONObject response = JSON.parseObject(rawResponse);
- return response != null && (response.containsKey("returnCode") || response.containsKey("return_code"));
- } catch (Exception ignored) {
- return false;
- }
- }
-
- private IcbcAdminSubOrderVO buildIcbcAdminSubOrderVO(TChargingOrderShareRecord record) {
- IcbcAdminSubOrderVO item = new IcbcAdminSubOrderVO();
- item.setShareRecordId(record.getId());
- item.setOrderCode(record.getChargingOrderCode());
- item.setShareAmount(record.getShareAmount());
- item.setOnlineShareStatus(record.getOnlineShareStatus());
- item.setSubOrderId(record.getSubOrderId());
- item.setSubMerId(record.getSubMerId());
- item.setSubMerPrtclNo(record.getSubMerPrtclNo());
- item.setOriTrxDate(record.getOriTrxDate());
- item.setBankOrderId(record.getIcbcOrderId());
- item.setSubOrderSeq(record.getSubOrderSeq());
- item.setSubOrderTrxid(record.getSubOrderTrxid());
- return item;
- }
-
- private <T> T requireFeignData(R<T> result, String message) {
- if (result == null || R.isError(result) || result.getData() == null) {
- throw new ServiceException(result != null && StringUtils.hasLength(result.getMsg()) ? result.getMsg() : message);
- }
- return result.getData();
- }
-
-
- /**
- * 支付成功后的回调处理逻辑
- *
- * @param paymentType 支付方式:1=微信,2=支付宝
- * @param out_trade_no 业务流水号
- * @param transaction_id 三方支付流水号
- * @param attach 附加数据
- * @return
- */
@Transactional
- @Override
- public AjaxResult chargingOrderCallback(Integer paymentType, String out_trade_no, String transaction_id, String attach) {
- TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, out_trade_no));
- if (chargingOrder == null) {
- return AjaxResult.error("支付回调订单不存在");
- }
- return completeChargingOrderPayment(chargingOrder, transaction_id);
- }
+ @Override
+ public AjaxResult confirmIcbcPayment(String orderCode) {
+ if (!StringUtils.hasLength(orderCode)) {
+ return AjaxResult.error("订单号不能为空");
+ }
+ Long userId = tokenService.getLoginUserApplet().getUserId();
+ TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>()
+ .eq(TChargingOrder::getCode, orderCode)
+ .eq(TChargingOrder::getAppUserId, userId)
+ .eq(TChargingOrder::getDelFlag, 0)
+ .last("limit 1"));
+ if (order == null) {
+ return AjaxResult.error("支付订单不存在");
+ }
+ if (Integer.valueOf(2).equals(order.getRechargePaymentStatus())) {
+ return AjaxResult.success(Collections.singletonMap("confirmed", true));
+ }
+ if (!isIcbcOrder(order)) {
+ return AjaxResult.error("当前订单不是工行支付订单");
+ }
- /**
- * 完成订单支付状态和充电额度初始化。
- * 本地余额、白名单零元支付直接传入刚保存的订单,避免读写分离下立即回查读不到新订单。
- */
- AjaxResult completeChargingOrderPayment(TChargingOrder chargingOrder, String transactionId) {
- if (chargingOrder.getRechargePaymentStatus() == 2) {
- if (isIcbcOrder(chargingOrder) && StringUtils.hasLength(transactionId)
- && !transactionId.equals(chargingOrder.getRechargeSerialNumber())) {
- chargingOrder.setRechargeSerialNumber(transactionId);
- this.updateById(chargingOrder);
- }
- return AjaxResult.success();
- }
- LocalDateTime callbackPayTime = LocalDateTime.now();
- int claimed = this.baseMapper.update(null, new LambdaUpdateWrapper<TChargingOrder>()
- .eq(TChargingOrder::getId, chargingOrder.getId())
- .eq(TChargingOrder::getRechargePaymentStatus, 1)
- .set(TChargingOrder::getRechargePaymentStatus, 2)
- .set(TChargingOrder::getRechargeSerialNumber, transactionId)
- .set(TChargingOrder::getStatus, 2)
- .set(TChargingOrder::getPayTime, callbackPayTime));
- if (claimed == 0) {
- return AjaxResult.success();
- }
- if (isBalancePayMode(chargingOrder.getPayMethod())
- && money(chargingOrder.getThirdPayAmount()).compareTo(BigDecimal.ZERO) > 0
- && money(chargingOrder.getBalancePayAmount()).compareTo(BigDecimal.ZERO) > 0) {
- TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
- if (money(appUser.getBalance()).compareTo(money(chargingOrder.getBalancePayAmount())) < 0) {
- throw new RuntimeException("余额不足,支付回调处理失败");
- }
- changeUserBalance(chargingOrder.getAppUserId(), money(chargingOrder.getBalancePayAmount()).negate());
- recordBalanceConsume(chargingOrder, money(chargingOrder.getBalancePayAmount()));
- }
- chargingOrder.setRechargePaymentStatus(2);
- chargingOrder.setRechargeSerialNumber(transactionId);
- chargingOrder.setStatus(2);
- chargingOrder.setPayTime(callbackPayTime);
-
- //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据
- PreChargeCheck preChargeCheck = new PreChargeCheck();
- preChargeCheck.setElectronicLockLock(false);
- preChargeCheck.setInsulationTesting(false);
- preChargeCheck.setSecureConnectionDetection(false);
- preChargeCheck.setStartupSuccess(1);
- preChargeCheck.setStartCommandSent(false);
+ R<IcbcPaymentResp> queryResult = icbcPaymentClient.query(orderCode);
+ IcbcPaymentResp payment = queryResult == null ? null : queryResult.getData();
+ if (!IcbcAdminFundOperationSupport.isBankPaid(payment)
+ || payment == null
+ || !orderCode.equals(payment.getOrderId())
+ || !StringUtils.hasLength(payment.getTradeNo())) {
+ return AjaxResult.success(Collections.singletonMap("confirmed", false));
+ }
+ AjaxResult callbackResult = chargingOrderCallback(1, orderCode, payment.getTradeNo(), "1");
+ if (!Integer.valueOf(200).equals(callbackResult.get("code"))) {
+ return callbackResult;
+ }
+ return AjaxResult.success(Collections.singletonMap("confirmed", true));
+ }
+
+ @Override
+ public IcbcRefundResp refundIcbcAdminPayment(IcbcAdminFundOperationReq request) {
+ if (request == null) {
+ throw new ServiceException("请求参数不能为空");
+ }
+ TChargingOrder order = loadIcbcAdminOrder(request.getOrderCode(), false);
+ BigDecimal amount;
+ try {
+ amount = IcbcAdminFundOperationSupport.requireAmount(request.getAmount());
+ } catch (IllegalArgumentException e) {
+ throw new ServiceException(e.getMessage());
+ }
+ BigDecimal paidAmount = money(order.getThirdPayAmount()).compareTo(BigDecimal.ZERO) > 0
+ ? money(order.getThirdPayAmount()) : money(order.getRechargeAmount());
+ if (amount.compareTo(paidAmount) > 0) {
+ throw new ServiceException("退款金额不能超过订单第三方支付金额" + paidAmount.toPlainString() + "元");
+ }
+ RLock lock = redissonClient.getLock("icbcAdminFund:order:" + order.getCode());
+ if (!lock.tryLock()) {
+ throw new ServiceException("该订单正在执行工行资金操作,请勿重复提交");
+ }
+ try {
+ IcbcPaymentResp payment = requireFeignData(icbcPaymentClient.query(order.getCode()), "工行支付查询失败");
+ if (!IcbcAdminFundOperationSupport.isBankPaid(payment)) {
+ throw new ServiceException("工行查询未确认该订单支付成功,禁止退款");
+ }
+ String orderId = extractIcbcOrderId(payment);
+ order.setRechargeSerialNumber(orderId);
+ // 仅用于本次请求通过退款参数校验,不更新本地订单状态。
+ order.setRechargePaymentStatus(2);
+ RBucket<String> pendingRefund = redissonClient.getBucket("icbcAdminFund:pending:main:" + order.getCode());
+ String generatedRefundNo = "ICBCADMINREFUND" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
+ String pendingValue = pendingRefund.get();
+ boolean reusingPending = StringUtils.hasLength(pendingValue);
+ String refundNo;
+ try {
+ refundNo = IcbcAdminFundOperationSupport.resolveRefundNo(pendingValue, amount, generatedRefundNo);
+ } catch (IllegalArgumentException e) {
+ throw new ServiceException(e.getMessage());
+ }
+ IcbcRefundReq refundRequest = IcbcAdminFundOperationSupport.buildRefundRequest(order, amount, refundNo);
+ if (!reusingPending) {
+ pendingRefund.set(IcbcAdminFundOperationSupport.buildPendingRefundValue(refundNo, amount));
+ }
+ IcbcRefundResp response = requireFeignData(icbcPaymentClient.refund(refundRequest), "工行退款调用失败");
+ if (IcbcAdminFundOperationSupport.shouldClearPendingRefund(
+ reusingPending, response.getStatus(), isDefinitiveIcbcResponse(response.getRawResponse()))) {
+ pendingRefund.delete();
+ }
+ return response;
+ } finally {
+ if (lock.isHeldByCurrentThread()) {
+ lock.unlock();
+ }
+ }
+ }
+
+ @Override
+ public List<IcbcAdminSubOrderVO> queryIcbcAdminSubOrders(String orderCode) {
+ TChargingOrder order = loadIcbcAdminOrder(orderCode, true);
+ List<TChargingOrderShareRecord> records = chargingOrderShareRecordMapper.selectList(
+ new LambdaQueryWrapper<TChargingOrderShareRecord>()
+ .eq(TChargingOrderShareRecord::getChargingOrderId, order.getId())
+ .eq(TChargingOrderShareRecord::getPayChannel, "ICBC")
+ .eq(TChargingOrderShareRecord::getDelFlag, false)
+ .orderByAsc(TChargingOrderShareRecord::getId));
+ List<IcbcAdminSubOrderVO> result = new ArrayList<>();
+ for (TChargingOrderShareRecord record : records) {
+ IcbcAdminSubOrderVO item = buildIcbcAdminSubOrderVO(record);
+ if (!Boolean.TRUE.equals(record.getNeedOnlineShare())) {
+ item.setQueryStatus("SKIP");
+ item.setErrorMessage(record.getFailReason());
+ result.add(item);
+ continue;
+ }
+ try {
+ IcbcSubOrderQueryReq query = IcbcAdminFundOperationSupport.buildSubOrderQueryRequest(order, record);
+ item.applyQuery(requireFeignData(icbcPaymentClient.querySubOrder(query), "工行子订单查询失败"));
+ } catch (Exception e) {
+ item.setQueryStatus("FAIL");
+ item.setErrorMessage(e.getMessage());
+ }
+ result.add(item);
+ }
+ return result;
+ }
+
+ @Override
+ public IcbcSubOrderRefundResp refundIcbcAdminSubOrder(IcbcAdminFundOperationReq request) {
+ if (request == null || request.getShareRecordId() == null) {
+ throw new ServiceException("请选择需要退款的分账子订单");
+ }
+ TChargingOrder order = loadIcbcAdminOrder(request.getOrderCode(), true);
+ TChargingOrderShareRecord shareRecord = chargingOrderShareRecordMapper.selectById(request.getShareRecordId());
+ if (shareRecord == null || !order.getId().equals(shareRecord.getChargingOrderId())) {
+ throw new ServiceException("分账记录不属于当前订单");
+ }
+ BigDecimal amount;
+ try {
+ amount = IcbcAdminFundOperationSupport.requireAmount(request.getAmount());
+ } catch (IllegalArgumentException e) {
+ throw new ServiceException(e.getMessage());
+ }
+ if (shareRecord.getShareAmount() != null && amount.compareTo(shareRecord.getShareAmount()) > 0) {
+ throw new ServiceException("分账退款金额不能超过分账金额" + shareRecord.getShareAmount().toPlainString() + "元");
+ }
+ RLock lock = redissonClient.getLock("icbcAdminFund:order:" + order.getCode());
+ if (!lock.tryLock()) {
+ throw new ServiceException("该分账子订单正在退款,请勿重复提交");
+ }
+ try {
+ String suffix = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
+ RBucket<String> pendingRefund = redissonClient.getBucket("icbcAdminFund:pending:sub:" + shareRecord.getId());
+ String generatedToken = "ICBCSUBREFUND" + suffix + ":ICBCSUBREFUNDNO" + suffix;
+ String pendingValue = pendingRefund.get();
+ boolean reusingPending = StringUtils.hasLength(pendingValue);
+ String operationToken;
+ try {
+ operationToken = IcbcAdminFundOperationSupport.resolveRefundNo(pendingValue, amount, generatedToken);
+ } catch (IllegalArgumentException e) {
+ throw new ServiceException(e.getMessage());
+ }
+ String[] refundNumbers = operationToken.split(":", 2);
+ if (refundNumbers.length != 2) {
+ throw new ServiceException("工行分账退款幂等记录格式错误");
+ }
+ IcbcSubOrderRefundReq refundRequest;
+ try {
+ refundRequest = IcbcAdminFundOperationSupport.buildSubOrderRefundRequest(
+ order, shareRecord, amount, refundNumbers[0], refundNumbers[1]);
+ } catch (IllegalArgumentException e) {
+ throw new ServiceException(e.getMessage());
+ }
+ if (!reusingPending) {
+ pendingRefund.set(IcbcAdminFundOperationSupport.buildPendingRefundValue(operationToken, amount));
+ }
+ IcbcSubOrderRefundResp response = requireFeignData(
+ icbcPaymentClient.refundSubOrder(refundRequest), "工行分账退款调用失败");
+ if (IcbcAdminFundOperationSupport.shouldClearPendingRefund(
+ reusingPending, response.getStatus(), isDefinitiveIcbcResponse(response.getRawResponse()))) {
+ pendingRefund.delete();
+ }
+ return response;
+ } finally {
+ if (lock.isHeldByCurrentThread()) {
+ lock.unlock();
+ }
+ }
+ }
+
+ private TChargingOrder loadIcbcAdminOrder(String orderCode, boolean requireLocalPaid) {
+ if (!StringUtils.hasLength(orderCode)) {
+ throw new ServiceException("订单号不能为空");
+ }
+ TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>()
+ .eq(TChargingOrder::getCode, orderCode)
+ .eq(TChargingOrder::getDelFlag, 0)
+ .last("limit 1"));
+ try {
+ if (requireLocalPaid) {
+ IcbcAdminFundOperationSupport.validateOrder(order);
+ } else {
+ IcbcAdminFundOperationSupport.validateIcbcOrder(order);
+ }
+ } catch (IllegalArgumentException e) {
+ throw new ServiceException(e.getMessage());
+ }
+ return order;
+ }
+
+ private String extractIcbcOrderId(IcbcPaymentResp payment) {
+ try {
+ JSONObject response = JSON.parseObject(payment.getRawResponse());
+ String orderId = response == null ? null : response.getString("order_id");
+ if (StringUtils.hasLength(orderId)) {
+ return orderId;
+ }
+ } catch (Exception ignored) {
+ }
+ throw new ServiceException("工行支付查询未返回真实order_id,禁止退款");
+ }
+
+ private boolean isDefinitiveIcbcResponse(String rawResponse) {
+ if (!StringUtils.hasLength(rawResponse)) {
+ return false;
+ }
+ try {
+ JSONObject response = JSON.parseObject(rawResponse);
+ return response != null && (response.containsKey("returnCode") || response.containsKey("return_code"));
+ } catch (Exception ignored) {
+ return false;
+ }
+ }
+
+ private IcbcAdminSubOrderVO buildIcbcAdminSubOrderVO(TChargingOrderShareRecord record) {
+ IcbcAdminSubOrderVO item = new IcbcAdminSubOrderVO();
+ item.setShareRecordId(record.getId());
+ item.setOrderCode(record.getChargingOrderCode());
+ item.setShareAmount(record.getShareAmount());
+ item.setOnlineShareStatus(record.getOnlineShareStatus());
+ item.setSubOrderId(record.getSubOrderId());
+ item.setSubMerId(record.getSubMerId());
+ item.setSubMerPrtclNo(record.getSubMerPrtclNo());
+ item.setOriTrxDate(record.getOriTrxDate());
+ item.setBankOrderId(record.getIcbcOrderId());
+ item.setSubOrderSeq(record.getSubOrderSeq());
+ item.setSubOrderTrxid(record.getSubOrderTrxid());
+ return item;
+ }
+
+ private <T> T requireFeignData(R<T> result, String message) {
+ if (result == null || R.isError(result) || result.getData() == null) {
+ throw new ServiceException(result != null && StringUtils.hasLength(result.getMsg()) ? result.getMsg() : message);
+ }
+ return result.getData();
+ }
+
+
+ /**
+ * 支付成功后的回调处理逻辑
+ *
+ * @param paymentType 支付方式:1=微信,2=支付宝
+ * @param out_trade_no 业务流水号
+ * @param transaction_id 三方支付流水号
+ * @param attach 附加数据
+ * @return
+ */
+ @Transactional
+ @Override
+ public AjaxResult chargingOrderCallback(Integer paymentType, String out_trade_no, String transaction_id, String attach) {
+ TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, out_trade_no));
+ if (chargingOrder == null) {
+ return AjaxResult.error("支付回调订单不存在");
+ }
+ return completeChargingOrderPayment(chargingOrder, transaction_id);
+ }
+
+ /**
+ * 完成订单支付状态和充电额度初始化。
+ * 本地余额、白名单零元支付直接传入刚保存的订单,避免读写分离下立即回查读不到新订单。
+ */
+ AjaxResult completeChargingOrderPayment(TChargingOrder chargingOrder, String transactionId) {
+ if (chargingOrder.getRechargePaymentStatus() == 2) {
+ if (isIcbcOrder(chargingOrder) && StringUtils.hasLength(transactionId)
+ && !transactionId.equals(chargingOrder.getRechargeSerialNumber())) {
+ chargingOrder.setRechargeSerialNumber(transactionId);
+ this.updateById(chargingOrder);
+ }
+ return AjaxResult.success();
+ }
+ LocalDateTime callbackPayTime = LocalDateTime.now();
+ int claimed = this.baseMapper.update(null, new LambdaUpdateWrapper<TChargingOrder>()
+ .eq(TChargingOrder::getId, chargingOrder.getId())
+ .eq(TChargingOrder::getRechargePaymentStatus, 1)
+ .set(TChargingOrder::getRechargePaymentStatus, 2)
+ .set(TChargingOrder::getRechargeSerialNumber, transactionId)
+ .set(TChargingOrder::getStatus, 2)
+ .set(TChargingOrder::getPayTime, callbackPayTime));
+ if (claimed == 0) {
+ return AjaxResult.success();
+ }
+ if (isBalancePayMode(chargingOrder.getPayMethod())
+ && money(chargingOrder.getThirdPayAmount()).compareTo(BigDecimal.ZERO) > 0
+ && money(chargingOrder.getBalancePayAmount()).compareTo(BigDecimal.ZERO) > 0) {
+ TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
+ if (money(appUser.getBalance()).compareTo(money(chargingOrder.getBalancePayAmount())) < 0) {
+ throw new RuntimeException("余额不足,支付回调处理失败");
+ }
+ changeUserBalance(chargingOrder.getAppUserId(), money(chargingOrder.getBalancePayAmount()).negate());
+ recordBalanceConsume(chargingOrder, money(chargingOrder.getBalancePayAmount()));
+ }
+ chargingOrder.setRechargePaymentStatus(2);
+ chargingOrder.setRechargeSerialNumber(transactionId);
+ chargingOrder.setStatus(2);
+ chargingOrder.setPayTime(callbackPayTime);
+
+ //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据
+ PreChargeCheck preChargeCheck = new PreChargeCheck();
+ preChargeCheck.setElectronicLockLock(false);
+ preChargeCheck.setInsulationTesting(false);
+ preChargeCheck.setSecureConnectionDetection(false);
+ preChargeCheck.setStartupSuccess(1);
+ preChargeCheck.setStartCommandSent(false);
preChargeCheck.setAddTime(chargingOrder.getReservationTime() != null ? chargingOrder.getReservationTime() : LocalDateTime.now());
- String key = "AQJC_" + chargingOrder.getChargingGunId();
- redisService.setCacheObject(key, preChargeCheck, 24L, TimeUnit.HOURS);
-
- //根据当前充值的金额和计费模板算出充电的金额
- BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
- BigDecimal rechargeAmount1 = new BigDecimal(rechargeAmount.toString());
- SimpleDateFormat sdf = new SimpleDateFormat("HHmm");
- Long now = Long.valueOf(sdf.format(new Date()));
- Long nowTimeMillis = System.currentTimeMillis();
- //根据支付金额,获取出使用的计费策略明细
- //计算电费金额和服务费
- BigDecimal serviceCharge = BigDecimal.ZERO;
- BigDecimal discountAmount = BigDecimal.ZERO;
- BigDecimal discount = chargingOrder.getVipDiscount();
- //先根据额定功率计算出每秒充电度数,然后计算出支付金额能充多少度电
- TChargingGun tChargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
- //1秒充电度数
- BigDecimal s_degrees = tChargingGun.getRatedPower().divide(new BigDecimal(3600), 6, RoundingMode.HALF_EVEN);
-
- TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
- //判断会员是否还有充电优惠次数,计算会员优惠的折扣金额
- if (!isWhitelistOrder(chargingOrder) && null != appUser.getVipId() && isEffectiveVipDiscount(discount)) {
- GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
- getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
- getAppUserVipDetail.setVipId(appUser.getVipId());
- TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
- if (null != data && data.getChargeNum() != null && data.getChargeNum() > 0) {
- //计算折扣
- List<AccountingStrategyDetailOrder> list = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
- list.get(list.size() - 1).setEndTime("23:59");
- //将数据叠加两份,处理跨天的情况
- list.addAll(list);
- boolean sta = false;
- for (AccountingStrategyDetailOrder accountingStrategyDetailOrder : list) {
- Integer start = Integer.valueOf(accountingStrategyDetailOrder.getStartTime().replaceAll(":", ""));
- Integer end = Integer.valueOf(accountingStrategyDetailOrder.getEndTime().replaceAll(":", ""));
- String[] split = accountingStrategyDetailOrder.getEndTime().split(":");
- if (sta || (now >= start && now < end)) {
- sta = true;
-
- Calendar end_calendar = Calendar.getInstance();
- end_calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0]));
- end_calendar.set(Calendar.MINUTE, Integer.valueOf(split[1]));
- //到此策略结束的秒数
- if (null == nowTimeMillis) {
- String[] split1 = accountingStrategyDetailOrder.getStartTime().split(":");
- Calendar start_calendar = Calendar.getInstance();
- start_calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0]));
- start_calendar.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
- nowTimeMillis = start_calendar.getTimeInMillis();
- }
- //间隔秒数
- long m = (end_calendar.getTimeInMillis() - nowTimeMillis) / 1000;
- //每秒需要支付的服务费金额
- BigDecimal total_until = accountingStrategyDetailOrder.getElectrovalence().add(accountingStrategyDetailOrder.getServiceCharge());
- BigDecimal s_total_amount = s_degrees.multiply(total_until);
- //每秒需要支付的服务费金额
- BigDecimal s_server_amount = s_degrees.multiply(accountingStrategyDetailOrder.getServiceCharge());
- //计算剩余金额能充多长时间的电
- long times = rechargeAmount1.divide(s_total_amount, 0, RoundingMode.DOWN).longValue();
- if (times > m) {
- //充电时间跨度两个计费策略,需要继续对下一个策略进行计算
- serviceCharge = serviceCharge.add(s_server_amount.multiply(new BigDecimal(m)));
- rechargeAmount1 = rechargeAmount1.subtract(s_total_amount.multiply(new BigDecimal(m)));
- nowTimeMillis = null;
- } else {
- serviceCharge = serviceCharge.add(s_server_amount.multiply(new BigDecimal(times)));
- break;
- }
- }
- }
- discountAmount = serviceCharge.multiply(BigDecimal.ONE.subtract(discount));
+ String key = "AQJC_" + chargingOrder.getChargingGunId();
+ redisService.setCacheObject(key, preChargeCheck, 24L, TimeUnit.HOURS);
- //计算会员最大优惠金额
- TVip vip = getVipSnapshot(data, appUser.getVipId());
- BigDecimal maximumDeduction = vip == null ? null : vip.getMaximumDeduction();
- //普通会员有最高优惠限制
- if (vip != null && Integer.valueOf(1).equals(vip.getType()) && maximumDeduction != null
- && maximumDeduction.compareTo(BigDecimal.ZERO) >= 0
- && discountAmount.compareTo(maximumDeduction) > 0) {
- discountAmount = maximumDeduction;
- }
- discountAmount = discountAmount.setScale(4, RoundingMode.HALF_EVEN);
- if (shouldConsumeVipDiscount(discountAmount)) {
- data.setChargeNum(data.getChargeNum() - 1);
- appUserVipDetailClient.updateAppUserVipDetail(data);
- }
- }
- }
-
- //机子上显示的金额为用户充值的金额+会员折扣金额
- BigDecimal account_balance = chargingOrder.getRechargeAmount().add(discountAmount).setScale(4, RoundingMode.HALF_EVEN);
- chargingOrder.setChargeAmount(account_balance);
- chargingOrder.setVipDiscountAmount(discountAmount);
- this.updateById(chargingOrder);
-
-
- return AjaxResult.success();
- }
+ //根据当前充值的金额和计费模板算出充电的金额
+ BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
+ BigDecimal rechargeAmount1 = new BigDecimal(rechargeAmount.toString());
+ SimpleDateFormat sdf = new SimpleDateFormat("HHmm");
+ Long now = Long.valueOf(sdf.format(new Date()));
+ Long nowTimeMillis = System.currentTimeMillis();
+ //根据支付金额,获取出使用的计费策略明细
+ //计算电费金额和服务费
+ BigDecimal serviceCharge = BigDecimal.ZERO;
+ BigDecimal discountAmount = BigDecimal.ZERO;
+ BigDecimal discount = chargingOrder.getVipDiscount();
+ //先根据额定功率计算出每秒充电度数,然后计算出支付金额能充多少度电
+ TChargingGun tChargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+ //1秒充电度数
+ BigDecimal s_degrees = tChargingGun.getRatedPower().divide(new BigDecimal(3600), 6, RoundingMode.HALF_EVEN);
+
+ TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
+ //判断会员是否还有充电优惠次数,计算会员优惠的折扣金额
+ if (!isWhitelistOrder(chargingOrder) && null != appUser.getVipId() && isEffectiveVipDiscount(discount)) {
+ GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
+ getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
+ getAppUserVipDetail.setVipId(appUser.getVipId());
+ TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
+ if (null != data && data.getChargeNum() != null && data.getChargeNum() > 0) {
+ //计算折扣
+ List<AccountingStrategyDetailOrder> list = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
+ list.get(list.size() - 1).setEndTime("23:59");
+ //将数据叠加两份,处理跨天的情况
+ list.addAll(list);
+ boolean sta = false;
+ for (AccountingStrategyDetailOrder accountingStrategyDetailOrder : list) {
+ Integer start = Integer.valueOf(accountingStrategyDetailOrder.getStartTime().replaceAll(":", ""));
+ Integer end = Integer.valueOf(accountingStrategyDetailOrder.getEndTime().replaceAll(":", ""));
+ String[] split = accountingStrategyDetailOrder.getEndTime().split(":");
+ if (sta || (now >= start && now < end)) {
+ sta = true;
+
+ Calendar end_calendar = Calendar.getInstance();
+ end_calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0]));
+ end_calendar.set(Calendar.MINUTE, Integer.valueOf(split[1]));
+ //到此策略结束的秒数
+ if (null == nowTimeMillis) {
+ String[] split1 = accountingStrategyDetailOrder.getStartTime().split(":");
+ Calendar start_calendar = Calendar.getInstance();
+ start_calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0]));
+ start_calendar.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
+ nowTimeMillis = start_calendar.getTimeInMillis();
+ }
+ //间隔秒数
+ long m = (end_calendar.getTimeInMillis() - nowTimeMillis) / 1000;
+ //每秒需要支付的服务费金额
+ BigDecimal total_until = accountingStrategyDetailOrder.getElectrovalence().add(accountingStrategyDetailOrder.getServiceCharge());
+ BigDecimal s_total_amount = s_degrees.multiply(total_until);
+ //每秒需要支付的服务费金额
+ BigDecimal s_server_amount = s_degrees.multiply(accountingStrategyDetailOrder.getServiceCharge());
+ //计算剩余金额能充多长时间的电
+ long times = rechargeAmount1.divide(s_total_amount, 0, RoundingMode.DOWN).longValue();
+ if (times > m) {
+ //充电时间跨度两个计费策略,需要继续对下一个策略进行计算
+ serviceCharge = serviceCharge.add(s_server_amount.multiply(new BigDecimal(m)));
+ rechargeAmount1 = rechargeAmount1.subtract(s_total_amount.multiply(new BigDecimal(m)));
+ nowTimeMillis = null;
+ } else {
+ serviceCharge = serviceCharge.add(s_server_amount.multiply(new BigDecimal(times)));
+ break;
+ }
+ }
+ }
+ discountAmount = serviceCharge.multiply(BigDecimal.ONE.subtract(discount));
+
+ //计算会员最大优惠金额
+ TVip vip = getVipSnapshot(data, appUser.getVipId());
+ BigDecimal maximumDeduction = vip == null ? null : vip.getMaximumDeduction();
+ //普通会员有最高优惠限制
+ if (vip != null && Integer.valueOf(1).equals(vip.getType()) && maximumDeduction != null
+ && maximumDeduction.compareTo(BigDecimal.ZERO) >= 0
+ && discountAmount.compareTo(maximumDeduction) > 0) {
+ discountAmount = maximumDeduction;
+ }
+ discountAmount = discountAmount.setScale(4, RoundingMode.HALF_EVEN);
+ if (shouldConsumeVipDiscount(discountAmount)) {
+ data.setChargeNum(data.getChargeNum() - 1);
+ appUserVipDetailClient.updateAppUserVipDetail(data);
+ }
+ }
+ }
+
+ //机子上显示的金额为用户充值的金额+会员折扣金额
+ BigDecimal account_balance = chargingOrder.getRechargeAmount().add(discountAmount).setScale(4, RoundingMode.HALF_EVEN);
+ chargingOrder.setChargeAmount(account_balance);
+ chargingOrder.setVipDiscountAmount(discountAmount);
+ this.updateById(chargingOrder);
- private AjaxResult validateReservation(Site site, LocalDateTime reservationTime) {
- if (reservationTime == null) {
- return null;
- }
- if (!Integer.valueOf(1).equals(site.getSupportOrder())) {
- return AjaxResult.error("该电站暂不支持预约充电");
- }
- if (reservationTime.isBefore(LocalDateTime.now().minusMinutes(1))) {
- return AjaxResult.error("预约时间不能早于当前时间");
- }
- if (site.getReservationAheadMinute() != null && site.getReservationAheadMinute() >= 0
- && reservationTime.isAfter(LocalDateTime.now().plusMinutes(site.getReservationAheadMinute()))) {
- return AjaxResult.error("预约时间不能超过最早可提前预约时限");
- }
- List<ReservationTimeRange> ranges;
- try {
- ranges = ReservationTimeRangeSupport.parse(site.getReservationTimeRanges(),
- site.getReservationStartTime(), site.getReservationEndTime());
- } catch (IllegalArgumentException e) {
- return AjaxResult.error("电站预约时段配置不正确");
- }
- if (ranges.isEmpty()) {
- return AjaxResult.error("电站尚未配置预约时段");
- }
- if (!ReservationTimeRangeSupport.contains(ranges, reservationTime.toLocalTime())) {
- return AjaxResult.error("预约时间不在允许预约时段内("
- + ReservationTimeRangeSupport.describe(ranges) + ")");
- }
- return null;
- }
+ return AjaxResult.success();
+ }
- private boolean isSafetyCheckPassed(PreChargeCheck check) {
- return check != null
- && Boolean.TRUE.equals(check.getElectronicLockLock())
- && Boolean.TRUE.equals(check.getInsulationTesting())
- && Boolean.TRUE.equals(check.getSecureConnectionDetection());
- }
- private String normalizeVin(String vin) {
- return StringUtils.hasLength(vin) ? vin.replaceAll("\\s+", "").toUpperCase(Locale.ROOT) : null;
- }
+ private AjaxResult validateReservation(Site site, LocalDateTime reservationTime) {
+ if (reservationTime == null) {
+ return null;
+ }
+ if (!Integer.valueOf(1).equals(site.getSupportOrder())) {
+ return AjaxResult.error("该电站暂不支持预约充电");
+ }
+ if (reservationTime.isBefore(LocalDateTime.now().minusMinutes(1))) {
+ return AjaxResult.error("预约时间不能早于当前时间");
+ }
+ if (site.getReservationAheadMinute() != null && site.getReservationAheadMinute() >= 0
+ && reservationTime.isAfter(LocalDateTime.now().plusMinutes(site.getReservationAheadMinute()))) {
+ return AjaxResult.error("预约时间不能超过最早可提前预约时限");
+ }
+ List<ReservationTimeRange> ranges;
+ try {
+ ranges = ReservationTimeRangeSupport.parse(site.getReservationTimeRanges(),
+ site.getReservationStartTime(), site.getReservationEndTime());
+ } catch (IllegalArgumentException e) {
+ return AjaxResult.error("电站预约时段配置不正确");
+ }
+ if (ranges.isEmpty()) {
+ return AjaxResult.error("电站尚未配置预约时段");
+ }
+ if (!ReservationTimeRangeSupport.contains(ranges, reservationTime.toLocalTime())) {
+ return AjaxResult.error("预约时间不在允许预约时段内("
+ + ReservationTimeRangeSupport.describe(ranges) + ")");
+ }
+ return null;
+ }
- private boolean vinMatches(String expectedVin, String actualVin) {
- if (!StringUtils.hasLength(expectedVin) || !StringUtils.hasLength(actualVin)) {
- return false;
- }
- return expectedVin.equals(actualVin)
- || expectedVin.equals(new StringBuilder(actualVin).reverse().toString());
- }
+ private boolean isSafetyCheckPassed(PreChargeCheck check) {
+ return check != null
+ && Boolean.TRUE.equals(check.getElectronicLockLock())
+ && Boolean.TRUE.equals(check.getInsulationTesting())
+ && Boolean.TRUE.equals(check.getSecureConnectionDetection());
+ }
- @Scheduled(fixedDelay = 5000L)
- public void startDueReservationOrders() {
- LocalDateTime now = LocalDateTime.now();
- List<TChargingOrder> dueOrders = this.list(new LambdaQueryWrapper<TChargingOrder>()
- .eq(TChargingOrder::getRechargePaymentStatus, 2)
- .eq(TChargingOrder::getStatus, 2)
- .eq(TChargingOrder::getOrderSource, 1)
- .eq(TChargingOrder::getDelFlag, 0)
- .isNotNull(TChargingOrder::getReservationTime)
- .ge(TChargingOrder::getReservationTime, now.minusHours(24))
- .le(TChargingOrder::getReservationTime, now)
- .orderByAsc(TChargingOrder::getReservationTime)
- .last("limit 100"));
- for (TChargingOrder order : dueOrders) {
- try {
- PreChargeCheck check = redisService.getCacheObject("AQJC_" + order.getChargingGunId());
- if (isSafetyCheckPassed(check)) {
- startChargingAfterSafety(order, check);
- }
- } catch (Exception e) {
- log.error("预约充电到时启动失败,orderCode={}", order.getCode(), e);
- }
- }
- }
+ private String normalizeVin(String vin) {
+ return StringUtils.hasLength(vin) ? vin.replaceAll("\\s+", "").toUpperCase(Locale.ROOT) : null;
+ }
- private void startChargingAfterSafety(TChargingOrder chargingOrder, PreChargeCheck check) {
- RLock lock = redissonClient.getLock("START_AFTER_SAFETY:" + chargingOrder.getId());
- try {
- if (!lock.tryLock(1, 10, TimeUnit.SECONDS)) {
- return;
- }
- TChargingOrder latest = this.getById(chargingOrder.getId());
- if (latest == null || latest.getStatus() != 2 || Boolean.TRUE.equals(check.getStartCommandSent())) {
- return;
- }
- if (!ReservationOrderSupport.isStartDue(latest.getReservationTime(), LocalDateTime.now())) {
- return;
- }
- TChargingGun gun = chargingGunClient.getChargingGunById(latest.getChargingGunId()).getData();
- TChargingPile pile = chargingPileClient.getChargingPileById(gun.getChargingPileId()).getData();
- String actualVin = normalizeVin(check.getActualVin());
- String expectedVin = normalizeVin(latest.getExpectedVin());
- if (Integer.valueOf(1).equals(pile.getVinFlag())
- && !vinMatches(expectedVin, actualVin)) {
- check.setStartupSuccess(3);
- check.setFailureCause(9);
- latest.setActualVin(actualVin);
- this.updateById(latest);
- redisService.setCacheObject("AQJC_" + latest.getChargingGunId(), check, 24L, TimeUnit.HOURS);
- refund(latest.getCode());
- return;
- }
- PlatformStartCharging command = new PlatformStartCharging();
- command.setTransaction_serial_number(latest.getCode());
- command.setCharging_pile_code(pile.getCode());
- command.setCharging_gun_code(gun.getCode());
- command.setCard_number(latest.getId().toString());
- command.setAccount_balance(latest.getChargeAmount());
- check.setStartCommandSent(true);
- latest.setActualVin(actualVin);
- this.updateById(latest);
- redisService.setCacheObject("AQJC_" + latest.getChargingGunId(), check, 24L, TimeUnit.HOURS);
- log.info(latest.getCode() + ":安全检测及VIN校验通过,下发启动充电命令:" + command);
- sendMessageClient.platformStartCharging(command);
- ScheduledExecutorService resultScheduler = Executors.newScheduledThreadPool(1);
- resultScheduler.scheduleAtFixedRate(() -> {
- if (timingDetection(latest.getId())) {
- resultScheduler.shutdown();
- }
- }, 10, 1, TimeUnit.SECONDS);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- throw new ServiceException("启动充电锁等待被中断");
- } finally {
- if (lock.isHeldByCurrentThread()) {
- lock.unlock();
- }
- }
- }
+ private boolean vinMatches(String expectedVin, String actualVin) {
+ if (!StringUtils.hasLength(expectedVin) || !StringUtils.hasLength(actualVin)) {
+ return false;
+ }
+ return expectedVin.equals(actualVin)
+ || expectedVin.equals(new StringBuilder(actualVin).reverse().toString());
+ }
- /**
- * 定时检测mongodb数据库数据
- *
- * @param id
- * @return
- */
- public boolean timingDetection(Long id) {
- TChargingOrder chargingOrder = this.getById(id);
- if (chargingOrder.getStatus() != 2) {
- return true;
- }
- String code = chargingOrder.getCode();
- String key = "AQJC_" + chargingOrder.getChargingGunId();
- List<PlatformStartChargingReply> data = platformStartChargingReplyService.getPlatformStartChargingReply(code);
- log.info(code + ":-------------------开始检查调起充电结果-------------------" + data.toString());
- Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0);
- if (!data.isEmpty()) {
- PlatformStartChargingReply platformStartChargingReply = data.get(1);
- Integer startup_result = platformStartChargingReply.getStartup_result();
- Integer failure_cause = platformStartChargingReply.getFailure_cause();
- Integer counter = counter_map.get(code);
- PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
- //15分钟内还未插枪则取消充电,退回金额。
- if (failure_cause == 5 && (null == counter || counter < 60 * 15)) {
- counter = (null == counter ? 0 : counter) + 1;
- counter_map.put(code, counter);
- //启动失败
- preChargeCheck1.setStartupSuccess(3);
- preChargeCheck1.setFailureCause(failure_cause);
- redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
- return false;
- }
-
- //清除计时器中的无效数据
- counter_map.remove(code);
- if (0 == startup_result) {
- //启动失败
- preChargeCheck1.setStartupSuccess(3);
- preChargeCheck1.setFailureCause(failure_cause);
- chargingOrder.setStatus(2);
- chargingOrder.setEndMode(0);
- this.updateById(chargingOrder);
- //启动失败后取消订单,退款操作
- refund(code);
- } else {
- //启动成功
- preChargeCheck1.setStartupSuccess(2);
- chargingOrder.setStatus(3);
- chargingOrder.setStartTime(LocalDateTime.now());
- this.updateById(chargingOrder);
- }
+ @Scheduled(fixedDelay = 5000L)
+ public void startDueReservationOrders() {
+ LocalDateTime now = LocalDateTime.now();
+ List<TChargingOrder> dueOrders = this.list(new LambdaQueryWrapper<TChargingOrder>()
+ .eq(TChargingOrder::getRechargePaymentStatus, 2)
+ .eq(TChargingOrder::getStatus, 2)
+ .eq(TChargingOrder::getOrderSource, 1)
+ .eq(TChargingOrder::getDelFlag, 0)
+ .isNotNull(TChargingOrder::getReservationTime)
+ .ge(TChargingOrder::getReservationTime, now.minusHours(24))
+ .le(TChargingOrder::getReservationTime, now)
+ .orderByAsc(TChargingOrder::getReservationTime)
+ .last("limit 100"));
+ for (TChargingOrder order : dueOrders) {
+ try {
+ PreChargeCheck check = redisService.getCacheObject("AQJC_" + order.getChargingGunId());
+ if (isSafetyCheckPassed(check)) {
+ startChargingAfterSafety(order, check);
+ }
+ } catch (Exception e) {
+ log.error("预约充电到时启动失败,orderCode={}", order.getCode(), e);
+ }
+ }
+ }
- redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
- //推送三方平台订单状态
- if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
- tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
- }
- ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
- threadPoolExecutor.execute(()->{
- if (chargingOrder.getStatus() == 3) {
- //推送监管平台订单状态
- ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
- BeanUtils.copyProperties(chargingOrder, chargingOrderVo);
- chargingMessageClient.pushOrderStatus(chargingOrderVo);
- }
- //推送成都监管
- NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
- vo.setOrderCode(chargingOrder.getCode());
- vo.setChargingGunId(chargingOrder.getChargingGunId());
- chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
- });
- return true;
- } else {
- PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
- UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getDataByOrderCode(code, "desc");
- if(null != uploadRealTimeMonitoringData){
- //启动成功
- preChargeCheck1.setStartupSuccess(2);
- chargingOrder.setStatus(3);
- chargingOrder.setStartTime(LocalDateTime.now());
- this.updateById(chargingOrder);
- redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
+ private void startChargingAfterSafety(TChargingOrder chargingOrder, PreChargeCheck check) {
+ RLock lock = redissonClient.getLock("START_AFTER_SAFETY:" + chargingOrder.getId());
+ try {
+ if (!lock.tryLock(1, 10, TimeUnit.SECONDS)) {
+ return;
+ }
+ TChargingOrder latest = this.getById(chargingOrder.getId());
+ if (latest == null || latest.getStatus() != 2 || Boolean.TRUE.equals(check.getStartCommandSent())) {
+ return;
+ }
+ if (!ReservationOrderSupport.isStartDue(latest.getReservationTime(), LocalDateTime.now())) {
+ return;
+ }
+ TChargingGun gun = chargingGunClient.getChargingGunById(latest.getChargingGunId()).getData();
+ TChargingPile pile = chargingPileClient.getChargingPileById(gun.getChargingPileId()).getData();
+ String actualVin = normalizeVin(check.getActualVin());
+ String expectedVin = normalizeVin(latest.getExpectedVin());
+ if (Integer.valueOf(1).equals(pile.getVinFlag())
+ && !vinMatches(expectedVin, actualVin)) {
+ check.setStartupSuccess(3);
+ check.setFailureCause(9);
+ latest.setActualVin(actualVin);
+ this.updateById(latest);
+ redisService.setCacheObject("AQJC_" + latest.getChargingGunId(), check, 24L, TimeUnit.HOURS);
+ refund(latest.getCode());
+ return;
+ }
+ PlatformStartCharging command = new PlatformStartCharging();
+ command.setTransaction_serial_number(latest.getCode());
+ command.setCharging_pile_code(pile.getCode());
+ command.setCharging_gun_code(gun.getCode());
+ command.setCard_number(latest.getId().toString());
+ command.setAccount_balance(latest.getChargeAmount());
+ check.setStartCommandSent(true);
+ latest.setActualVin(actualVin);
+ this.updateById(latest);
+ redisService.setCacheObject("AQJC_" + latest.getChargingGunId(), check, 24L, TimeUnit.HOURS);
+ log.info(latest.getCode() + ":安全检测及VIN校验通过,下发启动充电命令:" + command);
+ sendMessageClient.platformStartCharging(command);
+ ScheduledExecutorService resultScheduler = Executors.newScheduledThreadPool(1);
+ resultScheduler.scheduleAtFixedRate(() -> {
+ if (timingDetection(latest.getId())) {
+ resultScheduler.shutdown();
+ }
+ }, 10, 1, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new ServiceException("启动充电锁等待被中断");
+ } finally {
+ if (lock.isHeldByCurrentThread()) {
+ lock.unlock();
+ }
+ }
+ }
- //推送三方平台订单状态
- if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
- tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
- }
- ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
- threadPoolExecutor.execute(()->{
- if (chargingOrder.getStatus() == 3) {
- //推送监管平台订单状态
- ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
- BeanUtils.copyProperties(chargingOrder, chargingOrderVo);
- chargingMessageClient.pushOrderStatus(chargingOrderVo);
- }
- //推送成都监管
- NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
- vo.setOrderCode(chargingOrder.getCode());
- vo.setChargingGunId(chargingOrder.getChargingGunId());
- chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
- });
- return true;
- }else{
- Integer counter = boot_failed_map.get(code);
- log.info(code + ":-------------------未上传开启充电结果-------------------" + counter);
- //15分钟内未启动成功,退回金额。
- if (null == counter || counter < 60 * 15) {
- counter = (null == counter ? 0 : counter) + 1;
- boot_failed_map.put(code, counter);
- //启动失败
- preChargeCheck1.setStartupSuccess(1);
- preChargeCheck1.setFailureCause(0);
- redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
- return false;
- }
+ /**
+ * 定时检测mongodb数据库数据
+ *
+ * @param id
+ * @return
+ */
+ public boolean timingDetection(Long id) {
+ TChargingOrder chargingOrder = this.getById(id);
+ if (chargingOrder.getStatus() != 2) {
+ return true;
+ }
+ String code = chargingOrder.getCode();
+ String key = "AQJC_" + chargingOrder.getChargingGunId();
+ List<PlatformStartChargingReply> data = platformStartChargingReplyService.getPlatformStartChargingReply(code);
+ log.info(code + ":-------------------开始检查调起充电结果-------------------" + data.toString());
+ Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0);
+ if (!data.isEmpty()) {
+ PlatformStartChargingReply platformStartChargingReply = data.get(1);
+ Integer startup_result = platformStartChargingReply.getStartup_result();
+ Integer failure_cause = platformStartChargingReply.getFailure_cause();
+ Integer counter = counter_map.get(code);
+ PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
+ //15分钟内还未插枪则取消充电,退回金额。
+ if (failure_cause == 5 && (null == counter || counter < 60 * 15)) {
+ counter = (null == counter ? 0 : counter) + 1;
+ counter_map.put(code, counter);
+ //启动失败
+ preChargeCheck1.setStartupSuccess(3);
+ preChargeCheck1.setFailureCause(failure_cause);
+ redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
+ return false;
+ }
- //清除计时器中的无效数据
- boot_failed_map.remove(code);
- TChargingOrder order = new TChargingOrder();
- order.setId(id);
- order.setAppUserId(chargingOrder.getAppUserId());
- //启动失败
- preChargeCheck1.setStartupSuccess(3);
- preChargeCheck1.setFailureCause(0);
- order.setStatus(2);
- order.setEndMode(0);
- this.updateById(order);
- //启动失败后取消订单,退款操作
- refund(code);
- redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
- //推送三方平台订单状态
- if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
- tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
- }
- ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
- threadPoolExecutor.execute(()->{
- //推送成都监管
- NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
- vo.setOrderCode(chargingOrder.getCode());
- vo.setChargingGunId(chargingOrder.getChargingGunId());
- chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
- });
- return true;
- }
- }
- }
-
-
- /**
- * 修改安全检测数据
- *
- * @param securityDetection
- */
- @Override
- public void securityDetection(SecurityDetectionVO securityDetection) {
- GetChargingGunByCode code = new GetChargingGunByCode();
- code.setCharging_pile_code(securityDetection.getCharging_pile_code());
- code.setCharging_gun_code(securityDetection.getCharging_gun_code());
- TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData();
- PreChargeCheck preChargeCheck1 = redisService.getCacheObject("AQJC_" + chargingGun.getId());
- if (null != preChargeCheck1) {
- preChargeCheck1.setElectronicLockLock(Integer.valueOf(1).equals(securityDetection.getElectronic_lock_lock()));
- preChargeCheck1.setInsulationTesting(Integer.valueOf(0).equals(securityDetection.getNsulation_detection()));
- preChargeCheck1.setSecureConnectionDetection(Integer.valueOf(1).equals(securityDetection.getSecure_connection()));
- preChargeCheck1.setActualVin(normalizeVin(securityDetection.getVin()));
- redisService.setCacheObject("AQJC_" + chargingGun.getId(), preChargeCheck1, 24L, TimeUnit.HOURS);
- if (isSafetyCheckPassed(preChargeCheck1)) {
- TChargingOrder pendingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>()
- .eq(TChargingOrder::getChargingGunId, chargingGun.getId())
- .eq(TChargingOrder::getRechargePaymentStatus, 2)
- .eq(TChargingOrder::getStatus, 2)
- .eq(TChargingOrder::getDelFlag, 0)
- .orderByDesc(TChargingOrder::getCreateTime)
- .last("limit 1"));
- if (pendingOrder != null) {
- startChargingAfterSafety(pendingOrder, preChargeCheck1);
- }
- }
- }
- }
-
- /**
- * 启动充电应答
- *
- * @param message
- */
- @Override
- public void startChargeSuccessfully(PlatformStartChargingReplyMessageVO message) {
- Integer startup_result = message.getStartup_result();
- Integer failure_cause = message.getFailure_cause();
- TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, message.getTransaction_serial_number()));
- if (order.getStatus() != 2) {
- return;
- }
- Site site = siteClient.getSiteByIds(Arrays.asList(order.getSiteId())).getData().get(0);
- String code = order.getCode();
- PreChargeCheck preChargeCheck1 = redisService.getCacheObject("AQJC_" + order.getChargingGunId());
- if (null != preChargeCheck1) {
- preChargeCheck1.setElectronicLockLock(true);
- preChargeCheck1.setInsulationTesting(true);
- preChargeCheck1.setStartupSuccess(1);
- }
- if (0 == startup_result) {
- //启动失败
- preChargeCheck1.setStartupSuccess(3);
- preChargeCheck1.setFailureCause(failure_cause);
- order.setStatus(2);
- order.setEndMode(0);
- this.updateById(order);
- //启动失败后取消订单,退款操作
- refund(code);
- } else {
- //启动成功
- preChargeCheck1.setStartupSuccess(2);
- order.setStatus(3);
- order.setStartTime(LocalDateTime.now());
- this.updateById(order);
- TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
- chargingGun.setStatus(4);
- chargingGunClient.updateChargingGunById(chargingGun);
- if(1 == site.getIsOpenSynchronization()){
- //推送状态给三方平台
- tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 4);
- }
- wxSubscribeMessageService.sendChargeStart(order, site, chargingGun);
- }
- redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS);
-
- if (3 == order.getStatus()) {
- //推送监管平台订单状态
- new Thread(() -> {
- ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
- BeanUtils.copyProperties(order, chargingOrderVo);
- chargingMessageClient.pushOrderStatus(chargingOrderVo);
- }).start();
- }
- //推送三方平台启动充电结果
- if (2 == order.getOrderSource()) {
- StartChargeResult result = new StartChargeResult();
- result.setStartChargeSeq(order.getStartChargeSeq());
- result.setStartChargeSeqStat(3 == order.getStatus() ? 2 : 4);
- result.setConnectorID(order.getChargingGunId().toString());
- result.setStartTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
- Operator operator = operatorClient.getOperatorById(order.getOperatorId()).getData();
- result.setOperatorID(operator.getOperatorId());
- if(1 == site.getIsOpenSynchronization()){
- tcecClient.notificationStartChargeResult(result);
- tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
- }
- }
- }
-
- /**
- * 启动失败后的退款,取消订单
- *
- * @param code
- */
+ //清除计时器中的无效数据
+ counter_map.remove(code);
+ if (0 == startup_result) {
+ //启动失败
+ preChargeCheck1.setStartupSuccess(3);
+ preChargeCheck1.setFailureCause(failure_cause);
+ chargingOrder.setStatus(2);
+ chargingOrder.setEndMode(0);
+ this.updateById(chargingOrder);
+ //启动失败后取消订单,退款操作
+ refund(code);
+ } else {
+ //启动成功
+ preChargeCheck1.setStartupSuccess(2);
+ chargingOrder.setStatus(3);
+ chargingOrder.setStartTime(LocalDateTime.now());
+ this.updateById(chargingOrder);
+ }
+
+ redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
+ //推送三方平台订单状态
+ if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
+ tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
+ }
+ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+ threadPoolExecutor.execute(() -> {
+ if (chargingOrder.getStatus() == 3) {
+ //推送监管平台订单状态
+ ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
+ BeanUtils.copyProperties(chargingOrder, chargingOrderVo);
+ chargingMessageClient.pushOrderStatus(chargingOrderVo);
+ }
+ //推送成都监管
+ NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
+ vo.setOrderCode(chargingOrder.getCode());
+ vo.setChargingGunId(chargingOrder.getChargingGunId());
+ chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
+ });
+ return true;
+ } else {
+ PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
+ UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getDataByOrderCode(code, "desc");
+ if (null != uploadRealTimeMonitoringData) {
+ //启动成功
+ preChargeCheck1.setStartupSuccess(2);
+ chargingOrder.setStatus(3);
+ chargingOrder.setStartTime(LocalDateTime.now());
+ this.updateById(chargingOrder);
+ redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
+
+ //推送三方平台订单状态
+ if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
+ tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
+ }
+ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+ threadPoolExecutor.execute(() -> {
+ if (chargingOrder.getStatus() == 3) {
+ //推送监管平台订单状态
+ ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
+ BeanUtils.copyProperties(chargingOrder, chargingOrderVo);
+ chargingMessageClient.pushOrderStatus(chargingOrderVo);
+ }
+ //推送成都监管
+ NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
+ vo.setOrderCode(chargingOrder.getCode());
+ vo.setChargingGunId(chargingOrder.getChargingGunId());
+ chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
+ });
+ return true;
+ } else {
+ Integer counter = boot_failed_map.get(code);
+ log.info(code + ":-------------------未上传开启充电结果-------------------" + counter);
+ //15分钟内未启动成功,退回金额。
+ if (null == counter || counter < 60 * 15) {
+ counter = (null == counter ? 0 : counter) + 1;
+ boot_failed_map.put(code, counter);
+ //启动失败
+ preChargeCheck1.setStartupSuccess(1);
+ preChargeCheck1.setFailureCause(0);
+ redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
+ return false;
+ }
+
+ //清除计时器中的无效数据
+ boot_failed_map.remove(code);
+ TChargingOrder order = new TChargingOrder();
+ order.setId(id);
+ order.setAppUserId(chargingOrder.getAppUserId());
+ //启动失败
+ preChargeCheck1.setStartupSuccess(3);
+ preChargeCheck1.setFailureCause(0);
+ order.setStatus(2);
+ order.setEndMode(0);
+ this.updateById(order);
+ //启动失败后取消订单,退款操作
+ refund(code);
+ redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
+ //推送三方平台订单状态
+ if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
+ tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
+ }
+ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+ threadPoolExecutor.execute(() -> {
+ //推送成都监管
+ NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
+ vo.setOrderCode(chargingOrder.getCode());
+ vo.setChargingGunId(chargingOrder.getChargingGunId());
+ chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
+ });
+ return true;
+ }
+ }
+ }
+
+
+ /**
+ * 修改安全检测数据
+ *
+ * @param securityDetection
+ */
+ @Override
+ public void securityDetection(SecurityDetectionVO securityDetection) {
+ GetChargingGunByCode code = new GetChargingGunByCode();
+ code.setCharging_pile_code(securityDetection.getCharging_pile_code());
+ code.setCharging_gun_code(securityDetection.getCharging_gun_code());
+ TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData();
+ PreChargeCheck preChargeCheck1 = redisService.getCacheObject("AQJC_" + chargingGun.getId());
+ if (null != preChargeCheck1) {
+ preChargeCheck1.setElectronicLockLock(Integer.valueOf(1).equals(securityDetection.getElectronic_lock_lock()));
+ preChargeCheck1.setInsulationTesting(Integer.valueOf(0).equals(securityDetection.getNsulation_detection()));
+ preChargeCheck1.setSecureConnectionDetection(Integer.valueOf(1).equals(securityDetection.getSecure_connection()));
+ preChargeCheck1.setActualVin(normalizeVin(securityDetection.getVin()));
+ redisService.setCacheObject("AQJC_" + chargingGun.getId(), preChargeCheck1, 24L, TimeUnit.HOURS);
+ if (isSafetyCheckPassed(preChargeCheck1)) {
+ TChargingOrder pendingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>()
+ .eq(TChargingOrder::getChargingGunId, chargingGun.getId())
+ .eq(TChargingOrder::getRechargePaymentStatus, 2)
+ .eq(TChargingOrder::getStatus, 2)
+ .eq(TChargingOrder::getDelFlag, 0)
+ .orderByDesc(TChargingOrder::getCreateTime)
+ .last("limit 1"));
+ if (pendingOrder != null) {
+ startChargingAfterSafety(pendingOrder, preChargeCheck1);
+ }
+ }
+ }
+ }
+
+ /**
+ * 启动充电应答
+ *
+ * @param message
+ */
+ @Override
+ public void startChargeSuccessfully(PlatformStartChargingReplyMessageVO message) {
+ Integer startup_result = message.getStartup_result();
+ Integer failure_cause = message.getFailure_cause();
+ TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, message.getTransaction_serial_number()));
+ if (order.getStatus() != 2) {
+ return;
+ }
+ Site site = siteClient.getSiteByIds(Arrays.asList(order.getSiteId())).getData().get(0);
+ String code = order.getCode();
+ PreChargeCheck preChargeCheck1 = redisService.getCacheObject("AQJC_" + order.getChargingGunId());
+ if (null != preChargeCheck1) {
+ preChargeCheck1.setElectronicLockLock(true);
+ preChargeCheck1.setInsulationTesting(true);
+ preChargeCheck1.setStartupSuccess(1);
+ }
+ if (0 == startup_result) {
+ //启动失败
+ preChargeCheck1.setStartupSuccess(3);
+ preChargeCheck1.setFailureCause(failure_cause);
+ order.setStatus(2);
+ order.setEndMode(0);
+ this.updateById(order);
+ //启动失败后取消订单,退款操作
+ refund(code);
+ } else {
+ //启动成功
+ preChargeCheck1.setStartupSuccess(2);
+ order.setStatus(3);
+ order.setStartTime(LocalDateTime.now());
+ this.updateById(order);
+ TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
+ chargingGun.setStatus(4);
+ chargingGunClient.updateChargingGunById(chargingGun);
+ if (1 == site.getIsOpenSynchronization()) {
+ //推送状态给三方平台
+ tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 4);
+ }
+ wxSubscribeMessageService.sendChargeStart(order, site, chargingGun);
+ }
+ redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS);
+
+ if (3 == order.getStatus()) {
+ //推送监管平台订单状态
+ new Thread(() -> {
+ ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
+ BeanUtils.copyProperties(order, chargingOrderVo);
+ chargingMessageClient.pushOrderStatus(chargingOrderVo);
+ }).start();
+ }
+ //推送三方平台启动充电结果
+ if (2 == order.getOrderSource()) {
+ StartChargeResult result = new StartChargeResult();
+ result.setStartChargeSeq(order.getStartChargeSeq());
+ result.setStartChargeSeqStat(3 == order.getStatus() ? 2 : 4);
+ result.setConnectorID(order.getChargingGunId().toString());
+ result.setStartTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ Operator operator = operatorClient.getOperatorById(order.getOperatorId()).getData();
+ result.setOperatorID(operator.getOperatorId());
+ if (1 == site.getIsOpenSynchronization()) {
+ tcecClient.notificationStartChargeResult(result);
+ tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
+ }
+ }
+ }
+
+ /**
+ * 启动失败后的退款,取消订单
+ *
+ * @param code
+ */
@Transactional
- public void refund(String code) {
+ public void refund(String code) {
RLock lock = redissonClient.getLock("REFUND_ORDER_LOCK:" + code);
try {
boolean tryLock = lock.tryLock(30, 30, TimeUnit.SECONDS);
- if(tryLock){
+ if (tryLock) {
log.info(code + ":-------------------充电启动失败,执行退款-------------------");
TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
if (chargingOrder.getOrderSource() == 1 && chargingOrder.getStatus() == 2
&& (chargingOrder.getRefundStatus() == null || chargingOrder.getRefundStatus() != 2)) {
- Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
- BigDecimal rechargeAmount = money(chargingOrder.getRechargeAmount());
- BigDecimal totalRefundAmount = isBalancePayMode(chargingOrder.getPayMethod())
- ? money(chargingOrder.getBalancePayAmount()).add(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP)
- : rechargeAmount;
- // 白名单全部免费启动失败同样只记录预估金额,避免未支付订单进入实际退款流程。
- BigDecimal recordedRefundAmount = isWhitelistAllFreeOrder(chargingOrder) ? rechargeAmount : totalRefundAmount;
- BigDecimal channelRefundAmount = isWhitelistAllFreeOrder(chargingOrder) ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : totalRefundAmount;
+ Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
+ BigDecimal rechargeAmount = money(chargingOrder.getRechargeAmount());
+ BigDecimal totalRefundAmount = isBalancePayMode(chargingOrder.getPayMethod())
+ ? money(chargingOrder.getBalancePayAmount()).add(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP)
+ : rechargeAmount;
+ // 白名单全部免费启动失败同样只记录预估金额,避免未支付订单进入实际退款流程。
+ BigDecimal recordedRefundAmount = isWhitelistAllFreeOrder(chargingOrder) ? rechargeAmount : totalRefundAmount;
+ BigDecimal channelRefundAmount = isWhitelistAllFreeOrder(chargingOrder) ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : totalRefundAmount;
BigDecimal thirdRefundAmount = channelRefundAmount.min(getRefundableThirdPayAmount(chargingOrder)).setScale(2, RoundingMode.HALF_UP);
- BigDecimal balanceRefundAmount = channelRefundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal balanceRefundAmount = channelRefundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
//构建退款明细
TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
@@ -2171,131 +2173,131 @@
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
- }finally {
+ } finally {
lock.unlock();
}
- }
-
+ }
+
@Transactional
- public void refund1(String code, BigDecimal money) {
- log.info(code + ":-------------------充电成功,执行手动退款-------------------");
- TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
- if (chargingOrder.getOrderSource() == 1) {
- BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
- Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
- //构建退款明细
- TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
- chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
- chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + Double.valueOf(Math.random() * 1000).intValue());
- chargingOrderRefund.setRefundAmount(money);
- BigDecimal refundableThirdAmount = getRefundableThirdPayAmount(chargingOrder)
- .subtract(money(chargingOrder.getThirdRefundAmount())).max(BigDecimal.ZERO);
- BigDecimal refundableBalanceAmount = money(chargingOrder.getBalancePayAmount())
- .subtract(money(chargingOrder.getBalanceRefundAmount())).max(BigDecimal.ZERO);
- BigDecimal thirdRefundAmount = money.min(refundableThirdAmount).setScale(2, RoundingMode.HALF_UP);
- BigDecimal balanceRefundAmount = money.subtract(thirdRefundAmount)
- .min(refundableBalanceAmount).setScale(2, RoundingMode.HALF_UP);
- chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
- chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
- chargingOrderRefund.setRefundStatus(1);
- chargingOrderRefund.setPayType(rechargePaymentType);
- chargingOrderRefund.setRefundStatus(1);
- chargingOrderRefund.setCode(code);
- chargingOrderRefund.setRefundTitle("充电完成退款");
- chargingOrderRefund.setRefundContent("充电完成退款");
- chargingOrderRefund.setRefundReason("充电完成退款");
- chargingOrderRefund.setRefundRemark("充电完成退款,手动退款");
- chargingOrderRefund.setRefundTotalAmount(money);
- chargingOrderRefund.setPayAmount(money);
- if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
- chargingOrderRefund.setRefundSerialNumber("BALANCE");
- finishManualChargingRefund(chargingOrder, chargingOrderRefund, money, balanceRefundAmount, thirdRefundAmount);
- return;
- }
- if (isIcbcOrder(chargingOrder)) {
- refundByIcbcAndFinish(chargingOrder, chargingOrderRefund, thirdRefundAmount, "充电完成退款", true,
- money, balanceRefundAmount);
- return;
- }
- if (1 == rechargePaymentType) {
- WxPaymentRefundModel model = new WxPaymentRefundModel();
- model.setOut_trade_no(chargingOrder.getCode());
- model.setOut_refund_no(chargingOrderRefund.getRefundCode());
- model.setReason("充电完成退款");
- model.setNotify_url("/payment/wx/refund/notify");
- WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
- amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
- amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
- amount.setCurrency("CNY");
- model.setAmount(amount);
- R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
- if (200 == orderR.getCode()) {
- chargingOrderRefundService.save(chargingOrderRefund);
- //手续费
- Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount");
- Object refund_fee1 = amount1.get("refund_fee");
- BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
- chargingOrderRefund.setRefundFee(refund_fee);
- chargingOrderRefundService.updateById(chargingOrderRefund);
- }
- }
- if (2 == rechargePaymentType) {
- RefundReq dto = new RefundReq();
- dto.setOutTradeNo(chargingOrder.getCode());
- dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
- dto.setRefundAmount(thirdRefundAmount.toString());
- dto.setRefundReason("充电完成退款");
- RefundResp resp = aliPaymentClient.refund(dto).getData();
- if (null != resp) {
- chargingOrderRefundService.save(chargingOrderRefund);
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
- }
- }
- if (3 == rechargePaymentType) {
- RefundReq dto = new RefundReq();
- dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber());
- dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
- dto.setRefundAmount(thirdRefundAmount.toString());
- dto.setRefundReason("充电完成退款");
- RefundResp resp = h5AliPaymentClient.refund(dto).getData();
- if (null != resp && "10000".equals(resp.getCode())) {
- chargingOrderRefundService.save(chargingOrderRefund);
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
- }
- }
-
- }
- }
-
-
- /**
- * 启动失败后微信退款的回调处理
- *
- * @param out_refund_no
- * @param refund_id
- * @param tradeState
- * @param success_time
- * @return
- */
+ public void refund1(String code, BigDecimal money) {
+ log.info(code + ":-------------------充电成功,执行手动退款-------------------");
+ TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
+ if (chargingOrder.getOrderSource() == 1) {
+ BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
+ Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
+ //构建退款明细
+ TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
+ chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+ chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + Double.valueOf(Math.random() * 1000).intValue());
+ chargingOrderRefund.setRefundAmount(money);
+ BigDecimal refundableThirdAmount = getRefundableThirdPayAmount(chargingOrder)
+ .subtract(money(chargingOrder.getThirdRefundAmount())).max(BigDecimal.ZERO);
+ BigDecimal refundableBalanceAmount = money(chargingOrder.getBalancePayAmount())
+ .subtract(money(chargingOrder.getBalanceRefundAmount())).max(BigDecimal.ZERO);
+ BigDecimal thirdRefundAmount = money.min(refundableThirdAmount).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal balanceRefundAmount = money.subtract(thirdRefundAmount)
+ .min(refundableBalanceAmount).setScale(2, RoundingMode.HALF_UP);
+ chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
+ chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
+ chargingOrderRefund.setRefundStatus(1);
+ chargingOrderRefund.setPayType(rechargePaymentType);
+ chargingOrderRefund.setRefundStatus(1);
+ chargingOrderRefund.setCode(code);
+ chargingOrderRefund.setRefundTitle("充电完成退款");
+ chargingOrderRefund.setRefundContent("充电完成退款");
+ chargingOrderRefund.setRefundReason("充电完成退款");
+ chargingOrderRefund.setRefundRemark("充电完成退款,手动退款");
+ chargingOrderRefund.setRefundTotalAmount(money);
+ chargingOrderRefund.setPayAmount(money);
+ if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
+ chargingOrderRefund.setRefundSerialNumber("BALANCE");
+ finishManualChargingRefund(chargingOrder, chargingOrderRefund, money, balanceRefundAmount, thirdRefundAmount);
+ return;
+ }
+ if (isIcbcOrder(chargingOrder)) {
+ refundByIcbcAndFinish(chargingOrder, chargingOrderRefund, thirdRefundAmount, "充电完成退款", true,
+ money, balanceRefundAmount);
+ return;
+ }
+ if (1 == rechargePaymentType) {
+ WxPaymentRefundModel model = new WxPaymentRefundModel();
+ model.setOut_trade_no(chargingOrder.getCode());
+ model.setOut_refund_no(chargingOrderRefund.getRefundCode());
+ model.setReason("充电完成退款");
+ model.setNotify_url("/payment/wx/refund/notify");
+ WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
+ amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
+ amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
+ amount.setCurrency("CNY");
+ model.setAmount(amount);
+ R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
+ if (200 == orderR.getCode()) {
+ chargingOrderRefundService.save(chargingOrderRefund);
+ //手续费
+ Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount");
+ Object refund_fee1 = amount1.get("refund_fee");
+ BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
+ chargingOrderRefund.setRefundFee(refund_fee);
+ chargingOrderRefundService.updateById(chargingOrderRefund);
+ }
+ }
+ if (2 == rechargePaymentType) {
+ RefundReq dto = new RefundReq();
+ dto.setOutTradeNo(chargingOrder.getCode());
+ dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
+ dto.setRefundAmount(thirdRefundAmount.toString());
+ dto.setRefundReason("充电完成退款");
+ RefundResp resp = aliPaymentClient.refund(dto).getData();
+ if (null != resp) {
+ chargingOrderRefundService.save(chargingOrderRefund);
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
+ }
+ }
+ if (3 == rechargePaymentType) {
+ RefundReq dto = new RefundReq();
+ dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber());
+ dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
+ dto.setRefundAmount(thirdRefundAmount.toString());
+ dto.setRefundReason("充电完成退款");
+ RefundResp resp = h5AliPaymentClient.refund(dto).getData();
+ if (null != resp && "10000".equals(resp.getCode())) {
+ chargingOrderRefundService.save(chargingOrderRefund);
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
+ }
+ }
+
+ }
+ }
+
+
+ /**
+ * 启动失败后微信退款的回调处理
+ *
+ * @param out_refund_no
+ * @param refund_id
+ * @param tradeState
+ * @param success_time
+ * @return
+ */
@Transactional
- public AjaxResult chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time) {
+ public AjaxResult chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time) {
RLock lock = redissonClient.getLock("chargingOrderStartupFailureWxRefund:" + out_refund_no);
try {
boolean tryLock = lock.tryLock(10, 10, TimeUnit.SECONDS);
- if(tryLock){
+ if (tryLock) {
TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no));
if (null == one || one.getRefundStatus() == null || one.getRefundStatus() != 1) {
return AjaxResult.success();
@@ -2328,2181 +2330,2182 @@
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
- }finally {
+ } finally {
lock.unlock();
}
return AjaxResult.success();
- }
-
-
- /**
- * 获取充电中的详情
- *
- * @param id
- * @return
- */
- @Override
- public ChargingDetails getChargingDetails(Integer id) {
- Long userId = tokenService.getLoginUserApplet().getUserId();
- TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, userId).eq(TChargingOrder::getChargingGunId, id)
- .eq(TChargingOrder::getRechargePaymentStatus, 2)
- .in(TChargingOrder::getStatus, Arrays.asList(2, 3, 4))
- .eq(TChargingOrder::getDelFlag, 0)
- .orderByDesc(TChargingOrder::getCreateTime)
- .last(" limit 0, 1"));
- if (null == one || !one.getAppUserId().equals(userId)) {
- return null;
- }
- ChargingDetails chargingDetails = new ChargingDetails();
- chargingDetails.setId(one.getId().toString());
- TChargingGun chargingGun = chargingGunClient.getChargingGunById(id).getData();
- TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData();
- Site site = siteClient.getSiteByIds(Arrays.asList(chargingPile.getSiteId())).getData().get(0);
- chargingDetails.setName(site.getName() + "-" + chargingPile.getName());
- chargingDetails.setCode(one.getCode());
- chargingDetails.setReservationTime(one.getReservationTime());
- boolean reservationPending = ReservationOrderSupport.isPending(
- one.getStatus(), one.getReservationTime(), LocalDateTime.now());
- chargingDetails.setStatus(reservationPending ? 1 : one.getStatus());
- chargingDetails.setChargingCost(one.getResidualAmount());
- UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(one.getCode());
- if (null != data) {
- chargingDetails.setChargeCurrent(data.getOutput_current());
- chargingDetails.setChargeVoltage(data.getOutput_voltage());
- BigDecimal power = data.getOutput_current().multiply(data.getOutput_voltage()).divide(new BigDecimal(1000), new MathContext(4, RoundingMode.HALF_EVEN));
- chargingDetails.setChargePower(power);
- chargingDetails.setCompletionRatio(data.getSoc());
- chargingDetails.setRemainingChargeTime(data.getTime_remaining());
- chargingDetails.setChargedDegrees(data.getCharging_degree());
- Integer h = Integer.valueOf(data.getCumulative_charging_time() / 60);
- Integer m = Integer.valueOf(data.getCumulative_charging_time() % 60);
- chargingDetails.setChargedTime(String.format("%02d", h) + ":" + String.format("%02d", m));
- if (null != one.getAppUserCarId()) {
- TAppUserCar appUserCar = appUserCarClient.getCarById(one.getAppUserCarId().toString()).getData();
- // 续航 = 续航里程 * soc
- BigDecimal multiply = BigDecimal.ZERO;
- if(NumberUtil.isNumber(appUserCar.getEndurance())){
- new BigDecimal(data.getSoc()).divide(new BigDecimal(100)).multiply(new BigDecimal(appUserCar.getEndurance()));
- }
- chargingDetails.setEndurance(multiply.setScale(2, RoundingMode.HALF_EVEN));
- }
- }
- return chargingDetails;
- }
-
-
- /**
- * 停止充电操作
- *
- * @param id 订单id
- * @return
- */
- @Override
- public AjaxResult stopCharging(String id) {
- TChargingOrder order = this.getById(id);
- if (order == null) {
- return AjaxResult.error("充电订单不存在");
- }
- Long userId = tokenService.getLoginUserApplet().getUserId();
- if (!order.getAppUserId().equals(userId)) {
- log.info("【" + order.getCode() + "】停止或取消充电失败,用户权限不足。当前登录用户id:{},订单用户id:{}", userId, order.getAppUserId());
- return AjaxResult.error("权限不足");
- }
- if (ReservationOrderSupport.isPending(order.getStatus(), order.getReservationTime(), LocalDateTime.now())) {
- return cancelPendingReservation(order);
- }
- Integer status = order.getStatus();
- if (status == 4 || status == 5) {
- return AjaxResult.error("不能重复操作");
- }
- if (status != 3) {
- return AjaxResult.error("还未开始充电");
- }
- order.setEndTime(LocalDateTime.now());
- order.setStatus(4);
- order.setEndMode(1);
- this.updateById(order);
- log.info("【" + order.getCode() + "】主动停止充电成功,订单状态已被修改。");
-
- String code1 = order.getCode();
- TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
- //异步线程处理停机
- ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1);
- cachedThreadPool.execute(() -> {
- //调用硬件停止充电,停止成功后开始计算费用退款
- TChargingPile chargingPile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData();
- PlatformStopCharging platformStopCharging = new PlatformStopCharging();
- platformStopCharging.setCharging_pile_code(chargingPile.getCode());
- platformStopCharging.setCharging_gun_code(chargingGun.getCode());
- sendMessageClient.platformStopCharging(platformStopCharging);
- log.info(code1 + ":-------------------远程停止充电请求-------------------");
- log.info(platformStopCharging.toString());
- });
- Site site = siteClient.getSiteByIds(Arrays.asList(order.getSiteId())).getData().get(0);
- //推送三方平台
- if (2 == order.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
- tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
- }
- ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
- threadPoolExecutor.execute(()->{
- //推送成都监管
- NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
- vo.setOrderCode(order.getCode());
- vo.setChargingGunId(order.getChargingGunId());
- chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
- });
- return AjaxResult.success();
- }
+ }
- private AjaxResult cancelPendingReservation(TChargingOrder order) {
- RLock lock = redissonClient.getLock("START_AFTER_SAFETY:" + order.getId());
- boolean locked = false;
- try {
- locked = lock.tryLock(1, 120, TimeUnit.SECONDS);
- if (!locked) {
- return AjaxResult.error("预约订单正在处理中,请稍后重试");
- }
- TChargingOrder latest = this.getById(order.getId());
- if (latest == null || !ReservationOrderSupport.isPending(
- latest.getStatus(), latest.getReservationTime(), LocalDateTime.now())) {
- return AjaxResult.error("预约已到时间或订单状态已变化,无法取消");
- }
- refund(latest.getCode());
- TChargingOrder cancelled = this.getById(latest.getId());
- if (cancelled != null) {
- cancelled.setStatus(-1);
- cancelled.setEndMode(1);
- cancelled.setEndTime(LocalDateTime.now());
- this.updateById(cancelled);
- }
- redisService.deleteObject("AQJC_" + latest.getChargingGunId());
- log.info("【{}】用户取消预约充电,预约时间:{}", latest.getCode(), latest.getReservationTime());
- return AjaxResult.success("预约充电已取消,退款将原路退回");
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- return AjaxResult.error("取消预约被中断,请稍后重试");
- } finally {
- if (locked && lock.isHeldByCurrentThread()) {
- lock.unlock();
- }
- }
- }
-
-
- /**
- * 结束充电后处理用户标签数据
- *
- * @param chargingOrder
- */
- public void editUserTag(TChargingOrder chargingOrder) {
- if (chargingOrder == null || chargingOrder.getAppUserId() == null) {
- return;
- }
- //处理用户标签数据
- R<List<TUserTag>> tagResult = userTagClient.getAllUserTag();
- List<TUserTag> data = tagResult == null ? null : tagResult.getData();
- if (data == null || data.isEmpty()) {
- return;
- }
- //累计充电次数
- List<TUserTag> userTagList1 = data.stream().filter(s -> Integer.valueOf(1).equals(s.getStandardCondition())).collect(Collectors.toList());
- for (TUserTag tUserTag : userTagList1) {
- JSONObject conditions = JSON.parseObject(tUserTag.getConditions());
- Integer times = conditions == null ? null : conditions.getInteger("times");
- if (times == null || times <= 0 || tUserTag.getCreateTime() == null) {
- continue;
- }
- TAppUserTag appUserTag = new TAppUserTag();
- appUserTag.setAppUserId(chargingOrder.getAppUserId());
- appUserTag.setUserTagId(tUserTag.getId());
- TAppUserTag data1 = appUserTagClient.getUserTag(appUserTag).getData();
-
- String start = tUserTag.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
- String end = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
- long count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
- .eq(TChargingOrder::getRechargePaymentStatus, 2).between(TChargingOrder::getStartTime, start, end).eq(TChargingOrder::getDelFlag, 0));
- if (null == data1 && count1 >= times) {
- data1 = new TAppUserTag();
- data1.setAppUserId(chargingOrder.getAppUserId());
- data1.setUserTagId(tUserTag.getId());
- data1.setCreateTime(LocalDateTime.now());
- appUserTagClient.addUserTag(data1);
- }
- }
- //充电频率
- List<TUserTag> userTagList2 = data.stream().filter(s -> Integer.valueOf(2).equals(s.getStandardCondition())).collect(Collectors.toList());
- for (TUserTag tUserTag : userTagList2) {
- TAppUserTag appUserTag = new TAppUserTag();
- appUserTag.setAppUserId(chargingOrder.getAppUserId());
- appUserTag.setUserTagId(tUserTag.getId());
- TAppUserTag data1 = appUserTagClient.getUserTag(appUserTag).getData();
-
- JSONObject conditions = JSON.parseObject(tUserTag.getConditions());
- Integer day = conditions == null ? null : conditions.getInteger("day");
- Integer times = conditions == null ? null : conditions.getInteger("times");
- if (day == null || day <= 0 || times == null || times <= 0) {
- continue;
- }
- LocalDateTime endTime = LocalDateTime.now();
- String start = endTime.minusDays(day).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
- String end = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
- long count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
- .eq(TChargingOrder::getRechargePaymentStatus, 2).between(TChargingOrder::getStartTime, start, end).eq(TChargingOrder::getDelFlag, 0));
- if (null == data1 && count1 >= times) {
- data1 = new TAppUserTag();
- data1.setAppUserId(chargingOrder.getAppUserId());
- data1.setUserTagId(tUserTag.getId());
- data1.setCreateTime(LocalDateTime.now());
- appUserTagClient.addUserTag(data1);
- }
- }
- }
-
-
- /**
- * 推荐奖励(被推荐首单奖励)
- *
- * @param chargingOrder
- */
- public void referralReward(TChargingOrder chargingOrder) {
- //处理推荐奖励(被推荐首单奖励)
- TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
- long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
- .in(TChargingOrder::getStatus, Arrays.asList(4, 5)).eq(TChargingOrder::getDelFlag, 0));
- if (null != appUser.getInviteUserId() && 1 == count) {
- TIntegralRule integralRule = integralRuleClient.getSet().getData();
- String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints();
- JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints);
- Integer num1 = jsonObject.getInteger("num1");
-
- TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData();
- if (null != appUser1.getVipId()) {
- GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
- getAppUserVipDetail.setAppUserId(appUser1.getId());
- getAppUserVipDetail.setVipId(appUser1.getVipId());
- TAppUserVipDetail vipDetail = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
- TVip vip = getVipSnapshot(vipDetail, appUser1.getVipId());
- Integer doubleIntegration = vip == null ? null : vip.getDoubleIntegration();
- //双倍积分
- if (Integer.valueOf(1).equals(doubleIntegration)) {
- num1 *= 2;
- }
-
- }
-
- GetInviteUser query = new GetInviteUser();
- query.setAppUserId(appUser1.getId());
- query.setBeInvitedAppUserId(chargingOrder.getAppUserId());
- TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData();
- if (null == inviteUser) {
- inviteUser = new TInviteUser();
- inviteUser.setAppUserId(appUser1.getId());
- inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId());
- inviteUser.setAward(num1);
- inviteUser.setCreateTime(LocalDateTime.now());
- inviteUserClient.saveInviteUser(inviteUser);
- } else {
- inviteUser.setAward(num1);
- inviteUserClient.updateInviteUser(inviteUser);
- }
- if (num1 > 0) {
- TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
- String code = Double.valueOf(Math.random() * 1000).intValue() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
- appUserIntegralChange.setCode(code);
- appUserIntegralChange.setAppUserId(appUser1.getId());
- appUserIntegralChange.setChangeType(4);
- appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints());
- appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
- appUserIntegralChange.setCreateTime(LocalDateTime.now());
- appUserIntegralChange.setOrderCode(chargingOrder.getCode());
- appUserIntegralChange.setExtension(appUser.getId().toString());
- appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
-
- appUser1.setPoints(appUser1.getPoints() + num1);
- appUserClient.updateAppUser(appUser1);
- }
- }
- }
-
-
- /**
- * 停止充电应答结果处理
- *
- * @param platformStopChargingReply
- */
- @Override
- public void terminateSuccessfulResponse(PlatformStopChargingReplyVO platformStopChargingReply) {
- GetChargingGunByCode code = new GetChargingGunByCode();
- code.setCharging_gun_code(platformStopChargingReply.getCharging_gun_code());
- code.setCharging_pile_code(platformStopChargingReply.getCharging_pile_code());
- TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData();
- TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, chargingGun.getId())
- .orderByDesc(TChargingOrder::getEndTime).eq(TChargingOrder::getRechargePaymentStatus, 2).last(" limit 0, 1"));
- if (null != order && order.getStatus() != 4) {
- return;
- }
-
- String code1 = order.getCode();
- if (0 == platformStopChargingReply.getStop_result()) {
- String failure_cause = "";
- switch (platformStopChargingReply.getFailure_cause()) {
- case 0:
- failure_cause = "无";
- break;
- case 1:
- failure_cause = "设备编号不匹配";
- break;
- case 2:
- failure_cause = "枪未处于充电状态";
- break;
- case 3:
- failure_cause = "其他";
- break;
- }
- log.info(code1 + ":停机失败:订单号:{},失败原因:{}", order.getCode(), failure_cause);
- } else {
- TChargingOrder chargingOrder = new TChargingOrder();
- chargingOrder.setId(order.getId());
- chargingOrder.setAppUserId(order.getAppUserId());
- chargingOrder.setEndMode(1);
- this.updateById(chargingOrder);
- }
- }
-
-
- @Override
- public TCharingOrderVO chargingOrder(ChargingOrderQuery dto) {
- TCharingOrderVO summary = chargingOrderSummary(dto);
- summary.setList(chargingOrderList(dto));
- return summary;
- }
- @Override
- public PageInfo<ChargingOrderVO> chargingOrderList(ChargingOrderQuery dto) {
- String[] timeRange = parseChargingOrderTimeRange(dto);
- String startTime1 = timeRange[0];
- String startTime2 = timeRange[1];
- String endTime1 = timeRange[2];
- String endTime2 = timeRange[3];
- PageInfo<ChargingOrderVO> pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
- Long userId = tokenService.getLoginUser().getUserid();
- SysUser sysUser = sysUserClient.getSysUser(userId).getData();
- Integer roleType = sysUser.getRoleType();
- setChargingOrderAuthSiteIds(dto, sysUser, userId, roleType);
- List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
- fillChargingOrderBalanceIncome(list);
- fillChargingOrderShareIncome(list);
- fillChargingOrderPageExtra(list, dto.getSiteIds(), sysUser, roleType);
- pageInfo.setRecords(list);
- return pageInfo;
- }
+ /**
+ * 获取充电中的详情
+ *
+ * @param id
+ * @return
+ */
+ @Override
+ public ChargingDetails getChargingDetails(Integer id) {
+ Long userId = tokenService.getLoginUserApplet().getUserId();
+ TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, userId).eq(TChargingOrder::getChargingGunId, id)
+ .eq(TChargingOrder::getRechargePaymentStatus, 2)
+ .in(TChargingOrder::getStatus, Arrays.asList(2, 3, 4))
+ .eq(TChargingOrder::getDelFlag, 0)
+ .orderByDesc(TChargingOrder::getCreateTime)
+ .last(" limit 0, 1"));
+ if (null == one || !one.getAppUserId().equals(userId)) {
+ return null;
+ }
+ ChargingDetails chargingDetails = new ChargingDetails();
+ chargingDetails.setId(one.getId().toString());
+ TChargingGun chargingGun = chargingGunClient.getChargingGunById(id).getData();
+ TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData();
+ Site site = siteClient.getSiteByIds(Arrays.asList(chargingPile.getSiteId())).getData().get(0);
+ chargingDetails.setName(site.getName() + "-" + chargingPile.getName());
+ chargingDetails.setCode(one.getCode());
+ chargingDetails.setReservationTime(one.getReservationTime());
+ boolean reservationPending = ReservationOrderSupport.isPending(
+ one.getStatus(), one.getReservationTime(), LocalDateTime.now());
+ chargingDetails.setStatus(reservationPending ? 1 : one.getStatus());
+ chargingDetails.setChargingCost(one.getResidualAmount());
+ UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(one.getCode());
+ if (null != data) {
+ chargingDetails.setChargeCurrent(data.getOutput_current());
+ chargingDetails.setChargeVoltage(data.getOutput_voltage());
+ BigDecimal power = data.getOutput_current().multiply(data.getOutput_voltage()).divide(new BigDecimal(1000), new MathContext(4, RoundingMode.HALF_EVEN));
+ chargingDetails.setChargePower(power);
+ chargingDetails.setCompletionRatio(data.getSoc());
+ chargingDetails.setRemainingChargeTime(data.getTime_remaining());
+ chargingDetails.setChargedDegrees(data.getCharging_degree());
+ Integer h = Integer.valueOf(data.getCumulative_charging_time() / 60);
+ Integer m = Integer.valueOf(data.getCumulative_charging_time() % 60);
+ chargingDetails.setChargedTime(String.format("%02d", h) + ":" + String.format("%02d", m));
+ if (null != one.getAppUserCarId()) {
+ TAppUserCar appUserCar = appUserCarClient.getCarById(one.getAppUserCarId().toString()).getData();
+ // 续航 = 续航里程 * soc
+ BigDecimal multiply = BigDecimal.ZERO;
+ if (NumberUtil.isNumber(appUserCar.getEndurance())) {
+ new BigDecimal(data.getSoc()).divide(new BigDecimal(100)).multiply(new BigDecimal(appUserCar.getEndurance()));
+ }
+ chargingDetails.setEndurance(multiply.setScale(2, RoundingMode.HALF_EVEN));
+ }
+ }
+ return chargingDetails;
+ }
- @Override
- public TCharingOrderVO chargingOrderSummary(ChargingOrderQuery dto) {
- TCharingOrderVO tCharingOrderVO = new TCharingOrderVO();
- fillEmptyChargingOrderSummary(tCharingOrderVO);
- String[] timeRange = parseChargingOrderTimeRange(dto);
- String startTime1 = timeRange[0];
- String startTime2 = timeRange[1];
- String endTime1 = timeRange[2];
- String endTime2 = timeRange[3];
- Long userId = tokenService.getLoginUser().getUserid();
- SysUser sysUser = sysUserClient.getSysUser(userId).getData();
- setChargingOrderAuthSiteIds(dto, sysUser, userId, sysUser.getRoleType());
- Map<String, Object> map = this.baseMapper.chargingOrderBaseSummary(dto, startTime1, startTime2, endTime1, endTime2);
- if (null != map) {
- tCharingOrderVO.setTotal(getSummaryDecimal(map, "total"));
- tCharingOrderVO.setTime(getSummaryLong(map, "time"));
- tCharingOrderVO.setIncome(getSummaryDecimal(map, "income"));
- tCharingOrderVO.setElectronicMoney(getSummaryDecimal(map, "electronicMoney"));
- tCharingOrderVO.setServiceMoney(getSummaryDecimal(map, "serviceMoney"));
- tCharingOrderVO.setWechatIncome(getSummaryDecimal(map, "wechatIncome"));
- tCharingOrderVO.setAlipayIncome(getSummaryDecimal(map, "alipayIncome"));
- tCharingOrderVO.setWhitelistChargingIncome(getSummaryDecimal(map, "whitelistChargingIncome"));
- tCharingOrderVO.setWhitelistRefund(getSummaryDecimal(map, "whitelistRefund"));
- }
- List<Long> summaryOrderIds = this.baseMapper.chargingOrderSummaryOrderIds(dto, startTime1, startTime2, endTime1, endTime2);
- Map<String, Object> shareIncomeMap = getChargingOrderShareIncomeSummary(summaryOrderIds);
- tCharingOrderVO.setPlatformIncomeTotal(getSummaryDecimal(shareIncomeMap, "platformIncomeTotal"));
- tCharingOrderVO.setPartnerIncomeTotal(getSummaryDecimal(shareIncomeMap, "partnerIncomeTotal"));
- Map<String, Object> balanceMap = getExchangeCodeBalanceSummary(summaryOrderIds);
- tCharingOrderVO.setBalanceIncome(getSummaryDecimal(balanceMap, "balanceIncome"));
- tCharingOrderVO.setBalanceGiftIncome(getSummaryDecimal(balanceMap, "balanceGiftIncome"));
- return tCharingOrderVO;
- }
- private String[] parseChargingOrderTimeRange(ChargingOrderQuery dto) {
- String startTime1 = null;
- String startTime2 = null;
- String endTime1 = null;
- String endTime2 = null;
- if (StringUtils.hasLength(dto.getStartTime())) {
- String[] split = dto.getStartTime().split(" - ");
- startTime1 = split[0];
- startTime2 = split[1];
- }
- if (StringUtils.hasLength(dto.getEndTime())) {
- String[] split = dto.getEndTime().split(" - ");
- endTime1 = split[0];
- endTime2 = split[1];
- }
- return new String[]{startTime1, startTime2, endTime1, endTime2};
- }
+ /**
+ * 停止充电操作
+ *
+ * @param id 订单id
+ * @return
+ */
+ @Override
+ public AjaxResult stopCharging(String id) {
+ TChargingOrder order = this.getById(id);
+ if (order == null) {
+ return AjaxResult.error("充电订单不存在");
+ }
+ Long userId = tokenService.getLoginUserApplet().getUserId();
+ if (!order.getAppUserId().equals(userId)) {
+ log.info("【" + order.getCode() + "】停止或取消充电失败,用户权限不足。当前登录用户id:{},订单用户id:{}", userId, order.getAppUserId());
+ return AjaxResult.error("权限不足");
+ }
+ if (ReservationOrderSupport.isPending(order.getStatus(), order.getReservationTime(), LocalDateTime.now())) {
+ return cancelPendingReservation(order);
+ }
+ Integer status = order.getStatus();
+ if (status == 4 || status == 5) {
+ return AjaxResult.error("不能重复操作");
+ }
+ if (status != 3) {
+ return AjaxResult.error("还未开始充电");
+ }
+ order.setEndTime(LocalDateTime.now());
+ order.setStatus(4);
+ order.setEndMode(1);
+ this.updateById(order);
+ log.info("【" + order.getCode() + "】主动停止充电成功,订单状态已被修改。");
- private void fillChargingOrderPageExtra(List<ChargingOrderVO> list, List<Integer> siteIds, SysUser sysUser, Integer roleType) {
- if (list == null || list.isEmpty()) {
- return;
- }
- List<Long> orderIds = list.stream().map(ChargingOrderVO::getId).filter(Objects::nonNull).collect(Collectors.toList());
- List<Integer> pageSiteIds = list.stream().map(ChargingOrderVO::getSiteId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
- List<Integer> pageGunIds = list.stream().map(ChargingOrderVO::getChargingGunId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
- List<TChargingGun> pageGuns = pageGunIds.isEmpty() ? new ArrayList<>() : Optional.ofNullable(chargingGunClient.getChargingGunByIds(pageGunIds).getData()).orElse(new ArrayList<>());
- Map<Integer, TChargingGun> gunMap = pageGuns.stream()
- .filter(item -> item.getId() != null)
- .collect(Collectors.toMap(TChargingGun::getId, item -> item, (a, b) -> a));
- List<TChargingPile> pagePiles = pageSiteIds.isEmpty() ? new ArrayList<>() : Optional.ofNullable(chargingPileClient.getChargingPileBySiteIds(pageSiteIds).getData()).orElse(new ArrayList<>());
- Map<Integer, TChargingPile> pileMap = pagePiles.stream()
- .filter(item -> item.getId() != null)
- .collect(Collectors.toMap(TChargingPile::getId, item -> item, (a, b) -> a));
- List<Site> pageSites = pageSiteIds.isEmpty() ? new ArrayList<>() : Optional.ofNullable(siteClient.getSiteByIds(pageSiteIds).getData()).orElse(new ArrayList<>());
- Map<Integer, Site> siteMap = pageSites.stream()
- .filter(item -> item.getId() != null)
- .collect(Collectors.toMap(Site::getId, item -> item, (a, b) -> a));
- Map<Long, List<TChargingOrderAccountingStrategy>> strategyMap = orderIds.isEmpty() ? new HashMap<>() :
- chargingOrderAccountingStrategyService.lambdaQuery()
- .in(TChargingOrderAccountingStrategy::getChargingOrderId, orderIds)
- .list()
- .stream()
- .collect(Collectors.groupingBy(TChargingOrderAccountingStrategy::getChargingOrderId));
- Map<Integer, Boolean> authRecordMap = new HashMap<>();
- if (roleType == 2 && siteIds != null) {
- for (Integer siteId : siteIds) {
- List<Boolean> permission = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData();
- authRecordMap.put(siteId, permission != null && !permission.isEmpty() && Boolean.TRUE.equals(permission.get(0)));
- }
- }
- for (ChargingOrderVO chargingOrderVO : list) {
- if (roleType == 2 && chargingOrderVO.getSiteId() != null) {
- chargingOrderVO.setAuthRecord(Boolean.TRUE.equals(authRecordMap.get(chargingOrderVO.getSiteId())));
- }
- chargingOrderVO.setCommissionAmount(chargingOrderVO.getRechargeAmount() != null ? chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")) : new BigDecimal("0"));
- chargingOrderVO.setPlatFormMoney(chargingOrderVO.getRechargeAmount() != null ? chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")).setScale(2, BigDecimal.ROUND_DOWN) : new BigDecimal("0"));
- chargingOrderVO.setUid(chargingOrderVO.getId() + "");
- Site site = siteMap.get(chargingOrderVO.getSiteId());
- if (site != null) {
- chargingOrderVO.setSiteName(site.getName());
- }
- TChargingGun gun = gunMap.get(chargingOrderVO.getChargingGunId());
- TChargingPile pile = pileMap.get(chargingOrderVO.getChargingPileId());
- if (pile != null && gun != null) {
- chargingOrderVO.setTerminalName(pile.getName() + "-" + gun.getName());
- }
- List<TChargingOrderAccountingStrategy> strategies = strategyMap.getOrDefault(chargingOrderVO.getId(), new ArrayList<>());
- if (chargingOrderVO.getStartTime() != null && chargingOrderVO.getEndTime() != null) {
- long between = ChronoUnit.SECONDS.between(chargingOrderVO.getStartTime(), chargingOrderVO.getEndTime());
- chargingOrderVO.setChargingSecond(between);
- BigDecimal electronicReduce = strategies.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
- chargingOrderVO.setElectrovalence(electronicReduce);
- BigDecimal serviceReduce = strategies.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
- if (!Objects.equals(chargingOrderVO.getOrderSource(), 2)) {
- chargingOrderVO.setServiceCharge(serviceReduce);
- chargingOrderVO.setSharingAmount(BigDecimal.ZERO);
- } else {
- chargingOrderVO.setServiceCharge(serviceReduce.multiply(new BigDecimal("0.8")));
- chargingOrderVO.setSharingAmount(serviceReduce.multiply(new BigDecimal("0.2")));
- }
- }
- chargingOrderVO.setCount(strategies.size());
- chargingOrderVO.setLicensePlate(chargingOrderVO.getPlateNum());
- }
- }
+ String code1 = order.getCode();
+ TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
+ //异步线程处理停机
+ ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1);
+ cachedThreadPool.execute(() -> {
+ //调用硬件停止充电,停止成功后开始计算费用退款
+ TChargingPile chargingPile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData();
+ PlatformStopCharging platformStopCharging = new PlatformStopCharging();
+ platformStopCharging.setCharging_pile_code(chargingPile.getCode());
+ platformStopCharging.setCharging_gun_code(chargingGun.getCode());
+ sendMessageClient.platformStopCharging(platformStopCharging);
+ log.info(code1 + ":-------------------远程停止充电请求-------------------");
+ log.info(platformStopCharging.toString());
+ });
+ Site site = siteClient.getSiteByIds(Arrays.asList(order.getSiteId())).getData().get(0);
+ //推送三方平台
+ if (2 == order.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
+ tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
+ }
+ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+ threadPoolExecutor.execute(() -> {
+ //推送成都监管
+ NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
+ vo.setOrderCode(order.getCode());
+ vo.setChargingGunId(order.getChargingGunId());
+ chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
+ });
+ return AjaxResult.success();
+ }
- /**
- * 填充充电桩订单列表余额收入,余额收入按真实充值余额统计,赠送余额单独展示。
- */
- private void fillChargingOrderBalanceIncome(List<ChargingOrderVO> list) {
- if (list == null || list.isEmpty()) {
- return;
- }
- List<Long> orderIds = list.stream().map(ChargingOrderVO::getId).filter(Objects::nonNull).collect(Collectors.toList());
- if (orderIds.isEmpty()) {
- return;
- }
- Map<Long, Map<String, Object>> incomeMap = new HashMap<>();
- List<Map<String, Object>> rows = this.baseMapper.exchangeCodeBalanceIncomeByOrderIds(orderIds);
- if (rows != null) {
- for (Map<String, Object> row : rows) {
- Long orderId = getSummaryLong(row, "orderId");
- if (orderId != null) {
- incomeMap.put(orderId, row);
- }
- }
- }
- for (ChargingOrderVO item : list) {
- Map<String, Object> row = incomeMap.get(item.getId());
- item.setBalanceIncome(getSummaryDecimal(row, "balanceIncome"));
- item.setBalanceGiftIncome(getSummaryDecimal(row, "balanceGiftIncome"));
- }
- }
+ private AjaxResult cancelPendingReservation(TChargingOrder order) {
+ RLock lock = redissonClient.getLock("START_AFTER_SAFETY:" + order.getId());
+ boolean locked = false;
+ try {
+ locked = lock.tryLock(1, 120, TimeUnit.SECONDS);
+ if (!locked) {
+ return AjaxResult.error("预约订单正在处理中,请稍后重试");
+ }
+ TChargingOrder latest = this.getById(order.getId());
+ if (latest == null || !ReservationOrderSupport.isPending(
+ latest.getStatus(), latest.getReservationTime(), LocalDateTime.now())) {
+ return AjaxResult.error("预约已到时间或订单状态已变化,无法取消");
+ }
+ refund(latest.getCode());
+ TChargingOrder cancelled = this.getById(latest.getId());
+ if (cancelled != null) {
+ cancelled.setStatus(-1);
+ cancelled.setEndMode(1);
+ cancelled.setEndTime(LocalDateTime.now());
+ this.updateById(cancelled);
+ }
+ redisService.deleteObject("AQJC_" + latest.getChargingGunId());
+ log.info("【{}】用户取消预约充电,预约时间:{}", latest.getCode(), latest.getReservationTime());
+ return AjaxResult.success("预约充电已取消,退款将原路退回");
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ return AjaxResult.error("取消预约被中断,请稍后重试");
+ } finally {
+ if (locked && lock.isHeldByCurrentThread()) {
+ lock.unlock();
+ }
+ }
+ }
- private void setChargingOrderAuthSiteIds(ChargingOrderQuery dto, SysUser sysUser, Long userId, Integer roleType) {
- List<Integer> siteIds = new ArrayList<>();
- if (dto.getSiteId() == null) {
- if (userId != null) {
- List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
- for (GetSiteListDTO datum : data) {
- siteIds.add(datum.getId());
- }
- }
- } else {
- siteIds.add(dto.getSiteId());
- }
- if (siteIds.isEmpty()) {
- siteIds.add(-1);
- } else if (roleType == 2) {
- List<Integer> integers = new ArrayList<>();
- for (Integer siteId : siteIds) {
- List<Boolean> t1 = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData();
- Boolean b = t1.get(1);
- if (b) {
- integers.add(siteId);
- }
- }
- siteIds = integers;
- }
- if (siteIds.isEmpty()) {
- siteIds.add(-1);
- }
- dto.setSiteIds(siteIds);
- }
- /**
- * 查询充电桩订单余额收入明细,余额收入按真实充值余额统计,赠送收入单独展示。
- */
- @Override
- public List<ChargingOrderBalanceIncomeDetailVO> balanceIncomeDetail(ChargingOrderQuery dto) {
- String startTime1 = null;
- String startTime2 = null;
- String endTime1 = null;
- String endTime2 = null;
- if (StringUtils.hasLength(dto.getStartTime())) {
- String[] split = dto.getStartTime().split(" - ");
- startTime1 = split[0];
- startTime2 = split[1];
- }
- if (StringUtils.hasLength(dto.getEndTime())) {
- String[] split = dto.getEndTime().split(" - ");
- endTime1 = split[0];
- endTime2 = split[1];
- }
- if (StringUtils.hasLength(dto.getPhone())) {
- List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
- if (data == null || data.isEmpty()) {
- return new ArrayList<>();
- }
- dto.setUserIds(data);
- }
- Long userId = tokenService.getLoginUser().getUserid();
- SysUser sysUser = sysUserClient.getSysUser(userId).getData();
- setChargingOrderAuthSiteIds(dto, sysUser, userId, sysUser.getRoleType());
- List<Long> orderIds = this.baseMapper.chargingOrderSummaryOrderIds(dto, startTime1, startTime2, endTime1, endTime2);
- if (orderIds == null || orderIds.isEmpty()) {
- return new ArrayList<>();
- }
- Map<Long, ChargingOrderBalanceIncomeDetailVO> detailMap = new LinkedHashMap<>();
- int batchSize = 500;
- for (int i = 0; i < orderIds.size(); i += batchSize) {
- List<Long> batchIds = orderIds.subList(i, Math.min(i + batchSize, orderIds.size()));
- List<ChargingOrderBalanceIncomeDetailVO> batchList = this.baseMapper.exchangeCodeBalanceIncomeDetail(batchIds);
- if (batchList == null || batchList.isEmpty()) {
- continue;
- }
- for (ChargingOrderBalanceIncomeDetailVO item : batchList) {
- Long packageId = item.getPackageId() == null ? 0L : item.getPackageId();
- ChargingOrderBalanceIncomeDetailVO detail = detailMap.get(packageId);
- if (detail == null) {
- detail = new ChargingOrderBalanceIncomeDetailVO();
- detail.setPackageId(item.getPackageId());
- detail.setPackageName(item.getPackageName());
- detail.setBalanceIncome(BigDecimal.ZERO);
- detail.setGiftIncome(BigDecimal.ZERO);
- detailMap.put(packageId, detail);
- }
- detail.setBalanceIncome(detail.getBalanceIncome().add(item.getBalanceIncome() == null ? BigDecimal.ZERO : item.getBalanceIncome()));
- detail.setGiftIncome(detail.getGiftIncome().add(item.getGiftIncome() == null ? BigDecimal.ZERO : item.getGiftIncome()));
- }
- }
- List<ChargingOrderBalanceIncomeDetailVO> result = new ArrayList<>();
- for (ChargingOrderBalanceIncomeDetailVO detail : detailMap.values()) {
- BigDecimal balanceIncome = (detail.getBalanceIncome() == null ? BigDecimal.ZERO : detail.getBalanceIncome()).setScale(2, RoundingMode.HALF_EVEN);
- BigDecimal giftIncome = (detail.getGiftIncome() == null ? BigDecimal.ZERO : detail.getGiftIncome()).setScale(2, RoundingMode.HALF_EVEN);
- if (balanceIncome.compareTo(BigDecimal.ZERO) == 0 && giftIncome.compareTo(BigDecimal.ZERO) == 0) {
- continue;
- }
- detail.setBalanceIncome(balanceIncome);
- detail.setGiftIncome(giftIncome);
- result.add(detail);
- }
- return result;
- }
+ /**
+ * 结束充电后处理用户标签数据
+ *
+ * @param chargingOrder
+ */
+ public void editUserTag(TChargingOrder chargingOrder) {
+ if (chargingOrder == null || chargingOrder.getAppUserId() == null) {
+ return;
+ }
+ //处理用户标签数据
+ R<List<TUserTag>> tagResult = userTagClient.getAllUserTag();
+ List<TUserTag> data = tagResult == null ? null : tagResult.getData();
+ if (data == null || data.isEmpty()) {
+ return;
+ }
+ //累计充电次数
+ List<TUserTag> userTagList1 = data.stream().filter(s -> Integer.valueOf(1).equals(s.getStandardCondition())).collect(Collectors.toList());
+ for (TUserTag tUserTag : userTagList1) {
+ JSONObject conditions = JSON.parseObject(tUserTag.getConditions());
+ Integer times = conditions == null ? null : conditions.getInteger("times");
+ if (times == null || times <= 0 || tUserTag.getCreateTime() == null) {
+ continue;
+ }
+ TAppUserTag appUserTag = new TAppUserTag();
+ appUserTag.setAppUserId(chargingOrder.getAppUserId());
+ appUserTag.setUserTagId(tUserTag.getId());
+ TAppUserTag data1 = appUserTagClient.getUserTag(appUserTag).getData();
- private void fillEmptyChargingOrderSummary(TCharingOrderVO tCharingOrderVO) {
- tCharingOrderVO.setTotal(BigDecimal.ZERO);
- tCharingOrderVO.setTime(0L);
- tCharingOrderVO.setIncome(BigDecimal.ZERO);
- tCharingOrderVO.setElectronicMoney(BigDecimal.ZERO);
- tCharingOrderVO.setServiceMoney(BigDecimal.ZERO);
- tCharingOrderVO.setPlatformIncomeTotal(BigDecimal.ZERO);
- tCharingOrderVO.setPartnerIncomeTotal(BigDecimal.ZERO);
- tCharingOrderVO.setWechatIncome(BigDecimal.ZERO);
- tCharingOrderVO.setAlipayIncome(BigDecimal.ZERO);
- tCharingOrderVO.setBalanceIncome(BigDecimal.ZERO);
- tCharingOrderVO.setBalanceGiftIncome(BigDecimal.ZERO);
- tCharingOrderVO.setWhitelistChargingIncome(BigDecimal.ZERO);
- tCharingOrderVO.setWhitelistRefund(BigDecimal.ZERO);
- }
+ String start = tUserTag.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ String end = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ long count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
+ .eq(TChargingOrder::getRechargePaymentStatus, 2).between(TChargingOrder::getStartTime, start, end).eq(TChargingOrder::getDelFlag, 0));
+ if (null == data1 && count1 >= times) {
+ data1 = new TAppUserTag();
+ data1.setAppUserId(chargingOrder.getAppUserId());
+ data1.setUserTagId(tUserTag.getId());
+ data1.setCreateTime(LocalDateTime.now());
+ appUserTagClient.addUserTag(data1);
+ }
+ }
+ //充电频率
+ List<TUserTag> userTagList2 = data.stream().filter(s -> Integer.valueOf(2).equals(s.getStandardCondition())).collect(Collectors.toList());
+ for (TUserTag tUserTag : userTagList2) {
+ TAppUserTag appUserTag = new TAppUserTag();
+ appUserTag.setAppUserId(chargingOrder.getAppUserId());
+ appUserTag.setUserTagId(tUserTag.getId());
+ TAppUserTag data1 = appUserTagClient.getUserTag(appUserTag).getData();
- /**
- * 汇总充电桩订单余额收入,兑换码使用记录的usedAmount包含赠送余额,SQL中需扣除giftUsedAmount。
- */
- private Map<String, Object> getExchangeCodeBalanceSummary(List<Long> orderIds) {
- Map<String, Object> totalMap = new HashMap<>();
- totalMap.put("balanceIncome", BigDecimal.ZERO);
- totalMap.put("balanceGiftIncome", BigDecimal.ZERO);
- if (orderIds == null || orderIds.isEmpty()) {
- return totalMap;
- }
- BigDecimal balanceIncome = BigDecimal.ZERO;
- BigDecimal balanceGiftIncome = BigDecimal.ZERO;
- int batchSize = 500;
- for (int i = 0; i < orderIds.size(); i += batchSize) {
- List<Long> batchIds = orderIds.subList(i, Math.min(i + batchSize, orderIds.size()));
- Map<String, Object> batchMap = this.baseMapper.exchangeCodeBalanceSummary(batchIds);
- if (batchMap != null) {
- balanceIncome = balanceIncome.add(getSummaryDecimal(batchMap, "balanceIncome"));
- balanceGiftIncome = balanceGiftIncome.add(getSummaryDecimal(batchMap, "balanceGiftIncome"));
- }
- }
- totalMap.put("balanceIncome", balanceIncome);
- totalMap.put("balanceGiftIncome", balanceGiftIncome);
- return totalMap;
- }
+ JSONObject conditions = JSON.parseObject(tUserTag.getConditions());
+ Integer day = conditions == null ? null : conditions.getInteger("day");
+ Integer times = conditions == null ? null : conditions.getInteger("times");
+ if (day == null || day <= 0 || times == null || times <= 0) {
+ continue;
+ }
+ LocalDateTime endTime = LocalDateTime.now();
+ String start = endTime.minusDays(day).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ String end = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ long count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
+ .eq(TChargingOrder::getRechargePaymentStatus, 2).between(TChargingOrder::getStartTime, start, end).eq(TChargingOrder::getDelFlag, 0));
+ if (null == data1 && count1 >= times) {
+ data1 = new TAppUserTag();
+ data1.setAppUserId(chargingOrder.getAppUserId());
+ data1.setUserTagId(tUserTag.getId());
+ data1.setCreateTime(LocalDateTime.now());
+ appUserTagClient.addUserTag(data1);
+ }
+ }
+ }
- private Map<String, Object> getChargingOrderShareIncomeSummary(List<Long> orderIds) {
- Map<String, Object> totalMap = new HashMap<>();
- totalMap.put("platformIncomeTotal", BigDecimal.ZERO);
- totalMap.put("partnerIncomeTotal", BigDecimal.ZERO);
- if (orderIds == null || orderIds.isEmpty()) {
- return totalMap;
- }
- BigDecimal platformIncomeTotal = BigDecimal.ZERO;
- BigDecimal partnerIncomeTotal = BigDecimal.ZERO;
- int batchSize = 500;
- for (int i = 0; i < orderIds.size(); i += batchSize) {
- List<Long> batchIds = orderIds.subList(i, Math.min(i + batchSize, orderIds.size()));
- Map<String, Object> batchMap = this.baseMapper.chargingOrderShareIncomeSummaryByOrderIds(batchIds);
- if (batchMap != null) {
- platformIncomeTotal = platformIncomeTotal.add(getSummaryDecimal(batchMap, "platformIncomeTotal"));
- partnerIncomeTotal = partnerIncomeTotal.add(getSummaryDecimal(batchMap, "partnerIncomeTotal"));
- }
- }
- totalMap.put("platformIncomeTotal", platformIncomeTotal);
- totalMap.put("partnerIncomeTotal", partnerIncomeTotal);
- return totalMap;
- }
- private BigDecimal getSummaryDecimal(Map<String, Object> map, String key) {
- if (map == null) {
- return BigDecimal.ZERO;
- }
- Object value = map.get(key);
- if (value == null) {
- return BigDecimal.ZERO;
- }
- if (value instanceof BigDecimal) {
- return ((BigDecimal) value).setScale(2, RoundingMode.HALF_EVEN);
- }
- if (value instanceof Number) {
- return BigDecimal.valueOf(((Number) value).doubleValue()).setScale(2, RoundingMode.HALF_EVEN);
- }
- return new BigDecimal(value.toString()).setScale(2, RoundingMode.HALF_EVEN);
- }
+ /**
+ * 推荐奖励(被推荐首单奖励)
+ *
+ * @param chargingOrder
+ */
+ public void referralReward(TChargingOrder chargingOrder) {
+ //处理推荐奖励(被推荐首单奖励)
+ TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
+ long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
+ .in(TChargingOrder::getStatus, Arrays.asList(4, 5)).eq(TChargingOrder::getDelFlag, 0));
+ if (null != appUser.getInviteUserId() && 1 == count) {
+ TIntegralRule integralRule = integralRuleClient.getSet().getData();
+ String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints();
+ JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints);
+ Integer num1 = jsonObject.getInteger("num1");
- private Long getSummaryLong(Map<String, Object> map, String key) {
- if (map == null) {
- return 0L;
- }
- Object value = map.get(key);
- if (value == null) {
- return 0L;
- }
- if (value instanceof Number) {
- return ((Number) value).longValue();
- }
- return Long.parseLong(value.toString());
- }
+ TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData();
+ if (null != appUser1.getVipId()) {
+ GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
+ getAppUserVipDetail.setAppUserId(appUser1.getId());
+ getAppUserVipDetail.setVipId(appUser1.getVipId());
+ TAppUserVipDetail vipDetail = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
+ TVip vip = getVipSnapshot(vipDetail, appUser1.getVipId());
+ Integer doubleIntegration = vip == null ? null : vip.getDoubleIntegration();
+ //双倍积分
+ if (Integer.valueOf(1).equals(doubleIntegration)) {
+ num1 *= 2;
+ }
- @Override
- public R<PageInfo<PayOrderDto>> payOrderQuery(PayOrderQueryDto payOrderQueryDto) {
- if (payOrderQueryDto == null) {
- payOrderQueryDto = new PayOrderQueryDto();
- }
- PageInfo<PayOrderDto> pageInfo = new PageInfo<>(payOrderQueryDto.getPageCurr(), payOrderQueryDto.getPageSize());
- // 开票申请没有关联明细时必须返回空结果,不能退化成支付订单全量查询。
- if (payOrderQueryDto.getInvoiceId() != null
- && (payOrderQueryDto.getIds() == null || payOrderQueryDto.getIds().isEmpty())) {
- pageInfo.setRecords(Collections.emptyList());
- return R.ok(pageInfo);
- }
- List<PayOrderDto> list = this.baseMapper.payOrderQuery(pageInfo, payOrderQueryDto);
- if (list == null || list.isEmpty()) {
- pageInfo.setRecords(Collections.emptyList());
- return R.ok(pageInfo);
- }
- for (PayOrderDto payOrderDto : list) {
- if (payOrderDto == null) {
- continue;
- }
- if (Integer.valueOf(2).equals(payOrderDto.getType()) || Integer.valueOf(3).equals(payOrderDto.getType())) {
- payOrderDto.setFinalAmount(payOrderDto.getOrderAmount());
- }
- if (Integer.valueOf(1).equals(payOrderDto.getType()) && Integer.valueOf(3).equals(payOrderDto.getStatus())) {
- payOrderDto.setFinalAmount(payOrderDto.getOrderAmount());
- payOrderDto.setOrderAmount(payOrderDto.getOrderAmount());
- payOrderDto.setPaymentAmount(payOrderDto.getOrderAmount());
- }
- }
- pageInfo.setRecords(list);
- return R.ok(pageInfo);
- }
- @Override
- public R<PageInfo<EnterpriseChargingAnalysisVO>> enterpriseChargingAnalysis(EnterpriseChargingAnalysisQuery query) {
- PageInfo<EnterpriseChargingAnalysisVO> pageInfo = new PageInfo<>(query.getPageCurr(), query.getPageSize());
- List<EnterpriseChargingAnalysisVO> list = this.baseMapper.enterpriseChargingAnalysis(pageInfo, query);
- if (list == null || list.isEmpty()) {
- pageInfo.setRecords(Collections.emptyList());
- return R.ok(pageInfo);
- }
- List<String> companyNames = list.stream()
- .map(EnterpriseChargingAnalysisVO::getCompanyName)
- .filter(Objects::nonNull)
- .distinct()
- .collect(Collectors.toList());
- Map<String, List<Map<String, Object>>> topSitesByCompany = groupByCompany(
- this.baseMapper.enterpriseTopSitesByCompanies(query, companyNames));
- Map<String, List<Map<String, Object>>> chargingTimesByCompany = groupByCompany(
- this.baseMapper.enterpriseChargingTimesByCompanies(query, companyNames));
- for (EnterpriseChargingAnalysisVO row : list) {
- String companyKey = companyKey(row.getCompanyName(), row.getSocialCreditCode());
- List<Map<String, Object>> topSites = topSitesByCompany.getOrDefault(companyKey, Collections.emptyList());
- String topSiteNames = topSites.stream()
- .sorted(Comparator.comparing((Map<String, Object> item) -> ((Number) item.getOrDefault("counts", 0)).longValue()).reversed())
- .limit(3)
- .map(item -> Objects.toString(item.get("siteName"), ""))
- .filter(org.springframework.util.StringUtils::hasText)
- .collect(Collectors.joining("、"));
- row.setTopSiteNames(topSiteNames);
- List<LocalDateTime> chargingTimes = chargingTimesByCompany.getOrDefault(companyKey, Collections.emptyList()).stream()
- .map(item -> toLocalDateTime(item.get("startTime")))
- .filter(Objects::nonNull)
- .sorted()
- .collect(Collectors.toList());
- row.setAverageChargingInterval(calculateAverageChargingInterval(chargingTimes));
- }
- pageInfo.setRecords(list);
- return R.ok(pageInfo);
- }
+ }
- private Map<String, List<Map<String, Object>>> groupByCompany(List<Map<String, Object>> rows) {
- if (rows == null || rows.isEmpty()) {
- return Collections.emptyMap();
- }
- return rows.stream().collect(Collectors.groupingBy(row -> companyKey(
- Objects.toString(row.get("companyName"), null),
- Objects.toString(row.get("socialCreditCode"), ""))));
- }
+ GetInviteUser query = new GetInviteUser();
+ query.setAppUserId(appUser1.getId());
+ query.setBeInvitedAppUserId(chargingOrder.getAppUserId());
+ TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData();
+ if (null == inviteUser) {
+ inviteUser = new TInviteUser();
+ inviteUser.setAppUserId(appUser1.getId());
+ inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId());
+ inviteUser.setAward(num1);
+ inviteUser.setCreateTime(LocalDateTime.now());
+ inviteUserClient.saveInviteUser(inviteUser);
+ } else {
+ inviteUser.setAward(num1);
+ inviteUserClient.updateInviteUser(inviteUser);
+ }
+ if (num1 > 0) {
+ TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
+ String code = Double.valueOf(Math.random() * 1000).intValue() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
+ appUserIntegralChange.setCode(code);
+ appUserIntegralChange.setAppUserId(appUser1.getId());
+ appUserIntegralChange.setChangeType(4);
+ appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints());
+ appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
+ appUserIntegralChange.setCreateTime(LocalDateTime.now());
+ appUserIntegralChange.setOrderCode(chargingOrder.getCode());
+ appUserIntegralChange.setExtension(appUser.getId().toString());
+ appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
- private String companyKey(String companyName, String socialCreditCode) {
- return Objects.toString(companyName, "") + "\u0000" + Objects.toString(socialCreditCode, "");
- }
+ appUser1.setPoints(appUser1.getPoints() + num1);
+ appUserClient.updateAppUser(appUser1);
+ }
+ }
+ }
- private LocalDateTime toLocalDateTime(Object value) {
- if (value instanceof LocalDateTime) {
- return (LocalDateTime) value;
- }
- if (value instanceof java.sql.Timestamp) {
- return ((java.sql.Timestamp) value).toLocalDateTime();
- }
- if (value instanceof Date) {
- return LocalDateTime.ofInstant(((Date) value).toInstant(), ZoneId.systemDefault());
- }
- return null;
- }
- @Override
- public R<PageInfo<EnterpriseChargingDetailVO>> enterpriseChargingDetail(EnterpriseChargingAnalysisQuery query) {
- PageInfo<EnterpriseChargingDetailVO> pageInfo = new PageInfo<>(query.getPageCurr(), query.getPageSize());
- Map<Long, TOrderInvoiceDetail> invoiceDetailMap = getEnterpriseInvoiceDetailMap(query);
- if (invoiceDetailMap.isEmpty()) {
- pageInfo.setTotal(0L);
- pageInfo.setRecords(Collections.emptyList());
- return R.ok(pageInfo);
- }
- List<Long> orderIds = new ArrayList<>(invoiceDetailMap.keySet());
- long total = countEnterpriseChargingDetails(orderIds, query);
- pageInfo.setTotal(total);
- if (total == 0L) {
- pageInfo.setRecords(Collections.emptyList());
- return R.ok(pageInfo);
- }
- List<EnterpriseChargingDetailVO> list = queryEnterpriseChargingDetailPage(
- orderIds, query, pageInfo.offset(), pageInfo.getSize());
- fillEnterpriseInvoiceAmounts(list, invoiceDetailMap);
- fillEnterpriseChargingPeriodCounts(list);
- pageInfo.setRecords(list);
- return R.ok(pageInfo);
- }
+ /**
+ * 停止充电应答结果处理
+ *
+ * @param platformStopChargingReply
+ */
+ @Override
+ public void terminateSuccessfulResponse(PlatformStopChargingReplyVO platformStopChargingReply) {
+ GetChargingGunByCode code = new GetChargingGunByCode();
+ code.setCharging_gun_code(platformStopChargingReply.getCharging_gun_code());
+ code.setCharging_pile_code(platformStopChargingReply.getCharging_pile_code());
+ TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData();
+ TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, chargingGun.getId())
+ .orderByDesc(TChargingOrder::getEndTime).eq(TChargingOrder::getRechargePaymentStatus, 2).last(" limit 0, 1"));
+ if (null != order && order.getStatus() != 4) {
+ return;
+ }
- @Override
- public List<EnterpriseChargingDetailVO> enterpriseChargingDetailExport(EnterpriseChargingAnalysisQuery query) {
- Map<Long, TOrderInvoiceDetail> invoiceDetailMap = getEnterpriseInvoiceDetailMap(query);
- if (invoiceDetailMap.isEmpty()) {
- return Collections.emptyList();
- }
- List<EnterpriseChargingDetailVO> list = queryEnterpriseChargingDetailPage(
- new ArrayList<>(invoiceDetailMap.keySet()), query, 0L, Long.MAX_VALUE);
- fillEnterpriseInvoiceAmounts(list, invoiceDetailMap);
- fillEnterpriseChargingPeriodCounts(list);
- return list;
- }
+ String code1 = order.getCode();
+ if (0 == platformStopChargingReply.getStop_result()) {
+ String failure_cause = "";
+ switch (platformStopChargingReply.getFailure_cause()) {
+ case 0:
+ failure_cause = "无";
+ break;
+ case 1:
+ failure_cause = "设备编号不匹配";
+ break;
+ case 2:
+ failure_cause = "枪未处于充电状态";
+ break;
+ case 3:
+ failure_cause = "其他";
+ break;
+ }
+ log.info(code1 + ":停机失败:订单号:{},失败原因:{}", order.getCode(), failure_cause);
+ } else {
+ TChargingOrder chargingOrder = new TChargingOrder();
+ chargingOrder.setId(order.getId());
+ chargingOrder.setAppUserId(order.getAppUserId());
+ chargingOrder.setEndMode(1);
+ this.updateById(chargingOrder);
+ }
+ }
- private long countEnterpriseChargingDetails(List<Long> orderIds, EnterpriseChargingAnalysisQuery query) {
- long total = 0L;
- for (int start = 0; start < orderIds.size(); start += ENTERPRISE_ORDER_ID_BATCH_SIZE) {
- int end = Math.min(start + ENTERPRISE_ORDER_ID_BATCH_SIZE, orderIds.size());
- Long batchTotal = this.baseMapper.enterpriseChargingDetailCount(orderIds.subList(start, end), query);
- if (batchTotal != null) {
- total += batchTotal;
- }
- }
- return total;
- }
- private List<EnterpriseChargingDetailVO> queryEnterpriseChargingDetailPage(List<Long> orderIds,
- EnterpriseChargingAnalysisQuery query, long offset, long pageSize) {
- if (orderIds == null || orderIds.isEmpty() || pageSize <= 0L) {
- return Collections.emptyList();
- }
- long requiredRows = pageSize == Long.MAX_VALUE || offset > Long.MAX_VALUE - pageSize
- ? Long.MAX_VALUE : offset + pageSize;
- List<EnterpriseChargingDetailVO> candidates = new ArrayList<>();
- for (int start = 0; start < orderIds.size(); start += ENTERPRISE_ORDER_ID_BATCH_SIZE) {
- int end = Math.min(start + ENTERPRISE_ORDER_ID_BATCH_SIZE, orderIds.size());
- List<Long> batchOrderIds = orderIds.subList(start, end);
- long batchLimit = Math.min(requiredRows, batchOrderIds.size());
- candidates.addAll(this.baseMapper.enterpriseChargingDetail(batchOrderIds, query, 0L, batchLimit));
- }
- candidates.sort(Comparator
- .comparing(EnterpriseChargingDetailVO::getCreateTime,
- Comparator.nullsLast(Comparator.reverseOrder()))
- .thenComparing(EnterpriseChargingDetailVO::getId,
- Comparator.nullsLast(Comparator.reverseOrder())));
- int fromIndex = (int) Math.min(offset, candidates.size());
- long requestedEnd = pageSize == Long.MAX_VALUE || fromIndex > Long.MAX_VALUE - pageSize
- ? Long.MAX_VALUE : fromIndex + pageSize;
- int toIndex = (int) Math.min(requestedEnd, candidates.size());
- return new ArrayList<>(candidates.subList(fromIndex, toIndex));
- }
+ @Override
+ public TCharingOrderVO chargingOrder(ChargingOrderQuery dto) {
+ TCharingOrderVO summary = chargingOrderSummary(dto);
+ summary.setList(chargingOrderList(dto));
+ return summary;
+ }
- private Map<Long, TOrderInvoiceDetail> getEnterpriseInvoiceDetailMap(EnterpriseChargingAnalysisQuery query) {
- List<Long> invoiceIds = this.baseMapper.enterpriseInvoiceIds(query);
- if (invoiceIds == null || invoiceIds.isEmpty()) {
- return Collections.emptyMap();
- }
- Map<Long, TOrderInvoiceDetail> detailMap = new LinkedHashMap<>();
- for (int start = 0; start < invoiceIds.size(); start += ENTERPRISE_INVOICE_BATCH_SIZE) {
- int end = Math.min(start + ENTERPRISE_INVOICE_BATCH_SIZE, invoiceIds.size());
- List<TOrderInvoiceDetail> details = this.baseMapper.enterpriseInvoiceChargingDetails(invoiceIds.subList(start, end));
- if (details == null) {
- continue;
- }
- for (TOrderInvoiceDetail detail : details) {
- if (detail == null || detail.getOrderId() == null) {
- continue;
- }
- detailMap.merge(detail.getOrderId(), detail, this::mergeEnterpriseInvoiceDetail);
- }
- }
- return detailMap;
- }
+ @Override
+ public PageInfo<ChargingOrderVO> chargingOrderList(ChargingOrderQuery dto) {
+ String[] timeRange = parseChargingOrderTimeRange(dto);
+ String startTime1 = timeRange[0];
+ String startTime2 = timeRange[1];
+ String endTime1 = timeRange[2];
+ String endTime2 = timeRange[3];
+ PageInfo<ChargingOrderVO> pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
+ Long userId = tokenService.getLoginUser().getUserid();
+ SysUser sysUser = sysUserClient.getSysUser(userId).getData();
+ Integer roleType = sysUser.getRoleType();
+ setChargingOrderAuthSiteIds(dto, sysUser, userId, roleType);
+ List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
+ fillChargingOrderBalanceIncome(list);
+ fillChargingOrderShareIncome(list);
+ fillChargingOrderPageExtra(list, dto.getSiteIds(), sysUser, roleType);
+ pageInfo.setRecords(list);
+ return pageInfo;
+ }
- private TOrderInvoiceDetail mergeEnterpriseInvoiceDetail(TOrderInvoiceDetail current, TOrderInvoiceDetail addition) {
- current.setElectrovalence(nullToZero(current.getElectrovalence()).add(nullToZero(addition.getElectrovalence())));
- current.setServiceCharge(nullToZero(current.getServiceCharge()).add(nullToZero(addition.getServiceCharge())));
- return current;
- }
+ @Override
+ public TCharingOrderVO chargingOrderSummary(ChargingOrderQuery dto) {
+ TCharingOrderVO tCharingOrderVO = new TCharingOrderVO();
+ fillEmptyChargingOrderSummary(tCharingOrderVO);
+ String[] timeRange = parseChargingOrderTimeRange(dto);
+ String startTime1 = timeRange[0];
+ String startTime2 = timeRange[1];
+ String endTime1 = timeRange[2];
+ String endTime2 = timeRange[3];
+ Long userId = tokenService.getLoginUser().getUserid();
+ SysUser sysUser = sysUserClient.getSysUser(userId).getData();
+ setChargingOrderAuthSiteIds(dto, sysUser, userId, sysUser.getRoleType());
+ Map<String, Object> map = this.baseMapper.chargingOrderBaseSummary(dto, startTime1, startTime2, endTime1, endTime2);
+ if (null != map) {
+ tCharingOrderVO.setTotal(getSummaryDecimal(map, "total"));
+ tCharingOrderVO.setTime(getSummaryLong(map, "time"));
+ tCharingOrderVO.setIncome(getSummaryDecimal(map, "income"));
+ tCharingOrderVO.setElectronicMoney(getSummaryDecimal(map, "electronicMoney"));
+ tCharingOrderVO.setServiceMoney(getSummaryDecimal(map, "serviceMoney"));
+ tCharingOrderVO.setWechatIncome(getSummaryDecimal(map, "wechatIncome"));
+ tCharingOrderVO.setAlipayIncome(getSummaryDecimal(map, "alipayIncome"));
+ tCharingOrderVO.setWhitelistChargingIncome(getSummaryDecimal(map, "whitelistChargingIncome"));
+ tCharingOrderVO.setWhitelistRefund(getSummaryDecimal(map, "whitelistRefund"));
+ }
+ List<Long> summaryOrderIds = this.baseMapper.chargingOrderSummaryOrderIds(dto, startTime1, startTime2, endTime1, endTime2);
+ Map<String, Object> shareIncomeMap = getChargingOrderShareIncomeSummary(summaryOrderIds);
+ tCharingOrderVO.setPlatformIncomeTotal(getSummaryDecimal(shareIncomeMap, "platformIncomeTotal"));
+ tCharingOrderVO.setPartnerIncomeTotal(getSummaryDecimal(shareIncomeMap, "partnerIncomeTotal"));
+ Map<String, Object> balanceMap = getExchangeCodeBalanceSummary(summaryOrderIds);
+ tCharingOrderVO.setBalanceIncome(getSummaryDecimal(balanceMap, "balanceIncome"));
+ tCharingOrderVO.setBalanceGiftIncome(getSummaryDecimal(balanceMap, "balanceGiftIncome"));
+ return tCharingOrderVO;
+ }
- private void fillEnterpriseInvoiceAmounts(List<EnterpriseChargingDetailVO> list,
- Map<Long, TOrderInvoiceDetail> invoiceDetailMap) {
- if (list == null || list.isEmpty()) {
- return;
- }
- for (EnterpriseChargingDetailVO detail : list) {
- TOrderInvoiceDetail invoiceDetail = invoiceDetailMap.get(detail.getId());
- detail.setElectrovalence(invoiceDetail == null ? BigDecimal.ZERO : nullToZero(invoiceDetail.getElectrovalence()));
- detail.setServiceCharge(invoiceDetail == null ? BigDecimal.ZERO : nullToZero(invoiceDetail.getServiceCharge()));
- }
- }
+ private String[] parseChargingOrderTimeRange(ChargingOrderQuery dto) {
+ String startTime1 = null;
+ String startTime2 = null;
+ String endTime1 = null;
+ String endTime2 = null;
+ if (StringUtils.hasLength(dto.getStartTime())) {
+ String[] split = dto.getStartTime().split(" - ");
+ startTime1 = split[0];
+ startTime2 = split[1];
+ }
+ if (StringUtils.hasLength(dto.getEndTime())) {
+ String[] split = dto.getEndTime().split(" - ");
+ endTime1 = split[0];
+ endTime2 = split[1];
+ }
+ return new String[]{startTime1, startTime2, endTime1, endTime2};
+ }
- private void fillEnterpriseChargingPeriodCounts(List<EnterpriseChargingDetailVO> list) {
- if (list == null || list.isEmpty()) {
- return;
- }
- List<Long> orderIds = list.stream()
- .map(EnterpriseChargingDetailVO::getId)
- .filter(Objects::nonNull)
- .distinct()
- .collect(Collectors.toList());
- Map<Long, Integer> periodCountMap = new HashMap<>();
- for (int start = 0; start < orderIds.size(); start += ENTERPRISE_DETAIL_PERIOD_BATCH_SIZE) {
- int end = Math.min(start + ENTERPRISE_DETAIL_PERIOD_BATCH_SIZE, orderIds.size());
- List<Map<String, Object>> rows = this.baseMapper.enterpriseChargingPeriodCounts(orderIds.subList(start, end));
- if (rows == null) {
- continue;
- }
- for (Map<String, Object> row : rows) {
- Long orderId = mapLong(row, "orderId", "orderid", "charging_order_id");
- Integer periodCount = mapInteger(row, "periodCount", "periodcount");
- if (orderId != null) {
- periodCountMap.put(orderId, periodCount == null ? 0 : periodCount);
- }
- }
- }
- for (EnterpriseChargingDetailVO detail : list) {
- detail.setPeriodCount(periodCountMap.getOrDefault(detail.getId(), 0));
- }
- }
+ private void fillChargingOrderPageExtra(List<ChargingOrderVO> list, List<Integer> siteIds, SysUser sysUser, Integer roleType) {
+ if (list == null || list.isEmpty()) {
+ return;
+ }
+ List<Long> orderIds = list.stream().map(ChargingOrderVO::getId).filter(Objects::nonNull).collect(Collectors.toList());
+ List<Integer> pageSiteIds = list.stream().map(ChargingOrderVO::getSiteId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+ List<Integer> pageGunIds = list.stream().map(ChargingOrderVO::getChargingGunId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+ List<TChargingGun> pageGuns = pageGunIds.isEmpty() ? new ArrayList<>() : Optional.ofNullable(chargingGunClient.getChargingGunByIds(pageGunIds).getData()).orElse(new ArrayList<>());
+ Map<Integer, TChargingGun> gunMap = pageGuns.stream()
+ .filter(item -> item.getId() != null)
+ .collect(Collectors.toMap(TChargingGun::getId, item -> item, (a, b) -> a));
+ List<TChargingPile> pagePiles = pageSiteIds.isEmpty() ? new ArrayList<>() : Optional.ofNullable(chargingPileClient.getChargingPileBySiteIds(pageSiteIds).getData()).orElse(new ArrayList<>());
+ Map<Integer, TChargingPile> pileMap = pagePiles.stream()
+ .filter(item -> item.getId() != null)
+ .collect(Collectors.toMap(TChargingPile::getId, item -> item, (a, b) -> a));
+ List<Site> pageSites = pageSiteIds.isEmpty() ? new ArrayList<>() : Optional.ofNullable(siteClient.getSiteByIds(pageSiteIds).getData()).orElse(new ArrayList<>());
+ Map<Integer, Site> siteMap = pageSites.stream()
+ .filter(item -> item.getId() != null)
+ .collect(Collectors.toMap(Site::getId, item -> item, (a, b) -> a));
+ Map<Long, List<TChargingOrderAccountingStrategy>> strategyMap = orderIds.isEmpty() ? new HashMap<>() :
+ chargingOrderAccountingStrategyService.lambdaQuery()
+ .in(TChargingOrderAccountingStrategy::getChargingOrderId, orderIds)
+ .list()
+ .stream()
+ .collect(Collectors.groupingBy(TChargingOrderAccountingStrategy::getChargingOrderId));
+ Map<Integer, Boolean> authRecordMap = new HashMap<>();
+ if (roleType == 2 && siteIds != null) {
+ for (Integer siteId : siteIds) {
+ List<Boolean> permission = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData();
+ authRecordMap.put(siteId, permission != null && !permission.isEmpty() && Boolean.TRUE.equals(permission.get(0)));
+ }
+ }
+ for (ChargingOrderVO chargingOrderVO : list) {
+ if (roleType == 2 && chargingOrderVO.getSiteId() != null) {
+ chargingOrderVO.setAuthRecord(Boolean.TRUE.equals(authRecordMap.get(chargingOrderVO.getSiteId())));
+ }
+ chargingOrderVO.setCommissionAmount(chargingOrderVO.getRechargeAmount() != null ? chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")) : new BigDecimal("0"));
+ chargingOrderVO.setPlatFormMoney(chargingOrderVO.getRechargeAmount() != null ? chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")).setScale(2, BigDecimal.ROUND_DOWN) : new BigDecimal("0"));
+ chargingOrderVO.setUid(chargingOrderVO.getId() + "");
+ Site site = siteMap.get(chargingOrderVO.getSiteId());
+ if (site != null) {
+ chargingOrderVO.setSiteName(site.getName());
+ }
+ TChargingGun gun = gunMap.get(chargingOrderVO.getChargingGunId());
+ TChargingPile pile = pileMap.get(chargingOrderVO.getChargingPileId());
+ if (pile != null && gun != null) {
+ chargingOrderVO.setTerminalName(pile.getName() + "-" + gun.getName());
+ }
+ List<TChargingOrderAccountingStrategy> strategies = strategyMap.getOrDefault(chargingOrderVO.getId(), new ArrayList<>());
+ if (chargingOrderVO.getStartTime() != null && chargingOrderVO.getEndTime() != null) {
+ long between = ChronoUnit.SECONDS.between(chargingOrderVO.getStartTime(), chargingOrderVO.getEndTime());
+ chargingOrderVO.setChargingSecond(between);
+ BigDecimal electronicReduce = strategies.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+ chargingOrderVO.setElectrovalence(electronicReduce);
+ BigDecimal serviceReduce = strategies.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+ if (!Objects.equals(chargingOrderVO.getOrderSource(), 2)) {
+ chargingOrderVO.setServiceCharge(serviceReduce);
+ chargingOrderVO.setSharingAmount(BigDecimal.ZERO);
+ } else {
+ chargingOrderVO.setServiceCharge(serviceReduce.multiply(new BigDecimal("0.8")));
+ chargingOrderVO.setSharingAmount(serviceReduce.multiply(new BigDecimal("0.2")));
+ }
+ }
+ chargingOrderVO.setCount(strategies.size());
+ chargingOrderVO.setLicensePlate(chargingOrderVO.getPlateNum());
+ }
+ }
- private Long mapLong(Map<String, Object> row, String... keys) {
- Object value = mapValue(row, keys);
- return value instanceof Number ? ((Number) value).longValue() : null;
- }
+ /**
+ * 填充充电桩订单列表余额收入,余额收入按真实充值余额统计,赠送余额单独展示。
+ */
+ private void fillChargingOrderBalanceIncome(List<ChargingOrderVO> list) {
+ if (list == null || list.isEmpty()) {
+ return;
+ }
+ List<Long> orderIds = list.stream().map(ChargingOrderVO::getId).filter(Objects::nonNull).collect(Collectors.toList());
+ if (orderIds.isEmpty()) {
+ return;
+ }
+ Map<Long, Map<String, Object>> incomeMap = new HashMap<>();
+ List<Map<String, Object>> rows = this.baseMapper.exchangeCodeBalanceIncomeByOrderIds(orderIds);
+ if (rows != null) {
+ for (Map<String, Object> row : rows) {
+ Long orderId = getSummaryLong(row, "orderId");
+ if (orderId != null) {
+ incomeMap.put(orderId, row);
+ }
+ }
+ }
+ for (ChargingOrderVO item : list) {
+ Map<String, Object> row = incomeMap.get(item.getId());
+ item.setBalanceIncome(getSummaryDecimal(row, "balanceIncome"));
+ item.setBalanceGiftIncome(getSummaryDecimal(row, "balanceGiftIncome"));
+ }
+ }
- private Integer mapInteger(Map<String, Object> row, String... keys) {
- Object value = mapValue(row, keys);
- return value instanceof Number ? ((Number) value).intValue() : null;
- }
+ private void setChargingOrderAuthSiteIds(ChargingOrderQuery dto, SysUser sysUser, Long userId, Integer roleType) {
+ List<Integer> siteIds = new ArrayList<>();
+ if (dto.getSiteId() == null) {
+ if (userId != null) {
+ List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
+ for (GetSiteListDTO datum : data) {
+ siteIds.add(datum.getId());
+ }
+ }
+ } else {
+ siteIds.add(dto.getSiteId());
+ }
+ if (siteIds.isEmpty()) {
+ siteIds.add(-1);
+ } else if (roleType == 2) {
+ List<Integer> integers = new ArrayList<>();
+ for (Integer siteId : siteIds) {
+ List<Boolean> t1 = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData();
+ Boolean b = t1.get(1);
+ if (b) {
+ integers.add(siteId);
+ }
+ }
+ siteIds = integers;
+ }
+ if (siteIds.isEmpty()) {
+ siteIds.add(-1);
+ }
+ dto.setSiteIds(siteIds);
+ }
- private Object mapValue(Map<String, Object> row, String... keys) {
- if (row == null) {
- return null;
- }
- for (String key : keys) {
- if (row.containsKey(key)) {
- return row.get(key);
- }
- }
- for (Map.Entry<String, Object> entry : row.entrySet()) {
- for (String key : keys) {
- if (entry.getKey() != null && entry.getKey().equalsIgnoreCase(key)) {
- return entry.getValue();
- }
- }
- }
- return null;
- }
+ /**
+ * 查询充电桩订单余额收入明细,余额收入按真实充值余额统计,赠送收入单独展示。
+ */
+ @Override
+ public List<ChargingOrderBalanceIncomeDetailVO> balanceIncomeDetail(ChargingOrderQuery dto) {
+ String startTime1 = null;
+ String startTime2 = null;
+ String endTime1 = null;
+ String endTime2 = null;
+ if (StringUtils.hasLength(dto.getStartTime())) {
+ String[] split = dto.getStartTime().split(" - ");
+ startTime1 = split[0];
+ startTime2 = split[1];
+ }
+ if (StringUtils.hasLength(dto.getEndTime())) {
+ String[] split = dto.getEndTime().split(" - ");
+ endTime1 = split[0];
+ endTime2 = split[1];
+ }
+ if (StringUtils.hasLength(dto.getPhone())) {
+ List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
+ if (data == null || data.isEmpty()) {
+ return new ArrayList<>();
+ }
+ dto.setUserIds(data);
+ }
+ Long userId = tokenService.getLoginUser().getUserid();
+ SysUser sysUser = sysUserClient.getSysUser(userId).getData();
+ setChargingOrderAuthSiteIds(dto, sysUser, userId, sysUser.getRoleType());
+ List<Long> orderIds = this.baseMapper.chargingOrderSummaryOrderIds(dto, startTime1, startTime2, endTime1, endTime2);
+ if (orderIds == null || orderIds.isEmpty()) {
+ return new ArrayList<>();
+ }
+ Map<Long, ChargingOrderBalanceIncomeDetailVO> detailMap = new LinkedHashMap<>();
+ int batchSize = 500;
+ for (int i = 0; i < orderIds.size(); i += batchSize) {
+ List<Long> batchIds = orderIds.subList(i, Math.min(i + batchSize, orderIds.size()));
+ List<ChargingOrderBalanceIncomeDetailVO> batchList = this.baseMapper.exchangeCodeBalanceIncomeDetail(batchIds);
+ if (batchList == null || batchList.isEmpty()) {
+ continue;
+ }
+ for (ChargingOrderBalanceIncomeDetailVO item : batchList) {
+ Long packageId = item.getPackageId() == null ? 0L : item.getPackageId();
+ ChargingOrderBalanceIncomeDetailVO detail = detailMap.get(packageId);
+ if (detail == null) {
+ detail = new ChargingOrderBalanceIncomeDetailVO();
+ detail.setPackageId(item.getPackageId());
+ detail.setPackageName(item.getPackageName());
+ detail.setBalanceIncome(BigDecimal.ZERO);
+ detail.setGiftIncome(BigDecimal.ZERO);
+ detailMap.put(packageId, detail);
+ }
+ detail.setBalanceIncome(detail.getBalanceIncome().add(item.getBalanceIncome() == null ? BigDecimal.ZERO : item.getBalanceIncome()));
+ detail.setGiftIncome(detail.getGiftIncome().add(item.getGiftIncome() == null ? BigDecimal.ZERO : item.getGiftIncome()));
+ }
+ }
+ List<ChargingOrderBalanceIncomeDetailVO> result = new ArrayList<>();
+ for (ChargingOrderBalanceIncomeDetailVO detail : detailMap.values()) {
+ BigDecimal balanceIncome = (detail.getBalanceIncome() == null ? BigDecimal.ZERO : detail.getBalanceIncome()).setScale(2, RoundingMode.HALF_EVEN);
+ BigDecimal giftIncome = (detail.getGiftIncome() == null ? BigDecimal.ZERO : detail.getGiftIncome()).setScale(2, RoundingMode.HALF_EVEN);
+ if (balanceIncome.compareTo(BigDecimal.ZERO) == 0 && giftIncome.compareTo(BigDecimal.ZERO) == 0) {
+ continue;
+ }
+ detail.setBalanceIncome(balanceIncome);
+ detail.setGiftIncome(giftIncome);
+ result.add(detail);
+ }
+ return result;
+ }
- private EnterpriseChargingAnalysisQuery buildEnterpriseRowQuery(EnterpriseChargingAnalysisQuery source, EnterpriseChargingAnalysisVO row) {
- EnterpriseChargingAnalysisQuery rowQuery = new EnterpriseChargingAnalysisQuery();
- BeanUtils.copyProperties(source, rowQuery);
- rowQuery.setCompanyName(null);
- rowQuery.setExactCompanyName(row.getCompanyName());
- rowQuery.setSocialCreditCode(row.getSocialCreditCode());
- return rowQuery;
- }
+ private void fillEmptyChargingOrderSummary(TCharingOrderVO tCharingOrderVO) {
+ tCharingOrderVO.setTotal(BigDecimal.ZERO);
+ tCharingOrderVO.setTime(0L);
+ tCharingOrderVO.setIncome(BigDecimal.ZERO);
+ tCharingOrderVO.setElectronicMoney(BigDecimal.ZERO);
+ tCharingOrderVO.setServiceMoney(BigDecimal.ZERO);
+ tCharingOrderVO.setPlatformIncomeTotal(BigDecimal.ZERO);
+ tCharingOrderVO.setPartnerIncomeTotal(BigDecimal.ZERO);
+ tCharingOrderVO.setWechatIncome(BigDecimal.ZERO);
+ tCharingOrderVO.setAlipayIncome(BigDecimal.ZERO);
+ tCharingOrderVO.setBalanceIncome(BigDecimal.ZERO);
+ tCharingOrderVO.setBalanceGiftIncome(BigDecimal.ZERO);
+ tCharingOrderVO.setWhitelistChargingIncome(BigDecimal.ZERO);
+ tCharingOrderVO.setWhitelistRefund(BigDecimal.ZERO);
+ }
- private BigDecimal calculateAverageChargingInterval(List<LocalDateTime> times) {
- if (times == null || times.size() < 2) {
- return BigDecimal.ZERO;
- }
- long totalSeconds = 0L;
- for (int i = 1; i < times.size(); i++) {
- long seconds = Duration.between(times.get(i - 1), times.get(i)).getSeconds();
- if (seconds > 0) {
- totalSeconds += seconds;
- }
- }
- return BigDecimal.valueOf(totalSeconds)
- .divide(BigDecimal.valueOf(times.size() - 1L), 4, RoundingMode.HALF_UP)
- .divide(BigDecimal.valueOf(3600), 2, RoundingMode.HALF_UP);
- }
+ /**
+ * 汇总充电桩订单余额收入,兑换码使用记录的usedAmount包含赠送余额,SQL中需扣除giftUsedAmount。
+ */
+ private Map<String, Object> getExchangeCodeBalanceSummary(List<Long> orderIds) {
+ Map<String, Object> totalMap = new HashMap<>();
+ totalMap.put("balanceIncome", BigDecimal.ZERO);
+ totalMap.put("balanceGiftIncome", BigDecimal.ZERO);
+ if (orderIds == null || orderIds.isEmpty()) {
+ return totalMap;
+ }
+ BigDecimal balanceIncome = BigDecimal.ZERO;
+ BigDecimal balanceGiftIncome = BigDecimal.ZERO;
+ int batchSize = 500;
+ for (int i = 0; i < orderIds.size(); i += batchSize) {
+ List<Long> batchIds = orderIds.subList(i, Math.min(i + batchSize, orderIds.size()));
+ Map<String, Object> batchMap = this.baseMapper.exchangeCodeBalanceSummary(batchIds);
+ if (batchMap != null) {
+ balanceIncome = balanceIncome.add(getSummaryDecimal(batchMap, "balanceIncome"));
+ balanceGiftIncome = balanceGiftIncome.add(getSummaryDecimal(batchMap, "balanceGiftIncome"));
+ }
+ }
+ totalMap.put("balanceIncome", balanceIncome);
+ totalMap.put("balanceGiftIncome", balanceGiftIncome);
+ return totalMap;
+ }
- @Override
- public R<PageInfo<TChargingOrderRefund>> getRefundList(ChargingRefundDto chargingRefundDto) {
- PageInfo<TChargingOrderRefund> pageInfo = new PageInfo<>(chargingRefundDto.getPageCurr(), chargingRefundDto.getPageSize());
- boolean withoutOrderJoin = !StringUtils.hasLength(chargingRefundDto.getSerialNumber())
- && (chargingRefundDto.getSiteIds() == null || chargingRefundDto.getSiteIds().isEmpty());
- List<TChargingOrderRefund> list = withoutOrderJoin
- ? this.baseMapper.getRefundListWithoutOrderJoin(pageInfo, chargingRefundDto)
- : this.baseMapper.getRefundList(pageInfo, chargingRefundDto);
- if (withoutOrderJoin) {
- enrichRefundOrderInfo(list);
- }
- for (TChargingOrderRefund refund : list) {
- refund.setUid(refund.getType() + "-" + refund.getId());
- }
- pageInfo.setRecords(list);
-
- return R.ok(pageInfo);
- }
+ private Map<String, Object> getChargingOrderShareIncomeSummary(List<Long> orderIds) {
+ Map<String, Object> totalMap = new HashMap<>();
+ totalMap.put("platformIncomeTotal", BigDecimal.ZERO);
+ totalMap.put("partnerIncomeTotal", BigDecimal.ZERO);
+ if (orderIds == null || orderIds.isEmpty()) {
+ return totalMap;
+ }
+ BigDecimal platformIncomeTotal = BigDecimal.ZERO;
+ BigDecimal partnerIncomeTotal = BigDecimal.ZERO;
+ int batchSize = 500;
+ for (int i = 0; i < orderIds.size(); i += batchSize) {
+ List<Long> batchIds = orderIds.subList(i, Math.min(i + batchSize, orderIds.size()));
+ Map<String, Object> batchMap = this.baseMapper.chargingOrderShareIncomeSummaryByOrderIds(batchIds);
+ if (batchMap != null) {
+ platformIncomeTotal = platformIncomeTotal.add(getSummaryDecimal(batchMap, "platformIncomeTotal"));
+ partnerIncomeTotal = partnerIncomeTotal.add(getSummaryDecimal(batchMap, "partnerIncomeTotal"));
+ }
+ }
+ totalMap.put("platformIncomeTotal", platformIncomeTotal);
+ totalMap.put("partnerIncomeTotal", partnerIncomeTotal);
+ return totalMap;
+ }
- private void enrichRefundOrderInfo(List<TChargingOrderRefund> refunds) {
- if (refunds == null || refunds.isEmpty()) {
- return;
- }
- Map<Integer, List<Long>> orderIdsByType = refunds.stream()
- .filter(Objects::nonNull)
- .filter(refund -> refund.getType() != null && StringUtils.hasLength(refund.getOrderId()))
- .collect(Collectors.groupingBy(TChargingOrderRefund::getType,
- Collectors.mapping(refund -> Long.valueOf(refund.getOrderId()), Collectors.toList())));
+ private BigDecimal getSummaryDecimal(Map<String, Object> map, String key) {
+ if (map == null) {
+ return BigDecimal.ZERO;
+ }
+ Object value = map.get(key);
+ if (value == null) {
+ return BigDecimal.ZERO;
+ }
+ if (value instanceof BigDecimal) {
+ return ((BigDecimal) value).setScale(2, RoundingMode.HALF_EVEN);
+ }
+ if (value instanceof Number) {
+ return BigDecimal.valueOf(((Number) value).doubleValue()).setScale(2, RoundingMode.HALF_EVEN);
+ }
+ return new BigDecimal(value.toString()).setScale(2, RoundingMode.HALF_EVEN);
+ }
- Map<Long, TChargingOrder> chargingOrderMap = orderIdsByType.getOrDefault(1, Collections.emptyList()).isEmpty()
- ? Collections.emptyMap()
- : indexByLongId(listByIds(orderIdsByType.get(1)), TChargingOrder::getId);
- Map<Long, TShoppingOrder> shoppingOrderMap = orderIdsByType.getOrDefault(2, Collections.emptyList()).isEmpty()
- ? Collections.emptyMap()
- : indexByLongId(shoppingOrderService.listByIds(orderIdsByType.get(2)), TShoppingOrder::getId);
- Map<Long, TVipOrder> vipOrderMap = orderIdsByType.getOrDefault(3, Collections.emptyList()).isEmpty()
- ? Collections.emptyMap()
- : indexByLongId(vipOrderService.listByIds(orderIdsByType.get(3)), TVipOrder::getId);
+ private Long getSummaryLong(Map<String, Object> map, String key) {
+ if (map == null) {
+ return 0L;
+ }
+ Object value = map.get(key);
+ if (value == null) {
+ return 0L;
+ }
+ if (value instanceof Number) {
+ return ((Number) value).longValue();
+ }
+ return Long.parseLong(value.toString());
+ }
- for (TChargingOrderRefund refund : refunds) {
- if (refund == null || refund.getType() == null || !StringUtils.hasLength(refund.getOrderId())) {
- continue;
- }
- Long orderId = Long.valueOf(refund.getOrderId());
- if (refund.getType() == 1) {
- TChargingOrder order = chargingOrderMap.get(orderId);
- if (order != null) {
- refund.setSerailNumber(order.getRechargeSerialNumber());
- refund.setPaymentAmount(order.getPaymentAmount());
- refund.setPayTime(order.getCreateTime());
- refund.setUserId(order.getAppUserId() == null ? null : String.valueOf(order.getAppUserId()));
- refund.setSiteId(order.getSiteId());
- refund.setPayMethod(order.getPayMethod());
- }
- } else if (refund.getType() == 2) {
- TShoppingOrder order = shoppingOrderMap.get(orderId);
- if (order != null) {
- refund.setSerailNumber(order.getSerialNumber());
- refund.setPaymentAmount(order.getPaymentAmount());
- refund.setPayTime(order.getCreateTime());
- refund.setUserId(order.getAppUserId() == null ? null : String.valueOf(order.getAppUserId()));
- refund.setPayMethod(3);
- }
- } else if (refund.getType() == 3) {
- TVipOrder order = vipOrderMap.get(orderId);
- if (order != null) {
- refund.setSerailNumber(order.getSerialNumber());
- refund.setPaymentAmount(order.getPaymentAmount());
- refund.setPayTime(order.getCreateTime());
- refund.setUserId(order.getAppUserId() == null ? null : String.valueOf(order.getAppUserId()));
- refund.setPayMethod(3);
- }
- }
- }
- }
-
- @Override
- public List<ChargingOrderGroup> chargingOrderGroup(ChargingPercentProvinceDto chargingPercentProvinceDto) {
-
- return this.baseMapper.chargingOrderGroup(chargingPercentProvinceDto);
- }
-
- @Override
- public List<SixChargingDto> charge(LocalDate sixBefore, List<Integer> siteIds, Boolean partnerView) {
- String sixBeforeValue = sixBefore == null ? null : sixBefore.toString();
- List<SixChargingDto> result = new ArrayList<>();
- if (Boolean.TRUE.equals(partnerView)) {
- List<SixChargingDto> partnerIncome = this.baseMapper.chargePartner(sixBeforeValue, siteIds);
- if (partnerIncome != null) {
- result.addAll(partnerIncome);
- }
- } else {
- List<SixChargingDto> settlementIncome = this.baseMapper.chargeSettlement(sixBeforeValue, siteIds);
- if (settlementIncome != null) {
- result.addAll(settlementIncome);
- }
- String siteIdsCsv = siteIds == null ? null : siteIds.stream()
- .filter(Objects::nonNull)
- .map(String::valueOf)
- .collect(Collectors.joining(","));
- List<SixChargingDto> currentMonthIncome = this.baseMapper.chargeCurrentMonth(siteIdsCsv);
- if (currentMonthIncome != null) {
- result.addAll(currentMonthIncome);
- }
- }
- if (result != null) {
- for (SixChargingDto item : result) {
- if (item == null) {
- continue;
- }
- if (item.getMonth() != null) {
- try {
- int month = Integer.parseInt(item.getMonth());
- if (month >= 1 && month <= 12) {
- item.setMonth(String.format("%02d", month));
- }
- } catch (NumberFormatException ignored) {
- }
- }
- if (item.getElectrovalence() != null) {
- item.setElectrovalence(item.getElectrovalence().setScale(2, RoundingMode.HALF_UP));
- }
- if (item.getServiceCharge() != null) {
- item.setServiceCharge(item.getServiceCharge().setScale(2, RoundingMode.HALF_UP));
- }
- }
- }
- return result;
- }
-
- @Override
- public List<SixCircleDto> circle(List<Integer> siteIds, LocalDate sixBefore, Boolean partnerView) {
- List<SixCircleDto> result = this.baseMapper.circle(siteIds, sixBefore, partnerView);
- if (result != null) {
- for (SixCircleDto item : result) {
- if (item != null && item.getPaymentAmount() != null) {
- item.setPaymentAmount(item.getPaymentAmount().setScale(2, RoundingMode.HALF_UP));
- }
- }
- }
- return result;
- }
-
- @Override
- public Map<String, Object> countAll(List<Integer> siteIds, Boolean partnerView) {
- Map<String, Object> result = this.baseMapper.countAll(siteIds, partnerView);
- if (!Boolean.TRUE.equals(partnerView) && result != null) {
- result.put("commission_amount", this.baseMapper.sumSuccessfulShareAmount(siteIds));
- }
- return result;
- }
+ @Override
+ public R<PageInfo<PayOrderDto>> payOrderQuery(PayOrderQueryDto payOrderQueryDto) {
+ if (payOrderQueryDto == null) {
+ payOrderQueryDto = new PayOrderQueryDto();
+ }
+ PageInfo<PayOrderDto> pageInfo = new PageInfo<>(payOrderQueryDto.getPageCurr(), payOrderQueryDto.getPageSize());
+ // 开票申请没有关联明细时必须返回空结果,不能退化成支付订单全量查询。
+ if (payOrderQueryDto.getInvoiceId() != null
+ && (payOrderQueryDto.getIds() == null || payOrderQueryDto.getIds().isEmpty())) {
+ pageInfo.setRecords(Collections.emptyList());
+ return R.ok(pageInfo);
+ }
+ List<PayOrderDto> list = this.baseMapper.payOrderQuery(pageInfo, payOrderQueryDto);
+ if (list == null || list.isEmpty()) {
+ pageInfo.setRecords(Collections.emptyList());
+ return R.ok(pageInfo);
+ }
+ for (PayOrderDto payOrderDto : list) {
+ if (payOrderDto == null) {
+ continue;
+ }
+ if (Integer.valueOf(2).equals(payOrderDto.getType()) || Integer.valueOf(3).equals(payOrderDto.getType())) {
+ payOrderDto.setFinalAmount(payOrderDto.getOrderAmount());
+ }
+ if (Integer.valueOf(1).equals(payOrderDto.getType()) && Integer.valueOf(3).equals(payOrderDto.getStatus())) {
+ payOrderDto.setFinalAmount(payOrderDto.getOrderAmount());
+ payOrderDto.setOrderAmount(payOrderDto.getOrderAmount());
+ payOrderDto.setPaymentAmount(payOrderDto.getOrderAmount());
+ }
+ }
+ pageInfo.setRecords(list);
+ return R.ok(pageInfo);
+ }
- /**
- * 统计近六月订单收入支付方式占比;服务层聚合避免复杂CASE SQL在当前数据库驱动中转换异常。
- */
- @Override
- public List<SixIncomeCircleDto> payTypeCircle(LocalDate sixBefore, List<Integer> siteIds, Boolean partnerView) {
- if (siteIds == null || siteIds.isEmpty()) {
- return buildPayTypeCircleData(BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO);
- }
- if (Boolean.TRUE.equals(partnerView)) {
- return buildPartnerShareCircleData(this.baseMapper.chargingOrderShareIncomeByPayChannel(sixBefore, siteIds));
- }
- List<TChargingOrder> orders = this.lambdaQuery()
- .select(TChargingOrder::getRechargePaymentType, TChargingOrder::getPayMethod,
- TChargingOrder::getThirdPayAmount, TChargingOrder::getThirdRefundAmount,
- TChargingOrder::getBalancePayAmount, TChargingOrder::getBalanceRefundAmount,
- TChargingOrder::getPaymentAmount, TChargingOrder::getRechargeAmount,
- TChargingOrder::getRefundAmount)
- .eq(TChargingOrder::getDelFlag, 0)
- .eq(TChargingOrder::getRechargePaymentStatus, 2)
- .eq(TChargingOrder::getStatus, 5)
- .ge(sixBefore != null, TChargingOrder::getCreateTime, sixBefore == null ? null : sixBefore.atStartOfDay())
- .in(TChargingOrder::getSiteId, siteIds)
- .list();
- BigDecimal wechatAmount = BigDecimal.ZERO;
- BigDecimal alipayAmount = BigDecimal.ZERO;
- BigDecimal balanceAmount = BigDecimal.ZERO;
- for (TChargingOrder order : orders) {
- BigDecimal thirdPayAmount = getThirdPayNetAmount(order);
- BigDecimal balancePayAmount = getBalancePayNetAmount(order);
- Integer rechargePaymentType = order.getRechargePaymentType();
- if (Integer.valueOf(1).equals(rechargePaymentType)) {
- wechatAmount = wechatAmount.add(thirdPayAmount);
- }
- if (Integer.valueOf(2).equals(rechargePaymentType) || Integer.valueOf(3).equals(rechargePaymentType)) {
- alipayAmount = alipayAmount.add(thirdPayAmount);
- }
- Integer payMethod = order.getPayMethod();
- if (Integer.valueOf(1).equals(payMethod) || Integer.valueOf(2).equals(payMethod)) {
- balanceAmount = balanceAmount.add(balancePayAmount);
- }
- }
- return buildPayTypeCircleData(wechatAmount, alipayAmount, balanceAmount);
- }
+ @Override
+ public R<PageInfo<EnterpriseChargingAnalysisVO>> enterpriseChargingAnalysis(EnterpriseChargingAnalysisQuery query) {
+ PageInfo<EnterpriseChargingAnalysisVO> pageInfo = new PageInfo<>(query.getPageCurr(), query.getPageSize());
+ List<EnterpriseChargingAnalysisVO> list = this.baseMapper.enterpriseChargingAnalysis(pageInfo, query);
+ if (list == null || list.isEmpty()) {
+ pageInfo.setRecords(Collections.emptyList());
+ return R.ok(pageInfo);
+ }
+ List<String> companyNames = list.stream()
+ .map(EnterpriseChargingAnalysisVO::getCompanyName)
+ .filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toList());
+ Map<String, List<Map<String, Object>>> topSitesByCompany = groupByCompany(
+ this.baseMapper.enterpriseTopSitesByCompanies(query, companyNames));
+ Map<String, List<Map<String, Object>>> chargingTimesByCompany = groupByCompany(
+ this.baseMapper.enterpriseChargingTimesByCompanies(query, companyNames));
+ for (EnterpriseChargingAnalysisVO row : list) {
+ String companyKey = companyKey(row.getCompanyName(), row.getSocialCreditCode());
+ List<Map<String, Object>> topSites = topSitesByCompany.getOrDefault(companyKey, Collections.emptyList());
+ String topSiteNames = topSites.stream()
+ .sorted(Comparator.comparing((Map<String, Object> item) -> ((Number) item.getOrDefault("counts", 0)).longValue()).reversed())
+ .limit(3)
+ .map(item -> Objects.toString(item.get("siteName"), ""))
+ .filter(org.springframework.util.StringUtils::hasText)
+ .collect(Collectors.joining("、"));
+ row.setTopSiteNames(topSiteNames);
+ List<LocalDateTime> chargingTimes = chargingTimesByCompany.getOrDefault(companyKey, Collections.emptyList()).stream()
+ .map(item -> toLocalDateTime(item.get("startTime")))
+ .filter(Objects::nonNull)
+ .sorted()
+ .collect(Collectors.toList());
+ row.setAverageChargingInterval(calculateAverageChargingInterval(chargingTimes));
+ }
+ pageInfo.setRecords(list);
+ return R.ok(pageInfo);
+ }
- private List<SixIncomeCircleDto> buildPartnerShareCircleData(List<Map<String, Object>> rows) {
- BigDecimal wechatAmount = BigDecimal.ZERO;
- BigDecimal alipayAmount = BigDecimal.ZERO;
- BigDecimal balanceAmount = BigDecimal.ZERO;
- if (rows != null) {
- for (Map<String, Object> row : rows) {
- String channel = row.get("payChannel") == null ? "" : row.get("payChannel").toString();
- BigDecimal shareAmount = getSummaryDecimal(row, "shareAmount");
- if ("WECHAT".equalsIgnoreCase(channel) || "WX".equalsIgnoreCase(channel)) {
- wechatAmount = wechatAmount.add(shareAmount);
- } else if ("ALIPAY".equalsIgnoreCase(channel) || "ALI".equalsIgnoreCase(channel)) {
- alipayAmount = alipayAmount.add(shareAmount);
- } else if ("BALANCE".equalsIgnoreCase(channel) || "WHITELIST".equalsIgnoreCase(channel)) {
- balanceAmount = balanceAmount.add(shareAmount);
- } else {
- wechatAmount = wechatAmount.add(shareAmount);
- }
- }
- }
- return buildPayTypeCircleData(wechatAmount, alipayAmount, balanceAmount);
- }
+ private Map<String, List<Map<String, Object>>> groupByCompany(List<Map<String, Object>> rows) {
+ if (rows == null || rows.isEmpty()) {
+ return Collections.emptyMap();
+ }
+ return rows.stream().collect(Collectors.groupingBy(row -> companyKey(
+ Objects.toString(row.get("companyName"), null),
+ Objects.toString(row.get("socialCreditCode"), ""))));
+ }
- /**
- * 构造固定三类支付方式数据,保证前端饼图在无订单时也有稳定结构。
- */
- private List<SixIncomeCircleDto> buildPayTypeCircleData(BigDecimal wechatAmount, BigDecimal alipayAmount, BigDecimal balanceAmount) {
- List<SixIncomeCircleDto> data = new ArrayList<>();
- data.add(buildIncomeCircleDto("微信支付", wechatAmount));
- data.add(buildIncomeCircleDto("支付宝支付", alipayAmount));
- data.add(buildIncomeCircleDto("余额支付", balanceAmount));
- return data;
- }
+ private String companyKey(String companyName, String socialCreditCode) {
+ return Objects.toString(companyName, "") + "\u0000" + Objects.toString(socialCreditCode, "");
+ }
- /**
- * 构造单个饼图项并统一金额精度。
- */
- private SixIncomeCircleDto buildIncomeCircleDto(String name, BigDecimal paymentAmount) {
- SixIncomeCircleDto dto = new SixIncomeCircleDto();
- dto.setName(name);
- dto.setPaymentAmount(nullToZero(paymentAmount).setScale(2, RoundingMode.HALF_EVEN));
- return dto;
- }
+ private LocalDateTime toLocalDateTime(Object value) {
+ if (value instanceof LocalDateTime) {
+ return (LocalDateTime) value;
+ }
+ if (value instanceof java.sql.Timestamp) {
+ return ((java.sql.Timestamp) value).toLocalDateTime();
+ }
+ if (value instanceof Date) {
+ return LocalDateTime.ofInstant(((Date) value).toInstant(), ZoneId.systemDefault());
+ }
+ return null;
+ }
- /**
- * 计算第三方渠道实收:优先使用拆分字段,兼容旧订单回退到paymentAmount/rechargeAmount。
- */
- private BigDecimal getThirdPayNetAmount(TChargingOrder order) {
- BigDecimal payAmount = order.getThirdPayAmount();
- Integer payMethod = order.getPayMethod();
- BigDecimal totalPaidAmount = firstNonNull(order.getPaymentAmount(), order.getRechargeAmount());
- if (isNullOrZero(payAmount)) {
- if (Integer.valueOf(3).equals(payMethod)) {
- payAmount = totalPaidAmount;
- } else if (Integer.valueOf(2).equals(payMethod) && totalPaidAmount != null) {
- payAmount = nonNegative(totalPaidAmount.subtract(nullToZero(order.getBalancePayAmount())));
- }
- }
- BigDecimal refundAmount = order.getThirdRefundAmount();
- if (refundAmount == null && Integer.valueOf(3).equals(payMethod)) {
- refundAmount = order.getRefundAmount();
- }
- return nonNegative(nullToZero(payAmount).subtract(nullToZero(refundAmount)));
- }
+ @Override
+ public R<PageInfo<EnterpriseChargingDetailVO>> enterpriseChargingDetail(EnterpriseChargingAnalysisQuery query) {
+ PageInfo<EnterpriseChargingDetailVO> pageInfo = new PageInfo<>(query.getPageCurr(), query.getPageSize());
+ Map<Long, TOrderInvoiceDetail> invoiceDetailMap = getEnterpriseInvoiceDetailMap(query);
+ if (invoiceDetailMap.isEmpty()) {
+ pageInfo.setTotal(0L);
+ pageInfo.setRecords(Collections.emptyList());
+ return R.ok(pageInfo);
+ }
+ List<Long> orderIds = new ArrayList<>(invoiceDetailMap.keySet());
+ long total = countEnterpriseChargingDetails(orderIds, query);
+ pageInfo.setTotal(total);
+ if (total == 0L) {
+ pageInfo.setRecords(Collections.emptyList());
+ return R.ok(pageInfo);
+ }
+ List<EnterpriseChargingDetailVO> list = queryEnterpriseChargingDetailPage(
+ orderIds, query, pageInfo.offset(), pageInfo.getSize());
+ fillEnterpriseInvoiceAmounts(list, invoiceDetailMap);
+ fillEnterpriseChargingPeriodCounts(list);
+ pageInfo.setRecords(list);
+ return R.ok(pageInfo);
+ }
- /**
- * 计算余额渠道实收:组合支付优先使用拆分字段,兼容旧余额订单回退到paymentAmount。
- */
- private BigDecimal getBalancePayNetAmount(TChargingOrder order) {
- BigDecimal payAmount = order.getBalancePayAmount();
- Integer payMethod = order.getPayMethod();
- BigDecimal totalPaidAmount = firstNonNull(order.getPaymentAmount(), order.getRechargeAmount());
- if (isNullOrZero(payAmount)) {
- if (Integer.valueOf(1).equals(payMethod)) {
- payAmount = totalPaidAmount;
- } else if (Integer.valueOf(2).equals(payMethod) && totalPaidAmount != null) {
- payAmount = nonNegative(totalPaidAmount.subtract(nullToZero(order.getThirdPayAmount())));
- }
- }
- BigDecimal refundAmount = order.getBalanceRefundAmount();
- if (refundAmount == null && (Integer.valueOf(1).equals(payMethod) || Integer.valueOf(2).equals(payMethod))) {
- refundAmount = order.getRefundAmount();
- }
- return nonNegative(nullToZero(payAmount).subtract(nullToZero(refundAmount)));
- }
+ @Override
+ public List<EnterpriseChargingDetailVO> enterpriseChargingDetailExport(EnterpriseChargingAnalysisQuery query) {
+ Map<Long, TOrderInvoiceDetail> invoiceDetailMap = getEnterpriseInvoiceDetailMap(query);
+ if (invoiceDetailMap.isEmpty()) {
+ return Collections.emptyList();
+ }
+ List<EnterpriseChargingDetailVO> list = queryEnterpriseChargingDetailPage(
+ new ArrayList<>(invoiceDetailMap.keySet()), query, 0L, Long.MAX_VALUE);
+ fillEnterpriseInvoiceAmounts(list, invoiceDetailMap);
+ fillEnterpriseChargingPeriodCounts(list);
+ return list;
+ }
- private BigDecimal firstNonNull(BigDecimal first, BigDecimal second) {
- return first != null ? first : second;
- }
+ private long countEnterpriseChargingDetails(List<Long> orderIds, EnterpriseChargingAnalysisQuery query) {
+ long total = 0L;
+ for (int start = 0; start < orderIds.size(); start += ENTERPRISE_ORDER_ID_BATCH_SIZE) {
+ int end = Math.min(start + ENTERPRISE_ORDER_ID_BATCH_SIZE, orderIds.size());
+ Long batchTotal = this.baseMapper.enterpriseChargingDetailCount(orderIds.subList(start, end), query);
+ if (batchTotal != null) {
+ total += batchTotal;
+ }
+ }
+ return total;
+ }
- private boolean isNullOrZero(BigDecimal value) {
- return value == null || value.compareTo(BigDecimal.ZERO) == 0;
- }
+ private List<EnterpriseChargingDetailVO> queryEnterpriseChargingDetailPage(List<Long> orderIds,
+ EnterpriseChargingAnalysisQuery query, long offset, long pageSize) {
+ if (orderIds == null || orderIds.isEmpty() || pageSize <= 0L) {
+ return Collections.emptyList();
+ }
+ long requiredRows = pageSize == Long.MAX_VALUE || offset > Long.MAX_VALUE - pageSize
+ ? Long.MAX_VALUE : offset + pageSize;
+ List<EnterpriseChargingDetailVO> candidates = new ArrayList<>();
+ for (int start = 0; start < orderIds.size(); start += ENTERPRISE_ORDER_ID_BATCH_SIZE) {
+ int end = Math.min(start + ENTERPRISE_ORDER_ID_BATCH_SIZE, orderIds.size());
+ List<Long> batchOrderIds = orderIds.subList(start, end);
+ long batchLimit = Math.min(requiredRows, batchOrderIds.size());
+ candidates.addAll(this.baseMapper.enterpriseChargingDetail(batchOrderIds, query, 0L, batchLimit));
+ }
+ candidates.sort(Comparator
+ .comparing(EnterpriseChargingDetailVO::getCreateTime,
+ Comparator.nullsLast(Comparator.reverseOrder()))
+ .thenComparing(EnterpriseChargingDetailVO::getId,
+ Comparator.nullsLast(Comparator.reverseOrder())));
+ int fromIndex = (int) Math.min(offset, candidates.size());
+ long requestedEnd = pageSize == Long.MAX_VALUE || fromIndex > Long.MAX_VALUE - pageSize
+ ? Long.MAX_VALUE : fromIndex + pageSize;
+ int toIndex = (int) Math.min(requestedEnd, candidates.size());
+ return new ArrayList<>(candidates.subList(fromIndex, toIndex));
+ }
- private BigDecimal nullToZero(BigDecimal value) {
- return value == null ? BigDecimal.ZERO : value;
- }
+ private Map<Long, TOrderInvoiceDetail> getEnterpriseInvoiceDetailMap(EnterpriseChargingAnalysisQuery query) {
+ List<Long> invoiceIds = this.baseMapper.enterpriseInvoiceIds(query);
+ if (invoiceIds == null || invoiceIds.isEmpty()) {
+ return Collections.emptyMap();
+ }
+ Map<Long, TOrderInvoiceDetail> detailMap = new LinkedHashMap<>();
+ for (int start = 0; start < invoiceIds.size(); start += ENTERPRISE_INVOICE_BATCH_SIZE) {
+ int end = Math.min(start + ENTERPRISE_INVOICE_BATCH_SIZE, invoiceIds.size());
+ List<TOrderInvoiceDetail> details = this.baseMapper.enterpriseInvoiceChargingDetails(invoiceIds.subList(start, end));
+ if (details == null) {
+ continue;
+ }
+ for (TOrderInvoiceDetail detail : details) {
+ if (detail == null || detail.getOrderId() == null) {
+ continue;
+ }
+ detailMap.merge(detail.getOrderId(), detail, this::mergeEnterpriseInvoiceDetail);
+ }
+ }
+ return detailMap;
+ }
- private BigDecimal nonNegative(BigDecimal value) {
- return value.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : value;
- }
+ private TOrderInvoiceDetail mergeEnterpriseInvoiceDetail(TOrderInvoiceDetail current, TOrderInvoiceDetail addition) {
+ current.setElectrovalence(nullToZero(current.getElectrovalence()).add(nullToZero(addition.getElectrovalence())));
+ current.setServiceCharge(nullToZero(current.getServiceCharge()).add(nullToZero(addition.getServiceCharge())));
+ return current;
+ }
- @Override
- public List<Map<String, Object>> getSumByType(LocalDate start, LocalDate end, List<Integer> siteIds) {
- LocalDateTime start1 = start.atStartOfDay();
- LocalDateTime end1 = end.atTime(LocalTime.MAX);
- return this.baseMapper.getSumByType(start1, end1, siteIds);
- }
-
- @Override
- public List<Map<String, Object>> getDateData(LocalDate start, LocalDate end, List<Integer> siteIds) {
- LocalDateTime start1 = start.atStartOfDay();
- LocalDateTime end1 = end.atTime(LocalTime.MAX);
- return this.baseMapper.getDateData(start1, end1, siteIds);
- }
-
- @Override
- public List<Map<String, Object>> getWeekData(LocalDate start, LocalDate end, List<Integer> siteIds) {
- LocalDateTime start1 = start.atStartOfDay();
- LocalDateTime end1 = end.atTime(LocalTime.MAX);
- return this.baseMapper.getWeekData(start1, end1, siteIds);
- }
-
- @Override
- public List<Map<String, Object>> getMonthData(LocalDate start, LocalDate end, List<Integer> siteIds) {
- LocalDateTime start1 = start.atStartOfDay();
- LocalDateTime end1 = end.atTime(LocalTime.MAX);
- return this.baseMapper.getMonthData(start1, end1, siteIds);
- }
-
- @Override
- public List<Map<String, Object>> getYearData(LocalDate start, LocalDate end, List<Integer> siteIds) {
- LocalDateTime start1 = start.atStartOfDay();
- LocalDateTime end1 = end.atTime(LocalTime.MAX);
- return this.baseMapper.getYearData(start1, end1, siteIds);
- }
-
- @Resource
- private SysUserClient sysUserClient;
-
-
- @Override
- public ChargingOrderTimeVO chargingList(ChargingListQuery dto) {
- return chargingPeriodStatistics(dto, true, true);
- }
+ private void fillEnterpriseInvoiceAmounts(List<EnterpriseChargingDetailVO> list,
+ Map<Long, TOrderInvoiceDetail> invoiceDetailMap) {
+ if (list == null || list.isEmpty()) {
+ return;
+ }
+ for (EnterpriseChargingDetailVO detail : list) {
+ TOrderInvoiceDetail invoiceDetail = invoiceDetailMap.get(detail.getId());
+ detail.setElectrovalence(invoiceDetail == null ? BigDecimal.ZERO : nullToZero(invoiceDetail.getElectrovalence()));
+ detail.setServiceCharge(invoiceDetail == null ? BigDecimal.ZERO : nullToZero(invoiceDetail.getServiceCharge()));
+ }
+ }
- @Override
- public PageInfo<ChargingOrderListVO> chargingListPage(ChargingListQuery dto) {
- return chargingPeriodStatistics(dto, true, false).getList();
- }
+ private void fillEnterpriseChargingPeriodCounts(List<EnterpriseChargingDetailVO> list) {
+ if (list == null || list.isEmpty()) {
+ return;
+ }
+ List<Long> orderIds = list.stream()
+ .map(EnterpriseChargingDetailVO::getId)
+ .filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toList());
+ Map<Long, Integer> periodCountMap = new HashMap<>();
+ for (int start = 0; start < orderIds.size(); start += ENTERPRISE_DETAIL_PERIOD_BATCH_SIZE) {
+ int end = Math.min(start + ENTERPRISE_DETAIL_PERIOD_BATCH_SIZE, orderIds.size());
+ List<Map<String, Object>> rows = this.baseMapper.enterpriseChargingPeriodCounts(orderIds.subList(start, end));
+ if (rows == null) {
+ continue;
+ }
+ for (Map<String, Object> row : rows) {
+ Long orderId = mapLong(row, "orderId", "orderid", "charging_order_id");
+ Integer periodCount = mapInteger(row, "periodCount", "periodcount");
+ if (orderId != null) {
+ periodCountMap.put(orderId, periodCount == null ? 0 : periodCount);
+ }
+ }
+ }
+ for (EnterpriseChargingDetailVO detail : list) {
+ detail.setPeriodCount(periodCountMap.getOrDefault(detail.getId(), 0));
+ }
+ }
- @Override
- public ChargingOrderTimeVO chargingListSummary(ChargingListQuery dto) {
- return chargingPeriodStatistics(dto, false, true);
- }
+ private Long mapLong(Map<String, Object> row, String... keys) {
+ Object value = mapValue(row, keys);
+ return value instanceof Number ? ((Number) value).longValue() : null;
+ }
- private ChargingOrderTimeVO chargingPeriodStatistics(ChargingListQuery dto, boolean includeList, boolean includeSummary) {
- String startTime1 = null;
- String startTime2 = null;
- String endTime1 = null;
- String endTime2 = null;
+ private Integer mapInteger(Map<String, Object> row, String... keys) {
+ Object value = mapValue(row, keys);
+ return value instanceof Number ? ((Number) value).intValue() : null;
+ }
- if (StringUtils.hasLength(dto.getStartTime())) {
- String[] split = dto.getStartTime().split(" - ");
- startTime1 = split[0];
+ private Object mapValue(Map<String, Object> row, String... keys) {
+ if (row == null) {
+ return null;
+ }
+ for (String key : keys) {
+ if (row.containsKey(key)) {
+ return row.get(key);
+ }
+ }
+ for (Map.Entry<String, Object> entry : row.entrySet()) {
+ for (String key : keys) {
+ if (entry.getKey() != null && entry.getKey().equalsIgnoreCase(key)) {
+ return entry.getValue();
+ }
+ }
+ }
+ return null;
+ }
+
+ private EnterpriseChargingAnalysisQuery buildEnterpriseRowQuery(EnterpriseChargingAnalysisQuery source, EnterpriseChargingAnalysisVO row) {
+ EnterpriseChargingAnalysisQuery rowQuery = new EnterpriseChargingAnalysisQuery();
+ BeanUtils.copyProperties(source, rowQuery);
+ rowQuery.setCompanyName(null);
+ rowQuery.setExactCompanyName(row.getCompanyName());
+ rowQuery.setSocialCreditCode(row.getSocialCreditCode());
+ return rowQuery;
+ }
+
+ private BigDecimal calculateAverageChargingInterval(List<LocalDateTime> times) {
+ if (times == null || times.size() < 2) {
+ return BigDecimal.ZERO;
+ }
+ long totalSeconds = 0L;
+ for (int i = 1; i < times.size(); i++) {
+ long seconds = Duration.between(times.get(i - 1), times.get(i)).getSeconds();
+ if (seconds > 0) {
+ totalSeconds += seconds;
+ }
+ }
+ return BigDecimal.valueOf(totalSeconds)
+ .divide(BigDecimal.valueOf(times.size() - 1L), 4, RoundingMode.HALF_UP)
+ .divide(BigDecimal.valueOf(3600), 2, RoundingMode.HALF_UP);
+ }
+
+ @Override
+ public R<PageInfo<TChargingOrderRefund>> getRefundList(ChargingRefundDto chargingRefundDto) {
+ PageInfo<TChargingOrderRefund> pageInfo = new PageInfo<>(chargingRefundDto.getPageCurr(), chargingRefundDto.getPageSize());
+ boolean withoutOrderJoin = !StringUtils.hasLength(chargingRefundDto.getSerialNumber())
+ && (chargingRefundDto.getSiteIds() == null || chargingRefundDto.getSiteIds().isEmpty());
+ List<TChargingOrderRefund> list = withoutOrderJoin
+ ? this.baseMapper.getRefundListWithoutOrderJoin(pageInfo, chargingRefundDto)
+ : this.baseMapper.getRefundList(pageInfo, chargingRefundDto);
+ if (withoutOrderJoin) {
+ enrichRefundOrderInfo(list);
+ }
+ for (TChargingOrderRefund refund : list) {
+ refund.setUid(refund.getType() + "-" + refund.getId());
+ }
+ pageInfo.setRecords(list);
+
+ return R.ok(pageInfo);
+ }
+
+ private void enrichRefundOrderInfo(List<TChargingOrderRefund> refunds) {
+ if (refunds == null || refunds.isEmpty()) {
+ return;
+ }
+ Map<Integer, List<Long>> orderIdsByType = refunds.stream()
+ .filter(Objects::nonNull)
+ .filter(refund -> refund.getType() != null && StringUtils.hasLength(refund.getOrderId()))
+ .collect(Collectors.groupingBy(TChargingOrderRefund::getType,
+ Collectors.mapping(refund -> Long.valueOf(refund.getOrderId()), Collectors.toList())));
+
+ Map<Long, TChargingOrder> chargingOrderMap = orderIdsByType.getOrDefault(1, Collections.emptyList()).isEmpty()
+ ? Collections.emptyMap()
+ : indexByLongId(listByIds(orderIdsByType.get(1)), TChargingOrder::getId);
+ Map<Long, TShoppingOrder> shoppingOrderMap = orderIdsByType.getOrDefault(2, Collections.emptyList()).isEmpty()
+ ? Collections.emptyMap()
+ : indexByLongId(shoppingOrderService.listByIds(orderIdsByType.get(2)), TShoppingOrder::getId);
+ Map<Long, TVipOrder> vipOrderMap = orderIdsByType.getOrDefault(3, Collections.emptyList()).isEmpty()
+ ? Collections.emptyMap()
+ : indexByLongId(vipOrderService.listByIds(orderIdsByType.get(3)), TVipOrder::getId);
+
+ for (TChargingOrderRefund refund : refunds) {
+ if (refund == null || refund.getType() == null || !StringUtils.hasLength(refund.getOrderId())) {
+ continue;
+ }
+ Long orderId = Long.valueOf(refund.getOrderId());
+ if (refund.getType() == 1) {
+ TChargingOrder order = chargingOrderMap.get(orderId);
+ if (order != null) {
+ refund.setSerailNumber(order.getRechargeSerialNumber());
+ refund.setPaymentAmount(order.getPaymentAmount());
+ refund.setPayTime(order.getCreateTime());
+ refund.setUserId(order.getAppUserId() == null ? null : String.valueOf(order.getAppUserId()));
+ refund.setSiteId(order.getSiteId());
+ refund.setPayMethod(order.getPayMethod());
+ }
+ } else if (refund.getType() == 2) {
+ TShoppingOrder order = shoppingOrderMap.get(orderId);
+ if (order != null) {
+ refund.setSerailNumber(order.getSerialNumber());
+ refund.setPaymentAmount(order.getPaymentAmount());
+ refund.setPayTime(order.getCreateTime());
+ refund.setUserId(order.getAppUserId() == null ? null : String.valueOf(order.getAppUserId()));
+ refund.setPayMethod(3);
+ }
+ } else if (refund.getType() == 3) {
+ TVipOrder order = vipOrderMap.get(orderId);
+ if (order != null) {
+ refund.setSerailNumber(order.getSerialNumber());
+ refund.setPaymentAmount(order.getPaymentAmount());
+ refund.setPayTime(order.getCreateTime());
+ refund.setUserId(order.getAppUserId() == null ? null : String.valueOf(order.getAppUserId()));
+ refund.setPayMethod(3);
+ }
+ }
+ }
+ }
+
+ @Override
+ public List<ChargingOrderGroup> chargingOrderGroup(ChargingPercentProvinceDto chargingPercentProvinceDto) {
+
+ return this.baseMapper.chargingOrderGroup(chargingPercentProvinceDto);
+ }
+
+ @Override
+ public List<SixChargingDto> charge(LocalDate sixBefore, List<Integer> siteIds, Boolean partnerView) {
+ String sixBeforeValue = sixBefore == null ? null : sixBefore.toString();
+ List<SixChargingDto> result = new ArrayList<>();
+ if (Boolean.TRUE.equals(partnerView)) {
+ List<SixChargingDto> partnerIncome = this.baseMapper.chargePartner(sixBeforeValue, siteIds);
+ if (partnerIncome != null) {
+ result.addAll(partnerIncome);
+ }
+ } else {
+ List<SixChargingDto> settlementIncome = this.baseMapper.chargeSettlement(sixBeforeValue, siteIds);
+ if (settlementIncome != null) {
+ result.addAll(settlementIncome);
+ }
+ String siteIdsCsv = siteIds == null ? null : siteIds.stream()
+ .filter(Objects::nonNull)
+ .map(String::valueOf)
+ .collect(Collectors.joining(","));
+ List<SixChargingDto> currentMonthIncome = this.baseMapper.chargeCurrentMonth(siteIdsCsv);
+ if (currentMonthIncome != null) {
+ result.addAll(currentMonthIncome);
+ }
+ }
+ if (result != null) {
+ for (SixChargingDto item : result) {
+ if (item == null) {
+ continue;
+ }
+ if (item.getMonth() != null) {
+ try {
+ int month = Integer.parseInt(item.getMonth());
+ if (month >= 1 && month <= 12) {
+ item.setMonth(String.format("%02d", month));
+ }
+ } catch (NumberFormatException ignored) {
+ }
+ }
+ if (item.getElectrovalence() != null) {
+ item.setElectrovalence(item.getElectrovalence().setScale(2, RoundingMode.HALF_UP));
+ }
+ if (item.getServiceCharge() != null) {
+ item.setServiceCharge(item.getServiceCharge().setScale(2, RoundingMode.HALF_UP));
+ }
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public List<SixCircleDto> circle(List<Integer> siteIds, LocalDate sixBefore, Boolean partnerView) {
+ List<SixCircleDto> result = this.baseMapper.circle(siteIds, sixBefore, partnerView);
+ if (result != null) {
+ for (SixCircleDto item : result) {
+ if (item != null && item.getPaymentAmount() != null) {
+ item.setPaymentAmount(item.getPaymentAmount().setScale(2, RoundingMode.HALF_UP));
+ }
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public Map<String, Object> countAll(List<Integer> siteIds, Boolean partnerView) {
+ Map<String, Object> result = this.baseMapper.countAll(siteIds, partnerView);
+ if (!Boolean.TRUE.equals(partnerView) && result != null) {
+ result.put("commission_amount", this.baseMapper.sumSuccessfulShareAmount(siteIds));
+ }
+ return result;
+ }
+
+ /**
+ * 统计近六月订单收入支付方式占比;服务层聚合避免复杂CASE SQL在当前数据库驱动中转换异常。
+ */
+ @Override
+ public List<SixIncomeCircleDto> payTypeCircle(LocalDate sixBefore, List<Integer> siteIds, Boolean partnerView) {
+ if (siteIds == null || siteIds.isEmpty()) {
+ return buildPayTypeCircleData(BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO);
+ }
+ if (Boolean.TRUE.equals(partnerView)) {
+ return buildPartnerShareCircleData(this.baseMapper.chargingOrderShareIncomeByPayChannel(sixBefore, siteIds));
+ }
+ List<TChargingOrder> orders = this.lambdaQuery()
+ .select(TChargingOrder::getRechargePaymentType, TChargingOrder::getPayMethod,
+ TChargingOrder::getThirdPayAmount, TChargingOrder::getThirdRefundAmount,
+ TChargingOrder::getBalancePayAmount, TChargingOrder::getBalanceRefundAmount,
+ TChargingOrder::getPaymentAmount, TChargingOrder::getRechargeAmount,
+ TChargingOrder::getRefundAmount)
+ .eq(TChargingOrder::getDelFlag, 0)
+ .eq(TChargingOrder::getRechargePaymentStatus, 2)
+ .eq(TChargingOrder::getStatus, 5)
+ .ge(sixBefore != null, TChargingOrder::getCreateTime, sixBefore == null ? null : sixBefore.atStartOfDay())
+ .in(TChargingOrder::getSiteId, siteIds)
+ .list();
+ BigDecimal wechatAmount = BigDecimal.ZERO;
+ BigDecimal alipayAmount = BigDecimal.ZERO;
+ BigDecimal balanceAmount = BigDecimal.ZERO;
+ for (TChargingOrder order : orders) {
+ BigDecimal thirdPayAmount = getThirdPayNetAmount(order);
+ BigDecimal balancePayAmount = getBalancePayNetAmount(order);
+ Integer rechargePaymentType = order.getRechargePaymentType();
+ if (Integer.valueOf(1).equals(rechargePaymentType)) {
+ wechatAmount = wechatAmount.add(thirdPayAmount);
+ }
+ if (Integer.valueOf(2).equals(rechargePaymentType) || Integer.valueOf(3).equals(rechargePaymentType)) {
+ alipayAmount = alipayAmount.add(thirdPayAmount);
+ }
+ Integer payMethod = order.getPayMethod();
+ if (Integer.valueOf(1).equals(payMethod) || Integer.valueOf(2).equals(payMethod)) {
+ balanceAmount = balanceAmount.add(balancePayAmount);
+ }
+ }
+ return buildPayTypeCircleData(wechatAmount, alipayAmount, balanceAmount);
+ }
+
+ private List<SixIncomeCircleDto> buildPartnerShareCircleData(List<Map<String, Object>> rows) {
+ BigDecimal wechatAmount = BigDecimal.ZERO;
+ BigDecimal alipayAmount = BigDecimal.ZERO;
+ BigDecimal balanceAmount = BigDecimal.ZERO;
+ if (rows != null) {
+ for (Map<String, Object> row : rows) {
+ String channel = row.get("payChannel") == null ? "" : row.get("payChannel").toString();
+ BigDecimal shareAmount = getSummaryDecimal(row, "shareAmount");
+ if ("WECHAT".equalsIgnoreCase(channel) || "WX".equalsIgnoreCase(channel)) {
+ wechatAmount = wechatAmount.add(shareAmount);
+ } else if ("ALIPAY".equalsIgnoreCase(channel) || "ALI".equalsIgnoreCase(channel)) {
+ alipayAmount = alipayAmount.add(shareAmount);
+ } else if ("BALANCE".equalsIgnoreCase(channel) || "WHITELIST".equalsIgnoreCase(channel)) {
+ balanceAmount = balanceAmount.add(shareAmount);
+ } else {
+ wechatAmount = wechatAmount.add(shareAmount);
+ }
+ }
+ }
+ return buildPayTypeCircleData(wechatAmount, alipayAmount, balanceAmount);
+ }
+
+ /**
+ * 构造固定三类支付方式数据,保证前端饼图在无订单时也有稳定结构。
+ */
+ private List<SixIncomeCircleDto> buildPayTypeCircleData(BigDecimal wechatAmount, BigDecimal alipayAmount, BigDecimal balanceAmount) {
+ List<SixIncomeCircleDto> data = new ArrayList<>();
+ data.add(buildIncomeCircleDto("微信支付", wechatAmount));
+ data.add(buildIncomeCircleDto("支付宝支付", alipayAmount));
+ data.add(buildIncomeCircleDto("余额支付", balanceAmount));
+ return data;
+ }
+
+ /**
+ * 构造单个饼图项并统一金额精度。
+ */
+ private SixIncomeCircleDto buildIncomeCircleDto(String name, BigDecimal paymentAmount) {
+ SixIncomeCircleDto dto = new SixIncomeCircleDto();
+ dto.setName(name);
+ dto.setPaymentAmount(nullToZero(paymentAmount).setScale(2, RoundingMode.HALF_EVEN));
+ return dto;
+ }
+
+ /**
+ * 计算第三方渠道实收:优先使用拆分字段,兼容旧订单回退到paymentAmount/rechargeAmount。
+ */
+ private BigDecimal getThirdPayNetAmount(TChargingOrder order) {
+ BigDecimal payAmount = order.getThirdPayAmount();
+ Integer payMethod = order.getPayMethod();
+ BigDecimal totalPaidAmount = firstNonNull(order.getPaymentAmount(), order.getRechargeAmount());
+ if (isNullOrZero(payAmount)) {
+ if (Integer.valueOf(3).equals(payMethod)) {
+ payAmount = totalPaidAmount;
+ } else if (Integer.valueOf(2).equals(payMethod) && totalPaidAmount != null) {
+ payAmount = nonNegative(totalPaidAmount.subtract(nullToZero(order.getBalancePayAmount())));
+ }
+ }
+ BigDecimal refundAmount = order.getThirdRefundAmount();
+ if (refundAmount == null && Integer.valueOf(3).equals(payMethod)) {
+ refundAmount = order.getRefundAmount();
+ }
+ return nonNegative(nullToZero(payAmount).subtract(nullToZero(refundAmount)));
+ }
+
+ /**
+ * 计算余额渠道实收:组合支付优先使用拆分字段,兼容旧余额订单回退到paymentAmount。
+ */
+ private BigDecimal getBalancePayNetAmount(TChargingOrder order) {
+ BigDecimal payAmount = order.getBalancePayAmount();
+ Integer payMethod = order.getPayMethod();
+ BigDecimal totalPaidAmount = firstNonNull(order.getPaymentAmount(), order.getRechargeAmount());
+ if (isNullOrZero(payAmount)) {
+ if (Integer.valueOf(1).equals(payMethod)) {
+ payAmount = totalPaidAmount;
+ } else if (Integer.valueOf(2).equals(payMethod) && totalPaidAmount != null) {
+ payAmount = nonNegative(totalPaidAmount.subtract(nullToZero(order.getThirdPayAmount())));
+ }
+ }
+ BigDecimal refundAmount = order.getBalanceRefundAmount();
+ if (refundAmount == null && (Integer.valueOf(1).equals(payMethod) || Integer.valueOf(2).equals(payMethod))) {
+ refundAmount = order.getRefundAmount();
+ }
+ return nonNegative(nullToZero(payAmount).subtract(nullToZero(refundAmount)));
+ }
+
+ private BigDecimal firstNonNull(BigDecimal first, BigDecimal second) {
+ return first != null ? first : second;
+ }
+
+ private boolean isNullOrZero(BigDecimal value) {
+ return value == null || value.compareTo(BigDecimal.ZERO) == 0;
+ }
+
+ private BigDecimal nullToZero(BigDecimal value) {
+ return value == null ? BigDecimal.ZERO : value;
+ }
+
+ private BigDecimal nonNegative(BigDecimal value) {
+ return value.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : value;
+ }
+
+ @Override
+ public List<Map<String, Object>> getSumByType(LocalDate start, LocalDate end, List<Integer> siteIds) {
+ LocalDateTime start1 = start.atStartOfDay();
+ LocalDateTime end1 = end.atTime(LocalTime.MAX);
+ return this.baseMapper.getSumByType(start1, end1, siteIds);
+ }
+
+ @Override
+ public List<Map<String, Object>> getDateData(LocalDate start, LocalDate end, List<Integer> siteIds) {
+ LocalDateTime start1 = start.atStartOfDay();
+ LocalDateTime end1 = end.atTime(LocalTime.MAX);
+ return this.baseMapper.getDateData(start1, end1, siteIds);
+ }
+
+ @Override
+ public List<Map<String, Object>> getWeekData(LocalDate start, LocalDate end, List<Integer> siteIds) {
+ LocalDateTime start1 = start.atStartOfDay();
+ LocalDateTime end1 = end.atTime(LocalTime.MAX);
+ return this.baseMapper.getWeekData(start1, end1, siteIds);
+ }
+
+ @Override
+ public List<Map<String, Object>> getMonthData(LocalDate start, LocalDate end, List<Integer> siteIds) {
+ LocalDateTime start1 = start.atStartOfDay();
+ LocalDateTime end1 = end.atTime(LocalTime.MAX);
+ return this.baseMapper.getMonthData(start1, end1, siteIds);
+ }
+
+ @Override
+ public List<Map<String, Object>> getYearData(LocalDate start, LocalDate end, List<Integer> siteIds) {
+ LocalDateTime start1 = start.atStartOfDay();
+ LocalDateTime end1 = end.atTime(LocalTime.MAX);
+ return this.baseMapper.getYearData(start1, end1, siteIds);
+ }
+
+ @Resource
+ private SysUserClient sysUserClient;
+
+
+ @Override
+ public ChargingOrderTimeVO chargingList(ChargingListQuery dto) {
+ return chargingPeriodStatistics(dto, true, true);
+ }
+
+ @Override
+ public PageInfo<ChargingOrderListVO> chargingListPage(ChargingListQuery dto) {
+ return chargingPeriodStatistics(dto, true, false).getList();
+ }
+
+ @Override
+ public ChargingOrderTimeVO chargingListSummary(ChargingListQuery dto) {
+ return chargingPeriodStatistics(dto, false, true);
+ }
+
+ private ChargingOrderTimeVO chargingPeriodStatistics(ChargingListQuery dto, boolean includeList, boolean includeSummary) {
+ String startTime1 = null;
+ String startTime2 = null;
+ String endTime1 = null;
+ String endTime2 = null;
+
+ if (StringUtils.hasLength(dto.getStartTime())) {
+ String[] split = dto.getStartTime().split(" - ");
+ startTime1 = split[0];
String[] split1 = split[1].split(":");
startTime2 = split1[0] + ":" + split1[1] + ":59";
- }
+ }
- if (StringUtils.hasLength(dto.getEndTime())) {
- String[] split = dto.getEndTime().split(" - ");
- endTime1 = split[0];
+ if (StringUtils.hasLength(dto.getEndTime())) {
+ String[] split = dto.getEndTime().split(" - ");
+ endTime1 = split[0];
String[] split1 = split[1].split(":");
endTime2 = split1[0] + ":" + split1[1] + ":59";
- }
- ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO();
- if (StringUtils.hasLength(dto.getPhone())) {
- List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
- if (data != null) {
- if (!data.isEmpty()) {
- dto.setUserIds(data);
- }
- } else {
- dto.setUserIds(new ArrayList<Long>());
- }
- if (dto.getUserIds().isEmpty()) {
- List<Long> carIds = dto.getUserIds();
- carIds.add(-1L);
- dto.setUserIds(carIds);
- }
- }
- if (StringUtils.hasLength(dto.getLicensePlate())) {
- List<Long> data = appUserCarClient.getAppUserCarByLicensePlates(dto.getLicensePlate()).getData();
- if (data != null) {
- if (!data.isEmpty()) {
- dto.setCarIds(data);
- }
- } else {
- dto.setCarIds(new ArrayList<Long>());
- }
- if (dto.getCarIds().isEmpty()) {
- List<Long> carIds = dto.getCarIds();
- carIds.add(-1L);
- dto.setCarIds(carIds);
- }
- }
- Long userId = tokenService.getLoginUser().getUserid();
- // 查询当前登陆人按钮权限
- SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
- Integer roleType = sysUser.getRoleType();
- //如果没传siteId,获取当前登陆人所有的siteIds
- List<Integer> siteIds = new ArrayList<>();
- if (dto.getSiteId() == null) {
- if (userId != null) {
- List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
- for (GetSiteListDTO datum : data) {
- siteIds.add(datum.getId());
- }
- }
- } else {
- siteIds.add(dto.getSiteId());
- }
- if (siteIds.isEmpty()) {
- siteIds.add(-1);
- } else {
- if (roleType == 2) {
- List<Integer> integers = new ArrayList<>();
- for (Integer siteId : siteIds) {
- // 校验有没有这个站点的权限
- List<Boolean> t1 = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData();
-
- Boolean b = t1.get(1);
- if (b) {
- integers.add(siteId);
- }
- }
- siteIds = integers;
- }
- }
- dto.setSiteIds(siteIds);
- PageInfo<ChargingOrderListVO> pageInfo = null;
- List<ChargingOrderListVO> list = new ArrayList<>();
- if (includeList) {
- pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
- List<Map<String, Object>> maps = this.baseMapper.chargingList1(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
- List<Map<String, Object>> accountingSummaries = loadChargingPeriodAccountingSummaries(maps);
- mergeChargingPeriodAccountingRows(maps, accountingSummaries);
- Map<Integer, Site> siteMap = loadChargingPeriodSites(maps);
- Map<Integer, TChargingPile> pileMap = loadChargingPeriodPiles(maps);
- Map<Integer, TChargingGun> gunMap = loadChargingPeriodGuns(maps);
- Map<Long, TAppUser> userMap = loadChargingPeriodUsers(maps);
- Map<Long, TAppUserCar> carMap = loadChargingPeriodCars(maps);
- for (Map<String, Object> map : maps) {
- if(null == map){
- continue;
- }
- ChargingOrderListVO chargingOrderListVO = new ChargingOrderListVO();
- if (roleType == 2) {
- List<Boolean> data = partnerClient.getChargingListMenu(sysUser.getObjectId(), Integer.valueOf(map.get("siteId").toString())).getData();
- chargingOrderListVO.setAuthInfo(data.get(0));
- chargingOrderListVO.setAuthCurve(data.get(1));
- }
- chargingOrderListVO.setUid(map.get("id").toString());
- chargingOrderListVO.setCode(map.get("code").toString());
- chargingOrderListVO.setId(Long.valueOf(map.get("id").toString()));
- chargingOrderListVO.setSiteId(Integer.valueOf(map.get("siteId").toString()));
- chargingOrderListVO.setOrderSource(Integer.valueOf(map.get("orderSource").toString()));
- Site site = siteMap.get(chargingOrderListVO.getSiteId());
- chargingOrderListVO.setSiteName(site == null ? "" : site.getName());
- chargingOrderListVO.setOrderType(map.get("orderType").toString());
- Integer pileId = getNullableInteger(map, "chargingPileId");
- Integer gunId = getNullableInteger(map, "chargingGunId");
- TChargingPile pile = pileMap.get(pileId);
- TChargingGun gun = gunMap.get(gunId);
- String pileName = pile == null || pile.getName() == null ? "" : pile.getName();
- String gunName = gun == null || gun.getName() == null ? "" : gun.getName();
- chargingOrderListVO.setTerminalName(pileName.isEmpty() ? gunName : (gunName.isEmpty() ? pileName : pileName + "-" + gunName));
- chargingOrderListVO.setElectricity(null == map.get("electricity") ? BigDecimal.ZERO : new BigDecimal(map.get("electricity").toString()));
- chargingOrderListVO.setChargingCapacity(chargingOrderListVO.getElectricity());
- BigDecimal periodElectricPrice = getSummaryDecimal(map, "periodElectricPrice");
- BigDecimal periodServicePrice = getSummaryDecimal(map, "periodServicePrice");
- if(periodServicePrice.compareTo(BigDecimal.ZERO) != 0){
- Integer orderSource = chargingOrderListVO.getOrderSource();
- if(2 == orderSource){
- BigDecimal bigDecimal = periodServicePrice.multiply(new BigDecimal("0.8")).setScale(2, RoundingMode.HALF_EVEN);
- chargingOrderListVO.setServiceCharge(bigDecimal);
- chargingOrderListVO.setPaymentAmount(periodElectricPrice.add(bigDecimal).setScale(2, RoundingMode.HALF_EVEN));
- BigDecimal sharingAmount = periodServicePrice.multiply(new BigDecimal("0.2")).setScale(2, RoundingMode.HALF_EVEN);
- chargingOrderListVO.setSharingAmount(sharingAmount);
- }else{
- chargingOrderListVO.setServiceCharge(periodServicePrice);
- chargingOrderListVO.setPaymentAmount(periodElectricPrice.add(periodServicePrice).setScale(2, RoundingMode.HALF_EVEN));
- chargingOrderListVO.setSharingAmount(BigDecimal.ZERO);
- }
- }else{
- chargingOrderListVO.setServiceCharge(BigDecimal.ZERO);
- chargingOrderListVO.setPaymentAmount(BigDecimal.ZERO);
- chargingOrderListVO.setSharingAmount(BigDecimal.ZERO);
- }
- chargingOrderListVO.setElectrovalence(null == map.get("electrovalence") ? BigDecimal.ZERO : new BigDecimal(map.get("electrovalence").toString()));
- if(null != map.get("tripartitePlatformName")){
- chargingOrderListVO.setTripartitePlatformName(map.get("tripartitePlatformName").toString());
- }
- if(null != map.get("startTime")){
- chargingOrderListVO.setStartTime(LocalDateTime.parse(map.get("startTime").toString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
- }
- if(null != map.get("endTime")){
- chargingOrderListVO.setEndTime(LocalDateTime.parse(map.get("endTime").toString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
- }
- if(null != map.get("chargingSecond")){
- chargingOrderListVO.setChargingSecond(Long.valueOf(map.get("chargingSecond").toString()));
- }else{
- chargingOrderListVO.setChargingSecond(0L);
- }
- if(null != map.get("startSoc")){
- chargingOrderListVO.setEndSoc(map.get("startSoc").toString());
- }
- if(null != map.get("endSoc")){
- chargingOrderListVO.setEndSoc(map.get("endSoc").toString());
- }
- if(null != map.get("status")){
- chargingOrderListVO.setStatus(Integer.valueOf(map.get("status").toString()));
- }
- if(null != map.get("endMode")){
- chargingOrderListVO.setEndMode(Integer.valueOf(map.get("endMode").toString()));
- }
- TAppUser appUser = userMap.get(getNullableLong(map, "appUserId"));
- if (appUser != null) chargingOrderListVO.setPhone(appUser.getPhone());
- TAppUserCar appUserCar = carMap.get(getNullableLong(map, "appUserCarId"));
- if (appUserCar != null) chargingOrderListVO.setLicensePlate(appUserCar.getLicensePlate());
- chargingOrderListVO.setIsWhitelist(null == map.get("isWhitelist") ? 0 : Integer.valueOf(map.get("isWhitelist").toString()));
- // 白名单退款金额由电费退款和服务费退款组成,列表展示总额,财务导出继续保留拆分字段。
- chargingOrderListVO.setWhitelistElectricRefundAmount(getSummaryDecimal(map, "whitelistElectricRefundAmount"));
- chargingOrderListVO.setWhitelistServiceRefundAmount(getSummaryDecimal(map, "whitelistServiceRefundAmount"));
- chargingOrderListVO.setWhitelistRefundAmount(getSummaryDecimal(map, "whitelistRefundAmount"));
- BigDecimal jian = null == map.get("jian") ? BigDecimal.ZERO : new BigDecimal(map.get("jian").toString());
- BigDecimal feng = null == map.get("feng") ? BigDecimal.ZERO : new BigDecimal(map.get("feng").toString());
- BigDecimal ping = null == map.get("ping") ? BigDecimal.ZERO : new BigDecimal(map.get("ping").toString());
- BigDecimal gu = null == map.get("gu") ? BigDecimal.ZERO : new BigDecimal(map.get("gu").toString());
- BigDecimal total = jian.add(feng).add(ping).add(gu);
- if (total.compareTo(new BigDecimal("0")) != 0) {
- chargingOrderListVO.setElectronicProportion(
- jian.divide(total, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%(尖)/"
- + feng.divide(total, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%(峰)/"
- + ping.divide(total, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%(平)/"
- + gu.divide(total, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%(谷)");
- } else {
- chargingOrderListVO.setElectronicProportion(
- "0" + "%(尖)/" +
- "0" + "%(峰)/" +
- "0" + "%(平)/" +
- "0" + "%(谷)");
- }
- list.add(chargingOrderListVO);
- }
- fillChargingPeriodShareIncome(list);
- }
+ }
+ ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO();
+ if (StringUtils.hasLength(dto.getPhone())) {
+ List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
+ if (data != null) {
+ if (!data.isEmpty()) {
+ dto.setUserIds(data);
+ }
+ } else {
+ dto.setUserIds(new ArrayList<Long>());
+ }
+ if (dto.getUserIds().isEmpty()) {
+ List<Long> carIds = dto.getUserIds();
+ carIds.add(-1L);
+ dto.setUserIds(carIds);
+ }
+ }
+ if (StringUtils.hasLength(dto.getLicensePlate())) {
+ List<Long> data = appUserCarClient.getAppUserCarByLicensePlates(dto.getLicensePlate()).getData();
+ if (data != null) {
+ if (!data.isEmpty()) {
+ dto.setCarIds(data);
+ }
+ } else {
+ dto.setCarIds(new ArrayList<Long>());
+ }
+ if (dto.getCarIds().isEmpty()) {
+ List<Long> carIds = dto.getCarIds();
+ carIds.add(-1L);
+ dto.setCarIds(carIds);
+ }
+ }
+ Long userId = tokenService.getLoginUser().getUserid();
+ // 查询当前登陆人按钮权限
+ SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
+ Integer roleType = sysUser.getRoleType();
+ //如果没传siteId,获取当前登陆人所有的siteIds
+ List<Integer> siteIds = new ArrayList<>();
+ if (dto.getSiteId() == null) {
+ if (userId != null) {
+ List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
+ for (GetSiteListDTO datum : data) {
+ siteIds.add(datum.getId());
+ }
+ }
+ } else {
+ siteIds.add(dto.getSiteId());
+ }
+ if (siteIds.isEmpty()) {
+ siteIds.add(-1);
+ } else {
+ if (roleType == 2) {
+ List<Integer> integers = new ArrayList<>();
+ for (Integer siteId : siteIds) {
+ // 校验有没有这个站点的权限
+ List<Boolean> t1 = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData();
- if (includeSummary) {
- // 尖峰平谷充电到账
- BigDecimal jianElectronic = new BigDecimal("0");
- BigDecimal fengElectronic = new BigDecimal("0");
- BigDecimal pingElectronic = new BigDecimal("0");
- BigDecimal guElectronic = new BigDecimal("0");
- // 尖峰平谷服务费
- BigDecimal jianService = new BigDecimal("0");
- BigDecimal fengService = new BigDecimal("0");
- BigDecimal pingService = new BigDecimal("0");
- BigDecimal guService = new BigDecimal("0");
- // 尖峰平谷充电量 度数
- BigDecimal jian = new BigDecimal("0");
- BigDecimal feng = new BigDecimal("0");
- BigDecimal ping = new BigDecimal("0");
- BigDecimal gu = new BigDecimal("0");
- Map<String, Object> map = this.baseMapper.chargingListSum(dto, startTime1, startTime2, endTime1, endTime2);
- if (map == null) {
- map = new HashMap<>();
- }
- jianElectronic = getSummaryDecimal(map, "jianElectronic");
- fengElectronic = getSummaryDecimal(map, "fengElectronic");
- pingElectronic = getSummaryDecimal(map, "pingElectronic");
- guElectronic = getSummaryDecimal(map, "guElectronic");
- jianService = getSummaryDecimal(map, "jianService");
- fengService = getSummaryDecimal(map, "fengService");
- pingService = getSummaryDecimal(map, "pingService");
- guService = getSummaryDecimal(map, "guService");
- jian = getSummaryDecimal(map, "jian");
- feng = getSummaryDecimal(map, "feng");
- ping = getSummaryDecimal(map, "ping");
- gu = getSummaryDecimal(map, "gu");
- //订单数量
- Integer summaryOrderCount = getNullableInteger(map, "orderCount");
- int orderCount = summaryOrderCount == null ? 0 : summaryOrderCount;
- // 计算充电总度数
- BigDecimal electronic = getSummaryDecimal(map, "electronic");
- // 支付金额
- BigDecimal paymentAmount = getSummaryDecimal(map, "paymentAmount");
- // 电费
- BigDecimal electrovalence = getSummaryDecimal(map, "electrovalence");
- // 服务费
- BigDecimal serviceCharge = getSummaryDecimal(map, "serviceCharge");
- chargingOrderTimeVO.setOrderCount(orderCount);
- chargingOrderTimeVO.setChargingCapacity(electronic.setScale(2, BigDecimal.ROUND_HALF_EVEN));
- chargingOrderTimeVO.setPaymentAmount(paymentAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN));
- chargingOrderTimeVO.setElectrovalence(electrovalence.setScale(2, BigDecimal.ROUND_HALF_EVEN));
- chargingOrderTimeVO.setServiceCharge(serviceCharge.setScale(2, BigDecimal.ROUND_HALF_EVEN));
- List<Long> summaryOrderIds = this.baseMapper.chargingListSummaryOrderIds(
- dto, startTime1, startTime2, endTime1, endTime2);
- Map<String, Object> shareIncomeMap = getChargingOrderShareIncomeSummary(summaryOrderIds);
- chargingOrderTimeVO.setPlatformIncome(getSummaryDecimal(shareIncomeMap, "platformIncomeTotal"));
- chargingOrderTimeVO.setPartnerIncome(getSummaryDecimal(shareIncomeMap, "partnerIncomeTotal"));
- // 计算尖峰平谷充电到账占比
- BigDecimal add = jianElectronic.add(fengElectronic).add(pingElectronic).add(guElectronic);
- // 计算尖峰平谷服务费占比
- BigDecimal add1 = jianService.add(fengService).add(pingService).add(guService);
- // 计算尖峰平谷充电量占比
- BigDecimal add2 = jian.add(feng).add(ping).add(gu);
- if (add.compareTo(new BigDecimal("0")) != 0) {
- chargingOrderTimeVO.setCapacityProportion(jian + "度/" + feng + "度/" + ping + "度/" + gu + "度-"
- + jian.divide(add2, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
- + feng.divide(add2, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
- + ping.divide(add2, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
- + gu.divide(add2, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%");
- chargingOrderTimeVO.setServiceProportion(jianService + "元/" + fengService + "元/" + pingService + "元/" + guService + "元-"
- + jianService.divide(add1, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
- + fengService.divide(add1, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
- + pingService.divide(add1, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
- + guService.divide(add1, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%");
- chargingOrderTimeVO.setElectronicProportion(jianElectronic + "元/" + fengElectronic + "元/" + pingElectronic + "元/" + guElectronic + "元-"
- + jianElectronic.divide(add, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
- + fengElectronic.divide(add, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
- + pingElectronic.divide(add, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
- + guElectronic.divide(add, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%");
- } else {
- chargingOrderTimeVO.setCapacityProportion(jianElectronic + "度/" + fengElectronic + "度/" + pingElectronic + "度/" + guElectronic + "度-"
- + "0" + "%/"
- + "0" + "%/"
- + "0" + "%/"
- + "0" + "%");
- chargingOrderTimeVO.setServiceProportion(jianService + "元/" + fengService + "元/" + pingService + "元/" + guService + "元-"
- + "0" + "%/"
- + "0" + "%/"
- + "0" + "%/"
- + "0" + "%");
- chargingOrderTimeVO.setElectronicProportion(jian + "元/" + feng + "元/" + ping + "元/" + gu + "元-"
- + "0" + "%/"
- + "0" + "%/"
- + "0" + "%/"
- + "0" + "%");
- }
- }
- if (includeList) {
- pageInfo.setRecords(list);
- chargingOrderTimeVO.setList(pageInfo);
- }
- return chargingOrderTimeVO;
- }
+ Boolean b = t1.get(1);
+ if (b) {
+ integers.add(siteId);
+ }
+ }
+ siteIds = integers;
+ }
+ }
+ dto.setSiteIds(siteIds);
+ PageInfo<ChargingOrderListVO> pageInfo = null;
+ List<ChargingOrderListVO> list = new ArrayList<>();
+ if (includeList) {
+ pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
+ List<Map<String, Object>> maps = this.baseMapper.chargingList1(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
+ List<Map<String, Object>> accountingSummaries = loadChargingPeriodAccountingSummaries(maps);
+ mergeChargingPeriodAccountingRows(maps, accountingSummaries);
+ Map<Integer, Site> siteMap = loadChargingPeriodSites(maps);
+ Map<Integer, TChargingPile> pileMap = loadChargingPeriodPiles(maps);
+ Map<Integer, TChargingGun> gunMap = loadChargingPeriodGuns(maps);
+ Map<Long, TAppUser> userMap = loadChargingPeriodUsers(maps);
+ Map<Long, TAppUserCar> carMap = loadChargingPeriodCars(maps);
+ for (Map<String, Object> map : maps) {
+ if (null == map) {
+ continue;
+ }
+ ChargingOrderListVO chargingOrderListVO = new ChargingOrderListVO();
+ if (roleType == 2) {
+ List<Boolean> data = partnerClient.getChargingListMenu(sysUser.getObjectId(), Integer.valueOf(map.get("siteId").toString())).getData();
+ chargingOrderListVO.setAuthInfo(data.get(0));
+ chargingOrderListVO.setAuthCurve(data.get(1));
+ }
+ chargingOrderListVO.setUid(map.get("id").toString());
+ chargingOrderListVO.setCode(map.get("code").toString());
+ chargingOrderListVO.setId(Long.valueOf(map.get("id").toString()));
+ chargingOrderListVO.setSiteId(Integer.valueOf(map.get("siteId").toString()));
+ chargingOrderListVO.setOrderSource(Integer.valueOf(map.get("orderSource").toString()));
+ Site site = siteMap.get(chargingOrderListVO.getSiteId());
+ chargingOrderListVO.setSiteName(site == null ? "" : site.getName());
+ chargingOrderListVO.setOrderType(map.get("orderType").toString());
+ Integer pileId = getNullableInteger(map, "chargingPileId");
+ Integer gunId = getNullableInteger(map, "chargingGunId");
+ TChargingPile pile = pileMap.get(pileId);
+ TChargingGun gun = gunMap.get(gunId);
+ String pileName = pile == null || pile.getName() == null ? "" : pile.getName();
+ String gunName = gun == null || gun.getName() == null ? "" : gun.getName();
+ chargingOrderListVO.setTerminalName(pileName.isEmpty() ? gunName : (gunName.isEmpty() ? pileName : pileName + "-" + gunName));
+ chargingOrderListVO.setElectricity(null == map.get("electricity") ? BigDecimal.ZERO : new BigDecimal(map.get("electricity").toString()));
+ chargingOrderListVO.setChargingCapacity(chargingOrderListVO.getElectricity());
+ BigDecimal periodElectricPrice = getSummaryDecimal(map, "periodElectricPrice");
+ BigDecimal periodServicePrice = getSummaryDecimal(map, "periodServicePrice");
+ if (periodServicePrice.compareTo(BigDecimal.ZERO) != 0) {
+ Integer orderSource = chargingOrderListVO.getOrderSource();
+ if (2 == orderSource) {
+ BigDecimal bigDecimal = periodServicePrice.multiply(new BigDecimal("0.8")).setScale(2, RoundingMode.HALF_EVEN);
+ chargingOrderListVO.setServiceCharge(bigDecimal);
+ chargingOrderListVO.setPaymentAmount(periodElectricPrice.add(bigDecimal).setScale(2, RoundingMode.HALF_EVEN));
+ BigDecimal sharingAmount = periodServicePrice.multiply(new BigDecimal("0.2")).setScale(2, RoundingMode.HALF_EVEN);
+ chargingOrderListVO.setSharingAmount(sharingAmount);
+ } else {
+ chargingOrderListVO.setServiceCharge(periodServicePrice);
+ chargingOrderListVO.setPaymentAmount(periodElectricPrice.add(periodServicePrice).setScale(2, RoundingMode.HALF_EVEN));
+ chargingOrderListVO.setSharingAmount(BigDecimal.ZERO);
+ }
+ } else {
+ chargingOrderListVO.setServiceCharge(BigDecimal.ZERO);
+ chargingOrderListVO.setPaymentAmount(BigDecimal.ZERO);
+ chargingOrderListVO.setSharingAmount(BigDecimal.ZERO);
+ }
+ chargingOrderListVO.setElectrovalence(null == map.get("electrovalence") ? BigDecimal.ZERO : new BigDecimal(map.get("electrovalence").toString()));
+ if (null != map.get("tripartitePlatformName")) {
+ chargingOrderListVO.setTripartitePlatformName(map.get("tripartitePlatformName").toString());
+ }
+ if (null != map.get("startTime")) {
+ chargingOrderListVO.setStartTime(LocalDateTime.parse(map.get("startTime").toString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ }
+ if (null != map.get("endTime")) {
+ chargingOrderListVO.setEndTime(LocalDateTime.parse(map.get("endTime").toString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ }
+ if (null != map.get("chargingSecond")) {
+ chargingOrderListVO.setChargingSecond(Long.valueOf(map.get("chargingSecond").toString()));
+ } else {
+ chargingOrderListVO.setChargingSecond(0L);
+ }
+ if (null != map.get("startSoc")) {
+ chargingOrderListVO.setEndSoc(map.get("startSoc").toString());
+ }
+ if (null != map.get("endSoc")) {
+ chargingOrderListVO.setEndSoc(map.get("endSoc").toString());
+ }
+ if (null != map.get("status")) {
+ chargingOrderListVO.setStatus(Integer.valueOf(map.get("status").toString()));
+ }
+ if (null != map.get("endMode")) {
+ chargingOrderListVO.setEndMode(Integer.valueOf(map.get("endMode").toString()));
+ }
+ TAppUser appUser = userMap.get(getNullableLong(map, "appUserId"));
+ if (appUser != null) chargingOrderListVO.setPhone(appUser.getPhone());
+ TAppUserCar appUserCar = carMap.get(getNullableLong(map, "appUserCarId"));
+ if (appUserCar != null) chargingOrderListVO.setLicensePlate(appUserCar.getLicensePlate());
+ chargingOrderListVO.setIsWhitelist(null == map.get("isWhitelist") ? 0 : Integer.valueOf(map.get("isWhitelist").toString()));
+ // 白名单退款金额由电费退款和服务费退款组成,列表展示总额,财务导出继续保留拆分字段。
+ chargingOrderListVO.setWhitelistElectricRefundAmount(getSummaryDecimal(map, "whitelistElectricRefundAmount"));
+ chargingOrderListVO.setWhitelistServiceRefundAmount(getSummaryDecimal(map, "whitelistServiceRefundAmount"));
+ chargingOrderListVO.setWhitelistRefundAmount(getSummaryDecimal(map, "whitelistRefundAmount"));
+ BigDecimal jian = null == map.get("jian") ? BigDecimal.ZERO : new BigDecimal(map.get("jian").toString());
+ BigDecimal feng = null == map.get("feng") ? BigDecimal.ZERO : new BigDecimal(map.get("feng").toString());
+ BigDecimal ping = null == map.get("ping") ? BigDecimal.ZERO : new BigDecimal(map.get("ping").toString());
+ BigDecimal gu = null == map.get("gu") ? BigDecimal.ZERO : new BigDecimal(map.get("gu").toString());
+ BigDecimal total = jian.add(feng).add(ping).add(gu);
+ if (total.compareTo(new BigDecimal("0")) != 0) {
+ chargingOrderListVO.setElectronicProportion(
+ jian.divide(total, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%(尖)/"
+ + feng.divide(total, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%(峰)/"
+ + ping.divide(total, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%(平)/"
+ + gu.divide(total, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%(谷)");
+ } else {
+ chargingOrderListVO.setElectronicProportion(
+ "0" + "%(尖)/" +
+ "0" + "%(峰)/" +
+ "0" + "%(平)/" +
+ "0" + "%(谷)");
+ }
+ list.add(chargingOrderListVO);
+ }
+ fillChargingPeriodShareIncome(list);
+ }
- private List<Map<String, Object>> loadChargingPeriodAccountingSummaries(List<Map<String, Object>> rows) {
- List<Long> orderIds = collectLongIds(rows, "id");
- if (orderIds.isEmpty()) {
- return Collections.emptyList();
- }
- List<Map<String, Object>> summaries = new ArrayList<>();
- for (int start = 0; start < orderIds.size(); start += CHARGING_PERIOD_ACCOUNTING_BATCH_SIZE) {
- int end = Math.min(start + CHARGING_PERIOD_ACCOUNTING_BATCH_SIZE, orderIds.size());
- List<Map<String, Object>> batch = this.baseMapper.chargingListAccountingSummary(orderIds.subList(start, end));
- if (batch != null) {
- summaries.addAll(batch);
- }
- }
- return summaries;
- }
+ if (includeSummary) {
+ // 尖峰平谷充电到账
+ BigDecimal jianElectronic = new BigDecimal("0");
+ BigDecimal fengElectronic = new BigDecimal("0");
+ BigDecimal pingElectronic = new BigDecimal("0");
+ BigDecimal guElectronic = new BigDecimal("0");
+ // 尖峰平谷服务费
+ BigDecimal jianService = new BigDecimal("0");
+ BigDecimal fengService = new BigDecimal("0");
+ BigDecimal pingService = new BigDecimal("0");
+ BigDecimal guService = new BigDecimal("0");
+ // 尖峰平谷充电量 度数
+ BigDecimal jian = new BigDecimal("0");
+ BigDecimal feng = new BigDecimal("0");
+ BigDecimal ping = new BigDecimal("0");
+ BigDecimal gu = new BigDecimal("0");
+ Map<String, Object> map = this.baseMapper.chargingListSum(dto, startTime1, startTime2, endTime1, endTime2);
+ if (map == null) {
+ map = new HashMap<>();
+ }
+ jianElectronic = getSummaryDecimal(map, "jianElectronic");
+ fengElectronic = getSummaryDecimal(map, "fengElectronic");
+ pingElectronic = getSummaryDecimal(map, "pingElectronic");
+ guElectronic = getSummaryDecimal(map, "guElectronic");
+ jianService = getSummaryDecimal(map, "jianService");
+ fengService = getSummaryDecimal(map, "fengService");
+ pingService = getSummaryDecimal(map, "pingService");
+ guService = getSummaryDecimal(map, "guService");
+ jian = getSummaryDecimal(map, "jian");
+ feng = getSummaryDecimal(map, "feng");
+ ping = getSummaryDecimal(map, "ping");
+ gu = getSummaryDecimal(map, "gu");
+ //订单数量
+ Integer summaryOrderCount = getNullableInteger(map, "orderCount");
+ int orderCount = summaryOrderCount == null ? 0 : summaryOrderCount;
+ // 计算充电总度数
+ BigDecimal electronic = getSummaryDecimal(map, "electronic");
+ // 支付金额
+ BigDecimal paymentAmount = getSummaryDecimal(map, "paymentAmount");
+ // 电费
+ BigDecimal electrovalence = getSummaryDecimal(map, "electrovalence");
+ // 服务费
+ BigDecimal serviceCharge = getSummaryDecimal(map, "serviceCharge");
+ chargingOrderTimeVO.setOrderCount(orderCount);
+ chargingOrderTimeVO.setChargingCapacity(electronic.setScale(2, BigDecimal.ROUND_HALF_EVEN));
+ chargingOrderTimeVO.setPaymentAmount(paymentAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN));
+ chargingOrderTimeVO.setElectrovalence(electrovalence.setScale(2, BigDecimal.ROUND_HALF_EVEN));
+ chargingOrderTimeVO.setServiceCharge(serviceCharge.setScale(2, BigDecimal.ROUND_HALF_EVEN));
+ List<Long> summaryOrderIds = this.baseMapper.chargingListSummaryOrderIds(
+ dto, startTime1, startTime2, endTime1, endTime2);
+ Map<String, Object> shareIncomeMap = getChargingOrderShareIncomeSummary(summaryOrderIds);
+ chargingOrderTimeVO.setPlatformIncome(getSummaryDecimal(shareIncomeMap, "platformIncomeTotal"));
+ chargingOrderTimeVO.setPartnerIncome(getSummaryDecimal(shareIncomeMap, "partnerIncomeTotal"));
+ // 计算尖峰平谷充电到账占比
+ BigDecimal add = jianElectronic.add(fengElectronic).add(pingElectronic).add(guElectronic);
+ // 计算尖峰平谷服务费占比
+ BigDecimal add1 = jianService.add(fengService).add(pingService).add(guService);
+ // 计算尖峰平谷充电量占比
+ BigDecimal add2 = jian.add(feng).add(ping).add(gu);
+ if (add.compareTo(new BigDecimal("0")) != 0) {
+ chargingOrderTimeVO.setCapacityProportion(jian + "度/" + feng + "度/" + ping + "度/" + gu + "度-"
+ + jian.divide(add2, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
+ + feng.divide(add2, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
+ + ping.divide(add2, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
+ + gu.divide(add2, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%");
+ chargingOrderTimeVO.setServiceProportion(jianService + "元/" + fengService + "元/" + pingService + "元/" + guService + "元-"
+ + jianService.divide(add1, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
+ + fengService.divide(add1, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
+ + pingService.divide(add1, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
+ + guService.divide(add1, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%");
+ chargingOrderTimeVO.setElectronicProportion(jianElectronic + "元/" + fengElectronic + "元/" + pingElectronic + "元/" + guElectronic + "元-"
+ + jianElectronic.divide(add, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
+ + fengElectronic.divide(add, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
+ + pingElectronic.divide(add, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/"
+ + guElectronic.divide(add, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%");
+ } else {
+ chargingOrderTimeVO.setCapacityProportion(jianElectronic + "度/" + fengElectronic + "度/" + pingElectronic + "度/" + guElectronic + "度-"
+ + "0" + "%/"
+ + "0" + "%/"
+ + "0" + "%/"
+ + "0" + "%");
+ chargingOrderTimeVO.setServiceProportion(jianService + "元/" + fengService + "元/" + pingService + "元/" + guService + "元-"
+ + "0" + "%/"
+ + "0" + "%/"
+ + "0" + "%/"
+ + "0" + "%");
+ chargingOrderTimeVO.setElectronicProportion(jian + "元/" + feng + "元/" + ping + "元/" + gu + "元-"
+ + "0" + "%/"
+ + "0" + "%/"
+ + "0" + "%/"
+ + "0" + "%");
+ }
+ }
+ if (includeList) {
+ pageInfo.setRecords(list);
+ chargingOrderTimeVO.setList(pageInfo);
+ }
+ return chargingOrderTimeVO;
+ }
- static void mergeChargingPeriodAccountingRows(List<Map<String, Object>> orders,
- List<Map<String, Object>> summaries) {
- if (orders == null || orders.isEmpty()) {
- return;
- }
- Map<Long, Map<String, Object>> summaryByOrderId = new HashMap<>();
- if (summaries != null) {
- for (Map<String, Object> summary : summaries) {
- Long orderId = mapLongIgnoreCase(summary, "orderId");
- if (orderId != null) {
- summaryByOrderId.put(orderId, summary);
- }
- }
- }
- String[] amountKeys = {"periodElectricPrice", "periodServicePrice", "jian", "feng", "ping", "gu"};
- for (Map<String, Object> order : orders) {
- Map<String, Object> summary = summaryByOrderId.get(mapLongIgnoreCase(order, "id"));
- for (String key : amountKeys) {
- Object value = mapValueIgnoreCase(summary, key);
- order.put(key, value == null ? BigDecimal.ZERO : value);
- }
- }
- }
+ private List<Map<String, Object>> loadChargingPeriodAccountingSummaries(List<Map<String, Object>> rows) {
+ List<Long> orderIds = collectLongIds(rows, "id");
+ if (orderIds.isEmpty()) {
+ return Collections.emptyList();
+ }
+ List<Map<String, Object>> summaries = new ArrayList<>();
+ for (int start = 0; start < orderIds.size(); start += CHARGING_PERIOD_ACCOUNTING_BATCH_SIZE) {
+ int end = Math.min(start + CHARGING_PERIOD_ACCOUNTING_BATCH_SIZE, orderIds.size());
+ List<Map<String, Object>> batch = this.baseMapper.chargingListAccountingSummary(orderIds.subList(start, end));
+ if (batch != null) {
+ summaries.addAll(batch);
+ }
+ }
+ return summaries;
+ }
- private static Long mapLongIgnoreCase(Map<String, Object> row, String key) {
- Object value = mapValueIgnoreCase(row, key);
- if (value instanceof Number) {
- return ((Number) value).longValue();
- }
- return value == null ? null : Long.valueOf(value.toString());
- }
+ static void mergeChargingPeriodAccountingRows(List<Map<String, Object>> orders,
+ List<Map<String, Object>> summaries) {
+ if (orders == null || orders.isEmpty()) {
+ return;
+ }
+ Map<Long, Map<String, Object>> summaryByOrderId = new HashMap<>();
+ if (summaries != null) {
+ for (Map<String, Object> summary : summaries) {
+ Long orderId = mapLongIgnoreCase(summary, "orderId");
+ if (orderId != null) {
+ summaryByOrderId.put(orderId, summary);
+ }
+ }
+ }
+ String[] amountKeys = {"periodElectricPrice", "periodServicePrice", "jian", "feng", "ping", "gu"};
+ for (Map<String, Object> order : orders) {
+ Map<String, Object> summary = summaryByOrderId.get(mapLongIgnoreCase(order, "id"));
+ for (String key : amountKeys) {
+ Object value = mapValueIgnoreCase(summary, key);
+ order.put(key, value == null ? BigDecimal.ZERO : value);
+ }
+ }
+ }
- private static Object mapValueIgnoreCase(Map<String, Object> row, String key) {
- if (row == null) {
- return null;
- }
- if (row.containsKey(key)) {
- return row.get(key);
- }
- for (Map.Entry<String, Object> entry : row.entrySet()) {
- if (entry.getKey() != null && entry.getKey().equalsIgnoreCase(key)) {
- return entry.getValue();
- }
- }
- return null;
- }
+ private static Long mapLongIgnoreCase(Map<String, Object> row, String key) {
+ Object value = mapValueIgnoreCase(row, key);
+ if (value instanceof Number) {
+ return ((Number) value).longValue();
+ }
+ return value == null ? null : Long.valueOf(value.toString());
+ }
- private Map<Integer, Site> loadChargingPeriodSites(List<Map<String, Object>> rows) {
- List<Integer> ids = collectIntegerIds(rows, "siteId");
- if (ids.isEmpty()) return Collections.emptyMap();
- R<List<Site>> result = siteClient.getSiteByIds(ids);
- return indexByIntegerId(result == null ? null : result.getData(), Site::getId);
- }
+ private static Object mapValueIgnoreCase(Map<String, Object> row, String key) {
+ if (row == null) {
+ return null;
+ }
+ if (row.containsKey(key)) {
+ return row.get(key);
+ }
+ for (Map.Entry<String, Object> entry : row.entrySet()) {
+ if (entry.getKey() != null && entry.getKey().equalsIgnoreCase(key)) {
+ return entry.getValue();
+ }
+ }
+ return null;
+ }
- private Map<Integer, TChargingPile> loadChargingPeriodPiles(List<Map<String, Object>> rows) {
- List<Integer> siteIds = collectIntegerIds(rows, "siteId");
- if (siteIds.isEmpty()) return Collections.emptyMap();
- R<List<TChargingPile>> result = chargingPileClient.getChargingPileBySiteIds(siteIds);
- return indexByIntegerId(result == null ? null : result.getData(), TChargingPile::getId);
- }
+ private Map<Integer, Site> loadChargingPeriodSites(List<Map<String, Object>> rows) {
+ List<Integer> ids = collectIntegerIds(rows, "siteId");
+ if (ids.isEmpty()) return Collections.emptyMap();
+ R<List<Site>> result = siteClient.getSiteByIds(ids);
+ return indexByIntegerId(result == null ? null : result.getData(), Site::getId);
+ }
- private Map<Integer, TChargingGun> loadChargingPeriodGuns(List<Map<String, Object>> rows) {
- List<Integer> ids = collectIntegerIds(rows, "chargingGunId");
- if (ids.isEmpty()) return Collections.emptyMap();
- R<List<TChargingGun>> result = chargingGunClient.getChargingGunByIds(ids);
- return indexByIntegerId(result == null ? null : result.getData(), TChargingGun::getId);
- }
+ private Map<Integer, TChargingPile> loadChargingPeriodPiles(List<Map<String, Object>> rows) {
+ List<Integer> siteIds = collectIntegerIds(rows, "siteId");
+ if (siteIds.isEmpty()) return Collections.emptyMap();
+ R<List<TChargingPile>> result = chargingPileClient.getChargingPileBySiteIds(siteIds);
+ return indexByIntegerId(result == null ? null : result.getData(), TChargingPile::getId);
+ }
- private Map<Long, TAppUser> loadChargingPeriodUsers(List<Map<String, Object>> rows) {
- List<Long> ids = collectLongIds(rows, "appUserId");
- if (ids.isEmpty()) return Collections.emptyMap();
- R<List<TAppUser>> result = appUserClient.getUserByIds(ids);
- return indexByLongId(result == null ? null : result.getData(), TAppUser::getId);
- }
+ private Map<Integer, TChargingGun> loadChargingPeriodGuns(List<Map<String, Object>> rows) {
+ List<Integer> ids = collectIntegerIds(rows, "chargingGunId");
+ if (ids.isEmpty()) return Collections.emptyMap();
+ R<List<TChargingGun>> result = chargingGunClient.getChargingGunByIds(ids);
+ return indexByIntegerId(result == null ? null : result.getData(), TChargingGun::getId);
+ }
- private Map<Long, TAppUserCar> loadChargingPeriodCars(List<Map<String, Object>> rows) {
- List<Long> ids = collectLongIds(rows, "appUserCarId");
- if (ids.isEmpty()) return Collections.emptyMap();
- R<List<TAppUserCar>> result = appUserCarClient.getCarByIds(ids);
- return indexByLongId(result == null ? null : result.getData(), TAppUserCar::getId);
- }
+ private Map<Long, TAppUser> loadChargingPeriodUsers(List<Map<String, Object>> rows) {
+ List<Long> ids = collectLongIds(rows, "appUserId");
+ if (ids.isEmpty()) return Collections.emptyMap();
+ R<List<TAppUser>> result = appUserClient.getUserByIds(ids);
+ return indexByLongId(result == null ? null : result.getData(), TAppUser::getId);
+ }
- private List<Integer> collectIntegerIds(List<Map<String, Object>> rows, String key) {
- if (rows == null) return Collections.emptyList();
- return rows.stream().map(row -> getNullableInteger(row, key)).filter(Objects::nonNull).distinct().collect(Collectors.toList());
- }
+ private Map<Long, TAppUserCar> loadChargingPeriodCars(List<Map<String, Object>> rows) {
+ List<Long> ids = collectLongIds(rows, "appUserCarId");
+ if (ids.isEmpty()) return Collections.emptyMap();
+ R<List<TAppUserCar>> result = appUserCarClient.getCarByIds(ids);
+ return indexByLongId(result == null ? null : result.getData(), TAppUserCar::getId);
+ }
- private List<Long> collectLongIds(List<Map<String, Object>> rows, String key) {
- if (rows == null) return Collections.emptyList();
- return rows.stream().map(row -> getNullableLong(row, key)).filter(Objects::nonNull).distinct().collect(Collectors.toList());
- }
+ private List<Integer> collectIntegerIds(List<Map<String, Object>> rows, String key) {
+ if (rows == null) return Collections.emptyList();
+ return rows.stream().map(row -> getNullableInteger(row, key)).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+ }
- private Integer getNullableInteger(Map<String, Object> row, String key) {
- Object value = row == null ? null : row.get(key);
- return value == null ? null : Integer.valueOf(value.toString());
- }
+ private List<Long> collectLongIds(List<Map<String, Object>> rows, String key) {
+ if (rows == null) return Collections.emptyList();
+ return rows.stream().map(row -> getNullableLong(row, key)).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+ }
- private Long getNullableLong(Map<String, Object> row, String key) {
- Object value = row == null ? null : row.get(key);
- return value == null ? null : Long.valueOf(value.toString());
- }
+ private Integer getNullableInteger(Map<String, Object> row, String key) {
+ Object value = row == null ? null : row.get(key);
+ return value == null ? null : Integer.valueOf(value.toString());
+ }
- private <T> Map<Integer, T> indexByIntegerId(List<T> items, java.util.function.Function<T, Integer> idGetter) {
- if (items == null) return Collections.emptyMap();
- return items.stream().filter(Objects::nonNull).filter(item -> idGetter.apply(item) != null)
- .collect(Collectors.toMap(idGetter, item -> item, (left, right) -> left));
- }
+ private Long getNullableLong(Map<String, Object> row, String key) {
+ Object value = row == null ? null : row.get(key);
+ return value == null ? null : Long.valueOf(value.toString());
+ }
- private <T> Map<Long, T> indexByLongId(List<T> items, java.util.function.Function<T, Long> idGetter) {
- if (items == null) return Collections.emptyMap();
- return items.stream().filter(Objects::nonNull).filter(item -> idGetter.apply(item) != null)
- .collect(Collectors.toMap(idGetter, item -> item, (left, right) -> left));
- }
+ private <T> Map<Integer, T> indexByIntegerId(List<T> items, java.util.function.Function<T, Integer> idGetter) {
+ if (items == null) return Collections.emptyMap();
+ return items.stream().filter(Objects::nonNull).filter(item -> idGetter.apply(item) != null)
+ .collect(Collectors.toMap(idGetter, item -> item, (left, right) -> left));
+ }
+
+ private <T> Map<Long, T> indexByLongId(List<T> items, java.util.function.Function<T, Long> idGetter) {
+ if (items == null) return Collections.emptyMap();
+ return items.stream().filter(Objects::nonNull).filter(item -> idGetter.apply(item) != null)
+ .collect(Collectors.toMap(idGetter, item -> item, (left, right) -> left));
+ }
- @Override
- public List<ChargingOrderListVO> export(ChargingListQuery dto) {
- String startTime1 = null;
- String startTime2 = null;
- String endTime1 = null;
- String endTime2 = null;
+ @Override
+ public List<ChargingOrderListVO> export(ChargingListQuery dto) {
+ String startTime1 = null;
+ String startTime2 = null;
+ String endTime1 = null;
+ String endTime2 = null;
- if (StringUtils.hasLength(dto.getStartTime())) {
- String[] split = dto.getStartTime().split(" - ");
- startTime1 = split[0];
- startTime2 = split[1];
- }
+ if (StringUtils.hasLength(dto.getStartTime())) {
+ String[] split = dto.getStartTime().split(" - ");
+ startTime1 = split[0];
+ startTime2 = split[1];
+ }
- if (StringUtils.hasLength(dto.getEndTime())) {
- String[] split = dto.getEndTime().split(" - ");
- endTime1 = split[0];
- endTime2 = split[1];
- }
- if (StringUtils.hasLength(dto.getPhone())) {
- List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
- if (data != null) {
- if (!data.isEmpty()) {
- dto.setUserIds(data);
- }
- } else {
- dto.setUserIds(new ArrayList<Long>());
- }
- if (dto.getUserIds().isEmpty()) {
- List<Long> carIds = dto.getUserIds();
- carIds.add(-1L);
- dto.setUserIds(carIds);
- }
- }
- if (StringUtils.hasLength(dto.getLicensePlate())) {
- List<Long> data = appUserCarClient.getAppUserCarByLicensePlates(dto.getLicensePlate()).getData();
- if (data != null) {
- if (!data.isEmpty()) {
- dto.setCarIds(data);
- }
- } else {
- dto.setCarIds(new ArrayList<Long>());
- }
- if (dto.getCarIds().isEmpty()) {
- List<Long> carIds = dto.getCarIds();
- carIds.add(-1L);
- dto.setCarIds(carIds);
- }
- }
- Long userId = tokenService.getLoginUser().getUserid();
- // 查询当前登陆人按钮权限
- SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
- Integer roleType = sysUser.getRoleType();
- //如果没传siteId,获取当前登陆人所有的siteIds
- List<Integer> siteIds = new ArrayList<>();
- if (dto.getSiteId() == null) {
- if (userId != null) {
- List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
- for (GetSiteListDTO datum : data) {
- siteIds.add(datum.getId());
- }
- }
- } else {
- siteIds.add(dto.getSiteId());
- }
- if (siteIds.isEmpty()) {
- siteIds.add(-1);
- } else {
- if (roleType == 2) {
- List<Integer> integers = new ArrayList<>();
- for (Integer siteId : siteIds) {
- // 校验有没有这个站点的权限
- List<Boolean> t1 = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData();
+ if (StringUtils.hasLength(dto.getEndTime())) {
+ String[] split = dto.getEndTime().split(" - ");
+ endTime1 = split[0];
+ endTime2 = split[1];
+ }
+ if (StringUtils.hasLength(dto.getPhone())) {
+ List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
+ if (data != null) {
+ if (!data.isEmpty()) {
+ dto.setUserIds(data);
+ }
+ } else {
+ dto.setUserIds(new ArrayList<Long>());
+ }
+ if (dto.getUserIds().isEmpty()) {
+ List<Long> carIds = dto.getUserIds();
+ carIds.add(-1L);
+ dto.setUserIds(carIds);
+ }
+ }
+ if (StringUtils.hasLength(dto.getLicensePlate())) {
+ List<Long> data = appUserCarClient.getAppUserCarByLicensePlates(dto.getLicensePlate()).getData();
+ if (data != null) {
+ if (!data.isEmpty()) {
+ dto.setCarIds(data);
+ }
+ } else {
+ dto.setCarIds(new ArrayList<Long>());
+ }
+ if (dto.getCarIds().isEmpty()) {
+ List<Long> carIds = dto.getCarIds();
+ carIds.add(-1L);
+ dto.setCarIds(carIds);
+ }
+ }
+ Long userId = tokenService.getLoginUser().getUserid();
+ // 查询当前登陆人按钮权限
+ SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
+ Integer roleType = sysUser.getRoleType();
+ //如果没传siteId,获取当前登陆人所有的siteIds
+ List<Integer> siteIds = new ArrayList<>();
+ if (dto.getSiteId() == null) {
+ if (userId != null) {
+ List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
+ for (GetSiteListDTO datum : data) {
+ siteIds.add(datum.getId());
+ }
+ }
+ } else {
+ siteIds.add(dto.getSiteId());
+ }
+ if (siteIds.isEmpty()) {
+ siteIds.add(-1);
+ } else {
+ if (roleType == 2) {
+ List<Integer> integers = new ArrayList<>();
+ for (Integer siteId : siteIds) {
+ // 校验有没有这个站点的权限
+ List<Boolean> t1 = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData();
- Boolean b = t1.get(1);
- if (b) {
- integers.add(siteId);
- }
- }
- siteIds = integers;
- }
- }
- dto.setSiteIds(siteIds);
- List<ChargingOrderListVO> list1 = this.baseMapper.chargingList(dto, startTime1, startTime2, endTime1, endTime2);
- fillChargingPeriodExportBalanceIncome(list1);
- fillChargingPeriodShareIncome(list1);
- return list1;
- }
+ Boolean b = t1.get(1);
+ if (b) {
+ integers.add(siteId);
+ }
+ }
+ siteIds = integers;
+ }
+ }
+ dto.setSiteIds(siteIds);
+ List<ChargingOrderListVO> list1 = this.baseMapper.chargingList(dto, startTime1, startTime2, endTime1, endTime2);
+ fillChargingPeriodExportBalanceIncome(list1);
+ fillChargingPeriodShareIncome(list1);
+ return list1;
+ }
- private void fillChargingPeriodShareIncome(List<ChargingOrderListVO> list) {
- if (list == null || list.isEmpty()) {
- return;
- }
- List<Long> orderIds = list.stream()
- .map(ChargingOrderListVO::getId)
- .filter(Objects::nonNull)
- .distinct()
- .collect(Collectors.toList());
- Map<Long, Map<String, Object>> incomeMap = new HashMap<>();
- int batchSize = 500;
- for (int i = 0; i < orderIds.size(); i += batchSize) {
- List<Long> batchIds = orderIds.subList(i, Math.min(i + batchSize, orderIds.size()));
- List<Map<String, Object>> rows = this.baseMapper.chargingOrderShareIncomeByOrderIds(batchIds);
- if (rows == null) {
- continue;
- }
- for (Map<String, Object> row : rows) {
- Long orderId = getSummaryLong(row, "orderId");
- if (orderId != null) {
- incomeMap.put(orderId, row);
- }
- }
- }
- for (ChargingOrderListVO item : list) {
- applyChargingPeriodShareIncome(item, incomeMap.get(item.getId()));
- }
- }
+ private void fillChargingPeriodShareIncome(List<ChargingOrderListVO> list) {
+ if (list == null || list.isEmpty()) {
+ return;
+ }
+ List<Long> orderIds = list.stream()
+ .map(ChargingOrderListVO::getId)
+ .filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toList());
+ Map<Long, Map<String, Object>> incomeMap = new HashMap<>();
+ int batchSize = 500;
+ for (int i = 0; i < orderIds.size(); i += batchSize) {
+ List<Long> batchIds = orderIds.subList(i, Math.min(i + batchSize, orderIds.size()));
+ List<Map<String, Object>> rows = this.baseMapper.chargingOrderShareIncomeByOrderIds(batchIds);
+ if (rows == null) {
+ continue;
+ }
+ for (Map<String, Object> row : rows) {
+ Long orderId = getSummaryLong(row, "orderId");
+ if (orderId != null) {
+ incomeMap.put(orderId, row);
+ }
+ }
+ }
+ for (ChargingOrderListVO item : list) {
+ applyChargingPeriodShareIncome(item, incomeMap.get(item.getId()));
+ }
+ }
- void applyChargingPeriodShareIncome(ChargingOrderListVO item, Map<String, Object> row) {
- if (item == null) {
- return;
- }
- item.setPlatformIncome(getSummaryDecimal(row, "platformIncome"));
- item.setPartnerIncome(getSummaryDecimal(row, "partnerIncome"));
- }
+ void applyChargingPeriodShareIncome(ChargingOrderListVO item, Map<String, Object> row) {
+ if (item == null) {
+ return;
+ }
+ item.setPlatformIncome(getSummaryDecimal(row, "platformIncome"));
+ item.setPartnerIncome(getSummaryDecimal(row, "partnerIncome"));
+ }
- /**
- * 充电时段统计导出补充余额收入;兑换码usedAmount包含赠送金额,需沿用订单列表口径拆分。
- */
- private void fillChargingPeriodExportBalanceIncome(List<ChargingOrderListVO> list) {
- if (list == null || list.isEmpty()) {
- return;
- }
- List<Long> orderIds = list.stream().map(ChargingOrderListVO::getId).filter(Objects::nonNull).collect(Collectors.toList());
- if (orderIds.isEmpty()) {
- return;
- }
- Map<Long, Map<String, Object>> incomeMap = new HashMap<>();
- List<Map<String, Object>> rows = this.baseMapper.exchangeCodeBalanceIncomeByOrderIds(orderIds);
- if (rows != null) {
- for (Map<String, Object> row : rows) {
- Long orderId = getSummaryLong(row, "orderId");
- if (orderId != null) {
- incomeMap.put(orderId, row);
- }
- }
- }
- for (ChargingOrderListVO item : list) {
- Map<String, Object> row = incomeMap.get(item.getId());
- item.setBalanceIncome(getSummaryDecimal(row, "balanceIncome"));
- item.setBalanceGiftIncome(getSummaryDecimal(row, "balanceGiftIncome"));
- }
- }
+ /**
+ * 充电时段统计导出补充余额收入;兑换码usedAmount包含赠送金额,需沿用订单列表口径拆分。
+ */
+ private void fillChargingPeriodExportBalanceIncome(List<ChargingOrderListVO> list) {
+ if (list == null || list.isEmpty()) {
+ return;
+ }
+ List<Long> orderIds = list.stream().map(ChargingOrderListVO::getId).filter(Objects::nonNull).collect(Collectors.toList());
+ if (orderIds.isEmpty()) {
+ return;
+ }
+ Map<Long, Map<String, Object>> incomeMap = new HashMap<>();
+ List<Map<String, Object>> rows = this.baseMapper.exchangeCodeBalanceIncomeByOrderIds(orderIds);
+ if (rows != null) {
+ for (Map<String, Object> row : rows) {
+ Long orderId = getSummaryLong(row, "orderId");
+ if (orderId != null) {
+ incomeMap.put(orderId, row);
+ }
+ }
+ }
+ for (ChargingOrderListVO item : list) {
+ Map<String, Object> row = incomeMap.get(item.getId());
+ item.setBalanceIncome(getSummaryDecimal(row, "balanceIncome"));
+ item.setBalanceGiftIncome(getSummaryDecimal(row, "balanceGiftIncome"));
+ }
+ }
- private void fillChargingOrderShareIncome(List<ChargingOrderVO> list) {
- if (list == null || list.isEmpty()) {
- return;
- }
- List<Long> orderIds = list.stream().map(ChargingOrderVO::getId).filter(Objects::nonNull).collect(Collectors.toList());
- if (orderIds.isEmpty()) {
- return;
- }
- Map<Long, Map<String, Object>> incomeMap = new HashMap<>();
- List<Map<String, Object>> rows = this.baseMapper.chargingOrderShareIncomeByOrderIds(orderIds);
- if (rows != null) {
- for (Map<String, Object> row : rows) {
- Long orderId = getSummaryLong(row, "orderId");
- if (orderId != null) {
- incomeMap.put(orderId, row);
- }
- }
- }
- for (ChargingOrderVO item : list) {
- Map<String, Object> row = incomeMap.get(item.getId());
- item.setPlatformIncome(getSummaryDecimal(row, "platformIncome"));
- item.setPartnerIncome(getSummaryDecimal(row, "partnerIncome"));
- }
- }
+ private void fillChargingOrderShareIncome(List<ChargingOrderVO> list) {
+ if (list == null || list.isEmpty()) {
+ return;
+ }
+ List<Long> orderIds = list.stream().map(ChargingOrderVO::getId).filter(Objects::nonNull).collect(Collectors.toList());
+ if (orderIds.isEmpty()) {
+ return;
+ }
+ Map<Long, Map<String, Object>> incomeMap = new HashMap<>();
+ List<Map<String, Object>> rows = this.baseMapper.chargingOrderShareIncomeByOrderIds(orderIds);
+ if (rows != null) {
+ for (Map<String, Object> row : rows) {
+ Long orderId = getSummaryLong(row, "orderId");
+ if (orderId != null) {
+ incomeMap.put(orderId, row);
+ }
+ }
+ }
+ for (ChargingOrderVO item : list) {
+ Map<String, Object> row = incomeMap.get(item.getId());
+ item.setPlatformIncome(getSummaryDecimal(row, "platformIncome"));
+ item.setPartnerIncome(getSummaryDecimal(row, "partnerIncome"));
+ }
+ }
-
- @Override
- public ChargingOrderListInfoVO chargingInfo(String uid) {
- TChargingOrder chargingOrder = this.getById(uid);
- ChargingOrderListInfoVO chargingOrderListInfoVO = new ChargingOrderListInfoVO();
- chargingOrderListInfoVO.setStartTime(chargingOrder.getStartTime());
- chargingOrderListInfoVO.setEndTime(chargingOrder.getEndTime());
- chargingOrderListInfoVO.setStatus(chargingOrder.getStatus());
- BigDecimal bigDecimal = new BigDecimal("0.006");
- if (chargingOrder.getOrderAmount() != null) {
- BigDecimal multiply = chargingOrder.getPaymentAmount().multiply(bigDecimal);
- chargingOrderListInfoVO.setCommissionAmount(multiply.setScale(2, BigDecimal.ROUND_HALF_UP));
- }
- chargingOrderListInfoVO.setElectrovalence(chargingOrder.getElectrovalence());
- chargingOrderListInfoVO.setServiceCharge(chargingOrder.getServiceCharge());
- if (chargingOrder.getElectrovalence() != null && chargingOrder.getServiceCharge() != null) {
- chargingOrderListInfoVO.setTotal(chargingOrder.getElectrovalence().add(chargingOrder.getServiceCharge()));
- } else {
- chargingOrderListInfoVO.setTotal(new BigDecimal("0"));
- }
- if (chargingOrderListInfoVO.getTotal().compareTo(new BigDecimal("0")) > 0) {
- if (chargingOrder.getCouponDiscountAmount() != null && chargingOrder.getVipDiscountAmount() != null && chargingOrder.getSharingAmount() != null && chargingOrder.getCommissionAmount() != null) {
- chargingOrderListInfoVO.setRealTotal(chargingOrderListInfoVO.getTotal().subtract(chargingOrder.getCouponDiscountAmount()).subtract(chargingOrder.getVipDiscountAmount()).subtract(chargingOrder.getSharingAmount()).subtract(chargingOrder.getCommissionAmount()));
- } else {
- chargingOrderListInfoVO.setRealTotal(chargingOrderListInfoVO.getTotal());
- }
- } else {
- chargingOrderListInfoVO.setRealTotal(new BigDecimal("0"));
- }
- chargingOrderListInfoVO.setCode(chargingOrder.getCode());
- List<Site> data = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData();
- if (!data.isEmpty()) {
- chargingOrderListInfoVO.setSiteName(data.get(0).getName());
- chargingOrderListInfoVO.setSiteAddress(data.get(0).getAddress());
- }
- if (chargingOrder.getChargingGunId() != null) {
- TChargingGun data1 = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
- if (data1 != null) {
- TChargingPile data2 = chargingPileClient.getChargingPileById(data1.getChargingPileId()).getData();
- if (data2 != null) {
- chargingOrderListInfoVO.setGunCode(data1.getCode());
- chargingOrderListInfoVO.setTerminalName(data2.getName() + data1.getName());
- }
- }
- }
- chargingOrderListInfoVO.setChargingCapacity(chargingOrder.getChargingCapacity());
-
- chargingOrderListInfoVO.setEndMode(chargingOrder.getEndMode());
-
- // 获取开始SOC 结束soc
- if (chargingOrder.getCode() != null) {
- List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataService.getDataByOrderCodeAsc(chargingOrder.getCode());
- if (data6 != null) {
- for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
- if (uploadRealTimeMonitoringData.getOutput_current() != null &&
- uploadRealTimeMonitoringData.getOutput_voltage() != null) {
- uploadRealTimeMonitoringData.setPower(uploadRealTimeMonitoringData.getOutput_voltage()
- .multiply(uploadRealTimeMonitoringData.getOutput_current()).divide(new BigDecimal(1000), 2, BigDecimal.ROUND_HALF_UP));
- }
- }
- if (!data6.isEmpty()) {
- int min = 100;
- int max = 0;
- for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
- if (uploadRealTimeMonitoringData.getSoc() > max) {
- max = uploadRealTimeMonitoringData.getSoc();
- }
- if (uploadRealTimeMonitoringData.getSoc() != 0 && uploadRealTimeMonitoringData.getSoc() < min) {
- min = uploadRealTimeMonitoringData.getSoc();
- }
- }
- chargingOrderListInfoVO.setEndSoc(max + "");
- chargingOrderListInfoVO.setStartSoc(min + "");
-
- SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
- uploadRealTimeMonitoringData.setCreateTime(simpleDateFormat.format(uploadRealTimeMonitoringData.getCreate_time()));
- }
- }
- }
-
- chargingOrderListInfoVO.setList(data6);
- }
- if (chargingOrderListInfoVO.getStartTime() != null && chargingOrderListInfoVO.getEndTime() != null) {
- LocalDateTime startTime = chargingOrderListInfoVO.getStartTime();
- LocalDateTime endTime = chargingOrderListInfoVO.getEndTime();
- // 计算时间差 单位秒
- long between = ChronoUnit.SECONDS.between(startTime, endTime);
- chargingOrderListInfoVO.setChargingSecond(between + "");
- }
-
- if (chargingOrder.getAppUserCarId() != null) {
- List<TAppUserCar> data3 = appUserCarClient.getCarByIds(Collections.singletonList(chargingOrder.getAppUserCarId())).getData();
- if (data3 != null && !data3.isEmpty()) {
- chargingOrderListInfoVO.setLicensePlate(data3.get(0).getLicensePlate());
- }
- } else {
- chargingOrderListInfoVO.setLicensePlate(chargingOrder.getPlateNum());
- }
- chargingOrderListInfoVO.setStartTime(chargingOrder.getStartTime());
- chargingOrderListInfoVO.setEndTime(chargingOrder.getEndTime());
- chargingOrderListInfoVO.setId(chargingOrder.getId());
- chargingOrderListInfoVO.setUid(chargingOrder.getId().toString());
- chargingOrderListInfoVO.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount());
- chargingOrderListInfoVO.setVipDiscountAmount(chargingOrder.getVipDiscountAmount());
- if (chargingOrder.getOrderSource().equals(2)) {
- chargingOrderListInfoVO.setSharingAmount(chargingOrder.getServiceCharge().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_HALF_UP));
- } else {
- chargingOrderListInfoVO.setSharingAmount(chargingOrder.getSharingAmount());
-
- }
- // 查询费用明细列表
- List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.lambdaQuery()
- .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())
- .list();
- chargingOrderListInfoVO.setList1(list);
- return chargingOrderListInfoVO;
- }
-
-
- /**
- * 处理充电订单实时监控数据相关的业务逻辑
- *
- * @param query
- */
- @Override
- public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) {
- if (com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getTransaction_serial_number())) {
- //获取当前的计费策略
- TChargingOrder chargingOrder1 = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getTransaction_serial_number()));
- BigDecimal residualAmount = chargingOrder1.getRechargeAmount().add(chargingOrder1.getVipDiscountAmount()).subtract(query.getPaid_amount());
- TChargingOrder chargingOrder = new TChargingOrder();
- chargingOrder.setId(chargingOrder1.getId());
- chargingOrder.setAppUserId(chargingOrder1.getAppUserId());
- chargingOrder.setResidualAmount(residualAmount);
- if (query.getOutput_current().compareTo(BigDecimal.ZERO) != 0) {
- BigDecimal divide = (query.getOutput_current().multiply(query.getOutput_voltage())).divide(new BigDecimal(1000));
- chargingOrder.setChargingPower(divide);
- chargingOrder.setCurrent(query.getOutput_current());
- chargingOrder.setVoltage(query.getOutput_voltage());
- chargingOrder.setPower(divide);
- chargingOrder.setNeedElec(query.getOutput_current());
-
- TChargingGun chargingGun = new TChargingGun();
- chargingGun.setId(chargingOrder1.getChargingGunId());
- chargingGun.setChargingPower(divide);
- chargingGunClient.updateChargingGunById(chargingGun);
- }
- chargingOrder.setChargingCapacity(query.getCharging_degree());
- chargingOrder.setElectricity(query.getCharging_degree());
- chargingOrder.setTotalElectricity(new BigDecimal(query.getSoc()));
- this.updateById(chargingOrder);
- }
- }
-
-
- /**
- * 自动结束充电后的处理逻辑
- *
- * @param orderCode
- */
- @Override
- public void endCharge(String orderCode, Integer endMode) {
- TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode));
- TChargingOrder chargingOrder = new TChargingOrder();
- chargingOrder.setId(order.getId());
- chargingOrder.setAppUserId(order.getAppUserId());
- chargingOrder.setEndMode(endMode);
- this.updateById(chargingOrder);
- }
-
- /**
- * 异常结束充电处理逻辑
- *
- * @param orderCode
- */
- @Override
- public void excelEndCharge(String orderCode) {
- endCharge(orderCode, 0);
- }
-
-
- /**
- * 停止充电返回账单后计算费用
- *
- * @param vo
- */
- @Override
+
+ @Override
+ public ChargingOrderListInfoVO chargingInfo(String uid) {
+ TChargingOrder chargingOrder = this.getById(uid);
+ ChargingOrderListInfoVO chargingOrderListInfoVO = new ChargingOrderListInfoVO();
+ chargingOrderListInfoVO.setStartTime(chargingOrder.getStartTime());
+ chargingOrderListInfoVO.setEndTime(chargingOrder.getEndTime());
+ chargingOrderListInfoVO.setStatus(chargingOrder.getStatus());
+ BigDecimal bigDecimal = new BigDecimal("0.006");
+ if (chargingOrder.getOrderAmount() != null) {
+ BigDecimal multiply = chargingOrder.getPaymentAmount().multiply(bigDecimal);
+ chargingOrderListInfoVO.setCommissionAmount(multiply.setScale(2, BigDecimal.ROUND_HALF_UP));
+ }
+ chargingOrderListInfoVO.setElectrovalence(chargingOrder.getElectrovalence());
+ chargingOrderListInfoVO.setServiceCharge(chargingOrder.getServiceCharge());
+ if (chargingOrder.getElectrovalence() != null && chargingOrder.getServiceCharge() != null) {
+ chargingOrderListInfoVO.setTotal(chargingOrder.getElectrovalence().add(chargingOrder.getServiceCharge()));
+ } else {
+ chargingOrderListInfoVO.setTotal(new BigDecimal("0"));
+ }
+ if (chargingOrderListInfoVO.getTotal().compareTo(new BigDecimal("0")) > 0) {
+ if (chargingOrder.getCouponDiscountAmount() != null && chargingOrder.getVipDiscountAmount() != null && chargingOrder.getSharingAmount() != null && chargingOrder.getCommissionAmount() != null) {
+ chargingOrderListInfoVO.setRealTotal(chargingOrderListInfoVO.getTotal().subtract(chargingOrder.getCouponDiscountAmount()).subtract(chargingOrder.getVipDiscountAmount()).subtract(chargingOrder.getSharingAmount()).subtract(chargingOrder.getCommissionAmount()));
+ } else {
+ chargingOrderListInfoVO.setRealTotal(chargingOrderListInfoVO.getTotal());
+ }
+ } else {
+ chargingOrderListInfoVO.setRealTotal(new BigDecimal("0"));
+ }
+ chargingOrderListInfoVO.setCode(chargingOrder.getCode());
+ List<Site> data = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData();
+ if (!data.isEmpty()) {
+ chargingOrderListInfoVO.setSiteName(data.get(0).getName());
+ chargingOrderListInfoVO.setSiteAddress(data.get(0).getAddress());
+ }
+ if (chargingOrder.getChargingGunId() != null) {
+ TChargingGun data1 = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+ if (data1 != null) {
+ TChargingPile data2 = chargingPileClient.getChargingPileById(data1.getChargingPileId()).getData();
+ if (data2 != null) {
+ chargingOrderListInfoVO.setGunCode(data1.getCode());
+ chargingOrderListInfoVO.setTerminalName(data2.getName() + data1.getName());
+ }
+ }
+ }
+ chargingOrderListInfoVO.setChargingCapacity(chargingOrder.getChargingCapacity());
+
+ chargingOrderListInfoVO.setEndMode(chargingOrder.getEndMode());
+
+ // 获取开始SOC 结束soc
+ if (chargingOrder.getCode() != null) {
+ List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataService.getDataByOrderCodeAsc(chargingOrder.getCode());
+ if (data6 != null) {
+ for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
+ if (uploadRealTimeMonitoringData.getOutput_current() != null &&
+ uploadRealTimeMonitoringData.getOutput_voltage() != null) {
+ uploadRealTimeMonitoringData.setPower(uploadRealTimeMonitoringData.getOutput_voltage()
+ .multiply(uploadRealTimeMonitoringData.getOutput_current()).divide(new BigDecimal(1000), 2, BigDecimal.ROUND_HALF_UP));
+ }
+ }
+ if (!data6.isEmpty()) {
+ int min = 100;
+ int max = 0;
+ for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
+ if (uploadRealTimeMonitoringData.getSoc() > max) {
+ max = uploadRealTimeMonitoringData.getSoc();
+ }
+ if (uploadRealTimeMonitoringData.getSoc() != 0 && uploadRealTimeMonitoringData.getSoc() < min) {
+ min = uploadRealTimeMonitoringData.getSoc();
+ }
+ }
+ chargingOrderListInfoVO.setEndSoc(max + "");
+ chargingOrderListInfoVO.setStartSoc(min + "");
+
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
+ uploadRealTimeMonitoringData.setCreateTime(simpleDateFormat.format(uploadRealTimeMonitoringData.getCreate_time()));
+ }
+ }
+ }
+
+ chargingOrderListInfoVO.setList(data6);
+ }
+ if (chargingOrderListInfoVO.getStartTime() != null && chargingOrderListInfoVO.getEndTime() != null) {
+ LocalDateTime startTime = chargingOrderListInfoVO.getStartTime();
+ LocalDateTime endTime = chargingOrderListInfoVO.getEndTime();
+ // 计算时间差 单位秒
+ long between = ChronoUnit.SECONDS.between(startTime, endTime);
+ chargingOrderListInfoVO.setChargingSecond(between + "");
+ }
+
+ if (chargingOrder.getAppUserCarId() != null) {
+ List<TAppUserCar> data3 = appUserCarClient.getCarByIds(Collections.singletonList(chargingOrder.getAppUserCarId())).getData();
+ if (data3 != null && !data3.isEmpty()) {
+ chargingOrderListInfoVO.setLicensePlate(data3.get(0).getLicensePlate());
+ }
+ } else {
+ chargingOrderListInfoVO.setLicensePlate(chargingOrder.getPlateNum());
+ }
+ chargingOrderListInfoVO.setStartTime(chargingOrder.getStartTime());
+ chargingOrderListInfoVO.setEndTime(chargingOrder.getEndTime());
+ chargingOrderListInfoVO.setId(chargingOrder.getId());
+ chargingOrderListInfoVO.setUid(chargingOrder.getId().toString());
+ chargingOrderListInfoVO.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount());
+ chargingOrderListInfoVO.setVipDiscountAmount(chargingOrder.getVipDiscountAmount());
+ if (chargingOrder.getOrderSource().equals(2)) {
+ chargingOrderListInfoVO.setSharingAmount(chargingOrder.getServiceCharge().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_HALF_UP));
+ } else {
+ chargingOrderListInfoVO.setSharingAmount(chargingOrder.getSharingAmount());
+
+ }
+ // 查询费用明细列表
+ List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.lambdaQuery()
+ .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())
+ .list();
+ chargingOrderListInfoVO.setList1(list);
+ return chargingOrderListInfoVO;
+ }
+
+
+ /**
+ * 处理充电订单实时监控数据相关的业务逻辑
+ *
+ * @param query
+ */
+ @Override
+ public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) {
+ if (com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getTransaction_serial_number())) {
+ //获取当前的计费策略
+ TChargingOrder chargingOrder1 = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getTransaction_serial_number()));
+ BigDecimal residualAmount = chargingOrder1.getRechargeAmount().add(chargingOrder1.getVipDiscountAmount()).subtract(query.getPaid_amount());
+ TChargingOrder chargingOrder = new TChargingOrder();
+ chargingOrder.setId(chargingOrder1.getId());
+ chargingOrder.setAppUserId(chargingOrder1.getAppUserId());
+ chargingOrder.setResidualAmount(residualAmount);
+ if (query.getOutput_current().compareTo(BigDecimal.ZERO) != 0) {
+ BigDecimal divide = (query.getOutput_current().multiply(query.getOutput_voltage())).divide(new BigDecimal(1000));
+ chargingOrder.setChargingPower(divide);
+ chargingOrder.setCurrent(query.getOutput_current());
+ chargingOrder.setVoltage(query.getOutput_voltage());
+ chargingOrder.setPower(divide);
+ chargingOrder.setNeedElec(query.getOutput_current());
+
+ TChargingGun chargingGun = new TChargingGun();
+ chargingGun.setId(chargingOrder1.getChargingGunId());
+ chargingGun.setChargingPower(divide);
+ chargingGunClient.updateChargingGunById(chargingGun);
+ }
+ chargingOrder.setChargingCapacity(query.getCharging_degree());
+ chargingOrder.setElectricity(query.getCharging_degree());
+ chargingOrder.setTotalElectricity(new BigDecimal(query.getSoc()));
+ this.updateById(chargingOrder);
+ }
+ }
+
+
+ /**
+ * 自动结束充电后的处理逻辑
+ *
+ * @param orderCode
+ */
+ @Override
+ public void endCharge(String orderCode, Integer endMode) {
+ TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode));
+ TChargingOrder chargingOrder = new TChargingOrder();
+ chargingOrder.setId(order.getId());
+ chargingOrder.setAppUserId(order.getAppUserId());
+ chargingOrder.setEndMode(endMode);
+ this.updateById(chargingOrder);
+ }
+
+ /**
+ * 异常结束充电处理逻辑
+ *
+ * @param orderCode
+ */
+ @Override
+ public void excelEndCharge(String orderCode) {
+ endCharge(orderCode, 0);
+ }
+
+
+ /**
+ * 停止充电返回账单后计算费用
+ *
+ * @param vo
+ */
+ @Override
@Transactional
- public R endChargeBillingCharge(TransactionRecordMessageVO vo) {
- RLock lock = redissonClient.getLock("endOrder:" + vo.getTransaction_serial_number());
- boolean locked = false;
- try {
+ public R endChargeBillingCharge(TransactionRecordMessageVO vo) {
+ RLock lock = redissonClient.getLock("endOrder:" + vo.getTransaction_serial_number());
+ boolean locked = false;
+ try {
locked = lock.tryLock(60, 60, TimeUnit.SECONDS);
if (!locked) {
return R.fail("订单正在结算,请勿重复操作");
}
//添加redis缓存数据,过期时间,用于防止处理缓慢且硬件重复发送报文导致的重复退款
Boolean hasKey = redisService.hasKey("END_ORDER:" + vo.getTransaction_serial_number());
- if(hasKey){
+ if (hasKey) {
return R.fail("不能重复退款");
}
redisService.setCacheObject("END_ORDER:" + vo.getTransaction_serial_number(), System.currentTimeMillis() + "", 10L, TimeUnit.MINUTES);
- if(locked){
+ if (locked) {
TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
if (null == chargingOrder) {
log.error("订单不存在,订单号:{}", vo.getTransaction_serial_number());
@@ -4533,7 +4536,7 @@
SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<AccountingStrategyDetailOrderVo> lists = new ArrayList<>();
List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
- if(!dataList.isEmpty()){
+ if (!dataList.isEmpty()) {
vo.setStart_time(sdfs.format(dataList.get(dataList.size() - 1).getCreate_time()) + ".00");
vo.setEnd_time(sdfs.format(dataList.get(0).getCreate_time()) + ".00");
}
@@ -4829,10 +4832,10 @@
chargingOrder.setRefundStatus(channelRefundAmount.compareTo(BigDecimal.ZERO) > 0 ? 1 : 2);
UploadRealTimeMonitoringData asc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode(), "asc");
UploadRealTimeMonitoringData desc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode(), "desc");
- if(null != asc){
+ if (null != asc) {
chargingOrder.setStartSoc(new BigDecimal(asc.getSoc()));
}
- if(null != desc){
+ if (null != desc) {
chargingOrder.setEndSoc(new BigDecimal(desc.getSoc()));
}
this.updateById(chargingOrder);
@@ -4854,7 +4857,7 @@
}
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
TChargingOrder finalChargingOrder1 = chargingOrder;
- threadPoolExecutor.execute(()->{
+ threadPoolExecutor.execute(() -> {
//推送成都监管
NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
statusVo.setOrderCode(finalChargingOrder1.getCode());
@@ -5092,704 +5095,698 @@
chargingMessageClient.pushOrderInfo(chargingOrderVo);
chargingMessageClient.pushOrderStatus(chargingOrderVo);
}
- } catch (Exception e) {
- log.error("充电订单结算失败,订单号:{}", vo == null ? null : vo.getTransaction_serial_number(), e);
- return R.fail("充电订单结算失败:" + firstNotBlank(e.getMessage(), "未知异常"));
- } finally {
- if (locked && lock.isHeldByCurrentThread()) {
- lock.unlock();
- }
- }
- return R.ok();
- }
-
-
- @Override
- public List<Map<String, Object>> getByDate(LocalDate start, LocalDate end, List<Integer> siteIds) {
-
- LocalDateTime start1 = start.atStartOfDay();
- LocalDateTime end1 = end.atTime(LocalTime.MAX);
- return this.baseMapper.getByDate(start1, end1, siteIds);
- }
-
- @Override
- public List<Map<String, Object>> queryPower(List<Integer> siteIds) {
- return this.baseMapper.queryPower(siteIds);
- }
-
- @Override
- public Map<String, Object> qureryPowerLevel(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.queryPowerLevel(siteIds, statisticsQueryDto);
- }
-
-
- @Override
- public List<Map<String, Object>> usersDay(ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.usersDay(statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> usersDay1() {
- return this.baseMapper.usersDay1();
- }
-
- @Override
- public List<Map<String, Object>> usersByQuery(ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.usersByQuery(statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> usersByQuery1(ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.usersByQuery1(statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> getUserTagCount() {
- return this.baseMapper.getUserTagCount();
- }
-
- @Override
- public List<Map<String, Object>> getVipCount() {
- return this.baseMapper.getVipCount();
- }
-
- @Override
- public List<Map<String, Object>> unitConsumption(ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.unitConsumption(statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> carUserMethod() {
- return this.baseMapper.carUserMethod();
- }
-
- @Override
- public List<Map<String, Object>> carUserBrand() {
- return this.baseMapper.carUserBrand();
- }
-
- @Override
- public Map<String, Object> countLocalCar() {
- return this.baseMapper.countLocalCar();
- }
-
- @Override
- public Double getAver(List<Integer> siteIds) {
- return this.baseMapper.getAver(siteIds);
- }
-
- @Override
- public List<Map<String, Object>> getLevelEvaluate(List<Integer> siteIds) {
- return this.baseMapper.getLevelEvaluate(siteIds);
- }
-
-
- @Resource
- private TShoppingOrderService shoppingOrderService;
- @Resource
- private TShoppingOrderRefundService shoppingOrderRefundService;
- @Resource
- private TVipOrderService vipOrderService;
- @Resource
- private TVipOrderRefundService vipOrderRefundService;
-
-
- @Override
- public R<PayOrderInfoDto> getSpecialRefundOrder(PayOrderRefundDto payOrderQueryDto) {
- TChargingOrder order = getSpecialRefundChargingOrder(payOrderQueryDto);
- if (order == null) {
- return R.fail("未查询到支付成功的充电订单");
- }
- mergeSuccessfulRefundAmounts(order);
- PayOrderInfoDto dto = new PayOrderInfoDto();
- BigDecimal thirdPayAmount = getRefundableThirdPayAmount(order);
- BigDecimal thirdRefundAmount = money(order.getThirdRefundAmount());
- dto.setOrderId(order.getId().toString());
- dto.setCode(order.getCode());
- dto.setTradeNo(order.getRechargeSerialNumber());
- dto.setPayType(order.getRechargePaymentType());
- dto.setPayAmount(thirdPayAmount);
- dto.setPayTime(order.getPayTime());
- dto.setRefundAmount(thirdRefundAmount);
- dto.setRechargeAmount(money(order.getRechargeAmount()));
- dto.setFinalAmount(thirdPayAmount.subtract(thirdRefundAmount).max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP));
- dto.setPayMethod(order.getPayMethod());
- dto.setBalancePayAmount(money(order.getBalancePayAmount()));
- dto.setThirdPayAmount(thirdPayAmount);
- dto.setBalanceRefundAmount(money(order.getBalanceRefundAmount()));
- dto.setThirdRefundAmount(thirdRefundAmount);
- dto.setRefundableAmount(getSpecialRefundableAmount(order));
- return R.ok(dto);
- }
+ } catch (Exception e) {
+ log.error("充电订单结算失败,订单号:{}", vo == null ? null : vo.getTransaction_serial_number(), e);
+ return R.fail("充电订单结算失败:" + firstNotBlank(e.getMessage(), "未知异常"));
+ } finally {
+ if (locked && lock.isHeldByCurrentThread()) {
+ lock.unlock();
+ }
+ }
+ return R.ok();
+ }
- @Override
- public BigDecimal getManualRefundableAmount(Long chargingOrderId) {
- if (chargingOrderId == null) {
- return BigDecimal.ZERO;
- }
- return getManualRefundableAmount(this.getById(chargingOrderId));
- }
- private BigDecimal getManualRefundableAmount(TChargingOrder order) {
- if (order == null || order.getId() == null) {
- return BigDecimal.ZERO;
- }
- List<TChargingOrderRefund> successfulRefunds = chargingOrderRefundService.list(
- new LambdaQueryWrapper<TChargingOrderRefund>()
- .eq(TChargingOrderRefund::getChargingOrderId, order.getId())
- .eq(TChargingOrderRefund::getRefundStatus, 2));
- return calculateManualRefundableAmount(order.getPaymentAmount(), successfulRefunds);
- }
+ @Override
+ public List<Map<String, Object>> getByDate(LocalDate start, LocalDate end, List<Integer> siteIds) {
- static BigDecimal calculateManualRefundableAmount(BigDecimal paymentAmount, List<TChargingOrderRefund> successfulRefunds) {
- BigDecimal successfulManualRefundAmount = Optional.ofNullable(successfulRefunds)
- .orElse(Collections.emptyList())
- .stream()
- .filter(refund -> "后台退款".equals(refund.getRefundTitle())
- || SPECIAL_REFUND_TITLE.equals(refund.getRefundTitle()))
- .map(TChargingOrderRefund::getRefundAmount)
- .map(amount -> amount == null ? BigDecimal.ZERO : amount)
- .reduce(BigDecimal.ZERO, BigDecimal::add);
- return (paymentAmount == null ? BigDecimal.ZERO : paymentAmount)
- .subtract(successfulManualRefundAmount)
- .max(BigDecimal.ZERO)
- .setScale(2, RoundingMode.HALF_UP);
- }
+ LocalDateTime start1 = start.atStartOfDay();
+ LocalDateTime end1 = end.atTime(LocalTime.MAX);
+ return this.baseMapper.getByDate(start1, end1, siteIds);
+ }
- private BigDecimal getSpecialRefundableAmount(TChargingOrder order) {
- return calculateSpecialRefundableAmount(
- getManualRefundableAmount(order),
- getRefundableThirdPayAmount(order),
- money(order == null ? null : order.getThirdRefundAmount()));
- }
+ @Override
+ public List<Map<String, Object>> queryPower(List<Integer> siteIds) {
+ return this.baseMapper.queryPower(siteIds);
+ }
- static BigDecimal calculateSpecialRefundableAmount(BigDecimal manualRefundableAmount,
- BigDecimal thirdPayAmount, BigDecimal thirdRefundAmount) {
- BigDecimal normalizedManualAmount = manualRefundableAmount == null ? BigDecimal.ZERO : manualRefundableAmount;
- BigDecimal normalizedThirdPayAmount = thirdPayAmount == null ? BigDecimal.ZERO : thirdPayAmount;
- BigDecimal normalizedThirdRefundAmount = thirdRefundAmount == null ? BigDecimal.ZERO : thirdRefundAmount;
- BigDecimal remainingThirdAmount = normalizedThirdPayAmount
- .subtract(normalizedThirdRefundAmount)
- .max(BigDecimal.ZERO);
- return normalizedManualAmount
- .min(remainingThirdAmount)
- .setScale(2, RoundingMode.HALF_UP);
- }
+ @Override
+ public Map<String, Object> qureryPowerLevel(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.queryPowerLevel(siteIds, statisticsQueryDto);
+ }
- @Override
- @Transactional
- public R specialRefund(PayOrderRefundDto payOrderQueryDto) {
- R passwordValid = validateOperationPassword(payOrderQueryDto);
- if (passwordValid.getCode() != 200) {
- return passwordValid;
- }
- if (payOrderQueryDto.getRefundAmount() == null || payOrderQueryDto.getRefundAmount().compareTo(BigDecimal.ZERO) <= 0) {
- return R.fail("请输入正确的退款金额");
- }
- TChargingOrder order = getSpecialRefundChargingOrder(payOrderQueryDto);
- if (order == null) {
- return R.fail("未查询到支付成功的充电订单");
- }
- RLock lock = redissonClient.getLock("SPECIAL_REFUND_ORDER_LOCK:" + order.getId());
- if (!lock.tryLock()) {
- return R.fail("该订单正在退款处理中,请勿重复提交");
- }
- try {
- order = this.getById(order.getId());
- if (order == null) {
- return R.fail("充电订单不存在");
- }
- mergeSuccessfulRefundAmounts(order);
- BigDecimal refundAmount = money(payOrderQueryDto.getRefundAmount());
- BigDecimal refundableAmount = getSpecialRefundableAmount(order);
- if (refundAmount.compareTo(refundableAmount) > 0) {
- return R.fail("退款金额不能超过剩余可退金额");
- }
- BigDecimal refundedThirdAmount = money(order.getThirdRefundAmount());
- BigDecimal refundableThirdAmount = getRefundableThirdPayAmount(order).subtract(refundedThirdAmount);
- if (refundableThirdAmount.compareTo(BigDecimal.ZERO) < 0) {
- refundableThirdAmount = BigDecimal.ZERO;
- }
- BigDecimal thirdRefundAmount = isBalancePayMode(order.getPayMethod())
- ? refundAmount.min(refundableThirdAmount).setScale(2, RoundingMode.HALF_UP)
- : refundAmount;
- BigDecimal balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).setScale(2, RoundingMode.HALF_UP);
- if (balanceRefundAmount.compareTo(BigDecimal.ZERO) < 0) {
- balanceRefundAmount = BigDecimal.ZERO;
- }
- TChargingOrderRefund refund = buildSpecialChargingRefund(order, payOrderQueryDto, refundAmount, balanceRefundAmount, thirdRefundAmount);
- if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
- refund.setRefundSerialNumber("BALANCE");
- finishManualChargingRefund(order, refund, refundAmount, balanceRefundAmount, thirdRefundAmount);
- return R.ok();
- }
- Integer payType = order.getRechargePaymentType();
- boolean success = false;
- if (Integer.valueOf(1).equals(payType)) {
- R shareRefund = refundIcbcShareBeforeMainRefund(order, refund, thirdRefundAmount);
- if (shareRefund.getCode() != 200) {
- return shareRefund;
- }
- success = refundByIcbcAndFinish(order, refund, thirdRefundAmount, SPECIAL_REFUND_TITLE, true, refundAmount, balanceRefundAmount);
- } else if (Integer.valueOf(2).equals(payType)) {
- RefundReq dto = new RefundReq();
- dto.setOutTradeNo(order.getCode());
- dto.setOutRequestNo(refund.getRefundCode());
- dto.setRefundAmount(thirdRefundAmount.toString());
- dto.setRefundReason(SPECIAL_REFUND_TITLE);
- RefundResp resp = aliPaymentClient.refund(dto).getData();
- if (resp != null) {
- refund.setRefundSerialNumber(resp.getTradeNo());
- refund.setRefundTime(LocalDateTime.now());
- finishManualChargingRefund(order, refund, refundAmount, balanceRefundAmount, thirdRefundAmount);
- success = true;
- }
- } else if (Integer.valueOf(3).equals(payType)) {
- RefundReq dto = new RefundReq();
- dto.setOutTradeNo(order.getRechargeSerialNumber());
- dto.setOutRequestNo(refund.getRefundCode());
- dto.setRefundAmount(thirdRefundAmount.toString());
- dto.setRefundReason(SPECIAL_REFUND_TITLE);
- RefundResp resp = h5AliPaymentClient.refund(dto).getData();
- if (resp != null && "10000".equals(resp.getCode())) {
- refund.setRefundSerialNumber(resp.getTradeNo());
- refund.setRefundTime(LocalDateTime.now());
- finishManualChargingRefund(order, refund, refundAmount, balanceRefundAmount, thirdRefundAmount);
- success = true;
- }
- }
- return success ? R.ok() : R.fail("退款失败,请检查支付渠道或稍后重试");
- } finally {
- if (lock.isHeldByCurrentThread()) {
- lock.unlock();
- }
- }
- }
- private void mergeSuccessfulRefundAmounts(TChargingOrder order) {
- if (order == null || order.getId() == null) {
- return;
- }
- List<TChargingOrderRefund> refunds = chargingOrderRefundService.list(
- new LambdaQueryWrapper<TChargingOrderRefund>()
- .eq(TChargingOrderRefund::getChargingOrderId, order.getId())
- .eq(TChargingOrderRefund::getRefundStatus, 2));
- if (refunds == null || refunds.isEmpty()) {
- return;
- }
- BigDecimal successfulAmount = BigDecimal.ZERO;
- BigDecimal explicitBalanceAmount = BigDecimal.ZERO;
- BigDecimal explicitThirdAmount = BigDecimal.ZERO;
- BigDecimal unspecifiedAmount = BigDecimal.ZERO;
- for (TChargingOrderRefund refund : refunds) {
- BigDecimal amount = money(refund.getRefundAmount());
- BigDecimal balanceAmount = money(refund.getBalanceRefundAmount());
- BigDecimal thirdAmount = money(refund.getThirdRefundAmount());
- successfulAmount = successfulAmount.add(amount);
- explicitBalanceAmount = explicitBalanceAmount.add(balanceAmount);
- explicitThirdAmount = explicitThirdAmount.add(thirdAmount);
- if (balanceAmount.add(thirdAmount).compareTo(BigDecimal.ZERO) == 0) {
- unspecifiedAmount = unspecifiedAmount.add(amount);
- }
- }
- BigDecimal inferredThirdAmount = unspecifiedAmount.min(
- getRefundableThirdPayAmount(order).subtract(explicitThirdAmount).max(BigDecimal.ZERO));
- BigDecimal inferredBalanceAmount = unspecifiedAmount.subtract(inferredThirdAmount).max(BigDecimal.ZERO);
- order.setRefundAmount(money(order.getRefundAmount()).max(money(successfulAmount)));
- order.setThirdRefundAmount(money(order.getThirdRefundAmount()).max(money(explicitThirdAmount.add(inferredThirdAmount))));
- order.setBalanceRefundAmount(money(order.getBalanceRefundAmount()).max(money(explicitBalanceAmount.add(inferredBalanceAmount))));
- }
+ @Override
+ public List<Map<String, Object>> usersDay(ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.usersDay(statisticsQueryDto);
+ }
- private R refundIcbcShareBeforeMainRefund(TChargingOrder order, TChargingOrderRefund refund, BigDecimal thirdRefundAmount) {
- if (order == null || refund == null || thirdRefundAmount == null || thirdRefundAmount.compareTo(BigDecimal.ZERO) <= 0) {
- return R.ok();
- }
- if (!"ICBC".equals(order.getSourceName())) {
- return R.ok();
- }
- List<TChargingOrderShareRecord> shareRecords = chargingOrderShareRecordMapper.selectList(
- new LambdaQueryWrapper<TChargingOrderShareRecord>()
- .eq(TChargingOrderShareRecord::getChargingOrderId, order.getId())
- .eq(TChargingOrderShareRecord::getPayChannel, "ICBC")
- .eq(TChargingOrderShareRecord::getNeedOnlineShare, true)
- .eq(TChargingOrderShareRecord::getOnlineShareStatus, "SUCCESS")
- .eq(TChargingOrderShareRecord::getDelFlag, false)
- .orderByAsc(TChargingOrderShareRecord::getId));
- if (shareRecords == null || shareRecords.isEmpty()) {
- return R.ok();
- }
- BigDecimal thirdPayAmount = getRefundableThirdPayAmount(order);
- if (thirdPayAmount.compareTo(BigDecimal.ZERO) <= 0) {
- return R.fail("订单已分账但第三方支付金额异常,禁止退款");
- }
- BigDecimal cumulativeThirdRefund = money(order.getThirdRefundAmount()).add(thirdRefundAmount).min(thirdPayAmount).setScale(2, RoundingMode.HALF_UP);
- for (TChargingOrderShareRecord shareRecord : shareRecords) {
- BigDecimal shareAmount = money(shareRecord.getShareAmount());
- if (shareAmount.compareTo(BigDecimal.ZERO) <= 0) {
- continue;
- }
- BigDecimal targetRefundAmount = shareAmount.multiply(cumulativeThirdRefund).divide(thirdPayAmount, 2, RoundingMode.HALF_UP).min(shareAmount).setScale(2, RoundingMode.HALF_UP);
- BigDecimal refundedShareAmount;
- try {
- refundedShareAmount = queryIcbcShareRefundAmount(order, shareRecord);
- } catch (ServiceException e) {
- return R.fail(e.getMessage());
- }
- BigDecimal shareRefundAmount = targetRefundAmount.subtract(refundedShareAmount).setScale(2, RoundingMode.HALF_UP);
- if (shareRefundAmount.compareTo(BigDecimal.ZERO) <= 0) {
- continue;
- }
- R result = refundIcbcShareRecord(order, shareRecord, refund, shareRefundAmount);
- if (result.getCode() != 200) {
- return result;
- }
- }
- return R.ok();
- }
+ @Override
+ public List<Map<String, Object>> usersDay1() {
+ return this.baseMapper.usersDay1();
+ }
- private BigDecimal queryIcbcShareRefundAmount(TChargingOrder order, TChargingOrderShareRecord shareRecord) {
- try {
- IcbcSubOrderQueryReq queryReq = IcbcAdminFundOperationSupport.buildSubOrderQueryRequest(order, shareRecord);
- R<IcbcSubOrderQueryResp> queryResult = icbcPaymentClient.querySubOrder(queryReq);
- IcbcSubOrderQueryResp queryResp = queryResult == null ? null : queryResult.getData();
- if (queryResult == null || queryResult.getCode() != 200 || queryResp == null || !"SUCCESS".equals(queryResp.getStatus())) {
- throw new ServiceException(queryResult == null ? "工行子订单查询无响应" : firstNotBlank(queryResult.getMsg(), "工行子订单查询失败"));
- }
- return parseIcbcAmount(queryResp.getOrderRefundAmnt());
- } catch (IllegalArgumentException e) {
- throw new ServiceException(e.getMessage());
- } catch (ServiceException e) {
- throw e;
- } catch (Exception e) {
- throw new ServiceException("工行子订单查询异常:" + firstNotBlank(e.getMessage(), "未知异常"));
- }
- }
+ @Override
+ public List<Map<String, Object>> usersByQuery(ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.usersByQuery(statisticsQueryDto);
+ }
- private R refundIcbcShareRecord(TChargingOrder order, TChargingOrderShareRecord shareRecord, TChargingOrderRefund refund, BigDecimal shareRefundAmount) {
- String suffix = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
- String retSubOrderId = ("SPSUB" + refund.getRefundCode() + shareRecord.getId()).substring(0, Math.min(50, ("SPSUB" + refund.getRefundCode() + shareRecord.getId()).length()));
- String outtrxSerialNo = ("SPSUBREF" + suffix + shareRecord.getId()).substring(0, Math.min(50, ("SPSUBREF" + suffix + shareRecord.getId()).length()));
- try {
- IcbcSubOrderRefundReq refundReq = IcbcAdminFundOperationSupport.buildSubOrderRefundRequest(
- order, shareRecord, shareRefundAmount, retSubOrderId, outtrxSerialNo);
- refundReq.setMerSpInfor("特殊退款分账退回:" + order.getCode());
- R<IcbcSubOrderRefundResp> refundResult = icbcPaymentClient.refundSubOrder(refundReq);
- IcbcSubOrderRefundResp refundResp = refundResult == null ? null : refundResult.getData();
- if (refundResult == null || refundResult.getCode() != 200 || refundResp == null || !"SUCCESS".equals(refundResp.getStatus())) {
- String message = refundResult == null ? "工行分账退款无响应" : firstNotBlank(refundResult.getMsg(), refundResp == null ? null : refundResp.getRawResponse(), "工行分账退款失败");
- log.error("特殊退款分账退回失败,订单号:{},退款单号:{},分账记录:{},金额:{},原因:{}",
- order.getCode(), refund.getRefundCode(), shareRecord.getId(), shareRefundAmount, message);
- return R.fail("分账退回失败:" + message);
- }
- log.info("特殊退款分账退回成功,订单号:{},退款单号:{},分账记录:{},金额:{}",
- order.getCode(), refund.getRefundCode(), shareRecord.getId(), shareRefundAmount);
- return R.ok();
- } catch (IllegalArgumentException | ServiceException e) {
- log.error("特殊退款分账退回失败,订单号:{},退款单号:{},分账记录:{},金额:{}",
- order.getCode(), refund.getRefundCode(), shareRecord.getId(), shareRefundAmount, e);
- return R.fail("分账退回失败:" + e.getMessage());
- } catch (Exception e) {
- log.error("特殊退款分账退回异常,订单号:{},退款单号:{},分账记录:{},金额:{}",
- order.getCode(), refund.getRefundCode(), shareRecord.getId(), shareRefundAmount, e);
- return R.fail("分账退回异常:" + firstNotBlank(e.getMessage(), "未知异常"));
- }
- }
+ @Override
+ public List<Map<String, Object>> usersByQuery1(ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.usersByQuery1(statisticsQueryDto);
+ }
- private BigDecimal parseIcbcAmount(String amount) {
- if (!StringUtils.hasLength(amount)) {
- return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
- }
- String value = amount.trim();
- try {
- if (value.contains(".")) {
- return money(new BigDecimal(value));
- }
- return new BigDecimal(value).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
- } catch (NumberFormatException e) {
- throw new ServiceException("工行金额格式异常:" + amount);
- }
- }
+ @Override
+ public List<Map<String, Object>> getUserTagCount() {
+ return this.baseMapper.getUserTagCount();
+ }
- private R validateOperationPassword(PayOrderRefundDto payOrderQueryDto) {
- if (payOrderQueryDto == null || StringUtils.isEmpty(payOrderQueryDto.getOperationPassword())) {
- return R.fail("请输入操作密码");
- }
- SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
- if (sysUser == null || StringUtils.isEmpty(sysUser.getOperationPassword())) {
- return R.fail("当前账号未配置操作密码");
- }
- if (!SecurityUtils.matchesPassword(payOrderQueryDto.getOperationPassword(), sysUser.getOperationPassword())) {
- return R.fail("操作密码错误");
- }
- return R.ok();
- }
+ @Override
+ public List<Map<String, Object>> getVipCount() {
+ return this.baseMapper.getVipCount();
+ }
- private TChargingOrder getSpecialRefundChargingOrder(PayOrderRefundDto payOrderQueryDto) {
- if (payOrderQueryDto == null) {
- return null;
- }
- LambdaQueryWrapper<TChargingOrder> wrapper = new LambdaQueryWrapper<TChargingOrder>()
- .eq(TChargingOrder::getRechargePaymentStatus, 2)
- .eq(TChargingOrder::getDelFlag, false);
- if (payOrderQueryDto.getOrderId() != null) {
- wrapper.eq(TChargingOrder::getId, payOrderQueryDto.getOrderId());
- } else if (StringUtils.hasLength(payOrderQueryDto.getCode())) {
- wrapper.eq(TChargingOrder::getCode, payOrderQueryDto.getCode());
- } else if (StringUtils.hasLength(payOrderQueryDto.getSerialNumber())) {
- wrapper.eq(TChargingOrder::getRechargeSerialNumber, payOrderQueryDto.getSerialNumber());
- } else {
- return null;
- }
- return this.getOne(wrapper.last("limit 1"));
- }
+ @Override
+ public List<Map<String, Object>> unitConsumption(ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.unitConsumption(statisticsQueryDto);
+ }
- private TChargingOrderRefund buildSpecialChargingRefund(TChargingOrder order, PayOrderRefundDto dto, BigDecimal refundAmount,
- BigDecimal balanceRefundAmount, BigDecimal thirdRefundAmount) {
- TChargingOrderRefund refund = new TChargingOrderRefund();
- refund.setChargingOrderId(order.getId());
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
- refund.setRefundCode("TSF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
- refund.setRefundAmount(refundAmount);
- refund.setBalanceRefundAmount(balanceRefundAmount);
- refund.setThirdRefundAmount(thirdRefundAmount);
- refund.setRefundStatus(1);
- refund.setPayType(order.getRechargePaymentType());
- refund.setRefundTime(LocalDateTime.now());
- refund.setCode(order.getCode());
- refund.setRefundTitle(SPECIAL_REFUND_TITLE);
- refund.setRefundContent(SPECIAL_REFUND_TITLE);
- refund.setRefundReason(StringUtils.hasLength(dto.getReason()) ? dto.getReason() : SPECIAL_REFUND_TITLE);
- refund.setRefundRemark(dto.getRemark());
- refund.setRefundTotalAmount(money(order.getRefundAmount()).add(refundAmount));
- refund.setPayAmount(money(order.getPaymentAmount()));
- return refund;
- }
+ @Override
+ public List<Map<String, Object>> carUserMethod() {
+ return this.baseMapper.carUserMethod();
+ }
- @Override
- public R payRefund(PayOrderRefundDto payOrderQueryDto) {
- R passwordValid = validateOperationPassword(payOrderQueryDto);
- if (passwordValid.getCode() != 200) {
- return passwordValid;
- }
- if (payOrderQueryDto.getRefundAmount() == null || payOrderQueryDto.getRefundAmount().compareTo(BigDecimal.ZERO) <= 0) {
- return R.fail("退款金额必须大于0");
- }
- if (payOrderQueryDto.getType() == 1) {
- TChargingOrder tChargingOrder = this.baseMapper.selectById(payOrderQueryDto.getOrderId());
- if (tChargingOrder == null) {
- return R.fail("充电订单不存在");
- }
- BigDecimal manualRefundAmount = money(payOrderQueryDto.getRefundAmount());
- BigDecimal remainingRefundAmount = getManualRefundableAmount(tChargingOrder);
- if (manualRefundAmount.compareTo(remainingRefundAmount) > 0) {
- return R.fail("退款金额不能超过剩余可退金额" + remainingRefundAmount.toPlainString() + "元");
- }
- if (manualRefundAmount.compareTo(remainingRefundAmount) == 0) {
- tChargingOrder.setStatus(5);
- }
-
- TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
- chargingOrderRefund.setChargingOrderId(tChargingOrder.getId());
- chargingOrderRefund.setRefundAmount(manualRefundAmount);
- chargingOrderRefund.setRefundStatus(1);
- chargingOrderRefund.setPayType(tChargingOrder.getRechargePaymentType());
- chargingOrderRefund.setRefundTime(LocalDateTime.now());
- chargingOrderRefund.setCode(tChargingOrder.getCode());
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
- chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
- chargingOrderRefund.setRefundTitle("后台退款");
- chargingOrderRefund.setRefundContent("后台退款");
- chargingOrderRefund.setRefundReason("后台退款");
- chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark());
- chargingOrderRefund.setRefundTotalAmount(money(tChargingOrder.getRefundAmount()).add(manualRefundAmount));
- chargingOrderRefund.setPayAmount(money(tChargingOrder.getPaymentAmount()));
- BigDecimal refundedThirdAmount = money(tChargingOrder.getThirdRefundAmount());
- BigDecimal refundableThirdAmount = getRefundableThirdPayAmount(tChargingOrder).subtract(refundedThirdAmount);
- if (refundableThirdAmount.compareTo(BigDecimal.ZERO) < 0) {
- refundableThirdAmount = BigDecimal.ZERO;
- }
- BigDecimal thirdRefundAmount = isBalancePayMode(tChargingOrder.getPayMethod())
- ? manualRefundAmount.min(refundableThirdAmount).setScale(2, RoundingMode.HALF_UP)
- : manualRefundAmount;
- BigDecimal balanceRefundAmount = manualRefundAmount.subtract(thirdRefundAmount).setScale(2, RoundingMode.HALF_UP);
- if (balanceRefundAmount.compareTo(BigDecimal.ZERO) < 0) {
- balanceRefundAmount = BigDecimal.ZERO;
- }
- chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
- chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
+ @Override
+ public List<Map<String, Object>> carUserBrand() {
+ return this.baseMapper.carUserBrand();
+ }
- if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
- chargingOrderRefund.setRefundSerialNumber("BALANCE");
- finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
- }
- else if (isIcbcOrder(tChargingOrder)) {
- R shareRefund = refundIcbcShareBeforeMainRefund(tChargingOrder, chargingOrderRefund, thirdRefundAmount);
- if (shareRefund.getCode() != 200) {
- return shareRefund;
- }
- refundByIcbcAndFinish(tChargingOrder, chargingOrderRefund, thirdRefundAmount, "取消订单", true,
- manualRefundAmount, balanceRefundAmount);
- }
- else if (1 == tChargingOrder.getRechargePaymentType()) {
- WxPaymentRefundModel model = new WxPaymentRefundModel();
- model.setOut_trade_no(tChargingOrder.getCode());
- model.setOut_refund_no(chargingOrderRefund.getRefundCode());
- model.setTransaction_id(tChargingOrder.getRechargeSerialNumber());
- model.setReason("取消订单");
- model.setNotify_url("/payment/wx/refund/notify");
- WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
- amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
- amount.setTotal(getRefundableThirdPayAmount(tChargingOrder).multiply(new BigDecimal(100)).intValue());
- amount.setCurrency("CNY");
- model.setAmount(amount);
- R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
- if (orderR == null || orderR.getCode() != 200) {
- return R.fail(orderR == null ? "微信退款服务无响应" : firstNotBlank(orderR.getMsg(), "微信退款失败"));
- }
- finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
- //手续费
- if (orderR.getData() != null && orderR.getData().get("amount") instanceof Map) {
- Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount");
- Object refund_fee1 = amount1.get("refund_fee");
- BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
- chargingOrderRefund.setRefundFee(refund_fee);
- chargingOrderRefundService.updateById(chargingOrderRefund);
- }
- }
-
- else if (2 == tChargingOrder.getRechargePaymentType()) {
- RefundReq dto = new RefundReq();
- dto.setOutTradeNo(tChargingOrder.getCode());
- dto.setOutRequestNo(tChargingOrder.getCode());
- dto.setRefundAmount(thirdRefundAmount.toString());
- dto.setRefundReason("取消订单");
- R<RefundResp> refundResult = aliPaymentClient.refund(dto);
- RefundResp resp = refundResult == null ? null : refundResult.getData();
- if (refundResult == null || refundResult.getCode() != 200 || resp == null || !"10000".equals(resp.getCode())) {
- return R.fail(refundResult == null ? "支付宝退款服务无响应"
- : firstNotBlank(resp == null ? null : resp.getMsg(), refundResult.getMsg(), "支付宝退款失败"));
- }
- finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
- }
- else if (3 == tChargingOrder.getRechargePaymentType()) {
- RefundReq dto = new RefundReq();
- dto.setOutTradeNo(tChargingOrder.getRechargeSerialNumber());
- dto.setOutRequestNo(tChargingOrder.getCode());
- dto.setRefundAmount(thirdRefundAmount.toString());
- dto.setRefundReason("取消订单");
- R<RefundResp> refundResult = h5AliPaymentClient.refund(dto);
- RefundResp resp = refundResult == null ? null : refundResult.getData();
- if (refundResult == null || refundResult.getCode() != 200 || resp == null || !"10000".equals(resp.getCode())) {
- return R.fail(refundResult == null ? "支付宝H5退款服务无响应" : firstNotBlank(refundResult.getMsg(), "支付宝H5退款失败"));
- }
- finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
- }
- else {
- return R.fail("不支持的退款支付方式");
- }
+ @Override
+ public Map<String, Object> countLocalCar() {
+ return this.baseMapper.countLocalCar();
+ }
- if(5 == tChargingOrder.getStatus()){
- ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
- threadPoolExecutor.execute(()->{
- //推送成都监管
- NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
- statusVo.setOrderCode(tChargingOrder.getCode());
- statusVo.setChargingGunId(tChargingOrder.getChargingGunId());
- chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
- chengDuJianGuanClient.notificationOrderInfo(statusVo);
- });
- }
- return R.ok();
- }
- if (payOrderQueryDto.getType() == 2) {
- TShoppingOrder shoppingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId());
- if (shoppingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount()) == -1) {
- return R.fail("退款金额需小于支付金额");
- }
- if ((shoppingOrder.getPaymentAmount().subtract(shoppingOrder.getRefundAmount()).compareTo(payOrderQueryDto.getRefundAmount())) == 0) {
- shoppingOrder.setStatus(5);
- }
-
- TShoppingOrderRefund shoppingOrderRefund = new TShoppingOrderRefund();
- shoppingOrderRefund.setShoppingOrderId(shoppingOrder.getId());
- shoppingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
- shoppingOrderRefund.setRefundStatus(1);
- shoppingOrderRefund.setPayType(shoppingOrder.getPaymentType());
- shoppingOrderRefund.setRefundTime(LocalDateTime.now());
- shoppingOrderRefund.setCode(shoppingOrder.getCode());
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
- shoppingOrderRefund.setRefundCode("GWF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
- shoppingOrderRefund.setRefundTitle("后台退款");
- shoppingOrderRefund.setRefundContent("后台退款");
- shoppingOrderRefund.setRefundReason("后台退款");
- shoppingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark());
- shoppingOrderRefund.setRefundTotalAmount(money(shoppingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
- shoppingOrderRefund.setPayAmount(shoppingOrder.getPaymentAmount());
+ @Override
+ public Double getAver(List<Integer> siteIds) {
+ return this.baseMapper.getAver(siteIds);
+ }
- if (1 == shoppingOrder.getPaymentType()) {
- WxPaymentRefundModel model = new WxPaymentRefundModel();
- model.setOut_trade_no(shoppingOrder.getCode());
- model.setOut_refund_no(shoppingOrderRefund.getRefundCode());
- model.setTransaction_id(shoppingOrder.getSerialNumber());
- model.setReason("取消订单");
- model.setNotify_url("/payment/wx/refund/notify");
- WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
- amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
- amount.setTotal(shoppingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
- amount.setCurrency("CNY");
- model.setAmount(amount);
- R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
- if (200 == orderR.getCode()) {
- shoppingOrder.setRefundStatus(2);
- shoppingOrder.setRefundAmount((shoppingOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : shoppingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
- shoppingOrderService.updateById(shoppingOrder);
- shoppingOrderRefundService.save(shoppingOrderRefund);
- //手续费
- Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount");
- Object refund_fee1 = amount1.get("refund_fee");
- BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
- shoppingOrderRefund.setRefundFee(refund_fee);
- shoppingOrderRefundService.updateById(shoppingOrderRefund);
- }
- }
-
- if (2 == shoppingOrder.getPaymentType()) {
- RefundReq dto = new RefundReq();
- dto.setOutTradeNo(shoppingOrder.getCode());
- dto.setOutRequestNo(shoppingOrder.getCode());
- dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString());
- dto.setRefundReason("取消订单");
- RefundResp resp = aliPaymentClient.refund(dto).getData();
- if (null != resp) {
- shoppingOrder.setRefundStatus(2);
- shoppingOrder.setRefundAmount((shoppingOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : shoppingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
- shoppingOrderService.updateById(shoppingOrder);
- shoppingOrderRefundService.save(shoppingOrderRefund);
- }
- }
- if (3 == shoppingOrder.getPaymentType()) {
- IcbcRefundReq refundReq = new IcbcRefundReq();
- refundReq.setOutTradeNo(shoppingOrder.getCode());
- refundReq.setOrderId(shoppingOrder.getSerialNumber());
- refundReq.setOutRefundNo(shoppingOrderRefund.getRefundCode());
- refundReq.setRefundAmount(payOrderQueryDto.getRefundAmount());
- refundReq.setTotalAmount(shoppingOrder.getPaymentAmount());
- refundReq.setReason("后台商城订单退款");
- R<IcbcRefundResp> refundResult = icbcPaymentClient.refund(refundReq);
- IcbcRefundResp refundResp = refundResult == null ? null : refundResult.getData();
- if (refundResult == null || refundResult.getCode() != 200 || refundResp == null || !"SUCCESS".equals(refundResp.getStatus())) {
- return R.fail(refundResult == null ? "工行退款服务无响应"
- : firstNotBlank(refundResp == null ? null : refundResp.getRawResponse(), refundResult.getMsg(), "工行退款失败"));
- }
- shoppingOrder.setRefundStatus(2);
- shoppingOrder.setRefundAmount(money(shoppingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
- shoppingOrder.setRefundSerialNumber(refundResp.getRefundId());
- shoppingOrder.setRefundTime(LocalDateTime.now());
- shoppingOrderService.updateById(shoppingOrder);
- shoppingOrderRefund.setRefundStatus(2);
- shoppingOrderRefund.setRefundSerialNumber(refundResp.getRefundId());
- shoppingOrderRefundService.save(shoppingOrderRefund);
- }
+ @Override
+ public List<Map<String, Object>> getLevelEvaluate(List<Integer> siteIds) {
+ return this.baseMapper.getLevelEvaluate(siteIds);
+ }
+
+
+ @Resource
+ private TShoppingOrderService shoppingOrderService;
+ @Resource
+ private TShoppingOrderRefundService shoppingOrderRefundService;
+ @Resource
+ private TVipOrderService vipOrderService;
+ @Resource
+ private TVipOrderRefundService vipOrderRefundService;
+
+
+ @Override
+ public R<PayOrderInfoDto> getSpecialRefundOrder(PayOrderRefundDto payOrderQueryDto) {
+ TChargingOrder order = getSpecialRefundChargingOrder(payOrderQueryDto);
+ if (order == null) {
+ return R.fail("未查询到支付成功的充电订单");
+ }
+ mergeSuccessfulRefundAmounts(order);
+ PayOrderInfoDto dto = new PayOrderInfoDto();
+ BigDecimal thirdPayAmount = getRefundableThirdPayAmount(order);
+ BigDecimal thirdRefundAmount = money(order.getThirdRefundAmount());
+ dto.setOrderId(order.getId().toString());
+ dto.setCode(order.getCode());
+ dto.setTradeNo(order.getRechargeSerialNumber());
+ dto.setPayType(order.getRechargePaymentType());
+ dto.setPayAmount(thirdPayAmount);
+ dto.setPayTime(order.getPayTime());
+ dto.setRefundAmount(thirdRefundAmount);
+ dto.setRechargeAmount(money(order.getRechargeAmount()));
+ dto.setFinalAmount(thirdPayAmount.subtract(thirdRefundAmount).max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP));
+ dto.setPayMethod(order.getPayMethod());
+ dto.setBalancePayAmount(money(order.getBalancePayAmount()));
+ dto.setThirdPayAmount(thirdPayAmount);
+ dto.setBalanceRefundAmount(money(order.getBalanceRefundAmount()));
+ dto.setThirdRefundAmount(thirdRefundAmount);
+ dto.setRefundableAmount(getSpecialRefundableAmount(order));
+ return R.ok(dto);
+ }
+
+ @Override
+ public BigDecimal getManualRefundableAmount(Long chargingOrderId) {
+ if (chargingOrderId == null) {
+ return BigDecimal.ZERO;
+ }
+ return getManualRefundableAmount(this.getById(chargingOrderId));
+ }
+
+ private BigDecimal getManualRefundableAmount(TChargingOrder order) {
+ if (order == null || order.getId() == null) {
+ return BigDecimal.ZERO;
+ }
+ List<TChargingOrderRefund> successfulRefunds = chargingOrderRefundService.list(
+ new LambdaQueryWrapper<TChargingOrderRefund>()
+ .eq(TChargingOrderRefund::getChargingOrderId, order.getId())
+ .eq(TChargingOrderRefund::getRefundStatus, 2));
+ return calculateManualRefundableAmount(order.getPaymentAmount(), successfulRefunds);
+ }
+
+ static BigDecimal calculateManualRefundableAmount(BigDecimal paymentAmount, List<TChargingOrderRefund> successfulRefunds) {
+ BigDecimal successfulManualRefundAmount = Optional.ofNullable(successfulRefunds)
+ .orElse(Collections.emptyList())
+ .stream()
+ .filter(refund -> "后台退款".equals(refund.getRefundTitle())
+ || SPECIAL_REFUND_TITLE.equals(refund.getRefundTitle()))
+ .map(TChargingOrderRefund::getRefundAmount)
+ .map(amount -> amount == null ? BigDecimal.ZERO : amount)
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
+ return (paymentAmount == null ? BigDecimal.ZERO : paymentAmount)
+ .subtract(successfulManualRefundAmount)
+ .max(BigDecimal.ZERO)
+ .setScale(2, RoundingMode.HALF_UP);
+ }
+
+ private BigDecimal getSpecialRefundableAmount(TChargingOrder order) {
+ return calculateSpecialRefundableAmount(
+ getManualRefundableAmount(order),
+ getRefundableThirdPayAmount(order),
+ money(order == null ? null : order.getThirdRefundAmount()));
+ }
+
+ static BigDecimal calculateSpecialRefundableAmount(BigDecimal manualRefundableAmount,
+ BigDecimal thirdPayAmount, BigDecimal thirdRefundAmount) {
+ BigDecimal normalizedManualAmount = manualRefundableAmount == null ? BigDecimal.ZERO : manualRefundableAmount;
+ BigDecimal normalizedThirdPayAmount = thirdPayAmount == null ? BigDecimal.ZERO : thirdPayAmount;
+ BigDecimal normalizedThirdRefundAmount = thirdRefundAmount == null ? BigDecimal.ZERO : thirdRefundAmount;
+ BigDecimal remainingThirdAmount = normalizedThirdPayAmount
+ .subtract(normalizedThirdRefundAmount)
+ .max(BigDecimal.ZERO);
+ return normalizedManualAmount
+ .min(remainingThirdAmount)
+ .setScale(2, RoundingMode.HALF_UP);
+ }
+
+ @Override
+ @Transactional
+ public R specialRefund(PayOrderRefundDto payOrderQueryDto) {
+ R passwordValid = validateOperationPassword(payOrderQueryDto);
+ if (passwordValid.getCode() != 200) {
+ return passwordValid;
+ }
+ if (payOrderQueryDto.getRefundAmount() == null || payOrderQueryDto.getRefundAmount().compareTo(BigDecimal.ZERO) <= 0) {
+ return R.fail("请输入正确的退款金额");
+ }
+ TChargingOrder order = getSpecialRefundChargingOrder(payOrderQueryDto);
+ if (order == null) {
+ return R.fail("未查询到支付成功的充电订单");
+ }
+ RLock lock = redissonClient.getLock("SPECIAL_REFUND_ORDER_LOCK:" + order.getId());
+ if (!lock.tryLock()) {
+ return R.fail("该订单正在退款处理中,请勿重复提交");
+ }
+ try {
+ order = this.getById(order.getId());
+ if (order == null) {
+ return R.fail("充电订单不存在");
+ }
+ mergeSuccessfulRefundAmounts(order);
+ BigDecimal refundAmount = money(payOrderQueryDto.getRefundAmount());
+ BigDecimal refundableAmount = getSpecialRefundableAmount(order);
+ if (refundAmount.compareTo(refundableAmount) > 0) {
+ return R.fail("退款金额不能超过剩余可退金额");
+ }
+ BigDecimal refundedThirdAmount = money(order.getThirdRefundAmount());
+ BigDecimal refundableThirdAmount = getRefundableThirdPayAmount(order).subtract(refundedThirdAmount);
+ if (refundableThirdAmount.compareTo(BigDecimal.ZERO) < 0) {
+ refundableThirdAmount = BigDecimal.ZERO;
+ }
+ BigDecimal thirdRefundAmount = isBalancePayMode(order.getPayMethod())
+ ? refundAmount.min(refundableThirdAmount).setScale(2, RoundingMode.HALF_UP)
+ : refundAmount;
+ BigDecimal balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).setScale(2, RoundingMode.HALF_UP);
+ if (balanceRefundAmount.compareTo(BigDecimal.ZERO) < 0) {
+ balanceRefundAmount = BigDecimal.ZERO;
+ }
+ TChargingOrderRefund refund = buildSpecialChargingRefund(order, payOrderQueryDto, refundAmount, balanceRefundAmount, thirdRefundAmount);
+ if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
+ refund.setRefundSerialNumber("BALANCE");
+ finishManualChargingRefund(order, refund, refundAmount, balanceRefundAmount, thirdRefundAmount);
+ return R.ok();
+ }
+ Integer payType = order.getRechargePaymentType();
+ boolean success = false;
+ if (Integer.valueOf(1).equals(payType)) {
+ R shareRefund = refundIcbcShareBeforeMainRefund(order, refund, thirdRefundAmount);
+ if (shareRefund.getCode() != 200) {
+ return shareRefund;
+ }
+ success = refundByIcbcAndFinish(order, refund, thirdRefundAmount, SPECIAL_REFUND_TITLE, true, refundAmount, balanceRefundAmount);
+ } else if (Integer.valueOf(2).equals(payType)) {
+ RefundReq dto = new RefundReq();
+ dto.setOutTradeNo(order.getCode());
+ dto.setOutRequestNo(refund.getRefundCode());
+ dto.setRefundAmount(thirdRefundAmount.toString());
+ dto.setRefundReason(SPECIAL_REFUND_TITLE);
+ RefundResp resp = aliPaymentClient.refund(dto).getData();
+ if (resp != null) {
+ refund.setRefundSerialNumber(resp.getTradeNo());
+ refund.setRefundTime(LocalDateTime.now());
+ finishManualChargingRefund(order, refund, refundAmount, balanceRefundAmount, thirdRefundAmount);
+ success = true;
+ }
+ } else if (Integer.valueOf(3).equals(payType)) {
+ RefundReq dto = new RefundReq();
+ dto.setOutTradeNo(order.getRechargeSerialNumber());
+ dto.setOutRequestNo(refund.getRefundCode());
+ dto.setRefundAmount(thirdRefundAmount.toString());
+ dto.setRefundReason(SPECIAL_REFUND_TITLE);
+ RefundResp resp = h5AliPaymentClient.refund(dto).getData();
+ if (resp != null && "10000".equals(resp.getCode())) {
+ refund.setRefundSerialNumber(resp.getTradeNo());
+ refund.setRefundTime(LocalDateTime.now());
+ finishManualChargingRefund(order, refund, refundAmount, balanceRefundAmount, thirdRefundAmount);
+ success = true;
+ }
+ }
+ return success ? R.ok() : R.fail("退款失败,请检查支付渠道或稍后重试");
+ } finally {
+ if (lock.isHeldByCurrentThread()) {
+ lock.unlock();
+ }
+ }
+ }
+
+ private void mergeSuccessfulRefundAmounts(TChargingOrder order) {
+ if (order == null || order.getId() == null) {
+ return;
+ }
+ List<TChargingOrderRefund> refunds = chargingOrderRefundService.list(
+ new LambdaQueryWrapper<TChargingOrderRefund>()
+ .eq(TChargingOrderRefund::getChargingOrderId, order.getId())
+ .eq(TChargingOrderRefund::getRefundStatus, 2));
+ if (refunds == null || refunds.isEmpty()) {
+ return;
+ }
+ BigDecimal successfulAmount = BigDecimal.ZERO;
+ BigDecimal explicitBalanceAmount = BigDecimal.ZERO;
+ BigDecimal explicitThirdAmount = BigDecimal.ZERO;
+ BigDecimal unspecifiedAmount = BigDecimal.ZERO;
+ for (TChargingOrderRefund refund : refunds) {
+ BigDecimal amount = money(refund.getRefundAmount());
+ BigDecimal balanceAmount = money(refund.getBalanceRefundAmount());
+ BigDecimal thirdAmount = money(refund.getThirdRefundAmount());
+ successfulAmount = successfulAmount.add(amount);
+ explicitBalanceAmount = explicitBalanceAmount.add(balanceAmount);
+ explicitThirdAmount = explicitThirdAmount.add(thirdAmount);
+ if (balanceAmount.add(thirdAmount).compareTo(BigDecimal.ZERO) == 0) {
+ unspecifiedAmount = unspecifiedAmount.add(amount);
+ }
+ }
+ BigDecimal inferredThirdAmount = unspecifiedAmount.min(
+ getRefundableThirdPayAmount(order).subtract(explicitThirdAmount).max(BigDecimal.ZERO));
+ BigDecimal inferredBalanceAmount = unspecifiedAmount.subtract(inferredThirdAmount).max(BigDecimal.ZERO);
+ order.setRefundAmount(money(order.getRefundAmount()).max(money(successfulAmount)));
+ order.setThirdRefundAmount(money(order.getThirdRefundAmount()).max(money(explicitThirdAmount.add(inferredThirdAmount))));
+ order.setBalanceRefundAmount(money(order.getBalanceRefundAmount()).max(money(explicitBalanceAmount.add(inferredBalanceAmount))));
+ }
+
+ private R refundIcbcShareBeforeMainRefund(TChargingOrder order, TChargingOrderRefund refund, BigDecimal thirdRefundAmount) {
+ if (order == null || refund == null || thirdRefundAmount == null || thirdRefundAmount.compareTo(BigDecimal.ZERO) <= 0) {
+ return R.ok();
+ }
+ if (!"ICBC".equals(order.getSourceName())) {
+ return R.ok();
+ }
+ List<TChargingOrderShareRecord> shareRecords = chargingOrderShareRecordMapper.selectList(
+ new LambdaQueryWrapper<TChargingOrderShareRecord>()
+ .eq(TChargingOrderShareRecord::getChargingOrderId, order.getId())
+ .eq(TChargingOrderShareRecord::getPayChannel, "ICBC")
+ .eq(TChargingOrderShareRecord::getNeedOnlineShare, true)
+ .eq(TChargingOrderShareRecord::getOnlineShareStatus, "SUCCESS")
+ .eq(TChargingOrderShareRecord::getDelFlag, false)
+ .orderByAsc(TChargingOrderShareRecord::getId));
+ if (shareRecords == null || shareRecords.isEmpty()) {
+ return R.ok();
+ }
+ BigDecimal thirdPayAmount = getRefundableThirdPayAmount(order);
+ if (thirdPayAmount.compareTo(BigDecimal.ZERO) <= 0) {
+ return R.fail("订单已分账但第三方支付金额异常,禁止退款");
+ }
+ BigDecimal cumulativeThirdRefund = money(order.getThirdRefundAmount()).add(thirdRefundAmount).min(thirdPayAmount).setScale(2, RoundingMode.HALF_UP);
+ for (TChargingOrderShareRecord shareRecord : shareRecords) {
+ BigDecimal shareAmount = money(shareRecord.getShareAmount());
+ if (shareAmount.compareTo(BigDecimal.ZERO) <= 0) {
+ continue;
+ }
+ BigDecimal targetRefundAmount = shareAmount.multiply(cumulativeThirdRefund).divide(thirdPayAmount, 2, RoundingMode.HALF_UP).min(shareAmount).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal refundedShareAmount;
+ try {
+ refundedShareAmount = queryIcbcShareRefundAmount(order, shareRecord);
+ } catch (ServiceException e) {
+ return R.fail(e.getMessage());
+ }
+ BigDecimal shareRefundAmount = targetRefundAmount.subtract(refundedShareAmount).setScale(2, RoundingMode.HALF_UP);
+ if (shareRefundAmount.compareTo(BigDecimal.ZERO) <= 0) {
+ continue;
+ }
+ R result = refundIcbcShareRecord(order, shareRecord, refund, shareRefundAmount);
+ if (result.getCode() != 200) {
+ return result;
+ }
+ }
+ return R.ok();
+ }
+
+ private BigDecimal queryIcbcShareRefundAmount(TChargingOrder order, TChargingOrderShareRecord shareRecord) {
+ try {
+ IcbcSubOrderQueryReq queryReq = IcbcAdminFundOperationSupport.buildSubOrderQueryRequest(order, shareRecord);
+ R<IcbcSubOrderQueryResp> queryResult = icbcPaymentClient.querySubOrder(queryReq);
+ IcbcSubOrderQueryResp queryResp = queryResult == null ? null : queryResult.getData();
+ if (queryResult == null || queryResult.getCode() != 200 || queryResp == null || !"SUCCESS".equals(queryResp.getStatus())) {
+ throw new ServiceException(queryResult == null ? "工行子订单查询无响应" : firstNotBlank(queryResult.getMsg(), "工行子订单查询失败"));
+ }
+ return parseIcbcAmount(queryResp.getOrderRefundAmnt());
+ } catch (IllegalArgumentException e) {
+ throw new ServiceException(e.getMessage());
+ } catch (ServiceException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new ServiceException("工行子订单查询异常:" + firstNotBlank(e.getMessage(), "未知异常"));
+ }
+ }
+
+ private R refundIcbcShareRecord(TChargingOrder order, TChargingOrderShareRecord shareRecord, TChargingOrderRefund refund, BigDecimal shareRefundAmount) {
+ String suffix = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
+ String retSubOrderId = ("SPSUB" + refund.getRefundCode() + shareRecord.getId()).substring(0, Math.min(50, ("SPSUB" + refund.getRefundCode() + shareRecord.getId()).length()));
+ String outtrxSerialNo = ("SPSUBREF" + suffix + shareRecord.getId()).substring(0, Math.min(50, ("SPSUBREF" + suffix + shareRecord.getId()).length()));
+ try {
+ IcbcSubOrderRefundReq refundReq = IcbcAdminFundOperationSupport.buildSubOrderRefundRequest(
+ order, shareRecord, shareRefundAmount, retSubOrderId, outtrxSerialNo);
+ refundReq.setMerSpInfor("特殊退款分账退回:" + order.getCode());
+ R<IcbcSubOrderRefundResp> refundResult = icbcPaymentClient.refundSubOrder(refundReq);
+ IcbcSubOrderRefundResp refundResp = refundResult == null ? null : refundResult.getData();
+ if (refundResult == null || refundResult.getCode() != 200 || refundResp == null || !"SUCCESS".equals(refundResp.getStatus())) {
+ String message = refundResult == null ? "工行分账退款无响应" : firstNotBlank(refundResult.getMsg(), refundResp == null ? null : refundResp.getRawResponse(), "工行分账退款失败");
+ log.error("特殊退款分账退回失败,订单号:{},退款单号:{},分账记录:{},金额:{},原因:{}",
+ order.getCode(), refund.getRefundCode(), shareRecord.getId(), shareRefundAmount, message);
+ return R.fail("分账退回失败:" + message);
+ }
+ log.info("特殊退款分账退回成功,订单号:{},退款单号:{},分账记录:{},金额:{}",
+ order.getCode(), refund.getRefundCode(), shareRecord.getId(), shareRefundAmount);
+ return R.ok();
+ } catch (IllegalArgumentException | ServiceException e) {
+ log.error("特殊退款分账退回失败,订单号:{},退款单号:{},分账记录:{},金额:{}",
+ order.getCode(), refund.getRefundCode(), shareRecord.getId(), shareRefundAmount, e);
+ return R.fail("分账退回失败:" + e.getMessage());
+ } catch (Exception e) {
+ log.error("特殊退款分账退回异常,订单号:{},退款单号:{},分账记录:{},金额:{}",
+ order.getCode(), refund.getRefundCode(), shareRecord.getId(), shareRefundAmount, e);
+ return R.fail("分账退回异常:" + firstNotBlank(e.getMessage(), "未知异常"));
+ }
+ }
+
+ private BigDecimal parseIcbcAmount(String amount) {
+ if (!StringUtils.hasLength(amount)) {
+ return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ }
+ String value = amount.trim();
+ try {
+ if (value.contains(".")) {
+ return money(new BigDecimal(value));
+ }
+ return new BigDecimal(value).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+ } catch (NumberFormatException e) {
+ throw new ServiceException("工行金额格式异常:" + amount);
+ }
+ }
+
+ private R validateOperationPassword(PayOrderRefundDto payOrderQueryDto) {
+ if (payOrderQueryDto == null || StringUtils.isEmpty(payOrderQueryDto.getOperationPassword())) {
+ return R.fail("请输入操作密码");
+ }
+ SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
+ if (sysUser == null || StringUtils.isEmpty(sysUser.getOperationPassword())) {
+ return R.fail("当前账号未配置操作密码");
+ }
+ if (!SecurityUtils.matchesPassword(payOrderQueryDto.getOperationPassword(), sysUser.getOperationPassword())) {
+ return R.fail("操作密码错误");
+ }
+ return R.ok();
+ }
+
+ private TChargingOrder getSpecialRefundChargingOrder(PayOrderRefundDto payOrderQueryDto) {
+ if (payOrderQueryDto == null) {
+ return null;
+ }
+ LambdaQueryWrapper<TChargingOrder> wrapper = new LambdaQueryWrapper<TChargingOrder>()
+ .eq(TChargingOrder::getRechargePaymentStatus, 2)
+ .eq(TChargingOrder::getDelFlag, false);
+ if (payOrderQueryDto.getOrderId() != null) {
+ wrapper.eq(TChargingOrder::getId, payOrderQueryDto.getOrderId());
+ } else if (StringUtils.hasLength(payOrderQueryDto.getCode())) {
+ wrapper.eq(TChargingOrder::getCode, payOrderQueryDto.getCode());
+ } else if (StringUtils.hasLength(payOrderQueryDto.getSerialNumber())) {
+ wrapper.eq(TChargingOrder::getRechargeSerialNumber, payOrderQueryDto.getSerialNumber());
+ } else {
+ return null;
+ }
+ return this.getOne(wrapper.last("limit 1"));
+ }
+
+ private TChargingOrderRefund buildSpecialChargingRefund(TChargingOrder order, PayOrderRefundDto dto, BigDecimal refundAmount,
+ BigDecimal balanceRefundAmount, BigDecimal thirdRefundAmount) {
+ TChargingOrderRefund refund = new TChargingOrderRefund();
+ refund.setChargingOrderId(order.getId());
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+ refund.setRefundCode("TSF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
+ refund.setRefundAmount(refundAmount);
+ refund.setBalanceRefundAmount(balanceRefundAmount);
+ refund.setThirdRefundAmount(thirdRefundAmount);
+ refund.setRefundStatus(1);
+ refund.setPayType(order.getRechargePaymentType());
+ refund.setRefundTime(LocalDateTime.now());
+ refund.setCode(order.getCode());
+ refund.setRefundTitle(SPECIAL_REFUND_TITLE);
+ refund.setRefundContent(SPECIAL_REFUND_TITLE);
+ refund.setRefundReason(StringUtils.hasLength(dto.getReason()) ? dto.getReason() : SPECIAL_REFUND_TITLE);
+ refund.setRefundRemark(dto.getRemark());
+ refund.setRefundTotalAmount(money(order.getRefundAmount()).add(refundAmount));
+ refund.setPayAmount(money(order.getPaymentAmount()));
+ return refund;
+ }
+
+ @Override
+ public R payRefund(PayOrderRefundDto payOrderQueryDto) {
+ R passwordValid = validateOperationPassword(payOrderQueryDto);
+ if (passwordValid.getCode() != 200) {
+ return passwordValid;
+ }
+ if (payOrderQueryDto.getRefundAmount() == null || payOrderQueryDto.getRefundAmount().compareTo(BigDecimal.ZERO) <= 0) {
+ return R.fail("退款金额必须大于0");
+ }
+ if (payOrderQueryDto.getType() == 1) {
+ TChargingOrder tChargingOrder = this.baseMapper.selectById(payOrderQueryDto.getOrderId());
+ if (tChargingOrder == null) {
+ return R.fail("充电订单不存在");
+ }
+ BigDecimal manualRefundAmount = money(payOrderQueryDto.getRefundAmount());
+ BigDecimal remainingRefundAmount = getManualRefundableAmount(tChargingOrder);
+ if (manualRefundAmount.compareTo(remainingRefundAmount) > 0) {
+ return R.fail("退款金额不能超过剩余可退金额" + remainingRefundAmount.toPlainString() + "元");
+ }
+ if (manualRefundAmount.compareTo(remainingRefundAmount) == 0) {
+ tChargingOrder.setStatus(5);
+ }
+
+ TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
+ chargingOrderRefund.setChargingOrderId(tChargingOrder.getId());
+ chargingOrderRefund.setRefundAmount(manualRefundAmount);
+ chargingOrderRefund.setRefundStatus(1);
+ chargingOrderRefund.setPayType(tChargingOrder.getRechargePaymentType());
+ chargingOrderRefund.setRefundTime(LocalDateTime.now());
+ chargingOrderRefund.setCode(tChargingOrder.getCode());
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+ chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
+ chargingOrderRefund.setRefundTitle("后台退款");
+ chargingOrderRefund.setRefundContent("后台退款");
+ chargingOrderRefund.setRefundReason("后台退款");
+ chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark());
+ chargingOrderRefund.setRefundTotalAmount(money(tChargingOrder.getRefundAmount()).add(manualRefundAmount));
+ chargingOrderRefund.setPayAmount(money(tChargingOrder.getPaymentAmount()));
+ BigDecimal refundedThirdAmount = money(tChargingOrder.getThirdRefundAmount());
+ BigDecimal refundableThirdAmount = getRefundableThirdPayAmount(tChargingOrder).subtract(refundedThirdAmount);
+ if (refundableThirdAmount.compareTo(BigDecimal.ZERO) < 0) {
+ refundableThirdAmount = BigDecimal.ZERO;
+ }
+ BigDecimal thirdRefundAmount = isBalancePayMode(tChargingOrder.getPayMethod())
+ ? manualRefundAmount.min(refundableThirdAmount).setScale(2, RoundingMode.HALF_UP)
+ : manualRefundAmount;
+ BigDecimal balanceRefundAmount = manualRefundAmount.subtract(thirdRefundAmount).setScale(2, RoundingMode.HALF_UP);
+ if (balanceRefundAmount.compareTo(BigDecimal.ZERO) < 0) {
+ balanceRefundAmount = BigDecimal.ZERO;
+ }
+ chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
+ chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
+
+ if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
+ chargingOrderRefund.setRefundSerialNumber("BALANCE");
+ finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
+ } else if (isIcbcOrder(tChargingOrder)) {
+ R shareRefund = refundIcbcShareBeforeMainRefund(tChargingOrder, chargingOrderRefund, thirdRefundAmount);
+ if (shareRefund.getCode() != 200) {
+ return shareRefund;
+ }
+ refundByIcbcAndFinish(tChargingOrder, chargingOrderRefund, thirdRefundAmount, "取消订单", true,
+ manualRefundAmount, balanceRefundAmount);
+ } else if (1 == tChargingOrder.getRechargePaymentType()) {
+ WxPaymentRefundModel model = new WxPaymentRefundModel();
+ model.setOut_trade_no(tChargingOrder.getCode());
+ model.setOut_refund_no(chargingOrderRefund.getRefundCode());
+ model.setTransaction_id(tChargingOrder.getRechargeSerialNumber());
+ model.setReason("取消订单");
+ model.setNotify_url("/payment/wx/refund/notify");
+ WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
+ amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
+ amount.setTotal(getRefundableThirdPayAmount(tChargingOrder).multiply(new BigDecimal(100)).intValue());
+ amount.setCurrency("CNY");
+ model.setAmount(amount);
+ R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
+ if (orderR == null || orderR.getCode() != 200) {
+ return R.fail(orderR == null ? "微信退款服务无响应" : firstNotBlank(orderR.getMsg(), "微信退款失败"));
+ }
+ finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
+ //手续费
+ if (orderR.getData() != null && orderR.getData().get("amount") instanceof Map) {
+ Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount");
+ Object refund_fee1 = amount1.get("refund_fee");
+ BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
+ chargingOrderRefund.setRefundFee(refund_fee);
+ chargingOrderRefundService.updateById(chargingOrderRefund);
+ }
+ } else if (2 == tChargingOrder.getRechargePaymentType()) {
+ RefundReq dto = new RefundReq();
+ dto.setOutTradeNo(tChargingOrder.getCode());
+ dto.setOutRequestNo(tChargingOrder.getCode());
+ dto.setRefundAmount(thirdRefundAmount.toString());
+ dto.setRefundReason("取消订单");
+ R<RefundResp> refundResult = aliPaymentClient.refund(dto);
+ RefundResp resp = refundResult == null ? null : refundResult.getData();
+ if (refundResult == null || refundResult.getCode() != 200 || resp == null || !"10000".equals(resp.getCode())) {
+ return R.fail(refundResult == null ? "支付宝退款服务无响应"
+ : firstNotBlank(resp == null ? null : resp.getMsg(), refundResult.getMsg(), "支付宝退款失败"));
+ }
+ finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
+ } else if (3 == tChargingOrder.getRechargePaymentType()) {
+ RefundReq dto = new RefundReq();
+ dto.setOutTradeNo(tChargingOrder.getRechargeSerialNumber());
+ dto.setOutRequestNo(tChargingOrder.getCode());
+ dto.setRefundAmount(thirdRefundAmount.toString());
+ dto.setRefundReason("取消订单");
+ R<RefundResp> refundResult = h5AliPaymentClient.refund(dto);
+ RefundResp resp = refundResult == null ? null : refundResult.getData();
+ if (refundResult == null || refundResult.getCode() != 200 || resp == null || !"10000".equals(resp.getCode())) {
+ return R.fail(refundResult == null ? "支付宝H5退款服务无响应" : firstNotBlank(refundResult.getMsg(), "支付宝H5退款失败"));
+ }
+ finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
+ } else {
+ return R.fail("不支持的退款支付方式");
+ }
+
+ if (5 == tChargingOrder.getStatus()) {
+ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+ threadPoolExecutor.execute(() -> {
+ //推送成都监管
+ NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
+ statusVo.setOrderCode(tChargingOrder.getCode());
+ statusVo.setChargingGunId(tChargingOrder.getChargingGunId());
+ chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
+ chengDuJianGuanClient.notificationOrderInfo(statusVo);
+ });
+ }
+ return R.ok();
+ }
+ if (payOrderQueryDto.getType() == 2) {
+ TShoppingOrder shoppingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId());
+ if (shoppingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount()) == -1) {
+ return R.fail("退款金额需小于支付金额");
+ }
+ if ((shoppingOrder.getPaymentAmount().subtract(shoppingOrder.getRefundAmount()).compareTo(payOrderQueryDto.getRefundAmount())) == 0) {
+ shoppingOrder.setStatus(5);
+ }
+
+ TShoppingOrderRefund shoppingOrderRefund = new TShoppingOrderRefund();
+ shoppingOrderRefund.setShoppingOrderId(shoppingOrder.getId());
+ shoppingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
+ shoppingOrderRefund.setRefundStatus(1);
+ shoppingOrderRefund.setPayType(shoppingOrder.getPaymentType());
+ shoppingOrderRefund.setRefundTime(LocalDateTime.now());
+ shoppingOrderRefund.setCode(shoppingOrder.getCode());
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+ shoppingOrderRefund.setRefundCode("GWF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
+ shoppingOrderRefund.setRefundTitle("后台退款");
+ shoppingOrderRefund.setRefundContent("后台退款");
+ shoppingOrderRefund.setRefundReason("后台退款");
+ shoppingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark());
+ shoppingOrderRefund.setRefundTotalAmount(money(shoppingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+ shoppingOrderRefund.setPayAmount(shoppingOrder.getPaymentAmount());
+
+ if (1 == shoppingOrder.getPaymentType()) {
+ WxPaymentRefundModel model = new WxPaymentRefundModel();
+ model.setOut_trade_no(shoppingOrder.getCode());
+ model.setOut_refund_no(shoppingOrderRefund.getRefundCode());
+ model.setTransaction_id(shoppingOrder.getSerialNumber());
+ model.setReason("取消订单");
+ model.setNotify_url("/payment/wx/refund/notify");
+ WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
+ amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
+ amount.setTotal(shoppingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
+ amount.setCurrency("CNY");
+ model.setAmount(amount);
+ R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
+ if (200 == orderR.getCode()) {
+ shoppingOrder.setRefundStatus(2);
+ shoppingOrder.setRefundAmount((shoppingOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : shoppingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+ shoppingOrderService.updateById(shoppingOrder);
+ shoppingOrderRefundService.save(shoppingOrderRefund);
+ //手续费
+ Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount");
+ Object refund_fee1 = amount1.get("refund_fee");
+ BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
+ shoppingOrderRefund.setRefundFee(refund_fee);
+ shoppingOrderRefundService.updateById(shoppingOrderRefund);
+ }
+ }
+
+ if (2 == shoppingOrder.getPaymentType()) {
+ RefundReq dto = new RefundReq();
+ dto.setOutTradeNo(shoppingOrder.getCode());
+ dto.setOutRequestNo(shoppingOrder.getCode());
+ dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString());
+ dto.setRefundReason("取消订单");
+ RefundResp resp = aliPaymentClient.refund(dto).getData();
+ if (null != resp) {
+ shoppingOrder.setRefundStatus(2);
+ shoppingOrder.setRefundAmount((shoppingOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : shoppingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+ shoppingOrderService.updateById(shoppingOrder);
+ shoppingOrderRefundService.save(shoppingOrderRefund);
+ }
+ }
+ if (3 == shoppingOrder.getPaymentType()) {
+ IcbcRefundReq refundReq = new IcbcRefundReq();
+ refundReq.setOutTradeNo(shoppingOrder.getCode());
+ refundReq.setOrderId(shoppingOrder.getSerialNumber());
+ refundReq.setOutRefundNo(shoppingOrderRefund.getRefundCode());
+ refundReq.setRefundAmount(payOrderQueryDto.getRefundAmount());
+ refundReq.setTotalAmount(shoppingOrder.getPaymentAmount());
+ refundReq.setReason("后台商城订单退款");
+ R<IcbcRefundResp> refundResult = icbcPaymentClient.refund(refundReq);
+ IcbcRefundResp refundResp = refundResult == null ? null : refundResult.getData();
+ if (refundResult == null || refundResult.getCode() != 200 || refundResp == null || !"SUCCESS".equals(refundResp.getStatus())) {
+ return R.fail(refundResult == null ? "工行退款服务无响应"
+ : firstNotBlank(refundResp == null ? null : refundResp.getRawResponse(), refundResult.getMsg(), "工行退款失败"));
+ }
+ shoppingOrder.setRefundStatus(2);
+ shoppingOrder.setRefundAmount(money(shoppingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+ shoppingOrder.setRefundSerialNumber(refundResp.getRefundId());
+ shoppingOrder.setRefundTime(LocalDateTime.now());
+ shoppingOrderService.updateById(shoppingOrder);
+ shoppingOrderRefund.setRefundStatus(2);
+ shoppingOrderRefund.setRefundSerialNumber(refundResp.getRefundId());
+ shoppingOrderRefundService.save(shoppingOrderRefund);
+ }
// if(3 == tChargingOrder.getPaymentType()){
// RefundReq dto = new RefundReq();
// dto.setOutTradeNo(tChargingOrder.getCode());
@@ -5804,94 +5801,94 @@
// shoppingOrderRefundService.save(chargingOrderRefund);
// }
// }
-
- }
-
- if (payOrderQueryDto.getType() == 3) {
- TVipOrder vipOrder = vipOrderService.getById(payOrderQueryDto.getOrderId());
- if (vipOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount()) == -1) {
- return R.fail("退款金额需小于支付金额");
- }
- TVipOrderRefund vipOrderRefund = new TVipOrderRefund();
- vipOrderRefund.setVipOrderId(vipOrder.getId());
- vipOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
- vipOrderRefund.setRefundStatus(1);
- vipOrderRefund.setPayTime(vipOrder.getPayTime());
- vipOrderRefund.setPayCode(vipOrder.getCode());
- vipOrderRefund.setPayType(vipOrder.getPaymentType());
- vipOrderRefund.setRefundTime(LocalDateTime.now());
- vipOrderRefund.setCode(vipOrder.getCode());
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
- vipOrderRefund.setRefundCode("HYF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
- vipOrderRefund.setRefundTitle("后台退款");
- vipOrderRefund.setRefundContent("后台退款");
- vipOrderRefund.setRefundReason("后台退款");
- vipOrderRefund.setRefundRemark(payOrderQueryDto.getRemark());
- vipOrderRefund.setRefundTotalAmount(money(vipOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
- vipOrderRefund.setPayAmount(vipOrder.getPaymentAmount());
-
- if (1 == vipOrder.getPaymentType()) {
- WxPaymentRefundModel model = new WxPaymentRefundModel();
- model.setOut_trade_no(vipOrder.getCode());
- model.setOut_refund_no(vipOrderRefund.getRefundCode());
- model.setTransaction_id(vipOrder.getSerialNumber());
- model.setReason("取消订单");
- model.setNotify_url("/payment/wx/refund/notify");
- WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
- amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
- amount.setTotal(vipOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
- amount.setCurrency("CNY");
- model.setAmount(amount);
- R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
- if (200 == orderR.getCode()) {
- vipOrder.setRefundStatus(2);
- vipOrder.setRefundAmount((vipOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : vipOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
- vipOrderService.updateById(vipOrder);
- vipOrderRefundService.save(vipOrderRefund);
- //手续费
- Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount");
- Object refund_fee1 = amount1.get("refund_fee");
- BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
- vipOrderRefund.setRefundFee(refund_fee);
- vipOrderRefundService.updateById(vipOrderRefund);
- }
- }
-
- if (2 == vipOrder.getPaymentType()) {
- RefundReq dto = new RefundReq();
- dto.setOutTradeNo(vipOrder.getCode());
- dto.setOutRequestNo(vipOrder.getCode());
- dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString());
- dto.setRefundReason("取消订单");
- RefundResp resp = aliPaymentClient.refund(dto).getData();
- if (null != resp) {
- vipOrder.setRefundStatus(2);
- vipOrder.setRefundAmount((vipOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : vipOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
- vipOrderService.updateById(vipOrder);
- vipOrderRefundService.save(vipOrderRefund);
- }
- }
- if (3 == vipOrder.getPaymentType()) {
- IcbcRefundReq refundReq = new IcbcRefundReq();
- refundReq.setOutTradeNo(vipOrder.getCode());
- refundReq.setOrderId(vipOrder.getSerialNumber());
- refundReq.setOutRefundNo(vipOrderRefund.getRefundCode());
- refundReq.setRefundAmount(payOrderQueryDto.getRefundAmount());
- refundReq.setTotalAmount(vipOrder.getPaymentAmount());
- refundReq.setReason("后台会员订单退款");
- R<IcbcRefundResp> refundResult = icbcPaymentClient.refund(refundReq);
- IcbcRefundResp refundResp = refundResult == null ? null : refundResult.getData();
- if (refundResult == null || refundResult.getCode() != 200 || refundResp == null || !"SUCCESS".equals(refundResp.getStatus())) {
- return R.fail(refundResult == null ? "工行退款服务无响应"
- : firstNotBlank(refundResp == null ? null : refundResp.getRawResponse(), refundResult.getMsg(), "工行退款失败"));
- }
- vipOrder.setRefundStatus(2);
- vipOrder.setRefundAmount(money(vipOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
- vipOrderService.updateById(vipOrder);
- vipOrderRefund.setRefundStatus(2);
- vipOrderRefund.setRefundSerialNumber(refundResp.getRefundId());
- vipOrderRefundService.save(vipOrderRefund);
- }
+
+ }
+
+ if (payOrderQueryDto.getType() == 3) {
+ TVipOrder vipOrder = vipOrderService.getById(payOrderQueryDto.getOrderId());
+ if (vipOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount()) == -1) {
+ return R.fail("退款金额需小于支付金额");
+ }
+ TVipOrderRefund vipOrderRefund = new TVipOrderRefund();
+ vipOrderRefund.setVipOrderId(vipOrder.getId());
+ vipOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
+ vipOrderRefund.setRefundStatus(1);
+ vipOrderRefund.setPayTime(vipOrder.getPayTime());
+ vipOrderRefund.setPayCode(vipOrder.getCode());
+ vipOrderRefund.setPayType(vipOrder.getPaymentType());
+ vipOrderRefund.setRefundTime(LocalDateTime.now());
+ vipOrderRefund.setCode(vipOrder.getCode());
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+ vipOrderRefund.setRefundCode("HYF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
+ vipOrderRefund.setRefundTitle("后台退款");
+ vipOrderRefund.setRefundContent("后台退款");
+ vipOrderRefund.setRefundReason("后台退款");
+ vipOrderRefund.setRefundRemark(payOrderQueryDto.getRemark());
+ vipOrderRefund.setRefundTotalAmount(money(vipOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+ vipOrderRefund.setPayAmount(vipOrder.getPaymentAmount());
+
+ if (1 == vipOrder.getPaymentType()) {
+ WxPaymentRefundModel model = new WxPaymentRefundModel();
+ model.setOut_trade_no(vipOrder.getCode());
+ model.setOut_refund_no(vipOrderRefund.getRefundCode());
+ model.setTransaction_id(vipOrder.getSerialNumber());
+ model.setReason("取消订单");
+ model.setNotify_url("/payment/wx/refund/notify");
+ WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
+ amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
+ amount.setTotal(vipOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
+ amount.setCurrency("CNY");
+ model.setAmount(amount);
+ R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
+ if (200 == orderR.getCode()) {
+ vipOrder.setRefundStatus(2);
+ vipOrder.setRefundAmount((vipOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : vipOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+ vipOrderService.updateById(vipOrder);
+ vipOrderRefundService.save(vipOrderRefund);
+ //手续费
+ Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount");
+ Object refund_fee1 = amount1.get("refund_fee");
+ BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
+ vipOrderRefund.setRefundFee(refund_fee);
+ vipOrderRefundService.updateById(vipOrderRefund);
+ }
+ }
+
+ if (2 == vipOrder.getPaymentType()) {
+ RefundReq dto = new RefundReq();
+ dto.setOutTradeNo(vipOrder.getCode());
+ dto.setOutRequestNo(vipOrder.getCode());
+ dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString());
+ dto.setRefundReason("取消订单");
+ RefundResp resp = aliPaymentClient.refund(dto).getData();
+ if (null != resp) {
+ vipOrder.setRefundStatus(2);
+ vipOrder.setRefundAmount((vipOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : vipOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+ vipOrderService.updateById(vipOrder);
+ vipOrderRefundService.save(vipOrderRefund);
+ }
+ }
+ if (3 == vipOrder.getPaymentType()) {
+ IcbcRefundReq refundReq = new IcbcRefundReq();
+ refundReq.setOutTradeNo(vipOrder.getCode());
+ refundReq.setOrderId(vipOrder.getSerialNumber());
+ refundReq.setOutRefundNo(vipOrderRefund.getRefundCode());
+ refundReq.setRefundAmount(payOrderQueryDto.getRefundAmount());
+ refundReq.setTotalAmount(vipOrder.getPaymentAmount());
+ refundReq.setReason("后台会员订单退款");
+ R<IcbcRefundResp> refundResult = icbcPaymentClient.refund(refundReq);
+ IcbcRefundResp refundResp = refundResult == null ? null : refundResult.getData();
+ if (refundResult == null || refundResult.getCode() != 200 || refundResp == null || !"SUCCESS".equals(refundResp.getStatus())) {
+ return R.fail(refundResult == null ? "工行退款服务无响应"
+ : firstNotBlank(refundResp == null ? null : refundResp.getRawResponse(), refundResult.getMsg(), "工行退款失败"));
+ }
+ vipOrder.setRefundStatus(2);
+ vipOrder.setRefundAmount(money(vipOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+ vipOrderService.updateById(vipOrder);
+ vipOrderRefund.setRefundStatus(2);
+ vipOrderRefund.setRefundSerialNumber(refundResp.getRefundId());
+ vipOrderRefundService.save(vipOrderRefund);
+ }
// if(3 == tChargingOrder.getPaymentType()){
// RefundReq dto = new RefundReq();
// dto.setOutTradeNo(tChargingOrder.getCode());
@@ -5906,787 +5903,787 @@
// vipOrderRefundService.save(chargingOrderRefund);
// }
// }
- }
- return R.ok();
- }
-
-
- /**
- * 根据车牌号和开始时间查询充电数据
- *
- * @param query
- * @return
- */
- @Override
- public TChargingOrder getChargingOrderByLicensePlate(GetChargingOrderByLicensePlate query) {
- TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getPlateNum, query.getLicensePlate())
- .eq(TChargingOrder::getDelFlag, 0).between(TChargingOrder::getStartTime, query.getStartTime(), LocalDateTime.now())
- .eq(TChargingOrder::getRechargePaymentStatus, 2).in(TChargingOrder::getStatus, Arrays.asList(3, 4, 5))
+ }
+ return R.ok();
+ }
+
+
+ /**
+ * 根据车牌号和开始时间查询充电数据
+ *
+ * @param query
+ * @return
+ */
+ @Override
+ public TChargingOrder getChargingOrderByLicensePlate(GetChargingOrderByLicensePlate query) {
+ TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getPlateNum, query.getLicensePlate())
+ .eq(TChargingOrder::getDelFlag, 0).between(TChargingOrder::getStartTime, query.getStartTime(), LocalDateTime.now())
+ .eq(TChargingOrder::getRechargePaymentStatus, 2).in(TChargingOrder::getStatus, Arrays.asList(3, 4, 5))
.last(" order by start_time desc limit 0, 1"));
- return one;
- }
-
- @Override
- public TSettlementConfirm settlementAdd(SettlementConfirmAdd dto) {
- List<Site> data = siteClient.getSiteByIds(Arrays.asList(dto.getSiteId())).getData();
- List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list();
-
- TSettlementConfirm tSettlementConfirm = new TSettlementConfirm();
- if (!data.isEmpty()) {
- tSettlementConfirm.setSiteName(data.get(0).getName());
- tSettlementConfirm.setPartnerId(data.get(0).getPartnerId());
- if (data.get(0).getPartnerId() != null) {
- Partner data1 = siteClient.getPartnerR(data.get(0).getPartnerId()).getData();
- if (data1 != null) {
- tSettlementConfirm.setPartnerName(data1.getName());
- tSettlementConfirm.setPartnerId(data1.getId());
- }
- }
- }
- String startTime = dto.getStartTime();
- String endTime = dto.getEndTime();
- // 将这两个时间转化为localDateTime
- // 创建 DateTimeFormatter 对象,指定格式
- DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
-
- // 将字符串解析为 LocalDateTime 对象
- LocalDateTime localDateTime = LocalDateTime.parse(startTime, formatter);
- LocalDateTime localDateTime1 = LocalDateTime.parse(endTime, formatter);
- tSettlementConfirm.setEndTime(localDateTime1);
- tSettlementConfirm.setStartTime(localDateTime);
-
- // 根据站点id和开始时间和结束时间和归属日期 查询充电订单列表
- QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
- .eq("site_id", dto.getSiteId());
- switch (dto.getType()) {
- case 1:
- eq.between("pay_time", localDateTime, localDateTime1);
- break;
- case 2:
- eq.between("end_time", localDateTime, localDateTime1);
- break;
- }
- List<TChargingOrder> tChargingOrders = this.baseMapper.selectList(eq);
- // 充电电量 度
- BigDecimal chargingElectronic = new BigDecimal("0");
- // 三方收费 分佣
- BigDecimal sharingAmount = new BigDecimal("0");
- // 三方交易手续费 三方收费*0.6%
- BigDecimal commissionAmount = new BigDecimal("0");
- // 累计电费
- BigDecimal electrovalence = new BigDecimal("0");
- // 累计服务费
- BigDecimal serviceCharge = new BigDecimal("0");
- // 订单手续费 订单支付金额*0.6%
- BigDecimal orderCommission = new BigDecimal("0");
- // 会员抵扣
- BigDecimal vipDiscount = new BigDecimal("0");
- // 优惠券抵扣
- BigDecimal couponDiscount = new BigDecimal("0");
- // 支付订单金额 需要减去退款金额
- BigDecimal paymentAmount = new BigDecimal("0");
- for (TChargingOrder tChargingOrder : tChargingOrders) {
- if (null == tChargingOrder.getStatus() || 5 != tChargingOrder.getStatus()) {
- continue;
- }
- List<TChargingOrderAccountingStrategy> list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(tChargingOrder.getId())).collect(Collectors.toList());
- BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
- BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
- BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
- // 累加充电总度数
- chargingElectronic = chargingElectronic.add(chargingCapacity);
- // 累加分佣
- if (tChargingOrder.getOrderSource() == 2) {
- sharingAmount = sharingAmount.add(service_reduce.multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_DOWN));
- }
- // 累加电费
- electrovalence = electrovalence.add(electronic_reduce);
- if (tChargingOrder.getPaymentAmount() != null && tChargingOrder.getOrderSource() != 2) {
- paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount());
-
- }
- if (tChargingOrder.getRechargeAmount() != null) {
- orderCommission = orderCommission.add(tChargingOrder.getRechargeAmount().multiply(new BigDecimal("0.006"))
- .setScale(2, BigDecimal.ROUND_DOWN));
- }
-
- // 累加服务费
- if (tChargingOrder.getServiceCharge() != null) {
- if (tChargingOrder.getOrderSource() == 2) {
- serviceCharge = serviceCharge.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2, BigDecimal.ROUND_DOWN));
- paymentAmount = paymentAmount.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
- } else {
- serviceCharge = serviceCharge.add(service_reduce);
- }
- }
- // 累加会员折扣
- if (tChargingOrder.getVipDiscountAmount() != null) {
- vipDiscount = vipDiscount.add(tChargingOrder.getVipDiscountAmount());
- }
- // 累加优惠券折扣
- if (tChargingOrder.getCouponDiscountAmount() != null) {
- couponDiscount = couponDiscount.add(tChargingOrder.getCouponDiscountAmount());
- }
-
-
- }
-
- // 三方交易手续费 三方收费*0.6%
- commissionAmount = sharingAmount.multiply(new BigDecimal("0.006"));
- tSettlementConfirm.setSharingAmount(sharingAmount.setScale(2, RoundingMode.HALF_DOWN));
- tSettlementConfirm.setCommissionAmount(commissionAmount.setScale(2, RoundingMode.HALF_DOWN));
- tSettlementConfirm.setElectrovalence(electrovalence.setScale(2, RoundingMode.HALF_DOWN));
- tSettlementConfirm.setServiceCharge(serviceCharge.subtract(orderCommission).setScale(2, RoundingMode.HALF_DOWN));
- tSettlementConfirm.setOrderCommission(orderCommission);
- tSettlementConfirm.setVipDiscount(vipDiscount);
- tSettlementConfirm.setCouponDiscount(couponDiscount);
- tSettlementConfirm.setSiteId(dto.getSiteId());
- tSettlementConfirm.setChargingElectronic(chargingElectronic);
- tSettlementConfirm.setIncome(chargingElectronic.add(serviceCharge));
- tSettlementConfirm.setVipDiscount(vipDiscount);
- tSettlementConfirm.setCouponDiscount(couponDiscount);
- tSettlementConfirm.setType(dto.getType());
-
- if (dto.getState() == 2) {
- tSettlementConfirm.setServiceMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean())
- .subtract(dto.getMaintain()).multiply(dto.getServicePartner()));
- tSettlementConfirm.setSupplyElectronic(dto.getSupplyElectronic());
- tSettlementConfirm.setVenue(dto.getVenue());
- tSettlementConfirm.setMetering(dto.getMetering());
- tSettlementConfirm.setClean(dto.getClean());
- tSettlementConfirm.setLossElectronic(dto.getMeteringElectronic().subtract(dto.getChargingElectronic()));
- tSettlementConfirm.setMaintain(dto.getMaintain());
-
- tSettlementConfirm.setMeteringElectronic(dto.getMeteringElectronic());
- tSettlementConfirm.setProportionPartner(dto.getProportionPartner());
- tSettlementConfirm.setProportionMoney(dto.getProportionMoney());
- tSettlementConfirm.setTotalElectronic(dto.getTotalElectronic());
- tSettlementConfirm.setTotalService(dto.getTotalService());
- tSettlementConfirm.setRemark(dto.getRemark());
- tSettlementConfirm.setServicePartner(dto.getServicePartner());
- BigDecimal subtract = new BigDecimal("1").subtract(dto.getProportionPartner());
- BigDecimal subtract9 = new BigDecimal("1").subtract(dto.getServicePartner());
- // 总电损费用
- BigDecimal divide = tSettlementConfirm.getProportionMoney().divide(subtract, 2, BigDecimal.ROUND_DOWN);
- // 平台承担电损
- BigDecimal subtract1 = divide.subtract(tSettlementConfirm.getProportionMoney());
- BigDecimal multiply = dto.getServiceMoney().multiply(subtract);
- BigDecimal subtract2 = multiply.subtract(subtract1);
- tSettlementConfirm.setNewMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean())
- .subtract(dto.getMaintain()).multiply(subtract9).subtract(subtract1));
-
- tSettlementConfirm.setTotalService(dto.getTotalService());
- tSettlementConfirm.setServiceRemark(dto.getServiceRemark());
- tSettlementConfirm.setDistribution(dto.getDistribution());
- tSettlementConfirm.setIncome(dto.getElectrovalence().add(dto.getServiceCharge()));
- tSettlementConfirm.setCost(dto.getVenue().add(dto.getClean()).add(dto.getMaintain()).add(dto.getSupplyElectronic()));
- tSettlementConfirm.setProfitMoney(tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost()));
- tSettlementConfirm.setNewSettlement(tSettlementConfirm.getProfitMoney().add(tSettlementConfirm.getCost()));
- tSettlementConfirm.setServiceMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean())
- .subtract(dto.getMaintain()).multiply(dto.getServicePartner()));
- tSettlementConfirmMapper.insert(tSettlementConfirm);
- }
- return tSettlementConfirm;
- }
-
- @Override
- public PageInfo<TSettlementConfirm> settlementList(SettlementListQuery dto) {
- String startTime = null;
- String endTime = null;
- if (StringUtils.hasLength(dto.getStartTime())) {
- dto.setType(1);
- String[] split = dto.getStartTime().split(" - ");
- startTime = split[0];
- endTime = split[1];
- }
- if (StringUtils.hasLength(dto.getEndTime())) {
- dto.setType(2);
- String[] split = dto.getEndTime().split(" - ");
- startTime = split[0];
- endTime = split[1];
- }
- dto.setStartTime(startTime);
- dto.setEndTime(endTime);
- Long userId = tokenService.getLoginUser().getUserid();
- // 查询当前登陆人按钮权限
- SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
- Integer roleType = sysUser.getRoleType();
- //如果没传siteId,获取当前登陆人所有的siteIds
- List<Integer> siteIds = new ArrayList<>();
- if (dto.getSiteIds() == null) {
- if (userId != null) {
- List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
- for (GetSiteListDTO datum : data) {
- siteIds.add(datum.getId());
- }
- }
- } else {
- siteIds.add(dto.getSiteIds());
- }
- if (siteIds.isEmpty()) {
- siteIds.add(-1);
- } else {
- if (roleType == 2) {
- List<Integer> integers = new ArrayList<>();
- for (Integer siteId : siteIds) {
- // 校验有没有这个站点的权限
- List<Boolean> t1 = partnerClient.getSettlementListMenu(sysUser.getObjectId(), siteId).getData();
-
- Boolean b = t1.get(2);
- if (b) {
- integers.add(siteId);
- }
- }
- siteIds = integers;
- }
- }
- dto.setSiteIdss(siteIds);
- PageInfo<TSettlementConfirm> pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
- List<TSettlementConfirm> list = tSettlementConfirmMapper.settlementList(pageInfo, dto);
-
- for (TSettlementConfirm tSettlementConfirm : list) {
- if (roleType == 2) {
- List<Boolean> data = partnerClient.getSettlementListMenu(sysUser.getObjectId(), tSettlementConfirm.getSiteId()).getData();
- tSettlementConfirm.setAuthDownLoad(data.get(0));
- tSettlementConfirm.setAuthDelete(data.get(1));
- }
- tSettlementConfirm.setUid(tSettlementConfirm.getId().toString());
- List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData();
- if (!data1.isEmpty()) {
- tSettlementConfirm.setSiteName(data1.get(0).getName());
- Partner data = siteClient.getPartnerR(data1.get(0).getPartnerId()).getData();
- if (data != null) {
- tSettlementConfirm.setPartnerName(data.getName());
- }
- }
-
- String format = tSettlementConfirm.getStartTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss"));
- String format1 = tSettlementConfirm.getEndTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss"));
- tSettlementConfirm.setTime(format + "至" + format1);
-
-
- }
- pageInfo.setRecords(list);
- return pageInfo;
- }
-
- @Autowired
- private TChargingOrderService chargingOrderService;
-
- @Override
- public SettlementTotalVO settlementTotal(String time) {
- Long userId = tokenService.getLoginUser().getUserid();
- //如果没传siteId,获取当前登陆人所有的siteIds
- List<Integer> siteIds = new ArrayList<>();
- if (userId != null) {
- List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
- for (GetSiteListDTO datum : data) {
- siteIds.add(datum.getId());
- }
- }
- if (siteIds.isEmpty()) {
- siteIds.add(-1);
- }
- List<Site> siteList = siteClient.getSiteAll().getData();
- List<TChargingPile> pileList = chargingGunClient.getAllPile().getData();
- List<TChargingOrder> totalOrder = chargingOrderService.list(new LambdaQueryWrapper<>(TChargingOrder.class)
- .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getStatus, 5));
- SettlementTotalVO res = new SettlementTotalVO();
- List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time, siteIds);
- LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
- // 减少一个月
- LocalDateTime minus = parse.minusMonths(1);
- List<TSettlementConfirm> list2 = tSettlementConfirmMapper.settlementTotal(time, siteIds);
- // 合计
- List<TSettlementConfirm> total = new ArrayList<>();
-
- TSettlementConfirm tSettlementConfirm1 = new TSettlementConfirm();
- BigDecimal meteringElectronic = new BigDecimal("0");
- BigDecimal chargingElectronic = new BigDecimal("0");
- BigDecimal lossElectronic = new BigDecimal("0");
- BigDecimal income = new BigDecimal("0");
- BigDecimal venue = new BigDecimal("0");
- BigDecimal metering = new BigDecimal("0");
- BigDecimal clean = new BigDecimal("0");
- BigDecimal maintain = new BigDecimal("0");
- BigDecimal cost = new BigDecimal("0");
- BigDecimal profitMoney = new BigDecimal("0");
- BigDecimal newMoney = new BigDecimal("0");
- BigDecimal newSettlement = new BigDecimal("0");
- BigDecimal supplyElectronic = new BigDecimal("0");
- BigDecimal proportionPartner = new BigDecimal("0");
- BigDecimal proportionMoney = new BigDecimal("0");
- BigDecimal totalElectronic = new BigDecimal("0");
- BigDecimal totalService = new BigDecimal("0");
- BigDecimal servicePartner = new BigDecimal("0");
- BigDecimal serviceMoney = new BigDecimal("0");
- BigDecimal sharingAmount = new BigDecimal("0");
- BigDecimal commissionAmount = new BigDecimal("0");
- BigDecimal electrovalence = new BigDecimal("0");
- BigDecimal serviceCharge = new BigDecimal("0");
- BigDecimal orderCommission = new BigDecimal("0");
- BigDecimal vipDiscount = new BigDecimal("0");
- BigDecimal couponDiscount = new BigDecimal("0");
- tSettlementConfirm1.setElectronicRefund(0);
- // 上月成本合计
- BigDecimal beforeCost = new BigDecimal("0");
- // 上月利润合计
- BigDecimal beforeIncome = new BigDecimal("0");
- int i = 1;
- for (TSettlementConfirm tSettlementConfirm : list1) {
- tSettlementConfirm.setXuhao(i);
- tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
- Site site = siteList.stream().filter(e -> e.getId().equals(tSettlementConfirm.getSiteId())).findFirst().orElse(null);
- if (site != null) {
- tSettlementConfirm.setSiteName(site.getName());
- }
- if (tSettlementConfirm.getMeteringElectronic() != null) {
- meteringElectronic = meteringElectronic.add(tSettlementConfirm.getMeteringElectronic());
- chargingElectronic = chargingElectronic.add(tSettlementConfirm.getChargingElectronic());
- }
- if (tSettlementConfirm.getLossElectronic() != null) {
- lossElectronic = lossElectronic.add(tSettlementConfirm.getLossElectronic());
- }
- income = income.add(tSettlementConfirm.getIncome());
- venue = venue.add(tSettlementConfirm.getVenue());
- metering = metering.add(tSettlementConfirm.getMetering());
- clean = clean.add(tSettlementConfirm.getClean());
- maintain = maintain.add(tSettlementConfirm.getMaintain());
- cost = cost.add(tSettlementConfirm.getCost());
- profitMoney = profitMoney.add(tSettlementConfirm.getProfitMoney());
- newMoney = newMoney.add(tSettlementConfirm.getNewMoney());
- newSettlement = newSettlement.add(tSettlementConfirm.getNewSettlement());
- supplyElectronic = supplyElectronic.add(tSettlementConfirm.getSupplyElectronic());
- proportionPartner = proportionPartner.add(tSettlementConfirm.getProportionPartner());
- proportionMoney = proportionMoney.add(tSettlementConfirm.getProportionMoney());
- totalElectronic = totalElectronic.add(tSettlementConfirm.getTotalElectronic());
- totalService = totalService.add(tSettlementConfirm.getTotalService());
- servicePartner = servicePartner.add(tSettlementConfirm.getServicePartner());
- serviceMoney = serviceMoney.add(tSettlementConfirm.getServiceMoney());
- sharingAmount = sharingAmount.add(tSettlementConfirm.getSharingAmount());
- commissionAmount = commissionAmount.add(tSettlementConfirm.getCommissionAmount());
- electrovalence = electrovalence.add(tSettlementConfirm.getElectrovalence());
- serviceCharge = serviceCharge.add(tSettlementConfirm.getServiceCharge());
- orderCommission = orderCommission.add(tSettlementConfirm.getOrderCommission());
- vipDiscount = vipDiscount.add(tSettlementConfirm.getVipDiscount());
- couponDiscount = couponDiscount.add(tSettlementConfirm.getCouponDiscount());
-
- // 查询结算确认单开始时间和结束时间的单子
- QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
- .eq("site_id", tSettlementConfirm.getSiteId())
- .eq("recharge_payment_status", 2);
- switch (tSettlementConfirm.getType()) {
- case 1:
- eq.between("start_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime());
- break;
- case 2:
- eq.between("end_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime());
- break;
- }
- List<TChargingOrder> tChargingOrders = totalOrder.stream().filter(e -> e.getPayTime()
- .isBefore(tSettlementConfirm.getEndTime())
- && e.getPayTime().isAfter(tSettlementConfirm.getStartTime()) && e.getSiteId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList());
- // 充电总时长
- Long temp = 0L;
- for (TChargingOrder tChargingOrder : tChargingOrders) {
- LocalDateTime startTime = tChargingOrder.getStartTime();
- LocalDateTime endTime = tChargingOrder.getEndTime();
- // 计算时间差 单位秒
- long between = ChronoUnit.SECONDS.between(startTime, endTime);
- temp += between;
- }
- List<TChargingPile> data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData();
- // 计算充电桩的功率平均值
- BigDecimal bigDecimal = new BigDecimal("0");
- for (TChargingPile datum : data) {
- bigDecimal = bigDecimal.add(datum.getRatedPower());
- }
-
- tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge()));
- //利用率=充电量/(桩数量*功率*时间)
- List<TChargingPile> data2 = pileList.stream().filter(e -> e.getSiteId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList());
- BigDecimal bigDecimal2 = new BigDecimal("0");
-
- if (data2 != null && (!data2.isEmpty())) {
- for (TChargingPile tChargingPile : data2) {
- bigDecimal2 = bigDecimal2.add(tChargingPile.getRatedPower());
- }
- BigDecimal bigDecimal1 = new BigDecimal(data2.size() + "");
- // 平均功率
- BigDecimal divide = bigDecimal2.divide(bigDecimal1, 2, RoundingMode.HALF_DOWN);
- // 充电量
- BigDecimal chargingElectronic1 = tSettlementConfirm.getChargingElectronic();
- // 桩数量
- BigDecimal bigDecimal3 = new BigDecimal(data2.size());
- BigDecimal multiply = chargingElectronic1.multiply(new BigDecimal("24"));
- BigDecimal multiply1 = bigDecimal3.multiply(divide).multiply(new BigDecimal(temp));
- tSettlementConfirm.setRate(chargingElectronic1.divide(multiply1, 2, RoundingMode.HALF_DOWN) + "");
- } else {
- tSettlementConfirm.setRate("");
- }
-
-
- for (TSettlementConfirm settlementConfirm : list2) {
- int value = parse.getMonth().getValue();
- settlementConfirm.setMonth(value);
- settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge()));
- tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
- if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())) {
- // 电站相同比较收入涨幅跌幅
- if (tSettlementConfirm.getIncome().compareTo(BigDecimal.ZERO) > 0) {
- BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome(), 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
- tSettlementConfirm.setIncomePercentage(subtract + "%");
- } else {
- tSettlementConfirm.setIncomePercentage("100" + "%");
-
- }
-
- // 比较总利润 收入合计-成本合计
- BigDecimal subtract1 = tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost());
- BigDecimal subtract2 = settlementConfirm.getIncome().subtract(settlementConfirm.getCost());
- BigDecimal bigDecimal1 = subtract1.subtract(subtract2)
- .divide(subtract2, 2, RoundingMode.HALF_DOWN)
- .multiply(new BigDecimal("100"))
- .setScale(2, RoundingMode.HALF_DOWN);
- tSettlementConfirm.setTotalPercentage(bigDecimal1 + "%");
- }
- beforeCost = beforeCost.add(settlementConfirm.getCost());
- beforeIncome = beforeIncome.add(settlementConfirm.getIncome());
- }
- i++;
- }
- TSettlementConfirm tSettlementConfirm = new TSettlementConfirm();
- tSettlementConfirm.setMonth(parse.getMonthValue());
- tSettlementConfirm.setMeteringElectronic(meteringElectronic);
- tSettlementConfirm.setChargingElectronic(chargingElectronic);
- tSettlementConfirm.setLossElectronic(lossElectronic);
- tSettlementConfirm.setIncome(income);
- tSettlementConfirm.setVenue(venue);
- tSettlementConfirm.setMetering(metering);
- tSettlementConfirm.setClean(clean);
- tSettlementConfirm.setMaintain(maintain);
- tSettlementConfirm.setCost(cost);
- tSettlementConfirm.setProfitMoney(profitMoney);
- tSettlementConfirm.setNewMoney(newMoney);
- tSettlementConfirm.setNewSettlement(newSettlement);
- tSettlementConfirm.setSupplyElectronic(supplyElectronic);
- tSettlementConfirm.setProportionPartner(proportionPartner);
- tSettlementConfirm.setProportionMoney(proportionMoney);
- tSettlementConfirm.setTotalElectronic(totalElectronic);
- tSettlementConfirm.setTotalService(totalService);
- tSettlementConfirm.setServicePartner(servicePartner);
- tSettlementConfirm.setServiceMoney(serviceMoney);
- tSettlementConfirm.setSharingAmount(sharingAmount);
- tSettlementConfirm.setCommissionAmount(commissionAmount);
- tSettlementConfirm.setElectrovalence(electrovalence);
- tSettlementConfirm.setServiceCharge(serviceCharge);
- tSettlementConfirm.setOrderCommission(orderCommission);
- tSettlementConfirm.setVipDiscount(vipDiscount);
- tSettlementConfirm.setCouponDiscount(couponDiscount);
- // 本月
- if (beforeIncome.compareTo(new BigDecimal("0")) == 0) {
- tSettlementConfirm.setIncomePercentage(0 + "%");
- tSettlementConfirm.setIncomePercentage(0 + "%");
- } else {
- BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome, 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
- tSettlementConfirm.setIncomePercentage(subtract + "%");
- tSettlementConfirm.setIncomePercentage(subtract + "%");
- }
- // 比较总利润 收入合计-成本合计
- BigDecimal subtract1 = income.subtract(cost);
- BigDecimal subtract2 = beforeIncome.subtract(beforeCost);
- if (subtract2.compareTo(new BigDecimal("0")) == 0) {
- tSettlementConfirm.setTotalPercentage(0 + "%");
- } else {
- tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2, 2, RoundingMode.HALF_DOWN).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")) + "%");
- }
- tSettlementConfirm.setElectronicRefund(0);
- // 查询上次汇报数据 进行比对涨幅跌幅
- total.add(tSettlementConfirm);
- res.setList1(list1);
- res.setList2(total);
- return res;
- }
-
- @Override
- public SettlementTotalVO settlementTotalR(String time, Long userId) {
- //如果没传siteId,获取当前登陆人所有的siteIds
- List<Integer> siteIds = new ArrayList<>();
- if (userId != null) {
- List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
- for (GetSiteListDTO datum : data) {
- siteIds.add(datum.getId());
- }
- }
- if (siteIds.isEmpty()) {
- siteIds.add(-1);
- }
- List<Site> siteList = siteClient.getSiteAll().getData();
- List<TChargingGun> gunList = chargingGunClient.getAllGun().getData();
- List<TChargingPile> pileList = chargingGunClient.getAllPile().getData();
- List<TAppUser> userList = appUserClient.getAllUser().getData();
- List<TAppUserCar> carList = appUserCarClient.getAllCar().getData();
- List<TChargingOrder> totalOrder = chargingOrderService.list(new LambdaQueryWrapper<>(TChargingOrder.class)
- .eq(TChargingOrder::getRechargePaymentStatus, 2));
- SettlementTotalVO res = new SettlementTotalVO();
- List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time, siteIds);
- LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
- List<TSettlementConfirm> list2 = tSettlementConfirmMapper.settlementTotal(time, siteIds);
- // 合计
- List<TSettlementConfirm> total = new ArrayList<>();
-
- TSettlementConfirm tSettlementConfirm1 = new TSettlementConfirm();
- BigDecimal meteringElectronic = new BigDecimal("0");
- BigDecimal chargingElectronic = new BigDecimal("0");
- BigDecimal lossElectronic = new BigDecimal("0");
- BigDecimal income = new BigDecimal("0");
- BigDecimal venue = new BigDecimal("0");
- BigDecimal metering = new BigDecimal("0");
- BigDecimal clean = new BigDecimal("0");
- BigDecimal maintain = new BigDecimal("0");
- BigDecimal cost = new BigDecimal("0");
- BigDecimal profitMoney = new BigDecimal("0");
- BigDecimal newMoney = new BigDecimal("0");
- BigDecimal newSettlement = new BigDecimal("0");
- BigDecimal supplyElectronic = new BigDecimal("0");
- BigDecimal proportionPartner = new BigDecimal("0");
- BigDecimal proportionMoney = new BigDecimal("0");
- BigDecimal totalElectronic = new BigDecimal("0");
- BigDecimal totalService = new BigDecimal("0");
- BigDecimal servicePartner = new BigDecimal("0");
- BigDecimal serviceMoney = new BigDecimal("0");
- BigDecimal sharingAmount = new BigDecimal("0");
- BigDecimal commissionAmount = new BigDecimal("0");
- BigDecimal electrovalence = new BigDecimal("0");
- BigDecimal serviceCharge = new BigDecimal("0");
- BigDecimal orderCommission = new BigDecimal("0");
- BigDecimal vipDiscount = new BigDecimal("0");
- BigDecimal couponDiscount = new BigDecimal("0");
+ return one;
+ }
+
+ @Override
+ public TSettlementConfirm settlementAdd(SettlementConfirmAdd dto) {
+ List<Site> data = siteClient.getSiteByIds(Arrays.asList(dto.getSiteId())).getData();
+ List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list();
+
+ TSettlementConfirm tSettlementConfirm = new TSettlementConfirm();
+ if (!data.isEmpty()) {
+ tSettlementConfirm.setSiteName(data.get(0).getName());
+ tSettlementConfirm.setPartnerId(data.get(0).getPartnerId());
+ if (data.get(0).getPartnerId() != null) {
+ Partner data1 = siteClient.getPartnerR(data.get(0).getPartnerId()).getData();
+ if (data1 != null) {
+ tSettlementConfirm.setPartnerName(data1.getName());
+ tSettlementConfirm.setPartnerId(data1.getId());
+ }
+ }
+ }
+ String startTime = dto.getStartTime();
+ String endTime = dto.getEndTime();
+ // 将这两个时间转化为localDateTime
+ // 创建 DateTimeFormatter 对象,指定格式
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
+
+ // 将字符串解析为 LocalDateTime 对象
+ LocalDateTime localDateTime = LocalDateTime.parse(startTime, formatter);
+ LocalDateTime localDateTime1 = LocalDateTime.parse(endTime, formatter);
+ tSettlementConfirm.setEndTime(localDateTime1);
+ tSettlementConfirm.setStartTime(localDateTime);
+
+ // 根据站点id和开始时间和结束时间和归属日期 查询充电订单列表
+ QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
+ .eq("site_id", dto.getSiteId());
+ switch (dto.getType()) {
+ case 1:
+ eq.between("pay_time", localDateTime, localDateTime1);
+ break;
+ case 2:
+ eq.between("end_time", localDateTime, localDateTime1);
+ break;
+ }
+ List<TChargingOrder> tChargingOrders = this.baseMapper.selectList(eq);
+ // 充电电量 度
+ BigDecimal chargingElectronic = new BigDecimal("0");
+ // 三方收费 分佣
+ BigDecimal sharingAmount = new BigDecimal("0");
+ // 三方交易手续费 三方收费*0.6%
+ BigDecimal commissionAmount = new BigDecimal("0");
+ // 累计电费
+ BigDecimal electrovalence = new BigDecimal("0");
+ // 累计服务费
+ BigDecimal serviceCharge = new BigDecimal("0");
+ // 订单手续费 订单支付金额*0.6%
+ BigDecimal orderCommission = new BigDecimal("0");
+ // 会员抵扣
+ BigDecimal vipDiscount = new BigDecimal("0");
+ // 优惠券抵扣
+ BigDecimal couponDiscount = new BigDecimal("0");
+ // 支付订单金额 需要减去退款金额
+ BigDecimal paymentAmount = new BigDecimal("0");
+ for (TChargingOrder tChargingOrder : tChargingOrders) {
+ if (null == tChargingOrder.getStatus() || 5 != tChargingOrder.getStatus()) {
+ continue;
+ }
+ List<TChargingOrderAccountingStrategy> list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(tChargingOrder.getId())).collect(Collectors.toList());
+ BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+ BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+ BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+ // 累加充电总度数
+ chargingElectronic = chargingElectronic.add(chargingCapacity);
+ // 累加分佣
+ if (tChargingOrder.getOrderSource() == 2) {
+ sharingAmount = sharingAmount.add(service_reduce.multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_DOWN));
+ }
+ // 累加电费
+ electrovalence = electrovalence.add(electronic_reduce);
+ if (tChargingOrder.getPaymentAmount() != null && tChargingOrder.getOrderSource() != 2) {
+ paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount());
+
+ }
+ if (tChargingOrder.getRechargeAmount() != null) {
+ orderCommission = orderCommission.add(tChargingOrder.getRechargeAmount().multiply(new BigDecimal("0.006"))
+ .setScale(2, BigDecimal.ROUND_DOWN));
+ }
+
+ // 累加服务费
+ if (tChargingOrder.getServiceCharge() != null) {
+ if (tChargingOrder.getOrderSource() == 2) {
+ serviceCharge = serviceCharge.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2, BigDecimal.ROUND_DOWN));
+ paymentAmount = paymentAmount.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
+ } else {
+ serviceCharge = serviceCharge.add(service_reduce);
+ }
+ }
+ // 累加会员折扣
+ if (tChargingOrder.getVipDiscountAmount() != null) {
+ vipDiscount = vipDiscount.add(tChargingOrder.getVipDiscountAmount());
+ }
+ // 累加优惠券折扣
+ if (tChargingOrder.getCouponDiscountAmount() != null) {
+ couponDiscount = couponDiscount.add(tChargingOrder.getCouponDiscountAmount());
+ }
+
+
+ }
+
+ // 三方交易手续费 三方收费*0.6%
+ commissionAmount = sharingAmount.multiply(new BigDecimal("0.006"));
+ tSettlementConfirm.setSharingAmount(sharingAmount.setScale(2, RoundingMode.HALF_DOWN));
+ tSettlementConfirm.setCommissionAmount(commissionAmount.setScale(2, RoundingMode.HALF_DOWN));
+ tSettlementConfirm.setElectrovalence(electrovalence.setScale(2, RoundingMode.HALF_DOWN));
+ tSettlementConfirm.setServiceCharge(serviceCharge.subtract(orderCommission).setScale(2, RoundingMode.HALF_DOWN));
+ tSettlementConfirm.setOrderCommission(orderCommission);
+ tSettlementConfirm.setVipDiscount(vipDiscount);
+ tSettlementConfirm.setCouponDiscount(couponDiscount);
+ tSettlementConfirm.setSiteId(dto.getSiteId());
+ tSettlementConfirm.setChargingElectronic(chargingElectronic);
+ tSettlementConfirm.setIncome(chargingElectronic.add(serviceCharge));
+ tSettlementConfirm.setVipDiscount(vipDiscount);
+ tSettlementConfirm.setCouponDiscount(couponDiscount);
+ tSettlementConfirm.setType(dto.getType());
+
+ if (dto.getState() == 2) {
+ tSettlementConfirm.setServiceMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean())
+ .subtract(dto.getMaintain()).multiply(dto.getServicePartner()));
+ tSettlementConfirm.setSupplyElectronic(dto.getSupplyElectronic());
+ tSettlementConfirm.setVenue(dto.getVenue());
+ tSettlementConfirm.setMetering(dto.getMetering());
+ tSettlementConfirm.setClean(dto.getClean());
+ tSettlementConfirm.setLossElectronic(dto.getMeteringElectronic().subtract(dto.getChargingElectronic()));
+ tSettlementConfirm.setMaintain(dto.getMaintain());
+
+ tSettlementConfirm.setMeteringElectronic(dto.getMeteringElectronic());
+ tSettlementConfirm.setProportionPartner(dto.getProportionPartner());
+ tSettlementConfirm.setProportionMoney(dto.getProportionMoney());
+ tSettlementConfirm.setTotalElectronic(dto.getTotalElectronic());
+ tSettlementConfirm.setTotalService(dto.getTotalService());
+ tSettlementConfirm.setRemark(dto.getRemark());
+ tSettlementConfirm.setServicePartner(dto.getServicePartner());
+ BigDecimal subtract = new BigDecimal("1").subtract(dto.getProportionPartner());
+ BigDecimal subtract9 = new BigDecimal("1").subtract(dto.getServicePartner());
+ // 总电损费用
+ BigDecimal divide = tSettlementConfirm.getProportionMoney().divide(subtract, 2, BigDecimal.ROUND_DOWN);
+ // 平台承担电损
+ BigDecimal subtract1 = divide.subtract(tSettlementConfirm.getProportionMoney());
+ BigDecimal multiply = dto.getServiceMoney().multiply(subtract);
+ BigDecimal subtract2 = multiply.subtract(subtract1);
+ tSettlementConfirm.setNewMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean())
+ .subtract(dto.getMaintain()).multiply(subtract9).subtract(subtract1));
+
+ tSettlementConfirm.setTotalService(dto.getTotalService());
+ tSettlementConfirm.setServiceRemark(dto.getServiceRemark());
+ tSettlementConfirm.setDistribution(dto.getDistribution());
+ tSettlementConfirm.setIncome(dto.getElectrovalence().add(dto.getServiceCharge()));
+ tSettlementConfirm.setCost(dto.getVenue().add(dto.getClean()).add(dto.getMaintain()).add(dto.getSupplyElectronic()));
+ tSettlementConfirm.setProfitMoney(tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost()));
+ tSettlementConfirm.setNewSettlement(tSettlementConfirm.getProfitMoney().add(tSettlementConfirm.getCost()));
+ tSettlementConfirm.setServiceMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean())
+ .subtract(dto.getMaintain()).multiply(dto.getServicePartner()));
+ tSettlementConfirmMapper.insert(tSettlementConfirm);
+ }
+ return tSettlementConfirm;
+ }
+
+ @Override
+ public PageInfo<TSettlementConfirm> settlementList(SettlementListQuery dto) {
+ String startTime = null;
+ String endTime = null;
+ if (StringUtils.hasLength(dto.getStartTime())) {
+ dto.setType(1);
+ String[] split = dto.getStartTime().split(" - ");
+ startTime = split[0];
+ endTime = split[1];
+ }
+ if (StringUtils.hasLength(dto.getEndTime())) {
+ dto.setType(2);
+ String[] split = dto.getEndTime().split(" - ");
+ startTime = split[0];
+ endTime = split[1];
+ }
+ dto.setStartTime(startTime);
+ dto.setEndTime(endTime);
+ Long userId = tokenService.getLoginUser().getUserid();
+ // 查询当前登陆人按钮权限
+ SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
+ Integer roleType = sysUser.getRoleType();
+ //如果没传siteId,获取当前登陆人所有的siteIds
+ List<Integer> siteIds = new ArrayList<>();
+ if (dto.getSiteIds() == null) {
+ if (userId != null) {
+ List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
+ for (GetSiteListDTO datum : data) {
+ siteIds.add(datum.getId());
+ }
+ }
+ } else {
+ siteIds.add(dto.getSiteIds());
+ }
+ if (siteIds.isEmpty()) {
+ siteIds.add(-1);
+ } else {
+ if (roleType == 2) {
+ List<Integer> integers = new ArrayList<>();
+ for (Integer siteId : siteIds) {
+ // 校验有没有这个站点的权限
+ List<Boolean> t1 = partnerClient.getSettlementListMenu(sysUser.getObjectId(), siteId).getData();
+
+ Boolean b = t1.get(2);
+ if (b) {
+ integers.add(siteId);
+ }
+ }
+ siteIds = integers;
+ }
+ }
+ dto.setSiteIdss(siteIds);
+ PageInfo<TSettlementConfirm> pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
+ List<TSettlementConfirm> list = tSettlementConfirmMapper.settlementList(pageInfo, dto);
+
+ for (TSettlementConfirm tSettlementConfirm : list) {
+ if (roleType == 2) {
+ List<Boolean> data = partnerClient.getSettlementListMenu(sysUser.getObjectId(), tSettlementConfirm.getSiteId()).getData();
+ tSettlementConfirm.setAuthDownLoad(data.get(0));
+ tSettlementConfirm.setAuthDelete(data.get(1));
+ }
+ tSettlementConfirm.setUid(tSettlementConfirm.getId().toString());
+ List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData();
+ if (!data1.isEmpty()) {
+ tSettlementConfirm.setSiteName(data1.get(0).getName());
+ Partner data = siteClient.getPartnerR(data1.get(0).getPartnerId()).getData();
+ if (data != null) {
+ tSettlementConfirm.setPartnerName(data.getName());
+ }
+ }
+
+ String format = tSettlementConfirm.getStartTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss"));
+ String format1 = tSettlementConfirm.getEndTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss"));
+ tSettlementConfirm.setTime(format + "至" + format1);
+
+
+ }
+ pageInfo.setRecords(list);
+ return pageInfo;
+ }
+
+ @Autowired
+ private TChargingOrderService chargingOrderService;
+
+ @Override
+ public SettlementTotalVO settlementTotal(String time) {
+ Long userId = tokenService.getLoginUser().getUserid();
+ //如果没传siteId,获取当前登陆人所有的siteIds
+ List<Integer> siteIds = new ArrayList<>();
+ if (userId != null) {
+ List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
+ for (GetSiteListDTO datum : data) {
+ siteIds.add(datum.getId());
+ }
+ }
+ if (siteIds.isEmpty()) {
+ siteIds.add(-1);
+ }
+ List<Site> siteList = siteClient.getSiteAll().getData();
+ List<TChargingPile> pileList = chargingGunClient.getAllPile().getData();
+ List<TChargingOrder> totalOrder = chargingOrderService.list(new LambdaQueryWrapper<>(TChargingOrder.class)
+ .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getStatus, 5));
+ SettlementTotalVO res = new SettlementTotalVO();
+ List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time, siteIds);
+ LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ // 减少一个月
+ LocalDateTime minus = parse.minusMonths(1);
+ List<TSettlementConfirm> list2 = tSettlementConfirmMapper.settlementTotal(time, siteIds);
+ // 合计
+ List<TSettlementConfirm> total = new ArrayList<>();
+
+ TSettlementConfirm tSettlementConfirm1 = new TSettlementConfirm();
+ BigDecimal meteringElectronic = new BigDecimal("0");
+ BigDecimal chargingElectronic = new BigDecimal("0");
+ BigDecimal lossElectronic = new BigDecimal("0");
+ BigDecimal income = new BigDecimal("0");
+ BigDecimal venue = new BigDecimal("0");
+ BigDecimal metering = new BigDecimal("0");
+ BigDecimal clean = new BigDecimal("0");
+ BigDecimal maintain = new BigDecimal("0");
+ BigDecimal cost = new BigDecimal("0");
+ BigDecimal profitMoney = new BigDecimal("0");
+ BigDecimal newMoney = new BigDecimal("0");
+ BigDecimal newSettlement = new BigDecimal("0");
+ BigDecimal supplyElectronic = new BigDecimal("0");
+ BigDecimal proportionPartner = new BigDecimal("0");
+ BigDecimal proportionMoney = new BigDecimal("0");
+ BigDecimal totalElectronic = new BigDecimal("0");
+ BigDecimal totalService = new BigDecimal("0");
+ BigDecimal servicePartner = new BigDecimal("0");
+ BigDecimal serviceMoney = new BigDecimal("0");
+ BigDecimal sharingAmount = new BigDecimal("0");
+ BigDecimal commissionAmount = new BigDecimal("0");
+ BigDecimal electrovalence = new BigDecimal("0");
+ BigDecimal serviceCharge = new BigDecimal("0");
+ BigDecimal orderCommission = new BigDecimal("0");
+ BigDecimal vipDiscount = new BigDecimal("0");
+ BigDecimal couponDiscount = new BigDecimal("0");
+ tSettlementConfirm1.setElectronicRefund(0);
+ // 上月成本合计
+ BigDecimal beforeCost = new BigDecimal("0");
+ // 上月利润合计
+ BigDecimal beforeIncome = new BigDecimal("0");
+ int i = 1;
+ for (TSettlementConfirm tSettlementConfirm : list1) {
+ tSettlementConfirm.setXuhao(i);
+ tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
+ Site site = siteList.stream().filter(e -> e.getId().equals(tSettlementConfirm.getSiteId())).findFirst().orElse(null);
+ if (site != null) {
+ tSettlementConfirm.setSiteName(site.getName());
+ }
+ if (tSettlementConfirm.getMeteringElectronic() != null) {
+ meteringElectronic = meteringElectronic.add(tSettlementConfirm.getMeteringElectronic());
+ chargingElectronic = chargingElectronic.add(tSettlementConfirm.getChargingElectronic());
+ }
+ if (tSettlementConfirm.getLossElectronic() != null) {
+ lossElectronic = lossElectronic.add(tSettlementConfirm.getLossElectronic());
+ }
+ income = income.add(tSettlementConfirm.getIncome());
+ venue = venue.add(tSettlementConfirm.getVenue());
+ metering = metering.add(tSettlementConfirm.getMetering());
+ clean = clean.add(tSettlementConfirm.getClean());
+ maintain = maintain.add(tSettlementConfirm.getMaintain());
+ cost = cost.add(tSettlementConfirm.getCost());
+ profitMoney = profitMoney.add(tSettlementConfirm.getProfitMoney());
+ newMoney = newMoney.add(tSettlementConfirm.getNewMoney());
+ newSettlement = newSettlement.add(tSettlementConfirm.getNewSettlement());
+ supplyElectronic = supplyElectronic.add(tSettlementConfirm.getSupplyElectronic());
+ proportionPartner = proportionPartner.add(tSettlementConfirm.getProportionPartner());
+ proportionMoney = proportionMoney.add(tSettlementConfirm.getProportionMoney());
+ totalElectronic = totalElectronic.add(tSettlementConfirm.getTotalElectronic());
+ totalService = totalService.add(tSettlementConfirm.getTotalService());
+ servicePartner = servicePartner.add(tSettlementConfirm.getServicePartner());
+ serviceMoney = serviceMoney.add(tSettlementConfirm.getServiceMoney());
+ sharingAmount = sharingAmount.add(tSettlementConfirm.getSharingAmount());
+ commissionAmount = commissionAmount.add(tSettlementConfirm.getCommissionAmount());
+ electrovalence = electrovalence.add(tSettlementConfirm.getElectrovalence());
+ serviceCharge = serviceCharge.add(tSettlementConfirm.getServiceCharge());
+ orderCommission = orderCommission.add(tSettlementConfirm.getOrderCommission());
+ vipDiscount = vipDiscount.add(tSettlementConfirm.getVipDiscount());
+ couponDiscount = couponDiscount.add(tSettlementConfirm.getCouponDiscount());
+
+ // 查询结算确认单开始时间和结束时间的单子
+ QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
+ .eq("site_id", tSettlementConfirm.getSiteId())
+ .eq("recharge_payment_status", 2);
+ switch (tSettlementConfirm.getType()) {
+ case 1:
+ eq.between("start_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime());
+ break;
+ case 2:
+ eq.between("end_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime());
+ break;
+ }
+ List<TChargingOrder> tChargingOrders = totalOrder.stream().filter(e -> e.getPayTime()
+ .isBefore(tSettlementConfirm.getEndTime())
+ && e.getPayTime().isAfter(tSettlementConfirm.getStartTime()) && e.getSiteId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList());
+ // 充电总时长
+ Long temp = 0L;
+ for (TChargingOrder tChargingOrder : tChargingOrders) {
+ LocalDateTime startTime = tChargingOrder.getStartTime();
+ LocalDateTime endTime = tChargingOrder.getEndTime();
+ // 计算时间差 单位秒
+ long between = ChronoUnit.SECONDS.between(startTime, endTime);
+ temp += between;
+ }
+ List<TChargingPile> data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData();
+ // 计算充电桩的功率平均值
+ BigDecimal bigDecimal = new BigDecimal("0");
+ for (TChargingPile datum : data) {
+ bigDecimal = bigDecimal.add(datum.getRatedPower());
+ }
+
+ tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge()));
+ //利用率=充电量/(桩数量*功率*时间)
+ List<TChargingPile> data2 = pileList.stream().filter(e -> e.getSiteId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList());
+ BigDecimal bigDecimal2 = new BigDecimal("0");
+
+ if (data2 != null && (!data2.isEmpty())) {
+ for (TChargingPile tChargingPile : data2) {
+ bigDecimal2 = bigDecimal2.add(tChargingPile.getRatedPower());
+ }
+ BigDecimal bigDecimal1 = new BigDecimal(data2.size() + "");
+ // 平均功率
+ BigDecimal divide = bigDecimal2.divide(bigDecimal1, 2, RoundingMode.HALF_DOWN);
+ // 充电量
+ BigDecimal chargingElectronic1 = tSettlementConfirm.getChargingElectronic();
+ // 桩数量
+ BigDecimal bigDecimal3 = new BigDecimal(data2.size());
+ BigDecimal multiply = chargingElectronic1.multiply(new BigDecimal("24"));
+ BigDecimal multiply1 = bigDecimal3.multiply(divide).multiply(new BigDecimal(temp));
+ tSettlementConfirm.setRate(chargingElectronic1.divide(multiply1, 2, RoundingMode.HALF_DOWN) + "");
+ } else {
+ tSettlementConfirm.setRate("");
+ }
+
+
+ for (TSettlementConfirm settlementConfirm : list2) {
+ int value = parse.getMonth().getValue();
+ settlementConfirm.setMonth(value);
+ settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge()));
+ tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
+ if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())) {
+ // 电站相同比较收入涨幅跌幅
+ if (tSettlementConfirm.getIncome().compareTo(BigDecimal.ZERO) > 0) {
+ BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome(), 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
+ tSettlementConfirm.setIncomePercentage(subtract + "%");
+ } else {
+ tSettlementConfirm.setIncomePercentage("100" + "%");
+
+ }
+
+ // 比较总利润 收入合计-成本合计
+ BigDecimal subtract1 = tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost());
+ BigDecimal subtract2 = settlementConfirm.getIncome().subtract(settlementConfirm.getCost());
+ BigDecimal bigDecimal1 = subtract1.subtract(subtract2)
+ .divide(subtract2, 2, RoundingMode.HALF_DOWN)
+ .multiply(new BigDecimal("100"))
+ .setScale(2, RoundingMode.HALF_DOWN);
+ tSettlementConfirm.setTotalPercentage(bigDecimal1 + "%");
+ }
+ beforeCost = beforeCost.add(settlementConfirm.getCost());
+ beforeIncome = beforeIncome.add(settlementConfirm.getIncome());
+ }
+ i++;
+ }
+ TSettlementConfirm tSettlementConfirm = new TSettlementConfirm();
+ tSettlementConfirm.setMonth(parse.getMonthValue());
+ tSettlementConfirm.setMeteringElectronic(meteringElectronic);
+ tSettlementConfirm.setChargingElectronic(chargingElectronic);
+ tSettlementConfirm.setLossElectronic(lossElectronic);
+ tSettlementConfirm.setIncome(income);
+ tSettlementConfirm.setVenue(venue);
+ tSettlementConfirm.setMetering(metering);
+ tSettlementConfirm.setClean(clean);
+ tSettlementConfirm.setMaintain(maintain);
+ tSettlementConfirm.setCost(cost);
+ tSettlementConfirm.setProfitMoney(profitMoney);
+ tSettlementConfirm.setNewMoney(newMoney);
+ tSettlementConfirm.setNewSettlement(newSettlement);
+ tSettlementConfirm.setSupplyElectronic(supplyElectronic);
+ tSettlementConfirm.setProportionPartner(proportionPartner);
+ tSettlementConfirm.setProportionMoney(proportionMoney);
+ tSettlementConfirm.setTotalElectronic(totalElectronic);
+ tSettlementConfirm.setTotalService(totalService);
+ tSettlementConfirm.setServicePartner(servicePartner);
+ tSettlementConfirm.setServiceMoney(serviceMoney);
+ tSettlementConfirm.setSharingAmount(sharingAmount);
+ tSettlementConfirm.setCommissionAmount(commissionAmount);
+ tSettlementConfirm.setElectrovalence(electrovalence);
+ tSettlementConfirm.setServiceCharge(serviceCharge);
+ tSettlementConfirm.setOrderCommission(orderCommission);
+ tSettlementConfirm.setVipDiscount(vipDiscount);
+ tSettlementConfirm.setCouponDiscount(couponDiscount);
+ // 本月
+ if (beforeIncome.compareTo(new BigDecimal("0")) == 0) {
+ tSettlementConfirm.setIncomePercentage(0 + "%");
+ tSettlementConfirm.setIncomePercentage(0 + "%");
+ } else {
+ BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome, 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
+ tSettlementConfirm.setIncomePercentage(subtract + "%");
+ tSettlementConfirm.setIncomePercentage(subtract + "%");
+ }
+ // 比较总利润 收入合计-成本合计
+ BigDecimal subtract1 = income.subtract(cost);
+ BigDecimal subtract2 = beforeIncome.subtract(beforeCost);
+ if (subtract2.compareTo(new BigDecimal("0")) == 0) {
+ tSettlementConfirm.setTotalPercentage(0 + "%");
+ } else {
+ tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2, 2, RoundingMode.HALF_DOWN).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")) + "%");
+ }
+ tSettlementConfirm.setElectronicRefund(0);
+ // 查询上次汇报数据 进行比对涨幅跌幅
+ total.add(tSettlementConfirm);
+ res.setList1(list1);
+ res.setList2(total);
+ return res;
+ }
+
+ @Override
+ public SettlementTotalVO settlementTotalR(String time, Long userId) {
+ //如果没传siteId,获取当前登陆人所有的siteIds
+ List<Integer> siteIds = new ArrayList<>();
+ if (userId != null) {
+ List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
+ for (GetSiteListDTO datum : data) {
+ siteIds.add(datum.getId());
+ }
+ }
+ if (siteIds.isEmpty()) {
+ siteIds.add(-1);
+ }
+ List<Site> siteList = siteClient.getSiteAll().getData();
+ List<TChargingGun> gunList = chargingGunClient.getAllGun().getData();
+ List<TChargingPile> pileList = chargingGunClient.getAllPile().getData();
+ List<TAppUser> userList = appUserClient.getAllUser().getData();
+ List<TAppUserCar> carList = appUserCarClient.getAllCar().getData();
+ List<TChargingOrder> totalOrder = chargingOrderService.list(new LambdaQueryWrapper<>(TChargingOrder.class)
+ .eq(TChargingOrder::getRechargePaymentStatus, 2));
+ SettlementTotalVO res = new SettlementTotalVO();
+ List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time, siteIds);
+ LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ List<TSettlementConfirm> list2 = tSettlementConfirmMapper.settlementTotal(time, siteIds);
+ // 合计
+ List<TSettlementConfirm> total = new ArrayList<>();
+
+ TSettlementConfirm tSettlementConfirm1 = new TSettlementConfirm();
+ BigDecimal meteringElectronic = new BigDecimal("0");
+ BigDecimal chargingElectronic = new BigDecimal("0");
+ BigDecimal lossElectronic = new BigDecimal("0");
+ BigDecimal income = new BigDecimal("0");
+ BigDecimal venue = new BigDecimal("0");
+ BigDecimal metering = new BigDecimal("0");
+ BigDecimal clean = new BigDecimal("0");
+ BigDecimal maintain = new BigDecimal("0");
+ BigDecimal cost = new BigDecimal("0");
+ BigDecimal profitMoney = new BigDecimal("0");
+ BigDecimal newMoney = new BigDecimal("0");
+ BigDecimal newSettlement = new BigDecimal("0");
+ BigDecimal supplyElectronic = new BigDecimal("0");
+ BigDecimal proportionPartner = new BigDecimal("0");
+ BigDecimal proportionMoney = new BigDecimal("0");
+ BigDecimal totalElectronic = new BigDecimal("0");
+ BigDecimal totalService = new BigDecimal("0");
+ BigDecimal servicePartner = new BigDecimal("0");
+ BigDecimal serviceMoney = new BigDecimal("0");
+ BigDecimal sharingAmount = new BigDecimal("0");
+ BigDecimal commissionAmount = new BigDecimal("0");
+ BigDecimal electrovalence = new BigDecimal("0");
+ BigDecimal serviceCharge = new BigDecimal("0");
+ BigDecimal orderCommission = new BigDecimal("0");
+ BigDecimal vipDiscount = new BigDecimal("0");
+ BigDecimal couponDiscount = new BigDecimal("0");
// tSettlementConfirm1.setIncomePercentage();
// tSettlementConfirm1.setTotalPercentage();
- tSettlementConfirm1.setElectronicRefund(0);
- // 上月成本合计
- BigDecimal beforeCost = new BigDecimal("0");
- // 上月利润合计
- BigDecimal beforeIncome = new BigDecimal("0");
- int i = 1;
- for (TSettlementConfirm tSettlementConfirm : list1) {
- tSettlementConfirm.setXuhao(i);
- tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
- List<Site> data1 = siteList.stream().filter(e -> e.getId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList());
- if (!data1.isEmpty()) {
- tSettlementConfirm.setSiteName(data1.get(0).getName());
- }
- if (tSettlementConfirm.getMeteringElectronic() != null) {
- meteringElectronic = meteringElectronic.add(tSettlementConfirm.getMeteringElectronic());
- chargingElectronic = chargingElectronic.add(tSettlementConfirm.getChargingElectronic());
- }
- if (tSettlementConfirm.getLossElectronic() != null) {
- lossElectronic = lossElectronic.add(tSettlementConfirm.getLossElectronic());
- }
- income = income.add(tSettlementConfirm.getIncome());
- venue = venue.add(tSettlementConfirm.getVenue());
- metering = metering.add(tSettlementConfirm.getMetering());
- clean = clean.add(tSettlementConfirm.getClean());
- maintain = maintain.add(tSettlementConfirm.getMaintain());
- cost = cost.add(tSettlementConfirm.getCost());
- profitMoney = profitMoney.add(tSettlementConfirm.getProfitMoney());
- newMoney = newMoney.add(tSettlementConfirm.getNewMoney());
- newSettlement = newSettlement.add(tSettlementConfirm.getNewSettlement());
- supplyElectronic = supplyElectronic.add(tSettlementConfirm.getSupplyElectronic());
- proportionPartner = proportionPartner.add(tSettlementConfirm.getProportionPartner());
- proportionMoney = proportionMoney.add(tSettlementConfirm.getProportionMoney());
- totalElectronic = totalElectronic.add(tSettlementConfirm.getTotalElectronic());
- totalService = totalService.add(tSettlementConfirm.getTotalService());
- servicePartner = servicePartner.add(tSettlementConfirm.getServicePartner());
- serviceMoney = serviceMoney.add(tSettlementConfirm.getServiceMoney());
- sharingAmount = sharingAmount.add(tSettlementConfirm.getSharingAmount());
- commissionAmount = commissionAmount.add(tSettlementConfirm.getCommissionAmount());
- electrovalence = electrovalence.add(tSettlementConfirm.getElectrovalence());
- serviceCharge = serviceCharge.add(tSettlementConfirm.getServiceCharge());
- orderCommission = orderCommission.add(tSettlementConfirm.getOrderCommission());
- vipDiscount = vipDiscount.add(tSettlementConfirm.getVipDiscount());
- couponDiscount = couponDiscount.add(tSettlementConfirm.getCouponDiscount());
-
- // 查询结算确认单开始时间和结束时间的单子
- QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
- .eq("site_id", tSettlementConfirm.getSiteId())
- .eq("recharge_payment_status", 2);
- switch (tSettlementConfirm.getType()) {
- case 1:
- eq.between("start_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime());
- break;
- case 2:
- eq.between("end_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime());
- break;
- }
-
- List<TChargingOrder> tChargingOrders = totalOrder.stream().filter(e -> e.getPayTime()
- .isBefore(tSettlementConfirm.getEndTime())
- && e.getPayTime().isAfter(tSettlementConfirm.getStartTime()) && e.getSiteId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList());
- // 充电总时长
- Long temp = 0L;
- for (TChargingOrder tChargingOrder : tChargingOrders) {
- LocalDateTime startTime = tChargingOrder.getStartTime();
- LocalDateTime endTime = tChargingOrder.getEndTime();
- // 计算时间差 单位秒
- long between = ChronoUnit.SECONDS.between(startTime, endTime);
- temp += between;
- }
- List<TChargingPile> data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData();
- // 计算充电桩的功率平均值
- BigDecimal bigDecimal = new BigDecimal("0");
- for (TChargingPile datum : data) {
- bigDecimal = bigDecimal.add(datum.getRatedPower());
- }
-
-
- tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge()));
- //利用率=充电量/(桩数量*功率*时间)
- List<TChargingPile> data2 = chargingPileClient.getChargingPileBySiteId(tSettlementConfirm.getSiteId()).getData();
- BigDecimal bigDecimal2 = new BigDecimal("0");
-
- if (data2 != null && (!data2.isEmpty())) {
- for (TChargingPile tChargingPile : data2) {
- bigDecimal2 = bigDecimal2.add(tChargingPile.getRatedPower());
- }
- BigDecimal bigDecimal1 = new BigDecimal(data2.size() + "");
- // 平均功率
- BigDecimal divide = bigDecimal2.divide(bigDecimal1, 2, RoundingMode.HALF_DOWN);
- // 充电量
- BigDecimal chargingElectronic1 = tSettlementConfirm.getChargingElectronic();
- // 桩数量
- BigDecimal bigDecimal3 = new BigDecimal(data2.size());
- BigDecimal multiply = chargingElectronic1.multiply(new BigDecimal("24"));
- BigDecimal multiply1 = bigDecimal3.multiply(divide).multiply(new BigDecimal(temp));
- tSettlementConfirm.setRate(chargingElectronic1.divide(multiply1, 2, RoundingMode.HALF_DOWN) + "");
- } else {
- tSettlementConfirm.setRate("");
- }
-
-
- for (TSettlementConfirm settlementConfirm : list2) {
- int value = parse.getMonth().getValue();
- settlementConfirm.setMonth(value);
- settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge()));
- tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
- if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())) {
- // 电站相同比较收入涨幅跌幅
- if (tSettlementConfirm.getIncome().compareTo(BigDecimal.ZERO) > 0) {
- BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome(), 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
- tSettlementConfirm.setIncomePercentage(subtract + "%");
- } else {
- tSettlementConfirm.setIncomePercentage("100" + "%");
-
- }
-
- // 比较总利润 收入合计-成本合计
- BigDecimal subtract1 = tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost());
- BigDecimal subtract2 = settlementConfirm.getIncome().subtract(settlementConfirm.getCost());
- BigDecimal bigDecimal1 = subtract1.subtract(subtract2)
- .divide(subtract2, 2, RoundingMode.HALF_DOWN)
- .multiply(new BigDecimal("100"))
- .setScale(2, RoundingMode.HALF_DOWN);
- tSettlementConfirm.setTotalPercentage(bigDecimal1 + "%");
- }
- beforeCost = beforeCost.add(settlementConfirm.getCost());
- beforeIncome = beforeIncome.add(settlementConfirm.getIncome());
- }
- i++;
- }
- TSettlementConfirm tSettlementConfirm = new TSettlementConfirm();
- tSettlementConfirm.setMonth(parse.getMonthValue());
- tSettlementConfirm.setMeteringElectronic(meteringElectronic);
- tSettlementConfirm.setChargingElectronic(chargingElectronic);
- tSettlementConfirm.setLossElectronic(lossElectronic);
- tSettlementConfirm.setIncome(income);
- tSettlementConfirm.setVenue(venue);
- tSettlementConfirm.setMetering(metering);
- tSettlementConfirm.setClean(clean);
- tSettlementConfirm.setMaintain(maintain);
- tSettlementConfirm.setCost(cost);
- tSettlementConfirm.setProfitMoney(profitMoney);
- tSettlementConfirm.setNewMoney(newMoney);
- tSettlementConfirm.setNewSettlement(newSettlement);
- tSettlementConfirm.setSupplyElectronic(supplyElectronic);
- tSettlementConfirm.setProportionPartner(proportionPartner);
- tSettlementConfirm.setProportionMoney(proportionMoney);
- tSettlementConfirm.setTotalElectronic(totalElectronic);
- tSettlementConfirm.setTotalService(totalService);
- tSettlementConfirm.setServicePartner(servicePartner);
- tSettlementConfirm.setServiceMoney(serviceMoney);
- tSettlementConfirm.setSharingAmount(sharingAmount);
- tSettlementConfirm.setCommissionAmount(commissionAmount);
- tSettlementConfirm.setElectrovalence(electrovalence);
- tSettlementConfirm.setServiceCharge(serviceCharge);
- tSettlementConfirm.setOrderCommission(orderCommission);
- tSettlementConfirm.setVipDiscount(vipDiscount);
- tSettlementConfirm.setCouponDiscount(couponDiscount);
- // 本月
- if (beforeIncome.compareTo(new BigDecimal("0")) == 0) {
- tSettlementConfirm.setIncomePercentage(0 + "%");
- tSettlementConfirm.setIncomePercentage(0 + "%");
- } else {
- BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome, 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
- tSettlementConfirm.setIncomePercentage(subtract + "%");
- tSettlementConfirm.setIncomePercentage(subtract + "%");
-
- }
- // 比较总利润 收入合计-成本合计
- BigDecimal subtract1 = income.subtract(cost);
- BigDecimal subtract2 = beforeIncome.subtract(beforeCost);
- if (subtract2.compareTo(new BigDecimal("0")) == 0) {
- tSettlementConfirm.setTotalPercentage(0 + "%");
- } else {
- tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2, 2, RoundingMode.HALF_DOWN).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")) + "%");
- }
- tSettlementConfirm.setElectronicRefund(0);
- // 查询上次汇报数据 进行比对涨幅跌幅
- total.add(tSettlementConfirm);
- res.setList1(list1);
- res.setList2(total);
- return res;
- }
-
- @Override
- public List<Map<String, Object>> countBySource(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.countBySource(siteIds, statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> equipmentUserType1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.equipmentUserType1(siteIds, statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> equipmentUserType2(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.equipmentUserType2(siteIds, statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> equipmentMapbroke1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.equipmentMapbroke1(siteIds, statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> equipmentMapbroke2(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.equipmentMapbroke2(siteIds, statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> equipmentMapOut1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.equipmentMapOut1(siteIds, statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> equipmentMapOut2(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.equipmentMapOut2(siteIds, statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> needElec(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.needElec(siteIds, statisticsQueryDto);
- }
+ tSettlementConfirm1.setElectronicRefund(0);
+ // 上月成本合计
+ BigDecimal beforeCost = new BigDecimal("0");
+ // 上月利润合计
+ BigDecimal beforeIncome = new BigDecimal("0");
+ int i = 1;
+ for (TSettlementConfirm tSettlementConfirm : list1) {
+ tSettlementConfirm.setXuhao(i);
+ tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
+ List<Site> data1 = siteList.stream().filter(e -> e.getId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList());
+ if (!data1.isEmpty()) {
+ tSettlementConfirm.setSiteName(data1.get(0).getName());
+ }
+ if (tSettlementConfirm.getMeteringElectronic() != null) {
+ meteringElectronic = meteringElectronic.add(tSettlementConfirm.getMeteringElectronic());
+ chargingElectronic = chargingElectronic.add(tSettlementConfirm.getChargingElectronic());
+ }
+ if (tSettlementConfirm.getLossElectronic() != null) {
+ lossElectronic = lossElectronic.add(tSettlementConfirm.getLossElectronic());
+ }
+ income = income.add(tSettlementConfirm.getIncome());
+ venue = venue.add(tSettlementConfirm.getVenue());
+ metering = metering.add(tSettlementConfirm.getMetering());
+ clean = clean.add(tSettlementConfirm.getClean());
+ maintain = maintain.add(tSettlementConfirm.getMaintain());
+ cost = cost.add(tSettlementConfirm.getCost());
+ profitMoney = profitMoney.add(tSettlementConfirm.getProfitMoney());
+ newMoney = newMoney.add(tSettlementConfirm.getNewMoney());
+ newSettlement = newSettlement.add(tSettlementConfirm.getNewSettlement());
+ supplyElectronic = supplyElectronic.add(tSettlementConfirm.getSupplyElectronic());
+ proportionPartner = proportionPartner.add(tSettlementConfirm.getProportionPartner());
+ proportionMoney = proportionMoney.add(tSettlementConfirm.getProportionMoney());
+ totalElectronic = totalElectronic.add(tSettlementConfirm.getTotalElectronic());
+ totalService = totalService.add(tSettlementConfirm.getTotalService());
+ servicePartner = servicePartner.add(tSettlementConfirm.getServicePartner());
+ serviceMoney = serviceMoney.add(tSettlementConfirm.getServiceMoney());
+ sharingAmount = sharingAmount.add(tSettlementConfirm.getSharingAmount());
+ commissionAmount = commissionAmount.add(tSettlementConfirm.getCommissionAmount());
+ electrovalence = electrovalence.add(tSettlementConfirm.getElectrovalence());
+ serviceCharge = serviceCharge.add(tSettlementConfirm.getServiceCharge());
+ orderCommission = orderCommission.add(tSettlementConfirm.getOrderCommission());
+ vipDiscount = vipDiscount.add(tSettlementConfirm.getVipDiscount());
+ couponDiscount = couponDiscount.add(tSettlementConfirm.getCouponDiscount());
+
+ // 查询结算确认单开始时间和结束时间的单子
+ QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
+ .eq("site_id", tSettlementConfirm.getSiteId())
+ .eq("recharge_payment_status", 2);
+ switch (tSettlementConfirm.getType()) {
+ case 1:
+ eq.between("start_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime());
+ break;
+ case 2:
+ eq.between("end_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime());
+ break;
+ }
+
+ List<TChargingOrder> tChargingOrders = totalOrder.stream().filter(e -> e.getPayTime()
+ .isBefore(tSettlementConfirm.getEndTime())
+ && e.getPayTime().isAfter(tSettlementConfirm.getStartTime()) && e.getSiteId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList());
+ // 充电总时长
+ Long temp = 0L;
+ for (TChargingOrder tChargingOrder : tChargingOrders) {
+ LocalDateTime startTime = tChargingOrder.getStartTime();
+ LocalDateTime endTime = tChargingOrder.getEndTime();
+ // 计算时间差 单位秒
+ long between = ChronoUnit.SECONDS.between(startTime, endTime);
+ temp += between;
+ }
+ List<TChargingPile> data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData();
+ // 计算充电桩的功率平均值
+ BigDecimal bigDecimal = new BigDecimal("0");
+ for (TChargingPile datum : data) {
+ bigDecimal = bigDecimal.add(datum.getRatedPower());
+ }
+
+
+ tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge()));
+ //利用率=充电量/(桩数量*功率*时间)
+ List<TChargingPile> data2 = chargingPileClient.getChargingPileBySiteId(tSettlementConfirm.getSiteId()).getData();
+ BigDecimal bigDecimal2 = new BigDecimal("0");
+
+ if (data2 != null && (!data2.isEmpty())) {
+ for (TChargingPile tChargingPile : data2) {
+ bigDecimal2 = bigDecimal2.add(tChargingPile.getRatedPower());
+ }
+ BigDecimal bigDecimal1 = new BigDecimal(data2.size() + "");
+ // 平均功率
+ BigDecimal divide = bigDecimal2.divide(bigDecimal1, 2, RoundingMode.HALF_DOWN);
+ // 充电量
+ BigDecimal chargingElectronic1 = tSettlementConfirm.getChargingElectronic();
+ // 桩数量
+ BigDecimal bigDecimal3 = new BigDecimal(data2.size());
+ BigDecimal multiply = chargingElectronic1.multiply(new BigDecimal("24"));
+ BigDecimal multiply1 = bigDecimal3.multiply(divide).multiply(new BigDecimal(temp));
+ tSettlementConfirm.setRate(chargingElectronic1.divide(multiply1, 2, RoundingMode.HALF_DOWN) + "");
+ } else {
+ tSettlementConfirm.setRate("");
+ }
+
+
+ for (TSettlementConfirm settlementConfirm : list2) {
+ int value = parse.getMonth().getValue();
+ settlementConfirm.setMonth(value);
+ settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge()));
+ tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
+ if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())) {
+ // 电站相同比较收入涨幅跌幅
+ if (tSettlementConfirm.getIncome().compareTo(BigDecimal.ZERO) > 0) {
+ BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome(), 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
+ tSettlementConfirm.setIncomePercentage(subtract + "%");
+ } else {
+ tSettlementConfirm.setIncomePercentage("100" + "%");
+
+ }
+
+ // 比较总利润 收入合计-成本合计
+ BigDecimal subtract1 = tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost());
+ BigDecimal subtract2 = settlementConfirm.getIncome().subtract(settlementConfirm.getCost());
+ BigDecimal bigDecimal1 = subtract1.subtract(subtract2)
+ .divide(subtract2, 2, RoundingMode.HALF_DOWN)
+ .multiply(new BigDecimal("100"))
+ .setScale(2, RoundingMode.HALF_DOWN);
+ tSettlementConfirm.setTotalPercentage(bigDecimal1 + "%");
+ }
+ beforeCost = beforeCost.add(settlementConfirm.getCost());
+ beforeIncome = beforeIncome.add(settlementConfirm.getIncome());
+ }
+ i++;
+ }
+ TSettlementConfirm tSettlementConfirm = new TSettlementConfirm();
+ tSettlementConfirm.setMonth(parse.getMonthValue());
+ tSettlementConfirm.setMeteringElectronic(meteringElectronic);
+ tSettlementConfirm.setChargingElectronic(chargingElectronic);
+ tSettlementConfirm.setLossElectronic(lossElectronic);
+ tSettlementConfirm.setIncome(income);
+ tSettlementConfirm.setVenue(venue);
+ tSettlementConfirm.setMetering(metering);
+ tSettlementConfirm.setClean(clean);
+ tSettlementConfirm.setMaintain(maintain);
+ tSettlementConfirm.setCost(cost);
+ tSettlementConfirm.setProfitMoney(profitMoney);
+ tSettlementConfirm.setNewMoney(newMoney);
+ tSettlementConfirm.setNewSettlement(newSettlement);
+ tSettlementConfirm.setSupplyElectronic(supplyElectronic);
+ tSettlementConfirm.setProportionPartner(proportionPartner);
+ tSettlementConfirm.setProportionMoney(proportionMoney);
+ tSettlementConfirm.setTotalElectronic(totalElectronic);
+ tSettlementConfirm.setTotalService(totalService);
+ tSettlementConfirm.setServicePartner(servicePartner);
+ tSettlementConfirm.setServiceMoney(serviceMoney);
+ tSettlementConfirm.setSharingAmount(sharingAmount);
+ tSettlementConfirm.setCommissionAmount(commissionAmount);
+ tSettlementConfirm.setElectrovalence(electrovalence);
+ tSettlementConfirm.setServiceCharge(serviceCharge);
+ tSettlementConfirm.setOrderCommission(orderCommission);
+ tSettlementConfirm.setVipDiscount(vipDiscount);
+ tSettlementConfirm.setCouponDiscount(couponDiscount);
+ // 本月
+ if (beforeIncome.compareTo(new BigDecimal("0")) == 0) {
+ tSettlementConfirm.setIncomePercentage(0 + "%");
+ tSettlementConfirm.setIncomePercentage(0 + "%");
+ } else {
+ BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome, 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
+ tSettlementConfirm.setIncomePercentage(subtract + "%");
+ tSettlementConfirm.setIncomePercentage(subtract + "%");
+
+ }
+ // 比较总利润 收入合计-成本合计
+ BigDecimal subtract1 = income.subtract(cost);
+ BigDecimal subtract2 = beforeIncome.subtract(beforeCost);
+ if (subtract2.compareTo(new BigDecimal("0")) == 0) {
+ tSettlementConfirm.setTotalPercentage(0 + "%");
+ } else {
+ tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2, 2, RoundingMode.HALF_DOWN).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")) + "%");
+ }
+ tSettlementConfirm.setElectronicRefund(0);
+ // 查询上次汇报数据 进行比对涨幅跌幅
+ total.add(tSettlementConfirm);
+ res.setList1(list1);
+ res.setList2(total);
+ return res;
+ }
+
+ @Override
+ public List<Map<String, Object>> countBySource(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.countBySource(siteIds, statisticsQueryDto);
+ }
+
+ @Override
+ public List<Map<String, Object>> equipmentUserType1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.equipmentUserType1(siteIds, statisticsQueryDto);
+ }
+
+ @Override
+ public List<Map<String, Object>> equipmentUserType2(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.equipmentUserType2(siteIds, statisticsQueryDto);
+ }
+
+ @Override
+ public List<Map<String, Object>> equipmentMapbroke1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.equipmentMapbroke1(siteIds, statisticsQueryDto);
+ }
+
+ @Override
+ public List<Map<String, Object>> equipmentMapbroke2(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.equipmentMapbroke2(siteIds, statisticsQueryDto);
+ }
+
+ @Override
+ public List<Map<String, Object>> equipmentMapOut1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.equipmentMapOut1(siteIds, statisticsQueryDto);
+ }
+
+ @Override
+ public List<Map<String, Object>> equipmentMapOut2(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.equipmentMapOut2(siteIds, statisticsQueryDto);
+ }
+
+ @Override
+ public List<Map<String, Object>> needElec(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.needElec(siteIds, statisticsQueryDto);
+ }
@Override
public Map<String, Object> getChargingOrderCount(List<Integer> siteIds, String time) {
@@ -6709,9 +6706,9 @@
LocalDate nextMonth = month.plusMonths(1);
SixChargingDto income = month.equals(currentMonth)
? this.baseMapper.getLargeScreenCurrentMonthIncome(
- siteIdsCsv, month.toString(), nextMonth.toString())
+ siteIdsCsv, month.toString(), nextMonth.toString())
: this.baseMapper.getLargeScreenSettlementIncome(
- siteIdsCsv, month.toString(), nextMonth.toString());
+ siteIdsCsv, month.toString(), nextMonth.toString());
if (income == null) {
income = new SixChargingDto();
}
@@ -6768,214 +6765,214 @@
}
@Override
- public List<Map<String, Object>> getHourType(List<Integer> siteIds, ChargingDetailQueryDto statisticsQueryDto) {
- return this.baseMapper.getHourType(siteIds, statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> getDateType(List<Integer> siteIds, ChargingDetailQueryDto statisticsQueryDto) {
- return this.baseMapper.getDateType(siteIds, statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> getMonthType(List<Integer> siteIds, ChargingDetailQueryDto statisticsQueryDto) {
- return this.baseMapper.getMonthType(siteIds, statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> getchargingCapacity(List<Integer> siteIds, ChargingDetailQueryDto statisticsQueryDto) {
- return this.baseMapper.getchargingCapacity(siteIds, statisticsQueryDto);
- }
-
- @Override
- public List<Map<String, Object>> countAllUserData() {
- return this.baseMapper.countAllUserData();
- }
-
- @Override
- public List<Map<String, Object>> needElec1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
- return this.baseMapper.needElec1(siteIds, statisticsQueryDto);
- }
-
- /**
- * 获取充电结束页面详情
- *
- * @param id
- * @return
- */
- @Override
- public EndOfChargePageInfo getEndOfChargePageInfo(String id) {
- EndOfChargePageInfo info = new EndOfChargePageInfo();
- TChargingOrder chargingOrder = this.getById(id);
- Long userId = tokenService.getLoginUserApplet().getUserId();
- if (!chargingOrder.getAppUserId().equals(userId)) {
- throw new RuntimeException("权限不足");
- }
- info.setId(id);
- info.setCode(chargingOrder.getCode());
- info.setPaymentAmount(chargingOrder.getPaymentAmount());
- info.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount());
- TAppUserIntegralChange integralChange = appUserIntegralChangeClient.getTAppUserIntegralChangeByOrderCode(chargingOrder.getCode()).getData();
- info.setIntegral(null == integralChange ? 0 : integralChange.getCurrentIntegral() - integralChange.getHistoricalIntegral());
- info.setRechargeAmount(chargingOrder.getRechargeAmount());
- info.setRefundAmount(chargingOrder.getRefundAmount());
- LocalDateTime startTime = chargingOrder.getStartTime();
- LocalDateTime endTime = chargingOrder.getEndTime();
- info.setStartDay(startTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " " + startTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE));
- info.setStartHour(startTime.format(DateTimeFormatter.ofPattern("HH:mm")));
- info.setEndDay(endTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " " + endTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE));
- info.setEndHour(endTime.format(DateTimeFormatter.ofPattern("HH:mm")));
- long time = (endTime.toEpochSecond(ZoneOffset.UTC) - startTime.toEpochSecond(ZoneOffset.UTC)) / 60;
- long hour = time / 60;
- long second = time % 60;
- info.setDuration(0 == hour ? String.format("%s分钟", second) : String.format("%s小时%s分钟", hour, second));
- return info;
- }
-
- @Override
- public Long countNoTag() {
- return this.baseMapper.countNoTag();
- }
-
-
- @Override
- public List<TChargingOrder> getChargingOrder(TChargingOrderVo order) {
- LambdaQueryWrapper<TChargingOrder> queryWrapper = new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getDelFlag, 0);
- if (null != order.getChargingPileId()) {
- queryWrapper.eq(TChargingOrder::getChargingPileId, order.getChargingPileId());
- }
- if (null != order.getChargingGunId()) {
- queryWrapper.eq(TChargingOrder::getChargingGunId, order.getChargingGunId());
- }
- if (null != order.getStatus()) {
- queryWrapper.eq(TChargingOrder::getStatus, order.getStatus());
- }
- if (null != order.getAppUserId()) {
- queryWrapper.eq(TChargingOrder::getAppUserId, order.getAppUserId());
- }
- if (null != order.getStatusList()) {
- queryWrapper.in(TChargingOrder::getStatus, order.getStatusList());
- }
- if (null != order.getEndMode()) {
- queryWrapper.eq(TChargingOrder::getEndMode, order.getEndMode());
- }
- return this.list(queryWrapper.orderByDesc(TChargingOrder::getCreateTime));
- }
+ public List<Map<String, Object>> getHourType(List<Integer> siteIds, ChargingDetailQueryDto statisticsQueryDto) {
+ return this.baseMapper.getHourType(siteIds, statisticsQueryDto);
+ }
- @Override
- public List<Long> getAppUserIdsBySiteIds(List<Integer> siteIds) {
- if (siteIds == null || siteIds.isEmpty()) {
- return Collections.emptyList();
- }
- return this.baseMapper.getAppUserIdsBySiteIds(siteIds);
- }
-
- @Override
- public Long countCar(List<String> brands) {
- return this.baseMapper.countCar(brands);
- }
-
-
- /**
- * 添加三方平台充电订单数据
- *
- * @param query
- */
- @Override
- public R addTripartitePlatformOrder(AddTripartitePlatformOrder query) {
- //检查当前枪是否是正在使用中
- TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, query.getChargingGunId())
- .in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getDelFlag, 0));
- if (null != one) {
- return R.fail("充电枪正在充电中,启动失败");
- }
-
- //构建订单数据
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
- TChargingOrder chargingOrder = new TChargingOrder();
- String code = "CD" + Double.valueOf(Math.random() * 1000).intValue() + sdf.format(new Date());
- chargingOrder.setCode(code);
- chargingOrder.setOrderType(1);
- chargingOrder.setOrderClassification(1);
- TChargingGun tChargingGun = chargingGunClient.getChargingGunById(query.getChargingGunId()).getData();
- TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData();
- chargingOrder.setSiteId(tChargingGun.getSiteId());
- chargingOrder.setChargingPileId(tChargingGun.getChargingPileId());
- chargingOrder.setChargingGunId(query.getChargingGunId());
- chargingOrder.setRechargePaymentType(query.getRechargePaymentType());
- chargingOrder.setRechargePaymentStatus(2);
- chargingOrder.setRechargeAmount(query.getPaymentAmount());
- chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
- chargingOrder.setOrderSource(2);
- Operator operator = operatorClient.getOperator(query.getOperatorId()).getData();
- chargingOrder.setOperatorId(operator.getId());
- chargingOrder.setAppUserId(operator.getId().longValue());
- chargingOrder.setTripartitePlatformName(operator.getName());
- chargingOrder.setStartChargeSeq(query.getStartChargeSeq());
- //车辆信息
- if (StringUtils.hasLength(query.getPlateNum())) {
- TAppUserCar appUserCar = appUserCarClient.getAppUserCarByLicensePlate(query.getPlateNum()).getData();
- if (null != appUserCar) {
- chargingOrder.setAppUserCarId(appUserCar.getId());
- }
- chargingOrder.setPlateNum(query.getPlateNum());
- }
-
-
- chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪");
- chargingOrder.setStatus(2);
- chargingOrder.setPayTime(LocalDateTime.now());
- chargingOrder.setChargeAmount(chargingOrder.getRechargeAmount());
- this.save(chargingOrder);
-
- Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
- if (null == accountingStrategyId) {
- Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0);
- //查询站点上面的计费策略
- accountingStrategyId = site.getAccountingStrategyId();
- }
- TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData();
-
- //添加订单的计费策略
- List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData();
- AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder();
- BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder);
- accountingStrategyOrder.setChargingOrderId(chargingOrder.getId());
- accountingStrategyOrderService.save(accountingStrategyOrder);
- List<AccountingStrategyDetailOrder> list1 = new ArrayList<>();
- for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) {
- AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
- BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder);
- accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId());
- accountingStrategyDetailOrder.setCreateTime(LocalDateTime.now());
- accountingStrategyDetailOrder.setDelFlag(false);
- list1.add(accountingStrategyDetailOrder);
- }
- accountingStrategyDetailOrderService.saveBatch(list1);
-
-
- //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据
- PreChargeCheck preChargeCheck = new PreChargeCheck();
- preChargeCheck.setElectronicLockLock(false);
- preChargeCheck.setInsulationTesting(false);
- preChargeCheck.setSecureConnectionDetection(false);
- preChargeCheck.setStartupSuccess(1);
- preChargeCheck.setStartCommandSent(false);
+ @Override
+ public List<Map<String, Object>> getDateType(List<Integer> siteIds, ChargingDetailQueryDto statisticsQueryDto) {
+ return this.baseMapper.getDateType(siteIds, statisticsQueryDto);
+ }
+
+ @Override
+ public List<Map<String, Object>> getMonthType(List<Integer> siteIds, ChargingDetailQueryDto statisticsQueryDto) {
+ return this.baseMapper.getMonthType(siteIds, statisticsQueryDto);
+ }
+
+ @Override
+ public List<Map<String, Object>> getchargingCapacity(List<Integer> siteIds, ChargingDetailQueryDto statisticsQueryDto) {
+ return this.baseMapper.getchargingCapacity(siteIds, statisticsQueryDto);
+ }
+
+ @Override
+ public List<Map<String, Object>> countAllUserData() {
+ return this.baseMapper.countAllUserData();
+ }
+
+ @Override
+ public List<Map<String, Object>> needElec1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
+ return this.baseMapper.needElec1(siteIds, statisticsQueryDto);
+ }
+
+ /**
+ * 获取充电结束页面详情
+ *
+ * @param id
+ * @return
+ */
+ @Override
+ public EndOfChargePageInfo getEndOfChargePageInfo(String id) {
+ EndOfChargePageInfo info = new EndOfChargePageInfo();
+ TChargingOrder chargingOrder = this.getById(id);
+ Long userId = tokenService.getLoginUserApplet().getUserId();
+ if (!chargingOrder.getAppUserId().equals(userId)) {
+ throw new RuntimeException("权限不足");
+ }
+ info.setId(id);
+ info.setCode(chargingOrder.getCode());
+ info.setPaymentAmount(chargingOrder.getPaymentAmount());
+ info.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount());
+ TAppUserIntegralChange integralChange = appUserIntegralChangeClient.getTAppUserIntegralChangeByOrderCode(chargingOrder.getCode()).getData();
+ info.setIntegral(null == integralChange ? 0 : integralChange.getCurrentIntegral() - integralChange.getHistoricalIntegral());
+ info.setRechargeAmount(chargingOrder.getRechargeAmount());
+ info.setRefundAmount(chargingOrder.getRefundAmount());
+ LocalDateTime startTime = chargingOrder.getStartTime();
+ LocalDateTime endTime = chargingOrder.getEndTime();
+ info.setStartDay(startTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " " + startTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE));
+ info.setStartHour(startTime.format(DateTimeFormatter.ofPattern("HH:mm")));
+ info.setEndDay(endTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " " + endTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE));
+ info.setEndHour(endTime.format(DateTimeFormatter.ofPattern("HH:mm")));
+ long time = (endTime.toEpochSecond(ZoneOffset.UTC) - startTime.toEpochSecond(ZoneOffset.UTC)) / 60;
+ long hour = time / 60;
+ long second = time % 60;
+ info.setDuration(0 == hour ? String.format("%s分钟", second) : String.format("%s小时%s分钟", hour, second));
+ return info;
+ }
+
+ @Override
+ public Long countNoTag() {
+ return this.baseMapper.countNoTag();
+ }
+
+
+ @Override
+ public List<TChargingOrder> getChargingOrder(TChargingOrderVo order) {
+ LambdaQueryWrapper<TChargingOrder> queryWrapper = new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getDelFlag, 0);
+ if (null != order.getChargingPileId()) {
+ queryWrapper.eq(TChargingOrder::getChargingPileId, order.getChargingPileId());
+ }
+ if (null != order.getChargingGunId()) {
+ queryWrapper.eq(TChargingOrder::getChargingGunId, order.getChargingGunId());
+ }
+ if (null != order.getStatus()) {
+ queryWrapper.eq(TChargingOrder::getStatus, order.getStatus());
+ }
+ if (null != order.getAppUserId()) {
+ queryWrapper.eq(TChargingOrder::getAppUserId, order.getAppUserId());
+ }
+ if (null != order.getStatusList()) {
+ queryWrapper.in(TChargingOrder::getStatus, order.getStatusList());
+ }
+ if (null != order.getEndMode()) {
+ queryWrapper.eq(TChargingOrder::getEndMode, order.getEndMode());
+ }
+ return this.list(queryWrapper.orderByDesc(TChargingOrder::getCreateTime));
+ }
+
+ @Override
+ public List<Long> getAppUserIdsBySiteIds(List<Integer> siteIds) {
+ if (siteIds == null || siteIds.isEmpty()) {
+ return Collections.emptyList();
+ }
+ return this.baseMapper.getAppUserIdsBySiteIds(siteIds);
+ }
+
+ @Override
+ public Long countCar(List<String> brands) {
+ return this.baseMapper.countCar(brands);
+ }
+
+
+ /**
+ * 添加三方平台充电订单数据
+ *
+ * @param query
+ */
+ @Override
+ public R addTripartitePlatformOrder(AddTripartitePlatformOrder query) {
+ //检查当前枪是否是正在使用中
+ TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, query.getChargingGunId())
+ .in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getDelFlag, 0));
+ if (null != one) {
+ return R.fail("充电枪正在充电中,启动失败");
+ }
+
+ //构建订单数据
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+ TChargingOrder chargingOrder = new TChargingOrder();
+ String code = "CD" + Double.valueOf(Math.random() * 1000).intValue() + sdf.format(new Date());
+ chargingOrder.setCode(code);
+ chargingOrder.setOrderType(1);
+ chargingOrder.setOrderClassification(1);
+ TChargingGun tChargingGun = chargingGunClient.getChargingGunById(query.getChargingGunId()).getData();
+ TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData();
+ chargingOrder.setSiteId(tChargingGun.getSiteId());
+ chargingOrder.setChargingPileId(tChargingGun.getChargingPileId());
+ chargingOrder.setChargingGunId(query.getChargingGunId());
+ chargingOrder.setRechargePaymentType(query.getRechargePaymentType());
+ chargingOrder.setRechargePaymentStatus(2);
+ chargingOrder.setRechargeAmount(query.getPaymentAmount());
+ chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
+ chargingOrder.setOrderSource(2);
+ Operator operator = operatorClient.getOperator(query.getOperatorId()).getData();
+ chargingOrder.setOperatorId(operator.getId());
+ chargingOrder.setAppUserId(operator.getId().longValue());
+ chargingOrder.setTripartitePlatformName(operator.getName());
+ chargingOrder.setStartChargeSeq(query.getStartChargeSeq());
+ //车辆信息
+ if (StringUtils.hasLength(query.getPlateNum())) {
+ TAppUserCar appUserCar = appUserCarClient.getAppUserCarByLicensePlate(query.getPlateNum()).getData();
+ if (null != appUserCar) {
+ chargingOrder.setAppUserCarId(appUserCar.getId());
+ }
+ chargingOrder.setPlateNum(query.getPlateNum());
+ }
+
+
+ chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪");
+ chargingOrder.setStatus(2);
+ chargingOrder.setPayTime(LocalDateTime.now());
+ chargingOrder.setChargeAmount(chargingOrder.getRechargeAmount());
+ this.save(chargingOrder);
+
+ Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
+ if (null == accountingStrategyId) {
+ Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0);
+ //查询站点上面的计费策略
+ accountingStrategyId = site.getAccountingStrategyId();
+ }
+ TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData();
+
+ //添加订单的计费策略
+ List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData();
+ AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder();
+ BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder);
+ accountingStrategyOrder.setChargingOrderId(chargingOrder.getId());
+ accountingStrategyOrderService.save(accountingStrategyOrder);
+ List<AccountingStrategyDetailOrder> list1 = new ArrayList<>();
+ for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) {
+ AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
+ BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder);
+ accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId());
+ accountingStrategyDetailOrder.setCreateTime(LocalDateTime.now());
+ accountingStrategyDetailOrder.setDelFlag(false);
+ list1.add(accountingStrategyDetailOrder);
+ }
+ accountingStrategyDetailOrderService.saveBatch(list1);
+
+
+ //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据
+ PreChargeCheck preChargeCheck = new PreChargeCheck();
+ preChargeCheck.setElectronicLockLock(false);
+ preChargeCheck.setInsulationTesting(false);
+ preChargeCheck.setSecureConnectionDetection(false);
+ preChargeCheck.setStartupSuccess(1);
+ preChargeCheck.setStartCommandSent(false);
preChargeCheck.setAddTime(chargingOrder.getReservationTime() != null ? chargingOrder.getReservationTime() : LocalDateTime.now());
- String key = "AQJC_" + chargingOrder.getChargingGunId();
- redisService.setCacheObject(key, preChargeCheck, 24L, TimeUnit.HOURS);
-
- BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
- //调用远程启动充电消息
- PlatformStartCharging platformStartCharging = new PlatformStartCharging();
- platformStartCharging.setTransaction_serial_number(chargingOrder.getCode());
- platformStartCharging.setCharging_pile_code(chargingPile.getCode());
- platformStartCharging.setCharging_gun_code(tChargingGun.getCode());
- //使用订单id作为逻辑卡号
- platformStartCharging.setCard_number(chargingOrder.getId().toString());
- platformStartCharging.setAccount_balance(rechargeAmount);
- log.info(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString());
- sendMessageClient.platformStartCharging(platformStartCharging);
+ String key = "AQJC_" + chargingOrder.getChargingGunId();
+ redisService.setCacheObject(key, preChargeCheck, 24L, TimeUnit.HOURS);
+
+ BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
+ //调用远程启动充电消息
+ PlatformStartCharging platformStartCharging = new PlatformStartCharging();
+ platformStartCharging.setTransaction_serial_number(chargingOrder.getCode());
+ platformStartCharging.setCharging_pile_code(chargingPile.getCode());
+ platformStartCharging.setCharging_gun_code(tChargingGun.getCode());
+ //使用订单id作为逻辑卡号
+ platformStartCharging.setCard_number(chargingOrder.getId().toString());
+ platformStartCharging.setAccount_balance(rechargeAmount);
+ log.info(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString());
+ sendMessageClient.platformStartCharging(platformStartCharging);
// //异步线程检测远程启动的应答结果。如果失败,则需要全额退款
// Long id = chargingOrder.getId();
// //执行5分钟的定时任务检测
@@ -6985,304 +6982,309 @@
// scheduler.shutdown();
// }
// }, 5, 1, TimeUnit.SECONDS);
- Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0);
- if(1 == site.getIsOpenSynchronization()){
- //推送三方平台订单状态
- tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
- }
- ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
- threadPoolExecutor.execute(()->{
- //推送成都监管
- NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
- statusVo.setOrderCode(chargingOrder.getCode());
- statusVo.setChargingGunId(chargingOrder.getChargingGunId());
- chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
- });
- return R.ok();
- }
-
-
- /**
- * 三方平台停止充电操作
- *
- * @param startChargeSeq
- * @return
- */
- @Override
- public R tripartitePlatformStopCharge(String startChargeSeq) {
- log.info("三方平台请求停止充电:" + startChargeSeq);
- TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getStartChargeSeq, startChargeSeq));
- Integer status = order.getStatus();
- String code1 = order.getCode();
- if (status != 3) {
- log.info("【" + code1 + "】三方平台请求停止充电失败:还未开始充电");
- return R.fail("还未开始充电");
- }
- if (status == 4 || status == 5) {
- log.info("【" + code1 + "】三方平台请求停止充电:不能重复操作");
- return R.fail("不能重复操作");
- }
- TChargingOrder chargingOrder = new TChargingOrder();
- chargingOrder.setId(order.getId());
- chargingOrder.setAppUserId(order.getOperatorId().longValue());
- chargingOrder.setEndTime(LocalDateTime.now());
- chargingOrder.setStatus(4);
- chargingOrder.setEndMode(1);
- this.updateById(chargingOrder);
- Site site = siteClient.getSiteByIds(Arrays.asList(order.getSiteId())).getData().get(0);
- if(1 == site.getIsOpenSynchronization()){
- tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
- }
- TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
- //异步线程处理停机
- ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1);
- cachedThreadPool.execute(() -> {
- //调用硬件停止充电,停止成功后开始计算费用退款
- TChargingPile chargingPile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData();
- PlatformStopCharging platformStopCharging = new PlatformStopCharging();
- platformStopCharging.setCharging_pile_code(chargingPile.getCode());
- platformStopCharging.setCharging_gun_code(chargingGun.getCode());
- log.info("【" + code1 + "】三方平台请求停止充电发起消息:" + JSON.toJSONString(platformStopCharging));
- sendMessageClient.platformStopCharging(platformStopCharging);
- log.info("【" + code1 + "】三方平台请求停止充电发起消息结束");
- log.info(platformStopCharging.toString());
- });
- ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
- threadPoolExecutor.execute(()->{
- //推送成都监管
- NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
- statusVo.setOrderCode(chargingOrder.getCode());
- statusVo.setChargingGunId(chargingOrder.getChargingGunId());
- chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
- });
- return R.ok();
- }
-
-
- /**
- * 获取充电后没有扣除费用的数据
- *
- * @return
- */
- @Override
- public R getNotPaymentChargingOrder() {
- List<TChargingOrder> list = this.list(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getPaymentAmount, 0)
- .ne(TChargingOrder::getElectricity, 0).in(TChargingOrder::getStatus, Arrays.asList(4, 5)));
- List<Map<String, Object>> mapList = new ArrayList<>();
- for (TChargingOrder order : list) {
- TransactionRecord transactionRecord = transactionRecordService.findOne(order.getCode());
- Map<String, Object> map = new HashMap<>();
- map.put("order", order);
- map.put("transactionRecord", transactionRecord);
- mapList.add(map);
- }
- return R.ok(mapList);
- }
-
-
- /**
- * 手动推送订单给第三方平台
- *
- * @param code
- * @return
- */
- @Override
- public R pushOrderInfo(String code) {
- TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
+ Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0);
+ if (1 == site.getIsOpenSynchronization()) {
+ //推送三方平台订单状态
+ tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
+ }
+ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+ threadPoolExecutor.execute(() -> {
+ //推送成都监管
+ NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
+ statusVo.setOrderCode(chargingOrder.getCode());
+ statusVo.setChargingGunId(chargingOrder.getChargingGunId());
+ chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
+ });
+ return R.ok();
+ }
+
+
+ /**
+ * 三方平台停止充电操作
+ *
+ * @param startChargeSeq
+ * @return
+ */
+ @Override
+ public R tripartitePlatformStopCharge(String startChargeSeq) {
+ log.info("三方平台请求停止充电:" + startChargeSeq);
+ TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getStartChargeSeq, startChargeSeq));
+ Integer status = order.getStatus();
+ String code1 = order.getCode();
+ if (status != 3) {
+ log.info("【" + code1 + "】三方平台请求停止充电失败:还未开始充电");
+ return R.fail("还未开始充电");
+ }
+ if (status == 4 || status == 5) {
+ log.info("【" + code1 + "】三方平台请求停止充电:不能重复操作");
+ return R.fail("不能重复操作");
+ }
+ TChargingOrder chargingOrder = new TChargingOrder();
+ chargingOrder.setId(order.getId());
+ chargingOrder.setAppUserId(order.getOperatorId().longValue());
+ chargingOrder.setEndTime(LocalDateTime.now());
+ chargingOrder.setStatus(4);
+ chargingOrder.setEndMode(1);
+ this.updateById(chargingOrder);
+ Site site = siteClient.getSiteByIds(Arrays.asList(order.getSiteId())).getData().get(0);
+ if (1 == site.getIsOpenSynchronization()) {
+ tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
+ }
+ TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
+ //异步线程处理停机
+ ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1);
+ cachedThreadPool.execute(() -> {
+ //调用硬件停止充电,停止成功后开始计算费用退款
+ TChargingPile chargingPile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData();
+ PlatformStopCharging platformStopCharging = new PlatformStopCharging();
+ platformStopCharging.setCharging_pile_code(chargingPile.getCode());
+ platformStopCharging.setCharging_gun_code(chargingGun.getCode());
+ log.info("【" + code1 + "】三方平台请求停止充电发起消息:" + JSON.toJSONString(platformStopCharging));
+ sendMessageClient.platformStopCharging(platformStopCharging);
+ log.info("【" + code1 + "】三方平台请求停止充电发起消息结束");
+ log.info(platformStopCharging.toString());
+ });
+ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+ threadPoolExecutor.execute(() -> {
+ //推送成都监管
+ NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
+ statusVo.setOrderCode(chargingOrder.getCode());
+ statusVo.setChargingGunId(chargingOrder.getChargingGunId());
+ chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
+ });
+ return R.ok();
+ }
+
+
+ /**
+ * 获取充电后没有扣除费用的数据
+ *
+ * @return
+ */
+ @Override
+ public R getNotPaymentChargingOrder() {
+ List<TChargingOrder> list = this.list(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getPaymentAmount, 0)
+ .ne(TChargingOrder::getElectricity, 0).in(TChargingOrder::getStatus, Arrays.asList(4, 5)));
+ List<Map<String, Object>> mapList = new ArrayList<>();
+ for (TChargingOrder order : list) {
+ TransactionRecord transactionRecord = transactionRecordService.findOne(order.getCode());
+ Map<String, Object> map = new HashMap<>();
+ map.put("order", order);
+ map.put("transactionRecord", transactionRecord);
+ mapList.add(map);
+ }
+ return R.ok(mapList);
+ }
+
+
+ /**
+ * 手动推送订单给第三方平台
+ *
+ * @param code
+ * @return
+ */
+ @Override
+ public R pushOrderInfo(String code) {
+ TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
// tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
// tcecClient.notificationStopChargeResult(chargingOrder.getStartChargeSeq(), chargingOrder.getChargingGunId().toString(),
// chargingOrder.getOperatorId());
- return tcecClient.notificationChargeOrderInfo(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
- }
-
-
- public R addChargingOrderSummaryData() {
- List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list();
- List<TChargingOrder> list1 = this.list(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getDelFlag, 0));
- for (TChargingOrder chargingOrderVO : list1) {
- if (null == chargingOrderVO.getStatus() || 5 != chargingOrderVO.getStatus()) {
- continue;
- }
- List<TChargingOrderAccountingStrategy> list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderVO.getId())).collect(Collectors.toList());
- BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
- BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
- BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
- BigDecimal serviceMoney = new BigDecimal("0");
- BigDecimal paymentMoney = new BigDecimal("0");
- if (!chargingOrderVO.getOrderSource().equals(2)) {
- serviceMoney = serviceMoney.add(service_reduce);
- paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce);
- } else {
- serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8")));
- paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
- }
- Long time = 0L;
- if (chargingOrderVO.getStartTime() != null && chargingOrderVO.getEndTime() != null) {
- LocalDateTime startTime = chargingOrderVO.getStartTime();
- LocalDateTime endTime = chargingOrderVO.getEndTime();
- // 计算时间差 单位秒
- long between = ChronoUnit.SECONDS.between(startTime, endTime);
- time += between;
- }
+ return tcecClient.notificationChargeOrderInfo(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
+ }
- TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData();
- summaryData.setChargingOrderId(chargingOrderVO.getId());
- summaryData.setChargingCapacity(chargingCapacity.setScale(6, RoundingMode.HALF_EVEN));
- summaryData.setChargingDuration(time);
- summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
- summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN));
- summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
- chargingOrderSummaryDataService.save(summaryData);
- }
- return R.ok();
- }
-
- /**
- * 大屏-新能源汽车电池安全检测次数统计
- */
- @Override
- public R<StatisticsOfBatteryVO> getStatisticsOfBattery(List<Integer> siteIds) {
- StatisticsOfBatteryVO vo = new StatisticsOfBatteryVO();
- List<Integer> effectiveSiteIds = siteIds == null ? Arrays.asList(25, 26) : siteIds;
- if (effectiveSiteIds.isEmpty()) {
- vo.setTotal(0);
- vo.setDates(Collections.emptyList());
- vo.setCounts(Collections.emptyList());
- return R.ok(vo);
- }
- // 快充和超充订单作为电池安全检测次数。
- R<List<Integer>> r = chargingGunClient.getGunIdsBySiteIdsAndChargeModels(effectiveSiteIds, Arrays.asList(1, 2));
- if (r.getCode() != 200) {
- return R.ok(vo);
- }
- List<Integer> gunIds = r.getData();
- //统计
- Long total = 0L;
- if (gunIds != null && !gunIds.isEmpty()) {
- total = this.baseMapper.selectCount(new LambdaQueryWrapper<TChargingOrder>()
- .eq(TChargingOrder::getDelFlag, 0)//未删除
- .in(TChargingOrder::getStatus, Arrays.asList(3, 5))//充电中、已结束
- .in(TChargingOrder::getChargingGunId, gunIds));//符合条件的充电枪
- }
- vo.setTotal(total.intValue());
- //2.折线图
+
+ public R addChargingOrderSummaryData() {
+ List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list();
+ List<TChargingOrder> list1 = this.list(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getDelFlag, 0));
+ for (TChargingOrder chargingOrderVO : list1) {
+ if (null == chargingOrderVO.getStatus() || 5 != chargingOrderVO.getStatus()) {
+ continue;
+ }
+ List<TChargingOrderAccountingStrategy> list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderVO.getId())).collect(Collectors.toList());
+ BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+ BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+ BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+ BigDecimal serviceMoney = new BigDecimal("0");
+ BigDecimal paymentMoney = new BigDecimal("0");
+ if (!chargingOrderVO.getOrderSource().equals(2)) {
+ serviceMoney = serviceMoney.add(service_reduce);
+ paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce);
+ } else {
+ serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8")));
+ paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
+ }
+ Long time = 0L;
+ if (chargingOrderVO.getStartTime() != null && chargingOrderVO.getEndTime() != null) {
+ LocalDateTime startTime = chargingOrderVO.getStartTime();
+ LocalDateTime endTime = chargingOrderVO.getEndTime();
+ // 计算时间差 单位秒
+ long between = ChronoUnit.SECONDS.between(startTime, endTime);
+ time += between;
+ }
+
+ TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData();
+ summaryData.setChargingOrderId(chargingOrderVO.getId());
+ summaryData.setChargingCapacity(chargingCapacity.setScale(6, RoundingMode.HALF_EVEN));
+ summaryData.setChargingDuration(time);
+ summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
+ summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN));
+ summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
+ chargingOrderSummaryDataService.save(summaryData);
+ }
+ return R.ok();
+ }
+
+ /**
+ * 大屏-新能源汽车电池安全检测次数统计
+ */
+ @Override
+ public R<StatisticsOfBatteryVO> getStatisticsOfBattery(List<Integer> siteIds) {
+ StatisticsOfBatteryVO vo = new StatisticsOfBatteryVO();
+ List<Integer> effectiveSiteIds = siteIds == null ? Arrays.asList(25, 26) : siteIds;
+ if (effectiveSiteIds.isEmpty()) {
+ vo.setTotal(0);
+ vo.setDates(Collections.emptyList());
+ vo.setCounts(Collections.emptyList());
+ return R.ok(vo);
+ }
+ // 快充和超充订单作为电池安全检测次数。
+ R<List<Integer>> r = chargingGunClient.getGunIdsBySiteIdsAndChargeModels(effectiveSiteIds, Arrays.asList(1, 2));
+ if (r.getCode() != 200) {
+ return R.ok(vo);
+ }
+ List<Integer> gunIds = r.getData();
+ //统计
+ Long total = 0L;
+ if (gunIds != null && !gunIds.isEmpty()) {
+ total = this.baseMapper.selectCount(new LambdaQueryWrapper<TChargingOrder>()
+ .eq(TChargingOrder::getDelFlag, 0)//未删除
+ .in(TChargingOrder::getStatus, Arrays.asList(3, 5))//充电中、已结束
+ .in(TChargingOrder::getChargingGunId, gunIds));//符合条件的充电枪
+ }
+ vo.setTotal(total.intValue());
+ //2.折线图
/* // 计算日期范围:前七天(不含今日)直接查找数据量太大,内存报错
LocalDate today = LocalDate.now();
LocalDateTime startDate = today.minusDays(7).atStartOfDay();
LocalDateTime endDate = today.minusDays(1).atTime(LocalTime.MAX);
// 查询数据库
List<OrderCountByDate> orderCounts = this.baseMapper.countOrdersByDate(startDate, endDate, gunIds);*/
-
-
- List<LocalDate> dates = new ArrayList<>();
- List<Integer> counts = new ArrayList<>();
- LocalDate today = LocalDate.now();
- // 直接查找数据量太大,内存报错,分每天查找
- for (int i = 7; i >= 1; i--) {//升序
- LocalDate day = today.minusDays(i);
- LocalDateTime startOfDay = day.atStartOfDay();
- LocalDateTime endOfDay = day.atTime(LocalTime.MAX);
- //统计
- Long count = 0L;
- if (gunIds != null && !gunIds.isEmpty()) {
- count = this.baseMapper.selectCount(new LambdaQueryWrapper<TChargingOrder>()
- .eq(TChargingOrder::getDelFlag, 0)//未删除
- .in(TChargingOrder::getStatus, Arrays.asList(3, 5))//充电中、已结束
- .in(TChargingOrder::getChargingGunId, gunIds)//符合条件的充电枪 站点 超充快充
- .between(TChargingOrder::getCreateTime, startOfDay, endOfDay));//每天
- }
- dates.add(day);
- counts.add(count.intValue());
- }
- vo.setDates(dates);
- vo.setCounts(counts);
- return R.ok(vo);
- }
-
- @Override
- public Double getSumDegreeBySiteIds(List<Integer> siteIds) {
- Double sumDegreeBySiteIds = this.baseMapper.getSumDegreeBySiteIds(siteIds);
- return sumDegreeBySiteIds;
-
- }
-
-
- /**
- * 获取启动失败且时间超过1小时的订单
- *
- * @return
- */
- @Override
- public List<TChargingOrder> findFailedStartupOrder() {
- return this.baseMapper.findFailedStartupOrder();
- }
-
-
- /**
- * 获取停止中的数据
- *
- * @return
- */
- @Override
- public List<TChargingOrder> findStoppedOrder() {
- return this.baseMapper.findStoppedOrder();
- }
-
-
- /**
- * 获取充电中的数据
- *
- * @return
- */
- @Override
- public List<TChargingOrder> findChargingOrder() {
- return this.baseMapper.findChargingOrder();
- }
- /**
- * 获取已结束的数据
- * @return
- */
- @Override
- public List<TChargingOrder> findEndChargingOrder() {
- return this.baseMapper.findEndChargingOrder();
- }
+ List<LocalDate> dates = new ArrayList<>();
+ List<Integer> counts = new ArrayList<>();
+ LocalDate today = LocalDate.now();
+ // 直接查找数据量太大,内存报错,分每天查找
+ for (int i = 7; i >= 1; i--) {//升序
+ LocalDate day = today.minusDays(i);
+ LocalDateTime startOfDay = day.atStartOfDay();
+ LocalDateTime endOfDay = day.atTime(LocalTime.MAX);
+ //统计
+ Long count = 0L;
+ if (gunIds != null && !gunIds.isEmpty()) {
+ count = this.baseMapper.selectCount(new LambdaQueryWrapper<TChargingOrder>()
+ .eq(TChargingOrder::getDelFlag, 0)//未删除
+ .in(TChargingOrder::getStatus, Arrays.asList(3, 5))//充电中、已结束
+ .in(TChargingOrder::getChargingGunId, gunIds)//符合条件的充电枪 站点 超充快充
+ .between(TChargingOrder::getCreateTime, startOfDay, endOfDay));//每天
+ }
+ dates.add(day);
+ counts.add(count.intValue());
+ }
+ vo.setDates(dates);
+ vo.setCounts(counts);
+ return R.ok(vo);
+ }
- /**
- * 获取需要手动修改订单状态的数据
- * @return
- */
- @Override
- public List<TChargingOrder> findUpStatusChargingOrder() {
- return this.baseMapper.findUpStatusChargingOrder();
- }
+ @Override
+ public Double getSumDegreeBySiteIds(List<Integer> siteIds) {
+ Double sumDegreeBySiteIds = this.baseMapper.getSumDegreeBySiteIds(siteIds);
- /**
- * 查询充电算账单数据
- * @param startTime
- * @param endTime
- */
- @Override
- public List<Map<String, Object>> getChargingSettlementBill(String startTime, String endTime, Integer dateType) {
- return this.baseMapper.getChargingSettlementBill(startTime, endTime, dateType);
+ return sumDegreeBySiteIds;
+
}
- /**
- * 查询账户结算账单数据
- * @param startTime
- * @param endTime
- * @return
- */
- @Override
- public List<Map<String, Object>> getAccountSettlementStatement(String startTime, String endTime) {
- return this.baseMapper.getAccountSettlementStatement(startTime, endTime);
- }
+ /**
+ * 获取启动失败且时间超过1小时的订单
+ *
+ * @return
+ */
+ @Override
+ public List<TChargingOrder> findFailedStartupOrder() {
+ return this.baseMapper.findFailedStartupOrder();
+ }
+
+
+ /**
+ * 获取停止中的数据
+ *
+ * @return
+ */
+ @Override
+ public List<TChargingOrder> findStoppedOrder() {
+ return this.baseMapper.findStoppedOrder();
+ }
+
+
+ /**
+ * 获取充电中的数据
+ *
+ * @return
+ */
+ @Override
+ public List<TChargingOrder> findChargingOrder() {
+ return this.baseMapper.findChargingOrder();
+ }
+
+ /**
+ * 获取已结束的数据
+ *
+ * @return
+ */
+ @Override
+ public List<TChargingOrder> findEndChargingOrder() {
+ return this.baseMapper.findEndChargingOrder();
+ }
+
+ /**
+ * 获取需要手动修改订单状态的数据
+ *
+ * @return
+ */
+ @Override
+ public List<TChargingOrder> findUpStatusChargingOrder() {
+ return this.baseMapper.findUpStatusChargingOrder();
+ }
+
+ /**
+ * 查询充电算账单数据
+ *
+ * @param startTime
+ * @param endTime
+ */
+ @Override
+ public List<Map<String, Object>> getChargingSettlementBill(String startTime, String endTime, Integer dateType) {
+ return this.baseMapper.getChargingSettlementBill(startTime, endTime, dateType);
+ }
+
+
+ /**
+ * 查询账户结算账单数据
+ *
+ * @param startTime
+ * @param endTime
+ * @return
+ */
+ @Override
+ public List<Map<String, Object>> getAccountSettlementStatement(String startTime, String endTime) {
+ return this.baseMapper.getAccountSettlementStatement(startTime, endTime);
+ }
/**
* 手动处理退款数据
+ *
* @param refund_out_trade_no 退款商户单号
*/
@Override
@@ -7291,14 +7293,14 @@
BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
List<TChargingOrderRefund> orderRefunds = chargingOrderRefundService.list(new QueryWrapper<TChargingOrderRefund>().eq("charging_order_id", orderId));
List<String> collect = orderRefunds.stream().map(TChargingOrderRefund::getRefundCode).collect(Collectors.toList());
- if(!collect.contains(refund_out_trade_no)){
- if(1 == chargingOrder.getRechargePaymentType()){
+ if (!collect.contains(refund_out_trade_no)) {
+ if (1 == chargingOrder.getRechargePaymentType()) {
Map<String, Object> data = wxPaymentClient.queryRefund(refund_out_trade_no).getData();
- if(null == data){
+ if (null == data) {
throw new ServiceException("退款查询失败");
}
log.info("退款查询结果:{}", JSON.toJSONString(data));
- Map<String, Object> amount = (Map<String, Object>)data.get("amount");
+ Map<String, Object> amount = (Map<String, Object>) data.get("amount");
TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
chargingOrderRefund.setRefundCode(refund_out_trade_no);
@@ -7319,18 +7321,18 @@
chargingOrderRefund.setPayAmount(rechargeAmount);
chargingOrderRefund.setCreateTime(chargingOrderRefund.getRefundTime());
chargingOrderRefundService.save(chargingOrderRefund);
- if(rechargeAmount.compareTo(chargingOrderRefund.getRefundAmount()) == 0){
+ if (rechargeAmount.compareTo(chargingOrderRefund.getRefundAmount()) == 0) {
chargingOrder.setStatus(-1);
- }else{
+ } else {
chargingOrder.setStatus(5);
}
this.updateById(chargingOrder);
}
- if(2 == chargingOrder.getRechargePaymentType()){
+ if (2 == chargingOrder.getRechargePaymentType()) {
QueryRefundReq dto = new QueryRefundReq();
dto.setOutTradeNo(refund_out_trade_no);
QueryRefundResp data = aliPaymentClient.queryRefund(dto).getData();
- if(null == data){
+ if (null == data) {
throw new ServiceException("退款查询失败");
}
TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
@@ -7351,9 +7353,9 @@
chargingOrderRefund.setCreateTime(chargingOrderRefund.getRefundTime());
chargingOrderRefundService.save(chargingOrderRefund);
- if(rechargeAmount.compareTo(chargingOrderRefund.getRefundAmount()) == 0){
+ if (rechargeAmount.compareTo(chargingOrderRefund.getRefundAmount()) == 0) {
chargingOrder.setStatus(-1);
- }else{
+ } else {
chargingOrder.setStatus(5);
}
this.updateById(chargingOrder);
@@ -7364,6 +7366,7 @@
/**
* 手动添加完善订单费用明细
+ *
* @param orderId
*/
@Override
@@ -7371,7 +7374,7 @@
try {
TChargingOrder chargingOrder = this.getById(orderId);
TransactionRecord one = transactionRecordService.findOne(chargingOrder.getCode());
- if(null != one){
+ if (null != one) {
TransactionRecordMessageVO vo = new TransactionRecordMessageVO();
BeanUtils.copyProperties(one, vo);
//如果使用优惠券需要判断优惠券是否满足使用条件
@@ -7393,7 +7396,7 @@
SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<AccountingStrategyDetailOrderVo> lists = new ArrayList<>();
List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
- if(!dataList.isEmpty()){
+ if (!dataList.isEmpty()) {
vo.setStart_time(sdfs.format(dataList.get(dataList.size() - 1).getCreate_time()) + ".00");
vo.setEnd_time(sdfs.format(dataList.get(0).getCreate_time()) + ".00");
}
@@ -7640,16 +7643,16 @@
chargingOrder.setRefundStatus(1);
UploadRealTimeMonitoringData asc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode(), "asc");
UploadRealTimeMonitoringData desc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode(), "desc");
- if(null != asc){
+ if (null != asc) {
chargingOrder.setStartSoc(new BigDecimal(asc.getSoc()));
}
- if(null != desc){
+ if (null != desc) {
chargingOrder.setEndSoc(new BigDecimal(desc.getSoc()));
}
this.updateById(chargingOrder);
- }else{
+ } else {
List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
- if(!dataList.isEmpty()) {
+ if (!dataList.isEmpty()) {
//获取当前订单的计费规则,然后分段计算总的度数和充电金额
List<AccountingStrategyDetailOrder> detailOrders = accountingStrategyDetailOrderService.list(new LambdaQueryWrapper<AccountingStrategyDetailOrder>()
.eq(AccountingStrategyDetailOrder::getChargingOrderId, chargingOrder.getId()).last(" order by start_time"));
@@ -7842,536 +7845,558 @@
chargingOrderService.updateById(chargingOrder);
}
}
- }catch (Exception e){
+ } catch (Exception e) {
e.printStackTrace();
}
}
- private boolean isIcbcRemovableStatus(String status, TChargingOrder order) {
- if (!StringUtils.hasLength(status)) {
- return false;
- }
- if (Arrays.asList("FAIL", "FAILED", "CLOSED", "TRADE_CLOSED", "REVOKED", "PAYERROR").contains(status)) {
- return true;
- }
- // 工行B2C不支持主动关单;NOTPAY超时仅释放本地待支付订单,不代表远端订单已关闭。
- return "NOTPAY".equals(status) && isLocalPendingOrderExpired(order);
- }
+ private boolean isIcbcRemovableStatus(String status, TChargingOrder order) {
+ if (!StringUtils.hasLength(status)) {
+ return false;
+ }
+ if (Arrays.asList("FAIL", "FAILED", "CLOSED", "TRADE_CLOSED", "REVOKED", "PAYERROR").contains(status)) {
+ return true;
+ }
+ // 工行B2C不支持主动关单;NOTPAY超时仅释放本地待支付订单,不代表远端订单已关闭。
+ return "NOTPAY".equals(status) && isLocalPendingOrderExpired(order);
+ }
- private boolean isLocalPendingOrderExpired(TChargingOrder order) {
- return order != null && order.getCreateTime() != null && order.getCreateTime().plusMinutes(30).isBefore(LocalDateTime.now());
- }
+ private boolean isLocalPendingOrderExpired(TChargingOrder order) {
+ return order != null && order.getCreateTime() != null && order.getCreateTime().plusMinutes(30).isBefore(LocalDateTime.now());
+ }
- private boolean isIcbcPaymentCreated(IcbcPaymentResp resp) {
- if (resp == null || !StringUtils.hasLength(resp.getStatus())) {
- return false;
- }
- if (!"SUCCESS".equals(resp.getStatus()) || !StringUtils.hasLength(resp.getPayData())) {
- return false;
- }
- try {
- JSONObject payData = JSON.parseObject(resp.getPayData());
- return StringUtils.hasLength(payData.getString("wxDataPackage")) || StringUtils.hasLength(payData.getString("package"));
- } catch (Exception e) {
- return false;
- }
- }
+ private boolean isIcbcPaymentCreated(IcbcPaymentResp resp) {
+ if (resp == null || !StringUtils.hasLength(resp.getStatus())) {
+ return false;
+ }
+ if (!"SUCCESS".equals(resp.getStatus()) || !StringUtils.hasLength(resp.getPayData())) {
+ return false;
+ }
+ try {
+ JSONObject payData = JSON.parseObject(resp.getPayData());
+ return StringUtils.hasLength(payData.getString("wxDataPackage")) || StringUtils.hasLength(payData.getString("package"));
+ } catch (Exception e) {
+ return false;
+ }
+ }
- private String buildIcbcPaymentFailReason(IcbcPaymentResp resp) {
- if (resp == null) {
- return "工行支付服务未返回支付数据";
- }
- String reason = firstNotBlank(resp.getRawResponse(), resp.getStatus());
- if (!StringUtils.hasLength(reason)) {
- return "工行支付服务返回数据不完整";
- }
- if (reason.length() > 500) {
- return reason.substring(0, 500);
- }
- return reason;
- }
+ private String buildIcbcPaymentFailReason(IcbcPaymentResp resp) {
+ if (resp == null) {
+ return "工行支付服务未返回支付数据";
+ }
+ String reason = firstNotBlank(resp.getRawResponse(), resp.getStatus());
+ if (!StringUtils.hasLength(reason)) {
+ return "工行支付服务返回数据不完整";
+ }
+ if (reason.length() > 500) {
+ return reason.substring(0, 500);
+ }
+ return reason;
+ }
- private void triggerChargingOrderShare(TChargingOrder chargingOrder, Site site) {
- if (!isNeedChargingOrderShare(chargingOrder)) {
- return;
- }
- if (TransactionSynchronizationManager.isActualTransactionActive()
- && TransactionSynchronizationManager.isSynchronizationActive()) {
- Long chargingOrderId = chargingOrder.getId();
- Integer siteId = chargingOrder.getSiteId();
- String resourceKey = SHARE_AFTER_COMMIT_RESOURCE_PREFIX + chargingOrderId;
- if (TransactionSynchronizationManager.hasResource(resourceKey)) {
- return;
- }
- TransactionSynchronizationManager.bindResource(resourceKey, Boolean.TRUE);
- try {
- TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
- @Override
- public void afterCommit() {
- executeChargingOrderShareAfterCommit(chargingOrderId, siteId);
- }
+ private void triggerChargingOrderShare(TChargingOrder chargingOrder, Site site) {
+ if (!isNeedChargingOrderShare(chargingOrder)) {
+ return;
+ }
+ if (TransactionSynchronizationManager.isActualTransactionActive()
+ && TransactionSynchronizationManager.isSynchronizationActive()) {
+ Long chargingOrderId = chargingOrder.getId();
+ Integer siteId = chargingOrder.getSiteId();
+ String resourceKey = SHARE_AFTER_COMMIT_RESOURCE_PREFIX + chargingOrderId;
+ if (TransactionSynchronizationManager.hasResource(resourceKey)) {
+ return;
+ }
+ TransactionSynchronizationManager.bindResource(resourceKey, Boolean.TRUE);
+ try {
+ TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+ @Override
+ public void afterCommit() {
+ executeChargingOrderShareAfterCommit(chargingOrderId, siteId);
+ }
- @Override
- public void afterCompletion(int status) {
- if (TransactionSynchronizationManager.hasResource(resourceKey)) {
- TransactionSynchronizationManager.unbindResource(resourceKey);
- }
- }
- });
- } catch (RuntimeException e) {
- TransactionSynchronizationManager.unbindResourceIfPossible(resourceKey);
- throw e;
- }
- log.info("充电订单分账已登记为事务提交后执行,订单号:{}", chargingOrder.getCode());
- return;
- }
- executeChargingOrderShare(chargingOrder, site);
- }
+ @Override
+ public void afterCompletion(int status) {
+ if (TransactionSynchronizationManager.hasResource(resourceKey)) {
+ TransactionSynchronizationManager.unbindResource(resourceKey);
+ }
+ }
+ });
+ } catch (RuntimeException e) {
+ TransactionSynchronizationManager.unbindResourceIfPossible(resourceKey);
+ throw e;
+ }
+ log.info("充电订单分账已登记为事务提交后执行,订单号:{}", chargingOrder.getCode());
+ return;
+ }
+ executeChargingOrderShare(chargingOrder, site);
+ }
- private void executeChargingOrderShareAfterCommit(Long chargingOrderId, Integer siteId) {
- try {
- TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
- transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
- transactionTemplate.execute(status -> {
- TChargingOrder latestOrder = chargingOrderId == null ? null : this.getById(chargingOrderId);
- Site latestSite = loadChargingOrderSite(siteId);
- executeChargingOrderShare(latestOrder, latestSite);
- return null;
- });
- } catch (Exception e) {
- log.error("事务提交后执行充电订单分账失败,订单ID:{}", chargingOrderId, e);
- }
- }
+ private void executeChargingOrderShareAfterCommit(Long chargingOrderId, Integer siteId) {
+ try {
+ TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
+ transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
+ transactionTemplate.execute(status -> {
+ TChargingOrder latestOrder = chargingOrderId == null ? null : this.getById(chargingOrderId);
+ Site latestSite = loadChargingOrderSite(siteId);
+ executeChargingOrderShare(latestOrder, latestSite);
+ return null;
+ });
+ } catch (Exception e) {
+ log.error("事务提交后执行充电订单分账失败,订单ID:{}", chargingOrderId, e);
+ }
+ }
- private void executeChargingOrderShare(TChargingOrder chargingOrder, Site site) {
- try {
- if (!isNeedChargingOrderShare(chargingOrder)) {
- return;
- }
- Partner partner = loadPartner(site);
- for (TChargingOrderShareRecord shareRecord : buildChargingOrderShareRecords(chargingOrder, site, partner)) {
- TChargingOrderShareRecord exist = chargingOrderShareRecordMapper.selectOne(new LambdaQueryWrapper<TChargingOrderShareRecord>()
- .eq(TChargingOrderShareRecord::getChargingOrderCode, shareRecord.getChargingOrderCode())
- .eq(TChargingOrderShareRecord::getPayChannel, shareRecord.getPayChannel())
- .eq(TChargingOrderShareRecord::getDelFlag, false)
- .last("limit 1"));
- if (exist != null && ("SUCCESS".equals(exist.getOnlineShareStatus()) || "PROCESSING".equals(exist.getOnlineShareStatus()))) {
- continue;
- }
- shareRecord = mergeChargingOrderShareRecord(exist, shareRecord);
- saveOrUpdateChargingOrderShareRecord(shareRecord);
- if (Boolean.TRUE.equals(shareRecord.getNeedOnlineShare())) {
- processIcbcOnlineShare(shareRecord, partner);
- }
- }
- } catch (Exception e) {
- log.error("充电订单分账记录触发失败,订单号:{}", chargingOrder == null ? null : chargingOrder.getCode(), e);
- recordChargingOrderShareFailure(chargingOrder, site, e);
- }
- }
+ /**
+ * 软删除旧的非成功/处理中的分账记录,为退款后重新计算分账做准备。
+ * 仅删除 onlineShareStatus 不是 SUCCESS 或 PROCESSING 的记录,
+ * 已成功线上分账的记录不可删除,避免重复分账。
+ */
+ private void softDeleteStaleChargingOrderShareRecords(TChargingOrder chargingOrder) {
+ if (chargingOrder == null || !StringUtils.hasLength(chargingOrder.getCode())) {
+ return;
+ }
+ LambdaUpdateWrapper<TChargingOrderShareRecord> wrapper = new LambdaUpdateWrapper<>();
+ wrapper.eq(TChargingOrderShareRecord::getChargingOrderCode, chargingOrder.getCode())
+ .eq(TChargingOrderShareRecord::getDelFlag, false)
+ .notIn(TChargingOrderShareRecord::getOnlineShareStatus, "SUCCESS", "PROCESSING")
+ .set(TChargingOrderShareRecord::getDelFlag, true);
+ int count = chargingOrderShareRecordMapper.update(null, wrapper);
+ if (count > 0) {
+ log.info("软删除充电订单旧分账记录,订单号:{},删除数量:{}", chargingOrder.getCode(), count);
+ }
+ }
- private void triggerChargingOrderShare(TChargingOrder chargingOrder) {
- try {
- if (chargingOrder == null || chargingOrder.getSiteId() == null) {
- return;
- }
- if (TransactionSynchronizationManager.isActualTransactionActive()
- && TransactionSynchronizationManager.isSynchronizationActive()) {
- triggerChargingOrderShare(chargingOrder, null);
- return;
- }
- Site site = loadChargingOrderSite(chargingOrder.getSiteId());
- triggerChargingOrderShare(chargingOrder, site);
- } catch (Exception e) {
- log.error("充电订单分账站点加载失败,订单号:{}", chargingOrder == null ? null : chargingOrder.getCode(), e);
- }
- }
+ private void executeChargingOrderShare(TChargingOrder chargingOrder, Site site) {
+ try {
+ if (!isNeedChargingOrderShare(chargingOrder)) {
+ return;
+ }
+ // 先软删除旧的非成功分账记录,再基于剩余支付金额重新计算
+ softDeleteStaleChargingOrderShareRecords(chargingOrder);
+ Partner partner = loadPartner(site);
+ for (TChargingOrderShareRecord shareRecord : buildChargingOrderShareRecords(chargingOrder, site, partner)) {
+ TChargingOrderShareRecord exist = chargingOrderShareRecordMapper.selectOne(new LambdaQueryWrapper<TChargingOrderShareRecord>()
+ .eq(TChargingOrderShareRecord::getChargingOrderCode, shareRecord.getChargingOrderCode())
+ .eq(TChargingOrderShareRecord::getPayChannel, shareRecord.getPayChannel())
+ .eq(TChargingOrderShareRecord::getDelFlag, false)
+ .last("limit 1"));
+ if (exist != null) {
+ // 已有成功/处理中的线上分账记录,跳过不重复处理
+ continue;
+ }
+ saveOrUpdateChargingOrderShareRecord(shareRecord);
+ if (Boolean.TRUE.equals(shareRecord.getNeedOnlineShare())) {
+ processIcbcOnlineShare(shareRecord, partner);
+ }
+ }
+ } catch (Exception e) {
+ log.error("充电订单分账记录触发失败,订单号:{}", chargingOrder == null ? null : chargingOrder.getCode(), e);
+ recordChargingOrderShareFailure(chargingOrder, site, e);
+ }
+ }
- private Site loadChargingOrderSite(Integer siteId) {
- if (siteId == null) {
- return null;
- }
- R<List<Site>> siteResult = siteClient.getSiteByIds(Collections.singletonList(siteId));
- List<Site> sites = siteResult == null ? null : siteResult.getData();
- return sites == null || sites.isEmpty() ? null : sites.get(0);
- }
+ private void triggerChargingOrderShare(TChargingOrder chargingOrder) {
+ try {
+ if (chargingOrder == null || chargingOrder.getSiteId() == null) {
+ return;
+ }
+ if (TransactionSynchronizationManager.isActualTransactionActive()
+ && TransactionSynchronizationManager.isSynchronizationActive()) {
+ triggerChargingOrderShare(chargingOrder, null);
+ return;
+ }
+ Site site = loadChargingOrderSite(chargingOrder.getSiteId());
+ triggerChargingOrderShare(chargingOrder, site);
+ } catch (Exception e) {
+ log.error("充电订单分账站点加载失败,订单号:{}", chargingOrder == null ? null : chargingOrder.getCode(), e);
+ }
+ }
- private boolean isNeedChargingOrderShare(TChargingOrder chargingOrder) {
- return chargingOrder != null
- && Integer.valueOf(5).equals(chargingOrder.getStatus())
- && Integer.valueOf(2).equals(chargingOrder.getRechargePaymentStatus())
- && Integer.valueOf(2).equals(chargingOrder.getRefundStatus())
- && getChargingOrderShareBaseAmount(chargingOrder).compareTo(BigDecimal.ZERO) > 0;
- }
+ private Site loadChargingOrderSite(Integer siteId) {
+ if (siteId == null) {
+ return null;
+ }
+ R<List<Site>> siteResult = siteClient.getSiteByIds(Collections.singletonList(siteId));
+ List<Site> sites = siteResult == null ? null : siteResult.getData();
+ return sites == null || sites.isEmpty() ? null : sites.get(0);
+ }
- private Partner loadPartner(Site site) {
- if (site == null || site.getPartnerId() == null) {
- return null;
- }
- R<Partner> partnerResult = partnerClient.getPartnerById(site.getPartnerId());
- return partnerResult == null ? null : partnerResult.getData();
- }
+ private boolean isNeedChargingOrderShare(TChargingOrder chargingOrder) {
+ return chargingOrder != null
+ && Integer.valueOf(5).equals(chargingOrder.getStatus())
+ && Integer.valueOf(2).equals(chargingOrder.getRechargePaymentStatus())
+ && Integer.valueOf(2).equals(chargingOrder.getRefundStatus())
+ && getChargingOrderShareBaseAmount(chargingOrder).compareTo(BigDecimal.ZERO) > 0;
+ }
- private List<TChargingOrderShareRecord> buildChargingOrderShareRecords(TChargingOrder chargingOrder, Site site, Partner partner) {
- BigDecimal actualThirdPay = getActualThirdPayAmount(chargingOrder);
- BalanceShareAmount balanceShareAmount = getBalanceShareAmount(chargingOrder);
- BigDecimal actualBalancePay = balanceShareAmount.getPrincipalAmount();
- BigDecimal actualTotalPay = actualThirdPay.add(actualBalancePay).setScale(2, RoundingMode.HALF_UP);
- BigDecimal shareElectricityAmount = getChargingOrderShareElectricityAmount(chargingOrder);
- BigDecimal shareServiceAmount = getChargingOrderShareServiceAmount(chargingOrder);
- BigDecimal shareBaseAmount = shareElectricityAmount.add(shareServiceAmount).setScale(2, RoundingMode.HALF_UP);
- if (actualTotalPay.compareTo(BigDecimal.ZERO) <= 0 && isWhitelistOrder(chargingOrder)) {
- actualTotalPay = shareBaseAmount;
- }
- if (actualTotalPay.compareTo(BigDecimal.ZERO) <= 0) {
- return Collections.emptyList();
- }
- if (!isWhitelistOrder(chargingOrder) && shareBaseAmount.compareTo(BigDecimal.ZERO) > 0 && actualTotalPay.compareTo(shareBaseAmount) < 0) {
- BigDecimal effectiveRatio = actualTotalPay.divide(shareBaseAmount, 6, RoundingMode.HALF_UP);
- shareElectricityAmount = shareElectricityAmount.multiply(effectiveRatio).setScale(2, RoundingMode.HALF_UP);
- shareServiceAmount = shareServiceAmount.multiply(effectiveRatio).setScale(2, RoundingMode.HALF_UP);
- }
- List<TChargingOrderShareRecord> records = new ArrayList<>();
- if (actualBalancePay.compareTo(BigDecimal.ZERO) > 0) {
- records.add(buildChargingOrderShareRecord(chargingOrder, site, partner, "BALANCE", actualBalancePay,
- balanceShareAmount.getGiftAmount(), actualTotalPay, shareElectricityAmount, shareServiceAmount));
- }
- if (actualThirdPay.compareTo(BigDecimal.ZERO) > 0) {
- records.add(buildChargingOrderShareRecord(chargingOrder, site, partner, resolveThirdPayChannel(chargingOrder), actualThirdPay,
- BigDecimal.ZERO, actualTotalPay, shareElectricityAmount, shareServiceAmount));
- }
- if (records.isEmpty() && isWhitelistOrder(chargingOrder)) {
- records.add(buildChargingOrderShareRecord(chargingOrder, site, partner, "WHITELIST", actualTotalPay,
- BigDecimal.ZERO, actualTotalPay, shareElectricityAmount, shareServiceAmount));
- }
- return records;
- }
+ private Partner loadPartner(Site site) {
+ if (site == null || site.getPartnerId() == null) {
+ return null;
+ }
+ R<Partner> partnerResult = partnerClient.getPartnerById(site.getPartnerId());
+ return partnerResult == null ? null : partnerResult.getData();
+ }
- private TChargingOrderShareRecord buildChargingOrderShareRecord(TChargingOrder chargingOrder, Site site, Partner partner,
- String payChannel, BigDecimal channelPayAmount, BigDecimal channelGiftAmount,
- BigDecimal actualTotalPay, BigDecimal shareElectricityAmount,
- BigDecimal shareServiceAmount) {
- TChargingOrderShareRecord record = new TChargingOrderShareRecord();
- record.setChargingOrderId(chargingOrder.getId());
- record.setChargingOrderCode(chargingOrder.getCode());
- record.setSiteId(chargingOrder.getSiteId());
- record.setPartnerId(site == null ? null : site.getPartnerId());
- record.setPayChannel(payChannel);
- record.setChannelPayAmount(money(channelPayAmount));
- record.setChannelGiftAmount(money(channelGiftAmount));
- BigDecimal channelRatio = channelPayAmount.divide(actualTotalPay, 6, RoundingMode.HALF_UP);
- record.setChannelPayRatio(channelRatio);
- BigDecimal channelElectricityAmount = shareElectricityAmount.multiply(channelRatio).setScale(2, RoundingMode.HALF_UP);
- BigDecimal channelServiceAmount = shareServiceAmount.multiply(channelRatio).setScale(2, RoundingMode.HALF_UP);
- record.setChannelElectricityAmount(channelElectricityAmount);
- record.setChannelServiceAmount(channelServiceAmount);
- record.setElectricityShareRatio(partner == null ? null : partner.getElectricityShareRatio());
- record.setServiceShareRatio(partner == null ? null : partner.getServiceShareRatio());
- BigDecimal electricityShareAmount = calculateShareAmount(channelElectricityAmount, record.getElectricityShareRatio());
- BigDecimal serviceShareAmount = calculateShareAmount(channelServiceAmount, record.getServiceShareRatio());
- record.setElectricityShareAmount(electricityShareAmount);
- record.setServiceShareAmount(serviceShareAmount);
- record.setShareAmount(electricityShareAmount.add(serviceShareAmount).setScale(2, RoundingMode.HALF_UP));
- if ("ICBC".equals(payChannel)) {
- record.setSeqNo(chargingOrder.getCode());
- record.setBusiType("1");
- record.setOriTrxDate(chargingOrder.getPayTime() == null ? LocalDate.now() : chargingOrder.getPayTime().toLocalDate());
- record.setSubOrderId(chargingOrder.getCode());
- }
- if ("ICBC".equals(payChannel) && partner != null) {
- record.setSubMerId(partner.getIcbcSubMerId());
- record.setSubMerPrtclNo(partner.getIcbcSubMerPrtclNo());
- }
- boolean needOnlineShare = shouldProcessIcbcOnlineShare(icbcOnlineShareEnabled, payChannel, record.getShareAmount(), partner);
- record.setNeedOnlineShare(needOnlineShare);
- record.setOnlineShareStatus(needOnlineShare ? "INIT" : "RECORDED");
- if ("ICBC".equals(payChannel) && record.getShareAmount().compareTo(BigDecimal.ZERO) > 0 && !needOnlineShare) {
- record.setFailReason(icbcOnlineShareEnabled
- ? "未配置完整工行二级商户参数,仅记录本地分账"
- : "工行线上分账已关闭,仅记录本地分账");
- }
- record.setRetryCount(0);
- record.setDelFlag(false);
- return record;
- }
+ private List<TChargingOrderShareRecord> buildChargingOrderShareRecords(TChargingOrder chargingOrder, Site site, Partner partner) {
+ BigDecimal actualThirdPay = getActualThirdPayAmount(chargingOrder);
+ BalanceShareAmount balanceShareAmount = getBalanceShareAmount(chargingOrder);
+ BigDecimal actualBalancePay = balanceShareAmount.getPrincipalAmount();
+ BigDecimal actualTotalPay = actualThirdPay.add(actualBalancePay).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal shareElectricityAmount = getChargingOrderShareElectricityAmount(chargingOrder);
+ BigDecimal shareServiceAmount = getChargingOrderShareServiceAmount(chargingOrder);
+ BigDecimal shareBaseAmount = shareElectricityAmount.add(shareServiceAmount).setScale(2, RoundingMode.HALF_UP);
+ if (actualTotalPay.compareTo(BigDecimal.ZERO) <= 0 && isWhitelistOrder(chargingOrder)) {
+ actualTotalPay = shareBaseAmount;
+ }
+ if (actualTotalPay.compareTo(BigDecimal.ZERO) <= 0) {
+ return Collections.emptyList();
+ }
+ if (!isWhitelistOrder(chargingOrder) && shareBaseAmount.compareTo(BigDecimal.ZERO) > 0 && actualTotalPay.compareTo(shareBaseAmount) < 0) {
+ BigDecimal effectiveRatio = actualTotalPay.divide(shareBaseAmount, 6, RoundingMode.HALF_UP);
+ shareElectricityAmount = shareElectricityAmount.multiply(effectiveRatio).setScale(2, RoundingMode.HALF_UP);
+ shareServiceAmount = shareServiceAmount.multiply(effectiveRatio).setScale(2, RoundingMode.HALF_UP);
+ }
+ List<TChargingOrderShareRecord> records = new ArrayList<>();
+ if (actualBalancePay.compareTo(BigDecimal.ZERO) > 0) {
+ records.add(buildChargingOrderShareRecord(chargingOrder, site, partner, "BALANCE", actualBalancePay,
+ balanceShareAmount.getGiftAmount(), actualTotalPay, shareElectricityAmount, shareServiceAmount));
+ }
+ if (actualThirdPay.compareTo(BigDecimal.ZERO) > 0) {
+ records.add(buildChargingOrderShareRecord(chargingOrder, site, partner, resolveThirdPayChannel(chargingOrder), actualThirdPay,
+ BigDecimal.ZERO, actualTotalPay, shareElectricityAmount, shareServiceAmount));
+ }
+ if (records.isEmpty() && isWhitelistOrder(chargingOrder)) {
+ records.add(buildChargingOrderShareRecord(chargingOrder, site, partner, "WHITELIST", actualTotalPay,
+ BigDecimal.ZERO, actualTotalPay, shareElectricityAmount, shareServiceAmount));
+ }
+ return records;
+ }
- private TChargingOrderShareRecord mergeChargingOrderShareRecord(TChargingOrderShareRecord exist, TChargingOrderShareRecord fresh) {
- if (exist == null) {
- return fresh;
- }
- fresh.setId(exist.getId());
- fresh.setRetryCount(exist.getRetryCount() == null ? 0 : exist.getRetryCount());
- fresh.setRequestJson(exist.getRequestJson());
- fresh.setResponseJson(exist.getResponseJson());
- fresh.setIcbcOrderId(exist.getIcbcOrderId());
- fresh.setSubOrderSeq(exist.getSubOrderSeq());
- fresh.setSubOrderTrxid(exist.getSubOrderTrxid());
- fresh.setRecResult(exist.getRecResult());
- fresh.setLastRetryTime(exist.getLastRetryTime());
- return fresh;
- }
+ private TChargingOrderShareRecord buildChargingOrderShareRecord(TChargingOrder chargingOrder, Site site, Partner partner,
+ String payChannel, BigDecimal channelPayAmount, BigDecimal channelGiftAmount,
+ BigDecimal actualTotalPay, BigDecimal shareElectricityAmount,
+ BigDecimal shareServiceAmount) {
+ TChargingOrderShareRecord record = new TChargingOrderShareRecord();
+ record.setChargingOrderId(chargingOrder.getId());
+ record.setChargingOrderCode(chargingOrder.getCode());
+ record.setSiteId(chargingOrder.getSiteId());
+ record.setPartnerId(site == null ? null : site.getPartnerId());
+ record.setPayChannel(payChannel);
+ record.setChannelPayAmount(money(channelPayAmount));
+ record.setChannelGiftAmount(money(channelGiftAmount));
+ BigDecimal channelRatio = channelPayAmount.divide(actualTotalPay, 6, RoundingMode.HALF_UP);
+ record.setChannelPayRatio(channelRatio);
+ BigDecimal channelElectricityAmount = shareElectricityAmount.multiply(channelRatio).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal channelServiceAmount = shareServiceAmount.multiply(channelRatio).setScale(2, RoundingMode.HALF_UP);
+ record.setChannelElectricityAmount(channelElectricityAmount);
+ record.setChannelServiceAmount(channelServiceAmount);
+ record.setElectricityShareRatio(partner == null ? null : partner.getElectricityShareRatio());
+ record.setServiceShareRatio(partner == null ? null : partner.getServiceShareRatio());
+ BigDecimal electricityShareAmount = calculateShareAmount(channelElectricityAmount, record.getElectricityShareRatio());
+ BigDecimal serviceShareAmount = calculateShareAmount(channelServiceAmount, record.getServiceShareRatio());
+ record.setElectricityShareAmount(electricityShareAmount);
+ record.setServiceShareAmount(serviceShareAmount);
+ record.setShareAmount(electricityShareAmount.add(serviceShareAmount).setScale(2, RoundingMode.HALF_UP));
+ if ("ICBC".equals(payChannel)) {
+ record.setSeqNo(chargingOrder.getCode());
+ record.setBusiType("1");
+ record.setOriTrxDate(chargingOrder.getPayTime() == null ? LocalDate.now() : chargingOrder.getPayTime().toLocalDate());
+ record.setSubOrderId(chargingOrder.getCode());
+ }
+ if ("ICBC".equals(payChannel) && partner != null) {
+ record.setSubMerId(partner.getIcbcSubMerId());
+ record.setSubMerPrtclNo(partner.getIcbcSubMerPrtclNo());
+ }
+ boolean needOnlineShare = shouldProcessIcbcOnlineShare(icbcOnlineShareEnabled, payChannel, record.getShareAmount(), partner);
+ record.setNeedOnlineShare(needOnlineShare);
+ record.setOnlineShareStatus(needOnlineShare ? "INIT" : "RECORDED");
+ if ("ICBC".equals(payChannel) && record.getShareAmount().compareTo(BigDecimal.ZERO) > 0 && !needOnlineShare) {
+ record.setFailReason(icbcOnlineShareEnabled
+ ? "未配置完整工行二级商户参数,仅记录本地分账"
+ : "工行线上分账已关闭,仅记录本地分账");
+ }
+ record.setRetryCount(0);
+ record.setDelFlag(false);
+ return record;
+ }
- private BigDecimal getActualThirdPayAmount(TChargingOrder chargingOrder) {
- return getRefundableThirdPayAmount(chargingOrder).subtract(money(chargingOrder.getThirdRefundAmount())).max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
- }
+ private TChargingOrderShareRecord mergeChargingOrderShareRecord(TChargingOrderShareRecord exist, TChargingOrderShareRecord fresh) {
+ if (exist == null) {
+ return fresh;
+ }
+ fresh.setId(exist.getId());
+ fresh.setRetryCount(exist.getRetryCount() == null ? 0 : exist.getRetryCount());
+ fresh.setRequestJson(exist.getRequestJson());
+ fresh.setResponseJson(exist.getResponseJson());
+ fresh.setIcbcOrderId(exist.getIcbcOrderId());
+ fresh.setSubOrderSeq(exist.getSubOrderSeq());
+ fresh.setSubOrderTrxid(exist.getSubOrderTrxid());
+ fresh.setRecResult(exist.getRecResult());
+ fresh.setLastRetryTime(exist.getLastRetryTime());
+ return fresh;
+ }
- private BigDecimal getActualBalancePayAmount(TChargingOrder chargingOrder) {
- return money(chargingOrder.getBalancePayAmount()).subtract(money(chargingOrder.getBalanceRefundAmount())).max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
- }
+ private BigDecimal getActualThirdPayAmount(TChargingOrder chargingOrder) {
+ return getRefundableThirdPayAmount(chargingOrder).subtract(money(chargingOrder.getThirdRefundAmount())).max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
+ }
- private BalanceShareAmount getBalanceShareAmount(TChargingOrder chargingOrder) {
- if (chargingOrder == null || chargingOrder.getId() == null) {
- return new BalanceShareAmount(BigDecimal.ZERO, BigDecimal.ZERO);
- }
- BigDecimal fallbackBalancePay = getActualBalancePayAmount(chargingOrder);
- if (fallbackBalancePay.compareTo(BigDecimal.ZERO) <= 0) {
- return new BalanceShareAmount(BigDecimal.ZERO, BigDecimal.ZERO);
- }
- List<Map<String, Object>> rows = this.baseMapper.exchangeCodeBalanceIncomeByOrderIds(Collections.singletonList(chargingOrder.getId()));
- if (rows == null || rows.isEmpty()) {
- return new BalanceShareAmount(fallbackBalancePay, BigDecimal.ZERO);
- }
- Map<String, Object> row = rows.get(0);
- BigDecimal principalAmount = getSummaryDecimal(row, "balanceIncome").max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
- BigDecimal giftAmount = getSummaryDecimal(row, "balanceGiftIncome").max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
- BigDecimal[] normalized = normalizeBalanceShareAmounts(fallbackBalancePay, principalAmount, giftAmount);
- return new BalanceShareAmount(normalized[0], normalized[1]);
- }
+ private BigDecimal getActualBalancePayAmount(TChargingOrder chargingOrder) {
+ return money(chargingOrder.getBalancePayAmount()).subtract(money(chargingOrder.getBalanceRefundAmount())).max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
+ }
- /**
- * 余额退款流水可能在跨服务事务提交前暂时不可见,按订单净余额约束本金和赠送金额总和。
- */
- static BigDecimal[] normalizeBalanceShareAmounts(BigDecimal netBalanceAmount,
- BigDecimal principalAmount,
- BigDecimal giftAmount) {
- BigDecimal netAmount = netBalanceAmount == null ? BigDecimal.ZERO : netBalanceAmount.max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
- BigDecimal principal = principalAmount == null ? BigDecimal.ZERO : principalAmount.max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
- BigDecimal gift = giftAmount == null ? BigDecimal.ZERO : giftAmount.max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
- BigDecimal recordedTotal = principal.add(gift).setScale(2, RoundingMode.HALF_UP);
- if (netAmount.compareTo(BigDecimal.ZERO) <= 0) {
- return new BigDecimal[]{BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP), BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)};
- }
- if (recordedTotal.compareTo(BigDecimal.ZERO) <= 0) {
- return new BigDecimal[]{netAmount, BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)};
- }
- BigDecimal normalizedPrincipal = netAmount.multiply(principal)
- .divide(recordedTotal, 2, RoundingMode.HALF_UP);
- BigDecimal normalizedGift = netAmount.subtract(normalizedPrincipal).setScale(2, RoundingMode.HALF_UP);
- return new BigDecimal[]{normalizedPrincipal, normalizedGift};
- }
+ private BalanceShareAmount getBalanceShareAmount(TChargingOrder chargingOrder) {
+ if (chargingOrder == null || chargingOrder.getId() == null) {
+ return new BalanceShareAmount(BigDecimal.ZERO, BigDecimal.ZERO);
+ }
+ BigDecimal fallbackBalancePay = getActualBalancePayAmount(chargingOrder);
+ if (fallbackBalancePay.compareTo(BigDecimal.ZERO) <= 0) {
+ return new BalanceShareAmount(BigDecimal.ZERO, BigDecimal.ZERO);
+ }
+ List<Map<String, Object>> rows = this.baseMapper.exchangeCodeBalanceIncomeByOrderIds(Collections.singletonList(chargingOrder.getId()));
+ if (rows == null || rows.isEmpty()) {
+ return new BalanceShareAmount(fallbackBalancePay, BigDecimal.ZERO);
+ }
+ Map<String, Object> row = rows.get(0);
+ BigDecimal principalAmount = getSummaryDecimal(row, "balanceIncome").max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal giftAmount = getSummaryDecimal(row, "balanceGiftIncome").max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal[] normalized = normalizeBalanceShareAmounts(fallbackBalancePay, principalAmount, giftAmount);
+ return new BalanceShareAmount(normalized[0], normalized[1]);
+ }
- private BigDecimal getChargingOrderShareElectricityAmount(TChargingOrder chargingOrder) {
- if (chargingOrder == null) {
- return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
- }
- return money(chargingOrder.getElectrovalence()).add(money(chargingOrder.getWhitelistElectricRefundAmount())).setScale(2, RoundingMode.HALF_UP);
- }
+ /**
+ * 余额退款流水可能在跨服务事务提交前暂时不可见,按订单净余额约束本金和赠送金额总和。
+ */
+ static BigDecimal[] normalizeBalanceShareAmounts(BigDecimal netBalanceAmount,
+ BigDecimal principalAmount,
+ BigDecimal giftAmount) {
+ BigDecimal netAmount = netBalanceAmount == null ? BigDecimal.ZERO : netBalanceAmount.max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal principal = principalAmount == null ? BigDecimal.ZERO : principalAmount.max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal gift = giftAmount == null ? BigDecimal.ZERO : giftAmount.max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal recordedTotal = principal.add(gift).setScale(2, RoundingMode.HALF_UP);
+ if (netAmount.compareTo(BigDecimal.ZERO) <= 0) {
+ return new BigDecimal[]{BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP), BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)};
+ }
+ if (recordedTotal.compareTo(BigDecimal.ZERO) <= 0) {
+ return new BigDecimal[]{netAmount, BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)};
+ }
+ BigDecimal normalizedPrincipal = netAmount.multiply(principal)
+ .divide(recordedTotal, 2, RoundingMode.HALF_UP);
+ BigDecimal normalizedGift = netAmount.subtract(normalizedPrincipal).setScale(2, RoundingMode.HALF_UP);
+ return new BigDecimal[]{normalizedPrincipal, normalizedGift};
+ }
- private BigDecimal getChargingOrderShareServiceAmount(TChargingOrder chargingOrder) {
- if (chargingOrder == null) {
- return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
- }
- return money(chargingOrder.getServiceCharge()).add(money(chargingOrder.getWhitelistServiceRefundAmount())).setScale(2, RoundingMode.HALF_UP);
- }
+ private BigDecimal getChargingOrderShareElectricityAmount(TChargingOrder chargingOrder) {
+ if (chargingOrder == null) {
+ return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ }
+ return money(chargingOrder.getElectrovalence()).add(money(chargingOrder.getWhitelistElectricRefundAmount())).setScale(2, RoundingMode.HALF_UP);
+ }
- private BigDecimal getChargingOrderShareBaseAmount(TChargingOrder chargingOrder) {
- return getChargingOrderShareElectricityAmount(chargingOrder).add(getChargingOrderShareServiceAmount(chargingOrder)).setScale(2, RoundingMode.HALF_UP);
- }
+ private BigDecimal getChargingOrderShareServiceAmount(TChargingOrder chargingOrder) {
+ if (chargingOrder == null) {
+ return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ }
+ return money(chargingOrder.getServiceCharge()).add(money(chargingOrder.getWhitelistServiceRefundAmount())).setScale(2, RoundingMode.HALF_UP);
+ }
- private String resolveThirdPayChannel(TChargingOrder chargingOrder) {
- if ("ICBC".equals(chargingOrder.getSourceName())) {
- return "ICBC";
- }
- if (Integer.valueOf(1).equals(chargingOrder.getRechargePaymentType())) {
- return "WECHAT";
- }
- if (Integer.valueOf(2).equals(chargingOrder.getRechargePaymentType()) || Integer.valueOf(3).equals(chargingOrder.getRechargePaymentType())) {
- return "ALIPAY";
- }
- return "OTHER";
- }
+ private BigDecimal getChargingOrderShareBaseAmount(TChargingOrder chargingOrder) {
+ return getChargingOrderShareElectricityAmount(chargingOrder).add(getChargingOrderShareServiceAmount(chargingOrder)).setScale(2, RoundingMode.HALF_UP);
+ }
- private void processIcbcOnlineShare(TChargingOrderShareRecord record, Partner partner) {
- try {
- String invalidReason = validateIcbcShareRecord(record, partner);
- if (StringUtils.hasLength(invalidReason)) {
- markChargingOrderShare(record, "FAIL", invalidReason);
- return;
- }
- IcbcSubOrderSplitReq req = buildIcbcSubOrderSplitReq(record);
- record.setRequestJson(JSON.toJSONString(req));
- record.setOnlineShareStatus("PROCESSING");
- record.setRetryCount(record.getRetryCount() == null ? 1 : record.getRetryCount() + 1);
- record.setLastRetryTime(LocalDateTime.now());
- saveOrUpdateChargingOrderShareRecord(record);
+ private String resolveThirdPayChannel(TChargingOrder chargingOrder) {
+ if ("ICBC".equals(chargingOrder.getSourceName())) {
+ return "ICBC";
+ }
+ if (Integer.valueOf(1).equals(chargingOrder.getRechargePaymentType())) {
+ return "WECHAT";
+ }
+ if (Integer.valueOf(2).equals(chargingOrder.getRechargePaymentType()) || Integer.valueOf(3).equals(chargingOrder.getRechargePaymentType())) {
+ return "ALIPAY";
+ }
+ return "OTHER";
+ }
- R<IcbcSubOrderSplitResp> result = icbcPaymentClient.splitSubOrder(req);
- IcbcSubOrderSplitResp resp = result == null ? null : result.getData();
- record.setResponseJson(resp == null ? (result == null ? null : JSON.toJSONString(result)) : resp.getRawResponse());
- if (result == null || result.getCode() != 200 || resp == null) {
- markChargingOrderShare(record, "FAIL", result == null ? "工行拆分接口无响应" : result.getMsg());
- return;
- }
- record.setIcbcOrderId(resp.getOrderId());
- record.setSubOrderSeq(resp.getSubOrderSeq());
- record.setSubOrderTrxid(resp.getSubOrderTrxid());
- record.setRecResult(resp.getRecResult());
- if ("SUCCESS".equals(resp.getStatus()) && ("0".equals(resp.getRecResult()) || !StringUtils.hasLength(resp.getRecResult()))) {
- markChargingOrderShare(record, "SUCCESS", null);
- } else {
- markChargingOrderShare(record, "FAIL", "工行拆分未成功:" + firstNotBlank(resp.getRecResult(), resp.getStatus()));
- }
- } catch (Exception e) {
- log.error("工行线上分账处理失败,订单号:{},渠道:{}", record == null ? null : record.getChargingOrderCode(), record == null ? null : record.getPayChannel(), e);
- if (record != null) {
- markChargingOrderShare(record, "FAIL", firstNotBlank(e.getMessage(), "工行线上分账处理异常"));
- }
- }
- }
+ private void processIcbcOnlineShare(TChargingOrderShareRecord record, Partner partner) {
+ try {
+ String invalidReason = validateIcbcShareRecord(record, partner);
+ if (StringUtils.hasLength(invalidReason)) {
+ markChargingOrderShare(record, "FAIL", invalidReason);
+ return;
+ }
+ IcbcSubOrderSplitReq req = buildIcbcSubOrderSplitReq(record);
+ record.setRequestJson(JSON.toJSONString(req));
+ record.setOnlineShareStatus("PROCESSING");
+ record.setRetryCount(record.getRetryCount() == null ? 1 : record.getRetryCount() + 1);
+ record.setLastRetryTime(LocalDateTime.now());
+ saveOrUpdateChargingOrderShareRecord(record);
- private void recordChargingOrderShareFailure(TChargingOrder chargingOrder, Site site, Exception e) {
- try {
- if (chargingOrder == null || !"ICBC".equals(chargingOrder.getSourceName()) || getActualThirdPayAmount(chargingOrder).compareTo(BigDecimal.ZERO) <= 0) {
- return;
- }
- TChargingOrderShareRecord record = chargingOrderShareRecordMapper.selectOne(new LambdaQueryWrapper<TChargingOrderShareRecord>()
- .eq(TChargingOrderShareRecord::getChargingOrderCode, chargingOrder.getCode())
- .eq(TChargingOrderShareRecord::getPayChannel, "ICBC")
- .eq(TChargingOrderShareRecord::getDelFlag, false)
- .last("limit 1"));
- if (record == null) {
- BigDecimal actualThirdPay = getActualThirdPayAmount(chargingOrder);
- BigDecimal actualTotalPay = actualThirdPay.add(getBalanceShareAmount(chargingOrder).getPrincipalAmount()).setScale(2, RoundingMode.HALF_UP);
- BigDecimal shareElectricityAmount = getChargingOrderShareElectricityAmount(chargingOrder);
- BigDecimal shareServiceAmount = getChargingOrderShareServiceAmount(chargingOrder);
- record = buildChargingOrderShareRecord(chargingOrder, site, null, "ICBC", actualThirdPay, BigDecimal.ZERO,
- actualTotalPay.compareTo(BigDecimal.ZERO) > 0 ? actualTotalPay : actualThirdPay, shareElectricityAmount, shareServiceAmount);
- }
- record.setNeedOnlineShare(true);
- markChargingOrderShare(record, "FAIL", firstNotBlank(e.getMessage(), "充电订单分账记录触发异常"));
- } catch (Exception ex) {
- log.error("充电订单分账失败补偿记录落库失败,订单号:{}", chargingOrder == null ? null : chargingOrder.getCode(), ex);
- }
- }
+ R<IcbcSubOrderSplitResp> result = icbcPaymentClient.splitSubOrder(req);
+ IcbcSubOrderSplitResp resp = result == null ? null : result.getData();
+ record.setResponseJson(resp == null ? (result == null ? null : JSON.toJSONString(result)) : resp.getRawResponse());
+ if (result == null || result.getCode() != 200 || resp == null) {
+ markChargingOrderShare(record, "FAIL", result == null ? "工行拆分接口无响应" : result.getMsg());
+ return;
+ }
+ record.setIcbcOrderId(resp.getOrderId());
+ record.setSubOrderSeq(resp.getSubOrderSeq());
+ record.setSubOrderTrxid(resp.getSubOrderTrxid());
+ record.setRecResult(resp.getRecResult());
+ if ("SUCCESS".equals(resp.getStatus()) && ("0".equals(resp.getRecResult()) || !StringUtils.hasLength(resp.getRecResult()))) {
+ markChargingOrderShare(record, "SUCCESS", null);
+ } else {
+ markChargingOrderShare(record, "FAIL", "工行拆分未成功:" + firstNotBlank(resp.getRecResult(), resp.getStatus()));
+ }
+ } catch (Exception e) {
+ log.error("工行线上分账处理失败,订单号:{},渠道:{}", record == null ? null : record.getChargingOrderCode(), record == null ? null : record.getPayChannel(), e);
+ if (record != null) {
+ markChargingOrderShare(record, "FAIL", firstNotBlank(e.getMessage(), "工行线上分账处理异常"));
+ }
+ }
+ }
- private String validateIcbcShareRecord(TChargingOrderShareRecord record, Partner partner) {
- if (partner == null) {
- return "站点未配置合作商,无法工行拆分";
- }
- if (partner.getElectricityShareRatio() == null && partner.getServiceShareRatio() == null) {
- return "合作商未配置分成比例,跳过工行拆分";
- }
- if (!StringUtils.hasLength(partner.getIcbcSubMerId())) {
- return "合作商未配置工行二级商户编号";
- }
- if (!StringUtils.hasLength(partner.getIcbcSubMerPrtclNo())) {
- return "合作商未配置工行二级商户协议编号";
- }
- if (money(record.getShareAmount()).compareTo(BigDecimal.ZERO) <= 0) {
- return "工行拆分金额为0";
- }
- return null;
- }
+ private void recordChargingOrderShareFailure(TChargingOrder chargingOrder, Site site, Exception e) {
+ try {
+ if (chargingOrder == null || !"ICBC".equals(chargingOrder.getSourceName()) || getActualThirdPayAmount(chargingOrder).compareTo(BigDecimal.ZERO) <= 0) {
+ return;
+ }
+ TChargingOrderShareRecord record = chargingOrderShareRecordMapper.selectOne(new LambdaQueryWrapper<TChargingOrderShareRecord>()
+ .eq(TChargingOrderShareRecord::getChargingOrderCode, chargingOrder.getCode())
+ .eq(TChargingOrderShareRecord::getPayChannel, "ICBC")
+ .eq(TChargingOrderShareRecord::getDelFlag, false)
+ .last("limit 1"));
+ if (record == null) {
+ BigDecimal actualThirdPay = getActualThirdPayAmount(chargingOrder);
+ BigDecimal actualTotalPay = actualThirdPay.add(getBalanceShareAmount(chargingOrder).getPrincipalAmount()).setScale(2, RoundingMode.HALF_UP);
+ BigDecimal shareElectricityAmount = getChargingOrderShareElectricityAmount(chargingOrder);
+ BigDecimal shareServiceAmount = getChargingOrderShareServiceAmount(chargingOrder);
+ record = buildChargingOrderShareRecord(chargingOrder, site, null, "ICBC", actualThirdPay, BigDecimal.ZERO,
+ actualTotalPay.compareTo(BigDecimal.ZERO) > 0 ? actualTotalPay : actualThirdPay, shareElectricityAmount, shareServiceAmount);
+ }
+ record.setNeedOnlineShare(true);
+ markChargingOrderShare(record, "FAIL", firstNotBlank(e.getMessage(), "充电订单分账记录触发异常"));
+ } catch (Exception ex) {
+ log.error("充电订单分账失败补偿记录落库失败,订单号:{}", chargingOrder == null ? null : chargingOrder.getCode(), ex);
+ }
+ }
- private BigDecimal calculateShareAmount(BigDecimal amount, BigDecimal ratio) {
- if (amount == null || ratio == null) {
- return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
- }
- return amount.multiply(ratio).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
- }
+ private String validateIcbcShareRecord(TChargingOrderShareRecord record, Partner partner) {
+ if (partner == null) {
+ return "站点未配置合作商,无法工行拆分";
+ }
+ if (partner.getElectricityShareRatio() == null && partner.getServiceShareRatio() == null) {
+ return "合作商未配置分成比例,跳过工行拆分";
+ }
+ if (!StringUtils.hasLength(partner.getIcbcSubMerId())) {
+ return "合作商未配置工行二级商户编号";
+ }
+ if (!StringUtils.hasLength(partner.getIcbcSubMerPrtclNo())) {
+ return "合作商未配置工行二级商户协议编号";
+ }
+ if (money(record.getShareAmount()).compareTo(BigDecimal.ZERO) <= 0) {
+ return "工行拆分金额为0";
+ }
+ return null;
+ }
- static boolean shouldProcessIcbcOnlineShare(String payChannel, BigDecimal shareAmount, Partner partner) {
- return shouldProcessIcbcOnlineShare(true, payChannel, shareAmount, partner);
- }
+ private BigDecimal calculateShareAmount(BigDecimal amount, BigDecimal ratio) {
+ if (amount == null || ratio == null) {
+ return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ }
+ return amount.multiply(ratio).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+ }
- static boolean shouldProcessIcbcOnlineShare(boolean onlineShareEnabled, String payChannel, BigDecimal shareAmount, Partner partner) {
- return onlineShareEnabled
- && "ICBC".equals(payChannel)
- && shareAmount != null
- && shareAmount.compareTo(BigDecimal.ZERO) > 0
- && partner != null
- && StringUtils.hasLength(partner.getIcbcSubMerId())
- && StringUtils.hasLength(partner.getIcbcSubMerPrtclNo());
- }
+ static boolean shouldProcessIcbcOnlineShare(String payChannel, BigDecimal shareAmount, Partner partner) {
+ return shouldProcessIcbcOnlineShare(true, payChannel, shareAmount, partner);
+ }
- private IcbcSubOrderSplitReq buildIcbcSubOrderSplitReq(TChargingOrderShareRecord record) {
- IcbcSubOrderSplitReq req = new IcbcSubOrderSplitReq();
- req.setChargingOrderCode(record.getChargingOrderCode());
- req.setSeqNo(record.getSeqNo());
- req.setBusiType(record.getBusiType());
- req.setOriMerId(record.getOriMerId());
- req.setOriTrxDate(record.getOriTrxDate() == null ? null : record.getOriTrxDate().toString());
- req.setSubOrderId(record.getSubOrderId());
- req.setSubMerId(record.getSubMerId());
- req.setSubMerPrtclNo(record.getSubMerPrtclNo());
- req.setClassifyAmt(record.getShareAmount());
- req.setMerSpInfor("充电订单分账:" + record.getChargingOrderCode());
- return req;
- }
+ static boolean shouldProcessIcbcOnlineShare(boolean onlineShareEnabled, String payChannel, BigDecimal shareAmount, Partner partner) {
+ return onlineShareEnabled
+ && "ICBC".equals(payChannel)
+ && shareAmount != null
+ && shareAmount.compareTo(BigDecimal.ZERO) > 0
+ && partner != null
+ && StringUtils.hasLength(partner.getIcbcSubMerId())
+ && StringUtils.hasLength(partner.getIcbcSubMerPrtclNo());
+ }
- private void markChargingOrderShare(TChargingOrderShareRecord record, String status, String reason) {
- record.setOnlineShareStatus(status);
- record.setFailReason(reason);
- saveOrUpdateChargingOrderShareRecord(record);
- }
+ private IcbcSubOrderSplitReq buildIcbcSubOrderSplitReq(TChargingOrderShareRecord record) {
+ IcbcSubOrderSplitReq req = new IcbcSubOrderSplitReq();
+ req.setChargingOrderCode(record.getChargingOrderCode());
+ req.setSeqNo(record.getSeqNo());
+ req.setBusiType(record.getBusiType());
+ req.setOriMerId(record.getOriMerId());
+ req.setOriTrxDate(record.getOriTrxDate() == null ? null : record.getOriTrxDate().toString());
+ req.setSubOrderId(record.getSubOrderId());
+ req.setSubMerId(record.getSubMerId());
+ req.setSubMerPrtclNo(record.getSubMerPrtclNo());
+ req.setClassifyAmt(record.getShareAmount());
+ req.setMerSpInfor("充电订单分账:" + record.getChargingOrderCode());
+ return req;
+ }
- private void saveOrUpdateChargingOrderShareRecord(TChargingOrderShareRecord record) {
- if (record.getId() == null) {
- chargingOrderShareRecordMapper.insert(record);
- } else {
- chargingOrderShareRecordMapper.updateById(record);
- }
- }
+ private void markChargingOrderShare(TChargingOrderShareRecord record, String status, String reason) {
+ record.setOnlineShareStatus(status);
+ record.setFailReason(reason);
+ saveOrUpdateChargingOrderShareRecord(record);
+ }
- private String buildIcbcProfitSharing(Site site) {
- if (site == null || site.getPartnerId() == null) {
- return null;
- }
- R<Partner> partnerResult = partnerClient.getPartnerById(site.getPartnerId());
- Partner partner = partnerResult == null ? null : partnerResult.getData();
- if (partner == null || !StringUtils.hasLength(partner.getIcbcSubMerId()) || !StringUtils.hasLength(partner.getIcbcSubMerPrtclNo())) {
- return null;
- }
- if (partner.getElectricityShareRatio() == null && partner.getServiceShareRatio() == null) {
- return null;
- }
- JSONObject data = new JSONObject();
- data.put("icbcPartnerId", partner.getIcbcPartnerId());
- data.put("icbcSubMerId", partner.getIcbcSubMerId());
- data.put("icbcSubMerPrtclNo", partner.getIcbcSubMerPrtclNo());
- if (partner.getElectricityShareRatio() != null) {
- data.put("electricityShareRatio", partner.getElectricityShareRatio());
- }
- if (partner.getServiceShareRatio() != null) {
- data.put("serviceShareRatio", partner.getServiceShareRatio());
- }
- return data.toJSONString();
- }
+ private void saveOrUpdateChargingOrderShareRecord(TChargingOrderShareRecord record) {
+ if (record.getId() == null) {
+ chargingOrderShareRecordMapper.insert(record);
+ } else {
+ chargingOrderShareRecordMapper.updateById(record);
+ }
+ }
- private static class BalanceShareAmount {
- private final BigDecimal principalAmount;
- private final BigDecimal giftAmount;
+ private String buildIcbcProfitSharing(Site site) {
+ if (site == null || site.getPartnerId() == null) {
+ return null;
+ }
+ R<Partner> partnerResult = partnerClient.getPartnerById(site.getPartnerId());
+ Partner partner = partnerResult == null ? null : partnerResult.getData();
+ if (partner == null || !StringUtils.hasLength(partner.getIcbcSubMerId()) || !StringUtils.hasLength(partner.getIcbcSubMerPrtclNo())) {
+ return null;
+ }
+ if (partner.getElectricityShareRatio() == null && partner.getServiceShareRatio() == null) {
+ return null;
+ }
+ JSONObject data = new JSONObject();
+ data.put("icbcPartnerId", partner.getIcbcPartnerId());
+ data.put("icbcSubMerId", partner.getIcbcSubMerId());
+ data.put("icbcSubMerPrtclNo", partner.getIcbcSubMerPrtclNo());
+ if (partner.getElectricityShareRatio() != null) {
+ data.put("electricityShareRatio", partner.getElectricityShareRatio());
+ }
+ if (partner.getServiceShareRatio() != null) {
+ data.put("serviceShareRatio", partner.getServiceShareRatio());
+ }
+ return data.toJSONString();
+ }
- private BalanceShareAmount(BigDecimal principalAmount, BigDecimal giftAmount) {
- this.principalAmount = principalAmount == null ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : principalAmount.setScale(2, RoundingMode.HALF_UP);
- this.giftAmount = giftAmount == null ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : giftAmount.setScale(2, RoundingMode.HALF_UP);
- }
+ private static class BalanceShareAmount {
+ private final BigDecimal principalAmount;
+ private final BigDecimal giftAmount;
- private BigDecimal getPrincipalAmount() {
- return principalAmount;
- }
+ private BalanceShareAmount(BigDecimal principalAmount, BigDecimal giftAmount) {
+ this.principalAmount = principalAmount == null ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : principalAmount.setScale(2, RoundingMode.HALF_UP);
+ this.giftAmount = giftAmount == null ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : giftAmount.setScale(2, RoundingMode.HALF_UP);
+ }
- private BigDecimal getGiftAmount() {
- return giftAmount;
- }
- }
+ private BigDecimal getPrincipalAmount() {
+ return principalAmount;
+ }
- private String firstNotBlank(String... values) {
- for (String value : values) {
- if (StringUtils.hasLength(value)) {
- return value;
- }
- }
- return "";
- }
+ private BigDecimal getGiftAmount() {
+ return giftAmount;
+ }
+ }
+
+ private String firstNotBlank(String... values) {
+ for (String value : values) {
+ if (StringUtils.hasLength(value)) {
+ return value;
+ }
+ }
+ return "";
+ }
}
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
index deb7f3a..622b043 100644
--- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.order.mapper.TChargingOrderMapper">
@@ -2344,17 +2344,12 @@
b.id,
CASE WHEN count(a.id) > 0 THEN (UNIX_TIMESTAMP(MAX(b.end_time)) - UNIX_TIMESTAMP(MAX(b.start_time))) ELSE 0 END as time,
sum(a.charging_capacity) as total,
- sum(CASE WHEN b.refund_status = 2 THEN 0 ELSE a.period_electric_price END) as electronicMoney,
+ sum(a.period_electric_price) as electronicMoney,
sum(CASE
- WHEN b.refund_status = 2 THEN 0
WHEN b.order_source = 1 THEN a.period_service_price
ELSE a.period_service_price * 0.8
END) as serviceMoney,
- sum(CASE
- WHEN b.refund_status = 2 THEN 0
- ELSE a.period_electric_price
- + CASE WHEN b.order_source = 1 THEN a.period_service_price ELSE a.period_service_price * 0.8 END
- END) as income,
+ sum(a.period_electric_price + CASE WHEN b.order_source = 1 THEN a.period_service_price ELSE a.period_service_price * 0.8 END) as income,
MAX(b.recharge_payment_type) as recharge_payment_type,
MAX(b.is_whitelist) as is_whitelist,
MAX(b.electrovalence) as electrovalence,
--
Gitblit v1.7.1