dedsudiyu 3 тижнів тому
батько
коміт
a4278f6185

+ 61 - 2
pages.json

@@ -1039,8 +1039,6 @@
 						"navigationBarTitleText": "检查"
 					}
 				},
-
-
 				{
 					"path": "views/itemsManage/hiddenDangerItemsSearch",
 					"style": {
@@ -1119,6 +1117,67 @@
 					"style": {
 						"navigationBarTitleText": "危废回收"
 					}
+				},
+				{
+					"path": "views/recyclingReportRecord/index",
+					"style": {
+						"navigationBarTitleText": "填写报备单"
+					}
+				},
+				{
+					"path": "views/weighingRegistration/index",
+					"style": {
+						"navigationBarTitleText": "称重登记"
+					}
+				},
+				{
+					"path": "views/weighingRegistration/addPage",
+					"style": {
+						"navigationBarTitleText": "称重登记"
+					}
+				},
+				{
+					"path": "views/weighingRegistration/signatureComponent",
+					"style": {
+						"navigationBarTitleText": "回收人员签名",
+						"pageOrientation": "landscape"
+					}
+				},
+				{
+					"path": "views/weighingRegistration/infoPage",
+					"style": {
+						"navigationBarTitleText": "登记单详情"
+					}
+				},
+				{
+					"path": "views/historicalRecords/index",
+					"style": {
+						"navigationBarTitleText": "历史记录"
+					}
+				},
+				{
+					"path": "views/historicalRecords/infoPage",
+					"style": {
+						"navigationBarTitleText": "报备单详情"
+					}
+				},
+				{
+					"path": "views/permissionApply/index",
+					"style": {
+						"navigationBarTitleText": "危废回收"
+					}
+				},
+				{
+					"path": "views/permissionApply/addPage",
+					"style": {
+						"navigationBarTitleText": "报备登记权限申请"
+					}
+				},
+				{
+					"path": "views/permissionApply/listPage",
+					"style": {
+						"navigationBarTitleText": "权限申请"
+					}
 				}
 			]
 		}

+ 273 - 0
pages_hazardousWasteRecycling/views/historicalRecords/index.vue

