|
@@ -5,7 +5,6 @@ import (
|
|
"log"
|
|
"log"
|
|
qutil "qfw/util"
|
|
qutil "qfw/util"
|
|
"qfw/util/mongodb"
|
|
"qfw/util/mongodb"
|
|
- "strconv"
|
|
|
|
"strings"
|
|
"strings"
|
|
"sync"
|
|
"sync"
|
|
"time"
|
|
"time"
|
|
@@ -31,7 +30,6 @@ type Info struct {
|
|
site string //站点
|
|
site string //站点
|
|
href string //正文的url
|
|
href string //正文的url
|
|
repeatid string //重复id
|
|
repeatid string //重复id
|
|
-
|
|
|
|
titleSpecialWord bool //标题特殊词
|
|
titleSpecialWord bool //标题特殊词
|
|
specialWord bool //再次判断的特殊词
|
|
specialWord bool //再次判断的特殊词
|
|
mergemap map[string]interface{} //合并记录
|
|
mergemap map[string]interface{} //合并记录
|
|
@@ -75,20 +73,17 @@ func NewDatamap(days int, lastid string) *datamap {
|
|
if qutil.IntAll(tmp["repeat"]) == 1 || qutil.IntAll(tmp["repeat"]) == -1 {
|
|
if qutil.IntAll(tmp["repeat"]) == 1 || qutil.IntAll(tmp["repeat"]) == -1 {
|
|
continuSum++
|
|
continuSum++
|
|
} else {
|
|
} else {
|
|
- cm := tmp["comeintime"] //时间单位?
|
|
|
|
- comeintime := qutil.Int64All(cm)
|
|
|
|
- if comeintime == 0 {
|
|
|
|
- id := qutil.BsonIdToSId(tmp["_id"])[0:8]
|
|
|
|
- comeintime, _ = strconv.ParseInt(id, 16, 64)
|
|
|
|
|
|
+ pt:=tmp["publishtime"]
|
|
|
|
+ pt_time:=qutil.Int64All(pt)
|
|
|
|
+ if pt_time<=0 {
|
|
|
|
+ continue
|
|
}
|
|
}
|
|
if now1 == 0 {
|
|
if now1 == 0 {
|
|
- now1 = comeintime
|
|
|
|
|
|
+ now1 = pt_time
|
|
}
|
|
}
|
|
- if qutil.Float64All(now1-comeintime) < datelimit {
|
|
|
|
|
|
+ if qutil.Float64All(now1-pt_time) < datelimit {
|
|
info := NewInfo(tmp)
|
|
info := NewInfo(tmp)
|
|
- //时间字符串
|
|
|
|
- dkey := qutil.FormatDateWithObj(&cm, qutil.Date_yyyyMMdd)
|
|
|
|
- //拼接的一个时间字符串 xxxx_类型_省份
|
|
|
|
|
|
+ dkey := qutil.FormatDateWithObj(&pt, qutil.Date_yyyyMMdd)
|
|
k := fmt.Sprintf("%s_%s_%s", dkey, info.subtype, info.area)
|
|
k := fmt.Sprintf("%s_%s_%s", dkey, info.subtype, info.area)
|
|
data := dm.data[k]
|
|
data := dm.data[k]
|
|
if data == nil {
|
|
if data == nil {
|
|
@@ -124,17 +119,15 @@ func NewHistorymap(startid string, lastid string, startTime int64, lastTime int6
|
|
true)).Sort("-_id").Iter()
|
|
true)).Sort("-_id").Iter()
|
|
m, n := 0, 0
|
|
m, n := 0, 0
|
|
for tmp_start := make(map[string]interface{}); it_start.Next(&tmp_start); {
|
|
for tmp_start := make(map[string]interface{}); it_start.Next(&tmp_start); {
|
|
- cm := tmp_start["comeintime"]
|
|
|
|
- comeintime := qutil.Int64All(tmp_start["comeintime"])
|
|
|
|
- if comeintime == 0 {
|
|
|
|
- id := qutil.BsonIdToSId(tmp_start["_id"])[0:8]
|
|
|
|
- comeintime, _ = strconv.ParseInt(id, 16, 64)
|
|
|
|
|
|
+ pt_s:=tmp_start["publishtime"]
|
|
|
|
+ pt_time:=qutil.Int64All(pt_s)
|
|
|
|
+ if pt_time<=0 {
|
|
|
|
+ continue
|
|
}
|
|
}
|
|
-
|
|
|
|
- if qutil.Float64All(startTime-comeintime) <= datelimit {
|
|
|
|
|
|
+ if qutil.Float64All(startTime-pt_time) <= datelimit {
|
|
n++
|
|
n++
|
|
info := NewInfo(tmp_start)
|
|
info := NewInfo(tmp_start)
|
|
- dkey := qutil.FormatDateWithObj(&cm, qutil.Date_yyyyMMdd)
|
|
|
|
|
|
+ dkey := qutil.FormatDateWithObj(&pt_s, qutil.Date_yyyyMMdd)
|
|
k := fmt.Sprintf("%s_%s_%s", dkey, info.subtype, info.area)
|
|
k := fmt.Sprintf("%s_%s_%s", dkey, info.subtype, info.area)
|
|
data := hm.data[k]
|
|
data := hm.data[k]
|
|
if data == nil {
|
|
if data == nil {
|
|
@@ -157,17 +150,15 @@ func NewHistorymap(startid string, lastid string, startTime int64, lastTime int6
|
|
true)).Sort("_id").Iter()
|
|
true)).Sort("_id").Iter()
|
|
|
|
|
|
for tmp_last := make(map[string]interface{}); it_last.Next(&tmp_last); {
|
|
for tmp_last := make(map[string]interface{}); it_last.Next(&tmp_last); {
|
|
- cm := tmp_last["comeintime"]
|
|
|
|
- comeintime := qutil.Int64All(tmp_last["comeintime"])
|
|
|
|
- if comeintime == 0 {
|
|
|
|
- id := qutil.BsonIdToSId(tmp_last["_id"])[0:8]
|
|
|
|
- comeintime, _ = strconv.ParseInt(id, 16, 64)
|
|
|
|
|
|
+ pt_l:=tmp_last["publishtime"]
|
|
|
|
+ pt_time:=qutil.Int64All(pt_l)
|
|
|
|
+ if pt_time<=0 {
|
|
|
|
+ continue
|
|
}
|
|
}
|
|
-
|
|
|
|
- if qutil.Float64All(comeintime-lastTime) <= datelimit {
|
|
|
|
|
|
+ if qutil.Float64All(pt_time-lastTime) <= datelimit {
|
|
m++
|
|
m++
|
|
info := NewInfo(tmp_last)
|
|
info := NewInfo(tmp_last)
|
|
- dkey := qutil.FormatDateWithObj(&cm, qutil.Date_yyyyMMdd)
|
|
|
|
|
|
+ dkey := qutil.FormatDateWithObj(&pt_l, qutil.Date_yyyyMMdd)
|
|
k := fmt.Sprintf("%s_%s_%s", dkey, info.subtype, info.area)
|
|
k := fmt.Sprintf("%s_%s_%s", dkey, info.subtype, info.area)
|
|
data := hm.data[k]
|
|
data := hm.data[k]
|
|
if data == nil {
|
|
if data == nil {
|
|
@@ -209,7 +200,6 @@ func NewInfo(tmp map[string]interface{}) *Info {
|
|
info.publishtime = qutil.Int64All(tmp["publishtime"])
|
|
info.publishtime = qutil.Int64All(tmp["publishtime"])
|
|
info.bidopentime = qutil.Int64All(tmp["bidopentime"])
|
|
info.bidopentime = qutil.Int64All(tmp["bidopentime"])
|
|
info.agencyaddr = qutil.ObjToString(tmp["agencyaddr"])
|
|
info.agencyaddr = qutil.ObjToString(tmp["agencyaddr"])
|
|
- //info.detail = qutil.ObjToString(tmp["detail"])
|
|
|
|
info.site = qutil.ObjToString(tmp["site"])
|
|
info.site = qutil.ObjToString(tmp["site"])
|
|
info.href = qutil.ObjToString(tmp["href"])
|
|
info.href = qutil.ObjToString(tmp["href"])
|
|
info.repeatid = qutil.ObjToString(tmp["repeatid"])
|
|
info.repeatid = qutil.ObjToString(tmp["repeatid"])
|
|
@@ -220,16 +210,13 @@ func NewInfo(tmp map[string]interface{}) *Info {
|
|
if info.mergemap == nil {
|
|
if info.mergemap == nil {
|
|
info.mergemap = make(map[string]interface{}, 0)
|
|
info.mergemap = make(map[string]interface{}, 0)
|
|
}
|
|
}
|
|
-
|
|
|
|
return info
|
|
return info
|
|
}
|
|
}
|
|
-
|
|
|
|
//判重方法
|
|
//判重方法
|
|
func (d *datamap) check(info *Info) (b bool, source *Info, reason string) {
|
|
func (d *datamap) check(info *Info) (b bool, source *Info, reason string) {
|
|
keys := []string{}
|
|
keys := []string{}
|
|
d.lock.Lock()
|
|
d.lock.Lock()
|
|
for k, _ := range d.keys { //不同时间段
|
|
for k, _ := range d.keys { //不同时间段
|
|
- //...代码
|
|
|
|
keys = append(keys, fmt.Sprintf("%s_%s_%s", k, info.subtype, info.area))
|
|
keys = append(keys, fmt.Sprintf("%s_%s_%s", k, info.subtype, info.area))
|
|
if info.area != "全国" { //这个后续可以不要
|
|
if info.area != "全国" { //这个后续可以不要
|
|
keys = append(keys, fmt.Sprintf("%s_%s_%s", k, info.subtype, "全国"))
|
|
keys = append(keys, fmt.Sprintf("%s_%s_%s", k, info.subtype, "全国"))
|
|
@@ -247,15 +234,12 @@ L:
|
|
if v.id == info.id { //正常重复
|
|
if v.id == info.id { //正常重复
|
|
return false, v, ""
|
|
return false, v, ""
|
|
}
|
|
}
|
|
- //类型分组
|
|
|
|
if info.subtype == v.subtype {
|
|
if info.subtype == v.subtype {
|
|
- //站点配置--
|
|
|
|
if info.site != "" {
|
|
if info.site != "" {
|
|
sitelock.Lock()
|
|
sitelock.Lock()
|
|
dict := SiteMap[info.site]
|
|
dict := SiteMap[info.site]
|
|
sitelock.Unlock()
|
|
sitelock.Unlock()
|
|
if dict != nil {
|
|
if dict != nil {
|
|
- //临时改变--具体值
|
|
|
|
if info.area == "全国" && dict["area"] != "" {
|
|
if info.area == "全国" && dict["area"] != "" {
|
|
info.area = qutil.ObjToString(dict["area"])
|
|
info.area = qutil.ObjToString(dict["area"])
|
|
info.city = qutil.ObjToString(dict["city"])
|
|
info.city = qutil.ObjToString(dict["city"])
|
|
@@ -267,8 +251,7 @@ L:
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
- //前置条件1 站点相关
|
|
|
|
|
|
+ //前置条件1 - 站点相关
|
|
if info.site != "" && info.site == v.site {
|
|
if info.site != "" && info.site == v.site {
|
|
if info.href != "" && info.href == v.href {
|
|
if info.href != "" && info.href == v.href {
|
|
reason = "href相同"
|
|
reason = "href相同"
|
|
@@ -277,17 +260,17 @@ L:
|
|
break L
|
|
break L
|
|
}
|
|
}
|
|
if info.href != "" && info.href != v.href {
|
|
if info.href != "" && info.href != v.href {
|
|
- reason = "href不同"
|
|
|
|
|
|
+ reason = "href不同-"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- //前置条件2 标题相关 - 有且一个关键词
|
|
|
|
|
|
+ //前置条件2 - 标题相关,有且一个关键词
|
|
if ((info.titleSpecialWord && !v.titleSpecialWord) || (info.specialWord && !v.specialWord)) &&
|
|
if ((info.titleSpecialWord && !v.titleSpecialWord) || (info.specialWord && !v.specialWord)) &&
|
|
info.title != v.title && v.title != "" && info.title != "" {
|
|
info.title != v.title && v.title != "" && info.title != "" {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
|
|
- //前置条件3 标题相关 - 均含有关键词
|
|
|
|
|
|
+ //前置条件3 - 标题相关,均含有关键词
|
|
if ((info.titleSpecialWord && v.titleSpecialWord) || (info.specialWord && v.specialWord)) &&
|
|
if ((info.titleSpecialWord && v.titleSpecialWord) || (info.specialWord && v.specialWord)) &&
|
|
len([]rune(v.title)) > 10 && len([]rune(info.title)) > 10 && v.title != "" && info.title != "" {
|
|
len([]rune(v.title)) > 10 && len([]rune(info.title)) > 10 && v.title != "" && info.title != "" {
|
|
if !(strings.Contains(v.title, info.title) || strings.Contains(info.title, v.title)) {
|
|
if !(strings.Contains(v.title, info.title) || strings.Contains(info.title, v.title)) {
|
|
@@ -359,35 +342,34 @@ L:
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
-func (h *historymap) checkHistory(info *Info) (b bool, source *Info, reasons string) {
|
|
|
|
- h.lock.Lock()
|
|
|
|
- defer h.lock.Unlock()
|
|
|
|
|
|
+func (h *historymap) checkHistory(info *Info) (b bool, source *Info, reason string) {
|
|
keys := []string{}
|
|
keys := []string{}
|
|
- //不同时间段
|
|
|
|
- for k, _ := range h.keys {
|
|
|
|
- //...代码
|
|
|
|
|
|
+ h.lock.Lock()
|
|
|
|
+ for k, _ := range h.keys { //不同时间段
|
|
keys = append(keys, fmt.Sprintf("%s_%s_%s", k, info.subtype, info.area))
|
|
keys = append(keys, fmt.Sprintf("%s_%s_%s", k, info.subtype, info.area))
|
|
if info.area != "全国" { //这个后续可以不要
|
|
if info.area != "全国" { //这个后续可以不要
|
|
keys = append(keys, fmt.Sprintf("%s_%s_%s", k, info.subtype, "全国"))
|
|
keys = append(keys, fmt.Sprintf("%s_%s_%s", k, info.subtype, "全国"))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ h.lock.Unlock()
|
|
|
|
+
|
|
L:
|
|
L:
|
|
for _, k := range keys {
|
|
for _, k := range keys {
|
|
|
|
+ h.lock.Lock()
|
|
data := h.data[k]
|
|
data := h.data[k]
|
|
|
|
+ h.lock.Unlock()
|
|
if len(data) > 0 { //对比v 找到同类型,同省或全国的数据作对比
|
|
if len(data) > 0 { //对比v 找到同类型,同省或全国的数据作对比
|
|
for _, v := range data {
|
|
for _, v := range data {
|
|
- reason := ""
|
|
|
|
|
|
+ reason = ""
|
|
if v.id == info.id { //正常重复
|
|
if v.id == info.id { //正常重复
|
|
return false, v, ""
|
|
return false, v, ""
|
|
}
|
|
}
|
|
- //类型分组
|
|
|
|
if info.subtype == v.subtype {
|
|
if info.subtype == v.subtype {
|
|
- //站点配置--
|
|
|
|
if info.site != "" {
|
|
if info.site != "" {
|
|
|
|
+ sitelock.Lock()
|
|
dict := SiteMap[info.site]
|
|
dict := SiteMap[info.site]
|
|
-
|
|
|
|
|
|
+ sitelock.Unlock()
|
|
if dict != nil {
|
|
if dict != nil {
|
|
- //临时改变--具体值
|
|
|
|
if info.area == "全国" && dict["area"] != "" {
|
|
if info.area == "全国" && dict["area"] != "" {
|
|
info.area = qutil.ObjToString(dict["area"])
|
|
info.area = qutil.ObjToString(dict["area"])
|
|
info.city = qutil.ObjToString(dict["city"])
|
|
info.city = qutil.ObjToString(dict["city"])
|
|
@@ -399,28 +381,26 @@ L:
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
- //前置条件1 站点相关
|
|
|
|
|
|
+ //前置条件1 - 站点相关
|
|
if info.site != "" && info.site == v.site {
|
|
if info.site != "" && info.site == v.site {
|
|
if info.href != "" && info.href == v.href {
|
|
if info.href != "" && info.href == v.href {
|
|
reason = "href相同"
|
|
reason = "href相同"
|
|
b = true
|
|
b = true
|
|
source = v
|
|
source = v
|
|
- reasons = reason
|
|
|
|
break L
|
|
break L
|
|
}
|
|
}
|
|
if info.href != "" && info.href != v.href {
|
|
if info.href != "" && info.href != v.href {
|
|
- reason = "href不同"
|
|
|
|
|
|
+ reason = "href不同-"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- //前置条件2 标题相关 - 有且一个关键词
|
|
|
|
|
|
+ //前置条件2 - 标题相关,有且一个关键词
|
|
if ((info.titleSpecialWord && !v.titleSpecialWord) || (info.specialWord && !v.specialWord)) &&
|
|
if ((info.titleSpecialWord && !v.titleSpecialWord) || (info.specialWord && !v.specialWord)) &&
|
|
info.title != v.title && v.title != "" && info.title != "" {
|
|
info.title != v.title && v.title != "" && info.title != "" {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
|
|
- //前置条件3 标题相关 - 均含有关键词
|
|
|
|
|
|
+ //前置条件3 - 标题相关,均含有关键词
|
|
if ((info.titleSpecialWord && v.titleSpecialWord) || (info.specialWord && v.specialWord)) &&
|
|
if ((info.titleSpecialWord && v.titleSpecialWord) || (info.specialWord && v.specialWord)) &&
|
|
len([]rune(v.title)) > 10 && len([]rune(info.title)) > 10 && v.title != "" && info.title != "" {
|
|
len([]rune(v.title)) > 10 && len([]rune(info.title)) > 10 && v.title != "" && info.title != "" {
|
|
if !(strings.Contains(v.title, info.title) || strings.Contains(info.title, v.title)) {
|
|
if !(strings.Contains(v.title, info.title) || strings.Contains(info.title, v.title)) {
|
|
@@ -430,7 +410,6 @@ L:
|
|
reason = "标题关键词且包含关系"
|
|
reason = "标题关键词且包含关系"
|
|
b = true
|
|
b = true
|
|
source = v
|
|
source = v
|
|
- reasons = reason
|
|
|
|
break L
|
|
break L
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -471,28 +450,20 @@ L:
|
|
|
|
|
|
//
|
|
//
|
|
if b {
|
|
if b {
|
|
- //判重
|
|
|
|
if info.repeatid == source.id {
|
|
if info.repeatid == source.id {
|
|
- //重复-无变化-不处理
|
|
|
|
- b = false
|
|
|
|
- } else {
|
|
|
|
- if source.id != "" {
|
|
|
|
- //重复-有变化-覆盖记录处理
|
|
|
|
- }
|
|
|
|
|
|
+ b = false//重复-无变化-不处理
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
if source != nil {
|
|
if source != nil {
|
|
- if source.repeatid != "" {
|
|
|
|
- //未判重-有变化--记录
|
|
|
|
|
|
+ if source.repeatid != "" {//未判重-有变化--记录
|
|
b = true
|
|
b = true
|
|
- reasons = "未判重记录"
|
|
|
|
|
|
+ reason = "未判重记录"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
//往预存数据 d 添加
|
|
//往预存数据 d 添加
|
|
if !b {
|
|
if !b {
|
|
- ct, _ := strconv.ParseInt(info.id[:8], 16, 64)
|
|
|
|
|
|
+ ct := info.publishtime
|
|
dkey := qutil.FormatDateByInt64(&ct, qutil.Date_yyyyMMdd)
|
|
dkey := qutil.FormatDateByInt64(&ct, qutil.Date_yyyyMMdd)
|
|
k := fmt.Sprintf("%s_%s_%s", dkey, info.subtype, info.area)
|
|
k := fmt.Sprintf("%s_%s_%s", dkey, info.subtype, info.area)
|
|
data := h.data[k]
|
|
data := h.data[k]
|
|
@@ -513,7 +484,7 @@ L:
|
|
|
|
|
|
//替换原始数据池
|
|
//替换原始数据池
|
|
func (d *datamap) replaceSourceData(replaceData *Info, replaceId string) {
|
|
func (d *datamap) replaceSourceData(replaceData *Info, replaceId string) {
|
|
- ct, _ := strconv.ParseInt(replaceId[:8], 16, 64)
|
|
|
|
|
|
+ ct := replaceData.publishtime
|
|
dkey := qutil.FormatDateByInt64(&ct, qutil.Date_yyyyMMdd)
|
|
dkey := qutil.FormatDateByInt64(&ct, qutil.Date_yyyyMMdd)
|
|
k := fmt.Sprintf("%s_%s_%s", dkey, replaceData.subtype, replaceData.area)
|
|
k := fmt.Sprintf("%s_%s_%s", dkey, replaceData.subtype, replaceData.area)
|
|
d.lock.Lock()
|
|
d.lock.Lock()
|
|
@@ -523,7 +494,6 @@ func (d *datamap) replaceSourceData(replaceData *Info, replaceId string) {
|
|
d.data[k] = data
|
|
d.data[k] = data
|
|
if !d.keys[dkey] {
|
|
if !d.keys[dkey] {
|
|
d.keys[dkey] = true
|
|
d.keys[dkey] = true
|
|
- d.update(ct)
|
|
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
//遍历替换
|
|
//遍历替换
|
|
@@ -539,16 +509,16 @@ func (d *datamap) replaceSourceData(replaceData *Info, replaceId string) {
|
|
}
|
|
}
|
|
|
|
|
|
func (h *historymap) replaceSourceData(replaceData *Info, replaceId string) {
|
|
func (h *historymap) replaceSourceData(replaceData *Info, replaceId string) {
|
|
- ct, _ := strconv.ParseInt(replaceId[:8], 16, 64)
|
|
|
|
|
|
+ ct := replaceData.publishtime
|
|
dkey := qutil.FormatDateByInt64(&ct, qutil.Date_yyyyMMdd)
|
|
dkey := qutil.FormatDateByInt64(&ct, qutil.Date_yyyyMMdd)
|
|
k := fmt.Sprintf("%s_%s_%s", dkey, replaceData.subtype, replaceData.area)
|
|
k := fmt.Sprintf("%s_%s_%s", dkey, replaceData.subtype, replaceData.area)
|
|
|
|
+ h.lock.Lock()
|
|
data := h.data[k]
|
|
data := h.data[k]
|
|
if data == nil {
|
|
if data == nil {
|
|
data = []*Info{replaceData}
|
|
data = []*Info{replaceData}
|
|
h.data[k] = data
|
|
h.data[k] = data
|
|
if !h.keys[dkey] {
|
|
if !h.keys[dkey] {
|
|
h.keys[dkey] = true
|
|
h.keys[dkey] = true
|
|
- //h.update(ct)
|
|
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
//遍历替换
|
|
//遍历替换
|
|
@@ -558,19 +528,69 @@ func (h *historymap) replaceSourceData(replaceData *Info, replaceId string) {
|
|
break
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
h.data[k] = data
|
|
h.data[k] = data
|
|
}
|
|
}
|
|
|
|
+ h.lock.Unlock()
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+func (d *datamap) update(t int64) {
|
|
|
|
+ //每天0点清除历史数据
|
|
|
|
+ d.keymap = d.GetLatelyFiveDay(t)
|
|
|
|
+ m := map[string]bool{}
|
|
|
|
+ for _, v := range d.keymap {
|
|
|
|
+ m[v] = true
|
|
|
|
+ }
|
|
|
|
+ all, all1 := 0, 0
|
|
|
|
+ for k, v := range d.data {
|
|
|
|
+ all += len(v)
|
|
|
|
+ if !m[k[:8]] {
|
|
|
|
+ delete(d.data, k)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for k, _ := range d.keys {
|
|
|
|
+ if !m[k] {
|
|
|
|
+ delete(d.keys, k)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for _, v := range d.data {
|
|
|
|
+ all1 += len(v)
|
|
|
|
+ }
|
|
|
|
+ //log.Println("更新前后数据:", all, all1)
|
|
}
|
|
}
|
|
|
|
|
|
-//以下为判重 - 一揽子的方法
|
|
|
|
|
|
+func (d *datamap) GetLatelyFiveDay(t int64) []string {
|
|
|
|
+ array := make([]string, d.days)
|
|
|
|
+ now := time.Unix(t, 0)
|
|
|
|
+ for i := 0; i < d.days; i++ {
|
|
|
|
+ array[i] = now.Format(qutil.Date_yyyyMMdd)
|
|
|
|
+ now = now.AddDate(0, 0, -1)
|
|
|
|
+ }
|
|
|
|
+ return array
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+**************************
|
|
|
|
+******* 以下为判重 ********
|
|
|
|
+**************************
|
|
|
|
+*/
|
|
|
|
+
|
|
//判重方法1
|
|
//判重方法1
|
|
func quickHeavyMethodOne(v *Info, info *Info, reason string) (bool, string) {
|
|
func quickHeavyMethodOne(v *Info, info *Info, reason string) (bool, string) {
|
|
|
|
+
|
|
|
|
+ isMeet:=false
|
|
if info.subtype == "招标" || info.subtype == "邀标" || info.subtype == "询价" ||
|
|
if info.subtype == "招标" || info.subtype == "邀标" || info.subtype == "询价" ||
|
|
info.subtype == "竞谈" || info.subtype == "单一" || info.subtype == "竞价" ||
|
|
info.subtype == "竞谈" || info.subtype == "单一" || info.subtype == "竞价" ||
|
|
info.subtype == "变更" || info.subtype == "其他" {
|
|
info.subtype == "变更" || info.subtype == "其他" {
|
|
//招标结果
|
|
//招标结果
|
|
- if tenderRepeat_A(v, info, reason) {
|
|
|
|
|
|
+ if isMeet, reason = tenderRepeat_A(v, info, reason); isMeet {
|
|
if tenderRepeat_C(v, info) {
|
|
if tenderRepeat_C(v, info) {
|
|
return false, reason
|
|
return false, reason
|
|
} else {
|
|
} else {
|
|
@@ -583,7 +603,10 @@ func quickHeavyMethodOne(v *Info, info *Info, reason string) (bool, string) {
|
|
|
|
|
|
} else if info.subtype == "中标" || info.subtype == "成交" || info.subtype == "废标" || info.subtype == "流标" {
|
|
} else if info.subtype == "中标" || info.subtype == "成交" || info.subtype == "废标" || info.subtype == "流标" {
|
|
//中标结果
|
|
//中标结果
|
|
- if winningRepeat_A(v, info, reason) {
|
|
|
|
|
|
+ if isMeet, reason = tenderRepeat_A(v, info, reason); isMeet {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ if isMeet, reason = winningRepeat_A(v, info, reason);isMeet {
|
|
if winningRepeat_C(v, info) {
|
|
if winningRepeat_C(v, info) {
|
|
return false, reason
|
|
return false, reason
|
|
} else {
|
|
} else {
|
|
@@ -596,7 +619,7 @@ func quickHeavyMethodOne(v *Info, info *Info, reason string) (bool, string) {
|
|
|
|
|
|
} else if info.subtype == "合同" || info.subtype == "验收" || info.subtype == "违规" {
|
|
} else if info.subtype == "合同" || info.subtype == "验收" || info.subtype == "违规" {
|
|
//合同
|
|
//合同
|
|
- if contractRepeat_A(v, info, reason) {
|
|
|
|
|
|
+ if isMeet, reason = contractRepeat_A(v, info, reason);isMeet {
|
|
if contractRepeat_C(v, info) {
|
|
if contractRepeat_C(v, info) {
|
|
return false, reason
|
|
return false, reason
|
|
} else {
|
|
} else {
|
|
@@ -608,7 +631,7 @@ func quickHeavyMethodOne(v *Info, info *Info, reason string) (bool, string) {
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
//招标结果
|
|
//招标结果
|
|
- if tenderRepeat_A(v, info, reason) {
|
|
|
|
|
|
+ if isMeet, reason = tenderRepeat_A(v, info, reason);isMeet {
|
|
if tenderRepeat_C(v, info) {
|
|
if tenderRepeat_C(v, info) {
|
|
return false, reason
|
|
return false, reason
|
|
} else {
|
|
} else {
|
|
@@ -625,14 +648,13 @@ func quickHeavyMethodOne(v *Info, info *Info, reason string) (bool, string) {
|
|
|
|
|
|
//判重方法2
|
|
//判重方法2
|
|
func quickHeavyMethodTwo(v *Info, info *Info, reason string) (bool, string) {
|
|
func quickHeavyMethodTwo(v *Info, info *Info, reason string) (bool, string) {
|
|
- //相同
|
|
|
|
|
|
+ isMeet:=false
|
|
if v.agency == info.agency && v.agency != "" && info.agency != "" {
|
|
if v.agency == info.agency && v.agency != "" && info.agency != "" {
|
|
-
|
|
|
|
if info.subtype == "招标" || info.subtype == "邀标" || info.subtype == "询价" ||
|
|
if info.subtype == "招标" || info.subtype == "邀标" || info.subtype == "询价" ||
|
|
info.subtype == "竞谈" || info.subtype == "单一" || info.subtype == "竞价" ||
|
|
info.subtype == "竞谈" || info.subtype == "单一" || info.subtype == "竞价" ||
|
|
info.subtype == "变更" || info.subtype == "其他" {
|
|
info.subtype == "变更" || info.subtype == "其他" {
|
|
//招标结果
|
|
//招标结果
|
|
- if tenderRepeat_B(v, info, reason) {
|
|
|
|
|
|
+ if isMeet, reason = tenderRepeat_B(v, info, reason);isMeet {
|
|
if tenderRepeat_C(v, info) { //有不同
|
|
if tenderRepeat_C(v, info) { //有不同
|
|
return false, reason
|
|
return false, reason
|
|
} else {
|
|
} else {
|
|
@@ -645,7 +667,7 @@ func quickHeavyMethodTwo(v *Info, info *Info, reason string) (bool, string) {
|
|
|
|
|
|
} else if info.subtype == "中标" || info.subtype == "成交" || info.subtype == "废标" || info.subtype == "流标" {
|
|
} else if info.subtype == "中标" || info.subtype == "成交" || info.subtype == "废标" || info.subtype == "流标" {
|
|
//中标结果
|
|
//中标结果
|
|
- if winningRepeat_B(v, info, reason) {
|
|
|
|
|
|
+ if isMeet, reason = winningRepeat_B(v, info, reason);isMeet {
|
|
if winningRepeat_C(v, info) { //有不同
|
|
if winningRepeat_C(v, info) { //有不同
|
|
return false, reason
|
|
return false, reason
|
|
} else {
|
|
} else {
|
|
@@ -658,7 +680,7 @@ func quickHeavyMethodTwo(v *Info, info *Info, reason string) (bool, string) {
|
|
|
|
|
|
} else if info.subtype == "合同" || info.subtype == "验收" || info.subtype == "违规" {
|
|
} else if info.subtype == "合同" || info.subtype == "验收" || info.subtype == "违规" {
|
|
//合同
|
|
//合同
|
|
- if contractRepeat_B(v, info, reason) {
|
|
|
|
|
|
+ if isMeet, reason = contractRepeat_B(v, info, reason);isMeet {
|
|
if contractRepeat_C(v, info) { //有不同
|
|
if contractRepeat_C(v, info) { //有不同
|
|
return false, reason
|
|
return false, reason
|
|
} else {
|
|
} else {
|
|
@@ -670,7 +692,7 @@ func quickHeavyMethodTwo(v *Info, info *Info, reason string) (bool, string) {
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
//招标结果
|
|
//招标结果
|
|
- if tenderRepeat_B(v, info, reason) {
|
|
|
|
|
|
+ if isMeet, reason = tenderRepeat_B(v, info, reason);isMeet {
|
|
if tenderRepeat_C(v, info) { //有不同
|
|
if tenderRepeat_C(v, info) { //有不同
|
|
return false, reason
|
|
return false, reason
|
|
} else {
|
|
} else {
|
|
@@ -702,7 +724,7 @@ func quickHeavyMethodTwo(v *Info, info *Info, reason string) (bool, string) {
|
|
}
|
|
}
|
|
|
|
|
|
//招标_A
|
|
//招标_A
|
|
-func tenderRepeat_A(v *Info, info *Info, reason string) bool {
|
|
|
|
|
|
+func tenderRepeat_A(v *Info, info *Info, reason string) (bool ,string) {
|
|
|
|
|
|
var ss string
|
|
var ss string
|
|
p1, p2, p3, p4, p9, p10, p11 := false, false, false, false, false, false, false
|
|
p1, p2, p3, p4, p9, p10, p11 := false, false, false, false, false, false, false
|
|
@@ -744,13 +766,13 @@ func tenderRepeat_A(v *Info, info *Info, reason string) bool {
|
|
(p3 && p4 && p9) || (p3 && p4 && p10) || (p3 && p4 && p11) ||
|
|
(p3 && p4 && p9) || (p3 && p4 && p10) || (p3 && p4 && p11) ||
|
|
(p4 && p9 && p10) || (p4 && p9 && p11) || (p9 && p10 && p11) {
|
|
(p4 && p9 && p10) || (p4 && p9 && p11) || (p9 && p10 && p11) {
|
|
reason = reason + "满足招标A,3要素组合-" + ss + ","
|
|
reason = reason + "满足招标A,3要素组合-" + ss + ","
|
|
- return true
|
|
|
|
|
|
+ return true,reason
|
|
}
|
|
}
|
|
- return false
|
|
|
|
|
|
+ return false,reason
|
|
}
|
|
}
|
|
|
|
|
|
//招标_B
|
|
//招标_B
|
|
-func tenderRepeat_B(v *Info, info *Info, reason string) bool {
|
|
|
|
|
|
+func tenderRepeat_B(v *Info, info *Info, reason string) (bool,string) {
|
|
|
|
|
|
m, n := 0, 0
|
|
m, n := 0, 0
|
|
if v.projectname != "" && v.projectname == info.projectname {
|
|
if v.projectname != "" && v.projectname == info.projectname {
|
|
@@ -779,13 +801,13 @@ func tenderRepeat_B(v *Info, info *Info, reason string) bool {
|
|
}
|
|
}
|
|
if m >= 2 {
|
|
if m >= 2 {
|
|
if n == 2 && m == 2 {
|
|
if n == 2 && m == 2 {
|
|
- return false
|
|
|
|
|
|
+ return false,reason
|
|
} else {
|
|
} else {
|
|
reason = reason + "满足招标B,七选二,"
|
|
reason = reason + "满足招标B,七选二,"
|
|
- return true
|
|
|
|
|
|
+ return true,reason
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- return false
|
|
|
|
|
|
+ return false,reason
|
|
}
|
|
}
|
|
|
|
|
|
//招标_C
|
|
//招标_C
|
|
@@ -808,7 +830,7 @@ func tenderRepeat_C(v *Info, info *Info) bool {
|
|
}
|
|
}
|
|
|
|
|
|
//中标_A
|
|
//中标_A
|
|
-func winningRepeat_A(v *Info, info *Info, reason string) bool {
|
|
|
|
|
|
+func winningRepeat_A(v *Info, info *Info, reason string) (bool,string) {
|
|
|
|
|
|
var ss string
|
|
var ss string
|
|
p1, p2, p3, p5, p6, p11 := false, false, false, false, false, false
|
|
p1, p2, p3, p5, p6, p11 := false, false, false, false, false, false
|
|
@@ -845,14 +867,14 @@ func winningRepeat_A(v *Info, info *Info, reason string) bool {
|
|
(p3 && p5 && p6) || (p3 && p5 && p11) || (p3 && p6 && p11) ||
|
|
(p3 && p5 && p6) || (p3 && p5 && p11) || (p3 && p6 && p11) ||
|
|
(p5 && p6 && p11) {
|
|
(p5 && p6 && p11) {
|
|
reason = reason + "满足中标A,3要素组合-" + ss + ","
|
|
reason = reason + "满足中标A,3要素组合-" + ss + ","
|
|
- return true
|
|
|
|
|
|
+ return true,reason
|
|
}
|
|
}
|
|
|
|
|
|
- return false
|
|
|
|
|
|
+ return false,reason
|
|
}
|
|
}
|
|
|
|
|
|
//中标_B
|
|
//中标_B
|
|
-func winningRepeat_B(v *Info, info *Info, reason string) bool {
|
|
|
|
|
|
+func winningRepeat_B(v *Info, info *Info, reason string) (bool,string) {
|
|
|
|
|
|
m, n := 0, 0
|
|
m, n := 0, 0
|
|
if v.projectname != "" && v.projectname == info.projectname {
|
|
if v.projectname != "" && v.projectname == info.projectname {
|
|
@@ -878,13 +900,13 @@ func winningRepeat_B(v *Info, info *Info, reason string) bool {
|
|
}
|
|
}
|
|
if m >= 2 {
|
|
if m >= 2 {
|
|
if n == 2 && m == 2 {
|
|
if n == 2 && m == 2 {
|
|
- return false
|
|
|
|
|
|
+ return false,reason
|
|
} else {
|
|
} else {
|
|
reason = reason + "满足中标B.六选二,"
|
|
reason = reason + "满足中标B.六选二,"
|
|
- return true
|
|
|
|
|
|
+ return true,reason
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- return false
|
|
|
|
|
|
+ return false,reason
|
|
}
|
|
}
|
|
|
|
|
|
//中标_C
|
|
//中标_C
|
|
@@ -902,27 +924,29 @@ func winningRepeat_C(v *Info, info *Info) bool {
|
|
}
|
|
}
|
|
|
|
|
|
//合同_A
|
|
//合同_A
|
|
-func contractRepeat_A(v *Info, info *Info, reason string) bool {
|
|
|
|
|
|
+func contractRepeat_A(v *Info, info *Info, reason string) (bool,string) {
|
|
|
|
|
|
- if tenderRepeat_A(v, info, reason) {
|
|
|
|
- return true
|
|
|
|
|
|
+ isMeet := false
|
|
|
|
+ if isMeet, reason = tenderRepeat_A(v, info, reason);isMeet {
|
|
|
|
+ return true,reason
|
|
}
|
|
}
|
|
- if winningRepeat_A(v, info, reason) {
|
|
|
|
- return true
|
|
|
|
|
|
+ if isMeet, reason = winningRepeat_A(v, info, reason);isMeet {
|
|
|
|
+ return true,reason
|
|
}
|
|
}
|
|
- return false
|
|
|
|
|
|
+ return false,reason
|
|
}
|
|
}
|
|
|
|
|
|
//合同_B
|
|
//合同_B
|
|
-func contractRepeat_B(v *Info, info *Info, reason string) bool {
|
|
|
|
|
|
+func contractRepeat_B(v *Info, info *Info, reason string) (bool,string) {
|
|
|
|
|
|
- if tenderRepeat_B(v, info, reason) {
|
|
|
|
- return true
|
|
|
|
|
|
+ isMeet := false
|
|
|
|
+ if isMeet, reason = tenderRepeat_B(v, info, reason);isMeet {
|
|
|
|
+ return true,reason
|
|
}
|
|
}
|
|
- if winningRepeat_B(v, info, reason) {
|
|
|
|
- return true
|
|
|
|
|
|
+ if isMeet, reason = winningRepeat_B(v, info, reason);isMeet {
|
|
|
|
+ return true,reason
|
|
}
|
|
}
|
|
- return false
|
|
|
|
|
|
+ return false,reason
|
|
}
|
|
}
|
|
|
|
|
|
//合同_C
|
|
//合同_C
|
|
@@ -937,37 +961,14 @@ func contractRepeat_C(v *Info, info *Info) bool {
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
|
|
|
|
-func (d *datamap) update(t int64) {
|
|
|
|
- //每天0点清除历史数据
|
|
|
|
- d.keymap = d.GetLatelyFiveDay(t)
|
|
|
|
- m := map[string]bool{}
|
|
|
|
- for _, v := range d.keymap {
|
|
|
|
- m[v] = true
|
|
|
|
- }
|
|
|
|
- all, all1 := 0, 0
|
|
|
|
- for k, v := range d.data {
|
|
|
|
- all += len(v)
|
|
|
|
- if !m[k[:8]] {
|
|
|
|
- delete(d.data, k)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- for k, _ := range d.keys {
|
|
|
|
- if !m[k] {
|
|
|
|
- delete(d.keys, k)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- for _, v := range d.data {
|
|
|
|
- all1 += len(v)
|
|
|
|
- }
|
|
|
|
- //log.Println("更新前后数据:", all, all1)
|
|
|
|
-}
|
|
|
|
|
|
|
|
-func (d *datamap) GetLatelyFiveDay(t int64) []string {
|
|
|
|
- array := make([]string, d.days)
|
|
|
|
- now := time.Unix(t, 0)
|
|
|
|
- for i := 0; i < d.days; i++ {
|
|
|
|
- array[i] = now.Format(qutil.Date_yyyyMMdd)
|
|
|
|
- now = now.AddDate(0, 0, -1)
|
|
|
|
- }
|
|
|
|
- return array
|
|
|
|
-}
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|