Browse Source

Merge branch 'feature/v1.0.4' of https://jygit.jydev.jianyu360.cn/jianyu/personnelBehavior into feature/v1.0.4

yuelujie 3 months ago
parent
commit
7718d13569

+ 3 - 1
api/personnel/v1/personnel.go

@@ -36,8 +36,10 @@ type Statistics struct {
 	SearchWord      string                 `json:"search_word"  dc:"搜索词" `
 	Filter          string                 `json:"filter"  dc:"搜索条件"`
 	BreakData       map[string]interface{} `json:"breakData"  dc:"额外数据"`
+	BData           string                 `json:"break_data"  dc:"额外数据"` // 字符串
 	AppId           string                 `json:"appId"  dc:"appid"`
 	AppVersion      string                 `json:"appVersion"  dc:"版本号"`
 	MiniProgramCode string                 `json:"miniProgramCode"  dc:"来源"`
-	Duration        int64                  `json:"duration"  dc:"页面停留时长 秒"`
+	Duration        float64                `json:"duration"  dc:"页面停留时长 秒"`
+	Date            string                 `json:"date"` //时间
 }

+ 1 - 0
go.mod

@@ -5,6 +5,7 @@ go 1.20
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20231120053339-0b7406056861
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
+	github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de
 	github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.5.2
 	github.com/gogf/gf/contrib/drivers/mysql/v2 v2.5.2
 	github.com/gogf/gf/contrib/nosql/redis/v2 v2.5.2

+ 5 - 0
go.sum

@@ -56,6 +56,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA=
+github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw=
 github.com/aws/aws-sdk-go v1.35.20/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -270,6 +272,7 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/
 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
 github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
 github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
 github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
@@ -325,12 +328,14 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O
 github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 github.com/redis/go-redis/v9 v9.2.1 h1:WlYJg71ODF0dVspZZCpYmoF1+U1Jjk9Rwd7pq6QmlCg=
 github.com/redis/go-redis/v9 v9.2.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
+github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
 github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
+github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg=
 github.com/shirou/gopsutil v2.19.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=

+ 26 - 2
internal/controller/personnel/personnel.go

@@ -5,11 +5,14 @@ import (
 	"app.yhyue.com/moapp/jybase/encrypt"
 	"context"
 	"encoding/json"
+	"fmt"
+	"github.com/araddon/dateparse"
 	"github.com/gogf/gf/v2/frame/g"
 	v1 "personnelBehavior/api/personnel/v1"
 	"personnelBehavior/internal/model"
 	"personnelBehavior/internal/service"
 	"personnelBehavior/internal/utils"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -23,6 +26,13 @@ type personnel struct{}
 // Statistics 统计信息保存
 func (p *personnel) Statistics(ctx context.Context, req *v1.PersonnelInsertReq) (res *utils.ResponseRes, err error) {
 	var in model.PersonnelInsertInput
+	g.Log().Info(model.Ctx, "-------", req.Date)
+	t, e := dateparse.ParseAny(strings.TrimSpace(req.Date))
+	if e == nil && t.Unix() > 946656000 {
+		in.Date = t
+	} else {
+		in.Date = time.Now()
+	}
 	res = &utils.ResponseRes{}
 	g.Log().Info(model.Ctx, "--Statistics--接收参数--", req, g.RequestFromCtx(ctx).Header)
 	in.ActionId = common.If(req.ActionId == "undefined", "", req.ActionId).(string)
@@ -54,7 +64,6 @@ func (p *personnel) Statistics(ctx context.Context, req *v1.PersonnelInsertReq)
 	}
 	//匿名用户id
 	in.JYTrustedId = utils.GetTrustedId(g.RequestFromCtx(ctx))
-	in.Date = time.Now().Unix()
 	//浏览器信息
 	r := g.RequestFromCtx(ctx).Request
 	in.Ip = common.GetIp(r)
@@ -91,6 +100,12 @@ func (p *personnel) Statistics(ctx context.Context, req *v1.PersonnelInsertReq)
 		breakData, _ := json.Marshal(req.BreakData)
 		in.BreakData = string(breakData)
 	}
+	if req.BData != "" {
+		if in.BreakData != "" {
+			in.BreakData += ","
+		}
+		in.BreakData += fmt.Sprintf("action_name=%s", req.BData)
+	}
 	// 小程序的refer是从body里面取的
 	if in.Refer == "" && req.Refer != "" && req.Refer != "undefined" {
 		in.Refer = req.Refer
@@ -150,7 +165,16 @@ func (p *personnel) Behaviors(ctx context.Context, req *v1.PersonnelBehaviorReq)
 		}
 		//匿名用户id
 		in.JYTrustedId = utils.GetTrustedId(g.RequestFromCtx(ctx))
-		in.Date = time.Now().Unix()
+		in.Date = time.Now()
+		if b.Date != "" {
+			dateInt64, e := strconv.ParseInt(b.Date, 10, 64)
+			if e == nil {
+				dateInt64 = dateInt64 / 1000 //毫秒转换成秒
+				if dateInt64 > 946656000 {
+					in.Date = time.Unix(dateInt64, 0)
+				}
+			}
+		}
 		//浏览器信息
 		r := g.RequestFromCtx(ctx).Request
 		in.Ip = common.GetIp(r)

