修复 foreach循环 发送请求时,可能会导致死锁的问题,切换成for...of 加 同步请求
2个文件已修改
622 ■■■■■ 已修改文件
components/BillListPopup/BillListPopup.vue 468 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/shengchanlingliaoshengdan/form.vue 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
components/BillListPopup/BillListPopup.vue
@@ -1,236 +1,278 @@
<template>
    <view>
        <uni-popup ref="popup" type="bottom" @change="popupChangeHandler">
            <view class="content">
                <view class="search-condition">
                    <view class="title"><text>源单单号: </text></view>
                    <view class="right"><input type="text" v-model="HSourceBillNo" /></view>
                </view>
                <view class="search-condition">
                    <view class="title"><text>物料: </text></view>
                    <view class="right"><input type="text" v-model="HMater" /></view>
                </view>
                <view class="search-condition">
                    <view class="title"><text>关联项: </text></view>
                    <view class="right"><input type="text" v-model="HCustom" /></view>
                </view>
                <view class="buttons">
                    <view style="flex: 1;"></view>
                    <button size="mini" type="primary" @click="search">搜索</button>
                    <button size="mini" type="primary" @click="exit">退出</button>
                </view>
                <scroll-view id="#BillListPanel" scroll-y="true" style="height: 55vh;">
                    <view class="options-wrapper" v-show="HBillList.length != 0">
                        <uni-card v-for="(bill, index) in HBillList[curPage-1]" :key="index" :title="bill['物料名称']"
                            :extra="`数量: ${bill['数量']}`" @tap="clickCard(bill['HSourceInterID'], bill['单据号'])">
                            <view class="item">
                                <view class="left">单据号: </view>
                                <view class="right">{{bill['单据号']}}</view>
                            </view>
                            <view class="item">
                                <view class="left">物料代码: </view>
                                <view class="right">{{bill['物料代码']}}</view>
                            </view>
                            <!-- <view class="item">
    <view>
        <uni-popup ref="popup" type="bottom" @change="popupChangeHandler">
            <view class="content">
                <view class="search-condition">
                    <view class="title"><text>源单单号: </text></view>
                    <view class="right"><input type="text" v-model="HSourceBillNo" @confirm="getBillList" /></view>
                </view>
                <view class="search-condition">
                    <view class="title"><text>物料: </text></view>
                    <view class="right"><input auto-focus type="text" v-model="HMater" @confirm="getBillList" /></view>
                </view>
                <view class="search-condition">
                    <view class="title"><text>关联项: </text></view>
                    <view class="right"><input type="text" v-model="HCustom" @confirm="getBillList" /></view>
                </view>
                <view class="buttons">
                    <view style="flex: 1;"></view>
                    <button size="mini" type="primary" @click="search">搜索</button>
                    <button v-if="MultiSourceBill" size="mini" type="primary" @click="ret">返回</button>
                    <button size="mini" type="primary" @click="exit">退出</button>
                </view>
                <scroll-view id="#BillListPanel" scroll-y="true" style="height: 55vh;">
                    <view class="options-wrapper" v-show="HBillList.length != 0">
                        <uni-card :is-active="bill.isActive" v-for="(bill, index) in HBillList[curPage-1]" :key="index"
                            :title="bill['物料名称']" :extra="`数量: ${bill['数量']}`"
                            @tap="clickCard(bill['HSourceInterID'], bill['单据号'], index)">
                            <view class="item">
                                <view class="left">单据号: </view>
                                <view class="right">{{bill['单据号']}}</view>
                            </view>
                            <view class="item">
                                <view class="left">物料代码: </view>
                                <view class="right">{{bill['物料代码']}}</view>
                            </view>
                            <!-- <view class="item">
                                <view class="left">物料名称: </view>
                                <view class="right">{{}}</view>
                            </view> -->
                            <view class="item">
                                <view class="left">规格型号: </view>
                                <view class="right">{{bill['规格型号']}}</view>
                            </view>
                        </uni-card>
                    </view>
                    <view class="over" v-show="HBillList.length == 0">暂无数据</view>
                </scroll-view>
                <uni-pagination id="#pagination" title="标题文字" v-model="curPage" :pageSize="size"
                    :total="length"></uni-pagination>
            </view>
                            <view class="item">
                                <view class="left">规格型号: </view>
                                <view class="right">{{bill['规格型号']}}</view>
                            </view>
                        </uni-card>
                    </view>
                    <view class="over" v-show="HBillList.length == 0">暂无数据</view>
                </scroll-view>
                <uni-pagination id="#pagination" title="标题文字" v-model="curPage" :pageSize="size"
                    :total="length"></uni-pagination>
            </view>
        </uni-popup>
    </view>
        </uni-popup>
    </view>
