#
zhou zhou
21 小时以前 f9cfb2169361c046a00f4fa14ea342bd5710f8b4
#
1个文件已添加
5个文件已修改
1785 ■■■■■ 已修改文件
locale/zh-Hans.json 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages.json 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/outbound/container_rebinding/container_rebinding.vue 320 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/outbound/orderOut/orderDetlList.vue 627 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/outbound/orderOut/orderList.vue 707 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/outbound/orderOut/outLocView.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
locale/zh-Hans.json
@@ -7,62 +7,64 @@
    "locale.ja": "日语",
    "index.title": "Hello i18n",
    "index.home": "主页",
    "page.login":"登录",
    "page.index":"首页",
    "login":{
    "page.login": "登录",
    "page.index": "首页",
    "login": {
        "login": "登录",
        "loging": "登录中",
        "user": "账号",
        "pwd": "密码",
        "inputUser": "请输入账号",
        "inputPwd":"请输入密码",
        "remPwd":"记住密码"
        "inputPwd": "请输入密码",
        "remPwd": "记住密码"
    },
    "index":{
    "index": {
        "in": "入库",
        "out": "出库",
        "GR": "单据收货",
        "GR": "单据收货",
        "palletizing": "单据组托",
        "palletBuilding":"组托解绑",
        "inspectionRequest":"报检",
        "qualityInspection":"质检解锁",
        "defectiveMarking":"质检上锁",
        "manualPutaway":"人工上架",
        "stationBinding":"站点绑定",
        "inboundInitiation":"AGV入库",
        "stationUnbinding":"站点解绑",
        "bindAndInbound":"绑定&入库",
        "quickPicking":"快速拣货",
        "wavePick":"波次拣货",
        "outLogin":"退出登录",
        "language-change-confirm":"确定切换?",
        "hello":"您好,欢迎登录WMS系统!",
        "intro":"让制造与物流更高效",
        "checkOrder":"盘点",
        "emptyOutBound":"空托出库",
        "emptyInBound":"空托入库",
        "orderPick":"订单出库",
        "orderPickGroup":"出库订单",
        "orderTransfer":"调拨订单",
        "orderIn":"入库订单",
        "orderInItem":"入库订单详情",
        "matTransfer":"移库",
        "buffStore":"灌桶入库",
        "stationInfo":"站点维护",
        "locInfo":"库位维护",
        "taskInfo":"工作任务",
        "productionMatCall":"生产叫料",
        "matDirectDelivery":"生产直送",
        "productDirectDelivery":"成品直出",
        "matPreparation":"生产备料",
        "other":"综合"
        "palletBuilding": "组托解绑",
        "inspectionRequest": "报检",
        "qualityInspection": "质检解锁",
        "defectiveMarking": "质检上锁",
        "manualPutaway": "人工上架",
        "stationBinding": "站点绑定",
        "inboundInitiation": "AGV入库",
        "stationUnbinding": "站点解绑",
        "bindAndInbound": "绑定&入库",
        "quickPicking": "快速拣货",
        "wavePick": "波次拣货",
        "outLogin": "退出登录",
        "language-change-confirm": "确定切换?",
        "hello": "您好,欢迎登录WMS系统!",
        "intro": "让制造与物流更高效",
        "checkOrder": "盘点",
        "emptyOutBound": "空托出库",
        "emptyInBound": "空托入库",
        "orderPick": "订单出库",
        "orderPickGroup": "出库订单",
        "orderTransfer": "调拨订单",
        "orderIn": "入库订单",
        "orderInItem": "入库订单详情",
        "matTransfer": "移库",
        "buffStore": "灌桶入库",
        "stationInfo": "站点维护",
        "locInfo": "库位维护",
        "taskInfo": "工作任务",
        "productionMatCall": "生产叫料",
        "matDirectDelivery": "生产直送",
        "productDirectDelivery": "成品直出",
        "matPreparation": "生产备料",
        "preparation": "备货出库",
        "containerRebinding": "备货容器换绑",
        "other": "综合"
    },
    "other":{
        "asnNo":"ASN单号"
    "other": {
        "asnNo": "ASN单号"
    }
}
}
pages.json
@@ -51,6 +51,12 @@
            }
        },
        {
            "path": "pages/outbound/orderOut/outLocView",
            "style": {
                "navigationBarTitleText": "出库库位视图"
            }
        },
        {
            "path": "pages/outbound/orderOutView/order_out_type",
            "style": {
                "navigationBarTitleText": "单据类型"
@@ -69,12 +75,7 @@
                "navigationBarTitleText": "单据明细列表"
            }
        },
        {
            "path": "pages/outbound/orderOut/outLocView",
            "style": {
                "navigationBarTitleText": "出库库位视图"
            }
        },
        {
            "path": "pages/emptyTray/outBound",
            "style": {
@@ -392,6 +393,12 @@
            "style": {
                "navigationBarTitleText": "组托解绑"
            }
        },
        {
            "path": "pages/outbound/container_rebinding/container_rebinding",
            "style": {
                "navigationBarTitleText": "备货容器换绑"
            }
        }
    ],
    "globalStyle": {
pages/outbound/container_rebinding/container_rebinding.vue
New file
@@ -0,0 +1,320 @@
<template>
    <view class="has-foot">
        <form>
            <view class="cu-form-group margin-top">
                <view class="title">容器号</view>
                <input
                    placeholder="请扫容器条码"
                    v-model="container"
                />
                <!-- <text class='cuIcon-search text-blue' @click="search"></text> -->
            </view>
            <view class="cu-form-group">
                <view class="title">新容器号</view>
                <input
                    placeholder="请扫描新容器号"
                    v-model="newContainer"
                />
            </view>
        </form>
        <view class="cu-list det menu sm-border padding">
            <block
                v-for="(item, index) in list"
                :key="index"
            >
                <view class="cu-bar bg-white solid-bottom margin-top-sm">
                    <view class="action">
                        <view class="index">
                            {{ index + 1 }}
                        </view>
                        <view class="text-blue">
                            {{ `${item.maktx}` }}
                        </view>
                    </view>
                    <!--     <view class="action" >
                        <text @click="remove(index)" class="cuIcon-close text-red" style="font-size: 24px;"></text>
                    </view> -->
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">ASN:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey">{{ item.asnCode }}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">批次:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey">{{ item.batch }}</text>
                    </view>
                </view>
                <view class="cu-item">
                    <view class="content">
                        <text class="text-black">收货数量:</text>
                    </view>
                    <view class="action">
                        <text class="text-grey">{{ item.anfme }}</text>
                    </view>
                </view>
            </block>
        </view>
        <view class="cu-bar btn-group foot">
            <button
                v-if="hasButtonPermission('reset')"
                class="cu-btn text-blue line-blue shadow"
                @click="clear"
            >
                清空
            </button>
            <button
                v-if="hasButtonPermission('submit')"
                class="cu-btn bg-blue shadow-blur"
                @click="confirm"
            >
                换绑
            </button>
        </view>
        <uni-popup
            ref="popup"
            class="cu-popup"
        >
            <view class="popup-content">
                <view class="head">
                    <text>推荐</text>
                    <text
                        class="cuIcon-close text-red close"
                        @click="close"
                    ></text>
                </view>
                <div class="body">
                    <view class="cu-list grid col-3 no-border">
                        <view
                            class="item"
                            v-for="el in range"
                        >
                            <view
                                class="cu-btn round sm"
                                :class="[
                                    el === curCode ? 'bg-blue' : 'line-blue'
                                ]"
                                @click="itemChange(el)"
                            >
                                {{ el }}
                            </view>
                        </view>
                    </view>
                </div>
                <view class="cu-bar btn-group">
                    <button
                        class="cu-btn bg-blue shadow-blur"
                        @click="popupSubmit"
                    >
                        提交
                    </button>
                </view>
            </view>
        </uni-popup>
    </view>
