8dbae264b163b253e46bec4638914c7ec58f28c5..b13760a228deb5957f1c029689c2a28676bce94f
7 天以前 zhou zhou
#
b13760 对比 | 目录
7 天以前 zhou zhou
#
a8b4b7 对比 | 目录
4个文件已添加
6个文件已修改
46个文件已删除
22863 ■■■■■ 已修改文件
.hbuilderx/launch.json 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages.json 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGV2F.vue 488 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVBind.vue 548 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVDismantle.vue 485 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVFinishedCall.vue 487 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVLineCall.vue 495 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVLineCall2.vue 495 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVPakin.vue 529 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVPakinBing.vue 521 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVPakinOn.vue 628 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVSiteList.vue 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVSiteList2.vue 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVStaBind.vue 512 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVStart.vue 594 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVUnbind.vue 548 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/AGVUnbind2.vue 548 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/agv_back.vue 535 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/agv_start.vue 529 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/home/home - 副本 (2).vue 376 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/home/home - 副本 (3).vue 376 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/home/home - 副本.vue 376 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/home/home.vue 502 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/mat/matList.vue 230 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/mat/matQuery2.vue 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/order/orderDetlList.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/order/orderDetlList2.vue 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/order/orderPakin.vue 501 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/order/orderPakin2.vue 383 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/order/orderPutDown.vue 501 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/order/orderPutOn.vue 531 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pakin/leftovers.vue 562 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pakin/mergeStore.vue 611 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pakin/pakin.vue 417 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pakin/pickAgain.vue 326 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pakin/piking.vue 482 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pakin/putOn.vue 494 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pingku/PInventoryAdjustment.vue 493 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pingku/POrderDetlList.vue 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pingku/POrderDetlListOut.vue 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pingku/POrderList.vue 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pingku/POrderListOut.vue 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pingku/POrderPakin.vue 558 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pingku/POrderPakinOut.vue 558 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/print/print.vue 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/print/printUNI.vue 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/print/qr.vue 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/stock/changePallet.vue 299 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/stock/restock.vue 484 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/stock/stockCheck.vue 506 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/stock/stockQuery.vue 230 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/tzsk/AGV/AGVPakin.vue 567 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/tzsk/AGV/AGVPakinBing.vue 521 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/tzsk/AGV/AGVPakinOn.vue 628 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/tzsk/AGV/AGVStart.vue 566 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/css/common.css 423 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.hbuilderx/launch.json
New file
@@ -0,0 +1,9 @@
{
    "version" : "1.0",
    "configurations" : [
        {
            "playground" : "standard",
            "type" : "uni-app:app-android"
        }
    ]
}
pages.json
@@ -1,5 +1,5 @@
{
    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
    "pages": [
        {
            "path": "pages/login/login",
            "style": {
@@ -25,153 +25,43 @@
            }
        },
        {
            "path": "pages/mat/matQuery2",
            "style": {
                "navigationBarTitleText": "物料"
            }
        },
        {
            "path": "pages/pakin/pakin",
            "style": {
                "navigationBarTitleText": "组 æ‰˜"
            }
        },
        {
            "path": "pages/AGV/AGVPakin",
            "path": "pages/order/orderList",
            "style": {
                "navigationBarTitleText": "AGV组托"
                "navigationBarTitleText": "单据列表",
                "enablePullDownRefresh": true
            }
        },
        {
            "path": "pages/AGV/AGVPakinBing",
            "path": "pages/order/orderDetlList",
            "style": {
                "navigationBarTitleText": "AGV上架绑定"
                "navigationBarTitleText": "单据明细列表"
            }
        },
        {
            "path": "pages/AGV/AGVPakinOn",
            "path": "pages/order/orderPakin2",
            "style": {
                "navigationBarTitleText": "AGV上架组托"
                "navigationBarTitleText": "订单组托",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/AGV/AGVStart",
            "path": "pages/AGV/agv_start",
            "style": {
                "navigationBarTitleText": "AGV启动入库"
                "navigationBarTitleText": "AGV容器入库",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/AGV/AGVUnbind",
            "path": "pages/AGV/agv_back",
            "style": {
                "navigationBarTitleText": "AGV储位解绑"
            }
        },
        {
            "path": "pages/AGV/AGVUnbind2",
            "style": {
                "navigationBarTitleText": "AGV拆托解绑"
            }
        },
        {
            "path": "pages/AGV/AGVDismantle",
            "style": {
                "navigationBarTitleText": "AGV拆托呼叫"
            }
        },
        {
            "path": "pages/AGV/AGVBind",
            "style": {
                "navigationBarTitleText": "AGV储位绑定"
            }
        },
        {
            "path": "pages/AGV/AGV2F",
            "style": {
                "navigationBarTitleText": "AGV2楼打包"
            }
        },
        {
            "path": "pages/tzsk/AGV/AGVPakin",
            "style": {
                "navigationBarTitleText": "AGV组托"
            }
        },
        {
            "path": "pages/tzsk/AGV/AGVPakinBing",
            "style": {
                "navigationBarTitleText": "AGV上架绑定"
            }
        },
        {
            "path": "pages/tzsk/AGV/AGVPakinOn",
            "style": {
                "navigationBarTitleText": "AGV上架组托"
            }
        },
        {
            "path": "pages/tzsk/AGV/AGVStart",
            "style": {
                "navigationBarTitleText": "AGV启动入库"
            }
        },
        {
            "path": "pages/order/orderPakin",
            "style": {
                "navigationBarTitleText": "订单入库"
            }
        },
        {
            "path": "pages/pingku/POrderList",
            "style": {
                "navigationBarTitleText": "平库入库"
            }
        },
        {
            "path": "pages/pingku/PInventoryAdjustment",
            "style": {
                "navigationBarTitleText": "平库库存调整"
            }
        },
        {
            "path": "pages/pingku/POrderDetlList",
            "style": {
                "navigationBarTitleText": "订单列表"
            }
        },
        {
            "path": "pages/pingku/POrderPakin",
            "style": {
                "navigationBarTitleText": "平库上架"
            }
        },
        {
            "path": "pages/pingku/POrderListOut",
            "style": {
                "navigationBarTitleText": "平库下架"
            }
        },
        {
            "path": "pages/pingku/POrderDetlListOut",
            "style": {
                "navigationBarTitleText": "出库订单列表"
            }
        },
        {
            "path": "pages/pingku/POrderPakinOut",
            "style": {
                "navigationBarTitleText": "平库下架"
            }
        },
        {
            "path": "pages/order/orderPutOn",
            "style": {
                "navigationBarTitleText": "订单上架"
            }
        },
        {
            "path": "pages/order/orderPutDown",
            "style": {
                "navigationBarTitleText": "订单下架"
                "navigationBarTitleText": "AGV容器回库",
                "enablePullDownRefresh": false
            }
        },
        {
@@ -181,163 +71,12 @@
            }
        },
        {
            "path": "pages/stock/stockCheck",
            "style": {
                "navigationBarTitleText": "盘点"
            }
        },
        {
            "path": "pages/print/printUNI",
            "style": {
                "navigationBarTitleText": "UNI打印"
            }
        },
        {
            "path": "pages/print/print",
            "style": {
                "navigationBarTitleText": "打印"
            }
        },
        {
            "path": "pages/stock/restock",
            "style": {
                "navigationBarTitleText": "补货"
            }
        },
        {
            "path": "pages/pakin/piking",
            "style": {
                "navigationBarTitleText": "盘点/拣料转全板"
            }
        },
        {
            "path": "pages/pakin/putOn",
            "style": {
                "navigationBarTitleText": "组托上架"
            }
        },
        {
            "path": "pages/pakin/mergeStore",
            "style": {
                "navigationBarTitleText": "并板入库"
            }
        },
        {
            "path": "pages/pakin/leftovers",
            "style": {
                "navigationBarTitleText": "拣料站到站"
            }
        },
        {
            "path": "pages/stock/changePallet",
            "style": {
                "navigationBarTitleText": "换板绑定"
            }
        },
        {
            "path": "pages/print/qr",
            "style": {
                "navigationBarTitleText": "二维码"
            }
        },
        {
            "path": "pages/mat/matList",
            "style": {
                "navigationBarTitleText": "商品列表"
            }
        },
        {
            "path": "pages/pakin/pickAgain",
            "style": {
                "navigationBarTitleText": "再次拣料"
            }
        },
        {
            "path": "pages/login/logOut",
            "style": {
                "navigationBarTitleText": "退出登录"
            }
        },
        {
            "path" : "pages/order/orderPakin2",
            "style" :
            {
                "navigationBarTitleText" : "订单组托",
                "enablePullDownRefresh" : false
            }
        }
        ,{
            "path" : "pages/order/orderList",
            "style" :
            {
                "navigationBarTitleText": "单据列表",
                "enablePullDownRefresh": true
            }
        },
        {
            "path": "pages/order/orderDetlList",
            "style": {
                "navigationBarTitleText": "单据明细列表"
            }
        },
        {
            "path" : "pages/AGV/AGVSiteList",
            "style" :
            {
                "navigationBarTitleText": "产线叫料",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/AGV/AGVLineCall",
            "style" :
            {
                "navigationBarTitleText": "产线叫料",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/AGV/AGVSiteList2",
            "style" :
            {
                "navigationBarTitleText": "产线叫料2",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/AGV/AGVLineCall2",
            "style" :
            {
                "navigationBarTitleText": "产线叫料2",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/AGV/AGVFinishedCall",
            "style" :
            {
                "navigationBarTitleText": "成品呼叫",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/AGV/AGVStaBind",
            "style" :
            {
                "navigationBarTitleText": "AGV站绑定",
                "enablePullDownRefresh": false
            }
        }
    ],
    ],
    "globalStyle": {
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "uni-app",
pages/AGV/AGV2F.vue
File was deleted
pages/AGV/AGVBind.vue
File was deleted
pages/AGV/AGVDismantle.vue
File was deleted
pages/AGV/AGVFinishedCall.vue
File was deleted
pages/AGV/AGVLineCall.vue
File was deleted
pages/AGV/AGVLineCall2.vue
File was deleted
pages/AGV/AGVPakin.vue
File was deleted
pages/AGV/AGVPakinBing.vue
File was deleted
pages/AGV/AGVPakinOn.vue
File was deleted
pages/AGV/AGVSiteList.vue
File was deleted
pages/AGV/AGVSiteList2.vue
File was deleted
pages/AGV/AGVStaBind.vue
File was deleted
pages/AGV/AGVStart.vue
File was deleted
pages/AGV/AGVUnbind.vue
File was deleted
pages/AGV/AGVUnbind2.vue
File was deleted
pages/AGV/agv_back.vue
New file
@@ -0,0 +1,535 @@
<template>
    <view class="page-container">
        <!-- è¡¨å•区域 -->
        <view class="form-section">
            <view class="form-item">
                <view class="form-label">
                    <uni-icons type="scan" size="18" color="#667eea"></uni-icons>
                    <text class="label-text">托盘码</text>
                </view>
                <view class="form-input-wrap">
                    <input class="form-input" type="text" placeholder="扫码 / è¾“入托盘码" v-model="barcode"
                        :focus="barcodeFocus" @input="barcodeInput()" />
                    <uni-icons v-if="barcode" type="clear" size="18" color="#c0c4cc" @click="clearBarcode"></uni-icons>
                </view>
            </view>
            <view class="form-item">
                <view class="form-label">
                    <uni-icons type="location" size="18" color="#667eea"></uni-icons>
                    <text class="label-text">暂存位</text>
                </view>
                <view class="form-input-wrap">
                    <input class="form-input" type="text" placeholder="扫码 / è¾“入暂存位" v-model="sourceSite" />
                    <uni-icons v-if="sourceSite" type="clear" size="18" color="#c0c4cc" @click="sourceSite=''"></uni-icons>
                </view>
            </view>
            <!-- <view class="form-item">
                <view class="form-label">
                    <uni-icons type="navigate" size="18" color="#667eea"></uni-icons>
                    <text class="label-text">目标站点</text>
                </view>
                <view class="form-input-wrap">
                    <picker class="picker-full" :range="targetSiteList" range-key="label" @change="onTargetSiteChange">
                        <view class="picker-value">
                            <text>{{selectedTargetSite.label || '请选择目标站点'}}</text>
                            <view><uni-icons type="bottom" size="14" color="#909399"></uni-icons></view>
                        </view>
                    </picker>
                </view>
            </view> -->
        </view>
        <!-- åˆ—表头部 -->
        <view class="list-header" v-if="showDetl">
            <view class="header-left">
                <text class="header-title">商品列表</text>
                <view class="count-badge" v-if="dataList.length > 0">
                    <text class="count-text">{{dataList.length}}</text>
                </view>
            </view>
        </view>
        <!-- å•†å“åˆ—表 -->
        <view class="list-container" v-if="showDetl">
            <view class="mat-card" v-for="(item, i) in dataList" :key="i">
                <!-- å¡ç‰‡å¤´éƒ¨ -->
                <view class="card-top">
                    <view class="card-index">{{i + 1}}</view>
                    <view class="mat-code-wrap">
                        <text class="mat-code">{{item.matnr}}</text>
                    </view>
                    <!-- <view class="qty-badge">
                        <text class="qty-text">{{item.anfme}}</text>
                    </view> -->
                </view>
                <!-- å¡ç‰‡å†…容 -->
                <view class="card-content">
                    <view class="info-row">
                        <view class="info-col">
                            <text class="info-label">品名</text>
                            <text class="info-value">{{item.maktx || '-'}}</text>
                        </view>
                    </view>
                    <view class="info-row">
                        <view class="info-col half">
                            <text class="info-label">规格</text>
                            <text class="info-value">{{item.specs || '-'}}</text>
                        </view>
                        <view class="info-col half">
                            <text class="info-label">批号</text>
                            <text class="info-value highlight">{{item.batch || '-'}}</text>
                        </view>
                    </view>
                    <view class="info-row">
                        <view class="info-col half">
                            <text class="info-label">数量</text>
                            <text class="info-value qty">{{item.anfme}}</text>
                        </view>
                    </view>
                </view>
                <!-- å¡ç‰‡æ“ä½œ -->
                <view class="card-actions">
                    <view class="action-btn edit-btn" @click="revise(item, i)">
                        <uni-icons type="compose" size="18" color="#667eea"></uni-icons>
                        <text class="action-text">修改</text>
                    </view>
                    <view class="action-btn delete-btn" @click="remove(item, i, 'warn')">
                        <uni-icons type="trash" size="18" color="#f56c6c"></uni-icons>
                        <text class="action-text delete-text">移除</text>
                    </view>
                </view>
            </view>
            <!-- ç©ºçŠ¶æ€ -->
            <view class="empty-state" v-if="dataList.length === 0">
                <uni-icons type="cart" size="60" color="#CCCCCC"></uni-icons>
                <text class="empty-text">暂无商品</text>
                <text class="empty-hint">请扫描物料码添加商品</text>
            </view>
            <!-- åº•部占位 -->
            <view class="bottom-placeholder"></view>
        </view>
        <!-- åº•部操作按钮 -->
        <view class="bottom-bar">
            <view class="btn-reset" @click="reset('warn')">
                <uni-icons type="refresh" size="18" color="#909399"></uni-icons>
                <text class="btn-text">重置</text>
            </view>
            <view class="btn-submit" :class="{'btn-disabled': isSubmitting || barcode === ''}" @click="combConfirm('warn')">
                <uni-icons type="checkbox" size="18" color="#ffffff"></uni-icons>
                <text class="btn-text">确认呼叫</text>
            </view>
        </view>
        <!-- å¼¹çª—区域 -->
        <!-- ä¿®æ”¹æ•°é‡ -->
        <uni-popup ref="revise" type="dialog">
            <view class="popup-card">
                <view class="popup-header">
                    <text class="popup-title">修改信息</text>
                </view>
                <view class="popup-body">
                    <view class="popup-row">
                        <text class="popup-label">编码</text>
                        <view class="popup-value disabled">{{editMatnr}}</view>
                    </view>
                    <view class="popup-row">
                        <text class="popup-label">批号</text>
                        <input class="popup-value input" type="text" v-model="batch" placeholder="输入批号" />
                    </view>
                    <view class="popup-row">
                        <text class="popup-label">数量</text>
                        <view class="popup-value number">
                            <uni-number-box :value="count" :step='0.01' :max="9999999" color="#747474" @change="changeValue" />
                        </view>
                    </view>
                </view>
                <view class="popup-footer">
                    <view class="popup-btn cancel" @click="reviseClose">取消</view>
                    <view class="popup-btn confirm" @click="reviseConfirm()">确认</view>
                </view>
            </view>
        </uni-popup>
        <!-- ç§»é™¤ç¡®è®¤ -->
        <uni-popup ref="alertDialog" type="dialog">
            <uni-popup-dialog :type="msgType" confirmText="移除" :title="title" :content="content"
                @confirm="removeConfirm()" @close="removeClose"></uni-popup-dialog>
        </uni-popup>
        <!-- æç¤ºä¿¡æ¯å¼¹çª— -->
        <uni-popup ref="message" type="message">
            <uni-popup-message :type="msgType1" :message="messageText" :duration="2000"></uni-popup-message>
        </uni-popup>
        <!-- ç¡®è®¤ç»„托 -->
        <uni-popup ref="combConfirm" type="dialog">
            <uni-popup-dialog :type="msgType" cancelText="取消" confirmText="确认" :title="title" :content="content"
                @confirm="comb" @close="combClose"></uni-popup-dialog>
        </uni-popup>
        <!-- ç¡®è®¤é‡ç½® -->
        <uni-popup ref="resetConfirm" type="dialog">
            <uni-popup-dialog :type="msgType" cancelText="取消" confirmText="确认" :title="title" :content="content"
                @confirm="resetConfirm" @close="resetClose"></uni-popup-dialog>
        </uni-popup>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                showDetl:false,
                baseUrl: '',
                token: '',
                barcode: '',
                dataList: [],
                count: 0,
                rowNum: '',
                matnr: '',
                editMatnr: '',
                batch: '',
                weight: '',
                msgType1: 'success',
                msgType: 'success',
                messageText: '',
                title: '',
                content: '',
                barcodeFocus: true,
                matFocus: false,
                matData: '',
                removeNum: 0,
                ck1: true,
                ck2: false,
                isFull: true,
                isSubmitting: false,
                sourceSite:'',
                targetSiteList: [
                    { label: '101', value: '101' },
                    { label: '102', value: '102' }
                ],
                selectedTargetSite: { label: '101', value: '101' },
                type : 2
            }
        },
        onLoad() {
        },
        onShow() {
            this.baseUrl = uni.getStorageSync('baseUrl');
            this.token = uni.getStorageSync('token');
        },
        methods: {
            onTargetSiteChange(e) {
                const index = e.detail.value;
                this.selectedTargetSite = this.targetSiteList[index];
            },
            clearBarcode() {
                this.barcode = '';
                this.barcodeFocus = false;
                setTimeout(() => {
                    this.barcodeFocus = true;
                }, 100);
            },
            clearMatnr() {
                this.matnr = '';
                this.matFocus = false;
                setTimeout(() => {
                    this.matFocus = true;
                }, 100);
            },
            isFrozen() {
                this.isFull = !this.isFull
                console.log(this.isFull);
            },
            messageToggle(type) {
                this.msgType1 = type
                this.$refs.message.open()
            },
            // barcode input äº‹ä»¶
            barcodeInput() {
                // ä¸è®¾ç½®å®šæ—¶å™¨ ä¼šå‡ºçŽ°æ‰«å…¥çš„å­—ç¬¦ä¸²ä¸å…¨
                setTimeout(() => {
                    var len = this.barcode.length
                    if (len >= 9 && len <=8) {
                        uni.showToast({
                            title: '托盘码有误请重试',
                            icon: "none",
                            position: 'top'
                        });
                        this.barcodeFocuss()
                        return;
                    }
                    this.focuss()
                }, 200)
            },
            // æ‰˜ç›˜ç æœ‰è¯¯é‡ç½®
            barcodeFocuss() {
                let that = this;
                that.barcodeFocus = false;
                setTimeout(() => {
                    that.barcode = '';
                    that.barcodeFocus = true;
                }, 100);
            },
            // å•†å“å…‰æ ‡æ¸…空重置
            focuss() {
                this.focus = false;
                setTimeout(() => {
                    this.matnr = '';
                    this.matFocus = true;
                }, 100);
            },
            // æœç´¢ç‰©æ–™
            findMat() {
                let that = this
                uni.request({
                    url: that.baseUrl + '/mat/auth',
                    data: {
                        matnr: that.matnr
                    },
                    header: {
                        'token': uni.getStorageSync('token')
                    },
                    success(result) {
                        result = result.data
                        if (result.code === 200 && result.data) {
                            that.matData = result.data
                            that.matnr = ''
                            that.matData['batch'] = ''
                            uni.navigateTo({
                                url: "../mat/matSelected",
                                // é€šè¿‡eventChannel向被打开页面传送数据
                                success: function(res) {
                                    res.eventChannel.emit('mat', {
                                        data: result.data
                                    })
                                },
                                // ä¸ºæŒ‡å®šäº‹ä»¶æ·»åŠ ä¸€ä¸ªç›‘å¬å™¨ï¼ŒèŽ·å–è¢«æ‰“å¼€é¡µé¢ä¼ é€åˆ°å½“å‰é¡µé¢çš„æ•°æ®
                                events: {
                                    matList: function(data) {
                                        that.checkMat(data.data)
                                        that.focuss()
                                    },
                                },
                            });
                        } else if (result.code == 403) {
                            uni.showToast({
                                title: result.msg,
                                icon: "none",
                                position: 'top'
                            })
                            setTimeout(() => {
                                uni.reLaunch({
                                    url: '../login/login'
                                });
                            }, 1000);
                        } else {
                            uni.showToast({
                                title: result.msg,
                                icon: "none",
                                position: 'top'
                            })
                        }
                    }
                });
            },
            selectMat() {
                let that = this
                uni.navigateTo({
                    url: "../mat/matQuery",
                    success: function(res) {
                        // é€šè¿‡eventChannel向被打开页面传送数据   å‘另外一个页面传递值的
                        res.eventChannel.emit('commonUrl', {
                            commonUrl: ''
                        })
                    },
                    events: {
                        // ä¸ºæŒ‡å®šäº‹ä»¶æ·»åŠ ä¸€ä¸ªç›‘å¬å™¨ï¼ŒèŽ·å–è¢«æ‰“å¼€é¡µé¢ä¼ é€åˆ°å½“å‰é¡µé¢çš„æ•°æ®  å¦å¤–一个页面传过来的
                        acceptDataFromOpenedPage: function(data) {
                            that.matnr = data.data
                            that.findMat(that.matnr)
                        },
                    },
                });
                that.matnr = ''
            },
            checkMat(mat) {
                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) {
                            this.$forceUpdate() // å¼ºåˆ¶åˆ·æ–°
                            if (sameItem) {
                                add = false
                            } else {
                                add = true
                            }
                        } else {
                            // ç›¸åŒç‰©æ–™ç›¸åŒæ‰¹å· æ•°é‡ç´¯åŠ 
                            this.dataList[i].anfme += mat.anfme
                            this.$forceUpdate() // å¼ºåˆ¶åˆ·æ–°
                            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.eject()
            },
            eject(type) {
                this.type = type
                this.$refs.revise.open(type)
            },
            // åˆ—表移除按钮
            remove(item, i, type) {
                this.removeNum  = i
                this.msgType = type
                this.title = '确认移除'
                this.content = '是否移除该商品?'
                this.$refs.alertDialog.open(i)
            },
            // ç¡®è®¤ç§»é™¤
            removeConfirm() {
                this.messageText = "移除成功"
                this.messageToggle('success')
                this.dataList.splice(this.removeNum, 1)
            },
            // å–消移除
            removeClose() {
                this.$refs.alertDialog.close()
            },
            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.messageText = "修改成功"
                this.messageToggle('success')
                this.$refs.revise.close()
            },
            reviseClose() {
                this.$refs.revise.close()
            },
            changeValue(value) {
                this.count = value
            },
            combConfirm(type) {
                if (this.isSubmitting || this.barcode === '') return;
                this.msgType = type
                this.title = '确认呼叫'
                this.content = '确认呼叫?'
                this.$refs.combConfirm.open()
            },
            combClose() {
                this.$refs.combConfirm.close()
            },
            comb() {
                uni.vibrateShort();
                let that = this;
                that.isSubmitting = true;
                if (that.barcode === '') {
                    this.messageText = "请扫描站点条码"
                    this.messageToggle('error')
                    that.isSubmitting = false;
                    return;
                }
                uni.request({
                    url: that.baseUrl + '/mobile/agv/start',
                    data: JSON.stringify({
                        type : that.type,
                        barcode: that.barcode,
                        sourceSite:that.sourceSite
                    }),
                    method: 'POST',
                    header: {
                        'token': uni.getStorageSync('token')
                    },
                    success(result) {
                        var res = result.data
                        if (res.code === 200) {
                            that.resst();
                            that.messageText = "呼叫成功"
                            that.messageToggle('success')
                        } else if (res.code == 403) {
                            that.messageText = res.msg
                            that.messageToggle('error')
                            setTimeout(() => {
                                uni.reLaunch({
                                    url: '../login/login'
                                });
                            }, 1000);
                        } else {
                            that.messageText = res.msg
                            that.messageToggle('error')
                        }
                    },
                    fail: () => {
                        that.messageText = "网络请求超时"
                        that.messageToggle('error')
                    },
                    complete: () => {
                        that.isSubmitting = false;
                    }
                });
            },
            reset(type) {
                this.msgType = type
                this.title = '确认重置'
                this.content = '是否清空所有数据?'
                this.$refs.resetConfirm.open()
            },
            // ç¡®è®¤é‡ç½®
            resetConfirm() {
                this.dataList = []
                this.barcode = ''
                this.messageText = "重置完成"
                this.messageToggle('success')
            },
            // å–消重置
            resetClose() {
            },
            // æ¸…空
            resst() {
                // this.dataList = []
                this.barcode = ''
                this.sourceSite = ''
                this.barcodeFocuss()
            },
        }
    }
</script>
<style>
    /* å¼•入公共样式 */
    @import url('../../static/css/common.css');
    /* @import url('../../static/css/wms.css/wms.css'); */
</style>
pages/AGV/agv_start.vue
New file
@@ -0,0 +1,529 @@
<template>
    <view class="page-container">
        <!-- è¡¨å•区域 -->
        <view class="form-section">
            <view class="form-item">
                <view class="form-label">
                    <uni-icons type="scan" size="18" color="#667eea"></uni-icons>
                    <text class="label-text">托盘码</text>
                </view>
                <view class="form-input-wrap">
                    <input class="form-input" type="text" placeholder="扫码 / è¾“入托盘码" v-model="barcode"
                        :focus="barcodeFocus" @input="barcodeInput()" />
                    <uni-icons v-if="barcode" type="clear" size="18" color="#c0c4cc" @click="clearBarcode"></uni-icons>
                </view>
            </view>
            <view class="form-item">
                <view class="form-label">
                    <uni-icons type="location" size="18" color="#667eea"></uni-icons>
                    <text class="label-text">暂存位</text>
                </view>
                <view class="form-input-wrap">
                    <input class="form-input" type="text" placeholder="扫码 / è¾“入暂存位" v-model="sourceSite" />
                    <uni-icons v-if="sourceSite" type="clear" size="18" color="#c0c4cc" @click="sourceSite=''"></uni-icons>
                </view>
            </view>
            <!-- <view class="form-item">
                <view class="form-label">
                    <uni-icons type="navigate" size="18" color="#667eea"></uni-icons>
                    <text class="label-text">目标站点</text>
                </view>
                <view class="form-input-wrap">
                    <picker class="picker-full" :range="targetSiteList" range-key="label" @change="onTargetSiteChange">
                        <view class="picker-value">
                            <text>{{selectedTargetSite.label || '请选择目标站点'}}</text>
                            <view><uni-icons type="bottom" size="14" color="#909399"></uni-icons></view>
                        </view>
                    </picker>
                </view>
            </view> -->
        </view>
        <!-- åˆ—表头部 -->
        <view class="list-header" v-if="showDetl">
            <view class="header-left">
                <text class="header-title">商品列表</text>
                <view class="count-badge" v-if="dataList.length > 0">
                    <text class="count-text">{{dataList.length}}</text>
                </view>
            </view>
        </view>
        <!-- å•†å“åˆ—表 -->
        <view class="list-container" v-if="showDetl">
            <view class="mat-card" v-for="(item, i) in dataList" :key="i">
                <!-- å¡ç‰‡å¤´éƒ¨ -->
                <view class="card-top">
                    <view class="card-index">{{i + 1}}</view>
                    <view class="mat-code-wrap">
                        <text class="mat-code">{{item.matnr}}</text>
                    </view>
                    <!-- <view class="qty-badge">
                        <text class="qty-text">{{item.anfme}}</text>
                    </view> -->
                </view>
                <!-- å¡ç‰‡å†…容 -->
                <view class="card-content">
                    <view class="info-row">
                        <view class="info-col">
                            <text class="info-label">品名</text>
                            <text class="info-value">{{item.maktx || '-'}}</text>
                        </view>
                    </view>
                    <view class="info-row">
                        <view class="info-col half">
                            <text class="info-label">规格</text>
                            <text class="info-value">{{item.specs || '-'}}</text>
                        </view>
                        <view class="info-col half">
                            <text class="info-label">批号</text>
                            <text class="info-value highlight">{{item.batch || '-'}}</text>
                        </view>
                    </view>
                    <view class="info-row">
                        <view class="info-col half">
                            <text class="info-label">数量</text>
                            <text class="info-value qty">{{item.anfme}}</text>
                        </view>
                    </view>
                </view>
                <!-- å¡ç‰‡æ“ä½œ -->
                <view class="card-actions">
                    <view class="action-btn edit-btn" @click="revise(item, i)">
                        <uni-icons type="compose" size="18" color="#667eea"></uni-icons>
                        <text class="action-text">修改</text>
                    </view>
                    <view class="action-btn delete-btn" @click="remove(item, i, 'warn')">
                        <uni-icons type="trash" size="18" color="#f56c6c"></uni-icons>
                        <text class="action-text delete-text">移除</text>
                    </view>
                </view>
            </view>
            <!-- ç©ºçŠ¶æ€ -->
            <view class="empty-state" v-if="dataList.length === 0">
                <uni-icons type="cart" size="60" color="#CCCCCC"></uni-icons>
                <text class="empty-text">暂无商品</text>
                <text class="empty-hint">请扫描物料码添加商品</text>
            </view>
            <!-- åº•部占位 -->
            <view class="bottom-placeholder"></view>
        </view>
        <!-- åº•部操作按钮 -->
        <view class="bottom-bar">
            <view class="btn-reset" @click="reset('warn')">
                <uni-icons type="refresh" size="18" color="#909399"></uni-icons>
                <text class="btn-text">重置</text>
            </view>
            <view class="btn-submit" :class="{'btn-disabled': isSubmitting || barcode === ''}" @click="combConfirm('warn')">
                <uni-icons type="checkbox" size="18" color="#ffffff"></uni-icons>
                <text class="btn-text">确认呼叫</text>
            </view>
        </view>
        <!-- å¼¹çª—区域 -->
        <!-- ä¿®æ”¹æ•°é‡ -->
        <uni-popup ref="revise" type="dialog">
            <view class="popup-card">
                <view class="popup-header">
                    <text class="popup-title">修改信息</text>
                </view>
                <view class="popup-body">
                    <view class="popup-row">
                        <text class="popup-label">编码</text>
                        <view class="popup-value disabled">{{editMatnr}}</view>
                    </view>
                    <view class="popup-row">
                        <text class="popup-label">批号</text>
                        <input class="popup-value input" type="text" v-model="batch" placeholder="输入批号" />
                    </view>
                    <view class="popup-row">
                        <text class="popup-label">数量</text>
                        <view class="popup-value number">
                            <uni-number-box :value="count" :step='0.01' :max="9999999" color="#747474" @change="changeValue" />
                        </view>
                    </view>
                </view>
                <view class="popup-footer">
                    <view class="popup-btn cancel" @click="reviseClose">取消</view>
                    <view class="popup-btn confirm" @click="reviseConfirm()">确认</view>
                </view>
            </view>
        </uni-popup>
        <!-- ç§»é™¤ç¡®è®¤ -->
        <uni-popup ref="alertDialog" type="dialog">
            <uni-popup-dialog :type="msgType" confirmText="移除" :title="title" :content="content"
                @confirm="removeConfirm()" @close="removeClose"></uni-popup-dialog>
        </uni-popup>
        <!-- æç¤ºä¿¡æ¯å¼¹çª— -->
        <uni-popup ref="message" type="message">
            <uni-popup-message :type="msgType1" :message="messageText" :duration="2000"></uni-popup-message>
        </uni-popup>
        <!-- ç¡®è®¤ç»„托 -->
        <uni-popup ref="combConfirm" type="dialog">
            <uni-popup-dialog :type="msgType" cancelText="取消" confirmText="确认" :title="title" :content="content"
                @confirm="comb" @close="combClose"></uni-popup-dialog>
        </uni-popup>
        <!-- ç¡®è®¤é‡ç½® -->
        <uni-popup ref="resetConfirm" type="dialog">
            <uni-popup-dialog :type="msgType" cancelText="取消" confirmText="确认" :title="title" :content="content"
                @confirm="resetConfirm" @close="resetClose"></uni-popup-dialog>
        </uni-popup>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                showDetl:false,
                baseUrl: '',
                token: '',
                barcode: '',
                dataList: [],
                count: 0,
                rowNum: '',
                matnr: '',
                editMatnr: '',
                batch: '',
                weight: '',
                msgType1: 'success',
                msgType: 'success',
                messageText: '',
                title: '',
                content: '',
                barcodeFocus: true,
                matFocus: false,
                matData: '',
                removeNum: 0,
                ck1: true,
                ck2: false,
                isFull: true,
                isSubmitting: false,
                sourceSite:'',
                targetSiteList: [
                    { label: '101', value: '101' },
                    { label: '102', value: '102' }
                ],
                selectedTargetSite: { label: '101', value: '101' },
                type : 1
            }
        },
        onLoad() {
        },
        onShow() {
            this.baseUrl = uni.getStorageSync('baseUrl');
            this.token = uni.getStorageSync('token');
        },
        methods: {
            onTargetSiteChange(e) {
                const index = e.detail.value;
                this.selectedTargetSite = this.targetSiteList[index];
            },
            clearBarcode() {
                this.barcode = '';
                this.barcodeFocus = false;
                setTimeout(() => {
                    this.barcodeFocus = true;
                }, 100);
            },
            clearMatnr() {
                this.matnr = '';
                this.matFocus = false;
                setTimeout(() => {
                    this.matFocus = true;
                }, 100);
            },
            isFrozen() {
                this.isFull = !this.isFull
                console.log(this.isFull);
            },
            messageToggle(type) {
                this.msgType1 = type
                this.$refs.message.open()
            },
            // barcode input äº‹ä»¶
            barcodeInput() {
                // ä¸è®¾ç½®å®šæ—¶å™¨ ä¼šå‡ºçŽ°æ‰«å…¥çš„å­—ç¬¦ä¸²ä¸å…¨
                setTimeout(() => {
                    var len = this.barcode.length
                    if (len >= 9 && len <=8) {
                        uni.showToast({
                            title: '托盘码有误请重试',
                            icon: "none",
                            position: 'top'
                        });
                        this.barcodeFocuss()
                        return;
                    }
                    this.focuss()
                }, 200)
            },
            // æ‰˜ç›˜ç æœ‰è¯¯é‡ç½®
            barcodeFocuss() {
                let that = this;
                that.barcodeFocus = false;
                setTimeout(() => {
                    that.barcode = '';
                    that.barcodeFocus = true;
                }, 100);
            },
            // å•†å“å…‰æ ‡æ¸…空重置
            focuss() {
                this.focus = false;
                setTimeout(() => {
                    this.matnr = '';
                    this.matFocus = true;
                }, 100);
            },
            // æœç´¢ç‰©æ–™
            findMat() {
                let that = this
                uni.request({
                    url: that.baseUrl + '/mat/auth',
                    data: {
                        matnr: that.matnr
                    },
                    header: {
                        'token': uni.getStorageSync('token')
                    },
                    success(result) {
                        result = result.data
                        if (result.code === 200 && result.data) {
                            that.matData = result.data
                            that.matnr = ''
                            that.matData['batch'] = ''
                            uni.navigateTo({
                                url: "../mat/matSelected",
                                // é€šè¿‡eventChannel向被打开页面传送数据
                                success: function(res) {
                                    res.eventChannel.emit('mat', {
                                        data: result.data
                                    })
                                },
                                // ä¸ºæŒ‡å®šäº‹ä»¶æ·»åŠ ä¸€ä¸ªç›‘å¬å™¨ï¼ŒèŽ·å–è¢«æ‰“å¼€é¡µé¢ä¼ é€åˆ°å½“å‰é¡µé¢çš„æ•°æ®
                                events: {
                                    matList: function(data) {
                                        that.checkMat(data.data)
                                        that.focuss()
                                    },
                                },
                            });
                        } else if (result.code == 403) {
                            uni.showToast({
                                title: result.msg,
                                icon: "none",
                                position: 'top'
                            })
                            setTimeout(() => {
                                uni.reLaunch({
                                    url: '../login/login'
                                });
                            }, 1000);
                        } else {
                            uni.showToast({
                                title: result.msg,
                                icon: "none",
                                position: 'top'
                            })
                        }
                    }
                });
            },
            selectMat() {
                let that = this
                uni.navigateTo({
                    url: "../mat/matQuery",
                    success: function(res) {
                        // é€šè¿‡eventChannel向被打开页面传送数据   å‘另外一个页面传递值的
                        res.eventChannel.emit('commonUrl', {
                            commonUrl: ''
                        })
                    },
                    events: {
                        // ä¸ºæŒ‡å®šäº‹ä»¶æ·»åŠ ä¸€ä¸ªç›‘å¬å™¨ï¼ŒèŽ·å–è¢«æ‰“å¼€é¡µé¢ä¼ é€åˆ°å½“å‰é¡µé¢çš„æ•°æ®  å¦å¤–一个页面传过来的
                        acceptDataFromOpenedPage: function(data) {
                            that.matnr = data.data
                            that.findMat(that.matnr)
                        },
                    },
                });
                that.matnr = ''
            },
            checkMat(mat) {
                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) {
                            this.$forceUpdate() // å¼ºåˆ¶åˆ·æ–°
                            if (sameItem) {
                                add = false
                            } else {
                                add = true
                            }
                        } else {
                            // ç›¸åŒç‰©æ–™ç›¸åŒæ‰¹å· æ•°é‡ç´¯åŠ 
                            this.dataList[i].anfme += mat.anfme
                            this.$forceUpdate() // å¼ºåˆ¶åˆ·æ–°
                            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.eject()
            },
            eject(type) {
                this.type = type
                this.$refs.revise.open(type)
            },
            // åˆ—表移除按钮
            remove(item, i, type) {
                this.removeNum  = i
                this.msgType = type
                this.title = '确认移除'
                this.content = '是否移除该商品?'
                this.$refs.alertDialog.open(i)
            },
            // ç¡®è®¤ç§»é™¤
            removeConfirm() {
                this.messageText = "移除成功"
                this.messageToggle('success')
                this.dataList.splice(this.removeNum, 1)
            },
            // å–消移除
            removeClose() {
                this.$refs.alertDialog.close()
            },
            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.messageText = "修改成功"
                this.messageToggle('success')
                this.$refs.revise.close()
            },
            reviseClose() {
                this.$refs.revise.close()
            },
            changeValue(value) {
                this.count = value
            },
            combConfirm(type) {
                if (this.isSubmitting || this.barcode === '' || this.sourceSite === '') return;
                this.msgType = type
                this.title = '确认呼叫'
                this.content = '确认呼叫?'
                this.$refs.combConfirm.open()
            },
            combClose() {
                this.$refs.combConfirm.close()
            },
            comb() {
                uni.vibrateShort();
                let that = this;
                that.isSubmitting = true;
                uni.request({
                    url: that.baseUrl + '/mobile/agv/start',
                    data: JSON.stringify({
                        type : that.type,
                        barcode: that.barcode,
                        sourceSite:that.sourceSite
                    }),
                    method: 'POST',
                    header: {
                        'token': uni.getStorageSync('token')
                    },
                    success(result) {
                        var res = result.data
                        if (res.code === 200) {
                            that.resst();
                            that.messageText = "呼叫成功"
                            that.messageToggle('success')
                        } else if (res.code == 403) {
                            that.messageText = res.msg
                            that.messageToggle('error')
                            setTimeout(() => {
                                uni.reLaunch({
                                    url: '../login/login'
                                });
                            }, 1000);
                        } else {
                            that.messageText = res.msg
                            that.messageToggle('error')
                        }
                    },
                    fail: () => {
                        that.messageText = "网络请求超时"
                        that.messageToggle('error')
                    },
                    complete: () => {
                        that.isSubmitting = false;
                    }
                });
            },
            reset(type) {
                this.msgType = type
                this.title = '确认重置'
                this.content = '是否清空所有数据?'
                this.$refs.resetConfirm.open()
            },
            // ç¡®è®¤é‡ç½®
            resetConfirm() {
                this.dataList = []
                this.barcode = ''
                this.messageText = "重置完成"
                this.messageToggle('success')
            },
            // å–消重置
            resetClose() {
            },
            // æ¸…空
            resst() {
                // this.dataList = []
                this.barcode = ''
                this.sourceSite = ''
                this.barcodeFocuss()
            },
        }
    }
