Browse Source

停车场车道展示功能 商户绑定公众号功能

xiao547607 4 years ago
parent
commit
9c4465ff90

+ 4 - 3
.env.development

@@ -19,6 +19,7 @@ VUE_APP_COMPANY_HEALTH_XY_URL=http://wisdomhousewechat.sudaonline.net/prevention
 VUE_APP_PUNCHLOCATION_URL=http://xpgj.xiaoxinda.com/prod/business/#/guest/current/list
 
 #绑定微信
-VUE_APP_SCAN_CODE_LOGIN=7001
-VUE_APP_BIND_WECHAT_CODE=8001
-VUE_APP_BIND_PERSON_WECHAT_CODE=9001
+VUE_APP_SCAN_CODE_LOGIN=7000
+VUE_APP_BIND_WECHAT_CODE=8000
+VUE_APP_BIND_PERSON_WECHAT_CODE=9000
+VUE_APP_BIND_CHANNEL_WECHAT_CODE=9080

+ 2 - 1
.env.production

@@ -21,4 +21,5 @@ VUE_APP_PUNCHLOCATION_URL=http://xpgj.xiaoxinda.com/prod/business/#/guest/curren
 #绑定微信
 VUE_APP_SCAN_CODE_LOGIN=7000
 VUE_APP_BIND_WECHAT_CODE=8000
-VUE_APP_BIND_PERSON_WECHAT_CODE=9000
+VUE_APP_BIND_PERSON_WECHAT_CODE=9000
+VUE_APP_BIND_CHANNEL_WECHAT_CODE=9080

+ 2 - 1
.env.test

@@ -21,4 +21,5 @@ VUE_APP_PUNCHLOCATION_URL=http://yktwechat.xiaoxinda.com/#/health/codeScene
 #绑定微信
 VUE_APP_SCAN_CODE_LOGIN=7001
 VUE_APP_BIND_WECHAT_CODE=8001
-VUE_APP_BIND_PERSON_WECHAT_CODE=9001
+VUE_APP_BIND_PERSON_WECHAT_CODE=9001
+VUE_APP_BIND_CHANNEL_WECHAT_CODE=9081

+ 50 - 0
src/api/base/parkingChannel.js

@@ -0,0 +1,50 @@
+import request from '@/utils/request'
+import constant from '@/constant'
+
+function pageList(formData){
+  return request.post(constant.serverUrl + "/base/parkingChannel/pageList", formData);
+}
+
+function create(){
+  return request.get(constant.serverUrl + "/base/parkingChannel/create");
+}
+
+function edit(id){
+  return request.get(constant.serverUrl + "/base/parkingChannel/edit/" + id);
+}
+
+function add(formModel){
+  return request.post(constant.serverUrl + "/base/parkingChannel/add", formModel,{
+    headers: {
+      "Content-Type": "application/json"
+    }
+  });
+}
+
+function update(formModel){  
+  return request.post(constant.serverUrl + "/base/parkingChannel/update", formModel,{
+    headers: {
+      "Content-Type": "application/json"
+    }
+  });
+}
+
+function remove(id){
+  return request.post(constant.serverUrl + "/base/parkingChannel/delete/" + id);
+}
+
+function batchRemove(idList){
+  return request.post(constant.serverUrl + "/base/parkingChannel/batchDelete",idList,{
+    headers: {
+      "Content-Type": "application/json"
+    }
+  });
+}
+
+function sync(formData){
+  return request.post(constant.serverUrl + "/base/parkingChannel/sync", formData);
+}
+
+export default {
+  pageList,create,edit,add,update,remove,batchRemove,sync
+}

+ 6 - 1
src/api/base/parkingCoupon.js

@@ -41,6 +41,11 @@ function batchRemove(idList) {
   });
 }
 
+function exportXls(formData) {
+  //导出xls
+  return request.post(constant.serverUrl + "/base/parkingCoupon/exportXls", formData);
+}
+
 export default {
-  pageList, create, edit, add, update, remove, batchRemove
+  pageList, create, edit, add, update, remove, batchRemove,exportXls
 }

+ 11 - 1
src/api/base/parkingMerchant.js

@@ -41,6 +41,16 @@ function batchRemove(idList) {
   });
 }
 
+function bindChannelWechat(merchantId) {
+  var formData = new FormData();
+
+  formData.append("expire_seconds", "3600");
+  formData.append("action_name", "QR_STR_SCENE");
+  formData.append("scene_str", process.env.VUE_APP_BIND_CHANNEL_WECHAT_CODE + "," + merchantId);
+
+  return request.post(constant.serverUrl + "/wechat/qrcode/create", formData);
+}
+
 export default {
-  pageList, create, edit, add, update, remove, batchRemove
+  pageList, create, edit, add, update, remove, batchRemove,bindChannelWechat
 }

