Parcourir la source

安全检查迁移

dedsudiyu il y a 3 semaines
Parent
commit
4f57652b70
54 fichiers modifiés avec 13385 ajouts et 136 suppressions
  1. 36 13
      .idea/workspace.xml
  2. 3 3
      App.vue
  3. 1 0
      api/request/config.js
  4. 101 5
      pages.json
  5. 4 6
      pages/component/topWarn.vue
  6. 1 1
      pages/views/dataBoard/daYiReservation.vue
  7. 1 1
      pages/views/dataBoard/labPage.vue
  8. 1 1
      pages/views/dataBoard/resourceReservation.vue
  9. 1 1
      pages/views/dataBoard/securityHidden.vue
  10. 2 2
      pages/views/dataBoard/warningDispose.vue
  11. 5 5
      pages/views/demo/mqttDemo.vue
  12. 1 0
      pages/views/home/home.vue
  13. 1 1
      pages/views/information/information.vue
  14. 2 2
      pages/views/information/notPassInfo.vue
  15. 79 0
      pages/views/pageScanCodePage.vue
  16. 1 1
      pages/views/pages_patrolInspector/chemicalCatalogue.vue
  17. 1 1
      pages/views/pupilPage/pupilMine.vue
  18. 1 1
      pages/views/saoCode/saoCode.vue
  19. 3 9
      pages/views/teacherPage/teacherHome.vue
  20. 1 1
      pages/views/teacherPage/teacherMine.vue
  21. 1 1
      pages_basics/views/avatar.vue
  22. 15 15
      pages_basics/views/earlyWarningManage/videoMonitoring.vue
  23. 2 2
      pages_basics/views/faceImage.vue
  24. 7 7
      pages_basics/views/gradingControl/gradingControlAdd.vue
  25. 7 7
      pages_basics/views/gradingControl/gradingControlDetail.vue
  26. 2 2
      pages_basics/views/photoInspection.vue
  27. 3 3
      pages_basics/views/signature/signature.vue
  28. 3 3
      pages_manage/views/accessQualification/accessQualificationInfo.vue
  29. 10 7
      pages_manage/views/emergencyEvacuationBig.vue
  30. 1 1
      pages_manage/views/emergencyEvacuationBigFullScreen.vue
  31. 1 0
      pages_manage/views/laboratory/voiceBroadcast.vue
  32. 740 0
      pages_safetyCheck/component/checkItemModule.vue
  33. 0 27
      pages_safetyCheck/views/demo/index.vue
  34. 1208 0
      pages_safetyCheck/views/inspectManage/conductInspections.vue
  35. 207 0
      pages_safetyCheck/views/inspectManage/hiddenDangerRecord.vue
  36. 996 0
      pages_safetyCheck/views/inspectManage/inspectAdd.vue
  37. 1515 0
      pages_safetyCheck/views/inspectManage/inspectList.vue
  38. 1075 0
      pages_safetyCheck/views/itemsManage/hiddenDangerItems.vue
  39. 1065 0
      pages_safetyCheck/views/itemsManage/hiddenDangerItemsDetail.vue
  40. 225 0
      pages_safetyCheck/views/itemsManage/hiddenDangerItemsSearch.vue
  41. 1011 0
      pages_safetyCheck/views/itemsManage/hiddenDangerRectification.vue
  42. 248 0
      pages_safetyCheck/views/materialAttachments.vue
  43. 210 0
      pages_safetyCheck/views/newScanCodeCheck.vue
  44. 357 0
      pages_safetyCheck/views/planDetail.vue
  45. 737 0
      pages_safetyCheck/views/safetyCheck.vue
  46. 217 0
      pages_safetyCheck/views/scanCodeCheck.vue
  47. 672 0
      pages_safetyCheck/views/snapshotManage/laboratorySearch.vue
  48. 376 0
      pages_safetyCheck/views/snapshotManage/snapshotDetail.vue
  49. 519 0
      pages_safetyCheck/views/snapshotManage/snapshotItems.vue
  50. 999 0
      pages_safetyCheck/views/snapshotManage/snapshotList.vue
  51. 625 0
      pages_safetyCheck/views/snapshotManage/snapshotRectification.vue
  52. 2 2
      pages_student/views/accessApplication/applicationDetails.vue
  53. 27 4
      pages_student/views/accessApplication/newApplication.vue
  54. 56 1
      utils/scanTheCode.js

+ 36 - 13
.idea/workspace.xml

@@ -1,7 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="ChangeListManager">
-    <list default="true" id="5264e573-3c9e-4faf-aaf1-757af63c3042" name="Default Changelist" comment="" />
+    <list default="true" id="5264e573-3c9e-4faf-aaf1-757af63c3042" name="Default Changelist" comment="">
+      <change beforePath="$PROJECT_DIR$/api/request/config.js" beforeDir="false" afterPath="$PROJECT_DIR$/api/request/config.js" afterDir="false" />
+    </list>
     <ignored path="$PROJECT_DIR$/.tmp/" />
     <ignored path="$PROJECT_DIR$/temp/" />
     <ignored path="$PROJECT_DIR$/tmp/" />
@@ -15,9 +17,10 @@
     <session id="672935100">
       <usages-collector id="statistics.lifecycle.project">
         <counts>
-          <entry key="project.closed" value="1" />
+          <entry key="project.closed" value="2" />
+          <entry key="project.open.time.0" value="1" />
           <entry key="project.open.time.1" value="1" />
-          <entry key="project.opened" value="1" />
+          <entry key="project.opened" value="2" />
         </counts>
       </usages-collector>
     </session>
@@ -46,9 +49,10 @@
     </packageJsonPaths>
   </component>
   <component name="ProjectFrameBounds" extendedState="6">
-    <option name="x" value="-8" />
-    <option name="width" value="1935" />
-    <option name="height" value="1047" />
+    <option name="x" value="1912" />
+    <option name="y" value="-8" />
+    <option name="width" value="1936" />
+    <option name="height" value="1056" />
   </component>
   <component name="ProjectView">
     <navigator proportions="" version="1">
@@ -63,6 +67,24 @@
               <item name="v3-H5" type="b2602c69:ProjectViewProjectNode" />
               <item name="v3-H5" type="462c0819:PsiDirectoryNode" />
             </path>
+            <path>
+              <item name="v3-H5" type="b2602c69:ProjectViewProjectNode" />
+              <item name="v3-H5" type="462c0819:PsiDirectoryNode" />
+              <item name="pages_safetyCheck" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="v3-H5" type="b2602c69:ProjectViewProjectNode" />
+              <item name="v3-H5" type="462c0819:PsiDirectoryNode" />
+              <item name="pages_safetyCheck" type="462c0819:PsiDirectoryNode" />
+              <item name="views" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="v3-H5" type="b2602c69:ProjectViewProjectNode" />
+              <item name="v3-H5" type="462c0819:PsiDirectoryNode" />
+              <item name="pages_safetyCheck" type="462c0819:PsiDirectoryNode" />
+              <item name="views" type="462c0819:PsiDirectoryNode" />
+              <item name="demo" type="462c0819:PsiDirectoryNode" />
+            </path>
           </expand>
           <select />
         </subPane>
@@ -71,7 +93,7 @@
   </component>
   <component name="PropertiesComponent">
     <property name="WebServerToolWindowFactoryState" value="false" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$/../小程序视频依赖" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/../v3-小程序" />
     <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
     <property name="nodejs_npm_path_reset_for_default_project" value="true" />
   </component>
@@ -95,21 +117,19 @@
       <option name="presentableId" value="Default" />
       <updated>1757034652411</updated>
       <workItem from="1757034653583" duration="15000" />
+      <workItem from="1776128843943" duration="24000" />
     </task>
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="15000" />
+    <option name="totallyTimeSpent" value="39000" />
   </component>
   <component name="ToolWindowManager">
-    <frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
+    <frame x="1912" y="-8" width="1936" height="1056" extended-state="6" />
     <layout>
-      <window_info id="Favorites" side_tool="true" />
       <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.24973656" />
       <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
-      <window_info anchor="bottom" id="Version Control" />
-      <window_info anchor="bottom" id="Terminal" />
-      <window_info anchor="bottom" id="Event Log" side_tool="true" />
+      <window_info id="Favorites" order="2" side_tool="true" />
       <window_info anchor="bottom" id="Message" order="0" />
       <window_info anchor="bottom" id="Find" order="1" />
       <window_info anchor="bottom" id="Run" order="2" />
@@ -117,6 +137,9 @@
       <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
       <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
       <window_info anchor="bottom" id="TODO" order="6" />
+      <window_info anchor="bottom" id="Version Control" order="7" />
+      <window_info anchor="bottom" id="Terminal" order="8" />
+      <window_info anchor="bottom" id="Event Log" order="9" side_tool="true" />
       <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
       <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
       <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />

+ 3 - 3
App.vue

@@ -1,13 +1,13 @@
 <script>
 	export default {
 		onLaunch: function() {
-			console.log('App Launch')
+			// console.log('App Launch')
 		},
 		onShow: function() {
-			console.log('App Show')
+			// console.log('App Show')
 		},
 		onHide: function() {
-			console.log('App Hide')
+			// console.log('App Hide')
 		}
 	}
 </script>

+ 1 - 0
api/request/config.js

@@ -1,6 +1,7 @@
 const config = {
 	/************************************ 后台服务地址 ************************************/
 	
+	// base_url: 'http://192.168.166.11/api', //安科院
 	// base_url: 'http://192.168.1.43/api', //43服务器
 	// base_url: 'http://192.168.1.8/api',//1.8服务器
 	// base_url: 'http://192.168.1.88/labSystem',//1.88服务器

+ 101 - 5
pages.json

@@ -86,6 +86,14 @@
 			}
 		},
 		{
+			"path": "pages/views/pageScanCodePage", //内部扫码页面
+			"style": {
+				"navigationBarTitleText": "",
+				"navigationBarTextStyle": "white", //导航文字颜色
+				"navigationStyle": "custom" //关闭原生导航
+			}
+		},
+		{
 			"path": "pages/views/saoCode/saoCode", //扫码中转
 			"style": {
 				"navigationBarTitleText": "",
@@ -453,13 +461,101 @@
 			/* 安全检查分包 */
 			"root": "pages_safetyCheck", //分包根路径
 			"name": "safetyCheck", //分包名字可写可不写
-			"pages": [
+			"pages": [{
+					"path": "views/safetyCheck",
+					"style": {
+						"navigationBarTitleText": "安全检查"
+					}
+				},
+
 				{
-					"path": "views/demo/index",
+					"path": "views/inspectManage/inspectAdd",
 					"style": {
-						"navigationBarTitleText": "安全检查分包",
-						"navigationBarTextStyle": "white", //导航文字颜色
-						"navigationBarBackgroundColor": "#0183FA" //导航背景色
+						"navigationBarTitleText": "开始检查"
+					}
+				},
+				{
+					"path": "views/inspectManage/conductInspections",
+					"style": {
+						"navigationBarTitleText": "开展检查"
+					}
+				},
+				{
+					"path": "views/inspectManage/hiddenDangerRecord",
+					"style": {
+						"navigationBarTitleText": "隐患记录"
+					}
+				},
+				{
+					"path": "views/inspectManage/inspectList",
+					"style": {
+						"navigationBarTitleText": "检查"
+					}
+				},
+				{
+					"path": "views/itemsManage/hiddenDangerItemsSearch",
+					"style": {
+						"navigationBarTitleText": "隐患项搜索"
+					}
+				},
+				{
+					"path": "views/itemsManage/hiddenDangerItems",
+					"style": {
+						"navigationBarTitleText": "隐患项"
+					}
+				},
+				{
+					"path": "views/itemsManage/hiddenDangerRectification",
+					"style": {
+						"navigationBarTitleText": "隐患项整改"
+					}
+				},
+				{
+					"path": "views/itemsManage/hiddenDangerItemsDetail",
+					"style": {
+						"navigationBarTitleText": "检查详情"
+					}
+				},
+				{
+					"path": "views/snapshotManage/snapshotDetail",
+					"style": {
+						"navigationBarTitleText": "随手拍详情"
+					}
+				},
+				{
+					"path": "views/snapshotManage/snapshotList",
+					"style": {
+						"navigationBarTitleText": "随手拍"
+					}
+				},
+				{
+					"path": "views/snapshotManage/snapshotItems",
+					"style": {
+						"navigationBarTitleText": "随手拍整改项"
+					}
+				},
+				{
+					"path": "views/snapshotManage/laboratorySearch",
+					"style": {
+						"navigationBarTitleText": "搜索实验室"
+					}
+				},
+				{
+					"path": "views/snapshotManage/snapshotRectification",
+					"style": {
+						"navigationBarTitleText": "整改"
+					}
+				},
+				{
+					"path": "views/materialAttachments",
+					"style": {
+						"navigationBarTitleText": "材料附件"
+					}
+				},
+				{
+					"path": "views/planDetail",
+					"style": {
+						"navigationBarTitleText": "计划详情"
 					}
 				}
 			]

+ 4 - 6
pages/component/topWarn.vue

@@ -78,19 +78,19 @@
 				this.client.on("connect", e => {
 					this.client.subscribe(this.mtopic, (err) => {
 						if (!err) {
-							console.log("预案订阅成功:" + this.mtopic);
+							// console.log("预案订阅成功:" + this.mtopic);
 						} else {
 							// console.log("连接错误:" + err);
 						}
 					});
 				});
 				this.client.on("message", (topic, message) => {
-					console.log('message', message);
-					console.log('topic,', topic);
+					// console.log('message', message);
+					// console.log('topic,', topic);
 					if (message) {
 						if (topic == this.mtopic) {
 							//预案触发
-							console.log('触发预案')
+							// console.log('触发预案')
 							this.laboratoryBigViewSelectTriggerInfo();
 						}
 					}
@@ -313,13 +313,11 @@
 		onHide() {
 			//清除定时器
 			let self = this;
-			console.log('onHide')
 			self.offPlanMQTT();
 		},
 		beforeDestroy() {
 			//清除定时器
 			let self = this;
-			console.log('beforeDestroy')
 			self.offPlanMQTT();
 		},
 	}

+ 1 - 1
pages/views/dataBoard/daYiReservation.vue

@@ -270,7 +270,7 @@
 							}]
 						};
 					}
-					console.log('res',res);
+					// console.log('res',res);
 					self.$set(this,'chartDataTow',res);
 				}
 			},

+ 1 - 1
pages/views/dataBoard/labPage.vue

@@ -172,7 +172,7 @@
 		},
 		created() {
 			this.dateIndex = new Date().getDay() - 1;
-			console.log(this.dateIndex)
+			// console.log(this.dateIndex)
 		},
 		beforeMount() {
 

+ 1 - 1
pages/views/dataBoard/resourceReservation.vue

@@ -310,7 +310,7 @@
 							}]
 						};
 					}
-					console.log('res',res)
+					// console.log('res',res)
 					self.$set(this,'chartDataThree',res);
 				}
 			},

+ 1 - 1
pages/views/dataBoard/securityHidden.vue

