dedsudiyu 1 month ago
parent
commit
17862dc4f1
2 changed files with 358 additions and 11 deletions
  1. 45 0
      pages_manage/api/index.js
  2. 313 11
      pages_manage/views/laboratory/safetyCardScan.vue

+ 45 - 0
pages_manage/api/index.js

@@ -321,6 +321,7 @@ export function laboratoryLabOpenLockLogUpdateLockData(data) {
 		}
 	})
 }
+
 //远程开门-查询实验室远程开门类型列表
 export function laboratoryGreenhouseDoorList(data) {
 	return apiResquest({
@@ -332,4 +333,48 @@ export function laboratoryGreenhouseDoorList(data) {
 	})
 }
 
+//是否可以门禁签到
+export function laboratoryLabHkPassOutIsEnableSign(data) {
+	return apiResquest({
+		url: '/laboratory/labHkPassOut/isEnableSign',
+		method: 'post',
+		data: {
+			...data
+		}
+	})
+}
+
+//是否已经签到
+export function laboratoryLabHkPassOutIsSign(data) {
+	return apiResquest({
+		url: '/laboratory/labHkPassOut/isSign',
+		method: 'post',
+		data: {
+			...data
+		}
+	})
+}
+
+//门禁签到
+export function laboratoryLabHkPassOutSignIn(data) {
+	return apiResquest({
+		url: '/laboratory/labHkPassOut/signIn',
+		method: 'post',
+		data: {
+			...data
+		}
+	})
+}
+
+//门禁签退
+export function laboratoryLabHkPassOutSignOut(data) {
+	return apiResquest({
+		url: '/laboratory/labHkPassOut/signOut',
+		method: 'post',
+		data: {
+			...data
+		}
+	})
+}
+
 

+ 313 - 11
pages_manage/views/laboratory/safetyCardScan.vue

@@ -90,7 +90,11 @@
 				</view>
 			</view>
 		</view>
-		<view class="position-button-box" v-if="pageType == 0">
+		<view class="position-button-box" :class="signInType==0?'button-box-1':'button-box-2'" v-if="pageType == 0">
+			<img class="position-button-p-1" v-if="signInType == 1" @click="laboratoryLabHkPassOutSignIn()"
+				:src="imagesUrl('safetyCheck/icon_sys_qd@1x.png')">
+			<img class="position-button-p-1" v-if="signInType == 2" @click="laboratoryLabHkPassOutSignOut()"
+				:src="imagesUrl('safetyCheck/icon_sys_qt@1x.png')">
 			<img class="position-button-p-1" @click="goPage('securityCheck',true)"
 				:src="imagesUrl('safetyCheck/icon_aqjc_anquanjiancha.png')">
 			<img class="position-button-p-2" @click="goPage('snapshot','')"
@@ -123,12 +127,71 @@
 				</view>
 			</view>
 		</view>
+		<view class="shade-sign-in-max-box" v-if="signInShowType">
+			<!-- 签到 -->
+			<view class="shade-sign-in-min-box-1" v-if="signInDataType == 1">
+				<view class="shade-sign-in-title-p">{{signInData.title}}</view>
+				<view class="shade-sign-in-img-text-box">
+					<view class="shade-sign-in-img-text-min-box">
+						<img :src="imagesUrl('safetyCheck/icon_qdcg_qdr@1x.png')">
+						<view>签到人:</view>
+					</view>
+					<view class="shade-sign-in-img-text-p">{{signInData.userName}}{{signInData.userAccount?'('+signInData.userAccount+')':''}}</view>
+				</view>
+				<view class="shade-sign-in-img-text-box">
+					<view class="shade-sign-in-img-text-min-box">
+						<img :src="imagesUrl('safetyCheck/icon_qdcg_qddd@1x.png')">
+						<view>签到地点:</view>
+					</view>
+					<view class="shade-sign-in-img-text-p">{{signInData.subName}}</view>
+					<view class="shade-sign-in-img-text-p" style="margin-top:15rpx;">{{signInData.address}}</view>
+				</view>
+				<view class="shade-sign-in-img-text-box">
+					<view class="shade-sign-in-img-text-min-box">
+						<img :src="imagesUrl('safetyCheck/icon_qdcg_qdsj@1x.png')">
+						<view>签到时间:</view>
+					</view>
+					<view class="shade-sign-in-img-text-p">{{signInData.signIn}}</view>
+				</view>
+				<view class="off-button-p" @click="offButton()">关闭({{timeNum}})</view>
+			</view>
+			<!-- 签退 -->
+			<view class="shade-sign-in-min-box-2" v-if="signInDataType == 2">
+				<view class="shade-sign-in-title-p">{{signInData.title}}</view>
+				<view class="shade-sign-in-img-text-box">
+					<view class="shade-sign-in-img-text-min-box">
+						<img :src="imagesUrl('safetyCheck/icon_qdcg_qdsj@1x.png')">
+						<view>签退时间:</view>
+					</view>
+					<view class="shade-sign-in-img-text-p">{{signInData.signOut}}</view>
+				</view>
+				<view class="shade-sign-in-img-text-box">
+					<view class="shade-sign-in-img-text-min-box">
+						<img :src="imagesUrl('safetyCheck/icon_qtcg_tlsj@1x.png')">
+						<view>本次停留时间</view>
+					</view>
+					<view class="shade-sign-in-img-text-p">{{signInData.residenceTime}}</view>
+				</view>
+				<view class="shade-sign-in-text-p-1">签到信息:</view>
+				<view class="shade-sign-in-text-p-2">签到人:</view>
+				<view class="shade-sign-in-text-p-2" style="margin-top:12rpx;">{{signInData.userName}}{{signInData.userAccount?'('+signInData.userAccount+')':''}}</view>
+				<view class="shade-sign-in-text-p-2">签到地点:</view>
+				<view class="shade-sign-in-text-p-2" style="margin-top:12rpx;">{{signInData.subName}}</view>
+				<view class="shade-sign-in-text-p-2" style="margin-top:12rpx;">{{signInData.address}}</view>
+				<view class="shade-sign-in-text-p-2">签到时间:</view>
+				<view class="shade-sign-in-text-p-2" style="margin-top:12rpx;">{{signInData.signIn}}</view>
+				<view class="off-button-p" @click="offButton()">关闭({{timeNum}})</view>
+			</view>
+		</view>
 	</view>
 
 </template>
 
 <script>
 	import {
+		parseTime
+	} from '@/component/public.js'
+	import {
 		pageRestrictVerify
 	} from '@/utils/index'
 	import {
@@ -153,6 +216,12 @@
 	import {
 		securityAppCheckPlanScanCode,
 	} from '@/pages_safetyCheck/api/index.js'
+	import {
+		laboratoryLabHkPassOutIsEnableSign,
+		laboratoryLabHkPassOutIsSign,
+		laboratoryLabHkPassOutSignIn,
+		laboratoryLabHkPassOutSignOut,
+	} from '@/pages_manage/api/index.js'
 	export default {
 		name: "safetyCardScan",
 		components: {
@@ -196,6 +265,22 @@
 				securityCheck: false,
 				securityCheckList:[],
 				form: {},
+				//签到按钮状态
+				signInType:0,
+				signInShowType:false,
+				signInDataType:0,
+				signInData:{
+					title:'签到成功',
+					userName:'姓名',
+					userAccount:'学号',
+					subName:'实验室名称',
+					address:'楼栋-楼层-房间号',
+					signIn:'2025-09-20 15:15:15',
+					signOut:'2025-09-20 15:15:15',
+					residenceTime:'20-20-20-20',
+				},
+				timeNum:0,
+				timeData:null,
 			}
 		},
 		// 父页面
@@ -221,6 +306,7 @@
 				this.$set(this, 'newData', newData);
 				this.$set(this, 'subjectData', newData);
 				this.$set(this, 'pageType', 0);
+				this.laboratoryLabHkPassOutIsEnableSign();
 			})
 
 		},