+ 314 - 0
src/views/base/parkingChannel-list.vue

@@ -0,0 +1,314 @@
+<template>
+  <el-dialog
+    :visible.sync="showDialog"
+    title="查看设备"
+    :modal-append-to-body="false"
+    append-to-body
+    :modal="true"
+    style="text-align: left"
+    @close="closeDialog"
+    :close-on-click-modal="false"
+    width="970px"
+  >
+    <div>
+      <!--
+      要resetFields起作用,必须配置:model和prop
+    -->
+      <el-divider></el-divider>
+      <el-row class="button-group">
+        <el-button
+          type="primary"
+          size="small"
+          plain
+          icon="el-icon-circle-plus"
+          @click="handleSync"
+          >同步车道</el-button
+        >
+      </el-row>
+      <el-table
+        :data="tableData"
+        style="min-height: 400px"
+        v-loading="loading"
+        stripe
+        @sort-change="sortChange"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column
+          prop="channelName"
+          label="车道名称"
+          width="200"
+        ></el-table-column>
+        <el-table-column
+          prop="parkId"
+          label="停车云创建的车场id"
+          width="200"
+        ></el-table-column>
+        <el-table-column label="操作">
+          <template slot-scope="{ row }">
+            <el-popover
+              placement="left"
+              width="300"
+              trigger="click"
+              @show="openQRCode(row)"
+              @hide="closeQRCode(row)"
+            >
+              <div
+                :ref="'qrcode_' + row.id"
+                style="width: 300px; height: 300px"
+              ></div>
+              <el-link type="primary" :underline="false" slot="reference"
+                >车道二维码</el-link
+              > </el-popover
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination
+        :current-page.sync="pageIndex"
+        :total="totalElements"
+        :page-sizes="pageSizeList"
+        @current-change="changePage"
+        @size-change="pageSizeChange"
+        layout="total, sizes, prev, pager, next, jumper"
+      ></el-pagination>
+    </div>
+  </el-dialog>
+</template>
+<script>
+import Constant from "@/constant";
+import parkingChannelApi from "@/api/base/parkingChannel";
+import QRCode from "qrcodejs2";
+import NProgress from "nprogress"; // progress bar
+import "nprogress/nprogress.css"; // progress bar style
+
+export default {
+  props: ["parkId"],
+  data() {
+    var self = this;
+
+    return {
+      queryModel: {
+        id: "",
+        channelId: "",
+        channelName: "",
+        parkId: "",
+        delFlag: "",
+        createBy: "",
+        createTime: "",
+        updateBy: "",
+        updateTime: "",
+      },
+      loading: false,
+      tableData: [],
+      pageIndex: 1,
+      pageSize: 10,
+      totalPages: 0,
+      totalElements: 0,
+      field: "",
+      direction: "",
+      pageSizeList: [10, 20, 30],
+      multipleSelection: [],
+      showModal: false,
+      modalTitle: "",
+      businessKey: "",
+      showDialog: true,
+    };
+  },
+  methods: {
+    closeDialog() {
+      this.$emit("close", false);
+    },
+    changePage(pageIndex) {
+      var self = this;
+
+      self.loading = true;
+
+      self.pageIndex = pageIndex;
+      var formData = new FormData();
+
+      formData.append("pageIndex", self.pageIndex);
+      formData.append("pageSize", self.pageSize);
+
+      formData.append("id", self.queryModel.id);
+      formData.append("parkId", self.parkId);
+
+      if (this.field != null) {
+        formData.append("field", this.field);
+      }
+
+      if (this.direction != null) {
+        formData.append("direction", this.direction);
+      }
+
+      parkingChannelApi
+        .pageList(formData)
+        .then(function (response) {
+          self.loading = false;
+
+          var jsonData = response.data.data;
+
+          self.tableData = jsonData.data;
+          self.totalPages = jsonData.totalPages;
+          self.totalElements = jsonData.recordsTotal;
+        })
+        .catch((error) => {
+          self.loading = false;
+          // self.$message.error(error + "");
+        });
+    },
+    pageSizeChange(pageSize) {
+      this.pageSize = pageSize;
+
+      this.$nextTick(() => {
+        this.changePage(this.pageIndex);
+      });
+    },
+    sortChange(data) {
+      this.field = data.column.field;
+      this.direction = data.order;
+
+      this.changePage(this.pageIndex);
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+    handleReset(name) {
+      this.$refs[name].resetFields();
+    },
+    handleSync(record) {
+      var self = this;
+
+      var formData = new FormData();
+      formData.append("parkId", self.parkId);
+
+      self.loading = true;
+
+      return parkingChannelApi.sync(formData).then(function (response) {
+        self.loading = false;
+
+        var jsonData = response.data;
+        self.changePage(0);
+        if (jsonData.result) {
+          self.$message({
+            message: "同步成功!",
+            type: "success",
+          });
+        } else {
+          self.$message({
+            message: jsonData.message + "",
+            type: "warning",
+          });
+        }
+      });
+    },
+    handleDelete(record) {
+      var self = this;
+
+      self
+        .$confirm("是否确认删除?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+        .then(() => {
+          parkingChannelApi.remove(record.id).then(function (response) {
+            var jsonData = response.data;
+
+            if (jsonData.result) {
+              // var index = self.tableData.indexOf(record);
+              // self.tableData.splice(index, 1);
+              self.changePage(self.pageIndex);
+
+              self.$message({
+                type: "success",
+                message: "删除成功!",
+              });
+            }
+          });
+        });
+    },
+    handleBatchDelete() {
+      var self = this;
+
+      var idList = this.multipleSelection.map((record) => {
+        return record.id;
+      });
+
+      this.$confirm("是否确认删除选中项?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      }).then(() => {
+        parkingChannelApi.batchRemove(idList).then(function (response) {
+          var jsonData = response.data;
+
+          if (jsonData.result) {
+            self.changePage(self.pageIndex);
+
+            self.$message({
+              type: "success",
+              message: "删除成功!",
+            });
+          }
+        });
+      });
+    },
+    onDetailModalClose(refreshed) {
+      //保存成功后回调
+      this.showModal = false;
+
+      if (refreshed) {
+        this.changePage(this.pageIndex);
+      }
+    },
+    openQRCode(record) {
+      //el.innerHTML = "";
+      var self = this;
+      self.$refs["qrcode_" + record.id].innerHTML = "";
+      //默认企业版
+      var qrtext =
+        process.env.VUE_APP_COMPANY_HEALTH_WECHAT_QY_URL +
+        "?companyId=" +
+        record.id;
+
+      var el = self.$refs["qrcode_" + record.id];
+
+      var qr = new QRCode(el, {
+        text: qrtext,
+        width: 300,
+        height: 300,
+        colorDark: "#333333", //二维码颜色
+        colorLight: "#ffffff", //二维码背景色
+        correctLevel: QRCode.CorrectLevel.L, //容错率,L/M/H
+      });
+    },
+    closeQRCode(record) {
+      self.$refs["qrcode_" + record.id].innerHTML = "";
+    },
+  },
+  mounted: function () {
+    this.changePage(1);
+  },
+};
+</script>
+<style lang="scss" scoped>
+.el-breadcrumb {
+  margin: 10px;
+  line-height: 20px;
+}
+
+.el-divider {
+  margin: 5px 0;
+}
+
+.demo-form-inline {
+  margin-left: 10px;
+  text-align: left;
+}
+
+.button-group {
+  margin-left: 10px;
+  text-align: left;
+}
+</style>