</template>
<script>
    import {
        CommonUtils
    } from '../../utils/common';
    export default {
        name: "BillListPopup",
        data() {
            return {
                size: 20,
                curPage: 1,
                length: 0,
                page: 0,
                HSourceBillNo: '',
                HMater: '',
                HCustom: '',
                HBillList: [],
                panelHeight: 0,
            };
        },
        props: {
            HBillType: {
                type: [String, Number],
                required: true
            },
            HSourceBillType: {
                type: [String, Number],
                required: true
            },
            HStockOrgID: {
                type: [String, Number],
                required: true
            },
        },
        model: {
            prop: "HSourceBill",
            event: 'change'
        },
        methods: {
            popupChangeHandler(e) {
                if (e.show === true) {
                    this.getBillList()
                } else {
                    // 清理资源
                    this.size = 20
                    this.curPage = 1
                    this.length = 0
                    this.page = 0
                    this.HSourceBillNo = ''
                    this.HMater = ''
                    this.HCustom = ''
                    this.HBillList = []
                }
            },
            exit() {
                this.$refs.popup.close();
            },
            search() {
                this.getBillList()
            },
            showPopup() {
                this.$refs.popup.open();
            },
            clickCard(interid, billno) {
                uni.$emit('BillSelectComplete', {
                    HInterID: interid,
                    HBillNo: billno
                })
                // this.exit()
            },
            getBillList() {
                this.HBillList = []
                this.length = 0
                this.page = 0
                this.curPage = 1
                CommonUtils.doRequest(
                    "/WEBSController/GetSourceBillList_Json", {
                        HBilltype: this.HBillType,
                        HSourceBillType: this.HSourceBillType,
                        HStockOrgID: this.HStockOrgID,
                        HSourceBillNo: this.HSourceBillNo || "",
                        HMater: this.HMater || "",
                        HCustom: this.HCustom || ""
                    },
                    (res) => {
                        let {
                            data,
                            count,
                            Message
                        } = res.data
                        if (count == 1) {
                            console.log(data)
                            this.length = Array.from(data).length
                            const result = [];
                            for (let i = 0; i < data.length; i += this.size) {
                                result.push(data.slice(i, i + this.size));
                            }
                            this.HBillList = result
                            this.page = result.length
                        } else {
                            uni.showToast({
                                icon: 'none',
                                title: Message
                            })
                        }
                    }
                )
            },
        },
    }
    import {
        CommonUtils
    } from '../../utils/common';
    export default {
        name: "BillListPopup",
        data() {
            return {
                size: 20,
                curPage: 1,
                length: 0,
                page: 0,
                HSourceBillNo: '',
                HMater: '',
                HCustom: '',
                HBillList: [],
                panelHeight: 0,
                multiSouceBillList: []
            };
        },
        props: {
            HBillType: {
                type: [String, Number],
                required: true
            },
            HSourceBillType: {
                type: [String, Number],
                required: true
            },
            HStockOrgID: {
                type: [String, Number],
                required: true
            },
            MultiSourceBill: {
                type: Boolean,
                default: false,
                required: false
            }
        },
        model: {
            prop: "HSourceBill",
            event: 'change'
        },
        methods: {
            popupChangeHandler(e) {
                if (e.show === true) {
                    this.getBillList()
                } else {
                    // 清理资源
                    this.size = 20
                    this.curPage = 1
                    this.length = 0
                    this.page = 0
                    this.HSourceBillNo = ''
                    this.HMater = ''
                    this.HCustom = ''
                    this.HBillList = []
                }
            },
            exit() {
                this.$refs.popup.close();
            },
            search() {
                this.getBillList()
            },
            ret() {
                uni.$emit('BillSelectComplete', {
                    HInterID: 0,
                    HBillNo: 0,
                    enableMultiSourceBill: this.MultiSourceBill,
                    MultiSourceBillList: this.multiSouceBillList
                })
            },
            showPopup() {
                this.$refs.popup.open();
            },
            clickCard(interid, billno, index) {
                if (this.MultiSourceBill == false) { // 非多源单模式
                    uni.$emit('BillSelectComplete', {
                        HInterID: interid,
                        HBillNo: billno,
                        enableMultiSourceBill: this.MultiSourceBill
                    })
                } else {
                    this.$set(this.HBillList[this.curPage - 1][index], 'isActive', !this.HBillList[this.curPage - 1][
                        index
                    ]['isActive'])
                    console.log(this.HBillList[this.curPage - 1][index])
                    // 设置了多源单模式
                    this.setMultiSourceBillList({
                        HInterID: interid,
                        HBillNo: billno
                    })
                }
                // this.exit()
            },
            setMultiSourceBillList(billInfo) {
                let index = this.multiSouceBillList.findIndex(item => item.HInterID == billInfo.HInterID)
                if (index == -1) {
                    this.multiSouceBillList.push(billInfo)
                } else {
                    this.multiSouceBillList.splice(index, 1)
                }
            },
            getBillList() {
                this.HBillList = []
                this.length = 0
                this.page = 0
                this.curPage = 1
                CommonUtils.doRequest(
                    "/WEBSController/GetSourceBillList_Json", {
                        HBilltype: this.HBillType,
                        HSourceBillType: this.HSourceBillType,
                        HStockOrgID: this.HStockOrgID,
                        HSourceBillNo: this.HSourceBillNo || "",
                        HMater: this.HMater || "",
                        HCustom: this.HCustom || ""
                    },
                    (res) => {
                        let {
                            data,
                            count,
                            Message
                        } = res.data
                        if (count == 1) {
                            this.length = Array.from(data).length
                            const result = [];
                            for (let i = 0; i < data.length; i += this.size) {
                                result.push(data.slice(i, i + this.size));
                            }
                            this.HBillList = result
                            this.page = result.length
                        } else {
                            uni.showToast({
                                icon: 'none',
                                title: Message
                            })
                        }
                    }
                )
            },
        },
    }
