Переглянути джерело

Merge branch 'dev-ent' of http://192.168.3.207:10080/qmx/datatag into dev-ent

wanghuidong 5 роки тому
батько
коміт
f2ef5dde7a

+ 3 - 2
customerdata/src/datamodel.go

@@ -1,10 +1,10 @@
 package main
 
 import (
+	"gopkg.in/mgo.v2/bson"
 	"regexp"
 	"sync"
-
-	bson "gopkg.in/mgo.v2/bson"
+	
 )
 
 //客户模型
@@ -38,6 +38,7 @@ type Department struct {
 type SearchRule struct { //一条查询规则
 	ID           string
 	Name         string
+	ExtFieldType int					//规则1、标准字段包,2、高级字段包
 	CustomerID   string                 //所属客户id
 	DepartmentID string                 //所属部门id
 	EsQuery      string                 //客户所有标签的es语句

+ 3 - 1
customerdata/src/historytask.go

@@ -9,6 +9,7 @@ import (
 
 func HistoryTask(name string) {
 	log.Println("开始历史任务...")
+
 	//加载一个客户
 	customer, _ := MgoTag.Find("euser", map[string]interface{}{"s_name": name, "i_push": 1, "b_delete": false}, nil, nil)
 	if len(customer) == 1 {
@@ -38,8 +39,9 @@ func HistoryTask(name string) {
 		cus.GetDepartments("history") //获取客户信息
 		//PrintLog(cus)        //打印查看初始化的信息
 		qu.Debug("customer:", cus.ID, cus.Name, cus.PushModel, cus.AppId, cus.IsTagRule, cus.IsSearchHosp, cus.IsSearchEnps, len(cus.TagRules), len(cus.Departments))
-		cus.GetData()             //获取数据
+		cus.GetData("history")             //获取数据
 		cus.RemoveRepeatData()    //数据去重
+
 		cus.AssembelAndSaveData() //组装、保存数据
 	} else {
 		log.Println("初始化客户信息失败")

+ 9 - 9
customerdata/src/main.go

@@ -12,10 +12,10 @@ import (
 var (
 	Sysconfig    map[string]interface{}
 	LatestId     string            //起始id
-	MgoTag       *mgodb.MongodbSim //标签库连接
-	MgoSave      *mgodb.MongodbSim //数据保存库连接
-	MgoBuyer     *mgodb.MongodbSim //医院等级信息
-	MgoEnps      *mgodb.MongodbSim //企业信息
+	MgoTag       *mongodb.MongodbSim //标签库连接
+	MgoSave      *mongodb.MongodbSim //数据保存库连接
+	MgoBuyer     *mongodb.MongodbSim //医院等级信息
+	MgoEnps      *mongodb.MongodbSim //企业信息
 	SaveColl     string
 	HospColl     string
 	BuyerEntColl string
@@ -36,7 +36,7 @@ func init() {
 	qu.ReadConfig(&Sysconfig)
 	logger.SetRollingDaily("./logs", "spider.log")
 	//mgo datatag
-	MgoTag = &mgodb.MongodbSim{
+	MgoTag = &mongodb.MongodbSim{
 		MongodbAddr: qu.ObjToString(Sysconfig["mgodb"]),
 		DbName:      qu.ObjToString(Sysconfig["dbname"]),
 		Size:        qu.IntAllDef(Sysconfig["dbsize"], 15),
@@ -45,7 +45,7 @@ func init() {
 	//mgo save
 	save := Sysconfig["save"].(map[string]interface{})
 	SaveColl = qu.ObjToString(save["coll"])
-	MgoSave = &mgodb.MongodbSim{
+	MgoSave = &mongodb.MongodbSim{
 		MongodbAddr: qu.ObjToString(save["addr"]),
 		DbName:      qu.ObjToString(save["db"]),
 		Size:        qu.IntAllDef(save["size"], 15),
@@ -55,7 +55,7 @@ func init() {
 	buyerinfo := Sysconfig["buyerinfo"].(map[string]interface{})
 	HospColl = qu.ObjToString(buyerinfo["hospcoll"])
 	BuyerEntColl = qu.ObjToString(buyerinfo["buyerentcoll"])
-	MgoBuyer = &mgodb.MongodbSim{
+	MgoBuyer = &mongodb.MongodbSim{
 		MongodbAddr: qu.ObjToString(buyerinfo["addr"]),
 		DbName:      qu.ObjToString(buyerinfo["db"]),
 		Size:        qu.IntAllDef(buyerinfo["size"], 15),
@@ -64,7 +64,7 @@ func init() {
 	//mgo enterprise
 	enterprise := Sysconfig["enterprise"].(map[string]interface{})
 	EnpsColl = qu.ObjToString(enterprise["coll"])
-	MgoEnps = &mgodb.MongodbSim{
+	MgoEnps = &mongodb.MongodbSim{
 		MongodbAddr: qu.ObjToString(enterprise["addr"]),
 		DbName:      qu.ObjToString(enterprise["db"]),
 		Size:        qu.IntAllDef(enterprise["size"], 15),
@@ -93,7 +93,7 @@ func init() {
 }
 func main() {
 	go SaveMgo()
-	//go TimeTask() //定时任务
+	go TimeTask() //定时任务
 	//flag.StringVar(&SId, "sid", "", "起始id")
 	//flag.StringVar(&EId, "eid", "", "结束id")
 	flag.StringVar(&CustomerName, "customer", "", "客户名称")

+ 0 - 146
customerdata/src/model/model.go

@@ -1,146 +0,0 @@
-package model
-
-type QueryObjecct struct {
-	Filtered struct {
-		Filter *Filter `json:"filter,omitempty"`
-		Query  *Query  `json:"query,omitempty"`
-	} `json:"filtered,omitempty"`
-}
-
-type Query struct {
-	Bool *BoolObject `json:"bool,omitempty"`
-}
-
-type Filter struct {
-	Bool *BoolObject `json:"bool,omitempty"`
-}
-
-//省市县
-type AreaCityDistrictMust struct {
-	*AreaCityDistrict `json:"terms,omitempty"`
-}
-
-//省市县
-type AreaCityDistrict struct {
-	Area     []string `json:"area,omitempty"`
-	City     []string `json:"city,omitempty"`
-	District []string `json:"district,omitempty"`
-}
-
-type DistrictObject struct {
-	Term struct {
-		City     string `json:"city,omitempty"`
-		District string `json:"district,omitempty"`
-	} `json:"term,omitempty"`
-}
-
-//一级分类、二级分类
-type ToptypeSubtypeMust struct {
-	*ToptypeSubtype `json:"terms,omitempty"`
-}
-
-//一级分类、二级分类
-type ToptypeSubtype struct {
-	Toptype []string `json:"toptype,omitempty"`
-	Subtype []string `json:"subtype,omitempty"`
-}
-
-//公告类型
-type ScopeclassMust struct {
-	*Scopeclass `json:"terms,omitempty"`
-}
-type Scopeclass struct {
-	Globaltopscopeclass []string `json:"s_topscopeclass,omitempty"`
-	Globalsubscopeclass []string `json:"s_subscopeclass,omitempty"`
-}
-
-type BudgetMust struct {
-	BudgetObj *BudgetObj `json:"range,omitempty"`
-}
-type BudgetObj struct {
-	Budget *BudgetOrBidamount `json:"budget,omitempty"`
-}
-type BidamountMust struct {
-	BidamountObj *BidamountObj `json:"range,omitempty"`
-}
-type BidamountObj struct {
-	Bidamount *BudgetOrBidamount `json:"bidamount,omitempty"`
-}
-type BudgetOrBidamount struct {
-	Gte float64 `json:"gte,omitempty"`
-	Lt  float64 `json:"lt,omitempty"`
-}
-
-//时间范围
-type PublishtimeMust struct {
-	PublishtimeObject *PublishtimeObject `json:"range,omitempty"`
-}
-
-//时间范围
-type PublishtimeObject struct {
-	//查询时间
-	Publishtime  *Publishtime  `json:"publishtime,omitempty"`
-	Publishtime1 *Publishtime1 `json:"publishtime1,omitempty"`
-	Publishtime2 *Publishtime2 `json:"publishtime2,omitempty"`
-}
-
-//查询时间
-type Publishtime struct {
-	Gte int `json:"gte"`
-	Lt  int `json:"lt"`
-}
-type Publishtime1 struct {
-	Gte int `json:"gte"`
-}
-type Publishtime2 struct {
-	Lt int `json:"lt"`
-}
-
-//字段是或否存在
-type ExistfieldsObjectMust struct {
-	ExistfieldsObject *ExistfieldsObject `json:"constant_score,omitempty"`
-}
-
-//字段存在 存在放MustNot,字符串为空忽略
-type ExistfieldsObject struct {
-	Filter struct {
-		Missing struct {
-			Field string `json:"field,omitempty"`
-		} `json:"missing,omitempty"`
-	} `json:"filter,omitempty"`
-}
-
-type ShouldObj struct {
-	MatchPhrase *MatchPhrase `json:"match_phrase,omitempty"`
-	MultiMatch  *MultiMatch  `json:"multi_match,omitempty"`
-}
-
-//匹配方式
-type MatchPhrase struct {
-	Title       string `json:"title,omitempty"`
-	Detail      string `json:"detail,omitempty"`
-	Purchasing  string `json:"purchasing,omitempty"`
-	Attachments string `json:"attachments,omitempty"`
-	Projectname string `json:"projectname,omitempty"`
-}
-
-type MultiMatch struct {
-	Query  string   `json:"query,omitempty"`
-	Type   string   `json:"type,omitempty"`
-	Fields []string `json:"fields,omitempty"`
-}
-
-//xf should
-type NewEsObject struct {
-	Bool struct {
-		Must    []interface{} `json:"must,omitempty"`
-		MustNot []interface{} `json:"must_not,omitempty"`
-		Should  []interface{} `json:"should,omitempty"`
-	} `json:"bool,omitempty"`
-}
-
-type BoolObject struct {
-	Must    []interface{} `json:"must,omitempty"`
-	MustNot []interface{} `json:"must_not,omitempty"`
-	Should  []interface{} `json:"should,omitempty"`
-}

+ 56 - 19
customerdata/src/task.go

@@ -3,6 +3,7 @@ package main
 import (
 	"encoding/json"
 	"fmt"
+	"gopkg.in/mgo.v2/bson"
 	"log"
 	qu "qfw/util"
 	"regexp"
@@ -15,12 +16,11 @@ import (
 
 	"github.com/donnie4w/go-logger/logger"
 	"go.mongodb.org/mongo-driver/bson/primitive"
-	bson "gopkg.in/mgo.v2/bson"
 	es "gopkg.in/olivere/elastic.v1"
 )
 
 func TimeTask() {
-	//StartTask()
+	StartTask()
 	c := cron.New()
 	//cronstr := "0 */" + fmt.Sprint(TaskTime) + " * * * ?"
 	cronstr := "0 0 */" + fmt.Sprint(TaskTime) + " * * ?" //每TaskTime小时执行一次
@@ -70,7 +70,7 @@ func GetCustomerData() {
 		cus.GetDepartments("") //获取客户信息
 		//PrintLog(cus)        //打印查看初始化的信息
 		//qu.Debug("customer:", cus.ID, cus.Name, cus.PushModel, cus.AppId, cus.IsTagRule, cus.IsSearchHosp, cus.IsSearchEnps, len(cus.TagRules), len(cus.Departments))
-		cus.GetData()             //获取数据
+		cus.GetData("")             //获取数据
 		cus.RemoveRepeatData()    //数据去重
 		cus.AssembelAndSaveData() //组装、保存数据
 	}
@@ -131,7 +131,7 @@ func (c *Customer) GetDepartments(stype string) {
 }
 
 //获取数据
-func (c *Customer) GetData() {
+func (c *Customer) GetData(stype string) {
 	log.Println("开始匹配数据...")
 	defer qu.Catch()
 	client := Es.GetEsConn()
@@ -180,16 +180,44 @@ func (c *Customer) GetData() {
 						//开始处理数据
 						wg.Add(1)
 						ch <- true
-						go func(tmpHit *es.SearchHit) {
+						func(tmpHit *es.SearchHit) {
 							defer func() {
 								<-ch
 								wg.Done()
 							}()
 							tmp := make(map[string]interface{})
 							if json.Unmarshal(*tmpHit.Source, &tmp) == nil {
+								if stype != "history" {
+									if !SkipData(tmp) {
+										qu.Debug("跳过该条数据,发布时间在入库时间7天之前,", qu.ObjToString(tmp["_id"]))
+										return
+									}
+								}
 								id := qu.ObjToString(tmp["_id"])
 								tmp["id"] = id //记录数据原有id
 								delete(tmp, "_id")
+								if sr.ExtFieldType == 2 {
+									findwinner := strings.TrimSpace(qu.ObjToString(tmp["winner"]))
+									if findwinner != "" {
+										finddata := MgoEnps.FindOne(EnpsColl, bson.M{"company_name": findwinner})
+										if finddata != nil {
+											if legal_person := qu.ObjToString(finddata["legal_person"]); legal_person != "" {
+												tmp["legal_person"] = legal_person
+											}
+											//从最新年报中获取 中标单位联系电话、中标单位邮箱
+											if annual_reports, ok := finddata["annual_reports"].(primitive.A); ok && len(annual_reports) > 0 {
+												if anreport, ok := annual_reports[0].(map[string]interface{}); ok { //最新年报
+													if email := qu.ObjToString(anreport["company_email"]); email != "" {
+														tmp["company_email"] = email
+													}
+													if phone := qu.ObjToString(anreport["company_phone"]); phone != "" {
+														tmp["company_phone"] = phone
+													}
+												}
+											}
+										}
+									}
+								}
 								matchKey := map[string]bool{}     //记录所有匹配上的关键词
 								matchKeyType := map[string]bool{} //记录关键词对应的匹配方式
 								//先获取用到的所有字段值
@@ -240,19 +268,8 @@ func (c *Customer) GetData() {
 									tmp["matchkey"] = strings.Join(tmpMatchKey, ",")
 									tmp["matchtype"] = strings.Join(tmpMatchKeyType, ",")
 									tmp["ruleid"] = sr.ID
-									//item
-									switch c.PushModel {
-									case 0:
-										tmp["item"] = "数据"
-									case 1:
-										tmp["item"] = dm.Name
-									case 2:
-										tmp["item"] = sr.Name
-									case 3:
-										tmp["item"] = dm.Name + "_" + sr.Name
-									case 4:
-										tmp["item"] = sr.ID
-									}
+									tmp["rulename"] = sr.Name
+
 									//开始打标签
 									//qu.Debug("c.IsTagRule+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
 									if c.IsTagRule {
@@ -290,19 +307,38 @@ func (c *Customer) GetData() {
 										tagIdArr := MapDataToArr(tagIdMap)
 										if len(tagNameArr) > 0 {
 											tmp["tagname"] = strings.Join(tagNameArr, ",")
+											if c.PushModel == 2 {
+												tmp["item"] = strings.Join(tagNameArr, ",")
+											}
 											tmp["tagid"] = strings.Join(tagIdArr, ",")
 										}
 									}
+									//item
+									switch c.PushModel {
+									case 0:
+										tmp["item"] = "数据"
+									case 1:
+										tmp["item"] = dm.Name
+									case 2:
+										//tmp["item"] = sr.Name
+									case 3:
+										tmp["item"] = dm.Name + "_" + sr.Name
+									case 4:
+										tmp["item"] = sr.Name
+									}
 									//appid
 									tmp["appid"] = c.AppId
-									//客户名称
+									//部门名称
 									tmp["departname"] = dm.Name
+									tmp["departid"] = dm.ID
 									//存储数据
 									dm.DataLock.Lock()
 									//qu.Debug("tmp---", tmp)
 									tmpMap := map[string]interface{}{id: tmp}
 									dm.DepartmentData[sr.ID] = append(dm.DepartmentData[sr.ID], tmpMap)
 									dm.DataLock.Unlock()
+								} else {
+									qu.Debug("------------", id, IsMatch)
 								}
 							}
 						}(hit)
@@ -441,6 +477,7 @@ func (d *Department) GetSearchRules(cid, stype string, idRange bson.M) {
 			SR.Name = name
 			SR.CustomerID = cid
 			SR.DepartmentID = d.ID
+			SR.ExtFieldType = qu.IntAll(sr["i_extfieldstype"])
 			//SR.RuleData = &sync.Map{}
 			esquery := qu.ObjToString(sr["s_esquery"])
 			clearKey := qu.ObjToString(sr["s_globalclearkey"])

+ 25 - 362
customerdata/src/util.go

@@ -1,43 +1,19 @@
 package main
 
 import (
+	"github.com/donnie4w/go-logger/logger"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"gopkg.in/mgo.v2/bson"
 	"log"
 	qu "qfw/util"
 	"regexp"
-	"strconv"
 	"strings"
 	"time"
-	"util/mgodb"
-
-	"github.com/donnie4w/go-logger/logger"
-	"go.mongodb.org/mongo-driver/bson/primitive"
-	bson "gopkg.in/mgo.v2/bson"
 )
 
 var LetterCase = regexp.MustCompile("[A-Za-z]")
 var LetterCase2 = regexp.MustCompile("[A-Za-z0-9]")
 var FilteReg = regexp.MustCompile("[()(){}]*")
-var (
-	regNumFloat, _  = regexp.Compile(`([1-9]\d*|0)(\.\d+)?`)
-	regStrUnit, _   = regexp.Compile(`[元|万|亿]`)
-	regStrChar      = `[〇|零|点|壹|贰|叁|肆|伍|陆|柒|捌|玖|拾|百|佰|千|仟|万|亿|億|元|圆|角|分|整|正]`
-	moneyRegChar, _ = regexp.Compile(regStrChar)
-
-	contentUnit, _ = regexp.Compile(`(万元|单位/万)`)
-	numCapitals, _ = regexp.Compile(`([〇|零|点|壹|贰|叁|肆|伍|陆|柒|捌|玖|拾|百|佰|千|仟|万|亿|億|元|圆|角|分|整|正]{4,40})`)
-	regQianw, _    = regexp.Compile(`\d{1,2}千万`)
-	moneyChar      = map[string]interface{}{ //"〇": "0", "零": "0",
-		"一": float64(1), "壹": float64(1), "二": float64(2), "贰": float64(2), "三": float64(3), "叁": float64(3), "四": float64(4), "肆": float64(4), "五": float64(5), "伍": float64(5),
-		"六": float64(6), "陆": float64(6), "七": float64(7), "柒": float64(7), "八": float64(8), "捌": float64(8), "九": float64(9), "玖": float64(9), "十": float64(10), "拾": float64(10),
-		"百": float64(100), "佰": float64(100), "千": float64(1000), "仟": float64(1000), "万": float64(10000), "亿": float64(100000000), "億": float64(100000000),
-		"零": float64(0), "点": ".", "角": float64(0.1), "分": float64(0.01),
-	}
-	moneyUnit = map[string]float64{
-		"元": float64(1), "万": float64(10000), "亿": float64(100000000), "億": float64(100000000), //单位
-	}
-	cutAllSpace, _ = regexp.Compile(`\s*`)
-	spaces         = []string{"\u3000", "\u2003", "\u00a0", "\t", "\r", "\n"}
-)
 
 //匹配方式map
 var MatchType = map[string]interface{}{
@@ -213,12 +189,13 @@ func GetIdRange() (bson.M, bool) {
 	defer qu.Catch()
 	now := time.Now().Unix()
 	for { //当前时间一直向前推半小时,直到取到数据
-		now = now - 1800 //半小时
+		now = now - 600 //10分钟
 		endTime := time.Unix(now, 0)
 		endId := bson.NewObjectIdWithTime(endTime).Hex()
 		if endId > LatestId {
-			esquery := `{"query": {"bool": {"must": [{"range": {"id": {"gt": "` + LatestId + `" , "lte": "` + endId + `"}}}]}}}`
+			esquery := `{"query": {"bool": {"must": [{"range": {"id": {"gt": "` + LatestId + `" , "lte": "` + endId + `"}}}]}}, "sort": [{"comeintime": "desc"}]}`
 			if Es.Count(Index, Itype, esquery) > 0 { //有数据返回id区间
+				list := Es.Get(Index, Itype, esquery)
 				tmpRange := bson.M{
 					"range": bson.M{
 						"id": bson.M{
@@ -227,7 +204,7 @@ func GetIdRange() (bson.M, bool) {
 						},
 					},
 				}
-				LatestId = endId
+				LatestId = qu.ObjToString((*list)[0]["_id"])
 				return tmpRange, true
 			}
 		} else { //结束id不大于起始id 退出
@@ -246,7 +223,7 @@ func GetIdRange() (bson.M, bool) {
 
 	// query := bson.M{
 	// 	"_id": bson.M{
-	// 		"$gt": mgodb.StringTOBsonId(LatestId),
+	// 		"$gt": mongodb.StringTOBsonId(LatestId),
 	// 	},
 	// }
 	// sort := bson.M{
@@ -258,7 +235,7 @@ func GetIdRange() (bson.M, bool) {
 	// //查抽取表最后一个id
 	// extData, err := MgoExt.FindByLimit(ExtColl, query, sort, fields, 0, 1)
 	// if len(extData) == 1 && err == nil {
-	// 	endId := mgodb.BsonTOStringId(extData[0]["_id"])
+	// 	endId := mongodb.BsonTOStringId(extData[0]["_id"])
 	// 	if endId > LatestId {
 	// 		tmpRange := bson.M{
 	// 			"range": bson.M{
@@ -410,6 +387,10 @@ func MergeData(history, tmp map[string]interface{}, isTagRule, isDepartRmvRep bo
 	ruleid2 := qu.ObjToString(tmp["ruleid"])
 	history["ruleid"] = MergeField(ruleid1, ruleid2)
 
+	rulename1 := qu.ObjToString(history["rulename"])
+	rulename2 := qu.ObjToString(tmp["rulename"])
+	history["rulename"] = MergeField(rulename1, rulename2)
+
 	if isTagRule { //标签模式 tagname、tagid合并
 		tagname1 := qu.ObjToString(history["tagname"])
 		tagname2 := qu.ObjToString(tmp["tagname"])
@@ -427,6 +408,9 @@ func MergeData(history, tmp map[string]interface{}, isTagRule, isDepartRmvRep bo
 		departname1 := qu.ObjToString(history["departname"])
 		departname2 := qu.ObjToString(tmp["departname"])
 		history["departname"] = MergeField(departname1, departname2)
+		departid1 := qu.ObjToString(history["departid"])
+		departid2 := qu.ObjToString(tmp["departid"])
+		history["departid"] = MergeField(departid1, departid2)
 	}
 }
 
@@ -561,218 +545,6 @@ func SearchEnterpriseInfo(tmp map[string]interface{}) {
 	}
 }
 
-//金额转换
-func ObjToMoney(text string) float64 {
-	isfindUnit := true
-	ret := capitalMoney(text)
-	if ret < float64(10000) || ret > float64(50000000000) {
-		ret2, b := numMoney(text)
-		isfindUnit = b
-		if ret2 > ret {
-			ret = ret2
-		}
-	}
-	f, _ := strconv.ParseFloat(strconv.FormatFloat(ret, 'f', 4, 64), 64)
-	if f < 1 {
-		f = 0
-	}
-	//如果金额小于50,全文检索单位:万
-	if f < 50 && f > 0 && isfindUnit {
-		rep := contentUnit.FindAllStringIndex(text, -1)
-		if len(rep) > 0 {
-			f = f * 10000
-		}
-	}
-	return f
-}
-func capitalMoney(text string) float64 {
-	nodes := []float64{}
-	node := float64(0)
-	tmp := float64(0)
-	decimals := 0.0
-	ishaspoint := false //是否含小数点
-	fnum := float64(0)
-	end := false
-	//str := fmt.Sprint(data[0])
-	//提取第一个大写信息
-	strmatch := numCapitals.FindAllStringSubmatch(text, -1)
-	if len(strmatch) > 0 {
-		text = strmatch[0][0]
-	}
-	suffixUnit := float64(1)
-	if strings.HasSuffix(text, "万") || strings.HasSuffix(text, "万元") || strings.HasSuffix(text, "万元整") {
-		index := strings.LastIndex(text, "万")
-		text = text[0:index]
-		suffixUnit = float64(10000)
-	}
-	moneyRegChar.ReplaceAllStringFunc(text, func(key string) string {
-		if key == "元" || key == "圆" || key == "点" {
-			ishaspoint = true
-		}
-		if v, ok := moneyChar[key].(float64); ok && !end {
-			if ishaspoint && v > 10 { //排除后面有其他的单位
-				return ""
-			}
-			//fmt.Println(key, v, fnum)
-			if v < 10 && v >= 0 {
-				if ishaspoint { //小数部分
-					if v >= 1 {
-						fnum = v
-					} else if v < 1 && v > 0 {
-						decimals += fnum * v
-					}
-				} else {
-					if tmp != float64(0) {
-						node += tmp
-					}
-					tmp = float64(v)
-				}
-			} else if v == 10000 || v == 100000000 { //单位万、亿
-				if tmp != float64(0) {
-					node += tmp
-					tmp = float64(0)
-				}
-				nodes = append(nodes, node*float64(v))
-				node = float64(0)
-			} else {
-				if v == 10 && tmp == 0 {
-					tmp = 1
-				}
-				tmp = tmp * float64(v)
-				node += tmp
-				tmp = float64(0)
-			}
-		}
-		if key == "整" || key == "正" || key == "分" {
-			end = true
-		}
-		return ""
-	})
-	nodes = append(nodes, node, tmp)
-	ret := float64(0)
-	for _, v := range nodes {
-		ret += v
-	}
-	return (ret + decimals) * suffixUnit
-}
-
-//数字金额转换
-func numMoney(text string) (moneyFloat float64, flag bool) {
-	//tmp := fmt.Sprintf("%f", data[0])
-	repUnit := float64(1)
-	if regQianw.MatchString(text) {
-		text = strings.Replace(text, "千万", "万", -1)
-		repUnit = float64(1000)
-	}
-	text = replaceSymbol(text, []string{",", ",", "(", ")", "(", ")", ":", "\n"})
-	text = replaceString(text, []string{"万元", "亿元", "."}, []string{"万", "亿", "."})
-	text = CutAllSpace(text)
-	rets := regNumFloat.FindAllString(text, -1)
-	fnums := []float64{}
-	unitstrs := []string{}
-	if len(rets) > 0 {
-		pindex := 0 //单位前置
-		for k, v := range rets {
-			f, err := strconv.ParseFloat(v, 64)
-			if err == nil {
-				fnums = append(fnums, f)
-				index := strings.Index(text, v)
-				//单位后置
-				start := index + len(v)
-				end := start + 3
-				//log.Println("vvv", tmp, v, pindex, index, start)
-				if k > 0 {
-					if start >= pindex+3 {
-						pstart := pindex + 3
-						if pstart >= index {
-							pstart = index
-						}
-						if len(text) > end {
-							unitstrs = append(unitstrs, text[pstart:index]+text[start:end])
-						} else {
-							unitstrs = append(unitstrs, text[pstart:index]+text[start:])
-						}
-					} else {
-						if len(text) > end {
-							unitstrs = append(unitstrs, text[start:end])
-						} else {
-							unitstrs = append(unitstrs, text[start:])
-						}
-					}
-				} else {
-					if len(text) > end {
-						if index-3 >= 0 {
-							unitstrs = append(unitstrs, text[index-3:index]+text[start:end])
-						} else {
-							unitstrs = append(unitstrs, text[start:end])
-						}
-					} else {
-						if index-3 >= 0 {
-							unitstrs = append(unitstrs, text[index-3:index]+text[start:])
-						} else {
-							unitstrs = append(unitstrs, text[start:])
-						}
-					}
-				}
-				pindex = start
-			}
-		}
-	}
-	//log.Println("unitstrs", fnums, unitstrs)
-	unit := float64(0)
-	fnum := float64(0)
-	for k, v := range fnums {
-		fnum = v
-		units := regStrUnit.FindAllString(unitstrs[k], -1)
-		for _, v := range units {
-			if moneyUnit[v] != 0 {
-				unit = moneyUnit[v]
-				break
-			}
-		}
-		if unit != float64(0) { //取第一个
-			break
-		}
-	}
-	fnum = fnum * repUnit
-	if unit == float64(0) {
-		moneyFloat = fnum
-	} else {
-		moneyFloat = fnum * unit
-	}
-	if unit == 10000 {
-		flag = false
-	} else {
-		flag = true
-	}
-	return
-}
-
-//清理所有空白符
-func CutAllSpace(text string) string {
-	tmp := cutAllSpace.ReplaceAllString(text, "")
-	tmp = replaceSymbol(tmp, spaces)
-	return tmp
-}
-
-//符号替换
-func replaceString(con string, ret, rep []string) string {
-	for k, v := range ret {
-		if len(rep) > k {
-			con = strings.Replace(con, v, rep[k], -1)
-		}
-	}
-	return con
-}
-
-//过滤符号
-func replaceSymbol(con string, rep []string) string {
-	for _, v := range rep {
-		con = strings.Replace(con, v, "", -1)
-	}
-	return con
-}
-
 //数据存库
 func SaveMgo() {
 	log.Println("Mgo Save...")
@@ -895,124 +667,6 @@ func PrintLog(cus *Customer) {
 	}
 }
 
-//查mongo程序测试
-func MgoDataTest(sr *SearchRule, dm *Department, c *Customer) {
-	qu.Debug("开始数据测试...")
-	data, _ := MgoTag.Find("test", nil, nil, nil)
-	for _, tmp := range data {
-		id := mgodb.BsonTOStringId(tmp["_id"])
-		matchKey := map[string]bool{}     //记录所有匹配上的关键词
-		matchKeyType := map[string]bool{} //记录关键词对应的匹配方式
-		//先获取用到的所有字段值
-		fieldText := map[string]interface{}{}
-		for field, _ := range sr.Fields {
-			text := qu.ObjToString(tmp[field])
-			text = ProcessData(text) //处理文本(字母转大写,删除一些符号)
-			fieldText[field] = text
-		}
-		//清理词清理
-		for _, cwm := range sr.GCW.MatchType {
-			if text := qu.ObjToString(fieldText[cwm]); text != "" {
-				for _, gcw_reg := range sr.GCW.KeyReg {
-					text = gcw_reg.ReplaceAllString(text, "")
-				}
-				fieldText[cwm] = text
-			}
-		}
-		/*
-			因为要记录所有匹配上的关键词,所有优先匹配附加词,在匹配关键词
-		*/
-		//1.附加词匹配
-		IsMatch := false
-		for i, aw := range sr.AW {
-			qu.Debug("-------------------------开始附加词匹配--------------------------")
-			IsMatchAddKey := RegMatchTest(fieldText, aw.MatchType, aw.KeyReg, nil, nil, false, true)
-			qu.Debug(IsMatchAddKey, "------------------------------------------------------------")
-
-			//2.关键词匹配
-			if IsMatchAddKey {
-				kw := sr.KW[i]
-				qu.Debug("-------------------------开始关键词匹配--------------------------")
-				IsMatchKey := RegMatchTest(fieldText, kw.MatchType, kw.KeyReg, matchKey, matchKeyType, true, false)
-				qu.Debug(IsMatchKey, "------------------------------------------------------------")
-				if IsMatchKey {
-					IsMatch = true
-				}
-			}
-		}
-		qu.Debug(IsMatch, matchKey)
-		if IsMatch { //匹配成功,数据上新增规则id,matchKey,item并临时保存数据
-			tmpMatchKey := MapDataToArr(matchKey)
-			tmpMatchKeyType := MapDataToArr(matchKeyType)
-			tmp["matchkey"] = strings.Join(tmpMatchKey, ",")
-			tmp["matchtype"] = strings.Join(tmpMatchKeyType, ",")
-			tmp["ruleid"] = sr.ID
-			//item
-			switch c.PushModel {
-			case 0:
-				tmp["item"] = "数据"
-			case 1:
-				tmp["item"] = dm.Name
-			case 2:
-				tmp["item"] = sr.Name
-			case 3:
-				tmp["item"] = dm.Name + "_" + sr.Name
-			case 4:
-				tmp["item"] = sr.ID
-			}
-			//开始打标签
-			qu.Debug("++++++++++++++++++++++++++++开始打标签+++++++++++++++++++++++++++++++")
-			if c.IsTagRule {
-				tagNameMap := map[string]bool{}
-				tagIdMap := map[string]bool{}
-				qu.Debug("c.TagRules---", len(c.TagRules))
-				for _, tr := range c.TagRules {
-					if tr.DepartRuleIds[sr.ID] {
-						//先获取用到的所有字段值
-						for field, _ := range tr.Fields {
-							if fieldText[field] == nil { //补充fieldText
-								text := qu.ObjToString(tmp[field])
-								text = ProcessData(text) //处理文本(字母转大写,删除一些符号)
-								fieldText[field] = text
-							}
-						}
-						qu.Debug("-------------------------开始排除词匹配--------------------------")
-						qu.Debug("tr.NW---", len(tr.NW))
-						for j, tag_nw := range tr.NW { //排除词匹配
-							IsMatchNotKey := RegMatchTest(fieldText, tag_nw.MatchType, tag_nw.KeyReg, nil, nil, false, false)
-							qu.Debug(IsMatchNotKey, "------------------------------------------------------------")
-							if !IsMatchNotKey { //排除词未匹配,匹配附加词关键词
-								if RegMatchTest(fieldText, tr.AW[j].MatchType, tr.AW[j].KeyReg, nil, nil, false, true) && RegMatchTest(fieldText, tr.KW[j].MatchType, tr.KW[j].KeyReg, nil, nil, false, false) {
-									tagname := tr.TagNames[j]
-									qu.Debug("tagname-----", tagname)
-									tagNameMap[tagname] = true
-									tagIdMap[tr.ID] = true
-								}
-							}
-						}
-					}
-				}
-				//tagname
-				tagNameArr := MapDataToArr(tagNameMap)
-				tagIDArr := MapDataToArr(tagIdMap)
-				if len(tagNameArr) > 0 {
-					tmp["tagname"] = strings.Join(tagNameArr, ",")
-					tmp["tagid"] = strings.Join(tagIDArr, ",")
-				}
-			}
-			//appid
-			tmp["appid"] = c.AppId
-			//客户名称
-			tmp["departname"] = dm.Name
-			//存储数据
-			dm.DataLock.Lock()
-			qu.Debug("tmp---", tmp)
-		} else {
-			qu.Debug("未匹配数据---", id)
-		}
-	}
-}
-
 //匹配
 func RegMatchTest(fieldText map[string]interface{}, matchType []string, matchReg *Reg, matchKey map[string]bool, matchKeyType map[string]bool, goon, isAddWord bool) (match bool) {
 	defer qu.Catch()
@@ -1095,3 +749,12 @@ func RegMatchTest(fieldText map[string]interface{}, matchType []string, matchReg
 	}
 	return
 }
+
+//发布时间不在范围内(7天)不要这条数据
+func SkipData(tmp map[string]interface{}) bool {
+	comeIn := qu.Int64All(tmp["comeintime"])
+	if qu.Int64All(tmp["publishtime"]) > (comeIn - 7*24*60*60 ) {
+		return true
+	}
+	return false
+}

+ 1 - 1
customerdata/src/util/mgodb/mgo.go

@@ -1,4 +1,4 @@
-package mgodb
+package mongodb
 
 import (
 	"context"

+ 3 - 3
src/service/private_rule.go

@@ -25,8 +25,8 @@ type Rule struct {
 	archive xweb.Mapper `xweb:"/service/rule/archive"` //存档
 	history xweb.Mapper `xweb:"/service/rule/history"` //变更列表
 
-	downloadData     xweb.Mapper `xweb:"/service/rule/downloadata"`      //下载数据
-	downloadRule     xweb.Mapper `xweb:"/service/rule/downloadrule"`     //下载标签
+	downloadData     xweb.Mapper `xweb:"/service/cuser/rule/downloadata"`      //下载数据
+	downloadRule     xweb.Mapper `xweb:"/service//cuser/rule/downloadrule"`     //下载标签
 	demoData         xweb.Mapper `xweb:"/service/rule/preview"`          //预览数据
 	exportEs         xweb.Mapper `xweb:"/service/rule/exportes"`         //导出es
 }
@@ -201,7 +201,7 @@ func (r *Rule) DownloadData() {
 func (r *Rule) DownloadRule() {
 	defer qu.Catch()
 	id := r.GetString("id")
-	path := ResponseXlsx_Rule(id, "private")
+	path := ResponseXlsx_Rule(id)
 	if path == "" {
 		r.ServeJson("没有数据")
 	} else {

+ 4 - 8
src/util/parsxlsx.go

@@ -26,7 +26,7 @@ const (
 )
 
 //通用标签相关字段
-var export_fields = []string{"s_customer", "s_tagname", "", "s_area", "s_city", "s_district", "s_toptype", "s_subtype", "i_starttime", "i_endtime", "s_budgetlimit", "s_bidamountlimit", "s_globaltopscopeclass", "s_globalsubscopeclass", "s_globalbuyerclass", "s_globaladdkey", "s_globaladdkeymatch", "s_globalnotkey", "s_globalnotkeymatch", "s_globalclearkey", "s_globalclearkeymatch", "s_existfields", "i_extfieldstype"}
+var export_fields = []string{"s_userid", "s_tagname", "", "s_area", "s_city", "s_district", "s_toptype", "s_subtype", "i_starttime", "i_endtime", "s_budgetlimit", "s_bidamountlimit", "s_globaltopscopeclass", "s_globalsubscopeclass", "s_globalbuyerclass", "s_globaladdkey", "s_globaladdkeymatch", "s_globalnotkey", "s_globalnotkeymatch", "s_globalclearkey", "s_globalclearkeymatch", "s_existfields", "i_extfieldstype"}
 
 //关键词标签相关字段
 var export_o_rules = []string{"s_matchkey", "s_keymatch", "s_addkey", "s_addkeymatch", "s_notkey", "s_notkeymatch", "s_buyerclass"}
@@ -239,7 +239,7 @@ func ResponseXlsx_Data(id string) string {
 		query := bson.M{
 			"_id": bson.ObjectIdHex(id),
 		}
-		data, _ := Mgo.FindOne("tags", query)
+		data, _ := Mgo.FindOne("cuserdepartrule", query)
 		if (*data) != nil && len(*data) > 0 {
 			isStandard := true
 			if util.Int64All((*data)["i_extfieldstype"]) == Advanced {
@@ -352,14 +352,10 @@ func ResponseXlsx_Data(id string) string {
 	return ""
 }
 
-func ResponseXlsx_Rule(id, s string) string {
+func ResponseXlsx_Rule(id string) string {
 	defer util.Catch()
 	var data *map[string]interface{}
-	if s == "private" {
-		data, _ = Mgo.FindById("tags", id, `{}`)
-	} else {
-		data, _ = Mgo.FindById("tags_common", id, `{}`)
-	}
+	data, _ = Mgo.FindById("cuserdepartrule", id, `{}`)
 	if len(*data) == 0 {
 		return ""
 	}

+ 2 - 2
src/web/templates/private/cuser_rule_list.html

@@ -126,8 +126,8 @@
                 {"data": "_id", width:"26%",render: function (val, a, row, pos) {
                     var s = [val, row.s_dataid];
                       tmp = '<div>' +
-                          '<a class="btn btn-sm btn-primary" href="/service/rule/downloadrule?id='+val+'">导出标签</a>&nbsp;&nbsp;'+
-                          '<a class="btn btn-sm btn-info" href="/service/rule/downloadata?s_dataid='+val+'">导出数据</a>&nbsp;&nbsp;'+
+                          '<a class="btn btn-sm btn-primary" href="/service/cuser/rule/downloadrule?id='+val+'">导出标签</a>&nbsp;&nbsp;'+
+                          '<a class="btn btn-sm btn-info" href="/service/rule/cuser/downloadata?s_dataid='+val+'">导出数据</a>&nbsp;&nbsp;'+
                           '<a class="btn btn-sm btn-warning" onclick="archive(\'' + val + '\')">存档</a>&nbsp;&nbsp;'+
                           '</div>';
                       return tmp

+ 2 - 2
src/web/templates/private/euser_rule_list.html

@@ -125,8 +125,8 @@
                 {"data": "_id", width:"26%",render: function (val, a, row, pos) {
                     var s = [val, row.s_dataid];
                       tmp = '<div>' +
-                          '<a class="btn btn-sm btn-primary" href="/service/rule/downloadrule?id='+val+'">导出标签</a>&nbsp;&nbsp;'+
-                          '<a class="btn btn-sm btn-info" href="/service/rule/downloadata?s_dataid='+val+'">导出数据</a>&nbsp;&nbsp;'+
+                          '<a class="btn btn-sm btn-primary" href="/service/cuser/rule/downloadrule?id='+val+'">导出标签</a>&nbsp;&nbsp;'+
+                          '<a class="btn btn-sm btn-info" href="/service/cuser/rule/downloadata?s_dataid='+val+'">导出数据</a>&nbsp;&nbsp;'+
                           '<a class="btn btn-sm btn-warning" onclick="archive(\'' + val + '\')">存档</a>&nbsp;&nbsp;'+
                           '</div>';
                       return tmp