zwxi 4 mesi fa
parent
commit
3b3a94e876

+ 1223 - 0
controllers/bi_dashboard.go

@@ -0,0 +1,1223 @@
+package controllers
+
+import (
+	"encoding/json"
+	"errors"
+	"eta/eta_api/models"
+	"eta/eta_api/models/bi_dashboard"
+	"eta/eta_api/models/system"
+	"eta/eta_api/services"
+	"eta/eta_api/utils"
+	"fmt"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type BIDaShboardController struct {
+	BaseAuthController
+}
+
+// GroupList
+// @Title 获取我的列表
+// @Description 获取我的列表接口
+// @Success 200 {object} models.RespGroupList
+// @router /my_list [get]
+func (this *BIDaShboardController) MyList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	// 获取我的看板列表
+	privateCond := ` AND sys_admin_id = ? `
+	privatePars := []interface{}{this.SysUser.AdminId}
+	privateList, err := bi_dashboard.GetBiDashboardList(privateCond, privatePars)
+	if err != nil {
+		err = errors.New("我的看板列表查询出错:" + err.Error())
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "查询成功"
+	br.Data = privateList
+	return
+}
+
+// AddDashboard
+// @Title 新增看板
+// @Description 新增看板接口
+// @Param	request	body models.AddDashboardReq true "type json string"
+// @Success 200 Ret=200 新增成功
+// @router /add [post]
+func (this *BIDaShboardController) AddDashboard() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req bi_dashboard.AddDashboardReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.BiDashboardName == "" {
+		br.Msg = "名称不能为空"
+		return
+	}
+	nameItem, err := bi_dashboard.GetDashboardByName(req.BiDashboardName)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "查询失败"
+		br.ErrMsg = "查询失败,Err:" + err.Error()
+		return
+	}
+	if nameItem != nil && nameItem.BiDashboardId > 0 {
+		br.Msg = "名称重复"
+		return
+	}
+
+	item := &bi_dashboard.BiDashboard{
+		//BiDashboardClassifyId: req.ClassifyId,
+		BiDashboardName: req.BiDashboardName,
+		SysAdminId:      this.SysUser.AdminId,
+		SysAdminName:    this.SysUser.RealName,
+		//Sort:                  0,
+		CreateTime: time.Now(),
+		ModifyTime: time.Now(),
+		State:      1,
+	}
+	id, e := bi_dashboard.AddBiDashboard(item)
+	if e != nil {
+		err = e
+		br.Msg = "新增失败"
+		br.ErrMsg = "新增失败,Err:" + e.Error()
+		return
+	}
+	detailList := make([]*bi_dashboard.BiDashboardDetail, 0)
+	for i, v := range req.List {
+		item := &bi_dashboard.BiDashboardDetail{
+			BiDashboardId: int(id),
+			Type:          v.Type,
+			UniqueCode:    v.UniqueCode,
+			Sort:          i + 1,
+			CreateTime:    time.Now(),
+			ModifyTime:    time.Now(),
+		}
+		detailList = append(detailList, item)
+	}
+	err = bi_dashboard.AddBiDashboardDetailMulti(detailList)
+	if err != nil {
+		br.Msg = "新增详情失败"
+		br.ErrMsg = "新增详情失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "新增成功"
+	//br.Data =
+}
+
+// EditPpt
+// @Title 编辑看板
+// @Description 编辑看板接口
+// @Param	request	body bi_dashboard.EditDashboardReq true "type json string"
+// @Success 200 Ret=200 编辑成功
+// @router /edit [post]
+func (this *BIDaShboardController) EditDashboard() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req bi_dashboard.EditDashboardReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.BiDashboardName == "" {
+		br.Msg = "标题不能为空"
+		return
+	}
+	item, err := bi_dashboard.GetDashboardById(req.BiDashboardId)
+	if err != nil {
+		br.Msg = "获取数据异常!"
+		br.ErrMsg = "获取数据异常,Err:" + err.Error()
+		return
+	}
+
+	// 判断权限
+	if item.SysAdminId != this.SysUser.AdminId {
+		br.Msg = `无权编辑`
+		return
+	}
+
+	// 修改
+	item.BiDashboardName = req.BiDashboardName
+	item.ModifyTime = time.Now()
+
+	err = bi_dashboard.EditDashboard(item)
+	if err != nil {
+		br.Msg = "编辑失败"
+		br.ErrMsg = "编辑失败,Err:" + err.Error()
+		return
+	}
+
+	err = bi_dashboard.DeleteBiDashboardDetail(req.BiDashboardId)
+	if err != nil {
+		br.Msg = "删除详情失败"
+		br.ErrMsg = "删除详情失败,Err:" + err.Error()
+		return
+	}
+
+	detailList := make([]*bi_dashboard.BiDashboardDetail, 0)
+	for _, v := range req.List {
+		item := &bi_dashboard.BiDashboardDetail{
+			BiDashboardId: req.BiDashboardId,
+			Type:          v.Type,
+			UniqueCode:    v.UniqueCode,
+			Sort:          v.Sort,
+			CreateTime:    time.Now(),
+			ModifyTime:    time.Now(),
+		}
+		detailList = append(detailList, item)
+	}
+	err = bi_dashboard.AddBiDashboardDetailMulti(detailList)
+	if err != nil {
+		br.Msg = "新增详情失败"
+		br.ErrMsg = "新增详情失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+	br.IsAddLog = true
+}
+
+// DeleteDashboard
+// @Title 删除看板
+// @Description 删除看板接口
+// @Param	request	body bi_dashboard.DelDashboardReq true "type json string"
+// @Success 200 Ret=200 删除成功
+// @router /delete [post]
+func (this *BIDaShboardController) DeleteDashboard() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req bi_dashboard.DelDashboardReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.BiDashboardId <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+	item, err := bi_dashboard.GetDashboardById(req.BiDashboardId)
+	if err != nil {
+		br.Msg = "获取数据异常!"
+		br.ErrMsg = "获取数据异常,Err:" + err.Error()
+		return
+	}
+	if item.SysAdminId != this.SysUser.AdminId {
+		br.Msg = "无权删除"
+		return
+	}
+	err = bi_dashboard.DelDashboard(req.BiDashboardId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+
+	err = bi_dashboard.DelDashboard(req.BiDashboardId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "删除成功"
+}
+
+// DeleteDashboard
+// @Title 删除看板详情
+// @Description 删除看板详情接口
+// @Param	request	body bi_dashboard.DelDashboardDetailReq true "type json string"
+// @Success 200 Ret=200 删除成功
+// @router /detail/delete [post]
+func (this *BIDaShboardController) DeleteDashboardDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req bi_dashboard.DelDashboardDetailReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.BiDashboardDetailId <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+
+	err = bi_dashboard.DeleteBiDashboardDetailByDetailId(req.BiDashboardDetailId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "删除成功"
+}
+
+// DetailDashboard
+// @Title 获取看板详情
+// @Description 获取看板详情接口
+// @Param   PptId   query   int  true       "PptId"
+// @Success 200 {object} models.PptV2
+// @router /detail [get]
+func (this *BIDaShboardController) DetailDashboard() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	dashboardId, _ := this.GetInt("DashboardId")
+	resp := new(bi_dashboard.DashboardDetailResp)
+	dashboardItem, err := bi_dashboard.GetDashboardById(dashboardId)
+	if err != nil {
+		err = errors.New("我的看板列表查询出错:" + err.Error())
+		br.Msg = "我的看板列表查询出错"
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	grantInfoList, err := bi_dashboard.GetDashboardGrantInfo(dashboardId)
+	if err != nil {
+		br.Msg = "信息获取失败"
+		br.ErrMsg = "共享信息获取失败,Err:" + err.Error()
+		return
+	}
+	if len(grantInfoList) > 0 {
+		resp.IsGrant = 1
+	}
+
+	detailList, err := bi_dashboard.GetBiDashboardDetailById(dashboardId)
+	if err != nil {
+		br.Msg = "详情获取失败"
+		br.ErrMsg = "详情获取失败,Err:" + err.Error()
+		return
+	}
+
+	editor, e := services.UpdateBiDashboardEditing(dashboardId, 0, sysUser.AdminId, sysUser.RealName)
+	if e != nil {
+		br.Msg = "编辑状态更新失败"
+		br.ErrMsg = "编辑状态更新失败,Err:" + e.Error()
+		return
+	}
+
+	resp.Editor = editor
+	resp.BiDashboard = dashboardItem
+	resp.List = detailList
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// MoveDashboard
+// @Title 移动看板详情
+// @Description 移动看板详情接口
+// @Param	request	body bi_dashboard.MoveDashboardDetailReq true "type json string"
+// @Success 200 Ret=200 移动成功
+// @router /detail/move [post]
+func (this *BIDaShboardController) MoveDashboard() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req bi_dashboard.MoveDashboardDetailReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.BiDashboardId <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+	if req.BiDashboardDetailId == req.OtherDetailId || req.BiDashboardDetailId <= 0 || req.OtherDetailId <= 0 {
+		br.Msg = "看板Id有误"
+		return
+	}
+	if req.Sort < 0 || req.OtherSort < 0 || req.Sort == req.OtherSort {
+		br.Msg = "排序有误"
+		return
+	}
+
+	item, err := bi_dashboard.GetDashboardById(req.BiDashboardId)
+	if err != nil {
+		br.Msg = "获取数据异常!"
+		br.ErrMsg = "获取数据异常,Err:" + err.Error()
+		return
+	}
+
+	// 判断权限
+	if item.SysAdminId != this.SysUser.AdminId {
+		br.Msg = `无权移动`
+		return
+	}
+
+	// 修改
+	detailItem := &bi_dashboard.BiDashboardDetail{
+		BiDashboardDetailId: req.BiDashboardDetailId,
+		Sort:                req.OtherSort,
+		ModifyTime:          time.Now(),
+	}
+	err = bi_dashboard.EditBiDashboardDetail(detailItem)
+	if err != nil {
+		br.Msg = "编辑详情失败"
+		br.ErrMsg = "编辑详情失败,Err:" + err.Error()
+		return
+	}
+
+	otherItem := &bi_dashboard.BiDashboardDetail{
+		BiDashboardDetailId: req.OtherDetailId,
+		Sort:                req.Sort,
+		ModifyTime:          time.Now(),
+	}
+	err = bi_dashboard.EditBiDashboardDetail(otherItem)
+	if err != nil {
+		br.Msg = "编辑详情失败"
+		br.ErrMsg = "编辑详情失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+	br.IsAddLog = true
+}
+
+// ShareList
+// @Title 获取共享列表
+// @Description 获取共享列表接口
+// @Success 200 {object} models.RespGroupList
+// @router /share_list [get]
+func (this *BIDaShboardController) ShareList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	//myPptList := make([]*bi_dashboard.BiDashboard, 0)
+	//otherPptList := make([]*bi_dashboard.BiDashboard, 0)
+	grantList := bi_dashboard.RespGroupList{}
+
+	// 获取我的看板列表
+	ShareList, err := bi_dashboard.GetAllMyShareList(this.SysUser.AdminId)
+	if err != nil {
+		err = errors.New("我的看板列表查询出错:" + err.Error())
+		br.ErrMsg = err.Error()
+		br.Msg = "查询失败"
+		return
+	}
+	grantList.MyList = ShareList
+
+	//dashboardMap := make(map[int]*bi_dashboard.BiDashboard)
+	adminIdList := make([]int, 0)   //需要查询的创建人admin_id列表集合
+	adminIdMap := make(map[int]int) //需要查询的创建人admin_id集合,用来去重的,避免重复id
+	grantDashboardList, err := bi_dashboard.GetAllGrantList(this.SysUser.AdminId)
+	if err != nil {
+		err = errors.New("我的看板列表查询出错:" + err.Error())
+		br.ErrMsg = err.Error()
+		br.Msg = "查询失败"
+		return
+	}
+
+	publicAdminIdList := make([]int, 0)
+	publicDashboardListMap := make(map[int][]*bi_dashboard.BiDashboard)
+	for _, v := range grantDashboardList {
+		publicDashboardList, ok := publicDashboardListMap[v.SysAdminId]
+		if !ok {
+			publicDashboardList = make([]*bi_dashboard.BiDashboard, 0)
+			publicAdminIdList = append(publicAdminIdList, v.SysAdminId)
+			if _, ok := adminIdMap[v.SysAdminId]; !ok {
+				adminIdList = append(adminIdList, v.SysAdminId) //需要查询的创建人admin_id列表集合
+				adminIdMap[v.SysAdminId] = v.SysAdminId         //需要查询的创建人admin_id集合,用来去重的,避免重复id
+			}
+		}
+
+		tmp := &bi_dashboard.BiDashboard{
+			BiDashboardId:   v.BiDashboardId,
+			BiDashboardName: v.BiDashboardName,
+			CreateTime:      v.CreateTime,
+			ModifyTime:      v.ModifyTime,
+			Sort:            v.Sort,
+			State:           v.State,
+			SysAdminId:      v.SysAdminId,
+			SysAdminName:    v.SysAdminName,
+		}
+		publicDashboardList = append(publicDashboardList, tmp)
+		publicDashboardListMap[v.SysAdminId] = publicDashboardList
+	}
+	// 创建人信息
+	systemAdminMap := make(map[int]*system.Admin)
+	systemAdminList, err := system.GetAdminListByIdList(adminIdList)
+	if err != nil {
+		return
+	}
+	for _, v := range systemAdminList {
+		systemAdminMap[v.AdminId] = v
+	}
+
+	for _, v := range publicAdminIdList {
+		systemAdmin, ok := systemAdminMap[v]
+		if !ok {
+			continue
+		}
+
+		// 看板 列表信息
+		respGroupNameListItemList, ok := publicDashboardListMap[v]
+		if !ok {
+			respGroupNameListItemList = make([]*bi_dashboard.BiDashboard, 0)
+		}
+
+		// ppt 分组信息
+		tmpRespGroupListItem := &bi_dashboard.RespOtherGroupListItem{
+			GroupId:       int64(systemAdmin.AdminId),
+			GroupName:     systemAdmin.RealName,
+			AdminId:       systemAdmin.AdminId,
+			DashboardList: respGroupNameListItemList,
+		}
+		grantList.OtherList = append(grantList.OtherList, tmpRespGroupListItem)
+	}
+	//if len(dashboradIds) > 0 {
+	//	// 通过dashboradIds列表字段获取所有的看板信息
+	//	dashboradList, tmpErr := bi_dashboard.GetDashboradByIds(dashboradIds)
+	//	if tmpErr != nil {
+	//		err = errors.New("查询dashborad详情出错:" + err.Error())
+	//		br.Msg = "查询dashborad详情出错"
+	//		br.ErrMsg = err.Error()
+	//		return
+	//	}
+	//	for _, v := range dashboradList {
+	//		dashboardMap[v.BiDashboardId] = v
+	//	}
+	//}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "查询成功"
+	br.Data = grantList
+	return
+}
+
+// PublicList
+// @Title 获取公共列表
+// @Description 获取公共列表接口
+// @Success 200 {object} models.RespGroupList
+// @router /public_list [get]
+func (this *BIDaShboardController) PublicList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	resp := make([]*bi_dashboard.RespPublicGroupListItem, 0)
+	// 获取公共看板列表
+	publicCond := ` AND state = 6 `
+	publicPars := make([]interface{}, 0)
+	publicList, err := bi_dashboard.GetBiDashboardList(publicCond, publicPars)
+	if err != nil {
+		err = errors.New("我的看板列表查询出错:" + err.Error())
+		return
+	}
+
+	//dashboardMap := make(map[int]*bi_dashboard.BiDashboard)
+	adminIdList := make([]int, 0)   //需要查询的创建人admin_id列表集合
+	adminIdMap := make(map[int]int) //需要查询的创建人admin_id集合,用来去重的,避免重复id
+
+	publicAdminIdList := make([]int, 0)
+	publicDashboardListMap := make(map[int][]*bi_dashboard.BiDashboard)
+	publicDashboardClassifyIdMap := make(map[int]int)
+	for _, v := range publicList {
+		publicDashboardList, ok := publicDashboardListMap[v.SysAdminId]
+		if !ok {
+			publicDashboardList = make([]*bi_dashboard.BiDashboard, 0)
+			publicAdminIdList = append(publicAdminIdList, v.SysAdminId)
+			if _, ok := adminIdMap[v.SysAdminId]; !ok {
+				adminIdList = append(adminIdList, v.SysAdminId) //需要查询的创建人admin_id列表集合
+				adminIdMap[v.SysAdminId] = v.SysAdminId         //需要查询的创建人admin_id集合,用来去重的,避免重复id
+			}
+		}
+
+		tmp := &bi_dashboard.BiDashboard{
+			BiDashboardId:         v.BiDashboardId,
+			BiDashboardClassifyId: v.BiDashboardClassifyId,
+			BiDashboardName:       v.BiDashboardName,
+			CreateTime:            v.CreateTime,
+			ModifyTime:            v.ModifyTime,
+			Sort:                  v.Sort,
+			State:                 v.State,
+			SysAdminId:            v.SysAdminId,
+			SysAdminName:          v.SysAdminName,
+		}
+		publicDashboardList = append(publicDashboardList, tmp)
+		publicDashboardListMap[v.SysAdminId] = publicDashboardList
+		publicDashboardClassifyIdMap[v.BiDashboardClassifyId] = v.BiDashboardClassifyId
+	}
+	// 创建人信息
+	systemAdminMap := make(map[int]*system.Admin)
+	systemAdminList, err := system.GetAdminListByIdList(adminIdList)
+	if err != nil {
+		return
+	}
+	for _, v := range systemAdminList {
+		systemAdminMap[v.AdminId] = v
+	}
+
+	//tmpItem := &bi_dashboard.RespPublicGroupListItem{
+	//	GroupId:   int64(c.BiDashboardClassifyId),
+	//	GroupName: c.BiDashboardClassifyName,
+	//	Children:  make([]*bi_dashboard.RespPublicGroupListItem, 0),
+	//}
+	//for _, v := range adminIdList {
+	//	systemAdmin, ok := systemAdminMap[v]
+	//	if !ok {
+	//		continue
+	//	}
+	//
+	//	// 看板 列表信息
+	//	respGroupNameListItemList, ok := publicDashboardListMap[v]
+	//	if !ok {
+	//		respGroupNameListItemList = make([]*bi_dashboard.BiDashboard, 0)
+	//	}
+	//
+	//	// ppt 分组信息
+	//	tmpRespGroupListItem := &bi_dashboard.RespPublicGroupListItem{
+	//		GroupId:       int64(systemAdmin.AdminId),
+	//		GroupName:     systemAdmin.RealName,
+	//		AdminId:       systemAdmin.AdminId,
+	//		DashboardList: make([]*bi_dashboard.BiDashboard, 0),
+	//	}
+	//
+	//	for _, vv := range respGroupNameListItemList {
+	//		if vv.BiDashboardClassifyId == c.BiDashboardClassifyId {
+	//			tmpRespGroupListItem.DashboardList = append(tmpRespGroupListItem.DashboardList, vv)
+	//			tmpItem.Children = append(tmpItem.Children, tmpRespGroupListItem)
+	//		}
+	//	}
+	//}
+	//resp = append(resp, tmpItem)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "查询成功"
+	br.Data = resp
+	return
+}
+
+// AddDashboardClassify
+// @Title 新增看板分类
+// @Description 新增看板分类接口
+// @Param	request	body bi_dashboard.AddDashboardClassifyReq true "type json string"
+// @Success 200 Ret=200 新增成功
+// @router /classify/add [post]
+func (this *BIDaShboardController) AddDashboardClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req bi_dashboard.AddDashboardClassifyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ClassifyName == "" {
+		br.Msg = "名称不能为空"
+		return
+	}
+	maxSort, err := bi_dashboard.GetBiDashboardClassifyMaxSort()
+	if err != nil {
+		br.Msg = "获取最大排序值失败"
+		br.ErrMsg = "获取最大排序值失败,Err:" + err.Error()
+		return
+	}
+	count, err := bi_dashboard.GetBiDashboardClassifyByName(req.ClassifyName)
+	if err != nil {
+		br.Msg = "获取分类名称失败"
+		br.ErrMsg = "获取分类名称失败,Err:" + err.Error()
+		return
+	}
+	if count > 0 {
+		br.Msg = "分类名称已存在"
+		return
+	}
+
+	item := &bi_dashboard.BiDashboardClassify{
+		BiDashboardClassifyName: req.ClassifyName,
+		Sort:                    maxSort + 1,
+		CreateTime:              time.Now(),
+		ModifyTime:              time.Now(),
+	}
+	_, e := bi_dashboard.AddBiDashboardClassify(item)
+	if e != nil {
+		err = e
+		br.Msg = "新增失败"
+		br.ErrMsg = "新增失败,Err:" + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "新增成功"
+	//br.Data =
+}
+
+// EditDashboardClassify
+// @Title 编辑看板分类
+// @Description 编辑看板分类接口
+// @Param	request	body bi_dashboard.EditDashboardReq true "type json string"
+// @Success 200 Ret=200 编辑成功
+// @router /classify/edit [post]
+func (this *BIDaShboardController) EditDashboardClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req bi_dashboard.EditDashboardClassifyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ClassifyName == "" {
+		br.Msg = "标题不能为空"
+		return
+	}
+	if req.BiDashboardClassifyId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, BiDashboardClassifyId: %d", req.BiDashboardClassifyId)
+		return
+	}
+	item, err := bi_dashboard.GetBiDashboardClassifyById(req.BiDashboardClassifyId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据异常!"
+		br.ErrMsg = "获取数据异常,Err:" + err.Error()
+		return
+	}
+
+	// 修改
+	item.BiDashboardClassifyName = req.ClassifyName
+	item.ModifyTime = time.Now()
+
+	err = bi_dashboard.EditDashboardClassify(item)
+	if err != nil {
+		br.Msg = "编辑失败"
+		br.ErrMsg = "编辑失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+	br.IsAddLog = true
+}
+
+// Grant
+// @Title 分配看板权限
+// @Description 分配看板权限接口
+// @Param	request	body models.GrantPptReq true "type json string"
+// @Success 200 Ret=200 分配成功
+// @router /grant [post]
+func (this *BIDaShboardController) Grant() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req bi_dashboard.GrantDashboardReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.AdminIdStr == "" {
+		br.Msg = "参数错误"
+		return
+	}
+	if req.BiDashboardId <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+
+	dashboardItem, err := bi_dashboard.GetDashboardById(req.BiDashboardId)
+	if err != nil {
+		err = errors.New("我的看板列表查询出错:" + err.Error())
+		br.Msg = "我的看板列表查询出错"
+		br.ErrMsg = err.Error()
+		return
+	}
+	if dashboardItem.SysAdminId != this.SysUser.AdminId {
+		br.Msg = "无权配置"
+		return
+	}
+
+	list := make([]*bi_dashboard.BiDashboardGrant, 0)
+
+	grantAdminIdStrList := strings.Split(req.AdminIdStr, ",")
+	lenGrantAdminIdStrList := len(grantAdminIdStrList) //指定用户的人数
+	for _, v := range grantAdminIdStrList {
+		grantAdminId, tmpErr := strconv.Atoi(v)
+		if tmpErr != nil {
+			br.Msg = "参数有误"
+			br.ErrMsg = fmt.Sprintf("参数有误,Err:%s", tmpErr.Error())
+			return
+		}
+
+		//如果只选择了自己作为指定的人,那么就提示他报错。如果多人,那么就过滤自己
+		if grantAdminId == this.SysUser.AdminId {
+			if lenGrantAdminIdStrList == 1 {
+				br.Msg = "不能指定自己为权限用户"
+				br.ErrMsg = fmt.Sprintf("参数有误,Err:%s", tmpErr.Error())
+				return
+			}
+			continue
+		}
+		tmpV := &bi_dashboard.BiDashboardGrant{
+			BiDashboardId: req.BiDashboardId,
+			GrantAdminId:  grantAdminId,
+			CreateTime:    time.Now(),
+		}
+		list = append(list, tmpV)
+	}
+
+	if len(list) <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误,Err:%s", "指定用户为空")
+		return
+	}
+
+	err = bi_dashboard.MultiAddDashboardGrant(req.BiDashboardId, list)
+	if err != nil {
+		br.Msg = "分配失败"
+		br.ErrMsg = fmt.Sprintf("分配失败,Err:%s", err.Error())
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "分配成功"
+}
+
+// Public
+// @Title
+// @Description 设置公共看板
+// @Param	request	body models.GrantPptReq true "type json string"
+// @Success 200 Ret=200 分配成功
+// @router /public [post]
+func (this *BIDaShboardController) Public() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req bi_dashboard.PublicDashboardReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	item, err := bi_dashboard.GetDashboardById(req.BiDashboardId)
+	if err != nil {
+		br.Msg = "获取数据异常!"
+		br.ErrMsg = "获取数据异常,Err:" + err.Error()
+		return
+	}
+
+	item.State = 6
+
+	err = bi_dashboard.EditDashboard(item)
+	if err != nil {
+		br.Msg = "编辑失败"
+		br.ErrMsg = "编辑失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "分配成功"
+}
+
+// GroupList
+// @Title 获取分类列表
+// @Description 获取分类列表接口
+// @Success 200 {object} models.RespGroupList
+// @router /classify/list [get]
+func (this *BIDaShboardController) ClassifyList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	classifyList, err := bi_dashboard.GetBiDashboardClassifyAllList()
+	if err != nil {
+		br.Msg = "查询失败"
+		br.ErrMsg = "查询失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "查询成功"
+	br.Data = classifyList
+	return
+}
+
+// CancelGrant
+// @Title 取消分配看板权限
+// @Description 取消分配看板权限
+// @Param	request	body bi_dashboard.DelDashboardReq true "type json string"
+// @Success 200 Ret=200 分配成功
+// @router /grant/cancel [post]
+func (this *BIDaShboardController) CancelGrant() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req bi_dashboard.DelDashboardReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.BiDashboardId <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+
+	item, err := bi_dashboard.GetDashboardById(req.BiDashboardId)
+	if err != nil {
+		br.Msg = "数据不存在"
+		br.ErrMsg = "数据不存在,Err:" + err.Error()
+		return
+	}
+	if item.SysAdminId != this.SysUser.AdminId {
+		br.Msg = "无权配置"
+		return
+	}
+
+	// 分配
+	err = bi_dashboard.DeleteDashboardGrant(req.BiDashboardId)
+	if err != nil {
+		br.Msg = "取消失败"
+		br.ErrMsg = "取消失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "取消成功"
+}
+
+// GrantInfo
+// @Title 获取分配ppt权限详情
+// @Description 获取分配ppt权限详情接口
+// @Param    BiDashboardId   query   int  true       "看板的id"
+// @Success 200 {object} models.GrantInfoResp
+// @router /grant/info [get]
+func (this *BIDaShboardController) GrantInfo() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	biDashboardId, _ := this.GetInt("BiDashboardId")
+	if biDashboardId <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+
+	item, err := bi_dashboard.GetDashboardById(biDashboardId)
+	if err != nil {
+		br.Msg = "数据不存在"
+		br.ErrMsg = "数据不存在,Err:" + err.Error()
+		return
+	}
+	if item.SysAdminId != this.SysUser.AdminId {
+		br.Msg = "无权配置"
+		return
+	}
+
+	grantInfoList, err := bi_dashboard.GetDashboardGrantInfo(biDashboardId)
+	if err != nil {
+		br.Msg = "信息获取失败"
+		br.ErrMsg = "信息获取失败,Err:" + err.Error()
+		return
+	}
+
+	if len(grantInfoList) <= 0 {
+		br.Msg = "未配置"
+		br.IsSendEmail = false
+		br.Success = true
+		br.Ret = 200
+		return
+	}
+
+	var adminIdStr string
+
+	adminIdsList := make([]string, 0)
+	for _, v := range grantInfoList {
+		adminIdsList = append(adminIdsList, strconv.Itoa(int(v.GrantAdminId)))
+	}
+	adminIdStr = strings.Join(adminIdsList, ",")
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = adminIdStr
+	br.Msg = "查询成功"
+}
+
+// Public
+// @Title
+// @Description 撤销公共看板
+// @Param	request	body models.GrantPptReq true "type json string"
+// @Success 200 Ret=200 分配成功
+// @router /public/cancel [post]
+func (this *BIDaShboardController) PublicCancel() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req bi_dashboard.DelDashboardReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	item, err := bi_dashboard.GetDashboardById(req.BiDashboardId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据异常!"
+		br.ErrMsg = "获取数据异常,Err:" + err.Error()
+		return
+	}
+
+	item.State = 1
+
+	err = bi_dashboard.SaveDashboard(item)
+	if err != nil {
+		br.Msg = "编辑失败"
+		br.ErrMsg = "编辑失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "撤销成功"
+}
+
+// GroupList
+// @Title 获取我的首页看板
+// @Description 获取我的首页看板接口
+// @Success 200 {object} models.RespGroupList
+// @router /home_page [get]
+func (this *BIDaShboardController) HomePage() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	item, err := bi_dashboard.GetBiDashboardHomePageById(this.SysUser.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "数据不存在"
+		br.ErrMsg = "数据不存在,Err:" + err.Error()
+		return
+	}
+
+	publicCond := ` AND state = 6 AND bi_dashboard_classify_id > 0 `
+	publicPars := []interface{}{this.SysUser.AdminId}
+	publicList, err := bi_dashboard.GetBiDashboardList(publicCond, publicPars)
+	if err != nil {
+		err = errors.New("我的看板列表查询出错:" + err.Error())
+		return
+	}
+
+	if item.BiDashboardHomePageId == 0 && len(publicList) > 0 {
+		item = &bi_dashboard.BiDashboardHomePage{
+			AdminId:       publicList[0].SysAdminId,
+			BiDashboardId: publicList[0].BiDashboardId,
+			FromType:      3,
+		}
+	}
+
+	if item.BiDashboardId == 0 {
+		item = nil
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "查询成功"
+	br.Data = item
+	return
+}
+
+// GroupList
+// @Title 保存我的看板首页
+// @Description保存我的看板首页接口
+// @Success 200 {object} models.RespGroupList
+// @router /home_page/save [post]
+func (this *BIDaShboardController) HomePageSave() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req bi_dashboard.SaveHomePageReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.BiDashboardId <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+
+	item, err := bi_dashboard.GetBiDashboardHomePageById(this.SysUser.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "首页看板查询失败"
+		br.ErrMsg = "首页看板查询失败,Err:" + err.Error()
+		return
+	}
+
+	homePageItem := &bi_dashboard.BiDashboardHomePage{
+		BiDashboardId: req.BiDashboardId,
+		AdminId:       this.SysUser.AdminId,
+		CreateTime:    time.Now(),
+		ModifyTime:    time.Now(),
+		FromType:      req.FromType,
+	}
+
+	if item.BiDashboardHomePageId > 0 {
+		homePageItem.BiDashboardHomePageId = item.BiDashboardHomePageId
+	}
+
+	err = bi_dashboard.SaveBiDashboardHomePage(homePageItem)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	return
+}
+
+// Editing
+// @Title 标记/查询编辑状态
+// @Description 标记/查询编辑状态
+// @Param	request	body models.PPTEditingReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /editing [post]
+func (this *BIDaShboardController) Editing() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req bi_dashboard.BiDashboardEditingReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.BiDashboardId <= 0 {
+		br.Msg = "参数有误"
+		return
+	}
+	if req.Status < 0 {
+		br.Msg = "标记状态异常"
+		return
+	}
+
+	editor, e := services.UpdateBiDashboardEditing(req.BiDashboardId, req.Status, sysUser.AdminId, sysUser.RealName)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新编辑状态失败, err: " + e.Error()
+		return
+	}
+
+	br.Data = editor
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 169 - 0
models/bi_dashboard/bi_dashboard.go