+ 0 - 251
src/views/base/parkingCoupon-detail.vue

@@ -1,251 +0,0 @@
-
-<style scoped>
-.user-panel {
-  margin: 10px auto;
-}
-</style>
-<template>
-  <el-dialog
-    :visible.sync="showDialog"
-    :title="title"
-    :modal-append-to-body="false"
-    style="text-align: left"
-    @close="closeDialog"
-    :close-on-click-modal="false"
-  >
-    <div class="user-panel" v-loading="loading">
-      <el-form
-        ref="form"
-        :model="formModel"
-        :rules="ruleValidate"
-        :label-width="'100px'"
-      >
-        <el-form-item label="" prop="id">
-          <el-input
-            v-model="formModel.id"
-            placeholder="请输入"
-            style="width: 300px"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="商户id" prop="merchantId">
-          <el-input
-            v-model="formModel.merchantId"
-            placeholder="请输入商户id"
-            style="width: 300px"
-          ></el-input>
-        </el-form-item>
-        <el-form-item
-          label="优惠券类型(3:时长减免券,4:全免券,5:金额减免券)"
-          prop="type"
-        >
-          <el-input
-            v-model="formModel.type"
-            placeholder="请输入优惠券类型(3:时长减免券,4:全免券,5:金额减免券)"
-            style="width: 300px"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="优惠额度" prop="reduce">
-          <el-input
-            v-model="formModel.reduce"
-            placeholder="请输入优惠额度"
-            style="width: 300px"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="停车记录id" prop="parkingRecordId">
-          <el-input
-            v-model="formModel.parkingRecordId"
-            placeholder="请输入停车记录id"
-            style="width: 300px"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="使用状态(0:未使用,1:使用)" prop="useStatus">
-          <el-input
-            v-model="formModel.useStatus"
-            placeholder="请输入使用状态(0:未使用,1:使用)"
-            style="width: 300px"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="使用额度" prop="useQuote">
-          <el-input
-            v-model="formModel.useQuote"
-            placeholder="请输入使用额度"
-            style="width: 300px"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="使用时间" prop="useTime">
-          <el-input
-            v-model="formModel.useTime"
-            placeholder="请输入使用时间"
-            style="width: 300px"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="失效时间" prop="invalidTime">
-          <el-input
-            v-model="formModel.invalidTime"
-            placeholder="请输入失效时间"
-            style="width: 300px"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="核销时间" prop="verifyTime">
-          <el-input
-            v-model="formModel.verifyTime"
-            placeholder="请输入核销时间"
-            style="width: 300px"
-          ></el-input>
-        </el-form-item>
-      </el-form>
-    </div>
-    <span slot="footer" class="dialog-footer">
-      <el-button @click="closeDialog">取 消</el-button>
-      <el-button type="primary" @click="handleSubmit" :loading="submitting"
-        >确 定</el-button
-      >
-    </span>
-  </el-dialog>
-</template>
-<script>
-import Constant from "@/constant";
-import parkingCouponApi from "@/api/base/parkingCoupon";
-import dataDictionaryApi from "@/api/sys/dataDictionary";
-import companyInfoApi from "@/api/base/companyInfo";
-import SelectTree from "@/components/SelectTree";
-
-export default {
-  props: ["businessKey", "title"],
-  data() {
-    return {
-      formModel: {},
-      ruleValidate: {
-        id: [{ required: true, message: "不能为空", trigger: "blur" }],
-        merchantId: [
-          { required: true, message: "商户id不能为空", trigger: "blur" },
-        ],
-        type: [
-          {
-            required: true,
-            message:
-              "优惠券类型(3:时长减免券,4:全免券,5:金额减免券)不能为空",
-            trigger: "blur",
-          },
-        ],
-        reduce: [
-          { required: true, message: "优惠额度不能为空", trigger: "blur" },
-        ],
-        parkingRecordId: [
-          { required: true, message: "停车记录id不能为空", trigger: "blur" },
-        ],
-        useStatus: [
-          {
-            required: true,
-            message: "使用状态(0:未使用,1:使用)不能为空",
-            trigger: "blur",
-          },
-        ],
-        useQuote: [
-          { required: true, message: "使用额度不能为空", trigger: "blur" },
-        ],
-        useTime: [
-          { required: true, message: "使用时间不能为空", trigger: "blur" },
-        ],
-        invalidTime: [
-          { required: true, message: "失效时间不能为空", trigger: "blur" },
-        ],
-        verifyTime: [
-          { required: true, message: "核销时间不能为空", trigger: "blur" },
-        ],
-      },
-      showDialog: true,
-      loading: false,
-      submitting: false,
-      typeResult:[],
-      companyResult:[]
-    };
-  },
-  created() {
-    var self = this;
-
-    companyInfoApi.treeList().then(function (response) {
-      var jsonData = response.data;
-      if (jsonData.result) {
-        if (jsonData.data != null && jsonData.data != "") {
-          self.companyResult = jsonData.data;
-        }
-      }
-    });
-
-    dataDictionaryApi
-      .findByCatalogName({
-        catalogName: "优惠券类型",
-      })
-      .then((response) => {
-        var jsonData = response.data;
-        this.typeResult = jsonData.data;
-      });
-
-  },
-  methods: {
-    closeDialog() {
-      this.$emit("close", false);
-    },
-    handleSubmit() {
-      var self = this;
-
-      this.$refs["form"].validate((valid) => {
-        if (valid) {
-          (function () {
-            var id = self.formModel.id;
-
-            if (id == null || id.length == 0) {
-              return parkingCouponApi.add(self.formModel);
-            } else {
-              return parkingCouponApi.update(self.formModel);
-            }
-          })().then(function (response) {
-            var jsonData = response.data;
-
-            if (jsonData.result) {
-              self.$message({
-                message: "保存成功!",
-                type: "success",
-              });
-
-              self.$emit("close", true);
-            } else {
-              self.$message({
-                message: jsonData.message + "",
-                type: "warning",
-              });
-
-              self.$emit("close", false);
-            }
-          });
-        }
-      });
-    },
-  },
-  mounted: function () {
-    var self = this;
-
-    (function () {
-      if (self.businessKey.length == 0) {
-        return parkingCouponApi.create();
-      } else {
-        return parkingCouponApi.edit(self.businessKey);
-      }
-    })()
-      .then((response) => {
-        var jsonData = response.data;
-        self.loading = false;
-
-        if (jsonData.result) {
-          self.formModel = jsonData.data;
-        } else {
-          self.$message.error(jsonData.message + "");
-        }
-      })
-      .catch((error) => {
-        self.$message.error(error + "");
-      });
-  },
-};
-</script>

