wangji 6 éve
szülő
commit
5826bc2dab

+ 426 - 412
src/jy/admin/version.go

@@ -1,412 +1,426 @@
-// version
-package admin
-
-import (
-	. "jy/mongodbutil"
-	"jy/util"
-	"net/http"
-	qu "qfw/util"
-	"strings"
-	"time"
-
-	"github.com/gin-contrib/sessions"
-	"github.com/gin-gonic/gin"
-)
-
-func init() {
-	Admin.GET("/version", func(c *gin.Context) {
-		c.HTML(
-			http.StatusOK, "version.html",
-			gin.H{},
-		)
-	})
-	//任务版本
-	Admin.POST("/version/data", func(c *gin.Context) {
-		data, _ := Mgo.Find("version", `{"delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
-		c.JSON(200, gin.H{"data": data})
-	})
-	Admin.POST("/version/save", func(c *gin.Context) {
-		_id, _ := c.GetPostForm("_id")
-		data := GetPostForm(c)
-		if _id != "" {
-			Mgo.UpdateById("version", _id, map[string]interface{}{"$set": data})
-			c.JSON(200, gin.H{"rep": true})
-		} else {
-			version, _ := c.GetPostForm("version")
-			tmp, _ := Mgo.FindOne("version", `{"version":"`+version+`","delete":false}`)
-			if len(*tmp) > 0 {
-				c.JSON(200, gin.H{"rep": false})
-			} else {
-				s_pversionid, _ := c.GetPostForm("s_pversionid")
-				iscopyfiled, _ := data["iscopyfiled"].(bool)
-				data["l_createtime"] = time.Now().Unix()
-				s_username := sessions.Default(c).Get("username").(string)
-				data["s_username"] = s_username
-				data["delete"] = false
-				vid := Mgo.Save("version", data)
-				if s_pversionid != "" {
-					copyComRules(version, s_pversionid, s_username)
-				}
-				if iscopyfiled {
-					list, _ := Mgo.Find("versioninfo", `{"vid":"`+s_pversionid+`","delete":false}`, nil, nil, false, -1, -1)
-					for _, v := range *list {
-						delete(v, "_id")
-						v["l_createtime"] = time.Now().Unix()
-						v["s_username"] = sessions.Default(c).Get("username")
-						v["l_lasttime"] = time.Now().Unix()
-						v["vid"] = vid
-						v["delete"] = false
-						pid := Mgo.Save("versioninfo", v)
-						s_field := qu.ObjToString(v["s_field"])
-						//克隆属性配置
-						copyFieldRules(vid, pid, s_field, s_pversionid, s_username)
-					}
-					//克隆分包属性
-					list2, _ := Mgo.Find("pkg_info", `{"vid":"`+s_pversionid+`","delete":false}`, nil, nil, false, -1, -1)
-					for _, v := range *list2 {
-						delete(v, "_id")
-						v["l_createtime"] = time.Now().Unix()
-						v["s_username"] = sessions.Default(c).Get("username")
-						v["l_lasttime"] = time.Now().Unix()
-						v["vid"] = vid
-						v["delete"] = false
-						pid := Mgo.Save("pkg_info", v)
-						s_field := qu.ObjToString(v["s_field"])
-						//克隆属性配置
-						copyPkgRules(vid, pid, s_field, s_pversionid, s_username)
-					}
-				}
-				c.JSON(200, gin.H{"rep": true})
-			}
-		}
-	})
-	Admin.POST("/version/use", func(c *gin.Context) {
-		_id, _ := c.GetPostForm("_id")
-		isuse, _ := c.GetPostForm("isuse")
-		if isuse == "true" { //启用确保只有一个版本
-			l, _ := Mgo.Find("version", `{"isuse":true,"delete":false}`, nil, nil, false, -1, -1)
-			if len(*l) > 0 {
-				c.JSON(200, gin.H{"rep": false})
-				return
-			}
-		}
-		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) { //删除版本
-		_id, _ := c.GetPostForm("_id")
-		s_version, _ := c.GetPostForm("version")
-		b := Mgo.UpdateById("version", _id, `{"$set":{"delete":true}}`)
-		//b := Mgo.Del("version", `{"_id":"`+_id+`"}`)
-		//级联删除
-		//刪除属性配置
-		//删除分包配置
-		//删除逻辑
-		//删除属性配置中的前置规则
-		//删除属性配置中的抽取规则
-		//删除属性配置中的后置规则
-
-		//刪除属性配置
-		go DelVersionInfo(_id)
-		//删除分包配置
-		go DelPkgInfo(_id)
-		//删除版本的通用前置规则
-		go DelRulePre(s_version)
-		//删除版本的通用后置规则
-		go DelRuleBack(s_version)
-		//删除标签库
-		go DelTag(s_version)
-		//删除版本的通用前置规则
-		go DelCleanUp(s_version)
-		c.JSON(200, gin.H{"rep": b})
-	})
-	Admin.GET("/version/info", func(c *gin.Context) {
-		vid := c.Query("vid")
-		v, _ := Mgo.Find("version", `{}`, `{"_id":-1}`, `{"version":1}`, false, -1, -1)
-		c.HTML(
-			http.StatusOK, "versioninfo.html",
-			gin.H{"vid": vid, "versions": v},
-		)
-	})
-	Admin.POST("/version/infodata", func(c *gin.Context) {
-		vid, _ := c.GetPostForm("vid")
-		list, _ := Mgo.Find("versioninfo", `{"vid":"`+vid+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
-		c.JSON(200, gin.H{"data": list, "vid": vid})
-	})
-	Admin.POST("/version/infosave", func(c *gin.Context) {
-		_id, _ := c.GetPostForm("_id")
-		data := GetPostForm(c)
-		if _id != "" {
-			Mgo.UpdateById("versioninfo", _id, map[string]interface{}{"$set": data})
-			c.JSON(200, gin.H{"rep": true})
-		} else {
-			s_field, _ := c.GetPostForm("s_field")
-			vid, _ := c.GetPostForm("vid")
-			tmp, _ := Mgo.FindOne("versioninfo", `{"s_field":"`+s_field+`","vid":"`+vid+`","delete":false}`)
-			if len(*tmp) > 0 {
-				c.JSON(200, gin.H{"rep": false})
-			} else {
-				data["l_createtime"] = time.Now().Unix()
-				data["s_username"] = sessions.Default(c).Get("username")
-				data["l_lasttime"] = time.Now().Unix()
-				data["delete"] = false
-				pid := Mgo.Save("versioninfo", data)
-				fromvid, _ := data["s_pversionid"].(string)
-				if fromvid != "" {
-					copyFieldRules(vid, pid, s_field, fromvid, sessions.Default(c).Get("username").(string))
-				}
-				c.JSON(200, gin.H{"rep": true})
-			}
-		}
-	})
-	Admin.POST("/version/infouse", func(c *gin.Context) {
-		_id, _ := c.GetPostForm("_id")
-		isuse, _ := c.GetPostForm("isuse")
-		b := Mgo.UpdateById("versioninfo", _id, `{"$set":{"isuse":`+isuse+`}}`)
-		c.JSON(200, gin.H{"rep": b})
-	})
-	Admin.POST("/version/infodel", func(c *gin.Context) {
-		_id, _ := c.GetPostForm("_id")
-		b := Mgo.UpdateById("versioninfo", _id, `{"$set":{"delete":true}}`)
-		v, _ := Mgo.FindById("versioninfo", _id, `{"vid":1}`)
-		go DelLogic(qu.ObjToString((*v)["vid"]), _id)
-		//b := Mgo.Del("versioninfo", `{"_id":"`+_id+`"}`)
-		c.JSON(200, gin.H{"rep": b})
-	})
-	Admin.GET("/version/pkginfo", func(c *gin.Context) {
-		vid := c.Query("vid")
-		c.HTML(
-			http.StatusOK, "pkg_info.html",
-			gin.H{"vid": vid},
-		)
-	})
-	Admin.POST("/version/pkginfodata", func(c *gin.Context) {
-		vid, _ := c.GetPostForm("vid")
-		list, _ := Mgo.Find("pkg_info", `{"vid":"`+vid+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
-		c.JSON(200, gin.H{"data": list, "vid": vid})
-	})
-	Admin.POST("/version/pkginfosave", func(c *gin.Context) {
-		_id, _ := c.GetPostForm("_id")
-		data := GetPostForm(c)
-		if _id != "" {
-			Mgo.UpdateById("pkg_info", _id, map[string]interface{}{"$set": data})
-			c.JSON(200, gin.H{"rep": true})
-		} else {
-			s_field, _ := c.GetPostForm("s_field")
-			vid, _ := c.GetPostForm("vid")
-			tmp, _ := Mgo.FindOne("pkg_info", `{"s_field":"`+s_field+`","vid":"`+vid+`","delete":false}`)
-			if len(*tmp) > 0 {
-				c.JSON(200, gin.H{"rep": false})
-			} else {
-				data["l_createtime"] = time.Now().Unix()
-				data["s_username"] = sessions.Default(c).Get("username")
-				data["l_lasttime"] = time.Now().Unix()
-				data["delete"] = false
-				pid := Mgo.Save("pkg_info", data)
-				fromvid, _ := data["s_pversionid"].(string)
-				if fromvid != "" {
-					//克隆分包属性
-					copyPkgRules(vid, pid, s_field, fromvid, sessions.Default(c).Get("username").(string))
-				}
-				c.JSON(200, gin.H{"rep": true})
-			}
-		}
-	})
-	Admin.POST("/version/pkginfouse", func(c *gin.Context) {
-		_id, _ := c.GetPostForm("_id")
-		isuse, _ := c.GetPostForm("isuse")
-		b := Mgo.UpdateById("pkg_info", _id, `{"$set":{"isuse":`+isuse+`}}`)
-		c.JSON(200, gin.H{"rep": b})
-	})
-	Admin.POST("/version/pkginfodel", func(c *gin.Context) {
-		_id, _ := c.GetPostForm("_id")
-		b := Mgo.UpdateById("pkg_info", _id, `{"$set":{"delete":true}}`)
-		v, _ := Mgo.FindById("pkg_info", _id, `{"vid":1}`)
-		go DelPkgLogic(qu.ObjToString((*v)["vid"]), _id)
-		//b := Mgo.Del("versioninfo", `{"_id":"`+_id+`"}`)
-		c.JSON(200, gin.H{"rep": b})
-	})
-}
-
-//克隆版本通用属性
-func copyComRules(version, pvid, s_username string) {
-	tmp, _ := Mgo.FindById("version", pvid, nil)
-	oldversion := (*tmp)["version"].(string)
-	//克隆前置规则
-	plist, _ := Mgo.Find("rule_pre", `{"s_version":"`+oldversion+`","delete":false}`, nil, nil, false, -1, -1)
-	for _, v := range *plist {
-		delete(v, "_id")
-		v["s_version"] = version
-		v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
-		v["s_username"] = s_username
-		v["l_createtime"] = time.Now().Unix()
-		v["l_lasttime"] = time.Now().Unix()
-		Mgo.Save("rule_pre", v)
-	}
-	//克隆后置规则
-	blist, _ := Mgo.Find("rule_back", `{"s_version":"`+oldversion+`","delete":false}`, nil, nil, false, -1, -1)
-	for _, v := range *blist {
-		delete(v, "_id")
-		v["s_version"] = version
-		v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
-		v["s_username"] = s_username
-		v["l_createtime"] = time.Now().Unix()
-		v["l_lasttime"] = time.Now().Unix()
-		Mgo.Save("rule_back", v)
-	}
-	//克隆tag
-	tlist, _ := Mgo.Find("tag", `{"s_version":"`+oldversion+`","delete":false}`, nil, nil, false, -1, -1)
-	for _, v := range *tlist {
-		oldId := qu.BsonIdToSId(v["_id"])
-		delete(v, "_id")
-		v["s_version"] = version
-		v["s_creater"] = s_username
-		v["l_intime"] = time.Now().Unix()
-		newId := Mgo.Save("tag", v) //克隆父标签
-		td, _ := Mgo.Find("tagdetailinfo", `{"s_parentid":"`+oldId+`","delete":false}`, nil, nil, false, -1, -1)
-		for _, v2 := range *td {
-			delete(v2, "_id")
-			v2["s_version"] = version
-			v2["s_creater"] = s_username
-			v2["l_intime"] = time.Now().Unix()
-			v2["s_parentid"] = newId
-			Mgo.Save("tagdetailinfo", v2) //克隆详细标签
-		}
-	}
-	//克隆函数
-	clist, _ := Mgo.Find("cleanup", `{"s_version":"`+oldversion+`","delete":false}`, nil, nil, false, -1, -1)
-	for _, v := range *clist {
-		delete(v, "_id")
-		v["s_version"] = version
-		v["s_creater"] = s_username
-		v["l_intime"] = time.Now().Unix()
-		Mgo.Save("cleanup", v)
-	}
-}
-
-func copyPkgRules(vid, pid, s_field, oldvid, s_username string) {
-	tmp, _ := Mgo.FindOne("pkg_info", `{"vid":"`+oldvid+`","s_field":"`+s_field+`","delete":false}`)
-	oldpid := qu.BsonIdToSId((*tmp)["_id"])
-	//克隆逻辑列表
-	logicList, _ := Mgo.Find("pkg_logic", `{"vid":"`+oldvid+`","pid":"`+oldpid+`","delete":false}`, `{"_id":1}`, nil, false, -1, -1)
-	for _, logic := range *logicList {
-		if len(logic) > 0 {
-			oldsid := qu.BsonIdToSId(logic["_id"])
-			delete(logic, "_id")
-			logic["vid"] = vid
-			logic["pid"] = pid
-			logic["l_createtime"] = time.Now().Unix()
-			logic["l_lasttime"] = time.Now().Unix()
-			logic["s_username"] = s_username
-			sid := Mgo.Save("pkg_logic", logic)
-			//克隆过滤规则
-			blist, _ := Mgo.Find("pkg_logicback", `{"sid":"`+oldsid+`","delete":false}`, `{"_id":1}`, nil, false, -1, -1)
-			for _, v := range *blist {
-				delete(v, "_id")
-				v["vid"] = vid
-				v["pid"] = pid
-				v["sid"] = sid
-				v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
-				v["s_username"] = s_username
-				v["l_createtime"] = time.Now().Unix()
-				v["l_lasttime"] = time.Now().Unix()
-				Mgo.Save("pkg_logicback", v)
-			}
-		}
-	}
-
-}
-
-//克隆版本Field
-func copyFieldRules(vid, pid, s_field, oldvid, s_username string) {
-	tmp, _ := Mgo.FindOne("versioninfo", `{"vid":"`+oldvid+`","s_field":"`+s_field+`","delete":false}`)
-	oldpid := qu.BsonIdToSId((*tmp)["_id"])
-	//克隆逻辑列表
-	logicList, _ := Mgo.Find("rule_logic", `{"vid":"`+oldvid+`","pid":"`+oldpid+`","delete":false}`, `{"_id":1}`, nil, false, -1, -1)
-	for _, logic := range *logicList {
-		if len(logic) > 0 {
-			oldsid := qu.BsonIdToSId(logic["_id"])
-			delete(logic, "_id")
-			logic["vid"] = vid
-			logic["pid"] = pid
-			logic["l_createtime"] = time.Now().Unix()
-			logic["l_lasttime"] = time.Now().Unix()
-			logic["s_username"] = s_username
-			sid := Mgo.Save("rule_logic", logic)
-			//克隆前置规则
-			plist, _ := Mgo.Find("rule_logicpre", `{"sid":"`+oldsid+`","delete":false}`, nil, nil, false, -1, -1)
-			for _, v := range *plist {
-				delete(v, "_id")
-				v["vid"] = vid
-				v["pid"] = pid
-				v["sid"] = sid
-				v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
-				v["s_username"] = s_username
-				v["l_createtime"] = time.Now().Unix()
-				v["l_lasttime"] = time.Now().Unix()
-				Mgo.Save("rule_logicpre", v)
-			}
-			//克隆抽取规则
-			elist, _ := Mgo.Find("rule_logicore", `{"sid":"`+oldsid+`","delete":false}`, nil, nil, false, -1, -1)
-			for _, v := range *elist {
-				delete(v, "_id")
-				v["vid"] = vid
-				v["pid"] = pid
-				v["sid"] = sid
-				v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
-				v["s_username"] = s_username
-				v["l_createtime"] = time.Now().Unix()
-				v["l_lasttime"] = time.Now().Unix()
-				Mgo.Save("rule_logicore", v)
-			}
-			//克隆过滤规则
-			blist, _ := Mgo.Find("rule_logicback", `{"sid":"`+oldsid+`","delete":false}`, nil, nil, false, -1, -1)
-			for _, v := range *blist {
-				delete(v, "_id")
-				v["vid"] = vid
-				v["pid"] = pid
-				v["sid"] = sid
-				v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
-				v["s_username"] = s_username
-				v["l_createtime"] = time.Now().Unix()
-				v["l_lasttime"] = time.Now().Unix()
-				Mgo.Save("rule_logicback", v)
-			}
-		}
-	}
-
-}
-
-//克隆清理版本Field
-func copyClearRuleLogic(vid, pid, s_field, oldvid, s_username string) {
-	tmp, _ := Mgo.FindOne("clearversioninfo", `{"vid":"`+oldvid+`","s_field":"`+s_field+`","delete":false}`)
-	oldpid := qu.BsonIdToSId((*tmp)["_id"])
-	elist, _ := Mgo.Find("clearulelogic", `{"vid":"`+oldvid+`","pid":"`+oldpid+`","delete":false}`, nil, nil, false, -1, -1)
-	for _, v := range *elist {
-		delete(v, "_id")
-		v["vid"] = vid
-		v["pid"] = pid
-		v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
-		v["s_username"] = s_username
-		v["l_createtime"] = time.Now().Unix()
-		v["l_lasttime"] = time.Now().Unix()
-		Mgo.Save("clearulelogic", v)
-	}
-
-}
-
-//获取代码
-func getCode(code string) string {
-	tmps := strings.Split(code, "_")
-	tmp := tmps[:len(tmps)-1]
-	return strings.Join(tmp, "_")
-}
+// version
+package admin
+
+import (
+	"github.com/gin-contrib/sessions"
+	"github.com/gin-gonic/gin"
+	"gopkg.in/mgo.v2/bson"
+	. "jy/mongodbutil"
+	"jy/util"
+	"net/http"
+	qu "qfw/util"
+	"strings"
+	"time"
+)
+
+func init() {
+	Admin.GET("/version", func(c *gin.Context) {
+		c.HTML(
+			http.StatusOK, "version.html",
+			gin.H{},
+		)
+	})
+	//任务版本
+	Admin.POST("/version/data", func(c *gin.Context) {
+		data, _ := Mgo.Find("version", `{"delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
+		c.JSON(200, gin.H{"data": data})
+	})
+	//根据_id查询版本详细信息
+	Admin.GET("/version/dataById", func(c *gin.Context) {
+		gid ,b :=c.GetQuery("_id")
+		if !b || !bson.IsObjectIdHex(gid){
+			c.JSON(400,gin.H{"req":false})
+			return
+		}
+
+		data, _ := Mgo.FindOne("version", `{"_id":"`+gid+`","delete":false}`)
+		c.JSON(200, gin.H{"req":true,"data": data})
+	})
+	Admin.POST("/version/save", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		data := GetPostForm(c)
+		if data["s_filefileds"]!=nil{
+			data["s_filefileds"] = strings.Split(data["s_filefileds"].(string),",")
+		}
+		if _id != "" {
+			Mgo.UpdateById("version", _id, map[string]interface{}{"$set": data})
+			c.JSON(200, gin.H{"rep": true})
+		} else {
+			version, _ := c.GetPostForm("version")
+			tmp, _ := Mgo.FindOne("version", `{"version":"`+version+`","delete":false}`)
+			if len(*tmp) > 0 {
+				c.JSON(200, gin.H{"rep": false})
+			} else {
+				s_pversionid, _ := c.GetPostForm("s_pversionid")
+				iscopyfiled, _ := data["iscopyfiled"].(bool)
+				data["l_createtime"] = time.Now().Unix()
+				s_username := sessions.Default(c).Get("username").(string)
+				data["s_username"] = s_username
+				data["delete"] = false
+				vid := Mgo.Save("version", data)
+				if s_pversionid != "" {
+					copyComRules(version, s_pversionid, s_username)
+				}
+				if iscopyfiled {
+					list, _ := Mgo.Find("versioninfo", `{"vid":"`+s_pversionid+`","delete":false}`, nil, nil, false, -1, -1)
+					for _, v := range *list {
+						delete(v, "_id")
+						v["l_createtime"] = time.Now().Unix()
+						v["s_username"] = sessions.Default(c).Get("username")
+						v["l_lasttime"] = time.Now().Unix()
+						v["vid"] = vid
+						v["delete"] = false
+						pid := Mgo.Save("versioninfo", v)
+						s_field := qu.ObjToString(v["s_field"])
+						//克隆属性配置
+						copyFieldRules(vid, pid, s_field, s_pversionid, s_username)
+					}
+					//克隆分包属性
+					list2, _ := Mgo.Find("pkg_info", `{"vid":"`+s_pversionid+`","delete":false}`, nil, nil, false, -1, -1)
+					for _, v := range *list2 {
+						delete(v, "_id")
+						v["l_createtime"] = time.Now().Unix()
+						v["s_username"] = sessions.Default(c).Get("username")
+						v["l_lasttime"] = time.Now().Unix()
+						v["vid"] = vid
+						v["delete"] = false
+						pid := Mgo.Save("pkg_info", v)
+						s_field := qu.ObjToString(v["s_field"])
+						//克隆属性配置
+						copyPkgRules(vid, pid, s_field, s_pversionid, s_username)
+					}
+				}
+				c.JSON(200, gin.H{"rep": true})
+			}
+		}
+	})
+	Admin.POST("/version/use", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		isuse, _ := c.GetPostForm("isuse")
+		if isuse == "true" { //启用确保只有一个版本
+			l, _ := Mgo.Find("version", `{"isuse":true,"delete":false}`, nil, nil, false, -1, -1)
+			if len(*l) > 0 {
+				c.JSON(200, gin.H{"rep": false})
+				return
+			}
+		}
+		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) { //删除版本
+		_id, _ := c.GetPostForm("_id")
+		s_version, _ := c.GetPostForm("version")
+		b := Mgo.UpdateById("version", _id, `{"$set":{"delete":true}}`)
+		//b := Mgo.Del("version", `{"_id":"`+_id+`"}`)
+		//级联删除
+		//刪除属性配置
+		//删除分包配置
+		//删除逻辑
+		//删除属性配置中的前置规则
+		//删除属性配置中的抽取规则
+		//删除属性配置中的后置规则
+
+		//刪除属性配置
+		go DelVersionInfo(_id)
+		//删除分包配置
+		go DelPkgInfo(_id)
+		//删除版本的通用前置规则
+		go DelRulePre(s_version)
+		//删除版本的通用后置规则
+		go DelRuleBack(s_version)
+		//删除标签库
+		go DelTag(s_version)
+		//删除版本的通用前置规则
+		go DelCleanUp(s_version)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	Admin.GET("/version/info", func(c *gin.Context) {
+		vid := c.Query("vid")
+		v, _ := Mgo.Find("version", `{}`, `{"_id":-1}`, `{"version":1}`, false, -1, -1)
+		c.HTML(
+			http.StatusOK, "versioninfo.html",
+			gin.H{"vid": vid, "versions": v},
+		)
+	})
+	Admin.POST("/version/infodata", func(c *gin.Context) {
+		vid, _ := c.GetPostForm("vid")
+		list, _ := Mgo.Find("versioninfo", `{"vid":"`+vid+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
+		c.JSON(200, gin.H{"data": list, "vid": vid})
+	})
+	Admin.POST("/version/infosave", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		data := GetPostForm(c)
+		if _id != "" {
+			Mgo.UpdateById("versioninfo", _id, map[string]interface{}{"$set": data})
+			c.JSON(200, gin.H{"rep": true})
+		} else {
+			s_field, _ := c.GetPostForm("s_field")
+			vid, _ := c.GetPostForm("vid")
+			tmp, _ := Mgo.FindOne("versioninfo", `{"s_field":"`+s_field+`","vid":"`+vid+`","delete":false}`)
+			if len(*tmp) > 0 {
+				c.JSON(200, gin.H{"rep": false})
+			} else {
+				data["l_createtime"] = time.Now().Unix()
+				data["s_username"] = sessions.Default(c).Get("username")
+				data["l_lasttime"] = time.Now().Unix()
+				data["delete"] = false
+				pid := Mgo.Save("versioninfo", data)
+				fromvid, _ := data["s_pversionid"].(string)
+				if fromvid != "" {
+					copyFieldRules(vid, pid, s_field, fromvid, sessions.Default(c).Get("username").(string))
+				}
+				c.JSON(200, gin.H{"rep": true})
+			}
+		}
+	})
+	Admin.POST("/version/infouse", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		isuse, _ := c.GetPostForm("isuse")
+		b := Mgo.UpdateById("versioninfo", _id, `{"$set":{"isuse":`+isuse+`}}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	Admin.POST("/version/infodel", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		b := Mgo.UpdateById("versioninfo", _id, `{"$set":{"delete":true}}`)
+		v, _ := Mgo.FindById("versioninfo", _id, `{"vid":1}`)
+		go DelLogic(qu.ObjToString((*v)["vid"]), _id)
+		//b := Mgo.Del("versioninfo", `{"_id":"`+_id+`"}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	Admin.GET("/version/pkginfo", func(c *gin.Context) {
+		vid := c.Query("vid")
+		c.HTML(
+			http.StatusOK, "pkg_info.html",
+			gin.H{"vid": vid},
+		)
+	})
+	Admin.POST("/version/pkginfodata", func(c *gin.Context) {
+		vid, _ := c.GetPostForm("vid")
+		list, _ := Mgo.Find("pkg_info", `{"vid":"`+vid+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
+		c.JSON(200, gin.H{"data": list, "vid": vid})
+	})
+	Admin.POST("/version/pkginfosave", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		data := GetPostForm(c)
+		if _id != "" {
+			Mgo.UpdateById("pkg_info", _id, map[string]interface{}{"$set": data})
+			c.JSON(200, gin.H{"rep": true})
+		} else {
+			s_field, _ := c.GetPostForm("s_field")
+			vid, _ := c.GetPostForm("vid")
+			tmp, _ := Mgo.FindOne("pkg_info", `{"s_field":"`+s_field+`","vid":"`+vid+`","delete":false}`)
+			if len(*tmp) > 0 {
+				c.JSON(200, gin.H{"rep": false})
+			} else {
+				data["l_createtime"] = time.Now().Unix()
+				data["s_username"] = sessions.Default(c).Get("username")
+				data["l_lasttime"] = time.Now().Unix()
+				data["delete"] = false
+				pid := Mgo.Save("pkg_info", data)
+				fromvid, _ := data["s_pversionid"].(string)
+				if fromvid != "" {
+					//克隆分包属性
+					copyPkgRules(vid, pid, s_field, fromvid, sessions.Default(c).Get("username").(string))
+				}
+				c.JSON(200, gin.H{"rep": true})
+			}
+		}
+	})
+	Admin.POST("/version/pkginfouse", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		isuse, _ := c.GetPostForm("isuse")
+		b := Mgo.UpdateById("pkg_info", _id, `{"$set":{"isuse":`+isuse+`}}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	Admin.POST("/version/pkginfodel", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		b := Mgo.UpdateById("pkg_info", _id, `{"$set":{"delete":true}}`)
+		v, _ := Mgo.FindById("pkg_info", _id, `{"vid":1}`)
+		go DelPkgLogic(qu.ObjToString((*v)["vid"]), _id)
+		//b := Mgo.Del("versioninfo", `{"_id":"`+_id+`"}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+}
+
+//克隆版本通用属性
+func copyComRules(version, pvid, s_username string) {
+	tmp, _ := Mgo.FindById("version", pvid, nil)
+	oldversion := (*tmp)["version"].(string)
+	//克隆前置规则
+	plist, _ := Mgo.Find("rule_pre", `{"s_version":"`+oldversion+`","delete":false}`, nil, nil, false, -1, -1)
+	for _, v := range *plist {
+		delete(v, "_id")
+		v["s_version"] = version
+		v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
+		v["s_username"] = s_username
+		v["l_createtime"] = time.Now().Unix()
+		v["l_lasttime"] = time.Now().Unix()
+		Mgo.Save("rule_pre", v)
+	}
+	//克隆后置规则
+	blist, _ := Mgo.Find("rule_back", `{"s_version":"`+oldversion+`","delete":false}`, nil, nil, false, -1, -1)
+	for _, v := range *blist {
+		delete(v, "_id")
+		v["s_version"] = version
+		v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
+		v["s_username"] = s_username
+		v["l_createtime"] = time.Now().Unix()
+		v["l_lasttime"] = time.Now().Unix()
+		Mgo.Save("rule_back", v)
+	}
+	//克隆tag
+	tlist, _ := Mgo.Find("tag", `{"s_version":"`+oldversion+`","delete":false}`, nil, nil, false, -1, -1)
+	for _, v := range *tlist {
+		oldId := qu.BsonIdToSId(v["_id"])
+		delete(v, "_id")
+		v["s_version"] = version
+		v["s_creater"] = s_username
+		v["l_intime"] = time.Now().Unix()
+		newId := Mgo.Save("tag", v) //克隆父标签
+		td, _ := Mgo.Find("tagdetailinfo", `{"s_parentid":"`+oldId+`","delete":false}`, nil, nil, false, -1, -1)
+		for _, v2 := range *td {
+			delete(v2, "_id")
+			v2["s_version"] = version
+			v2["s_creater"] = s_username
+			v2["l_intime"] = time.Now().Unix()
+			v2["s_parentid"] = newId
+			Mgo.Save("tagdetailinfo", v2) //克隆详细标签
+		}
+	}
+	//克隆函数
+	clist, _ := Mgo.Find("cleanup", `{"s_version":"`+oldversion+`","delete":false}`, nil, nil, false, -1, -1)
+	for _, v := range *clist {
+		delete(v, "_id")
+		v["s_version"] = version
+		v["s_creater"] = s_username
+		v["l_intime"] = time.Now().Unix()
+		Mgo.Save("cleanup", v)
+	}
+}
+
+func copyPkgRules(vid, pid, s_field, oldvid, s_username string) {
+	tmp, _ := Mgo.FindOne("pkg_info", `{"vid":"`+oldvid+`","s_field":"`+s_field+`","delete":false}`)
+	oldpid := qu.BsonIdToSId((*tmp)["_id"])
+	//克隆逻辑列表
+	logicList, _ := Mgo.Find("pkg_logic", `{"vid":"`+oldvid+`","pid":"`+oldpid+`","delete":false}`, `{"_id":1}`, nil, false, -1, -1)
+	for _, logic := range *logicList {
+		if len(logic) > 0 {
+			oldsid := qu.BsonIdToSId(logic["_id"])
+			delete(logic, "_id")
+			logic["vid"] = vid
+			logic["pid"] = pid
+			logic["l_createtime"] = time.Now().Unix()
+			logic["l_lasttime"] = time.Now().Unix()
+			logic["s_username"] = s_username
+			sid := Mgo.Save("pkg_logic", logic)
+			//克隆过滤规则
+			blist, _ := Mgo.Find("pkg_logicback", `{"sid":"`+oldsid+`","delete":false}`, `{"_id":1}`, nil, false, -1, -1)
+			for _, v := range *blist {
+				delete(v, "_id")
+				v["vid"] = vid
+				v["pid"] = pid
+				v["sid"] = sid
+				v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
+				v["s_username"] = s_username
+				v["l_createtime"] = time.Now().Unix()
+				v["l_lasttime"] = time.Now().Unix()
+				Mgo.Save("pkg_logicback", v)
+			}
+		}
+	}
+
+}
+
+//克隆版本Field
+func copyFieldRules(vid, pid, s_field, oldvid, s_username string) {
+	tmp, _ := Mgo.FindOne("versioninfo", `{"vid":"`+oldvid+`","s_field":"`+s_field+`","delete":false}`)
+	oldpid := qu.BsonIdToSId((*tmp)["_id"])
+	//克隆逻辑列表
+	logicList, _ := Mgo.Find("rule_logic", `{"vid":"`+oldvid+`","pid":"`+oldpid+`","delete":false}`, `{"_id":1}`, nil, false, -1, -1)
+	for _, logic := range *logicList {
+		if len(logic) > 0 {
+			oldsid := qu.BsonIdToSId(logic["_id"])
+			delete(logic, "_id")
+			logic["vid"] = vid
+			logic["pid"] = pid
+			logic["l_createtime"] = time.Now().Unix()
+			logic["l_lasttime"] = time.Now().Unix()
+			logic["s_username"] = s_username
+			sid := Mgo.Save("rule_logic", logic)
+			//克隆前置规则
+			plist, _ := Mgo.Find("rule_logicpre", `{"sid":"`+oldsid+`","delete":false}`, nil, nil, false, -1, -1)
+			for _, v := range *plist {
+				delete(v, "_id")
+				v["vid"] = vid
+				v["pid"] = pid
+				v["sid"] = sid
+				v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
+				v["s_username"] = s_username
+				v["l_createtime"] = time.Now().Unix()
+				v["l_lasttime"] = time.Now().Unix()
+				Mgo.Save("rule_logicpre", v)
+			}
+			//克隆抽取规则
+			elist, _ := Mgo.Find("rule_logicore", `{"sid":"`+oldsid+`","delete":false}`, nil, nil, false, -1, -1)
+			for _, v := range *elist {
+				delete(v, "_id")
+				v["vid"] = vid
+				v["pid"] = pid
+				v["sid"] = sid
+				v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
+				v["s_username"] = s_username
+				v["l_createtime"] = time.Now().Unix()
+				v["l_lasttime"] = time.Now().Unix()
+				Mgo.Save("rule_logicore", v)
+			}
+			//克隆过滤规则
+			blist, _ := Mgo.Find("rule_logicback", `{"sid":"`+oldsid+`","delete":false}`, nil, nil, false, -1, -1)
+			for _, v := range *blist {
+				delete(v, "_id")
+				v["vid"] = vid
+				v["pid"] = pid
+				v["sid"] = sid
+				v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
+				v["s_username"] = s_username
+				v["l_createtime"] = time.Now().Unix()
+				v["l_lasttime"] = time.Now().Unix()
+				Mgo.Save("rule_logicback", v)
+			}
+		}
+	}
+
+}
+
+//克隆清理版本Field
+func copyClearRuleLogic(vid, pid, s_field, oldvid, s_username string) {
+	tmp, _ := Mgo.FindOne("clearversioninfo", `{"vid":"`+oldvid+`","s_field":"`+s_field+`","delete":false}`)
+	oldpid := qu.BsonIdToSId((*tmp)["_id"])
+	elist, _ := Mgo.Find("clearulelogic", `{"vid":"`+oldvid+`","pid":"`+oldpid+`","delete":false}`, nil, nil, false, -1, -1)
+	for _, v := range *elist {
+		delete(v, "_id")
+		v["vid"] = vid
+		v["pid"] = pid
+		v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
+		v["s_username"] = s_username
+		v["l_createtime"] = time.Now().Unix()
+		v["l_lasttime"] = time.Now().Unix()
+		Mgo.Save("clearulelogic", v)
+	}
+
+}
+
+//获取代码
+func getCode(code string) string {
+	tmps := strings.Split(code, "_")
+	tmp := tmps[:len(tmps)-1]
+	return strings.Join(tmp, "_")
+}

+ 7 - 6
src/jy/extract/exportask.go

@@ -59,6 +59,9 @@ func extractAndExport(v string, t map[string]interface{}) {
 	//品牌抽取是否开启
 	ju.IsBrandGoods = ju.Config["brandgoods"].(bool)
 
+	//附件抽取是否开启
+	e.InitFile()
+
 	query := t["query"]
 	limit := qu.IntAll(t["limit"])
 	list, _ := e.TaskInfo.FDB.Find(e.TaskInfo.FromColl, query, nil, Fields, false, 0, limit)
@@ -67,12 +70,10 @@ func extractAndExport(v string, t map[string]interface{}) {
 			continue
 		}
 		var j, jf *ju.Job
-		if e.IsFileField{
-			if v["projectinfo"] != nil {
-				v["isextFile"] = true
-				j, jf = PreInfo(v)
-			}
-		}else {
+		if e.IsFileField && v["projectinfo"] != nil {
+			v["isextFile"] = true
+			j, jf = PreInfo(v)
+		} else {
 			j, _ = PreInfo(v)
 		}
 		e.TaskInfo.ProcessPool <- true

+ 203 - 161
src/jy/extract/extract.go

@@ -10,7 +10,7 @@ import (
 	ju "jy/util"
 	"log"
 	qu "qfw/util"
-	redis "qfw/util/redis"
+	"qfw/util/redis"
 	"reflect"
 	"regexp"
 	"strconv"
@@ -59,7 +59,8 @@ func StartExtractTestTask(taskId, startId, num, resultcoll, trackcoll string) bo
 
 	//品牌抽取是否开启
 	ju.IsBrandGoods, _ = ju.Config["brandgoods"].(bool)
-
+	//附件抽取是否开启
+	ext.InitFile()
 	return RunExtractTestTask(ext, startId, num)
 }
 
@@ -80,12 +81,10 @@ func RunExtractTestTask(ext *ExtractTask, startId, num string) bool {
 				continue
 			}
 			var j, jf *ju.Job
-			if ext.IsFileField{
-				if v["projectinfo"] != nil {
-					v["isextFile"] = true
-					j, jf = PreInfo(v)
-				}
-			}else {
+			if ext.IsFileField && v["projectinfo"] != nil {
+				v["isextFile"] = true
+				j, jf = PreInfo(v)
+			} else {
 				j, _ = PreInfo(v)
 			}
 			ext.TaskInfo.ProcessPool <- true
@@ -131,6 +130,8 @@ func StartExtractTaskId(taskId string) bool {
 
 	//品牌抽取是否开启
 	ju.IsBrandGoods, _ = ju.Config["brandgoods"].(bool)
+	//附件抽取是否开启
+	ext.InitFile()
 
 	ext.IsRun = true
 	go ext.ResultSave()
@@ -181,12 +182,10 @@ func RunExtractTask(taskId string) {
 				break
 			}
 			var j, jf *ju.Job
-			if ext.IsFileField{
-				if v["projectinfo"] != nil {
-					v["isextFile"] = true
-					j, jf = PreInfo(v)
-				}
-			}else {
+			if ext.IsFileField && v["projectinfo"] != nil {
+				v["isextFile"] = true
+				j, jf = PreInfo(v)
+			} else {
 				j, _ = PreInfo(v)
 			}
 			ext.TaskInfo.ProcessPool <- true
@@ -207,7 +206,7 @@ func PreInfo(doc map[string]interface{}) (j, jf *ju.Job) {
 	defer qu.Catch()
 	//判断是否有附件这个字段
 	var isextFile bool
-	if doc["isextFile"] != nil{
+	if doc["isextFile"] != nil {
 		isextFile = doc["isextFile"].(bool)
 	}
 	detail := ""
@@ -223,7 +222,7 @@ func PreInfo(doc map[string]interface{}) (j, jf *ju.Job) {
 	doc["detail"] = detail
 
 	if isextFile {
-		file2text(&doc)  //附件文本堆一起(后期可以考虑,分开处理),方法里修改了doc["detailfile"]结果
+		file2text(&doc) //附件文本堆一起(后期可以考虑,分开处理),方法里修改了doc["detailfile"]结果
 	}
 	toptype := qu.ObjToString(doc["toptype"])
 	if qu.ObjToString(doc["type"]) == "bid" {
@@ -258,6 +257,7 @@ func PreInfo(doc map[string]interface{}) (j, jf *ju.Job) {
 			Province:   qu.ObjToString(doc["area"]),
 			Result:     map[string][]*ju.ExtField{},
 			BuyerAddr:  qu.ObjToString(doc["buyeraddr"]),
+			IsFile:     isextFile,
 		}
 	}
 	qu.Try(func() {
@@ -298,26 +298,28 @@ func file2text(doc *map[string]interface{}) {
 			}
 		}
 	}
-	if utf8.RuneCountInString(strfileinfo.String()) < qu.IntAllDef(ju.Config["filelength"],100000 ){
+	if utf8.RuneCountInString(strfileinfo.String()) < qu.IntAllDef(ju.Config["filelength"], 100000) {
 		(*doc)["detailfile"] = strfileinfo.String() //附件文本堆一起(后期可以考虑,分开处理)
 	}
 }
 
 //抽取
 func (e *ExtractTask) ExtractProcess(j, jf *ju.Job) {
+	e.ExtractDetail(j)
+	if jf != nil && jf.IsFile {
+		e.ExtractFile(jf)
+	}
+	//分析抽取结果并保存 todo
+	AnalysisSaveResult(j, jf, e)
+	<-e.TaskInfo.ProcessPool
+}
+
+func (e *ExtractTask) ExtractDetail(j *ju.Job) {
 	qu.Try(func() {
 		doc := *j.Data
-		docfile := make(map[string]interface{})
-		if jf != nil{
-			docfile = *jf.Data
-			docfile["dockey"]= "detailfile"
-		}
 		//全局前置规则,结果覆盖doc属性
 		for _, v := range e.RulePres {
 			doc = ExtRegPre(doc, j, v, e.TaskInfo)
-			if jf != nil{
-				docfile = ExtRegPre(docfile, jf, v, e.TaskInfo)
-			}
 		}
 		//抽取规则
 		for _, vc := range e.RuleCores {
@@ -351,46 +353,106 @@ func (e *ExtractTask) ExtractProcess(j, jf *ju.Job) {
 			}
 			//log.Println("抽取-后置规则", tmp)
 		}
-		//抽取规则-附件
-		if jf != nil{
-			for _, vc := range e.RuleCores {
-				tmp := ju.DeepCopy(docfile).(map[string]interface{})
-				//是否进入逻辑
-				if !ju.Logic(vc.LuaLogic, tmp) {
-					continue
-				}
-				//抽取-前置规则
-				for _, v := range vc.RulePres {
-					tmp = ExtRegPre(tmp, jf, v, e.TaskInfo)
-				}
-				//log.Println("抽取-前置规则", tmp)
 
-				//抽取-规则
-				for _, v := range vc.RuleCores {
-					ExtRegCore(vc.ExtFrom, tmp, jf, v, e)
+		//全局后置规则
+		for _, v := range e.RuleBacks {
+			ExtRegBack(j, v, e.TaskInfo)
+		}
+		//候选人加入
+		if len(j.Winnerorder) > 0 {
+			winner := &ju.ExtField{
+				Field:     "winner",
+				Code:      "",
+				RuleText:  "",
+				Type:      "winnerorder",
+				MatchType: "winnerorder",
+				ExtFrom:   "",
+				Value:     j.Winnerorder[0]["entname"],
+				Score:     0,
+			}
+			if len([]rune(qu.ObjToString(j.Winnerorder[0]["entname"]))) < 4 {
+				winner.Score = -5
+			}
+			winners := j.Result["winner"]
+			if winners != nil {
+				winners = append(winners, winner)
+			} else {
+				winners = []*ju.ExtField{}
+				winners = append(winners, winner)
+			}
+			j.Result["winner"] = winners
+		}
+		//函数清理
+		for key, val := range j.Result {
+			for _, v := range val {
+				lock.Lock()
+				cfn := e.ClearFn[key]
+				lock.Unlock()
+				data := clear.DoClearFn(cfn, []interface{}{v.Value, j.Content})
+				v.Value = data[0]
+				//清理特殊符号
+				lock.Lock()
+				if clear.AsyField[key] != nil || clear.SymField[key] != nil ||
+					clear.MesField[key] != nil {
+					text := qu.ObjToString(v.Value)
+					text = clear.OtherClean(key, text)
+					v.Value = text
 				}
-				//log.Println("抽取-规则", tmp)
+				lock.Unlock()
+			}
+		}
+		PackageDetail(j, e) //处理分包信息
+		//		bs, _ := json.Marshal(j.Result)
+		//		log.Println("抽取结果", j.Title, j.SourceMid, string(bs))
+	}, func(err interface{}) {
+		log.Println("ExtractProcess err", err)
+	})
+}
+func (e *ExtractTask) ExtractFile(j *ju.Job) {
+	qu.Try(func() {
+		doc := *j.Data
+		//全局前置规则,结果覆盖doc属性
+		for _, v := range e.RulePres {
+			if e.FileFields[v.Field] > 0 {
+				doc = ExtRegPre(doc, j, v, e.TaskInfo)
+			}
+		}
+		//抽取规则
+		for _, vc := range e.RuleCores {
+			tmp := ju.DeepCopy(doc).(map[string]interface{})
+			//是否进入逻辑
+			if !ju.Logic(vc.LuaLogic, tmp) {
+				continue
+			}
+			//抽取-前置规则
+			for _, v := range vc.RulePres {
+				if e.FileFields[vc.Field] > 0 {
+					tmp = ExtRegPre(tmp, j, v, e.TaskInfo)
+				}
+			}
+			//log.Println("抽取-前置规则", tmp)
 
-				//项目名称未能抽取到,标题来凑
-				if vc.Field == "projectname" {
-					if len(jf.Result[vc.Field]) < 1 {
-						jf.Result[vc.Field] = append(jf.Result[vc.Field], &ju.ExtField{vc.Field, "title", "title", "regexp", "title", vc.ExtFrom, jf.Title, 0})
-					}
+			//抽取-规则
+			for _, v := range vc.RuleCores {
+				if e.FileFields[vc.Field] > 0 {
+					ExtRegCore(vc.ExtFrom, tmp, j, v, e)
 				}
+			}
+			//log.Println("抽取-规则", tmp)
 
-				//抽取-后置规则
-				for _, v := range vc.RuleBacks {
-					ExtRegBack(jf, v, e.TaskInfo)
+			//抽取-后置规则
+			for _, v := range vc.RuleBacks {
+				if e.FileFields[vc.Field] > 0 {
+					ExtRegBack(j, v, e.TaskInfo)
 				}
-				//log.Println("抽取-后置规则", tmp)
 			}
+			//log.Println("抽取-后置规则", tmp)
 		}
 
 		//全局后置规则
 		for _, v := range e.RuleBacks {
-			ExtRegBack(j, v, e.TaskInfo)
-			if jf != nil {
-				ExtRegBack(jf, v, e.TaskInfo)
+			if e.FileFields[v.Field] > 0 {
+				ExtRegBack(j, v, e.TaskInfo)
 			}
 		}
 		//候选人加入
@@ -417,32 +479,6 @@ func (e *ExtractTask) ExtractProcess(j, jf *ju.Job) {
 			}
 			j.Result["winner"] = winners
 		}
-		//候选人加入-附件
-		if jf != nil{
-			if len(jf.Winnerorder) > 0 {
-				winner := &ju.ExtField{
-					Field:     "winner",
-					Code:      "",
-					RuleText:  "",
-					Type:      "winnerorder",
-					MatchType: "winnerorder",
-					ExtFrom:   "",
-					Value:     jf.Winnerorder[0]["entname"],
-					Score:     0,
-				}
-				if len([]rune(qu.ObjToString(jf.Winnerorder[0]["entname"]))) < 4 {
-					winner.Score = -5
-				}
-				winners := jf.Result["winner"]
-				if winners != nil {
-					winners = append(winners, winner)
-				} else {
-					winners = []*ju.ExtField{}
-					winners = append(winners, winner)
-				}
-				jf.Result["winner"] = winners
-			}
-		}
 		//函数清理
 		for key, val := range j.Result {
 			for _, v := range val {
@@ -462,42 +498,13 @@ func (e *ExtractTask) ExtractProcess(j, jf *ju.Job) {
 				lock.Unlock()
 			}
 		}
-		//函数清理-附件
-		if jf != nil{
-			for key, val := range jf.Result {
-				for _, v := range val {
-					lock.Lock()
-					cfn := e.ClearFn[key]
-					lock.Unlock()
-					data := clear.DoClearFn(cfn, []interface{}{v.Value, jf.Content})
-					v.Value = data[0]
-					//清理特殊符号
-					lock.Lock()
-					if clear.AsyField[key] != nil || clear.SymField[key] != nil ||
-						clear.MesField[key] != nil {
-						text := qu.ObjToString(v.Value)
-						text = clear.OtherClean(key, text)
-						v.Value = text
-					}
-					lock.Unlock()
-				}
-			}
-		}
+
 		PackageDetail(j, e) //处理分包信息
-		if jf != nil{
-			PackageDetail(jf, e) //处理分包信息-附件
-		}
 		//		bs, _ := json.Marshal(j.Result)
 		//		log.Println("抽取结果", j.Title, j.SourceMid, string(bs))
-		//分析抽取结果并保存 todo
-		AnalysisSaveResult(j, e)
-		if jf != nil{
-			AnalysisSaveResult(jf, e) //分析抽取结果并保存-附件
-		}
 	}, func(err interface{}) {
 		log.Println("ExtractProcess err", err)
 	})
-	<-e.TaskInfo.ProcessPool
 }
 
 //前置过滤
@@ -517,9 +524,9 @@ func ExtRegPre(doc map[string]interface{}, j *ju.Job, in *RegLuaInfo, t *TaskInf
 		AddExtLog("prereplace", j.SourceMid, before, extinfo, in, t) //抽取日志
 	} else {
 		var key string
-		if doc["dockey"]== nil{
+		if !j.IsFile {
 			key = qu.If(in.Field == "", "detail", in.Field).(string)
-		}else {
+		} else {
 			key = qu.If(in.Field == "", "detailfile", in.Field).(string)
 		}
 		text := qu.ObjToString(doc[key])
@@ -967,54 +974,9 @@ type FieldValue struct {
 }
 
 //分析抽取结果并保存
-func AnalysisSaveResult(j *ju.Job, e *ExtractTask) {
+func AnalysisSaveResult(j, jf *ju.Job, e *ExtractTask) {
 	qu.Try(func() {
-		doc := j.Data
-		result := j.Result
-		_id := qu.BsonIdToSId((*doc)["_id"])
-		iscore, _ := ju.Config["fieldscore"].(bool)
-		if iscore { //打分
-			result = ScoreFields(j)
-		}
-		//结果排序
-		values := map[string][]*ju.SortObject{}
-		for key, val := range result {
-			fieldValue := map[string][]interface{}{}
-			if iscore { //走打分
-				for _, v := range val {
-					if len(fmt.Sprint(v.Value)) < 1 {
-						continue //去除空串
-					}
-					fieldValue[fmt.Sprint(v.Value)+v.Type] = []interface{}{v.Score, v.Value}
-				}
-			} else { //不走打分,按出现频次
-				for _, v := range val {
-					if len(fmt.Sprint(v.Value)) < 1 {
-						continue //去除空串
-					}
-					if fieldValue[fmt.Sprint(v.Value)] == nil {
-						fieldValue[fmt.Sprint(v.Value)] = []interface{}{0, v.Value}
-					} else {
-						fieldValue[fmt.Sprint(v.Value)][0] = qu.IntAll(fieldValue[fmt.Sprint(v.Value)][0]) + 1
-					}
-				}
-			}
-			objects := []*ju.SortObject{}
-			for k, v := range fieldValue {
-				ValueStr := "" //第二排序
-				if reflect.TypeOf(v[1]).String() == "string" {
-					ValueStr = qu.ObjToString(v[1])
-				}
-				tmp := &ju.SortObject{
-					Key:      k,
-					Value:    qu.IntAll(v[0]),
-					Object:   v[1],
-					ValueStr: ValueStr,
-				}
-				objects = append(objects, tmp)
-			}
-			values[key] = ju.ExtSort(objects)
-		}
+		doc, result, _id, values := funcAnalysis(j)
 		//从排序结果中取值
 		tmp := map[string]interface{}{} //抽取值
 		for key, val := range values {
@@ -1031,9 +993,31 @@ func AnalysisSaveResult(j *ju.Job, e *ExtractTask) {
 		if len(j.Winnerorder) > 0 { //候选人信息
 			tmp["winnerorder"] = j.Winnerorder
 		}
+		//处理附件
+		var resultf map[string][]*ju.ExtField
+		var filevalues map[string][]*ju.SortObject
+		if jf != nil {
+			_, resultf, _, filevalues = funcAnalysis(jf)
+			ffield := map[string]interface{}{}
+			for key, val := range filevalues {
+				for _, v := range val { //取第一个非负数
+					if v.Key != "" && v.Value > -1 {
+						ffield[key] = v.Object
+						break
+					}
+				}
+			}
+			if len(jf.PackageInfo) > 0 { //分包信息
+				ffield["package"] = jf.PackageInfo
+			}
+			if len(jf.Winnerorder) > 0 { //候选人信息
+				ffield["winnerorder"] = jf.Winnerorder
+			}
+			tmp["ffield"] = ffield
+		}
 		for k, v := range *doc {
 			//去重冗余字段
-			if k == "detail" || k == "contenthtml" || k == "site" || k == "spidercode" {
+			if delFiled(k) {
 				continue
 			}
 			if tmp[k] == nil {
@@ -1042,7 +1026,7 @@ func AnalysisSaveResult(j *ju.Job, e *ExtractTask) {
 		}
 
 		//质量审核
-		if ju.Config["qualityaudit"].(bool) {
+		if ok, _ := ju.Config["qualityaudit"].(bool); ok {
 			e.QualityAudit(tmp)
 		}
 		if e.IsExtractCity { //城市抽取
@@ -1086,6 +1070,7 @@ func AnalysisSaveResult(j *ju.Job, e *ExtractTask) {
 			if b, ok := ju.Config["saveresult"].(bool); ok && b {
 				id := tmp["_id"]
 				tmp["result"] = result
+				tmp["resultf"] = resultf
 				delete(tmp, "_id")
 				tmparr := []map[string]interface{}{
 					map[string]interface{}{
@@ -1102,6 +1087,7 @@ func AnalysisSaveResult(j *ju.Job, e *ExtractTask) {
 				tmp["epackage"] = string(bs)
 			}
 			tmp["result"] = result
+			tmp["resultf"] = resultf
 			b := db.Mgo.Update(e.TaskInfo.TestColl, `{"_id":"`+_id+`"}`, map[string]interface{}{"$set": tmp}, true, false)
 			if !b {
 				log.Println(e.TaskInfo.TestColl, _id)
@@ -1112,6 +1098,62 @@ func AnalysisSaveResult(j *ju.Job, e *ExtractTask) {
 	})
 }
 
+//去重冗余字段
+func delFiled(k string) bool {
+	return k == "detail" || k == "contenthtml" || k == "site" || k == "spidercode" || k == "projectinfo"
+}
+
+func funcAnalysis(j *ju.Job) (*map[string]interface{}, map[string][]*ju.ExtField, string, map[string][]*ju.SortObject) {
+	defer qu.Catch()
+	doc := j.Data
+	result := j.Result
+	_id := qu.BsonIdToSId((*doc)["_id"])
+	iscore, _ := ju.Config["fieldscore"].(bool)
+	if iscore { //打分
+		result = ScoreFields(j)
+	}
+	//结果排序
+	values := map[string][]*ju.SortObject{}
+	for key, val := range result {
+		fieldValue := map[string][]interface{}{}
+		if iscore { //走打分
+			for _, v := range val {
+				if len(fmt.Sprint(v.Value)) < 1 {
+					continue //去除空串
+				}
+				fieldValue[fmt.Sprint(v.Value)+v.Type] = []interface{}{v.Score, v.Value}
+			}
+		} else { //不走打分,按出现频次
+			for _, v := range val {
+				if len(fmt.Sprint(v.Value)) < 1 {
+					continue //去除空串
+				}
+				if fieldValue[fmt.Sprint(v.Value)] == nil {
+					fieldValue[fmt.Sprint(v.Value)] = []interface{}{0, v.Value}
+				} else {
+					fieldValue[fmt.Sprint(v.Value)][0] = qu.IntAll(fieldValue[fmt.Sprint(v.Value)][0]) + 1
+				}
+			}
+		}
+		objects := []*ju.SortObject{}
+		for k, v := range fieldValue {
+			ValueStr := "" //第二排序
+			if reflect.TypeOf(v[1]).String() == "string" {
+				ValueStr = qu.ObjToString(v[1])
+			}
+			tmp := &ju.SortObject{
+				Key:      k,
+				Value:    qu.IntAll(v[0]),
+				Object:   v[1],
+				ValueStr: ValueStr,
+			}
+			objects = append(objects, tmp)
+		}
+		values[key] = ju.ExtSort(objects)
+	}
+	return doc, result, _id, values
+}
+
 func (e *ExtractTask) QualityAudit(resulttmp map[string]interface{}) {
 	defer qu.Catch()
 	//获取审核字段

+ 21 - 0
src/jy/extract/extractInit.go

@@ -908,6 +908,27 @@ func (e *ExtractTask) InitAuditFields() {
 	}
 }
 
+//加载附件抽取
+func (e *ExtractTask) InitFile() {
+	defer qu.Catch()
+	//query:=bson.M{"version":e.TaskInfo.Version,"delete":false}
+	ve, _ := db.Mgo.FindOne("version", `{"version":"`+e.TaskInfo.Version+`","delete":false}`)
+	//ve, _ := db.Mgo.FindOne("version", query)
+	if ve == nil{
+		return
+	}
+	if (*ve)["isfiles"]!=nil && (*ve)["isfiles"].(bool){
+		e.IsFileField =true
+	}
+	efiled := make(map[string]int,0)
+	if (*ve)["s_filefileds"] != nil{
+		for _,vff :=range (*ve)["s_filefileds"].([]interface{}) {
+			efiled[vff.(string)]=1
+		}
+	}
+	e.FileFields = efiled
+}
+
 //加载清理任务信息
 func (c *ClearTask) InitClearTaskInfo() {
 	cleartask, _ := db.Mgo.FindById("cleartask", c.Id, nil)

+ 14 - 18
src/jy/extract/extractudp.go

@@ -106,6 +106,8 @@ func ExtractByUdp(sid, eid string, instanceId ...string) {
 
 	//品牌抽取是否开启
 	ju.IsBrandGoods, _ = ju.Config["brandgoods"].(bool)
+	//附件抽取是否开启
+	ext.InitFile()
 
 	go ext.ResultSave()
 	go ext.BidSave()
@@ -146,12 +148,10 @@ func ExtractByUdp(sid, eid string, instanceId ...string) {
 					_id := qu.BsonIdToSId(v["_id"])
 					log.Println(_id)
 					var j, jf *ju.Job
-					if ext.IsFileField{
-						if v["projectinfo"] != nil {
-							v["isextFile"] = true
-							j, jf = PreInfo(v)
-						}
-					}else {
+					if ext.IsFileField && v["projectinfo"] != nil {
+						v["isextFile"] = true
+						j, jf = PreInfo(v)
+					} else {
 						j, _ = PreInfo(v)
 					}
 					ext.TaskInfo.ProcessPool <- true
@@ -174,12 +174,10 @@ func ExtractByUdp(sid, eid string, instanceId ...string) {
 					_id := qu.BsonIdToSId(v["_id"])
 					log.Println(_id)
 					var j, jf *ju.Job
-					if ext.IsFileField{
-						if v["projectinfo"] != nil {
-							v["isextFile"] = true
-							j, jf = PreInfo(v)
-						}
-					}else {
+					if ext.IsFileField && v["projectinfo"] != nil {
+						v["isextFile"] = true
+						j, jf = PreInfo(v)
+					} else {
 						j, _ = PreInfo(v)
 					}
 					ext.TaskInfo.ProcessPool <- true
@@ -216,12 +214,10 @@ func ExtractByUdp(sid, eid string, instanceId ...string) {
 				_id := qu.BsonIdToSId(v["_id"])
 				log.Println(_id)
 				var j, jf *ju.Job
-				if ext.IsFileField{
-					if v["projectinfo"] != nil {
-						v["isextFile"] = true
-						j, jf = PreInfo(v)
-					}
-				}else {
+				if ext.IsFileField && v["projectinfo"] != nil {
+					v["isextFile"] = true
+					j, jf = PreInfo(v)
+				} else {
 					j, _ = PreInfo(v)
 				}
 				ext.TaskInfo.ProcessPool <- true

+ 1 - 0
src/jy/util/article.go

@@ -24,6 +24,7 @@ type Job struct {
 	HasKey    int                   //是否匹配到table中的标题
 	HasBrand  int                   //有品牌
 	HasGoods  int                   //有商品
+	IsFile    bool                  //有附件
 }
 
 type ExtField struct {

+ 229 - 4
src/web/templates/admin/version.html

@@ -3,12 +3,16 @@
 {{template "header"}}
 <!-- Left side column. 权限菜单 -->
 {{template "memu"}}
+<link href="../res/doublebox/css/hdw.css" rel="stylesheet" type="text/css">
+<style>.myred{ color:red;   }</style>
+<script src="../res/doublebox/js/hdw.js"></script>
 
 <!-- Content Wrapper. Contains page content -->
 <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">新增版本</a></small>*/}}
+			<small><button type="button" class="btn btn-primary" data-toggle="modal" onclick='createOneVersion("")'>新增版本</button></small>
 		</h1>
 		<ol class="breadcrumb">
 		  <li><a href="/admin/version"><i class="fa fa-dashboard"></i>抽取版本</a></li>
@@ -40,7 +44,90 @@
 	</div>
   </section>
 </div>
-	
+<!--新增函数-->
+<div class="modal fade" id="modal-info-version" >
+	<div class="modal-dialog">
+		<form id="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="version_title">新增版本</h4>
+				</div>
+				<div class="modal-body">
+					<div class="form-group" >
+						<label for="code" class="col-sm-2 control-label myred"  >版本名称:</label>
+						<div class="col-sm-10">
+							<input name="name" type="text" id="version" value="" class="form-control" placeholder="版本名称">
+						</div>
+					</div>
+					<div class="form-group" >
+						<label for="code" class="col-sm-2 control-label myred" >描述:</label>
+						<div class="col-sm-10">
+							<input name="name" type="text" id="s_descript" value="" class="form-control" placeholder="描述信息">
+						</div>
+					</div>
+					<div class="form-group">
+						<label for="code" id="fieldname" class="col-sm-2 control-label">城市抽取:</label>
+						<div class="col-sm-10">
+							<select class="form-control " id="isextractcity">
+								<option value=false>否</option>
+								<option value=true>是</option>
+							</select>
+						</div>
+					</div>
+					<div class="form-group">
+						<label for="code" id="fieldname" class="col-sm-2 control-label">克隆版本:</label>
+						<div class="col-sm-10">
+							<select id="s_pversionid" name="v1" class="form-control">
+							</select>
+						</div>
+					</div>
+					<div class="form-group">
+						<label for="code" id="fieldname" class="col-sm-2 control-label">克隆属性:</label>
+						<div class="col-sm-10">
+							<select class="form-control" id="iscopyfiled">
+								<option value=false>否</option>
+								<option value=true>是</option>
+							</select>
+						</div>
+					</div>
+					<div class="form-group">
+						<label for="code" id="fieldname" class="col-sm-2 control-label">是否附件:</label>
+						<div class="col-sm-10">
+							<select class="form-control" id="isfiles">
+								<option value=false>否</option>
+								<option value=true>是</option>
+							</select>
+						</div>
+					</div>
+					<div class="form-group">
+						<label for="code" class="col-sm-2 control-label">导出属性:</label>
+						<div class="col-sm-10" id="selectclear">
+							<div class="doublebox">
+								<select multiple="multiple" id="select1" style="overflow-x: scroll;"></select>
+							</div>
+							<div class="move">
+								<button type="button" id="right" class="btn btn-primary">右移</button>
+								<button type="button" id="left" class="btn btn-primary">左移</button>
+							</div>
+							<div class="doublebox">
+								<select multiple="multiple" id="select2" style="overflow-x: scroll;"></select>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="modal-footer">
+					<button type="button" class="btn btn-default cancel" data-dismiss="modal" onclick="reset()">取消</button>
+					<button type="button" class="btn btn-primary save" onclick="save()">保存</button>
+				</div>
+			</div>
+			<!-- /.modal-content -->
+			<input type="hidden" name="_id" value="">
+		</form>
+	</div>
+	<!-- /.modal-dialog -->
+</div>
 <!-- footer -->
 {{template "dialog"}}
 {{template "footer"}}
@@ -89,7 +176,8 @@ $(function () {
 				return '<div class="btn-group">'+
 						'<a class="btn btn-sm btn-success" href="/admin/version/info?vid='+val+'" >属性配置</a>'+
 						'<a class="btn btn-sm btn-info" href="/admin/version/pkginfo?vid='+val+'" >分包配置</a>'+
-						'<a class="btn btn-sm btn-primary opr" opr="edit">编&nbsp;&nbsp;辑</a>'+
+						/*'<a class="btn btn-sm btn-primary opr" opr="edit">编&nbsp;&nbsp;辑1</a>'+*/
+						"<a class=\"btn btn-sm btn-primary opr\" href='#' onclick=\"edit('"+val+"')\">编&nbsp;&nbsp;辑</a> &nbsp;"+
 						'<a class="btn btn-sm btn-danger" href="#" onclick="del(\''+val+'\',\''+row["version"]+'\')">删&nbsp;&nbsp;除</a>'
 					'</div>';
 			}}
@@ -109,6 +197,8 @@ $(function () {
 					{label:"城市抽取",s_label:"isextractcity",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"},
 					{label:"克隆属性",s_label:"iscopyfiled",type:"tpl_list_local",list:[{"s_name":"是","_id":true},{"s_name":"否","_id":false}],default:false},
+					{label:"是否附件",s_label:"isfiles",type:"tpl_list_local",list:[{"s_name":"是","_id":true},{"s_name":"否","_id":false}],default:false},
+					{label:"附件字段",s_label:"s_filefileds",type:"tpl_list_local",url:"/admin/getfields"},
 					{s_label:"isuse",type:"tpl_hidden"},
 					{s_label:"_id",type:"tpl_hidden"}
 				]
@@ -134,7 +224,9 @@ $(function () {
 										return false
 									}
 								})
-								if (bcon){	
+                                console.log(obj)
+                                return;
+								if (bcon){
 									if(obj.isuse != "true"){
 										obj.isuse = false
 									}
@@ -196,4 +288,137 @@ function del(_id,version){
 		})
 	});
 }
+var field = {{.field}};
+var clearMap = {"资金来源": "funds","中标单位":"winner","招标机构": "agency","项目范围": "projectscope",
+	"项目编号": "projectcode","评标方法": "bidmethod", "开标日期": "bidopentime","监理项目费率": "supervisorrate",
+	"候选人": "winnerorder", "城市": "city","成交状态": "bidstatus", "采购单位联系人": "buyerperson", "采购单位电话": "buyertel",
+	"采购单位": "buyer","币种": "currency", "项目名称": "projectname","中标金额": "bidamount", "预算": "budget",}
+
+
+//创建标签
+function createOneVersion(){
+	_id = "";
+	$("#version_title").html("新增版本");
+	$("#version").val("").attr({"disabled":false,"placeholder":"版本名称"});//版本
+	$("#s_descript").val("").attr({"placeholder":"描述信息"});//描述
+	$("#s_pversionid").empty();
+	$("#s_pversionid").append("<option value=''></option>")
+	$("#select1").empty();
+	$("#select2").empty();
+	for(var i in clearMap){
+		$("#select1").append("<option  value="+clearMap[i]+">"+i+"</option>");
+		//$("#select1").append("<option value='"+clearArr[i]+"'>"+clearArr[i]+"</option>");
+	}
+	$.ajax({
+		url:"/admin/getversions",
+		type:"post",
+		data:{},
+		success:function(r){
+			if(r.data){
+				for(var i in r.data){
+					$("#s_pversionid").append("<option value='"+r.data[i]._id+"'>"+r.data[i].version+"</option>");
+					//$("#select1").append("<option value='"+clearArr[i]+"'>"+clearArr[i]+"</option>");
+				}
+			}
+		}
+	})
+
+	$("#modal-info-version").modal("show");
+}
+//保存
+function save(){
+    var version = $("#version").val();//版本
+    var s_descript = $("#s_descript").val();//描述
+    var isextractcity = $("#isextractcity").val()//是否抽取城市
+    var s_pversionid = $("#s_pversionid").val()//克隆版本
+    var iscopyfiled = $("#iscopyfiled").val()//克隆属性
+    var isfiles = $("#isfiles").val()//是否附件
+    var s_filefileds = [];
+    $("#select2 option").each(function(i,val){
+        s_filefileds[i] = this.value
+    })
+	// var s_filefiledsJsonStr = JSON.stringify(s_filefileds)
+	var s_filefiledsJsonStr = s_filefileds.join(',')
+    if(fieldname == "" ||s_descript==""){
+        alert("版本名称或者描述填写不完整!");
+        return false;
+    }
+    /*console.log({"_id":_id,"s_descript":s_descript,"version":version,"isextractcity":isextractcity,"s_pversionid":s_pversionid,"iscopyfiled":iscopyfiled,"isfiles":isfiles,"s_filefileds":s_filefiledsJsonStr})*/
+    // {{/*data:{"_id":_id,"s_descript":s_descript,"version":version,"clearJsonStr":clearJsonStr,"username":{{index (session "user") "name" }}},*/}}
+    $.ajax({
+        url:"/admin/version/save",
+        type:"post",
+        data:{"_id":_id,"s_descript":s_descript,"version":version,"isextractcity":isextractcity,"s_pversionid":s_pversionid,"iscopyfiled":iscopyfiled,"isfiles":isfiles,"s_filefileds":s_filefiledsJsonStr},
+        success:function(r){
+			if(r&&r.rep){
+				window.location.href="/admin/version"
+			}else{
+				showTip("已存在!",1000)
+			}
+        }
+    })
+}
+//编辑
+function edit(id){
+	_id = id;
+	$("#version_title").html("编辑版本");
+	$.ajax({
+		url:"/admin/version/dataById?_id="+id,
+		type:"get",
+		success:function(r){
+			if (r.req){
+				$("#version").empty();
+				$("#version").val(r.data.version).attr("disabled",true);//版本
+				$("#s_descript").empty();
+				$("#s_descript").val(r.data.s_descript);//描述
+				$("#isextractcity")[0].value=r.data.isextractcity;//城市抽取
+				$.ajax({
+					url:"/admin/getversions",
+					type:"post",
+					success:function (rv) {
+						$("#s_pversionid").empty();
+						for(var i in rv.data){
+							$("#s_pversionid").append("<option value='"+rv.data[i]._id+"'>"+rv.data[i].version+"</option>");
+							//$("#select1").append("<option value='"+clearArr[i]+"'>"+clearArr[i]+"</option>");
+						}
+						$("#s_pversionid")[0].value=r.data.s_pversionid;//克隆版本
+						$("#iscopyfiled")[0].value=r.data.iscopyfiled;//克隆属性
+						$("#isfiles")[0].value=r.data.isfiles;//是否附件
+						//导出属性
+						$("#select1").empty();
+						$("#select2").empty();
+						var s_filefileds=[]
+						s_filefileds = r.data.s_filefileds
+						// console.log(r.data.s_filefileds)
+						// if (typeof r.data.s_filefileds=="string"){
+						// 	s_filefileds = JSON.parse(r.data.s_filefileds)
+						// }
+						for(var i in clearMap){
+							var flag = true;
+							for(var j in s_filefileds){
+								// console.log(i,s_filefileds[j])
+								if(clearMap[i] == s_filefileds[j]){
+									$("#select2").append("<option title='"+i+"' value='"+clearMap[i]+"'>"+i+"</option>");
+									flag = false;
+								}
+							}
+							if(flag){
+								$("#select1").append("<option title='"+i+"' value='"+clearMap[i]+"'>"+i+"</option>");
+							}
+						}
+						$("#modal-info-version").modal("show");
+					}
+				})
+			}else {
+				alert(r)
+			}
+		}
+	})
+
+
+
+
+
+}
+
 </script>