Explorar o código

Merge branch 'master' of http://8.136.199.33:3000/hongze/hongze_cygx into cygx_6.6

xingzai %!s(int64=2) %!d(string=hai) anos
pai
achega
515da72acc

+ 147 - 24
controllers/article.go

@@ -33,6 +33,10 @@ type ArticleCommonController struct {
 	BaseCommonController
 }
 
+type ArticleControllerMobile struct {
+	BaseAuthMobileController
+}
+
 // @Title 获取报告详情
 // @Description 获取报告详情接口
 // @Param   ArticleId   query   int  true       "报告ID"
@@ -536,12 +540,20 @@ func (this *ArticleController) InterviewApply() {
 // @Param   ArticleIdMd5   query   int  true       "报告ID"
 // @Success 200 {object} models.ArticleDetailResp
 // @router /look/detail [get]
-func (this *ArticleCommonController) Detail() {
+func (this *ArticleControllerMobile) DetailMd5() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	uid := user.UserId
 
 	articleIdMd5 := this.GetString("ArticleIdMd5")
 	if articleIdMd5 == "" {
@@ -556,32 +568,143 @@ func (this *ArticleCommonController) Detail() {
 		br.ErrMsg = "获取信息失败,Err:" + err.Error()
 		return
 	}
+	articleId := detail.ArticleId
 	detail.Body = html.UnescapeString(detail.Body)
-	//detail.Abstract = html.UnescapeString(detail.Abstract)
-	sellerList, err := models.GetSellerList(detail.ArticleId)
-	if err != nil {
-		br.Msg = "获取信息失败"
-		br.ErrMsg = "获取销售数据失败,Err:" + err.Error() + ";articleId" + strconv.Itoa(detail.ArticleId)
-		return
+
+	hasPermission := 2
+	//`description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,4:潜在客户,未提交过申请,5:潜在客户,已提交过申请"`
+	if user.CompanyId > 1 {
+		companyPermission, err := models.GetCompanyPermission(user.CompanyId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取公司权限失败,Err:" + err.Error()
+			return
+		}
+		detail.Body = html.UnescapeString(detail.Body)
+		detail.Body = strings.Replace(detail.Body, "<p data-f-id=\"pbf\" style=\"text-align: center; font-size: 14px; margin-top: 30px; opacity: 0.65; font-family: sans-serif;\">Powered by <a href=\"https://www.froala.com/wysiwyg-editor?pb=1\" title=\"Froala Editor\">Froala Editor</a></p>", "", -1)
+		detail.Body = strings.Replace(detail.Body, "pre", "div", -1)
+		detail.Abstract, _ = services.GetReportContentTextSubNew(detail.Abstract)
+		if companyPermission == "" {
+			hasPermission = 2
+		} else {
+			var articlePermissionPermissionName string
+			if detail.CategoryId > 0 {
+				articlePermission, err := models.GetArticlePermission(detail.CategoryId)
+				if err != nil {
+					br.Msg = "获取信息失败"
+					br.ErrMsg = "获取报告权限失败,Err:" + err.Error() + articleIdMd5
+					return
+				}
+				if articlePermission == nil {
+					br.Msg = "获取信息失败"
+					br.ErrMsg = "报告权限不存在,Err:" + articleIdMd5
+					return
+				}
+				articlePermissionPermissionName = articlePermission.PermissionName
+			} else {
+				articlePermissionPermissionName = detail.CategoryName
+			}
+			var hasPersion bool
+			slice := strings.Split(articlePermissionPermissionName, ",")
+			for _, v := range slice {
+				if strings.Contains(companyPermission, v) {
+					hasPersion = true
+				}
+			}
+			userType, _, err := services.GetUserType(user.CompanyId)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取用户信息失败,Err:" + err.Error()
+				return
+			}
+			if userType == 1 && strings.Contains(detail.CategoryName, "研选") {
+				hasPersion = false
+			}
+			if detail.IsReport == 1 {
+				detailCategory, err := models.GetdetailByCategoryIdSando(detail.CategoryId)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					br.Msg = "获取信息失败"
+					br.ErrMsg = "获取信息失败,Err:" + err.Error() + "categoryID 不存在:" + strconv.Itoa(detail.CategoryId)
+					return
+				}
+				permissionStr, err := models.GetCompanyPermissionByUser(user.CompanyId)
+				if err != nil {
+					br.Msg = "获取信息失败"
+					br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+					return
+				}
+				if detailCategory != nil {
+					if detailCategory.PermissionType == 1 {
+						if !strings.Contains(permissionStr, detailCategory.ChartPermissionName+"(主观)") {
+							hasPersion = false
+						}
+					} else if detailCategory.PermissionType == 2 {
+						if !strings.Contains(permissionStr, detailCategory.ChartPermissionName+"(客观)") {
+							hasPersion = false
+						}
+					}
+				}
+			}
+			if hasPersion {
+				hasPermission = 1
+				record := new(models.CygxArticleHistoryRecordNewpv)
+				record.UserId = uid
+				record.ArticleId = articleId
+				record.CreateTime = time.Now()
+				record.ModifyTime = time.Now()
+				record.Mobile = user.Mobile
+				record.Email = user.Email
+				record.CompanyId = user.CompanyId
+				record.CompanyName = user.CompanyName
+				//新增浏览记录
+				go models.AddCygxArticleViewRecordNewpv(record)
+
+				//30分钟之内阅读同一篇文章不错二次推送
+				key := "CYGX_ARTICLE_READ" + strconv.Itoa(articleId) + "_" + strconv.Itoa(uid)
+				if !utils.Rc.IsExist(key) {
+					go services.ArticleUserRemind(user, detail, 1)
+					utils.Rc.Put(key, 1, 30*time.Second)
+				}
+			}
+			if hasPermission == 1 {
+				key := "CYGX_ARTICLE_" + strconv.Itoa(articleId) + "_" + strconv.Itoa(uid)
+				if !utils.Rc.IsExist(key) {
+					//新增浏览记录
+					record := new(models.CygxArticleViewRecord)
+					record.UserId = uid
+					record.ArticleId = articleId
+					record.CreateTime = time.Now()
+					record.Mobile = user.Mobile
+					record.Email = user.Email
+					record.CompanyId = user.CompanyId
+					record.CompanyName = user.CompanyName
+					go models.AddCygxArticleViewRecord(record)
+					utils.Rc.Put(key, 1, 5*time.Second)
+					models.ModifyReportLastViewTime(uid)
+				}
+			}
+		}
+		//作者头像
+		if detail.DepartmentId > 0 {
+			departmentDetail, err := models.GetArticleDepartmentDateilById(detail.DepartmentId)
+			if err == nil {
+				detail.DepartmentImgUrl = departmentDetail.ImgUrl
+				detail.NickName = departmentDetail.NickName
+			}
+		}
 	}
-	//if detail.ArticleId > 1000000 {
-	//	var hrefRegexp = regexp.MustCompile("[0-9]\\d*")
-	//	match := hrefRegexp.FindAllString(detail.SellerAndMobile, -1)
-	//	if match != nil {
-	//		for _, v := range match {
-	//			sellerAndMobile := &models.SellerRep{
-	//				SellerMobile: v,
-	//				SellerName:   strings.Replace(detail.SellerAndMobile, v, "", -1),
-	//			}
-	//			sellerList = append(sellerList, sellerAndMobile)
-	//		}
-	//	}
-	//}
 	detail.SellerAndMobile = "" //业务需要强制处理为空
-	resp.HasPermission = 1
-	detail.Abstract, _ = services.GetReportContentTextSub(detail.Abstract)
-	detail.SellerList = sellerList
-	resp.Detail = detail
+	resp.HasPermission = hasPermission
+	if hasPermission == 1 {
+		detail.Abstract, _ = services.GetReportContentTextSub(detail.Abstract)
+		resp.Detail = detail
+	} else {
+		if user.Mobile != "" {
+			resp.Mobile = user.Mobile
+		} else {
+			resp.Mobile = user.Email
+		}
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"

+ 137 - 0
controllers/base_auth_mobile.go

@@ -0,0 +1,137 @@
+package controllers
+
+import (
+	"encoding/json"
+	"fmt"
+	beego "github.com/beego/beego/v2/adapter"
+	"hongze/hongze_cygx/services"
+	"net/http"
+	"net/url"
+	"strconv"
+
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+
+	"github.com/rdlucklib/rdluck_tools/log"
+)
+
+func init() {
+	if utils.RunMode == "release" {
+		logDir := `/data/rdlucklog/hongze_cygx`
+		apiLog = log.Init("20060102.api", logDir)
+	} else {
+		apiLog = log.Init("20060102.api")
+	}
+}
+
+type BaseAuthMobileController struct {
+	beego.Controller
+	User  *models.WxUserItem
+	Token string
+}
+
+func (this *BaseAuthMobileController) Prepare() {
+	fmt.Println("enter prepare")
+	method := this.Ctx.Input.Method()
+	uri := this.Ctx.Input.URI()
+	fmt.Println("Url:", uri)
+	if method != "HEAD" {
+		if method == "POST" || method == "GET" {
+			authorization := this.Ctx.Input.Header("Authorization")
+			if authorization == "" {
+				authorization = this.GetString("Authorization")
+			}
+			this.Token = authorization
+			if authorization == "" {
+				this.JSON(models.BaseResponse{Ret: 408, Msg: "请重新授权!", ErrMsg: "请重新授权:Token is empty or account is empty"}, false, false)
+				this.StopRun()
+				return
+			}
+			session, err := models.GetCygxSessionMobile(authorization)
+			if err != nil {
+				if err.Error() == utils.ErrNoRow() {
+					this.JSON(models.BaseResponse{Ret: 408, Msg: "信息已变更,请重新登陆!", ErrMsg: "Token 信息已变更:Token: " + authorization}, false, false)
+					this.StopRun()
+					return
+				}
+				this.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "获取用户信息异常,Eerr:" + err.Error()}, false, false)
+				this.StopRun()
+				return
+			}
+			if session == nil {
+				this.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "sesson is empty "}, false, false)
+				this.StopRun()
+				return
+			}
+			//wxUser, err := models.GetWxUserItemByUserId(session.UserId)
+			wxUser, err := models.GetWxUserAouthByMobile(session.Mobile)
+			if err != nil && err != services.ERR_USER_NOT_BIND {
+				if err.Error() == utils.ErrNoRow() {
+					this.JSON(models.BaseResponse{Ret: 408, Msg: "信息已变更,请重新登陆!", ErrMsg: "获取信息失败 " + strconv.Itoa(session.UserId)}, false, false)
+					this.StopRun()
+					return
+				}
+				this.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "获取wx_user信息异常,Eerr:" + err.Error()}, false, false)
+				this.StopRun()
+				return
+			}
+			if wxUser == nil {
+				this.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "admin is empty "}, false, false)
+				this.StopRun()
+				return
+			}
+			this.User = wxUser
+		} else {
+			this.JSON(models.BaseResponse{Ret: 408, Msg: "请求异常,请联系客服!", ErrMsg: "POST之外的请求,暂不支持"}, false, false)
+			this.StopRun()
+			return
+		}
+	}
+}
+
+func (c *BaseAuthMobileController) ServeJSON(encoding ...bool) {
+	var (
+		hasIndent   = false
+		hasEncoding = false
+	)
+	if beego.BConfig.RunMode == beego.PROD {
+		hasIndent = false
+	}
+	if len(encoding) > 0 && encoding[0] == true {
+		hasEncoding = true
+	}
+	if c.Data["json"] == nil {
+		go utils.SendEmail(utils.APPNAME+" "+utils.RunMode+"异常提醒:", "接口:"+"URI:"+c.Ctx.Input.URI()+";无返回值", utils.EmailSendToUsers)
+		return
+	}
+	baseRes := c.Data["json"].(*models.BaseResponse)
+	if baseRes != nil && baseRes.Ret != 200 && baseRes.Ret != 408 && baseRes.IsSendEmail {
+		body, _ := json.Marshal(baseRes)
+		msgBody := "URI:" + c.Ctx.Input.URI() + "<br/> ErrMsg:" + baseRes.ErrMsg + ";<br/>Msg:" + baseRes.Msg + ";<br/> Body:" + string(body) + ";<br/>" + c.Token
+		go utils.SendEmail(utils.APPNAME+" "+utils.RunMode+" 失败提醒", msgBody, utils.EmailSendToUsers)
+	}
+
+	c.JSON(c.Data["json"], hasIndent, hasEncoding)
+}
+
+func (c *BaseAuthMobileController) JSON(data interface{}, hasIndent bool, coding bool) error {
+	c.Ctx.Output.Header("Content-Type", "application/json; charset=utf-8")
+	var content []byte
+	var err error
+	if hasIndent {
+		content, err = json.MarshalIndent(data, "", "  ")
+	} else {
+		content, err = json.Marshal(data)
+	}
+	if err != nil {
+		http.Error(c.Ctx.Output.Context.ResponseWriter, err.Error(), http.StatusInternalServerError)
+		return err
+	}
+	ip := c.Ctx.Input.IP()
+	requestBody, _ := url.QueryUnescape(string(c.Ctx.Input.RequestBody))
+	apiLog.Println("请求地址:", c.Ctx.Input.URI(), "Authorization:", c.Ctx.Input.Header("Authorization"), "RequestBody:", requestBody, "ResponseBody", string(content), "IP:", ip)
+	if coding {
+		content = []byte(utils.StringsToJSON(string(content)))
+	}
+	return c.Ctx.Output.Body(content)
+}

