Răsfoiți Sursa

修复端子匹配bug

liling 1 an în urmă
părinte
comite
94cdf823d9

+ 14 - 6
service/models/bo/check_sysmodel_ied_func.go

@@ -3,6 +3,7 @@ package bo
 import (
 	"errors"
 	"fmt"
+	"regexp"
 	"scd_check_tools/logger"
 	"scd_check_tools/models/enum"
 	"scd_check_tools/tools"
@@ -282,12 +283,15 @@ func (c *SysCheckModelIedFuncMgr) Imp(param map[string]interface{}) (bool, error
 	}
 	modelInfoIedTypes := map[string][]string{} //"," + tools.IsEmpty(modelInfo.IedTypes) + ","
 	for _, t := range strings.Split(tools.IsEmpty(modelInfo.IedTypes), ",") {
-		t1 := strings.Split(t, "-")[0] //装置编码是否有套别
-		if modelInfoIedTypes[t1] == nil {
-			modelInfoIedTypes[t1] = []string{t}
-		} else {
-			modelInfoIedTypes[t1] = append(modelInfoIedTypes[t1], t)
-		}
+		/*
+			t1 := strings.Split(t, "-")[0] //装置编码是否有套别
+			if modelInfoIedTypes[t1] == nil {
+				modelInfoIedTypes[t1] = []string{t}
+			} else {
+				modelInfoIedTypes[t1] = append(modelInfoIedTypes[t1], t)
+			}
+		*/
+		modelInfoIedTypes[t] = []string{t}
 	}
 	i := 2
 	func_id := 0
@@ -320,6 +324,10 @@ func (c *SysCheckModelIedFuncMgr) Imp(param map[string]interface{}) (bool, error
 		if fcda_match_exp == "" {
 			return false, errors.New(fmt.Sprintf("第%d行:端子关键词不能为空", i))
 		}
+		_, err2 := regexp.Compile(fcda_match_exp)
+		if err2 != nil {
+			return false, errors.New(fmt.Sprintf("第%d行:端子关键词%s格式有错误", i, fcda_match_exp))
+		}
 		svorgoose := row[6]
 		if svorgoose == "" {
 			return false, errors.New(fmt.Sprintf("第%d行:信号类型不能为空", i))

+ 74 - 22
service/models/bo/checktools_area.go

@@ -910,7 +910,17 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
 		}
 		//获取该间隔下该类型的装置
 		s1 := []orm.Params{}
-		_, err = db.Raw("select ied_name,ied_no from t_data_check_area_ied where area_id=?", area_id).Values(&s1)
+		_, err = db.Raw("select ied_name,ied_no,'' ied_desc from t_data_check_area_ied where area_id=?", area_id).Values(&s1)
+		for pos, sr := range s1 {
+			iedname := tools.IsEmpty(sr["ied_name"])
+			iedObj := scdNodeMgr.GetIed(scdXmlObj, scdidStr, iedname)
+			iedObjDesc := ""
+			if iedObj != nil {
+				iedObjDesc = iedObj.Desc
+			}
+			s1[pos]["ied_desc"] = iedObjDesc
+		}
+		iedExtrefIsExistMap := map[string]int{} //确认已存在的装置端子
 		typeMappingMgr := new(SysCheckModelIedtypeMappingMgr)
 		pmCode := c.getIedTypeCode(modelid, "PM")
 		//循环处理关联关系
@@ -926,6 +936,28 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
 			ied_type, vol := getIedTypeAndVolCode(ied_type)
 			isReceivePm := strings.HasPrefix(ied_type, pmCode) //接收装置是Pm装置
 			iedlst := filterAreaIeds(ied_type, vol, s1, abCode, isReceivePm)
+			if strings.Index(ts[0], "#0") > 0 {
+				//本体装置
+				btIed := []orm.Params{}
+				for _, r := range iedlst {
+					ieddesc := tools.IsEmpty(r["ied_desc"])
+					if strings.Contains(ieddesc, "本休") {
+						btIed = append(btIed, r)
+					}
+				}
+				iedlst = btIed
+			}
+			if strings.Index(ts[0], "#C") > 0 {
+				//差动装置
+				btIed := []orm.Params{}
+				for _, r := range iedlst {
+					ieddesc := tools.IsEmpty(r["ied_desc"])
+					if strings.Contains(ieddesc, "差动") {
+						btIed = append(btIed, r)
+					}
+				}
+				iedlst = btIed
+			}
 			logger.Logger.Debug(fmt.Sprintf("装置类型%s#%s与%s的装置(%+v)端子关系", ied_type, vol, ts[1], iedlst))
 			//从间隔中获取当前信号输出装置
 			outiedlist := map[string]orm.Params{}
@@ -939,7 +971,16 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
 			outiedlist2 := filterAreaIeds(from_ied_type, vol2, s1, fromAbCode, isOutPm)
 			for _, iedrow := range outiedlist2 {
 				iedname := tools.IsEmpty(iedrow["ied_name"])
-				outiedlist[iedname] = iedrow
+				desc := tools.IsEmpty(iedrow["ied_desc"])
+				if strings.Index(fromiedcode, "#0") > 0 && strings.Contains(desc, "本休") {
+					//本体装置
+					outiedlist[iedname] = iedrow
+				} else if strings.Index(fromiedcode, "#C") > 0 && strings.Contains(desc, "差动") {
+					//差动装置
+					outiedlist[iedname] = iedrow
+				} else {
+					outiedlist[iedname] = iedrow
+				}
 			}
 			if len(outiedlist) == 0 {
 				logger.Logger.Debug(fmt.Sprintf("装置类型%s#%s%s未从类型%s%s的任何电压等级%s装置接收信号", ied_type, vol, abCode, from_ied_type, fromAbCode, vol2))
@@ -950,10 +991,8 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
 			for _, ied := range iedlst {
 				iedname := tools.IsEmpty(ied["ied_name"])
 				iedObj := scdNodeMgr.GetIed(scdXmlObj, scdidStr, iedname)
-				iedObjDesc := ""
-				if iedObj != nil {
-					iedObjDesc = iedObj.Desc
-				} else {
+				iedObjDesc := tools.IsEmpty(ied["ied_desc"])
+				if iedObjDesc == "" {
 					logger.Logger.Error(fmt.Sprintf("信号接收装置%s未找到!", iedname))
 					continue
 				}
@@ -978,6 +1017,13 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
 					if iedname == outiedname {
 						continue
 					}
+					//从装置所有的输入端子中过滤出当前输入装置的部分端子
+					extreflist2 := map[string]*node_attr.NExtRef{}
+					for desc, item := range extreflist {
+						if item.IedName == outiedname {
+							extreflist2[desc] = item
+						}
+					}
 					logger.Logger.Debug(fmt.Sprintf("正在匹配装置%s与%s的端子关联关系", iedname, outiedname))
 					outIedObj := scdNodeMgr.GetIed(scdXmlObj, scdidStr, outiedname)
 					outIedObjDesc := ""
@@ -990,11 +1036,6 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
 						continue
 					}
 					//outiedFcdaList := getIedFcdas(outiedname) //输入装置的信号输出端子
-					//是否设置的端子编号
-					noText := tools.IsEmpty(ied["ied_no"])
-					if noText == "" {
-						noText = tools.IsEmpty(outied["ied_no"])
-					}
 					//检查是否有错误和缺失的端子
 					for _, r := range refrow {
 						extref_name := tools.IsEmpty(r["to_fcda_name"])
@@ -1004,17 +1045,17 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
 						funcName := tools.IsEmpty(r["to_func_name"])
 						//端子编号处理
 						if strings.Index(extref_name_exp, "{no}") > -1 {
-							extref_name_exp = strings.ReplaceAll(extref_name_exp, "{no}", noText)
+							extref_name_exp = strings.ReplaceAll(extref_name_exp, "{no}", tools.IsEmpty(ied["ied_no"]))
 						}
 						if strings.Index(fcda_name_exp, "{no}") > -1 {
-							fcda_name_exp = strings.ReplaceAll(fcda_name_exp, "{no}", noText)
+							fcda_name_exp = strings.ReplaceAll(fcda_name_exp, "{no}", tools.IsEmpty(outied["ied_no"]))
 						}
 
 						funcExist := false //判断接收端设计的端子是否存在
 						extrefObj := new(node_attr.NExtRef)
 						fcda2Exist := false
 						isYx := false
-						for desc, item := range extreflist {
+						for desc, item := range extreflist2 {
 							if item.IedName != outiedname {
 								continue
 							}
@@ -1092,7 +1133,7 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
 								}
 								macthResult, _ := tools.RexGroupTestMatch(fcda_name_exp, fcda_name)
 								if !macthResult {
-									parse_result := fmt.Sprintf("间隔%s的装置%s端子%s与装置%s端子%s关联错误", area_name, iedname, extref_name, outiedname, fcda_name)
+									parse_result := fmt.Sprintf("间隔%s的装置%s端子%s与装置%s端子%s关联错误.匹配模式:%s", area_name, iedname, extref_name, outiedname, fcda_name, fcda_name_exp)
 									re := map[string]interface{}{"scdid": c.ScdId, "lineno": 0, "ruleid": area_ruleid, "nodeid": 0, "parse_result": parse_result,
 										"ied_name":      iedname,
 										"ied_desc":      iedObj.Desc,
@@ -1110,12 +1151,12 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
 							}
 						}
 						if !funcExist {
-							parse_result := fmt.Sprintf("间隔%s的装置%s缺失端子%s", area_name, iedname, extref_name)
+							parse_result := fmt.Sprintf("间隔%s的装置%s缺失与装置%s的端子%s定义.匹配模式:%s", area_name, iedname, outiedname, extref_name, extref_name_exp)
 							re := map[string]interface{}{"scdid": c.ScdId, "lineno": 0, "ruleid": area_ruleid, "nodeid": 0, "parse_result": parse_result,
 								"ied_name":      iedname,
 								"ied_desc":      iedObjDesc,
-								"out_ied_name":  "",
-								"out_ied_desc":  "",
+								"out_ied_name":  outiedname,
+								"out_ied_desc":  outIedObjDesc,
 								"fcda_desc":     extref_name,
 								"fcda_addr":     "",
 								"out_fcda_desc": "",
@@ -1126,7 +1167,7 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
 							scdNodeRule.AppendFcdaCheckResult(re)
 						} else if !fcda2Exist {
 							//fcda2Exist为false表示实际的端子from ied不是当前设计的ied
-							parse_result := fmt.Sprintf("间隔%s下%s的输入装置%s缺失端子%s", area_name, iedname, outiedname, fcda_name)
+							parse_result := fmt.Sprintf("间隔%s下%s的输入装置%s缺失端子%s.匹配模式:%s", area_name, iedname, outiedname, fcda_name, fcda_name_exp)
 							re := map[string]interface{}{"scdid": c.ScdId, "lineno": 0, "ruleid": area_ruleid, "nodeid": 0, "parse_result": parse_result,
 								"ied_name":      iedname,
 								"ied_desc":      iedObjDesc,
@@ -1143,24 +1184,35 @@ func (c *CheckAreaMgr) CheckIedFcda() error {
 						}
 					}
 					//检查是否有多余(SCD中有不存在于设计中)的端子
-					for extrefdesc, r := range extreflist { //scd中的端子关系
+					for extrefdesc, r := range extreflist2 { //scd中的端子关系
 						//判断是否是当前输入装置和遥信端子
 						if r.IedName != outiedname || yxAddrMap[fmt.Sprintf("%s%s%s%s%s%s%s", r.IedName, r.IntAddr, r.LdInst, r.Prefix, r.LnClass, r.LnInst, r.DoName)] == 1 {
 							continue
 						}
+						key := fmt.Sprintf("%s%s", iedname, extrefdesc)
+						if iedExtrefIsExistMap[key] == 1 {
+							continue
+						}
 						extref_name := ""
 						fcda_name := ""
 						isHave := false
 						for _, r1 := range refrow { //设计的端子关系
 							extref_name_exp := tools.IsEmpty(r1["to_fcda_match_exp"])
+							if extrefdesc == extref_name_exp {
+								//端子存在
+								isHave = true
+								iedExtrefIsExistMap[key] = 1
+								break
+							}
 							//端子编号处理
 							if strings.Index(extref_name_exp, "{no}") > -1 {
-								extref_name_exp = strings.ReplaceAll(extref_name_exp, "{no}", noText)
+								extref_name_exp = strings.ReplaceAll(extref_name_exp, "{no}", tools.IsEmpty(ied["ied_no"]))
 							}
 							macthResult, _ := tools.RexGroupTestMatch(extref_name_exp, extrefdesc)
-							if extrefdesc == extref_name_exp || macthResult {
+							if macthResult {
 								//端子存在
 								isHave = true
+								iedExtrefIsExistMap[key] = 1
 								break
 							}
 						}

+ 1 - 1
service/models/bo/task.go

@@ -398,7 +398,7 @@ func (c *TaskMgr) List(pageno, pagesize int) ([]orm.Params, int, error) {
 		sql += " and t.ct<=?"
 		sqlParamters = append(sqlParamters, c.Model.EndTime+" 23:59:59")
 	}
-	limit := fmt.Sprintf(" order by t.ct desc limit %d,%d", (pageno-1)*pagesize, pagesize)
+	limit := fmt.Sprintf(" order by t.ut desc,t.ct desc limit %d,%d", (pageno-1)*pagesize, pagesize)
 	r := []orm.Params{}
 	_, err := o.Raw(sql+limit, sqlParamters).Values(&r)
 	dblog.Description = fmt.Sprintf("SQL:%s 参数:%+v", sql+limit, sqlParamters)