浏览代码

fix:进门财经参会人数对接

Roc 2 年之前
父节点
当前提交
383c2644f8
共有 9 个文件被更改,包括 588 次插入8 次删除
  1. 9 2
      models/company.go
  2. 8 0
      models/company_product.go
  3. 15 0
      models/user_view_statistics.go
  4. 35 6
      models/users.go
  5. 197 0
      services/comein.go
  6. 267 0
      services/comein/comein.go
  7. 4 0
      services/task.go
  8. 30 0
      utils/common.go
  9. 23 0
      utils/config.go

+ 9 - 2
models/company.go

@@ -41,6 +41,13 @@ func GetCompanyByName(companyName string) (item *Company, err error) {
 	return
 }
 
+func GetCompanyById(companyId int) (item *Company, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company WHERE company_id=? `
+	err = o.Raw(sql, companyId).QueryRow(&item)
+	return
+}
+
 func GetCompanyCountByCreditCode(CreditCode string) (count int, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT COUNT(1) AS count FROM company WHERE credit_code=? `
@@ -125,9 +132,9 @@ func ModifyCompanyCreditCode(companyId int, creditCode string) (err error) {
 	return
 }
 
-func ModifyCompanyIndustry(industryId,companyId int, industryName string) (err error) {
+func ModifyCompanyIndustry(industryId, companyId int, industryName string) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE company_product SET industry_id=?,industry_name=? WHERE company_id=? AND product_id=1 AND industry_id=0 `
-	_, err = o.Raw(sql, industryId,industryName, companyId).Exec()
+	_, err = o.Raw(sql, industryId, industryName, companyId).Exec()
 	return
 }

+ 8 - 0
models/company_product.go

@@ -176,8 +176,16 @@ type CompanyProduct struct {
 	LossTime         time.Time `description:"流失时间"`
 	CompanyType      string    `description:"客户类型"`
 	OpenCode         string    `description:"开放给第三方的编码,不让第三方定位我们的客户信息"`
+	Scale            string    `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。"`
+	ViewTotal        int       `description:"总阅读次数"`
+	RoadShowTotal    int       `description:"累计路演次数"`
+	LastViewTime     time.Time `description:"最后一次阅读时间"`
 	PackageType      int       `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
 	IsFormal         int       `description:"是否已经转正式,0是没有转正式,1是已经转过正式"`
+	TodoStatus       string    `description:"任务处理状态;枚举值:'无任务','未完成','已完成'"`
+	TodoCreateTime   time.Time `description:"任务创建时间"`
+	TodoApproveTime  time.Time `description:"任务审批时间"`
+	TryStage         int       `description:"试用客户子标签:1未分类、2  推进、3 跟踪、4 预备"`
 }
 
 //获取产品详情

+ 15 - 0
models/user_view_statistics.go

@@ -185,3 +185,18 @@ func GetMaxAdvisoryCountUserViewHistoryByMobiles() (items []*UserViewMobileTotal
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// UserViewStatisticsInfo 根据用户手机号字符串获取用户的浏览数和最晚阅读次数
+type UserViewStatisticsInfo struct {
+	Mobile       string    `description:"用户手机号"`
+	Total        int       `description:"总阅读数"`
+	LastViewTime time.Time `description:"用户浏览时间"`
+}
+
+// GetUserLastViewStatisticsByMobile 根据手机号获取最新的联系人的浏览次数
+func GetUserLastViewStatisticsByMobile(mobile string) (item *UserViewStatisticsInfo, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT mobile,sum(view_num) total,max(last_view_time) last_view_time FROM  user_view_statistics  WHERE mobile = ? `
+	err = o.Raw(sql, mobile).QueryRow(&item)
+	return
+}

+ 35 - 6
models/users.go

@@ -3,6 +3,7 @@ package models
 import (
 	"github.com/beego/beego/v2/client/orm"
 	"strings"
+	"time"
 )
 
 type HongzeUsers struct {
@@ -25,12 +26,30 @@ func GetHongzeUsers() (items []*HongzeUsers, err error) {
 }
 
 type WxUser struct {
-	UserId    int64
-	Mobile    string
-	Email     string
-	CompanyId int
-	ExpiredIn int64
-	OpenId    string
+	ExpiredIn           int64
+	UserId              int64 `orm:"column(user_id);pk"`
+	Mobile              string
+	Email               string
+	CompanyId           int
+	RealName            string `description:"姓名"`
+	NickName            string `description:"昵称"`
+	CreatedTime         time.Time
+	MobileTwo           string `description:"备用手机号"`
+	BusinessCardUrl     string `description:"名片"`
+	IsMaker             int    `description:"是否决策人,1:是,0:否"`
+	Position            string `description:"职位"`
+	Sex                 int    `description:"普通用户性别,1为男性,2为女性"`
+	DepartmentName      string `description:"联系人部门"`
+	RegisterTime        time.Time
+	RegisterPlatform    int
+	Remark              string    `description:"备注"`
+	CountryCode         string    `description:"区号,86、852、886等"`
+	OutboundMobile      string    `description:"外呼手机号"`
+	OutboundCountryCode string    `description:"外呼手机号区号,86、852、886等"`
+	LastUpdatedTime     time.Time `description:"最近一次更新时间"`
+	IsDeal              int       `description:"是否标记处理 0-未处理 1-已处理"`
+	OpenId              string    `orm:"column(open_id)" description:"微信openid"`
+	Headimgurl          string    `description:"用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空"`
 }
 
 func GetWxUserByUserId(userId int) (item *WxUser, err error) {
@@ -45,6 +64,16 @@ func GetWxUserByMobile(mobile string) (item *WxUser, err error) {
 	return
 }
 
+// GetWxUserByMobileCountryCode 根据手机号和区号获取用户信息
+func GetWxUserByMobileCountryCode(mobile, countryCode string) (item *WxUser, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM wx_user WHERE mobile = ? `
+	sql += ` and country_code in ("","` + countryCode + `") `
+	sql += ` LIMIT 1 `
+	err = o.Raw(sql, mobile).QueryRow(&item)
+	return
+}
+
 func AddWxUser(companyId int, mobile, realName, email string) (err error) {
 	sql := `INSERT INTO wx_user(company_id,real_name,mobile,first_login,enabled,is_note,from_type,apply_method,email) VALUES (?,?,?,1,1,1,'report',0,?);`
 	orm.NewOrm().Raw(sql, companyId, realName, mobile, email).Exec()

+ 197 - 0
services/comein.go

@@ -0,0 +1,197 @@
+package services
+
+import (
+	"context"
+	"fmt"
+	"hongze/hongze_task/models"
+	"hongze/hongze_task/models/yb"
+	"hongze/hongze_task/services/comein"
+	"hongze/hongze_task/utils"
+	"strings"
+	"time"
+)
+
+// SyncComeinMeeting 同步进门会议参会人员数据
+func SyncComeinMeeting(cont context.Context) (err error) {
+	errMsgList := make([]string, 0)
+	defer func() {
+		if len(errMsgList) > 0 {
+			for _, v := range errMsgList {
+				fmt.Println(v)
+			}
+		}
+	}()
+	roadshowData, err := comein.GetRoadshowDataList(time.Now().AddDate(0, 0, -1).Unix()*1000, time.Now().Unix()*1000)
+	if err != nil {
+		errMsgList = append(errMsgList, fmt.Sprintf("获取进门路演到会信息失败,%s,err:%s", time.Now().Format(utils.FormatDate), err.Error()))
+		return
+	}
+	roadshowDataList := roadshowData.Data
+
+	comeinEventMap := make(map[int]*yb.ComeinEvent)
+
+	// 开始同步
+	companyProductMap := make(map[string]*models.CompanyProduct)
+	companyMap := make(map[string]*models.Company)
+	companyIdProductIdMap := make(map[int]int)
+	// 参会人
+	for _, v := range roadshowDataList {
+		//只记录普通成员(也就是参会人)
+		if v.UserIdentity != 4 { //参会者身份,1:主讲人 2:主持人 3:嘉宾 4:普通参会者 5:联席主讲人 6:会议助理
+			continue
+		}
+		if v.UserPhone == "" { //如果手机号为空,那么就不处理了,进入下一个循环
+			continue
+		}
+		// 检测会议是否存在,不存在则创建会议
+		tmpComeinEvent, tmpErr := yb.GetComeinEventByRoadshowId(int(v.RoadshowID))
+		if tmpErr != nil {
+			if tmpErr.Error() == utils.ErrNoRow() {
+				//会议信息
+				tmpComeinEventInfo := &yb.ComeinEvent{
+					//ComeinEventId: 0,
+					RoadshowId: int(v.RoadshowID),
+					//ConferenceId: comeinDataInfo.ConferenceType,
+					Title:      v.RoadshowTitle,
+					StartTime:  time.UnixMilli(v.RoadshowBeginTime),
+					EndTime:    time.UnixMilli(v.RoadshowEndTime),
+					People:     0,
+					CreateTime: time.Now(),
+				}
+				tmpErr2 := yb.AddComeinEvent(tmpComeinEventInfo)
+				if tmpErr2 != nil {
+					//入库失败
+					errMsgList = append(errMsgList, fmt.Sprintf("路演id:%d,路演标题:%s,会议入库失败,err:%s", v.RoadshowID, v.RoadshowTitle, err.Error()))
+					continue
+				}
+				comeinEventMap[int(v.RoadshowID)] = tmpComeinEventInfo
+			} else {
+				//数据异常,sql异常
+				errMsgList = append(errMsgList, fmt.Sprintf("路演id:%d,路演标题:%s,查找会议失败,err:%s", v.RoadshowID, v.RoadshowTitle, err.Error()))
+				continue
+			}
+		} else {
+			comeinEventMap[tmpComeinEvent.RoadshowId] = tmpComeinEvent
+		}
+
+		//校验该记录是否已经入库,如果已经入库,那么就不处理了,进入下一个循环
+		tmpComeinEventUser, tmpErr := yb.GetComeinEventUserByComeinDataId(int(v.ID))
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			errMsgList = append(errMsgList, fmt.Sprintf("路演id:%d,路演标题:%s,用户手机号:%s,会议用户入库失败,err:%s", v.RoadshowID, v.RoadshowTitle, v.UserPhone, err.Error()))
+			continue
+		}
+		if tmpComeinEventUser == nil {
+			mobile := v.UserPhone
+			countryCode := strings.Replace(v.AreaCode, "+", "", -1)
+
+			var companyProductInfo *models.CompanyProduct
+			var companyInfo *models.Company
+			var wxUserInfo *models.WxUser
+
+			productIdList := []int{1, 2}
+			if mobile != "" {
+				wxUserInfo, _ = models.GetWxUserByMobileCountryCode(mobile, countryCode)
+				if wxUserInfo != nil && wxUserInfo.CompanyId != 1 {
+					//获取客户产品信息
+					productId, ok := companyIdProductIdMap[wxUserInfo.CompanyId]
+					if ok { //已经查询过
+						if productId > 0 {
+							// 获取客户产品信息
+							key := fmt.Sprint(wxUserInfo.CompanyId, "_", productId)
+
+							if tmpCompanyProductInfo, ok := companyProductMap[key]; ok {
+								companyProductInfo = tmpCompanyProductInfo
+							}
+
+						}
+					} else {
+						for _, productId := range productIdList {
+							key := fmt.Sprint(wxUserInfo.CompanyId, "_", productId)
+							companyProductInfo, _ = models.GetCompanyProduct(wxUserInfo.CompanyId, productId)
+							if companyProductInfo != nil {
+								companyProductMap[key] = companyProductInfo
+								companyIdProductIdMap[wxUserInfo.CompanyId] = productId
+								//退出产品查询
+								break
+							}
+						}
+						if companyProductInfo == nil {
+							companyIdProductIdMap[wxUserInfo.CompanyId] = 0
+						}
+
+					}
+
+					// 获取客户信息
+					key := fmt.Sprint(wxUserInfo.CompanyId)
+					if tmpCompanyInfo, ok := companyMap[key]; ok {
+						companyInfo = tmpCompanyInfo
+					} else {
+						companyInfo, _ = models.GetCompanyById(wxUserInfo.CompanyId)
+						if companyInfo != nil {
+							companyMap[key] = companyInfo
+						}
+					}
+				}
+			}
+
+			name := v.UserName
+			comeinEventUserInfo := &yb.ComeinEventUser{
+				//ComeinUserId     int       `orm:"column(comein_user_id);pk" description:"自增id"`
+				ComeinEventId:  tmpComeinEvent.ComeinEventId,
+				ComeinDataId:   int(v.ID),
+				UserId:         0,
+				Mobile:         mobile,
+				Email:          v.Email,
+				Name:           name,
+				FirstWatchTime: time.UnixMilli(v.FirstWatchTime),
+				LastWatchTime:  time.UnixMilli(v.LastWatchTime),
+				JoinTime:       int(v.JoinTime),
+				AuthInfo:       v.AuthInfo,
+				JoinType:       int(v.JoinType),
+				DataType:       int(v.DataType),
+				//RegisterTime:     time.Time{},
+				ViewTotal: 0,
+				//LastViewTime:     time.Time{},
+				CompanyId:        0,
+				ProductId:        0,
+				CompanyName:      v.Company,
+				Occupation:       v.Occupation,
+				Status:           "",
+				SellerId:         0,
+				SellerName:       "",
+				CompanyViewTotal: 0,
+				CompanyRoadTotal: 0,
+				CreateTime:       time.Now(),
+			}
+			//这个时候是系统用户了,美滋滋
+			if companyProductInfo != nil {
+				comeinEventUserInfo.RegisterTime = wxUserInfo.RegisterTime
+				//models.
+				userViewStatisticsInfo, _ := models.GetUserLastViewStatisticsByMobile(mobile) //用户阅读信息
+				if userViewStatisticsInfo != nil {
+					comeinEventUserInfo.ViewTotal = userViewStatisticsInfo.Total
+					comeinEventUserInfo.LastViewTime = userViewStatisticsInfo.LastViewTime
+				}
+
+				comeinEventUserInfo.UserId = int(wxUserInfo.UserId)
+				comeinEventUserInfo.Name = wxUserInfo.RealName
+				comeinEventUserInfo.CompanyId = companyProductInfo.CompanyId
+				comeinEventUserInfo.ProductId = companyProductInfo.ProductId
+				comeinEventUserInfo.CompanyName = companyInfo.CompanyName
+				comeinEventUserInfo.Status = companyProductInfo.Status
+				comeinEventUserInfo.SellerId = companyProductInfo.SellerId
+				comeinEventUserInfo.SellerName = companyProductInfo.SellerName
+				comeinEventUserInfo.CompanyViewTotal = companyProductInfo.ViewTotal
+				comeinEventUserInfo.CompanyRoadTotal = companyProductInfo.RoadShowTotal
+			}
+			yb.AddComeinEventUser(comeinEventUserInfo)
+
+			tmpComeinEvent.People = tmpComeinEvent.People + 1
+		}
+	}
+
+	for _, v := range comeinEventMap {
+		v.Update([]string{"People"})
+	}
+	return
+}

+ 267 - 0
services/comein/comein.go

@@ -0,0 +1,267 @@
+package comein
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"hongze/hongze_task/services/alarm_msg"
+	"hongze/hongze_task/utils"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"sort"
+	"strconv"
+	"time"
+)
+
+// EventListResp 会议列表返回数据结构
+type EventListResp struct {
+	Code      string              `json:"code"`
+	Data      []EventListDataResp `json:"data"`
+	Errorcode string              `json:"errorcode"`
+	Errordesc string              `json:"errordesc"`
+	Extra     struct {
+		HasMore   bool   `json:"hasMore"`
+		More      string `json:"more"`
+		Pagestart string `json:"pagestart"`
+		Total     string `json:"total"`
+	} `json:"extra"`
+	Msg   string `json:"msg"`
+	Total int64  `json:"total"`
+}
+
+// EventListDataResp 会议数据
+type EventListDataResp struct {
+	Authtag            string `json:"authtag"`
+	ConferenceType     int64  `json:"conferenceType"`
+	ContentTypeTagName string `json:"contentTypeTagName"`
+	DescURL            string `json:"descUrl"`
+	Etime              int64  `json:"etime"`
+	ID                 int64  `json:"id"`
+	IndustryName       string `json:"industryName"`
+	IsDel              int64  `json:"isDel"`
+	Livemode           int64  `json:"livemode"`
+	Logo               string `json:"logo"`
+	Logoweb            string `json:"logoweb"`
+	Members            []struct {
+		Identity    int64  `json:"identity"`
+		PhoneNumber string `json:"phoneNumber"`
+		Type        int64  `json:"type"`
+		Uname       string `json:"uname"`
+	} `json:"members"`
+	PresentURL        string `json:"presentUrl"`
+	RecordSupport     int64  `json:"recordSupport"`
+	RoadshowID        int64  `json:"roadshowId"`
+	ShortURL          string `json:"shortUrl"`
+	Status            string `json:"status"`
+	Stime             int64  `json:"stime"`
+	Title             string `json:"title"`
+	WxminiProgramID   string `json:"wxminiProgramId"`
+	WxminiProgramPage string `json:"wxminiProgramPage"`
+}
+
+// GetEventList 获取会议列表
+func GetEventList(startTime, endTime time.Time) (respData EventListResp, err error) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("查询组织下所有的会议列表失败;ERR:"+err.Error(), 3)
+		}
+	}()
+	logMsg := ``
+	pageStart := 0
+	pageNum := 10
+	paramsMap := map[string]string{
+		"mod": "roadshow",   //模块名
+		"act": "opensearch", //处理方法名
+		//"btime": fmt.Sprint(startTime.Unix() * 1000), //开始时间,时间戳
+		//"etime": fmt.Sprint(endTime.Unix() * 1000),   //结束时间,时间戳
+		//"ignoredel": "1",                                  //忽略已删除的数据 (1 删除的数据也可查询出)
+		"pagestart": strconv.Itoa(pageStart),              //翻页数 (第一页传 0 )
+		"pagenum":   strconv.Itoa(pageNum),                //每页总条数(默认10条)
+		"ts":        fmt.Sprint(time.Now().Unix() * 1000), //请求发起的时间戳,单位:毫秒
+	}
+	paramStr := GetUrlParams(paramsMap)
+	//fmt.Println(paramStr)
+
+	//App   string `json:"app" description:"数据类型"`
+	//Mod   string `json:"mod" description:"模块名"`
+	//Act   string `json:"act" description:"处理方法名"`
+	//Appid string `json:"appid" description:"合作方ID"`
+
+	getUrl := utils.COMEIN_URL + "?" + paramStr
+
+	resp, err := http.Get(getUrl)
+	if err != nil {
+		logMsg = fmt.Sprint("comein get err; request:", getUrl, "; errMsg:", err.Error())
+		utils.FileLog.Info(logMsg)
+		return
+	}
+
+	defer resp.Body.Close()
+
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		logMsg = fmt.Sprint("comein get err; request:", getUrl, "; errMsg:", err.Error())
+		utils.FileLog.Info(logMsg)
+		return
+	}
+	utils.FileLog.Info(fmt.Sprint("comein get Result", ";url:", getUrl, ";\nresponse:", string(body)))
+	err = json.Unmarshal(body, &respData)
+	if err != nil {
+		utils.FileLog.Info("comein get Err:", err.Error(), ";url:", getUrl, ";response:", string(body))
+		err = errors.New("Unmarshal Err:" + err.Error())
+		return
+	}
+	if respData.Errorcode != "0" {
+		utils.FileLog.Info("comein get Err:", err.Error(), ";url:", getUrl, ";response:", string(body))
+		err = errors.New(respData.Errordesc)
+		return
+	}
+	return
+}
+
+// RoadshowDataResp 用户参会数据返回
+type RoadshowDataResp struct {
+	Code      string         `json:"code"`
+	Data      []RoadshowData `json:"data"`
+	Errorcode string         `json:"errorcode"`
+	Errordesc string         `json:"errordesc"`
+	Msg       string         `json:"msg"`
+}
+
+type RoadshowData struct {
+	AreaCode          string `json:"areaCode"`
+	AskCount          int64  `json:"askCount"`
+	AuthInfo          string `json:"authInfo"`
+	Company           string `json:"company"`
+	DataType          int64  `json:"dataType"`
+	DutySeller        string `json:"dutySeller"`
+	Email             string `json:"email"`
+	FirstWatchTime    int64  `json:"firstWatchTime"`
+	GuestUserNames    string `json:"guestUserNames"`
+	ID                int64  `json:"id"`
+	JoinTime          int64  `json:"joinTime"`
+	JoinType          int64  `json:"joinType"`
+	LastWatchTime     int64  `json:"lastWatchTime"`
+	MeetingType       string `json:"meetingType"`
+	Occupation        string `json:"occupation"`
+	OrgRemarks        string `json:"orgRemarks"`
+	ResearchArea      string `json:"researchArea"`
+	RoadshowBeginTime int64  `json:"roadshowBeginTime"`
+	RoadshowEndTime   int64  `json:"roadshowEndTime"`
+	RoadshowID        int64  `json:"roadshowId"`
+	RoadshowTitle     string `json:"roadshowTitle"`
+	RoadshowType      int64  `json:"roadshowType"`
+	SpeakerID         int64  `json:"speakerId"`
+	SpeakerName       string `json:"speakerName"`
+	TelFixedID        int64  `json:"telFixedId"`
+	TeleconferenceID  string `json:"teleconferenceId"`
+	ThirdMeetingID    string `json:"thirdMeetingId"`
+	UniqueID          string `json:"uniqueId"`
+	UserIdentity      int64  `json:"userIdentity"`
+	UserInfoSource    string `json:"userInfoSource"`
+	UserName          string `json:"userName"`
+	UserPhone         string `json:"userPhone"`
+}
+
+// GetRoadshowDataList 获取参会人员列表
+func GetRoadshowDataList(startTime, endTime int64) (respData RoadshowDataResp, err error) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("获取参会人员列表失败;ERR:"+err.Error(), 3)
+		}
+	}()
+	logMsg := ``
+	paramsMap := map[string]string{
+		"mod":       "open",                               //模块名
+		"act":       "roadshow-datas",                     //处理方法名
+		"beginTime": fmt.Sprint(startTime),                //开始时间,时间戳
+		"endTime":   fmt.Sprint(endTime),                  //结束时间,时间戳
+		"ts":        fmt.Sprint(time.Now().Unix() * 1000), //请求发起的时间戳,单位:毫秒
+	}
+	paramStr := GetUrlParams(paramsMap)
+
+	paramsMap["dataType"] = "1" //数据类型,1:直播 2:回放 (该参数不参与签名算法)
+	//fmt.Println(paramStr)
+
+	//App   string `json:"app" description:"数据类型"`
+	//Mod   string `json:"mod" description:"模块名"`
+	//Act   string `json:"act" description:"处理方法名"`
+	//Appid string `json:"appid" description:"合作方ID"`
+
+	getUrl := utils.COMEIN_URL + "?" + paramStr
+
+	resp, err := http.Get(getUrl)
+	if err != nil {
+		logMsg = fmt.Sprint("获取参会人员列表 comein get err; request:", getUrl, "; errMsg:", err.Error())
+		utils.FileLog.Info(logMsg)
+		return
+	}
+
+	defer resp.Body.Close()
+
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		logMsg = fmt.Sprint("获取参会人员列表 comein get err; request:", getUrl, "; errMsg:", err.Error())
+		utils.FileLog.Info(logMsg)
+		return
+	}
+	utils.FileLog.Info(fmt.Sprint("获取参会人员列表 comein get Result", ";url:", getUrl, ";\nresponse:", string(body)))
+	err = json.Unmarshal(body, &respData)
+	if err != nil {
+		utils.FileLog.Info("获取参会人员列表 comein get Err:", err.Error(), ";url:", getUrl, ";response:", string(body))
+		err = errors.New("Unmarshal Err:" + err.Error())
+		return
+	}
+	if respData.Errorcode != "0" {
+		utils.FileLog.Info("获取参会人员列表 comein get Err:", err.Error(), ";url:", getUrl, ";response:", string(body))
+		err = errors.New(respData.Errordesc)
+		return
+	}
+	return
+}
+
+// GetUrlParams 获取url请求参数
+func GetUrlParams(params map[string]string) (paramStr string) {
+	GetSign(params)
+	// 待签名字符串
+	for index, val := range params {
+		paramStr += index + `=` + val + `&`
+	}
+	paramStr = paramStr[:len(paramStr)-1]
+	return
+}
+
+// GetSign 获取签名
+func GetSign(params map[string]string) (paramStr string) {
+	//获取map的下标切片,然后对下标进行排序
+	keySlice := make([]string, 0)
+
+	//基础参数
+	params["appid"] = utils.COMEIN_APPID //签名用的是appid,实际请求用的appId
+	params["app"] = "json"
+
+	ignoreStr := []string{"app", "mod", "act"}
+	for index := range params {
+		//需要忽略的字符
+		if utils.InArrayByStr(ignoreStr, index) {
+			continue
+		}
+		keySlice = append(keySlice, index)
+	}
+	sort.Strings(keySlice)
+
+	// 待签名字符串
+	for _, index := range keySlice {
+		paramStr += index + `=` + params[index] + `&`
+	}
+
+	// 获取签名
+	signStr := utils.HmacMd5(utils.COMEIN_SECREKEY, paramStr[:len(paramStr)-1])
+	signature := url.QueryEscape(signStr)
+	params["signature"] = signature
+
+	delete(params, "appid")
+	params["appId"] = utils.COMEIN_APPID
+	return
+}

+ 4 - 0
services/task.go

@@ -105,6 +105,10 @@ func Task() {
 	setPublicMeetingUnionCode := task.NewTask("setPublicMeetingUnionCode", "0 */10 * * * *", roadshow.SetPublicMeetingUnionCode)
 	task.AddTask("setPublicMeetingUnionCode", setPublicMeetingUnionCode)
 
+	//同步进门会议参会人员数据
+	syncComeinMeeting := task.NewTask("SyncComeinMeeting", "0 50 07-23/1 * * * ", SyncComeinMeeting)
+	task.AddTask("SyncComeinMeeting", syncComeinMeeting)
+
 	task.StartTask()
 
 	fmt.Println("task end")

+ 30 - 0
utils/common.go

@@ -1,6 +1,7 @@
 package utils
 
 import (
+	"crypto/hmac"
 	"crypto/md5"
 	"crypto/sha1"
 	"encoding/base64"
@@ -68,6 +69,13 @@ func MD5(data string) string {
 	return hex.EncodeToString(m[:])
 }
 
+// HmacMd5 HmacMd5加密
+func HmacMd5(key, data string) string {
+	h := hmac.New(md5.New, []byte(key))
+	h.Write([]byte(data))
+	return hex.EncodeToString(h.Sum([]byte("")))
+}
+
 // 获取数字随机字符
 func GetRandDigit(n int) string {
 	return fmt.Sprintf("%0"+strconv.Itoa(n)+"d", rnd.Intn(int(math.Pow10(n))))
@@ -736,3 +744,25 @@ func SubStr(str string, subLen int) string {
 	str = string(strRune[:bodyRuneLen])
 	return str
 }
+
+// InArrayByInt php中的in_array(判断Int类型的切片中是否存在该int值)
+func InArrayByInt(idIntList []int, searchId int) (has bool) {
+	for _, id := range idIntList {
+		if id == searchId {
+			has = true
+			return
+		}
+	}
+	return
+}
+
+// InArrayByStr php中的in_array(判断String类型的切片中是否存在该string值)
+func InArrayByStr(idStrList []string, searchId string) (has bool) {
+	for _, id := range idStrList {
+		if id == searchId {
+			has = true
+			return
+		}
+	}
+	return
+}

+ 23 - 0
utils/config.go

@@ -55,6 +55,13 @@ var (
 	EDB_LIB_URL string
 )
 
+//进门财经账号信息
+var (
+	COMEIN_URL      string
+	COMEIN_APPID    string
+	COMEIN_SECREKEY string
+)
+
 func init() {
 	tmpRunMode, err := web.AppConfig.String("run_mode")
 	if err != nil {
@@ -127,6 +134,22 @@ ZwIDAQAB
 
 		EDB_LIB_URL = "http://8.136.199.33:8300/edbapi/"
 	}
+
+	// 进门财经开放api配置
+	ComeinOpenApiConfig()
+}
+
+// ComeinOpenApiConfig 进门开放api配置
+func ComeinOpenApiConfig() {
+	if RunMode == "release" {
+		COMEIN_URL = "https://server.comein.cn/comein/index.php"
+		COMEIN_APPID = "39b48779-debd-446a-a303-900322d8e356"
+		COMEIN_SECREKEY = "9102a767f20f11ecb5d6b8599f142ed4"
+	} else {
+		COMEIN_URL = "https://testserver.comein.cn/comein/index.php"
+		COMEIN_APPID = "7b966708-4a8b-4d24-9066-fe29920e7eee"
+		COMEIN_SECREKEY = "76e004876fae4b3c8721a3f4c2d115da"
+	}
 }
 
 //http://entryapi.brilliantstart.cn