فهرست منبع

feat:新增问答接口

Roc 2 سال پیش
والد
کامیت
4aecbd2992

+ 234 - 0
controllers/yb/community_question.go

@@ -0,0 +1,234 @@
+package yb
+
+import (
+	"encoding/json"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hongze_mobile_admin/controllers"
+	ybRequest "hongze/hongze_mobile_admin/models/request/yb"
+	"hongze/hongze_mobile_admin/services/yb"
+	"hongze/hongze_mobile_admin/utils"
+	"strings"
+)
+
+type CommunityQuestionController struct {
+	controllers.BaseAuth
+}
+
+// QuestionList
+// @Title 获取问答列表
+// @Description 获取问答列表
+// @Param   ReplyStatus	query	int		false	"提问状态 1-待分配 2-待回答 3-已回答"
+// @Param   ReplierIds	query	string	false	"回复人ID,多个用英文逗号分割"
+// @Param   SortParam   query   string  false     "排序字段参数,用来排序的字段, 枚举值:'ClickNum':点击量"
+// @Param   SortType   query   string  true       "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
+// @Success 200 {object} response.CommunityQuestionListResp
+// @router /community/question/list [get]
+func (c *CommunityQuestionController) QuestionList() {
+	sysUser := c.AdminWx
+
+	// 权限校验
+	msg, err := yb.CheckCommunityQuestionPermission(sysUser.AdminId)
+	if err != nil {
+		c.FailWithMessage(msg, err.Error())
+		return
+	}
+
+	condition := ""
+	pars := make([]interface{}, 0)
+	replyStatus, _ := c.GetInt("ReplyStatus", 0)
+	if replyStatus > 0 {
+		condition += ` AND q.reply_status = ?`
+		pars = append(pars, replyStatus)
+	}
+	replierIds := c.GetString("ReplierIds", "")
+	if replierIds != "" {
+		condition += ` AND q.replier_admin_id IN (` + replierIds + `)`
+	}
+	// 排序相关
+	sortParam := c.GetString("SortParam")
+	sortType := c.GetString("SortType")
+	orderStr := ""
+	if sortType != "" && strings.ToLower(sortType) != "desc" && strings.ToLower(sortType) != "asc" {
+		c.FailWithMessage("请输入正确的排序类型", "请输入正确的排序类型")
+		return
+	}
+	if sortParam == "ClickNum" {
+		orderStr = "  ORDER BY l.click_num"
+		if sortType != "" {
+			orderStr += " " + sortType
+		} else {
+			orderStr += " DESC"
+		}
+
+		orderStr += ", q.create_time DESC"
+	}
+	var startSize int
+	pageSize, _ := c.GetInt("PageSize")
+	currentIndex, _ := c.GetInt("CurrentIndex")
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	total, resp, err := yb.GetQuestionList(condition, pars, orderStr, startSize, pageSize)
+	if err != nil {
+		c.FailWithMessage("获取问答列表失败", "QuestionList ErrMsg:"+err.Error())
+		return
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+	c.OkDetailed(resp, "获取成功")
+}
+
+// QuestionDistribute
+// @Title 分配回复人
+// @Description 获取问答列表
+// @Param   ReplyStatus	query	int		false	"提问状态 1-待分配 2-待回答 3-已回答"
+// @Param   ReplierIds	query	string	false	"回复人ID,多个用英文逗号分割"
+// @Success 200 string "操作成功"
+// @router /community/question/distribute [post]
+func (c *CommunityQuestionController) QuestionDistribute() {
+	sysUser := c.AdminWx
+	// 权限校验
+	msg, err := yb.CheckCommunityQuestionPermission(sysUser.AdminId)
+	if err != nil {
+		c.FailWithMessage(msg, err.Error())
+		return
+	}
+
+	var req ybRequest.QuestionDistributeReq
+	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil {
+		c.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())
+		return
+	}
+	errMsg, err := yb.DistributeQuestion(req.QuestionId, req.AdminId, req.ResearchGroupFirstId, req.ResearchGroupSecondId, sysUser.AdminId)
+	if err != nil {
+		c.FailWithMessage(errMsg, "DistributeQuestion,Err:"+err.Error())
+		return
+	}
+	c.OkWithMessage(errMsg)
+}
+
+// QuestionDelete
+// @Title 删除提问
+// @Description 删除提问
+// @Param   QuestionId	query	int	false	"问题ID"
+// @Success 200 string "操作成功"
+// @router /community/question/delete [post]
+func (c *CommunityQuestionController) QuestionDelete() {
+	sysUser := c.AdminWx
+	// 权限校验
+	msg, err := yb.CheckCommunityQuestionPermission(sysUser.AdminId)
+	if err != nil {
+		c.FailWithMessage(msg, err.Error())
+		return
+	}
+
+	var req ybRequest.QuestionDeleteReq
+	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil {
+		c.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())
+		return
+	}
+	if err := yb.SoftDeleteQuestion(req.QuestionId); err != nil {
+		c.FailWithMessage("删除提问失败", "DeleteQuestion,Err:"+err.Error())
+		return
+	}
+	c.OkWithMessage("删除成功")
+}
+
+// SendDistributeTemplateMsg
+// @Title 推送模板消息给回复人
+// @Description 推送模板消息给回复人
+// @Param   QuestionId	query	int	false	"问题ID"
+// @Success 200 string "操作成功"
+// @router /community/question/send_template_msg [post]
+func (c *CommunityQuestionController) SendDistributeTemplateMsg() {
+	sysUser := c.AdminWx
+	// 权限校验
+	msg, err := yb.CheckCommunityQuestionPermission(sysUser.AdminId)
+	if err != nil {
+		c.FailWithMessage(msg, err.Error())
+		return
+	}
+
+	var req ybRequest.QuestionMsgSendReq
+	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil {
+		c.FailWithMessage("参数解析异常!", "SendDistributeTemplateMsg,参数解析失败,Err:"+err.Error())
+		return
+	}
+	errMsg, err := yb.SendMsgToReplier(req.QuestionId)
+	if err != nil {
+		c.FailWithMessage(errMsg, "SendDistributeTemplateMsg,Err:"+err.Error())
+		return
+	}
+	c.OkWithMessage("推送成功")
+}
+
+// QuestionEdit
+// @Title 编辑问题
+// @Description 编辑问题
+// @Param   QuestionId		query	int		true	"问题ID"
+// @Param   QuestionContent	query	string	true	"问题内容"
+// @Success 200 string "操作成功"
+// @router /community/question/edit [post]
+func (c *CommunityQuestionController) QuestionEdit() {
+	sysUser := c.AdminWx
+	// 权限校验
+	msg, err := yb.CheckCommunityQuestionPermission(sysUser.AdminId)
+	if err != nil {
+		c.FailWithMessage(msg, err.Error())
+		return
+	}
+
+	var req ybRequest.QuestionEditReq
+	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil {
+		c.FailWithMessage("参数解析异常!", "QuestionEdit,参数解析失败,Err:"+err.Error())
+		return
+	}
+	if req.QuestionId <= 0 {
+		c.FailWithMessage("问题ID有误", "问题ID有误")
+		return
+	}
+	if req.QuestionContent == "" {
+		c.FailWithMessage("内容不可为空", "内容不可为空")
+		return
+	}
+	contentRune := []rune(req.QuestionContent)
+	if len(contentRune) > 25 {
+		c.FailWithMessage("问题字数不可超过25个字符", "问题字数不可超过25个字符")
+		return
+	}
+	errMsg, err := yb.EditQuestion(req.QuestionId, req.QuestionContent)
+	if err != nil {
+		c.FailWithMessage(errMsg, "QuestionEdit ErrMsg:"+err.Error())
+		return
+	}
+	c.OkWithMessage("修改成功")
+}
+
+// UserInfo
+// @Title 获取提问者基本信息
+// @Description 获取提问者基本信息
+// @Param   UserId	query	int	false	"用户ID"
+// @Success 200 {object} response.CommunityQuestionListResp
+// @router /community/question/user [get]
+func (c *CommunityQuestionController) UserInfo() {
+	questionId, _ := c.GetInt("QuestionId")
+	if questionId <= 0 {
+		c.FailWithMessage("请输入正确的提问ID", "请输入正确的提问ID")
+		return
+	}
+
+	resp, err := yb.GetQuestionCompanyUser(questionId)
+	if err != nil {
+		c.FailWithMessage("用户不存在或者查询出错", "UserInfo ErrMsg:"+err.Error())
+		return
+	}
+
+	c.OkDetailed(resp, "获取成功")
+	return
+}

