Kaynağa Gözat

加铁桶快捷组盘模版

wcs 18 saat önce
ebeveyn
işleme
f90bdf1f49

+ 40 - 0
pages.json

@@ -421,6 +421,46 @@
 					}
 				}
 			}
+		},
+		{
+			"path": "pages/sample/template",
+			"style": {
+				"navigationBarTitleText": "模版",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#0039a6",
+				"navigationBarTextStyle": "white",
+				"app-plus": {
+					"bounce": "none",
+					"titleNView": false
+				},
+				"style": {
+					"navigationStyle": "custom",
+					"app-plus": {
+						"bounce": "none",
+						"titleNView": false
+					}
+				}
+			}
+		},
+		{
+			"path": "pages/sample/templateGroup",
+			"style": {
+				"navigationBarTitleText": "铁桶入库",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#0039a6",
+				"navigationBarTextStyle": "white",
+				"app-plus": {
+					"bounce": "none",
+					"titleNView": false
+				},
+				"style": {
+					"navigationStyle": "custom",
+					"app-plus": {
+						"bounce": "none",
+						"titleNView": false
+					}
+				}
+			}
 		}
 	],
 	"globalStyle": {

+ 17 - 1
pages/sample/main.vue

@@ -21,6 +21,14 @@
 					color:#ffffff;margin-top:16px;font-size: 15px;" class="button">
 					入库
 				</button>
+				<br>
+					<button type="success" @click="TemplateGroup()" style="
+						border-radius: 50%;width: 95px;
+						height: 95px;margin: auto;text-align: center;
+						line-height: 95px;background-color: #4bbf73;
+						color:#ffffff;margin-top:16px;font-size: 15px;" class="button">
+						铁桶入库
+					</button>
 				<br>
 					<button type="success" @click="QuickGroup()" style="
 						border-radius: 50%;width: 95px;
@@ -209,7 +217,15 @@
 						url: '/pages/sample/QuickGroup',
 					})
 				}, 500);
-			}
+			},
+			TemplateGroup: function(code) {
+				setTimeout(() => {
+					uni.vibrateShort();
+					uni.navigateTo({
+						url: '/pages/sample/templateGroup',
+					})
+				}, 500);
+			},
 		}
 	}
 </script>

+ 0 - 1
pages/sample/select_product.vue

@@ -277,7 +277,6 @@
 								"container_code": containerCode,
 								"printed": _this.printed,
 								"production_line": _this.production_line,
