unknown il y a 1 mois
Parent
commit
86bf7a2102

+ 141 - 3
src/assets/fonts/demo_index.html

@@ -55,6 +55,42 @@
           <ul class="icon_lists dib-box">
           
             <li class="dib">
+              <span class="icon iconfont">&#xe768;</span>
+                <div class="name">已取消订单</div>
+                <div class="code-name">&amp;#xe768;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe63a;</span>
+                <div class="name">待配送</div>
+                <div class="code-name">&amp;#xe63a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe60e;</span>
+                <div class="name">待审核</div>
+                <div class="code-name">&amp;#xe60e;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe661;</span>
+                <div class="name">配送中</div>
+                <div class="code-name">&amp;#xe661;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe61d;</span>
+                <div class="name">阅读也-目录</div>
+                <div class="code-name">&amp;#xe61d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe60b;</span>
+                <div class="name">已完成订单</div>
+                <div class="code-name">&amp;#xe60b;</div>
+              </li>
+          
+            <li class="dib">
               <span class="icon iconfont">&#xe61c;</span>
                 <div class="name">流向追溯</div>
                 <div class="code-name">&amp;#xe61c;</div>
@@ -138,9 +174,9 @@
 <pre><code class="language-css"
 >@font-face {
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1718951229625') format('woff2'),
-       url('iconfont.woff?t=1718951229625') format('woff'),
-       url('iconfont.ttf?t=1718951229625') format('truetype');
+  src: url('iconfont.woff2?t=1727226736655') format('woff2'),
+       url('iconfont.woff?t=1727226736655') format('woff'),
+       url('iconfont.ttf?t=1727226736655') format('truetype');
 }
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -167,6 +203,60 @@
         <ul class="icon_lists dib-box">
           
           <li class="dib">
+            <span class="icon iconfont icon-yiquxiaodingdan"></span>
+            <div class="name">
+              已取消订单
+            </div>
+            <div class="code-name">.icon-yiquxiaodingdan
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-daipeisong"></span>
+            <div class="name">
+              待配送
+            </div>
+            <div class="code-name">.icon-daipeisong
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-daishenhe"></span>
+            <div class="name">
+              待审核
+            </div>
+            <div class="code-name">.icon-daishenhe
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-peisongzhong"></span>
+            <div class="name">
+              配送中
+            </div>
+            <div class="code-name">.icon-peisongzhong
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-yueduye-mulu"></span>
+            <div class="name">
+              阅读也-目录
+            </div>
+            <div class="code-name">.icon-yueduye-mulu
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-yiwanchengdingdan"></span>
+            <div class="name">
+              已完成订单
+            </div>
+            <div class="code-name">.icon-yiwanchengdingdan
+            </div>
+          </li>
+          
+          <li class="dib">
             <span class="icon iconfont icon-iceTracing"></span>
             <div class="name">
               流向追溯
@@ -294,6 +384,54 @@
           
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-yiquxiaodingdan"></use>
+                </svg>
+                <div class="name">已取消订单</div>
+                <div class="code-name">#icon-yiquxiaodingdan</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-daipeisong"></use>
+                </svg>
+                <div class="name">待配送</div>
+                <div class="code-name">#icon-daipeisong</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-daishenhe"></use>
+                </svg>
+                <div class="name">待审核</div>
+                <div class="code-name">#icon-daishenhe</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-peisongzhong"></use>
+                </svg>
+                <div class="name">配送中</div>
+                <div class="code-name">#icon-peisongzhong</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-yueduye-mulu"></use>
+                </svg>
+                <div class="name">阅读也-目录</div>
+                <div class="code-name">#icon-yueduye-mulu</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-yiwanchengdingdan"></use>
+                </svg>
+                <div class="name">已完成订单</div>
+                <div class="code-name">#icon-yiwanchengdingdan</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#icon-iceTracing"></use>
                 </svg>
                 <div class="name">流向追溯</div>

+ 27 - 3
src/assets/fonts/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 4556741 */
-  src: url('@/assets/fonts/iconfont.woff2?t=1718951229625') format('woff2'),
-       url('@/assets/fonts/iconfont.woff?t=1718951229625') format('woff'),
-       url('@/assets/fonts/iconfont.ttf?t=1718951229625') format('truetype');
+  src: url('@/assets/fonts/iconfont.woff2?t=1727226736655') format('woff2'),
+       url('@/assets/fonts/iconfont.woff?t=1727226736655') format('woff'),
+       url('@/assets/fonts/iconfont.ttf?t=1727226736655') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,30 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-yiquxiaodingdan:before {
+  content: "\e768";
+}
+
+.icon-daipeisong:before {
+  content: "\e63a";
+}
+
+.icon-daishenhe:before {
+  content: "\e60e";
+}
+
+.icon-peisongzhong:before {
+  content: "\e661";
+}
+
+.icon-yueduye-mulu:before {
+  content: "\e61d";
+}
+
+.icon-yiwanchengdingdan:before {
+  content: "\e60b";
+}
+
 .icon-iceTracing:before {
   content: "\e61c";
 }

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
src/assets/fonts/iconfont.js


+ 42 - 0
src/assets/fonts/iconfont.json

@@ -6,6 +6,48 @@
   "description": "",
   "glyphs": [
     {
+      "icon_id": "3683468",
+      "name": "已取消订单",
+      "font_class": "yiquxiaodingdan",
+      "unicode": "e768",
+      "unicode_decimal": 59240
+    },
+    {
+      "icon_id": "5174608",
+      "name": "待配送",
+      "font_class": "daipeisong",
+      "unicode": "e63a",
+      "unicode_decimal": 58938
+    },
+    {
+      "icon_id": "5650857",
+      "name": "待审核",
+      "font_class": "daishenhe",
+      "unicode": "e60e",
+      "unicode_decimal": 58894
+    },
+    {
+      "icon_id": "8982172",
+      "name": "配送中",
+      "font_class": "peisongzhong",
+      "unicode": "e661",
+      "unicode_decimal": 58977
+    },
+    {
+      "icon_id": "9097231",
+      "name": "阅读也-目录",
+      "font_class": "yueduye-mulu",
+      "unicode": "e61d",
+      "unicode_decimal": 58909
+    },
+    {
+      "icon_id": "12944338",
+      "name": "已完成订单",
+      "font_class": "yiwanchengdingdan",
+      "unicode": "e60b",
+      "unicode_decimal": 58891
+    },
+    {
       "icon_id": "8238527",
       "name": "流向追溯",
       "font_class": "iceTracing",

BIN
src/assets/fonts/iconfont.ttf


BIN
src/assets/fonts/iconfont.woff


BIN
src/assets/fonts/iconfont.woff2


+ 10 - 9
src/components/actionBar.vue

@@ -14,7 +14,7 @@
                 <div class="forms_dom">
                   <el-input size="medium" autocomplete="new-password" :placeholder="item.placeholder"
                     :disabled="item.disabled" :id="item.field" :show-password="item.mold ? true : false"
-                    v-model="ruleForm[`${item.field}`]" />
+                    v-model="ruleForm[`${item.field}`]" @keyup.enter.native="searchProtocol" />
                 </div>
               </template>
               <!-- 下拉框 -->
@@ -30,7 +30,7 @@
               <template v-if="item.type === 'picker'">
                 <el-date-picker size="medium" v-model="ruleForm[`${item.field}`]" type="datetimerange" align="right"
                   value-format="yyyy-MM-dd hh:mm:ss" unlink-panels range-separator="至" start-placeholder="开始日期"
-                  end-placeholder="结束日期" :picker-options="pickerOptions">
+                  end-placeholder="结束日期" :picker-options="pickerOptions" @change="searchProtocol">
                 </el-date-picker>
               </template>
             </el-form-item>
@@ -38,15 +38,14 @@
               <el-button size="medium" icon="el-icon-search" type="primary" @click="searchProtocol">搜索</el-button>
               <el-button size="medium" icon="el-icon-refresh" @click="reset">重置</el-button>
             </el-form-item>
+            <div class="btn_head" v-for="(item1,index1) in operateList" :key="index1 + 'il'"
+              v-if="operateList.length > 0">
+              <el-button :type="item1.colour ? item1.colour : 'primary'" size="medium" :icon="item1.icon"
+                @click="openModel(item1.type)">{{item1.title}}</el-button>
+            </div>
           </div>
         </el-form>
       </div>
-      <div class="same_row_in" v-if="operateList.length > 0">
-        <div class="btn_head" v-for="(item1,index) in operateList" :key="index">
-          <el-button :type="item1.colour ? item1.colour : 'primary'" size="medium" :icon="item1.icon"
-            @click="openModel(item1.type)">{{item1.title}}</el-button>
-        </div>
-      </div>
     </div>
   </div>
 </template>
@@ -125,7 +124,9 @@
       handleScroll(type) {
         this.$emit('handleScroll', type)
       },
-      changeSelect() {}
+      changeSelect() {
+        this.$emit('searchProtocol', this.ruleForm)
+      }
     }
   }
 </script>

+ 17 - 8
src/components/forms.vue

@@ -8,7 +8,7 @@
           <el-form-item class="card_independent" :label-width="item.labelWidth" :label="item.label" :prop="item.field"
             :rules="detail ? item.rules : {}" v-if="item.type === 'input'">
             <el-input :placeholder="item.placeholder" :disabled="item.disabled" :id="item.field"
-              v-model="ruleForm[`${item.field}`]"
+              v-model="ruleForm[`${item.field}`]" auto-complete="new-password"
               :show-password="['newPassword','password'].includes(item.field) ? true : false"></el-input>
             <div class="unit_card" v-if="item.unit">{{item.unit}}</div>
           </el-form-item>
