Просмотр исходного кода

版本迭代,样式和接口都已完成

hzj18279462576@163.com 2 лет назад
Родитель
Сommit
9caabf6ae5

+ 1 - 1
index.html

@@ -3,7 +3,7 @@
   <head>
   <head>
     <meta charset="UTF-8" />
     <meta charset="UTF-8" />
     <!-- <link rel="icon" type="image/svg+xml" href="./src/assets/vite.svg" /> -->
     <!-- <link rel="icon" type="image/svg+xml" href="./src/assets/vite.svg" /> -->
-    <link rel="icon" type="image/svg+xml" href="./src/assets/nanchang.png" />
+    <link rel="icon" type="image/svg+xml" href="./src/assets/logos.png" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>校园报修管理系统</title>
     <title>校园报修管理系统</title>
   </head>
   </head>

+ 5 - 0
package-lock.json

@@ -740,6 +740,11 @@
       "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
       "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
       "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
       "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
     },
     },
+    "nprogress": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz",
+      "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="
+    },
     "path-parse": {
     "path-parse": {
       "version": "1.0.7",
       "version": "1.0.7",
       "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
       "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",

+ 1 - 0
package.json

@@ -20,6 +20,7 @@
     "hls.js": "^1.3.4",
     "hls.js": "^1.3.4",
     "jsencrypt": "^3.3.1",
     "jsencrypt": "^3.3.1",
     "lodash": "^4.17.21",
     "lodash": "^4.17.21",
+    "nprogress": "^0.2.0",
     "print-js": "^1.6.0",
     "print-js": "^1.6.0",
     "sass": "^1.58.0",
     "sass": "^1.58.0",
     "sass-loader": "^13.2.0",
     "sass-loader": "^13.2.0",

+ 13 - 0
src/App.vue

@@ -30,4 +30,17 @@ onBeforeMount(() => {
   // margin: 0;
   // margin: 0;
   // padding: 0;
   // padding: 0;
 }
 }
+
+.router_animate-enter-active {
+  animation: fadeIn 1.5s;
+}
+
+.router_animate-leave-active {
+  animation: fadeIn 0s;
+}
+
+// 进度条颜色
+// #nprogress .bar {
+//   background-color: rgb(0, 247, 255) !important;
+// }
 </style>
 </style>

BIN
src/assets/fixed.png


BIN
src/assets/logos.png


BIN
src/assets/logos1.png


+ 10 - 3
src/layout/index.vue

@@ -3,12 +3,19 @@
     <SidevarItem></SidevarItem>
     <SidevarItem></SidevarItem>
     <div class="content">
     <div class="content">
       <Navbar></Navbar>
       <Navbar></Navbar>
-      <!-- <router-view></router-view>
-       -->
-      <router-view v-slot="{ Component }">
+      <!-- <router-view></router-view> -->
+
+      <!-- <router-view v-slot="{ Component }">
         <transition name="router_animate">
         <transition name="router_animate">
           <component :is="Component" />
           <component :is="Component" />
         </transition>
         </transition>
+      </router-view> -->
+
+      <router-view v-slot="{ Component }">
+        <transition mode="out-in" :duration="200" enter-active-class="animate__animated animate__fadeIn"
+          leave-active-class="animate__animated animate__fadeOut">
+          <component :is="Component" />
+        </transition>
       </router-view>
       </router-view>
     </div>
     </div>
   </div>
   </div>

+ 23 - 2
src/router/index.js

@@ -3,6 +3,10 @@ import {
   createWebHistory,
   createWebHistory,
   createWebHashHistory,
   createWebHashHistory,
 } from "vue-router";
 } from "vue-router";
+
+import NProgress from "nprogress";
+import "nprogress/nprogress.css";
+
 import Layout from "@/layout/index.vue";
 import Layout from "@/layout/index.vue";
 const router = createRouter({
 const router = createRouter({
   // history: createWebHashHistory("/campusMaintenance/repairManage"), // 线上地址
   // history: createWebHashHistory("/campusMaintenance/repairManage"), // 线上地址
@@ -89,8 +93,8 @@ const router = createRouter({
     },
     },
   ],
   ],
 });
 });
-export default router;
-router.beforeEach(async (to, from, next) => {
+router.beforeEach((to, from, next) => {
+  NProgress.start(); // 进度条开始
   // 判断 如果cook是否存在,可以进去
   // 判断 如果cook是否存在,可以进去
   if (sessionStorage.getItem("token")) {
   if (sessionStorage.getItem("token")) {
     next(); //放行
     next(); //放行
@@ -102,3 +106,20 @@ router.beforeEach(async (to, from, next) => {
     }
     }
   }
   }
 });
 });
+
+router.afterEach(() => {
+  NProgress.done(); // 进度条结束
+});
+export default router;
+// router.beforeEach(async (to, from, next) => {
+//   // 判断 如果cook是否存在,可以进去
+//   if (sessionStorage.getItem("token")) {
+//     next(); //放行
+//   } else {
+//     if (to.path == "/login") {
+//       next();
+//     } else {
+//       next(`/login`);
+//     }
+//   }
+// });

+ 280 - 13
src/views/area/area.vue

@@ -14,10 +14,43 @@
               style="width: 14px; height: 14px; margin-right: 4px" alt="" /><span>添加区域</span></el-button>
               style="width: 14px; height: 14px; margin-right: 4px" alt="" /><span>添加区域</span></el-button>
         </div>
         </div>
       </div>
       </div>
-      <div class="footer">
-        <el-table :data="tableData.list" @selection-change="handleSelectionChange" :header-cell-style="{
-          background: 'rgba(240, 243, 247, 1)',
-        }" style="width: 100%; margin-bottom: 20px" row-key="id">
+      <div class="footer" :key="keyIndex">
+        <el-table v-loading="loading" :expand-row-keys="mexpandId" :row-key="row => row.id" :data="tableData.list"
+          @expand-change="mhandleExpandChange" :header-cell-style="{
+            background: 'rgba(240, 243, 247, 1)',
+          }" style="width: 100%; margin-bottom: 20px">
+          <el-table-column type="expand">
+            <template #default="props">
+              <div m="4" class="Inside">
+                <!-- 排序 -->
+                <el-table :data="props.row.children" :row-key="row => row.id"
+                  :cell-style="{ background: 'rgba(0,0,0,0.1)' }">
+                  <el-table-column label="报修物品" prop="name" />
+                  <el-table-column label="操作">
+                    <template #default="scope">
+                      <div class="options">
+                        <div class="look edit" @click="editAreaH(scope.row)">修改</div>
+                        <el-popconfirm width="220" confirm-button-text="确认" cancel-button-text="取消" :icon="InfoFilled"
+                          icon-color="#f89626" title="是否删除?" @confirm="delAreaH(scope.row)" @cancel="cencelAreaH">
+                          <template #reference>
+                            <div class="look delete">删除</div>
+                          </template>
+                        </el-popconfirm>
+                      </div>
+                    </template>
+                  </el-table-column>
+
+                  <!-- <el-table-column label="拖拽排序" align="center" width="120">
+                    <template #default="props">
+                      <el-icon class="allowDragInside">
+                        <Rank />
+                      </el-icon>
+                    </template>
+                  </el-table-column> -->
+                </el-table>
+              </div>
+            </template>
+          </el-table-column>
           <el-table-column label="报修区域">
           <el-table-column label="报修区域">
             <template #default="scope">
             <template #default="scope">
               <img v-if="scope.row.flag == 1" src="@/assets/areaTable.png" alt="" />
               <img v-if="scope.row.flag == 1" src="@/assets/areaTable.png" alt="" />
@@ -27,7 +60,7 @@
           <el-table-column prop="address" align="center" label="操作">
           <el-table-column prop="address" align="center" label="操作">
             <template #default="scope">
             <template #default="scope">
               <div class="options">
               <div class="options">
-                <div class="look add" v-if="scope.row.parentId == 1" @click="addAreaH(scope.row)">
+                <div class="look add" @click="addAreaH(scope.row)">
                   添加
                   添加
                 </div>
                 </div>
                 <div class="look edit" @click="editAreaH(scope.row)">修改</div>
                 <div class="look edit" @click="editAreaH(scope.row)">修改</div>
@@ -40,6 +73,14 @@
               </div>
               </div>
             </template>
             </template>
           </el-table-column>
           </el-table-column>
+
+          <!-- <el-table-column label="拖拽排序" align="center" width="120">
+            <template #default="props">
+              <el-icon color="rgb(26, 145, 255)" class="allowDrag">
+                <Rank />
+              </el-icon>
+            </template>
+          </el-table-column> -->
         </el-table>
         </el-table>
         <!-- 添加区域 -->
         <!-- 添加区域 -->
         <el-dialog class="addAreaH" v-model="addAreaHvisible" :close-on-click-modal="false" :close-on-press-escape="false"
         <el-dialog class="addAreaH" v-model="addAreaHvisible" :close-on-click-modal="false" :close-on-press-escape="false"
@@ -145,10 +186,42 @@
               style="width: 14px; height: 14px; margin-right: 4px" alt="" /><span>添加区域</span></el-button>
               style="width: 14px; height: 14px; margin-right: 4px" alt="" /><span>添加区域</span></el-button>
         </div>
         </div>
       </div>
       </div>
-      <div class="footer">
-        <el-table :data="tableData.list" @selection-change="handleSelectionChange" :header-cell-style="{
-          background: 'rgba(240, 243, 247, 1)',
-        }" style="width: 100%; margin-bottom: 20px" row-key="id">
+      <div class="footer" :key="keyIndex">
+        <el-table v-loading="loading" :expand-row-keys="mexpandId" :row-key="row => row.id" :data="tableData.list"
+          @expand-change="mhandleExpandChange" :header-cell-style="{
+            background: 'rgba(240, 243, 247, 1)',
+          }" style="width: 100%; margin-bottom: 20px">
+          <el-table-column type="expand">
+            <template #default="props">
+              <!-- 排序 -->
+              <el-table :data="props.row.children" :row-key="row => row.id"
+                :cell-style="{ background: 'rgba(0,0,0,0.1)' }">
+                <el-table-column label="报修物品" prop="name" />
+                <el-table-column label="操作">
+                  <template #default="scope">
+                    <div class="options">
+                      <div class="look edit" @click="editAreaM(scope.row)">修改</div>
+                      <el-popconfirm width="220" confirm-button-text="确认" cancel-button-text="取消" :icon="InfoFilled"
+                        icon-color="#f89626" title="是否删除?" @confirm="delAreaM(scope.row)" @cancel="cencelAreaH">
+                        <template #reference>
+                          <div class="look delete">删除</div>
+                        </template>
+                      </el-popconfirm>
+                    </div>
+                  </template>
+                </el-table-column>
+
+                <!-- <el-table-column label="拖拽排序" align="center" width="120">
+                  <template #default="props">
+                    <el-icon class="allowDragInside">
+                      <Rank />
+                    </el-icon>
+                  </template>
+                </el-table-column> -->
+              </el-table>
+            </template>
+          </el-table-column>
+
           <el-table-column prop="date" label="报修区域">
           <el-table-column prop="date" label="报修区域">
             <template #default="scope">
             <template #default="scope">
               <img v-if="scope.row.flag == 1" src="@/assets/areaTable.png" alt="" />
               <img v-if="scope.row.flag == 1" src="@/assets/areaTable.png" alt="" />
@@ -158,7 +231,7 @@
           <el-table-column prop="address" align="center" label="操作">
           <el-table-column prop="address" align="center" label="操作">
             <template #default="scope">
             <template #default="scope">
               <div class="options">
               <div class="options">
-                <div class="look add" v-if="scope.row.parentId == 2" @click="addAreasM(scope.row)">
+                <div class="look add" @click="addAreasM(scope.row)">
                   添加
                   添加
                 </div>
                 </div>
                 <div class="look edit" @click="editAreaM(scope.row)">修改</div>
                 <div class="look edit" @click="editAreaM(scope.row)">修改</div>
@@ -171,6 +244,14 @@
               </div>
               </div>
             </template>
             </template>
           </el-table-column>
           </el-table-column>
+
+          <!-- <el-table-column label="拖拽排序" align="center" width="120">
+            <template #default="props">
+              <el-icon color="rgb(26, 145, 255)" class="allowDrag">
+                <Rank />
+              </el-icon>
+            </template>
+          </el-table-column> -->
         </el-table>
         </el-table>
         <!-- 添加区域 -->
         <!-- 添加区域 -->
         <el-dialog class="addAreaM" v-model="addAreaMvisible" :close-on-click-modal="false" :close-on-press-escape="false"
         <el-dialog class="addAreaM" v-model="addAreaMvisible" :close-on-click-modal="false" :close-on-press-escape="false"
@@ -240,6 +321,8 @@ const tableData = reactive({
   ],
   ],
 });
 });
 const themeIndex = ref(1); // 切换 耗材管理 和 耗材记录
 const themeIndex = ref(1); // 切换 耗材管理 和 耗材记录
+const loading = ref(false)
+const keyIndex = ref(1) // 切换时将key改变使组件重新加载
 
 
 // 添加耗材 弹窗数据 (------------------------------------)
 // 添加耗材 弹窗数据 (------------------------------------)
 const dialongTitle = ref("添加耗材"); // 弹窗标题
 const dialongTitle = ref("添加耗材"); // 弹窗标题
@@ -315,6 +398,8 @@ const addAreaMForm = reactive({
   id: "",
   id: "",
 });
 });
 
 