@@ -385,6 +471,98 @@
 					}
 				}
 			},
+			//是否可以门禁签到
+			async laboratoryLabHkPassOutIsEnableSign(subId,planSetId) {
+				let self = this;
+				let obj = {
+					subId:this.newData.subId
+				};
+				const {
+					data
+				} = await laboratoryLabHkPassOutIsEnableSign(obj);
+				if (data.code == 200) {
+					if(data.data){
+						this.laboratoryLabHkPassOutIsSign();
+					}
+				}
+			},
+			//是否已经签到
+			async laboratoryLabHkPassOutIsSign(subId,planSetId) {
+				let self = this;
+				let obj = {
+					subId:this.newData.subId
+				};
+				const {
+					data
+				} = await laboratoryLabHkPassOutIsSign(obj);
+				if (data.code == 200) {
+					if(data.data){
+						this.$set(this,'signInType',2);
+					}else{
+						this.$set(this,'signInType',1);
+					}
+				}
+			},
+			//门禁签到
+			async laboratoryLabHkPassOutSignIn(subId,planSetId) {
+				let self = this;
+				let obj = {
+					subId:this.newData.subId
+				};
+				const {
+					data
+				} = await laboratoryLabHkPassOutSignIn(obj);
+				if (data.code == 200) {
+					let obj = data.data;
+					obj.title = '签到成功';
+					obj.address = this.newData.buildName +'-'+this.newData.floorName +'-'+this.newData.roomNum;
+					obj.signIn = parseTime(obj.signIn, "{y}-{m}-{d} {h}:{i}:{s}");
+					this.$set(this,'signInData',obj);
+					this.$set(this,'signInDataType',1);
+					this.$set(this,'signInShowType',true);
+					this.timerFunction();
+					this.laboratoryLabHkPassOutIsSign();
+				}
+			},
+			//门禁签退
+			async laboratoryLabHkPassOutSignOut(subId,planSetId) {
+				let self = this;
+				let obj = {
+					subId:this.newData.subId
+				};
+				const {
+					data
+				} = await laboratoryLabHkPassOutSignOut(obj);
+				if (data.code == 200) {
+					let obj = data.data;
+					obj.title = '签退成功';
+					obj.address = this.newData.buildName +'-'+this.newData.floorName +'-'+this.newData.roomNum;
+					obj.signIn = parseTime(obj.signIn, "{y}-{m}-{d} {h}:{i}:{s}");
+					obj.signOut = parseTime(obj.signOut, "{y}-{m}-{d} {h}:{i}:{s}");
+					this.$set(this,'signInData',obj);
+					this.$set(this,'signInDataType',2);
+					this.$set(this,'signInShowType',true);
+					this.timerFunction();
+					this.laboratoryLabHkPassOutIsSign();
+				}
+			},
+			timerFunction(){
+				let self = this;
+				this.$set(this,'timeNum',10);
+				this.timeData = setInterval(refreshCount, 1000);
+				function refreshCount() {
+					if(self.timeNum>0){
+						self.$set(self,'timeNum',self.timeNum - 1);
+					}else{
+						self.$set(self,'signInShowType',false);
+						clearInterval(self.timeData);
+					}
+				}
+			},
+			offButton(){
+				clearInterval(this.timeData);
+				this.$set(this,'signInShowType',false);
+			},
 			batchClickTow(row) {
 				let infoData = row;
 				infoData.pageType = 0;
@@ -398,6 +576,7 @@
 </script>
 
 <style lang="stylus" scoped>
+	@import '@/api/request/imagesUrl.styl';
 	.safetyCardScan {
 		height: 100%;
 
@@ -809,24 +988,31 @@
 				}
 			}
 		}
