#
zhou zhou
3 天以前 eb9838ebbf1017bbe2fbe981dfc4be2bf26528e7
#
3个文件已删除
8个文件已添加
12个文件已修改
32807 ■■■■ 已修改文件
.agents/skills/wms-dev-standards/SKILL.md 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
App.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
locale/en.json 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
locale/ja.json 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
locale/zh-Hans.json 313 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
locale/zh-Hant.json 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages.json 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/InManagement/ContainerBinding/Container_Binding.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/InManagement/OrderContainerBinding/Main/Order_Container_Binding.vue 843 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/InManagement/OrderContainerBinding/Main/api.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/InManagement/OrderContainerBinding/Main/orderDetlList.vue 848 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/InManagement/OrderContainerBinding/Main/orderList.vue 404 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/InManagement/OrderContainerBinding/NoMain/Order_Container_Binding.vue 843 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/InManagement/OrderContainerBinding/NoMain/api.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/InManagement/OrderContainerBinding/NoMain/orderDetlList.vue 816 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/InManagement/Order_Pallet_Building.nvue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/home/home.vue 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/login/index.nvue 559 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/settings/settings.vue 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
unpackage/dist/dev/app-plus/app-config-service.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
unpackage/dist/dev/app-plus/app-service.js 7091 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
unpackage/dist/dev/app-plus/app-view.js 5668 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
unpackage/dist/dev/app-plus/pages/InManagement/Order_Pallet_Building.js 14733 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.agents/skills/wms-dev-standards/SKILL.md
@@ -60,3 +60,10 @@
  </view>
