heyang 1 gadu atpakaļ
vecāks
revīzija
a57572191a
43 mainītis faili ar 7016 papildinājumiem un 1027 dzēšanām
  1. 7 1
      component/homeConfigurationSlot.vue
  2. 42 9
      component/mineConfigurationSlot.vue
  3. 4 4
      component/tabBar.vue
  4. 0 333
      page_basics/accessQualification/accessQualification.vue
  5. 0 440
      page_basics/accessQualification/accessQualificationInfo.vue
  6. 0 152
      page_basics/accessQualification/approve.vue
  7. 122 13
      pages.json
  8. 4 4
      pages/home/home.vue
  9. 26 47
      pages/home/studentWorkbench.vue
  10. 3 3
      pages/information/information.vue
  11. 2 2
      pages/login/login.vue
  12. 0 0
      pages_basics/component/compress.vue
  13. 1 1
      page_basics/earlyWarningManage/earlyWarningDetail.vue
  14. 1 1
      page_basics/earlyWarningManage/earlyWarningList.vue
  15. 0 0
      pages_basics/earlyWarningManage/videoMonitoring.vue
  16. 150 0
      pages_basics/faceImage.vue
  17. 415 0
      pages_basics/fingerprint.vue
  18. BIN
      pages_basics/images/icon_wd_zw.png
  19. BIN
      pages_basics/images/icon_zw_bk.png
  20. BIN
      pages_basics/images/img_dzqm_sl.png
  21. 0 0
      pages_basics/photoInspection.vue
  22. 272 0
      pages_basics/signature/signature.vue
  23. 140 0
      pages_basics/signature/signatureImg.vue
  24. 290 0
      pages_manage/gradingControl/gradingControl.vue
  25. 644 0
      pages_manage/gradingControl/gradingControlAdd.vue
  26. 445 0
      pages_manage/gradingControl/gradingControlDetail.vue
  27. 306 0
      pages_manage/gradingControl/gradingControlFinish.vue
  28. BIN
      pages_manage/images/icon_aqxxp_dxaq.png
  29. BIN
      pages_manage/images/icon_aqxxp_gbmc.png
  30. BIN
      pages_manage/images/icon_aqxxp_gbsd.png
  31. BIN
      pages_manage/images/icon_aqxxp_gzf.png
  32. BIN
      pages_manage/images/icon_aqxxp_jzxy.png
  33. BIN
      pages_manage/images/icon_aqxxp_jzys.png
  34. 28 0
      pages_manage/laboratory/broadcast.vue
  35. 1744 0
      pages_manage/laboratory/laboratoryInfo.vue
  36. 529 0
      pages_manage/laboratory/meLaboratory.vue
  37. 586 0
      pages_manage/laboratory/monitor.vue
  38. 237 0
      pages_manage/laboratory/safetyCard.vue
  39. 149 0
      pages_manage/laboratory/word.vue
  40. 297 0
      pages_manage/plan/planInfo.vue
  41. 555 0
      pages_manage/plan/planList.vue
  42. 3 3
      utils/homeConfig.js
  43. 14 14
      utils/mineConfig.js

+ 7 - 1
component/homeConfigurationSlot.vue

@@ -57,7 +57,7 @@
 				<view class="grading">
 					<img class="grading_l" :src="item.img" />
 					<view class="grading_c">{{item.name}}</view>
-					<view class="grading_r" v-if="item.route === 'grading'" @click="buttonClick(item)">
+					<view class="grading_r" v-if="item.route === 'gradingControl'" @click="buttonClick(item)">
 						{{gradingCount>0?gradingCount+'项工作待完成':''}}
 						<img src="@/images/basicsModules/icon_wdwg_gd.png" />
 					</view>
@@ -141,6 +141,12 @@
 							url: item.routeUrl,
 						});
 					}
+					console.log(11)
+					if (item.route === 'gradingControl') {//分級管控
+						uni.navigateTo({
+							url: item.routeUrl,
+						});
+					}
 					
 					
 					

+ 42 - 9
component/mineConfigurationSlot.vue

@@ -31,9 +31,9 @@
 				<view class="button-max-box" @click="buttonClick(item)">
 					<img class="left-img" :src="item.img">
 					<view>{{item.name}}</view>
-					<view class="view-three-one" v-if="item.route === 'alarm' && securityAlertNum>0">{{securityAlertNum}}</view>
+					<view class="view-three-one" v-if="item.route === 'mineWarningRecording' && securityAlertNum>0">{{securityAlertNum}}</view>
 					<view class="view-three-two" v-if="item.route === 'laboratory' && adminSubCount>0">{{adminSubCount}}</view>
-					<view class="view-three-two" v-if="item.route === 'record' && wranDoCount>0">{{wranDoCount}}</view>
+					<view class="view-three-two" v-if="item.route === 'PlanExecuteRecord' && wranDoCount>0">{{wranDoCount}}</view>
 					<view class="view-three-type" v-if="item.route === 'faceImage'"
 					:class="!ifFaceFeature?'colorA':'marginType'">
 						{{!ifFaceFeature?'去认证':'已认证'}}
@@ -63,11 +63,11 @@
 			//用户签名
 			signatureUrl: "",
 			//预案执行记录
-			wranDoCount: 0,
+			wranDoCount: 10,
 			//我的实验室
 			adminSubCount: 0,
 			//预警记录
-			securityAlertNum: 0,
+			securityAlertNum: 10,
 		},
 		data() {
 			return {
@@ -83,9 +83,42 @@
 			//按钮点击事件
 			buttonClick(item) {
 				if (item.buttonType === 'page') {
-					uni.navigateTo({
-						url: item.routeUrl,
-					});
+					if (item.route === 'mineWarningRecording') {//预警记录
+						uni.navigateTo({
+							url: item.routeUrl,
+						});
+					}
+					if (item.route === 'laboratory') {//我的实验室
+						uni.navigateTo({
+							url: item.routeUrl,
+						});
+					}
+					if (item.route === 'PlanExecuteRecord') {//预案执行记录
+						uni.navigateTo({
+							url: item.routeUrl,
+						});
+					}
+					if (item.route === 'faceImage') {//身份验证
+						uni.navigateTo({
+							url: item.routeUrl,
+						});
+					}
+					if (item.route === 'signature') {//电子签名
+						uni.navigateTo({
+							url: item.routeUrl,
+						});
+					}
+					if (item.route === 'fingerprint') {//指纹
+						uni.navigateTo({
+							url: item.routeUrl,
+						});
+						//this.fingerprintClick(item.routeUrl)
+					}
+					
+					
+					
+					
+					
 				} else if (item.buttonType === 'button') {
 					if (item.route === 'fingerprint') {
 						this.fingerprintClick();
@@ -106,14 +139,14 @@
 				});
 			},
 			//查询用户指纹录取数据
-			async fingerprintClick() {
+			async fingerprintClick(routeUrl) {
 				let _this = this;
 				const {
 					data
 				} = await fingerprintQueryList(uni.getStorageSync('userId'));
 				if (data.code == 200) {
 					uni.navigateTo({
-						url: '/pages/fingerprint', //指纹信息
+						url: routeUrl, //指纹信息
 					});
 				}
 			},

+ 4 - 4
component/tabBar.vue

@@ -77,9 +77,9 @@
 			},
             tabBarGoPage(type){
                 if(type === 1){
-                    if (this.currentRoute !== 'pages/home') {
+                    if (this.currentRoute !== 'pages/home/home') {
                         uni.redirectTo({
-                            url: '/pages/home',
+                            url: '/pages/home/home',
                         });
                     }
 				}else if(type === 2){
@@ -89,9 +89,9 @@
                         });
                     }
                 }else if(type === 3){
-                    if (this.currentRoute !== 'pages/mine') {
+                    if (this.currentRoute !== 'pages/mine/mine') {
                         uni.redirectTo({
-                            url: '/pages/mine',
+                            url: '/pages/mine/mine',
                         });
                     }
                 }

+ 0 - 333
page_basics/accessQualification/accessQualification.vue

@@ -1,333 +0,0 @@
-<!-- 准入资格证书 -->
-<template>
-    <view id="accessQualification">
-		<view class="top-picker-max-box">
-			<view class="top-picker-left-box">审核状态</view>
-			<picker class="top-picker-right-box" @change="buttonChange"
-			:range-key="'name'" :value="id" :range="buttonArray">
-				<view>{{buttonArray[buttonArrayIndex].name}}</view>
-			</picker>
-		</view>
-        <scroll-view scroll-y @scrolltolower="scrollGet" class="info-max-box">
-			<view class="for-big-box" v-for="(item,index) in infoList" :key="index">
-			    <view class="for-time-p">{{item.creatTime}}</view>
-			    <img class="for-back-img" src="@/images/basicsModules/for_min_bg.png">
-			    <view class="for-list-box" @click="goPageInfo(minItem)"
-				v-for="(minItem,indexTwo) in item.applyList" :key="indexTwo">
-			        <view class="min-for-box-one">
-						<view :class="minItem.auditStatus==1?'titleType1':(minItem.auditStatus==0?'titleType2':(minItem.auditStatus==2?'titleType3':''))">{{minItem.auditStatus==1?'未通过':(minItem.auditStatus==0?'待审核':(minItem.auditStatus==2?'已通过':''))}}</view>
-						<view>{{minItem.subjectName}}</view>
-					</view>
-					<view class="min-for-box-two">
-						<view></view>
-						<view>申请人:{{minItem.userName}}</view>
-						<view>{{minItem.hi}}</view>
-					</view>
-			    </view>
-			</view>
-            <view class="get-null-box" v-if="getData.nullDataType">暂无更多数据</view>
-        </scroll-view>
-		<view class="tip">请联系管理员开通<text>白名单</text>来获取实验室准入资格</view>
-       <!-- <view class="bottom-button-box" @click="goSafeAccess">我的准入</view> -->
-    </view>
-</template>
-
-<script>
-    import { applyList } from '@/api/apiDemo/index.js'
-    export default {
-        data() {
-            return {
-				//选项
-				buttonArray:[
-					{name:"全部",id:""},
-					{name:"待审核",id:"0"},
-					{name:"已通过",id:"2"},
-					{name:"未通过",id:"1"},
-				],
-				buttonArrayIndex:0,
-				auditStatus:"",
-                //列表请求参数
-                getData:{
-                    page:1,
-                    pageSize:20,
-                    getType:true,
-                    nullDataType:true,
-                },
-                infoList:[],
-            }
-        },
-        onLoad() {
-
-        },
-        onShow(){
-            this.clearData();
-            this.getList();
-        },
-        methods: {
-			goSafeAccess(){
-				uni.navigateTo({
-					url: '/pages_student/workbench/safeAccess/safeAccess',
-				});
-			},
-            //清除
-            clearData(){
-                this.infoList = [];
-                this.getData.page = 1;
-                this.getData.getType = true;
-                this.getData.nullDataType = true;
-            },
-            //去详情页
-            goPageInfo(item){
-                // uni.navigateTo({
-                //     url:'/pages_manage/workbench/accessQualification/accessQualificationInfo?item='+encodeURIComponent(JSON.stringify(item))+'&type='+encodeURIComponent(JSON.stringify(this.tabIndex))
-                // })
-                uni.navigateTo({
-                    url:'/page_basics/accessQualification/accessQualificationInfo?item='+encodeURIComponent(JSON.stringify(item))
-                })
-            },
-            //滚动事件
-            scrollGet(){
-                if(this.getData.getType){
-                    this.getData.page += 1;
-                    this.getList();
-                }
-            },
-            //获取头部数量数据
-            async getTabData(){
-                console.log("123")
-                const {data} = await getApprovalCount()
-                if(data.code == 200){
-                    this.tabData = data.data;
-                }
-            },
-			//选择
-			buttonChange(e){
-				this.buttonArrayIndex = e.detail.value;
-                this.infoList = [];
-                this.getData.page = 1;
-                this.getData.getType = true;
-                this.getData.nullDataType = true;
-				this.$set(this,'auditStatus',this.buttonArray[this.buttonArrayIndex].id);
-				this.getList();
-			},
-            //获取列表数据
-            async getList(){
-                let self = this;
-                let obj = {
-                    pageNum:this.getData.page,
-                    pageSize:this.getData.pageSize,
-					auditStatus:this.auditStatus
-                }
-                const {data} = await applyList(obj)
-                if(data.code==200){
-                    if(self.page==1){
-                        if(data.rows.length > 0 && data.rows.length == self.getData.pageSize){
-                            self.infoList = data.rows;
-                        }else if(data.rows.length > 0 && data.rows.length != self.getData.pageSize){
-                            self.infoList = data.rows;
-                            self.getData.getType = false;
-                            self.getData.nullDataType = true;
-                        }else{
-                            self.getData.getType = false;
-                            self.getData.nullDataType = true;
-                        }
-                    }else{
-                        if(data.rows.length > 0 && data.rows.length == self.getData.pageSize){
-                            self.infoList = self.infoList.concat(data.rows)
-                        }else if(data.rows.length > 0 && data.rows.length != self.getData.pageSize){
-                            self.infoList = self.infoList.concat(data.rows);
-                            self.getData.getType = false;
-                            self.getData.nullDataType = true;
-                        }else{
-                            self.getData.getType = false;
-                            self.getData.nullDataType = true;
-                        }
-                    }
-                }
-
-            },
-        }
-    }
-</script>
-
-<style lang="stylus" scoped>
-    #accessQualification{
-        height:100%;
-        display flex
-        flex-direction column
-		.top-picker-max-box{
-			height:100rpx;
-			display flex;
-			height:150rpx;
-			background #fff;
-			overflow hidden
-			margin-bottom:15rpx;
-			.top-picker-left-box{
-				margin-top:34rpx;
-				line-height:82rpx;
-				width:145rpx;
-				text-align center;
-			}
-			.top-picker-right-box{
-				margin-top:34rpx;
-				width:586rpx;
-				height:82rpx;
-				border:1rpx solid #A2A2A2;
-				line-height:82rpx;
-				border-radius:6rpx;
-				view{
-					padding:0 20rpx;
-					color:#999999;
-				}
-			}
-		}
-        .top-max-box{
-            height:100rpx;
-            display flex
-            background #fff
-            margin-bottom:20rpx;
-            .top-button-box{
-                width:200rpx;
-                padding-top:3rpx;
-                view:nth-child(1){
-                    font-size:30rpx;
-                    text-align center;
-                    color:#333;
-                    line-height:95rpx;
-                }
-                view:nth-child(2){
-                    width:100rpx;
-                    height:5rpx;
-                    margin:0 auto;
-                }
-                .colorA{
-                    color:#0183FA!important;
-                }
-                .backA{
-                    background:#0183FA;
-                }
-            }
-        }
-        .info-max-box{
-            flex:1;
-            overflow: scroll
-			.for-big-box:last-child{
-			    margin-bottom:180rpx;
-			}
-			.for-big-box{
-			    margin:0 20rpx 20rpx;
-			    overflow hidden
-				border-radius:20rpx;
-			    // border-bottom-left-radius :20rpx;
-			    // border-bottom-right-radius :20rpx;
-				background #fff;
-			    .for-time-p{
-			        background #fff
-			        line-height:57rpx;
-			        font-size:30rpx;
-			        padding:14rpx 22rpx 0;
-			        // border-top-left-radius:20rpx;
-			        // border-top-right-radius:20rpx;
-			    }
-			    .for-back-img{
-			        height:30rpx;
-			        width:710rpx;
-			    }
-				.for-list-box:nth-child(3){
-					border:none;
-				}
-			    .for-list-box{
-					border-top:1rpx solid #E0E0E0;
-					margin:0 24rpx;
-					padding:20rpx 0;
-					.min-for-box-one{
-						display:flex;
-						view{
-							height:36rpx;
-							line-height:36rpx;
-							margin:10rpx 0;
-						}
-						view:nth-child(1){
-							width:100rpx;
-							margin-right:20rpx;
-							line-height:36rpx;
-							text-align center;
-							font-size:20rpx;
-						}
-						view:nth-child(2){
-							flex:1;
-							font-size:28rpx;
-						}
-						.titleType1{
-							border-radius:6rpx;
-							color:#FF5555;
-							background rgba(255,85,85,0.2)
-						}
-						.titleType2{
-							border-radius:6rpx;
-							color:#F6A71D;
-							background rgba(246,167,29,0.2)
-						}
-						.titleType3{
-							border-radius:6rpx;
-							color:#30A23D;
-							background rgba(48,162,61,0.2)
-						}
-					}
-					.min-for-box-two{
-						display:flex;
-						view{
-							height:36rpx;
-							line-height:36rpx;
-							margin:10rpx 0;
-						}
-						view:nth-child(1){
-							width:100rpx;
-							margin-right:20rpx;
-							line-height:36rpx;
-							text-align center;
-							font-size:20rpx;
-						}
-						view:nth-child(2){
-							flex:1;
-							font-size:26rpx;
-						}
-						view:nth-child(3){
-							font-size:26rpx;
-						}
-					}
-			    }
-			}
-            .get-null-box{
-                height:100rpx;
-                line-height:100rpx;
-                color:#999;
-                text-align center
-            }
-        }
-        .bottom-button-box{
-			border-radius:20rpx;
-			margin:20rpx 50rpx;
-            width: 650rpx;
-            height: 100rpx;
-            line-height: 100rpx;
-            background: #0183FA;
-            font-size: 30rpx;
-            color: #FFFFFF;
-            text-align center;
-        }
-		.tip{
-			width: 750rpx;
-			height: 100rpx;
-			line-height :100rpx;
-			border-top: 1rpx solid #e0e0e0;
-			background: #fff;
-			font-size: 30rpx;
-			color: #333;
-			text-align center;
-			>text{
-				color:red;
-			}
-		}
-    }
-</style>

+ 0 - 440
page_basics/accessQualification/accessQualificationInfo.vue

@@ -1,440 +0,0 @@
-<!-- 准入资格申请详情 -->
-<template>
-    <view id="accessQualificationInfo" v-if="pageType">
-		<view class="user-info-box">
-			<view class="user-info-box-min">
-				<view>实验室:</view>
-				<view>{{subjectData.labSecurityApply.subjectName}}</view>
-			</view>
-			<view class="user-info-box-min">
-				<view>申请人:</view>
-				<view>{{subjectData.labSecurityApply.userName}}</view>
-			</view>
-			<view class="user-info-box-min">
-				<view>申请时限:</view>
-				<view>{{subjectData.labSecurityApply.validBeginTime}}至{{subjectData.labSecurityApply.validEndTime}}</view>
-			</view>
-			<view class="user-info-box-min">
-				<view>申请备注:</view>
-				<view>{{subjectData.labSecurityApply.applyCause==null?'':subjectData.labSecurityApply.applyCause}}</view>
-			</view>
-		</view>
-		<view class="user-info-box">
-			<view class="user-info-box_title"><view style="color: red;">*</view>身份信息:(关联学生信息材料)</view>
-			<view class="user-info-box-min">
-				<view>申请人:</view>
-				<view>{{subjectData.sysUser.nickName}}</view>
-			</view>
-			<view class="user-info-box-min">
-				<view>联系电话:</view>
-				<view>{{subjectData.sysUser.phonenumber}}</view>
-			</view>
-			<view class="user-info-box-min" >
-				<view>学号:</view>
-				<view>{{subjectData.sysUser.userName}}</view>
-			</view>
-			<view class="user-info-box-min">
-				<view>物理卡号:</view>
-				<view>{{subjectData.sysUser.cardNum}}</view>
-			</view>
-			<view class="user-info-box-min" >
-				<view>班级:</view>
-				<view>{{subjectData.sysUser.grade}}</view>
-			</view>
-			<view class="user-info-box-min" >
-				<view>导师:</view>
-				<view>{{subjectData.sysUser.tutorUserName}}</view>
-			</view>
-		</view>
-		<view v-for="(item,index) in subjectData.listTemp" :key="index" style="overflow: hidden;">
-			<view class="img-box" v-if="item.materialType==2&&item.relationType==2">
-				<view class="img-title">安全考试证书</view>
-				<img v-if="subjectData.listcert[0]" class="item-img-box" :src="subjectData.listcert[0].cert_url">
-				<view v-if="!subjectData.listcert[0]" style="margin-left:40px;color:#999;font-size:14px;">暂无证书</view>
-			</view>
-			<view class="word-box" v-if="item.materialType==1">
-				<view class="word-box-title">{{item.materialName}}</view>
-				<view class="word-box-min" v-for="(minItem,minIndex) in item.upList" :key="minIndex" @click="lookItem(minItem)">
-					<img src="@/pages_manage/images/Version2.3/icon_pdf.png" v-if="minItem.type == 'pdf'">
-					<img src="@/pages_manage/images/Version2.3/icon_word.png" v-if="minItem.type == 'doc' || minItem.type == 'docx'">
-					<img :src="baseUrl+minItem.url" v-if="minItem.type == 'png' || minItem.type == 'jpg' || minItem.type == 'jpeg' || minItem.type == 'gif'">
-					<view>{{minItem.name}}</view>
-				</view>
-			</view>
-		</view>
-		<view class="bottom-button-box" v-if="subjectData.labSecurityApply.auditStatus == 0">
-			<view @click="goReviewFailed">审核未通过</view>
-			<view @click="accessButtonClick">审核通过</view>
-		</view>
-    </view>
-</template>
-
-<script>
-
-     import { config } from '@/api/request/config.js'
-    import { getDetails,laboratoryApply } from '@/api/apiDemo/index.js'
-    export default {
-        data() {
-            return {
-				baseUrl:config.base_url,
-				pageType:false,
-				//获取数据
-				subjectData:{},
-				newData:{
-					text1:"甲烷监测实验室",
-					text2:"曹秀康",
-					text3:"学生",
-					text4:"2022-01-11  14:56",
-					text5:"曹秀康",
-					text6:"24141534553",
-					text7:"安全工程学院",
-					text8:"安全科学与工程专业",
-					textlist1:[
-						'https://img1.baidu.com/it/u=1349023829,1710986137&fm=253&fmt=auto&app=138&f=JPEG?w=786&h=500',
-						'https://img1.baidu.com/it/u=1349023829,1710986137&fm=253&fmt=auto&app=138&f=JPEG?w=786&h=500',
-						'https://img1.baidu.com/it/u=1349023829,1710986137&fm=253&fmt=auto&app=138&f=JPEG?w=786&h=500',
-					],
-					textlist2:[
-						{
-							type:1,
-							name:"信息照片副本.pdf",
-						},
-						{
-							type:2,
-							name:"信息照片副本.word",
-						},
-					],
-				},
-                itemData:{},
-                type:0,
-            }
-        },
-        onLoad(option) {
-            this.infoData = JSON.parse(decodeURIComponent(option.item));
-            //修改页面title
-            uni.setNavigationBarTitle({
-                title:this.infoData.auditStatus==0?'待审核':(this.infoData.auditStatus==1?'未通过':(this.infoData.auditStatus==2?'已通过':''))
-            });
-        },
-		onShow(){
-			this.getDetails()
-		},
-        methods: {
-			//审核按钮
-			accessButtonClick(){
-				let self = this;
-				uni.showModal({
-				    content: '确认审核吗?',
-				    cancelColor:"#999",
-				    confirmColor:"#0183FA",
-				    success: function (res) {
-				        if (res.confirm) {
-				            self.laboratoryApply();
-				        } else if (res.cancel) {
-				        }
-				    }
-				});
-			},
-			//审核接口
-			async laboratoryApply(){
-				let obj = {
-				  id:this.subjectData.labSecurityApply.id,
-				  auditStatus:2,
-				};
-				const {data} = await laboratoryApply(obj)
-				if(data.code == 200){
-					uni.showToast({
-						title: '审核成功',
-						icon:"none",
-						mask:true,
-						duration: 2000
-					});
-					setTimeout(function(){
-						uni.navigateBack();
-					},2000);
-				}
-
-			},
-			lookItem(minItem){
-				let self = this;
-				if(minItem.type == 'png' || minItem.type == 'jpg' || minItem.type == 'jpeg' || minItem.type == 'gif'){
-					//查看图片
-					wx.previewImage({
-						urls: [self.baseUrl+minItem.url], //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
-						current: '', // 当前显示图片的http链接,默认是第一个
-						success: function(res) {},
-						fail: function(res) {},
-						complete: function(res) {},
-					})
-				}else if(minItem.type == 'pdf' || minItem.type == 'doc' || minItem.type == 'docx'){
-					uni.showLoading({
-					    title: '下载中'
-					});
-					//下载文档
-					wx.downloadFile({
-						url: minItem.url,
-						header: {
-							Authorization: uni.getStorageSync('token')
-						},
-						success: function (res) {
-							const fileManager = wx.getFileSystemManager()
-							const filePath = wx.env.USER_DATA_PATH + '/' + minItem.name + '.docx'
-							fileManager.saveFile({
-								tempFilePath: res.tempFilePath,
-								filePath,
-								success: () => {
-									uni.hideLoading();
-									wx.openDocument({
-									filePath: filePath,
-									showMenu: true,
-									fileType: minItem.type
-									})
-								},
-								fail: function (res){
-									uni.hideLoading();
-									uni.showToast({
-										title: '下载失败',
-										icon:"none",
-										mask:true,
-										duration: 2000
-									});
-								}
-							})
-						},
-						fail: function (res){
-							uni.hideLoading();
-							uni.showToast({
-								title: '下载失败',
-								icon:"none",
-								mask:true,
-								duration: 2000
-							});
-						}
-					})
-				}
-			},
-            //获取安全准入审批记录详细信息(用户端)
-            async getDetails() {
-                let self = this;
-                const {data} = await getDetails({id:this.infoData.id})
-                if(data.code==200){
-				  for(let i=0;i<data.data.listTemp.length;i++){
-					if(data.data.listTemp[i].materialType == 1){
-					  let maxList = [];
-					  for(let o=0;o<data.data.listTemp[i].listMr.length;o++){
-						let bigList = data.data.listTemp[i].listMr[o].dataUrl.split(',');
-						for(let x=0;x<bigList.length;x++){
-						  if(bigList[x]){
-							let minList = bigList[x].split(';');
-							let minListTwo = minList[0].split('.')
-							let obj = {
-							  name:minList[0],
-							  url:minList[1],
-							  type:minListTwo[1]
-							};
-							maxList.push(obj);
-						  }
-						}
-					  }
-					  data.data.listTemp[i].upList = maxList;
-					}
-				  }
-				  this.$set(this,"subjectData",data.data);
-				  this.pageType = true;
-                }
-            },
-			goReviewFailed(){
-				let obj = {
-				  id:this.subjectData.labSecurityApply.id,
-				  rejectCause:this.subjectData.listTemp,
-				}
-				uni.navigateTo({
-				    url:'/page_basics/accessQualification/approve?item='+encodeURIComponent(JSON.stringify(obj))
-				})
-			},
-			//查看图片
-			lockImg(list){
-				if(!list[0]){
-					return
-				}
-				wx.previewImage({
-					urls: list, //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
-					current: '', // 当前显示图片的http链接,默认是第一个
-					success: function(res) {},
-					fail: function(res) {},
-					complete: function(res) {},
-				})
-			},
-            approveClick(){
-                let self = this;
-                uni.showModal({
-                    // title: '确认要退出吗?',
-                    content: '确认审核通过吗?',
-                    cancelColor:"#999",
-                    confirmColor:"#0183FA",
-                    success: function (res) {
-                        if (res.confirm) {
-                            self.appOperation();
-                        } else if (res.cancel) {
-                        }
-                    }
-                });
-            },
-            async appOperation(){
-                let self = this;
-                let obj = {
-                    id:this.itemData.id,
-                    recordContent:1,
-                };
-                const {data} = await appOperation(obj);
-                if(data.code == 200){
-                    uni.showToast({
-                        title: '提交成功',
-                        icon:"none",
-                        mask:true,
-                        duration: 2000
-                    });
-                    setTimeout(function(){
-                        uni.navigateBack();
-                    },2000);
-                }
-            },
-            async approvalDetailManage(){
-                let obj = {
-                    ids:this.itemData.id
-                }
-                const {data} = await approvalDetailManage(obj)
-                if(data.code == 200){
-                    this.newData = data.data;
-                }
-            },
-            //去不通过原因页面
-            goPageInfo(item){
-                uni.navigateTo({
-                    url:'/pages_manage/workbench/accessQualification/approve?item='+encodeURIComponent(JSON.stringify(this.itemData))
-                })
-            },
-        }
-    }
-</script>
-
-<style lang="stylus" scoped>
-    #accessQualificationInfo{
-        height:100%;
-		overflow-y scroll;
-		.user-info-box{
-			background #fff;
-			border-radius:20rpx;
-			margin:20rpx 20rpx 0;
-			padding:20rpx 0;
-			.user-info-box_title{
-				font-size: 30rpx;
-				font-family: PingFang SC;
-				font-weight: 500;
-				color: #333333;
-				line-height: 30rpx;
-				margin-left: 24rpx
-				margin-bottom :10px;
-				>view{
-					display inline-block;
-				}
-			}
-			.user-info-box-min{
-				margin:0 26rpx;
-				display flex;
-				view{
-					line-height:66rpx;
-					font-size:28rpx;
-				}
-				view:nth-child(1){
-					width:140rpx;
-					color:#999;
-				}
-				view:nth-child(2){
-					flex:1;
-					text-align right;
-					color:#333;
-				}
-			}
-		}
-		.user-card-box{
-			background #fff;
-			border-radius:20rpx;
-			margin:0 20rpx 20rpx;
-			padding:20rpx 0;
-			.user-card-title{
-				padding-left:24rpx;
-				font-size:30rpx;
-				font-weight:700;
-				margin-bottom:20rpx;
-			}
-			.user-card-text{
-				line-height:66rpx;
-				font-size:28rpx;
-				color:#999;
-				padding:0 24rpx;
-			}
-		}
-		.img-box{
-			background #fff;
-			border-radius:20rpx;
-			margin:0 20rpx 20rpx;
-			padding:20rpx 0;
-			.img-title{
-				padding-left:24rpx;
-				font-size:30rpx;
-				font-weight:700;
-				margin-bottom:20rpx;
-			}
-			img{
-				display block;
-				width:640rpx;
-				margin:0 auto 10rpx;
-			}
-		}
-		.word-box{
-			background #fff;
-			border-radius:20rpx;
-			margin:0 20rpx 20rpx;
-			padding:20rpx 0;
-			.word-box-title{
-				padding-left:24rpx;
-				font-size:30rpx;
-				font-weight:700;
-				margin-bottom:20rpx;
-			}
-			.word-box-min{
-				display flex;
-				margin:0 20rpx 20rpx;
-				img{
-					height:60rpx;
-					width:60rpx;
-				}
-				view{
-					margin-left:20rpx;
-					line-height:60rpx;
-				}
-			}
-		}
-		.bottom-button-box{
-			display flex;
-			width:650rpx;
-			margin:40rpx auto;
-			view{
-				height:100rpx;
-				text-align center;
-				line-height:100rpx;
-				color:#fff;
-				width:325rpx;
-			}
-			view:nth-child(1){
-				background: linear-gradient(-45deg, #FA9901, #F28E26);
-				border-radius: 50rpx 0 0 50rpx;
-			}
-			view:nth-child(2){
-				background: linear-gradient(-35deg, #309CFF, #0183FA);
-				border-radius: 0 50rpx 50rpx 0;
-			}
-		}
-    }
-</style>

+ 0 - 152
page_basics/accessQualification/approve.vue

@@ -1,152 +0,0 @@
-<!-- 不通过原因 -->
-<template>
-    <view id="approve">
-		<view class="approve-title">驳回原因</view>
-        <textarea v-model="rejectCause" placeholder="请输入未通过原因" maxlength="50"></textarea>
-        <view class="button-view" @click="accessButtonClick">提交</view>
-    </view>
-</template>
-
-<script>
-    import { laboratoryApply } from '@/api/apiDemo/index.js'
-    export default {
-        data() {
-            return {
-                itemData:{},
-				rejectCause:"",
-				checkList:[],
-            }
-        },
-        onLoad(option) {
-			let self = this;
-            this.itemData = JSON.parse(decodeURIComponent(option.item));
-			for(let i=0;i<self.itemData.rejectCause.length;i++){
-				self.itemData.rejectCause[i].type = false
-			}
-            // this.itemData = JSON.parse(decodeURIComponent(option.item));
-        },
-        methods: {
-			accessButtonClick(){
-				let self = this;
-				let num = 0;
-				this.$set(this,'checkList',[])
-				for(let i=0;i<self.itemData.rejectCause.length;i++){
-					if(self.itemData.rejectCause[i].type){
-						num++
-						this.checkList.push(self.itemData.rejectCause[i].id);
-					}
-				}
-				/* if(num == 0){
-					uni.showToast({
-						title: '请勾选未通过材料',
-						icon:"none",
-						mask:true,
-						duration: 2000
-					});
-					return
-				} */
-				if(!self.rejectCause){
-					uni.showToast({
-						title: '请输入驳回原因',
-						icon:"none",
-						mask:true,
-						duration: 2000
-					});
-					return
-				}
-				uni.showModal({
-				    content: '确认拒绝通过吗?',
-				    cancelColor:"#999",
-				    confirmColor:"#0183FA",
-				    success: function (res) {
-				        if (res.confirm) {
-				            self.laboratoryApply();
-				            console.log('用户点击确定');
-				        } else if (res.cancel) {
-				            console.log('用户点击取消');
-				        }
-				    }
-				});
-			},
-			//审核接口
-			async laboratoryApply(){
-				let obj = {
-				  id:this.itemData.id,
-				  auditStatus:1,
-				  rejectCause:this.rejectCause,
-				  rejectMaterial:this.checkList + '',
-				};
-				const {data} = await laboratoryApply(obj)
-				if(data.code == 200){
-					uni.showToast({
-						title: '审核成功',
-						icon:"none",
-						mask:true,
-						duration: 2000
-					});
-					setTimeout(function(){
-						uni.navigateBack({
-						    delta: 2
-						});
-					},2000);
-				}
-
-			},
-			checkItem(item){
-				item.type = !item.type;
-				this.$forceUpdate();
-			},
-        }
-    }
-</script>
-
-<style lang="stylus" scoped>
-    #approve{
-        height:100%;
-        background #fff
-        overflow hidden
-        textarea{
-            width:670rpx;
-            height:200rpx;
-            margin:20rpx 30rpx 0;
-            font-size:28rpx;
-            border: 1rpx solid #E0E0E0;
-            border-radius:10rpx;
-            padding:20rpx;
-        }
-		.approve-title{
-			font-weight:700;
-			color:#333;
-			font-size:30rpx;
-			font-weight:700;
-			margin:20rpx 30rpx ;
-
-		}
-		.approve-for-box{
-			display flex;
-			height:60rpx;
-			padding-left:40rpx;
-			img{
-				width:30rpx;
-				height:30rpx;
-				margin:15rpx;
-			}
-			view{
-				font-size:28rpx;
-				height:60rpx;
-				line-height:60rpx;
-			}
-		}
-        .button-view{
-            width: 600rpx;
-            height: 80rpx;
-            background: #0183FA;
-            border-radius: 20rpx;
-            font-size:30rpx;
-            line-height:80rpx;
-            text-align center;
-            color: #fff;
-            margin:90rpx auto;
-        }
-    }
-</style>

+ 122 - 13
pages.json

@@ -16,12 +16,12 @@
 				"navigationBarBackgroundColor": "#0183FA" //导航背景色
 			}
 		},
