|
|
@@ -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="请输入6或8位数密码或者点击随机生成"
|
|
|
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="请输入6或8位数密码或者点击随机生成"
|
|
|
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>创建时间 </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;
|
|
|
}
|