Browse Source

Merge branch 'master' of http://8.136.199.33:3000/hongze/hongze_mobile_admin into cygx_8.2

xingzai 2 years ago
parent
commit
70f6ec2392

+ 19 - 5
controllers/admin_wx.go

@@ -34,6 +34,8 @@ func (c *AdminWxController) SendSmsCode()  {
 		c.FailWithMessage("请输入授权标识", "请输入授权标识")
 		return
 	}
+
+	areaNum := req.AreaNum
 	//获取token,如果没有token不允许发送验证码
 	infoJson, err := utils.Rc.RedisString(utils.HZ_MOBILE_ADMIN_WXLOGIN_TOKEN+req.Token)
 	if err != nil {
@@ -92,10 +94,18 @@ func (c *AdminWxController) SendSmsCode()  {
 	}
 
 	//发送短信
+	var sendRet bool
 	code :=  utils.GetRandDigit(4)
-	err = services.SendSmsCode(req.Mobile,"",utils.LOGIN_CODE, code)
-	if err != nil {
-		c.FailWithMessage("发送验证码失败", "发送验证码失败"+err.Error())
+	if areaNum == "86" || areaNum == "" || areaNum == "0" {
+		//国内的短信
+		sendRet = services.SendSmsCode(req.Mobile, code)
+	} else {
+		//国际短信
+		sendRet = services.SendSmsCodeGj(req.Mobile, code, areaNum)
+	}
+
+	if !sendRet {
+		c.FailWithMessage("发送验证码失败", "发送验证码失败")
 		return
 	}
 	//存储验证码
@@ -139,11 +149,15 @@ func (c *AdminWxController) BindMobile()  {
 		return
 	}
 	//校验验证码
-	_, err = utils.Rc.RedisString(utils.HZ_MOBILE_ADMIN_WXLOGIN_MOBILE_CODE+req.Mobile)
+	code, err := utils.Rc.RedisString(utils.HZ_MOBILE_ADMIN_WXLOGIN_MOBILE_CODE + req.Mobile)
 	if err != nil {
 		c.FailWithMessage("验证码错误或者已过期", "验证码错误或者已过期"+err.Error())
 		return
 	}
+	if  req.Code != code {
+		c.FailWithMessage("验证码错误", "验证码错误")
+		return
+	}
 	//获取token,如果没有token不允许发送验证码
 	infoJson, err := utils.Rc.RedisString(utils.HZ_MOBILE_ADMIN_WXLOGIN_TOKEN+req.Token)
 	if err != nil {
@@ -205,4 +219,4 @@ func (c *AdminWxController) BindMobile()  {
 
 	c.Ok()
 	return
-}
+}

+ 8 - 0
controllers/base_common.go

@@ -99,6 +99,14 @@ func (c BaseCommon) FailWithCodeUsed(message, errMessage string) {
 	c.Response.Data = map[string]interface{}{}
 	c.Result()
 }
+//token异常
+func (c BaseCommon) TokenError(data interface{}, message string) {
+	c.Response.Code = TOKEN_ERROR
+	c.Response.Msg = message
+	c.Response.Data = data
+	c.Result()
+}
+
 //token异常
 func (c BaseCommon) TokenMsgError(message, errMessage string) {
 	c.Response.Code = TOKEN_ERROR

+ 43 - 18
controllers/message.go

@@ -36,10 +36,20 @@ func (c *MessageCommon) SummaryMessageList() {
 	sourceTypeList := [...]int{1, 2, 3, 5, 6}
 	messageMap := make(map[int]message.SummaryMessage)
 	timeList := make([]int, 0)
+	var err error
+	commentTypes := []int{services.CompanyApprovalMessageSourceTypeByQuestionComment, services.CompanyApprovalMessageSourceTypeByVideoComment, services.CompanyApprovalMessageSourceTypeByRoadVideoComment}
 	for _, sourceType := range sourceTypeList {
 		//最近一条消息
 		tmpMessage := ``
-		messageInfo, err := company_approval_message.GetLastMessage(sysUserId, sourceType)
+
+		messageInfo := new(company_approval_message.CompanyApprovalMessageList)
+		// 来源类型为6-评论时, 查询6,7,8最近的一条消息
+		if sourceType == 6 {
+			messageInfo, err = company_approval_message.GetLastMessageBySourceTypes(sysUserId, commentTypes)
+		} else {
+			messageInfo, err = company_approval_message.GetLastMessage(sysUserId, sourceType)
+		}
+
 		if err != nil {
 			if err.Error() == utils.ErrNoRow() {
 				continue
@@ -59,7 +69,7 @@ func (c *MessageCommon) SummaryMessageList() {
 
 				}
 				tmpMessage = fmt.Sprint("待分配提问:", content)
-			case 6:
+			case 6, 7, 8:
 				content := messageInfo.Content
 				var tmpMessageInfo services.MessageInfo
 				if messageInfo.MessageInfo != `` {
@@ -75,14 +85,26 @@ func (c *MessageCommon) SummaryMessageList() {
 			}
 		}
 
-		notReadTotal, err := company_approval_message.GetNotReadMessageTotal(sysUserId, sourceType)
-		if err != nil {
-			c.FailWithMessage("获取失败", "获取未读消息数失败,Err:"+err.Error())
-			return
+		notReadTotal := 0
+		if sourceType == 6 {
+			cnt, e := company_approval_message.GetCommentNotReadMessageTotal(sysUserId, commentTypes)
+			if e != nil {
+				c.FailWithMessage("获取失败", "获取评论未读消息数失败,Err:"+e.Error())
+				return
+			}
+			notReadTotal = int(cnt)
+		} else {
+			nt, e := company_approval_message.GetNotReadMessageTotal(sysUserId, sourceType)
+			if e != nil {
+				c.FailWithMessage("获取失败", "获取未读消息数失败,Err:"+e.Error())
+				return
+			}
+			notReadTotal = int(nt)
 		}
+
 		companyMessage := message.SummaryMessage{
 			Message:    tmpMessage,
-			Total:      int(notReadTotal),
+			Total:      notReadTotal,
 			SourceType: sourceType,
 		}
 
@@ -161,19 +183,21 @@ func (c *MessageCommon) MessageList() {
 		c.FailWithMessage("获取失败", "获取消息总数失败,Err:"+err.Error())
 		return
 	}
-	// 消息类型为6-评论时, 查询6-问答评论,7-视频评论
-	sourceTypeStr := strconv.Itoa(sourceType)
+	// 消息类型为6-评论时, 查询6-问答评论,7-视频评论,8-路演视频
+	typeArr := make([]int, 0)
 	if sourceType == services.CompanyApprovalMessageSourceTypeByQuestionComment {
-		sourceTypeStr = fmt.Sprintf("%d,%d", services.CompanyApprovalMessageSourceTypeByQuestionComment, services.CompanyApprovalMessageSourceTypeByVideoComment)
+		typeArr = append(typeArr, services.CompanyApprovalMessageSourceTypeByQuestionComment, services.CompanyApprovalMessageSourceTypeByVideoComment, services.CompanyApprovalMessageSourceTypeByRoadVideoComment)
+	} else {
+		typeArr = append(typeArr, sourceType)
 	}
-	list, err := company_approval_message.GetCompanyApprovalMessageList(sysUserId, startSize, pageSize, sourceTypeStr)
+	list, err := company_approval_message.GetCompanyApprovalMessageList(sysUserId, startSize, pageSize, typeArr)
 	if err != nil {
 		c.FailWithMessage("获取失败", "获取消息列表失败,Err:"+err.Error())
 		return
 	}
 
 	//将所有未读消息标记为已读
-	_ = company_approval_message.ModifyAllCompanyApprovalMessageStatus(sysUserId, sourceType)
+	_ = company_approval_message.ModifyAllCompanyApprovalMessageStatus(sysUserId, typeArr)
 
 	switch sourceType {
 	case 5, 6:
@@ -377,12 +401,13 @@ func getMessageInfo(companyApprovalMessageList []*company_approval_message.Compa
 
 		createTime, _ := time.ParseInLocation(utils.FormatDateTime, tmpMessageInfo.CreateTime.Format(utils.FormatDateTime), time.Local)
 		approvalInfo := company_approval_message.ApprovalInfo{
-			ApplyName:   tmpMessageInfo.UserName,
-			Title:       tmpMessageInfo.Title,
-			ApplyTime:   createTime,
-			Content:     tmpMessageInfo.Content,
-			CompanyName: tmpMessageInfo.CompanyName,
-			Extra:       tmpMessageInfo.Extra,
+			ApplyName:     tmpMessageInfo.UserName,
+			Title:         tmpMessageInfo.Title,
+			ApplyTime:     createTime,
+			Content:       tmpMessageInfo.Content,
+			CompanyName:   tmpMessageInfo.CompanyName,
+			Extra:         tmpMessageInfo.Extra,
+			MessageSource: tmpMessageInfo.MessageSource,
 		}
 		v.ApprovalInfo = approvalInfo
 	}

+ 7 - 12
controllers/roadshow/calendar.go

@@ -236,19 +236,17 @@ func (this *CalendarController) Add() {
 						}
 						remark := "请尽快完成审批"
 						//wxAppPath := "pages-approve/activity/detail?RsCalendarId=" + strconv.Itoa(int(rsCalendarId)) + "&RsCalendarResearcherId=" + strconv.Itoa(int(rsCalendarResearcherId))
-						openIdList, _ := models.GetAdminOpenIdByMobile(sysAdmin.Mobile)
-						if len(openIdList) > 0 {
+						if sysAdmin.OpenId != "" {
 							go services.SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath, sysAdmin.Mobile)
 						}
 					} else {
 						wxAppPath = ""
-						first := sysAdmin.RealName + "为你添加了一场【" + req.ActivityType + "】"
+						first := sysUser.RealName + "为你添加了一场【" + req.ActivityType + "】"
 						startDate := researcher.StartDate[5:]
 						startDate = strings.Replace(startDate, "-", ".", -1)
 						keyword1 := "会议时间:" + startDate + "(" + researcher.StartWeek + ")" + " " + researcher.StartTime[:5] + "-" + researcher.EndTime[:5]
 						keyword2 := "--"
-						openIdList, _ := models.GetAdminOpenIdByMobile(sysAdmin.Mobile)
-						if len(openIdList) > 0 {
+						if sysAdmin.OpenId != "" {
 							go services.SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, "", wxAppPath, sysAdmin.Mobile)
 						}
 					}
@@ -1364,8 +1362,7 @@ func (this *CalendarController) Edit() {
 						}
 						remark := "请尽快完成审批"
 						wxAppPath := "pages-approve/activity/detail?RsCalendarId=" + strconv.Itoa(req.RsCalendarId) + "&RsCalendarResearcherId=" + strconv.Itoa(rsCalendarResearcherItem.RsCalendarResearcherId)
-						openIdList, _ := models.GetAdminOpenIdByMobile(sysAdmin.Mobile)
-						if len(openIdList) > 0 {
+						if sysAdmin.OpenId != "" {
 							services.SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath, sysAdmin.Mobile)
 						}
 					}
@@ -1443,8 +1440,7 @@ func (this *CalendarController) Edit() {
 					}
 					remark := "请尽快完成审批"
 					wxAppPath := "pages-approve/activity/detail?RsCalendarId=" + strconv.Itoa(req.RsCalendarId) + "&RsCalendarResearcherId=" + strconv.Itoa(int(rsCalendarResearcherId))
-					openIdList, _ := models.GetAdminOpenIdByMobile(sysAdmin.Mobile)
-					if len(openIdList) > 0 {
+					if sysAdmin.OpenId != "" {
 						services.SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath, sysAdmin.Mobile)
 					}
 				}
@@ -1592,7 +1588,7 @@ func (this *CalendarController) Delete() {
 		return
 	}
 
-	rsCalendarResearcherItemList, err := roadshow.GetRsCalendarResearcherListById(req.RsCalendarResearcherId)
+	rsCalendarResearcherItemList, err := roadshow.GetRsCalendarResearcherListById(req.RsCalendarId)
 	if err != nil {
 		this.FailWithMessage("获取数据失败!", "获取数据失败!GetRsCalendarResearcherById:"+err.Error())
 		return
@@ -1690,8 +1686,7 @@ func (this *CalendarController) Delete() {
 					keyword2 := "已删除"
 					remark := req.DeleteReason
 
-					openIdList, _ := models.GetAdminOpenIdByMobile(sysAdmin.Mobile)
-					if len(openIdList) > 0 {
+					if sysAdmin.OpenId != "" {
 						go services.SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, remark, wxAppPath, sysAdmin.Mobile)
 					}
 				}

+ 0 - 1
controllers/wechat.go

@@ -303,7 +303,6 @@ func (c *WeChatCommon) AdminWeChatLogin() {
 		c.FailWithMessage(fmt.Sprintf("%v", err), fmt.Sprintf("%v", err))
 		return
 	}
-
 	if item.Errcode != 0 {
 		if item.Errcode == 40163 {
 			c.FailWithCodeUsed("获取用户信息失败", "获取access_token 失败 errCode:"+strconv.Itoa(item.Errcode)+" ;errMsg:"+item.Errmsg)

+ 3 - 1
models/db_init.go

@@ -8,6 +8,7 @@ import (
 	"hongze/hongze_mobile_admin/models/tables/admin_record"
 	"hongze/hongze_mobile_admin/models/tables/approval_flow"
 	"hongze/hongze_mobile_admin/models/tables/approval_flow_node"
+	"hongze/hongze_mobile_admin/models/tables/chart_permission"
 	"hongze/hongze_mobile_admin/models/tables/company"
 	"hongze/hongze_mobile_admin/models/tables/company_approval"
 	"hongze/hongze_mobile_admin/models/tables/company_approval_message"
@@ -98,13 +99,14 @@ func init() {
 		new(wx_user.WxUser),
 		new(seal.Seal),                //用印表
 		new(seal.SealOperationRecord), // 用印操作记录表
-		new(seal.Attachment),         //用印附件
+		new(seal.Attachment),          //用印附件
 		new(roadshow.RsCalendar),
 		new(roadshow.RsCalendarResearcher),
 		new(roadshow.RsMatters),
 		new(roadshow.RsCalendarRelation),
 		new(company_product_update_log.CompanyProductUpdateLog), //客户产品状态变更记录表
 		new(user_template_record.UserTemplateRecord),            //模版消息记录表
+		new(chart_permission.ChartPermission),                   // 品种权限表
 	)
 
 	// 社区问答相关

+ 3 - 2
models/tables/admin/admin.go

@@ -125,8 +125,9 @@ type AdminItem struct {
 }
 
 type SmsCodeReq struct {
-	Mobile string
-	Token  string
+	Mobile  string
+	Token   string
+	AreaNum string
 }
 
 type BindMobileReq struct {

+ 132 - 0
models/tables/chart_permission/chart_permission.go

@@ -0,0 +1,132 @@
+package chart_permission
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// ChartPermission 报告权限表
+type ChartPermission struct {
+	ChartPermissionId   int       `orm:"column(chart_permission_id);pk" description:"问题ID"`
+	ChartPermissionName string    `description:"名称"`
+	PermissionName      string    `description:"权限名"`
+	Sort                int       `description:"排序"`
+	Enabled             int       `description:"是否可用"`
+	CreatedTime         time.Time `description:"创建时间"`
+	LastUpdatedTime     time.Time `description:"更新时间"`
+	TeleconferenceSort  int       `description:"电话会类型排序"`
+	Remark              string    `description:"备注"`
+	ClassifyName        string    `description:"分类名称"`
+	ProductName         string    `description:"产品名称"`
+	ProductID           int       `description:"产品ID"`
+	ImageURL            string    `description:"图片地址"`
+	ShowType            int       `description:"1:查研观向小程序展示"`
+	IsOther             int       `description:"是否是其他,用于查研观向小程序后台展示"`
+	IsReport            int       `description:"是否是报告,用于查研观向小程序前台报告展示"`
+	CygxAuth            int       `description:"是否是权限,用于查研观向小程序前台权限校验"`
+	YbImgUrl            string    `description:"研报小程序报告列表icon"`
+	PriceDrivenState    int       `description:"品种价格驱动开启状态 0-关闭 1-开启"`
+}
+
+// GetChartPermissionById 主键获取权限
+func GetChartPermissionById(permissionId int) (item *ChartPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission WHERE chart_permission_id = ? LIMIT 1`
+	err = o.Raw(sql, permissionId).QueryRow(&item)
+	return
+}
+
+// Update 更新
+func (chartPermissionInfo *ChartPermission) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(chartPermissionInfo, cols...)
+	return
+}
+
+// YbChartPermissionFirst 研报一级品种分类
+type YbChartPermissionFirst struct {
+	Id           int
+	ClassifyName string `description:"权限一级分类名称,与chart_permission的classify_name一致"`
+	YbIndexShow  int    `description:"是否展示在研报小程序首页页面  1-展示;0-不展示"`
+	YbIndexName  string `description:"研报小程序首页简称"`
+	YbIndexSort  string `description:"研报小程序首页排序"`
+	YbIndexIcon  string `description:"研报小程序首页图标地址"`
+}
+
+// GetYbChartPermissionFirst 获取研报一级品种分类
+func GetYbChartPermissionFirst() (list []*YbChartPermissionFirst, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission_first ORDER BY yb_index_sort ASC`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// GetFiccPermissionExceptTactic 获取除了市场策略外的ficc权限
+func GetFiccPermissionExceptTactic() (items []*ChartPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission WHERE enabled = 1 AND permission_type = 0 AND product_id = 1 and classify_name != '市场策略' ORDER BY sort ASC`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// GetPermissionByProductIdAndClassifyName 获取子分类
+func GetPermissionByProductIdAndClassifyName(productId int, classifyName string) (items []*ChartPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission WHERE enabled = 1 AND product_id = ? AND classify_name = ? AND permission_type = 0 ORDER BY sort ASC`
+	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
+	return
+}
+
+// GetYbChartPermissionFirstByName 根据分类名称获取一级分类
+func GetYbChartPermissionFirstByName(classifyName string) (item *YbChartPermissionFirst, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission_first WHERE classify_name = ? LIMIT 1`
+	err = o.Raw(sql, classifyName).QueryRow(&item)
+	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
+}
+
+// GetChartPermissionByIds 主键获取权限
+func GetChartPermissionByIds(permissionIds []string) (list []*ChartPermission, err error) {
+	qb, _ := orm.NewQueryBuilder("mysql")
+	// 构建查询对象
+	qb.Select("*").From("chart_permission").
+		Where("chart_permission_id").In(permissionIds...)
+	// 导出 SQL 语句
+	sql := qb.String()
+
+	// 执行 SQL 语句
+	o := orm.NewOrm()
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// GetChartPermissionByIds 主键获取权限
+func GetChartPermissionByNames(permissionNames []string) (list []*ChartPermission, err error) {
+	qb, _ := orm.NewQueryBuilder("mysql")
+	// 构建查询对象
+	qb.Select("*").From("chart_permission").
+		Where("chart_permission_name").In(permissionNames...)
+	// 导出 SQL 语句
+	sql := qb.String()
+
+	// 执行 SQL 语句
+	o := orm.NewOrm()
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// GetChartPermissionList 获取品种权限列表
+func GetChartPermissionList() (list []*ChartPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}

+ 42 - 14
models/tables/company_approval_message/company_approval_message.go

@@ -2,6 +2,7 @@ package company_approval_message
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_mobile_admin/utils"
 	"time"
 )
 
@@ -60,14 +61,15 @@ type CompanyApprovalMessageList struct {
 
 //消息审批单信息
 type ApprovalInfo struct {
-	ApplyName    string    `description:"申请人姓名"`
-	Type         string    `description:"类型"`
-	Title        string    `description:"主题内容"`
-	Content      string    `description:"主体内容"`
-	CompanyName  string    `description:"客户信息"`
-	ApplyTime    time.Time `description:"提交时间"`
-	ApprovalTime time.Time `description:"审批时间"`
-	Extra        string    `description:"附加字段: 比如视频评论的标签"`
+	ApplyName     string    `description:"申请人姓名"`
+	Type          string    `description:"类型"`
+	Title         string    `description:"主题内容"`
+	Content       string    `description:"主体内容"`
+	CompanyName   string    `description:"客户信息"`
+	ApplyTime     time.Time `description:"提交时间"`
+	ApprovalTime  time.Time `description:"审批时间"`
+	Extra         string    `description:"附加字段: 比如视频评论的标签"`
+	MessageSource string    `description:"消息来源:问答社区/视频社区/线上路演"`
 }
 
 type CompanyApprovalMessageListResp struct {
@@ -92,17 +94,17 @@ func GetCompanyApprovalMessageCount(sysUserId, sourceType int) (count int, err e
 }
 
 //消息列表页
-func GetCompanyApprovalMessageList(sysUserId, startSize, pageSize int, sourceType string) (items []*CompanyApprovalMessageList, err error) {
+func GetCompanyApprovalMessageList(sysUserId, startSize, pageSize int, sourceTypes []int) (items []*CompanyApprovalMessageList, err error) {
 	sql := `SELECT
 				a.*, b.real_name
 			FROM
 				company_approval_message AS a
 			INNER JOIN admin AS b ON a.create_user_id = b.admin_id
 			WHERE
-				receive_user_id =? AND message_status != 2 AND a.source_type IN (` + sourceType + `)`
+				receive_user_id =? AND message_status != 2 AND a.source_type IN (` + utils.GetOrmInReplace(len(sourceTypes)) + `)`
 	sql += ` ORDER BY create_time DESC LIMIT ?,? `
 	o := orm.NewOrm()
-	_, err = o.Raw(sql, sysUserId, startSize, pageSize).QueryRows(&items)
+	_, err = o.Raw(sql, sysUserId, sourceTypes, startSize, pageSize).QueryRows(&items)
 	return
 }
 
@@ -117,6 +119,22 @@ func GetLastMessage(sysUserId, sourceType int) (item *CompanyApprovalMessageList
 	return
 }
 
+//获取最近一条消息
+func GetLastMessageBySourceTypes(sysUserId int, sourceType []int) (item *CompanyApprovalMessageList, err error) {
+	sql := `SELECT
+				a.*, b.real_name
+			FROM
+				company_approval_message AS a
+			INNER JOIN admin AS b ON a.create_user_id = b.admin_id
+			WHERE
+				receive_user_id = ? AND message_status != 2 AND source_type IN (` + utils.GetOrmInReplace(len(sourceType)) + `)
+			ORDER BY
+				create_time DESC`
+	o := orm.NewOrm()
+	err = o.Raw(sql, sysUserId, sourceType).QueryRow(&item)
+	return
+}
+
 //获取未读消息数
 func GetNotReadMessageTotal(sysUserId, sourceType int) (total int64, err error) {
 	sql := `SELECT count(*) total FROM company_approval_message AS a
@@ -127,6 +145,16 @@ func GetNotReadMessageTotal(sysUserId, sourceType int) (total int64, err error)
 	return
 }
 
+// 获取评论未读消息数
+func GetCommentNotReadMessageTotal(sysUserId int, types []int) (total int64, err error) {
+	sql := `SELECT count(*) total FROM company_approval_message AS a
+			INNER JOIN admin AS b ON a.create_user_id=b.admin_id
+			WHERE receive_user_id=? AND a.operation_status=1 AND a.message_status =0 AND source_type IN (` + utils.GetOrmInReplace(len(types)) + `)`
+	o := orm.NewOrm()
+	err = o.Raw(sql, sysUserId, types).QueryRow(&total)
+	return
+}
+
 //申请服务更新请求参数
 type CompanyApprovalMessageReadReq struct {
 	Id int `description:"消息id"`
@@ -141,10 +169,10 @@ func ModifyCompanyApprovalMessageStatus(companyApprovalMessageId int) (err error
 }
 
 //变更当前类型下所有未读消息为消息已读状态
-func ModifyAllCompanyApprovalMessageStatus(receiveUserId, sourceType int) (err error) {
+func ModifyAllCompanyApprovalMessageStatus(receiveUserId int, sourceTypes []int) (err error) {
 	o := orm.NewOrm()
-	sql := `UPDATE company_approval_message SET message_status=1,modify_time=NOW() WHERE receive_user_id = ? and source_type=? and message_status=0`
-	_, err = o.Raw(sql, receiveUserId, sourceType).Exec()
+	sql := `UPDATE company_approval_message SET message_status=1,modify_time=NOW() WHERE receive_user_id = ? and source_type IN (` + utils.GetOrmInReplace(len(sourceTypes)) + `) and message_status=0`
+	_, err = o.Raw(sql, receiveUserId, sourceTypes).Exec()
 	return
 }
 

+ 1 - 0
models/tables/user_template_record/user_template_record.go

@@ -13,6 +13,7 @@ type UserTemplateRecord struct {
 	CreateTime string
 	SendStatus int
 	SendType   int
+	WxAppId    string
 }
 
 // AddUserTemplateRecord 添加记录

+ 27 - 1
models/tables/yb_community_question_comment/yb_community_question_comment.go

@@ -60,9 +60,10 @@ type YbCommunityQuestionCommentAndQuestion struct {
 	HotTime                    time.Time `orm:"column(hot_time)" description:"设置精选的时间"`
 	ModifyTime                 time.Time `orm:"column(modify_time)" description:"修改时间"`
 	CreateTime                 time.Time `orm:"column(create_time)" description:"创建时间"`
-	Source                     int       `orm:"column(source)" description:"来源:1-问答社区; 2-视频社区"`
+	Source                     int       `orm:"column(source)" description:"来源:1-问答社区; 2-视频社区; 3-视频社区"`
 	QuestionContent            string    `description:"问题内容"`
 	TagName                    string    `description:"标签名称"`
+	ChartPermissionIds         string    `description:"品种标签IDs"`
 }
 
 // GetCommunityQuestionCommentList 获取问答列表
@@ -118,3 +119,28 @@ func GetCommunityVideoCommentList(condition string, pars []interface{}, startSiz
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
 	return
 }
+
+// GetRoadVideoCommentList 获取路演视频评论列表
+func GetRoadVideoCommentList(condition string, pars []interface{}, startSize, pageSize int) (total int, list []*YbCommunityQuestionCommentAndQuestion, err error) {
+	o := orm.NewOrm()
+
+	//汇总数据
+	totalSQl := `SELECT COUNT(1) total FROM yb_community_question_comment a JOIN yb_road_video b ON a.community_question_id = b.road_video_id WHERE a.enabled = 1 AND b.is_deleted = 0 AND source = 3 `
+	totalSQl += condition
+	if err = o.Raw(totalSQl, pars).QueryRow(&total); err != nil {
+		return
+	}
+
+	// 列表数据
+	sql := `SELECT
+				a.*, b.title AS question_content, b.chart_permission_ids
+			FROM
+				yb_community_question_comment a
+			JOIN yb_road_video b ON a.community_question_id = b.road_video_id
+			WHERE
+				a.enabled = 1 AND b.is_deleted = 0 AND source = 3 `
+	sql += condition
+	sql += ` ORDER BY a.create_time DESC LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}

+ 1 - 1
services/admin_wechat.go

@@ -51,4 +51,4 @@ func AdminWxLogin(wxAccessToken *WxAccessToken, wxUserInfo *WxUserInfo) (ret adm
 
 	ret.BindFlag = true
 	return
-}
+}

+ 10 - 8
services/company_approval_message.go

@@ -8,15 +8,16 @@ import (
 	"time"
 )
 
-//消息来源类型,1:客户,2:合同,3:用印,4:指标替换,5:问答社区,6:问答评论,7:视频评论
+//消息来源类型,1:客户,2:合同,3:用印,4:指标替换,5:问答社区,6:问答评论,7:视频评论,8:线上路演评论
 const (
-	CompanyApprovalMessageSourceTypeByCompany         = 1
-	CompanyApprovalMessageSourceTypeByContract        = 2
-	CompanyApprovalMessageSourceTypeBySeal            = 3
-	CompanyApprovalMessageSourceTypeByEdbInfo         = 4
-	CompanyApprovalMessageSourceTypeByQuestion        = 5
-	CompanyApprovalMessageSourceTypeByQuestionComment = 6
-	CompanyApprovalMessageSourceTypeByVideoComment    = 7
+	CompanyApprovalMessageSourceTypeByCompany          = 1
+	CompanyApprovalMessageSourceTypeByContract         = 2
+	CompanyApprovalMessageSourceTypeBySeal             = 3
+	CompanyApprovalMessageSourceTypeByEdbInfo          = 4
+	CompanyApprovalMessageSourceTypeByQuestion         = 5
+	CompanyApprovalMessageSourceTypeByQuestionComment  = 6
+	CompanyApprovalMessageSourceTypeByVideoComment     = 7
+	CompanyApprovalMessageSourceTypeByRoadVideoComment = 8
 )
 
 // 1:申请消息,2:审批结果,3:消息通知
@@ -44,6 +45,7 @@ type MessageInfo struct {
 	UserName             string    `json:"user_name"`
 	CreateTime           time.Time `json:"create_time"`
 	Extra                string    `json:"extra" description:"附加字段"`
+	MessageSource        string    `json:"message_source" description:"消息来源:问答社区/视频社区/线上路演"`
 }
 
 // AddCompanyApprovalMessage 添加待办消息

+ 71 - 19
services/sms.go

@@ -2,7 +2,6 @@ package services
 
 import (
 	"encoding/json"
-	"errors"
 	"fmt"
 	"hongze/hongze_mobile_admin/services/alarm_msg"
 	"hongze/hongze_mobile_admin/utils"
@@ -11,34 +10,31 @@ import (
 	"net/url"
 )
 
-func SendSmsCode(mobile, ip string, codeType int, vcode string) (err error) {
-	tplId := ""
-	switch codeType {
-	case utils.REGISTER_CODE:
-		tplId = "206722"
-	case utils.LOGIN_CODE:
-		tplId = "65692"
-	}
-	result, err := sendSms(mobile, tplId, vcode)
+func SendSmsCode(mobile, vCode string) bool {
+	tplId := "65692"
+	result, err := sendSms(mobile, tplId, vCode)
 	if err != nil {
-		return
+		fmt.Println("发送短信失败")
+		return false
 	}
 	fmt.Println("result", string(result))
 	var netReturn map[string]interface{}
 	err = json.Unmarshal(result, &netReturn)
 	if err != nil {
-		go alarm_msg.SendAlarmMsg("短信验证码发送失败 ErrMsg:"+err.Error()+" result"+string(result), 3)
-		//go utils.SendEmail("短信验证码发送失败","err:"+err.Error()+" result"+string(result), utils.EmailSendToUsers)
-		return
+		//go SendEmail("短信验证码发送失败", "err:"+err.Error()+" result"+string(result), utils.EmailSendToUsers)
+		go alarm_msg.SendAlarmMsg("短信验证码发送失败, Err:"+err.Error()+";Result:"+string(result), 2)
+		return false
 	}
 	if netReturn["error_code"].(float64) == 0 {
 		fmt.Printf("接口返回result字段是:\r\n%v", netReturn["result"])
+		return true
 	} else {
-		err = errors.New(string(result))
-		go alarm_msg.SendAlarmMsg("短信验证码发送失败 ErrMsg:"+err.Error()+" result"+string(result), 3)
-		//go utils.SendEmail("短信验证码发送失败"," result"+string(result), utils.EmailSendToUsers)
+		// 忽略错误的手机号码这种错误
+		if netReturn["error_code"].(float64) != 205401 {
+			go alarm_msg.SendAlarmMsg("短信验证码发送失败, Result:"+string(result), 2)
+		}
+		return false
 	}
-	return
 }
 
 func sendSms(mobile, tplId, code string) (rs []byte, err error) {
@@ -66,4 +62,60 @@ func sendSms(mobile, tplId, code string) (rs []byte, err error) {
 	}
 	defer resp.Body.Close()
 	return ioutil.ReadAll(resp.Body)
-}
+}
+
+// SendSmsCodeGj 发送国际短信
+func SendSmsCodeGj(mobile, vCode, areaNum string) bool {
+	result, err := sendSmsGj(mobile, vCode, areaNum)
+	if err != nil {
+		fmt.Println("发送短信失败")
+		return false
+	}
+	fmt.Println("result", string(result))
+	var netReturn map[string]interface{}
+	err = json.Unmarshal(result, &netReturn)
+	if err != nil {
+		//go SendEmail("短信验证码发送失败", "err:"+err.Error()+" result"+string(result), utils.EmailSendToUsers)
+		go alarm_msg.SendAlarmMsg("短信验证码发送失败, Err:"+err.Error()+";Result:"+string(result), 2)
+		return false
+	}
+	if netReturn["error_code"].(float64) == 0 {
+		fmt.Printf("接口返回result字段是:\r\n%v", netReturn["result"])
+		return true
+	} else {
+		// 忽略错误的手机号码这种错误
+		if netReturn["error_code"].(float64) != 205401 {
+			go alarm_msg.SendAlarmMsg("短信验证码发送失败, Result:"+string(result), 2)
+		}
+		return false
+	}
+}
+
+// sendSmsGj 发送国际短信
+func sendSmsGj(mobile, code, areaNum string) (rs []byte, err error) {
+	var Url *url.URL
+	apiURL := "http://v.juhe.cn/smsInternational/send.php"
+	//初始化参数
+	param := url.Values{}
+	//配置请求参数,方法内部已处理urlencode问题,中文参数可以直接传参
+	param.Set("mobile", mobile)           //接受短信的用户手机号码
+	param.Set("tplId", "10054")           //您申请的短信模板ID,根据实际情况修改
+	param.Set("tplValue", "#code#="+code) //您设置的模板变量,根据实际情况
+	param.Set("key", utils.JhGjAppKey)    //应用APPKEY(应用详细页查询)
+	param.Set("areaNum", areaNum)         //应用APPKEY(应用详细页查询)
+
+	Url, err = url.Parse(apiURL)
+	if err != nil {
+		fmt.Printf("解析url错误:\r\n%v", err)
+		return nil, err
+	}
+	//如果参数中有中文参数,这个方法会进行URLEncode
+	Url.RawQuery = param.Encode()
+	resp, err := http.Get(Url.String())
+	if err != nil {
+		fmt.Println("err:", err)
+		return nil, err
+	}
+	defer resp.Body.Close()
+	return ioutil.ReadAll(resp.Body)
+}

+ 28 - 0
services/wechat.go

@@ -263,3 +263,31 @@ func WxUsersGet() (openIdStr string) {
 	openIdStr = "'" + openIdStr + "'"
 	return
 }
+
+func WxAdminOpenIdGet() (openIdStr string) {
+	accessToken, err := WxGetRedisAccessToken(utils.AdminWxAppId, utils.AdminWxAppSecret)
+	if err != nil {
+		utils.FileLog.Info("GetWxAccessToken Err:%s", err.Error())
+		return
+	}
+	url := "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken
+	result, err := http.Get(url)
+	if err != nil {
+		utils.FileLog.Info("GetUser Err:", err.Error())
+		return
+	}
+	item := new(WxUsers)
+	err = json.Unmarshal(result, &item)
+	if err != nil {
+		fmt.Println("Unmarshal Err:", err.Error())
+		return
+	}
+	if item.Errcode != 0 {
+		utils.FileLog.Info("微信接口返回异常 Err:", item.Errmsg)
+		return
+	}
+	err = errors.New(item.Errmsg)
+	openIdStr = strings.Join(item.Data.Openid, "','")
+	openIdStr = "'" + openIdStr + "'"
+	return
+}

+ 29 - 226
services/wechat_send_msg.go

@@ -1,23 +1,19 @@
 package services
 
 import (
-	"bytes"
 	"encoding/json"
 	"fmt"
-	"hongze/hongze_mobile_admin/models/tables/report"
-	"hongze/hongze_mobile_admin/models/tables/user_template_record"
-	"hongze/hongze_mobile_admin/models/tables/wx_user"
+	"hongze/hongze_mobile_admin/models/tables/admin"
 	"hongze/hongze_mobile_admin/services/alarm_msg"
 	"hongze/hongze_mobile_admin/utils"
 	"io/ioutil"
 	"net/http"
-	"strconv"
 	"strings"
 	"time"
 	"errors"
 )
-
 type SendWxTemplate struct {
+	WxAppId        string   `description:"公众号appId"`
 	First          string   `description:"模板消息first字段"`
 	Keyword1       string   `description:"模板消息keyword1字段"`
 	Keyword2       string   `description:"模板消息keyword2字段"`
@@ -43,147 +39,6 @@ type BaseResponse struct {
 	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
 }
 
-
-
-func SendWxTemplateMsg(reportId int) (err error) {
-	var msg string
-	defer func() {
-		if err != nil {
-			go alarm_msg.SendAlarmMsg(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg), 3)
-			//go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
-			utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
-		}
-		if msg != "" {
-			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
-		}
-	}()
-	utils.FileLog.Info("%s", "services SendMsg")
-
-	report, err := report.GetReportById(reportId)
-	if err != nil {
-		msg = "GetReportInfo Err:" + err.Error()
-		return
-	}
-	if report == nil {
-		utils.FileLog.Info("报告信息不存在")
-		return
-	}
-	accessToken, err := WxGetAccessToken()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
-	//获取openid列表
-	openIdStr := WxUsersGet()
-	openIdList, err := wx_user.GetOpenIdList(openIdStr)
-	if err != nil {
-		msg = "get openIdList err:" + err.Error()
-		return
-	}
-	fmt.Println("openIdListCount:", len(openIdList))
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	fmt.Println("send start")
-	utils.FileLog.Info("send start")
-	//if report.MsgIsSend == 0 {
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-
-	redirectUrl := utils.TemplateRedirectUrl + strconv.Itoa(reportId)
-	keyword1 := "弘则日度点评"
-	first := "Hi,最新一期日度点评已上线,欢迎查看"
-	keyword2 := report.Title
-	//keyword3 := report.PublishTime.Format(utils.FormatDateTime)
-	keyword3 := report.PublishTime
-	keyword4 := report.Abstract
-
-	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"}
-
-	sendMap["template_id"] = utils.TemplateIdByProduct
-	sendMap["url"] = redirectUrl
-	sendMap["data"] = sendData
-	sendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(reportId), utils.TEMPLATE_MSG_REPORT)
-
-	//}
-	fmt.Println("send end")
-	utils.FileLog.Info("send end")
-	return
-}
-
-func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*wx_user.OpenIdList, resource string, sendType int) (err error) {
-	for _, v := range items {
-		sendMap["touser"] = v.OpenId
-		data, err := json.Marshal(sendMap)
-		if err != nil {
-			fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
-			utils.FileLog.Info(fmt.Sprintf("SendTemplateMsgOne Marshal Err:%s", err.Error()))
-			return err
-		}
-		err = toSendTemplateMsg(sendUrl, data, resource, sendType, v)
-		if err != nil {
-			fmt.Println("send err:", err.Error())
-			utils.FileLog.Info(fmt.Sprintf("ToSendTemplateMsg Err:%s", err.Error()))
-		}
-	}
-	return
-}
-
-func toSendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, dataItem *wx_user.OpenIdList) (err error) {
-	utils.FileLog.Info("Send:" + string(data))
-	client := http.Client{}
-	resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
-	if err != nil {
-		return
-	}
-	defer resp.Body.Close()
-
-	body, _ := ioutil.ReadAll(resp.Body)
-	utils.FileLog.Info("SendResult:" + string(body))
-	var templateResponse SendTemplateResponse
-	err = json.Unmarshal(body, &templateResponse)
-	if err != nil {
-		utils.FileLog.Info("SendResult Unmarshal Err:%s", err.Error())
-		return err
-	}
-
-	//新增模板消息推送记录
-	{
-		sendStatus := 0
-		if templateResponse.Errcode == 0 {
-			sendStatus = 1
-		} else {
-			sendStatus = 0
-		}
-		tr := &user_template_record.UserTemplateRecord{
-			Id:         0,
-			UserId:     dataItem.UserId,
-			OpenId:     dataItem.OpenId,
-			Resource:   resource,
-			SendData:   string(data),
-			Result:     string(body),
-			CreateDate: time.Now().Format(utils.FormatDate),
-			CreateTime: time.Now().Format(utils.FormatDateTime),
-			SendStatus: sendStatus,
-			SendType:   sendType,
-		}
-		go func() {
-			err = user_template_record.AddUserTemplateRecord(tr)
-			if err != nil {
-				utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
-			}
-		}()
-	}
-
-	return
-}
-
 type SendTemplateResponse struct {
 	Errcode int    `json:"errcode"`
 	Errmsg  string `json:"errmsg"`
@@ -204,21 +59,11 @@ func SendCompanyApplyWxTemplateMsg(mobile, redirectUrl, wxAppPath string, wxMsgM
 		}
 	}()
 	utils.FileLog.Info("%s", "services SendMsg")
-
-	accessToken, err := WxGetAccessToken()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
 	utils.FileLog.Info("mobile:%s", mobile)
 
 	//获取openid列表
-	//openIdStr := WxUsersGet()
-	openIdList, err := wx_user.GetOpenIdListByMobile(mobile)
+	openIdStr := WxAdminOpenIdGet()
+	openIdList, err := admin.GetOpenIdListByMobile(mobile, openIdStr)
 	if err != nil {
 		msg = "get openIdList err:" + err.Error()
 		return
@@ -274,6 +119,7 @@ func SendCompanyApplyWxTemplateMsg(mobile, redirectUrl, wxAppPath string, wxMsgM
 		}
 
 		sendInfo := new(SendWxTemplate)
+		sendInfo.WxAppId = utils.AdminWxAppId
 		sendInfo.First = first
 		sendInfo.Keyword1 = keyword1
 		sendInfo.Keyword2 = keyword2
@@ -294,7 +140,7 @@ func SendCompanyApplyWxTemplateMsg(mobile, redirectUrl, wxAppPath string, wxMsgM
 	return
 }
 
-// 路演->销售收到处理结果
+// SendWxMsgWithRoadshowDetailResult 路演->销售收到处理结果
 func SendWxMsgWithRoadshowDetailResult(first, keyword1, keyword2, remark, mobile, redirectUrl, wxAppPath string) (err error) {
 	var msg string
 	defer func() {
@@ -308,25 +154,16 @@ func SendWxMsgWithRoadshowDetailResult(first, keyword1, keyword2, remark, mobile
 		}
 	}()
 	utils.FileLog.Info("%s", "services SendMsg")
-
-	accessToken, err := WxGetAccessToken()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
 	utils.FileLog.Info("mobile:%s", mobile)
 
 	//获取openid列表
-	//openIdStr := WxUsersGet()
-	openIdList, err := wx_user.GetOpenIdListByMobile(mobile)
+	openIdStr := WxAdminOpenIdGet()
+	openIdList, err := admin.GetOpenIdListByMobile(mobile, openIdStr)
 	if err != nil {
 		msg = "get openIdList err:" + err.Error()
 		return
 	}
+
 	utils.FileLog.Info("openIdListCount:%s", len(openIdList))
 	//fmt.Println("openIdListCount:", len(openIdList))
 	if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
@@ -357,6 +194,7 @@ func SendWxMsgWithRoadshowDetailResult(first, keyword1, keyword2, remark, mobile
 		}
 
 		sendInfo := new(SendWxTemplate)
+		sendInfo.WxAppId = utils.AdminWxAppId
 		sendInfo.First = first
 		sendInfo.Keyword1 = keyword1
 		sendInfo.Keyword2 = keyword2
@@ -369,14 +207,13 @@ func SendWxMsgWithRoadshowDetailResult(first, keyword1, keyword2, remark, mobile
 		sendInfo.Resource = wxAppPath
 		sendInfo.SendType = utils.TEMPLATE_MSG_ACTIVITY_APPOINTMENT
 		sendInfo.OpenIdArr = openIdArr
-
 		err = SendTemplateMsg(sendInfo)
 	}
 	utils.FileLog.Info("send end")
 	return
 }
 
-// 路演->研究员收到待处理的申请
+// SendWxMsgWithRoadshowPending 路演->研究员收到待处理的申请
 func SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath, mobile string) (err error) {
 	//utils.WxMsgTemplateIdWithRoadshowPending
 	var msg string
@@ -392,19 +229,9 @@ func SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4,
 	}()
 	utils.FileLog.Info("%s", "services SendMsg")
 
-	accessToken, err := WxGetAccessToken()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
-
 	//获取openid列表
-	//openIdStr := WxUsersGet()
-	openIdList, err := wx_user.GetOpenIdListByMobile(mobile)
+	openIdStr := WxAdminOpenIdGet()
+	openIdList, err := admin.GetOpenIdListByMobile(mobile, openIdStr)
 	if err != nil {
 		msg = "get openIdList err:" + err.Error()
 		return
@@ -440,6 +267,7 @@ func SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4,
 		}
 
 		sendInfo := new(SendWxTemplate)
+		sendInfo.WxAppId = utils.AdminWxAppId
 		sendInfo.First = first
 		sendInfo.Keyword1 = keyword1
 		sendInfo.Keyword2 = keyword2
@@ -461,7 +289,7 @@ func SendWxMsgWithRoadshowPending(first, keyword1, keyword2, keyword3, keyword4,
 	return
 }
 
-// 路演->研究员收到活动删除通知
+// SendWxMsgWithRoadshowDeleteNotice 路演->研究员收到活动删除通知
 func SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, remark, wxAppPath, mobile string) (err error) {
 	var msg string
 	defer func() {
@@ -475,20 +303,9 @@ func SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, remark, wxAppP
 		}
 	}()
 	utils.FileLog.Info("%s", "services SendMsg")
-
-	accessToken, err := WxGetAccessToken()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
-
 	//获取openid列表
-	//openIdStr := WxUsersGet()
-	openIdList, err := wx_user.GetOpenIdListByMobile(mobile)
+	openIdStr := WxAdminOpenIdGet()
+	openIdList, err := admin.GetOpenIdListByMobile(mobile, openIdStr)
 	if err != nil {
 		msg = "get openIdList err:" + err.Error()
 		return
@@ -519,6 +336,7 @@ func SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, remark, wxAppP
 		}
 
 		sendInfo := new(SendWxTemplate)
+		sendInfo.WxAppId = utils.AdminWxAppId
 		sendInfo.First = first
 		sendInfo.Keyword1 = keyword1
 		sendInfo.Keyword2 = keyword2
@@ -538,7 +356,7 @@ func SendWxMsgWithRoadshowDeleteNotice(first, keyword1, keyword2, remark, wxAppP
 	return
 }
 
-// 给销售发送 用印申请已签回的模版消息
+// SendSealFinishedWxTemplateMsg 给销售发送 用印申请已签回的模版消息
 func SendSealFinishedWxTemplateMsg(mobile string, companyName string, sealId int) (err error) {
 	var msg string
 	defer func() {
@@ -552,22 +370,14 @@ func SendSealFinishedWxTemplateMsg(mobile string, companyName string, sealId int
 		}
 	}()
 	utils.FileLog.Info("%s", "services SendMsg")
-	accessToken, err := WxGetAccessToken()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
 	utils.FileLog.Info("mobile:%s", mobile)
-	//openIdStr := WxUsersGet()
-	openIdList, err := wx_user.GetOpenIdListByMobile(mobile)
+	openIdStr := WxAdminOpenIdGet()
+	openIdList, err := admin.GetOpenIdListByMobile(mobile, openIdStr)
 	if err != nil {
 		msg = "get openIdList err:" + err.Error()
 		return
 	}
+
 	utils.FileLog.Info("openIdListCount:%s", len(openIdList))
 
 	if len(openIdList) > 0 && utils.WxMsgTemplateIdWithSealApplyFinished != "" {
@@ -602,6 +412,7 @@ func SendSealFinishedWxTemplateMsg(mobile string, companyName string, sealId int
 		}
 
 		sendInfo := new(SendWxTemplate)
+		sendInfo.WxAppId = utils.AdminWxAppId
 		sendInfo.First = first
 		sendInfo.Keyword1 = keyword1
 		sendInfo.Keyword2 = keyword2
@@ -620,7 +431,7 @@ func SendSealFinishedWxTemplateMsg(mobile string, companyName string, sealId int
 }
 
 // SendYbQuestionDistributeWxMsg 推送研报小程序模板消息-问答社区分配
-func SendYbQuestionDistributeWxMsg(questionId, userId int, openid, questionTitle string) (err error) {
+func SendYbQuestionDistributeWxMsg(questionId, adminId int, openid, questionTitle string) (err error) {
 	var errMsg string
 	defer func() {
 		if err != nil {
@@ -629,20 +440,10 @@ func SendYbQuestionDistributeWxMsg(questionId, userId int, openid, questionTitle
 			go alarm_msg.SendAlarmMsg(alarmMsg, 3)
 		}
 	}()
-
-	accessToken, err := WxGetAccessToken()
-	if err != nil {
-		errMsg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		errMsg = "accessToken is empty"
-		return
-	}
-	openIdList := make([]*wx_user.OpenIdList, 0)
-	openIdList = append(openIdList, &wx_user.OpenIdList{
+	openIdList := make([]*admin.OpenIdList, 0)
+	openIdList = append(openIdList, &admin.OpenIdList{
 		OpenId: openid,
-		UserId: userId,
+		AdminId: adminId,
 	})
 
 	//sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
@@ -674,6 +475,7 @@ func SendYbQuestionDistributeWxMsg(questionId, userId int, openid, questionTitle
 	}
 
 	sendInfo := new(SendWxTemplate)
+	sendInfo.WxAppId = utils.AdminWxAppId
 	sendInfo.First = first
 	sendInfo.Keyword1 = keyword1
 	sendInfo.Keyword2 = keyword2
@@ -685,6 +487,7 @@ func SendYbQuestionDistributeWxMsg(questionId, userId int, openid, questionTitle
 	sendInfo.SendType = utils.TEMPLATE_MSG_YB_COMMUNITY_QUESTION
 	sendInfo.OpenIdArr = openIdArr
 	err = SendTemplateMsg(sendInfo)
+	utils.FileLog.Info("send end")
 	return
 }
 

+ 13 - 36
services/yb/community_question.go

@@ -9,7 +9,6 @@ import (
 	"hongze/hongze_mobile_admin/models/tables/company_approval_message"
 	"hongze/hongze_mobile_admin/models/tables/sys_role"
 	"hongze/hongze_mobile_admin/models/tables/sys_role_admin"
-	"hongze/hongze_mobile_admin/models/tables/user_record"
 	"hongze/hongze_mobile_admin/models/tables/variety_classify"
 	"hongze/hongze_mobile_admin/models/tables/variety_tag"
 	"hongze/hongze_mobile_admin/models/tables/wx_user"
@@ -199,22 +198,7 @@ func DistributeQuestion(questionId, adminId, researchGroupFirstId, researchGroup
 	}
 	// 回复人openid, 此处可能会出现取不到openid的情况, 可直接忽略掉
 	replierUserId := int(userInfo.UserId)
-	userRecord, e := user_record.GetUserRecordByUserId(replierUserId, utils.USER_RECORD_PLATFORM_RDDP)
-	if e != nil && e.Error() != utils.ErrNoRow() {
-		errMsg = "分配失败, 研究员相关的联系人记录有误"
-		err = errors.New("获取手机号所属联系人失败, Err:" + e.Error())
-		return
-	}
 	replierOpenid := ""
-	if userRecord != nil {
-		if userRecord.Subscribe == 0 {
-			errMsg = "该研究员已取消关注公众号,无法收到消息通知"
-		} else {
-			replierOpenid = userRecord.OpenId
-		}
-	} else {
-		errMsg = "该研究员未关注公众号,无法收到消息通知"
-	}
 	// 分组、品种权限信息
 	//firstGroup, e := admin.GetResearchGroupById(researchGroupFirstId)
 	firstGroup, e := variety_classify.GetVarietyClassifyById(researchGroupFirstId)
@@ -305,28 +289,21 @@ func SendMsgToReplier(questionId int) (errMsg string, err error) {
 	}
 	// 回复人openid为空时查询当前是否已有openid
 	updateCols := make([]string, 0)
-	if item.ReplierOpenid == "" {
-		userRecord, e := user_record.GetUserRecordByUserId(item.ReplierUserId, utils.USER_RECORD_PLATFORM_RDDP)
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			errMsg = "发送失败, 研究员相关的联系人记录有误"
-			err = errors.New("获取手机号所属联系人失败, Err:" + e.Error())
-			return
-		}
-		if userRecord == nil {
-			errMsg = "该研究员未关注公众号,无法发送消息通知"
-			err = errors.New("回复人openid为空, 不可推送")
-			return
-		}
-		if userRecord.Subscribe == 0 {
-			errMsg = "该研究员已取消关注公众号,无法发送消息通知"
-			err = errors.New("回复人取消关注了公众号, 不可推送")
-			return
-		}
-		updateCols = append(updateCols, "ReplierOpenid")
-		item.ReplierOpenid = userRecord.OpenId
+
+	// 找到研究员的手机号,并查到管理员绑定的账号,找到对应的openid
+	adminInfo, e := admin.GetAdminById(item.ReplierAdminId)
+	if e != nil {
+		errMsg = "发送失败, 研究员账号查询失败"
+		err = errors.New("发送失败, 研究员账号查询失败, Err:" + e.Error())
+		return
+	}
+	if adminInfo.OpenId == "" {
+		errMsg = "该研究员未关注公众号,无法发送消息通知"
+		err = errors.New("回复人openid为空, 不可推送")
+		return
 	}
 
-	if e := services.SendYbQuestionDistributeWxMsg(item.CommunityQuestionId, item.ReplierUserId, item.ReplierOpenid, item.QuestionContent); e != nil {
+	if e := services.SendYbQuestionDistributeWxMsg(item.CommunityQuestionId, item.ReplierUserId, adminInfo.OpenId, item.QuestionContent); e != nil {
 		err = errors.New("推送模板消息失败, Err:" + e.Error())
 		return
 	}

+ 56 - 4
services/yb/community_question_comment.go

@@ -4,6 +4,7 @@ import (
 	"errors"
 	"fmt"
 	ybResponse "hongze/hongze_mobile_admin/models/response/yb"
+	"hongze/hongze_mobile_admin/models/tables/chart_permission"
 	"hongze/hongze_mobile_admin/models/tables/company_approval_message"
 	"hongze/hongze_mobile_admin/models/tables/wx_user"
 	"hongze/hongze_mobile_admin/models/tables/yb_community_question_comment"
@@ -18,8 +19,11 @@ import (
 func GetCommunityQuestionCommentList(condition string, pars []interface{}, startSize, pageSize, source int) (total int, commentList []*ybResponse.CommunityQuestionCommentItem, err error) {
 	commentList = make([]*ybResponse.CommunityQuestionCommentItem, 0)
 	list := make([]*yb_community_question_comment.YbCommunityQuestionCommentAndQuestion, 0)
+
 	// 来源
-	if source == 1 {
+	switch source {
+	case 1:
+		// 问答社区
 		qaTotal, qaList, e := yb_community_question_comment.GetCommunityQuestionCommentList(condition, pars, startSize, pageSize)
 		if e != nil {
 			err = errors.New("获取问题列表失败 Err:" + e.Error())
@@ -27,7 +31,7 @@ func GetCommunityQuestionCommentList(condition string, pars []interface{}, start
 		}
 		list = qaList
 		total = qaTotal
-	} else {
+	case 2:
 		// 视频社区
 		vcTotal, vcList, e := yb_community_question_comment.GetCommunityVideoCommentList(condition, pars, startSize, pageSize)
 		if e != nil {
@@ -36,6 +40,45 @@ func GetCommunityQuestionCommentList(condition string, pars []interface{}, start
 		}
 		list = vcList
 		total = vcTotal
+	case 3:
+		// 路演视频
+		rvTotal, rvList, e := yb_community_question_comment.GetRoadVideoCommentList(condition, pars, startSize, pageSize)
+		if e != nil {
+			err = errors.New("获取路演视频评论列表失败 Err:" + e.Error())
+			return
+		}
+		// 品种名称
+		if len(rvList) > 0 {
+			cpList, e := chart_permission.GetChartPermissionList()
+			if e != nil {
+				err = errors.New("获取路演视频品种失败 Err:" + e.Error())
+				return
+			}
+			cpMap := make(map[int]string, 0)
+			for i := range cpList {
+				cpMap[cpList[i].ChartPermissionId] = cpList[i].PermissionName
+			}
+
+			for i := range rvList {
+				if rvList[i].ChartPermissionIds == "" {
+					continue
+				}
+				ids := utils.JoinStr2IntArr(strings.ReplaceAll(rvList[i].ChartPermissionIds, `'`, ``), ",")
+				if len(ids) == 0 {
+					continue
+				}
+				cpArr := make([]string, 0)
+				for s := range ids {
+					if cpMap[ids[s]] != "" {
+						cpArr = append(cpArr, cpMap[ids[s]])
+					}
+				}
+				rvList[i].TagName = strings.Join(cpArr, ",")
+			}
+		}
+
+		list = rvList
+		total = rvTotal
 	}
 
 	if len(list) == 0 {
@@ -161,9 +204,18 @@ func afterDeleteComment(communityQuestionComment *yb_community_question_comment.
 			go alarm_msg.SendAlarmMsg("问答评论信息删除后,标记站内消息失败"+time.Now().Format(utils.FormatDateTime)+";Err:"+err.Error(), 3)
 		}
 	}()
-	sourceType := services.CompanyApprovalMessageSourceTypeByQuestionComment
-	if communityQuestionComment.Source == 2 {
+
+	sourceType := 0
+	switch communityQuestionComment.Source {
+	case 1:
+		sourceType = services.CompanyApprovalMessageSourceTypeByQuestionComment
+	case 2:
 		sourceType = services.CompanyApprovalMessageSourceTypeByVideoComment
+	case 3:
+		sourceType = services.CompanyApprovalMessageSourceTypeByRoadVideoComment
+	default:
+		err = errors.New("sourceType有误")
+		return
 	}
 	err = company_approval_message.CancelCompanyApprovalMessage(int(communityQuestionComment.CommunityQuestionCommentId), sourceType)
 	return

+ 33 - 0
utils/common.go

@@ -780,4 +780,37 @@ func InArrayByInt(idIntList []int, searchId int) (has bool) {
 		}
 	}
 	return
+}
+
+// GetOrmInReplace 获取orm的in查询替换?的方法
+func GetOrmInReplace(num int) string {
+	template := make([]string, num)
+	for i := 0; i < num; i++ {
+		template[i] = "?"
+	}
+	return strings.Join(template, ",")
+}
+
+// JoinStr2IntArr 拼接字符串转[]int
+func JoinStr2IntArr(str, sep string) (arr []int) {
+	arr = make([]int, 0)
+	if str == "" {
+		return
+	}
+	if sep == "" {
+		sep = ","
+	}
+	strArr := strings.Split(str, sep)
+	if len(strArr) == 0 {
+		return
+	}
+	for i := range strArr {
+		v, e := strconv.Atoi(strArr[i])
+		// int2str此处过滤掉无效int
+		if e != nil {
+			continue
+		}
+		arr = append(arr, v)
+	}
+	return
 }

+ 13 - 13
utils/config.go

@@ -179,18 +179,18 @@ func wxConfig() {
 		TemplateIdByProduct = "Cp2wF8gvBtxyWV4DeYuI172oqwyYXVRSm3AyJO42d84"
 		TemplateRedirectUrl = "https://ficc.hzinsights.com/reportdtl?id="
 		WxPlatform = 1
-		TemplateIdByCompanyApply = "ZKcOfNIWBpwHJxpptufHIK1mp2nIwkT3cxub-35cFqI"
+		TemplateIdByCompanyApply = "yqaDUavXAKBpsPqTr0zYXAGIQYeCijZtWwFsT07wTbE"
 		TemplateCompanyApplyRedirectUrl = "https://ficc.hzinsights.com/approval/approval/list"
 
 		//路演
-		WxMsgTemplateIdWithRoadshowPending = "PaoDanHGlt1kFw5q-4_ipJSwO3FyZpxSSNg4rwB7YCk"      //路演->研究员收到待处理的申请
-		WxMsgTemplateIdWithRoadshowDetailResult = "dYg6iHooRq74PyCXmw_Ns7qdJZmbtLoKS2p2FKeaXl0" //路演->销售收到处理结果
-		WxMsgTemplateIdWithRoadshowDeleteNotice = "dYg6iHooRq74PyCXmw_Ns7qdJZmbtLoKS2p2FKeaXl0" //路演->研究员收到活动删除通知
+		WxMsgTemplateIdWithRoadshowPending = "1JG9fvKx9o9B-wkZe_gBFQQzMBnp07-hvpZI9QiFcKQ"      //路演->研究员收到待处理的申请
+		WxMsgTemplateIdWithRoadshowDetailResult = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" //路演->销售收到处理结果
+		WxMsgTemplateIdWithRoadshowDeleteNotice = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" //路演->研究员收到活动删除通知
 
-		WxMsgTemplateIdWithSealApplyFinished   = "dYg6iHooRq74PyCXmw_Ns7qdJZmbtLoKS2p2FKeaXl0"   // 用印申请-已签回通知
+		WxMsgTemplateIdWithSealApplyFinished   = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450"   // 用印申请-已签回通知
 
 		// 研报小程序
-		WxMsgTemplateIdWithYbCommunityQuestion = "dYg6iHooRq74PyCXmw_Ns7qdJZmbtLoKS2p2FKeaXl0" // 研报小程序->问答社区回复通知
+		WxMsgTemplateIdWithYbCommunityQuestion = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" // 研报小程序->问答社区回复通知
 
 		//内部员工公众号(弘则部门)
 		AdminWxAppId = "wx1392111da5426e9e"
@@ -204,23 +204,23 @@ func wxConfig() {
 		TemplateIdByProduct = "-YjuPOB7Fqd-S3ilabYa6wvjDY9aXmeEfPN6DCiy-EY"
 		TemplateRedirectUrl = "http://rddpweb.brilliantstart.cn/reportdtl?id="
 		WxPlatform = 1
-		TemplateIdByCompanyApply = "eTalI1LbiT_B0mTaBeDTlfSMITenK8dQIgEB5yqjjvA"
+		TemplateIdByCompanyApply = "yqaDUavXAKBpsPqTr0zYXAGIQYeCijZtWwFsT07wTbE"
 		TemplateCompanyApplyRedirectUrl = "http://advisoryadmin.brilliantstart.cn/approval/approval/list"
 
 		//路演
-		WxMsgTemplateIdWithRoadshowPending = "qfNuops-sKrfIkbA7U97A7gSrX03mUpoEpJksRUdloo"      //路演->研究员收到待处理的申请
-		WxMsgTemplateIdWithRoadshowDetailResult = "CB7bOl7f3viMG4s1uhRo7WM0Jbx3WvodKuIZ8A_z8fM" //路演->销售收到处理结果
-		WxMsgTemplateIdWithRoadshowDeleteNotice = "CB7bOl7f3viMG4s1uhRo7WM0Jbx3WvodKuIZ8A_z8fM" //路演->研究员收到活动删除通知
+		WxMsgTemplateIdWithRoadshowPending = "1JG9fvKx9o9B-wkZe_gBFQQzMBnp07-hvpZI9QiFcKQ"      //路演->研究员收到待处理的申请
+		WxMsgTemplateIdWithRoadshowDetailResult = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" //路演->销售收到处理结果
+		WxMsgTemplateIdWithRoadshowDeleteNotice = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" //路演->研究员收到活动删除通知
 
-		WxMsgTemplateIdWithSealApplyFinished   = "CB7bOl7f3viMG4s1uhRo7WM0Jbx3WvodKuIZ8A_z8fM"   // 用印申请-已签回通知
+		WxMsgTemplateIdWithSealApplyFinished   = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450"   // 用印申请-已签回通知
 		
 		// 研报小程序
-		WxMsgTemplateIdWithYbCommunityQuestion = "CB7bOl7f3viMG4s1uhRo7WM0Jbx3WvodKuIZ8A_z8fM" // 研报小程序->问答社区回复通知
+		WxMsgTemplateIdWithYbCommunityQuestion = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" // 研报小程序->问答社区回复通知
 
 		//内部员工公众号(弘则部门)
 		AdminWxAppId = "wx1392111da5426e9e"
 		AdminWxAppSecret = "30eceb7cf29bf2f046031155ab55d7b4"
-		
+
 		SendWxTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_template_msg"
 	}
 

+ 6 - 0
utils/constants.go

@@ -143,6 +143,12 @@ const (
 	TEMPLATE_MSG_CYGX_ARTICLE_ADD                 //查研观向报告更新推送  13
 	TEMPLATE_MSG_YB_PRICE_DRIVEN                  //研报价格驱动 14
 	TEMPLATE_MSG_SEAL_FINISHED                    //用印申请已迁回通知 15
+	TEMPLATE_MSG_YB_COMMUNITY_VIDEO               //研报视频社区 16
+	TEMPLATE_MSG_MOVE_SELLER                      //销售"移动/删除联系人"权限变更通知 17
+	TEMPLATE_MSG_YB_VOICE_BROADCAST               //研报语音播报 18
+	TEMPLATE_MSG_YB_VIDEO_UPLOAD                  //研报视频上传 19
+	TEMPLATE_MSG_YB_ROAD_VIDEO                    //研报线上路演 20
+	TEMPLATE_MSG_CYGX_ROADSHOW_VIDEO              //查研观向微路演视频 21
 )