瀏覽代碼

修复招标分类,根据detail 字段分类错误,detail 含有 合同金额等字段,同意分类成 其他-合同

wcc 2 年之前
父節點
當前提交
1a2883d740
共有 2 個文件被更改,包括 56 次插入14 次删除
  1. 17 11
      src/task/task.go
  2. 39 3
      src/task/updatetask.go

+ 17 - 11
src/task/task.go

@@ -90,7 +90,7 @@ type TTask struct {
 	S_attr             string   //标识属性key值
 	AttrVal            int      //标识属性val值
 	S_coll             string   //查询、存储表
-	LastId             string
+	LastId             string   //上次定时任务的结束id
 	Lock               sync.Mutex
 	S_query            string                    //任务查询条件
 	FlagQuit           chan bool                 //任务结束控制
@@ -141,9 +141,9 @@ func InitTaskData(_id string) {
 	s_starttime := int64(0)
 	s_asfield := ""
 	if b_updaterule, ok := (*taskData)["b_updaterule"].(bool); ok {
-		task.B_UpdateRule = b_updaterule
+		task.B_UpdateRule = b_updaterule //更新任务下的规则
 	}
-	if (*taskData)["s_querycon"] != nil {
+	if (*taskData)["s_querycon"] != nil { //
 		s_querycon = util.ObjToString((*taskData)["s_querycon"])
 	}
 	if (*taskData)["s_starttime"] != nil {
@@ -194,7 +194,8 @@ func InitTaskData(_id string) {
 	}
 	task.AttrVal = flagAttrVal
 
-	for _, v := range tools.Config { //联表查询初始化mgo,线上只有行业分类用到;跑历史招标、行业分类的时候也用到两边查询
+	//联表查询初始化mgo,线上只有行业分类用到;跑历史招标、行业分类的时候也用到两边查询
+	for _, v := range tools.Config {
 		if m, ok := v.(map[string]interface{}); ok {
 			if m["taskid"] == task.ID {
 				if m["mgoaddr"] != nil && m["db"] != nil && m["coll"] != nil {
@@ -232,10 +233,11 @@ func InitTaskData(_id string) {
 		task.Task_QueryFieldMap[f] = 1
 		task.Task_QueryFieldArr = append(task.Task_QueryFieldArr, f)
 	}
+	//初始化任务下所有的分类和规则
 	InitClassAndRuleData(_id, task)
 }
 
-//初始化任务下所有的分类和规则
+//InitClassAndRuleData 初始化任务下所有的分类和规则
 func InitClassAndRuleData(_id string, task *TTask) {
 	defer tools.Catch()
 	classIdStr := task.S_class
@@ -245,7 +247,8 @@ func InitClassAndRuleData(_id string, task *TTask) {
 		for _, classid := range classIdArr {
 			classData, _ := tools.MgoClass.FindById(tools.COLL_CLASS, classid, nil)
 			if classData != nil {
-				class := &Class{ //初始化Class
+				//初始化Class
+				class := &Class{
 					//Rule:          CidRuleMap[classid],
 					Cid:           classid,
 					Class_PreRule: util.ObjToString((*classData)["s_class_prerule"]),
@@ -499,9 +502,10 @@ OVER:
 			tt = nil
 			break OVER
 		case <-first: //第一次执行控制
-			if tools.ControlTaskRun { //任务流程控制
+			if tools.ControlTaskRun { //任务流程控制,现有模式用不到,默认false
 				tools.AllTaskFinish = false
 			}
+			log.Println("第一次执行任务:", tt.S_name)
 			newtaskrun(tt)
 		case <-time.Tick(time.Duration(tt.I_rate) * time.Second): //任务定时控制
 			//执行定时任务前,检查任务是否更新了rule
@@ -528,14 +532,14 @@ func newtaskrun(tt *TTask) {
 	NewTaskRunAll(tt, false, nil)
 }
 
-//常规任务和udp非合并数据处理方法
+//NewTaskRunAll 常规任务和udp非合并数据处理方法
 func NewTaskRunAll(tt *TTask, budp bool, mapInfo map[string]interface{}) int {
 	total := 0
 	tools.Try(func() { //不加这一层defer运行不了!!!
 		timespan := false //时间间隔(控制数据条数打印)
 		tt.B_Running = true
 		defer func() {
-			//业主分类执行完修改AllTaskFinish状态
+			//业主分类执行完修改AllTaskFinish状态;控制流程的任务id(整个分类流程业主分类结尾,以此为标记)
 			if tt.ID == tools.ControlLastTaskId {
 				tools.AllTaskFinish = true
 			}
@@ -580,7 +584,7 @@ func NewTaskRunAll(tt *TTask, budp bool, mapInfo map[string]interface{}) int {
 				json.Unmarshal([]byte(strings.Replace(tt.S_query, "'", "\"", -1)), &q)
 			}
 			idcoll := tt.S_idcoll
-			if idcoll != "" { //idcoll中查询id区间
+			if idcoll != "" { //idcoll中查询id区间,bidding_processing_ids
 				nextNodeSid, nextNodeEid = FindId(idcoll) //查询id段
 				if nextNodeSid != "" && nextNodeEid != "" && nextNodeSid <= nextNodeEid {
 					q["_id"] = bson.M{
@@ -1267,7 +1271,9 @@ func NewLoadTestTask(_id, s_mgourl, s_mgodb, s_coll, i_poolsize, s_startid, s_en
 //加载任务
 func NewLoadTask(_id string, res *tools.JSON) {
 	defer tools.Catch()
-	InitTaskData(_id) //初始化任务信息
+	//初始化任务信息
+	InitTaskData(_id)
+	//初始化任务mgo配置信息
 	bres, tt, msg := NewAnalyTask(_id, "", "", "", 5)
 	tt.I_status = 1
 	log.Println(tt.S_mgodb, tt.S_name, tt.I_thread)

+ 39 - 3
src/task/updatetask.go

@@ -159,7 +159,7 @@ func maptoarr(datamap map[string]interface{}) (dataarr []string) {
 	return dataarr
 }
 
-//共用加载任务
+//NewAnalyTask 初始化任务mgo配置信息,共用加载任务
 func NewAnalyTask(_id, s_mgourl, s_mgodb, s_coll string, i_poolsize int) (res bool, task *TTask, msg string) {
 	defer tools.Catch()
 	task = TaskMap[_id] //从加载好的任务集合中取单个任务
@@ -209,14 +209,20 @@ func NewAnalyTask(_id, s_mgourl, s_mgodb, s_coll string, i_poolsize int) (res bo
 	return
 }
 
-//共用识别过程
+//NewClassificationRun 共用识别过程
 func NewClassificationRun(tt *TTask, tmp map[string]interface{}) *tools.SortMap {
 	SMap := tools.NewSortMap()
 	//tmpSavefield := map[string]interface{}{}
 	fflag := map[string][]string{} //标志父类从属关系
 	rulval := map[string]string{}  //存储过滤记录
 	class := tt.Class              //获取任务中的多个分类
+
 	if class != nil && len(class) > 0 {
+		/**
+		一级分类匹配到title,二级标题分类成功匹配到招标或者竞谈,并且detail中含有合同金额等其他字段,
+		那么二级分类应该数据合同,一级分类应该数据其他
+		*/
+		var other bool
 		for _, c := range class {
 			//预处理lua
 			s_fields := c.S_fields                              //识别字段  o_jy.a_key.key  detail,title
@@ -251,7 +257,7 @@ func NewClassificationRun(tt *TTask, tmp map[string]interface{}) *tools.SortMap
 			cid := c.Cid     //类id
 			s_pid := c.S_pid //父类id
 			//s_fields := c.S_fields     //识别字段
-			savefield := c.S_savefield //保存字段
+			savefield := c.S_savefield //保存字段,toptype
 			// if tt.I_multiclass == 0 {  //单分类临时记录保存字段
 			// 	tmpSavefield[savefield] = ""
 			// }
@@ -281,6 +287,7 @@ func NewClassificationRun(tt *TTask, tmp map[string]interface{}) *tools.SortMap
 						continue
 					}
 					for _, r := range rule {
+
 						if s_pid != "" { //只要此类的父类不为空
 							ru_s_pid := r.S_pid                      //当前规则的父规则id
 							class_s_pid := strings.Split(s_pid, ",") //当前规则所属类的父类集合
@@ -332,6 +339,30 @@ func NewClassificationRun(tt *TTask, tmp map[string]interface{}) *tools.SortMap
 								}
 								break L
 							}
+
+							//一级分类是招标,二级分类匹配到招标
+							if f == "title" && other && savefield == "subtype" {
+								if (r.S_name == "招标" || r.S_name == "竞谈") && len(r.DetailReg) > 0 { //title、channel二级分类中标处理
+									detail := util.ObjToString(tmp["detail"])
+									if len(r.NotReg) > 0 { //排除规则
+										dnrb, _ := DFAAnalyRules(detail, r.NotReg)
+										if dnrb { //排除规则匹配成功,匹配下一条
+											continue
+										}
+									}
+									//util.Debug("detail---", detail)
+									drb, _ := DFAAnalyRules(detail, r.DetailReg)
+									//util.Debug("-----", drb)
+									if drb {
+										SMap.AddKey(savefield, "合同")
+										//SMap.RemoveKey("toptype")
+										SMap.AddKey("toptype", "其它")
+									}
+
+									break L
+								}
+							}
+
 							r_id := r.Rid
 							if fflag[cid] != nil {
 								arr1 := fflag[cid]
@@ -358,6 +389,11 @@ func NewClassificationRun(tt *TTask, tmp map[string]interface{}) *tools.SortMap
 								if tt.I_multiclass == 0 { //单分类
 									if tt.I_savetype == 1 { //存储属性
 										SMap.AddKey(savefield, s_name)
+										//通过一级分类title分类出,toptype= "招标"时,
+										//再次针对二级分类招标的title匹配配置的detail字段,出现合同金额应该属于其他
+										if savefield == "toptype" && f == "title" && s_name == "招标" {
+											other = true
+										}
 									} else {
 										SMap.AddKey(savefield, s_code)
 									}