5 Revize 3d0dddf502 ... 7dd56f01fb

Autor SHA1 Zpráva Datum
  yigeren911 7dd56f01fb Project Init před 1 rokem
  yigeren911 9a11b1affd Project Init před 1 rokem
  yigeren911 fdc46992a8 Project Init před 1 rokem
  yigeren911 5cd8bb5f2b Project Init před 1 rokem
  yigeren911 6d42336da7 Project Init před 1 rokem

+ 157 - 1
package-lock.json

@@ -33,7 +33,8 @@
         "vform3-builds": "^3.0.8",
         "vite-plugin-compression": "^0.5.1",
         "vue": "~3.2.25",
-        "vue-router": "~4.0.12"
+        "vue-router": "~4.0.12",
+        "xlsx": "^0.18.5"
       },
       "devDependencies": {
         "@types/lodash": "~4.14.180",
@@ -712,6 +713,14 @@
         "node": ">= 10.0.0"
       }
     },
+    "node_modules/adler-32": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
+      "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/agent-base": {
       "version": "6.0.2",
       "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz",
@@ -1058,6 +1067,18 @@
         "upper-case-first": "^2.0.2"
       }
     },
+    "node_modules/cfb": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
+      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+      "dependencies": {
+        "adler-32": "~1.3.0",
+        "crc-32": "~1.2.0"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/chalk": {
       "version": "4.1.2",
       "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
@@ -1185,6 +1206,14 @@
         "node": ">=0.8"
       }
     },
+    "node_modules/codepage": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
+      "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/color-convert": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
@@ -1245,6 +1274,17 @@
       "resolved": "https://registry.npmmirror.com/countup.js/-/countup.js-2.0.8.tgz",
       "integrity": "sha512-pW3xwwD+hB+xmtI16xFcuLS0D5hSQqPQWkZOdgpKQyzxCquDNo2VCFPkRw12vmvdpnicXVTcjmYiakG6biwINg=="
     },
+    "node_modules/crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+      "bin": {
+        "crc32": "bin/crc32.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -2624,6 +2664,14 @@
         "pause-stream": "~0.0.11"
       }
     },
+    "node_modules/frac": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
+      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/fs-extra": {
       "version": "8.1.0",
       "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz",
@@ -4971,6 +5019,17 @@
       "resolved": "https://registry.npmmirror.com/spark-md5/-/spark-md5-3.0.2.tgz",
       "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="
     },
+    "node_modules/ssf": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
+      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+      "dependencies": {
+        "frac": "~1.1.2"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/ssr-window": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz",
@@ -5631,6 +5690,22 @@
         "semver": "bin/semver"
       }
     },
+    "node_modules/wmf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
+      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/word": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
+      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/word-wrap": {
       "version": "1.2.3",
       "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -5664,6 +5739,26 @@
       "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
     },
+    "node_modules/xlsx": {
+      "version": "0.18.5",
+      "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz",
+      "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
+      "dependencies": {
+        "adler-32": "~1.3.0",
+        "cfb": "~1.2.1",
+        "codepage": "~1.15.0",
+        "crc-32": "~1.2.1",
+        "ssf": "~0.11.2",
+        "wmf": "~1.0.1",
+        "word": "~0.3.0"
+      },
+      "bin": {
+        "xlsx": "bin/xlsx.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/xml2js": {
       "version": "0.4.23",
       "resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.4.23.tgz",
@@ -6213,6 +6308,11 @@
       "resolved": "https://registry.npmmirror.com/address/-/address-1.2.1.tgz",
       "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA=="
     },
+    "adler-32": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
+      "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
+    },
     "agent-base": {
       "version": "6.0.2",
       "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz",
@@ -6509,6 +6609,15 @@
         "upper-case-first": "^2.0.2"
       }
     },
+    "cfb": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
+      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+      "requires": {
+        "adler-32": "~1.3.0",
+        "crc-32": "~1.2.0"
+      }
+    },
     "chalk": {
       "version": "4.1.2",
       "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
@@ -6609,6 +6718,11 @@
       "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
       "dev": true
     },
+    "codepage": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
+      "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA=="
+    },
     "color-convert": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
@@ -6663,6 +6777,11 @@
       "resolved": "https://registry.npmmirror.com/countup.js/-/countup.js-2.0.8.tgz",
       "integrity": "sha512-pW3xwwD+hB+xmtI16xFcuLS0D5hSQqPQWkZOdgpKQyzxCquDNo2VCFPkRw12vmvdpnicXVTcjmYiakG6biwINg=="
     },
+    "crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
+    },
     "cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -7611,6 +7730,11 @@
         "pause-stream": "~0.0.11"
       }
     },
+    "frac": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
+      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
+    },
     "fs-extra": {
       "version": "8.1.0",
       "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz",
@@ -9484,6 +9608,14 @@
       "resolved": "https://registry.npmmirror.com/spark-md5/-/spark-md5-3.0.2.tgz",
       "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="
     },
+    "ssf": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
+      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+      "requires": {
+        "frac": "~1.1.2"
+      }
+    },
     "ssr-window": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz",
@@ -9992,6 +10124,16 @@
         }
       }
     },
+    "wmf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
+      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
+    },
+    "word": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
+      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
+    },
     "word-wrap": {
       "version": "1.2.3",
       "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -10019,6 +10161,20 @@
       "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
     },
