瀏覽代碼

Merge branch 'comein'

zwxi 1 年之前
父節點
當前提交
8237781746
共有 8 個文件被更改,包括 523 次插入1 次删除
  1. 35 0
      models/comein_white_user.go
  2. 1 0
      models/db.go
  3. 39 0
      models/users.go
  4. 23 0
      models/yb/comein_event.go
  5. 342 0
      services/comein/comein.go
  6. 7 1
      services/task.go
  7. 70 0
      utils/common.go
  8. 6 0
      utils/config.go

+ 35 - 0
models/comein_white_user.go

@@ -0,0 +1,35 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_task/utils"
+)
+
+type ComeinWhiteUser struct {
+	UserId          int `orm:"column(user_id);pk"`
+	Email       string
+	Mobile      string // 手机号码
+	CountryCode string // 区号
+	IsFake      int // 0为真 1为假
+}
+
+// 添加分类
+func AddComeinWhiteUserMulti(items []*ComeinWhiteUser) (err error) {
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(2000, items)
+	return
+}
+
+func GetComeinWhiteUserMulti() (items []*ComeinWhiteUser, err error) {
+	sql:=`SELECT * from comein_white_user `
+	o:=orm.NewOrm()
+	_, err=o.Raw(sql).QueryRows(&items)
+	return
+}
+
+func DelComeinWhiteUserMulti(delIds []int) (err error) {
+	sql:=`DELETE from comein_white_user user_id IN (` + utils.GetOrmInReplace(len(delIds)) + `) `
+	o:=orm.NewOrm()
+	_, err=o.Raw(sql, delIds).Exec()
+	return
+}

+ 1 - 0
models/db.go

@@ -91,6 +91,7 @@ func init() {
 		new(roadshow.RsReportRecord), //路演记录
 		new(CompanyReportRecord),
 		new(ChartPermission), // 权限表
+		new(ComeinWhiteUser), // 进门财经白名单
 	)
 
 	// 注册客户信息 数据表

+ 39 - 0
models/users.go

@@ -112,6 +112,29 @@ func GetUserOpenidListByUserId(userId int) (list []*OpenIdList, err error) {
 	return
 }
 
