skyouc
9 小时以前 a232dcf6d4a59c7c47e06b6619eb7566163f95b4
Merge branch 'devlop' of http://47.97.1.152:5880/r/pda-master into devlop

# Conflicts:
# common/request.js
13个文件已修改
30个文件已添加
5491 ■■■■■ 已修改文件
App.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/request.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
locale/en.json 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
locale/index.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
locale/ja.json 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
locale/uni-app.ja.json 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
locale/zh-Hans.json 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
locale/zh-Hant.json 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manifest.json 263 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages.json 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVStaBind.vue 265 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/BindAndInTask.vue 294 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/StaUnBind.vue 254 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/StartInTask.vue 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/check/checkOrder.vue 283 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/check/checkOrderItem.vue 400 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/check/firstCheck.vue 396 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/home/index.vue 132 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/inspect/bad.vue 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/listing/disc.vue 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/listing/itemSelect.vue 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/listing/labour.vue 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/listing/matnrPalletising.vue 402 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/listing/unPakin.vue 286 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/login/index.vue 415 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/login/login.vue 264 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/outbound/fastPicking.vue 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/outbound/wavePick.vue 286 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/outbound/wavePickItem.vue 277 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/rece/other.vue 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/rece/standard.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/family/HarmonyOS_Sans_SC_Black.ttf 补丁 | 查看 | 原始文档 | blame | 历史
static/family/HarmonyOS_Sans_SC_Bold.ttf 补丁 | 查看 | 原始文档 | blame | 历史
static/family/HarmonyOS_Sans_SC_Light.ttf 补丁 | 查看 | 原始文档 | blame | 历史
static/family/HarmonyOS_Sans_SC_Regular.ttf 补丁 | 查看 | 原始文档 | blame | 历史
static/img/login_backg.png 补丁 | 查看 | 原始文档 | blame | 历史
static/img/login_eye.png 补丁 | 查看 | 原始文档 | blame | 历史
static/img/login_noteye.png 补丁 | 查看 | 原始文档 | blame | 历史
static/img/login_text.png 补丁 | 查看 | 原始文档 | blame | 历史
static/img/login_top.png 补丁 | 查看 | 原始文档 | blame | 历史
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;
common/request.js
@@ -16,7 +16,7 @@
        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://192.168.51.35:8085/rsf-server/pda' + url;
        uni.request({
            url: URL,
            data: postData,
locale/en.json
New file
@@ -0,0 +1,45 @@
{
  "app.name": "ZoneYung WMS",
  "locale.auto": "System",
  "locale.en": "English",
  "locale.zh-hans": "简体中文",
  "locale.zh-hant": "繁体中文",
  "locale.ja": "日语",
  "index.title": "Hello i18n",
  "page.login":"Login",
  "page.index":"Index",
  "login":{
      "login": "login",
      "loging": "loging",
      "user": "username",
      "pwd": "password",
      "inputUser": "Please enter your account",
      "inputPwd":"Please enter your password",
    "remPwd":"remember password"
  },
  "index":{
      "GR": "Goods Receipt",
      "palletizing": "Palletizing",
    "palletBuilding":"Pallet Building",
    "inspectionRequest":"Inspection Request",
    "qualityInspection":"Quality Inspection",
    "defectiveMarking":"Defective Marking",
    "manualPutaway":"Manual Putaway",
    "stationBinding":"Station Binding",
    "inboundInitiation":"Inbound Initiation",
    "stationUnbinding":"Station Unbinding",
    "bindAndInbound":"Binding And Inbound",
    "quickPicking":"Quick Picking",
    "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",
    "checkOrder":"checkOrder"
  },
  "other":{
  }
}
locale/index.js
New file
@@ -0,0 +1,10 @@
import en from './en.json'
import zhHans from './zh-Hans.json'
import zhHant from './zh-Hant.json'
import ja from './ja.json'
export default {
    en,
    'zh-Hans': zhHans,
    'zh-Hant': zhHant,
    ja
}
locale/ja.json
New file
@@ -0,0 +1,23 @@
{
  "locale.auto": "システム",
  "locale.en": "英語",
  "locale.zh-hans": "简体中文",
  "locale.zh-hant": "繁体中文",
  "locale.ja": "日语",
  "index.title": "Hello i18n",
  "index.home": "ホーム",
  "index.component": "コンポーネント",
  "index.api": "API",
  "index.schema": "Schema",
  "index.demo": "uni-app globalization",
  "index.demo-description": "ユニフレームワーク、manifest.json、pages.json、タブバー、ページ、コンポーネント、APIを含める、Schema",
  "index.detail": "詳細",
  "index.language": "言語",
  "index.language-info": "設定",
  "index.system-language": "システム言語",
  "index.application-language": "アプリケーション言語",
  "index.language-change-confirm": "この設定を適用すると、アプリが再起動します",
  "api.message": "メッセージ",
  "schema.add": "追加",
  "schema.add-success": "成功を追加"
}
locale/uni-app.ja.json
New file
@@ -0,0 +1,36 @@
{
  "common": {
    "uni.app.quit": "もう一度押すと、アプリケーションが終了します",
    "uni.async.error": "サーバーへの接続がタイムアウトしました。画面をクリックして再試行してください",
    "uni.showActionSheet.cancel": "キャンセル",
    "uni.showToast.unpaired": "使用するには、showToastとhideToastをペアにする必要があることに注意してください",
    "uni.showLoading.unpaired": "使用するには、showLoadingとhideLoadingをペアにする必要があることに注意してください",
    "uni.showModal.cancel": "キャンセル",
    "uni.showModal.confirm": "OK",
    "uni.chooseImage.cancel": "キャンセル",
    "uni.chooseImage.sourceType.album": "アルバムから選択",
    "uni.chooseImage.sourceType.camera": "カメラ",
    "uni.chooseVideo.cancel": "キャンセル",
    "uni.chooseVideo.sourceType.album": "アルバムから選択",
    "uni.chooseVideo.sourceType.camera": "カメラ",
    "uni.previewImage.cancel": "キャンセル",
    "uni.previewImage.button.save": "画像を保存",
    "uni.previewImage.save.success": "画像をアルバムに正常に保存します",
    "uni.previewImage.save.fail": "画像をアルバムに保存できませんでした",
    "uni.setClipboardData.success": "コンテンツがコピーされました",
    "uni.scanCode.title": "スキャンコード",
    "uni.scanCode.album": "アルバム",
    "uni.scanCode.fail": "認識に失敗しました",
    "uni.scanCode.flash.on": "タッチして点灯",
    "uni.scanCode.flash.off": "タップして閉じる",
    "uni.startSoterAuthentication.authContent": "指紋認識...",
    "uni.picker.done": "完了",
    "uni.picker.cancel": "キャンセル",
    "uni.video.danmu": "「弾幕」",
    "uni.video.volume": "ボリューム",
    "uni.button.feedback.title": "質問のフィードバック",
    "uni.button.feedback.send": "送信"
  },
  "ios": {},
  "android": {}
}
locale/zh-Hans.json
New file
@@ -0,0 +1,49 @@
{
    "app.name": "中扬 WMS",
    "locale.auto": "系统",
    "locale.en": "English",
    "locale.zh-hans": "简体中文",
    "locale.zh-hant": "繁体中文",
    "locale.ja": "日语",
    "index.title": "Hello i18n",
    "index.home": "主页",
    "page.login":"登录",
    "page.index":"首页",
    "login":{
        "login": "登录",
        "loging": "登录中",
        "user": "账号",
        "pwd": "密码",
        "inputUser": "请输入账号",
        "inputPwd":"请输入密码",
        "remPwd":"记住密码"
    },
    "index":{
        "GR": "单据收货",
        "palletizing": "单据组托",
        "palletBuilding":"组托解绑",
        "inspectionRequest":"报检",
        "qualityInspection":"质检",
        "defectiveMarking":"不良标记",
        "manualPutaway":"人工上架",
        "stationBinding":"站点绑定",
        "inboundInitiation":"启动入库",
        "stationUnbinding":"站点解绑",
        "bindAndInbound":"绑定&入库",
        "quickPicking":"快速拣货",
        "wavePick":"波次拣货",
        "outLogin":"退出登录",
        "language-change-confirm":"确定切换?",
        "hello":"您好,欢迎登录WMS系统!",
        "intro":"让制造与物流更高效",
        "checkOrder":"盘点"
    },
    "other":{
        "asnNo":"ASN单号"
    }
}
locale/zh-Hant.json
New file
@@ -0,0 +1,10 @@
{
  "locale.auto": "系統",
  "locale.en": "English",
  "locale.zh-hans": "简体中文",
  "locale.zh-hant": "繁體中文",
  "locale.ja": "日语",
  "index.title": "Hello i18n",
  "index.home": "主頁",
  "login.login": "登录"
}
main.js
@@ -1,7 +1,17 @@
import App from './App'
import messages from './locale/index'
let i18nConfig = {
  locale: uni.getLocale(),// 获取已设置的语言
  messages
}
// #ifndef VUE3
import Vue from 'vue'
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
const i18n = new VueI18n(i18nConfig)
Vue.config.productionTip = false
import '@/common/bluetooth.js';
@@ -13,6 +23,7 @@
Vue.prototype.$Mock = Mock;
App.mpType = 'app'
try {
  function isPromise(obj) {
@@ -43,6 +54,7 @@
} catch (error) { }
const app = new Vue({
    i18n,
  ...App
})
app.$mount()
@@ -50,8 +62,11 @@
// #ifdef VUE3
import { createSSRApp } from 'vue'
import { createI18n } from 'vue-i18n'
const i18n = createI18n(i18nConfig)
export function createApp() {
  const app = createSSRApp(App)
  app.use(i18n)
  return {
    app
  }
manifest.json
@@ -1,131 +1,132 @@
{
    "name": "中扬WMS",
    "appid": "__UNI__DA5854D",
    "description": "",
    "versionName": "20250225A",
    "versionCode": 146,
    "transformPx": false,
    /* 5+App特有相关 */
    "app-plus": {
        "usingComponents": true,
        "nvueStyleCompiler": "uni-app",
        "compilerVersion": 3,
        "splashscreen": {
            "alwaysShowBeforeRender": true,
            "waiting": true,
            "autoclose": true,
            "delay": 0
        },
        /* 模块配置 */
        "modules": {
            "Bluetooth": {}
        },
        /* 应用发布信息 */
        "distribute": {
            /* android打包配置 */
            "android": {
                "permissions": [
                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
                    "<uses-feature android:name=\"android.hardware.camera\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
                ]
            },
            /* ios打包配置 */
            "ios": {
                "dSYMs": false
            },
            /* SDK配置 */
            "sdkConfigs": {
                "ad": {}
            },
            "icons": {
                "android": {
                    "hdpi": "unpackage/res/icons/72x72.png",
                    "xhdpi": "unpackage/res/icons/96x96.png",
                    "xxhdpi": "unpackage/res/icons/144x144.png",
                    "xxxhdpi": "unpackage/res/icons/192x192.png"
                },
                "ios": {
                    "appstore": "unpackage/res/icons/1024x1024.png",
                    "ipad": {
                        "app": "unpackage/res/icons/76x76.png",
                        "app@2x": "unpackage/res/icons/152x152.png",
                        "notification": "unpackage/res/icons/20x20.png",
                        "notification@2x": "unpackage/res/icons/40x40.png",
                        "proapp@2x": "unpackage/res/icons/167x167.png",
                        "settings": "unpackage/res/icons/29x29.png",
                        "settings@2x": "unpackage/res/icons/58x58.png",
                        "spotlight": "unpackage/res/icons/40x40.png",
                        "spotlight@2x": "unpackage/res/icons/80x80.png"
                    },
                    "iphone": {
                        "app@2x": "unpackage/res/icons/120x120.png",
                        "app@3x": "unpackage/res/icons/180x180.png",
                        "notification@2x": "unpackage/res/icons/40x40.png",
                        "notification@3x": "unpackage/res/icons/60x60.png",
                        "settings@2x": "unpackage/res/icons/58x58.png",
                        "settings@3x": "unpackage/res/icons/87x87.png",
                        "spotlight@2x": "unpackage/res/icons/80x80.png",
                        "spotlight@3x": "unpackage/res/icons/120x120.png"
                    }
                }
            }
        },
        "nativePlugins": {
            "Hanyin-Plugin": {
                "__plugin_info__": {
                    "name": "蓝牙连接汉印便携式打印机",
                    "description": "app蓝牙连接汉印便携式打印机面单打印-----测试型号: HM-A300",
                    "platforms": "Android",
                    "url": "https://ext.dcloud.net.cn/plugin?id=2731",
                    "android_package_name": "uni.UNIDA5854D",
                    "ios_bundle_id": "",
                    "isCloud": true,
                    "bought": 1,
                    "pid": "2731",
                    "parameters": {}
                }
            }
        }
    },
    /* 快应用特有相关 */
    "quickapp": {},
    /* 小程序特有相关 */
    "mp-weixin": {
        "appid": "",
        "setting": {
            "urlCheck": false
        },
        "usingComponents": true
    },
    "mp-alipay": {
        "usingComponents": true
    },
    "mp-baidu": {
        "usingComponents": true
    },
    "mp-toutiao": {
        "usingComponents": true
    },
    "uniStatistics": {
        "enable": false
    },
    "vueVersion": "2",
    "h5": {
        "devServer": {
            "port": 8133
        }
    }
}
{
    "name" : "中扬wms",
    "appid" : "__UNI__DA5854D",
    "description" : "",
    "versionName" : "20250613",
    "versionCode" : 100,
    "transformPx" : false,
    /* 5+App特有相关 */
    "app-plus" : {
        "usingComponents" : true,
        "nvueStyleCompiler" : "uni-app",
        "compilerVersion" : 3,
        "splashscreen" : {
            "alwaysShowBeforeRender" : true,
            "waiting" : true,
            "autoclose" : true,
            "delay" : 0
        },
        /* 模块配置 */
        "modules" : {
            "Bluetooth" : {}
        },
        /* 应用发布信息 */
        "distribute" : {
            /* android打包配置 */
            "android" : {
                "permissions" : [
                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
                    "<uses-feature android:name=\"android.hardware.camera\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
                ],
                "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ]
            },
            /* ios打包配置 */
            "ios" : {
                "dSYMs" : false
            },
            /* SDK配置 */
            "sdkConfigs" : {
                "ad" : {}
            },
            "icons" : {
                "android" : {
                    "hdpi" : "unpackage/res/icons/72x72.png",
                    "xhdpi" : "unpackage/res/icons/96x96.png",
                    "xxhdpi" : "unpackage/res/icons/144x144.png",
                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
                },
                "ios" : {
                    "appstore" : "unpackage/res/icons/1024x1024.png",
                    "ipad" : {
                        "app" : "unpackage/res/icons/76x76.png",
                        "app@2x" : "unpackage/res/icons/152x152.png",
                        "notification" : "unpackage/res/icons/20x20.png",
                        "notification@2x" : "unpackage/res/icons/40x40.png",
                        "proapp@2x" : "unpackage/res/icons/167x167.png",
                        "settings" : "unpackage/res/icons/29x29.png",
                        "settings@2x" : "unpackage/res/icons/58x58.png",
                        "spotlight" : "unpackage/res/icons/40x40.png",
                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
                    },
                    "iphone" : {
                        "app@2x" : "unpackage/res/icons/120x120.png",
                        "app@3x" : "unpackage/res/icons/180x180.png",
                        "notification@2x" : "unpackage/res/icons/40x40.png",
                        "notification@3x" : "unpackage/res/icons/60x60.png",
                        "settings@2x" : "unpackage/res/icons/58x58.png",
                        "settings@3x" : "unpackage/res/icons/87x87.png",
                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
                    }
                }
            }
        },
        "nativePlugins" : {
            "Hanyin-Plugin" : {
                "__plugin_info__" : {
                    "name" : "蓝牙连接汉印便携式打印机",
                    "description" : "app蓝牙连接汉印便携式打印机面单打印-----测试型号: HM-A300",
                    "platforms" : "Android",
                    "url" : "https://ext.dcloud.net.cn/plugin?id=2731",
                    "android_package_name" : "uni.UNIDA5854D",
                    "ios_bundle_id" : "",
                    "isCloud" : true,
                    "bought" : 1,
                    "pid" : "2731",
                    "parameters" : {}
                }
            }
        }
    },
    /* 快应用特有相关 */
    "quickapp" : {},
    /* 小程序特有相关 */
    "mp-weixin" : {
        "appid" : "",
        "setting" : {
            "urlCheck" : false
        },
        "usingComponents" : true
    },
    "mp-alipay" : {
        "usingComponents" : true
    },
    "mp-baidu" : {
        "usingComponents" : true
    },
    "mp-toutiao" : {
        "usingComponents" : true
    },
    "uniStatistics" : {
        "enable" : false
    },
    "vueVersion" : "2",
    "h5" : {
        "devServer" : {
            "port" : 8133
        }
    }
}
package-lock.json
New file
@@ -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"
    }
  }
}
package.json
New file
@@ -0,0 +1,5 @@
{
  "dependencies": {
    "vue-i18n": "^8.2.1"
  }
}
pages.json
@@ -1,15 +1,45 @@
{
    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
        {
            "path": "pages/login/login",
            "path": "pages/login/index",
            "style": {
                "navigationBarTitleText": "登 录"
                "navigationBarTitleText": "%page.login%"
            }
        },
        {
            "path": "pages/home/index",
            "style": {
                "navigationBarTitleText": "首页"
                "navigationBarTitleText": "%page.index%"
            }
        },
        {
            "path": "pages/outbound/wavePick",
            "style": {
                "navigationBarTitleText": "波次拣货"
            }
        },
        {
            "path": "pages/check/checkOrder",
            "style": {
                "navigationBarTitleText": "盘点单"
            }
        },
        {
            "path": "pages/check/checkOrderItem",
            "style": {
                "navigationBarTitleText": "初盘"
            }
        },
        {
            "path": "pages/check/firstCheck",
            "style": {
                "navigationBarTitleText": "初盘"
            }
        },
        {
            "path": "pages/outbound/wavePickItem",
            "style": {
                "navigationBarTitleText": "波次拣货"
            }
        },
        {
@@ -21,13 +51,50 @@
        {
            "path": "pages/rece/other",
            "style": {
                "navigationBarTitleText": "其他收货"
                "navigationBarTitleText": "单据收货"
            }
        },
        {
            "path": "pages/listing/disc",
            "style": {
                "navigationBarTitleText": "组盘"
            }
        },
        {
            "path": "pages/AGV/AGVStaBind",
            "style": {
                "navigationBarTitleText": "AGV站点绑定"
            }
        },
        {
            "path": "pages/AGV/StaUnBind",
            "style": {
                "navigationBarTitleText": "AGV站点解绑"
            }
        },
        {
            "path": "pages/AGV/StartInTask",
            "style": {
                "navigationBarTitleText": "AGV启动入库"
            }
        },
        {
            "path": "pages/AGV/BindAndInTask",
            "style": {
                "navigationBarTitleText": "AGV绑定&入库"
            }
        },
        {
            "path": "pages/listing/matnrPalletising",
            "style": {
                "navigationBarTitleText": "单据组托"
            }
        },
        {
            "path": "pages/listing/itemSelect",
            "style": {
                "navigationBarTitleText": "选择物料",
                "enablePullDownRefresh": false
            }
        },
        {
@@ -539,7 +606,15 @@
            }
        }
    ],
        ,{
            "path" : "pages/listing/unPakin",
            "style" :
            {
                "navigationBarTitleText": "组托解绑"
            }
        }
    ],
    "globalStyle": {
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "uni-app",
pages/AGV/AGVStaBind.vue
New file
@@ -0,0 +1,265 @@
<template>
    <view class="has-foot">
        <form>
            <view class="cu-form-group margin-top">
                <view class="title">容器编号</view>
                <input placeholder="请扫容器编号" v-model="container"></input>
                <text class='cuIcon-search text-blue' @click="search"></text>
            </view>
            <view class="cu-form-group ">
                <view class="title">接驳站</view>
                <input placeholder="请扫描接驳站条码" v-model="barcode" ></input>
            </view>
        </form>
        <view class="cu-list det menu sm-border  padding">
            <block v-for="(item, index) in list" :key="index">
                <view class="cu-bar bg-white solid-bottom margin-top-sm">
                    <view class="action">
                        <view class="index">
                            {{index+1}}
                        </view>
                        <view class="text-blue">
                            {{`${item.maktx}`}}
                        </view>
                    </view>
                    <!--     <view class="action" >
                        <text @click="remove(index)" class="cuIcon-close text-red" style="font-size: 24px;"></text>
                    </view> -->
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">ASN:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.asnCode}}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">批次:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.batch}}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">收货数量:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.anfme}}</text>
                    </view>
                </view>
            </block>
        </view>
        <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="confirm">绑定</button>
        </view>
        <uni-popup ref="popup" class="cu-popup">
            <view class="popup-content">
                <view class="head">
                    <text>推荐</text>
                    <text class='cuIcon-close text-red close' @click="close"></text>
                </view>
                <div class="body">
                    <view class="cu-list grid col-3 no-border">
                        <view class="item" v-for="el in range">
                            <view class="cu-btn round  sm" :class="[el===curCode?'bg-blue':'line-blue']"
                                @click="itemChange(el)">{{el}}</view>
                        </view>
                    </view>
                </div>
                <view class="cu-bar btn-group ">
                    <button class="cu-btn bg-blue shadow-blur" @click="popupSubmit">提交</button>
                </view>
            </view>
        </uni-popup>
    </view>