+ 175 - 60
src/views/base/parkingCoupon-list.vue

@@ -6,7 +6,7 @@
         <a href="#">系统管理</a>
       </el-breadcrumb-item>
       <el-breadcrumb-item>
-        <a href="/parkingCoupon">商户优惠卷管理</a>
+        <a href="/parkingCoupon">停车劵使用明细</a>
       </el-breadcrumb-item>
     </el-breadcrumb>
     <el-divider></el-divider>
@@ -19,6 +19,23 @@
       inline
       class="demo-form-inline"
     >
+      <el-form-item label="车牌号码" prop="carNum">
+        <el-input
+          type="text"
+          size="mini"
+          v-model="queryModel.carNum"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="所属物业公司" prop="companyId">
+        <el-select-tree
+          :props="props"
+          :options="companyResult"
+          v-model="queryModel.companyId"
+          height="200"
+          style="width: 230px"
+          size="mini"
+        ></el-select-tree>
+      </el-form-item>
       <el-form-item label="商户名称" prop="merchantName">
         <el-input
           type="text"
@@ -26,21 +43,25 @@
           v-model="queryModel.merchantName"
         ></el-input>
       </el-form-item>
-      <el-form-item label="优惠券类型" prop="type">
-        <el-select
-          filterable
-          placeholder="请选择"
-          style="width: 180px"
-          v-model="queryModel.type"
+      <el-form-item label="使用状态" prop="useStatus">
+        <el-select size="mini" v-model="queryModel.useStatus">
+          <el-option label="全部" value=""></el-option>
+          <el-option label="未使用" value="0"></el-option>
+          <el-option label="已使用" value="1"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="核销时间" prop="verifyTimeRange">
+        <el-date-picker
+          v-model="queryModel.verifyTimeRange"
+          type="daterange"
           size="mini"