@@ -0,0 +1,169 @@
+package bi_dashboard
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type BiDashboard struct {
+	BiDashboardId         int       `gorm:"primaryKey;autoIncrement;column:bi_dashboard_id"` // bi看板id
+	BiDashboardClassifyId int       `gorm:"column:bi_dashboard_classify_id" `                // 看板分类id
+	BiDashboardName       string    `gorm:"column:bi_dashboard_name;size:255"`               // 看板名称
+	SysAdminId            int       `gorm:"column:sys_admin_id" `                            // 创建人ID
+	SysAdminName          string    `gorm:"column:sys_admin_name;size:128" `                 // 创建人姓名
+	Sort                  int       `gorm:"column:sort" `                                    // 排序字段
+	CreateTime            time.Time `gorm:"column:create_time" `                             // 创建时间
+	ModifyTime            time.Time `gorm:"column:modify_time"`                              // 更新时间
+	State                 int       `gorm:"column:state"`                                    // 状态 1:未公开; 4-待审批;5-已驳回;6-已通过
+}
+
+// tableName
+func (m *BiDashboard) TableName() string {
+	return "bi_dashboard"
+}
+
+func (m *BiDashboard) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(m, cols...)
+	return
+}
+
+// AddBiDashboard 新增看板
+func AddBiDashboard(item *BiDashboard) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+// GetShareDashboard 获取公开分享的看板
+func GetShareDashboard() (items []*BiDashboard, err error) {
+	//o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM bi_dashboard WHERE 1=1 AND state = 6 `
+
+	sql += `ORDER BY create_time DESC`
+	//sql += `ORDER BY create_time DESC LIMIT ?,?`
+	//_, err = o.Raw(sql).QueryRows(&items)
+	//err = global.DEFAULT_DmSQL.Raw(sql).Find(&items).Error
+	return
+}
+
+func GetBiDashboardList(condition string, pars []interface{}) (items []*BiDashboard, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM bi_dashboard WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	//
+	sql += `ORDER BY modify_time DESC `
+	//sql += `ORDER BY create_time DESC LIMIT ?,?`
+	_, err = o.Raw(sql, pars...).QueryRows(&items)
+	return
+}
+
+// GetDashboardById 获取看板
+func GetDashboardById(id int) (item *BiDashboard, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM bi_dashboard WHERE bi_dashboard_id = ? limit 1`
+
+	//sql += `ORDER BY create_time DESC LIMIT ?,?`
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+// del
+func DelDashboard(id int) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Delete(&BiDashboard{BiDashboardId: id})
+	return
+}
+
+// BiDashboardEditingCache PPT编辑缓存信息
+type BiDashboardEditingCache struct {
+	IsEditing bool   `description:"是否有人编辑"`
+	AdminId   int    `description:"编辑者ID"`
+	Editor    string `description:"编辑者姓名"`
+	Tips      string `description:"提示信息"`
+}
+
+// DashboardDetailResp 详情响应体
+type DashboardDetailResp struct {
+	*BiDashboard
+	IsGrant   int                     `description:"是否共享,0:不是,1:是"`
+	Editor    BiDashboardEditingCache `description:"编辑人信息"`
+	List      []*BiDashboardDetail
+}
+
+type AddDashboardReq struct {
+	List            []*AddDashboardListReq
+	BiDashboardName string `description:"看板名称"`
+}
+
+type AddDashboardListReq struct {
+	Type       int
+	UniqueCode string
+	Sort       int
+}
+
+type EditDashboardReq struct {
+	List            []*AddDashboardListReq
+	BiDashboardId   int    `description:"看板id"`
+	BiDashboardName string `description:"看板名称"`
+}
+
+// update
+func EditDashboard(item *BiDashboard) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE bi_dashboard SET bi_dashboard_name=?,modify_time=?,bi_dashboard_classify_id=? WHERE bi_dashboard_id=?`
+	_, err = o.Raw(sql, item.BiDashboardName, time.Now(),item.BiDashboardClassifyId, item.BiDashboardId).Exec()
+	return
+}
+
+type DelDashboardReq struct {
+	BiDashboardId int `description:"看板id"`
+}
+
+func GetDashboradByIds(dashboradIds []int) (list []*BiDashboard, err error) {
+
+	//err = global.DEFAULT_DmSQL.Table("bi_dashboard").Where("bi_dashboard_id IN ?", dashboradIds).Find(&list).Error
+
+	return
+}
+
+// GetAllGrantList 获取已经有权限的看板列表
+func GetAllGrantList(sysUserId int) (list []*BiDashboard, err error) {
+	sql := `SELECT a.* FROM bi_dashboard a JOIN bi_dashboard_grant b on a.bi_dashboard_id=b.bi_dashboard_id 
+ WHERE b.grant_admin_id=?`
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, sysUserId).QueryRows(&list)
+	return
+}
+
+func SaveDashboard(item *BiDashboard) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}
+
+
+// BiDashboardEditingReq 标记编辑中请求体
+type BiDashboardEditingReq struct {
+	BiDashboardId  int `description:"看板主键ID"`
+	Status int `description:"标记状态: 1-编辑中; 2-编辑完成"`
+}
+
+// GetAllMyShareList 获取我共享的看板
+func GetAllMyShareList(sysUserId int) (list []*BiDashboard, err error) {
+	sql := `SELECT a.* FROM bi_dashboard a JOIN bi_dashboard_grant b on a.bi_dashboard_id=b.bi_dashboard_id 
+WHERE a.sys_admin_id = ? GROUP BY a.bi_dashboard_id   `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, sysUserId).QueryRows(&list)
+	return
+}
+
+// getByName
+func GetDashboardByName(name string) (item *BiDashboard, err error) {
+	sql := `SELECT * FROM bi_dashboard WHERE bi_dashboard_name = ? limit 1`
+	o := orm.NewOrm()
+	err = o.Raw(sql, name).QueryRow(&item)
+	return
+}

