vbea преди 1 година
родител
ревизия
91a5111df5
променени са 1 файла, в които са добавени 473 реда и са изтрити 0 реда
  1. 473 0
      WebApp-Lite/pages/charge/index.vue

+ 473 - 0
WebApp-Lite/pages/charge/index.vue

@@ -0,0 +1,473 @@
+<template>
+  <view class="container fixed">
+    <view class="toolbar" v-if="chargeInfo">
+      <view class="tool-title">Charge</view>
+      <view class="tool-desc" v-if="chargeInfo.chargeBoxId">{{chargeInfo.chargeBoxId + "-" + chargeInfo.connectorId}}</view>
+      <view class="tool-desc" v-else>-</view>
+    </view>
+    <header-view
+      title="Insert Charging Cable"
+      :status="connectorInfo.status"
+      :isLoading="isLoading"/>
+    <info-view
+      :info="connectorInfo"
+      :isLoading="isLoading"/>
+    <payment-view
+      v-if="connectorInfo.status == 'Preparing'"
+      :status="connectorInfo.paymentStatus"/>
+    <divide size="36"/>
+    <view class="bottom-button">
+      <button
+        v-if="connectorInfo.status == 'Initiating'"
+        class="ui-button margin0"
+        type="primary"
+        @click="onStart"
+        :disabled="!connectorInfo.shouldClickStart">START CHARGING</button>
+      <button
+        v-else-if="connectorInfo.status == 'Charging'"
+        class="ui-button margin0"
+        type="primary"
+        @click="stopCharge">INPUT PIN TO STOP CHARGING</button>
+      <button
+        v-else-if="connectorInfo.status == 'Finishing'"
+        class="ui-button margin0"
+        type="primary"
+        disabled>STOP CHARGING</button>
+      <template v-else-if="connectorInfo.status == 'Preparing'">
+        <button
+          class="ui-button margin0"
+          type="primary"
+          @click="onStart"
+          v-if="connectorInfo.paymentStatus == 'PAID'">START CHARGING</button>
+        <button
+          class="ui-button margin0"
+          type="primary"
+          @click="onPayment"
+          v-else>
+          <view class="flexcc">
+            <text>MAKE PAYMENT</text>
+            <view class="icon-key" v-if="password.length == 0">
+              <i-icon name="key-fill" size="32rpx" color="#333"/>
+            </view>
+          </view>
+        </button>
+      </template>
+      <button
+        v-else-if="connectorInfo.status == 'Available' && isLoading"
+        class="ui-button margin0"
+        type="cancel"
+        @click="cancelAuth">CANCEL</button>
+      <button
+        v-else
+        class="ui-button margin0"
+        type="primary"
+        @click="onAuthentic"
+        :disabled="connectorInfo.status != 'Available' || isLoading">
+        <view class="flexcc">
+          <text>AUTHENTICATE</text>
+          <view class="icon-key" v-if="password.length == 0">
+            <i-icon name="key-fill" size="32rpx" color="#333"/>
+          </view>
+        </view>
+      </button>
+    </view>
+    <PasswordView
+      :visible="showPin || stopPin"
+      :verify="stopPin"
+      @change="changePassword"/>
+  </view>
+</template>
+<script>
+import HeaderView from './views/HeaderView.vue';
+import InfoView from './views/InfoView.vue';
+import PaymentView from './views/PaymentView.vue';
+import PasswordView from '@/components/PasswordView.vue';
+import apiCharge from '@/api/apiCharge';
+import {openUrl} from '@/utils/utils.js';
+import settings from '../../settings';
+import auth from '../../utils/auth';
+
+export default {
+  data() {
+    return {
+      refreshId: 0,
+      isLoading: false,
+      waitPayment: false,
+      isPaymentFailed: false,
+      chargeInfo: {
+        chargeBoxId: "",
+        connectorId: ""
+      },
+      connectorInfo: {},
+      stoped: false,
+      creditHistoryPk: "",
+      chargingPk: "",
+      paymentId:"",
+      showPin: false,
+      stopPin: false,
+      password: ""
+    }
+  },
+  components: {
+    HeaderView,
+    InfoView,
+    PaymentView,
+    PasswordView
+  },
+  onLoad(query) {
+    if (query.pk) {
+      this.paymentId = query.pk;
+    }
+    if (query.info) {
+      this.chargeInfo = JSON.parse(decodeURIComponent(query.info));
+    } /*else {
+      this.waitPayment = getApp().globalData.waitPayment;
+      let id = auth.getPaymentId();
+      if (id) {
+        this.paymentId = id;
+      }
+    }*/
+    if (!query.pk && !query.info) {
+      uni.reLaunch({
+        url: "/pages/index/index"
+      });
+      return;
+    }
+    this.refreshStatus(500);
+  },
+  methods: {
+    refreshStatus(time=2000) {
+      this.refreshId += 1;
+      setTimeout(() => {
+        if (this.stoped) {
+          return;
+        }
+        if (this.paymentId) {
+          this.getChargingStatus(this.refreshId);
+        } else if (this.chargeInfo.connectorId) {
+          this.getChargerInfo(this.refreshId)
+        }
+      }, time);
+    },
+    getChargerInfo(id) {
+      if (id !== this.refreshId) {
+        return;
+      }
+      apiCharge.getChargerDetails(this.chargeInfo).then(res => {
+        if (res.data) {
+          this.connectorInfo = res.data;
+          this.showPageWithStatus()
+        }
+      }).catch(err => {
+        uni.showModal({
+          title: "Error",
+          content: err,
+          confirmText: "OK",
+          showCancel: false,
+          success: res => {
+            if (res.confirm) {
+              uni.navigateBack();
+            }
+          }
+        })
+      }).finally(() => {
+        uni.stopPullDownRefresh();
+      })
+    },
+    getChargingStatus(id) {
+      if (id !== this.refreshId) {
+        return;
+      }
+      apiCharge.getChargingDetails({
+        creditHistoryPk: this.paymentId
+      }).then(res => {
+        if (res.data) {
+          this.connectorInfo = res.data;
+          if (res.data.creditHistoryPk) {
+            this.createPayment(res.data.creditHistoryPk);
+          }
+          if (!this.chargeInfo.chargeBoxId && res.data.chargeBoxId) {
+            this.chargeInfo.chargeBoxId = res.data.chargeBoxId;
+            this.chargeInfo.connectorId = res.data.connectorId;
+          }
+          this.showPageWithStatus()
+        }
+      }).catch(err => {
+        /*uni.showToast({
+          icon: "none",
+          title: err
+        })*/
+        uni.showModal({
+          title: "Error",
+          content: err,
+          confirmText: "OK",
+          showCancel: false,
+          success: res => {
+            if (res.confirm) {
+              uni.navigateBack();
+            }
+          }
+        })
+      }).finally(() => {
+        uni.stopPullDownRefresh();
+      })
+    },
+    showPageWithStatus() {
+      //this.connectorInfo.status = "Available"
+      switch (this.connectorInfo.status) {
+        case "Available":
+          if (this.isLoading) {
+            this.refreshStatus(3000);
+          }
+          break;
+        case "Preparing":
+          this.isLoading = false;
+          if (this.connectorInfo.paymentStatus == "FAILED") {
+            this.isPaymentFailed = true;
+          }
+          break;
+        case "Initiating":
+          if (this.isLoading || this.waitPayment) {
+            this.refreshStatus(3000);
+          } else {
+            this.isLoading = true;
+            this.refreshStatus(3000);
+          }
+          break;
+        case "Charging":
+          if (this.waitPayment) {
+            this.isLoading = true;
+            this.waitPayment = false;
+            getApp().globalData.waitPayment = false;
+            this.refreshStatus(3000);
+          } else {
+            this.isLoading = false;
+            this.refreshStatus(10000);
+          }
+          break;
+        case "Finishing":
+          if (this.connectorInfo.chargingPk) {
+            this.chargingPk = this.connectorInfo.chargingPk;
+            this.toReceipt();
+          } else {
+            this.refreshStatus(5000);
+            //uni.navigateBack();
+          }
+          break;
+        default:
+          this.refreshId = 0;
+          this.isLoading = false;
+          break;
+      }
+      uni.hideLoading();
+    },
+    changePassword(psd) {
+      this.password = psd;
+      if (this.stopPin) {
+        this.stopPin = false;
+        this.onStop();
+      } else {
+        this.showPin = false;
+        this.onAuthentic();
+      }
+    },
+    refreshPayment() {
+      uni.showLoading({
+        title: "Waiting..."
+      });
+      this.getChargingStatus();
+    },
+    onAuthentic() {
+      if (this.password) {
+        this.isLoading = true;
+        this.refreshStatus();
+      } else {
+        this.showPin = true;
+      }
+    },
+    cancelAuth() {
+      this.isLoading = false;
+    },
+    onPayment() {
+      if (!this.password) {
+        this.showPin = true;
+        return;
+      }
+      uni.showLoading({
+        title: "Waiting..."
+      })
+      apiCharge.makePayment({
+        ...this.chargeInfo,
+        pin: this.password
+      }).then(res => {
+        if (res.data.creditHistoryPk) {
+          this.createPayment(res.data.creditHistoryPk);
+        }
+        if (res.data.webPaymentUrl) {
+          openUrl(res.data.webPaymentUrl);
+        }
+      }).catch(err => {
+        uni.showModal({
+          title: "Error",
+          content: err,
+          confirmText: "OK",
+          showCancel: false,
+        })
+        /*uni.showToast({
+          icon: "none",
+          title: err
+        })*/
+      }).finally(() => {
+        uni.hideLoading();
+      });
+    },
+    onStart() {
+      this.isLoading = true;
+      uni.showLoading({
+        title: "Loading..."
+      })
+      apiCharge.startCharge({
+        //connectorPk: this.connectorPk,
+        creditHistoryPk: this.paymentId
+      }).then(res => {
+        this.refreshStatus();
+        if (res.msg) {
+          uni.showToast({
+            icon: "none",
+            title: res.msg
+          })
+        } else {
+          uni.hideLoading();
+        }
+      }).catch(err => {
+        this.isLoading = false;
+        //this.paymentId = "";
+        //auth.setPaymentId("");
+        this.connectorInfo.paymentStatus = "";
+        uni.showToast({
+          icon: "none",
+          title: err
+        })
+      })
+    },
+    stopCharge() {
+      uni.showModal({
+        title: "Confirm Stop Charging?",
+        content: "Your charging session will stop",
+        confirmText: "CONFIRM",
+        cancelText: "CANCEL",
+        success: res => {
+          if (res.confirm) {
+            this.stopPin = true;
+          }
+        }
+      })
+    },
+    onStop() {
+      uni.showLoading({
+        title: "Stopping..."
+      })
+      apiCharge.stopCharge({
+        creditHistoryPk: this.paymentId,
+        pin: this.password
+      }).then(res => {
+        this.stoped = true;
+        this.paymentId = "";
+        auth.setPaymentId("");
+        if (res.data.chargingPk) {
+          uni.hideLoading();
+          this.chargingPk = res.data.chargingPk
+          this.toReceipt();
+        } else {
+          uni.showToast({
+            icon: "none",
+            title: "Stop failed"
+          });
+          this.refreshStatus();
+        }
+      }).catch(err => {
+        uni.showModal({
+          title: "Error",
+          content: err,
+          confirmText: "OK",
+          showCancel: false
+        })
+        uni.hideLoading();
+        this.refreshStatus();
+      })
+    },
+    confirmStop() {
+      uni.showModal({
+        title: "Confirm Stop Charging?",
+        content: "Your charging session will stop",
+        confirmText: "CONFIRM",
+        cancelText: "BACK",
+        //confirmColor: "var(--primary-color)",
+        success: (res) => {
+          if (res.confirm) {
+            this.onStop();
+          }
+        }
+      })
+    },
+    createPayment(id) {
+      if (id) {
+        this.paymentId = id;
+        //auth.setPaymentId("" + id);
+      }
+    },
+    resetPayment() {
+      this.isLoading = false;
+      this.waitPayment = false;
+      this.isPaymentFailed = false;
+      getApp().globalData.waitPayment = false;
+    },
+    toReceipt() {
+      uni.navigateTo({
+        url: "/pages/receipt/index?id=" + this.chargingPk
+      })
+    }
+  },
+  onPullDownRefresh() {
+    this.refreshStatus(500);
+  }
+}
+</script>
+
+<style scoped>
+.container {
+  display: flex;
+  flex-direction: column;
+}
+.toolbar {
+  display: flex;
+  padding: 16rpx;
+  position: relative;
+  align-items: center;
+  flex-direction: column;
+  justify-content: center;
+  background-color: white;
+}
+.tool-title {
+  color: #111;
+  font-size: 32rpx;
+  font-weight: bold;
+  padding-bottom: 4rpx;
+}
+.tool-desc {
+  color: #666;
+  font-size: 24rpx;
+}
+.bottom-button {
+  padding: 32rpx;
+  background-color: white;
+  box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1);
+}
+.icon-key {
+  padding: 0 8rpx;
+  transform: rotate(-90deg);
+}
+.ui-button[disabled] >>> .icon-key span {
+  color: #888;
+}
+</style>