+ 1 - 1
controllers/chart.go

@@ -205,7 +205,7 @@ func (this *ChartController) Detail() {
 			return
 		}
 		detail.IsCollection = GetIsCollectionChart
-		detail.HttpUrl += "?token=" + chartUserTokenByMobile
+		detail.HttpUrl = utils.CHART_INFO_HTTP_URL + strconv.Itoa(chartId) + "?token=" + chartUserTokenByMobile
 		//if !detail.IsCollection {
 		//	err = models.RemoveChartCollect(user.UserId, chartId)
 		//}

+ 1 - 1
controllers/home.go

@@ -464,7 +464,7 @@ func (this *HomeController) ListHomeArtAndChart() {
 			page = paging.GetPaging(currentIndex, pageSize, total)
 			if categoryId != "" {
 				condition += ` AND category_id IN(` + categoryId + `)`
-				condition += ` OR ( category_name  LIKE '%` + utils.CHART_PERMISSION_NAME_YANXUAN + `%' AND publish_status = 1 AND is_summary = 1 )`
+				//condition += ` OR ( category_name  LIKE '%` + utils.CHART_PERMISSION_NAME_YANXUAN + `%' AND publish_status = 1 AND is_summary = 1 )`
 			} else {
 				condition += ` AND  category_name   LIKE '%` + utils.CHART_PERMISSION_NAME_YANXUAN + `%'`
 			}

+ 1 - 1
controllers/report.go

@@ -2253,7 +2253,7 @@ func (this *ReportController) SearchReport() {
 	var condition string
 	var sqlGroup string
 	//匹配报告标题、
-	condition = `AND ( a.title LIKE '%` + keyWord + `%' OR  a.body LIKE '%` + keyWord + `%') `
+	condition = `AND ( a.title LIKE '%` + keyWord + `%' OR  a.body LIKE '%` + keyWord + `%') AND a.publish_status = 1 `
 	sqlGroup = ` GROUP BY  a.article_id  ORDER BY a.publish_date DESC  `
 	//对应产业名称、标的名称。
 	//OR a.article_id IN ( SELECT article_id FROM cygx_industrial_article_group_subject WHERE industrial_subject_id IN ( SELECT industrial_subject_id FROM cygx_industrial_subject WHERE subject_name LIKE '%` + keyWord + `%' ) )

+ 87 - 0
controllers/user.go

@@ -17,6 +17,10 @@ type UserController struct {
 	BaseAuthController
 }
 
+type UserCommonController struct {
+	BaseCommonController
+}
+
 // @Title 登录
 // @Description 登录接口
 // @Param	request	body models.LoginReq true "type json string"
@@ -1275,3 +1279,86 @@ func (this *UserController) HeadimgurlUpdate() {
 	br.Success = true
 	br.Msg = "操作成功"
 }
+
+// @Title 登录 (无需token)
+// @Description 登录接口 (无需token)
+// @Param	request	body models.LoginReq true "type json string"
+// @Success 200 {object} models.LoginResp
+// @router /loginPublic [post]
+func (this *UserCommonController) LoginPublic() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.LoginReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	mobile := strings.Trim(req.Mobile, " ")
+	if req.Mobile == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,手机号为空 为空"
+		return
+	}
+
+	item, err := models.GetMsgCode(req.Mobile, req.VCode)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "验证码错误,请重新输入"
+			br.ErrMsg = "校验验证码失败,Err:" + err.Error()
+			return
+		} else {
+			br.Msg = "验证码错误,请重新输入"
+			br.ErrMsg = "校验验证码失败,Err:" + err.Error()
+			return
+		}
+	}
+	if item == nil {
+		br.Msg = "验证码错误,请重新输入"
+		return
+	}
+
+	if len(req.Mobile) >= 11 && req.CountryCode == "" {
+		req.CountryCode = "86"
+	}
+	var token string
+	tokenItem, err := models.GetSessionMobileTokenByOpenId(mobile)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "登录失败"
+		br.ErrMsg = "登录失败,获取token失败:" + err.Error()
+		return
+	}
+	if tokenItem == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
+		timeUnix := time.Now().Unix()
+		timeUnixStr := strconv.FormatInt(timeUnix, 10)
+		token = utils.MD5(mobile) + utils.MD5(timeUnixStr)
+		//新增session
+		{
+			session := new(models.CygxSessionMobile)
+			session.Mobile = mobile
+			session.CreatedTime = time.Now()
+			session.LastUpdatedTime = time.Now()
+			session.ExpireTime = time.Now().AddDate(0, 1, 0)
+			session.AccessToken = token
+			err = models.AddCygxSessionMobile(session)
+			if err != nil {
+				br.Msg = "登录失败"
+				br.ErrMsg = "登录失败,新增用户session信息失败:" + err.Error()
+				return
+			}
+		}
+	} else {
+		token = tokenItem.AccessToken
+	}
+	resp := new(models.LoginResp)
+	resp.Authorization = token
+	br.Ret = 200
+	br.Success = true
+	br.Data = resp
+	br.Msg = "登录成功"
+}

+ 48 - 0
controllers/wechat.go

@@ -559,3 +559,51 @@ func (this *WechatController) ShareImage() {
 	br.Success = true
 	br.Msg = "提交成功"
 }
+
+// @Title 获取短信验证码(无需token)
+// @Description 获取短信验证码接口(无需token)
+// @Param   Mobile   query   string  true       "手机号码"
+// @Param   AreaNum   query   string  true       "地区编码"
+// @Success Ret=200 获取成功
+// @router /getSmsCodePublic [get]
+func (this *WechatCommonController) GetSmsCode() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	mobile := this.GetString("Mobile")
+	if mobile == "" {
+		br.Msg = "请输入手机号"
+		return
+	}
+	areaNum := this.GetString("AreaNum")
+	msgCode := utils.GetRandDigit(4)
+	var result bool
+	if areaNum == "86" || areaNum == "" || areaNum == "0" {
+		result = services.SendSmsCode(mobile, msgCode)
+	} else {
+		result = services.SendSmsCodeGj(mobile, msgCode, areaNum)
+	}
+	//发送成功
+	if result {
+		item := new(models.MsgCode)
+		item.OpenId = ""
+		item.Code = msgCode
+		item.Mobile = mobile
+		item.ExpiredIn = time.Now().Add(15 * time.Minute).Unix()
+		item.Enabled = 1
+		item.CreatedTime = time.Now()
+		err := models.AddMsgCode(item)
+		if err != nil {
+			br.Msg = "发送失败"
+			br.ErrMsg = "发送失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "发送成功"
+	} else {
+		br.Msg = "发送失败"
+	}
+	br.Ret = 200
+	br.Success = true
+}

+ 13 - 0
models/activity.go

@@ -741,3 +741,16 @@ func UpdateCygxActivityName(activityId int, Name string) (err error) {
 	_, err = o.Raw(sql, Name, activityId).Exec()
 	return
 }