+type UserMobileList struct {
+	UserId int
+	Mobile string
+	CountryCode string
+	Email string
+}
+
+// GetUserMobileFormal
+func GetUserMobileFormal() (list []*UserMobileList, err error) {
+	sql := `SELECT
+	a.user_id,a.mobile,a.country_code,a.email 
+FROM
+	wx_user AS a
+	INNER JOIN company_product AS p ON a.company_id = p.company_id 
+WHERE
+	p.status IN (
+		'试用',
+	'永续',
+	'正式')`
+	_, err = orm.NewOrm().Raw(sql).QueryRows(&list)
+	return
+}
+
 // GetUserOpenidListByUserIds 根据用户id字符串集合来获取他的openid列表集合
 func GetUserOpenidListByUserIds(userIdStr []string) (list []*OpenIdList, err error) {
 	if len(userIdStr) <= 0 {
@@ -121,3 +144,19 @@ func GetUserOpenidListByUserIds(userIdStr []string) (list []*OpenIdList, err err
 	_, err = orm.NewOrm().Raw(sql).QueryRows(&list)
 	return
 }
+
+// GetUserMobileNotFormal
+func GetUserMobileNotFormal() (list []*UserMobileList, err error) {
+	sql := `SELECT
+	a.user_id,a.mobile,a.country_code,a.email 
+FROM
+	wx_user AS a
+	INNER JOIN company_product AS p ON a.company_id = p.company_id 
+WHERE
+	p.status NOT IN (
+		'试用',
+	'永续',
+	'正式')`
+	_, err = orm.NewOrm().Raw(sql).QueryRows(&list)
+	return
+}

+ 23 - 0
models/yb/comein_event.go

@@ -100,3 +100,26 @@ func AddComeinEventAndUser(comeinEventInfo *ComeinEvent, userList []*ComeinEvent
 
 	}
 }
+
+type ComeinResponse struct {
+	Code      string `json:"code"`
+	Data      string `json:"data"`
+	ErrorCode string `json:"errorcode"`
+	ErrorDesc string `json:"errordesc"`
+	Msg       string `json:"msg"`
+}
+
+type Whitelist struct {
+	Guid     string `json:"guid"`
+	Phone    string `json:"phone"`
+	Email    string `json:"email"`
+	Areacode string `json:"areacode"`
+}
+
+type SyncWhitelist struct {
+	Opt       int        `json:"opt"`
+	Timestamp string     `json:"timestamp"`
+	AppID     string     `json:"appId"`
+	Signature string     `json:"signature"`
+	Whitelist []Whitelist  `json:"whitelist"`
+}

+ 342 - 0
services/comein/comein.go

@@ -1,9 +1,12 @@
 package comein
 
 import (
+	"context"
 	"encoding/json"
 	"errors"
 	"fmt"
+	"hongze/hongze_task/models"
+	"hongze/hongze_task/models/yb"
 	"hongze/hongze_task/services/alarm_msg"
 	"hongze/hongze_task/utils"
 	"io/ioutil"
@@ -265,3 +268,342 @@ func GetSign(params map[string]string) (paramStr string) {
 	params["appId"] = utils.COMEIN_APPID
 	return
 }
+
+// InitAddWhiteList 初始化进门财经白名单
+func InitAddWhiteList() (err error) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("InitAddWhiteList;ERR:"+err.Error(), 3)
+		}
+	}()
+
+	postUrl := utils.COMEIN_URL
+
+	timestamp := fmt.Sprintf("%d", time.Now().UnixNano()/1e6)
+
+	signature := GetSignature("1", timestamp)
+
+	request := yb.SyncWhitelist{
+		Opt:       1,
+		Timestamp: timestamp,
+		AppID:     utils.COMEIN_WHITELIST_APPID,
+		Signature: signature,
+	}
+
+	list, err := models.GetComeinWhiteUserMulti()
+	if err != nil {
+		fmt.Println("GetUserMobileFormal Err:", err.Error())
+		return
+	}
+
+	whiteList := make([]yb.Whitelist, 0)
+	for _, v := range list {
+		whiteUser := yb.Whitelist{}
+		if v.Mobile != "" {
+			whiteUser.Phone = v.Mobile
+			whiteUser.Areacode = "+" + v.CountryCode
+			whiteUser.Guid = utils.MD5(strconv.Itoa(v.UserId))
+
+			whiteList = append(whiteList, whiteUser)
+		} else if v.Email != "" {
+			whiteUser.Email = v.Email
+			whiteUser.Guid = utils.MD5(strconv.Itoa(v.UserId))
+
+			whiteList = append(whiteList, whiteUser)
+		}
+	}
+
+	fmt.Println("共"+strconv.Itoa(len(whiteList))+"条数据")
+	// 分批发送请求
+	var count int
+	for i, v := range whiteList {
+		request.Whitelist = append(request.Whitelist, v)
+		if count < 1000 && (len(whiteList)-i-1) > 0 {
+			count++
+			continue
+		}
+		count = 0
+		jsonData, e := json.Marshal(request)
+		if e != nil {
+			err = e
+			return
+		}
+		fmt.Println(jsonData)
+
+		headers := map[string]string{
+			"app": "json",
+			"mod": "channelopen",
+			"act": "whitelist",
+		}
+
+		// 发起POST请求
+		resp, err := utils.MakePostRequest(postUrl, jsonData, headers)
+		if err != nil {
+			utils.FileLog.Info("comein addWhitelist Err:", err.Error(), ";url:", postUrl)
+			return
+		}
+		defer resp.Body.Close()
+
+		body, err := ioutil.ReadAll(resp.Body)
+		if err != nil {
+			fmt.Println("reponse error", err)
+			return
+		}
+
+		result := new(yb.ComeinResponse)
+		err = json.Unmarshal(body, &result)
+		if err != nil {
+			fmt.Println("json.Unmarshal Err:" + err.Error())
+			return
+		}
+
+		utils.FileLog.Info(fmt.Sprint("comein addWhitelist Result", ";url:", postUrl, ";\nresponse:", string(body)))
+		err = json.Unmarshal(body, &result)
+		if err != nil {
+			utils.FileLog.Info("comein addWhitelist Err:", err.Error(), ";url:", postUrl, ";response:", string(body))
+			err = errors.New("Unmarshal Err:" + err.Error())
+			return
+		}
+		if result.ErrorCode != "0" {
+			utils.FileLog.Info("comein addWhitelist Err:", err.Error(), ";url:", postUrl, ";response:", string(body))
+			err = errors.New(result.ErrorDesc)
+			return
+		}
+		request.Whitelist = nil
+		time.Sleep(110 * time.Second)
+		fmt.Println("同步成功:"+strconv.Itoa(i+1)+"条数据")
+	}
+	return
+}
+
+func GetSignature(opt, timestamp string) (signature string) {
+	//获取map的下标切片,然后对下标进行排序
+	keySlice := make([]string, 0)
+
+	//基础参数
+	params := make(map[string]string, 0)
+	params["appid"] = utils.COMEIN_WHITELIST_APPID //签名用的是appid,实际请求用的appId
+	params["opt"] = opt
+	params["timestamp"] = timestamp
+
+	for index := range params {
+		keySlice = append(keySlice, index)
+	}
+	sort.Strings(keySlice)
+
+	var paramStr string
+	// 待签名字符串
+	for _, index := range keySlice {
+		paramStr += index + `=` + params[index] + `&`
+	}
+
+	paramStr = paramStr[:len(paramStr)-1]
+
+	// 获取签名
+	signStr := utils.HmacMd5(utils.COMEIN_WHITELIST_SECREKEY, paramStr)
+	signature = url.QueryEscape(signStr)
+
+	return
+}
+
+func InitComeinWhiteList() {
+	list := make([]*models.ComeinWhiteUser, 0)
+
+	realList, err := models.GetUserMobileFormal()
+	if err != nil {
+		fmt.Println("GetUserMobileFormal Err:", err.Error())
+		return
+	}
+	for _, v := range realList {
+		user := models.ComeinWhiteUser{
+			Email:       v.Email,
+			Mobile:      v.Mobile,
+			CountryCode: "+86",
+			IsFake:      0,
+		}
+		list = append(list, &user)
+	}
+
+	for i := 0; i < 100000-len(realList); i++ {
+		phone := utils.RandomPhone()
+		user := models.ComeinWhiteUser{
+			Mobile:      phone,
+			CountryCode: "+86",
+			IsFake:      1,
+		}
+		list = append(list, &user)
+	}
+
+	err = models.AddComeinWhiteUserMulti(list)
+	if err != nil {
+		fmt.Println("添加随机手机号失败", err.Error())
+		return
+	}
+	fmt.Println("添加随机手机号成功")
+}
+
+// SyncWhiteList 同步进门财经白名单定时任务
+func SyncWhiteList(cont context.Context) (err error) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("SyncWhiteList;ERR:"+err.Error(), 3)
+		}
+	}()
+
+	// 拿白名单表
+	list, err := models.GetComeinWhiteUserMulti()
+	if err != nil {
+		fmt.Println("GetUserMobileFormal Err:", err.Error())
+		return
+	}
+
+	syncedMap := make(map[string]bool, 0)
+	for _, v := range list {
+		syncedMap[v.Mobile+v.Email] = true
+	}
+
+	//拿联系人表,需要进白名单的
+	needAddList, err := models.GetUserMobileFormal()
+	if err != nil {
+		fmt.Println("GetUserMobileFormal Err:", err.Error())
+		return
+	}
+	addList := make([]*models.ComeinWhiteUser, 0)
+	for _, v := range needAddList {
+		if _, ok := syncedMap[v.Mobile+v.Email]; !ok {
+			user := models.ComeinWhiteUser{
+				Mobile:      v.Mobile,
+				CountryCode: v.CountryCode,
+				Email:       v.Email,
+				IsFake:      0,
+			}
+			addList = append(addList, &user)
+		}
+	}
+	err = syncWhiteList(addList, 1)
+	if err != nil {
+		fmt.Println("新增白名单失败", err.Error())
+		return
+	}
+	err = models.AddComeinWhiteUserMulti(list)
+	if err != nil {
+		fmt.Println("新增白名单失败,AddComeinWhiteUserMulti", err.Error())
+		return
+	}
+
+	//拿联系人表,需要删除的
+	needDelList, err := models.GetUserMobileNotFormal()
+	if err != nil {
+		fmt.Println("GetUserMobileFormal Err:", err.Error())
+		return
+	}
+	delList := make([]*models.ComeinWhiteUser, 0)
+	for _, v := range needDelList {
+		if _, ok := syncedMap[v.Mobile+v.Email]; ok {
+			user := models.ComeinWhiteUser{
+				Mobile:      v.Mobile,
+				CountryCode: v.CountryCode,
+				Email:       v.Email,
+				IsFake:      0,
+			}
+			delList = append(delList, &user)
+		}
+	}
+	err = syncWhiteList(delList, 2)
+	if err != nil {
+		fmt.Println("删除白名单失败", err.Error())
+		return
+	}
+	delIds := make([]int, 0)
+	for _, v := range delList {
+		delIds = append(delIds, v.UserId)
+	}
+	err = models.DelComeinWhiteUserMulti(delIds)
+	if err != nil {
+		fmt.Println("删除白名单失败,DelComeinWhiteUserMulti", err.Error())
+		return
+	}
+
+	return
+}
+
+func syncWhiteList(list []*models.ComeinWhiteUser, opt int) (err error) {
+	postUrl := utils.COMEIN_URL
+
+	timestamp := fmt.Sprintf("%d", time.Now().UnixNano()/1e6)
+
+	signature := GetSignature(strconv.Itoa(opt), timestamp)
+
+	request := yb.SyncWhitelist{
+		Opt:       opt,
+		Timestamp: timestamp,
+		AppID:     utils.COMEIN_WHITELIST_APPID,
+		Signature: signature,
+	}
+
+	whiteList := make([]yb.Whitelist, 0)
+	for _, v := range list {
+		whiteUser := yb.Whitelist{}
+		if v.Mobile != "" {
+			whiteUser.Phone = v.Mobile
+			whiteUser.Areacode = "+" + v.CountryCode
+			whiteUser.Guid = utils.MD5(strconv.Itoa(v.UserId))
+
+			whiteList = append(whiteList, whiteUser)
+		} else if v.Email != "" {
+			whiteUser.Email = v.Email
+			whiteUser.Guid = utils.MD5(strconv.Itoa(v.UserId))
+
+			whiteList = append(whiteList, whiteUser)
+		}
+	}
+
+	request.Whitelist = whiteList
+
+	jsonData, err := json.Marshal(request)
+	if err != nil {
+		return
+	}
+
+	headers := map[string]string{
+		"app": "json",
+		"mod": "channelopen",
+		"act": "whitelist",
+	}
+	var respData EventListResp
+	// 发起POST请求
+	resp, err := utils.MakePostRequest(postUrl, jsonData, headers)
+	if err != nil {
+		utils.FileLog.Info("comein addWhitelist Err:", err.Error(), ";url:", postUrl)
+		err = errors.New(respData.Errordesc)
+		return
+	}
+	defer resp.Body.Close()
+
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println("reponse error", err)
+		return
+	}
+
+	result := new(yb.ComeinResponse)
+	err = json.Unmarshal(body, &result)
+	if err != nil {
+		fmt.Println("json.Unmarshal Err:" + err.Error())
+		return
+	}
+
+	utils.FileLog.Info(fmt.Sprint("comein syncWhiteList Result", ";url:", postUrl, ";\nresponse:", string(body)))
+	err = json.Unmarshal(body, &respData)
+	if err != nil {
+		utils.FileLog.Info("comein syncWhiteList Err:", err.Error(), ";url:", postUrl, ";response:", string(body))
+		err = errors.New("Unmarshal Err:" + err.Error())
+		return
+	}
+	if respData.Errorcode != "0" {
+		utils.FileLog.Info("comein syncWhiteList Err:", err.Error(), ";url:", postUrl, ";response:", string(body))
+		err = errors.New(respData.Errordesc)
+		return
+	}
+	return
+}