+    "xlsx": {
+      "version": "0.18.5",
+      "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz",
+      "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
+      "requires": {
+        "adler-32": "~1.3.0",
+        "cfb": "~1.2.1",
+        "codepage": "~1.15.0",
+        "crc-32": "~1.2.1",
+        "ssf": "~0.11.2",
+        "wmf": "~1.0.1",
+        "word": "~0.3.0"
+      }
+    },
     "xml2js": {
       "version": "0.4.23",
       "resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.4.23.tgz",

+ 2 - 1
package.json

@@ -34,7 +34,8 @@
     "vform3-builds": "^3.0.8",
     "vite-plugin-compression": "^0.5.1",
     "vue": "~3.2.25",
-    "vue-router": "~4.0.12"
+    "vue-router": "~4.0.12",
+    "xlsx": "^0.18.5"
   },
   "devDependencies": {
     "@types/lodash": "~4.14.180",

+ 0 - 78
src/api/backend/enterprise/order.ts

@@ -1,78 +0,0 @@
-import createAxios from '/@/utils/axios'
-import {order} from '/@/api/controllerUrls'
-
-export function detail(data: any) {
-    return createAxios({
-        url: order + 'detail',
-        method: 'get',
-        params:data,
-    })
-}
-
-export function sendRecord(data: any) {
-    return createAxios({
-        url: order + 'deliver/detail',
-        method: 'get',
-        params:data,
-    })
-}
-
-
-export function getExpressList() {
-    return createAxios({
-        url: order + 'express/list',
-        method: 'get'
-    })
-}
-
-export function expressPost(data:any) {
-    return createAxios({
-        url: order + 'deliver',
-        method: 'post',
-        data:data
-    })
-}
-
-export function signInPost(data:any) {
-    return createAxios({
-        url: order + 'deliver/confirm',
-        method: 'post',
-        data:data
-    })
-}
-
-export function editExpressInPost(data:any) {
-    return createAxios({
-        url: order + 'deliver/edit',
-        method: 'post',
-        data:data
-    })
-}
-
-export function getAftersale(data:any) {
-    return createAxios({
-        url: order + 'refund/index',
-        method: 'get',
-        params:data
-    })
-}
-
-
-export function getCouponDetail(data:any) {
-    return createAxios({
-        url: order + 'coupon/detail',
-        method: 'get',
-        params:data
-    })
-}
-
-export function editOrderPost(data:any) {
-    return createAxios({
-        url: order + 'edit',
-        method: 'post',
-        data:data
-    })
-}
-
-
-

+ 2 - 2
src/api/controllerUrls.ts

@@ -41,8 +41,6 @@ export const recommendPartner = "/recommend/partner/"; //好物伙伴
 
 export const member = "/member/"; //用户管理
 export const feedback = "/feedback/"; //意见建议
-export const order = "/order/"; //订单管理
-export const orderExpress = "/order/express/";
 export const statistics = "/statistics/"; //控制台数据统计
 export const moments = "/moments/"; //圈子管理
 export const dataScreen = "/statistics/view/"; //数据大屏用户管理
@@ -68,3 +66,5 @@ export const storeGoods = "/store/goods/"; //门店管理
 export const storeEmployee = "/store/employee/"; //店员管理
 export const ad = "/ad/"; //广告管理
 export const entrust = "/entrust/"; //客户委托
+export const order = "/store/order/"; //订单列表
+export const orderExport = "/store/order/export"; //导出订单列表

binární
src/assets/font/SourceHanSansSC-Normal-2.otf


+ 200 - 186
src/components/table/comSearch/index.vue

@@ -1,214 +1,228 @@
 <template>
-    <transition name="el-fade-in">
-        <div class="table-com-search">
-            <el-form @keyup.enter="onComSearch" label-position="top" :model="baTable.comSearch.form">
-                <el-row>
-                    <template v-for="(item, idx) in baTable.table.column" :key="idx">
-                        <template v-if="item.operator !== false">
-                            <el-col  v-if="item.render == 'datetime' && (item.operator == 'RANGE' || item.operator == 'NOT RANGE')" :span="8">
-                                <div class="com-search-col mt-20 flex justify-flex-start">
-                                    <div class="com-search-col-label ">{{ item.label }}:</div>
-                                    <div class="com-search-col-input-range">
-                                        <el-date-picker
-                                            class="datetime-picker"
-                                            v-model="baTable.comSearch.form[item.prop!]"
-                                            :default-value="baTable.comSearch.form[item.prop! + '-default'] ? baTable.comSearch.form[item.prop! + '-default']:[new Date(), new Date()]"
-                                            type="datetimerange"
-                                             range-separator="至"
-                                            start-placeholder="开始日期"
-                                            end-placeholder="结束日期"
-                                            value-format="YYYY-MM-DD HH:mm:ss"
-                                        />
-                                    </div>
-                                </div>
-                            </el-col>
-                             <el-col v-else-if="item.render == 'dateType' && (item.operator == 'RANGE' || item.operator == 'NOT RANGE')" :span="8">
-                                <div class="com-search-col mt-20 flex justify-flex-start">
-                                    <div class="com-search-col-label ">{{ item.label }}:</div>
-                                    <div class="com-search-col-input-range">
-                                        <el-date-picker
-                                            class="datetime-picker"
-                                            v-model="baTable.comSearch.form[item.prop!]"
-                                            :default-value="baTable.comSearch.form[item.prop! + '-default'] ? baTable.comSearch.form[item.prop! + '-default']:[new Date(), new Date()]"
-                                            type="daterange"
-                                            range-separator="至"
-                                            start-placeholder="开始日期"
-                                            end-placeholder="结束日期"
-                                            value-format="YYYY-MM-DD"
-                                        />
-                                    </div>
-                                </div>
-                            </el-col>
-                            <el-col v-else :span="8">
-                                <div class="com-search-col mt-20 flex justify-flex-start">
-                                    <div class="com-search-col-label">{{ item.label }}:</div>
-                                    <div v-if="item.operator == 'RANGE' || item.operator == 'NOT RANGE'" class="com-search-col-input-range">
-                                        <el-input
-                                            :placeholder="item.operatorPlaceholder"
-                                            type="string"
-                                            v-model="baTable.comSearch.form[item.prop! + '-start']"
-                                        ></el-input>
-                                        <div class="range-separator">{{ $t('to') }}</div>
-                                        <el-input
-                                            :placeholder="item.operatorPlaceholder"
-                                            type="string"
-                                            v-model="baTable.comSearch.form[item.prop! + '-end']"
-                                        ></el-input>
-                                    </div>
-                                    <div v-else-if="item.operator == 'NULL' || item.operator == 'NOT NULL'" class="com-search-col-input">
-                                        <el-checkbox v-model="baTable.comSearch.form[item.prop!]" :label="item.operator" size="large"></el-checkbox>
-                                    </div>
-                                    <div v-else-if="item.operator" class="com-search-col-input">
-                                        <el-date-picker
-                                            class="datetime-picker"
-                                            v-if="item.render == 'datetime'"
-                                            v-model="baTable.comSearch.form[item.prop!]"
-                                            type="datetime"
-                                            value-format="YYYY-MM-DD HH:mm:ss"
-                                            :placeholder="item.operatorPlaceholder"
-                                            :default-value="baTable.comSearch.form[item.prop! + '-default'] ? baTable.comSearch.form[item.prop! + '-default']:new Date()"
-                                        ></el-date-picker>
-                                        <el-select
-                                            :placeholder="item.operatorPlaceholder"
-                                            v-else-if="item.render == 'tag'"
-                                            v-model="baTable.comSearch.form[item.prop!]"
-                                            :clearable="true"
-                                            class="w100"
-                                        >
-                                            <el-option v-for="(opt, okey) in item.replaceValue" :key="item.prop! + okey" :label="opt" :value="okey" />
-                                        </el-select>
-                                        <el-input
-                                            :placeholder="item.operatorPlaceholder"
-                                            v-else
-                                            type="string"
-                                            v-model="baTable.comSearch.form[item.prop!]"
-                                        ></el-input>
-                                    </div>
-                                </div>
-                            </el-col>
-                        </template>
-                    </template>
-                </el-row>
-                <el-row>
-                    <el-col :span="24">
-                        <div class="com-search-col pl-20 mt-20 mr-20 flex justify-flex-end">
-                            <div class="box">
-                            <el-button v-blur @click="onComSearch" type="primary">搜索</el-button>
-                            <el-button @click="onResetForm()">重置</el-button>
-                            </div>
-                        </div>
-                    </el-col>
-                </el-row>
-            </el-form>
-        </div>
-    </transition>
+  <transition name="el-fade-in">
+    <div class="table-com-search">
+      <el-form @keyup.enter="onComSearch" label-position="top" :model="baTable.comSearch.form">
+        <el-row>
+          <template v-for="(item, idx) in baTable.table.column" :key="idx">
+            <template v-if="item.operator !== false">
+              <el-col v-if="item.render == 'datetime' && (item.operator == 'RANGE' || item.operator == 'NOT RANGE')"
+                      :span="8">
+                <div class="com-search-col mt-20 flex justify-flex-start">
+                  <div class="com-search-col-label ">{{ item.label }}:</div>
+                  <div class="com-search-col-input-range">
+                    <el-date-picker
+                      class="datetime-picker"
+                      v-model="baTable.comSearch.form[item.prop!]"
+                      :default-value="baTable.comSearch.form[item.prop! + '-default'] ? baTable.comSearch.form[item.prop! + '-default']:[new Date(), new Date()]"
+                      type="datetimerange"
+                      range-separator="至"
+                      start-placeholder="开始日期"
+                      end-placeholder="结束日期"
+                      value-format="YYYY-MM-DD HH:mm:ss"
+                    />
+                  </div>
+                </div>
+              </el-col>
+              <el-col
+                v-else-if="item.render == 'dateType' && (item.operator == 'RANGE' || item.operator == 'NOT RANGE')"
+                :span="8">
+                <div class="com-search-col mt-20 flex justify-flex-start">
+                  <div class="com-search-col-label ">{{ item.label }}:</div>
+                  <div class="com-search-col-input-range">
+                    <el-date-picker
+                      class="datetime-picker"
+                      v-model="baTable.comSearch.form[item.prop!]"
+                      :default-value="baTable.comSearch.form[item.prop! + '-default'] ? baTable.comSearch.form[item.prop! + '-default']:[new Date(), new Date()]"
+                      type="daterange"
+                      range-separator="至"
+                      start-placeholder="开始日期"
+                      end-placeholder="结束日期"
+                      value-format="YYYY-MM-DD"
+                    />
+                  </div>
+                </div>
+              </el-col>
+              <el-col v-else :span="8">
+                <div class="com-search-col mt-20 flex justify-flex-start">
+                  <div class="com-search-col-label">{{ item.label }}:</div>
+                  <div v-if="item.operator == 'RANGE' || item.operator == 'NOT RANGE'"
+                       class="com-search-col-input-range">
+                    <el-input
+                      :placeholder="item.operatorPlaceholder"
+                      type="string"
+                      v-model="baTable.comSearch.form[item.prop! + '-start']"
+                    ></el-input>
+                    <div class="range-separator">{{ $t("to") }}</div>
+                    <el-input
+                      :placeholder="item.operatorPlaceholder"
+                      type="string"
+                      v-model="baTable.comSearch.form[item.prop! + '-end']"
+                    ></el-input>
+                  </div>
+                  <div v-else-if="item.operator == 'NULL' || item.operator == 'NOT NULL'" class="com-search-col-input">
+                    <el-checkbox v-model="baTable.comSearch.form[item.prop!]" :label="item.operator"
+                                 size="large"></el-checkbox>
+                  </div>
+                  <div v-else-if="item.operator" class="com-search-col-input">
+                    <el-date-picker
+                      class="datetime-picker"
+                      v-if="item.render == 'datetime'"
+                      v-model="baTable.comSearch.form[item.prop!]"
+                      type="datetime"
+                      value-format="YYYY-MM-DD HH:mm:ss"
+                      :placeholder="item.operatorPlaceholder"
+                      :default-value="baTable.comSearch.form[item.prop! + '-default'] ? baTable.comSearch.form[item.prop! + '-default']:new Date()"
+                    ></el-date-picker>
+                    <el-select
+                      :placeholder="item.operatorPlaceholder"
+                      v-else-if="item.render == 'tag'"
+                      v-model="baTable.comSearch.form[item.prop!]"
+                      :clearable="true"
+                      class="w100"
+                    >
+                      <el-option v-for="(opt, okey) in item.replaceValue" :key="item.prop! + okey" :label="opt"
+                                 :value="okey" />
+                    </el-select>
+                    <el-input
+                      :placeholder="item.operatorPlaceholder"
+                      v-else
+                      type="string"
+                      v-model="baTable.comSearch.form[item.prop!]"
+                    ></el-input>
+                  </div>
+                </div>
+              </el-col>
+            </template>
+          </template>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <div class="com-search-col pl-20 mt-20 mr-20 flex justify-flex-end">
+              <div class="box">
+                <el-button v-blur @click="onComSearch" type="primary">搜索</el-button>
+                <el-button @click="onResetForm()">重置</el-button>
+              </div>
+            </div>
+          </el-col>
+        </el-row>
+      </el-form>
+    </div>
+  </transition>
 </template>
 
 <script setup lang="ts">
-import { inject } from 'vue'
-import useCurrentInstance from '/@/utils/useCurrentInstance'
-import type baTableClass from '/@/utils/baTable'
+import { inject } from "vue";
+import useCurrentInstance from "/@/utils/useCurrentInstance";
+import type baTableClass from "/@/utils/baTable";
 
-const { proxy } = useCurrentInstance()
+const { proxy } = useCurrentInstance();
 
-const baTable = inject('baTable') as baTableClass
+const baTable = inject("baTable") as baTableClass;
 
 const onComSearch = () => {
 
-    let comSearchData: comSearchData[] = []
-    for (const key in baTable.comSearch.form) {
-        if (!baTable.comSearch.fieldData.has(key)) {
-            continue
-        }
-
-        let val = ''
-        let fieldDataTemp = baTable.comSearch.fieldData.get(key)
-
-        if ((fieldDataTemp.render == 'datetime' || fieldDataTemp.render=='dateType' ) && (fieldDataTemp.operator == 'RANGE' || fieldDataTemp.operator == 'NOT RANGE')) {
-
-            // 时间范围组件返回的是时间数组
-            if (baTable.comSearch.form[key] && baTable.comSearch.form[key].length >= 2) {
-                // 数组转字符串,以实现通过url参数传递预设搜索值
-                val = baTable.comSearch.form[key][0] + ',' + baTable.comSearch.form[key][1]
-            }
-        } else if (fieldDataTemp.operator == 'RANGE' || fieldDataTemp.operator == 'NOT RANGE') {
-            // 普通的范围筛选,baTable在初始化时已准备好start和end字段
-            if (!baTable.comSearch.form[key + '-start'] && !baTable.comSearch.form[key + '-end']) {
-                continue
-            }
-            val = baTable.comSearch.form[key + '-start'] + ',' + baTable.comSearch.form[key + '-end']
-        } else if (baTable.comSearch.form[key]) {
-            val = baTable.comSearch.form[key]
-        }
-
-        if (val) {
-            comSearchData.push({
-                field: key,
-                val: val,
-                operator: fieldDataTemp.operator,
-                render: fieldDataTemp.render,
-            })
-        }
+  let comSearchData: comSearchData[] = [];
+  for (const key in baTable.comSearch.form) {
+
+    if (!baTable.comSearch.fieldData.has(key)) {
+      continue;
     }
+    let val = "";
 
-    proxy.eventBus.emit('onTableComSearch', comSearchData)
-}
+    let fieldDataTemp = baTable.comSearch.fieldData.get(key);
 
-const onResetForm = () => {
-    // 封装好的onResetForm在此处不能使用
-    for (const key in baTable.comSearch.form) {
-        baTable.comSearch.form[key] = ''
+    if ((fieldDataTemp.render == "datetime" || fieldDataTemp.render == "dateType") && (fieldDataTemp.operator == "RANGE" || fieldDataTemp.operator == "NOT RANGE")) {
+
+      // 时间范围组件返回的是时间数组
+      if (baTable.comSearch.form[key] && baTable.comSearch.form[key].length >= 2) {
+        // 数组转字符串,以实现通过url参数传递预设搜索值
+        val = baTable.comSearch.form[key][0] + "," + baTable.comSearch.form[key][1];
+      }
+    } else if (fieldDataTemp.operator == "RANGE" || fieldDataTemp.operator == "NOT RANGE") {
+      // 普通的范围筛选,baTable在初始化时已准备好start和end字段
+      if (!baTable.comSearch.form[key + "-start"] && !baTable.comSearch.form[key + "-end"]) {
+        continue;
+      }
+      val = baTable.comSearch.form[key + "-start"] + "," + baTable.comSearch.form[key + "-end"];
+    } else if (baTable.comSearch.form[key]) {
+      val = baTable.comSearch.form[key];
     }
-}
+
+    if (val) {
+      comSearchData.push({
+        field: key,
+        val: val,
+        operator: fieldDataTemp.operator,
+        render: fieldDataTemp.render
+      });
+    }
+  }
+
+  proxy.eventBus.emit("onTableComSearch", comSearchData);
+};
+
+const onResetForm = () => {
+  // 封装好的onResetForm在此处不能使用
+  for (const key in baTable.comSearch.form) {
+    baTable.comSearch.form[key] = "";
+  }
+};
 </script>
 
 <style scoped lang="scss">
 .table-com-search {
+  overflow: hidden;
+  box-sizing: border-box;
+  width: 100%;
+  max-width: 100%;
+  background-color: #ffffff;
+  border: 1px solid #f6f6f6;
+  border-bottom: none;
+  padding: 13px 15px;
+  font-size: 14px;
+
+  .com-search-col {
+    display: flex;
+    align-items: center;
+    padding-top: 8px;
+    color: var(--color-regular);
+    font-size: 13px;
+  }
+
+  .com-search-col-label {
+    width: 20%;
+    padding: 0 15px;
+    text-align: right;
     overflow: hidden;
-    box-sizing: border-box;
-    width: 100%;
-    max-width: 100%;
-    background-color: #ffffff;
-    border: 1px solid #f6f6f6;
-    border-bottom: none;
-    padding: 13px 15px;
-    font-size: 14px;
-    .com-search-col {
-        display: flex;
-        align-items: center;
-        padding-top: 8px;
-        color: var(--color-regular);
-        font-size: 13px;
-    }
-    .com-search-col-label {
-        width: 20%;
-        padding: 0 15px;
-        text-align: right;
-        overflow: hidden;
-        white-space: nowrap;
-    }
-    .com-search-col-input {
-        padding: 0 15px;
-        width: 80%;
-    }
-    .com-search-col-input-range {
-        display: flex;
-        align-items: center;
-        padding: 0 15px;
-        width: 80%;
-        .range-separator {
-            padding: 0 5px;
-        }
+    white-space: nowrap;
+  }
+
+  .com-search-col-input {
+    padding: 0 15px;
+    width: 80%;
+  }
+
+  .com-search-col-input-range {
+    display: flex;
+    align-items: center;
+    padding: 0 15px;
+    width: 80%;
+
+    .range-separator {
+      padding: 0 5px;
     }
+  }
 }
+
 :deep(.datetime-picker) {
-    width: 100%;
+  width: 100%;
 }
 
 .w16 {
-    width: 16.5% !important;
+  width: 16.5% !important;
 }
+
 .w83 {
-    width: 83.5% !important;
+  width: 83.5% !important;
 }
 </style>

+ 2 - 2
src/components/table/header/index.vue

@@ -50,7 +50,7 @@
       <div class="flex align-center ml-20">
         <div class="mr-15">
           <el-tooltip content="密度" placement="top">
-            <el-dropdown trigger="click" @command="onDrapDownSelect">
+            <el-dropdown trigger="click" @command="onDrapDownSelect" style="position: relative;top: 4px">
               <Icon name="fa fa-align-left" color="#515a6e" size="14" />
               <template #dropdown>
                 <el-dropdown-menu>
@@ -71,7 +71,7 @@
         </div>
         <div class="mr-15">
           <el-tooltip content="列设置" placement="top">
-            <el-dropdown :hide-on-click="true" trigger="click">
+            <el-dropdown :hide-on-click="true" trigger="click" style="position: relative;top: 4px">
               <Icon name="fa fa-sliders" color="#515a6e" size="14" />
               <template #dropdown>
                 <el-dropdown-menu>

+ 50 - 0
src/utils/excel.js

@@ -0,0 +1,50 @@
+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++;
+      }
+    }
+    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);
+          }
+        }
+      }
+      data.push(rowDataArray);
+    }
+  }
+  // keyArray为英文字段表头
+  data.splice(0, 0, keyArray, titleArr);
+
+  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");
+};