</template>
<script>
import { request } from '@/common/request.js'
import { mapState, mapMutations, mapActions, mapGetters } from 'vuex'
export default {
    data() {
        return {
            barcode: '',
            areaName: '',
            locCode: '',
            container: '',
            newContainer: '',
            list: [],
            range: [],
            curCode: '',
            agvStationInput: '', // AGV站点输入值
            agvStationName: '',
            buttonPermissions: [] // 按钮权限列表
        }
    },
    computed: {
        ...mapState('user', ['dynamicFields'])
    },
    mounted() {
        // 获取按钮权限
        this.buttonPermissions = uni.getStorageSync('buttonPermissions') || []
        console.log('当前页面按钮权限:', this.buttonPermissions)
    },
    methods: {
        async checkAgvStation() {
            const that = this
            if (this.container === '' || this.container === null) {
                uni.showToast({
                    title: '容器码为空',
                    icon: 'none',
                    position: 'top'
                })
                return
            }
            const { code, data, msg } = await request('/check/agvStation', {
                transferStationNo: this.agvStationInput
            })
            if (code === 200) {
                this.agvStationName = data.stationName
            } else {
                uni.showToast({
                    title: msg,
                    icon: 'none',
                    position: 'top'
                })
                setTimeout(function () {
                    that.agvStationName = ''
                    that.agvStationInput = ''
                }, 200)
            }
        },
        async search() {
            const { code, data, msg } = await request('/stock/operate/list', {
                barcode: this.container,
                sta: this.barcode
            })
            if (code === 200) {
                // const find = this.list.find(el => el.id === data.id);
                // !find &&
                this.list = data
            } else {
                uni.showToast({
                    title: msg,
                    icon: 'none'
                })
            }
        },
        // 检查按钮权限
        hasButtonPermission(route) {
            return this.buttonPermissions.includes(route)
        },
        remove(index) {
            this.list.splice(index, 1)
        },
        clear() {
            this.list = []
            this.container = ''
            this.newContainer = ''
        },
        open() {
            this.$refs.popup.open()
        },
        close() {
            this.$refs.popup.close()
        },
        popupSubmit() {
            this.$refs.popup.close()
        },
        itemChange(el) {
            this.curCode = el
        },
        async confirm() {
            if (this.container === '' || this.container === null) {
                uni.showToast({
                    title: '容器码不能为空',
                    icon: 'none'
                })
                return
            }
            if (this.newContainer === '' || this.newContainer === null) {
                uni.showToast({
                    title: '新容器码不能为空',
                    icon: 'none'
                })
                return
            }
            const { code, data, msg } = await request(
                '/orderOut/containerRebinding',
                {
                    containerNo: this.container,
                    newContainerNo: this.newContainer
                }
            )
            if (code === 200) {
                uni.showToast({
                    title: '换绑完成'
                })
                this.clear()
            } else {
                uni.showToast({
                    title: msg,
                    icon: 'none'
                })
            }
        }
    }
}
</script>
<style>
.index {
    border: 1px solid #e54d42;
    color: #e54d42;
    border-radius: 50%;
    display: block;
    width: 50rpx;
    height: 50rpx;
    line-height: 48rpx;
    text-align: center;
    margin-right: 20rpx;
    font-size: 30rpx;
}
.text-blue {
    color: #0081ff !important;
}
.item {
    position: relative;
    display: flex;
    min-height: 80upx;
    align-items: center;
}
.uni-file-picker {
    width: 100%;
    margin-bottom: 10px;
}
.uni-select__selector {
    z-index: 999;
}
.tj {
    height: auto;
    padding: 6px 8px;
    display: inline-block;
    border-radius: 6px;
}
.item {
    display: flex;
    justify-content: center;
}
.item .cu-btn {
    font-size: 26upx;
}
</style>
pages/outbound/orderOut/orderDetlList.vue
@@ -1,91 +1,130 @@
<template>
    <view class="page-container">
        <!-- 订单信息头部 -->
        <view class="order-header" v-if="order">
        <view
            class="order-header"
            v-if="order"
        >
            <view class="header-content">
                <view class="header-row">
                    <text class="header-label">单据号</text>
                    <text class="header-value">{{order.code}}</text>
                    <text class="header-value">{{ order.code }}</text>
                </view>
                <view class="header-row">
                    <text class="header-label">单据类型</text>
                    <text class="header-value">{{order.wkType$ || '-'}}</text>
                    <text class="header-value">{{ order.wkType$ || '-' }}</text>
                </view>
            </view>
        </view>
        <!-- 搜索框 -->
        <!-- <view class="search-bar">
            <uni-search-bar v-model="condition" placeholder=" 扫码 / 输入物料" bgColor="#F5F5F5" @confirm="search" @cancel="onCancelSearch" />
        </view> -->
        <!-- 明细列表 -->
        <view class="padding-lr margin-top-sm">
            <block v-for="(item, index) in filterList" :key="index">
                <view class="cu-list menu sm-border margin-bottom-sm" @click="chose(item)">
            <block
                v-for="(item, index) in filterList"
                :key="index"
            >
                <view
                    class="cu-list menu sm-border margin-bottom-sm"
                    @click="chose(item)"
                >
                    <view class="cu-bar bg-white solid-bottom">
                        <view class="action">
                            <view class="index">{{index+1}}</view>
                            <view class="index">{{ index + 1 }}</view>
                            <view class="text-blue">
                                编码: {{item.matnrCode}}
                                编码: {{ item.matnrCode }}
                            </view>
                        </view>
                        <view class="action">
                            <text :class="getRemaining(item) > 0 ? 'text-blue' : 'text-green'">
                                {{getRemaining(item) > 0 ? '剩余 ' + getRemaining(item) : '已完成'}}
                            <text
                                :class="
                                    getRemaining(item) > 0
                                        ? 'text-blue'
                                        : 'text-green'
                                "
                            >
                                {{
                                    getRemaining(item) > 0
                                        ? '剩余 ' + getRemaining(item)
                                        : '已完成'
                                }}
                            </text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">物料名称:</text>
                            <text class="text-grey text-sm margin-left-xs">{{item.maktx || '-'}}</text>
                            <text class="text-grey text-sm margin-left-xs">
                                {{ item.maktx || '-' }}
                            </text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">规格:</text>
                            <text class="text-grey margin-left-xs">{{item.specs || '-'}}</text>
                            <text class="text-grey margin-left-xs">
                                {{ item.specs || '-' }}
                            </text>
                        </view>
                        <view class="action">
                            <text class="text-black">批次:</text>
                            <text class="text-grey margin-left-xs">{{item.splrBatch || '-'}}</text>
                            <text class="text-grey margin-left-xs">
                                {{ item.splrBatch || '-' }}
                            </text>
                        </view>
                    </view>
                    <view class="cu-item">
                        <view class="content">
                            <text class="text-black">订单数量:</text>
                            <text class="text-blue margin-left-xs">{{item.anfme}}</text>
                            <text class="text-blue margin-left-xs">
                                {{ item.anfme }}
                            </text>
                        </view>
                        <view class="action">
                            <text class="text-black">已完成:</text>
                            <text class="text-green margin-left-xs">{{item.qty}}</text>
                            <text class="text-green margin-left-xs">
                                {{ item.qty }}
                            </text>
                        </view>
                    </view>
                </view>
            </block>
        </view>
        <!-- 空状态 -->
        <view class="empty-state" v-if="filterList.length === 0 && !loading">
            <uni-icons type="info" size="60" color="#CCCCCC"></uni-icons>
        <view
            class="empty-state"
            v-if="filterList.length === 0 && !loading"
        >
            <uni-icons
                type="info"
                size="60"
                color="#CCCCCC"
            ></uni-icons>
            <text class="empty-text">暂无明细数据</text>
        </view>
        <!-- 统计信息 -->
        <view class="stats-bar" v-if="menuList.length > 0">
        <view
            class="stats-bar"
            v-if="menuList.length > 0"
        >
            <view class="stats-item">
                <text class="stats-value">{{menuList.length}}</text>
                <text class="stats-value">{{ menuList.length }}</text>
                <text class="stats-label">总明细</text>
            </view>
            <view class="stats-divider"></view>
            <view class="stats-item">
                <text class="stats-value">{{pendingCount}}</text>
                <text class="stats-value">{{ pendingCount }}</text>
                <text class="stats-label">待处理</text>
            </view>
            <view class="stats-divider"></view>
            <view class="stats-item">
                <text class="stats-value">{{completedCount}}</text>
                <text class="stats-value">{{ completedCount }}</text>
                <text class="stats-label">已完成</text>
            </view>
        </view>