+ 7 - 1
services/task.go

@@ -7,6 +7,7 @@ import (
 	"github.com/beego/beego/v2/task"
 	"hongze/hongze_task/models"
 	"hongze/hongze_task/services/alarm_msg"
+	"hongze/hongze_task/services/comein"
 	"hongze/hongze_task/services/company"
 	"hongze/hongze_task/services/company_contract"
 	"hongze/hongze_task/services/data"
@@ -38,7 +39,8 @@ func InitTask() {
 			go alarm_msg.SendAlarmMsg(utils.APPNAME+"崩了"+time.Now().Format("2006-01-02 15:04:05")+"\n"+stack, 3)
 		}
 	}()
-
+	//comein.InitComeinWhiteList()
+	//comein.InitAddWhiteList()
 	// 实际开始定时任务
 	Task()
 }
@@ -274,6 +276,10 @@ func releaseTask() {
 	// ETA商家到期提醒
 	etaBusinessRemind := task.NewTask("etaBusinessRemind", "0 20 8 * * *", EtaBusinessExpiredRemind)
 	task.AddTask("etaBusinessRemind", etaBusinessRemind)
+
+	// 同步进门财经白名单定时任务
+	//syncWhiteList := task.NewTask("syncWhiteList", "0 */10 * * * *", comein.SyncWhiteList)
+	//task.AddTask("syncWhiteList", syncWhiteList)
 }
 
 //func TaskTest() {