+ 2 - 2
src/views/backend/dashboard/index.vue

@@ -105,12 +105,12 @@
 <!--            <el-row :gutter="20">-->
 <!--                <el-col class="lg-mb-20" :xs="24" :sm="24" :md="12" :lg="12">-->
 <!--                    <el-card shadow="hover" :header="year+'年每月营业额统计'">-->
-<!--                        <saleAmount :data="echartsData.orderList"></saleAmount>-->
+<!--                        <saleAmount :data="echartsData.orderHistory"></saleAmount>-->
 <!--                    </el-card>-->
 <!--                </el-col>-->
 <!--                <el-col class="lg-mb-20" :xs="24" :sm="24" :md="12" :lg="12">-->
 <!--                    <el-card shadow="hover" :header="year+'每月销售台数统计'">-->
-<!--                        <saleCount :data="echartsData.orderList"></saleCount>-->
+<!--                        <saleCount :data="echartsData.orderHistory"></saleCount>-->
 <!--                    </el-card>-->
 <!--                </el-col>-->
 <!--            </el-row>-->

+ 56 - 27
src/views/backend/enterprise/members/entrust/auditDialog.vue

@@ -45,9 +45,9 @@
             <el-descriptions-item label="证明文件">
               <el-image v-if="data.evidenceFile.length>0"
                         style="width: 100px; height: 100px"
