소스 검색

研报5.0问答社区接口

hsun 2 년 전
부모
커밋
dd32c9d046

+ 126 - 0
controller/community/question.go

@@ -0,0 +1,126 @@
+package community
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	"hongze/hongze_yb/models/request"
+	"hongze/hongze_yb/services/community"
+	"hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/utils"
+)
+
+func QuestionList(c *gin.Context) {
+	var req request.QuestionListReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.PageIndex == 0 {
+		req.PageIndex = 1
+	}
+	if req.PageSize == 0 {
+		req.PageSize = utils.PageSize20
+	}
+	userinfo := user.GetInfoByClaims(c)
+	list, err := community.GetQuestionList(req.PageIndex, req.PageSize, req.OnlyMine, req.ChartPermissionId, req.ReplyStatus, req.ReplierUserId, userinfo)
+	if err != nil {
+		response.FailMsg("获取失败", "QuestionList ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.OkData("获取成功", list, c)
+}
+
+func QuestionDetail(c *gin.Context) {
+	var req request.QuestionDetailReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.QuestionId == 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	item, err := community.GetQuestionDetail(req.QuestionId)
+	if err != nil {
+		response.FailMsg("获取失败", "QuestionDetail ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.OkData("获取成功", item, c)
+}
+
+func AskQuestion(c *gin.Context) {
+	var req request.QuestionAskReq
+	if err := c.ShouldBind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	// TODO:敏感词校验
+	if req.QuestionContent == "" {
+		response.Fail("内容不可为空", c)
+		return
+	}
+	userinfo := user.GetInfoByClaims(c)
+	if err := community.CreateQuestion(int(userinfo.UserID), userinfo.Mobile, userinfo.RealName, req.QuestionContent); err != nil {
+		response.FailMsg("提交失败", "AskQuestion ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.Ok("操作成功", c)
+}
+
+func ReplyQuestion(c *gin.Context) {
+	var req request.QuestionReplyReq
+	if err := c.ShouldBind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.QuestionId == 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	if len(req.AudioList) == 0 {
+		response.Fail("音频不可为空", c)
+		return
+	}
+	userinfo := user.GetInfoByClaims(c)
+	if err := community.ReplyUserQuestion(int(userinfo.UserID), req.QuestionId, req.AudioList); err != nil {
+		response.FailMsg("提交失败", "ReplyQuestion ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.Ok("操作成功", c)
+}
+
+func ReadReply(c *gin.Context) {
+	var req request.QuestionReadReq
+	if err := c.ShouldBind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.QuestionId == 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	userinfo := user.GetInfoByClaims(c)
+	if err := community.ReadQuestionReply(int(userinfo.UserID), req.QuestionId); err != nil {
+		response.FailMsg("操作失败", "ReadReply ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.Ok("操作成功", c)
+}
+
+func ReplyListTotal(c *gin.Context) {
+	var req request.ReplyListTotalReq
+	if err := c.ShouldBind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.ReplierUserId == 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	resp, err := community.GetReplyListTotal(req.ReplierUserId)
+	if err != nil {
+		response.FailMsg("获取失败", "ReplyListTotal ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.OkData("获取成功", resp, c)
+}

+ 20 - 0
controller/company/company_permission.go

@@ -17,5 +17,25 @@ func GetHomeFiccPermissions(c *gin.Context) {
 		return
 	}
 
+	response.OkData("获取成功", list, c)
+}
+
+// GetPermissionTree 获取FICC品种权限列表-不校验权限
+// @Tags 客户模块
+// @Summary  获取FICC品种权限列表
+// @Description 获取FICC品种权限列表
+// @Security ApiKeyAuth
+// @Param Authorization	header string true "Bearer 31a165baebe6dec616b1f8f3207b4273"
+// @Accept  json
+// @Product json
+// @Success 200 {object} []company.FiccPermissionList
+// @failure 400 {string} string "获取失败"
+// @Router /company/permission/tree [get]
+func GetPermissionTree(c *gin.Context)  {
+	list, err := company.GetFiccPermissionList()
+	if err != nil {
+		response.FailMsg("获取失败", "GetPermissionList ErrMsg:" + err.Error(), c)
+		return
+	}
 	response.OkData("获取成功", list, c)
 }

+ 2 - 0
init_serve/router.go

@@ -50,6 +50,8 @@ func InitRouter() (r *gin.Engine) {
 	routers.InitPurchase(r)
 	// 研报相关路由
 	routers.InitReport(r)
+	// 问答社区相关路由
+	routers.InitCommunity(r)
 	// 设置静态文件夹件路径
 	r.StaticFS("/static", http.Dir("./static"))
 	return

+ 38 - 0
models/request/community.go

@@ -0,0 +1,38 @@
+package request
+
+type QuestionListReq struct {
+	PageIndex         int `json:"page_index" form:"page_index"`
+	PageSize          int `json:"page_size" form:"page_size"`
+	OnlyMine          int `json:"only_mine" form:"only_mine"`
+	ChartPermissionId int `json:"chart_permission_id" form:"chart_permission_id"`
+	ReplyStatus       int `json:"reply_status" form:"reply_status"`
+	ReplierUserId     int `json:"replier_user_id" form:"replier_user_id"`
+}
+
+type QuestionDetailReq struct {
+	QuestionId int `json:"question_id" form:"question_id"`
+}
+
+type QuestionAskReq struct {
+	QuestionContent string `json:"question_content"`
+}
+
+type QuestionReplyReq struct {
+	QuestionId int                  `json:"question_id" form:"question_id"`
+	AudioList  []*ReplyReqAudioList `json:"audio_list" form:"audio_list"`
+}
+
+type ReplyReqAudioList struct {
+	AudioUrl         string `json:"audio_url" form:"audio_url"`
+	AudioPlaySeconds string `json:"audio_play_seconds" form:"audio_url"`
+	AudioSize        string `json:"audio_size" form:"audio_size"`
+	Sort             int    `json:"sort" form:"sort"`
+}
+
+type QuestionReadReq struct {
+	QuestionId int `json:"question_id" form:"question_id"`
+}
+
+type ReplyListTotalReq struct {
+	ReplierUserId int `json:"replier_user_id" form:"replier_user_id"`
+}

+ 37 - 0
models/response/community.go

@@ -0,0 +1,37 @@
+package response
+
+type CommunityQuestionList struct {
+	QuestionList   []*CommunityQuestionItem
+	PermissionInfo PermissionCheckInfo
+}
+
+type CommunityQuestionItem struct {
+	CommunityQuestionID int                           `json:"community_question_id"`
+	UserId              int                           `json:"user_id"`
+	QuestionContent     string                        `json:"question_content"`
+	ReplierRealName     string                        `json:"replier_real_name"`
+	ReplierRank         string                        `json:"replier_rank"`
+	ReplierAvatar       string                        `json:"replier_avatar"`
+	ChartPermissionID   int                           `json:"chart_permission_id"`
+	ChartPermissionName string                        `json:"chart_permission_name"`
+	IsRead              int                           `json:"is_read"`
+	CreateTime          string                        `json:"create_time"`
+	ReplyTime           string                        `json:"reply_time"`
+	IsTop               int                           `json:"is_top"`
+	AuthOk              bool                          `json:"auth_ok" description:"是否有权限"`
+	AudioList           []*CommunityQuestionAudioItem `json:"audio_list"`
+}
+
+type CommunityQuestionAudioItem struct {
+	CommunityQuestionID int    `json:"community_question_id"`
+	AudioURL            string `json:"audio_url"`
+	AudioPlaySeconds    string `json:"audio_play_seconds"`
+	AudioSize           string `json:"audio_size"`
+	Sort                int    `json:"sort"`
+}
+
+type CommunityReplyTotal struct {
+	Wait   int `json:"wait"`
+	Repied int `json:"repied"`
+	Total  int `json:"total"`
+}

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

@@ -6,6 +6,7 @@ import "time"
 type Admin struct {
 	AdminID                 int64     `gorm:"primaryKey;column:admin_id;type:bigint(20);not null" json:"-"`
 	AdminName               string    `gorm:"uniqueIndex:un;index:name;index:admin_pass;column:admin_name;type:varchar(60);not null" json:"adminName"`
+	AdminAvatar             string    `gorm:"column:admin_avatar;type:varchar(255)" json:"adminAvatar"`
 	RealName                string    `gorm:"column:real_name;type:varchar(60)" json:"realName"`
 	Password                string    `gorm:"index:password;index:admin_pass;column:password;type:varchar(60);not null" json:"password"`
 	LastUpdatedPasswordTime time.Time `gorm:"column:last_updated_password_time;type:datetime" json:"lastUpdatedPasswordTime"`

+ 82 - 0
models/tables/yb_community_question/entity.go

@@ -0,0 +1,82 @@
+package yb_community_question
+
+import (
+	"time"
+)
+
+// YbCommunityQuestion 研报-问答社区表
+type YbCommunityQuestion struct {
+	CommunityQuestionID int       `gorm:"primaryKey;column:community_question_id;type:int(10) unsigned;not null" json:"-"`
+	UserID              int       `gorm:"index:idx_user_id;column:user_id;type:int(10) unsigned;not null;default:0" json:"userId"`                                    // 提问用户ID
+	Mobile              string    `gorm:"column:mobile;type:varchar(20);not null;default:''" json:"mobile"`                                                           // 用户手机号
+	RealName            string    `gorm:"column:real_name;type:varchar(100);not null;default:''" json:"realName"`                                                     // 用户名
+	QuestionContent     string    `gorm:"column:question_content;type:varchar(255);not null;default:''" json:"questionContent"`                                       // 问题描述
+	ReplierUserID       int       `gorm:"index:idx_replier_user_id;column:replier_user_id;type:int(10) unsigned;not null;default:0" json:"replierUserId"`             // 回复人的user_id
+	ReplierAdminID      int       `gorm:"column:replier_admin_id;type:int(10) unsigned;not null;default:0" json:"replierAdminId"`                                     // 回复人关联的admin_id
+	ReplierRealName     string    `gorm:"column:replier_real_name;type:varchar(30);not null;default:''" json:"replierRealName"`                                       // 回复人姓名
+	ReplierAvatar       string    `gorm:"column:replier_avatar;type:varchar(255);not null;default:''" json:"replierAvatar"`                                           // 回复人头像
+	ReplierRank         string    `gorm:"column:replier_rank;type:varchar(100);not null;default:''" json:"replierRank"`                                               // 回复人头衔
+	DistributeAdminID   int       `gorm:"column:distribute_admin_id;type:int(10) unsigned;not null;default:0" json:"distributeAdminId"`                               // 分配人admin_id
+	ChartPermissionID   int       `gorm:"index:idx_chart_permission_id;column:chart_permission_id;type:int(10) unsigned;not null;default:0" json:"chartPermissionId"` // 关联权限ID
+	ChartPermissionName string    `gorm:"column:chart_permission_name;type:varchar(100);not null;default:''" json:"chartPermissionName"`                              // 关联权限name
+	IsRead              int       `gorm:"column:is_read;type:tinyint(4) unsigned;not null;default:0" json:"isRead"`                                                   // 用户是否已读 0-未读 1-已读
+	ReplyStatus         int       `gorm:"column:reply_status;type:tinyint(4) unsigned;not null;default:0" json:"replyStatus"`                                         // 状态 0-待分配 1-待回答 2-已回答
+	MsgSendStatus       int       `gorm:"column:msg_send_status;type:tinyint(4) unsigned;not null;default:0" json:"msgSendStatus"`                                    // 消息推送进度 0-待推送 1-已推送回答人 2-已推送提问人
+	ReplyTime           time.Time `gorm:"column:reply_time;type:datetime" json:"replyTime"`                                                                           // 回复时间
+	CreateTime          time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                                               // 提问时间
+	ModifyTime          time.Time `gorm:"column:modify_time;type:datetime;default:CURRENT_TIMESTAMP" json:"modifyTime"`                                               // 修改时间
+	IsDeleted           int       `gorm:"column:is_deleted;type:tinyint(4) unsigned;not null;default:0" json:"isDeleted"`                                             // 是否已删除 0-否 1-是
+	DeleteTime          time.Time `gorm:"column:delete_time;type:datetime" json:"deleteTime"`                                                                         // 删除时间
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *YbCommunityQuestion) TableName() string {
+	return "yb_community_question"
+}
+
+// YbCommunityQuestionColumns get sql column name.获取数据库列名
+var YbCommunityQuestionColumns = struct {
+	CommunityQuestionID string
+	UserID              string
+	Mobile              string
+	RealName            string
+	QuestionContent     string
+	ReplierUserID       string
+	ReplierAdminID      string
+	ReplierRealName     string
+	ReplierAvatar       string
+	ReplierRank         string
+	DistributeAdminID   string
+	ChartPermissionID   string
+	ChartPermissionName string
+	IsRead              string
+	ReplyStatus         string
+	MsgSendStatus       string
+	ReplyTime           string
+	CreateTime          string
+	ModifyTime          string
+	IsDeleted           string
+	DeleteTime          string
+}{
+	CommunityQuestionID: "community_question_id",
+	UserID:              "user_id",
+	Mobile:              "mobile",
+	RealName:            "real_name",
+	QuestionContent:     "question_content",
+	ReplierUserID:       "replier_user_id",
+	ReplierAdminID:      "replier_admin_id",
+	ReplierRealName:     "replier_real_name",
+	ReplierAvatar:       "replier_avatar",
+	ReplierRank:         "replier_rank",
+	DistributeAdminID:   "distribute_admin_id",
+	ChartPermissionID:   "chart_permission_id",
+	ChartPermissionName: "chart_permission_name",
+	IsRead:              "is_read",
+	ReplyStatus:         "reply_status",
+	MsgSendStatus:       "msg_send_status",
+	ReplyTime:           "reply_time",
+	CreateTime:          "create_time",
+	ModifyTime:          "modify_time",
+	IsDeleted:           "is_deleted",
+	DeleteTime:          "delete_time",
+}

+ 79 - 0
models/tables/yb_community_question/model.go

@@ -0,0 +1,79 @@
+package yb_community_question
+
+import (
+	"errors"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/tables/yb_community_question_audio"
+	"hongze/hongze_yb/utils"
+)
+
+func (item *YbCommunityQuestion) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	return
+}
+
+func (item *YbCommunityQuestion) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(item).Select(updateCols).Updates(*item).Error
+	return
+}
+
+func GetPageListByCondition(where map[string]interface{}, pageIndex, pageSize int) (list []*YbCommunityQuestion, err error) {
+	cond, vals, e := utils.WhereBuild(where)
+	if e != nil {
+		err = errors.New("系统异常,生成查询语句失败")
+		return
+	}
+	offset := (pageIndex - 1) * pageSize
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).Where(cond, vals...).Offset(offset).Limit(pageSize).Order("reply_time DESC").Scan(&list).Error
+	return
+}
+
+func GetWaitingReplyNum(replierId int) (num int64, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).
+		Where("replier_user_id =", replierId).
+		Count(&num).Error
+	return
+}
+
+func GetItemById(questionId int) (item *YbCommunityQuestion, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).
+		Where("community_question_id = ? AND is_deleted = 0", questionId).
+		First(&item).Error
+	return
+}
+
+func UpdateQuestionAndAudioList(item *YbCommunityQuestion, updateCols []string, audioList []*yb_community_question_audio.YbCommunityQuestionAudio) (err error) {
+	tx := global.DEFAULT_MYSQL.Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+	if err = tx.Model(item).Select(updateCols).Updates(*item).Error; err != nil {
+		return
+	}
+	if err = tx.Where("community_question_id = ?", item.CommunityQuestionID).
+		Delete(yb_community_question_audio.YbCommunityQuestionAudio{}).Error; err != nil {
+		return
+	}
+	if err = tx.Model(yb_community_question_audio.YbCommunityQuestionAudio{}).
+		CreateInBatches(audioList, len(audioList)).Error; err != nil {
+	}
+	return
+}
+
+type ReplierQuestionCount struct {
+	ReplyStatus int `json:"reply_status"`
+	Total       int `json:"total"`
+}
+
+func GetReplierQuestionCount(replierUserId int) (list []*ReplierQuestionCount, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).
+		Select("reply_status, COUNT(1) total").
+		Where("replier_user_id = ? AND is_deleted = 0", replierUserId).
+		Group("reply_status").
+		Scan(&list).Error
+	return
+}

+ 40 - 0
models/tables/yb_community_question_audio/entity.go

@@ -0,0 +1,40 @@
+package yb_community_question_audio
+
+import (
+	"time"
+)
+
+// YbCommunityQuestionAudio 研报-问答社区音频表
+type YbCommunityQuestionAudio struct {
+	CommunityQuestionAudioID int       `gorm:"primaryKey;column:community_question_audio_id;type:int(10) unsigned;not null" json:"-"`
+	CommunityQuestionID      int       `gorm:"index:idx_question_id;column:community_question_id;type:int(10) unsigned;not null;default:0" json:"communityQuestionId"` // 社区问题ID
+	AudioURL                 string    `gorm:"column:audio_url;type:varchar(255);not null;default:''" json:"audioUrl"`                                                 // 音频地址
+	AudioPlaySeconds         string    `gorm:"column:audio_play_seconds;type:varchar(30);not null;default:''" json:"audioPlaySeconds"`                                 // 音频播放时长,单位s
+	AudioSize                string    `gorm:"column:audio_size;type:varchar(30);not null;default:''" json:"audioSize"`                                                // 音频大小,单位M
+	Sort                     int       `gorm:"column:sort;type:int(10) unsigned;not null;default:0" json:"sort"`                                                       // 排序
+	CreateTime               time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                                           // 创建时间
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *YbCommunityQuestionAudio) TableName() string {
+	return "yb_community_question_audio"
+}
+
+// YbCommunityQuestionAudioColumns get sql column name.获取数据库列名
+var YbCommunityQuestionAudioColumns = struct {
+	CommunityQuestionAudioID string
+	CommunityQuestionID      string
+	AudioURL                 string
+	AudioPlaySeconds         string
+	AudioSize                string
+	Sort                     string
+	CreateTime               string
+}{
+	CommunityQuestionAudioID: "community_question_audio_id",
+	CommunityQuestionID:      "community_question_id",
+	AudioURL:                 "audio_url",
+	AudioPlaySeconds:         "audio_play_seconds",
+	AudioSize:                "audio_size",
+	Sort:                     "sort",
+	CreateTime:               "create_time",
+}

+ 33 - 0
models/tables/yb_community_question_audio/model.go

@@ -0,0 +1,33 @@
+package yb_community_question_audio
+
+import (
+	"hongze/hongze_yb/global"
+)
+
+func (item *YbCommunityQuestionAudio) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	return
+}
+
+func GetListByQuestrionIds(ids string) (list []*YbCommunityQuestionAudio, err error) {
+	if ids == "" {
+		return
+	}
+	err = global.DEFAULT_MYSQL.
+		Model(YbCommunityQuestionAudio{}).
+		Select("community_question_id, audio_url, audio_play_seconds, audio_size, sort").
+		Where("community_question_id IN ?", ids).
+		Order("community_question_id ASC, sort ASC").
+		Scan(&list).Error
+	return
+}
+
+func GetListByQuestionId(questionId int) (list []*YbCommunityQuestionAudio, err error) {
+	err = global.DEFAULT_MYSQL.
+		Model(YbCommunityQuestionAudio{}).
+		Select("community_question_id, audio_url, audio_play_seconds, audio_size, sort").
+		Where("community_question_id = ?", questionId).
+		Order("sort ASC").
+		Scan(&list).Error
+	return
+}

+ 17 - 0
routers/community.go

@@ -0,0 +1,17 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/community"
+	"hongze/hongze_yb/middleware"
+)
+
+func InitCommunity(r *gin.Engine)  {
+	rGroup := r.Group("api/community").Use(middleware.Token())
+	rGroup.GET("/question/list", community.QuestionList)
+	rGroup.GET("/question/detail", community.QuestionDetail)
+	rGroup.GET("/question/ask", community.AskQuestion)
+	rGroup.GET("/question/reply/publish", community.ReplyQuestion)
+	rGroup.GET("/question/read", community.ReadReply)
+	rGroup.GET("/question/reply/list_total", community.ReplyListTotal)
+}

+ 1 - 0
routers/company.go

@@ -10,5 +10,6 @@ func InitCompany(r *gin.Engine) {
 	rGroup := r.Group("api/company").Use(middleware.Token())
 	{
 		rGroup.GET("/getPermissionList", company.GetHomeFiccPermissions)
+		rGroup.GET("/permission/tree", company.GetPermissionTree)
 	}
 }

+ 250 - 0
services/community/question.go

@@ -0,0 +1,250 @@
+package community
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_yb/models/request"
+	"hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/models/tables/yb_community_question"
+	"hongze/hongze_yb/models/tables/yb_community_question_audio"
+	"hongze/hongze_yb/services/company"
+	"hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+func GetQuestionList(pageIndex, pageSize, onlyMine, chartPermissionId, replyStatus, replierUserId int, userInfo user.UserInfo) (resp *response.CommunityQuestionList, err error) {
+	condition := make(map[string]interface{})
+	condition["is_deleted ="] = 0
+	// 用户身份
+	isAdmin, adminInfo, e := user.GetAdminByUserInfo(userInfo)
+	if e != nil {
+		err = errors.New("获取用户身份失败 Err:" + e.Error())
+		return
+	}
+	if replierUserId > 0 {
+		condition["replier_user_id ="] = replierUserId
+		// 回复列表
+		if replyStatus > 0 {
+			condition["reply_status ="] = replyStatus
+		}
+	} else {
+		// 问题列表
+		if onlyMine == 1 {
+			if isAdmin {
+				condition["replier_user_id ="] = adminInfo.AdminID
+			} else {
+				condition["user_id ="] = userInfo.UserID
+			}
+		} else {
+			// 默认只查看已回复的
+			condition["reply_status ="] = 2
+		}
+	}
+	if chartPermissionId > 0 {
+		condition["chart_permission_id ="] = chartPermissionId
+	}
+	// 问题列表
+	questionList, e := yb_community_question.GetPageListByCondition(condition, pageIndex, pageSize)
+	if e != nil {
+		err = errors.New("获取问题列表失败 Err:" + e.Error())
+		return
+	}
+	idArr := make([]string, 0)
+	listLen := len(questionList)
+	if listLen == 0 {
+		return
+	}
+	for i := 0; i < listLen; i++ {
+		idArr = append(idArr, strconv.Itoa(questionList[i].CommunityQuestionID))
+	}
+	idStr := strings.Join(idArr, ",")
+	// 音频列表
+	audioList, e := yb_community_question_audio.GetListByQuestrionIds(idStr)
+	if e != nil {
+		err = errors.New("获取音频列表失败 Err:" + e.Error())
+		return
+	}
+	// 用户权限
+	_, permissionInfo, permissionIdArr, e := company.CheckBaseFiccPermission(userInfo.CompanyID, int(userInfo.UserID))
+	if e != nil {
+		err = errors.New("获取用户权限失败 Err:" + e.Error())
+		return
+	}
+	itemAuthMap := make(map[int]bool)
+	for _, v := range permissionIdArr {
+		itemAuthMap[v] = true
+	}
+
+	userId := int(userInfo.UserID)
+	resp = new(response.CommunityQuestionList)
+	respList := make([]*response.CommunityQuestionItem, 0)
+	for _, v := range questionList {
+		audios := make([]*response.CommunityQuestionAudioItem, 0)
+		for _, a := range audioList {
+			if a.CommunityQuestionID == v.CommunityQuestionID {
+				audios = append(audios, &response.CommunityQuestionAudioItem{
+					CommunityQuestionID: a.CommunityQuestionID,
+					AudioURL:            a.AudioURL,
+					AudioPlaySeconds:    a.AudioPlaySeconds,
+					AudioSize:           a.AudioSize,
+					Sort:                a.Sort,
+				})
+			}
+		}
+		item := &response.CommunityQuestionItem{
+			CommunityQuestionID: v.CommunityQuestionID,
+			UserId:              v.UserID,
+			QuestionContent:     v.QuestionContent,
+			ReplierRealName:     v.ReplierRealName,
+			ReplierRank:         v.ReplierRank,
+			ReplierAvatar:       v.ReplierAvatar,
+			ChartPermissionID:   v.CommunityQuestionID,
+			ChartPermissionName: v.ChartPermissionName,
+			IsRead:              v.IsRead,
+			CreateTime:          v.CreateTime.Format(utils.FormatDateTime),
+			ReplyTime:           v.ReplyTime.Format(utils.FormatDateTime),
+			AuthOk:              itemAuthMap[v.ChartPermissionID],
+			AudioList:           audios,
+		}
+		if !isAdmin && item.IsRead == 0 && item.UserId == userId {
+			item.IsTop = 1
+		}
+		respList = append(respList, item)
+	}
+	resp.QuestionList = respList
+	resp.PermissionInfo = permissionInfo
+	return
+}
+
+func GetQuestionDetail(questionId int) (item *response.CommunityQuestionItem, err error) {
+	detail, e := yb_community_question.GetItemById(questionId)
+	if e != nil {
+		err = errors.New("获取问题详情失败 Err:" + e.Error())
+		return
+	}
+	audioList, e := yb_community_question_audio.GetListByQuestionId(questionId)
+	if e != nil {
+		err = errors.New("获取问题音频失败 Err:" + e.Error())
+		return
+	}
+	audios := make([]*response.CommunityQuestionAudioItem, 0)
+	for _, a := range audioList {
+		audios = append(audios, &response.CommunityQuestionAudioItem{
+			CommunityQuestionID: a.CommunityQuestionID,
+			AudioURL:            a.AudioURL,
+			AudioPlaySeconds:    a.AudioPlaySeconds,
+			AudioSize:           a.AudioSize,
+			Sort:                a.Sort,
+		})
+	}
+	item = &response.CommunityQuestionItem{
+		CommunityQuestionID: detail.CommunityQuestionID,
+		UserId:              detail.UserID,
+		QuestionContent:     detail.QuestionContent,
+		ReplierRealName:     detail.ReplierRealName,
+		ReplierRank:         detail.ReplierRank,
+		ReplierAvatar:       detail.ReplierAvatar,
+		ChartPermissionID:   detail.CommunityQuestionID,
+		ChartPermissionName: detail.ChartPermissionName,
+		IsRead:              detail.IsRead,
+		CreateTime:          detail.CreateTime.Format(utils.FormatDateTime),
+		ReplyTime:           detail.ReplyTime.Format(utils.FormatDateTime),
+		AudioList:           audios,
+	}
+	return
+}
+
+func CreateQuestion(userId int, mobile, realName, content string) (err error) {
+	item := &yb_community_question.YbCommunityQuestion{
+		UserID:          userId,
+		Mobile:          mobile,
+		RealName:        realName,
+		QuestionContent: content,
+	}
+	if e := item.Create(); e != nil {
+		err = errors.New("新增问题失败 Err:" + e.Error())
+	}
+	return
+}
+
+func ReplyUserQuestion(replierId, questionId int, audios []*request.ReplyReqAudioList) (err error) {
+	item, e := yb_community_question.GetItemById(questionId)
+	if e != nil {
+		err = errors.New("获取提问信息失败 Err:" + e.Error())
+		return
+	}
+	if item.ReplyStatus < 1 {
+		err = errors.New("回复状态有误")
+		return
+	}
+	if item.ReplierUserID != replierId {
+		err = errors.New(fmt.Sprintf("回复人与分配人不匹配, 回复人ID: %d, 分配人ID: %d", item.ReplierUserID, replierId))
+		return
+	}
+	// 问题
+	updateCols := make([]string, 0)
+	updateCols = append(updateCols, "reply_status", "reply_time", "modify_time")
+	nowTime := time.Now().Local()
+	item.ReplyStatus = 2
+	item.ReplyTime = nowTime
+	item.ModifyTime = nowTime
+	// 音频
+	audioList := make([]*yb_community_question_audio.YbCommunityQuestionAudio, 0)
+	for _, v := range audios {
+		audioList = append(audioList, &yb_community_question_audio.YbCommunityQuestionAudio{
+			CommunityQuestionID: questionId,
+			AudioURL:            v.AudioUrl,
+			AudioPlaySeconds:    v.AudioPlaySeconds,
+			AudioSize:           v.AudioSize,
+			Sort:                v.Sort,
+			CreateTime:          nowTime,
+		})
+	}
+	if e := yb_community_question.UpdateQuestionAndAudioList(item, updateCols, audioList); e != nil {
+		err = errors.New("UpdateQuestionAndAudioList Err:" + e.Error())
+	}
+	return
+}
+
+func ReadQuestionReply(userId int, questionId int) (err error) {
+	item, e := yb_community_question.GetItemById(questionId)
+	if e != nil {
+		err = errors.New("获取提问信息失败 Err:" + e.Error())
+		return
+	}
+	if item.IsRead == 1 {
+		return
+	}
+	if item.UserID == userId {
+		updateCols := make([]string, 0)
+		updateCols = append(updateCols, "is_read", "modify_time")
+		item.IsRead = 1
+		item.ModifyTime = time.Now().Local()
+		if e = item.Update(updateCols); e != nil {
+			err = errors.New("更新问题已读失败 Err:" + e.Error())
+		}
+	}
+	return
+}
+
+func GetReplyListTotal(replierUserId int) (resp *response.CommunityReplyTotal, err error) {
+	countList, e := yb_community_question.GetReplierQuestionCount(replierUserId)
+	if e != nil {
+		err = errors.New("获取回复人问题统计失败 Err:" + e.Error())
+		return
+	}
+	resp = new(response.CommunityReplyTotal)
+	for _, v := range countList {
+		if v.ReplyStatus == 1 {
+			resp.Wait = v.Total
+		}
+		if v.ReplyStatus == 2 {
+			resp.Repied = v.Total
+		}
+	}
+	resp.Total = resp.Wait + resp.Repied
+	return
+}

+ 117 - 75
services/company/permission.go

@@ -21,6 +21,12 @@ import (
 	"time"
 )
 
+var (
+	CheckTypeApply   = "apply"
+	CheckTypeContact = "contact"
+	CheckTypeExpire  = "expired"
+)
+
 // GetClassNameListByProductId 根据权限id获取权限分类
 func GetClassNameListByProductId(productId int64) (list []*chart_permission.ChartPermission, err error) {
 	list, err = chart_permission.GetClassNameListByProductId(productId)
@@ -89,59 +95,70 @@ type CustomerInfo struct {
 	HasApply    bool   `json:"has_apply" description:"是否有申请过"`
 }
 
-// CheckPermissionByFicc 权限校验
-func CheckPermissionByFicc(companyId int64, permissionId int) (ok bool, permissionCheckInfo PermissionCheckInfo, err error) {
-	//非潜在客户
-	var productId int64
-	productId = 1
-	if companyId > 1 {
-		//查询是否 开通ficc的客户
-		companyProductInfo, tmpErr := company_product.GetByCompany2ProductId(companyId, productId)
-		if tmpErr != nil {
-			// 没有开通ficc的客户
-			if tmpErr == utils.ErrNoRow {
-				permissionCheckInfo.Type = "apply"
-				return
+// CheckBaseFiccPermission 校验用户基本的FICC权限
+func CheckBaseFiccPermission(companyId int64, userId int) (ok bool, checkInfo response.PermissionCheckInfo, permissionIdArr []int, err error) {
+	defer func() {
+		// 无权限查询是否有申请记录
+		if !ok {
+			if checkInfo.Type == CheckTypeApply {
+				if _, e := yb_apply_record.GetLastNotOpRecordByUserId(userId); e == nil {
+					checkInfo.CustomerInfo.HasApply = true
+				}
 			}
-			err = tmpErr
-			return
 		}
-
-		// 如果客户ficc产品的状态是流失,那么也是让去申请
-		if companyProductInfo.Status == "流失" {
-			permissionCheckInfo.Type = "apply"
+	}()
+	// 潜在用户
+	if companyId == 1 {
+		checkInfo.Type = CheckTypeApply
+		return
+	}
+	// 是否开通FICC
+	productId := int64(1)
+	productInfo, e := company_product.GetByCompany2ProductId(companyId, productId)
+	if e != nil {
+		if e == utils.ErrNoRow {
+			checkInfo.Type = CheckTypeApply
 			return
 		}
-		// 获取有效的权限id列表
-		validPermissionIdList, tmpErr := GetValidPermissionIdListByCompany2ProductId(companyId, productId)
-		if tmpErr != nil {
-			err = tmpErr
+		err = errors.New("获取用户FICC权限失败 Err:" + e.Error())
+		return
+	}
+	// 客户状态是否为流失
+	if productInfo.Status == "流失" {
+		checkInfo.Type = CheckTypeApply
+		return
+	}
+	// 是否为弘则研究已禁用的联系人
+	if companyId == 16 {
+		userInfo, e := wx_user.GetByUserId(userId)
+		if e != nil {
+			err = errors.New("用户信息异常 Err:" + e.Error())
 			return
 		}
-		// 校验在有效的权限id列表中是否存在该权限
-		for _, validPermissionId := range validPermissionIdList {
-			//如果有该权限id,那么直接返回校验通过
-			if validPermissionId == permissionId {
-				ok = true
-				return
-			}
-		}
-		//查找对应客户的销售信息
-
-		adminInfo, tmpErr := admin.GetByAdminId(companyProductInfo.SellerID)
-		if tmpErr != nil {
-			err = tmpErr
+		if userInfo.Enabled != 1 {
+			checkInfo.Type = CheckTypeApply
 			return
 		}
-		permissionCheckInfo = PermissionCheckInfo{
-			Name:   adminInfo.RealName,
-			Mobile: adminInfo.Mobile,
-			Type:   "contact",
-		}
-	} else {
-		permissionCheckInfo.Type = "apply"
 	}
-
+	// 客户对应的销售信息
+	sellerInfo, e := admin.GetByAdminId(productInfo.SellerID)
+	if e != nil {
+		err = errors.New("获取用户销售信息失败 Err:" + e.Error())
+		return
+	}
+	checkInfo.Name = sellerInfo.RealName
+	checkInfo.Mobile = sellerInfo.Mobile
+	if productInfo.Status == "冻结" || (productInfo.Status == "试用" && productInfo.IsSuspend == 1) {
+		checkInfo.Type = CheckTypeContact
+		return
+	}
+	// 正常用户, 获取有效权限
+	permissionIdArr, e = GetValidPermissionIdListByCompany2ProductId(companyId, productId)
+	if e != nil {
+		err = errors.New("获取用户有效权限列表失败 Err:" + e.Error())
+		return
+	}
+	ok = true
 	return
 }
 
@@ -152,7 +169,7 @@ func CheckPermissionByPermissionIdList2Ficc(companyId int64, userId int, permiss
 		if ok == false {
 			ok, _ = checkPermissionByPermissionIdList2Rai(companyId, userId, permissionIdList)
 		}
-		if ok == false && permissionCheckInfo.Type == "apply" {
+		if ok == false && permissionCheckInfo.Type == CheckTypeApply {
 			_, err = yb_apply_record.GetLastNotOpRecordByUserId(userId) // 从来源我的/活动申请的记录
 			if err != nil && err != utils.ErrNoRow {
 				return
@@ -181,7 +198,7 @@ func CheckPermissionByPermissionIdList2Ficc(companyId int64, userId int, permiss
 		if tmpErr != nil {
 			// 没有开通ficc的客户
 			if tmpErr == utils.ErrNoRow {
-				permissionCheckInfo.Type = "apply"
+				permissionCheckInfo.Type = CheckTypeApply
 				return
 			}
 			err = tmpErr
@@ -190,7 +207,7 @@ func CheckPermissionByPermissionIdList2Ficc(companyId int64, userId int, permiss
 
 		wxUser, tmpErr := wx_user.GetByUserId(userId)
 		if tmpErr != nil {
-			permissionCheckInfo.Type = "apply"
+			permissionCheckInfo.Type = CheckTypeApply
 			err = tmpErr
 			return
 		}
@@ -198,7 +215,7 @@ func CheckPermissionByPermissionIdList2Ficc(companyId int64, userId int, permiss
 		// 查询用户是否为弘则研究已禁用的联系人
 		if companyId == 16 {
 			if wxUser.Enabled != 1 {
-				permissionCheckInfo.Type = "apply"
+				permissionCheckInfo.Type = CheckTypeApply
 				return
 			}
 		}
@@ -208,7 +225,7 @@ func CheckPermissionByPermissionIdList2Ficc(companyId int64, userId int, permiss
 		if tmpErr != nil {
 			// 没有开通ficc的客户
 			if tmpErr == utils.ErrNoRow {
-				permissionCheckInfo.Type = "apply"
+				permissionCheckInfo.Type = CheckTypeApply
 				return
 			}
 			err = tmpErr
@@ -225,7 +242,7 @@ func CheckPermissionByPermissionIdList2Ficc(companyId int64, userId int, permiss
 
 		// 如果客户ficc产品的状态是流失,那么也是让去申请
 		if companyProductInfo.Status == "流失" {
-			permissionCheckInfo.Type = "apply"
+			permissionCheckInfo.Type = CheckTypeApply
 			return
 		}
 
@@ -240,13 +257,13 @@ func CheckPermissionByPermissionIdList2Ficc(companyId int64, userId int, permiss
 		permissionCheckInfo.Name = adminInfo.RealName
 		permissionCheckInfo.Mobile = adminInfo.Mobile
 		if companyProductInfo.Status == "冻结" {
-			permissionCheckInfo.Type = "contact"
+			permissionCheckInfo.Type = CheckTypeContact
 			return
 		}
 
 		//客户状态是:试用暂停状态(联系销售)
 		if companyProductInfo.Status == "试用" && companyProductInfo.IsSuspend == 1 {
-			permissionCheckInfo.Type = "contact"
+			permissionCheckInfo.Type = CheckTypeContact
 			return
 		}
 
@@ -264,9 +281,9 @@ func CheckPermissionByPermissionIdList2Ficc(companyId int64, userId int, permiss
 				return
 			}
 		}
-		permissionCheckInfo.Type = "contact"
+		permissionCheckInfo.Type = CheckTypeContact
 	} else {
-		permissionCheckInfo.Type = "apply"
+		permissionCheckInfo.Type = CheckTypeApply
 	}
 
 	return
@@ -278,7 +295,7 @@ func GetCheckPermission(companyId int64, userId int, permissionIdList []int) (ok
 		if ok == false {
 			ok, _ = checkPermissionByPermissionIdList2Rai(companyId, userId, permissionIdList)
 		}
-		if ok == false && permissionCheckInfo.Type == "apply" {
+		if ok == false && permissionCheckInfo.Type == CheckTypeApply {
 			_, err = yb_apply_record.GetLastNotOpRecordByUserId(userId) // 从来源我的/活动申请的记录
 			if err != nil {
 				if err == utils.ErrNoRow {
@@ -309,7 +326,7 @@ func GetCheckPermission(companyId int64, userId int, permissionIdList []int) (ok
 		if tmpErr != nil {
 			// 没有开通ficc的客户
 			if tmpErr == utils.ErrNoRow {
-				permissionCheckInfo.Type = "apply"
+				permissionCheckInfo.Type = CheckTypeApply
 				return
 			}
 			err = tmpErr
@@ -318,7 +335,7 @@ func GetCheckPermission(companyId int64, userId int, permissionIdList []int) (ok
 
 		wxUser, tmpErr := wx_user.GetByUserId(userId)
 		if tmpErr != nil {
-			permissionCheckInfo.Type = "apply"
+			permissionCheckInfo.Type = CheckTypeApply
 			err = tmpErr
 			return
 		}
@@ -328,7 +345,7 @@ func GetCheckPermission(companyId int64, userId int, permissionIdList []int) (ok
 		if tmpErr != nil {
 			// 没有开通ficc的客户
 			if tmpErr == utils.ErrNoRow {
-				permissionCheckInfo.Type = "apply"
+				permissionCheckInfo.Type = CheckTypeApply
 				return
 			}
 			err = tmpErr
@@ -345,7 +362,7 @@ func GetCheckPermission(companyId int64, userId int, permissionIdList []int) (ok
 
 		// 如果客户ficc产品的状态是流失,那么也是让去申请
 		if companyProductInfo.Status == "流失" {
-			permissionCheckInfo.Type = "apply"
+			permissionCheckInfo.Type = CheckTypeApply
 			return
 		}
 
@@ -360,13 +377,13 @@ func GetCheckPermission(companyId int64, userId int, permissionIdList []int) (ok
 		permissionCheckInfo.Name = adminInfo.RealName
 		permissionCheckInfo.Mobile = adminInfo.Mobile
 		if companyProductInfo.Status == "冻结" {
-			permissionCheckInfo.Type = "contact"
+			permissionCheckInfo.Type = CheckTypeContact
 			return
 		}
 
 		//客户状态是:试用暂停状态(联系销售)
 		if companyProductInfo.Status == "试用" && companyProductInfo.IsSuspend == 1 {
-			permissionCheckInfo.Type = "contact"
+			permissionCheckInfo.Type = CheckTypeContact
 			return
 		}
 
@@ -388,9 +405,9 @@ func GetCheckPermission(companyId int64, userId int, permissionIdList []int) (ok
 			return
 		}
 
-		permissionCheckInfo.Type = "contact"
+		permissionCheckInfo.Type = CheckTypeContact
 	} else {
-		permissionCheckInfo.Type = "apply"
+		permissionCheckInfo.Type = CheckTypeApply
 	}
 	return
 }
@@ -460,7 +477,7 @@ type ChartPermissionCheckInfo struct {
 func CheckUserChartPermission(companyId int64, userId int) (ok bool, permissionCheckInfo ChartPermissionCheckInfo, err error) {
 	defer func() {
 		// 如果无权限,那么就去查询是否申请过
-		if ok == false && permissionCheckInfo.Type == "apply" {
+		if ok == false && permissionCheckInfo.Type == CheckTypeApply {
 			_, err = yb_apply_record.GetLastNotOpRecordByUserId(userId) // 图库申请
 			// 查询是否有申请过,如果有申请过的话,那么err是nil
 			if err != nil {
@@ -482,7 +499,7 @@ func CheckUserChartPermission(companyId int64, userId int) (ok bool, permissionC
 		if tmpErr != nil {
 			// 没有开通FICC
 			if tmpErr == utils.ErrNoRow {
-				permissionCheckInfo.Type = "apply"
+				permissionCheckInfo.Type = CheckTypeApply
 				return
 			}
 			err = tmpErr
@@ -491,7 +508,7 @@ func CheckUserChartPermission(companyId int64, userId int) (ok bool, permissionC
 
 		wxUser, tmpErr := wx_user.GetByUserId(userId)
 		if tmpErr != nil {
-			permissionCheckInfo.Type = "apply"
+			permissionCheckInfo.Type = CheckTypeApply
 			err = tmpErr
 			return
 		}
@@ -499,7 +516,7 @@ func CheckUserChartPermission(companyId int64, userId int) (ok bool, permissionC
 		// 查询用户是否为弘则研究已禁用的联系人
 		if companyId == 16 {
 			if wxUser.Enabled != 1 {
-				permissionCheckInfo.Type = "apply"
+				permissionCheckInfo.Type = CheckTypeApply
 				return
 			}
 		}
@@ -509,7 +526,7 @@ func CheckUserChartPermission(companyId int64, userId int) (ok bool, permissionC
 		if tmpErr != nil {
 			// 没有开通FICC
 			if tmpErr == utils.ErrNoRow {
-				permissionCheckInfo.Type = "apply"
+				permissionCheckInfo.Type = CheckTypeApply
 				return
 			}
 			err = tmpErr
@@ -526,7 +543,7 @@ func CheckUserChartPermission(companyId int64, userId int) (ok bool, permissionC
 
 		// 如果客户FICC产品的状态是流失-申请
 		if companyProductInfo.Status == "流失" {
-			permissionCheckInfo.Type = "apply"
+			permissionCheckInfo.Type = CheckTypeApply
 			return
 		}
 
@@ -541,7 +558,7 @@ func CheckUserChartPermission(companyId int64, userId int) (ok bool, permissionC
 		permissionCheckInfo.Name = adminInfo.RealName
 		permissionCheckInfo.Mobile = adminInfo.Mobile
 		if companyProductInfo.Status == "冻结" || (companyProductInfo.Status == "试用" && companyProductInfo.IsSuspend == 1) {
-			permissionCheckInfo.Type = "contact"
+			permissionCheckInfo.Type = CheckTypeContact
 			return
 		}
 
@@ -550,7 +567,7 @@ func CheckUserChartPermission(companyId int64, userId int) (ok bool, permissionC
 		if tmpErr != nil {
 			if tmpErr == utils.ErrNoRow {
 				// 无权限-联系销售
-				permissionCheckInfo.Type = "contact"
+				permissionCheckInfo.Type = CheckTypeContact
 				return
 			}
 			err = tmpErr
@@ -559,7 +576,7 @@ func CheckUserChartPermission(companyId int64, userId int) (ok bool, permissionC
 		nowTime := time.Now()
 		if permissionInfo.Enabled != 1 {
 			// 权限被禁用-联系销售
-			permissionCheckInfo.Type = "contact"
+			permissionCheckInfo.Type = CheckTypeContact
 			return
 		}
 		endTime := permissionInfo.EndTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second)
@@ -567,14 +584,14 @@ func CheckUserChartPermission(companyId int64, userId int) (ok bool, permissionC
 			ok = true
 		} else {
 			// 权限已到期
-			permissionCheckInfo.Type = "expired"
+			permissionCheckInfo.Type = CheckTypeExpire
 			return
 		}
 
 		// 都不是默认联系销售
-		permissionCheckInfo.Type = "contact"
+		permissionCheckInfo.Type = CheckTypeContact
 	} else {
-		permissionCheckInfo.Type = "apply"
+		permissionCheckInfo.Type = CheckTypeApply
 	}
 
 	return
@@ -592,6 +609,31 @@ type PermissionItem struct {
 	HasPermission  bool   `description:"是否有权限"`
 }
 
+// GetFiccPermissionList 获取FICC品种权限列表-不校验用户权限
+func GetFiccPermissionList() (list []*FiccPermissionList, err error) {
+	productId := 1
+	list = make([]*FiccPermissionList, 0)
+	for _, v := range utils.PermissionFiccClassifyArr {
+		classify := new(FiccPermissionList)
+		classify.ClassifyName = v
+		items, e := chart_permission.GetListByProductIdAndClassifyName(productId, v)
+		if e != nil {
+			err = errors.New("获取品种权限失败 Err:" + e.Error())
+			return
+		}
+		tmpItems := make([]*PermissionItem, 0)
+		for _, iv := range items {
+			item := new(PermissionItem)
+			item.PermissionId = int(iv.ChartPermissionID)
+			item.PermissionName = iv.PermissionName
+			tmpItems = append(tmpItems, item)
+		}
+		classify.Items = tmpItems
+		list = append(list, classify)
+	}
+	return
+}
+
 func GetHomeFiccPermissions(user user.UserInfo) (ret response.PermissionFiccResp, err error) {
 	var errMsg string
 	defer func() {