+ 4 - 2
internal/dao/internal/personnel.go

@@ -12,6 +12,7 @@ import (
 	. "personnelBehavior/internal/common"
 	"personnelBehavior/internal/consts"
 	"personnelBehavior/internal/model"
+	"personnelBehavior/internal/utils"
 	"strconv"
 	"time"
 )
@@ -73,12 +74,12 @@ func (dao *PersonnelDao) BatchExecInsert(ctx context.Context, in []*model.Person
 		return
 	}
 	var (
-		timeNow    = time.Now()
 		insertData []g.Map
 	)
 	for _, i := range in {
 		var (
-			clickTime = timeNow
+			timeNow   = time.Now()
+			clickTime = i.Date
 			orderTIme time.Time
 			payTime   time.Time
 		)
@@ -133,6 +134,7 @@ func (dao *PersonnelDao) BatchExecInsert(ctx context.Context, in []*model.Person
 	_, err = g.DB().Model(dao.Model()).Data(insertData).Insert()
 	if err != nil {
 		g.Log().Error(ctx, "batch insert false, --err:", err)
+		utils.SendMsgByWXURL(fmt.Sprintf("人员行为统计数据存储异常。\n错误信息:\n%s", err.Error()), g.Config().MustGet(ctx, "webhookURL").Strings())
 		return
 	}
 	return

+ 21 - 19
internal/model/personnel.go

@@ -1,5 +1,7 @@
 package model
 
+import "time"
+
 type PersonnelInsertInput struct {
 	ActionId        string
 	ActionType      string
@@ -21,23 +23,23 @@ type PersonnelInsertInput struct {
 	PositionId      int64
 	Phone           string
 	Ip              string
-	Platform        string //平台
-	Os              string //系统
-	OsVersion       string //系统版本
-	Browser         string //浏览器
-	BrowserVersion  string //浏览器版本
-	Date            int64  //访问时间
-	Url             string //页面url
-	UserAgent       string //header 信息
-	JYTrustedId     string //匿名用户id
-	ChainName       string //库信息
-	Port            string //行为端口
-	Refer           string //跳转前页面
-	SearchWord      string //搜索词
-	Filter          string //搜索条件
-	BreakData       string //"额外数据
-	AppId           string // appid"
-	AppVersion      string // 版本号
-	MiniProgramCode string // "来源"`
-	Duration        int64  //页面停留时长 秒
+	Platform        string    //平台
+	Os              string    //系统
+	OsVersion       string    //系统版本
+	Browser         string    //浏览器
+	BrowserVersion  string    //浏览器版本
+	Date            time.Time //访问时间
+	Url             string    //页面url
+	UserAgent       string    //header 信息
+	JYTrustedId     string    //匿名用户id
+	ChainName       string    //库信息
+	Port            string    //行为端口
+	Refer           string    //跳转前页面
+	SearchWord      string    //搜索词
+	Filter          string    //搜索条件
+	BreakData       string    //"额外数据
+	AppId           string    // appid"
+	AppVersion      string    // 版本号
+	MiniProgramCode string    // "来源"`
+	Duration        float64   //页面停留时长 秒
 }

+ 42 - 0
internal/utils/warn.go

@@ -0,0 +1,42 @@
+package utils
+
+import (
+	"bytes"
+	"encoding/json"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/os/gctx"
+	"net/http"
+)
+
+func SendMsgByWXURL(msg string, whs []string) {
+	for _, url := range whs {
+		if ok := SendBot(url, msg); !ok {
+			g.Log().Info(gctx.New(), "企业微信机器人提醒失败--:", url, msg)
+		}
+	}
+}
+
+func SendBot(webhookURL, msg string) (b bool) {
+	// 构造请求体
+	payload := map[string]interface{}{
+		"msgtype": "text",
+		"text": map[string]string{
+			"content": msg,
+		},
+	}
+	// 转换为 JSON 字符串
+	payloadBytes, err := json.Marshal(payload)
+	if err != nil {
+		g.Log().Info(gctx.New(), "Error :", err.Error())
+		return
+	}
+	// 发送 POST 请求
+	resp, err := http.Post(webhookURL, "application/json", bytes.NewReader(payloadBytes))
+	if err != nil {
+		g.Log().Info(gctx.New(), "Error :", err.Error())
+		return
+	}
+	defer resp.Body.Close()
+	b = true
+	return
+}

+ 2 - 2
manifest/config/config.yaml

@@ -37,10 +37,10 @@ authcode: "jy_personnel_abc"
 cacheChanInfo:
   name: "人员行为记录"
   dataSize: 10000   #数据缓存通道大小
-  bulkSize: 500     #批次- 每批的数量
+  bulkSize: 2     #批次- 每批的数量
   timeAfter: 2000   # 定时保存 毫秒
   timeout: 10000    # 缓存通道满时,超时丢弃
   sCSize: 3         # 数据库并发存储数据
-
+webhookURL: ["https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=24b0ac60-3a02-441f-842e-9cd3f75d1208"]