Kaynağa Gözat

12665&12845

vbea 3 yıl önce
ebeveyn
işleme
eb4251249d

+ 2 - 2
Strides-Admin/src/router/ChargeRouter.js

@@ -46,7 +46,7 @@ export default {
     },
     {
       path: 'add-charge-stations',
-      component: () => import('@/views/charge/AddCharge'),
+      component: () => import('@/views/charge/AddStation'),
       name: 'add-charge-stations',
       meta: {
         title: 'Add Station',
@@ -56,7 +56,7 @@ export default {
     },
     {
       path: 'edit-charge-stations',
-      component: () => import('@/views/charge/EditCharge'),
+      component: () => import('@/views/charge/AddStation'),
       name: 'edit-charge-stations',
       meta: {
         title: 'Edit Station',

+ 5 - 0
Strides-Admin/src/styles/index.scss

@@ -267,6 +267,11 @@ aside {
   justify-content: space-between;
 }
 
+.flexr {
+  display: flex;
+  flex-wrap: wrap;
+}
+
 .flexcr {
   display: flex;
   flex-wrap: wrap;

+ 636 - 0
Strides-Admin/src/views/charge/AddStation.vue

@@ -0,0 +1,636 @@
+<template>
+  <div class="card-container">
+    <el-form
+      :model="addForm"
+      :rules="rule"
+      v-loading="loading"
+      ref="addForm"
+      label-width="160px"
+      label-position="left">
+      <div class="flexr">
+        <div class="card-content flex1">
+          <div class="section-title">Charge Station Information</div>
+          <el-row :gutter="20">
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Charge Station ID:"
+                prop="chargeBoxId"
+                label-width="160px">
+                <el-input
+                  class="add-text"
+                  v-model="addForm.chargeBoxId"
+                  placeholder="Add text"
+                  maxlength="30"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20" v-if="false">
+            <el-col :span="24">
+              <el-form-item
+                label="Insert connector status after start/stop transaction">
+                <el-switch v-model="addForm.insertConnectorStatusAfterTransactionMsg"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <div class="section-title">Service Provider</div>
+          <el-row :gutter="20">
+            <el-col :span="24">
+              <el-form-item
+                label="Service Provider:"
+                prop="providerPk"
+                label-width="150px">
+                <el-select
+                  class="add-text"
+                  v-model="addForm.providerPk"
+                  placeholder="Select">
+                  <el-option
+                    v-for="(item, index) in providerOptions"
+                    :key="index"
+                    :label="item.providerName"
+                    :value="item.providerPk"/>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <div class="section-title">Location of Station</div>
+          <el-row :gutter="20">
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Site of Station:"
+                prop="sitePk"
+                label-width="150px">
+                <el-select
+                  class="add-text"
+                  filterable
+                  remote
+                  v-model="addForm.sitePk"
+                  :remote-method="filterSite"
+                  placeholder="Select with search">
+                  <el-option
+                    v-for="(item, index) in siteOptions"
+                    :key="index"
+                    :label="item.siteName"
+                    :value="item.sitePk"/>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Additional Notes:"
+                label-width="150px">
+                <el-input
+                  class="add-text"
+                  type="textarea"
+                  maxlength="300"
+                  :autosize="autosize"
+                  v-model="addForm.note"
+                  placeholder="Add text"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Lot Number:"
+                label-width="150px">
+                <el-input
+                  class="add-text"
+                  maxlength="300"
+                  v-model="addForm.lotNumber"
+                  placeholder="Add text"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Level:"
+                label-width="150px">
+                <el-input
+                  class="add-text"
+                  maxlength="300"
+                  v-model="addForm.level"
+                  placeholder="Add text"/>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Registration Status:"
+                label-width="160px"
+                prop="registrationStatus">
+                <el-select
+                  class="add-text"
+                  v-model="addForm.registrationStatus"
+                  placeholder="Add text">
+                  <el-option
+                    v-for="(item, index) in registerOptions"
+                    :key="index"
+                    :label="item"
+                    :value="item"/>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </div>
+        <div class="card-content flex1">
+          <div class="section-title">Charge Station Specifications</div>
+          <el-row :gutter="20">
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Endpoint Address:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.endpointAddress}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Charge Point Vendor:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.chargePointVendor}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Charge Point Serial Number:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.chargePointSerialNumber}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Charge Box Serial Number:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.chargeBoxSerialNumber}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Firmware Version:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.fwVersion}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Firmware Update Timestamp:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.fwUpdateTimestamp}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="IMSI:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.imsi}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Last Heartbeat Timestamp:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.lastHeartbeatTimestamp}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="OCPP Protocol:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.ocppProtocol}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Charge Point Model:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.chargePointModel}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="ICCID:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.iccid}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Meter Type:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.meterType}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Meter Serial Number:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.meterSerialNumber}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Diagnostics Status:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.diagnosticsStatus}}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :md="24">
+              <el-form-item
+                label="Diagnostics Timestamp:"
+                label-width="210px"
+                class="info-item">
+                <span class="info-text">{{addForm.diagnosticsTimestamp}}</span>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </div>
+      </div>
+      <div class="card-content flex1" v-if="addForm.connectorInfo.length">
+        <div class="section-title">Connector Settings</div>
+        <div class="rate-list-view" v-for="(item, index) in addForm.connectorInfo" :key="index">
+          <el-form-item
+            label="Connector ID:"
+            label-width="120px"
+            :prop="'connectorInfo.' + index + '.connectorId'"
+            :rules="rule.connectorInfo.connectorId">
+            <el-input
+              class="rate-text center"
+              v-model.number="item.connectorId"
+              maxlength="5"
+              readonly
+              placeholder="Add text"/>
+          </el-form-item>
+          <el-form-item
+            label="Charge Type:"
+            label-width="120px"
+            :prop="'connectorInfo.' + index + '.chargeTypePk'"
+            :rules="rule.connectorInfo.chargeTypePk">
+            <el-select
+              class="rate-text"
+              v-model="item.chargeTypePk"
+              placeholder="Add text">
+              <el-option 
+                v-for="(item, index) in chargeTypeOptions"
+                :key="index"
+                :label="item.chargeType"
+                :value="item.chargeTypePk"/>
+            </el-select>
+          </el-form-item>
+        </div>
+      </div>
+      <div class="card-content flexc">
+        <div class="buttons">
+          <el-button
+            type="primary"
+            class="cancel-button"
+            @click="handleClickCancleButton">
+            Cancel
+          </el-button>
+          <el-button
+            style="margin-left: 20px;"
+            type="primary"
+            native-type="submit"
+            @click="handleClickConfigUpateButton">
+            Save
+          </el-button>
+        </div>
+        <div
+          class="flex1"
+          style="margin-left: 20px;"
+          v-if="isEdit">
+          <span
+            class="add-text"
+            :title='"CREATED BY " + addForm.createdBy + " ON " + addForm.createdOn'>
+            LAST UPDATED BY {{addForm.updatedBy}} TIMESTAMP: {{addForm.updatedOn}}
+          </span>
+        </div>
+      </div>
+    </el-form>
+  </div>
+</template>
+
+<script>
+  import { mapState } from 'vuex'
+  import site from '../../http/api/site'
+  import station from '../../http/api/charge'
+  import provider from '../../http/api/provider'
+  export default {
+    data() {
+      return {
+        loading: true,
+        autosize: {
+          minRows: 3,
+          maxRows: 6
+        },
+        rule: {
+          // "address": {
+          //   "zipCode": {
+          //     required: true,
+          //     trigger: 'blur',
+          //     message: 'Please type postal code'
+          //   },
+          //   "country": {
+          //     required: true,
+          //     trigger: 'change',
+          //     message: 'Please select country'
+          //   },
+          //   "city": {
+          //     required: true,
+          //     trigger: 'blur',
+          //     message: 'Please type city'
+          //   },
+          //   "street": {
+          //     required: true,
+          //     trigger: 'blur',
+          //     message: 'Please type street'
+          //   },
+          //   "houseNumber": {
+          //     required: true,
+          //     trigger: 'blur',
+          //     message: 'Please type unit number'
+          //   }
+          // },
+          "sitePk": {
+            required: true,
+            trigger: 'change',
+            message: 'Please select a site'
+          },
+          "providerPk": {
+            required: true,
+            trigger: 'change',
+            message: 'Please select a provider'
+          },
+          "chargeBoxId": {
+            required: true,
+            trigger: 'blur',
+            message: 'Please type charge station id'
+          },
+          "registrationStatus": {
+            required: true,
+            trigger: 'change',
+            message: 'Please select a status'
+          },
+          'ocpp': [{
+            required: true,
+            trigger: 'blur',
+            message: 'Please type ocpp',
+          }, {
+            pattern: /^\d{1,}(.{0,1}\d{1,})$/,
+            trigger: 'blur',
+            message: 'Please type a correct ocpp'
+          }],
+          'timeLimit': [{
+            required: true,
+            trigger: 'change',
+          }],
+          'connectorInfo': {
+            'connectorPk': [{
+              required: true,
+              trigger: 'blur',
+              message: 'Please type Connector ID',
+            }],
+            'chargeTypePk': [{
+              required: true,
+              trigger: 'blur',
+              message: 'Please type Charge Type',
+            }]
+          }
+        },
+        addForm: {
+          sitePk: '',
+          providerPk: '',
+          /*address: {
+            country: '',
+            city: '',
+            street: '',
+            zipCode: ''
+          },*/
+          chargeBoxId: '',
+          registrationStatus: '',
+          //description: '',
+          //adminAddress: '',
+          note: '',
+          insertConnectorStatusAfterTransactionMsg: false,
+          connectorInfo: [],
+          //timeLimit: ''
+          level: '',
+          lotNumber: ''
+        },
+        chargeTypeOptions: [],
+        registerOptions: [],
+        providerOptions: [],
+        siteOptions: [],
+        siteKeyword: '',
+        defConnectorInfo: {
+          connectorPk: '',
+          chargeTypePk: ''
+        },
+        isEdit: false
+      }
+    },
+    computed: {
+      ...mapState('charge', ['stationId'])
+    },
+    created() {
+      this.getRegisterOptions()
+      if (this.stationId && this.$route.name == "edit-charge-stations") {
+        this.isEdit = true;
+        this.getChargeTypes();
+        this.getStationInfo();
+      }
+    },
+    methods: {
+      async getChargeTypes() {
+        const res = await site.getChargeTypeList()
+        if (res.data && res.data.length > 0) {
+          this.chargeTypeOptions = res.data
+          //this.defConnectorInfo.chargeTypePk = res.data[0].chargeTypePk;
+        }
+      },
+      async getRegisterOptions() {
+        const res = await station.getRegistrationStatusList();
+        if (res.data && res.data.length > 0) {
+          this.registerOptions = res.data;
+          this.addForm.registrationStatus = res.data[0];
+        }
+        this.getAllSite();
+      },
+      getAllSite() {
+        site.getAllSiteList({siteName: this.siteKeyword}).then(res => {
+          if (res.data && res.data.length > 0) {
+            this.siteOptions = res.data
+          }
+        }).finally(() => {
+          this.getAllProvider();
+        });
+      },
+      getStationInfo() {
+        station.getStationInfo({chargeBoxPk: this.stationId}).then(res => {
+          if (res.data) {
+            this.addForm = res.data
+            delete this.addForm.address
+          }
+        }).catch(err => {
+           
+        });
+      },
+      getAllProvider() {
+        provider.getAllServiceProvider().then(res => {
+          if (res.data && res.data.length > 0) {
+            this.providerOptions = res.data
+            this.addForm.providerPk = res.data[0].providerPk
+          }
+        }).finally(() => {
+          this.loading = false;
+        });
+      },
+      filterSite(word) {
+        this.siteKeyword = word
+        this.getAllSite();
+      },
+      addConnector() {
+        this.addForm.connectorInfo.push(Object.assign({}, this.defConnectorInfo));
+      },
+      delConnector(index) {
+        this.addForm.connectorInfo.splice(index, 1);
+      },
+      handleClickCancleButton() {
+        this.$router.push({
+          path: "/charge/registered-charge-stations"
+        })
+      },
+      handleClickConfigUpateButton() {
+        this.$refs['addForm'].validate(result => {
+          if (result) {
+            this.isEdit ? this.updateStation() : this.addStation();
+          }
+        })
+      },
+      addStation() {
+        this.loading = true;
+        station.addStation(this.addForm).then(res => {
+          this.$message({
+            message: 'Add station successfully',
+            type: 'success'
+          })
+          this.handleClickCancleButton();
+        }).catch(err => {
+          this.loading = false;
+          this.$message({
+            message: err,
+            type: 'error'
+          })
+        });
+      },
+      updateStation() {
+        this.loading = true;
+        station.updateStation(this.addForm).then(res => {
+          this.$message({
+            message: 'Edit station successfully',
+            type: 'success'
+          });
+          this.handleClickCancleButton();
+        }).catch(err => {
+          this.loading = false;
+          this.$message({
+            message: err,
+            type: 'error'
+          })
+        })
+      }
+    }
+  }
+</script>
+
+<style scoped="scoped" lang='scss'>
+  @import '../../styles/variables.scss';
+
+  .card-container {
+    width: 100%;
+    padding: 20px 60px;
+    min-height: $mainAppMinHeight;
+    background-color: #F0F5FC;
+  }
+  .card-content {
+    margin: 0 8px 16px;
+    padding: 15px 40px;
+    border-radius: 6px;
+    background-color: white;
+  }
+  .section-title {
+    color: #333;
+    margin-top: 20px;
+    margin-bottom: 30px;
+    font-size: 16px;
+    user-select: none;
+    line-height: 24px;
+    font-weight: 700;
+    font-family: sans-serif;
+    text-transform: uppercase;
+  }
+  .add-text {
+    width: 100%;
+    font-size: 14px;
+    max-width: 300px;
+  }
+  .add-text ::v-deep .el-textarea__inner {
+    font-family: sans-serif;
+  }
+  .hr {
+    height: 2px;
+    margin: 10px -40px;
+    background-color: #F0F5FC;
+  }
+  .hr-full {
+    height: 2px;
+    margin: 20px -80px;
+    background-color: #F0F5FC;
+  }
+  .rate-list-view {
+    display: flex;
+    align-items: center;
+  }
+  .rate-text {
+    max-width: 150px;
+    padding-right: 14px;
+  }
+  .list-item-icon {
+    width: 30px;
+    height: 30px;
+    cursor: pointer;
+    margin: 0 10px 22px;
+  }
+  .buttons {
+    padding-top: 15px;
+    padding-bottom: 15px;
+  }
+  @media screen and (max-width: 500px) {
+    .card-container {
+      padding: 0px;
+    }
+    .card-content {
+      padding: 15px 30px;
+    }
+  }
+  .info-item {
+    margin-bottom: 0;
+  }
+  .info-text {
+    color: #888;
+  }
+</style>