+ 70 - 0
utils/common.go

@@ -1,6 +1,7 @@
 package utils
 
 import (
+	"bytes"
 	"crypto/hmac"
 	"crypto/md5"
 	"crypto/sha1"
@@ -13,6 +14,7 @@ import (
 	"math"
 	"math/rand"
 	"net"
+	"net/http"
 	"os"
 	"os/exec"
 	"regexp"
@@ -844,3 +846,71 @@ func GetVideoPlaySeconds(videoPath string) (playSeconds float64, err error) {
 	}
 	return
 }
+
+// 随机手机号
+const letterBytes = "0123456789"
+const (
+	letterIdxBits = 4
+	letterIdxMask = 1<<letterIdxBits - 1
+)
+var src = rand.NewSource(time.Now().UnixNano())
+
+var headerNums = [...]string{"139", "138", "137", "136", "135", "134", "159", "158", "157", "150", "151", "152", "188", "187", "182", "183", "184", "178", "130", "131", "132", "156", "155", "186", "185", "176", "133", "153", "189", "180", "181", "177"}
+var headerNumsLen = len(headerNums)
+const (
+	headerIdxBits = 6
+	headerIdxMask = 1<<headerIdxBits - 1
+)
+
+func getHeaderIdx(cache int64) int {
+	for cache > 0{
+		idx := int(cache & headerIdxMask)
+		if idx < headerNumsLen{
+			return idx
+		}
+		cache >>= headerIdxBits
+	}
+	return rand.Intn(headerNumsLen)
+}
+
+func RandomPhone() string {
+	b := make([]byte, 12)
+	cache := src.Int63()
+	headerIdx := getHeaderIdx(cache)
+	for i := 0; i < 3; i++{
+		b[i] = headerNums[headerIdx][i]
+	}
+	for i := 3; i < 12 ; {
+		if cache == 0{
+			cache = src.Int63()
+		}
+		if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
+			b[i] = letterBytes[idx]
+			i++
+		}
+		cache >>= letterIdxBits
+	}
+	return string(b)
+}
+
+// makePostRequest 发起POST请求并返回响应
+func MakePostRequest(url string, body []byte, headers map[string]string) (*http.Response, error) {
+	req, err := http.NewRequest("POST", url, bytes.NewBuffer(body))
+	if err != nil {
+		return nil, err
+	}
+
+	// 设置自定义头部
+	for key, value := range headers {
+		req.Header.Set(key, value)
+	}
+
+	// 发起请求
+	client := &http.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+
+	return resp, nil
+}

