Procházet zdrojové kódy

Merge branch 'master' of http://git.dingsenhulian.com/ggs-ddu/parking

26655778 před 1 rokem
rodič
revize
1b27e5b03a

+ 31 - 31
src/api/request.ts

@@ -1,35 +1,35 @@
-import createAxios from '/@/utils/axios'
-import {actionUrl} from "/@/api/backend/routine/config";
+import createAxios from "/@/utils/axios";
+import { actionUrl } from "/@/api/backend/routine/config";
 
 
 export default {
-    index: (url: string, data: anyObj = {}, action: string = 'index') => {
-        return createAxios({
-            url: url + action,
-            method: 'get',
-            params: data
-        })
-    },
-    add: (url: string, data: anyObj = {}, action: string = 'add') => {
-        return createAxios({
-            url: url + action,
-            method: 'post',
-            data: data
-        })
-    },
-    edit: (url: string, data: anyObj = {}, action: string = 'edit') => {
-        return createAxios({
-            url: url + action,
-            method: 'post',
-            data: data
-        })
-    },
-    delete: (url: string, data: anyObj = {}, action: string = 'del') => {
-        return createAxios({
-            url: url + action,
-            method: 'delete',
-            data: data,
-        })
-    }
+  index: (url: string, data: anyObj = {}, action: string = "index") => {
+    return createAxios({
+      url: url + action,
+      method: 'get',
+      params: data
+    });
+  },
+  add: (url: string, data: anyObj = {}, action: string = "add") => {
+    return createAxios({
+      url: url + action,
+      method: "post",
+      data: data
+    });
+  },
+  edit: (url: string, data: anyObj = {}, action: string = "edit") => {
+    return createAxios({
+      url: url + action,
+      method: "post",
+      data: data
+    });
+  },
+  delete: (url: string, data: anyObj = {}, action: string = "del") => {
+    return createAxios({
+      url: url + action,
+      method: "delete",
+      data: data
+    });
+  }
 
-}
+};

+ 82 - 0
src/components/common/buttonExportExcel.vue

@@ -0,0 +1,82 @@
+<template>
+  <el-button :plain="props.plain" :type="props.type" :size="props.size" @click="btnClick">
+    <slot>生成表格</slot>
+  </el-button>
+  <el-dialog title="导出表格" width="500px" v-model="showDialog">
+    <el-table border :data="columns" @selection-change="selectRow">
+      <el-table-column type="selection"></el-table-column>
+      <el-table-column prop="label" label="列名"></el-table-column>
+      <el-table-column prop="name" label="数据源" v-if="props.showDataColumn"></el-table-column>
+    </el-table>
+    <template #footer>
+      <el-button type="info" @click="showDialog=false">取消</el-button>
+      <el-button type="primary" @click="submit">确定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { exportExcel } from "/@/utils/excel";
+import { ref } from "vue";
+import { ElMessage } from "element-plus";
+
+let showDialog = ref(false);
+let data = ref([]);
+let columns = ref([]);
+let selectColumns = ref([]);
+
+
+const props = defineProps({
+  plain: {
+    type: Boolean,
+    default: false
+  },
+  type: {
+    type: String,
+    default: "success"
+  },
+  size: {
+    type: String,
+    default: "default"
+  },
+  showDataColumn: {
+    type: Boolean,
+    default: false
+  },
+});
+
+defineExpose({
+  open
+});
+
+function open(d, c) {
+  showDialog.value = true;
+  data.value = d;
+  columns.value = c;
+  selectColumns.value = [];
+}
+
+function selectRow(e) {
+  selectColumns.value = e;
+}
+
+function submit() {
+  try {
+    exportExcel(data.value, selectColumns.value);
+  } catch (e) {
+    ElMessage({ type: "error", message: e, grouping: true });
+  }
+}
+
+const emit = defineEmits(["click"]);
+
+function btnClick() {
+  emit("click");
+}
+
+
+</script>
+
+<style scoped>
+
+</style>

+ 30 - 39
src/utils/excel.js

@@ -1,50 +1,41 @@
 import * as XLSX from "xlsx";
 
