Jelajahi Sumber

完成多对多开发

yjp 1 tahun lalu
induk
melakukan
4994f83d92

+ 90 - 5
convenient/relation/many2many/service.go

@@ -3,6 +3,7 @@ package many2many
 import (
 	"git.sxidc.com/go-framework/baize/convenient/binding"
 	"git.sxidc.com/go-framework/baize/convenient/binding/request"
+	"git.sxidc.com/go-framework/baize/convenient/binding/response"
 	"git.sxidc.com/go-framework/baize/framwork/api"
 	"git.sxidc.com/go-framework/baize/framwork/domain"
 	"git.sxidc.com/go-framework/baize/framwork/domain/entity"
@@ -13,7 +14,8 @@ import (
 	"git.sxidc.com/service-supports/fserr"
 )
 
-func Update(middleTableName string, fromTableName string, fromDomainCNName string, fromRelationFieldName string, fromRelationColumnName string,
+func Update(middleTableName string,
+	fromTableName string, fromDomainCNName string, fromRelationFieldName string, fromRelationColumnName string,
 	toTableName string, toRelationColumnName string) binding.ServiceFunc[any] {
 	return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) {
 		object := objects[0]
@@ -117,9 +119,92 @@ func Update(middleTableName string, fromTableName string, fromDomainCNName strin
 	}
 }
 
-func Query[TI any](tableName string) binding.ServiceFunc[TI] {
-	return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (TI, error) {
-		var info TI
-		return info, nil
+func Query[TI any](middleTableName string,
+	fromTableName string, fromRelationColumnName string,
+	toTableName string, toRelationColumnName string) binding.ServiceFunc[response.InfosData[TI]] {
+	return func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (response.InfosData[TI], error) {
+		errResponse := response.InfosData[TI]{
+			Infos: make([]TI, 0),
+		}
+
+		if params == nil {
+			return errResponse, fserr.New("请求参数为空")
+		}
+
+		object := objects[0]
+		if object == nil {
+			return errResponse, fserr.New("领域实体为空")
+		}
+
+		dbExecutor := i.DBExecutor()
+
+		queryParams, ok := params.(request.Query)
+		if !ok {
+			return errResponse, fserr.New("请求参数不是Query接口")
+		}
+
+		fromEntity, ok := object.(entity.Entity)
+		if !ok {
+			return errResponse, fserr.New("领域对象不是实体")
+		}
+
+		// from存在性校验
+		fromExist, err := database.CheckExist(dbExecutor, &sql.CheckExistExecuteParams{
+			TableName:  fromTableName,
+			Conditions: sql.NewConditions().Equal(entity.ColumnID, fromEntity.GetID()),
+		})
+		if err != nil {
+			return errResponse, err
+		}
+
+		if !fromExist {
+			return errResponse, fserr.New(fromEntity.DomainCNName() + "不存在")
+		}
+
+		toIDResults, totalCount, err := database.Query(dbExecutor, &sql.QueryExecuteParams{
+			TableName:     middleTableName,
+			SelectColumns: []string{toRelationColumnName},
+			Conditions:    sql.NewConditions().Equal(fromRelationColumnName, fromEntity.GetID()),
+			PageNo:        queryParams.GetPageNo(),
+			PageSize:      queryParams.GetPageSize(),
+		})
+		if err != nil {
+			return errResponse, err
+		}
+
+		if toIDResults == nil || len(toIDResults) == 0 {
+			return response.InfosData[TI]{
+				Infos:      make([]TI, 0),
+				TotalCount: 0,
+				PageNo:     queryParams.GetPageNo(),
+			}, nil
+		}
+
+		toIDs := make([]string, 0)
+		for _, toIDResult := range toIDResults {
+			toIDs = append(toIDs, toIDResult.ColumnValueString(toRelationColumnName))
+		}
+
+		toResults, _, err := database.Query(dbExecutor, &sql.QueryExecuteParams{
+			TableName:  toTableName,
+			Conditions: sql.NewConditions().In(entity.ColumnID, toIDs),
+		})
+		if err != nil {
+			return errResponse, err
+		}
+
+		infos := make([]TI, 0)
+		err = sql.ParseSqlResult(toResults, &infos)
+		if err != nil {
+			return errResponse, err
+		}
+
+		output := response.InfosData[TI]{
+			Infos:      infos,
+			TotalCount: totalCount,
+			PageNo:     queryParams.GetPageNo(),
+		}
+
+		return output, nil
 	}
 }

+ 21 - 10
convenient/relation/many2many/simple.go

@@ -20,6 +20,9 @@ type Simple[LI any, RI any] struct {
 	// 右领域实体,注意是Entity类型
 	Right entity.Entity
 
+	// 数据库schema
+	Schema string
+
 	// 更新左实体关联使用的请求参数
 	LeftUpdateJsonBody request.Params
 
@@ -46,9 +49,9 @@ func (simple *Simple[LI, RI]) bind(binder *binding.Binder) {
 	rightRelationFieldName := fmt.Sprintf("%sIDs", simple.Left.DomainCamelName())
 
 	middleTableName := entity.SnakeDomainName(simple.Left) + "_and_" + entity.SnakeDomainName(simple.Right)
-	leftTableName := entity.TableName(simple.Left)
+	leftTableName := entity.TableName(simple.Schema, simple.Left)
 	leftRelationColumnName := fmt.Sprintf("%s_id", strcase.ToSnake(simple.Right.DomainCamelName()))
-	rightTableName := entity.TableName(simple.Right)
+	rightTableName := entity.TableName(simple.Schema, simple.Right)
 	rightRelationColumnName := fmt.Sprintf("%s_id", strcase.ToSnake(simple.Left.DomainCamelName()))
 
 	if !options.disableLeft {
@@ -59,18 +62,22 @@ func (simple *Simple[LI, RI]) bind(binder *binding.Binder) {
 				ResponseFunc:  response.SendMsgResponse,
 				RequestParams: simple.LeftUpdateJsonBody,
 				Objects:       []domain.Object{simple.Left},
-				ServiceFunc:   Update(),
+				ServiceFunc: Update(middleTableName,
+					leftTableName, simple.Left.DomainCNName(), leftRelationFieldName, leftRelationColumnName,
+					rightTableName, rightRelationColumnName),
 			})
 		}
 
 		if !options.disableLeftQuery {
 			// 左到右查询
-			binding.GetBind(binder, &binding.SimpleBindItem[RI]{
+			binding.GetBind(binder, &binding.SimpleBindItem[response.InfosData[RI]]{
 				Path:          leftDomainPath + rightDomainPath + "/query",
-				ResponseFunc:  response.SendInfoResponse[RI],
+				ResponseFunc:  response.SendInfosResponse[RI],
 				RequestParams: simple.LeftQueryQueryParams,
 				Objects:       []domain.Object{simple.Left},
-				ServiceFunc:   Query[RI](),
+				ServiceFunc: Query[RI](middleTableName,
+					leftTableName, leftRelationColumnName,
+					rightTableName, rightRelationColumnName),
 			})
 		}
 	}
@@ -83,18 +90,22 @@ func (simple *Simple[LI, RI]) bind(binder *binding.Binder) {
 				ResponseFunc:  response.SendMsgResponse,
 				RequestParams: simple.RightUpdateJsonBody,
 				Objects:       []domain.Object{simple.Right},
-				ServiceFunc:   Update(),
+				ServiceFunc: Update(middleTableName,
+					rightTableName, simple.Right.DomainCNName(), rightRelationFieldName, rightRelationColumnName,
+					leftTableName, leftRelationColumnName),
 			})
 		}
 
 		if !options.disableRightQuery {
 			// 右到左查询
-			binding.GetBind(binder, &binding.SimpleBindItem[RI]{
+			binding.GetBind(binder, &binding.SimpleBindItem[response.InfosData[LI]]{
 				Path:          rightDomainPath + leftDomainPath + "/query",
-				ResponseFunc:  response.SendInfoResponse[RI],
+				ResponseFunc:  response.SendInfosResponse[LI],
 				RequestParams: simple.RightQueryQueryParams,
 				Objects:       []domain.Object{simple.Right},
-				ServiceFunc:   Query[RI](),
+				ServiceFunc: Query[LI](middleTableName,
+					rightTableName, rightRelationColumnName,
+					leftTableName, leftRelationColumnName),
 			})
 		}
 	}

+ 3 - 3
convenient/relation/one2one/simple.go

@@ -110,12 +110,12 @@ func (simple *Simple[LI, RI]) bind(binder *binding.Binder) {
 
 		if !options.disableRightQuery {
 			// 右到左查询
-			binding.GetBind(binder, &binding.SimpleBindItem[RI]{
+			binding.GetBind(binder, &binding.SimpleBindItem[LI]{
 				Path:          rightDomainPath + leftDomainPath + "/query",
-				ResponseFunc:  response.SendInfoResponse[RI],
+				ResponseFunc:  response.SendInfoResponse[LI],
 				RequestParams: simple.RightQueryQueryParams,
 				Objects:       []domain.Object{simple.Right},
-				ServiceFunc:   Query[RI](rightTableName, leftTableName, leftRelationColumnName),
+				ServiceFunc:   Query[LI](rightTableName, leftTableName, leftRelationColumnName),
 			})
 		}