-                        :src="data.evidenceFile[0]"
-                        :zoom-rate="1.2"
-                        :preview-src-list="data.evidenceFile"
+                        :src="data.evidenceFile[0].url"
+                        :zoom-rate="1"
+                        :preview-src-list="data.evidenceFile.map(item=> item.url)"
                         fit="cover"
               />
             </el-descriptions-item>
@@ -65,34 +65,37 @@
             <el-tabs style="margin: 0 20px" v-model="activeTab">
               <el-tab-pane name="first" label="车位信息">
                 <el-row>
-                  <el-col :span="12">
+                  <el-col :span="24">
                     <el-form-item label="区县" prop="districtId">
-                      <el-select v-model="formData.districtId" @visible-change="getDistrict">
+                      <el-select v-model="formData.districtId" style="width: 50%" @change="getCommunity">
                         <el-option v-for="item in districtList" :label="item.districtName" :value="item.id"></el-option>
                       </el-select>
                     </el-form-item>
                   </el-col>
-                  <el-col :span="12">
+                  <el-col :span="24">
                     <el-form-item label="小区" prop="communityName">
-                      <el-select v-model="formData.communityName" @visible-change="getCommunity" allow-create filterable
-                                 clearable>
+                      <el-select v-if="!communityNameCustom" v-model="formData.communityName" style="width: 50%">
                         <el-option v-for="item in communityList" :label="item.communityName"
                                    :value="item.communityName"></el-option>
                       </el-select>
