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