</template>
<script>
    import {
        request
    } from '../../common/request.js'
    import {
        mapState,
        mapMutations,
        mapActions,
        mapGetters
    } from 'vuex';
    export default {
        data() {
            return {
                barcode: '',
                areaName: '',
                locCode: '',
                container: '',
                list: [],
                range: [],
                curCode: ''
            }
        },
        computed: {
            ...mapState('user', ['dynamicFields']),
        },
        mounted() {},
        methods: {
            async search() {
                const {
                    code,
                    data,
                    msg
                } = await request('/stock/operate/list', {
                    barcode: this.container,
                    sta: this.barcode
                })
                if (code === 200) {
                    // const find = this.list.find(el => el.id === data.id);
                    // !find &&
                     this.list = data
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                    })
                }
            },
            remove(index) {
                this.list.splice(index, 1);
            },
            clear() {
                this.list = []
                this.container = ''
                this.barcode = ''
            },
            open() {
                this.$refs.popup.open()
            },
            close() {
                this.$refs.popup.close()
            },
            popupSubmit() {
                this.$refs.popup.close()
            },
            itemChange(el) {
                this.curCode = el
            },
            async confirm() {
                if(this.container === '' || this.container ===null){
                    uni.showToast({
                        title: "容器码不能为空",
                        icon: "none",
                    })
                    return ;
                }
                if(this.barcode === '' || this.barcode ===null){
                    uni.showToast({
                        title: "接驳站码不能为空",
                        icon: "none",
                    })
                    return ;
                }
                const {
                    code,
                    data,
                    msg
                } = await request('/AGV/staBind',{
                        barcode: this.container,
                        sta: this.barcode
                    }
                )
                if (code === 200) {
                    uni.showToast({
                        title: '绑定成功'
                    })
                    this.clear()
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                    })
                }
            },
        }
    }
</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;
    }
    .uni-file-picker {
        width: 100%;
        margin-bottom: 10px;
    }
    .uni-select__selector {
        z-index: 999;
    }
    .tj {
        height: auto;
        padding: 6px 8px;
        display: inline-block;
        border-radius: 6px;
    }
    .item {
        display: flex;
        justify-content: center;
    }
    .item .cu-btn {
        font-size: 26upx;
    }
</style>
pages/AGV/BindAndInTask.vue
New file
@@ -0,0 +1,294 @@
<template>
    <view class="has-foot">
        <form>
            <view class="cu-form-group ">
                <view class="title">接驳站</view>
                <input placeholder="请扫描接驳站条码" v-model="barcode" ></input>
                <text class='cuIcon-search text-blue' @click="search"></text>
            </view>
            <view class="cu-form-group ">
                <view class="title">容器码</view>
                <input placeholder="请扫描容器码" v-model="container" ></input>
                <text class='cuIcon-search text-blue' @click="getList"></text>
            </view>
            <view class="cu-form-group">
                <view class="title">目标库区</view>
                <view style="width: 75%;">
                    <uni-data-select style="min-width: 50%; max-width: 100%;" v-model="whAreaId" :localdata="range"
                        placement="bottom" @change="selChange"></uni-data-select>
                </view>
            </view>
        </form>
        <view class="cu-list det menu sm-border  padding">
            <block v-for="(item, index) in list" :key="index">
                <view class="cu-bar bg-white solid-bottom margin-top-sm">
                    <view class="action">
                        <view class="index">
                            {{index+1}}
                        </view>
                        <view class="text-blue">
                            编码:
                            {{`${item.matnrCode}`}}
                        </view>
                    </view>
                    <!--     <view class="action" >
                        <text @click="remove(index)" class="cuIcon-close text-red" style="font-size: 24px;"></text>
                    </view> -->
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">名称:</text>
                        <text class="text-grey ">{{item.maktx}}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">ASN:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.asnCode}}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">批次:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.batch}}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">收货数量:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.anfme}}</text>
                    </view>
                </view>
            </block>
        </view>
        <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" :disabled="repeatClick" @click="confirm">启动</button>
        </view>
    </view>
