feat: 拓扑编辑数据存储功能
This commit is contained in:
359
src/modules/chart/service/chart_graph.impl.go
Normal file
359
src/modules/chart/service/chart_graph.impl.go
Normal file
@@ -0,0 +1,359 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"ems.agt/src/framework/utils/parse"
|
||||
"ems.agt/src/modules/chart/model"
|
||||
chartRepository "ems.agt/src/modules/chart/repository"
|
||||
"github.com/goccy/go-json"
|
||||
)
|
||||
|
||||
// 实例化服务层 ChartGraphImpl 结构体
|
||||
var NewChartGraphImpl = &ChartGraphImpl{
|
||||
graphRepository: chartRepository.NewChartGraphImpl,
|
||||
}
|
||||
|
||||
// ChartGraphImpl G6关系图数据表 服务层处理
|
||||
type ChartGraphImpl struct {
|
||||
// G6关系图数据服务
|
||||
graphRepository chartRepository.IChartGraph
|
||||
}
|
||||
|
||||
// SelectGroup 查询组名
|
||||
func (s *ChartGraphImpl) SelectGroup() []string {
|
||||
return s.graphRepository.SelectGroup()
|
||||
}
|
||||
|
||||
// LoadData 查询所组图数据
|
||||
func (s *ChartGraphImpl) LoadData(rowGroup, rowType string) map[string]any {
|
||||
// 查询数据
|
||||
graph := model.ChartGraph{
|
||||
RowGroup: rowGroup,
|
||||
}
|
||||
if rowType != "" {
|
||||
graph.RowType = rowType
|
||||
}
|
||||
data := s.graphRepository.SelectList(graph)
|
||||
|
||||
// 数据项
|
||||
nodes := []map[string]any{}
|
||||
edges := []map[string]any{}
|
||||
combos := []map[string]any{}
|
||||
|
||||
for _, v := range data {
|
||||
if v.RowType == "node" {
|
||||
nodes = append(nodes, s.loadNode(v))
|
||||
}
|
||||
if v.RowType == "edge" {
|
||||
edges = append(edges, s.loadEdge(v))
|
||||
}
|
||||
if v.RowType == "combo" {
|
||||
combos = append(combos, s.loadCombo(v))
|
||||
}
|
||||
}
|
||||
|
||||
return map[string]any{
|
||||
"nodes": nodes,
|
||||
"edges": edges,
|
||||
"combos": combos,
|
||||
}
|
||||
}
|
||||
|
||||
// loadNode 图数据Node
|
||||
func (s *ChartGraphImpl) loadNode(v model.ChartGraph) map[string]any {
|
||||
node := map[string]any{
|
||||
"id": v.ID,
|
||||
"comboId": v.ComboID,
|
||||
"x": v.X,
|
||||
"y": v.Y,
|
||||
"type": v.Type,
|
||||
"depth": v.Depth,
|
||||
}
|
||||
|
||||
// 元素样式
|
||||
style := map[string]any{}
|
||||
if len(v.Style) > 7 {
|
||||
json.Unmarshal([]byte(v.Style), &style)
|
||||
}
|
||||
node["style"] = style
|
||||
|
||||
// 元素大小
|
||||
if strings.Contains(v.Size, "[") {
|
||||
sizeArr := []int64{}
|
||||
json.Unmarshal([]byte(v.Size), &sizeArr)
|
||||
node["size"] = sizeArr
|
||||
} else {
|
||||
node["size"] = parse.Number(v.Size)
|
||||
}
|
||||
|
||||
// 标签文本
|
||||
node["label"] = v.Label
|
||||
labelCfg := map[string]any{}
|
||||
if len(v.LabelCfg) > 7 {
|
||||
json.Unmarshal([]byte(v.LabelCfg), &labelCfg)
|
||||
}
|
||||
node["labelCfg"] = labelCfg
|
||||
|
||||
// 三角形属性
|
||||
if v.Type == "triangle" {
|
||||
node["direction"] = v.Direction
|
||||
}
|
||||
|
||||
// 图片属性
|
||||
if v.Type == "image" {
|
||||
node["img"] = v.Img
|
||||
clipCfg := map[string]any{}
|
||||
if len(v.ClipCfg) > 7 {
|
||||
json.Unmarshal([]byte(v.ClipCfg), &clipCfg)
|
||||
}
|
||||
node["clipCfg"] = clipCfg
|
||||
}
|
||||
|
||||
// 图标属性
|
||||
if v.Icon != "" {
|
||||
icon := map[string]any{}
|
||||
if len(v.Icon) > 7 {
|
||||
json.Unmarshal([]byte(v.Icon), &icon)
|
||||
}
|
||||
node["icon"] = icon
|
||||
}
|
||||
|
||||
return node
|
||||
}
|
||||
|
||||
// loadEdge 图数据Edge
|
||||
func (s *ChartGraphImpl) loadEdge(v model.ChartGraph) map[string]any {
|
||||
edge := map[string]any{
|
||||
"id": v.ID,
|
||||
"source": v.Source,
|
||||
"target": v.Target,
|
||||
"type": v.Type,
|
||||
}
|
||||
|
||||
// 元素样式
|
||||
style := map[string]any{}
|
||||
if len(v.Style) > 7 {
|
||||
json.Unmarshal([]byte(v.Style), &style)
|
||||
}
|
||||
edge["style"] = style
|
||||
|
||||
// 标签文本
|
||||
edge["label"] = v.Label
|
||||
labelCfg := map[string]any{}
|
||||
if len(v.LabelCfg) > 7 {
|
||||
json.Unmarshal([]byte(v.LabelCfg), &labelCfg)
|
||||
}
|
||||
edge["labelCfg"] = labelCfg
|
||||
|
||||
return edge
|
||||
}
|
||||
|
||||
// loadCombo 图数据Combo
|
||||
func (s *ChartGraphImpl) loadCombo(v model.ChartGraph) map[string]any {
|
||||
combo := map[string]any{
|
||||
"id": v.ID,
|
||||
"x": v.X,
|
||||
"y": v.Y,
|
||||
"type": v.Type,
|
||||
"depth": v.Depth,
|
||||
}
|
||||
|
||||
// 元素样式
|
||||
style := map[string]any{}
|
||||
if len(v.Style) > 7 {
|
||||
json.Unmarshal([]byte(v.Style), &style)
|
||||
}
|
||||
combo["style"] = style
|
||||
|
||||
// 元素大小
|
||||
if strings.Contains(v.Size, "[") {
|
||||
sizeArr := []int64{}
|
||||
json.Unmarshal([]byte(v.Size), &sizeArr)
|
||||
combo["size"] = sizeArr
|
||||
} else {
|
||||
combo["size"] = parse.Number(v.Size)
|
||||
}
|
||||
|
||||
// 元素内边距
|
||||
if strings.Contains(v.Padding, "[") {
|
||||
paddingArr := []int64{}
|
||||
json.Unmarshal([]byte(v.Padding), &paddingArr)
|
||||
combo["padding"] = paddingArr
|
||||
} else {
|
||||
combo["padding"] = parse.Number(v.Padding)
|
||||
}
|
||||
|
||||
// 标签文本
|
||||
combo["label"] = v.Label
|
||||
labelCfg := map[string]any{}
|
||||
if len(v.LabelCfg) > 7 {
|
||||
json.Unmarshal([]byte(v.LabelCfg), &labelCfg)
|
||||
}
|
||||
combo["labelCfg"] = labelCfg
|
||||
|
||||
// 分组内元素
|
||||
if v.Children != "" {
|
||||
children := []map[string]any{}
|
||||
if len(v.Children) > 7 {
|
||||
json.Unmarshal([]byte(v.Children), &children)
|
||||
}
|
||||
combo["children"] = children
|
||||
}
|
||||
|
||||
return combo
|
||||
}
|
||||
|
||||
// SaveData 添加组图数据
|
||||
func (s *ChartGraphImpl) SaveData(rowGroup string, data map[string]any) int64 {
|
||||
graphs := []model.ChartGraph{}
|
||||
nodes := data["nodes"].([]map[string]any)
|
||||
graphNodes := s.saveNode(rowGroup, nodes)
|
||||
graphs = append(graphs, graphNodes...)
|
||||
edges := data["edges"].([]map[string]any)
|
||||
graphEdges := s.saveEdge(rowGroup, edges)
|
||||
graphs = append(graphs, graphEdges...)
|
||||
combos := data["combos"].([]map[string]any)
|
||||
graphCombos := s.saveCombo(rowGroup, combos)
|
||||
graphs = append(graphs, graphCombos...)
|
||||
// 删除组数据后插入
|
||||
if len(graphs) > 0 {
|
||||
s.graphRepository.DeleteGroup(rowGroup)
|
||||
}
|
||||
return s.graphRepository.Inserts(graphs)
|
||||
}
|
||||
|
||||
// saveNode 图数据Node
|
||||
func (s *ChartGraphImpl) saveNode(rowGroup string, nodes []map[string]any) []model.ChartGraph {
|
||||
var graphs []model.ChartGraph
|
||||
for _, v := range nodes {
|
||||
node := model.ChartGraph{
|
||||
RowType: "node",
|
||||
RowGroup: rowGroup,
|
||||
ID: v["id"].(string),
|
||||
X: v["x"].(float64),
|
||||
Y: v["y"].(float64),
|
||||
Type: v["type"].(string),
|
||||
}
|
||||
if comboId, ok := v["comboId"]; ok && comboId != nil {
|
||||
node.ComboID = comboId.(string)
|
||||
}
|
||||
if depth, ok := v["depth"]; ok && depth != nil {
|
||||
node.Depth = int(depth.(float64))
|
||||
}
|
||||
if styleByte, err := json.Marshal(v["style"]); err == nil {
|
||||
node.Style = string(styleByte)
|
||||
}
|
||||
|
||||
// 元素大小
|
||||
if sizeByte, err := json.Marshal(v["size"]); err == nil {
|
||||
node.Size = string(sizeByte)
|
||||
}
|
||||
|
||||
// 标签文本
|
||||
if label, ok := v["label"]; ok && label != nil {
|
||||
node.Label = label.(string)
|
||||
}
|
||||
if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil {
|
||||
node.LabelCfg = string(labelCfgByte)
|
||||
}
|
||||
// 三角形属性
|
||||
if direction, ok := v["direction"]; ok && direction != nil && node.Type == "triangle" {
|
||||
node.Direction = direction.(string)
|
||||
}
|
||||
// 图片属性
|
||||
if img, ok := v["img"]; ok && img != nil {
|
||||
node.Img = img.(string)
|
||||
if clipCfgByte, err := json.Marshal(v["clipCfg"]); err == nil {
|
||||
node.ClipCfg = string(clipCfgByte)
|
||||
}
|
||||
}
|
||||
// 图标属性
|
||||
if icon, ok := v["icon"]; ok && icon != nil {
|
||||
if iconByte, err := json.Marshal(icon); err == nil {
|
||||
node.Icon = string(iconByte)
|
||||
}
|
||||
}
|
||||
|
||||
graphs = append(graphs, node)
|
||||
}
|
||||
return graphs
|
||||
}
|
||||
|
||||
// saveEdge 图数据Edge
|
||||
func (s *ChartGraphImpl) saveEdge(rowGroup string, edges []map[string]any) []model.ChartGraph {
|
||||
var graphs []model.ChartGraph
|
||||
for _, v := range edges {
|
||||
edge := model.ChartGraph{
|
||||
RowType: "edge",
|
||||
RowGroup: rowGroup,
|
||||
ID: v["id"].(string),
|
||||
Source: v["source"].(string),
|
||||
Target: v["target"].(string),
|
||||
Type: v["type"].(string),
|
||||
}
|
||||
|
||||
if styleByte, err := json.Marshal(v["style"]); err == nil {
|
||||
edge.Style = string(styleByte)
|
||||
}
|
||||
|
||||
// 标签文本
|
||||
if label, ok := v["label"]; ok && label != nil {
|
||||
edge.Label = label.(string)
|
||||
}
|
||||
if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil {
|
||||
edge.LabelCfg = string(labelCfgByte)
|
||||
}
|
||||
|
||||
graphs = append(graphs, edge)
|
||||
}
|
||||
return graphs
|
||||
}
|
||||
|
||||
// saveCombo 图数据Combo
|
||||
func (s *ChartGraphImpl) saveCombo(rowGroup string, combos []map[string]any) []model.ChartGraph {
|
||||
var graphs []model.ChartGraph
|
||||
for _, v := range combos {
|
||||
combo := model.ChartGraph{
|
||||
RowType: "combo",
|
||||
RowGroup: rowGroup,
|
||||
ID: v["id"].(string),
|
||||
X: v["x"].(float64),
|
||||
Y: v["y"].(float64),
|
||||
Type: v["type"].(string),
|
||||
}
|
||||
if depth, ok := v["depth"]; ok && depth != nil {
|
||||
combo.Depth = int(depth.(float64))
|
||||
}
|
||||
if styleByte, err := json.Marshal(v["style"]); err == nil {
|
||||
combo.Style = string(styleByte)
|
||||
}
|
||||
if paddingByte, err := json.Marshal(v["padding"]); err == nil {
|
||||
combo.Padding = string(paddingByte)
|
||||
}
|
||||
if childrenByte, err := json.Marshal(v["children"]); err == nil {
|
||||
combo.Children = string(childrenByte)
|
||||
}
|
||||
|
||||
// 元素大小
|
||||
if sizeByte, err := json.Marshal(v["size"]); err == nil {
|
||||
combo.Size = string(sizeByte)
|
||||
}
|
||||
|
||||
// 标签文本
|
||||
if label, ok := v["label"]; ok && label != nil {
|
||||
combo.Label = label.(string)
|
||||
}
|
||||
if labelCfgByte, err := json.Marshal(v["labelCfg"]); err == nil {
|
||||
combo.LabelCfg = string(labelCfgByte)
|
||||
}
|
||||
|
||||
graphs = append(graphs, combo)
|
||||
}
|
||||
return graphs
|
||||
}
|
||||
|
||||
// Delete 删除所组图数据
|
||||
func (s *ChartGraphImpl) DeleteGroup(rowGroup string) int64 {
|
||||
return s.graphRepository.DeleteGroup(rowGroup)
|
||||
}
|
||||
Reference in New Issue
Block a user