</template>
```
## Internationalization (i18n)
When refactoring or modifying pages, always pay attention to the data in the internationalization files and the page internationalization.
1. **Use i18n keys:** Do not hardcode strings in the template or script. Use the `$t()` method (or appropriate i18n function) to reference translations.
2. **Update locale files:** Ensure all new text is added to the relevant language files (e.g., `locale/zh-Hans.json`) and existing text modifications are reflected in the locale files.
3. **Check page configuration:** Also verify if the page title or other configurations in `pages.json` need i18n support.
App.vue
@@ -1,49 +1,64 @@
<script>
    export default {
        onLaunch: function() {
            console.log('App Launch')
        },
        onShow: function() {
            console.log('App Show')
        },
        onHide: function() {
            console.log('App Hide')
export default {
    onLaunch: function () {
        console.log('App Launch')
        // 初始化默认应用设置
        let appSettings = uni.getStorageSync('appSettings')
        if (!appSettings) {
            appSettings = {
                orderReviewRequired: false,
                orderPakinRequiresMainList: false,
                orderDetlMultiSelect: false,
                orderCombNeedSplit: true,
                orderCombSeparator: ';',
                orderCombArrayIndex: 0,
                orderCombStartPos: 3
            }
            uni.setStorageSync('appSettings', appSettings)
        }
    },
    onShow: function () {
        console.log('App Show')
    },
    onHide: function () {
        console.log('App Hide')
    }
}
</script>
<style lang="scss">
    /*每个页面公共css */
    @import "@/uni_modules/uview-ui/index.scss";
    @import "colorui/main.css";
    @import "colorui/icon.css";
/*每个页面公共css */
@import '@/uni_modules/uview-ui/index.scss';
@import 'colorui/main.css';
@import 'colorui/icon.css';
    /* 引入字体文件 */
    @font-face {
        font-family: a4;
        src: url('@/static/family/HarmonyOS_Sans_SC_Regular.ttf') format('truetype');
        font-weight: normal;
        font-style: normal;
    }
/* 引入字体文件 */
@font-face {
    font-family: a4;
    src: url('@/static/family/HarmonyOS_Sans_SC_Regular.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
}
    @font-face {
        font-family: a3;
        src: url('@/static/family/HarmonyOS_Sans_SC_Light.ttf') format('truetype');
        font-weight: 300;
        font-style: normal;
    }
@font-face {
    font-family: a3;
    src: url('@/static/family/HarmonyOS_Sans_SC_Light.ttf') format('truetype');
    font-weight: 300;
    font-style: normal;
}
    @font-face {
        font-family: a1;
        src: url('@/static/family/HarmonyOS_Sans_SC_Bold.ttf') format('truetype');
        font-weight: bold;
        font-style: normal;
    }
@font-face {
    font-family: a1;
    src: url('@/static/family/HarmonyOS_Sans_SC_Bold.ttf') format('truetype');
    font-weight: bold;
    font-style: normal;
}
    @font-face {
        font-family: a2;
        src: url('@/static/family/HarmonyOS_Sans_SC_Black.ttf') format('truetype');
        font-weight: 900;
        font-style: normal;
    }
</style>
@font-face {
    font-family: a2;
    src: url('@/static/family/HarmonyOS_Sans_SC_Black.ttf') format('truetype');
    font-weight: 900;
    font-style: normal;
}
</style>
locale/en.json
@@ -63,11 +63,31 @@
    "saved": "Settings Saved",
    "authTitle": "Authentication",
    "inputAuthPwd": "Enter Admin Password",
    "authError": "Incorrect Password"
    "authError": "Incorrect Password",
    "orderReviewRequired": "Order Container Binding Review Required",
    "orderPakinRequiresMainList": "Order Inbound Requires Main List",
    "orderDetlMultiSelect": "Order Details Page Default Multi-Select",
    "orderCombNeedSplit": "Order Container Binding Split Needed",
    "orderCombSeparator": "Order Container Binding Split Separator",
    "orderCombArrayIndex": "Order Container Binding Split Array Index",
    "orderCombStartPos": "Order Container Binding Split Start",
    "inputPlaceholder": "Please input"
  },
  "common": {
    "confirm": "Confirm",
    "cancel": "Cancel"
    "cancel": "Cancel",
    "unknown": "Unknown",
    "scanInput": "Scan / Input",
    "scanInputMat": "Scan / Input Material",
    "scanInputPallet": "Scan / Input Pallet",
    "scanInputCarton": "Scan / Input Carton",
    "loadMore": "Pull up to load more",
    "loading": "Loading",
    "noMore": "No more",
    "search": "Search",
    "multiSelect": "Multi-select",
    "selectAll": "Select All",
    "selected": "Selected"
  },
  "category": {
    "inbound": "Inbound Management",
@@ -96,10 +116,49 @@
    "confirmRemove": "Confirm Remove",
    "removeMsg": "Remove this material?",
    "confirmReset": "Confirm Reset",
    "resetMsg": "Clear all materials?",
    "combMsg": "Confirm to palletize and inbound?"
    "resetMsg": "Are you sure to clear all items?",
    "combMsg": "Confirm to container binding?",
    "orderComb": "Order Binding",
    "orderCombDetl": "Order Details",
    "order_container_binding_title": "Order Binding",
    "orderNo": "Order No.",
    "orderType": "Order Type",
    "warehouse": "Warehouse",
    "viewDetail": "View Detail",
    "emptyOrder": "No Order Data",
    "remain": "Remaining",
    "specs": "Specification",
    "batch": "Batch",
    "orderQty": "Order Qty",
    "completedQty": "Completed",
    "clickToComb": "Click to Bind",
    "completed": "Completed",
    "emptyDetl": "No Detail Data",
    "totalDetl": "Total Details",
    "pending": "Pending",
    "palletComb": "Pallet Binding",
    "palletNo": "Pallet No.",
    "cartonCode": "Carton Code",
    "cancel": "Cancel",
    "confirm": "Confirm",
    "binding": "Binding",
    "tips": "Tips",
    "confirmDeleteRecord": "Confirm to delete this record?",
    "scanOrder": "Scan / Input Order No.",
    "scanMatReview": "Scan to Review",
    "reviewed": "Reviewed",
    "unreviewed": "Unreviewed",
    "emptyMat": "No Details",
    "noReviewReq": "No review required"
  },
  "toast": {
    "reviewSuccess": "Review Success",
    "reviewFail": "Review Failed or Material Mismatch",
    "inputOrderNo": "Please input order no.",
    "emptyMat": "Details cannot be empty",
    "detailCompleted": "This detail is completed",
    "fetchDetailFail": "Failed to fetch details",
    "searchFail": "Search request failed",
    "palletError": "Pallet code error, please try again",
    "queryFail": "Query failed",
    "modifySuccess": "Modification successful",
locale/ja.json
@@ -39,11 +39,45 @@
    "add": "追加",
    "add-success": "成功を追加"
  },
  "common": {
    "confirm": "確認",
    "cancel": "取消",
    "unknown": "未知",
    "scanInput": "扫码 / 输入",
    "scanInputMat": "スキャン / 資材入力",
    "scanInputPallet": "スキャン / パレット入力",
    "scanInputCarton": "スキャン / 箱コード入力",
    "loadMore": "プルアップしてさらに読み込む",
    "loading": "読み込み中",
    "noMore": "これ以上ありません",
    "search": "検索",
    "multiSelect": "複数選択",
    "selectAll": "すべて選択",
    "selected": "選択済み"
  },
  "category": {
    "inbound": "入库管理",
    "agv": "AGV管理",
    "stock": "库存管理",
    "other": "其他操作"
  },
  "settings": {
    "title": "設定",
    "ip": "IP Address",
    "port": "Port",
    "project": "Project Name",
    "saved": "Settings Saved",
    "authTitle": "Authentication",
    "inputAuthPwd": "Enter Admin Password",
    "authError": "Incorrect Password",
    "orderReviewRequired": "Order Container Binding Review Required",
    "orderPakinRequiresMainList": "Order Inbound Requires Main List",
    "orderDetlMultiSelect": "Order Details Page Default Multi-Select",
    "orderCombNeedSplit": "オーダー結合 分割が必要",
    "orderCombSeparator": "オーダー結合 分割区切り文字",
    "orderCombArrayIndex": "オーダー結合 分割配列インデックス",
    "orderCombStartPos": "オーダー結合 分割開始位置",
    "inputPlaceholder": "入力してください"
  },
  "container": {
    "title": "组托",
@@ -67,9 +101,48 @@
    "removeMsg": "是否移除该商品?",
    "confirmReset": "确认重置",
    "resetMsg": "是否清空所有商品?",
    "combMsg": "确认将商品组托入库?"
    "combMsg": "确认将商品组托入库?",
    "orderComb": "オーダー結合",
    "orderCombDetl": "オーダー詳細",
    "order_container_binding_title": "オーダー結合",
    "orderNo": "伝票番号",
    "orderType": "伝票タイプ",
    "warehouse": "倉庫",
    "viewDetail": "詳細を見る",
    "emptyOrder": "現在オーダーデータはありません",
    "remain": "残り",
    "specs": "仕様",
    "batch": "バッチ",
    "orderQty": "オーダー数量",
    "completedQty": "完了済",
    "clickToComb": "結合して入庫する",
    "completed": "完了済",
    "emptyDetl": "現在詳細データはありません",
    "totalDetl": "詳細合計",
    "pending": "処理待ち",
    "palletComb": "商品結合",
    "palletNo": "パレット番号",
    "cartonCode": "箱コード",
    "cancel": "キャンセル",
    "confirm": "確認",
    "binding": "結合バインディング",
    "tips": "ヒント",
    "confirmDeleteRecord": "この記録を削除してもよろしいですか?",
    "scanOrder": "スキャン / 伝票番号入力",
    "scanMatReview": "スキャン照合",
    "reviewed": "照合済",
    "unreviewed": "未照合",
    "emptyMat": "詳細なし",
    "noReviewReq": "照合不要"
  },
  "toast": {
    "reviewSuccess": "照合成功",
    "reviewFail": "照合失敗または資材不一致",
    "inputOrderNo": "伝票番号を入力してください",
    "emptyMat": "詳細を空にすることはできません",
    "detailCompleted": "この詳細は完了しました",
    "fetchDetailFail": "詳細の取得に失敗しました",
    "searchFail": "検索リクエストに失敗しました",
    "palletError": "托盘码有误请重试",
    "queryFail": "查询失败",
    "modifySuccess": "修改成功",
locale/zh-Hans.json
@@ -1,129 +1,188 @@
{
  "app": {
    "name": "中扬 WMS"
  },
  "locale": {
    "auto": "系统",
    "en": "English",
    "zh-hans": "简体中文",
    "zh-hant": "繁体中文",
    "ja": "日语"
  },
  "index": {
    "title": "Hello i18n",
    "home": "主页",
    "GR": "单据收货",
    "palletizing": "单据组托",
    "palletBuilding": "组托解绑",
    "inspectionRequest": "报检",
    "qualityInspection": "质检",
    "defectiveMarking": "不良标记",
    "manualPutaway": "人工上架",
    "stationBinding": "站点绑定",
    "inboundInitiation": "启动入库",
    "stationUnbinding": "站点解绑",
    "bindAndInbound": "绑定&入库",
    "quickPicking": "快速拣货",
    "wavePick": "波次拣货",
    "outLogin": "退出登录",
    "language-change-confirm": "确定切换?",
    "hello": "您好,欢迎登录WMS系统!",
    "intro": "让制造与物流更高效",
    "checkOrder": "盘点",
    "workplace": "Zoneyung 工作台",
    "welcomeBack": "欢迎回来",
    "systemName": "中扬立库 WMS 仓储管理系统",
    "pakin": "组托",
    "orderPakin": "订单入库",
    "agv_start": "AGV容器入库",
    "agv_back": "AGV容器回库",
    "stockQuery": "库存查询",
    "logOut": "退出登录",
    "copyright": "copyright © 2022 浙江中扬立库有限公司 all rights reserved.",
    "noAuth": "无权限或登录过期"
  },
  "page": {
    "login": "登录",
    "index": "首页"
  },
  "login": {
    "login": "登录",
    "loging": "登录中",
    "user": "账号",
    "pwd": "密码",
    "inputUser": "请输入账号",
    "inputPwd": "请输入密码",
    "remPwd": "记住密码"
  },
  "other": {
    "asnNo": "ASN单号"
  },
  "settings": {
    "title": "设置",
    "ip": "IP地址",
    "port": "端口",
    "project": "项目名",
    "saved": "设置已保存",
    "authTitle": "身份验证",
    "inputAuthPwd": "请输入管理员密码",
    "authError": "密码错误"
  },
  "common": {
    "confirm": "确认",
    "cancel": "取消"
  },
  "category": {
    "inbound": "入库管理",
    "agv": "AGV管理",
    "stock": "库存管理",
    "other": "其他操作"
  },
  "container": {
    "title": "组托",
    "palletCode": "托盘码",
    "matCode": "物料码",
    "scanPallet": "扫码 / 输入托盘码",
    "scanMat": "扫码 / 输入物料码",
    "matList": "商品列表",
    "matName": "品名",
    "matSpec": "规格",
    "matBatch": "批号",
    "matQty": "数量",
    "modify": "修改",
    "remove": "移除",
    "reset": "重置",
    "confirmComb": "确认组托",
    "emptyList": "暂无商品,请扫描物料码添加",
    "modifyInfo": "修改信息",
    "code": "编码",
    "confirmRemove": "确认移除",
    "removeMsg": "是否移除该商品?",
    "confirmReset": "确认重置",
    "resetMsg": "是否清空所有商品?",
    "combMsg": "确认将商品组托入库?"
  },
  "toast": {
    "palletError": "托盘码有误请重试",
    "queryFail": "查询失败",
    "modifySuccess": "修改成功",
    "removeSuccess": "移除成功",
    "scanPalletCode": "请扫描托盘条码",
    "qtyNotZero": "组托数量不能为0",
    "qtyNotZeroMat": "{0}组托数量不能为0",
    "combSuccess": "组托成功",
    "combFail": "组托失败",
    "resetComplete": "重置完成",
    "inputQty": "请输入数量"
  },
  "matSelected": {
    "title": "商品信息",
    "matDetail": "物料详情",
    "matCode": "商品编码",
    "matName": "商品名称",
    "spec": "规格",
    "batch": "批号",
    "inputBatch": "请输入批号",
    "qty": "数量",
    "confirmExtract": "确认提取"
  }
    "app": {
        "name": "中扬 WMS"
    },
    "locale": {
        "auto": "系统",
        "en": "English",
        "zh-hans": "简体中文",
        "zh-hant": "繁体中文",
        "ja": "日语"
    },
    "index": {
        "title": "Hello i18n",
        "home": "主页",
        "GR": "单据收货",
        "palletizing": "单据组托",
        "palletBuilding": "组托解绑",
        "inspectionRequest": "报检",
        "qualityInspection": "质检",
        "defectiveMarking": "不良标记",
        "manualPutaway": "人工上架",
        "stationBinding": "站点绑定",
        "inboundInitiation": "启动入库",
        "stationUnbinding": "站点解绑",
        "bindAndInbound": "绑定&入库",
        "quickPicking": "快速拣货",
        "wavePick": "波次拣货",
        "outLogin": "退出登录",
        "language-change-confirm": "确定切换?",
        "hello": "您好,欢迎登录WMS系统!",
        "intro": "让制造与物流更高效",
        "checkOrder": "盘点",
        "workplace": "Zoneyung 工作台",
        "welcomeBack": "欢迎回来",
        "systemName": "中扬立库 WMS 仓储管理系统",
        "pakin": "组托",
        "orderPakin": "订单入库",
        "agv_start": "AGV容器入库",
        "agv_back": "AGV容器回库",
        "stockQuery": "库存查询",
        "logOut": "退出登录",
        "copyright": "copyright © 2022 浙江中扬立库有限公司 all rights reserved.",
        "noAuth": "无权限或登录过期"
    },
    "page": {
        "login": "登录",
        "index": "首页"
    },
    "login": {
        "login": "登录",
        "loging": "登录中",
        "user": "账号",
        "pwd": "密码",
        "inputUser": "请输入账号",
        "inputPwd": "请输入密码",
        "remPwd": "记住密码"
    },
    "other": {
        "asnNo": "ASN单号"
    },
    "settings": {
        "title": "设置",
        "ip": "IP地址",
        "port": "端口",
        "project": "项目名",
        "saved": "设置已保存",
        "authTitle": "身份验证",
        "inputAuthPwd": "请输入管理员密码",
        "authError": "密码错误",
        "orderReviewRequired": "订单容器绑定页面是否需要复核",
        "orderPakinRequiresMainList": "订单入库是否需要主表列表",
        "orderDetlMultiSelect": "订单明细页面是否默认多选",
        "orderCombNeedSplit": "组托材料是否需要分割",
        "orderCombSeparator": "组托材料分隔符",
        "orderCombArrayIndex": "组托材料分割后数组索引",
        "orderCombStartPos": "组托材料起始位",
        "inputPlaceholder": "请输入"
    },
    "common": {
        "confirm": "确认",
        "cancel": "取消",
        "unknown": "未知",
        "scanInput": "扫码 / 输入",
        "scanInputMat": "扫码 / 输入物料",
        "scanInputPallet": "扫码 / 输入托盘",
        "scanInputCarton": "扫码 / 输入箱码",
        "loadMore": "上拉加载更多",
        "loading": "加载中",
        "noMore": "没有更多",
        "search": "搜索",
        "multiSelect": "多选",
        "selectAll": "全选",
        "selected": "已选"
    },
    "category": {
        "inbound": "入库管理",
        "agv": "AGV管理",
        "stock": "库存管理",
        "other": "其他操作"
    },
    "container": {
        "title": "组托",
        "palletCode": "托盘码",
        "matCode": "物料码",
        "scanPallet": "扫码 / 输入托盘码",
        "scanMat": "扫码 / 输入物料码",
        "matList": "商品列表",
        "matName": "品名",
        "matSpec": "规格",
        "matBatch": "批号",
        "matQty": "数量",
        "modify": "修改",
        "remove": "移除",
        "reset": "重置",
        "confirmComb": "确认组托",
        "emptyList": "暂无商品,请扫描物料码添加",
        "modifyInfo": "修改信息",
        "code": "编码",
        "confirmRemove": "确认移除",
        "removeMsg": "是否移除该商品?",
        "confirmReset": "确认重置",
        "resetMsg": "是否清空所有商品?",
        "combMsg": "确认将商品组托入库?",
        "orderComb": "订单组托",
        "orderCombDetl": "订单明细",
        "order_container_binding_title": "订单组托",
        "orderNo": "单据号",
        "orderType": "单据类型",
        "warehouse": "仓库",
        "viewDetail": "查看详情",
        "emptyOrder": "暂无订单数据",
        "remain": "剩余",
        "specs": "规格",
        "batch": "批次",
        "orderQty": "订单数量",
        "completedQty": "已完成",
        "clickToComb": "点击组托入库",
        "completed": "已完成",
        "emptyDetl": "暂无明细数据",
        "totalDetl": "总明细",
        "pending": "待处理",
        "palletComb": "商品组托",
        "palletNo": "托盘号",
        "cartonCode": "箱码",
        "cancel": "取消",
        "confirm": "确定",
        "binding": "组托绑定",
        "tips": "提示",
        "confirmDeleteRecord": "确认删除该条记录吗?",
        "scanOrder": "扫码 / 输入单据号",
        "scanMatReview": "扫码复核",
        "reviewed": "已复核",
        "unreviewed": "未复核",
        "emptyMat": "暂无明细",
        "noReviewReq": "无需复核"
    },
    "toast": {
        "reviewSuccess": "复核成功",
        "reviewFail": "复核失败或物料不匹配",
        "inputOrderNo": "请输入单据号",
        "emptyMat": "明细不能为空",
        "detailCompleted": "该明细已完成",
        "fetchDetailFail": "获取明细失败",
        "searchFail": "搜索请求失败",
        "palletError": "托盘码有误请重试",
        "queryFail": "查询失败",
        "modifySuccess": "修改成功",
        "removeSuccess": "移除成功",
        "scanPalletCode": "请扫描托盘条码",
        "qtyNotZero": "组托数量不能为0",
        "qtyNotZeroMat": "{0}组托数量不能为0",
        "combSuccess": "组托成功",
        "combFail": "组托失败",
        "resetComplete": "重置完成",
        "inputQty": "请输入数量"
    },
    "matSelected": {
        "title": "商品信息",
        "matDetail": "物料详情",
        "matCode": "商品编码",
        "matName": "商品名称",
        "spec": "规格",
        "batch": "批号",
        "inputBatch": "请输入批号",
        "qty": "数量",
        "confirmExtract": "确认提取"
    }
}
locale/zh-Hant.json
@@ -24,11 +24,38 @@
  "login": {
    "login": "登录"
  },
  "common": {
    "confirm": "確認",
    "cancel": "取消",
    "unknown": "未知",
    "scanInput": "掃碼 / 輸入",
    "scanInputMat": "掃碼 / 輸入物料",
    "scanInputPallet": "掃碼 / 輸入托盤",
    "scanInputCarton": "掃碼 / 輸入箱碼",
    "loadMore": "上拉加載更多",
    "loading": "加載中",
    "noMore": "沒有更多",
    "search": "搜索",
    "multiSelect": "多選",
    "selectAll": "全選",
    "selected": "已選"
  },
  "category": {
    "inbound": "入库管理",
    "agv": "AGV管理",
    "stock": "库存管理",
    "other": "其他操作"
  },
  "settings": {
    "title": "设置",
    "orderReviewRequired": "Order_Container_Binding页面是否需要复核",
    "orderPakinRequiresMainList": "訂單入库是否需要主表列表",
    "orderDetlMultiSelect": "訂單明細頁面是否默認多選",
    "orderCombNeedSplit": "組托材料是否需要分割",
    "orderCombSeparator": "組托材料分隔符",
    "orderCombArrayIndex": "組托材料分割後數組索引",
    "orderCombStartPos": "組托材料起始位",
    "inputPlaceholder": "請輸入"
  },
  "container": {
    "title": "组托",
@@ -52,9 +79,48 @@
    "removeMsg": "是否移除该商品?",
    "confirmReset": "确认重置",
    "resetMsg": "是否清空所有商品?",
    "combMsg": "确认将商品组托入库?"
    "combMsg": "確認將商品組托入庫?",
    "orderComb": "訂單組托",
    "orderCombDetl": "訂單明細",
    "order_container_binding_title": "訂單組托",
    "orderNo": "單據號",
    "orderType": "單據類型",
    "warehouse": "倉庫",
    "viewDetail": "查看詳情",
    "emptyOrder": "暫無訂單數據",
    "remain": "剩餘",
    "specs": "規格",
    "batch": "批次",
    "orderQty": "訂單數量",
    "completedQty": "已完成",
    "clickToComb": "點擊組托入庫",
    "completed": "已完成",
    "emptyDetl": "暫無明細數據",
    "totalDetl": "總明細",
    "pending": "待處理",
    "palletComb": "商品組托",
    "palletNo": "托盤號",
    "cartonCode": "箱碼",
    "cancel": "取消",
    "confirm": "確定",
    "binding": "組托綁定",
    "tips": "提示",
    "confirmDeleteRecord": "確認刪除該條記錄嗎?",
    "scanOrder": "掃碼 / 輸入單據號",
    "scanMatReview": "掃碼復核",
    "reviewed": "已復核",
    "unreviewed": "未復核",
    "emptyMat": "暫無明細",
    "noReviewReq": "無需復核"
  },
  "toast": {
    "reviewSuccess": "復核成功",
    "reviewFail": "復核失敗或物料不匹配",
    "inputOrderNo": "請輸入單據號",
    "emptyMat": "明細不能為空",
    "detailCompleted": "該明細已完成",
    "fetchDetailFail": "獲取明細失敗",
    "searchFail": "搜索請求失敗",
    "palletError": "托盘码有误请重试",
    "queryFail": "查询失败",
    "modifySuccess": "修改成功",
pages.json
@@ -1,6 +1,5 @@
{
    "pages": [
        {
    "pages": [{
            "path": "pages/login/login",
            "style": {
                "navigationBarTitleText": "",
@@ -29,9 +28,45 @@
            }
        },
        {
            "path": "pages/InManagement/Order_Pallet_Building",
            "path": "pages/InManagement/OrderContainerBinding/Main/orderList",
            "style": {
                "navigationBarTitleText": "uni-app"
                "navigationBarTitleText": "%container.orderComb%",
                "navigationStyle": "custom"
            }
        },
        {
            "path": "pages/InManagement/OrderContainerBinding/Main/orderDetlList",
            "style": {
                "navigationBarTitleText": "%container.orderCombDetl%",
                "navigationStyle": "custom"
            }
        },
        {
            "path": "pages/InManagement/OrderContainerBinding/Main/Order_Container_Binding",
            "style": {
                "navigationBarTitleText": "%container.order_container_binding_title%",
                "navigationStyle": "custom"
            }
        },
        {
            "path": "pages/InManagement/OrderContainerBinding/NoMain/orderDetlList",
            "style": {
                "navigationBarTitleText": "%container.orderCombDetl%",
                "navigationStyle": "custom"
            }
        },
        {
            "path": "pages/InManagement/OrderContainerBinding/NoMain/Order_Container_Binding",
            "style": {
                "navigationBarTitleText": "%container.order_container_binding_title%",
                "navigationStyle": "custom"
            }
        },
        {
            "path": "pages/settings/settings",
            "style": {
                "navigationBarTitleText": "%settings.title%",
                "navigationStyle": "custom"
            }
        }
    ],
pages/InManagement/ContainerBinding/Container_Binding.vue
@@ -271,7 +271,25 @@
            showRevise: false,
            showRemove: false,
            showComb: false,
            showReset: false
            showReset: false,
            orderCombNeedSplit: true,
            orderCombSeparator: ';',
            orderCombArrayIndex: 0,
            orderCombStartPos: 3
        }
    },
    onShow() {
        let settings = uni.getStorageSync('appSettings')
        if (settings) {
            this.orderCombNeedSplit = settings.orderCombNeedSplit !== false
            this.orderCombSeparator = settings.orderCombSeparator || ';'
            this.orderCombArrayIndex = settings.orderCombArrayIndex !== undefined ? Number(settings.orderCombArrayIndex) : 0
            this.orderCombStartPos = settings.orderCombStartPos !== undefined ? Number(settings.orderCombStartPos) : 3
        } else {
            this.orderCombNeedSplit = true
            this.orderCombSeparator = ';'
            this.orderCombArrayIndex = 0
            this.orderCombStartPos = 3
        }
    },
    methods: {
@@ -305,9 +323,15 @@
        },
        async findMat(val) {
            if (!this.matnr) return
            let matnr1 = this.matnr
            if (this.orderCombNeedSplit) {
                let m = this.matnr.split(this.orderCombSeparator)
                let targetChunk = m[this.orderCombArrayIndex] || m[0]
                matnr1 = targetChunk.slice(this.orderCombStartPos)
            }
            try {
                const { code, data, msg } = await findMatAuth(
                    { matnr: this.matnr },
                    { matnr: matnr1 },
                    { custom: { catch: true } }
                )
                if (code === 200 && data) {
pages/InManagement/OrderContainerBinding/Main/Order_Container_Binding.vue
New file
@@ -0,0 +1,843 @@
<template>
    <view class="page-container">
        <!-- 头部导航 -->
        <u-navbar
            :title="$t('container.orderComb')"
            :fixed="true"
            :placeholder="true"
            bgColor="#ffffff"
            titleStyle="font-weight: 600; color: #303133; font-size: 32rpx;"
            autoBack
        ></u-navbar>
        <!-- 表单区域 -->
        <view class="panel-section">
            <view class="panel form-panel">
                <u--form
                    labelPosition="left"
                    labelWidth="auto"
                >
                    <u-form-item borderBottom>
                        <template slot="label">
                            <view class="form-label">
                                <u-icon
                                    name="account"
                                    color="#409eff"
                                    customStyle="margin-right: 10rpx;"
                                ></u-icon>
                                <text class="label-text">
                                    {{ $t('container.orderNo') }}
                                </text>
                            </view>
                        </template>
                        <view class="input-wrap">
                            <u--input
                                v-model="orderNo"
                                :placeholder="$t('container.scanOrder')"
                                clearable
                                border="none"
                                :focus="orderNoFocus"
                                disabled
                            ></u--input>
                        </view>
                    </u-form-item>
                    <u-form-item :borderBottom="orderReviewRequired">
                        <template slot="label">
                            <view class="form-label">
                                <u-icon
                                    name="scan"
                                    color="#409eff"
                                    customStyle="margin-right: 10rpx;"
                                ></u-icon>
                                <text class="label-text">
                                    {{ $t('container.palletCode') }}
                                </text>
                            </view>
                        </template>
                        <view class="input-wrap">
                            <u--input
                                v-model="barcode"
                                :placeholder="$t('container.scanPallet')"
                                clearable
                                border="none"
                                :focus="barcodeFocus"
                                @change="barcodeInput"
                            ></u--input>
                        </view>
                    </u-form-item>
                    <u-form-item v-if="orderReviewRequired">
                        <template slot="label">
                            <view class="form-label">
                                <u-icon
                                    name="list"
                                    color="#409eff"
                                    customStyle="margin-right: 10rpx;"
                                ></u-icon>
                                <text class="label-text">
                                    {{ $t('container.matCode') }}
                                </text>
                            </view>
                        </template>
                        <view class="input-wrap">
                            <u--input
                                v-model="matnr"
                                :placeholder="$t('container.scanMatReview')"
                                clearable
                                border="none"
                                :focus="matFocus"
                                @change="findMat"
                            ></u--input>
                        </view>
                    </u-form-item>
                </u--form>
            </view>
        </view>
        <!-- 列表区域 -->
        <view class="list-section">
            <view
                class="list-header"
                style="justify-content: space-between"
            >
                <view style="display: flex; align-items: center">
                    <view class="title-indicator"></view>
                    <text class="header-title">
                        {{ $t('container.matList') }} ({{ dataList.length }})
                    </text>
                </view>
                <view class="review-status">
                    <text v-if="orderReviewRequired">
                        {{ $t('container.reviewed') }}: {{ reviewedCount }} /
                        {{ dataList.length }}
                    </text>
                    <text v-else>
                        {{ $t('container.noReviewReq', '无需复核') }}
                    </text>
                </view>
            </view>
            <view class="list-container">
                <view
                    class="panel mat-card"
                    v-for="(item, i) in dataList"
                    :key="i"
                >
                    <view class="card-top">
                        <view style="display: flex; align-items: center">
                            <view class="card-index">{{ i + 1 }}</view>
                            <text class="mat-code">{{ item.matnr }}</text>
                        </view>
                        <view
                            v-if="orderReviewRequired"
                            class="review-badge"
                            :class="
                                item.review === 'reviewed'
                                    ? 'reviewed'
                                    : 'unreviewed'
                            "
                        >
                            <text class="badge-text">
                                {{
                                    item.review === 'reviewed'
                                        ? $t('container.reviewed')
                                        : $t('container.unreviewed')
                                }}
                            </text>
                        </view>
                    </view>
                    <view class="card-content">
                        <view class="info-row">
                            <text class="info-label">
                                {{ $t('container.matName') }}
                            </text>
                            <text class="info-value">
                                {{ item.maktx || '-' }}
                            </text>
                        </view>
                        <view class="info-row">
                            <view class="info-col">
                                <text class="info-label">
                                    {{ $t('container.matSpec') }}
                                </text>
                                <text class="info-value">
                                    {{ item.specs || '-' }}
                                </text>
                            </view>
                            <view class="info-col">
                                <text class="info-label">
                                    {{ $t('container.matBatch') }}
                                </text>
                                <text class="info-value highlight">
                                    {{ item.batch || '-' }}
                                </text>
                            </view>
                        </view>
                        <view class="info-row">
                            <view class="info-col">
                                <text class="info-label">
                                    {{ $t('container.matQty') }}
                                </text>
                                <text class="info-value qty">
                                    {{ item.anfme }}
                                </text>
                            </view>
                        </view>
                    </view>
                    <view class="card-actions">
                        <u-button
                            type="primary"
                            size="small"
                            plain
                            :text="$t('container.modify')"
                            @click="revise(item, i)"
                            customStyle="width: 140rpx; margin: 0;"
                        ></u-button>
                        <view style="width: 20rpx"></view>
                        <u-button
                            type="error"
                            size="small"
                            plain
                            :text="$t('container.remove')"
                            @click="remove(item, i)"
                            customStyle="width: 140rpx; margin: 0;"
                        ></u-button>
                    </view>
                </view>
                <u-empty
                    v-if="dataList.length === 0"
                    mode="list"
                    :text="$t('container.emptyMat')"
                    marginTop="40"
                ></u-empty>
            </view>
        </view>
        <!-- 底部操作按钮 -->
        <view class="bottom-bar">
            <view class="btn-wrap">
                <u-button
                    type="info"
                    :text="$t('container.reset')"
                    @click="resetConfirmBtn"
                ></u-button>
            </view>
            <view
                class="btn-wrap"
                style="flex: 2; margin-left: 20rpx"
            >
                <u-button
                    type="primary"
                    :text="$t('container.confirmComb')"
                    @click="combConfirmBtn"
                    :disabled="isDisabled || dataList.length === 0"
                    :throttleTime="1500"
                ></u-button>
            </view>
        </view>
        <!-- 修改数量弹窗 -->
        <u-popup
            :show="showRevise"
            mode="center"
            round="12"
            @close="showRevise = false"
        >
            <view class="popup-card">
                <view class="popup-header">
                    <text>{{ $t('container.modifyInfo') }}</text>
                </view>
                <view class="popup-body">
                    <u--form
                        labelWidth="80"
                        labelPosition="left"
                    >
                        <u-form-item :label="$t('container.code')">
                            <text class="popup-text-val">{{ editMatnr }}</text>
                        </u-form-item>
                        <u-form-item :label="$t('container.matBatch')">
                            <u--input
                                v-model="batch"
                                :placeholder="$t('matSelected.inputBatch')"
                                border="surround"
                            ></u--input>
                        </u-form-item>
                        <u-form-item :label="$t('container.matQty')">
                            <u-number-box
                                v-model="count"
                                :step="0.01"
                                :max="9999999"
                                @change="changeValue"
                            ></u-number-box>
                        </u-form-item>
                    </u--form>
                </view>
                <view class="popup-footer">
                    <u-button
                        :text="$t('common.cancel')"
                        @click="showRevise = false"
                        customStyle="margin-right: 20rpx; flex: 1;"
                    ></u-button>
                    <u-button
                        type="primary"
                        :text="$t('common.confirm')"
                        @click="reviseConfirm"
                        customStyle="flex: 1;"
                    ></u-button>
                </view>
            </view>
        </u-popup>
        <!-- 模态框 -->
        <u-modal
            :show="showRemove"
            :title="$t('container.confirmRemove')"
            :content="$t('container.removeMsg')"
            showCancelButton
            @confirm="removeConfirm"
            @cancel="showRemove = false"
        ></u-modal>
        <u-modal
            :show="showComb"
            :title="$t('container.confirmComb')"
            :content="$t('container.combMsg')"
            showCancelButton
            @confirm="comb"
            @cancel="showComb = false"
        ></u-modal>
        <u-modal
            :show="showReset"
            :title="$t('container.confirmReset')"
            :content="$t('container.resetMsg')"
            showCancelButton
            @confirm="resetConfirm"
            @cancel="showReset = false"
        ></u-modal>
        <u-toast ref="uToast"></u-toast>
    </view>
</template>
<script>
import { combOrder } from './api.js'
export default {
    data() {
        return {
            barcode: '',
            orderNo: '',
            dataList: [],
            count: 0,
            rowNum: '',
            matnr: '',
            editMatnr: '',
            batch: '',
            weight: '',
            orderNoFocus: false,
            barcodeFocus: true,
            matFocus: false,
            removeNum: 0,
            isDisabled: false,
            showRevise: false,
            showRemove: false,
            showComb: false,
            showReset: false,
            orderReviewRequired: false,
            orderCombNeedSplit: true,
            orderCombSeparator: ';',
            orderCombArrayIndex: 0,
            orderCombStartPos: 3
        }
    },
    computed: {
        // 已复核数量
        reviewedCount() {
            return this.dataList.filter((item) => item.review === 'reviewed')
                .length
        }
    },
    onLoad() {
        let that = this
        const eventChannel = this.getOpenerEventChannel()
        if (eventChannel) {
            eventChannel.on('orderItem', function (data) {
                if (data.items && data.items.length > 0) {
                    that.orderNo = data.items[0].orderNo
                    data.items.forEach((item) => {
                        that.checkMat(item)
                    })
                } else if (data.item) {
                    that.orderNo = data.item.orderNo
                    that.checkMat(data.item)
                }
            })
        }
    },
    onShow() {
        // 获取开多选设置
        let settings = uni.getStorageSync('appSettings')
        if (settings) {
            this.orderReviewRequired = !!settings.orderReviewRequired
            this.orderCombNeedSplit = settings.orderCombNeedSplit !== false
            this.orderCombSeparator = settings.orderCombSeparator || ';'
            this.orderCombArrayIndex = settings.orderCombArrayIndex !== undefined ? Number(settings.orderCombArrayIndex) : 0
            this.orderCombStartPos = settings.orderCombStartPos !== undefined ? Number(settings.orderCombStartPos) : 3
        } else {
            this.orderReviewRequired = false
            this.orderCombNeedSplit = true
            this.orderCombSeparator = ';'
            this.orderCombArrayIndex = 0
            this.orderCombStartPos = 3
        }
    },
    methods: {
        barcodeInput(val) {
            setTimeout(() => {
                var len = this.barcode.length
                this.focuss()
            }, 200)
        },
        barcodeFocuss() {
            this.barcodeFocus = false
            setTimeout(() => {
                this.barcode = ''
                this.barcodeFocus = true
            }, 100)
        },
        focuss() {
            this.matFocus = false
            setTimeout(() => {
                this.matnr = ''
                this.matFocus = true
            }, 100)
        },
        // 搜索物料 - 扫码复核
        findMat(val) {
            if (!this.matnr) return
            let matnr1 = this.matnr
            if (this.orderCombNeedSplit) {
                let m = this.matnr.split(this.orderCombSeparator)
                // Ensure index is within bounds to avoid undefined errors
                let targetChunk = m[this.orderCombArrayIndex] || m[0]
                matnr1 = targetChunk.slice(this.orderCombStartPos)
            }
            let found = false
            for (var i = 0; i < this.dataList.length; i++) {
                if (this.dataList[i].matnr === matnr1) {
                    this.dataList[i].review = 'reviewed'
                    found = true
                }
            }
            if (found) {
                this.$showToast({
                    type: 'success',
                    message: this.$t('toast.reviewSuccess')
                })
            } else {
                this.$showToast({
                    type: 'error',
                    message: this.$t('toast.reviewFail')
                })
            }
            setTimeout(() => {
                this.matnr = ''
            }, 100)
        },
        checkMat(mat) {
            mat.review = 'unreviewed'
            mat.anfme = mat.enableQty
            var len = this.dataList.length
            var add = true,
                sameItem = false
            for (var i = 0; i < len; i++) {
                if (mat.matnr == this.dataList[i].matnr) {
                    for (var j = 0; j < len; j++) {
                        if (mat.batch == this.dataList[j].batch) {
                            sameItem = true
                        }
                    }
                    if (mat.batch != this.dataList[i].batch) {
                        if (sameItem) {
                            add = false
                        } else {
                            add = true
                        }
                    } else {
                        this.dataList[i].anfme += mat.anfme
                        add = false
                    }
                }
            }
            if (add) {
                this.dataList.unshift(mat)
            }
        },
        revise(item, i) {
            this.editMatnr = this.dataList[i].matnr
            this.count = this.dataList[i].anfme
            this.batch = this.dataList[i].batch
            this.weight = this.dataList[i].weight
            this.rowNum = i
            this.showRevise = true
        },
        changeValue(e) {
            this.count = e.value
        },
        reviseConfirm() {
            this.dataList[this.rowNum].anfme = this.count
            this.dataList[this.rowNum].batch = this.batch
            this.dataList[this.rowNum].weight = this.weight
            this.editMatnr = ''
            this.$showToast({
                type: 'success',
                message: this.$t('toast.modifySuccess')
            })
            this.showRevise = false
        },
        remove(item, i) {
            this.removeNum = i
            this.showRemove = true
        },
        removeConfirm() {
            this.dataList.splice(this.removeNum, 1)
            this.$showToast({
                type: 'success',
                message: this.$t('toast.removeSuccess')
            })
            this.showRemove = false
        },
        combConfirmBtn() {
            if (this.isDisabled || this.dataList.length === 0) return
            this.showComb = true
        },
        async comb() {
            let that = this
            that.isDisabled = true
            if (that.orderNo === '') {
                this.$showToast({
                    type: 'error',
                    message: this.$t('toast.inputOrderNo')
                })
                that.isDisabled = false
                this.showComb = false
                return
            }
            if (that.barcode === '') {
                this.$showToast({
                    type: 'error',
                    message: this.$t('toast.scanPalletCode')
                })
                that.isDisabled = false
                this.showComb = false
                return
            }
            if (that.dataList.length === 0) {
                this.$showToast({
                    type: 'error',
                    message: this.$t('toast.emptyMat')
                })
                that.isDisabled = false
                this.showComb = false
                return
            }
            this.showComb = false
            uni.vibrateShort()
            try {
                const { code, msg } = await combOrder(
                    {
                        orderNo: this.orderNo,
                        barcode: this.barcode,
                        combMats: this.dataList
                    },
                    { custom: { catch: true } }
                )
                if (code === 200) {
                    this.resst()
                    this.$showToast({
                        type: 'success',
                        message: this.$t('toast.combSuccess')
                    })
                    const innerAudioContext = uni.createInnerAudioContext()
                    innerAudioContext.src = '/static/music/pakinOk.mp3'
                    innerAudioContext.play()
                    setTimeout(() => {
                        uni.navigateBack()
                    }, 1500)
                } else if (code === 403) {
                    this.$showToast({ type: 'error', message: msg })
                    setTimeout(() => {
                        uni.reLaunch({ url: '/pages/login/login' })
                    }, 1000)
                } else {
                    this.$showToast({
                        type: 'error',
                        message: msg || this.$t('toast.combFail')
                    })
                }
            } catch (err) {
            } finally {
                that.isDisabled = false
            }
        },
        resetConfirmBtn() {
            this.showReset = true
        },
        resetConfirm() {
            this.dataList = []
            this.barcode = ''
            this.$showToast({
                type: 'success',
                message: this.$t('toast.resetComplete')
            })
            this.showReset = false
        },
        resst() {
            this.orderNo = ''
            this.dataList = []
            this.barcode = ''
            this.orderNoFocus = false
            setTimeout(() => {
                this.orderNo = ''
                this.orderNoFocus = true
            }, 100)
        }
    }
}
</script>
<style lang="scss" scoped>
page {
    background-color: #f0f2f5;
}
.page-container {
    min-height: 100vh;
    background-color: #f0f2f5;
    padding-bottom: 140rpx;
}
/* 面板区域 */
.panel-section {
    padding: 24rpx;
}
.panel {
    background-color: #ffffff;
    border-radius: 12rpx;
    padding: 24rpx;
    box-shadow: 0 2rpx 12rpx 0 rgba(0, 0, 0, 0.05);
    margin-bottom: 24rpx;
}
.form-panel {
    padding: 10rpx 24rpx;
}
.form-label {
    display: flex;
    align-items: center;
    height: 100%;
    padding-right: 20rpx;
}
.label-text {
    font-size: 28rpx;
    color: #606266;
    white-space: nowrap;
    line-height: 1;
}
.input-wrap {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
}
::v-deep .u-form-item__body {
    align-items: center !important;
    padding: 10rpx 0 !important;
}
::v-deep .u-form-item__body__left {
    align-items: center !important;
    margin-bottom: 0 !important;
}
/* 列表区域 */
.list-section {
    padding: 0 24rpx;
}
.list-header {
    display: flex;
    align-items: center;
    margin-bottom: 24rpx;
}
.title-indicator {
    width: 6rpx;
    height: 30rpx;
    background-color: #409eff;
    border-radius: 4rpx;
    margin-right: 16rpx;
}
.header-title {
    font-size: 30rpx;
    color: #303133;
    font-weight: 600;
}
.review-status {
    font-size: 24rpx;
    color: #909399;
}
/* 卡片样式 */
.mat-card {
    display: flex;
    flex-direction: column;
}
.card-top {
    display: flex;
    align-items: center;
    justify-content: space-between;
    border-bottom: 1px solid #ebeef5;
    padding-bottom: 16rpx;
    margin-bottom: 16rpx;
}
.card-index {
    background-color: #409eff;
    color: #fff;
    width: 40rpx;
    height: 40rpx;
    border-radius: 50%;
    text-align: center;
    line-height: 40rpx;
    font-size: 24rpx;
    margin-right: 16rpx;
}
.mat-code {
    font-size: 32rpx;
    font-weight: 600;
    color: #303133;
}
.review-badge {
    padding: 4rpx 12rpx;
    border-radius: 16rpx;
}
.reviewed {
    background: #67c23a;
}
.unreviewed {
    background: #909399;
}
.badge-text {
    font-size: 22rpx;
    color: #ffffff;
}
.card-content {
    display: flex;
    flex-direction: column;
}
.info-row {
    display: flex;
    justify-content: space-between;
    margin-bottom: 12rpx;
}
.info-col {
    flex: 1;
    display: flex;
    align-items: center;
}
.info-label {
    color: #909399;
    font-size: 26rpx;
    width: 80rpx;
}
.info-value {
    color: #303133;
    font-size: 28rpx;
}
.highlight {
    color: #e6a23c;
}
.qty {
    color: #f56c6c;
    font-weight: bold;
}
.card-actions {
    display: flex;
    justify-content: flex-end;
    margin-top: 10rpx;
    border-top: 1px dashed #ebeef5;
    padding-top: 20rpx;
}
/* 底部操作条 */
.bottom-bar {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    background-color: #fff;
    box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
    display: flex;
    padding: 20rpx 24rpx;
    padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
    z-index: 99;
}
.btn-wrap {
    display: flex;
    flex: 1;
}
/* 弹窗样式 */
.popup-card {
    width: 600rpx;
    background-color: #fff;
    border-radius: 12rpx;
    padding: 40rpx 30rpx;
}
.popup-header {
    text-align: center;
    font-size: 32rpx;
    font-weight: bold;
    color: #303133;
    margin-bottom: 30rpx;
}
.popup-text-val {
    font-size: 28rpx;
    color: #606266;
}
.popup-footer {
    display: flex;
    margin-top: 40rpx;
}
</style>
pages/InManagement/OrderContainerBinding/Main/api.js
New file
@@ -0,0 +1,13 @@
const http = uni.$u.http
export const fetchOrderList = (params) => http.get('/pda/order/list', {
    params
})
export const fetchOrderDetlList = (data) => http.post('/pda/orderDetl/list', data)
export const searchOrderDetl = (params) => http.get('/orderDetl/search/pda/auth', {
    params
})
export const combOrder = (data) => http.post('/mobile/comb/auth', data)
pages/InManagement/OrderContainerBinding/Main/orderDetlList.vue
New file
@@ -0,0 +1,848 @@
<template>
    <view class="page-container">
        <!-- 头部导航 -->
        <u-navbar
            :title="$t('container.orderCombDetl') || '订单明细'"
            :fixed="true"
            :placeholder="true"
            bgColor="#ffffff"
            titleStyle="font-weight: 600; color: #303133; font-size: 32rpx;"
            autoBack
        >
            <template slot="right">
                <view
                    class="navbar-right"
                    @click="toggleMultiSelect"
                    style="padding: 10rpx"
                >
                    <text
                        :style="{
                            color: isMultiSelect ? '#409eff' : '#303133',
                            fontSize: '28rpx'
                        }"
                    >
                        {{
                            isMultiSelect
                                ? $t('common.cancel') || '取消'
                                : $t('common.multiSelect') || '多选'
                        }}
                    </text>
                </view>
            </template>
        </u-navbar>
        <!-- 订单信息头部 -->
        <view
            class="order-header"
            v-if="order"
        >
            <view class="header-content">
                <view class="header-row">
                    <text class="header-label">
                        {{ $t('container.orderNo') || '单据号' }}
                    </text>
                    <text class="header-value">{{ order.orderNo }}</text>
                </view>
                <view class="header-row">
                    <text class="header-label">
                        {{ $t('container.orderType') || '单据类型' }}
                    </text>
                    <text class="header-value">
                        {{ order.docType$ || '-' }}
                    </text>
                </view>
            </view>
        </view>
        <!-- 搜索框 -->
        <!-- <view class="search-bar">
            <u-search
                v-model="condition"
                :placeholder="$t('common.scanInputMat') || '扫码 / 输入物料'"
                @search="search"
                @custom="search"
                @clear="onCancelSearch"
                :showAction="true"
                :actionText="$t('common.search') || '搜索'"
                bgColor="#F5F5F5"
                shape="round"
            ></u-search>
        </view> -->
        <!-- 明细列表 -->
        <view class="detl-list">
            <view
                class="detl-card"
                :class="{ 'card-selected': selectedItems.includes(item) }"
                v-for="(item, index) in filterList"
                :key="index"
                @click="handleItemClick(item)"
            >
                <view
                    class="check-box"
                    v-if="isMultiSelect && item.enableQty > 0"
                >
                    <uni-icons
                        :type="
                            selectedItems.includes(item)
                                ? 'checkbox-filled'
                                : 'circle'
                        "
                        size="24"
                        :color="
                            selectedItems.includes(item) ? '#409eff' : '#dcdfe6'
                        "
                    ></uni-icons>
                </view>
                <view class="card-main">
                    <!-- 卡片头部 -->
                    <view class="card-header">
                        <view class="mat-info">
                            <text class="mat-code">{{ item.matnr }}</text>
                            <text class="mat-name">
                                {{ item.maktx || '-' }}
                            </text>
                        </view>
                        <view
                            class="qty-badge"
                            :class="
                                item.enableQty > 0
                                    ? 'badge-active'
                                    : 'badge-done'
                            "
                        >
                            <text class="qty-text">
                                {{ $t('container.remain') || '剩余' }}
                                {{ item.enableQty }}
                            </text>
                        </view>
                    </view>
                    <!-- 卡片内容 -->
                    <view class="card-body">
                        <view class="info-grid">
                            <view class="info-item">
                                <text class="info-label">
                                    {{ $t('container.specs') || '规格' }}
                                </text>
                                <text class="info-value">
                                    {{ item.specs || '-' }}
                                </text>
                            </view>
                            <view class="info-item">
                                <text class="info-label">
                                    {{ $t('container.batch') || '批次' }}
                                </text>
                                <text class="info-value">
                                    {{ item.batch || '-' }}
                                </text>
                            </view>
                            <view class="info-item">
                                <text class="info-label">
                                    {{ $t('container.orderQty') || '订单数量' }}
                                </text>
                                <text class="info-value highlight">
                                    {{ item.anfme }}
                                </text>
                            </view>
                            <view class="info-item">
                                <text class="info-label">
                                    {{
                                        $t('container.completedQty') || '已完成'
                                    }}
                                </text>
                                <text class="info-value">
                                    {{ item.anfme - item.enableQty }}
                                </text>
                            </view>
                        </view>
                        <!-- 进度条 -->
                        <view class="progress-wrap">
                            <view class="progress-bar">
                                <view
                                    class="progress-fill"
                                    :style="{ width: getProgress(item) + '%' }"
                                ></view>
                            </view>
                            <text class="progress-text">
                                {{ getProgress(item) }}%
                            </text>
                        </view>
                    </view>
                    <!-- 卡片底部 -->
                    <view
                        class="card-footer"
                        v-if="item.enableQty > 0"
                    >
                        <text class="action-text">
                            {{ $t('container.clickToComb') || '点击组托入库' }}
                        </text>
                        <uni-icons
                            type="right"
                            size="14"
                            color="#667eea"
                        ></uni-icons>
                    </view>
                    <view
                        class="card-footer card-footer-done"
                        v-else
                    >
                        <text class="done-text">
                            {{ $t('container.completed') || '已完成' }}
                        </text>
                        <uni-icons
                            type="checkmarkempty"
                            size="14"
                            color="#28a745"
                        ></uni-icons>
                    </view>
                </view>
            </view>
        </view>
        <!-- 空状态 -->
        <view
            class="empty-state"
            v-if="filterList.length === 0 && !loading"
        >
            <u-empty
                mode="list"
                :text="$t('container.emptyDetl') || '暂无明细数据'"
                marginTop="40"
            ></u-empty>
        </view>
        <!-- 统计信息 -->
        <view
            class="stats-bar"
            v-if="menuList.length > 0 && !isMultiSelect"
        >
            <view class="stats-item">
                <text class="stats-value">{{ menuList.length }}</text>
                <text class="stats-label">
                    {{ $t('container.totalDetl') || '总明细' }}
                </text>
            </view>
            <view class="stats-divider"></view>
            <view class="stats-item">
                <text class="stats-value">{{ pendingCount }}</text>
                <text class="stats-label">
                    {{ $t('container.pending') || '待处理' }}
                </text>
            </view>
            <view class="stats-divider"></view>
            <view class="stats-item">
                <text class="stats-value">{{ completedCount }}</text>
                <text class="stats-label">
                    {{ $t('container.completed') || '已完成' }}
                </text>
            </view>
        </view>
        <!-- 多选操作底部 -->
        <view
            class="multi-action-bar"
            v-if="isMultiSelect"
        >
            <view
                class="select-all"
                @click="toggleSelectAll"
            >
                <uni-icons
                    :type="isAllSelected ? 'checkbox-filled' : 'circle'"
                    size="24"
                    :color="isAllSelected ? '#409eff' : '#909399'"
                ></uni-icons>
                <text class="select-all-text">
                    {{ $t('common.selectAll') || '全选' }}
                </text>
            </view>
            <view class="selected-count">
                <text>{{ $t('common.selected') || '已选' }}</text>
                <text class="count-num">{{ selectedItems.length }}</text>
            </view>
            <u-button
                type="primary"
                :disabled="selectedItems.length === 0"
                :text="$t('container.clickToComb') || '点击组托入库'"
                @click="submitMultiSelected"
                customStyle="width: 240rpx; margin: 0; height: 72rpx;"
            ></u-button>
        </view>
    </view>
</template>
<script>
import { fetchOrderDetlList, searchOrderDetl } from './api.js'
export default {
    data() {
        return {
            data: '',
            condition: '',
            menuList: [],
            order: '',
            loading: false,
            isMultiSelect: false,
            selectedItems: []
        }
    },
    computed: {
        // 过滤后的列表(优先显示有剩余数量的)
        filterList() {
            if (!this.condition.trim()) {
                // 排序:有剩余数量的排前面
                return [...this.menuList].sort((a, b) => {
                    if (a.enableQty > 0 && b.enableQty <= 0) return -1
                    if (a.enableQty <= 0 && b.enableQty > 0) return 1
                    return 0
                })
            }
            const keyword = this.condition.toLowerCase()
            return this.menuList.filter((item) => {
                return (
                    (item.matnr &&
                        item.matnr.toLowerCase().includes(keyword)) ||
                    (item.maktx &&
                        item.maktx.toLowerCase().includes(keyword)) ||
                    (item.batch && item.batch.toLowerCase().includes(keyword))
                )
            })
        },
        // 待处理数量
        pendingCount() {
            return this.menuList.filter((item) => item.enableQty > 0).length
        },
        // 已完成数量
        completedCount() {
            return this.menuList.filter((item) => item.enableQty <= 0).length
        },
        // 是否全选了可选的明细
        isAllSelected() {
            const availableItems = this.filterList.filter(
                (item) => item.enableQty > 0
            )
            if (availableItems.length === 0) return false
            return availableItems.length === this.selectedItems.length
        }
    },
    onLoad() {
        let that = this
        const eventChannel = this.getOpenerEventChannel()
        if (eventChannel) {
            eventChannel.on('data', function (data) {
                that.order = data.data
                that.getOrderNoList(that.order)
            })
        }
    },
    onShow() {
        if (this.order) {
            this.getOrderNoList(this.order)
        }
        // 获取开多选设置
        let settings = uni.getStorageSync('appSettings')
        if (settings && settings.orderDetlMultiSelect) {
            this.isMultiSelect = true
        } else {
            this.isMultiSelect = false
        }
        // 重置多选状态
        this.selectedItems = []
    },
    methods: {
        // 计算进度
        getProgress(item) {
            if (!item.anfme || item.anfme === 0) return 0
            const progress = (
                ((item.anfme - item.enableQty) / item.anfme) *
                100
            ).toFixed(0)
            return Math.min(100, Math.max(0, progress))
        },
        // 搜索
        async search() {
            if (!this.condition.trim()) {
                this.getOrderNoList(this.order)
                return
            }
            let that = this
            that.loading = true
            try {
                const { code, data, msg } = await searchOrderDetl({
                    condition: this.condition,
                    order: this.order.orderNo
                })
                if (code === 200) {
                    that.menuList = data || []
                } else if (code === 403) {
                    uni.showToast({ title: msg, icon: 'none', position: 'top' })
                    setTimeout(() => {
                        uni.reLaunch({ url: '/pages/login/login' })
                    }, 1000)
                } else {
                    uni.showToast({ title: msg, icon: 'none', position: 'top' })
                }
            } catch (err) {
                console.error(err)
                uni.showToast({
                    title: this.$t('toast.searchFail') || '搜索请求失败',
                    icon: 'none',
                    position: 'top'
                })
            } finally {
                that.loading = false
            }
        },
        // 取消搜索
        onCancelSearch() {
            this.condition = ''
            this.getOrderNoList(this.order)
        },
        // 获取订单明细列表
        async getOrderNoList(order) {
            if (!order || !order.orderNo) return
            let that = this
            that.loading = true
            try {
                const { code, data, msg } = await fetchOrderDetlList({
                    orderNo: order.orderNo
                })
                if (code === 200) {
                    that.menuList = data || []
                } else if (code === 403) {
                    uni.showToast({ title: msg, icon: 'none', position: 'top' })
                    setTimeout(() => {
                        uni.reLaunch({ url: '/pages/login/login' })
                    }, 1000)
                } else {
                    uni.showToast({
                        title:
                            msg ||
                            this.$t('toast.fetchDetailFail') ||
                            '获取明细失败',
                        icon: 'none',
                        position: 'top'
                    })
                    that.menuList = data || []
                }
            } catch (err) {
                console.error(err)
                uni.showToast({
                    title: this.$t('toast.fetchDetailFail') || '获取明细失败',
                    icon: 'none',
                    position: 'top'
                })
            } finally {
                that.loading = false
            }
        },
        // 切换多选模式
        toggleMultiSelect() {
            this.isMultiSelect = !this.isMultiSelect
            if (!this.isMultiSelect) {
                this.selectedItems = []
            }
        },
        // 全选/取消全选
        toggleSelectAll() {
            const availableItems = this.filterList.filter(
                (item) => item.enableQty > 0
            )
            if (this.isAllSelected) {
                this.selectedItems = []
            } else {
                this.selectedItems = [...availableItems]
            }
        },
        // 处理列表项点击
        handleItemClick(item) {
            if (this.isMultiSelect) {
                if (item.enableQty <= 0) {
                    uni.showToast({
                        title:
                            this.$t('toast.detailCompleted') || '该明细已完成',
                        icon: 'none',
                        position: 'top'
                    })
                    return
                }
                const index = this.selectedItems.findIndex(
                    (selected) => selected === item
                )
                if (index > -1) {
                    this.selectedItems.splice(index, 1)
                } else {
                    this.selectedItems.push(item)
                }
            } else {
                this.chose(item)
            }
        },
        // 选择明细进行组托(单选)
        chose(item) {
            if (item.enableQty <= 0) {
                uni.showToast({
                    title: this.$t('toast.detailCompleted') || '该明细已完成',
                    icon: 'none',
                    position: 'top'
                })
                return
            }
            uni.navigateTo({
                url: '/pages/InManagement/OrderContainerBinding/Main/Order_Container_Binding',
                success: function (res) {
                    res.eventChannel.emit('orderItem', {
                        item: item
                    })
                }
            })
        },
        // 多选提交
        submitMultiSelected() {
            if (this.selectedItems.length === 0) return
            let that = this
            uni.navigateTo({
                url: '/pages/InManagement/OrderContainerBinding/Main/Order_Container_Binding',
                success: function (res) {
                    // 传递 items 数组,Order_Container_Binding 能够接收
                    res.eventChannel.emit('orderItem', {
                        items: that.selectedItems
                    })
                    that.isMultiSelect = false
                    that.selectedItems = []
                }
            })
        }
    }
}
</script>
<style lang="scss" scoped>
/* 引入公共样式 */
@import url('@/static/css/common.css');
.page-container {
    min-height: 100vh;
    background-color: #f0f2f5;
    padding-bottom: 120rpx;
}
/* 订单头部 */
.order-header {
    background-color: #ffffff;
    padding: 24rpx 28rpx;
    box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05);
    margin-bottom: 16rpx;
}
.header-content {
    background: #f8f9fa;
    border-radius: 12rpx;
    padding: 16rpx 20rpx;
    border: 1px solid #ebeef5;
}
.header-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 6rpx 0;
}
.header-label {
    font-size: 26rpx;
    color: #909399;
}
.header-value {
    font-size: 28rpx;
    color: #303133;
    font-weight: 600;
}
/* 搜索栏 */
.search-bar {
    padding: 20rpx 24rpx;
    background: #ffffff;
    box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.04);
    position: sticky;
    top: 0;
    z-index: 100;
}
/* 明细列表 */
.detl-list {
    padding: 0 20rpx;
}
.detl-card {
    background: #ffffff;
    border-radius: 16rpx;
    margin-top: 24rpx;
    box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05);
    overflow: hidden;
    transition: transform 0.2s ease, box-shadow 0.2s ease;
    border: 2rpx solid transparent;
    display: flex;
    align-items: center;
}
.detl-card.card-selected {
    border-color: #409eff;
    background-color: #f0f7ff;
}
.detl-card.card-selected .card-header {
    background-color: transparent;
}
.check-box {
    padding: 0 20rpx;
    display: flex;
    align-items: center;
    justify-content: center;
}
.card-main {
    flex: 1;
    min-width: 0;
}
.detl-card:active {
    transform: scale(0.98);
    box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.12);
}
/* 卡片头部 */
.card-header {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    padding: 24rpx 28rpx;
    background-color: transparent;
    border-bottom: 1px solid #ebeef5;
}
.mat-info {
    flex: 1;
    padding-right: 12rpx;
}
.mat-code {
    font-size: 28rpx;
    color: #303133;
    font-weight: 600;
    display: block;
}
.mat-name {
    font-size: 24rpx;
    color: #909399;
    margin-top: 6rpx;
    display: block;
}
.qty-badge {
    padding: 6rpx 16rpx;
    border-radius: 20rpx;
    flex-shrink: 0;
}
.badge-active {
    background: #409eff;
}
.badge-done {
    background: #e8f5e9;
}
.qty-text {
    font-size: 22rpx;
    font-weight: 500;
    color: #ffffff;
}
.badge-done .qty-text {
    color: #28a745;
}
/* 卡片内容 */
.card-body {
    padding: 20rpx 28rpx;
}
.info-grid {
    display: flex;
    flex-wrap: wrap;
}
.info-item {
    width: 50%;
    margin-bottom: 12rpx;
}
.info-label {
    font-size: 24rpx;
    color: #909399;
    display: block;
}
.info-value {
    font-size: 26rpx;
    color: #303133;
    font-weight: 500;
    display: block;
    margin-top: 4rpx;
}
.info-value.highlight {
    color: #667eea;
    font-weight: 600;
}
/* 进度条 */
.progress-wrap {
    display: flex;
    align-items: center;
    margin-top: 16rpx;
}
.progress-bar {
    flex: 1;
    height: 10rpx;
    background: #e8e8e8;
    border-radius: 6rpx;
    overflow: hidden;
}
.progress-fill {
    height: 100%;
    background: #409eff;
    border-radius: 6rpx;
    transition: width 0.3s ease;
}
.progress-text {
    font-size: 22rpx;
    color: #909399;
    margin-left: 16rpx;
    min-width: 50rpx;
    text-align: right;
}
/* 卡片底部 */
.card-footer {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    padding: 20rpx 28rpx;
    border-top: 1rpx dashed #ebeef5;
}
.card-footer-done {
    background: #f0fff4;
}
.action-text {
    font-size: 26rpx;
    color: #409eff;
    margin-right: 8rpx;
    font-weight: 500;
}
.done-text {
    font-size: 26rpx;
    color: #28a745;
    margin-right: 8rpx;
}
/* 空状态 */
.empty-state {
    padding: 60rpx 0;
}
/* 统计栏 */
.stats-bar {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    display: flex;
    align-items: center;
    justify-content: space-around;
    background: #ffffff;
    padding: 24rpx 0;
    box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.05);
    padding-bottom: calc(24rpx + env(safe-area-inset-bottom));
}
.stats-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    flex: 1;
}
.stats-value {
    font-size: 34rpx;
    color: #303133;
    font-weight: 600;
}
.stats-label {
    font-size: 22rpx;
    color: #909399;
    margin-top: 6rpx;
}
.stats-divider {
    width: 2rpx;
    height: 60rpx;
    background: #ebeef5;
}
/* 多选操作底部 */
.multi-action-bar {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    background: #ffffff;
    padding: 24rpx 30rpx;
    padding-bottom: calc(24rpx + env(safe-area-inset-bottom));
    box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.05);
    display: flex;
    align-items: center;
    justify-content: space-between;
    z-index: 100;
}
.select-all {
    display: flex;
    align-items: center;
}
.select-all-text {
    font-size: 28rpx;
    color: #303133;
    margin-left: 10rpx;
}
.selected-count {
    flex: 1;
    text-align: right;
    margin-right: 30rpx;
    font-size: 28rpx;
    color: #606266;
}
.count-num {
    color: #409eff;
    font-weight: 600;
    font-size: 32rpx;
}
</style>
pages/InManagement/OrderContainerBinding/Main/orderList.vue
New file
@@ -0,0 +1,404 @@
<template>
    <view class="page-container">
        <!-- 头部导航 -->
        <u-navbar
            :title="$t('container.orderComb')"
            :fixed="true"
            :placeholder="true"
            bgColor="#ffffff"
            titleStyle="font-weight: 600; color: #303133; font-size: 32rpx;"
            autoBack
        ></u-navbar>
        <!-- 搜索框 -->
        <view class="search-bar">
            <u-search
                v-model="orderNo"
                :placeholder="$t('container.scanOrder')"
                @search="search"
                @custom="search"
                @clear="onCancelSearch"
                :showAction="true"
                :actionText="$t('common.search') || '搜索'"
                bgColor="#F5F5F5"
                shape="round"
            ></u-search>
        </view>
        <!-- 订单列表 -->
        <view class="order-list">
            <view
                class="order-card"
                v-for="(item, i) in matList"
                :key="i"
                @click="toPrint(item)"
            >
                <!-- 卡片头部 -->
                <view class="card-header">
                    <view
                        class="order-badge"
                        :class="getSettleClass(item.settle)"
                    >
                        <text class="badge-text">
                            {{ item.settle$ || $t('common.unknown') }}
                        </text>
                    </view>
                    <view class="order-no">
                        <text class="order-no-label">
                            {{ $t('container.orderNo') }}
                        </text>
                        <text class="order-no-value">{{ item.orderNo }}</text>
                    </view>
                </view>
                <!-- 卡片内容 -->
                <view class="card-body">
                    <view class="info-row">
                        <view class="info-item">
                            <text class="info-label">
                                {{ $t('container.orderType') || '单据类型' }}
                            </text>
                            <text class="info-value">
                                {{ item.docType$ || '-' }}
                            </text>
                        </view>
                        <view class="info-item">
                            <text class="info-label">
                                {{ $t('container.warehouse') || '仓库' }}
                            </text>
                            <text class="info-value">
                                {{ item.itemName || '-' }}
                            </text>
                        </view>
                    </view>
                </view>
                <!-- 卡片底部 -->
                <view class="card-footer">
                    <text class="view-detail">
                        {{ $t('container.viewDetail') || '查看详情' }}
                    </text>
                    <uni-icons
                        type="right"
                        size="14"
                        color="#999"
                    ></uni-icons>
                </view>
            </view>
        </view>
        <!-- 空状态 -->
        <view
            class="empty-state"
            v-if="matList.length === 0 && !loading"
        >
            <u-empty
                mode="list"
                :text="$t('container.emptyOrder')"
                marginTop="60"
            ></u-empty>
        </view>
        <!-- 加载更多 -->
        <view
            class="loadmore-wrap"
            v-show="matList.length !== 0"
        >
            <u-loadmore
                :status="
                    status === 'more'
                        ? 'loadmore'
                        : status === 'loading'
                        ? 'loading'
                        : 'nomore'
                "
                :loading-text="contentText.contentrefresh"
                :loadmore-text="contentText.contentdown"
                :nomore-text="contentText.contentnomore"
                line
            />
        </view>
    </view>
</template>
<script>
import { fetchOrderList } from './api.js'
export default {
    data() {
        return {
            tagList: [],
            matList: [],
            orderNo: '',
            loading: false,
            curr: 1,
            status: 'more',
            // 当前tagId
            tagIdNow: 1
        }
    },
    computed: {
        contentText() {
            return {
                contentdown: this.$t('common.loadMore') || '上拉加载更多',
                contentrefresh: this.$t('common.loading') || '加载中',
                contentnomore: this.$t('common.noMore') || '没有更多'
            }
        }
    },
    // 下拉刷新
    onPullDownRefresh() {
        this.refreshData()
    },
    // 上拉加载更多
    onReachBottom() {
        if (this.status !== 'noMore') {
            this.status = 'loading'
            this.loadMoreData()
        }
    },
    onLoad() {
        let that = this
        const eventChannel = this.getOpenerEventChannel()
        if (eventChannel) {
            eventChannel.on('commonUrl', function (data) {
                that.commonUrl = data.commonUrl
            })
        }
    },
    onShow() {
        // 每次进入页面重新加载
        this.refreshData()
    },
    methods: {
        // 刷新数据
        refreshData() {
            this.curr = 1
            this.matList = []
            this.status = 'more'
            this.loading = true
            this.fetchOrderList(true)
        },
        // 加载更多数据
        loadMoreData() {
            this.fetchOrderList(false)
        },
        // 获取订单列表
        async fetchOrderList(isRefresh) {
            let that = this
            try {
                const { code, data, msg } = await fetchOrderList({
                    curr: that.curr,
                    limit: 20,
                    tagId: that.tagIdNow,
                    orderNo: that.orderNo
                })
                if (code === 200) {
                    let records = data.records || []
                    if (records.length > 0) {
                        if (isRefresh) {
                            that.matList = records
                        } else {
                            that.matList = that.matList.concat(records)
                        }
                        that.curr = that.curr + 1
                        that.status = 'more'
                    } else {
                        that.status = 'noMore'
                    }
                } else if (code === 403) {
                    uni.showToast({ title: msg, icon: 'none', position: 'top' })
                    setTimeout(() => {
                        uni.reLaunch({ url: '/pages/login/login' })
                    }, 1000)
                } else {
                    uni.showToast({ title: msg, icon: 'none', position: 'top' })
                }
            } catch (err) {
                console.error(err)
            } finally {
                that.loading = false
                uni.stopPullDownRefresh()
            }
        },
        // 搜索
        search() {
            this.refreshData()
        },
        // 取消搜索
        onCancelSearch() {
            this.orderNo = ''
            this.refreshData()
        },
        // 根据状态返回样式类名
        getSettleClass(settle) {
            // settle: 1-待处理, 2-处理中, 3-已完成, 4-已取消 (根据实际情况调整)
            const classMap = {
                1: 'badge-pending',
                2: 'badge-processing',
                3: 'badge-completed',
                4: 'badge-cancelled'
            }
            return classMap[settle] || 'badge-default'
        },
        // 跳转到订单详情
        toPrint(item) {
            uni.navigateTo({
                url: '/pages/InManagement/OrderContainerBinding/Main/orderDetlList',
                success: function (res) {
                    res.eventChannel.emit('data', {
                        data: item
                    })
                },
                events: {
                    acceptDataFromOpenedPage: function (data) {
                        // 可以处理返回的数据
                    }
                }
            })
        }
    }
}
</script>
<style lang="scss" scoped>
.page-container {
    min-height: 100vh;
    background-color: #f0f2f5;
    padding-bottom: 20rpx;
}
.search-bar {
    padding: 20rpx 24rpx;
    background: #ffffff;
    box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.04);
    position: sticky;
    top: 0;
    z-index: 100;
}
.order-list {
    padding: 0 24rpx;
}
.order-card {
    background: #ffffff;
    border-radius: 16rpx;
    margin-top: 24rpx;
    box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05);
    overflow: hidden;
    transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.order-card:active {
    transform: scale(0.98);
    box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.12);
}
.card-header {
    display: flex;
    align-items: center;
    padding: 24rpx 28rpx;
    background-color: #fafafa;
    border-bottom: 1px solid #ebeef5;
}
.order-badge {
    padding: 6rpx 16rpx;
    border-radius: 20rpx;
    margin-right: 20rpx;
}
.badge-text {
    font-size: 22rpx;
    font-weight: 500;
    color: #ffffff;
}
/* 状态徽章颜色 */
.badge-pending {
    background: #909399;
}
.badge-processing {
    background: #ffc107;
}
.badge-completed {
    background: #67c23a;
}
.badge-cancelled {
    background: #f56c6c;
}
.badge-default {
    background: #c0c4cc;
}
.order-no {
    flex: 1;
}
.order-no-label {
    font-size: 22rpx;
    color: #909399;
    display: block;
}
.order-no-value {
    font-size: 28rpx;
    color: #303133;
    font-weight: 600;
    display: block;
    margin-top: 4rpx;
}
.card-body {
    padding: 24rpx 28rpx;
}
.info-row {
    display: flex;
    flex-wrap: wrap;
}
.info-item {
    width: 50%;
    margin-bottom: 16rpx;
}
.info-label {
    font-size: 24rpx;
    color: #909399;
    display: block;
}
.info-value {
    font-size: 28rpx;
    color: #303133;
    font-weight: 500;
    display: block;
    margin-top: 6rpx;
}
.card-footer {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    padding: 20rpx 28rpx;
    border-top: 1rpx dashed #ebeef5;
}
.view-detail {
    font-size: 26rpx;
    color: #909399;
    margin-right: 8rpx;
}
.loadmore-wrap {
    display: flex;
    justify-content: center;
    padding: 30rpx 0;
}
</style>
pages/InManagement/OrderContainerBinding/NoMain/Order_Container_Binding.vue
New file
@@ -0,0 +1,843 @@
<template>
    <view class="page-container">
        <!-- 头部导航 -->
        <u-navbar
            :title="$t('container.orderComb')"
            :fixed="true"
            :placeholder="true"
            bgColor="#ffffff"
            titleStyle="font-weight: 600; color: #303133; font-size: 32rpx;"
            autoBack
        ></u-navbar>
        <!-- 表单区域 -->
        <view class="panel-section">
            <view class="panel form-panel">
                <u--form
                    labelPosition="left"
                    labelWidth="auto"
                >
                    <u-form-item borderBottom>
                        <template slot="label">
                            <view class="form-label">
                                <u-icon
                                    name="account"
                                    color="#409eff"
                                    customStyle="margin-right: 10rpx;"
                                ></u-icon>
                                <text class="label-text">
                                    {{ $t('container.orderNo') }}
                                </text>
                            </view>
                        </template>
                        <view class="input-wrap">
                            <u--input
                                v-model="orderNo"
                                :placeholder="$t('container.scanOrder')"
                                clearable
                                border="none"
                                :focus="orderNoFocus"
                                disabled
                            ></u--input>
                        </view>
                    </u-form-item>
                    <u-form-item :borderBottom="orderReviewRequired">
                        <template slot="label">
                            <view class="form-label">
                                <u-icon
                                    name="scan"
                                    color="#409eff"
                                    customStyle="margin-right: 10rpx;"
                                ></u-icon>
                                <text class="label-text">
                                    {{ $t('container.palletCode') }}
                                </text>
                            </view>
                        </template>
                        <view class="input-wrap">
                            <u--input
                                v-model="barcode"
                                :placeholder="$t('container.scanPallet')"
                                clearable
                                border="none"
                                :focus="barcodeFocus"
                                @change="barcodeInput"
                            ></u--input>
                        </view>
                    </u-form-item>
                    <u-form-item v-if="orderReviewRequired">
                        <template slot="label">
                            <view class="form-label">
                                <u-icon
                                    name="list"
                                    color="#409eff"
                                    customStyle="margin-right: 10rpx;"
                                ></u-icon>
                                <text class="label-text">
                                    {{ $t('container.matCode') }}
                                </text>
                            </view>
                        </template>
                        <view class="input-wrap">
                            <u--input
                                v-model="matnr"
                                :placeholder="$t('container.scanMatReview')"
                                clearable
                                border="none"
                                :focus="matFocus"
                                @change="findMat"
                            ></u--input>
                        </view>
                    </u-form-item>
                </u--form>
            </view>
        </view>
        <!-- 列表区域 -->
        <view class="list-section">
            <view
                class="list-header"
                style="justify-content: space-between"
            >
                <view style="display: flex; align-items: center">
                    <view class="title-indicator"></view>
                    <text class="header-title">
                        {{ $t('container.matList') }} ({{ dataList.length }})
                    </text>
                </view>
                <view class="review-status">
                    <text v-if="orderReviewRequired">
                        {{ $t('container.reviewed') }}: {{ reviewedCount }} /
                        {{ dataList.length }}
                    </text>
                    <text v-else>
                        {{ $t('container.noReviewReq') }}
                    </text>
                </view>
            </view>
            <view class="list-container">
                <view
                    class="panel mat-card"
                    v-for="(item, i) in dataList"
                    :key="i"
                >
                    <view class="card-top">
                        <view style="display: flex; align-items: center">
                            <view class="card-index">{{ i + 1 }}</view>
                            <text class="mat-code">{{ item.matnr }}</text>
                        </view>
                        <view
                            v-if="orderReviewRequired"
                            class="review-badge"
                            :class="
                                item.review === 'reviewed'
                                    ? 'reviewed'
                                    : 'unreviewed'
                            "
                        >
                            <text class="badge-text">
                                {{
                                    item.review === 'reviewed'
                                        ? $t('container.reviewed')
                                        : $t('container.unreviewed')
                                }}
                            </text>
                        </view>
                    </view>
                    <view class="card-content">
                        <view class="info-row">
                            <text class="info-label">
                                {{ $t('container.matName') }}
                            </text>
                            <text class="info-value">
                                {{ item.maktx || '-' }}
                            </text>
                        </view>
                        <view class="info-row">
                            <view class="info-col">
                                <text class="info-label">
                                    {{ $t('container.matSpec') }}
                                </text>
                                <text class="info-value">
                                    {{ item.specs || '-' }}
                                </text>
                            </view>
                            <view class="info-col">
                                <text class="info-label">
                                    {{ $t('container.matBatch') }}
                                </text>
                                <text class="info-value highlight">
                                    {{ item.batch || '-' }}
                                </text>
                            </view>
                        </view>
                        <view class="info-row">
                            <view class="info-col">
                                <text class="info-label">
                                    {{ $t('container.matQty') }}
                                </text>
                                <text class="info-value qty">
                                    {{ item.anfme }}
                                </text>
                            </view>
                        </view>
                    </view>
                    <view class="card-actions">
                        <u-button
                            type="primary"
                            size="small"
                            plain
                            :text="$t('container.modify')"
                            @click="revise(item, i)"
                            customStyle="width: 140rpx; margin: 0;"
                        ></u-button>
                        <view style="width: 20rpx"></view>
                        <u-button
                            type="error"
                            size="small"
                            plain
                            :text="$t('container.remove')"
                            @click="remove(item, i)"
                            customStyle="width: 140rpx; margin: 0;"
                        ></u-button>
                    </view>
                </view>
                <u-empty
                    v-if="dataList.length === 0"
                    mode="list"
                    :text="$t('container.emptyMat')"
                    marginTop="40"
                ></u-empty>
            </view>
        </view>
        <!-- 底部操作按钮 -->
        <view class="bottom-bar">
            <view class="btn-wrap">
                <u-button
                    type="info"
                    :text="$t('container.reset')"
                    @click="resetConfirmBtn"
                ></u-button>
            </view>
            <view
                class="btn-wrap"
                style="flex: 2; margin-left: 20rpx"
            >
                <u-button
                    type="primary"
                    :text="$t('container.confirmComb')"
                    @click="combConfirmBtn"
                    :disabled="isDisabled || dataList.length === 0"
                    :throttleTime="1500"
                ></u-button>
            </view>
        </view>
        <!-- 修改数量弹窗 -->
        <u-popup
            :show="showRevise"
            mode="center"
            round="12"
            @close="showRevise = false"
        >
            <view class="popup-card">
                <view class="popup-header">
                    <text>{{ $t('container.modifyInfo') }}</text>
                </view>
                <view class="popup-body">
                    <u--form
                        labelWidth="80"
                        labelPosition="left"
                    >
                        <u-form-item :label="$t('container.code')">
                            <text class="popup-text-val">{{ editMatnr }}</text>
                        </u-form-item>
                        <u-form-item :label="$t('container.matBatch')">
                            <u--input
                                v-model="batch"
                                :placeholder="$t('matSelected.inputBatch')"
                                border="surround"
                            ></u--input>
                        </u-form-item>
                        <u-form-item :label="$t('container.matQty')">
                            <u-number-box
                                v-model="count"
                                :step="0.01"
                                :max="9999999"
                                @change="changeValue"
                            ></u-number-box>
                        </u-form-item>
                    </u--form>
                </view>
                <view class="popup-footer">
                    <u-button
                        :text="$t('common.cancel')"
                        @click="showRevise = false"
                        customStyle="margin-right: 20rpx; flex: 1;"
                    ></u-button>
                    <u-button
                        type="primary"
                        :text="$t('common.confirm')"
                        @click="reviseConfirm"
                        customStyle="flex: 1;"
                    ></u-button>
                </view>
            </view>
        </u-popup>
        <!-- 模态框 -->
        <u-modal
            :show="showRemove"
            :title="$t('container.confirmRemove')"
            :content="$t('container.removeMsg')"
            showCancelButton
            @confirm="removeConfirm"
            @cancel="showRemove = false"
        ></u-modal>
        <u-modal
            :show="showComb"
            :title="$t('container.confirmComb')"
            :content="$t('container.combMsg')"
            showCancelButton
            @confirm="comb"
            @cancel="showComb = false"
        ></u-modal>
        <u-modal
            :show="showReset"
            :title="$t('container.confirmReset')"
            :content="$t('container.resetMsg')"
            showCancelButton
            @confirm="resetConfirm"
            @cancel="showReset = false"
        ></u-modal>
        <u-toast ref="uToast"></u-toast>
    </view>
</template>
<script>
import { combOrder } from './api.js'
export default {
    data() {
        return {
            barcode: '',
            orderNo: '',
            dataList: [],
            count: 0,
            rowNum: '',
            matnr: '',
            editMatnr: '',
            batch: '',
            weight: '',
            orderNoFocus: false,
            barcodeFocus: true,
            matFocus: false,
            removeNum: 0,
            isDisabled: false,
            showRevise: false,
            showRemove: false,
            showComb: false,
            showReset: false,
            orderReviewRequired: false,
            orderCombNeedSplit: true,
            orderCombSeparator: ';',
            orderCombArrayIndex: 0,
            orderCombStartPos: 3
        }
    },
    computed: {
        // 已复核数量
        reviewedCount() {
            return this.dataList.filter((item) => item.review === 'reviewed')
                .length
        }
    },
    onLoad() {
        let that = this
        const eventChannel = this.getOpenerEventChannel()
        if (eventChannel) {
            eventChannel.on('orderItem', function (data) {
                if (data.items && data.items.length > 0) {
                    that.orderNo = data.items[0].orderNo
                    data.items.forEach((item) => {
                        that.checkMat(item)
                    })
                } else if (data.item) {
                    that.orderNo = data.item.orderNo
                    that.checkMat(data.item)
                }
            })
        }
    },
    onShow() {
        // 获取开多选设置
        let settings = uni.getStorageSync('appSettings')
        if (settings) {
            this.orderReviewRequired = !!settings.orderReviewRequired
            this.orderCombNeedSplit = settings.orderCombNeedSplit !== false
            this.orderCombSeparator = settings.orderCombSeparator || ';'
            this.orderCombArrayIndex = settings.orderCombArrayIndex !== undefined ? Number(settings.orderCombArrayIndex) : 0
            this.orderCombStartPos = settings.orderCombStartPos !== undefined ? Number(settings.orderCombStartPos) : 3
        } else {
            this.orderReviewRequired = false
            this.orderCombNeedSplit = true
            this.orderCombSeparator = ';'
            this.orderCombArrayIndex = 0
            this.orderCombStartPos = 3
        }
    },
    methods: {
        barcodeInput(val) {
            setTimeout(() => {
                var len = this.barcode.length
                this.focuss()
            }, 200)
        },
        barcodeFocuss() {
            this.barcodeFocus = false
            setTimeout(() => {
                this.barcode = ''
                this.barcodeFocus = true
            }, 100)
        },
        focuss() {
            this.matFocus = false
            setTimeout(() => {
                this.matnr = ''
                this.matFocus = true
            }, 100)
        },
        // 搜索物料 - 扫码复核
        findMat(val) {
            if (!this.matnr) return
            let matnr1 = this.matnr
            if (this.orderCombNeedSplit) {
                let m = this.matnr.split(this.orderCombSeparator)
                // Ensure index is within bounds to avoid undefined errors
                let targetChunk = m[this.orderCombArrayIndex] || m[0]
                matnr1 = targetChunk.slice(this.orderCombStartPos)
            }
            let found = false
            for (var i = 0; i < this.dataList.length; i++) {
                if (this.dataList[i].matnr === matnr1) {
                    this.dataList[i].review = 'reviewed'
                    found = true
                }
            }
            if (found) {
                this.$showToast({
                    type: 'success',
                    message: this.$t('toast.reviewSuccess')
                })
            } else {
                this.$showToast({
                    type: 'error',
                    message: this.$t('toast.reviewFail')
                })
            }
            setTimeout(() => {
                this.matnr = ''
            }, 100)
        },
        checkMat(mat) {
            mat.review = 'unreviewed'
            mat.anfme = mat.enableQty
            var len = this.dataList.length
            var add = true,
                sameItem = false
            for (var i = 0; i < len; i++) {
                if (mat.matnr == this.dataList[i].matnr) {
                    for (var j = 0; j < len; j++) {
                        if (mat.batch == this.dataList[j].batch) {
                            sameItem = true
                        }
                    }
                    if (mat.batch != this.dataList[i].batch) {
                        if (sameItem) {
                            add = false
                        } else {
                            add = true
                        }
                    } else {
                        this.dataList[i].anfme += mat.anfme
                        add = false
                    }
                }
            }
            if (add) {
                this.dataList.unshift(mat)
            }
        },
        revise(item, i) {
            this.editMatnr = this.dataList[i].matnr
            this.count = this.dataList[i].anfme
            this.batch = this.dataList[i].batch
            this.weight = this.dataList[i].weight
            this.rowNum = i
            this.showRevise = true
        },
        changeValue(e) {
            this.count = e.value
        },
        reviseConfirm() {
            this.dataList[this.rowNum].anfme = this.count
            this.dataList[this.rowNum].batch = this.batch
            this.dataList[this.rowNum].weight = this.weight
            this.editMatnr = ''
            this.$showToast({
                type: 'success',
                message: this.$t('toast.modifySuccess')
            })
            this.showRevise = false
        },
        remove(item, i) {
            this.removeNum = i
            this.showRemove = true
        },
        removeConfirm() {
            this.dataList.splice(this.removeNum, 1)
            this.$showToast({
                type: 'success',
                message: this.$t('toast.removeSuccess')
            })
            this.showRemove = false
        },
        combConfirmBtn() {
            if (this.isDisabled || this.dataList.length === 0) return
            this.showComb = true
        },
        async comb() {
            let that = this
            that.isDisabled = true
            if (that.orderNo === '') {
                this.$showToast({
                    type: 'error',
                    message: this.$t('toast.inputOrderNo')
                })
                that.isDisabled = false
                this.showComb = false
                return
            }
            if (that.barcode === '') {
                this.$showToast({
                    type: 'error',
                    message: this.$t('toast.scanPalletCode')
                })
                that.isDisabled = false
                this.showComb = false
                return
            }
            if (that.dataList.length === 0) {
                this.$showToast({
                    type: 'error',
                    message: this.$t('toast.emptyMat')
                })
                that.isDisabled = false
                this.showComb = false
                return
            }
            this.showComb = false
            uni.vibrateShort()
            try {
                const { code, msg } = await combOrder(
                    {
                        orderNo: this.orderNo,
                        barcode: this.barcode,
                        combMats: this.dataList
                    },
                    { custom: { catch: true } }
                )
                if (code === 200) {
                    this.resst()
                    this.$showToast({
                        type: 'success',
                        message: this.$t('toast.combSuccess')
                    })
                    const innerAudioContext = uni.createInnerAudioContext()
                    innerAudioContext.src = '/static/music/pakinOk.mp3'
                    innerAudioContext.play()
                    setTimeout(() => {
                        uni.navigateBack()
                    }, 1500)
                } else if (code === 403) {
                    this.$showToast({ type: 'error', message: msg })
                    setTimeout(() => {
                        uni.reLaunch({ url: '/pages/login/login' })
                    }, 1000)
                } else {
                    this.$showToast({
                        type: 'error',
                        message: msg || this.$t('toast.combFail')
                    })
                }
            } catch (err) {
            } finally {
                that.isDisabled = false
            }
        },
        resetConfirmBtn() {
            this.showReset = true
        },
        resetConfirm() {
            this.dataList = []
            this.barcode = ''
            this.$showToast({
                type: 'success',
                message: this.$t('toast.resetComplete')
            })
            this.showReset = false
        },
        resst() {
            this.orderNo = ''
            this.dataList = []
            this.barcode = ''
            this.orderNoFocus = false
            setTimeout(() => {
                this.orderNo = ''
                this.orderNoFocus = true
            }, 100)
        }
    }
}
</script>
<style lang="scss" scoped>
page {
    background-color: #f0f2f5;
}
.page-container {
    min-height: 100vh;
    background-color: #f0f2f5;
    padding-bottom: 140rpx;
}
/* 面板区域 */
.panel-section {
    padding: 24rpx;
}
.panel {
    background-color: #ffffff;
    border-radius: 12rpx;
    padding: 24rpx;
    box-shadow: 0 2rpx 12rpx 0 rgba(0, 0, 0, 0.05);
    margin-bottom: 24rpx;
}
.form-panel {
    padding: 10rpx 24rpx;
}
.form-label {
    display: flex;
    align-items: center;
    height: 100%;
    padding-right: 20rpx;
}
.label-text {
    font-size: 28rpx;
    color: #606266;
    white-space: nowrap;
    line-height: 1;
}
.input-wrap {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
}
::v-deep .u-form-item__body {
    align-items: center !important;
    padding: 10rpx 0 !important;
}
::v-deep .u-form-item__body__left {
    align-items: center !important;
    margin-bottom: 0 !important;
}
/* 列表区域 */
.list-section {
    padding: 0 24rpx;
}
.list-header {
    display: flex;
    align-items: center;
    margin-bottom: 24rpx;
}
.title-indicator {
    width: 6rpx;
    height: 30rpx;
    background-color: #409eff;
    border-radius: 4rpx;
    margin-right: 16rpx;
}
.header-title {
    font-size: 30rpx;
    color: #303133;
    font-weight: 600;
}
.review-status {
    font-size: 24rpx;
    color: #909399;
}
/* 卡片样式 */
.mat-card {
    display: flex;
    flex-direction: column;
}
.card-top {
    display: flex;
    align-items: center;
    justify-content: space-between;
    border-bottom: 1px solid #ebeef5;
    padding-bottom: 16rpx;
    margin-bottom: 16rpx;
}
.card-index {
    background-color: #409eff;
    color: #fff;
    width: 40rpx;
    height: 40rpx;
    border-radius: 50%;
    text-align: center;
    line-height: 40rpx;
    font-size: 24rpx;
    margin-right: 16rpx;
}
.mat-code {
    font-size: 32rpx;
    font-weight: 600;
    color: #303133;
}
.review-badge {
    padding: 4rpx 12rpx;
    border-radius: 16rpx;
}
.reviewed {
    background: #67c23a;
}
.unreviewed {
    background: #909399;
}
.badge-text {
    font-size: 22rpx;
    color: #ffffff;
}
.card-content {
    display: flex;
    flex-direction: column;
}
.info-row {
    display: flex;
    justify-content: space-between;
    margin-bottom: 12rpx;
}
.info-col {
    flex: 1;
    display: flex;
    align-items: center;
}
.info-label {
    color: #909399;
    font-size: 26rpx;
    width: 80rpx;
}
.info-value {
    color: #303133;
    font-size: 28rpx;
}
.highlight {
    color: #e6a23c;
}
.qty {
    color: #f56c6c;
    font-weight: bold;
}
.card-actions {
    display: flex;
    justify-content: flex-end;
    margin-top: 10rpx;
    border-top: 1px dashed #ebeef5;
    padding-top: 20rpx;
}
/* 底部操作条 */
.bottom-bar {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    background-color: #fff;
    box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
    display: flex;
    padding: 20rpx 24rpx;
    padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
    z-index: 99;
}
.btn-wrap {
    display: flex;
    flex: 1;
}
/* 弹窗样式 */
.popup-card {
    width: 600rpx;
    background-color: #fff;
    border-radius: 12rpx;
    padding: 40rpx 30rpx;
}
.popup-header {
    text-align: center;
    font-size: 32rpx;
    font-weight: bold;
    color: #303133;
    margin-bottom: 30rpx;
}
.popup-text-val {
    font-size: 28rpx;
    color: #606266;
}
.popup-footer {
    display: flex;
    margin-top: 40rpx;
}
</style>
pages/InManagement/OrderContainerBinding/NoMain/api.js
New file
@@ -0,0 +1,13 @@
const http = uni.$u.http
export const fetchOrderList = (params) => http.get('/pda/order/list', {
    params
})
export const fetchOrderDetlList = (data) => http.post('/pda/orderDetl/list', data)
export const searchOrderDetl = (params) => http.get('/orderDetl/search/pda/auth', {
    params
})
export const combOrder = (data) => http.post('/mobile/comb/auth', data)
pages/InManagement/OrderContainerBinding/NoMain/orderDetlList.vue
New file
@@ -0,0 +1,816 @@
<template>
    <view class="page-container">
        <!-- 头部导航 -->
        <u-navbar
            :title="$t('container.orderCombDetl') || '订单明细'"
            :fixed="true"
            :placeholder="true"
            bgColor="#ffffff"
            titleStyle="font-weight: 600; color: #303133; font-size: 32rpx;"
            autoBack
        >
            <template slot="right">
                <view
                    class="navbar-right"
                    @click="toggleMultiSelect"
                    style="padding: 10rpx"
                >
                    <text
                        :style="{
                            color: isMultiSelect ? '#409eff' : '#303133',
                            fontSize: '28rpx'
                        }"
                    >
                        {{
                            isMultiSelect
                                ? $t('common.cancel') || '取消'
                                : $t('common.multiSelect') || '多选'
                        }}
                    </text>
                </view>
            </template>
        </u-navbar>
        <!-- 搜索框 -->
        <u-sticky bgColor="#ffffff">
            <view class="search-bar">
                <u-search
                    v-model="condition"
                    :placeholder="$t('common.scanInputMat') || '扫码 / 输入物料'"
                    @search="search"
                    @custom="search"
                    @clear="onCancelSearch"
                    :showAction="true"
                    :actionText="$t('common.search') || '搜索'"
                    bgColor="#F5F5F5"
                    shape="round"
                ></u-search>
            </view>
        </u-sticky>
        <!-- 明细列表 -->
        <view class="detl-list">
            <view
                class="detl-card"
                :class="{ 'card-selected': selectedItems.includes(item) }"
                v-for="(item, index) in filterList"
                :key="index"
                @click="handleItemClick(item)"
            >
                <view
                    class="check-box"
                    v-if="isMultiSelect && item.enableQty > 0"
                >
                    <uni-icons
                        :type="
                            selectedItems.includes(item)
                                ? 'checkbox-filled'
                                : 'circle'
                        "
                        size="24"
                        :color="
                            selectedItems.includes(item) ? '#409eff' : '#dcdfe6'
                        "
                    ></uni-icons>
                </view>
                <view class="card-main">
                    <!-- 卡片头部 -->
                    <view class="card-header">
                        <view class="mat-info">
                            <text class="mat-code">{{ item.matnr }}</text>
                            <text class="mat-name">
                                {{ item.maktx || '-' }}
                            </text>
                        </view>
                        <view
                            class="qty-badge"
                            :class="
                                item.enableQty > 0
                                    ? 'badge-active'
                                    : 'badge-done'
                            "
                        >
                            <text class="qty-text">
                                {{ $t('container.remain') || '剩余' }}
                                {{ item.enableQty }}
                            </text>
                        </view>
                    </view>
                    <!-- 卡片内容 -->
                    <view class="card-body">
                        <view class="info-grid">
                            <view class="info-item">
                                <text class="info-label">
                                    {{ $t('container.orderNo') || '单据号' }}
                                </text>
                                <text class="info-value">
                                    {{ item.orderNo || '-' }}
                                </text>
                            </view>
                            <view class="info-item">
                                <text class="info-label">
                                    {{ $t('container.specs') || '规格' }}
                                </text>
                                <text class="info-value">
                                    {{ item.specs || '-' }}
                                </text>
                            </view>
                            <view class="info-item">
                                <text class="info-label">
                                    {{ $t('container.batch') || '批次' }}
                                </text>
                                <text class="info-value">
                                    {{ item.batch || '-' }}
                                </text>
                            </view>
                            <view class="info-item">
                                <text class="info-label">
                                    {{ $t('container.orderQty') || '订单数量' }}
                                </text>
                                <text class="info-value highlight">
                                    {{ item.anfme }}
                                </text>
                            </view>
                            <view class="info-item">
                                <text class="info-label">
                                    {{
                                        $t('container.completedQty') || '已完成'
                                    }}
                                </text>
                                <text class="info-value">
                                    {{ item.anfme - item.enableQty }}
                                </text>
                            </view>
                        </view>
                        <!-- 进度条 -->
                        <view class="progress-wrap">
                            <view class="progress-bar">
                                <view
                                    class="progress-fill"
                                    :style="{ width: getProgress(item) + '%' }"
                                ></view>
                            </view>
                            <text class="progress-text">
                                {{ getProgress(item) }}%
                            </text>
                        </view>
                    </view>
                    <!-- 卡片底部 -->
                    <view
                        class="card-footer"
                        v-if="item.enableQty > 0"
                    >
                        <text class="action-text">
                            {{ $t('container.clickToComb') || '点击组托入库' }}
                        </text>
                        <uni-icons
                            type="right"
                            size="14"
                            color="#667eea"
                        ></uni-icons>
                    </view>
                    <view
                        class="card-footer card-footer-done"
                        v-else
                    >
                        <text class="done-text">
                            {{ $t('container.completed') || '已完成' }}
                        </text>
                        <uni-icons
                            type="checkmarkempty"
                            size="14"
                            color="#28a745"
                        ></uni-icons>
                    </view>
                </view>
            </view>
        </view>
        <!-- 空状态 -->
        <view
            class="empty-state"
            v-if="filterList.length === 0 && !loading"
        >
            <u-empty
                mode="list"
                :text="$t('container.emptyDetl') || '暂无明细数据'"
                marginTop="40"
            ></u-empty>
        </view>
        <!-- 统计信息 -->
        <view
            class="stats-bar"
            v-if="menuList.length > 0 && !isMultiSelect"
        >
            <view class="stats-item">
                <text class="stats-value">{{ menuList.length }}</text>
                <text class="stats-label">
                    {{ $t('container.totalDetl') || '总明细' }}
                </text>
            </view>
            <view class="stats-divider"></view>
            <view class="stats-item">
                <text class="stats-value">{{ pendingCount }}</text>
                <text class="stats-label">
                    {{ $t('container.pending') || '待处理' }}
                </text>
            </view>
            <view class="stats-divider"></view>
            <view class="stats-item">
                <text class="stats-value">{{ completedCount }}</text>
                <text class="stats-label">
                    {{ $t('container.completed') || '已完成' }}
                </text>
            </view>
        </view>
        <!-- 多选操作底部 -->
        <view
            class="multi-action-bar"
            v-if="isMultiSelect"
        >
            <view
                class="select-all"
                @click="toggleSelectAll"
            >
                <uni-icons
                    :type="isAllSelected ? 'checkbox-filled' : 'circle'"
                    size="24"
                    :color="isAllSelected ? '#409eff' : '#909399'"
                ></uni-icons>
                <text class="select-all-text">
                    {{ $t('common.selectAll') || '全选' }}
                </text>
            </view>
            <view class="selected-count">
                <text>{{ $t('common.selected') || '已选' }}</text>
                <text class="count-num">{{ selectedItems.length }}</text>
            </view>
            <u-button
                type="primary"
                :disabled="selectedItems.length === 0"
                :text="$t('container.clickToComb') || '点击组托入库'"
                @click="submitMultiSelected"
                customStyle="width: 240rpx; margin: 0; height: 72rpx;"
            ></u-button>
        </view>
    </view>
</template>
<script>
import { fetchOrderDetlList, searchOrderDetl } from './api.js'
export default {
    data() {
        return {
            data: '',
            condition: '',
            menuList: [],
            loading: false,
            isMultiSelect: false,
            selectedItems: []
        }
    },
    computed: {
        // 过滤后的列表(优先显示有剩余数量的)
        filterList() {
            if (!this.condition.trim()) {
                // 排序:有剩余数量的排前面
                return [...this.menuList].sort((a, b) => {
                    if (a.enableQty > 0 && b.enableQty <= 0) return -1
                    if (a.enableQty <= 0 && b.enableQty > 0) return 1
                    return 0
                })
            }
            const keyword = this.condition.toLowerCase()
            return this.menuList.filter((item) => {
                return (
                    (item.matnr &&
                        item.matnr.toLowerCase().includes(keyword)) ||
                    (item.maktx &&
                        item.maktx.toLowerCase().includes(keyword)) ||
                    (item.batch && item.batch.toLowerCase().includes(keyword))
                )
            })
        },
        // 待处理数量
        pendingCount() {
            return this.menuList.filter((item) => item.enableQty > 0).length
        },
        // 已完成数量
        completedCount() {
            return this.menuList.filter((item) => item.enableQty <= 0).length
        },
        // 是否全选了可选的明细
        isAllSelected() {
            const availableItems = this.filterList.filter(
                (item) => item.enableQty > 0
            )
            if (availableItems.length === 0) return false
            return availableItems.length === this.selectedItems.length
        }
    },
    onLoad() {
        // 页面初始化
    },
    onShow() {
        this.getOrderNoList()
        // 获取开多选设置
        let settings = uni.getStorageSync('appSettings')
        if (settings && settings.orderDetlMultiSelect) {
            this.isMultiSelect = true
        } else {
            this.isMultiSelect = false
        }
        // 重置多选状态
        this.selectedItems = []
    },
    methods: {
        // 计算进度
        getProgress(item) {
            if (!item.anfme || item.anfme === 0) return 0
            const progress = (
                ((item.anfme - item.enableQty) / item.anfme) *
                100
            ).toFixed(0)
            return Math.min(100, Math.max(0, progress))
        },
        // 搜索
        async search() {
            let that = this
            that.loading = true
            try {
                const { code, data, msg } = await searchOrderDetl({
                    condition: this.condition
                })
                if (code === 200) {
                    that.menuList = data || []
                } else if (code === 403) {
                    uni.showToast({ title: msg, icon: 'none', position: 'top' })
                    setTimeout(() => {
                        uni.reLaunch({ url: '/pages/login/login' })
                    }, 1000)
                } else {
                    uni.showToast({ title: msg, icon: 'none', position: 'top' })
                }
            } catch (err) {
                console.error(err)
                uni.showToast({
                    title: this.$t('toast.searchFail') || '搜索请求失败',
                    icon: 'none',
                    position: 'top'
                })
            } finally {
                that.loading = false
            }
        },
        // 取消搜索
        onCancelSearch() {
            this.condition = ''
            this.getOrderNoList()
        },
        // 获取全部订单明细列表
        async getOrderNoList() {
            let that = this
            that.loading = true
            try {
                const { code, data, msg } = await fetchOrderDetlList({})
                if (code === 200) {
                    that.menuList = data || []
                } else if (code === 403) {
                    uni.showToast({ title: msg, icon: 'none', position: 'top' })
                    setTimeout(() => {
                        uni.reLaunch({ url: '/pages/login/login' })
                    }, 1000)
                } else {
                    uni.showToast({
                        title:
                            msg ||
                            this.$t('toast.fetchDetailFail') ||
                            '获取明细失败',
                        icon: 'none',
                        position: 'top'
                    })
                    that.menuList = data || []
                }
            } catch (err) {
                console.error(err)
                uni.showToast({
                    title: this.$t('toast.fetchDetailFail') || '获取明细失败',
                    icon: 'none',
                    position: 'top'
                })
            } finally {
                that.loading = false
            }
        },
        // 切换多选模式
        toggleMultiSelect() {
            this.isMultiSelect = !this.isMultiSelect
            if (!this.isMultiSelect) {
                this.selectedItems = []
            }
        },
        // 全选/取消全选
        toggleSelectAll() {
            const availableItems = this.filterList.filter(
                (item) => item.enableQty > 0
            )
            if (this.isAllSelected) {
                this.selectedItems = []
            } else {
                this.selectedItems = [...availableItems]
            }
        },
        // 处理列表项点击
        handleItemClick(item) {
            if (this.isMultiSelect) {
                if (item.enableQty <= 0) {
                    uni.showToast({
                        title:
                            this.$t('toast.detailCompleted') || '该明细已完成',
                        icon: 'none',
                        position: 'top'
                    })
                    return
                }
                const index = this.selectedItems.findIndex(
                    (selected) => selected === item
                )
                if (index > -1) {
                    this.selectedItems.splice(index, 1)
                } else {
                    this.selectedItems.push(item)
                }
            } else {
                this.chose(item)
            }
        },
        // 选择明细进行组托(单选)
        chose(item) {
            if (item.enableQty <= 0) {
                uni.showToast({
                    title: this.$t('toast.detailCompleted') || '该明细已完成',
                    icon: 'none',
                    position: 'top'
                })
                return
            }
            uni.navigateTo({
                url: '/pages/InManagement/OrderContainerBinding/NoMain/Order_Container_Binding',
                success: function (res) {
                    res.eventChannel.emit('orderItem', {
                        item: item
                    })
                }
            })
        },
        // 多选提交
        submitMultiSelected() {
            if (this.selectedItems.length === 0) return
            let that = this
            uni.navigateTo({
                url: '/pages/InManagement/OrderContainerBinding/NoMain/Order_Container_Binding',
                success: function (res) {
                    // 传递 items 数组,Order_Container_Binding 能够接收
                    res.eventChannel.emit('orderItem', {
                        items: that.selectedItems
                    })
                    that.isMultiSelect = false
                    that.selectedItems = []
                }
            })
        }
    }
}
</script>
<style lang="scss" scoped>
/* 引入公共样式 */
@import url('@/static/css/common.css');
.page-container {
    min-height: 100vh;
    background-color: #f0f2f5;
    padding-bottom: 120rpx;
}
/* 订单头部 */
.order-header {
    background-color: #ffffff;
    padding: 24rpx 28rpx;
    box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05);
    margin-bottom: 16rpx;
}
.header-content {
    background: #f8f9fa;
    border-radius: 12rpx;
    padding: 16rpx 20rpx;
    border: 1px solid #ebeef5;
}
.header-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 6rpx 0;
}
.header-label {
    font-size: 26rpx;
    color: #909399;
}
.header-value {
    font-size: 28rpx;
    color: #303133;
    font-weight: 600;
}
/* 搜索栏 */
.search-bar {
    padding: 20rpx 24rpx;
    background: #ffffff;
    box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.04);
    z-index: 100;
}
/* 明细列表 */
.detl-list {
    padding: 0 20rpx;
}
.detl-card {
    background: #ffffff;
    border-radius: 16rpx;
    margin-top: 24rpx;
    box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05);
    overflow: hidden;
    transition: transform 0.2s ease, box-shadow 0.2s ease;
    border: 2rpx solid transparent;
    display: flex;
    align-items: center;
}
.detl-card.card-selected {
    border-color: #409eff;
    background-color: #f0f7ff;
}
.detl-card.card-selected .card-header {
    background-color: transparent;
}
.check-box {
    padding: 0 20rpx;
    display: flex;
    align-items: center;
    justify-content: center;
}
.card-main {
    flex: 1;
    min-width: 0;
}
.detl-card:active {
    transform: scale(0.98);
    box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.12);
}
/* 卡片头部 */
.card-header {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    padding: 24rpx 28rpx;
    background-color: transparent;
    border-bottom: 1px solid #ebeef5;
}
.mat-info {
    flex: 1;
    padding-right: 12rpx;
}
.mat-code {
    font-size: 28rpx;
    color: #303133;
    font-weight: 600;
    display: block;
}
.mat-name {
    font-size: 24rpx;
    color: #909399;
    margin-top: 6rpx;
    display: block;
}
.qty-badge {
    padding: 6rpx 16rpx;
    border-radius: 20rpx;
    flex-shrink: 0;
}
.badge-active {
    background: #409eff;
}
.badge-done {
    background: #e8f5e9;
}
.qty-text {
    font-size: 22rpx;
    font-weight: 500;
    color: #ffffff;
}
.badge-done .qty-text {
    color: #28a745;
}
/* 卡片内容 */
.card-body {
    padding: 20rpx 28rpx;
}
.info-grid {
    display: flex;
    flex-wrap: wrap;
}
.info-item {
    width: 50%;
    margin-bottom: 12rpx;
}
.info-label {
    font-size: 24rpx;
    color: #909399;
    display: block;
}
.info-value {
    font-size: 26rpx;
    color: #303133;
    font-weight: 500;
    display: block;
    margin-top: 4rpx;
}
.info-value.highlight {
    color: #667eea;
    font-weight: 600;
}
/* 进度条 */
.progress-wrap {
    display: flex;
    align-items: center;
    margin-top: 16rpx;
}
.progress-bar {
    flex: 1;
    height: 10rpx;
    background: #e8e8e8;
    border-radius: 6rpx;
    overflow: hidden;
}
.progress-fill {
    height: 100%;
    background: #409eff;
    border-radius: 6rpx;
    transition: width 0.3s ease;
}
.progress-text {
    font-size: 22rpx;
    color: #909399;
    margin-left: 16rpx;
    min-width: 50rpx;
    text-align: right;
}
/* 卡片底部 */
.card-footer {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    padding: 20rpx 28rpx;
    border-top: 1rpx dashed #ebeef5;
}
.card-footer-done {
    background: #f0fff4;
}
.action-text {
    font-size: 26rpx;
    color: #409eff;
    margin-right: 8rpx;
    font-weight: 500;
}
.done-text {
    font-size: 26rpx;
    color: #28a745;
    margin-right: 8rpx;
}
/* 空状态 */
.empty-state {
    padding: 60rpx 0;
}
/* 统计栏 */
.stats-bar {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    display: flex;
    align-items: center;
    justify-content: space-around;
    background: #ffffff;
    padding: 24rpx 0;
    box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.05);
    padding-bottom: calc(24rpx + env(safe-area-inset-bottom));
}
.stats-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    flex: 1;
}
.stats-value {
    font-size: 34rpx;
    color: #303133;
    font-weight: 600;
}
.stats-label {
    font-size: 22rpx;
    color: #909399;
    margin-top: 6rpx;
}
.stats-divider {
    width: 2rpx;
    height: 60rpx;
    background: #ebeef5;
}
/* 多选操作底部 */
.multi-action-bar {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    background: #ffffff;
    padding: 24rpx 30rpx;
    padding-bottom: calc(24rpx + env(safe-area-inset-bottom));
    box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.05);
    display: flex;
    align-items: center;
    justify-content: space-between;
    z-index: 100;
}
.select-all {
    display: flex;
    align-items: center;
}
.select-all-text {
    font-size: 28rpx;
    color: #303133;
    margin-left: 10rpx;
}
.selected-count {
    flex: 1;
    text-align: right;
    margin-right: 30rpx;
    font-size: 28rpx;
    color: #606266;
}
.count-num {
    color: #409eff;
    font-weight: 600;
    font-size: 32rpx;
}
</style>
pages/InManagement/Order_Pallet_Building.nvue
File was deleted
pages/home/home.vue
@@ -8,6 +8,8 @@
            bgColor="#ffffff"
            titleStyle="font-weight: 600; color: #303133; font-size: 32rpx;"
            leftIcon=""
            rightIcon="setting"
            @rightClick="openSettings"
        ></u-navbar>
        <!-- 欢迎信息 / 用户信息 -->
@@ -99,7 +101,9 @@
                    <view class="category-header">
                        <view class="category-title-wrapper">
                            <view class="title-indicator"></view>
                            <text class="category-title">{{ $t('category.other') }}</text>
                            <text class="category-title">
                                {{ $t('category.other') }}
                            </text>
                        </view>
                    </view>
                    <view class="category-body">
@@ -202,7 +206,7 @@
                    name: 'orderPakin',
                    color: 'purple',
                    cuIcon: '',
                    url: '/order/orderList'
                    url: '/InManagement/OrderContainerBinding/Main/orderList'
                },
                {
                    title: this.$t('index.agv_start'),
@@ -296,7 +300,8 @@
                'pakin_category',
                'agv_category',
                'stock_category'
            ]
            ],
            orderPakinRequiresMainList: false
        }
    },
    computed: {
@@ -330,6 +335,15 @@
    onShow() {
        this.baseUrl = uni.getStorageSync('baseUrl')
        this.token = uni.getStorageSync('token')
        // 获取开多选设置
        let settings = uni.getStorageSync('appSettings')
        if (settings && settings.orderPakinRequiresMainList) {
            this.orderPakinRequiresMainList = true
        } else {
            this.orderPakinRequiresMainList = false
        }
        this.getAuth()
    },
    methods: {
@@ -364,6 +378,12 @@
            }
            return map[colorStr] || '#409eff'
        },
        // 跳转到设置页
        openSettings() {
            uni.navigateTo({
                url: '/pages/settings/settings'
            })
        },
        // 跳转页面
        navigateTo(item) {
            if (item.name === 'logOut') {
@@ -372,8 +392,19 @@
                })
                return
            }
            // 拦截订单入库菜单,根据设置项跳转
            let targetUrl = item.url
            if (item.name === 'orderPakin' || item.name === this.$t('index.orderPakin')) {
                if (this.orderPakinRequiresMainList) {
                    targetUrl = '/InManagement/OrderContainerBinding/Main/orderList'
                } else {
                    targetUrl = '/InManagement/OrderContainerBinding/NoMain/orderDetlList'
                }
            }
            uni.navigateTo({
                url: '/pages' + item.url
                url: '/pages' + targetUrl
            })
        },
        async getAuth() {
@@ -386,11 +417,7 @@
                )
                this.elements = []
                if (
                    data == undefined ||
                    data == null ||
                    data === ''
                ) {
                if (data == undefined || data == null || data === '') {
                    this.elements = this.elements2
                    return
                }
pages/login/index.nvue
File was deleted
pages/settings/settings.vue
New file
@@ -0,0 +1,218 @@
<template>
    <view class="page-container">
        <u-navbar
            :title="$t('settings.title')"
            :fixed="true"
            :placeholder="true"
            :autoBack="true"
            bgColor="#ffffff"
            titleStyle="font-weight: 600; color: #303133; font-size: 32rpx;"
        ></u-navbar>
        <view class="content">
            <u-cell-group :border="false">
                <u-cell
                    v-for="(item, index) in settingsList"
                    :key="index"
                    :title="item.title"
                    :border="true"
                    size="large"
                    titleStyle="font-size: 30rpx; color: #333333;"
                >
                    <view
                        slot="icon"
                        :class="['cell-icon-wrap', item.iconBgColor]"
                    >
                        <u-icon
                            :name="item.iconName"
                            color="#ffffff"
                            size="20"
                        ></u-icon>
                    </view>
                    <!-- 开关类型设置项 -->
                    <view slot="value" v-if="item.type === 'switch'">
                        <u-switch
                            v-model="appSettings[item.key]"
                            @change="saveSettings"
                            size="24"
                            activeColor="#2979ff"
                        ></u-switch>
                    </view>
                    <!-- 输入框类型设置项 -->
                    <view slot="value" v-else-if="item.type === 'input'" style="width: 200rpx;" @tap.stop>
                        <u--input
                            v-model="appSettings[item.key]"
                            @blur="saveSettings"
                            border="none"
                            inputAlign="right"
                            :placeholder="$t('settings.inputPlaceholder')"
                        ></u--input>
                    </view>
                    <!-- 数字输入框类型设置项 -->
                    <view slot="value" v-else-if="item.type === 'number'" style="width: 200rpx;" @tap.stop>
                        <u--input
                            type="number"
                            v-model="appSettings[item.key]"
                            @blur="saveSettings"
                            border="none"
                            inputAlign="right"
                            :placeholder="$t('settings.inputPlaceholder')"
                        ></u--input>
                    </view>
                    <!-- 图标/箭头类型(例如跳转其它设置页) -->
                    <!-- 可以根据需要扩展 v-else-if="item.type === 'link'" -->
                </u-cell>
                <!-- 如果需要配置更多设置项,可以参考下方的样式结构 -->
                <!--
                <u-cell
                    title="其他设置"
                    :border="true"
                    :isLink="true"
                    size="large"
                    titleStyle="font-size: 30rpx; color: #333333;"
                >
                    <view slot="icon" class="cell-icon-wrap bg-yellow">
                        <u-icon name="setting" color="#ffffff" size="20"></u-icon>
                    </view>
                </u-cell>
                -->
            </u-cell-group>
        </view>
    </view>
</template>
<script>
export default {
    data() {
        return {
            appSettings: {
                orderReviewRequired: false,
                orderPakinRequiresMainList: false,
                orderDetlMultiSelect: false,
                orderCombNeedSplit: true,
                orderCombSeparator: ';',
                orderCombArrayIndex: 0,
                orderCombStartPos: 3
            }
        }
    },
    computed: {
        settingsList() {
            return [
                {
                    key: 'orderReviewRequired',
                    title: this.$t('settings.orderReviewRequired'),
                    iconName: 'checkbox-mark',
                    iconBgColor: 'bg-blue',
                    type: 'switch'
                },
                {
                    key: 'orderPakinRequiresMainList',
                    title: this.$t('settings.orderPakinRequiresMainList'),
                    iconName: 'list',
                    iconBgColor: 'bg-green',
                    type: 'switch'
                },
                {
                    key: 'orderDetlMultiSelect',
                    title: this.$t('settings.orderDetlMultiSelect'),
                    iconName: 'list-dot',
                    iconBgColor: 'bg-yellow',
                    type: 'switch'
                },
                {
                    key: 'orderCombNeedSplit',
                    title: this.$t('settings.orderCombNeedSplit'),
                    iconName: 'cut',
                    iconBgColor: 'bg-blue',
                    type: 'switch'
                },
                {
                    key: 'orderCombSeparator',
                    title: this.$t('settings.orderCombSeparator'),
                    iconName: 'minus',
                    iconBgColor: 'bg-yellow',
                    type: 'input'
                },
                {
                    key: 'orderCombArrayIndex',
                    title: this.$t('settings.orderCombArrayIndex'),
                    iconName: 'grid-fill',
                    iconBgColor: 'bg-blue',
                    type: 'number'
                },
                {
                    key: 'orderCombStartPos',
                    title: this.$t('settings.orderCombStartPos'),
                    iconName: 'play-right-fill',
                    iconBgColor: 'bg-green',
                    type: 'number'
                }
            ]
        }
    },
    onShow() {
        const settings = uni.getStorageSync('appSettings')
        if (settings) {
            this.appSettings = { ...this.appSettings, ...settings }
        } else {
            // 兼容或迁移旧的设置读取逻辑
            const oldSetting = uni.getStorageSync('orderReviewRequired')
            if (oldSetting !== '') {
                this.appSettings.orderReviewRequired = oldSetting
                this.saveSettings()
            }
        }
    },
    methods: {
        saveSettings() {
            uni.setStorageSync('appSettings', this.appSettings)
        }
    }
}
</script>
<style>
page {
    background: #f0f2f5;
}
.page-container {
    min-height: 100vh;
    background-color: #f0f2f5;
}
.content {
    margin-top: 20rpx;
    background-color: #ffffff;
}
/* 左侧图标外层方块背景 */
.cell-icon-wrap {
    width: 52rpx;
    height: 52rpx;
    border-radius: 12rpx;
    display: flex;
    justify-content: center;
    align-items: center;
    margin-right: 20rpx;
}
/* 定义几种颜色匹配截图里不同状态的图标底色 */
.bg-blue {
    background-color: #7ec3fa;
}
.bg-yellow {
    background-color: #f8c158;
}
.bg-green {
    background-color: #63d98f;
}
</style>
unpackage/dist/dev/app-plus/app-config-service.js
@@ -1,8 +1,8 @@
var isReady=false;var onReadyCallbacks=[];
var isServiceReady=false;var onServiceReadyCallbacks=[];
var __uniConfig = {"pages":["pages/login/login","pages/home/home","pages/InManagement/ContainerBinding/Container_Binding","pages/mat/matSelected","pages/InManagement/Order_Pallet_Building"],"window":{"navigationBarTextStyle":"black","navigationBarTitleText":"uni-app","navigationBarBackgroundColor":"#F8F8F8","backgroundColor":"#F8F8F8","animationType":"pop-in","animationDuration":150},"darkmode":false,"nvueCompiler":"uni-app","nvueStyleCompiler":"uni-app","renderer":"auto","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":false},"appname":"pda2.0","compilerVersion":"4.87","entryPagePath":"pages/login/login","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"locale":"","fallbackLocale":"en","locales":{"en":{"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":{},"settings":{"title":"Settings","ip":"IP Address","port":"Port","project":"Project Name","saved":"Settings Saved","authTitle":"Authentication","inputAuthPwd":"Enter Admin Password","authError":"Incorrect Password"},"common":{"confirm":"Confirm","cancel":"Cancel"}},"ja":{"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":"成功を追加","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":"送信"},"zh-Hans":{"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单号"},"settings":{"title":"设置","ip":"IP地址","port":"端口","project":"项目名","saved":"设置已保存","authTitle":"身份验证","inputAuthPwd":"请输入管理员密码","authError":"密码错误"},"common":{"confirm":"确认","cancel":"取消"}},"zh-Hant":{"locale.auto":"系統","locale.en":"English","locale.zh-hans":"简体中文","locale.zh-hant":"繁體中文","locale.ja":"日语","index.title":"Hello i18n","index.home":"主頁","login.login":"登录"}}};
var __uniRoutes = [{"path":"/pages/login/login","meta":{"isQuit":true},"window":{"navigationBarTitleText":"","navigationStyle":"custom"}},{"path":"/pages/home/home","meta":{},"window":{"navigationBarTitleText":"首页","navigationStyle":"custom"}},{"path":"/pages/InManagement/ContainerBinding/Container_Binding","meta":{},"window":{"navigationBarTitleText":"容器绑定","navigationStyle":"custom"}},{"path":"/pages/mat/matSelected","meta":{},"window":{"navigationBarTitleText":"物料编辑","navigationStyle":"custom"}},{"path":"/pages/InManagement/Order_Pallet_Building","meta":{"isNVue":true},"window":{"navigationBarTitleText":"uni-app"}}];
var __uniConfig = {"pages":["pages/login/login","pages/home/home","pages/InManagement/ContainerBinding/Container_Binding","pages/mat/matSelected","pages/InManagement/OrderContainerBinding/Main/orderList","pages/InManagement/OrderContainerBinding/Main/orderDetlList","pages/InManagement/OrderContainerBinding/Main/Order_Container_Binding","pages/InManagement/OrderContainerBinding/NoMain/orderDetlList","pages/InManagement/OrderContainerBinding/NoMain/Order_Container_Binding","pages/settings/settings"],"window":{"navigationBarTextStyle":"black","navigationBarTitleText":"uni-app","navigationBarBackgroundColor":"#F8F8F8","backgroundColor":"#F8F8F8","animationType":"pop-in","animationDuration":150},"darkmode":false,"nvueCompiler":"uni-app","nvueStyleCompiler":"uni-app","renderer":"auto","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":false},"appname":"pda2.0","compilerVersion":"4.87","entryPagePath":"pages/login/login","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"locale":"","fallbackLocale":"en","locales":{"en":{"app":{"name":"ZoneYung WMS"},"locale":{"auto":"System","en":"English","zh-hans":"简体中文","zh-hant":"繁体中文","ja":"日语"},"index":{"title":"Hello i18n","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","workplace":"Zoneyung Workspace","welcomeBack":"Welcome Back","systemName":"Zoneyung AS/RS WMS System","pakin":"Palletizing","orderPakin":"Order Inbound","agv_start":"AGV Container Inbound","agv_back":"AGV Container Return","stockQuery":"Stock Query","logOut":"Logout","copyright":"Copyright © 2022 Zhejiang Zoneyung AS/RS Co., Ltd. All rights reserved.","noAuth":"No permissions or login expired"},"page":{"login":"Login","index":"Index"},"login":{"login":"login","loging":"loging","user":"username","pwd":"password","inputUser":"Please enter your account","inputPwd":"Please enter your password","remPwd":"remember password"},"other":{},"settings":{"title":"Settings","ip":"IP Address","port":"Port","project":"Project Name","saved":"Settings Saved","authTitle":"Authentication","inputAuthPwd":"Enter Admin Password","authError":"Incorrect Password","orderReviewRequired":"Order Container Binding Review Required","orderPakinRequiresMainList":"Order Inbound Requires Main List","orderDetlMultiSelect":"Order Details Page Default Multi-Select","orderCombNeedSplit":"Order Container Binding Split Needed","orderCombSeparator":"Order Container Binding Split Separator","orderCombArrayIndex":"Order Container Binding Split Array Index","orderCombStartPos":"Order Container Binding Split Start","inputPlaceholder":"Please input"},"common":{"confirm":"Confirm","cancel":"Cancel","unknown":"Unknown","scanInput":"Scan / Input","scanInputMat":"Scan / Input Material","scanInputPallet":"Scan / Input Pallet","scanInputCarton":"Scan / Input Carton","loadMore":"Pull up to load more","loading":"Loading","noMore":"No more","search":"Search","multiSelect":"Multi-select","selectAll":"Select All","selected":"Selected"},"category":{"inbound":"Inbound Management","agv":"AGV Management","stock":"Stock Management","other":"Other Operations"},"container":{"title":"Palletizing","palletCode":"Pallet Code","matCode":"Material Code","scanPallet":"Scan / Enter Pallet Code","scanMat":"Scan / Enter Material Code","matList":"Material List","matName":"Name","matSpec":"Spec","matBatch":"Batch","matQty":"Quantity","modify":"Modify","remove":"Remove","reset":"Reset","confirmComb":"Confirm Combin.","emptyList":"No materials, please scan material code to add","modifyInfo":"Modify Info","code":"Code","confirmRemove":"Confirm Remove","removeMsg":"Remove this material?","confirmReset":"Confirm Reset","resetMsg":"Are you sure to clear all items?","combMsg":"Confirm to container binding?","orderComb":"Order Binding","orderCombDetl":"Order Details","order_container_binding_title":"Order Binding","orderNo":"Order No.","orderType":"Order Type","warehouse":"Warehouse","viewDetail":"View Detail","emptyOrder":"No Order Data","remain":"Remaining","specs":"Specification","batch":"Batch","orderQty":"Order Qty","completedQty":"Completed","clickToComb":"Click to Bind","completed":"Completed","emptyDetl":"No Detail Data","totalDetl":"Total Details","pending":"Pending","palletComb":"Pallet Binding","palletNo":"Pallet No.","cartonCode":"Carton Code","cancel":"Cancel","confirm":"Confirm","binding":"Binding","tips":"Tips","confirmDeleteRecord":"Confirm to delete this record?","scanOrder":"Scan / Input Order No.","scanMatReview":"Scan to Review","reviewed":"Reviewed","unreviewed":"Unreviewed","emptyMat":"No Details","noReviewReq":"No review required"},"toast":{"reviewSuccess":"Review Success","reviewFail":"Review Failed or Material Mismatch","inputOrderNo":"Please input order no.","emptyMat":"Details cannot be empty","detailCompleted":"This detail is completed","fetchDetailFail":"Failed to fetch details","searchFail":"Search request failed","palletError":"Pallet code error, please try again","queryFail":"Query failed","modifySuccess":"Modification successful","removeSuccess":"Removal successful","scanPalletCode":"Please scan pallet code","qtyNotZero":"Palletizing quantity cannot be 0","qtyNotZeroMat":"{0} palletizing quantity cannot be 0","combSuccess":"Palletizing successful","combFail":"Palletizing failed","resetComplete":"Reset complete","inputQty":"Please enter quantity"},"matSelected":{"title":"Material Info","matDetail":"Material Details","matCode":"Material Code","matName":"Material Name","spec":"Spec","batch":"Batch","inputBatch":"Please enter batch","qty":"Quantity","confirmExtract":"Confirm Extract"}},"ja":{"locale":{"auto":"システム","en":"英語","zh-hans":"简体中文","zh-hant":"繁体中文","ja":"日语"},"index":{"title":"Hello i18n","home":"ホーム","component":"コンポーネント","api":"API","schema":"Schema","demo":"uni-app globalization","demo-description":"ユニフレームワーク、manifest.json、pages.json、タブバー、ページ、コンポーネント、APIを含める、Schema","detail":"詳細","language":"言語","language-info":"設定","system-language":"システム言語","application-language":"アプリケーション言語","language-change-confirm":"この設定を適用すると、アプリが再起動します","workplace":"Zoneyung 工作台","welcomeBack":"欢迎回来","systemName":"中扬立库 WMS 仓储管理系统","pakin":"组托","orderPakin":"订单入库","agv_start":"AGV容器入库","agv_back":"AGV容器回库","stockQuery":"库存查询","logOut":"退出登录","copyright":"copyright © 2022 浙江中扬立库有限公司 all rights reserved.","noAuth":"无权限或登录过期"},"api":{"message":"メッセージ"},"schema":{"add":"追加","add-success":"成功を追加"},"common":{"confirm":"確認","cancel":"取消","unknown":"未知","scanInput":"扫码 / 输入","scanInputMat":"スキャン / 資材入力","scanInputPallet":"スキャン / パレット入力","scanInputCarton":"スキャン / 箱コード入力","loadMore":"プルアップしてさらに読み込む","loading":"読み込み中","noMore":"これ以上ありません","search":"検索","multiSelect":"複数選択","selectAll":"すべて選択","selected":"選択済み"},"category":{"inbound":"入库管理","agv":"AGV管理","stock":"库存管理","other":"其他操作"},"settings":{"title":"設定","ip":"IP Address","port":"Port","project":"Project Name","saved":"Settings Saved","authTitle":"Authentication","inputAuthPwd":"Enter Admin Password","authError":"Incorrect Password","orderReviewRequired":"Order Container Binding Review Required","orderPakinRequiresMainList":"Order Inbound Requires Main List","orderDetlMultiSelect":"Order Details Page Default Multi-Select","orderCombNeedSplit":"オーダー結合 分割が必要","orderCombSeparator":"オーダー結合 分割区切り文字","orderCombArrayIndex":"オーダー結合 分割配列インデックス","orderCombStartPos":"オーダー結合 分割開始位置","inputPlaceholder":"入力してください"},"container":{"title":"组托","palletCode":"托盘码","matCode":"物料码","scanPallet":"扫码 / 输入托盘码","scanMat":"扫码 / 输入物料码","matList":"商品列表","matName":"品名","matSpec":"规格","matBatch":"批号","matQty":"数量","modify":"修改","remove":"移除","reset":"重置","confirmComb":"确认组托","emptyList":"暂无商品,请扫描物料码添加","modifyInfo":"修改信息","code":"编码","confirmRemove":"确认移除","removeMsg":"是否移除该商品?","confirmReset":"确认重置","resetMsg":"是否清空所有商品?","combMsg":"确认将商品组托入库?","orderComb":"オーダー結合","orderCombDetl":"オーダー詳細","order_container_binding_title":"オーダー結合","orderNo":"伝票番号","orderType":"伝票タイプ","warehouse":"倉庫","viewDetail":"詳細を見る","emptyOrder":"現在オーダーデータはありません","remain":"残り","specs":"仕様","batch":"バッチ","orderQty":"オーダー数量","completedQty":"完了済","clickToComb":"結合して入庫する","completed":"完了済","emptyDetl":"現在詳細データはありません","totalDetl":"詳細合計","pending":"処理待ち","palletComb":"商品結合","palletNo":"パレット番号","cartonCode":"箱コード","cancel":"キャンセル","confirm":"確認","binding":"結合バインディング","tips":"ヒント","confirmDeleteRecord":"この記録を削除してもよろしいですか?","scanOrder":"スキャン / 伝票番号入力","scanMatReview":"スキャン照合","reviewed":"照合済","unreviewed":"未照合","emptyMat":"詳細なし","noReviewReq":"照合不要"},"toast":{"reviewSuccess":"照合成功","reviewFail":"照合失敗または資材不一致","inputOrderNo":"伝票番号を入力してください","emptyMat":"詳細を空にすることはできません","detailCompleted":"この詳細は完了しました","fetchDetailFail":"詳細の取得に失敗しました","searchFail":"検索リクエストに失敗しました","palletError":"托盘码有误请重试","queryFail":"查询失败","modifySuccess":"修改成功","removeSuccess":"移除成功","scanPalletCode":"请扫描托盘条码","qtyNotZero":"组托数量不能为0","qtyNotZeroMat":"{0}组托数量不能为0","combSuccess":"组托成功","combFail":"组托失败","resetComplete":"重置完成","inputQty":"请输入数量"},"matSelected":{"title":"商品信息","matDetail":"物料详情","matCode":"商品编码","matName":"商品名称","spec":"规格","batch":"批号","inputBatch":"请输入批号","qty":"数量","confirmExtract":"确认提取"},"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":"送信"},"zh-Hans":{"app":{"name":"中扬 WMS"},"locale":{"auto":"系统","en":"English","zh-hans":"简体中文","zh-hant":"繁体中文","ja":"日语"},"index":{"title":"Hello i18n","home":"主页","GR":"单据收货","palletizing":"单据组托","palletBuilding":"组托解绑","inspectionRequest":"报检","qualityInspection":"质检","defectiveMarking":"不良标记","manualPutaway":"人工上架","stationBinding":"站点绑定","inboundInitiation":"启动入库","stationUnbinding":"站点解绑","bindAndInbound":"绑定&入库","quickPicking":"快速拣货","wavePick":"波次拣货","outLogin":"退出登录","language-change-confirm":"确定切换?","hello":"您好,欢迎登录WMS系统!","intro":"让制造与物流更高效","checkOrder":"盘点","workplace":"Zoneyung 工作台","welcomeBack":"欢迎回来","systemName":"中扬立库 WMS 仓储管理系统","pakin":"组托","orderPakin":"订单入库","agv_start":"AGV容器入库","agv_back":"AGV容器回库","stockQuery":"库存查询","logOut":"退出登录","copyright":"copyright © 2022 浙江中扬立库有限公司 all rights reserved.","noAuth":"无权限或登录过期"},"page":{"login":"登录","index":"首页"},"login":{"login":"登录","loging":"登录中","user":"账号","pwd":"密码","inputUser":"请输入账号","inputPwd":"请输入密码","remPwd":"记住密码"},"other":{"asnNo":"ASN单号"},"settings":{"title":"设置","ip":"IP地址","port":"端口","project":"项目名","saved":"设置已保存","authTitle":"身份验证","inputAuthPwd":"请输入管理员密码","authError":"密码错误","orderReviewRequired":"订单容器绑定页面是否需要复核","orderPakinRequiresMainList":"订单入库是否需要主表列表","orderDetlMultiSelect":"订单明细页面是否默认多选","orderCombNeedSplit":"组托材料是否需要分割","orderCombSeparator":"组托材料分隔符","orderCombArrayIndex":"组托材料分割后数组索引","orderCombStartPos":"组托材料起始位","inputPlaceholder":"请输入"},"common":{"confirm":"确认","cancel":"取消","unknown":"未知","scanInput":"扫码 / 输入","scanInputMat":"扫码 / 输入物料","scanInputPallet":"扫码 / 输入托盘","scanInputCarton":"扫码 / 输入箱码","loadMore":"上拉加载更多","loading":"加载中","noMore":"没有更多","search":"搜索","multiSelect":"多选","selectAll":"全选","selected":"已选"},"category":{"inbound":"入库管理","agv":"AGV管理","stock":"库存管理","other":"其他操作"},"container":{"title":"组托","palletCode":"托盘码","matCode":"物料码","scanPallet":"扫码 / 输入托盘码","scanMat":"扫码 / 输入物料码","matList":"商品列表","matName":"品名","matSpec":"规格","matBatch":"批号","matQty":"数量","modify":"修改","remove":"移除","reset":"重置","confirmComb":"确认组托","emptyList":"暂无商品,请扫描物料码添加","modifyInfo":"修改信息","code":"编码","confirmRemove":"确认移除","removeMsg":"是否移除该商品?","confirmReset":"确认重置","resetMsg":"是否清空所有商品?","combMsg":"确认将商品组托入库?","orderComb":"订单组托","orderCombDetl":"订单明细","order_container_binding_title":"订单组托","orderNo":"单据号","orderType":"单据类型","warehouse":"仓库","viewDetail":"查看详情","emptyOrder":"暂无订单数据","remain":"剩余","specs":"规格","batch":"批次","orderQty":"订单数量","completedQty":"已完成","clickToComb":"点击组托入库","completed":"已完成","emptyDetl":"暂无明细数据","totalDetl":"总明细","pending":"待处理","palletComb":"商品组托","palletNo":"托盘号","cartonCode":"箱码","cancel":"取消","confirm":"确定","binding":"组托绑定","tips":"提示","confirmDeleteRecord":"确认删除该条记录吗?","scanOrder":"扫码 / 输入单据号","scanMatReview":"扫码复核","reviewed":"已复核","unreviewed":"未复核","emptyMat":"暂无明细","noReviewReq":"无需复核"},"toast":{"reviewSuccess":"复核成功","reviewFail":"复核失败或物料不匹配","inputOrderNo":"请输入单据号","emptyMat":"明细不能为空","detailCompleted":"该明细已完成","fetchDetailFail":"获取明细失败","searchFail":"搜索请求失败","palletError":"托盘码有误请重试","queryFail":"查询失败","modifySuccess":"修改成功","removeSuccess":"移除成功","scanPalletCode":"请扫描托盘条码","qtyNotZero":"组托数量不能为0","qtyNotZeroMat":"{0}组托数量不能为0","combSuccess":"组托成功","combFail":"组托失败","resetComplete":"重置完成","inputQty":"请输入数量"},"matSelected":{"title":"商品信息","matDetail":"物料详情","matCode":"商品编码","matName":"商品名称","spec":"规格","batch":"批号","inputBatch":"请输入批号","qty":"数量","confirmExtract":"确认提取"}},"zh-Hant":{"locale":{"auto":"系統","en":"English","zh-hans":"简体中文","zh-hant":"繁體中文","ja":"日语"},"index":{"title":"Hello i18n","home":"主頁","workplace":"Zoneyung 工作台","welcomeBack":"欢迎回来","systemName":"中扬立库 WMS 仓储管理系统","pakin":"组托","orderPakin":"订单入库","agv_start":"AGV容器入库","agv_back":"AGV容器回库","stockQuery":"库存查询","logOut":"退出登录","copyright":"copyright © 2022 浙江中扬立库有限公司 all rights reserved.","noAuth":"无权限或登录过期"},"login":{"login":"登录"},"common":{"confirm":"確認","cancel":"取消","unknown":"未知","scanInput":"掃碼 / 輸入","scanInputMat":"掃碼 / 輸入物料","scanInputPallet":"掃碼 / 輸入托盤","scanInputCarton":"掃碼 / 輸入箱碼","loadMore":"上拉加載更多","loading":"加載中","noMore":"沒有更多","search":"搜索","multiSelect":"多選","selectAll":"全選","selected":"已選"},"category":{"inbound":"入库管理","agv":"AGV管理","stock":"库存管理","other":"其他操作"},"settings":{"title":"设置","orderReviewRequired":"Order_Container_Binding页面是否需要复核","orderPakinRequiresMainList":"訂單入库是否需要主表列表","orderDetlMultiSelect":"訂單明細頁面是否默認多選","orderCombNeedSplit":"組托材料是否需要分割","orderCombSeparator":"組托材料分隔符","orderCombArrayIndex":"組托材料分割後數組索引","orderCombStartPos":"組托材料起始位","inputPlaceholder":"請輸入"},"container":{"title":"组托","palletCode":"托盘码","matCode":"物料码","scanPallet":"扫码 / 输入托盘码","scanMat":"扫码 / 输入物料码","matList":"商品列表","matName":"品名","matSpec":"规格","matBatch":"批号","matQty":"数量","modify":"修改","remove":"移除","reset":"重置","confirmComb":"确认组托","emptyList":"暂无商品,请扫描物料码添加","modifyInfo":"修改信息","code":"编码","confirmRemove":"确认移除","removeMsg":"是否移除该商品?","confirmReset":"确认重置","resetMsg":"是否清空所有商品?","combMsg":"確認將商品組托入庫?","orderComb":"訂單組托","orderCombDetl":"訂單明細","order_container_binding_title":"訂單組托","orderNo":"單據號","orderType":"單據類型","warehouse":"倉庫","viewDetail":"查看詳情","emptyOrder":"暫無訂單數據","remain":"剩餘","specs":"規格","batch":"批次","orderQty":"訂單數量","completedQty":"已完成","clickToComb":"點擊組托入庫","completed":"已完成","emptyDetl":"暫無明細數據","totalDetl":"總明細","pending":"待處理","palletComb":"商品組托","palletNo":"托盤號","cartonCode":"箱碼","cancel":"取消","confirm":"確定","binding":"組托綁定","tips":"提示","confirmDeleteRecord":"確認刪除該條記錄嗎?","scanOrder":"掃碼 / 輸入單據號","scanMatReview":"掃碼復核","reviewed":"已復核","unreviewed":"未復核","emptyMat":"暫無明細","noReviewReq":"無需復核"},"toast":{"reviewSuccess":"復核成功","reviewFail":"復核失敗或物料不匹配","inputOrderNo":"請輸入單據號","emptyMat":"明細不能為空","detailCompleted":"該明細已完成","fetchDetailFail":"獲取明細失敗","searchFail":"搜索請求失敗","palletError":"托盘码有误请重试","queryFail":"查询失败","modifySuccess":"修改成功","removeSuccess":"移除成功","scanPalletCode":"请扫描托盘条码","qtyNotZero":"组托数量不能为0","qtyNotZeroMat":"{0}组托数量不能为0","combSuccess":"组托成功","combFail":"组托失败","resetComplete":"重置完成","inputQty":"请输入数量"},"matSelected":{"title":"商品信息","matDetail":"物料详情","matCode":"商品编码","matName":"商品名称","spec":"规格","batch":"批号","inputBatch":"请输入批号","qty":"数量","confirmExtract":"确认提取"}}}};
var __uniRoutes = [{"path":"/pages/login/login","meta":{"isQuit":true},"window":{"navigationBarTitleText":"","navigationStyle":"custom"}},{"path":"/pages/home/home","meta":{},"window":{"navigationBarTitleText":"%index.home%","navigationStyle":"custom"}},{"path":"/pages/InManagement/ContainerBinding/Container_Binding","meta":{},"window":{"navigationBarTitleText":"%container.title%","navigationStyle":"custom"}},{"path":"/pages/mat/matSelected","meta":{},"window":{"navigationBarTitleText":"%matSelected.title%","navigationStyle":"custom"}},{"path":"/pages/InManagement/OrderContainerBinding/Main/orderList","meta":{},"window":{"navigationBarTitleText":"%container.orderComb%","navigationStyle":"custom"}},{"path":"/pages/InManagement/OrderContainerBinding/Main/orderDetlList","meta":{},"window":{"navigationBarTitleText":"%container.orderCombDetl%","navigationStyle":"custom"}},{"path":"/pages/InManagement/OrderContainerBinding/Main/Order_Container_Binding","meta":{},"window":{"navigationBarTitleText":"%container.order_container_binding_title%","navigationStyle":"custom"}},{"path":"/pages/InManagement/OrderContainerBinding/NoMain/orderDetlList","meta":{},"window":{"navigationBarTitleText":"%container.orderCombDetl%","navigationStyle":"custom"}},{"path":"/pages/InManagement/OrderContainerBinding/NoMain/Order_Container_Binding","meta":{},"window":{"navigationBarTitleText":"%container.order_container_binding_title%","navigationStyle":"custom"}},{"path":"/pages/settings/settings","meta":{},"window":{"navigationBarTitleText":"%settings.title%","navigationStyle":"custom"}}];
__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:Math.round(f/20)})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:void 0,window:void 0,document:void 0,frames:void 0,self:void 0,location:void 0,navigator:void 0,localStorage:void 0,history:void 0,Caches:void 0,screen:void 0,alert:void 0,confirm:void 0,prompt:void 0,fetch:void 0,XMLHttpRequest:void 0,WebSocket:void 0,webkit:void 0,print:void 0}}}});
unpackage/dist/dev/app-plus/app-service.js
Diff too large
unpackage/dist/dev/app-plus/app-view.js
Diff too large
unpackage/dist/dev/app-plus/pages/InManagement/Order_Pallet_Building.js
File was deleted