-		// {
-		// 	"path": "pages/information/information",//消息
-		// 	"style": {
-		// 		"navigationBarTitleText": "消息"
-		// 	}
-		// },
+		{
+			"path": "pages/information/information",//消息
+			"style": {
+				"navigationBarTitleText": "消息"
+			}
+		},
 		{
 			"path": "pages/home/home",//首页
 			"style": {
@@ -38,24 +38,51 @@
 			"root": "pages_supplier",  //分包根路径
 			"name": "supplier", //分包名字可写可不写
 			"pages": [
-				
+
 			]
 		},
 		{
 			/* 基础分包 */
-			"root": "page_basics",  //分包根路径
+			"root": "pages_basics",  //分包根路径
 			"name": "basics", //分包名字可写可不写
 			"pages": [
+				/* 离开检查 */
 				{
 					"path": "photoInspection",
 					"style": {
 						"navigationBarTitleText": "离开检查"
 					}
 				},
+
+				/* 身份验证 */
 				{
-					"path": "accessQualification/accessQualification",
+					"path": "faceImage",//身份验证
 					"style": {
-						"navigationBarTitleText": "准入审核"
+						"navigationBarTitleText": "身份验证"
+					}
+				},
+				/* 电子签名 */
+				{
+					"path": "signature/signature",//电子签名
+					"style": {
+						"navigationBarTitleText": "电子签名",
+						"navigationBarTextStyle": "white", //导航文字颜色
+						"navigationBarBackgroundColor": "#0183FA" //导航背景色
+					}
+				},
+				{
+					"path": "signature/signatureImg",//电子签名-图片处理
+					"style": {
+						"navigationBarTitleText": ""
+					}
+				},
+				/* 指纹 */
+				{
+					"path": "fingerprint",//指纹信息
+					"style": {
+						"navigationBarTitleText": "指纹信息",
+						"navigationBarTextStyle": "white", //导航文字颜色
+						"navigationBarBackgroundColor": "#0183FA" //导航背景色
 					}
 				},
 				/* 预警信息 */
@@ -71,7 +98,7 @@
 						"navigationBarTitleText": "预警记录"
 					}
 				},
-		
+
 				{
 					"path": "earlyWarningManage/videoMonitoring",
 					"style": {
@@ -85,7 +112,7 @@
 			"root": "pages_student",  //分包根路径
 			"name": "student", //分包名字可写可不写
 			"pages": [
-				
+
 			]
 		},
 		{/* 管理端分包 */
@@ -106,6 +133,88 @@
 						"pageOrientation": "landscape"
 					}
 				},
+				/* 准入审核 */
+				{
+					"path": "accessQualification/accessQualification",
+					"style": {
+						"navigationBarTitleText": "准入审核"
+					}
+				},
+				/* 我的实验室 */
+				{
+					"path": "laboratory/meLaboratory",//我的实验室
+					"style": {
+						"navigationBarTitleText": "我的实验室"
+					}
+				},
+				{
+					"path": "laboratory/laboratoryInfo",//实验室详情
+					"style": {
+						"navigationBarTitleText": "实验室详情"
+					}
+				},
+				{
+					"path": "laboratory/broadcast",//开始广播
+					"style": {
+						"navigationBarTitleText": "开始广播"
+					}
+				},
+				{
+					"path": "laboratory/word",//播放文字
+					"style": {
+						"navigationBarTitleText": "播放文字"
+					}
+				},
+				{
+					"path": "laboratory/monitor",//查看监控
+					"style": {
+						"navigationBarTitleText": "查看监控"
+					}
+				},
+				{
+					"path": "laboratory/safetyCard",//安全信息牌
+					"style": {
+						"navigationBarTitleText": "安全信息牌"
+					}
+				},
+				/* 预案执行记录 */
+				{
+					"path": "plan/planList",//预案执行记录
+					"style": {
+						"navigationBarTitleText": "预案执行记录"
+					}
+				},
+				{
+					"path": "plan/planInfo",//预案详情
+					"style": {
+						"navigationBarTitleText": "预案详情"
+					}
+				},
+				/* 分级管控 */
+				{
+					"path": "gradingControl/gradingControl",//分级管控
+					"style": {
+						"navigationBarTitleText": "分级管控"
+					}
+				},
+				{
+					"path": "gradingControl/gradingControlFinish",//分级管控-完成列表
+					"style": {
+						"navigationBarTitleText": "分级管控"
+					}
+				},
+				{
+					"path": "gradingControl/gradingControlAdd",//分级管控-添加
+					"style": {
+						"navigationBarTitleText": "分级管控"
+					}
+				},
+				{
+					"path": "gradingControl/gradingControlDetail",//分级管控-详情
+					"style": {
+						"navigationBarTitleText": "分级管控"
+					}
+				},
 				/* 用气申请 */
 				{
 					"path": "gasBottle/useGasApply/useGasApply",
@@ -401,7 +510,7 @@
 				}
 			]
 		}
