save_chart_logic.go 3.5 KB
package chart

import (
	"context"
	"encoding/json"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/db/transaction"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/interanl/pkg/domain"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/contextdata"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/tool"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/pkg/xerr"

	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/svc"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-bchart/cmd/chart-server/api/internal/types"

	"github.com/zeromicro/go-zero/core/logx"
)

type SaveChartLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewSaveChartLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SaveChartLogic {
	return &SaveChartLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *SaveChartLogic) SaveChart(req *types.ChartSaveRequest) (resp *types.ChartSaveResponse, err error) {
	var (
		conn = l.svcCtx.DefaultDBConn()
		//parentChart  *domain.Chart
		chart        *domain.Chart
		chartSetting *domain.ChartSetting
		tenantId     = contextdata.GetTenantFromCtx(l.ctx)
	)
	if !domain.ChartTypeContain(req.Type) {
		return nil, xerr.NewErrMsgErr("未知类型:"+req.Type, err)
	}
	chart = &domain.Chart{
		Name:      req.Name,
		Type:      req.Type,
		Pid:       req.Pid,
		Sort:      1,
		Group:     tool.Krand(10, tool.KC_RAND_KIND_UPPER),
		TenantId:  tenantId,
		ChartType: req.ChartType,
		Cover:     req.Cover,
	}
	if chart.Name == "" {
		chart.Name = chart.RandName()
	}
	//if req.Pid > 0 {
	//	if parentChart, err = l.svcCtx.ChartRepository.FindOne(l.ctx, conn, req.Pid); err != nil {
	//		return nil, xerr.NewErrMsgErr("父级不存在", err)
	//	}
	//	chart.Group = parentChart.Group
	//}
	// current sort
	//if currentSortChart, _ := l.svcCtx.ChartRepository.FindOneByGroup(l.ctx, conn, tenantId, req.Pid); currentSortChart != nil {
	//	chart.Sort = currentSortChart.Sort + 1
	//}
	if total, _, _ := l.svcCtx.ChartRepository.FindByTypeAndName(l.ctx, conn, tenantId, req.Type, req.Name); total > 0 {
		return nil, xerr.NewErrMsgErr("图表名字重复", nil)
	}
	if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
		if chart, err = l.svcCtx.ChartRepository.Insert(ctx, conn, chart); err != nil {
			return err
		}

		chartProperty := types.NewProperty(req.ChartProperty)
		chartSetting = &domain.ChartSetting{
			ChartId:       chart.Id,
			DataSourceId:  chartProperty.GetFirstDataSourceId(),
			DataSourceIds: chartProperty.GetAllDataSourceId(),
			ChartType:     chart.ChartType,
			Title:         chartProperty.Title,
			TableAbility:  chartProperty.TableAbility,
			Series:        chartProperty.Series,
			Other:         chartProperty.Other,
			TenantId:      chart.TenantId,
		}
		if chartSetting, err = l.svcCtx.ChartSettingRepository.Insert(l.ctx, conn, chartSetting); err != nil {
			return err
		}
		return nil
	}, true); err != nil {
		return nil, xerr.NewErrMsgErr("创建失败", err)
	}
	if len(chartSetting.DataSourceIds) > 0 {
		for _, sourceId := range chartSetting.DataSourceIds {
			pusher := &types.SyncTableDataPusher{
				CompanyId: tenantId,
				ObjectId:  int(sourceId),
			}
			mBytes, _ := json.Marshal(pusher)
			_, _ = l.svcCtx.Redis.LpushCtx(l.ctx, l.svcCtx.Config.Name+":table_data", string(mBytes))
		}
	}
	resp = &types.ChartSaveResponse{
		Chart: types.NewChartItemWithSetting(chart, chartSetting),
	}
	return
}