作者 庄敏学

移动端筛选项本地存储获取

@@ -7,17 +7,16 @@ import ( @@ -7,17 +7,16 @@ import (
7 "github.com/golang-jwt/jwt/v4/request" 7 "github.com/golang-jwt/jwt/v4/request"
8 "github.com/zeromicro/go-queue/kq" 8 "github.com/zeromicro/go-queue/kq"
9 "github.com/zeromicro/go-zero/core/logx" 9 "github.com/zeromicro/go-zero/core/logx"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/config"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/handler"
10 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/logic/consumer" 12 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/logic/consumer"
  13 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
11 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db" 14 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db"
12 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain" 15 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
13 "net/http" 16 "net/http"
14 "strings" 17 "strings"
15 "time" 18 "time"
16 19
17 - "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/config"  
18 - "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/handler"  
19 - "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"  
20 -  
21 "github.com/zeromicro/go-zero/core/conf" 20 "github.com/zeromicro/go-zero/core/conf"
22 "github.com/zeromicro/go-zero/rest" 21 "github.com/zeromicro/go-zero/rest"
23 ) 22 )
@@ -61,23 +60,23 @@ func main() { @@ -61,23 +60,23 @@ func main() {
61 60
62 db.Migrate(ctx.DB) 61 db.Migrate(ctx.DB)
63 //启动消费队列 62 //启动消费队列
64 - go startConsume(c) 63 + startConsume(c)
65 64
66 logx.Infof("Starting server at %s:%d... \n", c.Host, c.Port) 65 logx.Infof("Starting server at %s:%d... \n", c.Host, c.Port)
67 server.Start() 66 server.Start()
68 } 67 }
69 68
70 func startConsume(c config.Config) { 69 func startConsume(c config.Config) {
71 - svcCtx := svc.NewServiceContext(c) 70 + //svcCtx := svc.NewServiceContext(c)
72 go func() { 71 go func() {
73 for { 72 for {
74 notice := &domain.ObjectNotice{ 73 notice := &domain.ObjectNotice{
75 - CompanyId: 1594869884284571648,  
76 - TableId: 1573, 74 + CompanyId: 1598224576532189184,
  75 + TableId: 521,
77 TableType: "主表", 76 TableType: "主表",
78 ObjectType: "导入模块", 77 ObjectType: "导入模块",
79 Event: "table.data.edit", 78 Event: "table.data.edit",
80 - TableAffectedList: []int{1573}, 79 + TableAffectedList: []int{521},
81 DataChanged: true, 80 DataChanged: true,
82 StructChanged: true, 81 StructChanged: true,
83 MetaData: domain.ObjectNoticeMetaData{ 82 MetaData: domain.ObjectNoticeMetaData{
@@ -91,18 +90,29 @@ func startConsume(c config.Config) { @@ -91,18 +90,29 @@ func startConsume(c config.Config) {
91 time.Sleep(10 * 10 * time.Second) 90 time.Sleep(10 * 10 * time.Second)
92 } 91 }
93 }() 92 }()
  93 + //kafka消费队列 处理字库推送事件
94 go func() { 94 go func() {
95 - 95 + svcCtx := svc.NewServiceContext(c)
  96 + queue, err := kq.NewQueue(c.KqConsumerConf, consumer.NewByteNoticeLogic(svcCtx))
  97 + if err != nil {
  98 + panic(err)
  99 + } else {
  100 + queue.Start()
  101 + }
  102 + }()
  103 + //redis消费队列 处理表数据存储到本地
  104 + go func() {
  105 + for {
  106 + svcCtx := svc.NewServiceContext(c)
  107 + str, err := svcCtx.Redis.Rpop(c.Name + ":table_data")
  108 + if err == nil {
  109 + _ = consumer.NewByteTableDataLogic(svcCtx).Sync(str)
  110 + }
  111 + time.Sleep(3 * time.Second)
  112 + }
96 }() 113 }()
97 //kq.MustNewQueue(c.KqConsumerConf, consumer.NewByteNoticeLogic(svcCtx)) 114 //kq.MustNewQueue(c.KqConsumerConf, consumer.NewByteNoticeLogic(svcCtx))
98 //for { 115 //for {
99 - queue, err := kq.NewQueue(c.KqConsumerConf, consumer.NewByteNoticeLogic(svcCtx))  
100 - if err != nil {  
101 - panic(err)  
102 - } else {  
103 - queue.Start()  
104 - }  
105 //time.Sleep(1 * time.Second) 116 //time.Sleep(1 * time.Second)
106 //} 117 //}
107 -  
108 } 118 }
@@ -2,6 +2,7 @@ package chart @@ -2,6 +2,7 @@ package chart
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "encoding/json"
5 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction" 6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction"
6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain" 7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/contextdata" 8 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/contextdata"
@@ -89,6 +90,16 @@ func (l *SaveChartLogic) SaveChart(req *types.ChartSaveRequest) (resp *types.Cha @@ -89,6 +90,16 @@ func (l *SaveChartLogic) SaveChart(req *types.ChartSaveRequest) (resp *types.Cha
89 }, true); err != nil { 90 }, true); err != nil {
90 return nil, xerr.NewErrMsgErr("创建失败", err) 91 return nil, xerr.NewErrMsgErr("创建失败", err)
91 } 92 }
  93 + if len(chartSetting.DataSourceIds) > 0 {
  94 + for _, sourceId := range chartSetting.DataSourceIds {
  95 + pusher := &types.SyncTableDataPusher{
  96 + CompanyId: tenantId,
  97 + ObjectId: int(sourceId),
  98 + }
  99 + mBytes, _ := json.Marshal(pusher)
  100 + _, _ = l.svcCtx.Redis.LpushCtx(l.ctx, l.svcCtx.Config.Name+":table_data", string(mBytes))
  101 + }
  102 + }
92 resp = &types.ChartSaveResponse{ 103 resp = &types.ChartSaveResponse{
93 Chart: types.NewChartItemWithSetting(chart, chartSetting), 104 Chart: types.NewChartItemWithSetting(chart, chartSetting),
94 } 105 }
@@ -2,6 +2,8 @@ package chart @@ -2,6 +2,8 @@ package chart
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "encoding/json"
  6 + "github.com/samber/lo"
5 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction" 7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction"
6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain" 8 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/contextdata" 9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/contextdata"
@@ -41,6 +43,7 @@ func (l *UpdateChartLogic) UpdateChart(req *types.ChartUpdateRequest) (resp *typ @@ -41,6 +43,7 @@ func (l *UpdateChartLogic) UpdateChart(req *types.ChartUpdateRequest) (resp *typ
41 if chartSetting, err = l.svcCtx.ChartSettingRepository.FindOne(l.ctx, conn, req.Id); err != nil { 43 if chartSetting, err = l.svcCtx.ChartSettingRepository.FindOne(l.ctx, conn, req.Id); err != nil {
42 return nil, xerr.NewErrMsgErr("图表配置不存在", err) 44 return nil, xerr.NewErrMsgErr("图表配置不存在", err)
43 } 45 }
  46 + oldDataSource := chartSetting.DataSourceIds
44 47
45 if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { 48 if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
46 if len(req.Cover) > 0 && chart.Cover != req.Cover { 49 if len(req.Cover) > 0 && chart.Cover != req.Cover {
@@ -54,9 +57,36 @@ func (l *UpdateChartLogic) UpdateChart(req *types.ChartUpdateRequest) (resp *typ @@ -54,9 +57,36 @@ func (l *UpdateChartLogic) UpdateChart(req *types.ChartUpdateRequest) (resp *typ
54 chartSetting.TableAbility = chartProperty.TableAbility 57 chartSetting.TableAbility = chartProperty.TableAbility
55 chartSetting.Series = chartProperty.Series 58 chartSetting.Series = chartProperty.Series
56 chartSetting.Other = chartProperty.Other 59 chartSetting.Other = chartProperty.Other
  60 + chartSetting.DataSourceIds = chartProperty.GetAllDataSourceId()
57 if chartSetting, err = l.svcCtx.ChartSettingRepository.UpdateWithVersion(l.ctx, conn, chartSetting); err != nil { 61 if chartSetting, err = l.svcCtx.ChartSettingRepository.UpdateWithVersion(l.ctx, conn, chartSetting); err != nil {
58 return err 62 return err
59 } 63 }
  64 + //对比更新前后数据源
  65 + left, right := lo.Difference(chartSetting.DataSourceIds, oldDataSource)
  66 + //同步
  67 + if len(left) > 0 {
  68 + for _, sourceId := range left {
  69 + pusher := &types.SyncTableDataPusher{
  70 + CompanyId: tenantId,
  71 + ObjectId: int(sourceId),
  72 + }
  73 + mBytes, _ := json.Marshal(pusher)
  74 + _, _ = l.svcCtx.Redis.LpushCtx(l.ctx, l.svcCtx.Config.Name+":table_data", string(mBytes))
  75 + }
  76 + }
  77 + //删除
  78 + if len(right) > 0 {
  79 + for _, sourceId := range right {
  80 + //验证其他图表是否使用
  81 + used, err := l.svcCtx.ChartSettingRepository.CheckUseDataSource(l.ctx, conn, int(sourceId))
  82 + if err == nil && !used { //未使用,删除
  83 + err = l.svcCtx.ObjectTableDataRepository.DropTable(l.ctx, conn, int(sourceId))
  84 + if err != nil {
  85 + return err
  86 + }
  87 + }
  88 + }
  89 + }
60 return nil 90 return nil
61 }, true); err != nil { 91 }, true); err != nil {
62 return nil, xerr.NewErrMsgErr("创建失败", err) 92 return nil, xerr.NewErrMsgErr("创建失败", err)
@@ -4,8 +4,6 @@ import ( @@ -4,8 +4,6 @@ import (
4 "context" 4 "context"
5 "encoding/json" 5 "encoding/json"
6 "fmt" 6 "fmt"
7 - "github.com/pkg/errors"  
8 - "github.com/zeromicro/go-zero/core/stores/redis"  
9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc" 7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
10 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types" 8 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
11 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction" 9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction"
@@ -125,37 +123,13 @@ func (logic *ByteNoticeLogic) handleNotice(conn transaction.Conn, notice *domain @@ -125,37 +123,13 @@ func (logic *ByteNoticeLogic) handleNotice(conn transaction.Conn, notice *domain
125 } 123 }
126 //数据变更 124 //数据变更
127 if notice.DataChanged { 125 if notice.DataChanged {
128 - tableDataPreview, err := logic.svcCtx.ByteMetadataService.TableDataPreview(logic.ctx, &bytelib.TableDataPreviewRequest{  
129 - Token: accessToken,  
130 - ObjectId: int64(notice.TableId),  
131 - ObjectType: bytelib.ObjectMetaTable,  
132 - Where: &bytelib.TableQueryWhere{  
133 - PageNumber: 1,  
134 - PageSize: bytelib.MaxPageSize,  
135 - },  
136 - UseCache: true,  
137 - HiddenData: false,  
138 - })  
139 - if err != nil {  
140 - return err  
141 - }  
142 - //加锁,避免图表在请求读取本地数据时报错  
143 - key := logic.svcCtx.Config.Name + ":bytelib:" + fmt.Sprintf("%v", tableDataPreview.ObjectId)  
144 - lock := redis.NewRedisLock(logic.svcCtx.Redis, key)  
145 - // 设置过期时间  
146 - lock.SetExpire(10 * 60)  
147 - acquire, err := lock.Acquire()  
148 - fmt.Println(acquire, err)  
149 - defer lock.Release()  
150 - err = logic.svcCtx.ObjectTableDataRepository.InsertWithTableData(logic.ctx, conn, bytelib.TableData(tableDataPreview))  
151 - if err != nil {  
152 - return err  
153 - }  
154 - //更新标记本地存储  
155 - err = logic.updateTableWithLocal(conn, int(tableDataPreview.ObjectId))  
156 - if err != nil {  
157 - return err 126 + data := &types.SyncTableDataPusher{
  127 + CompanyId: notice.CompanyId,
  128 + ObjectId: notice.TableId,
158 } 129 }
  130 + mBytes, _ := json.Marshal(data)
  131 + _, err := logic.svcCtx.Redis.LpushCtx(logic.ctx, logic.svcCtx.Config.Name+":table_data", string(mBytes))
  132 + return err
159 } 133 }
160 return nil 134 return nil
161 } 135 }
@@ -191,6 +165,14 @@ func (logic *ByteNoticeLogic) handleDelete(conn transaction.Conn, notice *domain @@ -191,6 +165,14 @@ func (logic *ByteNoticeLogic) handleDelete(conn transaction.Conn, notice *domain
191 return err 165 return err
192 } 166 }
193 } 167 }
  168 + //是否有使用数据源
  169 + used, err := logic.svcCtx.ChartSettingRepository.CheckUseDataSource(logic.ctx, conn, notice.TableId)
  170 + if err == nil && !used {
  171 + err = logic.svcCtx.ObjectTableDataRepository.DropTable(logic.ctx, conn, notice.TableId)
  172 + if err != nil {
  173 + return err
  174 + }
  175 + }
194 return nil 176 return nil
195 } 177 }
196 178
@@ -227,14 +209,3 @@ func (logic *ByteNoticeLogic) saveFields(conn transaction.Conn, objectField *dom @@ -227,14 +209,3 @@ func (logic *ByteNoticeLogic) saveFields(conn transaction.Conn, objectField *dom
227 return logic.svcCtx.ObjectFieldRepository.Insert(logic.ctx, conn, objectField) 209 return logic.svcCtx.ObjectFieldRepository.Insert(logic.ctx, conn, objectField)
228 } 210 }
229 } 211 }
230 -  
231 -// updateTableWithLocal 更新表标记本地存储  
232 -func (logic *ByteNoticeLogic) updateTableWithLocal(conn transaction.Conn, tableId int) error {  
233 - objectTable, err := logic.svcCtx.ObjectTableRepository.FindOneByTableId(logic.ctx, conn, tableId)  
234 - if err == nil && objectTable.Id > 0 {  
235 - objectTable.IsLocal = true  
236 - _, err = logic.svcCtx.ObjectTableRepository.Update(logic.ctx, conn, objectTable)  
237 - return err  
238 - }  
239 - return errors.New("表不存在")  
240 -}  
  1 +package consumer
  2 +
  3 +import (
  4 + "context"
  5 + "encoding/json"
  6 + "github.com/pkg/errors"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/gateway/bytelib"
  11 +)
  12 +
  13 +type ByteTableDataLogic struct {
  14 + ctx context.Context
  15 + svcCtx *svc.ServiceContext
  16 +}
  17 +
  18 +func NewByteTableDataLogic(svcCtx *svc.ServiceContext) *ByteTableDataLogic {
  19 + return &ByteTableDataLogic{
  20 + svcCtx: svcCtx,
  21 + ctx: context.Background(),
  22 + }
  23 +}
  24 +
  25 +func (logic *ByteTableDataLogic) Sync(pusherStr string) error {
  26 + pusher := &types.SyncTableDataPusher{}
  27 + err := json.Unmarshal([]byte(pusherStr), pusher)
  28 + if err != nil {
  29 + return err
  30 + }
  31 + conn := logic.svcCtx.DefaultDBConn()
  32 + accessToken, _ := types.TableAccessToken{CompanyId: pusher.CompanyId}.GenerateToken()
  33 + tableDataPreview, err := logic.svcCtx.ByteMetadataService.TableDataPreview(logic.ctx, &bytelib.TableDataPreviewRequest{
  34 + Token: accessToken,
  35 + ObjectId: int64(pusher.ObjectId),
  36 + ObjectType: bytelib.ObjectMetaTable,
  37 + Where: &bytelib.TableQueryWhere{
  38 + PageNumber: 1,
  39 + PageSize: bytelib.MaxPageSize,
  40 + },
  41 + UseCache: true,
  42 + HiddenData: false,
  43 + })
  44 + if err != nil {
  45 + return err
  46 + }
  47 + err = transaction.UseTrans(logic.ctx, conn.DB(), func(ctx context.Context, conn transaction.Conn) error {
  48 + err = logic.svcCtx.ObjectTableDataRepository.InsertWithTableData(logic.ctx, conn, bytelib.TableData(tableDataPreview))
  49 + if err != nil {
  50 + return err
  51 + }
  52 + //更新标记本地存储
  53 + err = logic.updateTableWithLocal(conn, int(tableDataPreview.ObjectId))
  54 + if err != nil {
  55 + return err
  56 + }
  57 + return nil
  58 + }, true)
  59 + return err
  60 +}
  61 +
  62 +// updateTableWithLocal 更新表标记本地存储
  63 +func (logic *ByteTableDataLogic) updateTableWithLocal(conn transaction.Conn, tableId int) error {
  64 + objectTable, err := logic.svcCtx.ObjectTableRepository.FindOneByTableId(logic.ctx, conn, tableId)
  65 + if err == nil && objectTable.Id > 0 {
  66 + objectTable.IsLocal = true
  67 + _, err = logic.svcCtx.ObjectTableRepository.Update(logic.ctx, conn, objectTable)
  68 + return err
  69 + }
  70 + return errors.New("表不存在")
  71 +}
@@ -2,16 +2,15 @@ package table @@ -2,16 +2,15 @@ package table
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "fmt"
5 "github.com/jinzhu/copier" 6 "github.com/jinzhu/copier"
6 "github.com/samber/lo" 7 "github.com/samber/lo"
  8 + "github.com/zeromicro/go-zero/core/logx"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain" 11 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
8 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/gateway/bytelib" 12 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/gateway/bytelib"
9 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr" 13 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr"
10 -  
11 - "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"  
12 - "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"  
13 -  
14 - "github.com/zeromicro/go-zero/core/logx"  
15 ) 14 )
16 15
17 type SearchTableFieldOptionalValuesLogic struct { 16 type SearchTableFieldOptionalValuesLogic struct {
@@ -29,6 +28,12 @@ func NewSearchTableFieldOptionalValuesLogic(ctx context.Context, svcCtx *svc.Ser @@ -29,6 +28,12 @@ func NewSearchTableFieldOptionalValuesLogic(ctx context.Context, svcCtx *svc.Ser
29 } 28 }
30 29
31 func (l *SearchTableFieldOptionalValuesLogic) SearchTableFieldOptionalValues(req *types.SearchTableFieldOptionalValuesRequest) (resp *types.SearchTableFieldOptionalValuesResponse, err error) { 30 func (l *SearchTableFieldOptionalValuesLogic) SearchTableFieldOptionalValues(req *types.SearchTableFieldOptionalValuesRequest) (resp *types.SearchTableFieldOptionalValuesResponse, err error) {
  31 + //取本地数据
  32 + resp, err = l.getLocal(req)
  33 + if err == nil {
  34 + return resp, err
  35 + }
  36 + //获取远程数据
32 fieldOptionalValuesRequest := &bytelib.TableFieldOptionalValuesRequest{ 37 fieldOptionalValuesRequest := &bytelib.TableFieldOptionalValuesRequest{
33 Token: req.Token, 38 Token: req.Token,
34 ObjectType: bytelib.ObjectMetaTable, 39 ObjectType: bytelib.ObjectMetaTable,
@@ -103,9 +108,17 @@ func (l *SearchTableFieldOptionalValuesLogic) getLocal(req *types.SearchTableFie @@ -103,9 +108,17 @@ func (l *SearchTableFieldOptionalValuesLogic) getLocal(req *types.SearchTableFie
103 return nil, xerr.NewErrMsg("字段" + item.FieldName + "不存在") 108 return nil, xerr.NewErrMsg("字段" + item.FieldName + "不存在")
104 } 109 }
105 } 110 }
  111 + field := req.Field
  112 + for _, item := range objectField.Fields {
  113 + if req.Field == item.Name {
  114 + field = item.SQLName
  115 + }
  116 + }
106 //表数据 117 //表数据
107 _, list, err := l.svcCtx.ObjectTableDataRepository.Find(l.ctx, conn, req.ObjectId, &domain.ObjectTableDataQuery{ 118 _, list, err := l.svcCtx.ObjectTableDataRepository.Find(l.ctx, conn, req.ObjectId, &domain.ObjectTableDataQuery{
108 Conditions: conditions, 119 Conditions: conditions,
  120 + Group: field,
  121 + Select: field,
109 }) 122 })
110 if err != nil { 123 if err != nil {
111 return nil, xerr.NewErrMsg("查询表数据失败") 124 return nil, xerr.NewErrMsg("查询表数据失败")
@@ -116,8 +129,12 @@ func (l *SearchTableFieldOptionalValuesLogic) getLocal(req *types.SearchTableFie @@ -116,8 +129,12 @@ func (l *SearchTableFieldOptionalValuesLogic) getLocal(req *types.SearchTableFie
116 } 129 }
117 if len(list) > 0 { 130 if len(list) > 0 {
118 lo.ForEach(list, func(item map[string]interface{}, index int) { 131 lo.ForEach(list, func(item map[string]interface{}, index int) {
119 - 132 + if _, ok := item[field]; ok {
  133 + resp.Values = append(resp.Values, fmt.Sprintf("%v", item[field]))
  134 + }
120 }) 135 })
  136 + resp.Values = lo.Uniq(resp.Values)
  137 + resp.Total = int64(len(resp.Values))
121 } 138 }
122 return resp, nil 139 return resp, nil
123 } 140 }
@@ -242,6 +242,11 @@ type SearchTableDataRequest struct { @@ -242,6 +242,11 @@ type SearchTableDataRequest struct {
242 type SearchTableDataResponse struct { 242 type SearchTableDataResponse struct {
243 } 243 }
244 244
  245 +type SyncTableDataPusher struct {
  246 + CompanyId int64 `json:"companyId,string"` //公司ID
  247 + ObjectId int `json:"objectId"`
  248 +}
  249 +
245 type AppPageGetRequest struct { 250 type AppPageGetRequest struct {
246 Id int64 `path:"id"` 251 Id int64 `path:"id"`
247 } 252 }
@@ -140,6 +140,16 @@ func (repository *ChartSettingRepository) Find(ctx context.Context, conn transac @@ -140,6 +140,16 @@ func (repository *ChartSettingRepository) Find(ctx context.Context, conn transac
140 return total, dms, nil 140 return total, dms, nil
141 } 141 }
142 142
  143 +// CheckUseDataSource 检验是否使用数据源
  144 +func (repository *ChartSettingRepository) CheckUseDataSource(ctx context.Context, conn transaction.Conn, objectId int) (bool, error) {
  145 + var count int64
  146 + err := conn.DB().Model(&models.ChartSetting{}).Where("data_source_ids::jsonb @>'[?]'", objectId).Count(&count).Error
  147 + if err != nil {
  148 + return false, err
  149 + }
  150 + return count > 0, nil
  151 +}
  152 +
143 func (repository *ChartSettingRepository) ModelToDomainModel(from *models.ChartSetting) (*domain.ChartSetting, error) { 153 func (repository *ChartSettingRepository) ModelToDomainModel(from *models.ChartSetting) (*domain.ChartSetting, error) {
144 to := &domain.ChartSetting{} 154 to := &domain.ChartSetting{}
145 err := copier.Copy(to, from) 155 err := copier.Copy(to, from)
@@ -76,7 +76,12 @@ func (repository *ObjectTableDataRepository) DropTable(ctx context.Context, conn @@ -76,7 +76,12 @@ func (repository *ObjectTableDataRepository) DropTable(ctx context.Context, conn
76 if err != nil { 76 if err != nil {
77 return err 77 return err
78 } 78 }
79 - return conn.DB().Exec(sql).Error 79 + err = conn.DB().Exec(sql).Error
  80 + if err != nil {
  81 + return err
  82 + }
  83 + //设置数据表本地存储为false
  84 + return conn.DB().Exec("update object_table set is_local=false where table_id = ? and is_del=0", tableId).Error
80 } 85 }
81 86
82 // InsertWithTableData 写入表数据 87 // InsertWithTableData 写入表数据
@@ -139,6 +144,12 @@ func (repository *ObjectTableDataRepository) Find(ctx context.Context, conn tran @@ -139,6 +144,12 @@ func (repository *ObjectTableDataRepository) Find(ctx context.Context, conn tran
139 } 144 }
140 } 145 }
141 } 146 }
  147 + if query.Group != "" {
  148 + tx = tx.Group(query.Group)
  149 + }
  150 + if query.Select != "" {
  151 + tx = tx.Select(query.Select)
  152 + }
142 list := make([]map[string]interface{}, 0) 153 list := make([]map[string]interface{}, 0)
143 options := domain.NewQueryOptions() 154 options := domain.NewQueryOptions()
144 if query.Size > 0 { 155 if query.Size > 0 {
@@ -148,6 +159,11 @@ func (repository *ObjectTableDataRepository) Find(ctx context.Context, conn tran @@ -148,6 +159,11 @@ func (repository *ObjectTableDataRepository) Find(ctx context.Context, conn tran
148 return total, list, tx.Error 159 return total, list, tx.Error
149 } 160 }
150 161
  162 +// SyncData 同步表数据
  163 +//func (repository *ObjectTableDataRepository) SyncData(ctx context.Context, conn transaction.Conn, companyId int64, tableId int) error {
  164 +//
  165 +//}
  166 +
151 func NewObjectTableDataRepository() domain.ObjectTableDataRepository { 167 func NewObjectTableDataRepository() domain.ObjectTableDataRepository {
152 return &ObjectTableDataRepository{} 168 return &ObjectTableDataRepository{}
153 } 169 }
@@ -28,6 +28,7 @@ type ChartProperty struct { @@ -28,6 +28,7 @@ type ChartProperty struct {
28 } 28 }
29 type Other struct { 29 type Other struct {
30 Quarter *Quarter `json:"quarter,optional,omitempty"` // 四分图 30 Quarter *Quarter `json:"quarter,optional,omitempty"` // 四分图
  31 + Divider *Divider `json:"divider,optional,omitempty"` // 分割线
31 } 32 }
32 type Quarter struct { 33 type Quarter struct {
33 XAxisLabel string `json:"xAxisLabel"` // x轴标签名 34 XAxisLabel string `json:"xAxisLabel"` // x轴标签名
@@ -41,6 +42,12 @@ type Quarter struct { @@ -41,6 +42,12 @@ type Quarter struct {
41 SeriesList []QuarterSeries `json:"seriesList"` // 图形系列 42 SeriesList []QuarterSeries `json:"seriesList"` // 图形系列
42 } 43 }
43 44
  45 +type Divider struct {
  46 + SelectedIdx string `json:"selectedIdx,optional,omitempty"` // 选择的分割线样式
  47 + TextSwitch bool `json:"textSwitch,optional,omitempty"` // 是否展示组件文本
  48 + Text string `json:"text"` // 组件文本内容
  49 +}
  50 +
44 type QuarterSeries struct { 51 type QuarterSeries struct {
45 SeriesValue string `json:"seriesValue"` 52 SeriesValue string `json:"seriesValue"`
46 } 53 }
@@ -30,6 +30,7 @@ type ChartSettingRepository interface { @@ -30,6 +30,7 @@ type ChartSettingRepository interface {
30 Delete(ctx context.Context, conn transaction.Conn, dm *ChartSetting) (*ChartSetting, error) 30 Delete(ctx context.Context, conn transaction.Conn, dm *ChartSetting) (*ChartSetting, error)
31 FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ChartSetting, error) 31 FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ChartSetting, error)
32 Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ChartSetting, error) 32 Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ChartSetting, error)
  33 + CheckUseDataSource(ctx context.Context, conn transaction.Conn, objectId int) (bool, error)
33 } 34 }
34 35
35 func (m *ChartSetting) Identify() interface{} { 36 func (m *ChartSetting) Identify() interface{} {
@@ -38,6 +38,8 @@ type ObjectTableDataQuery struct { @@ -38,6 +38,8 @@ type ObjectTableDataQuery struct {
38 Page int 38 Page int
39 Size int 39 Size int
40 Conditions []*TableDataCondition 40 Conditions []*TableDataCondition
  41 + Group string
  42 + Select string
41 } 43 }
42 44
43 type TableDataCondition struct { 45 type TableDataCondition struct {
@@ -50,6 +52,7 @@ type TableDataCondition struct { @@ -50,6 +52,7 @@ type TableDataCondition struct {
50 type ObjectTableDataRepository interface { 52 type ObjectTableDataRepository interface {
51 InsertWithTableData(ctx context.Context, conn transaction.Conn, tableDataPreview bytelib.TableData) error 53 InsertWithTableData(ctx context.Context, conn transaction.Conn, tableDataPreview bytelib.TableData) error
52 Find(ctx context.Context, conn transaction.Conn, tableId int, query *ObjectTableDataQuery) (int64, []map[string]interface{}, error) 54 Find(ctx context.Context, conn transaction.Conn, tableId int, query *ObjectTableDataQuery) (int64, []map[string]interface{}, error)
  55 + DropTable(ctx context.Context, conn transaction.Conn, tableId int) error
53 } 56 }
54 57
55 func (m *ObjectTable) Identify() interface{} { 58 func (m *ObjectTable) Identify() interface{} {
@@ -96,4 +96,9 @@ type ( @@ -96,4 +96,9 @@ type (
96 } 96 }
97 SearchTableDataResponse { 97 SearchTableDataResponse {
98 } 98 }
  99 +
  100 + SyncTableDataPusher {
  101 + CompanyId int64 `json:"companyId,string"` //公司ID
  102 + ObjectId int `json:"objectId"`
  103 + }
99 ) 104 )