@@ -93,275 +132,309 @@
</template>
<script>
    import { request } from '@/common/request.js'
    export default {
        data() {
            return {
                data: '',
                condition: '',
                menuList: [],
                order: '',
                loading: false,
import { request } from '@/common/request.js'
export default {
    data() {
        return {
            data: '',
            condition: '',
            menuList: [],
            order: '',
            loading: false
        }
    },
    computed: {
        // 过滤后的列表(优先显示有剩余数量的)
        filterList() {
            if (!this.condition.trim()) {
                // 排序:有剩余数量的排前面
                return [...this.menuList].sort((a, b) => {
                    if (a.ableQty > 0 && b.ableQty <= 0) return -1
                    if (a.ableQty <= 0 && b.ableQty > 0) return 1
                    return 0
                })
            }
            const keyword = this.condition.toLowerCase()
            return this.menuList.filter((item) => {
                return (
                    (item.matnr &&
                        item.matnr.toLowerCase().includes(keyword)) ||
                    (item.maktx &&
                        item.maktx.toLowerCase().includes(keyword)) ||
                    (item.batch && item.batch.toLowerCase().includes(keyword))
                )
            })
        },
        computed: {
            // 过滤后的列表(优先显示有剩余数量的)
            filterList() {
                if (!this.condition.trim()) {
                    // 排序:有剩余数量的排前面
                    return [...this.menuList].sort((a, b) => {
                        if (a.ableQty > 0 && b.ableQty <= 0) return -1;
                        if (a.ableQty <= 0 && b.ableQty > 0) return 1;
                        return 0;
                    });
                }
                const keyword = this.condition.toLowerCase();
                return this.menuList.filter(item => {
                    return (item.matnr && item.matnr.toLowerCase().includes(keyword)) ||
                           (item.maktx && item.maktx.toLowerCase().includes(keyword)) ||
                           (item.batch && item.batch.toLowerCase().includes(keyword));
                });
            },
            // 待处理数量
            pendingCount() {
                return this.menuList.filter(item => item.enableQty > 0).length;
            },
            // 已完成数量
            completedCount() {
                return this.menuList.filter(item => item.enableQty <= 0).length;
        // 待处理数量
        pendingCount() {
            return this.menuList.filter((item) => item.enableQty > 0).length
        },
        // 已完成数量
        completedCount() {
            return this.menuList.filter((item) => item.enableQty <= 0).length
        }
    },
    onLoad() {
        let that = this
        const eventChannel = this.getOpenerEventChannel()
        if (eventChannel) {
            eventChannel.on('data', function (data) {
                that.order = data.data
                that.getOrderNoList(that.order)
            })
        }
    },
    onShow() {
        if (this.order) {
            this.getOrderNoList(this.order)
        }
    },
    methods: {
        // 获取剩余数量
        getRemaining(item) {
            if (item.ableQty !== undefined && item.ableQty !== null) {
                return Number(item.ableQty)
            }
            // 降级逻辑:订单数量 - 已完成数量
            return Number(item.anfme || 0) - Number(item.qty || 0)
        },
        onLoad() {
            let that = this;
            const eventChannel = this.getOpenerEventChannel();
            if (eventChannel) {
                eventChannel.on('data', function(data) {
                    that.order = data.data;
                    that.getOrderNoList(that.order);
                });
        // 搜索
        async search() {
            if (!this.condition.trim()) {
                this.getOrderNoList(this.order)
                return
            }
        },
        onShow() {
            if (this.order) {
                this.getOrderNoList(this.order);
            }
        },
        methods: {
            // 获取剩余数量
            getRemaining(item) {
                if (item.ableQty !== undefined && item.ableQty !== null) {
                    return Number(item.ableQty);
                }
                // 降级逻辑:订单数量 - 已完成数量
                return Number(item.anfme || 0) - Number(item.qty || 0);
            },
            // 搜索
            async search() {
                if (!this.condition.trim()) {
                    this.getOrderNoList(this.order);
                    return;
                }
                this.loading = true;
                try {
                    const res = await request('/orderDetl/search/pda/auth', {
            this.loading = true
            try {
                const res = await request(
                    '/orderDetl/search/pda/auth',
                    {
                        condition: this.condition,
                        order: this.order.code
                    }, 'POST', true);
                    if (res.code === 200) {
                        let list = res.data || [];
                        list.forEach(item => {
                            if (item.enableQty === undefined || item.enableQty === null) {
                                item.enableQty = Number(item.anfme || 0) - Number(item.qty || 0);
                            }
                        });
                        this.menuList = list;
                    } else if (res.code === 403) {
                        uni.showToast({ title: res.msg, icon: "none", position: 'top' });
                        setTimeout(() => {
                            uni.reLaunch({ url: '../login/login' });
                        }, 1000);
                    } else {
                        uni.showToast({ title: res.msg, icon: "none", position: 'top' });
                    }
                } catch (err) {
                    // request.js 已经处理了错误提示
                } finally {
                    this.loading = false;
                }
            },
            // 取消搜索
            onCancelSearch() {
                this.condition = '';
                this.getOrderNoList(this.order);
            },
            // 获取订单明细列表
            async getOrderNoList(order) {
                if (!order || !order.code) return;
                this.loading = true;
                try {
                    const res = await request('/orderOut/detlList', {
                        orderNo: order.code
                    }, 'GET', true);
                    if (res.code === 200) {
                        let list = res.data || [];
                        list.forEach(item => {
                            if (item.enableQty === undefined || item.enableQty === null) {
                                item.enableQty = Number(item.anfme || 0) - Number(item.qty || 0);
                            }
                        });
                        this.menuList = list;
                    } else {
                        this.menuList = res.data || [];
                    }
                } catch (err) {
                    // request.js 已经处理了错误提示
                } finally {
                    this.loading = false;
                }
            },
            // 选择明细进行出库
            chose(item) {
                if (item.enableQty <= 0) {
                    uni.showToast({ title: '该明细已完成', icon: "none", position: 'top' });
                    return;
                }
                let that = this;
                uni.navigateTo({
                    url: "./outLocView",
                    success: function(res) {
                        res.eventChannel.emit('orderItem', {
                            item: item
                        });
                    },
                    events: {
                        acceptDataFromOpenedPage: function(data) {
                            // 返回后刷新数据
                        },
                    },
                });
                    'POST',
                    true
                )
                if (res.code === 200) {
                    let list = res.data || []
                    list.forEach((item) => {
                        if (
                            item.ableQty === undefined ||
                            item.ableQty === null
                        ) {
                            item.ableQty =
                                Number(item.anfme || 0) - Number(item.qty || 0)
                        }
                    })
                    this.menuList = list
                } else if (res.code === 403) {
                    uni.showToast({
                        title: res.msg,
                        icon: 'none',
                        position: 'top'
                    })
                    setTimeout(() => {
                        uni.reLaunch({ url: '../login/login' })
                    }, 1000)
                } else {
                    uni.showToast({
                        title: res.msg,
                        icon: 'none',
                        position: 'top'
                    })
                }
            } catch (err) {
                // request.js 已经处理了错误提示
            } finally {
                this.loading = false
            }
        },
        // 取消搜索
        onCancelSearch() {
            this.condition = ''
            this.getOrderNoList(this.order)
        },
        // 获取订单明细列表
        async getOrderNoList(order) {
            if (!order || !order.code) return
            this.loading = true
            try {
                const res = await request(
                    '/orderOut/detlList',
                    {
                        orderNo: order.code
                    },
                    'GET',
                    true
                )
                if (res.code === 200) {
                    let list = res.data || []
                    list.forEach((item) => {
                        if (
                            item.enableQty === undefined ||
                            item.enableQty === null
                        ) {
                            item.enableQty =
                                Number(item.anfme || 0) - Number(item.qty || 0)
                        }
                    })
                    this.menuList = list
                } else {
                    this.menuList = res.data || []
                }
            } catch (err) {
                // request.js 已经处理了错误提示
            } finally {
                this.loading = false
            }
        },
        // 选择明细进行出库
        chose(item) {
            if (item.ableQty <= 0) {
                uni.showToast({
                    title: '该明细已完成',
                    icon: 'none',
                    position: 'top'
                })
                return
            }
            let that = this
            uni.navigateTo({
                url: './outLocView',
                success: function (res) {
                    res.eventChannel.emit('orderItem', {
                        item: item
                    })
                },
                events: {
                    acceptDataFromOpenedPage: function (data) {
                        // 返回后刷新数据
                    }
                }
            })
        }
    }
}
</script>
<style>
    /* 引入公共样式 */
    @import url('@/static/css/common.scss');
/* 引入公共样式 */
@import url('@/static/css/common.scss');
    .page-container {
        padding-bottom: 120rpx;
    }
    /* 订单头部 */
    .order-header {
        background: linear-gradient(135deg, #0081ff 0%, #1890ff 100%);
        padding: 16rpx 20rpx;
    }
    .header-content {
        background: rgba(255, 255, 255, 0.15);
        border-radius: 10rpx;
        padding: 12rpx 16rpx;
    }
    .header-row {
        display: flex;
        justify-content: space-between;
        align-items: center;
        padding: 4rpx 0;
    }
    .header-label {
        font-size: 24rpx;
        color: rgba(255, 255, 255, 0.7);
    }
    .header-value {
        font-size: 26rpx;
        color: #ffffff;
        font-weight: 500;
    }
    /* 搜索栏 */
    .search-bar {
        padding: 0rpx 8rpx;
        background: #ffffff;
        box-shadow: 0 2rpx 8rpx rgba(0, 129, 255, 0.08);
    }
.page-container {
    padding-bottom: 120rpx;
}
    /* 列表样式迁移 from rece/other.vue */
    .index {
        border: 1px solid #e54d42;
        color: #e54d42;
        border-radius: 50%;
        display: block;
        width: 50rpx;
        height: 50rpx;
        line-height: 48rpx;
        text-align: center;
        margin-right: 20rpx;
        font-size: 30rpx;
    }
/* 订单头部 */
.order-header {
    background: linear-gradient(135deg, #0081ff 0%, #1890ff 100%);
    padding: 16rpx 20rpx;
}
    .act {
        border: 1px solid #e54d42;
    }
.header-content {
    background: rgba(255, 255, 255, 0.15);
    border-radius: 10rpx;
    padding: 12rpx 16rpx;
}
    .text-blue {
        color: #0081ff !important;
    }
    .text-green {
        color: #39b54a !important;
    }
    /* 空状态 */
    .empty-state {
        padding: 60rpx 0;
    }
    .empty-text {
        margin-top: 20rpx;
    }
    /* 统计栏 */
    .stats-bar {
        position: fixed;
        bottom: 0;
        left: 0;
        right: 0;
        display: flex;
        align-items: center;
        justify-content: space-around;
        background: #ffffff;
        padding: 16rpx 0;
        box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06);
    }
    .stats-item {
        display: flex;
        flex-direction: column;
        align-items: center;
        flex: 1;
    }
    .stats-value {
        font-size: 32rpx;
        color: #303133;
        font-weight: 600;
    }
    .stats-label {
        font-size: 20rpx;
        color: #909399;
        margin-top: 4rpx;
    }
    .stats-divider {
        width: 1rpx;
        height: 50rpx;
        background: #e8e8e8;
    }
.header-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 4rpx 0;
}
.header-label {
    font-size: 24rpx;
    color: rgba(255, 255, 255, 0.7);
}
.header-value {
    font-size: 26rpx;
    color: #ffffff;
    font-weight: 500;
}
/* 搜索栏 */
.search-bar {
    padding: 0rpx 8rpx;
    background: #ffffff;
    box-shadow: 0 2rpx 8rpx rgba(0, 129, 255, 0.08);
}
/* 列表样式迁移 from rece/other.vue */
.index {
    border: 1px solid #e54d42;
    color: #e54d42;
    border-radius: 50%;
    display: block;
    width: 50rpx;
    height: 50rpx;
    line-height: 48rpx;
    text-align: center;
    margin-right: 20rpx;
    font-size: 30rpx;
}
.act {
    border: 1px solid #e54d42;
}
.text-blue {
    color: #0081ff !important;
}
.text-green {
    color: #39b54a !important;
}
/* 空状态 */
.empty-state {
    padding: 60rpx 0;
}
.empty-text {
    margin-top: 20rpx;
}
/* 统计栏 */
.stats-bar {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    display: flex;
    align-items: center;
    justify-content: space-around;
    background: #ffffff;
    padding: 16rpx 0;
    box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06);
}
.stats-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    flex: 1;
}
.stats-value {
    font-size: 32rpx;
    color: #303133;
    font-weight: 600;
}
.stats-label {
    font-size: 20rpx;
    color: #909399;
    margin-top: 4rpx;
}
.stats-divider {
    width: 1rpx;
    height: 50rpx;
    background: #e8e8e8;
}
</style>
pages/outbound/orderOut/orderList.vue
@@ -2,29 +2,47 @@
    <view class="page-container">
        <!-- 搜索框 -->
        <view class="search-bar">
            <uni-search-bar v-model="condition" placeholder=" 扫码 / 输入" bgColor="#F5F5F5" @confirm="search" @cancel="onCancelSearch" />
            <uni-search-bar
                v-model="condition"
                placeholder=" 扫码 / 输入"
                bgColor="#F5F5F5"
                @confirm="search"
                @cancel="onCancelSearch"
            />
        </view>
        <!-- 订单列表 -->
        <view class="order-list">
            <view class="order-card" v-for="(item,i) in matList" :key="i" @click="toPrint(item)">
            <view
                class="order-card"
                v-for="(item, i) in matList"
                :key="i"
                @click="toPrint(item)"
            >
                <!-- 卡片头部 -->
                <view class="card-header">
                    <view class="order-badge" :class="getSettleClass(item.exceStatus)">
                        <text class="badge-text">{{item.exceStatus$ || '未知'}}</text>
                    <view
                        class="order-badge"
                        :class="getSettleClass(item.exceStatus)"
                    >
                        <text class="badge-text">
                            {{ item.exceStatus$ || '未知' }}
                        </text>
                    </view>
                    <view class="order-no">
                        <text class="order-no-label">单据号</text>
                        <text class="order-no-value">{{item.code}}</text>
                        <text class="order-no-value">{{ item.code }}</text>
                    </view>
                </view>
                <!-- 卡片内容 -->
                <view class="card-body">
                    <view class="info-row">
                        <view class="info-item">
                            <text class="info-label">单据类型</text>
                            <text class="info-value">{{item.wkType$ || '-'}}</text>
                            <text class="info-value">
                                {{ item.wkType$ || '-' }}
                            </text>
                        </view>
                        <!-- <view class="info-item">
                            <text class="info-label">应出数量</text>
@@ -34,355 +52,406 @@
                    <view class="info-row">
                        <view class="info-item">
                            <text class="info-label">应出数量</text>
                            <text class="info-value">{{item.anfme || '-'}}</text>
                            <text class="info-value">
                                {{ item.anfme || '-' }}
                            </text>
                        </view>
                        <view class="info-item">
                            <text class="info-label">完成数量</text>
                            <text class="info-value">{{item.qty || '-'}}</text>
                            <text class="info-value">
                                {{ item.qty || '-' }}
                            </text>
                        </view>
                    </view>
                </view>
                <!-- 卡片底部 -->
                <view class="card-footer">
                    <text class="view-detail">查看详情</text>
                    <uni-icons type="right" size="14" color="#999"></uni-icons>
                    <uni-icons
                        type="right"
                        size="14"
                        color="#999"
                    ></uni-icons>
                </view>
            </view>
        </view>
        <!-- 空状态 -->
        <view class="empty-state" v-if="matList.length === 0 && !loading">
            <uni-icons type="search" size="60" color="#CCCCCC"></uni-icons>
        <view
            class="empty-state"
            v-if="matList.length === 0 && !loading"
        >
            <uni-icons
                type="search"
                size="60"
                color="#CCCCCC"
            ></uni-icons>
            <text class="empty-text">暂无订单数据</text>
            <text class="empty-hint">下拉刷新试试</text>
        </view>
        <!-- 加载更多 -->
        <uni-load-more v-show="matList.length !== 0" :status="status" :icon-size="16" :content-text="contentText" />
        <uni-load-more
            v-show="matList.length !== 0"
            :status="status"
            :icon-size="16"
            :content-text="contentText"
        />
    </view>
</template>
<script>
    import { request } from '@/common/request.js'
    export default {
        data() {
            return {
                tagList: [],
                matList: [],
                condition: '',
                loading: false,
                curr: 1,
                limit:5,
                status: 'more',
                contentText: {
                    contentdown: '上拉加载更多',
                    contentrefresh: '加载中',
                    contentnomore: '没有更多'
                },
                // 当前tagId
                tagIdNow: 1,
                orderTypeId:''
            }
        },
        // 下拉刷新
        onPullDownRefresh() {
            this.refreshData();
        },
        // 上拉加载更多
        onReachBottom() {
            if (this.status !== 'noMore') {
                this.status = 'loading';
                this.loadMoreData();
            }
        },
        onLoad() {
            let that = this
            const eventChannel = this.getOpenerEventChannel();
            if (eventChannel) {
                eventChannel.on('orderTypeId', function(data) {
                    that.orderTypeId = data.orderTypeId
                    console.log(data)
                })
            }
        },
        onShow() {
            // 每次进入页面重新加载
            this.refreshData();
        },
        methods: {
            // 刷新数据
            refreshData() {
                this.curr = 1;
                this.matList = [];
                this.status = 'more';
                this.loading = true;
                this.fetchOrderList(true);
import { request } from '@/common/request.js'
export default {
    data() {
        return {
            tagList: [],
            matList: [],
            condition: '',
            loading: false,
            curr: 1,
            limit: 5,
            status: 'more',
            contentText: {
                contentdown: '上拉加载更多',
                contentrefresh: '加载中',
                contentnomore: '没有更多'
            },
            // 加载更多数据
            loadMoreData() {
                this.fetchOrderList(false);
            },
            // 获取订单列表
            async fetchOrderList(isRefresh) {
                try {
                    const res = await request('/orderOut/list', {
            // 当前tagId
            tagIdNow: 1,
            orderTypeId: ''
        }
    },
    // 下拉刷新
    onPullDownRefresh() {
        if (this.loading) {
            uni.stopPullDownRefresh()
            return
        }
        this.refreshData()
    },
    // 上拉加载更多
    onReachBottom() {
        if (this.status !== 'noMore' && !this.loading) {
            this.status = 'loading'
            this.loadMoreData()
        }
    },
    onLoad() {
        let that = this
        const eventChannel = this.getOpenerEventChannel()
        if (eventChannel) {
            eventChannel.on('orderTypeId', function (data) {
                that.orderTypeId = data.orderTypeId
                console.log(data)
            })
        }
    },
    onShow() {
        // 每次进入页面重新加载
        this.refreshData()
    },
    methods: {
        refreshData() {
            if (this.loading) return
            this.curr = 1
            this.matList = []
            this.status = 'more'
            this.loading = true
            this.fetchOrderList(true)
        },
        // 加载更多数据
        loadMoreData() {
            if (this.loading) return
            this.loading = true
            this.fetchOrderList(false)
        },
        // 获取订单列表
        async fetchOrderList(isRefresh) {
            try {
                const res = await request(
                    '/orderOut/list',
                    {
                        curr: this.curr,
                        limit: this.limit,
                        orderNo: this.condition,
                        orderType: this.orderTypeId
                    }, 'GET', true);
                    if (res.code === 200) {
                        let records = res.data.records || [];
                        if (records.length > 0) {
                            if (isRefresh) {
                                this.matList = records;
                            } else {
                                this.matList = this.matList.concat(records);
                            }
                            this.curr = this.curr + 1;
                            this.status = 'more';
                    },
                    'GET',
                    true
                )
                if (res.code === 200) {
                    let records = res.data.records || []
                    if (records.length > 0) {
                        if (isRefresh) {
                            this.matList = records
                        } else {
                            this.status = 'noMore';
                            this.matList = this.matList.concat(records)
                        }
                    } else if (res.code === 403) {
                        uni.showToast({ title: res.msg, icon: "none", position: 'top' });
                        setTimeout(() => {
                            uni.reLaunch({ url: '../login/login' });
                        }, 1000);
                        this.curr = this.curr + 1
                        this.status = 'more'
                    } else {
                        uni.showToast({ title: res.msg, icon: "none", position: 'top' });
                        this.status = 'noMore'
                    }
                } catch (err) {
                    // request.js 已经处理了错误提示
                } finally {
                    this.loading = false;
                    uni.stopPullDownRefresh();
                } else if (res.code === 403) {
                    uni.showToast({
                        title: res.msg,
                        icon: 'none',
                        position: 'top'
                    })
                    setTimeout(() => {
                        uni.reLaunch({ url: '../login/login' })
                    }, 1000)
                } else {
                    uni.showToast({
                        title: res.msg,
                        icon: 'none',
                        position: 'top'
                    })
                }
            },
            // 搜索
            async search() {
                if (!this.condition.trim()) {
                    this.refreshData();
                    return;
                }
                this.loading = true;
                try {
                    const res = await request('/orderOut/list', {
            } catch (err) {
                // request.js 已经处理了错误提示
            } finally {
                this.loading = false
                uni.stopPullDownRefresh()
            }
        },
        // 搜索
        async search() {
            if (!this.condition.trim()) {
                this.refreshData()
                return
            }
            this.loading = true
            try {
                const res = await request(
                    '/orderOut/list',
                    {
                        curr: this.curr,
                        limit: this.limit,
                        orderNo: this.condition
                    }, 'GET', true);
                    if (res.code === 200) {
                        this.matList = res.data || [];
                        this.status = 'noMore';
                    } else if (res.code === 403) {
                        uni.showToast({ title: res.msg, icon: "none", position: 'top' });
                        setTimeout(() => {
                            uni.reLaunch({ url: '../login/login' });
                        }, 1000);
                    } else {
                        uni.showToast({ title: res.msg, icon: "none", position: 'top' });
                    }
                } catch (err) {
                    // request.js 已经处理了错误提示
                } finally {
                    this.loading = false;
                    },
                    'GET',
                    true
                )
                if (res.code === 200) {
                    this.matList = res.data || []
                    this.status = 'noMore'
                } else if (res.code === 403) {
                    uni.showToast({
                        title: res.msg,
                        icon: 'none',
                        position: 'top'
                    })
                    setTimeout(() => {
                        uni.reLaunch({ url: '../login/login' })
                    }, 1000)
                } else {
                    uni.showToast({
                        title: res.msg,
                        icon: 'none',
                        position: 'top'
                    })
                }
            },
            // 取消搜索
            onCancelSearch() {
                this.condition = '';
                this.refreshData();
            },
            // 根据状态返回样式类名
            getSettleClass(settle) {
                // settle: 1-待处理, 2-处理中, 3-已完成, 4-已取消 (根据实际情况调整)
                const classMap = {
                    1: 'badge-pending',
                    2: 'badge-processing',
                    3: 'badge-completed',
                    4: 'badge-cancelled'
                };
                return classMap[settle] || 'badge-default';
            },
            // 跳转到订单详情
            toPrint(item) {
                let that = this;
                uni.navigateTo({
                    url: "./orderDetlList",
                    success: function(res) {
                        res.eventChannel.emit('data', {
                            data: item
                        });
                    },
                    events: {
                        acceptDataFromOpenedPage: function(data) {
                            that.matnr = data.data;
                            that.findMat(that.matnr);
                        },
                    },
                });
            } catch (err) {
                // request.js 已经处理了错误提示
            } finally {
                this.loading = false
            }
        },
        // 取消搜索
        onCancelSearch() {
            this.condition = ''
            this.refreshData()
        },
        // 根据状态返回样式类名
        getSettleClass(settle) {
            // settle: 1-待处理, 2-处理中, 3-已完成, 4-已取消 (根据实际情况调整)
            const classMap = {
                1: 'badge-pending',
                2: 'badge-processing',
                3: 'badge-completed',
                4: 'badge-cancelled'
            }
            return classMap[settle] || 'badge-default'
        },
        // 跳转到订单详情
        toPrint(item) {
            let that = this
            uni.navigateTo({
                url: './orderDetlList',
                success: function (res) {
                    res.eventChannel.emit('data', {
                        data: item
                    })
                },
                events: {
                    acceptDataFromOpenedPage: function (data) {
                        that.matnr = data.data
                        that.findMat(that.matnr)
                    }
                }
            })
        }
    }
}
</script>
<style>
    @import url('@/static/css/wms.css/wms.css');
    .page-container {
        min-height: 100vh;
        background: #f5f7fa;
        padding-bottom: 20rpx;
    }
    .search-bar {
        padding: 0rpx 8rpx;
        background: #ffffff;
        box-shadow: 0 2rpx 12rpx rgba(0, 129, 255, 0.08);
    }
    .order-list {
        padding: 0 24rpx;
    }
    .order-card {
        background: #ffffff;
        border-radius: 16rpx;
        margin-top: 20rpx;
        box-shadow: 0 4rpx 20rpx rgba(0, 129, 255, 0.1);
        overflow: hidden;
        transition: transform 0.2s ease, box-shadow 0.2s ease;
        border: 1rpx solid #e4e7ed;
    }
    .order-card:active {
        transform: scale(0.98);
        box-shadow: 0 2rpx 10rpx rgba(0, 129, 255, 0.15);
    }
    .card-header {
        display: flex;
        align-items: center;
        padding: 24rpx 28rpx;
        background: linear-gradient(135deg, #0081ff 0%, #1890ff 100%);
    }
    .order-badge {
        padding: 6rpx 16rpx;
        border-radius: 20rpx;
        margin-right: 20rpx;
    }
    .badge-text {
        font-size: 22rpx;
        font-weight: 500;
        color: #ffffff;
    }
    /* 状态徽章颜色 */
    .badge-pending {
        background: rgba(255, 255, 255, 0.3);
    }
    .badge-processing {
        background: #ffc107;
    }
    .badge-completed {
        background: #28a745;
    }
    .badge-cancelled {
        background: #dc3545;
    }
    .badge-default {
        background: rgba(255, 255, 255, 0.25);
    }
    .order-no {
        flex: 1;
    }
    .order-no-label {
        font-size: 22rpx;
        color: rgba(255, 255, 255, 0.7);
        display: block;
    }
    .order-no-value {
        font-size: 28rpx;
        color: #ffffff;
        font-weight: 600;
        display: block;
        margin-top: 4rpx;
    }
    .card-body {
        padding: 24rpx 28rpx;
    }
    .info-row {
        display: flex;
        flex-wrap: wrap;
    }
    .info-item {
        width: 50%;
        margin-bottom: 16rpx;
    }
    .info-label {
        font-size: 24rpx;
        color: #909399;
        display: block;
    }
    .info-value {
        font-size: 28rpx;
        color: #303133;
        font-weight: 500;
        display: block;
        margin-top: 6rpx;
    }
    .card-footer {
        display: flex;
        align-items: center;
        justify-content: flex-end;
        padding: 20rpx 28rpx;
        border-top: 1rpx solid #f0f0f0;
    }
    .view-detail {
        font-size: 26rpx;
        color: #909399;
        margin-right: 8rpx;
    }
    /* 空状态 */
    .empty-state {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        padding: 120rpx 0;
    }
    .empty-text {
        font-size: 30rpx;
        color: #909399;
        margin-top: 30rpx;
    }
    .empty-hint {
        font-size: 24rpx;
        color: #c0c4cc;
        margin-top: 12rpx;
    }
</style>
@import url('@/static/css/wms.css/wms.css');
.page-container {
    min-height: 100vh;
    background: #f5f7fa;
    padding-bottom: 20rpx;
}
.search-bar {
    padding: 0rpx 8rpx;
    background: #ffffff;
    box-shadow: 0 2rpx 12rpx rgba(0, 129, 255, 0.08);
}
.order-list {
    padding: 0 24rpx;
}
.order-card {
    background: #ffffff;
    border-radius: 16rpx;
    margin-top: 20rpx;
    box-shadow: 0 4rpx 20rpx rgba(0, 129, 255, 0.1);
    overflow: hidden;
    transition: transform 0.2s ease, box-shadow 0.2s ease;
    border: 1rpx solid #e4e7ed;
}
.order-card:active {
    transform: scale(0.98);
    box-shadow: 0 2rpx 10rpx rgba(0, 129, 255, 0.15);
}
.card-header {
    display: flex;
    align-items: center;
    padding: 24rpx 28rpx;
    background: linear-gradient(135deg, #0081ff 0%, #1890ff 100%);
}
.order-badge {
    padding: 6rpx 16rpx;
    border-radius: 20rpx;
    margin-right: 20rpx;
}
.badge-text {
    font-size: 22rpx;
    font-weight: 500;
    color: #ffffff;
}
/* 状态徽章颜色 */
.badge-pending {
    background: rgba(255, 255, 255, 0.3);
}
.badge-processing {
    background: #ffc107;
}
.badge-completed {
    background: #28a745;
}
.badge-cancelled {
    background: #dc3545;
}
.badge-default {
    background: rgba(255, 255, 255, 0.25);
}
.order-no {
    flex: 1;
}
.order-no-label {
    font-size: 22rpx;
    color: rgba(255, 255, 255, 0.7);
    display: block;
}
.order-no-value {
    font-size: 28rpx;
    color: #ffffff;
    font-weight: 600;
    display: block;
    margin-top: 4rpx;
}
.card-body {
    padding: 24rpx 28rpx;
}
.info-row {
    display: flex;
    flex-wrap: wrap;
}
.info-item {
    width: 50%;
    margin-bottom: 16rpx;
}
.info-label {
    font-size: 24rpx;
    color: #909399;
    display: block;
}
.info-value {
    font-size: 28rpx;
    color: #303133;
    font-weight: 500;
    display: block;
    margin-top: 6rpx;
}
.card-footer {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    padding: 20rpx 28rpx;
    border-top: 1rpx solid #f0f0f0;
}
.view-detail {
    font-size: 26rpx;
    color: #909399;
    margin-right: 8rpx;
}
/* 空状态 */
.empty-state {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 120rpx 0;
}
.empty-text {
    font-size: 30rpx;
    color: #909399;
    margin-top: 30rpx;
}
.empty-hint {
    font-size: 24rpx;
    color: #c0c4cc;
    margin-top: 12rpx;
}
</style>
pages/outbound/orderOut/outLocView.vue
@@ -60,6 +60,12 @@
                        </view>                        
                    </view>
                    <view class="cu-item" v-if="index === locList.length - 1 && (item.anfme === 0 || !item.anfme)">
                        <view class="content">
                            <text class="text-red text-bold">库存不足</text>
                        </view>
                    </view>
                    <view class="cu-item" v-if="item.anfme">
                        <view class="content">
                            <text class="text-blue">出库数量:</text>                            
@@ -161,7 +167,7 @@
                }
                const { code, data, msg } = await request('/check/agvStation', {
                    transferStationNo: item.outStaInput
                })
                }, 'POST', false)
                if (code === 200) {
                    item.agvStationName = data.stationName
                } else {
@@ -206,7 +212,9 @@
                    }
                    const { code, data, msg } = await request(
                        '/orderOut/getOutLocRun',
                        requestData
                        requestData,
                        'POST',
                        false
                    )
                    if (code === 200) {
                        uni.showToast({
@@ -233,7 +241,7 @@
                try {
                    const res = await request('/orderOut/getOutLocView', {
                        orderItemId: item.id                        
                    }, 'POST', true);
                    }, 'POST', false);
                    
                    if (res.code === 200) {
                        this.locList = res.data || [];