Bläddra i källkod

C类电话会

xingzai 2 år sedan
förälder
incheckning
55ba16d7c1

+ 64 - 2
controllers/activity.go

@@ -3256,6 +3256,12 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 	if activeState == "undefined" || activeState == "" {
 		activeState = "1"
 	}
+	adminIds, err := models.GetSelleridWhichGroup(user.CompanyId, 2)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取本组下的销售失败,Err:" + err.Error()
+		return
+	}
 	userType, permissionStr, err := services.GetUserType(user.CompanyId)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -3296,10 +3302,17 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 		br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
 		return
 	}
+	isMaker := user.IsMaker
+
 	var sqlExport string
 	resp := new(models.ActivityTypeListHomeResp)
 	for k, v := range list {
+		// 如果是C类电话会就不展示内容,且合并到分析师电话会
+		if v.ActivityTypeId == utils.C_CLASS_ACTIVITY_TYPE_ID {
+			continue
+		}
 		var condition string
+		var conditionAdmin string
 		permissionSqlStr = ` AND art.chart_permission_name  IN (` + permissionNameStr + `)`
 		sqlExport = ` AND (art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' `
 		if userType == 2 {
@@ -3309,7 +3322,16 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 			sqlExport += ` OR  art.customer_type_ids LIKE '%4%' `
 		}
 		sqlExport += `) `
-		condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id = ` + strconv.Itoa(v.ActivityTypeId)
+		if v.ActivityTypeId == utils.ANALYST_TELL_ACTIVITY_TYPE_ID {
+			condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id IN (` + strconv.Itoa(v.ActivityTypeId) + "," + strconv.Itoa(utils.C_CLASS_ACTIVITY_TYPE_ID) + `)`
+		} else {
+			condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id = ` + strconv.Itoa(v.ActivityTypeId)
+		}
+		//活动仅决策人可见
+		if isMaker == 0 {
+			condition += ` AND art.is_maker_show = 0  `
+		}
+
 		if isPower == 1 {
 			condition += permissionSqlStr
 		}
@@ -3344,6 +3366,10 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 		} else {
 			condition += ` AND art.active_state  IN (1,2)`
 		}
+		conditionAdmin = condition
+		//查询全部可见的数据(是否全部客户可见)
+		condition += ` AND art.visible_range != 1  `
+
 		if (userType == 2 || userType == 3 || userType == 4) && strings.Contains(permissionStr, "专家") {
 			conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%4%'	 ` + condition + `) `
 		}
@@ -3360,6 +3386,10 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 				conditionOr += ` OR (  art.scale LIKE '%` + companyProduct.Scale + `%'	 ` + condition + `) `
 			}
 		}
+		if adminIds != "" {
+			conditionOr += ` OR ( art.admin_id IN (` + adminIds + `) ` + conditionAdmin + `) `
+		}
+
 		condition += `AND art.is_limit_people = 1 ` + permissionSqlStr + sqlExport + conditionOr
 		sortTime = ` mintimesort ASC `
 		labelList, err := models.GetActivityLabelListAll(condition, sortTime, pars, startSize, pageSize)
