|
@@ -1,22 +1,22 @@
|
|
|
package dopush
|
|
|
|
|
|
import (
|
|
|
- "sort"
|
|
|
"container/list"
|
|
|
"fmt"
|
|
|
"log"
|
|
|
"math/rand"
|
|
|
"qfw/push"
|
|
|
"qfw/push/dfa"
|
|
|
+ "qfw/push/listdb"
|
|
|
"qfw/util"
|
|
|
"qfw/util/mongodb"
|
|
|
qrpc "qfw/util/rpc"
|
|
|
"regexp"
|
|
|
"runtime"
|
|
|
+ "sort"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
"time"
|
|
|
- "qfw/push/listdb"
|
|
|
)
|
|
|
|
|
|
var se util.SimpleEncrypt
|
|
@@ -45,14 +45,42 @@ func (b *Pjob) CreateUserInterestWord() {
|
|
|
b.Dfa.AddWord(words...)
|
|
|
}
|
|
|
|
|
|
-type sortList []map[string]interface{}
|
|
|
+type sortList []*map[string]interface{}
|
|
|
+
|
|
|
+func (s sortList) Len() int {
|
|
|
+ return len(s)
|
|
|
+}
|
|
|
|
|
|
func (s sortList) Less(i, j int) bool {
|
|
|
- return util.Int64All(s[i]["publishtime"]) < util.Int64All(s[j]["publishtime"])
|
|
|
+ defer func() {
|
|
|
+ if r := recover(); r != nil {
|
|
|
+ log.Println("[E]", r)
|
|
|
+ for skip := 0; ; skip++ {
|
|
|
+ _, file, line, ok := runtime.Caller(skip)
|
|
|
+ if !ok {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ go log.Printf("%v,%v\n", file, line)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ return util.Int64All((*s[i])["publishtime"]) > util.Int64All((*s[j])["publishtime"])
|
|
|
}
|
|
|
|
|
|
func (s sortList) Swap(i, j int) {
|
|
|
- s[i], s[j] = s[j], s[i]
|
|
|
+ defer func() {
|
|
|
+ if r := recover(); r != nil {
|
|
|
+ log.Println("[E]", r)
|
|
|
+ for skip := 0; ; skip++ {
|
|
|
+ _, file, line, ok := runtime.Caller(skip)
|
|
|
+ if !ok {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ go log.Printf("%v,%v\n", file, line)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ s[i], s[j] = s[j], s[i]
|
|
|
}
|
|
|
|
|
|
//内存数据推送
|
|
@@ -81,64 +109,59 @@ func (p *Pjob) EachInfoForView(mopenid, words string) map[string]interface{} {
|
|
|
words: &ss,
|
|
|
}
|
|
|
} else {
|
|
|
- *p.Cache = push.InitCache(p.Stype, mopenid,true)
|
|
|
+ *p.Cache = push.InitCache(p.Stype, mopenid, true)
|
|
|
}
|
|
|
p.CreateUserInterestWord()
|
|
|
userMap := &map[*push.MemberInterest]sortList{}
|
|
|
- LDB:=listdb.GetDb(p.Stype)
|
|
|
-
|
|
|
+ LDB := listdb.GetDb(p.Stype)
|
|
|
LDB.Lock.Lock()
|
|
|
- L1:
|
|
|
- for e := LDB.DB.Back(); e != nil; e = e.Prev(){
|
|
|
- tmp:=e.Value.(map[string]interface{})
|
|
|
- title := util.ObjToString(tmp["title"])
|
|
|
- if title != "" {
|
|
|
- //返回匹配到的词组
|
|
|
- res := p.Dfa.Analy(title)
|
|
|
- if len(res) > 0 {
|
|
|
- province := tmp["area"].(string)
|
|
|
- provinceVal := push.GetChoiceCode(province)
|
|
|
- if "A" != province {
|
|
|
- tmp["title"] = `[<span class='area'>` + province + `</span>]` + title
|
|
|
- }
|
|
|
- for _, v := range res {
|
|
|
- //根据关键词返回用户指针
|
|
|
- tw := (*p.Cache)[v]
|
|
|
- if tw != nil {
|
|
|
- //遍历用户加入到此条信息上
|
|
|
- for _, v2 := range *tw {
|
|
|
- if v2.Province == "A" || v2.ProvinceVal&provinceVal > 0 {
|
|
|
- s := (*userMap)[v2]
|
|
|
- if s == nil {
|
|
|
- s = sortList{}
|
|
|
- (*userMap)[v2] = s
|
|
|
- }
|
|
|
- s=append(s,tmp)
|
|
|
- if len(s) > 50 {
|
|
|
- break L1
|
|
|
- }
|
|
|
+L1:
|
|
|
+ for e := LDB.DB.Back(); e != nil; e = e.Prev() {
|
|
|
+ tmp := e.Value.(*map[string]interface{})
|
|
|
+ title := util.ObjToString((*tmp)["title"])
|
|
|
+ if title != "" {
|
|
|
+ //返回匹配到的词组
|
|
|
+ res := p.Dfa.Analy(title)
|
|
|
+ if len(res) > 0 {
|
|
|
+ province := (*tmp)["area"].(string)
|
|
|
+ provinceVal := push.GetChoiceCode(province)
|
|
|
+ for _, v := range res {
|
|
|
+ //根据关键词返回用户指针
|
|
|
+ tw := (*p.Cache)[v]
|
|
|
+ if tw != nil {
|
|
|
+ //遍历用户加入到此条信息上
|
|
|
+ for _, v2 := range *tw {
|
|
|
+ if v2.Province == "A" || v2.ProvinceVal&provinceVal > 0 {
|
|
|
+ s := (*userMap)[v2]
|
|
|
+ if s == nil {
|
|
|
+ s = sortList{}
|
|
|
+ }
|
|
|
+ s = append(s, tmp)
|
|
|
+ (*userMap)[v2] = s
|
|
|
+ if len(s) > 50 {
|
|
|
+ break L1
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
}
|
|
|
LDB.Lock.Unlock()
|
|
|
mcontent := map[string]interface{}{}
|
|
|
mcontent["s_type"] = p.Stype
|
|
|
bmatch := false
|
|
|
- for kk, vv := range *(userMap) {
|
|
|
+ for kk, v := range *(userMap) {
|
|
|
k := *kk
|
|
|
- v := vv
|
|
|
str := fmt.Sprintf("<div>根据您设置的关键词(%s),给您推送以下"+p.StypeName+"信息:</div>", strings.Join(k.Interest, ";"))
|
|
|
//发送内容组合
|
|
|
i := 0
|
|
|
publishTimes := map[string]interface{}{}
|
|
|
publishTitle := map[string]bool{}
|
|
|
sort.Sort(v)
|
|
|
- for ks := v.Front(); ks != nil; ks = ks.Next() {
|
|
|
- k2 := *(ks.Value.(*map[string]interface{}))
|
|
|
+ for _, kn := range v {
|
|
|
+ k2 := *kn
|
|
|
title := strings.Replace(k2["title"].(string), "\n", "", -1)
|
|
|
if !publishTitle[title] {
|
|
|
publishTitle[title] = true
|
|
@@ -164,13 +187,13 @@ func (p *Pjob) EachInfoForView(mopenid, words string) map[string]interface{} {
|
|
|
break
|
|
|
}
|
|
|
}
|
|
|
- return mcontent
|
|
|
+ return mcontent
|
|
|
}
|
|
|
|
|
|
func (p *Pjob) DoPush(mopenid, stime string, opr int, ltime int64) bool {
|
|
|
log.Println("开始执行任务:", p.StypeName, stime)
|
|
|
p.Cache = new(map[string]*[]*push.MemberInterest)
|
|
|
- *p.Cache = push.InitCache(p.Stype, mopenid,false)
|
|
|
+ *p.Cache = push.InitCache(p.Stype, mopenid, false)
|
|
|
p.CreateUserInterestWord()
|
|
|
return EachAllBidInfo(p.Stype, "["+p.StypeName+"信息]", p.StypeName, ltime, p.MaxPushSize, p.Dfa, p.Cache, opr)
|
|
|
}
|
|
@@ -367,7 +390,6 @@ func SendWeixin(k *push.MemberInterest, TITLE, ShortTitle, str, stype string, no
|
|
|
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
//遍历数据只做标题预览
|
|
|
func (p *Pjob) EachInfoForViewOld(mopenid, words string) map[string]interface{} {
|