Bläddra i källkod

fix:数据导出条数查询优化

duxin 1 år sedan
förälder
incheckning
2ed8e7de7e
1 ändrade filer med 46 tillägg och 24 borttagningar
  1. 46 24
      common/src/qfw/util/dataexport/dataexport.go

+ 46 - 24
common/src/qfw/util/dataexport/dataexport.go

@@ -653,32 +653,54 @@ func GetDataExportSelectReallyCountFromMongo(bid mg.MongodbSim, biddingName stri
 	if ids == nil || len(ids) == 0 {
 		return 0
 	}
-	var queryIds []interface{}
-	for _, idStr := range ids {
-		queryIds = append(queryIds, mg.StringTOBsonId(idStr))
-	}
-	lenNum := int64(len(ids))
-	num1, err1 := sess.DB(biddingName).C("bidding").Find(map[string]interface{}{"_id": map[string]interface{}{
-		"$in": queryIds,
-	}}).Count()
-	if err1 == nil {
-		if num1 == lenNum {
-			return lenNum
-		}
-		num2, err2 := sess.DB(biddingName).C("bidding_back").Find(map[string]interface{}{"_id": map[string]interface{}{
-			"$in": queryIds,
-		}}).Count()
-		if err2 == nil {
-			if num2+num1 == lenNum {
-				return lenNum
-			} else if num1+num2 > lenNum {
-				return lenNum
-			} else if num1+num2 < lenNum {
-				return num1 + num2
+
+	var (
+		count int64
+		lock  sync.Mutex
+	)
+	pool := make(chan bool, 10)
+	wait := &sync.WaitGroup{}
+
+	for _, i2 := range SplitArray(ids, 200) {
+		pool <- true
+		wait.Add(1)
+		go func(arr []string) {
+			defer func() {
+				wait.Done()
+				<-pool
+			}()
+			lenNum := int64(len(arr))
+			var (
+				queryIds   []interface{}
+				num1, num2 int64
+				err        error
+			)
+			for _, idStr := range arr {
+				queryIds = append(queryIds, mg.StringTOBsonId(idStr))
 			}
-		}
+			num1, err = sess.DB(biddingName).C("bidding").Find(map[string]interface{}{"_id": map[string]interface{}{
+				"$in": queryIds,
+			}}).Count()
+			if err == nil {
+				if num1 == lenNum {
+					lock.Lock()
+					count += num1
+					lock.Unlock()
+					return
+				}
+				num2, err = sess.DB(biddingName).C("bidding_back").Find(map[string]interface{}{"_id": map[string]interface{}{
+					"$in": queryIds,
+				}}).Count()
+				if err == nil {
+					lock.Lock()
+					count += qutil.If(num2+num1 >= lenNum, lenNum, num2+num1).(int64)
+					lock.Unlock()
+				}
+			}
+		}(i2)
 	}
-	return -2
+	wait.Wait()
+	return qutil.If(count > 0, count, -2).(int64)
 }
 
 func GetDataExportSelectResultFromEs(bidding mg.MongodbSim, biddingName string, scd *SieveCondition, dataType string, checkCount int) (*[]map[string]interface{}, error) {