puzhibing
4 天以前 3650ce7f5d42d1bef58abea9693f20d1f209d3b0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package com.ruoyi.order.service;
 
import com.ruoyi.common.core.web.page.PageInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.api.dto.DeviceStartChargingDTO;
import com.ruoyi.order.api.model.TCardChargingOrder;
import com.ruoyi.order.api.query.CardBalanceDetailQuery;
import com.ruoyi.order.api.query.CardChargingOrderQuery;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import com.ruoyi.order.api.vo.CardBalanceDetailVO;
import com.ruoyi.order.api.vo.ChargingOrderVO;
import com.ruoyi.order.api.vo.DeviceStartChargingVO;
import com.ruoyi.order.api.vo.PlatformStartChargingReplyMessageVO;
import com.ruoyi.order.api.vo.TransactionRecordMessageVO;
 
import java.util.List;
import java.util.Map;
 
public interface TCardChargingOrderService extends IService<TCardChargingOrder> {
 
    PageInfo<ChargingOrderVO> pageList(CardChargingOrderQuery query);
 
    /**
     * 按查询条件导出全部刷卡充电订单(不分页)
     */
    List<ChargingOrderVO> exportList(CardChargingOrderQuery query);
 
    Map<String, Object> summary(CardChargingOrderQuery query);
 
    Map<String, Object> detail(Long chargingOrderId);
 
    List<Map<String, Object>> balanceIncomeDetail(CardChargingOrderQuery query);
 
    List<Map<String, Object>> accountingStrategyList(Long chargingOrderId);
 
    PageInfo<CardBalanceDetailVO> balanceDetailPage(CardBalanceDetailQuery query);
 
    Map<String, Object> balanceDetailSummary(CardBalanceDetailQuery query);
 
    List<CardBalanceDetailVO> balanceDetailExport(CardBalanceDetailQuery query);
 
    // ===== 设备侧刷卡充电链路(V0.2 刷卡充电) =====
 
    /**
     * 设备主动发起刷卡充电:卡片鉴权 -> 建单(状态2) -> 策略快照 -> 锁卡;
     * 锁卡失败回滚删除订单并返回失败原因4。
     */
    DeviceStartChargingVO startCardCharging(DeviceStartChargingDTO dto);
 
    /**
     * 根据订单编号查询刷卡充电订单(SD前缀)
     */
    TCardChargingOrder getCardOrderByCode(String code);
 
    /**
     * 刷卡订单收到桩启动应答:成功(结果1)置为充电中;失败置为启动失败并解锁卡片、复位枪
     */
    void cardStartChargeSuccessfully(PlatformStartChargingReplyMessageVO vo);
 
    /**
     * 刷卡订单充电握手处理:回写实际VIN;仅订单状态为启动中(2)时推进为充电中(3)、
     * 补开始时间、置枪充电中并推监管(其余状态幂等跳过,不复活已关单)
     */
    boolean handleHandshakeVin(String orderCode, String vin);
 
    /**
     * 刷卡订单实时监控数据更新(首次数据将订单置为充电中)
     */
    void cardChargeMonitoring(UploadRealTimeMonitoringDataQuery query);
 
    /**
     * 刷卡订单充电结束(设备自动结束/异常终止时更新结束方式)
     */
    void cardEndCharge(String orderCode, Integer endMode);
 
    /**
     * 刷卡订单最终结算(统一结算入口,SD):
     * 订单号结算锁 -> 幂等(状态5跳过) -> 分时电量按快照计价 -> 写计费明细 -> 更新订单(状态5,允许负余额)
     * -> 卡账户扣款(幂等) -> 解锁卡片 -> 复位枪
     */
    R cardEndChargeBillingCharge(TransactionRecordMessageVO vo);
 
    // ===== 定时补偿(文档13.3:异常断电/补账场景,走统一结算入口) =====
 
    /**
     * 查询启动超时(状态2超过阈值未收到启动成功应答)的刷卡订单
     */
    List<TCardChargingOrder> listTimeoutStartingOrders();
 
    /**
     * 查询充电中的刷卡订单,由定时任务结合 Mongo 交易记录和实时数据判断是否补偿
     */
    List<TCardChargingOrder> listTimeoutChargingOrders();
 
    /**
     * 扫描已结束但没有充电扣款流水的刷卡订单,条件回退为停止中等待重新结算。
     *
     * @return 本轮成功回退的订单数量
     */
    int recoverFinishedOrdersWithoutDeduct();
 
    /**
     * 启动超时关单:仅当前状态仍为启动中时置为启动失败(-1),解锁卡片并复位充电枪
     */
    void closeTimeoutStartingOrder(TCardChargingOrder order);
 
    /**
     * 无完整设备交易记录且实时数据静默超时时,以订单累计电量构造平段账单,复用统一结算入口
     */
    void compensationSettle(TCardChargingOrder order);
}