+ 6 - 0
utils/config.go

@@ -98,6 +98,8 @@ var (
 	COMEIN_URL      string
 	COMEIN_APPID    string
 	COMEIN_SECREKEY string
+	COMEIN_WHITELIST_APPID string
+	COMEIN_WHITELIST_SECREKEY string
 )
 
 // 模板消息推送
@@ -264,10 +266,14 @@ func ComeinOpenApiConfig() {
 		COMEIN_URL = "https://server.comein.cn/comein/index.php"
 		COMEIN_APPID = "39b48779-debd-446a-a303-900322d8e356"
 		COMEIN_SECREKEY = "9102a767f20f11ecb5d6b8599f142ed4"
+		COMEIN_WHITELIST_APPID = "39b48779-debd-446a-a303-900322d8e356"
+		COMEIN_WHITELIST_SECREKEY = "9102a767f20f11ecb5d6b8599f142ed4"
 	} else {
 		COMEIN_URL = "https://testserver.comein.cn/comein/index.php"
 		COMEIN_APPID = "7b966708-4a8b-4d24-9066-fe29920e7eee"
 		COMEIN_SECREKEY = "76e004876fae4b3c8721a3f4c2d115da"
+		COMEIN_WHITELIST_APPID = "997fc880-766c-4f5a-8cd6-28aa08cd15ff"
+		COMEIN_WHITELIST_SECREKEY = "ba361e9b1bd04d018a5bca2241e9f1fa"
 	}
 }