</script>
<style>
    /* å¼•入公共样式 */
    @import url('../../static/css/common.css');
    /* @import url('../../static/css/wms.css/wms.css'); */
</style>
pages/home/home - ¸±±¾ (2).vue
File was deleted
pages/home/home - ¸±±¾ (3).vue
File was deleted
pages/home/home - ¸±±¾.vue
File was deleted
pages/home/home.vue
@@ -16,28 +16,96 @@
        
        <!-- åŠŸèƒ½èœå• -->
        <view class="menu-section">
            <view class="menu-grid">
                <view class="menu-item" v-for="(item, index) in elements" :key="index"
                    @click="navigateTo(item)" :style="{animationDelay: (index * 0.1) + 's'}">
                    <view class="menu-card" :class="'card-' + item.color">
                        <view class="card-icon">
                            <uni-icons :type="getIconType(item)" size="32" color="#ffffff"></uni-icons>
            <!-- åˆ†ç±»æ¨¡å¼ï¼šæ˜¾ç¤ºåˆ†ç±»æ ‡é¢˜å’ŒæŠ˜å èœå• -->
            <template v-if="useCategoryMode">
                <!-- åˆ†ç±»èœå• -->
                <view class="category-section" v-for="(category, catIndex) in categorizedMenus" :key="category.key">
                    <!-- åˆ†ç±»å¤´éƒ¨ - æ¸å˜è‰²å¡ç‰‡é£Žæ ¼ -->
                    <view class="category-card" :class="'category-card-' + category.color" @click="toggleCategory(category.key)">
                        <view class="category-card-icon">
                            <uni-icons :type="category.icon" size="24" color="#ffffff"></uni-icons>
                        </view>
                        <view class="card-info">
                            <text class="card-title">{{item.title}}</text>
                            <text class="card-desc">{{item.name}}</text>
                        <view class="category-card-info">
                            <text class="category-card-title">{{category.name}}</text>
                            <text class="category-card-count">{{category.items.length}} ä¸ªåŠŸèƒ½</text>
                        </view>
                        <view class="card-arrow">
                            <uni-icons type="right" size="16" color="rgba(255,255,255,0.6)"></uni-icons>
                        <view class="category-card-arrow" :class="{'expanded': expandedCategories.includes(category.key)}">
                            <uni-icons type="down" size="20" color="rgba(255,255,255,0.8)"></uni-icons>
                        </view>
                    </view>
                    <!-- å­èœå•项 - ç™½è‰²å¡ç‰‡é…å·¦ä¾§å½©è‰²æŒ‡ç¤ºæ¡ -->
                    <view class="sub-menu-container" v-show="expandedCategories.includes(category.key)">
                        <view class="sub-menu-item" v-for="(item, index) in category.items" :key="item.name"
                            @click="navigateTo(item)" :style="{animationDelay: (index * 0.06) + 's'}">
                            <view class="sub-menu-card">
                                <view class="sub-menu-indicator" :class="'indicator-' + item.color"></view>
                                <view class="sub-menu-icon" :class="'icon-bg-' + item.color">
                                    <uni-icons :type="getIconType(item)" size="24" color="#ffffff"></uni-icons>
                                </view>
                                <view class="sub-menu-info">
                                    <text class="sub-menu-title">{{item.title}}</text>
                                    <text class="sub-menu-desc">{{item.name}}</text>
                                </view>
                                <view class="sub-menu-arrow">
                                    <uni-icons type="right" size="16" color="#c0c4cc"></uni-icons>
                                </view>
                            </view>
                        </view>
                    </view>
                </view>
            </view>
                <!-- æœªåˆ†ç±»èœå•分隔区域 -->
                <view class="uncategorized-section" v-if="uncategorizedMenus.length > 0">
                    <view class="section-divider">
                        <view class="divider-line"></view>
                        <text class="divider-text">其他</text>
                        <view class="divider-line"></view>
                    </view>
                    <view class="menu-grid-flat">
                        <view class="menu-item-flat" v-for="(item, index) in uncategorizedMenus" :key="item.name"
                            @click="navigateTo(item)" :style="{animationDelay: (index * 0.1) + 's'}">
                            <view class="menu-card-flat" :class="'card-flat-' + item.color">
                                <view class="card-flat-icon">
                                    <uni-icons :type="getIconType(item)" size="28" color="#ffffff"></uni-icons>
                                </view>
                                <view class="card-flat-info">
                                    <text class="card-flat-title">{{item.title}}</text>
                                    <text class="card-flat-desc">{{item.name}}</text>
                                </view>
                                <view class="card-flat-arrow">
                                    <uni-icons type="right" size="16" color="rgba(255,255,255,0.6)"></uni-icons>
                                </view>
                            </view>
                        </view>
                    </view>
                </view>
            </template>
            <!-- å¹³é“ºæ¨¡å¼ï¼šç›´æŽ¥æ˜¾ç¤ºæ‰€æœ‰èœå• -->
            <template v-else>
                <view class="menu-grid-flat">
                    <view class="menu-item-flat" v-for="(item, index) in elements" :key="item.name"
                        @click="navigateTo(item)" :style="{animationDelay: (index * 0.1) + 's'}">
                        <view class="menu-card-flat" :class="'card-flat-' + item.color">
                            <view class="card-flat-icon">
                                <uni-icons :type="getIconType(item)" size="28" color="#ffffff"></uni-icons>
                            </view>
                            <view class="card-flat-info">
                                <text class="card-flat-title">{{item.title}}</text>
                                <text class="card-flat-desc">{{item.name}}</text>
                            </view>
                            <view class="card-flat-arrow">
                                <uni-icons type="right" size="16" color="rgba(255,255,255,0.6)"></uni-icons>
                            </view>
                        </view>
                    </view>
                </view>
            </template>
        </view>
        
        <!-- åº•部版权 -->
        <view class="footer">
            <text class="footer-text">WMS Mobile v1.0</text>
            <text class="footer-text">© 2025 WMS Mobile v2.0</text>
        </view>
    </view>