+ 136 - 0
models/bi_dashboard/bi_dashboard_classify.go

@@ -0,0 +1,136 @@
+package bi_dashboard
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type BiDashboardClassify struct {
+	BiDashboardClassifyId   int       `gorm:"primaryKey;autoIncrement;column:bi_dashboard_classify_id"` // bi看板分类id
+	BiDashboardClassifyName string    `gorm:"column:bi_dashboard_classify_name;size:255;not null" `     // 看板分类名称
+	Sort                    int       `gorm:"column:sort" `                                             // 排序字段
+	CreateTime              time.Time `gorm:"column:create_time" `                                      // 创建时间
+	ModifyTime              time.Time `gorm:"column:modify_time"`                                       // 更新时间
+}
+type BiDashboardClassifyItem struct {
+	BiDashboardClassifyId   int    // bi看板分类id
+	BiDashboardClassifyName string // 看板分类名称
+	Sort                    int    // 排序字段
+	CreateTime              string // 创建时间
+	ModifyTime              string // 更新时间
+}
+
+// tableName
+func (m *BiDashboardClassify) TableName() string {
+	return "bi_dashboard_classify"
+}
+
+// add
+func AddBiDashboardClassify(item *BiDashboardClassify) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+// update
+func EditDashboardClassify(item *BiDashboardClassify) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Raw("UPDATE bi_dashboard_classify SET bi_dashboard_classify_name=?,sort=?,modify_time=? WHERE bi_dashboard_classify_id=?", item.BiDashboardClassifyName, item.Sort, item.ModifyTime, item.BiDashboardClassifyId).Exec()
+	return
+}
+
+type RespGroupList struct {
+	MyList    []*BiDashboard
+	OtherList []*RespOtherGroupListItem
+}
+
+type RespMyGroupListItem struct {
+	GroupId       int64  `description:"目录id"`
+	GroupName     string `description:"目录名称"`
+	AdminId       int    `description:"目录创建者账号ID"`
+	DashboardList []*BiDashboard
+}
+
+type RespOtherGroupListItem struct {
+	GroupId       int64  `description:"目录id"`
+	GroupName     string `description:"目录名称"`
+	AdminId       int    `description:"目录创建者账号ID"`
+	DashboardList []*BiDashboard
+}
+
+type RespGroupDashboardListItem struct {
+	GroupPptId    int64  `description:"目录和ppt绑定序号"`
+	PptId         int64  `description:"ppt ID"`
+	Title         string `description:"标题"`
+	AdminId       int    `description:"移动ppt到该目录的系统用户id"`
+	AdminRealName string `description:"系统用户名称"`
+	PptVersion    int8   `description:"是否ppt的旧版本;1:旧的,2:新的"`
+	IsSingleShare int8   `description:"是否是单个共享ppt,0未单个共享,1共享"`
+	PptxUrl       string `description:"pptx下载地址"`
+	ReportId      int    `description:"关联的报告ID"`
+	ReportCode    string `description:"关联的报告code"`
+	PptCreateTime string `description:"ppt创建时间"`
+	PptModifyTime string `description:"ppt修改时间"`
+	PublishTime   string `description:"发布时间"`
+	PptPage       int    `description:"PPT总页数"`
+	IsReceived    int8   `description:"是否收到的共享,0:不是,1:是"`
+	IsGrant       int8   `description:"是否分配了权限,0:不是,1:是"`
+	TitleSetting  string `description:"PPT标题设置"`
+}
+
+func GetBiDashboardClassifyAllList() (list []*BiDashboardClassify, err error) {
+	//err = global.DEFAULT_DmSQL.Select("*").Find(&list).Error
+	o := orm.NewOrm()
+	_, err = o.Raw("SELECT * FROM bi_dashboard_classify").QueryRows(&list)
+	return
+}
+
+func GetBiDashboardClassifyById(id int) (item *BiDashboardClassify, err error) {
+	//err = global.DEFAULT_DmSQL.Where("bi_dashboard_classify_id = ?", id).First(&item).Error
+	o := orm.NewOrm()
+	err = o.Raw("SELECT * FROM bi_dashboard_classify where bi_dashboard_classify_id=?", id).QueryRow(&item)
+	return
+}
+
+type AddDashboardClassifyReq struct {
+	ClassifyName string `description:"看板名称"`
+}
+
+type EditDashboardClassifyReq struct {
+	BiDashboardClassifyId int    `description:"看板id"`
+	ClassifyName          string `description:"看板名称"`
+}
+
+type DelDashboardClassifyReq struct {
+	BiDashboardClassifyId int `description:"看板id"`
+}
+
+// GetBiDashboardClassifyMaxSort 获取看板分类下最大的排序数
+func GetBiDashboardClassifyMaxSort() (sort int, err error) {
+	sql := `SELECT COALESCE(Max(sort), 0) AS sort FROM bi_dashboard_classify `
+	//err = global.DEFAULT_DmSQL.Raw(sql).First(&sort).Error
+	o := orm.NewOrm()
+	err = o.Raw(sql).QueryRow(&sort)
+	return
+}
+
+// del
+//func DelBiDashboardClassify(id int) (err error) {
+//	return global.DEFAULT_DmSQL.Where("bi_dashboard_classify_id = ?", id).Delete(&BiDashboardClassify{}).Error
+//}
+
+type RespPublicGroupListItem struct {
+	GroupId       int64  `description:"目录id"`
+	GroupName     string `description:"目录名称"`
+	AdminId       int    `description:"目录创建者账号ID"`
+	DashboardList []*BiDashboard
+	Children      []*RespPublicGroupListItem
+}
+
+// getByName
+func GetBiDashboardClassifyByName(classifyName string) (count int64, err error) {
+	//err = global.DEFAULT_DmSQL.Model(&BiDashboardClassify{}).Where("bi_dashboard_classify_name = ?", classifyName).Count(&count).Error
+	o := orm.NewOrm()
+	err = o.Raw("SELECT count(1) FROM bi_dashboard_classify where bi_dashboard_classify_name=?", classifyName).QueryRow(&count)
+	return
+}

