正在显示
45 个修改的文件
包含
2369 行增加
和
60 行删除
cmd/chart-server/api/.gitignore
0 → 100644
| 1 | +go_build_bchart |
| @@ -2,17 +2,18 @@ package main | @@ -2,17 +2,18 @@ package main | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "flag" | 4 | "flag" |
| 5 | + "github.com/golang-jwt/jwt/v4/request" | ||
| 6 | + "github.com/zeromicro/go-queue/kq" | ||
| 5 | "github.com/zeromicro/go-zero/core/logx" | 7 | "github.com/zeromicro/go-zero/core/logx" |
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/config" | ||
| 9 | + "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" | ||
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc" | ||
| 6 | "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/db" |
| 7 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain" | 13 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain" |
| 8 | "net/http" | 14 | "net/http" |
| 9 | "strings" | 15 | "strings" |
| 10 | - | ||
| 11 | - "github.com/golang-jwt/jwt/v4/request" | ||
| 12 | - | ||
| 13 | - "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/config" | ||
| 14 | - "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/handler" | ||
| 15 | - "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc" | 16 | + "time" |
| 16 | 17 | ||
| 17 | "github.com/zeromicro/go-zero/core/conf" | 18 | "github.com/zeromicro/go-zero/core/conf" |
| 18 | "github.com/zeromicro/go-zero/rest" | 19 | "github.com/zeromicro/go-zero/rest" |
| @@ -56,7 +57,60 @@ func main() { | @@ -56,7 +57,60 @@ func main() { | ||
| 56 | handler.RegisterHandlers(server, ctx) | 57 | handler.RegisterHandlers(server, ctx) |
| 57 | 58 | ||
| 58 | db.Migrate(ctx.DB) | 59 | db.Migrate(ctx.DB) |
| 60 | + //启动消费队列 | ||
| 61 | + startConsume(c) | ||
| 59 | 62 | ||
| 60 | logx.Infof("Starting server at %s:%d... \n", c.Host, c.Port) | 63 | logx.Infof("Starting server at %s:%d... \n", c.Host, c.Port) |
| 61 | server.Start() | 64 | server.Start() |
| 62 | } | 65 | } |
| 66 | + | ||
| 67 | +func startConsume(c config.Config) { | ||
| 68 | + //svcCtx := svc.NewServiceContext(c) | ||
| 69 | + go func() { | ||
| 70 | + //for { | ||
| 71 | + // notice := &domain.ObjectNotice{ | ||
| 72 | + // CompanyId: 1598224576532189184, | ||
| 73 | + // TableId: 521, | ||
| 74 | + // TableType: "主表", | ||
| 75 | + // ObjectType: "导入模块", | ||
| 76 | + // Event: "table.data.edit", | ||
| 77 | + // TableAffectedList: []int{521}, | ||
| 78 | + // DataChanged: true, | ||
| 79 | + // StructChanged: true, | ||
| 80 | + // MetaData: domain.ObjectNoticeMetaData{ | ||
| 81 | + // Module: 0, | ||
| 82 | + // Status: 0, | ||
| 83 | + // }, | ||
| 84 | + // } | ||
| 85 | + // mBytes, _ := json.Marshal(notice) | ||
| 86 | + // err := kq.NewPusher(c.KqConsumerConf.Brokers, c.KqConsumerConf.Topic).Push(string(mBytes)) | ||
| 87 | + // fmt.Println(err) | ||
| 88 | + // time.Sleep(10 * 10 * time.Second) | ||
| 89 | + //} | ||
| 90 | + }() | ||
| 91 | + //kafka消费队列 处理字库推送事件 | ||
| 92 | + go func() { | ||
| 93 | + svcCtx := svc.NewServiceContext(c) | ||
| 94 | + queue, err := kq.NewQueue(c.KqConsumerConf, consumer.NewByteNoticeLogic(svcCtx)) | ||
| 95 | + if err != nil { | ||
| 96 | + panic(err) | ||
| 97 | + } else { | ||
| 98 | + queue.Start() | ||
| 99 | + } | ||
| 100 | + }() | ||
| 101 | + //redis消费队列 处理表数据存储到本地 | ||
| 102 | + go func() { | ||
| 103 | + for { | ||
| 104 | + svcCtx := svc.NewServiceContext(c) | ||
| 105 | + str, err := svcCtx.Redis.Rpop(c.Name + ":table_data") | ||
| 106 | + if err == nil { | ||
| 107 | + _ = consumer.NewByteTableDataLogic(svcCtx).Sync(str) | ||
| 108 | + } | ||
| 109 | + time.Sleep(3 * time.Second) | ||
| 110 | + } | ||
| 111 | + }() | ||
| 112 | + //kq.MustNewQueue(c.KqConsumerConf, consumer.NewByteNoticeLogic(svcCtx)) | ||
| 113 | + //for { | ||
| 114 | + //time.Sleep(1 * time.Second) | ||
| 115 | + //} | ||
| 116 | +} |
| @@ -26,3 +26,10 @@ ByteMetadata: | @@ -26,3 +26,10 @@ ByteMetadata: | ||
| 26 | Name: ApiByteMetadata | 26 | Name: ApiByteMetadata |
| 27 | Host: http://character-library-metadata-bastion-test.fjmaimaimai.com | 27 | Host: http://character-library-metadata-bastion-test.fjmaimaimai.com |
| 28 | Timeout: 0s | 28 | Timeout: 0s |
| 29 | +KqConsumerConf: | ||
| 30 | + Name: KqConsumer | ||
| 31 | + Brokers: | ||
| 32 | + - 47.97.5.102:9092 | ||
| 33 | + Group: bchart_dev | ||
| 34 | + Topic: allied_creation_metadata_table_sync_notice | ||
| 35 | + Processors: 1 |
| @@ -29,3 +29,11 @@ ByteMetadata: | @@ -29,3 +29,11 @@ ByteMetadata: | ||
| 29 | Host1: http://127.0.0.1:8080 | 29 | Host1: http://127.0.0.1:8080 |
| 30 | Host: http://character-library-metadata-bastion-test.fjmaimaimai.com | 30 | Host: http://character-library-metadata-bastion-test.fjmaimaimai.com |
| 31 | Timeout: 0s | 31 | Timeout: 0s |
| 32 | + | ||
| 33 | +KqConsumerConf: | ||
| 34 | + Name: KqConsumer | ||
| 35 | + Brokers: | ||
| 36 | + - 47.97.5.102:9092 | ||
| 37 | + Group: bchart_dev | ||
| 38 | + Topic: allied_creation_metadata_table_sync_notice | ||
| 39 | + Processors: 1 |
| 1 | package config | 1 | package config |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | + "github.com/zeromicro/go-queue/kq" | ||
| 4 | "github.com/zeromicro/go-zero/core/stores/redis" | 5 | "github.com/zeromicro/go-zero/core/stores/redis" |
| 5 | "github.com/zeromicro/go-zero/rest" | 6 | "github.com/zeromicro/go-zero/rest" |
| 6 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/config" | 7 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/config" |
| @@ -13,6 +14,7 @@ type Config struct { | @@ -13,6 +14,7 @@ type Config struct { | ||
| 13 | Redis redis.RedisConf `json:",optional"` | 14 | Redis redis.RedisConf `json:",optional"` |
| 14 | ByteMetadata ApiService | 15 | ByteMetadata ApiService |
| 15 | HostName string // 服务域名 | 16 | HostName string // 服务域名 |
| 17 | + KqConsumerConf kq.KqConf | ||
| 16 | } | 18 | } |
| 17 | 19 | ||
| 18 | type ApiService struct { | 20 | type ApiService struct { |
| @@ -95,6 +95,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { | @@ -95,6 +95,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { | ||
| 95 | Path: "/table/data", | 95 | Path: "/table/data", |
| 96 | Handler: table.SearchTableDataHandler(serverCtx), | 96 | Handler: table.SearchTableDataHandler(serverCtx), |
| 97 | }, | 97 | }, |
| 98 | + { | ||
| 99 | + Method: http.MethodGet, | ||
| 100 | + Path: "/table/sync", | ||
| 101 | + Handler: table.SyncTableHandler(serverCtx), | ||
| 102 | + }, | ||
| 98 | }, | 103 | }, |
| 99 | rest.WithPrefix("/v1"), | 104 | rest.WithPrefix("/v1"), |
| 100 | ) | 105 | ) |
| 1 | +package table | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "net/http" | ||
| 5 | + | ||
| 6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
| 7 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/logic/table" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +func SyncTableHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
| 12 | + return func(w http.ResponseWriter, r *http.Request) { | ||
| 13 | + l := table.NewSyncTableLogic(r.Context(), svcCtx) | ||
| 14 | + resp, err := l.SyncTable() | ||
| 15 | + if err != nil { | ||
| 16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
| 17 | + } else { | ||
| 18 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
| 19 | + } | ||
| 20 | + } | ||
| 21 | +} |
| @@ -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) |
| 1 | +package consumer | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "context" | ||
| 5 | + "encoding/json" | ||
| 6 | + "fmt" | ||
| 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/domain" | ||
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/gateway/bytelib" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +type ByteNoticeLogic struct { | ||
| 15 | + ctx context.Context | ||
| 16 | + svcCtx *svc.ServiceContext | ||
| 17 | + conn transaction.Conn | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +func NewByteNoticeLogic(svcCtx *svc.ServiceContext) *ByteNoticeLogic { | ||
| 21 | + return &ByteNoticeLogic{ | ||
| 22 | + ctx: context.Background(), | ||
| 23 | + svcCtx: svcCtx, | ||
| 24 | + conn: svcCtx.DefaultDBConn(), | ||
| 25 | + } | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +func (logic *ByteNoticeLogic) Consume(key, value string) error { | ||
| 29 | + fmt.Println(key, value) | ||
| 30 | + notice := &domain.ObjectNotice{} | ||
| 31 | + err := json.Unmarshal([]byte(value), notice) | ||
| 32 | + if err != nil { | ||
| 33 | + return err | ||
| 34 | + } | ||
| 35 | + //保存推送消息 | ||
| 36 | + _, err = logic.svcCtx.ObjectNoticeRepository.Insert(logic.ctx, logic.conn, notice) | ||
| 37 | + if err != nil { | ||
| 38 | + return err | ||
| 39 | + } | ||
| 40 | + //处理消息 | ||
| 41 | + err = transaction.UseTrans(logic.ctx, logic.conn.DB(), func(ctx context.Context, conn transaction.Conn) error { | ||
| 42 | + return logic.handleNotice(conn, notice) | ||
| 43 | + }, true) | ||
| 44 | + //更新处理结果 | ||
| 45 | + if err != nil { | ||
| 46 | + notice.Status = domain.ObjectNoticeStatusError | ||
| 47 | + notice.Message = err.Error() | ||
| 48 | + } else { | ||
| 49 | + notice.Status = domain.ObjectNoticeStatusDone | ||
| 50 | + notice.Message = "OK" | ||
| 51 | + } | ||
| 52 | + _, _ = logic.svcCtx.ObjectNoticeRepository.Update(logic.ctx, logic.conn, notice) | ||
| 53 | + return err | ||
| 54 | +} | ||
| 55 | + | ||
| 56 | +// handleNotice 处理消息 | ||
| 57 | +func (logic *ByteNoticeLogic) handleNotice(conn transaction.Conn, notice *domain.ObjectNotice) error { | ||
| 58 | + //是否删除消息 | ||
| 59 | + if notice.IsDeletedEvent() { | ||
| 60 | + return logic.handleDelete(conn, notice) | ||
| 61 | + } | ||
| 62 | + accessToken, _ := types.TableAccessToken{CompanyId: notice.CompanyId}.GenerateToken() | ||
| 63 | + //结构变更 | ||
| 64 | + if notice.StructChanged { | ||
| 65 | + request := bytelib.ObjectTableSearchRequest{ | ||
| 66 | + Token: accessToken, | ||
| 67 | + Module: bytelib.ModuleDigitalCenter, | ||
| 68 | + } | ||
| 69 | + if notice.ObjectType == "导入模块" { | ||
| 70 | + request.TableTypes = []string{bytelib.MainTable, bytelib.SubTable, bytelib.SideTable} | ||
| 71 | + } | ||
| 72 | + if notice.ObjectType == "拆解模块" { | ||
| 73 | + request.TableTypes = []string{bytelib.SchemaTable} | ||
| 74 | + request.ReturnGroupItem = true | ||
| 75 | + } | ||
| 76 | + if notice.ObjectType == "计算模块" { | ||
| 77 | + request.TableTypes = []string{bytelib.CalculateItem, bytelib.CalculateSet} | ||
| 78 | + request.ReturnGroupItem = true | ||
| 79 | + request.ExcludeTables = []int{0} | ||
| 80 | + } | ||
| 81 | + list, err := logic.svcCtx.ByteMetadataService.ObjectTableSearch(logic.ctx, request) | ||
| 82 | + if err != nil { | ||
| 83 | + return err | ||
| 84 | + } | ||
| 85 | + tableInfo, err := logic.svcCtx.ByteMetadataService.TableInfo(logic.ctx, &bytelib.TableInfoRequest{ | ||
| 86 | + Token: accessToken, | ||
| 87 | + TableId: notice.TableId, | ||
| 88 | + }) | ||
| 89 | + if err != nil { | ||
| 90 | + return nil | ||
| 91 | + } | ||
| 92 | + if len(list.List) > 0 { | ||
| 93 | + objectTables := make([]*domain.ObjectTable, 0) | ||
| 94 | + for _, item := range list.List { | ||
| 95 | + if item.TableId == notice.TableId { | ||
| 96 | + objectTables = append(objectTables, &domain.ObjectTable{ | ||
| 97 | + Id: item.Id, | ||
| 98 | + TableId: item.TableId, | ||
| 99 | + Name: item.Name, | ||
| 100 | + TableType: item.TableType, | ||
| 101 | + CompanyId: notice.CompanyId, | ||
| 102 | + ParentId: item.ParentId, | ||
| 103 | + Flag: item.Flag, | ||
| 104 | + }) | ||
| 105 | + //父级节点 | ||
| 106 | + objectTables = append(objectTables, logic.getParents(notice.CompanyId, item.ParentId, list.List)...) | ||
| 107 | + } | ||
| 108 | + } | ||
| 109 | + err = logic.saveTables(conn, objectTables) | ||
| 110 | + if err != nil { | ||
| 111 | + return err | ||
| 112 | + } | ||
| 113 | + } | ||
| 114 | + //保存字段 | ||
| 115 | + _, err = logic.saveFields(conn, &domain.ObjectField{ | ||
| 116 | + Id: int64(tableInfo.TableId), | ||
| 117 | + Name: tableInfo.Name, | ||
| 118 | + Fields: tableInfo.Fields, | ||
| 119 | + }) | ||
| 120 | + if err != nil { | ||
| 121 | + return err | ||
| 122 | + } | ||
| 123 | + } | ||
| 124 | + //数据变更 | ||
| 125 | + if notice.DataChanged { | ||
| 126 | + data := &types.SyncTableDataPusher{ | ||
| 127 | + CompanyId: notice.CompanyId, | ||
| 128 | + ObjectId: notice.TableId, | ||
| 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 | ||
| 133 | + } | ||
| 134 | + return nil | ||
| 135 | +} | ||
| 136 | + | ||
| 137 | +func (logic *ByteNoticeLogic) getParents(companyId int64, parentId int, list []*bytelib.Table) []*domain.ObjectTable { | ||
| 138 | + result := make([]*domain.ObjectTable, 0) | ||
| 139 | + for _, item := range list { | ||
| 140 | + if item.Id == parentId { | ||
| 141 | + result = append(result, &domain.ObjectTable{ | ||
| 142 | + Id: item.Id, | ||
| 143 | + TableId: item.TableId, | ||
| 144 | + Name: item.Name, | ||
| 145 | + TableType: item.TableType, | ||
| 146 | + CompanyId: companyId, | ||
| 147 | + ParentId: item.ParentId, | ||
| 148 | + Flag: item.Flag, | ||
| 149 | + }) | ||
| 150 | + if item.ParentId > 0 { | ||
| 151 | + result = append(result, logic.getParents(companyId, item.ParentId, list)...) | ||
| 152 | + } | ||
| 153 | + } | ||
| 154 | + } | ||
| 155 | + return result | ||
| 156 | +} | ||
| 157 | + | ||
| 158 | +// handleDelete 删除 | ||
| 159 | +func (logic *ByteNoticeLogic) handleDelete(conn transaction.Conn, notice *domain.ObjectNotice) error { | ||
| 160 | + objectTable, err := logic.svcCtx.ObjectTableRepository.FindOneByTableId(logic.ctx, conn, notice.TableId) | ||
| 161 | + if err == nil && objectTable.Id > 0 { | ||
| 162 | + objectTable.RemoteDeleted = 1 | ||
| 163 | + _, err := logic.svcCtx.ObjectTableRepository.Update(logic.ctx, conn, objectTable) | ||
| 164 | + if err != nil { | ||
| 165 | + return err | ||
| 166 | + } | ||
| 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 | + } | ||
| 176 | + return nil | ||
| 177 | +} | ||
| 178 | + | ||
| 179 | +// saveTables 保存表结构 | ||
| 180 | +func (logic *ByteNoticeLogic) saveTables(conn transaction.Conn, tables []*domain.ObjectTable) error { | ||
| 181 | + if len(tables) > 0 { | ||
| 182 | + for _, item := range tables { | ||
| 183 | + objectTable, err := logic.svcCtx.ObjectTableRepository.FindOne(logic.ctx, conn, item.Id) | ||
| 184 | + if err == nil && objectTable.Id > 0 { | ||
| 185 | + item.Id = objectTable.Id | ||
| 186 | + item.Version = objectTable.Version + 1 | ||
| 187 | + _, err := logic.svcCtx.ObjectTableRepository.Update(logic.ctx, conn, item) | ||
| 188 | + if err != nil { | ||
| 189 | + return err | ||
| 190 | + } | ||
| 191 | + } else { | ||
| 192 | + _, err := logic.svcCtx.ObjectTableRepository.Insert(logic.ctx, conn, item) | ||
| 193 | + if err != nil { | ||
| 194 | + return err | ||
| 195 | + } | ||
| 196 | + } | ||
| 197 | + } | ||
| 198 | + } | ||
| 199 | + return nil | ||
| 200 | +} | ||
| 201 | + | ||
| 202 | +// saveFields 保存表字段 | ||
| 203 | +func (logic *ByteNoticeLogic) saveFields(conn transaction.Conn, objectField *domain.ObjectField) (*domain.ObjectField, error) { | ||
| 204 | + mField, err := logic.svcCtx.ObjectFieldRepository.FindOne(logic.ctx, conn, objectField.Id) | ||
| 205 | + if err == nil && mField.Id > 0 { //已存在 - 更新 | ||
| 206 | + objectField.Version = mField.Version + 1 | ||
| 207 | + return logic.svcCtx.ObjectFieldRepository.Update(logic.ctx, conn, objectField) | ||
| 208 | + } else { | ||
| 209 | + return logic.svcCtx.ObjectFieldRepository.Insert(logic.ctx, conn, objectField) | ||
| 210 | + } | ||
| 211 | +} |
| 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 | +} |
| @@ -26,6 +26,11 @@ func NewGetTableDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Ge | @@ -26,6 +26,11 @@ func NewGetTableDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Ge | ||
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | func (l *GetTableDetailLogic) GetTableDetail(req *types.GetTableDetailRequest) (resp interface{}, err error) { | 28 | func (l *GetTableDetailLogic) GetTableDetail(req *types.GetTableDetailRequest) (resp interface{}, err error) { |
| 29 | + //获取本地数据 | ||
| 30 | + local, err := l.GetLocal(req.TableId) | ||
| 31 | + if err == nil { | ||
| 32 | + return local, nil | ||
| 33 | + } | ||
| 29 | response, err := l.svcCtx.ByteMetadataService.TableInfo(l.ctx, &bytelib.TableInfoRequest{TableId: req.TableId, Token: req.Token}) | 34 | response, err := l.svcCtx.ByteMetadataService.TableInfo(l.ctx, &bytelib.TableInfoRequest{TableId: req.TableId, Token: req.Token}) |
| 30 | if err != nil { | 35 | if err != nil { |
| 31 | logx.Error(err) | 36 | logx.Error(err) |
| @@ -35,3 +40,25 @@ func (l *GetTableDetailLogic) GetTableDetail(req *types.GetTableDetailRequest) ( | @@ -35,3 +40,25 @@ func (l *GetTableDetailLogic) GetTableDetail(req *types.GetTableDetailRequest) ( | ||
| 35 | resp = response | 40 | resp = response |
| 36 | return | 41 | return |
| 37 | } | 42 | } |
| 43 | + | ||
| 44 | +func (l *GetTableDetailLogic) GetLocal(tableId int) (interface{}, error) { | ||
| 45 | + conn := l.svcCtx.DefaultDBConn() | ||
| 46 | + //查询表数据 | ||
| 47 | + objectTable, err := l.svcCtx.ObjectTableRepository.FindOneByTableId(l.ctx, conn, tableId) | ||
| 48 | + if err != nil || objectTable.Id <= 0 { | ||
| 49 | + return nil, xerr.NewErrMsg("表不存在") | ||
| 50 | + } | ||
| 51 | + //查询表字段 | ||
| 52 | + objectField, err := l.svcCtx.ObjectFieldRepository.FindOne(l.ctx, conn, int64(tableId)) | ||
| 53 | + if err != nil || objectField.Id <= 0 { | ||
| 54 | + return nil, xerr.NewErrMsg("表字段不存在") | ||
| 55 | + } | ||
| 56 | + resp := bytelib.TableInfoResponse{ | ||
| 57 | + TableId: objectTable.TableId, | ||
| 58 | + TableType: objectTable.TableType, | ||
| 59 | + Name: objectTable.Name, | ||
| 60 | + ParentId: objectTable.ParentId, | ||
| 61 | + Fields: removeIdField(objectField.Fields), | ||
| 62 | + } | ||
| 63 | + return resp, nil | ||
| 64 | +} |
| @@ -8,6 +8,7 @@ import ( | @@ -8,6 +8,7 @@ import ( | ||
| 8 | "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/svc" |
| 9 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types" | 9 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types" |
| 10 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/gateway/bytelib" | 10 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/gateway/bytelib" |
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/contextdata" | ||
| 11 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr" | 12 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr" |
| 12 | ) | 13 | ) |
| 13 | 14 | ||
| @@ -29,50 +30,86 @@ func (l *SearchTableByModuleLogic) SearchTableByModule(req *types.SearchTableByM | @@ -29,50 +30,86 @@ func (l *SearchTableByModuleLogic) SearchTableByModule(req *types.SearchTableByM | ||
| 29 | var result = make(map[string]interface{}) | 30 | var result = make(map[string]interface{}) |
| 30 | var batchError errorx.BatchError | 31 | var batchError errorx.BatchError |
| 31 | fx.Parallel(func() { | 32 | fx.Parallel(func() { |
| 32 | - list, err := l.svcCtx.ByteMetadataService.ObjectTableSearch(l.ctx, bytelib.ObjectTableSearchRequest{ | ||
| 33 | - Token: req.Token, | ||
| 34 | - TableTypes: []string{bytelib.MainTable, bytelib.SubTable, bytelib.SideTable}, | ||
| 35 | - Module: bytelib.ModuleChartTemplate, | ||
| 36 | - }) | 33 | + mResp, err := l.getTableByLocal([]string{bytelib.MainTable, bytelib.SubTable, bytelib.SideTable}) |
| 37 | if err != nil { | 34 | if err != nil { |
| 38 | batchError.Add(err) | 35 | batchError.Add(err) |
| 39 | } | 36 | } |
| 40 | - result["导入模块"] = newList(list) | 37 | + result["导入模块"] = mResp |
| 38 | + //if err == nil { | ||
| 39 | + // result["导入模块"] = mResp | ||
| 40 | + //} else { | ||
| 41 | + // list, err := l.svcCtx.ByteMetadataService.ObjectTableSearch(l.ctx, bytelib.ObjectTableSearchRequest{ | ||
| 42 | + // Token: req.Token, | ||
| 43 | + // TableTypes: []string{bytelib.MainTable, bytelib.SubTable, bytelib.SideTable}, | ||
| 44 | + // Module: bytelib.ModuleChartTemplate, // TODO:字库更新完改为只查 bytelib.ModuleChartTemplate | ||
| 45 | + // }) | ||
| 46 | + // if err != nil { | ||
| 47 | + // batchError.Add(err) | ||
| 48 | + // } | ||
| 49 | + // result["导入模块"] = newList(list) | ||
| 50 | + //} | ||
| 41 | }, func() { | 51 | }, func() { |
| 42 | - list, err := l.svcCtx.ByteMetadataService.ObjectTableSearch(l.ctx, bytelib.ObjectTableSearchRequest{ | ||
| 43 | - Token: req.Token, | ||
| 44 | - TableTypes: []string{bytelib.SchemaTable}, | ||
| 45 | - Module: bytelib.ModuleQuerySetCenter, | ||
| 46 | - ReturnGroupItem: true, | ||
| 47 | - }) | 52 | + mResp, err := l.getTableByLocal([]string{bytelib.SchemaTable}) |
| 48 | if err != nil { | 53 | if err != nil { |
| 49 | batchError.Add(err) | 54 | batchError.Add(err) |
| 50 | } | 55 | } |
| 51 | - result["拆解模块"] = newList(list) | 56 | + result["拆解模块"] = mResp |
| 57 | + //if err == nil { | ||
| 58 | + // result["拆解模块"] = mResp | ||
| 59 | + //} else { | ||
| 60 | + // list, err := l.svcCtx.ByteMetadataService.ObjectTableSearch(l.ctx, bytelib.ObjectTableSearchRequest{ | ||
| 61 | + // Token: req.Token, | ||
| 62 | + // TableTypes: []string{bytelib.SchemaTable}, | ||
| 63 | + // Module: bytelib.ModuleQuerySetCenter, | ||
| 64 | + // ReturnGroupItem: true, | ||
| 65 | + // }) | ||
| 66 | + // if err != nil { | ||
| 67 | + // batchError.Add(err) | ||
| 68 | + // } | ||
| 69 | + // result["拆解模块"] = newList(list) | ||
| 70 | + //} | ||
| 52 | }, func() { | 71 | }, func() { |
| 53 | - list, err := l.svcCtx.ByteMetadataService.ObjectTableSearch(l.ctx, bytelib.ObjectTableSearchRequest{ | ||
| 54 | - Token: req.Token, | ||
| 55 | - TableTypes: []string{bytelib.CalculateItem}, | ||
| 56 | - Module: bytelib.ModuleCalculateCenter, | ||
| 57 | - ReturnGroupItem: true, | ||
| 58 | - ExcludeTables: []int{0}, | ||
| 59 | - }) | 72 | + mResp, err := l.getTableByLocal([]string{bytelib.CalculateItem}) |
| 60 | if err != nil { | 73 | if err != nil { |
| 61 | batchError.Add(err) | 74 | batchError.Add(err) |
| 62 | } | 75 | } |
| 63 | - result["计算项"] = newList(list) | 76 | + result["计算项"] = mResp |
| 77 | + //if err == nil { | ||
| 78 | + // result["计算项"] = mResp | ||
| 79 | + //} else { | ||
| 80 | + // list, err := l.svcCtx.ByteMetadataService.ObjectTableSearch(l.ctx, bytelib.ObjectTableSearchRequest{ | ||
| 81 | + // Token: req.Token, | ||
| 82 | + // TableTypes: []string{bytelib.CalculateItem}, | ||
| 83 | + // Module: bytelib.ModuleCalculateCenter, | ||
| 84 | + // ReturnGroupItem: true, | ||
| 85 | + // ExcludeTables: []int{0}, | ||
| 86 | + // }) | ||
| 87 | + // if err != nil { | ||
| 88 | + // batchError.Add(err) | ||
| 89 | + // } | ||
| 90 | + // result["计算项"] = newList(list) | ||
| 91 | + //} | ||
| 64 | }, func() { | 92 | }, func() { |
| 65 | - list, err := l.svcCtx.ByteMetadataService.ObjectTableSearch(l.ctx, bytelib.ObjectTableSearchRequest{ | ||
| 66 | - Token: req.Token, | ||
| 67 | - TableTypes: []string{bytelib.CalculateSet}, | ||
| 68 | - Module: bytelib.ModuleCalculateCenter, | ||
| 69 | - ReturnGroupItem: true, | ||
| 70 | - ExcludeTables: []int{0}, | ||
| 71 | - }) | 93 | + mResp, err := l.getTableByLocal([]string{bytelib.CalculateSet}) |
| 72 | if err != nil { | 94 | if err != nil { |
| 73 | batchError.Add(err) | 95 | batchError.Add(err) |
| 74 | } | 96 | } |
| 75 | - result["计算集"] = newList(list) | 97 | + result["计算集"] = mResp |
| 98 | + //if err == nil { | ||
| 99 | + // result["计算集"] = mResp | ||
| 100 | + //} else { | ||
| 101 | + // list, err := l.svcCtx.ByteMetadataService.ObjectTableSearch(l.ctx, bytelib.ObjectTableSearchRequest{ | ||
| 102 | + // Token: req.Token, | ||
| 103 | + // TableTypes: []string{bytelib.CalculateSet}, | ||
| 104 | + // Module: bytelib.ModuleCalculateCenter, | ||
| 105 | + // ReturnGroupItem: true, | ||
| 106 | + // ExcludeTables: []int{0}, | ||
| 107 | + // }) | ||
| 108 | + // if err != nil { | ||
| 109 | + // batchError.Add(err) | ||
| 110 | + // } | ||
| 111 | + // result["计算集"] = newList(list) | ||
| 112 | + //} | ||
| 76 | }) | 113 | }) |
| 77 | if err = batchError.Err(); err != nil { | 114 | if err = batchError.Err(); err != nil { |
| 78 | logx.Error(err) | 115 | logx.Error(err) |
| @@ -88,3 +125,31 @@ func newList(r bytelib.ObjectTableSearchResponse) interface{} { | @@ -88,3 +125,31 @@ func newList(r bytelib.ObjectTableSearchResponse) interface{} { | ||
| 88 | "list": r.List, | 125 | "list": r.List, |
| 89 | } | 126 | } |
| 90 | } | 127 | } |
| 128 | + | ||
| 129 | +func (l *SearchTableByModuleLogic) getTableByLocal(modules []string) (types.SearchTableByModuleResponse, error) { | ||
| 130 | + tenantId := contextdata.GetTenantFromCtx(l.ctx) | ||
| 131 | + response := types.SearchTableByModuleResponse{ | ||
| 132 | + Count: 0, | ||
| 133 | + List: make([]types.SearchTableByModuleItem, 0), | ||
| 134 | + } | ||
| 135 | + total, list, err := l.svcCtx.ObjectTableRepository.Find(l.ctx, l.svcCtx.DefaultDBConn(), map[string]interface{}{ | ||
| 136 | + "companyId": tenantId, | ||
| 137 | + "tableTypeIn": modules, | ||
| 138 | + }) | ||
| 139 | + if err != nil { | ||
| 140 | + return response, err | ||
| 141 | + } | ||
| 142 | + response.Count = int(total) | ||
| 143 | + for _, item := range list { | ||
| 144 | + response.List = append(response.List, types.SearchTableByModuleItem{ | ||
| 145 | + Id: item.Id, | ||
| 146 | + TableId: item.TableId, | ||
| 147 | + TableType: item.TableType, | ||
| 148 | + Name: item.Name, | ||
| 149 | + ParentId: item.ParentId, | ||
| 150 | + Flag: item.Flag, | ||
| 151 | + IsLocal: item.IsLocal, | ||
| 152 | + }) | ||
| 153 | + } | ||
| 154 | + return response, nil | ||
| 155 | +} |
| @@ -2,9 +2,11 @@ package table | @@ -2,9 +2,11 @@ package table | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "context" | 4 | "context" |
| 5 | + "github.com/jinzhu/copier" | ||
| 5 | "github.com/zeromicro/go-zero/core/logx" | 6 | "github.com/zeromicro/go-zero/core/logx" |
| 6 | "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" |
| 7 | "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" |
| 9 | + "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" | 10 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/gateway/bytelib" |
| 9 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr" | 11 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr" |
| 10 | "sort" | 12 | "sort" |
| @@ -33,9 +35,68 @@ func (l *SearchTableDataLogic) SearchTableData(req *types.SearchTableDataRequest | @@ -33,9 +35,68 @@ func (l *SearchTableDataLogic) SearchTableData(req *types.SearchTableDataRequest | ||
| 33 | "fields": nil, | 35 | "fields": nil, |
| 34 | "total": 0, | 36 | "total": 0, |
| 35 | "data": make([]string, 0), | 37 | "data": make([]string, 0), |
| 38 | + "local": false, | ||
| 36 | } | 39 | } |
| 37 | return | 40 | return |
| 38 | } | 41 | } |
| 42 | + resp, err = l.getLocal(req) | ||
| 43 | + if err == nil { | ||
| 44 | + return resp, nil | ||
| 45 | + } | ||
| 46 | + return l.getRemote(req) | ||
| 47 | +} | ||
| 48 | + | ||
| 49 | +// getLocal 获取本地数据 | ||
| 50 | +func (l *SearchTableDataLogic) getLocal(req *types.SearchTableDataRequest) (interface{}, error) { | ||
| 51 | + conn := l.svcCtx.DefaultDBConn() | ||
| 52 | + conditions := make([]*domain.TableDataCondition, 0) | ||
| 53 | + _ = copier.Copy(&conditions, req.Condition) | ||
| 54 | + //查询表数据 | ||
| 55 | + objectTable, err := l.svcCtx.ObjectTableRepository.FindOneByTableId(l.ctx, conn, req.ObjectId) | ||
| 56 | + if err != nil || objectTable.Id <= 0 { | ||
| 57 | + return nil, xerr.NewErrMsg("表不存在") | ||
| 58 | + } | ||
| 59 | + if !objectTable.IsLocal { | ||
| 60 | + return nil, xerr.NewErrMsg("未保存到本地存储") | ||
| 61 | + } | ||
| 62 | + //查询表字段 | ||
| 63 | + objectField, err := l.svcCtx.ObjectFieldRepository.FindOne(l.ctx, conn, int64(req.ObjectId)) | ||
| 64 | + if err != nil || objectField.Id <= 0 { | ||
| 65 | + return nil, xerr.NewErrMsg("表字段不存在") | ||
| 66 | + } | ||
| 67 | + //替换中文字段 | ||
| 68 | + for _, item := range conditions { | ||
| 69 | + replace := false | ||
| 70 | + for _, field := range objectField.Fields { | ||
| 71 | + if field.Name == item.FieldName { | ||
| 72 | + item.FieldName = field.SQLName | ||
| 73 | + replace = true | ||
| 74 | + } | ||
| 75 | + } | ||
| 76 | + if !replace { | ||
| 77 | + return nil, xerr.NewErrMsg("字段" + item.FieldName + "不存在") | ||
| 78 | + } | ||
| 79 | + } | ||
| 80 | + //表数据 | ||
| 81 | + total, list, err := l.svcCtx.ObjectTableDataRepository.Find(l.ctx, conn, req.ObjectId, &domain.ObjectTableDataQuery{ | ||
| 82 | + Page: req.PageNumber, | ||
| 83 | + Size: req.PageSize, | ||
| 84 | + Conditions: conditions, | ||
| 85 | + }) | ||
| 86 | + if err != nil { | ||
| 87 | + return nil, xerr.NewErrMsg("查询表数据失败") | ||
| 88 | + } | ||
| 89 | + return map[string]interface{}{ | ||
| 90 | + "objectId": req.ObjectId, | ||
| 91 | + "fields": removeIdField(objectField.Fields), | ||
| 92 | + "total": total, | ||
| 93 | + "data": list, | ||
| 94 | + "local": true, | ||
| 95 | + }, nil | ||
| 96 | +} | ||
| 97 | + | ||
| 98 | +// getRemote 获取远程字库数据 | ||
| 99 | +func (l *SearchTableDataLogic) getRemote(req *types.SearchTableDataRequest) (resp interface{}, err error) { | ||
| 39 | tableDataPreviewRequest := &bytelib.TableDataPreviewRequest{ | 100 | tableDataPreviewRequest := &bytelib.TableDataPreviewRequest{ |
| 40 | Token: req.Token, | 101 | Token: req.Token, |
| 41 | ObjectType: bytelib.ObjectMetaTable, | 102 | ObjectType: bytelib.ObjectMetaTable, |
| @@ -95,6 +156,7 @@ func (l *SearchTableDataLogic) SearchTableData(req *types.SearchTableDataRequest | @@ -95,6 +156,7 @@ func (l *SearchTableDataLogic) SearchTableData(req *types.SearchTableDataRequest | ||
| 95 | "fields": removeIdField(response.Fields), | 156 | "fields": removeIdField(response.Fields), |
| 96 | "total": response.Grid.Total, | 157 | "total": response.Grid.Total, |
| 97 | "data": response.Grid.List, | 158 | "data": response.Grid.List, |
| 159 | + "local": false, | ||
| 98 | } | 160 | } |
| 99 | return | 161 | return |
| 100 | } | 162 | } |
| @@ -2,13 +2,15 @@ package table | @@ -2,13 +2,15 @@ package table | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "context" | 4 | "context" |
| 5 | - "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/gateway/bytelib" | ||
| 6 | - "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr" | ||
| 7 | - | 5 | + "fmt" |
| 6 | + "github.com/jinzhu/copier" | ||
| 7 | + "github.com/samber/lo" | ||
| 8 | + "github.com/zeromicro/go-zero/core/logx" | ||
| 8 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc" | 9 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc" |
| 9 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types" | 10 | "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types" |
| 10 | - | ||
| 11 | - "github.com/zeromicro/go-zero/core/logx" | 11 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain" |
| 12 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/gateway/bytelib" | ||
| 13 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr" | ||
| 12 | ) | 14 | ) |
| 13 | 15 | ||
| 14 | type SearchTableFieldOptionalValuesLogic struct { | 16 | type SearchTableFieldOptionalValuesLogic struct { |
| @@ -26,6 +28,12 @@ func NewSearchTableFieldOptionalValuesLogic(ctx context.Context, svcCtx *svc.Ser | @@ -26,6 +28,12 @@ func NewSearchTableFieldOptionalValuesLogic(ctx context.Context, svcCtx *svc.Ser | ||
| 26 | } | 28 | } |
| 27 | 29 | ||
| 28 | 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 | + //获取远程数据 | ||
| 29 | fieldOptionalValuesRequest := &bytelib.TableFieldOptionalValuesRequest{ | 37 | fieldOptionalValuesRequest := &bytelib.TableFieldOptionalValuesRequest{ |
| 30 | Token: req.Token, | 38 | Token: req.Token, |
| 31 | ObjectType: bytelib.ObjectMetaTable, | 39 | ObjectType: bytelib.ObjectMetaTable, |
| @@ -71,3 +79,64 @@ func newWhere(conditions []*types.Condition) *bytelib.TableQueryWhere { | @@ -71,3 +79,64 @@ func newWhere(conditions []*types.Condition) *bytelib.TableQueryWhere { | ||
| 71 | } | 79 | } |
| 72 | return where | 80 | return where |
| 73 | } | 81 | } |
| 82 | + | ||
| 83 | +func (l *SearchTableFieldOptionalValuesLogic) getLocal(req *types.SearchTableFieldOptionalValuesRequest) (resp *types.SearchTableFieldOptionalValuesResponse, err error) { | ||
| 84 | + conn := l.svcCtx.DefaultDBConn() | ||
| 85 | + //查询表数据 | ||
| 86 | + objectTable, err := l.svcCtx.ObjectTableRepository.FindOneByTableId(l.ctx, conn, req.ObjectId) | ||
| 87 | + if err != nil || objectTable.Id <= 0 { | ||
| 88 | + return nil, xerr.NewErrMsg("表不存在") | ||
| 89 | + } | ||
| 90 | + if !objectTable.IsLocal { | ||
| 91 | + return nil, xerr.NewErrMsg("未保存到本地存储") | ||
| 92 | + } | ||
| 93 | + //查询表字段 | ||
| 94 | + objectField, err := l.svcCtx.ObjectFieldRepository.FindOne(l.ctx, conn, int64(req.ObjectId)) | ||
| 95 | + if err != nil || objectField.Id <= 0 { | ||
| 96 | + return nil, xerr.NewErrMsg("表字段不存在") | ||
| 97 | + } | ||
| 98 | + conditions := make([]*domain.TableDataCondition, 0) | ||
| 99 | + _ = copier.Copy(&conditions, req.Condition) | ||
| 100 | + //替换中文字段 | ||
| 101 | + for _, item := range conditions { | ||
| 102 | + replace := false | ||
| 103 | + for _, field := range objectField.Fields { | ||
| 104 | + if field.Name == item.FieldName { | ||
| 105 | + item.FieldName = field.SQLName | ||
| 106 | + replace = true | ||
| 107 | + } | ||
| 108 | + } | ||
| 109 | + if !replace { | ||
| 110 | + return nil, xerr.NewErrMsg("字段" + item.FieldName + "不存在") | ||
| 111 | + } | ||
| 112 | + } | ||
| 113 | + field := req.Field | ||
| 114 | + for _, item := range objectField.Fields { | ||
| 115 | + if req.Field == item.Name { | ||
| 116 | + field = item.SQLName | ||
| 117 | + } | ||
| 118 | + } | ||
| 119 | + //表数据 | ||
| 120 | + _, list, err := l.svcCtx.ObjectTableDataRepository.Find(l.ctx, conn, req.ObjectId, &domain.ObjectTableDataQuery{ | ||
| 121 | + Conditions: conditions, | ||
| 122 | + Group: field, | ||
| 123 | + Select: field, | ||
| 124 | + }) | ||
| 125 | + if err != nil { | ||
| 126 | + return nil, xerr.NewErrMsg("查询表数据失败") | ||
| 127 | + } | ||
| 128 | + resp = &types.SearchTableFieldOptionalValuesResponse{ | ||
| 129 | + Values: make([]string, 0), | ||
| 130 | + Total: 0, | ||
| 131 | + } | ||
| 132 | + if len(list) > 0 { | ||
| 133 | + lo.ForEach(list, func(item map[string]interface{}, index int) { | ||
| 134 | + if _, ok := item[field]; ok { | ||
| 135 | + resp.Values = append(resp.Values, fmt.Sprintf("%v", item[field])) | ||
| 136 | + } | ||
| 137 | + }) | ||
| 138 | + resp.Values = lo.Uniq(resp.Values) | ||
| 139 | + resp.Total = int64(len(resp.Values)) | ||
| 140 | + } | ||
| 141 | + return resp, nil | ||
| 142 | +} |
| 1 | +package table | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "context" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types" | ||
| 6 | + "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/domain" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/gateway/bytelib" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr" | ||
| 10 | + | ||
| 11 | + "github.com/zeromicro/go-zero/core/logx" | ||
| 12 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc" | ||
| 13 | +) | ||
| 14 | + | ||
| 15 | +type SyncTableLogic struct { | ||
| 16 | + logx.Logger | ||
| 17 | + ctx context.Context | ||
| 18 | + svcCtx *svc.ServiceContext | ||
| 19 | + conn transaction.Conn | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +func NewSyncTableLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SyncTableLogic { | ||
| 23 | + return &SyncTableLogic{ | ||
| 24 | + Logger: logx.WithContext(ctx), | ||
| 25 | + ctx: ctx, | ||
| 26 | + svcCtx: svcCtx, | ||
| 27 | + conn: svcCtx.DefaultDBConn(), | ||
| 28 | + } | ||
| 29 | +} | ||
| 30 | + | ||
| 31 | +func (l *SyncTableLogic) SyncTable() (resp interface{}, err error) { | ||
| 32 | + companyIds, err := l.svcCtx.ChartRepository.FindCompanyIds(l.ctx, l.conn) | ||
| 33 | + if err != nil { | ||
| 34 | + return nil, xerr.NewErrMsg("查询公司ID失败:" + err.Error()) | ||
| 35 | + } | ||
| 36 | + tables := make([]*domain.ObjectTable, 0) | ||
| 37 | + for _, companyId := range companyIds { | ||
| 38 | + accessToken, _ := types.TableAccessToken{CompanyId: companyId}.GenerateToken() | ||
| 39 | + //获取导入模块 | ||
| 40 | + response, err := l.svcCtx.ByteMetadataService.ObjectTableSearch(l.ctx, bytelib.ObjectTableSearchRequest{ | ||
| 41 | + Token: accessToken, | ||
| 42 | + TableTypes: []string{bytelib.MainTable, bytelib.SubTable, bytelib.SideTable}, | ||
| 43 | + Module: bytelib.ModuleChartTemplate, | ||
| 44 | + }) | ||
| 45 | + if err == nil { | ||
| 46 | + tables = append(tables, l.getTables(companyId, response)...) | ||
| 47 | + } | ||
| 48 | + //拆解模块 | ||
| 49 | + response, err = l.svcCtx.ByteMetadataService.ObjectTableSearch(l.ctx, bytelib.ObjectTableSearchRequest{ | ||
| 50 | + Token: accessToken, | ||
| 51 | + TableTypes: []string{bytelib.SchemaTable}, | ||
| 52 | + Module: bytelib.ModuleQuerySetCenter, | ||
| 53 | + ReturnGroupItem: true, | ||
| 54 | + }) | ||
| 55 | + if err == nil { | ||
| 56 | + tables = append(tables, l.getTables(companyId, response)...) | ||
| 57 | + } | ||
| 58 | + //计算项 计算集 | ||
| 59 | + response, err = l.svcCtx.ByteMetadataService.ObjectTableSearch(l.ctx, bytelib.ObjectTableSearchRequest{ | ||
| 60 | + Token: accessToken, | ||
| 61 | + TableTypes: []string{bytelib.CalculateItem, bytelib.CalculateSet}, | ||
| 62 | + Module: bytelib.ModuleCalculateCenter, | ||
| 63 | + ReturnGroupItem: true, | ||
| 64 | + ExcludeTables: []int{0}, | ||
| 65 | + }) | ||
| 66 | + if err == nil { | ||
| 67 | + tables = append(tables, l.getTables(companyId, response)...) | ||
| 68 | + } | ||
| 69 | + } | ||
| 70 | + //获取字段信息 | ||
| 71 | + fields := l.getFields(tables) | ||
| 72 | + //保存数据 | ||
| 73 | + err = transaction.UseTrans(l.ctx, l.conn.DB(), func(ctx context.Context, conn transaction.Conn) error { | ||
| 74 | + err = l.SaveTables(conn, tables) | ||
| 75 | + if err != nil { | ||
| 76 | + return err | ||
| 77 | + } | ||
| 78 | + err = l.SaveFields(conn, fields) | ||
| 79 | + if err != nil { | ||
| 80 | + return err | ||
| 81 | + } | ||
| 82 | + return nil | ||
| 83 | + }, true) | ||
| 84 | + return companyIds, err | ||
| 85 | +} | ||
| 86 | + | ||
| 87 | +func (l *SyncTableLogic) getTables(companyId int64, response bytelib.ObjectTableSearchResponse) []*domain.ObjectTable { | ||
| 88 | + tables := make([]*domain.ObjectTable, 0) | ||
| 89 | + if len(response.List) > 0 { | ||
| 90 | + for _, item := range response.List { | ||
| 91 | + tables = append(tables, &domain.ObjectTable{ | ||
| 92 | + Id: item.Id, | ||
| 93 | + TableId: item.TableId, | ||
| 94 | + Name: item.Name, | ||
| 95 | + TableType: item.TableType, | ||
| 96 | + CompanyId: companyId, | ||
| 97 | + ParentId: item.ParentId, | ||
| 98 | + Flag: item.Flag, | ||
| 99 | + Version: 1, | ||
| 100 | + IsLocal: false, | ||
| 101 | + RemoteDeleted: 0, | ||
| 102 | + }) | ||
| 103 | + } | ||
| 104 | + } | ||
| 105 | + return tables | ||
| 106 | +} | ||
| 107 | + | ||
| 108 | +func (l *SyncTableLogic) getFields(list []*domain.ObjectTable) []*domain.ObjectField { | ||
| 109 | + fields := make([]*domain.ObjectField, 0) | ||
| 110 | + for _, item := range list { | ||
| 111 | + accessToken, _ := types.TableAccessToken{CompanyId: item.CompanyId}.GenerateToken() | ||
| 112 | + if item.TableId > 0 { | ||
| 113 | + response, err := l.svcCtx.ByteMetadataService.TableInfo(l.ctx, &bytelib.TableInfoRequest{ | ||
| 114 | + Token: accessToken, | ||
| 115 | + TableId: item.TableId, | ||
| 116 | + }) | ||
| 117 | + if err == nil { | ||
| 118 | + fields = append(fields, &domain.ObjectField{ | ||
| 119 | + Id: int64(item.TableId), | ||
| 120 | + Name: response.Name, | ||
| 121 | + Fields: response.Fields, | ||
| 122 | + Version: 1, | ||
| 123 | + }) | ||
| 124 | + } | ||
| 125 | + } | ||
| 126 | + } | ||
| 127 | + return fields | ||
| 128 | +} | ||
| 129 | + | ||
| 130 | +// SaveTables 保存数据 | ||
| 131 | +func (l *SyncTableLogic) SaveTables(conn transaction.Conn, list []*domain.ObjectTable) error { | ||
| 132 | + for _, item := range list { | ||
| 133 | + objectTable, err := l.svcCtx.ObjectTableRepository.FindOne(l.ctx, conn, item.Id) | ||
| 134 | + if err == nil && objectTable.Id > 0 { | ||
| 135 | + item.IsLocal = objectTable.IsLocal | ||
| 136 | + item.Version = objectTable.Version + 1 | ||
| 137 | + } | ||
| 138 | + _, err = l.svcCtx.ObjectTableRepository.Insert(l.ctx, conn, item) | ||
| 139 | + if err != nil { | ||
| 140 | + return err | ||
| 141 | + } | ||
| 142 | + } | ||
| 143 | + return nil | ||
| 144 | +} | ||
| 145 | + | ||
| 146 | +func (l *SyncTableLogic) SaveFields(conn transaction.Conn, list []*domain.ObjectField) error { | ||
| 147 | + for _, item := range list { | ||
| 148 | + objectTable, err := l.svcCtx.ObjectFieldRepository.FindOne(l.ctx, conn, item.Id) | ||
| 149 | + if err == nil && objectTable.Id > 0 { | ||
| 150 | + item.Version = objectTable.Version + 1 | ||
| 151 | + } | ||
| 152 | + _, err = l.svcCtx.ObjectFieldRepository.Insert(l.ctx, conn, item) | ||
| 153 | + if err != nil { | ||
| 154 | + return err | ||
| 155 | + } | ||
| 156 | + } | ||
| 157 | + return nil | ||
| 158 | +} |
| @@ -22,6 +22,10 @@ type ServiceContext struct { | @@ -22,6 +22,10 @@ type ServiceContext struct { | ||
| 22 | ChartRepository domain.ChartRepository | 22 | ChartRepository domain.ChartRepository |
| 23 | ChartSettingRepository domain.ChartSettingRepository | 23 | ChartSettingRepository domain.ChartSettingRepository |
| 24 | AppPageRepository domain.AppPageRepository | 24 | AppPageRepository domain.AppPageRepository |
| 25 | + ObjectNoticeRepository domain.ObjectNoticeRepository | ||
| 26 | + ObjectTableRepository domain.ObjectTableRepository | ||
| 27 | + ObjectFieldRepository domain.ObjectFieldRepository | ||
| 28 | + ObjectTableDataRepository domain.ObjectTableDataRepository | ||
| 25 | 29 | ||
| 26 | ByteMetadataService bytelib.ByteMetadataService | 30 | ByteMetadataService bytelib.ByteMetadataService |
| 27 | } | 31 | } |
| @@ -40,6 +44,10 @@ func NewServiceContext(c config.Config) *ServiceContext { | @@ -40,6 +44,10 @@ func NewServiceContext(c config.Config) *ServiceContext { | ||
| 40 | ChartRepository: repository.NewChartRepository(cache.NewCachedRepository(mlCache)), | 44 | ChartRepository: repository.NewChartRepository(cache.NewCachedRepository(mlCache)), |
| 41 | ChartSettingRepository: repository.NewChartSettingRepository(cache.NewCachedRepository(mlCache)), | 45 | ChartSettingRepository: repository.NewChartSettingRepository(cache.NewCachedRepository(mlCache)), |
| 42 | AppPageRepository: repository.NewAppPageRepository(cache.NewCachedRepository(mlCache)), | 46 | AppPageRepository: repository.NewAppPageRepository(cache.NewCachedRepository(mlCache)), |
| 47 | + ObjectNoticeRepository: repository.NewObjectNoticeRepository(cache.NewCachedRepository(mlCache)), | ||
| 48 | + ObjectTableRepository: repository.NewObjectTableRepository(cache.NewCachedRepository(mlCache)), | ||
| 49 | + ObjectFieldRepository: repository.NewObjectFieldRepository(cache.NewCachedRepository(mlCache)), | ||
| 50 | + ObjectTableDataRepository: repository.NewObjectTableDataRepository(), | ||
| 43 | 51 | ||
| 44 | ByteMetadataService: bytelib.ByteMetadataService{ | 52 | ByteMetadataService: bytelib.ByteMetadataService{ |
| 45 | Service: gateway.NewService(c.ByteMetadata.Name, c.ByteMetadata.Host, c.ByteMetadata.Timeout), | 53 | Service: gateway.NewService(c.ByteMetadata.Name, c.ByteMetadata.Host, c.ByteMetadata.Timeout), |
| 1 | package types | 1 | package types |
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/golang-jwt/jwt/v4" | ||
| 5 | + "time" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +type TableAccessToken struct { | ||
| 9 | + UserId int64 `json:"userId"` | ||
| 10 | + CompanyId int64 `json:"companyId"` | ||
| 11 | + UserName string `json:"userName"` | ||
| 12 | + Phone string `json:"phone"` | ||
| 13 | +} | ||
| 14 | + | ||
| 15 | +func (tk TableAccessToken) GenerateToken() (string, error) { | ||
| 16 | + claims := make(jwt.MapClaims) | ||
| 17 | + claims["exp"] = time.Now().Unix() + 3600 | ||
| 18 | + claims["iat"] = time.Now().Unix() | ||
| 19 | + claims["UserId"] = tk.UserId | ||
| 20 | + claims["CompanyId"] = tk.CompanyId | ||
| 21 | + claims["UserName"] = tk.UserName | ||
| 22 | + claims["Phone"] = tk.Phone | ||
| 23 | + token := jwt.New(jwt.SigningMethodHS256) | ||
| 24 | + token.Claims = claims | ||
| 25 | + return token.SignedString([]byte("digital-platform")) | ||
| 26 | +} |
| @@ -219,6 +219,18 @@ type SearchTableByModuleRequest struct { | @@ -219,6 +219,18 @@ type SearchTableByModuleRequest struct { | ||
| 219 | } | 219 | } |
| 220 | 220 | ||
| 221 | type SearchTableByModuleResponse struct { | 221 | type SearchTableByModuleResponse struct { |
| 222 | + Count int `json:"count"` | ||
| 223 | + List []SearchTableByModuleItem `json:"list"` | ||
| 224 | +} | ||
| 225 | + | ||
| 226 | +type SearchTableByModuleItem struct { | ||
| 227 | + Id int `json:"id"` //ID | ||
| 228 | + TableId int `json:"tableId"` //表ID | ||
| 229 | + Name string `json:"name"` //表名 | ||
| 230 | + TableType string `json:"tableType"` //表类型 | ||
| 231 | + ParentId int `json:"parentId"` //父级ID | ||
| 232 | + Flag string `json:"flag"` //分组:Group 集合:Set | ||
| 233 | + IsLocal bool `json:"isLocal"` //是否本地存储 | ||
| 222 | } | 234 | } |
| 223 | 235 | ||
| 224 | type SearchTableFieldOptionalValuesRequest struct { | 236 | type SearchTableFieldOptionalValuesRequest struct { |
| @@ -259,6 +271,14 @@ type SearchTableDataRequest struct { | @@ -259,6 +271,14 @@ type SearchTableDataRequest struct { | ||
| 259 | type SearchTableDataResponse struct { | 271 | type SearchTableDataResponse struct { |
| 260 | } | 272 | } |
| 261 | 273 | ||
| 274 | +type SyncTableDataPusher struct { | ||
| 275 | + CompanyId int64 `json:"companyId,string"` //公司ID | ||
| 276 | + ObjectId int `json:"objectId"` | ||
| 277 | +} | ||
| 278 | + | ||
| 279 | +type SyncTableResponse struct { | ||
| 280 | +} | ||
| 281 | + | ||
| 262 | type AppPageGetRequest struct { | 282 | type AppPageGetRequest struct { |
| 263 | Id int64 `path:"id"` | 283 | Id int64 `path:"id"` |
| 264 | } | 284 | } |
| 1 | + | ||
| 2 | +syntax = "v1" | ||
| 3 | + | ||
| 4 | +info( | ||
| 5 | + title: "xx实例" | ||
| 6 | + desc: "xx实例" | ||
| 7 | + author: "author" | ||
| 8 | + email: "email" | ||
| 9 | + version: "v1" | ||
| 10 | +) | ||
| 11 | + | ||
| 12 | +@server( | ||
| 13 | + prefix: object_field/v1 | ||
| 14 | + group: object_field | ||
| 15 | + jwt: JwtAuth | ||
| 16 | +) | ||
| 17 | +service Core { | ||
| 18 | + @handler getObjectField | ||
| 19 | + post /object_field/:id (ObjectFieldGetRequest) returns (ObjectFieldGetResponse) | ||
| 20 | + @handler saveObjectField | ||
| 21 | + post /object_field (ObjectFieldSaveRequest) returns (ObjectFieldSaveResponse) | ||
| 22 | + @handler deleteObjectField | ||
| 23 | + delete /object_field/:id (ObjectFieldDeleteRequest) returns (ObjectFieldDeleteResponse) | ||
| 24 | + @handler updateObjectField | ||
| 25 | + put /object_field/:id (ObjectFieldUpdateRequest) returns (ObjectFieldUpdateResponse) | ||
| 26 | + @handler searchObjectField | ||
| 27 | + post /object_field/search (ObjectFieldSearchRequest) returns (ObjectFieldSearchResponse) | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +type ( | ||
| 31 | + ObjectFieldGetRequest { | ||
| 32 | + Id int64 `path:"id"` | ||
| 33 | + } | ||
| 34 | + ObjectFieldGetResponse struct{ | ||
| 35 | + ObjectField ObjectFieldItem `json:"object_field"` | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + ObjectFieldSaveRequest struct{ | ||
| 39 | + ObjectField ObjectFieldItem `json:"object_field"` | ||
| 40 | + } | ||
| 41 | + ObjectFieldSaveResponse struct{} | ||
| 42 | + | ||
| 43 | + ObjectFieldDeleteRequest struct{ | ||
| 44 | + Id int64 `path:"id"` | ||
| 45 | + } | ||
| 46 | + ObjectFieldDeleteResponse struct{} | ||
| 47 | + | ||
| 48 | + ObjectFieldUpdateRequest struct{ | ||
| 49 | + Id int64 `path:"id"` | ||
| 50 | + ObjectField ObjectFieldItem `json:"object_field"` | ||
| 51 | + } | ||
| 52 | + ObjectFieldUpdateResponse struct{} | ||
| 53 | + | ||
| 54 | + ObjectFieldSearchRequest struct{ | ||
| 55 | + Page int `json:"page"` | ||
| 56 | + Size int `json:"size"` | ||
| 57 | + } | ||
| 58 | + ObjectFieldSearchResponse{ | ||
| 59 | + List []ObjectFieldItem `json:"list"` | ||
| 60 | + Total int64 `json:"total"` | ||
| 61 | + } | ||
| 62 | + ObjectFieldItem struct{ | ||
| 63 | + | ||
| 64 | + } | ||
| 65 | +) |
| 1 | + | ||
| 2 | +syntax = "v1" | ||
| 3 | + | ||
| 4 | +info( | ||
| 5 | + title: "xx实例" | ||
| 6 | + desc: "xx实例" | ||
| 7 | + author: "author" | ||
| 8 | + email: "email" | ||
| 9 | + version: "v1" | ||
| 10 | +) | ||
| 11 | + | ||
| 12 | +@server( | ||
| 13 | + prefix: object_notice/v1 | ||
| 14 | + group: object_notice | ||
| 15 | + jwt: JwtAuth | ||
| 16 | +) | ||
| 17 | +service Core { | ||
| 18 | + @handler getObjectNotice | ||
| 19 | + post /object_notice/:id (ObjectNoticeGetRequest) returns (ObjectNoticeGetResponse) | ||
| 20 | + @handler saveObjectNotice | ||
| 21 | + post /object_notice (ObjectNoticeSaveRequest) returns (ObjectNoticeSaveResponse) | ||
| 22 | + @handler deleteObjectNotice | ||
| 23 | + delete /object_notice/:id (ObjectNoticeDeleteRequest) returns (ObjectNoticeDeleteResponse) | ||
| 24 | + @handler updateObjectNotice | ||
| 25 | + put /object_notice/:id (ObjectNoticeUpdateRequest) returns (ObjectNoticeUpdateResponse) | ||
| 26 | + @handler searchObjectNotice | ||
| 27 | + post /object_notice/search (ObjectNoticeSearchRequest) returns (ObjectNoticeSearchResponse) | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +type ( | ||
| 31 | + ObjectNoticeGetRequest { | ||
| 32 | + Id int64 `path:"id"` | ||
| 33 | + } | ||
| 34 | + ObjectNoticeGetResponse struct{ | ||
| 35 | + ObjectNotice ObjectNoticeItem `json:"object_notice"` | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + ObjectNoticeSaveRequest struct{ | ||
| 39 | + ObjectNotice ObjectNoticeItem `json:"object_notice"` | ||
| 40 | + } | ||
| 41 | + ObjectNoticeSaveResponse struct{} | ||
| 42 | + | ||
| 43 | + ObjectNoticeDeleteRequest struct{ | ||
| 44 | + Id int64 `path:"id"` | ||
| 45 | + } | ||
| 46 | + ObjectNoticeDeleteResponse struct{} | ||
| 47 | + | ||
| 48 | + ObjectNoticeUpdateRequest struct{ | ||
| 49 | + Id int64 `path:"id"` | ||
| 50 | + ObjectNotice ObjectNoticeItem `json:"object_notice"` | ||
| 51 | + } | ||
| 52 | + ObjectNoticeUpdateResponse struct{} | ||
| 53 | + | ||
| 54 | + ObjectNoticeSearchRequest struct{ | ||
| 55 | + Page int `json:"page"` | ||
| 56 | + Size int `json:"size"` | ||
| 57 | + } | ||
| 58 | + ObjectNoticeSearchResponse{ | ||
| 59 | + List []ObjectNoticeItem `json:"list"` | ||
| 60 | + Total int64 `json:"total"` | ||
| 61 | + } | ||
| 62 | + ObjectNoticeItem struct{ | ||
| 63 | + | ||
| 64 | + } | ||
| 65 | +) |
| 1 | + | ||
| 2 | +syntax = "v1" | ||
| 3 | + | ||
| 4 | +info( | ||
| 5 | + title: "xx实例" | ||
| 6 | + desc: "xx实例" | ||
| 7 | + author: "author" | ||
| 8 | + email: "email" | ||
| 9 | + version: "v1" | ||
| 10 | +) | ||
| 11 | + | ||
| 12 | +@server( | ||
| 13 | + prefix: object_table/v1 | ||
| 14 | + group: object_table | ||
| 15 | + jwt: JwtAuth | ||
| 16 | +) | ||
| 17 | +service Core { | ||
| 18 | + @handler getObjectTable | ||
| 19 | + post /object_table/:id (ObjectTableGetRequest) returns (ObjectTableGetResponse) | ||
| 20 | + @handler saveObjectTable | ||
| 21 | + post /object_table (ObjectTableSaveRequest) returns (ObjectTableSaveResponse) | ||
| 22 | + @handler deleteObjectTable | ||
| 23 | + delete /object_table/:id (ObjectTableDeleteRequest) returns (ObjectTableDeleteResponse) | ||
| 24 | + @handler updateObjectTable | ||
| 25 | + put /object_table/:id (ObjectTableUpdateRequest) returns (ObjectTableUpdateResponse) | ||
| 26 | + @handler searchObjectTable | ||
| 27 | + post /object_table/search (ObjectTableSearchRequest) returns (ObjectTableSearchResponse) | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +type ( | ||
| 31 | + ObjectTableGetRequest { | ||
| 32 | + Id int64 `path:"id"` | ||
| 33 | + } | ||
| 34 | + ObjectTableGetResponse struct{ | ||
| 35 | + ObjectTable ObjectTableItem `json:"object_table"` | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + ObjectTableSaveRequest struct{ | ||
| 39 | + ObjectTable ObjectTableItem `json:"object_table"` | ||
| 40 | + } | ||
| 41 | + ObjectTableSaveResponse struct{} | ||
| 42 | + | ||
| 43 | + ObjectTableDeleteRequest struct{ | ||
| 44 | + Id int64 `path:"id"` | ||
| 45 | + } | ||
| 46 | + ObjectTableDeleteResponse struct{} | ||
| 47 | + | ||
| 48 | + ObjectTableUpdateRequest struct{ | ||
| 49 | + Id int64 `path:"id"` | ||
| 50 | + ObjectTable ObjectTableItem `json:"object_table"` | ||
| 51 | + } | ||
| 52 | + ObjectTableUpdateResponse struct{} | ||
| 53 | + | ||
| 54 | + ObjectTableSearchRequest struct{ | ||
| 55 | + Page int `json:"page"` | ||
| 56 | + Size int `json:"size"` | ||
| 57 | + } | ||
| 58 | + ObjectTableSearchResponse{ | ||
| 59 | + List []ObjectTableItem `json:"list"` | ||
| 60 | + Total int64 `json:"total"` | ||
| 61 | + } | ||
| 62 | + ObjectTableItem struct{ | ||
| 63 | + | ||
| 64 | + } | ||
| 65 | +) |
| 1 | + | ||
| 2 | +syntax = "proto3"; | ||
| 3 | + | ||
| 4 | +option go_package ="./pb"; | ||
| 5 | + | ||
| 6 | +package pb; | ||
| 7 | + | ||
| 8 | +message ObjectFieldGetReq { | ||
| 9 | + int64 Id = 1; | ||
| 10 | +} | ||
| 11 | +message ObjectFieldGetResp{ | ||
| 12 | + ObjectFieldItem User = 1; | ||
| 13 | +} | ||
| 14 | + | ||
| 15 | +message ObjectFieldSaveReq { | ||
| 16 | + | ||
| 17 | +} | ||
| 18 | +message ObjectFieldSaveResp{ | ||
| 19 | + | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +message ObjectFieldDeleteReq { | ||
| 23 | + int64 Id = 1; | ||
| 24 | +} | ||
| 25 | +message ObjectFieldDeleteResp{ | ||
| 26 | + | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +message ObjectFieldUpdateReq { | ||
| 30 | + int64 Id = 1; | ||
| 31 | +} | ||
| 32 | +message ObjectFieldUpdateResp{ | ||
| 33 | + | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +message ObjectFieldSearchReq { | ||
| 37 | + int64 PageNumber = 1; | ||
| 38 | + int64 PageSize = 2; | ||
| 39 | +} | ||
| 40 | +message ObjectFieldSearchResp{ | ||
| 41 | + repeated ObjectFieldItem List =1; | ||
| 42 | + int64 Total =2; | ||
| 43 | +} | ||
| 44 | +message ObjectFieldItem { | ||
| 45 | + | ||
| 46 | +} | ||
| 47 | + | ||
| 48 | +service ObjectFieldService { | ||
| 49 | + rpc ObjectFieldGet(ObjectFieldGetReq) returns(ObjectFieldGetResp); | ||
| 50 | + rpc ObjectFieldSave(ObjectFieldSaveReq) returns(ObjectFieldSaveResp); | ||
| 51 | + rpc ObjectFieldDelete(ObjectFieldDeleteReq) returns(ObjectFieldDeleteResp); | ||
| 52 | + rpc ObjectFieldUpdate(ObjectFieldUpdateReq) returns(ObjectFieldUpdateResp); | ||
| 53 | + rpc ObjectFieldSearch(ObjectFieldSearchReq) returns(ObjectFieldSearchResp); | ||
| 54 | +} |
| 1 | + | ||
| 2 | +syntax = "proto3"; | ||
| 3 | + | ||
| 4 | +option go_package ="./pb"; | ||
| 5 | + | ||
| 6 | +package pb; | ||
| 7 | + | ||
| 8 | +message ObjectNoticeGetReq { | ||
| 9 | + int64 Id = 1; | ||
| 10 | +} | ||
| 11 | +message ObjectNoticeGetResp{ | ||
| 12 | + ObjectNoticeItem User = 1; | ||
| 13 | +} | ||
| 14 | + | ||
| 15 | +message ObjectNoticeSaveReq { | ||
| 16 | + | ||
| 17 | +} | ||
| 18 | +message ObjectNoticeSaveResp{ | ||
| 19 | + | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +message ObjectNoticeDeleteReq { | ||
| 23 | + int64 Id = 1; | ||
| 24 | +} | ||
| 25 | +message ObjectNoticeDeleteResp{ | ||
| 26 | + | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +message ObjectNoticeUpdateReq { | ||
| 30 | + int64 Id = 1; | ||
| 31 | +} | ||
| 32 | +message ObjectNoticeUpdateResp{ | ||
| 33 | + | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +message ObjectNoticeSearchReq { | ||
| 37 | + int64 PageNumber = 1; | ||
| 38 | + int64 PageSize = 2; | ||
| 39 | +} | ||
| 40 | +message ObjectNoticeSearchResp{ | ||
| 41 | + repeated ObjectNoticeItem List =1; | ||
| 42 | + int64 Total =2; | ||
| 43 | +} | ||
| 44 | +message ObjectNoticeItem { | ||
| 45 | + | ||
| 46 | +} | ||
| 47 | + | ||
| 48 | +service ObjectNoticeService { | ||
| 49 | + rpc ObjectNoticeGet(ObjectNoticeGetReq) returns(ObjectNoticeGetResp); | ||
| 50 | + rpc ObjectNoticeSave(ObjectNoticeSaveReq) returns(ObjectNoticeSaveResp); | ||
| 51 | + rpc ObjectNoticeDelete(ObjectNoticeDeleteReq) returns(ObjectNoticeDeleteResp); | ||
| 52 | + rpc ObjectNoticeUpdate(ObjectNoticeUpdateReq) returns(ObjectNoticeUpdateResp); | ||
| 53 | + rpc ObjectNoticeSearch(ObjectNoticeSearchReq) returns(ObjectNoticeSearchResp); | ||
| 54 | +} |
| 1 | + | ||
| 2 | +syntax = "proto3"; | ||
| 3 | + | ||
| 4 | +option go_package ="./pb"; | ||
| 5 | + | ||
| 6 | +package pb; | ||
| 7 | + | ||
| 8 | +message ObjectTableGetReq { | ||
| 9 | + int64 Id = 1; | ||
| 10 | +} | ||
| 11 | +message ObjectTableGetResp{ | ||
| 12 | + ObjectTableItem User = 1; | ||
| 13 | +} | ||
| 14 | + | ||
| 15 | +message ObjectTableSaveReq { | ||
| 16 | + | ||
| 17 | +} | ||
| 18 | +message ObjectTableSaveResp{ | ||
| 19 | + | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +message ObjectTableDeleteReq { | ||
| 23 | + int64 Id = 1; | ||
| 24 | +} | ||
| 25 | +message ObjectTableDeleteResp{ | ||
| 26 | + | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +message ObjectTableUpdateReq { | ||
| 30 | + int64 Id = 1; | ||
| 31 | +} | ||
| 32 | +message ObjectTableUpdateResp{ | ||
| 33 | + | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +message ObjectTableSearchReq { | ||
| 37 | + int64 PageNumber = 1; | ||
| 38 | + int64 PageSize = 2; | ||
| 39 | +} | ||
| 40 | +message ObjectTableSearchResp{ | ||
| 41 | + repeated ObjectTableItem List =1; | ||
| 42 | + int64 Total =2; | ||
| 43 | +} | ||
| 44 | +message ObjectTableItem { | ||
| 45 | + | ||
| 46 | +} | ||
| 47 | + | ||
| 48 | +service ObjectTableService { | ||
| 49 | + rpc ObjectTableGet(ObjectTableGetReq) returns(ObjectTableGetResp); | ||
| 50 | + rpc ObjectTableSave(ObjectTableSaveReq) returns(ObjectTableSaveResp); | ||
| 51 | + rpc ObjectTableDelete(ObjectTableDeleteReq) returns(ObjectTableDeleteResp); | ||
| 52 | + rpc ObjectTableUpdate(ObjectTableUpdateReq) returns(ObjectTableUpdateResp); | ||
| 53 | + rpc ObjectTableSearch(ObjectTableSearchReq) returns(ObjectTableSearchResp); | ||
| 54 | +} |
| @@ -10,5 +10,8 @@ func Migrate(db *gorm.DB) { | @@ -10,5 +10,8 @@ func Migrate(db *gorm.DB) { | ||
| 10 | &models.Chart{}, | 10 | &models.Chart{}, |
| 11 | &models.ChartSetting{}, | 11 | &models.ChartSetting{}, |
| 12 | &models.AppPage{}, | 12 | &models.AppPage{}, |
| 13 | + &models.ObjectNotice{}, | ||
| 14 | + &models.ObjectTable{}, | ||
| 15 | + &models.ObjectField{}, | ||
| 13 | ) | 16 | ) |
| 14 | } | 17 | } |
| 1 | +package models | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/gateway/bytelib" | ||
| 7 | + "gorm.io/gorm" | ||
| 8 | + "gorm.io/plugin/soft_delete" | ||
| 9 | + "time" | ||
| 10 | +) | ||
| 11 | + | ||
| 12 | +type ObjectField struct { | ||
| 13 | + Id int64 `json:"id" gorm:"primaryKey"` // ID | ||
| 14 | + Name string `json:"name"` //表名 | ||
| 15 | + Fields []*bytelib.Field `json:"fields" gorm:"serializer:json"` //表字段 | ||
| 16 | + Version int `json:",omitempty"` //版本 | ||
| 17 | + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"` //删除标记 | ||
| 18 | + CreatedAt int64 `json:",omitempty"` //创建时间 | ||
| 19 | + UpdatedAt int64 `json:",omitempty"` //更新时间 | ||
| 20 | + DeletedAt int64 `json:",omitempty"` //删除时间 | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +func (m *ObjectField) TableName() string { | ||
| 24 | + return "object_field" | ||
| 25 | +} | ||
| 26 | + | ||
| 27 | +func (m *ObjectField) BeforeCreate(tx *gorm.DB) (err error) { | ||
| 28 | + m.CreatedAt = time.Now().Unix() | ||
| 29 | + m.UpdatedAt = time.Now().Unix() | ||
| 30 | + return | ||
| 31 | +} | ||
| 32 | + | ||
| 33 | +func (m *ObjectField) BeforeUpdate(tx *gorm.DB) (err error) { | ||
| 34 | + m.UpdatedAt = time.Now().Unix() | ||
| 35 | + return | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +func (m *ObjectField) CacheKeyFunc() string { | ||
| 39 | + if m.Id == 0 { | ||
| 40 | + return "" | ||
| 41 | + } | ||
| 42 | + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id) | ||
| 43 | +} | ||
| 44 | + | ||
| 45 | +func (m *ObjectField) CacheKeyFuncByObject(obj interface{}) string { | ||
| 46 | + if v, ok := obj.(*ObjectField); ok { | ||
| 47 | + return v.CacheKeyFunc() | ||
| 48 | + } | ||
| 49 | + return "" | ||
| 50 | +} | ||
| 51 | + | ||
| 52 | +func (m *ObjectField) CachePrimaryKeyFunc() string { | ||
| 53 | + if len("") == 0 { | ||
| 54 | + return "" | ||
| 55 | + } | ||
| 56 | + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key") | ||
| 57 | +} |
| 1 | +package models | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain" | ||
| 6 | + "gorm.io/gorm" | ||
| 7 | + "gorm.io/plugin/soft_delete" | ||
| 8 | + "time" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +type ObjectNotice struct { | ||
| 12 | + Id int64 `json:"id" gorm:"primaryKey"` // ID | ||
| 13 | + CompanyId int64 `json:"companyId"` //公司ID | ||
| 14 | + TableId int64 `json:"tableId"` //表ID | ||
| 15 | + TableType string `json:"tableType"` //表类型 导入模块(主表、附表、分表) 拆解(方案、子过程、计算表) 计算(计算项、计算集) | ||
| 16 | + ObjectType string `json:"objectType"` //模块 导入模块、拆解模块、计算模块 | ||
| 17 | + Event string `json:"event"` //事件 | ||
| 18 | + TableAffectedList []int `json:"TableAffectedList" gorm:"serializer:json"` //级联影响到的表 | ||
| 19 | + DataChanged bool `json:"dataChanged"` //数据有更新 | ||
| 20 | + StructChanged bool `json:"structChanged"` //结构有更新 | ||
| 21 | + Status int `json:"status" gorm:"index:idx_object_notice_status"` //状态 1-等待处理 2-处理完成 3-处理失败 | ||
| 22 | + Message string `json:"message"` //错误信息 | ||
| 23 | + Retry int `json:"retry" gorm:"default:0"` //重试次数 | ||
| 24 | + MetaData domain.ObjectNoticeMetaData `json:"metaData" gorm:"serializer:json"` //模块信息 | ||
| 25 | + Version int `json:",omitempty"` //版本 | ||
| 26 | + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"` //删除标记 | ||
| 27 | + CreatedAt int64 `json:",omitempty"` //创建时间 | ||
| 28 | + UpdatedAt int64 `json:",omitempty"` //更新时间 | ||
| 29 | + DeletedAt int64 `json:",omitempty"` //删除时间 | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +func (m *ObjectNotice) TableName() string { | ||
| 33 | + return "object_notice" | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +func (m *ObjectNotice) BeforeCreate(tx *gorm.DB) (err error) { | ||
| 37 | + m.CreatedAt = time.Now().Unix() | ||
| 38 | + m.UpdatedAt = time.Now().Unix() | ||
| 39 | + return | ||
| 40 | +} | ||
| 41 | + | ||
| 42 | +func (m *ObjectNotice) BeforeUpdate(tx *gorm.DB) (err error) { | ||
| 43 | + m.UpdatedAt = time.Now().Unix() | ||
| 44 | + return | ||
| 45 | +} | ||
| 46 | + | ||
| 47 | +func (m *ObjectNotice) CacheKeyFunc() string { | ||
| 48 | + if m.Id == 0 { | ||
| 49 | + return "" | ||
| 50 | + } | ||
| 51 | + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id) | ||
| 52 | +} | ||
| 53 | + | ||
| 54 | +func (m *ObjectNotice) CacheKeyFuncByObject(obj interface{}) string { | ||
| 55 | + if v, ok := obj.(*ObjectNotice); ok { | ||
| 56 | + return v.CacheKeyFunc() | ||
| 57 | + } | ||
| 58 | + return "" | ||
| 59 | +} | ||
| 60 | + | ||
| 61 | +func (m *ObjectNotice) CachePrimaryKeyFunc() string { | ||
| 62 | + if len("") == 0 { | ||
| 63 | + return "" | ||
| 64 | + } | ||
| 65 | + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key") | ||
| 66 | +} |
| 1 | +package models | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain" | ||
| 6 | + "gorm.io/gorm" | ||
| 7 | + "gorm.io/plugin/soft_delete" | ||
| 8 | + "time" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +type ObjectTable struct { | ||
| 12 | + Id int `json:"id" gorm:"primaryKey"` // ID | ||
| 13 | + TableId int `json:"tableId" gorm:"index:idx_object_table_id"` //表ID | ||
| 14 | + Name string `json:"name"` //表名 | ||
| 15 | + TableType string `json:"tableType" gorm:"index:idx_object_table_type"` //模块 | ||
| 16 | + CompanyId int64 `json:"companyId" gorm:"index:idx_object_table_company"` //公司id | ||
| 17 | + ParentId int `json:"parentId" gorm:"default:0"` //父id | ||
| 18 | + Flag string `json:"flag"` //分组:Group 集合:Set | ||
| 19 | + Version int `json:",omitempty"` //版本 | ||
| 20 | + IsLocal bool `json:"isLocal" gorm:"default:false"` //是否有本地存储 | ||
| 21 | + RemoteDeleted int `json:"remoteDeleted"` //远端删除 | ||
| 22 | + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"` //删除标记 | ||
| 23 | + CreatedAt int64 `json:",omitempty"` //创建时间 | ||
| 24 | + UpdatedAt int64 `json:",omitempty"` //更新时间 | ||
| 25 | + DeletedAt int64 `json:",omitempty"` //删除时间 | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +func (m *ObjectTable) TableName() string { | ||
| 29 | + return "object_table" | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +func (m *ObjectTable) BeforeCreate(tx *gorm.DB) (err error) { | ||
| 33 | + m.CreatedAt = time.Now().Unix() | ||
| 34 | + m.UpdatedAt = time.Now().Unix() | ||
| 35 | + return | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +func (m *ObjectTable) BeforeUpdate(tx *gorm.DB) (err error) { | ||
| 39 | + m.UpdatedAt = time.Now().Unix() | ||
| 40 | + return | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +func (m *ObjectTable) CacheKeyFunc() string { | ||
| 44 | + if m.Id == 0 { | ||
| 45 | + return "" | ||
| 46 | + } | ||
| 47 | + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id) | ||
| 48 | +} | ||
| 49 | + | ||
| 50 | +func (m *ObjectTable) CacheKeyFuncByObject(obj interface{}) string { | ||
| 51 | + if v, ok := obj.(*ObjectTable); ok { | ||
| 52 | + return v.CacheKeyFunc() | ||
| 53 | + } | ||
| 54 | + return "" | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +func (m *ObjectTable) CachePrimaryKeyFunc() string { | ||
| 58 | + if len("") == 0 { | ||
| 59 | + return "" | ||
| 60 | + } | ||
| 61 | + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key") | ||
| 62 | +} |
| @@ -201,6 +201,18 @@ func (repository *ChartRepository) FindOneByGroup(ctx context.Context, conn tran | @@ -201,6 +201,18 @@ func (repository *ChartRepository) FindOneByGroup(ctx context.Context, conn tran | ||
| 201 | return repository.ModelToDomainModel(m) | 201 | return repository.ModelToDomainModel(m) |
| 202 | } | 202 | } |
| 203 | 203 | ||
| 204 | +// FindCompanyIds 获取所有的公司ID | ||
| 205 | +func (repository *ChartRepository) FindCompanyIds(ctx context.Context, conn transaction.Conn) ([]int64, error) { | ||
| 206 | + var ( | ||
| 207 | + err error | ||
| 208 | + tx = conn.DB() | ||
| 209 | + m = new(models.Chart) | ||
| 210 | + ) | ||
| 211 | + list := make([]int64, 0) | ||
| 212 | + err = tx.Model(&m).Group("tenant_id").Pluck("tenant_id", &list).Error | ||
| 213 | + return list, err | ||
| 214 | +} | ||
| 215 | + | ||
| 204 | func (repository *ChartRepository) ModelToDomainModel(from *models.Chart) (*domain.Chart, error) { | 216 | func (repository *ChartRepository) ModelToDomainModel(from *models.Chart) (*domain.Chart, error) { |
| 205 | to := &domain.Chart{} | 217 | to := &domain.Chart{} |
| 206 | err := copier.Copy(to, from) | 218 | err := copier.Copy(to, from) |
| @@ -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) |
| 1 | +package repository | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "context" | ||
| 5 | + "github.com/jinzhu/copier" | ||
| 6 | + "github.com/pkg/errors" | ||
| 7 | + "github.com/tiptok/gocomm/pkg/cache" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/models" | ||
| 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/domain" | ||
| 11 | + "gorm.io/gorm" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +type ObjectFieldRepository struct { | ||
| 15 | + *cache.CachedRepository | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func (repository *ObjectFieldRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.ObjectField) (*domain.ObjectField, error) { | ||
| 19 | + var ( | ||
| 20 | + err error | ||
| 21 | + m = &models.ObjectField{} | ||
| 22 | + tx = conn.DB() | ||
| 23 | + ) | ||
| 24 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
| 25 | + return nil, err | ||
| 26 | + } | ||
| 27 | + if tx = tx.Model(m).Save(m); tx.Error != nil { | ||
| 28 | + return nil, tx.Error | ||
| 29 | + } | ||
| 30 | + dm.Id = m.Id | ||
| 31 | + return repository.ModelToDomainModel(m) | ||
| 32 | +} | ||
| 33 | + | ||
| 34 | +func (repository *ObjectFieldRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.ObjectField) (*domain.ObjectField, error) { | ||
| 35 | + var ( | ||
| 36 | + err error | ||
| 37 | + m *models.ObjectField | ||
| 38 | + tx = conn.DB() | ||
| 39 | + ) | ||
| 40 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
| 41 | + return nil, err | ||
| 42 | + } | ||
| 43 | + queryFunc := func() (interface{}, error) { | ||
| 44 | + tx = tx.Model(m).Updates(m) | ||
| 45 | + return nil, tx.Error | ||
| 46 | + } | ||
| 47 | + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
| 48 | + return nil, err | ||
| 49 | + } | ||
| 50 | + return repository.ModelToDomainModel(m) | ||
| 51 | +} | ||
| 52 | + | ||
| 53 | +func (repository *ObjectFieldRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.ObjectField) (*domain.ObjectField, error) { | ||
| 54 | + var ( | ||
| 55 | + err error | ||
| 56 | + m *models.ObjectField | ||
| 57 | + tx = transaction.DB() | ||
| 58 | + ) | ||
| 59 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
| 60 | + return nil, err | ||
| 61 | + } | ||
| 62 | + oldVersion := dm.Version | ||
| 63 | + m.Version += 1 | ||
| 64 | + queryFunc := func() (interface{}, error) { | ||
| 65 | + tx = tx.Model(m).Select("*").Where("id = ?", m.Id).Where("version = ?", oldVersion).Updates(m) | ||
| 66 | + if tx.RowsAffected == 0 { | ||
| 67 | + return nil, domain.ErrUpdateFail | ||
| 68 | + } | ||
| 69 | + return nil, tx.Error | ||
| 70 | + } | ||
| 71 | + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
| 72 | + return nil, err | ||
| 73 | + } | ||
| 74 | + return repository.ModelToDomainModel(m) | ||
| 75 | +} | ||
| 76 | + | ||
| 77 | +func (repository *ObjectFieldRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.ObjectField) (*domain.ObjectField, error) { | ||
| 78 | + var ( | ||
| 79 | + tx = conn.DB() | ||
| 80 | + m = &models.ObjectField{Id: dm.Identify().(int64)} | ||
| 81 | + ) | ||
| 82 | + queryFunc := func() (interface{}, error) { | ||
| 83 | + tx = tx.Where("id = ?", m.Id).Unscoped().Delete(m) | ||
| 84 | + return m, tx.Error | ||
| 85 | + } | ||
| 86 | + if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
| 87 | + return dm, err | ||
| 88 | + } | ||
| 89 | + return repository.ModelToDomainModel(m) | ||
| 90 | +} | ||
| 91 | + | ||
| 92 | +func (repository *ObjectFieldRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.ObjectField, error) { | ||
| 93 | + var ( | ||
| 94 | + err error | ||
| 95 | + tx = conn.DB() | ||
| 96 | + m = new(models.ObjectField) | ||
| 97 | + ) | ||
| 98 | + queryFunc := func() (interface{}, error) { | ||
| 99 | + tx = tx.Model(m).Where("id = ?", id).First(m) | ||
| 100 | + if errors.Is(tx.Error, gorm.ErrRecordNotFound) { | ||
| 101 | + return nil, domain.ErrNotFound | ||
| 102 | + } | ||
| 103 | + return m, tx.Error | ||
| 104 | + } | ||
| 105 | + cacheModel := new(models.ObjectField) | ||
| 106 | + cacheModel.Id = id | ||
| 107 | + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil { | ||
| 108 | + return nil, err | ||
| 109 | + } | ||
| 110 | + return repository.ModelToDomainModel(m) | ||
| 111 | +} | ||
| 112 | + | ||
| 113 | +func (repository *ObjectFieldRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.ObjectField, error) { | ||
| 114 | + var ( | ||
| 115 | + tx = conn.DB() | ||
| 116 | + ms []*models.ObjectField | ||
| 117 | + dms = make([]*domain.ObjectField, 0) | ||
| 118 | + total int64 | ||
| 119 | + ) | ||
| 120 | + queryFunc := func() (interface{}, error) { | ||
| 121 | + tx = tx.Model(&ms).Order("id desc") | ||
| 122 | + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { | ||
| 123 | + return dms, tx.Error | ||
| 124 | + } | ||
| 125 | + return dms, nil | ||
| 126 | + } | ||
| 127 | + | ||
| 128 | + if _, err := repository.Query(queryFunc); err != nil { | ||
| 129 | + return 0, nil, err | ||
| 130 | + } | ||
| 131 | + | ||
| 132 | + for _, item := range ms { | ||
| 133 | + if dm, err := repository.ModelToDomainModel(item); err != nil { | ||
| 134 | + return 0, dms, err | ||
| 135 | + } else { | ||
| 136 | + dms = append(dms, dm) | ||
| 137 | + } | ||
| 138 | + } | ||
| 139 | + return total, dms, nil | ||
| 140 | +} | ||
| 141 | + | ||
| 142 | +func (repository *ObjectFieldRepository) ModelToDomainModel(from *models.ObjectField) (*domain.ObjectField, error) { | ||
| 143 | + to := &domain.ObjectField{} | ||
| 144 | + err := copier.Copy(to, from) | ||
| 145 | + return to, err | ||
| 146 | +} | ||
| 147 | + | ||
| 148 | +func (repository *ObjectFieldRepository) DomainModelToModel(from *domain.ObjectField) (*models.ObjectField, error) { | ||
| 149 | + to := &models.ObjectField{} | ||
| 150 | + err := copier.Copy(to, from) | ||
| 151 | + return to, err | ||
| 152 | +} | ||
| 153 | + | ||
| 154 | +func NewObjectFieldRepository(cache *cache.CachedRepository) domain.ObjectFieldRepository { | ||
| 155 | + return &ObjectFieldRepository{CachedRepository: cache} | ||
| 156 | +} |
| 1 | +package repository | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "context" | ||
| 5 | + "github.com/jinzhu/copier" | ||
| 6 | + "github.com/pkg/errors" | ||
| 7 | + "github.com/tiptok/gocomm/pkg/cache" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/models" | ||
| 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/domain" | ||
| 11 | + "gorm.io/gorm" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +type ObjectNoticeRepository struct { | ||
| 15 | + *cache.CachedRepository | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func (repository *ObjectNoticeRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.ObjectNotice) (*domain.ObjectNotice, error) { | ||
| 19 | + var ( | ||
| 20 | + err error | ||
| 21 | + m = &models.ObjectNotice{} | ||
| 22 | + tx = conn.DB() | ||
| 23 | + ) | ||
| 24 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
| 25 | + return nil, err | ||
| 26 | + } | ||
| 27 | + if tx = tx.Model(m).Save(m); tx.Error != nil { | ||
| 28 | + return nil, tx.Error | ||
| 29 | + } | ||
| 30 | + dm.Id = m.Id | ||
| 31 | + return repository.ModelToDomainModel(m) | ||
| 32 | + | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +func (repository *ObjectNoticeRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.ObjectNotice) (*domain.ObjectNotice, error) { | ||
| 36 | + var ( | ||
| 37 | + err error | ||
| 38 | + m *models.ObjectNotice | ||
| 39 | + tx = conn.DB() | ||
| 40 | + ) | ||
| 41 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
| 42 | + return nil, err | ||
| 43 | + } | ||
| 44 | + queryFunc := func() (interface{}, error) { | ||
| 45 | + tx = tx.Model(m).Updates(m) | ||
| 46 | + return nil, tx.Error | ||
| 47 | + } | ||
| 48 | + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
| 49 | + return nil, err | ||
| 50 | + } | ||
| 51 | + return repository.ModelToDomainModel(m) | ||
| 52 | +} | ||
| 53 | + | ||
| 54 | +func (repository *ObjectNoticeRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.ObjectNotice) (*domain.ObjectNotice, error) { | ||
| 55 | + var ( | ||
| 56 | + err error | ||
| 57 | + m *models.ObjectNotice | ||
| 58 | + tx = transaction.DB() | ||
| 59 | + ) | ||
| 60 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
| 61 | + return nil, err | ||
| 62 | + } | ||
| 63 | + oldVersion := dm.Version | ||
| 64 | + m.Version += 1 | ||
| 65 | + queryFunc := func() (interface{}, error) { | ||
| 66 | + tx = tx.Model(m).Select("*").Where("id = ?", m.Id).Where("version = ?", oldVersion).Updates(m) | ||
| 67 | + if tx.RowsAffected == 0 { | ||
| 68 | + return nil, domain.ErrUpdateFail | ||
| 69 | + } | ||
| 70 | + return nil, tx.Error | ||
| 71 | + } | ||
| 72 | + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
| 73 | + return nil, err | ||
| 74 | + } | ||
| 75 | + return repository.ModelToDomainModel(m) | ||
| 76 | +} | ||
| 77 | + | ||
| 78 | +func (repository *ObjectNoticeRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.ObjectNotice) (*domain.ObjectNotice, error) { | ||
| 79 | + var ( | ||
| 80 | + tx = conn.DB() | ||
| 81 | + m = &models.ObjectNotice{Id: dm.Identify().(int64)} | ||
| 82 | + ) | ||
| 83 | + queryFunc := func() (interface{}, error) { | ||
| 84 | + tx = tx.Where("id = ?", m.Id).Delete(m) | ||
| 85 | + return m, tx.Error | ||
| 86 | + } | ||
| 87 | + if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
| 88 | + return dm, err | ||
| 89 | + } | ||
| 90 | + return repository.ModelToDomainModel(m) | ||
| 91 | +} | ||
| 92 | + | ||
| 93 | +func (repository *ObjectNoticeRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.ObjectNotice, error) { | ||
| 94 | + var ( | ||
| 95 | + err error | ||
| 96 | + tx = conn.DB() | ||
| 97 | + m = new(models.ObjectNotice) | ||
| 98 | + ) | ||
| 99 | + queryFunc := func() (interface{}, error) { | ||
| 100 | + tx = tx.Model(m).Where("id = ?", id).First(m) | ||
| 101 | + if errors.Is(tx.Error, gorm.ErrRecordNotFound) { | ||
| 102 | + return nil, domain.ErrNotFound | ||
| 103 | + } | ||
| 104 | + return m, tx.Error | ||
| 105 | + } | ||
| 106 | + cacheModel := new(models.ObjectNotice) | ||
| 107 | + cacheModel.Id = id | ||
| 108 | + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil { | ||
| 109 | + return nil, err | ||
| 110 | + } | ||
| 111 | + return repository.ModelToDomainModel(m) | ||
| 112 | +} | ||
| 113 | + | ||
| 114 | +func (repository *ObjectNoticeRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.ObjectNotice, error) { | ||
| 115 | + var ( | ||
| 116 | + tx = conn.DB() | ||
| 117 | + ms []*models.ObjectNotice | ||
| 118 | + dms = make([]*domain.ObjectNotice, 0) | ||
| 119 | + total int64 | ||
| 120 | + ) | ||
| 121 | + queryFunc := func() (interface{}, error) { | ||
| 122 | + tx = tx.Model(&ms).Order("id desc") | ||
| 123 | + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { | ||
| 124 | + return dms, tx.Error | ||
| 125 | + } | ||
| 126 | + return dms, nil | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + if _, err := repository.Query(queryFunc); err != nil { | ||
| 130 | + return 0, nil, err | ||
| 131 | + } | ||
| 132 | + | ||
| 133 | + for _, item := range ms { | ||
| 134 | + if dm, err := repository.ModelToDomainModel(item); err != nil { | ||
| 135 | + return 0, dms, err | ||
| 136 | + } else { | ||
| 137 | + dms = append(dms, dm) | ||
| 138 | + } | ||
| 139 | + } | ||
| 140 | + return total, dms, nil | ||
| 141 | +} | ||
| 142 | + | ||
| 143 | +func (repository *ObjectNoticeRepository) ModelToDomainModel(from *models.ObjectNotice) (*domain.ObjectNotice, error) { | ||
| 144 | + to := &domain.ObjectNotice{} | ||
| 145 | + err := copier.Copy(to, from) | ||
| 146 | + return to, err | ||
| 147 | +} | ||
| 148 | + | ||
| 149 | +func (repository *ObjectNoticeRepository) DomainModelToModel(from *domain.ObjectNotice) (*models.ObjectNotice, error) { | ||
| 150 | + to := &models.ObjectNotice{} | ||
| 151 | + err := copier.Copy(to, from) | ||
| 152 | + return to, err | ||
| 153 | +} | ||
| 154 | + | ||
| 155 | +func NewObjectNoticeRepository(cache *cache.CachedRepository) domain.ObjectNoticeRepository { | ||
| 156 | + return &ObjectNoticeRepository{CachedRepository: cache} | ||
| 157 | +} |
| 1 | +package repository | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "context" | ||
| 5 | + "fmt" | ||
| 6 | + "github.com/pkg/errors" | ||
| 7 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/gateway/bytelib" | ||
| 10 | + "strings" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +type ObjectTableDataRepository struct{} | ||
| 14 | + | ||
| 15 | +type TableColumnSQL struct { | ||
| 16 | + Sql string `json:"sql"` | ||
| 17 | + Column []string `json:"column"` | ||
| 18 | + Data []map[string]string `json:"data"` | ||
| 19 | +} | ||
| 20 | + | ||
| 21 | +// makeDropTableSQL 创建删除表SQL | ||
| 22 | +func (repository *ObjectTableDataRepository) makeDropTableSQL(tableId int) (string, error) { | ||
| 23 | + return fmt.Sprintf(`drop table if exists data."%v"`, tableId), nil | ||
| 24 | +} | ||
| 25 | + | ||
| 26 | +// makeCreateTableSQL 创建表SQL | ||
| 27 | +func (repository *ObjectTableDataRepository) makeCreateTableSQL(tableId int, fields []*bytelib.Field) (string, error) { | ||
| 28 | + if len(fields) <= 0 { | ||
| 29 | + return "", errors.New("缺少字段信息") | ||
| 30 | + } | ||
| 31 | + columns := make([]string, 0) | ||
| 32 | + for _, item := range fields { | ||
| 33 | + columns = append(columns, item.SQLName+" text ") | ||
| 34 | + } | ||
| 35 | + sql := `Create TABLE data."` + fmt.Sprintf("%v", tableId) + `" (` + strings.Join(columns, ",") + `);` | ||
| 36 | + return sql, nil | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +// makeInsertTableSQL 创建表数据SQL | ||
| 40 | +func (repository *ObjectTableDataRepository) makeInsertTableSQL(tableId int, fields []*bytelib.Field, list []map[string]string) (*TableColumnSQL, error) { | ||
| 41 | + tableColumnSQL := &TableColumnSQL{ | ||
| 42 | + Column: make([]string, 0), | ||
| 43 | + Data: make([]map[string]string, 0), | ||
| 44 | + } | ||
| 45 | + if len(list) > 0 && len(fields) > 0 { | ||
| 46 | + for _, field := range fields { | ||
| 47 | + tableColumnSQL.Column = append(tableColumnSQL.Column, field.SQLName) | ||
| 48 | + } | ||
| 49 | + for _, item := range list { | ||
| 50 | + values := make(map[string]string) | ||
| 51 | + for _, field := range tableColumnSQL.Column { | ||
| 52 | + if _, ok := item[field]; ok { | ||
| 53 | + values[field] = item[field] | ||
| 54 | + } else { | ||
| 55 | + return tableColumnSQL, errors.New("未获取到字段值") | ||
| 56 | + } | ||
| 57 | + } | ||
| 58 | + tableColumnSQL.Data = append(tableColumnSQL.Data, values) | ||
| 59 | + } | ||
| 60 | + | ||
| 61 | + tableColumnSQL.Sql = fmt.Sprintf(`INSERT INTO data."%v" (%s) values (%s)`, tableId, strings.Join(tableColumnSQL.Column, ","), repository.sqlPlaceHoldersSnippet(tableColumnSQL.Column)) | ||
| 62 | + } | ||
| 63 | + return tableColumnSQL, nil | ||
| 64 | +} | ||
| 65 | + | ||
| 66 | +func (repository *ObjectTableDataRepository) sqlPlaceHoldersSnippet(sqlBuildFields []string) string { | ||
| 67 | + var placeHolder []string | ||
| 68 | + for i := 0; i < len(sqlBuildFields); i++ { | ||
| 69 | + placeHolder = append(placeHolder, "?") | ||
| 70 | + } | ||
| 71 | + return strings.Join(placeHolder, ",") | ||
| 72 | +} | ||
| 73 | + | ||
| 74 | +func (repository *ObjectTableDataRepository) DropTable(ctx context.Context, conn transaction.Conn, tableId int) error { | ||
| 75 | + sql, err := repository.makeDropTableSQL(tableId) | ||
| 76 | + if err != nil { | ||
| 77 | + return err | ||
| 78 | + } | ||
| 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 | ||
| 85 | +} | ||
| 86 | + | ||
| 87 | +// InsertWithTableData 写入表数据 | ||
| 88 | +func (repository *ObjectTableDataRepository) InsertWithTableData(ctx context.Context, conn transaction.Conn, tableDataPreview bytelib.TableData) error { | ||
| 89 | + //删除表 | ||
| 90 | + err := repository.DropTable(ctx, conn, int(tableDataPreview.ObjectId)) | ||
| 91 | + if err != nil { | ||
| 92 | + return err | ||
| 93 | + } | ||
| 94 | + //创建表 | ||
| 95 | + createTableSql, err := repository.makeCreateTableSQL(int(tableDataPreview.ObjectId), tableDataPreview.Fields) | ||
| 96 | + if err != nil { | ||
| 97 | + return err | ||
| 98 | + } | ||
| 99 | + err = conn.DB().Exec(createTableSql).Error | ||
| 100 | + if err != nil { | ||
| 101 | + return err | ||
| 102 | + } | ||
| 103 | + tableColumnSQL, err := repository.makeInsertTableSQL(int(tableDataPreview.ObjectId), tableDataPreview.Fields, tableDataPreview.Grid.List) | ||
| 104 | + if err != nil { | ||
| 105 | + return err | ||
| 106 | + } | ||
| 107 | + if len(tableColumnSQL.Column) > 0 && len(tableColumnSQL.Data) > 0 { | ||
| 108 | + for _, item := range tableColumnSQL.Data { | ||
| 109 | + if len(item) > 0 { | ||
| 110 | + params := make([]interface{}, 0) | ||
| 111 | + for _, m := range tableColumnSQL.Column { | ||
| 112 | + if _, ok := item[m]; ok { | ||
| 113 | + params = append(params, item[m]) | ||
| 114 | + } else { | ||
| 115 | + params = append(params, "") | ||
| 116 | + } | ||
| 117 | + } | ||
| 118 | + err = conn.DB().Exec(tableColumnSQL.Sql, params...).Error | ||
| 119 | + if err != nil { | ||
| 120 | + return err | ||
| 121 | + } | ||
| 122 | + } | ||
| 123 | + } | ||
| 124 | + } | ||
| 125 | + return nil | ||
| 126 | +} | ||
| 127 | + | ||
| 128 | +// Find 获取表内所有数据 | ||
| 129 | +func (repository *ObjectTableDataRepository) Find(ctx context.Context, conn transaction.Conn, tableId int, query *domain.ObjectTableDataQuery) (int64, []map[string]interface{}, error) { | ||
| 130 | + tx := conn.DB().Table(fmt.Sprintf("data.%v", tableId)) | ||
| 131 | + if len(query.Conditions) > 0 { | ||
| 132 | + for _, item := range query.Conditions { | ||
| 133 | + if item.FieldName == "" { | ||
| 134 | + continue | ||
| 135 | + } | ||
| 136 | + if item.Like != "" { | ||
| 137 | + tx = tx.Where(item.FieldName+" like ?", item.Like) | ||
| 138 | + } | ||
| 139 | + if len(item.In) > 0 { | ||
| 140 | + tx = tx.Where(item.FieldName+" in ?", item.In) | ||
| 141 | + } | ||
| 142 | + if item.Order != "" { | ||
| 143 | + tx = tx.Order(item.FieldName + " " + item.Order) | ||
| 144 | + } | ||
| 145 | + } | ||
| 146 | + } | ||
| 147 | + if query.Group != "" { | ||
| 148 | + tx = tx.Group(query.Group) | ||
| 149 | + } | ||
| 150 | + if query.Select != "" { | ||
| 151 | + tx = tx.Select(query.Select) | ||
| 152 | + } | ||
| 153 | + list := make([]map[string]interface{}, 0) | ||
| 154 | + options := domain.NewQueryOptions() | ||
| 155 | + if query.Size > 0 { | ||
| 156 | + options = options.WithOffsetLimit(query.Page, query.Size) | ||
| 157 | + } | ||
| 158 | + total, tx := transaction.PaginationAndCount(ctx, tx, options, &list) | ||
| 159 | + return total, list, tx.Error | ||
| 160 | +} | ||
| 161 | + | ||
| 162 | +// SyncData 同步表数据 | ||
| 163 | +//func (repository *ObjectTableDataRepository) SyncData(ctx context.Context, conn transaction.Conn, companyId int64, tableId int) error { | ||
| 164 | +// | ||
| 165 | +//} | ||
| 166 | + | ||
| 167 | +func NewObjectTableDataRepository() domain.ObjectTableDataRepository { | ||
| 168 | + return &ObjectTableDataRepository{} | ||
| 169 | +} |
| 1 | +package repository | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "context" | ||
| 5 | + "github.com/jinzhu/copier" | ||
| 6 | + "github.com/pkg/errors" | ||
| 7 | + "github.com/tiptok/gocomm/pkg/cache" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/models" | ||
| 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/domain" | ||
| 11 | + "gorm.io/gorm" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +type ObjectTableRepository struct { | ||
| 15 | + *cache.CachedRepository | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func (repository *ObjectTableRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.ObjectTable) (*domain.ObjectTable, error) { | ||
| 19 | + var ( | ||
| 20 | + err error | ||
| 21 | + m = &models.ObjectTable{} | ||
| 22 | + tx = conn.DB() | ||
| 23 | + ) | ||
| 24 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
| 25 | + return nil, err | ||
| 26 | + } | ||
| 27 | + if tx = tx.Model(m).Save(m); tx.Error != nil { | ||
| 28 | + return nil, tx.Error | ||
| 29 | + } | ||
| 30 | + dm.Id = m.Id | ||
| 31 | + return repository.ModelToDomainModel(m) | ||
| 32 | + | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +func (repository *ObjectTableRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.ObjectTable) (*domain.ObjectTable, error) { | ||
| 36 | + var ( | ||
| 37 | + err error | ||
| 38 | + m *models.ObjectTable | ||
| 39 | + tx = conn.DB() | ||
| 40 | + ) | ||
| 41 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
| 42 | + return nil, err | ||
| 43 | + } | ||
| 44 | + queryFunc := func() (interface{}, error) { | ||
| 45 | + tx = tx.Model(m).Updates(m) | ||
| 46 | + return nil, tx.Error | ||
| 47 | + } | ||
| 48 | + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
| 49 | + return nil, err | ||
| 50 | + } | ||
| 51 | + return repository.ModelToDomainModel(m) | ||
| 52 | +} | ||
| 53 | + | ||
| 54 | +func (repository *ObjectTableRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.ObjectTable) (*domain.ObjectTable, error) { | ||
| 55 | + var ( | ||
| 56 | + err error | ||
| 57 | + m *models.ObjectTable | ||
| 58 | + tx = transaction.DB() | ||
| 59 | + ) | ||
| 60 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
| 61 | + return nil, err | ||
| 62 | + } | ||
| 63 | + oldVersion := dm.Version | ||
| 64 | + m.Version += 1 | ||
| 65 | + queryFunc := func() (interface{}, error) { | ||
| 66 | + tx = tx.Model(m).Select("*").Where("id = ?", m.Id).Where("version = ?", oldVersion).Updates(m) | ||
| 67 | + if tx.RowsAffected == 0 { | ||
| 68 | + return nil, domain.ErrUpdateFail | ||
| 69 | + } | ||
| 70 | + return nil, tx.Error | ||
| 71 | + } | ||
| 72 | + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
| 73 | + return nil, err | ||
| 74 | + } | ||
| 75 | + return repository.ModelToDomainModel(m) | ||
| 76 | +} | ||
| 77 | + | ||
| 78 | +func (repository *ObjectTableRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.ObjectTable) (*domain.ObjectTable, error) { | ||
| 79 | + var ( | ||
| 80 | + tx = conn.DB() | ||
| 81 | + m = &models.ObjectTable{Id: dm.Identify().(int)} | ||
| 82 | + ) | ||
| 83 | + queryFunc := func() (interface{}, error) { | ||
| 84 | + tx = tx.Where("id = ?", m.Id).Unscoped().Delete(m) | ||
| 85 | + return m, tx.Error | ||
| 86 | + } | ||
| 87 | + if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
| 88 | + return dm, err | ||
| 89 | + } | ||
| 90 | + return repository.ModelToDomainModel(m) | ||
| 91 | +} | ||
| 92 | + | ||
| 93 | +func (repository *ObjectTableRepository) FindOne(ctx context.Context, conn transaction.Conn, id int) (*domain.ObjectTable, error) { | ||
| 94 | + var ( | ||
| 95 | + err error | ||
| 96 | + tx = conn.DB() | ||
| 97 | + m = new(models.ObjectTable) | ||
| 98 | + ) | ||
| 99 | + queryFunc := func() (interface{}, error) { | ||
| 100 | + tx = tx.Model(m).Where("id = ?", id).First(m) | ||
| 101 | + if errors.Is(tx.Error, gorm.ErrRecordNotFound) { | ||
| 102 | + return nil, domain.ErrNotFound | ||
| 103 | + } | ||
| 104 | + return m, tx.Error | ||
| 105 | + } | ||
| 106 | + cacheModel := new(models.ObjectTable) | ||
| 107 | + cacheModel.Id = id | ||
| 108 | + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil { | ||
| 109 | + return nil, err | ||
| 110 | + } | ||
| 111 | + return repository.ModelToDomainModel(m) | ||
| 112 | +} | ||
| 113 | + | ||
| 114 | +func (repository *ObjectTableRepository) FindOneByTableId(ctx context.Context, conn transaction.Conn, tableId int) (*domain.ObjectTable, error) { | ||
| 115 | + var ( | ||
| 116 | + tx = conn.DB() | ||
| 117 | + m = new(models.ObjectTable) | ||
| 118 | + ) | ||
| 119 | + tx = tx.Model(m).Where("table_id = ?", tableId).First(m) | ||
| 120 | + if errors.Is(tx.Error, gorm.ErrRecordNotFound) { | ||
| 121 | + return nil, domain.ErrNotFound | ||
| 122 | + } | ||
| 123 | + return repository.ModelToDomainModel(m) | ||
| 124 | +} | ||
| 125 | + | ||
| 126 | +func (repository *ObjectTableRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.ObjectTable, error) { | ||
| 127 | + var ( | ||
| 128 | + tx = conn.DB() | ||
| 129 | + ms []*models.ObjectTable | ||
| 130 | + dms = make([]*domain.ObjectTable, 0) | ||
| 131 | + total int64 | ||
| 132 | + ) | ||
| 133 | + queryFunc := func() (interface{}, error) { | ||
| 134 | + tx = tx.Model(&ms).Order("id desc") | ||
| 135 | + if v, ok := queryOptions["companyId"]; ok { | ||
| 136 | + tx = tx.Where("company_id = ?", v) | ||
| 137 | + } | ||
| 138 | + if v, ok := queryOptions["tableTypeIn"]; ok { | ||
| 139 | + tx = tx.Where("table_type in ?", v) | ||
| 140 | + } | ||
| 141 | + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { | ||
| 142 | + return dms, tx.Error | ||
| 143 | + } | ||
| 144 | + return dms, nil | ||
| 145 | + } | ||
| 146 | + | ||
| 147 | + if _, err := repository.Query(queryFunc); err != nil { | ||
| 148 | + return 0, nil, err | ||
| 149 | + } | ||
| 150 | + | ||
| 151 | + for _, item := range ms { | ||
| 152 | + if dm, err := repository.ModelToDomainModel(item); err != nil { | ||
| 153 | + return 0, dms, err | ||
| 154 | + } else { | ||
| 155 | + dms = append(dms, dm) | ||
| 156 | + } | ||
| 157 | + } | ||
| 158 | + return total, dms, nil | ||
| 159 | +} | ||
| 160 | + | ||
| 161 | +func (repository *ObjectTableRepository) ModelToDomainModel(from *models.ObjectTable) (*domain.ObjectTable, error) { | ||
| 162 | + to := &domain.ObjectTable{} | ||
| 163 | + err := copier.Copy(to, from) | ||
| 164 | + return to, err | ||
| 165 | +} | ||
| 166 | + | ||
| 167 | +func (repository *ObjectTableRepository) DomainModelToModel(from *domain.ObjectTable) (*models.ObjectTable, error) { | ||
| 168 | + to := &models.ObjectTable{} | ||
| 169 | + err := copier.Copy(to, from) | ||
| 170 | + return to, err | ||
| 171 | +} | ||
| 172 | + | ||
| 173 | +func NewObjectTableRepository(cache *cache.CachedRepository) domain.ObjectTableRepository { | ||
| 174 | + return &ObjectTableRepository{CachedRepository: cache} | ||
| 175 | +} |
| @@ -35,6 +35,7 @@ type ChartRepository interface { | @@ -35,6 +35,7 @@ type ChartRepository interface { | ||
| 35 | Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*Chart, error) | 35 | Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*Chart, error) |
| 36 | FindOneByGroup(ctx context.Context, conn transaction.Conn, tenantId, pid int64) (*Chart, error) | 36 | FindOneByGroup(ctx context.Context, conn transaction.Conn, tenantId, pid int64) (*Chart, error) |
| 37 | FindByTypeAndName(ctx context.Context, conn transaction.Conn, tenantId int64, t string, name string) (int64, []*Chart, error) | 37 | FindByTypeAndName(ctx context.Context, conn transaction.Conn, tenantId int64, t string, name string) (int64, []*Chart, error) |
| 38 | + FindCompanyIds(ctx context.Context, conn transaction.Conn) ([]int64, error) | ||
| 38 | } | 39 | } |
| 39 | 40 | ||
| 40 | /*************** 索引函数 开始****************/ | 41 | /*************** 索引函数 开始****************/ |
| @@ -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{} { |
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "context" | ||
| 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/gateway/bytelib" | ||
| 7 | + "gorm.io/plugin/soft_delete" | ||
| 8 | +) | ||
| 9 | + | ||
| 10 | +type ObjectField struct { | ||
| 11 | + Id int64 `json:"id"` // ID | ||
| 12 | + Name string `json:"name"` //表名 | ||
| 13 | + Fields []*bytelib.Field `json:"fields"` //表字段 | ||
| 14 | + Version int `json:"version,omitempty"` //版本 | ||
| 15 | + IsDel soft_delete.DeletedAt `json:"isDel"` //删除标记 | ||
| 16 | + CreatedAt int64 `json:"createdAt,omitempty"` //创建时间 | ||
| 17 | + UpdatedAt int64 `json:"updatedAt,omitempty"` //更新时间 | ||
| 18 | + DeletedAt int64 `json:"deletedAt,omitempty"` //删除时间 | ||
| 19 | +} | ||
| 20 | + | ||
| 21 | +type ObjectFieldRepository interface { | ||
| 22 | + Insert(ctx context.Context, conn transaction.Conn, dm *ObjectField) (*ObjectField, error) | ||
| 23 | + Update(ctx context.Context, conn transaction.Conn, dm *ObjectField) (*ObjectField, error) | ||
| 24 | + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *ObjectField) (*ObjectField, error) | ||
| 25 | + Delete(ctx context.Context, conn transaction.Conn, dm *ObjectField) (*ObjectField, error) | ||
| 26 | + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ObjectField, error) | ||
| 27 | + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ObjectField, error) | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +func (m *ObjectField) Identify() interface{} { | ||
| 31 | + if m.Id == 0 { | ||
| 32 | + return nil | ||
| 33 | + } | ||
| 34 | + return m.Id | ||
| 35 | +} |
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "context" | ||
| 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/gateway/bytelib" | ||
| 7 | + "gorm.io/plugin/soft_delete" | ||
| 8 | +) | ||
| 9 | + | ||
| 10 | +type ObjectNotice struct { | ||
| 11 | + Id int64 `json:"id"` // ID | ||
| 12 | + CompanyId int64 `json:"companyId"` //公司ID | ||
| 13 | + TableId int `json:"tableId"` //表ID | ||
| 14 | + TableType string `json:"tableType"` //表类型 导入模块(主表、附表、分表) 拆解(方案、子过程、计算表) 计算(计算项、计算集) | ||
| 15 | + ObjectType string `json:"objectType"` //模块 导入模块、拆解模块、计算模块 | ||
| 16 | + Event string `json:"event"` //事件 | ||
| 17 | + TableAffectedList []int `json:"TableAffectedList"` //级联影响到的表 | ||
| 18 | + DataChanged bool `json:"dataChanged"` //数据有更新 | ||
| 19 | + StructChanged bool `json:"structChanged"` //结构有更新 | ||
| 20 | + Status int `json:"status"` //状态 1-等待处理 2-处理完成 3-处理失败 | ||
| 21 | + UpdateTable int `json:"updateTable"` //更新表结构 | ||
| 22 | + UpdateData int `json:"updateData"` //更新表数据 | ||
| 23 | + Message string `json:"message"` //错误信息 | ||
| 24 | + Retry int `json:"retry"` //重试次数 | ||
| 25 | + MetaData ObjectNoticeMetaData `json:"metaData"` //模块信息 | ||
| 26 | + Version int `json:",omitempty"` //版本 | ||
| 27 | + IsDel soft_delete.DeletedAt `json:"isDel"` //删除标记 | ||
| 28 | + CreatedAt int64 `json:"createdAt,omitempty"` //创建时间 | ||
| 29 | + UpdatedAt int64 `json:"updatedAt,omitempty"` //更新时间 | ||
| 30 | + DeletedAt int64 `json:"deletedAt,omitempty"` //删除时间 | ||
| 31 | +} | ||
| 32 | + | ||
| 33 | +type ObjectNoticeMetaData struct { | ||
| 34 | + Module int `json:"module"` // 导入模块判断是否 取消应用 | ||
| 35 | + Status int `json:"status"` // 拆解模块判断是否 取消 | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +var ( | ||
| 39 | + ObjectNoticeStatusWait = 1 //等待处理 | ||
| 40 | + ObjectNoticeStatusDone = 2 //处理完成 | ||
| 41 | + ObjectNoticeStatusError = 3 //处理失败 | ||
| 42 | +) | ||
| 43 | + | ||
| 44 | +type ObjectNoticeRepository interface { | ||
| 45 | + Insert(ctx context.Context, conn transaction.Conn, dm *ObjectNotice) (*ObjectNotice, error) | ||
| 46 | + Update(ctx context.Context, conn transaction.Conn, dm *ObjectNotice) (*ObjectNotice, error) | ||
| 47 | + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *ObjectNotice) (*ObjectNotice, error) | ||
| 48 | + Delete(ctx context.Context, conn transaction.Conn, dm *ObjectNotice) (*ObjectNotice, error) | ||
| 49 | + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ObjectNotice, error) | ||
| 50 | + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ObjectNotice, error) | ||
| 51 | +} | ||
| 52 | + | ||
| 53 | +func (m *ObjectNotice) Identify() interface{} { | ||
| 54 | + if m.Id == 0 { | ||
| 55 | + return nil | ||
| 56 | + } | ||
| 57 | + return m.Id | ||
| 58 | +} | ||
| 59 | + | ||
| 60 | +// IsDeletedEvent 是否删除事件 | ||
| 61 | +func (m *ObjectNotice) IsDeletedEvent() bool { | ||
| 62 | + deletedEvents := []string{ | ||
| 63 | + "table.delete", | ||
| 64 | + "table.query.set.delete", | ||
| 65 | + } | ||
| 66 | + for _, event := range deletedEvents { | ||
| 67 | + if m.Event == event { | ||
| 68 | + return true | ||
| 69 | + } | ||
| 70 | + } | ||
| 71 | + //导入模块 取消应用和应用于 | ||
| 72 | + if m.Event == "table.apply-on" { | ||
| 73 | + if m.MetaData.Module&bytelib.ModuleChartTemplate == 0 { | ||
| 74 | + return true | ||
| 75 | + } | ||
| 76 | + } | ||
| 77 | + //拆解模块 方案启用、禁用 | ||
| 78 | + //计算模块 计算项和计算集启用、禁用 | ||
| 79 | + if m.Event == "table.query.set.update.status" { | ||
| 80 | + if m.MetaData.Status&bytelib.ModuleChartTemplate == 0 { | ||
| 81 | + return true | ||
| 82 | + } | ||
| 83 | + } | ||
| 84 | + return false | ||
| 85 | +} |
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "context" | ||
| 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/gateway/bytelib" | ||
| 7 | + "gorm.io/plugin/soft_delete" | ||
| 8 | +) | ||
| 9 | + | ||
| 10 | +type ObjectTable struct { | ||
| 11 | + Id int `json:"id"` // ID | ||
| 12 | + TableId int `json:"tableId" ` //表ID | ||
| 13 | + Name string `json:"name"` //表名 | ||
| 14 | + TableType string `json:"tableType" ` //模块 | ||
| 15 | + CompanyId int64 `json:"companyId"` //公司id | ||
| 16 | + ParentId int `json:"parentId"` //父id | ||
| 17 | + Flag string `json:"flag"` //分组:Group 集合:Set | ||
| 18 | + Version int `json:"version,omitempty"` //版本 | ||
| 19 | + IsLocal bool `json:"isLocal"` //是否有本地存储 | ||
| 20 | + RemoteDeleted int `json:"remoteDeleted"` //远端删除 | ||
| 21 | + IsDel soft_delete.DeletedAt `json:"isDel,omitempty"` //删除标记 | ||
| 22 | + CreatedAt int64 `json:"createdAt,omitempty"` //创建时间 | ||
| 23 | + UpdatedAt int64 `json:"updatedAt,omitempty"` //更新时间 | ||
| 24 | + DeletedAt int64 `json:"deletedAt,omitempty"` //删除时间 | ||
| 25 | +} | ||
| 26 | + | ||
| 27 | +type ObjectTableRepository interface { | ||
| 28 | + Insert(ctx context.Context, conn transaction.Conn, dm *ObjectTable) (*ObjectTable, error) | ||
| 29 | + Update(ctx context.Context, conn transaction.Conn, dm *ObjectTable) (*ObjectTable, error) | ||
| 30 | + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *ObjectTable) (*ObjectTable, error) | ||
| 31 | + Delete(ctx context.Context, conn transaction.Conn, dm *ObjectTable) (*ObjectTable, error) | ||
| 32 | + FindOne(ctx context.Context, conn transaction.Conn, id int) (*ObjectTable, error) | ||
| 33 | + FindOneByTableId(ctx context.Context, conn transaction.Conn, tableId int) (*ObjectTable, error) | ||
| 34 | + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ObjectTable, error) | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +type ObjectTableDataQuery struct { | ||
| 38 | + Page int | ||
| 39 | + Size int | ||
| 40 | + Conditions []*TableDataCondition | ||
| 41 | + Group string | ||
| 42 | + Select string | ||
| 43 | +} | ||
| 44 | + | ||
| 45 | +type TableDataCondition struct { | ||
| 46 | + FieldName string `json:"field"` // 条件字段 | ||
| 47 | + Like string `json:"like"` // 模糊匹配 | ||
| 48 | + In []string `json:"in"` // 匹配多个值 | ||
| 49 | + Order string `json:"order"` // 排序 ASC DESC 默认ASC | ||
| 50 | +} | ||
| 51 | + | ||
| 52 | +type ObjectTableDataRepository interface { | ||
| 53 | + InsertWithTableData(ctx context.Context, conn transaction.Conn, tableDataPreview bytelib.TableData) 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 | ||
| 56 | +} | ||
| 57 | + | ||
| 58 | +func (m *ObjectTable) Identify() interface{} { | ||
| 59 | + if m.Id == 0 { | ||
| 60 | + return nil | ||
| 61 | + } | ||
| 62 | + return m.Id | ||
| 63 | +} |
| @@ -26,6 +26,10 @@ service Core { | @@ -26,6 +26,10 @@ service Core { | ||
| 26 | @doc "源数据表-数据" | 26 | @doc "源数据表-数据" |
| 27 | @handler searchTableData | 27 | @handler searchTableData |
| 28 | post /table/data (SearchTableDataRequest) returns (SearchTableDataResponse) | 28 | post /table/data (SearchTableDataRequest) returns (SearchTableDataResponse) |
| 29 | + | ||
| 30 | + @doc "源数据表-初始化同步表(首次使用本地存储执行一次)" | ||
| 31 | + @handler syncTable | ||
| 32 | + get /table/sync returns (SyncTableResponse) | ||
| 29 | } | 33 | } |
| 30 | 34 | ||
| 31 | @server( | 35 | @server( |
| @@ -41,14 +45,24 @@ service Core { | @@ -41,14 +45,24 @@ service Core { | ||
| 41 | } | 45 | } |
| 42 | 46 | ||
| 43 | type ( | 47 | type ( |
| 44 | - SearchTableByModuleRequest struct{ | 48 | + SearchTableByModuleRequest { |
| 45 | Token string `header:"x-mmm-accesstoken,optional"` | 49 | Token string `header:"x-mmm-accesstoken,optional"` |
| 46 | } | 50 | } |
| 47 | - SearchTableByModuleResponse struct{ | ||
| 48 | - | 51 | + SearchTableByModuleResponse { |
| 52 | + Count int `json:"count"` | ||
| 53 | + List []SearchTableByModuleItem `json:"list"` | ||
| 54 | + } | ||
| 55 | + SearchTableByModuleItem { | ||
| 56 | + Id int `json:"id"` //ID | ||
| 57 | + TableId int `json:"tableId"` //表ID | ||
| 58 | + Name string `json:"name"` //表名 | ||
| 59 | + TableType string `json:"tableType"` //表类型 | ||
| 60 | + ParentId int `json:"parentId"` //父级ID | ||
| 61 | + Flag string `json:"flag"` //分组:Group 集合:Set | ||
| 62 | + IsLocal bool `json:"isLocal"` //是否本地存储 | ||
| 49 | } | 63 | } |
| 50 | 64 | ||
| 51 | - SearchTableFieldOptionalValuesRequest struct{ | 65 | + SearchTableFieldOptionalValuesRequest { |
| 52 | Token string `header:"x-mmm-accesstoken,optional"` | 66 | Token string `header:"x-mmm-accesstoken,optional"` |
| 53 | ObjectId int `json:"objectId"` // 对象ID | 67 | ObjectId int `json:"objectId"` // 对象ID |
| 54 | Field string `json:"field"` // 当前选择的字段 | 68 | Field string `json:"field"` // 当前选择的字段 |
| @@ -58,11 +72,11 @@ type ( | @@ -58,11 +72,11 @@ type ( | ||
| 58 | //PageSize int `json:"pageSize,optional"` // 页码 | 72 | //PageSize int `json:"pageSize,optional"` // 页码 |
| 59 | Condition []*Condition `json:"conditions,optional"` // 条件 | 73 | Condition []*Condition `json:"conditions,optional"` // 条件 |
| 60 | } | 74 | } |
| 61 | - SearchTableFieldOptionalValuesResponse struct{ | 75 | + SearchTableFieldOptionalValuesResponse { |
| 62 | Values []string `json:"values"` | 76 | Values []string `json:"values"` |
| 63 | Total int64 `json:"total"` | 77 | Total int64 `json:"total"` |
| 64 | } | 78 | } |
| 65 | - Condition struct { | 79 | + Condition { |
| 66 | FieldName string `json:"field"` // 条件字段 | 80 | FieldName string `json:"field"` // 条件字段 |
| 67 | //SqlName string `json:"sqlName,optional"` // 字段SqlName | 81 | //SqlName string `json:"sqlName,optional"` // 字段SqlName |
| 68 | Like string `json:"like,optional"` // 模糊匹配 | 82 | Like string `json:"like,optional"` // 模糊匹配 |
| @@ -70,22 +84,28 @@ type ( | @@ -70,22 +84,28 @@ type ( | ||
| 70 | Order string `json:"order,optional,options=ASC||DESC"` // 排序 ASC DESC 默认ASC | 84 | Order string `json:"order,optional,options=ASC||DESC"` // 排序 ASC DESC 默认ASC |
| 71 | } | 85 | } |
| 72 | 86 | ||
| 73 | - GetTableDetailRequest struct { | 87 | + GetTableDetailRequest { |
| 74 | Token string `header:"x-mmm-accesstoken,optional"` | 88 | Token string `header:"x-mmm-accesstoken,optional"` |
| 75 | TableId int `path:"tableId"` // 表ID | 89 | TableId int `path:"tableId"` // 表ID |
| 76 | } | 90 | } |
| 77 | - GetTableDetailResponse struct{ | ||
| 78 | - | 91 | + GetTableDetailResponse { |
| 79 | } | 92 | } |
| 80 | 93 | ||
| 81 | - SearchTableDataRequest struct{ | 94 | + SearchTableDataRequest { |
| 82 | Token string `header:"x-mmm-accesstoken,optional"` | 95 | Token string `header:"x-mmm-accesstoken,optional"` |
| 83 | ObjectId int `json:"objectId,optional"` // 对象ID | 96 | ObjectId int `json:"objectId,optional"` // 对象ID |
| 84 | PageNumber int `json:"page,optional"` // 分页数 | 97 | PageNumber int `json:"page,optional"` // 分页数 |
| 85 | PageSize int `json:"size,optional"` // 页码 | 98 | PageSize int `json:"size,optional"` // 页码 |
| 86 | Condition []*Condition `json:"conditions,optional"` // 条件 | 99 | Condition []*Condition `json:"conditions,optional"` // 条件 |
| 87 | } | 100 | } |
| 88 | - SearchTableDataResponse struct{ | 101 | + SearchTableDataResponse { |
| 102 | + } | ||
| 103 | + | ||
| 104 | + SyncTableDataPusher { | ||
| 105 | + CompanyId int64 `json:"companyId,string"` //公司ID | ||
| 106 | + ObjectId int `json:"objectId"` | ||
| 107 | + } | ||
| 108 | + SyncTableResponse { | ||
| 89 | 109 | ||
| 90 | } | 110 | } |
| 91 | ) | 111 | ) |
| 1 | - | ||
| 2 | -CREATE TABLE `chart` ( | 1 | +CREATE TABLE `chart` |
| 2 | +( | ||
| 3 | `id` bigint(0) NOT NULL COMMENT 'ID', | 3 | `id` bigint(0) NOT NULL COMMENT 'ID', |
| 4 | `pid` bigint(0) NOT NULL COMMENT '父级ID', | 4 | `pid` bigint(0) NOT NULL COMMENT '父级ID', |
| 5 | `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类型', | 5 | `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类型', |
| @@ -8,7 +8,8 @@ CREATE TABLE `chart` ( | @@ -8,7 +8,8 @@ CREATE TABLE `chart` ( | ||
| 8 | PRIMARY KEY (`id`) USING BTREE | 8 | PRIMARY KEY (`id`) USING BTREE |
| 9 | ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; | 9 | ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; |
| 10 | 10 | ||
| 11 | -CREATE TABLE `chart_setting` ( | 11 | +CREATE TABLE `chart_setting` |
| 12 | +( | ||
| 12 | `id` bigint(0) NOT NULL COMMENT 'ID ', | 13 | `id` bigint(0) NOT NULL COMMENT 'ID ', |
| 13 | `chart_id` bigint(0) NOT NULL COMMENT '图表ID', | 14 | `chart_id` bigint(0) NOT NULL COMMENT '图表ID', |
| 14 | `property` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '属性', | 15 | `property` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '属性', |
| @@ -17,7 +18,26 @@ CREATE TABLE `chart_setting` ( | @@ -17,7 +18,26 @@ CREATE TABLE `chart_setting` ( | ||
| 17 | PRIMARY KEY (`id`) USING BTREE | 18 | PRIMARY KEY (`id`) USING BTREE |
| 18 | ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; | 19 | ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; |
| 19 | 20 | ||
| 20 | -CREATE TABLE `app_page` ( | 21 | +CREATE TABLE `app_page` |
| 22 | +( | ||
| 21 | `id` int(0) NOT NULL COMMENT '唯一标识', | 23 | `id` int(0) NOT NULL COMMENT '唯一标识', |
| 22 | PRIMARY KEY (`id`) USING BTREE | 24 | PRIMARY KEY (`id`) USING BTREE |
| 23 | ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; | 25 | ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; |
| 26 | + | ||
| 27 | +Create Table `object_table` | ||
| 28 | +( | ||
| 29 | + `id` int not null comment 'ID', | ||
| 30 | + PRIMARY KEY (`id`) USING BTREE | ||
| 31 | +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; | ||
| 32 | + | ||
| 33 | +Create Table `object_field` | ||
| 34 | +( | ||
| 35 | + `id` int not null comment 'ID', | ||
| 36 | + PRIMARY KEY (`id`) USING BTREE | ||
| 37 | +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; | ||
| 38 | + | ||
| 39 | +Create Table `object_notice` | ||
| 40 | +( | ||
| 41 | + `id` int not null comment 'ID', | ||
| 42 | + PRIMARY KEY (`id`) USING BTREE | ||
| 43 | +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; |
| @@ -6,10 +6,14 @@ require ( | @@ -6,10 +6,14 @@ require ( | ||
| 6 | github.com/golang-jwt/jwt/v4 v4.5.0 | 6 | github.com/golang-jwt/jwt/v4 v4.5.0 |
| 7 | github.com/jinzhu/copier v0.4.0 | 7 | github.com/jinzhu/copier v0.4.0 |
| 8 | github.com/jinzhu/now v1.1.5 | 8 | github.com/jinzhu/now v1.1.5 |
| 9 | + github.com/magiconair/properties v1.8.0 | ||
| 9 | github.com/pkg/errors v0.9.1 | 10 | github.com/pkg/errors v0.9.1 |
| 11 | + github.com/samber/lo v1.38.1 | ||
| 10 | github.com/stretchr/testify v1.8.4 | 12 | github.com/stretchr/testify v1.8.4 |
| 11 | github.com/tiptok/gocomm v1.0.14 | 13 | github.com/tiptok/gocomm v1.0.14 |
| 14 | + github.com/zeromicro/go-queue v1.1.8 | ||
| 12 | github.com/zeromicro/go-zero v1.5.5 | 15 | github.com/zeromicro/go-zero v1.5.5 |
| 16 | + golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 | ||
| 13 | google.golang.org/grpc v1.57.0 | 17 | google.golang.org/grpc v1.57.0 |
| 14 | gorm.io/driver/mysql v1.5.1 | 18 | gorm.io/driver/mysql v1.5.1 |
| 15 | gorm.io/driver/postgres v1.5.2 | 19 | gorm.io/driver/postgres v1.5.2 |
| @@ -37,7 +41,6 @@ require ( | @@ -37,7 +41,6 @@ require ( | ||
| 37 | github.com/garyburd/redigo v1.6.3 // indirect | 41 | github.com/garyburd/redigo v1.6.3 // indirect |
| 38 | github.com/gin-contrib/sse v0.1.0 // indirect | 42 | github.com/gin-contrib/sse v0.1.0 // indirect |
| 39 | github.com/gin-gonic/gin v1.5.0 // indirect | 43 | github.com/gin-gonic/gin v1.5.0 // indirect |
| 40 | - github.com/go-gota/gota v0.12.0 // indirect | ||
| 41 | github.com/go-logr/logr v1.2.3 // indirect | 44 | github.com/go-logr/logr v1.2.3 // indirect |
| 42 | github.com/go-logr/stdr v1.2.2 // indirect | 45 | github.com/go-logr/stdr v1.2.2 // indirect |
| 43 | github.com/go-openapi/jsonpointer v0.19.6 // indirect | 46 | github.com/go-openapi/jsonpointer v0.19.6 // indirect |
| @@ -73,7 +76,6 @@ require ( | @@ -73,7 +76,6 @@ require ( | ||
| 73 | github.com/json-iterator/go v1.1.12 // indirect | 76 | github.com/json-iterator/go v1.1.12 // indirect |
| 74 | github.com/klauspost/compress v1.15.15 // indirect | 77 | github.com/klauspost/compress v1.15.15 // indirect |
| 75 | github.com/leodido/go-urn v1.1.0 // indirect | 78 | github.com/leodido/go-urn v1.1.0 // indirect |
| 76 | - github.com/magiconair/properties v1.8.0 // indirect | ||
| 77 | github.com/mailru/easyjson v0.7.7 // indirect | 79 | github.com/mailru/easyjson v0.7.7 // indirect |
| 78 | github.com/mattn/go-colorable v0.1.13 // indirect | 80 | github.com/mattn/go-colorable v0.1.13 // indirect |
| 79 | github.com/mattn/go-isatty v0.0.17 // indirect | 81 | github.com/mattn/go-isatty v0.0.17 // indirect |
| @@ -93,7 +95,7 @@ require ( | @@ -93,7 +95,7 @@ require ( | ||
| 93 | github.com/prometheus/common v0.42.0 // indirect | 95 | github.com/prometheus/common v0.42.0 // indirect |
| 94 | github.com/prometheus/procfs v0.10.1 // indirect | 96 | github.com/prometheus/procfs v0.10.1 // indirect |
| 95 | github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect | 97 | github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect |
| 96 | - github.com/samber/lo v1.38.1 // indirect | 98 | + github.com/segmentio/kafka-go v0.4.38 // indirect |
| 97 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect | 99 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect |
| 98 | github.com/spaolacci/murmur3 v1.1.0 // indirect | 100 | github.com/spaolacci/murmur3 v1.1.0 // indirect |
| 99 | github.com/spf13/afero v1.2.2 // indirect | 101 | github.com/spf13/afero v1.2.2 // indirect |
| @@ -121,7 +123,6 @@ require ( | @@ -121,7 +123,6 @@ require ( | ||
| 121 | go.uber.org/multierr v1.9.0 // indirect | 123 | go.uber.org/multierr v1.9.0 // indirect |
| 122 | go.uber.org/zap v1.24.0 // indirect | 124 | go.uber.org/zap v1.24.0 // indirect |
| 123 | golang.org/x/crypto v0.12.0 // indirect | 125 | golang.org/x/crypto v0.12.0 // indirect |
| 124 | - golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect | ||
| 125 | golang.org/x/net v0.14.0 // indirect | 126 | golang.org/x/net v0.14.0 // indirect |
| 126 | golang.org/x/oauth2 v0.7.0 // indirect | 127 | golang.org/x/oauth2 v0.7.0 // indirect |
| 127 | golang.org/x/sys v0.11.0 // indirect | 128 | golang.org/x/sys v0.11.0 // indirect |
| @@ -137,7 +138,7 @@ require ( | @@ -137,7 +138,7 @@ require ( | ||
| 137 | gopkg.in/inf.v0 v0.9.1 // indirect | 138 | gopkg.in/inf.v0 v0.9.1 // indirect |
| 138 | gopkg.in/yaml.v2 v2.4.0 // indirect | 139 | gopkg.in/yaml.v2 v2.4.0 // indirect |
| 139 | gopkg.in/yaml.v3 v3.0.1 // indirect | 140 | gopkg.in/yaml.v3 v3.0.1 // indirect |
| 140 | - gorm.io/datatypes v1.2.0 // indirect | 141 | + gorm.io/driver/sqlite v1.4.3 // indirect |
| 141 | k8s.io/api v0.26.3 // indirect | 142 | k8s.io/api v0.26.3 // indirect |
| 142 | k8s.io/apimachinery v0.27.0-alpha.3 // indirect | 143 | k8s.io/apimachinery v0.27.0-alpha.3 // indirect |
| 143 | k8s.io/client-go v0.26.3 // indirect | 144 | k8s.io/client-go v0.26.3 // indirect |
此 diff 太大无法显示。
-
请 注册 或 登录 后发表评论