</script>
<style lang="scss">
    .content {
        box-sizing: border-box;
        border-radius: 15rpx 15rpx 0 0;
        padding: 20rpx 20rpx 40rpx 20rpx;
        background-color: #fff;
        display: flex;
        flex-direction: column;
        gap: 10rpx;
    .content {
        box-sizing: border-box;
        border-radius: 15rpx 15rpx 0 0;
        padding: 20rpx 20rpx 40rpx 20rpx;
        background-color: #fff;
        display: flex;
        flex-direction: column;
        gap: 10rpx;
        .search-condition {
            display: flex;
            flex-direction: row;
            align-items: center;
            gap: 20rpx;
        .search-condition {
            display: flex;
            flex-direction: row;
            align-items: center;
            gap: 20rpx;
            .title {
                width: 5rem;
                text-align: right;
            }
            .title {
                width: 5rem;
                text-align: right;
            }
            .right {
                flex: 1;
                border-radius: 22rpx;
                border: 1px solid #acacac;
                height: auto;
            .right {
                flex: 1;
                border-radius: 22rpx;
                border: 1px solid #acacac;
                height: auto;
                input {
                    width: 100%;
                    padding: 8rpx 20rpx;
                    font-size: 24rpx;
                }
            }
        }
                input {
                    width: 100%;
                    padding: 8rpx 20rpx;
                    font-size: 24rpx;
                }
            }
        }
        .buttons {
            display: flex;
            flex-direction: row;
            gap: 20rpx;
            justify-content: flex-end;
        .buttons {
            display: flex;
            flex-direction: row;
            gap: 20rpx;
            justify-content: flex-end;
            >button {
                display: inline-flex;
                width: 4rem;
            }
        }
            >button {
                display: inline-flex;
                width: 4rem;
            }
        }
        .options-wrapper {
            padding: 20rpx;
            display: grid;
            grid-template-columns: repeat(1, 1fr);
            gap: 20rpx;
        .options-wrapper {
            padding: 20rpx;
            display: grid;
            grid-template-columns: repeat(1, 1fr);
            gap: 20rpx;
            >view {
                margin: 0 !important;
                box-sizing: border-box;
            >view {
                margin: 0 !important;
                box-sizing: border-box;
            }
            }
            .item {
                .left {
                    display: inline-block;
                    width: 6rem;
                }
            .item {
                .left {
                    display: inline-block;
                    width: 6rem;
                }
                .right {
                    display: inline-block;
                }
            }
        }
    }
                .right {
                    display: inline-block;
                }
            }
        }
        .uni-card[is-active] {
           background-color: rgba(0, 122, 255, 0.2);
        }
    }