+ 77 - 0
models/bi_dashboard/bi_dashboard_detail.go

@@ -0,0 +1,77 @@
+package bi_dashboard
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type BiDashboardDetail struct {
+	BiDashboardDetailId int       `gorm:"primaryKey;autoIncrement;column:bi_dashboard_detail_id" ` // bi看板id
+	BiDashboardId       int       `gorm:"column:bi_dashboard_id" `                                 // 看板id
+	Type                int       `gorm:"column:type" `                                            // 1图表 2表格
+	UniqueCode          string    `gorm:"column:unique_code;size:32;not null" `                    // 报告唯一编码
+	Sort                int       `gorm:"column:sort" `                                            // 排序字段
+	CreateTime          time.Time `gorm:"column:create_time" `                                     // 创建时间
+	ModifyTime          time.Time `gorm:"column:modify_time" `                                     // 更新时间
+}
+
+// tableName
+func (m *BiDashboardDetail) TableName() string {
+	return "bi_dashboard_detail"
+}
+
+// add
+//func AddBiDashboardDetail(item *BiDashboardDetail) (err error) {
+	//err = global.DEFAULT_DmSQL.Create(item).Error
+	//return
+//}
+
+func GetBiDashboardDetailById(id int) (list []*BiDashboardDetail, err error) {
+	//err = global.DEFAULT_DmSQL.Table("bi_dashboard_detail").Where("bi_dashboard_id IN ?", id).Find(&list).Error
+	o := orm.NewOrm()
+	_, err = o.Raw("SELECT * FROM bi_dashboard_detail where bi_dashboard_id IN ?", id).QueryRows(&list)
+	return
+}
+
+// multiAdd
+func AddBiDashboardDetailMulti(items []*BiDashboardDetail) (err error) {
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+// del
+func DeleteBiDashboardDetail(id int) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Raw("DELETE from bi_dashboard_detail where bi_dashboard_id=?", id).Exec()
+	return
+}
+
+type MoveDashboardDetailReq struct {
+	BiDashboardId       int `description:"看板id"`
+	BiDashboardDetailId int `description:"看板详情id"`
+	Sort                int `description:"排序"`
+	OtherDetailId       int `description:"交换的详情id"`
+	OtherSort           int `description:"交换的排序"`
+}
+
+// update
+func EditBiDashboardDetail(item *BiDashboardDetail) (err error){
+	//return global.DEFAULT_DmSQL.Model(item).Where("bi_dashboard_detail_id = ?", item.BiDashboardDetailId).Updates(item).Error
+	o := orm.NewOrm()
+	_, err = o.Raw("UPDATE bi_dashboard_detail SET bi_dashboard_id=?,type=?,unique_code=?,sort=?,modify_time=? WHERE bi_dashboard_detail_id=?", item.BiDashboardId, item.Type, item.UniqueCode, item.Sort, item.ModifyTime, item.BiDashboardDetailId).Exec()
+	return
+}
+
+type DelDashboardDetailReq struct {
+	BiDashboardDetailId int `description:"看板详情id"`
+}
+
+
+// del
+func DeleteBiDashboardDetailByDetailId(id int) (err error) {
+	//return global.DEFAULT_DmSQL.Where("bi_dashboard_detail_id = ?", id).Delete(&BiDashboardDetail{}).Error
+	o := orm.NewOrm()
+	_, err = o.Raw("DELETE from bi_dashboard_detail where bi_dashboard_detail_id=?", id).Exec()
+	return
+}