+          range-separator="至"
+          start-placeholder="开始时间"
+          end-placeholder="结束时间"
+          placeholder="选择时间范围"
+          value-format="yyyy-MM-dd"
         >
-          <el-option
-            v-for="result in typeResult"
-            :key="result.value"
-            :label="result.name"
-            :value="result.value"
-          ></el-option>
-        </el-select>
+        </el-date-picker>
       </el-form-item>
       <el-form-item>
         <el-button
@@ -62,7 +83,14 @@
     </el-form>
     <el-divider></el-divider>
     <el-row class="button-group">
-  
+      <el-button
+        type="primary"
+        size="small"
+        plain
+        icon="el-icon-download"
+        :loading="downloadLoading"
+        @click="downloadXls"
+      >导出数据</el-button>
     </el-row>
     <el-table
       :data="tableData"
@@ -74,48 +102,50 @@
     >
       <el-table-column type="selection" width="55"></el-table-column>
       <el-table-column
-        prop="merchantName"
-        label="商户名称"
-        width="180"
+        type="index"
+        label="序号"
+        :index="indexMethod"
+        width="50"
       ></el-table-column>
       <el-table-column
-        prop="typeName"
-        label="优惠券类型"
-        width="180"
+        prop="carNum"
+        label="车牌号码"
+        width="130"
       ></el-table-column>
       <el-table-column
-        prop="reduce"
-        label="优惠额度"
-        width="180"
+        prop="companyName"
+        label="所属物业"
+        width="150"
       ></el-table-column>
       <el-table-column
-        prop="parkingRecordId"
-        label="停车记录id"
-        width="180"
+        prop="merchantName"
+        label="登记商户"
+        width="150"
       ></el-table-column>
-      <el-table-column
-        prop="useStatus"
-        label="使用状态"
-        width="180"
-      >
-      <template slot-scope="{ row }">
-        <span v-if="row.useStatus">使用</span>
-        <span v-else>未使用</span>
-      </template>
+      <el-table-column prop="useStatus" label="使用状态" width="90">
+        <template slot-scope="{ row }">
+          <span v-if="row.useStatus">使用</span>
+          <span v-else>未使用</span>
+        </template>
       </el-table-column>
       <el-table-column