+
+//获取已发布但是为开始活动的权限
+func GetActivityWeekPermission() (permission string, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT
+			GROUP_CONCAT( DISTINCT chart_permission_name SEPARATOR ',' ) AS permission 
+		FROM
+			cygx_activity 
+		WHERE
+			active_state = 1`
+	err = o.Raw(sql).QueryRow(&permission)
+	return
+}

+ 53 - 0
models/activity_appointment.go

@@ -171,3 +171,56 @@ func GetAppointmentListByActivityIdAndMobile(activityIds, mobile string) (items
 	_, err = o.Raw(sql, mobile).QueryRows(&items)
 	return
 }
+
+//通过活动ID获取预约纪要的人数列表
+func GetCygxAppointmentSummaryListBySubjectId(subjectIds string) (item []*CygxAppointmentAndActivity, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			ap.mobile,
+			ap.activity_id,
+			a.activity_name 
+		FROM
+			cygx_activity_appointment AS ap
+			INNER JOIN cygx_activity AS a ON a.activity_id = ap.activity_id
+			INNER JOIN cygx_industrial_activity_group_subject AS sg ON sg.activity_id = a.activity_id 
+		WHERE
+			a.active_state = 3 
+			AND a.chart_permission_id = 31 
+			AND DATE_SUB( CURDATE(), INTERVAL 14 DAY ) <= date( a.activity_time ) 
+			AND a.activity_type_id = 1 
+			AND sg.industrial_subject_id IN (` + subjectIds + `) 
+		GROUP BY
+			ap.mobile,
+			ap.activity_id `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
+type CygxAppointment struct {
+	Mobile         string `description:"手机号"`
+	UserId         int `description:"userId"`
+	ActivityName   string `description:"所属销售"`
+	ActivityTypeId int    `description:"活动类型"`
+}
+
+//通过活动ID获取预约纪要的人数列表
+func GetCygxAppointmentSummaryBySubjectId(subjectIds string) (item []*CygxAppointment, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			ap.user_id,
+			ap.mobile,
+			ap.activity_id,
+			a.activity_name 
+		FROM
+			cygx_activity_appointment AS ap
+			INNER JOIN cygx_activity AS a ON a.activity_id = ap.activity_id
+			INNER JOIN cygx_industrial_activity_group_subject AS sg ON sg.activity_id = a.activity_id 
+		WHERE
+			a.active_state = 3
+			AND sg.industrial_subject_id IN (` + subjectIds + `) 
+		GROUP BY
+			ap.mobile,
+			ap.activity_id `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}

+ 23 - 22
models/activity_attendance_detail.go

@@ -25,18 +25,18 @@ type CygxActivityAttendanceDetail struct {
 	IsMeetingStr          int       `description:"是否到会,1到会,0未到会"`
 	UseridEntity          int       `description:"参会者身份. 1:主讲人, 2:主持人, 3:嘉宾, 4:普通参会者, 5:联席主讲人, 6:会议助理"`
 	ActivityTime          string    `description:"活动时间"`
+	CrmCompanyMapStatusId int       `description:"转换后的对应状态信息:1=正式客户, 2=曾使用客户, 3=其他"`
 }
 
 //添加会议提醒信息
 func AddCygxActivityAttendanceDetail(item *CygxActivityAttendanceDetail) (lastId int64, err error) {
-	o := orm.NewOrm()
-	tx, err := o.Begin()
+	o, err := orm.NewOrm().Begin()
 	defer func() {
 		fmt.Println(err)
 		if err == nil {
-			tx.Commit()
+			o.Commit()
 		} else {
-			tx.Rollback()
+			o.Rollback()
 		}
 	}()
 	var count int
@@ -84,24 +84,25 @@ func AddCygxActivityAttendanceDetail(item *CygxActivityAttendanceDetail) (lastId
 }
 
 type RoadshowData struct {
-	Id                int    `orm:"column(id);pk;"description:"主键ID"`
-	Company           string `description:"公司名称"`
-	UserName          string `description:"用户名"`
-	UserPhone         string `description:"手机号"`
-	UserinfoUource    string `description:"用户来源"`
-	AuthInfo          string `description:"用户参会鉴权"`
-	GuestUsername     string `description:"嘉宾名称, 多个用,隔开"`
-	FirstWatchTime    string `description:"首次观看时间"`
-	LastWatchTime     string `description:"最后观看时间"`
-	RoadshowId        string `description:"路演ID"`
-	RoadshowTitle     string `description:"路演标题"`
-	RoadshowBeginTime string `description:"路演开始时间"`
-	RoadshowEndTime   string `description:"路演结束时间"`
-	JoinTime          int    `description:"参与时长"`
-	JoinType          int    `description:"参与方式, 1网络, 2电话"`
-	DataType          int    `description:"数据类型: 1直播, 2回放"`
-	Occupation        string `description:"职位"`
-	UseridEntity      int    `description:"参会者身份. 1:主讲人, 2:主持人, 3:嘉宾, 4:普通参会者, 5:联席主讲人, 6:会议助理"`
+	Id                    int    `orm:"column(id);pk;"description:"主键ID"`
+	Company               string `description:"公司名称"`
+	UserName              string `description:"用户名"`
+	UserPhone             string `description:"手机号"`
+	UserinfoUource        string `description:"用户来源"`
+	AuthInfo              string `description:"用户参会鉴权"`
+	GuestUsername         string `description:"嘉宾名称, 多个用,隔开"`
+	FirstWatchTime        string `description:"首次观看时间"`
+	LastWatchTime         string `description:"最后观看时间"`
+	RoadshowId            string `description:"路演ID"`
+	RoadshowTitle         string `description:"路演标题"`
+	RoadshowBeginTime     string `description:"路演开始时间"`
+	RoadshowEndTime       string `description:"路演结束时间"`
+	JoinTime              int    `description:"参与时长"`
+	JoinType              int    `description:"参与方式, 1网络, 2电话"`
+	DataType              int    `description:"数据类型: 1直播, 2回放"`
+	Occupation            string `description:"职位"`
+	UseridEntity          int    `description:"参会者身份. 1:主讲人, 2:主持人, 3:嘉宾, 4:普通参会者, 5:联席主讲人, 6:会议助理"`
+	CrmCompanyMapStatusId int    `description:"转换后的对应状态信息:1=正式客户, 2=曾使用客户, 3=其他"`
 }
 
 func AddAttendancDetail(items []*CygxActivityAttendanceDetail, activityId int, mobileStr string) (err error) {

+ 12 - 0
models/article.go

@@ -138,6 +138,7 @@ type ArticleDetail struct {
 	CollectionNum           int    `description:"收藏数量"`
 	DepartmentId            int    `description:"作者ID"`
 	DepartmentImgUrl        string `description:"作者头像"`
+	NickName                string `description:"作者昵称"`
 	SubjectIds              string `description:"文章关联标的的ID字符串"`
 	IndustrialAndSubjectIds string `description:"文章关联产业和标的的ID字符串"`
 	IndustrialManagementId  int    `description:"文章关联产业ID"`
@@ -632,3 +633,14 @@ func GetCygxArticleTypeList() (items []*CygxArticleType, err error) {
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+//通过文章ID获取文章所关联的标的ID
+func GetSubjectIds(articleId int) (subjects string, err error) {
+	sql := ` SELECT
+			GROUP_CONCAT( DISTINCT industrial_subject_id ORDER BY id ASC SEPARATOR ',' ) AS subjects 
+			FROM
+			cygx_industrial_article_group_subject WHERE article_id = ?`
+	o := orm.NewOrm()
+	err = o.Raw(sql, articleId).QueryRow(&subjects)
+	return
+}

+ 4 - 4
models/article_celue_push.go

@@ -15,15 +15,15 @@ type CygxArticleCeluePush struct {
 
 func GetArticleCeluePushList() (item []*CygxArticleCeluePush, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT *  FROM	cygx_article_celue_push WHERE	is_handle = 0   `
+	sql := ` SELECT *  FROM	cygx_article_celue_push WHERE	is_handle = 0    GROUP BY article_id   `
 	_, err = o.Raw(sql).QueryRows(&item)
 	return
 }
 
 //更改推送内容是否处理状态
-func UpdateCygxArticleCeluePush(id int) (err error) {
+func UpdateCygxArticleCeluePush(articleId int) (err error) {
 	o := orm.NewOrm()
-	sql := `UPDATE cygx_article_celue_push SET is_handle=1 WHERE id=? `
-	_, err = o.Raw(sql, id).Exec()
+	sql := `UPDATE cygx_article_celue_push SET is_handle=1 WHERE article_id=? `
+	_, err = o.Raw(sql, articleId).Exec()
 	return
 }

+ 1 - 1
models/celue_article_history_record.go

@@ -17,7 +17,7 @@ type CeLueArticleResultApi struct {
 type CeLueArticleResultApidate struct {
 	CelueHistoryId int      `json:"id"`
 	Mobile         string   `json:"phone_number"`
-	ArticleId      string   `json:"parameter"`
+	ArticleId      string   `json:"entity_info"`
 	CreateDate     string   `json:"access_time"`
 	CrmUser        *CrmUser `json:"user"`
 	CompanyName    *CrmUser `json:"crm_company"`

+ 10 - 2
models/chart.go

@@ -179,6 +179,14 @@ func GetChartList(condition string, pars []interface{}, startSize, pageSize int)
 	return
 }
 
+//获取所有同步过来的图表
+func GetChartListAll() (items []*HomeChartListResp, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT chart_id FROM cygx_chart  `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 ////获取图表列表
 //func GetChartCtagIds(ctagId int ) (items []*HomeChartListResp, err error) {
 //	o := orm.NewOrm()
@@ -196,7 +204,7 @@ func GetChartListCollection(chartIds string, userId, startSize, pageSize int) (i
 			( SELECT COUNT(*) FROM cygx_chart_top AS t WHERE t.chart_id = a.chart_id AND t.user_id = ? ) AS num_top,
 			( SELECT COUNT(*) FROM cygx_chart_collect AS c WHERE c.chart_id = a.chart_id AND c.user_id = ? ) AS num_c 
 		FROM
-			cygx_chart AS a
+			cygx_chart_all AS a
 			LEFT JOIN cygx_chart_top AS t ON t.chart_id = a.chart_id
 			LEFT JOIN cygx_chart_collect AS c ON c.chart_id = a.chart_id 
 		WHERE
@@ -260,7 +268,7 @@ func GetChartDetailById(chartId, uid int) (item *CygxChartDetail, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * ,( SELECT COUNT( 1 ) FROM cygx_chart_collect AS c WHERE c.chart_id = a.chart_id AND c.user_id = ? ) AS collection_num
 		FROM
-			cygx_chart  as a 
+			cygx_chart_all  as a 
 		WHERE
 			a.chart_id =? `
 	err = o.Raw(sql, uid, chartId).QueryRow(&item)

+ 41 - 0
models/chart_all.go

@@ -0,0 +1,41 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxChartAll struct {
+	Id            int       `orm:"column(id);pk"`
+	ChartId       int       `description:"图表id"`
+	PtagId        int       `description:"图表父类分类id"`
+	CtagId        int       `description:"图表子类分类id"`
+	PtagIdTwo     int       `description:"图表父类分类id"`
+	CtagIdTwo     int       `description:"图表子类分类id"`
+	Title         string    `description:"标题"`
+	TitleEn       string    `description:"英文标题 "`
+	CreateDate    string    `description:"本地创建时间"`
+	CreateDateApi time.Time `description:"图表创建时间"`
+	PublishStatus int       `description:"发布状态"`
+	PtagName      string    `description:"父类名称"`
+	CtagName      string    `description:"子类名称"`
+	Cover         string    `description:"图表图片"`
+	Iframe        string    `description:"图表详情跳转地址"`
+	PtagNameTwo   string    `description:"父类名称"`
+	CtagNameTwo   string    `description:"子类名称"`
+}
+
+//获取所有同步过来的图表
+func GetChartAllListAll() (items []*HomeChartListResp, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT chart_id FROM cygx_chart_all  `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+//新增图表
+func AddCygxChartAll(item *CygxChartAll) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}

+ 15 - 0
models/chart_permission.go

@@ -151,3 +151,18 @@ func GetCompanyPermissionIdWithHtgj() (chartpermissionids string, err error) {
 	err = o.Raw(sql).QueryRow(&chartpermissionids)
 	return
 }
+
+// GetChartPermissionById 主键获取权限
+func GetChartPermissionByRemark(remark string) (item *ChartPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission WHERE remark = ? LIMIT 1`
+	err = o.Raw(sql, remark).QueryRow(&item)
+	return
+}
+
+func GetChartPermissionIdByName(condition string, pars []interface{}) (chartpermissionids string, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT GROUP_CONCAT(DISTINCT chart_permission_id   SEPARATOR ',') AS chartpermissionids FROM chart_permission  WHERE product_id=2  ` + condition
+	err = o.Raw(sql, pars).QueryRow(&chartpermissionids)
+	return
+}

+ 2 - 0
models/db.go

@@ -109,6 +109,8 @@ func init() {
 		new(CygxUserInteractionNum),
 		new(CygxChartCollectByCygx),
 		new(CygxCompanyInteractionNum),
+		new(CygxChartAll),
+		new(CygxSessionMobile),
 	)
 	// 记录ORM查询日志
 	orm.Debug = true

+ 15 - 0
models/industrial_management.go

@@ -455,3 +455,18 @@ func GetActivityIdListBySubjecName(subjectName string) (items []*ActivityIdRep,
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+//通过id 获取详情
+func GetIndustrialManagemenDetailByAaticleID(articleId int) (items []*IndustrialManagementRep, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			article_id,
+			industry_name 
+		FROM
+			cygx_industrial_article_group_management AS mg
+			INNER JOIN cygx_industrial_management AS m ON mg.industrial_management_id = m.industrial_management_id 
+		WHERE
+			mg.article_id = ? `
+	_, err = o.Raw(sql, articleId).QueryRows(&items)
+	return
+}

+ 8 - 0
models/report_mapping.go

@@ -114,6 +114,14 @@ func GetdetailByCategoryId(categoryId int) (item *ReportMapping, err error) {
 	return
 }
 
+//通过分类ID获取详情
+func GetdetailByCategoryIdPush(categoryId int) (item *ReportMapping, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_report_mapping WHERE category_id=? `
+	err = o.Raw(sql, categoryId).QueryRow(&item)
+	return
+}
+
 //通过分类ID获取详情主观客观
 func GetdetailByCategoryIdSando(categoryId int) (item *ReportMapping, err error) {
 	o := orm.NewOrm()

+ 7 - 1
models/send_company_user.go

@@ -225,7 +225,13 @@ type WxUserOpLogResp struct {
 //获取指定时间内更新的用户
 func GetWxUserOpLog(createTime string) (items []*WxUserOpLogResp, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT company_id FROM wx_user_op_log WHERE  log_type IN ('add','edit','import','move') AND create_time >=  '` + createTime + `' AND company_id > 1 GROUP BY company_id `
+	sql := ` SELECT
+			u.company_id 
+		FROM
+			wx_user_op_log AS l
+			INNER JOIN wx_user AS u ON u.mobile = l.mobile 
+		WHERE
+			l.log_type IN ( 'add', 'edit', 'import', 'move' )  AND create_time >=  '` + createTime + `'  GROUP BY u.company_id `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }

+ 45 - 0
models/session_mobile.go

@@ -0,0 +1,45 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxSessionMobile struct {
+	SessionId       int `orm:"column(session_id);pk"`
+	Mobile          string
+	UserId          int
+	AccessToken     string
+	ExpireTime      time.Time
+	CreatedTime     time.Time
+	LastUpdatedTime time.Time
+}
+
+func GetCygxSessionMobile(token string) (item *CygxSessionMobile, err error) {
+	sql := `SELECT * FROM cygx_session_mobile WHERE access_token=? AND expire_time> NOW() ORDER BY session_id DESC LIMIT 1 `
+	o := orm.NewOrm()
+	err = o.Raw(sql, token).QueryRow(&item)
+	return
+}
+
+func GetSessionMobileCountByToken(token string) (count int, err error) {
+	sql := `SELECT COUNT(1) AS count FROM cygx_session_mobile WHERE access_token=? AND expire_time> NOW() ORDER BY session_id DESC LIMIT 1 `
+	o := orm.NewOrm()
+	err = o.Raw(sql, token).QueryRow(&count)
+	return
+}
+
+//添加用户session信息
+func AddCygxSessionMobile(item *CygxSessionMobile) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}
+
+//根据用户id获取token
+func GetSessionMobileTokenByOpenId(openId string) (item *CygxSession, err error) {
+	sql := `SELECT * FROM cygx_session_mobile WHERE mobile=? AND expire_time> NOW() ORDER BY session_id DESC LIMIT 1 `
+	o := orm.NewOrm()
+	err = o.Raw(sql, openId).QueryRow(&item)
+	return
+}

+ 23 - 0
models/user_record.go

@@ -140,3 +140,26 @@ func GetUserRecordListByMobile(platform int, bindAccount string) (items []*OpenI
 	_, err = orm.NewOrm().Raw(sql, platform).QueryRows(&items)
 	return
 }
+
+//获取单个用户openid
+func GetOpenIdDetailByMobile(platform int, bindAccount string) (item *OpenIdList, err error) {
+	o := orm.NewOrm()
+	var sql string
+	sql = `SELECT cr.open_id,wu.user_id FROM user_record  as u 
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = u.union_id 
+			INNER JOIN wx_user AS wu ON wu.mobile = u.bind_account 
+			WHERE create_platform=? AND u.bind_account = ?`
+	err = o.Raw(sql, platform, bindAccount).QueryRow(&item)
+	return
+}
+
+func GetOpenIdByUserIds(ids string) (item []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	var sql string
+	sql = `SELECT cr.open_id,wu.user_id FROM user_record  as u 
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = u.union_id 
+			INNER JOIN wx_user AS wu ON wu.mobile = u.bind_account 
+			WHERE create_platform=4 AND u.user_id IN (`+ids+`)`
+	_,err = o.Raw(sql).QueryRows(&item)
+	return
+}

+ 19 - 0
models/wx_user.go

@@ -195,6 +195,25 @@ func GetWxUserItemByMobile(mobile string) (item *WxUserItem, err error) {
 	return
 }
 
+//根据用户手机号获取相关信息
+func GetWxUserAouthByMobile(mobile string) (item *WxUserItem, err error) {
+	sql := `SELECT
+			a.*,
+			s.mobile,
+			b.company_name 
+		FROM
+			cygx_session_mobile AS s
+			LEFT JOIN wx_user AS a ON a.mobile = s.mobile
+			LEFT JOIN company AS b ON a.company_id = b.company_id 
+		WHERE
+			s.mobile = ?
+		ORDER BY
+			a.company_id DESC 
+			LIMIT 1`
+	err = orm.NewOrm().Raw(sql, mobile).QueryRow(&item)
+	return
+}
+
 func GetWxUserItemByEmail(email string) (item *WxUserItem, err error) {
 	sql := `SELECT * FROM wx_user WHERE email=? `
 	err = orm.NewOrm().Raw(sql, email).QueryRow(&item)

+ 110 - 0
models/wx_user_code.go

@@ -29,3 +29,113 @@ func GetWxUserCode(wxCode string) (item *WxUserCode, err error) {
 	err = o.Raw(sql, wxCode).QueryRow(&item)
 	return
 }
+
+//获取所有有权限的用户的opid
+func GetCygxUserRecordPower(condition string, pars []interface{}) (items []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			cr.open_id,
+			u.user_id,
+			u.company_id,
+			u.real_name,
+			u.mobile 
+		FROM
+			company_report_permission AS p
+			INNER JOIN wx_user AS u ON u.company_id = p.company_id
+			INNER JOIN user_record AS r ON r.user_id = u.user_id
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = r.union_id 
+		WHERE
+			 r.create_platform = 4 ` + condition + ` AND p.STATUS IN ('正式','试用','永续')  GROUP BY cr.open_id`
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+//获取关注这个文章对应产业的用户的 openid
+func GetCygxUserFllowOpenid(articleId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			cr.open_id,
+			f.user_id 
+		FROM
+			cygx_xzs_choose_send AS s
+			INNER JOIN cygx_industry_fllow AS f ON f.user_id = s.user_id
+			INNER JOIN user_record AS r ON r.user_id = f.user_id
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = r.union_id 
+			INNER JOIN cygx_industrial_article_group_management as mg  ON mg.industrial_management_id = f.industrial_management_id
+		WHERE
+			r.create_platform = 4 
+			AND mg.article_id  = ?`
+	_, err = o.Raw(sql, articleId).QueryRows(&items)
+	return
+}
+
+//获取拒绝接收推送的的用户的 openid
+func GetCygxUserRefusetOpenid() (items []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			cr.open_id,
+			s.user_id
+			FROM
+			cygx_xzs_choose_send AS s
+			INNER JOIN user_record AS r ON r.user_id = s.user_id
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = r.union_id
+			WHERE
+			r.create_platform = 4
+			AND s.is_refuse = 1`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+//获取选择策略推送的用户的openid openid
+func GetCygxUserFllowCeLueOpenid(categoryId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			cr.open_id,
+			f.user_id 
+		FROM
+			cygx_xzs_choose_send AS s
+			INNER JOIN cygx_xzs_choose_category AS f ON f.user_id = s.user_id
+			INNER JOIN user_record AS r ON r.user_id = f.user_id
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = r.union_id 
+		WHERE
+			r.create_platform = 4
+			AND s.is_refuse = 0
+			AND (s.is_subjective = 1 OR s.is_objective = 1)
+			AND f.category_id = ?`
+	_, err = o.Raw(sql, categoryId).QueryRows(&items)
+	return
+}
+
+type CygxXzsChooseSend struct {
+	Id           int       `orm:"column(id);pk"`
+	UserId       int       `description:"用户ID"`
+	Mobile       string    `description:"手机号"`
+	Email        string    `description:"邮箱"`
+	CompanyId    int       `description:"公司id"`
+	CompanyName  string    `description:"公司名称"`
+	RealName     string    `description:"用户实际名称"`
+	IsRefuse     int       `description:"是否拒绝推送,0否、1是  如果为1 则不做任何推送"`
+	IsSubjective int       `description:"是否选择主观推送, 1 是 、 0否"`
+	IsObjective  int       `description:"是否选择客观推送, 1 是 、 0否"`
+	CreateTime   time.Time `description:"创建时间"`
+	ModifyTime   time.Time `description:"更新时间"`
+}
+
+//获取提交过推送规则用户的userId
+func GetCygxXzsChooseSend() (items []*CygxXzsChooseSend, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_xzs_choose_send `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+
+//获取提交过推送规则用户的userId
+func GetCygxXzsChooseSendOpenIdByUserIds(idStr string) (items []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT ur.user_id, cr.open_id FROM user_record AS ur
+INNER JOIN cygx_user_record AS cr
+WHERE ur.user_id IN (` + idStr + `) AND create_platform=4 AND ur.union_id=cr.union_id `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 27 - 9
routers/commentsRouter_controllers.go

@@ -259,15 +259,6 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleCommonController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleCommonController"],
-        beego.ControllerComments{
-            Method: "Detail",
-            Router: "/look/detail",
-            AllowHTTPMethods: []string{"get"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleCommonController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleCommonController"],
         beego.ControllerComments{
             Method: "PageHistoryPublic",
@@ -331,6 +322,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleControllerMobile"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleControllerMobile"],
+        beego.ControllerComments{
+            Method: "DetailMd5",
+            Router: "/look/detail",
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BaseChartController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BaseChartController"],
         beego.ControllerComments{
             Method: "Patg",
@@ -808,6 +808,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:UserCommonController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:UserCommonController"],
+        beego.ControllerComments{
+            Method: "LoginPublic",
+            Router: "/loginPublic",
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:UserController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:UserController"],
         beego.ControllerComments{
             Method: "ApplyTryOut",
@@ -952,6 +961,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:WechatCommonController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:WechatCommonController"],
+        beego.ControllerComments{
+            Method: "GetSmsCode",
+            Router: "/getSmsCodePublic",
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:WechatCommonController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:WechatCommonController"],
         beego.ControllerComments{
             Method: "WechatLogin",

+ 2 - 0
routers/router.go

@@ -40,6 +40,7 @@ func init() {
 		web.NSNamespace("/user",
 			web.NSInclude(
 				&controllers.UserController{},
+				&controllers.UserCommonController{},
 			),
 		),
 		web.NSNamespace("/permission",
@@ -52,6 +53,7 @@ func init() {
 			web.NSInclude(
 				&controllers.ArticleController{},
 				&controllers.ArticleCommonController{},
+				&controllers.ArticleControllerMobile{},
 			),
 		),
 		web.NSNamespace("/config",

+ 34 - 0
services/activity.go

@@ -846,6 +846,7 @@ func ActivityAttendanceDetail(cont context.Context) (err error) {
 							item.Position = v.Occupation
 							item.UseridEntity = v.UseridEntity
 							item.ActivityTime = activityDetail.ActivityTime
+							item.CrmCompanyMapStatusId = v.CrmCompanyMapStatusId
 							item.CreateTime = time.Now()
 							mobileStr += "'" + v.UserPhone + "'" + ","
 							needAddAttendanc = append(needAddAttendanc, item)
@@ -952,6 +953,7 @@ func ActivityAttendanceDetail(cont context.Context) (err error) {
 							item.Position = v.Occupation
 							item.UseridEntity = v.UseridEntity
 							item.ActivityTime = vAct.ActivityTime
+							item.CrmCompanyMapStatusId = v.CrmCompanyMapStatusId
 							item.CreateTime = time.Now()
 							mobileStr += "'" + v.UserPhone + "'" + ","
 							needAddAttendanc = append(needAddAttendanc, item)
@@ -1246,3 +1248,35 @@ func SpecialActivityUserRemind(user *models.WxUserItem, activityDetail *models.C
 	}
 	return
 }
+
+//func init() {
+//	DoActivityOnenIdWxTemplateMsg()
+//}
+
+//周日下午四点半推送全部活动
+func DoActivityOnenIdWxTemplateMsg(cont context.Context) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("周日下午四点半推送全部活动失败,DoActivityOnenIdWxTemplateMsg ErrMsg:"+err.Error(), 2)
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "DoActivityOnenIdWxTemplateMsg ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			fmt.Println(err)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	openidPowerList, err := models.GetCygxUserRecordPower(condition, pars)
+	if err != nil {
+		return err
+	}
+	first := "近期所有行业活动预告,欢迎参与"
+	keyword1 := "--"
+	keyword2 := "--"
+	keyword3 := ""
+	keyword4 := "点击查看下周活动列表"
+	SendActivityOnenIdWxTemplateMsg(first, keyword1, keyword2, keyword3, keyword4, openidPowerList)
+	return
+}

+ 489 - 119
services/article.go

@@ -629,7 +629,7 @@ func GetArticleListByApi(cont context.Context) (err error) {
 	}
 	for _, v := range listUpdateArticle {
 		// 这里直接go出去会出现并发,导致文章md5ID唯一索引限制报错
-		err = HandleArticleListByApi(v.ArticleId, v.Id)
+		err = HandleArticleListByApi(v.ArticleId)
 		if err != nil {
 			utils.FileLog.Info("WxGetToken Result:%s ", err.Error())
 		}
@@ -638,7 +638,7 @@ func GetArticleListByApi(cont context.Context) (err error) {
 }
 
 //处理同步过来的文章
-func HandleArticleListByApi(artcleId, celuePushId int) (err error) {
+func HandleArticleListByApi(artcleId int) (err error) {
 	defer func() {
 		if err != nil {
 			go utils.SendAlarmMsg("处理同步策略平台数据失败"+"GetArticleListByApi ErrMsg:"+err.Error(), 2)
@@ -744,7 +744,7 @@ func HandleArticleListByApi(artcleId, celuePushId int) (err error) {
 			fmt.Println("UpdateArticlePublish Err:", err.Error())
 			return err
 		}
-		go models.UpdateCygxArticleCeluePush(celuePushId)
+		go models.UpdateCygxArticleCeluePush(artcleId)
 		return err
 
 	}
@@ -1002,142 +1002,512 @@ func HandleArticleListByApi(artcleId, celuePushId int) (err error) {
 
 		//类型ID 医药(医享会:28 、药调研:301)、消费【渠道新声:32】、科技【科技前言:79】、智造【匠心智造:84】或者是纪要做消息模板推送
 		fmt.Println(v.CategoryId)
-		if v.IsSummary == 1 || (v.CategoryId == 28 || v.CategoryId == 301 || v.CategoryId == 32 || v.CategoryId == 79 || v.CategoryId == 84) {
-			sliceSubjects := strings.Split(v.Stock, "/")
-			fmt.Println(sliceSubjects)
-			if len(sliceSubjects) > 0 {
-				var subjectStr string
-				for _, vSubject := range sliceSubjects {
-					sliceKuohao := strings.Split(vSubject, "(")           //过滤括号
-					sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
-					subject := sliceXiahuaxian[0]
-					subjectStr += "'" + subject + "',"
-				}
-				if subjectStr != "" {
-					subjectStr = strings.TrimRight(subjectStr, ",")
-					activityIdList, err := models.GetActivityIdListBySubjecName(subjectStr)
+		//if v.IsSummary == 1 || (v.CategoryId == 28 || v.CategoryId == 301 || v.CategoryId == 32 || v.CategoryId == 79 || v.CategoryId == 84) {
+		//	sliceSubjects := strings.Split(v.Stock, "/")
+		//	fmt.Println(sliceSubjects)
+		//	if len(sliceSubjects) > 0 {
+		//		var subjectStr string
+		//		for _, vSubject := range sliceSubjects {
+		//			sliceKuohao := strings.Split(vSubject, "(")           //过滤括号
+		//			sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
+		//			subject := sliceXiahuaxian[0]
+		//			subjectStr += "'" + subject + "',"
+		//		}
+		//		if subjectStr != "" {
+		//			subjectStr = strings.TrimRight(subjectStr, ",")
+		//			activityIdList, err := models.GetActivityIdListBySubjecName(subjectStr)
+		//			if err != nil {
+		//				fmt.Println("GetActivityIdListBySubjecName Err:", err.Error())
+		//				return err
+		//			}
+		//			if len(activityIdList) > 0 {
+		//				var activityIdStr string
+		//				for _, vAct := range activityIdList {
+		//					activityIdStr += strconv.Itoa(vAct.ActivityId) + ","
+		//				}
+		//				activityIdStr = strings.TrimRight(activityIdStr, ",")
+		//				if activityIdStr != "" {
+		//					appointmentList, err := models.GetAppointmentListByActivityId(activityIdStr, "1,2,5")
+		//					if err != nil {
+		//						fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
+		//						return err
+		//					}
+		//					if len(appointmentList) > 0 {
+		//						for _, vApp := range appointmentList {
+		//
+		//							appointmentByMobileList, err := models.GetAppointmentListByActivityIdAndMobile(activityIdStr, vApp.Mobile)
+		//							if err != nil {
+		//								fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
+		//								return err
+		//							}
+		//							var appointmentActivityName string
+		//							if len(appointmentByMobileList) > 0 {
+		//								for _, vAppM := range appointmentByMobileList {
+		//									appointmentActivityName += vAppM.ActivityName + ","
+		//								}
+		//							}
+		//							appointmentActivityName = strings.TrimRight(appointmentActivityName, ",")
+		//							if vApp.ActivityTypeId == 5 && v.CategoryId != 301 {
+		//								continue
+		//							}
+		//
+		//							if vApp.Mobile != "" {
+		//								openIdListByAppointment, err := models.GetUserRecordListByMobile(4, vApp.Mobile)
+		//								if err != nil {
+		//									fmt.Println(err)
+		//									return err
+		//								}
+		//								keyword1 := "您预约的调研,有关联的纪要发布/更新了"
+		//								keyword2 := appointmentActivityName
+		//								keyword3 := v.Title
+		//								keyword4 := v.PublishDate.Format(utils.FormatDateTime)
+		//								SendWxMsgWithArticleClassToAdmin(keyword1, keyword2, keyword3, keyword4, openIdListByAppointment, artcleId)
+		//							}
+		//						}
+		//					}
+		//				}
+		//			}
+		//		}
+		//	}
+		//}
+		//
+		////【公司调研】系列纪要发布/更新后
+		//if v.CategoryId == 45 || v.CategoryId == 74 || v.CategoryId == 86 || v.CategoryId == 88 {
+		//	fmt.Println("处理预约纪要")
+		//	sliceSubjects := strings.Split(v.Stock, "/")
+		//	if len(sliceSubjects) > 0 {
+		//		var subjectStr string
+		//		for _, vSubject := range sliceSubjects {
+		//			sliceKuohao := strings.Split(vSubject, "(")           //过滤括号
+		//			sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
+		//			subject := sliceXiahuaxian[0]
+		//			subjectStr += "'" + subject + "',"
+		//		}
+		//		if subjectStr != "" {
+		//			subjectStr = strings.TrimRight(subjectStr, ",")
+		//			activityIdList, err := models.GetActivityIdListBySubjecName(subjectStr)
+		//			if err != nil {
+		//				fmt.Println("GetActivityIdListBySubjecName Err:", err.Error())
+		//				return err
+		//			}
+		//			if len(activityIdList) > 0 {
+		//				var activityIdStr string
+		//				for _, vAct := range activityIdList {
+		//					activityIdStr += strconv.Itoa(vAct.ActivityId) + ","
+		//				}
+		//				activityIdStr = strings.TrimRight(activityIdStr, ",")
+		//				if activityIdStr != "" {
+		//					appointmentList, err := models.GetAppointmentListByActivityId(activityIdStr, "3,4")
+		//					if err != nil {
+		//						fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
+		//						return err
+		//					}
+		//					if len(appointmentList) > 0 {
+		//						for _, vApp := range appointmentList {
+		//							appointmentByMobileList, err := models.GetAppointmentListByActivityIdAndMobile(activityIdStr, vApp.Mobile)
+		//							if err != nil {
+		//								fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
+		//								return err
+		//							}
+		//							var appointmentActivityName string
+		//							if len(appointmentByMobileList) > 0 {
+		//								for _, vAppM := range appointmentByMobileList {
+		//									appointmentActivityName += vAppM.ActivityName + ","
+		//								}
+		//							}
+		//							appointmentActivityName = strings.TrimRight(appointmentActivityName, ",")
+		//							if vApp.Mobile != "" {
+		//								openIdListByAppointment, err := models.GetUserRecordListByMobile(4, vApp.Mobile)
+		//								if err != nil {
+		//									fmt.Println(err)
+		//									return err
+		//								}
+		//								keyword1 := "您预约的调研,有关联的纪要发布/更新了"
+		//								keyword2 := appointmentActivityName
+		//								keyword3 := v.Title
+		//								keyword4 := v.PublishDate.Format(utils.FormatDateTime)
+		//								SendWxMsgWithArticleClassToAdmin(keyword1, keyword2, keyword3, keyword4, openIdListByAppointment, artcleId)
+		//
+		//							}
+		//						}
+		//					}
+		//				}
+		//			}
+		//		}
+		//	}
+		//}
+
+		//【公司调研】系列纪要发布/更新后 end
+
+		//查研观向6.9模板消息推送规则
+		go DoArticleOnenIdWxTemplateMsg(v.ArticleId)
+	}
+	go models.UpdateCygxArticleCeluePush(artcleId)
+
+	return err
+}
+
+//func init() {
+//	DoArticleOnenIdWxTemplateMsg(6940)
+//}
+
+//过滤策略平台报告,研选报告重复推送,以及权限勾选的推送
+func DoArticleOnenIdWxTemplateMsg(articleId int) (err error) {
+	//策略平台同步过来的文章ID,做微信模板消息推送,同一篇报告12小时只推送一次
+	cacheKey := fmt.Sprint(utils.CACHE_KEY_ARTICLE_ID_TEMPLATE, ":ArticleId", articleId)
+	ttlTime := utils.Rc.GetRedisTTL(cacheKey)
+	if ttlTime > 0 {
+		return err
+	}
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("处理同步策略平台数据失败"+"GetArticleListByApi ErrMsg:"+err.Error(), 2)
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetArticleListByApi ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			fmt.Println(err)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+
+	//获取文章详情
+	articleInfo, err := models.GetArticleDetailById(articleId)
+	if err != nil {
+		return
+	}
+	articleInfo.Abstract, _ = GetReportContentTextSub(articleInfo.Abstract)
+	var chartPermissionId int
+
+	var chartPermissionName string
+	reportMapDetail, err := models.GetdetailByCategoryIdPush(articleInfo.CategoryId)
+	if err != nil {
+		return err
+	}
+	if reportMapDetail.ChartPermissionId == utils.CE_LUE_ID {
+		chartPermissionId = utils.CE_LUE_ID
+	} else {
+		if reportMapDetail.PermissionType == 1 {
+			chartPermissionName = reportMapDetail.ChartPermissionName + "(主观)"
+		} else {
+			chartPermissionName = reportMapDetail.ChartPermissionName + "(客观)"
+		}
+		chartPermissionDetail, err := models.GetChartPermissionByRemark(chartPermissionName)
+		if err != nil {
+			return err
+		}
+		chartPermissionId = chartPermissionDetail.ChartPermissionId
+	}
+	// 获取所有有权的用户的 openid
+	mapOpenidPower := make(map[int]string)
+	permissionIdList := make([]string, 0)
+	var condition string
+	var pars []interface{}
+	slicepermissionId := strings.Split(strconv.Itoa(chartPermissionId), ",")
+	if len(slicepermissionId) > 0 {
+		for _, v := range slicepermissionId {
+			permissionIdList = append(permissionIdList, v)
+		}
+		condition += ` AND p.chart_permission_id  IN (` + utils.GetOrmInReplace(len(slicepermissionId)) + ` )  `
+		pars = append(pars, permissionIdList)
+	}
+	openidPowerList, err := models.GetCygxUserRecordPower(condition, pars)
+	if err != nil {
+		return err
+	}
+	for _, v := range openidPowerList {
+		mapOpenidPower[v.UserId] = v.OpenId
+	}
+	//获取关注这个文章对应产业的用户的 openid
+	mapOpenidFllow := make(map[int]string)
+	if chartPermissionId != utils.CE_LUE_ID {
+		openidFllowList, err := models.GetCygxUserFllowOpenid(articleId)
+		if err != nil {
+			return err
+		}
+		for _, v := range openidFllowList {
+			mapOpenidFllow[v.UserId] = v.OpenId
+		}
+	}
+
+	//获取拒绝接收推送的的用户的 openid
+	mapOpenidRefuset := make(map[int]string)
+	openidRefusetList, err := models.GetCygxUserRefusetOpenid()
+	if err != nil {
+		return err
+	}
+	for _, v := range openidRefusetList {
+		mapOpenidRefuset[v.UserId] = v.OpenId
+	}
+	//获取提交过推送规则的用户的 openid
+	mapUserIdChooseSend := make(map[int]int)
+	mapUserIdChooseSendTypeNoPermission := make(map[int]int)
+	chooseSendtList, err := models.GetCygxXzsChooseSend()
+	for _, v := range chooseSendtList {
+		mapUserIdChooseSend[v.UserId] = v.UserId
+		if v.IsRefuse == 1 {
+			continue
+		}
+		//获取选择主客观赛道的用户
+		if reportMapDetail.PermissionType == 1 {
+			if v.IsSubjective == 1 {
+				mapUserIdChooseSendTypeNoPermission[v.UserId] = v.UserId
+			}
+		} else {
+			if v.IsObjective == 1 {
+				mapUserIdChooseSendTypeNoPermission[v.UserId] = v.UserId
+			}
+		}
+	}
+	//已经推送了的openid
+	mapOpenidPushed := make(map[int]string)
+	//文章关联的产业
+	var industryName string
+	if chartPermissionId != utils.CE_LUE_ID {
+		detailIndustryNameList, err := models.GetIndustrialManagemenDetailByAaticleID(articleId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			return err
+		}
+		for _, v := range detailIndustryNameList {
+			industryName += v.IndustryName + ","
+		}
+		industryName = strings.TrimRight(industryName, ",")
+	} else {
+		industryName = reportMapDetail.SubCategoryName
+	}
+	keyword2 := articleInfo.Title
+	keyword3 := articleInfo.PublishDate
+	keyword4 := articleInfo.Abstract
+	mapAlreadySend := make(map[int]int)
+	//如果是策略就按照策略的推送方式来写
+	if reportMapDetail.ChartPermissionName == utils.CE_LUE_NAME {
+		//获取提交过推送规则的用户的 openid
+		mapUserFllowCeLue := make(map[int]string)
+		userFllowCeLueList, err := models.GetCygxUserFllowCeLueOpenid(articleInfo.CategoryId)
+		if err != nil {
+			return err
+		}
+		for _, v := range userFllowCeLueList {
+			mapUserFllowCeLue[v.UserId] = v.OpenId
+		}
+		for k, v := range mapOpenidPower {
+			if mapOpenidPushed[k] != "" {
+				continue
+			}
+			openIditem := new(models.OpenIdList)
+			openIditem.UserId = k
+			openIditem.OpenId = v
+			first := "您关注的赛道,有新的报告发布/更新,欢迎查看"
+			keyword1 := "所属赛道:" + industryName
+			mapActivityUserId := make(map[int]string)
+			if articleInfo.IsSummary == 1 {
+				sliceSubjectId, _ := models.GetSubjectIds(articleId)
+				if sliceSubjectId != "" {
+					appointmentList, err := models.GetCygxAppointmentSummaryBySubjectId(sliceSubjectId)
 					if err != nil {
-						fmt.Println("GetActivityIdListBySubjecName Err:", err.Error())
+						fmt.Println("GetCygxAppointmentSummaryListBySubjectId Err:", err.Error())
 						return err
 					}
-					if len(activityIdList) > 0 {
-						var activityIdStr string
-						for _, vAct := range activityIdList {
-							activityIdStr += strconv.Itoa(vAct.ActivityId) + ","
+					var userIds []string
+					if len(appointmentList) > 0 {
+						for _, v := range appointmentList {
+							//fmt.Println("mapActivityUserId:", v.UserId)
+							userIds = append(userIds, strconv.Itoa(v.UserId))
+							mapActivityUserId[v.UserId] += v.ActivityName + ","
 						}
-						activityIdStr = strings.TrimRight(activityIdStr, ",")
-						if activityIdStr != "" {
-							appointmentList, err := models.GetAppointmentListByActivityId(activityIdStr, "1,2,5")
-							if err != nil {
-								fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
-								return err
-							}
-							if len(appointmentList) > 0 {
-								for _, vApp := range appointmentList {
-
-									appointmentByMobileList, err := models.GetAppointmentListByActivityIdAndMobile(activityIdStr, vApp.Mobile)
-									if err != nil {
-										fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
-										return err
-									}
-									var appointmentActivityName string
-									if len(appointmentByMobileList) > 0 {
-										for _, vAppM := range appointmentByMobileList {
-											appointmentActivityName += vAppM.ActivityName + ","
-										}
-									}
-									appointmentActivityName = strings.TrimRight(appointmentActivityName, ",")
-									if vApp.ActivityTypeId == 5 && v.CategoryId != 301 {
-										continue
-									}
-
-									if vApp.Mobile != "" {
-										openIdListByAppointment, err := models.GetUserRecordListByMobile(4, vApp.Mobile)
-										if err != nil {
-											fmt.Println(err)
-											return err
-										}
-										keyword1 := "您预约的调研,有关联的纪要发布/更新了"
-										keyword2 := appointmentActivityName
-										keyword3 := v.Title
-										keyword4 := v.PublishDate.Format(utils.FormatDateTime)
-										SendWxMsgWithArticleClassToAdmin(keyword1, keyword2, keyword3, keyword4, openIdListByAppointment, artcleId)
-									}
-								}
+						userIdstr := strings.Join(userIds, ",")
+						openIdLists, err := models.GetOpenIdByUserIds(userIdstr)
+						if err != nil {
+							fmt.Println("GetOpenIdByUserIds Err:", err.Error())
+							return err
+						}
+						for _, item := range openIdLists {
+							first := "您预约的调研,有关联的纪要发布/更新了1"
+							keyword1 := industryName
+							openIditem := new(models.OpenIdList)
+							openIditem.OpenId = item.OpenId
+							openIditem.UserId = item.UserId
+							if _, ok := mapAlreadySend[openIditem.UserId]; !ok {
+								SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+								delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+								fmt.Println("AlreadySend:", openIditem.UserId)
+								mapAlreadySend[openIditem.UserId] = openIditem.UserId
 							}
 						}
 					}
 				}
+				//fmt.Println("openIditem.UserId:", openIditem.UserId)
+				//if _,ok := mapActivityUserId[openIditem.UserId]; ok{
+				//	first = "您预约的调研,有关联的纪要发布/更新了"
+				//	keyword1 = industryName
+				//	SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				//	delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+				//	mapAlreadySend[openIditem.UserId] = openIditem.UserId
+				//}
+			}
+			_, ok := mapAlreadySend[openIditem.UserId]
+			//如果有权限而且小助手没有提交过信息的 就做正常推送
+			if mapUserIdChooseSend[openIditem.UserId] == 0 && !ok {
+				fmt.Println("1:", articleId)
+				SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+			}
+			//如果小助手勾选了对应的权限信息 就做正常推送
+			if mapUserIdChooseSend[openIditem.UserId] != 0 && mapUserFllowCeLue[openIditem.UserId] != "" && !ok {
+				fmt.Println("2:", articleId)
+				SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 			}
 		}
-
-		//【公司调研】系列纪要发布/更新后
-		if v.CategoryId == 45 || v.CategoryId == 74 || v.CategoryId == 86 || v.CategoryId == 88 {
-			fmt.Println("处理预约纪要")
-			sliceSubjects := strings.Split(v.Stock, "/")
-			if len(sliceSubjects) > 0 {
-				var subjectStr string
-				for _, vSubject := range sliceSubjects {
-					sliceKuohao := strings.Split(vSubject, "(")           //过滤括号
-					sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
-					subject := sliceXiahuaxian[0]
-					subjectStr += "'" + subject + "',"
+	} else {
+		for k, v := range mapOpenidPower {
+			if mapOpenidPushed[k] != "" {
+				continue
+			}
+			chooseSendtList, err := models.GetCygxXzsChooseSend()
+			if err != nil {
+				return err
+			}
+			mapUserIdChooseSendType := make(map[int]int)
+			for _, v := range chooseSendtList {
+				if v.IsRefuse == 1 {
+					continue
 				}
-				if subjectStr != "" {
-					subjectStr = strings.TrimRight(subjectStr, ",")
-					activityIdList, err := models.GetActivityIdListBySubjecName(subjectStr)
+				//获取选择主客观赛道的用户
+				if reportMapDetail.PermissionType == 1 {
+					if v.IsSubjective == 1 {
+						mapUserIdChooseSendType[v.UserId] = v.UserId
+					}
+				} else if reportMapDetail.PermissionType == 2 {
+					if v.IsObjective == 1 {
+						mapUserIdChooseSendType[v.UserId] = v.UserId
+					}
+				} else {
+					if v.IsSubjective == 1 || v.IsObjective == 1 {
+						mapUserIdChooseSendType[v.UserId] = v.UserId
+					}
+				}
+			}
+			openIditem := new(models.OpenIdList)
+			openIditem.UserId = k
+			openIditem.OpenId = v
+			first := "您关注的赛道,有新的报告发布/更新,欢迎查看"
+			keyword1 := "所属赛道:" + industryName
+			mapActivityUserId := make(map[int]string)
+			if articleInfo.IsSummary == 1 {
+				sliceSubjectId, _ := models.GetSubjectIds(articleId)
+				if sliceSubjectId != "" {
+					appointmentList, err := models.GetCygxAppointmentSummaryBySubjectId(sliceSubjectId)
 					if err != nil {
-						fmt.Println("GetActivityIdListBySubjecName Err:", err.Error())
+						fmt.Println("GetCygxAppointmentSummaryListBySubjectId Err:", err.Error())
 						return err
 					}
-					if len(activityIdList) > 0 {
-						var activityIdStr string
-						for _, vAct := range activityIdList {
-							activityIdStr += strconv.Itoa(vAct.ActivityId) + ","
+					var userIds []string
+					if len(appointmentList) > 0 {
+						for _, v := range appointmentList {
+							//fmt.Println("mapActivityUserId:", v.UserId)
+							userIds = append(userIds, strconv.Itoa(v.UserId))
+							mapActivityUserId[v.UserId] += v.ActivityName + ","
 						}
-						activityIdStr = strings.TrimRight(activityIdStr, ",")
-						if activityIdStr != "" {
-							appointmentList, err := models.GetAppointmentListByActivityId(activityIdStr, "3,4")
-							if err != nil {
-								fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
-								return err
-							}
-							if len(appointmentList) > 0 {
-								for _, vApp := range appointmentList {
-									appointmentByMobileList, err := models.GetAppointmentListByActivityIdAndMobile(activityIdStr, vApp.Mobile)
-									if err != nil {
-										fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
-										return err
-									}
-									var appointmentActivityName string
-									if len(appointmentByMobileList) > 0 {
-										for _, vAppM := range appointmentByMobileList {
-											appointmentActivityName += vAppM.ActivityName + ","
-										}
-									}
-									appointmentActivityName = strings.TrimRight(appointmentActivityName, ",")
-									if vApp.Mobile != "" {
-										openIdListByAppointment, err := models.GetUserRecordListByMobile(4, vApp.Mobile)
-										if err != nil {
-											fmt.Println(err)
-											return err
-										}
-										keyword1 := "您预约的调研,有关联的纪要发布/更新了"
-										keyword2 := appointmentActivityName
-										keyword3 := v.Title
-										keyword4 := v.PublishDate.Format(utils.FormatDateTime)
-										SendWxMsgWithArticleClassToAdmin(keyword1, keyword2, keyword3, keyword4, openIdListByAppointment, artcleId)
-
-									}
-								}
+						userIdstr := strings.Join(userIds, ",")
+						openIdLists, err := models.GetOpenIdByUserIds(userIdstr)
+						if err != nil {
+							fmt.Println("GetOpenIdByUserIds Err:", err.Error())
+							return err
+						}
+						for _, item := range openIdLists {
+							first := "您预约的调研,有关联的纪要发布/更新了1"
+							keyword1 := industryName
+							openIditem := new(models.OpenIdList)
+							openIditem.OpenId = item.OpenId
+							openIditem.UserId = item.UserId
+							if _, ok := mapAlreadySend[openIditem.UserId]; !ok {
+								SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+								delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+								fmt.Println("AlreadySend:", openIditem.UserId)
+								mapAlreadySend[openIditem.UserId] = openIditem.UserId
 							}
 						}
 					}
 				}
+				//fmt.Println("openIditem.UserId:", openIditem.UserId)
+				//if _,ok := mapActivityUserId[openIditem.UserId]; ok{
+				//	first = "您预约的调研,有关联的纪要发布/更新了"
+				//	keyword1 = industryName
+				//	SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				//	delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+				//	mapAlreadySend[openIditem.UserId] = openIditem.UserId
+				//}
+			}
+
+			//如果有权限而且小助手没有提交过信息的 就做正常推送
+			_, ok := mapAlreadySend[openIditem.UserId]
+			if mapUserIdChooseSend[openIditem.UserId] == 0 && !ok {
+				SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+				mapAlreadySend[openIditem.UserId] = openIditem.UserId
+			}
+			//如果小助手勾选了对应的权限信息 就做正常推送
+			if mapUserIdChooseSend[openIditem.UserId] != 0 && mapOpenidFllow[openIditem.UserId] != "" && mapUserIdChooseSendType[openIditem.UserId] > 0 && !ok {
+				SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+				mapAlreadySend[openIditem.UserId] = openIditem.UserId
+			}
+		}
+
+		//获取提交过推送规则的用户的 openid 并推送模版消息
+		openIditem := new(models.OpenIdList)
+		first := "您关注的赛道,有新的报告发布/更新,欢迎查看"
+		keyword1 := "所属赛道:" + industryName
+		//mapActivityUserId := make(map[int]string)
+		//if articleInfo.IsSummary == 1 {
+		//	sliceSubjectId, _ := models.GetSubjectIds(articleId)
+		//	if sliceSubjectId != ""{
+		//		appointmentList, err := models.GetCygxAppointmentSummaryBySubjectId(sliceSubjectId)
+		//		if err != nil {
+		//			fmt.Println("GetCygxAppointmentSummaryListBySubjectId Err:", err.Error())
+		//			return err
+		//		}
+		//		if len(appointmentList) > 0 {
+		//			for _, v := range appointmentList {
+		//				fmt.Println("mapActivityUserId:", v.UserId)
+		//				mapActivityUserId[v.UserId] += v.ActivityName + ","
+		//				first = "您预约的调研,有关联的纪要发布/更新了"
+		//				keyword1 = industryName
+		//				if _, ok := mapAlreadySend[openIditem.UserId]; !ok{
+		//					SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+		//					delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+		//					mapAlreadySend[openIditem.UserId] = openIditem.UserId
+		//				}
+		//			}
+		//		}
+		//	}
+		//	//fmt.Println("openIditem.UserId:", openIditem.UserId)
+		//	//if _,ok := mapActivityUserId[openIditem.UserId]; ok{
+		//	//	first = "您预约的调研,有关联的纪要发布/更新了"
+		//	//	keyword1 = industryName
+		//	//	SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+		//	//	delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+		//	//	mapAlreadySend[openIditem.UserId] = openIditem.UserId
+		//	//}
+		//}
+		var ids []string
+		for k, _ := range mapUserIdChooseSendTypeNoPermission {
+			ids = append(ids, strconv.Itoa(k))
+		}
+		if len(ids) > 0 {
+			idStr := strings.Join(ids, ",")
+			openidIlist, err := models.GetCygxXzsChooseSendOpenIdByUserIds(idStr)
+			if err != nil {
+				return err
+			}
+			for _, item := range openidIlist {
+				openIditem.OpenId = item.OpenId
+				openIditem.UserId = item.UserId
+				if _, ok := mapAlreadySend[openIditem.UserId]; !ok {
+					SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				}
 			}
 		}
-		//【公司调研】系列纪要发布/更新后 end
 	}
-	go models.UpdateCygxArticleCeluePush(celuePushId)
-	return err
+	utils.Rc.Put(cacheKey, articleId, time.Hour*12)
+	return
 }

+ 87 - 7
services/chart.go

@@ -39,7 +39,7 @@ func PublicGetDate(url, authorization string) (body []byte, err error) {
 	return
 }
 
-//获取列表
+//同步图表列表
 func GetChartListByApi(cont context.Context) (err error) {
 	defer func() {
 		if err != nil {
@@ -47,6 +47,24 @@ func GetChartListByApi(cont context.Context) (err error) {
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetArticleListByApi ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
 	}()
+	mapChartid := make(map[int]int)
+	chartList, err := models.GetChartListAll()
+	if err != nil {
+		return
+	}
+	for _, v := range chartList {
+		mapChartid[v.ChartId] = v.ChartId
+	}
+
+	mapAllChartid := make(map[int]int)
+	chartAllList, err := models.GetChartAllListAll()
+	if err != nil {
+		return
+	}
+	for _, v := range chartAllList {
+		mapAllChartid[v.ChartId] = v.ChartId
+	}
+
 	url := utils.ApiUrl + "charts/mp?take=100&skip=0"
 	authorization := utils.ApiAuthorization
 	body, err := PublicGetDate(url, authorization)
@@ -77,11 +95,9 @@ func GetChartListByApi(cont context.Context) (err error) {
 		item.CtagIdTwo = v.CtagTwo.Id
 		item.Cover = v.Cover
 		item.Iframe = v.Iframe
-		count, err := models.GetChartCountById(v.ChartId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			return err
-		}
-		if count == 0 {
+
+		//如果没有就新增 有就更新
+		if mapChartid[v.ChartId] == 0 {
 			_, err := models.AddCygxChart(item)
 			if err != nil {
 				return err
@@ -104,6 +120,70 @@ func GetChartListByApi(cont context.Context) (err error) {
 			updateParams["Iframe"] = v.Iframe
 			whereParam := map[string]interface{}{"chart_id": v.ChartId}
 			err = models.UpdateByExpr(models.CygxChart{}, whereParam, updateParams)
+			if err != nil {
+				return err
+			}
+		}
+	}
+
+	//策略平台图表,记录所有,的显示用户收藏使用
+	url = utils.ApiUrl + "charts?take=100&skip=0" // 获取所有的图表链接
+	body, err = PublicGetDate(url, authorization)
+	if err != nil {
+		return
+	}
+
+	err = json.Unmarshal(body, &chartResult)
+	if err != nil {
+		return err
+	}
+	for _, v := range chartResult.Data {
+		item := new(models.CygxChartAll)
+		item.ChartId = v.ChartId
+		item.PtagId = v.PtagId
+		item.CtagId = v.CtagId
+		item.Title = v.Title
+		item.TitleEn = v.TitleEn
+		item.CreateDateApi = time.Now()
+		item.CreateDate = v.CreateDate
+		item.PublishStatus = v.PublishStatus
+		item.PtagName = v.Ptag.Name
+		item.CtagName = v.Ctag.Name
+
+		item.PtagNameTwo = v.PtagTwo.Name
+		item.CtagNameTwo = v.CtagTwo.Name
+		item.PtagIdTwo = v.PtagTwo.Id
+		item.CtagIdTwo = v.CtagTwo.Id
+		item.Cover = v.Cover
+		item.Iframe = v.Iframe
+
+		//如果没有就新增 有就更新
+		if mapAllChartid[v.ChartId] == 0 {
+			_, err := models.AddCygxChartAll(item)
+			if err != nil {
+				return err
+			}
+		} else {
+			updateParams := make(map[string]interface{})
+			updateParams["Title"] = v.Title
+			updateParams["PtagId"] = v.PtagId
+			updateParams["CtagId"] = v.CtagId
+			updateParams["TitleEn"] = v.TitleEn
+			updateParams["CreateDate"] = v.CreateDate
+			updateParams["PublishStatus"] = v.PublishStatus
+			updateParams["PtagName"] = v.Ptag.Name
+			updateParams["CtagName"] = v.Ctag.Name
+			updateParams["PtagNameTwo"] = v.PtagTwo.Name
+			updateParams["CtagNameTwo"] = v.CtagTwo.Name
+			updateParams["PtagIdTwo"] = v.PtagTwo.Id
+			updateParams["CtagIdTwo"] = v.CtagTwo.Id
+			updateParams["Cover"] = v.Cover
+			updateParams["Iframe"] = v.Iframe
+			whereParam := map[string]interface{}{"chart_id": v.ChartId}
+			err = models.UpdateByExpr(models.CygxChartAll{}, whereParam, updateParams)
+			if err != nil {
+				return err
+			}
 		}
 	}
 	return
@@ -221,7 +301,7 @@ func GetChartCollectionByApi(mobile string, take, skip int) (items []*models.Hom
 		item.PtagName = v.ChartInfo.Ptag.Name
 		item.CtagName = v.ChartInfo.Ctag.Name
 		item.BodyHtml = v.ChartInfo.Cover
-		item.HttpUrl = "https://vmp.hzinsights.com/v2/charts/" + strconv.Itoa(v.ChartId)
+		item.HttpUrl = utils.CHART_INFO_HTTP_URL + strconv.Itoa(v.ChartId)
 		item.IsNeedJump = true
 		items = append(items, item)
 	}

+ 4 - 0
services/task.go

@@ -74,6 +74,10 @@ func Task() {
 
 		getCeLueArticlePv := task.NewTask("getCeLueArticlePv", "0 */10 * * * *", GetCeLueArticlePv) //通过三方接口获取策略平台上的阅读记录
 		task.AddTask("getCeLueArticlePv", getCeLueArticlePv)
+
+		doActivityOnenIdWxTemplateMsg := task.NewTask("doActivityOnenIdWxTemplateMsg", "0 0 16 * * 0", DoActivityOnenIdWxTemplateMsg) ////周日下午四点半推送全部活动
+		task.AddTask("doActivityOnenIdWxTemplateMsg", doActivityOnenIdWxTemplateMsg)
+
 	}
 	if utils.RunMode != "release" {
 		getArticleListByApi := task.NewTask("getArticleListByApi", "0 */60 * * * *", GetArticleListByApi) //通过三方接口获取策略平台上的文章

+ 2 - 0
services/user.go

@@ -432,6 +432,8 @@ func SendEmailUserWhiteListChange(cont context.Context) (err error) {
 		mobileStr = "1"
 	}
 	mobileStr = strings.Replace(mobileStr, " ", "", -1)
+	mobileStr = strings.Replace(mobileStr, ",", "','", -1)
+	mobileStr = "'" + mobileStr + "'"
 	//手机号新增
 	fieldStr = ` u.mobile,u.country_code,u.real_name,c.company_name,u.company_id,cp.seller_name,cp.status,`
 	condition = `  AND cp.status IN ( '正式', '试用' ) AND u.mobile IN (` + mobileStr + `) `

+ 77 - 0
services/wx_template_msg.go

@@ -487,3 +487,80 @@ func SendTemplateMsg(sendUrl string, data []byte, resource string, sendType int,
 	}
 	return
 }
+
+//发送报告更新的消息给预约的用户
+func SendWxMsgWithArticleUpdate(first, keyWord1, keyWord2, keyWord3, keyWord4 string, item *models.OpenIdList, articleId int) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+	}()
+	accessToken, err := models.GetWxAccessTokenByXzs()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+	var openIdList []*models.OpenIdList
+	openIdList = append(openIdList, item)
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	templateId := utils.TemplateIdByProductXzs
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+	sendMap["template_id"] = templateId
+	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId)}
+	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
+	sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
+	sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
+	sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
+	sendData["remark"] = map[string]interface{}{"value": "点击查看活动详情", "color": "#173177"}
+	sendMap["data"] = sendData
+	WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+	return
+}
+
+//周日下午4点半,推送全部活动
+func SendActivityOnenIdWxTemplateMsg(first, keyWord1, keyWord2, keyWord3, keyWord4 string, openIdList []*models.OpenIdList) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("周日下午4点半,推送全部活"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg(fmt.Sprint("发送周日下午4点半,推送全部活模版消息失败,"), 2)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+	}()
+	accessToken, err := models.GetWxAccessTokenByXzs()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+	//var openIdList []*models.OpenIdList
+	//openIdList = append(openIdList, item)
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	templateId := utils.WxMsgTemplateIdArticleUserRemind
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+	sendMap["template_id"] = templateId
+	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pages/activity/activity"}
+	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId}
+	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
+	sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
+	sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
+	sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
+	sendData["remark"] = map[string]interface{}{"value": "点击查看下周活动列表", "color": "#173177"}
+	sendMap["data"] = sendData
+	WxSendTemplateMsg(sendUrl, sendMap, openIdList, "", utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+	return
+}

+ 31 - 0
utils/common.go

@@ -11,6 +11,7 @@ import (
 	"image/png"
 	"math"
 	"math/rand"
+	"net"
 	"os"
 	"os/exec"
 	"regexp"
@@ -675,3 +676,33 @@ func GetAttendanceDetailSeconds(secondNum int) string {
 	}
 	return timeStr
 }
+
+// GetOrmInReplace 获取orm的in查询替换?的方法
+func GetOrmInReplace(num int) string {
+	template := make([]string, num)
+	for i := 0; i < num; i++ {
+		template[i] = "?"
+	}
+	return strings.Join(template, ",")
+}
+
+func GetLocalIP() (ip string, err error) {
+	addrs, err := net.InterfaceAddrs()
+	if err != nil {
+		return
+	}
+	for _, addr := range addrs {
+		ipAddr, ok := addr.(*net.IPNet)
+		if !ok {
+			continue
+		}
+		if ipAddr.IP.IsLoopback() {
+			continue
+		}
+		if !ipAddr.IP.IsGlobalUnicast() {
+			continue
+		}
+		return ipAddr.IP.String(), nil
+	}
+	return
+}

+ 22 - 4
utils/config.go

@@ -83,14 +83,32 @@ func init() {
 	}
 	fmt.Println("line 80:", tmpRunMode, err)
 	RunMode = tmpRunMode
+	//if RunMode == "" {
+	//	RunMode = "release"
+	//	configPath := `/home/code/config/hongze_cygx/conf/app.conf`
+	//	err := web.LoadAppConfig("ini", configPath)
+	//	if err != nil {
+	//		fmt.Println("web.LoadAppConfig Err:" + err.Error())
+	//	}
+	//}
+	fmt.Println("RunMode:", RunMode)
 	if RunMode == "" {
-		RunMode = "release"
-		configPath := `/home/code/config/hongze_cygx/conf/app.conf`
-		err := web.LoadAppConfig("ini", configPath)
+		localIp, err := GetLocalIP()
+		fmt.Println("localIp:", localIp)
+		if localIp == "10.0.0.123" {
+			RunMode = "debug"
+		} else {
+			RunMode = "release"
+		}
+		fmt.Println("RunMode:", RunMode)
+		configPath := `/home/code/config/hongze_admin/conf/app.conf`
+		fmt.Println("configPath:", configPath)
+		err = web.LoadAppConfig("ini", configPath)
 		if err != nil {
 			fmt.Println("web.LoadAppConfig Err:" + err.Error())
 		}
 	}
+
 	config, err := web.AppConfig.GetSection(RunMode)
 	if err != nil {
 		panic("配置文件读取错误 " + err.Error())
@@ -136,7 +154,7 @@ func init() {
 		WxPublicAppId = "wx4a844c734d8c8e56"
 		WxPublicAppSecret = "26c586e7ccb3c575433f0f37797b3eeb"
 		WxPublicId = "gh_b67e0049fb8c"
-		IndexName = "cygx_article_v0622"
+		IndexName = "cygx_article_v0718"
 		IndexNameArticleHistory = "cygx_article_history_v07_08"
 
 		//接收附件邮箱

+ 12 - 7
utils/constants.go

@@ -61,7 +61,8 @@ var (
 
 //缓存key
 const (
-	CACHE_KEY_USER_VIEW = "user_view_record" //用户阅读数据
+	CACHE_KEY_USER_VIEW           = "user_view_record"           //用户阅读数据
+	CACHE_KEY_ARTICLE_ID_TEMPLATE = "ce_lue_article_id_template" //策略平台同步过来的文章ID,做微信模板消息推送,同一篇报告12小时只推送一次
 )
 
 //模板消息推送类型
@@ -72,13 +73,17 @@ const (
 )
 
 const (
-	CHART_PERMISSION_NAME_YANXUAN    = "研选"
-	CHART_PERMISSION_NAME_MF_YANXUAN = "买方研选"
-	CHART_PERMISSION_ID_YANXUAN      = 31
-	C_CLASS_ACTIVITY_TYPE_ID         = 7 //C类电话会会议ID
-	ANALYST_TELL_ACTIVITY_TYPE_ID    = 2 //分析师电话会ID
+	LINK_WX_EXPLAIN = "https://mp.weixin.qq.com/s?__biz=Mzg2OTYzODk0Nw==&mid=2247483662&idx=1&sn=3752df99025189b9d77fe658bfc0edbd&chksm=ce98b742f9ef3e54b49986e647dd951a3aad74f323174b252174e0938c264c0562c8ec455106#rd" //用户阅读数据
+
+	CHART_PERMISSION_NAME_YANXUAN    string = "研选"
+	CHART_PERMISSION_NAME_MF_YANXUAN string = "买方研选"
+	CHART_PERMISSION_ID_YANXUAN      int    = 31
+	CE_LUE_NAME                      string = "策略"
+	CE_LUE_ID                        int    = 23
+	C_CLASS_ACTIVITY_TYPE_ID                = 7 //C类电话会会议ID
+	ANALYST_TELL_ACTIVITY_TYPE_ID           = 2 //分析师电话会ID
 )
 
 const (
-	LINK_WX_EXPLAIN = "https://mp.weixin.qq.com/s?__biz=Mzg2OTYzODk0Nw==&mid=2247483662&idx=1&sn=3752df99025189b9d77fe658bfc0edbd&chksm=ce98b742f9ef3e54b49986e647dd951a3aad74f323174b252174e0938c264c0562c8ec455106#rd" //用户阅读数据
+	CHART_INFO_HTTP_URL = "https://vmp.hzinsights.com/v2/charts/"
 )