+ 75 - 0
models/bi_dashboard/bi_dashboard_grant.go

@@ -0,0 +1,75 @@
+package bi_dashboard
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type BiDashboardGrant struct {
+	GrantId       int       `gorm:"primaryKey;autoIncrement;column:grant_id"` // 授权id
+	BiDashboardId int       `gorm:"column:bi_dashboard_id" `                  // 看板id
+	GrantAdminId  int       `gorm:"column:grant_admin_id"`                    // 授权的用户id
+	CreateTime    time.Time `gorm:"column:create_time"`                       // 授权时间
+}
+
+// tableName
+func (m *BiDashboardGrant) TableName() string {
+	return "bi_dashboard_grant"
+}
+
+// GrantDashboardReq 分配看板权限
+type GrantDashboardReq struct {
+	BiDashboardId int    `description:"看板id" `
+	AdminIdStr    string `description:"指定成员id,多个成员用英文,隔开"`
+}
+
+// MultiAddDashboardGrant 批量添加授权记录
+func MultiAddDashboardGrant(boardId int, list []*BiDashboardGrant) (err error) {
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	sql := "DELETE from bi_dashboard_grant where bi_dashboard_id=?"
+	_, err = to.Raw(sql, boardId).Exec()
+	if err != nil {
+		return
+	}
+
+	// 新增授权记录
+	if len(list) > 0 {
+		_, tmpErr := to.InsertMulti(len(list), list)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+	}
+
+	return
+}
+
+// PublicDashboardReq 设置公共看板权限
+type PublicDashboardReq struct {
+	BiDashboardId int `description:"看板id" `
+}
+
+// del
+func DeleteDashboardGrant(biDashboardId int) (err error) {
+	//return global.DEFAULT_DmSQL.Where("bi_dashboard_id=?", biDashboardId).Delete(&BiDashboardGrant{}).Error
+	o := orm.NewOrm()
+	_, err = o.Raw("DELETE from bi_dashboard_grant where bi_dashboard_id=?", biDashboardId).Exec()
+	return
+}
+
+// get
+func GetDashboardGrantInfo(biDashboardId int) (list []*BiDashboardGrant, err error) {
+	//return list, global.DEFAULT_DmSQL.Where("bi_dashboard_id=?", biDashboardId).Find(&list).Error
+	o := orm.NewOrm()
+	_, err = o.Raw("SELECT * FROM bi_dashboard_grant where bi_dashboard_id=?", biDashboardId).QueryRows(&list)
+	return
+}

