package cygx import ( "encoding/json" "errors" "fmt" "hongze/hz_crm_api/models/cygx" "hongze/hz_crm_api/services/alarm_msg" "hongze/hz_crm_api/utils" "io/ioutil" "net/http" "strconv" "strings" "time" ) type ApifoxModalSingUpClass struct { ErrorCode *string `json:"errorCode"` // 错误码,001:活动不存在;002:该活动不支持此渠道报名;003:该手机号或邮箱已经被其他账号提交报名;004:不在报名时间;005:报名人数已满 ErrorMsg *string `json:"errorMsg"` // 错误信息 Result SingUpMap `json:"result"` // 结果Map,成功 Success bool `json:"success"` // 成功标识,true:成功;false:失败。可作为判断报名是否成功的标识 Timestamp float64 `json:"timestamp"` // 时间戳 } type SingUpMap struct { Msg string `json:"msg"` // 请求信息,成功信息 } type GetYidongTokenResp struct { Success bool `json:"success"` // 请求信息,成功信息 AccessToken string `json:"access_token"` // token ExpiresIn int `json:"expires_in"` // 过期时间 } // 易董建会成功返回的结构体 type YiDongSaveRoadshowDetailResp struct { ErrorCode string `json:"errorCode"` // 错误码 ErrorMsg string `json:"errorMsg"` // 错误信息 Success bool `json:"success"` // 请求信息,成功信息 Result YiDongSaveRoadshowDetailIdResp `json:"result"` // 返回信息 } type YiDongSaveRoadshowDetailIdResp struct { ActivityId string `json:"activityId"` //易董返回的活动ID } type YiDongUpdateActivityPublishResp struct { Id string `description:"易董活动ID,为空时新增,非空时修改" json:"id"` PublishFlag string `description:"发布状态,1发布 0 取消发布" json:"publishFlag"` } // 获取路演详细信息(2.0)结构体 type YiDongGetRoadshowDetailResp struct { ErrorCode string `json:"errorCode"` // 错误码 ErrorMsg string `json:"errorMsg"` // 错误信息 Success bool `json:"success"` // 请求信息,成功信息 Result YiDongGetRoadshowDetailRespResult `json:"result"` // 返回信息 } type YiDongGetRoadshowDetailRespResult struct { MeetingCode string `json:"meetingCode"` //腾讯会议号 } // 获取创建人信息列表(新)结构体 type YiDongGetCreateUserListResp struct { ErrorCode string `json:"errorCode"` // 错误码 ErrorMsg string `json:"errorMsg"` // 错误信息 Success bool `json:"success"` // 请求信息,成功信息 Result YiDongGetCreateUserListResult `json:"result"` // 返回信息 } type YiDongGetCreateUserListResult struct { PersonList []*PersonUser } type PersonUser struct { Id string `description:"人员id" json:"id"` PersonName string `description:"姓名" json:"personName"` JobName string `description:"职务" json:"jobName"` UserId string `description:"用户id" json:"userId"` UserName string `description:"用户账号" json:"userName"` IdentityType string `description:"身份类型:0 不可用,1可用" json:"identityType"` Lock bool `description:"锁定状态:true 锁定 false 未锁定" json:"lock"` CreatePersonName string `description:"创建人姓名:创建时必填" json:"createPersonName"` } type YidongActivityResult struct { ActivityJoinType string `json:"activityJoinType"` // 活动入会类型,01报名审核后可入会 02预约即可入会 03仅定向邀请人员可入会 Banner string `json:"banner"` // 宣传图 BusinessCardOpen string `json:"businessCardOpen"` // 上传名片是否开启,1是 0否 BusinessCardRequired string `json:"businessCardRequired"` // 上传名片是否必填,1是 0否 CertificateInformationOpen string `json:"certificateInformationOpen"` // 证件信息是否开启,1是 0否 CertificateInformationRequired string `json:"certificateInformationRequired"` // 证件信息是否必填,1是 0否 CompanyCodeOpen string `json:"companyCodeOpen"` // 公司代码是否开启,1是 0否 CompanyCodeRequired string `json:"companyCodeRequired"` // 公司代码是否必填,1是 0否 CompanyInfo string `json:"companyInfo"` // 公司名称 CompanyShortNameOpen string `json:"companyShortNameOpen"` // 公司名称是否开启,1是 0否 CompanyShortNameRequired string `json:"companyShortNameRequired"` // 公司名称是否必填,1是 0否 End string `json:"end"` // 活动结束时间 ID string `json:"id"` // 活动主键id IndustrySwName string `json:"industrySwName"` // 行业 InviteeOpen *string `json:"inviteeOpen"` // 邀请机构是否开启,1是 0否 InviteeRequired *string `json:"inviteeRequired"` // 邀请机构是否必填,1是 0否 JobNameOpen string `json:"jobNameOpen"` // 职务是否开启,1是 0否 JobNameRequired string `json:"jobNameRequired"` // 职务是否必填,1是 0否 MailOpen string `json:"mailOpen"` // 邮箱是否开启,1是 0否 MailRequired string `json:"mailRequired"` // 邮箱是否必填,1是 0否 PersonNameOpen string `json:"personNameOpen"` // 姓名是否开启,1是 0否 PersonNameRequired string `json:"personNameRequired"` // 姓名是否必填,1是 0否 PersonTelephoneOpen string `json:"personTelephoneOpen"` // 手机号是否开启,1是 0否 PersonTelephoneRequired string `json:"personTelephoneRequired"` // 手机号是否必填,1是 0否 SignUpEnd string `json:"signUpEnd"` // 报名结束时间,适应于报名审核后可入会,为空表示不限制报名时间 SignUpStart string `json:"signUpStart"` // 报名开始时间,适应于报名审核后可入会,为空表示不限制报名时间 Start string `json:"start"` // 活动开始时间 SyncFlag string `json:"syncFlag"` // 同步有效性,同步有效性 1有效,0失效 Title string `json:"title"` // 活动主题 Type string `json:"type"` // 路演类型 URL string `json:"url"` // 活动短链接 } type YidongApifoxModal struct { ErrorCode interface{} `json:"errorCode"` ErrorMsg interface{} `json:"errorMsg"` Result []YidongActivityResult `json:"result"` Success bool `json:"success"` Timestamp int64 `json:"timestamp"` } type YidongResultuser struct { DeviceType string `json:"deviceType"` // 参会方式,1-PC,2-Mac,3-Android,4-IOS,5-Web,6-iPad,7-Android Pad,8-小程序,0-PSTN Duration string `json:"duration"` // 云会议参会时长 DurationInteract string `json:"durationInteract"` // 互动交流参会时长 DurationLive string `json:"durationLive"` // 直播参会时长 DurationReview string `json:"durationReview"` // 回看参会时长 EndTime string `json:"endTime"` // 云会议最后退会时间 EndTimeInteract string `json:"endTimeInteract"` // 互动交流最后退会时间 EndTimeLive string `json:"endTimeLive"` // 直播最后退会时间 EndTimeReview string `json:"endTimeReview"` // 回看最后退会时间 ID string `json:"id"` // 主键id Mail string `json:"mail" comment:"电子邮件"` CompanyName string `json:"company_name" comment:"公司名称"` JobName string `json:"jobName"` // 职务 MobileCountryCode string `json:"mobileCountryCode"` // 手机号国际区号码 PersonName string `json:"personName"` // 姓名 PersonTelephone string `json:"personTelephone"` // 用户手机号 StartTime string `json:"startTime"` // 云会议最早入会时间 StartTimeInteract string `json:"startTimeInteract"` // 互动交流最早入会时间 StartTimeLive string `json:"startTimeLive"` // 直播最早入会时间 StartTimeReview string `json:"startTimeReview"` // 回看最早入会时间 Status string `json:"status"` // 状态,D表示被删除 UserID string `json:"userId,omitempty"` // 用户id SignUpStatus string `json:"sign_up_status" comment:"报名状态"` } // CheckYidongActivitySignupTime 校验易董的活动是否可以 添加报名 func CheckYidongActivitySignupTime(activityInfo *cygx.ActivityDetail) (errstr string) { if activityInfo.YidongSignUpEnd == "0000-00-00 00:00:00" { return } timeStart := activityInfo.YidongSignUpStart timeEnd := activityInfo.YidongSignUpEnd resultTimeStart := utils.StrTimeToTime(timeStart) //时间字符串格式转时间格式 resStart := time.Now().Before(resultTimeStart) if resStart { errstr = "当前时间不可报名!" } resultTimeEnd := utils.StrTimeToTime(timeEnd) //时间字符串格式转时间格式 resend := time.Now().After(resultTimeEnd) if resend { errstr = "当前时间不可报名!" } return } // YidongActivityUserSingnUp 易董的活动添加报名 func YidongActivityUserSingnUp(items []*cygx.YidongActivitySignup) (err error) { url := utils.YiDongHuaWeiYunUrl + "app/hz/signAppointmentsForThird" method := "POST" for _, v := range items { defer func() { if err != nil { go alarm_msg.SendAlarmMsg("易董的活动添加报名消息失败,Err:"+err.Error(), 3) } }() payload := strings.NewReader(`{ "activityId": "` + v.YidongActivityId + `", "personTelephone":"` + v.Mobile + `", "personName": "` + v.RealName + `", "companyName": "` + v.CompanyName + `", "mobileCountryCode": "+` + v.CountryCode + `", "thirdPartySource": "01" }`) client := &http.Client{} req, err := http.NewRequest(method, url, payload) if err != nil { fmt.Println(err) utils.FileLog.Info(err.Error()) return err } req.Header.Add("Content-Type", "application/json") res, err := client.Do(req) if err != nil { fmt.Println(err) utils.FileLog.Info(err.Error()) return err } defer res.Body.Close() var ApifoxModal *ApifoxModalSingUpClass body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) utils.FileLog.Info(err.Error()) return err } itemApiLog := new(cygx.CygxThreeApiLog) itemApiLog.CreateTime = time.Now() itemApiLog.Source = 1 itemApiLog.Url = url itemApiLog.Body = utils.ReplaceSpaceAndWrap(fmt.Sprint(payload)) itemApiLog.Result = string(body) go cygx.AddCygxThreeApiLog(itemApiLog) err = json.Unmarshal(body, &ApifoxModal) } return } // GetYidongToken 获取易董证通云接口的token func GetYidongToken() (token string, err error) { defer func() { if err != nil { go alarm_msg.SendAlarmMsg("获取易董证通云接口的token失败;err:"+err.Error(), 3) } }() cacheKey := utils.YI_DONG_ZHENG_TONG_YUN_TOKEN_KEY ttlTime := utils.Rc.GetRedisTTL(cacheKey) if ttlTime > 0 { token, _ = utils.Rc.RedisString(cacheKey) if token != "" { return } } url := utils.YiDongZhengTongYunUrl + "oauth/token?grant_type=client_credentials&response_type=token&client_id=" + utils.YiDongZhengTongYunClientId + "&client_secret=" + utils.YiDongZhengTongYunClientSecret method := "GET" client := &http.Client{} req, err := http.NewRequest(method, url, nil) if err != nil { return } res, err := client.Do(req) if err != nil { return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { return } itemApiLog := new(cygx.CygxThreeApiLog) itemApiLog.CreateTime = time.Now() itemApiLog.Source = 1 itemApiLog.Url = url itemApiLog.Body = "" itemApiLog.Result = string(body) go cygx.AddCygxThreeApiLog(itemApiLog) var yidongTokenResp *GetYidongTokenResp err = json.Unmarshal(body, &yidongTokenResp) if err != nil { return } token = yidongTokenResp.AccessToken err = utils.Rc.Put(cacheKey, token, time.Second*7000) if err != nil { return } return } // 易董创建/更新路演活动结构体 type SaveRoadshowDetaiParam struct { Id string `description:"易董活动ID,为空时新增,非空时修改" json:"id"` PublishFlag string `description:"发布状态,1发布 0 取消发布" json:"publishFlag"` Title string `description:"主题" json:"title"` Type string `description:"类型:投资策略、深度解读、行业分析、公司分析、自定义活动" json:"type"` Start string `description:"开始时间:开始时间与结束时间,日期必须相同" json:"start"` End string `description:"结束时间:开始时间与结束时间,日期必须相同" json:"end"` CreateUserId string `description:"创建人userId:创建时必填" json:"createUserId"` CreatePersonName string `description:"创建人姓名:创建时必填" json:"createPersonName"` } // 获取创建人信息列表(新) func YiDongGetCreateUserList() (userId string) { var err error defer func() { if err != nil { fmt.Println(err) go alarm_msg.SendAlarmMsg("获取创建人信息列表(新)失败;err:"+err.Error(), 3) } }() token, _ := GetYidongToken() if token == "" { return } url := utils.YiDongZhengTongYunUrl + "interact/activityThirdApi/getCreateUserList" + "?access_token=" + token method := "POST" client := &http.Client{} req, err := http.NewRequest(method, url, strings.NewReader("")) if err != nil { fmt.Println(err) return } req.Header.Add("Content-Type", "application/json") res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } itemApiLog := new(cygx.CygxThreeApiLog) itemApiLog.CreateTime = time.Now() itemApiLog.Source = 1 itemApiLog.Url = url itemApiLog.Body = "" itemApiLog.Result = string(body) go cygx.AddCygxThreeApiLog(itemApiLog) var yidongResp *YiDongGetCreateUserListResp err = json.Unmarshal(body, &yidongResp) if err != nil { return } if !yidongResp.Success { err = errors.New("获取创建人信息列表(新) 接口失败," + yidongResp.ErrorCode + yidongResp.ErrorMsg) return } if len(yidongResp.Result.PersonList) > 0 { for _, v := range yidongResp.Result.PersonList { if v.PersonName == "高亦文" { userId = v.UserId } } } if userId == "" { err = errors.New("获取创建人信息列表(新) 接口失败," + yidongResp.ErrorCode + yidongResp.ErrorMsg + string(body)) return } return } //func init() { // YiDongUpdateActivityPublish(2149) //} // YiDongSaveRoadshowDetail 创建/更新路演活动(新) func YiDongSaveRoadshowDetail(activityId int) { var err error defer func() { if err != nil { fmt.Println(err) go alarm_msg.SendAlarmMsg("活动同步到易董失败;err:"+err.Error(), 3) } }() activityInfo, err := cygx.GetAddActivityInfoById(activityId) if err != nil { fmt.Println(err) return } if activityInfo == nil { return } if activityInfo.IsYidongConduct == 0 { return } token, _ := GetYidongToken() if token == "" { return } //C类分析师电话会 不对外发布 if activityInfo.ActivityTypeId == 7 || activityInfo.IsBClass == 1 { activityInfo.PublishStatus = 0 } //if activityInfo.PublishStatus == 0 { // return //} //获取高亦文在易董的用户ID var createUserId string createUserId = YiDongGetCreateUserList() url := utils.YiDongZhengTongYunUrl + "interact/activityThirdApi/saveRoadshowDetail" + "?access_token=" + token startTime := activityInfo.ActivityTime endTime := utils.StrTimeToTime(startTime).Add(time.Minute * 60).Format(utils.FormatDateTime) // 30分钟后为结束时间 params := SaveRoadshowDetaiParam{ Id: activityInfo.YidongActivityIdByCygx, PublishFlag: strconv.Itoa(activityInfo.PublishStatus), Title: activityInfo.ActivityName, Type: "行业分析", Start: startTime, End: endTime, CreateUserId: createUserId, CreatePersonName: "高亦文", } postData, err := json.Marshal(params) if err != nil { fmt.Println("PostData json.Marshal Err:" + err.Error()) utils.FileLogCygx.Info("PostData json.Marshal Err:" + err.Error()) return } method := "POST" client := &http.Client{} req, err := http.NewRequest(method, url, strings.NewReader(string(postData))) if err != nil { fmt.Println(err) return } req.Header.Add("Content-Type", "application/json") res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } itemApiLog := new(cygx.CygxThreeApiLog) itemApiLog.CreateTime = time.Now() itemApiLog.Source = 1 itemApiLog.Url = url itemApiLog.Body = string(postData) itemApiLog.Result = string(body) go cygx.AddCygxThreeApiLog(itemApiLog) var yidongResp *YiDongSaveRoadshowDetailResp err = json.Unmarshal(body, &yidongResp) if err != nil { return } if !yidongResp.Success { err = errors.New("更新易董建会接口失败," + yidongResp.ErrorCode + yidongResp.ErrorMsg) return } yidongActivityIdByCygx := yidongResp.Result.ActivityId YiDongGetRoadshowDetail(activityId, yidongActivityIdByCygx) //获取易董创建的腾讯会议详情,并写入到我们自己的小程序 YiDongSignAppointmentsForThirdSpeaker(activityId) // 根据填入的主讲人姓名 以嘉宾的身份自动报名 } // YiDongGetRoadshowDetail 获取易董创建的腾讯会议详情,并写入到我们自己的小程序 func YiDongGetRoadshowDetail(activityId int, yidongActivityIdByCygx string) { var err error defer func() { if err != nil { fmt.Println(err) go alarm_msg.SendAlarmMsg("易董获取路演详细信息(2.0);err:"+err.Error(), 3) } }() activityInfo, err := cygx.GetAddActivityInfoById(activityId) if err != nil { fmt.Println(err) return } if activityInfo == nil { return } token, _ := GetYidongToken() if token == "" { return } activityInfo.YidongActivityIdByCygx = yidongActivityIdByCygx url := utils.YiDongZhengTongYunUrl + "interact/activityManageApi/getRoadshowDetail" + "?access_token=" + token if activityInfo.IsYidongConduct == 0 { return } params := YiDongSaveRoadshowDetailIdResp{ ActivityId: yidongActivityIdByCygx, } postData, err := json.Marshal(params) if err != nil { fmt.Println("PostData json.Marshal Err:" + err.Error()) utils.FileLogCygx.Info("PostData json.Marshal Err:" + err.Error()) return } method := "POST" client := &http.Client{} req, err := http.NewRequest(method, url, strings.NewReader(string(postData))) if err != nil { fmt.Println(err) return } req.Header.Add("Content-Type", "application/json") res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } itemApiLog := new(cygx.CygxThreeApiLog) itemApiLog.CreateTime = time.Now() itemApiLog.Source = 1 itemApiLog.Url = url itemApiLog.Body = string(postData) itemApiLog.Result = string(body) go cygx.AddCygxThreeApiLog(itemApiLog) var yidongResp *YiDongGetRoadshowDetailResp err = json.Unmarshal(body, &yidongResp) if err != nil { return } if !yidongResp.Success { err = errors.New("易董获取路演详细信息(2.0)接口失败," + yidongResp.ErrorCode + yidongResp.ErrorMsg) return } MeetingCode := yidongResp.Result.MeetingCode if activityInfo.TencentConferenceNumber != "" { activityInfo.Body = strings.Replace(activityInfo.Body, activityInfo.TencentConferenceNumber, MeetingCode, -1) } else { activityInfo.Body += "

腾讯会议号:" + MeetingCode + "

" } activityInfo.TencentConferenceNumber = MeetingCode err = cygx.UpdateCygxActivityTencentConferenceNumber(activityInfo) return } // 发布路演到活动广场(新) func YiDongUpdateActivityPublish(activityId int) { var err error defer func() { if err != nil { fmt.Println(err) go alarm_msg.SendAlarmMsg("发布路演到活动广场(新);err:"+err.Error(), 3) } }() activityInfo, err := cygx.GetAddActivityInfoById(activityId) if err != nil { fmt.Println(err) return } if activityInfo == nil { return } //C类分析师电话会 不对外发布 if activityInfo.ActivityTypeId == 7 { activityInfo.PublishStatus = 0 } token, _ := GetYidongToken() if token == "" { return } url := utils.YiDongZhengTongYunUrl + "interact/activityThirdApi/updateActivityPublish" + "?access_token=" + token if activityInfo.IsYidongConduct == 0 || activityInfo.YidongActivityIdByCygx == "" { return } params := YiDongUpdateActivityPublishResp{ Id: activityInfo.YidongActivityIdByCygx, PublishFlag: strconv.Itoa(activityInfo.PublishStatus), } postData, err := json.Marshal(params) if err != nil { fmt.Println("PostData json.Marshal Err:" + err.Error()) utils.FileLogCygx.Info("PostData json.Marshal Err:" + err.Error()) return } method := "POST" client := &http.Client{} req, err := http.NewRequest(method, url, strings.NewReader(string(postData))) if err != nil { fmt.Println(err) return } req.Header.Add("Content-Type", "application/json") res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } itemApiLog := new(cygx.CygxThreeApiLog) itemApiLog.CreateTime = time.Now() itemApiLog.Source = 1 itemApiLog.Url = url itemApiLog.Body = string(postData) itemApiLog.Result = string(body) go cygx.AddCygxThreeApiLog(itemApiLog) var yidongResp *YiDongGetRoadshowDetailResp err = json.Unmarshal(body, &yidongResp) if err != nil { return } if !yidongResp.Success { err = errors.New("发布路演到活动广场(新) 接口失败," + yidongResp.ErrorCode + yidongResp.ErrorMsg) return } if activityInfo.PublishStatus == 0 { YiDongUpdateActivityStatus(activityId) } return } // 易董创建/更新路演活动结构体 type SignAppointmentsForThirdParam struct { ActivityId string `description:"易董活动ID" json:"activityId"` MobileCountryCode string `description:"国际区号注意要带前面+号 " json:"mobileCountryCode"` PersonTelephone string `description:"手机号" json:"personTelephone"` ThirdPartySource string `description:"第三方来源;弘则固定:01" json:"thirdPartySource"` InvestorType string `description:"投资者类型 0个人1机构" json:"investorType"` PersonName string `description:"姓名" json:"personName"` CompanyName string `description:"公司名" json:"companyName"` JoinRole string `description:"1:嘉宾, 2:普通参会人员, 3:会议助理。不传默认取值2" json:"joinRole"` OutCallStatus string `description:"1:需要,0:不需要。不传取默认值0" json:"outCallStatus"` } type YiDongSignAppointmentsForThirdResp struct { ErrorCode string `json:"errorCode"` // 错误码,001:活动不存在;002:该活动不支持此渠道报名;003:该手机号或邮箱已经被其他账号提交报名;004:不在报名时间;005:报名人数已满 ErrorMsg string `json:"errorMsg"` // 错误信息 Success bool `json:"success"` // 成功标识,true:成功;false:失败。可作为判断报名是否成功的标识 Timestamp float64 `json:"timestamp"` // 时间戳 } // 根据填入的主讲人姓名 以嘉宾的身份自动报名 func YiDongSignAppointmentsForThirdSpeaker(activityId int) { var err error defer func() { if err != nil { fmt.Println(err) go alarm_msg.SendAlarmMsg("易董获取路演详细信息(2.0);err:"+err.Error(), 3) } }() activityInfo, err := cygx.GetAddActivityInfoById(activityId) if err != nil { fmt.Println(err) return } if activityInfo == nil { return } speaker := activityInfo.Speaker if speaker == "" { return } // 获取admin列表-匹配联系人是否为admin用户 sysUserList, err := cygx.GetAskEmail() var personNameites []*cygx.AskEmailRep if err != nil { return } //var personName string //var personTelephone string for _, v := range sysUserList { if strings.Contains(speaker, v.Name) && v.Mobile != "" { personNameites = append(personNameites, &cygx.AskEmailRep{ Name: v.Name, Mobile: v.Mobile, }) } } if activityInfo.IsYidongConduct == 0 || len(personNameites) == 0 { return } url := utils.YiDongHuaWeiYunUrl + "app/hz/signAppointmentsForThird" for _, v := range personNameites { params := SignAppointmentsForThirdParam{ ActivityId: activityInfo.YidongActivityIdByCygx, MobileCountryCode: "+86", PersonTelephone: v.Mobile, ThirdPartySource: "01", InvestorType: "0", PersonName: v.Name, JoinRole: "1", CompanyName: "弘则研究", OutCallStatus: "0", } postData, err := json.Marshal(params) if err != nil { fmt.Println("PostData json.Marshal Err:" + err.Error()) utils.FileLogCygx.Info("PostData json.Marshal Err:" + err.Error()) return } method := "POST" client := &http.Client{} req, err := http.NewRequest(method, url, strings.NewReader(string(postData))) if err != nil { fmt.Println(err) return } req.Header.Add("Content-Type", "application/json") res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } itemApiLog := new(cygx.CygxThreeApiLog) itemApiLog.CreateTime = time.Now() itemApiLog.Source = 1 itemApiLog.Url = url itemApiLog.Body = string(postData) itemApiLog.Result = string(body) go cygx.AddCygxThreeApiLog(itemApiLog) var yidongResp *YiDongSignAppointmentsForThirdResp err = json.Unmarshal(body, &yidongResp) if err != nil { return } if !yidongResp.Success { err = errors.New(" 根据填入的主讲人姓名 以嘉宾的身份自动报名 接口失败," + yidongResp.ErrorCode + yidongResp.ErrorMsg) return } } return } //func init() { // YiDongUpdateActivityStatus(2180) //} // 删除路演活动(新) func YiDongUpdateActivityStatus(activityId int) { var err error defer func() { if err != nil { fmt.Println(err) go alarm_msg.SendAlarmMsg(" 删除路演活动(新);err:"+err.Error(), 3) } }() activityInfo, err := cygx.GetAddActivityInfoById(activityId) if err != nil { fmt.Println(err) return } if activityInfo == nil { return } //C类分析师电话会 不对外发布 if activityInfo.ActivityTypeId == 7 { activityInfo.PublishStatus = 0 } //如果关联的易董活动ID为空,那么不做处理 if activityInfo.YidongActivityIdByCygx == "" { return } //如果状态是已发布,而且是易董办会那么就不做处理 if activityInfo.IsYidongConduct == 1 && activityInfo.PublishStatus == 1 { return } token, _ := GetYidongToken() if token == "" { return } url := utils.YiDongZhengTongYunUrl + "interact/activityThirdApi/updateActivityStatus" + "?access_token=" + token //if activityInfo.IsYidongConduct == 0 || activityInfo.YidongActivityIdByCygx == "" { // return //} params := YiDongUpdateActivityPublishResp{ Id: activityInfo.YidongActivityIdByCygx, } postData, err := json.Marshal(params) if err != nil { fmt.Println("PostData json.Marshal Err:" + err.Error()) utils.FileLogCygx.Info("PostData json.Marshal Err:" + err.Error()) return } method := "POST" client := &http.Client{} req, err := http.NewRequest(method, url, strings.NewReader(string(postData))) if err != nil { fmt.Println(err) return } req.Header.Add("Content-Type", "application/json") res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } itemApiLog := new(cygx.CygxThreeApiLog) itemApiLog.CreateTime = time.Now() itemApiLog.Source = 1 itemApiLog.Url = url itemApiLog.Body = string(postData) itemApiLog.Result = string(body) go cygx.AddCygxThreeApiLog(itemApiLog) var yidongResp *YiDongGetRoadshowDetailResp err = json.Unmarshal(body, &yidongResp) if err != nil { return } if !yidongResp.Success { err = errors.New("删除路演活动 接口失败," + yidongResp.ErrorCode + yidongResp.ErrorMsg) return } activityInfo.Body = strings.Replace(activityInfo.Body, "腾讯会议号:"+activityInfo.TencentConferenceNumber, "", -1) activityInfo.Body = strings.Replace(activityInfo.Body, "

", "", -1) activityInfo.YidongActivityIdByCygx = "" activityInfo.TencentConferenceNumber = "" err = cygx.UpdateCygxActivityTencentConferenceNumber(activityInfo) return } // GetLoginAuthCodeReq 获取登录编码请求体 type GetYiDongActivityByApiReq struct { MeetingStatus string `json:"meetingStatus" description:"会议状态必需(0未开始1进行中2已结束)多个逗号分隔"` ConveneStartStr string `json:"conveneStartStr" description:"活动日期范围开始"` ConveneEndStr string `json:"conveneEndStr" description:"活动日期范围结束"` LastUpdateTime string `json:"lastUpdateTime" description:"上次同步时间(用于筛选更新时间大于同步时间的活动数据)"` } // 根据条件获取易董建会列表信息 func GetYiDongActivityListByApi(param *GetYiDongActivityByApiReq) (yiDongResult []YidongActivityResult) { var err error defer func() { if err != nil { fmt.Println(err) go alarm_msg.SendAlarmMsg(fmt.Sprint("根据条件获取易董建会列表信息 GetYiDongActivityListByApi"+err.Error(), param), 2) } }() var token string token, _ = GetYidongToken() url := utils.YiDongZhengTongYunUrl + "interact/activityManageApi/getRoadshowList?access_token=" + token method := "POST" data, e := json.Marshal(param) if e != nil { err = errors.New("data json marshal err: " + e.Error()) return } payload := strings.NewReader(string(data)) client := &http.Client{} req, e := http.NewRequest(method, url, payload) if e != nil { err = errors.New(" http.NewRequest err: " + e.Error()) return } req.Header.Add("Content-Type", "application/json") res, e := client.Do(req) if e != nil { err = errors.New(" client.Do err: " + e.Error()) return } defer res.Body.Close() var ApifoxModal *YidongApifoxModal body, e := ioutil.ReadAll(res.Body) if e != nil { err = errors.New(" ioutil.ReadAll: " + e.Error()) return } //添加请求日志记录 itemApiLog := new(cygx.CygxThreeApiLog) itemApiLog.CreateTime = time.Now() itemApiLog.Source = 1 itemApiLog.Url = url itemApiLog.Body = utils.ReplaceSpaceAndWrap(fmt.Sprint(payload)) itemApiLog.Result = string(body) go cygx.AddCygxThreeApiLog(itemApiLog) err = json.Unmarshal(body, &ApifoxModal) if err != nil { fmt.Println("Getres.PublicGetDate Err:", err.Error()) return } if len(ApifoxModal.Result) > 0 { yiDongResult = ApifoxModal.Result } else { yiDongResult = make([]YidongActivityResult, 0) } return } type GetYiDongActivityMeetByActivityIdReq struct { ActivityId string `json:"activityId" description:"活动ID"` } type YidongApifoxModaluser struct { ErrorCode interface{} `json:"errorCode"` ErrorMsg interface{} `json:"errorMsg"` Result []YidongResultuser `json:"result"` Success bool `json:"success"` Timestamp int64 `json:"timestamp"` } // 根据条件获取易董活动ID获取到会信息 func GetYiDongActivityMeetDataByaAtivityId(ativityId string) (yiDongResult []YidongResultuser) { var err error defer func() { if err != nil { fmt.Println(err) go alarm_msg.SendAlarmMsg(fmt.Sprint("根据条件获取易董建会列表信息 GetYiDongActivityListByApi"+err.Error(), ativityId), 2) } }() var token string token, _ = GetYidongToken() url := utils.YiDongZhengTongYunUrl + "interact/activityManageApi/getAttendPersonList?access_token=" + token method := "POST" param := new(GetYiDongActivityMeetByActivityIdReq) param.ActivityId = ativityId data, e := json.Marshal(param) if e != nil { err = errors.New("data json marshal err: " + e.Error()) return } payload := strings.NewReader(string(data)) client := &http.Client{} req, e := http.NewRequest(method, url, payload) if e != nil { err = errors.New(" http.NewRequest err: " + e.Error()) return } req.Header.Add("Content-Type", "application/json") res, e := client.Do(req) if e != nil { err = errors.New(" client.Do err: " + e.Error()) return } defer res.Body.Close() var ApifoxModal *YidongApifoxModaluser body, e := ioutil.ReadAll(res.Body) if e != nil { err = errors.New(" ioutil.ReadAll err: " + e.Error()) return } e = json.Unmarshal(body, &ApifoxModal) if e != nil { err = errors.New(" json.Unmarshal err: " + e.Error()) return } //添加请求日志记录 itemApiLog := new(cygx.CygxThreeApiLog) itemApiLog.CreateTime = time.Now() itemApiLog.Source = 1 itemApiLog.Url = url itemApiLog.Body = utils.ReplaceSpaceAndWrap(fmt.Sprint(payload)) itemApiLog.Result = string(body) go cygx.AddCygxThreeApiLog(itemApiLog) err = json.Unmarshal(body, &ApifoxModal) if err != nil { fmt.Println("Getres.PublicGetDate Err:", err.Error()) return } if len(ApifoxModal.Result) > 0 { yiDongResult = ApifoxModal.Result } else { yiDongResult = make([]YidongResultuser, 0) } return } // 根据条件获取易董活动ID获取到会信息 func GetYiDongActivityMeeting(yidongActivityId string, cygxActivityId int) (yiDongResult []YidongResultuser) { var err error defer func() { if err != nil { fmt.Println(err) go alarm_msg.SendAlarmMsg(fmt.Sprint("根据条件获取易董建会列表信息 GetYiDongActivityMeeting"+err.Error(), cygxActivityId), 2) } }() //跟易董返回的用户状态修改活动以提交到会状态 e := cygx.UpdateCygxActivitySubmitMeetingByYidong(yidongActivityId) if e != nil { err = errors.New("UpdateCygxActivitySubmitMeetingByYidong err: " + e.Error()) return } meetDataList := GetYiDongActivityMeetDataByaAtivityId(yidongActivityId) var mobiles []string var mobileStr string var mobileStrMeet string mapActivityAttendanceDetail := make(map[string]*cygx.CygxActivityAttendanceDetail) if len(meetDataList) > 0 { var itemsUpdate []*cygx.CygxActivitySignupDetail needAddAttendanc := make([]*cygx.CygxActivityAttendanceDetail, 0) for _, vresult := range meetDataList { if vresult.PersonTelephone == "" { continue } if vresult.Duration != "" || vresult.DurationReview != "" { mobiles = append(mobiles, vresult.PersonTelephone) var itemDetail = new(cygx.CygxActivitySignupDetail) if vresult.Duration != "" { itemDetail.FirstMeetingTime = vresult.StartTime itemDetail.LastMeetingTime = vresult.EndTime itemDetail.Duration = vresult.Duration itemDetail.MeetingStatusStr = "直播" } else if vresult.DurationReview != "" { itemDetail.FirstMeetingTime = vresult.StartTimeReview itemDetail.LastMeetingTime = vresult.EndTimeReview itemDetail.Duration = vresult.DurationReview itemDetail.MeetingStatusStr = "回放" } itemDetail.Position = vresult.JobName itemDetail.RealName = vresult.PersonName itemDetail.Mobile = vresult.PersonTelephone itemDetail.OutboundMobile = vresult.PersonTelephone itemDetail.IsMeeting = 1 itemDetail.ActivityId = cygxActivityId mapActivityAttendanceDetail[vresult.PersonTelephone] = new(cygx.CygxActivityAttendanceDetail) mapActivityAttendanceDetail[vresult.PersonTelephone].FirstMeetingTime = vresult.StartTime mapActivityAttendanceDetail[vresult.PersonTelephone].LastMeetingTime = vresult.EndTime mapActivityAttendanceDetail[vresult.PersonTelephone].Duration = utils.GetAttendanceDetailSecondsByYiDong(vresult.Duration) itemsUpdate = append(itemsUpdate, itemDetail) } item := new(cygx.CygxActivityAttendanceDetail) item.ActivityId = cygxActivityId item.Mobile = vresult.PersonTelephone if vresult.Duration != "" { if vresult.Duration != "" { item.FirstMeetingTime = vresult.StartTime item.LastMeetingTime = vresult.EndTime item.Duration = vresult.Duration item.MeetingStatusStr = "直播" } else if vresult.DurationReview != "" { item.FirstMeetingTime = vresult.StartTimeReview item.LastMeetingTime = vresult.EndTimeReview item.Duration = vresult.DurationReview item.MeetingStatusStr = "回放" } item.Position = vresult.JobName item.RealName = vresult.PersonName item.FirstMeetingTime = vresult.StartTime item.LastMeetingTime = vresult.EndTime item.Duration = vresult.Duration item.IsMeetingStr = 1 mobileStrMeet += "'" + vresult.PersonTelephone + "'" + "," item.CreateTime = time.Now() needAddAttendanc = append(needAddAttendanc, item) } mobileStr += "'" + vresult.PersonTelephone + "'" + "," } lenmobiles := len(mobiles) if lenmobiles > 0 { var parsYd []interface{} var conditionYd string conditionYd = ` AND mobile IN (` + utils.GetOrmInReplace(lenmobiles) + `) AND activity_id=? ` parsYd = append(parsYd, mobiles, cygxActivityId) e = cygx.UpdateCygxActivitySignupisMeetList(conditionYd, parsYd) if e != nil { err = errors.New("UpdateCygxActivitySignupisMeetList err: " + e.Error()) return } e = cygx.UpdateActivitySignupDetailMultiByYiDong(itemsUpdate) if e != nil { err = errors.New("UpdateActivitySignupDetailMultiByYiDong err: " + e.Error()) return } } mobileStr = strings.TrimRight(mobileStr, ",") if mobileStr == "" { mobileStr = "1" } mobileStrMeet = strings.TrimRight(mobileStrMeet, ",") if mobileStrMeet == "" { mobileStrMeet = "1" } listUser, e := cygx.GetWxUserOutboundMobile(mobileStr) if e != nil { err = errors.New("GetWxUserOutboundMobile err: " + e.Error()) return } for kAdd, vAdd := range needAddAttendanc { for _, v2 := range listUser { if v2.OutboundMobile == vAdd.Mobile || v2.Mobile == vAdd.Mobile { if needAddAttendanc[kAdd].CompanyId <= 1 { needAddAttendanc[kAdd].CompanyId = v2.CompanyId needAddAttendanc[kAdd].SellerName = v2.SellerName needAddAttendanc[kAdd].CompanyName = v2.CompanyName //needAddAttendanc[k].IsMeetingStr = 1 } } } } //参会记录 e = cygx.AddAttendancDetail(needAddAttendanc, cygxActivityId, mobileStrMeet) if e != nil { err = errors.New("AddAttendancDetail err: " + e.Error()) return } ////处理是否限制报名 e = AddCygxActivityRestrictSignupByAdmin(cygxActivityId) if e != nil { err = errors.New("AddCygxActivityRestrictSignupByAdmin err: " + e.Error()) return } AddctivitySignupDetailListByHand(needAddAttendanc, cygxActivityId) } return }