1 2 hafta önce
ebeveyn
işleme
ab80b938f1
2 değiştirilmiş dosya ile 176 ekleme ve 0 silme
  1. 22 0
      common/utils.go
  2. 154 0
      task/task.go

+ 22 - 0
common/utils.go

@@ -178,3 +178,25 @@ func MapToStruct(source interface{}, target interface{}) error {
 	}
 	return nil
 }
+
+// CancelLeftTasks 撤销其他的任务,避免一直发验证码导致超限,仅新版登录使用
+func CancelLeftTasks(tel string) {
+	c := lxhttp.NewHttpClient()
+	lxhttp.POSTJson(c, variable.TaxTaskURL+"/api/v1/stopQueue", map[string]string{"tel": tel}, nil)
+}
+
+// GetTelTaskStatus 如果有任务正在进行 返回 true
+func GetTelTaskStatus(tel string) (bool, error) {
+	c := lxhttp.NewHttpClient()
+	bys, err := lxhttp.POSTJson(c, `https://task.listensoft.net/api/v1/other/telTaskDoi`, map[string]string{
+		"tel": tel,
+	}, nil)
+	if err != nil {
+		return false, err
+	}
+	if gjson.GetBytes(bys, `data.res`).Bool() {
+		return true, nil
+	} else {
+		return false, nil
+	}
+}

+ 154 - 0
task/task.go

@@ -233,3 +233,157 @@ func CheckSubjectCodesError(midSubjects []models.HisSubject, Vouchers []models.H
 	}
 	return true, ""
 }