-
+		.button-box-1{
+			img:nth-child(1){
+				margin:0 143rpx;
+			}
+		}
+		.button-box-2{
+			img:nth-child(1){
+				margin-left:68rpx;
+			}
+			img:nth-child(2){
+				margin:0 67rpx;
+			}
+			img:nth-child(3){
+				margin-right:68rpx;
+			}
+		}
 		.position-button-box {
 			position: fixed;
 			bottom: 40rpx;
 			display: flex;
 			justify-content: center;
-
 			>img {
 				width: 160rpx;
 				height: 160rpx;
 			}
-
-			.position-button-p-1 {
-				margin-left: 174rpx;
-				margin-right: 120rpx;
-			}
-
-			.position-button-p-2 {}
 		}
 
 		.shade-box {
@@ -924,6 +1110,122 @@
 				}
 			}
 		}
-
+		.shade-sign-in-max-box{
+			height: 100%;
+			width: 100%;
+			position: fixed;
+			display: flex;
+			flex-direction: column;
+			z-index: 200;
+			background: rgba(0, 0, 0, 0.2);
+			top: 0;
+			.shade-sign-in-min-box-1{
+				width:600rpx;
+				height:685rpx;
+				position: absolute;
+				top:50%;
+				left:50%;
+				margin-top:-442rpx;
+				margin-left:-300rpx;
+				background-color: #fff;
+				border-radius: 20rpx;
+				overflow: hidden
+				.shade-sign-in-title-p{
+					background: url($imagesUrl+'safetyCheck/img_qdcg@1x.png') no-repeat;
+					background-size:100%;
+					background-repeat: no-repeat;
+				}
+			}
+			.shade-sign-in-min-box-2{
+				width:600rpx;
+				height:908rpx;
+				position: absolute;
+				top:50%;
+				left:50%;
+				margin-top:-554rpx;
+				margin-left:-300rpx;
+				background-color: #fff;
+				border-radius: 20rpx;
+				overflow: hidden
+				.shade-sign-in-title-p{
+					background: url($imagesUrl+'safetyCheck/img_qtcg@1x.png') no-repeat;
+					background-size:100%;
+					background-repeat: no-repeat;
+				}
+			}
+			.shade-sign-in-title-p{
+				width: 600rpx;
+				height: 100rpx;
+				font-size:36rpx;
+				color:#fff;
+				text-align: center;
+				line-height:100rpx;
+			}
+			.shade-sign-in-img-text-box{
+				margin-left:49rpx;
+				margin-top:38rpx;
+				.shade-sign-in-img-text-min-box{
+					display: flex;
+					img{
+						width: 36rpx;
+						height: 36rpx;
+						margin-right:12rpx;
+					}
+					view{
+						height: 36rpx;
+						font-weight: normal;
+						font-size: 30rpx;
+						color: #666666;
+						line-height: 36rpx;
+						text-align: left;
+						font-style: normal;
+						text-transform: none;
+					}
+				}
+				.shade-sign-in-img-text-p{
+					margin-top:25rpx;
+					height: 36rpx;
+					font-weight: normal;
+					font-size: 30rpx;
+					color: #3D3D3D;
+					line-height: 36rpx;
+					text-align: left;
+					font-style: normal;
+					text-transform: none;
+				}
+			}
+			.shade-sign-in-text-p-1{
+				margin-left:46rpx;
+				margin-top:47rpx;
+				height: 30rpx;
+				font-weight: normal;
+				font-size: 30rpx;
+				color: #666666;
+				line-height: 30rpx;
+				text-align: left;
+				font-style: normal;
+				text-transform: none;
+			}
+			.shade-sign-in-text-p-2{
+				margin-left:46rpx;
+				margin-top:27rpx;
+				height: 30rpx;
+				font-weight: normal;
+				font-size: 26rpx;
+				color: #666666;
+				line-height: 30rpx;
+				text-align: left;
+				font-style: normal;
+				text-transform: none;
+			}
+			.off-button-p{
+				width:600rpx;
+				height:100rpx;
+				line-height:100rpx;
+				font-size:30rpx;
+				color: #0183FA;
+				text-align: center;
+			}
+		}
 	}
 </style>