-        prop="useQuote"
-        label="使用额度"
+        prop="reduce"
+        label="折扣卷金额(元)"
+        width="130"
+      ></el-table-column>
+      <el-table-column
+        prop="inParkingTime"
+        label="入场时间"
         width="180"
       ></el-table-column>
       <el-table-column
-        prop="useTime"
-        label="使用时间"
+        prop="outParkingTime"
+        label="出场时间"
         width="180"
       ></el-table-column>
       <el-table-column
-        prop="invalidTime"
-        label="失效时间"
+        prop="createTime"
+        label="发放时间"
         width="180"
       ></el-table-column>
       <el-table-column
@@ -132,19 +162,14 @@
       @size-change="pageSizeChange"
       layout="total, sizes, prev, pager, next, jumper"
     ></el-pagination>
-    <parkingCoupon-detail
-      v-if="showModal"
-      :businessKey="businessKey"
-      :title="modalTitle"
-      @close="onDetailModalClose"
-    ></parkingCoupon-detail>
   </div>
 </template>
 <script>
 import Constant from "@/constant";
-import ParkingCouponDetail from "./parkingCoupon-detail";
 import parkingCouponApi from "@/api/base/parkingCoupon";
 import dataDictionaryApi from "@/api/sys/dataDictionary";
+import companyInfoApi from "@/api/base/companyInfo";
+import SelectTree from "@/components/SelectTree";
 import NProgress from "nprogress"; // progress bar
 import "nprogress/nprogress.css"; // progress bar style
 