</template>
<script>
    import {
        request
    } from '../../common/request.js'
    import {
        mapState,
        mapMutations,
        mapActions,
        mapGetters
    } from 'vuex';
    export default {
        data() {
            return {
                barcode: '',
                areaName: '',
                locCode: '',
                container: '',
                list: [],
                range: [],
                curCode: '',
                whAreaId:'',
                repeatClick: false,
            }
        },
        computed: {
            ...mapState('user', ['dynamicFields']),
        },
        mounted() {},
        methods: {
            selChange(val) {
                uni.setStorageSync('whAreaId', val)
            },
            async search() {
                let that = this
                const {
                    code,
                    data,
                    msg
                } = await request('/staMsg/select', {
                    sta: this.barcode
                })
                if (code === 200) {
                    that.range = data.warehouseAreasList.map(item => ({
                        value: item.id,
                        text: item.name
                    }));
                    that.whAreaId = data.area
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                    })
                }
            },
            async getList() {
                const {
                    code,
                    data,
                    msg
                } = await request('/asnOrderItem/container', {
                    barcode: this.container,
                    type: 'unbind'
                })
                if (code === 200) {
                    for (var i = 0; i < data.length; i++) {
                        data[i].receiptQty = 0;
                    }
                    this.list = data
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                        position: 'top'
                    })
                }
            },
            remove(index) {
                this.list.splice(index, 1);
            },
            clear() {
                this.list = []
                this.range = []
                this.container = ''
                this.barcode = ''
                this.whAreaId = ''
            },
            open() {
                this.$refs.popup.open()
            },
            close() {
                this.$refs.popup.close()
            },
            popupSubmit() {
                this.$refs.popup.close()
            },
            itemChange(el) {
                this.curCode = el
            },
            async confirm() {
                if(this.barcode === '' || this.barcode ===null){
                    uni.showToast({
                        title: "接驳站码不能为空",
                        icon: "none",
                    })
                    return ;
                }
                if(this.whAreaId === '' || this.whAreaId ===null){
                    uni.showToast({
                        title: "目标库区不能为空",
                        icon: "none",
                    })
                    return ;
                }
                if(this.container === '' || this.container ===null){
                    uni.showToast({
                        title: "容器码不能为空",
                        icon: "none",
                    })
                    return ;
                }
                this.repeatClick = true
                const {
                    code,
                    data,
                    msg
                } = await request('/AGV/bindAndIn/start',{
                        sta: this.barcode,
                        area: this.whAreaId,
                        barcode : this.container
                    }
                )
                if (code === 200) {
                    uni.showToast({
                        title: '启动成功'
                    })
                    this.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;
    }
    .uni-file-picker {
        width: 100%;
        margin-bottom: 10px;
    }
    .uni-select__selector {
        z-index: 999;
    }
    .tj {
        height: auto;
        padding: 6px 8px;
        display: inline-block;
        border-radius: 6px;
    }
    .item {
        display: flex;
        justify-content: center;
    }
    .item .cu-btn {
        font-size: 26upx;
    }
</style>
pages/AGV/StaUnBind.vue
New file
@@ -0,0 +1,254 @@
<template>
    <view class="has-foot">
        <form>
            <view class="cu-form-group ">
                <view class="title">接驳站</view>
                <input placeholder="请扫描接驳站条码" v-model="barcode" ></input>
                <text class='cuIcon-search text-blue' @click="search"></text>
            </view>
        </form>
        <view class="flex solid-bottom padding-sm justify-between">
            <view class="text-blue">容器码:{{container}}</view>
        </view>
        <view class="cu-list det menu sm-border  padding">
            <block v-for="(item, index) in list" :key="index">
                <view class="cu-bar bg-white solid-bottom margin-top-sm">
                    <view class="action">
                        <view class="index">
                            {{index+1}}
                        </view>
                        <view class="text-blue">
                            {{`${item.maktx}`}}
                        </view>
                    </view>
                    <!--     <view class="action" >
                        <text @click="remove(index)" class="cuIcon-close text-red" style="font-size: 24px;"></text>
                    </view> -->
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">ASN:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.asnCode}}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">批次:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.batch}}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">收货数量:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.anfme}}</text>
                    </view>
                </view>
            </block>
        </view>
        <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="confirm">解绑</button>
        </view>
        <uni-popup ref="popup" class="cu-popup">
            <view class="popup-content">
                <view class="head">
                    <text>推荐</text>
                    <text class='cuIcon-close text-red close' @click="close"></text>
                </view>
                <div class="body">
                    <view class="cu-list grid col-3 no-border">
                        <view class="item" v-for="el in range">
                            <view class="cu-btn round  sm" :class="[el===curCode?'bg-blue':'line-blue']"
                                @click="itemChange(el)">{{el}}</view>
                        </view>
                    </view>
                </div>
                <view class="cu-bar btn-group ">
                    <button class="cu-btn bg-blue shadow-blur" @click="popupSubmit">提交</button>
                </view>
            </view>
        </uni-popup>
    </view>
</template>
<script>
    import {
        request
    } from '../../common/request.js'
    import {
        mapState,
        mapMutations,
        mapActions,
        mapGetters
    } from 'vuex';
    export default {
        data() {
            return {
                barcode: '',
                areaName: '',
                locCode: '',
                container: '',
                list: [],
                range: [],
                curCode: ''
            }
        },
        computed: {
            ...mapState('user', ['dynamicFields']),
        },
        mounted() {},
        methods: {
            async search() {
                let that = this
                const {
                    code,
                    data,
                    msg
                } = await request('/staBind/list', {
                    sta: this.barcode
                })
                if (code === 200) {
                    if(data.list.length >0){
                        that.container = data.barcode
                        that.list = data.list
                    }
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                    })
                }
            },
            remove(index) {
                this.list.splice(index, 1);
            },
            clear() {
                this.list = []
                this.container = ''
                this.barcode = ''
            },
            open() {
                this.$refs.popup.open()
            },
            close() {
                this.$refs.popup.close()
            },
            popupSubmit() {
                this.$refs.popup.close()
            },
            itemChange(el) {
                this.curCode = el
            },
            async confirm() {
                if(this.barcode === '' || this.barcode ===null){
                    uni.showToast({
                        title: "接驳站码不能为空",
                        icon: "none",
                    })
                    return ;
                }
                const {
                    code,
                    data,
                    msg
                } = await request('/AGV/staUnBind',{
                        sta: this.barcode
                    }
                )
                if (code === 200) {
                    uni.showToast({
                        title: '解绑成功'
                    })
                    this.clear()
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                    })
                }
            },
        }
    }
</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;
    }
    .uni-file-picker {
        width: 100%;
        margin-bottom: 10px;
    }
    .uni-select__selector {
        z-index: 999;
    }
    .tj {
        height: auto;
        padding: 6px 8px;
        display: inline-block;
        border-radius: 6px;
    }
    .item {
        display: flex;
        justify-content: center;
    }
    .item .cu-btn {
        font-size: 26upx;
    }
</style>
pages/AGV/StartInTask.vue
New file
@@ -0,0 +1,261 @@
<template>
    <view class="has-foot">
        <form>
            <view class="cu-form-group ">
                <view class="title">接驳站</view>
                <input placeholder="请扫描接驳站条码" v-model="barcode" ></input>
                <text class='cuIcon-search text-blue' @click="search"></text>
            </view>
            <view class="cu-form-group">
                <view class="title">目标库区</view>
                <view style="width: 75%;">
                    <uni-data-select style="min-width: 50%; max-width: 100%;" v-model="whAreaId" :localdata="range"
                        placement="bottom" @change="selChange"></uni-data-select>
                </view>
            </view>
        </form>
        <view class="flex solid-bottom padding-sm justify-between">
            <view class="text-blue">容器码:{{container}}</view>
        </view>
        <view class="cu-list det menu sm-border  padding">
            <block v-for="(item, index) in list" :key="index">
                <view class="cu-bar bg-white solid-bottom margin-top-sm">
                    <view class="action">
                        <view class="index">
                            {{index+1}}
                        </view>
                        <view class="text-blue">
                            {{`${item.maktx}`}}
                        </view>
                    </view>
                    <!--     <view class="action" >
                        <text @click="remove(index)" class="cuIcon-close text-red" style="font-size: 24px;"></text>
                    </view> -->
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">ASN:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.asnCode}}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">批次:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.batch}}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">收货数量:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.anfme}}</text>
                    </view>
                </view>
            </block>
        </view>
        <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" :disabled="repeatClick" @click="confirm">启动</button>
        </view>
    </view>
</template>
<script>
    import {
        request
    } from '../../common/request.js'
    import {
        mapState,
        mapMutations,
        mapActions,
        mapGetters
    } from 'vuex';
    export default {
        data() {
            return {
                barcode: '',
                areaName: '',
                locCode: '',
                container: '',
                list: [],
                range: [],
                curCode: '',
                whAreaId:'',
                repeatClick: false,
            }
        },
        computed: {
            ...mapState('user', ['dynamicFields']),
        },
        mounted() {},
        methods: {
            selChange(val) {
                uni.setStorageSync('whAreaId', val)
            },
            async search() {
                let that = this
                const {
                    code,
                    data,
                    msg
                } = await request('/staBind/list', {
                    sta: this.barcode
                })
                if (code === 200) {
                    if(data.list.length >0){
                        that.container = data.barcode
                        that.list = data.list
                    }
                    that.range = data.warehouseAreasList.map(item => ({
                        value: item.id,
                        text: item.name
                    }));
                    that.whAreaId = data.area
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                    })
                }
            },
            remove(index) {
                this.list.splice(index, 1);
            },
            clear() {
                this.list = []
                this.container = ''
                this.barcode = ''
            },
            open() {
                this.$refs.popup.open()
            },
            close() {
                this.$refs.popup.close()
            },
            popupSubmit() {
                this.$refs.popup.close()
            },
            itemChange(el) {
                this.curCode = el
            },
            async confirm() {
                if(this.barcode === '' || this.barcode ===null){
                    uni.showToast({
                        title: "接驳站码不能为空",
                        icon: "none",
                    })
                    return ;
                }
                if(this.whAreaId === '' || this.whAreaId ===null){
                    uni.showToast({
                        title: "目标库区不能为空",
                        icon: "none",
                    })
                    return ;
                }
                this.repeatClick = true
                const {
                    code,
                    data,
                    msg
                } = await request('/AGV/task/start',{
                        sta: this.barcode,
                        area: this.whAreaId
                    }
                )
                if (code === 200) {
                    uni.showToast({
                        title: '启动成功'
                    })
                    this.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;
    }
    .uni-file-picker {
        width: 100%;
        margin-bottom: 10px;
    }
    .uni-select__selector {
        z-index: 999;
    }
    .tj {
        height: auto;
        padding: 6px 8px;
        display: inline-block;
        border-radius: 6px;
    }
    .item {
        display: flex;
        justify-content: center;
    }
    .item .cu-btn {
        font-size: 26upx;
    }
</style>
pages/check/checkOrder.vue
New file
@@ -0,0 +1,283 @@
<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.orderCode}}</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.anfme}}</text></text>
                    </view>
                    <view class="content">
                        <text class="text-gray">盘点数量:<text class="text-black ">{{item.checkQty}}</text></text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-gray">盘点类型:<text class="text-black ">{{item.checkType$}}</text></text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <progress :percent="Math.trunc((item.checkQty/item.anfme)*100) " show-info stroke-width="3" />
                    </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>