+ 46 - 0
models/bi_dashboard/bi_dashboard_home_page.go

@@ -0,0 +1,46 @@
+package bi_dashboard
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type BiDashboardHomePage struct {
+	BiDashboardHomePageId int       `gorm:"primaryKey;autoIncrement;comment:'bi首页看板id'"`
+	BiDashboardId         int       `gorm:"type:int(10);default:null;comment:'看板id'"`
+	AdminId               int       `gorm:"type:int(10);default:null;"`
+	CreateTime            time.Time `gorm:"type:datetime;comment:'创建时间'"`
+	ModifyTime            time.Time `gorm:"type:datetime;comment:'更新时间'"`
+	FromType              int       `gorm:"type:int(10);default:null;comment:'来源,前端跳转用 1我的 2共享 3公共"`
+}
+
+// tableName
+func (m *BiDashboardHomePage) TableName() string {
+	return "bi_dashboard_home_page"
+}
+
+// get
+func GetBiDashboardHomePageById(id int) (item *BiDashboardHomePage, err error) {
+	sql := ` SELECT a.* FROM bi_dashboard_home_page AS a INNER JOIN bi_dashboard AS b 
+ON a.bi_dashboard_id = b.bi_dashboard_id WHERE a.admin_id = ? `
+	o := orm.NewOrm()
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+// save
+func SaveBiDashboardHomePage(item *BiDashboardHomePage) (err error) {
+	//return global.DEFAULT_DmSQL.Save(item).Error
+	o := orm.NewOrm()
+	if item.BiDashboardHomePageId > 0 {
+		_, err = o.Raw("UPDATE bi_dashboard_home_page SET bi_dashboard_id=?,modify_time=? WHERE bi_dashboard_home_page_id=?", item.BiDashboardId, item.ModifyTime, item.BiDashboardHomePageId).Exec()
+	} else {
+		_, err = o.Insert(item)
+	}
+	return
+}
+
+type SaveHomePageReq struct {
+	BiDashboardId int `description:"看板id"`
+	FromType      int `description:"来源,前端跳转用 1我的 2共享 3公共"`
+}

+ 14 - 0
models/db.go

@@ -3,6 +3,7 @@ package models
 import (
 	"eta/eta_api/models/ai_summary"
 	"eta/eta_api/models/aimod"
+	"eta/eta_api/models/bi_dashboard"
 	"eta/eta_api/models/company"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/data_manage/chart_theme"
@@ -206,6 +207,9 @@ func init() {
 
 	// 初始化部分数据表变量(直接init会有顺序问题=_=!)
 	afterInitTable()
+
+	// 智能看板
+	initBiDashBoard()
 }
 
 // initSystem 系统表 数据表
@@ -636,6 +640,16 @@ func initFactorEdbSeries() {
 	)
 }
 
+// initBiDashBoard 智能看板
+func initBiDashBoard() {
+	orm.RegisterModel(
+		new(bi_dashboard.BiDashboard),
+		new(bi_dashboard.BiDashboardDetail),
+		new(bi_dashboard.BiDashboardGrant),
+		new(bi_dashboard.BiDashboardHomePage),
+	)
+}
+
 // afterInitTable
 // @Description: 初始化表结构的的后置操作
 // @author: Roc

+ 180 - 0
routers/commentsRouter.go

@@ -8584,6 +8584,186 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "AddDashboard",
+            Router: `/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "AddDashboardClassify",
+            Router: `/classify/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "EditDashboardClassify",
+            Router: `/classify/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "ClassifyList",
+            Router: `/classify/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "DeleteDashboard",
+            Router: `/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "DetailDashboard",
+            Router: `/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "DeleteDashboardDetail",
+            Router: `/detail/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "MoveDashboard",
+            Router: `/detail/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "EditDashboard",
+            Router: `/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "Editing",
+            Router: `/editing`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "Grant",
+            Router: `/grant`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "CancelGrant",
+            Router: `/grant/cancel`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "GrantInfo",
+            Router: `/grant/info`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "HomePage",
+            Router: `/home_page`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "HomePageSave",
+            Router: `/home_page/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "MyList",
+            Router: `/my_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "Public",
+            Router: `/public`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "PublicCancel",
+            Router: `/public/cancel`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "PublicList",
+            Router: `/public_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BIDaShboardController"],
+        beego.ControllerComments{
+            Method: "ShareList",
+            Router: `/share_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:BannerController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:BannerController"],
         beego.ControllerComments{
             Method: "Upload",

+ 5 - 0
routers/router.go

@@ -397,6 +397,11 @@ func init() {
 				&document_manage.DocumentManageController{},
 			),
 		),
+		web.NSNamespace("/bi_dashborad",
+			web.NSInclude(
+				&controllers.BIDaShboardController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 68 - 0
services/bi_dashboard.go

@@ -0,0 +1,68 @@
+package services
+
+import (
+	"encoding/json"
+	"eta/eta_api/models/bi_dashboard"
+	"eta/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+
+
+
+// UpdateBiDashboardEditing 更新看板编辑状态
+func UpdateBiDashboardEditing(boardId, status, userId int, userName string) (ret bi_dashboard.BiDashboardEditingCache, err error) {
+	if boardId <= 0 {
+		return
+	}
+	cacheKey := ""
+	cacheKey = fmt.Sprint(utils.CACHE_BI_DASHBOARD_EDITING, boardId)
+
+	// 完成编辑
+	if status == 2 {
+		_ = utils.Rc.Delete(cacheKey)
+		return
+	}
+
+	// 读取缓存中的结果
+	var editor bi_dashboard.BiDashboardEditingCache
+	strCache, _ := utils.Rc.RedisString(cacheKey)
+	fmt.Println(strCache)
+	if strCache != "" {
+		e := json.Unmarshal([]byte(strCache), &editor)
+		if e != nil {
+			err = fmt.Errorf("解析缓存内容失败: %s", e.Error())
+			return
+		}
+	}
+
+	// 标记编辑中
+	if status == 1 {
+		// 无人编辑, 写入缓存
+		if !editor.IsEditing {
+			ret.IsEditing = true
+			ret.AdminId = userId
+			ret.Editor = userName
+			ret.Tips = fmt.Sprintf("当前%s正在编辑看板", userName)
+			b, _ := json.Marshal(ret)
+			utils.Rc.SetNX(cacheKey, string(b), 3*time.Minute)
+			return
+		}
+
+		// 有人编辑
+		if editor.IsEditing {
+			// 编辑用户与当前用户不一致, 返回编辑用户, 一致则更新缓存
+			if userId == editor.AdminId {
+				b, _ := json.Marshal(editor)
+				utils.Rc.Do("SETEX", cacheKey, int64(180), string(b))
+			}
+			ret = editor
+			return
+		}
+	} else {
+		// 默认查询
+		ret = editor
+	}
+	return
+}

+ 1 - 0
utils/constants.go

@@ -241,6 +241,7 @@ const (
 	CACHE_SMART_REPORT_SEND_MSG = "eta:smart_report:sending:" // 智能研报用户报告推送
 	CACHE_PPT_EDITING           = "eta:ppt:editing:"          // PPT用户编辑中
 	CACHE_EN_PPT_EDITING        = "eta:en_ppt:editing:"       // 英文PPT用户编辑中
+	CACHE_BI_DASHBOARD_EDITING  = "eta:bi_dashboard:editing:" // 看板用户编辑中
 
 	CACHE_CREATE_REPORT_IMGPDF_QUEUE = "eta_report:report_img_pdf_queue" // 生成报告长图PDF队列
 	CACHE_EDB_TERMINAL_CODE_URL      = "edb:terminal_code:edb_code:"     // 指标与终端关系的缓存