+const mexpandId = ref([]) // 树形表格默认展开项
+
 // 表单验证
 // 表单验证
 const addAreaRules = reactive({
 const addAreaRules = reactive({
   content: [{ required: true, message: "请输入区域名称", trigger: "blur" }],
   content: [{ required: true, message: "请输入区域名称", trigger: "blur" }],
@@ -324,6 +409,7 @@ const addAreaMRules = reactive({
 });
 });
 // 查看报修区域列表
 // 查看报修区域列表
 const getList = async (flag) => {
 const getList = async (flag) => {
+  loading.value = true
   let data = {};
   let data = {};
   if (flag == 1) {
   if (flag == 1) {
     themeIndex.value = 1;
     themeIndex.value = 1;
@@ -375,6 +461,7 @@ const getList = async (flag) => {
   });
   });
   console.log(res, `${themeIndex.value}` + "报修区域数据");
   console.log(res, `${themeIndex.value}` + "报修区域数据");
   if (res.data.code == 200) {
   if (res.data.code == 200) {
+    loading.value = false
     res.data.data.forEach((item) => {
     res.data.data.forEach((item) => {
       item.flag = 1;
       item.flag = 1;
     });
     });
@@ -395,6 +482,114 @@ const getList = async (flag) => {
   }
   }
 };
 };
 
 
+//  当用户对某一行展开或者关闭的时候会触发该事件
+const mhandleExpandChange = (rows, expand) => {
+  // console.log(rows, expand, "树形展开回调");
+  const isExpend = expand.some(r => r.id === rows.id) // 判断当前行展开状态
+  if (isExpend) {
+    // Do some things
+    if (mexpandId.value.length == 0) {
+      mexpandId.value.push(rows.id)
+      console.log("当前行展开", mexpandId.value);
+    } else {
+      mexpandId.value = [rows.id]
+      console.log("当前行展开", mexpandId.value);
+    }
+
+  } else {
+    mexpandId.value = mexpandId.value.filter(item => {
+      return rows.id != item
+    })
+    console.log("当前行关闭", mexpandId.value);
+  }
+
+  // nextTick(() => {
+  //   let tbodyInside = document.querySelector(".Inside .el-table__body-wrapper tbody");
+  //   // console.log(tbodyInside);
+  //   if (tbodyInside) {
+  //     Sortable.create(tbodyInside, {
+  //       handle: '.allowDragInside',
+  //       //方式一:字符串
+  //       group: 'itxst', //直接设置组名称
+  //       //方式二:object
+  //       group: {
+  //         name: 'itxst',//分组名称itxst的组之间可以相互拖拽
+  //         pull: false,//是否允许拖入当前组
+  //         put: false,//是否允许拖出当前组
+  //       },
+  //       // chosenClass: "chosenClass",// :ghost-class="hostClass" 被选中目标的样式,你的自定义样式可能需要加!important才能生效,并把forceFallback属性设置成true
+  //       // dragClass: "dragClass",// :drag-class="dragClass"拖动元素的样式,你的自定义样式可能需要加!important才能生效,并把forceFallback属性设置成true
+  //       // forceFallback: true,
+  //       animation: 120,
+  //       async onEnd({ newIndex, oldIndex }) {
+  //         console.log(newIndex, oldIndex);
+  //         const list = JSON.parse(JSON.stringify(tableData.list))
+
+  //         let data = []
+  //         data = list.filter(item => {
+  //           return item.id == mexpandId.value[0]
+  //         })
+  //         console.log(data);
+
+  //         // 内部改变的表格数据
+  //         let datas = data[0].children
+  //         const targetRow = datas.splice(oldIndex, 1)[0]
+  //         console.log(targetRow, "被截取的数据");
+  //         datas.splice(newIndex, 0, targetRow)
+  //         console.log(datas, "改变后数组数据");
+
+  //         tableData.list.forEach(item => {
+  //           if (item.id == mexpandId.value[0]) {
+  //             item.children = datas
+  //           }
+  //         })
+
+  //         let articles = []
+  //         datas.forEach((item, index) => {
+  //           let aug = {
+  //             id: "",
+  //             orderNum: ""
+  //           }
+  //           aug.id = item.id
+  //           aug.orderNum = index + 1
+  //           articles.push(aug)
+  //         })
+  //         console.log(articles, "排序参数");
+
+  //         let res = await axios({
+  //           method: "post",
+  //           url: api.value + "/repairArticleType/dragArticle",
+  //           headers: {
+  //             token: sessionStorage.getItem("token"),
+  //             user_head: sessionStorage.getItem("userhead"),
+  //           },
+  //           data: { articles: articles },
+  //         });
+  //         console.log(res, "排序数据");
+
+  //         if (res.data.code == 200) {
+  //           getList(themeIndex.value);
+  //           ElMessage({
+  //             type: "success",
+  //             showClose: true,
+  //             message: res.data.message,
+  //             center: true,
+  //           });
+  //         } else {
+  //           ElMessage({
+  //             type: "error",
+  //             showClose: true,
+  //             message: res.data.message,
+  //             center: true,
+  //           });
+  //         }
+  //         // console.log(tableData.list, "改变后数组数据");
+  //       }
+  //     })
+  //   }
+  // })
+}
+
 // (黄家湖-------------------------------------------------------)
 // (黄家湖-------------------------------------------------------)
 // 黄家湖-页面添加按钮
 // 黄家湖-页面添加按钮
 const addlist = () => {
 const addlist = () => {
@@ -1072,10 +1267,14 @@ onUnmounted(() => {
             display: flex;
             display: flex;
             align-items: center;
             align-items: center;
             margin-left: 40px;
             margin-left: 40px;
+
             // justify-content: center;
             // justify-content: center;
             // 有子节点 且未展开
             // 有子节点 且未展开
+
           }
           }
         }
         }
+
+
       }
       }
 
 
       :deep(.el-table__row) {
       :deep(.el-table__row) {
@@ -1084,12 +1283,23 @@ onUnmounted(() => {
         color: #000;
         color: #000;
 
 
         .el-table__cell:nth-child(1) {
         .el-table__cell:nth-child(1) {
+          // background-color: red;
+
           .cell {
           .cell {
-            display: flex;
-            align-items: center;
-            margin-left: 40px;
+
+            margin-left: 30px;
+
             // justify-content: center;
             // justify-content: center;
             // 有子节点 且未展开
             // 有子节点 且未展开
+            .el-table__expand-icon {
+              display: flex;
+              align-items: center;
+              margin: 0;
+
+              .el-icon {
+                display: none;
+              }
+            }
 
 
             img {
             img {
               width: 20px;
               width: 20px;
@@ -1098,6 +1308,30 @@ onUnmounted(() => {
             }
             }
           }
           }
         }
         }
+
+        img {
+          width: 20px;
+          height: 20px;
+          margin-right: 6px;
+        }
+      }
+
+      :deep(.el-table__expanded-cell) {
+        padding: 0;
+
+        .el-table__header-wrapper {
+          display: none;
+        }
+
+        .el-table__body-wrapper {
+          .el-table__row {
+            .el-table__cell:nth-child(1) {
+              .cell {
+                margin-left: 74px;
+              }
+            }
+          }
+        }
       }
       }
 
 
       // :deep(.el-table__row--level-1) {
       // :deep(.el-table__row--level-1) {
@@ -1176,6 +1410,39 @@ onUnmounted(() => {
       }
       }
     }
     }
 
 
+    :deep(.Inside) {
+      // border: 1px solid red;
+
+      // .chosenClass {
+      //   background: #ccc
+      // }
+
+      // .dragClass {
+      //   border: 1px solid red;
+      //   display: flex;
+      //   align-items: center;
+      //   background: rgba(0, 0, 0, 0.1);
+
+
+      //   .el-table__row {
+      //     .el-table__cell:nth-child(1) {
+      //       width: 503px;
+      //     }
+
+      //     .el-table__cell:nth-child(2) {
+      //       width: 455px;
+      //     }
+
+      //     .el-table__cell:nth-child(3) {
+      //       width: 120px;
+      //     }
+      //   }
+
+      // }
+
+
+    }
+
     // 添加区域弹窗样式
     // 添加区域弹窗样式
     :deep(.addAreaH) {
     :deep(.addAreaH) {
       //   height: 420px;
       //   height: 420px;

+ 4 - 2
src/views/consumable/consumable.vue

@@ -44,7 +44,7 @@
             <span>导出耗材</span></el-button>
             <span>导出耗材</span></el-button>
         </div>
         </div>
       </div>
       </div>
-      <div class="footer">
+      <div class="footer" :key="keyIndex">
         <el-table :row-class-name="tableRowClassName" :data="tableData.list" style="width: 100%" :header-cell-style="{
         <el-table :row-class-name="tableRowClassName" :data="tableData.list" style="width: 100%" :header-cell-style="{
           background: 'rgba(240, 243, 247, 1)',
           background: 'rgba(240, 243, 247, 1)',
           height: '50px',
           height: '50px',
@@ -230,7 +230,7 @@
             <span>导出耗材记录</span></el-button>
             <span>导出耗材记录</span></el-button>
         </div>
         </div>
       </div>
       </div>
-      <div class="footer">
+      <div class="footer" :key="keyIndex">
         <el-table :row-class-name="tableRowClassName" :data="tableData2.list" @selection-change="handleSelectionChange2"
         <el-table :row-class-name="tableRowClassName" :data="tableData2.list" @selection-change="handleSelectionChange2"
           style="width: 100%" :header-cell-style="{
           style="width: 100%" :header-cell-style="{
             background: 'rgba(240, 243, 247, 1)',
             background: 'rgba(240, 243, 247, 1)',
@@ -289,6 +289,7 @@ const tableData = reactive({ list: [] });
 const tableData2 = reactive({ list: [] });
 const tableData2 = reactive({ list: [] });
 
 
 const themeIndex = ref(2); // 切换 耗材管理 和 耗材记录
 const themeIndex = ref(2); // 切换 耗材管理 和 耗材记录
+const keyIndex = ref(1) // 切换时将key改变使组件重新加载
 
 
 // 添加耗材 弹窗数据 (------------------------------------)
 // 添加耗材 弹窗数据 (------------------------------------)
 const dialongTitle = ref("添加耗材"); // 弹窗标题
 const dialongTitle = ref("添加耗材"); // 弹窗标题
@@ -369,6 +370,7 @@ watch(
 );
 );
 // 查看耗材管理列表
 // 查看耗材管理列表
 const getList = async (flag) => {
 const getList = async (flag) => {
+  keyIndex.value++;
   // 耗材管理(-----------------------------------------------)
   // 耗材管理(-----------------------------------------------)
   if (flag == 1) {
   if (flag == 1) {
     themeIndex.value = 1;
     themeIndex.value = 1;

+ 11 - 5
src/views/goods/goods.vue

@@ -14,9 +14,9 @@
               style="width: 14px; height: 14px; margin-right: 4px" alt="" /><span>添加物品</span></el-button>
               style="width: 14px; height: 14px; margin-right: 4px" alt="" /><span>添加物品</span></el-button>
         </div>
         </div>
       </div>
       </div>
-      <div class="footer huang">
-        <el-table @expand-change="mhandleExpandChange" :row-key="row => row.id" :data="tableData.list"
-          @selection-change="handleSelectionChange" :header-cell-style="{
+      <div class="footer huang" :key="keyIndex">
+        <el-table v-loading="loading" :expand-row-keys="mexpandId" @expand-change="mhandleExpandChange"
+          :row-key="row => row.id" :data="tableData.list" @selection-change="handleSelectionChange" :header-cell-style="{
             background: 'rgba(240, 243, 247, 1)',
             background: 'rgba(240, 243, 247, 1)',
           }" style="width: 100%; margin-bottom: 20px">
           }" style="width: 100%; margin-bottom: 20px">
           <el-table-column type="expand">
           <el-table-column type="expand">
@@ -184,8 +184,8 @@
               style="width: 14px; height: 14px; margin-right: 4px" alt="" /><span>添加物品</span></el-button>
               style="width: 14px; height: 14px; margin-right: 4px" alt="" /><span>添加物品</span></el-button>
         </div>
         </div>
       </div>
       </div>
-      <div class="footer">
-        <el-table @expand-change="mhandleExpandChange" :expand-row-keys="mexpandId" ref="mTreeTable"
+      <div class="footer" :key="keyIndex">
+        <el-table v-loading="loading" @expand-change="mhandleExpandChange" :expand-row-keys="mexpandId" ref="mTreeTable"
           :row-key="row => row.id" :data="tableData.list" @selection-change="handleSelectionChange" :header-cell-style="{
           :row-key="row => row.id" :data="tableData.list" @selection-change="handleSelectionChange" :header-cell-style="{
             background: 'rgba(240, 243, 247, 1)'
             background: 'rgba(240, 243, 247, 1)'
           }" style="width: 100%; margin-bottom: 20px">
           }" style="width: 100%; margin-bottom: 20px">
@@ -322,6 +322,8 @@ const tableData = reactive({
   ],
   ],
 });
 });
 const themeIndex = ref(2); // 切换 耗材管理 和 耗材记录
 const themeIndex = ref(2); // 切换 耗材管理 和 耗材记录
+const loading = ref(false)
+const keyIndex = ref(1) // 切换时将key改变使组件重新加载
 
 
 // 添加耗材 弹窗数据 (------------------------------------)
 // 添加耗材 弹窗数据 (------------------------------------)
 const dialongTitle = ref("添加耗材"); // 弹窗标题
 const dialongTitle = ref("添加耗材"); // 弹窗标题
@@ -483,6 +485,8 @@ const rowDrop = () => {
 
 
         if (res.data.code == 200) {
         if (res.data.code == 200) {
           getList(themeIndex.value);
           getList(themeIndex.value);
+          keyIndex.value++;
+
           ElMessage({
           ElMessage({
             type: "success",
             type: "success",
             showClose: true,
             showClose: true,
@@ -613,6 +617,7 @@ const mhandleExpandChange = (rows, expand) => {
 
 
 // 查看报修区域列表
 // 查看报修区域列表
 const getList = async (flag) => {
 const getList = async (flag) => {
+  loading.value = true
   let data = {};
   let data = {};
   if (flag == 1) {
   if (flag == 1) {
     themeIndex.value = 1;
     themeIndex.value = 1;
@@ -636,6 +641,7 @@ const getList = async (flag) => {
   });
   });
   console.log(res, `${themeIndex.value}` + "报修物品数据");
   console.log(res, `${themeIndex.value}` + "报修物品数据");
   if (res.data.code == 200) {
   if (res.data.code == 200) {
+    loading.value = false
     res.data.data.forEach((item) => {
     res.data.data.forEach((item) => {
       item.flag = 1;
       item.flag = 1;
     });
     });

+ 313 - 38
src/views/home/home.vue

@@ -149,32 +149,32 @@
           <div class="title">
           <div class="title">
             <div style="display: flex;align-items: center;">
             <div style="display: flex;align-items: center;">
               <span>黄家湖维修师傅效率统计</span>
               <span>黄家湖维修师傅效率统计</span>
-              <el-input v-model="searchInput6" :clearable="false" placeholder="请搜索关键字" size="small"
+              <el-input v-model="searchInput8" @input="searchTable8" placeholder="请搜索关键字" size="small"
                 style="width: 150px;margin-left: 15px;"></el-input>
                 style="width: 150px;margin-left: 15px;"></el-input>
             </div>
             </div>
-            <div class="import" @click="importTable6">
+            <div class="import" @click="importTable8">
               <img src="@/assets/importBlue.png" alt="" />
               <img src="@/assets/importBlue.png" alt="" />
               <span>导出</span>
               <span>导出</span>
             </div>
             </div>
           </div>
           </div>
           <div class="bottom">
           <div class="bottom">
             <ul>
             <ul>
-              <li v-for="(i, index) in day6" :key="index" @click="table6Btn(index)"
-                :class="tabIndex6 == index ? 'li_active' : ''">
+              <li v-for="(i, index) in day8" :key="index" @click="table8Btn(index)"
+                :class="tabIndex8 == index ? 'li_active' : ''">
                 {{ i.name }}
                 {{ i.name }}
               </li>
               </li>
             </ul>
             </ul>
           </div>
           </div>
-          <div class="table" v-loading="table6Load">
-            <el-table ref="table6" :stripe="true" :data="tableData6.list" height="200" :header-cell-style="{
+          <div class="table" v-loading="table8Load">
+            <el-table ref="table8" :stripe="true" :data="tableData8.list" height="200" :header-cell-style="{
               background: 'rgba(240, 243, 247, 1)',
               background: 'rgba(240, 243, 247, 1)',
               textAlign: 'center',
               textAlign: 'center',
             }">
             }">
               <el-table-column type="index" align="center" label="序号" />
               <el-table-column type="index" align="center" label="序号" />
-              <el-table-column prop="schoolName" align="center" label="校区" />
+              <!-- <el-table-column prop="schoolName" align="center" label="校区" /> -->
               <el-table-column prop="name" align="center" label="姓名">
               <el-table-column prop="name" align="center" label="姓名">
                 <template #default="{ row }">
                 <template #default="{ row }">
-                  <div style="color: rgb(111, 182, 184);cursor: pointer;" @click="cliName(row)">{{ row.name }}</div>
+                  <div style="color: rgb(111, 182, 184);cursor: pointer;" @click="cliName8(row)">{{ row.name }}</div>
                 </template>
                 </template>
               </el-table-column>
               </el-table-column>
               <el-table-column prop="workOrderTotal" align="center" label="工单总数" />
               <el-table-column prop="workOrderTotal" align="center" label="工单总数" />
@@ -191,7 +191,7 @@
           <div class="title">
           <div class="title">
             <div style="display: flex;align-items: center;">
             <div style="display: flex;align-items: center;">
               <span>墨轩湖维修师傅效率统计</span>
               <span>墨轩湖维修师傅效率统计</span>
-              <el-input v-model="searchInput6" :clearable="false" placeholder="请搜索关键字" size="small"
+              <el-input v-model="searchInput6" @input="searchTable6" placeholder="请搜索关键字" size="small"
                 style="width: 150px;margin-left: 15px;"></el-input>
                 style="width: 150px;margin-left: 15px;"></el-input>
             </div>
             </div>
             <div class="import" @click="importTable6">
             <div class="import" @click="importTable6">
@@ -213,10 +213,10 @@
               textAlign: 'center',
               textAlign: 'center',
             }">
             }">
               <el-table-column type="index" align="center" label="序号" />
               <el-table-column type="index" align="center" label="序号" />
-              <el-table-column prop="schoolName" align="center" label="校区" />
+              <!-- <el-table-column prop="schoolName" align="center" label="校区" /> -->
               <el-table-column prop="name" align="center" label="姓名">
               <el-table-column prop="name" align="center" label="姓名">
                 <template #default="{ row }">
                 <template #default="{ row }">
-                  <div style="color: rgb(111, 182, 184);cursor: pointer;" @click="cliName(row)">{{ row.name }}</div>
+                  <div style="color: rgb(111, 182, 184);cursor: pointer;" @click="cliName6(row)">{{ row.name }}</div>
                 </template>
                 </template>
               </el-table-column>
               </el-table-column>
               <el-table-column prop="workOrderTotal" align="center" label="工单总数" />
               <el-table-column prop="workOrderTotal" align="center" label="工单总数" />
@@ -262,8 +262,8 @@
       </div>
       </div>
     </div>
     </div>
     <div class="footer"></div>
     <div class="footer"></div>
-    <el-dialog class="reply" v-model="nameVisible" :close-on-click-modal="false" :close-on-press-escape="false"
-      title="师傅详情" align-center width="820" :before-close="cancelName">
+    <el-dialog class="reply" v-model="nameVisible6" :close-on-click-modal="false" :close-on-press-escape="false"
+      title="师傅详情" align-center width="820" :before-close="cancelName6">
       <div class="reply">
       <div class="reply">
         <div class="content">
         <div class="content">
           <table border>
           <table border>
@@ -277,13 +277,50 @@
               <td>耗材总费用(元)</td>
               <td>耗材总费用(元)</td>
             </tr>
             </tr>
             <tr>
             <tr>
-              <td>{{ nameList.name }}</td>
-              <td>{{ nameList.workOrderTotal }}</td>
-              <td>{{ nameList.degreePraise }}</td>
-              <td>{{ nameList.timeOut }}</td>
-              <td>{{ nameList.answer }}</td>
-              <td>{{ nameList.maintain }}</td>
-              <td>{{ nameList.totalPrice }}</td>
+              <td>{{ nameList6.name }}</td>
+              <td>{{ nameList6.workOrderTotal }}</td>
+              <td>{{ nameList6.degreePraise }}</td>
+              <td>{{ nameList6.timeOut }}</td>
+              <td>{{ nameList6.answer }}</td>
+              <td>{{ nameList6.maintain }}</td>
+              <td>{{ nameList6.totalPrice }}</td>
+            </tr>
+          </table>
+          <!-- <div class="nameInfo">姓名: <span>{{ nameList.name }}</span></div>
+          <div class="nameInfo">校区: <span>{{ nameList.schoolName }}</span></div>
+          <div class="nameInfo">工单总数: <span> {{ nameList.workOrderTotal }}</span></div>
+          <div class="nameInfo">好评率: <span>{{ nameList.degreePraise }}</span></div> -->
+        </div>
+        <!-- <div class="options">
+          <el-button color="rgba(111, 182, 184, 1)" class="queding" type="primary" @click="replycontentYes()">
+            确定
+          </el-button>
+          <el-button @click="cancelName">取消</el-button>
+        </div> -->
+      </div>
+    </el-dialog>
+    <el-dialog class="reply" v-model="nameVisible8" :close-on-click-modal="false" :close-on-press-escape="false"
+      title="师傅详情" align-center width="820" :before-close="cancelName8">
+      <div class="reply">
+        <div class="content">
+          <table border>
+            <tr>
+              <td>姓名</td>
+              <td>工单总数</td>
+              <td>好评率</td>
+              <td>超时率</td>
+              <td>平时响应时长(分)</td>
+              <td>平时维修时长(分)</td>
+              <td>耗材总费用(元)</td>
+            </tr>
+            <tr>
+              <td>{{ nameList8.name }}</td>
+              <td>{{ nameList8.workOrderTotal }}</td>
+              <td>{{ nameList8.degreePraise }}</td>
+              <td>{{ nameList8.timeOut }}</td>
+              <td>{{ nameList8.answer }}</td>
+              <td>{{ nameList8.maintain }}</td>
+              <td>{{ nameList8.totalPrice }}</td>
             </tr>
             </tr>
           </table>
           </table>
           <!-- <div class="nameInfo">姓名: <span>{{ nameList.name }}</span></div>
           <!-- <div class="nameInfo">姓名: <span>{{ nameList.name }}</span></div>
@@ -486,6 +523,8 @@ const nameList8 = reactive({
   maintain: "",// 平均维修时长(分)
   maintain: "",// 平均维修时长(分)
   totalPrice: "", // 耗材总费用(元)
   totalPrice: "", // 耗材总费用(元)
 })
 })
+const searchInput8 = ref() // 搜索关键字
+
 
 
 // 维修师傅效率统计 墨轩湖(---------------)
 // 维修师傅效率统计 墨轩湖(---------------)
 const table6 = ref();
 const table6 = ref();
@@ -545,8 +584,8 @@ const tableData6 = reactive({
     },
     },
   ],
   ],
 });
 });
