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