-
 							}
 						}),
 						success: (ret) => {

+ 641 - 0
pages/sample/template.vue

@@ -0,0 +1,641 @@
+<template>
+	<view class="nvue-page-root">
+		<view class="head">
+			<view class="header-wrap">
+				<view class="index-header">
+					<uni-icons class="fanhui" custom-prefix="iconfont" type="icon-fanhui"
+						@click="leftClick"></uni-icons>
+					<view class="input-wrap">
+						<text class="iconfont">入库模版</text>
+					</view>
+					<view class="map-wrap">
+						<!-- <uni-icons class="lanya" custom-prefix="iconfont" type="icon-lanya"></uni-icons> -->
+					</view>
+				</view>
+			</view>
+			<view class="blank"></view>
+		</view>
+		<view class="uni-common-mt" style="padding: 5px;">
+			<view class="uni-input-wrapper" style="margin: 5px auto;">
+				<text class="uni-form-item__title" style="width: 25%;">货物名称: </text>
+				<select-lay :zindex="3" class="uni-input" :value="product_code" name="product_code" placeholder="请选择货物名称"
+					:options="productList" @selectitem="selectProduct">
+				</select-lay>
+			</view>
+			<view class="uni-input-wrapper" style="margin: 5px auto;">
+				<text class="uni-form-item__title" style="width: 25%;">包装印刷</text>
+				<select-lay :zindex="2" style="width: 75%;" :value="printed" name="printed" placeholder="请选择包装印刷"
+					:options="printedList" @selectitem="printedChange">
+				</select-lay>
+			</view>
+			<view class="uni-input-wrapper" style="margin: 5px auto;">
+				<text class="uni-form-item__title" style="width: 25%;">生产线</text>
+				<select-lay :zindex="1" style="width: 75%;" :value="production_line" name="production_line"
+					placeholder="请选择生产线" :options="production_lineList" @selectitem="production_lineChange">
+				</select-lay>
+			</view>
+			<view class="uni-input-wrapper" style="margin: 5px auto;">
+				<text class="uni-form-item__title" style="width: 25%;">数量:</text>
+				<input class="uni-input" :value="num" @input="tmp_num" />
+			</view>
+			<view class="uni-input-wrapper" style="margin: 5px auto;">
+				<text class="uni-form-item__title" style="width: 25%;">重量:</text>
+				<input class="uni-input" :value="weight" @input="tmp_weight" />
+			</view>
+			<view class="uni-input-wrapper" style="margin: 5px auto;">
+				<text class="uni-form-item__title" style="width: 25%;">生产日期</text>
+				<picker style="width: 70%;float: right;" mode="date" :value="plandate" :start="startDate" :end="endDate"
+					@change="plandateChange">
+					<view class="uni-input">{{plandate}}</view>
+				</picker>
+			</view>
+
+
+			<view class="uni-form-item uni-column">
+				<view class="uni-input-wrapper button-sp-area">
+					<button type="primary" plain="true" @click="SelectProductAll()">保存</button>
+					<button type="primary" plain="true" @click="returns()">返回</button>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	let _this = null;
+	import {
+		mapGetters,
+		mapActions
+	} from 'vuex';
+	import {
+		GET_INFODATA,
+		GET_CONNECTBLEDATA
+	} from "@/store/gettersType.js";
+	import {
+		SET_CONNECTBLEDATA
+	} from '@/store/actionsType.js';
+
+	// #ifdef APP-PLUS
+	const modal = uni.requireNativePlugin('modal');
+	// #endif
+	let reqRootUrl = plus.storage.getItem("reqRootUrl");
+	let rData = [];
+	const SpeechTTS = uni.requireNativePlugin('MT-TTS-Speech');
+	export default {
+		data() {
+			const currentDate = this.getDate({
+				format: true
+			});
+			return {
+				printedList: [],
+				printed: "",
+				production_lineList: [],
+				production_line: "一期",
+				productList: [],
+				product_code: "",
+				weight: "",
+				num: "",
+				product_name: "",
+				del_tips: "",
+				plandate: currentDate,
+			}
+		},
+		computed: {
+			...mapGetters([GET_INFODATA, GET_CONNECTBLEDATA]),
+			startDate() {
+				return this.getDate('start');
+			},
+			endDate() {
+				return this.getDate('end');
+			},
+		},
+		methods: {
+			onUnload() {
+				SpeechTTS.destroy();
+			},
+			speak_init() {
+				// console.log('>> TTS:init...')
+				SpeechTTS.init((callback) => {
+					// SpeechTTS.setEngine("com.iflytek.speechcloud"); // 设置引擎
+					SpeechTTS.setEngine("com.google.android.tts"); // 设置引擎
+					// console.log('>> tts: init success');
+					SpeechTTS.setPitch(50); // 设置语调 setPitch(num) 0-100, 默认 50
+					SpeechTTS.setSpeed(65); // 设置语速 setSpeed(num) 0-100, 默认 50
+				});
+				SpeechTTS.onDone((res) => {
+					// console.log(">> tts: play end " + res)
+				});
+			},
+			leftClick: function() {
+				setTimeout(() => {
+					uni.vibrateShort();
+					uni.navigateTo({
+						// url: '/pages/sample/tts',
+						url: '/pages/sample/main',
+					})
+				}, 30);
+			},
+
+			onLoad() {
+				_this = this;
+			},
+			onShow() {
+				uni.hideKeyboard();
+				setTimeout(() => {
+					this.PrintedGet();
+					this.ProductionLineGet();
+					this.speak_init();
+					this.CateGet();
+				}, 500);
+			},
+			returns() {
+				setTimeout(() => {
+					uni.vibrateShort();
+					uni.navigateTo({
+						// url: '/pages/sample/tts',
+						url: '/pages/sample/templateGroup',
+					})
+				}, 500);
+			},
+			SelectProductAll() {
+				if (_this.isEmpty(_this.product_name)) {
+					_this.alertInfo("请选择货物")
+					return
+				}
+				if (_this.isEmpty(_this.weight)) {
+					_this.alertInfo("请填写重量")
+					return
+				}
+				if (_this.isEmpty(_this.num)) {
+					_this.alertInfo("请填写数量")
+					return
+				}
+				if (_this.isEmpty(_this.production_line)) {
+					_this.alertInfo("请选择生产线")
+					return
+				}
+				if (_this.isEmpty(_this.printed)) {
+					_this.alertInfo("请选择包product_name装印刷")
+					return
+				}
+
+				setTimeout(() => {
+					uni.setStorageSync("tmp_product_name", _this.product_name)
+					uni.setStorageSync("tmp_product_code", _this.product_code)
+					uni.setStorageSync("tmp_weight", _this.weight)
+					uni.setStorageSync("tmp_num", _this.num)
+					uni.setStorageSync("tmp_printed", _this.printed)
+					uni.setStorageSync("tmp_production_line", _this.production_line)
+					uni.setStorageSync("tmp_plandate", _this.plandate)
+					_this.alertInfo("模版保存成功")
+				}, 30)
+			},
+			tmp_num: function(event) {
+				this.num = event.detail.value;
+			},
+			tmp_weight: function(event) {
+				this.weight = event.detail.value;
+			},
+
+			printedChange(index, item) {
+				if (index >= 0) {
+					this.printed = item.value;
+				}
+			},
+			plandateChange: function(e) {
+				this.plandate = e.target.value
+			},	
+			getDate(type) {
+				const date = new Date();
+				let year = date.getFullYear();
+				let month = date.getMonth() + 1;
+				let day = date.getDate();
+
+				if (type === 'start') {
+					year = year - 60;
+				} else if (type === 'end') {
+					year = year + 2;
+				}
+				month = month > 9 ? month : '0' + month;
+				day = day > 9 ? day : '0' + day;
+				return `${year}-${month}-${day}`;
+			},
+
+			production_lineChange(index, item) {
+				if (index >= 0) {
+					this.production_line = item.value;
+				}
+			},
+			selectProduct(index, item) {
+				if (index >= 0) {
+					this.product_code = item.value;
+					this.product_name = item.label;
+				} else {
+					this.product_code = ""
+					this.product_name = ""
+				}
+			},
+
+			ProductionLineGet() {
+				uni.request({
+					url: reqRootUrl + '/wms/api',
+					method: 'POST',
+					headers: {
+						'Content-Type': 'application/json'
+					},
+					data: JSON.stringify({
+						"method": "ProductionLineGet",
+						"param": {
+							"disable": false,
+						}
+					}),
+					success: (ret) => {
+						if (ret.data.ret === "ok") {
+							let rows = ret.data.data;
+							for (var i = 0; i < rows.length; i++) {
+								this.production_lineList.push({
+									label: rows[i].name,
+									value: rows[i].name
+								})
+							}
+						}
+					},
+					fail: (err) => {
+						// console.log('request fail', err);
+					},
+					complete: () => {
+						// console.log('complete');
+					}
+				})
+			},
+
+			PrintedGet() {
+				uni.request({
+					url: reqRootUrl + '/wms/api',
+					method: 'POST',
+					headers: {
+						'Content-Type': 'application/json'
+					},
+					data: JSON.stringify({
+						"method": "PrintedGet",
+						"param": {
+							"disable": false,
+						}
+					}),
+					success: (ret) => {
+						if (ret.data.ret === "ok") {
+							let rows = ret.data.data;
+							for (var i = 0; i < rows.length; i++) {
+								this.printedList.push({
+									label: rows[i].name,
+									value: rows[i].name
+								})
+							}
+						}
+					},
+					fail: (err) => {
+						// console.log('request fail', err);
+					},
+					complete: () => {
+						// console.log('complete');
+					}
+				})
+			},
+
+			CateGet() {
+				uni.request({
+					url: reqRootUrl + '/wms/api',
+					method: 'POST',
+					headers: {
+						'Content-Type': 'application/json'
+					},
+					data: JSON.stringify({
+						"method": "ProductGetFilter",
+						"param": {
+							"disable": false,
+						}
+					}),
+					success: (ret) => {
+						if (ret.data.ret === "ok") {
+							this.productList = [];
+							let rows = ret.data.data;
+							for (var i = 0; i < rows.length; i++) {
+								if (rows[i].types === "合托"||rows[i].name === "空托盘") {
+									continue
+								}
+								
+								this.productList.push({
+									label: rows[i].name,
+									value: rows[i].code
+								})
+							}
+						}
+					},
+					fail: (err) => {
+						// console.log('request fail', err);
+					},
+					complete: () => {
+						// console.log('complete');
+					}
+				})
+
+				let product_name = uni.getStorageSync("tmp_product_name")
+				let product_code = uni.getStorageSync("tmp_product_code")
+				let weight = uni.getStorageSync("tmp_weight")
+				let num = uni.getStorageSync("tmp_num")
+				let printed = uni.getStorageSync("tmp_printed")
+				let production_line = uni.getStorageSync("tmp_production_line")
+				let plandate = uni.getStorageSync("tmp_plandate")
+				_this.product_code = product_code;
+				_this.product_name = product_name;
+				_this.weight = weight;
+				_this.num = num;
+				_this.printed = printed;
+				_this.production_line = production_line;
+				_this.plandate = _this.formattedDate(plandate)
+			},
+
+			formattedDate(d) {
+				const date = new Date(d);
+				const year = date.getFullYear();
+				const month = String(date.getMonth() + 1).padStart(2, '0');
+				const day = String(date.getDate()).padStart(2, '0');
+				const hours = String(date.getHours()).padStart(2, '0');
+				const minutes = String(date.getMinutes()).padStart(2, '0');
+				const seconds = String(date.getSeconds()).padStart(2, '0');
+				return `${year}-${month}-${day}`;
+			},
+
+			isEmpty: function(obj) {
+				return typeof obj === undefined || obj == null || obj === "" || obj ===
+					"000000000000000000000000" ||
+					obj.length === 0;
+			},
+			alertInfo(str) {
+				SpeechTTS.speak({
+					text: str,
+				});
+				modal.toast({
+					message: str,
+					duration: 6,
+				});
+			},
+		},
+	}
+</script>
+
+<style scoped>
+	.nvue-page-root {
+		background-color: #F8F8F8;
+		padding-bottom: 0px;
+	}
+
+	.uni-form-item__title {
+		margin: 5px auto;
+	}
+
+	.uni-input-wrapper {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex-wrap: nowrap;
+		background-color: #FFFFFF;
+	}
+
+	.uni-input {
+		height: 28px;
+		line-height: 28px;
+		font-size: 15px;
+		padding: 1px;
+		flex: 1;
+		border-radius: 5px;
+		border: 1px solid #cfdadd;
+		background-color: #FFFFFF;
+	}
+
+	.mini-btn {
+		height: 30px;
+		padding-left: 1px;
+		padding-right: 1px;
+	}
+
+	.uni-eye-active {
+		color: #007AFF;
+	}
+
+	.table-title {
+		background-color: aliceblue;
+		font-weight: 700;
+		margin-top: 10px;
+		height: 40px;
+	}
+
+	.table-data {
+		background-color: aliceblue;
+		font-weight: 700;
+		margin-top: 1px;
+		height: 40px;
+	}
+
+	.tab-tr {
+		width: 25%;
+		line-height: 50px;
+		border-right: 1px solid #ccc;
+		margin: auto;
+		text-align: center;
+	}
+
+	.tab-tr-end {
+		width: 25%;
+		line-height: 50px;
+		border-right: 0px solid #ccc;
+		margin: auto;
+		text-align: center;
+	}
+</style>
+<style lang="scss">
+	$color-base: #0039a6;
+	$words-color-base: #333333;
+	$words-color-light: #999999;
+
+	.header-wrap {
+		width: 100%;
+		position: fixed;
+		top: 0;
+		z-index: 999;
+
+		.index-header {
+			height: 88upx;
+			line-height: 88upx;
+			padding: 0 30upx;
+			padding-top: 40upx;
+			background-color: $color-base;
+			font-Size: 28upx;
+			color: #fff;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+
+			.fanhui {
+				color: #fff !important;
+				font-size: 28px;
+				padding-top: 5px;
+				font-weight: 700;
+			}
+
+			.lanya {
+				color: #fff !important;
+				font-size: 28px;
+				padding-top: 5px;
+			}
+
+			.map-wrap {
+				padding-top: 5px;
+			}
+		}
+	}
+
+	.blank {
+		height: 126upx;
+	}
+
+
+	// 购物车列表
+	.cart-list {
+		padding: 0 5rpx;
+
+		// 购物车商品
+		.goods {
+			display: flex;
+			padding: 5rpx;
+			border-radius: 10rpx;
+			background-color: #fff;
+			position: relative;
+
+			.meta {
+				// border:1px solid red;
+				flex: 1;
+				display: flex;
+				flex-direction: column;
+				justify-content: space-between;
+				margin-left: 5rpx;
+			}
+
+			.name {
+				height: 72rpx;
+				font-size: 18px;
+				color: #000000;
+			}
+
+			.specs {
+				line-height: 2;
+				padding: 0 15rpx;
+				font-size: 16px;
+				align-self: flex-start;
+				border-radius: 4rpx;
+				color: #888;
+				background-color: #f7f7f8;
+			}
+
+			.status_view {
+				line-height: 1;
+				font-size: 18px;
+				color: #444;
+				margin-bottom: 2rpx;
+				color: #000000;
+				padding-top: 5px;
+			}
+
+
+
+
+			// 商品数量
+			.numGroup {
+				// border: 1px solid green;
+				position: absolute;
+				bottom: 70rpx;
+				right: 5rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				width: 120px;
+				height: 48rpx;
+
+				.text_1 {
+					// border: 1px solid red;
+					width: 150px;
+					height: 100%;
+					padding: 0 5rpx;
+					font-size: 15px;
+					color: #444;
+				}
+
+				.text {
+					height: 100%;
+					padding: 0 5rpx;
+					font-size: 32rpx;
+					color: #444;
+				}
+
+				.inputs {
+					// border: 1px solid blue;
+					height: 100%;
+					padding-bottom: 10px;
+					text-align: center;
+					border-radius: 4rpx;
+					font-size: 20px;
+					color: #ff0000;
+					// background-color: #f6f6f6;
+				}
+			}
+
+			// 商品数量
+			.weightGroup {
+				// border: 1px solid green;
+				position: absolute;
+				bottom: 20rpx;
+				right: 5rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				width: 120px;
+				height: 48rpx;
+
+				.text_1 {
+					// border: 1px solid red;
+					width: 50px;
+					height: 100%;
+					padding: 0 5rpx;
+					font-size: 15px;
+					color: #444;
+				}
+
+				.text {
+					height: 100%;
+					padding: 0 5rpx;
+					font-size: 32rpx;
+					color: #444;
+				}
+
+				.inputs {
+					// border: 1px solid blue;
+					height: 100%;
+					padding-bottom: 10px;
+					text-align: center;
+					border-radius: 4rpx;
+					font-size: 20px;
+					color: #ff0000;
+					// background-color: #f6f6f6;
+				}
+			}
+
+
+
+		}
+
+		.cart-swipe {
+			display: block;
+			margin: 20rpx 0;
+		}
+	}
+</style>

+ 1229 - 0
pages/sample/templateGroup.vue

@@ -0,0 +1,1229 @@
+<template>
+	<view class="nvue-page-root">
+		<view class="head">
+			<view class="header-wrap">
+				<view class="index-header">
+					<uni-icons class="fanhui" custom-prefix="iconfont" type="icon-fanhui"
+						@click="leftClick"></uni-icons>
+					<view class="input-wrap">
+						<text class="iconfont">组盘</text>
+					</view>
+					<view class="map-wrap" @click="rightClick">
+						<uni-icons class="lanya" custom-prefix="iconfont" type="icon-lanya"></uni-icons>
+					</view>
+				</view>
+			</view>
+			<view class="blank"></view>
+		</view>
+		<view class="uni-common-mt" style="padding: 5px;">
+			<view class="uni-input-wrapper" style="margin: 5px auto;">
+				<input class="uni-input" auto-focus="true" :focus="firstFocus" placeholder="请扫描托盘码或产品码"
+					v-model="viewText" @input="hideKeyboard" style="font-weight: bold; " />
+			</view>
+			<view class="uni-form-item uni-column">
+				<view class="uni-input-wrapper" style="margin: 5px auto;">
+					<text class="uni-form-item__title" style="width: 25%;">托盘码</text>
+					<input class="uni-input" :value="container_code" disabled="true" />
+				</view>
+				<view class="uni-padding-wrap uni-common-mt">
+					<button type="primary" @click="SelectTemplate()">加载模版</button>
+				</view>
+				<view style="min-height:255px;overflow-y:auto;max-height:255px">
+					<view class="cart-list">
+						<!-- 滑动操作分区 -->
+						<uni-swipe-action>
+							<!-- 滑动操作项 -->
+							<uni-swipe-action-item v-for="(item,index) in tableData" :key="index" class="cart-swipe">
+								<!-- 商品信息 -->
+								<view class="goods" style="border:1px solid #ccc">
+									<view class="meta" style="padding-bottom:15px;" @click="Delete(item)">
+										<view class="name">
+											{{item.product_name}}-{{item.printed}}-{{item.production_line}}
+										</view>
+										<view class="status_view">{{item.status_view}}</view>
+									</view>
+									<!-- 商品数量 -->
+									<view class="weightGroup" @click="Update(item)">
+										<text class="text_1">重量</text>
+										<text class="inputs">{{item.weight}}</text>
+										<text class="text">Kg</text>
+									</view>
+									<!-- 商品数量 -->
+									<view class="numGroup" @click="Update(item)">
+										<text class="text_1">数量</text>
+										<text class="inputs">{{item.num}}</text>
+										<text class="text">个</text>
+									</view>
+								</view>
+							</uni-swipe-action-item>
+						</uni-swipe-action>
+					</view>
+				</view>
+				<view class="uni-input-wrapper button-sp-area">
+					<button type="primary" plain="true" @click="groupDisk()" :disabled="BtnDisabled">组盘</button>
+					<button type="primary" plain="true" @click="in_stock()">入库单</button>
+					<button type="primary" plain="true" @click="Template()">模版</button>
+				</view>
+			</view>
+		</view>
+
+		<!-- 提示窗示例 -->
+		<uni-popup ref="deleteDialog" type="dialog">
+			<uni-popup-dialog type="info" cancelText="取消" confirmText="确定" title="提示" :content="del_tips"
+				@confirm="dialogConfirm" @close="dialogClose"></uni-popup-dialog>
+		</uni-popup>
+
+		<!-- 提示窗示例 -->
+		<uni-popup ref="groupDialog" type="dialog">
+			<uni-popup-dialog type="info" cancelText="取消" confirmText="确定" title="提示" content="确定组盘?"
+				@confirm="dialogGroup" @close="dialogClose"></uni-popup-dialog>
+		</uni-popup>
+
+
+		<!-- 引入自定义模态框 -->
+		<custom-modal :visible="updateModalVisible">
+			<!-- 模态框的内容 -->
+			<view>
+				<text>提示</text>
+				<view class="uni-input-wrapper" style="margin: 5px auto;">
+					<text class="uni-form-item__title" style="width: 30%;">货物名称</text>
+					<input class="uni-input" :value="product_name" disabled="true" />
+				</view>
+				<view class="uni-input-wrapper" style="margin: 5px auto;">
+					<text class="uni-form-item__title" style="width: 30%;">数量</text>
+					<input type="number" class="uni-input" :value="product_num" @input="numChange" />
+				</view>
+				<view class="uni-input-wrapper" style="margin: 5px auto;">
+					<text class="uni-form-item__title" style="width: 30%;">重量</text>
+					<input type="number" class="uni-input" :value="product_weight" @input="weightChange" />
+				</view>
+				<view class="uni-input-wrapper" style="margin: 5px auto;">
+					<text class="uni-form-item__title" style="width: 30%;">包装印刷</text>
+					<select-lay :zindex="4" style="width: 70%;" :value="printed" name="printed" placeholder="请选择包装印刷"
+						:options="printedList" @selectitem="printedChange">
+					</select-lay>
+				</view>
+				<view class="uni-input-wrapper" style="margin: 5px auto;">
+					<text class="uni-form-item__title" style="width: 30%;">生产线</text>
+					<select-lay :zindex="3" style="width: 70%;" :value="production_line" name="production_line"
+						placeholder="请选择生产线" :options="production_lineList" @selectitem="production_lineChange">
+					</select-lay>
+				</view>
+				<view>
+					<text style="width: 30%;float: left;height: 35px;line-height: 35px;">生产日期</text>
+					<picker style="width: 70%;float: right;" mode="date" :value="plandate" :start="startDate"
+						:end="endDate" @change="plandateChange">
+						<view class="uni-input">{{plandate}}</view>
+					</picker>
+				</view>
+				<br><br>
+				<view>
+					<button class="mini-btn" size="mini" @click="closeUpdateModal"
+						style="width: 50%;float: left;">关闭</button>
+					<button class="mini-btn" type="primary" size="mini" @click="UpdateWeight"
+						style="width: 50%;">修改</button>
+				</view>
+			</view>
+		</custom-modal>
+	</view>
+</template>
+<script>
+	import CustomModal from "@/components/CustomModal/CustomModal.vue";
+	let _this = null;
+	import {
+		mapGetters,
+		mapActions
+	} from 'vuex';
+	import {
+		GET_INFODATA,
+		GET_CONNECTBLEDATA
+	} from "@/store/gettersType.js";
+	import {
+		SET_CONNECTBLEDATA
+	} from '@/store/actionsType.js';
+	// #ifdef APP-PLUS
+	const modal = uni.requireNativePlugin('modal');
+	const printModule = uni.requireNativePlugin('PrintModuleCPCL');
+	// #endif
+	let print;
+	var reqRootUrl = plus.storage.getItem("reqRootUrl");
+	let rData = [];
+	const SpeechTTS = uni.requireNativePlugin('MT-TTS-Speech');
+	export default {
+		components: {
+			CustomModal
+		},
+		data() {
+			const currentDate = this.getDate({
+				format: true
+			});
+			return {
+				printedList: [],
+				printed: "无印刷",
+				production_lineList: [],
+				production_line: "一期",
+				container_code: "",
+				product_code: "",
+				product_name: "",
+				product_weight: "",
+				product_num: "",
+				del_tips: "",
+				sn: "",
+				updateModalVisible: false,
+				item: {
+					name: "HM",
+					mac: "60:6E:41:C3:C8:8C",
+				},
+				result: -1,
+				firstFocus: false,
+				viewText: "",
+				tableData: [],
+				plandate: currentDate,
+				BtnDisabled: false,
+			}
+		},
+		computed: {
+			...mapGetters([GET_INFODATA, GET_CONNECTBLEDATA]),
+			startDate() {
+				return this.getDate('start');
+			},
+			endDate() {
+				return this.getDate('end');
+			},
+		},
+		methods: {
+			onUnload() {
+				SpeechTTS.destroy();
+			},
+			speak_init() {
+				// console.log('>> TTS:init...')
+				SpeechTTS.init((callback) => {
+					// SpeechTTS.setEngine("com.iflytek.speechcloud"); // 设置引擎 
+					SpeechTTS.setEngine("com.google.android.tts"); // 设置引擎 
+					// console.log('>> tts: init success');
+					SpeechTTS.setPitch(50); // 设置语调 setPitch(num) 0-100, 默认 50
+					SpeechTTS.setSpeed(65); // 设置语速 setSpeed(num) 0-100, 默认 50
+				});
+				SpeechTTS.onDone((res) => {
+					// console.log(">> tts: play end " + res)
+				});
+			},
+
+			leftClick: function() {
+				setTimeout(() => {
+					uni.navigateBack();
+					// uni.redirectTo({
+					// 	url: '/pages/sample/main',
+					// })
+				}, 30);
+				// this.$emit('change', this.value)
+			},
+
+			rightClick: function() {
+				setTimeout(() => {
+					uni.navigateTo({
+						url: '/pages/sample/richAlert',
+					})
+				}, 30);
+				// this.$emit("rightClick")
+			},
+
+			onLoad() {
+				_this = this;
+				_this.firstFocus = true;
+				_this.getSn()
+				_this.PrintedGet();
+				_this.ProductionLineGet();
+				// 打印相关
+				/*
+				setTimeout(() => {
+					this.$init_bluetooth();
+				}, 500);
+				if (this.result !== 0) {
+					this.closeBT()
+					setTimeout(() => {
+						let item = {
+							name: "HM-A300-E093",
+							mac: "60:6E:41:34:E0:93",
+						};
+						this.confirm_bluetooth(item)
+					}, 1500);
+				} else {
+					// console.log("scssssss")
+				}
+				*/
+			},
+
+			onShow() {
+				uni.hideKeyboard();
+				setTimeout(() => {
+					_this.firstFocus = true;
+					this.getList();
+					this.speak_init();
+				}, 500);
+			},
+
+			SelectTemplate() {
+				let containerCode = uni.getStorageSync("container_code")
+				console.log("_this.container_code ", containerCode)
+				let receiptNum = uni.getStorageSync("receipt_num")
+				console.log("aa ",_this.isEmpty(_this.tableData))
+				if (!_this.isEmpty(_this.tableData)) {
+					return
+				}
+				if (_this.isEmpty(containerCode)) {
+					_this.alertInfo("请先扫码托盘码!")
+					return
+				}
+				setTimeout(() => {
+					_this.firstFocus = false;
+					let product_code = uni.getStorageSync("tmp_product_code");
+					let weight = uni.getStorageSync("tmp_weight");
+					let num = uni.getStorageSync("tmp_num");
+					let printed = uni.getStorageSync("tmp_printed");
+					let production_line = uni.getStorageSync("tmp_production_line");
+					let plandate = uni.getStorageSync("tmp_plandate");
+
+
+					uni.request({
+						url: reqRootUrl + '/wms/api',
+						method: 'POST',
+						headers: {
+							'Content-Type': 'application/json'
+						},
+						data: JSON.stringify({
+							"method": "GroupDiskAdd",
+							"param": {
+								"product_code": product_code,
+								"num": parseFloat(num),
+								"weight": parseFloat(weight),
+								"plandate": new Date(plandate).getTime(),
+								"receipt_num": receiptNum,
+								"container_code": containerCode,
+								"printed": printed,
+								"production_line": production_line,
+							}
+						}),
+						success: (ret) => {
+							if (ret.data.ret === "ok") {
+								setTimeout(() => {
+									_this.alertInfo("添加成功!")
+									_this.$nextTick(() => {
+										_this.firstFocus = true;
+										_this.getList();
+									})
+								}, 30);
+							}
+						}
+					})
+				}, 30);
+			},
+
+			printedChange(index, item) {
+				if (index >= 0) {
+					this.printed = item.value;
+				}
+			},
+			production_lineChange(index, item) {
+				if (index >= 0) {
+					this.production_line = item.value;
+				}
+			},
+			hideKeyboard: function(event) {
+				uni.hideKeyboard();
+				let Value = event.detail.value;
+				Value.trim();
+				_this.firstFocus = false;
+				if (Value !== "" && Value !== null && Value !== undefined) {
+					uni.request({
+						url: reqRootUrl + '/wms/api',
+						method: 'POST',
+						headers: {
+							'Content-Type': 'application/json'
+						},
+						data: JSON.stringify({
+							"method": "CodeGet",
+							"param": {
+								"code": Value,
+							}
+						}),
+						success: (ret) => {
+							let rows = ret.data.data;
+							if (_this.isEmpty(rows)) {
+								_this.alertInfo("托盘码错误,请重新扫描!")
+								_this.getSn();
+								_this.rData = [];
+								_this.tableData = [];
+								_this.$nextTick(() => {
+									_this.firstFocus = true;
+									_this.viewText = "";
+									_this.container_code = "";
+									uni.setStorageSync("container_code", "")
+								})
+								_this.$forceUpdate()
+								return
+							}
+
+							// 扫描到的码可能是入库单号(物料码)、产品码、托盘码
+							// 用扫描到的码查询 组盘表、产品管理表、托盘管理表
+							// 优先显示查询到的组盘表的数据
+							_this.alertInfo("扫码成功!")
+							_this.BtnDisabled = false
+							if (!_this.isEmpty(rows["group_disk"])) {
+								console.log("1", Value)
+								let disk = [];
+								for (var i = 0; i < rows["group_disk"].length; i++) {
+									if (rows["group_disk"][i]["status"] === "status_wait") {
+										rows["group_disk"][i]["status_view"] = "待组盘"
+									}
+									if (rows["group_disk"][i]["status"] === "status_yes") {
+										_this.BtnDisabled = true
+										rows["group_disk"][i]["status_view"] = "已组盘"
+									}
+									disk.push(rows["group_disk"][i])
+								}
+								rData = disk;
+								if (rData.length > 0) {
+									_this.product_name = rData[0]["product_name"];
+									uni.setStorageSync("product_types", rData[0]["types"])
+									_this.product_code = rData[0]["product_code"];
+									_this.container_code = rData[0]["container_code"];
+									uni.setStorageSync("container_code", rData[0]["container_code"])
+									uni.setStorageSync("receipt_num", rData[0]["receipt_num"])
+
+								}
+								this.tableData = disk;
+								_this.$nextTick(() => {
+									_this.firstFocus = true;
+									_this.viewText = "";
+								})
+							}
+							let containerCode = uni.getStorageSync("container_code")
+
+							if (!_this.isEmpty(rows["container_code"])) {
+								_this.container_code = Value;
+								uni.removeStorageSync('container_code');
+								uni.setStorageSync("container_code", Value)
+								console.log("2", Value)
+								// _this.getSn();
+								// _this.getList();
+								if (_this.tableData.length > 0) {
+									for (let i = 0; i < _this.tableData.length; i++) {
+										if (_this.tableData[i]["container_code"] === "") {
+											uni.request({
+												url: reqRootUrl + '/wms/api',
+												method: 'POST',
+												headers: {
+													'Content-Type': 'application/json'
+												},
+												data: JSON.stringify({
+													"method": "GroupDiskUpdate",
+													"param": {
+														"sn": _this.tableData[i]["sn"],
+														"container_code": Value,
+														"product_code": _this.tableData[i][
+															"product_code"
+														]
+													}
+												}),
+												success: (ret) => {
+													_this.alertInfo("更新成功!")
+													_this.getList()
+													//处理成功逻辑
+												},
+											})
+										} else {
+											if (_this.tableData[i]["container_code"] !== Value) {
+												_this.getSn();
+												_this.getList();
+											}
+										}
+									}
+								} else {
+									_this.getSn();
+									_this.getList();
+								}
+								_this.$nextTick(() => {
+									_this.firstFocus = true;
+									_this.viewText = "";
+								})
+							}
+							if (!_this.isEmpty(rows["product"])) {
+								_this.addModalVisible = true;
+								_this.product_code = rows["product"]["code"];
+								_this.product_name = rows["product"]["name"];
+								uni.setStorageSync("product_types", rData[0]["types"])
+								_this.product_num = parseFloat(rows["product"]["ragnum"]);
+								_this.product_weight = parseFloat(rows["product"]["weight"]) * parseFloat(
+									rows["product"]["ragnum"]);
+								_this.viewText = "";
+							}
+						},
+						fail: (err) => {
+							// console.log('request fail', err);
+						},
+						complete: () => {
+							// console.log('complete');
+						}
+					})
+				}
+			},
+
+			closeUpdateModal() {
+				// 关闭模态框  
+				this.updateModalVisible = false;
+			},
+			plandateChange: function(e) {
+				this.plandate = e.target.value
+			},
+			weightChange: function(e) {
+				this.product_weight = e.target.value
+			},
+
+			numChange: function(e) {
+				this.product_num = e.target.value
+			},
+			getDate(type) {
+				const date = new Date();
+				let year = date.getFullYear();
+				let month = date.getMonth() + 1;
+				let day = date.getDate();
+
+				if (type === 'start') {
+					year = year - 60;
+				} else if (type === 'end') {
+					year = year + 2;
+				}
+				month = month > 9 ? month : '0' + month;
+				day = day > 9 ? day : '0' + day;
+				return `${year}-${month}-${day}`;
+			},
+
+			Delete(item) {
+				this.sn = item["sn"]
+				this.del_tips = "确定删除货物" + item["product_name"] + "?";
+				this.$refs.deleteDialog.open()
+			},
+
+			dialogConfirm() {
+				setTimeout(() => {
+					uni.hideLoading()
+					if (parseFloat() <= 0) {
+						modal.toast({
+							message: msg,
+							duration: 6
+						});
+						return
+					} else {
+						uni.request({
+							url: reqRootUrl + '/wms/api',
+							method: 'POST',
+							headers: {
+								'Content-Type': 'application/json'
+							},
+							data: JSON.stringify({
+								"method": "GroupDiskDelete",
+								"param": {
+									[_this.sn]: {}
+								}
+							}),
+							success: (ret) => {
+								_this.alertInfo("删除成功!")
+								_this.getList()
+								//处理成功逻辑
+							},
+							fail: (err) => {
+								// console.log('request fail', err);
+							},
+							complete: () => {
+								// console.log('complete');
+							}
+						})
+					}
+					// 关闭窗口后,恢复默认内容
+					this.$refs.deleteDialog.close()
+				}, 30)
+			},
+
+			dialogClose() {
+				_this.getList();
+			},
+
+			Update(item) {
+				// console.log("item", item)
+				_this.sn = item["sn"]
+				_this.product_weight = item["weight"]
+				_this.product_num = item["num"]
+				_this.product_code = item["product_code"]
+				_this.printed = item["printed"]
+				_this.production_line = item["production_line"]
+				_this.plandate = _this.formattedDate(item["plandate"])
+				_this.updateModalVisible = true;
+			},
+			UpdateWeight() {
+				setTimeout(() => {
+					uni.request({
+						url: reqRootUrl + '/wms/api',
+						method: 'POST',
+						headers: {
+							'Content-Type': 'application/json'
+						},
+						data: JSON.stringify({
+							"method": "GroupDiskUpdate",
+							"param": {
+								"sn": _this.sn,
+								"weight": parseFloat(_this.product_weight),
+								"product_code": _this.product_code,
+								"printed": _this.printed,
+								"production_line": _this.production_line,
+								"num": parseFloat(_this.product_num),
+								"plandate": new Date(_this.plandate).getTime(),
+							}
+						}),
+						success: (ret) => {
+							_this.alertInfo("更新成功!")
+							_this.getList()
+							//处理成功逻辑
+						},
+						fail: (err) => {
+							// console.log('request fail', err);
+						},
+						complete: () => {
+							// console.log('complete');
+						}
+					})
+					_this.updateModalVisible = false;
+					// 关闭窗口后,恢复默认内容
+				}, 30);
+			},
+
+			getList() {
+				let receipt_num = uni.getStorageSync("receipt_num")
+				console.log("receipt_num ", receipt_num)
+				_this.$forceUpdate()
+				rData = [];
+				_this.tableData = [];
+				uni.request({
+					url: reqRootUrl + '/wms/api',
+					method: 'POST',
+					headers: {
+						'Content-Type': 'application/json'
+					},
+					data: JSON.stringify({
+						"method": "GroupDiskGetByCode",
+						"param": {
+							"code": receipt_num,
+						}
+					}),
+					success: (ret) => {
+						//处理成功逻辑
+						let rows = ret.data.data;
+						if (rows != null) {
+							rData = rows;
+							if (rData[0]["receipt_num"] !== receipt_num) {
+								rData = [];
+								_this.tableData = [];
+								return
+							}
+							_this.product_name = rData[0]["product_name"];
+							_this.product_code = rData[0]["product_code"];
+							for (var i = 0; i < rows.length; i++) {
+								if (rows[i]["status"] === "status_success") {
+									rows[i]["status_view"] = "已组盘"
+								} else {
+									rows[i]["status_view"] = "待组盘"
+								}
+							}
+							_this.tableData = rows;
+						} else {
+							rData = [];
+							_this.tableData = [];
+						}
+					},
+					fail: (err) => {
+						// console.log('request fail', err);
+					},
+					complete: () => {
+						// console.log('complete');
+					}
+				})
+			},
+
+			in_stock: function(code) {
+				setTimeout(() => {
+					uni.navigateTo({
+						url: '/pages/sample/in_stock',
+					})
+				}, 500);
+			},
+			
+			Template: function() {
+				_this.firstFocus = false;
+				setTimeout(() => {
+					uni.navigateTo({
+						url: '/pages/sample/template',
+					})
+				}, 30);
+			},
+			groupDisk: function() {
+				_this.firstFocus = false;
+				// console.log("_this.BtnDisabled ", _this.BtnDisabled)
+				if (_this.BtnDisabled) {
+					_this.alertInfo("组盘失败,已组盘货物不能再次组盘")
+					return;
+				}
+				if (_this.isEmpty(rData)) {
+					_this.alertInfo("组盘失败,货物不能为空")
+					return;
+				}
+				let str = _this.product_name;
+				let containerCode = uni.getStorageSync("container_code")
+				let product_types = uni.getStorageSync("product_types")
+				if (_this.isEmpty(containerCode)) {
+					// 产品类别是铁桶的 不允许托盘码为空
+					// console.log("_this.product_name ",product_types)
+					if (product_types === "不合托") {
+						_this.alertInfo("组盘失败,托盘码不能为空")
+						return;
+					}
+				}
+				setTimeout(() => {
+					this.$refs.groupDialog.open()
+				}, 30)
+			},
+
+			dialogGroup() {
+				let sns = [];
+				let productSn = rData[0]["product_sn"];
+				if (rData.length > 1) {
+					_this.alertInfo("组盘失败!只能添加一种货物")
+					return
+				}
+
+				for (var i = 0; i < rData.length; i++) {
+					if (rData[i]["status"] !== "status_wait") {
+						continue
+					}
+					sns.push(rData[i].sn)
+				}
+				let str = _this.product_name;
+
+				let product_types = uni.getStorageSync("product_types")
+				if (product_types === "合托") {
+					_this.container_code = ""
+					uni.setStorageSync("container_code", "")
+				}
+
+				let receiptNum = uni.getStorageSync("receipt_num")
+				let containerCode = uni.getStorageSync("container_code")
+				uni.request({
+					url: reqRootUrl + '/wms/api',
+					method: 'POST',
+					headers: {
+						'Content-Type': 'application/json'
+					},
+					data: JSON.stringify({
+						"method": "ReceiptAdd",
+						"param": {
+							"receipt_num": receiptNum,
+							"group_disk_sn_list": sns,
+							"container_code": containerCode,
+							"types": "normal",
+						}
+					}),
+					success: (ret) => {
+						this.$refs.groupDialog.close()
+						if (ret.data.ret === "ok") {
+							_this.alertInfo("组盘成功")
+							_this.$nextTick(() => {
+								_this.getSn()
+								_this.firstFocus = false;
+								_this.firstFocus = true;
+								_this.viewText = "";
+								_this.container_code = ""
+								uni.setStorageSync("container_code", "")
+								_this.getList()
+							})
+							_this.$forceUpdate()
+							if (product_types === "合托") {
+								// console.log("handlePrint ", receiptNum)
+								this.handlePrint(ret.data.data.receiptNum)
+							}
+							uni.setStorageSync("product_types", "")
+							uni.setStorageSync("container_code", "")
+						} else {
+							_this.alertInfo("组盘失败!" + ret.data.msg)
+						}
+					},
+					fail: (err) => {
+						// console.log('request fail', err);
+					},
+					complete: () => {
+						// console.log('complete');
+					}
+				})
+			},
+
+			ProductionLineGet() {
+				uni.request({
+					url: reqRootUrl + '/wms/api',
+					method: 'POST',
+					headers: {
+						'Content-Type': 'application/json'
+					},
+					data: JSON.stringify({
+						"method": "ProductionLineGet",
+						"param": {
+							"disable": false,
+						}
+					}),
+					success: (ret) => {
+						if (ret.data.ret === "ok") {
+							let rows = ret.data.data;
+							for (var i = 0; i < rows.length; i++) {
+								this.production_lineList.push({
+									label: rows[i].name,
+									value: rows[i].name
+								})
+							}
+						}
+					},
+					fail: (err) => {
+						// console.log('request fail', err);
+					},
+					complete: () => {
+						// console.log('complete');
+					}
+				})
+			},
+			PrintedGet() {
+				uni.request({
+					url: reqRootUrl + '/wms/api',
+					method: 'POST',
+					headers: {
+						'Content-Type': 'application/json'
+					},
+					data: JSON.stringify({
+						"method": "PrintedGet",
+						"param": {
+							"disable": false,
+						}
+					}),
+					success: (ret) => {
+						if (ret.data.ret === "ok") {
+							let rows = ret.data.data;
+							for (var i = 0; i < rows.length; i++) {
+								this.printedList.push({
+									label: rows[i].name,
+									value: rows[i].name
+								})
+							}
+						}
+					},
+					fail: (err) => {
+						// console.log('request fail', err);
+					},
+					complete: () => {
+						// console.log('complete');
+					}
+				})
+			},
+			isEmpty: function(obj) {
+				return typeof obj === undefined || obj == null || obj === "" || obj === "000000000000000000000000" ||
+					obj.length === 0;
+			},
+			alertInfo(str) {
+				SpeechTTS.speak({
+					text: str,
+				});
+				modal.toast({
+					message: str,
+					duration: 6,
+				});
+			},
+			onNavigationBarButtonTap: function(e) {
+				setTimeout(() => {
+					uni.navigateTo({
+						url: '/pages/sample/richAlert',
+					})
+				}, 500);
+			},
+			// 打印机相关
+			...mapActions([SET_CONNECTBLEDATA]),
+			// 连接打印机
+			confirm_bluetooth(item) {
+				// let {
+				// 	name,
+				// 	mac
+				// } = item;
+				uni.showLoading({
+					title: "连接中...",
+					mask: true
+				})
+				let mac = item.mac;
+				try {
+					printModule.connectionBT({
+						'address': mac
+					}, result => {
+						// console.log("result ",result)
+						const msg = JSON.stringify(result);
+						this.result = JSON.parse(msg).result;
+						modal.toast({
+							message: msg,
+							duration: 6
+						});
+						uni.hideLoading()
+						printModule.setDisConnectBTListener((ret) => {
+							modal.toast({
+								message: '蓝牙断开',
+								duration: 6
+							});
+						})
+					})
+				} catch (e) {
+					console.log(e)
+				}
+			},
+			//搜索没匹配的蓝牙设备
+			search_bluetooth(address) {
+				let _this = this;
+				//检查蓝牙是否开启
+				this.$check_bluetooth_open().then(ores => {
+					if (ores) {
+						console.log(ores);
+						//搜索蓝牙
+						_this.$search_bluetooth().then(bres => {
+							console.log(bres);
+							if (bres.code) {
+								_this.$search_pipei().then(pres => {
+									console.log(pres);
+								})
+							}
+						})
+					}
+				})
+			},
+			handlePrint(code) {
+				printModule.printAreaSize({
+					'height': '500',
+					'number': '1'
+				}, result => {})
+				printModule.printBarCode({
+					'x_pos': '10',
+					'y_pos': '100',
+					'code_type': '128',
+					'ratio': '1',
+					'height': '250',
+					'width': '2',
+					'rotation': 'BARCODE',
+					'undertext': false,
+					'number': '4',
+					'offset': '5',
+					"textAlign": "right",
+					'code_data': code
+				});
+				printModule.printForm()
+				printModule.print()
+			},
+			closeBT() {
+				printModule.closeBT();
+			},
+
+			getSn() {
+				let today = new Date();
+				let year = today.getFullYear();
+				let month = today.getMonth() + 1;
+				let date = today.getDate();
+				let hours = today.getHours();
+				let minutes = today.getMinutes();
+				let seconds = today.getSeconds();
+				let millisecond = today.getMilliseconds()
+				if (month <= 9) {
+					month = '0' + month
+				}
+				if (minutes <= 9) {
+					minutes = '0' + minutes;
+				}
+				if (date <= 9) {
+					date = '0' + date;
+				}
+				if (seconds <= 9) {
+					seconds = '0' + seconds;
+				}
+				let sn = year + '' + month + '' + date + '' + hours + '' + minutes + '' + seconds + '' + millisecond
+				uni.removeStorageSync('receipt_num');
+				uni.setStorageSync("receipt_num", sn)
+				console.log("receipt_num ", sn)
+				return sn
+			},
+
+			formattedDate(d) {
+				const date = new Date(d);
+				const year = date.getFullYear();
+				const month = String(date.getMonth() + 1).padStart(2, '0');
+				const day = String(date.getDate()).padStart(2, '0');
+				const hours = String(date.getHours()).padStart(2, '0');
+				const minutes = String(date.getMinutes()).padStart(2, '0');
+				const seconds = String(date.getSeconds()).padStart(2, '0');
+				return `${year}-${month}-${day}`;
+			},
+		},
+	}
+</script>
+
+<style scoped>
+	.nvue-page-root {
+		background-color: #F8F8F8;
+		padding-bottom: 0px;
+	}
+
+	.uni-form-item__title {
+		margin: 5px auto;
+	}
+
+	.uni-input-wrapper {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex-wrap: nowrap;
+		background-color: #FFFFFF;
+	}
+
+	.uni-input {
+		height: 28px;
+		line-height: 28px;
+		font-size: 15px;
+		padding: 1px;
+		flex: 1;
+		border-radius: 5px;
+		border: 1px solid #cfdadd;
+		background-color: #FFFFFF;
+	}
+
+	.mini-btn {
+		height: 30px;
+		padding-left: 1px;
+		padding-right: 1px;
+	}
+
+	.uni-eye-active {
+		color: #007AFF;
+	}
+
+	.table-title {
+		background-color: aliceblue;
+		font-weight: 700;
+		margin-top: 10px;
+		height: 40px;
+	}
+
+	.table-data {
+		background-color: aliceblue;
+		font-weight: 700;
+		margin-top: 1px;
+		height: 40px;
+	}
+
+	.tab-tr {
+		width: 25%;
+		line-height: 50px;
+		border-right: 1px solid #ccc;
+		margin: auto;
+		text-align: center;
+	}
+
+	.tab-tr-end {
+		width: 25%;
+		line-height: 50px;
+		border-right: 0px solid #ccc;
+		margin: auto;
+		text-align: center;
+	}
+</style>
+<style lang="scss">
+	$color-base: #0039a6;
+	$words-color-base: #333333;
+	$words-color-light: #999999;
+
+	.header-wrap {
+		width: 100%;
+		position: fixed;
+		top: 0;
+		z-index: 999;
+
+		.index-header {
+			height: 88upx;
+			line-height: 88upx;
+			padding: 0 30upx;
+			padding-top: 40upx;
+			background-color: $color-base;
+			font-Size: 28upx;
+			color: #fff;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+
+			.fanhui {
+				color: #fff !important;
+				font-size: 28px;
+				padding-top: 5px;
+				font-weight: 700;
+			}
+
+			.lanya {
+				color: #fff !important;
+				font-size: 28px;
+				padding-top: 5px;
+			}
+
+			.map-wrap {
+				padding-top: 5px;
+			}
+		}
+	}
+
+	.blank {
+		height: 126upx;
+	}
+
+
+	// 购物车列表
+	.cart-list {
+		padding: 0 5rpx;
+
+		// 购物车商品
+		.goods {
+			display: flex;
+			padding: 5rpx;
+			border-radius: 10rpx;
+			background-color: #fff;
+			position: relative;
+
+			.meta {
+				// border:1px solid red;
+				flex: 1;
+				display: flex;
+				flex-direction: column;
+				justify-content: space-between;
+				margin-left: 5rpx;
+			}
+
+			.name {
+				height: 72rpx;
+				font-size: 18px;
+				color: #000000;
+			}
+
+			.specs {
+				line-height: 2;
+				padding: 0 15rpx;
+				font-size: 16px;
+				align-self: flex-start;
+				border-radius: 4rpx;
+				color: #888;
+				background-color: #f7f7f8;
+			}
+
+			.status_view {
+				line-height: 1;
+				font-size: 18px;
+				color: #444;
+				margin-bottom: 2rpx;
+				color: #000000;
+				padding-top: 5px;
+			}
+
+
+
+
+			// 商品数量
+			.numGroup {
+				// border: 1px solid green;
+				position: absolute;
+				bottom: 70rpx;
+				right: 5rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				width: 120px;
+				height: 48rpx;
+
+				.text_1 {
+					// border: 1px solid red;
+					width: 50px;
+					height: 100%;
+					padding: 0 5rpx;
+					font-size: 15px;
+					color: #444;
+				}
+
+				.text {
+					height: 100%;
+					padding: 0 5rpx;
+					font-size: 32rpx;
+					color: #444;
+				}
+
+				.inputs {
+					// border: 1px solid blue;
+					height: 100%;
+					padding-bottom: 10px;
+					text-align: center;
+					border-radius: 4rpx;
+					font-size: 20px;
+					color: #ff0000;
+					// background-color: #f6f6f6;
+				}
+			}
+
+			// 商品数量
+			.weightGroup {
+				// border: 1px solid green;
+				position: absolute;
+				bottom: 20rpx;
+				right: 5rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				width: 120px;
+				height: 48rpx;
+
+				.text_1 {
+					// border: 1px solid red;
+					width: 50px;
+					height: 100%;
+					padding: 0 5rpx;
+					font-size: 15px;
+					color: #444;
+				}
+
+				.text {
+					height: 100%;
+					padding: 0 5rpx;
+					font-size: 32rpx;
+					color: #444;
+				}
+
+				.inputs {
+					// border: 1px solid blue;
+					height: 100%;
+					padding-bottom: 10px;
+					text-align: center;
+					border-radius: 4rpx;
+					font-size: 20px;
+					color: #ff0000;
+					// background-color: #f6f6f6;
+				}
+			}
+
+
+
+		}
+
+		.cart-swipe {
+			display: block;
+			margin: 20rpx 0;
+		}
+	}
+</style>

+ 82 - 0
pages/sample/webView.vue

@@ -0,0 +1,82 @@
+<template>
+  <view class="web-view-container">
+    <web-view 
+      :src="webUrl" 
+      @load="onWebLoad" 
+      @error="onWebError"
+      @message="onWebMessage"
+    ></web-view>
+  </view>
+</template>
+
+<script>
+const modal = uni.requireNativePlugin('modal');
+const SpeechTTS = uni.requireNativePlugin('MT-TTS-Speech');
+export default {
+  data() {
+    return {
+      webUrl: 'http://'+plus.storage.getItem("ip")+':'+plus.storage.getItem("port")+'/w/pda/',
+    };
+  },
+  onLoad() {
+    this.speak_init();
+  },
+  onUnload() {
+    SpeechTTS.destroy();
+  },
+  methods: {
+    speak_init() {
+      SpeechTTS.init((callback) => {
+        SpeechTTS.setEngine("com.google.android.tts");
+        SpeechTTS.setPitch(50);
+        SpeechTTS.setSpeed(65);
+      });
+      SpeechTTS.onDone((res) => {
+        console.log("语音播报结束:", res);
+      });
+    },
+    
+    onWebLoad(e) {
+      console.log('网页加载完成:', e.detail.url);
+    },
+    
+    onWebError(e) {
+      console.error('网页加载失败:', e);
+      uni.showToast({
+        title: '网页加载失败,请检查地址', 
+        icon: 'none', 
+        duration: 2000
+      });
+    },
+    
+    onWebMessage(e) {
+      console.log('收到网页消息1:', e.detail);
+      if (e.detail && e.detail.data) {
+        const msgData = e.detail.data[0]
+        SpeechTTS.speak({
+          text: msgData.text,
+        });
+        modal.toast({
+          message: msgData.text,
+          duration: 6,
+        });
+      }
+    }
+  }
+};
+</script>
+
+<style scoped>
+.web-view-container {
+  width: 100vw;
+  height: 100vh;
+  margin: 0 !important; /* 新增:清除容器外边距 */
+  padding: 0 !important; /* 新增:清除容器内边距 */
+}
+uni-web-view, web-view {
+  width: 100%;
+  height: 100%;
+  margin: 0 !important; /* 新增:清除web-view自身占位 */
+  padding: 0 !important;
+}
+</style>