</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: "./checkOrderItem",
                    // 通过eventChannel向被打开页面传送数据
                    success: function(res) {
                        res.eventChannel.emit('checkItem', {
                            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('/getCheckList',{
                    code: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>
pages/check/checkOrderItem.vue
New file
@@ -0,0 +1,400 @@
<template>
    <view class="has-foot">
        <form>
            <view class="cu-form-group" v-show="!isconfirm">
                <view class="title">盘点单号:<text class="text-black ">{{check.orderCode}}</text></view>
                <!-- <text class='cuIcon-add text-blue' @click="returnPage"></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>
            <view class="cu-form-group" v-show="isconfirm">
                <view class="title">物料码</view>
                <input placeholder="请扫描物料码" v-model="matnr" focus></input>
                <text class='cuIcon-close text-gray margin-right-xs' v-show="matnr!==''" @click="clearCode"></text>
                <text class='cuIcon-search text-blue' @click="addMatnr" v-show="matnr!==''"></text>
            </view>
        </form>
        <view class="cu-list det menu sm-border  padding">
            <block v-for="(item, index) in list" v-if="!isconfirm">
                <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.matnrCode}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-gray">物料名称:<text class="text-black ">{{item.maktx}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-gray">批次:<text class="text-black ">{{item.batch}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item" v-if="check.checkType === 0">
                        <view class="content">
                            <text class="text-gray">托盘库存数:<text class="text-black ">{{item.anfme}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <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="item.checkQty"
                                    :step='1'></uni-number-box>
                            </view>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <view class="cu-form-group padding-lr-0">
                                <text class=" text-blue">备注:</text>
                                <input placeholder="请输入备注" v-model="item.memo"></input>
                            </view>
                        </view>
                    </view>
                    <view class="cu-item" v-if="item.checkQty !== item.anfme && check.checkType === 0">
                        <view class="content">
                            <view class="cu-form-group padding-lr-0">
                                <view class=" text-blue">差异原因:</view>
                                <view style="width: 80%;">
                                    <uni-data-select style="min-width: 90%; max-width: 90%;" v-model="item.reason"
                                        :localdata="reasons" placement="top"></uni-data-select>
                                </view>
                            </view>
                        </view>
                    </view>
                </view>
            </block>
            <block v-for="(item, index) in matnrList">
                <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="action">
                            <text @click="remove(index)" class="cuIcon-close text-red" style="font-size: 24px;"></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.maktx}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item" v-if="check.checkType === 0">
                        <view class="content">
                            <text class="text-gray">库存数:<text class="text-black ">{{item.anfme}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <view class="cu-form-group padding-lr-0">
                                <text class=" text-blue">批次:</text>
                                <input placeholder="请输入批次" v-model="item.batch"></input>
                            </view>
                        </view>
                    </view>
                    <view class="cu-item">
                        <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="item.checkQty"
                                    :step='1'></uni-number-box>
                            </view>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <view class="cu-form-group padding-lr-0">
                                <text class=" text-blue">备注:</text>
                                <input placeholder="请输入备注" v-model="item.memo"></input>
                            </view>
                        </view>
                    </view>
                    <view class="cu-item" v-if="item.checkQty !== item.anfme && check.checkType === 0">
                        <view class="content">
                            <view class="cu-form-group padding-lr-0">
                                <view class=" text-blue">差异原因</view>
                                <view style="width: 80%;">
                                    <uni-data-select style="min-width: 90%; max-width: 90%;" v-model="item.reason"
                                        :localdata="reasons" placement="top"></uni-data-select>
                                </view>
                            </view>
                        </view>
                    </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-orange shadow-blur" @click="returnPage">添加明细</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="returnPage">返回</button>
            <button class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="sureAdd">确定添加</button>
        </view>
    </view>
</template>
<script>
    import {
        request
    } from '../../common/request.js'
    import {
        mapState,
        mapMutations,
        mapActions,
        mapGetters
    } from 'vuex';
    export default {
        data() {
            return {
                check: '',
                list: [],
                isconfirm: false,
                barcode: '',
                max: 99999999,
                repeatClick: false,
                reasons: [],
                matnr: '',
                matnrList:[]
            }
        },
        computed: {
        },
        mounted() {
            this.getReasons()
        },
        onLoad() {
            let that = this
            const eventChannel = this.getOpenerEventChannel();
            eventChannel.on('checkItem', function(data) {
                that.check = data.data
            })
        },
        methods: {
            sureAdd(){
                if(this.matnrList.length === 0){
                    uni.showToast({
                        title: "请添加物料明细",
                        icon: "none",
                        position: 'top'
                    })
                    return ;
                }
                this.list.push(...this.matnrList)
                this.matnrList = []
                this.isconfirm = !this.isconfirm
            },
            remove(index) {
                this.matnrList.splice(index, 1);
            },
            async addMatnr() {
                const {
                    code,
                    data,
                    msg
                } = await request('/selectAddMatnr', {
                    matnr:this.matnr
                })
                if (code === 200) {
                    this.matnrList.push(data)
                    this.matnr = ''
                }
            },
            returnPage() {
                this.matnrList = []
                this.isconfirm = !this.isconfirm
            },
            async getReasons() {
                const {
                    code,
                    data,
                    msg
                } = await request('/getCheckDiffReasonList', {}, 'get')
                if (code === 200) {
                    this.reasons = data.map(item => ({
                        value: item.id,
                        text: item.label
                    }));
                }
            },
            clear() {
                this.barcode = ''
                this.list = []
            },
            clearCode() {
                this.barcode = ''
                this.matnr = ''
            },
            async search() {
                this.list = []
                // if(this.barcode === '' || this.barcode ===null){
                //     return ;
                // }
                const {
                    code,
                    data,
                    msg
                } = await request('/getCheckTaskItemList', {
                    barcode: this.barcode,
                    checkCode: this.check.orderCode
                })
                if (code === 200) {
                    if (Object.keys(data).length === 0) {
                        uni.showToast({
                            title: "该标签未查询到数据",
                            icon: "none",
                            position: 'top'
                        })
                    }
                    for (var i = 0; i < data.length; i++) {
                        data[i].checkQty = data[i].anfme
                    }
                    this.list = 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: "任务明细为空",
                        icon: "error",
                    })
                    return;
                }
                this.repeatClick = true
                const {
                    code,
                    data,
                    msg
                } = await request('/saveCheckDiff', {
                    container: that.barcode,
                    checkId: that.check.id,
                    checkDiffItems: 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>
pages/check/firstCheck.vue
New file
@@ -0,0 +1,396 @@
<template>
    <view class="has-foot">
        <form>
            <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>
            <view class="cu-form-group" v-show="isconfirm">
                <view class="title">物料码</view>
                <input placeholder="请扫描物料码" v-model="matnr" focus></input>
                <text class='cuIcon-close text-gray margin-right-xs' v-show="matnr!==''" @click="clearCode"></text>
                <text class='cuIcon-search text-blue' @click="addMatnr" v-show="matnr!==''"></text>
            </view>
        </form>
        <view class="cu-list det menu sm-border  padding">
            <block v-for="(item, index) in list" v-if="!isconfirm">
                <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.matnrCode}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-gray">物料名称:<text class="text-black ">{{item.maktx}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-gray">批次:<text class="text-black ">{{item.batch}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item" v-if="check.checkType === 0">
                        <view class="content">
                            <text class="text-gray">托盘库存数:<text class="text-black ">{{item.anfme}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <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="item.checkQty"
                                    :step='1'></uni-number-box>
                            </view>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <view class="cu-form-group padding-lr-0">
                                <text class=" text-blue">备注:</text>
                                <input placeholder="请输入备注" v-model="item.memo"></input>
                            </view>
                        </view>
                    </view>
                    <view class="cu-item" v-if="item.checkQty !== item.anfme && check.checkType === 0">
                        <view class="content">
                            <view class="cu-form-group padding-lr-0">
                                <view class=" text-blue">差异原因:</view>
                                <view style="width: 80%;">
                                    <uni-data-select style="min-width: 90%; max-width: 90%;" v-model="item.reason"
                                        :localdata="reasons" placement="top"></uni-data-select>
                                </view>
                            </view>
                        </view>
                    </view>
                </view>
            </block>
            <block v-for="(item, index) in matnrList">
                <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="action">
                            <text @click="remove(index)" class="cuIcon-close text-red" style="font-size: 24px;"></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.maktx}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item" v-if="check.checkType === 0">
                        <view class="content">
                            <text class="text-gray">库存数:<text class="text-black ">{{item.anfme}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <view class="cu-form-group padding-lr-0">
                                <text class=" text-blue">批次:</text>
                                <input placeholder="请输入批次" v-model="item.batch"></input>
                            </view>
                        </view>
                    </view>
                    <view class="cu-item">
                        <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="item.checkQty"
                                    :step='1'></uni-number-box>
                            </view>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <view class="cu-form-group padding-lr-0">
                                <text class=" text-blue">备注:</text>
                                <input placeholder="请输入备注" v-model="item.memo"></input>
                            </view>
                        </view>
                    </view>
                    <view class="cu-item" v-if="item.checkQty !== item.anfme && check.checkType === 0">
                        <view class="content">
                            <view class="cu-form-group padding-lr-0">
                                <view class=" text-blue">差异原因</view>
                                <view style="width: 80%;">
                                    <uni-data-select style="min-width: 90%; max-width: 90%;" v-model="item.reason"
                                        :localdata="reasons" placement="top"></uni-data-select>
                                </view>
                            </view>
                        </view>
                    </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-orange shadow-blur" @click="returnPage">添加明细</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="returnPage">返回</button>
            <button class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="sureAdd">确定添加</button>
        </view>
    </view>
</template>
<script>
    import {
        request
    } from '../../common/request.js'
    import {
        mapState,
        mapMutations,
        mapActions,
        mapGetters
    } from 'vuex';
    export default {
        data() {
            return {
                check: '',
                list: [],
                isconfirm: false,
                barcode: '',
                max: 99999999,
                repeatClick: false,
                reasons: [],
                matnr: '',
                matnrList:[]
            }
        },
        computed: {
        },
        mounted() {
            this.getReasons()
        },
        onLoad() {
            let that = this
            const eventChannel = this.getOpenerEventChannel();
            eventChannel.on('checkItem', function(data) {
                that.check = data.data
            })
        },
        methods: {
            sureAdd(){
                if(this.matnrList.length === 0){
                    uni.showToast({
                        title: "请添加物料明细",
                        icon: "none",
                        position: 'top'
                    })
                    return ;
                }
                this.list.push(...this.matnrList)
                this.matnrList = []
                this.isconfirm = !this.isconfirm
            },
            remove(index) {
                this.matnrList.splice(index, 1);
            },
            async addMatnr() {
                const {
                    code,
                    data,
                    msg
                } = await request('/selectAddMatnr', {
                    matnr:this.matnr
                })
                if (code === 200) {
                    this.matnrList.push(data)
                    this.matnr = ''
                }
            },
            returnPage() {
                this.matnrList = []
                this.isconfirm = !this.isconfirm
            },
            async getReasons() {
                const {
                    code,
                    data,
                    msg
                } = await request('/getCheckDiffReasonList', {}, 'get')
                if (code === 200) {
                    this.reasons = data.map(item => ({
                        value: item.id,
                        text: item.label
                    }));
                }
            },
            clear() {
                this.barcode = ''
                this.list = []
            },
            clearCode() {
                this.barcode = ''
                this.matnr = ''
            },
            async search() {
                this.list = []
                // if(this.barcode === '' || this.barcode ===null){
                //     return ;
                // }
                const {
                    code,
                    data,
                    msg
                } = await request('/getCheckTaskItemList2', {
                    barcode: this.barcode
                })
                if (code === 200) {
                    if (Object.keys(data).length === 0) {
                        uni.showToast({
                            title: "该标签未查询到数据",
                            icon: "none",
                            position: 'top'
                        })
                    }
                    for (var i = 0; i < data.checkDiffItems.length; i++) {
                        data.checkDiffItems[i].checkQty = data.checkDiffItems[i].anfme
                    }
                    this.list = data.checkDiffItems
                    this.check = data.checkDiff
                } 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: "任务明细为空",
                        icon: "error",
                    })
                    return;
                }
                this.repeatClick = true
                const {
                    code,
                    data,
                    msg
                } = await request('/saveCheckDiff', {
                    container: that.barcode,
                    checkId: that.check.id,
                    checkDiffItems: 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>
pages/home/index.vue
@@ -4,7 +4,7 @@
            <image src="../../static/img/toux.png" class="tx" mode="widthFix"></image>
            <view class="text-xl margin-top-sm margin-left-lg">
                <view class="text-blue text-bold text-xxl">
                    张经理
                    {{user.username}}
                </view>
                <view class="text-gray">仓库主管 | zy32423423</view>
            </view>
@@ -19,43 +19,50 @@
        </view>
        <view class="cu-list grid col-4 no-border">
            <view class="cu-item">
            <!-- <view class="cu-item">
                <navigator hover-class='none' url="/pages/rece/standard" navigateTo>
                    <view class="cuIcon-apps text-blue">
                    </view>
                    <text>标准收货</text>
                </navigator>
            </view>
            </view> -->
            <view class="cu-item">
                <navigator hover-class='none' url="/pages/rece/other" navigateTo>
                    <view class="cuIcon-taoxiaopu text-blue">
                    </view>
                    <text>其他收货</text>
                    <text>{{$t('index.GR')}}</text>
                </navigator>
            </view>
            <view class="cu-item">
            <!-- <view class="cu-item">
                <navigator hover-class='none' url="/pages/listing/disc" navigateTo>
                    <view class="cuIcon-cardboard text-blue">
                    </view>
                    <text>组盘</text>
                </navigator>
            </view> -->
            <view class="cu-item">
                <navigator hover-class='none' url="/pages/listing/matnrPalletising" navigateTo>
                    <view class="cuIcon-cardboard text-blue">
                    </view>
                    <text>{{$t('index.palletizing')}}</text>
                </navigator>
            </view>
            <!--             <view class="cu-item">
                <navigator hover-class='none' url="/pages/listing/untie" navigateTo>
            <view class="cu-item">
                <navigator hover-class='none' url="/pages/listing/unPakin" navigateTo>
                    <view class="cuIcon-cardboardforbid text-blue">
                    </view>
                    <text>解绑</text>
                    <text>{{$t('index.palletBuilding')}}</text>
                </navigator>
            </view> -->
            </view>
            <view class="cu-item">
                <navigator hover-class='none' url="/pages/inspect/report" navigateTo>
                    <view class="cuIcon-edit text-blue">
                    </view>
                    <text>报检</text>
                    <text>{{$t('index.inspectionRequest')}}</text>
                </navigator>
            </view>
@@ -63,7 +70,7 @@
                <navigator hover-class='none' url="/pages/inspect/check" navigateTo>
                    <view class="cuIcon-warn text-blue">
                    </view>
                    <text>质检</text>
                    <text>{{$t('index.qualityInspection')}}</text>
                </navigator>
            </view>
@@ -71,7 +78,7 @@
                <navigator hover-class='none' url="/pages/inspect/bad" navigateTo>
                    <view class="cuIcon-appreciate text-blue">
                    </view>
                    <text>不良标记</text>
                    <text>{{$t('index.defectiveMarking')}}</text>
                </navigator>
            </view>
@@ -80,45 +87,90 @@
                <navigator hover-class='none' url="/pages/listing/labour" navigateTo>
                    <view class="cuIcon-friendadd text-blue">
                    </view>
                    <text>人工上架</text>
                    <text>{{$t('index.manualPutaway')}}</text>
                </navigator>
            </view>
            <view class="cu-item">
                <navigator hover-class='none' url="/pages/listing/upper" navigateTo>
                    <view class="cuIcon-punch text-blue">
                    </view>
                    <text>上架</text>
                </navigator>
            </view>
            <view class="cu-item">
                <navigator hover-class='none' url="/pages/phyz/inStock/inStock" navigateTo>
                    <view class="cuIcon-punch text-blue">
                    </view>
                    <text>入库上架</text>
                </navigator>
            </view>
        </view>
        <view class="cu-bar bg-white solid-bottom margin-top">
            <view class="action">
                <text class="cuIcon-title text-orange "></text> 出库
            </view>
                <text class="cuIcon-title text-orange "></text> AGV
            </view>
        </view>
        
        <view class="cu-list grid col-4 no-border">
            <view class="cu-item">
                <navigator hover-class='none' url="/pages/AGV/AGVStaBind" navigateTo>
                    <view class="cuIcon-punch text-blue">
                    </view>
                    <text>{{$t('index.stationBinding')}}</text>
                </navigator>
            </view>
            <view class="cu-item">
                <navigator hover-class='none' url="/pages/AGV/StartInTask" navigateTo>
                    <view class="cuIcon-punch text-blue">
                    </view>
                    <text>{{$t('index.inboundInitiation')}}</text>
                </navigator>
            </view>
            <view class="cu-item">
                <navigator hover-class='none' url="/pages/AGV/StaUnBind" navigateTo>
                    <view class="cuIcon-punch text-blue">
                    </view>
                    <text>{{$t('index.stationUnbinding')}}</text>
                </navigator>
            </view>
            <view class="cu-item">
                <navigator hover-class='none' url="/pages/AGV/BindAndInTask" navigateTo>
                    <view class="cuIcon-punch text-blue">
                    </view>
                    <text>{{$t('index.bindAndInbound')}}</text>
                </navigator>
            </view>
        </view>
        <view class="cu-bar bg-white solid-bottom margin-top">
            <view class="action">
                <text class="cuIcon-title text-orange "></text> 作业
            </view>
        </view>
        <view class="cu-list grid col-4 no-border">
            <view class="cu-item">
                <navigator hover-class='none' url="/pages/outbound/fastPicking" navigateTo>
                    <view class="cuIcon-apps text-blue">
                    </view>
                    <text>快速拣货</text>
                    <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 class="cu-item">
                <navigator hover-class='none' url="/pages/check/checkOrder" navigateTo>
                    <view class="cuIcon-apps text-blue">
                    </view>
                    <text>{{$t('index.checkOrder')}}</text>
                </navigator>
            </view>
            <view class="cu-item">
                <navigator hover-class='none' url="/pages/check/firstCheck" navigateTo>
                    <view class="cuIcon-apps text-blue">
                    </view>
                    <text>{{$t('index.checkOrder')}}</text>
                </navigator>
            </view>
        </view>
        <view class="padding flex flex-direction">
            <view class="cu-btn bg-red margin-tb-sm lg round" @click="equit">退出登录</view>
            <view class="cu-btn bg-red margin-tb-sm lg round" @click="equit">{{$t('index.outLogin')}}</view>
        </view>
    </view>
    </view>
@@ -128,8 +180,16 @@
    export default {
        data() {
            return {
                user:{
                }
            }
        },
        onShow() {
            this.user = uni.getStorageSync('userData');
        },
        methods: {
            equit() {
@@ -140,7 +200,7 @@
                setTimeout(() => {
                    uni.removeStorageSync('token');
                    uni.reLaunch({
                        url: "/pages/login/login"
                        url: "/pages/login/index"
                    });
                }, 1000);
            }
pages/inspect/bad.vue
@@ -135,30 +135,30 @@
        mounted() {},
        methods: {
            async search() {
                // const {
                //     code,
                //     data,
                //     msg
                // } = await request('/asnOrderItem/trackCode/' + this.barcode, {}, "get")
                // if (code === 200) {
                //     const find = this.list.find(el => el.id === data.id);
                //     !find && this.list.push(data)
                // } else {
                //     uni.showToast({
                //         title: msg,
                //         icon: "none",
                //         position: 'top'
                //     })
                // }
                this.list = [{
                    id: 1,
                    maktx: '拉杆箱',
                    maktxCode: '312312312',
                    asnCode: 'asn123412',
                    splrBatch: '3123123',
                    stockUnit: '个',
                    receiptQty: null
                }]
                const {
                    code,
                    data,
                    msg
                } = await request('/defect/' + this.barcode, {}, "post")
                if (code === 200) {
                    const find = this.list.find(el => el.id === data.id);
                    !find && this.list.push(data)
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                        position: 'top'
                    })
                }
                // this.list = [{
                //     id: 1,
                //     maktx: '拉杆箱',
                //     maktxCode: '312312312',
                //     asnCode: 'asn123412',
                //     splrBatch: '3123123',
                //     stockUnit: '个',
                //     receiptQty: null
                // }]
            },
            async confirm() {
                // const {
pages/listing/disc.vue
@@ -5,9 +5,8 @@
                <view class="title">容器号</view>
                <input placeholder="请扫描容器号" v-model="container" focus></input>
                <text class='cuIcon-search text-blue' @click="getList"></text>
            </view>
            <view class="cu-form-group ">
            </view>
            <view class="cu-form-group">
                <view class="title">物料标签</view>
                <input placeholder="请扫描物料标签" v-model="barcode"></input>
                <text class='cuIcon-search text-blue' @click="search"></text>
@@ -21,7 +20,7 @@
        <view class="padding-lr margin-top-sm">
            <block v-for="(item, index) in list" :key="index">
                <view class="cu-list det menu sm-border margin-bottom-sm " :class="[item.trackCode===barcode&&'act']"
                <view class="cu-list det menu sm-border margin-bottom-sm "
                    :ref="item.trackCode+'ref'">
                    <view class="cu-bar bg-white solid-bottom ">
                        <view class="action">
@@ -36,7 +35,6 @@
                            <text @click="remove(index)" class="cuIcon-close text-red" style="font-size: 24px;"></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">ASN:</text>
@@ -45,7 +43,6 @@
                            <text class="text-grey ">{{item.asnCode}}</text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">物料条码:</text>
@@ -54,7 +51,6 @@
                            <text class="text-grey ">{{item.trackCode}}</text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">供应商批次:</text>
@@ -63,7 +59,6 @@
                            <text class="text-grey ">{{item.splrBatch}}</text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">库存批次:</text>
@@ -72,9 +67,6 @@
                            <text class="text-grey ">{{item.batch}}</text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">平台行号: <text class="text-grey ">{{item.platformId}}</text></text>
@@ -90,21 +82,26 @@
                        </view>
                        <view class="content">
                            <text class="text-black">收货数量: <text class="text-grey ">{{item.anfme}}</text></text>
                        </view>
                        <view class="content">
                            <text class="text-black">已上架数量: <text class="text-grey ">{{item.workQty + item.qty}}</text></text>
                        </view>
                        <view class="content">
                            <text class="text-black">已上架数量: <text
                                    class="text-grey ">{{item.workQty + item.qty}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">可组盘数量: <text class="text-grey ">{{item.anfme - item.workQty}}</text></text>
                        </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">可组盘数量: <text
                                    class="text-grey ">{{item.anfme - item.workQty}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <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>
                                <input type="number" placeholder="请输入组盘数量" v-model="megreQty"></input>
                                <uni-number-box style="width: 70%;" :max="max" v-model="item.receiptQty"
                                    :step='1'></uni-number-box>
                            </view>
                        </view>
                    </view>
@@ -113,9 +110,8 @@
        </view>
        <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="confirm">组盘</button>
            <button class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="confirm">组盘</button>
        </view>
    </view>
</template>
@@ -133,11 +129,14 @@
        data() {
            return {
                barcode: '',
                container: '',
                container: '',
                megreQty: '',
                list: [],
                range: [],
                isconfirm: false
                repeatClick: false,
                isconfirm: false,
                max: 99999999,
            }
        },
        computed: {
@@ -149,18 +148,29 @@
        mounted() {},
        methods: {
            async search() {
                const find = this.list.find(el => el.trackCode === this.barcode);
                find ? this.scrollTo() : this.getDet();
                if (this.barcode == undefined || this.barcode == '') {
                    uni.showToast({
                        icon: "none",
                        title: '物料标签不能为空!!'
                    })
                    return
                }
                this.getDet();
            },
            async getDet() {
                const {
                    code,
                    data,
                    msg
                } = await request('/asnOrderItem/trackCode/' + this.barcode, {}, "get")
                } = await request('/asnOrderItem/trackCode', {
                    code: this.barcode,
                }, "post")
                if (code === 200) {
                    data && this.list.push(data);
                    for (var i = 0; i < data.length; i++) {
                        data[i].receiptQty =1;
                        data[i].selected = false;
                    }
                    this.list = data
                } else {
                    uni.showToast({
                        title: msg,
@@ -169,7 +179,14 @@
                    })
                }
            },
            async getList() {
            async getList() {
                if (this.container == undefined || this.container == '') {
                    uni.showToast({
                        icon: "none",
                        title: '容器号不能为空!!'
                    })
                    return
                }
                const {
                    code,
                    data,
@@ -215,11 +232,11 @@
                this.isconfirm = false
            },
            async confirm() {
                this.repeatClick = true
                const newArr = this.list.map(item => {
                    return {
                        ...item,
                        anfme: item.anfme === null ? 0 : +item.anfme,
                        receiptQty: this.megreQty,
                        anfme: item.anfme === null ? 0 : +item.anfme,
                    };
                });
@@ -229,7 +246,7 @@
                    msg
                } = await request('/waitPakin/merge', {
                    items: newArr,
                    barcode: this.container
                    barcode: this.container,
                })
                if (code === 200) {
                    uni.showToast({
@@ -246,6 +263,7 @@
                        position: 'top'
                    })
                }
                this.repeatClick = false
            },
        }
    }
pages/listing/itemSelect.vue
New file
@@ -0,0 +1,218 @@
<template>
    <view>
        <!-- 搜索框 -->
        <view class="search-bar">
            <uni-search-bar v-model="condition" placeholder=" 输入批次/编码/单号" bgColor="#EEEEEE"  @confirm="search()"/>
        </view>
        <view>
            <view class="padding-lr margin-top-sm">
                <block v-for="(item, index) in matList" :key="index">
                    <view class="cu-list det menu sm-border margin-bottom-sm " :class="[item.selected === true &&'act']" @click="selectedItem(index)">
                        <view class="cu-bar bg-white solid-bottom " >
                            <view class="action">
                                <view class="index">
                                    {{index+1}}
                                </view>
                                <view class="text-blue">
                                    编码:
                                    {{`${item.matnrCode}`}}
                                </view>
                            </view>
                            <view class="action">
                                <text v-if="item.selected" class="cuIcon-check text-green" style="font-size: 24px;"></text>
                                <text v-else  class="cuIcon-close text-red" style="font-size: 24px;"></text>
                            </view>
                        </view>
                        <view class="cu-item">
                            <view class="content">
                                <text class="text-black">ASN:</text>
                            </view>
                            <view class="action">
                                <text class="text-grey ">{{item.asnCode}}</text>
                            </view>
                        </view>
                        <view class="cu-item">
                            <view class="content">
                                <text class="text-black">供应商批次:</text>
                            </view>
                            <view class="action">
                                <text class="text-grey ">{{item.splrBatch}}</text>
                            </view>
                        </view>
                        <view class="cu-item">
                            <view class="content">
                                <text class="text-black">质检状态:</text>
                            </view>
                            <view class="action">
                                <text class="text-grey ">{{item.isptResult$}}</text>
                            </view>
                        </view>
                        <view class="cu-item">
                            <view class="content">
                                <text class="text-black">库存单位: <text class="text-grey ">{{item.stockUnit}}</text></text>
                            </view>
                            <view class="content">
                                <text class="text-black">收货数量: <text class="text-grey ">{{item.anfme}}</text></text>
                            </view>
                            <view class="content">
                                <text class="text-black">已上架数量: <text
                                        class="text-grey ">{{item.qty}}</text></text>
                            </view>
                        </view>
                        <view class="cu-item">
                            <view class="content">
                                <text class="text-black">可组盘数量: <text
                                        class="text-grey ">{{item.anfme - item.workQty - item.qty}}</text></text>
                            </view>
                        </view>
                    </view>
                </block>
            </view>
        </view>
        <view class="cu-bar btn-group foot">
            <button class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="back">确定</button>
        </view>
        <!-- <uni-load-more v-show="matList.length != 0" :status="status" :icon-size="16" :content-text="contentText" /> -->
    </view>
</template>
<script>
    import {
        request
    } from '../../common/request.js'
    export default {
        data() {
            return {
                matList: [],
                condition:'',
                baseUrl: '',
                token: '',
                itemStyle: {
                    border: "1px solid #e54d42",
                },
                selectedList:[],
                repeatClick: false,
                matnrCode:'',
                asnCode:'',
            }
        },
        // onReachBottom() {
        //     this.status = 'more';
        //     this.showMat(this.tagIdNow);
        // },
        onLoad() {
            // 没啥用了
            let that = this
            // const eventChannel = this.$scope.eventChannel; // 兼容APP-NVUE
            const eventChannel = this.getOpenerEventChannel();
            // 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据
            eventChannel.on('data', function(data) {
                that.getDet(data)
            })
        },
        onShow() {
            this.baseUrl = uni.getStorageSync('baseUrl');
            this.token = uni.getStorageSync('token');
        },
        methods: {
            search(){
                let req = {
                    matnrCode: this.condition,
                    asnCode: this.condition,
                    code: this.condition,
                    batch: this.condition
                }
                this.getDet(req);
            },
            back() {
                for (var i = 0; i < this.matList.length; i++) {
                    if(this.matList[i].selected === true){
                        this.selectedList.push(this.matList[i])
                    }
                }
                this.getOpenerEventChannel().emit('backData', {data: this.selectedList});
                uni.navigateBack({
                })
            },
            selectedItem(index){
                if(this.matList[index].selected === '' || this.matList[index].selected === null || this.matList[index].selected === undefined){
                    this.matList[index].selected = true
                }else{
                    this.matList[index].selected = !this.matList[index].selected
                }
            },
            async getDet(req) {
                let that = this;
                uni.showLoading({
                    title:'加载中...'
                })
                const {
                    code,
                    data,
                    msg
                } = await request('/asnOrderItem/trackCode', {
                    matnrCode: req.matnrCode,
                    asnCode: req.asnCode,
                    code: req.code,
                    batch: req.batch
                }, "post")
                if (code === 200) {
                    for (var i = 0; i < data.length; i++) {
                        data[i].receiptQty =0;
                        data[i].selected = false;
                    }
                    this.matList = data
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                        position: 'top'
                    })
                }
                uni.hideLoading();
            },
        }
    }
</script>
<style>
    @import url('../../static/css/wms.css/wms.css');
    .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;
    }
    .act {
        border: 1px solid #e54d42;
    }
    .item {
        position: relative;
        display: flex;
        min-height: 80upx;
        align-items: center;
    }
</style>
pages/listing/labour.vue
@@ -1,20 +1,14 @@
<template>
    <view class="has-foot">
        <form>
            <view class="cu-form-group margin-top">
                <view class="title">ASN单</view>
                <input placeholder="请扫描ASN单" v-model="asnCode" focus></input>
            </view>
            <view class="cu-form-group ">
                <view class="title">托盘</view>
                <input placeholder="请扫描托盘" v-model="container"></input>
            </view>
            <view class="cu-form-group ">
                <view class="title">物料码</view>
                <input placeholder="请扫描物料码" v-model="barcode"></input>
                <view class="title">容器码</view>
                <input placeholder="请扫描容器码" v-model="container"></input>
                <text class='cuIcon-search text-blue' @click="search"></text>
            </view>
            <view class="cu-form-group">
                <view class="title">库位码</view>
                <input placeholder="请扫描库位码" v-model="locCode"></input>
            </view>
        </form>
        <view class="cu-list det menu sm-border  padding">
@@ -25,14 +19,18 @@
                            {{index+1}}
                        </view>
                        <view class="text-blue">
                            {{`${item.maktx}`}}
                            编码:{{`${item.matnrCode}`}}
                        </view>
                    </view>
                    <view class="action">
                        <text @click="remove(index)" class="cuIcon-close text-red" style="font-size: 24px;"></text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">名称:</text>
                        <text class="text-grey ">{{item.maktx}}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">ASN:</text>
@@ -41,26 +39,9 @@
                        <text class="text-grey ">{{item.asnCode}}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">托盘:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.barcode}}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">供应商批次:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.splrBatch}}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">库存批次:</text>
                        <text class="text-black">批次:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.batch}}</text>
@@ -68,7 +49,7 @@
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">收货数量:</text>
                        <text class="text-black">数量:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey ">{{item.anfme}}</text>
@@ -78,10 +59,7 @@
            </block>
        </view>
        <view class="cu-form-group margin-bottom">
            <view class="title">库位码</view>
            <input placeholder="请扫描库位码" v-model="locCode"></input>
        </view>
        <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="confirm">上架</button>
@@ -119,15 +97,13 @@
                    code,
                    data,
                    msg
                } = await request('/stock/operate/list', {
                    asnCode: this.asnCode,
                    barcode: this.container,
                    matnrCode: this.barcode
                } = await request('/stock/operate/list', {
                    barcode: this.container,
                })
                if (code === 200) {
                    // const find = this.list.find(el => el.id === data.id);
                    // !find &&
                     this.list.push(data)
                     this.list = data
                } else {
                    uni.showToast({
                        title: msg,
@@ -145,33 +121,44 @@
            },
            async confirm() {
                if (this.locCode !== '') {
                    const {
                        code,
                        data,
                        msg
                    } = await request('/stock/operate', {
                        itemList: this.list,
                        locCode: this.locCode
                if (this.locCode === '' || this.locCode === null) {
                    uni.showToast({
                        title: '请输入库位',
                        icon: "none",
                    })
                    if (code === 200) {
                        uni.showToast({
                            title: '上架成功'
                        })
                        this.list = []
                        this.barcode = ''
                    } else {
                        uni.showToast({
                            title: msg,
                            icon: "none",
                        })
                    }
                    return ;
                }
                if (this.container === '' || this.container === null) {
                    uni.showToast({
                        title: '请输入托盘码',
                        icon: "none",
                    })
                    return ;
                }
                const {
                    code,
                    data,
                    msg
                } = await request('/stock/operate', {
                    itemList: this.list,
                    locCode: this.locCode,
                    barcode: this.container,
                })
                if (code === 200) {
                    uni.showToast({
                        title: '上架成功'
                    })
                    this.list = []
                    this.locCode = ''
                    this.container = ''
                } else {
                    uni.showToast({
                        title: '请选择库位',
                        title: msg,
                        icon: "none",
                    })
                }
            },
pages/listing/matnrPalletising.vue
New file
@@ -0,0 +1,402 @@
<template>
    <view class="has-foot">
        <view>
        <form>
            <view class="cu-form-group margin-top">
                <view class="title">容器号</view>
                <input placeholder="请扫描容器号" v-model="container" focus></input>
                <text class='cuIcon-search text-blue' @click="getList"></text>
            </view>
            <view class="cu-form-group">
                <view class="title">物料编码</view>
                <input placeholder="请扫描物料编码" v-model="matnrCode"></input>
                <text class='cuIcon-search text-blue' @click="search"></text>
            </view>
            <view class="cu-form-group">
                <view class="title">ASN单号</view>
                <input placeholder="请输入ASN单号" v-model="asnCode"></input>
            </view>
        </form>
        <view class="flex solid-bottom padding-sm justify-between">
            <view class="text-blue">物料总类:{{list.length}}</view>
            <view class="text-blue">组盘总数:{{allCount}}</view>
        </view>
        </view>
        <view class="padding-lr margin-top-sm">
            <block v-for="(item, index) in list" :key="index">
                <view class="cu-list det menu sm-border margin-bottom-sm " :class="[item.trackCode===barcode&&'act']"
                    :ref="item.trackCode+'ref'">
                    <view class="cu-bar bg-white solid-bottom ">
                        <view class="action">
                            <view class="index">
                                {{index+1}}
                            </view>
                            <view class="text-blue">
                                编码:
                                {{`${item.matnrCode}`}}
                            </view>
                        </view>
                        <view class="action" v-if="!isconfirm">
                            <text @click="remove(index)" class="cuIcon-close text-red" style="font-size: 24px;"></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">物料编码:</text>
                            <text class="text-grey ">{{item.maktx}}</text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">ASN:</text>
                        </view>
                        <view class="action">
                            <text class="text-grey ">{{item.asnCode}}</text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">供应商批次:</text>
                        </view>
                        <view class="action">
                            <text class="text-grey ">{{item.splrBatch}}</text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">质检结果: <text class="text-grey ">{{item.inspect}}</text></text>
                        </view>
                    </view>
                    <!-- <view class="cu-item">
                        <view class="content">
                            <text class="text-black">平台行号: <text class="text-grey ">{{item.platformId}}</text></text>
                        </view>
                        <view class="content">
                            <text class="text-black">质检结果: <text class="text-grey ">{{item.inspect}}</text></text>
                        </view>
                    </view> -->
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">库存单位: <text class="text-grey ">{{item.stockUnit}}</text></text>
                        </view>
                        <view class="content">
                            <text class="text-black">收货数量: <text class="text-grey ">{{item.anfme}}</text></text>
                        </view>
                        <view class="content">
                            <text class="text-black">已上架数量: <text
                                    class="text-grey ">{{item.workQty + item.qty}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">可组盘数量: <text
                                    class="text-grey ">{{item.anfme - item.workQty - item.qty}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <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%;" :min="0" :max="max" :decimal="2" :step="0.01" v-model="item.receiptQty"
                                    ></uni-number-box>
                            </view>
                        </view>
                    </view>
                </view>
            </block>
        </view>
        <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" :disabled="repeatClick" @click="confirm">组盘</button>
        </view>
    </view>
</template>
<script>
    import {
        request
    } from '../../common/request.js'
    import {
        mapState,
        mapMutations,
        mapActions,
        mapGetters
    } from 'vuex';
    export default {
        data() {
            return {
                barcode: '',
                container: '',
                megreQty: '',
                list: [],
                range: [],
                asnCode: '',
                repeatClick: false,
                isconfirm: false,
                matnrCode:'',
                max: 99999999,
            }
        },
        computed: {
            ...mapState('user', ['dynamicFields']),
            allCount() {
                return this.list.reduce((acc, row) => +row.anfme + acc, 0) || 0
            }
        },
        mounted() {},
        methods: {
            async search() {
                const find = this.list.find(el => el.trackCode === this.barcode);
                find ? this.scrollTo() : this.getDet();
            },
            getDet() {
                let that = this;
                uni.navigateTo({
                    url: "../listing/itemSelect",
                    success: function(res) {
                        // 通过eventChannel向被打开页面传送数据   向另外一个页面传递值的
                        res.eventChannel.emit('data', {
                            matnrCode: that.matnrCode,
                            asnCode: that.asnCode
                        })
                    },
                    events: {
                        // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据  另外一个页面传过来的
                        backData: function(data) {
                            that.showBackData(data.data)
                        },
                    },
                });
            },
            // async getDet() {
            //     let that = this;
            //     const {
            //         code,
            //         data,
            //         msg
            //     } = await request('/asnOrderItem/trackCode', {
            //         matnrCode: that.matnrCode,
            //         asnCode: that.asnCode
            //     }, "post")
            //     if (code === 200) {
            //         data.map(item => {
            //             item.receiptQty = 0;
            //             item.selected = false;
            //         })
            //         // for (var i = 0; i < data.length; i++) {
            //         //     data[i].receiptQty =1;
            //         //     data[i].selected = false;
            //         // }
            //         if(data !== [] || data !== null){
            //         uni.navigateTo({
            //                 url: "../listing/itemSelect",
            //                 success: function(res) {
            //                     // 通过eventChannel向被打开页面传送数据   向另外一个页面传递值的
            //                     res.eventChannel.emit('data', {
            //                         item: data
            //                     })
            //                 },
            //                 events: {
            //                     // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据  另外一个页面传过来的
            //                     backData: function(data) {
            //                         that.showBackData(data.data)
            //                     },
            //                 },
            //             });
            //         }
            //         // this.list = data
            //     } else {
            //         uni.showToast({
            //             title: msg,
            //             icon: "none",
            //             position: 'top'
            //         })
            //     }
            // },
            async getList() {
                if(this.container === '' || this.container === null){
                    uni.showToast({
                        title: "容器码为空",
                        icon: "none",
                        position: 'top'
                    })
                    return ;
                }
                const {
                    code,
                    data,
                    msg
                } = await request('/asnOrderItem/container', {
                    barcode: this.container
                })
                if (code === 200) {
                    uni.showToast({
                        title: msg,
                        icon: "success",
                        position: 'top'
                    })
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                        position: 'top'
                    })
                }
            },
            showBackData(data){
                let status ;
                data.map(item => {
                    this.list.push(item)
                })
                let oldLength = this.list.length
                this.list = this.list.filter((item, index, self) =>
                    self.findIndex(i => (
                        i.id === item.id // 根据id去重
                    )) === index && item.isptResult === self[0].isptResult
                );
                let newLength = this.list.length
                if(oldLength > newLength){
                    this.showMsg("新明细被过滤,请检查状态")
                }
            },
            showMsg(msg){
                setTimeout(function() {
                 uni.showToast({
                     icon: "none",
                     position: 'top',
                     title: msg,
                     duration:2000,
                 })
                }, 200);
            },
            scrollTo() {
                const ref = this.$refs[`${this.barcode}ref`][0];
                uni.pageScrollTo({
                    scrollTop: ref.$el.offsetTop,
                    duration: 300
                })
            },
            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
            },
            async confirm() {
                if(this.container === '' || this.container === null){
                    uni.showToast({
                        title: "容器码为空",
                        icon: "none",
                        position: 'top'
                    })
                    return ;
                }
                if(this.list.length ===0 || this.list === null){
                    uni.showToast({
                        title: "未添加明细",
                        icon: "none",
                        position: 'top'
                    })
                    return ;
                }
                this.repeatClick = true
                const newArr = this.list.map(item => {
                    return {
                        ...item,
                        anfme: item.anfme === null ? 0 : +item.anfme,
                    };
                });
                const {
                    code,
                    data,
                    msg
                } = await request('/waitPakin/merge', {
                    items: newArr,
                    barcode: this.container,
                })
                if (code === 200) {
                    uni.showToast({
                        title: '组盘成功'
                    })
                    this.list = []
                    this.barcode = ''
                    this.container = ''
                    this.isconfirm = false
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                        position: 'top'
                    })
                }
                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;
    }
    .act {
        border: 1px solid #e54d42;
    }
    .item {
        position: relative;
        display: flex;
        min-height: 80upx;
        align-items: center;
    }
</style>
pages/listing/unPakin.vue
New file
@@ -0,0 +1,286 @@
<template>
    <view class="has-foot">
        <view>
            <form>
                <view class="cu-form-group ">
                    <view class="title">容器号</view>
                    <input placeholder="请扫描容器号" v-model="container" focus></input>
                    <text class='cuIcon-search text-blue' @click="getList"></text>
                </view>
                <view class="cu-form-group">
                    <view class="title">编码</view>
                    <input placeholder="请扫描组托档编码" v-model="pkCode"></input>
                    <text class='cuIcon-search text-blue' @click="getList"></text>
                </view>
            </form>
            <view class="flex solid-bottom padding-sm justify-between">
                <view class="text-blue">物料总类:{{list.length}}</view>
                <view class="text-blue">组盘总数:{{allCount}}</view>
            </view>
        </view>
        <view class="padding-lr margin-top-sm">
            <block v-for="(item, index) in list" :key="index">
                <view class="cu-list det menu sm-border margin-bottom-sm " :class="[item.trackCode===barcode&&'act']"
                    :ref="item.trackCode+'ref'">
                    <view class="cu-bar bg-white solid-bottom ">
                        <view class="action">
                            <view class="index">
                                {{index+1}}
                            </view>
                            <view class="text-blue">
                                编码:
                                {{`${item.matnrCode}`}}
                            </view>
                        </view>
                        <view class="action" v-if="!isconfirm">
                            <text @click="remove(index)" class="cuIcon-close text-red" style="font-size: 24px;"></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">物料编码:</text>
                            <text class="text-grey ">{{item.maktx}}</text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">ASN:</text>
                            <text class="text-grey ">{{item.asnCode}}</text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">批次:</text>
                            <text class="text-grey ">{{item.batch}}</text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">质检状态:</text>
                            <text class="text-grey ">{{item.isptResult$}}</text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">库存单位: <text class="text-grey ">{{item.stockUnit}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">已组托数: <text class="text-grey ">{{item.anfme}}</text></text>
                        </view>
                        <view class="content">
                            <text class="text-black">已执行数量: <text class="text-grey ">{{item.workQty}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">可解绑数量: <text
                                    class="text-grey ">{{item.anfme - item.workQty}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <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="item.receiptQty"
                                    :step='1'></uni-number-box>
                            </view>
                        </view>
                    </view>
                </view>
            </block>
        </view>
        <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" :disabled="repeatClick" @click="confirm">解绑</button>
        </view>
    </view>
</template>
<script>
    import {
        request
    } from '../../common/request.js'
    import {
        mapState,
        mapMutations,
        mapActions,
        mapGetters
    } from 'vuex';
    export default {
        data() {
            return {
                barcode: '',
                container: '',
                megreQty: '',
                list: [],
                range: [],
                asnCode: '',
                repeatClick: false,
                isconfirm: false,
                matnrCode: '',
                max: 99999999,
                pkCode: '',
            }
        },
        computed: {
            ...mapState('user', ['dynamicFields']),
            allCount() {
                return this.list.reduce((acc, row) => +row.anfme + acc, 0) || 0
            }
        },
        mounted() {},
        methods: {
            async search() {
                const find = this.list.find(el => el.trackCode === this.barcode);
                find ? this.scrollTo() : this.getDet();
            },
            async getDet() {
                const {
                    code,
                    data,
                    msg
                } = await request('/asnOrderItem/trackCode', {
                    matnrCode: this.matnrCode,
                    asnCode: this.asnCode
                }, "post")
                if (code === 200) {
                    for (var i = 0; i < data.length; i++) {
                        data[i].receiptQty = 0;
                        data[i].selected = false;
                    }
                    this.list = data
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                        position: 'top'
                    })
                }
            },
            async getList() {
                const {
                    code,
                    data,
                    msg
                } = await request('/asnOrderItem/container', {
                    barcode: this.container,
                    code: this.pkCode,
                    type: 'unbind'
                })
                if (code === 200) {
                    for (var i = 0; i < data.length; i++) {
                        data[i].receiptQty = 0;
                    }
                    this.list = data
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                        position: 'top'
                    })
                }
            },
            scrollTo() {
                const ref = this.$refs[`${this.barcode}ref`][0];
                uni.pageScrollTo({
                    scrollTop: ref.$el.offsetTop,
                    duration: 300
                })
            },
            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
            },
            async confirm() {
                this.repeatClick = true
                const newArr = this.list.map(item => {
                    return {
                        ...item,
                        extendFields: {},
                        anfme: item.anfme === null ? 0 : +item.anfme,
                    };
                });
                const {
                    code,
                    data,
                    msg
                } = await request('/waitPakin/unbind', {
                    items: newArr,
                    barcode: this.container,
                })
                if (code === 200) {
                    uni.showToast({
                        title: '解绑成功'
                    })
                    this.list = []
                    this.barcode = ''
                    this.container = ''
                    this.isconfirm = false
                } else {
                    uni.showToast({
                        title: msg,
                        icon: "none",
                        position: 'top'
                    })
                }
                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;
    }
    .act {
        border: 1px solid #e54d42;
    }
    .item {
        position: relative;
        display: flex;
        min-height: 80upx;
        align-items: center;
    }
</style>
pages/login/index.vue
New file
@@ -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>
pages/login/login.vue
@@ -1,11 +1,11 @@
<template>
    <view>
        <!-- 设置 -->
        <!-- <view class="settings">
        <view class="settings">
            <view class="settings-btn">
                <uni-icons type="gear" size="30" color="#707070" @click="settings"></uni-icons>
            </view>
        </view> -->
        </view>
        <!-- logo -->
        <view class="logo">
            <view class="logo-box">
@@ -13,14 +13,27 @@
            </view>
        </view>
        <view class="content">
            <!-- 语言选择下拉菜单 -->
            <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 class="box shadow-warp">
                <view class="box-icon">
                    <uni-icons type="person" size="20" color="#707070"></uni-icons>
                </view>
                <view class="box-text">账号:</view>
                <view class="box-text">{{$t('login.user')}}:</view>
                <view class="box-input">
                    <input type="text" placeholder="请输入账号" v-model="user.userName"
                    <input type="text" :placeholder="$t('login.inputUser')" v-model="user.userName"
                        placeholder-style="font-size:14px;color:#ccc;">
                </view>
                <view class="box-show"></view>
@@ -30,9 +43,9 @@
                <view class="box-icon">
                    <uni-icons type="locked" size="20" color="#707070"></uni-icons>
                </view>
                <view class="box-text">密码:</view>
                <view class="box-text">{{$t('login.pwd')}}:</view>
                <view class="box-input">
                    <input :password="!showPassword" placeholder="请输入密码" v-model="user.password"
                    <input :password="!showPassword" :placeholder="$t('login.inputPwd')" v-model="user.password"
                        placeholder-style="font-size:14px;color:#ccc;">
                </view>
                <view class="box-show">
@@ -45,7 +58,7 @@
            <!-- 记住密码 -->
            <view class="check">
                <view class="check-left">
                    <view>记住密码</view>
                    <view>{{$t('login.remPwd')}}</view>
                </view>
                <view class="check-right">
                    <switch :checked='remberPassword' color="#FFCC33" style="zoom:.5" @change="remberChange" />
@@ -55,9 +68,9 @@
        <!-- 登录按钮 -->
        <view class="submit">
            <view class="" style="width: 400rpx;">
                <button type="primary" @click="onLogin()" :loading="load.loading">{{load.btnText}}</button>
                <button type="primary" @click="onLogin()" :loading="loading">{{btnText}}</button>
            </view>
        </view>
        <!-- 设置弹窗区域 -->
@@ -77,7 +90,7 @@
                    <view class="popup-item">
                        <view class="popup-item-left">项目:</view>
                        <view class="popup-item-right"><input type="text" v-model="url.project"></view>
                    </view>
                    </view>
                    <view class="btn">
                        <view class="btn-left" @click="close">取消</view>
                        <view class="btn-right" @click="settingConfirm">确认</view>
@@ -110,7 +123,9 @@
    } from '../../common/request.js'
    export default {
        data() {
            return {
            return {
                systemLocale: '',
                applicationLocale: '',
                version: '',
                showPassword: false,
                value: '',
@@ -125,20 +140,55 @@
                    userName: '',
                    password: '',
                },
                load: {
                    loading: false,
                    btnText: '登录'
                },
                loading: false,
                msgType: 'success',
                filename: '',
                dialogContent: '',
                elements: [],
                colorList: ['cyan', 'blue', 'purple', 'mauve', 'pink', 'brown', 'red', 'orange', 'yellow', 'olive',
                    'olive', 'grey'
                ]
                ],
                showLanguageDropdown: false,
                loginButton: 'login.login'
            }
        },
        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')
            this.url = uni.getStorageSync('url')
            this.baseUrl = uni.getStorageSync('baseUrl')
@@ -155,11 +205,56 @@
                    project: ''
                }
            }
        },
        },
        onShow() {
            this.getVersion()
        },
        methods: {
            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;
                }
            },
            // 显示/隐藏密码
            changePassword() {
                this.showPassword = !this.showPassword;
@@ -169,7 +264,7 @@
            },
            // 设置窗口开启按钮
            settings() {
                this.$refs.inputDialog.open()
                this.$refs.inputDialog.open('')
            },
            // 设置窗口确认修改按钮
            dialogInputConfirm() {
@@ -197,10 +292,11 @@
                    password: this.user.password,
                })
                if (code === 200) {
                    this.load.loading = true;
                    this.load.btnText = '登录中';
                    uni.setStorageSync('token', data.accessToken);
                    if (this.remberPassword) {
                    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');
@@ -412,7 +508,8 @@
</script>
<style>
    @import url('../../static/css/wms.css/wms.css');
    /* 设置区域 */
    .settings {
        min-height: 100rpx;
@@ -465,8 +562,7 @@
        text-align: center;
    }
    .box-text {
        width: 100rpx;
    .box-text {
        text-align: center;
    }
@@ -511,22 +607,6 @@
        font-size: 12px;
        color: #909399;
    }
    /* ------ */
    .shadow-warp {
@@ -552,4 +632,104 @@
        left: auto;
        transform: rotate(3deg);
    }
</style>
    /* 语言选择下拉菜单 */
    .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;
        top: 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-top: 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;
    }
    /* 其他样式 */
    .check {
        width: 78%;
        display: flex;
        font-size: 12px;
        color: #606266;
        margin-top: 10rpx;
    }
    .check-right {
        margin-left: auto;
    }
    .submit {
        display: flex;
        justify-content: center;
        position: fixed;
        width: 100%;
        bottom: 100rpx;
    }
    .version {
        position: fixed;
        width: 100%;
        bottom: 0;
        text-align: center;
        font-size: 12px;
        color: #909399;
    }
    /* ------ */
    .shadow-warp {
        position: relative;
        box-shadow: 0 0 10upx rgba(0, 0, 0, 0.1);
    }
    .shadow-warp:before,
    .shadow-warp:after {
        position: absolute;
        content: "";
        top: 20upx;
        bottom: 30upx;
        left: 20upx;
        width: 50%;
        box-shadow: 0 30upx 20upx rgba(0, 0, 0, 0.2);
        transform: rotate(-3deg);
        z-index: -1;
    }
    .shadow-warp:after {
        right: 20upx;
        left: auto;
        transform: rotate(3deg);
    }
</style>
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="请扫描QR码" 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: "拣货明细为空",
                        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 = ''
            },
pages/outbound/wavePick.vue
New file
@@ -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>
pages/outbound/wavePickItem.vue
New file
@@ -0,0 +1,277 @@
<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.wkOrderItems">
                    <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">本次拣货数量:<text class="text-black ">{{item.wkOrderItems.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">拣货完成</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: "拣货明细为空",
                        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>
pages/rece/other.vue
@@ -3,14 +3,15 @@
        <form>
            <view class="cu-form-group margin-top" v-show="!isconfirm">
                <view class="title">ASN单号</view>
                <input placeholder="请扫描ASN单号" v-model="asncode" @input="search" focus></input>
                <input placeholder="请扫描ASN单号" v-model="asncode" focus></input>
                <text class='cuIcon-close text-gray margin-right-xs' v-show="asncode!==''" @click="clearCode"></text>
                <!-- <text class='cuIcon-search text-blue' @click="search"></text> -->
            </view>
            <view class="cu-form-group" v-show="!isconfirm">
                <view class="title">物料标签</view>
                <input placeholder="请扫描物料标签" v-model="barcode"></input>
                <text class='cuIcon-search text-blue' @click="scrollTo"></text>
                <view class="title">物料编码</view>
                <input placeholder="请扫描物料编码" v-model="barcode"></input>
                <text class='cuIcon-close text-gray margin-right-xs' v-show="barcode!==''" @click="clearBarcode"></text>
                <text class='cuIcon-search text-blue' @click="search"></text>
            </view>
        </form>
@@ -26,7 +27,8 @@
                                {{index+1}}
                            </view>
                            <view class="text-blue">
                                {{`${item.maktx}`}}
                                编码:
                                {{`${item.matnr}`}}
                            </view>
                        </view>
                        <view class="action" v-if="!isconfirm">
@@ -37,9 +39,16 @@
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">ASN:</text>
                            <text class="text-grey ">{{item.asnCode}}</text>
                        </view>
                        <view class="action">
                            <text class="text-grey ">{{item.asnCode}}</text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">物料名称:</text>
                            <text class="text-grey ">{{item.maktx}}</text>
                        </view>
                    </view>
@@ -52,17 +61,17 @@
                        </view>
                    </view> -->
                    <view class="cu-item">
                    <!-- <view class="cu-item">
                        <view class="content">
                            <text class="text-black">最大库存: <text class="text-grey ">{{item.maxQty}}</text></text>
                        </view>
                        <view class="content">
                            <text class="text-black">实时库存: <text class="text-grey ">{{item.stockQty}}</text></text>
                        </view>
                    </view>
                    </view> -->
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">平台行号: <text class="text-grey ">{{item.platformId}}</text></text>
                            <text class="text-black">行号: <text class="text-grey ">{{item.platItemId}}</text></text>
                        </view>
                        <view class="content">
                            <text class="text-black">质检结果: <text class="text-grey ">{{item.inspect}}</text></text>
@@ -72,9 +81,9 @@
                        <view class="content">
                            <text class="text-black">采购单位:<text class="text-grey ">{{item.purUnit}}</text></text>
                        </view>
                        <view class="content">
            <!--             <view class="content">
                            <text class="text-black">库存单位: <text class="text-grey ">{{item.stockUnit}}</text></text>
                        </view>
                        </view> -->
                    </view>
                    <view class="cu-item">
                        <view class="content">
@@ -90,7 +99,8 @@
                            <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%;" v-model="item.receiptQty" :step='1'></uni-number-box>
                                <uni-number-box style="width: 70%;" :max="max" v-model="item.receiptQty"
                                    :step='1'></uni-number-box>
                            </view>
                        </view>
                        <view class="content" v-else>
@@ -98,14 +108,9 @@
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content" v-if="!isconfirm">
                            <view class="cu-form-group padding-lr-0">
                                <view class="title text-blue">供应商批次:</view>
                                <input placeholder="请输入供应商批次" v-model="item.splrBatch"></input>
                            </view>
                        </view>
                        <view class="content" v-else>
                            <text class="text-black">供应商批次:<text class="text-grey ">{{item.splrBatch}}</text></text>
                        <view class="content">
                            <text class="text-black">批次:<text class="text-grey ">{{item.splrBatch}}</text></text>
                        </view>
                    </view>
@@ -125,18 +130,18 @@
                            <text class="text-black">生产日期:<text class="text-grey ">{{item.prodTime}}</text></text>
                        </view>
                    </view>
                    <view class="cu-item grid  col-1" v-if="!isconfirm">
                    <!-- <view class="cu-item grid  col-1" v-if="!isconfirm">
                        <view v-for="el in dynamicFields" :key="el.id">
                            <view class="cu-form-group padding-lr-0">
                                <view class="title text-blue">{{el.fieldsAlise}}:</view>
                                <input :placeholder='`请输入${el.fieldsAlise}`' v-model="item[el.fields]"></input>
                            </view>
                        </view>
                    </view>
                    <view class="cu-item grid  col-2" v-if="isconfirm">
                    </view> -->
                    <view class="cu-item grid  col-2" v-if="item.extendFields">
                        <view class="item" v-for="el in dynamicFields" :key="el.id">
                            <text class="text-black">{{el.fieldsAlise}}:
                                <text class="text-grey ">{{item[el.fields]}}</text></text>
                                <text class="text-grey ">{{item.extendFields[el.fields]}}</text></text>
                        </view>
                    </view>
                </view>
@@ -149,8 +154,10 @@
        <view class="cu-form-group margin-bottom">
            <view class="title">收货区</view>
            <uni-data-select v-model="whAreaId" :localdata="range" placement="top"
                @change="selChange"></uni-data-select>
            <view style="width: 80%;">
                <uni-data-select style="min-width: 90%; max-width: 90%;" v-model="whAreaId" :localdata="range"
                    placement="top" @change="selChange"></uni-data-select>
            </view>
        </view>
        <view class="cu-bar btn-group foot" v-show="!isconfirm">
@@ -159,8 +166,8 @@
        </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(false)">收货</button>
            <button class="cu-btn text-blue line-blue shadow" @click="prev">上一步</button>
            <button class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="confirm(false)">收货</button>
        </view>
    </view>
@@ -184,11 +191,16 @@
                whAreaId: '',
                list: [],
                range: [],
                isconfirm: false
                repeatClick: false,
                isconfirm: false,
                max: 99999999,
            }
        },
        computed: {
            ...mapState('user', ['dynamicFields']),
            ...mapState('user', {
                dynFields: state => state.dynamicFields
            }),
            allCount() {
                return this.list.reduce((acc, row) => +row.receiptQty + acc, 0)
            }
@@ -205,10 +217,11 @@
                    data,
                    msg
                } = await request('/orders/other', {
                    asnCode: this.asncode
                    asnCode: this.asncode,
                    matnrCode: this.barcode
                })
                if (code === 200) {
                    this.list = [...data]
                    this.list = data
                } else {
                    uni.showToast({
                        title: msg,
@@ -221,12 +234,16 @@
            clearCode() {
                this.asncode = ''
            },
            clearBarcode() {
                this.barcode = ''
            },
            scrollTo() {
                const ref = this.$refs[`${this.barcode}ref`][0];
                uni.pageScrollTo({
                    scrollTop: ref.$el.offsetTop,
                    duration: 300
                })
                // const ref = this.$refs[`${this.barcode}ref`][0];
                // uni.pageScrollTo({
                //     scrollTop: ref.$el.offsetTop,
                //     duration: 300
                // })
            },
            remove(index) {
                this.list.splice(index, 1);
@@ -234,6 +251,9 @@
            clear() {
                this.list = []
                this.barcode = ''
                this.asncode = ''
                this.whAreaId = ''
                this.range = []
            },
            next() {
                if (this.list.length) {
@@ -248,12 +268,11 @@
            prev() {
                this.isconfirm = false
            },
            selChange(val) {
                console.log('-------->')
                console.log(val)
            selChange(val) {
                uni.setStorageSync('whAreaId', val)
            },
            async complete(id) {
                this.repeatClick = true
                const {
                    code,
                    data,
@@ -270,6 +289,7 @@
                        icon: "none",
                    })
                }
                this.repeatClick = false
            },
            async confirm(isCom) {
                if (this.whAreaId === '') {
@@ -278,13 +298,18 @@
                        title: '请选择收货区'
                    })
                } else {
                    console.log(this.dynFields)
                    const newArr = this.list.map(item => {
                        return {
                            ...item,
                            receiptQty: item.receiptQty === null ? 0 : +item.receiptQty
                            receiptQty: item.receiptQty === null ? 0 : +item.receiptQty,
                            // extendFields: this.dynFields.filter(el => el.unique == 1).map(exf => {
                            //     return {
                            //         [`${exf.fields}`]: item[exf.fields]
                            //     }
                            // }).filter(field => Object.values(field)[0] != undefined)
                        };
                    }).filter(el => el.receiptQty !== 0);
                    const {
                        code,
@@ -311,7 +336,7 @@
                    }
                }
            },
            async getRece() {
            async getRece() {
                const {
                    code,
                    data,
pages/rece/standard.vue
@@ -80,7 +80,7 @@
                    <view class="content" v-if="!isconfirm">
                        <view class="cu-form-group padding-lr-0">
                            <view class="title text-blue">收货数量:</view>
                            <uni-number-box style="width: 70%;" v-model="item.receiptQty" :step='1'></uni-number-box>
                            <uni-number-box style="width: 70%;" :max="max" v-model="item.receiptQty" :step='1'></uni-number-box>
                        </view>
                    </view>
                    <view class="content" v-else>
@@ -156,7 +156,7 @@
        <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>
            <button class="cu-btn bg-blue shadow-blur" :disabled="repeatClick" @click="confirm">提交收货</button>
        </view>
    </view>
@@ -179,7 +179,9 @@
                whAreaId: '',
                list: [],
                range: [],
                isconfirm: false
                isconfirm: false,
                repeatClick: false,
                max: 99999999
            }
        },
        computed: {
@@ -264,6 +266,7 @@
                        title: '请选择收货区'
                    })
                } else {
                    this.repeatClick = true
                    const {
                        code,
                        data,
@@ -286,7 +289,7 @@
                            position: 'top'
                        })
                    }
                    this.repeatClick = false
                }
            },
            async getRece() {
static/family/HarmonyOS_Sans_SC_Black.ttf
Binary files differ
static/family/HarmonyOS_Sans_SC_Bold.ttf
Binary files differ
static/family/HarmonyOS_Sans_SC_Light.ttf
Binary files differ
static/family/HarmonyOS_Sans_SC_Regular.ttf
Binary files differ
static/img/login_backg.png
static/img/login_eye.png
static/img/login_noteye.png
static/img/login_text.png
static/img/login_top.png