</template>
@@ -50,6 +118,9 @@
                token: '',
                icon: '',
                elements: [],
                // æ˜¯å¦ä½¿ç”¨åˆ†ç±»æ¨¡å¼ï¼ˆtrue: ä¸Šä¸‹å±‚折叠菜单模式, false: å¹³é“ºèœå•模式)
                useCategoryMode: true,
                // é»˜è®¤èœå•数据(用于后端无返回时)
                elements2: [
                    {
                        title: '组托',
@@ -64,6 +135,20 @@
                        color: 'purple',
                        cuIcon: '',
                        url: '/order/orderList'
                    },
                    {
                        title: 'AGV容器入库',
                        name: 'agv_start',
                        color: 'blue',
                        cuIcon: '',
                        url: '/AGV/agv_start'
                    },
                    {
                        title: 'AGV容器回库',
                        name: 'agv_back',
                        color: 'orange',
                        cuIcon: '',
                        url: '/AGV/agv_back'
                    },
                    {
                        title: '库存查询',
@@ -91,8 +176,64 @@
                    'orderPutDown': 'bottom',
                    'restock': 'refresh',
                    'stockCheck': 'checkbox',
                }
                    'agv_start': 'navigate',
                    'agv_back': 'refresh',
                },
                // èœå•分类配置(仅分类模式使用)
                // key: åˆ†ç±»å”¯ä¸€æ ‡è¯†
                // name: åˆ†ç±»æ˜¾ç¤ºåç§°
                // color: åˆ†ç±»å›¾æ ‡é¢œè‰²
                // icon: åˆ†ç±»å›¾æ ‡
                // menuNames: è¯¥åˆ†ç±»åŒ…含的菜单name列表
                categoryConfig: [
                    {
                        key: 'pakin_category',
                        name: '入库管理',
                        color: 'cyan',
                        icon: 'upload',
                        menuNames: ['pakin', 'orderPakin']
                    },
                    {
                        key: 'agv_category',
                        name: 'AGV管理',
                        color: 'blue',
                        icon: 'navigate',
                        menuNames: ['agv_start', 'agv_back']
                    },
                    {
                        key: 'stock_category',
                        name: '库存管理',
                        color: 'green',
                        icon: 'search',
                        menuNames: ['stockQuery']
                    }
                ],
                // ä¸å‚与分类的菜单项(如退出登录,始终单独显示)
                excludeFromCategory: ['logOut'],
                // å½“前展开的分类列表
                expandedCategories: []
            };
        },
        computed: {
            // åˆ†ç±»åŽçš„菜单数据(过滤掉空分类)
            categorizedMenus() {
                return this.categoryConfig.map(category => {
                    const items = this.elements.filter(item =>
                        category.menuNames.includes(item.name)
                    );
                    return {
                        ...category,
                        items: items
                    };
                }).filter(category => category.items.length > 0);
            },
            // æœªåˆ†ç±»çš„菜单(不在任何分类中或在排除列表中)
            uncategorizedMenus() {
                const allCategorizedNames = this.categoryConfig.flatMap(c => c.menuNames);
                return this.elements.filter(item =>
                    !allCategorizedNames.includes(item.name) || this.excludeFromCategory.includes(item.name)
                );
            }
        },
        onShow() {
            this.baseUrl = uni.getStorageSync('baseUrl');
@@ -100,6 +241,15 @@
            this.getAuth();
        },
        methods: {
            // åˆ‡æ¢åˆ†ç±»å±•å¼€/收起
            toggleCategory(categoryKey) {
                const index = this.expandedCategories.indexOf(categoryKey);
                if (index > -1) {
                    this.expandedCategories.splice(index, 1);
                } else {
                    this.expandedCategories.push(categoryKey);
                }
            },
            // èŽ·å–å›¾æ ‡ç±»åž‹
            getIconType(item) {
                return this.iconMap[item.name] || 'circle';
@@ -253,16 +403,101 @@
        position: relative;
    }
    
    .menu-grid {
    /* åˆ†ç±»åŒºåŸŸ */
    .category-section {
        margin-bottom: 24rpx;
    }
    /* åˆ†ç±»å¡ç‰‡ - æ¸å˜è‰²é£Žæ ¼ */
    .category-card {
        display: flex;
        align-items: center;
        padding: 24rpx 28rpx;
        border-radius: 20rpx;
        box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.15);
        transition: transform 0.2s ease, box-shadow 0.2s ease;
    }
    .category-card:active {
        transform: scale(0.98);
        box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.2);
    }
    .category-card-icon {
        width: 56rpx;
        height: 56rpx;
        background: rgba(255, 255, 255, 0.25);
        border-radius: 14rpx;
        display: flex;
        align-items: center;
        justify-content: center;
        margin-right: 20rpx;
    }
    .category-card-info {
        flex: 1;
        display: flex;
        flex-direction: column;
    }
    
    .menu-item {
        margin-bottom: 20rpx;
        animation: slideUp 0.5s ease forwards;
    .category-card-title {
        font-size: 32rpx;
        color: #ffffff;
        font-weight: 600;
    }
    .category-card-count {
        font-size: 24rpx;
        color: rgba(255, 255, 255, 0.7);
        margin-top: 4rpx;
    }
    .category-card-arrow {
        width: 44rpx;
        height: 44rpx;
        background: rgba(255, 255, 255, 0.15);
        border-radius: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: transform 0.3s ease;
    }
    .category-card-arrow.expanded {
        transform: rotate(180deg);
    }
    /* åˆ†ç±»å¡ç‰‡é¢œè‰² */
    .category-card-cyan {
        background: linear-gradient(135deg, #1cbbb4 0%, #16a085 100%);
    }
    .category-card-blue {
        background: linear-gradient(135deg, #0081ff 0%, #00bcd4 100%);
    }
    .category-card-green {
        background: linear-gradient(135deg, #39b54a 0%, #8dc63f 100%);
    }
    .category-card-purple {
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    }
    .category-card-orange {
        background: linear-gradient(135deg, #f37b1d 0%, #fbbd08 100%);
    }
    /* å­èœå•容器 */
    .sub-menu-container {
        padding: 16rpx 0 0 0;
    }
    .sub-menu-item {
        margin-bottom: 16rpx;
        animation: slideUp 0.4s ease forwards;
        opacity: 0;
        transform: translateY(20rpx);
        transform: translateY(16rpx);
    }
    
    @keyframes slideUp {
@@ -272,105 +507,198 @@
        }
    }
    
    .menu-card {
    /* å­èœå•卡片 - ç™½åº•配彩色指示条 */
    .sub-menu-card {
        display: flex;
        align-items: center;
        padding: 28rpx 24rpx;
        border-radius: 20rpx;
        box-shadow: 0 8rpx 30rpx rgba(0, 0, 0, 0.12);
        padding: 20rpx 24rpx;
        background: #ffffff;
        border-radius: 16rpx;
        box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);
        position: relative;
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease;
    }
    
    .menu-card:active {
    .sub-menu-card:active {
        transform: scale(0.98);
        box-shadow: 0 4rpx 15rpx rgba(0, 0, 0, 0.15);
        box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.12);
    }
    
    .card-icon {
        width: 80rpx;
        height: 80rpx;
        background: rgba(255, 255, 255, 0.25);
        border-radius: 20rpx;
    /* å·¦ä¾§å½©è‰²æŒ‡ç¤ºæ¡ */
    .sub-menu-indicator {
        position: absolute;
        left: 0;
        top: 0;
        bottom: 0;
        width: 6rpx;
        border-radius: 0 6rpx 6rpx 0;
    }
    .indicator-cyan { background: linear-gradient(180deg, #1cbbb4 0%, #16a085 100%); }
    .indicator-purple { background: linear-gradient(180deg, #667eea 0%, #764ba2 100%); }
    .indicator-blue { background: linear-gradient(180deg, #0081ff 0%, #00bcd4 100%); }
    .indicator-green { background: linear-gradient(180deg, #39b54a 0%, #8dc63f 100%); }
    .indicator-orange { background: linear-gradient(180deg, #f37b1d 0%, #fbbd08 100%); }
    .indicator-red { background: linear-gradient(180deg, #e54d42 0%, #f37b1d 100%); }
    .indicator-pink { background: linear-gradient(180deg, #e03997 0%, #f37b1d 100%); }
    .indicator-mauve { background: linear-gradient(180deg, #9c26b0 0%, #667eea 100%); }
    .indicator-brown { background: linear-gradient(180deg, #a5673f 0%, #8799a3 100%); }
    .indicator-olive { background: linear-gradient(180deg, #8dc63f 0%, #39b54a 100%); }
    .indicator-yellow { background: linear-gradient(180deg, #fbbd08 0%, #f37b1d 100%); }
    .indicator-grey { background: linear-gradient(180deg, #8799a3 0%, #606266 100%); }
    /* å­èœå•图标背景 */
    .sub-menu-icon {
        width: 56rpx;
        height: 56rpx;
        border-radius: 14rpx;
        display: flex;
        align-items: center;
        justify-content: center;
        margin-right: 24rpx;
        margin-left: 12rpx;
        margin-right: 20rpx;
    }
    
    .card-info {
    .icon-bg-cyan { background: linear-gradient(135deg, #1cbbb4 0%, #16a085 100%); }
    .icon-bg-purple { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); }
    .icon-bg-blue { background: linear-gradient(135deg, #0081ff 0%, #00bcd4 100%); }
    .icon-bg-green { background: linear-gradient(135deg, #39b54a 0%, #8dc63f 100%); }
    .icon-bg-orange { background: linear-gradient(135deg, #f37b1d 0%, #fbbd08 100%); }
    .icon-bg-red { background: linear-gradient(135deg, #e54d42 0%, #f37b1d 100%); }
    .icon-bg-pink { background: linear-gradient(135deg, #e03997 0%, #f37b1d 100%); }
    .icon-bg-mauve { background: linear-gradient(135deg, #9c26b0 0%, #667eea 100%); }
    .icon-bg-brown { background: linear-gradient(135deg, #a5673f 0%, #8799a3 100%); }
    .icon-bg-olive { background: linear-gradient(135deg, #8dc63f 0%, #39b54a 100%); }
    .icon-bg-yellow { background: linear-gradient(135deg, #fbbd08 0%, #f37b1d 100%); }
    .icon-bg-grey { background: linear-gradient(135deg, #8799a3 0%, #606266 100%); }
    .sub-menu-info {
        flex: 1;
        display: flex;
        flex-direction: column;
    }
    .sub-menu-title {
        font-size: 30rpx;
        color: #303133;
        font-weight: 500;
    }
    .sub-menu-desc {
        font-size: 24rpx;
        color: #909399;
        margin-top: 4rpx;
    }
    .sub-menu-arrow {
        width: 36rpx;
        height: 36rpx;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    /* æœªåˆ†ç±»èœå•区域 */
    .uncategorized-section {
        margin-top: 20rpx;
    }
    .section-divider {
        display: flex;
        align-items: center;
        padding: 20rpx 0 24rpx;
    }
    .divider-line {
        flex: 1;
        height: 2rpx;
        background: linear-gradient(90deg, transparent 0%, #dcdfe6 50%, transparent 100%);
    }
    .divider-text {
        padding: 0 24rpx;
        font-size: 26rpx;
        color: #909399;
    }
    /* å¹³é“ºæ¨¡å¼èœå• */
    .menu-grid-flat {
        display: flex;
        flex-direction: column;
    }
    .menu-item-flat {
        margin-bottom: 20rpx;
        animation: slideUp 0.5s ease forwards;
        opacity: 0;
        transform: translateY(20rpx);
    }
    .menu-card-flat {
        display: flex;
        align-items: center;
        padding: 24rpx 24rpx;
        border-radius: 18rpx;
        box-shadow: 0 6rpx 24rpx rgba(0, 0, 0, 0.12);
        transition: transform 0.2s ease, box-shadow 0.2s ease;
    }
    .menu-card-flat:active {
        transform: scale(0.98);
        box-shadow: 0 3rpx 12rpx rgba(0, 0, 0, 0.15);
    }
    .card-flat-icon {
        width: 64rpx;
        height: 64rpx;
        background: rgba(255, 255, 255, 0.25);
        border-radius: 16rpx;
        display: flex;
        align-items: center;
        justify-content: center;
        margin-right: 20rpx;
    }
    .card-flat-info {
        flex: 1;
    }
    
    .card-title {
        font-size: 32rpx;
    .card-flat-title {
        font-size: 30rpx;
        color: #ffffff;
        font-weight: 600;
        display: block;
    }
    
    .card-desc {
    .card-flat-desc {
        font-size: 24rpx;
        color: rgba(255, 255, 255, 0.7);
        display: block;
        margin-top: 6rpx;
        margin-top: 4rpx;
    }
    
    .card-arrow {
        width: 40rpx;
        height: 40rpx;
    .card-flat-arrow {
        width: 36rpx;
        height: 36rpx;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    
    /* å¡ç‰‡é¢œè‰² */
    .card-cyan {
        background: linear-gradient(135deg, #1cbbb4 0%, #16a085 100%);
    }
    .card-purple {
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    }
    .card-blue {
        background: linear-gradient(135deg, #0081ff 0%, #00bcd4 100%);
    }
    .card-green {
        background: linear-gradient(135deg, #39b54a 0%, #8dc63f 100%);
    }
    .card-orange {
        background: linear-gradient(135deg, #f37b1d 0%, #fbbd08 100%);
    }
    .card-red {
        background: linear-gradient(135deg, #e54d42 0%, #f37b1d 100%);
    }
    .card-pink {
        background: linear-gradient(135deg, #e03997 0%, #f37b1d 100%);
    }
    .card-mauve {
        background: linear-gradient(135deg, #9c26b0 0%, #667eea 100%);
    }
    .card-brown {
        background: linear-gradient(135deg, #a5673f 0%, #8799a3 100%);
    }
    .card-olive {
        background: linear-gradient(135deg, #8dc63f 0%, #39b54a 100%);
    }
    .card-yellow {
        background: linear-gradient(135deg, #fbbd08 0%, #f37b1d 100%);
    }
    .card-grey {
        background: linear-gradient(135deg, #8799a3 0%, #606266 100%);
    }
    /* å¹³é“ºå¡ç‰‡é¢œè‰² */
    .card-flat-cyan { background: linear-gradient(135deg, #1cbbb4 0%, #16a085 100%); }
    .card-flat-purple { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); }
    .card-flat-blue { background: linear-gradient(135deg, #0081ff 0%, #00bcd4 100%); }
    .card-flat-green { background: linear-gradient(135deg, #39b54a 0%, #8dc63f 100%); }
    .card-flat-orange { background: linear-gradient(135deg, #f37b1d 0%, #fbbd08 100%); }
    .card-flat-red { background: linear-gradient(135deg, #e54d42 0%, #f37b1d 100%); }
    .card-flat-pink { background: linear-gradient(135deg, #e03997 0%, #f37b1d 100%); }
    .card-flat-mauve { background: linear-gradient(135deg, #9c26b0 0%, #667eea 100%); }
    .card-flat-brown { background: linear-gradient(135deg, #a5673f 0%, #8799a3 100%); }
    .card-flat-olive { background: linear-gradient(135deg, #8dc63f 0%, #39b54a 100%); }
    .card-flat-yellow { background: linear-gradient(135deg, #fbbd08 0%, #f37b1d 100%); }
    .card-flat-grey { background: linear-gradient(135deg, #8799a3 0%, #606266 100%); }
    
    /* åº•部 */
    .footer {
pages/mat/matList.vue
File was deleted
pages/mat/matQuery2.vue
File was deleted
pages/order/orderDetlList.vue
@@ -264,9 +264,10 @@
</script>
<style>
    /* å¼•入公共样式 */
    @import url('../../static/css/common.css');
    .page-container {
        min-height: 100vh;
        background: linear-gradient(135deg, #f5f7fa 0%, #e4e8eb 100%);
        padding-bottom: 120rpx;
    }
    
@@ -470,16 +471,10 @@
    
    /* ç©ºçŠ¶æ€ */
    .empty-state {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        padding: 60rpx 0;
    }
    
    .empty-text {
        font-size: 26rpx;
        color: #909399;
        margin-top: 20rpx;
    }
    
pages/order/orderDetlList2.vue
File was deleted
pages/order/orderPakin.vue
File was deleted
pages/order/orderPakin2.vue
@@ -501,102 +501,11 @@
</script>
<style>
    /* å¼•入公共样式 */
    @import url('../../static/css/common.css');
    @import url('../../static/css/wms.css/wms.css');
    page {
        height: 100%;
        background: #f5f7fa;
    }
    .page-container {
        min-height: 100vh;
        background: linear-gradient(135deg, #f5f7fa 0%, #e4e8eb 100%);
        padding-bottom: 110rpx;
        box-sizing: border-box;
    }
    /* è¡¨å•区域 */
    .form-section {
        background: #ffffff;
        padding: 12rpx 20rpx;
        box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
    }
    .form-item {
        display: flex;
        align-items: center;
        padding: 12rpx 0;
        border-bottom: 1rpx solid #f0f0f0;
    }
    .form-item:last-child {
        border-bottom: none;
    }
    .form-label {
        display: flex;
        align-items: center;
        width: 140rpx;
        flex-shrink: 0;
    }
    .label-text {
        font-size: 26rpx;
        color: #303133;
        margin-left: 6rpx;
    }
    .form-input-wrap {
        flex: 1;
        display: flex;
        align-items: center;
        background: #f5f7fa;
        border-radius: 6rpx;
        padding: 0 16rpx;
        height: 60rpx;
    }
    .form-input {
        flex: 1;
        height: 60rpx;
        font-size: 26rpx;
        color: #303133;
    }
    /* åˆ—表头部 */
    .list-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        padding: 16rpx 20rpx;
        background: #ffffff;
        margin-top: 12rpx;
        box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
    }
    .header-left {
        display: flex;
        align-items: center;
    }
    .header-title {
        font-size: 28rpx;
        color: #303133;
        font-weight: 600;
    }
    .count-badge {
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        border-radius: 16rpx;
        padding: 2rpx 12rpx;
        margin-left: 12rpx;
    }
    .count-text {
        font-size: 20rpx;
        color: #ffffff;
        font-weight: 500;
    }
    .header-right {
        display: flex;
@@ -606,50 +515,6 @@
    .review-status {
        font-size: 22rpx;
        color: #909399;
    }
    /* å•†å“åˆ—表 */
    .list-container {
        padding: 0 20rpx;
    }
    .mat-card {
        background: #ffffff;
        border-radius: 12rpx;
        margin-top: 12rpx;
        box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
        overflow: hidden;
    }
    .card-top {
        display: flex;
        align-items: center;
        padding: 14rpx 16rpx;
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    }
    .card-index {
        width: 36rpx;
        height: 36rpx;
        background: rgba(255, 255, 255, 0.25);
        border-radius: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 22rpx;
        color: #ffffff;
        font-weight: 600;
        margin-right: 12rpx;
    }
    .mat-code-wrap {
        flex: 1;
    }
    .mat-code {
        font-size: 26rpx;
        color: #ffffff;
        font-weight: 600;
    }
    .review-badge {
@@ -670,249 +535,7 @@
        color: #ffffff;
    }
    /* å¡ç‰‡å†…容 */
    .card-content {
        padding: 12rpx 16rpx;
    }
    .info-row {
        display: flex;
        margin-bottom: 8rpx;
    }
    .info-row:last-child {
        margin-bottom: 0;
    }
    .info-col {
        flex: 1;
    }
    .info-col.half {
        width: 50%;
        flex: none;
    }
    .info-label {
        font-size: 20rpx;
        color: #909399;
        display: block;
    }
    .info-value {
        font-size: 24rpx;
        color: #303133;
        display: block;
        margin-top: 2rpx;
    }
    .info-value.highlight {
        color: #667eea;
        font-weight: 500;
    }
    .info-value.qty {
        font-size: 28rpx;
        color: #303133;
        font-weight: 600;
    }
    /* å¡ç‰‡æ“ä½œ */
    .card-actions {
        display: flex;
        border-top: 1rpx solid #f0f0f0;
    }
    .action-btn {
        flex: 1;
        display: flex;
        align-items: center;
        justify-content: center;
        padding: 14rpx 0;
    }
    .edit-btn {
        border-right: 1rpx solid #f0f0f0;
    }
    .action-text {
        font-size: 24rpx;
        color: #667eea;
        margin-left: 6rpx;
    }
    .delete-text {
        color: #f56c6c;
    }
    /* ç©ºçŠ¶æ€ */
    .empty-state {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        padding: 60rpx 0;
    }
    .empty-text {
        font-size: 26rpx;
        color: #909399;
        margin-top: 16rpx;
    }
    .empty-hint {
        font-size: 22rpx;
        color: #c0c4cc;
        margin-top: 8rpx;
    }
    .bottom-placeholder {
        height: 20rpx;
    }
    /* åº•部操作栏 */
    .bottom-bar {
        position: fixed;
        bottom: 0;
        left: 0;
        right: 0;
        display: flex;
        padding: 16rpx 20rpx;
        background: #ffffff;
        box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06);
    }
    .btn-reset {
        display: flex;
        align-items: center;
        justify-content: center;
        width: 160rpx;
        height: 72rpx;
        background: #f5f7fa;
        border-radius: 36rpx;
        margin-right: 16rpx;
    }
    .btn-reset .btn-text {
        font-size: 26rpx;
        color: #909399;
        margin-left: 6rpx;
    }
    .btn-submit {
        flex: 1;
        display: flex;
        align-items: center;
        justify-content: center;
        height: 72rpx;
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        border-radius: 36rpx;
    }
    .btn-submit .btn-text {
        font-size: 28rpx;
        color: #ffffff;
        font-weight: 500;
        margin-left: 6rpx;
    }
    .btn-disabled {
        background: #c0c4cc;
        opacity: 0.6;
    }
    /* å¼¹çª—样式 */
    .popup-card {
        width: 600rpx;
        background: #ffffff;
        border-radius: 16rpx;
        overflow: hidden;
    }
    .popup-header {
        padding: 24rpx;
        text-align: center;
        border-bottom: 1rpx solid #f0f0f0;
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    }
    .popup-title {
        font-size: 30rpx;
        color: #ffffff;
        font-weight: 600;
    }
    .popup-body {
        padding: 24rpx;
    }
    .popup-row {
        display: flex;
        align-items: center;
        margin-bottom: 20rpx;
        height: 70rpx;
    }
    .popup-row:last-child {
        margin-bottom: 0;
    }
    .popup-label {
        width: 80rpx;
        font-size: 26rpx;
        color: #606266;
        flex-shrink: 0;
    }
    .popup-value {
        flex: 1;
        height: 70rpx;
        background: #f5f7fa;
        border-radius: 8rpx;
        padding: 0 16rpx;
        font-size: 26rpx;
        color: #303133;
        display: flex;
        align-items: center;
        box-sizing: border-box;
    }
    .popup-value.disabled {
        color: #909399;
        background: #f0f0f0;
    }
    .popup-value.input {
        padding: 0 16rpx;
    }
    .popup-value.number {
        justify-content: center;
        background: transparent;
        padding: 0;
    }
    .popup-footer {
        display: flex;
        border-top: 1rpx solid #f0f0f0;
    }
    .popup-btn {
        flex: 1;
        height: 90rpx;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 28rpx;
    }
    .popup-btn.cancel {
        color: #909399;
        border-right: 1rpx solid #f0f0f0;
    }
    .popup-btn.confirm {
        color: #667eea;
        font-weight: 600;
    }
</style>
pages/order/orderPutDown.vue
File was deleted
pages/order/orderPutOn.vue
File was deleted
pages/pakin/leftovers.vue
File was deleted
pages/pakin/mergeStore.vue
File was deleted
pages/pakin/pakin.vue
@@ -106,7 +106,7 @@
                <uni-icons type="refresh" size="18" color="#909399"></uni-icons>
                <text class="btn-text">重置</text>
            </view>
            <view class="btn-submit" :class="{'btn-disabled': dataList.length === 0}" @click="combConfirm('warn')">
            <view class="btn-submit" :class="{'btn-disabled': isSubmitting || dataList.length === 0}" @click="combConfirm('warn')">
                <uni-icons type="checkbox" size="18" color="#ffffff"></uni-icons>
                <text class="btn-text">确认组托</text>
            </view>
@@ -192,7 +192,8 @@
                removeNum: 0,
                ck1: true,
                ck2: false,
                isFull: true
                isFull: true,
                isSubmitting: false
            }
        },
        onLoad() {
@@ -416,7 +417,7 @@
                this.count = value
            },
            combConfirm(type) {
                if (this.dataList.length === 0) return;
                if (this.isSubmitting || this.dataList.length === 0) return;
                this.msgType = type
                this.title = '确认组托'
                this.content = '确认将商品组托入库?'
@@ -428,20 +429,24 @@
            comb() {
                uni.vibrateShort();
                let that = this;
                that.isSubmitting = true;
                if (that.barcode === '') {
                    this.messageText = "请扫描托盘条码"
                    this.messageToggle('error')
                    that.isSubmitting = false;
                    return;
                }
                if (that.dataList.length === 0) {
                    this.messageText = "请添加商品列表"
                    this.messageToggle('error')
                    that.isSubmitting = false;
                    return;
                }
                for (var i = 0; i < that.dataList.length; i++) {
                    if (that.dataList[i].anfme == 0 || that.dataList[i].anfme == '') {
                        this.messageText = that.dataList[i].matnr + '组托数量不能为0'
                        this.messageToggle('error')
                        that.isSubmitting = false;
                        return;
                    }
                }
@@ -476,6 +481,13 @@
                            that.messageText = res.msg
                            that.messageToggle('error')
                        }
                    },
                    fail: () => {
                        that.messageText = "网络请求超时"
                        that.messageToggle('error')
                    },
                    complete: () => {
                        that.isSubmitting = false;
                    }
                });
            },
@@ -507,401 +519,8 @@
</script>
<style>
    /* å¼•入公共样式 */
    @import url('../../static/css/common.css');
    @import url('../../static/css/wms.css/wms.css');
    page {
        height: 100%;
        background: #f5f7fa;
    }
    .page-container {
        min-height: 100vh;
        background: linear-gradient(135deg, #f5f7fa 0%, #e4e8eb 100%);
        padding-bottom: 110rpx;
        box-sizing: border-box;
    }
    /* è¡¨å•区域 */
    .form-section {
        background: #ffffff;
        padding: 12rpx 20rpx;
        box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
    }
    .form-item {
        display: flex;
        align-items: center;
        padding: 12rpx 0;
        border-bottom: 1rpx solid #f0f0f0;
    }
    .form-item:last-child {
        border-bottom: none;
    }
    .form-label {
        display: flex;
        align-items: center;
        width: 140rpx;
        flex-shrink: 0;
    }
    .label-text {
        font-size: 26rpx;
        color: #303133;
        margin-left: 6rpx;
    }
    .form-input-wrap {
        flex: 1;
        display: flex;
        align-items: center;
        background: #f5f7fa;
        border-radius: 6rpx;
        padding: 0 16rpx;
        height: 60rpx;
    }
    .form-input {
        flex: 1;
        height: 60rpx;
        font-size: 26rpx;
        color: #303133;
    }
    /* åˆ—表头部 */
    .list-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        padding: 16rpx 20rpx;
        background: #ffffff;
        margin-top: 12rpx;
        box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
    }
    .header-left {
        display: flex;
        align-items: center;
    }
    .header-title {
        font-size: 28rpx;
        color: #303133;
        font-weight: 600;
    }
    .count-badge {
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        border-radius: 16rpx;
        padding: 2rpx 12rpx;
        margin-left: 12rpx;
    }
    .count-text {
        font-size: 20rpx;
        color: #ffffff;
        font-weight: 500;
    }
    /* å•†å“åˆ—表 */
    .list-container {
        padding: 0 20rpx;
    }
    .mat-card {
        background: #ffffff;
        border-radius: 12rpx;
        margin-top: 12rpx;
        box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
        overflow: hidden;
    }
    .card-top {
        display: flex;
        align-items: center;
        padding: 14rpx 16rpx;
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    }
    .card-index {
        width: 36rpx;
        height: 36rpx;
        background: rgba(255, 255, 255, 0.25);
        border-radius: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 22rpx;
        color: #ffffff;
        font-weight: 600;
        margin-right: 12rpx;
    }
    .mat-code-wrap {
        flex: 1;
    }
    .mat-code {
        font-size: 26rpx;
        color: #ffffff;
        font-weight: 600;
    }
    .qty-badge {
        background: rgba(255, 255, 255, 0.3);
        padding: 4rpx 14rpx;
        border-radius: 16rpx;
    }
    .qty-text {
        font-size: 24rpx;
        color: #ffffff;
        font-weight: 600;
    }
    /* å¡ç‰‡å†…容 */
    .card-content {
        padding: 12rpx 16rpx;
    }
    .info-row {
        display: flex;
        margin-bottom: 8rpx;
    }
    .info-row:last-child {
        margin-bottom: 0;
    }
    .info-col {
        flex: 1;
    }
    .info-col.half {
        width: 50%;
        flex: none;
    }
    .info-label {
        font-size: 20rpx;
        color: #909399;
        display: block;
    }
    .info-value {
        font-size: 24rpx;
        color: #303133;
        display: block;
        margin-top: 2rpx;
    }
    .info-value.highlight {
        color: #667eea;
        font-weight: 500;
    }
    .info-value.qty {
        font-size: 28rpx;
        color: #303133;
        font-weight: 600;
    }
    /* å¡ç‰‡æ“ä½œ */
    .card-actions {
        display: flex;
        border-top: 1rpx solid #f0f0f0;
    }
    .action-btn {
        flex: 1;
        display: flex;
        align-items: center;
        justify-content: center;
        padding: 14rpx 0;
    }
    .edit-btn {
        border-right: 1rpx solid #f0f0f0;
    }
    .action-text {
        font-size: 24rpx;
        color: #667eea;
        margin-left: 6rpx;
    }
    .delete-text {
        color: #f56c6c;
    }
    /* ç©ºçŠ¶æ€ */
    .empty-state {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        padding: 80rpx 0;
    }
    .empty-text {
        font-size: 26rpx;
        color: #909399;
        margin-top: 16rpx;
    }
    .empty-hint {
        font-size: 22rpx;
        color: #c0c4cc;
        margin-top: 8rpx;
    }
    .bottom-placeholder {
        height: 20rpx;
    }
    /* åº•部操作栏 */
    .bottom-bar {
        position: fixed;
        bottom: 0;
        left: 0;
        right: 0;
        display: flex;
        padding: 16rpx 20rpx;
        background: #ffffff;
        box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06);
    }
    .btn-reset {
        display: flex;
        align-items: center;
        justify-content: center;
        width: 160rpx;
        height: 72rpx;
        background: #f5f7fa;
        border-radius: 36rpx;
        margin-right: 16rpx;
    }
    .btn-reset .btn-text {
        font-size: 26rpx;
        color: #909399;
        margin-left: 6rpx;
    }
    .btn-submit {
        flex: 1;
        display: flex;
        align-items: center;
        justify-content: center;
        height: 72rpx;
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        border-radius: 36rpx;
    }
    .btn-submit .btn-text {
        font-size: 28rpx;
        color: #ffffff;
        font-weight: 500;
        margin-left: 6rpx;
    }
    .btn-disabled {
        opacity: 0.6;
    }
    /* å¼¹çª—样式 */
    .popup-card {
        width: 600rpx;
        background: #ffffff;
        border-radius: 16rpx;
        overflow: hidden;
    }
    .popup-header {
        padding: 24rpx;
        text-align: center;
        border-bottom: 1rpx solid #f0f0f0;
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    }
    .popup-title {
        font-size: 30rpx;
        color: #ffffff;
        font-weight: 600;
    }
    .popup-body {
        padding: 24rpx;
    }
    .popup-row {
        display: flex;
        align-items: center;
        margin-bottom: 20rpx;
        height: 70rpx;
    }
    .popup-row:last-child {
        margin-bottom: 0;
    }
    .popup-label {
        width: 80rpx;
        font-size: 26rpx;
        color: #606266;
        flex-shrink: 0;
    }
    .popup-value {
        flex: 1;
        height: 70rpx;
        background: #f5f7fa;
        border-radius: 8rpx;
        padding: 0 16rpx;
        font-size: 26rpx;
        color: #303133;
        display: flex;
        align-items: center;
        box-sizing: border-box;
    }
    .popup-value.disabled {
        color: #909399;
        background: #f0f0f0;
    }
    .popup-value.input {
        padding: 0 16rpx;
    }
    .popup-value.number {
        justify-content: center;
        background: transparent;
        padding: 0;
    }
    .popup-footer {
        display: flex;
        border-top: 1rpx solid #f0f0f0;
    }
    .popup-btn {
        flex: 1;
        height: 90rpx;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 28rpx;
    }
    .popup-btn.cancel {
        color: #909399;
        border-right: 1rpx solid #f0f0f0;
    }
    .popup-btn.confirm {
        color: #667eea;
        font-weight: 600;
    }
</style>
pages/pakin/pickAgain.vue
File was deleted
pages/pakin/piking.vue
File was deleted
pages/pakin/putOn.vue
File was deleted
pages/pingku/PInventoryAdjustment.vue
File was deleted
pages/pingku/POrderDetlList.vue
File was deleted
pages/pingku/POrderDetlListOut.vue
File was deleted
pages/pingku/POrderList.vue
File was deleted
pages/pingku/POrderListOut.vue
File was deleted
pages/pingku/POrderPakin.vue
File was deleted
pages/pingku/POrderPakinOut.vue
File was deleted
pages/print/print.vue
File was deleted
pages/print/printUNI.vue
File was deleted
pages/print/qr.vue
File was deleted
pages/stock/changePallet.vue
File was deleted
pages/stock/restock.vue
File was deleted
pages/stock/stockCheck.vue
File was deleted
pages/stock/stockQuery.vue
@@ -212,105 +212,15 @@
</script>
<style>
    page {
        background: #f5f7fa;
    }
    .page-container {
        min-height: 100vh;
        background: linear-gradient(135deg, #f5f7fa 0%, #e4e8eb 100%);
        padding-bottom: 110rpx;
        box-sizing: border-box;
    }
    /* è¡¨å•区域 */
    .form-section {
        background: #ffffff;
        padding: 12rpx 20rpx;
        box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
    }
    .form-item {
        display: flex;
        align-items: center;
        padding: 12rpx 0;
        border-bottom: 1rpx solid #f0f0f0;
    }
    .form-item:last-child {
        border-bottom: none;
    }
    /* å¼•入公共样式 */
    @import url('../../static/css/common.css');
    /* é¡µé¢ç‰¹æœ‰æ ·å¼ */
    .form-label {
        display: flex;
        align-items: center;
        width: 140rpx;
        flex-shrink: 0;
    }
    
    .label-text {
        font-size: 26rpx;
        color: #303133;
        margin-left: 6rpx;
    }
    .form-input-wrap {
        flex: 1;
        display: flex;
        align-items: center;
        background: #f5f7fa;
        border-radius: 6rpx;
        padding: 0 16rpx;
        height: 60rpx;
    }
    .form-input {
        flex: 1;
        height: 60rpx;
        font-size: 26rpx;
        color: #303133;
    }
    /* åˆ—表头部 */
    .list-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        padding: 16rpx 20rpx;
        background: #ffffff;
        margin-top: 12rpx;
        box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
    }
    .header-left {
        display: flex;
        align-items: center;
    }
    .header-title {
        font-size: 28rpx;
        color: #303133;
        font-weight: 600;
    }
    .count-badge {
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        border-radius: 16rpx;
        padding: 2rpx 12rpx;
        margin-left: 12rpx;
    }
    .count-text {
        font-size: 20rpx;
        color: #ffffff;
        font-weight: 500;
    }
    /* åº“存列表 */
    .list-container {
        padding: 0 20rpx;
    }
    /* åº“存卡片 - ä½¿ç”¨card-header而非card-top */
    .stock-card {
        background: #ffffff;
        border-radius: 12rpx;
@@ -327,17 +237,7 @@
    }
    
    .card-index {
        width: 36rpx;
        height: 36rpx;
        background: rgba(255, 255, 255, 0.3);
        border-radius: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 22rpx;
        color: #ffffff;
        font-weight: 600;
        margin-right: 12rpx;
    }
    
    .loc-info {
@@ -350,52 +250,9 @@
        font-weight: 600;
    }
    
    .qty-badge {
        background: rgba(255, 255, 255, 0.3);
        padding: 4rpx 14rpx;
        border-radius: 16rpx;
    }
    .qty-text {
        font-size: 24rpx;
        color: #ffffff;
        font-weight: 600;
    }
    /* å¡ç‰‡å†…容 */
    .card-body {
        padding: 12rpx 16rpx;
    }
    .info-row {
        display: flex;
        margin-bottom: 8rpx;
    }
    .info-row:last-child {
        margin-bottom: 0;
    }
    .info-col {
        flex: 1;
    }
    .info-col.half {
        width: 50%;
        flex: none;
    }
    .info-label {
        font-size: 20rpx;
        color: #909399;
        display: block;
    }
    .info-value {
        font-size: 24rpx;
        color: #303133;
        display: block;
        margin-top: 2rpx;
    }
    
    .info-value.code {
@@ -405,82 +262,5 @@
    
    .info-value.batch {
        color: #667eea;
    }
    .info-value.qty {
        font-size: 28rpx;
        color: #303133;
        font-weight: 600;
    }
    /* ç©ºçŠ¶æ€ */
    .empty-state {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        padding: 80rpx 0;
    }
    .empty-text {
        font-size: 26rpx;
        color: #909399;
        margin-top: 16rpx;
    }
    .empty-hint {
        font-size: 22rpx;
        color: #c0c4cc;
        margin-top: 8rpx;
    }
    .bottom-placeholder {
        height: 20rpx;
    }
    /* åº•部操作栏 */
    .bottom-bar {
        position: fixed;
        bottom: 0;
        left: 0;
        right: 0;
        display: flex;
        padding: 16rpx 20rpx;
        background: #ffffff;
        box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06);
    }
    .btn-reset {
        display: flex;
        align-items: center;
        justify-content: center;
        width: 160rpx;
        height: 72rpx;
        background: #f5f7fa;
        border-radius: 36rpx;
        margin-right: 16rpx;
    }
    .btn-reset .btn-text {
        font-size: 26rpx;
        color: #909399;
        margin-left: 6rpx;
    }
    .btn-submit {
        flex: 1;
        display: flex;
        align-items: center;
        justify-content: center;
        height: 72rpx;
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        border-radius: 36rpx;
    }
    .btn-submit .btn-text {
        font-size: 28rpx;
        color: #ffffff;
        font-weight: 500;
        margin-left: 6rpx;
    }
</style>
pages/tzsk/AGV/AGVPakin.vue
File was deleted
pages/tzsk/AGV/AGVPakinBing.vue
File was deleted
pages/tzsk/AGV/AGVPakinOn.vue
File was deleted
pages/tzsk/AGV/AGVStart.vue
File was deleted
static/css/common.css
New file
@@ -0,0 +1,423 @@
/**
 * å…¬å…±æ ·å¼ - åŸºäºŽ agv_start.vue æŠ½ç¦»
 * é€‚用于:agv_start.vue, orderPakin2.vue, orderDetlList.vue ç­‰é¡µé¢
 */
/* ==================== é¡µé¢åŸºç¡€æ ·å¼ ==================== */
page {
    height: 100%;
    background: #f5f7fa;
}
.page-container {
    min-height: 100vh;
    background: linear-gradient(135deg, #f5f7fa 0%, #e4e8eb 100%);
    padding-bottom: 110rpx;
    box-sizing: border-box;
}
/* ==================== è¡¨å•区域样式 ==================== */
.form-section {
    background: #ffffff;
    padding: 12rpx 20rpx;
    box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
}
.form-item {
    display: flex;
    align-items: center;
    padding: 12rpx 0;
    border-bottom: 1rpx solid #f0f0f0;
}
.form-item:last-child {
    border-bottom: none;
}
.form-label {
    display: flex;
    align-items: center;
    flex-shrink: 0;
    white-space: nowrap;
    margin-right: 16rpx;
}
.label-text {
    font-size: 26rpx;
    color: #303133;
    margin-left: 6rpx;
}
.form-input-wrap {
    flex: 1;
    display: flex;
    align-items: center;
    background: #f5f7fa;
    border-radius: 6rpx;
    padding: 0 16rpx;
    height: 60rpx;
}
.form-input {
    flex: 1;
    height: 60rpx;
    font-size: 26rpx;
    color: #303133;
}
/* Picker æ ·å¼ */
.picker-full {
    flex: 1;
    width: 100%;
}
.picker-value {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: space-between;
    height: 60rpx;
    font-size: 26rpx;
    color: #303133;
}
.picker-value text {
    flex: 1;
}
/* ==================== åˆ—表头部样式 ==================== */
.list-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 16rpx 20rpx;
    background: #ffffff;
    margin-top: 12rpx;
    box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
}
.header-left {
    display: flex;
    align-items: center;
}
.header-title {
    font-size: 28rpx;
    color: #303133;
    font-weight: 600;
}
.count-badge {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    border-radius: 16rpx;
    padding: 2rpx 12rpx;
    margin-left: 12rpx;
}
.count-text {
    font-size: 20rpx;
    color: #ffffff;
    font-weight: 500;
}
/* ==================== å•†å“å¡ç‰‡æ ·å¼ ==================== */
.list-container {
    padding: 0 20rpx;
}
.mat-card {
    background: #ffffff;
    border-radius: 12rpx;
    margin-top: 12rpx;
    box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
    overflow: hidden;
}
.card-top {
    display: flex;
    align-items: center;
    padding: 14rpx 16rpx;
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.card-index {
    width: 36rpx;
    height: 36rpx;
    background: rgba(255, 255, 255, 0.25);
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 22rpx;
    color: #ffffff;
    font-weight: 600;
    margin-right: 12rpx;
}
.mat-code-wrap {
    flex: 1;
}
.mat-code {
    font-size: 26rpx;
    color: #ffffff;
    font-weight: 600;
}
.qty-badge {
    background: rgba(255, 255, 255, 0.3);
    padding: 4rpx 14rpx;
    border-radius: 16rpx;
}
.qty-text {
    font-size: 24rpx;
    color: #ffffff;
    font-weight: 600;
}
/* ==================== å¡ç‰‡å†…容样式 ==================== */
.card-content {
    padding: 12rpx 16rpx;
}
.info-row {
    display: flex;
    margin-bottom: 8rpx;
}
.info-row:last-child {
    margin-bottom: 0;
}
.info-col {
    flex: 1;
}
.info-col.half {
    width: 50%;
    flex: none;
}
.info-label {
    font-size: 20rpx;
    color: #909399;
    display: block;
}
.info-value {
    font-size: 24rpx;
    color: #303133;
    display: block;
    margin-top: 2rpx;
}
.info-value.highlight {
    color: #667eea;
    font-weight: 500;
}
.info-value.qty {
    font-size: 28rpx;
    color: #303133;
    font-weight: 600;
}
/* ==================== å¡ç‰‡æ“ä½œæŒ‰é’®æ ·å¼ ==================== */
.card-actions {
    display: flex;
    border-top: 1rpx solid #f0f0f0;
}
.action-btn {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 14rpx 0;
}
.edit-btn {
    border-right: 1rpx solid #f0f0f0;
}
.action-text {
    font-size: 24rpx;
    color: #667eea;
    margin-left: 6rpx;
}
.delete-text {
    color: #f56c6c;
}
/* ==================== ç©ºçŠ¶æ€æ ·å¼ ==================== */
.empty-state {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 80rpx 0;
}
.empty-text {
    font-size: 26rpx;
    color: #909399;
    margin-top: 16rpx;
}
.empty-hint {
    font-size: 22rpx;
    color: #c0c4cc;
    margin-top: 8rpx;
}
.bottom-placeholder {
    height: 20rpx;
}
/* ==================== åº•部操作栏样式 ==================== */
.bottom-bar {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    display: flex;
    padding: 16rpx 20rpx;
    background: #ffffff;
    box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06);
}
.btn-reset {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 160rpx;
    height: 72rpx;
    background: #f5f7fa;
    border-radius: 36rpx;
    margin-right: 16rpx;
}
.btn-reset .btn-text {
    font-size: 26rpx;
    color: #909399;
    margin-left: 6rpx;
}
.btn-submit {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    height: 72rpx;
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    border-radius: 36rpx;
}
.btn-submit .btn-text {
    font-size: 28rpx;
    color: #ffffff;
    font-weight: 500;
    margin-left: 6rpx;
}
.btn-disabled {
    background: #c0c4cc;
    opacity: 0.6;
}
/* ==================== å¼¹çª—样式 ==================== */
.popup-card {
    width: 600rpx;
    background: #ffffff;
    border-radius: 16rpx;
    overflow: hidden;
}
.popup-header {
    padding: 24rpx;
    text-align: center;
    border-bottom: 1rpx solid #f0f0f0;
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.popup-title {
    font-size: 30rpx;
    color: #ffffff;
    font-weight: 600;
}
.popup-body {
    padding: 24rpx;
}
.popup-row {
    display: flex;
    align-items: center;
    margin-bottom: 20rpx;
    height: 70rpx;
}
.popup-row:last-child {
    margin-bottom: 0;
}
.popup-label {
    width: 80rpx;
    font-size: 26rpx;
    color: #606266;
    flex-shrink: 0;
}
.popup-value {
    flex: 1;
    height: 70rpx;
    background: #f5f7fa;
    border-radius: 8rpx;
    padding: 0 16rpx;
    font-size: 26rpx;
    color: #303133;
    display: flex;
    align-items: center;
    box-sizing: border-box;
}
.popup-value.disabled {
    color: #909399;
    background: #f0f0f0;
}
.popup-value.input {
    padding: 0 16rpx;
}
.popup-value.number {
    justify-content: center;
    background: transparent;
    padding: 0;
}
.popup-footer {
    display: flex;
    border-top: 1rpx solid #f0f0f0;
}
.popup-btn {
    flex: 1;
    height: 90rpx;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 28rpx;
}
.popup-btn.cancel {
    color: #909399;
    border-right: 1rpx solid #f0f0f0;
}
.popup-btn.confirm {
    color: #667eea;
    font-weight: 600;
}