wangchuanjin 8 ヶ月 前
コミット
a344b1b640

+ 2 - 2
pushentniche/go.mod

@@ -3,8 +3,8 @@ module pushentniche
 go 1.18
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66
-	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20240409034353-b921b6028877
+	app.yhyue.com/moapp/jybase v0.0.0-20240912091212-401647f2624b
+	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20241112080644-d1ecda51860c
 	github.com/ClickHouse/clickhouse-go/v2 v2.2.0
 	github.com/gogf/gf/v2 v2.6.4
 	go.mongodb.org/mongo-driver v1.11.4

+ 4 - 4
pushentniche/go.sum

@@ -1,9 +1,9 @@
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d h1:WPsYuuptAd3UEgN+jPzpnsDe/OvcshDUUtOTZPYGSJ8=
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
-app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66 h1:kCRYqzclN4dtGuGC89ID2w5lGrJgqZC8bNL8mRR+tiU=
-app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
-bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20240409034353-b921b6028877 h1:nshpRQvjoqkDkJv9gu2USwwrp83G4wIGH5061zY9W4o=
-bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20240409034353-b921b6028877/go.mod h1:ECcF3i8XJ9J6vZ9ZK0gyxHqMRm9UBtgQAdWD2Tw7vvA=
+app.yhyue.com/moapp/jybase v0.0.0-20240912091212-401647f2624b h1:IjAmZuaG4voMYPuIh+phJYI4fwMM/cLfZ5LEz7wrEos=
+app.yhyue.com/moapp/jybase v0.0.0-20240912091212-401647f2624b/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
+bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20241112080644-d1ecda51860c h1:GvZxWalt6jrVdY4LGzEyxYRj5458eFn8CJuHRkDYKYg=
+bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20241112080644-d1ecda51860c/go.mod h1:Q+r+DRzSIHAsYBA7i39O2UrZB6ZhRtfCjVpN7n1p+Fg=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.1.0 h1:60fFbyRAnn5vrnsPk99pVB2aJVin6nDIkNnmekdpFso=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.1.0/go.mod h1:rRiGzKG4F/fmkNxXQCxrkxNWc8yf1SmW8qWCKfGIQSM=
 bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.17 h1:QHjAuAYPJjml8e19ytWxgKAboo9+f6aQUH/s1UUEfrA=

+ 0 - 5
pushentniche/push/db.json

@@ -45,11 +45,6 @@
 	        "passWord": "=PDT49#80Z!RVv52_z",
 			"maxOpenConns": 5,
 			"maxIdleConns": 5
