Browse Source

add: 获取图表上一张及下一张

hsun 3 years ago
parent
commit
a7976d3307

+ 169 - 0
controller/chart/my_chart.go

@@ -4,6 +4,7 @@ import (
 	"github.com/gin-gonic/gin"
 	"hongze/hongze_yb/controller/response"
 	"hongze/hongze_yb/models/response/my_chart"
+	chartInfoModel "hongze/hongze_yb/models/tables/chart_info"
 	myChartModel "hongze/hongze_yb/models/tables/my_chart"
 	"hongze/hongze_yb/models/tables/my_chart_classify"
 	myChartClassifyMappingModel "hongze/hongze_yb/models/tables/my_chart_classify_mapping"
@@ -13,6 +14,7 @@ import (
 	"hongze/hongze_yb/utils"
 	"io/ioutil"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -387,4 +389,171 @@ func MoveMyChartClassify(c *gin.Context) {
 	}
 
 	response.Ok("操作成功", c)
+}
+
+// GetChartBeforeAndNext 获取当前图表上一张及下一张信息
+// @Tags 图库模块
+// @Summary  获取当前图表上一张及下一张信息
+// @Description 获取当前图表上一张及下一张信息
+// @Security ApiKeyAuth
+// @Param Authorization	header string true "Bearer 31a165baebe6dec616b1f8f3207b4273"
+// @Accept  json
+// @Product json
+// @Param MyChartId query string false "我的图表ID"
+// @Success 200 {object} chartInfoModel.ChartBeforeNext
+// @failure 400 {string} string "获取失败"
+// @Router /my_chart/getChartBeforeAndNext [get]
+func GetChartBeforeAndNext(c *gin.Context) {
+	// 参数校验
+	reqMyChartId := c.DefaultQuery("MyChartId", "")
+	if reqMyChartId == "" {
+		response.Fail("参数有误:我的图表ID", c)
+		return
+	}
+	myChartId, _ := strconv.Atoi(reqMyChartId)
+	myChartInfo, err := myChartModel.GetMyChartById(myChartId)
+	if err != nil {
+		if err == utils.ErrNoRow {
+			response.Fail("图表已被删除,请刷新当前页面", c)
+			return
+		}
+		response.FailMsg("获取失败", "获取我的图表信息失败, Err:" + err.Error(), c)
+		return
+	}
+
+	// 1.获取当前图表所在分类的所有图表信息
+	myChartClassifyId := myChartInfo.MyChartClassifyId
+	myChartList, err := myChartClassifyMappingModel.GetMyChartSortInfoList(myChartClassifyId, 2)
+	// 找出当前图表前一张及后一张,当前图为最前一张或最后一张时需要取其他分类的图
+	var currentIndex int
+	lastIndex := len(myChartList) - 1
+	for index, item := range myChartList {
+		if myChartInfo.MyChartId == item.MyChartId {
+			currentIndex = index
+			break
+		}
+	}
+
+	var beforeChart, afterChart *myChartClassifyMappingModel.MyChartSortInfo
+	beforeIndex := currentIndex - 1
+	if beforeIndex >= 0 {
+		// 存在同分类上一张
+		beforeChart = myChartList[beforeIndex]
+	}
+	afterIndex := currentIndex + 1
+	if afterIndex <= lastIndex {
+		// 存在同分类下一张
+		afterChart = myChartList[afterIndex]
+	}
+	// 检索其他分类
+	if beforeIndex < 0 || afterIndex > lastIndex {
+		// 获取当前用户有权限查看的图表分类
+		userInfo := user.GetInfoByClaims(c)
+		publicCondition := make(map[string]interface{})
+		privateCondition := make(map[string]interface{})
+		publicClassify, privateClassify, err := chart.GetUserChartClassifyListByCondition(userInfo, publicCondition, privateCondition)
+		if err != nil {
+			response.FailMsg("获取失败", "获取图表分类失败, Err:" + err.Error(), c)
+			return
+		}
+		// 合并公共及私有分类并去重
+		var classifyList []*my_chart_classify.MyChartClassify
+		var myChartClassifyIds []int
+		for i := 0; i < len(publicClassify); i++ {
+			exist := false
+			for _, cid := range myChartClassifyIds{
+				if publicClassify[i].MyChartClassifyId == cid {
+					exist = true
+					break
+				}
+			}
+			if exist {
+				continue
+			} else {
+				classifyList = append(classifyList, publicClassify[i])
+			}
+		}
+		for i := 0; i < len(privateClassify); i++ {
+			exist := false
+			for _, cid := range myChartClassifyIds{
+				if privateClassify[i].MyChartClassifyId == cid {
+					exist = true
+					break
+				}
+			}
+			if exist {
+				continue
+			} else {
+				classifyList = append(classifyList, privateClassify[i])
+			}
+		}
+
+		// 获取当前图表分类在所有分类中的位置
+		var currentClassifyIndex int
+		for indexClassify, itemClassify := range classifyList {
+			itemClassifyId := strconv.Itoa(itemClassify.MyChartClassifyId)
+			if strings.Contains(myChartInfo.MyChartClassifyId, itemClassifyId) {
+				currentClassifyIndex = indexClassify
+				break
+			}
+		}
+		lastClassifyIndex := len(classifyList) - 1
+
+		// 若图表为分类第一张,则取上一个分类最后一张作为上一张返回
+		beforeClassifyIndex := currentClassifyIndex - 1
+		if beforeIndex < 0 && len(classifyList) > 0 && beforeClassifyIndex >= 0 {
+			beforeClassifyIdStr := strconv.Itoa(classifyList[beforeClassifyIndex].MyChartClassifyId)
+			beforeClassifyChartList, tempErr := myChartClassifyMappingModel.GetMyChartSortInfoList(beforeClassifyIdStr, 1)
+			if tempErr != nil {
+				response.FailMsg("获取失败", "获取上一个分类图表信息失败, Err:" + tempErr.Error(), c)
+				return
+			}
+			if len(beforeClassifyChartList) > 0 {
+				beforeChart = beforeClassifyChartList[0]
+			}
+		}
+		// 若图表为分类最后一张,则取下一个分类第一张作为下一张返回
+		afterClassifyIndex := currentClassifyIndex + 1
+		if afterIndex > lastIndex && len(classifyList) > 0 && afterClassifyIndex <= lastClassifyIndex {
+			afterClassifyIdStr := strconv.Itoa(classifyList[afterClassifyIndex].MyChartClassifyId)
+			afterClassifyChartList, tempErr := myChartClassifyMappingModel.GetMyChartSortInfoList(afterClassifyIdStr, 2)
+			if tempErr != nil {
+				response.FailMsg("获取失败", "获取下一个分类图表信息失败, Err:" + tempErr.Error(), c)
+				return
+			}
+			if len(afterClassifyChartList) > 0 {
+				afterChart = afterClassifyChartList[0]
+			}
+		}
+	}
+
+	var beforeResp, afterResp chartInfoModel.ChartSortInfo
+	if beforeChart != nil {
+		beforeResp.MyChartId = beforeChart.MyChartId
+		beforeResp.MyChartClassifyId = beforeChart.MyChartClassifyId
+		beforeResp.MyChartClassifyName = beforeChart.MyChartClassifyName
+		beforeResp.Sort = int(beforeChart.Sort)
+		beforeResp.UniqueCode = beforeChart.UniqueCode
+		beforeResp.ChartInfoId = beforeChart.ChartInfoId
+		if beforeIndex < 0 {
+			beforeResp.Switch = 1
+		}
+	}
+	if afterChart != nil {
+		afterResp.MyChartId = afterChart.MyChartId
+		afterResp.MyChartClassifyId = afterChart.MyChartClassifyId
+		afterResp.MyChartClassifyName = afterChart.MyChartClassifyName
+		afterResp.Sort = int(afterChart.Sort)
+		afterResp.UniqueCode = afterChart.UniqueCode
+		afterResp.ChartInfoId = afterChart.ChartInfoId
+		if afterIndex > lastIndex {
+			afterResp.Switch = 1
+		}
+	}
+	resp := chartInfoModel.ChartBeforeNext{
+		PrevChart: beforeResp,
+		NextChart: afterResp,
+	}
+
+	response.OkData("获取成功", resp, c)
 }

+ 16 - 0
models/tables/chart_info/query.go

@@ -66,6 +66,22 @@ type ChartSaveItem struct {
 	ChartWidth  float64 `description:"线条大小"`
 }
 
+type ChartSortInfo struct {
+	ChartInfoId			int		`description:"图表ID"`
+	MyChartId			int		`description:"我的图表ID"`
+	MyChartClassifyId	int		`description:"我的图表分类ID"`
+	MyChartClassifyName	string	`description:"我的图表分类名称"`
+	UniqueCode			string	`description:"图表唯一编码"`
+	Sort				int		`description:"排序"`
+	Switch				int		`description:"是否切换 0-未切换 1-已切换"`
+	//SwitchTips			string	`description:"切换分类提示信息"`
+}
+
+type ChartBeforeNext struct {
+	PrevChart	ChartSortInfo
+	NextChart	ChartSortInfo
+}
+
 // GetChartInfoViewById 通过Id获取图表展示信息
 func GetChartInfoViewById(chartInfoId int) (item *ChartInfoView, err error) {
 	sql := `SELECT * FROM chart_info WHERE chart_info_id = ? `

+ 13 - 1
models/tables/my_chart/query.go

@@ -38,7 +38,8 @@ type MyChartView struct {
 	AdminId           int       `description:"用户id"`
 	CreateTime        time.Time `description:"创建时间"`
 	ModifyTime        time.Time `description:"修改时间"`
-	MyChartClassifyId string
+	MyChartClassifyId string	`description:"我的图表分类ID"`
+	//Sort			  int		`description:"我的图表排序"`
 }
 
 type MoveMyChartReq struct {
@@ -83,5 +84,16 @@ func GetMyChartByCondition(condition string, pars []interface{}) (list []*MyChar
 	sql += ` GROUP BY a.chart_info_id  `
 	err = global.MYSQL["data"].Raw(sql, pars).Scan(&list).Error
 
+	return
+}
+
+// GetMyChartById 主键获取我的图表
+func GetMyChartById(myChartId int) (item *MyChartView, err error) {
+	sql := ` SELECT a.*,b.sort,c.my_chart_classify_id FROM my_chart AS a
+			LEFT JOIN my_chart_classify_mapping AS b ON a.my_chart_id=b.my_chart_id AND a.admin_id=b.admin_id
+			LEFT JOIN my_chart_classify AS c ON b.my_chart_classify_id=c.my_chart_classify_id AND b.admin_id=c.admin_id
+			WHERE 1=1 AND a.my_chart_id = ?`
+	err = global.MYSQL["data"].Raw(sql, myChartId).First(&item).Error
+
 	return
 }

+ 57 - 2
models/tables/my_chart_classify_mapping/query.go

@@ -1,8 +1,10 @@
 package my_chart_classify_mapping
 
-import "hongze/hongze_yb/global"
+import (
+	"hongze/hongze_yb/global"
+)
 
-// GetMyChartSort 获取图表排序
+// GetMyChartSort 获取我的图表排序
 func GetMyChartSort(adminId, myChartClassifyId, sort int) (item *MyChartClassifyMapping, err error) {
 	sql := ` SELECT * FROM my_chart_classify_mapping WHERE 1=1 AND admin_id = ? AND my_chart_classify_id = ? `
 	if sort == 1 {
@@ -20,5 +22,58 @@ func GetMyChartClassifyMapping(adminId, myChartId, myChartClassifyId int) (item
 	sql := `SELECT * FROM my_chart_classify_mapping WHERE admin_id=? AND my_chart_id=? AND my_chart_classify_id=? `
 	err = global.MYSQL["data"].Raw(sql, adminId, myChartId, myChartClassifyId).First(&item).Error
 
+	return
+}
+
+type MyChartSortInfo struct {
+	ChartInfoId			int		`description:"图表ID"`
+	MyChartId			int		`description:"我的图表ID"`
+	MyChartClassifyId	int		`description:"我的图表分类ID"`
+	MyChartClassifyName	string	`description:"我的图表分类名称"`
+	UniqueCode			string	`description:"图表唯一编码"`
+	Sort				float64	`description:"排序"`
+}
+
+// GetClassifyChartSort 获取指定分类图表排序
+func GetClassifyChartSort(myChartClassifyId, sort int) (item []*MyChartClassifyMapping, err error) {
+	sql := ` SELECT * FROM my_chart_classify_mapping WHERE 1=1 AND my_chart_classify_id = ? `
+	if sort == 1 {
+		sql += ` ORDER BY sort DESC `
+	} else {
+		sql += ` ORDER BY sort ASC `
+	}
+	err = global.MYSQL["data"].Raw(sql, myChartClassifyId).Scan(&item).Error
+
+	return
+}
+
+// GetMyChartSortInfoList 获取我的图表信息
+func GetMyChartSortInfoList(myChartClassifyId string, sort int) (item []*MyChartSortInfo, err error) {
+	sql := `SELECT
+				a.my_chart_id,
+				a.my_chart_classify_id,
+				a.sort,
+				c.chart_info_id,
+				c.unique_code,
+				d.my_chart_classify_name
+			FROM
+				my_chart_classify_mapping AS a
+			INNER JOIN
+				my_chart AS b ON a.my_chart_id = b.my_chart_id
+			INNER JOIN
+				chart_info AS c ON b.chart_info_id = c.chart_info_id
+			INNER JOIN
+				my_chart_classify AS d ON a.my_chart_classify_id = d.my_chart_classify_id
+			WHERE
+				1 = 1
+			AND a.my_chart_classify_id = ?
+			GROUP BY c.chart_info_id `
+	if sort == 1 {
+		sql += ` ORDER BY sort DESC `
+	} else {
+		sql += ` ORDER BY sort ASC `
+	}
+	err = global.MYSQL["data"].Raw(sql, myChartClassifyId).Scan(&item).Error
+
 	return
 }

+ 1 - 0
routers/chart.go

@@ -16,5 +16,6 @@ func InitChart(r *gin.Engine) {
 		rGroup.GET("/getChartDetail", chart.GetChartInfoDetail)
 		rGroup.GET("/editChartInfo", chart.EditChartInfo)
 		rGroup.POST("/refreshChartInfo", chart.RefreshChartInfo)
+		rGroup.GET("/getChartBeforeAndNext", chart.GetChartBeforeAndNext)
 	}
 }