-const nameVisible = ref(false);// 点击名字弹窗
-const nameList = reactive({
+const nameVisible6 = ref(false);// 点击名字弹窗
+const nameList6 = reactive({
   workOrderTotal: "",// 工单总数
   workOrderTotal: "",// 工单总数
   degreePraise: "",// 好评率
   degreePraise: "",// 好评率
   name: "",// 名字
   name: "",// 名字
@@ -1049,7 +1088,8 @@ const getlist = () => {
   tableList3(); // 报修校区统计
   tableList3(); // 报修校区统计
   tableList4(); // 报修区域统计
   tableList4(); // 报修区域统计
   tableList5(); // 总数据汇总分析
   tableList5(); // 总数据汇总分析
-  tableList6(); // 维修师傅效率统计
+  tableList6(); // 黄家湖维修师傅效率统计
+  tableList8(); // 墨轩湖维修师傅效率统计
   tableList7(); // 维修物品统计
   tableList7(); // 维修物品统计
 };
 };
 //  报修校区统计(----------------------)
 //  报修校区统计(----------------------)
@@ -1228,7 +1268,192 @@ const tableList5 = async () => {
   }
   }
 };
 };
 
 
-// 维修师傅效率统计(---------------------)
+// 维修师傅效率统计(黄家湖---------------------)
+const table8Btn = (index) => {
+  tabIndex8.value = index;
+  scrolltop8.value = true;
+  // 重置页数
+  table8CurrentPage.value = 1;
+  table8pageCount.value = 10;
+  tableList8();
+};
+// 点击名字
+const cliName8 = (row) => {
+  console.log(row);
+  nameVisible8.value = true
+  nameList8.workOrderTotal = row.workOrderTotal // 工单总数
+  nameList8.degreePraise = row.degreePraise // 好评率
+  nameList8.timeOut = row.timeOut // 超时率
+  nameList8.name = row.name // 名字
+  nameList8.answer = row.answer // 平均响应时长(分)
+  nameList8.maintain = row.maintain // 平均维修时长(分)
+  nameList8.totalPrice = row.totalPrice  // 耗材总费用(元)
+  nameList8.schoolName = row.schoolName
+}
+const cancelName8 = () => {
+  nameVisible8.value = false
+}
+const tableList8 = async () => {
+  table8Load.value = true;
+
+  let data = {
+    state: tabIndex8.value,
+    currentPage: table8CurrentPage.value,
+    pageCount: table8pageCount.value,
+    schoolId: 1,
+    keyWord: searchInput8.value
+  };
+
+  let res = await axios({
+    method: "get",
+    url: api.value + "/repairRecord/maintenanceWorker",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+  console.log(res, "黄家湖维修师傅效率统计数据");
+  if (res.data.code == 200) {
+    table8Total.value = res.data.data.records.length;
+    if (table8CurrentPage.value > 1) {
+      tableData8.list = tableData8.list.concat(res.data.data.records);
+    } else {
+      tableData8.list = res.data.data.records;
+    }
+    table8Load.value = false;
+  } else {
+    table8Load.value = false;
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+const tableScroll8 = (ele) => {
+  // ele : 绑定的表格元素
+  // console.log(ele.layout.table, "priceTable.value.bodyWrapper");
+  let table = ele.layout.table.refs.bodyWrapper;
+  table.addEventListener(
+    "scroll",
+    (e) => {
+      if (scrolltop8.value) {
+        e.target.scrollTop = 0;
+        scrolltop8.value = false;
+        console.log("置顶到顶部");
+      }
+      let scrollTop = e.target.scrollTop;
+      let scrollHeight = e.target.scrollHeight;
+      let clientHeight = e.target.clientHeight;
+      // console.log(scrollTop, "scrollTop");
+      // console.log(scrollHeight, "scrollHeight");
+      // console.log(clientHeight);
+      if (scrollTop + clientHeight == scrollHeight) {
+        console.log("滚动到底部了");
+        // 滚动到底部页面加一
+        table8CurrentPage.value++;
+        // 判断数据是否加载完
+        if (table8Total.value >= table8pageCount.value) {
+          console.log(table8Total.value, "加载完毕");
+          tableList8();
+        }
+      }
+    },
+    true
+  );
+};
+// 黄家湖搜索关键字
+const searchTable8 = async () => {
+  table8Load.value = true;
+  table8CurrentPage.value = 1
+  table8pageCount.value = 10
+  let data = {
+    state: tabIndex8.value,
+    currentPage: table8CurrentPage.value,
+    pageCount: table8pageCount.value,
+    schoolId: 1,
+    keyWord: searchInput8.value
+  };
+
+  let res = await axios({
+    method: "get",
+    url: api.value + "/repairRecord/maintenanceWorker",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+  console.log(res, "黄家湖维修师傅效率统计数据");
+  if (res.data.code == 200) {
+    if (res.data.data.records) {
+      table8Total.value = res.data.data.records.length;
+      if (table8CurrentPage.value > 1) {
+        tableData8.list = tableData8.list.concat(res.data.data.records);
+      } else {
+        tableData8.list = res.data.data.records;
+      }
+    } else {
+      tableData8.list = []
+    }
+    table8Load.value = false;
+  } else {
+    table8Load.value = false;
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+}
+// 维修师傅效率统计导出
+const importTable8 = async () => {
+  let datas = {
+    state: tabIndex8.value,
+    schoolId: 1,
+    keyWord: searchInput8.value
+  };
+  let res = await axios({
+    method: "get",
+    url: api.value + "/repairRecord/maintenanceWorkerExport",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: datas,
+    responseType: "blob",
+  });
+  console.log(res, "黄家湖维修师傅效率统计");
+  if (res.status == 200) {
+    let name = `黄家湖维修师傅效率统计`;
+    var content = res.data;
+    var data = new Blob([content]);
+    var downloadUrl = window.URL.createObjectURL(data);
+    var anchor = document.createElement("a");
+    anchor.href = downloadUrl;
+    anchor.download = name + ".xlsx";
+    anchor.click();
+    window.URL.revokeObjectURL(data);
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: "导出成功",
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: "导出失败",
+      center: true,
+    });
+  }
+};
+
+// 维修师傅效率统计(墨轩湖---------------------)
 const table6Btn = (index) => {
 const table6Btn = (index) => {
   tabIndex6.value = index;
   tabIndex6.value = index;
   scrolltop6.value = true;
   scrolltop6.value = true;
@@ -1238,20 +1463,20 @@ const table6Btn = (index) => {
   tableList6();
   tableList6();
 };
 };
 // 点击名字
 // 点击名字
-const cliName = (row) => {
+const cliName6 = (row) => {
   console.log(row);
   console.log(row);
-  nameVisible.value = true
-  nameList.workOrderTotal = row.workOrderTotal // 工单总数
-  nameList.degreePraise = row.degreePraise // 好评率
-  nameList.timeOut = row.timeOut // 超时率
-  nameList.name = row.name // 名字
-  nameList.answer = row.answer // 平均响应时长(分)
-  nameList.maintain = row.maintain // 平均维修时长(分)
-  nameList.totalPrice = row.totalPrice  // 耗材总费用(元)
-  nameList.schoolName = row.schoolName
+  nameVisible6.value = true
+  nameList6.workOrderTotal = row.workOrderTotal // 工单总数
+  nameList6.degreePraise = row.degreePraise // 好评率
+  nameList6.timeOut = row.timeOut // 超时率
+  nameList6.name = row.name // 名字
+  nameList6.answer = row.answer // 平均响应时长(分)
+  nameList6.maintain = row.maintain // 平均维修时长(分)
+  nameList6.totalPrice = row.totalPrice  // 耗材总费用(元)
+  nameList6.schoolName = row.schoolName
 }
 }
-const cancelName = () => {
-  nameVisible.value = false
+const cancelName6 = () => {
+  nameVisible6.value = false
 }
 }
 const tableList6 = async () => {
 const tableList6 = async () => {
   table6Load.value = true;
   table6Load.value = true;
@@ -1259,6 +1484,8 @@ const tableList6 = async () => {
     state: tabIndex6.value,
     state: tabIndex6.value,
     currentPage: table6CurrentPage.value,
     currentPage: table6CurrentPage.value,
     pageCount: table6pageCount.value,
     pageCount: table6pageCount.value,
+    schoolId: 2,
+    keyWord: searchInput6.value
   };
   };
 
 
   let res = await axios({
   let res = await axios({
@@ -1321,10 +1548,57 @@ const tableScroll6 = (ele) => {
     true
     true
   );
   );
 };
 };
+// 墨轩湖搜索关键字
+const searchTable6 = async () => {
+  table6Load.value = true;
+  table6CurrentPage.value = 1
+  table6pageCount.value = 10
+  let data = {
+    state: tabIndex6.value,
+    currentPage: table6CurrentPage.value,
+    pageCount: table6pageCount.value,
+    schoolId: 2,
+    keyWord: searchInput6.value
+  };
+
+  let res = await axios({
+    method: "get",
+    url: api.value + "/repairRecord/maintenanceWorker",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+  console.log(res, "黄家湖维修师傅效率统计数据");
+  if (res.data.code == 200) {
+    if (res.data.data.records) {
+      table6Total.value = res.data.data.records.length;
+      if (table6CurrentPage.value > 1) {
+        tableData6.list = tableData6.list.concat(res.data.data.records);
+      } else {
+        tableData6.list = res.data.data.records;
+      }
+    } else {
+      tableData6.list = []
+    }
+    table6Load.value = false;
+  } else {
+    table6Load.value = false;
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+}
 // 维修师傅效率统计导出
 // 维修师傅效率统计导出
 const importTable6 = async () => {
 const importTable6 = async () => {
   let datas = {
   let datas = {
     state: tabIndex6.value,
     state: tabIndex6.value,
+    schoolId: 2,
+    keyWord: searchInput6.value
   };
   };
   let res = await axios({
   let res = await axios({
     method: "get",
     method: "get",
@@ -1336,9 +1610,9 @@ const importTable6 = async () => {
     params: datas,
     params: datas,
     responseType: "blob",
     responseType: "blob",
   });
   });
-  console.log(res, "维修师傅效率统计");
+  console.log(res, "墨轩湖维修师傅效率统计");
   if (res.status == 200) {
   if (res.status == 200) {
-    let name = `维修师傅效率统计`;
+    let name = `墨轩湖维修师傅效率统计`;
     var content = res.data;
     var content = res.data;
     var data = new Blob([content]);
     var data = new Blob([content]);
     var downloadUrl = window.URL.createObjectURL(data);
     var downloadUrl = window.URL.createObjectURL(data);
@@ -1492,6 +1766,7 @@ onMounted(() => {
   getlist();
   getlist();
   tableScroll4(table4.value);
   tableScroll4(table4.value);
   tableScroll6(table6.value);
   tableScroll6(table6.value);
+  tableScroll8(table8.value);
   tableScroll7(table7.value);
   tableScroll7(table7.value);
 });
 });
 </script>
 </script>

+ 227 - 158
src/views/paySuccess/paySuccess.vue

@@ -41,7 +41,7 @@
         <el-table-column align="center " type="index" label="序号" />
         <el-table-column align="center " type="index" label="序号" />
         <el-table-column align="center" prop="payTime" width="200" label="交易时间" />
         <el-table-column align="center" prop="payTime" width="200" label="交易时间" />
         <el-table-column align="center" prop="recordNo" width="200" label="工单号" />
         <el-table-column align="center" prop="recordNo" width="200" label="工单号" />
-        <el-table-column align="center" prop="payNo" width="320" label="交易流水号" />
+        <el-table-column align="center" prop="payNo" width="330" label="交易流水号" />
         <el-table-column align="center" prop="userName" label="报修人" />
         <el-table-column align="center" prop="userName" label="报修人" />
         <el-table-column align="center" prop="payPrice" label="交易总金额" />
         <el-table-column align="center" prop="payPrice" label="交易总金额" />
         <el-table-column align="center" prop="refundTotalPrice" label="实退" />
         <el-table-column align="center" prop="refundTotalPrice" label="实退" />
@@ -51,14 +51,16 @@
             <span v-if="row.state == 0">已支付</span>
             <span v-if="row.state == 0">已支付</span>
             <span v-if="row.state == 1">部分退款</span>
             <span v-if="row.state == 1">部分退款</span>
             <span v-if="row.state == 2">已退款</span>
             <span v-if="row.state == 2">已退款</span>
+            <span v-if="row.state == 3">退款申请中</span>
+            <span v-if="row.state == 4">退款中</span>
           </template>
           </template>
         </el-table-column>
         </el-table-column>
         <el-table-column align="center" label="操作" width="220">
         <el-table-column align="center" label="操作" width="220">
           <template #default="scope">
           <template #default="scope">
             <div class="edit">
             <div class="edit">
               <div class="look" @click="refundInfo(scope.row)">详情</div>
               <div class="look" @click="refundInfo(scope.row)">详情</div>
-              <div class="look" @click="applyRefund(scope.row)">申请退款</div>
-              <div class="look" @click=refund(scope.row)>审核</div>
+              <div class="look" @click="refund(scope.row)">申请退款</div>
+              <div class="look" @click=applyRefund(scope.row) v-if="scope.row.isApprove == 1">审核</div>
               <!-- <div class="look" @click="refund(scope.row)" v-if="schoolId == 0">退款</div> -->
               <!-- <div class="look" @click="refund(scope.row)" v-if="schoolId == 0">退款</div> -->
             </div>
             </div>
           </template>
           </template>
@@ -107,28 +109,34 @@
             <span>退款进度</span>
             <span>退款进度</span>
           </div>
           </div>
 
 
-          <div class="steps">
+          <div class="steps" v-if="refundRecord.list">
             <el-steps direction="vertical" :active="refundRecord.list.length">
             <el-steps direction="vertical" :active="refundRecord.list.length">
               <el-step v-for="(i, index) in refundRecord.list">
               <el-step v-for="(i, index) in refundRecord.list">
                 <template v-slot:icon>
                 <template v-slot:icon>
                   <img style="width: 20px; height: 20px" src="@/assets/refundPrice.png" alt="" />
                   <img style="width: 20px; height: 20px" src="@/assets/refundPrice.png" alt="" />
                 </template>
                 </template>
                 <template v-slot:title>
                 <template v-slot:title>
-                  <span style="font-size: 15px">{{ i.remark }}</span>
+                  <span style="font-size: 15px" v-if="i.approve == 0">待审批</span>
+                  <span style="font-size: 15px" v-if="i.approve == 1">通过</span>
+                  <span style="font-size: 15px" v-if="i.approve == 2">驳回</span>
                 </template>
                 </template>
                 <template v-slot:description>
                 <template v-slot:description>
                   <div class="content">
                   <div class="content">
                     <span>退款时间 : {{ i.createTime }}</span>
                     <span>退款时间 : {{ i.createTime }}</span>
                   </div>
                   </div>
                   <div class="content">
                   <div class="content">
-                    <div>
+                    <span>
                       {{
                       {{
                         `第${index + 1}次 ` +
                         `第${index + 1}次 ` +
                         "退款金额 : " +
                         "退款金额 : " +
                         i.refundPrice +
                         i.refundPrice +
                         " 元"
                         " 元"
                       }}
                       }}
-                    </div>
+                    </span>
+                    <span v-if="i.isSuccess == 0" style="color:rgb(60, 234, 240)">( 退款中 )</span>
+                    <span v-if="i.isSuccess == 1" style="color:green">( 退款成功 )</span>
+                    <!-- <span v-if="i.isSuccess == 2" style="color:red">( 退款失败 )</span> -->
+                    <span v-if="i.isSuccess == 2" style="color:red">( 驳回退款 )</span>
                   </div>
                   </div>
                 </template>
                 </template>
               </el-step>
               </el-step>
@@ -137,38 +145,50 @@
         </div>
         </div>
       </el-dialog>
       </el-dialog>
       <!-- 退款弹窗 -->
       <!-- 退款弹窗 -->
-      <!-- <el-dialog class="refund" v-model="refundVisible" :close-on-click-modal="false" :close-on-press-escape="false"
-        title="退款" align-center width="500" :before-close="cancelRefund">
+      <el-dialog class="refund" v-model="refundVisible" :close-on-click-modal="false" :close-on-press-escape="false"
+        title="申请退款" align-center width="500" :before-close="cancelRefund">
+        <div class="priceContent">
+          <span>申请人 : </span>
+          <span>{{ refundName }}</span>
+        </div>
         <div class="priceContent">
         <div class="priceContent">
           <span>退款金额 : </span>
           <span>退款金额 : </span>
-          <el-input clearable v-model="refundPrice" class="w-50 m-2" placeholder="请输入退款金额" style="width: 180px" />
+          <el-input
+            oninput="value=value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3').replace(/^0+(\d)/, '$1') .replace(/^\./, '0.').match(/^\d*(\.?\d{0,2})/g)[0] || ''"
+            clearable v-model="refundPrice" class="w-50 m-2" placeholder="请输入退款金额" style="width: 180px" />
         </div>
         </div>
         <div class="priceContent">
         <div class="priceContent">
           <span>剩余金额 : </span>
           <span>剩余金额 : </span>
           <span style="color: red">{{ restrictPrice }}元</span>
           <span style="color: red">{{ restrictPrice }}元</span>
         </div>
         </div>
-        <ul>
+        <!-- <ul>
           <li v-for="(i, index) in refundRecord.list">
           <li v-for="(i, index) in refundRecord.list">
             <span>{{ `第${index + 1}次实退` }}</span>
             <span>{{ `第${index + 1}次实退` }}</span>
             <span style="margin: 0 20px">{{ i.createTime }}</span>
             <span style="margin: 0 20px">{{ i.createTime }}</span>
             <span>{{ i.refundPrice + " 元" }}</span>
             <span>{{ i.refundPrice + " 元" }}</span>
+            <span v-if="i.isSuccess == 0" style="color:rgb(60, 234, 240)">( 退款中 )</span>
+            <span v-if="i.isSuccess == 1" style="color:green">( 退款成功 )</span>
+            <span v-if="i.isSuccess == 2" style="color:red">( 退款失败 )</span>
           </li>
           </li>
-        </ul>
+        </ul> -->
+        <div class="priceContent" style="display:flex">
+          <div style="margin-bottom: 15px;width:50px">备注 : </div>
+          <el-input v-model="refundRemark" :rows="4" type="textarea" show-word-limit placeholder="此处为备注内容" />
+        </div>
         <div class="options">
         <div class="options">
           <el-button color="rgba(111, 182, 184, 1)" class="queding" type="primary" @click="refundYes">
           <el-button color="rgba(111, 182, 184, 1)" class="queding" type="primary" @click="refundYes">
-            确定
+            提交
           </el-button>
           </el-button>
           <el-button @click="cancelRefund">取消</el-button>
           <el-button @click="cancelRefund">取消</el-button>
         </div>
         </div>
-      </el-dialog> -->
+      </el-dialog>
       <!-- 退款 -->
       <!-- 退款 -->
-      <el-dialog class="refund" v-model="refundVisible" :close-on-click-modal="false" :close-on-press-escape="false"
+      <!-- <el-dialog class="refund" v-model="refundVisible" :close-on-click-modal="false" :close-on-press-escape="false"
         title="退款" align-center width="500" :before-close="cancelRefund">
         title="退款" align-center width="500" :before-close="cancelRefund">
         <div class="priceContent">
         <div class="priceContent">
           <div style="margin-bottom: 15px;">备注 : </div>
           <div style="margin-bottom: 15px;">备注 : </div>
-          <el-input v-model="refundRemark" :rows="4" type="textarea" show-word-limit 
-                placeholder="此处为备注内容" />
-        </div> 
+          <el-input v-model="refundRemark" :rows="4" type="textarea" show-word-limit placeholder="此处为备注内容" />
+        </div>
         <div class="priceContent">
         <div class="priceContent">
           <span>退款金额 : </span>
           <span>退款金额 : </span>
           <span style="color: red">{{ refundPrice }}元</span>
           <span style="color: red">{{ refundPrice }}元</span>
@@ -179,28 +199,33 @@
           </el-button>
           </el-button>
           <el-button @click="cancelRefund">驳回</el-button>
           <el-button @click="cancelRefund">驳回</el-button>
         </div>
         </div>
-      </el-dialog>
-      <!-- 申请退款 -->
+      </el-dialog> -->
+      <!-- 审核退款 -->
       <el-dialog class="refund" v-model="applyRefundVisible" :close-on-click-modal="false" :close-on-press-escape="false"
       <el-dialog class="refund" v-model="applyRefundVisible" :close-on-click-modal="false" :close-on-press-escape="false"
-        title="申请退款" align-center width="500" :before-close="cancelApplyRefund">
+        title="审核" align-center width="500" :before-close="cancelApplyRefund">
         <div class="priceContent">
         <div class="priceContent">
           <span>申请人 : </span>
           <span>申请人 : </span>
-          <span>XXX</span>
-        </div>    
-        <div class="priceContent">
-          <span>退款金额 : </span>
-          <el-input clearable v-model="applyRefundPrice" class="w-50 m-2" placeholder="请输入退款金额" style="width: 180px" />
-        </div>  
+          <span>{{ applyRefundList[0].approveUser }}</span>
+        </div>
         <div class="priceContent">
         <div class="priceContent">
-          <div style="margin-bottom: 15px;">备注 : </div>
-          <el-input v-model="applyRefundPriceRemark" :rows="4" type="textarea" show-word-limit 
-                placeholder="此处为备注内容" />
-        </div> 
+          <span>退款金额 : {{ applyRefundList[0].refundPrice }} 元</span>
+
+          <!-- <el-input clearable v-model="applyRefundList[0].refundPrice" class="w-50 m-2" placeholder="请输入退款金额"
+            style="width: 180px" /> -->
+        </div>
+        <!-- <div class="priceContent">
+          <span>退款描述 : {{ applyRefundList[0].remark }} </span>
+        </div> -->
+        <div class="priceContent" style="display:flex">
+          <div style="width:80px">退款描述 : </div>
+          <el-input disabled v-model="applyRefundList[0].remark" :rows="4" type="textarea" show-word-limit
+            placeholder="此处为备注内容" />
+        </div>
         <div class="options">
         <div class="options">
-          <el-button color="rgba(111, 182, 184, 1)" class="queding" type="primary" @click="applyRefundYes">
-            提交
+          <el-button color="rgba(111, 182, 184, 1)" class="queding" type="primary" @click="applyRefundYes(1)">
+            同意
           </el-button>
           </el-button>
-          <el-button @click="cancelApplyRefund">取消</el-button>
+          <el-button @click="applyRefundYes(0)">驳回</el-button>
         </div>
         </div>
       </el-dialog>
       </el-dialog>
     </div>
     </div>
@@ -289,15 +314,18 @@ const refundInfolist = reactive({
 
 
 // 退款
 // 退款
 const refundRecord = reactive({ list: [] }); // 退款记录
 const refundRecord = reactive({ list: [] }); // 退款记录
-const refundVisible=ref(false) // 退款弹窗
-const refundRemark=ref() // 备注
-const refundPrice=ref() // 退款的金额
-
-// 申请退款
-const applyRefundVisible=ref(false)// 申请退款弹窗
-const applyRefundPrice=ref() // 退款金额
-const applyRefundPriceRemark=ref() // 退款备注
-
+const refundVisible = ref(false) // 退款弹窗
+const refundRemark = ref() // 备注
+const refundPrice = ref() // 退款的金额
+const refundId = ref(); // 退款id
+const restrictPrice = ref(); // 限制退款金额
+const refundName = ref() // 申请人
+
+// 审核退款
+const applyRefundVisible = ref(false)// 申请退款弹窗
+const applyRefundList = ref()  // 审核信息
+const applyRefundPrice = ref() // 退款金额
+const applyRefundPriceRemark = ref() // 退款备注
 
 
 const currentPage = ref(1); // 当前页
 const currentPage = ref(1); // 当前页
 const pageSize = ref(10);
 const pageSize = ref(10);
@@ -326,8 +354,8 @@ const getList = async () => {
   });
   });
   console.log(res, "支付成功数据");
   console.log(res, "支付成功数据");
   if (res.data.code == 200) {
   if (res.data.code == 200) {
-    tableData.list = res.data.data.records;
-    total.value = res.data.data.total;
+    tableData.list = res.data.data.list;
+    total.value = res.data.data.totalCount;
   } else {
   } else {
     ElMessage({
     ElMessage({
       type: "error",
       type: "error",
@@ -342,6 +370,7 @@ const getList = async () => {
       });
       });
     }
     }
   }
   }
+
   // 合计接口
   // 合计接口
   {
   {
     if (searchInput.createTime) {
     if (searchInput.createTime) {
@@ -398,121 +427,160 @@ const cancelRefundInfo = () => {
 };
 };
 
 
 //退款按钮  (-------------------------------------------)
 //退款按钮  (-------------------------------------------)
-// const refund = async (row) => {
-//   refundVisible.value = true;
-//   refundId.value = row.id;
-//   refundRecord.list = row.repairRefundRecordList;
-//   let data = {
-//     payRecordId: refundId.value,
-//   };
-//   let res = await axios({
-//     method: "get",
-//     url: api.value + "/repairPayRecord/restrict",
-//     headers: {
-//       token: sessionStorage.getItem("token"),
-//       user_head: sessionStorage.getItem("userhead"),
-//     },
-//     params: data,
-//   });
-//   restrictPrice.value = res.data.data;
-//   console.log(res, "退款限制金额");
-// };
-// // 确定退款
-// const refundYes = async () => {
-//   var reg = /(^[1-9](\d+)?(\.\d{1,2})?$)|(^0$)|(^\d\.\d{1,2}$)/;
-//   console.log(reg.test(refundPrice.value));
-
-//   if (refundPrice.value > restrictPrice.value) {
-//     ElMessage({
-//       type: "error",
-//       showClose: true,
-//       message: "退款金额不能大于剩余金额",
-//       center: true,
-//     });
-//     return false;
-//   } else if (restrictPrice.value == 0) {
-//     ElMessage({
-//       type: "error",
-//       showClose: true,
-//       message: "金额已全部退款",
-//       center: true,
-//     });
-//     return false;
-//   } else if (refundPrice.value <= 0) {
-//     ElMessage({
-//       type: "error",
-//       showClose: true,
-//       message: "输入的退款金额必须大于0",
-//       center: true,
-//     });
-//     return false;
-//   } else if (!reg.test(refundPrice.value)) {
-//     ElMessage({
-//       type: "error",
-//       showClose: true,
-//       message: "退款金额为正数(小数位不超过2位)",
-//       center: true,
-//     });
-//     return false;
-//   }
-//   let data = {
-//     repairPayRecordId: refundId.value,
-//     refundPrice: refundPrice.value,
-//   };
-//   let res = await axios({
-//     method: "post",
-//     url: api.value + "/repairPayRecord/refundableAmount",
-//     headers: {
-//       token: sessionStorage.getItem("token"),
-//       user_head: sessionStorage.getItem("userhead"),
-//     },
-//     data: data,
-//   });
-//   console.log(res, "退款");
-//   if (res.data.code == 200) {
-//     refundVisible.value = false;
-//     refundPrice.value = "";
-//     getList();
-//     ElMessage({
-//       type: "success",
-//       showClose: true,
-//       message: res.data.message,
-//       center: true,
-//     });
-//   } else {
-//     ElMessage({
-//       type: "error",
-//       showClose: true,
-//       message: res.data.message,
-//       center: true,
-//     });
-//   }
-// };
-// // 取消按钮
-// const cancelRefund = () => {
-//   refundVisible.value = false;
-// };
-
-
-// 审核 (-----------------------------------------------------)
-const refund=(row)=>{
-  refundVisible.value=true
-}
-const cancelRefund=()=>{
-  refundVisible.value=false
-}
+const refund = async (row) => {
+  refundVisible.value = true;
+  refundId.value = row.id;
+  refundRecord.list = row.repairRefundRecordList;
+  restrictPrice.value = row.officialPrice;
+  // let data = {
+  //   payRecordId: refundId.value,
+  // };
+  // let res = await axios({
+  //   method: "get",
+  //   url: api.value + "/repairPayRecord/restrict",
+  //   headers: {
+  //     token: sessionStorage.getItem("token"),
+  //     user_head: sessionStorage.getItem("userhead"),
+  //   },
+  //   params: data,
+  // });
+  // restrictPrice.value = res.data.data;
+  // console.log(res, "退款限制金额");
+};
+// 确定退款
+const refundYes = async () => {
+  var reg = /(^[1-9](\d+)?(\.\d{1,2})?$)|(^0$)|(^\d\.\d{1,2}$)/;
+  console.log(reg.test(refundPrice.value));
 
 
-// 申请退款 (----------------------------------------------------)
-const applyRefund=(row)=>{
-  applyRefundVisible.value=true
+  if (refundPrice.value > restrictPrice.value) {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: "退款金额不能大于剩余金额",
+      center: true,
+    });
+    return false;
+  } else if (restrictPrice.value == 0) {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: "金额已全部退款",
+      center: true,
+    });
+    return false;
+  } else if (refundPrice.value <= 0) {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: "输入的退款金额必须大于0",
+      center: true,
+    });
+    return false;
+  } else if (!reg.test(refundPrice.value)) {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: "退款金额为正数(小数位不超过2位)",
+      center: true,
+    });
+    return false;
+  } else {
+    console.log("金额允许");
+    if (!refundRemark.value) {
+      ElMessage({
+        type: "error",
+        showClose: true,
+        message: "备注不能为空",
+        center: true,
+      });
+      return false;
+    }
+  }
+  let data = {
+    repairPayRecordId: refundId.value,
+    refundPrice: refundPrice.value,
+    remark: refundRemark.value
+  };
+  let res = await axios({
+    method: "post",
+    url: api.value + "/repairPayRecord/RefundableAmount",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    data: data,
+  });
+  console.log(res, "退款");
+  if (res.data.code == 200) {
+    refundVisible.value = false;
+    refundPrice.value = "";
+    refundRemark.value = ""
+    getList();
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+// 取消按钮
+const cancelRefund = () => {
+  refundVisible.value = false;
+  refundPrice.value = ""
+  refundRemark.value = ""
+};
+
+
+// 审核退款 (----------------------------------------------------)
+const applyRefund = (row) => {
+  applyRefundVisible.value = true
+  applyRefundList.value = row.approveRefunds
 }
 }
-// 确定申请
-const applyRefundYes=()=>{
-  console.log("确定申请退款");
+// 确定审核
+const applyRefundYes = async (flag) => {
+  console.log(applyRefundList.value, "确定申请退款");
+  let data = {
+    id: applyRefundList.value[0].id,
+    state: flag,
+  };
+  let res = await axios({
+    method: "post",
+    url: api.value + "/repairPayRecord/refundReview",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    data: data,
+  });
+  if (res.data.code == 200) {
+    applyRefundVisible.value = false
+    getList();
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
 }
 }
-// 取消申请
-const cancelApplyRefund=()=>{
-  applyRefundVisible.value=false
+// 驳回审核
+const cancelApplyRefund = () => {
+  applyRefundVisible.value = false
 }
 }
 
 
 //导出功能
 //导出功能
@@ -583,6 +651,7 @@ onBeforeMount(() => {
   } else {
   } else {
     schoolId.value = Number(sessionStorage.getItem("schoolId"));
     schoolId.value = Number(sessionStorage.getItem("schoolId"));
   }
   }
+  refundName.value = sessionStorage.getItem("username")
   getList();
   getList();
 });
 });
 onUnmounted(() => {
 onUnmounted(() => {
@@ -698,7 +767,7 @@ onUnmounted(() => {
   .footer {
   .footer {
     width: 96%;
     width: 96%;
     height: 550px;
     height: 550px;
-    margin: 10px auto 30px;
+    margin: 10px auto 25px;
 
 
     .el-table--fit {
     .el-table--fit {
       height: 100%;
       height: 100%;

Разница между файлами не показана из-за своего большого размера
+ 1062 - 0
src/views/staff/staff copy.vue


+ 557 - 172
src/views/staff/staff.vue

@@ -47,12 +47,7 @@
             border: 0,
             border: 0,
           }">
           }">
           <!-- <el-table-column align="center" type="selection" width="80" /> -->
           <!-- <el-table-column align="center" type="selection" width="80" /> -->
-          <el-table-column
-            width="80"
-            align="center "
-            type="index"
-            label="序号"
-          />
+          <el-table-column width="80" align="center " type="index" label="序号" />
           <el-table-column align="center" prop="userName" label="姓名" />
           <el-table-column align="center" prop="userName" label="姓名" />
           <el-table-column align="center" width="150" prop="userPhone" label="手机号码" />
           <el-table-column align="center" width="150" prop="userPhone" label="手机号码" />
           <el-table-column align="center" prop="teamName" label="维修班" />
           <el-table-column align="center" prop="teamName" label="维修班" />
@@ -87,6 +82,11 @@
           :close-on-press-escape="false" :title="dialongTitle" align-center width="700" :before-close="cancelAdd">
           :close-on-press-escape="false" :title="dialongTitle" align-center width="700" :before-close="cancelAdd">
           <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="120px" class="demo-ruleForm"
           <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="120px" class="demo-ruleForm"
             size="default" label-position="left" status-icon>
             size="default" label-position="left" status-icon>
+            <el-form-item label="身份 :" prop="userzzId">
+              <el-select v-model="ruleForm.userzzId" @change="changeUserZzid" class="m-2" placeholder="请选择身份">
+                <el-option v-for="item in userzzIdsList" :label="item.name" :value="item.id" v-show="item.id !== 0" />
+              </el-select>
+            </el-form-item>
             <el-form-item label="姓名 :" prop="userName">
             <el-form-item label="姓名 :" prop="userName">
               <el-input v-model="ruleForm.userName" placeholder="请输入姓名" clearable />
               <el-input v-model="ruleForm.userName" placeholder="请输入姓名" clearable />
             </el-form-item>
             </el-form-item>
@@ -96,18 +96,14 @@
                 <el-option label="第三方人员" :value="1" />
                 <el-option label="第三方人员" :value="1" />
               </el-select>
               </el-select>
             </el-form-item>
             </el-form-item>
-            <el-form-item label="微校卡号 :" prop="cardNumber" v-if="dialongTitle == '添加员工'">
+            <el-form-item label="微校卡号 :" prop="cardNumber" v-if="dialongTitle == '添加员工' && ruleForm.userzzId != 4">
               <el-input v-model="ruleForm.cardNumber" placeholder="请输入微校卡号" clearable />
               <el-input v-model="ruleForm.cardNumber" placeholder="请输入微校卡号" clearable />
             </el-form-item>
             </el-form-item>
-            <el-form-item label="微校卡号 :" prop="cardNumber" v-if="dialongTitle == '编辑员工'">
+            <el-form-item label="微校卡号 :" prop="cardNumber" v-if="dialongTitle == '编辑员工' && ruleForm.userzzId != 4">
               <el-input v-model="ruleForm.cardNumber" disabled placeholder="请输入微校卡号" clearable />
               <el-input v-model="ruleForm.cardNumber" disabled placeholder="请输入微校卡号" clearable />
             </el-form-item>
             </el-form-item>
-            <el-form-item label="身份 :" prop="userzzId">
-              <el-select v-model="ruleForm.userzzId" class="m-2" placeholder="请选择身份">
-                <el-option v-for="item in userzzIdsList" :label="item.name" :value="item.id" />
-              </el-select>
-            </el-form-item>
-            <el-form-item label="手机号码 :" prop="userPhone">
+
+            <el-form-item label="手机号码 :" prop="userPhone" v-if="ruleForm.userzzId != 4">
               <el-input v-model="ruleForm.userPhone" placeholder="请输入手机号码" clearable />
               <el-input v-model="ruleForm.userPhone" placeholder="请输入手机号码" clearable />
             </el-form-item>
             </el-form-item>
             <el-form-item label="校区 :" prop="schoolId">
             <el-form-item label="校区 :" prop="schoolId">
@@ -117,35 +113,71 @@
               </el-select>
               </el-select>
             </el-form-item>
             </el-form-item>
             <el-form-item label="工种 :">
             <el-form-item label="工种 :">
-              <el-select v-model="ruleForm.workType" class="m-2" placeholder="请选择工种">
+              <el-select v-model="ruleForm.workType" clearable class="m-2" placeholder="请选择工种">
                 <el-option v-for="item in workTypeList" :label="item.name" :value="item.id" />
                 <el-option v-for="item in workTypeList" :label="item.name" :value="item.id" />
               </el-select>
               </el-select>
             </el-form-item>
             </el-form-item>
-            <el-form-item label="关联报修类型 :" prop="articleIds" class="checkbox">
-              <el-tree :data="articleIdsList" :props="{ label: 'name', children: 'children', value: 'id' }" node-key="id"
-                show-checkbox ref="articleIdsRef" @check-change="handleArticleIds" />
-              <!-- <el-checkbox
-                v-model="checkAll"
-                :indeterminate="isIndeterminate"
-                @change="handleCheckAllChange"
-                >全选</el-checkbox
-              >
-              <el-checkbox-group
-                v-model="checkedCities"
-                @change="handleCheckedCitiesChange"
-              >
-                <el-checkbox
-                  v-for="item in articleIdsList"
-                  :label="item.name"
-                  >{{ item.name }}</el-checkbox
-                >
-              </el-checkbox-group> -->
+            <el-form-item label="关联报修类型 :" prop="articleBuilds" class="checkbox" v-if="ruleForm.userzzId != 4">
+              <div class="type">
+                <div class="articleType">
+                  <div class="articleTitle">关联种类</div>
+                  <!-- <el-checkbox v-model="articleAll" :indeterminate="articleIndeterminate"
+                    @change="articleAllChange">全选</el-checkbox> -->
+                  <el-tree :data="articleIdsList" @node-click="articleNodeClick"
+                    :props="{ label: 'name', children: 'children', value: 'id' }" node-key="id" show-checkbox
+                    ref="articleIdsRef" @check-change="handleArticleIds">
+                    <template #default="{ node, data }">
+                      <div class="custom-tree-node">
+                        <span>{{ data.name }}</span>
+                        <img v-if="data.id == clickArticleSel.id" src="../../assets/fixed.png" alt="">
+                        <img v-else src="" alt="">
+                      </div>
+                    </template>
+                  </el-tree>
+                </div>
+                <div class="buildType">
+                  <div class="allAriticle">
+                    <div class="articleTitle">关联楼栋</div>
+                    <!-- <el-checkbox v-model="buildAll" :indeterminate="buildIndeterminate"
+                      @change="buildAllChange">全选</el-checkbox> -->
+                  </div>
+                  <el-tree :data="treeValue.list" :props="{ label: 'name', children: 'children', value: 'id' }"
+                    node-key="id" show-checkbox ref="buildIdsRef" @check-change="handleCheckChange" />
+                </div>
+              </div>
+              <!-- <div class="type" v-if="ruleForm.schoolId == 2">
+                <div class="articleType">
+                  <div class="articleTitle">关联种类</div>
+                 
+
+                  <el-tree :data="articleIdsList" @node-click="articleNodeClick"
+                    :props="{ label: 'name', children: 'children', value: 'id' }" node-key="id" show-checkbox
+                    ref="articleIdsRef" @check-change="handleArticleIds">
+                    <template #default="{ node, data }">
+                      <span class="custom-tree-node">
+                        <span>{{ data.name }}</span>
+                        <img v-if="data.id == clickArticleSel.id" src="../../assets/fixed.png" alt="">
+                        <img v-else src="" alt="">
+                      </span>
+                    </template>
+                  </el-tree>
+                </div>
+                <div class="buildType">
+                  <div class="allAriticle">
+                    <div class="articleTitle">关联楼栋</div>
+                  
+                  </div>
+
+                  <el-tree :data="treeValue.list" :props="{ label: 'name', children: 'children', value: 'id' }"
+                    node-key="id" show-checkbox ref="buildIdsRef" @check-change="handleCheckChange" />
+                </div>
+              </div> -->
             </el-form-item>
             </el-form-item>
-            <el-form-item label="关联楼栋 :" prop="buildIds">
+            <!-- <el-form-item label="关联楼栋 :" prop="buildIds" v-if="ruleForm.userzzId != 4">
               <el-tree :data="treeValue.list" :props="{ label: 'name', children: 'children', value: 'id' }" node-key="id"
               <el-tree :data="treeValue.list" :props="{ label: 'name', children: 'children', value: 'id' }" node-key="id"
                 show-checkbox ref="buildIdsRef" @check-change="handleCheckChange" />
                 show-checkbox ref="buildIdsRef" @check-change="handleCheckChange" />
-            </el-form-item>
-            <el-form-item label="接单考核时间 :">
+            </el-form-item> -->
+            <el-form-item label="接单考核时间 :" v-if="ruleForm.userzzId != 4">
               <div class="kaohe">
               <div class="kaohe">
                 <el-input v-model="ruleForm.acceptanceTime" :clearable="false" placeholder="考核时间" style="width: 150px">
                 <el-input v-model="ruleForm.acceptanceTime" :clearable="false" placeholder="考核时间" style="width: 150px">
                   <template #suffix>
                   <template #suffix>
@@ -158,7 +190,7 @@
             <el-form-item style="
             <el-form-item style="
                 padding-bottom: 40px;
                 padding-bottom: 40px;
                 border-bottom: 1px solid rgba(230, 230, 230, 1);
                 border-bottom: 1px solid rgba(230, 230, 230, 1);
-              " label="维修考核时间 :">
+              " label="维修考核时间 :" v-if="ruleForm.userzzId != 4">
               <div class="kaohe">
               <div class="kaohe">
                 <el-input v-model="ruleForm.maintenanceTime" :clearable="false" placeholder="考核时间" style="width: 150px">
                 <el-input v-model="ruleForm.maintenanceTime" :clearable="false" placeholder="考核时间" style="width: 150px">
                   <template #suffix>
                   <template #suffix>
@@ -210,17 +242,27 @@ const tableData = reactive({
 // 添加员工弹窗数据 (------------------------------------)
 // 添加员工弹窗数据 (------------------------------------)
 const dialongTitle = ref("添加员工"); // 弹窗标题
 const dialongTitle = ref("添加员工"); // 弹窗标题
 
 
-const checkAll = ref(false); // 判断物品种类是否全选
-const isIndeterminate = ref(false); // 不确定状态,表示只选择一部分
-const checkedCities = ref([]); // 选中的数据
+// 种类选择框数据
+const articleAll = ref(false); // 判断物品种类是否全选
+const articleIndeterminate = ref(false); // 不确定状态,表示只选择一部分
+const articleIdsList = ref(); //  关联种类 类型数据
+const articleIdsListM = ref(); //  关联种类 类型数据
+const articleIdsListH = ref(); //  关联种类 类型数据
+
+
+// 楼栋选择框数据
+const buildAll = ref(false); // 判断楼栋 是否全选
+const buildIndeterminate = ref(false); // 不确定状态,表示只选择一部分
+const treeValue = reactive({
+  list: [],
+  listM: [],
+  listH: [],
+}); // 关联楼栋 树形结构数据
 
 
 const userzzIdsList = ref(); //  身份下拉数据
 const userzzIdsList = ref(); //  身份下拉数据
 const workTypeList = ref(); //  工种下拉数据
 const workTypeList = ref(); //  工种下拉数据
 const props = reactive();
 const props = reactive();
-const articleIdsList = ref(); //  关联报修类型数据
-const treeValue = reactive({
-  list: [],
-}); // 关联楼栋树形结构数据
+
 
 
 const searchInput = reactive({
 const searchInput = reactive({
   keyWord: "",
   keyWord: "",
@@ -247,13 +289,36 @@ const ruleForm = reactive({
   userPhone: "",
   userPhone: "",
   schoolId: "",
   schoolId: "",
   workType: "",
   workType: "",
-  articleIds: [],
-  buildIds: [],
+  articleBuilds: [],
+  // articleIds: [],
+  // buildIds: [],
   teamId: "",
   teamId: "",
   acceptanceTime: "",
   acceptanceTime: "",
   maintenanceTime: "",
   maintenanceTime: "",
   id: "",
   id: "",
 });
 });
+const articleBuilds = reactive({ list: [] }) // 选中的种类和楼栋组合数据
+const clickArticleSel = reactive({
+  id: "", name: ""
+}); // 点击的那个种类
+
+// 关联报修类型验证
+const articleBuildRule = (rule, value, callback) => {
+  console.log(rule, value);
+  let sum = 0
+  articleBuilds.list.forEach(item => {
+    if (item.article.flag) {
+      sum = item.build.length + sum
+      console.log(sum);
+    }
+  }, 0)
+  // console.log(sum);
+  if (sum) {
+    callback();
+  } else {
+    callback(new Error("关联报修类型不能为空"));
+  }
+};
 // 表单验证
 // 表单验证
 const rules = reactive({
 const rules = reactive({
   // serial: [{ required: true, message: "序列号不能为空", trigger: "blur" }],
   // serial: [{ required: true, message: "序列号不能为空", trigger: "blur" }],
@@ -261,11 +326,15 @@ const rules = reactive({
   cardNumber: [
   cardNumber: [
     { required: true, message: "微校卡号不能为空", trigger: "blur" },
     { required: true, message: "微校卡号不能为空", trigger: "blur" },
   ],
   ],
-  userzzId: [{ required: true, message: "身份不能为空", trigger: "blur" }],
+  userzzId: [{ required: true, message: "身份不能为空", trigger: "change" }],
   userPhone: [{ required: true, message: "手机号码不能为空", trigger: "blur" }],
   userPhone: [{ required: true, message: "手机号码不能为空", trigger: "blur" }],
   schoolId: [{ required: true, message: "校区不能为空", trigger: "blur" }],
   schoolId: [{ required: true, message: "校区不能为空", trigger: "blur" }],
-  workType: [{ required: true, message: "工种不能为空", trigger: "blur" }],
-  teamId: [{ required: true, message: "维修班不能为空", trigger: "blur" }],
+  workType: [{ required: true, message: "工种不能为空", trigger: "change" }],
+  teamId: [{ required: true, message: "维修班不能为空", trigger: "change" }],
+  articleBuilds: [
+    // { required: true, message: "关联报修类型不能为空", trigger: "blur" },
+    { required: true, validator: articleBuildRule, trigger: "blur" },
+  ],
   articleIds: [
   articleIds: [
     { required: true, message: "关联报修类型不能为空", trigger: "blur" },
     { required: true, message: "关联报修类型不能为空", trigger: "blur" },
   ],
   ],
@@ -336,82 +405,170 @@ const searchBtn = lodash.debounce(async () => {
   getList();
   getList();
 }, 300);
 }, 300);
 
 
+// 关联种类和关联楼栋数据
+// const treeValueList = async (val) => {
+//   //  报修(故障类型)类型关联 (接口-------)
+//   let data = {
+//     schoolId: val,
+//   };
+//   let resss = await axios({
+//     method: "get",
+//     url: api.value + "/repairArticleType/queryRepairArticleType",
+//     headers: {
+//       token: sessionStorage.getItem("token"),
+//       user_head: sessionStorage.getItem("userhead"),
+//     },
+//     params: data,
+//   });
+//   console.log(resss, "报修(故障类型)类型关联数据");
+//   articleIdsList.value = resss.data.data;
+
+//   // 关联楼栋数据 (接口---------)
+//   let datas = { schoolId: val };
+//   let res = await axios({
+//     method: "get",
+//     url: api.value + "/repairArea/queryRepairAreaSecond",
+//     headers: {
+//       token: sessionStorage.getItem("token"),
+//       user_head: sessionStorage.getItem("userhead"),
+//     },
+//     params: datas,
+//   });
+//   console.log(res, "关联楼栋数据");
+//   treeValue.list = res.data.data;
+
+//   // 黄家湖校区
+//   // if (val == 1) {
+//   //   articleIdsListH.value = resss.data.data;
+//   //   treeValue.listH = res.data.data;
+//   // } // 墨轩湖
+//   // else {
+//   //   articleIdsListM.value = resss.data.data;
+//   //   treeValue.listM = res.data.data;
+//   // }
+// }
+
+// 切换身份时将种类和楼栋全部置空
+const changeUserZzid = (val) => {
+  clickArticleSel.id = ""
+  clickArticleSel.name = ""
+  if (articleBuilds.list) {
+    articleBuilds.list.forEach(item => {
+      item.article.flag = false;
+      item.build = []
+    })
+  }
+  nextTick(() => {
+    articleIdsRef.value.setCheckedKeys([]);
+    buildIdsRef.value.setCheckedKeys([]);
+  });
+}
+
 // 改变校区  关联楼栋和关联报修类型也改变(---------------)
 // 改变校区  关联楼栋和关联报修类型也改变(---------------)
 const changeSchool = async (val) => {
 const changeSchool = async (val) => {
-  ruleForm.articleIds = [];
-  ruleForm.buildIds = [];
+  // ruleForm.articleIds = [];
+  // ruleForm.buildIds = [];
+  clickArticleSel.id = "";
+  clickArticleSel.name = "";
+  console.log(clickArticleSel);
+
   nextTick(() => {
   nextTick(() => {
+    // if (articleIdsRef.value && buildIdsRef.value) {
     articleIdsRef.value.setCheckedKeys([]);
     articleIdsRef.value.setCheckedKeys([]);
     buildIdsRef.value.setCheckedKeys([]);
     buildIdsRef.value.setCheckedKeys([]);
+    // }
   });
   });
-  if (val == 1) {
-    ruleForm.schoolId = 1;
-  } else {
-    ruleForm.schoolId = 2;
-  }
-  //  报修(故障类型)类型关联 (接口-------)
-  let data = {
-    schoolId: val,
-  };
-  let resss = await axios({
-    method: "get",
-    url: api.value + "/repairArticleType/queryRepairArticleType",
-    headers: {
-      token: sessionStorage.getItem("token"),
-      user_head: sessionStorage.getItem("userhead"),
-    },
-    params: data,
-  });
-  console.log(resss, "报修(故障类型)类型关联数据");
-  articleIdsList.value = resss.data.data;
-  // 关联楼栋数据 (接口---------)
-  let datas = { schoolId: val };
-  let res = await axios({
-    method: "get",
-    url: api.value + "/repairArea/queryRepairAreaSecond",
-    headers: {
-      token: sessionStorage.getItem("token"),
-      user_head: sessionStorage.getItem("userhead"),
-    },
-    params: datas,
+  return new Promise(async (resolve, reject) => {
+    /* 你的逻辑代码 */
+    //  报修(故障类型)类型关联 (接口-------)
+    let data = {
+      schoolId: val,
+    };
+    let resss = await axios({
+      method: "get",
+      url: api.value + "/repairArticleType/queryRepairArticleType",
+      headers: {
+        token: sessionStorage.getItem("token"),
+        user_head: sessionStorage.getItem("userhead"),
+      },
+      params: data,
+    });
+    console.log(resss, "报修(故障类型)类型关联数据");
+    articleIdsList.value = resss.data.data;
+
+    // 关联楼栋数据 (接口---------)
+    let datas = { schoolId: val };
+    let res = await axios({
+      method: "get",
+      url: api.value + "/repairArea/queryRepairAreaSecond",
+      headers: {
+        token: sessionStorage.getItem("token"),
+        user_head: sessionStorage.getItem("userhead"),
+      },
+      params: datas,
+    });
+    console.log(res, "关联楼栋数据");
+    treeValue.list = res.data.data;
+
+    articleBuilds.list = []
+    articleIdsList.value.forEach(item => {
+      articleBuilds.list.push({
+        article: { id: item.id, name: item.name, flag: false },
+        build: [],
+        id: ""
+      })
+    })
+    console.log(articleBuilds.list, "整理的树形数据");
+    resolve('success')
+    console.log("1111111111111111111111111111111");
+
   });
   });
-  console.log(res, "关联楼栋数据");
-  treeValue.list = res.data.data;
+
 };
 };
 
 
 //新增员工 (--------------------------------------)
 //新增员工 (--------------------------------------)
 const addlist = async () => {
 const addlist = async () => {
   dialongTitle.value = "添加员工";
   dialongTitle.value = "添加员工";
-  nextTick(() => {
-    changeSchool(1);
-  });
   addDialogVisible.value = true;
   addDialogVisible.value = true;
   ruleForm.userName = "";
   ruleForm.userName = "";
   ruleForm.cardNumber = "";
   ruleForm.cardNumber = "";
   ruleForm.userzzId = "";
   ruleForm.userzzId = "";
   ruleForm.userPhone = "";
   ruleForm.userPhone = "";
   ruleForm.workType = "";
   ruleForm.workType = "";
-  ruleForm.articleIds = [];
-  ruleForm.buildIds = [];
+  // ruleForm.articleIds = [];
+  // ruleForm.buildIds = [];
   ruleForm.teamId = "";
   ruleForm.teamId = "";
   ruleForm.acceptanceTime = "";
   ruleForm.acceptanceTime = "";
   ruleForm.maintenanceTime = "";
   ruleForm.maintenanceTime = "";
+  ruleForm.schoolId = 1;
   ruleForm.id = "";
   ruleForm.id = "";
+  clickArticleSel.id = ""
+  clickArticleSel.name = ""
+
+  changeSchool(1)
+
   nextTick(() => {
   nextTick(() => {
     articleIdsRef.value.setCheckedKeys([]);
     articleIdsRef.value.setCheckedKeys([]);
     buildIdsRef.value.setCheckedKeys([]);
     buildIdsRef.value.setCheckedKeys([]);
   });
   });
 };
 };
-// 种类是否全选按钮
-// const handleCheckAllChange = (val) => {
+
+// 种类是否全选操作
+// const articleAllChange = (val) => {
 //   console.log(val);
 //   console.log(val);
 //   console.log(articleIdsList.value);
 //   console.log(articleIdsList.value);
-//   let checkedCitie = [];
-//   articleIdsList.value.forEach((item) => {
-//     checkedCitie.push(item.name);
-//   });
-//   checkedCities.value = val ? checkedCitie : [];
-//   isIndeterminate.value = false;
+//   let articleIds = []
+//   // 黄家湖
+//   if (val) {
+//     articleIdsList.value.forEach((item) => {
+//       articleIds.push(item.id);
+//     });
+//     articleIdsRef.value.setCheckedKeys(articleIds)
+//   } else {
+//     console.log("取消全选");
+//     articleIdsRef.value.setCheckedKeys([])
+//     // articleIndeterminate.value = false;
+//   }
 // };
 // };
 // //单独勾选种类
 // //单独勾选种类
 // const handleCheckedCitiesChange = (value) => {
 // const handleCheckedCitiesChange = (value) => {
@@ -422,60 +579,200 @@ const addlist = async () => {
 //     checkedCount > 0 && checkedCount < articleIdsList.value.length;
 //     checkedCount > 0 && checkedCount < articleIdsList.value.length;
 // };
 // };
 
 
-// 关联报修类型  当复选框被点击的时候触发
+// 单独勾选种类 当复选框被点击的时候触发
 const handleArticleIds = (data, checked, indeterminate) => {
 const handleArticleIds = (data, checked, indeterminate) => {
-  console.log(data, checked, indeterminate);
+  console.log(data, checked, indeterminate, "单独勾选种类");
   // let keys = articleIdsRef.value.getCheckedNodes();
   // let keys = articleIdsRef.value.getCheckedNodes();
+
+  // 判断当前勾选的是哪个种类
+  // if (checked) {
+  //   clickArticleSel.name = data.name
+  //   clickArticleSel.id = data.id
+  // }
+  clickArticleSel.name = data.name
+  clickArticleSel.id = data.id
+
   let keys = articleIdsRef.value.getCheckedKeys();
   let keys = articleIdsRef.value.getCheckedKeys();
-  // console.log(keys);
-  // let arr = [];
-  // keys.forEach((item) => {
-  //   if (item.parentId != 1) {
-  //     arr.push(item.id);
-  //   }
-  // });
-  ruleForm.articleIds = keys;
+  console.log(keys);
+  // 黄家湖
+  // if (keys.length == articleIdsList.value.length) {
+  //   articleIndeterminate.value = false;
+  //   articleAll.value = true
+  // } else if (keys.length) {
+  //   articleAll.value = false
+  //   articleIndeterminate.value = true;
+  // } else {
+  //   articleAll.value = false
+  //   articleIndeterminate.value = false;
+  // }
+
+  // 判断是否勾选时赋值
+  articleBuilds.list.forEach(item => {
+    // console.log(item);
+
+    if (item.article.id == data.id) {
+      item.article.flag = checked
+      // if (item.article.flag) {
+      // buildIdsRef.value.setCheckedKeys(item.build);
+      // }
+      buildIdsRef.value.setCheckedKeys(item.build);
+    }
+  })
+
+  console.log(articleBuilds.list);
+  // ruleForm.articleIds = keys;
 };
 };
-//  关联楼栋 当复选框被点击的时候触发
+
+// 关联种类 被点击时触发
+const articleNodeClick = (data, node, component) => {
+  //  * @description: node - click 节点被点击时的回调
+  //  * @param {*} data 该节点所对应的对象
+  //  * @param {*} node 节点对应的 Node
+  //  * @param {*} component 节点组件本身
+  console.log('子组件触发 node-click 事件', data, node, component);
+  // 判断是否击
+  clickArticleSel.name = data.name
+  clickArticleSel.id = data.id
+  articleBuilds.list.forEach(item => {
+    // console.log(item);
+
+    if (item.article.id == data.id) {
+      // item.article.flag = checked
+      // if (item.article.flag) {
+      // buildIdsRef.value.setCheckedKeys(item.build);
+      // }
+      buildIdsRef.value.setCheckedKeys(item.build);
+    }
+  })
+}
+
+//  关联楼栋 当复选框被勾选的时候触发
 const handleCheckChange = (data, checked, indeterminate) => {
 const handleCheckChange = (data, checked, indeterminate) => {
   // console.log(data, checked);
   // console.log(data, checked);
   let keys = buildIdsRef.value.getCheckedNodes();
   let keys = buildIdsRef.value.getCheckedNodes();
+  console.log(keys);
+
+  // let buildAllLength = 0;
+  // buildAllLength = treeValue.list.reduce((pre, cur) => {
+  //   return cur.children.length + pre
+  // }, treeValue.list.length)
+
+  // if (keys.length == buildAllLength) {
+  //   buildIndeterminate.value = false;
+  //   buildAll.value = true
+  // } else if (keys.length) {
+  //   buildAll.value = false
+  //   buildIndeterminate.value = true;
+  // } else {
+  //   buildAll.value = false
+  //   buildIndeterminate.value = false;
+  // }
+
   let arr = [];
   let arr = [];
   keys.forEach((item) => {
   keys.forEach((item) => {
     if (item.parentId != 1) {
     if (item.parentId != 1) {
       arr.push(item.id);
       arr.push(item.id);
     }
     }
   });
   });
-  ruleForm.buildIds = arr;
+  articleBuilds.list.forEach(item => {
+    if (item.article.id == clickArticleSel.id) {
+      item.build = arr
+    }
+  })
+  console.log(articleBuilds.list);
 };
 };
 
 
+// 楼栋被全选时
+const buildAllChange = (val) => {
+  console.log(val);
+  console.log(treeValue.list);
+
+  nextTick(() => {
+    if (val) {
+      let buildIds = []
+      treeValue.list.forEach(item => {
+        item.children.forEach(i => {
+          buildIds.push(i.id)
+        })
+      })
+      buildIdsRef.value.setCheckedKeys(buildIds);
+    } else {
+      buildIdsRef.value.setCheckedKeys([]);
+    }
+  })
+}
+
 //编辑按钮  (-------------------------------------------)
 //编辑按钮  (-------------------------------------------)
 const edit = (row) => {
 const edit = (row) => {
-  changeSchool(row.schoolId);
-  // console.log(row.articleIds, row.buildIds);
   dialongTitle.value = "编辑员工";
   dialongTitle.value = "编辑员工";
   addDialogVisible.value = true;
   addDialogVisible.value = true;
-  ruleForm.userName = row.userName;
-  ruleForm.cardNumber = row.cardNumber;
-  ruleForm.userzzId = row.userZzid;
-  ruleForm.userPhone = row.userPhone;
-  ruleForm.schoolId = row.schoolId;
-  ruleForm.workType = row.workType;
-  ruleForm.teamId = row.teamId;
-  ruleForm.acceptanceTime = row.acceptanceTime;
-  ruleForm.maintenanceTime = row.maintenanceTime;
-  ruleForm.id = row.id;
-  nextTick(() => {
-    articleIdsRef.value.setCheckedKeys(row.articleIds);
-    buildIdsRef.value.setCheckedKeys(row.buildIds);
-  });
-  ruleForm.articleIds = row.articleIds;
-  ruleForm.buildIds = row.buildIds;
+
+  clickArticleSel.id = "";
+  clickArticleSel.name = "";
+
+  changeSchool(row.schoolId).then(res => {
+    if (row.userZzid == 4) {
+      ruleForm.userName = row.userName;
+      ruleForm.userzzId = row.userZzid;
+      ruleForm.workType = row.workType;
+      ruleForm.teamId = row.teamId;
+      ruleForm.schoolId = row.schoolId;
+      ruleForm.id = row.id;
+    } else {
+      ruleForm.userName = row.userName;
+      ruleForm.cardNumber = row.cardNumber;
+      ruleForm.userzzId = row.userZzid;
+      ruleForm.userPhone = row.userPhone;
+      ruleForm.schoolId = row.schoolId;
+      ruleForm.workType = row.workType;
+      ruleForm.teamId = row.teamId;
+      ruleForm.acceptanceTime = row.acceptanceTime;
+      ruleForm.maintenanceTime = row.maintenanceTime;
+      ruleForm.id = row.id;
+
+      let articleArr = []
+      articleBuilds.list.forEach(item => {
+        row.articleBuilds.forEach(i => {
+          if (item.article.id == i.articleId) {
+            console.log(item);
+
+            articleArr.push(i.articleId)
+            item.article.flag = true;
+            item.id = i.id;
+            item.build = i.buildIds;
+          }
+        })
+      })
+      console.log(articleArr);
+
+      nextTick(() => {
+        articleIdsRef.value.setCheckedKeys(articleArr);
+        // buildIdsRef.value.setCheckedKeys(row.buildIds);
+      });
+      // ruleForm.articleIds = row.articleIds;
+      // ruleForm.buildIds = row.buildIds;
+    }
+  })
+  console.log(row);
+  // console.log(row.articleIds, row.buildIds);
+
+  // let keys = row.articleIds;
+  // if (keys.length == articleIdsList.value.length) {
+  //   articleIndeterminate.value = false;
+  //   articleAll.value = true
+  // } else if (keys.length) {
+  //   articleAll.value = false
+  //   articleIndeterminate.value = true;
+  // } else {
+  //   articleAll.value = false
+  //   articleIndeterminate.value = false;
+  // }
+
 };
 };
 // 取消添加员工
 // 取消添加员工
 const cancelAdd = () => {
 const cancelAdd = () => {
-  ruleForm.articleIds = [];
-  ruleForm.buildIds = [];
+  // ruleForm.articleIds = [];
+  // ruleForm.buildIds = [];
   nextTick(() => {
   nextTick(() => {
     articleIdsRef.value.setCheckedKeys([]);
     articleIdsRef.value.setCheckedKeys([]);
     buildIdsRef.value.setCheckedKeys([]);
     buildIdsRef.value.setCheckedKeys([]);
@@ -489,19 +786,41 @@ const submitAdd = async (formEl) => {
   await formEl.validate(async (valid, fields) => {
   await formEl.validate(async (valid, fields) => {
     if (valid) {
     if (valid) {
       if (dialongTitle.value == "添加员工") {
       if (dialongTitle.value == "添加员工") {
-        let data = {
-          userName: ruleForm.userName,
-          cardNumber: ruleForm.cardNumber,
-          userZzid: ruleForm.userzzId,
-          userPhone: ruleForm.userPhone,
-          schoolId: ruleForm.schoolId,
-          workType: ruleForm.workType,
-          articleIds: ruleForm.articleIds,
-          buildIds: ruleForm.buildIds,
-          teamId: ruleForm.teamId,
-          acceptanceAssessTime: ruleForm.acceptanceTime,
-          maintenanceAssessTime: ruleForm.maintenanceTime,
-        };
+        // 如果身份为 线下人员(4),做出以下判断
+        let data = {}
+        if (ruleForm.userzzId == 4) {
+          data = {
+            userName: ruleForm.userName, // 名字
+            userZzid: ruleForm.userzzId, // 身份Id
+            schoolId: ruleForm.schoolId, // 校区Id
+            workType: ruleForm.workType, // 工作Id
+            teamId: ruleForm.teamId      // 维修班Id
+          }
+        } else {
+          let arr = []
+          articleBuilds.list.forEach(item => {
+            if (item.article.flag && item.build.length != 0) {
+              arr.push({
+                articleId: item.article.id,
+                buildIds: item.build
+              })
+            }
+          })
+          data = {
+            userName: ruleForm.userName,
+            cardNumber: ruleForm.cardNumber,
+            userZzid: ruleForm.userzzId,
+            userPhone: ruleForm.userPhone,
+            schoolId: ruleForm.schoolId,
+            teamId: ruleForm.teamId,
+            workType: ruleForm.workType,
+            // articleIds: ruleForm.articleIds,
+            // buildIds: ruleForm.buildIds,
+            acceptanceAssessTime: ruleForm.acceptanceTime,
+            maintenanceAssessTime: ruleForm.maintenanceTime,
+            articleBuilds: arr
+          };
+        }
         console.log(data, "添加员工数据");
         console.log(data, "添加员工数据");
 
 
         let res = await axios({
         let res = await axios({
@@ -522,8 +841,8 @@ const submitAdd = async (formEl) => {
             message: res.data.message,
             message: res.data.message,
             center: true,
             center: true,
           });
           });
-          ruleForm.articleIds = [];
-          ruleForm.buildIds = [];
+          // ruleForm.articleIds = [];
+          // ruleForm.buildIds = [];
           nextTick(() => {
           nextTick(() => {
             articleIdsRef.value.setCheckedKeys([]);
             articleIdsRef.value.setCheckedKeys([]);
             buildIdsRef.value.setCheckedKeys([]);
             buildIdsRef.value.setCheckedKeys([]);
@@ -539,20 +858,44 @@ const submitAdd = async (formEl) => {
           });
           });
         }
         }
       } else {
       } else {
-        let data = {
-          userName: ruleForm.userName,
-          cardNumber: ruleForm.cardNumber,
-          userZzid: ruleForm.userzzId,
-          userPhone: ruleForm.userPhone,
-          schoolId: ruleForm.schoolId,
-          workType: ruleForm.workType,
-          articleIds: ruleForm.articleIds,
-          buildIds: ruleForm.buildIds,
-          teamId: ruleForm.teamId,
-          acceptanceAssessTime: ruleForm.acceptanceTime,
-          maintenanceAssessTime: ruleForm.maintenanceTime,
-          id: ruleForm.id,
-        };
+        // 如果身份为 线下人员(4),做出以下判断
+        let data = {}
+        if (ruleForm.userzzId == 4) {
+          data = {
+            userName: ruleForm.userName, // 名字
+            userZzid: ruleForm.userzzId, // 身份Id
+            schoolId: ruleForm.schoolId, // 校区Id
+            workType: ruleForm.workType, // 工作Id
+            teamId: ruleForm.teamId,     // 维修班Id
+            id: ruleForm.id              // 数据ID
+          }
+        } else {
+          let arr = []
+          articleBuilds.list.forEach(item => {
+            if (item.article.flag && item.build.length != 0) {
+              arr.push({
+                articleId: item.article.id,
+                buildIds: item.build,
+                id: item.id
+              })
+            }
+          })
+          data = {
+            userName: ruleForm.userName,
+            cardNumber: ruleForm.cardNumber,
+            userZzid: ruleForm.userzzId,
+            userPhone: ruleForm.userPhone,
+            schoolId: ruleForm.schoolId,
+            workType: ruleForm.workType,
+            articleIds: ruleForm.articleIds,
+            buildIds: ruleForm.buildIds,
+            teamId: ruleForm.teamId,
+            acceptanceAssessTime: ruleForm.acceptanceTime,
+            maintenanceAssessTime: ruleForm.maintenanceTime,
+            id: ruleForm.id,
+            articleBuilds: arr
+          };
+        }
         console.log(data, "修改员工数据");
         console.log(data, "修改员工数据");
         let res = await axios({
         let res = await axios({
           method: "post",
           method: "post",
@@ -572,8 +915,8 @@ const submitAdd = async (formEl) => {
             message: res.data.message,
             message: res.data.message,
             center: true,
             center: true,
           });
           });
-          ruleForm.articleIds = [];
-          ruleForm.buildIds = [];
+          // ruleForm.articleIds = [];
+          // ruleForm.buildIds = [];
           nextTick(() => {
           nextTick(() => {
             articleIdsRef.value.setCheckedKeys([]);
             articleIdsRef.value.setCheckedKeys([]);
             buildIdsRef.value.setCheckedKeys([]);
             buildIdsRef.value.setCheckedKeys([]);
@@ -729,6 +1072,8 @@ onBeforeMount(async () => {
   console.log(ress, "查询工种下拉数据");
   console.log(ress, "查询工种下拉数据");
   workTypeList.value = ress.data.data;
   workTypeList.value = ress.data.data;
 
 
+  // treeValueList(1) // 调用黄家湖 种类和楼栋 数据
+  // treeValueList(2) // 调用墨轩湖 种类和楼栋 数据
   getList();
   getList();
 });
 });
 onUnmounted(() => {
 onUnmounted(() => {
@@ -922,7 +1267,7 @@ onUnmounted(() => {
 
 
       .el-dialog__body {
       .el-dialog__body {
         padding: 30px 20px 10px 20px;
         padding: 30px 20px 10px 20px;
-        height: 700px;
+        max-height: 700px;
         overflow: auto;
         overflow: auto;
 
 
         .el-input {
         .el-input {
@@ -930,17 +1275,57 @@ onUnmounted(() => {
         }
         }
 
 
         // 关联报修类型样式(-----------------)
         // 关联报修类型样式(-----------------)
-        // .checkbox {
-        //   .el-form-item__content {
-        //     display: flex;
-        //     flex-direction: column;
-        //     align-items: flex-start;
-        //     .el-checkbox-group {
-        //       display: flex;
-        //       flex-direction: column;
-        //     }
-        //   }
-        // }
+        .checkbox {
+
+
+
+          .el-form-item__content {
+            // width: 200px;
+            // display: flex;
+            // flex-direction: column;
+            // align-items: flex-start;
+            // border: 1px solid red;
+
+            .type {
+              display: flex;
+
+              .articleType {
+                padding-right: 30px;
+
+                .el-tree {
+                  .el-tree-node__content {
+                    .el-icon {
+                      display: none;
+                    }
+                  }
+
+                  .custom-tree-node {
+                    display: flex;
+                    align-items: center;
+
+                    img {
+                      width: 18px;
+                      margin-left: 5px;
+                    }
+                  }
+                }
+              }
+
+              .buildType {
+                .allAriticle {
+                  margin-left: 24px;
+                }
+              }
+            }
+
+            .articleTitle {
+              font-weight: 600;
+            }
+
+
+
+          }
+        }
 
 
         .options {
         .options {
           .el-form-item__content {
           .el-form-item__content {

+ 340 - 25
src/views/workOrder/workOrder.vue

@@ -177,10 +177,12 @@
               <div class="btns" v-if="scope.row.close == 1" @click="customsOrder(scope.row)">
               <div class="btns" v-if="scope.row.close == 1" @click="customsOrder(scope.row)">
                 关单
                 关单
               </div>
               </div>
-              <!-- <div class="btns" v-if="scope.row.changePrice == 1" @click="changePrice(scope.row)">
+              <div class="btns" v-if="scope.row.offline == 1" @click="offline(scope.row)">
+                转线下审核
+              </div>
+              <div class="btns" v-if="scope.row.changePrice == 1" @click="changePrice(scope.row)">
                 改价
                 改价
-              </div> -->
-              <div class="btns" v-if="scope.row.changePrice == 1" @click="changePrice(scope.row)">改价</div>
+              </div>
               <div class="btns" v-if="scope.row.reply == 1" @click="reply(scope.row)">
               <div class="btns" v-if="scope.row.reply == 1" @click="reply(scope.row)">
                 回复
                 回复
               </div>
               </div>
@@ -601,11 +603,11 @@
               <el-input v-model="transOrderData.remark" :rows="3" type="textarea" show-word-limit placeholder="此处为备注内容" />
               <el-input v-model="transOrderData.remark" :rows="3" type="textarea" show-word-limit placeholder="此处为备注内容" />
             </div>
             </div>
           </el-form-item>
           </el-form-item>
-          <el-form-item label="身份 :" prop="userId">
+          <!-- <el-form-item label="身份 :" prop="userId">
             <el-select v-model="transOrderData.userId" placeholder="请选择派单人员">
             <el-select v-model="transOrderData.userId" placeholder="请选择派单人员">
               <el-option v-for="item in transOrderObj.list" :key="item.id" :label="item.userName" :value="item.id" />
               <el-option v-for="item in transOrderObj.list" :key="item.id" :label="item.userName" :value="item.id" />
             </el-select>
             </el-select>
-          </el-form-item>
+          </el-form-item> -->
           <el-form-item label="选择师傅 :" prop="userId">
           <el-form-item label="选择师傅 :" prop="userId">
             <el-select v-model="transOrderData.userId" placeholder="请选择派单人员">
             <el-select v-model="transOrderData.userId" placeholder="请选择派单人员">
               <el-option v-for="item in transOrderObj.list" :key="item.id" :label="item.userName" :value="item.id" />
               <el-option v-for="item in transOrderObj.list" :key="item.id" :label="item.userName" :value="item.id" />
@@ -645,6 +647,72 @@
           </el-form-item>
           </el-form-item>
         </el-form>
         </el-form>
       </el-dialog>
       </el-dialog>
+      <!-- 转线下审核 弹窗 -->
+      <el-dialog class="transOrder" v-model="offlineVisible" :close-on-click-modal="false" :close-on-press-escape="false"
+        title="转线下审核" align-center width="560" :before-close="cancelOffline">
+        <el-form ref="ruleFormOffline" :model="offlineData" status-icon :rules="offlineRules" label-width="90px"
+          class="demo-ruleForm">
+          <el-form-item label="申请人 :" prop="userName">
+            <span>{{ offlineData.userName }}</span>
+          </el-form-item>
+          <el-form-item label="转单语音 :" prop="voice">
+            <div class="audio" @click="offlineAudioPlay">
+              <img src="@/assets/audio.png" alt="" />
+              <div class="audioNum">{{ offlineData.voiceLength }}"</div>
+              <!-- <button class="butt" @click="bofang">确认</button> -->
+              <audio ref="offlineAudio" class="aud" :src="offlineData.voice"></audio>
+            </div>
+            <!-- <div>{{ transOrderData.voice }}</div> -->
+          </el-form-item>
+          <el-form-item label="备注 :" prop="remark">
+            <div class="content">
+              <el-input v-model="offlineData.remark" :rows="3" type="textarea" show-word-limit placeholder="此处为备注内容" />
+            </div>
+          </el-form-item>
+          <!-- <el-form-item label="身份 :" prop="userId">
+            <el-select v-model="transOrderData.userId" placeholder="请选择派单人员">
+              <el-option v-for="item in transOrderObj.list" :key="item.id" :label="item.userName" :value="item.id" />
+            </el-select>
+          </el-form-item> -->
+          <el-form-item label="选择师傅 :" prop="userId">
+            <el-select v-model="offlineData.userId" placeholder="请选择派单人员">
+              <el-option v-for="item in offlineObj.list" :key="item.id" :label="item.userName" :value="item.id" />
+            </el-select>
+          </el-form-item>
+
+          <el-form-item>
+            <div class="options">
+              <el-button color="rgba(111, 182, 184, 1)" class="queding" type="primary"
+                @click="offlineYes(ruleFormOffline, 1)">
+                同意
+              </el-button>
+              <el-button @click="offlineYes(ruleFormOffline, 0)">拒绝
+              </el-button>
+            </div>
+          </el-form-item>
+        </el-form>
+      </el-dialog>
+      <!-- 拒绝转线下审核 -->
+      <el-dialog class="transOrder" v-model="refuseOfflineVisible" :close-on-click-modal="false"
+        :close-on-press-escape="false" title="拒绝转线下审核" align-center width="400" :before-close="cancelRefuseOffline">
+        <el-form ref="refuseOffline" :model="refuseOfflineData" status-icon :rules="refuseOfflineRules" label-width="90px"
+          class="demo-ruleForm">
+          <el-form-item label="留言 :" prop="remark">
+            <el-input v-model="refuseOfflineData.remark" :rows="5" type="textarea" show-word-limit
+              placeholder="请输入备审批意见" />
+          </el-form-item>
+          <el-form-item>
+            <div class="options">
+              <el-button color="rgba(111, 182, 184, 1)" class="queding" type="primary"
+                @click="refuseOfflineYes(refuseOffline)">
+                确定
+              </el-button>
+              <el-button @click="cancelRefuseOffline(refuseOffline)">取消
+              </el-button>
+            </div>
+          </el-form-item>
+        </el-form>
+      </el-dialog>
       <!-- 关单 弹窗 -->
       <!-- 关单 弹窗 -->
       <el-dialog class="customsOrder" v-model="customsOrderVisible" :close-on-click-modal="false"
       <el-dialog class="customsOrder" v-model="customsOrderVisible" :close-on-click-modal="false"
         :close-on-press-escape="false" title="关单" align-center width="560" :before-close="cancelCustomsOrder">
         :close-on-press-escape="false" title="关单" align-center width="560" :before-close="cancelCustomsOrder">
@@ -809,12 +877,12 @@
         <div class="content" id="printWrapper">
         <div class="content" id="printWrapper">
           <div class="title">
           <div class="title">
             <span>校园报修系统</span>
             <span>校园报修系统</span>
-            <span>打印时间:2023-10-10 10:22:10 操作人:张三</span>
+            <span>打印时间:{{ nowTime }} &nbsp;&nbsp;操作人:{{ printData.list.operator }}</span>
           </div>
           </div>
           <!-- <h3>故障报修</h3> -->
           <!-- <h3>故障报修</h3> -->
           <div class="title">
           <div class="title">
-            <span>南昌交通学校</span>
-            <span>工单号: 4956654622</span>
+            <span>{{ printData.list.schoolName }}</span>
+            <span>工单号: {{ printData.list.recordNo }}</span>
           </div>
           </div>
           <div class="printTable">
           <div class="printTable">
             <table border="1" Cellspacing="0">
             <table border="1" Cellspacing="0">
@@ -823,50 +891,50 @@
               </tr>
               </tr>
               <tr>
               <tr>
                 <td class="item">报修人</td>
                 <td class="item">报修人</td>
-                <td class="value">张三</td>
+                <td class="value">{{ printData.list.userName }}</td>
                 <td class="item">年级</td>
                 <td class="item">年级</td>
-                <td class="value">学生/人工智能/智能2021-4</td>
+                <td class="value">{{ printData.list.userClass }}</td>
               </tr>
               </tr>
               <tr>
               <tr>
                 <td class="item">手机</td>
                 <td class="item">手机</td>
-                <td class="value">张三</td>
+                <td class="value">{{ printData.list.userPhone }}</td>
                 <td class="item">区域</td>
                 <td class="item">区域</td>
-                <td class="value">学生/人工智能/智能2021-4</td>
+                <td class="value">{{ printData.list.areaId }}</td>
               </tr>
               </tr>
               <tr>
               <tr>
                 <td class="item">报修物品</td>
                 <td class="item">报修物品</td>
-                <td class="value">张三</td>
+                <td class="value">{{ printData.list.articleName }}</td>
                 <td class="item">报修时间</td>
                 <td class="item">报修时间</td>
-                <td class="value">学生/人工智能/智能2021-4</td>
+                <td class="value">{{ printData.list.reportTime }}</td>
               </tr>
               </tr>
               <tr>
               <tr>
                 <td class="item">故障描述</td>
                 <td class="item">故障描述</td>
                 <td Colspan="3" class="textarea">
                 <td Colspan="3" class="textarea">
-                  学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4
+                  {{ printData.list.description }}
                 </td>
                 </td>
               </tr>
               </tr>
               <tr>
               <tr>
                 <td class="item">维修师傅</td>
                 <td class="item">维修师傅</td>
-                <td Colspan="3">张三</td>
+                <td Colspan="3">{{ printData.list.maintenancerName }}</td>
               </tr>
               </tr>
               <tr>
               <tr>
                 <td class="item">手机号码</td>
                 <td class="item">手机号码</td>
-                <td class="value">张三</td>
+                <td class="value">{{ printData.list.maintenancerPhone }}</td>
                 <td class="item">状态</td>
                 <td class="item">状态</td>
-                <td class="value">学生/人工智能/智能2021-4</td>
+                <td class="value">{{ printData.list.state }}</td>
               </tr>
               </tr>
               <tr>
               <tr>
-                <td class="item">支付金额</td>
-                <td class="value">20</td>
-                <td class="item">退款金额</td>
-                <td class="value">12</td>
+                <td class="item">支付金额/元</td>
+                <td class="value">{{ printData.list.price }} </td>
+                <td class="item">退款金额/元</td>
+                <td class="value">{{ printData.list.refund }}</td>
               </tr>
               </tr>
-              <tr>
+              <!-- <tr>
                 <td class="item">备注</td>
                 <td class="item">备注</td>
                 <td class="textarea" Colspan="3">
                 <td class="textarea" Colspan="3">
                   学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4
                   学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4学生/人工智能/智能2021-4
                 </td>
                 </td>
-              </tr>
+              </tr> -->
             </table>
             </table>
             <div class="name">
             <div class="name">
               <span>后期签字: </span>
               <span>后期签字: </span>
@@ -1147,6 +1215,40 @@ const refusetransOrderRules = reactive({
   remark: [{ required: true, message: "审批意见不能为空", trigger: "blur" }],
   remark: [{ required: true, message: "审批意见不能为空", trigger: "blur" }],
 });
 });
 
 
+// 转线下审核 (--------------------------------------------)
+const offlineVisible = ref(false) // 转线下审核控制
+const offlineData = reactive({
+  id: "",
+  userName: "",
+  remark: "",
+  voice: "",
+  userId: "", // 被派单师傅id(下拉框)
+  voiceLength: "", // 录音长度
+});
+// 挑选中的对象
+const ruleFormOffline = ref();
+const offlineObj = reactive({
+  list: [],
+});
+// 转线下审核中审核对象数组
+const offlineAudio = ref(); // 语音对象
+// 转线下审核验证
+const offlineRules = reactive({
+  userName: [{ required: true, message: "申请人不能为空", trigger: "blur" }],
+  voice: [{ required: true, message: "转单语音不能为空", trigger: "blur" }],
+  userId: [{ required: true, message: "请选择派单人员", trigger: "blur" }],
+});
+// 拒绝转线下审核
+const refuseOffline = ref()
+const refuseOfflineVisible = ref(false)
+const refuseOfflineData = reactive({
+  remark: "",
+});
+// 拒绝转线下审核验证
+const refuseOfflineRules = reactive({
+  remark: [{ required: true, message: "拒绝转线下审核留言不能为空", trigger: "blur" }],
+});
+
 // 关单 (关单--------------------------------------------)
 // 关单 (关单--------------------------------------------)
 const customsOrderVisible = ref(false); // 关单弹窗
 const customsOrderVisible = ref(false); // 关单弹窗
 const customsOrderList = ref(); // 关单原因列表
 const customsOrderList = ref(); // 关单原因列表
@@ -1180,6 +1282,10 @@ const allPrice = ref(0) // 计算的数量总价格
 
 
 // 打印
 // 打印
 const printVisible = ref(false);
 const printVisible = ref(false);
+const nowTime = ref()
+const printData = reactive({
+  list: {}
+}) // 打印数据
 
 
 watch(selPriceList, (newVal, oldVal) => {
 watch(selPriceList, (newVal, oldVal) => {
   console.log(oldVal, "表格中的数据");
   console.log(oldVal, "表格中的数据");
@@ -1401,6 +1507,13 @@ const selSchool = async (val) => {
           state: 8,
           state: 8,
         });
         });
       }
       }
+      if (key == "offlineCount") {
+        day.value.push({
+          key: obj[key],
+          name: "转线下",
+          state: 9,
+        });
+      }
     });
     });
   } else {
   } else {
     ElMessage({
     ElMessage({
@@ -2142,6 +2255,183 @@ const cancelRefusetransOrder = () => {
   refusetransOrder.value.resetFields();
   refusetransOrder.value.resetFields();
 }
 }
 
 
+// 转线下审核(------------------------------------------------)
+const offline = async (row) => {
+  // console.log(row);
+  offlineVisible.value = true
+  let data = {
+    recordId: row.id
+  }
+  let res = await axios({
+    method: "get",
+    url: api.value + "/repairRecord/offlineDetail",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+  console.log(res, "转线下审核详情数据");
+  if (res.data.code == 200) {
+    offlineData.id = res.data.data.id
+    offlineData.userName = res.data.data.userName
+    offlineData.remark = res.data.data.remark
+    offlineData.voice = res.data.data.voice
+    offlineData.voiceLength = res.data.data.voiceLength
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+  // 下拉框人员数据
+  let datas = { recordId: row.id };
+  let ress = await axios({
+    method: "get",
+    url: api.value + "/repairUser/queryPageOfflineUsers",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: datas,
+  });
+  console.log(ress, "线下师傅下拉框数据");
+  if (ress.data.code == 200) {
+    offlineObj.list = ress.data.data.list;
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: ress.data.message,
+      center: true,
+    });
+  }
+}
+// 播放音频
+const offlineAudioPlay = () => {
+  if (offlineAudio.value.paused == true) {
+    offlineAudio.value.play();
+  } else {
+    offlineAudio.value.pause();
+    // clearInterval(timer);
+    // timer = null;
+  }
+};
+// 转线下操作(1同意,0拒绝)
+const offlineYes = async (formEl, flag) => {
+  // 同意
+  if (flag == 1) {
+    if (!formEl) return;
+    await formEl.validate(async (valid, fields) => {
+      if (valid) {
+        let data = {
+          id: offlineData.id,
+          userId: offlineData.userId,
+          approverStatu: 1,
+          remark: offlineData.remark,
+        };
+        console.log(data);
+
+        let res = await axios({
+          method: "post",
+          url: api.value + "/repairRecord/offline",
+          headers: {
+            token: sessionStorage.getItem("token"),
+            user_head: sessionStorage.getItem("userhead"),
+          },
+          data: data,
+        });
+        console.log(res, "确定转单审核");
+        if (res.data.code == 200) {
+          offlineAudio.value.load();
+          offlineVisible.value = false;
+          searchBtn();
+          ElMessage({
+            type: "success",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+        } else {
+          offlineAudio.value.load();
+          ElMessage({
+            type: "error",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+        }
+      }
+    }
+    )
+  }
+  // 拒绝
+  else {
+    refuseOfflineVisible.value = true
+    // console.log("确定拒绝", flag);
+  }
+}
+// 关闭转线下审核
+const cancelOffline = () => {
+  offlineVisible.value = false
+  ruleFormOffline.value.resetFields();
+  offlineAudio.value.load();
+}
+// 转线下审核拒绝 确认留言
+const refuseOfflineYes = async (formEl) => {
+  if (!formEl) return;
+  await formEl.validate(async (valid, fields) => {
+    if (valid) {
+      let data = {
+        id: offlineData.id,
+        approverStatu: 0,
+        refuseRemark: refuseOfflineData.remark
+      };
+      console.log(data, "拒绝转线下");
+
+      let res = await axios({
+        method: "post",
+        url: api.value + "/repairRecord/offline",
+        headers: {
+          token: sessionStorage.getItem("token"),
+          user_head: sessionStorage.getItem("userhead"),
+        },
+        data: data,
+      });
+      console.log(res, "转线下审核");
+      if (res.data.code == 200) {
+        offlineAudio.value.load();
+        offlineVisible.value = false;
+        refuseOfflineVisible.value = false
+        searchBtn();
+        ElMessage({
+          type: "success",
+          showClose: true,
+          message: res.data.message,
+          center: true,
+        });
+      } else {
+        offlineAudio.value.load();
+        ElMessage({
+          type: "error",
+          showClose: true,
+          message: res.data.message,
+          center: true,
+        });
+      }
+    }
+  }
+  )
+}
+// 转线下审核拒绝 留言取消
+const cancelRefuseOffline = () => {
+  refuseOfflineVisible.value = false
+  refuseOfflineData.remark = ""
+  refuseOffline.value.resetFields();
+}
+
 // 关单弹窗  (关单-----------------------------------------)
 // 关单弹窗  (关单-----------------------------------------)
 const customsOrder = (row) => {
 const customsOrder = (row) => {
   customsOrderVisible.value = true;
   customsOrderVisible.value = true;
@@ -2520,8 +2810,33 @@ const cancelChangePrice = () => {
 };
 };
 
 
 // 打印(----------------------------------------------------------------------------)
 // 打印(----------------------------------------------------------------------------)
-const printOrder = () => {
+const printOrder = async (row) => {
   printVisible.value = true;
   printVisible.value = true;
+  console.log(row);
+  nowTime.value = dayjs().format("YYYY-MM-DD HH:ss:mm")
+  let data = {
+    recordId: row.id,
+  };
+  let res = await axios({
+    method: "get",
+    url: api.value + "/repairRecord/queryPrintData",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+  console.log(res, "打印数据");
+  if (res.data.code == 200) {
+    printData.list = res.data.data
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
 };
 };
 const cancelPrint = () => {
 const cancelPrint = () => {
   printVisible.value = false;
   printVisible.value = false;