@@ -267,7 +267,7 @@
 
 			},
 			bindPickerChange(data) {
-				console.log(data)
+				// console.log(data)
 				this.pickerIndex = data.detail.value;
 				if (this.chartIndex == 0) {
 					//安全隐患排行

+ 2 - 2
pages/views/dataBoard/warningDispose.vue

@@ -133,7 +133,7 @@
 		methods: {
 			handleStyle(val) {
 				if (val.column.name == 'rate') {
-					console.log('val======>', val.row);
+					// console.log('val======>', val.row);
 					if (val.row.rate.indexOf('-') != -1) {
 						return {
 							'color': '#2EA805',
@@ -167,7 +167,7 @@
 				let year = date.getFullYear();
 
 				// 输出当前日期和星期
-				console.log("Today is " + month + "/" + dayOfMonth + "/" + year + ", " + weekdays[dayOfWeekIndex] + ".");
+				// console.log("Today is " + month + "/" + dayOfMonth + "/" + year + ", " + weekdays[dayOfWeekIndex] + ".");
 
 				// 获取接下来一周的每天日期和星期
 				let nextDays = [];

+ 5 - 5
pages/views/demo/mqttDemo.vue

@@ -43,23 +43,23 @@
 				this.client.on("connect", e => {
 					this.client.subscribe(this.mtopic + self.subId, (err) => {
 						if (!err) {
-							console.log("传感器订阅成功:" + this.mtopic + self.subId);
+							// console.log("传感器订阅成功:" + this.mtopic + self.subId);
 						} else {
-							console.log("连接错误:" + err);
+							// console.log("连接错误:" + err);
 						}
 					});
 					this.client.subscribe(this.mtopicOne + self.subId, (err) => {
 						if (!err) {
-							console.log("智能控制订阅成功:" + this.mtopicOne + self.subId);
+							// console.log("智能控制订阅成功:" + this.mtopicOne + self.subId);
 						} else {
-							console.log("连接错误:" + err);
+							// console.log("连接错误:" + err);
 						}
 					});
 				});
 				this.client.on("message", (topic, message) => {
 					if (message) {
 						let data = JSON.parse(message)
-						console.log('data',data)
+						// console.log('data',data)
 						this.$set(this,'mqttData',JSON.stringify(data));
 					}
 				});

+ 1 - 0
pages/views/home/home.vue

@@ -112,6 +112,7 @@
 			flex:1;
 			display: flex;
 			flex-direction: column;
+			overflow: hidden;
 		}
 	}
 </style>

+ 1 - 1
pages/views/information/information.vue

@@ -57,7 +57,7 @@
 		methods: {
 			//详情页
 			goInfoPage(item) {
-				console.log('item',item)
+				// console.log('item',item)
 				uni.navigateTo({
 					url: '/pages/views/information/informationInfo?item=' + encodeURIComponent(JSON.stringify(item))
 				});

+ 2 - 2
pages/views/information/notPassInfo.vue

@@ -93,7 +93,7 @@
 			lookItem(minItem){
 				if(minItem.type == 'png' || minItem.type == 'jpg' || minItem.type == 'jpeg' || minItem.type == 'gif'){
 					//查看图片
-					wx.previewImage({
+					uni.previewImage({
 						urls: [config.base_url+minItem.url], //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
 						current: '', // 当前显示图片的http链接,默认是第一个
 						success: function(res) {},
@@ -105,7 +105,7 @@
 					    title: '下载中'
 					});
 					//下载文档
-					wx.downloadFile({
+					uni.downloadFile({
 						url: config.base_url+minItem.url,
 						header: {
 							Authorization: uni.getStorageSync('token')

+ 79 - 0
pages/views/pageScanCodePage.vue

@@ -0,0 +1,79 @@
+<!-- H5 内部扫码页面 -->
+<template>
+  <view class="pageScanCodePage">
+    <video id="video-canvas" autoplay :controls="false"></video>
+  </view>
+</template>
+<script>
+	import { BrowserMultiFormatReader } from '@zxing/library';
+	import { pageScanTheCodeDataTreating } from '@/utils/scanTheCode'
+export default {
+  data() {
+    return {
+      codeReader: null,
+      deviceId: null,
+			path:'',
+    }
+  },
+  mounted() {
+		this.$set(this,'path',this.$route.query.path);
+    this.initScanner();
+  },
+  methods: {
+    async initScanner() {
+			let self = this;
+      const videoDom = document.getElementById('video-canvas').getElementsByTagName('video')[0];
+      videoDom.id = 'zxing-video';
+      this.codeReader = new BrowserMultiFormatReader();
+      try {
+        const devices = await this.codeReader.listVideoInputDevices();
+        this.deviceId = devices[devices.length - 1].deviceId;
+        this.startScanning();
+      } catch (err) {
+				uni.showToast({
+					mask: true,
+					icon: "none",
+					position: "center",
+					title: "请启用摄像头权限",
+					duration: 2000
+				});
+				setTimeout(() => {
+					uni.navigateBack();
+				}, 2000);
+      }
+    },
+    
+    startScanning() {
+			let self = this;
+      this.codeReader.decodeFromVideoDevice(
+        this.deviceId,
+        'zxing-video',
+        (result, err) => {
+          if (result) {
+						pageScanTheCodeDataTreating(this.path,result.text);
+            self.codeReader.reset();
+          }
+        }
+      );
+    }
+  },
+  beforeDestroy() {
+    this.codeReader?.reset();
+  }
+}
+</script>
+<style lang="stylus" scoped>
+	.pageScanCodePage{
+		flex:1;
+		display: flex;
+		flex-direction: column;
+		overflow: hidden;
+		::v-deep #video-canvas {
+			height:100%;
+			width:100%;
+			.uni-video-cover{
+				display: none;
+			}
+		}
+	}
+</style>

+ 1 - 1
pages/views/pages_patrolInspector/chemicalCatalogue.vue

@@ -48,7 +48,7 @@ export default {
 	  scrollGet(){
 		  let self=this;
 	      if(self.total/self.getData.pageSize<=self.getData.pageNum){
-	          console.log('没有更多数据!')
+	          // console.log('没有更多数据!')
 	      }else{
 			  setTimeout(function(){
 				  self.getData.pageNum += 1;

+ 1 - 1
pages/views/pupilPage/pupilMine.vue

@@ -249,7 +249,7 @@
 			// 头像上传
 			selectImage() {
 				let self = this;
-				wx.chooseImage({
+				uni.chooseImage({
 					count: 1,
 					sizeType: ["original", "compressed"],
 					sourceType: ["album", "camera"],

+ 1 - 1
pages/views/saoCode/saoCode.vue

@@ -26,7 +26,7 @@
 			}
 		},
 		onLoad(option) {
-			console.log('option',option)
+			// console.log('option',option)
 			let self = this;
 			if (option.q) {
 				let text = decodeURIComponent(option.q)

+ 3 - 9
pages/views/teacherPage/teacherHome.vue

@@ -294,13 +294,6 @@
 					this.pageType = 1;
 
 				} else if (type == 'securityCheck') {
-					uni.showToast({
-						title: '暂未开放',
-						icon: "none",
-						mask: true,
-						duration: 2000
-					});
-					return
 					//安全检查
 					uni.navigateTo({
 						url: "/pages_safetyCheck/views/safetyCheck",
@@ -538,7 +531,8 @@
 					}
 				}
 				.user-name-box{
-					flex:1;
+					width:220rpx;
+					margin-right:20rpx;
 					view:nth-child(1){
 						margin-top:20rpx;
 						line-height:50rpx;
@@ -546,7 +540,7 @@
 						font-weight:900;
 					}
 					view:nth-child(2){
-						line-height:50rpx;
+						line-height:30rpx;
 						font-size:26rpx;
 					}
 				}

+ 1 - 1
pages/views/teacherPage/teacherMine.vue

@@ -269,7 +269,7 @@
 			// 头像上传
 			selectImage() {
 				let self = this;
-				wx.chooseImage({
+				uni.chooseImage({
 					count: 1,
 					sizeType: ["original", "compressed"],
 					sourceType: ["album", "camera"],

+ 1 - 1
pages_basics/views/avatar.vue

@@ -80,7 +80,7 @@
 				uni.navigateBack();
 			},
 			async uploadImg(tempFilePaths){
-				console.log(tempFilePaths)
+				// console.log(tempFilePaths)
 			    var self = this;
 			    uni.showLoading({
 			        title: '上传中',

+ 15 - 15
pages_basics/views/earlyWarningManage/videoMonitoring.vue

@@ -106,7 +106,7 @@
 			//顶部tab点击
 			tabClickTow(item, index) {
 				this.curTabTow = index;
-				console.log(item)
+				// console.log(item)
 				// this.GetStartList(item)
 
 			},
@@ -116,7 +116,7 @@
 
 			},
 			videoErrorCallback(e) {
-				console.log("播放失败", e);
+				// console.log("播放失败", e);
 			},
 			//查询摄像头地址
 			async GetVideoList() {
@@ -140,7 +140,7 @@
 							url: newUrl,
 						}
 						list.push(obj)
-						console.log("obj", obj)
+						// console.log("obj", obj)
 					}
 					this.urlList = list;
 				}
@@ -168,7 +168,7 @@
 			},
 			//录制
 			recordButton(e) {
-				console.log("按下")
+				// console.log("按下")
 				let self = this;
 				let num = 0;
 				for (let i = 0; i < self.trumpetList.length; i++) {
@@ -186,7 +186,7 @@
 					return
 				}
 				this.liveType = true;
-				console.log('录制', e)
+				// console.log('录制', e)
 				this.startPoint = e.touches[0]; //记录长按时开始点信息,后面用于计算上划取消时手指滑动的距离。
 				const options = {
 					duration: 10000,
@@ -198,10 +198,10 @@
 				}
 				this.recorderManager.start(options); //开始录音
 				this.recorderManager.onStart(() => {
-					console.log('recorder start')
+					// console.log('recorder start')
 				})
 				this.recorderManager.onError((res) => {
-					console.log(res);
+					// console.log(res);
 				})
 				wx.showToast({
 					title: "正在录音,上划取消发送",
@@ -212,7 +212,7 @@
 			},
 			//取消
 			cancelButton(e) {
-				console.log("移动")
+				// console.log("移动")
 				let self = this;
 				let num = 0;
 				for (let i = 0; i < self.trumpetList.length; i++) {
@@ -224,7 +224,7 @@
 					return
 				}
 				this.liveType = false;
-				console.log('取消', e)
+				// console.log('取消', e)
 				let moveLenght = e.touches[e.touches.length - 1].clientY - this.startPoint.clientY; //移动距离
 				if (Math.abs(moveLenght) > 50) {
 					wx.showToast({
@@ -244,7 +244,7 @@
 			},
 			//发送
 			sendButton(e) {
-				console.log("松开")
+				// console.log("松开")
 				let self = this;
 				let num = 0;
 				for (let i = 0; i < self.trumpetList.length; i++) {
@@ -257,16 +257,16 @@
 					return
 				}
 				this.liveType = false;
-				console.log('发送', e)
+				// console.log('发送', e)
 				wx.hideToast(); //结束录音、隐藏Toast提示框
 				this.recorderManager.stop(); //结束录音
 				this.recorderManager.onStop((res) => {
 					if (!this.sendLock) {
-						console.log('1', this.recorderManager)
+						// console.log('1', this.recorderManager)
 						this.uploadImg(res.tempFilePath);
 					}
-					console.log('停止录音', res.tempFilePath)
-					console.log("sendLock", this.sendLock);
+					// console.log('停止录音', res.tempFilePath)
+					// console.log("sendLock", this.sendLock);
 				})
 			},
 			//上传MP3
@@ -285,7 +285,7 @@
 					success: (uploadFileRes) => {
 						let res = JSON.parse(uploadFileRes.data);
 						if (res.code == 200) {
-							console.log("上传成功", res)
+							// console.log("上传成功", res)
 							let url = uni.getStorageSync('fileBrowseEnvironment') + '/' + res.data.url
 							self.iotAppSpeakerPlayVoice(url);
 						} else {

+ 2 - 2
pages_basics/views/faceImage.vue

@@ -39,7 +39,7 @@
             // 图片上传
             selectImage() {
                 let self = this;
-                wx.chooseImage({
+                uni.chooseImage({
                     count: 1,
                     sizeType: ["original", "compressed"],
                     sourceType: ["album", "camera"],
@@ -50,7 +50,7 @@
                 });
             },
             async uploadImg(tempFilePaths){
-				console.log(tempFilePaths)
+				// console.log(tempFilePaths)
                 var self = this;
                 uni.showLoading({
                     title: '上传中',

+ 7 - 7
pages_basics/views/gradingControl/gradingControlAdd.vue

@@ -116,7 +116,7 @@
 			download(item) {
 				if (item.type == 'png' || item.type == 'jpg' || item.type == 'jpeg' || item.type == 'gif') {
 					//查看图片
-					wx.previewImage({
+					uni.previewImage({
 						urls: [item.url], //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
 						current: '', // 当前显示图片的http链接,默认是第一个
 						success: function(res) {},
@@ -127,9 +127,9 @@
 					uni.showLoading({
 						title: '下载中'
 					});
-					console.log(item)
+					// console.log(item)
 					//下载文档
-					wx.downloadFile({
+					uni.downloadFile({
 						url:item.url,
 						header: {
 							Authorization: uni.getStorageSync('token')
@@ -212,7 +212,7 @@
 						}
 					},
 					fail: function(res) {
-						console.log(res.errMsg);
+						// console.log(res.errMsg);
 					}
 				});
 			},
@@ -223,7 +223,7 @@
 					sizeType: ["original", "compressed"],
 					sourceType: ["album", "camera"],
 					success: function(res) {
-						console.log(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') {
@@ -304,7 +304,7 @@
 							this.upList.push(obj);
 							this.$forceUpdate();
 
-							console.log(this.upList)
+							// console.log(this.upList)
 						} else {
 							uni.showToast({
 								title: res.msg,
@@ -360,7 +360,7 @@
 				if (this.messageUserId) {
 					_this.param.messageUserId = this.messageUserId
 				}
-				console.log(_this.param)
+				// console.log(_this.param)
 				const {
 					data
 				} = await gradingControlAdd(_this.param)

+ 7 - 7
pages_basics/views/gradingControl/gradingControlDetail.vue

@@ -94,7 +94,7 @@ infoList.ruleType=='年管控'? 'green': '',]">
 		onLoad(option) {
 			if (option.item) {
 				let item = JSON.parse(decodeURIComponent(option.item));
-				console.log(item)
+				// console.log(item)
 				this.id = item.recordId;
 				if (item.messageUserId) {
 					this.readByLoginUser(item.messageUserId);
@@ -120,10 +120,10 @@ infoList.ruleType=='年管控'? 'green': '',]">
 				//this.getList();
 			},
 			lookItem(item) {
-				console.log("item", item)
+				// console.log("item", item)
 				if (item.type == 'png' || item.type == 'jpg' || item.type == 'jpeg' || item.type == 'gif') {
 					//查看图片
-					wx.previewImage({
+					uni.previewImage({
 						urls: [item.url], //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
 						current: '', // 当前显示图片的http链接,默认是第一个
 						success: function(res) {},
@@ -135,7 +135,7 @@ infoList.ruleType=='年管控'? 'green': '',]">
 						title: '下载中'
 					});
 					//下载文档
-					wx.downloadFile({
+					uni.downloadFile({
 						url:item.url,
 						header: {
 							Authorization: uni.getStorageSync('token')
@@ -179,12 +179,12 @@ infoList.ruleType=='年管控'? 'green': '',]">
 			},
 			//查看图片
 			lockImg(list) {
-				console.log(list)
+				// console.log(list)
 				/* if(!list[0]){
 					return
 				} */
 				let url = list.split(',')
-				wx.previewImage({
+				uni.previewImage({
 					urls: url, //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
 					current: '', // 当前显示图片的http链接,默认是第一个
 					success: function(res) {},
@@ -239,7 +239,7 @@ infoList.ruleType=='年管控'? 'green': '',]">
 						}
 					}
 
-					console.log(this.upList)
+					// console.log(this.upList)
 
 
 				}

+ 2 - 2
pages_basics/views/photoInspection.vue

@@ -73,7 +73,7 @@
 		onLoad(option) {
 			if(option.item){
 				let obj = JSON.parse(decodeURIComponent(option.item))
-				console.log('obj',obj)
+				// console.log('obj',obj)
 				this.$set(this,'isotope',true);
 				this.$set(this,'subList',[obj]);
 				this.$set(this,'subListIndex','0');
@@ -227,7 +227,7 @@
 			},
 			upImg(index) {
 				let self = this;
-				wx.chooseImage({
+				uni.chooseImage({
 					count: 1,
 					sizeType: ["original", "compressed"],
 					sourceType: ["album", "camera"],

+ 3 - 3
pages_basics/views/signature/signature.vue

@@ -50,7 +50,7 @@
 		onLoad(option) {
 			//首次进入获取上个页面传过来的签名
 			this.alreadyImg = this.baseUrl + option.item;
-			console.log(this.alreadyImg)
+			// console.log(this.alreadyImg)
 		},
 		onShow() {
 			//用户点击上传签名
@@ -106,12 +106,12 @@
 			// 头像上传
 			selectImage() {
 				let self = this;
-				wx.chooseImage({
+				uni.chooseImage({
 					count: 1,
 					sizeType: ["original", "compressed"],
 					sourceType: ["album", "camera"],
 					success: function(res) {
-						console.log("res1", res)
+						// console.log("res1", res)
 						let tempFilePaths = res.tempFilePaths[0];
 						self.uploadImg(tempFilePaths);
 					}

+ 3 - 3
pages_manage/views/accessQualification/accessQualificationInfo.vue

@@ -174,7 +174,7 @@
 				let self = this;
 				if (minItem.type == 'png' || minItem.type == 'jpg' || minItem.type == 'jpeg' || minItem.type == 'gif') {
 					//查看图片
-					wx.previewImage({
+					uni.previewImage({
 						urls: [self.baseUrl + minItem.url], //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
 						current: '', // 当前显示图片的http链接,默认是第一个
 						success: function(res) {},
@@ -189,7 +189,7 @@
 					console.log(self.baseUrl + '/' + minItem.name)
 					console.log(minItem.url)
 					//下载文档
-					wx.downloadFile({
+					uni.downloadFile({
 						url: self.baseUrl+minItem.url,
 						header: {
 							Authorization: uni.getStorageSync('token')
@@ -247,7 +247,7 @@
 				if (!list[0]) {
 					return
 				}
-				wx.previewImage({
+				uni.previewImage({
 					urls: list, //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
 					current: '', // 当前显示图片的http链接,默认是第一个
 					success: function(res) {},

+ 10 - 7
pages_manage/views/emergencyEvacuationBig.vue

@@ -228,7 +228,9 @@
 				//广播相关
 				liveType: false,
 				sendLock: true, //发送锁,当为true时上锁,false时解锁发送
-				recorderManager: wx.getRecorderManager(),
+				// #ifdef MP-WEIXIN
+				recorderManager: uni.getRecorderManager(),
+				// #endif
 				isEvacuate: true, //疏散按钮控制,当为true时候执行疏散
 				//滑动记录
 				startPoint: {},
@@ -308,7 +310,7 @@
 			// }
 			this.getDataA();
 			this.getRedisEvacuation();
-			// #ifdef WEB
+			// #ifdef MP-WEIXIN
 			if (this.recorderManager) {
 				this.recorderManager.stop();
 			}
@@ -636,10 +638,10 @@
 				this.recorderManager.onError((res) => {
 					// console.log(res);
 				})
-				wx.showToast({
+				uni.showToast({
 					title: "正在录音,上划取消发送",
 					icon: "none",
-					duration: 60000 //先定义个60秒,后面可以手动调用wx.hideToast()隐藏
+					duration: 60000 //先定义个60秒,后面可以手动调用uni.hideToast()隐藏
 				});
 				this.sendLock = false; //长按时是不上锁的。
 			},
@@ -660,14 +662,14 @@
 				// console.log('取消', e)
 				let moveLenght = e.touches[e.touches.length - 1].clientY - this.startPoint.clientY; //移动距离
 				if (Math.abs(moveLenght) > 50) {
-					wx.showToast({
+					uni.showToast({
 						title: "松开手指,取消发送",
 						icon: "none",
 						duration: 60000
 					});
 					this.sendLock = true; //触发了上滑取消发送,上锁
 				} else {
-					wx.showToast({
+					uni.showToast({
 						title: "正在录音,上划取消发送",
 						icon: "none",
 						duration: 60000
@@ -691,7 +693,7 @@
 				}
 				this.liveType = false;
 				// console.log('发送', e)
-				wx.hideToast(); //结束录音、隐藏Toast提示框
+				uni.hideToast(); //结束录音、隐藏Toast提示框
 				this.recorderManager.stop(); //结束录音
 				this.recorderManager.onStop((res) => {
 					if (!this.sendLock) {
@@ -1211,6 +1213,7 @@
 					this.recorder.open(() => {
 						// console.log("录音器初始化成功");
 						this.recorder.start(); // 初始化后立即开始录音
+						this.startRecord();
 					}, (error) => {
 						console.error("录音器初始化失败:", error);
 						uni.showToast({

+ 1 - 1
pages_manage/views/emergencyEvacuationBigFullScreen.vue

@@ -332,7 +332,7 @@
 			//计算缩放率
 			getWXSystemInfo(list) {
 				let self = this;
-				wx.getSystemInfo({
+				uni.getSystemInfo({
 					success: function(res) {
 						self.zoomCalculate(list, res.windowHeight, res.windowWidth);
 					}

+ 1 - 0
pages_manage/views/laboratory/voiceBroadcast.vue

@@ -313,6 +313,7 @@
 					this.recorder.open(() => {
 						// console.log("录音器初始化成功");
 						this.recorder.start(); // 初始化后立即开始录音
+						this.startRecord();
 					}, (error) => {
 						console.error("录音器初始化失败:", error);
 						uni.showToast({

+ 740 - 0
pages_safetyCheck/component/checkItemModule.vue

@@ -0,0 +1,740 @@
+<!-- 
+	//参数说明
+ 	propsData参数下 
+ 	infoType 为必要参数 0.检查 1.复查 2.整改
+ 	checkType 为必要参数 infoType为0时 代表检查状态 为1时代表复查状态 为2时代表整改状态
+ 	
+ 	//检查时的必要参数 
+ 	manageId 
+ 	
+ 	//复查时的必要参数 
+ 	planId 
+ 	planSetId 
+ 	subId 
+  
+ 	
+ 	//隐患时的必要参数 
+ 	planId 
+ 	planSetId 
+ 	subId 
+	
+	//引用方法
+	
+	<checkItemModule :propsData="propsData" v-if="checkItemModuleType"></checkItemModule>
+	
+	import {
+		checkItemModule
+	} from '@/pages/checkItemModule.vue'
+	
+	components: {
+		checkItemModule
+	},
+	
+	checkItemModuleType:false,
+	propsData:{
+		infoType:0,
+		manageId:'1839113478692855815',
+		checkType:0,
+		planId:'',
+		planSetId:'',
+		subId:'',
+		searchValue:'',
+	},
+	
+	checkItemModuleButton(type,item){
+		if(type = 'open'){
+			this.$set(this,'propsData',{
+				infoType:0,
+				manageId:'1839113478692855815',
+				checkType:0,
+				planId:'',
+				planSetId:'',
+				subId:'',
+				searchValue:'',
+			});
+			this.$set(this,'checkItemModuleType',true);
+		}else if(type = 'out'){
+			this.$set(this,'checkItemModuleType',false);
+			this.$set(this,'propsData',{});
+		}else if(type = 'submit'){
+			console.log('已选中-item', item)
+		}
+	},
+ -->
+<template>
+	<scroll-view scroll-y style="overflow-y: scroll;">
+	<view class="checkItemModule">
+		<!-- 标签选项卡 -->
+		<view class="checkItemModule-title-box">
+			<view class="checkItemModule-title-p" @click="checkTitleButton(1)"
+				:class="pageType==1?'.checkItemModule-title-check':''">
+				<view>关键字</view>
+				<view></view>
+			</view>
+			<view class="checkItemModule-title-p" @click="checkTitleButton(2)"
+				:class="pageType==2?'.checkItemModule-title-check':''">
+				<view>按层级</view>
+				<view></view>
+			</view>
+		</view>
+		<!-- 输入搜索模块 -->
+		<view class="input-max-big-box" v-if="pageType == 1">
+			<view class="input-big-box">
+				<view class="input-box">
+					<view class="left-icons">
+						<uni-icons color="#A2A2A2" type="search" size="20"></uni-icons>
+					</view>
+					<input type="text" v-model="searchValue" placeholder="搜索检查项" name="search" @confirm='getSearchValue'
+						confirm-type='search' @input="theBlur" maxlength="50"
+						placeholder-style="color: #666;font-size:24rpx;">
+					<view v-if="searchValue" class="left-icons" @click="delSearchValue()">
+						<uni-icons color="#0183FA" type="clear" size="20"></uni-icons>
+					</view>
+				</view>
+				<view class="out-button" @click="outButton()">取消</view>
+			</view>
+			<view class="input-for-max-box">
+				<view class="for-box" v-for="(item,index) in dataList" :key="index" v-if="optionData.infoType==0">
+					<view v-html="brightenKeyword(item.hazardCheckCode1,item.hazardCheckName1,searchValue)" class="for-box-n">
+						{{item.hazardCheckCode1}} {{item.hazardCheckName1}}
+					</view>
+					<view v-for="(item2,index2) in item.children">
+						<view v-html="brightenKeyword(item2.hazardCheckCode2,item2.hazardCheckName2,searchValue)" class="for-box-n">
+							{{item2.hazardCheckCode2}} {{item2.hazardCheckName2}}
+						</view>
+						<view class="for-box-n"
+							v-for="(item3,index3) in item2.children">
+							<view v-html="brightenKeyword(item3.hazardCheckCode,item3.hazardCheckName,searchValue)">{{item3.hazardCheckCode}} {{item3.hazardCheckName}}</view>
+							<view class="for-box-n-b" @click="checkItemButton(item3,item4)"
+								v-for="(item4,index4) in item3.hazardCheckPointList">
+								<view v-html="brightenKeyword('',item4,searchValue)">{{item4}}</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<!-- 级联选择模块 -->
+		<view class="check-max-big-box" v-if="pageType == 2">
+			<view class="check-big-box">
+				<view v-if="levelListOne" @click="cascadeButton(1)">一级检查</view>
+				<view v-if="levelListTwo" @click="cascadeButton(2)">二级检查</view>
+				<view v-if="levelListThree" @click="cascadeButton(3)">三级检查</view>
+			</view>
+			<view class="check-for-max-box">
+				<view v-for="(item,index) in checkList" :key="item.id" @click="cascadeItemButton(item)">
+					<view>{{item.code}} {{item.name}}</view>
+					<view v-for="(minItem,minIndex) in item.hazardCheckPointList" :key="item.id" @click="checkItemButton(item,minItem)">{{minItem}}</view>
+				</view>
+
+			</view>
+		</view>
+	</view>
+	</scroll-view>
+</template>
+
+<script>
+	import {
+		securityCheckOptionSelAllList,
+		securityAppCheckSetOptionList,
+		securityAppCheckSetOptionGetReviewList,
+		securityAppCheckDangerGetCheckDangerSubId,
+		securityAppCheckPlanSetGetOptionList,
+	} from '@/pages_safetyCheck/api/index.js'
+	export default {
+		name: "checkItemModule",
+		props: {
+			propsData: {}
+		},
+		data() {
+			return {
+				//父级参数
+				optionData: {},
+				//选项卡状态
+				pageType: 1,
+				//输入框数据
+				searchValue: "",
+				//输入搜索返回列表
+				dataList: [],
+				//当前级联数据
+				cascadeButtonType:1,
+				//一级-级联数据
+				levelListOne: null,
+				//二级-级联数据
+				levelListTwo: null,
+				//三级-级联数据
+				levelListThree: null,
+				//级联列表
+				checkList: [],
+			}
+		},
+		onLoad() {
+
+		},
+		mounted() {
+			this.$set(this, 'optionData', JSON.parse(JSON.stringify(this.propsData)));
+			this.$nextTick(() => {
+				this.securityCheckOptionSelAllList();
+			})
+		},
+		methods: {
+			theBlur(e) {
+				this.searchValue = e.target.value
+			},
+			//输入框查询
+			getSearchValue() {
+				if (this.optionData.infoType == 0) {
+					//检查
+					// this.securityAppCheckSetOptionList();
+					this.securityCheckOptionSelAllList();
+				} else if (this.optionData.infoType == 1) {
+					//复查
+					this.securityAppCheckSetOptionGetReviewList();
+				} else if (this.optionData.infoType == 2) {
+					//整改
+					this.securityAppCheckDangerGetCheckDangerSubId();
+				}
+			},
+			//选项卡title切换
+			checkTitleButton(type) {
+				if (this.pageType != type) {
+					this.$set(this, 'pageType', type);
+				}
+			},
+			//退出页面
+			outButton() {
+			// #ifdef WEB
+				this.$parent.$parent.checkItemModuleButton('out');
+			// #endif
+			// #ifdef MP-WEIXIN
+				this.$parent.checkItemModuleButton('out');
+			// #endif
+			},
+			//清除输入框内容
+			delSearchValue() {
+				if (this.searchValue) {
+					this.$set(this, 'searchValue', '');
+					this.$set(this, 'dataList', []);
+					this.getSearchValue();
+				}
+			},
+			//级联等级点击
+			cascadeButton(type) {
+				this.$set(this,'cascadeButtonType',type);
+				if (type == 1) {
+					this.$set(this, 'levelListTwo', null);
+					this.$set(this, 'levelListThree', null);
+					this.$set(this, 'checkList', this.levelListOne.children);
+				} else if (type == 2) {
+					this.$set(this, 'levelListThree', null);
+					this.$set(this, 'checkList', this.levelListTwo.children);
+				}
+			},
+			//级联检查项选中
+			cascadeItemButton(item) {
+				if (item.level == 1) {
+					this.$set(this, 'levelListTwo', item);
+					this.$set(this, 'checkList', item.children);
+				} else if (item.level == 2) {
+					this.$set(this, 'levelListThree', item);
+					if (item.children[0]) {
+						item.children.forEach(function(item) {
+							if (item.hazardCheckPoint) {
+								item.hazardCheckPointList = item.hazardCheckPoint.split('#')
+							}
+						})
+					}
+					this.$set(this, 'checkList', item.children);
+				}
+			},
+			//选中检查项
+			checkItemButton(item, item2) {
+			// #ifdef WEB
+				this.$parent.$parent.checkItemModuleButton('submit', item, item2);
+			// #endif
+			// #ifdef MP-WEIXIN
+				this.$parent.checkItemModuleButton('submit', item, item2);
+			// #endif
+			},
+			//高亮
+			brightenKeyword(code,val, editKeyword) {
+				const Reg = new RegExp(editKeyword);
+				if (val) {
+					const res = code + ' ' + val.replace(Reg, `<span style="color: #0183FA;">${editKeyword }</span>`);
+					return res;
+				}
+			},
+			//基础检查项检查
+			async securityCheckOptionSelAllList() {
+				let self = this;
+				const {
+					data
+				} = await securityCheckOptionSelAllList({});
+				if (data.code == 200) {
+					let maxList = this.getCascaderData(JSON.parse(JSON.stringify(data.data)), 2)
+					this.$nextTick(() => {
+						if (this.optionData.infoType == 0) {
+							this.securityAppCheckPlanSetGetOptionList(maxList);
+							// this.securityAppCheckSetOptionList(maxList);
+						} else if (this.optionData.infoType == 1) {
+							this.securityAppCheckSetOptionGetReviewList(maxList);
+						} else if (this.optionData.infoType == 2) {
+							this.securityAppCheckDangerGetCheckDangerSubId(maxList);
+						}
+					})
+				}
+			},
+			//查询批次下-检查项
+			async securityAppCheckPlanSetGetOptionList(maxList){
+				let self = this;
+				const {
+					data
+				} = await securityAppCheckPlanSetGetOptionList({
+					planSetId:this.optionData.planSetId,
+					searchValue: this.searchValue
+				});
+				if (data.code == 200) {
+					if (data.data[0]) {
+						let minList = JSON.parse(JSON.stringify(data.data))
+						this.newCascadeData(maxList, minList);
+					}else{
+						this.$set(this, 'levelListOne', JSON.parse(JSON.stringify({
+							level: 0,
+							children: []
+						})));
+						this.$set(this, 'dataList', []);
+						this.$set(this, 'checkList', []);
+						this.$set(this, 'cascadeButtonType', 1);
+						this.$set(this, 'levelListOne', null);
+						this.$set(this, 'levelListTwo', null);
+						this.$set(this, 'levelListThree', null);
+					}
+					
+					// //查询数据
+					// let map = new Map();
+					// for (let item of data.data) {
+					//     let hazardCheckCode2 = item.hazardCheckCode2;
+					//     if (!map.has(hazardCheckCode2)) {
+					//         map.set(hazardCheckCode2, {
+					//             hazardCheckCode2: hazardCheckCode2,
+					//             hazardCheckName2: item.hazardCheckName2,
+					//             hazardCheckCode1: item.hazardCheckCode1,
+					//             hazardCheckName1: item.hazardCheckName1,
+					//             data: [item]
+					//         });
+					//     } else {
+					//         map.get(hazardCheckCode2).data.push(item);
+					//     }
+					// }
+					// let finalResult = Array.from(map.values());
+					// this.$set(this, 'dataList', finalResult);
+				}
+			},
+			/********************** 检查相关查询 **********************/
+			async securityAppCheckSetOptionList(maxList) {
+				let self = this;
+				const {
+					data
+				} = await securityAppCheckSetOptionList({
+					manageId: this.optionData.manageId,
+					checkStatus: this.optionData.checkType,
+					searchValue: this.searchValue
+				});
+				if (data.code == 200) {
+					//级联数据
+					if (maxList) {
+						let minList = JSON.parse(JSON.stringify(data.data))
+						this.cascadeData(maxList, minList);
+					}
+					if(this.optionData.editStatus){
+						data.data.unshift(this.optionData.editItem);
+					}
+					if (data.data[0]) {
+						data.data.forEach(function(item) {
+							if (item.hazardCheckPoint) {
+								item.hazardCheckPointList = item.hazardCheckPoint.split('#')
+							}
+						})
+					}
+					
+					//查询数据
+					let map = new Map();
+					for (let item of data.data) {
+					    let hazardCheckCode2 = item.hazardCheckCode2;
+					    if (!map.has(hazardCheckCode2)) {
+					        map.set(hazardCheckCode2, {
+					            hazardCheckCode2: hazardCheckCode2,
+					            hazardCheckName2: item.hazardCheckName2,
+					            hazardCheckCode1: item.hazardCheckCode1,
+					            hazardCheckName1: item.hazardCheckName1,
+					            data: [item]
+					        });
+					    } else {
+					        map.get(hazardCheckCode2).data.push(item);
+					    }
+					}
+					let finalResult = Array.from(map.values());
+					this.$set(this, 'dataList', finalResult);
+					
+					
+				}
+			},
+			/********************** 复查相关查询 **********************/
+			async securityAppCheckSetOptionGetReviewList(maxList) {
+				let self = this;
+				const {
+					data
+				} = await securityAppCheckSetOptionGetReviewList({
+					planId: this.optionData.planId,
+					planSetId: this.optionData.planSetId,
+					subId: this.optionData.subId,
+					appReviewStatus: this.optionData.checkType,
+					searchValue: this.searchValue
+				});
+				if (data.code == 200) {
+					//级联数据
+					if (maxList) {
+						let minList = JSON.parse(JSON.stringify(data.data.records))
+						this.cascadeData(maxList, minList);
+					}
+					//查询数据
+					this.$set(this, 'dataList', JSON.parse(JSON.stringify(data.data.records)));
+				}
+			},
+			/********************** 整改相关查询 **********************/
+			async securityAppCheckDangerGetCheckDangerSubId(maxList) {
+				let self = this;
+				const {
+					data
+				} = await securityAppCheckDangerGetCheckDangerSubId({
+					planId: this.optionData.planId,
+					planSetId: this.optionData.planSetId,
+					subId: this.optionData.subId,
+					appReviewStatus: this.optionData.checkType,
+					searchValue: this.searchValue
+				});
+				if (data.code == 200) {
+					//级联数据
+					if (maxList) {
+						
+						let minList = JSON.parse(JSON.stringify(data.data.records))
+						this.cascadeData(maxList, minList);
+					}
+					//查询数据
+					this.$set(this, 'dataList', JSON.parse(JSON.stringify(data.data.records)));
+				}
+			},
+			/********************** 处理级联数据 **********************/
+			cascadeData(maxList, minList) {
+				for (let i = 0; i < maxList.length; i++) {
+					for (let o = 0; o < maxList[i].children.length; o++) {
+						for (let x = 0; x < minList.length; x++) {
+							if (maxList[i].children[o].id == minList[x].hazardCheckPro2) {
+								minList[x].level = 3;
+								if (maxList[i].children[o].children) {
+									maxList[i].children[o].children.push(minList[x])
+								} else {
+									maxList[i].children[o].children = [minList[x]]
+								}
+							}
+						}
+					}
+				}
+				let list = this.getCascaderData(JSON.parse(JSON.stringify(maxList)), 3)
+				this.$nextTick(() => {
+					this.$set(this, 'levelListOne', JSON.parse(JSON.stringify({
+						level: 0,
+						children: list
+					})));
+					this.$set(this, 'checkList', JSON.parse(JSON.stringify(list)));
+					this.$set(this, 'cascadeButtonType', 1);
+					this.$set(this, 'levelListTwo', null);
+					this.$set(this, 'levelListThree', null);
+					this.$forceUpdate();
+				})
+				
+				
+			},
+			newCascadeData(maxList, minList) {
+				for (let i = 0; i < maxList.length; i++) {
+					for (let o = 0; o < maxList[i].children.length; o++) {
+						for (let x = 0; x < minList.length; x++) {
+							if (maxList[i].children[o].id == minList[x].parentId) {
+								//一级
+								maxList[i].hazardCheckPro = minList[x].id
+								maxList[i].hazardCheckCode = minList[x].code
+								maxList[i].hazardCheckName = minList[x].name
+								maxList[i].hazardCheckPro2 = maxList[i].children[o].id
+								maxList[i].hazardCheckCode2 = maxList[i].children[o].code
+								maxList[i].hazardCheckName2 = maxList[i].children[o].name
+								maxList[i].hazardCheckPro1 = maxList[i].id
+								maxList[i].hazardCheckCode1 = maxList[i].code
+								maxList[i].hazardCheckName1 = maxList[i].name
+								//二级
+								maxList[i].children[o].hazardCheckPro = minList[x].id
+								maxList[i].children[o].hazardCheckCode = minList[x].code
+								maxList[i].children[o].hazardCheckName = minList[x].name
+								maxList[i].children[o].hazardCheckPro2 = maxList[i].children[o].id
+								maxList[i].children[o].hazardCheckCode2 = maxList[i].children[o].code
+								maxList[i].children[o].hazardCheckName2 = maxList[i].children[o].name
+								maxList[i].children[o].hazardCheckPro1 = maxList[i].id
+								maxList[i].children[o].hazardCheckCode1 = maxList[i].code
+								maxList[i].children[o].hazardCheckName1 = maxList[i].name
+								//三级
+								minList[x].level = 3;
+								minList[x].hazardCheckPro = minList[x].id
+								minList[x].hazardCheckCode = minList[x].code
+								minList[x].hazardCheckName = minList[x].name
+								minList[x].hazardCheckPro2 = maxList[i].children[o].id
+								minList[x].hazardCheckCode2 = maxList[i].children[o].code
+								minList[x].hazardCheckName2 = maxList[i].children[o].name
+								minList[x].hazardCheckPro1 = maxList[i].id
+								minList[x].hazardCheckCode1 = maxList[i].code
+								minList[x].hazardCheckName1 = maxList[i].name
+								minList[x].hazardCheckPointList = minList[x].mainPoint.split('#')
+								if (maxList[i].children[o].children) {
+									maxList[i].children[o].children.push(minList[x])
+								} else {
+									maxList[i].children[o].children = [minList[x]]
+								}
+							}
+						}
+					}
+				}
+				let list = this.getCascaderData(JSON.parse(JSON.stringify(maxList)), 3)
+				this.$nextTick(() => {
+					this.$set(this, 'levelListOne', JSON.parse(JSON.stringify({
+						level: 0,
+						children: list
+					})));
+					this.$set(this, 'dataList', JSON.parse(JSON.stringify(list)));
+					this.$set(this, 'checkList', JSON.parse(JSON.stringify(list)));
+					this.$set(this, 'cascadeButtonType', 1);
+					this.$set(this, 'levelListTwo', null);
+					this.$set(this, 'levelListThree', null);
+				})
+			},
+			/********************** 检查项格式处理 **********************/
+			getCascaderData(list, type) {
+				let self = this
+				for (let i = 0; i < list.length; i++) {
+					if (list[i].level == type) {
+						delete list[i].children
+					} else if (list[i].children) {
+						if (list[i].children[0]) {
+							list[i].children = self.getCascaderData(list[i].children, type)
+						} else {
+							list.splice(i, 1)
+							i--
+						}
+					} else {
+						list.splice(i, 1)
+						i--
+					}
+				}
+				for (let i = 0; i < list.length; i++) {
+					if (list[i].level == type) {
+						delete list[i].children
+					} else if (list[i].children) {
+						if (list[i].children[0]) {
+							list[i].children = self.getCascaderData(list[i].children, type)
+						} else {
+							list.splice(i, 1)
+							i--
+						}
+					} else {
+						list.splice(i, 1)
+						i--
+					}
+				}
+				for (let i = 0; i < list.length; i++) {
+					if (list[i].level == type) {
+						delete list[i].children
+					} else if (list[i].children) {
+						if (list[i].children[0]) {
+							list[i].children = self.getCascaderData(list[i].children, type)
+						} else {
+							list.splice(i, 1)
+							i--
+						}
+					} else {
+						list.splice(i, 1)
+						i--
+					}
+				}
+				return list
+			},
+		}
+	}
+</script>
+
+
+<style lang="stylus" scoped>
+	.checkItemModule {
+		position: fixed;
+		top: 0;
+		left: 0;
+		height: 100%;
+		width: 100%;
+		flex: 1;
+		overflow: hidden;
+		display: flex;
+		flex-direction: column;
+		background-color: #fff;
+		// #ifdef WEB
+		margin-top:80rpx;
+		// #endif
+
+		.checkItemModule-title-box {
+			display: flex;
+			height: 100rpx;
+			background-color: #FFFFFF;
+			border-bottom: 1rpx solid #dedede;
+
+			.checkItemModule-title-p {
+				width: 140rpx;
+				height: 100rpx;
+
+				>view:nth-child(1) {
+					color: #333;
+					text-align: center;
+					font-size: 29rpx;
+					line-height: 30rpx;
+					margin: 35rpx 0 20rpx 0;
+				}
+
+				>view:nth-child(2) {
+					width: 56rpx;
+					height: 6rpx;
+					border-radius: 14rpx;
+					margin: 0 auto;
+				}
+			}
+
+			.checkItemModule-title-check {
+				>view:nth-child(1) {
+					color: #0183FA;
+				}
+
+				>view:nth-child(2) {
+					background: #0183FA;
+				}
+			}
+		}
+
+		.input-max-big-box {
+			flex: 1;
+			display: flex;
+			flex-direction: column;
+			overflow: hidden;
+
+			.input-big-box {
+				height: 104rpx;
+				display: flex;
+				background-color: #fff;
+				border-bottom: 1rpx solid #E0E0E0;
+
+				.input-box {
+					width: 611rpx;
+					height: 69rpx;
+					border: 1px solid #E0E0E0;
+					display: flex;
+					border-radius: 35px 35px 35px 35px;
+					margin: 17rpx 0 17rpx 21rpx;
+
+					.left-icons {
+						padding: 15rpx 18rpx 0 22rpx;
+					}
+
+					.right-icons {
+						padding: 15rpx 15rpx 0 22rpx;
+					}
+
+					>input {
+						flex: 1;
+						height: 69rpx;
+						line-height: 69rpx;
+					}
+				}
+
+				.out-button {
+					width: 100rpx;
+					margin: 17rpx 0 17rpx 15rpx;
+					text-align: center;
+					line-height: 69rpx;
+					color: #0183FA;
+					font-size: 29rpx;
+				}
+			}
+
+			.input-for-max-box {
+				flex: 1;
+				display: flex;
+				flex-direction: column;
+				overflow-y: scroll;
+				background-color: #fff;
+
+				.for-box {
+					.for-box-n {
+						margin: 0 21rpx;
+						font-size: 32rpx;
+						line-height: 40rpx;
+						padding: 20rpx 0;
+						background-color: #fff;
+						border-bottom: 1rpx solid #E0E0E0;
+					}
+					.for-box-n-b {
+						margin: 0 21rpx;
+						font-size: 32rpx;
+						line-height: 40rpx;
+						padding: 20rpx 0;
+						background-color: #fff;
+					}
+				}
+			}
+		}
+
+		.check-max-big-box {
+			flex: 1;
+			display: flex;
+			flex-direction: column;
+			overflow: hidden;
+
+			.check-big-box {
+				height: 70rpx;
+				display: flex;
+				background-color: #fff;
+				border-bottom: 1rpx solid #E0E0E0;
+
+				>view {
+					width: 200rpx;
+					line-height: 70rpx;
+					text-align: center;
+					color: #333;
+					font-size: 29rpx;
+				}
+
+				.checkView {
+					color: #0183FA;
+				}
+			}
+
+			.check-for-max-box {
+				flex: 1;
+				display: flex;
+				flex-direction: column;
+				overflow-y: scroll;
+				background-color: #fff;
+
+				>view {
+					>view {
+						font-size: 32rpx;
+						line-height: 70rpx;
+						margin: 0 21rpx;
+						border-bottom: 1px solid #dedede;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 0 - 27
pages_safetyCheck/views/demo/index.vue

@@ -1,27 +0,0 @@
-<template>
-	<view class="pages_safetyCheck">
-		pages_safetyCheck
-	</view>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				
-			}
-		},
-		onLoad(option) {
-			
-		},
-		methods: {
-			
-		}
-	}
-</script>
-
-<style lang="stylus" scoped>
-	.pages_safetyCheck{
-		
-	}
-</style>

Fichier diff supprimé car celui-ci est trop grand
+ 1208 - 0
pages_safetyCheck/views/inspectManage/conductInspections.vue


+ 207 - 0
pages_safetyCheck/views/inspectManage/hiddenDangerRecord.vue

@@ -0,0 +1,207 @@
+<!-- 隐患记录 -->
+<template>
+	<view class="hiddenDangerRecord">
+		<scroll-view scroll-y @scrolltolower="scrollGet" class="info-max-box">
+			<view class="tip">此检查项在当前实验室累计出现 {{total}} 次隐患</view>
+			<view class="list">
+				<view class="list-li" v-for="(item,index) in dataList" @click="clickInfo(item)">
+					<view>{{item.flagType==1?'检查时间':'上报时间'}}</view>
+					<view>{{item.checkTime}}
+						<img :src="imagesUrl('commonality/icon_wd_gd@1x.png')">
+					</view>
+				</view>
+			</view>
+			<view class="get-data-null-p" v-if="getDataType">- 没有更多数据 -</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import {
+		config
+	} from '@/api/request/config.js'
+	import {} from '@/pages/api/index.js'
+	import {
+		securityAppCheckDangerGetCheckDangerBySub
+	} from '@/pages_safetyCheck/api/index.js'
+	export default {
+		name: "hiddenDangerRecord",
+		components: {
+
+		},
+		data() {
+			return {
+				baseUrl: config.base_url,
+				pageType: 0,
+				// 查询参数
+				queryParams: {
+					page: 1,
+					pageSize: 20,
+				},
+				total:0,
+				getDataType: false,
+				optionData:null,
+				dataList: [{
+						name: '检查时间',
+						time: '2024-09-06',
+					},
+					{
+						name: '检查时间',
+						time: '2024-09-06',
+					},
+					{
+						name: '检查时间',
+						time: '2024-09-06',
+					},
+				]
+
+			}
+		},
+		onLoad(option) {
+			let optionData = JSON.parse(decodeURIComponent(option.infoData));
+			uni.setNavigationBarTitle({
+				title: optionData.subName + '(' + (optionData.pageType == 0 ? (optionData.roomNum?optionData.roomNum:'-') : (optionData
+					.subRoom?optionData
+					.subRoom:'-')) + ')'
+			})
+			this.$set(this, 'optionData', optionData);
+		},
+		onShow() {
+
+		},
+		mounted() {
+			this.getList();
+		},
+		methods: {
+			//滚动事件
+			scrollGet() {
+				let self = this;
+				if (self.total / self.queryParams.pageSize <= self.queryParams.page) {
+					this.$set(this, 'getDataType', true);
+				} else {
+					this.queryParams.page += 1;
+					this.$nextTick(() => {
+						this.getList();
+					})
+				}
+			},
+			clickInfo(row){
+				let infoData = this.optionData;
+				
+				if(row.flagType==1){
+					//检查时间
+					infoData.checkPlanSetVoList.planId=row.planId;
+					infoData.checkPlanSetVoList.planSetId=row.planSetId;
+					infoData.manageId=row.manageId;
+					infoData.setOptionId=row.setOptionId;
+					infoData.subId=row.subId;
+					infoData.hazardCheckPro=row.hazardCheckPro;
+					uni.navigateTo({
+						url: '/pages_safetyCheck/views/itemsManage/hiddenDangerItemsDetail?infoData=' +
+							encodeURIComponent(JSON
+								.stringify(infoData))
+					});
+				}else if(row.flagType==2){
+					//上报时间
+					let infoData=this.optionData;
+					uni.redirectTo({
+						url: '/pages_safetyCheck/views/snapshotManage/snapshotDetail?infoData=' + encodeURIComponent(JSON.stringify(infoData))
+					});
+				}
+			},
+			async getList() {
+				let self = this;
+				let obj = JSON.parse(JSON.stringify(this.queryParams))
+				obj.hazardCheckPro = this.optionData.hazardCheckPro;
+				obj.subId = this.optionData.subId;
+				const {
+					data
+				} = await securityAppCheckDangerGetCheckDangerBySub(obj);
+				if (data.code == 200) {
+					if (self.queryParams.page == 1) {
+						this.dataList = data.data.records;
+						this.total = data.data.total;
+						if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+							this.$set(this, 'getDataType', true);
+						}
+					} else {
+						this.dataList = [...this.dataList, ...data.data.records]
+						this.total = data.data.total;
+						if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+							this.$set(this, 'getDataType', true);
+						}
+					}
+				}
+			},
+
+
+		}
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.hiddenDangerRecord {
+		height: 100%;
+		display flex;
+
+		.tip {
+			width: 750rpx;
+			height: 80rpx;
+			background: rgba(255, 140, 0, 0.2);
+			border-radius: 0rpx 0rpx 0rpx 0rpx;
+			font-size: 30rpx;
+			color: #FF8C00;
+			line-height: 80rpx;
+			text-align: center;
+		}
+
+		.list {
+			width: 690rpx;
+			background: #FFFFFF;
+			border-radius: 20rpx 20rpx 20rpx 20rpx;
+			margin: 20rpx 30rpx 0;
+
+			.list-li {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				border-bottom: 1rpx solid #E0E0E0;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+
+				>view:nth-of-type(1) {
+					font-size: 30rpx;
+					color: #333333;
+					line-height: 100rpx;
+					text-align: left;
+				}
+
+				>view:nth-of-type(2) {
+					font-size: 28rpx;
+					color: #666666;
+					line-height: 100rpx;
+					text-align: left;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+
+					>img {
+						width: 24rpx;
+						height: 24rpx;
+						margin-left: 10rpx;
+					}
+				}
+			}
+
+			.list-li:last-of-type {
+				border: none;
+			}
+		}
+
+		.get-data-null-p {
+			height: 100rpx;
+			line-height: 100rpx;
+			text-align: center;
+		}
+	}
+</style>

+ 996 - 0
pages_safetyCheck/views/inspectManage/inspectAdd.vue

@@ -0,0 +1,996 @@
+<!-- 开始检查 -->
+<template>
+	<view class="inspectAdd">
+		<scroll-view scroll-y @scrolltolower="scrollGet" class="info-max-box">
+			<view class="tip">{{optionData.checkPlanSetVoList.checkName}}</view>
+			<view class="items">
+				<view class="items-t">
+					<view class="items-t-r">{{newData.hazardCheckCode}} {{newData.hazardCheckName}}</view>
+				</view>
+				<view class="items-b">< {{newData.hazardCheckCode2}} {{newData.hazardCheckName2}} <
+					{{newData.hazardCheckCode1}} {{newData.hazardCheckName1}}
+				</view>
+			</view>
+			<view class="items-number">此检查项在当前实验室累计出现<text>{{hazardCheckNum}}</text>次隐患</view>
+			<view class="list">
+				<view class="list-li" v-if="!form.checkFlag">
+					<view>检查隐患</view>
+					<view>
+					</view>
+				</view>
+				<textarea v-if="!form.checkFlag" class="describe" cursor-spacing="40" type="text"
+					v-model="form.hazardDescribe" maxlength="200" placeholder="请填写隐患描述"
+					placeholder-style="font-size:24rpx;color:#999;"></textarea>
+				<view v-if="!form.checkFlag" class="check-for-img-max-box">
+					<view class="left-title-p"></view>
+					<view class="right-img-box">
+						<view class="img-box" v-for="(imgUrl,imgIndex) in form.photoList" :key="imgIndex">
+							<img class="img-data" :src="baseUrl+imgUrl.fileUrl">
+							<img class="position-img" :src="imagesUrl('commonality/icon_ssp_closure.png')"
+								@click="delImg(imgIndex)">
+						</view>
+						<img class="add-button" :src="imagesUrl('commonality/img_ssp_pz@1x.png')"
+							@click="selectImage()" v-if="form.photoList.length<6">
+					</view>
+				</view>
+			</view>
+			<view class="voice">
+				<view class="voice_t">
+					<view class="voice_t_t" v-if="!form.voiceList[0]">语音备注:(选填)</view>
+					<view class="voice_t_b" v-if="form.voiceList[0]">语音备注:({{form.voiceList.length}})</view>
+				</view>
+				<view class="voice_b" v-if="form.voiceList[0]" v-for="(voiceItem,voiceIndex) in form.voiceList"
+					:key="voiceIndex">
+					<view class="voice_b_l" @tap="voicePlay(voiceItem.fileUrl)">
+						<img class="add-button" :src="imagesUrl('safetyCheck/icon_yybz_yy.png')" />
+						{{voiceItem.fileLength}}″
+					</view>
+					<img class="voice_b_r" :src="imagesUrl('safetyCheck/icon_yybz_sc.png')"
+						@tap="voiceDele('',voiceIndex)" />
+				</view>
+				<view class="voice-btn">
+					<img class="voice_t_r" :src="imagesUrl('commonality/icon_sskz_azsh.png')"
+						@longpress.stop="recordButton(item,$event)" @touchmove.stop="cancelButton"
+						@touchend.stop="sendButton(item,$event)" />
+					<text>按住说话</text>
+				</view>
+			</view>
+		</scroll-view>
+		<view class="sub-btn" v-if="newData.checkStatus !=1 && newData.checkSetProgress !=100">
+			<view @click="submitForm(1)">保存草稿</view>
+			<view @click="submitForm(2)">提交</view>
+		</view>
+		<view class="sub-btn-tow" v-if="newData.checkStatus ==1 && newData.checkSetProgress !=100" @click="submitForm(2)">提交</view>
+	</view>
+
+</template>
+
+<script>
+	const myaudio = uni.createInnerAudioContext();
+	import {
+		config
+	} from '@/api/request/config.js'
+	import {
+		securityAppCheckPlanCheckInfo,
+		securityAppCheckSetOptionCheckCommit,
+		securityDraftFindBySetOptionId,
+		securityAppCheckPhotoGetCheckNumBySub,
+	} from '@/pages_safetyCheck/api/index.js'
+	export default {
+		name: "inspectAdd",
+		components: {
+
+		},
+		data() {
+			return {
+				baseUrl: config.base_url,
+				form: {
+					checkFlag: false,
+					photoList: [],
+					voiceList: [],
+				},
+				newData: {},
+				radioList: [{
+						id: 1,
+						name: '符合',
+						checked: false,
+					},
+					{
+						id: 0,
+						name: '不符合',
+						checked: true,
+					},
+				],
+				pageType: '',
+				itemsStatus: '',
+				setOptionId: '', //检查项id
+				manageId: '', //检查管理id
+				subId: '',
+				hazardCheckPro: '',
+				hazardCheckNum: 0,
+				sendLock: true, //发送锁,当为true时上锁,false时解锁发送
+				recorderManager: wx.getRecorderManager(),
+				optionData: null,
+			}
+		},
+		onLoad(option) {
+			let optionData = JSON.parse(decodeURIComponent(option.infoData));
+			console.log('新增', optionData)
+			uni.setNavigationBarTitle({
+				title: optionData.subName + '(' + (optionData.pageType == 0 ? (optionData.roomNum ? optionData
+					.roomNum : '-') : (optionData
+					.subRoom ? optionData
+					.subRoom : '-')) + ')'
+			})
+			this.$set(this, 'pageType', optionData.pageType);
+			this.$set(this, 'itemsStatus', optionData.itemsStatus);
+
+			this.$set(this, 'setOptionId', optionData.setOptionId);
+			this.$set(this, 'manageId', optionData.manageId);
+			this.$set(this, 'subId', optionData.subId);
+			this.$set(this, 'hazardCheckPro', optionData.hazardCheckPro);
+			this.$set(this, 'optionData', optionData);
+
+		},
+		onShow() {
+
+		},
+		mounted() {
+			if (this.pageType == 0) {
+				
+				if(this.optionData.checkDraftVo){//检查中,已检查
+					if(this.optionData.checkDraftVo.checkStatus==2){//检查中
+						//保存草稿详情
+						this.securityDraftFindBySetOptionId();
+					}else{
+						//开始检查-提交的详情
+						this.securityAppCheckPlanCheckInfo();
+					}
+				}else{//待见擦汗
+					//开始检查-提交的详情
+					this.securityAppCheckPlanCheckInfo();
+				}
+			}
+			this.securityAppCheckPhotoGetCheckNumBySub();
+		},
+		methods: {
+			//折叠展开
+			inspectDot() {
+				this.newData.inspectDot = !this.newData.inspectDot
+			},
+			hiddenDangerClick(row) {
+				if (!this.hiddenDangerRecordStatus) {
+					let infoData = this.optionData;
+					infoData.hiddenDangerRecordStatus = true; //判断是否跳转隐患列表
+					uni.redirectTo({
+						url: '/pages_safetyCheck/views/inspectManage/hiddenDangerRecord?infoData=' +
+							encodeURIComponent(JSON.stringify(infoData))
+					});
+				}
+			},
+			//获取提交详情
+			async securityAppCheckPlanCheckInfo() {
+				let obj = {
+					setOptionId: this.setOptionId,
+					manageId: this.manageId,
+				}
+				const {
+					data
+				} = await securityAppCheckPlanCheckInfo(obj);
+				if (data.code == 200) {
+					data.data.inspectDot = true;
+					this.$set(this, 'newData', data.data);
+					//编辑的时候
+					this.$set(this.form, 'checkFlag', data.data.checkFlag ? data.data.checkFlag : false);
+					if (data.data.checkFlag) {
+						this.radioList[0].checked = true
+						this.radioList[1].checked = false
+					} else {
+						this.radioList[0].checked = false
+						this.radioList[1].checked = true
+					}
+
+					if (data.data.hazardDescribe) {
+						this.$set(this.form, 'hazardDescribe', data.data.hazardDescribe);
+					} else {
+						let list = [];
+						list = data.data.hazardCheckPoint.split('#');
+						this.$set(this.form, 'hazardDescribe', list[0]);
+					}
+					this.$set(this.form, 'photoList', data.data.photoList ? data.data.photoList : []);
+					this.$set(this.form, 'voiceList', data.data.voiceList ? data.data.voiceList : []);
+
+				}
+			},
+			//获取草稿详情
+			async securityDraftFindBySetOptionId() {
+				let obj = {
+					setOptionId: this.setOptionId,
+				}
+				const {
+					data
+				} = await securityDraftFindBySetOptionId(obj);
+				if (data.code == 200) {
+					//编辑的时候
+					data.data.inspectDot = true;
+					this.$set(this, 'newData', data.data);
+					this.$set(this.newData, 'checkPlanSetVoList', this.optionData.checkPlanSetVoList);
+					this.$set(this.form, 'checkFlag', data.data.checkFlag ? data.data.checkFlag : false);
+					if (data.data.checkFlag) {
+						this.radioList[0].checked = true
+						this.radioList[1].checked = false
+					} else {
+						this.radioList[0].checked = false
+						this.radioList[1].checked = true
+					}
+					if (data.data.hazardDescribe) {
+						this.$set(this.form, 'hazardDescribe', data.data.hazardDescribe);
+					} else {
+						let list = [];
+						list = data.data.hazardCheckPoint.split('#');
+						this.$set(this.form, 'hazardDescribe', list[0]);
+					}
+					this.$set(this.form, 'photoList', data.data.photoList ? data.data.photoList : []);
+					this.$set(this.form, 'voiceList', data.data.voiceList ? data.data.voiceList : []);
+				}
+			},
+			//获取检查项在当前实验室出现的次数
+			async securityAppCheckPhotoGetCheckNumBySub() {
+				let obj = {
+					subId: this.subId,
+					hazardCheckPro: this.hazardCheckPro,
+				}
+				const {
+					data
+				} = await securityAppCheckPhotoGetCheckNumBySub(obj);
+				if (data.code == 200) {
+					this.$set(this, 'hazardCheckNum', data.data);
+
+				}
+			},
+			//提交
+			async submitForm(status) {
+
+				console.log(this.form.checkFlag)
+				if (!this.form.checkFlag) {
+					if (!this.form.hazardDescribe) {
+						uni.showToast({
+							title: '请填写隐患描述!',
+							icon: "none",
+							mask: true,
+							duration: 2000
+						});
+						return
+					}
+					if (!this.form.photoList[0] && !this.form.checkFlag) {
+						uni.showToast({
+							title: '请选择现场照片!',
+							icon: "none",
+							mask: true,
+							duration: 2000
+						});
+						return
+					}
+				} else {
+					this.$set(this.form, 'hazardDescribe', '');
+					this.$set(this.form, 'photoList', []);
+				}
+				let obj = {
+					checkFlag: this.form.checkFlag,
+					checkStatus: status == 1 ? 2 : 1,
+					hazardDescribe: this.form.hazardDescribe,
+					setOptionId: this.setOptionId,
+					photoList: this.form.photoList,
+					voiceList: this.form.voiceList,
+				}
+				const {
+					data
+				} = await securityAppCheckSetOptionCheckCommit(obj);
+				if (data.code == 200) {
+					if (status == 1) {
+						uni.showToast({
+							title: '保存成功!',
+							icon: "none",
+							mask: true,
+							duration: 2000
+						});
+					} else if (status == 2) {
+						uni.showToast({
+							title: '提交成功!',
+							icon: "none",
+							mask: true,
+							duration: 2000
+						});
+					}
+					let infoData = this.optionData;
+					infoData.itemsStatus = status == 1 ? 2 : 0;
+					uni.redirectTo({
+						url: '/pages_safetyCheck/views/itemsManage/hiddenDangerItemsDetail?infoData=' +
+							encodeURIComponent(JSON
+								.stringify(infoData))
+					});
+				}
+			},
+			//滚动事件
+			scrollGet() {},
+			//单选按钮
+			radioClick(d) {
+				let self = this;
+				d.checked = !d.checked
+				if (d.checked) {
+					//如果有选中的,循环把其他选中的取消
+					this.radioList.forEach(function(item) {
+						if (item.id == d.id) {
+							self.$set(self.form, 'checkFlag', item.id);
+						} else {
+							item.checked = false;
+						}
+					})
+				} else {
+
+				}
+
+			},
+			/******图片上传******/
+			selectImage() {
+				let self = this;
+				let photoMaxNun = 0;
+				if (this.form.photoList.length > 5) {
+					uni.showToast({
+						title: '最多上传6张图片',
+						icon: "none",
+						mask: true,
+						duration: 2000
+					});
+					return
+				}
+				photoMaxNun = 6 - this.form.photoList.length;
+				uni.chooseImage({
+					count: photoMaxNun,
+					sizeType: ["original", "compressed"],
+					sourceType: ["album", "camera"],
+					success: function(res) {
+						if (res.tempFilePaths[0]) {
+							res.tempFilePaths.forEach(function(item, index) {
+								self.uploadImg(item);
+							})
+						}
+					}
+				});
+			},
+			async uploadImg(tempFilePaths) {
+				var self = this;
+				uni.showLoading({
+					title: '上传中',
+					mask: true
+				});
+				uni.uploadFile({
+					url: config.base_url + '/system/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) {
+							this.form.photoList.push({
+								'fileUrl': res.data.url,
+								'fileName': res.data.name
+							});
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: "none",
+								mask: true,
+								duration: 2000
+							});
+						}
+					},
+					fail: err => {},
+					complete: () => {
+						uni.hideLoading()
+					}
+				});
+			},
+			//删除图片
+			delImg(minIndex) {
+				this.form.photoList.splice(minIndex, 1);
+				this.$forceUpdate();
+			},
+			/******语音备注  *******/
+			//语音备忘播放
+			async voicePlay(item) {
+				myaudio.src = config.base_url + item;
+				myaudio.play();
+			},
+			//语音备忘删除
+			async voiceDele(item, voiceIndex) {
+				let self = this;
+				uni.showModal({
+					title: '',
+					cancelColor: '#999999',
+					confirmColor: '#FF6E6E',
+					content: '确定删除此语音吗?',
+					success(res) {
+						if (res.confirm) {
+							console.log('用户点击确定')
+							self.form.voiceList.splice(voiceIndex, 1);
+							self.$forceUpdate();
+						} else if (res.cancel) {
+							console.log('用户点击取消')
+
+						}
+					}
+				})
+
+			},
+			//录制
+			recordButton(item, e) {
+				console.log("按下")
+				let self = this;
+				if (this.form.voiceList.length >= 5) {
+					uni.showToast({
+						title: '语音备忘最多只能上传5条',
+						icon: "none",
+						mask: true,
+						duration: 2000
+					});
+					return
+				}
+				this.liveType = true;
+				console.log('录制', e)
+				this.startPoint = e.touches[0]; //记录长按时开始点信息,后面用于计算上划取消时手指滑动的距离。
+				const options = {
+					duration: 60000,
+					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);
+				})
+				uni.showToast({
+					title: "正在录音,上划取消发送",
+					icon: "none",
+					duration: 60000 //先定义个60秒,后面可以手动调用wx.hideToast()隐藏
+				});
+				this.sendLock = false; //长按时是不上锁的。
+			},
+			//取消
+			cancelButton(e) {
+				console.log("移动")
+				let self = this;
+
+				this.liveType = false;
+				console.log('取消', e)
+				let moveLenght = e.touches[e.touches.length - 1].clientY - this.startPoint.clientY; //移动距离
+				if (Math.abs(moveLenght) > 50) {
+					uni.showToast({
+						title: "松开手指,取消发送",
+						icon: "none",
+						duration: 60000
+					});
+					this.sendLock = true; //触发了上滑取消发送,上锁
+				} else {
+					uni.showToast({
+						title: "正在录音,上划取消发送",
+						icon: "none",
+						duration: 60000
+					});
+					this.sendLock = false; //上划距离不足,依然可以发送,不上锁
+				}
+			},
+			//发送
+			sendButton(item, e) {
+				console.log("松开")
+				let self = this;
+
+				this.liveType = false;
+				console.log('发送', e)
+				uni.hideToast(); //结束录音、隐藏Toast提示框
+				this.recorderManager.stop(); //结束录音
+				this.recorderManager.onStop((res) => {
+
+					if (!this.sendLock) {
+
+						this.uploadVoice(item, res.duration, res.tempFilePath);
+					}
+					console.log('停止录音', res.tempFilePath)
+					console.log("sendLock", this.sendLock);
+				})
+			},
+			//上传MP3
+			async uploadVoice(item, times, tempFilePaths) {
+
+				var self = this;
+				uni.uploadFile({
+					url: config.base_url + '/system/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)
+							console.log(item)
+							let seconds = Math.round((parseInt(times) % (1000 * 60)) / 1000);
+							this.form.voiceList.push({
+								'fileLength': seconds,
+								'fileUrl': res.data.url,
+								'fileName': res.data.name
+							})
+							console.log(JSON.stringify(self.voice))
+							//self.textParseUrlIps(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: () => {}
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.inspectAdd {
+		height: 100%;
+		display flex;
+		box-sizing: border-box;
+		padding-bottom: 160rpx;
+		box-sizing: border-box;
+
+		#bgColor-A {
+			color: #FFD400;
+		}
+
+		#bgColor-B {
+			color: #FF8C00;
+		}
+
+		#bgColor-C {
+			color: #E11608;
+		}
+
+		.tip {
+			width: 750rpx;
+			height: 80rpx;
+			background: rgba(1, 131, 250, 0.2);
+			font-weight: normal;
+			font-size: 28rpx;
+			color: #0183FA;
+			line-height: 80rpx;
+			text-align: center;
+		}
+
+
+		.items {
+			width: 690rpx;
+			min-height: 165rpx;
+			background: #FFFFFF;
+			border-radius: 20rpx 20rpx 20rpx 20rpx;
+			margin: 20rpx 0 0 30rpx;
+
+			.items-li {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+				border-bottom: 1rpx solid #E0E0E0;
+
+				>view:nth-of-type(1) {
+					font-size: 30rpx;
+					color: #333333;
+					line-height: 80rpx;
+					text-align: left;
+				}
+
+				>view:nth-of-type(2) {
+					font-size: 28rpx;
+					color: #666666;
+					line-height: 80rpx;
+					text-align: left;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+				}
+			}
+
+			.items-t {
+				border-bottom: 1rpx solid #E0E0E0;
+				height: 80rpx;
+				display: flex;
+				justify-content: flex-start;
+				align-items: center;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+
+				.items-t-l {
+					width: 175rpx;
+					height: 50rpx;
+					background: #E11608;
+					border-radius: 50rpx 50rpx 50rpx 50rpx;
+					font-size: 30rpx;
+					color: #FFFFFF;
+					line-height: 50rpx;
+					text-align: center;
+					margin-right: 14rpx;
+				}
+
+				.items-t-r {
+					font-size: 30rpx;
+					color: #333333;
+					line-height: 42rpx;
+					text-align: left;
+				}
+			}
+
+			.items-b {
+				padding: 0 30rpx;
+				box-sizing: border-box;
+				height: 80rpx;
+				font-size: 28rpx;
+				color: #666666;
+				line-height: 80rpx;
+				text-align: left;
+			}
+		}
+
+		.items-number {
+			font-size: 24rpx;
+			color: #3D3D3D;
+			line-height: 34rpx;
+			text-align: right;
+			margin: 20rpx 60rpx 0 0;
+
+			>text {
+				font-size: 24rpx;
+				color: #FF0000;
+				line-height: 34rpx;
+				text-align: right;
+			}
+		}
+
+		.list {
+			width: 690rpx;
+			margin: 20rpx 30rpx 0;
+			background: #FFFFFF;
+			border-radius: 20rpx 20rpx 20rpx 20rpx;
+
+			.list-li {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+				border-bottom: 1rpx solid #E0E0E0;
+
+				>view:nth-of-type(1) {
+					font-size: 30rpx;
+					color: #333333;
+					line-height: 80rpx;
+					text-align: left;
+				}
+
+				>view:nth-of-type(2) {
+					font-size: 28rpx;
+					color: #666666;
+					line-height: 80rpx;
+					text-align: left;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+
+					>img {
+						width: 24rpx;
+						height: 12rpx;
+						margin-left: 10rpx;
+					}
+				}
+
+			}
+
+			.hidden-content {
+				width: 630rpx;
+				min-height: 200rpx;
+				background: #F5F5F5;
+				border-radius: 20rpx 20rpx 20rpx 20rpx;
+				margin: 20rpx 30rpx 0;
+				padding: 20rpx;
+				box-sizing: border-box;
+				font-size: 28rpx;
+				color: #666666;
+				line-height: 39rpx;
+				text-align: left;
+			}
+
+			.photo {
+				display: flex;
+				justify-content: flex-start;
+				flex-wrap: wrap;
+				margin-top: 20rpx;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+
+				>img {
+					width: 150rpx;
+					height: 150rpx;
+					border-radius: 10rpx 10rpx 10rpx 10rpx;
+					margin: 0 10rpx 10rpx 0;
+				}
+
+				>img:nth-of-type(4) {
+					margin-right: 0;
+				}
+			}
+
+			.describe {
+				width: 636rpx;
+				height: 180rpx;
+				border-radius: 10rpx 10rpx 10rpx 10rpx;
+				border: 1rpx solid #E0E0E0;
+				margin: 20rpx 0 0 28rpx;
+				padding: 12rpx 16rpx;
+				box-sizing: border-box;
+			}
+
+			.check-for-img-max-box {
+				margin: 20px 28rpx;
+
+				.left-title-p {
+					width: 100%;
+					text-align: left;
+					font-size: 30rpx;
+					font-family: PingFang SC-Medium, PingFang SC;
+					font-weight: 400;
+					color: #333333;
+					line-height: 80rpx;
+				}
+
+				.right-img-box {
+					display: flex;
+					justify-content: flex-start;
+					flex-wrap: wrap;
+
+					.img-box {
+						display inline-block;
+						height: 150rpx;
+						width: 150rpx;
+						position relative;
+						margin: 0 10rpx 20rpx 0;
+						border-radius 10rpx;
+						overflow hidden;
+
+						.img-data {
+							height: 150rpx;
+							width: 150rpx;
+						}
+
+						.position-img {
+							position absolute;
+							right: 0;
+							top: 0;
+							width: 36rpx;
+							height: 36rpx;
+						}
+					}
+
+					.img-box:nth-of-type(4n+4) {
+						margin-right: 0rpx;
+					}
+
+					.add-button {
+						margin: 0 0rpx 20rpx 0;
+						border-radius 10rpx;
+						overflow hidden;
+						display inline-block;
+						height: 150rpx;
+						width: 150rpx;
+					}
+				}
+			}
+
+			.list-li:last-of-type {
+				border: none;
+			}
+
+			.radio_group {
+				display: flex;
+				justify-content: flex-end;
+				padding: 32rpx 30rpx 22rpx 30rpx;
+				box-sizing: border-box;
+				border-bottom: 1rpx solid #E0E0E0;
+
+				.radio {
+					display: flex;
+					justify-content: flex-start;
+					align-items: center;
+
+					>img {
+						width: 30rpx;
+						height: 30rpx;
+						margin-right: 34rpx;
+					}
+
+					>text {
+						font-size: 30rpx;
+						color: #333333;
+						line-height: 42rpx;
+						text-align: left;
+					}
+				}
+
+				.radio:nth-of-type(1) {
+					margin-right: 54rpx;
+				}
+			}
+		}
+
+		/* 语音备注 */
+		.voice {
+			width: 690rpx;
+			min-height: 100rpx;
+			background: #FFFFFF;
+			border-radius: 20rpx 20rpx 20rpx 20rpx;
+			margin: 0rpx 30rpx;
+			padding: 0 30rpx;
+			box-sizing: border-box;
+			overflow: hidden;
+
+			.voice_t {
+				height: 100rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+
+				.voice_t_t {
+					width: 100%;
+					font-size: 30rpx;
+					font-family: PingFang SC-Medium, PingFang SC;
+					font-weight: 400;
+					color: #333333;
+					line-height: 100rpx;
+					text-align: center;
+				}
+
+				.voice_t_b {
+					width: 100%;
+					font-size: 30rpx;
+					font-family: PingFang SC-Medium, PingFang SC;
+					font-weight: 400;
+					color: #333333;
+					line-height: 100rpx;
+					text-align: left;
+				}
+			}
+
+			.voice_b {
+				display flex;
+				justify-content flex-start;
+				align-items center;
+				margin-bottom: 20rpx;
+
+				.voice_b_l {
+					width: 400rpx;
+					height: 40rpx;
+					background: #0183FA;
+					border-radius: 10rpx;
+					display flex;
+					justify-content flex-start;
+					align-items center;
+					font-size: 24rpx;
+					color: #FFFFFF;
+					line-height: 30rpx;
+					text-align: left;
+
+					>img {
+						width: 20rpx;
+						height: 20rpx;
+						margin-left: 16rpx;
+						margin-right: 20rpx;
+					}
+				}
+
+				.voice_b_r {
+					width: 28rpx;
+					height: 28rpx;
+					margin-left: 20rpx;
+				}
+			}
+
+			.voice-btn {
+				width: 150rpx;
+				height: 150rpx;
+				position: fixed;
+				right: 24rpx;
+				bottom: 176rpx;
+
+				>img {
+					width: 150rpx;
+					height: 150rpx;
+					position: absolute;
+				}
+
+				>text {
+					font-size: 24rpx;
+					color: #999999;
+					line-height: 30rpx;
+					text-align: center;
+					position: absolute;
+					top: 84rpx;
+					left: 26rpx;
+				}
+			}
+		}
+
+	}
+
+	.sub-btn {
+		display: flex;
+		justify-content: center;
+		position: fixed;
+		left: 30rpx;
+		bottom: 30rpx;
+
+		>view:nth-of-type(1) {
+			width: 345rpx;
+			height: 100rpx;
+			background: #FF8C00;
+			border-radius: 50rpx 0rpx 0rpx 50rpx;
+			font-size: 30rpx;
+			color: #FFFFFF;
+			line-height: 100rpx;
+			text-align: center;
+		}
+
+		>view:nth-of-type(2) {
+			width: 345rpx;
+			height: 100rpx;
+			background: #0183FA;
+			border-radius: 0rpx 50rpx 50rpx 0rpx;
+			font-size: 30rpx;
+			color: #FFFFFF;
+			line-height: 100rpx;
+			text-align: center;
+		}
+	}
+
+	.sub-btn-tow {
+		position: fixed;
+		left: 30rpx;
+		bottom: 30rpx;
+		width: 690rpx;
+		height: 100rpx;
+		background: #0183FA;
+		border-radius: 50rpx 50rpx 50rpx 50rpx;
+		font-size: 29rpx;
+		color: #FFFFFF;
+		line-height: 100rpx;
+		text-align: center;
+	}
+</style>

Fichier diff supprimé car celui-ci est trop grand
+ 1515 - 0
pages_safetyCheck/views/inspectManage/inspectList.vue


Fichier diff supprimé car celui-ci est trop grand
+ 1075 - 0
pages_safetyCheck/views/itemsManage/hiddenDangerItems.vue


Fichier diff supprimé car celui-ci est trop grand
+ 1065 - 0
pages_safetyCheck/views/itemsManage/hiddenDangerItemsDetail.vue


+ 225 - 0
pages_safetyCheck/views/itemsManage/hiddenDangerItemsSearch.vue

@@ -0,0 +1,225 @@
+<!-- 隐患项搜索 -->
+<template>
+	<view class="hiddenDangerItemsSearch">
+		<view class="header">
+			<view class="search">
+				<view class="search-r">
+					<img :src="imagesUrl('commonality/icon_aqjc_ss.png')" @click="searchBtn">
+					<input type="text" v-model="searchValue" placeholder="模糊搜索检查项" name="search" @confirm='searchBtn'
+						confirm-type='search' maxlength="50" placeholder-style="color: #333333;font-size:24rpx;">
+				</view>
+				<view class="cancel" @click="cancelBtn">取消</view>
+			</view>
+		</view>
+		<view class="list">
+			<view class="list-li" v-for="(item,index) in dataList" @click="confirm(item)">
+				{{item.hazardCheckCode}}{{item.hazardCheckName}}
+			</view>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	import {
+		config
+	} from '@/api/request/config.js'
+	import {
+		securityCheckOptionList,
+	} from '@/pages_safetyCheck/api/index.js'
+	export default {
+		name: "hiddenDangerItemsSearch",
+		components: {
+
+		},
+		data() {
+			return {
+				baseUrl: config.base_url,
+				pageType: 1,
+				checkOptionList: [],
+				dataList: [],
+				searchValue: '',
+				form: {},//接收上个页面传过来的参数
+
+			}
+		},
+		onLoad(option) {
+			if (option.form) {
+				this.form = JSON.parse(decodeURIComponent(option.form));
+				this.pageType=this.form.pageType;
+			}
+		},
+		onShow() {
+
+		},
+		mounted() {
+			this.treeselect();
+		},
+		methods: {
+			//滚动事件
+			scrollGet() {},
+			//实验室搜索
+			searchBtn() {
+				this.dataList = [];
+				this.treeselect();
+			},
+			//取消
+			cancelBtn() {
+				this.searchValue = '';
+				this.dataList = [];
+				this.treeselect();
+			},
+			confirm(row) {
+				this.$set(this.form, "hazardCheckId1", row.hazardCheckId1)
+				this.$set(this.form, "hazardCheckName1", row.hazardCheckName1)
+				this.$set(this.form, "hazardCheckCode1", row.hazardCheckCode1)
+				this.$set(this.form, "hazardCheckId2", row.hazardCheckId2)
+				this.$set(this.form, "hazardCheckName2", row.hazardCheckName2)
+				this.$set(this.form, "hazardCheckCode2", row.hazardCheckCode2)
+				this.$set(this.form, "hazardCheckId", row.hazardCheckId)
+				this.$set(this.form, "hazardCheckName", row.hazardCheckName)
+				this.$set(this.form, "hazardCheckCode", row.hazardCheckCode)
+				this.$set(this.form, "hazardCheckPoint", row.hazardCheckPoint)
+				if(this.pageType==1){
+					//随手拍进入
+					uni.redirectTo({
+						url: '/pages_safetyCheck/views/snapshotManage/snapshotList?form=' + encodeURIComponent(JSON.stringify(this.form))
+					});
+				}else if(this.pageType==2){
+					//隐患项列表进入
+					uni.redirectTo({
+						url: '/pages_safetyCheck/views/itemsManage/hiddenDangerItems?infoData=' + encodeURIComponent(JSON.stringify(this.form))
+					});
+				}
+				
+			},
+
+			async treeselect() {
+				let self = this;
+				const {
+					data
+				} = await securityCheckOptionList({
+					searchValue: this.searchValue
+				});
+				if (data.code == 200) {
+					let list = [];
+					data.data.forEach(function(item) {
+						item.children.forEach(function(item2) {
+							item2.children.forEach(function(item3) {
+								list.push({
+									hazardCheckId1: item.id,
+									hazardCheckName1: item.name,
+									hazardCheckCode1: item.code,
+									hazardCheckId2: item2.id,
+									hazardCheckName2: item2.name,
+									hazardCheckCode2: item2.code,
+									hazardCheckId: item3.id,
+									hazardCheckName: item3.name,
+									hazardCheckCode: item3.code,
+									hazardCheckPoint: item3.mainPoint
+								})
+							})
+						})
+					})
+					this.dataList = list
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.hiddenDangerItemsSearch {
+		height: 100%;
+		display flex;
+		box-sizing: border-box;
+
+		#totalColor-A {
+			color: #0183FA;
+			background: rgba(1, 131, 250, 0.2);
+		}
+
+		#totalColor-B {
+			color: #16B531;
+			background: rgba(22, 181, 49, 0.2);
+		}
+
+		#totalColor-C {
+			color: #FF8C00;
+			background: rgba(255, 140, 0, 0.2);
+		}
+
+		.header {
+			width: 100%;
+			position: fixed;
+			top: 0rpx;
+			z-index: 100;
+			background: #fff;
+
+			.search {
+				width: 750rpx;
+				height: 100rpx;
+				background: #FFFFFF;
+				border-radius: 0rpx 0rpx 0rpx 0rpx;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+
+				.search-r {
+					width: 610rpx;
+					height: 60rpx;
+					background: #FFFFFF;
+					border-radius: 50rpx 50rpx 50rpx 50rpx;
+					border: 1rpx solid #E0E0E0;
+					font-size: 24rpx;
+					color: #999999;
+					line-height: 60rpx;
+					text-align: left;
+					display: flex;
+					justify-content: flex-start;
+					align-items: center;
+					padding: 0 20rpx;
+					box-sizing: border-box;
+
+					>img {
+						width: 30rpx;
+						height: 30rpx;
+						margin-right: 20rpx;
+					}
+
+					>input {
+						width: 500rpx;
+					}
+				}
+			}
+
+			.cancel {
+				font-size: 28rpx;
+				color: #0183FA;
+				line-height: 30rpx;
+				text-align: left;
+				margin-left: 18rpx;
+			}
+		}
+
+		.list {
+			width: 750rpx;
+			background: #FFFFFF;
+			margin-top: 110rpx;
+			padding-top: 12rpx;
+			box-sizing: border-box;
+
+			.list-li {
+				min-height: 80rpx;
+				margin: 0 30rpx;
+				font-size: 29rpx;
+				color: #3D3D3D;
+				line-height: 80rpx;
+				text-align: left;
+				border-bottom: 1rpx solid #E0E0E0;
+			}
+		}
+
+
+	}
+</style>

Fichier diff supprimé car celui-ci est trop grand
+ 1011 - 0
pages_safetyCheck/views/itemsManage/hiddenDangerRectification.vue


+ 248 - 0
pages_safetyCheck/views/materialAttachments.vue

@@ -0,0 +1,248 @@
+<!-- 材料附件 -->
+<template>
+	<view class="materialAttachments">
+		<scroll-view scroll-y @scrolltolower="scrollGet" class="info-max-box">
+			<view class="list">
+				<view class="list-li" v-for="(item,index) in newData">
+					<img :src="imagesUrl('safetyCheck/icon_djc_wj.png')">
+					<view>{{item.fileName}}</view>
+					<view @click="attachmentPreview(item)">查看</view>
+				</view>
+			</view>
+		</scroll-view>
+	</view>
+
+</template>
+
+<script>
+	import {
+		config
+	} from '@/api/request/config.js'
+	import {
+		chemicalAppletGetStockDetail
+	} from '@/pages/api/index.js'
+	export default {
+		name: "materialAttachments",
+		components: {
+
+		},
+		data() {
+			return {
+				baseUrl: config.base_url,
+				pageType: 0,
+				newData: {},
+			}
+		},
+		onLoad(option) {
+			this.newData = JSON.parse(decodeURIComponent(option.infoData))
+
+		},
+		onShow() {
+
+		},
+		mounted() {
+
+		},
+		methods: {
+			//滚动事件
+			scrollGet() {},
+			// 将此函数添加到 methods 中
+			async attachmentPreview(item) {
+			  uni.showLoading({ title: '下载中' });
+			  const fileUrl = config.base_url + item.fileUrl;
+			
+			  // #ifdef H5
+			  try {
+			    const response = await new Promise((resolve, reject) => {
+			      uni.request({
+			        url: fileUrl,
+			        method: 'GET',
+			        header: { Authorization: uni.getStorageSync('token') },
+			        responseType: 'arraybuffer', // 核心:使用 arraybuffer
+			        success: resolve,
+			        fail: reject,
+			      });
+			    });
+			    // 检查响应状态
+			    if (response.statusCode !== 200) {
+			      throw new Error(`下载失败,状态码: ${response.statusCode}`);
+			    }
+			    // 从 arraybuffer 创建 Blob 对象
+			    const blob = new Blob([response.data], {
+			      type: response.header['content-type'] || 'application/octet-stream'
+			    });
+			    const blobUrl = URL.createObjectURL(blob);
+			    const link = document.createElement('a');
+			    link.href = blobUrl;
+			    // 提取文件名
+			    let filename = this.getFileNameFromResponse(response, fileUrl);
+			    link.download = filename;
+			    document.body.appendChild(link);
+			    link.click();
+			    document.body.removeChild(link);
+			    URL.revokeObjectURL(blobUrl);
+			    uni.hideLoading();
+			  } catch (error) {
+			    console.error('下载失败:', error);
+			    uni.hideLoading();
+			    uni.showToast({ title: '下载失败', icon: 'none' });
+			  }
+			  // #endif
+				// #ifdef MP-WEIXIN
+				uni.downloadFile({
+					url: config.base_url + item.fileUrl,
+					header: {
+						Authorization: uni.getStorageSync('token')
+					},
+					success: function(res) {
+						uni.hideLoading();
+						const filePath = res.tempFilePath
+						wx.openDocument({
+							filePath: filePath,
+							success: function(res) {
+								console.log('打开文档成功')
+							}
+						})
+					},
+					fail: function(res) {
+						uni.hideLoading();
+						uni.showToast({
+							title: '下载失败',
+							icon: "none",
+							mask: true,
+							duration: 2000
+						});
+					}
+				})
+				// #endif
+			},
+			// 辅助函数:从响应头或 URL 中解析文件名
+			getFileNameFromResponse(response, fallbackUrl) {
+			  // 1. 从 Content-Disposition 响应头解析
+			  const contentDisposition = response.header['content-disposition'];
+			  if (contentDisposition) {
+			    // 匹配 filename*=UTF-8''encoded_filename 格式
+			    let match = contentDisposition.match(/filename\*=UTF-8''([^;]+)/i);
+			    if (match && match[1]) {
+			      return decodeURIComponent(match[1]);
+			    }
+			    // 匹配 filename="filename.pdf" 格式
+			    match = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/i);
+			    if (match && match[1]) {
+			      let filename = match[1].replace(/['"]/g, '');
+			      try {
+			        return decodeURIComponent(filename);
+			      } catch (e) {
+			        return filename;
+			      }
+			    }
+			  }
+			  // 2. 后备方案:从 URL 中提取
+			  let urlParts = fallbackUrl.split('/');
+			  let filename = urlParts[urlParts.length - 1].split('?')[0];
+			  // 3. 如果 URL 中也没有文件名,则根据 MIME 类型生成默认名
+			  if (!filename || filename === '') {
+			    const mimeToExt = {
+			      'application/pdf': '.pdf',
+			      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx',
+			      'application/vnd.openxmlformats-officedocument.wordprocessingml.document': '.docx',
+			    };
+			    const contentType = response.header['content-type'];
+			    const extension = mimeToExt[contentType] || '.bin';
+			    filename = `download_${Date.now()}${extension}`;
+			  }
+			  return filename;
+			},
+			// attachmentPreview(item) {
+			// 	uni.showLoading({
+			// 		title: '下载中'
+			// 	});
+			// 	uni.downloadFile({
+			// 		url: config.base_url + item.fileUrl,
+			// 		header: {
+			// 			Authorization: uni.getStorageSync('token')
+			// 		},
+			// 		success: function(res) {
+			// 			uni.hideLoading();
+			// 			// #ifdef MP-WEIXIN
+			// 			const filePath = res.tempFilePath
+			// 			wx.openDocument({
+			// 				filePath: filePath,
+			// 				success: function(res) {
+			// 					console.log('打开文档成功')
+			// 				}
+			// 			})
+			// 			// #endif
+			// 		},
+			// 		fail: function(res) {
+			// 			uni.hideLoading();
+			// 			uni.showToast({
+			// 				title: '下载失败',
+			// 				icon: "none",
+			// 				mask: true,
+			// 				duration: 2000
+			// 			});
+			// 		}
+			// 	})
+			// },
+		}
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.materialAttachments {
+		height: 100%;
+		display flex;
+		box-sizing: border-box;
+		padding: 0 30rpx;
+		box-sizing: border-box;
+	
+	.list {
+			width: 690rpx;
+			background: #FFFFFF;
+			border-radius: 20rpx 20rpx 20rpx 20rpx;
+			padding: 0 30rpx;
+			box-sizing: border-box;
+			margin-bottom: 20rpx;
+			margin-top: 20rpx;
+
+			.list-li {
+				height: 100rpx;
+				border-bottom: 1rpx solid #E0E0E0;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+
+				>img {
+					width: 30rpx;
+					height: 30rpx;
+					margin-right: 16rpx;
+				}
+
+				>view:nth-of-type(1) {
+					flex: 1;
+					font-size: 28rpx;
+					color: #333333;
+					line-height: 39rpx;
+					text-align: left;
+					overflow: hidden;
+					text-overflow: ellipsis;
+					white-space: nowrap;
+					margin-right: 56rpx;
+				}
+
+				>view:nth-of-type(2) {
+					font-size: 28rpx;
+					color: #0183FA;
+					line-height: 39rpx;
+					text-align: left;
+				}
+			}
+
+			.list-li:last-of-type {
+				border: none;
+			}
+		}
+
+	}
+</style>

+ 210 - 0
pages_safetyCheck/views/newScanCodeCheck.vue

@@ -0,0 +1,210 @@
+<template>
+	<view class="shade">
+		<view class="null-box" @click="dialogClose()"></view>
+		<view class="shade_n">
+			<view class="title">
+				<view>请选择实验室222</view>
+			</view>
+			<view class="batch">
+				<view class="batch-li" @click="batchClick(item)" v-for="(item,index) in batchList">
+					<view class="batch-li-l">
+						<text>{{item.planTitle}}-{{item.checkName}}</text>
+						<text>{{item.subName}}{{item.roomNum?'('+item.roomNum+')':''}}</text>
+					</view>
+					<view class="batch-li-r">
+						<img :src="imagesUrl('commonality/icon_wd_gd@1x.png')">
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		securityAppCheckManageList,
+		securityAppCheckSetOptionList,
+		securityAppCheckPlanScanCode,
+	} from '@/pages_safetyCheck/api/index.js'
+	import {
+		config
+	} from '@/api/request/config.js'
+	export default {
+		name: "iotControl",
+		props: {
+			subjectData: {},
+		},
+		data() {
+			return {
+				newData:{},
+				batchList: [],
+				checkCategory: null,
+			}
+		},
+		created() {
+			
+		},
+		mounted() {
+			this.$set(this, 'batchList', this.subjectData);
+			// this.securityAppCheckPlanScanCode();
+		},
+		methods: {
+			dialogClose() {
+				this.$parent.goPage('securityCheck',false);
+			},
+			batchClick(row) {
+				let infoData = row;
+				infoData.pageType = 0;
+				uni.navigateTo({
+					url: '/pages_safetyCheck/views/itemsManage/hiddenDangerItems?infoData=' + encodeURIComponent(
+						JSON.stringify(infoData))
+				});
+			},
+			//查询计划
+			async securityAppCheckPlanScanCode() {
+				let self = this;
+				let obj = {
+					subId:this.newData.subId,
+					checkCategory:this.checkCategory,
+				};
+				if(this.newData.planSetId){
+					obj.planSetId = this.newData.planSetId;
+				}
+				const {
+					data
+				} = await securityAppCheckPlanScanCode(obj);
+				if (data.code == 200) {
+					if(data.data[0]){
+						if(data.data[1]){
+							//多个
+							setTimeout(function() {
+							self.$set(self,'batchList',data.data);
+							}, 1000);
+						}else{
+							//单个
+							let infoData = data.data[0];
+							infoData.pageType = 0;
+							uni.navigateTo({
+								url: '/pages_safetyCheck/views/itemsManage/hiddenDangerItems?infoData=' + encodeURIComponent(
+									JSON.stringify(infoData))
+							});
+						}
+					}else{
+						//没有
+						uni.showToast({
+							title: '该实验室暂无检查计划!',
+							icon: "none",
+							mask: true,
+							duration: 2000
+						});
+						this.dialogClose();
+					}
+				}
+			},
+		},
+		onHide() {
+		
+		},
+		beforeDestroy() {
+			
+		},
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.shade {
+		height: 100%;
+		width: 100%;
+		position: fixed;
+		display: flex;
+		flex-direction: column;
+		z-index: 200;
+		background: rgba(0, 0, 0, 0.2);
+		top: 0;
+	
+		.null-box {
+			flex: 1;
+		}
+	
+		.shade_n {
+			position: absolute;
+			bottom: 0;
+			left: 0;
+			width: 750rpx;
+			height: 466rpx;
+			background: #FFFFFF;
+			border-radius: 20rpx 20rpx 0rpx 0rpx;
+			overflow-y: auto;
+	
+			.title {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 0 50rpx 0 284rpx;
+				box-sizing: border-box;
+				border-bottom: 1rpx solid #E0E0E0;
+	
+				>view {
+					font-size: 30rpx;
+					color: #3D3D3D;
+					line-height: 90rpx;
+					text-align: left;
+				}
+	
+				>img {
+					width: 24rpx;
+					height: 12rpx;
+				}
+			}
+	
+			.batch {
+				padding: 0 30rpx;
+				box-sizing: border-box;
+	
+				.batch-li {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					border-bottom: 1rpx solid #E0E0E0;
+					padding: 20rpx 0 16rpx 0rpx;
+					box-sizing: border-box;
+	
+					.batch-li-l {
+						>text:nth-of-type(1) {
+							display: block;
+							font-size: 30rpx;
+							color: #333333;
+							line-height: 42rpx;
+							text-align: left;
+						}
+	
+						>text:nth-of-type(2) {
+							display: block;
+							font-size: 28rpx;
+							color: #666666;
+							line-height: 39rpx;
+							text-align: left;
+							margin-top: 6rpx;
+						}
+					}
+	
+					.batch-li-r {
+						font-size: 28rpx;
+						color: #666666;
+						line-height: 39rpx;
+						text-align: left;
+						display: flex;
+						justify-content: flex-start;
+						align-items: center;
+	
+						>img {
+							width: 24rpx;
+							height: 24rpx;
+							margin-left: 9rpx;
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 357 - 0
pages_safetyCheck/views/planDetail.vue

@@ -0,0 +1,357 @@
+<!-- 计划详情 -->
+<template>
+	<view class="planDetail">
+		<view class="info-max-box" v-if="pageType">
+			<view class="title">
+				<view class="title-t">{{newData.planTitle}}</view>
+				<view class="title-b">
+					<view v-if="newData.checkCategory">
+						{{newData.checkCategory==1?'校院巡查':(newData.checkCategory==2?'学院自查':'')}}
+					</view>
+					<view v-if="newData.checkTypeName">{{newData.checkTypeName}}</view>
+					<view v-if="newData.crossCheck==1">交叉互检</view>
+				</view>
+			</view>
+			<view class="box">
+				<view class="content-li">
+					<view>检查周期</view>
+					<view>{{newData.cycleStartTime}}至{{newData.cycleEndTime}}</view>
+				</view>
+				<view class="content-li">
+					<view>检查范围</view>
+					<view>共 {{newData.subjectNum}} 间实验室</view>
+				</view>
+				<view class="content-li">
+					<view>检查组织</view>
+					<view>{{newData.checkGroupName}}</view>
+				</view>
+				<view class="content-li-tow" v-if="newData.checkDemand">
+					<view>检查要求</view>
+					<view>{{newData.checkDemand}}</view>
+				</view>
+			</view>
+			<view class="small-title" v-if="newData.uploadDtoList[0]" @click="attachmentClick(newData.uploadDtoList)">
+				<view>材料附件</view>
+				<view>
+					<text>{{newData.uploadDtoList.length}}个</text>
+					<img :src="imagesUrl('commonality/icon_wd_gd@1x.png')">
+				</view>
+			</view>
+			<view class="list" v-for="(item,index) in newData.checkPlanSetDtoList">
+				<view class="subscript">{{index+1}}</view>
+				<view class="list-li">
+					<view>{{item.checkName}}</view>
+					<view>进度 {{item.checkSetProgress}} %</view>
+				</view>
+				<view class="list-li">
+					<view>检查开始日期</view>
+					<view>{{item.checkStartTime}}</view>
+				</view>
+				<view class="list-li">
+					<view>检查结束日期</view>
+					<view>{{item.checkEndTime}}</view>
+				</view>
+				<view class="list-li">
+					<view>整改期限</view>
+					<view class="rectify-term">
+						<text class="rectify-term-l" v-if="item.overdueUnrectify==1">逾期未完成整改关闭实验室</text>
+						<text class="rectify-term-c" v-if="item.overdueUnrectify==1">丨</text>
+						<text class="rectify-term-r">{{item.rectifyDeadline}}</text>
+					</view>
+				</view>
+				<view class="list-li">
+					<view>检查依据</view>
+					<view>{{item.checkBasisIds == 0?'全部检查项目':item.checkBasisName}}</view>
+				</view>
+			</view>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	import {
+		config
+	} from '@/api/request/config.js'
+	import {
+		securityAppCheckPlanFindCheckPlan,
+	} from '@/pages_safetyCheck/api/index.js'
+	export default {
+		name: "planDetail",
+		components: {
+
+		},
+		data() {
+			return {
+				baseUrl: config.base_url,
+				pageType: false,
+				optionData: {},
+				newData: {},
+			}
+		},
+		onLoad(option) {
+			let optionData = JSON.parse(decodeURIComponent(option.infoData))
+			this.$set(this, 'optionData', optionData);
+		},
+		onShow() {
+
+		},
+		mounted() {
+			this.securityAppCheckPlanFindCheckPlan();
+		},
+		methods: {
+			//材料附件跳转
+			attachmentClick(row) {
+				let infoData = row;
+				uni.navigateTo({
+					url: '/pages_safetyCheck/views/materialAttachments?infoData=' + encodeURIComponent(JSON
+						.stringify(
+							infoData))
+				});
+			},
+			async securityAppCheckPlanFindCheckPlan() {
+				let self = this;
+				const {
+					data
+				} = await securityAppCheckPlanFindCheckPlan({
+					planId: this.optionData.planId
+				});
+				if (data.code == 200) {
+					this.$set(this, 'newData', data.data);
+					this.$set(this, 'pageType', true);
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.planDetail {
+		height: 100%;
+		display flex;
+		box-sizing: border-box;
+		padding: 20rpx 0;
+		overflow: hidden;
+
+		.info-max-box {
+			padding: 0 30rpx;
+			overflow-y: scroll;
+
+			.title {
+				width: 689rpx;
+				background: #FFFFFF;
+				border-radius: 20rpx;
+				padding: 20rpx 30rpx;
+				box-sizing: border-box;
+
+				.title-t {
+					font-size: 30rpx;
+					color: #333333;
+					line-height: 42rpx;
+					text-align: left;
+				}
+
+				.title-b {
+					display: flex;
+					justify-content: flex-start;
+					margin-top: 16rpx;
+
+					>view {
+						width: 130rpx;
+						height: 50rpx;
+						background: rgba(1, 131, 250, 0.2);
+						border-radius: 6rpx 6rpx 6rpx 6rpx;
+						font-size: 24rpx;
+						color: #0183FA;
+						line-height: 50rpx;
+						text-align: center;
+						margin-right: 14rpx;
+					}
+				}
+			}
+
+			.box {
+				width: 689rpx;
+				background: #FFFFFF;
+				border-radius: 20rpx 20rpx 20rpx 20rpx;
+				margin-top: 20rpx;
+				overflow: hidden;
+
+				.content-li:nth-child(1) {
+					border-top: none;
+				}
+
+				.content-li {
+					height: 80rpx;
+					border-top: 1rpx solid #E0E0E0;
+					display: flex;
+					justify-content: space-between;
+					padding: 0 30rpx;
+					box-sizing: border-box;
+
+					>view:nth-of-type(1) {
+						font-size: 30rpx;
+						color: #333333;
+						line-height: 80rpx;
+						text-align: left;
+						width: 200rpx;
+					}
+
+					>view:nth-of-type(2) {
+						font-size: 30rpx;
+						color: #666666;
+						line-height: 80rpx;
+						text-align: right;
+						overflow: hidden;
+						text-overflow: ellipsis;
+						white-space: nowrap;
+					}
+				}
+
+				.content-li-tow {
+					padding: 0 30rpx;
+					box-sizing: border-box;
+					margin-bottom: 20rpx;
+
+					>view:nth-of-type(1) {
+						font-size: 30rpx;
+						color: #333333;
+						line-height: 80rpx;
+						text-align: left;
+					}
+
+					>view:nth-of-type(2) {
+						word-break: break-all;
+						padding: 20rpx;
+						box-sizing: border-box;
+						width: 630rpx;
+						min-height: 160rpx;
+						background: #F5F5F5;
+						border-radius: 20rpx 20rpx 20rpx 20rpx;
+						font-size: 28rpx;
+						color: #666666;
+						line-height: 39rpx;
+						text-align: left;
+					}
+				}
+			}
+
+			.small-title {
+				display: flex;
+				justify-content: space-between;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+				margin-top: 20rpx;
+
+				>view:nth-of-type(1) {
+					font-size: 30rpx;
+					color: #333333;
+					line-height: 40rpx;
+					text-align: left;
+				}
+
+				>view:nth-of-type(2) {
+					display: flex;
+					justify-content: flex-start;
+					align-items: center;
+
+					>text {
+						font-size: 28rpx;
+						color: #0183FA;
+						line-height: 40rpx;
+						text-align: left;
+					}
+
+					>img {
+						width: 24rpx;
+						height: 24rpx;
+						margin-left: 12rpx;
+					}
+				}
+
+			}
+
+			.list {
+				width: 690rpx;
+				// height: 323rpx;
+				background: #FFFFFF;
+				border-radius: 20rpx 20rpx 20rpx 20rpx;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+				margin-top: 20rpx;
+				position: relative;
+
+				.subscript {
+					position: absolute;
+					left: 0;
+					top: 0;
+					width: 36rpx;
+					height: 36rpx;
+					background: #0183FA;
+					border-radius: 20rpx 0rpx 20rpx 0rpx;
+					font-size: 24rpx;
+					color: #FFFFFF;
+					line-height: 36rpx;
+					text-align: center;
+				}
+
+				.list-li {
+					border-bottom: 1rpx solid #E0E0E0;
+					display: flex;
+					justify-content: space-between;
+
+
+					>view:nth-of-type(1) {
+						font-size: 28rpx;
+						color: #333333;
+						line-height: 80rpx;
+						text-align: left;
+					}
+
+					>view:nth-of-type(2) {
+						font-size: 28rpx;
+						color: #666666;
+						line-height: 80rpx;
+						text-align: left;
+					}
+				}
+
+				.rectify-term {
+					.rectify-term-l {
+						font-size: 24rpx;
+						color: #FF8C00;
+						line-height: 34rpx;
+						text-align: left;
+					}
+
+					.rectify-term-c {
+						color: #666666;
+					}
+
+					.rectify-term-r {
+						font-size: 28rpx;
+						color: #666666;
+						line-height: 80rpx;
+						text-align: left;
+					}
+				}
+
+				.list-li:last-of-type {
+					border: none;
+				}
+			}
+
+			#color-A {
+				color: #FF8C00;
+			}
+
+			#color-B {
+				color: #0183FA;
+			}
+
+			#color-C {
+				color: #16B531;
+			}
+		}
+	}
+</style>

+ 737 - 0
pages_safetyCheck/views/safetyCheck.vue

@@ -0,0 +1,737 @@
+<!-- 计划列表 -->
+<template>
+	<view class="planDetail">
+		<view class="header">
+			<img class="header-bg" :src="imagesUrl('commonality/bg_1.png')">
+			<view class="tabTitle">
+				<view class="tabTitle_li" @tap="tabClick(index)" :key="index" v-for="(item,index) in tabText">
+					<view class="tabTitle_text">
+						<img :src="item.img">
+						<view
+							:id="curTab==index && curTab==0?'fontColor-A':(curTab==index && curTab==1?'fontColor-B':'')">
+							{{item.name}}
+						</view>
+						<view>{{item.title}}</view>
+					</view>
+					<view class="line"></view>
+					<view :class="{on:curTab==index}" class="tabTitle_across">
+						<img :src="imagesUrl('commonality/img_xyzc_bg@1x.png')">
+					</view>
+				</view>
+			</view>
+		</view>
+		<!-- 列表部分 -->
+		<scroll-view scroll-y @scrolltolower="scrollGet" class="for-max-box">
+			<view class="list">
+				<view class="list-li" @click="planClick(item)" v-for="(item,index) in dataList">
+					<img :src="imagesUrl('safetyCheck/icon_aqjc_jh@1x.png')">
+					<view>{{item.planTitle}}</view>
+					<img :src="imagesUrl('commonality/icon_wd_gd@1x.png')">
+				</view>
+			</view>
+			<view class="get-data-p" v-if="!getDataType">
+				<img class="get-data-img" :src="imagesUrl('safetyCheck/icon_aqjc_sl.png')">
+				<view class="get-data-text">上拉加载</view>
+			</view>
+			<view class="get-data-null-p" v-if="getDataType">- 没有更多数据 -</view>
+		</scroll-view>
+		<view class="subBtn">
+			<img class="subBtn-img" @click="saoCode()"
+				:src="imagesUrl('safetyCheck/icon_aqjc_saoma.png')">
+		</view>
+		<!-- 弹窗部分 -->
+		<view class="shade" v-if="dialogVisible">
+			<view class="null-box" @click="dialogClose()"></view>
+			<view class="shade_n">
+				<view class="title">
+					<view>检查批次</view>
+				</view>
+				<view class="batch">
+					<view class="batch-li" @click="batchClick(item)"
+						v-for="(item,index) in batchList.checkPlanSetVoList">
+						<view class="batch-li-l">
+							<text>{{item.checkName}}</text>
+							<text>开始检查日期:{{item.checkStartTime}}</text>
+						</view>
+						<view class="batch-li-r">检查进度{{item.checkSetProgress}}%
+							<img :src="imagesUrl('commonality/icon_wd_gd@1x.png')">
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="shade-box" v-if="securityCheck">
+			<view class="null-box" @click="goPage('securityCheck',false)"></view>
+			<view class="shade_n">
+				<view class="title">
+					<view>请选择实验室</view>
+				</view>
+				<view class="batch">
+					<view class="batch-li" @click="batchClickTow(item)" v-for="(item,index) in subjectData">
+						<view class="batch-li-l">
+							<text>{{item.planTitle}}-{{item.checkName}}</text>
+							<text>{{item.subName}}{{item.roomNum?'('+item.roomNum+')':''}}</text>
+						</view>
+						<view class="batch-li-r">
+							<img :src="imagesUrl('commonality/icon_wd_gd@1x.png')">
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	import {
+		config
+	} from '@/api/request/config.js'
+	import {
+		securityAppCheckPlanTitleList,
+	} from '@/pages_safetyCheck/api/index.js'
+	import {
+		securityAppCheckPlanScanCode,
+	} from '@/pages_safetyCheck/api/index.js'
+	import { pageScanCode } from '@/utils/scanTheCode'
+	export default {
+		name: "planDetail",
+		data() {
+			return {
+				pageType: 0,
+				tabText: [{
+						name: '校级检查',
+						title: '学校检查计划',
+						img: this.imagesUrl('safetyCheck/icon_aqjc_xjjc@1x.png'),
+					},
+					{
+						name: '学院自查',
+						title: '学院自查计划',
+						img: this.imagesUrl('safetyCheck/icon_aqjc_xxzc@1x.png'),
+					},
+					// {
+					// 	name: '现场检查',
+					// 	title: '检查隐患草稿',
+					// 	img: this.imagesUrl('safetyCheck/icon_aqjc_xcjc@1x.png'),
+					// },
+					{
+						name: '随手拍',
+						title: '隐患上报整改',
+						img: this.imagesUrl('safetyCheck/icon_aqjc_ssp@1x.png'),
+					},
+				],
+				//校级/院级
+				curTab: 0,
+				queryParams: {
+					page: 1,
+					pageSize: 20,
+					checkCategory: 1, //1校院巡查 2学院自查
+				},
+				total: 0,
+				dataList: [],
+				getDataType: false,
+				dialogVisible: false,
+				batchList: [],
+				batchData: {},
+				securityCheck:false,
+				subjectData: [],
+			}
+		},
+		onLoad(option) {
+			this.$set(this,'securityCheck',false)
+			this.getList()
+		},
+		onShow() {
+			this.acceptSaoCode();
+		},
+		onHide() {
+		  uni.$off('acceptSaoCode');
+		},
+		mounted() {
+
+		},
+		methods: {
+			//滚动加载事件
+			scrollGet() {
+				let self = this;
+				if (self.total / self.queryParams.pageSize <= self.queryParams.page) {
+					this.$set(this, 'getDataType', true);
+				} else {
+					this.queryParams.page += 1;
+					this.$nextTick(() => {
+						this.getList();
+					})
+				}
+			},
+			/******调用摄像头******/
+			saoCode() {
+				pageScanCode();
+			},
+			acceptSaoCode(){
+				let self = this;
+				uni.$on('acceptSaoCode', (codeData) => {
+					if (codeData.subId) {
+						self.securityAppCheckPlanScanCode(codeData.subId,self.planSetId);
+					} else {
+						uni.showToast({
+							title: '请扫描正确的二维码',
+							icon: "none",
+							mask: true,
+							duration: 2000
+						});
+					}
+				});
+			},
+			//查询计划
+			async securityAppCheckPlanScanCode(subId,planSetId) {
+				let self = this;
+				let checkCategory = null;
+				if(uni.getStorageSync('identityData')){
+					if(uni.getStorageSync('identityData').type=='collegeAdmin'){
+						checkCategory=2
+					}else if(uni.getStorageSync('identityData').type=='schoolAdmin'){
+						checkCategory=1
+					}
+				}
+				let obj = {
+					subId:subId,
+					checkCategory:checkCategory,
+				};
+				if(planSetId){
+					obj.planSetId = planSetId;
+				}
+				const {
+					data
+				} = await securityAppCheckPlanScanCode(obj);
+				if (data.code == 200) {
+					if(data.data[0]){
+						if(data.data[1]){
+							//多个
+							self.$set(self,'subjectData',data.data);
+							self.$set(self,'securityCheck',true);
+						}else{
+							//单个
+							let infoData = data.data[0];
+							infoData.pageType = 0;
+							uni.navigateTo({
+								url: '/pages_safetyCheck/views/itemsManage/hiddenDangerItems?infoData=' + encodeURIComponent(
+									JSON.stringify(infoData))
+							});
+						}
+					}else{
+						//没有
+						uni.showToast({
+							title: '该实验室暂无检查计划!',
+							icon: "none",
+							mask: true,
+							duration: 2000
+						});
+					}
+				}
+			},
+			batchClickTow(row) {
+				let infoData = row;
+				infoData.pageType = 0;
+				uni.navigateTo({
+					url: '/pages_safetyCheck/views/itemsManage/hiddenDangerItems?infoData=' + encodeURIComponent(
+						JSON.stringify(infoData))
+				});
+			},
+			//安全检查扫码控制显示隐藏
+			goPage(type,status) {
+				if (type == 'securityCheck') {
+					if(status){
+						this.$set(this, "securityCheck", true)
+					}else{
+						this.$set(this, "securityCheck", false)
+					}
+				} 
+			},
+			
+			//顶部tab点击
+			tabClick(index) {
+				this.$set(this.queryParams, 'page', 1);
+				this.$set(this, 'total', 0);
+
+				if (this.curTab != index) {
+					this.$set(this, 'dataList', []);
+					if (index == 0) {
+						//校级检查
+						this.$set(this, 'curTab', index);
+						this.$set(this.queryParams, 'checkCategory', 1);
+						this.getList()
+					} else if (index == 1) {
+						//学院自查
+						this.$set(this, 'curTab', index);
+						this.$set(this.queryParams, 'checkCategory', 2);
+						this.getList()
+					} else if (index == 2) {
+						//随手拍
+						uni.navigateTo({
+							url: "/pages_safetyCheck/views/snapshotManage/snapshotList",
+						});
+					}
+				}
+			},
+			//检查批次点击
+			batchClick(row) {
+				this.$set(this.batchData, 'checkPlanSetVoList', row);
+				this.$nextTick(() => {
+					uni.navigateTo({
+						url: '/pages_safetyCheck/views/inspectManage/inspectList?infoData=' +
+							encodeURIComponent(JSON.stringify(this.batchData))
+					});
+				})
+			},
+			planClick(row) {
+				if (row.checkPlanSetVoList.length > 1) {
+					this.$set(this, 'batchData', {
+						planId: row.planId,
+						planTitle: row.planTitle,
+						checkCategory: row.checkCategory,
+						checkTypeName: row.checkTypeName,
+						crossCheck: row.crossCheck,
+					});
+					this.$set(this, 'batchList', row);
+					this.dialogVisible = true;
+				} else {
+					//如果只有1个检查批次不弹窗
+					this.$set(this, 'batchData', {
+						planId: row.planId,
+						planTitle: row.planTitle,
+						checkCategory: row.checkCategory,
+						checkTypeName: row.checkTypeName,
+						crossCheck: row.crossCheck,
+						checkPlanSetVoList: row.checkPlanSetVoList[0]
+					});
+					this.$nextTick(() => {
+						uni.navigateTo({
+							url: '/pages_safetyCheck/views/inspectManage/inspectList?infoData=' +
+								encodeURIComponent(JSON.stringify(this.batchData))
+						});
+					})
+				}
+			},
+			dialogClose() {
+				this.dialogVisible = false;
+			},
+			async getList() {
+				let self = this;
+				const {
+					data
+				} = await securityAppCheckPlanTitleList(this.queryParams);
+				if (data.code == 200) {
+					if (self.queryParams.page == 1) {
+						this.dataList = data.data.records;
+						this.total = data.data.total;
+						if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+							this.$set(this, 'getDataType', true);
+						}
+					} else {
+						this.dataList = [...this.dataList, ...data.data.records]
+						this.total = data.data.total;
+						if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+							this.$set(this, 'getDataType', true);
+						}
+					}
+				}
+			},
+		},
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.planDetail {
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+
+		.header {
+			width: 100%;
+			height: 482rpx;
+			// position: fixed;
+			// top: 0rpx;
+			// z-index: 100;
+
+			.header-bg {
+				width: 750rpx;
+				height: 310rpx;
+				position: absolute;
+
+			}
+
+			.tabTitle {
+				width: 690rpx;
+				height: 242rpx;
+				background: #FFFFFF;
+				border-radius: 20rpx 20rpx 20rpx 20rpx;
+				display flex;
+				justify-content: flex-start;
+				align-items: center;
+				position: absolute;
+				left: 30rpx;
+				top: 208rpx;
+
+				.tabTitle_li {
+					height: 242rpx;
+					flex: 1;
+					position: relative;
+					text-align center;
+
+					.line {
+						width: 2rpx;
+						height: 20rpx;
+						background: #D8D8D8;
+						border-radius: 0rpx 0rpx 0rpx 0rpx;
+						position: absolute;
+						top: 40%;
+					}
+
+					.tabTitle_text {
+						display: flex;
+						justify-content: center;
+						flex-direction: column;
+						align-items: center;
+
+						>img {
+							width: 82rpx;
+							height: 82rpx;
+							margin-top: 44rpx;
+						}
+
+						>view:nth-of-type(1) {
+							font-size: 30rpx;
+							color: #333333;
+							line-height: 40rpx;
+							text-align: left;
+							margin-top: 8rpx;
+						}
+
+						>view:nth-of-type(2) {
+							font-size: 24rpx;
+							color: #666666;
+							line-height: 30rpx;
+							text-align: left;
+							margin-top: 6rpx;
+						}
+
+
+						position: relative;
+
+						&.on {}
+					}
+
+					.tabTitle_across {
+						/* width: 50rpx;
+						height: 4rpx;
+						background: #0183FA;
+						border-radius: 2rpx; */
+						margin-left: 38%;
+						margin-top: 37rpx;
+						display none;
+
+						>img {
+							width: 40rpx;
+							height: 26rpx;
+						}
+
+						&.on {
+							display block;
+						}
+					}
+
+				}
+
+			}
+		}
+
+		.for-max-box {
+			flex: 1;
+			overflow-y scroll;
+
+			.list {
+				width: 690rpx;
+				margin-left: 30rpx;
+				background: #FFFFFF;
+				border-radius: 20rpx 20rpx 20rpx 20rpx;
+
+				.list-li:nth-child(1) {
+					border-top: none;
+				}
+
+				.list-li {
+					border-top: 1rpx dashed #E0E0E0;
+					height: 100rpx;
+					display: flex;
+					justify-content: flex-start;
+					align-items: center;
+					padding: 0 30rpx;
+					box-sizing: border-box;
+
+					>view:nth-of-type(1) {
+						flex: 1;
+						font-size: 28rpx;
+						color: #333333;
+						line-height: 39rpx;
+						text-align: left;
+						margin: 0 52rpx 0 20rpx;
+						overflow: hidden;
+						text-overflow: ellipsis;
+						white-space: nowrap;
+					}
+
+					>img:nth-of-type(1) {
+						width: 42rpx;
+						height: 42rpx;
+					}
+
+					>img:nth-of-type(2) {
+						width: 24rpx;
+						height: 24rpx;
+					}
+
+				}
+			}
+
+			.get-data-p {
+				height: 100rpx;
+				text-align: center;
+
+				.get-data-img {
+					width: 30rpx;
+					height: 30rpx;
+					margin: 0 auto;
+					margin-top: 15rpx;
+				}
+
+				.get-data-text {
+					text-align: center;
+				}
+			}
+
+			.get-data-null-p {
+				height: 100rpx;
+				line-height: 100rpx;
+				text-align: center;
+			}
+		}
+
+		.shade {
+			height: 100%;
+			width: 100%;
+			position: fixed;
+			display: flex;
+			flex-direction: column;
+			z-index: 200;
+			background: rgba(0, 0, 0, 0.2);
+
+			.null-box {
+				flex: 1;
+			}
+
+			.shade_n {
+				position: absolute;
+				bottom: 0;
+				left: 0;
+				width: 750rpx;
+				height: 466rpx;
+				background: #FFFFFF;
+				border-radius: 20rpx 20rpx 0rpx 0rpx;
+				overflow-y: auto;
+
+				.title {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					padding: 0 50rpx 0 284rpx;
+					box-sizing: border-box;
+					border-bottom: 1rpx solid #E0E0E0;
+
+					>view {
+						font-size: 30rpx;
+						color: #3D3D3D;
+						line-height: 90rpx;
+						text-align: left;
+					}
+
+					>img {
+						width: 24rpx;
+						height: 12rpx;
+					}
+				}
+
+				.batch {
+					padding: 0 30rpx;
+					box-sizing: border-box;
+
+					.batch-li {
+						display: flex;
+						justify-content: space-between;
+						align-items: center;
+						border-bottom: 1rpx solid #E0E0E0;
+						padding: 20rpx 0 16rpx 0rpx;
+						box-sizing: border-box;
+
+						.batch-li-l {
+							>text:nth-of-type(1) {
+								display: block;
+								font-size: 30rpx;
+								color: #333333;
+								line-height: 42rpx;
+								text-align: left;
+							}
+
+							>text:nth-of-type(2) {
+								display: block;
+								font-size: 28rpx;
+								color: #666666;
+								line-height: 39rpx;
+								text-align: left;
+								margin-top: 6rpx;
+							}
+						}
+
+						.batch-li-r {
+							font-size: 28rpx;
+							color: #666666;
+							line-height: 39rpx;
+							text-align: left;
+							display: flex;
+							justify-content: flex-start;
+							align-items: center;
+
+							>img {
+								width: 24rpx;
+								height: 24rpx;
+								margin-left: 9rpx;
+							}
+						}
+					}
+				}
+			}
+		}
+
+		#fontColor-A {
+			color: #0040C1;
+		}
+
+		#fontColor-B {
+			color: #009519;
+		}
+
+		#bgColor-A {
+			color: #0183FA;
+			background: rgba(1, 131, 250, 0.2);
+		}
+
+		#bgColor-B {
+			color: #16B531;
+			background: rgba(22, 181, 49, 0.2);
+		}
+		.subBtn{
+			position: fixed;
+			bottom: 90rpx;
+			left: 295rpx;
+			z-index: 100;
+			.subBtn-img{
+				width: 160rpx;
+				height: 160rpx;
+			}
+		}
+		.shade-box {
+			height: 100%;
+			width: 100%;
+			position: fixed;
+			display: flex;
+			flex-direction: column;
+			z-index: 200;
+			background: rgba(0, 0, 0, 0.2);
+			top: 0;
+		
+			.null-box {
+				flex: 1;
+			}
+		
+			.shade_n {
+				position: absolute;
+				bottom: 0;
+				left: 0;
+				width: 750rpx;
+				height: 466rpx;
+				background: #FFFFFF;
+				border-radius: 20rpx 20rpx 0rpx 0rpx;
+				overflow-y: auto;
+		
+				.title {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					padding: 0 50rpx 0 284rpx;
+					box-sizing: border-box;
+					border-bottom: 1rpx solid #E0E0E0;
+		
+					>view {
+						font-size: 30rpx;
+						color: #3D3D3D;
+						line-height: 90rpx;
+						text-align: left;
+					}
+		
+					>img {
+						width: 24rpx;
+						height: 12rpx;
+					}
+				}
+		
+				.batch {
+					padding: 0 30rpx;
+					box-sizing: border-box;
+		
+					.batch-li {
+						display: flex;
+						justify-content: space-between;
+						align-items: center;
+						border-bottom: 1rpx solid #E0E0E0;
+						padding: 20rpx 0 16rpx 0rpx;
+						box-sizing: border-box;
+		
+						.batch-li-l {
+							>text:nth-of-type(1) {
+								display: block;
+								font-size: 30rpx;
+								color: #333333;
+								line-height: 42rpx;
+								text-align: left;
+							}
+		
+							>text:nth-of-type(2) {
+								display: block;
+								font-size: 28rpx;
+								color: #666666;
+								line-height: 39rpx;
+								text-align: left;
+								margin-top: 6rpx;
+							}
+						}
+		
+						.batch-li-r {
+							font-size: 28rpx;
+							color: #666666;
+							line-height: 39rpx;
+							text-align: left;
+							display: flex;
+							justify-content: flex-start;
+							align-items: center;
+		
+							>img {
+								width: 24rpx;
+								height: 24rpx;
+								margin-left: 9rpx;
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 217 - 0
pages_safetyCheck/views/scanCodeCheck.vue

@@ -0,0 +1,217 @@
+<template>
+	<view class="shade" v-if="pageType == 1">
+		<view class="null-box" @click="dialogClose()"></view>
+		<view class="shade_n">
+			<view class="title">
+				<view>请选择实验室</view>
+			</view>
+			<view class="batch">
+				<view class="batch-li" @click="batchClick(item)" v-for="(item,index) in batchList">
+					<view class="batch-li-l">
+						<text>{{item.planTitle}}-{{item.checkName}}</text>
+						<text>{{item.subName}}{{item.roomNum?'('+item.roomNum+')':''}}</text>
+					</view>
+					<view class="batch-li-r">
+						<img :src="imagesUrl('commonality/icon_wd_gd@1x.png')">
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		securityAppCheckManageList,
+		securityAppCheckSetOptionList,
+		securityAppCheckPlanScanCode,
+	} from '@/pages_safetyCheck/api/index.js'
+	import {
+		config
+	} from '@/api/request/config.js'
+	export default {
+		name: "iotControl",
+		props: {
+			subjectData: {},
+		},
+		data() {
+			return {
+				pageType:0,
+				newData:{},
+				batchList: [],
+				checkCategory: null,
+			}
+		},
+		created() {
+			
+		},
+		mounted() {
+			if(uni.getStorageSync('identityData')){
+				if(uni.getStorageSync('identityData').type=='collegeAdmin'){
+					this.checkCategory=2
+				}else if(uni.getStorageSync('identityData').type=='schoolAdmin'){
+					this.checkCategory=1
+				}
+			}
+			this.$set(this, 'newData', this.subjectData);
+			this.securityAppCheckPlanScanCode();
+		},
+		methods: {
+			dialogClose() {
+				this.$parent.goPage('securityCheck',false);
+			},
+			batchClick(row) {
+				let infoData = row;
+				infoData.pageType = 0;
+				uni.navigateTo({
+					url: '/pages_safetyCheck/views/itemsManage/hiddenDangerItems?infoData=' + encodeURIComponent(
+						JSON.stringify(infoData))
+				});
+			},
+			//查询计划
+			async securityAppCheckPlanScanCode() {
+				console.log('planSetId',this.newData)
+				let obj = {
+					subId:this.newData.subId,
+					checkCategory:this.checkCategory,
+				};
+				if(this.newData.planSetId){
+					obj.planSetId = this.newData.planSetId;
+				}
+				const {
+					data
+				} = await securityAppCheckPlanScanCode(obj);
+				if (data.code == 200) {
+					if(data.data[0]){
+						if(data.data[1]){
+							//多个
+							this.$set(this,'batchList',data.data);
+							this.$set(this,'pageType',1);
+						}else{
+							//单个
+							let infoData = data.data[0];
+							infoData.pageType = 0;
+							uni.navigateTo({
+								url: '/pages_safetyCheck/views/itemsManage/hiddenDangerItems?infoData=' + encodeURIComponent(
+									JSON.stringify(infoData))
+							});
+						}
+					}else{
+						//没有
+						uni.showToast({
+							title: '该实验室暂无检查计划!',
+							icon: "none",
+							mask: true,
+							duration: 2000
+						});
+						this.dialogClose();
+					}
+				}
+			},
+		},
+		onHide() {
+		
+		},
+		beforeDestroy() {
+			
+		},
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.shade {
+		height: 100%;
+		width: 100%;
+		position: fixed;
+		display: flex;
+		flex-direction: column;
+		z-index: 200;
+		background: rgba(0, 0, 0, 0.2);
+		top: 0;
+	
+		.null-box {
+			flex: 1;
+		}
+	
+		.shade_n {
+			position: absolute;
+			bottom: 0;
+			left: 0;
+			width: 750rpx;
+			height: 466rpx;
+			background: #FFFFFF;
+			border-radius: 20rpx 20rpx 0rpx 0rpx;
+			overflow-y: auto;
+	
+			.title {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 0 50rpx 0 284rpx;
+				box-sizing: border-box;
+				border-bottom: 1rpx solid #E0E0E0;
+	
+				>view {
+					font-size: 30rpx;
+					color: #3D3D3D;
+					line-height: 90rpx;
+					text-align: left;
+				}
+	
+				>img {
+					width: 24rpx;
+					height: 12rpx;
+				}
+			}
+	
+			.batch {
+				padding: 0 30rpx;
+				box-sizing: border-box;
+	
+				.batch-li {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					border-bottom: 1rpx solid #E0E0E0;
+					padding: 20rpx 0 16rpx 0rpx;
+					box-sizing: border-box;
+	
+					.batch-li-l {
+						>text:nth-of-type(1) {
+							display: block;
+							font-size: 30rpx;
+							color: #333333;
+							line-height: 42rpx;
+							text-align: left;
+						}
+	
+						>text:nth-of-type(2) {
+							display: block;
+							font-size: 28rpx;
+							color: #666666;
+							line-height: 39rpx;
+							text-align: left;
+							margin-top: 6rpx;
+						}
+					}
+	
+					.batch-li-r {
+						font-size: 28rpx;
+						color: #666666;
+						line-height: 39rpx;
+						text-align: left;
+						display: flex;
+						justify-content: flex-start;
+						align-items: center;
+	
+						>img {
+							width: 24rpx;
+							height: 24rpx;
+							margin-left: 9rpx;
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 672 - 0
pages_safetyCheck/views/snapshotManage/laboratorySearch.vue

@@ -0,0 +1,672 @@
+<!-- 实验室搜索 -->
+<template>
+	<view class="hiddenDangerItemsSearch">
+		<scroll-view scroll-y @scrolltolower="scrollGet" class="info-max-box">
+			<view class="header">
+				<view class="search">
+					<view class="search-r">
+						<img :src="imagesUrl('commonality/icon_aqjc_ss.png')" @click="searchBtn">
+						<input type="text" v-model="queryParams.searchValue" placeholder="学院单位、实验室名称或房间号" name="search"
+							@confirm='searchBtn' confirm-type='search' maxlength="50"
+							placeholder-style="color: #333333;font-size:24rpx;">
+						<view v-if="queryParams.searchValue" class="left-icons" @click="delSearchValue()">
+							<uni-icons color="#0183FA" type="clear" size="20"></uni-icons>
+						</view>
+					</view>
+					<view class="cancel" @click="cancelBtn()">取消</view>
+				</view>
+			</view>
+			<view class="list">
+				<view class="list-li" @click="listClick(item)" v-for="(item,index) in dataList">
+					<view class="list-li-t">
+						<img class="list-li-t-l" :src="imagesUrl('commonality/icon_aqjc_shiyanshi.png')">
+						<view class="list-li-t-c">{{item.subName}}</view>
+						<view class="list-li-t-r" :style="'border:1rpx solid '+item.classLevelColor+';background:'+item.classLevelColorTow+';'">
+							<text
+								:style="'border-right:1rpx solid '+item.classLevelColor+';color:'+item.classLevelColor+';'">{{item.classLevelName?item.classLevelName:''}}</text>
+							<text
+								:style="'color:'+item.classLevelColor+';'">{{item.classTypeNames?item.classTypeNames:''}}</text>
+						</view>
+					</view>
+					<view class="list-li-b">
+						<view class="list-li-b-t">
+							<img :src="imagesUrl('commonality/icon_sy_zc@1x.png')">
+							{{(laboratoryStatus==0 || laboratoryStatus==3)?(item.roomNum?item.roomNum:'-'):(item.subRoom?item.subRoom:'-')}}房间&{{item.buildName?item.buildName:''}}
+						</view>
+						<view class="list-li-b-b">
+							<view class="list-li-b-b-l">
+								<img :src="imagesUrl('commonality/icon_sy_zc@1x.png')">
+								{{item.deptName}}
+							</view>
+							<view  :class="item.manageStatus==2?'finished':'notFinished'" v-if="laboratoryStatus==0">
+								{{item.manageStatus==2?'已完成':'未完成'}}</view>
+						</view>
+					</view>
+			
+				</view>
+				<view class="get-data-null-p" v-if="getDataType">- 没有更多数据 -</view>
+			</view>
+			<!-- <view class="lab">
+				<view class="lab-info" @click="listClick(item)" v-for="(item,index) in dataList">
+					<img v-if="laboratoryStatus!=0" class="lab-info-l"
+						:src="imagesUrl('commonality/icon_aqjc_shiyanshi.png')">
+					<view :class="item.manageStatus==2?'finished':'notFinished'" v-if="laboratoryStatus==0">
+						{{item.manageStatus==2?'已完成':'未完成'}}
+					</view>
+					<view class="lab-info-c">
+						<view class="lab-info-c-t">
+							<view class="lab-info-c-t-l">{{item.subName}}</view>
+							<view class="lab-info-c-t-r"
+								:style="'border:1rpx solid '+item.levelColor+';background:'+item.levelColorTow+';'">
+								<text
+									:style="'border-right:1rpx solid '+item.levelColor+';color:'+item.levelColor+';'">{{item.levelName?item.levelName:''}}</text>
+								<text :style="'color:'+item.levelColor+';'">{{item.typeName?item.typeName:''}}</text>
+							</view>
+						</view>
+						<view class="lab-info-c-b">
+							<text
+								v-if="laboratoryStatus==0">{{item.roomNum?item.roomNum:'-'}}房间&{{item.buildName}}</text>
+							<text
+								v-if="laboratoryStatus==1 || laboratoryStatus==2">{{item.subRoom?item.subRoom:'-'}}房间&{{item.buildName}}</text>
+							<text>{{item.deptName}}</text>
+						</view>
+					</view>
+				</view>
+			</view> -->
+			
+
+		</scroll-view>
+	</view>
+
+</template>
+
+<script>
+	import {
+		config
+	} from '@/api/request/config.js'
+
+	import {
+		laboratorySubRelInfoSelectInfoByPage,
+	} from '@/api/commonality/permission.js'
+	import {
+		securityCheckOptionList,
+		laboratorySubRelInfoGetRelList,
+		securityAppCheckManageList,
+		securityAppCheckDangerReviewSubList,
+		securityAppCheckDangerGetCheckDangerSubList,
+	} from '@/pages_safetyCheck/api/index.js'
+	export default {
+		name: "hiddenDangerItemsSearch",
+		components: {
+
+		},
+		data() {
+			return {
+				baseUrl: config.base_url,
+				pageType: 1,
+				checkOptionList: [],
+				dataList: [],
+				searchValue: '',
+				form: {}, //接收上个页面传过来的参数
+				getDataType: false,
+				// 查询参数
+				queryParams: {
+					page: 1,
+					pageSize: 20,
+					searchValue: '',
+					subId: '',
+				},
+				total: 0,
+				laboratoryStatus: 0, // 0检查任务1复查验证2隐患整改 3从随手拍页面进入
+
+			}
+		},
+		onLoad(option) {
+			if (option.form) {
+				this.form = JSON.parse(decodeURIComponent(option.form));
+				console.log(this.form)
+				if (this.form.subId) {
+					this.queryParams.subId = this.form.subId
+				}
+				if (this.form.laboratoryStatus) {
+					this.laboratoryStatus = this.form.laboratoryStatus
+				}
+			}
+		},
+		onShow() {
+
+		},
+		mounted() {
+			this.getList();
+		},
+		methods: {
+			//滚动事件
+			scrollGet() {
+				let self = this;
+				if (self.total / self.queryParams.pageSize <= self.queryParams.page) {
+					this.$set(this, 'getDataType', true);
+				} else {
+					this.queryParams.page += 1;
+					this.$nextTick(() => {
+						this.getList();
+					})
+				}
+			},
+			//实验室搜索
+			searchBtn() {
+				this.dataList = [];
+				this.getList();
+			},
+			//清除输入框内容
+			delSearchValue() {
+				if (this.queryParams.searchValue) {
+					this.$set(this.queryParams, 'searchValue', '');
+					this.$set(this, 'dataList', []);
+					this.getList();
+				}
+			},
+			//级联等级
+			//取消
+			cancelBtn() {
+				let self = this;
+				/* self.queryParams.searchValue = '';
+				self.dataList = [];
+				self.getList(); */
+
+				if (this.form.laboratoryStatus == 0 || this.form.laboratoryStatus == 1 || this.form.laboratoryStatus ==
+					2) {
+					uni.redirectTo({
+						url: '/pages_safetyCheck/views/inspectManage/inspectList?infoData=' +
+							encodeURIComponent(
+								JSON.stringify(this.form))
+					});
+
+				} else if (this.form.laboratoryStatus == 3) { //从计划实验室列表返回
+					uni.redirectTo({
+						url: '/pages_safetyCheck/views/snapshotManage/snapshotList?form=' +
+							encodeURIComponent(JSON.stringify(this.form))
+					});
+
+				}
+
+
+			},
+			//十六进制颜色值和RGB格式转换
+			hexToRgb(hex, opacity = 1) {
+				// 去除#号
+				var color = hex.replace("#", "");
+				// 分割成红、绿、蓝三部分的16进制字符串
+				var red = parseInt(color.substring(0, 2), 16);
+				var green = parseInt(color.substring(2, 4), 16);
+				var blue = parseInt(color.substring(4, 6), 16);
+				return `RGB(${red}, ${green}, ${blue},${opacity})`;
+			},
+			listClick(item) {
+				if (this.form.laboratoryStatus == 0 || this.form.laboratoryStatus == 1 || this.form.laboratoryStatus ==
+					2) {
+					let infoData = {
+						...item,
+						...this.form
+					};
+					uni.redirectTo({
+						url: '/pages_safetyCheck/views/itemsManage/hiddenDangerItems?infoData=' +
+							encodeURIComponent(
+								JSON.stringify(infoData))
+					});
+				} else if (this.form.laboratoryStatus == 3) { //从计划实验室列表返回
+					this.$set(this.form, "subId", item.subId)
+					this.$set(this.form, "subName", item.subName)
+					this.$set(this.form, "subRoom", item.roomNum)
+					this.$set(this.form, "deptId", item.deptId)
+					this.$set(this.form, "deptName", item.deptName)
+					this.$set(this.form, "buildId", item.buildId)
+					this.$set(this.form, "buildName", item.buildName)
+					this.$set(this.form, "floorId", item.floorId)
+					this.$set(this.form, "floorName", item.floorName)
+					this.$set(this.form, "typeId", item.typeId)
+					this.$set(this.form, "classTypeNames", item.classTypeNames)
+					this.$set(this.form, "levelId", item.levelId)
+					this.$set(this.form, "classLevelName", item.classLevelName)
+					uni.redirectTo({
+						url: '/pages_safetyCheck/views/snapshotManage/snapshotList?form=' +
+							encodeURIComponent(JSON.stringify(this.form))
+					});
+				}
+
+
+			},
+
+			//搜索房间接口
+			async getList() {
+				let self = this;
+				let obj = JSON.parse(JSON.stringify(this.queryParams));
+				if (this.laboratoryStatus == 0) {
+					obj.planSetId = this.form.checkPlanSetVoList.planSetId;
+					obj.planId = this.form.checkPlanSetVoList.planId;
+					//检查计划
+					const {
+						data
+					} = await securityAppCheckManageList(obj);
+					if (data.code == 200) {
+
+						data.data.records.forEach(function(item) {
+							if (item.classLevelColor) {
+								item.classLevelColorTow = self.hexToRgb(item.classLevelColor, 0.2)
+							}
+
+						})
+						if (self.queryParams.page == 1) {
+							this.dataList = data.data.records;
+							this.total = data.data.total;
+							if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+								this.$set(this, 'getDataType', true);
+							}
+						} else {
+							this.dataList = [...this.dataList, ...data.data.records]
+							this.total = data.data.total;
+							if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+								this.$set(this, 'getDataType', true);
+							}
+						}
+
+					}
+				} else if (this.laboratoryStatus == 1) {
+					obj.planSetId = this.form.checkPlanSetVoList.planSetId;
+					obj.planId = this.form.checkPlanSetVoList.planId;
+					obj.userId = uni.getStorageSync('userId');
+					const {
+						data
+					} = await securityAppCheckDangerReviewSubList(obj);
+					if (data.code == 200) {
+						this.dataList = data.data;
+						this.$set(this, 'getDataType', true);
+					}
+				} else if (this.laboratoryStatus == 2) {
+					obj.planSetId = this.form.checkPlanSetVoList.planSetId;
+					obj.planId = this.form.checkPlanSetVoList.planId;
+					obj.userId = uni.getStorageSync('userId');
+					const {
+						data
+					} = await securityAppCheckDangerGetCheckDangerSubList(obj);
+					if (data.code == 200) {
+						this.dataList = data.data;
+						this.$set(this, 'getDataType', true);
+					}
+				} else if (this.laboratoryStatus == 3) {
+					const {
+						data
+					} = await laboratorySubRelInfoSelectInfoByPage(this.queryParams);
+					if (data.code == 200) {
+						if (data.data.records[0]) {
+							data.data.records.forEach(function(item) {
+								if (item.levelColor) {
+									item.classTypeNames = item.typeName
+									item.classLevelName = item.levelName
+									item.classLevelColor = item.levelColor
+									item.classLevelColorTow = self.hexToRgb(item.levelColor, 0.2)
+								}
+
+							})
+							if (self.queryParams.page == 1) {
+								this.dataList = data.data.records;
+								this.total = data.data.total;
+								if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+									this.$set(this, 'getDataType', true);
+								}
+							} else {
+								this.dataList = [...this.dataList, ...data.data.records]
+								this.total = data.data.total;
+								if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+									this.$set(this, 'getDataType', true);
+								}
+							}
+						} else {
+							uni.showToast({
+								title: '未找到相关实验室',
+								icon: "none",
+								mask: true,
+								duration: 2000
+							});
+						}
+					}
+				}
+
+			},
+
+		}
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.hiddenDangerItemsSearch {
+		height: 100%;
+		display flex;
+		overflow: hidden;
+
+		.info-max-box {}
+
+		#totalColor-A {
+			color: #0183FA;
+			background: rgba(1, 131, 250, 0.2);
+		}
+
+		#totalColor-B {
+			color: #16B531;
+			background: rgba(22, 181, 49, 0.2);
+		}
+
+		#totalColor-C {
+			color: #FF8C00;
+			background: rgba(255, 140, 0, 0.2);
+		}
+
+		.header {
+			width: 100%;
+			position: fixed;
+			top: 0rpx;
+			z-index: 100;
+			background: #fff;
+
+			.search {
+				width: 750rpx;
+				height: 100rpx;
+				background: #FFFFFF;
+				border-radius: 0rpx 0rpx 0rpx 0rpx;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+
+				.search-r {
+					width: 610rpx;
+					height: 60rpx;
+					background: #FFFFFF;
+					border-radius: 50rpx 50rpx 50rpx 50rpx;
+					border: 1rpx solid #E0E0E0;
+					font-size: 24rpx;
+					color: #999999;
+					line-height: 60rpx;
+					text-align: left;
+					display: flex;
+					justify-content: flex-start;
+					align-items: center;
+					padding: 0 20rpx;
+					box-sizing: border-box;
+
+					>img {
+						width: 30rpx;
+						height: 30rpx;
+						margin-right: 20rpx;
+					}
+
+					>input {
+						width: 500rpx;
+					}
+				}
+			}
+
+			.cancel {
+				font-size: 28rpx;
+				color: #0183FA;
+				line-height: 30rpx;
+				text-align: left;
+				margin-left: 18rpx;
+			}
+		}
+
+		.list {
+			width: 750rpx;
+			padding: 0 30rpx;
+			box-sizing: border-box;
+			margin-top: 120rpx;
+		
+			.list-li {
+				width: 690rpx;
+				min-height: 240rpx;
+				background: #FFFFFF;
+				border-radius: 10rpx 10rpx 10rpx 10rpx;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+				margin-top: 20rpx;
+				.list-li-t {
+					display: flex;
+					justify-content: flex-start;
+					align-items: center;
+					height: 90rpx;
+					border-bottom: 2rpx dashed #D8D8D8;
+		
+					.list-li-t-l {
+						width: 40rpx;
+						height: 40rpx;
+						margin-right: 16rpx;
+					}
+		
+					.list-li-t-c {
+						width: 264rpx;
+						font-size: 30rpx;
+						color: #333333;
+						line-height: 30rpx;
+						text-align: left;
+						overflow: hidden;
+						text-overflow: ellipsis;
+						white-space: nowrap;
+						margin-right: 24rpx;
+					}
+		
+					.list-li-t-r {
+						display: flex;
+						justify-content: flex-start;
+						border-radius: 10rpx 10rpx 10rpx 10rpx;
+						width: 200rpx;
+						height: 40rpx;
+						margin-left: 10rpx;
+		
+						>text {
+							display: inline-block;
+							flex: 1;
+							text-align: center;
+							font-size: 24rpx;
+							line-height: 40rpx;
+							text-align: center;
+							overflow: hidden;
+							text-overflow: ellipsis;
+							white-space: nowrap;
+						}
+					}
+				}
+		
+				.list-li-b {
+					overflow: hidden;
+					.list-li-b-t {
+						display: flex;
+						justify-content: flex-start;
+						align-items: center;
+		
+						>img {
+							width: 28rpx;
+							height: 26rpx;
+							margin-right: 16rpx;
+						}
+		
+						font-size: 28rpx;
+						color: #666666;
+						line-height: 30rpx;
+						text-align: left;
+						margin-top: 32rpx;
+						overflow: hidden;
+						text-overflow: ellipsis;
+						white-space: nowrap;
+		
+					}
+		
+					.list-li-b-b {
+						display: flex;
+						justify-content: space-between;
+						align-items: center;
+						margin-top: 20rpx;
+		
+						.list-li-b-b-l {
+							display: flex;
+							justify-content: flex-start;
+							align-items: center;
+		
+							>img {
+								width: 28rpx;
+								height: 26rpx;
+								margin-right: 16rpx;
+							}
+		
+							font-size: 28rpx;
+							color: #666666;
+							line-height: 30rpx;
+							text-align: left;
+							overflow: hidden;
+							text-overflow: ellipsis;
+							white-space: nowrap;
+						}
+		
+						.finished {
+							width: 110rpx;
+							height: 40rpx;
+							background: rgba(1,131,250,0.2);
+							border-radius: 20rpx 20rpx 20rpx 20rpx;
+							font-size: 24rpx;
+							color: #0183FA;
+							line-height: 40rpx;
+							text-align: center;
+						}
+		
+						.notFinished {
+							width: 110rpx;
+							height: 40rpx;
+							background: #E0E0E0;
+							border-radius: 20rpx 20rpx 20rpx 20rpx;
+							font-size: 24rpx;
+							color: #666666;
+							line-height: 40rpx;
+							text-align: center;
+						}
+					}
+				}
+			}
+		}
+		.get-data-null-p {
+			height: 100rpx;
+			line-height: 100rpx;
+			text-align: center;
+		}
+		.lab {
+			margin-top: 120rpx;
+
+			.lab-info {
+				background: #FFFFFF;
+				display: flex;
+				justify-content: space-between;
+				border: 2rpx dashed #D8D8D8;
+
+
+				.lab-info-l {
+					width: 80rpx;
+					height: 80rpx;
+					background: #0183FA;
+					border-radius: 10rpx 10rpx 10rpx 10rpx;
+					margin-left: 30rpx;
+					margin-top: 30rpx;
+					margin-bottom: 42rpx;
+				}
+
+				.finished {
+					width: 90rpx;
+					height: 90rpx;
+					background: #0183FA;
+					border-radius: 100rpx 100rpx 100rpx 100rpx;
+					font-size: 24rpx;
+					color: #FFFFFF;
+					line-height: 90rpx;
+					text-align: center;
+					margin-left: 30rpx;
+					margin-top: 30rpx;
+					margin-bottom: 32rpx;
+				}
+
+				.notFinished {
+					width: 90rpx;
+					height: 90rpx;
+					background: #E0E0E0;
+					border-radius: 100rpx 100rpx 100rpx 100rpx;
+					font-size: 24rpx;
+					color: #999999;
+					line-height: 90rpx;
+					text-align: center;
+					margin-left: 30rpx;
+					margin-top: 30rpx;
+					margin-bottom: 32rpx;
+				}
+
+				.lab-info-c {
+					margin: 24rpx 30rpx 0 20rpx;
+					flex: 1;
+
+					.lab-info-c-t {
+						display: flex;
+						justify-content: space-between;
+
+						.lab-info-c-t-l {
+							font-size: 30rpx;
+							color: #333333;
+							line-height: 42rpx;
+							text-align: left;
+							overflow: hidden;
+							text-overflow: ellipsis;
+							white-space: nowrap;
+						}
+
+						.lab-info-c-t-r {
+							display: flex;
+							justify-content: flex-start;
+							border-radius: 10rpx 10rpx 10rpx 10rpx;
+							width: 180rpx;
+							height: 40rpx;
+							margin-left: 10rpx;
+
+							>text {
+								display: inline-block;
+								flex: 1;
+								text-align: center;
+								font-size: 24rpx;
+								line-height: 40rpx;
+								text-align: center;
+							}
+						}
+					}
+
+					.lab-info-c-b {
+						margin-top: 16rpx;
+						display: flex;
+						justify-content: space-between;
+
+						>text {
+							overflow: hidden;
+							text-overflow: ellipsis;
+							white-space: nowrap;
+						}
+						>text:nth-of-type(1) {
+							font-size: 30rpx;
+							color: #666666;
+							line-height: 30rpx;
+							text-align: left;
+						}
+
+						>text:nth-of-type(2) {
+							font-size: 30rpx;
+							color: #666666;
+							line-height: 30rpx;
+							text-align: left;
+						}
+					}
+				}
+			}
+
+		}
+
+	}
+</style>

+ 376 - 0
pages_safetyCheck/views/snapshotManage/snapshotDetail.vue

@@ -0,0 +1,376 @@
+<!-- 随手拍详情 -->
+<template>
+	<view class="snapshotDetail">
+		<scroll-view scroll-y @scrolltolower="scrollGet" class="info-max-box">
+			<view class="items" v-if="inspectionItems==0">
+				<view class="items-li">
+					<view>实验室</view>
+					<view>{{newData.subName}}({{newData.subRoom?newData.subRoom:''}})</view>
+				</view>
+				<view class="items-li">
+					<view>学院单位</view>
+					<view>{{newData.deptName}}</view>
+				</view>
+				<view class="items-li">
+					<view>安全类别</view>
+					<view>{{newData.hazardCheckName}}</view>
+				</view>
+			</view>
+
+			<view class="list">
+				<view class="list-li" v-if="newData.hazardDescribe">
+					<view>检查隐患</view>
+				</view>
+				<view class="hidden-content" v-if="newData.hazardDescribe">{{newData.hazardDescribe}}
+				</view>
+				<view class="photo" v-if="newData.yhDtoList[0]">
+					<img v-for="(item,index) in newData.yhDtoList" :src="baseUrl+item.fileUrl">
+				</view>
+				<view class="list-li" @click="rectifyCollapse()">
+					<view>隐患整改</view>
+					<view
+						:id="newData.rectifyStatus==0?'fontColor-A':(newData.rectifyStatus==1?'fontColor-B':'fontColor-C')">
+						{{newData.rectifyStatus==0?'待整改':(newData.rectifyStatus==1?'已整改':'暂无法整改')}}
+						<img :src="imagesUrl('commonality/icon_06.png')">
+					</view>
+				</view>
+				<view v-if="newData.rectifyCollapse && newData.rectifyTime">
+					<view class="hidden-content"
+						v-if="(newData.rectifyStatus==1 || newData.rectifyStatus==2) && newData.rectifyDescribe">
+						{{newData.rectifyDescribe}}
+					</view>
+					<view class="photo" v-if="newData.rectifyStatus==1 || newData.rectifyStatus==2">
+						<img v-for="(item,index) in newData.zgDtoList" :src="baseUrl+item.fileUrl">
+					</view>
+					<view class="list-li" v-if="newData.rectifyStatus==1 || newData.rectifyStatus==2">
+						<view>姓名:</view>
+						<view>{{newData.rectifyUserName}}</view>
+					</view>
+					<view class="list-li" v-if="newData.rectifyStatus==1 || newData.rectifyStatus==2">
+						<view>时间:</view>
+						<view>{{newData.rectifyTime}}</view>
+					</view>
+				</view>
+				<!-- <view class="list-li" v-if="newData.rectifyStatus==1 || newData.rectifyStatus==2">
+					<view>整改方案</view>
+					<view></view>
+				</view>
+				<view class="file-li" v-if="newData.rectifyStatus==1 || newData.rectifyStatus==2">
+					<img :src="imagesUrl('safetyCheck/icon_djc_wj.png')">
+					<view>{{newData.rectifyProjectName}}</view>
+				</view> -->
+			</view>
+		</scroll-view>
+		<view v-if="newData.rectifyStatus==0 && newData.canRectify" class="sub-btn" @click="rectificationBtn">
+			{{newData.rectifyStatus==0?'整改':'继续整改'}}</view>
+	</view>
+
+</template>
+
+<script>
+	import {
+		config
+	} from '@/api/request/config.js'
+	import {
+		securityAppCheckPhotoDetail,
+	} from '@/pages_safetyCheck/api/index.js'
+	export default {
+		name: "snapshotDetail",
+		components: {
+
+		},
+		data() {
+			return {
+				baseUrl: config.base_url,
+				inspectionItems: 0, //0有检查项 1无检查项
+				newData: {},
+				photoId: '',
+
+			}
+		},
+		onLoad(option) {
+			this.$set(this, 'photoId', JSON.parse(decodeURIComponent(option.infoData)).photoId);
+		},
+		onShow() {
+
+		},
+		mounted() {
+			this.securityAppCheckPhotoDetail();
+		},
+		methods: {
+			//滚动事件
+			scrollGet() {},
+			async securityAppCheckPhotoDetail() {
+				let self = this;
+				const {
+					data
+				} = await securityAppCheckPhotoDetail({
+					photoId: this.photoId
+				});
+				if (data.code == 200) {
+					data.data.rectifyCollapse = true;
+					this.$set(this, 'newData', data.data);
+				}
+			},
+			rectifyCollapse() {
+				this.newData.rectifyCollapse = !this.newData.rectifyCollapse
+			},
+			//整改页面
+			rectificationBtn() {
+				let self = this;
+				let infoData = self.newData;
+				uni.redirectTo({
+					url: '/pages_safetyCheck/views/snapshotManage/snapshotRectification?infoData=' +
+						encodeURIComponent(JSON.stringify(infoData))
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.snapshotDetail {
+		height: 100%;
+		display flex;
+		box-sizing: border-box;
+		padding-bottom: 160rpx;
+		box-sizing: border-box;
+
+		#bgColor-A {
+			color: #FFD400;
+		}
+
+		#bgColor-B {
+			color: #FF8C00;
+		}
+
+		#bgColor-C {
+			color: #E11608;
+		}
+
+		#fontColor-A {
+			color: #0183FA;
+		}
+
+		#fontColor-B {
+			color: #16B531;
+		}
+
+		#fontColor-C {
+
+			color: #FF8C00;
+		}
+
+		.items {
+			width: 690rpx;
+			min-height: 165rpx;
+			background: #FFFFFF;
+			border-radius: 20rpx 20rpx 20rpx 20rpx;
+			margin: 20rpx 0 0 30rpx;
+
+			.items-li {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+				border-bottom: 1rpx solid #E0E0E0;
+
+				>view:nth-of-type(1) {
+					font-size: 30rpx;
+					color: #333333;
+					line-height: 80rpx;
+					text-align: left;
+				}
+
+				>view:nth-of-type(2) {
+					font-size: 28rpx;
+					color: #666666;
+					line-height: 80rpx;
+					text-align: left;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+				}
+			}
+
+			.items-t {
+				border-bottom: 1rpx solid #E0E0E0;
+				height: 80rpx;
+				display: flex;
+				justify-content: flex-start;
+				align-items: center;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+
+				.items-t-l {
+					width: 175rpx;
+					height: 50rpx;
+					background: #E11608;
+					border-radius: 50rpx 50rpx 50rpx 50rpx;
+					font-size: 30rpx;
+					color: #FFFFFF;
+					line-height: 50rpx;
+					text-align: center;
+					margin-right: 14rpx;
+				}
+
+				.items-t-r {
+					font-size: 30rpx;
+					color: #333333;
+					line-height: 42rpx;
+					text-align: left;
+				}
+			}
+
+			.items-b {
+				padding: 0 30rpx;
+				box-sizing: border-box;
+				height: 80rpx;
+				font-size: 28rpx;
+				color: #666666;
+				line-height: 80rpx;
+				text-align: left;
+			}
+		}
+
+		.items-number {
+			font-size: 24rpx;
+			color: #3D3D3D;
+			line-height: 34rpx;
+			text-align: right;
+			margin: 20rpx 60rpx 0 0;
+
+			>text {
+				font-size: 24rpx;
+				color: #FF0000;
+				line-height: 34rpx;
+				text-align: right;
+			}
+		}
+
+		.list {
+			width: 690rpx;
+			margin: 20rpx 30rpx 0;
+			background: #FFFFFF;
+			border-radius: 20rpx 20rpx 20rpx 20rpx;
+
+			.list-li {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+				border-bottom: 1rpx solid #E0E0E0;
+
+				>view:nth-of-type(1) {
+					font-size: 30rpx;
+					color: #333333;
+					line-height: 80rpx;
+					text-align: left;
+				}
+
+				>view:nth-of-type(2) {
+					font-size: 28rpx;
+					color: #666666;
+					line-height: 80rpx;
+					text-align: left;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+
+					>img {
+						width: 24rpx;
+						height: 12rpx;
+						margin-left: 10rpx;
+					}
+				}
+
+			}
+
+			.file-li {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+
+				>img:nth-of-type(1) {
+					width: 30rpx;
+					height: 30rpx;
+				}
+
+				>view {
+					flex: 1;
+					font-size: 28rpx;
+					color: #333333;
+					line-height: 80rpx;
+					text-align: left;
+					margin: 0 92rpx 0 16rpx;
+					overflow: hidden;
+					text-overflow: ellipsis;
+					white-space: nowrap;
+				}
+
+				>img:nth-of-type(2) {
+					width: 30rpx;
+					height: 30rpx;
+				}
+			}
+
+			.hidden-content {
+				width: 630rpx;
+				min-height: 120rpx;
+				background: #F5F5F5;
+				border-radius: 20rpx 20rpx 20rpx 20rpx;
+				margin: 20rpx 30rpx 0;
+				padding: 20rpx;
+				box-sizing: border-box;
+				font-size: 28rpx;
+				color: #666666;
+				line-height: 39rpx;
+				text-align: left;
+			}
+
+			.photo {
+				display: flex;
+				justify-content: flex-start;
+				flex-wrap: wrap;
+				margin-top: 20rpx;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+
+				>img {
+					width: 150rpx;
+					height: 150rpx;
+					border-radius: 10rpx 10rpx 10rpx 10rpx;
+					margin: 0 10rpx 10rpx 0;
+				}
+
+				>img:nth-of-type(4) {
+					margin-right: 0;
+				}
+			}
+
+			.list-li:last-of-type {
+				border: none;
+			}
+		}
+
+	}
+
+	.sub-btn {
+		width: 686rpx;
+		height: 100rpx;
+		background: #0183FA;
+		border-radius: 50rpx 50rpx 50rpx 50rpx;
+		position: fixed;
+		left: 30rpx;
+		bottom: 30rpx;
+		font-weight: 400;
+		font-size: 30rpx;
+		color: #FFFFFF;
+		line-height: 100rpx;
+		text-align: center;
+	}
+</style>

+ 519 - 0
pages_safetyCheck/views/snapshotManage/snapshotItems.vue

@@ -0,0 +1,519 @@
+<!-- 隐患项 -->
+<template>
+	<view class="hiddenDangerItems">
+		<view class="header">
+			<view class="line"></view>
+			<view class="tabTitle_tow">
+				<view class="tabTitle_tow_li" @tap="tabClickTow(item.value)" :key="index"
+					v-for="(item,index) in tabTextTow">
+					<view :class="{on:curTabTow==item.value}" class="tabTitle_tow_text">{{item.label}}</view>
+					<view :class="{on:curTabTow==item.value}" class="tabTitle_tow_across"></view>
+				</view>
+			</view>
+			<view class="line"></view>
+			<view class="search">
+				<view class="search-r" :class="(pageType == 0 && curTabTow == 0)||(pageType != 0) ?'search-r-margin':''"
+					@click="checkItemModuleButton('open')">
+					<img :src="imagesUrl('commonality/icon_aqjc_ss.png')">
+					{{newData.hazardCheckCode?newData.hazardCheckCode:''}}{{newData.hazardCheckName?newData.hazardCheckName:'搜索检查项'}}
+				</view>
+			</view>
+			<view class="line"></view>
+		</view>
+		<scroll-view scroll-y style="overflow-y: scroll;flex:1;" @scrolltolower="scrollGet" class="info-max-box">
+			<view class="list">
+				<view class="total"
+					:class="curTabTow == 0?'total-color-1':(curTabTow == 1?'total-color-2':(curTabTow == 2?'total-color-3':''))"
+					v-if="pageType == 2">
+					{{curTabTow == 0?'待整改共'+total+'项':(curTabTow == 1?'已整改共'+total+'项':(curTabTow == 2?'暂无法整改共'+total+'项':''))}}
+				</view>
+				<view class="list-li" v-for="(item,index) in dataList" :key="index">
+					<view class="list-li-t" @click="itemsClick(item)">
+						<view v-if="pageType == 2">
+							<img v-if="curTabTow==2" :src="imagesUrl('safetyCheck/icon_zg_zh@1x.png')">
+							<img v-if="curTabTow==1" :src="imagesUrl('safetyCheck/icon_xz_zg@1x.png')">
+							<img v-if="curTabTow==4" :src="imagesUrl('safetyCheck/icon_xz_fc@1x.png')">
+						</view>
+						<view v-if="item.hazardCheckCode">{{item.hazardCheckCode}}{{item.hazardCheckName}}</view>
+						<view v-if="!item.hazardCheckCode">{{item.hazardDescribe}}</view>
+					</view>
+				</view>
+			</view>
+			<view class="get-data-p" v-if="!getDataType">
+				<img class="get-data-img" :src="imagesUrl('safetyCheck/icon_aqjc_sl.png')">
+				<view class="get-data-text">上拉加载</view>
+			</view>
+			<view class="get-data-null-p" v-if="getDataType">- 没有更多数据 -</view>
+		</scroll-view>
+		<checkItemModule :propsData="propsData" v-if="checkItemModuleType"></checkItemModule>
+	</view>
+
+</template>
+
+<script>
+	import {
+		config
+	} from '@/api/request/config.js'
+	import {
+		securityAppCheckPhotoList,
+	} from '@/pages_safetyCheck/api/index.js'
+	import {
+		checkItemModule
+	} from '@/pages_safetyCheck/component/checkItemModule.vue'
+	export default {
+		name: "hiddenDangerItems",
+		components: {
+			checkItemModule
+		},
+		data() {
+			return {
+				baseUrl: config.base_url,
+				pageType: 1,
+				tabTextTow: [],
+				curTabTow: 0,
+				form: {
+					imgDtoList: [],
+				},
+				lotName: null,
+				newData: {
+
+				},
+				dialogVisible: false,
+				// 查询参数
+				queryParams: {
+					page: 1,
+					pageSize: 20,
+				},
+				//符合/不符合
+				checkFlag: null,
+				total: 0,
+				dataList: [],
+				getDataType: false,
+				searchIndex: 0,
+				//检查项组件数据
+				checkItemModuleType: false,
+				propsData: {},
+			}
+		},
+		onLoad(option) {
+			let optionData = JSON.parse(decodeURIComponent(option.infoData));
+			console.log(optionData)
+			uni.setNavigationBarTitle({
+				title: optionData.subName + '(' + (optionData.subRoom?optionData.subRoom:'-')+ ')',
+				})
+			this.$set(this, 'pageType', optionData.pageType);
+			this.$set(this, 'tabTextTow',[{
+							value: '0',
+							label: '待整改'
+						}, {
+							value: '1',
+							label: '已整改'
+						}, {
+							value: '2',
+							label: '暂无法整改'
+						}])
+			this.$set(this, 'newData', optionData);
+			this.$nextTick(() => {
+				this.getList()
+			})
+		},
+		onShow() {
+
+		},
+		mounted() {
+
+		},
+		methods: {
+			//滚动事件
+			scrollGet() {
+				let self = this;
+				if (self.total / self.queryParams.pageSize <= self.queryParams.page) {
+					this.$set(this, 'getDataType', true);
+				} else {
+					this.queryParams.page += 1;
+					this.$nextTick(() => {
+						this.getList();
+					})
+				}
+			},
+			//顶部tab点击
+			tabClickTow(value) {
+				this.$set(this, 'checkFlag', null);
+				this.$set(this.queryParams, 'page', 1);
+				this.$set(this, 'curTabTow', value);
+				this.$set(this, 'total', 0);
+				this.$set(this, 'dataList', []);
+				this.$nextTick(()=>{
+					this.getList();
+				})
+				console.log(this.curTabTow)
+			},
+			dialogOpen() {
+				this.dialogVisible = true;
+			},
+			dialogClose() {
+				this.dialogVisible = false;
+			},
+			
+			checkItemModuleButton(type, item) {
+				if (type == 'open') {
+					let obj = {
+						infoType: this.pageType,
+						checkType: this.curTabTow,
+					}
+					if (this.pageType == 0) {
+						//检查
+						obj.manageId = this.newData.manageId
+					} else if (this.pageType != 0) {
+						//复查/整改
+						obj.planId = this.newData.checkPlanSetVoList.planId;
+						obj.planSetId = this.newData.checkPlanSetVoList.planSetId;
+						obj.subId = this.newData.subId;
+					}
+					this.$set(this, 'propsData', obj);
+					this.$set(this, 'checkItemModuleType', true);
+				} else if (type == 'out') {
+					this.$set(this, 'checkItemModuleType', false);
+					this.$set(this, 'propsData', {});
+				} else if (type == 'submit') {
+					this.itemsClick(item);
+				}
+			},
+			//检查项选中
+			itemsClick(row) {
+				let infoData = row;
+				infoData.pageType = this.pageType;
+				if(this.curTabTow==0){
+					uni.navigateTo({
+						url: '/pages_safetyCheck/views/snapshotManage/snapshotRectification?infoData=' + encodeURIComponent(JSON.stringify(infoData))
+					});
+				}else if(this.curTabTow==1 || this.curTabTow==2){
+					uni.navigateTo({
+						url: '/pages_safetyCheck/views/snapshotManage/snapshotDetail?infoData=' + encodeURIComponent(JSON.stringify(infoData))
+					});
+				}
+				
+			},
+			hiddenDangerClick(row) {
+				let infoData = row;
+				infoData.pageType = this.pageType;
+				uni.redirectTo({
+					url: '/pages_safetyCheck/views/inspectManage/hiddenDangerRecord?infoData=' +
+						encodeURIComponent(JSON.stringify(infoData))
+				});
+			},
+			//
+			async getList() {
+				let self = this;
+				let obj = JSON.parse(JSON.stringify(this.queryParams))
+				//隐患整改
+				obj.hazardCheckId = '';
+				obj.searchValue = '';
+				obj.subId = this.newData.subId;
+				obj.rectifyStatus = this.curTabTow;
+				const {
+					data
+				} = await securityAppCheckPhotoList(obj);
+				if (data.code == 200) {
+					if (self.queryParams.page == 1) {
+						this.dataList = data.data.records;
+						this.total = data.data.total;
+						if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+							this.$set(this, 'getDataType', true);
+						}
+					} else {
+						this.dataList = [...this.dataList, ...data.data.records]
+						this.total = data.data.total;
+						if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+							this.$set(this, 'getDataType', true);
+						}
+					}
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.hiddenDangerItems {
+		height: 100%;
+		display flex;
+		flex-direction: column;
+		overflow: hidden;
+		box-sizing: border-box;
+
+		#totalColor-A {
+			color: #0183FA;
+			background: rgba(1, 131, 250, 0.2);
+		}
+
+		#totalColor-B {
+			color: #16B531;
+			background: rgba(22, 181, 49, 0.2);
+		}
+
+		#totalColor-C {
+			color: #FF8C00;
+			background: rgba(255, 140, 0, 0.2);
+		}
+
+		.header {
+			width: 100%;
+			height: 198rpx;
+			overflow: hidden;
+			background: #fff;
+
+			.lotName {
+				height: 70rpx;
+				line-height: 70rpx;
+				font-size: 28rpx;
+				background: rgba(1, 131, 250, 0.2);
+				color: #0183FA;
+				text-align: center;
+			}
+
+			.lotNameOne {
+				background: #F7E0C4;
+				color: #FF8C00;
+			}
+
+			.tabTitle_tow {
+				width: 520rpx;
+				height: 80rpx;
+
+				display flex;
+				justify-content: flex-start;
+				align-items: center;
+
+				.tabTitle_tow_li {
+					flex: 1;
+					position: relative;
+					text-align center;
+
+					.tabTitle_tow_text {
+						display: inline-block;
+						font-size: 30rpx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #333333;
+						line-height: 46rpx;
+						position: relative;
+
+						&.on {
+							color: #0183FA;
+						}
+					}
+
+					.tabTitle_tow_across {
+						width: 50rpx;
+						height: 4rpx;
+						background: #0183FA;
+						border-radius: 2rpx;
+						margin:0 auto 0;
+						display none;
+
+						&.on {
+							display block;
+						}
+					}
+
+				}
+			}
+
+			.line {
+				width: 100%;
+				height: 13rpx;
+				background: #F5F5F5;
+			}
+
+			.search {
+				width: 750rpx;
+				height: 80rpx;
+				background: #FFFFFF;
+				border-radius: 0rpx 0rpx 0rpx 0rpx;
+				display: flex;
+				justify-content: flex-start;
+				align-items: center;
+
+				.search-l {
+					display: flex;
+					justify-content: flex-start;
+					align-items: center;
+					margin: 0 20rpx 0 30rpx;
+
+					.search-A {
+						border-radius: 50rpx 50rpx 50rpx 50rpx;
+						border: 1rpx solid #E0E0E0;
+						width: 100rpx;
+						height: 60rpx;
+						background: #E0E0E0;
+						font-weight: normal;
+						font-size: 24rpx;
+						color: #333333;
+						line-height: 60rpx;
+						text-align: center;
+						margin-right: 10rpx;
+					}
+
+					.search-B {
+						border-radius: 50rpx 50rpx 50rpx 50rpx;
+						border: 1rpx solid #0183FA;
+						width: 100rpx;
+						height: 60rpx;
+						background: #0183FA;
+						font-weight: normal;
+						font-size: 24rpx;
+						color: #FFFFFF;
+						line-height: 60rpx;
+						text-align: center;
+						margin-right: 10rpx;
+					}
+				}
+
+				.search-r-margin {
+					width: 700rpx !important;
+					margin: 0 auto;
+				}
+
+				.search-r {
+					width: 440rpx;
+					height: 60rpx;
+					background: #FFFFFF;
+					border-radius: 50rpx 50rpx 50rpx 50rpx;
+					border: 1rpx solid #E0E0E0;
+					font-size: 24rpx;
+					color: #999999;
+					line-height: 60rpx;
+					text-align: left;
+					display: flex;
+					justify-content: flex-start;
+					align-items: center;
+					padding: 0 20rpx;
+					box-sizing: border-box;
+
+					>img {
+						width: 30rpx;
+						height: 30rpx;
+						margin-right: 20rpx;
+					}
+				}
+			}
+		}
+
+		.list {
+			width: 750rpx;
+			background: #FFFFFF;
+			padding-bottom: 20rpx;
+			box-sizing: border-box;
+
+			.total {
+				display: inline-block;
+				height: 50rpx;
+				background: rgba(1, 131, 250, 0.2);
+				border-radius: 0rpx 0rpx 20rpx 0rpx;
+				font-size: 24rpx;
+				color: #0183FA;
+				line-height: 50rpx;
+				text-align: left;
+				padding: 0rpx 22rpx;
+				box-sizing: border-box;
+				margin-bottom: 20rpx;
+			}
+
+			.total-color-1 {
+				background: rgba(1, 131, 250, 0.2);
+				color: #0183FA;
+			}
+
+			.total-color-2 {
+				background: rgba(22, 181, 49, 0.2);
+				color: #16B531;
+			}
+
+			.total-color-3 {
+				background: #F7E0C4;
+				color: #FF8C00;
+			}
+
+			.list-li {
+				margin: 0 30rpx;
+
+				.list-li-t {
+					width: 690rpx;
+					background: #F5F5F5;
+					border-radius: 10rpx 10rpx 10rpx 10rpx;
+					display: flex;
+					justify-content: flex-start;
+					padding: 12rpx 20rpx 14rpx 14rpx;
+					box-sizing: border-box;
+					margin: 20rpx 0;
+
+					>view:nth-of-type(1) {
+						>img {
+							width: 24rpx;
+							height: 24rpx;
+							margin-right: 30rpx;
+						}
+					}
+
+					>view:nth-of-type(2) {
+						flex: 1;
+						font-size: 24rpx;
+						color: #3D3D3D;
+						line-height: 34rpx;
+						text-align: left;
+					}
+				}
+
+				.list-li-b {
+					font-size: 24rpx;
+					color: #3D3D3D;
+					line-height: 24rpx;
+					text-align: right;
+
+					>text {
+						color: #FF0000;
+					}
+				}
+
+			}
+		}
+
+		.get-data-p {
+			height: 100rpx;
+			text-align: center;
+
+			.get-data-img {
+				width: 30rpx;
+				height: 30rpx;
+				margin: 0 auto;
+				margin-top: 15rpx;
+			}
+
+			.get-data-text {
+				text-align: center;
+			}
+		}
+
+		.get-data-null-p {
+			height: 100rpx;
+			line-height: 100rpx;
+			text-align: center;
+		}
+
+		.sub-btn {
+			width: 686rpx;
+			height: 100rpx;
+			background: #0183FA;
+			border-radius: 50rpx 50rpx 50rpx 50rpx;
+			position: fixed;
+			left: 30rpx;
+			bottom: 30rpx;
+			font-weight: 400;
+			font-size: 30rpx;
+			color: #FFFFFF;
+			line-height: 100rpx;
+			text-align: center;
+		}
+	}
+</style>

Fichier diff supprimé car celui-ci est trop grand
+ 999 - 0
pages_safetyCheck/views/snapshotManage/snapshotList.vue


+ 625 - 0
pages_safetyCheck/views/snapshotManage/snapshotRectification.vue

@@ -0,0 +1,625 @@
+<!-- 随手拍隐患项整改 -->
+<template>
+	<view class="snapshotDetail">
+		<scroll-view scroll-y @scrolltolower="scrollGet" class="info-max-box">
+			<view class="items">
+				<view class="items-li">
+					<view>安全类别</view>
+					<view>{{newData.hazardCheckName}}</view>
+				</view>
+			</view>
+			<view class="list">
+				<view class="list-li">
+					<view>检查隐患</view>
+					<view style="color: #FF8C00;">
+						<img :src="imagesUrl('commonality/icon_06.png')">
+					</view>
+				</view>
+				<view class="hidden-content">{{newData.hazardDescribe}}
+				</view>
+				<view class="photo">
+					<img v-for="(item,index) in newData.yhDtoList" :src="baseUrl+item.fileUrl">
+				</view>
+				<view class="list-li">
+					<view>姓名:</view>
+					<view>{{newData.createName}}</view>
+				</view>
+				<view class="list-li">
+					<view>时间:</view>
+					<view>{{newData.createTime}}</view>
+				</view>
+				<view class="list-li">
+					<view>隐患整改</view>
+					<view>
+						<img :src="imagesUrl('commonality/icon_06.png')">
+					</view>
+				</view>
+				<textarea class="describe" type="text" v-model="form.rectifyDescribe" maxlength="200"
+					placeholder="请填写整改措施" placeholder-style="font-size:24rpx;color:#999;"></textarea>
+				<view class="check-for-img-max-box">
+					<view class="left-title-p"></view>
+					<view class="right-img-box">
+						<view class="img-box" v-for="(imgUrl,imgIndex) in form.imgDtoList" :key="imgIndex">
+							<img class="img-data" :src="baseUrl+imgUrl.fileUrl">
+							<img class="position-img" :src="imagesUrl('commonality/icon_ssp_closure.png')"
+								@click="delImg(imgIndex)">
+						</view>
+						<img class="add-button" :src="imagesUrl('safetyCheck/img_ssp_pz@1x.png')"
+							@click="selectImage()" v-if="form.imgDtoList.length<6">
+					</view>
+				</view>
+				<!-- <view class="list-li-tow">
+					<view>整改方案(上传文件)</view>
+					<view @click="selectFile()">
+						<img :src="imagesUrl('safetyCheck/icon_aqjc_sc.png')">
+					</view>
+				</view>
+				<view class="file-li" v-if="form.rectifyProjectName">
+					<img :src="imagesUrl('safetyCheck/icon_djc_wj.png')">
+					<view>{{form.rectifyProjectName}}</view>
+					<img :src="imagesUrl('safetyCheck/icon_yybz_sc.png')">
+				</view> -->
+			</view>
+		</scroll-view>
+		<view class="sub-btn">
+			<view @click="submitForm(2)">暂无法整改</view>
+			<view @click="submitForm(1)">完成整改</view>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	import {
+		config
+	} from '@/api/request/config.js'
+	import {
+		securityAppCheckPhotoUpdate,
+	} from '@/pages_safetyCheck/api/index.js'
+	export default {
+		name: "snapshotDetail",
+		components: {
+
+		},
+		data() {
+			return {
+				baseUrl: config.base_url,
+				inspectionItems: 0, //0有检查项 1无检查项
+				form: {
+					imgDtoList: [],
+					rectifyProjectName: '',
+					rectifyProjectUrl: '',
+				},
+				newData: {},
+			}
+		},
+		onLoad(option) {
+			this.$set(this, 'newData', JSON.parse(decodeURIComponent(option.infoData)));
+		},
+		onShow() {
+
+		},
+		mounted() {
+
+		},
+		methods: {
+			//滚动事件
+			scrollGet() {},
+			/******文件上传******/
+			selectFile() {
+				let self = this;
+				wx.chooseMessageFile({
+					count: 1,
+					type: 'file',
+					success(res) {
+						// tempFilePath可以作为img标签的src属性显示图片
+						const tempFilePaths = res.tempFiles[0].path
+						self.form.rectifyProjectName = res.tempFiles[0].name
+						self.uploadFile(tempFilePaths);
+					}
+				})
+			},
+			async uploadFile(tempFilePaths) {
+				var self = this;
+				uni.showLoading({
+					title: '上传中',
+					mask: true
+				});
+				uni.uploadFile({
+					url: config.base_url + '/system/file/upload', //仅为示例,非真实的接口地址
+					header: {
+						'Authorization': uni.getStorageSync('token')
+					},
+					filePath: tempFilePaths,
+					name: 'file',
+					formData: {
+						'user': 'test'
+					},
+					success: (uploadFileRes) => {
+						let res = JSON.parse(uploadFileRes.data);
+						console.log(res)
+						if (res.code == 200) {
+							self.form.rectifyProjectUrl = res.data.url;
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: "none",
+								mask: true,
+								duration: 2000
+							});
+						}
+					},
+					fail: err => {},
+					complete: () => {
+						uni.hideLoading()
+					}
+				});
+			},
+			/******图片上传******/
+			selectImage() {
+				let self = this;
+				let photoMaxNun = 0;
+				if (this.form.imgDtoList.length > 5) {
+					uni.showToast({
+						title: '最多上传6张图片',
+						icon: "none",
+						mask: true,
+						duration: 2000
+					});
+					return
+				}
+				photoMaxNun = 6 - this.form.imgDtoList.length;
+				uni.chooseImage({
+					count: photoMaxNun,
+					sizeType: ["original", "compressed"],
+					sourceType: ["album", "camera"],
+					success: function(res) {
+						if (res.tempFilePaths[0]) {
+							res.tempFilePaths.forEach(function(item, index) {
+								self.uploadImg(item);
+							})
+						}
+					}
+				});
+			},
+			async uploadImg(tempFilePaths) {
+				var self = this;
+				uni.showLoading({
+					title: '上传中',
+					mask: true
+				});
+				uni.uploadFile({
+					url: config.base_url + '/system/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) {
+							this.form.imgDtoList.push({
+								'fileUrl': res.data.url,
+								'fileName': res.data.name
+							});
+							console.log(res.data.url)
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: "none",
+								mask: true,
+								duration: 2000
+							});
+						}
+					},
+					fail: err => {},
+					complete: () => {
+						uni.hideLoading()
+					}
+				});
+			},
+			//删除图片
+			delImg(minIndex) {
+				this.form.imgDtoList.splice(minIndex, 1);
+				this.$forceUpdate();
+			},
+			//整改/暂无法整改
+			async submitForm(status) {
+				let self = this;
+				/* if (status ==2 && this.form.rectifyProjectUrl=='') {
+					uni.showToast({
+						title: '请上传整改方案!',
+						icon: "none",
+						mask: true,
+						duration: 2000
+					});
+					return
+				} */
+				let obj = {
+					photoId: this.newData.photoId,
+					rectifyStatus: status, //1已整改2暂无法整改
+					rectifyDescribe: this.form.rectifyDescribe,
+					imgDtoList: this.form.imgDtoList,
+					rectifyProjectName: this.form.rectifyProjectName,
+					rectifyProjectUrl: this.form.rectifyProjectUrl,
+				}
+				const {
+					data
+				} = await securityAppCheckPhotoUpdate(obj);
+				if (data.code == 200) {
+					uni.showToast({
+						title: '提交成功',
+						icon: "none",
+						mask: true,
+						duration: 2000
+					});
+					let infoData = this.newData;
+					uni.redirectTo({
+						url: '/pages_safetyCheck/views/snapshotManage/snapshotDetail?infoData=' +
+							encodeURIComponent(JSON.stringify(infoData))
+					});
+
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.snapshotDetail {
+		height: 100%;
+		display flex;
+		box-sizing: border-box;
+		padding-bottom: 160rpx;
+		box-sizing: border-box;
+
+		#bgColor-A {
+			color: #FFD400;
+		}
+
+		#bgColor-B {
+			color: #FF8C00;
+		}
+
+		#bgColor-C {
+			color: #E11608;
+		}
+
+		.tip {
+			width: 750rpx;
+			height: 80rpx;
+			background: rgba(255, 140, 0, 0.2);
+			font-weight: normal;
+			font-size: 28rpx;
+			color: #FF8C00;
+			line-height: 80rpx;
+			text-align: center;
+		}
+
+		.items {
+			width: 690rpx;
+			min-height: 80rpx;
+			background: #FFFFFF;
+			border-radius: 20rpx 20rpx 20rpx 20rpx;
+			margin: 20rpx 0 0 30rpx;
+
+			.items-li {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+				border-bottom: 1rpx solid #E0E0E0;
+
+				>view:nth-of-type(1) {
+					font-size: 30rpx;
+					color: #333333;
+					line-height: 80rpx;
+					text-align: left;
+				}
+
+				>view:nth-of-type(2) {
+					font-size: 28rpx;
+					color: #666666;
+					line-height: 80rpx;
+					text-align: left;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+				}
+			}
+
+			.items-li:last-of-type {
+				border-bottom: none;
+			}
+
+			.items-t {
+				border-bottom: 1rpx solid #E0E0E0;
+				height: 80rpx;
+				display: flex;
+				justify-content: flex-start;
+				align-items: center;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+
+				.items-t-l {
+					width: 175rpx;
+					height: 50rpx;
+					background: #E11608;
+					border-radius: 50rpx 50rpx 50rpx 50rpx;
+					font-size: 30rpx;
+					color: #FFFFFF;
+					line-height: 50rpx;
+					text-align: center;
+					margin-right: 14rpx;
+				}
+
+				.items-t-r {
+					font-size: 30rpx;
+					color: #333333;
+					line-height: 42rpx;
+					text-align: left;
+				}
+			}
+
+			.items-b {
+				padding: 0 30rpx;
+				box-sizing: border-box;
+				height: 80rpx;
+				font-size: 28rpx;
+				color: #666666;
+				line-height: 80rpx;
+				text-align: left;
+			}
+		}
+
+		.items-number {
+			font-size: 24rpx;
+			color: #3D3D3D;
+			line-height: 34rpx;
+			text-align: right;
+			margin: 20rpx 60rpx 0 0;
+
+			>text {
+				font-size: 24rpx;
+				color: #FF0000;
+				line-height: 34rpx;
+				text-align: right;
+			}
+		}
+
+		.list {
+			width: 690rpx;
+			margin: 20rpx 30rpx 0;
+			background: #FFFFFF;
+			border-radius: 20rpx 20rpx 20rpx 20rpx;
+
+			.list-li {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+				border-bottom: 1rpx solid #E0E0E0;
+
+				>view:nth-of-type(1) {
+					font-size: 30rpx;
+					color: #333333;
+					line-height: 80rpx;
+					text-align: left;
+				}
+
+				>view:nth-of-type(2) {
+					font-size: 28rpx;
+					color: #666666;
+					line-height: 80rpx;
+					text-align: left;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+
+					>img {
+						width: 24rpx;
+						height: 12rpx;
+						margin-left: 10rpx;
+					}
+				}
+
+			}
+
+			.list-li-tow {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+				border-top: 1rpx solid #E0E0E0;
+				border-bottom: 1rpx solid #E0E0E0;
+
+				>view:nth-of-type(1) {
+					font-size: 30rpx;
+					color: #333333;
+					line-height: 80rpx;
+					text-align: left;
+				}
+
+				>view:nth-of-type(2) {
+					font-size: 28rpx;
+					color: #666666;
+					line-height: 80rpx;
+					text-align: left;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+
+					>img {
+						width: 30rpx;
+						height: 28rpx;
+						margin-left: 10rpx;
+					}
+				}
+
+			}
+
+			.file-li {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+
+				>img:nth-of-type(1) {
+					width: 30rpx;
+					height: 30rpx;
+				}
+
+				>view {
+					flex: 1;
+					font-size: 28rpx;
+					color: #333333;
+					line-height: 80rpx;
+					text-align: left;
+					margin: 0 92rpx 0 16rpx;
+					overflow: hidden;
+					text-overflow: ellipsis;
+					white-space: nowrap;
+				}
+
+				>img:nth-of-type(2) {
+					width: 30rpx;
+					height: 30rpx;
+				}
+			}
+
+			.hidden-content {
+				width: 630rpx;
+				min-height: 200rpx;
+				background: #F5F5F5;
+				border-radius: 20rpx 20rpx 20rpx 20rpx;
+				margin: 20rpx 30rpx 0;
+				padding: 20rpx;
+				box-sizing: border-box;
+				font-size: 28rpx;
+				color: #666666;
+				line-height: 39rpx;
+				text-align: left;
+			}
+
+			.photo {
+				display: flex;
+				justify-content: flex-start;
+				flex-wrap: wrap;
+				margin-top: 20rpx;
+				padding: 0 30rpx;
+				box-sizing: border-box;
+
+				>img {
+					width: 150rpx;
+					height: 150rpx;
+					border-radius: 10rpx 10rpx 10rpx 10rpx;
+					margin: 0 10rpx 10rpx 0;
+				}
+			}
+
+			.describe {
+				width: 636rpx;
+				height: 120rpx;
+				border-radius: 10rpx 10rpx 10rpx 10rpx;
+				border: 1rpx solid #E0E0E0;
+				margin: 20rpx 0 0 28rpx;
+				padding: 12rpx 16rpx;
+				box-sizing: border-box;
+			}
+
+			.check-for-img-max-box {
+				margin: 20px 28rpx;
+
+				.left-title-p {
+					width: 100%;
+					text-align: left;
+					font-size: 30rpx;
+					font-family: PingFang SC-Medium, PingFang SC;
+					font-weight: 400;
+					color: #333333;
+					line-height: 80rpx;
+				}
+
+				.right-img-box {
+					.img-box {
+						display inline-block;
+						height: 150rpx;
+						width: 150rpx;
+						position relative;
+						margin: 0 14rpx 20rpx 0;
+						border-radius 10rpx;
+						overflow hidden;
+
+						.img-data {
+							height: 150rpx;
+							width: 150rpx;
+						}
+
+						.position-img {
+							position absolute;
+							right: 0;
+							top: 0;
+							width: 36rpx;
+							height: 36rpx;
+						}
+					}
+
+					.img-box:nth-of-type(4n+4) {
+						margin-right: 0rpx;
+					}
+
+					.add-button {
+						margin: 0 0rpx 20rpx 0;
+						border-radius 10rpx;
+						overflow hidden;
+						display inline-block;
+						height: 150rpx;
+						width: 150rpx;
+					}
+				}
+			}
+
+			.list-li:last-of-type {
+				border: none;
+			}
+		}
+
+	}
+
+	.sub-btn {
+		display: flex;
+		justify-content: center;
+		position: fixed;
+		left: 30rpx;
+		bottom: 30rpx;
+
+		>view:nth-of-type(1) {
+			width: 345rpx;
+			height: 100rpx;
+			background: #FF8C00;
+			border-radius: 50rpx 0rpx 0rpx 50rpx;
+			font-size: 30rpx;
+			color: #FFFFFF;
+			line-height: 100rpx;
+			text-align: center;
+		}
+
+		>view:nth-of-type(2) {
+			width: 345rpx;
+			height: 100rpx;
+			background: #0183FA;
+			border-radius: 0rpx 50rpx 50rpx 0rpx;
+			font-size: 30rpx;
+			color: #FFFFFF;
+			line-height: 100rpx;
+			text-align: center;
+		}
+	}
+</style>

+ 2 - 2
pages_student/views/accessApplication/applicationDetails.vue

@@ -115,7 +115,7 @@
 				console.log("minItem", minItem)
 				if (minItem.type == 'png' || minItem.type == 'jpg' || minItem.type == 'jpeg' || minItem.type == 'gif') {
 					//查看图片
-					wx.previewImage({
+					uni.previewImage({
 						urls: [config.base_url + minItem.url], //需要预览的图片http链接列表,多张的时候,url直接写在后面就行了
 						current: '', // 当前显示图片的http链接,默认是第一个
 						success: function(res) {},
@@ -127,7 +127,7 @@
 						title: '下载中'
 					});
 					//下载文档
-					wx.downloadFile({
+					uni.downloadFile({
 						url: config.base_url + minItem.url,
 						header: {
 							Authorization: uni.getStorageSync('token')

+ 27 - 4
pages_student/views/accessApplication/newApplication.vue

@@ -561,15 +561,18 @@
 				});
 			},
 			upImg(item) {
-		
 				let self = this;
-				wx.chooseImage({
+				uni.chooseImage({
 					count: 1,
 					sizeType: ["original", "compressed"],
 					sourceType: ["album", "camera"],
 					success: function(res) {
-						console.log(res)
+						// #ifdef WEB
+						let text = res.tempFiles[0].name.split('.')
+						// #endif
+						// #ifdef MP-WEIXIN
 						let text = res.tempFilePaths[0].split('.')
+						// #endif
 						if (self.strArr.indexOf(text[1]) == -1) {
 							uni.showToast({
 								title: '请上传' + self.strArr.join(',') + '格式文件',
@@ -589,7 +592,6 @@
 							});
 							return
 						}
-		
 						let upObj = {
 							name: self.uploadFileName + '.' + text[1],
 							path: res.tempFilePaths[0],
@@ -602,6 +604,26 @@
 			//上传文件
 			upData(item) {
 				let self = this;
+				// #ifdef WEB
+				let arr = [];
+				for(let i=0;i<self.strArr.length;i++){
+					arr.push('.'+self.strArr[i])
+				}
+				uni.chooseFile({
+				  count: 6, //默认100
+				  extension:arr,
+					success: function (res) {
+						let text = res.tempFiles[0].name.split('.')
+						let upObj = {
+							name: res.tempFiles[0].name,
+							path: res.tempFiles[0].path,
+							type: text[1],
+						}
+						self.upDataFunction(item, upObj);
+					}
+				});
+				// #endif
+				// #ifdef MP-WEIXIN
 				wx.chooseMessageFile({
 					count: 1,
 					type: 'all',
@@ -634,6 +656,7 @@
 						self.upDataFunction(item, upObj);
 					}
 				})
+				// #endif
 			},
 			async upDataFunction(item, upObj) {
 				var self = this;

+ 56 - 1
utils/scanTheCode.js

@@ -161,4 +161,59 @@ async function chemicalAppletSelectStockInfoF(path,code){
 	}
 }
 
-export { scanCode , scanTheCodeDataTreating }
+
+
+
+// 页面内部扫码-方法
+function pageScanCode(path){
+		/*************** H5方法 ***************/
+		// #ifdef WEB
+		uni.navigateTo({
+			url: "/pages/views/pageScanCodePage?path="+path,
+		});
+		// #endif
+		/*************** 微信方法 ***************/
+		// #ifdef MP-WEIXIN
+		uni.scanCode({
+			onlyFromCamera: true,
+			success: function (res) {
+				pageScanTheCodeDataTreating(path,res.result);
+			},
+			fail: (err) => {
+				uni.showToast({
+					mask: true,
+					icon: "none",
+					position: "center",
+					title: err,
+					duration: 2000
+				});
+				return false
+			}
+		});
+		// #endif
+}
+
+//公共扫码-参数处理方法
+function pageScanTheCodeDataTreating(path,result){
+	if(result.indexOf('type') != -1){
+		//项目二维码
+		let list = result.split("?")[1].split("&");
+		let codeData = {};
+		list.forEach((item) => {
+			codeData[item.split("=")[0]] = item.split("=")[1];
+		})
+		/*************** H5方法 ***************/
+		// #ifdef WEB
+		uni.navigateBack();
+		// #endif
+		setTimeout(function() {
+			uni.$emit('acceptSaoCode', codeData);
+		}, 500);
+	}
+	
+}
+
+
+
+
+export { scanCode , scanTheCodeDataTreating , pageScanCode , pageScanTheCodeDataTreating }