From fe0c445884a7ba606a6930e493dd81705dfad607 Mon Sep 17 00:00:00 2001
From: chenhaozhe <cgz@hz-kingdee.com>
Date: 星期二, 02 九月 2025 11:12:53 +0800
Subject: [PATCH] 修复 foreach循环 发送请求时,可能会导致死锁的问题,切换成for...of 加 同步请求

---
 components/BillListPopup/BillListPopup.vue |  468 +++++++++++++++++++++++++++++++--------------------------
 1 files changed, 255 insertions(+), 213 deletions(-)

diff --git a/components/BillListPopup/BillListPopup.vue b/components/BillListPopup/BillListPopup.vue
index e5aa0c9..591e71e 100644
--- a/components/BillListPopup/BillListPopup.vue
+++ b/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">鐗╂枡浠g爜: </view>
-								<view class="right">{{bill['鐗╂枡浠g爜']}}</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">鐗╂枡浠g爜: </view>
+                                <view class="right">{{bill['鐗╂枡浠g爜']}}</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>
\ No newline at end of file

--
Gitblit v1.9.1