+                      <el-input v-else v-model="formData.communityName" style="width: 50%"></el-input>
+                      <el-checkbox v-model="communityNameCustom" style="margin-left: 20px">自定义</el-checkbox>
                     </el-form-item>
                   </el-col>
-                  <el-col :span="12">
+                  <el-col :span="24">
                     <el-form-item label="楼号" prop="buildingNumber">
-                      <el-select v-model="formData.buildingNumber" @visible-change="getBuilding" allow-create filterable
-                                 clearable>
+                      <el-select v-if="!buildingNumberCustom&&!communityNameCustom" v-model="formData.buildingNumber"
+                                 @visible-change="getBuilding" style="width: 50%">
                         <el-option v-for="item in buildingList" :label="item.buildingNumber"
                                    :value="item.buildingNumber"></el-option>
                       </el-select>
+                      <el-input v-else v-model="formData.buildingNumber" style="width: 50%"></el-input>
+                      <el-checkbox v-model="buildingNumberCustom" style="margin-left: 20px">自定义</el-checkbox>
                     </el-form-item>
                   </el-col>
-                  <el-col :span="12">
+                  <el-col :span="24">
                     <el-form-item label="车位编号" prop="parkingNumber">
-                      <el-input v-model="formData.parkingNumber"></el-input>
+                      <el-input v-model="formData.parkingNumber" style="width: 50%"></el-input>
                     </el-form-item>
                   </el-col>
                   <el-col :span="24">