@@ -57,7 +57,7 @@
           <el-form-item :label="item.label" :prop="item.field" :rules="detail ? item.rules : {}"
             v-if="item.type === 'radio'">
             <div style="display: flex;height: 40px;align-items: center;">
-              <el-radio-group v-model="ruleForm[`${item.field}`]" :disabled="item.disabled" @input="radioInput">
+              <el-radio-group v-remove-hidden v-model="ruleForm[`${item.field}`]" :disabled="item.disabled" @input="radioInput">
                 <el-radio v-for="(element, i) in item.options" :key="i"
                   :label="element.value">{{element.label}}</el-radio>
               </el-radio-group>
@@ -242,14 +242,23 @@
       },
       // 重置校验
       resetCheck() {
-        if (this.iceTracing) {
-          this.inputs = ''
-          this.inputsList = []
-          if (this.ruleForm.code) {
-            this.ruleForm.code = []
+        const that = this
+        if (that.iceTracing) {
+          that.inputs = ''
+          that.inputsList = []
+          checkType(that.ruleForm.code)
+
+          function checkType(value) {
+            if (typeof value === 'string') {
+              that.ruleForm.code = ''
+            } else if (Array.isArray(value)) {
+              that.ruleForm.code = []
+            } else {
+              that.ruleForm.code = []
+            }
           }
         }
-        this.$refs.ruleForm.resetFields();
+        that.$refs.ruleForm.resetFields();
       },
       // 单个图片上传
       singleUpload(file, value) {

+ 20 - 6
src/components/tables.vue

@@ -1,9 +1,9 @@
 <template>
   <!-- tables -->
   <div class="tables_grid">
-    <el-table ref="tableRef" style="width: 100%" tooltip-effect="dark myTooltips"
-      :show-header="showHeader" class="table-style" :data="tableData" :border="border" :row-key="(val) => rowKey(val)"
-      @cell-click="cellClick" @selection-change="handleSelectionChange">
+    <el-table ref="tableRef" style="width: 100%" tooltip-effect="dark myTooltips" :show-header="showHeader"
+      class="table-style" :data="tableData" :border="border" :row-key="(val) => rowKey(val)" @cell-click="cellClick"
+      @selection-change="handleSelectionChange">
       <template v-for="(item,index) in tableList">
         <el-table-column :fixed="suspension ? 'right' : false" :label="item.label" :width="item.colWidth" align="center"
           v-if="item.field == 'action'">
@@ -36,7 +36,7 @@
               </div>
             </div>
             <div v-else :key="index">
-              <el-popover placement="top" width="360" trigger="click" v-model="scope.row.visible">
+              <el-popover placement="top" trigger="click" v-model="scope.row.visible">
                 <div class="center_in">
                   <div v-for="disk in item.labelButton" :key="disk.key" class="btn_table">
                     <el-button :class="disk.modality" :type="disk.style" :icon="disk.icon" size="mini"
@@ -202,6 +202,11 @@
       tableHeight: {
         type: String,
         default: () => '',
+      },
+      // 操作按钮宽度
+      controlswidth: {
+        type: String,
+        default: () => '370px',
       }
     },
     data() {
@@ -210,10 +215,19 @@
         waybillIds: [],
         selectionList: [],
         iconFlag: false,
-        unpackWidth: '370px',
+        unpackWidth: '',
         visible: false,
       }
     },
+    watch: {
+      controlswidth: {
+        handler: function(newUser, oldUser) {
+          this.unpackWidth = newUser
+        },
+        immediate:true,
+        deep: true,
+      }
+    },
     methods: {
       // 文字匹配
       initDictvalue(value, list, type) {
@@ -371,7 +385,7 @@
       // 展开收起
       getUnpack() {
         if (this.iconFlag) {
-          this.unpackWidth = '370px'
+          this.unpackWidth = this.controlswidth
           this.iconFlag = false
         } else {
           this.unpackWidth = '70px'

+ 6 - 2
src/components/waybillForm.vue

@@ -70,11 +70,15 @@
             message: '请输入姓名',
             trigger: 'blur'
           },
-          phone: {
+          phone: [{
             required: true,
             message: '请输入电话',
             trigger: 'blur'
-          },
+          }, {
+            pattern: /^((0\d{2,3}-\d{7,8})|(1[34578]\d{9}))$/,
+            message: '请输入正确手机号码',
+            trigger: "blur"
+          }],
           region: {
             required: true,
             message: '请选择省市区',

+ 11 - 0
src/main.js

@@ -34,6 +34,17 @@ VueAMap.initAMapApiLoader({
 window._AMapSecurityConfig = {
   securityJsCode: "fb3133f64cddac06df9888ec1a4b3ad5",
 }
+
+Vue.directive('removeHidden', {
+  bind(el) {
+    // 查找所有匹配的元素
+    let ariaEl = el.querySelectorAll('.el-radio__original[aria-hidden]');
+    ariaEl.forEach((item) => {
+      // 移除 aria-hidden 属性
+      item.removeAttribute('aria-hidden');
+    });
+  }
+});
 new Vue({
   router,
   store,

+ 100 - 43
src/router/generator-routers.js

@@ -11,40 +11,41 @@ const companyRouter = {
   component: () => import('@/views/common/Base'),
   redirect: '/home',
   children: [{
-    path: '/home',
-    name: 'home',
-    meta: {
-      icon: 'icon-shouye',
-      title: '首页'
-    },
-    component: () => import('@/views/page/Home'),
-  },
-  // {
-  //   path: '/UserManagement',
-  //   name: 'UserManagement',
-  //   meta: {
-  //     icon: 'icon-yonghuguanli',
-  //     title: '用户管理'
-  //   },
-  //   component: () => import('@/views/system/UserManagement'),
-  // },
-  {
-    path: '/interiorUserManagement',
-    name: 'interiorUserManagement',
-    meta: {
-      icon: 'icon-yonghuguanli',
-      title: '用户管理'
-    },
-    component: () => import('@/views/system/interiorUserManagement'),
-  }, {
-    path: '/CompanyManagement',
-    name: 'CompanyManagement',
-    meta: {
-      icon: 'icon-gongsi',
-      title: '公司管理'
+      path: '/home',
+      name: 'home',
+      meta: {
+        icon: 'icon-shouye',
+        title: '首页'
+      },
+      component: () => import('@/views/page/Home'),
     },
-    component: () => import('@/views/system/CompanyManagement'),
-  }]
+    // {
+    //   path: '/UserManagement',
+    //   name: 'UserManagement',
+    //   meta: {
+    //     icon: 'icon-yonghuguanli',
+    //     title: '用户管理'
+    //   },
+    //   component: () => import('@/views/system/UserManagement'),
+    // },
+    {
+      path: '/interiorUserManagement',
+      name: 'interiorUserManagement',
+      meta: {
+        icon: 'icon-yonghuguanli',
+        title: '用户管理'
+      },
+      component: () => import('@/views/system/interiorUserManagement'),
+    }, {
+      path: '/CompanyManagement',
+      name: 'CompanyManagement',
+      meta: {
+        icon: 'icon-gongsi',
+        title: '公司管理'
+      },
+      component: () => import('@/views/system/CompanyManagement'),
+    }
+  ]
 }
 const clientRouter = {
   name: 'index',
@@ -61,6 +62,15 @@ const clientRouter = {
     component: () => import('@/views/system/MyWaybill'),
   }]
 }
+const userRouter = {
+  path: '/UserManagement',
+  name: 'UserManagement',
+  meta: {
+    icon: 'icon-yonghuguanli',
+    title: '用户管理'
+  },
+  component: () => import('@/views/system/UserManagement'),
+}
 // 根级菜单
 const rootRouter = {
   name: 'index',
@@ -76,15 +86,6 @@ const rootRouter = {
       },
       component: () => import('@/views/page/Home'),
     }, {
-      path: '/UserManagement',
-      name: 'UserManagement',
-      meta: {
-        icon: 'icon-yonghuguanli',
-        title: '用户管理'
-      },
-      component: () => import('@/views/system/UserManagement'),
-    },
-    {
       path: '/addressBook',
       name: 'addressBook',
       meta: {
@@ -132,7 +133,57 @@ const rootRouter = {
         icon: 'icon-yundan',
         title: '订单管理'
       },
-      component: () => import('@/views/system/OrderManagement'),
+      component: () => import('@/views/OrderManagement/index'),
+      redirect: '/OrderManagement/uncertainOrder',
+      children: [{
+        path: 'uncertainOrder',
+        name: 'uncertainOrder',
+        meta: {
+          icon: 'icon-yueduye-mulu',
+          title: '未确定订单'
+        },
+        component: () => import('@/views/OrderManagement/uncertainOrder.vue'),
+      }, {
+        path: 'reviewedOrder',
+        name: 'reviewedOrder',
+        meta: {
+          icon: 'icon-daishenhe',
+          title: '待审核订单'
+        },
+        component: () => import('@/views/OrderManagement/reviewedOrder.vue'),
+      }, {
+        path: 'pendingOrder',
+        name: 'pendingOrder',
+        meta: {
+          icon: 'icon-daipeisong',
+          title: '待配送订单'
+        },
+        component: () => import('@/views/OrderManagement/pendingOrder.vue'),
+      }, {
+        path: 'deliveryOrder',
+        name: 'deliveryOrder',
+        meta: {
+          icon: 'icon-peisongzhong',
+          title: '配送中订单'
+        },
+        component: () => import('@/views/OrderManagement/deliveryOrder.vue'),
+      }, {
+        path: 'completedOrder',
+        name: 'completedOrder',
+        meta: {
+          icon: 'icon-yiwanchengdingdan',
+          title: '已完成订单'
+        },
+        component: () => import('@/views/OrderManagement/completedOrder.vue'),
+      }, {
+        path: 'cancelledOrder',
+        name: 'cancelledOrder',
+        meta: {
+          icon: 'icon-yiquxiaodingdan',
+          title: '已取消订单'
+        },
+        component: () => import('@/views/OrderManagement/cancelledOrder.vue'),
+      }, ]
     }, {
       path: '/WaybillManagement',
       name: 'WaybillManagement',
@@ -164,6 +215,12 @@ export const generatorDynamicRouter = arrType => {
         rootRouter.children = deleteObjectById(rootRouter.children, 'CompanyManagement')
         routers.push(notFoundRouter)
         routers.push(rootRouter)
+        if (arrType.type == 1) {
+          rootRouter.children = deleteObjectById(rootRouter.children, 'UserManagement')
+          rootRouter.children.splice(1, 0, userRouter)
+        } else {
+          rootRouter.children = deleteObjectById(rootRouter.children, 'UserManagement')
+        }
       }
     } else {
       routers.push(notFoundRouter)

+ 1 - 0
src/store/modules/user.js

@@ -63,6 +63,7 @@ const user = {
               const arr = {
                 deptId: res.data.user.deptId,
                 userType: res.data.user.userType,
+                type: res.data.user.type,
               }
               const roles = [{
                 action: 'add',

+ 2 - 0
src/utils/request.js

@@ -68,7 +68,9 @@ request.interceptors.response.use((response) => {
     }
   }
   if (response.data.Code || response.data.code) {
+    // console.log(response,1)
     const res = response.data
+    // console.log(res,2)
     if (res.code == 6401) {
       return refreshToken().then(resil => {
         // 更新本地存储的 Token

+ 5 - 1
src/views/IceCreamFreezer/IceManagement.vue

@@ -88,7 +88,10 @@
         staffTitle: '添加',
         staffDialogVisible: false,
         formRuleList: formRulesil(),
-        ruleForm: {},
+        ruleForm: {
+          code: '',
+          status: null,
+        },
         ruleFormil: {
           codeList: [],
           status: '2',
@@ -189,6 +192,7 @@
             })
           })
         } else if (type == 'logs') {
+          this.formRuleList = formRules()
           this.staffTitle = '详情'
           this.staffDialogVisible = true
           this.formRuleList.forEach((item, index) => {

+ 142 - 0
src/views/OrderManagement/cancelledOrder.vue

@@ -0,0 +1,142 @@
+<template>
+  <!-- 已取消订单 -->
+  <div>
+    <div ref="grabble">
+      <actionBar :formList="formList" :ruleForm="searchRuleForm" @openModel="openModel"
+        @searchProtocol="searchProtocol"></actionBar>
+    </div>
+    <div class="card_content">
+      <!-- 表单 -->
+      <tables ref="refWaybill" controlswidth="180px" tableHeight="68vh" :suspension="true" :tableList="tableList"
+        :tableData="tableData" @buttonData="buttonData">
+      </tables>
+      <!-- 分页 -->
+      <div v-if="Total">
+        <pagination :total="Total" :currentPage="Pagination.PageIndex" @changeSize="changeSize"
+          @changeCurrent="changeCurrent">
+        </pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import actionBar from '@/components/actionBar'
+  import tables from '@/components/tables'
+  import pagination from '@/components/pagination'
+  import {
+    employee,
+  } from "./uncertain.js";
+  import {
+    WaybillStatus
+  } from '@/assets/js/blockSort'
+  export default {
+    name: 'OrderManagement',
+    components: {
+      actionBar,
+      tables,
+      pagination,
+    },
+    data() {
+      return {
+        formList: [{
+          type: 'input',
+          label: '订单编号',
+          field: 'orderNo',
+          placeholder: '请输入订单编号',
+        }, {
+          type: 'input',
+          label: '门店名称',
+          field: 'orderNo',
+          placeholder: '请输入门店名称',
+        }, {
+          type: 'input',
+          label: '配送员姓名',
+          field: 'orderNo',
+          placeholder: '请输入配送员姓名',
+        }, {
+          type: 'input',
+          label: '患者名称',
+          field: 'orderNo',
+          placeholder: '请输入患者名称',
+        }, {
+          type: 'input',
+          label: '患者手机号',
+          field: 'orderNo',
+          placeholder: '请输入患者手机号',
+        }, {
+          type: 'select',
+          label: '分配状态',
+          field: 'status',
+          placeholder: '请选择分配状态',
+          options: WaybillStatus(),
+        }],
+        searchRuleForm: {
+          orderNo: '',
+          status: null,
+          time: [],
+        },
+        searchValue: {},
+        Pagination: {
+          PageIndex: 1,
+          PageSize: 10,
+        },
+        Total: 0,
+        operationType: '',
+        tableData: [{
+          waybillNo: '252512',
+        }],
+        tableList: [],
+        btnData: [{
+          type: 'logs',
+          label: '详情',
+          icon: 'el-icon-tickets',
+          style: 'success',
+        }, {
+          type: 'send',
+          label: '处方',
+          icon: 'el-icon-tickets',
+          style: 'primary',
+        }]
+      }
+    },
+    mounted() {
+      let arr = employee()
+      arr.forEach(item => {
+        if (item.field == 'unpackBtn') {
+          item.labelButton = this.btnData
+        }
+      })
+      this.tableList = arr
+    },
+    methods: {
+      // 搜索
+      searchProtocol(value) {
+        this.Pagination.PageIndex = 1
+        this.searchValue = value
+        if (value.time) {
+          this.searchValue.orderStartTime = value.time[0]
+          this.searchValue.orderEndTime = value.time[1]
+        }
+        this.getList()
+      },
+      openModel(type) {
+        this.operationType = type
+      },
+      buttonData(row, type) {
+        this.operationType = type
+      },
+      changeSize(val) {
+        this.Pagination.PageSize = val
+        this.getList()
+      },
+      changeCurrent(val) {
+        this.Pagination.PageIndex = val
+        this.getList()
+      },
+    },
+  }
+</script>
+
+<style>
+</style>

+ 291 - 0
src/views/OrderManagement/completed.js

@@ -0,0 +1,291 @@
+import {
+  startStatus,
+  WaybillStatus
+} from '@/assets/js/blockSort'
+export const employee = () => {
+  return [{
+    field: 'selection',
+    label: '多选',
+    align: 'center',
+  }, {
+    field: 'waybillNo',
+    label: '订单编号',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'orderNo',
+    label: '门店名称',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'status',
+    label: '配送类型',
+    align: 'center',
+    options: WaybillStatus(),
+    colWidth: '180px',
+  }, {
+    field: 'multistage',
+    label: '复核人',
+    children: [{
+      field: 'reCheck.nickName',
+      label: '姓名',
+      align: 'center',
+      colWidth: '120px',
+    }, {
+      field: 'reCheck.phone',
+      label: '电话',
+      align: 'center',
+      colWidth: '140px',
+    }, ]
+  }, {
+    field: 'multistage',
+    label: '配送人',
+    children: [{
+      field: 'delivery.nickName',
+      label: '姓名',
+      align: 'center',
+      colWidth: '120px',
+    }, {
+      field: 'delivery.phone',
+      label: '电话',
+      align: 'center',
+      colWidth: '140px',
+    }, ]
+  }, {
+    field: 'multistage',
+    label: '收件人',
+    children: [{
+      field: 'consigneeAddressName',
+      label: '姓名',
+      align: 'center',
+      colWidth: '120px',
+    }, {
+      field: 'consigneeAddressPhone',
+      label: '电话',
+      align: 'center',
+      colWidth: '140px',
+    }, {
+      field: 'consigneeAddressDetails',
+      label: '地址',
+      align: 'center',
+      colWidth: '220px',
+    }, ]
+  }, {
+    field: 'deliveryTime',
+    label: '医保归属地',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'receiptTime',
+    label: '患者要求送达时间',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'tamperProofLabel',
+    label: '防拆标签码',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'coolerBox.name',
+    label: '保温箱',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'iceRaftCode',
+    label: '冰排编号',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'deliveryDuration',
+    label: '分配状态',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'receiptTime',
+    label: '分配时间',
+    align: 'center',
+    colWidth: '220px',
+  }, {
+    field: 'receiptTime',
+    label: '签收时间',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'deliveryDuration',
+    label: '配送耗时',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'assessStar',
+    label: '服务评价',
+    align: 'center',
+    colWidth: '220px',
+  }, {
+    field: 'remark',
+    label: '订单备注',
+    align: 'center',
+  }, {
+    field: 'unpackBtn',
+    label: '操作',
+    colWidth: '340px',
+    align: 'center',
+    labelButton: []
+  }]
+}
+export const formRules = () => {
+  return [{
+    field: 'tamperProofLabelImg',
+    label: '防拆标签图片',
+    placeholder: '请上传防拆标签图片',
+    type: 'upload',
+    colWidth: 24,
+    crosswise: true,
+    rules: [{
+      required: false,
+      message: '请上传防拆标签图片',
+      trigger: 'blur,change'
+    }]
+  }, {
+    field: 'tamperProofLabel',
+    label: '区块链防拆标签码',
+    placeholder: '请输入区块链防拆标签码',
+    type: 'input',
+    colWidth: 24,
+    rules: [{
+      required: false,
+      message: '请输入区块链防拆标签码',
+      trigger: 'blur'
+    }]
+  }, {
+    field: 'remark',
+    label: '备注',
+    placeholder: '备注',
+    type: 'textarea',
+    colWidth: 24,
+  }, ]
+}
+
+export const addressBook = () => {
+  return [{
+    field: 'name',
+    label: '姓名',
+    align: 'center',
+  }, {
+    field: 'phone',
+    label: '电话',
+    align: 'center',
+  }, {
+    field: 'address',
+    label: '详细地址',
+    align: 'center',
+  }, ]
+}
+export const sendList = () => {
+  return [{
+    field: 'coolerBoxId',
+    type: 'searchSelect',
+    label: '保温箱',
+    placeholder: '请选择保温箱',
+    colWidth: 24,
+    multiple: false,
+    rules: [{
+      required: true,
+      message: '请选择保温箱',
+      trigger: 'blur,change'
+    }],
+    options: [],
+  }, {
+    field: 'code',
+    label: '冰排编号',
+    placeholder: '请输入冰排编号',
+    type: 'scan',
+    colWidth: 24,
+    rules: [{
+      required: true,
+      message: '请输入冰排编号',
+      trigger: 'blur'
+    }]
+  }]
+}
+export const consignmentList = () => {
+  return [{
+    field: 'orderNo',
+    label: '订单号',
+    placeholder: '请输入订单号',
+    type: 'input',
+    colWidth: 24,
+    rules: [{
+      required: true,
+      message: '请输入订单号',
+      trigger: 'blur'
+    }]
+  }, {
+    field: 'reCheckId',
+    type: 'searchSelect',
+    label: '复核人',
+    placeholder: '请选择复核人',
+    colWidth: 24,
+    multiple: false,
+    rules: [{
+      required: true,
+      message: '请选择复核人',
+      trigger: 'blur,change'
+    }],
+    options: [],
+  }, {
+    field: 'deliveryId',
+    type: 'searchSelect',
+    label: '配送人',
+    placeholder: '请选择配送人',
+    colWidth: 24,
+    multiple: false,
+    rules: [{
+      required: true,
+      message: '请选择配送人',
+      trigger: 'blur,change'
+    }],
+    options: [],
+  }]
+}
+
+function validatePassword(rule, value, callback) {
+  // 假设正确的密码是 '123456'
+  if (value === 3 || value === 4) {
+    callback(); // 验证通过
+  } else {
+    callback('请选择签收状态'); // 验证不通过
+  }
+}
+
+export const signList = () => {
+  return [{
+    field: 'status',
+    label: '签收状态',
+    placeholder: '请选择签收状态',
+    type: 'radio',
+    colWidth: 24,
+    rules: [{
+      required: true,
+      message: '请选择签收状态',
+      trigger: 'blur,change'
+    }, {
+      validator: validatePassword,
+      trigger: 'blur'
+    }],
+    options: [{
+        label: '签收',
+        value: 3,
+      },
+      {
+        label: '拒收',
+        value: 4,
+      },
+    ]
+  }, {
+    field: 'rejectionReason',
+    label: '拒收原因',
+    placeholder: '请输入拒收原因',
+    type: 'textarea',
+    colWidth: 24,
+  }]
+}

+ 142 - 0
src/views/OrderManagement/completedOrder.vue

@@ -0,0 +1,142 @@
+<template>
+  <!-- 已完成订单 -->
+  <div>
+    <div ref="grabble">
+      <actionBar :formList="formList" :ruleForm="searchRuleForm" @openModel="openModel"
+        @searchProtocol="searchProtocol"></actionBar>
+    </div>
+    <div class="card_content">
+      <!-- 表单 -->
+      <tables ref="refWaybill" controlswidth="180px" tableHeight="68vh" :suspension="true" :tableList="tableList"
+        :tableData="tableData" @buttonData="buttonData">
+      </tables>
+      <!-- 分页 -->
+      <div v-if="Total">
+        <pagination :total="Total" :currentPage="Pagination.PageIndex" @changeSize="changeSize"
+          @changeCurrent="changeCurrent">
+        </pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import actionBar from '@/components/actionBar'
+  import tables from '@/components/tables'
+  import pagination from '@/components/pagination'
+  import {
+    employee,
+  } from "./completed.js";
+  import {
+    WaybillStatus
+  } from '@/assets/js/blockSort'
+  export default {
+    name: 'OrderManagement',
+    components: {
+      actionBar,
+      tables,
+      pagination,
+    },
+    data() {
+      return {
+        formList: [{
+          type: 'input',
+          label: '订单编号',
+          field: 'orderNo',
+          placeholder: '请输入订单编号',
+        }, {
+          type: 'input',
+          label: '门店名称',
+          field: 'orderNo',
+          placeholder: '请输入门店名称',
+        }, {
+          type: 'input',
+          label: '配送员姓名',
+          field: 'orderNo',
+          placeholder: '请输入配送员姓名',
+        }, {
+          type: 'input',
+          label: '患者名称',
+          field: 'orderNo',
+          placeholder: '请输入患者名称',
+        }, {
+          type: 'input',
+          label: '患者手机号',
+          field: 'orderNo',
+          placeholder: '请输入患者手机号',
+        }, {
+          type: 'select',
+          label: '分配状态',
+          field: 'status',
+          placeholder: '请选择分配状态',
+          options: WaybillStatus(),
+        }],
+        searchRuleForm: {
+          orderNo: '',
+          status: null,
+          time: [],
+        },
+        searchValue: {},
+        Pagination: {
+          PageIndex: 1,
+          PageSize: 10,
+        },
+        Total: 0,
+        operationType: '',
+        tableData: [{
+          waybillNo: '252512',
+        }],
+        tableList: [],
+        btnData: [{
+          type: 'logs',
+          label: '详情',
+          icon: 'el-icon-tickets',
+          style: 'success',
+        }, {
+          type: 'send',
+          label: '处方',
+          icon: 'el-icon-tickets',
+          style: 'primary',
+        }]
+      }
+    },
+    mounted() {
+      let arr = employee()
+      arr.forEach(item => {
+        if (item.field == 'unpackBtn') {
+          item.labelButton = this.btnData
+        }
+      })
+      this.tableList = arr
+    },
+    methods: {
+      // 搜索
+      searchProtocol(value) {
+        this.Pagination.PageIndex = 1
+        this.searchValue = value
+        if (value.time) {
+          this.searchValue.orderStartTime = value.time[0]
+          this.searchValue.orderEndTime = value.time[1]
+        }
+        this.getList()
+      },
+      openModel(type) {
+        this.operationType = type
+      },
+      buttonData(row, type) {
+        this.operationType = type
+      },
+      changeSize(val) {
+        this.Pagination.PageSize = val
+        this.getList()
+      },
+      changeCurrent(val) {
+        this.Pagination.PageIndex = val
+        this.getList()
+      },
+    },
+  }
+</script>
+
+<style>
+</style>

+ 170 - 0
src/views/OrderManagement/deliveryOrder.vue

@@ -0,0 +1,170 @@
+<template>
+  <!-- 配送中订单 -->
+  <div>
+    <div ref="grabble">
+      <actionBar :formList="formList" :ruleForm="searchRuleForm" @openModel="openModel"
+        @searchProtocol="searchProtocol"></actionBar>
+    </div>
+    <div class="card_content">
+      <!-- 表单 -->
+      <tables ref="refWaybill" controlswidth="280px" tableHeight="68vh" :suspension="true" :tableList="tableList"
+        :tableData="tableData" @buttonData="buttonData">
+      </tables>
+      <!-- 分页 -->
+      <div v-if="Total">
+        <pagination :total="Total" :currentPage="Pagination.PageIndex" @changeSize="changeSize"
+          @changeCurrent="changeCurrent">
+        </pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import {
+    getWaybill
+  } from '@/api/waybill'
+  import actionBar from '@/components/actionBar'
+  import tables from '@/components/tables'
+  import pagination from '@/components/pagination'
+  import {
+    employee,
+  } from "./ordered.js";
+  import {
+    WaybillStatus
+  } from '@/assets/js/blockSort'
+  export default {
+    name: 'OrderManagement',
+    components: {
+      actionBar,
+      tables,
+      pagination,
+    },
+    data() {
+      return {
+        formList: [{
+          type: 'input',
+          label: '订单编号',
+          field: 'orderNo',
+          placeholder: '请输入订单编号',
+        }, {
+          type: 'input',
+          label: '门店名称',
+          field: 'orderNo',
+          placeholder: '请输入门店名称',
+        }, {
+          type: 'input',
+          label: '配送员姓名',
+          field: 'orderNo',
+          placeholder: '请输入配送员姓名',
+        }, {
+          type: 'input',
+          label: '患者名称',
+          field: 'orderNo',
+          placeholder: '请输入患者名称',
+        }, {
+          type: 'input',
+          label: '患者手机号',
+          field: 'orderNo',
+          placeholder: '请输入患者手机号',
+        }, {
+          type: 'select',
+          label: '分配状态',
+          field: 'status',
+          placeholder: '请选择分配状态',
+          options: WaybillStatus(),
+        }],
+        searchRuleForm: {
+          orderNo: '',
+          status: null,
+          time: [],
+        },
+        searchValue: {},
+        Pagination: {
+          PageIndex: 1,
+          PageSize: 10,
+        },
+        Total: 0,
+        operationType: '',
+        tableData: [],
+        tableList: [],
+        btnData: [{
+          type: 'logs',
+          label: '详情',
+          icon: 'el-icon-tickets',
+          style: 'success',
+        }, {
+          type: 'send',
+          label: '处方',
+          icon: 'el-icon-tickets',
+          style: 'primary',
+        }, {
+          type: 'del',
+          label: '取消订单',
+          icon: 'el-icon-delete',
+          style: 'danger',
+        }]
+      }
+    },
+    mounted() {
+      let arr = employee()
+      arr.forEach(item => {
+        if (item.field == 'unpackBtn') {
+          item.labelButton = this.btnData
+        }
+      })
+      this.tableList = arr
+      this.getList()
+    },
+    methods: {
+      // 搜索
+      searchProtocol(value) {
+        this.Pagination.PageIndex = 1
+        this.searchValue = value
+        if (value.time) {
+          this.searchValue.orderStartTime = value.time[0]
+          this.searchValue.orderEndTime = value.time[1]
+        }
+        this.getList()
+      },
+      // 获取运单列表
+      getList() {
+        var params = {
+          page: this.Pagination.PageIndex,
+          pageSize: this.Pagination.PageSize,
+          ...this.searchValue
+        }
+        delete params.time
+        getWaybill(params).then(res => {
+          if (res.code == 200) {
+            this.tableData = res.data.list
+            this.tableData.forEach(item => {
+              if (item.iceRaftCode) {
+                item.iceRaftCode = item.iceRaftCode.toString()
+              }
+              item.visible = false
+            })
+            this.Total = res.data.count
+          }
+        })
+      },
+      openModel(type) {
+        this.operationType = type
+      },
+      buttonData(row, type) {
+        this.operationType = type
+      },
+      changeSize(val) {
+        this.Pagination.PageSize = val
+        this.getList()
+      },
+      changeCurrent(val) {
+        this.Pagination.PageIndex = val
+        this.getList()
+      },
+    },
+  }
+</script>
+
+<style>
+</style>

+ 9 - 0
src/views/OrderManagement/index.vue

@@ -0,0 +1,9 @@
+<template>
+  <router-view></router-view>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 276 - 0
src/views/OrderManagement/ordered.js

@@ -0,0 +1,276 @@
+import {
+  startStatus,
+  WaybillStatus
+} from '@/assets/js/blockSort'
+export const employee = () => {
+  return [{
+    field: 'selection',
+    label: '多选',
+    align: 'center',
+  }, {
+    field: 'waybillNo',
+    label: '订单编号',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'orderNo',
+    label: '门店名称',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'status',
+    label: '配送类型',
+    align: 'center',
+    options: WaybillStatus(),
+    colWidth: '180px',
+  }, {
+    field: 'multistage',
+    label: '复核人',
+    children: [{
+      field: 'reCheck.nickName',
+      label: '姓名',
+      align: 'center',
+      colWidth: '120px',
+    }, {
+      field: 'reCheck.phone',
+      label: '电话',
+      align: 'center',
+      colWidth: '140px',
+    }, ]
+  }, {
+    field: 'multistage',
+    label: '配送人',
+    children: [{
+      field: 'delivery.nickName',
+      label: '姓名',
+      align: 'center',
+      colWidth: '120px',
+    }, {
+      field: 'delivery.phone',
+      label: '电话',
+      align: 'center',
+      colWidth: '140px',
+    }, ]
+  }, {
+    field: 'multistage',
+    label: '收件人',
+    children: [{
+      field: 'consigneeAddressName',
+      label: '姓名',
+      align: 'center',
+      colWidth: '120px',
+    }, {
+      field: 'consigneeAddressPhone',
+      label: '电话',
+      align: 'center',
+      colWidth: '140px',
+    }, {
+      field: 'consigneeAddressDetails',
+      label: '地址',
+      align: 'center',
+      colWidth: '220px',
+    }, ]
+  }, {
+    field: 'deliveryTime',
+    label: '医保归属地',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'receiptTime',
+    label: '患者要求送达时间',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'tamperProofLabel',
+    label: '防拆标签码',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'coolerBox.name',
+    label: '保温箱',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'iceRaftCode',
+    label: '冰排编号',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'deliveryDuration',
+    label: '分配状态',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'assessStar',
+    label: '分配时间',
+    align: 'center',
+    colWidth: '220px',
+  }, {
+    field: 'remark',
+    label: '订单备注',
+    align: 'center',
+  }, {
+    field: 'unpackBtn',
+    label: '操作',
+    colWidth: '340px',
+    align: 'center',
+    labelButton: []
+  }]
+}
+export const formRules = () => {
+  return [{
+    field: 'tamperProofLabelImg',
+    label: '防拆标签图片',
+    placeholder: '请上传防拆标签图片',
+    type: 'upload',
+    colWidth: 24,
+    crosswise: true,
+    rules: [{
+      required: false,
+      message: '请上传防拆标签图片',
+      trigger: 'blur,change'
+    }]
+  }, {
+    field: 'tamperProofLabel',
+    label: '区块链防拆标签码',
+    placeholder: '请输入区块链防拆标签码',
+    type: 'input',
+    colWidth: 24,
+    rules: [{
+      required: false,
+      message: '请输入区块链防拆标签码',
+      trigger: 'blur'
+    }]
+  }, {
+    field: 'remark',
+    label: '备注',
+    placeholder: '备注',
+    type: 'textarea',
+    colWidth: 24,
+  }, ]
+}
+
+export const addressBook = () => {
+  return [{
+    field: 'name',
+    label: '姓名',
+    align: 'center',
+  }, {
+    field: 'phone',
+    label: '电话',
+    align: 'center',
+  }, {
+    field: 'address',
+    label: '详细地址',
+    align: 'center',
+  }, ]
+}
+export const sendList = () => {
+  return [{
+    field: 'coolerBoxId',
+    type: 'searchSelect',
+    label: '保温箱',
+    placeholder: '请选择保温箱',
+    colWidth: 24,
+    multiple: false,
+    rules: [{
+      required: true,
+      message: '请选择保温箱',
+      trigger: 'blur,change'
+    }],
+    options: [],
+  }, {
+    field: 'code',
+    label: '冰排编号',
+    placeholder: '请输入冰排编号',
+    type: 'scan',
+    colWidth: 24,
+    rules: [{
+      required: true,
+      message: '请输入冰排编号',
+      trigger: 'blur'
+    }]
+  }]
+}
+export const consignmentList = () => {
+  return [{
+    field: 'orderNo',
+    label: '订单号',
+    placeholder: '请输入订单号',
+    type: 'input',
+    colWidth: 24,
+    rules: [{
+      required: true,
+      message: '请输入订单号',
+      trigger: 'blur'
+    }]
+  }, {
+    field: 'reCheckId',
+    type: 'searchSelect',
+    label: '复核人',
+    placeholder: '请选择复核人',
+    colWidth: 24,
+    multiple: false,
+    rules: [{
+      required: true,
+      message: '请选择复核人',
+      trigger: 'blur,change'
+    }],
+    options: [],
+  }, {
+    field: 'deliveryId',
+    type: 'searchSelect',
+    label: '配送人',
+    placeholder: '请选择配送人',
+    colWidth: 24,
+    multiple: false,
+    rules: [{
+      required: true,
+      message: '请选择配送人',
+      trigger: 'blur,change'
+    }],
+    options: [],
+  }]
+}
+
+function validatePassword(rule, value, callback) {
+  // 假设正确的密码是 '123456'
+  if (value === 3 || value === 4) {
+    callback(); // 验证通过
+  } else {
+    callback('请选择签收状态'); // 验证不通过
+  }
+}
+
+export const signList = () => {
+  return [{
+    field: 'status',
+    label: '签收状态',
+    placeholder: '请选择签收状态',
+    type: 'radio',
+    colWidth: 24,
+    rules: [{
+      required: true,
+      message: '请选择签收状态',
+      trigger: 'blur,change'
+    }, {
+      validator: validatePassword,
+      trigger: 'blur'
+    }],
+    options: [{
+        label: '签收',
+        value: 3,
+      },
+      {
+        label: '拒收',
+        value: 4,
+      },
+    ]
+  }, {
+    field: 'rejectionReason',
+    label: '拒收原因',
+    placeholder: '请输入拒收原因',
+    type: 'textarea',
+    colWidth: 24,
+  }]
+}

+ 356 - 0
src/views/OrderManagement/pendingOrder.vue

@@ -0,0 +1,356 @@
+<template>
+  <!-- 待配送订单 -->
+  <div>
+    <div ref="grabble">
+      <actionBar :operateList="operateList" :formList="formList" :ruleForm="searchRuleForm" @openModel="openModel"
+        @searchProtocol="searchProtocol"></actionBar>
+    </div>
+    <div class="card_content">
+      <!-- 表单 -->
+      <tables ref="refWaybill" controlswidth="340px" tableHeight="68vh" :suspension="true" :tableList="tableList"
+        :tableData="tableData" @buttonData="buttonData">
+      </tables>
+      <!-- 分页 -->
+      <div v-if="Total">
+        <pagination :total="Total" :currentPage="Pagination.PageIndex" @changeSize="changeSize"
+          @changeCurrent="changeCurrent">
+        </pagination>
+      </div>
+    </div>
+    <el-dialog title="派单" :visible.sync="sendDialogVisible" width="500px" :close-on-click-modal="false"
+      @close="closeDialog">
+      <forms ref="sendRules" :formNewList="sendRuleList" :ruleForm="sendRuleForm" :iceTracing="true" :iceBank="true"
+        labelWidth="80px" @handleScroll="handleScroll" @remoteMethod="remoteMethod" @changeOption="changeOption">
+      </forms>
+      <span slot="footer" class="dialog-footer">
+        <el-button plain @click="sendDialogVisible = false">取 消</el-button>
+        <el-button type="primary" :loading="sendConfirmLoading" @click.stop="sendHandleAdd">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import {
+    getCoolerBox,
+    getRaftCoolerBox
+  } from '@/api/incubator.js'
+  import actionBar from '@/components/actionBar'
+  import tables from '@/components/tables'
+  import pagination from '@/components/pagination'
+  import forms from '@/components/forms'
+  import {
+    employee,
+    sendList
+  } from "./uncertain.js";
+  import {
+    getUser
+  } from '@/api/user'
+  import {
+    WaybillStatus
+  } from '@/assets/js/blockSort'
+  export default {
+    name: 'OrderManagement',
+    components: {
+      actionBar,
+      tables,
+      pagination,
+      forms
+    },
+    data() {
+      return {
+        operateList: [{
+          type: 'sends',
+          title: '批量派单',
+          colour: 'success'
+        }],
+        formList: [{
+          type: 'input',
+          label: '订单编号',
+          field: 'orderNo',
+          placeholder: '请输入订单编号',
+        }, {
+          type: 'input',
+          label: '门店名称',
+          field: 'orderNo',
+          placeholder: '请输入门店名称',
+        }, {
+          type: 'input',
+          label: '配送员姓名',
+          field: 'orderNo',
+          placeholder: '请输入配送员姓名',
+        }, {
+          type: 'input',
+          label: '患者名称',
+          field: 'orderNo',
+          placeholder: '请输入患者名称',
+        }, {
+          type: 'input',
+          label: '患者手机号',
+          field: 'orderNo',
+          placeholder: '请输入患者手机号',
+        }, {
+          type: 'select',
+          label: '分配状态',
+          field: 'status',
+          placeholder: '请选择分配状态',
+          options: WaybillStatus(),
+        }],
+        searchRuleForm: {
+          orderNo: '',
+          status: null,
+          time: [],
+        },
+        searchValue: {},
+        Pagination: {
+          PageIndex: 1,
+          PageSize: 10,
+        },
+        Total: 0,
+        operationType: '',
+        tableData: [],
+        tableList: [],
+        btnData: [{
+          type: 'logs',
+          label: '详情',
+          icon: 'el-icon-tickets',
+          style: 'success',
+        }, {
+          type: 'send',
+          label: '处方',
+          icon: 'el-icon-tickets',
+          style: 'primary',
+        }, {
+          type: 'sign',
+          label: '分配',
+          icon: 'el-icon-folder-checked',
+          style: 'warning',
+        }, {
+          type: 'del',
+          label: '取消订单',
+          icon: 'el-icon-delete',
+          style: 'danger',
+        }],
+        sendDialogVisible: false,
+        sendRuleList: sendList(),
+        sendRuleForm: {
+          code: [],
+          coolerBoxId: null,
+        },
+        sendConfirmLoading: false,
+        page: 1,
+        staffName: '',
+        limitNo: true,
+        sendOrdersId: 2,
+        waybillIdList: [],
+      }
+    },
+    mounted() {
+      let arr = employee()
+      arr.forEach(item => {
+        if (item.field == 'unpackBtn') {
+          item.labelButton = this.btnData
+        }
+      })
+      this.tableList = arr
+    },
+    methods: {
+      // 搜索
+      searchProtocol(value) {
+        this.Pagination.PageIndex = 1
+        this.searchValue = value
+        if (value.time) {
+          this.searchValue.orderStartTime = value.time[0]
+          this.searchValue.orderEndTime = value.time[1]
+        }
+        this.getList()
+      },
+      async openModel(type) {
+        console.log(type, 87)
+        this.operationType = type
+        if (type == 'sends') {
+          this.sendDialogVisible = true
+          var arr = await this.getUserList()
+          this.sendRuleList.forEach(item => {
+            if (item.field == 'reCheckId') {
+              item.options = arr
+            }
+          })
+          this.getIncubator(2)
+        }
+      },
+      buttonData(row, type) {
+        this.operationType = type
+      },
+      // 触底事件
+      handleScroll() {
+        if (this.limitNo) {
+          this.getIncubator()
+        }
+      },
+      // 搜索
+      remoteMethod(value, type) {
+        console.log(value, type,236)
+        this.resetSelect()
+        this.staffName = value
+        // this.getIncubator(this.sendOrdersId)
+      },
+      // 重置选择员工
+      resetSelect() {
+        this.sendRuleList.forEach(item => {
+          if (item.field == 'reCheckId') {
+            item.options = []
+          }
+        })
+        this.page = 1
+        this.limitNo = true
+        this.staffName = ''
+      },
+      // 运单派单
+      sendHandleAdd() {
+        let flag = this.$refs['sendRules'].validateForm();
+        if (flag) {
+          this.sendConfirmLoading = true
+          let arrID = []
+          if (this.operationType == 'send') {
+            arrID.push(this.orderId)
+          } else if (this.operationType == 'sends') {
+            arrID = this.waybillIdList
+          }
+          const param = {
+            waybillIds: arrID,
+            coolerBoxId: Number(this.sendRuleForm.coolerBoxId),
+            iceRaftCode: this.sendRuleForm.code,
+          }
+          waybillDelivery(param).then(res => {
+            if (res.code == 200) {
+              this.$message({
+                message: res.msg,
+                type: 'success'
+              });
+              this.getList()
+              this.sendDialogVisible = false
+            } else if (res.code == 2000) {
+              let arrTitle = res.data
+              let title = ' ,请将冰排' + arrTitle.toString() + '重新入库'
+              this.$message({
+                showClose: true,
+                message: res.msg + title,
+                duration: 0,
+                type: 'warning'
+              });
+              this.sendDialogVisible = false
+            }
+            this.sendConfirmLoading = false
+          }).catch(() => {
+            this.sendConfirmLoading = false
+          })
+        } else {
+          this.$message.error('表单信息不完整,请继续填写完整');
+        }
+      },
+      // 获取保温箱列表
+      getIncubator(type) {
+        let arrList = []
+        let params = {
+          page: this.page,
+          pageSize: 10,
+          status: '2',
+          name: this.staffName,
+        }
+        getCoolerBox(params).then(res => {
+          if (res.code == 200) {
+            let arr = res.data.list
+            let arrList = []
+            arr.forEach(item1 => {
+              var arrData = {
+                label: null,
+                value: null,
+              }
+              arrData.label = item1.name
+              arrData.value = item1.id
+              arrList.push(arrData)
+            })
+            if (this.limitNo == true) {
+              this.sendRuleList.forEach(item => {
+                if (item.field == 'coolerBoxId') {
+                  item.options = item.options.concat(arrList);
+                  let some = [];
+                  item.options.forEach(el => {
+                    if (!some.some(e => e.value == el.value)) {
+                      some.push(el)
+                    }
+                  })
+                  item.options = some
+                }
+              })
+            }
+            if (arrList.length >= 10) {
+              this.page = ++this.page;
+            } else {
+              // 已经没数据了 不需要增加数据
+              this.limitNo = false;
+            }
+          }
+        })
+      },
+      // 获取不同用户列表
+      getUserList() {
+        return new Promise((resolve, reject) => {
+          var params = {
+            page: 1,
+            pageSize: 999,
+            // type: 3,
+            name: this.delivererName,
+          }
+          getUser(params).then(res => {
+            if (res.code == 200) {
+              let arr = res.data.list
+              let arrList = []
+              arr.forEach(item1 => {
+                var arrData = {
+                  label: null,
+                  value: null,
+                }
+                arrData.label = item1.nickName
+                arrData.value = item1.id
+                arrList.push(arrData)
+              })
+              resolve(arrList)
+            }
+          }).catch((err) => {
+            reject(err)
+          })
+        })
+      },
+      // 获取保温箱搜索选择框数据
+      changeOption(id) {
+        getRaftCoolerBox({
+          coolerBoxId: id
+        }).then(res => {
+          if (res.code == 200) {
+            if (res.data) {
+              this.sendRuleForm.code = res.data
+              this.$refs.sendRules.inputsList = res.data
+            }
+          }
+        })
+      },
+      changeSize(val) {
+        this.Pagination.PageSize = val
+        this.getList()
+      },
+      changeCurrent(val) {
+        this.Pagination.PageIndex = val
+        this.getList()
+      },
+      // 清空表单
+      closeDialog() {
+        this.$refs.sendRules.resetCheck();
+      },
+    },
+  }
+</script>
+
+<style lang="scss">
+</style>

+ 150 - 0
src/views/OrderManagement/reviewedOrder.vue

@@ -0,0 +1,150 @@
+<template>
+  <!-- 待审核订单 -->
+  <div>
+    <div ref="grabble">
+      <actionBar :formList="formList" :ruleForm="searchRuleForm" @openModel="openModel"
+        @searchProtocol="searchProtocol"></actionBar>
+    </div>
+    <div class="card_content">
+      <!-- 表单 -->
+      <tables ref="refWaybill" controlswidth="340px" tableHeight="68vh" :suspension="true" :tableList="tableList"
+        :tableData="tableData" @buttonData="buttonData">
+      </tables>
+      <!-- 分页 -->
+      <div v-if="Total">
+        <pagination :total="Total" :currentPage="Pagination.PageIndex" @changeSize="changeSize"
+          @changeCurrent="changeCurrent">
+        </pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import actionBar from '@/components/actionBar'
+  import tables from '@/components/tables'
+  import pagination from '@/components/pagination'
+  import {
+    employee,
+  } from "./uncertain.js";
+  import {
+    WaybillStatus
+  } from '@/assets/js/blockSort'
+  export default {
+    name: 'OrderManagement',
+    components: {
+      actionBar,
+      tables,
+      pagination,
+    },
+    data() {
+      return {
+        formList: [{
+          type: 'input',
+          label: '订单编号',
+          field: 'orderNo',
+          placeholder: '请输入订单编号',
+        }, {
+          type: 'input',
+          label: '门店名称',
+          field: 'orderNo',
+          placeholder: '请输入门店名称',
+        }, {
+          type: 'input',
+          label: '配送员姓名',
+          field: 'orderNo',
+          placeholder: '请输入配送员姓名',
+        }, {
+          type: 'input',
+          label: '患者名称',
+          field: 'orderNo',
+          placeholder: '请输入患者名称',
+        }, {
+          type: 'input',
+          label: '患者手机号',
+          field: 'orderNo',
+          placeholder: '请输入患者手机号',
+        }, {
+          type: 'select',
+          label: '分配状态',
+          field: 'status',
+          placeholder: '请选择分配状态',
+          options: WaybillStatus(),
+        }],
+        searchRuleForm: {
+          orderNo: '',
+          status: null,
+          time: [],
+        },
+        searchValue: {},
+        Pagination: {
+          PageIndex: 1,
+          PageSize: 10,
+        },
+        Total: 0,
+        operationType: '',
+        tableData: [],
+        tableList: [],
+        btnData: [{
+          type: 'logs',
+          label: '详情',
+          icon: 'el-icon-tickets',
+          style: 'success',
+        }, {
+          type: 'send',
+          label: '处方',
+          icon: 'el-icon-tickets',
+          style: 'primary',
+        }, {
+          type: 'sign',
+          label: '分配',
+          icon: 'el-icon-folder-checked',
+          style: 'warning',
+        }, {
+          type: 'del',
+          label: '取消订单',
+          icon: 'el-icon-delete',
+          style: 'danger',
+        }]
+      }
+    },
+    mounted() {
+      let arr = employee()
+      arr.forEach(item => {
+        if (item.field == 'unpackBtn') {
+          item.labelButton = this.btnData
+        }
+      })
+      this.tableList = arr
+    },
+    methods: {
+      // 搜索
+      searchProtocol(value) {
+        this.Pagination.PageIndex = 1
+        this.searchValue = value
+        if (value.time) {
+          this.searchValue.orderStartTime = value.time[0]
+          this.searchValue.orderEndTime = value.time[1]
+        }
+        this.getList()
+      },
+      openModel(type) {
+        this.operationType = type
+      },
+      buttonData(row, type) {
+        this.operationType = type
+      },
+      changeSize(val) {
+        this.Pagination.PageSize = val
+        this.getList()
+      },
+      changeCurrent(val) {
+        this.Pagination.PageIndex = val
+        this.getList()
+      },
+    },
+  }
+</script>
+
+<style>
+</style>

+ 255 - 0
src/views/OrderManagement/uncertain.js

@@ -0,0 +1,255 @@
+import {
+  startStatus,
+  WaybillStatus
+} from '@/assets/js/blockSort'
+export const employee = () => {
+  return [{
+    field: 'selection',
+    label: '多选',
+    align: 'center',
+  }, {
+    field: 'waybillNo',
+    label: '订单编号',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'orderNo',
+    label: '门店名称',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'status',
+    label: '配送类型',
+    align: 'center',
+    options: WaybillStatus(),
+    colWidth: '180px',
+  }, {
+    field: 'tamperProofLabel',
+    label: '患者要求送达时间',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'consigneeAddressName',
+    label: '患者名称',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'consigneeAddressPhone',
+    label: '患者手机号',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'consigneeAddressDetails',
+    label: '收货地址',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'deliveryTime',
+    label: '医保归属地',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'deliveryDuration',
+    label: '分配状态',
+    align: 'center',
+    colWidth: '180px',
+  }, {
+    field: 'receiptTime',
+    label: '分配时间',
+    align: 'center',
+    colWidth: '220px',
+  }, {
+    field: 'remark',
+    label: '订单备注',
+    align: 'center',
+  }, {
+    field: 'unpackBtn',
+    label: '操作',
+    colWidth: '340px',
+    align: 'center',
+    labelButton: []
+  }]
+}
+export const formRules = () => {
+  return [{
+    field: 'tamperProofLabelImg',
+    label: '防拆标签图片',
+    placeholder: '请上传防拆标签图片',
+    type: 'upload',
+    colWidth: 24,
+    crosswise: true,
+    rules: [{
+      required: false,
+      message: '请上传防拆标签图片',
+      trigger: 'blur,change'
+    }]
+  }, {
+    field: 'tamperProofLabel',
+    label: '区块链防拆标签码',
+    placeholder: '请输入区块链防拆标签码',
+    type: 'input',
+    colWidth: 24,
+    rules: [{
+      required: false,
+      message: '请输入区块链防拆标签码',
+      trigger: 'blur'
+    }]
+  }, {
+    field: 'remark',
+    label: '备注',
+    placeholder: '备注',
+    type: 'textarea',
+    colWidth: 24,
+  }, ]
+}
+
+export const addressBook = () => {
+  return [{
+    field: 'name',
+    label: '姓名',
+    align: 'center',
+  }, {
+    field: 'phone',
+    label: '电话',
+    align: 'center',
+  }, {
+    field: 'address',
+    label: '详细地址',
+    align: 'center',
+  }, ]
+}
+export const sendList = () => {
+  return [{
+    field: 'reCheckId',
+    type: 'searchSelect',
+    label: '复核人',
+    placeholder: '请选择复核人',
+    colWidth: 24,
+    multiple: false,
+    rules: [{
+      required: true,
+      message: '请选择复核人',
+      trigger: 'blur,change'
+    }],
+    options: [],
+  }, {
+    field: 'deliveryId',
+    type: 'searchSelect',
+    label: '配送员',
+    placeholder: '请选择配送员',
+    colWidth: 24,
+    multiple: false,
+    rules: [{
+      required: true,
+      message: '请选择配送员',
+      trigger: 'blur,change'
+    }],
+    options: [],
+  }, {
+    field: 'coolerBoxId',
+    type: 'searchSelect',
+    label: '保温箱',
+    placeholder: '请选择保温箱',
+    colWidth: 24,
+    multiple: false,
+    rules: [{
+      required: true,
+      message: '请选择保温箱',
+      trigger: 'blur,change'
+    }],
+    options: [],
+  }, {
+    field: 'code',
+    label: '冰排编号',
+    placeholder: '请输入冰排编号',
+    type: 'scan',
+    colWidth: 24,
+    rules: [{
+      required: true,
+      message: '请输入冰排编号',
+      trigger: 'blur'
+    }]
+  }]
+}
+export const consignmentList = () => {
+  return [{
+    field: 'orderNo',
+    label: '订单号',
+    placeholder: '请输入订单号',
+    type: 'input',
+    colWidth: 24,
+    rules: [{
+      required: true,
+      message: '请输入订单号',
+      trigger: 'blur'
+    }]
+  }, {
+    field: 'reCheckId',
+    type: 'searchSelect',
+    label: '复核人',
+    placeholder: '请选择复核人',
+    colWidth: 24,
+    multiple: false,
+    rules: [{
+      required: true,
+      message: '请选择复核人',
+      trigger: 'blur,change'
+    }],
+    options: [],
+  }, {
+    field: 'deliveryId',
+    type: 'searchSelect',
+    label: '配送人',
+    placeholder: '请选择配送人',
+    colWidth: 24,
+    multiple: false,
+    rules: [{
+      required: true,
+      message: '请选择配送人',
+      trigger: 'blur,change'
+    }],
+    options: [],
+  }]
+}
+
+function validatePassword(rule, value, callback) {
+  // 假设正确的密码是 '123456'
+  if (value === 3 || value === 4) {
+    callback(); // 验证通过
+  } else {
+    callback('请选择签收状态'); // 验证不通过
+  }
+}
+
+export const signList = () => {
+  return [{
+    field: 'status',
+    label: '签收状态',
+    placeholder: '请选择签收状态',
+    type: 'radio',
+    colWidth: 24,
+    rules: [{
+      required: true,
+      message: '请选择签收状态',
+      trigger: 'blur,change'
+    }, {
+      validator: validatePassword,
+      trigger: 'blur'
+    }],
+    options: [{
+        label: '签收',
+        value: 3,
+      },
+      {
+        label: '拒收',
+        value: 4,
+      },
+    ]
+  }, {
+    field: 'rejectionReason',
+    label: '拒收原因',
+    placeholder: '请输入拒收原因',
+    type: 'textarea',
+    colWidth: 24,
+  }]
+}

+ 175 - 0
src/views/OrderManagement/uncertainOrder.vue

@@ -0,0 +1,175 @@
+<template>
+  <!-- 未确定订单 -->
+  <div>
+    <div ref="grabble">
+      <actionBar :formList="formList" :ruleForm="searchRuleForm" @openModel="openModel"
+        @searchProtocol="searchProtocol"></actionBar>
+    </div>
+    <div class="card_content">
+      <!-- 表单 -->
+      <tables ref="refWaybill" controlswidth="340px" tableHeight="68vh" :suspension="true" :tableList="tableList"
+        :tableData="tableData" @buttonData="buttonData">
+      </tables>
+      <!-- 分页 -->
+      <div v-if="Total">
+        <pagination :total="Total" :currentPage="Pagination.PageIndex" @changeSize="changeSize"
+          @changeCurrent="changeCurrent">
+        </pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import {
+    getWaybill
+  } from '@/api/waybill'
+  import actionBar from '@/components/actionBar'
+  import tables from '@/components/tables'
+  import pagination from '@/components/pagination'
+  import {
+    employee,
+  } from "./uncertain.js";
+  import {
+    WaybillStatus
+  } from '@/assets/js/blockSort'
+  export default {
+    name: 'OrderManagement',
+    components: {
+      actionBar,
+      tables,
+      pagination,
+    },
+    data() {
+      return {
+        formList: [{
+          type: 'input',
+          label: '订单编号',
+          field: 'orderNo',
+          placeholder: '请输入订单编号',
+        }, {
+          type: 'input',
+          label: '门店名称',
+          field: 'orderNo',
+          placeholder: '请输入门店名称',
+        }, {
+          type: 'input',
+          label: '配送员姓名',
+          field: 'orderNo',
+          placeholder: '请输入配送员姓名',
+        }, {
+          type: 'input',
+          label: '患者名称',
+          field: 'orderNo',
+          placeholder: '请输入患者名称',
+        }, {
+          type: 'input',
+          label: '患者手机号',
+          field: 'orderNo',
+          placeholder: '请输入患者手机号',
+        }, {
+          type: 'select',
+          label: '分配状态',
+          field: 'status',
+          placeholder: '请选择分配状态',
+          options: WaybillStatus(),
+        }],
+        searchRuleForm: {
+          orderNo: '',
+          status: null,
+          time: [],
+        },
+        searchValue: {},
+        Pagination: {
+          PageIndex: 1,
+          PageSize: 10,
+        },
+        Total: 0,
+        operationType: '',
+        tableData: [],
+        tableList: [],
+        btnData: [{
+          type: 'logs',
+          label: '详情',
+          icon: 'el-icon-tickets',
+          style: 'success',
+        }, {
+          type: 'send',
+          label: '处方',
+          icon: 'el-icon-tickets',
+          style: 'primary',
+        }, {
+          type: 'sign',
+          label: '分配',
+          icon: 'el-icon-folder-checked',
+          style: 'warning',
+        }, {
+          type: 'del',
+          label: '取消订单',
+          icon: 'el-icon-delete',
+          style: 'danger',
+        }]
+      }
+    },
+    mounted() {
+      let arr = employee()
+      arr.forEach(item => {
+        if (item.field == 'unpackBtn') {
+          item.labelButton = this.btnData
+        }
+      })
+      this.tableList = arr
+      this.getList()
+    },
+    methods: {
+      // 搜索
+      searchProtocol(value) {
+        this.Pagination.PageIndex = 1
+        this.searchValue = value
+        if (value.time) {
+          this.searchValue.orderStartTime = value.time[0]
+          this.searchValue.orderEndTime = value.time[1]
+        }
+        this.getList()
+      },
+      // 获取运单列表
+      getList() {
+        var params = {
+          page: this.Pagination.PageIndex,
+          pageSize: this.Pagination.PageSize,
+          ...this.searchValue
+        }
+        delete params.time
+        getWaybill(params).then(res => {
+          if (res.code == 200) {
+            this.tableData = res.data.list
+            this.tableData.forEach(item => {
+              if (item.iceRaftCode) {
+                item.iceRaftCode = item.iceRaftCode.toString()
+              }
+              item.visible = false
+            })
+            this.Total = res.data.count
+          }
+        })
+      },
+      openModel(type) {
+        this.operationType = type
+      },
+      buttonData(row, type) {
+        this.operationType = type
+      },
+      changeSize(val) {
+        this.Pagination.PageSize = val
+        this.getList()
+      },
+      changeCurrent(val) {
+        this.Pagination.PageIndex = val
+        this.getList()
+      },
+    },
+  }
+</script>
+
+<style lang="scss">
+</style>

+ 29 - 7
src/views/common/Base.vue

@@ -11,13 +11,29 @@
         <el-aside :width="sideWidth+'px'">
           <div class="card_aside">
             <div class="card_menu">
-              <el-menu :collapse="iconFlag" :default-active="activePath" class="el-menu-vertical-demo" router
+              <el-menu :collapse="iconFlag" :default-active="$route.path" class="el-menu-vertical-demo" router
                 :collapse-transition="false" @open="handleOpen" @close="handleClose">
-                <template v-for="(item,index) in menus">
-                  <el-menu-item class="menu_item" :index="item.path" :key="index" @click="saveNavState(item.path)">
-                    <i :class="item.meta.icon" class="menu_icon iconfont"></i>
-                    <span slot="title">{{item.meta.title}}</span>
-                  </el-menu-item>
+                <template v-for="menu in menus">
+                  <template v-if="menu.children && menu.children.length > 0">
+                    <el-submenu :index="menu.path" :key="menu.name">
+                      <template slot="title">
+                        <i :class="menu.meta.icon" class="menu_icon iconfont"></i>
+                        <span>{{ menu.meta.title }}</span>
+                      </template>
+                      <template v-for="subMenu in menu.children">
+                        <el-menu-item :index="subMenu.path" :key="subMenu.name">
+                          <i :class="subMenu.meta.icon" class="menu_icon iconfont"></i>
+                          <span slot="title">{{ subMenu.meta.title }}</span>
+                        </el-menu-item>
+                      </template>
+                    </el-submenu>
+                  </template>
+                  <template v-else>
+                    <el-menu-item :index="menu.path" :key="menu.name">
+                      <i :class="menu.meta.icon" class="menu_icon iconfont"></i>
+                      <span slot="title">{{menu.meta.title}}</span>
+                    </el-menu-item>
+                  </template>
                 </template>
               </el-menu>
             </div>
@@ -29,7 +45,7 @@
         </el-aside>
         <el-main>
           <div class="main">
-            <router-view></router-view>
+            <router-view :key="$route.fullPath"></router-view>
           </div>
         </el-main>
       </el-container>
@@ -91,10 +107,16 @@
       },
       handleOpen(key, keyPath) {
         // console.log(key, keyPath);
+        this.$router.push(key)
       },
       handleClose(key, keyPath) {
         // console.log(key, keyPath);
       },
+      defaultActive() {
+        this.$nextTick(() => {
+          this.$refs.menu.updateActiveName()
+        })
+      },
       // 保存链接的激活状态
       saveNavState(activePath) {
         localStorage.setItem("activePath", activePath);

+ 2 - 0
src/views/system/IncubatorManagement.vue

@@ -407,6 +407,8 @@
                 this.importDialogVisible = false
               }
               this.incubatorLoading = false
+            }).catch(() => {
+              this.incubatorLoading = false
             })
           } else {
             this.$message.warning('请选择需要导入的保温箱');

+ 5 - 1
src/views/system/MyWaybill.vue

@@ -518,13 +518,15 @@
           waybillImport(formData).then(res => {
             if (res.code == 200) {
               this.bulkImportVisible = false
-              this.importFlag = false
               this.getList()
               this.$message({
                 message: '恭喜你,导入成功',
                 type: 'success'
               });
             }
+            this.importFlag = false
+          }).catch(() => {
+            this.importFlag = false
           })
         } else {
           this.$message({
@@ -540,6 +542,8 @@
           let filename = '运单模板'
           this.blobDownload(response, filename)
           this.downloadFlag = false
+        }).catch(() => {
+          this.downloadFlag = false
         })
       },
       // 上传文件

+ 1 - 1
src/views/system/UserManagement.vue

@@ -88,7 +88,7 @@
           phone: '',
           newPassword: '',
           password: '',
-          type: '',
+          type: null,
         },
         confirmLoading: false,
         selectingData: {},

+ 7 - 4
src/views/system/WaybillManagement.vue

@@ -135,9 +135,6 @@
   import {
     WaybillStatus
   } from '@/assets/js/blockSort'
-  // import {
-  //   number
-  // } from 'echarts'
   export default {
     name: 'WaybillManagement',
     components: {
@@ -709,6 +706,8 @@
               this.signDialogVisible = false
             }
             this.signConfirmLoading = false
+          }).catch(() => {
+            this.signConfirmLoading = false
           })
         } else {
           this.$message.error('表单信息不完整,请继续填写完整');
@@ -902,13 +901,15 @@
           waybillImport(formData).then(res => {
             if (res.code == 200) {
               this.bulkImportVisible = false
-              this.importFlag = false
               this.getList()
               this.$message({
                 message: '恭喜你,导入成功',
                 type: 'success'
               });
             }
+            this.importFlag = false
+          }).catch(() => {
+            this.importFlag = false
           })
         } else {
           this.$message({
@@ -925,6 +926,8 @@
             this.blobDownload(response.data, response.fileName)
           }
           this.downloadFlag = false
+        }).catch(() => {
+          this.importFlag = false
         })
       },
       // 上传文件

+ 30 - 2
src/views/system/interiorUserManagement.vue

@@ -5,8 +5,15 @@
       @searchProtocol="searchProtocol"></actionBar>
     <div class="card_content_interior">
       <div class="left_interior">
-        <el-tree :data="companyData" :props="defaultProps" highlight-current check-on-click-node node-key="id"
-          @node-click="handleNodeClick"></el-tree>
+        <el-tree style="max-width: 250px" :data="companyData" :props="defaultProps" highlight-current
+          check-on-click-node node-key="id" :expand-on-click-node="false" @node-click="handleNodeClick">
+          <!-- <template #default="{ node, data }"> -->
+          <el-tooltip :disabled="showTitle" effect="dark" :content="tooltipTitle" placement="top"
+            slot-scope="{ node, data }">
+            <span class="span-ellipsis" @mouseover="onShowNameTips">{{node.label}}</span>
+          </el-tooltip>
+          <!-- </template> -->
+        </el-tree>
       </div>
       <div class="right_interior">
         <!-- 表单 -->
@@ -104,6 +111,8 @@
         selectingData: {},
         companyData: [],
         companyId: '',
+        showTitle: false,
+        tooltipTitle: '',
       }
     },
     mounted() {
@@ -111,6 +120,17 @@
       this.getList()
     },
     methods: {
+      onShowNameTips(e) {
+        var target = e.target;
+        let textLength = target.clientWidth;
+        let containerLength = target.scrollWidth;
+        if (textLength < containerLength) {
+          this.tooltipTitle = e.target.innerText;
+          this.showTitle = false;
+        } else {
+          this.showTitle = true;
+        }
+      },
       // 点击公司获取用户列表
       handleNodeClick(data) {
         this.companyId = data.id
@@ -348,4 +368,12 @@
   .right_interior {
     width: 80%;
   }
+
+  .span-ellipsis {
+    width: 100%;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    margin-right: 20px;
+  }
 </style>

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff