From e97cbb592d9165b808a76f654fa0a467817ddedf Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期六, 05 七月 2025 09:20:35 +0800
Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/pda-master into devlop

---
 pages/outbound/wavePickItem.vue             |  278 +++++++++++++
 package-lock.json                           |   19 
 locale/zh-Hans.json                         |    6 
 pages.json                                  |   14 
 static/family/HarmonyOS_Sans_SC_Black.ttf   |    0 
 pages/outbound/fastPicking.vue              |  103 +++-
 locale/en.json                              |   10 
 static/family/HarmonyOS_Sans_SC_Light.ttf   |    0 
 static/img/login_top.png                    |    0 
 App.vue                                     |   24 +
 static/family/HarmonyOS_Sans_SC_Regular.ttf |    0 
 common/request.js                           |    4 
 static/img/login_eye.png                    |    0 
 pages/login/index.vue                       |  415 ++++++++++++++++++++
 static/img/login_text.png                   |    0 
 manifest.json                               |    6 
 pages/home/index.vue                        |    9 
 static/img/login_noteye.png                 |    0 
 package.json                                |    5 
 static/family/HarmonyOS_Sans_SC_Bold.ttf    |    0 
 pages/outbound/wavePick.vue                 |  286 ++++++++++++++
 static/img/login_backg.png                  |    0 
 22 files changed, 1,128 insertions(+), 51 deletions(-)

diff --git a/App.vue b/App.vue
index 7ce7d3c..8d00500 100644
--- a/App.vue
+++ b/App.vue
@@ -115,6 +115,9 @@
 	@import "colorui/icon.css";
 	@import "static/css/wms.css/wms.css";
 	@import "static/css/common.scss";
+	@import "static/family/HarmonyOS_Sans_SC_Bold.ttf"
+	
+	
 
 	/*姣忎釜椤甸潰鍏叡css */
 	body {
@@ -122,7 +125,26 @@
 		color: #606266;
 		font-family: Helvetica Neue, Helvetica, sans-serif;
 	}
-
+	@font-face {
+		font-family: a1;
+		src: url('static/family/HarmonyOS_Sans_SC_Bold.ttf') format('truetype');
+		
+	}
+	@font-face {
+		font-family: a2;
+		src: url('static/family/HarmonyOS_Sans_SC_Black.ttf') format('truetype');
+		
+	}
+	@font-face {
+		font-family: a3;
+		src: url('static/family/HarmonyOS_Sans_SC_Light.ttf') format('truetype');
+		
+	}
+	@font-face {
+		font-family: a4;
+		src: url('static/family/HarmonyOS_Sans_SC_Regular.ttf') format('truetype');
+		
+	}
 	.nav-list {
 		display: flex;
 		flex-wrap: wrap;
diff --git a/common/request.js b/common/request.js
index 08c572f..1b762d2 100644
--- a/common/request.js
+++ b/common/request.js
@@ -15,8 +15,8 @@
 	return new Promise((resolve, reject) => {
 		const token = uni.getStorageSync('token');
 		// const URL = 'http://47.76.147.249:8080/rsf-server/pda' + url;
-		const URL = 'http://test.zoneyung.net:8080/rsf-server/pda' + url;
-		// const URL = 'http://127.0.0.1:8080/rsf-server/pda' + url;
+		// const URL = 'http://test.zoneyung.net:8080/rsf-server/pda' + url;
+		const URL = 'http://192.168.4.50:8080/rsf-server/pda' + url;
 		uni.request({
 			url: URL,
 			data: postData,
diff --git a/locale/en.json b/locale/en.json
index c9c2500..6285cbf 100644
--- a/locale/en.json
+++ b/locale/en.json
@@ -11,8 +11,8 @@
   "login":{
   	"login": "login",
   	"loging": "loging",
-  	"user": "user",
-  	"pwd": "pwd",
+  	"user": "username",
+  	"pwd": "password",
   	"inputUser": "Please enter your account",
   	"inputPwd":"Please enter your password",
 	"remPwd":"remember password"
@@ -30,7 +30,11 @@
 	"stationUnbinding":"Station Unbinding",
 	"bindAndInbound":"Binding And Inbound",
 	"quickPicking":"Quick Picking",
-	"outLogin":"Login Out"
+	"wavePick":"Wave Picking",
+	"outLogin":"Login Out",
+	"language-change-confirm":"chenge",
+	"hello":"Hello, welcome to log in to the WMS system!",
+	"intro":"Make manufacturing and logistics more efficient"
   	
   	
   },
diff --git a/locale/zh-Hans.json b/locale/zh-Hans.json
index a4a0b7c..65b55d3 100644
--- a/locale/zh-Hans.json
+++ b/locale/zh-Hans.json
@@ -31,7 +31,11 @@
 		"stationUnbinding":"绔欑偣瑙g粦",
 		"bindAndInbound":"缁戝畾&鍏ュ簱",
 		"quickPicking":"蹇�熸嫞璐�",
-		"outLogin":"閫�鍑虹櫥褰�"
+		"wavePick":"娉㈡鎷h揣",
+		"outLogin":"閫�鍑虹櫥褰�",
+		"language-change-confirm":"纭畾鍒囨崲?",
+		"hello":"鎮ㄥソ锛屾杩庣櫥褰昗MS绯荤粺锛�",
+		"intro":"璁╁埗閫犱笌鐗╂祦鏇撮珮鏁�"
 		
 		
 	},
diff --git a/manifest.json b/manifest.json
index 93aef42..2c9bc8b 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,9 +1,9 @@
 {
-    "name" : "%app.name%",
+    "name" : "涓壃wms",
     "appid" : "__UNI__DA5854D",
     "description" : "",
-    "versionName" : "20250225A",
-    "versionCode" : 146,
+    "versionName" : "20250613",
+    "versionCode" : 100,
     "transformPx" : false,
     /* 5+App鐗规湁鐩稿叧 */
     "app-plus" : {
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..36e6485
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,19 @@
+{
+  "name": "pda-master",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "dependencies": {
+        "vue-i18n": "^8.2.1"
+      }
+    },
+    "node_modules/vue-i18n": {
+      "version": "8.28.2",
+      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.28.2.tgz",
+      "integrity": "sha512-C5GZjs1tYlAqjwymaaCPDjCyGo10ajUphiwA922jKt9n7KPpqR7oM1PCwYzhB/E7+nT3wfdG3oRre5raIT1rKA==",
+      "deprecated": "Vue I18n v8.x has reached EOL and is no longer actively maintained. About maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html",
+      "license": "MIT"
+    }
+  }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..3cac16e
--- /dev/null
+++ b/package.json
@@ -0,0 +1,5 @@
+{
+  "dependencies": {
+    "vue-i18n": "^8.2.1"
+  }
+}
diff --git a/pages.json b/pages.json
index ea09fde..8e9a351 100644
--- a/pages.json
+++ b/pages.json
@@ -1,7 +1,7 @@
 {
 	"pages": [ //pages鏁扮粍涓涓�椤硅〃绀哄簲鐢ㄥ惎鍔ㄩ〉锛屽弬鑰冿細https://uniapp.dcloud.io/collocation/pages
 		{
-			"path": "pages/login/login",
+			"path": "pages/login/index",
 			"style": {
 				"navigationBarTitleText": "%page.login%"
 			}
@@ -13,6 +13,18 @@
 			}
 		},
 		{
+			"path": "pages/outbound/wavePick",
+			"style": {
+				"navigationBarTitleText": "娉㈡鎷h揣"
+			}
+		},
+		{
+			"path": "pages/outbound/wavePickItem",
+			"style": {
+				"navigationBarTitleText": "娉㈡鎷h揣"
+			}
+		},
+		{
 			"path": "pages/rece/standard",
 			"style": {
 				"navigationBarTitleText": "鏍囧噯鏀惰揣"
diff --git a/pages/home/index.vue b/pages/home/index.vue
index e85ba2e..bfe5663 100644
--- a/pages/home/index.vue
+++ b/pages/home/index.vue
@@ -145,6 +145,13 @@
 					<text>{{$t('index.quickPicking')}}</text>
 				</navigator>
 			</view>
+			<view class="cu-item">
+				<navigator hover-class='none' url="/pages/outbound/wavePickItem" navigateTo>
+					<view class="cuIcon-apps text-blue">
+					</view>
+					<text>{{$t('index.wavePick')}}</text>
+				</navigator>
+			</view>
 
 		</view>
 
@@ -179,7 +186,7 @@
 				setTimeout(() => {
 					uni.removeStorageSync('token');
 					uni.reLaunch({
-						url: "/pages/login/login"
+						url: "/pages/login/index"
 					});
 				}, 1000);
 			}
diff --git a/pages/login/index.vue b/pages/login/index.vue
new file mode 100644
index 0000000..c807b4b
--- /dev/null
+++ b/pages/login/index.vue
@@ -0,0 +1,415 @@
+<template>
+	<view class="bodyView">
+		<view class="topView">
+			<image src="/static/img/login_top.png" mode="aspectFill">				
+			</image>
+		</view>
+		<view class="logoView">
+			<image src="/static/img/newLogo.png" mode="aspectFit">
+			</image>
+		</view>
+		<view class="bottomView">
+			<view class="itemView" style="margin-bottom: 40px;">
+				<view class="helloText">{{$t('index.hello')}}</view>
+				<view class="introText">{{$t('index.intro')}}</view>
+			</view>
+			<view class="itemView">
+				<view class="textType3">{{$t('login.user')}}:</view>
+				<view class="input-wrapper">
+					<input class="uni-input" v-model="user.userName" focus :placeholder="$t('login.inputUser')" />
+				</view>
+			</view>
+			<view class="itemView">
+				<view class="textType3">{{$t('login.pwd')}}:</view>
+				<view class="input-wrapper">
+					<input class="uni-input" v-model="user.password" :placeholder="$t('login.inputPwd')" :password="!showPassword" />
+					<image src="/static/img/login_noteye.png" class="eye-icon" v-if="showPassword"
+						@click="changePassword"></image>
+					<image src="/static/img/login_eye.png" class="eye-icon" v-if="!showPassword"
+						@click="changePassword"></image>
+				</view>
+			</view>
+			<view class="langAndRemView">
+				<view class="check">
+					<view >
+						<view>{{$t('login.remPwd')}}</view>
+					</view>
+					<view>
+						<switch :checked='remberPassword' color="#FFCC33" style="transform:scale(0.7)" @change="remberChange" />
+					</view>
+				</view>
+				<view class="langView">
+					<!-- 璇█閫夋嫨涓嬫媺鑿滃崟 -->
+					<view class="language-dropdown">
+						<view class="selected-language" @click="toggleLanguageDropdown">
+							<text>{{getCurrentLanguageText()}}</text>
+							<uni-icons type="bottom" size="14" color="#707070"></uni-icons>
+						</view>
+						<view class="language-options" v-if="showLanguageDropdown">
+							<view class="language-option" v-for="(item, index) in locales" :key="index" @click="onLocaleChange(item)">
+								<text>{{item.text}}</text>
+								<uni-icons type="checkmarkempty" size="14" color="#007AFF" v-if="item.code == applicationLocale"></uni-icons>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="itemView">
+				<button class="loadingButton" @click="onLogin()"  :loading="loading">{{btnText}}</button>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import md5 from '../../static/js/md5.js'
+	import {
+		request
+	} from '../../common/request.js'
+export default{
+	data(){
+		return{
+			showPassword: false,
+			loading: false,
+			showLanguageDropdown: false,
+			loginButton: 'login.login',
+			systemLocale: '',
+			applicationLocale: '',
+			remberPassword: true,
+			user: {
+				userName: '',
+				password: '',
+			},
+		}
+	},
+	computed:{
+	  locales() {
+	    return [{
+	        text: this.$t('locale.auto'),
+	        code: 'auto'
+	      }, {
+	        text: this.$t('locale.en'),
+	        code: 'en'
+	      },
+	      {
+	        text: this.$t('locale.zh-hans'),
+	        code: 'zh-Hans'
+	      },
+	      {
+	        text: this.$t('locale.zh-hant'),
+	        code: 'zh-Hant'
+	      },
+	      {
+	        text: this.$t('locale.ja'),
+	        code: 'ja'
+	      }
+	    ]
+	  },
+	  btnText() {			 
+			  return this.$t(this.loginButton); 
+		}
+	},
+	onLoad(){
+		let systemInfo = uni.getSystemInfoSync();
+		this.systemLocale = systemInfo.language;
+		this.applicationLocale = uni.getLocale();
+		this.isAndroid = systemInfo.platform.toLowerCase() === 'android';
+		uni.onLocaleChange((e) => {
+		  this.applicationLocale = e.locale;
+		})
+		
+		this.user = uni.getStorageSync('user')		
+		if (!this.user) {
+			this.user = {
+				userName: '',
+				password: ''
+			}
+		}
+	},
+	methods:{
+		async onLogin() {
+			const {
+				code,
+				data,
+				msg
+			} = await request('/login', {
+				username: this.user.userName,
+				password: this.user.password,
+			})
+			if (code === 200) {
+				this.loading = true;
+				this.loginButton = 'login.loging';					
+				uni.setStorageSync('token', data.accessToken);	
+				uni.setStorageSync('userData', data.user);				
+				if (this.remberPassword) {						
+					uni.setStorageSync('user', this.user);
+				} else {
+					uni.removeStorageSync('user');
+				}
+				this.goHome()
+			} else {
+				uni.showToast({
+					title: msg
+				})
+			}
+		
+		},
+		goHome() {
+			setTimeout(() => {
+				// this.getAuth2()
+				this.getFields()
+				uni.showToast({
+					title: '鐧诲綍鎴愬姛'
+				})
+				setTimeout(() => {
+					uni.reLaunch({
+						url: '../home/index'
+					});
+				}, 300)
+			}, 700)
+		},
+		async getFields() {
+			const {
+				code,
+				data,
+				msg
+			} = await request('/dynamic/fields', {}, 'get')
+			if (code === 200) {
+				this.$store.commit('user/setFields', data)
+			} else {
+				uni.showToast({
+					title: msg
+				})
+			}
+		},
+		remberChange(e) {
+			this.remberPassword = !this.remberPassword
+		},
+		// 鏄剧ず/闅愯棌瀵嗙爜
+		changePassword() {
+			this.showPassword = !this.showPassword;
+		},
+		localChange() {
+			console.log(this.local)
+		  if (this.isAndroid) {
+		    uni.showModal({
+		      content: this.$t('index.language-change-confirm'),
+		      success: (res) => {
+		        if (res.confirm) {
+		          uni.setLocale(this.local.value);
+		        }
+		      }
+		    })
+		  } else {
+		    uni.setLocale(this.local.value);
+		    this.$i18n.locale = this.local.value;
+		  }
+		},
+		// 鍒囨崲璇█涓嬫媺鑿滃崟鏄剧ず鐘舵��
+		toggleLanguageDropdown() {
+			this.showLanguageDropdown = !this.showLanguageDropdown;
+		},
+		
+		// 鑾峰彇褰撳墠閫夋嫨鐨勮瑷�鏂囨湰
+		getCurrentLanguageText() {
+			const currentLocale = this.locales.find(item => item.code === this.applicationLocale);
+			return currentLocale ? currentLocale.text : this.$t('locale.auto');
+		},
+		
+		// 璇█閫夋嫨鏀瑰彉
+		onLocaleChange(e) {
+			if (this.isAndroid) {
+				uni.showModal({
+					content: this.$t('index.language-change-confirm'),
+					success: (res) => {
+						if (res.confirm) {
+							uni.setLocale(e.code);
+							this.showLanguageDropdown = false;
+						}
+					}
+				})
+			} else {
+				uni.setLocale(e.code);
+				this.$i18n.locale = e.code;
+				this.showLanguageDropdown = false;
+			}
+		},
+	}
+}
+</script>
+
+<style>	
+	.helloText{
+		font-family: a2;
+		font-size: 20px;
+		margin-top: 10px;
+		margin-bottom: 5px;
+	}
+	.introText{
+		font-family: a3;
+		font-size: 15px;
+		color: #ababab;		
+	}
+	.textType3{
+		font-family: a4;
+	}
+	.bodyView{
+		display: flex;
+		flex-direction: column;
+		background-image: url("/static/img/login_backg.png");
+		background-repeat: no-repeat;
+		background-size: cover;
+		background-position: center;
+		height: 100vh;
+		width: 100%;
+	}
+	.topView{
+		flex: 7;
+	}
+	.topView image{
+		width: 100%;
+	}
+	.logoView{
+		flex: 1;
+		display: flex;
+		justify-content: flex-end;
+		align-items: center;
+		
+	}
+	.logoView image{
+		width: 33%;	
+		height: 50px;
+		margin-right: 20px;
+	}
+	.bottomView{
+		flex: 15;
+		display: flex;
+		flex-direction: column;
+		justify-content: flex-start;
+		align-items: center;
+	}
+	.itemView{
+		width: 90%;
+		height: 50px;
+		margin-bottom: 30px;
+	}
+	.langAndRemView{
+		width: 90%;		
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+	}
+	.langView{
+		width: 30%;
+	}
+	.textImage{
+		width: 60%;
+		height: 42px;
+		object-fit: cover;	
+		margin-top: 20px;
+		margin-bottom: 30px;
+	}
+	
+	.input-wrapper {
+	    /* #ifndef APP-NVUE */
+	    display: flex;
+	    /* #endif */
+	    padding: 8px 13px;
+	    flex-direction: row;
+	    flex-wrap: nowrap;
+	    background-color: #FFFFFF;
+		border-radius: 10px;
+		height: 45px;
+		align-items: center;
+		margin-top: 5px;
+	}
+	
+	.uni-input {
+	    height: 28px;
+	    line-height: 28px;
+	    font-size: 15px;
+	    padding: 0px;
+	    flex: 1;
+	    background-color: #FFFFFF;
+		
+	}
+	
+	.uni-icon {
+	    font-family: uniicons;
+	    font-size: 24px;
+	    font-weight: normal;
+	    font-style: normal;
+	    width: 24px;
+	    height: 24px;
+	    line-height: 24px;
+	    color: #999999;
+	}
+	
+	.uni-eye-active {
+	    color: #007AFF;
+	}
+	
+	.eye-icon {
+		width: 20px;
+		height: 13px;
+		margin-left: 5px;
+	}
+	.loadingButton{
+		background-color: #ffda1e;
+		font-family: a1;
+	}
+	.check {
+		
+		height: 100%;
+		display: flex;
+		font-size: 18px;
+		color: #606266;
+		justify-content: flex-start;
+		align-items: center;
+		
+	}
+	/* 璇█閫夋嫨涓嬫媺鑿滃崟 */
+	.language-dropdown {
+		position: relative;
+		margin-bottom: 20rpx;
+		z-index: 10;
+	}
+	
+	.selected-language {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 15rpx 20rpx;
+		background-color: #f8f8f8;
+		border-radius: 8rpx;
+		border: 1px solid #e0e0e0;
+	}
+	
+	.language-options {
+		position: absolute;
+		bottom: 100%;
+		left: 0;
+		right: 0;
+		background-color: #ffffff;
+		border-radius: 8rpx;
+		box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+		border: 1px solid #e0e0e0;
+		margin-bottom: 5rpx;
+	}
+	
+	.language-option {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 15rpx 20rpx;
+		border-bottom: 1px solid #f0f0f0;
+	}
+	
+	.language-option:last-child {
+		border-bottom: none;
+	}
+	
+	.language-option:active {
+		background-color: #f5f5f5;
+	}
+</style>
\ No newline at end of file
diff --git a/pages/outbound/fastPicking.vue b/pages/outbound/fastPicking.vue
index c84be1c..44fa013 100644
--- a/pages/outbound/fastPicking.vue
+++ b/pages/outbound/fastPicking.vue
@@ -2,22 +2,23 @@
 	<view class="has-foot">
 		<form>
 			<view class="cu-form-group" v-show="!isconfirm">
-				<view class="title">瀹瑰櫒/搴撲綅鐮�</view>
-				<input placeholder="璇锋壂鎻忓鍣�/搴撲綅鐮�" v-model="barcode" @input="search()" focus></input>
+				<view class="title">瀹瑰櫒鐮�</view>
+				<input placeholder="璇锋壂鎻忓鍣ㄧ爜" v-model="barcode"  focus></input>
 				<text class='cuIcon-close text-gray margin-right-xs' v-show="barcode!==''" @click="clearCode"></text>
+				<text class='cuIcon-search text-blue' @click="search"></text>
 			</view>
 
 		</form>
-		<view class="cu-form-group" v-show="isClickItem">
+		<!-- <view class="cu-form-group" v-show="isClickItem">
 			<view class="title">QR鐮�</view>
 			<input placeholder="璇锋壂鎻廞R鐮�" v-model="QRbarcode" ></input>
 			
-		</view>
+		</view> -->
 				
 
 		<view class="cu-list det menu sm-border  padding">
 			<block  v-for="(item, index) in list" :key="index">
-				<view :style="clickItem === index ?itemStyle : {}" class="cu-list det menu  "  @click="clickTaskItem(index)">
+				<view :style="clickItem === index ?itemStyle : {}" class="cu-list det menu  " >
 					
 				
 				<view class="cu-bar bg-white solid-bottom margin-top-sm">
@@ -32,15 +33,10 @@
 					<view class="content">
 						<text class="text-gray">缂栫爜:<text class="text-black ">{{item.matnrCode}}</text></text>
 					</view>					
-				</view>
+				</view>				
 				<view class="cu-item">
 					<view class="content">
-						<text class="text-gray">璁㈠崟:<text class="text-black ">{{item.trackCode}}</text></text>
-					</view>					
-				</view>
-				<view class="cu-item">
-					<view class="content">
-						<text class="text-gray">鍑哄簱鍗�:<text class="text-black ">{{item.trackCode}}</text></text>
+						<text class="text-gray">鍑哄簱鍗�:<text class="text-black ">{{item.sourceCode}}</text></text>
 					</view>					
 				</view>
 				<view class="cu-item">
@@ -52,21 +48,12 @@
 					<view class="content">
 						<text class="text-gray">搴撳瓨鍗曚綅:<text class="text-black ">{{item.unit}}</text></text>
 					</view>	
-					<view class="content">
-						<text class="text-gray">璐ㄦ缁撹:<text class="text-black ">{{item.matnrCode}}</text></text>
-					</view>
+					
 				</view>				
-				<view class="cu-item">
-					<view class="content">
-						<text class="text-gray">鏍囩:<text class="text-black ">{{item.matnrCode}}</text></text>
-					</view>
-						
-				</view>
+				
 				
 				<view class="cu-item">
-					<view class="content">
-						<text class="text-gray">瀛樺偍鏁伴噺:<text class="text-black ">{{item.matnrCode}}</text></text>
-					</view>
+					
 					<view class="content">
 						<text class="text-gray">璁″垝鍒嗘嫞鏁伴噺:<text class="text-black ">{{item.anfme}}</text></text>
 					</view>						
@@ -74,7 +61,7 @@
 				<view class="cu-item">						
 					<view class="content2">
 						<text class="text-gray">鏈鍒嗘嫞鏁伴噺:</text>
-						<input type="number" v-model="item.workQty"></input>
+						<input type="number" v-model="item.anfme" disabled=""></input>
 					</view>
 						
 				</view>	
@@ -83,25 +70,16 @@
 		</view>
 
 
-		<view class="text-blue text-right padding-lr" v-show="isconfirm">
-			鏈鏀惰揣鎬绘暟閲�:{{allCount}}
-		</view>
+		
 
-		<view class="cu-form-group " v-show="isconfirm">
-			<view class="title">鏀惰揣鍖�</view>
-			<uni-data-select v-model="whAreaId" :localdata="range" placement="top"
-				@change="selChange"></uni-data-select>
-		</view>
+		
 
-		<view class="cu-bar btn-group foot" v-show="!isconfirm">
+		<view class="cu-bar btn-group foot" >
 			<button class="cu-btn text-blue line-blue shadow" @click="clear">娓呯┖</button>
-			<button class="cu-btn bg-blue shadow-blur" @click="next">涓嬩竴姝�</button>
+			<button class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="complete">鎻愪氦纭</button>
 		</view>
 
-		<view class="cu-bar btn-group foot" v-show="isconfirm">
-			<button class="cu-btn text-blue line-blue shadow" @click="prev">涓婁竴姝�</button>
-			<button class="cu-btn bg-blue shadow-blur" @click="confirm">鎻愪氦鏀惰揣</button>
-		</view>
+		
 
 	</view>
 </template>
@@ -131,6 +109,7 @@
 				        backgroundColor: '#42b983',				        
 				        borderColor: '#42b983'
 				},
+				repeatClick: false
 			}
 		},
 		computed: {
@@ -192,6 +171,52 @@
 
 
 			},
+			async complete() {
+				let that = this
+				if(that.barcode === '' || that.barcode === null){
+					uni.showToast({
+						title: "瀹瑰櫒鍙蜂负绌�",
+						icon: "error",
+					})
+					return ;
+				}
+				if(that.list === [] || that.list.length === 0){
+					uni.showToast({
+						title: "鎷h揣鏄庣粏涓虹┖",
+						icon: "error",
+					})
+					return ;
+				}
+				that.repeatClick = true
+				const {
+					code,
+					data,
+					msg
+				} = await request('/saveOutTaskSts/'+that.barcode,{}, 'get')
+				if (code === 200) {	
+					uni.showToast({
+						title: msg,
+						icon: "success"
+					})
+					that.clear()
+					
+				}else if(code == 401){
+					setTimeout(() => {
+						uni.removeStorageSync('token');
+						uni.reLaunch({
+							url: "/pages/login/login"
+						});
+					}, 1000);
+				}else {
+					uni.showToast({
+						title: msg,
+						icon: "none",
+						position: 'top'
+					})
+				}
+			that.repeatClick = false
+			
+			},
 			clearCode() {
 				this.barcode = ''
 			},
diff --git a/pages/outbound/wavePick.vue b/pages/outbound/wavePick.vue
new file mode 100644
index 0000000..d7b1ef9
--- /dev/null
+++ b/pages/outbound/wavePick.vue
@@ -0,0 +1,286 @@
+<template>
+	<view class="has-foot">
+		<form>
+			<view class="cu-form-group" v-show="!isconfirm">
+				<view class="title">娉㈡鍙�</view>
+				<input placeholder="璇锋壂鎻忔尝娆″彿" v-model="barcode" @input="search()" focus></input>
+				<text class='cuIcon-close text-gray margin-right-xs' v-show="barcode!==''" @click="clearCode"></text>
+			</view>
+
+		</form>
+		
+				
+
+		<view class="cu-list det menu sm-border  padding">
+			<block  v-for="(item, index) in list" :key="index">
+				<view  class="cu-list det menu  "  @click="clickTaskItem(index)">
+					
+				
+				<view class="cu-bar bg-white solid-bottom margin-top-sm">
+					<view class="action">
+						<view class="index">
+							{{index+1}}
+						</view>
+					</view>
+					<view class="content2">
+						<text class="text-gray"><text class="text-black ">{{item.exceStatus$}}</text></text>
+					</view>
+				</view>
+
+				<view class="cu-item">
+					<view class="content">
+						<text class="text-gray">娉㈡鍙�:<text class="text-black ">{{item.code}}</text></text>
+					</view>						
+				</view>
+				<view class="cu-item">
+					<view class="content">
+						<text class="text-gray">鍒涘缓鏃堕棿:<text class="text-black ">{{item.createTime$}}</text></text>
+					</view>					
+				</view>				
+				<view class="cu-item">
+					<view class="content">
+						<text class="text-gray">璁㈠崟鏁�:<text class="text-black ">{{item.orderNum}}</text></text>
+					</view>	
+					<view class="content">
+						<text class="text-gray">鍝佺被鏁伴噺:<text class="text-black ">{{item.groupQty}}</text></text>
+					</view>
+				</view>	
+				<view class="cu-item">
+					<view class="content">
+						<text class="text-gray">鎬绘暟閲�:<text class="text-black ">{{item.anfme}}</text></text>
+					</view>	
+					<view class="content">
+						<text class="text-gray">绛栫暐:<text class="text-black ">{{item.matnrCode}}</text></text>
+					</view>
+				</view>
+					
+				</view>
+			</block>
+		</view>
+
+
+		<view class="text-blue text-right padding-lr" v-show="isconfirm">
+			鏈鏀惰揣鎬绘暟閲�:{{allCount}}
+		</view>
+
+		<view class="cu-form-group " v-show="isconfirm">
+			<view class="title">鏀惰揣鍖�</view>
+			<uni-data-select v-model="whAreaId" :localdata="range" placement="top"
+				@change="selChange"></uni-data-select>
+		</view>
+
+		<view class="cu-bar btn-group foot" v-show="!isconfirm">
+			<button class="cu-btn text-blue line-blue shadow" @click="clear">娓呯┖</button>
+			<button class="cu-btn bg-blue shadow-blur" @click="next">涓嬩竴姝�</button>
+		</view>
+
+		<view class="cu-bar btn-group foot" v-show="isconfirm">
+			<button class="cu-btn text-blue line-blue shadow" @click="prev">涓婁竴姝�</button>
+			<button class="cu-btn bg-blue shadow-blur" @click="confirm">鎻愪氦鏀惰揣</button>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	import {
+		request
+	} from '../../common/request.js'
+	import {
+		mapState,
+		mapMutations,
+		mapActions,
+		mapGetters
+	} from 'vuex';
+	export default {
+		data() {
+			return {
+				isClickItem:false,
+				clickItem:'',
+				QRbarcode:null,
+				barcode: '',
+				whAreaId: '',
+				list: [],
+				range: [],
+				isconfirm: false,							
+				itemStyle: {
+				        backgroundColor: '#42b983',				        
+				        borderColor: '#42b983'
+				},
+			}
+		},
+		computed: {
+			...mapState('user', ['dynamicFields']),
+			allCount() {
+				return this.list.reduce((acc, row) => +row.receiptQty + acc, 0)
+			}
+		},
+		mounted() {
+			this.search()
+		},
+		methods: {
+			clickTaskItem(index){
+				let that = this
+				uni.navigateTo({
+					url: "./wavePickItem",
+					// 閫氳繃eventChannel鍚戣鎵撳紑椤甸潰浼犻�佹暟鎹�
+					success: function(res) {
+						res.eventChannel.emit('waveItem', {
+							data: that.list[index]
+						})
+					}
+					
+				});				
+			},
+			typeChange(e){
+				this.typeSelect = e.value
+				this.search()
+			},
+			async search() {
+				this.list = []
+				// if(this.barcode === '' || this.barcode ===null){
+				// 	return ;
+				// }
+				const {
+					code,
+					data,
+					msg
+				} = await request('/getWaveList',{
+					barcode:this.barcode
+				}	
+				)
+				if (code === 200) {					
+					if (Object.keys(data).length === 0){
+						uni.showToast({
+							title: "鏈煡璇㈠埌娉㈡鏁版嵁",
+							icon: "none",
+							position: 'top'
+						})
+					}
+					this.list.push(...data)
+					
+				}else if(code == 401){
+					setTimeout(() => {
+						uni.removeStorageSync('token');
+						uni.reLaunch({
+							url: "/pages/login/login"
+						});
+					}, 1000);
+				}else {
+					uni.showToast({
+						title: msg,
+						icon: "none",
+						position: 'top'
+					})
+				}
+
+
+			},
+			clearCode() {
+				this.barcode = ''
+			},
+			remove(index) {
+				this.list.splice(index, 1);
+			},
+			clear() {
+				this.list = []
+				this.barcode = ''
+			},
+			next() {
+				if (this.list.length) {
+					this.isconfirm = true
+				} else {
+					uni.showToast({
+						icon: "none",
+						title: '鏈�夌墿鏂欐爣绛�'
+					})
+				}
+			},
+			prev() {
+				this.isconfirm = false
+			},
+			selChange(val) {
+				uni.setStorageSync('whAreaId', val)
+			},
+			async confirm() {
+				const newArr = this.list.map(item => {
+					return {
+						...item,
+						receiptQty: item.receiptQty === null ? 0 : +item.receiptQty
+					};
+				});
+				if (this.whAreaId === '') {
+					uni.showToast({
+						icon: "none",
+						title: '璇烽�夋嫨鏀惰揣鍖�'
+					})
+				} else {
+					const {
+						code,
+						data,
+						msg
+					} = await request('/orders/confirm', {
+						receipts: newArr,
+						whAreaId: this.whAreaId
+					})
+					if (code === 200) {
+						uni.showToast({
+							title: '鏀惰揣鎴愬姛'
+						})
+						this.list = []
+						this.barcode = ''
+						this.isconfirm = false
+					} else {
+						uni.showToast({
+							title: msg,
+							icon: "none",
+							position: 'top'
+						})
+					}
+
+				}
+			},
+			
+			DateChange(e, item) {
+				item.prodTime = e.detail.value
+			}
+		}
+	}
+</script>
+
+<style>
+	.index {
+		border: 1px solid #e54d42;
+		color: #e54d42;
+		border-radius: 50%;
+		display: block;
+		width: 50rpx;
+		height: 50rpx;
+		line-height: 48rpx;
+		text-align: center;
+		margin-right: 20rpx;
+		font-size: 30rpx;
+	}
+
+	.text-blue {
+		color: #0081ff !important;
+
+	}
+
+	.item {
+		position: relative;
+		display: flex;
+		min-height: 80upx;
+		align-items: center;
+	}
+	.content2 {		
+		/* background-color: coral; */
+		width: 100%;
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		justify-content: flex-end;
+		margin-right: 10px;
+		color: #0081ff;
+	}
+</style>
\ No newline at end of file
diff --git a/pages/outbound/wavePickItem.vue b/pages/outbound/wavePickItem.vue
new file mode 100644
index 0000000..25f9817
--- /dev/null
+++ b/pages/outbound/wavePickItem.vue
@@ -0,0 +1,278 @@
+<template>
+	<view class="has-foot">
+		<form>
+			<!-- <view class="cu-form-group" v-show="!isconfirm">
+				<view class="title">娉㈡鍙�</view>
+				<text class="text-black ">{{wave.code}}</text>				
+			</view> -->
+			<view class="cu-form-group" v-show="!isconfirm">
+				<view class="title">瀹瑰櫒鍙�</view>
+				<input placeholder="璇锋壂鎻忓鍣ㄥ彿" v-model="barcode"  focus></input>
+				<text class='cuIcon-close text-gray margin-right-xs' v-show="barcode!==''" @click="clearCode"></text>
+				<text class='cuIcon-search text-blue' @click="search"></text>
+			</view>
+
+		</form>
+		
+				
+
+		<view class="cu-list det menu sm-border  padding">
+			<block  v-for="(item, index) in list">
+				<view  class="cu-list det menu  ">
+					
+				
+				<view class="cu-bar bg-white solid-bottom margin-top-sm">
+					<view class="action">
+						<view class="index">
+							{{index+1}}
+						</view>
+					</view>
+					<view class="content2">
+						<text class="text-gray"><text class="text-black ">{{item.exceStatus$}}</text></text>
+					</view>
+				</view>
+
+				<view class="cu-item">
+					<view class="content">
+						<text class="text-gray">鐗╂枡缂栫爜:<text class="text-black ">{{item.taskItem.matnrCode}}</text></text>
+					</view>						
+				</view>
+				<view class="cu-item">
+					<view class="content">
+						<text class="text-gray">鐗╂枡鍚嶇О:<text class="text-black ">{{item.taskItem.maktx}}</text></text>
+					</view>					
+				</view>				
+				<view class="cu-item">
+					<view class="content">
+						<text class="text-gray">鎬绘暟閲�:<text class="text-black ">{{item.taskItem.anfme}}</text></text>
+					</view>						
+				</view>
+				
+				</view>
+				<view  class="cu-list det menu noMargin " v-for="(item2,index2) in item.asnOrderItems">
+					<view class="cu-item">
+						<view class="content">
+							<text class="text-gray">{{index2+1}}.</text>
+						</view>						
+					</view>
+					<view class="cu-item">						
+						<view class="content">
+							<text class="text-gray">璁㈠崟鍙�:<text class="text-black ">{{item2.asnCode}}</text></text>
+						</view>						
+					</view>
+					<view class="cu-item">
+						<view class="content">
+							<text class="text-gray">闇�姹傛暟閲�:<text class="text-black ">{{item2.anfme}}</text></text>
+						</view>
+					</view>
+					<view class="cu-item">
+						<view class="content">
+							<text class="text-gray">宸叉嫞鏁伴噺:<text class="text-black ">{{item2.qty}}</text></text>
+						</view>
+					</view>
+					<view class="cu-item" v-show="item2.anfme !== item2.qty">
+						<view class="content">
+							<view class="cu-form-group padding-lr-0">
+								<view class="title text-blue"><text
+										class="text-red text-xl vertical-middle">*</text>鎷�:</view>
+								<uni-number-box style="width: 70%;" :max="max" v-model="item2.demandQty"
+									:step='1' ></uni-number-box>
+							</view>
+						</view>
+					</view>
+				</view>
+				<view class="cu-item">
+					<view class="content">
+						<text class="text-gray">鏈鎷h揣鏁伴噺:<text class="text-black ">{{item.asnOrderItems.reduce((total, item) => total + (Number(item.demandQty) ||0 ) , 0)}}</text></text>
+					</view>						
+				</view>
+				
+			</block>
+		</view>
+
+
+		
+
+		<view class="cu-bar btn-group foot" v-show="!isconfirm">
+			<button class="cu-btn text-blue line-blue shadow" @click="clear">娓呯┖</button>
+			<button class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="complete">鎷h揣瀹屾垚</button>
+		</view>
+
+		
+
+	</view>
+</template>
+
+<script>
+	import {
+		request
+	} from '../../common/request.js'
+	import {
+		mapState,
+		mapMutations,
+		mapActions,
+		mapGetters
+	} from 'vuex';
+	export default {
+		data() {
+			return {
+				wave:'',
+				list: [],				
+				isconfirm: false,
+				barcode:'',
+				max: 99999999,
+				repeatClick:false
+				
+			}
+		},
+		computed: {			
+			allCount() {
+				return this.list.reduce((acc, row) => +row.receiptQty + acc, 0)
+			},
+			
+		},
+		mounted() {
+			
+		},
+		onLoad() {
+			let that = this
+			const eventChannel = this.getOpenerEventChannel();
+			
+			eventChannel.on('waveItem', function(data) {
+				that.wave = data.data
+				
+			})
+			
+		},
+		methods: {
+			clear() {
+				this.barcode = ''
+				this.list = []
+			},
+			clearCode() {
+				this.barcode = ''				
+			},
+			async search() {
+				this.list = []
+				// if(this.barcode === '' || this.barcode ===null){
+				// 	return ;
+				// }
+				const {
+					code,
+					data,
+					msg
+				} = await request('/getContainerWaveList',{
+					barcode:this.barcode
+				}	
+				)
+				if (code === 200) {					
+					if (Object.keys(data).length === 0){
+						uni.showToast({
+							title: "璇ユ爣绛炬湭鏌ヨ鍒版暟鎹�",
+							icon: "none",
+							position: 'top'
+						})
+					}
+					this.list.push(...data)
+					
+				}else if(code == 401){
+					setTimeout(() => {
+						uni.removeStorageSync('token');
+						uni.reLaunch({
+							url: "/pages/login/login"
+						});
+					}, 1000);
+				}else {
+					uni.showToast({
+						title: msg,
+						icon: "none",
+						position: 'top'
+					})
+				}
+			
+			
+			},
+			async complete() {
+				
+				let that = this
+				if(that.barcode === '' || that.barcode === null){
+					uni.showToast({
+						title: "瀹瑰櫒鍙蜂负绌�",
+						icon: "error",
+					})
+					return ;
+				}
+				if(that.list === [] || that.list.length === 0){
+					uni.showToast({
+						title: "鎷h揣鏄庣粏涓虹┖",
+						icon: "error",
+					})
+					return ;
+				}
+				this.repeatClick = true
+				const {
+					code,
+					data,
+					msg
+				} = await request('/saveWavePick',{
+					container:that.barcode,
+					containerWaveDtos:that.list
+				})
+				if (code === 200) {
+					uni.showToast({
+						title: msg,
+						icon: "none",
+					})
+					that.clear()
+				} else {
+					uni.showToast({
+						title: msg,
+						icon: "none",
+					})
+				}
+				this.repeatClick = false
+			},
+		}
+	}
+</script>
+
+<style>
+	.index {
+		border: 1px solid #e54d42;
+		color: #e54d42;
+		border-radius: 50%;
+		display: block;
+		width: 50rpx;
+		height: 50rpx;
+		line-height: 48rpx;
+		text-align: center;
+		margin-right: 20rpx;
+		font-size: 30rpx;
+	}
+
+	.text-blue {
+		color: #0081ff !important;
+
+	}
+
+	.item {
+		position: relative;
+		display: flex;
+		min-height: 80upx;
+		align-items: center;
+	}
+	.content2 {		
+		/* background-color: coral; */
+		width: 100%;
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		justify-content: flex-end;
+		margin-right: 10px;
+		color: #0081ff;
+	}
+	.noMargin{
+		margin-top: 0px;
+		padding: 5px;
+	}
+</style>
\ No newline at end of file
diff --git a/static/family/HarmonyOS_Sans_SC_Black.ttf b/static/family/HarmonyOS_Sans_SC_Black.ttf
new file mode 100644
index 0000000..824b3d4
--- /dev/null
+++ b/static/family/HarmonyOS_Sans_SC_Black.ttf
Binary files differ
diff --git a/static/family/HarmonyOS_Sans_SC_Bold.ttf b/static/family/HarmonyOS_Sans_SC_Bold.ttf
new file mode 100644
index 0000000..5c925d1
--- /dev/null
+++ b/static/family/HarmonyOS_Sans_SC_Bold.ttf
Binary files differ
diff --git a/static/family/HarmonyOS_Sans_SC_Light.ttf b/static/family/HarmonyOS_Sans_SC_Light.ttf
new file mode 100644
index 0000000..8cfbc9d
--- /dev/null
+++ b/static/family/HarmonyOS_Sans_SC_Light.ttf
Binary files differ
diff --git a/static/family/HarmonyOS_Sans_SC_Regular.ttf b/static/family/HarmonyOS_Sans_SC_Regular.ttf
new file mode 100644
index 0000000..aff150a
--- /dev/null
+++ b/static/family/HarmonyOS_Sans_SC_Regular.ttf
Binary files differ
diff --git a/static/img/login_backg.png b/static/img/login_backg.png
new file mode 100644
index 0000000..9390205
--- /dev/null
+++ b/static/img/login_backg.png
Binary files differ
diff --git a/static/img/login_eye.png b/static/img/login_eye.png
new file mode 100644
index 0000000..00f9cb5
--- /dev/null
+++ b/static/img/login_eye.png
Binary files differ
diff --git a/static/img/login_noteye.png b/static/img/login_noteye.png
new file mode 100644
index 0000000..bf4111f
--- /dev/null
+++ b/static/img/login_noteye.png
Binary files differ
diff --git a/static/img/login_text.png b/static/img/login_text.png
new file mode 100644
index 0000000..0d42775
--- /dev/null
+++ b/static/img/login_text.png
Binary files differ
diff --git a/static/img/login_top.png b/static/img/login_top.png
new file mode 100644
index 0000000..d13eafa
--- /dev/null
+++ b/static/img/login_top.png
Binary files differ

--
Gitblit v1.9.1