Przeglądaj źródła

分布式抽取

zhangjinkun 6 lat temu
rodzic
commit
52976931a3

+ 2 - 1
src/config.json

@@ -1,12 +1,13 @@
 {
     "port": "9090",
     "mgodb": "192.168.3.207:27082",
-    "dbsize": 10,
+    "dbsize": 5,
     "dbname": "extract_v3",
     "redis": "buyer=192.168.3.18:6379,winner=192.168.3.18:6379",
     "saveresult": true,
     "fieldscore": true,
     "buyerwinner": false,
+    "qualityaudit": true,
     "udptaskid": "5be107e600746bf92debf080",
     "udpip": "127.0.0.1",
     "udpport": "1484",

+ 66 - 44
src/jy/admin/audit/dataaudit.go

@@ -6,6 +6,7 @@ import (
 	"log"
 	qu "qfw/util"
 	redis "qfw/util/redis"
+	"strconv"
 	"time"
 
 	"github.com/gin-gonic/gin"
@@ -14,18 +15,15 @@ import (
 func init() {
 	//列表、编辑
 	Admin.GET("/audit/dataaudit", func(c *gin.Context) {
-		c.HTML(200, "audit_dataaudit.html", nil)
-	})
-	Admin.GET("/audit/auditlist", func(c *gin.Context) {
 		name := c.Query("name")
+		//s_coll := c.Query("s_coll")
 		c.HTML(200, "audit_auditone.html", gin.H{"name": name})
 	})
-	Admin.POST("/audit/getauditdata", AuditData) //加载数据
 	Admin.POST("/audit/auditone", AuditOne)
 	Admin.POST("/audit/buyerclass", BuyerClass) //采购单位分类
 	Admin.POST("/audit/addsave", AddSave)       //新增
-	Admin.POST("/audit/del", Del)               //删除
-	Admin.POST("/audit/auditsave", AuditSave)   //审核
+	Admin.POST("/audit/auditsave", AuditSave)   //保存
+
 }
 
 func AuditData(c *gin.Context) {
@@ -50,12 +48,29 @@ func AuditData(c *gin.Context) {
 
 func AuditOne(c *gin.Context) {
 	name, _ := c.GetPostForm("name")
-	data, _ := Mgo.Find("audit", `{"s_field":"`+name+`"}`, `{"_id":-1}`, nil, false, -1, -1)
-	for _, d := range *data {
-		timeStr := time.Unix(d["l_intime"].(int64), 0).Format(Date_Short_Layout)
-		d["l_intime"] = timeStr
+	coll, _ := c.GetPostForm("s_coll")
+	source, _ := c.GetPostForm("source")
+	limitstr, _ := c.GetPostForm("length")
+	startstr, _ := c.GetPostForm("start")
+	start, _ := strconv.Atoi(startstr)
+	limit, _ := strconv.Atoi(limitstr)
+	query := make(map[string]interface{})
+	if source == "-1" { //外层
+		query = map[string]interface{}{
+			name + "_err": map[string]interface{}{
+				"$exists": true,
+			},
+			name + "_isaudit": false,
+		}
+		data, _ := Mgo.Find(coll, query, `{"_id":-1}`, nil, false, start, limit)
+		count := Mgo.Count(coll, query)
+		for _, d := range *data {
+			d["name"] = d[name]
+		}
+		c.JSON(200, gin.H{"data": data, "recordsFiltered": count, "recordsTotal": count})
+	} else { //分包
+		c.JSON(200, gin.H{"data": map[string]interface{}{}, "recordsFiltered": 0, "recordsTotal": 0})
 	}
-	c.JSON(200, gin.H{"data": data})
 }
 
 func BuyerClass(c *gin.Context) {
@@ -64,58 +79,65 @@ func BuyerClass(c *gin.Context) {
 }
 
 func AddSave(c *gin.Context) {
-	titlename, _ := c.GetPostForm("titlename")
+	field, _ := c.GetPostForm("field")
 	auditname, _ := c.GetPostForm("auditname")
 	parentclass, _ := c.GetPostForm("parentclass")
 	childclass, _ := c.GetPostForm("childclass")
 	update := make(map[string]interface{})
-	if titlename == "buyer" {
+	if field == "buyer" {
 		update["buyerclass"] = childclass
 		update["parentclass"] = parentclass
 	}
 	update["name"] = auditname
 	update["pici"] = time.Now().Unix()
 	update["s_source"] = "手动"
-	b := Mgo.Update(titlename, `{"name":"`+auditname+`"}`, map[string]interface{}{
+	b := Mgo.Update(field, `{"name":"`+auditname+`"}`, map[string]interface{}{
 		"$set": update}, true, false)
 	if b { //新增的直接更新buyer redis
-		p := redis.PutCKV(titlename, titlename+"_"+auditname, 1)
-		log.Println("Add--Update "+titlename+" redis:", p)
+		p := redis.PutCKV(field, field+"_"+auditname, 1)
+		log.Println("Add--Update "+field+" redis:", p)
 	}
 	c.JSON(200, gin.H{"rep": b})
 }
 
-func Del(c *gin.Context) {
-	_id, _ := c.GetPostForm("_id")
-	b := Mgo.Del("audit", `{"_id":"`+_id+`"}`)
-	if b {
-		c.JSON(200, gin.H{"rep": true})
-	} else {
-		c.JSON(200, gin.H{"rep": false})
-	}
-}
-
 func AuditSave(c *gin.Context) {
-	titlename, _ := c.GetPostForm("titlename")
+	field, _ := c.GetPostForm("field")
 	name, _ := c.GetPostForm("name")
 	_id, _ := c.GetPostForm("id")
-	parentclass, _ := c.GetPostForm("parentclass")
-	childclass, _ := c.GetPostForm("childclass")
+	coll, _ := c.GetPostForm("coll")
 	update := make(map[string]interface{})
-	if titlename == "buyer" {
-		update["buyerclass"] = childclass
-		update["parentclass"] = parentclass
-	}
-	update["name"] = name
-	update["pici"] = time.Now().Unix()
-	update["s_source"] = "抽取"
-	b := Mgo.Update(titlename, `{"name":"`+name+`"}`, map[string]interface{}{
-		"$set": update}, true, false)
-	//更新redis
-	if b {
-		p := redis.PutCKV(titlename, titlename+"_"+name, 1)
-		log.Println("Audit--Update "+titlename+" redis:", p)
-		Mgo.Del("audit", `{"_id":"`+_id+`"}`)
+	if field == "buyer" || field == "winner" { //更新buyer或winner库,并保存到redis
+		if field == "buyer" {
+			parentclass, _ := c.GetPostForm("parentclass")
+			childclass, _ := c.GetPostForm("childclass")
+			update["buyerclass"] = childclass
+			update["parentclass"] = parentclass
+		}
+		update["name"] = name
+		update["pici"] = time.Now().Unix()
+		update["s_source"] = "抽取"
+		//更新结果表数据
+		b1 := Mgo.UpdateById(coll, _id, map[string]interface{}{
+			"$set": map[string]interface{}{
+				field + "_isaudit": true,
+				field:              name,
+			},
+		})
+		//更新原有的winner或buyer库
+		b2 := Mgo.Update(field, `{"name":"`+name+`"}`, map[string]interface{}{
+			"$set": update}, true, false)
+		log.Println("Audit--Update "+field, b2)
+		//更新redis
+		p := redis.PutCKV(field, field+"_"+name, 1)
+		log.Println("Audit--Update "+field+" redis:", p)
+		c.JSON(200, gin.H{"rep": b1})
+	} else {
+		b3 := Mgo.UpdateById(coll, _id, map[string]interface{}{
+			"$set": map[string]interface{}{
+				field + "_isaudit": true,
+				field:              name,
+			},
+		})
+		c.JSON(200, gin.H{"rep": b3})
 	}
-	c.JSON(200, gin.H{"rep": b})
 }

+ 109 - 14
src/jy/admin/audit/rulemanager.go

@@ -5,6 +5,7 @@ import (
 	"html/template"
 	. "jy/admin"
 	. "jy/mongodbutil"
+	ju "jy/util"
 	qu "qfw/util"
 	"regexp"
 	"strings"
@@ -16,10 +17,20 @@ import (
 
 func init() {
 	//列表、编辑
-	Admin.GET("/audit/rulemanager", func(c *gin.Context) {
-		c.HTML(200, "audit_rulemanager.html", nil)
+	//识别字段
+	Admin.GET("/audit/recogfield", func(c *gin.Context) {
+		c.HTML(200, "audit_recogfield.html", nil)
 	})
-	Admin.POST("/rulemanager/getclass", GetClass)           //获取识别字段
+	Admin.POST("/rulemanager/getrecogfield", GetRecogField)   //新增识别字段
+	Admin.POST("/rulemanager/saverecogfield", SaveRecogField) //保存
+	Admin.POST("/rulemanager/delrecogfield", DelRecogField)   //删除
+	//class
+	Admin.GET("/rulemanager/getclasslist", func(c *gin.Context) {
+		fname := c.Query("fname")
+		fid := c.Query("id")
+		c.HTML(200, "audit_classlist.html", gin.H{"fname": fname, "fid": fid})
+	})
+	Admin.POST("/rulemanager/getclass", GetClass)           //获取分类
 	Admin.POST("/rulemanager/saveclass", SaveClass)         //保存
 	Admin.POST("/rulemanager/getauditfield", GetAuditField) //获取要审核的字段
 	Admin.POST("/rulemanager/delclass", DelClass)           //删除
@@ -28,6 +39,7 @@ func init() {
 	Admin.GET("/rulemanager/getrulelist", func(c *gin.Context) {
 		cid := c.Query("id")
 		cname := c.Query("cname")
+		fid := c.Query("fid")
 		class, _ := Mgo.FindById("rc_class", cid, `{"_id":1,"s_name":1,"s_pid":1}`)
 		//级联查询,往上查
 		if class != nil && *class != nil {
@@ -52,7 +64,7 @@ func init() {
 		}
 		data["rule"] = rule
 		data["class"] = class
-		c.HTML(200, "audit_rulelist.html", gin.H{"cid": cid, "cname": cname, "data": data})
+		c.HTML(200, "audit_rulelist.html", gin.H{"cid": cid, "cname": cname, "data": data, "fid": fid})
 	})
 	Admin.POST("/rulemanager/getrule", GetRule)         //获取规则
 	Admin.POST("/rulemanager/saverule", SaveRule)       //保存规则
@@ -62,8 +74,56 @@ func init() {
 	Admin.POST("/rulemanager/runruletest", RunRuleTest) //规则测试
 
 }
+func GetRecogField(c *gin.Context) {
+	data, _ := Mgo.Find("rc_field", `{"delete":false}`, `{"i_order":1}`, nil, false, -1, -1)
+	for _, d := range *data {
+		timeStr := time.Unix(d["l_lasttime"].(int64), 0).Format(Date_Short_Layout)
+		d["l_lasttime"] = timeStr
+	}
+	c.JSON(200, gin.H{"data": data})
+}
+
+func SaveRecogField(c *gin.Context) {
+	data := GetPostForm(c)
+	_id, _ := c.GetPostForm("_id")
+	session := sessions.Default(c)
+	if _id != "" {
+		Mgo.UpdateById("rc_field", _id, map[string]interface{}{"$set": data})
+		c.JSON(200, gin.H{"rep": true})
+	} else {
+		//s_class, _ := c.GetPostForm("s_class")
+		s_recogfield, _ := c.GetPostForm("s_recogfield")
+		d, _ := Mgo.FindOne("rc_field", `{"s_recogfield":"`+s_recogfield+`"}`)
+		if len(*d) > 0 {
+			c.JSON(200, gin.H{"msg": "已存在!"})
+		} else {
+			data["l_lasttime"] = time.Now().Unix()
+			data["l_date"] = time.Now().Unix()
+			data["s_user"] = session.Get("username")
+			data["delete"] = false
+			Mgo.Save("rc_field", data)
+			c.JSON(200, gin.H{"rep": true})
+		}
+	}
+}
+
+func DelRecogField(c *gin.Context) {
+	//删除识别字段,对应的删除识别字段下的分类和规则
+	_id, _ := c.GetPostForm("_id")
+	b := Mgo.Update("rc_field", `{"_id":"`+_id+`"}`, map[string]interface{}{
+		"$set": map[string]interface{}{"delete": true},
+	}, false, false)
+	go DelClassAndRule(_id)
+	if b {
+		c.JSON(200, gin.H{"rep": true})
+	} else {
+		c.JSON(200, gin.H{"rep": false})
+	}
+}
+
 func GetClass(c *gin.Context) {
-	data, _ := Mgo.Find("rc_class", nil, `{"i_order":1}`, nil, false, -1, -1)
+	s_fid, _ := c.GetPostForm("fid")
+	data, _ := Mgo.Find("rc_class", `{"s_fid":"`+s_fid+`","delete":false}`, `{"i_order":1}`, nil, false, -1, -1)
 	for _, d := range *data {
 		timeStr := time.Unix(d["l_lasttime"].(int64), 0).Format(Date_Short_Layout)
 		d["l_lasttime"] = timeStr
@@ -79,15 +139,17 @@ func SaveClass(c *gin.Context) {
 		Mgo.UpdateById("rc_class", _id, map[string]interface{}{"$set": data})
 		c.JSON(200, gin.H{"rep": true})
 	} else {
+		s_name, _ := c.GetPostForm("s_name")
 		s_recogfield, _ := c.GetPostForm("s_recogfield")
-		d, _ := Mgo.FindOne("rc_class", `{"s_recogfield":"`+s_recogfield+`"}`)
-		if len(*d) > 0 {
-			c.JSON(200, gin.H{"msg": "已存在!"})
+		class, _ := Mgo.FindOne("rc_class", `{"s_name":"`+s_name+`","s_recogfield":"`+s_recogfield+`"}`)
+		if len(*class) > 0 {
+			c.JSON(200, gin.H{"rep": false})
 		} else {
 			data["l_lasttime"] = time.Now().Unix()
 			data["l_date"] = time.Now().Unix()
 			data["s_user"] = session.Get("username")
 			data["i_order"] = GetOrder("class")
+			data["delete"] = false
 			Mgo.Save("rc_class", data)
 			c.JSON(200, gin.H{"rep": true})
 		}
@@ -116,7 +178,10 @@ func GetAuditField(c *gin.Context) {
 
 func DelClass(c *gin.Context) {
 	_id, _ := c.GetPostForm("_id")
-	b := Mgo.Del("rc_class", `{"_id":"`+_id+`"}`)
+	b := Mgo.Update("rc_class", `{"_id":"`+_id+`"}`, map[string]interface{}{
+		"$set": map[string]interface{}{"delete": true},
+	}, false, false)
+	go DelRuleByClass(_id)
 	if b {
 		c.JSON(200, gin.H{"rep": true})
 	} else {
@@ -126,6 +191,7 @@ func DelClass(c *gin.Context) {
 
 func GetCList(c *gin.Context) {
 	nid := c.Query("nid")
+	fname := c.Query("fname")
 	query := make(map[string]interface{})
 	if nid != "" {
 		query = map[string]interface{}{
@@ -134,7 +200,15 @@ func GetCList(c *gin.Context) {
 			},
 		}
 	}
+	if fname != "" {
+		query = map[string]interface{}{
+			"s_recogfield": map[string]interface{}{
+				"$ne": fname,
+			},
+		}
+	}
 	class, _ := Mgo.Find("rc_class", query, nil, `{"s_name":1}`, false, 0, 200)
+	fmt.Println("class==========", class)
 	c.JSON(200, gin.H{"data": class})
 }
 
@@ -151,7 +225,7 @@ func GetOrder(sel string) int {
 
 func GetRule(c *gin.Context) {
 	cid, _ := c.GetPostForm("cid")
-	data, _ := Mgo.Find("rc_rule", `{"s_classid":"`+cid+`"}`, `{"i_order":1}`, nil, false, -1, -1)
+	data, _ := Mgo.Find("rc_rule", `{"s_classid":"`+cid+`","delete":false}`, `{"i_order":1}`, nil, false, -1, -1)
 	for _, d := range *data {
 		timeStr := time.Unix(d["l_lasttime"].(int64), 0).Format(Date_Short_Layout)
 		d["l_lasttime"] = timeStr
@@ -196,8 +270,8 @@ func SaveRule(c *gin.Context) {
 			data["l_lasttime"] = time.Now().Unix()
 			data["l_date"] = time.Now().Unix()
 			data["s_user"] = session.Get("username")
-			data["i_status"] = 0
 			data["i_order"] = GetOrder("rule")
+			data["delete"] = false
 			Mgo.Save("rc_rule", data)
 			c.JSON(200, gin.H{"rep": true})
 		}
@@ -236,7 +310,9 @@ func GetRList(c *gin.Context) {
 
 func DelRule(c *gin.Context) {
 	_id, _ := c.GetPostForm("_id")
-	b := Mgo.Del("rc_rule", `{"_id":"`+_id+`"}`)
+	b := Mgo.Update("rc_rule", `{"_id":"`+_id+`"}`, map[string]interface{}{
+		"$set": map[string]interface{}{"delete": true},
+	}, false, false)
 	if b {
 		c.JSON(200, gin.H{"rep": true})
 	} else {
@@ -282,9 +358,9 @@ func RunRuleTest(c *gin.Context) {
 		rule, _ := Mgo.FindById("rc_rule", _id, `{"s_rule":1,"s_rule_prerule":1}`)
 		s_rule := qu.ObjArrToStringArr((*rule)["s_rule"].([]interface{}))
 		fmt.Println(s_con)
-		s_con = PreFilter(s_con, qu.ObjToString((*rule)["s_rule_prerule"])) //对文本先进行前置过滤
+		s_con = ju.PreFilter(s_con, qu.ObjToString((*rule)["s_rule_prerule"])) //对文本先进行前置过滤
 		fmt.Println(s_con)
-		text, rules, pos, b := ClassificationText(s_con, AnalyRules(s_rule))
+		text, rules, pos, b := ju.ClassificationText(s_con, ju.AnalyRules(s_rule))
 		data["b"] = b
 		data["pos"] = pos + 1
 		data["rules"] = func() template.HTML {
@@ -322,3 +398,22 @@ func GetParent(s_pid, coll string, pm *map[string]interface{}) {
 	}
 	return
 }
+
+func DelClassAndRule(fid string) {
+	class, _ := Mgo.Find("rc_class", `{"s_fid":"`+fid+`"}`, nil, `{"_id":1}`, false, -1, -1)
+	for _, c := range *class {
+		Mgo.UpdateById("rc_class", c["_id"], map[string]interface{}{ //删除class
+			"$set": map[string]interface{}{"delete": true},
+		})
+		classid := qu.BsonIdToSId(c["_id"])
+		Mgo.Update("rc_rule", `{"s_classid":"`+classid+`"}`, map[string]interface{}{ //删除class
+			"$set": map[string]interface{}{"delete": true},
+		}, false, true)
+	}
+}
+
+func DelRuleByClass(classid string) {
+	Mgo.Update("rc_rule", `{"s_classid":"`+classid+`"}`, map[string]interface{}{ //删除class
+		"$set": map[string]interface{}{"delete": true},
+	}, false, true)
+}

+ 0 - 96
src/jy/admin/buyermanager/buyermanage.go

@@ -1,96 +0,0 @@
-package buyermanager
-
-import (
-	. "jy/admin"
-	. "jy/mongodbutil"
-	"log"
-	redis "qfw/util/redis"
-	"time"
-
-	"github.com/gin-gonic/gin"
-)
-
-func init() {
-	//列表、编辑
-	Admin.GET("/audit/buyermanager", func(c *gin.Context) {
-		c.HTML(200, "buyermanager_list.html", nil)
-	})
-	Admin.POST("/buyer/data", BuyerData)        //加载数据
-	Admin.POST("/buyer/addbuyer", AddBuyer)     //新增
-	Admin.POST("/buyer/delbuyer", DelBuyer)     //删除
-	Admin.POST("/buyer/auditbuyer", AuditBuyer) //审核
-	Admin.POST("/buyer/buyerclass", BuyerClass) //查询分类数据
-
-	//审核
-	//	Admin.GET("/buyermanager/audit", func(c *gin.Context) {
-	//		c.HTML(200, "buyermanager_audit.html", nil)
-	//	})
-}
-
-func BuyerData(c *gin.Context) {
-	data, _ := Mgo.Find("audit", `{"s_field":"buyer"}`, `{"_id":-1}`, nil, false, -1, -1)
-	for _, d := range *data {
-		timeStr := time.Unix(d["l_intime"].(int64), 0).Format(Date_Short_Layout)
-		d["l_intime"] = timeStr
-	}
-	c.JSON(200, gin.H{"data": data})
-}
-
-//新增
-func AddBuyer(c *gin.Context) {
-	buyername, _ := c.GetPostForm("buyername")
-	parentclass, _ := c.GetPostForm("parentclass")
-	childclass, _ := c.GetPostForm("childclass")
-	update := make(map[string]interface{})
-	update["name"] = buyername
-	update["pici"] = time.Now().Unix()
-	update["buyerclass"] = childclass
-	update["parentclass"] = parentclass
-	update["s_source"] = "手动"
-	b := Mgo.Update("buyer", `{"name":"`+buyername+`"}`, map[string]interface{}{
-		"$set": update}, true, false)
-	if b { //新增的直接更新buyer redis
-		p := redis.PutCKV("buyer", "buyer_"+buyername, 1)
-		log.Println("Add--Update buyer redis:", p)
-	}
-	c.JSON(200, gin.H{"rep": b})
-}
-
-//删除
-func DelBuyer(c *gin.Context) {
-	_id, _ := c.GetPostForm("_id")
-	b := Mgo.Del("audit", `{"_id":"`+_id+`"}`)
-	if b {
-		c.JSON(200, gin.H{"rep": true})
-	} else {
-		c.JSON(200, gin.H{"rep": false})
-	}
-}
-
-//审核
-func AuditBuyer(c *gin.Context) {
-	name, _ := c.GetPostForm("name")
-	_id, _ := c.GetPostForm("id")
-	parentclass, _ := c.GetPostForm("parentclass")
-	childclass, _ := c.GetPostForm("childclass")
-	update := make(map[string]interface{})
-	update["name"] = name
-	update["pici"] = time.Now().Unix()
-	update["buyerclass"] = childclass
-	update["parentclass"] = parentclass
-	update["s_source"] = "抽取"
-	b := Mgo.Update("buyer", `{"name":"`+name+`"}`, map[string]interface{}{
-		"$set": update}, true, false)
-	//更新redis
-	if b {
-		p := redis.PutCKV("buyer", "buyer_"+name, 1)
-		log.Println("Audit--Update buyer redis:", p)
-		Mgo.Del("audit", `{"_id":"`+_id+`"}`)
-	}
-	c.JSON(200, gin.H{"rep": b})
-}
-
-func BuyerClass(c *gin.Context) {
-	data, _ := Mgo.Find("classify", `{"i_type":1}`, `{"_id":-1}`, `{"s_name":1,"child":1}`, false, -1, -1)
-	c.JSON(200, gin.H{"data": data})
-}

+ 0 - 77
src/jy/admin/winnermanager/winnermanager.go

@@ -1,77 +0,0 @@
-package winnermanager
-
-import (
-	. "jy/admin"
-	. "jy/mongodbutil"
-	"log"
-	redis "qfw/util/redis"
-	"time"
-
-	"github.com/gin-gonic/gin"
-)
-
-func init() {
-	//列表、编辑
-	Admin.GET("/audit/winnermanager", func(c *gin.Context) {
-		c.HTML(200, "winnermanager_list.html", nil)
-	})
-	Admin.POST("/winner/data", WinnerData)         //加载数据
-	Admin.POST("/winner/addwinner", AddWinner)     //新增
-	Admin.POST("/winner/delwinner", DelWinner)     //删除
-	Admin.POST("/winner/auditwinner", AuditWinner) //审核
-}
-
-func WinnerData(c *gin.Context) {
-	data, _ := Mgo.Find("audit", `{"s_field":"winner"}`, `{"_id":-1}`, nil, false, -1, -1)
-	for _, d := range *data {
-		timeStr := time.Unix(d["l_intime"].(int64), 0).Format(Date_Short_Layout)
-		d["l_intime"] = timeStr
-	}
-	c.JSON(200, gin.H{"data": data})
-}
-
-//新增
-func AddWinner(c *gin.Context) {
-	winnername, _ := c.GetPostForm("winnername")
-	update := make(map[string]interface{})
-	update["name"] = winnername
-	update["pici"] = time.Now().Unix()
-	update["s_source"] = "手动"
-	b := Mgo.Update("winner", `{"name":"`+winnername+`"}`, map[string]interface{}{
-		"$set": update}, true, false)
-	if b { //新增的直接更新winner redis
-		p := redis.PutCKV("winner", "winner_"+winnername, 1)
-		log.Println("Add--Update winner redis:", p)
-	}
-	c.JSON(200, gin.H{"rep": b})
-}
-
-//删除
-func DelWinner(c *gin.Context) {
-	_id, _ := c.GetPostForm("_id")
-	b := Mgo.Del("audit", `{"_id":"`+_id+`"}`)
-	if b {
-		c.JSON(200, gin.H{"rep": true})
-	} else {
-		c.JSON(200, gin.H{"rep": false})
-	}
-}
-
-//审核
-func AuditWinner(c *gin.Context) {
-	name, _ := c.GetPostForm("name")
-	_id, _ := c.GetPostForm("id")
-	update := make(map[string]interface{})
-	update["name"] = name
-	update["pici"] = time.Now().Unix()
-	update["s_source"] = "抽取"
-	b := Mgo.Update("winner", `{"name":"`+name+`"}`, map[string]interface{}{
-		"$set": update}, true, false)
-	//更新redis
-	if b {
-		p := redis.PutCKV("winner", "winner_"+name, 1)
-		log.Println("Audit--Update winner redis:", p)
-		Mgo.Del("audit", `{"_id":"`+_id+`"}`)
-	}
-	c.JSON(200, gin.H{"rep": b})
-}

+ 128 - 68
src/jy/extract/extract.go

@@ -19,13 +19,14 @@ import (
 )
 
 var (
-	lock      sync.RWMutex
-	cut       = ju.NewCut()                          //获取正文并清理
-	ExtLogs   map[*TaskInfo][]map[string]interface{} //抽取日志
-	TaskList  map[string]*ExtractTask                //任务列表
-	saveLimit = 200                                  //抽取日志批量保存
-	PageSize  = 5000                                 //查询分页
-	Fields    = `{"title":1,"detail":1,"contenthtml":1,"href":1,"site":1,"spidercode":1,"toptype":1,"area":1,"city":1}`
+	lock        sync.RWMutex
+	cut         = ju.NewCut()                          //获取正文并清理
+	ExtLogs     map[*TaskInfo][]map[string]interface{} //抽取日志
+	TaskList    map[string]*ExtractTask                //任务列表
+	saveLimit   = 200                                  //抽取日志批量保存
+	PageSize    = 5000                                 //查询分页
+	Fields      = `{"title":1,"detail":1,"contenthtml":1,"href":1,"site":1,"spidercode":1,"toptype":1,"area":1,"city":1}`
+	AuditFields = []string{} //需要审核的字段名称
 )
 
 //启动测试抽取
@@ -41,12 +42,15 @@ func StartExtractTestTask(taskId, startId, num, resultcoll, trackcoll string) bo
 	ext.InitRuleCore()
 	ext.InitTag()
 	ext.InitClearFn()
-
+	//城市
 	ext.InitProvince()
 	ext.InitCityAll()
 	ext.InitCitySim()
-	//InitDFA()
-
+	InitDFA()
+	//质量审核
+	InitAuditRule()
+	InitAuditClass()
+	InitAuditRecogField()
 	return RunExtractTestTask(ext, startId, num)
 }
 
@@ -92,11 +96,15 @@ func StartExtractTaskId(taskId string) bool {
 	ext.InitRuleCore()
 	ext.InitTag()
 	ext.InitClearFn()
-
+	//城市
 	ext.InitProvince()
 	ext.InitCityAll()
 	ext.InitCitySim()
 	InitDFA()
+	//质量审核
+	InitAuditRule()
+	InitAuditClass()
+	InitAuditRecogField()
 
 	ext.IsRun = true
 	go ext.ResultSave()
@@ -766,8 +774,12 @@ func AnalysisSaveResult(j *ju.Job, e *ExtractTask) {
 		}
 	}
 	//采购单位库,中标单位库
-	if ju.Config["buyerwinner"].(bool) {
-		BuyerAndWinner(resulttmp)
+	//	if ju.Config["buyerwinner"].(bool) {
+	//		BuyerAndWinner(resulttmp)
+	//	}
+	//质量审核
+	if ju.Config["qualityaudit"].(bool) {
+		QualityAudit(resulttmp)
 	}
 	b, p, c, d := TransmitData(resulttmp, _id) //抽取省份城市
 	//log.Println("抽取省份,城市,县结果=====", b, p, c, d)
@@ -809,71 +821,119 @@ func AnalysisSaveResult(j *ju.Job, e *ExtractTask) {
 	}
 }
 
-func BuyerAndWinner(resulttmp map[string]interface{}) {
-	buyerarr := make([]string, 0)
-	winnerarr := make([]string, 0)
-	//分包的buyer,winner
-	if resulttmp["package"] != nil {
-		packagedata := resulttmp["package"].(map[string]map[string]interface{})
-		for _, val := range packagedata {
-			//result := val.(map[string]interface{})
-			if val["buyer"] != nil {
-				buyer := val["buyer"].(string)
-				if buyer != "" {
-					buyerarr = append(buyerarr, buyer)
-				}
+func QualityAudit(resulttmp map[string]interface{}) {
+	//获取审核字段
+	//log.Println("需要审核的字段-----", AuditFields)
+	if len(AuditFields) == 0 {
+		v, _ := db.Mgo.FindOne("version", `{"isuse":true,"delete":false}`) //查找当前使用版本
+		if len(*v) > 0 {                                                   //查找当前使用版本中属性配置需要审核的字段
+			vid := qu.BsonIdToSId((*v)["_id"])
+			query := map[string]interface{}{
+				"isaudit": true,
+				"delete":  false,
+				"vid":     vid,
 			}
-			if val["winner"] != nil {
-				winner := val["winner"].(string)
-				if winner != "" {
-					winnerarr = append(winnerarr, winner)
-				}
+			data, _ := db.Mgo.Find("versioninfo", query, `{"_id":-1}`, `{"s_field":1}`, false, -1, -1)
+			for _, d := range *data {
+				field := qu.ObjToString(d["s_field"])
+				AuditFields = append(AuditFields, field)
 			}
 		}
 	}
-	//外围抽取结果
-	if resulttmp["buyer"] != nil {
-		buyer := resulttmp["buyer"].(string)
-		if buyer != "" {
-			buyerarr = append(buyerarr, buyer)
+	for _, field := range AuditFields {
+		//1.分包
+		if resulttmp["package"] != nil {
+			packagedata := resulttmp["package"].(map[string]map[string]interface{})
+			for _, val := range packagedata {
+				if val[field] != nil {
+					fv := qu.ObjToString(val[field])
+					if fv != "" {
+						if field == "buyer" || field == "winner" { //field为buyer和winner时特殊处理,先从Redis中查,有直接通过,没有走匹配规则
+							RedisMatch(field, fv, val) //redis匹配
+						} else { //除了buyer和winner,其他字段走规则匹配
+							fv := qu.ObjToString(resulttmp[field])
+							//resulttmp[field+"_isredis"] = false
+							RuleMatch(field, fv, resulttmp)
+						}
+					}
+				}
+			}
 		}
-	}
-	if resulttmp["winner"] != nil {
-		winner := resulttmp["winner"].(string)
-		if winner != "" {
-			winnerarr = append(winnerarr, winner)
+		//2.外围
+		if resulttmp[field] != nil {
+			fv := qu.ObjToString(resulttmp[field])
+			if fv != "" {
+				if field == "buyer" || field == "winner" { //field为buyer和winner时特殊处理,先从Redis中查,有直接通过,没有走匹配规则
+					RedisMatch(field, fv, resulttmp) //redis匹配
+				} else { //除了buyer和winner,其他字段走规则匹配
+					fv := qu.ObjToString(resulttmp[field])
+					//resulttmp[field+"_isredis"] = false
+					RuleMatch(field, fv, resulttmp)
+				}
+			}
 		}
 	}
-	save := make(map[string]interface{})
-	save["s_source"] = "抽取"              //入库类型 手动或者抽取
-	save["l_intime"] = time.Now().Unix() //存库时间
-	save["isaudit"] = false              //是否审核 false未审核 true已审核
-	//buyer
-	for _, buyer := range buyerarr {
-		//log.Println("buyer---------------", buyer)
-		i := redis.GetInt("buyer", "buyer_"+buyer)
-		//log.Println("iiiiiiiiiii", i)
-		if i == 0 {
-			buyernewdata, _ := db.Mgo.FindOne("audit", `{"s_field":"buyer","s_name":"`+buyer+`"}`)
-			if len(*buyernewdata) == 0 {
-				save["s_name"] = buyer
-				save["s_field"] = "buyer"
-				db.Mgo.Save("audit", save)
-			}
+}
+
+//Redis匹配
+func RedisMatch(field, fv string, val map[string]interface{}) {
+	i := redis.GetInt(field, fv) //查找redis
+	if i == 0 {                  //reids未找到,执行规则匹配
+		val[field+"_isredis"] = false
+		RuleMatch(field, fv, val) //规则匹配
+	} else { //redis找到,打标识存库
+		val[field+"_isredis"] = true
+	}
+}
+
+//规则匹配
+func RuleMatch(field, fieldval string, tmpMap map[string]interface{}) {
+	if fieldval != "" {
+		SMap := StartMatch(field, fieldval)
+		//SMap.AddKey(field+"_isaudit", false)
+		for _, k := range SMap.Keys {
+			tmpMap[k] = SMap.Map[k]
 		}
+		tmpMap[field+"_isaudit"] = false
 	}
-	//winner
-	for _, winner := range winnerarr {
-		//log.Println("winner---------------", winner)
-		j := redis.GetInt("winner", "winner_"+winner)
-		//log.Println("jjjjjjjjjjjj", j)
-		if j == 0 {
-			winnernewdata, _ := db.Mgo.FindOne("audit", `{"s_field":"winner","s_name":"`+winner+`"}`)
-			if len(*winnernewdata) == 0 {
-				save["s_name"] = winner
-				save["s_field"] = "winner"
-				db.Mgo.Save("audit", save)
+}
+
+//开始规则匹配
+func StartMatch(field, text string) *pretreated.SortMap {
+	SMap := pretreated.NewSortMap()
+	f := RecogFieldMap[field]
+	if len(f) > 0 {
+		fid := qu.BsonIdToSId(f["_id"])
+		recogFieldPreRule := qu.ObjToString(f["s_recogfield_prerule"])
+		textAfterRecogFieldPrerule := ju.PreFilter(text, recogFieldPreRule) //识别字段的前置过滤
+		if textAfterRecogFieldPrerule != "" {
+			classMap := FidClassMap[fid]
+		L:
+			for _, c := range classMap { //class
+				classid := qu.BsonIdToSId(c["_id"])
+				classPrerule := qu.ObjToString(c["s_class_prerule"])
+				savefield := qu.ObjToString(c["s_savefield"])                                   //保存字段
+				textAfterClassPrerule := ju.PreFilter(textAfterRecogFieldPrerule, classPrerule) //class的前置过滤
+				if textAfterClassPrerule != "" {
+					ruleMap := CidRuleMap[classid]
+					for _, r := range ruleMap { //rule
+						rulePrerule := qu.ObjToString(r["s_rule_prerule"])
+						s_code := qu.ObjToString(r["s_code"])
+						rule := r["rule"].([]interface{})
+						textAfterRulePrerule := ju.PreFilter(textAfterClassPrerule, rulePrerule) //class的前置过滤
+						if textAfterRulePrerule != "" {
+							b, _ := ju.RecogAnalyRules(textAfterRulePrerule, rule)
+							if b { //匹配到一个分类下某个规则时,不再继续匹配
+								if savefield != "" { //保存字段不为空,存储代码信息
+									SMap.AddKey(field+"_"+savefield, s_code)
+								}
+								break L
+							}
+						}
+					}
+				}
 			}
 		}
 	}
+	return SMap
 }

+ 66 - 2
src/jy/extract/extractInit.go

@@ -66,6 +66,10 @@ type ExtractTask struct {
 	BidArr       [][]map[string]interface{} //抽取结果
 }
 
+var RecogFieldMap map[string]map[string]interface{}
+var FidClassMap map[string][]map[string]interface{}
+var CidRuleMap map[string][]map[string]interface{}
+
 func init() {
 	TaskList = make(map[string]*ExtractTask)
 	go SaveExtLog()
@@ -455,7 +459,6 @@ func InitDFA() {
 			c := &City{}
 			c.Name = k1
 			if v1m["brief"] == nil {
-				log.Println(k, k1)
 			}
 			c.Brief = v1m["brief"].(string)
 			CityBrief[c.Brief] = c
@@ -517,7 +520,6 @@ func InitDFA() {
 		for k1, v1 := range city {
 			v1m, _ := v1.(map[string]interface{})
 			if v1m["brief"] == nil {
-				log.Println(k, k1)
 			}
 			cb := v1m["brief"].(string)
 			c := AreaToCity[k1][0]
@@ -642,3 +644,65 @@ func (e *ExtractTask) BidSave() {
 		time.Sleep(10 * time.Second)
 	}
 }
+
+func InitAuditRecogField() {
+	RecogFieldMap = make(map[string]map[string]interface{})
+	recogFieldList, _ := db.Mgo.Find("rc_field", `{"delete":false}`, `{"_id":1}`, `{"s_recogfield":1,"s_recogfield_prerule":1}`, false, -1, -1)
+	for _, f := range *recogFieldList {
+		field := qu.ObjToString(f["s_recogfield"])
+		RecogFieldMap[field] = f
+	}
+}
+
+func InitAuditClass() {
+	FidClassMap = make(map[string][]map[string]interface{})
+	class, _ := db.Mgo.Find("rc_class", `{"delete":false}`, `{"i_order":1}`, nil, false, -1, -1)
+	for _, c := range *class {
+		classList := []map[string]interface{}{}
+		fid := qu.ObjToString(c["s_fid"])
+		if len(FidClassMap[fid]) > 0 { //追加
+			classList = FidClassMap[fid]
+		}
+		classList = append(classList, c)
+		FidClassMap[fid] = classList
+	}
+}
+
+//加载规则
+func InitAuditRule() {
+	var rureg *regexp.Regexp
+	var rs []rune
+	var ru string
+	var err error
+	CidRuleMap = make(map[string][]map[string]interface{})
+	rule, _ := db.Mgo.Find("rc_rule", `{"delete":false}`, `{"i_order":1}`, nil, false, -1, -1)
+	for _, v := range *rule {
+		i_rule := []interface{}{}
+		ss, _ := (v["s_rule"].([]interface{}))
+		for _, r := range qu.ObjArrToStringArr(ss) {
+			if strings.HasPrefix(r, "'") && strings.HasSuffix(r, "'") { //正则
+				rs = []rune(r)
+				ru = string(rs[1 : len(rs)-1])
+				rureg, err = regexp.Compile(ru)
+				if err != nil {
+					log.Println("error---rule:", r)
+					continue
+				}
+				i_rule = append(i_rule, []interface{}{rureg}...)
+
+			} else { //规则
+				i_rule = append(i_rule, r)
+			}
+		}
+		v["rule"] = i_rule
+
+		ruleList := []map[string]interface{}{}
+		classid := qu.ObjToString(v["s_classid"])
+		if len(CidRuleMap[classid]) > 0 { //追加
+			ruleList = CidRuleMap[classid]
+
+		}
+		ruleList = append(ruleList, v)
+		CidRuleMap[classid] = ruleList
+	}
+}

+ 114 - 19
src/jy/admin/audit/classification.go → src/jy/util/classification.go

@@ -1,4 +1,4 @@
-package audit
+package util
 
 import (
 	"fmt"
@@ -15,6 +15,34 @@ const (
 	SPLIT = "___"
 )
 
+//规则或者正则识别
+func RecogAnalyRules(text string, rules []interface{}) (bool, []string) {
+	var arr []string
+	ok := false
+	for _, r := range rules {
+		switch r.(type) {
+		case string: //规则
+			//fmt.Println("规则---", r.(string))
+			strRuleArr := AnalyRule(r.(string)) //解析规则
+			ok, arr = Compute(text, strRuleArr, 1)
+			if ok {
+				return ok, arr
+			}
+		case *regexp.Regexp: //正则
+			ruleReg := r.(*regexp.Regexp)
+			textArr := ruleReg.FindAllString(text, -1)
+			//fmt.Println("正则---", ruleReg)
+			if len(textArr) > 0 {
+				regStr := []string{ruleReg.String()}
+				return true, regStr
+			}
+		default:
+			continue
+		}
+	}
+	return ok, arr
+}
+
 //前置过滤
 func PreFilter(text, prerule string) string {
 	if len(prerule) > 0 {
@@ -30,7 +58,7 @@ func PreFilter(text, prerule string) string {
 	return text
 }
 
-//分离正则和规则
+//测试任务 分离正则和规则
 func AnalyRules(rules []string) [][]string {
 	res := [][]string{}
 	for i := 0; i < len(rules); i++ {
@@ -87,11 +115,9 @@ func ClassificationText(text string, rules [][]string) (t string, rs [][]string,
 
 func ComputeText(text string, rule []string, num int) (string, []string, bool) {
 	var andB, orB, oB []bool
-	//fmt.Println("rule----", rule, len(rule))
 	op := ""
 	for pos := 0; pos < len(rule); pos++ {
 		tmp := rule[pos]
-		//fmt.Println("---------", pos, "tmp----", tmp, "num----", num, len(rule)-1, pos == len(rule)-1)
 		if tmp == "+" || tmp == "^" || tmp == "|" {
 			op = tmp
 			continue
@@ -105,12 +131,10 @@ func ComputeText(text string, rule []string, num int) (string, []string, bool) {
 				isRight := 0
 				thispos := pos
 				for ; pos < len(rule); pos++ {
-					//fmt.Println(pos, "rule[pos]===", rule[pos])
 					if rule[pos] == "(" {
 						isRight++
 						tmpexp = append(tmpexp, rule[pos])
 					} else if rule[pos] == ")" {
-						//fmt.Println("+++++++++isRight", isRight)
 						if isRight > 0 {
 							isRight--
 							tmpexp = append(tmpexp, rule[pos])
@@ -118,7 +142,6 @@ func ComputeText(text string, rule []string, num int) (string, []string, bool) {
 							num = 1
 							if (pos + 1) < len(rule) {
 								t := rule[pos+1]
-								//fmt.Println("+++++++++数字", t)
 								if REG_NUM.MatchString(t) {
 									num, _ = strconv.Atoi(t)
 								}
@@ -129,22 +152,17 @@ func ComputeText(text string, rule []string, num int) (string, []string, bool) {
 						tmpexp = append(tmpexp, rule[pos])
 					}
 				}
-				//fmt.Println("1----------------", text)
-				//fmt.Println("2----------------", tmpexp)
 				text, tmpexp, tmpresult = ComputeText(text, tmpexp, num)
 				for tmpos, tmprule := range tmpexp {
 					rule[thispos+tmpos] = tmprule
 				}
-				//fmt.Println("3----------------", rule)
 			} else {
 				tmpresult = strings.Index(text, tmp) > -1
-				//增加对rule的处理
 				sclass := "f"
 				if tmpresult {
 					sclass = "t"
 				}
 				rule[pos] = fmt.Sprintf("<r class='_r%s'>%s</r>", sclass, tmp)
-				//fmt.Println("========", rule[pos])
 			}
 			if op == "" {
 				if (pos+1) < len(rule) && rule[pos+1] == "|" {
@@ -175,22 +193,99 @@ func ComputeText(text string, rule []string, num int) (string, []string, bool) {
 				oB = append(oB, tmpresult)
 				tclass = "_opp"
 			}
-			//fmt.Println("tclass====", tclass, "---ob", oB, "---orb", orB)
 			if tclass != "" && tmp != "(" && tmp != ")" {
-				//fmt.Println("text=======", text)
-				//fmt.Println("old=======", tmp)
-				//fmt.Println("new=======", fmt.Sprintf("<r class='_and'>%s</r>", tmp))
 				text = strings.Replace(text, tmp, fmt.Sprintf("<r class='_and'>%s</r>", tmp), 1)
-				//fmt.Println("text3=======", text)
 			}
 		}
 	}
-	//fmt.Println("textfinish====", text, "num----", num)
-	//fmt.Println("匹配个数----", len(orB), CheckBool(orB, "|", num))
 	tres := CheckBool(andB, "+", 0) && CheckBool(orB, "|", num) && !CheckBool(oB, "^", 0)
 	return text, rule, tres
 }
 
+//计算
+func Compute(text string, rule []string, num int) (bool, []string) {
+	var andB, orB, oB []bool
+	op := ""
+	arr := []string{}
+	for pos := 0; pos < len(rule); pos++ {
+		tmp := rule[pos]
+		if tmp == "+" || tmp == "^" || tmp == "|" {
+			op = tmp
+			continue
+		} else if REG_NUM.MatchString(tmp) && len(tmp) == 1 {
+			continue
+		} else {
+			tmpresult := false
+			if tmp == "(" { //找出子表达式,仅限一层,现在修改为多层逻辑
+				tmpexp := []string{}
+				pos++
+				isRight := 0
+				for ; pos < len(rule); pos++ {
+					if rule[pos] == "(" {
+						isRight++
+						tmpexp = append(tmpexp, rule[pos])
+					} else if rule[pos] == ")" {
+						if isRight > 0 {
+							isRight--
+							tmpexp = append(tmpexp, rule[pos])
+						} else {
+							num = 1
+							if (pos + 1) < len(rule) {
+								t := rule[pos+1]
+								if REG_NUM.MatchString(t) {
+									num, _ = strconv.Atoi(t)
+								}
+							}
+							break
+						}
+					} else {
+						tmpexp = append(tmpexp, rule[pos])
+					}
+				}
+				var arr1 []string
+				tmpresult, arr1 = Compute(text, tmpexp, num)
+				if len(arr1) > 0 {
+					arr = append(arr, arr1...)
+				}
+			} else {
+				tmpresult = strings.Index(text, tmp) > -1
+				if op != "^" && tmpresult {
+					arr = append(arr, tmp)
+				}
+			}
+			if op == "" {
+				if (pos+1) < len(rule) && rule[pos+1] == "|" {
+					op = "|"
+				} else {
+					op = "+"
+				}
+			}
+			if op == "+" {
+				if andB == nil {
+					andB = []bool{}
+				}
+				andB = append(andB, tmpresult)
+
+			} else if op == "|" {
+				if orB == nil {
+					orB = []bool{}
+				}
+				orB = append(orB, tmpresult)
+			} else if op == "^" {
+				if oB == nil {
+					oB = []bool{}
+				}
+				oB = append(oB, tmpresult)
+			}
+		}
+	}
+	tres := CheckBool(andB, "+", 0) && CheckBool(orB, "|", num) && !CheckBool(oB, "^", 0)
+	if !tres {
+		arr = []string{}
+	}
+	return tres, arr
+}
+
 func CheckBool(bs []bool, flag string, num int) bool {
 	if flag == "+" {
 		if bs == nil {

+ 0 - 2
src/main.go

@@ -3,10 +3,8 @@ package main
 import (
 	_ "jy/admin"
 	_ "jy/admin/audit"
-	_ "jy/admin/buyermanager"
 	_ "jy/admin/distribution"
 	_ "jy/admin/task"
-	_ "jy/admin/winnermanager"
 	"jy/extract"
 	_ "jy/front"
 	. "jy/router"

+ 1 - 0
src/main_test.go

@@ -14,6 +14,7 @@ func Test_task(t *testing.T) {
 	Mgo = MgoFactory(1, 3, 120, "192.168.3.207:27082", "extract_v3")
 	//extract.StartExtractTaskId("5b8f804025e29a290415aee1")
 	extract.StartExtractTestTask("5be107e600746bf92debf080", "5a999f3140d2d9bbe820dbb1", "5", "mxs_v3", "mxs_v3")
+	//extract.StartExtractTestTask("5b8f804025e29a290415aee1", "5beb99eaa5cb26b9b74c104b", "20", "mxs_v3", "mxs_v3")
 	time.Sleep(5 * time.Second)
 }
 

+ 71 - 49
src/web/templates/admin/audit_auditone.html

@@ -7,11 +7,17 @@
 <div class="content-wrapper">
 	<section class="content-header">
 		<h1>
-			<small><button class="btn btn-primary" onclick="addaudit()">新增{{.name}}</button></small>
+			<small>
+				{{if eq .name "buyer" "winner"}}
+				<button class="btn btn-primary" onclick="addaudit()">新增{{.name}}</button>
+				{{end}}
+			</small>
 		</h1>
 		<ol class="breadcrumb">
-			<li><a href="/admin/audit/dataaudit"><i class="fa fa-dashboard"></i>数据审核</a></li>
-		  	<li class="active"><a href="#"> {{.name}}</a></li>		  
+		<li><a href="/admin/audit/recogfield"><i class="fa fa-dashboard"></i> 识别字段</a></li>
+			<li class="active"><a href="#">数据审核</a></li>
+		  	
+			 
 		</ol>
     </section>
   <!-- Main content -->
@@ -23,9 +29,7 @@
 		            <table id="dataauditTable" class="table table-bordered table-hover">
 		              <thead>
 		              <tr>
-		                <th>{{.name}}</th>
-						<th>来源</th>
-						<th>时间</th>
+		                <th>名称</th>
 						<th>是否审核</th>
 						<th>操作</th>
 		              </tr>
@@ -81,11 +85,15 @@
 {{template "dialog"}}
 {{template "footer"}}
 <script>
+menuActive("recogfield")
 var id = "";
 var classifymap = {};
 var bid = 1;
-menuActive("dataaudit")
-var titlename = {{.name}}
+var field = {{.name}}
+var s_coll =sessionStorage.getItem("s_coll");
+if(s_coll == null){
+	s_coll = "";
+}
 $(function () {
 	ttable=$('#dataauditTable').DataTable({
 		"paging"      : true,
@@ -94,42 +102,65 @@ $(function () {
 		"ordering"    : false,
 		"info"        : true,
 		"autoWidth"   : false,
+		"serverSide"  : true,
 		"ajax": {
 			"url": "/admin/audit/auditone",
 			"type": "post",
-			"data": {"name":titlename}
+			"data": {"name":{{.name}},"s_coll":s_coll}
 		},
 		"language": {
             "url": "/res/dist/js/dataTables.chinese.lang"
         },
 		"columns": [
-           { "data": "s_name"},
-			{ "data": "s_source"},
-			{ "data": "l_intime"},
-			{ "data": "isaudit",render:function(val,a,row){
-				if(val == true){
-					return "是"
-				}else{
-					return "否"
-				}
+            { "data": "name"},
+			{ "data": "_id",render:function(val,a,row){
+				return "否";
 			}},
 			{ "data": "_id",render:function(val,a,row){
-				if(row["isaudit"] == false){
-					return '<a class="btn btn-sm btn-danger" onclick="del(\''+val+'\')" >删除</a>'+
-					'&nbsp;&nbsp;<a class="btn btn-sm btn-success" href="#" onclick="audit(\''+row.s_name+'\',\''+val+'\')">审核</a>'
-				}else{																			
-					return '<a class="btn btn-sm btn-danger" onclick="del(\''+val+'\')" >删除</a>'
-				}
+					return '<a class="btn btn-sm btn-success" href="#" onclick="audit(\''+row.name+'\',\''+val+'\')">审核</a>'
 			}}
-       	]
+       	],
+		"fnServerParams": function (e) {  
+			var source=$("#datasource").val();
+			if(source){
+				e.source = source;
+			}else{
+				e.source = "-1";
+			}
+			
+		}
+	});
+	ttable.on('init.dt', function () {
+		//结果表
+		var result ="<div class='form-group'><label for='name'>结果表:</label>"+
+			"<input id='resultcoll' class='form-control input-sm' value=\'"+s_coll+"\' placeholder='请输入要查询的表...'></input>&nbsp;&nbsp;"+
+			"<button class='btn btn-primary' onclick='search()'>查询</button><div>";
+		$("#dataauditTable_filter").prepend("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
+		$("#dataauditTable_filter").prepend(result);
+		//内外层数据
+		var opt="<option value='-1'>外层</option>"+
+				"<option value='1'>内层</option>";
+		var select="<div class='form-group'><label for='name'>数据来源:</label>"+
+			"<select id='datasource' onchange='checkclick(this.value)' class='form-control input-sm'>"+
+			opt+
+			"</select></div>"
+		$("#dataauditTable_filter").prepend("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
+		$("#dataauditTable_filter").prepend(select);
+		//样式
+		
+		$("#dataauditTable_wrapper .col-sm-6").css({width:"100%"});
 	});
 })
 
+function checkclick(urgency){
+	ttable.ajax.reload();
+}
+
 function addaudit(){
 	//查询分类数据
 	bid = 1;
-	$("#audittitleinfo").html("新增"+titlename);
-	if(titlename == "buyer"){
+	$("#audittitleinfo").html("新增");
+	if(field == "buyer"){
 		getbuyerclass();
 	}
 	$("#modal-info-auditdata").modal("show");
@@ -159,14 +190,14 @@ function saveaudit(){
 	var parentclass = "";
 	var childclass = "";
 	var auditname = $("#auditname").val();
-	if(titlename == "buyer"){
+	if(field == "buyer"){
 		parentclass = $("#parentclass").val();
 		childclass = $("#childclass").val();
 	}
 	if(auditname == ""){
 		alert("表单填写不完整!");
 		return ;
-	}else if(titlename == "buyer" && (parentclass == "" || childclass == "")){
+	}else if(field == "buyer" && (parentclass == "" || childclass == "")){
 		alert("表单填写不完整!");
 		return ;
 	}
@@ -182,7 +213,7 @@ function addsave(auditname,parentclass,childclass){
 	$.ajax({
 		url:"/admin/audit/addsave",
 		type:"post",
-		data:{"titlename":titlename,"auditname":auditname,"parentclass":parentclass,"childclass":childclass},
+		data:{"field":field,"auditname":auditname,"parentclass":parentclass,"childclass":childclass},
 		success:function(r){
 			if(r.rep){
 				$("#modal-info-auditdata").modal("hide");
@@ -193,23 +224,6 @@ function addsave(auditname,parentclass,childclass){
 		}
 	})
 }
-//删除
-function del(_id){
-	showConfirm("确定删除?", function() {
-		$.ajax({
-			url:"/admin/audit/del",
-			type:"post",
-			data:{"_id":_id},
-			success:function(r){
-				if(r.rep){				
-					ttable.ajax.reload();
-				}else{
-					showTip("删除失败", 1000, function() {});
-				}
-			}
-		})
-	});
-}
 
 //审核
 function audit(name,_id){
@@ -217,18 +231,19 @@ function audit(name,_id){
 	getbuyerclass();
 	id = _id;
 	$("#auditname").val(name);
-	$("#audittitleinfo").html("审核"+titlename);
+	$("#audittitleinfo").html("审核");
 	$("#modal-info-auditdata").modal("show");
 }
 //审核确认
 function auditsave(parentclass,childclass){
 	var name = $("#auditname").val();
 	$("#modal-info-auditdata").modal("hide");
+	var coll = sessionStorage.getItem("s_coll");
 	showConfirm("确定通过?", function() {
 		$.ajax({
 			url:"/admin/audit/auditsave",
 			type:"post",
-			data:{"titlename":titlename,"name":name,"parentclass":parentclass,"childclass":childclass,"id":id},
+			data:{"coll":coll,"field":field,"name":name,"parentclass":parentclass,"childclass":childclass,"id":id},
 			success:function(r){
 				if(r.rep){				
 					ttable.ajax.reload();
@@ -254,4 +269,11 @@ $(document).ready(function(){
 		}
 	});
 });
+
+//查询
+function search(){
+	var coll=$("#resultcoll").val();
+	sessionStorage.setItem("s_coll",coll);
+	window.location.href="/admin/audit/dataaudit?name="+{{.name}}+"&s_coll="+coll;
+}
 </script>

+ 26 - 19
src/web/templates/admin/audit_rulemanager.html → src/web/templates/admin/audit_classlist.html

@@ -7,10 +7,11 @@
 <div class="content-wrapper">
 	<section class="content-header">
 		<h1>
-			<small><a class="btn btn-primary opr" opr="new">新增分类</a></small>
+			<small><a class="btn btn-primary opr" opr="new">新增{{.fname}}分类</a></small>
 		</h1>
 		<ol class="breadcrumb">
-		  <li><a href="/admin/audit/rulemanager"><i class="fa fa-dashboard"></i> 规则管理</a></li>		  
+			<li><a href="/admin/audit/recogfield"><i class="fa fa-dashboard"></i> 识别字段</a></li>
+		  	<li class="active"><a href="/admin/rulemanager/getclasslist?id={{.fid}}&fname={{.fname}}">分类列表</a></li>		  
 		</ol>
     </section>
   <!-- Main content -->
@@ -23,8 +24,6 @@
 		              <thead>
 		              <tr>
 		                <th>名称</th>
-						<th>识别字段</th>
-						<th>保存字段</th>
 						<th>时间</th>
 						<th>创建人</th>
 						<th>操作</th>
@@ -43,7 +42,9 @@
 {{template "dialog"}}
 {{template "footer"}}
 <script>
-menuActive("rulemanager")
+menuActive("recogfield")
+var fname={{.fname}};
+var fid={{.fid}};
 $(function () {
 	ttablerulemanager=$('#rulemanagerTable').DataTable({
 		"paging"      : true,
@@ -55,20 +56,18 @@ $(function () {
 		"ajax": {
 			"url": "/admin/rulemanager/getclass",
 			"type": "post",
-			"data":{}
+			"data":{"fid":fid}
 		},
 		"language": {
             "url": "/res/dist/js/dataTables.chinese.lang"
         },
 		"columns": [
             { "data": "s_name"},
-			{ "data": "s_recogfield"},
-			{ "data": "s_savefield"},
 			{ "data": "l_lasttime"},
 			{ "data": "s_user"},
 			{ "data": "_id",render:function(val,a,row){
 				return '<a class="btn btn-sm btn-info opr" opr="edit">编辑</a>'+
-					'&nbsp;&nbsp;<a class="btn btn-sm btn-warning" href="/admin/rulemanager/getrulelist?id='+val+'&cname='+row["s_recogfield"]+'">编辑规则</a>'+
+					'&nbsp;&nbsp;<a class="btn btn-sm btn-warning" href="/admin/rulemanager/getrulelist?id='+val+'&cname='+row["s_recogfield"]+'&fid='+fid+'">编辑规则</a>'+
 					'&nbsp;&nbsp;<a class="btn btn-sm btn-danger" onclick="del(\''+val+'\')">删除</a>'
 			}}
        	]
@@ -83,10 +82,9 @@ $(function () {
 				obj=ttablerulemanager.row($(this).closest("tr")).data();
 			case "new":
 				tag=[
-					{label:"名称",s_label:"s_name",must:true},
-					{label:"识别字段",s_label:"s_recogfield",must:true,type:"tpl_list_local",url:"/admin/rulemanager/getauditfield"},
-					{label:"保存字段",s_label:"s_savefield",must:false},
-					{label:"父类",s_label:"s_pid",type:"tpl_list_ajax",url:"/admin/rulemanager/getclist?nid="+(obj?obj._id:""),fun:function(){
+					{label:"名称",s_label:"s_name",must:true,type:"tpl_list_local",list:[{"s_name":"通过","_id":"通过"},{"s_name":"不通过","_id":"不通过"}],default:"通过"},
+					{label:"保存字段",s_label:"s_savefield",type:"tpl_hidden"},
+					/*{label:"父类",s_label:"s_pid",type:"tpl_list_ajax",url:"/admin/rulemanager/getclist?nid="+(obj?obj._id:""),fun:function(){
 							var ids=$("#s_pid").data("ids")
 							ids=ids||{}
 							var tid=$(this).attr("_id")
@@ -118,14 +116,17 @@ $(function () {
 								}())
 							}
 						}},
-					{label:"默认值",s_label:"s_default"},
+					*/
+					//{label:"默认值",s_label:"s_default"},
 					{label:"前置过滤",s_label:"s_class_prerule",type:"tpl_text"},
 					{s_label:"_id",type:"tpl_hidden"},
+					{s_label:"s_fid",type:"tpl_hidden",val:{{.fid}}},
+					{s_label:"s_recogfield",type:"tpl_hidden",val:{{.fname}}}
 				]
 				if(n == "new"){
-					_tit="新增分类";
+					_tit="新增_"+fname+"分类";
 				}else{
-					_tit="编辑_"+obj.s_recogfield+"分类";
+					_tit="编辑_"+fname+"分类";
 				}
 				htmlObj={
 					mutilfield:"s_pid",
@@ -143,13 +144,19 @@ $(function () {
 										return false
 									}
 									obj[el.id]=$(el).val();
+									
 								})
+								if(obj.s_name == "通过"){
+									obj.s_savefield = "ok";
+								}else{
+									obj.s_savefield = "err";
+								}
 								if (bcon){								
 									$.post("/admin/rulemanager/saveclass",obj,function(data){
 										if(data&&data.rep){
-											window.location.href="/admin/audit/rulemanager"	
+											window.location.href="/admin/rulemanager/getclasslist?id="+fid+"&fname="+fname;	
 										}else{
-											showTip(data.msg,1000)
+											showTip("已存在!",1000)
 										}
 									},'json')
 								}else{
@@ -175,7 +182,7 @@ function del(_id){
 			data:{"_id":_id},
 			success:function(r){
 				if(r.rep){				
-					window.location.href="/admin/audit/rulemanager";
+					window.location.href="/admin/rulemanager/getclasslist?id="+{{.fid}}+"&fname="+{{.fname}};
 				}else{
 					showTip("删除失败", 1000, function() {});
 				}

+ 0 - 196
src/web/templates/admin/audit_dataaudit.html

@@ -1,196 +0,0 @@
-{{template "inc"}}
-<!-- Main Header -->
-{{template "header"}}
-<!-- Left side column. 权限菜单 -->
-{{template "memu"}}
-
-<div class="content-wrapper">
-	<section class="content-header">
-		<h1>
-			<small><!--<button class="btn btn-primary" onclick="addbuyer()">新增采购单位</button>--></small>
-		</h1>
-		<ol class="breadcrumb">
-		  <li><a href="/admin/audit/dataaudit"><i class="fa fa-dashboard"></i> 数据审核</a></li>		  
-		</ol>
-    </section>
-  <!-- Main content -->
-  <section class="content">
-      <div class="row">
-	      <div class="col-xs-12">
-	        <div class="box">
-		        <div class="box-body">
-		            <table id="datawinnerTable" class="table table-bordered table-hover">
-		              <thead>
-		              <tr>
-		                <th>名称</th>
-						<th>时间</th>
-						<th>操作</th>
-		              </tr>
-		              </thead>
-		            </table>
-		        </div>
-	          <!-- /.box-body -->
-	        </div>
-        <!-- /.box -->
-		</div>
-	</div>
-  </section>
-</div>
-{{template "dialog"}}
-{{template "footer"}}
-<script>
-
-menuActive("dataaudit")
-$(function () {
-	ttable=$('#datawinnerTable').DataTable({
-		"paging"      : true,
-		"lengthChange": false,
-		"searching"   : true,
-		"ordering"    : false,
-		"info"        : true,
-		"autoWidth"   : false,
-		"ajax": {
-			"url": "/admin/audit/getauditdata",
-			"type": "post"
-		},
-		"language": {
-            "url": "/res/dist/js/dataTables.chinese.lang"
-        },
-		"columns": [
-            { "data": "s_field",render:function(val,a,row){
-				return '<a href="/admin/audit/auditlist?name='+val+'">'+val+'</a>';
-			}},
-			{ "data": "l_lasttime"},
-			{ "data": "_id",render:function(val,a,row){
-				if(row["isaudit"] == false){
-					return '<a class="btn btn-sm btn-danger" onclick="delbuyer(\''+val+'\')" >删除</a>'+
-					'&nbsp;&nbsp;<a class="btn btn-sm btn-success" href="#" onclick="auditbuyer(\''+row.s_name+'\',\''+val+'\')">审核</a>'
-				}else{																			
-					return '<a class="btn btn-sm btn-danger" onclick="delbuyer(\''+val+'\')" >删除</a>'
-				}
-			}}
-       	]
-	});
-})
-
-function addbuyer(){
-	//查询分类数据
-	bid = 1;
-	$("#buyertitleinfo").html("新增采购单位");
-	getbuyerclass("modal-info-addbuyer");
-	$("#modal-info-addbuyer").modal("show");
-	$("#buyername").val("");
-}
-//获取buyer分类
-function getbuyerclass(){
-	$("#parentclass").empty();
-	$("#childclass").empty();
-	$("#parentclass").append("<option value=''>--请选择--</option>");
-	$("#childclass").append("<option value=''>--请选择--</option>");
-	$.ajax({
-		url:"/admin/buyer/buyerclass",
-		type:"post",
-		success:function(data){
-			var classify = data.data;
-			for(var i in classify){
-				var name = classify[i]["s_name"];
-				classifymap[name] = classify[i]["child"];
-				$("#parentclass").append("<option value='"+name+"'>"+name+"</option>");
-			}
-		}
-	})
-}
-
-function saveaddbuyer(){
-	var buyername = $("#buyername").val();
-	var parentclass = $("#parentclass").val();
-	var childclass = $("#childclass").val();
-	if(parentclass == "" || childclass == "" || buyername == ""){
-		alert("表单填写不完整!");
-		return ;
-	}
-	if(bid == 1){//新增保存
-		add(buyername,parentclass,childclass);
-	}else{//审核保存确认
-		audit(parentclass,childclass);
-	}
-}
-
-//新增保存
-function add(buyername,parentclass,childclass){
-	$.ajax({
-		url:"/admin/buyer/addbuyer",
-		type:"post",
-		data:{"buyername":buyername,"parentclass":parentclass,"childclass":childclass},
-		success:function(r){
-			if(r.rep){
-				$("#modal-info-addbuyer").modal("hide");
-				showTip("保存成功", 1000, function() {});
-			}else{
-				showTip("保存失败", 1000, function() {});
-			}
-		}
-	})
-}
-//删除
-function delbuyer(_id){
-	showConfirm("确定删除?", function() {
-		$.ajax({
-			url:"/admin/buyer/delbuyer",
-			type:"post",
-			data:{"_id":_id},
-			success:function(r){
-				if(r.rep){				
-					ttable.ajax.reload();
-				}else{
-					showTip("删除失败", 1000, function() {});
-				}
-			}
-		})
-	});
-}
-
-//审核
-function auditbuyer(name,_id){
-	bid = 2;
-	getbuyerclass();
-	id = _id;
-	$("#buyername").val(name);
-	$("#buyertitleinfo").html("审核采购单位");
-	$("#modal-info-addbuyer").modal("show");
-}
-//审核确认
-function audit(parentclass,childclass){
-	var name = $("#buyername").val();
-	$("#modal-info-addbuyer").modal("hide");
-	showConfirm("确定通过?", function() {
-		$.ajax({
-			url:"/admin/buyer/auditbuyer",
-			type:"post",
-			data:{"name":name,"parentclass":parentclass,"childclass":childclass,"id":id},
-			success:function(r){
-				if(r.rep){				
-					ttable.ajax.reload();
-				}else{
-					showTip("审核失败", 1000, function() {});
-				}
-			}
-		})
-	});
-}
-
-$(document).ready(function(){
-	$("#parentclass").change(function(){
-	    var parentname = $(this).val();
-		var child = classifymap[parentname];
-		$("#childclass").empty();
-		if(child == undefined || child.length == 0 ){
-			$("#childclass").append("<option value=''>--请选择--</option>");
-		}else{
-			for(var i in child){
-				$("#childclass").append("<option value='"+child[i]+"'>"+child[i]+"</option>");
-			}
-		}
-	});
-});
-</script>

+ 168 - 0
src/web/templates/admin/audit_recogfield.html

@@ -0,0 +1,168 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+
+<div class="content-wrapper">
+	<section class="content-header">
+		<h1>
+			<small><a class="btn btn-primary opr" opr="new">新增识别字段</a></small>
+		</h1>
+		<ol class="breadcrumb">
+		  <li><a href="/admin/audit/recogfield"><i class="fa fa-dashboard"></i> 识别字段</a></li>		  
+		</ol>
+    </section>
+  <!-- Main content -->
+  <section class="content">
+      <div class="row">
+	      <div class="col-xs-12">
+	        <div class="box">
+		        <div class="box-body">
+		            <table id="recogfieldTable" class="table table-bordered table-hover">
+		              <thead>
+		              <tr>
+		                <th>名称</th>
+						<th>识别字段</th>
+						<th>时间</th>
+						<th>创建人</th>
+						<th>操作</th>
+		              </tr>
+		              </thead>
+		            </table>
+		        </div>
+	          <!-- /.box-body -->
+	        </div>
+        <!-- /.box -->
+		</div>
+	</div>
+  </section>
+</div>
+
+{{template "dialog"}}
+{{template "footer"}}
+<script>
+menuActive("recogfield")
+$(function () {
+	ttablerecogfield=$('#recogfieldTable').DataTable({
+		"paging"      : true,
+		"lengthChange": false,
+		"searching"   : true,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"ajax": {
+			"url": "/admin/rulemanager/getrecogfield",
+			"type": "post",
+			"data":{}
+		},
+		"language": {
+            "url": "/res/dist/js/dataTables.chinese.lang"
+        },
+		"columns": [
+            { "data": "s_name"},
+			{ "data": "s_recogfield"},
+			{ "data": "l_lasttime"},
+			{ "data": "s_user"},
+			{ "data": "_id",render:function(val,a,row){
+				return '<a class="btn btn-sm btn-info opr" opr="edit">编辑</a>'+
+					'&nbsp;&nbsp;<a class="btn btn-sm btn-warning" href="/admin/rulemanager/getclasslist?id='+val+'&fname='+row["s_recogfield"]+'">编辑分类</a>'+
+					'&nbsp;&nbsp;<a class="btn btn-sm btn-success" href="/admin/audit/dataaudit?name='+row["s_recogfield"]+'">数据审核</a>'+
+					'&nbsp;&nbsp;<a class="btn btn-sm btn-danger" onclick="del(\''+val+'\')">删除</a>'
+			}}
+       	]
+	});
+	ttablerecogfield.on('init.dt', function () {
+		$(".opr").click(function(){
+			var n=$(this).attr("opr");
+			var _tit="",htmlObj={},obj,tag=[];
+			//var delid=$(this).attr("value");
+			switch(n){
+			case "edit":
+				obj=ttablerecogfield.row($(this).closest("tr")).data();
+			case "new":
+				tag=[
+					{label:"名称",s_label:"s_name",must:true},
+					{label:"识别字段",s_label:"s_recogfield",must:true},
+					{label:"前置过滤",s_label:"s_recogfield_prerule",type:"tpl_text"},
+					{s_label:"_id",type:"tpl_hidden"},
+				]
+				if(n == "new"){
+					_tit="新增识别字段";
+				}else{
+					_tit="编辑_"+obj.s_recogfield+"字段";
+				}
+				htmlObj={
+					mutilfield:"s_pid",
+					title:_tit,
+					tag:tag,
+					bts:[
+						{label:"保存",class:"btn-primary",
+							fun:function(){
+								var obj={}
+								var bcon=true
+								$("#_con").find("input[id!=s_show],textarea").each(function(i,el){
+									var val=$(el).val();
+									if(el.id!="_id"&&$(el).attr("must")&&!val){
+										bcon=false
+										return false
+									}
+									obj[el.id]=$(el).val();
+								})
+								if (bcon){								
+									$.post("/admin/rulemanager/saverecogfield",obj,function(data){
+										if(data&&data.rep){
+											window.location.href="/admin/audit/rulemanager"	
+										}else{
+											showTip(data.msg,1000)
+										}
+									},'json')
+								}else{
+									alert("红色标签的表单不能为空!")
+								}
+							}
+						}
+					]
+				}
+				OpenDialog(htmlObj,obj)
+				break;
+			}
+			
+			//var multiclass = $("#_con >div:nth-child(3) input").val();
+			//if(multiclass == "是"){//多分类 显示覆盖追加
+			//	$("#_con >div:nth-child(4)").removeClass("hide");
+			//	//$("#con >div:nth-child(10) input").addAttr("must",true);
+			//}else{//不是多分类 隐藏覆盖追加
+			//	$("#_con >div:nth-child(4)").addClass("hide");
+			//}
+			
+			//$("#_con [id=u_list]:eq(0) li").click(function(){
+			//	var content = $(this).text();
+			//	if(content == "是"){
+			//		$("#_con >div:nth-child(4)").removeClass("hide");
+			//	}else if(content == "否"){
+			//		$("#_con >div:nth-child(4)").addClass("hide");
+			//	}
+			//})
+		});
+	})
+})
+
+function del(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/rulemanager/delrecogfield",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					window.location.href="/admin/audit/rulemanager";
+				}else{
+					showTip("删除失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
+
+</script>

+ 11 - 7
src/web/templates/admin/audit_rulelist.html

@@ -10,8 +10,9 @@
 			<small><a class="btn btn-primary opr" opr="new">新增{{.cname}}规则</a></small>
 		</h1>
 		<ol class="breadcrumb">
-			<li><a href="/admin/audit/rulemanager"><i class="fa fa-dashboard"></i> 规则管理</a></li>
-		  	<li class="active"><a href="/admin/rulemanager/getrulelist?id={{.cid}}&cname={{.cname}}">规则列表</a></li>
+			<li><a href="/admin/audit/recogfield"><i class="fa fa-dashboard"></i> 识别字段</a></li>
+			<li class="active"><a href="/admin/rulemanager/getclasslist?id={{.fid}}&fname={{.cname}}">分类列表</a></li>
+		  	<li class="active"><a href="/admin/rulemanager/getrulelist?id={{.cid}}&cname={{.cname}}&fid={{.fid}}">规则列表</a></li>
 		</ol>
     </section>
   <!-- Main content -->
@@ -42,9 +43,10 @@
 {{template "dialog"}}
 {{template "footer"}}
 <script>
-menuActive("rulemanager")
+menuActive("recogfield")
 var cid = {{.cid}};
 var cname = {{.cname}};
+var fid = {{.fid}};
 $(function () {
 	ttablerulemanager=$('#rulemanagerTable').DataTable({
 		"paging"      : true,
@@ -129,11 +131,13 @@ $(function () {
 			case "new":
 				tag=[
 					{label:"名称",s_label:"s_name",must:true},
-					{label:"代码",s_label:"s_code"},
+					{label:"代码",s_label:"s_code",must:true},
+					//{label:"标识",s_label:"s_isok",must:true,type:"tpl_list_local",list:[{"s_name":"wrong","_id":"wrong"},{"s_name":"right","_id":"right"}],default:"wrong"},
 					{label:"前置过滤",s_label:"s_rule_prerule",type:"tpl_text",placeholder:"XXX__YYY"},
 					{label:"规则",s_label:"s_rule",type:"tpl_text",rows:8,must:true},
 					{s_label:"_id",type:"tpl_hidden"},
 					{s_label:"s_classid",type:"tpl_hidden",val:cid},
+					{s_label:"s_pfield",type:"tpl_hidden",val:cname}
 				]
 				if(n == "new"){
 					_tit="新增_"+cname+"规则";
@@ -160,7 +164,7 @@ $(function () {
 								if (bcon){								
 									$.post("/admin/rulemanager/saverule",obj,function(data){
 										if(data&&data.rep){
-											window.location.href="/admin/rulemanager/getrulelist?id="+cid;	
+											window.location.href="/admin/rulemanager/getrulelist?id="+cid+"&cname="+cname+"&fid="+fid;	
 										}else{
 											showTip(data.msg,1000)
 										}
@@ -224,7 +228,7 @@ $(function () {
 				}
 				$.post("/admin/rulemanager/shift",{str:poststr},function(data){
 					if(data&&data.rep){
-						window.location.href="/admin/rulemanager/getrulelist?id="+cid+"&cname="+cname;						
+						window.location.href="/admin/rulemanager/getrulelist?id="+cid+"&cname="+cname+"&fid="+fid;						
 					}else{
 						showTip("移动失败", 1000, function() {});
 					}
@@ -243,7 +247,7 @@ function del(_id){
 			data:{"_id":_id},
 			success:function(r){
 				if(r.rep){				
-					window.location.href="/admin/rulemanager/getrulelist?id="+cid+"&cname="+cname;
+					window.location.href="/admin/rulemanager/getrulelist?id="+cid+"&cname="+cname+"&fid="+fid;
 				}else{
 					showTip("删除失败", 1000, function() {});
 				}

+ 1 - 12
src/web/templates/admin/com_memu.html

@@ -16,18 +16,7 @@
 			</ul>
         </li>
 		<li><a href="/admin/version"><i class="fa fa-navicon"></i><span>版本管理</span></a></li>
-		<li class="treeview">
-          	<a href="#"><i class="fa fa-navicon"></i> <span>质量审核</span>
-            <span class="pull-right-container">
-                <i class="fa fa-angle-left pull-right"></i>
-            </span>
-          	</a>
-          	<ul class="treeview-menu">
-	            <li><a href="/admin/audit/rulemanager"><i class="fa fa-link"></i>规则管理</a></li>
-				<li><a href="/admin/audit/dataaudit"><i class="fa fa-link"></i>数据审核</a></li>
-			</ul>
-        </li>
-		
+		<li><a href="/admin/audit/recogfield"><i class="fa fa-navicon"></i><span>质量审核</span></a></li>
 		<li class="treeview">
           	<a href="#"><i class="fa fa-laptop"></i> <span>统计</span>
             <span class="pull-right-container">