@@ -4273,12 +4303,19 @@ func (this *ActivityCoAntroller) LabelTypeListV6Pc() {
 	if activeState == "undefined" || activeState == "" || activeState == "1" {
 		activeState = "1,2"
 	}
+	adminIds, err := models.GetSelleridWhichGroup(user.CompanyId, 2)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取本组下的销售失败,Err:" + err.Error()
+		return
+	}
 	userType, permissionStr, err := services.GetUserType(user.CompanyId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	isMaker := user.IsMaker
 
 	var startSize int
 	pageSize = 8
@@ -4326,9 +4363,24 @@ func (this *ActivityCoAntroller) LabelTypeListV6Pc() {
 	sqlExport += `) `
 	resp := new(models.ActivityTypeListHomeRespPc)
 	for k, v := range list {
+		// 如果是C类电话会就不展示内容,且合并到分析师电话会
+		if v.ActivityTypeId == utils.C_CLASS_ACTIVITY_TYPE_ID {
+			continue
+		}
 		var condition string
+		var conditionAdmin string
 		permissionSqlStr = ` AND art.chart_permission_name  IN (` + permissionNameStr + `)`
-		condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id = ` + strconv.Itoa(v.ActivityTypeId)
+		if v.ActivityTypeId == utils.ANALYST_TELL_ACTIVITY_TYPE_ID {
+			condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id IN (` + strconv.Itoa(v.ActivityTypeId) + "," + strconv.Itoa(utils.C_CLASS_ACTIVITY_TYPE_ID) + `)`
+		} else {
+			condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id = ` + strconv.Itoa(v.ActivityTypeId)
+		}
+		//活动仅决策人可见
+		if isMaker == 0 {
+			condition += ` AND art.is_maker_show = 0  `
+		}
+
+		//condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id = ` + strconv.Itoa(v.ActivityTypeId)
 		if isPower == 1 {
 			condition += permissionSqlStr
 		}
@@ -4353,11 +4405,17 @@ func (this *ActivityCoAntroller) LabelTypeListV6Pc() {
 			condition += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
 			condition += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
 		}
+
 		if activeState != "" {
 			condition += ` AND art.active_state  IN (` + activeState + `)`
 		} else {
 			condition += ` AND art.active_state  IN (1,2)`
 		}
+
+		conditionAdmin = condition
+		//查询全部可见的数据(是否全部客户可见)
+		condition += ` AND art.visible_range != 1  `
+
 		if (userType == 2 || userType == 3 || userType == 4) && strings.Contains(permissionStr, "专家") {
 			conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%4%'	 ` + condition + `) `
 		}
@@ -4375,6 +4433,10 @@ func (this *ActivityCoAntroller) LabelTypeListV6Pc() {
 				conditionOr += ` OR (  art.scale LIKE '%` + companyProduct.Scale + `%'	 ` + condition + `) `
 			}
 		}
+
+		if adminIds != "" {
+			conditionOr += ` OR ( art.admin_id IN (` + adminIds + `) ` + conditionAdmin + `) `
+		}
 		condition += `AND art.is_limit_people = 1 ` + permissionSqlStr + sqlExport + conditionOr
 		sortTime = ` mintimesort ASC `
 		labelList, err := models.GetActivityLabelListAll(condition, sortTime, pars, startSize, pageSize)

+ 15 - 16
controllers/article.go

@@ -5,7 +5,6 @@ import (
 	"github.com/pdfcpu/pdfcpu/pkg/api"
 	"github.com/pdfcpu/pdfcpu/pkg/pdfcpu"
 	"io"
-
 	//"bufio"
 	"encoding/json"
 	"fmt"
@@ -20,8 +19,7 @@ import (
 	"html"
 
 	nhttp "net/http"
-	//"os"
-	"regexp"
+
 	"strconv"
 	"strings"
 	"time"
@@ -566,19 +564,20 @@ func (this *ArticleCommonController) Detail() {
 		br.ErrMsg = "获取销售数据失败,Err:" + err.Error() + ";articleId" + strconv.Itoa(detail.ArticleId)
 		return
 	}
-	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)
-			}
-		}
-	}
+	//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

+ 3 - 3
models/activity_signup.go

@@ -556,10 +556,10 @@ func GetCygxActivitySignupByMobileList(condition string) (items []*CygxActivityS
 	return
 }
 
-//修改用户关注作者的相关信息
+//修改用户报名的相关信息
 func UpdateCygxActivitySignup(wxUser *WxUserItem) (err error) {
 	o := orm.NewOrm()
-	sql := `UPDATE cygx_activity_signup SET email=?,company_id=?,company_name=?,mobile=?,real_name=? WHERE  user_id=? `
-	_, err = o.Raw(sql, wxUser.Email, wxUser.CompanyId, wxUser.CompanyName, wxUser.Mobile, wxUser.RealName, wxUser.UserId).Exec()
+	sql := `UPDATE cygx_activity_signup SET email=?,company_id=?,company_name=?,user_id=?,real_name=? WHERE  mobile=? `
+	_, err = o.Raw(sql, wxUser.Email, wxUser.CompanyId, wxUser.CompanyName, wxUser.UserId, wxUser.RealName, wxUser.Mobile).Exec()
 	return
 }

+ 8 - 2
models/article_collect.go

