Ver código fonte

门锁管理 新增管理员下发密码,制作总密码,总密码明细功能

hzj18279462576@163.com 1 ano atrás
pai
commit
dfd56aadee

BIN
src/assets/icons/sendAdminPass.png


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

@@ -558,6 +558,8 @@ const mutations = {
             doorLock.jiesuoshebei = j.status;
           } else if (j.functionPoint == "NFC设置") {
             doorLock.nfcshezhi = j.status;
+          } else if (j.functionPoint == "下发管理员密码") {
+            doorLock.adminPass = j.status;
           } else if (j.functionPoint == "查看界面") {
             doorLock.chakanjiemian = j.status;
             if (j.status == 1) {
@@ -1053,6 +1055,8 @@ const actions = {
                 doorLock.jiesuoshebei = j.status;
               } else if (j.functionPoint == "NFC设置") {
                 doorLock.nfcshezhi = j.status;
+              } else if (j.functionPoint == "下发管理员密码") {
+                doorLock.adminPass = j.status;
               } else if (j.functionPoint == "查看界面") {
                 doorLock.chakanjiemian = j.status;
                 if (j.status == 1) {

+ 1 - 0
src/views/account/account.vue

@@ -108,6 +108,7 @@
               >
                 <el-tag
                   v-for="i in row.checkOrg"
+                  :key="i.name"
                   style="margin: 5px"
                   type="primary"
                   >{{ i.name }}</el-tag

+ 655 - 15
src/views/doorLock/doorLock.vue

@@ -44,6 +44,14 @@
               @click="identityCardClick('总卡', '总卡')"
               >制作总卡</el-button
             >
+            <el-button
+              style="margin-left: 20px"
+              color="rgba(41, 109, 227, 1)"
+              type="primary"
+              class="search"
+              @click="allPassClick"
+              >制作总密码</el-button
+            >
             <div class="condition" style="margin-left: 30px">
               <span>楼栋单元</span>
               <el-select
@@ -75,7 +83,7 @@
                 <el-option label="钟点房" value="2" />
               </el-select>
             </div>
-            <div class="condition" style="margin-left: 30px">
+            <div class="condition" style="margin-left: 20px">
               <el-button
                 color="rgba(41, 109, 227, 1)"
                 type="primary"
@@ -84,6 +92,15 @@
                 >总卡明细</el-button
               >
             </div>
+            <div class="condition" style="margin-left: 20px">
+              <el-button
+                color="rgba(41, 109, 227, 1)"
+                type="primary"
+                class="search"
+                @click="allPassDetailChange"
+                >总密码明细</el-button
+              >
+            </div>
           </div>
         </div>
         <div class="changeItems">
@@ -96,6 +113,7 @@
           </div>
           <div
             v-for="i in roomTypes"
+            :key="i"
             class="changeItem"
             :class="roomTypeIndex == i ? 'changeItem_active' : ''"
             @click="changeTypes(i)"
@@ -139,7 +157,7 @@
         </div> -->
       </div>
       <div class="footer" v-loading="loading">
-        <div class="floor" v-for="item in roomList.list">
+        <div class="floor" v-for="item in roomList.list" :key="item">
           <div class="title">
             <span class="t1"
               >{{ item.name }}
@@ -150,7 +168,7 @@
             <span class="t2"> / 共{{ item.total }}间</span>
           </div>
           <div class="roomList">
-            <div class="room" v-for="i in item.vos">
+            <div class="room" v-for="i in item.vos" :key="i">
               <el-popover
                 popper-class="roominfoPopper"
                 placement="bottom-start"
@@ -264,7 +282,7 @@
                         v-if="nfcFunction == 0 && flagBtn.daoru == 1"
                       >
                         <img
-                          class="deblocking"
+                          class=""
                           src="@/assets/icons/nfc.png"
                           alt=""
                         />
@@ -272,12 +290,20 @@
                       </div>
                       <div @click="nfcClick(i, 0)" v-if="nfcFunction == 1">
                         <img
-                          class="deblocking"
+                          class=""
                           src="@/assets/icons/nfc.png"
                           alt=""
                         />
                         <span>NFC禁用</span>
                       </div>
+                      <div @click="sendAdminPass(i)" v-if="flagBtn.adminPass == 1">
+                        <img
+                          class=""
+                          src="@/assets/icons/sendAdminPass.png"
+                          alt=""
+                        />
+                        <span>下发管理员密码</span>
+                      </div>
                     </div>
                   </div>
                 </div>
@@ -408,7 +434,7 @@
         width="400"
         :before-close="cancelUnlocking"
       >
-        <div class="middle">
+        <div class="middle" v-loading="unlockingLoading" element-loading-text="远程开锁中...">
           <div class="content">
             确定远程开锁吗?<br /><span class="marning"
               >注: 远程开锁前,门锁需要先按“4#”进入请求远程开锁模式</span
@@ -429,6 +455,111 @@
         </div>
       </el-dialog>
 
+      <!-- 制作总密码 -->
+      <el-dialog
+        class="passManagementDialog"
+        v-model="allPassVisible"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+        title="制作总密码"
+        align-center
+        width="650"
+        :before-close="cancelAllPass"
+      >
+        <el-form
+          ref="allPassRef"
+          :model="allPassRuleForm"
+          :rules="allPassRules"
+          label-width="100px"
+          class="demo-ruleForm"
+          :size="formSize"
+          label-position="left"
+          status-icon
+        >
+        <el-form-item
+            label="单元 :"
+            prop="buildingId"
+          >
+            <el-select
+              v-model="allPassRuleForm.buildingId"
+              placeholder="请选择楼栋单元"
+              style="width: 500px"
+              :clearable="true"
+            >
+              <el-option
+                v-for="item in buildData"
+                :key="item.id"
+                :label="`${item.building}-${item.element}`"
+                :value="item.id"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="用户 :" prop="name">
+            <el-select
+              v-model="allPassRuleForm.name"
+              class="m-2"
+              placeholder="请选择用户"
+              style="width: 500px"
+            >
+              <el-option
+                v-for="i in staffList"
+                :key="i"
+                :label="`${i.userName} ( ${i.department} )`"
+                :value="i.id"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="密码 :" prop="pass">
+            <el-input
+              v-model.trim="allPassRuleForm.pass"
+              placeholder="请输入6或8位数密码或者点击随机生成"
+              style="width: 500px"
+            >
+              <template #append>
+                <div @click="randomCipherAllPass">随机生成</div>
+              </template>
+            </el-input>
+          </el-form-item>
+          <el-form-item label="生效时间 :" prop="effectiveTime">
+            <div class="block">
+              <el-date-picker
+                v-model="allPassRuleForm.effectiveTime"
+                type="datetime"
+                placeholder="选择生效时间"
+                style="width: 500px"
+                format="YYYY-MM-DD HH:mm:ss"
+                value-format="YYYY-MM-DD HH:mm:ss"
+              />
+            </div>
+          </el-form-item>
+          <el-form-item label="失效时间 :" prop="failureTime">
+            <div class="block">
+              <el-date-picker
+                v-model="allPassRuleForm.failureTime"
+                type="datetime"
+                placeholder="选择失效时间"
+                style="width: 500px"
+                format="YYYY-MM-DD HH:mm:ss"
+                value-format="YYYY-MM-DD HH:mm:ss"
+              />
+            </div>
+          </el-form-item>
+          <el-form-item class="options">
+            <el-button
+              color="rgba(41, 109, 227, 1)"
+              class="queding"
+              type="primary"
+              @click="allPassConfig(allPassRef)"
+            >
+              确定
+            </el-button>
+            <el-button @click="cancelAllPass(allPassRef)"
+              >取消</el-button
+            >
+          </el-form-item>
+        </el-form>
+      </el-dialog>
+
       <!-- 绑定设备 -->
       <el-dialog
         class="BindingDialog"
@@ -694,7 +825,6 @@
                             width="220"
                             confirm-button-text="确认"
                             cancel-button-text="取消"
-                            :icon="InfoFilled"
                             icon-color="#f89626"
                             title="是否删除此账号?"
                             @confirm="del(scope.row)"
@@ -824,7 +954,6 @@
                             width="220"
                             confirm-button-text="确认"
                             cancel-button-text="取消"
-                            :icon="InfoFilled"
                             icon-color="#f89626"
                             title="是否删除此用户?"
                             @confirm="fingerprintDel(scope.row)"
@@ -952,7 +1081,6 @@
                             width="220"
                             confirm-button-text="确认"
                             cancel-button-text="取消"
-                            :icon="InfoFilled"
                             icon-color="#f89626"
                             title="是否删除此用户?"
                             @confirm="customDel(scope.row)"
@@ -1029,6 +1157,7 @@
             >
               <el-option
                 v-for="i in staffList"
+                :key="i"
                 :label="`${i.userName} ( ${i.department} )`"
                 :value="i.id"
               />
@@ -1058,7 +1187,7 @@
           <el-form-item label="密码 :" prop="pass">
             <el-input
               v-model.trim="passManagementRuleForm.pass"
-              placeholder="请输入6-8位数密码或者点击随机生成"
+              placeholder="请输入68位数密码或者点击随机生成"
               style="width: 500px"
               v-if="passManagementEditFlag==1"
             >
@@ -1069,7 +1198,7 @@
             <el-input
               v-if="passManagementEditFlag==2"
               v-model.trim="passManagementRuleForm.pass"
-              placeholder="请输入6-8位数密码或者点击随机生成"
+              placeholder="请输入68位数密码或者点击随机生成"
               style="width: 500px"
               :disabled="true"
             >
@@ -1115,6 +1244,51 @@
         </el-form>
       </el-dialog>
 
+      <!-- 下发管理员密码 -->
+      <el-dialog
+        class="passManagementDialog"
+        v-model="sendAdminPassVisible"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+        title="下发管理员密码"
+        align-center
+        width="450"
+        :before-close="cancelSendAdminPass"
+      >
+        <el-form
+          ref="sendAdminPassRef"
+          :model="sendAdminPassRuleForm"
+          :rules="sendAdminPassRules"
+          label-width="70px"
+          class="demo-ruleForm"
+          :size="formSize"
+          label-position="left"
+          status-icon
+        >
+          <el-form-item label="密码 :" prop="pass">
+            <el-input
+              v-model.trim="sendAdminPassRuleForm.pass"
+              placeholder="请输入6或8位数字密码"
+              style="width: 500px"
+            >
+            </el-input>
+          </el-form-item>
+          <el-form-item class="options">
+            <el-button
+              color="rgba(41, 109, 227, 1)"
+              class="queding"
+              type="primary"
+              @click="sendAdminPassConfig(sendAdminPassRef)"
+            >
+              确定
+            </el-button>
+            <el-button @click="cancelSendAdminPass(sendAdminPassRef)"
+              >取消</el-button
+            >
+          </el-form-item>
+        </el-form>
+      </el-dialog>
+
       <!-- 添加电子钥匙 添加指纹 -->
       <el-dialog
         class="fingerprintDialog"
@@ -1162,6 +1336,7 @@
             >
               <el-option
                 v-for="i in staffList"
+                :key="i"
                 :label="`${i.userName} ( ${i.department} )`"
                 :value="i.id"
               />
@@ -1313,7 +1488,6 @@
               v-model="identityCardRuleForm.buildingId"
               placeholder="请选择楼栋单元"
               style="width: 214px"
-              @change="searchBtn"
               :clearable="true"
             >
               <el-option
@@ -1336,6 +1510,7 @@
             >
               <el-option
                 v-for="i in staffList"
+                :key="i"
                 :label="`${i.userName} ( ${i.department} )`"
                 :value="i.id"
               />
@@ -1567,7 +1742,7 @@
               prop="employeeUsersName"
               label="用户"
             />
-            <el-table-column align="center" label="楼栋单元">
+            <el-table-column align="center" width="200" label="楼栋单元">
               <template #default="{ row }">
                 <span>{{ row.building }}-{{ row.element }}</span>
               </template>
@@ -1588,7 +1763,6 @@
                   width="220"
                   confirm-button-text="确认"
                   cancel-button-text="取消"
-                  :icon="InfoFilled"
                   icon-color="#f89626"
                   title="是否删除此卡?"
                   @confirm="detailDel(row)"
@@ -1614,6 +1788,135 @@
           />
         </div>
       </el-dialog>
+
+      <!-- 总密码明细 -->
+      <el-dialog
+        class="detailDialog"
+        v-model="allPassDetailVisible"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+        title="总密码明细"
+        align-center
+        width="1200"
+        :before-close="cancelAllPassDetail"
+      >
+        <div class="middle" style="display: flex">
+          <div class="condition">
+            <span>用户</span>
+            <el-input
+              :clearable="true"
+              @clear="allPassDetailList"
+              v-model.trim="allPassDetailInput.employeeName"
+              class="w-50 m-2"
+              placeholder="请输入用户"
+              style="width: 230px; margin-left: 10px"
+            />
+          </div>
+          <div class="condition">
+            <span>楼栋单元</span>
+            <el-select
+              v-model="allPassDetailInput.buildingId"
+              placeholder="请选择楼栋单元"
+              style="width: 200px; margin-left: 10px"
+              @change="allPassDetailList"
+              :clearable="true"
+            >
+              <el-option
+                v-for="item in buildData"
+                :key="item.id"
+                :label="`${item.building}-${item.element}`"
+                :value="item.id"
+              />
+            </el-select>
+          </div>
+          <div class="condition">
+            <span>创建时间&nbsp;&nbsp;</span>
+            <el-date-picker
+              v-model="allPassDetailInput.createTime"
+              type="daterange"
+              unlink-panels
+              range-separator="-"
+              start-placeholder="起始时间"
+              end-placeholder="结束时间"
+              format="YYYY-MM-DD"
+              value-format="YYYY-MM-DD"
+              :prefix-icon="Calendar"
+              placeholder="请选择日期"
+              @change="allPassDetailList"
+            />
+          </div>
+          <el-button
+            type="primary"
+            color="rgba(0, 97, 255, 1)"
+            @click="allPassDetailList"
+            ><span>查询</span></el-button
+          >
+        </div>
+        <div class="footers" v-loading="allPassDetailLoading">
+          <el-table
+            :row-class-name="tableRowClassName"
+            :data="allPassDetailData.list"
+            style="width: 100%; height: 550px"
+            :header-cell-style="{
+              background: 'rgba(240, 243, 247, 1)',
+              height: '50px',
+              border: 0,
+            }"
+          >
+            <el-table-column align="center" prop="startTime" label="生效时间">
+            </el-table-column>
+            <el-table-column align="center" prop="endTime" label="失效时间" />
+            <el-table-column
+              align="center"
+              prop="employeeUsersName"
+              label="用户"
+            />
+            <el-table-column align="center" width="200" label="楼栋单元">
+              <template #default="{ row }">
+                <span>{{ row.building }}-{{ row.element }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="passWord"
+              label="密码"
+            />
+            <el-table-column
+              align="center"
+              prop="createTime"
+              label="创建时间"
+            />
+            <el-table-column align="center" prop="unlockType" label="操作">
+              <template #default="{ row }">
+                <el-popconfirm
+                  width="220"
+                  confirm-button-text="确认"
+                  cancel-button-text="取消"
+                  icon-color="#f89626"
+                  title="是否删除此密码?"
+                  @confirm="allPassDetailDel(row)"
+                  @cancel="cancelEvent"
+                >
+                  <template #reference>
+                    <span style="cursor: pointer; color: #0061ff">删除</span>
+                  </template>
+                </el-popconfirm>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <div class="pageSize">
+          <span></span>
+          <el-pagination
+            background
+            :current-page="allPassDetailPage"
+            :page-size="allPassDetailSize"
+            layout="total, prev, pager, next, jumper, slot"
+            :total="allPassDetailTotal"
+            @update:current-page="allPassDetailHandleCurrentChange"
+          />
+        </div>
+      </el-dialog>
     </div>
   </div>
 </template>
@@ -1676,6 +1979,19 @@ const detailPage = ref(1);
 const detailSize = ref(10);
 const detailTotal = ref();
 
+// 总卡明细 (--------------------------------------------------------)
+const allPassDetailVisible = ref(false);
+const allPassDetailInput = reactive({
+  employeeName: "",// 员工名称
+  buildingId: "",// 楼栋单元id
+  createTime: "",// 
+});
+const allPassDetailLoading = ref(false);
+const allPassDetailData = reactive({ list: [] });
+const allPassDetailPage = ref(1);
+const allPassDetailSize = ref(10);
+const allPassDetailTotal = ref();
+
 // 设置临时总卡 (头部按钮--------------------------------------------------------)
 const temporaryCardVisible = ref(false);
 const temporaryCardRef = ref();
@@ -1735,6 +2051,60 @@ const temporaryCardRules = reactive({
   ],
 });
 
+// 制作总密码(--------------------------------------------------------)
+const allPassVisible = ref(false);
+const allPassRef = ref();
+const allPassRuleForm = reactive({
+  buildingId:"",// 楼栋单元
+  name: "",// 员工
+  effectiveTime: "",// 开始时间
+  failureTime: "",//结束时间
+  pass: "",
+});
+var allPassRule = (rule, value, callback) => {
+  var reg = /^\d{6}$|^\d{8}$/;
+  if (!reg.test(value)) {
+    callback(new Error("请输入6或8位数字密码!"));
+  } else {
+    callback();
+  }
+};
+// 表单验证
+const allPassRules = reactive({
+  name: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
+  buildingId: [{ required: true, message: "楼栋单元不能为空", trigger: "blur" }],
+  phone: [{ required: true, message: "号码不能为空", trigger: "blur" }],
+  level: [
+    {
+      required: true,
+      message: "角色不能为空",
+      trigger: "blur",
+    },
+  ],
+  effectiveTime: [
+    {
+      required: true,
+      message: "生效时间不能为空",
+      trigger: "blur",
+    },
+  ],
+  failureTime: [
+    {
+      required: true,
+      message: "失效时间不能为空",
+      trigger: "blur",
+    },
+  ],
+  pass: [
+    {
+      required: true,
+      message: "密码不能为空",
+      trigger: "blur",
+    },
+    { validator: allPassRule, trigger: "blur" },
+  ],
+});
+
 // 消息列表弹窗(----------------------------------------------------)
 const newsVisible = ref(false);
 const newsIndex = ref(1);
@@ -1746,6 +2116,7 @@ const newTableList = ref();
 
 // 远程开锁(--------------------------------------------------------)
 const unlockingVisible = ref(false);
+const unlockingLoading = ref(false);
 const unlockList = reactive({ luid: "", roomNumber: "", houseNumberId: "" });
 
 // 绑定设备 (--------------------------------------------------------)
@@ -1839,6 +2210,14 @@ const passManagementRuleForm = reactive({
   pass: "",
   id: "",
 });
+var passManagementRule = (rule, value, callback) => {
+  var reg = /^\d{6}$|^\d{8}$/;
+  if (!reg.test(value)) {
+    callback(new Error("请输入6或8位数字密码!"));
+  } else {
+    callback();
+  }
+};
 // 表单验证
 const passManagementRules = reactive({
   name: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
@@ -1870,6 +2249,33 @@ const passManagementRules = reactive({
       message: "密码不能为空",
       trigger: "blur",
     },
+    { validator: passManagementRule, trigger: "blur" },
+  ],
+});
+
+// 钥匙管理 下发管理员密码(--------------------------------------------------------)
+const sendAdminPassVisible = ref(false);
+const sendAdminPassRef = ref();
+const sendAdminPassRuleForm = reactive({
+  pass: "",
+});
+var passRule = (rule, value, callback) => {
+  var reg = /^\d{6}$|^\d{8}$/;
+  if (!reg.test(value)) {
+    callback(new Error("请输入6或8位数字密码!"));
+  } else {
+    callback();
+  }
+};
+// 表单验证
+const sendAdminPassRules = reactive({
+  pass: [
+    {
+      required: true,
+      message: "密码不能为空",
+      trigger: "blur",
+    },
+    { validator: passRule, trigger: "blur" },
   ],
 });
 
@@ -2178,6 +2584,95 @@ const searchBtn = lodash.debounce(async () => {
   getList();
 }, 300);
 
+// 制作总密码
+const allPassClick=()=>{
+  staffData();// 用户数据
+  allPassVisible.value=true
+  allPassRuleForm.name=""
+  allPassRuleForm.pass=""
+  allPassRuleForm.effectiveTime=""
+  allPassRuleForm.failureTime=""
+}
+const randomCipherAllPass=async ()=>{
+  let res = await axios({
+    method: "get",
+    url: api.value + "/unlocking-admin/getPassWord",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+  });
+  console.log(res, "随机密码");
+  if (res.data.code == 200) {
+    allPassRuleForm.pass = res.data.data.passWord;
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+}
+const cancelAllPass=()=>{
+  allPassVisible.value=false
+  allPassRef.value.resetFields()
+}
+// 确定总密码设备
+const allPassConfig = async (formEl) => {
+  if (!formEl) return;
+  await formEl.validate(async (valid, fields) => {
+    if (valid) {
+      const loading = ElLoading.service({
+        lock: true,
+        text: "加载中...",
+        background: "rgba(255, 255, 255, 0.7)",
+      });
+      let data = {
+        adminId: sessionStorage.getItem("id"), //管理员id
+        employeeUsersId: allPassRuleForm.name, //房间号id
+        buildingId: allPassRuleForm.buildingId,
+        passWord: allPassRuleForm.pass, //房间号id
+        startTime:allPassRuleForm.effectiveTime,
+        endTime:allPassRuleForm.failureTime,
+      };
+      let res = await axios({
+        method: "post",
+        url: api.value + "/total-pass-word/saveEmployeeTotalPassWord",
+        headers: {
+          token: sessionStorage.getItem("token"),
+          user_head: sessionStorage.getItem("user_head"),
+        },
+        data: data,
+      });
+      console.log(res, "确定总密码设备");
+      if (res.data.code == 200) {
+        // getList();
+        allPassVisible.value=false
+        loading.close();
+        ElMessage({
+          type: "success",
+          showClose: true,
+          message: res.data.message,
+          center: true,
+        });
+        bindingVisible.value = false;
+        bindingRef.value.resetFields();
+      } else {
+        loading.close();
+        ElMessage({
+          type: "error",
+          showClose: true,
+          message: res.data.message,
+          center: true,
+        });
+      }
+    } else {
+      console.log("error submit!", fields);
+    }
+  });
+};
+
 // 消息列表 (---------------------------------------------------------------)
 const newsClick = async (row) => {
   newsVisible.value = true;
@@ -2323,6 +2818,7 @@ const unlockingClick = (row) => {
 };
 // 确定远程开锁
 const unlockingSubmit = async () => {
+  unlockingLoading.value=true
   let data = {
     luid: unlockList.luid,
     roomNumber: unlockList.roomNumber,
@@ -2342,6 +2838,7 @@ const unlockingSubmit = async () => {
   if (res.data.code == 200) {
     unlockingVisible.value = false;
     getList();
+    unlockingLoading.value=false
     ElMessage({
       type: "success",
       showClose: true,
@@ -2349,6 +2846,7 @@ const unlockingSubmit = async () => {
       center: true,
     });
   } else {
+    unlockingLoading.value=false
     ElMessage({
       type: "error",
       showClose: true,
@@ -2456,6 +2954,7 @@ const nfcClick = async (row, flag) => {
     });
   }
 };
+const cancelEvent=()=>{}
 
 // 解绑设备(-----------------------------------------------------------------)
 const deblockingClick = (row) => {
@@ -2503,6 +3002,56 @@ const cancelDeblocking = () => {
   deblockingVisible.value = false;
 };
 
+// 下发管理员密码
+const sendAdminPass=async (i)=>{
+  sendAdminPassVisible.value=true
+}
+const cancelSendAdminPass=()=>{
+  sendAdminPassVisible.value=false
+  sendAdminPassRef.value.resetFields()
+}
+const sendAdminPassConfig=async (formEl)=>{
+  if (!formEl) return;
+  await formEl.validate(async (valid, fields) => {
+    if (valid) {
+      let data = {
+        houseLockId: houseLockId.value,
+        passWord: sendAdminPassRuleForm.pass, //房间号id
+      };
+      let res = await axios({
+        method: "post",
+        url: api.value + "/house-lock/saveAdministratorPassword",
+        headers: {
+          token: sessionStorage.getItem("token"),
+          user_head: sessionStorage.getItem("user_head"),
+        },
+        data: data,
+      });
+      console.log(res, "确定下发管理员密码");
+      if (res.data.code == 200) {
+        // getList();
+        ElMessage({
+          type: "success",
+          showClose: true,
+          message: res.data.message,
+          center: true,
+        });
+        sendAdminPassVisible.value = false;
+        sendAdminPassRef.value.resetFields();
+      } else {
+        ElMessage({
+          type: "error",
+          showClose: true,
+          message: res.data.message,
+          center: true,
+        });
+      }
+    } else {
+      console.log("error submit!", fields);
+    }
+  });
+}
+
 // 总卡明细 (=========================================================)
 const detailChange = () => {
   detailVisible.value = true;
@@ -2593,6 +3142,96 @@ const cancelDetail = () => {
   detailVisible.value = false;
 };
 
+// 总密码明细 (=========================================================)
+const allPassDetailChange = () => {
+  allPassDetailVisible.value = true;
+  allPassDetailList();
+};
+// 总密码明细数据
+const allPassDetailList = async () => {
+  allPassDetailLoading.value = true;
+  let data = {
+    page: allPassDetailPage.value,
+    size: allPassDetailSize.value,
+    employeeName: allPassDetailInput.employeeName, // 房型名称
+    buildingId:allPassDetailInput.buildingId
+  };
+  if (allPassDetailInput.createTime) {
+    data.startTime = allPassDetailInput.createTime[0];
+    data.endTime = allPassDetailInput.createTime[1];
+  }
+  let res = await axios({
+    method: "get",
+    url: api.value + "/total-pass-word/listEmployeeTotalPassWord",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("user_head"),
+    },
+    params: data,
+  });
+  console.log(res, "总密码明细");
+  if (res.data.code == 200) {
+    allPassDetailLoading.value = false;
+    allPassDetailData.list = res.data.data.list;
+    allPassDetailTotal.value = res.data.data.totalCount;
+  } else {
+    allPassDetailLoading.value = false;
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+// 总密码明细分页
+const allPassDetailHandleCurrentChange = (val) => {
+  allPassDetailPage.value = val;
+  allPassDetailList();
+};
+// 总密码明细删除
+const allPassDetailDel = async (row) => {
+  const loading = ElLoading.service({
+    lock: true,
+    text: "加载中...",
+    background: "rgba(255, 255, 255, 0.7)",
+  });
+  let data = {
+    id: row.id,
+  };
+  let res = await axios({
+    method: "get",
+    url: api.value + "/total-pass-word/deleteEmployeeTotalPassWord",
+    headers: {
+      token: sessionStorage.getItem("token"),
+      user_head: sessionStorage.getItem("user_head"),
+    },
+    params: data,
+  });
+  console.log(res, "总密码明细删除");
+  if (res.data.code == 200) {
+    loading.close();
+    allPassDetailList();
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  } else {
+    loading.close();
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+const cancelAllPassDetail = () => {
+  allPassDetailVisible.value = false;
+};
+
 // 批量导入(-----------------------------------------------------------------)
 const bulkImportClick = () => {
   bulkImportVisible.value = true;
@@ -3993,7 +4632,7 @@ onUnmounted(() => {
     // border-bottom: 1px solid rgb(231, 231, 231);
     .filter {
       display: flex;
-      flex-wrap: wrap;
+      
       align-items: center;
       padding: 10px 0 0 0;
 
@@ -4003,6 +4642,7 @@ onUnmounted(() => {
 
       .condition {
         display: flex;
+        flex-wrap: wrap;
         align-items: center;
         // margin: 0 0 10px 0;
       }

+ 13 - 10
src/views/roomStatus/roomStatus.vue

@@ -17,7 +17,7 @@
           <template #reference>
             <span class="cameratxt">房态管理</span>
           </template>
-          <div v-for="i in roomList.list">
+          <div v-for="i in roomList.list" :key="i">
             {{ i.name }} : 未使用 {{ i.freeCount }} 间 , 已使用 {{ i.useCount }} 间
           </div>
         </el-popover>
@@ -149,6 +149,7 @@
                 :label="`${i.roomName}(${i.roomType == 1 ? '全' : '钟'})`"
                 :value="i.id"
                 v-for="i in roomTypeData"
+                :key="i"
               />
             </el-select>
           </div>
@@ -198,13 +199,13 @@
         
       </div>
       <div class="footer" v-if="switchDayIndex == 1">
-        <div class="floor" v-for="item in roomList.list">
+        <div class="floor" v-for="item in roomList.list" :key="item">
           <div class="title" v-if="item.roomlength">
             <span class="t1">{{ item.name }}</span
             ><span class="t2">/ 共{{ item.roomlength }}间</span>
           </div>
           <div class="roomList" v-if="item.vos">
-            <div class="room" v-for="i in item.vos">
+            <div class="room" v-for="i in item.vos" :key="i">
               <el-popover
                 popper-class="roominfoPopper"
                 placement="bottom-start"
@@ -314,8 +315,8 @@
                       <span>结束:{{ i.endTime }}</span>
                     </div>
                     <div style="position: absolute;right: 15px;bottom: 8px;">
-                      <img v-if="i.electricType==1" @click="bulbsClick(i)" style="width: 22px;height: 22px;cursor: pointer;" src="../../assets/icons/bulbs.png" alt="">
-                      <img v-if="i.electricType==2" @click="bulbsClick(i)" style="width: 20px;height: 20px;cursor: pointer;" src="../../assets/icons/bulb.png" alt="">
+                      <img title="关灯" v-if="i.electricType==1" @click="bulbsClick(i)" style="width: 22px;height: 22px;cursor: pointer;" src="../../assets/icons/bulbs.png" alt="">
+                      <img title="开灯" v-if="i.electricType==2" @click="bulbsClick(i)" style="width: 20px;height: 20px;cursor: pointer;" src="../../assets/icons/bulb.png" alt="">
                     </div>
                   </div>
                 </template>
@@ -1226,6 +1227,7 @@
 
           <el-table-column
             v-for="(i, ind) in tableDateHeader"
+            :key="i"
             prop="date"
             align="center"
           >
@@ -1242,8 +1244,8 @@
                     <span>{{ i.date }}</span>
                   </template>
                   <div>
-                    <div v-for="item in i.freeNumbers">{{ item.room_name }}: 未使用{{ item.num }}间</div><br>
-                    <div v-for="item in i.useNumbers">{{ item.room_name }}: 已使用{{ item.num }}间</div>
+                    <div v-for="item in i.freeNumbers" :key="item">{{ item.room_name }}: 未使用{{ item.num }}间</div><br>
+                    <div v-for="item in i.useNumbers" :key="item">{{ item.room_name }}: 已使用{{ item.num }}间</div>
                   </div>
                 </el-popover>
               
@@ -1643,6 +1645,7 @@
                 :class="roomChangeIndex == item.name ? 'changeNews_active' : ''"
                 @click="changeRoom(item.name)"
                 v-for="item in roomChangeItemList"
+                :key="item"
               >
                 {{ item.name
                 }}
@@ -1654,7 +1657,7 @@
           </div>
           <div class="room">
             <div class="floors">
-              <div class="cards" v-for="item in roomChangeList.list">
+              <div class="cards" v-for="item in roomChangeList.list" :key="item">
                 <div class="roomList" @click="roomCheck(item)">
                   <div class="roomNumber">{{ item.roomNumber }}</div>
                   <img
@@ -1903,10 +1906,10 @@
           <div class="el-table">
             <table cellpadding="0" cellspacing="0">
               <tr>
-                <td v-for="i in reserveData.list">{{ i.date }}</td>
+                <td v-for="i in reserveData.list" :key="i">{{ i.date }}</td>
               </tr>
               <tr>
-                <td v-for="i in reserveData.list">{{ i.status }}</td>
+                <td v-for="i in reserveData.list" :key="i">{{ i.status }}</td>
               </tr>
             </table>
           </div>

+ 3 - 1
src/views/roomType/roomType.vue

@@ -130,6 +130,7 @@
                         style="margin: 3px 3px"
                         type="primary"
                         v-for="item in scope.row.roomTwo"
+                        :key="item"
                         >{{ item }}</el-tag
                       >
                     </div>
@@ -387,7 +388,7 @@
                   </div>
                   <div class="delRoom">
                     <div class="ul">
-                      <div class="li" v-for="i in ruleForm.roomNumbers">
+                      <div class="li" v-for="i in ruleForm.roomNumbers" :key="i">
                         <el-tag
                           size="large"
                           style="margin: 0 15px 8px 0"
@@ -483,6 +484,7 @@
                     >
                       <el-checkbox
                         v-for="i in roomConfig"
+                        :key="i"
                         :label="i.houseService"
                         >{{ i.houseService }}</el-checkbox
                       >

+ 4 - 1
src/views/statement/statement.vue

@@ -621,7 +621,7 @@ const getList = async () => {
     keyWord: searchInput.keyWord,
     state: changeIndex.value,
   };
-  if (changeIndex == 2) {
+  if (changeIndex.value == 2) {
     data.dateBill = searchInput.dateBill;
   }
   if (searchInput.createTime) {
@@ -789,6 +789,9 @@ const importExcel = lodash.debounce(async () => {
     data.startTime = searchInput.createTime[0];
     data.endTime = searchInput.createTime[1];
   }
+  if (changeIndex.value == 2) {
+    data.dateBill = searchInput.dateBill;
+  }
   let res = await axios({
     method: "get",
     url: api.value + "/house-order/reportStatisticsExport",

+ 1 - 0
src/views/userRoles/userRoles.vue

@@ -953,6 +953,7 @@ const addRolesList11 = reactive({
         { name: "远程开锁", id: 13 },
         { name: "解绑设备", id: 14 },
         { name: "NFC设置", id: 15 },
+        { name: "下发管理员密码", id: 16 },
       ],
     },
   ],