@@ -155,9 +180,13 @@ export default {
 
     return {
       queryModel: {
-        id:"",
+        id: "",
         merchantName: "",
-        type:""
+        type: "",
+        companyId: "",
+        verifyTimeRange: ["", ""],
+        carNum: "",
+        useStatus: "",
       },
       loading: false,
       tableData: [],
@@ -173,21 +202,32 @@ export default {
       modalTitle: "",
       businessKey: "",
       typeResult: [],
+      companyResult: [],
+      props: {
+        // 配置项(必选)
+        value: "id",
+        label: "name",
+        children: "children",
+      },
+      downloadLoading: false,
     };
   },
   created() {
     var self = this;
 
-    dataDictionaryApi
-      .findByCatalogName({
-        catalogName: "优惠券类型",
-      })
-      .then((response) => {
-        var jsonData = response.data;
-        this.typeResult = jsonData.data;
-      });
+    companyInfoApi.treeList().then(function (response) {
+      var jsonData = response.data;
+      if (jsonData.result) {
+        if (jsonData.data != null && jsonData.data != "") {
+          self.companyResult = jsonData.data;
+        }
+      }
+    });
   },
   methods: {
+    indexMethod(index) {
+      return (this.pageIndex - 1) * this.pageSize + (index + 1);
+    },
     changePage(pageIndex) {
       var self = this;
 
@@ -203,6 +243,22 @@ export default {
       formData.append("merchantName", self.queryModel.merchantName);
       formData.append("type", self.queryModel.type);
 
+      if (self.queryModel.companyId != null) {
+        formData.append("companyId", self.queryModel.companyId);
+      }
+      formData.append("carNum", self.queryModel.carNum);
+      formData.append("verifyTime", self.queryModel.verifyTime);
+
+      if (self.queryModel.verifyTimeRange[0] != null) {
+        formData.append("verifyStartTime", self.queryModel.verifyTimeRange[0]);
+      }
+
+      if (self.queryModel.verifyTimeRange[1] != null) {
+        formData.append("verifyEndTime", self.queryModel.verifyTimeRange[1]);
+      }
+
+      formData.append("useStatus", self.queryModel.useStatus);
+
       if (this.field != null) {
         formData.append("field", this.field);
       }
@@ -316,12 +372,71 @@ export default {
         this.changePage(this.pageIndex);
       }
     },
+    downloadXls() {
+      //导出
+      var self = this;
+      self.downloadLoading = true;
+      self.loading = true;
+      self.loadingText = "数据导出中,请稍后...";
+
+      var formData = new FormData();
+
+      formData.append("pageIndex", self.pageIndex);
+      formData.append("pageSize", self.pageSize);
+
+      formData.append("id", self.queryModel.id);
+      formData.append("merchantName", self.queryModel.merchantName);
+      formData.append("type", self.queryModel.type);
+
+      if (self.queryModel.companyId != null) {
+        formData.append("companyId", self.queryModel.companyId);
+      }
+      formData.append("carNum", self.queryModel.carNum);
+      formData.append("verifyTime", self.queryModel.verifyTime);
+
+      if (self.queryModel.verifyTimeRange[0] != null) {
+        formData.append("verifyStartTime", self.queryModel.verifyTimeRange[0]);
+      }
+
+      if (self.queryModel.verifyTimeRange[1] != null) {
+        formData.append("verifyEndTime", self.queryModel.verifyTimeRange[1]);
+      }
+
+      formData.append("useStatus", self.queryModel.useStatus);
+
+      if (this.field != null) {
+        formData.append("field", this.field);
+      }
+
+      if (this.direction != null) {
+        formData.append("direction", this.direction);
+      }
+
+      parkingCouponApi.exportXls(formData).then(function(response) {
+        var jsonData = response.data;
+        self.downloadLoading = false;
+        self.loading = false;
+        if (jsonData.result) {
+            //下载有错误信息提示的报表
+            self.$message({
+              showClose: true,
+              dangerouslyUseHTMLString: true,
+              message: `报表已生成,<a href="${jsonData.data}" target="_blank">点击下载报表</a>&nbsp;`,
+              duration: 60000,
+              type: 'success'
+            });
+        }
+        else{
+          self.$message.error(jsonData.message);
+        }
+      });
+    },
   },
   mounted: function () {
     this.changePage(1);
   },
   components: {
-    "parkingCoupon-detail": ParkingCouponDetail,
+    "el-select-tree": SelectTree,
   },
 };
 </script>

+ 7 - 0
src/views/base/parkingInfo-detail.vue

@@ -90,6 +90,13 @@ export default {
         label: "parkingName",
       },
       companyResult: [],
+      
+      props: {
+        // 配置项(必选)
+        value: "id",
+        label: "name",
+        children: "children",
+      },
     };
   },
   created() {

+ 58 - 18
src/views/base/parkingInfo-list.vue

@@ -29,7 +29,7 @@
           v-model="queryModel.parkingName"
         ></el-input>
       </el-form-item>
-      <el-form-item label="上级" prop="parentId">
+      <!-- <el-form-item label="上级" prop="parentId">
         <el-select-tree
           size="mini"
           :props="parentProps"
@@ -37,7 +37,7 @@
           v-model="queryModel.parentId"
           height="200"
         ></el-select-tree>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item>
         <el-button
           type="primary"
@@ -90,13 +90,40 @@
         label="名称"
         width="180"
       ></el-table-column>
-      <el-table-column prop="parkId" label="停车场编号" width="180"></el-table-column>
-      <el-table-column prop="parentName" label="上级" width="180"></el-table-column>
-      <el-table-column prop="companyName" label="所属物业公司" width="180"></el-table-column>
-      <el-table-column prop="createTime" label="创建时间" width="180"></el-table-column>
-      <el-table-column prop="updateTime" label="更新时间" width="180"></el-table-column>
+      <el-table-column
+        prop="parkId"
+        label="停车场编号"
+        width="180"
+      ></el-table-column>
+      <el-table-column
+        prop="parentName"
+        label="上级"
+        width="180"
+      ></el-table-column>
+      <el-table-column
+        prop="companyName"
+        label="所属物业公司"
+        width="180"
+      ></el-table-column>
+      <el-table-column
+        prop="createTime"
+        label="创建时间"
+        width="180"
+      ></el-table-column>
+      <el-table-column
+        prop="updateTime"
+        label="更新时间"
+        width="180"
+      ></el-table-column>
       <el-table-column label="操作">
         <template slot-scope="{ row }">
+          <el-button
+            size="mini"
+            type="primary"
+            @click="handleOpenChannel(row)"
+            v-if="row.parkId != 0"
+            >查看车道</el-button
+          >
           <el-button size="mini" type="warning" @click="handleEdit(row)"
             >编辑</el-button
           >
@@ -120,11 +147,17 @@
       :title="modalTitle"
       @close="onDetailModalClose"
     ></parkingInfo-detail>
+    <parkingChannel-list
+      v-if="showChannelModal"
+      :parkId="parkId"
+      @close="onDetailModalClose"
+    ></parkingChannel-list>
   </div>
 </template>
 <script>
 import Constant from "@/constant";
 import ParkingInfoDetail from "./parkingInfo-detail";
+import ParkingChannelList from "./parkingChannel-list";
 import parkingInfoApi from "@/api/base/parkingInfo";
 import NProgress from "nprogress"; // progress bar
 import "nprogress/nprogress.css"; // progress bar style
@@ -168,20 +201,22 @@ export default {
       parentResult: [],
       parentProps: {
         value: "id",
-        label: "parkingName"
+        label: "parkingName",
       },
+      showChannelModal: false,
+      parkId: "",
     };
   },