@@ -0,0 +1,273 @@
+<!-- 历史记录 -->
+<template>
+	<view class="historicalRecords">
+		<view class="picker-box">
+			<picker @change="subChange" :value="subIndex" :range="subList" :range-key="'subName'">
+				<view class="picker-p" :class="queryParams.subId?'check-picker-p':''">{{queryParams.subId?queryParams.subName:'全部实验室'}}</view>
+			</picker>
+		</view>
+		<view class="check-button-max-box">
+			<view @click="checkButton(1)" :class="typeIndex == 1?'check-p':''">已报备待回收</view>
+			<view @click="checkButton(2)" :class="typeIndex == 2?'check-p':''">已回收</view>
+			<view @click="checkButton(3)" :class="typeIndex == 3?'check-p':''">超期未回收</view>
+		</view>
+		<scroll-view scroll-y @scrolltolower="scrollGet" class="for-max-box">
+			<view class="for-max-big-box" @click="goPage(item)"
+			v-for="(item,index) in dataList" :key="index">
+				<view class="for-title-p">报备单编号:{{item.listNewData1}}</view>
+				<view class="for-text-p">报备实验室:{{item.listNewData2}}</view>
+				<view class="for-text-p">上门回收日期:{{item.listNewData3}}</view>
+				<view class="for-text-p">废物种类:{{item.listNewData4}}</view>
+				<view class="for-text-p">报备人:{{item.listNewData5}}</view>
+				<view class="for-text-p">报备时间:{{item.listNewData6}}</view>
+				<view class="for-type-p" :class="item.listNewData0==1?'colorA':(item.listNewData0==2?'colorB':(item.listNewData0==3?'colorC':''))">{{item.listNewData0==1?'已报备待回收':(item.listNewData0==2?'已回收':(item.listNewData0==3?'超期未回收':''))}}</view>
+				<view class="for-icon-p">》</view>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import {
+		demo1,
+		demo2
+	} from '@/pages_hazardousWasteRecycling/api/index.js'
+	export default {
+		data() {
+			return {
+				subIndex:'',
+				subList:[],
+				subIndex:'',
+				// 查询参数
+				getDataType: false,
+				queryParams: {
+					page: 1,
+					pageSize: 10,
+					subId:"",
+				},
+				total: 0,
+				dataList: [],
+				typeIndex:1,
+			}
+		},
+		onLoad(option) {
+			
+		},
+		onShow() {
+
+		},
+		mounted() {
+			this.$set(this,'dataList',[
+					{
+						listNewData0:'1',
+						listNewData1:'HW202510400001',
+						listNewData2:'植物营养实验室(A201)',
+						listNewData3:'2025-11-05(星期四)',
+						listNewData4:'4',
+						listNewData5:'王二小(2020110010)',
+						listNewData6:'2025-11-04 10:10:09',
+					},
+					{
+						listNewData0:'1',
+						listNewData1:'HW202510400001',
+						listNewData2:'植物营养实验室(A201)',
+						listNewData3:'2025-11-05(星期四)',
+						listNewData4:'4',
+						listNewData5:'王二小(2020110010)',
+						listNewData6:'2025-11-04 10:10:09',
+					},
+					{
+						listNewData0:'2',
+						listNewData1:'HW202510400001',
+						listNewData2:'植物营养实验室(A201)',
+						listNewData3:'2025-11-05(星期四)',
+						listNewData4:'4',
+						listNewData5:'王二小(2020110010)',
+						listNewData6:'2025-11-04 10:10:09',
+					},
+					{
+						listNewData0:'2',
+						listNewData1:'HW202510400001',
+						listNewData2:'植物营养实验室(A201)',
+						listNewData3:'2025-11-05(星期四)',
+						listNewData4:'4',
+						listNewData5:'王二小(2020110010)',
+						listNewData6:'2025-11-04 10:10:09',
+					},
+					{
+						listNewData0:'3',
+						listNewData1:'HW202510400001',
+						listNewData2:'植物营养实验室(A201)',
+						listNewData3:'2025-11-05(星期四)',
+						listNewData4:'4',
+						listNewData5:'王二小(2020110010)',
+						listNewData6:'2025-11-04 10:10:09',
+					},
+					{
+						listNewData0:'3',
+						listNewData1:'HW202510400001',
+						listNewData2:'植物营养实验室(A201)',
+						listNewData3:'2025-11-05(星期四)',
+						listNewData4:'4',
+						listNewData5:'王二小(2020110010)',
+						listNewData6:'2025-11-04 10:10:09',
+					},
+					{
+						listNewData0:'1',
+						listNewData1:'HW202510400001',
+						listNewData2:'植物营养实验室(A201)',
+						listNewData3:'2025-11-05(星期四)',
+						listNewData4:'4',
+						listNewData5:'王二小(2020110010)',
+						listNewData6:'2025-11-04 10:10:09',
+					},
+					{
+						listNewData0:'2',
+						listNewData1:'HW202510400001',
+						listNewData2:'植物营养实验室(A201)',
+						listNewData3:'2025-11-05(星期四)',
+						listNewData4:'4',
+						listNewData5:'王二小(2020110010)',
+						listNewData6:'2025-11-04 10:10:09',
+					},
+				]);
+			
+		},
+		methods: {
+			//详情跳转
+			goPage(item){
+				uni.navigateTo({
+					url: "/pages_hazardousWasteRecycling/views/historicalRecords/infoPage",
+				});
+			},
+			//选项切换
+			checkButton(type){
+				if(this.typeIndex != type){
+					this.$set(this,'typeIndex',type);
+				}
+			},
+			//滚动加载事件
+			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();
+					})
+				}
+			},
+			//获取实验室列表
+			async getList() {
+				let self = this;
+				let obj = JSON.parse(JSON.stringify(this.queryParams));
+				const {
+					data
+				} = await laboratoryAppletSubList(obj);
+				if (data.code == 200) {
+					if(self.queryParams.page == 1){
+						this.$set(this, 'dataList', data.data.records);
+						this.$set(this, 'total', data.data.total);
+						if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+							this.$set(this, 'getDataType', true);
+						}
+					}else{
+						this.$set(this, 'dataList', [...this.dataList, ...data.data.records]);
+						this.$set(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>
+	.historicalRecords{
+		height: 100%;
+		display flex;
+		flex-direction column;
+		.picker-box{
+			height:60rpx;
+			width:700rpx;
+			margin:20rpx 25rpx;
+			background-color: #fff
+			border:1rpx solid #dedede;
+			border-radius:10rpx;
+			.picker-p{
+				padding:0 20rpx;
+				color:#666;
+				line-height:60rpx;
+			}
+			.check-picker-p{
+				
+			}
+		}
+		.check-button-max-box{
+			display: flex;
+			border-radius:10rpx;
+			border:1rpx solid #fff;
+			line-height:58rpx;
+			height:60rpx;
+			width:700rpx;
+			margin:0 25rpx 20rpx;
+			overflow: hidden;
+			view{
+				flex:1;
+				text-align: center;
+				background-color: #fff;
+				color:#0183FA;
+			}
+			.check-p{
+				background-color: #0183FA;
+				color:#fff;
+			}
+		}
+		.for-max-box{
+			flex: 1;
+			overflow-y scroll;
+			padding-bottom:60rpx;
+			.for-max-big-box{
+				margin:0 25rpx 25rpx;
+				background-color: #fff;
+				border-radius:10rpx;
+				border:1rpx solid #dedede;
+				padding:20rpx;
+				position: relative;
+				.for-title-p{
+					font-size:30rpx;
+					font-weight:700;
+					line-height:50rpx;
+				}
+				.for-text-p{
+					font-size:30rpx;
+					line-height:50rpx;
+				}
+				.for-type-p{
+					position: absolute;
+					top:24rpx;
+					right:20rpx;
+				}
+				.for-icon-p{
+					position: absolute;
+					top:155rpx;
+					right:20rpx;
+					font-size:32rpx;
+					color:#999;
+				}
+				.colorA{
+					color:#0183FA;
+				}
+				.colorB{
+					color:#00CD66;
+				}
+				.colorC{
+					color:#FF6A6A;
+				}
+			}
+		}
+	}
+</style>

Різницю між файлами не показано, бо вона завелика
+ 174 - 0
pages_hazardousWasteRecycling/views/historicalRecords/infoPage.vue


+ 26 - 5
pages_hazardousWasteRecycling/views/home/home.vue

@@ -1,27 +1,27 @@
 <template>
 	<view id="hazardousWasteRecyclingHome">
-		<view class="max-big-button-box">
+		<view class="max-big-button-box" @click="goPage(1)">
 			<img class="left-box" :src="imagesUrl('hazardousWasteRecycling/wfhs_hsbb.png')">
 			<view class="right-box">
 				<view>回收报备</view>
 				<view>可在回收日前填写报备单</view>
 			</view>
 		</view>
-		<view class="max-big-button-box">
+		<view class="max-big-button-box" @click="goPage(2)">
 			<img class="left-box" :src="imagesUrl('hazardousWasteRecycling/wfhs_czdj.png')">
 			<view class="right-box">
 				<view>登记称重</view>
 				<view>请在回收日等待回收,完成称重登记</view>
 			</view>
 		</view>
-		<view class="max-big-button-box">
+		<view class="max-big-button-box" @click="goPage(3)">
 			<img class="left-box" :src="imagesUrl('hazardousWasteRecycling/wfhs_lsjl.png')">
 			<view class="right-box">
 				<view>历史记录</view>
 				<view>查看我的危废回收记录</view>
 			</view>
 		</view>
-		<view class="max-big-button-box">
+		<view class="max-big-button-box" @click="goPage(4)">
 			<img class="left-box" :src="imagesUrl('hazardousWasteRecycling/wfhs_qxsq.png')">
 			<view class="right-box">
 				<view>权限申请</view>
@@ -52,7 +52,28 @@
 			
 		},
 		methods: {
-			
+			goPage(type){
+				if(type == 1){
+					uni.navigateTo({
+						url: "/pages_hazardousWasteRecycling/views/recyclingReportRecord/index",
+					});
+				}else if(type == 2){
+					uni.navigateTo({
+						url: "/pages_hazardousWasteRecycling/views/weighingRegistration/index",
+					});
+				}else if(type == 3){
+					uni.navigateTo({
+						url: "/pages_hazardousWasteRecycling/views/historicalRecords/index",
+					});
+				}else if(type == 4){
+					// uni.navigateTo({
+					// 	url: "/pages_hazardousWasteRecycling/views/permissionApply/index",
+					// });
+					uni.navigateTo({
+						url: "/pages_hazardousWasteRecycling/views/permissionApply/listPage",
+					});
+				}
+			},
 		},
 	}
 </script>

+ 297 - 0
pages_hazardousWasteRecycling/views/permissionApply/addPage.vue

@@ -0,0 +1,297 @@
+<!-- 权限申请新增 -->
+<template>
+	<view class="permissionApplyAddPage">
+		<view class="check-big-box">
+			<view class="check-text-p">*</view>
+			<view class="check-title-p">所需权限</view>
+			<view class="check-box" @click="checkButton(1)">
+				<img v-if="!newData.checkType1" class="left-box" :src="imagesUrl('commonality/icon_12.png')">
+				<img v-if="newData.checkType1" class="left-box" :src="imagesUrl('commonality/icon_13.png')">
+				<view>回收报备</view>
+			</view>
+			<view class="check-box" @click="checkButton(2)">
+				<img v-if="!newData.checkType2" class="left-box" :src="imagesUrl('commonality/icon_12.png')">
+				<img v-if="newData.checkType2" class="left-box" :src="imagesUrl('commonality/icon_13.png')">
+				<view>称重登记</view>
+			</view>
+		</view>
+		<view class="check-big-box">
+			<view class="check-text-p">*</view>
+			<view class="check-title-p">申请实验室</view>
+			<input @click="inputClick(2)" v-model="subject.subName" class="picker-input-box" disabled type="text"
+				placeholder="请选择实验室">
+		</view>
+		<view style="margin-top:60rpx;height:160rpx;">
+			<view class="text-color-p" v-if="subject.subName">基础信息:{{subject.deptName}}{{subject.buidName}}{{subject.forllName}}</view>
+			<view class="text-color-p" v-if="subject.subName">实验室负责人:{{subject.adminName}}</view>
+		</view>
+		<view class="submit-button-p" @click="submitButton()">立 即 申 请</view>
+		<!-- 实验室选择页面 -->
+		<view class="pageTwo" v-if="pageType == 2">
+			<view class="pageTwo-input-box">
+				<input type="text" placeholder="请输入实验室名称/房间号" v-model="subjectName">
+				<view @click="subjectList">查找</view>
+			</view>
+			<view class="for-max-box">
+				<view class="for-null-text" v-if="!searchList[0]">{{nullText}}</view>
+				<view class="for-box" v-for="(item,index) in searchList" :key="index">
+					<view class="button-text-view">{{item.subName}}{{item.roomNum?'('+item.roomNum+')':''}}</view>
+					<view class="button-big-view">
+						<view class="button-null-view"></view>
+						<view class="button-view" @click="checkClick(item)">选择</view>
+						<view class="button-null-view"></view>
+					</view>
+				</view>
+			</view>
+			<view class="out-button" @click="inputClick(1)">返回</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		systemMineGetListByPower,
+	} from '@/pages_student/api/index.js'
+	import {
+		demo1,
+		demo2
+	} from '@/pages_hazardousWasteRecycling/api/index.js'
+	export default {
+		data() {
+			return {
+				pageType:1,
+				//搜索回的实验室列表
+				searchList: [],
+				subject:{},
+				//实验室名称
+				subjectName: "",
+				//暂无数据提示
+				nullText: "请输入实验室名称进行搜索",
+				newData:{
+					checkType1:true,
+					checkType2:true
+				},
+			}
+		},
+		onLoad(option) {
+			
+		},
+		onShow() {
+
+		},
+		mounted() {
+			
+		},
+		methods: {
+			checkButton(type){
+				if(type == 1){
+					this.$set(this.newData,'checkType1',!this.newData.checkType1)
+				}else if(type == 2){
+					this.$set(this.newData,'checkType2',!this.newData.checkType2)
+				}
+			},
+			submitButton(){
+				console.log('this,',this.newData)
+			},
+			//选择搜索页面
+			inputClick(type) {
+				if (this.pageType != type) {
+					this.pageType = type;
+					this.$set(this, "subjectName", '');
+					this.$set(this, "searchList", []);
+				}
+			},
+			//查询实验室
+			async subjectList() {
+				if(!this.subjectName){
+					uni.showToast({
+						title: '请输入实验室名称/房间号',
+						icon: "none",
+						mask: true,
+						duration: 2000
+					});
+					return
+				}
+				const {
+					data
+				} = await systemMineGetListByPower({
+					searchValue: this.subjectName
+				})
+				if (data.code == 200) {
+					this.searchList = data.data;
+					if (!data.data[0]) {
+						this.nullText = "暂无数据"
+					}
+				}
+			},
+			//实验室选择
+			checkClick(item) {
+				this.$set(this, "subject", item);
+				this.inputClick(1);
+			},
+		},
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.permissionApplyAddPage{
+		height: 100%;
+		display flex;
+		flex-direction column;
+		background-color: #fff;
+		.check-big-box{
+			display: flex;
+			padding:0 40rpx;
+			margin-top:30rpx;
+			.check-text-p{
+				color:#FF6A6A;
+				height:80rpx;
+				line-height:80rpx;
+			}
+			.check-title-p{
+				font-size:32rpx;
+				height:80rpx;
+				line-height:80rpx;
+			}
+			.check-box{
+				display: flex;
+				font-size:32rpx;
+				margin-left:40rpx;
+				img{
+					width:40rpx;
+					height:40rpx;
+					margin-top:21rpx;
+				}
+				view{
+					margin-left:20rpx;
+					height:80rpx;
+					line-height:80rpx;
+				}
+			}
+			.picker-input-box{
+				padding: 0 20rpx;
+				display flex;
+				height: 80rpx;
+				width: 400rpx;
+				border: 1rpx solid #a2a2a2;
+				border-radius: 10rpx;
+				margin: 0 20rpx;
+			}
+		}
+		.text-color-p{
+			color:#666;
+			margin:0 50rpx;
+			line-height:80rpx;
+		}
+		.submit-button-p{
+			background-color:#0183FA;
+			color:#fff;
+			width:400rpx;
+			height:80rpx;
+			line-height:80rpx;
+			text-align: center;
+			font-size:30rpx;
+			margin:20rpx 175rpx;
+			border-radius:10rpx;
+		}
+		
+		.pageTwo {
+			flex: 1;
+			display flex;
+			flex-direction column;
+			overflow-y hidden;
+			position: absolute;
+			height: 100%;
+			z-index: 100;
+			background-color: #fff;
+		
+			.pageTwo-input-box {
+				display flex;
+				padding: 20rpx 25rpx;
+				background #fff;
+				margin-bottom: 20rpx;
+		
+				input {
+					padding: 0 20rpx;
+					width: 460rpx;
+					line-height: 80rpx;
+					height: 80rpx;
+					border-top: 1rpx solid #a2a2a2;
+					border-left: 1rpx solid #a2a2a2;
+					border-bottom: 1rpx solid #a2a2a2;
+					border-bottom-left-radius: 10rpx;
+					border-top-left-radius: 10rpx;
+				}
+		
+				view {
+					width: 200rpx;
+					line-height: 80rpx;
+					height: 80rpx;
+					border: 1rpx solid #007AFF;
+					color: #fff;
+					background #007AFF;
+					text-align center;
+					border-top-right-radius: 10rpx;
+					border-bottom-right-radius: 10rpx;
+				}
+			}
+		
+			.for-max-box {
+				background #fff;
+				flex: 1;
+				overflow-y scroll;
+		
+				.for-box:nth-child(1) {
+					border: none;
+				}
+		
+				.for-null-text {
+					text-align center;
+					line-height: 100rpx;
+					color: #999;
+		
+				}
+		
+				.for-box {
+					border-top: 1rpx solid #dedede;
+					display: flex;
+		
+					.button-text-view {
+						padding: 35rpx 35rpx 35rpx 20rpx;
+						width:560rpx;
+					}
+		
+					.button-big-view {
+						padding: 20rpx 0 20rpx 0 ;
+						width: 100rpx;
+						display: flex;
+						flex-direction: column;
+						.button-null-view{
+							flex:1;
+						}
+						.button-view{
+							line-height:60rpx;
+							width: 100rpx;
+							text-align center;
+							border-radius: 10rpx;
+							background #007AFF;
+							color: #fff;
+						}
+					}
+				}
+			}
+		
+			.out-button {
+				width: 650rpx;
+				height: 100rpx;
+				line-height: 100rpx;
+				margin: 20rpx 50rpx;
+				text-align center;
+				font-size: 32rpx;
+				color: #fff;
+				background #999;
+				border-radius: 20rpx;
+			}
+		}
+	}
+</style>

+ 69 - 0
pages_hazardousWasteRecycling/views/permissionApply/index.vue

@@ -0,0 +1,69 @@
+<!-- 权限申请落地页 -->
+<template>
+	<view class="permissionApply">
+		<img class="img-box" :src="imagesUrl('supplier/img_zc_zccg.png')">
+		<view class="text-p">未检测到您关联的实验室,如需执行实验室危险废物报备及登记回收,请先申请权限并联系实验室负责人审核。</view>
+		<view class="button-p" @click="goPage()">立即申请</view>
+	</view>
+</template>
+
+<script>
+	import {
+		demo1,
+		demo2
+	} from '@/pages_hazardousWasteRecycling/api/index.js'
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		onLoad(option) {
+			
+		},
+		onShow() {
+
+		},
+		mounted() {
+			
+		},
+		methods: {
+			goPage(){
+				uni.navigateTo({
+					url: "/pages_hazardousWasteRecycling/views/permissionApply/addPage",
+				});
+			},
+		},
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.permissionApply{
+		height: 100%;
+		display flex;
+		flex-direction column;
+		background-color: #fff
+		.img-box{
+			width:373rpx;
+			height:191rpx;
+			margin:200rpx auto;
+		}
+		.text-p{
+			font-size:30rpx;
+			color:#333;
+			text-align: center;
+			margin:0 100rpx;
+		}
+		.button-p{
+			background-color: #0183FA;
+			color:#fff;
+			text-align: center;
+			height:80rpx;
+			line-height:80rpx;
+			width:300rpx;
+			border-radius:10rpx;
+			margin:80rpx auto;
+		}
+		
+	}
+</style>

+ 344 - 0
pages_hazardousWasteRecycling/views/permissionApply/listPage.vue

@@ -0,0 +1,344 @@
+<!-- 权限申请列表 -->
+<template>
+	<view class="permissionApplyListPage">
+		<view class="top-picker-box">
+			<picker @change="typeChange" :value="typeIndex" :range="typeList" :range-key="'label'">
+				<view class="picker-p" :class="queryParams.type?'check-picker-p':''">{{queryParams.type?typeList[typeIndex].label:'请选择'}}</view>
+			</picker>
+		</view>
+		<scroll-view scroll-y @scrolltolower="scrollGet" class="for-max-box">
+			<view class="for-box" v-for="(item,index) in dataList" :key="index">
+				<view class="title-p">{{item.data1}}</view>
+				<view class="text-p">{{item.data2}}</view>
+				<view class="text-p">申请权限类型:{{item.data3}}</view>
+				<view class="text-p">申请人:{{item.data4}}</view>
+				<view class="text-p">申请时间:{{item.data5}}</view>
+				<view class="text-p">审核人:{{item.data6}}</view>
+				<view class="text-p">审核时间:{{item.data7}}</view>
+				<view class="position-p" :class="item.data8==3?'colorB':'colorA'">{{item.data8==1?'待审批':(item.data8==2?'审批通过':(item.data8==3?'驳回':''))}}</view>
+				<view class="button-p-1" @click="throughButton()">通过</view>
+				<view class="button-p-2" @click="rejectionButton(1)">驳回</view>
+			</view>
+		</scroll-view>
+		<view class="add-button" @click="goPage()">新申请</view>
+		<view class="shade-max-big-box" v-if="dialogType">
+			<view class="shade-null-1" @click="rejectionButton(2)"></view>
+			<view class="shade-big-box">
+				<view class="shade-title-p">驳回申请</view>
+				<textarea class="textarea" placeholder="请输入驳回原因及说明" 
+				maxlength="100" v-model="dialogText"></textarea>
+				<view class="shade-button-box">
+					<view @click="dialogButton(1)">取消</view>
+					<view @click="dialogButton(2)">驳回</view>
+				</view>
+			</view>
+			<view class="shade-null-2" @click="rejectionButton(2)"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		demo1,
+		demo2
+	} from '@/pages_hazardousWasteRecycling/api/index.js'
+	export default {
+		data() {
+			return {
+				typeList:[
+					{ value: 1, label: "全部" },
+					{ value: 2, label: "待审批" },
+					{ value: 3, label: "已通过" },
+					{ value: 4, label: "驳回" },
+				],
+				// 查询参数
+				getDataType: false,
+				queryParams: {
+					page: 1,
+					pageSize: 10,
+					type:1,
+				},
+				typeIndex:0,
+				total: 0,
+				dataList: [],
+				dialogType:false,
+				dialogText:'',
+			}
+		},
+		onLoad(option) {
+			
+		},
+		onShow() {
+
+		},
+		mounted() {
+			this.$set(this,'dataList',[
+				{
+					data1:'植物营养实验室(A201)',
+					data2:'资源环境学院-农科楼- A201',
+					data3:'回收报备、称重登记',
+					data4:'张三(2020110010)',
+					data5:'2025-11-03 10:10:09',
+					data6:'王二小',
+					data7:'2025-11-04 10:10:09',
+					data8:'1',
+				},
+				{
+					data1:'植物营养实验室(A201)',
+					data2:'资源环境学院-农科楼- A201',
+					data3:'回收报备、称重登记',
+					data4:'张三(2020110010)',
+					data5:'2025-11-03 10:10:09',
+					data6:'王二小',
+					data7:'2025-11-04 10:10:09',
+					data8:'2',
+				},
+				{
+					data1:'植物营养实验室(A201)',
+					data2:'资源环境学院-农科楼- A201',
+					data3:'回收报备、称重登记',
+					data4:'张三(2020110010)',
+					data5:'2025-11-03 10:10:09',
+					data6:'王二小',
+					data7:'2025-11-04 10:10:09',
+					data8:'3',
+				},
+			]);
+		},
+		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();
+					})
+				}
+			},
+			//获取实验室列表
+			async getList() {
+				let self = this;
+				let obj = JSON.parse(JSON.stringify(this.queryParams));
+				const {
+					data
+				} = await laboratoryAppletSubList(obj);
+				if (data.code == 200) {
+					if(self.queryParams.page == 1){
+						this.$set(this, 'dataList', data.data.records);
+						this.$set(this, 'total', data.data.total);
+						if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+							this.$set(this, 'getDataType', true);
+						}
+					}else{
+						this.$set(this, 'dataList', [...this.dataList, ...data.data.records]);
+						this.$set(this, 'total', data.data.total);
+						if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+							this.$set(this, 'getDataType', true);
+						}
+					}
+				}
+			},
+			//选择器
+			typeChange(e){
+				this.$set(this.queryParams,'type',this.typeList[e.detail.value].value);
+				this.$set(this,'typeIndex',e.detail.value);
+			},
+			//通过
+			throughButton(){
+				let self = this;
+				uni.showModal({
+					content: '是否确认通过?',
+					cancelColor: "#999",
+					confirmColor: "#0183FA",
+					success: function(res) {
+						if (res.confirm) {
+							
+						} else if (res.cancel) {}
+					}
+				});
+			},
+			//驳回
+			rejectionButton(type){
+				if(type == 1){
+					this.$set(this,'dialogText','');
+					this.$set(this,'dialogType',true);
+				}else{
+					this.$set(this,'dialogType',false);
+				}
+			},
+			//弹窗按钮
+			dialogButton(type){
+				if(type == 1){
+					this.$set(this,'dialogType',false);
+				}else if(type == 2){
+					this.$set(this,'dialogType',false);
+				}
+			},
+			goPage(){
+				uni.navigateTo({
+					url: "/pages_hazardousWasteRecycling/views/permissionApply/index",
+				});
+			},
+		},
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.permissionApplyListPage{
+		height: 100%;
+		display flex;
+		flex-direction column;
+		.top-picker-box{
+			.picker-p{
+				border:1px solid #dedede;
+				background-color: #fff;
+				margin:20rpx 20rpx;
+				padding:0 40rpx;
+				line-height:60rpx;
+				border-radius:10rpx;
+				color:#999;
+			}
+			.check-picker-p{
+				color:#333;
+			}
+		}
+		.for-max-box{
+			flex: 1;
+			overflow-y scroll;
+			padding:0 20rpx;
+			.for-box{
+				background-color: #fff;
+				border-radius:10rpx;
+				border:1rpx solid #dedede;
+				width:666rpx;
+				overflow: hidden;
+				margin-bottom:20rpx;
+				padding:20rpx;
+				position: relative;
+				view{
+					font-size:30rpx;
+					line-height:50rpx;
+				}
+				.title-p{
+					font-weight:700;
+				}
+				.text-p{
+					
+				}
+				.position-p{
+					position: absolute;
+					top:20rpx;
+					right:20rpx;
+					width:140rpx;
+					text-align: center;
+				}
+				.colorA{
+					color:#0183FA;
+				}
+				.colorB{
+					color:#FF6A6A;
+				}
+				.button-p-1{
+					position: absolute;
+					bottom:120rpx;
+					right:20rpx;
+					background-color: #0183FA;
+					border: 1rpx solid #0183FA;
+					border-radius:10rpx;
+					text-align: center;
+					height:60rpx;
+					line-height:58rpx;
+					width:140rpx;
+					color:#fff;
+				}
+				.button-p-2{
+					position: absolute;
+					bottom:20rpx;
+					right:20rpx;
+					background-color: #fff;
+					border: 1rpx solid #FF6A6A;
+					border-radius:10rpx;
+					text-align: center;
+					height:60rpx;
+					line-height:58rpx;
+					width:140rpx;
+					color:#FF6A6A;
+				}
+			}
+		}
+		.add-button{
+			width:650rpx;
+			height:80rpx;
+			margin:30rpx 50rpx 40rpx;
+			line-height:80rpx;
+			color:#fff;
+			background-color: #0183FA;
+			text-align: center;
+			border-radius:10rpx;
+		}
+		.shade-max-big-box{
+			position: fixed;
+			height:100%;
+			width:100%;
+			background-color: rgba(0,0,0,0.5);
+			display: flex;
+			flex-direction: column;
+			overflow: hidden
+			.shade-null-1{
+				flex:3;
+			}
+			.shade-null-2{
+				flex:5;
+			}
+			.shade-big-box{
+				width: 550rpx;
+				margin: 0 auto;
+				// height:500rpx;
+				background-color: #fff;
+				border-radius:10rpx;
+				overflow: hidden;
+				.shade-title-p{
+					text-align: center;
+					font-size: 34rpx;
+					color: #0183fa;
+					border-bottom: 1rpx solid #dedede;
+					line-height: 80rpx;
+				}
+				.textarea{
+					width: 450rpx;
+					height: 200rpx;
+					margin: 40rpx auto;
+					border:1rpx solid #dededede;
+					border-radius:10rpx;
+					padding:20rpx;
+				}
+				.shade-button-box{
+					display: flex;
+					view:nth-child(1){
+						flex:1;
+						border-top:1px solid #0183FA;
+						background-color: #FFF;
+						color:#0183FA;
+						text-align: center;
+						line-height:58rpx;
+						height:60rpx;
+						width:100rpx;
+					}
+					view:nth-child(2){
+						flex:1;
+						border:1px solid #0183FA;
+						background-color: #0183FA;
+						color:#fff;
+						text-align: center;
+						line-height:58rpx;
+						height:60rpx;
+						width:100rpx;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 388 - 0
pages_hazardousWasteRecycling/views/recyclingReportRecord/index.vue

@@ -0,0 +1,388 @@
+<!-- 回收报备 -->
+<template>
+	<view class="recyclingReportRecord">
+		<view class="recyclingReportRecord-top-box">
+			<view class="text-title-p">基础信息填写</view>
+			<view class="content-box">
+				<view class="sub-picker-box">
+					<view class="mark-box">*</view>
+					<view class="title-box">实验室</view>
+					<view class="picker-box">
+						<picker @change="subChange" :value="addForm.subIndex" :range="subList" :range-key="'subName'">
+							<view class="picker-p" :class="addForm.subId?'check-picker-p':''">{{addForm.subId?addForm.subName:'请选择实验室'}}</view>
+						</picker>
+					</view>
+				</view>
+				<view class="sub-picker-box">
+					<view class="mark-box">*</view>
+					<view class="title-box" style="width:220rpx;">上门回收日期:</view>
+					<view class="text-p">{{timeData}}</view>
+				</view>
+			</view>
+			<view class="text-title-p">危废信息填报</view>
+		</view>
+		<view class="recyclingReportRecord-center-box">
+			<view class="content-box">
+				<view class="for-content-box" v-for="(item,index) in addForm.formData4" :key="index">
+					<view class="sub-picker-box">
+						<view class="mark-box">*</view>
+						<view class="title-box">类型:</view>
+						<view class="picker-box">
+							<picker @change="(val)=>forChange(index,val)" :value="item.forData3" :range="item.forList" :range-key="'label'">
+								<view class="picker-p" :class="item.forData1?'check-picker-p':''">{{item.forData1?item.forData2:'请选择危废类型'}}</view>
+							</picker>
+						</view>
+						<img class="right-button" v-if="addForm.formData4[1]"
+						@click="reductionItemButton(index)"
+						:src="imagesUrl('commonality/icon_zgsq_jian.png')">
+					</view>
+					<view class="sub-picker-box">
+						<view class="mark-box">*</view>
+						<view class="title-box">数量:</view>
+						<view class="reduction-button" @click="reductionAdd(1,index)">-</view>
+						<input class="input-p" type="digit" maxlength="10" @input="(val)=>handleInput(index,val)" v-model="item.forData4">
+						<view class="add-button" @click="reductionAdd(2,index)">+</view>
+						<view class="unit-p">{{item.forData1?item.forData5:''}}</view>
+					</view>
+				</view>
+				<view class="add-item-button" v-if="this.addForm.formData4.length < this.dialogOptionForList.length"
+				@click="addItemButton()">添加类型</view>
+				<view class="sub-picker-box">
+					<view class="mark-box">*</view>
+					<view class="title-box">备注:</view>
+					<textarea class="input-text-p" type="text" v-model="addForm.remarks" 
+					maxlength="100" @input="sumfontnum" placeholder="请输入备注说明" 
+					placeholder-style="font-size:28rpx;color:#999;"></textarea>
+				</view>
+			</view>
+			<view class="submit-button">填写完毕,立即报备</view>
+		</view>
+		<!-- <view class="recyclingReportRecord-bottom-box">
+			
+		</view> -->
+	</view>
+</template>
+
+<script>
+	import {
+		demo1,
+		demo2
+	} from '@/pages_hazardousWasteRecycling/api/index.js'
+	export default {
+		data() {
+			return {
+				timeData:'2025-11-04(星期四)',
+				addForm:{
+					subId:'',
+					subName:'',
+					subIndex:'',
+					remarks:'',
+					formData4:[],
+				},
+				subList: [
+					{ subId: 1, subName: "实验室1" },
+					{ subId: 2, subName: "实验室2" },
+					{ subId: 3, subName: "实验室3" },
+				],
+        dialogOptionList:[],
+        dialogOptionForList:[
+          {value:'1',label:'数据1',dict:'斤'},
+          {value:'2',label:'数据2',dict:'公斤'},
+          {value:'3',label:'数据3',dict:'升'},
+          {value:'4',label:'数据4',dict:'毫升'},
+          {value:'5',label:'数据5',dict:'公升'},
+          {value:'6',label:'数据6',dict:'克'},
+        ],
+			}
+		},
+		onLoad(option) {
+			
+		},
+		onShow() {
+
+		},
+		mounted() {
+			this.initialize(1);
+		},
+		methods: {
+			//初始化
+			initialize(type){
+				let self = this;
+				if(type == 1){
+					//无数据-初始化
+					for(let i=0;i<self.dialogOptionForList.length;i++){
+						if(i<4){
+							let obj = {
+								forData1:self.dialogOptionForList[i].value,
+								forData2:self.dialogOptionForList[i].label,
+								forData3:i,
+								forData4:0,
+								forData5:self.dialogOptionForList[i].dict,
+								forList:self.dialogOptionForList,
+							}
+							self.addForm.formData4.push(JSON.parse(JSON.stringify(obj)))
+						}
+					}
+					this.filtrateList();
+				}else if(type == 2){
+					//有数据-初始化
+				}
+			},
+			//选中实验室
+			subChange(e) {
+				this.$set(this.addForm,'subId',this.subList[e.detail.value].subId);
+				this.$set(this.addForm,'subName',this.subList[e.detail.value].subName);
+				this.$set(this.addForm,'subIndex',e.detail.value);
+			},
+			//选中类型
+			forChange(index,e){
+				this.$set(this.addForm.formData4[index],'forData1',this.addForm.formData4[index].forList[e.detail.value].value);
+				this.$set(this.addForm.formData4[index],'forData2',this.addForm.formData4[index].forList[e.detail.value].label);
+				this.$set(this.addForm.formData4[index],'forData5',this.addForm.formData4[index].forList[e.detail.value].dict);
+				this.$set(this.addForm.formData4[index],'forData3',e.detail.value);
+				this.filtrateList();
+			},
+			//单位值加减
+			reductionAdd(type,index){
+				if(type == 1){
+					//减
+					if(this.addForm.formData4[index].forData4>=1){
+						this.$set(this.addForm.formData4[index],'forData4',this.addForm.formData4[index].forData4-1);
+					}
+				}else if(type == 2){
+					//加
+					if(this.addForm.formData4[index].forData4<9999){
+						this.$set(this.addForm.formData4[index],'forData4',this.addForm.formData4[index].forData4+1);
+					}
+				}
+			},
+			//添加类型
+			addItemButton(){
+				if(this.addForm.formData4.length>= this.dialogOptionForList.length){
+					uni.showToast({
+						title: '没有更多类型可添加',
+						icon: "none",
+						mask: true,
+						duration: 2000
+					});
+					return
+				}
+				this.addForm.formData4.push({
+					forData1:'',
+					forData2:'',
+					forData3:'',
+					forData4:0,
+					forData5:'',
+					forList:[],
+				})
+				this.filtrateList();
+			},
+			//删除类型
+			reductionItemButton(index){
+				this.addForm.formData4.splice(index,1);
+				this.filtrateList();
+			},
+			// 小数点后两位
+			handleInput(index,e){
+			  // 一定要加nextTick,否则特殊情况的更改不生效【如:000时,更改为0】
+			  this.$nextTick(() => {
+			    let value = e.detail.value
+			    // 如果当前输入为空,直接允许清空
+			    if (!value) {
+			      this.addForm.formData4[index].forData4 = ''
+			    } else if (value?.charAt(0) === '0' && value.charAt(1) && value.charAt(1) !== '.') {
+			      // // 1. 当第一位为0时,只能输入小数点【第二位必须是小数点】
+			      value = '0'
+			    }
+			    value = value.replace(/[^\d.]/g, '') // 清除"数字"和"."以外的字符
+			    value = value.replace(/\.{2,}/g, '.') // 只保留第一个. 清除多余的
+			    value = value.match(/^\d*(\.?\d{0,2})/g)[0] || '' // 保留2位小数
+			    this.addForm.formData4[index].forData4 = value
+			  })
+			},
+      //匹配数据
+      filtrateList(){
+        let self = this;
+        let forList = JSON.parse(JSON.stringify(this.dialogOptionForList));
+        let newList = JSON.parse(JSON.stringify(this.dialogOptionForList));
+        for(let i=0;i<forList.length;i++){
+          let num = 0;
+          for(let o=0;o<self.addForm.formData4.length;o++){
+            if(forList[i].value == self.addForm.formData4[o].forData1){
+              num++
+              break
+            }
+          }
+          if(num!=0){
+            forList.splice(i,1);
+            i--
+          }
+        }
+        for(let i=0;i<self.addForm.formData4.length;i++){
+          let list = [];
+          if(self.addForm.formData4[i].forData1){
+            for(let o=0;o<newList.length;o++){
+              if(self.addForm.formData4[i].forData1 == newList[o].value){
+                list.push(newList[o]);
+              }
+            }
+          }
+          list = list.concat(forList)
+          self.$set(self.addForm.formData4[i],'forList',JSON.parse(JSON.stringify(list)));
+        }
+      },
+		},
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.recyclingReportRecord{
+		height: 100%;
+		display flex;
+		flex:1;
+		flex-direction column;
+		overflow: hidden;
+		.recyclingReportRecord-top-box{
+			height:380rpx;
+		}
+		.recyclingReportRecord-center-box{
+			flex:1;
+			overflow-y: scroll;
+			overflow-x: hidden
+			display flex;
+			flex-direction column;
+		}
+		// .recyclingReportRecord-bottom-box{
+		// 	height:200rpx;
+		// }
+		.text-title-p{
+			font-size:32rpx;
+			color:#0183FA;
+			line-height:80rpx;
+			margin:0 20rpx;
+		}
+		.content-box{
+			margin:0 20rpx;
+			background-color: #fff;
+			border-radius:10rpx;
+			padding:20rpx 20rpx 0 10rpx;
+			.for-content-box{
+				.right-button{
+					margin-top:8rpx;
+					margin-left:20rpx;
+					width:50rpx;
+					height:50rpx;
+				}
+			}
+			.sub-picker-box{
+				display: flex;
+				padding:10rpx;
+				.mark-box{
+					color:red;
+					margin-left:10rpx;
+					height:60rpx;
+					line-height:60rpx;
+					margin-bottom:20rpx;
+				}
+				.title-box{
+					width:100rpx;
+					margin:0 10rpx;
+					height:60rpx;
+					line-height:60rpx;
+				}
+				.text-p{
+					flex:1;
+					text-align: right;
+					height:60rpx;
+					line-height:60rpx;
+				}
+				.picker-box{
+					height:60rpx;
+					flex:1;
+					border:1rpx solid #dedede;
+					border-radius:10rpx;
+					.picker-p{
+						padding:0 20rpx;
+						color:#666;
+						line-height:60rpx;
+					}
+					.check-picker-p{
+						
+					}
+				}
+				.reduction-button{
+					width:60rpx;
+					height:60rpx;
+					border:1rpx solid #0183FA;
+					color:#0183FA;
+					text-align: center;
+					font-size:30rpx;
+					line-height:58rpx;
+					border-radius:6rpx;
+					font-size:34rpx;
+					font-weight:700;
+				}
+				.input-p{
+					width:140rpx;
+					height:60rpx;
+					height:60rpx;
+					text-align: center;
+					border:1rpx solid #dedede;
+					border-radius:6rpx;
+					margin:0 20rpx;
+				}
+				.add-button{
+					width:60rpx;
+					height:60rpx;
+					border:1rpx solid #0183FA;
+					color:#0183FA;
+					text-align: center;
+					font-size:30rpx;
+					line-height:58rpx;
+					border-radius:6rpx;
+					font-size:34rpx;
+					font-weight:700;
+				}
+				.unit-p{
+					text-align: center;
+					flex:1;
+					height:62rpx;
+					line-height:60rpx;
+					font-size:30rpx;
+				}
+				.input-text-p{
+					flex:1;
+					height:185rpx;
+					border:1rpx solid #dedede;
+					border-radius:6rpx;
+					padding:20rpx;
+					margin-right:70rpx;
+					margin-bottom:30rpx;
+				}
+			}
+			.add-item-button{
+				width:588rpx;
+				line-height:80rpx;
+				height:80rpx;
+				margin:0 50rpx 20rpx;
+				background-color: #fff;
+				border:1rpx solid #0183FA;
+				color:#0183FA;
+				font-size:30rpx;
+				text-align: center;
+				border-radius:6rpx;
+			}
+		}
+		.submit-button{
+			width:650rpx;
+			line-height:80rpx;
+			height:80rpx;
+			margin:20rpx 50rpx 60rpx;
+			background-color: #0183FA;
+			color:#fff;
+			font-size:30rpx;
+			text-align: center;
+			border-radius:6rpx;
+		}
+	}
+</style>

+ 533 - 0
pages_hazardousWasteRecycling/views/weighingRegistration/addPage.vue

@@ -0,0 +1,533 @@
+<!-- 称重登记-新增 -->
+<template>
+	<view class="weighingRegistrationAddPage">
+		<view class="weighingRegistrationAddPage-center-box">
+			<view class="text-title-p">基础信息</view>
+			<view class="content-box" style="padding-bottom:20rpx;">
+				<view class="sub-picker-box">
+					<view class="title-box-1" style="width:220rpx;">报备单编号:</view>
+					<view class="text-p-1">{{addForm.newdata1}}</view>
+				</view>
+				<view class="sub-picker-box">
+					<view class="title-box-1" style="width:220rpx;">实验室:</view>
+					<view class="text-p-1">{{addForm.newdata2}}</view>
+				</view>
+				<view class="sub-picker-box">
+					<view class="title-box-1" style="width:220rpx;">上门回收日期:</view>
+					<view class="text-p-1">{{addForm.newdata3}}</view>
+				</view>
+				<view class="sub-picker-box">
+					<view class="title-box-1" style="width:220rpx;">废物种类:</view>
+					<view class="text-p-1">{{addForm.newdata4}}</view>
+				</view>
+				<view class="sub-picker-box">
+					<view class="title-box-1" style="width:220rpx;">报备人:</view>
+					<view class="text-p-1">{{addForm.newdata5}}</view>
+				</view>
+				<view class="sub-picker-box">
+					<view class="title-box-1" style="width:220rpx;">报备时间:</view>
+					<view class="text-p-1">{{addForm.newdata6}}</view>
+				</view>
+			</view>
+			<view class="text-title-p">称重登记</view>
+			<view class="content-box">
+				<view class="for-content-box" v-for="(item,index) in addForm.formData4" :key="index">
+					<view class="sub-picker-box">
+						<view class="mark-box">*</view>
+						<view class="title-box">类型:</view>
+						<view class="picker-box">
+							<picker @change="(val)=>forChange(index,val)" :value="item.forData3" :range="item.forList" :range-key="'label'">
+								<view class="picker-p" :class="item.forData1?'check-picker-p':''">{{item.forData1?item.forData2:'请选择危废类型'}}</view>
+							</picker>
+						</view>
+						<img class="right-button" v-if="addForm.formData4[1]"
+						@click="reductionItemButton(index)"
+						:src="imagesUrl('commonality/icon_zgsq_jian.png')">
+					</view>
+					<view class="sub-picker-box">
+						<view class="mark-box">*</view>
+						<view class="title-box">数量:</view>
+						<view class="reduction-button" @click="reductionAdd(1,index)">-</view>
+						<input class="input-p" type="digit" maxlength="10" @input="(val)=>handleInput(index,val)" v-model="item.forData4">
+						<view class="add-button" @click="reductionAdd(2,index)">+</view>
+						<view class="unit-p">{{item.forData1?item.forData5:''}}</view>
+					</view>
+				</view>
+				<view class="add-item-button" v-if="this.addForm.formData4.length < this.dialogOptionForList.length"
+				@click="addItemButton()">补充其他未报备类型</view>
+				<view class="sub-picker-box">
+					<view class="mark-box"></view>
+					<view class="title-box">图片:</view>
+					<view class="explain-box">可拍摄称重凭据或回收人员照片,最多可上传3张</view>
+				</view>
+				<view class="sub-picker-box">
+					<view class="img-list-box" v-if="addForm.imgList[0]">
+						<view class="for-img-box" v-for="(img,imgIndex) in addForm.imgList" :key="imgIndex" >
+							<p @click="delImg(imgIndex)">x</p>
+							<img :src="baseUrl+img">
+						</view>
+					</view>
+					<view class="img-up-p" @click="selectImage()" v-if="!addForm.imgList[2]">+</view>
+				</view>
+				<view class="sub-picker-box" style="padding-bottom:50rpx;">
+				</view>
+			</view>
+			<view class="submit-button">登记完成,提交</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { config } from '@/api/request/config.js'
+	import {
+		demo1,
+		demo2
+	} from '@/pages_hazardousWasteRecycling/api/index.js'
+	export default {
+		data() {
+			return {
+				baseUrl:config.base_url,
+				addForm:{
+					newdata1:'HW202510400001',
+					newdata2:'植物营养实验室(A201)',
+					newdata3:'2025-11-05(星期四)',
+					newdata4:'4',
+					newdata5:'王二小(2020110010)',
+					newdata6:'2025-11-04 10:10:09',
+					formData4:[],
+					imgList:[],
+				},
+				subList: [
+					{ subId: 1, subName: "实验室1" },
+					{ subId: 2, subName: "实验室2" },
+					{ subId: 3, subName: "实验室3" },
+				],
+				dialogOptionList:[],
+				dialogOptionForList:[
+					{value:'1',label:'数据1',dict:'斤'},
+					{value:'2',label:'数据2',dict:'公斤'},
+					{value:'3',label:'数据3',dict:'升'},
+					{value:'4',label:'数据4',dict:'毫升'},
+					{value:'5',label:'数据5',dict:'公升'},
+					{value:'6',label:'数据6',dict:'克'},
+				],
+			}
+		},
+		onLoad(option) {
+			
+		},
+		onShow() {
+
+		},
+		mounted() {
+			this.initialize(1);
+		},
+		methods: {
+			//初始化
+			initialize(type){
+				let self = this;
+				if(type == 1){
+					//无数据-初始化
+					for(let i=0;i<self.dialogOptionForList.length;i++){
+						if(i<4){
+							let obj = {
+								forData1:self.dialogOptionForList[i].value,
+								forData2:self.dialogOptionForList[i].label,
+								forData3:i,
+								forData4:0,
+								forData5:self.dialogOptionForList[i].dict,
+								forList:self.dialogOptionForList,
+							}
+							self.addForm.formData4.push(JSON.parse(JSON.stringify(obj)))
+						}
+					}
+					this.filtrateList();
+				}else if(type == 2){
+					//有数据-初始化
+				}
+			},
+			//选中实验室
+			subChange(e) {
+				this.$set(this.addForm,'subId',this.subList[e.detail.value].subId);
+				this.$set(this.addForm,'subName',this.subList[e.detail.value].subName);
+				this.$set(this.addForm,'subIndex',e.detail.value);
+			},
+			//选中类型
+			forChange(index,e){
+				this.$set(this.addForm.formData4[index],'forData1',this.addForm.formData4[index].forList[e.detail.value].value);
+				this.$set(this.addForm.formData4[index],'forData2',this.addForm.formData4[index].forList[e.detail.value].label);
+				this.$set(this.addForm.formData4[index],'forData5',this.addForm.formData4[index].forList[e.detail.value].dict);
+				this.$set(this.addForm.formData4[index],'forData3',e.detail.value);
+				this.filtrateList();
+			},
+			//单位值加减
+			reductionAdd(type,index){
+				if(type == 1){
+					//减
+					if(this.addForm.formData4[index].forData4>=1){
+						this.$set(this.addForm.formData4[index],'forData4',this.addForm.formData4[index].forData4-1);
+					}
+				}else if(type == 2){
+					//加
+					if(this.addForm.formData4[index].forData4<9999){
+						this.$set(this.addForm.formData4[index],'forData4',this.addForm.formData4[index].forData4+1);
+					}
+				}
+			},
+			//添加类型
+			addItemButton(){
+				if(this.addForm.formData4.length>= this.dialogOptionForList.length){
+					uni.showToast({
+						title: '没有更多类型可添加',
+						icon: "none",
+						mask: true,
+						duration: 2000
+					});
+					return
+				}
+				this.addForm.formData4.push({
+					forData1:'',
+					forData2:'',
+					forData3:'',
+					forData4:0,
+					forData5:'',
+					forList:[],
+				})
+				this.filtrateList();
+			},
+			//删除类型
+			reductionItemButton(index){
+				let self = this;
+				uni.showModal({
+					// title: '确认要退出吗?',
+					content: '确认删除该类型?',
+					cancelColor: "#999",
+					confirmColor: "#0183FA",
+					success: function(res) {
+						if (res.confirm) {
+							self.addForm.formData4.splice(index,1);
+							self.filtrateList();
+						} else if (res.cancel) {}
+					}
+				});
+			},
+			
+			// 图片上传
+			selectImage() {
+				let self = this;
+				wx.chooseImage({
+						count: 1,
+						sizeType: ["original", "compressed"],
+						sourceType: ["album", "camera"],
+						success: function(res) {
+								let tempFilePaths = res.tempFilePaths[0];
+								self.uploadImg(tempFilePaths);
+						}
+				});
+			},
+			async uploadImg(tempFilePaths){
+			    var self = this;
+			    uni.showLoading({
+			        title: '上传中',
+			        mask: true
+			    });
+			    uni.uploadFile({
+			        url: config.base_url + '/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){
+									self.addForm.imgList.push(res.data.url)
+								}else{
+									uni.showToast({
+										title: res.msg,
+										icon:"none",
+										mask:true,
+										duration: 2000
+									});
+								}
+			        },
+			        fail: err => {},
+			        complete: () => {
+			            uni.hideLoading()
+			        }
+			    });
+			},
+			//删除图片
+			delImg(index){
+				let self = this;
+				uni.showModal({
+					// title: '确认要退出吗?',
+					content: '确认删除该图片?',
+					cancelColor: "#999",
+					confirmColor: "#0183FA",
+					success: function(res) {
+						if (res.confirm) {
+							self.addForm.imgList.splice(index,1);
+						} else if (res.cancel) {}
+					}
+				});
+			},
+			// 小数点后两位
+			handleInput(index,e){
+			  // 一定要加nextTick,否则特殊情况的更改不生效【如:000时,更改为0】
+			  this.$nextTick(() => {
+			    let value = e.detail.value
+			    // 如果当前输入为空,直接允许清空
+			    if (!value) {
+			      this.addForm.formData4[index].forData4 = ''
+			    } else if (value?.charAt(0) === '0' && value.charAt(1) && value.charAt(1) !== '.') {
+			      // // 1. 当第一位为0时,只能输入小数点【第二位必须是小数点】
+			      value = '0'
+			    }
+			    value = value.replace(/[^\d.]/g, '') // 清除"数字"和"."以外的字符
+			    value = value.replace(/\.{2,}/g, '.') // 只保留第一个. 清除多余的
+			    value = value.match(/^\d*(\.?\d{0,2})/g)[0] || '' // 保留2位小数
+			    this.addForm.formData4[index].forData4 = value
+			  })
+			},
+      //匹配数据
+      filtrateList(){
+        let self = this;
+        let forList = JSON.parse(JSON.stringify(this.dialogOptionForList));
+        let newList = JSON.parse(JSON.stringify(this.dialogOptionForList));
+        for(let i=0;i<forList.length;i++){
+          let num = 0;
+          for(let o=0;o<self.addForm.formData4.length;o++){
+            if(forList[i].value == self.addForm.formData4[o].forData1){
+              num++
+              break
+            }
+          }
+          if(num!=0){
+            forList.splice(i,1);
+            i--
+          }
+        }
+        for(let i=0;i<self.addForm.formData4.length;i++){
+          let list = [];
+          if(self.addForm.formData4[i].forData1){
+            for(let o=0;o<newList.length;o++){
+              if(self.addForm.formData4[i].forData1 == newList[o].value){
+                list.push(newList[o]);
+              }
+            }
+          }
+          list = list.concat(forList)
+          self.$set(self.addForm.formData4[i],'forList',JSON.parse(JSON.stringify(list)));
+        }
+      },
+		},
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.weighingRegistrationAddPage{
+		height: 100%;
+		display flex;
+		flex:1;
+		flex-direction column;
+		overflow: hidden;
+		.weighingRegistrationAddPage-top-box{
+			height:380rpx;
+		}
+		.weighingRegistrationAddPage-center-box{
+			flex:1;
+			overflow-y: scroll;
+			overflow-x: hidden
+			display flex;
+			flex-direction column;
+		}
+		.text-title-p{
+			font-size:32rpx;
+			color:#0183FA;
+			line-height:80rpx;
+			margin:0 20rpx;
+		}
+		.content-box{
+			margin:0 20rpx;
+			background-color: #fff;
+			border-radius:10rpx;
+			padding:20rpx 20rpx 0 10rpx;
+			.for-content-box{
+				.right-button{
+					margin-top:8rpx;
+					margin-left:20rpx;
+					width:50rpx;
+					height:50rpx;
+				}
+			}
+			.sub-picker-box{
+				display: flex;
+				padding:10rpx;
+				.mark-box{
+					width:17rpx;
+					color:red;
+					margin-left:10rpx;
+					height:60rpx;
+					line-height:60rpx;
+					margin-bottom:20rpx;
+				}
+				.title-box-1{
+					width:100rpx;
+					margin:0 10rpx;
+					height:40rpx;
+					line-height:40rpx;
+				}
+				.text-p-1{
+					flex:1;
+					height:40rpx;
+					line-height:40rpx;
+				}
+				.title-box{
+					width:100rpx;
+					margin:0 10rpx;
+					height:60rpx;
+					line-height:60rpx;
+				}
+				.text-p{
+					flex:1;
+					text-align: right;
+					height:60rpx;
+					line-height:60rpx;
+				}
+				.picker-box{
+					height:60rpx;
+					flex:1;
+					border:1rpx solid #dedede;
+					border-radius:10rpx;
+					.picker-p{
+						padding:0 20rpx;
+						color:#666;
+						line-height:60rpx;
+					}
+					.check-picker-p{
+						
+					}
+				}
+				.reduction-button{
+					width:60rpx;
+					height:60rpx;
+					border:1rpx solid #0183FA;
+					color:#0183FA;
+					text-align: center;
+					font-size:30rpx;
+					line-height:58rpx;
+					border-radius:6rpx;
+					font-size:34rpx;
+					font-weight:700;
+				}
+				.input-p{
+					width:140rpx;
+					height:60rpx;
+					height:60rpx;
+					text-align: center;
+					border:1rpx solid #dedede;
+					border-radius:6rpx;
+					margin:0 20rpx;
+				}
+				.add-button{
+					width:60rpx;
+					height:60rpx;
+					border:1rpx solid #0183FA;
+					color:#0183FA;
+					text-align: center;
+					font-size:30rpx;
+					line-height:58rpx;
+					border-radius:6rpx;
+					font-size:34rpx;
+					font-weight:700;
+				}
+				.unit-p{
+					text-align: center;
+					flex:1;
+					height:62rpx;
+					line-height:60rpx;
+					font-size:30rpx;
+				}
+				.input-text-p{
+					flex:1;
+					height:185rpx;
+					border:1rpx solid #dedede;
+					border-radius:6rpx;
+					padding:20rpx;
+					margin-right:70rpx;
+					margin-bottom:30rpx;
+				}
+				.explain-box{
+					flex:1;
+					height:32rpx;
+					line-height:30rpx;
+					font-size:28rpx;
+					color:#999;
+				}
+				.img-list-box{
+					display: flex;
+					.for-img-box{
+						position: relative;
+						width:200rpx;
+						height:200rpx;
+						margin-left:18rpx;
+						p{
+							position: absolute;
+							top:0;
+							right:0;
+							border-radius:50%;
+							width:40rpx;
+							height:40rpx;
+							line-height:38rpx;
+							text-align: center;
+							color:#fff;
+							background-color: #FF6A6A;
+						}
+						img{
+							display: inline-block;
+							width:200rpx;
+							height:200rpx;
+						}
+					}
+				}
+				.img-up-p{
+					width:200rpx;
+					height:200rpx;
+					margin-left:18rpx;
+					line-height:200rpx;
+					text-align: center;
+					border:1rpx solid #999;
+					border-radius:10rpx;
+					color:#999;
+					line-height:200rpx;
+					font-size:50rpx;
+				}
+			}
+			.add-item-button{
+				width:588rpx;
+				line-height:80rpx;
+				height:80rpx;
+				margin:0 50rpx 20rpx;
+				background-color: #fff;
+				border:1rpx solid #0183FA;
+				color:#0183FA;
+				font-size:30rpx;
+				text-align: center;
+				border-radius:6rpx;
+			}
+		}
+		.submit-button{
+			width:650rpx;
+			line-height:80rpx;
+			height:80rpx;
+			margin:20rpx 50rpx 60rpx;
+			background-color: #0183FA;
+			color:#fff;
+			font-size:30rpx;
+			text-align: center;
+			border-radius:6rpx;
+		}
+	}
+</style>

+ 234 - 0
pages_hazardousWasteRecycling/views/weighingRegistration/index.vue

@@ -0,0 +1,234 @@
+<!-- 称重登记 -->
+<template>
+	<view class="weighingRegistration">
+		<scroll-view scroll-y @scrolltolower="scrollGet" class="for-max-box">
+			<view class="for-max-big-box" v-for="(item,index) in dataList" :key="index">
+				<view class="for-top-title-box">
+					<view>{{item.data1}}{{item.data2?'('+item.data2+')':''}}</view>
+					<view>{{item.data3}}{{item.data3&&item.data4?'/':''}}{{item.data4}}{{item.data4&&item.data5?'/':''}}{{item.data5}}</view>
+				</view>
+				<view class="for-big-box" @click="goPage(minItem)"
+				v-for="(minItem,minIndex) in item.listData" :key="minIndex">
+					<view class="for-title-box">
+						<view>报备单编号:</view>
+						<view>{{minItem.listNewData2}}</view>
+						<view :class="minItem.listNewData1==1?'colorA':'colorB'">{{minItem.listNewData1==1?'已回收':'待回收'}}</view>
+					</view>
+					<view class="for-content-box">
+						<view>上门回收日期:</view>
+						<view>{{minItem.listNewData3}}</view>
+					</view>
+					<view class="for-content-box">
+						<view style="width:160rpx;">废物种类:</view>
+						<view>{{minItem.listNewData4}}</view>
+					</view>
+					<view class="for-content-box">
+						<view style="width:160rpx;">报备人:</view>
+						<view>{{minItem.listNewData5}}</view>
+					</view>
+					<view class="for-content-box">
+						<view style="width:160rpx;">报备时间:</view>
+						<view>{{minItem.listNewData6}}</view>
+					</view>
+					<view class="fop-position-p" v-if="minItem.listNewData1!=1">》</view>
+				</view>
+			</view>
+			<view class="for-null-p"></view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import {
+		demo1,
+		demo2
+	} from '@/pages_hazardousWasteRecycling/api/index.js'
+	export default {
+		data() {
+			return {
+				// 查询参数
+				getDataType: false,
+				queryParams: {
+					page: 1,
+					pageSize: 10,
+				},
+				total: 0,
+				dataList: [],
+			}
+		},
+		onLoad(option) {
+			
+		},
+		onShow() {
+
+		},
+		mounted() {
+			this.$set(this,'dataList',[{
+				data1:'植物营养实验室',
+				data2:'A201',
+				data3:'资源环境学院',
+				data4:'理科楼',
+				data5:'3楼',
+				listData:[
+					{
+						listNewData1:'1',
+						listNewData2:'HW202510400001',
+						listNewData3:'2025-11-05(星期四)',
+						listNewData4:'4',
+						listNewData5:'王二小(2020110010)',
+						listNewData6:'2025-11-04 10:10:09',
+					},
+					{
+						listNewData1:'1',
+						listNewData2:'HW202510400001',
+						listNewData3:'2025-11-05(星期四)',
+						listNewData4:'4',
+						listNewData5:'王二小(2020110010)',
+						listNewData6:'2025-11-04 10:10:09',
+					},
+					{
+						listNewData1:'1',
+						listNewData2:'HW202510400001',
+						listNewData3:'2025-11-05(星期四)',
+						listNewData4:'4',
+						listNewData5:'王二小(2020110010)',
+						listNewData6:'2025-11-04 10:10:09',
+					},
+					{
+						listNewData1:'2',
+						listNewData2:'HW202510400001',
+						listNewData3:'2025-11-05(星期四)',
+						listNewData4:'4',
+						listNewData5:'王二小(2020110010)',
+						listNewData6:'2025-11-04 10:10:09',
+					},
+					{
+						listNewData1:'2',
+						listNewData2:'HW202510400001',
+						listNewData3:'2025-11-05(星期四)',
+						listNewData4:'4',
+						listNewData5:'王二小(2020110010)',
+						listNewData6:'2025-11-04 10:10:09',
+					},
+				],
+			}]);
+		},
+		methods: {
+			//点击跳转
+			goPage(minItem){
+				console.log(minItem)
+				if(minItem.listNewData1 != 1){
+					uni.navigateTo({
+						url: "/pages_hazardousWasteRecycling/views/weighingRegistration/addPage",
+					});
+				}
+			},
+			//滚动加载事件
+			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();
+					})
+				}
+			},
+			//获取实验室列表
+			async getList() {
+				let self = this;
+				let obj = JSON.parse(JSON.stringify(this.queryParams));
+				const {
+					data
+				} = await laboratoryAppletSubList(obj);
+				if (data.code == 200) {
+					if(self.queryParams.page == 1){
+						this.$set(this, 'dataList', data.data.records);
+						this.$set(this, 'total', data.data.total);
+						if (data.data.total / self.queryParams.pageSize <= self.queryParams.page) {
+							this.$set(this, 'getDataType', true);
+						}
+					}else{
+						this.$set(this, 'dataList', [...this.dataList, ...data.data.records]);
+						this.$set(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>
+	.weighingRegistration{
+		height: 100%;
+		display flex;
+		flex-direction column;
+		background-color: #fff;
+		.for-max-box{
+			flex: 1;
+			overflow-y scroll;
+			.for-null-p{
+				height:60rpx;
+			}
+			.for-max-big-box{
+				.for-top-title-box{
+					height:100rpx;
+					padding:0 20rpx;
+					line-height:rpx;
+					display: flex
+					view{
+						flex:1;
+					}
+					view:nth-child(1){
+						color:#0183FA;
+						font-size:34rpx;
+						line-height:100rpx;
+					}
+					view:nth-child(2){
+						color:#666;
+						text-align: right;
+						line-height:104rpx;
+						font-size:28rpx;
+					}
+				}
+				.for-big-box{
+					width:670rpx;
+					margin:0 40rpx 40rpx;
+					box-shadow: 0 0 8rpx 6rpx rgba(0, 0, 0, 0.1);
+					border-radius: 10rpx;
+					position: relative;
+					padding-bottom:30rpx;
+					.for-title-box{
+						display: flex;
+						line-height:40rpx;
+						padding:30rpx 30rpx 0;
+						view:nth-child(2){
+							flex:1;
+						}
+						.colorA{
+							color:#00EE76;
+						}
+						.colorB{
+							color:#FF6A6A;
+						}
+					}
+					.for-content-box{
+						display: flex;
+						line-height:40rpx;
+						padding:20rpx 30rpx 0;
+					}
+					.fop-position-p{
+						position: absolute;
+						top:150rpx;
+						right:20rpx;
+						color:#999;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 225 - 0
pages_hazardousWasteRecycling/views/weighingRegistration/infoPage.vue

@@ -0,0 +1,225 @@
+<!-- 登记称重详情 -->
+<template>
+	<view class="weighingRegistrationInfoPage">
+		<view class="title-p" style="margin-top:20rpx;">基础信息</view>
+		<view class="title-weight-p">称重登记单编号:{{newData.listNewData1}}</view>
+		<view class="text-p">实验室:{{newData.listNewData2}}</view>
+		<view class="text-p">上门回收日期:{{newData.listNewData3}}</view>
+		<view class="text-p">报备人:{{newData.listNewData4}}</view>
+		<view class="text-p">报备时间:{{newData.listNewData5}}</view>
+		<view class="text-p">称重登记人:{{newData.listNewData6}}</view>
+		<view class="text-p">称重登记时间:{{newData.listNewData7}}</view>
+		<view class="text-p">回收人员确认时间:{{newData.listNewData8}}</view>
+		<view class="signature-box">
+			<view>回收人员签名:</view>
+			<img :src="newData.listNewData9">
+		</view>
+		<view class="title-p">称重登记内容</view>
+		<view class="text-weight-box">
+			<view>危险废物种类</view>
+			<view>共{{dataList.length}}种</view>
+		</view>
+		<view class="text-box" v-for="(item,index) in dataList" :key="index">
+			<view>{{item.name}}</view>
+			<view>{{item.value}}{{item.unit}}</view>
+		</view>
+		<view class="img-box">
+			<view>图片</view>
+			<view>
+				<img :src="img" v-for="(img,imgIndex) in imgList" :key="imgIndex">
+			</view>
+		</view>
+		<view class="flex-null-p"></view>
+	</view>
+</template>
+
+<script>
+	import {
+		demo1,
+		demo2
+	} from '@/pages_hazardousWasteRecycling/api/index.js'
+	export default {
+		data() {
+			return {
+				newData:{
+					listNewData0:'1',
+					listNewData1:'HW202510400001',
+					listNewData2:'植物营养实验室(A201)',
+					listNewData3:'2025-11-05(星期四)',
+					listNewData4:'王二小(2020110010)',
+					listNewData5:'2025-11-04 10:10:09',
+					listNewData6:'2025-11-04 10:10:09',
+					listNewData7:'2025-11-04 10:10:09',
+					listNewData8:'2025-11-04 10:10:09',
+					listNewData9:'https://img0.baidu.com/it/u=966104283,4150027431&fm=253&fmt=auto&app=120&f=JPEG?w=667&h=500',
+				},
+				dataList:[
+					{name:'实验室废液',value:'1',unit:'桶'},
+					{name:'实验室废固',value:'2',unit:'袋'},
+					{name:'动物解剖废弃物',value:'3',unit:'袋'},
+					{name:'废旧试剂',value:'4',unit:'支'},
+					{name:'剧毒废弃化学品',value:'5',unit:'瓶'},
+					{name:'电池',value:'6',unit:'枚'},
+				],
+				imgList:[
+					'https://img0.baidu.com/it/u=966104283,4150027431&fm=253&fmt=auto&app=120&f=JPEG?w=667&h=500',
+					'https://img0.baidu.com/it/u=966104283,4150027431&fm=253&fmt=auto&app=120&f=JPEG?w=667&h=500',
+					'https://img0.baidu.com/it/u=966104283,4150027431&fm=253&fmt=auto&app=120&f=JPEG?w=667&h=500',
+				],
+			}
+		},
+		onLoad(option) {
+			
+		},
+		onShow() {
+
+		},
+		mounted() {
+			
+		},
+		methods: {
+			
+		},
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.weighingRegistrationInfoPage{
+		height: 100%;
+		display flex;
+		flex-direction column;
+		background-color: #fff;
+		position: relative;
+		overflow-x: hidden;
+		overflow-y: scroll;
+		.title-p{
+			line-height:80rpx;
+			font-size:34rpx;
+			padding:0 30rpx;
+			color:#0183FA;
+		}
+		.title-weight-p{
+			line-height:60rpx;
+			font-size:32rpx;
+			padding:0 50rpx;
+			color:#333;
+			font-weight:700;
+		}
+		.text-p{
+			line-height:60rpx;
+			font-size:32rpx;
+			padding:0 50rpx;
+			color:#333;
+		}
+		.signature-box{
+			display: flex;
+			line-height:60rpx;
+			font-size:32rpx;
+			padding:0 50rpx;
+			view{
+				flex:1;
+			}
+			img{
+				width:400rpx;
+				height:160rpx;
+				margin-top:15rpx;
+			}
+		}
+		.img-box{
+			line-height:60rpx;
+			font-size:32rpx;
+			padding:0 50rpx;
+			margin-bottom:80rpx;
+			view:nth-child(1){
+				line-height:60rpx;
+				font-size:32rpx;
+				color:#333;
+				font-weight:700;
+			}
+			view:nth-child(2){
+				img{
+					display: inline-block;
+					width:210rpx;
+					height:210rpx;
+				}
+				img:nth-child(2){
+					margin:0 10rpx;
+				}
+			}
+		}
+		.positon-p{
+			position: absolute;
+			top:20rpx;
+			right:30rpx;
+		}
+		.text-weight-box{
+			display: flex;
+			line-height:60rpx;
+			font-size:32rpx;
+			padding:0 50rpx;
+			color:#333;
+			font-weight:700;
+			view:nth-child(1){
+				flex:1;
+			}
+			view:nth-child(2){
+				
+			}
+		}
+		.text-box{
+			display: flex;
+			line-height:60rpx;
+			font-size:32rpx;
+			padding:0 50rpx;
+			color:#333;
+			view:nth-child(1){
+				flex:1;
+			}
+			view:nth-child(2){
+				
+			}
+		}
+		.remark-box{
+			line-height:60rpx;
+			font-size:32rpx;
+			padding:0 30rpx;
+			color:#333;
+			view:nth-child(1){
+				line-height:80rpx;
+				font-size:32rpx;
+				color:#333;
+				font-weight:700;
+			}
+			view:nth-child(2){
+				padding:0 20rpx;
+				line-height:50rpx;
+				font-size:32rpx;
+				color:#333;
+			}
+		}
+		.flex-null-p{
+			width:2rpx;
+			height:20rpx;
+		}
+		.bottom-button-p{
+			width:700rpx;
+			height:80rpx;
+			line-height:80rpx;
+			font-size:34rpx;
+			color:#fff;
+			background-color: #0183FA;
+			margin:40rpx 25rpx;
+			border-radius:10rpx;
+			text-align: center;
+		}
+		.colorA{
+			color:#0183FA;
+		}
+		.colorB{
+			color:#00CD66;
+		}
+		.colorC{
+			color:#FF6A6A;
+		}
+	}
+</style>

+ 265 - 0
pages_hazardousWasteRecycling/views/weighingRegistration/signatureComponent.vue

@@ -0,0 +1,265 @@
+<template>
+	<view class="signatureComponent">
+		<view class="text-position-box">签字区,请签写清晰易辨识的姓名,不可使用草书</view>
+		<!-- 签名画布 -->
+		<canvas canvas-id="signCanvas" class="sign-canvas" disable-scroll="true" @touchstart="handleTouchStart"
+			@touchmove="handleTouchMove" @touchend="handleTouchEnd"></canvas>
+		<view class="agreement-box">
+			<view class="agreement-min-box" @click="agreementButton">
+				<img class="agreement-img" v-if="!agreementType" :src="imagesUrl('commonality/icon_12.png')">
+				<img class="agreement-img" v-if="agreementType" :src="imagesUrl('commonality/icon_13.png')">
+				<view>* 本人为具备资质的危废回收人员,且已与报备人核实本次回收的危废种类与称重登记重量,签名即表示确认无误。</view>
+			</view>
+		</view>
+		<!-- 操作按钮 -->
+		<view class="button-group">
+			<view @click="clearCanvas">重签</view>
+			<view @click="saveSignature">完成</view>
+		</view>
+	</view>
+</template>
+<script>
+	import {
+		config
+	} from '@/api/request/config.js'
+	export default {
+		data() {
+			return {
+				baseUrl: config.base_url,
+				//签名确认状态
+				agreementType:false,
+				ctx: null, // Canvas上下文
+				points: [], // 存储笔画点
+				isDrawing: false, // 是否正在绘制
+				lastPoint: null // 上一个点(用于笔锋计算)
+			};
+		},
+		mounted() {
+			// 获取Canvas上下文
+			this.ctx = uni.createCanvasContext('signCanvas', this);
+		},
+		methods: {
+			//条款确认
+			agreementButton(){
+				this.$set(this,'agreementType',!this.agreementType);
+			},
+			// 1. 触摸开始
+			handleTouchStart(e) {
+				const touch = e.touches[0];
+				this.startDrawing(touch.x, touch.y);
+			},
+			startDrawing(x, y) {
+				this.isDrawing = true;
+				this.points = [{
+					X: x,
+					Y: y,
+					T: Date.now()
+				}];
+				this.ctx.beginPath();
+				this.ctx.moveTo(x, y);
+			},
+
+			// 2. 触摸移动 (实现笔锋效果的关键)
+			handleTouchMove(e) {
+				if (!this.isDrawing) return;
+				const touch = e.touches[0];
+				const currentPoint = {
+					X: touch.x,
+					Y: touch.y,
+					T: Date.now()
+				};
+				if (this.lastPoint) {
+					// 计算两点间的速度和距离,动态决定线条粗细[citation:8]
+					const speed = this.calcSpeed(currentPoint, this.lastPoint);
+					const lineWidth = this.calcLineWidth(speed);
+
+					// 绘制路径
+					this.ctx.lineWidth = lineWidth;
+					this.ctx.lineCap = 'round';
+					this.ctx.lineJoin = 'round';
+					this.ctx.strokeStyle = '#000000';
+					this.ctx.moveTo(this.lastPoint.X, this.lastPoint.Y);
+					this.ctx.lineTo(currentPoint.X, currentPoint.Y);
+					this.ctx.stroke();
+					this.ctx.draw(true); // 实时绘制
+				}
+				this.lastPoint = currentPoint;
+				this.points.push(currentPoint);
+			},
+
+			// 计算两点间速度(简化版)
+			calcSpeed(current, last) {
+				const distance = Math.sqrt(Math.pow(current.X - last.X, 2) + Math.pow(current.Y - last.Y, 2));
+				const timeDiff = current.T - last.T;
+				return timeDiff > 0 ? distance / timeDiff : 0;
+			},
+
+			// 根据速度计算线宽(速度越快,线条越细)
+			calcLineWidth(speed) {
+				const MAX_WIDTH = 8;
+				const MIN_WIDTH = 2;
+				const MAX_SPEED = 5; // 可调整的阈值
+				let width = MAX_WIDTH - (speed / MAX_SPEED) * (MAX_WIDTH - MIN_WIDTH);
+				return Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, width));
+			},
+
+			// 3. 触摸结束
+			handleTouchEnd() {
+				this.isDrawing = false;
+				this.lastPoint = null;
+			},
+
+			// 4. 清空画布
+			clearCanvas() {
+				this.ctx.clearRect(0, 0, 750, 400); // 尺寸需与canvas实际宽高匹配
+				this.ctx.draw(true);
+				this.points = [];
+			},
+
+			// 5. 保存为图片
+			saveSignature() {
+				let self = this;
+				if(!this.agreementType){
+					uni.showToast({
+						title: "请确认相关条款",
+						icon: "none",
+						mask: true,
+						duration: 2000
+					});
+					return
+				}
+				uni.canvasToTempFilePath({
+					canvasId: 'signCanvas',
+					success: (res) => {
+						const tempFilePath = res.tempFilePath; // 小程序/APP端为临时路径
+						// H5端可能需要特殊处理,部分平台返回base64[citation:1]
+						uni.showToast({
+							title: '保存成功'
+						});
+						console.log('tempFilePath',tempFilePath);
+						self.uploadImg(tempFilePath);
+						// 这里可以将 tempFilePath 上传至服务器或展示预览
+					},
+					fail: (err) => {
+						console.error('保存失败', err);
+					}
+				}, this);
+			},
+			
+			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) {
+							
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: "none",
+								mask: true,
+								duration: 2000
+							});
+						}
+					},
+					fail: err => {},
+					complete: () => {
+						uni.hideLoading()
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="stylus" scoped>
+	.signatureComponent {
+		height: 100%;
+		display flex;
+		flex: 1;
+		flex-direction column;
+		overflow: hidden;
+		position: relative;
+		.text-position-box{
+			width:650rpx;
+			height:200rpx;
+			line-height:200rpx;
+			text-align: center;
+			font-size:14rpx;
+			color:#dedede;
+			margin:0 50rpx;
+			z-index:1;
+			margin-top:10rpx;
+			background-color: #fff;
+			border:1rpx solid #dedede;
+		}
+		.sign-canvas{
+			position: absolute
+			top:10rpx;
+			left:0;
+			width:650rpx;
+			height:200rpx;
+			line-height:200rpx;
+			text-align: center;
+			font-size:14rpx;
+			color:#dedede;
+			margin:0 50rpx;
+			z-index:10;
+		}
+		.agreement-box{
+			flex:1;
+			margin:0 60rpx;
+			.agreement-min-box{
+				display: flex;
+				margin-top:15rpx;
+				.agreement-img{
+					width:20rpx;
+					height:20rpx;
+					margin:0 10rpx 0 0;
+				}
+				view{
+					line-height:20rpx;
+					font-size:12rpx;
+				}
+			}
+		}
+		.button-group{
+			display: flex;
+			margin:0 auto;
+			margin-bottom:20rpx;
+			view{
+				font-size:14rpx;
+				width:100rpx;
+				height:30rpx;
+				line-height:30rpx;
+				text-align: center;
+				background-color: #fff
+				border-radius:6rpx;
+			}
+			view:nth-child(1){
+				margin-right:40rpx;
+				border:1px solid #999;
+				background-color: #fff;
+				color:#666;
+			}
+			view:nth-child(2){
+				border:1px solid #0183FA;
+				background-color: #0183FA;
+				color:#fff;
+			}
+		}
+	}
+</style>