</style>
pages/shengchanlingliaoshengdan/form.vue
@@ -280,7 +280,7 @@
            </view>
        </view>
        <BillListPopupVue ref="billList" :HBillType="hform.HBillType" :HSourceBillType="hform.HMainSourceBillType"
            :HStockOrgID="hform.HStockOrgID"></BillListPopupVue>
            :HStockOrgID="hform.HStockOrgID" :MultiSourceBill="enableMultiSourceBill"></BillListPopupVue>
        <BarCodePopupVue ref="barcodePopup"></BarCodePopupVue>
    </view>
</template>
@@ -409,15 +409,45 @@
            
            this.getRelationStore()
            uni.$on('BillSelectComplete', (e) => {
                console.log("接收到的消息: ", e.HBillNo)
                this.getHBarCodeData(e.HBillNo)
                this.$refs.billList.exit()
            uni.$on('BillSelectComplete', async (e) => {
                console.log("接收到的消息: ", e)
                console.log("是否应用多源单: ", e.enableMultiSourceBill)
                if(e.enableMultiSourceBill){
                    for(let item of e.MultiSourceBillList) {
                        try{
                            await this.getHBarCodeData(item.HBillNo)
                        }catch {
                            return
                        }
                    }
                    this.$refs.billList.exit()
                    if(e.MultiSourceBillList.length != 0){
                         this.showHSourceBillNo = false
                    }
                }else {
                    this.getHBarCodeData(e.HBillNo)
                    this.$refs.billList.exit()
                }
            })
        },
        onUnload() {
            uni.$off('BillSelectComplete')
        },
        computed: {
            enableMultiSourceBill: {
                get() {
                    if(uni.getStorageSync("Organization").includes("海诚") && this.hform.HMainSourceBillType ==  3720){
                        return true
                    }
                    return false
                }
            }
        },
        methods: {
            async qrCodeDisplay() {
                try {
@@ -909,63 +939,69 @@
                }
            },
            //选中源单
            getHBarCodeData(HBarCode) {
            async getHBarCodeData(HBarCode) {
                if (!this.hform.HFIFOWHName) {
                    this.hform.HFIFOWHID = 0
                }
                uni.request({
                    url: this.serverUrl + '/WEBSController/get_SourceBarCode_MateOut_Json',
                    data: {
                        HInterID: this.hform.HInterID,
                        HBillNo: this.hform.HBillNo,
                        HBillType: this.hform.HBillType,
                        HSourceBillNo: HBarCode,
                        HSourceBillType: this.hform.HMainSourceBillType,
                        HMaker: this.hform.HMaker,
                        HStockOrgID: this.hform.HStockOrgID,
                        HFIFOWHID: this.hform.HFIFOWHID,
                        HPTQty: this.hform.HPTQty || 0,
                        HPlanMode: this.hform.HPlanMode || 0
                    },
                    success: (res) => {
                        if (res.data.count == 1) {
                            var data = res.data.data
                            console.log(2, data);
                            this.hform.HSupName = data.hSupNameField
                            this.hform.HSupID = data.hSupIDField
                            if (data.hDeptIDField != 0) {
                                this.hform.HDeptID = data.hDeptIDField
                                this.hform.HDeptName = data.hDeptNameField
                            }
                            this.hform.HSourceBillNo = data.hSourceBillNoField
                            this.showHMainSourceBillType = false
                            if (data.hMulSourceFlagField == 0) {
                                this.showHSourceBillNo = false
                            }
                            this.tabs = 2
                            this.showHSupName = false
                            this.barCodeFocus = true
                            this.playSound(1)
                            this.DisBillEntryList()
                        } else {
                            this.playSound(0)
                            this.refreshHSourceBillState()
                            uni.showToast({
                                title: res.data.Message,
                                icon: 'none'
                            })
                        }
                    },
                    fail: (res) => {
                        this.playSound(0)
                        this.refreshHSourceBillState()
                        console.log(res);
                        uni.showToast({
                            title: '接口请求失败',
                            icon: 'none'
                        })
                    },
                });
                return new Promise((resolve, reject) => {
                    uni.request({
                        url: this.serverUrl + '/WEBSController/get_SourceBarCode_MateOut_Json',
                        data: {
                            HInterID: this.hform.HInterID,
                            HBillNo: this.hform.HBillNo,
                            HBillType: this.hform.HBillType,
                            HSourceBillNo: HBarCode,
                            HSourceBillType: this.hform.HMainSourceBillType,
                            HMaker: this.hform.HMaker,
                            HStockOrgID: this.hform.HStockOrgID,
                            HFIFOWHID: this.hform.HFIFOWHID,
                            HPTQty: this.hform.HPTQty || 0,
                            HPlanMode: this.hform.HPlanMode || 0
                        },
                        success: (res) => {
                            if (res.data.count == 1) {
                                var data = res.data.data
                                console.log(2, data);
                                this.hform.HSupName = data.hSupNameField
                                this.hform.HSupID = data.hSupIDField
                                if (data.hDeptIDField != 0) {
                                    this.hform.HDeptID = data.hDeptIDField
                                    this.hform.HDeptName = data.hDeptNameField
                                }
                                this.hform.HSourceBillNo = data.hSourceBillNoField
                                this.showHMainSourceBillType = false
                                if (data.hMulSourceFlagField == 0) {
                                    this.showHSourceBillNo = false
                                }
                                this.tabs = 2
                                this.showHSupName = false
                                this.barCodeFocus = true
                                this.playSound(1)
                                this.DisBillEntryList()
                                resolve()
                            } else {
                                this.playSound(0)
                                this.refreshHSourceBillState()
                                uni.showToast({
                                    title: res.data.Message,
                                    icon: 'none'
                                })
                                reject()
                            }
                        },
                        fail: (res) => {
                            this.playSound(0)
                            this.refreshHSourceBillState()
                            console.log(res);
                            uni.showToast({
                                title: '接口请求失败',
                                icon: 'none'
                            })
                            reject()
                        },
                    });
                })
            },
            //扫条码处理
            getCode(HBarCode) {