-		
+
 	],
 	"globalStyle": {
 		"navigationBarTextStyle": "white", //导航文字颜色

+ 4 - 4
pages/home/home.vue

@@ -1,21 +1,21 @@
 <template>
   <view id="home">
    <manage-home v-if="userType==1" ref="manage"></manage-home>
-<!--    <user-home v-if="userType==2"></user-home>
-    <supplier-home v-if="userType==3"></supplier-home> -->
+   <user-home v-if="userType==2"></user-home>
+    <!-- <supplier-home v-if="userType==3"></supplier-home> -->
     <tab-bar v-if="userType!=3"></tab-bar>
   </view>
 </template>
 <script>
 import { manageHome } from '@/pages/home/manageWorkbench'
-// import { userHome } from '@/pages/home/studentWorkbench.vue'
+import { userHome } from '@/pages/home/studentWorkbench.vue'
 // import { supplierHome } from '@/pages/home/supplierWorkbench.vue'
 import { tabBar } from '@/component/tabBar.vue'
 export default {
   name: "home",
   components: {
     manageHome,
-    // userHome,
+    userHome,
     // supplierHome,
     tabBar
   },

+ 26 - 47
pages/home/studentWorkbench.vue

@@ -3,56 +3,19 @@
   <view class="user-workbench" :style="{paddingTop:navHeight+'rpx'}">
 	<nav-bar :title="title"></nav-bar>  
     <img class="top-big-img" :src="homepageBanner">
-    <view class="min-icon-button-box">
-      <view @click="goPage('casuallyPat')">
-        <img src="@/images/Version2.2/icon_sy_ssp.png">
-        <view>随手拍</view>
-      </view>
-      <view @click="saoCode">
-        <img src="@/images/Version2.2/btn_wd_jfdh.png">
-        <view>积分兑换</view>
-      </view>
-      <view @click="goPage('safeAccess')">
-        <img src="@/images/Version2.2/icon_sy_zrsq.png">
-        <view>准入申请</view>
-      </view>
-      <view @click="goPage('safetyInspect')">
-        <img src="@/images/Version2.2/icon_sy_aqjc.png">
-        <view>安全检查</view>
-      </view>
-      <view @click="goPage('photoInspection')">
-        <img src="@/images/icon_dzt_pzjc.png">
-        <view>离开检查</view>
-      </view>
-      <view @click="goPage('gas')">
-        <img src="@/images/Version3.0/icon_sy_qpgl.png">
-        <view>气瓶管理</view>
-      </view>
-      <view @click="goPage('none')">
-        <img src="@/images/Version3.0/icon_sy_hxp.png">
-        <view>化学品管理</view>
-      </view>
-      <view @click="goPage('none')">
-        <img src="@/images/Version3.0/icon_sy_tzsb.png">
-        <view>特种设备</view>
-      </view>
-    </view>
-    <!-- 分级管控 -->
-    <view class="grading">
-      <img class="grading_l" src="@/images/icon_sy_fjgk.png"/>
-      <view class="grading_c">分级管控</view>
-      <view class="grading_r" @click="goPage('grading')">{{gradingCount>0?gradingCount+'项工作待完成':''}}<img src="@/images/icon_wdwg_gd.png"/></view>
-    </view>
-    <view class="big-icon-button-box">
+	
+    <homeConfigurationSlot v-for="(item,index) in homeConfigData" :key="index" :homeConfig="item"></homeConfigurationSlot>
+   
+	<view class="big-icon-button-box">
       <view class="left-box">
-        <img class="left-top-img" @click="goNull" src="@/images/Version2.2/img_bg_cjcx.png">
-        <img class="left-bottom-img" @click="goPage('meViolation')" src="@/images/Version2.2/img_bg_wgjl.png">
+        <img class="left-top-img" @click="goNull" src="@/images/basicsModules/img_bg_cjcx.png">
+        <img class="left-bottom-img" @click="goPage('meViolation')" src="@/images/basicsModules/img_bg_wgjl.png">
       </view>
-      <img class="right-img" @click="goNull" src="@/images/Version2.2/img_bg_jfmx.png">
+      <img class="right-img" @click="goNull" src="@/images/basicsModules/img_bg_jfmx.png">
     </view>
     <view class="bottom-max-box">
       <view class="bottom-title">
-        <img src="@/images/Version2.2/icon_sy_wdzs.png">
+        <img src="@/images/basicsModules/icon_sy_wdzs.png">
         <view>我的证书</view>
       </view>
       <view class="bottom-big-box">
@@ -71,16 +34,20 @@
 </template>
 
 <script>
-import { myViolationCount,queryMyCert,outSubjectPhoto,gradingControl,getGentleIdentifier} from '@/api/basicsModules/index.js'
+import { myViolationCount,queryMyCert,outSubjectPhoto,gradingControl,getGentleIdentifier,systemAppletLayoutSelect} from '@/api/basicsModules/index.js'
 import { tabBar } from '@/component/tabBar.vue'
 import { navBar } from '@/component/navbar.vue'
+import { homeConfigurationSlot } from '@/component/homeConfigurationSlot'
+import { getHomeConfig } from '@/utils/homeConfig'
 export default {
   components: {
     tabBar,
-	navBar
+	navBar,
+	homeConfigurationSlot,
   },
   data() {
     return {
+		homeConfigData: [],
 		navHeight: uni.getStorageSync('navHeight'),
 	    title:'实验室安全智能监测与控制系统',		
 		hintType:false,
@@ -94,12 +61,24 @@ export default {
 
   },
   mounted(){
+	this.systemAppletLayoutSelect();  
     this.myViolationCount();
     this.getGrading();
 
     this.queryMyCert();
   },
   methods: {
+	//获取菜单配置
+	async systemAppletLayoutSelect() {
+			const {data} = await systemAppletLayoutSelect({module:'home'})
+			if(data.code == 200){
+			  let list = JSON.parse(JSON.stringify(data.data))
+			  for(let i=0;i<list.length;i++){
+				list[i].layout = JSON.parse(list[i].layout);
+			  }
+			  this.$set(this,'homeConfigData',getHomeConfig(list));
+			}
+	},  
     //获取分级管控未完成总数
     async getGrading(){
       let obj = {

+ 3 - 3
pages/information/information.vue

@@ -3,9 +3,9 @@
 	<view id="information">
 		<scroll-view scroll-y @scrolltolower="scrollGet" class="info-max-box">
 			<view class="for-info-box" v-for="(item,index) in infoList" :key="index" @click="goInfoPage(item)">
-				<img v-if='item.isApply==1' src="@/images/icon_xx_tz.png">
-				<img v-if='item.isApply==2' src="@/images/icon_xx_tz.png">
-				<img v-if='item.isApply!=1 && item.isApply!=2' src="@/images/icon_01.png">
+				<img v-if='item.isApply==1' src="@/images/basicsModules/icon_xx_tz.png">
+				<img v-if='item.isApply==2' src="@/images/basicsModules/icon_xx_tz.png">
+				<img v-if='item.isApply!=1 && item.isApply!=2' src="@/images/basicsModules/icon_01.png">
 				<view class="right-box">
 					<view class="top-box">
 						<view>{{item.isApply==1?'准入驳回':(item.isApply==2?item.remark:

+ 2 - 2
pages/login/login.vue

@@ -91,8 +91,8 @@ export default {
 	    uni.setStorageSync('token',data.data.token);
 	    uni.setStorageSync('userId',data.data.userId);
 		// userType 0-系统 1-教职工 2-学生 3-大屏
-	    uni.setStorageSync('userType',data.data.userType==0||data.data.userType==1?'1':
-		(data.data.userType==2?'2':(data.data.userType==3?'3':'none')));
+	    //uni.setStorageSync('userType',data.data.userType==0||data.data.userType==1?'1':
+	    uni.setStorageSync('userType','1');
 	    if(this.checkedType){
 	      uni.setStorageSync('userName',this.username)
 	      uni.setStorageSync('password',this.password)

page_basics/component/compress.vue → pages_basics/component/compress.vue


+ 1 - 1
page_basics/earlyWarningManage/earlyWarningDetail.vue

@@ -349,7 +349,7 @@ export default {
 		  let self=this;
 		  if( doType=='monitor'){//监控
 			  uni.navigateTo({
-			    url: '/page_basics/earlyWarningManage/videoMonitoring?subId='+this.form.subId+'&floorId='+this.form.floorId//我的实验室
+			    url: '/pages_basics/earlyWarningManage/videoMonitoring?subId='+this.form.subId+'&floorId='+this.form.floorId//我的实验室
 			  });
 		  }
 

+ 1 - 1
page_basics/earlyWarningManage/earlyWarningList.vue

@@ -84,7 +84,7 @@ export default {
 		  let self=this;
 		  if( doType=='detail'){//详情
 			  uni.navigateTo({
-			    url: '/page_basics/earlyWarningManage/earlyWarningDetail?warningId='+row.id,//安全警报
+			    url: '/pages_basics/earlyWarningManage/earlyWarningDetail?warningId='+row.id,//安全警报
 			  });
 		  }
 

page_basics/earlyWarningManage/videoMonitoring.vue → pages_basics/earlyWarningManage/videoMonitoring.vue


+ 150 - 0
pages_basics/faceImage.vue

@@ -0,0 +1,150 @@
+<!-- 身份验证 -->
+<template>
+    <view id="faceImage">
+        <view class="max-box">
+            <view>添加照片</view>
+            <img v-if="!imgUrl" class="img-add" src="@/images/basicsModules/icon_07.png" @click="selectImage">
+            <img v-if="imgUrl" mode="widthFix" class="img-box" :src="imgUrl">
+        </view>
+		<view v-if="imgUrl" class="button-box" @click="selectImage">重新上传</view>
+    </view>
+</template>
+
+<script>
+    import { config } from '@/api/request/config.js'
+    import { mystudent } from '@/api/apiDemo/index.js'
+    export default {
+        data() {
+            return {
+                imgUrl:"",
+
+            }
+        },
+        onLoad() {
+
+        },
+		onShow(){
+			this.mystudent();
+		},
+        methods: {
+			// 获取上传头像
+			async mystudent(){
+				const {data} = await mystudent();
+				if(data.code == 200){
+					if(data.data){
+						this.imgUrl = config.base_url+data.data.faceImg;
+					}
+				}
+			},
+            // 图片上传
+            selectImage() {
+                let self = this;
+                wx.chooseImage({
+                    count: 1,
+                    sizeType: ["original", "compressed"],
+                    sourceType: ["album", "camera"],
+                    success: function(res) {
+                        let tempFilePaths = res.tempFilePaths[0];
+                        self.uploadImg(tempFilePaths);
+                    }
+                });
+            },
+            async uploadImg(tempFilePaths){
+                var self = this;
+                uni.showLoading({
+                    title: '上传中',
+                    mask: true
+                });
+                uni.uploadFile({
+                    url: config.base_url+'/base/app/lab/api/commit/face', //仅为示例,非真实的接口地址
+                    header:{'Authorization':uni.getStorageSync('token')},
+                    filePath: tempFilePaths,
+                    name: 'file',
+                    formData: {
+                        'file': 'test'
+                    },
+                    success: (uploadFileRes) => {
+                        let res = JSON.parse(uploadFileRes.data);
+                        if(res.code == 200){
+							this.imgUrl = res.data.cardUrl
+                            uni.showToast({
+                                title: "识别成功",
+                                icon:"none",
+                                mask:true,
+                                duration: 2000
+                            });
+                            setTimeout(function(){
+                                uni.navigateBack();
+                            },2000);
+                        }else{
+                            uni.showToast({
+                                title: '您上传的身份验证无法识别,请重新上传其他照片',
+                                icon:"none",
+                                mask:true,
+                                duration: 2000
+                            });
+                        }
+                        // let res = JSON.parse(uploadFileRes.data);
+                        // self.imgUrl = res.data.url;
+                        // self.commitFace();
+                    },
+                    fail: err => {},
+                    complete: () => {
+						setTimeout(function(){
+							uni.hideLoading()
+						},2000);
+                    }
+                });
+            },
+        }
+    }
+</script>
+
+<style lang="stylus" scoped>
+    #faceImage{
+        height:100%;
+        width:100%;
+        .max-box{
+            // height:550rpx;
+			padding-bottom:40rpx;
+            background #fff
+            view{
+                line-height :95rpx;
+                font-size:28rpx;
+                color:#333333;
+                margin-left:20rpx;
+            }
+            .img-add{
+                margin:5rpx auto;
+                height:360rpx;
+                width:360rpx;
+                /*margin:5rpx 0 0 30rpx;*/
+            }
+			.img-box{
+				display block;
+                margin:5rpx auto;
+			}
+        }
+		.button-box{
+			width:650rpx;
+			line-height:80rpx;
+			text-align center;
+			border-radius:10rpx;
+			background #007AFF;
+			color:#fff;
+			margin:50rpx auto;
+		}
+        .up-data-button{
+            position absolute
+            bottom:0;
+            left:0;
+            width: 750rpx;
+            height: 120rpx;
+            background: #0183FA;
+            line-height:120rpx;
+            text-align center
+            color:#fff;
+            font-size: 30rpx;
+        }
+    }
+</style>

+ 415 - 0
pages_basics/fingerprint.vue

@@ -0,0 +1,415 @@
+<!-- 指纹 -->
+<template>
+	<view id="fingerprint">
+		<view class="fingerprint_one" v-if="pageType==1">
+			<view class="fingerprint_one_li" @click="goPage(item)" v-for="(item,index) in fingerprintList" :key="index">
+				<view class="fingerprint_one_li_l">{{item.name}}</view>
+				<view :class="item.isConfig?'colorB':'colorA'">{{item.isConfig?'已配置':'无'}}</view>
+				<img  class="fingerprint_one_li_r" src="@/images/basicsModules/icon_04.png">
+			</view>
+		</view>
+		<view class="tip_tow" v-if="pageType==2">
+			<view class="tip_tow_l">提醒</view>
+			<view class="tip_tow_l">请选中门禁点击【指纹采集】并在当前门禁上录入指纹</view>
+		</view>
+		<view class="fingerprint_tow" v-if="pageType==2">
+			<view class="input_tip">请选择可采集的指纹门禁:</view>
+			<input class="input_search"  type="text" v-model="dialogForm.searchValue" placeholder="请输入门禁名称" @blur="searchGuard()"/>
+			<view class="fingerprint_tow_border_li" v-for="(item2,index2) in yesUseList" @click="selectGuard(item2,index2)" :key="index2">
+				<view :class="item2.isCheck?'colorD':'colorC'">{{item2.subName +'+'+ item2.hardName}}</view>
+				<img  v-if="item2.isCheck" class="fingerprint_tow_border_li_r" src="@/images/basicsModules/icon_xzwt_xz.png">
+			</view>
+		</view>
+		<view v-if="pageType==1" class="tip_one">至少添加一个指纹才可以通过指纹开锁</view>
+		<view v-if="pageType==1" class="out-button" @click="fingerprintGtherSyncFun">确定</view>
+		<view v-if="pageType==2" class="out-button" @click="gather">指纹采集</view>
+		<!-- 指纹采集遮罩-->
+		  <view class="shade-outfire" v-if="dialogVisible">
+			<view class="null-box" @click="dialogClose()"></view>
+			<view class="shade-outfire-n">
+			  <view class="shade-outfire-n-t">门禁名称</view>
+			  <img  class="shade-outfire-n-t2" src="@/page_basics/images/icon_zw_bk.png" />
+			  <img class="shade-outfire-n-m" src="@/page_basics/images/icon_wd_zw.png" />
+			  <view class="shade-outfire-n-b">指纹采集中...</view>
+			</view>
+		  </view>
+	</view>
+</template>
+
+<script>
+    import { config } from '@/api/request/config.js'
+    import {fingerprintQeryMySubList,fingerprintGther,fingerprintQueryList,fingerprintGtherSync} from '@/api/apiDemo/index.js'
+	export default {
+
+		data() {
+			return {
+				//页面状态
+				pageType:1,
+				//签名
+				checked:true,
+				name:'',
+				dialogVisible:false,
+				dialogForm:{
+					searchValue:'',
+				},
+				fingerprintList:[
+					{
+						name:'第一个指纹',
+						num:1,
+						isConfig:false,
+					},
+					{
+						name:'第二个指纹',
+						num:2,
+						isConfig:false,
+					},
+					{
+						name:'第三个指纹',
+						num:3,
+						isConfig:false,
+					},
+					{
+						name:'第四个指纹',
+						num:4,
+						isConfig:false,
+					},
+					{
+						name:'第五个指纹',
+						num:5,
+						isConfig:false,
+					},
+				],
+				yesUseList:[],
+				fingerNum:null,//第几个指纹
+
+
+			}
+		},
+		onLoad() {
+			this.impowerUseList();
+			this.fingerprintClick();
+		},
+		onShow(){
+
+
+		},
+
+		methods: {
+			//指紋采集
+			gather(){
+				let rest=this.yesUseList.some(v=>v.isCheck==true)
+				if(rest){
+					this.dialogVisible=true;
+					this.fingerprintGtherFun()
+				}else{
+					uni.showToast({
+							mask:true,
+							icon:"none",
+							position:"center",
+							title: '请先选择门禁名称!',
+							duration: 3000
+						});
+				}
+
+			},
+		   dialogClose(){
+			   this.dialogVisible=false;
+		   },
+		   searchGuard(){
+			   this.impowerUseList();
+		   },
+		   selectGuard(d,index){
+			   let _this=this;
+			   //选中
+				d.isCheck=!d.isCheck
+				this.$set(this.yesUseList,index,d)
+			 //循环实现单选
+			  if(_this.yesUseList[index].isCheck==true){
+			    _this.yesUseList.forEach(function(item2) {
+			      if(item2.hardId==_this.yesUseList[index].hardId){
+			        item2.isCheck=true
+			      }else{
+			        item2.isCheck=false
+			      }
+			    })
+			  }
+		   },
+		   //查询用户指纹录取数据
+		   async fingerprintClick(){
+		   	let _this=this;
+		       const {data} = await fingerprintQueryList(uni.getStorageSync('userId'));
+				if(data.code == 200){
+					if(data.rows.length>0){
+						_this.fingerprintList.forEach(function(item){
+							data.rows.forEach(function(item2){
+								if(item.num==item2.fingerNum){
+									item.isConfig=true;
+								}
+							})
+						})
+					}
+				}
+		   },
+		   //指纹采集
+		   async fingerprintGtherFun(){
+		       let _this=this;
+			   let obj={}
+			   this.yesUseList.forEach(function(item){
+					  if(item.isCheck){
+						  obj.hardId=item.hardId
+						  obj.num=_this.fingerNum
+					  }
+			   })
+
+		       const {data} = await fingerprintGther(obj)
+				if(data.code == 200){
+					_this.dialogVisible=false;
+					_this.pageType=1;
+					_this.fingerprintClick();
+				}else if(data.code==500){
+					_this.dialogVisible=false;
+					uni.showToast({
+						mask:true,
+						icon:"none",
+						position:"center",
+						title: data.msg,
+						duration: 5000
+					});
+				}
+		   },
+		   //指纹同步
+		   async fingerprintGtherSyncFun(){
+		       let _this=this;
+		       const {data} = await fingerprintGtherSync(uni.getStorageSync('userId'))
+					if(data.code == 200){
+						uni.redirectTo({
+						    url: '/pages/mine',
+						});
+					}
+		   },
+			//查询当前用户已授权门禁列表
+			async impowerUseList(){
+				let _this=this;
+			    const {data} = await fingerprintQeryMySubList(_this.dialogForm)
+				if(data.code == 200){
+					_this.yesUseList=data.data;
+					_this.yesUseList.forEach(function(item){
+						item.isCheck=false;
+					})
+				}
+			},
+			//页面跳转
+            goPage(d){
+                this.pageType=2;
+				this.fingerNum=d.num;
+			},
+
+		},
+	}
+</script>
+
+<style lang="stylus" scoped>
+	#fingerprint{
+		height: 100%;
+		  width: 100%;
+		  display: flex;
+		  flex-direction: column;
+		  overflow-y: scroll;
+		.fingerprint_one{
+			width: 710rpx;
+			height: 507rpx;
+			background: #FFFFFF;
+			border-radius: 20rpx;
+			margin: 20rpx;
+			.fingerprint_one_li{
+				display: flex;
+				justify-content: flex-start;
+				align-items: center;
+				height: 100rpx;
+				margin: 0 20rpx;
+				border-bottom: 1px solid #E0E0E0;
+				.fingerprint_one_li_l{
+					font-size: 30rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #333333;
+					text-align: left;
+					flex: 1;
+
+				}
+				.fingerprint_one_li_r{
+					width: 12rpx;
+					height: 24rpx;
+				}
+				.colorA{
+					font-size: 26rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+					text-align: right;
+					margin-right: 40rpx;
+					flex: 1;
+				}
+				.colorB{
+					font-size: 26rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #0183FA;
+					text-align: right;
+					margin-right: 40rpx;
+					flex: 1;
+				}
+			}
+			.fingerprint_one_li:last-child{
+				border-bottom: none;
+			}
+		}
+		.tip_tow{
+			margin: 10rpx 0;
+			.tip_tow_l{
+				font-size: 24rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #FF0000;
+				line-height: 36rpx;
+				text-align: left;
+				margin-left: 36rpx;
+			}
+		}
+		.fingerprint_tow{
+			width: 710rpx;
+			background: #FFFFFF;
+			border-radius: 10px;
+			margin: 0 20rpx;
+			padding: 0 20rpx;
+			box-sizing: border-box;
+			overflow: hidden;
+			.input_tip{
+				font-size: 30rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #333333;
+				line-height: 30rpx;
+				margin: 34rpx 0;
+			}
+			.input_search{
+				width: 670rpx;
+				height: 80rpx;
+				background: #FFFFFF;
+				border: 1px solid #E0E0E0;
+				border-radius: 10rpx;
+				padding-left: 20rpx;
+				box-sizing: border-box;
+				margin-bottom: 32rpx;
+			}
+			.fingerprint_tow_border_li{
+				height: 100rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				margin: 0 20rpx;
+				border-bottom: 1px solid #E0E0E0;
+				.fingerprint_tow_border_li_l{}
+				.fingerprint_tow_border_li_r{
+					width: 30rpx;
+					height: 20rpx;
+				}
+				.colorC{
+					font-size: 30rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #333333;
+				}
+				.colorD{
+					font-size: 30rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #0183FA;
+				}
+			}
+			.fingerprint_tow_border_li:last-child{
+				border-bottom: none;
+			}
+		}
+		.tip_one{
+			font-size: 28rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #FF0000;
+			line-height: 30rpx;
+			margin-top: 36rpx;
+			text-align: center;
+		}
+		.out-button{
+			position absolute
+			bottom:140rpx;
+			left:25rpx;
+			width:700rpx;
+			height:100rpx;
+			line-height:100rpx;
+			border-radius:10rpx;
+			text-align center
+			background #0183FA;
+			color:#FFFFFF;
+			font-size: 30rpx;
+			margin:0 auto;
+		}
+	    /* 指纹采集 */
+	    .shade-outfire {
+	      height: 100%;
+	      width: 100%;
+	      position: fixed;
+	      display: flex;
+	      flex-direction: column;
+	      z-index: 10;
+	      background: rgba(0, 0, 0, 0.2);
+	      .null-box {
+	        flex: 1;
+	      }
+	      .shade-outfire-n {
+	        width: 625rpx;
+	        height: 550rpx;
+	        background: #FFFFFF;
+	        border-radius: 20rpx;
+	        position: absolute;
+	        top: 370rpx;
+	        left: 62rpx;
+
+	        .shade-outfire-n-t {
+				 font-size: 30rpx;
+				 font-family: PingFang SC;
+				 font-weight: 500;
+				 color: #333333;
+				 text-align: center;
+				 margin-top: 32rpx;
+	        }
+			.shade-outfire-n-t2 {
+			  width: 182rpx;
+			  height: 202rpx;
+			  position: absolute;
+			  left: 222rpx;
+			  top: 106rpx;
+			}
+
+	        .shade-outfire-n-m {
+	          width: 84rpx;
+	          height: 108rpx;
+	          position: absolute;
+	          left: 266rpx;
+	          top: 150rpx;
+	        }
+
+	        .shade-outfire-n-b {
+				width: 100%;
+	         font-size: 30rpx;
+	         font-family: PingFang SC;
+	         font-weight: 500;
+	         color: #0183FA;
+			 text-align: center;
+			 position: absolute;
+			 top: 358rpx;
+	        }
+	      }
+	    }
+	  }
+</style>

BIN
pages_basics/images/icon_wd_zw.png


BIN
pages_basics/images/icon_zw_bk.png


BIN
pages_basics/images/img_dzqm_sl.png


page_basics/photoInspection.vue → pages_basics/photoInspection.vue


+ 272 - 0
pages_basics/signature/signature.vue

@@ -0,0 +1,272 @@
+<!-- 电子签名 -->
+<template>
+	<view id="signature">
+		<view class="signature_li">
+			<view class="signature_li_t">示例:</view>
+			<view class="signature_li_b">
+				<img src="@/page_basics/images/img_dzqm_sl.png">
+			</view>
+		</view>
+		<view class="tip">请上传白字黑子正楷签名</view>
+		<view class="signature_li">
+			<view  class="signature_li_t">上传签名:</view>
+			<view  class="signature_li_b">
+				<view class="signature_li_b_c" @click="selectImage"><span v-if="!signatureData">点击上传签名</span></view>
+				<img class=".signature_li_img2" :src="signatureData">
+			</view>
+			<view class="clear_signature" @tap="signatureDele()">
+				<img class="clear_signature_img" src="@/images/basicsModules/icon_fjgk_sc.png" />
+				<text>清除</text>
+			</view>
+			<view class="upload_tip">请严格按照示例上传正楷签名并置于框内</view>
+		</view>
+		<view class="signature_li">
+			<view  class="signature_li_t" style="margin-top: 20rpx;">已上传的签名:</view>
+			<image class="signature_li_img" :src="alreadyImg"></image>
+
+		</view>
+		<view class="save_btn" @click="saveFun()">保存</view>
+	</view>
+
+</template>
+
+<script>
+    import { config } from '@/api/request/config.js'
+    import { logout,studentinfoFacemy,simpleInfo,getSafeWarnList,getMyPointsLogInfo,updateSignature} from '@/api/apiDemo/index.js'
+	export default {
+
+		data() {
+			return {
+				baseUrl:config.base_url,
+				signatureData:'',
+				alreadyImg:'',
+
+			}
+		},
+		onLoad(option) {
+			//首次进入获取上个页面传过来的签名
+			this.alreadyImg = this.baseUrl+option.item;
+			console.log(this.alreadyImg)
+		},
+		onShow(){
+			//用户点击上传签名
+			if(uni.getStorageSync('signatureData')){
+				this.signatureData = uni.getStorageSync('signatureData');
+				uni.removeStorageSync('signatureData')	;
+			}
+		},
+		methods: {
+			//清除签名
+			async signatureDele(){
+				let _this=this;
+				this.signatureData='';
+				this.alreadyImg='';
+			},
+			//保存按钮
+			async saveFun(){
+				let _this=this;
+
+				if(!this.signatureData){
+
+					uni.showToast({
+						title:'请先选择签名上传并保存查看',
+						icon:"none",
+						mask:true,
+						duration: 2000
+					});
+					return
+				}
+				 var  arr = this.signatureData.split(',')
+				 let obj={
+					 signature:arr[1]
+				 }
+				 const {data} = await updateSignature(obj);
+				 if(data.code == 200){
+				 	uni.showToast({
+				 		title:'上传成功',
+				 		icon:"none",
+				 		mask:true,
+				 		duration: 2000
+				 	});
+					setTimeout(function(){
+						uni.navigateBack()
+					},2000);
+					// uni.switchTab({
+					//      url: '/pages/mine'
+					//  });
+
+				 }
+
+			},
+		// 头像上传
+		selectImage() {
+		    let self = this;
+		    wx.chooseImage({
+		        count: 1,
+		        sizeType: ["original", "compressed"],
+		        sourceType: ["album", "camera"],
+		        success: function(res) {
+					console.log("res1",res)
+		            let tempFilePaths = res.tempFilePaths[0];
+		            self.uploadImg(tempFilePaths);
+		        }
+		    });
+		},
+		async uploadImg(tempFilePaths){
+		    var self = this;
+		    uni.showLoading({
+		        title: '上传中',
+		        mask: true
+		    });
+		    uni.uploadFile({
+		        url: config.base_url+'/base/file/upload', //仅为示例,非真实的接口地址
+		        header:{'Authorization':uni.getStorageSync('token')},
+		        filePath: tempFilePaths,
+		        name: 'file',
+		        formData: {
+		            'user': 'test'
+		        },
+		        success: (uploadFileRes) => {
+		            let res = JSON.parse(uploadFileRes.data);
+					if(res.code == 200){
+						uni.navigateTo({
+							url: '/page_basics/signature/signatureImg?src='+config.base_url+res.data.url,//电子签名-图片处理
+						});
+					}else{
+						uni.showToast({
+							title: res.msg,
+							icon:"none",
+							mask:true,
+							duration: 2000
+						});
+					}
+		        },
+		        fail: err => {},
+		        complete: () => {
+		            uni.hideLoading()
+		        }
+		    });
+		},
+	   },
+	}
+</script>
+
+<style lang="stylus" scoped>
+	#signature{
+	 width: 710rpx;
+	 height: auto;
+	 background: #FFFFFF;
+	 border-radius: 20rpx;
+	 margin :20rpx 20rpx 0;
+	 padding :28rpx 20rpx 94rpx;
+	 box-sizing :border-box;
+	 .tip{
+		 width :100%;
+		 font-size: 24rpx;
+		 font-family: PingFang SC;
+		 font-weight: 500;
+		 color: #999999;
+		 line-height: 24rpx;
+		 margin :24rpx 0 42rpx 0;
+		 text-align :center;
+	 }
+	 .signature_li{
+		.signature_li_t{
+			font-size: 28rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #333333;
+			line-height: 28rpx;
+
+		}
+		.signature_li_b{
+			position :relative;
+			margin-top :28rpx;
+			width: 668rpx;
+			height: 250rpx;
+			background: #FFFFFF;
+			border: 1px solid #E0E0E0;
+			border-radius: 10rpx;
+			text-align :center;
+			>img{
+				display :inline-block;
+				width: 192rpx;
+				height: 60rpx;
+				margin-top :90rpx;
+			}
+			.signature_li_b_c{
+				font-size: 26rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #0183FA;
+				line-height: 250rpx;
+				cursor :pointer;
+				position :relative;
+				z-index :200;
+			}
+			.signature_li_img2{
+				position :absolute;
+				left :0;
+				top:0;
+				z-index :100;
+				width: 668rpx;
+				height: 250rpx;
+				margin :0;
+			}
+
+		}
+		.signature_li_img{
+			margin-top :28rpx;
+			width: 668rpx;
+			height: 250rpx;
+			background: #FFFFFF;
+			border: 1px solid #E0E0E0;
+			border-radius: 10rpx;
+			text-align :center;
+		}
+		.upload_tip{
+			width :100%;
+			font-size: 24rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #999999;
+			line-height: 24rpx;
+			margin :24rpx 0 42rpx 0;
+			text-align :center;
+		}
+	    .clear_signature{
+			height: 30rpx;
+			margin: 20rpx 0;
+			display: flex;
+			justify-content: flex-end;
+			.clear_signature_img{
+				width: 30rpx;
+				height: 30rpx;
+				margin-right: 10rpx;
+			}
+			>text{
+				font-size: 26rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #A2A2A2;
+				line-height: 30rpx;
+			}
+		}
+	 }
+	 /* 保存按钮*/
+	  .save_btn{
+	 	 width: 650rpx;
+	 	 height: 100rpx;
+	 	 background: #0183FA;
+	 	 border-radius: 20px;
+	 	 font-size: 28rpx;
+	 	 font-family: PingFang SC;
+	 	 font-weight: 500;
+	 	 color: #FFFFFF;
+	 	 line-height: 100rpx;
+	 	 text-align :center;
+	 	 margin-top :44rpx;
+	  }
+	}
+
+</style>

+ 140 - 0
pages_basics/signature/signatureImg.vue

@@ -0,0 +1,140 @@
+<!-- 电子签名图片 -->
+<template>
+	<view class="avatar-page">
+		<view style="height:100%;width:100%;" v-if="src&&src!='null'">
+			<image-cropper
+				id="image-cropper"
+				:zoom="1"
+				:angle="0"
+				:src="src"
+				cutWidth='688rpx'
+				cutHeight='250rpx'
+				canvasBackground="red"
+				@cropped="cropped"
+				@afterDraw="afterDraw"
+				@beforeDraw="beforeDraw"/>
+		</view>
+		<view class="left-button" @click="backButton">取消</view>
+		<view class="right-button" @click="upImg">确定</view>
+	</view>
+</template>
+
+<script>
+    import { config } from '@/api/request/config.js'
+    import { querygenSign} from '@/api/apiDemo/index.js'
+	import ImageCropper from '@/component/cropper.vue'
+	export default {
+		components: {
+			ImageCropper
+		},
+		data() {
+			return {
+				src:"",
+				srcData:"",
+				signatureData:'',
+			}
+		},
+		onLoad(option){
+			this.src = option.src;
+		},
+		onShow(){
+
+		},
+		methods:{
+			/************************************************修改头像************************************************/
+
+			beforeDraw(context, transform) {
+				context.setFillStyle('yellow')
+				transform.zoom = 2
+			},
+			afterDraw(ctx, info) {
+				ctx.fillText('', 20, 20)
+			},
+			async cropped(imagePath, imageInfo) {
+				this.srcData = imagePath;
+				//小程序电子签名抠图生成图片
+				uni.uploadFile({
+				    url: config.base_url+'/base/app/sysuser/api/genSign', //仅为示例,非真实的接口地址
+				    header:{'Authorization':uni.getStorageSync('token')},
+				    filePath: imagePath,
+				    name: 'file',
+				    formData: {
+				        'user': 'test'
+				    },
+				    success: (response) => {
+						let data=JSON.parse(response.data)
+						if(data.code == 200){
+							let text = data.data.replace(/[\r\n]/g,"");
+							this.signatureData = 'data:image/png;base64,'+ text;
+
+						} else {
+							uni.showToast({
+								title: response.msg,
+								icon:"none",
+								mask:true,
+								duration: 2000
+							});
+						}
+
+				    },
+				    fail: err => {},
+				    complete: () => {
+				        uni.hideLoading()
+				    }
+				});
+
+			},
+
+			/************************************************************************************************/
+			upImg(){
+				let self = this;
+			    uni.setStorageSync('signatureData',this.signatureData)
+				setTimeout(function(){
+				    uni.navigateBack();
+				},200);
+
+
+			},
+			backButton(){
+				uni.navigateBack();
+			},
+
+
+		}
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.avatar-page{
+		height:100%;
+		width:100%
+		.left-button{
+			background #E0E0E0;
+			color:#333;
+			text-align center;
+			font-size:26rpx;
+			width:140rpx;
+			height:60rpx;
+			line-height:60rpx;
+			position fixed;
+			left:40rpx;
+			bottom:40rpx;
+			z-index:100;
+			border-radius:10rpx;
+		}
+		.right-button{
+			background #007AFF;
+			color:#fff;
+			text-align center;
+			font-size:26rpx;
+			width:140rpx;
+			height:60rpx;
+			line-height:60rpx;
+			position fixed;
+			right:40rpx;
+			bottom:40rpx;
+			z-index:100;
+			border-radius:10rpx;
+		}
+	}
+</style>

+ 290 - 0
pages_manage/gradingControl/gradingControl.vue

@@ -0,0 +1,290 @@
+<!-- 准入资格证书 -->
+<template>
+    <view id="accessQualification">
+        <scroll-view scroll-y @scrolltolower="scrollGet" class="info-max-box">
+			<view class="list">
+				<view class="list_li" v-for="(item,index) in infoList" :key="index">
+					<view class="list_li_t">
+						<view class="list_li_t_l" v-if="item.levelName" :style="'color:'+item.levelColor+';border-color:'+item.levelColor">{{item.levelName}}</view>
+						<view class="list_li_t_c">{{item.subName}}</view>
+						<view class="list_li_t_r">{{item.typeName}}</view>
+					</view>
+					<view class="list_li_b" >
+						<view class="list_li_b_t" @tap="goPageAdd(item,item2)" v-for="(item2,index2) in item.detailList" :key="index2" :style="index2==(item.detailList.length-1)?'border:none;':'border-bottom :1px dashed #cccccc;'">
+							<view class="list_li_b_t_t">
+								<view class="list_li_b_t_t_n">
+									<view class="list_li_b_t_t_l" :class="[item2.ruleType== '日管控' ? 'purple': '', item2.ruleType=='周管控'? 'blue': '',item2.ruleType=='月管控'? 'orange': '',item2.ruleType=='年管控'? 'green': '',]">{{item2.ruleType}}</view>
+									<view class="list_li_b_t_t_c">{{item2.ruleName}}</view>
+									<view class="list_li_b_t_t_r" v-if="item2.isExpired==1">(过期未完成)</view>
+									<view class="list_li_b_t_t_rr" >{{item2.endDate}}</view>
+								</view>
+							</view >
+							<view class="list_li_b_t_b">{{item2.ruleRemark}}</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="get-null-box" v-if="infoList.length==0">暂无更多数据</view>
+        </scroll-view>
+        <view class="bottom-button-box" @click="goSafeAccess">完成记录</view>
+    </view>
+</template>
+
+<script>
+    import { gradingControl } from '@/api/apiDemo/index.js'
+    export default {
+        data() {
+            return {
+                infoList:{},
+            }
+        },
+        onLoad() {
+
+        },
+        onShow(){
+            this.clearData();
+            this.getList();
+        },
+        methods: {
+			goSafeAccess(){
+				uni.navigateTo({
+					url: '/pages_manage/gradingControl/gradingControlFinish',
+				});
+			},
+            //清除
+            clearData(){
+                this.infoList = {};
+
+            },
+            //去添加页面
+            goPageAdd(item,item2){
+                uni.navigateTo({
+                    url:'/pages_manage/gradingControl/gradingControlAdd?item='+encodeURIComponent(JSON.stringify(item))+'&item2='+encodeURIComponent(JSON.stringify(item2))
+                })
+            },
+            //滚动事件
+            scrollGet(){
+                this.getList();
+            },
+            //获取列表数据
+            async getList(){
+                let _this = this;
+                let obj = {
+
+                }
+                const {data} = await gradingControl(obj)
+                if(data.code==200){
+
+					 _this.infoList=data.data;
+                }
+
+            },
+        }
+    }
+</script>
+
+<style lang="stylus" scoped>
+    #accessQualification{
+        height:100%;
+        display flex
+        flex-direction column
+        .info-max-box{
+            flex:1;
+            overflow: scroll
+			.for-big-box:last-child{
+			    margin-bottom:180rpx;
+			}
+			/* 列表 */
+			.list{
+				padding 0 20rpx;
+				box-sizing border-box;
+				.list_li{
+					height:auto;
+					.list_li_t{
+						height :80rpx;
+						display flex;
+						justify-content flex-start;
+						align-items :center;
+						.list_li_t_l{
+							width: 80rpx;
+							height: 30rpx;
+							font-size: 24rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #EE3A3A;
+							line-height: 30rpx;
+							border: 2rpx solid #EE3A3A;
+							border-radius: 6rpx;
+							text-align center;
+						}
+						.list_li_t_c{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #333333;
+							line-height: 30rpx;
+							margin 0 32rpx 0 16rpx;
+						}
+						.list_li_t_r{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							line-height: 30rpx;
+						}
+					}
+					.list_li_b{
+						width 710rpx;
+						height auto;
+						background: #FFFFFF;
+						border-radius: 20rpx;
+						padding :0 14rpx;
+						box-sizing :border-box;
+						.list_li_b_t{
+							overflow :hidden;
+							border-bottom :1rpx dashed #cccccc;
+							.list_li_b_t_t{
+								display flex;
+								justify-content flex-start;
+								margin :24rpx 0 18rpx 0;
+								.list_li_b_t_t_n{
+									flex:1;
+									width:655rpx;
+									display flex;
+									justify-content flex-start;
+									.list_li_b_t_t_l{
+										width :100rpx;
+										height :30rpx;
+										font-size: 24rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										/* color: #0183FA; */
+										line-height: 24rpx;
+										/* background: rgba(1,131,250,0.2); */
+										border-radius: 6rpx;
+										text-align :center;
+									}
+									.list_li_b_t_t_c{
+										font-size: 28rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color: #333333;
+										line-height: 28rpx;
+										margin :0 16rpx 0 12rpx;
+									}
+									.list_li_b_t_t_r{
+										font-size: 24rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color: #EE3A3A;
+										line-height: 24rpx;
+									}
+									.list_li_b_t_t_rr{
+										flex:1;
+										text-align:right;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color:#999;
+										font-size: 24rpx;
+										line-height: 24rpx;
+									}
+								}
+								/* 日管控 */
+								.purple{
+									color: #AC20E0;
+									background: rgba(172,32,224,0.2);
+								}
+								/* 周管控 */
+								.blue{
+									color: #0183FA;
+									background: rgba(1,131,250,0.2);
+								}
+								/* 月管控 */
+								.orange{
+									color: #FA8801;
+									background: rgba(250,136,1,0.2);
+								}
+								/* 年管控 */
+								.green{
+									color: #11BA25;
+									background: rgba(17,186,37,0.2);
+								}
+
+								>img{
+									width: 12rpx;
+									height: 24rpx;
+								}
+							}
+							.list_li_b_t_b{
+								font-size: 28rpx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+								line-height: 48rpx;
+								margin-bottom :14rpx;
+								display:block;
+								overflow:hidden;
+								text-overflow:ellipsis;
+								white-space:nowrap;
+							}
+						}
+						.list_li_b_b{
+
+							.list_li_b_b_t{
+								display :flex;
+								justify-content :flex-start;
+								margin :30rpx 0 18rpx;
+								.list_li_b_b_t_l{
+									width :100rpx;
+									height :30rpx;
+									border-radius: 6rpx;
+									font-size: 24rpx;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #FA8801;
+									line-height: 30rpx;
+									background :rgba(250,136,1,0.2);
+									text-align :center;
+									margin-right :12rpx;
+								}
+								.list_li_b_b_t_r{
+									font-size: 28rpx;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #333333;
+									line-height: 30rpx;
+								}
+							}
+							.list_li_b_b_b{
+								font-size: 28rpx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+								line-height: 48rpx;
+							}
+						}
+					}
+				}
+			}
+
+			/*暂无数据*/
+            .get-null-box{
+                height:100rpx;
+                line-height:100rpx;
+                color:#999;
+                text-align center
+            }
+        }
+        .bottom-button-box{
+			border-radius:20rpx;
+			margin:20rpx 50rpx;
+            width: 650rpx;
+            height: 100rpx;
+            line-height: 100rpx;
+            background: #0183FA;
+            font-size: 30rpx;
+            color: #FFFFFF;
+            text-align center;
+        }
+    }
+</style>

+ 644 - 0
pages_manage/gradingControl/gradingControlAdd.vue

@@ -0,0 +1,644 @@
+<!-- 分级管控完成工作 -->
+<template>
+    <view id="accessQualification">
+        <scroll-view scroll-y @scrolltolower="scrollGet" class="info-max-box">
+			<view class="list">
+				<view class="list_li">
+					<view class="list_li_t">
+						<view class="list_li_t_l" :style="'color:'+labData.levelColor+';border-color:'+labData.levelColor">{{labData.levelName}}</view>
+						<view class="list_li_t_c">{{labData.subName}}</view>
+						<view class="list_li_t_r">{{labData.typeName}}</view>
+					</view>
+					<view class="list_li_b">
+						<view class="list_li_b_t">
+							<view class="list_li_b_t_t">
+								<view class="list_li_b_t_t_n">
+									<view class="list_li_b_t_t_l" :class="[control.ruleType== '日管控' ? 'purple': '', control.ruleType=='周管控'? 'blue': '',control.ruleType=='月管控'? 'orange': '',control.ruleType=='年管控'? 'green': '',]">{{control.ruleType}}</view>
+									<view class="list_li_b_t_t_c">{{control.ruleName}}</view>
+									<view class="list_li_b_t_t_r" v-if="control.isExpired==1">(过期未完成)</view>
+									<view class="list_li_b_t_t_rr" >{{control.endDate}}</view>
+								</view>
+							</view>
+						</view>
+						<view class="flex-view">
+							<view><text style="margin-right: 20rpx;"></text>执行方式:</view>
+							<view>{{control.isAll==1?'多人执行':'单人执行'}}</view>
+						</view>
+						<view class="flex-view">
+							<view><text style="margin-right: 20rpx;"></text>规则描述:</view>
+							<view>{{control.ruleRemark}}</view>
+						</view>
+						<view class="list_li_b_b2"><text style="position: relative;top: 4rpx;color: #f00;margin-right: 10rpx;">*</text>执行描述:</view>
+						<textarea class="list_li_b_b3" v-model="param.detail.remark" maxlength="30" placeholder-class="placeholder-style" placeholder="请输入执行描述"></textarea>
+						<view class="list_li_b_b4" v-if="control.isUpload==1"><text style="position: relative;top: 4rpx;color: #f00;margin-right: 10rpx;">*</text>执行材料:<label @click="itemUpData(item)">+ 请上传执行材料</label></view>
+
+						<view class="list_li_b_b6" v-if="upList.length>0" v-for="(item,index) in upList" :key="index">
+							<view @click="download(item)">{{item.name}}</view>
+							<view @click="delImg(index)">
+								<img src="@/images/basicsModules/icon_fjgk_sc.png"/>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+        </scroll-view>
+        <view class="bottom-button-box" @click="goSafeAccess">完成</view>
+    </view>
+</template>
+
+<script>
+    import { gradingControlAdd } from '@/api/apiDemo/index.js'
+	import { config } from '@/api/request/config.js'
+    export default {
+        data() {
+            return {
+				labData:{},
+				control:{},
+				upList:[],
+				param:{
+					subId:'',//实验室id
+					ruleId:'',//规则ID
+					ruleUserId:'',//规则细则
+					id:'',//记录id
+					ruleType:'',
+					endDate:'',
+					detail:{
+						imgName:'',//文件名
+						imgUrl:'',//文件路径
+						imgType:'',//文件类型
+						remark:'',
+					}
+				},
+				messageUserId:""
+            }
+        },
+        onLoad(option) {
+			if(option.item){
+				let item = JSON.parse(decodeURIComponent(option.item));
+				let item2 = JSON.parse(decodeURIComponent(option.item2));
+				this.labData=item
+				this.control=item2
+				this.param.subId=item.subId;
+				this.param.ruleId=item2.ruleId;
+				this.param.ruleUserId=item2.ruleUserId;
+				// this.param.id=item2.recordId;
+				 this.param.ruleType=item2.ruleType;
+				 this.param.endDate=item2.endDate;
+
+				if(option.messageUserId){
+					this.messageUserId = option.messageUserId;
+				}
+			}
+
+        },
+        onShow(){
+
+        },
+        methods: {
+			download(item){
+				if(item.type == 'png' || item.type == 'jpg' || item.type == 'jpeg' || item.type == 'gif'){
+					//查看图片
+					wx.previewImage({
+						urls: [config.base_url+item.url], //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
+						current: '', // 当前显示图片的http链接,默认是第一个
+						success: function(res) {},
+						fail: function(res) {},
+						complete: function(res) {},
+					})
+				}else if(item.type == 'pdf' || item.type == 'doc' || item.type == 'docx'){
+					uni.showLoading({
+					    title: '下载中'
+					});
+					//下载文档
+					wx.downloadFile({
+						url: config.base_url+item.url,
+						header: {
+							Authorization: uni.getStorageSync('token')
+						},
+						success: function (res) {
+							console.log("resresresresresres",res)
+							const fileManager = wx.getFileSystemManager()
+							console.log('wx.env.USER_DATA_PATH',wx.env.USER_DATA_PATH);
+							console.log('item.name',item.name);
+							console.log('item.type',item.type);
+							const filePath = wx.env.USER_DATA_PATH + '/' + item.name
+							console.log('filePath',filePath);
+							fileManager.saveFile({
+								tempFilePath: res.tempFilePath,
+								filePath,
+								success: () => {
+									uni.hideLoading();
+									wx.openDocument({
+										filePath: filePath,
+										showMenu: true,
+										fileType: item.type
+									})
+								},
+								fail: function (res){
+									uni.hideLoading();
+									uni.showToast({
+										title: '下载失败',
+										icon:"none",
+										mask:true,
+										duration: 2000
+									});
+								}
+							})
+						},
+						fail: function (res){
+							uni.hideLoading();
+							uni.showToast({
+								title: '下载失败',
+								icon:"none",
+								mask:true,
+								duration: 2000
+							});
+						}
+					})
+				}
+			},
+			delImg(index){
+				let self = this;
+				uni.showModal({
+				  title: '',
+				  cancelColor:'#999999',
+				  confirmColor:'#0183FA',
+				  content: '确定删除吗?',
+				  success (res) {
+					if (res.confirm) {
+					  self.upList.splice(index,1)
+					  self.$forceUpdate();
+					} else if (res.cancel) {
+
+					}
+				  }
+				})
+			},
+			//上传
+			itemUpData(item){
+				let self = this;
+				if(this.upList.length>4){
+					uni.showToast({
+						title: '最多只能上传5个',
+						icon:"none",
+						mask:true,
+						duration: 2000
+					});
+					return
+				}
+				uni.showActionSheet({
+				    itemList: ['上传文件', '上传图片'],
+				    success: function (res) {
+						if(res.tapIndex == 0){
+							//上传文件
+							self.upData(item);
+						}else if(res.tapIndex == 1){
+							//上传图片
+							self.upImg(item);
+						}
+				    },
+				    fail: function (res) {
+				        console.log(res.errMsg);
+				    }
+				});
+			},
+			upImg(item) {
+			    let self = this;
+			    wx.chooseImage({
+			        count: 1,
+			        sizeType: ["original", "compressed"],
+			        sourceType: ["album", "camera"],
+			        success: function(res) {
+						console.log(res)
+						let text = res.tempFilePaths[0].substring(res.tempFilePaths[0].lastIndexOf('.') + 1);
+						if(text != 'png' && text != 'jpg' && text != 'jpeg' && text != 'gif' && text != 'pdf' && text != 'doc' && text != 'docx'){
+							uni.showToast({
+								title: '仅支持png/jpg/jpeg/gif/pdf/doc/docx类型的文件上传',
+								icon:"none",
+								mask:true,
+								duration: 2000
+							});
+							return
+						}
+						let upObj = {
+							name:'照片.'+text,
+							path:res.tempFilePaths[0],
+							type:text,
+						}
+						self.upDataFunction(item,upObj);
+			            // let tempFilePaths = res.tempFilePaths[0];
+			            // self.upDataFunction(tempFilePaths,upObj);
+			        }
+			    });
+			},
+			//上传文件
+			upData(item){
+				let self = this;
+				wx.chooseMessageFile({
+				  count: 1,
+				  type: 'all',
+				  success (res) {
+					let text = res.tempFiles[0].path.substring(res.tempFiles[0].path.lastIndexOf('.') + 1);
+
+
+					if(text != 'png' && text != 'jpg' && text != 'jpeg' && text!= 'gif' && text != 'pdf' && text != 'doc' && text != 'docx'){
+						uni.showToast({
+							title: '仅支持png/jpg/jpeg/gif/pdf/doc/docx类型的文件上传',
+							icon:"none",
+							mask:true,
+							duration: 2000
+						});
+						return
+					}
+					let upObj = {
+						name:res.tempFiles[0].name,
+						path:res.tempFiles[0].path,
+						type:text,
+					}
+					self.upDataFunction(item,upObj);
+				  }
+				})
+			},
+			async upDataFunction(item,upObj){
+			    var self = this;
+			    uni.showLoading({
+			        title: '上传中',
+			        mask: true
+			    });
+			    uni.uploadFile({
+			        url: config.base_url+'/base/file/upload', //仅为示例,非真实的接口地址
+			        header:{'Authorization':uni.getStorageSync('token')},
+			        filePath: upObj.path,
+			        name: 'file',
+			        formData: {
+			            'user': 'test'
+			        },
+			        success: (uploadFileRes) => {
+			            let res = JSON.parse(uploadFileRes.data);
+						if(res.code == 200){
+							let obj = {
+								name:upObj.name,
+								url:config.base_url+res.data.url,
+								realUrl:res.data.url,
+								type:upObj.type
+							}
+							this.upList.push(obj);
+							this.$forceUpdate();
+
+							console.log(this.upList)
+						}else{
+							uni.showToast({
+								title: res.msg,
+								icon:"none",
+								mask:true,
+								duration: 2000
+							});
+						}
+			        },
+			        fail: err => {},
+			        complete: () => {
+			            uni.hideLoading()
+			        }
+			    });
+			},
+	       async goSafeAccess(){
+			   if(!this.param.detail.remark){
+			   	uni.showToast({
+			   		title: '请输入执行描述',
+			   		icon:"none",
+			   		mask:true,
+			   		duration: 2000
+			   	});
+			   	return
+			   }
+				if(this.control.isUpload==1){
+					if(!this.upList[0]){
+						uni.showToast({
+							title: '请上传执行材料',
+							icon:"none",
+							mask:true,
+							duration: 2000
+						});
+						return
+					}
+				}
+
+			   let _this = this;
+			   let obj = {
+
+			   }
+			   let imgName=[];
+			   let imgUrl=[];
+			   let imgType=[];
+			    _this.upList.forEach(function (item,index) {
+			           imgName.push(item.name)
+			           imgUrl.push(item.realUrl)
+			           imgType.push(item.type)
+			    })
+			   _this.param.detail.imgName=imgName.join(',')
+			   _this.param.detail.imgUrl=imgUrl.join(',')
+			   _this.param.detail.imgType=imgType.join(',')
+			   if(this.messageUserId){
+				   _this.param.messageUserId = this.messageUserId
+			   }
+			   console.log(_this.param)
+			   const {data} = await gradingControlAdd(_this.param)
+			   if(data.code==200){
+					uni.showToast({
+						title: '提交成功!',
+						icon:"none",
+						mask:true,
+						duration: 2000
+					});
+					setTimeout(function(){
+						uni.navigateBack();
+					},2000);
+			   }
+
+		   },
+        }
+    }
+</script>
+
+<style lang="stylus" scoped>
+    #accessQualification{
+        height:100%;
+        display flex
+        flex-direction column
+        .info-max-box{
+            flex:1;
+            overflow: scroll
+			.for-big-box:last-child{
+			    margin-bottom:180rpx;
+			}
+			/* 列表 */
+			.list{
+				padding 0 20rpx;
+				box-sizing border-box;
+				.list_li{
+					height auto;
+					.list_li_t{
+						height :80rpx;
+						display flex;
+						justify-content flex-start;
+						align-items :center;
+						.list_li_t_l{
+							width: 80rpx;
+							height: 30rpx;
+							font-size: 24rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #EE3A3A;
+							line-height: 30rpx;
+							border: 2rpx solid #EE3A3A;
+							border-radius: 6rpx;
+							text-align center;
+						}
+						.list_li_t_c{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #333333;
+							line-height: 30rpx;
+							margin 0 32rpx 0 16rpx;
+						}
+						.list_li_t_r{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							line-height: 30rpx;
+						}
+					}
+					.list_li_b{
+						overflow :hidden;
+						width 710rpx;
+						height auto;
+						background: #FFFFFF;
+						border-radius: 20rpx;
+						padding :0 14rpx;
+						box-sizing :border-box;
+						.list_li_b_t{
+							overflow :hidden;
+							.list_li_b_t_t{
+								display flex;
+								justify-content flex-start;
+								margin :24rpx 0 18rpx 0;
+								.list_li_b_t_t_n{
+									flex:1;
+									width:655rpx;
+									display flex;
+									justify-content flex-start;
+									.list_li_b_t_t_l{
+										width :100rpx;
+										height :30rpx;
+										font-size: 24rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										/* color: #0183FA; */
+										line-height: 30rpx;
+										/* background: rgba(1,131,250,0.2); */
+										border-radius: 6rpx;
+										text-align :center;
+									}
+									.list_li_b_t_t_c{
+										font-size: 28rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color: #333333;
+										line-height: 28rpx;
+										margin :0 16rpx 0 12rpx;
+									}
+									.list_li_b_t_t_r{
+										font-size: 24rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color: #EE3A3A;
+										line-height: 24rpx;
+									}
+									.list_li_b_t_t_rr{
+										flex:1;
+										text-align:right;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color:#999;
+										font-size: 24rpx;
+										line-height: 24rpx;
+									}
+								}
+								/* 日管控 */
+								.purple{
+									color: #AC20E0;
+									background: rgba(172,32,224,0.2);
+								}
+								/* 周管控 */
+								.blue{
+									color: #0183FA;
+									background: rgba(1,131,250,0.2);
+								}
+								/* 月管控 */
+								.orange{
+									color: #FA8801;
+									background: rgba(250,136,1,0.2);
+								}
+								/* 年管控 */
+								.green{
+									color: #11BA25;
+									background: rgba(17,186,37,0.2);
+								}
+								>img{
+									width: 12rpx;
+									height: 24rpx;
+								}
+							}
+							.list_li_b_t_b{
+								font-size: 28rpx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+								line-height: 48rpx;
+								margin-bottom :14rpx;
+							}
+						}
+						.flex-view{
+							display:flex;
+							view{
+								font-size:28rpx;
+								line-height:28rpx;
+								margin-top:28rpx;
+							}
+							view:nth-child(1){
+								width:220rpx;
+							}
+							view:nth-child(2){
+								width:460rpx;
+								word-wrap:break-word;
+								word-break:break-all;
+								overflow: hidden;
+								color:#999;
+							}
+						}
+						.list_li_b_b{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #333333;
+							line-height: 28rpx;
+							>label{
+								font-size: 28rpx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+								line-height: 28rpx;
+							}
+						}
+						.list_li_b_b2{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #333333;
+							line-height: 28rpx;
+							margin-top :32rpx;
+						}
+						.list_li_b_b3{
+							width: 640rpx;
+							height: 250rpx;
+							border: 1rpx solid #E0E0E0;
+							border-radius: 10rpx;
+							margin :32rpx 0 0 10rpx;
+							padding :25rpx 18rpx;
+							box-sizing :border-box;
+						}
+
+						.placeholder-style{
+							font-size: 24rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #CCCCCC;
+							line-height: 24rpx;
+						}
+						.list_li_b_b4{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #333333;
+							line-height: 60rpx;
+							margin-top :30rpx;
+							margin-bottom :52rpx;
+							>label{
+								display :inline-block;
+								width: 300rpx;
+								height: 60rpx;
+								border: 1rpx solid #0183FA;
+								border-radius: 10rpx;
+								text-align :center;
+								margin-left :22rpx;
+								font-size: 28rpx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #0183FA;
+								line-height: 60rpx;
+
+							}
+						}
+						.list_li_b_b5{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #333333;
+							line-height: 28rpx;
+							margin-top :30rpx;
+							margin-bottom 20rpx;
+							>label{
+								font-size: 28rpx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+								line-height: 28rpx;
+
+							}
+						}
+						.list_li_b_b6{
+							display flex;
+							margin-bottom:20rpx;
+							view:nth-child(1){
+								flex:1;
+								line-height:30rpx;
+								margin:15rpx 0 15rpx 15rpx;
+							}
+							view:nth-child(2){
+								height:60rpx;
+								width:60rpx;
+								margin:0 20rpx 0 60rpx;
+								img{
+									height:30rpx;
+									width:30rpx;
+									margin:15rpx;
+								}
+							}
+						}
+					}
+				}
+			}
+
+			/*暂无数据*/
+            .get-null-box{
+                height:100rpx;
+                line-height:100rpx;
+                color:#999;
+                text-align center
+            }
+        }
+        .bottom-button-box{
+			border-radius:20rpx;
+			margin:20rpx 50rpx;
+            width: 650rpx;
+            height: 100rpx;
+            line-height: 100rpx;
+            background: #0183FA;
+            font-size: 30rpx;
+            color: #FFFFFF;
+            text-align center;
+        }
+    }
+</style>

+ 445 - 0
pages_manage/gradingControl/gradingControlDetail.vue

@@ -0,0 +1,445 @@
+<!-- 分级管控记录详情 -->
+<template>
+    <view id="accessQualification">
+        <scroll-view scroll-y @scrolltolower="scrollGet" class="info-max-box">
+			<view class="list">
+				<view class="list_li">
+					<view class="list_li_t">
+						<view class="list_li_t_l" :style="'color:'+infoList.fiedColor+';border-color:'+infoList.fiedColor">{{infoList.levelName}}</view>
+						<view class="list_li_t_c">{{infoList.subName}}</view>
+						<view class="list_li_t_r">{{infoList.typeName}}</view>
+					</view>
+					<view class="list_li_b">
+						<view class="list_li_b_t">
+							<view class="list_li_b_t_t">
+								<view class="list_li_b_t_t_n">
+									<view class="list_li_b_t_t_l" :class="[infoList.ruleType== '日管控' ? 'purple': '', infoList.ruleType=='周管控'? 'blue': '',infoList.ruleType=='月管控'? 'orange': '',infoList.ruleType=='年管控'? 'green': '',]">{{infoList.ruleType}}</view>
+									<view class="list_li_b_t_t_c">{{infoList.ruleName}}</view>
+								</view>
+								<view class="list_li_b_t_t_n_r">{{infoList.endDate}}</view>
+							</view>
+							<view class="list_li_b_t_b" style="display: flex;"><label style="width:150rpx;">执行方式:</label>{{infoList.isAll==1?'多人执行':'单人执行'}}</view>
+							<view class="list_li_b_t_b" style="display: flex;"><label style="width:150rpx;">规则描述:</label>{{infoList.ruleRemark}}</view>
+							<view class="list_li_b_t_b" style="display: flex;" v-if="infoList.status == 0">
+								<label style="width:200rpx;">指定执行人员:</label>
+								<view style="flex:1;word-wrap:break-word;word-break:break-all;overflow: hidden;">{{infoList.allUserName}}</view>
+							</view>
+							<view class="list_li_b_t_b" style="display: flex;" v-if="infoList.status == 2"><label style="width:150rpx;">执行人:</label>{{infoList.nickName}}</view>
+							<view class="list_li_b_t_b" style="display: flex;" v-if="infoList.status == 2"><label style="width:150rpx;">身份:</label>{{infoList.userPosition}}</view>
+							<view class="list_li_b_t_b" style="display: flex;" v-if="infoList.status == 2"><label style="width:150rpx;">执行时间:</label>{{infoList.carryTime}}</view>
+							<view class="list_li_b_t_b" style="display: flex;" v-if="infoList.status == 2">
+								<label style="width:150rpx;">执行描述:</label>
+								<view style="flex:1;word-wrap:break-word;word-break:break-all;overflow: hidden;">{{infoList.detail.remark}}</view>
+							</view>
+						</view>
+						<view class="list_li_b_b4" v-if="infoList.status == 2">
+							<label>执行材料:</label>
+							<view class="list_li_b_b4_n">
+								<view class="list_li_b_b4_r" v-for="(item,index) in upList" :key="index" @click="lookItem(item)">
+									<img src="@/images/basicsModules/icon_pdf.png" v-if="item.type == 'pdf'"/>
+									<img src="@/images/basicsModules/icon_word.png" v-if="item.type == 'doc' || item.type == 'docx'"/>
+									<img :src="item.url" v-if="item.type == 'png' || item.type == 'jpg' || item.type == 'jpeg' || item.type == 'gif'"/>
+									<view class="list_li_b_b4_r_r">{{item.name}}</view>
+								</view>
+							</view>
+						</view>
+
+
+					</view>
+				</view>
+			</view>
+
+        </scroll-view>
+    </view>
+</template>
+
+<script>
+    import { gradingControlDetail,readByLoginUser } from '@/api/apiDemo/index.js'
+    import { config } from '@/api/request/config.js'
+    export default {
+        data() {
+            return {
+
+                infoList:{},
+				id:'',
+				upList:[],
+            }
+        },
+        onLoad(option) {
+            if(option.item){
+				let item = JSON.parse(decodeURIComponent(option.item));
+				console.log(item)
+				this.id=item.recordId;
+				if(item.messageUserId){
+					this.readByLoginUser(item.messageUserId);
+				}
+			}else{
+
+			}
+        },
+        onShow(){
+            this.clearData();
+            this.getList();
+        },
+        methods: {
+            //清除
+            clearData(){
+                this.infoList = [];
+                this.upList = [];
+
+            },
+            //去详情页
+            goPageInfo(item){
+
+                uni.navigateTo({
+                    url:'/pages_manage/accessQualification/accessQualificationInfo?item='+encodeURIComponent(JSON.stringify(item))
+                })
+            },
+            //滚动事件
+            scrollGet(){
+                //this.getList();
+            },
+			lookItem(item){
+				console.log("item",item)
+				if(item.type == 'png' || item.type == 'jpg' || item.type == 'jpeg' || item.type == 'gif'){
+					//查看图片
+					wx.previewImage({
+						urls: [item.url], //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
+						current: '', // 当前显示图片的http链接,默认是第一个
+						success: function(res) {},
+						fail: function(res) {},
+						complete: function(res) {},
+					})
+				}else if(item.type == 'pdf' || item.type == 'doc' || item.type == 'docx'){
+					uni.showLoading({
+					    title: '下载中'
+					});
+					//下载文档
+					wx.downloadFile({
+						url: item.url,
+						header: {
+							Authorization: uni.getStorageSync('token')
+						},
+						success: function (res) {
+							console.log("resresresresresres",res)
+							const fileManager = wx.getFileSystemManager()
+							const filePath = wx.env.USER_DATA_PATH + '/' + item.name + '.docx'
+							fileManager.saveFile({
+								tempFilePath: res.tempFilePath,
+								filePath,
+								success: () => {
+									uni.hideLoading();
+									wx.openDocument({
+									filePath: filePath,
+									showMenu: true,
+									fileType: item.type
+									})
+								},
+								fail: function (res){
+									uni.hideLoading();
+									uni.showToast({
+										title: '下载失败',
+										icon:"none",
+										mask:true,
+										duration: 2000
+									});
+								}
+							})
+						},
+						fail: function (res){
+							uni.hideLoading();
+							uni.showToast({
+								title: '下载失败',
+								icon:"none",
+								mask:true,
+								duration: 2000
+							});
+						}
+					})
+				}
+			},
+			//查看图片
+			lockImg(list){
+				console.log(list)
+				/* if(!list[0]){
+					return
+				} */
+				let url=list.split(',')
+				wx.previewImage({
+					urls: url, //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
+					current: '', // 当前显示图片的http链接,默认是第一个
+					success: function(res) {},
+					fail: function(res) {},
+					complete: function(res) {},
+				})
+			},
+			async readByLoginUser(id){
+				let obj = {
+					id:id
+				}
+				const {data} = await readByLoginUser(obj)
+			},
+            //获取列表数据
+            async getList(){
+                let _this = this;
+				let listUrl=[];
+				let listName=[];
+
+                const {data} = await gradingControlDetail(this.id)
+                if(data.code==200){
+						this.infoList=data.data
+						console.log(data.data.detail.imgName)
+						console.log(data.data.detail.imgName.split(","))
+						listName=data.data.detail.imgName.split(",")
+						listUrl=data.data.detail.imgUrl.split(",")
+						for(var i=0;i<listName.length;i++){
+							if(listName[i]){
+								let type = listName[i].split(".")[1];
+								this.upList.push({'name':listName[i],'url':config.base_url+listUrl[i],'type':type,})
+							}
+						}
+
+						console.log(this.upList)
+
+
+                }
+
+            },
+        }
+    }
+</script>
+
+<style lang="stylus" scoped>
+    #accessQualification{
+        height:100%;
+        display flex
+        flex-direction column
+        .info-max-box{
+            flex:1;
+            overflow: scroll
+			.for-big-box:last-child{
+			    margin-bottom:180rpx;
+			}
+			/* 列表 */
+			.list{
+				padding 0 20rpx;
+				box-sizing border-box;
+				.list_li{
+					height 450rpx;
+					.list_li_t{
+						height :80rpx;
+						display flex;
+						justify-content flex-start;
+						align-items :center;
+						.list_li_t_l{
+							width: 80rpx;
+							height: 30rpx;
+							font-size: 24rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #EE3A3A;
+							line-height: 30rpx;
+							border: 2rpx solid #EE3A3A;
+							border-radius: 6rpx;
+							text-align center;
+						}
+						.list_li_t_c{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #333333;
+							line-height: 30rpx;
+							margin 0 32rpx 0 16rpx;
+						}
+						.list_li_t_r{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							line-height: 30rpx;
+						}
+					}
+					.list_li_b{
+						width 710rpx;
+						height auto;
+						background: #FFFFFF;
+						border-radius: 20rpx;
+						padding :0 14rpx;
+						box-sizing :border-box;
+						overflow hidden
+						.list_li_b_t{
+							overflow :hidden;
+							.list_li_b_t_t{
+								display flex;
+								justify-content flex-start;
+								margin :24rpx 0 18rpx 0;
+								.list_li_b_t_t_n{
+									flex:1;
+									display flex;
+									justify-content flex-start;
+									.list_li_b_t_t_l{
+										width :100rpx;
+										height :30rpx;
+										font-size: 24rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										/* color: #0183FA; */
+										line-height: 30rpx;
+										/* background: rgba(1,131,250,0.2); */
+										border-radius: 6rpx;
+										text-align :center;
+									}
+									.list_li_b_t_t_c{
+										flex:1;
+										font-size: 28rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color: #333333;
+										line-height: 28rpx;
+										margin :0 16rpx 0 12rpx;
+									}
+									.list_li_b_t_t_r{
+										font-size: 24rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color: #EE3A3A;
+										line-height: 24rpx;
+									}
+								}
+								.list_li_b_t_t_n_r{
+									font-size: 24rpx;
+									line-height: 30rpx;
+									color: #999;
+								}
+								/* 日管控 */
+								.purple{
+									color: #AC20E0;
+									background: rgba(172,32,224,0.2);
+								}
+								/* 周管控 */
+								.blue{
+									color: #0183FA;
+									background: rgba(1,131,250,0.2);
+								}
+								/* 月管控 */
+								.orange{
+									color: #FA8801;
+									background: rgba(250,136,1,0.2);
+								}
+								/* 年管控 */
+								.green{
+									color: #11BA25;
+									background: rgba(17,186,37,0.2);
+								}
+								>img{
+									width: 12rpx;
+									height: 24rpx;
+								}
+							}
+							.list_li_b_t_b{
+								font-size: 28rpx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+								line-height: 48rpx;
+								margin-bottom :14rpx;
+								>label{
+									color :#333333;
+								}
+							}
+						}
+						.list_li_b_b{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #333333;
+							line-height: 28rpx;
+							>label{
+								font-size: 28rpx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+								line-height: 28rpx;
+							}
+						}
+						.list_li_b_b2{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							line-height: 48rpx;
+							margin-top :32rpx;
+							>label{
+								color :#333333;
+							}
+						}
+
+						.list_li_b_b4{
+							width :100%;
+							margin-top :10rpx;
+							margin-bottom 20rpx;
+							display :flex;
+							justify-content :flex-start;
+							>label{
+								display :inline-block;
+								font-size: 28rpx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #333333;
+								line-height: 28rpx;
+								width :150rpx;
+							}
+							.list_li_b_b4_n{
+								width :560rpx;
+								.list_li_b_b4_r{
+									height:60rpx;
+									width :100%;
+									margin-bottom :20rpx;
+									display :flex;
+									justify-content :flex-start;
+									align-items :center;
+									img{
+										height:60rpx;
+										width:60rpx;
+										margin-right :10rpx;
+									}
+									.list_li_b_b4_r_r{
+										height :50rpx;
+										white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
+										width :100%;
+										font-size: 28rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color: #999999;
+										line-height: 50rpx;
+									}
+								}
+							}
+
+						}
+
+					}
+				}
+			}
+
+			/*暂无数据*/
+            .get-null-box{
+                height:100rpx;
+                line-height:100rpx;
+                color:#999;
+                text-align center
+            }
+        }
+        .bottom-button-box{
+			border-radius:20rpx;
+			margin:20rpx 50rpx;
+            width: 650rpx;
+            height: 100rpx;
+            line-height: 100rpx;
+            background: #0183FA;
+            font-size: 30rpx;
+            color: #FFFFFF;
+            text-align center;
+        }
+    }
+</style>

+ 306 - 0
pages_manage/gradingControl/gradingControlFinish.vue

@@ -0,0 +1,306 @@
+<!-- 准入资格证书 -->
+<template>
+    <view id="accessQualification">
+        <scroll-view scroll-y @scrolltolower="scrollGet" class="info-max-box">
+			<view class="list">
+				<view class="list_li" v-for="(item,index) in infoList" :key="index">
+					<view class="list_li_t">
+						<!-- <view class="list_li_t_l" :style="'color:'+item.levelColor+';border-color:'+item.levelColor">{{item.levelName}}</view> -->
+						<view class="list_li_t_c">{{item.subName}}</view>
+						<!-- <view class="list_li_t_r">{{item.typeName}}</view> -->
+					</view>
+					<view class="list_li_b" >
+						<view  class="list_li_b_t" @tap="goPageInfo(item2)" v-for="(item2,index2) in item.detailList" :key="index2" :style="index2==(item.detailList.length-1)?'border:none;':'border-bottom :1px dashed #cccccc;'">
+							<view class="list_li_b_t_t">
+								<view class="list_li_b_t_t_n">
+									<view class="list_li_b_t_t_l" :class="[item2.ruleType== '日管控' ? 'purple': '', item2.ruleType=='周管控'? 'blue': '',item2.ruleType=='月管控'? 'orange': '',item2.ruleType=='年管控'? 'green': '',]">{{item2.ruleType}}</view>
+									<view class="list_li_b_t_t_c">{{item2.ruleName}}</view>
+									<!-- <view class="list_li_b_t_t_r" v-if="item2.isExpired==1">(过期未完成)</view> -->
+								</view>
+								<view class="list_li_t_rr" :class="item2.status==0?'list_li_t_rr_color_a':(item2.status==2?'list_li_t_rr_color_b':'')">{{item2.status==0?'未执行':(item2.status==2?'已执行':'')}}</view>
+								<img class="list_li_b_t_t_img" src="@/images/basicsModules/icon_04.png" >
+							</view >
+							<!-- <view class="list_li_b_t_b">{{item2.ruleRemark}}</view> -->
+							<view class="list_li_b_t_b">截止执行时间:{{item2.endDate}}</view>
+						</view>
+					</view>
+				</view>
+			</view>
+           <view class="get-null-box" v-if="infoList.length==0">暂无更多数据</view>
+        </scroll-view>
+
+    </view>
+</template>
+
+<script>
+    import { gradingControlFinish } from '@/api/apiDemo/index.js'
+    export default {
+        data() {
+            return {
+                infoList:[],
+            }
+        },
+        onLoad() {
+
+        },
+
+        onShow(){
+            //this.clearData();
+			this.getList();
+        },
+        methods: {
+
+            //清除
+            clearData(){
+                this.infoList = [];
+
+            },
+            //去详情页
+            goPageInfo(item){
+
+                uni.navigateTo({
+                    url:'/pages_manage/gradingControl/gradingControlDetail?item='+encodeURIComponent(JSON.stringify(item))
+                })
+            },
+            //滚动事件
+            scrollGet(){
+               this.getList();
+            },
+
+
+            //获取列表数据
+            async getList(){
+                let _this = this;
+                let obj = {
+
+                }
+                const {data} = await gradingControlFinish(obj)
+                if(data.code==200){
+                      _this.infoList=data.data;
+                }
+
+            },
+        }
+    }
+</script>
+
+<style lang="stylus" scoped>
+    #accessQualification{
+        height:100%;
+        display flex
+        flex-direction column
+        .info-max-box{
+            flex:1;
+            overflow: scroll
+			.for-big-box:last-child{
+			    margin-bottom:180rpx;
+			}
+			/* 列表 */
+			.list{
+				padding 0 20rpx;
+				box-sizing border-box;
+				.list_li{
+					height auto;
+					.list_li_t{
+						height :80rpx;
+						display flex;
+						justify-content flex-start;
+						align-items :center;
+						.list_li_t_l{
+							width: 80rpx;
+							height: 30rpx;
+							font-size: 24rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #EE3A3A;
+							line-height: 30rpx;
+							border: 2rpx solid #EE3A3A;
+							border-radius: 6rpx;
+							text-align center;
+						}
+						.list_li_t_c{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #333333;
+							line-height: 30rpx;
+							margin 0 32rpx 0 16rpx;
+							flex:1;
+						}
+						.list_li_t_r{
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							line-height: 30rpx;
+						}
+					}
+					.list_li_b{
+						width 710rpx;
+						height auto;
+						background: #FFFFFF;
+						border-radius: 20rpx;
+						padding :0 14rpx;
+						box-sizing :border-box;
+						.list_li_b_t{
+							overflow :hidden;
+							border-bottom :1rpx dashed #cccccc;
+							.list_li_b_t_t{
+								display flex;
+								flex:1;
+								justify-content flex-start;
+								margin :24rpx 0 18rpx 0;
+								.list_li_b_t_t_n{
+									width:655rpx;
+									display flex;
+									justify-content flex-start;
+									.list_li_b_t_t_l{
+										width :100rpx;
+										height :30rpx;
+										font-size: 24rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										/* color: #0183FA; */
+										line-height: 24rpx;
+										/* background: rgba(1,131,250,0.2); */
+										border-radius: 6rpx;
+										text-align :center;
+									}
+									.list_li_b_t_t_c{
+										font-size: 28rpx;
+										font-family: PingFang SC;
+										flex:1;
+										font-weight: 500;
+										color: #333333;
+										line-height: 28rpx;
+										margin :0 16rpx 0 12rpx;
+									}
+									.list_li_b_t_t_r{
+										font-size: 24rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color: #EE3A3A;
+										line-height: 24rpx;
+									}
+								}
+								.list_li_t_rr{
+									width:100rpx;
+									font-size: 28rpx;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #999999;
+									line-height: 28rpx;
+									margin-right:10rpx;
+								}
+								.list_li_t_rr_color_a{
+									color:#FF4E00;
+								}
+								.list_li_t_rr_color_b{
+									color:#14AE10;
+								}
+								/* 日管控 */
+								.purple{
+									color: #AC20E0;
+									background: rgba(172,32,224,0.2);
+								}
+								/* 周管控 */
+								.blue{
+									color: #0183FA;
+									background: rgba(1,131,250,0.2);
+								}
+								/* 月管控 */
+								.orange{
+									color: #FA8801;
+									background: rgba(250,136,1,0.2);
+								}
+								/* 年管控 */
+								.green{
+									color: #11BA25;
+									background: rgba(17,186,37,0.2);
+								}
+								>img{
+									width: 12rpx;
+									height: 24rpx;
+									margin-top:2rpx;
+								}
+							}
+							.list_li_b_t_b{
+								font-size: 28rpx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+								line-height: 48rpx;
+								margin-bottom :14rpx;
+							}
+						}
+
+						.list_li_b_b{
+
+							.list_li_b_b_t{
+								display :flex;
+								justify-content :flex-start;
+								margin :30rpx 0 18rpx;
+								.list_li_b_b_t_n{
+									width:655rpx;
+									display flex;
+									justify-content flex-start;
+									.list_li_b_b_t_l{
+										width :100rpx;
+										height :30rpx;
+										border-radius: 6rpx;
+										font-size: 24rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color: #FA8801;
+										line-height: 30rpx;
+										background :rgba(250,136,1,0.2);
+										text-align :center;
+										margin-right :12rpx;
+									}
+									.list_li_b_b_t_r{
+										font-size: 28rpx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color: #333333;
+										line-height: 30rpx;
+									}
+								}
+								>img{
+									width: 12rpx;
+									height: 24rpx;
+								}
+
+							}
+							.list_li_b_b_b{
+								font-size: 28rpx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+								line-height: 48rpx;
+							}
+						}
+					}
+				}
+			}
+
+			/*暂无数据*/
+            .get-null-box{
+                height:100rpx;
+                line-height:100rpx;
+                color:#999;
+                text-align center
+            }
+        }
+        .bottom-button-box{
+			border-radius:20rpx;
+			margin:20rpx 50rpx;
+            width: 650rpx;
+            height: 100rpx;
+            line-height: 100rpx;
+            background: #0183FA;
+            font-size: 30rpx;
+            color: #FFFFFF;
+            text-align center;
+        }
+    }
+</style>

BIN
pages_manage/images/icon_aqxxp_dxaq.png


BIN
pages_manage/images/icon_aqxxp_gbmc.png


BIN
pages_manage/images/icon_aqxxp_gbsd.png


BIN
pages_manage/images/icon_aqxxp_gzf.png


BIN
pages_manage/images/icon_aqxxp_jzxy.png


BIN
pages_manage/images/icon_aqxxp_jzys.png


+ 28 - 0
pages_manage/laboratory/broadcast.vue

@@ -0,0 +1,28 @@
+<!-- 开始广播 -->
+<template>
+    <view id="broadcast">
+    </view>
+</template>
+
+<script>
+    export default {
+        data() {
+            return {
+
+            }
+        },
+        onLoad() {
+
+        },
+        methods: {
+
+        }
+    }
+</script>
+
+<style lang="stylus" scoped>
+    #broadcast{
+        height:100%;
+        display flex
+    }
+</style>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1744 - 0
pages_manage/laboratory/laboratoryInfo.vue


+ 529 - 0
pages_manage/laboratory/meLaboratory.vue

@@ -0,0 +1,529 @@
+<!-- 我的实验室 -->
+<template>
+    <view id="meLaboratory">
+        <view class="top-picker-max-box">
+            <view class="top-picker-box">
+                <picker @change="facultyChange" :value="facultyIndex" :range="facultyArray">
+                    <view class="picker-view">
+                        <view>{{!facultyIndex?'学院':facultyArray[facultyIndex]}}</view>
+                        <img class="picker-img" src="@/images/basicsModules/icon_06.png" alt="">
+                    </view>
+                </picker>
+            </view>
+            <view class="top-picker-box">
+                <picker @change="subjectChange" :value="subjectIndex" :range="subjectArray">
+                    <view class="picker-view">
+                        <view>{{!subjectIndex?'分类':subjectArray[subjectIndex]}}</view>
+                        <img class="picker-img" src="@/images/basicsModules/icon_06.png" alt="">
+                    </view>
+                </picker>
+            </view>
+            <view class="top-picker-box">
+                <picker @change="levelChange" :value="levelIndex" :range="levelArray">
+                    <view class="picker-view">
+                        <view>{{!levelIndex?'分级':levelArray[levelIndex]}}</view>
+                        <img class="picker-img" src="@/images/basicsModules/icon_06.png" alt="">
+                    </view>
+                </picker>
+            </view>
+        </view>
+        <view class="for-max-box">
+            <img class="null-img" v-if="!dataList[0]" src="@/images/basicsModules/null-data-1.png">
+            <view class="for-box" v-for="(item,index) in dataList" :key="index" @click="laboratoryInfo(item)">
+                <view class="title-box">
+					<view :style="'border:1rpx solid '+item.fiedColor+';background:#fff;color:'+item.fiedColor+';'">{{item.levelName}}</view>
+                    <view>{{item.name}}</view>
+                    <img src="@/images/basicsModules/icon_04.png">
+                </view>
+                <view class="address-box"><span>{{item.typeName}}</span>{{item.deptName}}</view>
+                <view class="address-box-two">
+                    <img src="@/images/basicsModules/icon_14.png">
+                    <view>{{item.subAddrrStr}}</view>
+                </view>
+				<view class="text-box" v-if="item.sensorFunctionList[0]">
+					<view class="min-box" v-for="(minItem,index2) in item.sensorFunctionList" :key="index2">
+						<view class="min-min-box">
+							<img v-show="minItem.hasWarn" src="@/images/basicsModules/icon_15.png">
+							<view :class="{'colorA':minItem.hasWarn}">{{minItem.funcName}}:{{minItem.formatVal?minItem.formatVal:'-'}}</view>
+						</view>
+					</view>
+				</view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    import $mqtt from '@/utils/mqtt.min.js';
+    import { config } from '@/api/request/config.js'
+    import { laboratoryList,subject_class,listDepartments,mangerControl,laboratoryInfo } from '@/api/apiDemo/index.js'
+    export default {
+        data() {
+            return {
+                dataList:[],
+                subject_classData:[],
+                //MQTT请求参数-传感器
+                client:{},
+				mqttIdList:[],
+                //院系选择器数据
+                facultyList:[],
+                facultyArray:[],
+                facultyIndex:"",
+                //学科选择器数据
+                subjectList:[],
+                subjectArray:[],
+                subjectIndex:"",
+                //级别选择器数据
+                levelList:[
+                    {dictLabel:"全部级别", dictValue:""},
+                    {dictLabel:"一级", dictValue:"1"},
+                    {dictLabel:"二级", dictValue:"2"},
+                    {dictLabel:"三级", dictValue:"3"},
+                    {dictLabel:"四级", dictValue:"4"},
+                ],
+                levelArray:['全部级别','一级','二级','三级','四级'],
+                levelIndex:"",
+            }
+        },
+        onLoad() {
+
+        },
+        onShow(){
+            this.listDepartments();
+            this.subject_class();
+		// mqtt订阅因为返回数据频率问题 暂时取消列表的MQTT刷新
+            //监听传感器信息
+            // getApp().watch(this.getMqttSensorData,'mqttSensorData')
+        },
+        methods: {
+            //监听传感器信息
+            getMqttSensorData(val){
+                let self = this;
+                // console.log('页面获取的-传感器信息',val)
+                if(val.subId){
+                    for(let i=0;i<self.dataList.length;i++){
+                        if(self.dataList[i].id == val.subId){
+                            self.$set(self.dataList[i],'sensorFunctionList',val.functionStatuses);
+                        }
+                    }
+                }
+            },
+            async laboratoryInfo(item){
+                const {data} = await laboratoryInfo(item.id);
+                if(data.code == 200){
+                    let obj = data.data[0];
+                    obj.subClassVO = item.subClassVO;
+                    obj.name = item.name;
+                    obj.subTypeLable = item.subTypeLable;
+                    obj.deptName = item.deptName;
+                    obj.subAddrrStr = item.subAddrrStr;
+					obj.sensorFunctionList = item.sensorFunctionList;
+                    uni.navigateTo({
+                        url: '/pages_manage/laboratory/laboratoryInfo?item='+encodeURIComponent(JSON.stringify(obj))+'&deptId='+item.deptId
+                    });
+                }
+            },
+            //滚动选择器
+            facultyChange: function(e) {
+                if(this.facultyArray[0]){
+                    this.facultyIndex = parseInt(e.target.value);
+                    this.laboratoryList();
+                }
+            },
+            subjectChange: function(e) {
+                if(this.subjectArray[0]){
+                    this.subjectIndex = parseInt(e.target.value);
+                    this.laboratoryList();
+                }
+            },
+            levelChange: function(e) {
+                if(this.levelArray[0]){
+                    this.levelIndex = parseInt(e.target.value);
+                    this.laboratoryList();
+                }
+            },
+            //设备开关按钮
+            hardwareButton(minItem,command){
+                let self = this;
+                let text = '';
+                if(command == 'close'){
+                    text = '关闭';
+                }else if(command == 'open'){
+                    text = '开启';
+                }
+                uni.showModal({
+                    content: '确认要'+text+'吗?',
+                    cancelColor:"#999",
+                    confirmColor:"#0183FA",
+                    success: function (res) {
+                        if (res.confirm) {
+                            self.mangerControl(minItem,command);
+                            console.log('用户点击确定');
+                        } else if (res.cancel) {
+                            console.log('用户点击取消');
+                        }
+                    }
+                });
+            },
+            //设备开关
+            async mangerControl(minItem,command){
+                let obj = {
+                    id:minItem.id,
+                    command:command,
+                };
+                const {data} = await mangerControl(obj);
+                if(data.code == 200){
+                    if(command == 'open'){
+                        minItem.type = 3;
+                    }else if(command == 'close'){
+                        minItem.type = 4;
+                    }
+                    uni.showToast({
+                        title: '操作成功',
+                        icon:"none",
+                        mask:true,
+                        duration: 2000
+                    });
+                }
+            },
+            //获取院系
+            async listDepartments(){
+                const {data} = await listDepartments();
+                if(data.code == 200){
+                    let list = [];
+                    for(let i=0;i<data.data.length;i++){
+                        list.push(data.data[i].deptName)
+                    }
+                    this.facultyArray = list;
+                    list.unshift('全部院系');
+                    this.facultyList = data.data;
+                    this.facultyList.unshift({deptName:"全部院系", deptId:""})
+                }
+            },
+            //获取学科字典
+            async subject_class(){
+                const {data} = await subject_class();
+                if(data.code == 200){
+                    this.subject_classData = data.data;
+                    let list = [];
+                    for(let i=0;i<data.data.length;i++){
+                        list.push(data.data[i].dictLabel)
+                    }
+                    this.subjectArray = list;
+                    list.unshift('全部分类');
+                    this.subjectList = data.data;
+                    this.subjectList.unshift({dictLabel:"全部分类", dictValue:""})
+                    this.laboratoryList()
+                }
+            },
+            //获取实验室列表
+            async laboratoryList(){
+                let self = this;
+                let obj = {
+                    deptId:this.facultyIndex?this.facultyList[this.facultyIndex].deptId:'',
+                    subDept:this.subjectIndex?this.subjectList[this.subjectIndex].dictValue:'',
+                    level:this.levelIndex?this.levelList[this.levelIndex].dictValue:'',
+                };
+                const {data} = await laboratoryList(obj);
+                if(data.code == 200){
+                    for(let o=0;o<data.data.length;o++){
+                        if(data.data[o].labHardwareVOList){
+                            data.data[o].hardwareList = [];
+                            for(let i=0;i<data.data[o].labHardwareVOList.length;i++){
+                                if(data.data[o].labHardwareVOList[i].hardwareTypeEnum.code == 4 &&data.data[o].labHardwareVOList[i].hardwareNUM){
+                                    if(data.data[o].hardwareNUM){
+                                        data.data[o].hardwareNUM = data.data[o].hardwareNUM + ',' + data.data[o].labHardwareVOList[i].hardwareNUM
+                                    }else{
+                                        data.data[o].hardwareNUM = data.data[o].labHardwareVOList[i].hardwareNUM
+                                    }
+                                }else{
+                                    let obj = {
+                                        name:"",
+                                        type:"",
+                                    };
+                                    obj.name = data.data[o].labHardwareVOList[i].hardwareTypeEnum.hardwareTypeName
+                                    obj.type = data.data[o].labHardwareVOList[i].state.code;
+                                    obj.id = data.data[o].labHardwareVOList[i].id;
+                                    data.data[o].hardwareList.push(obj);
+                                }
+                            }
+                        }
+                    }
+                    this.dataList = data.data;
+					let list = [];
+					let obj = {
+						type:"lab/function/data",
+						idList:[],
+					}
+					let objOne = {
+						type:"lab/hardware/data",
+						idList:[],
+					}
+					for(let i=0;i<self.dataList.length;i++){
+						let num = 0;
+						for(let o=0;o<obj.idList.length;o++){
+							if(obj.idList[o] == self.dataList[i].id){
+								num++
+							}
+						}
+						if(num == 0){
+							obj.idList.push(self.dataList[i].id)
+							objOne.idList.push(self.dataList[i].id)
+						}
+					}
+					list.push(obj);
+					list.push(objOne);
+					this.$set(self,'mqttIdList',list);
+					// mqtt订阅因为返回数据频率问题 暂时取消列表的MQTT刷新
+					// getApp().appMqttOn(1,list);
+                }
+            },
+        },
+        onHide(){
+            // this.offMQTT();
+            // //删除传感器监听
+			// getApp().appMqttOn(2);
+            getApp().deleteSensorWatch();
+            console.log("onHide",this.mtopic);
+        },
+        beforeDestroy(){
+            // this.offMQTT();
+            // //删除传感器监听
+			getApp().offMQTT();
+            getApp().deleteSensorWatch();
+            console.log("beforeDestroy",this.mtopic);
+        }
+    }
+</script>
+
+<style lang="stylus" scoped>
+    #meLaboratory{
+        height:100%;
+        display flex
+        flex-direction column
+        .top-picker-max-box{
+            display:flex;
+            padding:0 20rpx;
+            background #fff
+            border-bottom:1rpx solid #E0E0E0;
+            .top-picker-box{
+                line-height:80rpx;
+                height:80rpx;
+                .picker-view{
+                    display flex
+                    view{
+                        display:block;
+                        overflow:hidden;
+                        text-overflow:ellipsis;
+                        white-space:nowrap;
+                        font-size:28rpx;
+                    }
+                    .picker-img{
+                        width:24rpx;
+                        height:13rpx;
+                        margin-top:36rpx;
+                        margin-left:13rpx;
+                    }
+                }
+            }
+            .top-picker-box:nth-child(1){
+                text-align left
+                width:320rpx;
+                .picker-view{
+                    view{
+                        max-width:260rpx;
+                    }
+                }
+            }
+            .top-picker-box:nth-child(2){
+                text-align left
+                width:215rpx;
+                .picker-view{
+                    view{
+                        max-width:156rpx;
+                    }
+                }
+            }
+            .top-picker-box:nth-child(3){
+                text-align right
+                width:195rpx;
+                .picker-view{
+                    view{
+                        flex:1;
+
+                    }
+                }
+            }
+        }
+        .for-max-box{
+            flex:1;
+            overflow-y scroll
+            .null-img{
+                display block
+                width:276rpx;
+                height:321rpx;
+                position absolute
+                top:200rpx;
+                left:274rpx;
+            }
+            .for-box{
+                overflow hidden
+                background #ffffff
+                margin-bottom:20rpx;
+                .title-box{
+                    margin:20rpx 20rpx 0;
+                    display flex
+                    view:nth-child(1){
+                        height:40rpx;
+                        line-height:40rpx;
+                        font-size:20rpx;
+                        border-radius:10rpx;
+                        padding:0 20rpx;
+                        color:#fff;
+                        margin-right:20rpx;
+                    }
+                    view:nth-child(2){
+                        line-height:42rpx;
+                        font-size:30rpx;
+                        color:#333;
+                        max-width:600rpx;
+                        flex:1;
+                    }
+                    img{
+                        width:12rpx;
+                        height:20rpx;
+                        margin-top:11rpx;
+                    }
+                    .colorA{
+                        background:#aa2315;
+                    }
+                    .colorB{
+                        background:#ff9b09;
+                    }
+                    .colorC{
+                        background:#3ea3e9;
+                    }
+                    .colorD{
+                        background:#3ea34c;
+                    }
+
+                }
+                .address-box{
+                    margin:20rpx 20rpx;
+                    font-size:26rpx;
+                    color:#999999;
+                    span{
+                        margin-right:60rpx;
+                    }
+                }
+                .address-box-two{
+                    display flex
+                    margin:0 20rpx 20rpx 20rpx;
+                    img{
+                        width:28rpx;
+                        height:30rpx;
+                        margin-right:18rpx;
+                    }
+                    view{
+                        line-height:30rpx;
+                        font-size:24rpx;
+                        color:#999999;
+                    }
+                }
+                .text-box{
+                    /*border-top:1rpx dashed #e0e0e0;*/
+                    border-top:1rpx solid #E0E0E0;
+                    padding:20rpx 20rpx;
+                    /*
+                    overflow-x:scroll;
+                    overflow-y:hidden;
+                    white-space: nowrap;
+                    */
+                    .min-box{
+                        display inline-block
+                        /*padding:0 30rpx 0 10rpx;*/
+                        width:335rpx;
+                        .min-min-box{
+                            display: flex
+                            img{
+                                width:30rpx;
+                                height:27rpx;
+                                margin-top:24rpx;
+                                margin-right:10rpx;
+                            }
+                            view{
+                                line-height:74rpx;
+                                text-align center
+                                font-size:28rpx;
+                                color:#333;
+                            }
+                            .colorA{
+                                color:#EE3A3A;
+                            }
+                        }
+                    }
+                }
+                .sensor-max-box{
+                    margin:0 20rpx;
+                    border-top:1rpx solid #e0e0e0;
+                    border-bottom:1rpx solid #e0e0e0;
+                    display flex
+                    .for-sensor-box{
+                        flex:1;
+                        display flex
+                        font-size:28rpx;
+                        line-height:94rpx;
+                        view{
+                            margin-left:20rpx;
+                            font-size:25rpx;
+                            line-height:94rpx;
+                            color:#0183FA;
+                        }
+                    }
+                }
+                .button-max-box{
+                    .button-box{
+                        display flex
+                        view:nth-child(1){
+                            flex:1;
+                            line-height:90rpx;
+                            color:#333333;
+                            margin-left:30rpx;
+                            font-size:28rpx;
+                        }
+                        view:nth-child(2){
+                            width:142rpx;
+                            line-height:42rpx;
+                            border:4rpx solid #0183FA;
+                            border-radius:25rpx;
+                            color: #0183FA;
+                            font-size: 30rpx;
+                            text-align center;
+                            margin:20rpx 20rpx 20rpx 0;
+                        }
+                    }
+                    .for-button-box{
+                        display flex
+                        view{
+                            flex:1;
+                            line-height:90rpx;
+                            color:#333333;
+                            margin-left:30rpx;
+                            font-size:28rpx;
+                        }
+                        img{
+                            height:50rpx;
+                            width:100rpx;
+                            margin:20rpx 20rpx 20rpx 0;
+                        }
+                        view:nth-child(2){
+                            text-align right
+                            color:#999;
+                            margin-right:30rpx;
+                        }
+                    }
+                }
+            }
+        }
+    }
+</style>

+ 586 - 0
pages_manage/laboratory/monitor.vue

@@ -0,0 +1,586 @@
+<!-- 查看监控 -->
+<template>
+  <view id="monitor">
+    <view class="name-box">{{itemData.name}}</view>
+    <view class="address-box">{{itemData.address}}</view>
+    <view class="max-viode-box">
+      <video
+          v-for="(item,index) in urlList" :key="index" :id="urlList.id" :src="item.url"
+          :poster="videoCover"
+          :custom-cache='false' :autoplay="true" :controls="true"
+          :enable-danmu="false" :muted="true" :show-fullscreen-btn="true"
+          :show-center-play-btn="false" :show-play-btn="false"
+          @error="videoErrorCallback" >
+      </video>
+    </view>
+    <view class="gb-box">
+      <!-- <view class="radio-box">
+        <view class="radio-title">播报方式</view>
+        <radio-group @change="radioChange" class="radio-max-button">
+          <label class="radio-button" v-for="(item, index) in items" :key="item.value">
+            <radio :value="item.value" color="#007AFF" :checked="item.value == current" />{{item.name}}
+          </label>
+        </radio-group>
+      </view> -->
+      <!-- <view class="input-box" v-if="current == 1">
+        <view class="textarea-title">广播内容</view>
+        <textarea placeholder="请输入广播内容" v-model="text" maxlength="100"></textarea>
+        <view class="input-button" @click="voiceButton">确定</view>
+      </view> -->
+      <view class="device-box" v-if="current == 2 && trumpetList[0]">
+        <view class="device-title">广播设备</view>
+        <view class="device-for-max-box">
+          <view @click="trumpetClick(index)"
+                class="trumpet-for-box" :class="item.type?'trumpet-color-a':'trumpet-color-b'"
+                v-for="(item,index) in trumpetList" :key="index">
+            <view class="trumpet-for-min-box">
+              <img src="@/images/basicsModules/icon_sskz_zc.png" v-if="!item.type"/>
+              <img src="@/images/basicsModules/icon_sskz_xz.png" v-if="item.type"/>
+              <view>{{item.name}}</view>
+            </view>
+          </view>
+        </view>
+        <view class="broadcast_m">
+          <view class="broadcast_m_t" :class="liveType?'broadcast_m_t_back_a':'broadcast_m_t_back_b'" @longpress.stop="recordButton" @touchmove.stop="cancelButton"  @touchend.stop="sendButton">
+
+            {{liveType?'松开发送':'按住说话'}}
+          </view>
+          <view class="broadcast_m_b" v-if="!liveType">按住说话,录入广播内容</view>
+          <view class="broadcast_m_b" v-if="liveType">松开发送,向上滑动取消发送</view>
+        </view>
+      </view>
+	  <view class="null-device-box" v-if="!trumpetList[0]">
+		  暂无广播设备
+	  </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { config } from '@/api/request/config.js'
+import { getChannels,GetStartList,getDeviceListBySub ,textParseUrlIps ,voice } from '@/api/apiDemo/index.js'
+export default {
+  data() {
+    return {
+	  videoCover:uni.getStorageSync('videoCover'),
+      itemData:{},
+      urlList:[],
+      deptId:"",
+      text:"",
+      type:"",
+      items:[
+        {
+          name:"文字",
+          value:"1"
+        },
+        {
+          name:"音频",
+          value:"2"
+        },
+      ],
+
+      current:2,
+      trumpetList:[],
+      //滑动记录
+      startPoint:{},
+      //广播相关
+      liveType:false,
+      sendLock: true, //发送锁,当为true时上锁,false时解锁发送
+      recorderManager : wx.getRecorderManager(),
+    }
+  },
+  onLoad(option) {
+    this.itemData = JSON.parse(decodeURIComponent(option.item));
+    this.deptId = JSON.parse(decodeURIComponent(option.deptId));
+    console.log(this.itemData)
+    console.log(this.deptId)
+
+
+	this.GetVideoList();
+    this.getDeviceListBySub();
+    // this.getChannels();
+  },
+  onShow(){
+    // wx.getSystemInfo({
+    //   success (res) {
+    //     console.log("res",res)
+    //   }
+    // })
+  },
+  methods: {
+    voiceButton(){
+      let self = this;
+      if(!this.text){
+        uni.showToast({
+          title: '请输入广播内容',
+          icon:"none",
+          mask:true,
+          duration: 2000
+        });
+        return
+      }
+      uni.showModal({
+        // title: '确认要退出吗?',
+        content: '确认播放吗?',
+        cancelColor:"#999",
+        confirmColor:"#0183FA",
+        success: function (res) {
+          if (res.confirm) {
+            self.voice();
+            console.log('用户点击确定');
+          } else if (res.cancel) {
+            console.log('用户点击取消');
+          }
+        }
+      });
+    },
+    //播放
+    async voice(){
+      let obj = {
+        txt:this.text,
+
+        type:'1'
+      };
+      const {data} = await voice(this.itemData.id,obj);
+      if(data.code == 200){
+        this.text = "";
+        uni.showToast({
+          title: '播放成功',
+          icon:"none",
+          mask:true,
+          duration: 2000
+        });
+      }
+    },
+    //点击选择喇叭
+    trumpetClick(index){
+      this.trumpetList[index].type = !this.trumpetList[index].type
+     //  let _this=this;
+     //  if(_this.trumpetList[index].type==true){
+     //    _this.trumpetList.forEach(function(item2) {
+     //      if(item2.deviceSn==_this.trumpetList[index].deviceSn){
+     //        item2.type=true
+     //      }else{
+     //        item2.type=false
+     //      }
+     //    })
+	    // }
+    },
+    //录制
+    recordButton(e){
+      console.log("按下")
+      let self = this;
+      let num = 0;
+      for(let i=0;i<self.trumpetList.length;i++){
+        if(self.trumpetList[i].type){
+          num++
+        }
+      }
+      if(num == 0){
+        uni.showToast({
+          title: '请选择喇叭',
+          icon:"none",
+          mask:true,
+          duration: 2000
+        });
+        return
+      }
+      this.liveType=true;
+      console.log('录制',e)
+      this.startPoint = e.touches[0];//记录长按时开始点信息,后面用于计算上划取消时手指滑动的距离。
+      const options = {
+        duration: 10000,
+        sampleRate: 16000,
+        numberOfChannels: 1,
+        encodeBitRate: 48000,
+        format: 'mp3',
+        frameSize: 50
+      }
+      this.recorderManager.start(options);//开始录音
+      this.recorderManager.onStart(() => {
+        console.log('recorder start')
+      })
+      this.recorderManager.onError((res) => {
+        console.log(res);
+      })
+      wx.showToast({
+        title: "正在录音,上划取消发送",
+        icon: "none",
+        duration: 60000//先定义个60秒,后面可以手动调用wx.hideToast()隐藏
+      });
+      this.sendLock = false;//长按时是不上锁的。
+    },
+    //取消
+    cancelButton(e){
+      console.log("移动")
+      let self = this;
+      let num = 0;
+      for(let i=0;i<self.trumpetList.length;i++){
+        if(self.trumpetList[i].type){
+          num++
+        }
+      }
+      if(num == 0){
+        return
+      }
+      this.liveType=false;
+      console.log('取消',e)
+      let moveLenght = e.touches[e.touches.length - 1].clientY - this.startPoint.clientY; //移动距离
+      if (Math.abs(moveLenght) > 50) {
+        wx.showToast({
+          title: "松开手指,取消发送",
+          icon: "none",
+          duration: 60000
+        });
+        this.sendLock = true;//触发了上滑取消发送,上锁
+      } else {
+        wx.showToast({
+          title: "正在录音,上划取消发送",
+          icon: "none",
+          duration: 60000
+        });
+        this.sendLock = false;//上划距离不足,依然可以发送,不上锁
+      }
+    },
+    //发送
+    sendButton(e){
+      console.log("松开")
+      let self = this;
+      let num = 0;
+      for(let i=0;i<self.trumpetList.length;i++){
+        if(self.trumpetList[i].type){
+
+          num++
+        }
+      }
+      if(num == 0){
+        return
+      }
+      this.liveType=false;
+      console.log('发送',e)
+      wx.hideToast();//结束录音、隐藏Toast提示框
+      this.recorderManager.stop();//结束录音
+      this.recorderManager.onStop((res) => {
+        if(!this.sendLock){
+          console.log('1', this.recorderManager)
+          this.uploadImg(res.tempFilePath);
+        }
+        console.log('停止录音', res.tempFilePath)
+        console.log("sendLock",this.sendLock);
+      })
+    },
+    //上传MP3
+    async uploadImg(tempFilePaths){
+      var self = this;
+      uni.uploadFile({
+        url: config.base_url+'/base/file/upload', //仅为示例,非真实的接口地址
+        header:{'Authorization':uni.getStorageSync('token')},
+        filePath: tempFilePaths,
+        name: 'file',
+        formData: {
+          'user': 'test'
+        },
+        success: (uploadFileRes) => {
+          let res = JSON.parse(uploadFileRes.data);
+          if(res.code == 200){
+            console.log("上传成功",res)
+            self.textParseUrlIps(config.base_url+ '/' +res.data.url);
+            // self.newData.imgList.push(res.data.url);
+          }else{
+            uni.showToast({
+              title: res.msg,
+              icon:"none",
+              mask:true,
+              duration: 2000
+            });
+          }
+        },
+        fail: err => {
+          uni.hideLoading()
+        },
+        complete: () => {
+        }
+      });
+    },
+    //发送语音
+    async textParseUrlIps(text){
+      let self = this;
+      let newList = [];
+      for(let i=0;i<self.trumpetList.length;i++){
+        if(self.trumpetList[i].type){
+          let obj = {
+            sn:self.trumpetList[i].deviceSn,
+            port:self.trumpetList[i].port,
+			      deviceIp:self.trumpetList[i].deviceIp,
+            type:"",
+            name:"",
+            speed:"",
+            params:{
+              tid:"",
+              vol:self.trumpetList[i].deviceVol,
+              urls:[]
+
+            }
+          };
+          newList.push(obj);
+        }
+      }
+      const {data} = await textParseUrlIps(newList,text)
+      if(data.code == 200){
+        uni.showToast({
+          title: '发送成功',
+          icon:"none",
+          mask:true,
+          duration: 2000
+        });
+      }
+    },
+    radioChange(e){
+      this.current = e.detail.value;
+    },
+    //获取喇叭列表
+    async getDeviceListBySub(){
+      let obj = {
+        floorId:this.itemData.floorId,
+        subId:this.itemData.id,
+        page:1,
+        pageSize:100
+      }
+      const {data} = await getDeviceListBySub(obj);
+      if(data.code == 200){
+        for(let i=0;i<data.data.length;i++){
+          data.data[i].type = false;
+        }
+        this.$set(this,'trumpetList',data.data)
+        // console.log(data);
+      }
+    },
+    //查询摄像头地址
+    async GetVideoList(){
+      let obj = {
+        page:'1',
+        count:'10',
+        deviceIds:this.itemData.hardwareNUM
+      };
+      const {data} = await GetStartList(obj);
+      if(data.code == 200){
+        let list = [];
+        for(let i=0;i<data.data.length;i++){
+          let text = uni.getStorageSync('cameraUrl');
+          let url = data.data[i].hls;
+          url = url.split("rtp/");
+          let newUrl = text+'rtp/'+url[1];
+          let obj = {
+            id:data.data[i].deviceID,
+            url:newUrl,
+          }
+          list.push(obj)
+          console.log("obj",obj)
+        }
+        this.urlList = list;
+      }
+    },
+
+	videoErrorCallback(e){
+      console.log("播放失败",e);
+      // uni.showToast({
+      //     title: '视频播放失败',
+      //     icon:"none",
+      //     mask:true,
+      //     duration: 3000
+      // });
+    },
+  }
+}
+</script>
+
+<style lang="stylus" scoped>
+#monitor{
+  padding:10rpx 20rpx;
+  background #fff
+  .name-box{
+    line-height:50rpx;
+    font-size:30rpx;
+    color:#333;
+  }
+  .address-box{
+    line-height:50rpx;
+    font-size:28rpx;
+    color:#666;
+    margin-bottom:20rpx;
+  }
+  .max-viode-box{
+    height: 720rpx;
+    overflow-y scroll;
+    video{
+      width:710rpx;
+      height:355rpx;
+    }
+  }
+  .gb-box{
+    margin-top:20rpx;
+    .radio-box{
+      display flex;
+      font-size:26rpx;
+      .radio-title{
+        font-size:28rpx;
+        margin:20rpx 0 20rpx 20rpx;
+        line-height:40rpx;
+      }
+      .radio-max-button{
+        display flex
+        margin:0 100rpx;
+        height:40rpx;
+        margin-top:20rpx;
+        .radio-button{
+          flex:1;
+          margin-left:75rpx;
+          font-size:26rpx;
+        }
+      }
+    }
+    .input-box{
+      .textarea-title{
+        font-size:28rpx;
+        margin:20rpx 0 20rpx 20rpx;
+        line-height:40rpx;
+      }
+      textarea{
+        width:630rpx;
+        height:200rpx;
+        margin:20rpx 20rpx 0;
+        font-size:26rpx;
+        border: 1rpx solid #E0E0E0;
+        border-radius:10rpx;
+        padding:20rpx;
+      }
+      .input-button{
+        margin:20rpx auto;
+        width:600rpx;
+        height:80rpx;
+        line-height:80rpx;
+        color:#fff;
+        background #007AFF;
+        text-align center;
+        border-radius:20rpx;
+      }
+    }
+    .device-box{
+      margin-bottom:50rpx;
+      .device-title{
+        font-size:28rpx;
+        margin:20rpx 0 20rpx 20rpx;
+        line-height:40rpx;
+      }
+      .device-for-max-box{
+        margin-top :22rpx;
+        .trumpet-for-box{
+          display:inline-block !important;
+          //width:204rpx;
+		  width: auto;
+          height:60rpx;
+          line-height:60rpx;
+          font-size:24rpx;
+          text-align center;
+          cursor: pointer;
+          overflow: hidden;
+          border: 1rpx solid #E0E0E0;
+          border-radius:10rpx;
+          color: #E0E0E0;
+          justify-content :center;
+          // margin-right :30rpx;
+          margin: 10rpx 16rpx;
+		  padding: 0 12rpx;
+		  box-sizing: border-box;
+          .trumpet-for-min-box{
+            display flex
+            >img{
+              display:inline-block !important;
+              width:36rpx;
+              height:34rpx;
+              margin :13rpx 20rpx 0 25rpx;
+            }
+            view{
+              display:inline-block !important;
+            }
+          }
+        }
+
+        .trumpet-color-a{
+          border:1px solid #0183FA;
+          color:#0183FA;
+        }
+        .trumpet-color-b{
+          border:1px solid #CCCCCC;
+          color:#999;
+        }
+      }
+      .broadcast_m{
+        width :100%;
+        .broadcast_m_t{
+          width: 142rpx;
+          height: 142rpx;
+          margin :30rpx 0 0 258rpx;
+          margin:30rpx auto 0;
+          position :relative;
+          font-size: 24rpx;
+          font-family: PingFang SC;
+          font-weight: 500;
+          line-height: 170rpx;
+          text-align center
+          >img{
+            width: 142rpx;
+            height: 142rpx;
+            position :absolute;
+
+          }
+          >label{
+            width :100%;
+            font-size: 24rpx;
+            font-family: PingFang SC;
+            font-weight: 500;
+            color: #0183FA;
+            line-height: 24rpx;
+            display :inline-block;
+            text-align :center;
+            position :absolute;
+            top:76rpx;
+          }
+          /* 按下 */
+          .press_color{
+            color: #FFFFFF;
+          }
+          /* 松开 */
+          .slip_color{
+            color: #0183FA;
+          }
+        }
+        .broadcast_m_t_back_a{
+          background:url(@/images/basicsModules/icon_sskz_skfs.png);
+          background-size 100%
+          color: #FFFFFF;
+        }
+        .broadcast_m_t_back_b{
+          background:url(@/images/basicsModules/icon_sskz_azsh.png);
+          background-size 100%
+          color: #0183FA;
+        }
+        .broadcast_m_b{
+          font-size: 24rpx;
+          font-family: PingFang SC;
+          font-weight: 500;
+          color: #999999;
+          line-height: 24rpx;
+          text-align center;
+          margin-top :14rpx;
+        }
+      }
+    }
+	.null-device-box{
+		text-align: center;
+		color:#999;
+		line-height:100rpx;
+	}
+  }
+}
+</style>

+ 237 - 0
pages_manage/laboratory/safetyCard.vue

@@ -0,0 +1,237 @@
+<!-- 安全信息牌 -->
+<template>
+    <view id="safetyCard">
+        <view class="top-name-max-box">
+            <view class="name-box back-ff">
+                <view v-for="(minItem,index1) in subject" :key="index1" v-if="minItem.dictValue === itemData.subDept">{{minItem.dictLabel}}</view>
+                <view class="color-33">{{itemData.name}}</view>
+            </view>
+            <view class="address-box color-99">{{itemData.address}}</view>
+        </view>
+        <view class="text-max-box">
+            <view class="text-min-box">
+                <view>责任单位:</view>
+                <view>{{itemData.deptName}}</view>
+            </view>
+            <view class="text-min-box">
+                <view>实验室负责人:</view>
+                <view>{{itemData.adminName}}</view>
+            </view>
+            <view class="text-min-box">
+                <view>联系方式:</view>
+                <view>{{itemData.adminPhone}}</view>
+            </view>
+            <view class="text-min-box">
+                <view>安全负责人:</view>
+                <view>{{itemData.safeUserName?itemData.safeUserName:'无'}}</view>
+            </view>
+            <view class="text-min-box">
+                <view>联系方式:</view>
+                <view>{{itemData.safeUserPhone?itemData.safeUserPhone:'无'}}</view>
+            </view>
+        </view>
+        <view class="safety-max-box" v-if="itemData.hazardCategory[0]||itemData.riskMeasure[0]||itemData.outfire[0]">
+            <view class="max-for-box" v-if="itemData.hazardCategory[0]">
+                <view class="title-box">主要危险类别</view>
+                <view class="for-box" v-for="(item,index1) in itemData.hazardCategory" :key="index1">
+                    <view v-for="(minItem,index2) in hazardCategory" :key="index2" v-if="minItem.dictValue == item">● {{minItem.dictLabel}}</view>
+                </view>
+            </view>
+            <view class="max-for-box" v-if="itemData.riskMeasure[0]">
+                <view class="title-box">风控防控措施</view>
+                <view class="for-box" v-for="(item,index1) in itemData.riskMeasure" :key="index1">
+                    <view v-for="(minItem,index2) in riskMeasure" :key="index2" v-if="minItem.dictValue == item">● {{minItem.dictLabel}}</view>
+                </view>
+            </view>
+            <view class="max-for-box" v-if="itemData.outfire[0]">
+                <view class="title-box">灭火要点</view>
+                <view class="for-box" v-for="(item,index1) in itemData.outfire" :key="index1">
+                    <view v-for="(minItem,index2) in extinguishingKeyPoints" :key="index2" v-if="minItem.dictValue == item">● {{minItem.dictLabel}}</view>
+                </view>
+            </view>
+        </view>
+        <view class="img-bottom-box" v-if="itemData.safeSigns[0]||itemData.qrCode">
+            <view class="title-box">安全警示标识</view>
+            <view class="for-box" :key="index1">
+                <img class="img-ojb" src="@/pages_manage/images/icon_aqxxp_jzxy.png" v-if="item == 'xiyan'" v-for="(item,index) in itemData.safeSigns" :key="index">
+                <img class="img-ojb" src="@/pages_manage/images/icon_aqxxp_jzys.png" v-if="item == 'yinshi'" v-for="(item,index) in itemData.safeSigns" :key="index">
+                <img class="img-ojb" src="@/pages_manage/images/icon_aqxxp_dxaq.png" v-if="item == 'anquan'" v-for="(item,index) in itemData.safeSigns" :key="index">
+                <img class="img-ojb" src="@/pages_manage/images/icon_aqxxp_gzf.png" v-if="item == 'gongzuofu'" v-for="(item,index) in itemData.safeSigns" :key="index">
+                <img class="img-ojb" src="@/pages_manage/images/icon_aqxxp_gbmc.png" v-if="item == 'menchuang'" v-for="(item,index) in itemData.safeSigns" :key="index">
+                <img class="img-ojb" src="@/pages_manage/images/icon_aqxxp_gbsd.png" v-if="item == 'shuidian'" v-for="(item,index) in itemData.safeSigns" :key="index">
+                <img v-if="itemData.qrCode" class="code-img" :src="itemData.qrCode">
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    import { getDicts } from '@/api/apiDemo/index.js'
+    export default {
+        data() {
+            return {
+                itemData:{},
+                text:"",
+                subject:[],
+                safetyWarning:[],
+                hazardCategory:[],
+                riskMeasure:[],
+                extinguishingKeyPoints:[]
+            }
+        },
+        onLoad(option) {
+            this.getSafetyWarning();
+            this.getHazardCategory();
+            this.getRiskMeasure();
+            this.getExtinguishingKeyPoints();
+            this.itemData = JSON.parse(decodeURIComponent(option.item));
+            if(this.itemData.safeUserName){
+                this.itemData.safeUserName = this.itemData.safeUserName.replace(/,/,'、');
+            }
+            if(this.itemData.safeUserPhone){
+                this.itemData.safeUserPhone = this.itemData.safeUserPhone.replace(/,/,'、');
+            }
+            if(this.itemData.hazardCategory){
+                this.itemData.hazardCategory = this.itemData.hazardCategory.split(',')
+            }
+            if(this.itemData.riskMeasure){
+                this.itemData.riskMeasure = this.itemData.riskMeasure.split(',')
+            }
+            if(this.itemData.safeSigns){
+                this.itemData.safeSigns = this.itemData.safeSigns.split(',')
+            }
+            if(this.itemData.outfire){
+                this.itemData.outfire = this.itemData.outfire.split(',')
+            }
+            this.subject = JSON.parse(decodeURIComponent(option.subject));
+        },
+        methods: {
+            async getSafetyWarning(){
+                const {data} = await getDicts('sys_safety_warning');
+                if(data.code == 200){
+                    this.safetyWarning = data.data;
+                }
+            },
+            async getHazardCategory(){
+                const {data} = await getDicts('sys_hazard_category');
+                if(data.code == 200){
+                    this.hazardCategory = data.data;
+                }
+            },
+            async getRiskMeasure(){
+                const {data} = await getDicts('sys_risk_measure');
+                if(data.code == 200){
+                    this.riskMeasure = data.data;
+                }
+            },
+            async getExtinguishingKeyPoints(){
+                const {data} = await getDicts('sys_extinguishing_key_points');
+                if(data.code == 200){
+                    this.extinguishingKeyPoints = data.data;
+                }
+            },
+        }
+    }
+</script>
+
+<style lang="stylus" scoped>
+    #safetyCard{
+        height:100%;
+        overflow-y:scroll;
+        overflow-x hidden
+        .top-name-max-box{
+            background #fff
+            overflow hidden
+            .name-box{
+                margin:27rpx 20rpx 0;
+                display:flex;
+                view:nth-child(1){
+                    background:#f95f5f;
+                    color:#fff;
+                    border-radius:6rpx;
+                    font-size:20rpx;
+                    padding:0 10rpx;
+					height:42rpx;
+					line-height:42rpx;
+                }
+                view:nth-child(2){
+                    color:#333;
+                    margin-left:20rpx;
+                    font-size:28rpx;
+                    height:30rpx;
+					line-height:42rpx;
+                    font-weight:700;
+                }
+            }
+            .address-box{
+                margin:22rpx 20rpx;
+                font-size:26rpx;
+            }
+        }
+        .text-max-box{
+            margin-top:20rpx;
+            background #fff
+            padding:8rpx 20rpx;
+            .text-min-box{
+                display:flex;
+                view{
+                    line-height:66rpx;
+                    height:66rpx;
+                    font-size:28rpx;
+                }
+                view:nth-child(1){
+                    width:220rpx;
+                    color:#333;
+                }
+                view:nth-child(2){
+                    flex:1;
+                    color:#999;
+                    text-align:right;
+                }
+            }
+        }
+        .safety-max-box{
+            margin-top:20rpx;
+            background #fff
+            padding:8rpx 20rpx;
+            .max-for-box{
+                .title-box{
+                    line-height:76rpx;
+                    font-size:28rpx;
+                    color:#333;
+                }
+                .for-box{
+                    line-height:48rpx;
+                    font-size:26rpx;
+                    color:#999;
+                }
+            }
+        }
+        .img-bottom-box{
+            margin-top:20rpx;
+            background #fff
+            padding:8rpx 20rpx 20rpx;
+            .title-box{
+                line-height:76rpx;
+                font-size:28rpx;
+                color:#333;
+            }
+            .for-box{
+                line-height:48rpx;
+                font-size:26rpx;
+                color:#999;
+                .img-ojb{
+                    display inline-block
+                    width:86rpx;
+                    height:114rpx;
+                    margin-right:20rpx;
+                }
+                .code-img{
+                    width:200rpx;
+                    height:200rpx;
+                    margin:20rpx auto 40rpx;
+                }
+            }
+        }
+    }
+</style>

+ 149 - 0
pages_manage/laboratory/word.vue

@@ -0,0 +1,149 @@
+<!-- 播放文字 -->
+<template>
+    <view id="word">
+		<view class="title-p">广播内容</view>
+        <textarea placeholder="请输入广播内容" v-model="text"></textarea>
+		<view class="radio-box">
+			<view class="radio-title">播报方式</view>
+			<radio-group @change="radioChange" class="radio-max-button">
+				<label class="radio-button" v-for="(item, index) in items" :key="item.value">
+					<radio :value="item.value" color="#007AFF" :checked="index === current" />{{item.name}}
+				</label>
+			</radio-group>
+		</view>
+        <view class="button-view" @click="voiceButton">确定</view>
+    </view>
+</template>
+
+<script>
+    import { voice } from '@/api/apiDemo/index.js'
+    export default {
+        data() {
+            return {
+                itemData:{},
+                text:"",
+				type:"",
+				items:[
+					{
+						name:"文字",
+						value:"1"
+					},
+					{
+						name:"音频",
+						value:"2"
+					},
+				]
+            }
+        },
+        onLoad(option) {
+            this.itemData = JSON.parse(decodeURIComponent(option.item));
+        },
+        methods: {
+			radioChange(e){
+				this.type = e.detail.value;
+			},
+            voiceButton(){
+                let self = this;
+				if(!this.text){
+					uni.showToast({
+						title: '请输入广播内容',
+						icon:"none",
+						mask:true,
+						duration: 2000
+					});
+					return
+				}
+				if(!this.type){
+					uni.showToast({
+						title: '请选择播报方式',
+						icon:"none",
+						mask:true,
+						duration: 2000
+					});
+					return
+				}
+                uni.showModal({
+                    // title: '确认要退出吗?',
+                    content: '确认播放吗?',
+                    cancelColor:"#999",
+                    confirmColor:"#0183FA",
+                    success: function (res) {
+                        if (res.confirm) {
+                            self.voice();
+                        } else if (res.cancel) {
+                        }
+                    }
+                });
+            },
+            //播放
+            async voice(){
+                let obj = {
+                    txt:this.text,
+					type:this.type
+                };
+                const {data} = await voice(this.itemData.id,obj);
+                if(data.code == 200){
+                    uni.showToast({
+                        title: '播放成功',
+                        icon:"none",
+                        mask:true,
+                        duration: 2000
+                    });
+                    setTimeout(function(){
+                        uni.navigateBack();
+                    },2000);
+                }
+            },
+        }
+    }
+</script>
+
+<style lang="stylus" scoped>
+    #word{
+        height:100%;
+        background #fff
+        overflow hidden
+		.title-p{
+            font-size:28rpx;
+			margin:20rpx 0 20rpx 20rpx;
+			line-height:60rpx;
+		}
+        textarea{
+            width:670rpx;
+            height:200rpx;
+            margin:20rpx 20rpx 0;
+            font-size:26rpx;
+            border: 1rpx solid #E0E0E0;
+            border-radius:10rpx;
+            padding:20rpx;
+        }
+		.radio-box{
+            font-size:26rpx;
+			.radio-title{
+				font-size:28rpx;
+				margin:20rpx 0 20rpx 20rpx;
+				line-height:60rpx;
+			}
+			.radio-max-button{
+				display flex
+				margin:0 100rpx;
+				.radio-button{
+					flex:1;
+					margin-left:75rpx;
+					font-size:26rpx;
+				}
+			}
+		}
+        .button-view{
+            width: 600rpx;
+            height: 80rpx;
+            background: #0183FA;
+            border-radius: 20rpx;
+            font-size:30rpx;
+            line-height:80rpx;
+            text-align center;
+            color: #fff;
+            margin:90rpx auto;
+        }
+    }
+</style>

+ 297 - 0
pages_manage/plan/planInfo.vue

@@ -0,0 +1,297 @@
+<template>
+    <view id="planInfo">
+        <view class="planInfo-big-box">
+            <view class="title-box">
+				<view :style="'background:'+itemData.subDiyVo.fiedColor+';'">{{itemData.subDiyVo.levelName}}</view>
+                <view>{{itemData.name}}</view>
+            </view>
+            <view class="address-box"><span>{{itemData.subDiyVo.typeName}}</span>{{itemData.deptName}}</view>
+            <view class="address-box-two">
+                <img src="@/images/basicsModules/icon_14.png">
+                <view>{{itemData.subAddrrStr}}</view>
+            </view>
+        </view>
+        <view class="planInfo-big-box">
+            <view class="flex-box">
+                <view>预案名称</view>
+                <view>{{itemData.riskPlanAbnormalLogVo.riskPlanName}}</view>
+            </view>
+            <view class="flex-box">
+                <view>执行时间</view>
+                <view>{{itemData.riskPlanAbnormalLogVo.createTime}}</view>
+            </view>
+        </view>
+        <view class="planInfo-big-box">
+            <view class="title-max-box">
+                <view class="left-view"></view>
+                <view class="right-view">监测预警</view>
+            </view>
+            <view class="flex-box-one" v-for="(item,index) in itemData.riskPlanAbnormalLogVo.sensorJson" :key="index">
+                <view>{{item.describe}}</view>
+                <view class="flex-box-colorA">{{item.value}}{{item.unit}}</view>
+            </view>
+        </view>
+        <view class="planInfo-big-box">
+            <view class="title-max-box">
+                <view class="left-view"></view>
+                <view class="right-view">执行操作</view>
+            </view>
+            <view class="flex-box-two" v-for="(item,index) in itemData.hardwareOpreteActList" :key="index">
+                <view class="top-text-box">
+                    <view>{{item.hardWareName}}</view>
+                    <view v-if="item.hardWareName!='一键灭火'" :class="item.opreteFlag?'flex-box-colorC':'flex-box-colorA'">{{item.opreteFlag?'执行成功':'执行失败'}}</view>
+                    <view v-if="item.hardWareName=='一键灭火'" :class="item.opreteFlag?'flex-box-colorC':'flex-box-colorA'">{{item.opreteFlag?'自动执行':'手动执行'}}</view>
+                </view>
+                <view v-if="item.opreteFlag && item.hardWareName!='一键灭火'" class="bottom-text-box">{{item.hardWareOpreteAct}}</view>
+            </view>
+            <view class="flex-box-two" v-for="(item,index) in itemData.voiceOpreteActList" :key="index">
+                <view class="top-text-box">
+                    <view>{{item.hardWareName}}</view>
+                    <view :class="item.opreteFlag?'flex-box-colorC':'flex-box-colorA'">{{item.opreteFlag?'执行成功':'执行失败'}}</view>
+                </view>
+                <view v-if="item.opreteFlag" class="bottom-text-box">{{item.hardWareOpreteAct}}</view>
+            </view>
+            <view class="flex-box-one" v-for="(item,index) in itemData.phoneOpreteActList" :key="index">
+                <view>{{item.hardWareName}}</view>
+                <view :class="item.opreteFlag?'flex-box-colorC':'flex-box-colorA'">{{item.opreteFlag?'执行成功':'执行失败'}}</view>
+            </view>
+            <view class="flex-box-two" v-for="(item,index) in itemData.messageOpreteActList" :key="index">
+                <view class="top-text-box">
+                    <view>{{item.hardWareName}}</view>
+                    <view :class="item.opreteFlag?'flex-box-colorC':'flex-box-colorA'">{{item.opreteFlag?'执行成功':'执行失败'}}</view>
+                </view>
+                <view v-if="item.opreteFlag" class="bottom-text-box">{{item.hardWareOpreteAct}}</view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    import { laboratoryInfo } from '@/api/apiDemo/index.js'
+    export default {
+        name: "planInfo",
+        data() {
+            return {
+                itemData:{},
+            }
+        },
+
+        onLoad(option){
+            this.itemData = JSON.parse(decodeURIComponent(option.item));
+            this.itemData.riskPlanAbnormalLogVo.sensorJson = JSON.parse(this.itemData.riskPlanAbnormalLogVo.sensorJson);
+        },
+        onShow(){
+
+        },
+        methods:{
+            async laboratoryInfo(){
+                const {data} = await laboratoryInfo(this.itemData.subDiyVo.id);
+                if(data.code == 200){
+                    let obj = data.data[0];
+                    obj.subClassVO = this.itemData.subClassVO;
+                    obj.name = this.itemData.name;
+                    obj.subTypeLable = this.itemData.subTypeLable;
+                    obj.deptName = this.itemData.deptName;
+                    obj.subAddrrStr = this.itemData.subAddrrStr;
+                    uni.navigateTo({
+                        url: '/pages_manage/workbench/laboratory/laboratoryInfo?item='+encodeURIComponent(JSON.stringify(obj))
+                    });
+                }
+            },
+        }
+    }
+</script>
+
+<style lang="stylus" scoped>
+    #planInfo{
+        .planInfo-big-box{
+            background #fff
+            overflow: hidden
+            margin-bottom:20rpx;
+            .title-max-box{
+                display flex
+                height:80rpx;
+                border-bottom:1rpx solid #E0E0E0;
+                .left-view{
+                    width: 4rpx;
+                    height: 34rpx;
+                    margin:25rpx 24rpx 0 20rpx;
+                    background:#0D97EB;
+                }
+                .right-view{
+                    line-height:80rpx;
+                    font-size: 30rpx;
+                    color: #333333;
+                    flex:1;
+                }
+                .click-view{
+                    display flex
+                    padding:0 20rpx;
+                    view{
+                        line-height:80rpx;
+                        font-size: 24rpx;
+                        color: #666666;
+                    }
+                    img{
+                        width:20rpx;
+                        height:10rpx;
+                        margin:35rpx 0 0 20rpx;
+                    }
+                }
+            }
+            .title-box{
+                margin:20rpx 20rpx 0;
+                display flex
+                view:nth-child(1){
+                    height:42rpx;
+                    line-height:42rpx;
+                    font-size:20rpx;
+                    border-radius:10rpx;
+                    padding:0 10rpx;
+                    color:#fff;
+                    margin-right:20rpx;
+                }
+                view:nth-child(2){
+                    line-height:42rpx;
+                    font-size:30rpx;
+                    color:#333;
+                    max-width:600rpx;
+                    flex:1;
+                }
+                img{
+                    width:12rpx;
+                    height:20rpx;
+                    margin-top:11rpx;
+                }
+                .colorA{
+                    background:#aa2315;
+                }
+                .colorB{
+                    background:#ff9b09;
+                }
+                .colorC{
+                    background:#3ea3e9;
+                }
+                .colorD{
+                    background:#3ea34c;
+                }
+
+            }
+            .address-box{
+                margin:20rpx 20rpx;
+                font-size:26rpx;
+                color:#999999;
+                span{
+                    margin-right:60rpx;
+                }
+            }
+            .address-box-two{
+                display flex
+                margin:0 20rpx 20rpx 20rpx;
+                img{
+                    width:28rpx;
+                    height:30rpx;
+                    margin-right:18rpx;
+                }
+                view{
+                    line-height:30rpx;
+                    font-size:24rpx;
+                    color:#999999;
+                }
+            }
+            .button-box{
+                line-height 100rpx
+                font-size:30rpx;
+                color:#0183FA;
+                margin:0 20rpx;
+                border-top:1rpx dashed #e0e0e0;
+                text-align center;
+            }
+            .flex-box:nth-child(1){
+                border:none!important;
+            }
+            .flex-box{
+                display flex;
+                height:80rpx;
+                margin:0 20rpx;
+                border-top:1rpx solid #e0e0e0;
+                view:nth-child(1){
+                    line-height:80rpx;
+                    font-size:28rpx;
+                    color:#333;
+                }
+                view:nth-child(2){
+                    flex:1;
+                    line-height:80rpx;
+                    font-size:24rpx;
+                    color:#999;
+                    text-align right
+                }
+            }
+            .flex-box-one:nth-child(2){
+                border:none!important;
+            }
+            .flex-box-one{
+                display flex;
+                /*min-height:80rpx;*/
+                margin:0 20rpx;
+                border-top:1rpx solid #e0e0e0;
+                view:nth-child(1){
+                    line-height:80rpx;
+                    font-size:28rpx;
+                    color:#333;
+                }
+                view:nth-child(2){
+                    flex:1;
+                    line-height:80rpx;
+                    font-size:28rpx;
+                    color:#999;
+                    text-align right
+                }
+            }
+            .flex-box-two:nth-child(2){
+                border:none!important;
+            }
+            .flex-box-two{
+                /*min-height:120rpx;*/
+                margin:0 20rpx;
+                border-top:1rpx solid #e0e0e0;
+                .top-text-box{
+                    height:74rpx;
+                    display flex
+                    view:nth-child(1){
+                        line-height:74rpx;
+                        font-size:28rpx;
+                        color:#333;
+                    }
+                    view:nth-child(2){
+                        flex:1;
+                        line-height:80rpx;
+                        font-size:28rpx;
+                        color:#999;
+                        text-align right
+                    }
+                }
+                .bottom-text-box{
+                    /*min-height:40rpx;*/
+                    padding-bottom:25rpx;
+                    font-size:24rpx;
+                    line-height:24rpx;
+                    color:#999;
+                }
+            }
+            .flex-box-colorA{
+                color:#FF4552!important;
+            }
+            .flex-box-colorB{
+                color:#FFA518!important;
+            }
+            .flex-box-colorC{
+                color:#0D97EB!important;
+            }
+            .flex-box-colorD{
+                color:#35D850!important;
+            }
+        }
+    }
+</style>

+ 555 - 0
pages_manage/plan/planList.vue

@@ -0,0 +1,555 @@
+<template>
+    <view id="planList">
+        <view class="top-picker-max-box">
+            <view class="top-picker-box">
+                <picker @change="facultyChange" :value="facultyIndex" :range="facultyArray">
+                    <view class="picker-view">
+                        <view>{{!facultyIndex?'学院':facultyArray[facultyIndex]}}</view>
+                        <img class="picker-img" src="@/images/basicsModules/icon_06.png" alt="">
+                    </view>
+                </picker>
+            </view>
+            <view class="top-picker-box">
+                <picker @change="subjectChange" :value="subjectIndex" :range="subjectArray">
+                    <view class="picker-view">
+                        <view>{{!subjectIndex?'分类':subjectArray[subjectIndex]}}</view>
+                        <img class="picker-img" src="@/images/basicsModules/icon_06.png" alt="">
+                    </view>
+                </picker>
+            </view>
+            <view class="top-picker-box">
+                <picker @change="levelChange" :value="levelIndex" :range="levelArray">
+                    <view class="picker-view">
+                        <view>{{!levelIndex?'分级':levelArray[levelIndex]}}</view>
+                        <img class="picker-img" src="@/images/basicsModules/icon_06.png" alt="">
+                    </view>
+                </picker>
+            </view>
+        </view>
+        <view class="time-max-box">
+            <view class="title-box">风险时段选择:</view>
+            <view class="left-time-box">
+                <picker mode="date" :value="date" :start="startDate" :end="endDate" @change="startTimeChange">
+                    <view class="left-time-min-box">{{startTime}}</view>
+                </picker>
+            </view>
+            <view class="center-box">~</view>
+            <view class="right-time-box">
+                <picker mode="date" :value="date" :start="startDate" :end="endDate" @change="endTimeChange">
+                    <view class="left-time-min-box">{{endTime}}</view>
+                </picker>
+            </view>
+        </view>
+        <scroll-view scroll-y @scrolltolower="scrollGet" class="for-max-box">
+            <view class="for-box" v-for="(item,index) in infoList" :key="index" @click="getSubByRiskPlanDetail(item)">
+                <view class="title-box">
+					<view :style="'background:'+item.subDiyVo.fiedColor+';'">{{item.subDiyVo.levelName}}</view>
+                    <view>{{item.subDiyVo.name}}</view>
+                </view>
+                <view class="address-box"><span>{{item.subDiyVo.typeName}}</span>{{item.subDiyVo.deptName}}</view>
+                <view class="address-box-two">
+                    <img src="@/images/basicsModules/icon_14.png">
+                    <view>{{item.subDiyVo.subAddrrStr}}</view>
+                </view>
+                <view class="plan-name-box">
+                    <view class="plan-left-box">
+                        <view>{{item.riskPlanAbnormalLogVo.riskPlanName}}</view>
+                        <view>执行时间:{{item.riskPlanAbnormalLogVo.createTime}}</view>
+                    </view>
+                    <img src="@/images/basicsModules/icon_04.png">
+                </view>
+            </view>
+            <img class="null-img" v-if="!infoList[0]" src="@/images/basicsModules/null-data-1.png">
+        </scroll-view>
+    </view>
+</template>
+
+<script>
+    import { listDepartments,subject_class,getSubByRiskPlan,getSubByRiskPlanDetail,classifiedListAll } from '@/api/apiDemo/index.js'
+    export default {
+        name: "planList",
+        computed: {
+            startDate() {
+                return this.getDate('start');
+            },
+            endDate() {
+                return this.getDate('end');
+            }
+        },
+        data() {
+            const currentDate = this.getDate({
+                format: true
+            })
+            return {
+                infoList:[],
+                //列表请求参数
+                getData:{
+                    page:1,
+                    pageSize:20,
+                    getType:true,
+                    nullDataType:true,
+                },
+                //院系选择器数据
+                facultyList:[],
+                facultyArray:[],
+                facultyIndex:0,
+                //学科选择器数据
+                subjectList:[],
+                subjectArray:[],
+                subjectIndex:0,
+                //级别选择器数据
+                levelList:[],
+                levelArray:[],
+                levelIndex:0,
+                //时间选择器
+                startTime: "开始时间",
+                startTimestamp: 0,
+                endTime: "结束时间",
+                endTimestamp: 0,
+            }
+        },
+        onLoad(){
+            this.listDepartments();
+            this.subject_class();
+        },
+        onShow(){
+			this.classifiedListAll();
+            this.clearData();
+            this.getList();
+        },
+        methods:{
+            async getSubByRiskPlanDetail(item){
+                const {data} = await getSubByRiskPlanDetail(item.riskPlanAbnormalLogVo.id);
+                if(data.code == 200){
+                    let obj = data.rows[0];
+                    obj.subClassVO = item.subDiyVo.subClassVO;
+                    obj.name = item.subDiyVo.name;
+                    obj.subTypeLable = item.subDiyVo.subTypeLable;
+                    obj.deptName = item.subDiyVo.deptName;
+                    obj.subAddrrStr = item.subDiyVo.subAddrrStr;
+                    uni.navigateTo({
+                        url: '/pages_manage/workbench/plan/planInfo?item='+encodeURIComponent(JSON.stringify(obj))
+                    });
+                }
+            },
+            //去详情页
+            goPlanInfo(item){
+                uni.navigateTo({
+                    url: '/pages_manage/workbench/plan/planInfo',//预案执行记录
+                });
+            },
+            //滚动选择器
+            facultyChange: function(e) {
+                if(this.facultyArray[0]){
+                    this.facultyIndex = parseInt(e.target.value);
+                    console.log("e.target.value",e.target.value)
+                    console.log("this.facultyIndex",this.facultyIndex)
+                    this.clearData();
+                    this.getList();
+                }
+            },
+            subjectChange: function(e) {
+                if(this.subjectArray[0]){
+                    this.subjectIndex = parseInt(e.target.value);
+                    this.clearData();
+                    this.getList();
+                }
+            },
+            levelChange: function(e) {
+                if(this.levelArray[0]){
+                    this.levelIndex = parseInt(e.target.value);
+                    this.clearData();
+                    this.getList();
+                }
+            },
+            //时间选择器
+            startTimeChange: function(e) {
+                let timestamp = new Date(e.target.value).getTime();
+                if(this.endTimestamp == 0){
+                    this.startTime = e.target.value
+                    this.startTimestamp = new Date(e.target.value).getTime();
+                    this.clearData();
+                    this.getList();
+                }else{
+                    if(timestamp<=this.endTimestamp){
+                        this.startTime = e.target.value
+                        this.startTimestamp = new Date(e.target.value).getTime();
+                        this.clearData();
+                        this.getList();
+                    }else{
+                        uni.showToast({
+                            title: '开始时间不能大于结束时间',
+                            icon:"none",
+                            mask:true,
+                            duration: 2000
+                        });
+                    }
+                }
+            },
+            endTimeChange: function(e) {
+                let timestamp = new Date(e.target.value).getTime();
+                if(this.startTimestamp == 0){
+                    this.endTime = e.target.value
+                    this.endTimestamp = new Date(e.target.value).getTime();
+                    this.clearData();
+                    this.getList();
+                }else{
+                    if(timestamp>=this.startTimestamp){
+                        this.endTime = e.target.value
+                        this.endTimestamp = new Date(e.target.value).getTime();
+                        this.clearData();
+                        this.getList();
+                    }else{
+                        uni.showToast({
+                            title: '结束时间不能小于开始时间',
+                            icon:"none",
+                            mask:true,
+                            duration: 2000
+                        });
+                    }
+                }
+            },
+            getDate(type) {
+                const date = new Date();
+                let year = date.getFullYear();
+                let month = date.getMonth() + 1;
+                let day = date.getDate();
+
+                if (type === 'start') {
+                    year = year - 60;
+                } else if (type === 'end') {
+                    year = year + 2;
+                }
+                month = month > 9 ? month : '0' + month;
+                day = day > 9 ? day : '0' + day;
+                return `${year}-${month}-${day}`;
+            },
+            //获取院系
+            async listDepartments(){
+                const {data} = await listDepartments();
+                if(data.code == 200){
+                    let list = [];
+                    for(let i=0;i<data.data.length;i++){
+                        list.push(data.data[i].deptName)
+                    }
+                    this.facultyArray = list;
+                    list.unshift('全部院系');
+                    this.facultyList = data.data;
+                    this.facultyList.unshift({deptName:"全部院系", deptId:""})
+                }
+            },
+            //获取级别
+            async classifiedListAll(){
+                const {data} = await classifiedListAll();
+                if(data.code == 200){
+					let list = [];
+					let nameList = ['全部'];
+					list.push({
+						dictLabel:"全部",
+						dictValue:""
+					})
+					for(let i=0;i<data.data.length;i++){
+						let obj = {
+							dictLabel:data.data[i].classifiedName,
+							dictValue:data.data[i].id
+						}
+						list.push(obj);
+						nameList.push(data.data[i].classifiedName);
+					}
+					this.levelList = list;
+					this.levelArray = nameList;
+                }
+            },
+            //获取学科字典
+            async subject_class(){
+                const {data} = await subject_class();
+                if(data.code == 200){
+                    let list = [];
+                    for(let i=0;i<data.data.length;i++){
+                        list.push(data.data[i].dictLabel)
+                    }
+                    this.subjectArray = list;
+                    list.unshift('全部分类');
+                    this.subjectList = data.data;
+                    this.subjectList.unshift({dictLabel:"全部分类", dictValue:""})
+                }
+            },
+            //清除
+            clearData(){
+                this.infoList = [];
+                this.getData.page = 1;
+                this.getData.getType = true;
+                this.getData.nullDataType = true;
+            },
+            //滚动事件
+            scrollGet(){
+                if(this.getData.getType){
+                    this.getData.page += 1;
+                    this.getList();
+                }
+            },
+            //获取列表数据
+            async getList(){
+                let self = this;
+                let obj = {
+                    pageNum:this.getData.page,
+                    pageSize:this.getData.pageSize,
+                    deptId:"",
+                    subDept:"",
+                    typeId:"",
+                    startDate:"",
+                    endDate:""
+                };
+                if(this.facultyList[0]){
+                    obj.deptId = this.facultyList[this.facultyIndex].deptId;
+                }
+                if(this.subjectList[0]){
+                    obj.subDept = this.subjectList[this.subjectIndex].dictValue;
+                }
+                if(this.levelList[0]){
+                    obj.typeId = this.levelList[this.levelIndex].dictValue;
+                }
+                if(this.startTime != '开始时间'){
+                    obj.startDate = this.startTime;
+                }
+                if(this.endTime != '结束时间'){
+                    obj.endDate = this.endTime;
+                }
+                const {data} = await getSubByRiskPlan(obj);
+                if(data.code==200){
+                    if(self.page==1){
+                        if(data.rows.length > 0 && data.rows.length == self.getData.pageSize){
+                            self.infoList = data.rows;
+                        }else if(data.rows.length > 0 && data.rows.length != self.getData.pageSize){
+                            self.infoList = data.rows;
+                            self.getData.getType = false;
+                            self.getData.nullDataType = true;
+                        }else{
+                            self.getData.getType = false;
+                            self.getData.nullDataType = true;
+                        }
+                    }else{
+                        if(data.rows.length > 0 && data.rows.length == self.getData.pageSize){
+                            self.infoList = self.infoList.concat(data.rows)
+                        }else if(data.rows.length > 0 && data.rows.length != self.getData.pageSize){
+                            self.infoList = self.infoList.concat(data.rows);
+                            self.getData.getType = false;
+                            self.getData.nullDataType = true;
+                        }else{
+                            self.getData.getType = false;
+                            self.getData.nullDataType = true;
+                        }
+                    }
+                }
+            },
+        },
+    }
+</script>
+
+<style lang="stylus" scoped>
+    #planList{
+        height:100%;
+        flex:1;
+        display flex
+        flex-direction column
+        overflow: hidden
+        .top-picker-max-box{
+            display:flex;
+            padding:0 20rpx;
+            background #fff
+            border-bottom:1rpx solid #E0E0E0;
+            .top-picker-box{
+                line-height:80rpx;
+                height:80rpx;
+                .picker-view{
+                    display flex
+                    view{
+                        display:block;
+                        overflow:hidden;
+                        text-overflow:ellipsis;
+                        white-space:nowrap;
+                        font-size:28rpx;
+                    }
+                    .picker-img{
+                        width:24rpx;
+                        height:13rpx;
+                        margin-top:36rpx;
+                        margin-left:13rpx;
+                    }
+                }
+            }
+            .top-picker-box:nth-child(1){
+                text-align left
+                width:320rpx;
+                .picker-view{
+                    view{
+                        max-width:260rpx;
+                    }
+                }
+            }
+            .top-picker-box:nth-child(2){
+                text-align left
+                width:215rpx;
+                .picker-view{
+                    view{
+                        max-width:156rpx;
+                    }
+                }
+            }
+            .top-picker-box:nth-child(3){
+                text-align right
+                width:195rpx;
+                .picker-view{
+                    view{
+                        flex:1;
+
+                    }
+                }
+            }
+        }
+        .time-max-box{
+            display flex;
+            height:80rpx;
+            .title-box{
+                width: 200rpx;
+                font-size: 28rpx;
+                color: #333333;
+                line-height: 80rpx;
+                margin:0 0 0 20rpx;
+            }
+            .left-time-box{
+                .left-time-min-box{
+                    padding:0 15rpx;
+                    width:170rpx;
+                    height:50rpx;
+                    border:1rpx solid #ccc;
+                    background #fff
+                    margin:15rpx 10rpx 0 0;
+                    /*text-align center*/
+                    line-height:50rpx;
+                    font-size:22rpx;
+                    color:#999;
+                }
+            }
+            .center-box{
+                line-height 80rpx
+                color:#999;
+            }
+            .right-time-box{
+                .left-time-min-box{
+                    padding:0 15rpx;
+                    width:170rpx;
+                    height:50rpx;
+                    border:1rpx solid #ccc;
+                    background #fff
+                    margin:15rpx 0 0 10rpx;
+                    /*text-align center*/
+                    line-height:50rpx;
+                    font-size:22rpx;
+                    color:#999;
+                }
+            }
+        }
+        .for-max-box{
+            flex:1;
+            overflow-y scroll
+            .for-box{
+                background #fff
+                margin-bottom:20rpx;
+                overflow: hidden
+                .title-box{
+                    margin:20rpx 20rpx 0;
+                    display flex
+                    view:nth-child(1){
+                        height:42rpx;
+                        line-height:42rpx;
+                        font-size:20rpx;
+                        border-radius:10rpx;
+                        padding:0 10rpx;
+                        color:#fff;
+                        margin-right:20rpx;
+                    }
+                    view:nth-child(2){
+                        line-height:42rpx;
+                        font-size:30rpx;
+                        color:#333;
+                        max-width:600rpx;
+                        flex:1;
+                    }
+                    img{
+                        width:12rpx;
+                        height:20rpx;
+                        margin-top:11rpx;
+                    }
+                    .colorA{
+                        background:#aa2315;
+                    }
+                    .colorB{
+                        background:#ff9b09;
+                    }
+                    .colorC{
+                        background:#3ea3e9;
+                    }
+                    .colorD{
+                        background:#3ea34c;
+                    }
+
+                }
+                .address-box{
+                    margin:20rpx 20rpx;
+                    font-size:26rpx;
+                    color:#999999;
+                    span{
+                        margin-right:60rpx;
+                    }
+                }
+                .address-box-two{
+                    display flex
+                    margin:0 20rpx 20rpx 20rpx;
+                    img{
+                        width:28rpx;
+                        height:30rpx;
+                        margin-right:18rpx;
+                    }
+                    view{
+                        line-height:30rpx;
+                        font-size:24rpx;
+                        color:#999999;
+                    }
+                }
+                .plan-name-box{
+                    display flex
+                    border-top:1px solid #e0e0e0;
+                    margin:0 20rpx;
+                    .plan-left-box{
+                        flex:1;
+                        height:111rpx;
+                        view:nth-child(1){
+                            font-size:30rpx;
+                            line-height:30rpx;
+                            margin-top:21rpx;
+                            color:#333;
+                        }
+                        view:nth-child(2){
+                            font-size:24rpx;
+                            line-height:24rpx;
+                            margin-top:18rpx;
+                            color:#999;
+                        }
+                    }
+                    img{
+                        width:13rpx;
+                        height:24rpx;
+                        margin:45rpx 0 0 0;
+                    }
+                }
+            }
+            .null-img{
+                display block
+                width:276rpx;
+                height:321rpx;
+                margin:100rpx 0 0 274rpx;
+            }
+        }
+    }
+</style>

+ 3 - 3
utils/homeConfig.js

@@ -28,7 +28,7 @@ let routeDataList = [
 		name: "准入审核",
 		limits:"",
 		route: "accessQualification",
-		routeUrl: "/page_basics/accessQualification/accessQualification",
+		routeUrl: "/pages_manage/accessQualification/accessQualification",
 		img: require('@/images/basicsModules/icon_sy_zrsq.png'),
 		buttonType:"page",
 	},
@@ -83,7 +83,7 @@ let routeDataList = [
 	{
 		name: "分级管控",
 		limits:"",
-		route: "grading",
+		route: "gradingControl",
 		routeUrl: "/pages_manage/gradingControl/gradingControl",
 		img: require('@/images/basicsModules/icon_sy_fjgk.png'),
 		buttonType:"page",
@@ -92,7 +92,7 @@ let routeDataList = [
 	{
 		name: "积分兑换",
 		limits:"",
-		route: "saoCode",
+		route: "integralExchange",
 		routeUrl: "",
 		img: require('@/images/basicsModules/btn_wd_jfdh.png'),
 		buttonType:"button",

+ 14 - 14
utils/mineConfig.js

@@ -1,25 +1,25 @@
 let routeDataList = [
 	{
 		name: "预警记录",
-		limits:"7",
-		route: "mineAlarm",
-		routeUrl: "/pages/earlyWarningManage/earlyWarningList",
+		limits:"",
+		route: "mineWarningRecording",
+		routeUrl: "/pages_basics/earlyWarningManage/earlyWarningList",
 		img: require('@/images/basicsModules/icon_003.png'),
 		buttonType:"page",
 	},
 	{
 		name: "我的实验室",
-		limits:"8",
+		limits:"",
 		route: "laboratory",
-		routeUrl: "/pages_manage/workbench/laboratory/meLaboratory",
+		routeUrl: "/pages_manage/laboratory/meLaboratory",
 		img: require('@/images/basicsModules/icon_002.png'),
 		buttonType:"page",
 	},
 	{
 		name: "预案执行记录",
-		limits:"9",
-		route: "record",
-		routeUrl: "/pages_manage/workbench/plan/planList",
+		limits:"",
+		route: "PlanExecuteRecord",
+		routeUrl: "/pages_manage/plan/planList",
 		img: require('@/images/basicsModules/icon_004.png'),
 		buttonType:"page",
 	},
@@ -27,7 +27,7 @@ let routeDataList = [
 		name: "身份验证",
 		limits:"",
 		route: "faceImage",
-		routeUrl: "/pages/faceImage",
+		routeUrl: "/pages_basics/faceImage",
 		img: require('@/images/basicsModules/icon_001.png'),
 		buttonType:"page",
 	},
@@ -35,17 +35,17 @@ let routeDataList = [
 		name: "电子签名",
 		limits:"",
 		route: "signature",
-		routeUrl: '',
+		routeUrl:  "/pages_basics/signature/signature",
 		img: require('@/images/basicsModules/icon_wd_dzqm.png'),
-		buttonType:"button",
+		buttonType:"page",
 	},
 	{
 		name: "指纹",
 		limits:"",
 		route: "fingerprint",
-		routeUrl: "",
+		routeUrl:"/pages_basics/fingerprint",
 		img: require('@/images/basicsModules/icon_wd_zw.png'),
-		buttonType:"button",
+		buttonType:"page",
 	},
 ];
 
@@ -77,4 +77,4 @@ export function getMineConfig(data) {
 		}
 	}
   return mineList;
-}
+}