| | |
| | | </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. |
| | |
| | | <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> |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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": "组托", |
| | |
| | | "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": "修改成功", |
| | |
| | | { |
| | | "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": "确认提取" |
| | | } |
| | | } |
| | |
| | | "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": "组托", |
| | |
| | | "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": [ |
| | | { |
| | | "pages": [{ |
| | | "path": "pages/login/login", |
| | | "style": { |
| | | "navigationBarTitleText": "", |
| | |
| | | } |
| | | }, |
| | | { |
| | | "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" |
| | | } |
| | | } |
| | | ], |
| | |
| | | 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: { |
| | |
| | | }, |
| | | 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) { |
| New file |
| | |
| | | <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> |
| New file |
| | |
| | | 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) |
| New file |
| | |
| | | <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> |
| New file |
| | |
| | | <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> |
| New file |
| | |
| | | <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> |
| New file |
| | |
| | | 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) |
| New file |
| | |
| | | <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> |
| | |
| | | bgColor="#ffffff" |
| | | titleStyle="font-weight: 600; color: #303133; font-size: 32rpx;" |
| | | leftIcon="" |
| | | rightIcon="setting" |
| | | @rightClick="openSettings" |
| | | ></u-navbar> |
| | | |
| | | <!-- 欢迎信息 / 用户信息 --> |
| | |
| | | <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"> |
| | |
| | | name: 'orderPakin', |
| | | color: 'purple', |
| | | cuIcon: '', |
| | | url: '/order/orderList' |
| | | url: '/InManagement/OrderContainerBinding/Main/orderList' |
| | | }, |
| | | { |
| | | title: this.$t('index.agv_start'), |
| | |
| | | 'pakin_category', |
| | | 'agv_category', |
| | | 'stock_category' |
| | | ] |
| | | ], |
| | | orderPakinRequiresMainList: false |
| | | } |
| | | }, |
| | | computed: { |
| | |
| | | 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: { |
| | |
| | | } |
| | | return map[colorStr] || '#409eff' |
| | | }, |
| | | // 跳转到设置页 |
| | | openSettings() { |
| | | uni.navigateTo({ |
| | | url: '/pages/settings/settings' |
| | | }) |
| | | }, |
| | | // 跳转页面 |
| | | navigateTo(item) { |
| | | if (item.name === 'logOut') { |
| | |
| | | }) |
| | | 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() { |
| | |
| | | ) |
| | | this.elements = [] |
| | | |
| | | if ( |
| | | data == undefined || |
| | | data == null || |
| | | data === '' |
| | | ) { |
| | | if (data == undefined || data == null || data === '') { |
| | | this.elements = this.elements2 |
| | | return |
| | | } |
| New file |
| | |
| | | <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> |
| | |
| | | |
| | | 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}}}}); |