From 459a62207a0a8ee406c233f8edf9f7ee88a5bbe2 Mon Sep 17 00:00:00 2001
From: schangxiang@126.com <schangxiang@126.com>
Date: 周六, 31 8月 2024 16:10:42 +0800
Subject: [PATCH] 菜单优化

---
 yiqi_pda/api/outBound/index.js                               |   17 
 yiqi_pda/pages/outBoundNew/index.vue                         |  384 ++++++++++
 yiqi_pda/pages/home/index.vue                                |    4 
 yiqi_pda/api/api.js                                          |    4 
 yiqi_pda/pages/unLine/modules/content.vue                    |  128 +++
 yiqi_pda/pages/outBoundNew/modules/ScanInputFormItem_Car.vue |  224 ++++++
 yiqi_pda/pages/outBoundNew/modules/modalPwd.vue              |  114 +++
 yiqi_pda/config/modules/ajax.js                              |    4 
 yiqi_pda/pages/unLine/modules/modalPwd.vue                   |  114 +++
 yiqi_pda/config/index.js                                     |    4 
 yiqi_pda/pages/unLine/modules/ScanInputFormItem.vue          |  224 ++++++
 yiqi_pda/pages/outBoundNew/modules/content.vue               |  128 +++
 yiqi_pda/pages/outBoundNew/modules/ScanInputFormItem.vue     |  224 ++++++
 yiqi_pda/pages.json                                          |    6 
 yiqi_pda/pages/unLine/index.vue                              |  391 ++++++++++
 yiqi_pda/pages/unLine/modules/ScanInputFormItem_Car.vue      |  224 ++++++
 16 files changed, 2,188 insertions(+), 6 deletions(-)

diff --git a/yiqi_pda/api/api.js b/yiqi_pda/api/api.js
index d246566..bd42100 100644
--- a/yiqi_pda/api/api.js
+++ b/yiqi_pda/api/api.js
@@ -1,7 +1,7 @@
 // 鍚屾椂鍙戦�佸紓姝ヨ姹傜殑娆℃暟锛岄槻姝竴娆$偣鍑绘湁澶氭璇锋眰
 let ajaxTime = 0;
-//export const baseUrl = 'http://localhost:7788'
-export const baseUrl = 'http://10.135.75.70:7788' //鐢熶骇鐢�
+export const baseUrl = 'http://localhost:7788'
+//export const baseUrl = 'http://10.135.75.70:7788' //鐢熶骇鐢�
 //export const baseUrl = 'http://192.168.216.203:7788' //娴嬭瘯鐢�
 
 // 鍏叡鐨剅equest鏂规硶
diff --git a/yiqi_pda/api/outBound/index.js b/yiqi_pda/api/outBound/index.js
index 3d531ef..3d36675 100644
--- a/yiqi_pda/api/outBound/index.js
+++ b/yiqi_pda/api/outBound/index.js
@@ -18,6 +18,23 @@
   })
 }
 
+// 涓嬬嚎鎵ц /api/pdaservice/unLineWorkPiece
+export function unLineWorkPiece(data) {
+  return request({
+    url:  `/api/pdaservice/unLineWorkPiece`,
+    method: 'post',
+    data
+  })
+}
+// 鍑哄簱鎵ц /api/pdaservice/outStoreWorkPiece
+export function outStoreWorkPiece(data) {
+  return request({
+    url:  `/api/pdaservice/outStoreWorkPiece`,
+    method: 'post',
+    data
+  })
+}
+
 
 // 鍑哄簱缁熻 /api/pdaservice/getOutBoundWorkPieceInfoCount
 export function getOutBoundWorkPieceInfoCount(data) {
diff --git a/yiqi_pda/config/index.js b/yiqi_pda/config/index.js
index b05a336..69a994d 100644
--- a/yiqi_pda/config/index.js
+++ b/yiqi_pda/config/index.js
@@ -17,6 +17,8 @@
 		retrospect: "/pages/retrospect/index",
 		shift:"/pages/shift/index",
 		production:"/pages/production/index",
-		outBound:'/pages/outBound/index'
+		outBound:'/pages/outBound/index',
+		unLine:'/pages/unLine/index',
+		outBoundNew:'/pages/outBoundNew/index'
 	}
 }
