|
|
@@ -5,11 +5,114 @@ import (
|
|
|
"git.sxidc.com/go-framework/baize/convenient/binding/request"
|
|
|
"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"
|
|
|
"git.sxidc.com/go-framework/baize/framwork/infrastructure"
|
|
|
+ "git.sxidc.com/go-framework/baize/framwork/infrastructure/database"
|
|
|
+ "git.sxidc.com/go-framework/baize/framwork/infrastructure/database/sql"
|
|
|
+ "git.sxidc.com/go-tools/utils/slice"
|
|
|
+ "git.sxidc.com/service-supports/fserr"
|
|
|
)
|
|
|
|
|
|
-func Update(tableName string) binding.ServiceFunc[any] {
|
|
|
+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]
|
|
|
+ if object == nil {
|
|
|
+ return nil, fserr.New("领域实体为空")
|
|
|
+ }
|
|
|
+
|
|
|
+ dbExecutor := i.DBExecutor()
|
|
|
+
|
|
|
+ fromEntity, ok := object.(entity.Entity)
|
|
|
+ if !ok {
|
|
|
+ return nil, fserr.New("领域对象不是实体")
|
|
|
+ }
|
|
|
+
|
|
|
+ // 字段校验
|
|
|
+ err := fromEntity.CheckFieldID(fromEntity.DomainCNName())
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ // from存在性校验
|
|
|
+ fromExist, err := database.CheckExist(dbExecutor, &sql.CheckExistExecuteParams{
|
|
|
+ TableName: fromTableName,
|
|
|
+ Conditions: sql.NewConditions().Equal(entity.ColumnID, fromEntity.GetID()),
|
|
|
+ })
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ if !fromExist {
|
|
|
+ return nil, fserr.New(fromEntity.DomainCNName() + "不存在")
|
|
|
+ }
|
|
|
+
|
|
|
+ if !domain.HasField(object, fromRelationFieldName) {
|
|
|
+ return nil, fserr.New("关联字段" + fromRelationFieldName + "不存在")
|
|
|
+ }
|
|
|
+
|
|
|
+ toIDs, err := domain.Field[[]string](object, fromRelationFieldName)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ if toIDs != nil && len(toIDs) != 0 {
|
|
|
+ for _, toID := range toIDs {
|
|
|
+ err := entity.CheckID(fromDomainCNName, fromRelationFieldName, toID)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ toIDs = slice.RemoveRepeatElement(toIDs)
|
|
|
+ }
|
|
|
+
|
|
|
+ err = database.Transaction(dbExecutor, func(tx database.Executor) error {
|
|
|
+ err := database.Delete(tx, &sql.DeleteExecuteParams{
|
|
|
+ TableName: middleTableName,
|
|
|
+ Conditions: sql.NewConditions().Equal(fromRelationColumnName, fromEntity.GetID()),
|
|
|
+ })
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if toIDs == nil || len(toIDs) == 0 {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ toCount, err := database.Count(dbExecutor, &sql.CountExecuteParams{
|
|
|
+ TableName: toTableName,
|
|
|
+ Conditions: sql.NewConditions().In(entity.ColumnID, toIDs),
|
|
|
+ })
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if int(toCount) != len(toIDs) {
|
|
|
+ return fserr.New("部分{{ $toCNName }}不存在")
|
|
|
+ }
|
|
|
+
|
|
|
+ tableRows := make([]sql.TableRow, len(toIDs))
|
|
|
+ for index, toID := range toIDs {
|
|
|
+ tableRows[index] = *(sql.NewTableRow().
|
|
|
+ Add(fromRelationColumnName, fromEntity.GetID()).
|
|
|
+ Add(toRelationColumnName, toID))
|
|
|
+ }
|
|
|
+
|
|
|
+ err = database.InsertBatch(tx, &sql.InsertBatchExecuteParams{
|
|
|
+ TableName: middleTableName,
|
|
|
+ TableRowBatch: tableRows,
|
|
|
+ })
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+ })
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
return nil, nil
|
|
|
}
|
|
|
}
|