预定

sequenceDiagram
    actor 用户 as 用户
    participant Vue Service as Vue Service
    participant Golang Service as Golang Service
    participant Mysql Cluster as Mysql Cluster
    participant EMQX as EMQX
    participant Data Source Processor as Data Source Processor
    
    Data Source Processor  -->> EMQX : 发送停车位状态
    EMQX -->>  Mysql Cluster  : 更新停车位状态

    用户->>Vue Service: 发起停车位预定请求
    Vue Service ->>Golang Service: 提交预定请求

   
    alt 有空闲停车位
        Golang Service ->> Mysql Cluster : 查询数据
        Mysql Cluster -->> Golang Service : 返回结果
        Golang Service-->>Vue Service: 显示停车位可预定
        Vue Service-->>用户: 显示预定成功
        用户->>Data Source Processor : 用户驾驶汽车到达停车位
        Data Source Processor-->>EMQX: 发送停车位状态
        EMQX-->>  Mysql Cluster: 更新停车位状态
    else 无空闲停车位
        Golang Service ->> Mysql Cluster : 查询数据
        Mysql Cluster -->> Golang Service : 返回结果
        Golang Service-->>Vue Service: 停车位不可预定
        Vue Service-->>用户: 显示不可预定
    end

结算

sequenceDiagram
    actor 用户 as 用户
    participant Data Source Processor as Data Source Processor
    participant EMQX as EMQX
    participant Mysql Cluster as Mysql Cluster 
    participant Golang Service  as Golang Service 

    用户->>Data Source Processor: 进入停车场
    Data Source Processor->>EMQX : 发布车辆入场消息到 parking/entry
    EMQX-->>Mysql Cluster : 插入车辆入场信息

   EMQX->>Golang Service : 触发服务判断车位是否预定
    alt 预定了车位
        Golang Service -->>Mysql Cluster : 更新订单状态为完成
    else 未预定
        Note over Golang Service ,Mysql Cluster : 无需操作
    end
   

    Note over 用户,Mysql Cluster : 车辆在停车场停留
    
    用户->>Data Source Processor: 离开停车场
    Data Source Processor->>EMQX : 发布车辆出场消息到parking/exit
    EMQX-->>Mysql Cluster : 更新车辆出场信息
  
    
    EMQX->>Golang Service : 触发费用结算
    Golang Service ->> 用户: 通知费用计算结果
    用户->> Golang Service : 发起支付请求
    Golang Service ->>Mysql Cluster: 更新支付状态
    Mysql Cluster -->>Golang Service : 确认支付已记录
    Golang Service -->>用户: 发送支付结果