-	    },
-		"clickhouse": {
-	        "address": "clickhouse://jytop:pwdTopJy123@192.168.3.207:19000/jianyu?dial_timeout=2000ms&max_execution_time=60s",
-			"maxOpenConns": 5,
-			"maxIdleConns": 5
 	    }
     },
 	"elasticsearch": {

+ 7 - 7
pushentniche/push/job/nomsgtipjob.go

@@ -153,7 +153,7 @@ func (n *NoMsgTipJob) tip(taskType, hour int, user *UserInfo) {
 		logger.Info("无消息提醒任务", taskType, "mysql判断用户该时间段推送过,过滤掉", startUnix, endUnix, user.Entniche.UserId)
 		return
 	}
-	firstTitle, area, mailContent, infoCount := n.SubRecommend(user)
+	firstTitle, area, jcly, mailContent, infoCount := n.SubRecommend(user)
 	if infoCount == 0 {
 		logger.Info("无消息提醒任务", taskType, "没有要推荐的信息,过滤掉", user.Entniche.UserId)
 		return
@@ -164,7 +164,7 @@ func (n *NoMsgTipJob) tip(taskType, hour int, user *UserInfo) {
 	ut1, _, ut3 := GetUserType(user)
 	if user.PushSet.SubSet.WxPush == 1 {
 		logger.Info("无消息提醒任务", taskType, "开始微信推送", user.Entniche.UserId)
-		isPushOk := n.sendWeixin(user, ut3, firstTitle, area, infoCount)
+		isPushOk := n.sendWeixin(user, ut3, firstTitle, area, jcly, infoCount)
 		logger.Info("无消息提醒任务", taskType, "微信推送结束", isPushOk, user.Entniche.UserId)
 	}
 	if user.PushSet.SubSet.AppPush == 1 {
@@ -189,16 +189,16 @@ func (n *NoMsgTipJob) tip(taskType, hour int, user *UserInfo) {
 }
 
 //推送微信
-func (n *NoMsgTipJob) sendWeixin(user *UserInfo, ut3, firstTitle, area string, infoCount int) bool {
+func (n *NoMsgTipJob) sendWeixin(user *UserInfo, ut3, firstTitle, area, jcly string, infoCount int) bool {
 	tmplData := map[string]*qrpc.TmplItem{
 		"thing3": &qrpc.TmplItem{
-			Value: "智能推荐",
+			Value: area,
 		},
 		"thing11": &qrpc.TmplItem{
 			Value: firstTitle,
 		},
 		"thing7": &qrpc.TmplItem{
-			Value: area,
+			Value: jcly,
 		},
 		"time9": &qrpc.TmplItem{
 			Value: NowFormat(Date_Time_Layout),
@@ -218,12 +218,12 @@ func (n *NoMsgTipJob) sendWeixin(user *UserInfo, ut3, firstTitle, area string, i
 }
 
 //
-func (n *NoMsgTipJob) SubRecommend(user *UserInfo) (string, string, string, int) {
+func (n *NoMsgTipJob) SubRecommend(user *UserInfo) (string, string, string, string, int) {
 	n.selectPool <- true
 	defer func() {
 		<-n.selectPool
 	}()
-	return VarRecommend.SubRecommend(Clickhouse, Config.JianyuDomain, user.Id, Config.NoMsgTip.Mail.Content, user.PushSet.SubSet.MailPush)
+	return VarRecommend.SubRecommend(Clickhouse, Config.JianyuDomain, user.Id, Config.NoMsgTip.Mail.Content, user.PushSet.SubSet.MailPush, 10)
 }
 
 //

+ 3 - 2
pushfollowent/push/db/db.go

@@ -2,11 +2,12 @@ package public
 
 import (
 	"log"
-	m "app.yhyue.com/moapp/jybase/mongodb"
-	. "bp.jydev.jianyu360.cn/BaseService/pushpkg/p"
+
 	util "app.yhyue.com/moapp/jybase/common"
+	m "app.yhyue.com/moapp/jybase/mongodb"
 	"app.yhyue.com/moapp/jybase/mysql"
 	"app.yhyue.com/moapp/jybase/redis"
+	. "bp.jydev.jianyu360.cn/BaseService/pushpkg/p"
 )
 
 var (

+ 1 - 1
pushfollowproject/go.mod

@@ -3,7 +3,7 @@ module pushfollowproject
 go 1.18
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20240523083821-42a82b37ae20
+	app.yhyue.com/moapp/jybase v0.0.0-20240912091212-401647f2624b
 	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20231219023159-706ee090fb7c
 )
 

+ 2 - 2
pushfollowproject/go.sum

@@ -1,7 +1,7 @@
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d h1:WPsYuuptAd3UEgN+jPzpnsDe/OvcshDUUtOTZPYGSJ8=
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
-app.yhyue.com/moapp/jybase v0.0.0-20240523083821-42a82b37ae20 h1:F1ZHkzo7yHp5eNrZDqQxaXMIKFQU72bsI1dMq3ztJLA=
-app.yhyue.com/moapp/jybase v0.0.0-20240523083821-42a82b37ae20/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
+app.yhyue.com/moapp/jybase v0.0.0-20240912091212-401647f2624b h1:IjAmZuaG4voMYPuIh+phJYI4fwMM/cLfZ5LEz7wrEos=
+app.yhyue.com/moapp/jybase v0.0.0-20240912091212-401647f2624b/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
 bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20231219023159-706ee090fb7c h1:SGS1H8noBLlPg09YNhI8DKKLQs6G6ErSy0Dl0Bnxsv4=
 bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20231219023159-706ee090fb7c/go.mod h1:1SQIPPL5Ya5BzQdByFKtTkXrXTWBv+PDqWIhNknLnZw=
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=

+ 8 - 6
pushjyinside/config.json

@@ -8,15 +8,17 @@
 	"kecheng":{
 		"deptId":3502,
 		"reTryTime":3,
-		"maxTime":30,
+		"maxTime": 0,
 		"title":"客户移交客户成功组",
 		"mail":{
-			"content":"<style> *,body,html{margin:0px;font-family:tahoma,arial,'Hiragino Sans GB','Microsoft YaHei',宋体,ans-serif;font-size:16px;}p{margin:15px;font-size:18px;}table{background-color: rgb(244, 244, 249);padding:5px 15px;border:solid 1px #ddd;margin: 20px 0px 20px 50px;float:left;}.tit{width:120px;}td{padding: 5px;}.clear{clear: both;}</style><p>各位好,以下订单用户已经完成支付,烦请对接后续售后服务事项,谢谢!</p>%s<div class='clear'></div>",
-			"table":"<table><tr><td class='tit'>产品名称:</td><td>%s</td></tr><tr><td class='tit'>联系方式:</td><td>%s</td></tr><tr><td class='tit'>联系人姓名:</td><td>%s</td></tr><tr><td class='tit'>订单编号:</td><td>%s</td></tr><tr><td class='tit'>订单金额:</td><td>%.2f</td></tr><tr><td class='tit'>使用起止时间:</td><td>%s</td></tr><tr><td class='tit'>分配客成:</td><td>%s</td></tr>%s</table>",
-			"serviceList":"<tr><td class='tit'>服务列表:</td><td>%s</td></tr>"
+			"content":"<style> *,body,html{margin:10px;font-family:tahoma,arial,'Hiragino Sans GB','Microsoft YaHei',宋体,ans-serif;font-size:16px;}p{margin:15px;font-size:18px;}table{background-color: rgb(244, 244, 249);padding:5px 15px;border:solid 1px #ddd;margin: 20px 0px 20px 50px;vertical-align:top;display:inline-block;}.tit{width:120px;}td{padding: 5px;}.clear{clear: both;}</style><p>各位好,以下订单用户已经完成支付,烦请对接后续售后服务事项,谢谢!</p>%s<div class='clear'></div>",
+			"table":"<table><tr><td class='tit'>产品名称:</td><td>%s</td></tr><tr><td class='tit'>公司名称:</td><td>%s</td></tr><tr><td class='tit'>联系方式:</td><td>%s</td></tr><tr><td class='tit'>联系人姓名:</td><td>%s</td></tr><tr><td class='tit'>订单编号:</td><td>%s</td></tr><tr><td class='tit'>合同金额:</td><td>%.2f</td></tr><tr><td class='tit'>使用起止时间:</td><td>%s</td></tr><tr><td class='tit'>分配客成:</td><td>%s</td></tr><tr><td class='tit'>签署销售:</td><td>%s</td></tr>%s</table>",
+			"serviceList":"<tr><td class='tit'>服务列表:</td><td>%s</td></tr>",
+			"returnMoney":"<tr><td class='tit'>回款金额:</td><td>%.2f</td></tr>"
 		},
-		"message":"该订单用户已经完成支付,烦请对接后续售后服务事项,谢谢!\n产品名称:%s 联系方式:%s 联系人姓名:%s 订单编号:%s 订单金额:%.2f 使用起止时间:%s 分配客成:%s%s",
-		"messageServiceList":" 服务列表:%s"
+		"message":"该订单用户已经完成支付,烦请对接后续售后服务事项,谢谢!\n产品名称:%s 公司名称:%s 联系方式:%s 联系人姓名:%s 订单编号:%s 合同金额:%.2f 使用起止时间:%s 分配客成:%s 签署销售:%s%s",
+		"messageServiceList":" 服务列表:%s",
+		"messageReturnMoney":" 回款金额:%.2f"
 	},
 	"mails":[
 		{

+ 2 - 0
pushjyinside/config/config.go

@@ -26,9 +26,11 @@ type config struct {
 			Table       string `json:"table"`
 			Content     string `json:"content"`
 			ServiceList string `json:"serviceList"`
+			ReturnMoney string `json:"returnMoney"`
 		} `json:"mail"`
 		Message            string `json:"message"`
 		MessageServiceList string `json:"messageServiceList"`
+		MessageReturnMoney string `json:"messageReturnMoney"`
 	} `json:"keCheng"`
 	Mails []*pushMail `json:"mails"`
 }

+ 29 - 11
pushjyinside/job/pushkcjob.go

@@ -31,10 +31,12 @@ func (p *PushKcJob) LoadAllOrder() {
 	Tidb_Main.SelectByBath(1, func(l *[]map[string]interface{}) bool {
 		if user_phone := util.ObjToString((*l)[0]["user_phone"]); user_phone == "" || strings.HasPrefix(user_phone, "9") {
 			return true
+		} else if vip_starttime := util.ObjToString((*l)[0]["vip_starttime"]); strings.HasPrefix(vip_starttime, "2099") {
+			return true
 		}
 		p.AllOrder[util.Int64All((*l)[0]["id"])] = true
 		return true
-	}, `select id,user_phone from jianyu.dataexport_order where order_status=1 and autoUpdate<?`, TaskConfig.OrderEachTime)
+	}, `select id,user_phone,vip_starttime from jianyu.dataexport_order where order_status=1 and autoUpdate<?`, TaskConfig.OrderEachTime)
 }
 
 //
@@ -64,12 +66,15 @@ func (p *PushKcJob) Execute() {
 		id := util.Int64All((*l)[0]["id"])
 		user_phone := util.ObjToString((*l)[0]["user_phone"])
 		user_id := util.ObjToString((*l)[0]["user_id"])
+		vip_starttime := util.ObjToString((*l)[0]["vip_starttime"])
 		if user_id == "" {
 			return true
 		} else if p.AllOrder[id] {
 			return true
 		} else if user_phone == "" || strings.HasPrefix(user_phone, "9") {
 			return true
+		} else if strings.HasPrefix(vip_starttime, "2099") {
+			return true
 		}
 		order_code := util.ObjToString((*l)[0]["order_code"])
 		if exists, err := redis.Exists(RedisCode, fmt.Sprintf(RedisKcOrderTip, id)); exists {
@@ -104,16 +109,22 @@ func (p *PushKcJob) Execute() {
 		orderCodes = append(orderCodes, order_code)
 		orderInfos = append(orderInfos, &OrderInfo{
 			Id:          id,
+			CompanyName: util.ObjToString((*l)[0]["company_name"]),
 			UserId:      user_id,
 			ProductType: product_type,
 			OrderCode:   order_code,
-			OrderMoney:  util.Float64All((*l)[0]["order_money"]) / 100,
+			PayMoney:    util.Float64All((*l)[0]["pay_money"]) / 100,
+			ReturnMoney: util.Float64All((*l)[0]["return_money"]) / 100,
 			UserPhone:   user_phone,
 			StartEnd:    fmt.Sprintf("%s--%s", strings.Split(util.ObjToString((*l)[0]["vip_starttime"]), " ")[0], strings.Split(util.ObjToString((*l)[0]["vip_endtime"]), " ")[0]),
 			SeriveList:  serviceList,
+			SaleName:    util.ObjToString((*l)[0]["create_person"]),
 		})
 		return true
-	}, `select id,order_code,order_money,user_phone,vip_starttime,vip_endtime,product_type,filter,user_id,ent_id from jianyu.dataexport_order where autoUpdate>=? and autoUpdate<? and order_status=1 and (product_type='大会员' or product_type='大会员-子账号') order by autoUpdate`, TaskConfig.OrderEachTime, nowFormat)
+	}, `SELECT a.id,a.order_code,a.pay_money,a.user_phone,a.vip_starttime,a.vip_endtime,a.product_type,a.filter,a.user_id,a.ent_id,a.company_name,a.create_person,SUM(b.return_money) AS return_money FROM jianyu.dataexport_order a
+	LEFT JOIN return_money_record b ON (a.order_code=b.order_code)
+	WHERE a.autoUpdate>=? AND a.autoUpdate<? AND a.order_status=1 AND (a.product_type='大会员' OR a.product_type='大会员-子账号')
+	GROUP BY a.id ORDER BY a.autoUpdate`, TaskConfig.OrderEachTime, nowFormat)
 	//}, `select id,order_code,order_money,user_phone,vip_starttime,vip_endtime,product_type,filter,user_id,ent_id from jianyu.dataexport_order where id=256858`)
 	logger.Info(p.TaskName, count, "个订单需要发送提醒", orderCodes)
 	if len(orderCodes) > 0 {
@@ -127,17 +138,20 @@ func (p *PushKcJob) Execute() {
 				clueInfo[util.ObjToString((*l)[0]["phone"])] = &ClueInfo{
 					KcName:   util.ObjToString((*l)[0]["name"]),
 					UserName: util.ObjToString((*l)[0]["bname"]),
+					//SaleName: util.ObjToString((*l)[0]["sname"]),
 				}
 				return true
-			}, `select a.phone,c.ent_id,c.name,b.name as bname from dwd_f_userbase_contacts a
+			}, `select a.phone,c.ent_id,c.name,b.name as bname,d.name AS sname from dwd_f_userbase_contacts a
 			inner join dwd_f_crm_clue_info b on (a.phone in (`+whs+`) and a.baseinfo_id=b.uid)
-			left join dwd_f_csm_customer_info c on (b.id=c.clue_id AND c.is_transfer=0) LIMIT 1`, args...)
+			left join dwd_f_csm_customer_info c on (b.id=c.clue_id AND c.is_transfer=0)
+			left join dwd_f_crm_personnel_management d on (b.position_id=d.position_id)`, args...)
 			for k, v := range orderInfos {
 				if ci := clueInfo[v.UserPhone]; ci == nil || ci.KcName == "" {
 					continue
 				}
 				v.DisKcName = clueInfo[v.UserPhone].KcName
 				v.UserName = clueInfo[v.UserPhone].UserName
+				//v.SaleName = clueInfo[v.UserPhone].SaleName
 				if k == len(orderInfos)-1 {
 					break L
 				}
@@ -151,13 +165,17 @@ func (p *PushKcJob) Execute() {
 			}
 		}
 		for _, v := range orderInfos {
-			tableServiceList, messageServiceList := "", ""
+			tableAppend, messageAppend := "", ""
 			if len(v.SeriveList) > 0 {
-				tableServiceList = fmt.Sprintf(Config.KeCheng.Mail.ServiceList, strings.Join(v.SeriveList, ","))
-				messageServiceList = fmt.Sprintf(Config.KeCheng.MessageServiceList, strings.Join(v.SeriveList, ","))
+				tableAppend = fmt.Sprintf(Config.KeCheng.Mail.ServiceList, strings.Join(v.SeriveList, ","))
+				messageAppend = fmt.Sprintf(Config.KeCheng.MessageServiceList, strings.Join(v.SeriveList, ","))
+			}
+			if v.ReturnMoney > 0 {
+				tableAppend += fmt.Sprintf(Config.KeCheng.Mail.ReturnMoney, v.ReturnMoney)
+				messageAppend += fmt.Sprintf(Config.KeCheng.MessageReturnMoney, v.ReturnMoney)
 			}
-			table += fmt.Sprintf(Config.KeCheng.Mail.Table, v.ProductType, v.UserPhone, v.UserName, v.OrderCode, v.OrderMoney, v.StartEnd, v.DisKcName, tableServiceList)
-			messageConents = append(messageConents, fmt.Sprintf(Config.KeCheng.Message, v.ProductType, v.UserPhone, v.UserName, v.OrderCode, v.OrderMoney, v.StartEnd, v.DisKcName, messageServiceList))
+			table += fmt.Sprintf(Config.KeCheng.Mail.Table, v.ProductType, v.CompanyName, v.UserPhone, v.UserName, v.OrderCode, v.PayMoney, v.StartEnd, v.DisKcName, v.SaleName, tableAppend)
+			messageConents = append(messageConents, fmt.Sprintf(Config.KeCheng.Message, v.ProductType, v.CompanyName, v.UserPhone, v.UserName, v.OrderCode, v.PayMoney, v.StartEnd, v.DisKcName, v.SaleName, messageAppend))
 			redis.PutCKV(RedisCode, fmt.Sprintf(RedisKcOrderTip, v.Id), 1)
 		}
 		if table != "" {
@@ -185,7 +203,7 @@ func (p *PushKcJob) Execute() {
 					logger.Info(p.TaskName, "邮箱推送结束", isPushOk, v)
 				}
 			}
-			phones = append(phones, Config.TestMails...)
+			phones = append(phones, Config.TestPhones...)
 			if len(phones) > 0 { //发送站内信
 				logger.Info(p.TaskName, "开始站内信推送", phones)
 				users, ok := Mgo.Find("user", map[string]interface{}{

+ 1 - 1
pushjyinside/task.json

@@ -1 +1 @@
-{"orderEachTime":"2024-09-02 00:00:00"}
+{"orderEachTime":"2024-09-12 00:00:00"}

+ 5 - 1
pushjyinside/util/entity.go

@@ -3,17 +3,21 @@ package util
 type OrderInfo struct {
 	Id          int64
 	UserId      string
+	CompanyName string
 	ProductType string
 	OrderCode   string
-	OrderMoney  float64
+	PayMoney    float64
+	ReturnMoney float64
 	UserPhone   string
 	StartEnd    string
 	DisKcName   string
 	UserName    string
 	SeriveList  []string
+	SaleName    string
 }
 
 type ClueInfo struct {
 	KcName   string
 	UserName string
+	SaleName string
 }

+ 2 - 2
pushmember/go.mod

@@ -3,8 +3,8 @@ module pushmember
 go 1.18
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66
-	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20240408032230-511af2024e83
+	app.yhyue.com/moapp/jybase v0.0.0-20240912091212-401647f2624b
+	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20241112080644-d1ecda51860c
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.17
 	github.com/ClickHouse/clickhouse-go/v2 v2.2.0
 )

+ 4 - 4
pushmember/go.sum

@@ -1,9 +1,9 @@
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d h1:WPsYuuptAd3UEgN+jPzpnsDe/OvcshDUUtOTZPYGSJ8=
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
-app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66 h1:kCRYqzclN4dtGuGC89ID2w5lGrJgqZC8bNL8mRR+tiU=
-app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
-bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20240408032230-511af2024e83 h1:5Gv/pdq3CEfLS8VTZozTyZlTXDZhIsnS+1DbkTK3pzs=
-bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20240408032230-511af2024e83/go.mod h1:ECcF3i8XJ9J6vZ9ZK0gyxHqMRm9UBtgQAdWD2Tw7vvA=
+app.yhyue.com/moapp/jybase v0.0.0-20240912091212-401647f2624b h1:IjAmZuaG4voMYPuIh+phJYI4fwMM/cLfZ5LEz7wrEos=
+app.yhyue.com/moapp/jybase v0.0.0-20240912091212-401647f2624b/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
+bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20241112080644-d1ecda51860c h1:GvZxWalt6jrVdY4LGzEyxYRj5458eFn8CJuHRkDYKYg=
+bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20241112080644-d1ecda51860c/go.mod h1:Q+r+DRzSIHAsYBA7i39O2UrZB6ZhRtfCjVpN7n1p+Fg=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.1.0 h1:60fFbyRAnn5vrnsPk99pVB2aJVin6nDIkNnmekdpFso=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.1.0/go.mod h1:rRiGzKG4F/fmkNxXQCxrkxNWc8yf1SmW8qWCKfGIQSM=
 bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.17 h1:QHjAuAYPJjml8e19ytWxgKAboo9+f6aQUH/s1UUEfrA=

+ 0 - 5
pushmember/push/db.json

@@ -36,11 +36,6 @@
 	        "passWord": "=PDT49#80Z!RVv52_z",
 			"maxOpenConns": 5,
 			"maxIdleConns": 5
-	    },
-		"clickhouse": {
-	        "address": "clickhouse://jytop:pwdTopJy123@192.168.3.207:19000/jianyu?dial_timeout=2000ms&max_execution_time=60s",
-			"maxOpenConns": 5,
-			"maxIdleConns": 5
 	    }
     },
 	"elasticsearch": {

+ 7 - 7
pushmember/push/job/nomsgtipjob.go

@@ -145,7 +145,7 @@ func (n *NoMsgTipJob) tip(taskType, hour int, user *UserInfo) {
 		logger.Info("无消息提醒任务", taskType, "mysql判断用户该时间段推送过,过滤掉", startUnix, endUnix, user.Id)
 		return
 	}
-	firstTitle, area, mailContent, infoCount := n.SubRecommend(user)
+	firstTitle, area, jcly, mailContent, infoCount := n.SubRecommend(user)
 	if infoCount == 0 {
 		logger.Info("无消息提醒任务", taskType, "没有要推荐的信息,过滤掉", user.Id)
 		return
@@ -154,7 +154,7 @@ func (n *NoMsgTipJob) tip(taskType, hour int, user *UserInfo) {
 	logger.Info("无消息提醒任务", taskType, "开始推送", user.Id, "rateMode", user.PushSet.SubSet.RateMode, "jpushid", user.Jpushid, "opushid", user.Opushid, "appponetype", user.AppPhoneType, "email", user.PushSet.Email)
 	if user.PushSet.SubSet.WxPush == 1 {
 		logger.Info("无消息提醒任务", taskType, "开始微信推送", user.Id)
-		isPushOk := n.sendWeixin(user, firstTitle, area, infoCount)
+		isPushOk := n.sendWeixin(user, firstTitle, area, jcly, infoCount)
 		logger.Info("无消息提醒任务", taskType, "微信推送结束", isPushOk, user.Id)
 	}
 	if user.PushSet.SubSet.AppPush == 1 {
@@ -179,16 +179,16 @@ func (n *NoMsgTipJob) tip(taskType, hour int, user *UserInfo) {
 }
 
 //推送微信
-func (n *NoMsgTipJob) sendWeixin(user *UserInfo, firstTitle, area string, infoCount int) bool {
+func (n *NoMsgTipJob) sendWeixin(user *UserInfo, firstTitle, area, jcly string, infoCount int) bool {
 	tmplData := map[string]*qrpc.TmplItem{
 		"thing3": &qrpc.TmplItem{
-			Value: "智能推荐",
+			Value: area,
 		},
 		"thing11": &qrpc.TmplItem{
 			Value: firstTitle,
 		},
 		"thing7": &qrpc.TmplItem{
-			Value: area,
+			Value: jcly,
 		},
 		"time9": &qrpc.TmplItem{
 			Value: NowFormat(Date_Time_Layout),
@@ -207,12 +207,12 @@ func (n *NoMsgTipJob) sendWeixin(user *UserInfo, firstTitle, area string, infoCo
 }
 
 //
-func (n *NoMsgTipJob) SubRecommend(user *UserInfo) (string, string, string, int) {
+func (n *NoMsgTipJob) SubRecommend(user *UserInfo) (string, string, string, string, int) {
 	n.selectPool <- true
 	defer func() {
 		<-n.selectPool
 	}()
-	return VarRecommend.SubRecommend(Clickhouse, Config.JianyuDomain, user.Id, Config.NoMsgTip.Mail.Content, user.PushSet.SubSet.MailPush)
+	return VarRecommend.SubRecommend(Clickhouse, Config.JianyuDomain, user.Id, Config.NoMsgTip.Mail.Content, user.PushSet.SubSet.MailPush, 10)
 }
 
 //

+ 0 - 65
pushownermonitor/public/util.go

@@ -1,12 +1,6 @@
 package public
 
 import (
-	"encoding/json"
-	"fmt"
-	"sort"
-
-	util "app.yhyue.com/moapp/jybase/common"
-	"bp.jydev.jianyu360.cn/BaseService/pushpkg/ownermonitor"
 	. "bp.jydev.jianyu360.cn/BaseService/pushpkg/p"
 )
 
@@ -22,62 +16,3 @@ var (
 		Match: "pushownermonitor_match_lock",
 	}
 )
-
-//
-func ToOwnerMonitors(list interface{}) []*ownermonitor.OwnerMonitor {
-	sl := []*ownermonitor.OwnerMonitor{}
-	if list == nil {
-		return sl
-	}
-	b, err := json.Marshal(list)
-	if err != nil {
-		return sl
-	}
-	err = json.Unmarshal(b, &sl)
-	if err != nil {
-		return sl
-	}
-	return sl
-}
-
-//第一个参数是老数据,第二个参数是新进数据
-func MergeFollows(o, n interface{}, maxPushSize int) []*ownermonitor.OwnerMonitor {
-	of, oo := o.([]*ownermonitor.OwnerMonitor)
-	if !oo {
-		of = ToOwnerMonitors(o)
-	}
-	nf, no := n.([]*ownermonitor.OwnerMonitor)
-	if !no {
-		nf = ToOwnerMonitors(n)
-	}
-	key := func(e, v string) string {
-		return fmt.Sprintf("%s_%s", e, v)
-	}
-	m := map[string]*ownermonitor.OwnerMonitor{}
-	idMap := map[string]bool{}
-	for _, v := range nf {
-		m[key(v.EntName, "")] = v
-		for _, vv := range v.Infos {
-			idMap[key(v.EntName, util.ObjToString(vv["_id"]))] = true
-		}
-	}
-	//去重
-	for _, v := range of {
-		follow := m[key(v.EntName, "")]
-		if follow == nil {
-			nf = append(nf, v)
-			continue
-		}
-		for _, vv := range v.Infos {
-			if idMap[key(v.EntName, util.ObjToString(vv["_id"]))] {
-				continue
-			}
-			follow.Infos = append(follow.Infos, vv)
-			sort.Sort(follow.Infos)
-			if len(follow.Infos) > maxPushSize {
-				follow.Infos = follow.Infos[:maxPushSize]
-			}
-		}
-	}
-	return nf
-}

+ 2 - 2
pushsubscribe/go.mod

@@ -3,8 +3,8 @@ module pushsubscribe
 go 1.18
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20240523083821-42a82b37ae20
-	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20240910015235-9d4057893aea
+	app.yhyue.com/moapp/jybase v0.0.0-20240912091212-401647f2624b
+	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20241112080644-d1ecda51860c
 	github.com/ClickHouse/clickhouse-go/v2 v2.2.0
 )
 

+ 4 - 4
pushsubscribe/go.sum

@@ -1,9 +1,9 @@
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d h1:WPsYuuptAd3UEgN+jPzpnsDe/OvcshDUUtOTZPYGSJ8=
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
-app.yhyue.com/moapp/jybase v0.0.0-20240523083821-42a82b37ae20 h1:F1ZHkzo7yHp5eNrZDqQxaXMIKFQU72bsI1dMq3ztJLA=
-app.yhyue.com/moapp/jybase v0.0.0-20240523083821-42a82b37ae20/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
-bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20240910015235-9d4057893aea h1:6jXRLRogStsZl9TYcrgt8eIQhTyjA3FH6avY/K/KQFI=
-bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20240910015235-9d4057893aea/go.mod h1:cQD0ZBTecKyqnEAyZha+80miCCGPCXajZA7aVo3J6kY=
+app.yhyue.com/moapp/jybase v0.0.0-20240912091212-401647f2624b h1:IjAmZuaG4voMYPuIh+phJYI4fwMM/cLfZ5LEz7wrEos=
+app.yhyue.com/moapp/jybase v0.0.0-20240912091212-401647f2624b/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
+bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20241112080644-d1ecda51860c h1:GvZxWalt6jrVdY4LGzEyxYRj5458eFn8CJuHRkDYKYg=
+bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20241112080644-d1ecda51860c/go.mod h1:Q+r+DRzSIHAsYBA7i39O2UrZB6ZhRtfCjVpN7n1p+Fg=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.1.0 h1:60fFbyRAnn5vrnsPk99pVB2aJVin6nDIkNnmekdpFso=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.1.0/go.mod h1:rRiGzKG4F/fmkNxXQCxrkxNWc8yf1SmW8qWCKfGIQSM=
 bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.17 h1:QHjAuAYPJjml8e19ytWxgKAboo9+f6aQUH/s1UUEfrA=

+ 0 - 5
pushsubscribe/push/db.json

@@ -36,11 +36,6 @@
 	        "passWord": "=PDT49#80Z!RVv52_z",
 			"maxOpenConns": 5,
 			"maxIdleConns": 5
-	    },
-		"clickhouse": {
-	        "address": "clickhouse://jytop:pwdTopJy123@192.168.3.207:19000/jianyu?dial_timeout=2000ms&max_execution_time=60s",
-			"maxOpenConns": 5,
-			"maxIdleConns": 5
 	    }
     },
 	"elasticsearch": {

+ 8 - 8
pushsubscribe/push/job/nomsgtipjob.go

@@ -42,7 +42,7 @@ func (n *NoMsgTipJob) Execute(taskType int) {
 		logger.Info("无消息提醒任务", taskType, "免费用户今天推送人数不够", freePushPersonCount, Config.NoMsgTip.CheckMaxPushPersion)
 		return
 	}
-	VarRecommend.SetNewest()
+	//VarRecommend.SetNewest()
 	sess := Mgo.GetMgoConn()
 	defer Mgo.DestoryMongoConn(sess)
 	query := map[string]interface{}{"i_appid": 2}
@@ -109,7 +109,7 @@ func (n *NoMsgTipJob) tip(taskType int, user *UserInfo) {
 		logger.Info("无消息提醒任务", taskType, "三天内已经提醒过,过滤掉", user.Id)
 		return
 	}
-	firstTitle, area, mailContent, infoCount := n.SubRecommend(user)
+	firstTitle, area, jcly, mailContent, infoCount := n.SubRecommend(user)
 	if infoCount == 0 {
 		logger.Info("无消息提醒任务", taskType, "没有要推荐的信息,过滤掉", user.Id)
 		return
@@ -136,7 +136,7 @@ func (n *NoMsgTipJob) tip(taskType int, user *UserInfo) {
 	}
 	if user.PushSet.SubSet.WxPush == 1 {
 		logger.Info("无消息提醒任务", taskType, "开始微信推送", user.Id)
-		isPushOk := n.sendWeixin(user, firstTitle, area, infoCount)
+		isPushOk := n.sendWeixin(user, firstTitle, area, jcly, infoCount)
 		logger.Info("无消息提醒任务", taskType, "微信推送结束", isPushOk, user.Id)
 	}
 	if user.PushSet.SubSet.MailPush == 1 {
@@ -147,16 +147,16 @@ func (n *NoMsgTipJob) tip(taskType int, user *UserInfo) {
 }
 
 //推送微信
-func (n *NoMsgTipJob) sendWeixin(user *UserInfo, firstTitle, area string, infoCount int) bool {
+func (n *NoMsgTipJob) sendWeixin(user *UserInfo, firstTitle, area, jcly string, infoCount int) bool {
 	tmplData := map[string]*qrpc.TmplItem{
 		"thing3": &qrpc.TmplItem{
-			Value: "智能推荐",
+			Value: area,
 		},
 		"thing11": &qrpc.TmplItem{
 			Value: firstTitle,
 		},
 		"thing7": &qrpc.TmplItem{
-			Value: area,
+			Value: jcly,
 		},
 		"time9": &qrpc.TmplItem{
 			Value: NowFormat(Date_Time_Layout),
@@ -175,10 +175,10 @@ func (n *NoMsgTipJob) sendWeixin(user *UserInfo, firstTitle, area string, infoCo
 }
 
 //
-func (n *NoMsgTipJob) SubRecommend(user *UserInfo) (string, string, string, int) {
+func (n *NoMsgTipJob) SubRecommend(user *UserInfo) (string, string, string, string, int) {
 	n.selectPool <- true
 	defer func() {
 		<-n.selectPool
 	}()
-	return VarRecommend.SubRecommend(Clickhouse, Config.JianyuDomain, user.Id, Config.NoMsgTip.Mail.Content, user.PushSet.SubSet.MailPush)
+	return VarRecommend.SubRecommend(Clickhouse, Config.JianyuDomain, user.Id, Config.NoMsgTip.Mail.Content, user.PushSet.SubSet.MailPush, 10)
 }

+ 1 - 1
pushsubscribe/push/job/pushjob.go

@@ -158,7 +158,7 @@ func (p *PushJob) doPush(pusher Pusher, taskType int, u *UserInfo, sl *SortList,
 		} else {
 			pushResult.WxStatus = -1
 		}
-		logger.Info("推送任务", taskType, "微信推送结束", isPushOk, u.Id)
+		logger.Info("推送任务", taskType, "	", isPushOk, u.Id)
 	}
 	if u.PushSet.SubSet.AppPush == 1 {
 		logger.Info("推送任务", taskType, "开始app推送", u.Id)

+ 1 - 1
subrecommend/go.mod

@@ -3,7 +3,7 @@ module subrecommend
 go 1.20
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66
+	app.yhyue.com/moapp/jybase v0.0.0-20241028060726-9b8837ab6e42
 	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20240429073036-dac6d582dcc2
 	github.com/ClickHouse/clickhouse-go/v2 v2.2.0
 	pushentniche v0.0.0-00010101000000-000000000000

+ 2 - 2
subrecommend/go.sum

@@ -1,7 +1,7 @@
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d h1:WPsYuuptAd3UEgN+jPzpnsDe/OvcshDUUtOTZPYGSJ8=
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
-app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66 h1:kCRYqzclN4dtGuGC89ID2w5lGrJgqZC8bNL8mRR+tiU=
-app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
+app.yhyue.com/moapp/jybase v0.0.0-20241028060726-9b8837ab6e42 h1:W4vYVQtoPsSCor6mO1iTjQlucodrxXeN38fKiWkPhE4=
+app.yhyue.com/moapp/jybase v0.0.0-20241028060726-9b8837ab6e42/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
 bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20240429073036-dac6d582dcc2 h1:aKaScDmzNbmt6fa0j1lPiLw2ZJoSnKUKqNkNDxXs5GM=
 bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20240429073036-dac6d582dcc2/go.mod h1:ECcF3i8XJ9J6vZ9ZK0gyxHqMRm9UBtgQAdWD2Tw7vvA=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.1.0 h1:60fFbyRAnn5vrnsPk99pVB2aJVin6nDIkNnmekdpFso=

+ 66 - 83
subrecommend/matcher/matcher.go

@@ -1,7 +1,7 @@
 package matcher
 
 import (
-	"context"
+	"database/sql"
 	"fmt"
 	"sort"
 	"strings"
@@ -200,48 +200,50 @@ var (
 )
 
 func SaveToDb() {
-	if err := Clickhouse.Exec(context.Background(), `create table IF NOT EXISTS sub_recommend_list_temp as sub_recommend_list`); err != nil {
-		logger.Info("创建表出错。。。", err)
-		return
-	}
-	logger.Info("已创建表,开始存库。。。")
 	index := 0
-	saveArray := []*Recommend{}
-	isSaveOk := false
+	pool := make(chan bool, Config.SavePoolSize)
+	wait := &sync.WaitGroup{}
 	for _, v := range AllRecommend {
 		index++
 		if index%5000 == 0 {
 			logger.Info("存库", index)
 		}
-		saveArray = append(saveArray, v)
-		if len(saveArray) == Config.SaveBatch {
-			isSaveOk = saveBatch(saveArray)
-			saveArray = []*Recommend{}
-			if !isSaveOk {
-				break
+		pool <- true
+		wait.Add(1)
+		go func(rmd *Recommend) {
+			defer func() {
+				<-pool
+				wait.Done()
+			}()
+			saveArray := []interface{}{}
+			for i := len(rmd.RmdInfos) - 1; i >= 0; i-- {
+				if rmd.RmdInfos[i].IsSave {
+					saveArray = append(saveArray, rmd.UserId, rmd.RmdInfos[i].Autoid, rmd.RmdInfos[i].Area, rmd.RmdInfos[i].Type, rmd.RmdInfos[i].CreateTime)
+				}
 			}
-		}
-	}
-	if len(saveArray) > 0 {
-		isSaveOk = saveBatch(saveArray)
-	}
-	if !isSaveOk {
-		Clickhouse.Exec(context.Background(), `DROP TABLE IF EXISTS sub_recommend_list_temp;`)
-	}
-	logger.Info("存库结束。。。", index)
-	if err := Clickhouse.Exec(context.Background(), `DROP TABLE IF EXISTS sub_recommend_list_back;`); err != nil {
-		logger.Info("删除备份表出错。。。", err)
-		return
-	}
-	if err := Clickhouse.Exec(context.Background(), `rename table sub_recommend_list to sub_recommend_list_back;`); err != nil {
-		logger.Info("备份现有的表出错。。。", err)
-		return
-	}
-	if err := Clickhouse.Exec(context.Background(), `rename table sub_recommend_list_temp to sub_recommend_list;`); err != nil {
-		logger.Info("重命名新表出错。。。", err)
-		return
+			if len(saveArray) == 0 && len(rmd.DeleteIds) == 0 {
+				return
+			}
+			var r1, r2, r3 int64 = 1, 1, 1
+			if Tidb.ExecTx("保存", func(tx *sql.Tx) bool {
+				if len(saveArray) > 0 {
+					r1, r2 = Tidb.InsertBatchByTx(tx, "push.sub_recommend_list", []string{"userid", "autoid", "area", "type", "create_time"}, saveArray)
+				}
+				if len(rmd.DeleteIds) > 0 {
+					wh, args := WhArgs(rmd.DeleteIds)
+					r3 = Tidb.UpdateOrDeleteBySqlByTx(tx, `delete from push.sub_recommend_list where id in (`+wh+`)`, args...)
+				}
+				return r1 > 0 && r2 > 0 && r3 >= 0
+			}) {
+				for i := int64(0); i < r1; i++ {
+					rmd.RmdInfos[len(rmd.RmdInfos)-1-int(i)].Id = r2 + i
+					rmd.RmdInfos[i].IsSave = false
+				}
+			}
+			rmd.DeleteIds = []string{}
+		}(v)
 	}
-	logger.Info("删除备份表、备份现有的表、重命名新表结束。。。")
+	wait.Wait()
 }
 
 //
@@ -254,6 +256,7 @@ func SaveToCache(batchIndex int, userMap *map[*UserInfo]*SortList) bool {
 	//
 	savePool := make(chan bool, Config.SavePoolSize)
 	saveWaitGroup := &sync.WaitGroup{}
+	nowFormat := NowFormat(Date_Full_Layout)
 	for k, v := range *userMap {
 		savePool <- true
 		saveWaitGroup.Add(1)
@@ -284,10 +287,17 @@ func SaveToCache(batchIndex int, userMap *map[*UserInfo]*SortList) bool {
 			if len(*infos) > maxSize {
 				*infos = (*infos)[:maxSize]
 			}
-			ids := []uint64{}
+			matchRmdInfos := []*RmdInfo{}
 			for _, v := range *infos {
-				ids = append(ids, uint64(Int64All(v.Info["autoid"])))
-				if matchWeight := IntAll(v.Info["matchWeight"]); matchWeight == 1 {
+				matchWeight := Int64All(v.Info["matchWeight"])
+				matchRmdInfos = append(matchRmdInfos, &RmdInfo{
+					Autoid:     Int64All(v.Info["autoid"]),
+					Type:       matchWeight,
+					Area:       area,
+					CreateTime: nowFormat,
+					IsSave:     true,
+				})
+				if matchWeight == 1 {
 					searchforCount++
 				} else if matchWeight == 2 {
 					browseCount++
@@ -296,35 +306,36 @@ func SaveToCache(batchIndex int, userMap *map[*UserInfo]*SortList) bool {
 				}
 			}
 			logger.Info(ui.Id, "匹配上", matchLen, "条", "保存内存", len(*infos), "条", "订阅", subCount, "搜索", searchforCount, "浏览", browseCount)
-			if len(ids) == 0 {
+			if len(matchRmdInfos) == 0 {
 				return
 			}
-			nowFormat := NowFormat(Date_Full_Layout)
 			lock.Lock()
 			defer lock.Unlock()
+			rmdInfos := []*RmdInfo{}
+			deleteIds := []string{}
 			if AllRecommend[ui.Id] != nil {
-				intIds := []uint64{}
-				allInfoIds := map[uint64]bool{}
-				for _, v := range AllRecommend[ui.Id].Infoids {
-					intIds = append(intIds, v)
-					allInfoIds[v] = true
+				allInfoIds := map[int64]bool{}
+				for _, v := range AllRecommend[ui.Id].RmdInfos {
+					allInfoIds[v.Autoid] = true
 				}
-				for _, v := range ids {
-					if allInfoIds[v] {
+				for _, v := range matchRmdInfos {
+					if allInfoIds[v.Autoid] {
 						continue
 					}
-					intIds = append(intIds, v)
+					rmdInfos = append(rmdInfos, v)
 				}
-				if len(intIds) > maxSize {
-					intIds = intIds[len(intIds)-maxSize:]
+				for _, v := range AllRecommend[ui.Id].RmdInfos {
+					if len(rmdInfos) > maxSize {
+						deleteIds = append(deleteIds, fmt.Sprint(v.Id))
+					} else {
+						rmdInfos = append(rmdInfos, v)
+					}
 				}
-				ids = intIds
 			}
 			AllRecommend[ui.Id] = &Recommend{
-				UserId:     ui.Id,
-				Area:       area,
-				UpdateTime: nowFormat,
-				Infoids:    ids,
+				UserId:    ui.Id,
+				DeleteIds: deleteIds,
+				RmdInfos:  rmdInfos,
 			}
 		}(k, v)
 		index++
@@ -337,34 +348,6 @@ func SaveToCache(batchIndex int, userMap *map[*UserInfo]*SortList) bool {
 	return true
 }
 
-//
-func saveBatch(array []*Recommend) bool {
-	q := "INSERT INTO jianyu.sub_recommend_list_temp (userid, infoids, area, update_time) values "
-	for k, v := range array {
-		if k != 0 {
-			q += ","
-		}
-		q += fmt.Sprintf("('%s',bitmapBuild([%s]),'%s','%s')", v.UserId, toUInt64(v.Infoids), v.Area, v.UpdateTime)
-	}
-	if err := Clickhouse.Exec(context.Background(), q); err != nil {
-		logger.Error(err)
-		return false
-	}
-	return true
-}
-
-//
-func toUInt64(ids []uint64) string {
-	text := ""
-	for _, v := range ids {
-		if text != "" {
-			text += ","
-		}
-		text += fmt.Sprintf("toUInt64(%d)", v)
-	}
-	return text
-}
-
 //
 func getMaxSize(u *UserInfo) int {
 	if u.MemberStatus > 0 || u.VipStatus > 0 {

+ 25 - 31
subrecommend/util/util.go

@@ -35,12 +35,18 @@ type Browse struct {
 	Datetime string //访问时间
 	Area     string //地区
 }
-
 type Recommend struct {
-	UserId     string
-	Infoids    []uint64
+	UserId    string
+	RmdInfos  []*RmdInfo
+	DeleteIds []string
+}
+type RmdInfo struct {
+	Id         int64
+	Type       int64
 	Area       string
-	UpdateTime string
+	Autoid     int64
+	CreateTime string
+	IsSave     bool
 }
 
 //
@@ -142,7 +148,7 @@ func LoadAllBehavior() map[string]*Behavior {
 //
 func LoadAllRecommend() map[string]*Recommend {
 	allRecommend := map[string]*Recommend{}
-	q := `select userid,bitmapToArray(infoids) as infoids,area,update_time from jianyu.sub_recommend_list`
+	q := `select id,userid,aotoid,area,type,create_time from push.sub_recommend_list`
 	testIds := []string{}
 	if len(Config.TestIds) > 0 {
 		testIds = append(testIds, Config.TestIds...)
@@ -155,39 +161,27 @@ func LoadAllRecommend() map[string]*Recommend {
 	if len(testIds) > 0 {
 		q += ` where userid in ('` + strings.Join(testIds, "','") + `')`
 	}
+	q += ` order by create_time`
 	logger.Info("开始加载用户推荐数据。。", q)
 	index := 0
-	rows, err := Clickhouse.Query(context.Background(), q)
-	if err != nil {
-		logger.Error(err)
-		return nil
-	}
-	for rows.Next() {
+	Tidb.SelectByBath(1, func(l *[]map[string]interface{}) bool {
 		index++
 		if index%500 == 0 {
 			logger.Info("加载用户推荐数据", index)
 		}
-		var (
-			userId     string
-			infoids    []uint64
-			area       string
-			updateTime time.Time
-		)
-		if err := rows.Scan(&userId, &infoids, &area, &updateTime); err != nil {
-			logger.Error(err)
-			continue
+		userId, _ := (*l)[0]["userid"].(string)
+		if allRecommend[userId] == nil {
+			allRecommend[userId] = &Recommend{UserId: userId}
 		}
-		allRecommend[userId] = &Recommend{
-			UserId:     userId,
-			Infoids:    infoids,
-			Area:       area,
-			UpdateTime: FormatDate(&updateTime, Date_Full_Layout),
-		}
-	}
-	rows.Close()
-	if err := rows.Err(); err != nil {
-		logger.Error(err)
-	}
+		allRecommend[userId].RmdInfos = append(allRecommend[userId].RmdInfos, &RmdInfo{
+			Id:         Int64All((*l)[0]["id"]),
+			Type:       Int64All((*l)[0]["type"]),
+			Autoid:     Int64All((*l)[0]["autoid"]),
+			Area:       ObjToString((*l)[0]["area"]),
+			CreateTime: ObjToString((*l)[0]["create_time"]),
+		})
+		return true
+	}, q)
 	logger.Info("加载用户推荐数据结束。。", index)
 	return allRecommend
 }