1
skyouc
2026-01-22 20e6520be621221456a3ef4260401dd96e28fa4a
1
1个文件已添加
1个文件已修改
707 ■■■■■ 已修改文件
pages/AGV/CollectionPakin.vue 94 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/CollectionPakinT.vue 613 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/AGV/CollectionPakin.vue
@@ -5,6 +5,10 @@
                <view class="code-decs">源托盘:</view>
                <input type="text" placeholder=" 扫码 / 输入" v-model="orgBarcode" :focus="orgBarcodeFocus" />
            </view>
            <view class="item">
                <view class="code-decs">出库站号:</view>
                <input type="text" placeholder=" 扫码 / 输入" v-model="devNo" />
            </view>
            <view class="item" style="display: none;">
                <view class="code-decs">台车码:</view>
                <input type="text" placeholder=" 扫码 / 输入" v-model="barcode" :focus="barcodeFocus" />
@@ -484,42 +488,78 @@
                        return;
                    }
                }
                uni.request({
                    url: that.baseUrl + '/mobile/comb/auth',
                    data: JSON.stringify({
                        orderNo: that.orderNo,
                        barcode: that.barcode,
                        boxType1: that.boxType1,
                        combMats: that.dataList,
                        type: '1'
                    }),
                    url: `${this.baseUrl}/mobile/agv/collectionPakin/auth`,
                    method: 'POST',
                    data: JSON.stringify({
                        orgBarcode: that.orgBarcode,
                        tarBarcode: that.barcode,
                        devNo: that.devNo,
                        combMats: that.dataList
                    }),
                    header: {
                        'token': uni.getStorageSync('token')
                        token: that.token
                    },
                    success(result) {
                        var res = result.data
                    success: (result) => {
                        const res = result.data
                        if (res.code === 200) {
                            that.resst();
                            that.messageText = "组托成功"
                            that.messageToggle('success')
                            const innerAudioContext = uni.createInnerAudioContext();
                            innerAudioContext.src = '/static/music/pakinOk.mp3';
                            innerAudioContext.play()
                        } else if (res.code == 403) {
                            that.messageText = res.msg
                            that.messageToggle('error')
                            setTimeout(() => {
                                uni.reLaunch({
                                    url: '../login/login'
                                });
                            }, 1000);
                            that.clearAll()
                            that.showMessage(res.msg, 'success')
                            // this.showMessage('组托成功')
                            // // 播放成功提示音
                            // const audio = uni.createInnerAudioContext()
                            // audio.src = '/static/music/pakinOk.mp3'
                            // audio.play()
                        } else if (res.code === 403) {
                            that.handleAuthError(res.msg)
                        } else {
                            that.messageText = res.msg
                            that.messageToggle('error')
                            that.showMessage(res.msg, 'error')
                        }
                    },
                    complete: () => {
                        // 请求完成后解除防抖锁定
                        setTimeout(() => {
                            that.isCombing = false
                        }, 500)
                    }
                });
                // uni.request({
                //     url: that.baseUrl + '/mobile/comb/auth',
                //     data: JSON.stringify({
                //         orderNo: that.orderNo,
                //         barcode: that.barcode,
                //         boxType1: that.boxType1,
                //         combMats: that.dataList,
                //         type: '1'
                //     }),
                //     method: 'POST',
                //     header: {
                //         'token': uni.getStorageSync('token')
                //     },
                //     success(result) {
                //         var res = result.data
                //         if (res.code === 200) {
                //             that.resst();
                //             that.messageText = "组托成功"
                //             that.messageToggle('success')
                //             const innerAudioContext = uni.createInnerAudioContext();
                //             innerAudioContext.src = '/static/music/pakinOk.mp3';
                //             innerAudioContext.play()
                //         } 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')
                //         }
                //     }
                // });
            },
            reset(type) {
                this.msgType = type
pages/AGV/CollectionPakinT.vue
New file
@@ -0,0 +1,613 @@
<template>
    <view>
        <view class="code">
            <view class="item">
                <view class="code-decs">源托盘:</view>
                <input type="text" placeholder=" 扫码 / 输入" v-model="orgBarcode" :focus="orgBarcodeFocus"
                    @input="barcodeInput()" />
            </view>
            <!-- // style="display: none;" -->
            <view class="item" style="display: none;">
                <view class="code-decs">台车码:</view>
                <input type="text" placeholder=" 扫码 / 输入" v-model="tarBarcode" :focus="tarBarcodeFocus" />
            </view>
            <view class="item">
                <view class="code-decs">格层编码:</view>
                <input type="text" placeholder=" 扫码 / 输入" v-model="boxType1" :focus="boxType1Focus"
                    @input="boxType1Input()">
            </view>
            <view class="item">
                <view class="code-decs">站点号:</view>
                <input type="text" placeholder=" 扫码 / 输入" v-model="devNo" />
            </view>
        </view>
        <view class="mat-list-title">商品列表</view>
        <scroll-view scroll-y>
            <view class="list" v-for="(item, index) in dataList" :key="index">
                <view class="list-left">
                    <view class="list-left-item">
                        <view class="desc">No:</view>
                        <view class="left-item">{{ index + 1 }}</view>
                    </view>
                    <view class="list-left-item">
                        <view class="desc">编码:</view>
                        <view class="left-item">
                            <uni-tag :text="item.matnr" type="primary"></uni-tag>
                        </view>
                    </view>
                    <view class="list-left-item">
                        <view class="desc">品名:</view>
                        <uni-tooltip class="left-item" :content="item.maktx" placement="bottom">
                            <view class="left-item tip" style="">
                                {{ item.maktx }}
                            </view>
                        </uni-tooltip>
                    </view>
                    <view class="list-left-item">
                        <view class="desc">规格:</view>
                        <view class="left-item">{{ item.specs }}</view>
                    </view>
                    <view class="popup-item">
                        <view class="desc">格层编码:</view>
                        <view class="left-item">{{ item.boxType1 }}</view>
                    </view>
                    <view class="list-left-item">
                        <view class="desc">供应商:</view>
                        <view class="left-item">
                            <uni-tag :text="item.standby1" type="warning"></uni-tag>
                        </view>
                    </view>
                    <view class="list-left-item">
                        <view class="desc">数量:</view>
                        <view class="left-item">{{ item.anfme }}</view>
                    </view>
                    <view class="list-left-item">
                        <view class="desc">拣货数量:</view>
                        <view class="left-item" style="border: none; justify-content: center">
                            <uni-number-box disabled="true" v-model="item.workQty" :max="item.anfme" color="#747474" />
                        </view>
                    </view>
                </view>
                <view class="list-right">
                    <uni-icons type="compose" color="#9add8b" size="24" @click="revise(item, index)"></uni-icons>
                    <uni-icons type="trash" color="#f58a8a" size="24" @click="remove(index)"></uni-icons>
                </view>
            </view>
            <!-- 空状态提示 -->
            <view v-if="dataList.length === 0" class="empty-tips">
                暂无商品,请扫码添加
            </view>
        </scroll-view>
        <!-- 底部操作按钮 -->
        <view class="buttom">
            <button size="mini" @click="reset">
                重置
            </button>
            <button size="mini" type="primary" @click="combConfirm">
                组托
            </button>
        </view>
        <!-- 修改数量弹窗 -->
        <uni-popup ref="revise" type="dialog">
            <view class="popup">
                <view class="title">修改</view>
                <view class="popup-item">
                    <view class="popup-item-left">编码:</view>
                    <view class="popup-item-right">
                        <input type="text" v-model="editForm.matnr" disabled style="
                                background-color: #f7f7f7;
                                padding: 0;
                                color: #d5d5d5;
                            " />
                    </view>
                </view>
                <view class="popup-item">
                    <view class="popup-item-left">供应商:</view>
                    <view class="popup-item-right">
                        <input type="text" v-model="editForm.standby1" />
                    </view>
                </view>
                <view class="popup-item">
                    <view class="popup-item-left">格层编码:</view>
                    <view class="popup-item-right">
                        <input type="text" v-model="tempBoxType"
                            style="padding: 0;color: #d5d5d5;">
                    </view>
                </view>
                <view class="popup-item">
                    <view class="popup-item-left">数量:</view>
                    <view class="popup-item-right" style="border: none; justify-content: center">
                        <uni-number-box :value="editForm.count" :step="0.01" :max="9999999" color="#747474"
                            @change="changeValue" />
                    </view>
                </view>
                <view class="btn">
                    <view class="btn-left" @click="reviseClose">
                        取消
                    </view>
                    <view class="btn-right" @click="reviseConfirm">
                        修改
                    </view>
                </view>
            </view>
        </uni-popup>
        <!-- 移除确认弹窗 -->
        <uni-popup ref="removeDialog" type="dialog">
            <uni-popup-dialog type="warn" confirmText="移除" title="警告" content="是否移除当前商品!" @confirm="removeConfirm"
                @close="removeClose"></uni-popup-dialog>
        </uni-popup>
        <!-- 消息提示 -->
        <uni-popup ref="message" type="message">
            <uni-popup-message :type="msgType" :message="messageText" :duration="2000"></uni-popup-message>
        </uni-popup>
        <!-- 确认组托弹窗 -->
        <uni-popup ref="combDialog" type="dialog">
            <uni-popup-dialog type="warn" cancelText="取消" confirmText="确认" title="警告" content="是否现在组托!" @confirm="comb"
                @close="combClose"></uni-popup-dialog>
        </uni-popup>
        <!-- 确认重置弹窗 -->
        <uni-popup ref="resetDialog" type="dialog">
            <uni-popup-dialog type="warn" cancelText="取消" confirmText="确认" title="警告" content="是否重置!"
                @confirm="resetConfirm" @close="resetClose"></uni-popup-dialog>
        </uni-popup>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                baseUrl: '',
                token: '',
                orgBarcode: '',
                tarBarcode: '',
                dataList: [],
                orgBarcodeFocus: false,
                tarBarcodeFocus: false,
                boxType1Focus: true,
                tempBoxType: '',
                devNo: '',
                // 编辑表单
                editForm: {
                    index: -1,
                    matnr: '',
                    standby1: '',
                    weight: '',
                    count: 0
                },
                // 待移除项索引
                removeIndex: -1,
                // 消息提示
                msgType: 'success',
                messageText: '',
                // 组托按钮防抖
                isCombing: false
            }
        },
        onShow() {
            this.baseUrl = uni.getStorageSync('baseUrl')
            this.token = uni.getStorageSync('token')
        },
        methods: {
            itemWorkQtyChange(item) {},
            // 显示消息提示
            showMessage(text, type = 'success') {
                this.msgType = type
                this.messageText = text
                this.$refs.message.open()
            },
            boxType1Input() {
                let bcode = this.boxType1.split("-")[0];
                if (this.tarBarcode != null && this.tarBarcode != undefined && this.tarBarcode != '') {
                    if (this.tarBarcode != bcode && this.dataList.length > 0) {
                        this.messageText = "多次组托台车不一致,请检查后再操作!!"
                        this.messageToggle('error')
                        this.dataList = [];
                        return;
                    }
                }
                this.tarBarcode = bcode;
            },
            // 重置光标焦点
            resetFocus(field) {
                this[field] = false
                setTimeout(() => {
                    this[field] = true
                }, 100)
            },
            // 处理授权错误
            handleAuthError(msg) {
                this.showMessage(msg, 'error')
                setTimeout(() => {
                    uni.reLaunch({
                        url: '../login/login'
                    })
                }, 1000)
            },
            // 源托盘输入事件
            barcodeInput() {
                setTimeout(() => {
                    const len = this.orgBarcode.length
                    if (len > 0 && len < 8) {
                        uni.showToast({
                            title: '托盘码有误请重试',
                            icon: 'none',
                            position: 'top'
                        })
                        this.orgBarcode = ''
                        this.resetFocus('orgBarcodeFocus')
                        return
                    }
                    this.resetFocus('tarBarcodeFocus')
                }, 200)
                this.search()
            },
            search() {
                let that = this
                uni.request({
                    url: that.baseUrl + '/mobile/agv/collectionPakin/view',
                    header: {
                        token: uni.getStorageSync('token')
                    },
                    data: JSON.stringify({
                        orgBarcode: that.orgBarcode
                    }),
                    method: 'POST',
                    success(res) {
                        res = res.data
                        if (res.code === 200) {
                            that.dataList = res.data.map((item) => ({
                                ...item,
                                workQty: item.anfme
                            }))
                        } else if (res.code == 403) {
                            that.messageText = res.msg
                            that.messageToggle('error')
                            setTimeout(() => {
                                uni.reLaunch({
                                    url: '../login/login'
                                })
                            }, 1000)
                        } else {
                            that.showMessage(res.msg, 'error')
                        }
                    }
                })
            },
            // 搜索物料
            findMat() {
                if (!this.tarBarcode) return
                setTimeout(() => {
                    uni.request({
                        url: `${this.baseUrl}/mat/auth`,
                        data: {
                            matnr: this.tarBarcode
                        },
                        header: {
                            token: this.token
                        },
                        success: (result) => {
                            const res = result.data
                            if (res.code === 200 && res.data) {
                                this.navigateToMatSelect(res.data)
                            } else if (res.code === 403) {
                                this.handleAuthError(res.msg)
                            } else {
                                uni.showToast({
                                    title: res.msg,
                                    icon: 'none',
                                    position: 'top'
                                })
                            }
                        }
                    })
                }, 200)
            },
            // 跳转物料选择页
            navigateToMatSelect(matData) {
                matData.batch = ''
                uni.navigateTo({
                    url: '../mat/matSelected',
                    success: (res) => {
                        res.eventChannel.emit('mat', {
                            data: [matData]
                        })
                    },
                    events: {
                        matList: (data) => {
                            this.checkMat(data.data)
                            this.tarBarcode = ''
                            this.resetFocus('tarBarcodeFocus')
                        }
                    }
                })
            },
            // 选择物料
            selectMat() {
                uni.navigateTo({
                    url: '../mat/matQuery',
                    success: (res) => {
                        res.eventChannel.emit('commonUrl', {
                            commonUrl: ''
                        })
                    },
                    events: {
                        acceptDataFromOpenedPage: (data) => {
                            this.tarBarcode = data.data
                            this.findMat()
                        }
                    }
                })
            },
            // 检查并添加物料
            checkMat(mat) {
                const existIndex = this.dataList.findIndex(
                    (item) => item.matnr === mat.matnr && item.batch === mat.batch
                )
                if (existIndex > -1) {
                    // 相同物料相同批号,数量累加
                    this.dataList[existIndex].anfme += mat.anfme
                    this.$forceUpdate()
                } else {
                    // 新增到列表头部
                    this.dataList.unshift(mat)
                }
                if (this.dataList[existIndex].boxType1 != null && this.dataList[existIndex].boxType1 == "1") {
                    this.dataList[existIndex].boxType1 = this.boxType1;
                }
            },
            // 打开修改弹窗
            revise(item, index) {
                // const item = this.dataList[index]
                console.log(item);
                this.editForm = {
                    index,
                    matnr: item.matnr,
                    standby1: item.standby1,
                    weight: item.weight,
                    count: item.anfme
                }
                this.$refs.revise.open()
            },
            // 数量变更
            changeValue(value) {
                this.editForm.count = value
            },
            // 确认修改
            reviseConfirm() {
                const {
                    index,
                    count,
                    standby1,
                    weight,
                } = this.editForm
                this.dataList[index].anfme = count
                this.dataList[index].standby1 = standby1
                this.dataList[index].weight = weight
                this.dataList[index].boxType1 = this.tempBoxType
                this.$refs.revise.close()
                let bcode = this.tempBoxType.split("-")[0];
                if (this.tarBarcode != null && this.tarBarcode != undefined && this.tarBarcode != '') {
                    if (this.tarBarcode != bcode && this.dataList.length > 0) {
                        this.messageText = "多次组托台车不一致,请检查后再操作!!"
                        this.messageToggle('error')
                        return;
                    }
                }
                this.tarBarcode = bcode;
                this.showMessage('修改成功')
            },
            // 关闭修改弹窗
            reviseClose() {
                this.$refs.revise.close()
            },
            // 打开移除确认弹窗
            remove(index) {
                this.removeIndex = index
                this.$refs.removeDialog.open()
            },
            // 确认移除
            removeConfirm() {
                this.dataList.splice(this.removeIndex, 1)
                this.showMessage('移除成功')
            },
            // 关闭移除弹窗
            removeClose() {
                this.$refs.removeDialog.close()
            },
            // 打开组托确认弹窗
            combConfirm() {
                if (!this.orgBarcode) {
                    this.showMessage('请扫描源托盘条码', 'error')
                    return
                }
                if (this.dataList.length === 0) {
                    this.showMessage('请添加商品列表', 'error')
                    return
                }
                if (!this.tarBarcode) {
                    this.showMessage('请扫描目标托盘条码', 'error')
                    return
                }
                const invalidItem = this.dataList.find(
                    (item) => !item.anfme || item.anfme === 0
                )
                if (invalidItem) {
                    this.showMessage(
                        `${invalidItem.matnr} 组托数量不能为0`,
                        'error'
                    )
                    return
                }
                this.$refs.combDialog.open()
            },
            // 关闭组托弹窗
            combClose() {
                this.$refs.combDialog.close()
            },
            // 执行组托
            comb() {
                if (this.isCombing) return
                this.isCombing = true
                uni.vibrateShort()
                uni.request({
                    url: `${this.baseUrl}/mobile/agv/collectionPakin/auth`,
                    method: 'POST',
                    data: JSON.stringify({
                        orgBarcode: this.orgBarcode,
                        tarBarcode: this.tarBarcode,
                        devNo: this.devNo,
                        combMats: this.dataList
                    }),
                    header: {
                        token: this.token
                    },
                    success: (result) => {
                        const res = result.data
                        if (res.code === 200) {
                            this.clearAll()
                            this.showMessage(res.msg, 'success')
                            // this.showMessage('组托成功')
                            // // 播放成功提示音
                            // const audio = uni.createInnerAudioContext()
                            // audio.src = '/static/music/pakinOk.mp3'
                            // audio.play()
                        } else if (res.code === 403) {
                            this.handleAuthError(res.msg)
                        } else {
                            this.showMessage(res.msg, 'error')
                        }
                    },
                    complete: () => {
                        // 请求完成后解除防抖锁定
                        setTimeout(() => {
                            this.isCombing = false
                        }, 500)
                    }
                })
            },
            // 打开重置确认弹窗
            reset() {
                this.$refs.resetDialog.open()
            },
            // 确认重置
            resetConfirm() {
                this.clearAll()
                this.showMessage('重置完成')
            },
            // 关闭重置弹窗
            resetClose() {
                this.$refs.resetDialog.close()
            },
            // 清空所有数据
            clearAll() {
                this.dataList = []
                this.orgBarcode = ''
                this.tarBarcode = ''
                this.devNo = ''
                this.resetFocus('orgBarcodeFocus')
            }
        }
    }
</script>
<style>
    @import url('../../static/css/wms.css/wms.css');
    .code {
        width: 100%;
        position: fixed;
        min-height: 200rpx;
        background-color: #fff;
        z-index: 10;
    }
    .item {
        display: flex;
        align-items: center;
        height: 100rpx;
        margin-left: 20rpx;
        border-bottom: 1px solid #dcdfe6;
    }
    .item input {
        height: 50rpx;
        line-height: 50rpx;
        font-size: 36upx;
        font-family: PingFang SC;
        width: 55vw;
    }
    .code-decs {
        width: 20vw;
        font-size: 18px;
        color: #303133;
    }
    .item-right {
        margin-left: auto;
        margin-right: 20rpx;
    }
    .mat-list-title {
        height: 80rpx;
        line-height: 80rpx;
        width: 100%;
        background-color: white;
        position: fixed;
        margin-top: 150rpx;
        z-index: 9;
        text-align: center;
        box-shadow: 0px 0px 30px 0px rgba(0, 0, 0, 0.5);
    }
    .list:first-child {
        margin-top: 270rpx;
    }
    .empty-tips {
        text-align: center;
        color: #909399;
        padding: 100rpx 0;
        margin-top: 150rpx;
    }
    .tip {
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
    }
</style>