+
+func Unlocking(start time.Time, tasks []models.TaxTask) {
+	reqs := []string{}
+	for _, v := range tasks {
+		reqs = append(reqs, strings.Split(v.ReqNo, "&")...)
+	}
+	req := strings.Join(reqs, "*")
+	UnTels := make(map[string]bool, 1000)
+	if len(tasks) < 1 {
+		return
+	}
+	//工商的任务不在这里解锁了(避免影响到这个手机号下的税局申报任务,因为如果不加锁的话120秒是可能不够工商申报的,并发的话税局任务会一直挂掉)
+	//如果想要工商任务快一点(客户嫌慢的话),工商任务拿到的时候自己加锁,加锁时长要大于等待验证码的时间(确保收到验证码后解锁 解的是自己加的锁),然后收到验证码的时候解锁
+	for _, task := range tasks {
+		if task.TaskName == variable.TaxCjGsnb || task.TaskName == variable.TaxSbGsnb {
+			return
+		}
+	}
+	// 采集pdf除外 因为超了20分钟就不解锁了 pdf统一上锁3600
+	if (tasks[0].Address == "jiangsu" || tasks[0].Address == "henan") && tasks[0].TaskName != variable.TaxCjInvoicePdf { //&& (tasks[0].LoginType == "政务网登录" || tasks[0].LoginType == "免验证码登录")
+		checkPass := true
+		info, _ := GetEacComInfo(tasks[0])
+		if info.Dlfs == "新版登录" && strings.Contains(tasks[0].Result.BusinessLog, "验证码接收失败") {
+			logger.Info("结束该手机号剩余任务:" + info.Tel)
+			common.CancelLeftTasks(info.Tel)
+		}
+		for _, task := range tasks {
+			if strings.Contains(task.Result.BusinessLog, "超限") { //strings.Contains(task.Result.BusinessLog, "锁定") ||
+				checkPass = false
+			}
+		}
+		if tasks[0].Address == "henan" && checkPass {
+			if !time.Now().After(start.Add(12 * time.Minute)) { //不超过7分钟的解锁
+				tel := strings.Split(tasks[0].Tel, `#`)[0]
+				if time.Since(start).Seconds() < 45 {
+					itv := common.FloatToIntStr((45 - time.Since(start).Seconds()) / 1)
+					logger.Info("加锁:" + tel + " " + itv)
+					common.AddTelLockerX2(tel, itv)
+					return
+				}
+				logger.Info("解锁:" + tel)
+				common.AddTelLockerX2Req(tel, "-1", req)
+			} else if tasks[0].TaskName == variable.TaxCjInvoicePdf { //pdf的任务,如果没有任务在执行也解锁
+				tel := strings.Split(tasks[0].Tel, `#`)[0]
+				status, err := common.GetTelTaskStatus(tel)
+				if err != nil {
+					logger.Info("获取手机号任务状态失败")
+					return
+				}
+				if !status {
+					logger.Info("解锁:" + tel)
+					common.AddTelLockerX2Req(tel, "-1", req)
+				}
+				return
+			}
+
+		}
+		if tasks[0].Address == "jiangsu" && !time.Now().After(start.Add(18*time.Minute)) && checkPass {
+			tel := strings.Split(tasks[0].Tel, `#`)[0]
+			if time.Since(start).Seconds() < 45 {
+				itv := common.FloatToIntStr((45 - time.Since(start).Seconds()) / 1)
+				logger.Info("加锁:" + tel + " " + itv)
+				common.AddTelLockerX2(tel, itv)
+				return
+			}
+			logger.Info("解锁:" + tel)
+			common.AddTelLockerX2Req(tel, "-1", req)
+		}
+		return
+	}
+	for _, task := range tasks {
+		info, _ := GetEacComInfo(task)
+		//address := info.Area
+		// 新版登录 收不到验证码撤销掉剩余的任务,避免一直发导致超限
+		if info.Dlfs == "新版登录" && strings.Contains(task.Result.BusinessLog, "验证码接收失败") {
+			logger.Info("结束该手机号剩余任务:" + info.Tel)
+			common.CancelLeftTasks(info.Tel)
+		}
+		//
+		{
+
+			//// 新版=统一解锁
+			//if (info.Dlfs == "新版登录" || info.Dlfs == "代理登录") && info.Tel != "" && !(strings.Contains(task.Result.BusinessLog, "超限") || strings.Contains(task.Result.BusinessLog, "发送短信过于频繁")) {
+			//	if !UnTels[info.Tel] {
+			//		UnTels[info.Tel] = true
+			//	}
+			//}
+			//// zrridno统一解锁
+			//if address == Hebei || address == Hainan || address == Yunnan || address == Shandong || address == Beijing || address == Xizang || address == "zhejiang" || address == "guangdong" || address == "jilin" {
+			//	if info.Dlfs == "新版登录" {
+			//		if !UnTels[info.Tel] {
+			//			UnTels[info.Tel] = true
+			//		}
+			//	} else {
+			//		if !UnTels[info.Zzridno] {
+			//			UnTels[info.Zzridno] = true
+			//		}
+			//	}
+			//}
+			//// zrrxm解锁
+			//if address == "ningxia" {
+			//	if !UnTels[info.Zzrxm] {
+			//		UnTels[info.Zzrxm] = true
+			//	}
+			//}
+			//// 所有登陆方式都需要解锁的地区
+			//if address == Shanxi || address == Jiangxi || address == Guangxi || address == Neimenggu || address == Xinjiang || address == Shenzhen || address == Henan || address == Anhui || address == Shaanxi || address == Hunan || address == Qingdao || address == Sichuan || address == Guizhou || address == Gansu || address == Dalian {
+			//	if !UnTels[info.Tel] {
+			//		UnTels[info.Tel] = true
+			//	}
+			//}
+			////if (address == "tianjin" || address == "guangdong" || address == "zhejiang" || address == "hubei") && info.Dlfs == "新版登录" {
+			////	if !UnTels[info.Zzridno+"_"+info.Area] {
+			////		UnTels[info.Zzridno+"_"+info.Area] = true
+			////	}
+			////}
+			//// 针对发送超限
+			//if strings.Contains(task.Result.BusinessLog, "超限") || strings.Contains(task.Result.BusinessLog, "发送短信过于频繁") {
+			//	common.AddTelLockerX2(info.Tel, "600")
+			//}
+			//// 针对新疆
+			//if strings.Contains(task.Result.BusinessLog, "因上条短信验证码未正常使用,无法重新获取验证码,请您在5分钟后上条短信失效后") {
+			//	common.AddTelLockerX2(info.Tel, "300")
+			//}
+		}
+		// 现在直接用手机号解锁,因为不管用什么加锁都会加到tel字段上
+		if info.Tel != "" {
+			UnTels[info.Tel] = true
+		}
+		// 频繁加锁
+		if strings.Contains(task.Result.BusinessLog, "短信发送申请过于频繁") || strings.Contains(task.Result.BusinessLog, "超限") || strings.Contains(task.Result.BusinessLog, "发送短信过于频繁") || strings.Contains(task.Result.BusinessLog, "因上条短信验证码未正常使用,无法重新获取验证码,请您在5分钟后上条短信失效后") {
+			UnTels[info.Tel] = false
+			common.AddTelLockerX2(info.Tel, "300") // 直接覆盖一个5分钟的锁
+		}
+	}
+	for k := range UnTels {
+		haspdf := false
+		for _, v := range tasks {
+			if v.TaskName == variable.TaxCjInvoicePdf {
+				haspdf = true
+				break
+			}
+		}
+		if time.Since(start).Seconds() < 1195 || haspdf {
+			logger.Info("开始时间:", start.Format("2006-01-02 15:04:05"), ";结束时间:", time.Now().Format("2006-01-02 15:04:05"), ";任务时长:", time.Since(start).Seconds())
+			logger.Info("解锁:" + k)
+			common.AddTelLockerX2Req(k, "-1", req)
+		}
+		//if strings.Contains(k, "anhui") {
+		//	logger.Info("安徽暂时全解锁:" + k)
+		//	common.AddTelLockerX2Req(k, "-1", req)
+		//}
+	}
+}