@@ -106,7 +109,6 @@
                     </el-form-item>
                   </el-col>
                 </el-row>
-
               </el-tab-pane>
               <el-tab-pane name="second" label="车位简介">
                 <el-form-item label="" prop="parkingShow" label-width="0">
@@ -150,23 +152,39 @@ defineExpose({
 
 let data = ref({});
 
+let communityNameCustom = ref(false); //小区名自定义
+let buildingNumberCustom = ref(false); //楼号自定义
+
 function open(event) {
   data.value = event;
-  data.value.evidenceFile = data.value.evidenceFile ? JSON.parse(data.value.evidenceFile) : [];
+  // data.value.evidenceFile = data.value.evidenceFile ? JSON.parse(data.value.evidenceFile) : [];
 
   formRef.value?.resetFields();
   formData.id = data.value.id;
   formData.parkingNumber = event.parkingNumber;
   showDialog.value = true;
+  getDistrict();
 }
 
 function submit(event) {
-  formData.operate = event ? 1 : 0;
-  request.edit(entrust, formData, "release").then((res) => {
-    if (res.code == 1) {
-      showDialog.value = false;
-    }
-  });
+  formData.operateType = event ? 1 : 0;
+  if (event) {
+    formRef.value.validate((valid) => {
+      if (valid) {
+        request.edit(entrust, formData, "release").then((res) => {
+          if (res.code == 1) {
+            showDialog.value = false;
+          }
+        });
+      }
+    });
+  } else {
+    request.edit(entrust, formData, "release").then((res) => {
+      if (res.code == 1) {
+        showDialog.value = false;
+      }
+    });
+  }
 }
 
 let activeTab = ref("first");
@@ -175,7 +193,7 @@ let formRef = ref();
 
 let formData = reactive({
   id: "",//委托单id
-  operate: 1,
+  operateType: 1,
   districtId: "",
   communityName: "",
   buildingNumber: "",
@@ -204,8 +222,7 @@ let formRules = {
 //区县列表
 let districtList = ref([]);
 
-function getDistrict(event) {
-  if (!event) return;
+function getDistrict() {
   request.index(district_list, {}, "").then((res) => {
     if (res.code == 1) {
       districtList.value = res.data;
@@ -219,9 +236,12 @@ let communityList = ref([]);
 //选择区县,获取小区列表
 function getCommunity(event) {
   if (!event) return;
+  formData.communityName = "";
+
   request.index(community_list, {
     districtIds: formData.districtId
   }, "").then((res) => {
+
     if (res.code == 1) {
       communityList.value = res.data;
     }
@@ -234,15 +254,24 @@ let buildingList = ref([]);
 //选择小区,获取楼号列表
 function getBuilding(event) {
   if (!event) return;
-  if (/^[0-9]/.test(formData.communityId)) {
+  // if (!buildingNumberCustom.value) {
+    let communityId = "";
+    for (let r of communityList.value) {
+      if (r.communityName = formData.communityName) {
+        communityId = r.id;
+        break;
+      }
+    }
     request.index(building_list, {
-      communityIds: formData.communityId
+      communityIds: communityId
     }, "").then((res) => {
       if (res.code == 1) {
         buildingList.value = res.data;
       }
     });
-  }
+  // }
+
+
 }
 
 

+ 0 - 101
src/views/backend/enterprise/members/entrust/auditDialog2.vue

@@ -1,101 +0,0 @@
-<template>
-  <el-dialog title="委托详情" v-model="showDialog" width="800px" @close="closeDialog">
-    <el-descriptions
-      class="margin-top"
-      :title="'车位编号:'+data.parkingNumber"
-      :column="3"
-      border
-    >
-      <el-descriptions-item width="250" label="区县">
-        {{ data.districtName }}
-      </el-descriptions-item>
-      <el-descriptions-item width="250" label="小区">
-        {{ data.communityName }}
-      </el-descriptions-item>
-      <el-descriptions-item width="250" label="楼号">
-        {{ data.buildingNumber }}
-      </el-descriptions-item>
-      <el-descriptions-item width="250" label="车位类型">
-        {{ data.parkingType == 1 ? "车库" : "车位" }}
-      </el-descriptions-item>
-      <el-descriptions-item label="面积">
-        {{ data.area }}
-      </el-descriptions-item>
-      <el-descriptions-item label="售卖方式">
-        <el-tag style="margin: 0px 3px" v-if="data.entrustType==0">租售</el-tag>
-        <el-tag style="margin: 0px 3px" v-if="data.entrustType==1">出租</el-tag>
-        <el-tag style="margin: 0px 3px" v-if="data.entrustType==2">出售</el-tag>
-      </el-descriptions-item>
-      <el-descriptions-item label="售价">
-        {{ data.salePrice }}
-      </el-descriptions-item>
-      <el-descriptions-item label="租金">
-        {{ data.hirePrice }}
-      </el-descriptions-item>
-      <el-descriptions-item label="委托人联系电话">
-        {{ data.contactNumber }}
-      </el-descriptions-item>
-      <el-descriptions-item label="证明文件">
-        <el-image v-if="data.evidenceFile.length>0"
-                  style="width: 100px; height: 100px"
-                  :src="data.evidenceFile[0]"
-                  :zoom-rate="1.2"
-                  :preview-src-list="data.evidenceFile"
-                  fit="cover"
-        />
-      </el-descriptions-item>
-    </el-descriptions>
-
-    <template #footer>
-      <el-button type="success" @click="submit(true)">审核通过</el-button>
-      <el-button type="danger" @click="submit(false)">拒绝</el-button>
-    </template>
-
-  </el-dialog>
-</template>
-
-<script setup>
-
-import { ref } from "vue";
-import request from "/@/api/request";
-import { entrust } from "/@/api/controllerUrls";
-
-
-let showDialog = ref(false);
-
-
-defineExpose({
-  open
-});
-
-
-let data = ref({});
-
-function open(event) {
-  data.value = event;
-  data.value.evidenceFile = data.value.evidenceFile ? JSON.parse(data.value.evidenceFile) : [];
-  showDialog.value = true;
-}
-
-function submit(e) {
-  request.edit(entrust, {
-    id: data.value.id,
-    operate: e ? 1 : 0
-  }, "release").then((res) => {
-    if (res.code == 1) {
-      showDialog.value = false;
-    }
-  });
-}
-
-const emit = defineEmits(["close"]);
-
-function closeDialog() {
-  emit("close");
-}
-
-</script>
-
-<style scoped>
-
-</style>

+ 7 - 2
src/views/backend/enterprise/members/entrust/index.vue

@@ -42,7 +42,7 @@ let cancelBtn: OptButton[] = [
     title: "审核",
     text: "审核",
     type: "primary",
-    icon: "",
+    icon: '',
     class: "",
     disabledTip: false
   }
@@ -78,6 +78,7 @@ const baTable = new baTableClass(
         align: "center",
         render: "tag",
         operator: "=",
+        custom: { 0: "", 1: "info" },
         replaceValue: { 0: "委托中", 1: "已撤销" }
       },
       {
@@ -86,7 +87,8 @@ const baTable = new baTableClass(
         align: "center",
         render: "tag",
         operator: "=",
-        replaceValue: { 0: "待审核", 1: "审核通过", 3: "审核驳货" }
+        custom: { 0: "", 1: "success", 3: "info" },
+        replaceValue: { 0: "待审核", 1: "审核通过", 3: "审核驳回" }
       },
       { label: "创建时间", prop: "createTime", align: "center", width: "180", operator: false },
       {
@@ -139,6 +141,9 @@ const infoButtonClick = (row: TableRow) => {
   } else if (row.entrustStatus == 1) {
     ElMessage({ type: "warning", message: "用户已取消委托" });
     return;
+  } else if (row.releaseStatus !== 0) {
+    ElMessage({ type: "error", message: "该委托已审核" ,grouping:true});
+    return;
   }
 // 数据来自表格数据,未重新请求api,深克隆,不然可能会影响表格
   let rowClone = _.cloneDeep(row);

+ 113 - 0
src/views/backend/enterprise/orderManagement/orderHistory/index.vue

@@ -0,0 +1,113 @@
+<template>
+  <div class="default-main ">
+    <div style="background: #ffffff;padding: 20px">
+      <div style="display: flex;align-items: center;flex-wrap: wrap">
+        <el-select v-model="search.storeId" placeholder="销售门店" style="margin-right: 20px;width: 250px" clearable>
+          <el-option v-for="item in storeList" :label="item.storeName" :value="item.id"></el-option>
+        </el-select>
+        <el-date-picker style="margin-right: 20px;width: 250px" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
+                        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>
+      </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>
+      <el-pagination style="background: #ffffff;padding: 20px 0px"
+                     v-model:current-page="page.pageNumber"
+                     v-model:page-size="page.pageSize"
+                     :page-sizes="page.pageSizes"
+                     :background="true"
+                     layout="total, sizes,prev, pager, next, jumper"
+                     :total="page.total"
+                     @size-change="getData()"
+                     @current-change="getData()"
+      />
+
+
+    </div>
+
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, onMounted, provide } from "vue";
+import { order, orderExport, store } from "/@/api/controllerUrls";
+import { exportExcel } from "/@/utils/excel.js";
+import request from "/@/api/request";
+
+let tableData = ref([]);
+
+let storeList = ref([]);
+
+let search = reactive({
+  storeId: "",
+  beginDate: "",
+  endDate: ""
+});
+
+let page = reactive({
+  total: 0,
+  pageNumber: 1,
+  pageSize: 20,
+  pageSizes: [20, 100, 500]
+});
+
+onMounted(() => {
+  getData();
+  getInitData();
+});
+
+function getData() {
+  request.index(order, {
+    limit: page.pageSize,
+    page: page.pageNumber,
+    beginDate: search.beginDate,
+    endDate: search.endDate,
+    storeId: search.storeId
+  }).then((res) => {
+    if (res.code == 1) {
+      tableData.value = res.data.list;
+      page.total = +res.data.total;
+    }
+  });
+}
+
+function getInitData() {
+  request.index(store, {}, "list").then((res) => {
+    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,
+    beginDate: search.beginDate,
+    endDate: search.endDate,
+    storeId: search.storeId
+  }, "");
+  if (res.code == 1) {
+    let data = res.data;
+    exportExcel(data, "订单列表", titleArr, "sheet1");
+  }
+
+
+}
+
+
+</script>
+
+
+<style scoped lang="scss"></style>

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

@@ -113,12 +113,12 @@
             </template>
           </el-table-column>
         </el-table>
-        <el-pagination style="background: #ffffff;padding: 20px 20px"
+        <el-pagination style="background: #ffffff;padding: 20px 0px"
                        v-model:current-page="currentPage"
                        v-model:page-size="pageSize"
                        :page-sizes="[10, 20, 50, 100]"
                        :background="true"
-                       layout="sizes, prev, pager, next, jumper"
+                       layout="total,sizes, prev, pager, next, jumper"
                        :total="total"
                        @size-change="getData()"
                        @current-change="getData()"

+ 16 - 11
src/views/backend/enterprise/project/parking/mapSetting.vue

@@ -29,7 +29,7 @@
         </el-form-item>
         <el-form-item label="选择车位" prop="id">
           <el-select v-model="formData.id">
-            <el-option v-for="(item,index) in unMapData" :value="item.id" :label="item.parkingNumber"></el-option>
+            <el-option :key="index" v-for="(item,index) in unMapData" :value="item.id" :label="item.parkingNumber"></el-option>
           </el-select>
         </el-form-item>
       </el-form>
@@ -65,7 +65,7 @@ const props = defineProps({
   },
   height: {//外边框尺寸
     type: String,
-    default: "400px"
+    default: "800px"
   },
   value: {//标记点列表
     type: Array,
@@ -80,9 +80,8 @@ let width = ref(0);
 
 //图层样式
 let mapStyle = computed(() => {
-  const baseUrl = import.meta.env.VITE_AXIOS_BASE_URL;
   return {
-    backgroundImage: `url(${ props.imgUrl})`,
+    backgroundImage: `url(${realUrl.value})`,
     width: width.value + "px",
     height: height.value + "px",
     left: dragOption.x1 + "px",
@@ -90,33 +89,39 @@ let mapStyle = computed(() => {
   };
 });
 
+let realUrl = ref("");
+
 
 //图层实例
 let labelMap;
 
 onMounted(() => {
+  // realUrl.value = import.meta.env.VITE_AXIOS_BASE_URL + "/" + props.imgUrl
+  realUrl.value = props.imgUrl;
   labelMap = document.getElementById("labelMap");
   setTimeout(() => {
-    setImgSize(props.imgUrl);
+    setImgSize();
   }, 100);
 
 });
 
+watch(() => props.imgUrl, (newValue, oldValue) => {
+  // realUrl.value = import.meta.env.VITE_AXIOS_BASE_URL + "/" + newValue
+  realUrl.value = newValue;
+  setImgSize();
+});
 
 //根据容器宽度和原始图片长宽比例设置图层高度
-function setImgSize(url) {
+function setImgSize() {
   const m = document.getElementById("mapContainer");
   let img = new Image();
   img.onload = function() {
     width.value = m.clientWidth;
     height.value = m.clientWidth * (img.naturalHeight / img.naturalWidth);
   };
-  img.src =  url;
+  img.src = realUrl.value;
 }
 
-watch(() => props.imgUrl, (newValue) => {
-  setImgSize(newValue);
-});
 
 let unMapData = computed(() => {
   let res = [];
@@ -317,7 +322,7 @@ function wheel(event) {
 #mapContainer {
   overflow: hidden;
   border: #888888 1px solid;
-  position: relative
+  position: relative;
 }
 
 #labelMap {

+ 4 - 3
src/views/backend/enterprise/project/parking/markDialog.vue

@@ -2,15 +2,15 @@
   <el-dialog :title="title" v-model="showDialog" width="80%" @close="closeDialog">
     <el-row :gutter="20">
       <el-col :span="18">
-        <mapSetting :imgUrl="data.mapUrl" :mapId="data.mapId" :value="data.parkingList" @change="getInitData"></mapSetting>
+        <mapSetting height="60vh"  :imgUrl="data.mapUrl" :mapId="data.mapId" :value="data.parkingList" @change="getInitData"></mapSetting>
       </el-col>
       <el-col :span="6">
         <el-radio-group v-model="showType">
           <el-radio-button label="未绑定"></el-radio-button>
           <el-radio-button label="全部"></el-radio-button>
         </el-radio-group>
-        <el-table :data="showType=='全部'?allData:unMapData" height="400px" border
-                  style="margin-top: 10px;border: #8c939d 1px solid" highlight-current-row>
+        <el-table :data="showType=='全部'?allData:unMapData"  border
+                  style="margin-top: 10px;border: #8c939d 1px solid;height: 60vh" highlight-current-row>
           <el-table-column prop="parkingNumber" label="车位编号"></el-table-column>
         </el-table>
       </el-col>
@@ -50,6 +50,7 @@ function getInitData() {
     id: buildingId.value
   }, "detail").then((res) => {
     if (res.code == 1) {
+      console.log(res.data);
       title.value = `${res.data.districtName} / ${res.data.communityName} / ${res.data.buildingNumber}`;
       data.value = res.data;
       allData.value = res.data.parkingList;