@@ -78,7 +78,13 @@ func GetCygxArticleCollectList(condition string) (items []*CygxArticleCollect, e
 //修改用户收藏文章的相关信息
 func UpdateCygxArticleCollect(wxUser *WxUserItem) (err error) {
 	o := orm.NewOrm()
-	sql := `UPDATE cygx_article_collect SET email=?,company_id=?,company_name=?,mobile=?,real_name=? WHERE user_id=? `
-	_, err = o.Raw(sql, wxUser.Email, wxUser.CompanyId, wxUser.CompanyName, wxUser.Mobile, wxUser.RealName, wxUser.UserId).Exec()
+	var sql string
+	if wxUser.Mobile != "" {
+		sql = `UPDATE cygx_article_collect SET email=?,company_id=?,company_name=?,user_id=?,real_name=? WHERE mobile=? `
+		_, err = o.Raw(sql, wxUser.Email, wxUser.CompanyId, wxUser.CompanyName, wxUser.UserId, wxUser.RealName, wxUser.Mobile).Exec()
+	} else if wxUser.Email != "" {
+		sql = `UPDATE cygx_article_collect SET user_id=?,company_id=?,company_name=?,mobile=?,real_name=? WHERE email=? `
+		_, err = o.Raw(sql, wxUser.UserId, wxUser.CompanyId, wxUser.CompanyName, wxUser.Mobile, wxUser.RealName, wxUser.Email).Exec()
+	}
 	return
 }

+ 9 - 2
models/article_department_follow.go

@@ -67,7 +67,14 @@ func GetArticleDepartmentFollowByMobileList(condition string) (items []*CygxArti
 //修改用户关注作者的相关信息
 func UpdateCygxArticleDepartmentFollow(wxUser *WxUserItem) (err error) {
 	o := orm.NewOrm()
-	sql := `UPDATE cygx_article_department_follow SET email=?,company_id=?,company_name=?,user_id=?,real_name=? WHERE mobile=? `
-	_, err = o.Raw(sql, wxUser.Email, wxUser.CompanyId, wxUser.CompanyName, wxUser.UserId, wxUser.RealName, wxUser.Mobile).Exec()
+	var sql string
+	if wxUser.Mobile != "" {
+		sql = `UPDATE cygx_article_department_follow SET email=?,company_id=?,company_name=?,user_id=?,real_name=? WHERE mobile=? `
+		_, err = o.Raw(sql, wxUser.Email, wxUser.CompanyId, wxUser.CompanyName, wxUser.UserId, wxUser.RealName, wxUser.Mobile).Exec()
+	} else if wxUser.Email != "" {
+		sql = `UPDATE cygx_article_department_follow SET mobile=?,company_id=?,company_name=?,user_id=?,real_name=? WHERE email=? `
+		_, err = o.Raw(sql, wxUser.Mobile, wxUser.CompanyId, wxUser.CompanyName, wxUser.UserId, wxUser.RealName, wxUser.Email).Exec()
+	}
+
 	return
 }

+ 91 - 2
models/article_history_record_newpv.go

@@ -170,7 +170,96 @@ func GetArticleHistoryRecordAllByMobileList(condition string) (items []*CygxArti
 //修改用户阅读的相关信息
 func UpdateCygxArticleHistoryRecordAll(wxUser *WxUserItem) (err error) {
 	o := orm.NewOrm()
-	sql := `UPDATE cygx_article_history_record_all SET email=?,company_id=?,company_name=?,user_id=?,real_name=? WHERE mobile=? `
-	_, err = o.Raw(sql, wxUser.Email, wxUser.CompanyId, wxUser.CompanyName, wxUser.UserId, wxUser.RealName, wxUser.Mobile).Exec()
+	var sql string
+	if wxUser.Mobile != "" {
+		sql = `UPDATE cygx_article_history_record_all SET email=?,company_id=?,company_name=?,user_id=?,real_name=? WHERE mobile=? `
+		_, err = o.Raw(sql, wxUser.Email, wxUser.CompanyId, wxUser.CompanyName, wxUser.UserId, wxUser.RealName, wxUser.Mobile).Exec()
+	} else if wxUser.Email != "" {
+		sql = `UPDATE cygx_article_history_record_all SET mobile=?,company_id=?,company_name=?,user_id=?,real_name=? WHERE email=? `
+		_, err = o.Raw(sql, wxUser.Mobile, wxUser.CompanyId, wxUser.CompanyName, wxUser.UserId, wxUser.RealName, wxUser.Email).Exec()
+	}
+	return
+}
+
+type EsUserInteraction struct {
+	Id                       int    `description:"主键ID"`
+	ArticleId                int    `description:"文章id"`
+	ArticleType              int    `description:"文章类型 1:查研观向, 2:策略平台"`
+	Title                    string `description:"标题"`
+	PublishDate              string `description:"发布时间"`
+	CreateTime               string `description:"创建时间"`
+	StopTime                 string `description:"阅读停留时间"`
+	RealName                 string `description:"姓名"`
+	CompanyName              string `description:"公司名称"`
+	CompanyId                int    `description:"公司ID"`
+	SellerName               string `description:"所属销售"`
+	SellerId                 int    `description:"所属销售ID"`
+	Mobile                   string `description:"手机号"`
+	Email                    string `description:"邮箱"`
+	UserId                   int    `description:"用户ID"`
+	UserArticleHistoryNum    int    `description:"用户阅读数量"`
+	CompanyArticleHistoryNum int    `description:"机构阅读数量"`
+}
+
+//机构阅读记录列表
+func GetCygxArticleHistoryRecordByCompanyList(condition string, startSize, pageSize int) (items []*EsUserInteraction, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT
+			r.id,
+			art.title,
+			art.article_id,
+			art.article_id_md5,
+			art.publish_date,
+			art.category_name,
+			r.create_time,
+			r.mobile,
+			r.user_id,
+			r.company_name,
+			cp.seller_name,
+			cp.seller_id,
+			cp.company_id,
+			r.real_name,
+			r.stop_time,
+			ci.article_history_num AS company_article_history_num,
+			ui.article_history_num AS user_article_history_num 
+		FROM
+			cygx_article_history_record_all AS r
+			INNER JOIN cygx_article AS art ON art.article_id = r.article_id
+			INNER JOIN company_product AS cp ON cp.company_id = r.company_id 
+			AND cp.product_id = 2
+			INNER JOIN cygx_company_interaction_num AS ci ON ci.company_id = r.company_id
+			INNER JOIN cygx_user_interaction_num AS ui ON ui.user_id = r.user_id 
+		WHERE
+			1 = 1 
+			AND r.is_del = 0 ` + condition + ` GROUP BY r.id  `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+//获取阅读记录数量
+func GetCygxArticleHistoryCountByCompany(condition string) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := `SELECT
+	COUNT( 1 ) AS count 
+FROM
+	(
+	SELECT
+		COUNT( 1 ) 
+	FROM
+		cygx_article_history_record_all AS r
+		INNER JOIN cygx_article AS art ON art.article_id = r.article_id
+		INNER JOIN company_product AS cp ON cp.company_id = r.company_id 
+		AND cp.product_id = 2
+		INNER JOIN cygx_company_interaction_num AS ci ON ci.company_id = r.company_id
+		INNER JOIN cygx_user_interaction_num AS ui ON ui.user_id = r.user_id 
+	WHERE
+		r.is_del = 0 ` + condition + `
+	GROUP BY
+	r.id 
+	) AS count `
+	err = o.Raw(sqlCount).QueryRow(&count)
 	return
 }

+ 14 - 0
models/company.go

@@ -106,6 +106,20 @@ func GetCompanyPermissionByUser(companyId int) (permission string, err error) {
 	return
 }
 
+//获取用户权限不限制状态
+func GetCompanyPermissionByUserNoStatus(companyId int) (permission string, err error) {
+	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC  SEPARATOR ',') AS permission
+			FROM company_report_permission AS a
+			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
+			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
+			WHERE  a.company_id=?
+			AND c.is_suspend=0
+            AND b.cygx_auth=1`
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId).QueryRow(&permission)
+	return
+}
+
 //获取正式权限
 func GetCompanyPermissionByUserZhengShi(companyId int) (permission string, err error) {
 	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC  SEPARATOR ',') AS permission

+ 8 - 2
models/industry_fllow.go

@@ -67,7 +67,13 @@ func GetCygxIndustryFllowList(condition string) (items []*CygxIndustryFllow, err
 //修改用户关注的相关信息
 func UpdateCygxIndustryFllow(wxUser *WxUserItem) (err error) {
 	o := orm.NewOrm()
-	sql := `UPDATE cygx_industry_fllow SET email=?,company_id=?,company_name=?,user_id=?,real_name=? WHERE mobile=? `
-	_, err = o.Raw(sql, wxUser.Email, wxUser.CompanyId, wxUser.CompanyName, wxUser.Mobile, wxUser.RealName, wxUser.UserId).Exec()
+	var sql string
+	if wxUser.Mobile != "" {
+		sql = `UPDATE cygx_industry_fllow SET email=?,company_id=?,company_name=?,user_id=?,real_name=? WHERE mobile=? `
+		_, err = o.Raw(sql, wxUser.Email, wxUser.CompanyId, wxUser.CompanyName, wxUser.UserId, wxUser.RealName, wxUser.Mobile).Exec()
+	} else if wxUser.Email != "" {
+		sql = `UPDATE cygx_industry_fllow SET mobile=?,company_id=?,company_name=?,user_id=?,real_name=? WHERE mobile=? `
+		_, err = o.Raw(sql, wxUser.Mobile, wxUser.CompanyId, wxUser.CompanyName, wxUser.UserId, wxUser.RealName, wxUser.Email).Exec()
+	}
 	return
 }

+ 8 - 2
models/search_key_word.go

@@ -50,7 +50,13 @@ func GetCygxSearchKeyWordList(condition string) (items []*CygxSearchKeyWord, err
 //修改用户收藏文章的相关信息
 func UpdateCygxSearchKeyWord(wxUser *WxUserItem) (err error) {
 	o := orm.NewOrm()
-	sql := `UPDATE cygx_search_key_word SET email=?,company_id=?,company_name=?,mobile=?,real_name=? WHERE user_id=? `
-	_, err = o.Raw(sql, wxUser.Email, wxUser.CompanyId, wxUser.CompanyName, wxUser.Mobile, wxUser.RealName, wxUser.UserId).Exec()
+	var sql string
+	if wxUser.Mobile != "" {
+		sql = `UPDATE cygx_search_key_word SET email=?,company_id=?,company_name=?,user_id=?,real_name=? WHERE mobile=? `
+		_, err = o.Raw(sql, wxUser.Email, wxUser.CompanyId, wxUser.CompanyName, wxUser.UserId, wxUser.RealName, wxUser.Mobile).Exec()
+	} else if wxUser.Email != "" {
+		sql = `UPDATE cygx_search_key_word SET mobile=?,company_id=?,company_name=?,user_id=?,real_name=? WHERE email=? `
+		_, err = o.Raw(sql, wxUser.Mobile, wxUser.CompanyId, wxUser.CompanyName, wxUser.UserId, wxUser.RealName, wxUser.Email).Exec()
+	}
 	return
 }

+ 23 - 0
models/seller.go

@@ -46,3 +46,26 @@ func GetSellerByName(userName string) (item *AdminItem, err error) {
 	err = o.Raw(sql, userName).QueryRow(&item)
 	return
 }
+
+//获取本组的销售ID
+func GetSelleridWhichGroup(companyId, productId int) (adminId string, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT
+			GROUP_CONCAT( DISTINCT admin_id SEPARATOR ',' ) AS adminId
+			FROM
+			admin
+			WHERE
+			group_id IN (
+			SELECT
+			a.group_id
+			FROM
+			company_product AS a
+			INNER JOIN admin AS b ON a.seller_id = b.admin_id
+			INNER JOIN wx_user AS c ON b.mobile = c.mobile
+			WHERE
+			a.company_id = ?
+			AND a.product_id = ?
+)`
+	err = o.Raw(sql, companyId, productId).QueryRow(&adminId)
+	return
+}

+ 11 - 3
models/send_company_user.go

@@ -225,15 +225,23 @@ 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') AND create_time >=  '` + createTime + `' AND company_id > 1 GROUP BY company_id `
+	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 `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
 
 //获取指定时间内被移动的用户
-func GetWxUserOpLogList(createTime string) (items []*WxUserOpLogResp, err error) {
+func GetWxUserOpLogList(startDate, endDate string) (items []*WxUserOpLogResp, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT company_id,user_id,mobile FROM wx_user_op_log WHERE  log_type IN ('move','add') AND create_time >=  '` + createTime + `' AND company_id > 1 GROUP BY user_id `
+	sql := ` SELECT company_id,user_id,mobile FROM wx_user_op_log WHERE  log_type IN ('move','add') AND create_time >=  '` + startDate + `' AND create_time <=  '` + endDate + `'   GROUP BY user_id `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+//获取指定时间内被删除的用户
+func GetWxUserOpLogDeleteList(startDate, endDate string) (items []*WxUserOpLogResp, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT company_id,user_id,mobile FROM wx_user_op_log WHERE  log_type IN ('delete') AND create_time >=  '` + startDate + `' AND create_time <=  '` + endDate + `'   GROUP BY user_id `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }

+ 1 - 0
models/wx_user.go

@@ -82,6 +82,7 @@ type WxUserItem struct {
 	OutboundMobile      string    `description:"外呼手机号"`
 	OutboundCountryCode string    `description:"外呼手机号区号"`
 	IsMsgOutboundMobile int       `description:"是否弹窗过绑定外呼手机号区号"`
+	IsMaker             int       `description:"是否是决策人"`
 	Source              int
 }
 

+ 6 - 2
services/activity.go

@@ -308,7 +308,7 @@ func EditUserOutboundMobile(cont context.Context) (err error) {
 	return
 }
 
-//获取 用户类型   //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
+//获取 用户类型   //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户;6、冻结客户;7、流失客户
 func GetUserType(companyId int) (userType int, permissionStrnew string, err error) {
 
 	var permissionStr, permissionZhegnshiStr string
@@ -328,7 +328,7 @@ func GetUserType(companyId int) (userType int, permissionStrnew string, err erro
 				err = errs
 				return
 			}
-			permissionStr, errs = models.GetCompanyPermissionByUser(companyId)
+			permissionStr, errs = models.GetCompanyPermissionByUserNoStatus(companyId)
 			if errs != nil {
 				err = errs
 				return
@@ -357,6 +357,10 @@ func GetUserType(companyId int) (userType int, permissionStrnew string, err erro
 						userType = 4
 					}
 				}
+			} else if companyDetail.Status == "冻结" {
+				userType = 6
+			} else if companyDetail.Status == ";流失" {
+				userType = 7
 			}
 		}
 	}

+ 6 - 3
services/article.go

@@ -628,9 +628,12 @@ func GetArticleListByApi(cont context.Context) (err error) {
 		return err
 	}
 	for _, v := range listUpdateArticle {
-		go HandleArticleListByApi(v.ArticleId, v.Id)
+		// 这里直接go出去会出现并发,导致文章md5ID唯一索引限制报错
+		err = HandleArticleListByApi(v.ArticleId, v.Id)
+		if err != nil {
+			utils.FileLog.Info("WxGetToken Result:%s ", err.Error())
+		}
 	}
-
 	return
 }
 
@@ -638,7 +641,7 @@ func GetArticleListByApi(cont context.Context) (err error) {
 func HandleArticleListByApi(artcleId, celuePushId int) (err error) {
 	defer func() {
 		if err != nil {
-			go utils.SendAlarmMsg("处理同步策略平台数据失败", 2)
+			go utils.SendAlarmMsg("处理同步策略平台数据失败"+"GetArticleListByApi ErrMsg:"+err.Error(), 2)
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetArticleListByApi ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
 	}()

+ 251 - 0
services/elastic.go

@@ -10,6 +10,7 @@ import (
 	"sort"
 	"strconv"
 	"strings"
+	"time"
 )
 
 func NewClient() (client *elastic.Client, err error) {
@@ -34,6 +35,256 @@ func NewClient() (client *elastic.Client, err error) {
 	return
 }
 
+//创建文章阅读记录的Es索引
+func CreateIndexNameArticleHistory() {
+	indexName := utils.IndexNameArticleHistory
+	mappingJson := `{
+ "mappings": {
+   "dynamic": true,
+   "properties": {
+        "ArticleId": {
+          "type": "integer"
+        },
+ 		 "Id": {
+          "type": "integer"
+        },
+   		"ArticleType": {
+          "type": "short"
+        },
+        "CompanyArticleHistoryNum": {
+          "type": "integer"
+        },
+        "CompanyName": {
+          "type": "keyword"
+        },
+	   "CompanyId": {
+			  "type": "integer"
+			},
+        "CreateTime": {
+          "type": "date",
+          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
+        },
+        "Email": {
+          "type": "keyword"
+        },
+        "Mobile": {
+          "type": "keyword"
+        },
+        "PublishDate": {
+          "type": "date",
+          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
+        },
+        "RealName": {
+          "type": "keyword"
+        },
+        "SellerName": {
+          "type": "keyword"
+        },
+  		"SellerId": {
+          "type": "integer"
+        },
+        "StopTime": {
+          "type": "integer"
+        },
+        "Title": {
+          "type": "keyword"
+        },
+	   "UserId": {
+		   "type": "integer"
+		},
+        "UserArticleHistoryNum": {
+          "type": "integer"
+        }
+   }
+ }
+}`
+	EsCreateIndex(indexName, mappingJson)
+}
+
+//func UpdateWxUserLabel(cont context.Context) (err error) {
+func AddAllArticleHistory(cont context.Context) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("同步阅读记录到es失败;Err:"+err.Error(), 2)
+			go utils.SendEmail("同步阅读记录到es失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), ";Err:"+err.Error(), utils.EmailSendToUsers)
+			utils.FileLog.Info("同步阅读记录到es失败,Err:%s", err.Error())
+		}
+	}()
+
+	var updateUserIds string //更改过的用户ID
+	userIdMap := make(map[int]int)
+	condition := `  AND r.create_time < '` + time.Now().Format(utils.FormatDate) + `' 	AND r.company_id IN (
+					SELECT a.company_id 
+					FROM  company AS a INNER JOIN company_product AS b ON a.company_id = b.company_id 
+					WHERE a.enabled = 1 AND b.STATUS IN ( '正式', '试用', '冻结' )) `
+	totalAll, err := models.GetCygxArticleHistoryCountByCompany(condition)
+	if err != nil {
+		fmt.Println("GetCygxArticleHistoryCountByCompany Err:totalAll", err.Error())
+		return err
+	}
+	//更改阅读总数
+	err = models.UpdateConfigByCode(strconv.Itoa(totalAll), "company_article_history_num")
+	if err != nil {
+		fmt.Println("UpdateConfigByCode Err:totalAll", err.Error())
+		return err
+	}
+	//处理前一天新增的数据
+	condition += `  AND r.create_time >='` + time.Now().AddDate(0, 0, -1).Format(utils.FormatDate) + `'`
+	total, err := models.GetCygxArticleHistoryCountByCompany(condition)
+	//fmt.Println(total)
+	//return
+	fmt.Println(total)
+	if err != nil {
+		fmt.Println("GetCygxArticleHistoryCountByCompany Err:", err.Error())
+		return err
+	}
+	for i := 0; i <= total/1000; i++ {
+		allList, err := models.GetCygxArticleHistoryRecordByCompanyList(condition, 1000*i, 1000)
+		if err != nil {
+			fmt.Println("GetCygxArticleHistoryRecordByCompanyList Err:", err.Error())
+			return err
+		}
+		for k, v := range allList {
+			fmt.Println(v.Id, "___", k)
+			err := EsAddArticleHistoryData(v)
+			if err != nil {
+				fmt.Println("EsAddOrEditData Err:", err.Error())
+				return err
+			}
+			if _, ok := userIdMap[v.UserId]; !ok {
+				updateUserIds += strconv.Itoa(v.UserId) + ","
+				userIdMap[v.UserId] = v.UserId
+			}
+		}
+	}
+	//处理前一天新增的数据 end
+
+	//处理前一天被移动的用户
+
+	startDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
+	endDate := time.Now().Format(utils.FormatDate)
+	var mobiles string
+	listUpdateUser, err := models.GetWxUserOpLogList(startDate, endDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+	if len(listUpdateUser) > 0 {
+		for _, v := range listUpdateUser {
+			mobiles += "'" + v.Mobile + "',"
+		}
+	}
+	mobiles = strings.TrimRight(mobiles, ",")
+	if mobiles != "" {
+		condition = ` AND r.mobile IN (` + mobiles + `)`
+		//修改用户的阅读记录(es 自动判断,如果有他会修改数据)
+		listUpdatePv, err := models.GetCygxArticleHistoryRecordByCompanyList(condition, 0, 0)
+		if err != nil {
+			fmt.Println("GetArticleHistoryRecordAllByMobileList ,Err" + err.Error())
+			return err
+		}
+
+		for _, v := range listUpdatePv {
+			err := EsAddArticleHistoryData(v)
+			if err != nil {
+				fmt.Println("EsAddOrEditData Err:", err.Error())
+				return err
+			}
+		}
+	}
+
+	//处理前一天被移动的用户 end
+
+	//处理前一天被删除的用户
+	{
+		listDeleteUser, err := models.GetWxUserOpLogDeleteList(startDate, endDate)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			return err
+		}
+		mobiles = ""
+		if len(listUpdateUser) > 0 {
+			for _, v := range listDeleteUser {
+				mobiles += "'" + v.Mobile + "',"
+			}
+		}
+		mobiles = strings.TrimRight(mobiles, ",")
+		if mobiles != "" {
+			condition = ` AND r.mobile IN (` + mobiles + `)`
+			listDeletePv, err := models.GetCygxArticleHistoryRecordByCompanyList(condition, 0, 0)
+			if err != nil {
+				fmt.Println("GetArticleHistoryRecordAllByMobileList ,Err" + err.Error())
+				return err
+			}
+			//fmt.Println("Es 删除")
+			for _, v := range listDeletePv {
+				err := EsDeleteData(utils.IndexNameArticleHistory, strconv.Itoa(v.Id))
+				if err != nil {
+					fmt.Println("EsAddOrEditData Err:", err.Error())
+					return err
+				}
+			}
+		}
+	}
+	//处理前一天被删除的用户 end
+
+	//处理新增的阅读记录的用户阅读数量、机构阅读数量(暂未找到批量修改的方法,后期优化处理 2022.7.11)
+	updateUserIds = strings.TrimRight(updateUserIds, ",")
+	if updateUserIds != "" {
+		condition = `  AND r.create_time >='` + time.Now().AddDate(0, 0, -1).Format(utils.FormatDate) + `' AND r.user_id IN (` + updateUserIds + `)`
+		total, err := models.GetCygxArticleHistoryCountByCompany(condition)
+		//fmt.Println(total)
+		//return
+		fmt.Println(total)
+		if err != nil {
+			fmt.Println("GetCygxArticleHistoryCountByCompany Err:", err.Error())
+			return err
+		}
+		for i := 0; i <= total/1000; i++ {
+			allList, err := models.GetCygxArticleHistoryRecordByCompanyList(condition, 1000*i, 1000)
+			if err != nil {
+				fmt.Println("GetCygxArticleHistoryRecordByCompanyList Err:", err.Error())
+				return err
+			}
+			for k, v := range allList {
+				fmt.Println(v.Id, "___", k)
+				err := EsAddArticleHistoryData(v)
+				if err != nil {
+					fmt.Println("EsAddOrEditData Err:", err.Error())
+					return err
+				}
+				if _, ok := userIdMap[v.UserId]; !ok {
+					updateUserIds += strconv.Itoa(v.UserId) + ","
+					userIdMap[v.UserId] = v.UserId
+				}
+			}
+		}
+	}
+	return
+}
+
+//新增数据
+func EsAddArticleHistoryData(item *models.EsUserInteraction) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditData Err:", err.Error())
+		}
+	}()
+	client := utils.Client
+
+	resp, err := client.Index().Index(utils.IndexNameArticleHistory).Id(strconv.Itoa(item.Id)).BodyJson(item).Do(context.Background())
+	if err != nil {
+		fmt.Println("新增失败:", err.Error())
+		return err
+	}
+	if resp.Status == 0 && resp.Result == "created" {
+		//fmt.Println("新增成功")
+		err = nil
+		return err
+	} else {
+		fmt.Println("AddData", resp.Status, resp.Result)
+	}
+	return
+}
+
 //indexName:索引名称
 //mappingJson:表结构
 func EsCreateIndex(indexName, mappingJson string) (err error) {

+ 5 - 1
services/task.go

@@ -69,6 +69,9 @@ func Task() {
 		updateWxUserLabel := task.NewTask("updateWxUserLabel", "0 01 0 * * *", UpdateWxUserLabel) //更新用户的标签
 		task.AddTask("updateWxUserLabel", updateWxUserLabel)
 
+		addAllArticleHistory := task.NewTask("addAllArticleHistory", "0 30 2 * * *", AddAllArticleHistory) //把前一天的用户阅读记录同步到ES
+		task.AddTask("addAllArticleHistory", addAllArticleHistory)
+
 		getCeLueArticlePv := task.NewTask("getCeLueArticlePv", "0 */10 * * * *", GetCeLueArticlePv) //通过三方接口获取策略平台上的阅读记录
 		task.AddTask("getCeLueArticlePv", getCeLueArticlePv)
 	}
@@ -76,7 +79,8 @@ func Task() {
 		getArticleListByApi := task.NewTask("getArticleListByApi", "0 */60 * * * *", GetArticleListByApi) //通过三方接口获取策略平台上的文章
 		task.AddTask("getArticleListByApi", getArticleListByApi)
 	}
-
+	//CreateIndexNameArticleHistory()
+	//AddAllArticleHistory()
 	//DoCompany()
 	//ActivityAttendanceDetail()
 	//SynchronizationArthistory()//同步原有的阅读记录

+ 5 - 4
services/wx_user.go

@@ -104,8 +104,9 @@ func UpdateWxUserLabel(cont context.Context) (err error) {
 	//处理 前一天移动之后的用户的公司记录信息
 
 	{
-		updateTime := time.Now().Add(-time.Hour * 25).Format("2006-01-02 15:04:05")
-		listUpdateUser, err := models.GetWxUserOpLogList(updateTime)
+		startDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
+		endDate := time.Now().Format(utils.FormatDate)
+		listUpdateUser, err := models.GetWxUserOpLogList(startDate, endDate)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			return err
 		}
@@ -123,8 +124,8 @@ func UpdateWxUserLabel(cont context.Context) (err error) {
 		//如果用户ID不为空那么就处理这些用户的记录信息
 		if userIds != "" {
 			var condition string
-			condition = ` AND user_id IN (` + userIds + `)`
-
+			//condition = ` AND user_id IN (` + userIds + `)`
+			condition = ` AND mobile IN (` + mobiles + `)`
 			//处理用户的文章收藏
 			listCollect, err := models.GetCygxArticleCollectList(condition)
 			if err != nil && err.Error() != utils.ErrNoRow() {

+ 3 - 0
utils/config.go

@@ -54,6 +54,7 @@ var (
 
 var (
 	IndexName                 string
+	IndexNameArticleHistory   string //文章阅读记录Es索引
 	OnlineTime                string
 	SummaryArticleId          int
 	YanxSummaryPermissionId   int    //研选纪要分类ID
@@ -137,6 +138,7 @@ func init() {
 		WxPublicAppSecret = "26c586e7ccb3c575433f0f37797b3eeb"
 		WxPublicId = "gh_b67e0049fb8c"
 		IndexName = "cygx_article_v0622"
+		IndexNameArticleHistory = "cygx_article_history_v07_08"
 
 		//接收附件邮箱
 		EmailTechnology = "mlluo@hzinsights.com;jxu@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com"    //科技行业专家邮箱
@@ -169,6 +171,7 @@ func init() {
 		WxPublicAppSecret = "f4d52e34021eee262dce9682b31f8861"
 		WxPublicId = "gh_5dc508325c6f"
 		IndexName = "cygx_article_v1"
+		IndexNameArticleHistory = "cygx_article_history_v1"
 
 		//接收附件邮箱
 		EmailTechnology = "jhwang@hzinsights.com;cxzhang@hzinsights.com"  //科技行业专家邮箱

+ 2 - 0
utils/constants.go

@@ -75,4 +75,6 @@ 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
 )