package cygx import ( "errors" "fmt" "github.com/PuerkitoBio/goquery" "hongze/hz_crm_api/models" "hongze/hz_crm_api/models/company" "hongze/hz_crm_api/models/cygx" "hongze/hz_crm_api/services" "hongze/hz_crm_api/services/alarm_msg" "hongze/hz_crm_api/utils" "html" "strconv" "strings" ) func ArticlePublishDate(publishDate string) (newPublishDate string) { newPublishDate = strings.Replace(publishDate, "00:00:00", "", -1) newPublishDate = strings.Replace(newPublishDate, " ", "", -1) return } func GetReportContentTextSubNew(content string) (contentSub string, err error) { content = html.UnescapeString(content) doc, errdoc := goquery.NewDocumentFromReader(strings.NewReader(content)) if errdoc != nil { err = errdoc return } docText := doc.Text() bodyRune := []rune(docText) bodyRuneLen := len(bodyRune) body := string(bodyRune[:bodyRuneLen]) contentSub = body contentSub = strings.Replace(contentSub, "Powered by Froala Editor", "", -1) contentSub = strings.Replace(contentSub, " ", "", -1) contentSub = strings.Replace(contentSub, "

Froala Editor

", "", -1) return } func ArticleComPanyLabelToStr(companyLabel []string) (label string) { for _, v := range companyLabel { label += v + "{|}" } label = strings.TrimRight(label, "{|}") return } // GetArticleStockMap 获取个股标签所对应的文章ID func GetArticleStockMap() (mapResp map[string]int, err error) { defer func() { if err != nil { go alarm_msg.SendAlarmMsg("获取个股标签所对应的文章ID失败"+err.Error(), 2) } }() list, err := cygx.GetArticleStock() if err != nil && err.Error() != utils.ErrNoRow() { return } mapResp = make(map[string]int, 0) if len(list) > 0 { //一对一精准匹配 for _, v := range list { sliceSubjects := strings.Split(v.Stock, "/") if len(sliceSubjects) > 0 { for _, vSubject := range sliceSubjects { sliceKuohao := strings.Split(vSubject, "(") //过滤括号 sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线 subject := sliceXiahuaxian[0] mapResp[subject] = v.ArticleId } } } } return } // 处理文章来源类型 func GetArticleSourcePlatform(SourcePlatform string) (sourcePlatformResp int) { //SourcePlatform string `description:"来源 'MOBILE:移动端小程序','PC:PC端小程序','CELUE:上海策略平台','WEB:查研观向网页版'"` if SourcePlatform == "MOBILE" || SourcePlatform == "PC" { sourcePlatformResp = 1 } else if SourcePlatform == "WEB" { sourcePlatformResp = 2 } else if SourcePlatform == "CELUE" { sourcePlatformResp = 3 } else if SourcePlatform == "1" { sourcePlatformResp = 1 } else if SourcePlatform == "2" { sourcePlatformResp = 2 } else { sourcePlatformResp, _ = strconv.Atoi(SourcePlatform) } return } // 处理文章来源类型 func GetArticleSourcePlatformText(sourcePlatformResp int) (sourcePlatformText string) { switch sourcePlatformResp { case 1: sourcePlatformText = "查研小程序" case 2: sourcePlatformText = "查研网页版" case 3: sourcePlatformText = "策略平台" case 5: sourcePlatformText = "研选小程序" case 6: sourcePlatformText = "研选网页版" default: sourcePlatformText = "查研小程序" } return } //func init() { // GetArticleSubjectLabelByArticleId([]int{9551, 9082}) //} // 根据文章ID获取文章关联的产业名称 func GetArticleIndustrialLabelByArticleId(articleIds []int) (respMap map[int][]string) { if len(articleIds) == 0 { return } var err error defer func() { if err != nil { go alarm_msg.SendAlarmMsg(fmt.Sprint("根据文章ID获取文章关联的产业名称失败 GetArticleIndustrialLabelByArticleId rticleIds: ", articleIds, err.Error()), 2) } }() list, e := cygx.GetIndustrialArticleGroupListByarticleIdsArr(articleIds) if e != nil && e.Error() != utils.ErrNoRow() { err = errors.New("GetIndustrialArticleGroupListByarticleIdsArr, Err: " + e.Error()) return } respMap = make(map[int][]string, 0) for _, v := range list { respMap[v.ArticleId] = append(respMap[v.ArticleId], v.IndustryName) } return } // 根据文章ID获取文章关联的标的名称 func GetArticleSubjectLabelByArticleId(articleIds []int) (respMap map[int][]string) { if len(articleIds) == 0 { return } var err error defer func() { if err != nil { go alarm_msg.SendAlarmMsg(fmt.Sprint("根据文章ID获取文章关联的产业名称 失败 GetArticleSubjectLabelByArticleId rticleIds: ", articleIds, err.Error()), 2) } }() list, e := cygx.GetSubjectArticleGroupListByarticleIdsArr(articleIds) if e != nil && e.Error() != utils.ErrNoRow() { err = errors.New("GetIndustrialArticleGroupListByarticleIdsArr, Err: " + e.Error()) return } respMap = make(map[int][]string, 0) for _, v := range list { respMap[v.ArticleId] = append(respMap[v.ArticleId], v.SubjectName) } return } // 根据作者ID获取关联的文章下面的产业名称 func GetArticleIndustrialLabelByDepartmentId(departmentIds []int) (respMap map[int][]string) { lenArr := len(departmentIds) if lenArr == 0 { return } var err error defer func() { if err != nil { go alarm_msg.SendAlarmMsg(fmt.Sprint("根据文章ID获取文章关联的产业名称失败 GetArticleIndustrialLabelByDepartmentId departmentIds: ", departmentIds, err.Error()), 2) } }() var condition string var pars []interface{} condition = " AND department_id IN(" + utils.GetOrmInReplace(lenArr) + ") ORDER BY publish_date DESC " pars = append(pars, departmentIds) //获取作者关联的文章 listArticle, e := cygx.GetArticlList(condition, pars, 0, 9999) if e != nil && e.Error() != utils.ErrNoRow() { err = errors.New("GetArticlList, Err: " + e.Error()) return } var articleIds []int for _, v := range listArticle { articleIds = append(articleIds, v.ArticleId) } //获取文章关联的产业 list, e := cygx.GetIndustrialArticleGroupListByarticleIdsArr(articleIds) if e != nil && e.Error() != utils.ErrNoRow() { err = errors.New("GetIndustrialArticleGroupListByarticleIdsArr, Err: " + e.Error()) return } respMap = make(map[int][]string, 0) artMap := make(map[int][]string) for _, v := range list { artMap[v.ArticleId] = append(respMap[v.ArticleId], v.IndustryName) } //建立作者与文章、产业的关系 for _, v := range listArticle { if len(artMap[v.ArticleId]) == 0 { continue } respMap[v.DepartmentId] = append(respMap[v.DepartmentId], strings.Join(artMap[v.ArticleId], "/")) } return } // 处理文章、研选专栏的查询信息回显 func HandleArticleAndYanxuanRecordList(items []*cygx.CygxArticleAndYanxuanRecordResp) (itemsResp []*cygx.UserInteraction, err error) { itemsResp = make([]*cygx.UserInteraction, 0) if len(items) > 0 { var articleIds []int // 文章ID var yanxuanSpecialIds []int // 研选专栏ID var sellerCompanyIds []int // 公司ID var mobiles []string // 手机号 for _, v := range items { if v.Source == utils.CYGX_OBJ_ARTICLE { articleIds = append(articleIds, v.SourceId) } if v.Source == utils.CYGX_OBJ_YANXUANSPECIAL { yanxuanSpecialIds = append(yanxuanSpecialIds, v.SourceId) } sellerCompanyIds = append(sellerCompanyIds, v.CompanyId) mobiles = append(mobiles, v.Mobile) } sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds) mapIndustrialLabel := GetArticleIndustrialLabelByArticleId(articleIds) // 关联产业 mapSubjectLabel := GetArticleSubjectLabelByArticleId(articleIds) // 关联标的 //根据手机号获取这些用户的信息 listUser, e := models.GetWxUserByOutboundMobiles(mobiles) if e != nil { err = errors.New("GetWxUserOutboundMobiles, Err: " + e.Error()) return } mapUserRealname := make(map[string]string) for _, v := range listUser { mapUserRealname[v.Mobile] = v.RealName } var condition string var pars []interface{} //获取文章map mapArticle := make(map[int]*cygx.CygxReportArticle) lenarticleIds := len(articleIds) if lenarticleIds > 0 { condition = " AND art.article_id IN (" + utils.GetOrmInReplace(lenarticleIds) + ") GROUP BY art.article_id " pars = append(pars, articleIds) list, e := cygx.GetReportArticleList(condition, pars, 0, lenarticleIds, 1) if e != nil && e.Error() != utils.ErrNoRow() { err = e return } if len(list) > 0 { for _, v := range list { mapArticle[v.ArticleId] = v } } } //获取研选专栏map mapYanxuanSpecial := make(map[int]*cygx.CygxYanxuanSpeciaResplItem) lenyanxuanSpecialIds := len(yanxuanSpecialIds) if lenyanxuanSpecialIds > 0 { pars = make([]interface{}, 0) condition = " AND a.id IN (" + utils.GetOrmInReplace(lenyanxuanSpecialIds) + ")" pars = append(pars, yanxuanSpecialIds) list, e := cygx.GetYanxuanSpecialListByCondition(condition, pars, 0, lenyanxuanSpecialIds) if e != nil && e.Error() != utils.ErrNoRow() { err = e return } if len(list) > 0 { for _, v := range list { mapYanxuanSpecial[v.Id] = v } } } for _, v := range items { item := new(cygx.UserInteraction) if v.Source == utils.CYGX_OBJ_ARTICLE { item.IndustryName = strings.Join(mapIndustrialLabel[v.SourceId], ",") item.SubjectNameStr = strings.Join(mapSubjectLabel[v.SourceId], ",") if v.SourceId >= utils.SummaryArticleId { item.ArticleType = 1 } else { item.ArticleType = 2 } //如果对应的map不为空,就赋值 if mapArticle[v.SourceId] != nil { item.Title = mapArticle[v.SourceId].Title item.PublishDate = mapArticle[v.SourceId].PublishDate item.PermissionName = mapArticle[v.SourceId].PermissionName item.ArticleIdMd5 = mapArticle[v.SourceId].ArticleIdMd5 item.ReportId = mapArticle[v.SourceId].ReportId } } if v.Source == utils.CYGX_OBJ_YANXUANSPECIAL { item.PermissionName = utils.CHART_PERMISSION_NAME_MF_YANXUAN //如果对应的map不为空,就赋值 if mapYanxuanSpecial[v.SourceId] != nil { item.Title = mapYanxuanSpecial[v.SourceId].Title item.PublishDate = mapYanxuanSpecial[v.SourceId].PublishTime item.SpecialType = mapYanxuanSpecial[v.SourceId].Type } } item.ArticleId = v.SourceId item.CreateTime = v.CreateTime item.UserId = v.UserId item.RealName = v.RealName if item.RealName == "" { item.RealName = mapUserRealname[v.Mobile] } item.Mobile = v.Mobile item.CompanyId = v.CompanyId item.CompanyName = v.CompanyName item.SellerName = sellNameMap[v.CompanyId] item.RegisterPlatform = v.RegisterPlatform item.RegisterPlatformText = GetArticleSourcePlatformText(v.RegisterPlatform) item.StopTime = strconv.Itoa(v.StopTime) itemsResp = append(itemsResp, item) } } return } // //func init() { // SendWxMsgWithroadshowEssence(1000546) //} // 路演精华的文章做模板消息推送 func SendWxMsgWithroadshowEssence(articleId int) (err error) { defer func() { if err != nil { fmt.Println(err) go alarm_msg.SendAlarmMsg("路演精华的文章做模板消息推送送,发送模版消息失败,Err:"+err.Error(), 3) utils.FileLog.Info(fmt.Sprintf("路演精华的文章做模板消息推送失败,Err:%s,%s", err.Error())) } }() detail, e := cygx.GetArticleRoadshowEssenceDetail(articleId) if e != nil { err = errors.New("获取详情失败" + e.Error()) return } if detail == nil { err = errors.New("获取详情失败") return } //fmt.Println(detail) permissionStr, e := company.GetPermissionIdById(strconv.Itoa(detail.ChartPermissionId)) if e != nil { err = errors.New("获取主客观权限失败" + e.Error()) return } // 获取所有有权的用户的 openid openidPowerList, e := cygx.GetCygxUserRecordPower(permissionStr) if e != nil { err = errors.New("获取所有有权的用户的 openid失败" + e.Error()) return } //获取关注对应产业的用户信息 industryFllowList, e := cygx.GetCygxUserFllowOpenid(articleId) if e != nil { err = errors.New("获取关注对应产业的用户信息失败 " + e.Error()) return } mapOpenidFllow := make(map[int]string) for _, v := range industryFllowList { mapOpenidFllow[v.UserId] = v.OpenId } //获取拒绝接收推送的的用户的 openid mapOpenidRefuset := make(map[int]string) openidRefusetList, e := cygx.GetCygxUserRefusetOpenid() if e != nil && e.Error() != utils.ErrNoRow() { err = errors.New("获取拒绝接收推送的的用户的 openid 失败" + e.Error()) return } for _, v := range openidRefusetList { mapOpenidRefuset[v.UserId] = v.OpenId } //获取提交过推送规则的用户的 openid mapUserIdChooseSend := make(map[int]int) chooseSendtList, err := cygx.GetCygxXzsChooseSend("") if err != nil && err.Error() != utils.ErrNoRow() { return err } for _, v := range chooseSendtList { mapUserIdChooseSend[v.UserId] = v.UserId } openIdArr := make([]string, len(openidPowerList)) for i, v := range openidPowerList { if _, ok := mapOpenidRefuset[v.UserId]; ok { continue //如果用户选择了拒绝推送消息,那么就不做模板消息推送 } if _, ok := mapUserIdChooseSend[v.UserId]; ok { if _, ok := mapOpenidFllow[v.UserId]; !ok { continue //如果用户提交过关注信息,而且这个产业他没有关注,那么不做推送 } } openIdArr[i] = v.OpenId } fmt.Println(openIdArr) first := "【路演精华】已发布,欢迎查看" keyword1 := detail.Title keyword2 := "已发布" keyword3 := detail.PublishDate keyword4 := detail.Abstract remark := "点击查看详情" redirectUrl := utils.WX_MSG_PATH_ROAD_ESSENCE + strconv.Itoa(detail.ArticleId) + "&IsSendWx=1" sendInfo := new(services.SendWxTemplate) sendInfo.First = first sendInfo.Keyword1 = keyword1 sendInfo.Keyword2 = keyword2 sendInfo.Keyword3 = keyword3 sendInfo.Keyword4 = keyword4 sendInfo.Remark = remark sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs sendInfo.RedirectUrl = redirectUrl sendInfo.RedirectTarget = 3 sendInfo.Resource = strconv.Itoa(detail.ArticleId) sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ROADSHOW_VIDEO sendInfo.OpenIdArr = openIdArr e = services.SendTemplateMsg(sendInfo) if e != nil { err = errors.New("推送模板消息失败" + e.Error()) return } return }