+ 14 - 0
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/community_question"
 	"hongze/hongze_mobile_admin/models/tables/company"
 	"hongze/hongze_mobile_admin/models/tables/company_approval"
 	"hongze/hongze_mobile_admin/models/tables/company_approval_message"
@@ -31,6 +32,8 @@ import (
 	"hongze/hongze_mobile_admin/models/tables/report"
 	"hongze/hongze_mobile_admin/models/tables/resource"
 	"hongze/hongze_mobile_admin/models/tables/seal"
+	"hongze/hongze_mobile_admin/models/tables/sys_role"
+	"hongze/hongze_mobile_admin/models/tables/sys_role_admin"
 	"hongze/hongze_mobile_admin/models/tables/wx_token"
 	"hongze/hongze_mobile_admin/models/tables/wx_user"
 	"hongze/hongze_mobile_admin/utils"
@@ -60,6 +63,8 @@ func init() {
 	orm.RegisterModel(
 		new(admin.Admin),
 		new(admin_record.AdminRecord),
+		new(sys_role.SysRole),
+		new(sys_role_admin.SysRoleAdmin),
 		new(approval_flow.ApprovalFlow),
 		new(approval_flow_node.ApprovalFlowNode),
 		new(company.Company),
@@ -94,6 +99,15 @@ func init() {
 		new(company_product_update_log.CompanyProductUpdateLog), //客户产品状态变更记录表
 	)
 
+	// 社区问答相关
+	initCommunity()
+}
+
+// initCommunity 社区问答相关
+func initCommunity() {
+	orm.RegisterModel(
+		new(community_question.CommunityQuestion), //社区问答
+	)
 }
 
 func InitDb() {}

+ 21 - 0
models/request/yb/community_question.go

@@ -0,0 +1,21 @@
+package yb
+
+type QuestionDeleteReq struct {
+	QuestionId int `description:"问题ID"`
+}
+
+type QuestionDistributeReq struct {
+	QuestionId            int `description:"问题ID"`
+	AdminId               int `description:"研究员ID"`
+	ResearchGroupFirstId  int `description:"研究方向一级分组ID"`
+	ResearchGroupSecondId int `description:"研究方向二级分组ID"`
+}
+
+type QuestionMsgSendReq struct {
+	QuestionId int `description:"问题ID"`
+}
+
+type QuestionEditReq struct {
+	QuestionId      int    `description:"问题ID"`
+	QuestionContent string `description:"问题内容"`
+}

+ 70 - 0
models/response/yb/community_question.go

@@ -0,0 +1,70 @@
+package yb
+
+import (
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+type CommunityQuestionListResp struct {
+	Paging *paging.PagingItem
+	List   []*CommunityQuestionItem `description:"列表数据"`
+	Count  *CommunityQuestionCount
+}
+
+type CommunityQuestionItem struct {
+	CommunityQuestionId     int    `description:"问题ID"`
+	UserId                  int    `description:"提问用户ID"`
+	Mobile                  string `description:"用户手机号"`
+	RealName                string `description:"用户名"`
+	QuestionContent         string `description:"问题描述"`
+	ReplierUserId           int    `description:"回复人的user_id"`
+	ReplierAdminId          int    `description:"回复人关联的admin_id"`
+	ReplierRealName         string `description:"回复人姓名"`
+	ReplierAvatar           string `description:"回复人头像"`
+	ResearchGroupFirstId    int    `description:"回复人研究方向一级分组ID"`
+	ResearchGroupSecondId   int    `description:"回复人研究方向二级分组ID"`
+	ResearchGroupFirstName  string `description:"研究方向一级分组名称"`
+	ResearchGroupSecondName string `description:"研究方向二级分组名称"`
+	ChartPermissionId       int    `description:"关联权限ID"`
+	ChartPermissionName     string `description:"关联权限name"`
+	ReplyStatus             int    `description:"状态 1-待分配 2-待回答 3-已回答"`
+	MsgSendStatus           int    `description:"消息推送进度 0-待推送 1-已推送回答人 2-已推送提问人"`
+	ReplyTime               string `description:"回复时间"`
+	CreateTime              string `description:"提问时间"`
+	NeedRedistribute        bool   `description:"是否需要重新分配"`
+	ClickNum                int    `description:"点击量"`
+}
+
+type CommunityQuestionCount struct {
+	Free    int `json:"free"`
+	Wait    int `json:"wait"`
+	Replied int `json:"replied"`
+	Total   int `json:"total"`
+}
+
+type QuestionClickLogListItem struct {
+	UserId         int
+	SourceAgent    int
+	LastCreateTime string
+	ClickNum       int `description:"点击量"`
+	RealName       string
+	CompanyName    string
+	CompanyStatus  string
+	CompanyId      int
+}
+
+type QuestionCompanyUser struct {
+	CommunityQuestionId int    `description:"问题ID"`
+	QuestionContent     string `description:"问题描述"`
+	UserId              int
+	RealName            string
+	CompanyName         string
+	CompanyStatus       string
+	CompanyId           int
+}
+
+type QuestionClickLogListResp struct {
+	Paging          *paging.PagingItem
+	List            []*QuestionClickLogListItem `description:"列表数据"`
+	Count           int
+	QuestionContent string `description:"问题描述"`
+}

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

@@ -10,6 +10,7 @@ import (
 type Admin struct {
 	AdminId                 int    `orm:"column(admin_id);pk" json:"admin_id"`
 	AdminName               string `orm:"column(admin_name);" json:"admin_name"`
+	AdminAvatar             string `description:"用户头像"`
 	RealName                string `orm:"column(real_name);" json:"real_name"`
 	Password                string `orm:"column(password);" json:"password"`
 	LastUpdatedPasswordTime string `orm:"column(last_updated_password_time);" json:"last_updated_password_time"`
@@ -32,7 +33,7 @@ type Admin struct {
 	Position                string `orm:"column(position);" json:"position"`               // 职位
 }
 
-//账号密码校验
+// 账号密码校验
 func CheckAdmin(userName, password string) (item *Admin, err error) {
 	sql := ` SELECT a.*,b.role_type_code FROM admin AS a
 			 INNER JOIN sys_role AS b ON a.role_id=b.role_id WHERE a.admin_name=? AND a.password=? LIMIT 1`

+ 127 - 0
models/tables/admin/research_group.go

@@ -0,0 +1,127 @@
+package admin
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// ResearchGroup 研究方向分组表
+type ResearchGroup struct {
+	ResearchGroupId   int       `orm:"column(research_group_id);pk" description:"研究方向分组ID"`
+	ResearchGroupName string    `json:"research_group_name" description:"研究方向分组名称"`
+	ParentId          int       `json:"parent_id" description:"父类ID"`
+	ChartPermissionId int       `json:"chart_permission_id" description:"品种权限ID"`
+	Sort              int       `json:"sort" description:"排序"`
+	State             int       `json:"state" description:"显示状态 0-不显示 1-显示"`
+	CreateTime        time.Time `json:"create_time" description:"创建时间"`
+	ModifyTime        time.Time `json:"modify_time" description:"更新时间"`
+}
+
+// GetResearchGroupList 获取研究方向分组列表
+func GetResearchGroupList() (list []*ResearchGroup, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM research_group WHERE state = 1 ORDER BY sort`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// GetResearchGroupById 主键获取分组
+func GetResearchGroupById(groupId int) (item *ResearchGroup, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM research_group WHERE research_group_id = ? LIMIT 1`
+	err = o.Raw(sql, groupId).QueryRow(&item)
+	return
+}
+
+// ResearchGroupRelation 研究方向关系表
+type ResearchGroupRelation struct {
+	Id              int `orm:"column(id);pk"`
+	ResearchGroupId int `json:"research_group_id" description:"分组ID"`
+	AdminId         int `json:"admin_id" description:"研究员ID"`
+}
+
+// ResearchGroupRelationListByAdminId 根据研究员ID获取研究方向分组关系列表
+func ResearchGroupRelationListByAdminId(adminId int) (list []*ResearchGroupRelation, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM research_group_relation WHERE admin_id = ?`
+	_, err = o.Raw(sql, adminId).QueryRows(&list)
+	return
+}
+
+// ResearchGroupRelation 研究方向分组关系表
+type ResearchGroupRelationItem struct {
+	ResearchGroupId int    `json:"research_group_id" description:"研究方向分组ID"`
+	AdminId         int    `json:"admin_id" description:"研究员ID"`
+	AdminName       string `json:"admin_name" description:"研究员姓名"`
+}
+
+// GetResearchGroupRelationList 获取研究方向分组关系列表
+func GetResearchGroupRelationList(include int) (list []*ResearchGroupRelationItem, err error) {
+	// 是否包含已禁止的研究员, 默认不包含
+	condition := ` WHERE b.enabled = 1 `
+	if include == 1 {
+		condition = ` WHERE 1=1 `
+	}
+	o := orm.NewOrm()
+	sql := `SELECT
+				a.research_group_id,
+				a.admin_id,
+				b.real_name AS admin_name
+			FROM
+				research_group_relation AS a
+			INNER JOIN admin AS b ON a.admin_id = b.admin_id `
+	sql += condition
+	sql += ` ORDER BY
+				a.research_group_id ASC,
+				a.admin_id ASC`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// UpdateAdminResearchGroup 更新研究员研究方向分组
+func UpdateAdminResearchGroup(adminId int, items []*ResearchGroupRelation) (err error) {
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	sql := `DELETE FROM research_group_relation WHERE admin_id = ?`
+	if _, err = o.Raw(sql, adminId).Exec(); err != nil {
+		return
+	}
+	itemsLen := len(items)
+	if itemsLen > 0 {
+		_, err = o.InsertMulti(itemsLen, items)
+	}
+	return
+}
+
+// AdminResearchGroupList 研究员研究方向分组列表
+type AdminResearchGroupList struct {
+	AdminId      int    `json:"admin_id"`
+	GroupNameStr string `json:"group_name_str"`
+}
+
+// GetAdminResearchGroupListByAdminId 获取研究员研究方向分组列表
+func GetAdminResearchGroupListByAdminId(adminIds string) (list []*AdminResearchGroupList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+				a.admin_id,
+				GROUP_CONCAT(b.research_group_name) AS group_name_str
+			FROM
+				research_group_relation AS a
+			INNER JOIN research_group AS b ON a.research_group_id = b.research_group_id
+			WHERE
+				a.admin_id IN (` + adminIds + `)
+			GROUP BY
+				a.admin_id`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}

+ 107 - 0
models/tables/community_question/community_question.go

@@ -0,0 +1,107 @@
+package community_question
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// CommunityQuestion 问答社区
+type CommunityQuestion struct {
+	CommunityQuestionId     int       `orm:"column(community_question_id);pk" description:"问题ID"`
+	UserId                  int       `description:"提问用户ID"`
+	UserOpenid              string    `description:"提问用户openid"`
+	Mobile                  string    `description:"用户手机号"`
+	RealName                string    `description:"用户名"`
+	QuestionContent         string    `description:"问题描述"`
+	ReplierUserId           int       `description:"回复人的user_id"`
+	ReplierOpenid           string    `description:"回复人openid"`
+	ReplierAdminId          int       `description:"回复人关联的admin_id"`
+	ReplierRealName         string    `description:"回复人姓名"`
+	ReplierAvatar           string    `description:"回复人头像"`
+	ResearchGroupFirstId    int       `description:"回复人研究方向一级分组ID"`
+	ResearchGroupSecondId   int       `description:"回复人研究方向二级分组ID"`
+	ResearchGroupFirstName  string    `description:"研究方向一级分组名称"`
+	ResearchGroupSecondName string    `description:"研究方向二级分组名称"`
+	DistributeAdminId       int       `description:"分配人admin_id"`
+	DistributeTime          time.Time `description:"分配时间"`
+	ChartPermissionId       int       `description:"关联权限ID"`
+	ChartPermissionName     string    `description:"关联权限name"`
+	IsRead                  int       `description:"用户是否已读 0-未读 1-已读"`
+	ReplierIsRead           int       `description:"回复人是否已读 0-未读 1-已读"`
+	ReplyStatus             int       `description:"状态 1-待分配 2-待回答 3-已回答"`
+	MsgSendStatus           int       `description:"消息推送进度 0-待推送 1-已推送回答人 2-已推送提问人"`
+	ReplyTime               time.Time `description:"回复时间"`
+	CreateTime              time.Time `description:"提问时间"`
+	ModifyTime              time.Time `description:"修改时间"`
+	IsDeleted               int       `description:"是否已删除 0-否 1-是"`
+	DeleteTime              time.Time `description:"删除时间"`
+}
+type CommunityQuestionMore struct {
+	CommunityQuestion
+	ClickNum int `description:"点击量"`
+}
+
+func (item *CommunityQuestion) TableName() string {
+	return "yb_community_question"
+}
+
+func (item *CommunityQuestion) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(item, cols...)
+	return
+}
+
+// GetQuestionById 主键获取提问
+func GetQuestionById(questionId int) (item *CommunityQuestion, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM yb_community_question WHERE community_question_id = ? AND is_deleted = 0 LIMIT 1`
+	err = o.Raw(sql, questionId).QueryRow(&item)
+	return
+}
+
+// GetCommunityQuestionList 获取问答列表
+func GetCommunityQuestionList(condition string, pars []interface{}, order string, startSize, pageSize int) (total int, list []*CommunityQuestionMore, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+	q.*,
+	l.click_num
+FROM
+	yb_community_question q
+	LEFT JOIN ( SELECT count( * ) AS click_num, community_question_id FROM yb_community_audio_listen_log GROUP BY community_question_id ) AS l ON q.community_question_id = l.community_question_id 
+WHERE
+	q.is_deleted = 0 `
+	sql += condition
+	if order != "" {
+		sql += order
+	} else {
+		sql += ` ORDER BY q.create_time DESC`
+	}
+	totalSQl := `SELECT COUNT(1) total FROM (` + sql + `) z`
+	if err = o.Raw(totalSQl, pars).QueryRow(&total); err != nil {
+		return
+	}
+	sql += ` LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+type CommunityQuestionCount struct {
+	ReplyStatus int `json:"reply_status"`
+	Total       int `json:"total"`
+}
+
+// GetCommunityQuestionCount 根据状态获取问答数
+func GetCommunityQuestionCount() (list []*CommunityQuestionCount, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT reply_status, COUNT(1) total FROM yb_community_question WHERE is_deleted = 0 GROUP BY reply_status`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// DeleteQuestion (软)删除问题
+func DeleteQuestion(questionId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE yb_community_question SET is_deleted = 1, delete_time = NOW() WHERE community_question_id = ? LIMIT 1`
+	_, err = o.Raw(sql, questionId).Exec()
+	return
+}

+ 53 - 0
models/tables/company/company_user.go

@@ -0,0 +1,53 @@
+package company
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CompanyUser struct {
+	UserId                   int64     `orm:"column(user_id);pk"`
+	CountryCode              string    `description:"区号,86、852、886等"`
+	Mobile                   string    `description:"手机号"`
+	Email                    string    `description:"邮箱"`
+	CompanyId                int       `description:"公司id"`
+	CompanyName              string    `description:"公司名称"`
+	RealName                 string    `description:"姓名"`
+	CreatedTime              string    `description:"创建时间"`
+	MobileTwo                string    `description:"备用手机号"`
+	BusinessCardUrl          string    `description:"名片地址"`
+	IsMaker                  int       `description:"是否决策人,1:是,0:否"`
+	Position                 string    `description:"职位"`
+	Sex                      int       `description:"普通用户性别,1为男性,2为女性"`
+	IsRegister               bool      `description:"是否注册,true:已注册,false:未注册"`
+	OpenId                   string    `json:"-"`
+	DepartmentName           string    `description:"联系人部门"`
+	SellerRealName           string    `description:"销售"`
+	Status                   string    `description:"客户状态"`
+	HasMove                  bool      `description:"true:可移动,false:显示知道了"`
+	ViewTotal                int       `description:"累计阅读次数"`
+	LastViewTime             time.Time `json:"-" description:"最后一次阅读时间"`
+	LastViewTimeStr          string    `description:"最后一次阅读时间"`
+	ApplyMethod              int       `description:"0:未申请,1:已付费客户申请试用,2:非客户申请试用"`
+	RegisterTime             string    `description:"注册时间"`
+	RegisterPlatform         int       `description:"注册平台,1:微信端,2:网页端"`
+	SellerId                 int       `description:"销售id"`
+	SellerName               string    `description:"销售名称"`
+	GroupId                  int       `description:"所属销售分组id"`
+	DepartmentId             int       `description:"所属销售分组id"`
+	IsShared                 bool      `description:"是否共享联系人"`
+	ProductIds               string    `description:"商品权限集合,用英文,隔开"`
+	IsChartPermissionSetting int       `description:"是否设置过图表权限, 0-未设置,1-已设置,2-无需设置"`
+}
+
+// GetFiccCompanyUserByUserIds 批量查询用户的购买ficc的产品详情
+func GetFiccCompanyUserByUserIds(userIds string) (list []*CompanyUser, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT a.user_id, a.real_name, if(b.company_id=1,"",b.company_name) as company_name, c.status, b.company_id
+             FROM wx_user AS a
+             LEFT  JOIN company AS b ON a.company_id=b.company_id 
+             LEFT  JOIN company_product AS c ON a.company_id=c.company_id and c.product_id=1
+			 WHERE a.user_id in (` + userIds + `)`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}

+ 191 - 0
models/tables/sys_role/sys_role.go

@@ -0,0 +1,191 @@
+package sys_role
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type SysRoleAddReq struct {
+	RoleName string `description:"角色名称"`
+	RoleType string `description:"角色类型"`
+}
+
+type SysRole struct {
+	RoleId       int       `orm:"column(role_id);pk" description:"角色ID"`
+	RoleName     string    `description:"角色名称"`
+	RoleType     string    `description:"角色类型"`
+	RoleTypeCode string    `description:"角色类型编码"`
+	CreateTime   time.Time `description:"创建时间"`
+	ModifyTime   time.Time
+}
+
+type SysRoleItem struct {
+	RoleId       int       `orm:"column(role_id);pk" description:"角色ID"`
+	RoleName     string    `description:"角色名称"`
+	RoleType     string    `description:"角色类型"`
+	RoleTypeCode string    `description:"角色类型编码"`
+	CreateTime   time.Time `description:"创建时间"`
+	RoleLevel    int       `description:"角色等级:0-表示一级角色,每个账号只能绑定一个一级角色 ,1-表示二级角色,每个账号可以绑定多个二级 角色"`
+}
+
+func GetSysRoleCount(roleName string) (count int, err error) {
+	sql := `SELECT COUNT(1) AS count FROM sys_role WHERE role_name=? `
+	o := orm.NewOrm()
+	err = o.Raw(sql, roleName).QueryRow(&count)
+	return
+}
+
+func AddSysRole(item *SysRole) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+type SysRoleEditReq struct {
+	RoleId   int    `description:"角色ID"`
+	RoleName string `description:"角色名称"`
+	RoleType string `description:"角色类型"`
+}
+
+func GetSysRoleById(roleId int) (item *SysRoleItem, err error) {
+	sql := `SELECT * FROM sys_role WHERE role_id=? `
+	o := orm.NewOrm()
+	err = o.Raw(sql, roleId).QueryRow(&item)
+	return
+}
+
+func GetSysRoleByName(roleName string) (item *SysRoleItem, err error) {
+	sql := `SELECT * FROM sys_role WHERE role_name=? `
+	o := orm.NewOrm()
+	err = o.Raw(sql, roleName).QueryRow(&item)
+	return
+}
+
+// GetSysRoleByRoleTypeCode role_type_code
+func GetSysRoleByRoleTypeCode(roleTypeCode string) (item *SysRoleItem, err error) {
+	sql := `SELECT * FROM sys_role WHERE role_type_code=? `
+	o := orm.NewOrm()
+	err = o.Raw(sql, roleTypeCode).QueryRow(&item)
+	return
+}
+func ModifySysRole(roleName, roleType, roleTypeCode string, groupId int) (err error) {
+	sql := `UPDATE sys_role SET role_name=?,role_type=?,role_type_code=?,modify_time=NOW() WHERE role_id=? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, roleName, roleType, roleTypeCode, groupId).Exec()
+	return
+}
+
+type SysRoleDeleteReq struct {
+	RoleId int `description:"角色ID"`
+}
+
+func DeleteSysRole(roleId int) (err error) {
+	sql := `DELETE FROM sys_role WHERE role_id=? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, roleId).Exec()
+	return
+}
+
+func GetSysRoleListCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM sys_role WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func GetSysRoleList(condition string, pars []interface{}, startSize, pageSize int) (items []*SysRoleItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM sys_role WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `ORDER BY modify_time DESC LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+type SysRoleListResp struct {
+	List   []*SysRoleItem
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+type RoleMenu struct {
+	MenuId int    `description:"导航唯一标识"`
+	Name   string `description:"导航名称"`
+}
+
+type RoleMenuList struct {
+	MenuId    int    `description:"导航唯一标识"`
+	Name      string `description:"导航名称"`
+	Child     []*RoleMenu
+	CheckList []int
+}
+
+type RoleMenuListResp struct {
+	List []*RoleMenuList
+}
+
+func GetRoleMenuList() (items []*RoleMenuList, err error) {
+	sql := `SELECT * FROM sys_menu WHERE parent_id=0 ORDER BY sort ASC `
+	_, err = orm.NewOrm().Raw(sql).QueryRows(&items)
+	return
+}
+
+func GetRoleMenuByParentId(parentId int) (items []*RoleMenu, err error) {
+	sql := `SELECT * FROM sys_menu WHERE parent_id=? ORDER BY sort ASC `
+	_, err = orm.NewOrm().Raw(sql, parentId).QueryRows(&items)
+	return
+}
+
+func GetCheckListRoleMenu(roleId, parentId int) (items []*RoleMenuList, err error) {
+	sql := ` SELECT b.menu_id FROM sys_role_menu AS a
+				INNER JOIN sys_menu AS b ON a.menu_id=b.menu_id
+				WHERE a.role_id=?
+				AND b.parent_id=? `
+	_, err = orm.NewOrm().Raw(sql, roleId, parentId).QueryRows(&items)
+	return
+}
+
+type RoleMenusAddReq struct {
+	RoleId          int    `description:"角色ID"`
+	MenuIdStr       string `description:"MenuId,多个用英文逗号隔开"`
+	MenuButtonIdStr string `description:"menu_button_id,多个用英文逗号隔开"`
+}
+
+func DeleteRoleMenuByRoleId(roleId int) (err error) {
+	sql := `DELETE FROM sys_role_menu WHERE role_id=? `
+	_, err = orm.NewOrm().Raw(sql, roleId).Exec()
+	return
+
+}
+
+type SysRoleMenu struct {
+	RoleMenuId int `orm:"column(role_menu_id);pk" description:"关联id"`
+	RoleId     int
+	MenuId     int
+}
+
+func AddSysRoleMenu(item *SysRoleMenu) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetSysRoleAll(levelFlag bool) (items []*SysRoleItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM sys_role WHERE 1=1`
+	if levelFlag {
+		sql += ` and role_level = 0`
+	}
+	sql += ` ORDER BY create_time DESC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type SysRoleAllResp struct {
+	List []*SysRoleItem
+}

+ 131 - 0
models/tables/sys_role_admin/sys_role_admin.go

@@ -0,0 +1,131 @@
+package sys_role_admin
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type SysRoleAdmin struct {
+	Id         int       `orm:"column(id);pk" description:"自增ID"`
+	AdminId    int       `orm:"column(admin_id);" description:"系统用户id"`
+	RoleId     int       `orm:"column(role_id);" description:"角色ID"`
+	CreateTime time.Time `orm:"column(create_time);" description:"创建时间"`
+}
+
+type RoleAdminItem struct {
+	SysRoleAdminId  int    `description:"管理员账号和角色映射表id"`
+	AdminId         int    `description:"系统用户id"`
+	AdminName       string `description:"系统用户名称"`
+	RealName        string `description:"系统用户姓名"`
+	Enabled         int    `description:"1:有效,0:禁用"`
+	Mobile          string `description:"手机号"`
+	RoleId          int    `description:"角色Id"`
+	RoleTypeCode    string `description:"角色编码"`
+	DepartmentId    int    `description:"部门id"`
+	DepartmentName  string `description:"部门名称"`
+	DepartmentGroup string `description:"部门分组"`
+	TeamId          int    `description:"小组id"`
+	GroupId         int    `description:"分组id"`
+	GroupName       string `description:"分组名称"`
+	Authority       int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,4:ficc销售组长"`
+	LabelVal        int    `description:"标签:1:超级管理员,2:管理员,3:部门经理,4:组长,5:ficc销售主管"`
+}
+
+func (sa *SysRoleAdmin) TableName() string {
+	return "sys_role_admin"
+}
+
+// GetRoleIdsByAdminId 根据管理员账号查询角色ID
+func GetRoleIdsByAdminId(adminId int) (items []*SysRoleAdmin, err error) {
+	sql := `SELECT * from sys_role_admin where admin_id = ?`
+	_, err = orm.NewOrm().Raw(sql, adminId).QueryRows(&items)
+	return
+}
+
+// GetRoleIdsByAdminIdRoleId 根据管理员账号和角色查询
+func GetRoleIdsByAdminIdRoleId(adminId int, roleId int) (item *SysRoleAdmin, err error) {
+	sql := `SELECT * from sys_role_admin where admin_id = ? and role_id=?`
+	err = orm.NewOrm().Raw(sql, adminId, roleId).QueryRow(&item)
+	return
+}
+
+// GetRoleAdminList 查询对应角色绑定的管理员列表
+func GetRoleAdminList(condition string, pars []interface{}, startSize, pageSize int) (list []*RoleAdminItem, err error) {
+	sql := `SELECT
+	s.id as sys_role_admin_id,
+	a.admin_id,
+	a.admin_name,
+	a.real_name,
+	a.mobile,
+	a.department_id,
+	a.department_name,
+	a.enabled,
+	a.role_id,
+	a.role_type_code ,
+	a.group_id,
+	a.authority,
+	a.group_name
+FROM
+	sys_role_admin s
+	INNER JOIN admin a ON s.admin_id = a.admin_id 
+where 1=1`
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY s.id DESC limit ?, ?`
+	_, err = orm.NewOrm().Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+// GetRoleAdminListTotal 查询对应角色绑定的管理员列表总数
+func GetRoleAdminListTotal(condition string, pars []interface{}) (total int64, err error) {
+	sql := `SELECT
+	count(*)
+FROM
+	sys_role_admin s
+	INNER JOIN admin a ON s.admin_id = a.admin_id 
+where 1=1`
+	if condition != "" {
+		sql += condition
+	}
+	err = orm.NewOrm().Raw(sql, pars).QueryRow(&total)
+	return
+}
+
+// CheckRoleAdminByAdminIds 判断是否已经绑定过该角色
+func CheckRoleAdminByAdminIds(adminIds string, roleId int) (list []*SysRoleAdmin, err error) {
+	sql := `SELECT
+	s.*
+FROM
+	sys_role_admin s
+	LEFT JOIN admin a ON s.admin_id = a.admin_id 
+where s.role_id=? and s.admin_id in (` + adminIds + `)`
+	_, err = orm.NewOrm().Raw(sql, roleId).QueryRows(&list)
+	return
+}
+
+// AddRoleAdminBatch 批量新增留言版管理员
+func AddRoleAdminBatch(admins []*SysRoleAdmin) (err error) {
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(admins), admins)
+	return
+}
+
+// DeleteRoleAdmin 删除管理员和角色的绑定
+func DeleteRoleAdmin(SysRoleAdminId int) (err error) {
+	sql := `DELETE FROM sys_role_admin WHERE id=? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, SysRoleAdminId).Exec()
+	return
+}
+
+// GetRoleAdminById 根据ID查询绑定记录
+func GetRoleAdminById(SysRoleAdminId int) (item *SysRoleAdmin, err error) {
+	sql := `SELECT
+	*
+FROM
+	sys_role_admin 
+where id=?`
+	err = orm.NewOrm().Raw(sql, SysRoleAdminId).QueryRow(&item)
+	return
+}

+ 100 - 0
models/tables/user_record/user_record.go

@@ -0,0 +1,100 @@
+package user_record
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type UserRecord struct {
+	UserRecordId   int       `orm:"column(user_record_id);pk"`
+	OpenId         string    `description:"用户openid,最大长度:32"`
+	UnionId        string    `description:"用户unionid,最大长度:64"`
+	Subscribe      int       `description:"是否关注"`
+	NickName       string    `descritpion:"用户昵称,最大长度:32"`
+	RealName       string    `descritpion:"用户实际名称,最大长度:32"`
+	BindAccount    string    `descritpion:"绑定时的账号,最大长度:128"`
+	Sex            int       `descritpion:"普通用户性别,1为男性,2为女性"`
+	Province       string    `description:"普通用户个人资料填写的省份,最大长度:30"`
+	City           string    `description:"普通用户个人资料填写的城市,最大长度:30"`
+	Country        string    `description:"国家,如中国为CN,最大长度:30"`
+	Headimgurl     string    `description:"用户第三方(微信)头像,最大长度:512"`
+	CreateTime     time.Time `description:"创建时间,关系添加时间、用户授权时间"`
+	CreatePlatform int       `description:"注册平台,1:日度点评公众号,2:管理后台,3:pc端网站,4:查研观向小程序;默认:1"`
+	SessionKey     string    `description:"微信小程序会话密钥,最大长度:255"`
+	UserId         int       `description:"用户id"`
+}
+
+//根据openid获取用户关系
+func GetUserRecordByOpenId(openId string) (item *UserRecord, err error) {
+	sql := `SELECT * FROM user_record WHERE open_id=? `
+	err = orm.NewOrm().Raw(sql, openId).QueryRow(&item)
+	return
+}
+
+//根据用户id和平台id获取用户关系
+func GetUserRecordByUserId(userId, platform int) (item *UserRecord, err error) {
+	sql := `SELECT * FROM user_record WHERE user_id=? AND create_platform = ?`
+	err = orm.NewOrm().Raw(sql, userId, platform).QueryRow(&item)
+	return
+}
+
+//添加用户关系
+func AddUserRecord(record *UserRecord) (recordId int64, err error) {
+	o := orm.NewOrm()
+	recordId, err = o.Insert(record)
+	return
+}
+
+//根据openid绑定用户关系
+func BindUserRecordByOpenid(userId int, openId, bindAccount string) (err error) {
+	o := orm.NewOrm()
+	msql := " UPDATE user_record SET user_id = ?,bind_account=? WHERE open_id = ? "
+	_, err = o.Raw(msql, userId, bindAccount, openId).Exec()
+	return
+}
+
+//修改用户微信信息
+func ModifyUserRecordInfo(openId, nickName, headimgUrl, city, province, country string, sex, userId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE user_record SET nick_name=?,headimgurl=?,sex=?,city=?,province=?,country=? WHERE user_id=? and openid=? `
+	_, err = o.Raw(sql, nickName, headimgUrl, sex, city, province, country, userId, openId).Exec()
+	return
+}
+
+//根据用户id删除该用户的所有关联关系
+func DelUserRecordByUserId(userId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM user_record WHERE user_id=? `
+	_, err = o.Raw(sql, userId).Exec()
+	return
+}
+
+// GetUserRecordListByUserIds 根据用户id字符串批量获取该用户的所有关联关系
+func GetUserRecordListByUserIds(userIds string) (items []*UserRecord, err error) {
+	o := orm.NewOrm()
+	sql := ` select *  FROM user_record WHERE user_id in (` + userIds + `) `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+//根据用户id字符串批量删除该用户的所有关联关系
+func DelUserRecordByUserIds(userIds string) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM user_record WHERE user_id in (` + userIds + `) `
+	_, err = o.Raw(sql).Exec()
+	return
+}
+
+//根据用户id字符串获取用户绑定时间结构体
+type UserRecordRegisterSlice struct {
+	UserId     int       `description:"用户id"`
+	CreateTime time.Time `description:"用户第三方信息绑定注册时间"`
+}
+
+//根据用户id字符串获取用户绑定时间
+func GetUserRecordRegisterByUserIds(userIds string) (items []*UserRecordRegisterSlice, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT user_id,min(create_time) as create_time FROM user_record WHERE user_id in (` + userIds + `) group by user_id`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 8 - 0
models/tables/wx_user/wx_user.go

@@ -52,3 +52,11 @@ func GetOpenIdListByMobile(mobile, openIdStr string) (items []*OpenIdList, err e
 	_, err = orm.NewOrm().Raw(sql, mobile).QueryRows(&items)
 	return
 }
+
+// GetWxUserByCompanyIdAndMobile 根据客户ID及手机号获取用户
+func GetWxUserByCompanyIdAndMobile(companyId int, mobile string) (item *WxUser, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM wx_user WHERE company_id = ? AND mobile = ? LIMIT 1 `
+	err = o.Raw(sql, companyId, mobile).QueryRow(&item)
+	return
+}

+ 640 - 0
routers/commentsRouter.go

@@ -0,0 +1,640 @@
+package routers
+
+import (
+	beego "github.com/beego/beego/v2/server/web"
+	"github.com/beego/beego/v2/server/web/context/param"
+)
+
+func init() {
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "Accept",
+            Router: `/accept`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "ActivityTypeList",
+            Router: `/activity/type/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "Back",
+            Router: `/back`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "CalendarDetail",
+            Router: `/calendar/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "CalendarList",
+            Router: `/calendar/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "CalendarTypeList",
+            Router: `/calendar/type/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "CompanyDetail",
+            Router: `/company/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "CompanySearch",
+            Router: `/company/search`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "Delete",
+            Router: `/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "MattersAdd",
+            Router: `/matters/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "MattersDelete",
+            Router: `/matters/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "MattersList",
+            Router: `/matters/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "MattersUpdate",
+            Router: `/matters/update`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "MyCalendarDetail",
+            Router: `/my/calendar/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "Refuse",
+            Router: `/refuse`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "ResearcherCalendarDetail",
+            Router: `/researcher/calendar/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "ResearcherList",
+            Router: `/researcher/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/yb:CommunityQuestionController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/yb:CommunityQuestionController"],
+        beego.ControllerComments{
+            Method: "QuestionDelete",
+            Router: `/community/question/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/yb:CommunityQuestionController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/yb:CommunityQuestionController"],
+        beego.ControllerComments{
+            Method: "QuestionDistribute",
+            Router: `/community/question/distribute`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/yb:CommunityQuestionController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/yb:CommunityQuestionController"],
+        beego.ControllerComments{
+            Method: "QuestionEdit",
+            Router: `/community/question/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/yb:CommunityQuestionController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/yb:CommunityQuestionController"],
+        beego.ControllerComments{
+            Method: "QuestionList",
+            Router: `/community/question/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/yb:CommunityQuestionController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/yb:CommunityQuestionController"],
+        beego.ControllerComments{
+            Method: "SendDistributeTemplateMsg",
+            Router: `/community/question/send_template_msg`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/yb:CommunityQuestionController"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers/yb:CommunityQuestionController"],
+        beego.ControllerComments{
+            Method: "UserInfo",
+            Router: `/community/question/user`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:AdminCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:AdminCommon"],
+        beego.ControllerComments{
+            Method: "Login",
+            Router: `/login`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:AdminCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:AdminCommon"],
+        beego.ControllerComments{
+            Method: "Logout",
+            Router: `/logout`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"],
+        beego.ControllerComments{
+            Method: "ApplyApprove",
+            Router: `/approve`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"],
+        beego.ControllerComments{
+            Method: "ApplyApproveOld",
+            Router: `/approve_old`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"],
+        beego.ControllerComments{
+            Method: "CompanyList",
+            Router: `/company_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"],
+        beego.ControllerComments{
+            Method: "DetailOld",
+            Router: `/detail_old`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"],
+        beego.ControllerComments{
+            Method: "GetFlowDetail",
+            Router: `/flowDetail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"],
+        beego.ControllerComments{
+            Method: "GetApprovalPermissionList",
+            Router: `/getApprovalPermissionList`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"],
+        beego.ControllerComments{
+            Method: "ListV2",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ApprovalCommon"],
+        beego.ControllerComments{
+            Method: "ListOld",
+            Router: `/list_old`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:CompanyContractCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:CompanyContractCommon"],
+        beego.ControllerComments{
+            Method: "ApplyContractDetail",
+            Router: `/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractApprovalCommon"],
+        beego.ControllerComments{
+            Method: "Approved",
+            Router: `/approved`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractApprovalCommon"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractApprovalCommon"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractApprovalCommon"],
+        beego.ControllerComments{
+            Method: "Reject",
+            Router: `/reject`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"],
+        beego.ControllerComments{
+            Method: "CompanyListBySeal",
+            Router: `/companyListBySeal`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"],
+        beego.ControllerComments{
+            Method: "CompanyList",
+            Router: `/company_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"],
+        beego.ControllerComments{
+            Method: "Invalid",
+            Router: `/invalid`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"],
+        beego.ControllerComments{
+            Method: "ListBySeal",
+            Router: `/listBySeal`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"],
+        beego.ControllerComments{
+            Method: "ListV2",
+            Router: `/listV2`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ContractCommon"],
+        beego.ControllerComments{
+            Method: "UploadCheckBackFile",
+            Router: `/upload_check_back_file`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:MessageCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:MessageCommon"],
+        beego.ControllerComments{
+            Method: "MessageList",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:MessageCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:MessageCommon"],
+        beego.ControllerComments{
+            Method: "MessageRead",
+            Router: `/read`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:MessageCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:MessageCommon"],
+        beego.ControllerComments{
+            Method: "SummaryMessageList",
+            Router: `/summaryMessageList`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ResourceCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ResourceCommon"],
+        beego.ControllerComments{
+            Method: "Upload",
+            Router: `/upload`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ResourceCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:ResourceCommon"],
+        beego.ControllerComments{
+            Method: "UploadImageBase64",
+            Router: `/upload_image_base64`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealApprovalCommon"],
+        beego.ControllerComments{
+            Method: "Approved",
+            Router: `/approved`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealApprovalCommon"],
+        beego.ControllerComments{
+            Method: "CancelApply",
+            Router: `/cancelApply`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealApprovalCommon"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealApprovalCommon"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealApprovalCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealApprovalCommon"],
+        beego.ControllerComments{
+            Method: "Reject",
+            Router: `/reject`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"],
+        beego.ControllerComments{
+            Method: "CheckEdit",
+            Router: `/check_edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"],
+        beego.ControllerComments{
+            Method: "CompanyList",
+            Router: `/company_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"],
+        beego.ControllerComments{
+            Method: "CompanyNameList",
+            Router: `/company_name_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"],
+        beego.ControllerComments{
+            Method: "Invalid",
+            Router: `/invalid`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:SealCommon"],
+        beego.ControllerComments{
+            Method: "UploadCheckBackFile",
+            Router: `/upload_check_back_file`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:WeChatCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:WeChatCommon"],
+        beego.ControllerComments{
+            Method: "WeChatLogin",
+            Router: `/login`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:WeChatCommon"] = append(beego.GlobalControllerRouter["hongze/hongze_mobile_admin/controllers:WeChatCommon"],
+        beego.ControllerComments{
+            Method: "WxAppLogin",
+            Router: `/wxapp/login`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+}

+ 6 - 0
routers/router.go

@@ -12,6 +12,7 @@ import (
 	"github.com/beego/beego/v2/server/web/filter/cors"
 	"hongze/hongze_mobile_admin/controllers"
 	"hongze/hongze_mobile_admin/controllers/roadshow"
+	"hongze/hongze_mobile_admin/controllers/yb"
 
 	"github.com/beego/beego/v2/server/web"
 )
@@ -81,6 +82,11 @@ func init() {
 				&roadshow.CalendarController{},
 			),
 		),
+		web.NSNamespace("/yb",
+			web.NSInclude(
+				&yb.CommunityQuestionController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 367 - 0
services/yb/community_question.go

@@ -0,0 +1,367 @@
+package yb
+
+import (
+	"errors"
+	"fmt"
+	ybResponse "hongze/hongze_mobile_admin/models/response/yb"
+	"hongze/hongze_mobile_admin/models/tables/admin"
+	"hongze/hongze_mobile_admin/models/tables/community_question"
+	"hongze/hongze_mobile_admin/models/tables/company"
+	"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/wx_user"
+	"hongze/hongze_mobile_admin/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// GetQuestionList 问题列表
+func GetQuestionList(condition string, pars []interface{}, orderStr string, startSize, pageSize int) (total int, resp *ybResponse.CommunityQuestionListResp, err error) {
+	resp = new(ybResponse.CommunityQuestionListResp)
+	total, list, e := community_question.GetCommunityQuestionList(condition, pars, orderStr, startSize, pageSize)
+	if e != nil {
+		err = errors.New("获取问题列表失败 Err:" + e.Error())
+		return
+	}
+	if len(list) == 0 {
+		return
+	}
+	// 判断是否存在已禁用的回复人, 需要重新分配回复人
+	adminIdArr := make([]string, 0)
+	questionLen := len(list)
+	for i := 0; i < questionLen; i++ {
+		if list[i].ReplierAdminId > 0 {
+			adminIdArr = append(adminIdArr, strconv.Itoa(list[i].ReplierAdminId))
+		}
+	}
+	adminIds := strings.Join(adminIdArr, ",")
+	adminList, err := admin.GetAdminListByIds(adminIds)
+	if err != nil {
+		return
+	}
+	adminLen := len(adminList)
+	adminEnableMap := make(map[int]int, 0)
+	if adminLen > 0 {
+		for i := 0; i < adminLen; i++ {
+			adminEnableMap[adminList[i].AdminId] = adminList[i].Enabled
+		}
+	}
+
+	respList := make([]*ybResponse.CommunityQuestionItem, 0)
+	for _, v := range list {
+		// 根据回复人被禁用/待回答/已推送消息判断是否需要重新分配
+		needReset := false
+		adminEnable := 1
+		if v.ReplierAdminId > 0 {
+			adminEnable = adminEnableMap[v.ReplierAdminId]
+		}
+		if adminEnable == 0 && v.ReplyStatus == 2 && v.MsgSendStatus >= 1 {
+			needReset = true
+		}
+		item := &ybResponse.CommunityQuestionItem{
+			CommunityQuestionId:     v.CommunityQuestionId,
+			UserId:                  v.UserId,
+			Mobile:                  v.Mobile,
+			RealName:                v.RealName,
+			QuestionContent:         v.QuestionContent,
+			ReplierUserId:           v.ReplierUserId,
+			ReplierAdminId:          v.ReplierAdminId,
+			ReplierRealName:         v.ReplierRealName,
+			ReplierAvatar:           v.ReplierAvatar,
+			ResearchGroupFirstId:    v.ResearchGroupFirstId,
+			ResearchGroupSecondId:   v.ResearchGroupSecondId,
+			ResearchGroupFirstName:  v.ResearchGroupFirstName,
+			ResearchGroupSecondName: v.ResearchGroupSecondName,
+			ChartPermissionId:       v.CommunityQuestionId,
+			ChartPermissionName:     v.ChartPermissionName,
+			ReplyStatus:             v.ReplyStatus,
+			MsgSendStatus:           v.MsgSendStatus,
+			NeedRedistribute:        needReset,
+			CreateTime:              v.CreateTime.Format(utils.FormatDateTime),
+			ReplyTime:               v.ReplyTime.Format(utils.FormatDateTime),
+			ClickNum:                v.ClickNum,
+		}
+		respList = append(respList, item)
+	}
+	// 数量统计
+	countList, e := community_question.GetCommunityQuestionCount()
+	if e != nil {
+		err = errors.New("获取问题数量统计失败 Err:" + e.Error())
+		return
+	}
+	respCount := new(ybResponse.CommunityQuestionCount)
+	for _, v := range countList {
+		if v.ReplyStatus == 1 {
+			respCount.Free = v.Total
+			continue
+		}
+		if v.ReplyStatus == 2 {
+			respCount.Wait = v.Total
+			continue
+		}
+		if v.ReplyStatus == 3 {
+			respCount.Replied = v.Total
+			continue
+		}
+	}
+	respCount.Total = respCount.Free + respCount.Wait + respCount.Replied
+	resp.List = respList
+	resp.Count = respCount
+	return
+}
+
+// GetQuestionCompanyUser 获取提问者详情
+func GetQuestionCompanyUser(questionId int) (ret *ybResponse.QuestionCompanyUser, err error) {
+	questionInfo, e := community_question.GetQuestionById(questionId)
+	if e != nil {
+		err = errors.New("提问信息有误 Err:" + e.Error())
+		return
+	}
+	companyUserList, err := company.GetFiccCompanyUserByUserIds(strconv.Itoa(questionInfo.UserId))
+	if err != nil {
+		err = errors.New("获取客户信息失败 Err:" + err.Error())
+		return
+	}
+	if len(companyUserList) > 0 {
+		item := companyUserList[0]
+		ret = &ybResponse.QuestionCompanyUser{
+			UserId:              int(item.UserId),
+			CompanyStatus:       item.Status,
+			CompanyName:         item.CompanyName,
+			RealName:            item.RealName,
+			CompanyId:           item.CompanyId,
+			QuestionContent:     questionInfo.QuestionContent,
+			CommunityQuestionId: questionInfo.CommunityQuestionId,
+		}
+	} else {
+		err = errors.New("用户不存在")
+		return
+	}
+	return
+}
+
+// DistributeQuestion 分配回复人
+func DistributeQuestion(questionId, adminId, researchGroupFirstId, researchGroupSecondId, distributeId int) (errMsg string, err error) {
+	errMsg = "操作成功"
+	// 校验提问信息
+	item, e := community_question.GetQuestionById(questionId)
+	if e != nil {
+		errMsg = "分配失败, 提问信息有误"
+		err = errors.New("提问信息有误 Err:" + e.Error())
+		return
+	}
+	contentRune := []rune(item.QuestionContent)
+	if len(contentRune) > 25 {
+		errMsg = "问题字数不可超过25个字符"
+		err = errors.New("问题字数不可超过25个字符")
+		return
+	}
+	if item.ReplyStatus == 3 {
+		errMsg = "分配失败, 回复状态有误"
+		err = errors.New(fmt.Sprintf("分配失败, 回复状态有误, ReplyStatus:%d", item.ReplyStatus))
+		return
+	}
+	// 获取研究员信息
+	adminInfo, e := admin.GetAdminById(adminId)
+	if e != nil {
+		errMsg = "分配失败, 研究员信息有误"
+		err = errors.New("研究员信息有误 Err:" + e.Error())
+		return
+	}
+	if adminInfo.Mobile == "" {
+		errMsg = "分配失败, 研究员手机号有误"
+		err = errors.New("研究员手机号为空")
+		return
+	}
+	// 获取研究员关联的联系人信息
+	companyId := 16
+	userInfo, e := wx_user.GetWxUserByCompanyIdAndMobile(companyId, adminInfo.Mobile)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			errMsg = "分配失败, 未找到研究员手机号对应的联系人信息"
+			err = errors.New("未获取到相关联系人信息")
+			return
+		}
+		errMsg = "分配失败"
+		err = errors.New("获取手机号所属联系人失败, Err:" + e.Error())
+		return
+	}
+	// 回复人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)
+	if e != nil {
+		errMsg = "分配失败, 一级分组信息有误"
+		err = errors.New("获取一级分组信息失败, Err:" + e.Error())
+		return
+	}
+	secondGroup, e := admin.GetResearchGroupById(researchGroupSecondId)
+	if e != nil {
+		errMsg = "分配失败, 二级分组信息有误"
+		err = errors.New("获取二级分组信息失败, Err:" + e.Error())
+		return
+	}
+	// 0627-不绑定品种权限了
+	//permissionInfo, e := models.GetChartPermissionById(secondGroup.ChartPermissionId)
+	//if e != nil {
+	//	errMsg = "分配失败, 品种权限信息有误"
+	//	err = errors.New("获取品种权限信息失败, Err:" + e.Error())
+	//	return
+	//}
+	// 更新提问信息
+	updateCols := make([]string, 0)
+	updateCols = append(updateCols, "ReplierUserId", "ReplierOpenid", "ReplierAdminId", "ReplierRealName", "ReplierAvatar", "ResearchGroupFirstId",
+		"ResearchGroupSecondId", "ResearchGroupFirstName", "ResearchGroupSecondName", "DistributeAdminId", "DistributeTime", "ChartPermissionId",
+		"ChartPermissionName", "ReplyStatus", "ReplierIsRead", "MsgSendStatus", "ModifyTime")
+	item.ReplierUserId = replierUserId
+	item.ReplierOpenid = replierOpenid
+	item.ReplierAdminId = adminId
+	item.ReplierRealName = adminInfo.RealName
+	item.ReplierAvatar = adminInfo.AdminAvatar
+	item.ResearchGroupFirstId = researchGroupFirstId
+	item.ResearchGroupSecondId = researchGroupSecondId
+	item.ResearchGroupFirstName = firstGroup.ResearchGroupName
+	item.ResearchGroupSecondName = secondGroup.ResearchGroupName
+	item.DistributeAdminId = distributeId
+	item.DistributeTime = time.Now().Local()
+	item.ChartPermissionId = 0
+	item.ChartPermissionName = ""
+	item.ReplyStatus = 2
+	item.ReplierIsRead = 0
+	item.MsgSendStatus = 0
+	item.ModifyTime = time.Now().Local()
+	if e := item.Update(updateCols); e != nil {
+		errMsg = "分配失败,更新提问信息失败"
+		err = errors.New("更新提问信息失败, Err:" + e.Error())
+	}
+	return
+}
+
+// SoftDeleteQuestion 删除问题
+func SoftDeleteQuestion(questionId int) (err error) {
+	if _, e := community_question.GetQuestionById(questionId); e != nil {
+		err = errors.New("提问信息有误 Err:" + e.Error())
+		return
+	}
+	if e := community_question.DeleteQuestion(questionId); e != nil {
+		err = errors.New("删除提问失败 Err:" + e.Error())
+	}
+	return
+}
+
+// SendMsgToReplier 推送消息给回复人
+func SendMsgToReplier(questionId int) (errMsg string, err error) {
+	errMsg = "推送成功"
+	item, e := community_question.GetQuestionById(questionId)
+	if e != nil {
+		errMsg = "问答信息有误"
+		err = errors.New("提问信息有误, Err:" + e.Error())
+		return
+	}
+	if item.MsgSendStatus >= 1 {
+		return
+	}
+	if item.ReplierUserId == 0 {
+		errMsg = "请先分配回复人"
+		err = errors.New("未分配回复人, 不可推送")
+		return
+	}
+	// 回复人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
+	}
+	// todo 推送消息
+	//if e := services.SendYbQuestionDistributeWxMsg(item.CommunityQuestionId, item.ReplierUserId, item.ReplierOpenid, item.QuestionContent); e != nil {
+	//	err = errors.New("推送模板消息失败, Err:" + e.Error())
+	//	return
+	//}
+	// 更新问答信息
+	updateCols = append(updateCols, "ModifyTime", "MsgSendStatus")
+	item.ModifyTime = time.Now().Local()
+	item.MsgSendStatus = 1
+	if e := item.Update(updateCols); e != nil {
+		err = errors.New("更新问答信息失败, Err:" + e.Error())
+	}
+	return
+}
+
+// EditQuestion 编辑问题
+func EditQuestion(questionId int, content string) (errMsg string, err error) {
+	item, e := community_question.GetQuestionById(questionId)
+	if e != nil {
+		errMsg = "提问信息有误"
+		err = errors.New("提问信息有误 Err:" + e.Error())
+		return
+	}
+	if item.MsgSendStatus >= 1 {
+		errMsg = "问题状态有误,不可编辑"
+		err = errors.New(fmt.Sprintf("问题状态不可编辑, MsgSendStatus:%d", item.MsgSendStatus))
+		return
+	}
+	updateCols := make([]string, 0)
+	updateCols = append(updateCols, "QuestionContent", "ModifyTime")
+	item.QuestionContent = content
+	item.ModifyTime = time.Now().Local()
+	if e := item.Update(updateCols); e != nil {
+		errMsg = "更新提问信息失败"
+		err = errors.New("更新提问信息失败, Err:" + e.Error())
+	}
+	return
+}
+
+// CheckCommunityQuestionPermission 查询当前操作用户是否运营管理员权限
+func CheckCommunityQuestionPermission(adminId int) (errMsg string, err error) {
+	roleInfo, e := sys_role.GetSysRoleByRoleTypeCode("yb_question_admin")
+	if e != nil {
+		errMsg = "角色信息有误"
+		if e.Error() == utils.ErrNoRow() {
+			err = errors.New("角色不存在, Err: " + e.Error())
+			return
+		}
+		err = errors.New("角色信息有误, Err: " + e.Error())
+		return
+	}
+	_, e = sys_role_admin.GetRoleIdsByAdminIdRoleId(adminId, roleInfo.RoleId)
+	if e != nil {
+		errMsg = "无权操作"
+		err = errors.New("无权操作, Err: " + e.Error())
+		return
+	}
+	return
+}

+ 10 - 0
utils/constants.go

@@ -98,3 +98,13 @@ const (
 	CACHE_KEY_ADMIN    = "calendar:admin:list"     //系统用户列表缓存key
 	CACHE_KEY_ADMIN_ID = "calendar:admin:id:list"  //系统用户列表缓存key
 )
+
+// 微信用户user_record注册平台
+const (
+	USER_RECORD_PLATFORM_RDDP      = iota + 1 // 日度点评公众号
+	USER_RECORD_PLATFORM_BACKSTAGE            // 管理后台
+	USER_RECORD_PLATFORM_PC                   // PC端网站
+	USER_RECORD_PLATFORM_CYGX                 // 查研观向小程序
+	_
+	USER_RECORD_PLATFORM_YB // 研报小程序
+)