422 lines
11 KiB
Vue
422 lines
11 KiB
Vue
<template>
|
|
<view>
|
|
<view class="tabs">
|
|
<up-tabs
|
|
:list="tabs"
|
|
lineWidth="40rpx"
|
|
lineHeight="5rpx"
|
|
:current="currentIndex"
|
|
lineColor="#4777ee"
|
|
@click="clickTab"
|
|
:inactiveStyle="{ color: '#a3a3a3', fontSize: '32rpx', fontWeight: 'bold' }"
|
|
:activeStyle="{ color: '#4777ee', fontSize: '32rpx', fontWeight: 'bold' }"
|
|
>
|
|
</up-tabs>
|
|
</view>
|
|
<swiper
|
|
:style="{ height: deviceInfo.windowHeight - deviceInfo.safeArea.top - 44 + 'px' }"
|
|
v-if="deviceInfo"
|
|
:list="tabs"
|
|
:autoplay="false"
|
|
:circular="true"
|
|
:current="currentIndex"
|
|
@change="changeSwiper"
|
|
>
|
|
<swiper-item>
|
|
<LockInput
|
|
:value="permanentName"
|
|
title="姓名"
|
|
placeholder="请输入"
|
|
@change-input="changeName('permanent', $event)"
|
|
></LockInput>
|
|
<view class="mt-3" v-if="$bluetooth.currentLockInfo.userType === 110301">
|
|
<LockSwitch
|
|
:value="permanentAdmin"
|
|
title="是否为管理员"
|
|
@change="changeAdmin('permanent', $event)"
|
|
></LockSwitch>
|
|
</view>
|
|
<view class="mt-3 mb-3">
|
|
<LockSwitch
|
|
:value="permanentCoerced"
|
|
title="胁迫掌静脉"
|
|
@change="changeCoerced('permanent', $event)"
|
|
:placeholder="placeholder"
|
|
></LockSwitch>
|
|
</view>
|
|
<view class="button" @click="create('permanent')">下一步</view>
|
|
</swiper-item>
|
|
<swiper-item>
|
|
<LockInput
|
|
:value="temporaryName"
|
|
title="姓名"
|
|
placeholder="请输入"
|
|
@change-input="changeName('temporary', $event)"
|
|
></LockInput>
|
|
<view class="mt-3">
|
|
<LockDatetimePicker
|
|
title="生效时间"
|
|
:value="temporaryStartTime"
|
|
:minDate="minDate"
|
|
:maxDate="maxDate"
|
|
@change-time="changeDate('temporaryStartTime', $event)"
|
|
></LockDatetimePicker>
|
|
</view>
|
|
<view class="mt-3">
|
|
<LockDatetimePicker
|
|
title="失效时间"
|
|
:value="temporaryEndTime"
|
|
:minDate="minDate"
|
|
:maxDate="maxDate"
|
|
@change-time="changeDate('temporaryEndTime', $event)"
|
|
></LockDatetimePicker>
|
|
</view>
|
|
<view class="mt-3" v-if="$bluetooth.currentLockInfo.userType === 110301">
|
|
<LockSwitch
|
|
:value="temporaryAdmin"
|
|
title="是否为管理员"
|
|
@change="changeAdmin('temporary', $event)"
|
|
></LockSwitch>
|
|
</view>
|
|
<view class="mt-3 mb-3">
|
|
<LockSwitch
|
|
:value="temporaryCoerced"
|
|
title="胁迫掌静脉"
|
|
@change="changeCoerced('temporary', $event)"
|
|
:placeholder="placeholder"
|
|
></LockSwitch>
|
|
</view>
|
|
<view class="button" @click="create('temporary')">下一步</view>
|
|
</swiper-item>
|
|
|
|
<swiper-item>
|
|
<LockInput
|
|
:value="cycleName"
|
|
title="姓名"
|
|
placeholder="请输入"
|
|
@change-input="changeName('cycle', $event)"
|
|
></LockInput>
|
|
<view class="mt-3">
|
|
<LockCycle @change="changeCycle"></LockCycle>
|
|
</view>
|
|
<view class="mt-3" v-if="$bluetooth.currentLockInfo.userType === 110301">
|
|
<LockSwitch
|
|
:value="cycleAdmin"
|
|
title="是否为管理员"
|
|
@change="changeAdmin('cycle', $event)"
|
|
></LockSwitch>
|
|
</view>
|
|
<view class="mt-3 mb-3">
|
|
<LockSwitch
|
|
:value="cycleCoerced"
|
|
title="胁迫掌静脉"
|
|
@change="changeCoerced('cycle', $event)"
|
|
:placeholder="placeholder"
|
|
></LockSwitch>
|
|
</view>
|
|
<view class="button" @click="create('cycle')">下一步</view>
|
|
</swiper-item>
|
|
</swiper>
|
|
</view>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { getCurrentInstance, ref } from 'vue'
|
|
import { onLoad } from '@dcloudio/uni-app'
|
|
import { timeFormat } from 'uview-plus'
|
|
import { useBasicStore } from '@/stores/basic'
|
|
import { useUserStore } from '@/stores/user'
|
|
import { useBluetoothStore } from '@/stores/bluetooth'
|
|
import { checkPalmVeinNameRequest } from '@/api/palmVein'
|
|
import { transportType } from '@/constant/transportType'
|
|
|
|
const instance = getCurrentInstance().proxy
|
|
const eventChannel = instance.getOpenerEventChannel()
|
|
|
|
const $basic = useBasicStore()
|
|
const $bluetooth = useBluetoothStore()
|
|
const $user = useUserStore()
|
|
|
|
const tabs = [
|
|
{
|
|
name: '永久'
|
|
},
|
|
{
|
|
name: '限时'
|
|
},
|
|
{
|
|
name: '循环'
|
|
}
|
|
]
|
|
|
|
const permanentName = ref('')
|
|
const permanentAdmin = ref(false)
|
|
const permanentCoerced = ref(false)
|
|
|
|
const temporaryName = ref('')
|
|
const temporaryStartTime = ref(Number(new Date()))
|
|
const temporaryEndTime = ref(Number(new Date()))
|
|
const temporaryAdmin = ref(false)
|
|
const temporaryCoerced = ref(false)
|
|
|
|
const cycleName = ref('')
|
|
const cycleStartTime = ref(null)
|
|
const cycleEndTime = ref(null)
|
|
const weekDays = ref([])
|
|
const cycleAdmin = ref(false)
|
|
const cycleCoerced = ref(false)
|
|
|
|
const minDate = ref(Number(new Date()))
|
|
const maxDate = ref(Number(4133951940000))
|
|
const currentIndex = ref(0)
|
|
const deviceInfo = ref(null)
|
|
const placeholder =
|
|
'当被胁迫要求强行开锁时,使用胁迫掌静脉会触发报警,报警信息会推送给管理员,该功能需要锁联网。\n请不要将胁迫掌静脉用于日常开锁'
|
|
|
|
onLoad(async () => {
|
|
deviceInfo.value = await $basic.getDeviceInfo()
|
|
temporaryStartTime.value = setTime()
|
|
temporaryEndTime.value = setTime()
|
|
minDate.value = Number(getNextFullHour())
|
|
maxDate.value = Number(getFutureTimestamp())
|
|
})
|
|
|
|
const changeCycle = data => {
|
|
cycleStartTime.value = data.startDate
|
|
cycleEndTime.value = data.endDate
|
|
weekDays.value = data.weekDays
|
|
}
|
|
|
|
const getNextFullHour = () => {
|
|
const now = new Date()
|
|
const currentHour = now.getHours()
|
|
now.setHours(currentHour)
|
|
now.setMinutes(0)
|
|
now.setSeconds(0)
|
|
now.setMilliseconds(0)
|
|
|
|
return now
|
|
}
|
|
|
|
const getFutureTimestamp = () => {
|
|
const currentDate = new Date()
|
|
|
|
const year = currentDate.getFullYear()
|
|
const month = currentDate.getMonth()
|
|
const day = currentDate.getDate()
|
|
|
|
const futureDate = new Date(year + 3, month, day, 23, 0, 0)
|
|
|
|
return futureDate.getTime()
|
|
}
|
|
|
|
const setTime = () => {
|
|
const now = new Date()
|
|
|
|
return now.getTime()
|
|
}
|
|
|
|
const create = async type => {
|
|
if (
|
|
(type === 'temporary' && temporaryName.value === '') ||
|
|
(type === 'permanent' && permanentName.value === '') ||
|
|
(type === 'cycle' && cycleName.value === '')
|
|
) {
|
|
uni.showToast({
|
|
title: '名称不能为空',
|
|
icon: 'none'
|
|
})
|
|
return
|
|
}
|
|
|
|
if (type === 'temporary' && temporaryStartTime.value >= temporaryEndTime.value) {
|
|
uni.showToast({
|
|
title: '失效时间要大于生效时间',
|
|
icon: 'none'
|
|
})
|
|
return
|
|
}
|
|
|
|
if (type === 'cycle' && weekDays.value.length === 0) {
|
|
uni.showToast({
|
|
title: '请选择有效期',
|
|
icon: 'none'
|
|
})
|
|
return
|
|
}
|
|
|
|
const netWork = await $basic.getNetworkType()
|
|
if (!netWork) {
|
|
return
|
|
}
|
|
|
|
let params = {
|
|
type: 'palmVein',
|
|
keyId: $bluetooth.keyId.toString(),
|
|
uid: $user.userInfo.uid.toString(),
|
|
no: 0,
|
|
operate: 0,
|
|
userCountLimit: 0xffff
|
|
}
|
|
|
|
if (type === 'permanent') {
|
|
params = {
|
|
...params,
|
|
palmVeinName: permanentName.value,
|
|
isAdmin: permanentAdmin.value ? 1 : 0,
|
|
isForce: permanentCoerced.value ? 1 : 0,
|
|
weekDays: [],
|
|
isRound: 0,
|
|
startDate: 0,
|
|
palmVeinType: 1,
|
|
endDate: 0,
|
|
startTime: '00:00',
|
|
endTime: '00:00'
|
|
}
|
|
} else if (type === 'temporary') {
|
|
params = {
|
|
...params,
|
|
palmVeinName: temporaryName.value,
|
|
isAdmin: temporaryAdmin.value ? 1 : 0,
|
|
isForce: temporaryCoerced.value ? 1 : 0,
|
|
weekDays: [],
|
|
palmVeinType: 2,
|
|
isRound: 0,
|
|
startDate: temporaryStartTime.value,
|
|
endDate: temporaryEndTime.value,
|
|
startTime: '00:00',
|
|
endTime: '00:00'
|
|
}
|
|
} else {
|
|
params = {
|
|
...params,
|
|
palmVeinName: cycleName.value,
|
|
isAdmin: cycleAdmin.value ? 1 : 0,
|
|
isForce: cycleCoerced.value ? 1 : 0,
|
|
weekDays: weekDays.value,
|
|
palmVeinType: 4,
|
|
isRound: 1,
|
|
startDate: cycleStartTime.value,
|
|
endDate: cycleEndTime.value,
|
|
startTime: timeFormat(new Date(cycleStartTime.value), 'h:M'),
|
|
endTime: timeFormat(new Date(cycleEndTime.value), 'h:M')
|
|
}
|
|
}
|
|
|
|
const { code, message } = await checkPalmVeinNameRequest({
|
|
lockId: $bluetooth.currentLockInfo.lockId,
|
|
palmVeinName: params.palmVeinName
|
|
})
|
|
if (code === 0) {
|
|
if ($bluetooth.currentLockInfo.transportType === transportType.TRANSPORT_TENCENT_YUN) {
|
|
const { code } = await $bluetooth.registerAuthentication(params)
|
|
if (code === 0) {
|
|
$basic.backAndToast('请在锁端添加掌静脉')
|
|
} else {
|
|
uni.showToast({
|
|
title: '添加掌静脉命令下达失败,请重试',
|
|
icon: 'none'
|
|
})
|
|
}
|
|
} else {
|
|
$basic.routeJump({
|
|
name: 'bindPalmVein',
|
|
params: {
|
|
info: JSON.stringify(params)
|
|
},
|
|
events: {
|
|
refresherList() {
|
|
eventChannel.emit('refresherList', {})
|
|
}
|
|
}
|
|
})
|
|
}
|
|
} else {
|
|
uni.showToast({
|
|
title: message,
|
|
icon: 'none'
|
|
})
|
|
}
|
|
}
|
|
|
|
const changeName = (type, event) => {
|
|
if (type === 'permanent') {
|
|
permanentName.value = event
|
|
} else if (type === 'temporary') {
|
|
temporaryName.value = event
|
|
} else {
|
|
cycleName.value = event
|
|
}
|
|
}
|
|
|
|
const changeDate = (type, event) => {
|
|
if (type === 'temporaryStartTime') {
|
|
temporaryStartTime.value = event
|
|
} else {
|
|
temporaryEndTime.value = event
|
|
}
|
|
}
|
|
|
|
const changeAdmin = (type, event) => {
|
|
if (type === 'permanent') {
|
|
permanentAdmin.value = event.detail.value
|
|
} else if (type === 'temporary') {
|
|
temporaryAdmin.value = event.detail.value
|
|
} else {
|
|
cycleAdmin.value = event.detail.value
|
|
}
|
|
}
|
|
|
|
const changeCoerced = (type, event) => {
|
|
if (type === 'permanent') {
|
|
permanentCoerced.value = event.detail.value
|
|
} else if (type === 'temporary') {
|
|
temporaryCoerced.value = event.detail.value
|
|
} else {
|
|
cycleCoerced.value = event.detail.value
|
|
}
|
|
}
|
|
|
|
const clickTab = data => {
|
|
currentIndex.value = data.index
|
|
}
|
|
|
|
const changeSwiper = e => {
|
|
currentIndex.value = e.detail.current
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
page {
|
|
background-color: $uni-bg-color-grey;
|
|
}
|
|
</style>
|
|
|
|
<style lang="scss" scoped>
|
|
.tabs {
|
|
display: flex;
|
|
justify-content: center;
|
|
}
|
|
|
|
.text {
|
|
padding: 0 32rpx;
|
|
margin-top: 40rpx;
|
|
margin-bottom: 50rpx;
|
|
font-size: 26rpx;
|
|
color: #262626;
|
|
}
|
|
|
|
.button {
|
|
width: 686rpx;
|
|
height: 100rpx;
|
|
margin-left: 32rpx;
|
|
font-size: 32rpx;
|
|
font-weight: bold;
|
|
line-height: 100rpx;
|
|
color: #fff;
|
|
text-align: center;
|
|
background-color: #4777ee;
|
|
border-radius: 64rpx;
|
|
}
|
|
</style>
|