-/**
- *
- * @param json 数据源
- * @param name 表名
- * @param titleArr 列名集合
- * @param sheetName 分页名
- */
-export const exportExcel = (json, name, titleArr, sheetName = "") => {
-  /* convert state to workbook */
-  let data = new Array();
-  let keyArray = new Array();
-  const getLength = function(obj) {
-    let count = 0;
-    for (let i in obj) {
-      if (obj.hasOwnProperty(i)) {
-        count++;
-      }
+
+export const exportExcel = (dataSource, columns, fileName = "excel", sheetName = "") => {
+
+  let excelTitle = [];
+  let dataTitle = [];
+  let data = [];
+  if (columns.length === 0) {
+    throw "输出列为空";
+  } else if (dataSource.length === 0) {
+    throw "数据源为空";
+  } else {
+    for (let i in columns) {
+      excelTitle.push(columns[i].label);
+      dataTitle.push(columns[i].name);
     }
-    return count;
-  };
-  for (const key1 in json) {
-    if (json.hasOwnProperty(key1)) {
-      const element = json[key1];
-      let rowDataArray = new Array();
-      for (const key2 in element) {
-        if (element.hasOwnProperty(key2)) {
-          const element2 = element[key2];
-          rowDataArray.push(element2);
-          if (keyArray.length < getLength(element)) {
-            keyArray.push(key2);
-          }
-        }
+
+    let keys = Object.keys(dataSource[0]);
+    for (let k of dataTitle) {
+      if (keys.indexOf(k) === -1) {
+        throw "数据源中不存在列:" + k;
       }
-      data.push(rowDataArray);
     }
   }
-  // keyArray为英文字段表头
-  data.splice(0, 0, keyArray, titleArr);
+
+  data.push(excelTitle);//第一行为列名
+
+  for (let row of dataSource) {
+    let newRow = [];
+    for (let i in dataTitle) {
+      newRow.push(row[dataTitle[i]] ? row[dataTitle[i]] : "");
+    }
+    data.push(newRow);
+  }
 
   const ws = XLSX.utils.aoa_to_sheet(data);
   const wb = XLSX.utils.book_new();
-  // 此处隐藏英文字段表头
-  let wsrows = [{ hidden: true }];
-  ws["!rows"] = wsrows; // ws - worksheet
   XLSX.utils.book_append_sheet(wb, ws, sheetName);
-  // generate file and send to client
-  XLSX.writeFile(wb, name + ".xlsx");
+  XLSX.writeFile(wb, fileName + ".xlsx");
 };

+ 42 - 21
src/views/backend/enterprise/orderManagement/orderHistory/index.vue

@@ -9,19 +9,23 @@
                         v-model="search.beginDate" placeholder="起始日期"></el-date-picker>
         <el-date-picker style="margin-right: 20px;width: 250px" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
                         v-model="search.endDate" placeholder="截止日期"></el-date-picker>
-        <el-button type="primary" @click="getData">索</el-button>
-        <el-button type="success" @click="exExcel">生成Excel</el-button>
+        <el-button type="primary" @click="getData">索</el-button>
+        <buttonExportExcel ref="exportExcelRef" @click="exportExcel">生成Excel</buttonExportExcel>
       </div>
       <el-table :data="tableData" border style="margin-top: 20px">
-        <el-table-column label="门店"></el-table-column>
-        <el-table-column label="客户"></el-table-column>
-        <el-table-column label="交易类型"></el-table-column>
-        <el-table-column label="交易日期"></el-table-column>
-        <el-table-column label="成交金额"></el-table-column>
-        <el-table-column label="会员状态"></el-table-column>
-        <el-table-column label="联系电话"></el-table-column>
+        <el-table-column prop="storeName" label="门店"></el-table-column>
+        <el-table-column prop="memberName" label="会员" min-width="150px"></el-table-column>
+        <el-table-column prop="mobileNumber" label="联系电话" min-width="150px"></el-table-column>
+        <el-table-column prop="goodsName" label="货品"></el-table-column>
+        <el-table-column prop="goodsPrice" label="定价"></el-table-column>
+        <el-table-column prop="discountAmount" label="折扣"></el-table-column>
+        <el-table-column prop="orderAmount" label="订单价"></el-table-column>
+        <el-table-column prop="memberCouponName" label="优惠券"></el-table-column>
+        <el-table-column prop="actualAmount" label="实付金额"></el-table-column>
+        <el-table-column prop="saleCount" label="数量"></el-table-column>
+        <el-table-column prop="createTime" label="订单创建时间" min-width="150px"></el-table-column>
       </el-table>
-      <el-pagination style="background: #ffffff;padding: 20px 0px"
+      <el-pagination style="background: #ffffff;padding: 20px 0"
                      v-model:current-page="page.pageNumber"
                      v-model:page-size="page.pageSize"
                      :page-sizes="page.pageSizes"
@@ -39,15 +43,17 @@
 </template>
 
 <script setup>
-import { ref, reactive, onMounted, provide } from "vue";
+import { ref, reactive, onMounted } from "vue";
 import { order, orderExport, store } from "/@/api/controllerUrls";
-import { exportExcel } from "/@/utils/excel.js";
 import request from "/@/api/request";
+import buttonExportExcel from "/@/components/common/buttonExportExcel.vue";
 
 let tableData = ref([]);
 
 let storeList = ref([]);
 
+let exportExcelRef = ref();
+
 let search = reactive({
   storeId: "",
   beginDate: "",
@@ -74,7 +80,7 @@ function getData() {
     endDate: search.endDate,
     storeId: search.storeId
   }).then((res) => {
-    if (res.code == 1) {
+    if (res.code === 1) {
       tableData.value = res.data.list;
       page.total = +res.data.total;
     }
@@ -83,24 +89,39 @@ function getData() {
 
 function getInitData() {
   request.index(store, {}, "list").then((res) => {
-    if (res.code == 1) {
+    if (res.code === 1) {
       storeList.value = res.data;
     }
   });
 }
 
-async function exExcel() {
-  const titleArr = ["姓名", "年龄"];//表头中文名
-  const res = await request.index(orderExport, {
-    limit: page.pageSize,
-    page: page.pageNumber,
+
+async function exportExcel() {
+  const columns = [
+    { name: "storeName", label: "门店" },
+    { name: "goodsName", label: "货品" },
+    { name: "goodsPrice", label: "定价" },
+    { name: "discountAmount", label: "折扣" },
+    { name: "orderAmount", label: "订单价" },
+    { name: "memberCouponName", label: "优惠券" },
+    { name: "actualAmount", label: "实付金额" },
+    { name: "saleCount", label: "数量" },
+    { name: "memberName", label: "会员" },
+    { name: "mobileNumber", label: "联系电话" },
+    { name: "createTime", label: "订单创建时间" }
+  ];//表头中文名
+  const res = await request.edit(orderExport, {
     beginDate: search.beginDate,
     endDate: search.endDate,
     storeId: search.storeId
   }, "");
-  if (res.code == 1) {
+  if (res.code === 1) {
     let data = res.data;
-    exportExcel(data, "订单列表", titleArr, "sheet1");
+    data.forEach(item => {
+      item["memberCouponName"] = item.memberCouponName ? item.memberCouponName : "";
+      // item["storeName"] = item.storeName ? item.storeName : "";
+    });
+    exportExcelRef.value.open(data, columns);
   }
 
 

+ 21 - 12
src/views/backend/enterprise/project/parking/editDialog.vue

@@ -54,6 +54,14 @@
                 </el-radio-group>
               </el-form-item>
             </el-col>
+            <el-col :span="12">
+              <el-form-item label="是否上架" prop="parkingStatus">
+                <el-radio-group v-model="formData.parkingStatus">
+                  <el-radio :label="0">是</el-radio>
+                  <el-radio :label="1">否</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
             <el-divider />
             <el-col :span="24">
               <el-form-item label="是否出售" prop="isSale">
@@ -64,12 +72,12 @@
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="售价" prop="salePrice" v-if="formData.isSale == 1">
+              <el-form-item label="售价" prop="salePrice" v-if="formData.isSale === 1">
                 <el-input v-model="formData.salePrice"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="出售状态" prop="saleStatus" v-if="formData.isSale == 1">
+              <el-form-item label="出售状态" prop="saleStatus" v-if="formData.isSale === 1">
                 <el-select v-model="formData.saleStatus">
                   <el-option :value="0" label="待售"></el-option>
                   <el-option :value="1" label="已售"></el-option>
@@ -87,12 +95,12 @@
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="租金" prop="hirePrice" v-if="formData.isHire == 1">
+              <el-form-item label="租金" prop="hirePrice" v-if="formData.isHire === 1">
                 <el-input v-model="formData.hirePrice"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="出租状态" prop="hireStatus" v-if="formData.isHire == 1">
+              <el-form-item label="出租状态" prop="hireStatus" v-if="formData.isHire === 1">
                 <el-select v-model="formData.hireStatus">
                   <el-option :value="0" label="待租"></el-option>
                   <el-option :value="1" label="已租"></el-option>
@@ -125,7 +133,7 @@
 <script setup>
 import { reactive, ref } from "vue";
 import request from "/@/api/request";
-import { district_list, parking } from "/@/api/controllerUrls";
+import {  parking } from "/@/api/controllerUrls";
 import { ElMessage } from "element-plus";
 import pictureUpload from "/@/components/pictureUpload/index.vue";
 import pictureUpload2 from "/@/components/pictureUpload/multiple.vue";
@@ -146,7 +154,7 @@ defineExpose({
 
 function open(type1, data, districtId, communityId, buildingId) {
   type.value = type1;
-  if (type1 == "add") {
+  if (type1 === "add") {
     formRef.value?.resetFields();
     formData.districtId = districtId;
     formData.communityId = communityId;
@@ -175,7 +183,8 @@ let formData = reactive({
   salePrice: 0,//售价
   saleStatus: 0,//出售状态
   contactNumber: "",//联系电话
-  parkingShow: "<p><br></p>"//车位简介
+  parkingShow: "<p><br></p>",//车位简介
+  parkingStatus:0,//是否上架
 });
 
 let formRules = {
@@ -201,7 +210,7 @@ function getInitData(event) {
   request.index(parking, {
     id: event
   }, "detail").then((res) => {
-    if (res.code == 1) {
+    if (res.code === 1) {
       formRef.value?.resetFields();
       for (let key in formData) {
         formData[key] = res.data[key];
@@ -214,19 +223,19 @@ function getInitData(event) {
 function submit() {
   formRef.value.validate((valid) => {
     if (valid) {
-      if (formData.isHire == 0 && formData.isSale == 0) {
+      if (formData.isHire === 0 && formData.isSale === 0) {
         ElMessage({ type: "warning", message: "请选择售卖类型", grouping: true });
         return;
       }
-      if (type.value == "add") {
+      if (type.value === "add") {
         request.add(parking, formData).then((res) => {
-          if (res.code == 1) {
+          if (res.code === 1) {
             showDialog.value = false;
           }
         });
       } else {
         request.edit(parking, formData).then((res) => {
-          if (res.code == 1) {
+          if (res.code === 1) {
             showDialog.value = false;
           }
         });

+ 24 - 27
src/views/backend/enterprise/project/parking/index.vue

@@ -2,29 +2,15 @@
   <div class="default-main ">
     <div style="display: flex;justify-content: space-between;background: #ffffff;padding: 20px">
       <div style="display: flex;align-items: center">
-        <!--        <span>区县:</span>-->
-        <!--        <el-select v-model="districtId" placeholder="请选择区县" style="width: 150px;margin-right: 10px"-->
-        <!--                   @change="selectDstrict"-->
-        <!--                   :clearable="true">-->
-        <!--          <el-option v-for="item in districtList" :label="item.districtName" :value="item.id"></el-option>-->
-        <!--        </el-select>-->
-        <!--        <span>小区:</span>-->
-        <!--        <el-select v-model="communityId" placeholder="请选择小区" style="width: 150px;margin-right: 10px"-->
-        <!--                   @change="selectCommunity" :clearable="true">-->
-        <!--          <el-option v-for="item in communityList" :label="item.communityName" :value="item.id"></el-option>-->
-        <!--        </el-select>-->
-        <!--        <span>楼号:</span>-->
-        <!--        <el-select v-model="buildingId" placeholder="请选择楼号" style="width: 150px;margin-right: 10px"-->
-        <!--                   @change="selectBuilding"-->
-        <!--                   :clearable="true">-->
-        <!--          <el-option v-for="item in buildingList" :label="item.buildingNumber" :value="item.id"></el-option>-->
-        <!--        </el-select>-->
         <el-button v-if="auth('add')" type="primary" :disabled="buildingId == ''"
                    @click="openDialog('add')">登记车位
         </el-button>
         <el-button v-if="auth('map')" type="primary" :disabled="buildingId == ''"
                    @click="parkingMapRef.open(buildingId)">车位绑定
         </el-button>
+        <el-button type="primary"
+                   @click="getData">刷新
+        </el-button>
       </div>
       <div>
         <el-input v-model="quickSearch" placeholder="通过车位编号模糊检索" @change="getData" clearable></el-input>
@@ -34,23 +20,26 @@
     <div
       style="display: flex;background-color: #ffffff;width: 100%;padding: 0 20px 20px 20px;justify-content: space-between">
       <el-tree node-key="id" :expand-on-click-node="false" :data="treeData"
-               style="width: 250px;border: #d0d0d0 1px solid" highlight-current @nodeClick="treeNodeClick">
+               style="width: 200px;border: #d0d0d0 1px solid" highlight-current @nodeClick="treeNodeClick">
         <template #default="{node,data}">
           <span>{{ data.label ? data.label : data.buildingNumber }}</span>
         </template>
       </el-tree>
 
-      <div style="width: calc(100% - 270px);">
+      <div style="width: calc(100% - 220px);">
         <div style="color: #3f6ad8">
           <span>当前位置:</span>
           <span>{{ dir }}</span>
         </div>
         <el-table style="margin-top: 10px" :data="parkingData" border @row-dblclick="detailDialogRef.open($event)">
-          <el-table-column prop="districtName" label="区县"></el-table-column>
-          <el-table-column prop="communityName" label="小区"></el-table-column>
+          <el-table-column prop="districtName" label="位置" min-width="150px">
+            <template #default="{row}">
+              <span>{{ row.districtName + " / " + row.communityName }}</span>
+            </template>
+          </el-table-column>
           <el-table-column prop="buildingNumber" label="楼号"></el-table-column>
           <el-table-column prop="parkingNumber" label="车位编号"></el-table-column>
-          <el-table-column prop="parkingType" label="车位类型" width="100">
+          <el-table-column prop="parkingType" label="车位类型">
             <template #default="{ row }">
               <span>{{ row.parkingType == 1 ? "车库" : "车位" }}</span>
             </template>
@@ -87,6 +76,14 @@
               </el-tag>
             </template>
           </el-table-column>
+          <el-table-column label="车位状态">
+            <template #default="{ row }">
+              <el-tag :type="row.parkingStatus == 1 ? 'info' : 'success'"
+                      style="margin: 0 5px;">
+                {{ ["正常", "下架"][row.parkingStatus] }}
+              </el-tag>
+            </template>
+          </el-table-column>
           <el-table-column label="是否标记">
             <template #default="{ row }">
               <el-tag :type="row.mapId == 0 ? 'danger' : 'success'" style="margin: 0 5px;">{{ row.mapId
@@ -94,18 +91,18 @@
               </el-tag>
             </template>
           </el-table-column>
-          <el-table-column label="操作" width="150" header-align="center">
+          <el-table-column label="操作" width="100" header-align="center">
             <template #default="{ row }">
               <div style="display: flex;justify-content: center;">
                 <el-button v-if="auth('edit')" class="table-operate" size="small" type="warning"
                            @click="openDialog('edit', row)">
-                  <icon name="el-icon-edit"></icon>
+                  <Icon name="el-icon-edit"></Icon>
                 </el-button>
                 <el-popconfirm width="220" confirm-button-text="确定" cancel-button-text="取消" title="是否确定删除?"
                                @confirm="deleteRow(row)">
                   <template #reference>
                     <el-button v-if="auth('del')" class="table-operate" type="danger" size="small">
-                      <icon name="el-icon-delete"></icon>
+                      <Icon name="el-icon-delete"></Icon>
                     </el-button>
                   </template>
                 </el-popconfirm>
@@ -113,7 +110,7 @@
             </template>
           </el-table-column>
         </el-table>
-        <el-pagination style="background: #ffffff;padding: 20px 0px"
+        <el-pagination style="background: #ffffff;padding: 20px 0"
                        v-model:current-page="currentPage"
                        v-model:page-size="pageSize"
                        :page-sizes="[10, 20, 50, 100]"
@@ -213,7 +210,7 @@ function selectCommunity(event: any) {
 
 let parkingData = ref([]);
 
-function selectBuilding(event: any) {
+function selectBuilding() {
   getData();
 }