\ No newline at end of file
diff --git a/yiqi_pda/config/modules/ajax.js b/yiqi_pda/config/modules/ajax.js
index fce2ee6..93463f7 100644
--- a/yiqi_pda/config/modules/ajax.js
+++ b/yiqi_pda/config/modules/ajax.js
@@ -1,9 +1,9 @@
 export default {
 	errMsg:'缃戠粶閿欒锛�',
 	host:{  //鎺ュ彛璋冪敤鐨勫煙鍚嶈缃�
-		 'default':'http://10.135.75.70:7788',//鐢熶骇鐢�
+		//'default':'http://10.135.75.70:7788',//鐢熶骇鐢�
 		//'default':'http://192.168.216.203:7788', //鐢熶骇鐜鍦板潃
-		//'default':'http://localhost:7788',
+		'default':'http://localhost:7788',
 		'mock':'http://localhost:3012'
 	},
 	block:{
diff --git a/yiqi_pda/pages.json b/yiqi_pda/pages.json
index e79fd90..9ae0edf 100644
--- a/yiqi_pda/pages.json
+++ b/yiqi_pda/pages.json
@@ -80,6 +80,12 @@
 		},
 		{
 			"path": "pages/outBound/index"
+		},
+		{
+			"path": "pages/unLine/index"
+		},
+		{
+			"path": "pages/outBoundNew/index"
 		}
     ],
 	"globalStyle": {
diff --git a/yiqi_pda/pages/home/index.vue b/yiqi_pda/pages/home/index.vue
index b139323..7f5ec8f 100644
--- a/yiqi_pda/pages/home/index.vue
+++ b/yiqi_pda/pages/home/index.vue
@@ -58,7 +58,9 @@
 						{name:'宸ヤ欢淇℃伅鍗曚釜淇敼',icon:'icon-worker',pathName:'unbind',color:'#1e90ff'},
 						{name:'宸ヤ欢璐ㄩ噺淇℃伅鎵归噺淇敼',icon:'icon-worker',pathName:'unbindAll',color:'#1e90ff'},
 						{name:'宸ヤ欢淇℃伅杩芥函',icon:'icon-notice',pathName:'retrospect',color:'#1e90ff'},
-						{name:'宸ヤ欢鍑哄簱鎵ц',icon:'icon-notice',pathName:'outBound',color:'#1e90ff'}
+						{name:'宸ヤ欢鍑哄簱鎵ц',icon:'icon-notice',pathName:'outBound',color:'#1e90ff'},
+						{name:'宸ヤ欢涓嬬嚎(鏂�)',icon:'icon-notice',pathName:'unLine',color:'#1e90ff'},
+						{name:'宸ヤ欢鍑哄簱(鏂�)',icon:'icon-notice',pathName:'outBoundNew',color:'#1e90ff'}
 					]
 				},
 				{
diff --git a/yiqi_pda/pages/outBoundNew/index.vue b/yiqi_pda/pages/outBoundNew/index.vue
new file mode 100644
index 0000000..164ecd6
--- /dev/null
+++ b/yiqi_pda/pages/outBoundNew/index.vue
@@ -0,0 +1,384 @@
+<template>
+	<default-header-page-layout ref="page" title="鍑哄簱鎵ц">
+
+		<view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
+			<action-user-row />
+		<scan-input-form-item-car  v-model="CarNo" class="forma-item" :label="baseTitile_Car"
+				:msg-type="msgType" />
+			<view class="with-action-user-row-page-content">
+
+
+				<Content @deleteData="deleteData" :workPieceData="workPieceData" />
+			</view>
+			<modalPwd @reflesh="reflesh" ref="pwdRef" />
+		</view>
+		<template v-slot:footer>
+			<view class="bottom-btns-row">
+				<view class="btn-frame right-btn-frame">
+					<u-button  type="primary" text="纭鍑哄簱"
+						@click="outBoundConfirm"></u-button>
+				</view>
+			</view>
+		</template>
+	</default-header-page-layout>
+</template>
+
+<script>
+	import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
+	import ActionUserRow from '@/components/ActionUserRow.vue'
+	import ScanInputFormItem from './modules/ScanInputFormItem.vue'
+		import ScanInputFormItemCar from './modules/ScanInputFormItem_Car.vue'
+	import Content from './modules/content.vue'
+	import modalPwd from './modules/modalPwd.vue'
+	import Vue from 'vue'
+	import {
+		parseDic,
+		$alert,
+		$successInfo
+	} from '@/static/js/utils/index.js'
+	import {
+		getWorkPieceByOP80NewCode,
+		outBoundWorkPiece,
+		getOutBoundWorkPieceInfoCount
+	} from '@/api/outBound/index.js'
+	import {
+		listbycode
+	} from '@/api/common/index.js'
+	export default {
+		name: 'baseInPage',
+		components: {
+			DefaultHeaderPageLayout,
+			ActionUserRow,
+			ScanInputFormItem,
+			ScanInputFormItemCar,
+			Content,
+			modalPwd
+		},
+		data() {
+			return {
+				barHeight: '',
+				ckNumToday: "0", //浠婂ぉ鎬诲嚭搴撴暟
+				baseTitile_Car: '鎵弿灏忚溅鐮�', 
+				title: '',
+				CarNo:'',
+				pageBodyHeight: 0,
+				initInterVal: null,
+				myInterval: null,
+				msg: '',
+				msgType: 'error',
+				OP80NewCode: '',
+				workPieceData: [],
+				workPieceStatus: [],
+				inputFocus: true,
+				// codeLength:1
+			}
+		},
+		onLoad() {
+			var _this = this;
+			_this._getOutBoundWorkPieceInfoCount();
+			//涓嶅啀寰幆璇�
+			/*
+			this.myInterval = setInterval(function() {
+				_this._getOutBoundWorkPieceInfoCount();
+			}, 1000 * 10);
+			//*/
+			//this.myInterval=setInterval(this.myFun(), 3000);
+		},
+		methods: {
+			// 鑾峰彇宸ヤ欢淇℃伅
+			async _getOutBoundWorkPieceInfoCount(OP80NewCode) {
+				try {
+					let {
+						data
+					} = await getOutBoundWorkPieceInfoCount(null)
+					this.ckNumToday = data;
+				} catch (e) {}
+				this.setMsg();
+			},
+			// 鑾峰彇宸ヤ欢淇℃伅
+			async onSearchContainter(OP80NewCode) {
+				//debugger
+				if (OP80NewCode.length==0) {
+					this.initFocus(100);
+					// uni.showToast({
+					// 	title: '宸ヤ欢鐮佹垨鎴愬搧鐮侀暱搴︿笉姝g‘',
+					// 	icon: 'error',
+					// 	duration: 2000,
+					// 	mask: true
+					// });
+					return;
+				}
+				
+				this.inputFocus = false
+				const param = {
+					OP80NewCode: OP80NewCode
+				}
+				try {
+					let data={};
+					data.addTime = new Date();
+					data.workPieceID=OP80NewCode;
+					data.oP80NewCode=OP80NewCode;
+					if (!this.workPieceData.some(item => item.workPieceID == data.workPieceID)) {
+						data.addTime = new Date();
+						this.workPieceData.push(data)
+					}
+					//椤哄簭璋冭浆锛屾帓搴�
+					this.workPieceData.sort((a, b) => b.addTime - a.addTime);
+
+					//console.log(this.workPieceData,'dsts');
+					// setTimeout(()=>{
+					// 	this.OP80NewCode = '' ;//姣忔鍒峰畬灏辨竻绌鸿緭鍏ユ 銆怑ditby shaocx,2024-06-12銆�
+					// 	this.inputFocus=true
+					// },100)
+				} catch (e) {
+					//debugger
+					//TODO handle the exception
+					console.log(e);
+				}
+				//this.msg = " 鎵爜鏁�:"+this.workPieceData.length+"    浠婃棩鍑哄簱鏁�:";
+				this.setMsg();
+			},
+			setMsg() {
+				this.msg = " 鎵爜鏁�:" + this.workPieceData.length + "    浠婃棩鍑哄簱鏁�:" + this.ckNumToday;
+			},
+			initFocus(num) {
+				setTimeout(() => {
+					this.OP80NewCode = ''; //姣忔鍒峰畬灏辨竻绌鸿緭鍏ユ 銆怑ditby shaocx,2024-06-12銆�
+					this.inputFocus = true
+				}, num)
+			},
+			// 鑾峰彇鎵爜闀垮害
+			// async listbycode(){
+			// 	try{
+			// 		let {data}=await listbycode({code:'outbound_code_length'})
+			// 		this.codeLength=data.length>0?Number.parseInt(data[0].label):1
+			// 	}catch(e){
+			// 		//TODO handle the exception
+			// 		console.log(e);
+			// 	}
+
+			// },
+			onClearContainter() {
+				this.OP80NewCode = ''
+			},
+			deleteData(opt) {
+				this.workPieceData = this.workPieceData.filter(item => item.workPieceID != opt.workPieceID)
+				this.setMsg();
+			},
+			reflesh() {
+				this.OP80NewCode = ''
+				this.workPieceData = []
+				setTimeout(() => {
+					this._getOutBoundWorkPieceInfoCount();
+					this.setMsg();
+				}, 1000)
+			},
+			outBoundConfirm() {
+				this.$refs.pwdRef.showModal(this.workPieceData,this.CarNo)
+				
+				/*
+				// 瀛樺湪闈炴垚鍝�
+				const flag = this.workPieceData.some(item => item.workPieceState != 10)
+				if (flag) {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '褰撳墠宸ヤ欢瀛樺湪闈炴垚鍝侊紝纭畾寮哄埗鍑哄簱鍚楋紵',
+						success: (value) => {
+							const {
+								confirm,
+								cancel
+							} = value
+							if (confirm) {
+								this.$refs.pwdRef.showModal(this.workPieceData)
+							}
+						}
+					})
+				} else {
+					this.$refs.pwdRef.showModal(this.workPieceData)
+				}
+				
+				//*/
+
+			},
+			/* 椤甸潰鍒濆鍖栬幏鍙栭〉闈ody楂樺害鐨勫畾鏃跺櫒 */
+			startInitInterval(callback) {
+				this.initInterVal = setInterval(() => {
+					//console.log('bbb')
+					if (this.pageBodyHeight) {
+						this.clearInitInterval()
+						callback && callback()
+					} else {
+						this.pageBodyHeight = this.$refs.page.getBodyHeight()
+					}
+				}, 200)
+			},
+			/* 娓呴櫎瀹氭椂鍣� */
+			clearInitInterval() {
+				try {
+					//alert('鎵ц');
+					clearInterval(this.initInterVal)
+					this.initInterVal = null
+				} catch (e) {
+					//TODO handle the exception
+				}
+			},
+			clearInitInterval2() {
+				try {
+					clearInterval(this.myInterval)
+					this.myInterval = null
+				} catch (e) {
+					//TODO handle the exception
+				}
+			},
+			comfirmUpdate() {
+				this.$refs.pwdRef.showModal(this.barDetail);
+			},
+			myFun() {
+				console.log('aaaa')
+			}
+		},
+		onReady() {
+			this.setMsg();
+
+			this.startInitInterval(() => {
+				/* 椤甸潰鍒濆鍖栧悗闇�瑕佹墽琛岀殑浠g爜鍦ㄨ繖杈硅皟鐢� */
+				// this.listbycode()
+
+			})
+		},
+		mounted() {
+			// 璁剧疆fixed瀹氫綅
+			//this.barHeight = Vue.prototype.CustomBar || 45
+			this.barHeight = Vue.prototype.CustomBar
+		},
+		onUnload() {
+			//alert(11); 椤甸潰绂诲紑鏃�
+			this.clearInitInterval()
+			this.clearInitInterval2();
+		},
+		//鐩戝惉鍘熺敓杩斿洖閿�
+		onBackPress(e) {
+			// 姝ゅ涓�瀹氳return涓簍rue锛屽惁鍒欓〉闈笉浼氳繑鍥炲埌鎸囧畾璺緞
+			if (1 != 1) {
+				return false //鍙繑鍥�
+			} else {
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '鏄惁纭杩斿洖锛�',
+					showCancel: true,
+					cancelColor: '#333333',
+					success: (res => {
+						if (res.confirm) {
+							uni.redirectTo({
+								url: '/pages/home/index'
+							})
+						} else if (res.cancel) {
+
+						}
+					})
+				});
+				return true
+			}
+		},
+	}
+</script>
+
+<style scoped lang="scss">
+	.bottom-btns-row {
+		display: flex;
+		padding: 10rpx 0;
+		background-color: #fff;
+
+		.btn-frame {
+			box-sizing: border-box;
+		}
+
+		.left-btn-frame {
+			width: 30%;
+			padding-left: 20rpx;
+			padding-right: 8rpx;
+		}
+
+		.right-btn-frame {
+			flex: 1;
+			padding-right: 20rpx;
+			padding-left: 8rpx;
+		}
+
+		.u-button {
+			border: 2px solid #F08202;
+		}
+	}
+
+	.forma-item {
+		margin-bottom: 24rpx;
+	}
+
+	.material-item-group {
+		background-color: $uni-bg-color;
+		padding-top: 10rpx;
+
+		.material-list-item {
+			border-bottom: 2rpx solid $uni-border-color;
+			padding-bottom: 10rpx;
+			padding-left: 60rpx;
+			margin-bottom: 10rpx;
+			position: relative;
+
+			&:last-child {
+				border-bottom: 0;
+			}
+
+			.item-row {
+				display: flex;
+
+				&>.label {
+					flex-shrink: 0;
+					color: $u-tips-color;
+					width: 144rpx;
+				}
+
+				&>.content {
+					flex-grow: 1;
+					color: $u-content-color;
+
+					uni-input {
+						font: inherit;
+						color: $u-primary;
+						text-decoration: underline;
+					}
+				}
+			}
+
+			.badge-box {
+				position: absolute;
+				top: 8rpx;
+				left: 8rpx;
+				z-index: 1;
+			}
+
+			.close-btn {
+				$closeBtnSize: 70rpx;
+				width: $closeBtnSize;
+				height: $closeBtnSize;
+				z-index: 1;
+				position: absolute;
+				top: 0rpx;
+				right: 8rpx;
+				background-color: $u-error;
+				opacity: 0.6;
+				border-radius: 25rpx;
+
+				.icon-layer {
+					position: absolute;
+					width: 100%;
+					height: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					z-index: 2;
+				}
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/yiqi_pda/pages/outBoundNew/modules/ScanInputFormItem.vue b/yiqi_pda/pages/outBoundNew/modules/ScanInputFormItem.vue
new file mode 100644
index 0000000..32a8326
--- /dev/null
+++ b/yiqi_pda/pages/outBoundNew/modules/ScanInputFormItem.vue
@@ -0,0 +1,224 @@
+<template>
+	<view class="scan-input-form-item-compontent">
+		<view class="p-form-label" v-if="label">{{label}}锛�</view>
+		<view class="input-row">
+			<view class="mask" @tap.stop="" v-if="disabled"></view>
+			<view class="input-view">
+				<u-input ref="uinput" :focus="inputFocus" :clearable="clearable" border="none" :type="type"
+					:placeholder="placeholder" v-model.trim="innerValue" @clear="onClear" @blur="onBlur"
+					@change="onChange"
+					@confirm="onConfirm" />
+			</view>
+			<!-- <view class="scan-view">
+				<view @tap.stop="onScan"><u-icon name="scan" color="#F18201" :size="32"></u-icon></view>
+			</view>
+			<view class="btn-view" v-if="hasSearch">
+				<view class="search-btn" @tap.stop="onSearch">鎼�</view>
+			</view> -->
+		</view>
+		<view class="msg-row" v-if="msg" :class="[msgType==='info'?'info-type':'']">{{msg}}</view>
+	</view>
+</template>
+
+<script>
+	
+	export default {
+		name: 'ScanInputFormItemCompontent',
+		// emits: ['input', 'search', 'clear', 'blur', 'confirm'],
+		props: {
+			type: {
+				type: String,
+				default: 'text'
+			},
+			label: {
+				type: String,
+				default: ''
+			},
+			placeholder: {
+				type: String,
+				default: '璇疯緭鍏�...'
+			},
+			msg: {
+				type: String,
+				default: ''
+			},
+			msgType: {
+				type: String,
+				default: 'error'
+			},
+			value: {
+				type: [String, Number, null],
+				default: ''
+			},
+			hasSearch: {
+				type: Boolean,
+				default: true
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			clearable: {
+				type: Boolean,
+				default: true
+			},
+			inputFocus: {
+				type: Boolean,
+				default: true
+			},
+			// codeLength:{
+			// 	type: Number,
+			// 	default: 1
+			// }
+		},
+		data() {
+			return {
+				innerValue: '',
+				confirmType:'handle'
+			}
+		},
+		watch: {
+			value(newVal, oldVal) {
+				if (newVal !== this.innerValue) {
+					this.innerValue = newVal
+				}
+			},
+			innerValue(newVal, oldVal) {
+				if (newVal !== this.value) {
+					this.$emit('input', newVal)
+				}
+				if(newVal&&this.confirmType=='auto') {
+					this.$emit('search', newVal)
+					this.confirmType='handle'
+				}
+			}
+		},
+
+		methods: {
+			
+			onScan() {
+				uni.scanCode({
+					success: function(res) {
+						this.innerValue = res.result;
+					},
+					fail: function() {
+						console.log('scanCode fail')
+					}
+				})
+			},
+			onSearch() {
+				this.$emit('search', this.innerValue)
+			},
+			onClear() {
+				this.innerValue = null;
+				this.$emit('clear')
+			},
+			onBlur() {
+				this.$emit('blur', this.innerValue)
+			},
+			onChange(val) {
+				//debugger
+				//alert(val);
+				this.$emit('search', val)
+			},
+			onConfirm(val) {
+				//debugger
+				/*
+				if(val!=this.innerValue) {
+					this.confirmType='auto'
+				}
+				
+				if(val) {
+					this.$emit('search', val)
+				}
+				//*/
+			},
+		},
+		created() {
+			this.innerValue = this.value
+		},
+
+	}
+</script>
+
+<style scoped lang="scss">
+	.scan-input-form-item-compontent {
+		width: 100%;
+
+		.p-form-label {
+			font-size: 32rpx;
+			color: $u-tips-color;
+			padding-bottom: 12rpx;
+			padding-left: 20rpx;
+		}
+
+		.input-row {
+			width: 100%;
+			height: 90rpx;
+			overflow: hidden;
+			background-color: $uni-bg-color;
+			display: flex;
+			align-items: center;
+			position: relative;
+
+			.scan-view,
+			.btn-view {
+				flex-shrink: 0;
+			}
+
+			.scan-view {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				padding-right: 10rpx;
+			}
+
+			.input-view {
+				flex-grow: 1;
+				padding-left: 20rpx;
+			}
+
+			.btn-view {
+				width: 70rpx;
+				height: 100%;
+				padding: 20rpx;
+				padding-left: 0rpx;
+				box-sizing: border-box;
+
+				.search-btn {
+					height: 100%;
+					width: 100%;
+					border-radius: 8rpx;
+					background: linear-gradient(157.342820970935deg, rgba(194, 128, 255, 1) -20%, rgba(194, 128, 255, 1) -19%, rgba(132, 0, 255, 1) 119%);
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					color: $uni-bg-color;
+					font-size: 26rpx;
+				}
+			}
+
+			&>.mask {
+				position: absolute;
+				left: 0;
+				top: 0;
+				width: 100%;
+				height: 100%;
+				z-index: 100;
+				background-color: #000;
+				opacity: 0.25;
+			}
+		}
+
+		.msg-row {
+			padding: 6rpx 20rpx 0 20rpx;
+			line-height: 1.3;
+			font-size: 24rpx;
+			color: $u-error;
+
+			&.info-type {
+				color: $color-blue;
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/yiqi_pda/pages/outBoundNew/modules/ScanInputFormItem_Car.vue b/yiqi_pda/pages/outBoundNew/modules/ScanInputFormItem_Car.vue
new file mode 100644
index 0000000..32a8326
--- /dev/null
+++ b/yiqi_pda/pages/outBoundNew/modules/ScanInputFormItem_Car.vue
@@ -0,0 +1,224 @@
+<template>
+	<view class="scan-input-form-item-compontent">
+		<view class="p-form-label" v-if="label">{{label}}锛�</view>
+		<view class="input-row">
+			<view class="mask" @tap.stop="" v-if="disabled"></view>
+			<view class="input-view">
+				<u-input ref="uinput" :focus="inputFocus" :clearable="clearable" border="none" :type="type"
+					:placeholder="placeholder" v-model.trim="innerValue" @clear="onClear" @blur="onBlur"
+					@change="onChange"
+					@confirm="onConfirm" />
+			</view>
+			<!-- <view class="scan-view">
+				<view @tap.stop="onScan"><u-icon name="scan" color="#F18201" :size="32"></u-icon></view>
+			</view>
+			<view class="btn-view" v-if="hasSearch">
+				<view class="search-btn" @tap.stop="onSearch">鎼�</view>
+			</view> -->
+		</view>
+		<view class="msg-row" v-if="msg" :class="[msgType==='info'?'info-type':'']">{{msg}}</view>
+	</view>
+</template>
+
+<script>
+	
+	export default {
+		name: 'ScanInputFormItemCompontent',
+		// emits: ['input', 'search', 'clear', 'blur', 'confirm'],
+		props: {
+			type: {
+				type: String,
+				default: 'text'
+			},
+			label: {
+				type: String,
+				default: ''
+			},
+			placeholder: {
+				type: String,
+				default: '璇疯緭鍏�...'
+			},
+			msg: {
+				type: String,
+				default: ''
+			},
+			msgType: {
+				type: String,
+				default: 'error'
+			},
+			value: {
+				type: [String, Number, null],
+				default: ''
+			},
+			hasSearch: {
+				type: Boolean,
+				default: true
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			clearable: {
+				type: Boolean,
+				default: true
+			},
+			inputFocus: {
+				type: Boolean,
+				default: true
+			},
+			// codeLength:{
+			// 	type: Number,
+			// 	default: 1
+			// }
+		},
+		data() {
+			return {
+				innerValue: '',
+				confirmType:'handle'
+			}
+		},
+		watch: {
+			value(newVal, oldVal) {
+				if (newVal !== this.innerValue) {
+					this.innerValue = newVal
+				}
+			},
+			innerValue(newVal, oldVal) {
+				if (newVal !== this.value) {
+					this.$emit('input', newVal)
+				}
+				if(newVal&&this.confirmType=='auto') {
+					this.$emit('search', newVal)
+					this.confirmType='handle'
+				}
+			}
+		},
+
+		methods: {
+			
+			onScan() {
+				uni.scanCode({
+					success: function(res) {
+						this.innerValue = res.result;
+					},
+					fail: function() {
+						console.log('scanCode fail')
+					}
+				})
+			},
+			onSearch() {
+				this.$emit('search', this.innerValue)
+			},
+			onClear() {
+				this.innerValue = null;
+				this.$emit('clear')
+			},
+			onBlur() {
+				this.$emit('blur', this.innerValue)
+			},
+			onChange(val) {
+				//debugger
+				//alert(val);
+				this.$emit('search', val)
+			},
+			onConfirm(val) {
+				//debugger
+				/*
+				if(val!=this.innerValue) {
+					this.confirmType='auto'
+				}
+				
+				if(val) {
+					this.$emit('search', val)
+				}
+				//*/
+			},
+		},
+		created() {
+			this.innerValue = this.value
+		},
+
+	}
+</script>
+
+<style scoped lang="scss">
+	.scan-input-form-item-compontent {
+		width: 100%;
+
+		.p-form-label {
+			font-size: 32rpx;
+			color: $u-tips-color;
+			padding-bottom: 12rpx;
+			padding-left: 20rpx;
+		}
+
+		.input-row {
+			width: 100%;
+			height: 90rpx;
+			overflow: hidden;
+			background-color: $uni-bg-color;
+			display: flex;
+			align-items: center;
+			position: relative;
+
+			.scan-view,
+			.btn-view {
+				flex-shrink: 0;
+			}
+
+			.scan-view {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				padding-right: 10rpx;
+			}
+
+			.input-view {
+				flex-grow: 1;
+				padding-left: 20rpx;
+			}
+
+			.btn-view {
+				width: 70rpx;
+				height: 100%;
+				padding: 20rpx;
+				padding-left: 0rpx;
+				box-sizing: border-box;
+
+				.search-btn {
+					height: 100%;
+					width: 100%;
+					border-radius: 8rpx;
+					background: linear-gradient(157.342820970935deg, rgba(194, 128, 255, 1) -20%, rgba(194, 128, 255, 1) -19%, rgba(132, 0, 255, 1) 119%);
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					color: $uni-bg-color;
+					font-size: 26rpx;
+				}
+			}
+
+			&>.mask {
+				position: absolute;
+				left: 0;
+				top: 0;
+				width: 100%;
+				height: 100%;
+				z-index: 100;
+				background-color: #000;
+				opacity: 0.25;
+			}
+		}
+
+		.msg-row {
+			padding: 6rpx 20rpx 0 20rpx;
+			line-height: 1.3;
+			font-size: 24rpx;
+			color: $u-error;
+
+			&.info-type {
+				color: $color-blue;
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/yiqi_pda/pages/outBoundNew/modules/content.vue b/yiqi_pda/pages/outBoundNew/modules/content.vue
new file mode 100644
index 0000000..bbb0ccf
--- /dev/null
+++ b/yiqi_pda/pages/outBoundNew/modules/content.vue
@@ -0,0 +1,128 @@
+<template>
+	<u-swipe-action>
+		<u-swipe-action-item v-for="(item,index) in workPieceData" :key="index" :options="options" 
+			:name="index" @click="actionClick" style="margin-bottom: 10rpx;background-color: #fff;">
+		<view class="content" >
+			<view class="content_flex">
+				<view class="flex_index">{{workPieceData.length-index}}</view>
+				<view class="flex_code">鎴愬搧鐮�: {{item.oP80NewCode}}</view>
+				<!-- <view class="flex_status">{{item.qualityStateName}}</view> -->
+			</view>
+			<!-- <view class="content_flex">
+				<view class="flex_color" style="width: 100%;">宸ヤ欢鍙�: {{item.workPieceID}}</view>
+			</view>
+			<view class="content_flex">
+				<view class="flex_color" style="width: 100%;">宸ヤ欢鐘舵��: {{item.workPieceStateName}}</view>
+			</view>
+			<view class="content_flex">
+				<view class="flex_color" style="width: 100%;">褰撳墠宸ュ簭: {{item.workingProcedureCurrent}}</view>
+			</view>
+			<view class="content_flex">
+				<view class="flex_color" style="width: 100%;">璁惧缂栧彿: {{item.equipmentID}}</view>
+			</view> -->
+		</view>
+	</u-swipe-action-item>
+	</u-swipe-action>
+</template>
+
+<script>
+	export default {
+		props: {
+			workPieceData: {
+				type: Array,
+				default: () => []
+			}
+		},
+		data() {
+			return {
+				options: [{
+					text: "绉婚櫎",
+					style: {
+						background: '#F08202'
+					}
+				}],
+			}
+		},
+		methods:{
+			actionClick(opt){
+				uni.showModal({
+				title: '鎻愮ず',
+				content: '鏄惁纭绉婚櫎宸ヤ欢鍙�"'+this.workPieceData[opt.name].workPieceID+'"锛�',
+				showCancel: true,
+				cancelColor: '#333333',
+				success: (res => {
+						if (res.confirm) {
+							console.log('绉婚櫎',opt);
+							this.$emit('deleteData',this.workPieceData[opt.name])
+						} else if (res.cancel) {
+						
+						}
+					})
+				});
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background-color: #fff;
+		width: 100%;
+		box-sizing: border-box;
+		border: 1px solid #fff;
+		padding: 15rpx;
+		margin-bottom: 10rpx;
+
+		.content_flex {
+			display: flex;
+			justify-content: flex-start;
+			align-items: center;
+			margin-bottom: 5rpx;
+
+			.flex_index {
+				width: 50rpx;
+				height: 50rpx;
+				background: $color-common;
+				color: #fff;
+				font-size: 30rpx;
+				line-height: 50rpx;
+				text-align: center;
+				border-radius: 50%;
+				margin-right: 15rpx;
+			}
+
+			.flex_code {
+				font-size: 32rpx;
+				color: $color-common;
+				width: 75%;
+			}
+
+			.flex_status {
+				width: 90rpx;
+				text-align: center;
+				padding: 10rpx;
+				background: $color-common;
+				color: #fff;
+				font-weight: 550;
+				align-self: flex-end;
+
+			}
+
+			.flex_color {
+				font-size: 32rpx;
+				color: #000;
+				width: 75%;
+
+			}
+			
+			.card-action {
+				width: 100%;
+				display: flex;
+				justify-content: flex-end;
+				align-items: center;
+			}
+
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/yiqi_pda/pages/outBoundNew/modules/modalPwd.vue b/yiqi_pda/pages/outBoundNew/modules/modalPwd.vue
new file mode 100644
index 0000000..ff0dc45
--- /dev/null
+++ b/yiqi_pda/pages/outBoundNew/modules/modalPwd.vue
@@ -0,0 +1,114 @@
+<template>
+	<u-modal :show="show" title="鍑哄簱纭" :closeOnClickOverlay="true" :showCancelButton="true" @cancel="handlerCancel"
+		@confirm="handlerConfirm" @close="handlerCancel">
+		<u-form labelPosition="left" labelWidth="100rpx" :model="form" :rules="rules" ref="uForm">
+			<u-form-item required label="瀵嗙爜" prop="pwd">
+				<u-input v-model="form.pwd" type="password" placeholder="璇疯緭鍏ュ瘑鐮�" style="width: 450rpx;"></u-input>
+			</u-form-item>
+		</u-form>
+
+		<!-- <view class="status_flex">
+			<u-input v-model="pwd" type="password" placeholder="璇疯緭鍏ュ瘑鐮�" style="width: 450rpx;"></u-input>
+		</view> -->
+	</u-modal>
+</template>
+
+<script>
+	import {
+		$alert
+	} from '@/static/js/utils/index.js'
+	import {
+		outStoreWorkPiece
+	} from '@/api/outBound/index.js'
+	export default {
+		emits: ['update'],
+		data() {
+			return {
+				show: false,
+				CarNo:'',
+				workPieceData:[],
+				form: {
+					pwd: ''
+				},
+				rules: {
+					pwd: {
+						type: 'string',
+						required: true,
+						message: '璇疯緭鍏ュ瘑鐮�',
+						trigger: ['blur', 'change']
+					}
+				}
+			}
+		},
+		onReady() {
+			this.$refs.uForm.setRules(this.rules)
+		},
+		methods: {
+			showModal(workPieceData,CarNo){
+				this.show=true
+				this.CarNo=CarNo
+				this.workPieceData=workPieceData	
+			},
+			handlerCancel() {
+				this.form =  {
+					pwd: '',
+				}
+				this.show = false
+			},
+			// 閫変腑鐨勭姸鎬佷紶閫掔粰鐖剁粍浠�
+			handlerConfirm() {
+				console.log(111);
+				this.$refs.uForm.validate().then(res => {
+					const params = {
+						password: this.form.pwd,
+						CarNo:this.CarNo,
+						workPieceInfoLst:this.workPieceData
+					}
+					console.log(params,'params');
+					outStoreWorkPiece(params).then(res => {
+						uni.showToast({
+							title: '鍑哄簱鎴愬姛'
+						})
+						this.$emit('reflesh')
+						this.handlerCancel()
+					})
+				}).catch(errors => {
+					console.log(errors,'22');
+				})
+			}
+
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.status_flex {
+		width: 100%;
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+
+		.flex_item {
+			width: 450rpx;
+			height: 70rpx;
+			text-align: center;
+			line-height: 70rpx;
+			border: 1px solid $color-common;
+			color: $color-common;
+			font-size: 32rpx;
+			font-weight: 550;
+			background: #fff;
+			margin-bottom: 30rpx;
+		}
+
+		.active_item {
+			background: $color-common;
+			color: #fff;
+		}
+	}
+	
+	::v-deep .u-transition {
+	  z-index: 99 !important;
+	}
+</style>
\ No newline at end of file
diff --git a/yiqi_pda/pages/unLine/index.vue b/yiqi_pda/pages/unLine/index.vue
new file mode 100644
index 0000000..9666bfa
--- /dev/null
+++ b/yiqi_pda/pages/unLine/index.vue
@@ -0,0 +1,391 @@
+<template>
+	<default-header-page-layout ref="page" title="涓嬬嚎鎵ц">
+
+		<view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
+			<action-user-row />
+			<scan-input-form-item-car  v-model="CarNo" class="forma-item" :label="baseTitile_Car"
+					:msg-type="msgType" />
+			<scan-input-form-item :inputFocus="inputFocus" v-model="OP80NewCode" class="forma-item" :label="baseTitile"
+				:msg="msg" :msg-type="msgType" @search="onSearchContainter" @clear="onClearContainter" />
+			
+			<view class="with-action-user-row-page-content">
+
+
+				<Content @deleteData="deleteData" :workPieceData="workPieceData" />
+			</view>
+			<modalPwd @reflesh="reflesh" ref="pwdRef" />
+		</view>
+		<template v-slot:footer>
+			<view class="bottom-btns-row">
+				<view class="btn-frame right-btn-frame">
+					<u-button :disabled="workPieceData.length<1" type="primary" text="纭涓嬬嚎"
+						@click="outBoundConfirm"></u-button>
+				</view>
+			</view>
+		</template>
+	</default-header-page-layout>
+</template>
+
+<script>
+	import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
+	import ActionUserRow from '@/components/ActionUserRow.vue'
+	import ScanInputFormItem from './modules/ScanInputFormItem.vue'
+	import ScanInputFormItemCar from './modules/ScanInputFormItem_Car.vue'
+	import Content from './modules/content.vue'
+	import modalPwd from './modules/modalPwd.vue'
+	import Vue from 'vue'
+	import {
+		parseDic,
+		$alert,
+		$successInfo
+	} from '@/static/js/utils/index.js'
+	import {
+		getWorkPieceByOP80NewCode,
+		outBoundWorkPiece,
+		getOutBoundWorkPieceInfoCount
+	} from '@/api/outBound/index.js'
+	import {
+		listbycode
+	} from '@/api/common/index.js'
+	export default {
+		name: 'baseInPage',
+		components: {
+			DefaultHeaderPageLayout,
+			ActionUserRow,
+			ScanInputFormItem,
+			ScanInputFormItemCar,
+			Content,
+			modalPwd
+		},
+		data() {
+			return {
+				barHeight: '',
+				ckNumToday: "0", //浠婂ぉ鎬诲嚭搴撴暟
+				baseTitile: '鎵弿鎴愬搧鐮�', 
+				baseTitile_Car: '鎵弿灏忚溅鐮�', 
+				title: '',
+				pageBodyHeight: 0,
+				initInterVal: null,
+				myInterval: null,
+				msg: '',
+				msgType: 'error',
+				OP80NewCode: '',
+				CarNo:'',
+				workPieceData: [],
+				workPieceStatus: [],
+				inputFocus: true,
+				// codeLength:1
+			}
+		},
+		onLoad() {
+			var _this = this;
+			_this._getOutBoundWorkPieceInfoCount();
+			//涓嶅啀寰幆璇�
+			/*
+			this.myInterval = setInterval(function() {
+				_this._getOutBoundWorkPieceInfoCount();
+			}, 1000 * 10);
+			//*/
+			//this.myInterval=setInterval(this.myFun(), 3000);
+		},
+		methods: {
+			// 鑾峰彇宸ヤ欢淇℃伅
+			async _getOutBoundWorkPieceInfoCount(OP80NewCode) {
+				try {
+					let {
+						data
+					} = await getOutBoundWorkPieceInfoCount(null)
+					this.ckNumToday = data;
+				} catch (e) {}
+				this.setMsg();
+			},
+			// 鑾峰彇宸ヤ欢淇℃伅
+			async onSearchContainter(OP80NewCode) {
+				//debugger
+				if (OP80NewCode.length != 21) {
+					this.initFocus(100);
+					// uni.showToast({
+					// 	title: '宸ヤ欢鐮佹垨鎴愬搧鐮侀暱搴︿笉姝g‘',
+					// 	icon: 'error',
+					// 	duration: 2000,
+					// 	mask: true
+					// });
+					return;
+				}
+				
+				this.inputFocus = false
+				const param = {
+					OP80NewCode: OP80NewCode
+				}
+				try {
+					let data={};
+					data.addTime = new Date();
+					data.workPieceID=OP80NewCode;
+					data.oP80NewCode=OP80NewCode;
+					if (!this.workPieceData.some(item => item.workPieceID == data.workPieceID)) {
+						data.addTime = new Date();
+						this.workPieceData.push(data)
+					}
+					//椤哄簭璋冭浆锛屾帓搴�
+					this.workPieceData.sort((a, b) => b.addTime - a.addTime);
+
+					this.OP80NewCode = ''; //姣忔鍒峰畬灏辨竻绌鸿緭鍏ユ 銆怑ditby shaocx,2024-06-12銆�
+					this.initFocus(100);
+					//console.log(this.workPieceData,'dsts');
+					// setTimeout(()=>{
+					// 	this.OP80NewCode = '' ;//姣忔鍒峰畬灏辨竻绌鸿緭鍏ユ 銆怑ditby shaocx,2024-06-12銆�
+					// 	this.inputFocus=true
+					// },100)
+				} catch (e) {
+					//debugger
+					this.initFocus(100);
+					//TODO handle the exception
+					console.log(e);
+				}
+				//this.msg = " 鎵爜鏁�:"+this.workPieceData.length+"    浠婃棩鍑哄簱鏁�:";
+				this.setMsg();
+			},
+			setMsg() {
+				this.msg = " 鎵爜鏁�:" + this.workPieceData.length + "    浠婃棩鍑哄簱鏁�:" + this.ckNumToday;
+			},
+			initFocus(num) {
+				setTimeout(() => {
+					this.OP80NewCode = ''; //姣忔鍒峰畬灏辨竻绌鸿緭鍏ユ 銆怑ditby shaocx,2024-06-12銆�
+					this.inputFocus = true
+				}, num)
+			},
+			// 鑾峰彇鎵爜闀垮害
+			// async listbycode(){
+			// 	try{
+			// 		let {data}=await listbycode({code:'outbound_code_length'})
+			// 		this.codeLength=data.length>0?Number.parseInt(data[0].label):1
+			// 	}catch(e){
+			// 		//TODO handle the exception
+			// 		console.log(e);
+			// 	}
+
+			// },
+			onClearContainter() {
+				this.OP80NewCode = ''
+			},
+			deleteData(opt) {
+				this.workPieceData = this.workPieceData.filter(item => item.workPieceID != opt.workPieceID)
+				this.setMsg();
+			},
+			reflesh() {
+				this.OP80NewCode = ''
+				this.workPieceData = []
+				setTimeout(() => {
+					this._getOutBoundWorkPieceInfoCount();
+					this.setMsg();
+				}, 1000)
+			},
+			outBoundConfirm() {
+				this.$refs.pwdRef.showModal(this.workPieceData,this.CarNo)
+				
+				/*
+				// 瀛樺湪闈炴垚鍝�
+				const flag = this.workPieceData.some(item => item.workPieceState != 10)
+				if (flag) {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '褰撳墠宸ヤ欢瀛樺湪闈炴垚鍝侊紝纭畾寮哄埗鍑哄簱鍚楋紵',
+						success: (value) => {
+							const {
+								confirm,
+								cancel
+							} = value
+							if (confirm) {
+								this.$refs.pwdRef.showModal(this.workPieceData)
+							}
+						}
+					})
+				} else {
+					this.$refs.pwdRef.showModal(this.workPieceData)
+				}
+				
+				//*/
+
+			},
+			/* 椤甸潰鍒濆鍖栬幏鍙栭〉闈ody楂樺害鐨勫畾鏃跺櫒 */
+			startInitInterval(callback) {
+				this.initInterVal = setInterval(() => {
+					//console.log('bbb')
+					if (this.pageBodyHeight) {
+						this.clearInitInterval()
+						callback && callback()
+					} else {
+						this.pageBodyHeight = this.$refs.page.getBodyHeight()
+					}
+				}, 200)
+			},
+			/* 娓呴櫎瀹氭椂鍣� */
+			clearInitInterval() {
+				try {
+					//alert('鎵ц');
+					clearInterval(this.initInterVal)
+					this.initInterVal = null
+				} catch (e) {
+					//TODO handle the exception
+				}
+			},
+			clearInitInterval2() {
+				try {
+					clearInterval(this.myInterval)
+					this.myInterval = null
+				} catch (e) {
+					//TODO handle the exception
+				}
+			},
+			comfirmUpdate() {
+				this.$refs.pwdRef.showModal(this.barDetail);
+			},
+			myFun() {
+				console.log('aaaa')
+			}
+		},
+		onReady() {
+			this.setMsg();
+
+			this.startInitInterval(() => {
+				/* 椤甸潰鍒濆鍖栧悗闇�瑕佹墽琛岀殑浠g爜鍦ㄨ繖杈硅皟鐢� */
+				// this.listbycode()
+
+			})
+		},
+		mounted() {
+			// 璁剧疆fixed瀹氫綅
+			//this.barHeight = Vue.prototype.CustomBar || 45
+			this.barHeight = Vue.prototype.CustomBar
+		},
+		onUnload() {
+			//alert(11); 椤甸潰绂诲紑鏃�
+			this.clearInitInterval()
+			this.clearInitInterval2();
+		},
+		//鐩戝惉鍘熺敓杩斿洖閿�
+		onBackPress(e) {
+			// 姝ゅ涓�瀹氳return涓簍rue锛屽惁鍒欓〉闈笉浼氳繑鍥炲埌鎸囧畾璺緞
+			if (1 != 1) {
+				return false //鍙繑鍥�
+			} else {
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '鏄惁纭杩斿洖锛�',
+					showCancel: true,
+					cancelColor: '#333333',
+					success: (res => {
+						if (res.confirm) {
+							uni.redirectTo({
+								url: '/pages/home/index'
+							})
+						} else if (res.cancel) {
+
+						}
+					})
+				});
+				return true
+			}
+		},
+	}
+</script>
+
+<style scoped lang="scss">
+	.bottom-btns-row {
+		display: flex;
+		padding: 10rpx 0;
+		background-color: #fff;
+
+		.btn-frame {
+			box-sizing: border-box;
+		}
+
+		.left-btn-frame {
+			width: 30%;
+			padding-left: 20rpx;
+			padding-right: 8rpx;
+		}
+
+		.right-btn-frame {
+			flex: 1;
+			padding-right: 20rpx;
+			padding-left: 8rpx;
+		}
+
+		.u-button {
+			border: 2px solid #F08202;
+		}
+	}
+
+	.forma-item {
+		margin-bottom: 24rpx;
+	}
+
+	.material-item-group {
+		background-color: $uni-bg-color;
+		padding-top: 10rpx;
+
+		.material-list-item {
+			border-bottom: 2rpx solid $uni-border-color;
+			padding-bottom: 10rpx;
+			padding-left: 60rpx;
+			margin-bottom: 10rpx;
+			position: relative;
+
+			&:last-child {
+				border-bottom: 0;
+			}
+
+			.item-row {
+				display: flex;
+
+				&>.label {
+					flex-shrink: 0;
+					color: $u-tips-color;
+					width: 144rpx;
+				}
+
+				&>.content {
+					flex-grow: 1;
+					color: $u-content-color;
+
+					uni-input {
+						font: inherit;
+						color: $u-primary;
+						text-decoration: underline;
+					}
+				}
+			}
+
+			.badge-box {
+				position: absolute;
+				top: 8rpx;
+				left: 8rpx;
+				z-index: 1;
+			}
+
+			.close-btn {
+				$closeBtnSize: 70rpx;
+				width: $closeBtnSize;
+				height: $closeBtnSize;
+				z-index: 1;
+				position: absolute;
+				top: 0rpx;
+				right: 8rpx;
+				background-color: $u-error;
+				opacity: 0.6;
+				border-radius: 25rpx;
+
+				.icon-layer {
+					position: absolute;
+					width: 100%;
+					height: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					z-index: 2;
+				}
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/yiqi_pda/pages/unLine/modules/ScanInputFormItem.vue b/yiqi_pda/pages/unLine/modules/ScanInputFormItem.vue
new file mode 100644
index 0000000..32a8326
--- /dev/null
+++ b/yiqi_pda/pages/unLine/modules/ScanInputFormItem.vue
@@ -0,0 +1,224 @@
+<template>
+	<view class="scan-input-form-item-compontent">
+		<view class="p-form-label" v-if="label">{{label}}锛�</view>
+		<view class="input-row">
+			<view class="mask" @tap.stop="" v-if="disabled"></view>
+			<view class="input-view">
+				<u-input ref="uinput" :focus="inputFocus" :clearable="clearable" border="none" :type="type"
+					:placeholder="placeholder" v-model.trim="innerValue" @clear="onClear" @blur="onBlur"
+					@change="onChange"
+					@confirm="onConfirm" />
+			</view>
+			<!-- <view class="scan-view">
+				<view @tap.stop="onScan"><u-icon name="scan" color="#F18201" :size="32"></u-icon></view>
+			</view>
+			<view class="btn-view" v-if="hasSearch">
+				<view class="search-btn" @tap.stop="onSearch">鎼�</view>
+			</view> -->
+		</view>
+		<view class="msg-row" v-if="msg" :class="[msgType==='info'?'info-type':'']">{{msg}}</view>
+	</view>
+</template>
+
+<script>
+	
+	export default {
+		name: 'ScanInputFormItemCompontent',
+		// emits: ['input', 'search', 'clear', 'blur', 'confirm'],
+		props: {
+			type: {
+				type: String,
+				default: 'text'
+			},
+			label: {
+				type: String,
+				default: ''
+			},
+			placeholder: {
+				type: String,
+				default: '璇疯緭鍏�...'
+			},
+			msg: {
+				type: String,
+				default: ''
+			},
+			msgType: {
+				type: String,
+				default: 'error'
+			},
+			value: {
+				type: [String, Number, null],
+				default: ''
+			},
+			hasSearch: {
+				type: Boolean,
+				default: true
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			clearable: {
+				type: Boolean,
+				default: true
+			},
+			inputFocus: {
+				type: Boolean,
+				default: true
+			},
+			// codeLength:{
+			// 	type: Number,
+			// 	default: 1
+			// }
+		},
+		data() {
+			return {
+				innerValue: '',
+				confirmType:'handle'
+			}
+		},
+		watch: {
+			value(newVal, oldVal) {
+				if (newVal !== this.innerValue) {
+					this.innerValue = newVal
+				}
+			},
+			innerValue(newVal, oldVal) {
+				if (newVal !== this.value) {
+					this.$emit('input', newVal)
+				}
+				if(newVal&&this.confirmType=='auto') {
+					this.$emit('search', newVal)
+					this.confirmType='handle'
+				}
+			}
+		},
+
+		methods: {
+			
+			onScan() {
+				uni.scanCode({
+					success: function(res) {
+						this.innerValue = res.result;
+					},
+					fail: function() {
+						console.log('scanCode fail')
+					}
+				})
+			},
+			onSearch() {
+				this.$emit('search', this.innerValue)
+			},
+			onClear() {
+				this.innerValue = null;
+				this.$emit('clear')
+			},
+			onBlur() {
+				this.$emit('blur', this.innerValue)
+			},
+			onChange(val) {
+				//debugger
+				//alert(val);
+				this.$emit('search', val)
+			},
+			onConfirm(val) {
+				//debugger
+				/*
+				if(val!=this.innerValue) {
+					this.confirmType='auto'
+				}
+				
+				if(val) {
+					this.$emit('search', val)
+				}
+				//*/
+			},
+		},
+		created() {
+			this.innerValue = this.value
+		},
+
+	}
+</script>
+
+<style scoped lang="scss">
+	.scan-input-form-item-compontent {
+		width: 100%;
+
+		.p-form-label {
+			font-size: 32rpx;
+			color: $u-tips-color;
+			padding-bottom: 12rpx;
+			padding-left: 20rpx;
+		}
+
+		.input-row {
+			width: 100%;
+			height: 90rpx;
+			overflow: hidden;
+			background-color: $uni-bg-color;
+			display: flex;
+			align-items: center;
+			position: relative;
+
+			.scan-view,
+			.btn-view {
+				flex-shrink: 0;
+			}
+
+			.scan-view {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				padding-right: 10rpx;
+			}
+
+			.input-view {
+				flex-grow: 1;
+				padding-left: 20rpx;
+			}
+
+			.btn-view {
+				width: 70rpx;
+				height: 100%;
+				padding: 20rpx;
+				padding-left: 0rpx;
+				box-sizing: border-box;
+
+				.search-btn {
+					height: 100%;
+					width: 100%;
+					border-radius: 8rpx;
+					background: linear-gradient(157.342820970935deg, rgba(194, 128, 255, 1) -20%, rgba(194, 128, 255, 1) -19%, rgba(132, 0, 255, 1) 119%);
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					color: $uni-bg-color;
+					font-size: 26rpx;
+				}
+			}
+
+			&>.mask {
+				position: absolute;
+				left: 0;
+				top: 0;
+				width: 100%;
+				height: 100%;
+				z-index: 100;
+				background-color: #000;
+				opacity: 0.25;
+			}
+		}
+
+		.msg-row {
+			padding: 6rpx 20rpx 0 20rpx;
+			line-height: 1.3;
+			font-size: 24rpx;
+			color: $u-error;
+
+			&.info-type {
+				color: $color-blue;
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/yiqi_pda/pages/unLine/modules/ScanInputFormItem_Car.vue b/yiqi_pda/pages/unLine/modules/ScanInputFormItem_Car.vue
new file mode 100644
index 0000000..32a8326
--- /dev/null
+++ b/yiqi_pda/pages/unLine/modules/ScanInputFormItem_Car.vue
@@ -0,0 +1,224 @@
+<template>
+	<view class="scan-input-form-item-compontent">
+		<view class="p-form-label" v-if="label">{{label}}锛�</view>
+		<view class="input-row">
+			<view class="mask" @tap.stop="" v-if="disabled"></view>
+			<view class="input-view">
+				<u-input ref="uinput" :focus="inputFocus" :clearable="clearable" border="none" :type="type"
+					:placeholder="placeholder" v-model.trim="innerValue" @clear="onClear" @blur="onBlur"
+					@change="onChange"
+					@confirm="onConfirm" />
+			</view>
+			<!-- <view class="scan-view">
+				<view @tap.stop="onScan"><u-icon name="scan" color="#F18201" :size="32"></u-icon></view>
+			</view>
+			<view class="btn-view" v-if="hasSearch">
+				<view class="search-btn" @tap.stop="onSearch">鎼�</view>
+			</view> -->
+		</view>
+		<view class="msg-row" v-if="msg" :class="[msgType==='info'?'info-type':'']">{{msg}}</view>
+	</view>
+</template>
+
+<script>
+	
+	export default {
+		name: 'ScanInputFormItemCompontent',
+		// emits: ['input', 'search', 'clear', 'blur', 'confirm'],
+		props: {
+			type: {
+				type: String,
+				default: 'text'
+			},
+			label: {
+				type: String,
+				default: ''
+			},
+			placeholder: {
+				type: String,
+				default: '璇疯緭鍏�...'
+			},
+			msg: {
+				type: String,
+				default: ''
+			},
+			msgType: {
+				type: String,
+				default: 'error'
+			},
+			value: {
+				type: [String, Number, null],
+				default: ''
+			},
+			hasSearch: {
+				type: Boolean,
+				default: true
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			clearable: {
+				type: Boolean,
+				default: true
+			},
+			inputFocus: {
+				type: Boolean,
+				default: true
+			},
+			// codeLength:{
+			// 	type: Number,
+			// 	default: 1
+			// }
+		},
+		data() {
+			return {
+				innerValue: '',
+				confirmType:'handle'
+			}
+		},
+		watch: {
+			value(newVal, oldVal) {
+				if (newVal !== this.innerValue) {
+					this.innerValue = newVal
+				}
+			},
+			innerValue(newVal, oldVal) {
+				if (newVal !== this.value) {
+					this.$emit('input', newVal)
+				}
+				if(newVal&&this.confirmType=='auto') {
+					this.$emit('search', newVal)
+					this.confirmType='handle'
+				}
+			}
+		},
+
+		methods: {
+			
+			onScan() {
+				uni.scanCode({
+					success: function(res) {
+						this.innerValue = res.result;
+					},
+					fail: function() {
+						console.log('scanCode fail')
+					}
+				})
+			},
+			onSearch() {
+				this.$emit('search', this.innerValue)
+			},
+			onClear() {
+				this.innerValue = null;
+				this.$emit('clear')
+			},
+			onBlur() {
+				this.$emit('blur', this.innerValue)
+			},
+			onChange(val) {
+				//debugger
+				//alert(val);
+				this.$emit('search', val)
+			},
+			onConfirm(val) {
+				//debugger
+				/*
+				if(val!=this.innerValue) {
+					this.confirmType='auto'
+				}
+				
+				if(val) {
+					this.$emit('search', val)
+				}
+				//*/
+			},
+		},
+		created() {
+			this.innerValue = this.value
+		},
+
+	}
+</script>
+
+<style scoped lang="scss">
+	.scan-input-form-item-compontent {
+		width: 100%;
+
+		.p-form-label {
+			font-size: 32rpx;
+			color: $u-tips-color;
+			padding-bottom: 12rpx;
+			padding-left: 20rpx;
+		}
+
+		.input-row {
+			width: 100%;
+			height: 90rpx;
+			overflow: hidden;
+			background-color: $uni-bg-color;
+			display: flex;
+			align-items: center;
+			position: relative;
+
+			.scan-view,
+			.btn-view {
+				flex-shrink: 0;
+			}
+
+			.scan-view {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				padding-right: 10rpx;
+			}
+
+			.input-view {
+				flex-grow: 1;
+				padding-left: 20rpx;
+			}
+
+			.btn-view {
+				width: 70rpx;
+				height: 100%;
+				padding: 20rpx;
+				padding-left: 0rpx;
+				box-sizing: border-box;
+
+				.search-btn {
+					height: 100%;
+					width: 100%;
+					border-radius: 8rpx;
+					background: linear-gradient(157.342820970935deg, rgba(194, 128, 255, 1) -20%, rgba(194, 128, 255, 1) -19%, rgba(132, 0, 255, 1) 119%);
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					color: $uni-bg-color;
+					font-size: 26rpx;
+				}
+			}
+
+			&>.mask {
+				position: absolute;
+				left: 0;
+				top: 0;
+				width: 100%;
+				height: 100%;
+				z-index: 100;
+				background-color: #000;
+				opacity: 0.25;
+			}
+		}
+
+		.msg-row {
+			padding: 6rpx 20rpx 0 20rpx;
+			line-height: 1.3;
+			font-size: 24rpx;
+			color: $u-error;
+
+			&.info-type {
+				color: $color-blue;
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/yiqi_pda/pages/unLine/modules/content.vue b/yiqi_pda/pages/unLine/modules/content.vue
new file mode 100644
index 0000000..bbb0ccf
--- /dev/null
+++ b/yiqi_pda/pages/unLine/modules/content.vue
@@ -0,0 +1,128 @@
+<template>
+	<u-swipe-action>
+		<u-swipe-action-item v-for="(item,index) in workPieceData" :key="index" :options="options" 
+			:name="index" @click="actionClick" style="margin-bottom: 10rpx;background-color: #fff;">
+		<view class="content" >
+			<view class="content_flex">
+				<view class="flex_index">{{workPieceData.length-index}}</view>
+				<view class="flex_code">鎴愬搧鐮�: {{item.oP80NewCode}}</view>
+				<!-- <view class="flex_status">{{item.qualityStateName}}</view> -->
+			</view>
+			<!-- <view class="content_flex">
+				<view class="flex_color" style="width: 100%;">宸ヤ欢鍙�: {{item.workPieceID}}</view>
+			</view>
+			<view class="content_flex">
+				<view class="flex_color" style="width: 100%;">宸ヤ欢鐘舵��: {{item.workPieceStateName}}</view>
+			</view>
+			<view class="content_flex">
+				<view class="flex_color" style="width: 100%;">褰撳墠宸ュ簭: {{item.workingProcedureCurrent}}</view>
+			</view>
+			<view class="content_flex">
+				<view class="flex_color" style="width: 100%;">璁惧缂栧彿: {{item.equipmentID}}</view>
+			</view> -->
+		</view>
+	</u-swipe-action-item>
+	</u-swipe-action>
+</template>
+
+<script>
+	export default {
+		props: {
+			workPieceData: {
+				type: Array,
+				default: () => []
+			}
+		},
+		data() {
+			return {
+				options: [{
+					text: "绉婚櫎",
+					style: {
+						background: '#F08202'
+					}
+				}],
+			}
+		},
+		methods:{
+			actionClick(opt){
+				uni.showModal({
+				title: '鎻愮ず',
+				content: '鏄惁纭绉婚櫎宸ヤ欢鍙�"'+this.workPieceData[opt.name].workPieceID+'"锛�',
+				showCancel: true,
+				cancelColor: '#333333',
+				success: (res => {
+						if (res.confirm) {
+							console.log('绉婚櫎',opt);
+							this.$emit('deleteData',this.workPieceData[opt.name])
+						} else if (res.cancel) {
+						
+						}
+					})
+				});
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background-color: #fff;
+		width: 100%;
+		box-sizing: border-box;
+		border: 1px solid #fff;
+		padding: 15rpx;
+		margin-bottom: 10rpx;
+
+		.content_flex {
+			display: flex;
+			justify-content: flex-start;
+			align-items: center;
+			margin-bottom: 5rpx;
+
+			.flex_index {
+				width: 50rpx;
+				height: 50rpx;
+				background: $color-common;
+				color: #fff;
+				font-size: 30rpx;
+				line-height: 50rpx;
+				text-align: center;
+				border-radius: 50%;
+				margin-right: 15rpx;
+			}
+
+			.flex_code {
+				font-size: 32rpx;
+				color: $color-common;
+				width: 75%;
+			}
+
+			.flex_status {
+				width: 90rpx;
+				text-align: center;
+				padding: 10rpx;
+				background: $color-common;
+				color: #fff;
+				font-weight: 550;
+				align-self: flex-end;
+
+			}
+
+			.flex_color {
+				font-size: 32rpx;
+				color: #000;
+				width: 75%;
+
+			}
+			
+			.card-action {
+				width: 100%;
+				display: flex;
+				justify-content: flex-end;
+				align-items: center;
+			}
+
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/yiqi_pda/pages/unLine/modules/modalPwd.vue b/yiqi_pda/pages/unLine/modules/modalPwd.vue
new file mode 100644
index 0000000..ddd94b8
--- /dev/null
+++ b/yiqi_pda/pages/unLine/modules/modalPwd.vue
@@ -0,0 +1,114 @@
+<template>
+	<u-modal :show="show" title="鍑哄簱纭" :closeOnClickOverlay="true" :showCancelButton="true" @cancel="handlerCancel"
+		@confirm="handlerConfirm" @close="handlerCancel">
+		<u-form labelPosition="left" labelWidth="100rpx" :model="form" :rules="rules" ref="uForm">
+			<u-form-item required label="瀵嗙爜" prop="pwd">
+				<u-input v-model="form.pwd" type="password" placeholder="璇疯緭鍏ュ瘑鐮�" style="width: 450rpx;"></u-input>
+			</u-form-item>
+		</u-form>
+
+		<!-- <view class="status_flex">
+			<u-input v-model="pwd" type="password" placeholder="璇疯緭鍏ュ瘑鐮�" style="width: 450rpx;"></u-input>
+		</view> -->
+	</u-modal>
+</template>
+
+<script>
+	import {
+		$alert
+	} from '@/static/js/utils/index.js'
+	import {
+		unLineWorkPiece
+	} from '@/api/outBound/index.js'
+	export default {
+		emits: ['update'],
+		data() {
+			return {
+				show: false,
+				workPieceData:[],
+				CarNo:'',
+				form: {
+					pwd: ''
+				},
+				rules: {
+					pwd: {
+						type: 'string',
+						required: true,
+						message: '璇疯緭鍏ュ瘑鐮�',
+						trigger: ['blur', 'change']
+					}
+				}
+			}
+		},
+		onReady() {
+			this.$refs.uForm.setRules(this.rules)
+		},
+		methods: {
+			showModal(workPieceData,CarNo){
+				this.show=true
+				this.workPieceData=workPieceData	
+				this.CarNo=CarNo
+			},
+			handlerCancel() {
+				this.form =  {
+					pwd: '',
+				}
+				this.show = false
+			},
+			// 閫変腑鐨勭姸鎬佷紶閫掔粰鐖剁粍浠�
+			handlerConfirm() {
+				console.log(111);
+				this.$refs.uForm.validate().then(res => {
+					const params = {
+						password: this.form.pwd,
+						CarNo:this.CarNo,
+						workPieceInfoLst:this.workPieceData
+					}
+					console.log(params,'params');
+					unLineWorkPiece(params).then(res => {
+						uni.showToast({
+							title: '涓嬬嚎鎴愬姛'
+						})
+						this.$emit('reflesh')
+						this.handlerCancel()
+					})
+				}).catch(errors => {
+					console.log(errors,'22');
+				})
+			}
+
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.status_flex {
+		width: 100%;
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+
+		.flex_item {
+			width: 450rpx;
+			height: 70rpx;
+			text-align: center;
+			line-height: 70rpx;
+			border: 1px solid $color-common;
+			color: $color-common;
+			font-size: 32rpx;
+			font-weight: 550;
+			background: #fff;
+			margin-bottom: 30rpx;
+		}
+
+		.active_item {
+			background: $color-common;
+			color: #fff;
+		}
+	}
+	
+	::v-deep .u-transition {
+	  z-index: 99 !important;
+	}
+</style>
\ No newline at end of file

--
Gitblit v1.9.3