소스 검색

Merge branch 'master' of http://192.168.3.207:10080/qmx/jy-data-extract

zhangjinkun 6 년 전
부모
커밋
3fb3e5d990

+ 1 - 1
src/config.json

@@ -2,7 +2,7 @@
     "port": "9090",
     "mgodb": "192.168.3.207:27082",
     "dbsize": 5,
-    "dbname": "extract_v3",
+    "dbname": "extract_kf",
 	"redis":"buyer=192.168.3.18:6379,winner=192.168.3.18:6379",
     "saveresult": true,
     "fieldscore": true,

BIN
src/github.com.zip


BIN
src/github.zip


+ 242 - 0
src/jy/admin/audit/classification.go

@@ -0,0 +1,242 @@
+package audit
+
+import (
+	"fmt"
+	"regexp"
+	"strconv"
+	"strings"
+)
+
+var rc *regexp.Regexp
+var REG_A_RULE = regexp.MustCompile(`([\\+\\|\\(\\)\\^])`)
+var REG_NUM = regexp.MustCompile(`[0-9]+`)
+
+const (
+	SPLIT = "___"
+)
+
+//前置过滤
+func PreFilter(text, prerule string) string {
+	if len(prerule) > 0 {
+		taskPreruleArr := strings.Split(prerule, "\n")
+		for _, r := range taskPreruleArr {
+			rClearArr := strings.Split(r, "__")
+			if len(rClearArr) == 2 {
+				rc = regexp.MustCompile(rClearArr[0])
+				text = rc.ReplaceAllString(text, rClearArr[1])
+			}
+		}
+	}
+	return text
+}
+
+//分离正则和规则
+func AnalyRules(rules []string) [][]string {
+	res := [][]string{}
+	for i := 0; i < len(rules); i++ {
+		if strings.HasPrefix(rules[i], "'") && strings.HasSuffix(rules[i], "'") { //正则
+			res = append(res, []string{rules[i]})
+		} else { //规则
+			res = append(res, AnalyRule(rules[i]))
+		}
+	}
+	return res
+}
+
+//解析规则
+func AnalyRule(rule string) []string {
+	res := []string{}
+	ruleNew := REG_A_RULE.ReplaceAllString(rule, fmt.Sprintf("%s${1}%s", SPLIT, SPLIT))
+	ruleNewArr := strings.Split(ruleNew, SPLIT)
+	for _, key := range ruleNewArr {
+		if key != "" {
+			res = append(res, key)
+		}
+	}
+	return res
+}
+
+//分类,支持多条规则,返回文本!!!!只提供单条测试
+func ClassificationText(text string, rules [][]string) (t string, rs [][]string, rulepos int, res bool) {
+	rs = rules
+	for n, rule := range rs {
+		if len(rule) == 0 || len(rule) > 1 { //规则
+			t, rs[n], res = ComputeText(text, rule, 1)
+			if res {
+				return t, rs, n, res
+			}
+		} else if len(rule) == 1 { //正则
+			r := rule[0]
+			rss := []rune(r)
+			ru := string(rss[1 : len(rss)-1])
+			rulereg, err := regexp.Compile(ru)
+			if err != nil {
+				continue
+			}
+			textArr := rulereg.FindAllString(text, -1)
+			rs[n] = []string{fmt.Sprintf("<r class='_rf'>%s</r>", ru)}
+			if len(textArr) > 0 {
+				rs[n] = []string{fmt.Sprintf("<r class='_rt'>%s</r>", ru)}
+				text = strings.Replace(text, textArr[0], fmt.Sprintf("<r class='_and'>%s</r>", textArr[0]), 1)
+				return text, rules, n, true
+			}
+		}
+	}
+	return
+}
+
+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
+		} else if REG_NUM.MatchString(tmp) && len(tmp) == 1 {
+			continue
+		} else {
+			tmpresult := false
+			if tmp == "(" { //找出子表达式,仅限一层,现在修改为多层逻辑
+				tmpexp := []string{}
+				pos++
+				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])
+						} else {
+							num = 1
+							if (pos + 1) < len(rule) {
+								t := rule[pos+1]
+								//fmt.Println("+++++++++数字", t)
+								if REG_NUM.MatchString(t) {
+									num, _ = strconv.Atoi(t)
+								}
+							}
+							break
+						}
+					} else {
+						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] == "|" {
+					op = "|"
+				} else {
+					op = "+"
+				}
+			}
+			tclass := ""
+			if op == "+" {
+				if andB == nil {
+					andB = []bool{}
+				}
+				andB = append(andB, tmpresult)
+				tclass = "_and"
+
+			} else if op == "|" {
+				if orB == nil {
+					orB = []bool{}
+				}
+				orB = append(orB, tmpresult)
+				tclass = "_or"
+
+			} else if op == "^" {
+				if oB == nil {
+					oB = []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 CheckBool(bs []bool, flag string, num int) bool {
+	if flag == "+" {
+		if bs == nil {
+			return true
+		} else if len(bs) == 0 {
+			return false
+		} else {
+			b1 := bs[0]
+			i := 0
+			for _, v := range bs {
+				if i > 0 {
+					b1 = b1 && v
+				}
+				i++
+			}
+			return b1
+		}
+	} else if flag == "|" {
+		if bs == nil {
+			return true
+		} else if len(bs) == 0 {
+			return false
+		} else {
+			i := 0
+			for _, v := range bs {
+				if v {
+					i++
+				}
+			}
+			return i >= num
+		}
+	} else {
+		if bs == nil {
+			return false
+		} else if len(bs) == 0 {
+			return false
+		} else {
+			b1 := bs[0]
+			i := 0
+			for _, v := range bs {
+				if i > 0 {
+					b1 = b1 || v
+				}
+				i++
+			}
+			return b1
+		}
+	}
+}

+ 121 - 0
src/jy/admin/audit/dataaudit.go

@@ -0,0 +1,121 @@
+package audit
+
+import (
+	. "jy/admin"
+	. "jy/mongodbutil"
+	"log"
+	qu "qfw/util"
+	redis "qfw/util/redis"
+	"time"
+
+	"github.com/gin-gonic/gin"
+)
+
+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")
+		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)   //审核
+}
+
+func AuditData(c *gin.Context) {
+	v, _ := 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,
+		}
+		data, _ := Mgo.Find("versioninfo", query, `{"_id":-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})
+	} else {
+		c.JSON(200, gin.H{"data": map[string]interface{}{}})
+	}
+}
+
+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
+	}
+	c.JSON(200, gin.H{"data": data})
+}
+
+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})
+}
+
+func AddSave(c *gin.Context) {
+	titlename, _ := c.GetPostForm("titlename")
+	auditname, _ := c.GetPostForm("auditname")
+	parentclass, _ := c.GetPostForm("parentclass")
+	childclass, _ := c.GetPostForm("childclass")
+	update := make(map[string]interface{})
+	if titlename == "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{}{
+		"$set": update}, true, false)
+	if b { //新增的直接更新buyer redis
+		p := redis.PutCKV(titlename, titlename+"_"+auditname, 1)
+		log.Println("Add--Update "+titlename+" 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")
+	name, _ := c.GetPostForm("name")
+	_id, _ := c.GetPostForm("id")
+	parentclass, _ := c.GetPostForm("parentclass")
+	childclass, _ := c.GetPostForm("childclass")
+	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+`"}`)
+	}
+	c.JSON(200, gin.H{"rep": b})
+}

