suixueyan 8 months ago
parent
commit
760f76a4f2

File diff suppressed because it is too large
+ 0 - 0
dist/assets/AddEechnician-b0165e0d.css


File diff suppressed because it is too large
+ 0 - 0
dist/assets/AddOffline-40fde794.css


+ 0 - 1
dist/assets/Base-1379e8b4.css

@@ -1 +0,0 @@
-@charset "UTF-8";.el-menu[data-v-c7eb9005]{border-right:none}.el-menu .el-menu-item[data-v-c7eb9005]{height:auto;line-height:40px!important}.el-menu .el-sub-menu[data-v-c7eb9005]{display:grid}.el-table__header-wrapper tr th[data-v-c7eb9005]{background-color:#f5f5f7!important}.el-dialog__header[data-v-c7eb9005]{background-color:#f5f5f7;margin-right:0}.el-dialog__footer[data-v-c7eb9005]{border-top:1px solid #f5f5f7;padding-bottom:10px}.el-drawer__header[data-v-c7eb9005]{margin-bottom:0!important}html[data-v-c7eb9005],body[data-v-c7eb9005]{margin:0;padding:0;background:#f5f7fb;min-width:1200px}.box-shadow[data-v-c7eb9005]{box-shadow:0 0 13px #3030324b}.pagination-box[data-v-c7eb9005]{display:flex;justify-content:center;margin-top:10px}[data-v-c7eb9005]::-webkit-scrollbar{height:7px;width:5px}[data-v-c7eb9005]::-webkit-scrollbar-thumb{background:#d8d8d8;border-radius:10px}[data-v-c7eb9005]::-webkit-scrollbar-track-piece{background:transparent}.drawer-content[data-v-c7eb9005]{width:100%;height:calc(100% - 5px);overflow:hidden;overflow-y:auto}.drawer-foot[data-v-c7eb9005]{margin-top:10px}.config-base[data-v-c7eb9005]{width:100%;height:100%}.config-base .img-box[data-v-c7eb9005]{display:inline-block;margin-right:5px;width:148px;position:relative}.config-base .img-box img[data-v-c7eb9005]{width:100%;height:140px;object-fit:cover}.config-base .img-box .occlusion[data-v-c7eb9005]{display:none;width:100%;height:140px;background:rgba(158,156,156,.4588235294);position:absolute;top:0;left:0;z-index:99;text-align:center}.config-base .img-box .occlusion .del[data-v-c7eb9005]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);line-height:148px;color:#464444;cursor:pointer;font-size:large}.config-base .img-box .occlusion .del[data-v-c7eb9005]:hover{color:#828385}.config-base .img-box:hover .occlusion[data-v-c7eb9005]{display:block}

+ 0 - 1
dist/assets/BottomMenu-45e84a1e.css

@@ -1 +0,0 @@
-@charset "UTF-8";.el-menu[data-v-0777413d]{border-right:none}.el-menu .el-menu-item[data-v-0777413d]{height:auto;line-height:40px!important}.el-menu .el-sub-menu[data-v-0777413d]{display:grid}.el-table__header-wrapper tr th[data-v-0777413d]{background-color:#f5f5f7!important}.el-dialog__header[data-v-0777413d]{background-color:#f5f5f7;margin-right:0}.el-dialog__footer[data-v-0777413d]{border-top:1px solid #f5f5f7;padding-bottom:10px}.el-drawer__header[data-v-0777413d]{margin-bottom:0!important}html[data-v-0777413d],body[data-v-0777413d]{margin:0;padding:0;background:#f5f7fb;min-width:1200px}.box-shadow[data-v-0777413d]{box-shadow:0 0 13px #3030324b}.pagination-box[data-v-0777413d]{display:flex;justify-content:center;margin-top:10px}[data-v-0777413d]::-webkit-scrollbar{height:7px;width:5px}[data-v-0777413d]::-webkit-scrollbar-thumb{background:#d8d8d8;border-radius:10px}[data-v-0777413d]::-webkit-scrollbar-track-piece{background:transparent}.drawer-content[data-v-0777413d]{width:100%;height:calc(100% - 5px);overflow:hidden;overflow-y:auto}.drawer-foot[data-v-0777413d]{margin-top:10px}.config-wx[data-v-0777413d]{width:100%;height:100%;overflow:hidden;overflow-y:auto}.config-wx .wx-title[data-v-0777413d]{font-size:18px;font-weight:700;margin:10px 0}.config-wx .img-box[data-v-0777413d]{display:inline-block;margin-right:5px;width:148px;position:relative}.config-wx .img-box img[data-v-0777413d]{width:100%;height:140px;object-fit:cover}.config-wx .img-box .occlusion[data-v-0777413d]{display:none;width:100%;height:140px;background:rgba(158,156,156,.4588235294);position:absolute;top:0;left:0;z-index:99;text-align:center}.config-wx .img-box .occlusion .del[data-v-0777413d]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);line-height:148px;color:#464444;cursor:pointer;font-size:large}.config-wx .img-box .occlusion .del[data-v-0777413d]:hover{color:#828385}.config-wx .img-box:hover .occlusion[data-v-0777413d]{display:block}

File diff suppressed because it is too large
+ 0 - 0
dist/assets/Index-9c1c99eb.css


File diff suppressed because it is too large
+ 0 - 0
dist/assets/Offline-117e534e.css


File diff suppressed because it is too large
+ 0 - 0
dist/assets/Order-c5060c1b.css


File diff suppressed because it is too large
+ 0 - 0
dist/assets/index-c07b1e4f.css


+ 2 - 2
dist/index.html

@@ -9,8 +9,8 @@
       type="text/javascript"
     ></script>
     <title></title>
-    <script type="module" crossorigin src="./assets/index-2d37c11c.js"></script>
-    <link rel="stylesheet" href="./assets/index-c07b1e4f.css">
+    <script type="module" crossorigin src="./assets/index-b6c64bef.js"></script>
+    <link rel="stylesheet" href="./assets/index-dbad0f5d.css">
   </head>
   <body>
     <div id="app"></div>

+ 88 - 82
node_modules/.vite/deps/_metadata.json

@@ -1,384 +1,402 @@
 {
   "hash": "6893e684",
-  "browserHash": "6cc004ea",
+  "browserHash": "f9b95dcd",
   "optimized": {
     "@element-plus/icons-vue": {
       "src": "../../@element-plus/icons-vue/dist/index.js",
       "file": "@element-plus_icons-vue.js",
-      "fileHash": "db28a516",
+      "fileHash": "745b325d",
       "needsInterop": false
     },
     "@wangeditor/editor-for-vue": {
       "src": "../../@wangeditor/editor-for-vue/dist/index.esm.js",
       "file": "@wangeditor_editor-for-vue.js",
-      "fileHash": "f593e0d9",
+      "fileHash": "1fd91049",
       "needsInterop": false
     },
     "axios": {
       "src": "../../axios/index.js",
       "file": "axios.js",
-      "fileHash": "cdf9c6f2",
+      "fileHash": "7f02c14d",
       "needsInterop": false
     },
     "echarts": {
       "src": "../../echarts/index.js",
       "file": "echarts.js",
-      "fileHash": "9520d32d",
+      "fileHash": "0464edf8",
       "needsInterop": false
     },
     "element-plus": {
       "src": "../../element-plus/es/index.mjs",
       "file": "element-plus.js",
-      "fileHash": "ee0d4221",
+      "fileHash": "d624a23d",
       "needsInterop": false
     },
     "element-plus/dist/locale/zh-cn.mjs": {
       "src": "../../element-plus/dist/locale/zh-cn.mjs",
       "file": "element-plus_dist_locale_zh-cn__mjs.js",
-      "fileHash": "17828ebc",
+      "fileHash": "51cd7bfb",
       "needsInterop": false
     },
     "mitt": {
       "src": "../../mitt/dist/mitt.mjs",
       "file": "mitt.js",
-      "fileHash": "8e69751a",
+      "fileHash": "f2333815",
       "needsInterop": false
     },
     "pinia": {
       "src": "../../pinia/dist/pinia.mjs",
       "file": "pinia.js",
-      "fileHash": "78160ae1",
+      "fileHash": "96b4653a",
       "needsInterop": false
     },
     "tlbs-map-vue": {
       "src": "../../tlbs-map-vue/dist/v3/index.es.js",
       "file": "tlbs-map-vue.js",
-      "fileHash": "a9ef3de5",
+      "fileHash": "9d1ec76f",
       "needsInterop": false
     },
     "uuid": {
       "src": "../../uuid/dist/esm-browser/index.js",
       "file": "uuid.js",
-      "fileHash": "2fb2bc65",
+      "fileHash": "099dd00a",
       "needsInterop": false
     },
     "vue": {
       "src": "../../vue/dist/vue.runtime.esm-bundler.js",
       "file": "vue.js",
-      "fileHash": "ee8686df",
+      "fileHash": "e52059e9",
       "needsInterop": false
     },
     "vue-router": {
       "src": "../../vue-router/dist/vue-router.mjs",
       "file": "vue-router.js",
-      "fileHash": "4075bacd",
+      "fileHash": "d9a25fbe",
       "needsInterop": false
     },
     "element-plus/es": {
       "src": "../../element-plus/es/index.mjs",
       "file": "element-plus_es.js",
-      "fileHash": "e82f4d14",
+      "fileHash": "d901b9e4",
       "needsInterop": false
     },
     "element-plus/es/components/base/style/index": {
       "src": "../../element-plus/es/components/base/style/index.mjs",
       "file": "element-plus_es_components_base_style_index.js",
-      "fileHash": "01054baa",
+      "fileHash": "5a6ed472",
       "needsInterop": false
     },
     "element-plus/es/components/config-provider/style/index": {
       "src": "../../element-plus/es/components/config-provider/style/index.mjs",
       "file": "element-plus_es_components_config-provider_style_index.js",
-      "fileHash": "24ea9382",
+      "fileHash": "142d7eab",
       "needsInterop": false
     },
     "element-plus/es/components/dialog/style/index": {
       "src": "../../element-plus/es/components/dialog/style/index.mjs",
       "file": "element-plus_es_components_dialog_style_index.js",
-      "fileHash": "a0538d87",
+      "fileHash": "8a362676",
       "needsInterop": false
     },
     "element-plus/es/components/button/style/index": {
       "src": "../../element-plus/es/components/button/style/index.mjs",
       "file": "element-plus_es_components_button_style_index.js",
-      "fileHash": "81906de0",
+      "fileHash": "f9fc4b09",
       "needsInterop": false
     },
     "element-plus/es/components/checkbox/style/index": {
       "src": "../../element-plus/es/components/checkbox/style/index.mjs",
       "file": "element-plus_es_components_checkbox_style_index.js",
-      "fileHash": "28558087",
+      "fileHash": "23168da0",
       "needsInterop": false
     },
     "element-plus/es/components/input/style/index": {
       "src": "../../element-plus/es/components/input/style/index.mjs",
       "file": "element-plus_es_components_input_style_index.js",
-      "fileHash": "5e8b2944",
+      "fileHash": "33bb1668",
       "needsInterop": false
     },
     "element-plus/es/components/loading/style/index": {
       "src": "../../element-plus/es/components/loading/style/index.mjs",
       "file": "element-plus_es_components_loading_style_index.js",
-      "fileHash": "2549f04c",
+      "fileHash": "2164fa8c",
       "needsInterop": false
     },
     "element-plus/es/components/form/style/index": {
       "src": "../../element-plus/es/components/form/style/index.mjs",
       "file": "element-plus_es_components_form_style_index.js",
-      "fileHash": "89908839",
+      "fileHash": "ef804d4b",
       "needsInterop": false
     },
     "element-plus/es/components/descriptions/style/index": {
       "src": "../../element-plus/es/components/descriptions/style/index.mjs",
       "file": "element-plus_es_components_descriptions_style_index.js",
-      "fileHash": "4d857106",
+      "fileHash": "cceb6a78",
       "needsInterop": false
     },
     "element-plus/es/components/descriptions-item/style/index": {
       "src": "../../element-plus/es/components/descriptions-item/style/index.mjs",
       "file": "element-plus_es_components_descriptions-item_style_index.js",
-      "fileHash": "9f735cff",
+      "fileHash": "a8210acf",
       "needsInterop": false
     },
     "element-plus/es/components/upload/style/index": {
       "src": "../../element-plus/es/components/upload/style/index.mjs",
       "file": "element-plus_es_components_upload_style_index.js",
-      "fileHash": "30d37127",
+      "fileHash": "1b03d887",
       "needsInterop": false
     },
     "element-plus/es/components/icon/style/index": {
       "src": "../../element-plus/es/components/icon/style/index.mjs",
       "file": "element-plus_es_components_icon_style_index.js",
-      "fileHash": "97f7fb92",
+      "fileHash": "a754b423",
       "needsInterop": false
     },
     "element-plus/es/components/date-picker/style/index": {
       "src": "../../element-plus/es/components/date-picker/style/index.mjs",
       "file": "element-plus_es_components_date-picker_style_index.js",
-      "fileHash": "5624c4eb",
+      "fileHash": "86965a41",
       "needsInterop": false
     },
     "element-plus/es/components/cascader/style/index": {
       "src": "../../element-plus/es/components/cascader/style/index.mjs",
       "file": "element-plus_es_components_cascader_style_index.js",
-      "fileHash": "bdefce87",
+      "fileHash": "35d55825",
       "needsInterop": false
     },
     "element-plus/es/components/select/style/index": {
       "src": "../../element-plus/es/components/select/style/index.mjs",
       "file": "element-plus_es_components_select_style_index.js",
-      "fileHash": "10fdbae5",
+      "fileHash": "133f2736",
       "needsInterop": false
     },
     "element-plus/es/components/option/style/index": {
       "src": "../../element-plus/es/components/option/style/index.mjs",
       "file": "element-plus_es_components_option_style_index.js",
-      "fileHash": "5b47af3d",
+      "fileHash": "b7bd4476",
       "needsInterop": false
     },
     "element-plus/es/components/checkbox-group/style/index": {
       "src": "../../element-plus/es/components/checkbox-group/style/index.mjs",
       "file": "element-plus_es_components_checkbox-group_style_index.js",
-      "fileHash": "afdb61c0",
+      "fileHash": "21986f7a",
       "needsInterop": false
     },
     "element-plus/es/components/radio-group/style/index": {
       "src": "../../element-plus/es/components/radio-group/style/index.mjs",
       "file": "element-plus_es_components_radio-group_style_index.js",
-      "fileHash": "8d1c101a",
+      "fileHash": "a50a855c",
       "needsInterop": false
     },
     "element-plus/es/components/radio/style/index": {
       "src": "../../element-plus/es/components/radio/style/index.mjs",
       "file": "element-plus_es_components_radio_style_index.js",
-      "fileHash": "c3e2099b",
+      "fileHash": "780d6a12",
       "needsInterop": false
     },
     "element-plus/es/components/form-item/style/index": {
       "src": "../../element-plus/es/components/form-item/style/index.mjs",
       "file": "element-plus_es_components_form-item_style_index.js",
-      "fileHash": "22c9a821",
+      "fileHash": "0b0136be",
       "needsInterop": false
     },
     "element-plus/es/components/message/style/index": {
       "src": "../../element-plus/es/components/message/style/index.mjs",
       "file": "element-plus_es_components_message_style_index.js",
-      "fileHash": "07fe838a",
+      "fileHash": "ce9abcba",
       "needsInterop": false
     },
     "element-plus/es/components/tabs/style/index": {
       "src": "../../element-plus/es/components/tabs/style/index.mjs",
       "file": "element-plus_es_components_tabs_style_index.js",
-      "fileHash": "81026630",
+      "fileHash": "1b047f55",
       "needsInterop": false
     },
     "element-plus/es/components/tab-pane/style/index": {
       "src": "../../element-plus/es/components/tab-pane/style/index.mjs",
       "file": "element-plus_es_components_tab-pane_style_index.js",
-      "fileHash": "b5adc1a2",
+      "fileHash": "c0f6a4fd",
       "needsInterop": false
     },
     "element-plus/es/components/dropdown/style/index": {
       "src": "../../element-plus/es/components/dropdown/style/index.mjs",
       "file": "element-plus_es_components_dropdown_style_index.js",
-      "fileHash": "0e9c6153",
+      "fileHash": "421c4551",
       "needsInterop": false
     },
     "element-plus/es/components/dropdown-menu/style/index": {
       "src": "../../element-plus/es/components/dropdown-menu/style/index.mjs",
       "file": "element-plus_es_components_dropdown-menu_style_index.js",
-      "fileHash": "ca46e267",
+      "fileHash": "06200545",
       "needsInterop": false
     },
     "element-plus/es/components/switch/style/index": {
       "src": "../../element-plus/es/components/switch/style/index.mjs",
       "file": "element-plus_es_components_switch_style_index.js",
-      "fileHash": "97709746",
+      "fileHash": "21e63178",
       "needsInterop": false
     },
     "element-plus/es/components/dropdown-item/style/index": {
       "src": "../../element-plus/es/components/dropdown-item/style/index.mjs",
       "file": "element-plus_es_components_dropdown-item_style_index.js",
-      "fileHash": "c67e4c66",
+      "fileHash": "6a68c518",
       "needsInterop": false
     },
     "element-plus/es/components/tag/style/index": {
       "src": "../../element-plus/es/components/tag/style/index.mjs",
       "file": "element-plus_es_components_tag_style_index.js",
-      "fileHash": "d375ef9c",
+      "fileHash": "85f3bd0b",
       "needsInterop": false
     },
     "element-plus/es/components/table/style/index": {
       "src": "../../element-plus/es/components/table/style/index.mjs",
       "file": "element-plus_es_components_table_style_index.js",
-      "fileHash": "86e74f90",
+      "fileHash": "7cbec313",
       "needsInterop": false
     },
     "element-plus/es/components/table-column/style/index": {
       "src": "../../element-plus/es/components/table-column/style/index.mjs",
       "file": "element-plus_es_components_table-column_style_index.js",
-      "fileHash": "62b87a5f",
+      "fileHash": "47242d53",
       "needsInterop": false
     },
     "element-plus/es/components/radio-button/style/index": {
       "src": "../../element-plus/es/components/radio-button/style/index.mjs",
       "file": "element-plus_es_components_radio-button_style_index.js",
-      "fileHash": "c2ff2240",
+      "fileHash": "968b593b",
       "needsInterop": false
     },
     "element-plus/es/components/menu/style/index": {
       "src": "../../element-plus/es/components/menu/style/index.mjs",
       "file": "element-plus_es_components_menu_style_index.js",
-      "fileHash": "1438d895",
+      "fileHash": "b55c2b11",
       "needsInterop": false
     },
     "element-plus/es/components/tree-select/style/index": {
       "src": "../../element-plus/es/components/tree-select/style/index.mjs",
       "file": "element-plus_es_components_tree-select_style_index.js",
-      "fileHash": "7b2fe5b7",
+      "fileHash": "6243296e",
       "needsInterop": false
     },
     "element-plus/es/components/message-box/style/index": {
       "src": "../../element-plus/es/components/message-box/style/index.mjs",
       "file": "element-plus_es_components_message-box_style_index.js",
-      "fileHash": "b30adf2b",
+      "fileHash": "92d0ab15",
       "needsInterop": false
     },
     "element-plus/es/components/sub-menu/style/index": {
       "src": "../../element-plus/es/components/sub-menu/style/index.mjs",
       "file": "element-plus_es_components_sub-menu_style_index.js",
-      "fileHash": "319b6d96",
+      "fileHash": "742176c2",
       "needsInterop": false
     },
     "element-plus/es/components/menu-item/style/index": {
       "src": "../../element-plus/es/components/menu-item/style/index.mjs",
       "file": "element-plus_es_components_menu-item_style_index.js",
-      "fileHash": "8f7878d3",
+      "fileHash": "281216df",
       "needsInterop": false
     },
     "element-plus/es/components/pagination/style/index": {
       "src": "../../element-plus/es/components/pagination/style/index.mjs",
       "file": "element-plus_es_components_pagination_style_index.js",
-      "fileHash": "b307f1c2",
+      "fileHash": "15a120a8",
       "needsInterop": false
     },
     "element-plus/es/components/image/style/index": {
       "src": "../../element-plus/es/components/image/style/index.mjs",
       "file": "element-plus_es_components_image_style_index.js",
-      "fileHash": "aa4d3b84",
+      "fileHash": "b9e981db",
       "needsInterop": false
     },
     "element-plus/es/components/input-number/style/index": {
       "src": "../../element-plus/es/components/input-number/style/index.mjs",
       "file": "element-plus_es_components_input-number_style_index.js",
-      "fileHash": "bd8356f4",
+      "fileHash": "389f43e5",
       "needsInterop": false
     },
     "element-plus/es/components/row/style/index": {
       "src": "../../element-plus/es/components/row/style/index.mjs",
       "file": "element-plus_es_components_row_style_index.js",
-      "fileHash": "ca2a8685",
+      "fileHash": "b2c2ec34",
       "needsInterop": false
     },
     "element-plus/es/components/col/style/index": {
       "src": "../../element-plus/es/components/col/style/index.mjs",
       "file": "element-plus_es_components_col_style_index.js",
-      "fileHash": "4284154e",
+      "fileHash": "cce25d68",
       "needsInterop": false
     },
     "element-plus/es/components/time-picker/style/index": {
       "src": "../../element-plus/es/components/time-picker/style/index.mjs",
       "file": "element-plus_es_components_time-picker_style_index.js",
-      "fileHash": "85c06605",
+      "fileHash": "d9359692",
       "needsInterop": false
     },
     "element-plus/es/components/tooltip/style/index": {
       "src": "../../element-plus/es/components/tooltip/style/index.mjs",
       "file": "element-plus_es_components_tooltip_style_index.js",
-      "fileHash": "fa61eb2b",
+      "fileHash": "1f5aa320",
       "needsInterop": false
     },
     "element-plus/es/components/drawer/style/index": {
       "src": "../../element-plus/es/components/drawer/style/index.mjs",
       "file": "element-plus_es_components_drawer_style_index.js",
-      "fileHash": "c077b3e9",
+      "fileHash": "74f046ec",
       "needsInterop": false
     },
     "element-plus/es/components/timeline/style/index": {
       "src": "../../element-plus/es/components/timeline/style/index.mjs",
       "file": "element-plus_es_components_timeline_style_index.js",
-      "fileHash": "b3b810cd",
+      "fileHash": "ff83b41c",
       "needsInterop": false
     },
     "element-plus/es/components/timeline-item/style/index": {
       "src": "../../element-plus/es/components/timeline-item/style/index.mjs",
       "file": "element-plus_es_components_timeline-item_style_index.js",
-      "fileHash": "7331f844",
+      "fileHash": "74858fd4",
       "needsInterop": false
     },
     "element-plus/es/components/steps/style/index": {
       "src": "../../element-plus/es/components/steps/style/index.mjs",
       "file": "element-plus_es_components_steps_style_index.js",
-      "fileHash": "c47c3ba2",
+      "fileHash": "7b165139",
       "needsInterop": false
     },
     "element-plus/es/components/step/style/index": {
       "src": "../../element-plus/es/components/step/style/index.mjs",
       "file": "element-plus_es_components_step_style_index.js",
-      "fileHash": "d9437f06",
+      "fileHash": "bf0aeac4",
       "needsInterop": false
     },
     "element-plus/es/components/tree/style/index": {
       "src": "../../element-plus/es/components/tree/style/index.mjs",
       "file": "element-plus_es_components_tree_style_index.js",
-      "fileHash": "557d4c8a",
+      "fileHash": "378f5034",
+      "needsInterop": false
+    },
+    "element-plus/es/components/color-picker/style/index": {
+      "src": "../../element-plus/es/components/color-picker/style/index.mjs",
+      "file": "element-plus_es_components_color-picker_style_index.js",
+      "fileHash": "7cb72cdd",
       "needsInterop": false
     }
   },
   "chunks": {
+    "chunk-WDWATO6A": {
+      "file": "chunk-WDWATO6A.js"
+    },
     "chunk-77OY2OEM": {
       "file": "chunk-77OY2OEM.js"
     },
+    "chunk-JC3H47UB": {
+      "file": "chunk-JC3H47UB.js"
+    },
+    "chunk-OCBBHAF6": {
+      "file": "chunk-OCBBHAF6.js"
+    },
+    "chunk-2Q2DV3S3": {
+      "file": "chunk-2Q2DV3S3.js"
+    },
     "chunk-WAV56Z47": {
       "file": "chunk-WAV56Z47.js"
     },
@@ -394,33 +412,21 @@
     "chunk-FJUH325V": {
       "file": "chunk-FJUH325V.js"
     },
-    "chunk-JC3H47UB": {
-      "file": "chunk-JC3H47UB.js"
-    },
-    "chunk-O44FNDI6": {
-      "file": "chunk-O44FNDI6.js"
-    },
-    "chunk-OCBBHAF6": {
-      "file": "chunk-OCBBHAF6.js"
-    },
-    "chunk-VID4RN2V": {
-      "file": "chunk-VID4RN2V.js"
-    },
-    "chunk-2Q2DV3S3": {
-      "file": "chunk-2Q2DV3S3.js"
+    "chunk-JFLPTVTI": {
+      "file": "chunk-JFLPTVTI.js"
     },
     "chunk-D3GLGQUN": {
       "file": "chunk-D3GLGQUN.js"
     },
-    "chunk-WDWATO6A": {
-      "file": "chunk-WDWATO6A.js"
-    },
-    "chunk-JFLPTVTI": {
-      "file": "chunk-JFLPTVTI.js"
+    "chunk-O44FNDI6": {
+      "file": "chunk-O44FNDI6.js"
     },
     "chunk-ERMSXNQF": {
       "file": "chunk-ERMSXNQF.js"
     },
+    "chunk-VID4RN2V": {
+      "file": "chunk-VID4RN2V.js"
+    },
     "chunk-MFGQ5WJW": {
       "file": "chunk-MFGQ5WJW.js"
     },

+ 2 - 2
node_modules/.vite/deps/element-plus_es_components_cascader_style_index.js

@@ -1,9 +1,9 @@
+import "./chunk-JC3H47UB.js";
 import "./chunk-T4FAW4IY.js";
 import "./chunk-OU6PNR2X.js";
 import "./chunk-S63DCEQS.js";
-import "./chunk-JC3H47UB.js";
-import "./chunk-O44FNDI6.js";
 import "./chunk-JFLPTVTI.js";
+import "./chunk-O44FNDI6.js";
 import "./chunk-ERMSXNQF.js";
 
 // node_modules/element-plus/es/components/cascader/style/index.mjs

+ 1 - 1
node_modules/.vite/deps/element-plus_es_components_date-picker_style_index.js

@@ -1,7 +1,7 @@
 import "./chunk-OU6PNR2X.js";
 import "./chunk-S63DCEQS.js";
-import "./chunk-O44FNDI6.js";
 import "./chunk-D3GLGQUN.js";
+import "./chunk-O44FNDI6.js";
 import "./chunk-ERMSXNQF.js";
 
 // node_modules/element-plus/es/components/date-picker/style/index.mjs

+ 1 - 1
node_modules/.vite/deps/element-plus_es_components_message-box_style_index.js

@@ -1,6 +1,6 @@
-import "./chunk-O44FNDI6.js";
 import "./chunk-2Q2DV3S3.js";
 import "./chunk-D3GLGQUN.js";
+import "./chunk-O44FNDI6.js";
 import "./chunk-ERMSXNQF.js";
 
 // node_modules/element-plus/es/components/message-box/style/index.mjs

+ 1 - 1
node_modules/.vite/deps/element-plus_es_components_tree-select_style_index.js

@@ -1,9 +1,9 @@
+import "./chunk-WDWATO6A.js";
 import "./chunk-WAV56Z47.js";
 import "./chunk-T4FAW4IY.js";
 import "./chunk-OU6PNR2X.js";
 import "./chunk-S63DCEQS.js";
 import "./chunk-FJUH325V.js";
-import "./chunk-WDWATO6A.js";
 import "./chunk-JFLPTVTI.js";
 import "./chunk-ERMSXNQF.js";
 

+ 54 - 0
src/plugins/api/activity/activity.js

@@ -6,6 +6,13 @@ export function listApi(data) {
         data,
     });
 }
+export function entriesListApi(data) {
+    return request({
+        url: "/shop/activityEntry/entries",
+        method: "post",
+        data,
+    });
+}
 export function addApi(data) {
     return request({
         url: "/shop/activity/add",
@@ -28,3 +35,50 @@ export function delApi(data) {
         params: data,
     });
 }
+
+
+//  售后订单管理
+export function refundListApi(data) {
+    return request({
+        url: "/shop/entryRefund/index",
+        method: "post",
+        data,
+    });
+}
+
+// 发起退款
+
+export function redoApi(data) {
+    return request({
+        url: "/shop/entryRefund/redo",
+        method: "post",
+        data,
+    });
+}
+// 售后申请处理
+// type
+// 1退款,2发货
+export function refundApi(data) {
+    return request({
+        url: "/shop/entryRefund/refund",
+        method: "post",
+        data,
+    });
+}
+export function detailRefundApi(data) {
+    return request({
+        url: "/shop/entryRefund/detail",
+        method: "post",
+        data,
+    });
+}
+//  售后申请审核
+// status
+// 0拒绝,1审核通过
+export function auditApi(data) {
+    return request({
+        url: "/shop/entryRefund/audit",
+        method: "post",
+        data,
+    });
+}

+ 91 - 1
src/plugins/api/reservation/reservation.js

@@ -67,4 +67,94 @@ export function vacationdelApi(data) {
     });
 }
 
-//  商品修改
+//  预约列表
+export function admitListApi(data) {
+    return request({
+        url: "/shop/admit/index",
+        method: "post",
+        data,
+    });
+}
+
+//  确认到店
+export function admitComeApi(data) {
+    return request({
+        url: "/shop/admit/come",
+        method: "post",
+        data,
+    });
+}
+//  预约完成
+export function admitFinishApi(data) {
+    return request({
+        url: "/shop/admit/finish",
+        method: "post",
+        data,
+    });
+}
+//  取消预约
+export function admitCancelApi(data) {
+    return request({
+        url: "/shop/admit/cancel",
+        method: "post",
+        data,
+    });
+}
+//  预约可视化列表
+export function admitOrdersApi(data) {
+    return request({
+        url: "/shop/admit/orders",
+        method: "post",
+        data,
+    });
+}
+
+//  售后订单管理
+export function entryRefundApi(data) {
+    return request({
+        url: "/shop/admitRefund/index",
+        method: "post",
+        data,
+    });
+}
+
+// 发起退款
+
+export function redoApi(data) {
+    return request({
+        url: "/shop/admitRefund/redo",
+        method: "post",
+        data,
+    });
+}
+
+
+// 发起退款
+
+export function detailRefundApi(data) {
+    return request({
+        url: "/shop/admitRefund/detail",
+        method: "post",
+        data,
+    });
+}
+// 售后申请处理
+// type
+// 1退款,2发货
+export function refundApi(data) {
+    return request({
+        url: "/shop/admitRefund/refund",
+        method: "post",
+        data,
+    });
+}
+//  售后申请审核
+// status
+// 0拒绝,1审核通过
+export function auditApi(data) {
+    return request({
+        url: "/shop/admitRefund/audit",
+        method: "post",
+        data,
+    });
+}

+ 8 - 0
src/plugins/api/shopping/sales.js

@@ -37,3 +37,11 @@ export function redoApi(data) {
     data,
   });
 }
+export function detailRefundApi(data) {
+  return request({
+    url: "/shop/order/read",
+    method: "get",
+    params: data,
+  });
+}
+

+ 143 - 0
src/views/activity/ActivityLog.vue

@@ -0,0 +1,143 @@
+<template>
+  <div class="amount-log-page" v-loading="loading" element-loading-text="加载中...">
+    <div class="amount-log-title">
+      <div class="amount-log-title-left">
+        <el-button type="primary" @click="goback">
+          <template #icon>
+            <IEpBack />
+          </template>返回
+        </el-button>
+      </div>
+      <div class="amount-log-title-right"></div>
+    </div>
+    <div class="amount-log-table">
+      <el-table border stripe :data="tableData" :height="store.tableHeight - 40">
+        <el-table-column prop="user.username" label="微信" />
+        <el-table-column prop="username" label="填报姓名" />
+        <el-table-column prop="mobile" label="订单单号" />
+        <el-table-column prop="num" label="参加人数"> </el-table-column>
+        <el-table-column prop="order_no" label="入库数量"> </el-table-column>
+        <el-table-column prop="" label="报名状态">
+          <template #default="{ row }">
+            <el-tag v-if="row.status == 0" type="info">已取消</el-tag>
+            <el-tag v-else-if="row.status == -1" type="warning">
+              已退款
+            </el-tag>
+            <el-tag v-else-if="row.status == 1" type="danger">
+              待支付
+            </el-tag>
+            <el-tag v-else-if="row.status == 2" type="warning">
+              支付中
+            </el-tag>
+            <el-tag v-else-if="row.status == 3" type="success">
+              已支付
+            </el-tag>
+            <el-tag v-else-if="row.status == 4"> 已签到</el-tag>
+            <el-tag v-else-if="row.status == 9" type="success">
+              已完成
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="created_at" label="创建时间" width="170" />
+
+      </el-table>
+      <div class="pagination-div">
+        <div></div>
+        <el-pagination v-model:currentPage="currentPage" v-model:page-size="pageSize" :page-sizes="[20, 50, 100, 200]"
+          layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange"
+          @current-change="handleCurrentChange" />
+        <div></div>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup>
+import { useCounterStore } from "@/stores/counter.js";
+import {entriesListApi} from "@/plugins/api/activity/activity";
+
+const store = useCounterStore();
+const router = useRouter();
+const route = useRoute();
+let tableData = ref([]);
+let loading = ref(false);
+const currentPage = ref(1);
+const pageSize = ref(20);
+const total = ref(0);
+const handleSizeChange = (val) => {
+  pageSize.value = val;
+  getData();
+};
+const handleCurrentChange = (val) => {
+  currentPage.value = val;
+  getData();
+};
+function goback() {
+  router.back();
+}
+let activityId = ref(null);
+function getData() {
+  loading.value = true;
+  entriesListApi({
+    activity_id: activityId.value,
+    page: currentPage.value,
+    pageSize: pageSize.value,
+  })
+    .then((data) => {
+      tableData.value = data.list;
+      total.value = data.page.total;
+      loading.value = false;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+}
+
+onMounted(() => {
+  if (route.query.activityId) {
+    activityId.value = parseInt(route.query.activityId);
+    getData();
+  } else {
+    router.back();
+  }
+});
+</script>
+<style scoped lang="scss">
+.amount-log-page {
+  width: 100%;
+  height: 100%;
+
+  .amount-log-title {
+    width: 100%;
+    display: flex;
+    justify-content: space-between;
+    border-bottom: 1px solid #eeeeee;
+    padding-bottom: 10px;
+
+    .amount-log-title-left {
+      font-size: 18px;
+      font-weight: 700;
+      color: #172b4d;
+
+      img {
+        vertical-align: middle;
+      }
+
+      span {
+        vertical-align: middle;
+        margin-left: 5px;
+      }
+    }
+  }
+
+  .amount-log-table {
+    padding: 10px;
+    box-sizing: border-box;
+
+    .pagination-div {
+      display: flex;
+      justify-content: center;
+      margin-top: 10px;
+    }
+  }
+}
+</style>

+ 14 - 0
src/views/activity/Index.vue

@@ -107,6 +107,9 @@
                   修改
                 </el-button>
                 <el-button type="danger" link @click="delFun(row)">删除</el-button>
+                <el-button type="warning" link @click="logFun(row)">
+                  报名列表
+                </el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -137,6 +140,7 @@ import {useCounterStore} from "@/stores/counter.js";
 import AddDialog from "@/views/activity/components/AddActivity.vue";
 import {Plus} from "@element-plus/icons-vue";
 import {listApi as dictApi} from "@/plugins/api/system/dict";
+import {useRouter} from "vue-router";
 
 const store = useCounterStore();
 let searchForm = ref({});
@@ -186,6 +190,16 @@ function getActivityTypeName(code) {
   const activityType = this.activityTypeList.find(type => type.code === code);
   return activityType ? activityType.name : '未知';
 }
+const router = useRouter();
+// 库存记录
+function logFun(row) {
+  router.push({
+    path: "/activity/log",
+    query: {
+      activityId: row.id,
+    },
+  });
+}
 
 function delFun(row) {
   ElMessageBox.confirm("确认删除,是否继续?", "提示", {

+ 300 - 0
src/views/activity/Sales.vue

@@ -0,0 +1,300 @@
+<template>
+  <section v-loading="loading">
+    <el-tabs
+      type="border-card"
+      v-model="searchForm.refund_status"
+      class="manage-sales"
+      @tab-change="tabChange"
+    >
+      <el-tab-pane label="全部" name="all"> </el-tab-pane>
+      <el-tab-pane label="待审核" :name="1"> </el-tab-pane>
+      <el-tab-pane label="待处理" :name="2"> </el-tab-pane>
+      <el-tab-pane label="已完成" :name="4"> </el-tab-pane>
+      <el-tab-pane label="已取消" :name="-1"> </el-tab-pane>
+    </el-tabs>
+    <div class="manage-sales-content">
+      <div class="order-head">
+        <el-form inline>
+          <el-form-item>
+            <el-input
+              style="width: 100%"
+              v-model="searchForm.order_no"
+              placeholder="订单号"
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-input
+              style="width: 100%"
+              v-model="searchForm.username"
+              placeholder="用户姓名"
+            />
+          </el-form-item>
+          <!-- <el-form-item>
+            <el-date-picker
+              style="width: 100%"
+              v-model="searchForm.order_date"
+              type="datetime"
+              placeholder="下单日期"
+              value-format="YYYY-MM-DD HH:mm:ss"
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-date-picker
+              style="width: 100%"
+              v-model="searchForm.pay_date"
+              type="datetime"
+              placeholder="支付日期"
+              value-format="YYYY-MM-DD HH:mm:ss"
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-select
+              v-model="searchForm.payment_status"
+              clearable
+              placeholder="支付状态"
+            >
+              <el-option label="已支付" :value="1" />
+              <el-option label="未支付" :value="0" />
+            </el-select>
+          </el-form-item> -->
+          <el-form-item>
+            <el-button type="primary" @click="searchFun">查询</el-button>
+            <el-button @click="resetFun">重置</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div class="coupon-table">
+        <el-table
+          border
+          stripe
+          :data="tableData"
+          :height="store.tableHeight - 90"
+          @selection-change="handleSelectionChange"
+        >
+          <!-- <el-table-column type="selection" width="55" align="center" /> -->
+          <el-table-column label="用户信息" width="300">
+            <template #default="{ row }">
+              <div class="manage-info">
+                <el-image
+                  :preview-teleported="true"
+                  style="width: 50px; min-width: 50px; height: 50px"
+                  :src="row?.user?.headimg"
+                  :zoom-rate="1.2"
+                  :preview-src-list="[row?.user?.headimg]"
+                  :initial-index="4"
+                  fit="cover"
+                  class="img-box"
+                />
+                <div class="right">
+                  <div>
+                    <!-- <label>用户昵称:</label> -->
+                    <span>{{ row?.user?.nickname }} </span>
+                  </div>
+                  <div>
+                    <!-- <label>推荐手机:</label> -->
+                    <span>{{ row?.user?.phone }} </span>
+                  </div>
+                </div>
+              </div>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="订单单号/售后单号">
+            <template #default="{ row }">
+              <div>
+                {{ row.order_no }}
+              </div>
+              <div>
+                {{ row?.refund_info?.refund_no }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="状态">
+            <template #default="{ row }">
+              <el-tag> {{ row.refund_status_name }} </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="商品信息" show-overflow-tooltip>
+            <template #default="{ row }">
+              <div v-for="item in row.items">
+                <div style="white-space: nowrap; font-size: 12px">
+                  {{ item.goods_name }} ( {{ item.goods_spec }} )
+                </div>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="申请时间" width="180" prop="refund_at" />
+          <el-table-column
+            label="操作"
+            width="170"
+            align="center"
+            fixed="right"
+          >
+            <template #default="{ row }">
+              <el-button type="primary" link @click="updateOpen(row)">
+                详情
+              </el-button>
+
+              <el-button type="warning" link @click="openOperate(row)">
+                售后操作
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <div class="pagination-div">
+          <div></div>
+          <el-pagination
+            v-model:currentPage="currentPage"
+            v-model:page-size="pageSize"
+            :page-sizes="[20, 50, 100, 200]"
+            layout="total, sizes, prev, pager, next, jumper"
+            :total="total"
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+          />
+          <div></div>
+        </div>
+      </div>
+    </div>
+  </section>
+  <drawerPage ref="drawerPageRef" />
+  <operatePage ref="operatePageRef" @refreshList="refreshList" />
+</template>
+<script setup>
+import { useCounterStore } from "@/stores/counter.js";
+import drawerPage from "./components/DrawerCustom.vue";
+import operatePage from "./components/DialogSales.vue";
+import {refundListApi} from "@/plugins/api/activity/activity";
+const store = useCounterStore();
+let searchForm = ref({
+  refund_status: "all",
+});
+
+//
+let tableData = ref([]);
+let selectData = ref([]);
+let loading = ref(false);
+const currentPage = ref(1);
+const pageSize = ref(20);
+const total = ref(0);
+const handleSizeChange = (val) => {
+  pageSize.value = val;
+  selectData.value = [];
+  getData();
+};
+const handleCurrentChange = (val) => {
+  currentPage.value = val;
+  selectData.value = [];
+  getData();
+};
+
+function searchFun() {
+  currentPage.value = 1;
+  selectData.value = [];
+  tableData.value = [];
+  getData();
+}
+function resetFun() {
+  currentPage.value = 1;
+  searchForm.value = {
+    refund_status: "all",
+  };
+  tableData.value = [];
+  selectData.value = [];
+  getData();
+}
+function refreshList() {
+  getData();
+}
+function getData() {
+  loading.value = true;
+  let obj = Object.assign(
+    {
+      page: currentPage.value,
+      pageSize: pageSize.value,
+    },
+    searchForm.value
+  );
+  if (obj.refund_status == "all") obj.refund_status = "";
+  refundListApi(obj)
+    .then((data) => {
+      tableData.value = data.list;
+      total.value = data.page.total;
+      loading.value = false;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+}
+function handleSelectionChange(val) {
+  selectData.value = val;
+}
+//   售后申请操作
+let operatePageRef = ref(null);
+function openOperate(row) {
+  operatePageRef.value.initFun(row);
+}
+function tabChange(name) {
+  currentPage.value = 1;
+  selectData.value = [];
+  tableData.value = [];
+  getData();
+}
+
+// 详情
+let drawerPageRef = ref(null);
+function updateOpen(row) {
+  drawerPageRef.value.initFun(row);
+}
+
+//
+onMounted(() => {
+  getData();
+});
+</script>
+
+<style lang="scss" scoped>
+.manage-sales {
+  border-bottom: none !important;
+
+  :deep(.el-tabs__content) {
+    padding: 0;
+  }
+}
+
+.manage-sales-content {
+  width: 100%;
+  padding: 10px;
+  height: calc(100% - 40px);
+  overflow: hidden;
+  border: 1px solid #dcdfe6;
+  border-top: none;
+  box-sizing: border-box;
+
+  .order-head {
+  }
+
+  .pagination-div {
+    display: flex;
+    justify-content: space-between;
+    margin-top: 10px;
+  }
+
+  .manage-info {
+    display: flex;
+
+    .img-box {
+      align-self: center;
+    }
+
+    .right {
+      margin-left: 10px;
+      align-self: center;
+
+      span {
+        color: #409eff;
+      }
+    }
+  }
+}
+</style>

+ 363 - 0
src/views/activity/components/DialogSales.vue

@@ -0,0 +1,363 @@
+<template>
+  <el-dialog
+    v-model="dialogVisible"
+    title="售后操作"
+    width="50%"
+    :before-close="handleClose"
+  >
+    <div class="sales-dialog">
+      <el-form inline label-width="100px">
+        <el-form-item label="申请金额(元):">
+          <span>
+            {{ showForm?.refund_info?.refund_price }}
+          </span>
+        </el-form-item>
+        <el-form-item label="状态:">
+          <span>
+            {{ showForm?.refund_status_name }}
+          </span>
+        </el-form-item>
+        <el-form-item label="申请原因:">
+          <span>
+            {{ showForm?.refund_info?.refund_reason }}
+          </span>
+        </el-form-item>
+        <el-form-item label="申请时间:">
+          <span>
+            {{ showForm?.refund_info?.created_at }}
+          </span>
+        </el-form-item>
+        <div>
+          <el-form-item label="申请说明:" style="width: 100%">
+            <span>
+              {{ showForm?.refund_info?.refund_explain }}
+            </span>
+          </el-form-item>
+        </div>
+
+        <el-form-item
+          v-if="imgList.length > 0"
+          label="申请凭证:"
+          style="width: 100%"
+        >
+          <div class="img-box">
+            <el-image
+              v-for="item in imgList"
+              style="width: 100px; height: 100px"
+              :src="item"
+              :zoom-rate="1.2"
+              :preview-src-list="[item]"
+              :initial-index="4"
+              fit="cover"
+            />
+          </div>
+        </el-form-item>
+      </el-form>
+      <!--  -->
+      <el-form label-width="100px" v-if="showForm.refund_status == 3">
+        <el-form-item>
+          <el-button type="primary" @click="redoFun"> 发起退款 </el-button>
+        </el-form-item>
+      </el-form>
+
+      <!-- 审核操作 -->
+      <el-form
+        ref="ruleFormRef"
+        :model="ruleForm"
+        :rules="rules"
+        label-width="100px"
+        v-if="showForm.refund_status == 1"
+      >
+        <el-form-item label="审核操作:">
+          <el-radio-group v-model="ruleForm.status" @change="handleRadio">
+            <el-radio :label="1">通过</el-radio>
+            <el-radio :label="0">拒绝</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item
+          label="拒绝原因:"
+          v-if="ruleForm.status === 0"
+          style="width: 100%"
+        >
+          <el-input
+            placeholder="拒绝原因"
+            style="width: 100%"
+            type="textarea"
+            :row="2"
+            v-model="ruleForm.remark"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="submit"> 提交 </el-button>
+        </el-form-item>
+      </el-form>
+
+      <!-- 售后操作 -->
+      <el-form
+        ref="ruleFormRef2"
+        :model="ruleForm2"
+        :rules="rules"
+        label-width="100px"
+        v-if="showForm.refund_status == 2"
+      >
+        <el-form-item label="售后操作:">
+          <el-radio-group v-model="ruleForm2.type" @change="changeType">
+            <el-radio :label="1">退款</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item
+          label="退款金额:"
+          v-if="ruleForm2.type === 1"
+          style="width: 100%"
+          prop="refund_price"
+        >
+          <el-input
+            placeholder="退款金额(元)"
+            style="width: 200px"
+            v-model="ruleForm2.refund_price"
+          />
+        </el-form-item>
+        <el-form-item
+          label="物流公司:"
+          v-if="ruleForm2.type === 2"
+          style="width: 100%"
+          prop="company_code"
+        >
+          <el-select
+            v-model="ruleForm2.company_code"
+            filterable
+            collapse-tags
+            collapse-tags-tooltip
+            placeholder="物流公司"
+            style="width: 200px"
+            clearable
+          >
+            <el-option
+              v-for="item in options"
+              :key="item.id"
+              :label="item.name"
+              :value="item.code_1"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label="发货单号:"
+          v-if="ruleForm2.type === 2"
+          style="width: 100%"
+          prop="send_no"
+        >
+          <el-input
+            placeholder="发货单号"
+            style="width: 200px"
+            v-model="ruleForm2.send_no"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="submit2"> 提交 </el-button>
+        </el-form-item>
+      </el-form>
+      <div style="padding: 20px 10px">
+        <el-timeline>
+          <el-timeline-item
+            v-for="(activity, index) in showForm?.refund_log"
+            :key="index"
+          >
+            <div style="font-size: 12px; color: rgb(143, 142, 140)">
+              {{ activity.op_username }}
+            </div>
+            <div style="font-size: 12px; color: rgb(143, 142, 140)">
+              {{ activity.op_log }}
+            </div>
+            <div style="font-size: 12px; color: rgb(143, 142, 140)">
+              {{ activity.created_at }}
+            </div>
+          </el-timeline-item>
+        </el-timeline>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+<script setup>
+import { listApi } from "@/plugins/api/shopping/logistics";
+import { auditApi, refundApi, redoApi,detailRefundApi } from "@/plugins/api/activity/activity.js";
+import {ElMessage, ElMessageBox} from "element-plus";
+
+let ruleForm = ref({});
+let ruleForm2 = ref({});
+let rules = {
+  status: [{ required: true, message: "请选择", trigger: "change" }],
+  type: [{ required: true, message: "请选择", trigger: "change" }],
+  refund_price: [
+    { required: true, message: "请输入退款金额", trigger: "blur" },
+  ],
+  company_code: [
+    { required: true, message: "请选择物流公司", trigger: "change" },
+  ],
+  send_no: [{ required: true, message: "请输入发货单号", trigger: "blur" }],
+};
+let dialogVisible = ref(false);
+function handleClose(done) {
+  // dialogVisible.value = false;
+  ElMessageBox.confirm("是否确定关闭此对话框?")
+    .then(() => {
+      done();
+    })
+    .catch(() => {
+      // catch error
+    });
+}
+let formType = ref("");
+let ruleFormRef = ref(null);
+let ruleFormRef2 = ref(null);
+let showForm = ref({});
+let imgList = ref([]);
+function initFun(row) {
+  // console.log(row);
+  if (ruleFormRef.value) {
+    ruleFormRef.value.resetFields();
+  }
+  if (ruleFormRef2.value) {
+    ruleFormRef2.value.resetFields();
+  }
+  ruleForm.value = {};
+  ruleForm2.value = {};
+  showForm.value = {};
+  imgList.value = [];
+  showForm.value = { ...row };
+  if (typeof variable === 'string') {
+    // 变量是字符串
+    if (row.refund_info.refund_img) {
+      imgList.value = JSON.parse(row.refund_info.refund_img)||[];
+    }
+  }else{
+    imgList.value=row.refund_info.refund_img||[];
+  }
+  ruleForm.value.order_no = row.order_no;
+  ruleForm2.value.order_no = row.order_no;
+  ruleForm2.value.refund_price = showForm.value.amount_total||"";
+  dialogVisible.value = true;
+
+  getData();
+}
+function handleRadio(data) {
+  if (data === 1) {
+    ruleForm.value.remark = "";
+  }
+}
+function changeType(data) {
+  if (data === 1) {
+    ruleForm2.value.company_code = "";
+  } else {
+    ruleForm2.value.refund_price =  showForm.value.amount_total||"";
+  }
+}
+const emit = defineEmits(["refreshList"]);
+function submit() {
+  if (!ruleFormRef.value) return;
+  ruleFormRef.value.validate((valid, fields) => {
+    if (valid) {
+      auditApi(ruleForm.value).then((data) => {
+        ElMessage.success("操作成功!");
+        detailRefundApi({id: showForm.value.id}).then((data) => {
+          showForm.value = {...data};
+        })
+        // dialogVisible.value = false;
+        emit("refreshList");
+        if (ruleForm.value.status == 1) {
+          showForm.value.refund_status = 2;
+        } else {
+          showForm.value.refund_status = -2;
+        }
+        showForm.value.refund_log.unshift(data);
+      });
+    }
+  });
+}
+function submit2() {
+  if (!ruleFormRef2.value) return;
+  ruleFormRef2.value.validate((valid, fields) => {
+    if (valid) {
+      refundApi(ruleForm2.value).then((data) => {
+        ElMessage.success("操作成功!");
+        // dialogVisible.value = false;
+        detailRefundApi({id: showForm.value.id}).then((data) => {
+          showForm.value = {...data};
+        })
+        emit("refreshList");
+        showForm.value.refund_status = 4;
+        showForm.value.refund_log.unshift(data);
+      });
+    }
+  });
+}
+// 物流
+let options = ref([]);
+function getData() {
+  listApi({
+    page: 1,
+    pageSize: 10000,
+  }).then((data) => {
+    options.value = data.list;
+  });
+}
+// 发起退款
+function redoFun() {
+  ElMessageBox.confirm("确认重新发起退款,是否继续?", "提示", {
+    confirmButtonText: "确认",
+    cancelButtonText: "取消",
+    type: "warning",
+  })
+    .then(() => {
+      redoApi({
+        order_no: showForm.value.order_no,
+      }).then((data) => {
+        ElMessage({
+          type: "success",
+          message: "操作成功!",
+        });
+        detailRefundApi({id: showForm.value.id}).then((data) => {
+          showForm.value = {...data};
+        })
+        emit("refreshList");
+        showForm.value.refund_status = 4;
+        showForm.value.refund_log.unshift(data);
+      });
+    })
+    .catch(() => {
+      ElMessage({
+        type: "info",
+        message: "已取消。",
+      });
+    });
+}
+
+onMounted(() => {});
+defineExpose({
+  initFun,
+});
+</script>
+<style scoped lang="scss">
+.sales-dialog {
+  :deep(.el-form-item) {
+    width: 50%;
+    margin-right: 0;
+    padding-right: 10px;
+    box-sizing: border-box;
+
+    .el-input {
+      width: 100%;
+    }
+  }
+
+  .img-box {
+    margin-bottom: 10px;
+
+    .el-image {
+      width: 100%;
+      height: 140px;
+      object-fit: cover;
+      margin-right: 10px;
+    }
+  }
+}
+</style>

+ 536 - 0
src/views/activity/components/DrawerCustom.vue

@@ -0,0 +1,536 @@
+<template>
+  <el-drawer v-model="drawer" size="60%" :before-close="handleClose">
+    <template #header>
+      <div class="order-detail-title">订单编号: {{ dataInfo?.order_no }}</div>
+    </template>
+    <div class="drawer-content order-detail">
+      <!-- <div class="content-head">
+        <el-icon class="icon">
+          <IEpUserFilled />
+        </el-icon>
+        <label>销售:</label>
+        <span>{{ dataInfo?.puid }}</span>
+        <div></div>
+        <el-icon class="icon">
+          <IEpClock />
+        </el-icon>
+        <label>创建时间:</label>
+        <span>{{ dataInfo?.created_at }}</span>
+      </div> -->
+      <div style="padding: 10px 20px">
+        <el-steps :active="stepData">
+          <el-step title="买家下单" />
+          <el-step title="买家付款" />
+          <el-step title="买家已签到" />
+          <el-step title="交易完成" />
+        </el-steps>
+      </div>
+      <div class="item-title">基本信息</div>
+      <div class="detail-section-1">
+        <el-descriptions :column="2">
+          <!-- <el-descriptions-item width="50%" label="用户昵称:">
+            {{ dataInfo?.user?.nickname }}
+          </el-descriptions-item> -->
+          <el-descriptions-item width="50%" label="用户姓名:">
+            {{ dataInfo?.user?.username }}
+          </el-descriptions-item>
+          <el-descriptions-item width="50%" label="订单金额:">
+            {{ dataInfo?.amount_real }}
+          </el-descriptions-item>
+          <el-descriptions-item width="50%" label="联系电话:">
+            {{ dataInfo?.mobile }}
+          </el-descriptions-item>
+          <el-descriptions-item width="50%" label="报名人数:">
+            {{ dataInfo?.num }}
+          </el-descriptions-item>
+          <el-descriptions-item width="50%" label="订单提交时间:">
+            {{ dataInfo?.send?.created_at }}
+          </el-descriptions-item>
+        </el-descriptions>
+        <el-descriptions :column="1">
+          <el-descriptions-item width="100%" label="备注:">
+            {{ dataInfo?.order_remark }}
+          </el-descriptions-item>
+        </el-descriptions>
+      </div>
+
+      <div class="item-title">商品信息</div>
+      <div class="detail-section-3">
+        <el-table border stripe :data="dataInfo?.items">
+          <el-table-column label="用户信息" width="300">
+            <template #default="{ row }">
+              <div class="manage-info">
+                <el-image
+                  :preview-teleported="true"
+                  style="width: 50px; min-width: 50px; height: 50px"
+                  :src="imgSrc(row?.goods_cover)"
+                  :zoom-rate="1.2"
+                  :preview-src-list="[imgSrc(row?.goods_cover)]"
+                  :initial-index="4"
+                  fit="cover"
+                  class="img-box"
+                />
+                <div class="right">
+                  <div>
+                    <span>{{ row?.goods_name }} </span>
+                  </div>
+                  <div>
+                    <span>{{ row?.goods_code }} </span>
+                  </div>
+                </div>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="goods_kind" label="商品类型" />
+          <el-table-column prop="goods_spec" label="规格" />
+          <el-table-column prop="price_market" label="市场单价" />
+          <el-table-column prop="price_selling" label="销售单价" />
+          <el-table-column prop="stock_sales" label="商品数量" />
+          <el-table-column prop="total_selling" label="总价" />
+          <!-- <el-table-column label="操作" width="120" align="center" fixed="right">
+            <template #default="{ row }">
+
+              <el-button type="primary" link @click="sendOrder(row)">
+                发货
+              </el-button>
+              <el-button type="danger" link @click="delFun(row)">删除</el-button>
+            </template>
+          </el-table-column> -->
+        </el-table>
+      </div>
+      <div class="item-title">支付明细</div>
+      <div class="detail-section-2">
+        <el-descriptions :column="2">
+          <el-descriptions-item width="50%" label="订单总金额:">
+            {{ dataInfo?.amount_total }}
+            <!-- <el-button
+              class="btn"
+              size="small"
+              type="primary"
+              @click="openPrice"
+              v-if="priceType && dataInfo?.status == 1"
+              >改价</el-button
+            >
+            <el-dialog v-model="priceVisible" title="改价" width="30%">
+              <el-form :model="priceForm" ref="priceFormRef">
+                <el-form-item
+                  label="价格(元)"
+                  :rules="[
+                    {
+                      required: true,
+                      message: '价格',
+                      trigger: 'blur',
+                    },
+                  ]"
+                >
+                  <el-input placeholder="价格" v-model="priceForm.money" />
+                </el-form-item>
+              </el-form>
+              <template #footer>
+                <span class="dialog-footer">
+                  <el-button @click="priceVisible = false">取消</el-button>
+                  <el-button type="primary" @click="submitPrice">
+                    确认
+                  </el-button>
+                </span>
+              </template>
+            </el-dialog> -->
+          </el-descriptions-item>
+          <el-descriptions-item width="50%" label="实际支付:"
+            >{{ dataInfo?.payment_amount }}
+          </el-descriptions-item>
+          <el-descriptions-item width="50%" label="支付到账时间:"
+            >{{ dataInfo?.payment_datetime }}
+          </el-descriptions-item>
+        </el-descriptions>
+      </div>
+      <div v-if="remarkType">
+        <div class="item-title item-title-2">
+          <div>客服备注</div>
+          <el-button
+            class="btn"
+            v-if="showMemo"
+            size="small"
+            type="primary"
+            @click="openRemark"
+            >客服备注</el-button
+          >
+        </div>
+        <div class="detail-section-2">
+          <el-descriptions :column="1">
+            <el-descriptions-item width="50%" label="客服备注:">
+              {{ dataInfo?.cs_remark || "无" }}
+            </el-descriptions-item>
+          </el-descriptions>
+          <el-dialog v-model="wechatVisible" title="客服备注" width="30%">
+            <el-form :model="wechatForm" ref="wechatFormRef">
+              <el-form-item
+                label="客服备注"
+                :rules="[
+                  {
+                    required: true,
+                    message: '客服备注...',
+                    trigger: 'blur',
+                  },
+                ]"
+              >
+                <el-input
+                  :rows="4"
+                  placeholder="客服备注"
+                  type="textarea"
+                  class="tab1-textarea"
+                  v-model="wechatForm.remark"
+                />
+              </el-form-item>
+            </el-form>
+            <template #footer>
+              <span class="dialog-footer">
+                <el-button @click="wechatVisible = false">取消</el-button>
+                <el-button type="primary" @click="submitWechat">
+                  确认
+                </el-button>
+              </span>
+            </template>
+          </el-dialog>
+        </div>
+      </div>
+
+      <div v-if="dataInfo?.status > 3">
+        <div class="item-title">物流信息</div>
+        <div class="detail-section-4">
+          <el-table border stripe :data="dataInfo?.send_log">
+            <el-table-column prop="order_no" label="商城订单编号" />
+            <el-table-column prop="company_name" label="快递公司名称" />
+            <el-table-column prop="send_number" label="快递单号" />
+            <el-table-column prop="send_remark" label="备注" />
+            <el-table-column prop="send_datetime" label="快递发送时间" />
+          </el-table>
+        </div>
+      </div>
+      <div v-if="dataInfo.refund_log && dataInfo.refund_log.legnth > 0">
+        <div class="item-title">售后信息</div>
+        <div style="padding: 20px 10px">
+          <el-timeline>
+            <el-timeline-item
+              v-for="(activity, index) in dataInfo.refund_log"
+              :key="index"
+            >
+              <div style="font-size: 12px; color: rgb(143, 142, 140)">
+                {{ activity.op_username }}
+              </div>
+              <div style="font-size: 12px; color: rgb(143, 142, 140)">
+                {{ activity.op_log }}
+              </div>
+              <div style="font-size: 12px; color: rgb(143, 142, 140)">
+                {{ activity.created_at }}
+              </div>
+            </el-timeline-item>
+          </el-timeline>
+        </div>
+      </div>
+    </div>
+  </el-drawer>
+</template>
+<script setup>
+import {
+  truckApi,
+  detailApi,
+  orderSendDelApi,
+  wechatRemarkApi,
+  chgMoneyApi,
+} from "@/plugins/api/shopping/order";
+const props = defineProps({
+  remarkType: {
+    type: Boolean,
+    default: false,
+  },
+  priceType: {
+    type: Boolean,
+    default: false,
+  },
+  showMemo: {
+    type: Boolean,
+    default: true,
+  },
+});
+
+const drawer = ref(false);
+function handleClose(done) {
+  ElMessageBox.confirm("是否确定关闭此对话框?")
+    .then(() => {
+      done();
+    })
+    .catch(() => {
+      // catch error
+    });
+}
+
+// 初始化
+let dataInfo = ref({});
+function initFun(row) {
+  console.log(row,"row==========================================222>")
+  dataInfo.value = Object.assign({}, row);
+  drawer.value = true;
+  getSendData();
+}
+let refund_log = [
+  {
+    op_username: "张三",
+    op_log: "此操作是退款",
+    created_at: "2021-12-13 20:21:24",
+  },
+];
+// 步骤条
+let stepData = computed(() => {
+  if (dataInfo.value.status == 1 || dataInfo.value.status == 2) {
+    return 1;
+  } else if (dataInfo.value.status == 3) {
+    return 2;
+  } else if (dataInfo.value.status == 4) {
+    return 3;
+  } else if (
+    dataInfo.value.status == 6 ||
+    dataInfo.value.status == 9 ||
+    dataInfo.value.status == -1 ||
+    dataInfo.value.status == -2
+  ) {
+    return 4;
+  }
+});
+// 发货信息
+function getSendData() {
+  detailApi({
+    // order_no: 'UA793448659074932237'
+    order_no: dataInfo.value.order_no,
+  }).then((data) => {});
+}
+// 发货
+function sendOrder(row) {
+  ElMessageBox.confirm("确认发货,是否继续?", "提示", {
+    confirmButtonText: "确认",
+    cancelButtonText: "取消",
+    type: "warning",
+  })
+    .then(() => {
+      truckApi({
+        id: row.id,
+      }).then(() => {
+        ElMessage({
+          type: "success",
+          message: "删除成功!",
+        });
+      });
+    })
+    .catch(() => {
+      ElMessage({
+        type: "info",
+        message: "已取消。",
+      });
+    });
+}
+// 删除
+function delFun(row) {
+  ElMessageBox.confirm("确认删除,是否继续?", "提示", {
+    confirmButtonText: "确认",
+    cancelButtonText: "取消",
+    type: "warning",
+  })
+    .then(() => {
+      orderSendDelApi({
+        id: row.id,
+      }).then(() => {
+        ElMessage({
+          type: "success",
+          message: "删除成功!",
+        });
+      });
+    })
+    .catch(() => {
+      ElMessage({
+        type: "info",
+        message: "已取消。",
+      });
+    });
+}
+defineExpose({
+  initFun,
+});
+function imgSrc(path) {
+  return import.meta.env.VITE_APP_BASE_API + path;
+}
+// 改价
+let priceVisible = ref(false);
+let priceForm = ref({});
+let priceFormRef = ref(null);
+function openPrice() {
+  priceVisible.value = true;
+  if (priceFormRef.value) {
+    priceFormRef.value.resetFields();
+  }
+  priceForm.value = {};
+  priceForm.value.money = dataInfo.value.amount_real;
+}
+function submitPrice() {
+  if (!priceFormRef.value) return;
+  priceFormRef.value.validate((valid, fields) => {
+    if (valid) {
+      let obj = {
+        order_no: dataInfo.value.order_no,
+        money: priceForm.value.money,
+      };
+      chgMoneyApi(obj).then((data) => {
+        ElMessage.success("操作成功!");
+        priceVisible.value = false;
+        dataInfo.value.amount_real = data.amount_real;
+        emit("refreshList", data);
+      });
+    }
+  });
+}
+// 客服备注
+let wechatVisible = ref(false);
+let wechatForm = ref({});
+let wechatFormRef = ref(null);
+function openRemark() {
+  wechatVisible.value = true;
+  if (wechatFormRef.value) {
+    wechatFormRef.value.resetFields();
+  }
+  wechatForm.value = {};
+  wechatForm.value.remark = dataInfo.value.cs_remark;
+}
+function submitWechat() {
+  if (!wechatFormRef.value) return;
+  wechatFormRef.value.validate((valid, fields) => {
+    if (valid) {
+      let obj = {
+        order_no: dataInfo.value.order_no,
+        remark: wechatForm.value.remark,
+      };
+      wechatRemarkApi(obj).then((data) => {
+        ElMessage.success("操作成功!");
+        wechatVisible.value = false;
+        dataInfo.value.cs_remark = data.cs_remark;
+        emit("refreshList", data);
+      });
+    }
+  });
+}
+const emit = defineEmits(["refreshList"]);
+//
+onMounted(() => {});
+</script>
+<style lang="scss" scoped>
+.order-detail-title {
+  font-size: 24px;
+  font-weight: 500;
+  color: #172b4d;
+  line-height: 22px;
+}
+
+.order-detail {
+  .content-head {
+    white-space: nowrap;
+
+    > div {
+      display: inline-block;
+      height: 15px;
+      border-left: 2px solid #5e6c84;
+      vertical-align: middle;
+      margin: 0 15px;
+    }
+
+    .icon {
+      color: #5e6c84;
+      margin-right: 3px;
+      vertical-align: middle;
+    }
+
+    label {
+      font-size: 14px;
+      font-weight: 500;
+      color: #5e6c84;
+      vertical-align: middle;
+    }
+
+    span {
+      font-size: 14px;
+      font-weight: 500;
+      color: #5e6c84;
+      vertical-align: middle;
+    }
+  }
+
+  .item-title {
+    margin-top: 20px;
+    width: 100%;
+    height: 46px;
+    background: #fafbfc;
+    font-size: 14px;
+    font-weight: bold;
+    color: #172b4d;
+    line-height: 46px;
+    position: relative;
+    padding-left: 10px;
+    box-sizing: border-box;
+
+    &::before {
+      content: "";
+      position: absolute;
+      left: 0;
+      top: 50%;
+      width: 2px;
+      height: 20px;
+      background: #005ecc;
+      transform: translateY(-50%);
+    }
+  }
+
+  .detail-section-1 {
+    padding: 10px;
+    box-sizing: border-box;
+  }
+
+  .item-title-2 {
+    display: flex;
+    justify-content: space-between;
+
+    .btn {
+      align-self: center;
+      margin-right: 10px;
+    }
+  }
+
+  .detail-section-2 {
+    padding: 10px;
+    box-sizing: border-box;
+  }
+
+  .detail-section-3 {
+    padding: 10px;
+    box-sizing: border-box;
+
+    .manage-info {
+      display: flex;
+
+      .img-box {
+        align-self: center;
+      }
+
+      .right {
+        margin-left: 10px;
+        align-self: center;
+
+        span {
+          color: #409eff;
+        }
+      }
+    }
+  }
+
+  .detail-section-4 {
+    padding: 10px;
+    box-sizing: border-box;
+  }
+}
+</style>

+ 2 - 2
src/views/orders/components/AddOffline.vue

@@ -423,6 +423,7 @@ function save() {
         orderExpenseAddApi(obj).then((data) => {
           orderItem.value=data
           ElMessage.success("订单创建成功");
+          pageType.value='set'
           getWcQrCode();
           emit('refreshTable');
         });
@@ -490,9 +491,8 @@ function initFun(type, row) {
   });
   handleClick(activeName.value)
   dialogVisible.value = true;
-
+  pageType.value=type
   if (type==="set"|| type==="init"){
-    pageType.value=type
     ruleForm.value.customer_id  =row.customer_id
     ruleForm.value.room_no  =row.room_no
     ruleForm.value.paymentMethod = row.payment_type  ==="balance" ? '1': '2'

+ 300 - 137
src/views/reservation/Order.vue

@@ -5,21 +5,14 @@
       <div class="manage-shopping-title">
         <div class="manage-shopping-title-left" style="white-space: nowrap">
           <el-form v-if="isTable==true" inline>
-            <el-form-item>
-              <el-input
-                  style="width: 100%"
-                  v-model="searchForm.order_no"
-                  placeholder="订单号"
-              />
-            </el-form-item>
-            <el-form-item>
+            <el-form-item style="width: 240px">
               <el-input
                   style="width: 100%"
-                  v-model="searchForm.username"
-                  placeholder="用户姓名"
+                  v-model="searchForm.keyword"
+                  placeholder="用户手机号"
               />
             </el-form-item>
-            <el-form-item>
+            <el-form-item style="width: 240px">
               <el-date-picker
                   style="width: 100%"
                   v-model="searchForm.timeArr"
@@ -33,14 +26,6 @@
             <el-form-item style="width: 240px">
               <el-button type="primary" @click="searchFun">查询</el-button>
               <el-button @click="resetFun">重置</el-button>
-              <el-button type="success" @click="exportFun"
-              >
-                <el-icon>
-                  <IEpDownload/>
-                </el-icon>
-                导出
-              </el-button
-              >
             </el-form-item>
           </el-form>
         </div>
@@ -67,28 +52,18 @@
           <el-table-column label="用户信息" width="300">
             <template #default="{ row }">
               <div class="manage-info">
-                <el-image
-                    :preview-teleported="true"
-                    style="width: 50px; min-width: 50px; height: 50px"
-                    :src="imgSrc(row?.user?.headimg)"
-                    :zoom-rate="1.2"
-                    :preview-src-list="[imgSrc(row?.user?.headimg)]"
-                    :initial-index="4"
-                    fit="cover"
-                    class="img-box"
-                />
                 <div class="right">
                   <div>
                     <!-- <label>用户昵称:</label> -->
-                    <span>{{ row?.user?.nickname }} </span>
+                    <span>{{ row?.user_name }} </span>
                   </div>
                   <div>
                     <!-- <label>ID:</label> -->
-                    <span>ID:{{ row?.user?.id }} </span>
+                    <span>ID:{{ row?.customer_id }} </span>
                   </div>
                   <div>
                     <!-- <label>推荐手机:</label> -->
-                    <span>{{ row?.user?.phone }} </span>
+                    <span>{{ row?.user_phone }} </span>
                   </div>
                 </div>
               </div>
@@ -97,10 +72,16 @@
 
           <el-table-column prop="order_no" label="商品订单单号"/>
 
-          <el-table-column prop="amount_real" label="订单实际金额"/>
+          <el-table-column prop="amount_total" label="订单实际金额"/>
           <el-table-column prop="" label="订单状态">
             <template #default="{ row }">
-              <el-tag v-if="row.status == 0" type="info">已取消</el-tag>
+              <el-tag v-if="row.status == 0" type="info">预订单</el-tag>
+              <el-tag v-else-if="row.status == -1" type="warning">
+                已违约
+              </el-tag>
+              <el-tag v-else-if="row.status == -2" type="warning">
+                已取消
+              </el-tag>
               <el-tag v-else-if="row.status == 1" type="danger">
                 待支付
               </el-tag>
@@ -110,24 +91,19 @@
               <el-tag v-else-if="row.status == 3" type="success">
                 已支付
               </el-tag>
-              <el-tag v-else-if="row.status == 4"> 已发货</el-tag>
-              <el-tag v-else-if="row.status == 6">
-                已收货【过度状态,自动结算返利】
-              </el-tag>
+              <el-tag v-else-if="row.status == 4"> 已签到</el-tag>
               <el-tag v-else-if="row.status == 9" type="success">
                 已完成
               </el-tag>
             </template>
           </el-table-column>
           <el-table-column prop="created_at" label="订单创建时间" width="170"/>
-
-          <el-table-column prop="" label="商品信息" show-overflow-tooltip>
+          <el-table-column prop="tech_name" label="技师姓名"/>
+          <el-table-column prop="" label="服务信息" show-overflow-tooltip>
             <template #default="{ row }">
-              <div v-for="item in row.items">
                 <div style="white-space: nowrap; font-size: 12px">
-                  {{ item.goods_name }} ( {{ item.goods_spec }} )
+                  {{ row.goods_name }} ( {{ row.goods_spec }} )
                 </div>
-              </div>
             </template>
           </el-table-column>
 
@@ -138,7 +114,7 @@
           >
             <template #default="{ row }">
               <el-button type="primary" link @click="setStatus(row,1)">确认到店</el-button>
-              <el-button type="primary" link @click="setStatus(row,2)">未到店</el-button>
+              <el-button type="primary" link @click="setStatus(row,2)">服务完成</el-button>
               <el-button type="primary" link @click="setStatus(row,0)">取消预约</el-button>
             </template>
           </el-table-column>
@@ -159,37 +135,43 @@
         </div>
       </div>
       <div class="coupon-table" v-if="isTable==false">
-        <el-table :data="tableData2" style="width: 100%" border
-                  stripe :height="store.tableHeight" :cell-class-name="getCellClassName">
+        <el-table :data="tableData2" style="width: 100%" border stripe :height="store.tableHeight" :cell-class-name="getCellClassName"
+                  :row-style="setRowStyle">
           <el-table-column prop="time" label="时间" align="center">
             <template #default="scope">
-              <span style="color: #1995F3FF;">{{ scope.row.time }}</span>
+              <div style="color: #1995F3FF;width: 100%; height: 100%; display: flex; justify-content: center;">
+                {{ scope.row.time }}
+              </div>
             </template>
           </el-table-column>
           <el-table-column v-for="(day, index) in days" :key="index" :prop="day.key" :label="day.label" align="center">
             <template #header>
               <div style="display: flex; align-items: center;">
                 <el-tooltip v-if="day.key === 'mon'" content="上一页" placement="bottom" effect="light">
-                <el-button v-if="day.key === 'mon'" type="text" @click="setPageGetData(day.key, -1)" style="margin-right: 5px;">
-                  <el-icon><DArrowLeft /></el-icon>
-                </el-button>
+                  <el-button v-if="day.key === 'mon'" type="text" @click="setPageGetData(day, -1)" style="margin-right: 5px;">
+                    <el-icon><DArrowLeft /></el-icon>
+                  </el-button>
                 </el-tooltip>
                 <span style="flex: 1; text-align: center;">{{ day.label }}</span>
-                <el-tooltip v-if="day.key === 'sun'"  content="下一页" placement="bottom" effect="light">
-                  <el-button type="text" @click="setPageGetData(day.key, 1)" style="margin-left: 5px;">
+                <el-tooltip v-if="day.key === 'sun'" content="下一页" placement="bottom" effect="light">
+                  <el-button type="text" @click="setPageGetData(day, 1)" style="margin-left: 5px;">
                     <el-icon><DArrowRight /></el-icon>
                   </el-button>
                 </el-tooltip>
-
               </div>
             </template>
             <template #default="scope">
-              <div v-if="scope.row[day.key]" :class="{ hasData: scope.row[day.key] }">
-                <p>{{ scope.row[day.key].name }}</p>
-                <p>{{ scope.row[day.key].people }}</p>
-                <p>{{ scope.row[day.key].technician }}</p>
+              <div>
+                <div  :class="{ hasData: scope.row[day.key] }" v-if="scope.row[day.key]" style="  display: flex;justify-content: space-between;align-items: center;width: 100%; height: 100%;;">
+                  <div v-for="(item, index) in scope.row[day.key]" :key="index">
+                    <p>{{ item.name }}</p>
+                    <p>{{ item.people }}</p>
+                    <p>{{ item.technician }}</p>
+                  </div>
+                </div>
+                <div v-else style="width: 100%; height: 100%; display: flex; justify-content: center;">
+                </div>
               </div>
-              <div v-else></div>
             </template>
           </el-table-column>
         </el-table>
@@ -220,72 +202,80 @@ import {useCounterStore} from "@/stores/counter.js";
 import {shopExportApi} from "@/plugins/api/down";
 import drawerPage from "../shopping/components/DrawerCustom.vue";
 import {Menu, Memo, DArrowRight, DArrowLeft} from "@element-plus/icons-vue";
-
+import {ElMessage, ElMessageBox} from "element-plus";
+import {
+  admitCancelApi,
+  admitComeApi,
+  admitFinishApi,
+  admitListApi,
+  admitOrdersApi
+} from "@/plugins/api/reservation/reservation";
+const totalPages = ref(0);
 // 模拟数据
 const tableData2 = ref([
   {
     time: '8:00-10:00',
-    mon: {name: '张三丰', people: '2人', technician: '李霞 丽丽'},
-    tue: null,
-    wed: null,
-    thu: null,
-    fri: null,
-    sat: null,
-    sun: null
+    mon: [],
+    tue: [],
+    wed: [],
+    thu: [],
+    fri: [],
+    sat: [],
+    sun: []
   },
   {
     time: '10:00-12:00',
-    mon: {name: '张三丰', people: '2人', technician: '李霞 丽丽'},
-    tue: null,
-    wed: null,
-    thu: null,
-    fri: null,
-    sat: null,
-    sun: null
+    mon: [],
+    tue: [],
+    wed: [],
+    thu: [],
+    fri: [],
+    sat: [],
+    sun: []
   },
   {
     time: '12:00-14:00',
-    mon: {name: '张三丰', people: '2人', technician: '李霞 丽丽'},
-    tue: null,
-    wed: null,
-    thu: null,
-    fri: null,
-    sat: null,
-    sun: null
+    mon: [],
+    tue: [],
+    wed: [],
+    thu: [],
+    fri: [],
+    sat: [],
+    sun: []
   },
   {
     time: '14:00-16:00',
-    mon: {name: '张三丰', people: '2人', technician: '李霞 丽丽'},
-    tue: null,
-    wed: null,
-    thu: null,
-    fri: null,
-    sat: null,
-    sun: null
+    mon: [],
+    tue: [],
+    wed: [],
+    thu: [],
+    fri: [],
+    sat: [],
+    sun: []
   }, {
     time: '16:00-18:00',
-    mon: {name: '张三丰', people: '2人', technician: '李霞 丽丽'},
-    tue: null,
-    wed: null,
-    thu: null,
-    fri: null,
-    sat: null,
-    sun: null
+    mon: [],
+    tue: [],
+    wed: [],
+    thu: [],
+    fri: [],
+    sat: [],
+    sun: []
   },
   {
     time: '18:00-20:00',
-    mon: {name: '张三丰', people: '2人', technician: '李霞 丽丽'},
-    tue: null,
-    wed: null,
-    thu: null,
-    fri: null,
-    sat: null,
-    sun: null
+    mon: [],
+    tue: [],
+    wed: [],
+    thu: [],
+    fri: [],
+    sat: [],
+    sun: []
   },
   // 更多数据...
 ]);
 
-const days = [
+const days = ref([
   {key: 'mon', label: '周一'},
   {key: 'tue', label: '周二'},
   {key: 'wed', label: '周三'},
@@ -293,14 +283,15 @@ const days = [
   {key: 'fri', label: '周五'},
   {key: 'sat', label: '周六'},
   {key: 'sun', label: '周日'}
-];
-
+])
+const dateTime =  ref(null);
 
 const store = useCounterStore();
-let searchForm = ref({});
+let searchForm = ref({srch_type:"手机号"});
 
 //
 let tableData = ref([]);
+
 let selectData = ref([]);
 let loading = ref(false);
 
@@ -314,23 +305,38 @@ const handleSizeChange = (val) => {
   pageSize.value = val;
   selectData.value = [];
   getData();
+  getDateList()
+  getAdmitOrders({start_date:days.value[0].date, end_date:days.value[6].date })
+
 };
 
 function getCellClassName({row, column}) {
-  if (row[column.property] && row[column.property].name) {
+  if (row[column.property] && row[column.property].length>0) {
     return 'hasData';
   }
   return '';
 }
-function setPageGetData(key,type) {
-  console.log(key)
-  console.log(type)
+function setPageGetData(val, type) {
+  // 将字符串日期转成 Date 对象
+  const currentDate = new Date(val.date); // '2025-01-26' -> Date 对象
+  // 判断是加七天还是减七天
+  if (type === 1) {
+    currentDate.setDate(currentDate.getDate() + 7); // 加 7 天
+  } else if (type === -1) {
+    currentDate.setDate(currentDate.getDate() - 7); // 减 7 天
+  }
+  // 更新 dateTime.value(假设是 ref 或 reactive 的响应式数据)
+  dateTime.value = currentDate;
+  getDateList()
+  getAdmitOrders({start_date:days.value[0].date, end_date:days.value[6].date })
 }
 
 const handleCurrentChange = (val) => {
   currentPage.value = val;
   selectData.value = [];
   getData();
+  getDateList()
+   getAdmitOrders({start_date:days.value[0].date, end_date:days.value[6].date })
 };
 
 function searchFun() {
@@ -338,6 +344,9 @@ function searchFun() {
   selectData.value = [];
   tableData.value = [];
   getData();
+  getDateList()
+   getAdmitOrders({start_date:days.value[0].date, end_date:days.value[6].date })
+
 }
 
 const setTableFlag = () => {
@@ -347,21 +356,53 @@ const setTableFlag = () => {
 
 
 function setStatus(row, type) {
-  ElMessageBox.confirm("确认删除,是否继续?", "提示", {
+  let str=""
+  if (type==0){
+    str="确认取消预约"
+  }else if (type==1){
+    str="确认到店"
+  }else if (type==2){
+    str="确认服务完成"
+  }
+
+  ElMessageBox.confirm(str+",是否继续?", "提示", {
     confirmButtonText: "确认",
     cancelButtonText: "取消",
     type: "warning",
   })
       .then(() => {
-        // delApi({
-        //   id: row.id.toString(),
-        // }).then(() => {
-        //   ElMessage({
-        //     type: "success",
-        //     message: "删除成功!",
-        //   });
-        //   getData();
-        // });
+
+        if (type==0){
+          admitCancelApi({
+            id: row.id.toString(),
+          }).then(() => {
+            ElMessage({
+              type: "success",
+              message: "取消成功!",
+            });
+            getData();
+          });
+        }else if (type==1){
+          admitComeApi({
+            id: row.id.toString(),
+          }).then(() => {
+            ElMessage({
+              type: "success",
+              message: "确认成功!",
+            });
+            getData();
+          });
+        }else if (type==2){
+          admitFinishApi({
+            id: row.id.toString(),
+          }).then(() => {
+            ElMessage({
+              type: "success",
+              message: "确认成功!",
+            });
+            getData();
+          });
+        }
       })
       .catch(() => {
         ElMessage({
@@ -381,8 +422,60 @@ function resetFun() {
 
 function refreshList() {
   getData();
+  getDateList()
+   getAdmitOrders({start_date:days.value[0].date, end_date:days.value[6].date })
+
 }
 
+function getDateList() {
+  const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
+  const daysMap = {
+    '周日': 'sun',
+    '周一': 'mon',
+    '周二': 'tue',
+    '周三': 'wed',
+    '周四': 'thu',
+    '周五': 'fri',
+    '周六': 'sat'
+  };
+
+  const result = [];
+  // 使用当前日期作为默认值
+  let date = new Date();
+  if (!dateTime.value){
+    dateTime.value= date
+  }else{
+    date = dateTime.value
+  }
+
+  const day = date.getDay();
+
+  // 获取本周一的日期
+  const startOfWeek = new Date(date);
+  startOfWeek.setDate(date.getDate() - (day === 0 ? 6 : day - 1));
+
+  for (let i = 0; i < 7; i++) {
+    const currentDate = new Date(startOfWeek);
+    currentDate.setDate(startOfWeek.getDate() + i);
+
+    const year = currentDate.getFullYear();
+    const month = String(currentDate.getMonth() + 1).padStart(2, '0'); // 月份从0开始
+    const dayOfMonth = String(currentDate.getDate()).padStart(2, '0');
+
+    const weekDay = weekdays[currentDate.getDay()];
+    const formattedDateLabel = `${month}.${dayOfMonth} (${weekDay})`;
+    const formattedDate = `${year}-${month}-${dayOfMonth}`;
+    const shortLabel = daysMap[weekDay];
+
+    result.push({
+      label: formattedDateLabel,
+      key: shortLabel,
+      date: formattedDate
+    });
+  }
+  days.value=result
+  return result;
+}
 function getData() {
   loading.value = true;
   let obj = Object.assign(
@@ -392,10 +485,10 @@ function getData() {
       },
       searchForm.value
   );
-  obj.order_date_start = obj.timeArr ? obj.timeArr[0] : "";
-  obj.order_date_end = obj.timeArr ? obj.timeArr[1] : "";
+  obj.start_date = obj.timeArr ? obj.timeArr[0] : "";
+  obj.end_date = obj.timeArr ? obj.timeArr[1] : "";
   delete obj.timeArr;
-  listApi(obj)
+  admitListApi(obj)
       .then((data) => {
         tableData.value = data.list;
         total.value = data.page.total;
@@ -405,6 +498,67 @@ function getData() {
         loading.value = false;
       });
 }
+function getAdmitOrders(rdata={}) {
+  admitOrdersApi(rdata).then((data) => {
+// 示例调用
+    const formattedTableData = mergeTableData(days.value, tableData2.value, data);
+  })
+}
+function mergeTableData(days, tableData, responseData) {
+  const dateKeyMap = {};
+  days.forEach(day => {
+    dateKeyMap[day.date] = day.key; // 如 '2025-05-20' => 'mon'
+  });
+
+  const list = responseData.list;
+  for (let i = 0; i < tableData.length; i++) {
+    tableData[i].mon=[];
+    tableData[i].tue=[];
+    tableData[i].wed=[];
+    tableData[i].thu=[];
+    tableData[i].fri=[];
+    tableData[i].sat=[];
+    tableData[i].sun=[];
+  }
+  for (const date in list) {
+    const key = dateKeyMap[date];
+    if (!key) continue;
+
+    const timeSlots = list[date];
+
+    for (const orderTime in timeSlots) {
+      const orders = timeSlots[orderTime];
+ 
+      // 找到对应的时间段
+      const targetRow = tableData.find(row => {
+        const [start, end] = row.time.split('-').map(t => convertToMinutes(t));
+        const orderMin = convertToMinutes(orderTime);
+        return orderMin >= start && orderMin < end;
+      });
+
+      if (targetRow) {
+        // 初始化为空数组
+        targetRow[key] = [];
+        orders.forEach(order => {
+          targetRow[key].push({
+            name: order.user_name,
+            people: `${order.order_num}人`,
+            technician: order.tech_name
+          });
+        });
+      }
+    }
+  }
+
+  return tableData;
+}
+
+// 辅助函数:将 HH:mm 转换为分钟数
+function convertToMinutes(timeStr) {
+  const [hours, minutes = 0] = timeStr.split(':').map(Number);
+  return hours * 60 + minutes;
+}
+
 
 function handleSelectionChange(val) {
   selectData.value = val;
@@ -415,6 +569,9 @@ function tabChange(name) {
   selectData.value = [];
   tableData.value = [];
   getData();
+  getDateList()
+   getAdmitOrders({start_date:days.value[0].date, end_date:days.value[6].date })
+
 }
 
 function imgSrc(path) {
@@ -435,25 +592,14 @@ function sendOrder(row) {
   sendPageRef.value.initFun(row);
 }
 
-// 导出
-function exportFun() {
-  let obj = Object.assign({}, searchForm.value);
-  obj.order_date_start = obj.timeArr ? obj.timeArr[0] : "";
-  obj.order_date_end = obj.timeArr ? obj.timeArr[1] : "";
-  delete obj.timeArr;
-  shopExportApi(obj).then((res) => {
-    const url = window.URL.createObjectURL(new Blob([res]));
-    const link = document.createElement("a");
-    link.href = url;
-    link.setAttribute("download", "商城订单.xlsx");
-    document.body.appendChild(link);
-    link.click();
-  });
-}
+
 
 //
 onMounted(() => {
   getData();
+  getDateList()
+   getAdmitOrders({start_date:days.value[0].date, end_date:days.value[6].date })
+
 });
 </script>
 
@@ -518,10 +664,27 @@ onMounted(() => {
   }
 
 }
+:deep(.el-table .cell) {
+  height: 150px !important;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+:deep(.el-table__row) {
+  height: 150px !important;
+}
 
 </style>
 <style lang="scss">
 .hasData {
   background-color: lightgreen !important;
+  align-items: center; /* 垂直居中 */
+}
+
+/* 确保子元素不会超出容器并且平均分配空间 */
+.hasData > * {
+  flex: 1; /* 让每个直接子元素平均分配空间 */
+  min-width: 0; /* 防止最小宽度限制导致无法缩放 */
+  margin: 0 5px; /* 可选:根据需要调整间距 */
 }
 </style>

+ 300 - 0
src/views/reservation/Sales.vue

@@ -0,0 +1,300 @@
+<template>
+  <section v-loading="loading">
+    <el-tabs
+      type="border-card"
+      v-model="searchForm.refund_status"
+      class="manage-sales"
+      @tab-change="tabChange"
+    >
+      <el-tab-pane label="全部" name="all"> </el-tab-pane>
+      <el-tab-pane label="待审核" :name="1"> </el-tab-pane>
+      <el-tab-pane label="待处理" :name="2"> </el-tab-pane>
+      <el-tab-pane label="已完成" :name="4"> </el-tab-pane>
+      <el-tab-pane label="已取消" :name="-1"> </el-tab-pane>
+    </el-tabs>
+    <div class="manage-sales-content">
+      <div class="order-head">
+        <el-form inline>
+          <el-form-item>
+            <el-input
+              style="width: 100%"
+              v-model="searchForm.order_no"
+              placeholder="订单号"
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-input
+              style="width: 100%"
+              v-model="searchForm.username"
+              placeholder="用户姓名"
+            />
+          </el-form-item>
+          <!-- <el-form-item>
+            <el-date-picker
+              style="width: 100%"
+              v-model="searchForm.order_date"
+              type="datetime"
+              placeholder="下单日期"
+              value-format="YYYY-MM-DD HH:mm:ss"
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-date-picker
+              style="width: 100%"
+              v-model="searchForm.pay_date"
+              type="datetime"
+              placeholder="支付日期"
+              value-format="YYYY-MM-DD HH:mm:ss"
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-select
+              v-model="searchForm.payment_status"
+              clearable
+              placeholder="支付状态"
+            >
+              <el-option label="已支付" :value="1" />
+              <el-option label="未支付" :value="0" />
+            </el-select>
+          </el-form-item> -->
+          <el-form-item>
+            <el-button type="primary" @click="searchFun">查询</el-button>
+            <el-button @click="resetFun">重置</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div class="coupon-table">
+        <el-table
+          border
+          stripe
+          :data="tableData"
+          :height="store.tableHeight - 90"
+          @selection-change="handleSelectionChange"
+        >
+          <!-- <el-table-column type="selection" width="55" align="center" /> -->
+          <el-table-column label="用户信息" width="300">
+            <template #default="{ row }">
+              <div class="manage-info">
+                <el-image
+                  :preview-teleported="true"
+                  style="width: 50px; min-width: 50px; height: 50px"
+                  :src="row?.user?.headimg"
+                  :zoom-rate="1.2"
+                  :preview-src-list="[row?.user?.headimg]"
+                  :initial-index="4"
+                  fit="cover"
+                  class="img-box"
+                />
+                <div class="right">
+                  <div>
+                    <!-- <label>用户昵称:</label> -->
+                    <span>{{ row?.user?.nickname }} </span>
+                  </div>
+                  <div>
+                    <!-- <label>推荐手机:</label> -->
+                    <span>{{ row?.user?.phone }} </span>
+                  </div>
+                </div>
+              </div>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="订单单号/售后单号">
+            <template #default="{ row }">
+              <div>
+                {{ row.order_no }}
+              </div>
+              <div>
+                {{ row?.refund_info?.refund_no }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="状态">
+            <template #default="{ row }">
+              <el-tag> {{ row.refund_status_name }} </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="商品信息" show-overflow-tooltip>
+            <template #default="{ row }">
+              <div v-for="item in row.items">
+                <div style="white-space: nowrap; font-size: 12px">
+                  {{ item.goods_name }} ( {{ item.goods_spec }} )
+                </div>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="申请时间" width="180" prop="refund_at" />
+          <el-table-column
+            label="操作"
+            width="170"
+            align="center"
+            fixed="right"
+          >
+            <template #default="{ row }">
+              <el-button type="primary" link @click="updateOpen(row)">
+                详情
+              </el-button>
+
+              <el-button type="warning" link @click="openOperate(row)">
+                售后操作
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <div class="pagination-div">
+          <div></div>
+          <el-pagination
+            v-model:currentPage="currentPage"
+            v-model:page-size="pageSize"
+            :page-sizes="[20, 50, 100, 200]"
+            layout="total, sizes, prev, pager, next, jumper"
+            :total="total"
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+          />
+          <div></div>
+        </div>
+      </div>
+    </div>
+  </section>
+  <drawerPage ref="drawerPageRef" />
+  <operatePage ref="operatePageRef" @refreshList="refreshList" />
+</template>
+<script setup>
+import { useCounterStore } from "@/stores/counter.js";
+import drawerPage from "./components/DrawerCustom.vue";
+import operatePage from "./components/DialogSales.vue";
+import {entryRefundApi} from "@/plugins/api/reservation/reservation";
+const store = useCounterStore();
+let searchForm = ref({
+  refund_status: "all",
+});
+
+//
+let tableData = ref([]);
+let selectData = ref([]);
+let loading = ref(false);
+const currentPage = ref(1);
+const pageSize = ref(20);
+const total = ref(0);
+const handleSizeChange = (val) => {
+  pageSize.value = val;
+  selectData.value = [];
+  getData();
+};
+const handleCurrentChange = (val) => {
+  currentPage.value = val;
+  selectData.value = [];
+  getData();
+};
+
+function searchFun() {
+  currentPage.value = 1;
+  selectData.value = [];
+  tableData.value = [];
+  getData();
+}
+function resetFun() {
+  currentPage.value = 1;
+  searchForm.value = {
+    refund_status: "all",
+  };
+  tableData.value = [];
+  selectData.value = [];
+  getData();
+}
+function refreshList() {
+  getData();
+}
+function getData() {
+  loading.value = true;
+  let obj = Object.assign(
+    {
+      page: currentPage.value,
+      pageSize: pageSize.value,
+    },
+    searchForm.value
+  );
+  if (obj.refund_status == "all") obj.refund_status = "";
+  entryRefundApi(obj)
+    .then((data) => {
+      tableData.value = data.list;
+      total.value = data.page.total;
+      loading.value = false;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+}
+function handleSelectionChange(val) {
+  selectData.value = val;
+}
+//   售后申请操作
+let operatePageRef = ref(null);
+function openOperate(row) {
+  operatePageRef.value.initFun(row);
+}
+function tabChange(name) {
+  currentPage.value = 1;
+  selectData.value = [];
+  tableData.value = [];
+  getData();
+}
+
+// 详情
+let drawerPageRef = ref(null);
+function updateOpen(row) {
+  drawerPageRef.value.initFun(row);
+}
+
+//
+onMounted(() => {
+  getData();
+});
+</script>
+
+<style lang="scss" scoped>
+.manage-sales {
+  border-bottom: none !important;
+
+  :deep(.el-tabs__content) {
+    padding: 0;
+  }
+}
+
+.manage-sales-content {
+  width: 100%;
+  padding: 10px;
+  height: calc(100% - 40px);
+  overflow: hidden;
+  border: 1px solid #dcdfe6;
+  border-top: none;
+  box-sizing: border-box;
+
+  .order-head {
+  }
+
+  .pagination-div {
+    display: flex;
+    justify-content: space-between;
+    margin-top: 10px;
+  }
+
+  .manage-info {
+    display: flex;
+
+    .img-box {
+      align-self: center;
+    }
+
+    .right {
+      margin-left: 10px;
+      align-self: center;
+
+      span {
+        color: #409eff;
+      }
+    }
+  }
+}
+</style>

+ 2 - 1
src/views/reservation/Technician.vue

@@ -188,6 +188,7 @@ import { useCounterStore } from "@/stores/counter.js";
 import dialogUser from "./components/DialogUser.vue";
 import dialogPassword from "@/views/system/components/DialogPassword.vue";
 import uploadPage from "@/views/system/components/UploadFile.vue";
+import {ElMessage, ElMessageBox} from "element-plus";
 const store = useCounterStore();
 // 左侧树
 let treeProps = {
@@ -202,7 +203,7 @@ function getData() {
       .then((data) => {
         nextTick(() => {
           treeRefDom.value.setCurrentKey(5);
-        });--
+        });
         treeData.value = data;
         treeLoading.value = false;
       })

+ 374 - 0
src/views/reservation/components/DialogSales.vue

@@ -0,0 +1,374 @@
+<template>
+  <el-dialog
+      v-model="dialogVisible2"
+      title="售后操作"
+      width="50%"
+      :before-close="handleClose"
+  >
+    <div class="sales-dialog">
+      <el-form inline label-width="100px">
+        <el-form-item label="申请金额(元):">
+          <span>
+            {{ showForm?.refund_info?.refund_price }}
+          </span>
+        </el-form-item>
+        <el-form-item label="状态:">
+          <span>
+            {{ showForm?.refund_status_name }}
+          </span>
+        </el-form-item>
+        <el-form-item label="申请原因:">
+          <span>
+            {{ showForm?.refund_info?.refund_reason }}
+          </span>
+        </el-form-item>
+        <el-form-item label="申请时间:">
+          <span>
+            {{ showForm?.refund_info?.created_at }}
+          </span>
+        </el-form-item>
+        <div>
+          <el-form-item label="申请说明:" style="width: 100%">
+            <span>
+              {{ showForm?.refund_info?.refund_explain }}
+            </span>
+          </el-form-item>
+        </div>
+
+        <el-form-item
+            v-if="imgList.length > 0"
+            label="申请凭证:"
+            style="width: 100%"
+        >
+          <div class="img-box">
+            <el-image
+                v-for="item in imgList"
+                style="width: 100px; height: 100px"
+                :src="item"
+                :zoom-rate="1.2"
+                :preview-src-list="[item]"
+                :initial-index="4"
+                fit="cover"
+            />
+          </div>
+        </el-form-item>
+      </el-form>
+      <!--  -->
+      <el-form label-width="100px" v-if="showForm.refund_status == 3">
+        <el-form-item>
+          <el-button type="primary" @click="redoFun"> 发起退款 </el-button>
+        </el-form-item>
+      </el-form>
+
+      <!-- 审核操作 -->
+      <el-form
+          ref="ruleFormRef"
+          :model="ruleForm"
+          :rules="rules"
+          label-width="100px"
+          v-if="showForm.refund_status == 1"
+      >
+        <el-form-item label="审核操作:">
+          <el-radio-group v-model="ruleForm.status" @change="handleRadio">
+            <el-radio :label="1">通过</el-radio>
+            <el-radio :label="0">拒绝</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item
+            label="拒绝原因:"
+            v-if="ruleForm.status === 0"
+            style="width: 100%"
+        >
+          <el-input
+              placeholder="拒绝原因"
+              style="width: 100%"
+              type="textarea"
+              :row="2"
+              v-model="ruleForm.remark"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="submit"> 提交 </el-button>
+        </el-form-item>
+      </el-form>
+
+      <!-- 售后操作 -->
+      <el-form
+          ref="ruleFormRef2"
+          :model="ruleForm2"
+          :rules="rules"
+          label-width="100px"
+          v-if="showForm.refund_status == 2"
+      >
+        <el-form-item label="售后操作:">
+          <el-radio-group v-model="ruleForm2.type" @change="changeType">
+            <el-radio :label="1">退款</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item
+            label="退款金额:"
+            v-if="ruleForm2.type === 1"
+            style="width: 100%"
+            prop="refund_price"
+        >
+          <el-input
+              placeholder="退款金额(元)"
+              style="width: 200px"
+              v-model="ruleForm2.refund_price"
+          />
+        </el-form-item>
+        <el-form-item
+            label="物流公司:"
+            v-if="ruleForm2.type === 2"
+            style="width: 100%"
+            prop="company_code"
+        >
+          <el-select
+              v-model="ruleForm2.company_code"
+              filterable
+              collapse-tags
+              collapse-tags-tooltip
+              placeholder="物流公司"
+              style="width: 200px"
+              clearable
+          >
+            <el-option
+                v-for="item in options"
+                :key="item.id"
+                :label="item.name"
+                :value="item.code_1"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item
+            label="发货单号:"
+            v-if="ruleForm2.type === 2"
+            style="width: 100%"
+            prop="send_no"
+        >
+          <el-input
+              placeholder="发货单号"
+              style="width: 200px"
+              v-model="ruleForm2.send_no"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="submit2"> 提交 </el-button>
+        </el-form-item>
+      </el-form>
+      <div style="padding: 20px 10px">
+        <el-timeline>
+          <el-timeline-item
+              v-for="(activity, index) in showForm?.refund_log"
+              :key="index"
+          >
+            <div style="font-size: 12px; color: rgb(143, 142, 140)">
+              {{ activity.op_username }}
+            </div>
+            <div style="font-size: 12px; color: rgb(143, 142, 140)">
+              {{ activity.op_log }}
+            </div>
+            <div style="font-size: 12px; color: rgb(143, 142, 140)">
+              {{ activity.created_at }}
+            </div>
+          </el-timeline-item>
+        </el-timeline>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+<script setup>
+import { listApi } from "@/plugins/api/shopping/logistics";
+import {auditApi, refundApi, redoApi, detailRefundApi} from "@/plugins/api/reservation/reservation.js";
+import {ElMessage, ElMessageBox} from "element-plus";
+
+let ruleForm = ref({});
+let ruleForm2 = ref({});
+let rules = {
+  status: [{ required: true, message: "请选择", trigger: "change" }],
+  type: [{ required: true, message: "请选择", trigger: "change" }],
+  refund_price: [
+    { required: true, message: "请输入退款金额", trigger: "blur" },
+  ],
+  company_code: [
+    { required: true, message: "请选择物流公司", trigger: "change" },
+  ],
+  send_no: [{ required: true, message: "请输入发货单号", trigger: "blur" }],
+};
+let dialogVisible2 = ref(false);
+function handleClose(done) {
+  // dialogVisible2.value = false;
+  ElMessageBox.confirm("是否确定关闭此对话框?")
+      .then(() => {
+        done();
+      })
+      .catch(() => {
+        // catch error
+      });
+}
+
+let formType = ref("");
+let ruleFormRef = ref(null);
+let ruleFormRef2 = ref(null);
+let showForm = ref({});
+let imgList = ref([]);
+
+function initFun(row) {
+  // console.log(row);
+  if (ruleFormRef.value) {
+    ruleFormRef.value.resetFields();
+  }
+  if (ruleFormRef2.value) {
+    ruleFormRef2.value.resetFields();
+  }
+  ruleForm.value = {};
+  ruleForm2.value = {};
+  showForm.value = {};
+  imgList.value = [];
+  showForm.value = {...row};
+  if (typeof variable === 'string') {
+    // 变量是字符串
+    if (row.refund_info.refund_img) {
+      imgList.value = JSON.parse(row.refund_info.refund_img)||[];
+    }
+  } else {
+    imgList.value = row.refund_info.refund_img||[];
+  }
+  ruleForm.value.order_no = row.order_no;
+  ruleForm2.value.order_no = row.order_no;
+  ruleForm2.value.refund_price = showForm.value.amount_total||"";
+  dialogVisible2.value = true;
+
+  getData();
+}
+
+function handleRadio(data) {
+  if (data === 1) {
+    ruleForm.value.remark = "";
+  }
+}
+
+function changeType(data) {
+  if (data === 1) {
+    ruleForm2.value.company_code = "";
+  } else {
+    ruleForm2.value.refund_price =  showForm.value.amount_total||"";
+  }
+}
+
+const emit = defineEmits(["refreshList"]);
+
+function submit() {
+  if (!ruleFormRef.value) return;
+  ruleFormRef.value.validate((valid, fields) => {
+    if (valid) {
+      auditApi(ruleForm.value).then((data) => {
+        ElMessage.success("操作成功!");
+        // dialogVisible2.value = false;
+        detailRefundApi({id: showForm.value.id}).then((data) => {
+          showForm.value = {...data};
+        })
+        emit("refreshList");
+        if (ruleForm.value.status == 1) {
+          showForm.value.refund_status = 2;
+        } else {
+          showForm.value.refund_status = -2;
+        }
+        showForm.value.refund_log.unshift(data);
+      });
+    }
+  });
+}
+
+function submit2() {
+  if (!ruleFormRef2.value) return;
+  ruleFormRef2.value.validate((valid, fields) => {
+    if (valid) {
+      refundApi(ruleForm2.value).then((data) => {
+        ElMessage.success("操作成功!");
+        // dialogVisible2.value = false;
+        detailRefundApi({id: showForm.value.id}).then((data) => {
+          showForm.value = {...data};
+        })
+        emit("refreshList");
+        showForm.value.refund_status = 4;
+        showForm.value.refund_log.unshift(data);
+      });
+    }
+  });
+}
+
+// 物流
+let options = ref([]);
+
+function getData() {
+  listApi({
+    page: 1,
+    pageSize: 10000,
+  }).then((data) => {
+    options.value = data.list;
+  });
+}
+
+// 发起退款
+function redoFun() {
+  ElMessageBox.confirm("确认重新发起退款,是否继续?", "提示", {
+    confirmButtonText: "确认",
+    cancelButtonText: "取消",
+    type: "warning",
+  })
+      .then(() => {
+        redoApi({
+          order_no: showForm.value.order_no,
+        }).then((data) => {
+          ElMessage({
+            type: "success",
+            message: "操作成功!",
+          });
+          detailRefundApi({id: showForm.value.id}).then((data) => {
+            showForm.value = {...data};
+          })
+          emit("refreshList");
+          showForm.value.refund_status = 4;
+          showForm.value.refund_log.unshift(data);
+        });
+      })
+      .catch(() => {
+        ElMessage({
+          type: "info",
+          message: "已取消。",
+        });
+      });
+}
+
+onMounted(() => {
+});
+defineExpose({
+  initFun,
+});
+</script>
+<style scoped lang="scss">
+.sales-dialog {
+  :deep(.el-form-item) {
+    width: 50%;
+    margin-right: 0;
+    padding-right: 10px;
+    box-sizing: border-box;
+
+    .el-input {
+      width: 100%;
+    }
+  }
+
+  .img-box {
+    margin-bottom: 10px;
+
+    .el-image {
+      width: 100%;
+      height: 140px;
+      object-fit: cover;
+      margin-right: 10px;
+    }
+  }
+}
+</style>

+ 535 - 0
src/views/reservation/components/DrawerCustom.vue

@@ -0,0 +1,535 @@
+<template>
+  <el-drawer v-model="drawer" size="60%" :before-close="handleClose">
+    <template #header>
+      <div class="order-detail-title">订单编号: {{ dataInfo?.order_no }}</div>
+    </template>
+    <div class="drawer-content order-detail">
+      <!-- <div class="content-head">
+        <el-icon class="icon">
+          <IEpUserFilled />
+        </el-icon>
+        <label>销售:</label>
+        <span>{{ dataInfo?.puid }}</span>
+        <div></div>
+        <el-icon class="icon">
+          <IEpClock />
+        </el-icon>
+        <label>创建时间:</label>
+        <span>{{ dataInfo?.created_at }}</span>
+      </div> -->
+      <div style="padding: 10px 20px">
+        <el-steps :active="stepData">
+          <el-step title="买家下单" />
+          <el-step title="买家付款" />
+          <el-step title="买家已签到" />
+          <el-step title="交易完成" />
+        </el-steps>
+      </div>
+      <div class="item-title">基本信息</div>
+      <div class="detail-section-1">
+        <el-descriptions :column="2">
+          <!-- <el-descriptions-item width="50%" label="用户昵称:">
+            {{ dataInfo?.user?.nickname }}
+          </el-descriptions-item> -->
+          <el-descriptions-item width="50%" label="用户姓名:">
+            {{ dataInfo?.user?.username }}
+          </el-descriptions-item>
+          <el-descriptions-item width="50%" label="订单金额:">
+            {{ dataInfo?.amount_real }}
+          </el-descriptions-item>
+          <el-descriptions-item width="50%" label="联系电话:">
+            {{ dataInfo?.mobile }}
+          </el-descriptions-item>
+          <el-descriptions-item width="50%" label="报名人数:">
+            {{ dataInfo?.num }}
+          </el-descriptions-item>
+          <el-descriptions-item width="50%" label="订单提交时间:">
+            {{ dataInfo?.send?.created_at }}
+          </el-descriptions-item>
+        </el-descriptions>
+        <el-descriptions :column="1">
+          <el-descriptions-item width="100%" label="备注:">
+            {{ dataInfo?.order_remark }}
+          </el-descriptions-item>
+        </el-descriptions>
+      </div>
+
+      <div class="item-title">商品信息</div>
+      <div class="detail-section-3">
+        <el-table border stripe :data="dataInfo?.items">
+          <el-table-column label="用户信息" width="300">
+            <template #default="{ row }">
+              <div class="manage-info">
+                <el-image
+                  :preview-teleported="true"
+                  style="width: 50px; min-width: 50px; height: 50px"
+                  :src="imgSrc(row?.goods_cover)"
+                  :zoom-rate="1.2"
+                  :preview-src-list="[imgSrc(row?.goods_cover)]"
+                  :initial-index="4"
+                  fit="cover"
+                  class="img-box"
+                />
+                <div class="right">
+                  <div>
+                    <span>{{ row?.goods_name }} </span>
+                  </div>
+                  <div>
+                    <span>{{ row?.goods_code }} </span>
+                  </div>
+                </div>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="goods_kind" label="商品类型" />
+          <el-table-column prop="goods_spec" label="规格" />
+          <el-table-column prop="price_market" label="市场单价" />
+          <el-table-column prop="price_selling" label="销售单价" />
+          <el-table-column prop="stock_sales" label="商品数量" />
+          <el-table-column prop="total_selling" label="总价" />
+          <!-- <el-table-column label="操作" width="120" align="center" fixed="right">
+            <template #default="{ row }">
+
+              <el-button type="primary" link @click="sendOrder(row)">
+                发货
+              </el-button>
+              <el-button type="danger" link @click="delFun(row)">删除</el-button>
+            </template>
+          </el-table-column> -->
+        </el-table>
+      </div>
+      <div class="item-title">支付明细</div>
+      <div class="detail-section-2">
+        <el-descriptions :column="2">
+          <el-descriptions-item width="50%" label="订单总金额:">
+            {{ dataInfo?.amount_total }}
+            <!-- <el-button
+              class="btn"
+              size="small"
+              type="primary"
+              @click="openPrice"
+              v-if="priceType && dataInfo?.status == 1"
+              >改价</el-button
+            >
+            <el-dialog v-model="priceVisible" title="改价" width="30%">
+              <el-form :model="priceForm" ref="priceFormRef">
+                <el-form-item
+                  label="价格(元)"
+                  :rules="[
+                    {
+                      required: true,
+                      message: '价格',
+                      trigger: 'blur',
+                    },
+                  ]"
+                >
+                  <el-input placeholder="价格" v-model="priceForm.money" />
+                </el-form-item>
+              </el-form>
+              <template #footer>
+                <span class="dialog-footer">
+                  <el-button @click="priceVisible = false">取消</el-button>
+                  <el-button type="primary" @click="submitPrice">
+                    确认
+                  </el-button>
+                </span>
+              </template>
+            </el-dialog> -->
+          </el-descriptions-item>
+          <el-descriptions-item width="50%" label="实际支付:"
+            >{{ dataInfo?.payment_amount }}
+          </el-descriptions-item>
+          <el-descriptions-item width="50%" label="支付到账时间:"
+            >{{ dataInfo?.payment_datetime }}
+          </el-descriptions-item>
+        </el-descriptions>
+      </div>
+      <div v-if="remarkType">
+        <div class="item-title item-title-2">
+          <div>客服备注</div>
+          <el-button
+            class="btn"
+            v-if="showMemo"
+            size="small"
+            type="primary"
+            @click="openRemark"
+            >客服备注</el-button
+          >
+        </div>
+        <div class="detail-section-2">
+          <el-descriptions :column="1">
+            <el-descriptions-item width="50%" label="客服备注:">
+              {{ dataInfo?.cs_remark || "无" }}
+            </el-descriptions-item>
+          </el-descriptions>
+          <el-dialog v-model="wechatVisible" title="客服备注" width="30%">
+            <el-form :model="wechatForm" ref="wechatFormRef">
+              <el-form-item
+                label="客服备注"
+                :rules="[
+                  {
+                    required: true,
+                    message: '客服备注...',
+                    trigger: 'blur',
+                  },
+                ]"
+              >
+                <el-input
+                  :rows="4"
+                  placeholder="客服备注"
+                  type="textarea"
+                  class="tab1-textarea"
+                  v-model="wechatForm.remark"
+                />
+              </el-form-item>
+            </el-form>
+            <template #footer>
+              <span class="dialog-footer">
+                <el-button @click="wechatVisible = false">取消</el-button>
+                <el-button type="primary" @click="submitWechat">
+                  确认
+                </el-button>
+              </span>
+            </template>
+          </el-dialog>
+        </div>
+      </div>
+
+      <div v-if="dataInfo?.status > 3">
+        <div class="item-title">物流信息</div>
+        <div class="detail-section-4">
+          <el-table border stripe :data="dataInfo?.send_log">
+            <el-table-column prop="order_no" label="商城订单编号" />
+            <el-table-column prop="company_name" label="快递公司名称" />
+            <el-table-column prop="send_number" label="快递单号" />
+            <el-table-column prop="send_remark" label="备注" />
+            <el-table-column prop="send_datetime" label="快递发送时间" />
+          </el-table>
+        </div>
+      </div>
+      <div v-if="dataInfo.refund_log && dataInfo.refund_log.legnth > 0">
+        <div class="item-title">售后信息</div>
+        <div style="padding: 20px 10px">
+          <el-timeline>
+            <el-timeline-item
+              v-for="(activity, index) in dataInfo.refund_log"
+              :key="index"
+            >
+              <div style="font-size: 12px; color: rgb(143, 142, 140)">
+                {{ activity.op_username }}
+              </div>
+              <div style="font-size: 12px; color: rgb(143, 142, 140)">
+                {{ activity.op_log }}
+              </div>
+              <div style="font-size: 12px; color: rgb(143, 142, 140)">
+                {{ activity.created_at }}
+              </div>
+            </el-timeline-item>
+          </el-timeline>
+        </div>
+      </div>
+    </div>
+  </el-drawer>
+</template>
+<script setup>
+import {
+  truckApi,
+  detailApi,
+  orderSendDelApi,
+  wechatRemarkApi,
+  chgMoneyApi,
+} from "@/plugins/api/shopping/order";
+const props = defineProps({
+  remarkType: {
+    type: Boolean,
+    default: false,
+  },
+  priceType: {
+    type: Boolean,
+    default: false,
+  },
+  showMemo: {
+    type: Boolean,
+    default: true,
+  },
+});
+
+const drawer = ref(false);
+function handleClose(done) {
+  ElMessageBox.confirm("是否确定关闭此对话框?")
+    .then(() => {
+      done();
+    })
+    .catch(() => {
+      // catch error
+    });
+}
+
+// 初始化
+let dataInfo = ref({});
+function initFun(row) {
+  dataInfo.value = Object.assign({}, row);
+  drawer.value = true;
+  getSendData();
+}
+let refund_log = [
+  {
+    op_username: "张三",
+    op_log: "此操作是退款",
+    created_at: "2021-12-13 20:21:24",
+  },
+];
+// 步骤条
+let stepData = computed(() => {
+  if (dataInfo.value.status == 1 || dataInfo.value.status == 2) {
+    return 1;
+  } else if (dataInfo.value.status == 3) {
+    return 2;
+  } else if (dataInfo.value.status == 4) {
+    return 3;
+  } else if (
+    dataInfo.value.status == 6 ||
+    dataInfo.value.status == 9 ||
+    dataInfo.value.status == -1 ||
+    dataInfo.value.status == -2
+  ) {
+    return 4;
+  }
+});
+// 发货信息
+function getSendData() {
+  detailApi({
+    // order_no: 'UA793448659074932237'
+    order_no: dataInfo.value.order_no,
+  }).then((data) => {});
+}
+// 发货
+function sendOrder(row) {
+  ElMessageBox.confirm("确认发货,是否继续?", "提示", {
+    confirmButtonText: "确认",
+    cancelButtonText: "取消",
+    type: "warning",
+  })
+    .then(() => {
+      truckApi({
+        id: row.id,
+      }).then(() => {
+        ElMessage({
+          type: "success",
+          message: "删除成功!",
+        });
+      });
+    })
+    .catch(() => {
+      ElMessage({
+        type: "info",
+        message: "已取消。",
+      });
+    });
+}
+// 删除
+function delFun(row) {
+  ElMessageBox.confirm("确认删除,是否继续?", "提示", {
+    confirmButtonText: "确认",
+    cancelButtonText: "取消",
+    type: "warning",
+  })
+    .then(() => {
+      orderSendDelApi({
+        id: row.id,
+      }).then(() => {
+        ElMessage({
+          type: "success",
+          message: "删除成功!",
+        });
+      });
+    })
+    .catch(() => {
+      ElMessage({
+        type: "info",
+        message: "已取消。",
+      });
+    });
+}
+defineExpose({
+  initFun,
+});
+function imgSrc(path) {
+  return import.meta.env.VITE_APP_BASE_API + path;
+}
+// 改价
+let priceVisible = ref(false);
+let priceForm = ref({});
+let priceFormRef = ref(null);
+function openPrice() {
+  priceVisible.value = true;
+  if (priceFormRef.value) {
+    priceFormRef.value.resetFields();
+  }
+  priceForm.value = {};
+  priceForm.value.money = dataInfo.value.amount_real;
+}
+function submitPrice() {
+  if (!priceFormRef.value) return;
+  priceFormRef.value.validate((valid, fields) => {
+    if (valid) {
+      let obj = {
+        order_no: dataInfo.value.order_no,
+        money: priceForm.value.money,
+      };
+      chgMoneyApi(obj).then((data) => {
+        ElMessage.success("操作成功!");
+        priceVisible.value = false;
+        dataInfo.value.amount_real = data.amount_real;
+        emit("refreshList", data);
+      });
+    }
+  });
+}
+// 客服备注
+let wechatVisible = ref(false);
+let wechatForm = ref({});
+let wechatFormRef = ref(null);
+function openRemark() {
+  wechatVisible.value = true;
+  if (wechatFormRef.value) {
+    wechatFormRef.value.resetFields();
+  }
+  wechatForm.value = {};
+  wechatForm.value.remark = dataInfo.value.cs_remark;
+}
+function submitWechat() {
+  if (!wechatFormRef.value) return;
+  wechatFormRef.value.validate((valid, fields) => {
+    if (valid) {
+      let obj = {
+        order_no: dataInfo.value.order_no,
+        remark: wechatForm.value.remark,
+      };
+      wechatRemarkApi(obj).then((data) => {
+        ElMessage.success("操作成功!");
+        wechatVisible.value = false;
+        dataInfo.value.cs_remark = data.cs_remark;
+        emit("refreshList", data);
+      });
+    }
+  });
+}
+const emit = defineEmits(["refreshList"]);
+//
+onMounted(() => {});
+</script>
+<style lang="scss" scoped>
+.order-detail-title {
+  font-size: 24px;
+  font-weight: 500;
+  color: #172b4d;
+  line-height: 22px;
+}
+
+.order-detail {
+  .content-head {
+    white-space: nowrap;
+
+    > div {
+      display: inline-block;
+      height: 15px;
+      border-left: 2px solid #5e6c84;
+      vertical-align: middle;
+      margin: 0 15px;
+    }
+
+    .icon {
+      color: #5e6c84;
+      margin-right: 3px;
+      vertical-align: middle;
+    }
+
+    label {
+      font-size: 14px;
+      font-weight: 500;
+      color: #5e6c84;
+      vertical-align: middle;
+    }
+
+    span {
+      font-size: 14px;
+      font-weight: 500;
+      color: #5e6c84;
+      vertical-align: middle;
+    }
+  }
+
+  .item-title {
+    margin-top: 20px;
+    width: 100%;
+    height: 46px;
+    background: #fafbfc;
+    font-size: 14px;
+    font-weight: bold;
+    color: #172b4d;
+    line-height: 46px;
+    position: relative;
+    padding-left: 10px;
+    box-sizing: border-box;
+
+    &::before {
+      content: "";
+      position: absolute;
+      left: 0;
+      top: 50%;
+      width: 2px;
+      height: 20px;
+      background: #005ecc;
+      transform: translateY(-50%);
+    }
+  }
+
+  .detail-section-1 {
+    padding: 10px;
+    box-sizing: border-box;
+  }
+
+  .item-title-2 {
+    display: flex;
+    justify-content: space-between;
+
+    .btn {
+      align-self: center;
+      margin-right: 10px;
+    }
+  }
+
+  .detail-section-2 {
+    padding: 10px;
+    box-sizing: border-box;
+  }
+
+  .detail-section-3 {
+    padding: 10px;
+    box-sizing: border-box;
+
+    .manage-info {
+      display: flex;
+
+      .img-box {
+        align-self: center;
+      }
+
+      .right {
+        margin-left: 10px;
+        align-self: center;
+
+        span {
+          color: #409eff;
+        }
+      }
+    }
+  }
+
+  .detail-section-4 {
+    padding: 10px;
+    box-sizing: border-box;
+  }
+}
+</style>

Some files were not shown because too many files changed in this diff