-  created() {
-    var self = this;
+  // created() {
+  //   var self = this;
 
-    parkingInfoApi.query().then(function(response) {
-      var jsonData = response.data;
-      if (jsonData.result) {
-        self.parentResult = jsonData.data;
-      }
-    });
-  },
+  //   parkingInfoApi.query().then(function (response) {
+  //     var jsonData = response.data;
+  //     if (jsonData.result) {
+  //       self.parentResult = jsonData.data;
+  //     }
+  //   });
+  // },
   methods: {
     changePage(pageIndex) {
       var self = this;
@@ -250,6 +285,10 @@ export default {
       this.businessKey = record.id;
       this.showModal = true;
     },
+    handleOpenChannel(record) {
+      this.parkId = record.parkId;
+      this.showChannelModal = true;
+    },
     handleDelete(record) {
       var self = this;
 
@@ -305,6 +344,7 @@ export default {
     onDetailModalClose(refreshed) {
       //保存成功后回调
       this.showModal = false;
+      this.showChannelModal = false;
 
       if (refreshed) {
         this.changePage(this.pageIndex);
@@ -316,7 +356,7 @@ export default {
   },
   components: {
     "parkingInfo-detail": ParkingInfoDetail,
-    "el-select-tree": SelectTree
+    "parkingChannel-list": ParkingChannelList,
   },
 };
 </script>

+ 51 - 2
src/views/base/parkingMerchant-list.vue

@@ -99,6 +99,12 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55"></el-table-column>
+      <el-table-column
+        type="index"
+        label="序号"
+        :index="indexMethod"
+        width="50"
+      ></el-table-column>
       <el-table-column
         prop="companyName"
         label="所属物业公司"
@@ -134,8 +140,11 @@
         label="优惠额度"
         width="180"
       ></el-table-column>
-      <el-table-column label="操作" width="150">
+      <el-table-column label="操作" width="250">
         <template slot-scope="{ row }">
+          <el-button size="mini" type="primary" @click="bindWechat(row)"
+            >微信绑定</el-button
+          >
           <el-button size="mini" type="warning" @click="handleEdit(row)"
             >编辑</el-button
           >
@@ -159,6 +168,17 @@
       :title="modalTitle"
       @close="onDetailModalClose"
     ></parkingMerchant-detail>
+    <el-dialog
+      title="扫码绑定微信"
+      :visible.sync="bindWechatVisible"
+      :modal-append-to-body="false"
+      :close-on-click-modal="false"
+      width="340px"
+    >
+      <div v-loading="bindWechatLoading">
+        <img :src="bindWechatUrl" style="width: 300px; fit-object: cover" />
+      </div>
+    </el-dialog>
   </div>
 </template>
 <script>
@@ -166,6 +186,7 @@ import Constant from "@/constant";
 import ParkingMerchantDetail from "./parkingMerchant-detail";
 import parkingMerchantApi from "@/api/base/parkingMerchant";
 import dataDictionaryApi from "@/api/sys/dataDictionary";
+import QRCode from "qrcodejs2";
 import companyInfoApi from "@/api/base/companyInfo";
 import SelectTree from "@/components/SelectTree";
 import NProgress from "nprogress"; // progress bar
@@ -198,6 +219,15 @@ export default {
       businessKey: "",
       typeResult: [],
       companyResult: [],
+      props: {
+        // 配置项(必选)
+        value: "id",
+        label: "name",
+        children: "children",
+      },
+      bindWechatVisible: false,
+      bindWechatUrl: "",
+      bindWechatLoading: false,
     };
   },
   created() {
@@ -222,6 +252,9 @@ export default {
       });
   },
   methods: {
+    indexMethod(index) {
+      return (this.pageIndex - 1) * this.pageSize + (index + 1);
+    },
     changePage(pageIndex) {
       var self = this;
 
@@ -235,7 +268,7 @@ export default {
 
       formData.append("id", self.queryModel.id);
       formData.append("merchantName", self.queryModel.merchantName);
-      if(self.queryModel.companyId != null){
+      if (self.queryModel.companyId != null) {
         formData.append("companyId", self.queryModel.companyId);
       }
       formData.append("type", self.queryModel.type);
@@ -353,6 +386,22 @@ export default {
         this.changePage(this.pageIndex);
       }
     },
+    bindWechat(record) {
+      this.bindWechatVisible = true;
+      this.bindWechatLoading = true;
+      this.bindWechatUrl = "";
+
+      parkingMerchantApi.bindChannelWechat(record.id).then((response) => {
+        var jsonData = response.data;
+        this.bindWechatLoading = false;
+
+        if (jsonData.result) {
+          this.bindWechatUrl = jsonData.data;
+        } else {
+          this.$message.warning(jsonData.message);
+        }
+      });
+    },
   },
   mounted: function () {
     this.changePage(1);