+ 324 - 0
src/jy/admin/audit/rulemanager.go

@@ -0,0 +1,324 @@
+package audit
+
+import (
+	"fmt"
+	"html/template"
+	. "jy/admin"
+	. "jy/mongodbutil"
+	qu "qfw/util"
+	"regexp"
+	"strings"
+	"time"
+
+	"github.com/gin-contrib/sessions"
+	"github.com/gin-gonic/gin"
+)
+
+func init() {
+	//列表、编辑
+	Admin.GET("/audit/rulemanager", func(c *gin.Context) {
+		c.HTML(200, "audit_rulemanager.html", nil)
+	})
+	Admin.POST("/rulemanager/getclass", GetClass)           //获取识别字段
+	Admin.POST("/rulemanager/saveclass", SaveClass)         //保存
+	Admin.POST("/rulemanager/getauditfield", GetAuditField) //获取要审核的字段
+	Admin.POST("/rulemanager/delclass", DelClass)           //删除
+	Admin.POST("/rulemanager/getclist", GetCList)           //获取父分类
+	//rule
+	Admin.GET("/rulemanager/getrulelist", func(c *gin.Context) {
+		cid := c.Query("id")
+		cname := c.Query("cname")
+		class, _ := Mgo.FindById("rc_class", cid, `{"_id":1,"s_name":1,"s_pid":1}`)
+		//级联查询,往上查
+		if class != nil && *class != nil {
+			pid := qu.ObjToString((*class)["s_pid"])
+			if pid != "" {
+				GetParent(pid, "rc_class", class)
+			}
+		}
+		rule, _ := Mgo.Find("rc_rule", `{"s_classid":"`+cid+`"}`, `{"i_order":1}`, nil, false, 0, 200)
+		Finds := map[string]interface{}{}
+		data := map[string]interface{}{}
+		for _, r := range *rule {
+			rpid := qu.ObjToString(r["s_pid"])
+			if rpid != "" {
+				if Finds[rpid] != nil {
+					r["p"] = Finds[rpid]
+				} else {
+					GetParent(rpid, "rc_rule", &r)
+					Finds[rpid] = r["p"]
+				}
+			}
+		}
+		data["rule"] = rule
+		data["class"] = class
+		c.HTML(200, "audit_rulelist.html", gin.H{"cid": cid, "cname": cname, "data": data})
+	})
+	Admin.POST("/rulemanager/getrule", GetRule)         //获取规则
+	Admin.POST("/rulemanager/saverule", SaveRule)       //保存规则
+	Admin.POST("/rulemanager/getrlist", GetRList)       //获取父分类中的所有规则
+	Admin.POST("/rulemanager/delrule", DelRule)         //删除
+	Admin.POST("/rulemanager/shift", Shift)             //移动
+	Admin.POST("/rulemanager/runruletest", RunRuleTest) //规则测试
+
+}
+func GetClass(c *gin.Context) {
+	data, _ := Mgo.Find("rc_class", nil, `{"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 SaveClass(c *gin.Context) {
+	data := GetPostForm(c)
+	_id, _ := c.GetPostForm("_id")
+	session := sessions.Default(c)
+	if _id != "" {
+		Mgo.UpdateById("rc_class", _id, map[string]interface{}{"$set": data})
+		c.JSON(200, gin.H{"rep": true})
+	} else {
+		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": "已存在!"})
+		} else {
+			data["l_lasttime"] = time.Now().Unix()
+			data["l_date"] = time.Now().Unix()
+			data["s_user"] = session.Get("username")
+			data["i_order"] = GetOrder("class")
+			Mgo.Save("rc_class", data)
+			c.JSON(200, gin.H{"rep": true})
+		}
+	}
+}
+
+func GetAuditField(c *gin.Context) {
+	v, _ := 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,
+		}
+		data, _ := Mgo.Find("versioninfo", query, `{"_id":-1}`, nil, false, -1, -1)
+		for _, d := range *data {
+			d["_id"] = qu.BsonIdToSId(d["s_field"])
+			d["s_name"] = d["s_field"]
+		}
+		c.JSON(200, gin.H{"data": data})
+	} else {
+		c.JSON(200, gin.H{"data": map[string]interface{}{}})
+	}
+}
+
+func DelClass(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	b := Mgo.Del("rc_class", `{"_id":"`+_id+`"}`)
+	if b {
+		c.JSON(200, gin.H{"rep": true})
+	} else {
+		c.JSON(200, gin.H{"rep": false})
+	}
+}
+
+func GetCList(c *gin.Context) {
+	nid := c.Query("nid")
+	query := make(map[string]interface{})
+	if nid != "" {
+		query = map[string]interface{}{
+			"_id": map[string]interface{}{
+				"$ne": qu.StringTOBsonId(nid),
+			},
+		}
+	}
+	class, _ := Mgo.Find("rc_class", query, nil, `{"s_name":1}`, false, 0, 200)
+	c.JSON(200, gin.H{"data": class})
+}
+
+func GetOrder(sel string) int {
+	q := `{"s_name":"` + sel + `"}`
+	res, _ := Mgo.FindOneByField("rc_order", q, `{"i_order":1}`)
+	v := qu.IntAllDef((*res)["i_order"], 1)
+	Mgo.Update("rc_order", q, &map[string]interface{}{
+		"s_name":  sel,
+		"i_order": (v + 1),
+	}, true, false)
+	return v
+}
+
+func GetRule(c *gin.Context) {
+	cid, _ := c.GetPostForm("cid")
+	data, _ := Mgo.Find("rc_rule", `{"s_classid":"`+cid+`"}`, `{"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 SaveRule(c *gin.Context) {
+	data := GetPostForm(c)
+	_id, _ := c.GetPostForm("_id")
+	session := sessions.Default(c)
+	var s_ruleArr []string
+	rule, _ := c.GetPostForm("s_rule")
+	rule = regexp.MustCompile("\\n|\\s+").ReplaceAllString(rule, "")
+	s_rule := strings.Split(rule, "'")
+	for k, r := range s_rule {
+		if k%2 == 1 { //奇数为正则
+			r = "'" + r + "'" //为正则加上''
+			if r != "" {
+				s_ruleArr = append(s_ruleArr, r)
+			}
+		} else {
+			fr := strings.Split(r, ",")
+			for _, frs := range fr {
+				if frs != "" {
+					s_ruleArr = append(s_ruleArr, frs)
+				}
+			}
+		}
+	}
+	data["s_rule"] = s_ruleArr
+	if _id != "" {
+		Mgo.UpdateById("rc_rule", _id, map[string]interface{}{"$set": data})
+		c.JSON(200, gin.H{"rep": true})
+	} else {
+		s_name, _ := c.GetPostForm("s_name")
+		d, _ := Mgo.FindOne("rc_rule", `{"s_name":"`+s_name+`"}`)
+		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["i_status"] = 0
+			data["i_order"] = GetOrder("rule")
+			Mgo.Save("rc_rule", data)
+			c.JSON(200, gin.H{"rep": true})
+		}
+	}
+}
+
+func GetRList(c *gin.Context) {
+	cid := c.Query("id")
+	if cid == "" {
+		c.JSON(200, gin.H{"data": map[string]interface{}{}})
+	} else {
+		//先找类
+		ids := strings.Split(cid, ",")
+		ids2 := make([]string, len(ids))
+		idsmap := []map[string]interface{}{}
+		for n, val := range ids {
+			idsmap = append(idsmap, map[string]interface{}{
+				"_id": qu.StringTOBsonId(val),
+			})
+			ids2[n] = fmt.Sprintf(`{"s_classid":"%s"}`, val)
+		}
+		class, _ := Mgo.Find("rc_class", &map[string]interface{}{
+			"$or": idsmap,
+		}, nil, `{"s_name":1}`, false, 0, 10)
+		rule, _ := Mgo.Find("rc_rule", fmt.Sprintf(`{"$or":[%s]}`, strings.Join(ids2, ",")), `{"i_order":1}`, `{"s_name":1,"s_code":1,"s_classid":1}`, false, 0, 200)
+		for _, ru := range *rule {
+			for _, c := range *class {
+				if qu.BsonIdToSId(c["_id"]) == ru["s_classid"] {
+					ru["s_name"] = fmt.Sprintf("%s[%s]", ru["s_name"], c["s_name"])
+				}
+			}
+		}
+		c.JSON(200, gin.H{"data": rule})
+	}
+}
+
+func DelRule(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	b := Mgo.Del("rc_rule", `{"_id":"`+_id+`"}`)
+	if b {
+		c.JSON(200, gin.H{"rep": true})
+	} else {
+		c.JSON(200, gin.H{"rep": false})
+	}
+}
+
+func Shift(c *gin.Context) {
+	str, _ := c.GetPostForm("str")
+	strs := strings.Split(str, ",")
+	if str == "" {
+		c.JSON(200, gin.H{"rep": false})
+	} else {
+		if Mgo.Update("rc_rule", `{"_id":"`+strs[0]+`"}`, &map[string]interface{}{
+			"$set": map[string]interface{}{
+				"i_order": qu.IntAll(strs[3]),
+			},
+		}, false, false) {
+			Mgo.Update("rc_rule", `{"_id":"`+strs[2]+`"}`, &map[string]interface{}{
+				"$set": map[string]interface{}{
+					"i_order": qu.IntAll(strs[1]),
+				},
+			}, false, false)
+			c.JSON(200, gin.H{"rep": true})
+		} else {
+			c.JSON(200, gin.H{"rep": false})
+		}
+	}
+}
+
+func RunRuleTest(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	s_con, _ := c.GetPostForm("s_con")
+	data := map[string]interface{}{
+		"b":     false,
+		"rules": "",
+		"text":  "",
+		"pos":   0,
+	}
+	if _id == "" || s_con == "" {
+		c.JSON(200, gin.H{"rep": false})
+	} else {
+		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"])) //对文本先进行前置过滤
+		fmt.Println(s_con)
+		text, rules, pos, b := ClassificationText(s_con, AnalyRules(s_rule))
+		data["b"] = b
+		data["pos"] = pos + 1
+		data["rules"] = func() template.HTML {
+			ts := []string{}
+			for ppos, s := range rules {
+				ts = append(ts, fmt.Sprintf("<p>%d.%s</p>", ppos+1, strings.Join(s, "")))
+			}
+			return template.HTML(strings.Join(ts, ""))
+		}()
+		data["text"] = template.HTML(text)
+		c.HTML(200, "checkres.html", gin.H{"data": data})
+	}
+}
+
+func GetParent(s_pid, coll string, pm *map[string]interface{}) {
+	if s_pid != "" {
+		//可能有多个父类
+		ids := strings.Split(s_pid, ",")
+		idsmap := []map[string]interface{}{}
+		for _, val := range ids {
+			idsmap = append(idsmap, map[string]interface{}{
+				"_id": qu.StringTOBsonId(val),
+			})
+		}
+		class, b := Mgo.Find(coll, &map[string]interface{}{
+			"$or": idsmap,
+		}, nil, `{"_id":1,"s_name":1,"s_pid":1}`, false, 0, 10)
+		if b && class != nil && len(*class) > 0 {
+			for _, cla := range *class {
+				pid := qu.ObjToString(cla["s_pid"])
+				GetParent(pid, coll, &cla)
+			}
+			(*pm)["p"] = class
+		}
+	}
+	return
+}

+ 9 - 4
src/jy/admin/buyermanager/buyermanage.go

@@ -20,10 +20,15 @@ func init() {
 	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("buyer_new", nil, `{"_id":-1}`, nil, false, -1, -1)
+	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
@@ -54,7 +59,7 @@ func AddBuyer(c *gin.Context) {
 //删除
 func DelBuyer(c *gin.Context) {
 	_id, _ := c.GetPostForm("_id")
-	b := Mgo.Del("buyer_new", `{"_id":"`+_id+`"}`)
+	b := Mgo.Del("audit", `{"_id":"`+_id+`"}`)
 	if b {
 		c.JSON(200, gin.H{"rep": true})
 	} else {
@@ -80,12 +85,12 @@ func AuditBuyer(c *gin.Context) {
 	if b {
 		p := redis.PutCKV("buyer", "buyer_"+name, 1)
 		log.Println("Audit--Update buyer redis:", p)
-		Mgo.Del("buyer_new", `{"_id":"`+_id+`"}`)
+		Mgo.Del("audit", `{"_id":"`+_id+`"}`)
 	}
 	c.JSON(200, gin.H{"rep": b})
 }
 
 func BuyerClass(c *gin.Context) {
-	data, _ := Mgo.Find("classify", `{"i_type":1}`, nil, `{"s_name":1,"child":1}`, false, -1, -1)
+	data, _ := Mgo.Find("classify", `{"i_type":1}`, `{"_id":-1}`, `{"s_name":1,"child":1}`, false, -1, -1)
 	c.JSON(200, gin.H{"data": data})
 }

+ 12 - 3
src/jy/admin/version.go

@@ -63,14 +63,23 @@ func init() {
 	Admin.POST("/version/use", func(c *gin.Context) {
 		_id, _ := c.GetPostForm("_id")
 		isuse, _ := c.GetPostForm("isuse")
-		if isuse == "1" { //启用确保只有一个版本
-			l, _ := Mgo.Find("version", `{"isuse":"1"}`, nil, nil, false, -1, -1)
+		if isuse == "true" { //启用确保只有一个版本
+			l, _ := Mgo.Find("version", `{"isuse":true}`, nil, nil, false, -1, -1)
 			if len(*l) > 0 {
 				c.JSON(200, gin.H{"rep": false})
 				return
 			}
 		}
-		b := Mgo.UpdateById("version", _id, `{"$set":{"isuse":"`+isuse+`"}}`)
+		bisuse := false
+		if isuse == "true" {
+			bisuse = true
+		}
+		set := map[string]interface{}{
+			"$set": map[string]interface{}{
+				"isuse": bisuse,
+			},
+		}
+		b := Mgo.UpdateById("version", _id, set)
 		c.JSON(200, gin.H{"rep": b})
 	})
 	Admin.POST("/version/del", func(c *gin.Context) {

+ 3 - 3
src/jy/admin/winnermanager/winnermanager.go

@@ -22,7 +22,7 @@ func init() {
 }
 
 func WinnerData(c *gin.Context) {
-	data, _ := Mgo.Find("winner_new", nil, `{"_id":-1}`, nil, false, -1, -1)
+	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
@@ -49,7 +49,7 @@ func AddWinner(c *gin.Context) {
 //删除
 func DelWinner(c *gin.Context) {
 	_id, _ := c.GetPostForm("_id")
-	b := Mgo.Del("winner_new", `{"_id":"`+_id+`"}`)
+	b := Mgo.Del("audit", `{"_id":"`+_id+`"}`)
 	if b {
 		c.JSON(200, gin.H{"rep": true})
 	} else {
@@ -71,7 +71,7 @@ func AuditWinner(c *gin.Context) {
 	if b {
 		p := redis.PutCKV("winner", "winner_"+name, 1)
 		log.Println("Audit--Update winner redis:", p)
-		Mgo.Del("winner_new", `{"_id":"`+_id+`"}`)
+		Mgo.Del("audit", `{"_id":"`+_id+`"}`)
 	}
 	c.JSON(200, gin.H{"rep": b})
 }

+ 6 - 4
src/jy/extract/extract.go

@@ -849,10 +849,11 @@ func BuyerAndWinner(resulttmp map[string]interface{}) {
 		i := redis.GetInt("buyer", "buyer_"+buyer)
 		//log.Println("iiiiiiiiiii", i)
 		if i == 0 {
-			buyernewdata, _ := db.Mgo.FindOne("buyer_new", `{"s_name":"`+buyer+`"}`)
+			buyernewdata, _ := db.Mgo.FindOne("audit", `{"s_field":"buyer","s_name":"`+buyer+`"}`)
 			if len(*buyernewdata) == 0 {
 				save["s_name"] = buyer
-				db.Mgo.Save("buyer_new", save)
+				save["s_field"] = "buyer"
+				db.Mgo.Save("audit", save)
 			}
 		}
 	}
@@ -862,10 +863,11 @@ func BuyerAndWinner(resulttmp map[string]interface{}) {
 		j := redis.GetInt("winner", "winner_"+winner)
 		//log.Println("jjjjjjjjjjjj", j)
 		if j == 0 {
-			winnernewdata, _ := db.Mgo.FindOne("winner_new", `{"s_name":"`+winner+`"}`)
+			winnernewdata, _ := db.Mgo.FindOne("audit", `{"s_field":"winner","s_name":"`+winner+`"}`)
 			if len(*winnernewdata) == 0 {
 				save["s_name"] = winner
-				db.Mgo.Save("winner_new", save)
+				save["s_field"] = "winner"
+				db.Mgo.Save("audit", save)
 			}
 		}
 	}

+ 1 - 0
src/main.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	_ "jy/admin"
+	_ "jy/admin/audit"
 	_ "jy/admin/buyermanager"
 	_ "jy/admin/task"
 	_ "jy/admin/winnermanager"

+ 257 - 0
src/web/templates/admin/audit_auditone.html

@@ -0,0 +1,257 @@
+{{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="addaudit()">新增{{.name}}</button></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>		  
+		</ol>
+    </section>
+  <!-- Main content -->
+  <section class="content">
+      <div class="row">
+	      <div class="col-xs-12">
+	        <div class="box">
+		        <div class="box-body">
+		            <table id="dataauditTable" class="table table-bordered table-hover">
+		              <thead>
+		              <tr>
+		                <th>{{.name}}</th>
+						<th>来源</th>
+						<th>时间</th>
+						<th>是否审核</th>
+						<th>操作</th>
+		              </tr>
+		              </thead>
+		            </table>
+		        </div>
+	          <!-- /.box-body -->
+	        </div>
+        <!-- /.box -->
+		</div>
+	</div>
+  </section>
+</div>
+
+<!--新增标签--> 
+<div class="modal fade" id="modal-info-auditdata">
+  	<div class="modal-dialog">
+	    <form id="add-dataform" class="form-horizontal" role="form">
+		<div class="modal-content">
+		    <div class="modal-header">
+		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+		          <span aria-hidden="true">&times;</span></button>
+		        <h4 class="modal-title" id="audittitleinfo"></h4>
+		    </div>
+		    <div class="modal-body">
+				<div class="form-group">
+				    <label for="code" id="labelname" class="col-sm-2 control-label">名称:</label>
+				    <div class="col-sm-10">
+					   	<input class="form-control" id="auditname"></input>
+					</div>
+				</div>
+				{{if eq .name "buyer"}}
+				<div class="form-group">
+				    <label for="code" id="labelname" class="col-sm-2 control-label">类别:</label>
+				    <div class="col-sm-10" style="display:flex;">
+					   	<select class="form-control" id="parentclass" style="margin-right:15px;"></select>
+						<select class="form-control" id="childclass"></select>
+					</div>
+				</div>
+				{{end}}
+		    </div>
+		    <div class="modal-footer">
+		        <button type="button" class="btn btn-default" data-dismiss="modal" onclick="reset()">取消</button>
+		        <button type="button" class="btn btn-primary" onclick="saveaudit()">保存</button>
+	    	</div>
+		</div>
+	    <!-- /.modal-content -->
+	    </form>
+  	</div>
+  <!-- /.modal-dialog -->
+</div>
+<!-- /.modal -->
+{{template "dialog"}}
+{{template "footer"}}
+<script>
+var id = "";
+var classifymap = {};
+var bid = 1;
+menuActive("dataaudit")
+var titlename = {{.name}}
+$(function () {
+	ttable=$('#dataauditTable').DataTable({
+		"paging"      : true,
+		"lengthChange": false,
+		"searching"   : true,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"ajax": {
+			"url": "/admin/audit/auditone",
+			"type": "post",
+			"data": {"name":titlename}
+		},
+		"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": "_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>'
+				}
+			}}
+       	]
+	});
+})
+
+function addaudit(){
+	//查询分类数据
+	bid = 1;
+	$("#audittitleinfo").html("新增"+titlename);
+	if(titlename == "buyer"){
+		getbuyerclass();
+	}
+	$("#modal-info-auditdata").modal("show");
+	$("#auditname").val("");
+}
+//获取buyer分类
+function getbuyerclass(){
+	$("#parentclass").empty();
+	$("#childclass").empty();
+	$("#parentclass").append("<option value=''>--请选择--</option>");
+	$("#childclass").append("<option value=''>--请选择--</option>");
+	$.ajax({
+		url:"/admin/audit/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 saveaudit(){
+	var parentclass = "";
+	var childclass = "";
+	var auditname = $("#auditname").val();
+	if(titlename == "buyer"){
+		parentclass = $("#parentclass").val();
+		childclass = $("#childclass").val();
+	}
+	if(auditname == ""){
+		alert("表单填写不完整!");
+		return ;
+	}else if(titlename == "buyer" && (parentclass == "" || childclass == "")){
+		alert("表单填写不完整!");
+		return ;
+	}
+	if(bid == 1){//新增保存
+		addsave(auditname,parentclass,childclass);
+	}else{//审核保存确认
+		auditsave(parentclass,childclass);
+	}
+}
+
+//新增保存
+function addsave(auditname,parentclass,childclass){
+	$.ajax({
+		url:"/admin/audit/addsave",
+		type:"post",
+		data:{"titlename":titlename,"auditname":auditname,"parentclass":parentclass,"childclass":childclass},
+		success:function(r){
+			if(r.rep){
+				$("#modal-info-auditdata").modal("hide");
+				showTip("保存成功", 1000, function() {});
+			}else{
+				showTip("保存失败", 1000, function() {});
+			}
+		}
+	})
+}
+//删除
+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){
+	bid = 2;
+	getbuyerclass();
+	id = _id;
+	$("#auditname").val(name);
+	$("#audittitleinfo").html("审核"+titlename);
+	$("#modal-info-auditdata").modal("show");
+}
+//审核确认
+function auditsave(parentclass,childclass){
+	var name = $("#auditname").val();
+	$("#modal-info-auditdata").modal("hide");
+	showConfirm("确定通过?", function() {
+		$.ajax({
+			url:"/admin/audit/auditsave",
+			type:"post",
+			data:{"titlename":titlename,"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>

+ 9 - 56
src/web/templates/admin/buyermanager_list.html → src/web/templates/admin/audit_dataaudit.html

@@ -7,10 +7,10 @@
 <div class="content-wrapper">
 	<section class="content-header">
 		<h1>
-			<small><button class="btn btn-primary" onclick="addbuyer()">新增采购单位</button></small>
+			<small><!--<button class="btn btn-primary" onclick="addbuyer()">新增采购单位</button>--></small>
 		</h1>
 		<ol class="breadcrumb">
-		  <li><a href="/admin/audit/buyermanager"><i class="fa fa-dashboard"></i> 采购单位库</a></li>		  
+		  <li><a href="/admin/audit/dataaudit"><i class="fa fa-dashboard"></i> 数据审核</a></li>		  
 		</ol>
     </section>
   <!-- Main content -->
@@ -22,10 +22,8 @@
 		            <table id="datawinnerTable" class="table table-bordered table-hover">
 		              <thead>
 		              <tr>
-		                <th>中标单位</th>
-						<th>来源</th>
+		                <th>名称</th>
 						<th>时间</th>
-						<th>审核</th>
 						<th>操作</th>
 		              </tr>
 		              </thead>
@@ -38,50 +36,11 @@
 	</div>
   </section>
 </div>
-
-<!--新增标签--> 
-<div class="modal fade" id="modal-info-addbuyer">
-  	<div class="modal-dialog">
-	    <form id="addbuyer-dataform" class="form-horizontal" role="form">
-		<div class="modal-content">
-		    <div class="modal-header">
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		          <span aria-hidden="true">&times;</span></button>
-		        <h4 class="modal-title" id="buyertitleinfo"></h4>
-		    </div>
-		    <div class="modal-body">
-				<div class="form-group">
-				    <label for="code" id="labelname" class="col-sm-2 control-label">名称:</label>
-				    <div class="col-sm-10">
-					   	<input class="form-control" id="buyername"></input>
-					</div>
-				</div>
-				<div class="form-group">
-				    <label for="code" id="labelname" class="col-sm-2 control-label">类别:</label>
-				    <div class="col-sm-10" style="display:flex;">
-					   	<select class="form-control" id="parentclass" style="margin-right:15px;"></select>
-						<select class="form-control" id="childclass"></select>
-					</div>
-				</div>
-		    </div>
-		    <div class="modal-footer">
-		        <button type="button" class="btn btn-default" data-dismiss="modal" onclick="reset()">取消</button>
-		        <button type="button" class="btn btn-primary" onclick="saveaddbuyer()">保存</button>
-	    	</div>
-		</div>
-	    <!-- /.modal-content -->
-	    </form>
-  	</div>
-  <!-- /.modal-dialog -->
-</div>
-<!-- /.modal -->
 {{template "dialog"}}
 {{template "footer"}}
 <script>
-var id = "";
-var classifymap = {};
-var bid = 1;
-menuActive("buyermanager")
+
+menuActive("dataaudit")
 $(function () {
 	ttable=$('#datawinnerTable').DataTable({
 		"paging"      : true,
@@ -91,23 +50,17 @@ $(function () {
 		"info"        : true,
 		"autoWidth"   : false,
 		"ajax": {
-			"url": "/admin/buyer/data",
+			"url": "/admin/audit/getauditdata",
 			"type": "post"
 		},
 		"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": "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>'+

+ 255 - 0
src/web/templates/admin/audit_rulelist.html

@@ -0,0 +1,255 @@
+{{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">新增{{.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>
+		</ol>
+    </section>
+  <!-- Main content -->
+  <section class="content">
+      <div class="row">
+	      <div class="col-xs-12">
+	        <div class="box">
+		        <div class="box-body">
+		            <table id="rulemanagerTable" class="table table-bordered table-hover">
+		              <thead>
+		              <tr>
+		                <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("rulemanager")
+var cid = {{.cid}};
+var cname = {{.cname}};
+$(function () {
+	ttablerulemanager=$('#rulemanagerTable').DataTable({
+		"paging"      : true,
+		"lengthChange": false,
+		"searching"   : true,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"ajax": {
+			"url": "/admin/rulemanager/getrule",
+			"type": "post",
+			"data":{"cid":cid}
+		},
+		"language": {
+            "url": "/res/dist/js/dataTables.chinese.lang"
+        },
+		"columns": [
+            { "data": "s_name"},
+			{ "data": "l_lasttime"},
+			{ "data": "s_user"},
+			{ "data": "_id",render:function(val,a,row,meta){
+				var udhtml = '&nbsp;&nbsp;<a class="btn btn-sm btn-success opr" opr="moveup" num="'+meta.row+'">上移</a>'+
+					'&nbsp;&nbsp;<a class="btn btn-sm btn-success opr" opr="movedown" num="'+meta.row+'">下移</a>';
+				if({{.data.rule}}.length ==1){//一条数据
+					udhtml = '&nbsp;&nbsp;<a class="btn btn-sm btn-success btn-default opr" opr="moveup" num="'+meta.row+'" disabled>上移</a>'+
+					'&nbsp;&nbsp;<a class="btn btn-sm btn-success btn-default opr" opr="movedown" num="'+meta.row+'" disabled>下移</a>';
+				}else if(meta.row == 0){//第一行
+					udhtml = '&nbsp;&nbsp;<a class="btn btn-sm btn-success btn-default opr" opr="moveup" num="'+meta.row+'" disabled>上移</a>'+
+					'&nbsp;&nbsp;<a class="btn btn-sm btn-success opr" opr="movedown" num="'+meta.row+'">下移</a>';
+				}else if(meta.row+1 == {{.data.rule}}.length){//最后一行
+					udhtml = '&nbsp;&nbsp;<a class="btn btn-sm btn-success opr" opr="moveup" num="'+meta.row+'">上移</a>'+
+					'&nbsp;&nbsp;<a class="btn btn-sm btn-success btn-default opr" opr="movedown" num="'+meta.row+'" disabled>下移</a>';
+				}
+				return '<a class="btn btn-sm btn-info opr" opr="edit" num="'+meta.row+'">编辑</a>'+
+					'&nbsp;&nbsp;<a class="btn btn-sm btn-warning opr" opr="ruletest" num="'+meta.row+'">测试</a>'+
+					'&nbsp;&nbsp;<a class="btn btn-sm btn-danger" onclick="del(\''+val+'\')">删除</a>'+udhtml
+					
+			}}
+       	]
+	});
+	ttablerulemanager.on('init.dt', function () {
+		$(".opr").click(function(){
+			var n=$(this).attr("opr");
+			var rownum=parseInt($(this).attr("num"));
+			var tobj = {{.data.rule}}[rownum];//本行数据
+			var _tit="",htmlObj={},obj,tag=[];
+			var delid=$(this).attr("value");
+			switch(n){
+			//测试规则
+			case "ruletest":
+				htmlObj={
+					title:"测试_规则:"+tobj["s_name"],
+					content:"<div>测试规则...</div>",
+					tag:[
+						{s_label:function(){var str="";for(var i in tobj["s_rule"]){str+="<p>"+(parseInt(i)+1)+"、"+tobj["s_rule"][i]+"</p>";}return str
+								}(),type:"tpl_small"},
+						{s_label:"s_con",type:"tpl_text",rows:18},
+						{s_label:"_id",type:"tpl_hidden",val:tobj["_id"]}
+					],
+					bts:[{label:"RUN",class:"btn-danger",
+							fun:function(){
+								var form = $('<form/>').appendTo("body");  
+							    // 设置属性  
+							    form.attr('action','/admin/rulemanager/runruletest').attr('method', 'post').attr('target', '_blank');  
+							    // 创建Input  
+							    var my_input = $('<input type="text" name="_id" />'); 
+							    my_input.attr('value', $("#_id").val()); 
+								var mytext = $('<textarea name="s_con" />') 
+								mytext.val($("#s_con").val())
+							    // 附加到Form  
+							    form.append(my_input).append(mytext); 
+							    // 提交表单  
+							    form.submit();  
+								form.remove();
+							}
+						}]
+				}
+			OpenDialog(htmlObj,obj);
+			break;
+			case "edit":			
+				obj=ttablerulemanager.row($(this).closest("tr")).data();
+			case "new":
+				tag=[
+					{label:"名称",s_label:"s_name",must:true},
+					{label:"代码",s_label:"s_code"},
+					{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},
+				]
+				if(n == "new"){
+					_tit="新增_"+cname+"规则";
+				}else{
+					_tit="编辑_"+cname+"规则:"+tobj["s_name"];
+				}
+				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/saverule",obj,function(data){
+										if(data&&data.rep){
+											window.location.href="/admin/rulemanager/getrulelist?id="+cid;	
+										}else{
+											showTip(data.msg,1000)
+										}
+									},'json')
+								}else{
+									alert("红色标签的表单不能为空!")
+								}
+							}
+						}
+					]
+				}
+			if({{.data.class.s_pid}}){
+				htmlObj.tag.push({label:"父规则",s_label:"s_pid",type:"tpl_list_ajax",url:"/admin/rulemanager/getrlist?id="+{{.data.class.s_pid}},fun:function(){
+					var ids=$("#s_pid").data("ids")
+					ids=ids||{}
+					var tid=$(this).attr("_id")
+					if(!ids[tid]){
+						ids[tid]=true
+						$("#s_pid").data("ids",ids)
+						var tpl1=$('<div class="alert alert-dismissible alert-success" style="min-width:50px;max-width:250px;font-size:10px;padding:3px;margin:5px;display:inline-block"><button type="button" class="close" data-dismiss="alert" style="right:0px;">&times;</button><span></span></div>')
+						tpl1.find("span").text($(this).text())							
+						tpl1.attr("tid",tid)
+						tpl1.find("button").click(function(){
+							var ttid=$(this).closest(".alert").attr("tid");
+							var iids=$("#s_pid").data("ids")
+							delete iids[ttid]
+							$("#s_pid").val(function(){
+								var strid=[]
+								for(var k in iids){
+									strid.push(k)
+								}
+								return strid.join(",")
+							}())
+						})
+						$("#s_pid").prev().append(tpl1)
+						$("#s_pid").val(function(){
+							var strid=[]
+							for(var k in ids){
+								strid.push(k)
+							}
+							return strid.join(",")
+						}())
+					}
+				}})
+			}
+			OpenDialog(htmlObj,obj)
+			break;
+			//上移下移
+			case "moveup":
+			case "movedown":
+				if($(this).attr("disabled")=="disabled"){
+					return
+				}
+				var poststr=""
+				if(n == "moveup"){//上移
+					var uobj = {{.data.rule}}[rownum-1];//上一行数据
+					poststr=tobj["_id"]+","+tobj["i_order"]+","+uobj["_id"]+","+uobj["i_order"]
+				}else{//下移
+					var uobj={{.data.rule}}[rownum+1];//下一行数据
+					poststr=uobj["_id"]+","+uobj["i_order"]+","+tobj["_id"]+","+tobj["i_order"]
+				}
+				$.post("/admin/rulemanager/shift",{str:poststr},function(data){
+					if(data&&data.rep){
+						window.location.href="/admin/rulemanager/getrulelist?id="+cid+"&cname="+cname;						
+					}else{
+						showTip("移动失败", 1000, function() {});
+					}
+				})
+				break;
+			}
+		});
+	})
+})
+
+function del(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/rulemanager/delrule",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					window.location.href="/admin/rulemanager/getrulelist?id="+cid+"&cname="+cname;
+				}else{
+					showTip("删除失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
+
+</script>

+ 187 - 0
src/web/templates/admin/audit_rulemanager.html

@@ -0,0 +1,187 @@
+{{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/rulemanager"><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="rulemanagerTable" class="table table-bordered table-hover">
+		              <thead>
+		              <tr>
+		                <th>名称</th>
+						<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("rulemanager")
+$(function () {
+	ttablerulemanager=$('#rulemanagerTable').DataTable({
+		"paging"      : true,
+		"lengthChange": false,
+		"searching"   : true,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"ajax": {
+			"url": "/admin/rulemanager/getclass",
+			"type": "post",
+			"data":{}
+		},
+		"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-danger" onclick="del(\''+val+'\')">删除</a>'
+			}}
+       	]
+	});
+	ttablerulemanager.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=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(){
+							var ids=$("#s_pid").data("ids")
+							ids=ids||{}
+							var tid=$(this).attr("_id")
+							if(!ids[tid]){
+								ids[tid]=true
+								$("#s_pid").data("ids",ids)
+								var tpl1=$('<div class="alert alert-dismissible alert-success" style="min-width:50px;max-width:250px;font-size:10px;padding:3px;margin:5px;display:inline-block"><button type="button" class="close" data-dismiss="alert" style="right:0px;">&times;</button><span></span></div>')
+								tpl1.find("span").text($(this).text())							
+								tpl1.attr("tid",tid)
+								tpl1.find("button").click(function(){
+									var ttid=$(this).closest(".alert").attr("tid");
+									var iids=$("#s_pid").data("ids")
+									delete iids[ttid]
+									$("#s_pid").val(function(){
+										var strid=[]
+										for(var k in iids){
+											strid.push(k)
+										}
+										return strid.join(",")
+									}())
+								})
+								$("#s_pid").prev().append(tpl1)
+								$("#s_pid").val(function(){
+									var strid=[]
+									for(var k in ids){
+										strid.push(k)
+									}
+									return strid.join(",")
+								}())
+							}
+						}},
+					{label:"默认值",s_label:"s_default"},
+					{label:"前置过滤",s_label:"s_class_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/saveclass",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;
+			}
+		});
+	})
+})
+
+function del(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/rulemanager/delclass",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					window.location.href="/admin/audit/rulemanager";
+				}else{
+					showTip("删除失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
+
+</script>

+ 51 - 0
src/web/templates/admin/checkres.html

@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+	<title>结果</title>
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<link href="/static/css/bootstrap.min.css" rel="stylesheet">
+	<script src="/static/js/jquery.js"></script>
+	</head>
+	<style>
+	._rt{
+		color:green;
+		font-weight:bolder;
+		font-size:18px;
+	}
+	._rf{
+		color:red
+	}
+	._and{
+		color:green;
+		font-weight:bolder;
+		font-size:20px;
+	}
+	._or{
+		color:#772953;
+		font-weight:bolder;
+		font-size:20px;
+	}
+	.opp{
+		color:red;
+		font-weight:bolder;
+		font-size:20px;
+	}
+	.title,.res,.pos{
+		font-size:18px;
+		font-weight:bolder;
+	}
+	.container-fluid div{
+		border-bottom:1px dashed #000;
+		margin-top:10px;
+	}
+	</style>
+<body>
+<div class="container-fluid vertical-center">
+	<div class="res"><span class="title">一、识别结果:</span>{{.data.b}}</div>
+	<div class="pos"><span class="title">二、识别位置:</span>{{.data.pos}}</div>
+	<div class="rules"><span class="title">三、识别规则:</span>{{.data.rules}}</div>
+	<div class="text"><span class="title">四、识别文本:</span>{{.data.text}}</div>
+</div>
+</body>
+</html>

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

@@ -16,8 +16,18 @@
 			</ul>
         </li>
 		<li><a href="/admin/version"><i class="fa fa-navicon"></i><span>版本管理</span></a></li>
-		<li><a href="/admin/audit/winnermanager"><i class="fa fa-laptop"></i><span>中标单位审核</span></a></li>
-		<li><a href="/admin/audit/buyermanager"><i class="fa fa-laptop"></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 class="treeview">
           	<a href="#"><i class="fa fa-laptop"></i> <span>统计</span>
             <span class="pull-right-container">

+ 6 - 6
src/web/templates/admin/version.html

@@ -69,10 +69,10 @@ $(function () {
 			{ "data": "s_descript","width":"25%"},
 			{ "data": "isuse",render:function(val,a,row){
 				tmp=""
-				if(val=="1"){
-					tmp="<a href='#' title='停用' onclick='use(\""+row._id+"\",\"0\")'><i class='fa fa-fw fa-circle text-green'></i></a>已启用"
+				if(val){
+					tmp="<a href='#' title='停用' onclick='use(\""+row._id+"\","+false+")'><i class='fa fa-fw fa-circle text-green'></i></a>已启用"
 				}else{
-					tmp="<a href='#' title='启用' onclick='use(\""+row._id+"\",\"1\")'><i class='fa fa-fw fa-circle text-red'></i></a>未启用"
+					tmp="<a href='#' title='启用' onclick='use(\""+row._id+"\","+true+")'><i class='fa fa-fw fa-circle text-red'></i></a>未启用"
 				}
 				return tmp
 			}},
@@ -145,9 +145,9 @@ $(function () {
 		});
 	})
 })
-function use(_id,utype){
+function use(_id,isuse){
 	smg=""
-	if(utype=="1"){
+	if(isuse){
 		smg="确定启用?"
 	}else{
 		smg="确定停用?"
@@ -156,7 +156,7 @@ function use(_id,utype){
 		$.ajax({
 			url:"/admin/version/use",
 			type:"post",
-			data:{"_id":_id,"isuse":utype},
+			data:{"_id":_id,"isuse":isuse},
 			success:function(r){
 				if(r.rep){				
 					ttable.ajax.reload();

+ 10 - 1
src/web/templates/admin/versioninfo.html

@@ -27,6 +27,7 @@
 						<th>属性</th>
 						<th>描述</th>
 						<th>创建人</th>
+						<th>是否审核</th>
 						<th>是否启用</th>
 						<th>逻辑</th>
 						<th>操作</th>
@@ -68,6 +69,13 @@ $(function () {
 			{ "data": "s_field"},
 			{ "data": "s_descrip"},
 			{ "data": "s_username"},
+			{ "data": "isaudit",render:function(val,a,row){
+				if(val){
+					return "是";
+				}else{
+					return "否";
+				}
+			}},
 			{ "data": "isuse",render:function(val,a,row){
 				tmp=""
 				if(val){
@@ -96,6 +104,7 @@ $(function () {
                 tag=[
 						{label:"属性名称",s_label:"s_field",type:"tpl_list_local",url:"/admin/getfields",must:true},
 						{label:"描述",s_label:"s_descrip",placeholder:"描述信息"},
+						{label:"是否审核",s_label:"isaudit",type:"tpl_list_local",list:[{"s_name":"是","_id":true},{"s_name":"否","_id":false}],default:false},
 						{label:"克隆版本",s_label:"s_pversionid",type:"tpl_list_local",url:"/admin/getversions"},
                         {s_label:"_id",type:"tpl_hidden"},
 						{s_label:"vid",type:"tpl_hidden"},
@@ -104,7 +113,7 @@ $(function () {
 				if(n=="edit"){
 					_tit="编辑-"+obj.s_field
                     tag[0]={label:"属性名称",s_label:"s_field",type:"tpl_list_local",url:"/admin/getfields",must:true,disabled:true}
-                    tag[2]={label:"克隆版本",s_label:"s_pversionid",type:"tpl_list_local",url:"/admin/getversions",disabled:true}
+                    tag[3]={label:"克隆版本",s_label:"s_pversionid",type:"tpl_list_local",url:"/admin/getversions",disabled:true}
 				}else{
 					_tit="新增字段"
 					obj={"vid":"{{.vid}}","isuse":false}

+ 0 - 192
src/web/templates/admin/winnermanager_list.html

@@ -1,192 +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="addwinner()">新增中标单位</button></small>
-		</h1>
-		<ol class="breadcrumb">
-		  <li><a href="/admin/audit/winnermanager"><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>
-						<th>审核</th>
-						<th>操作</th>
-		              </tr>
-		              </thead>
-		            </table>
-		        </div>
-	          <!-- /.box-body -->
-	        </div>
-        <!-- /.box -->
-		</div>
-	</div>
-  </section>
-</div>
-<!--新增标签--> 
-<div class="modal fade" id="modal-info-addwinner">
-  	<div class="modal-dialog">
-	    <form id="addwinner-dataform" class="form-horizontal" role="form">
-		<div class="modal-content">
-		    <div class="modal-header">
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		          <span aria-hidden="true">&times;</span></button>
-		        <h4 class="modal-title" id="winnertitleinfo"></h4>
-		    </div>
-		    <div class="modal-body">
-				<div class="form-group">
-				    <label for="code" id="labelname" class="col-sm-2 control-label">名称:</label>
-				    <div class="col-sm-10">
-					   	<input class="form-control" id="winnername"></input>
-					</div>
-				</div>
-		    </div>
-		    <div class="modal-footer">
-		        <button type="button" class="btn btn-default" data-dismiss="modal" onclick="reset()">取消</button>
-		        <button type="button" class="btn btn-primary" onclick="savewinner()">保存</button>
-	    	</div>
-		</div>
-	    <!-- /.modal-content -->
-	    </form>
-  	</div>
-  <!-- /.modal-dialog -->
-</div>
-<!-- /.modal -->
-{{template "dialog"}}
-{{template "footer"}}
-<script>
-var bid = 1;
-var id = "";
-menuActive("winnermanager")
-$(function () {
-	ttable=$('#datawinnerTable').DataTable({
-		"paging"      : false,
-		"lengthChange": false,
-		"searching"   : true,
-		"ordering"    : false,
-		"info"        : true,
-		"autoWidth"   : false,
-		"ajax": {
-			"url": "/admin/winner/data",
-			"type": "post"
-		},
-		"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": "_id",render:function(val,a,row){
-				if(row["isaudit"] == false){
-					return '<a class="btn btn-sm btn-danger" onclick="delwinner(\''+val+'\')" >删除</a>'+
-					'&nbsp;&nbsp;<a class="btn btn-sm btn-success" href="#" onclick="auditwinner(\''+row.s_name+'\',\''+val+'\')">审核</a>'
-				}else{																			
-					return '<a class="btn btn-sm btn-danger" onclick="delwinner(\''+val+'\')" >删除</a>'
-				}
-			}}
-       	]
-	});
-})
-function addwinner(){
-	bid = 1;
-	$("#winnername").val("");
-	$("#winnertitleinfo").html("新增中标单位");
-	$("#modal-info-addwinner").modal("show");
-}
-//保存
-function savewinner(){
-	var winnername = $("#winnername").val();
-	if(winnername == ""){
-		alert("表单填写不完整!");
-		return ;
-	}
-	if(bid == 1){
-		add(winnername);
-	}else{
-		auditsave(winnername);
-	}
-}
-
-//删除
-function delwinner(_id){
-	showConfirm("确定删除?", function() {
-		$.ajax({
-			url:"/admin/winner/delwinner",
-			type:"post",
-			data:{"_id":_id},
-			success:function(r){
-				if(r.rep){				
-					ttable.ajax.reload();
-				}else{
-					showTip("删除失败", 1000, function() {});
-				}
-			}
-		})
-	});
-}
-
-//审核
-function auditwinner(name,_id){
-	bid = 2;
-	id = _id;
-	$("#winnername").val(name);
-	$("#winnertitleinfo").html("审核中标单位");
-	$("#modal-info-addwinner").modal("show");
-}
-function add(winnername){
-	$.ajax({
-		url:"/admin/winner/addwinner",
-		type:"post",
-		data:{"winnername":winnername},
-		success:function(r){
-			if(r.rep){
-				$("#modal-info-addwinner").modal("hide");
-				showTip("保存成功", 1000, function() {});
-			}else{
-				showTip("保存失败", 1000, function() {});
-			}
-		}
-	})
-}
-function auditsave(name){
-	$("#modal-info-addwinner").modal("hide");
-	showConfirm("确定通过?", function() {
-		$.ajax({
-			url:"/admin/winner/auditwinner",
-			type:"post",
-			data:{"name":name,"id":id},
-			success:function(r){
-				if(r.rep){				
-					ttable.ajax.reload();
-				}else{
-					showTip("审核失败", 1000, function() {});
-				}
-			}
-		})
-	});
-}
-
-</script>