package aliasmanagement import ( "context" "fmt" "git.x2erp.com/qdy/go-base/ctx" "git.x2erp.com/qdy/go-base/logger" "git.x2erp.com/qdy/go-base/model/response" "git.x2erp.com/qdy/go-base/util" "git.x2erp.com/qdy/go-db/factory/database" "git.x2erp.com/qdy/go-svc-configure/internal/tables" "github.com/google/uuid" "github.com/jmoiron/sqlx" ) // BatchSaveTableFieldAliasFlow 批量保存字段别名字典流水记录 func BatchSaveTableFieldAliasFlow(req *BatchTableFieldAliasRequest, tenantID string, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[[]tables.DicTableFieldAliasFlowDB] { logger.Debug(fmt.Sprintf("BatchSaveTableFieldAliasFlow-开始批量保存字段别名字典流水,租户ID: %s, 数量: %d", tenantID, len(req.Items))) // 参数验证 if tenantID == "" { logger.ErrorC(reqCtx, "租户ID不能为空") return util.CreateErrorResult[[]tables.DicTableFieldAliasFlowDB]("租户ID不能为空", reqCtx) } if len(req.Items) == 0 { logger.ErrorC(reqCtx, "批量保存的字段别名字典列表不能为空") return util.CreateErrorResult[[]tables.DicTableFieldAliasFlowDB]("批量保存的字段别名字典列表不能为空", reqCtx) } for i, item := range req.Items { if err := validateTableFieldAliasRequest(&item); err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("第%d个字段别名参数验证失败: %v", i+1, err)) return util.CreateErrorResult[[]tables.DicTableFieldAliasFlowDB](fmt.Sprintf("第%d个字段别名参数验证失败: %v", i+1, err), reqCtx) } } // 获取数据库连接并开始事务 db := dbFactory.GetDB() tx, err := db.BeginTxx(ctx, nil) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("开始事务失败: %v", err)) return util.CreateErrorResult[[]tables.DicTableFieldAliasFlowDB](fmt.Sprintf("开始事务失败: %v", err), reqCtx) } defer func() { if p := recover(); p != nil { tx.Rollback() panic(p) } }() var savedItems []tables.DicTableFieldAliasFlowDB var errors []string // 批量处理每个字段别名流水记录 for i, item := range req.Items { logger.Debug(fmt.Sprintf("处理第%d个字段别名流水记录: field_id=%s, field_alias=%s", i+1, item.FieldID, item.FieldAlias)) // 检查是否已存在相同的流水记录(基于field_alias和tenant_id) exists, err := checkTableFieldAliasFlowExists(ctx, tx, item.FieldAlias, tenantID) if err != nil { errors = append(errors, fmt.Sprintf("第%d个字段别名流水记录检查存在性失败: %v", i+1, err)) continue } var tableFieldAliasFlow tables.DicTableFieldAliasFlowDB if exists { // 更新流水记录(保持审批状态不变) tableFieldAliasFlow, err = updateTableFieldAliasFlow(ctx, tx, &item, tenantID) if err != nil { errors = append(errors, fmt.Sprintf("第%d个字段别名流水记录更新失败: %v", i+1, err)) continue } logger.Debug(fmt.Sprintf("更新字段别名流水记录成功: %s", item.FieldAlias)) } else { // 插入新的流水记录 tableFieldAliasFlow, err = insertTableFieldAliasFlow(ctx, tx, &item, tenantID) if err != nil { errors = append(errors, fmt.Sprintf("第%d个字段别名流水记录插入失败: %v", i+1, err)) continue } logger.Debug(fmt.Sprintf("插入字段别名流水记录成功: %s", item.FieldAlias)) } savedItems = append(savedItems, tableFieldAliasFlow) } // 如果有错误,回滚事务 if len(errors) > 0 { tx.Rollback() errorMsg := "" for i, errMsg := range errors { if i > 0 { errorMsg += "; " } errorMsg += errMsg } logger.ErrorC(reqCtx, fmt.Sprintf("批量保存字段别名字典流水失败: %s", errorMsg)) return util.CreateErrorResult[[]tables.DicTableFieldAliasFlowDB](fmt.Sprintf("批量保存字段别名字典流水失败: %s", errorMsg), reqCtx) } // 提交事务 if err := tx.Commit(); err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("提交事务失败: %v", err)) return util.CreateErrorResult[[]tables.DicTableFieldAliasFlowDB](fmt.Sprintf("提交事务失败: %v", err), reqCtx) } logger.Debug(fmt.Sprintf("成功批量保存 %d 个字段别名字典流水记录", len(savedItems))) return util.CreateSuccessResultData[[]tables.DicTableFieldAliasFlowDB](savedItems, reqCtx) } // checkTableFieldAliasFlowExists 检查字段别名流水记录是否存在(基于field_alias和tenant_id) func checkTableFieldAliasFlowExists(ctx context.Context, tx *sqlx.Tx, fieldAlias, tenantID string) (bool, error) { var count int query := "SELECT COUNT(*) FROM dic_table_field_alias_flow WHERE field_alias = ? AND tenant_id = ? AND deleted_at IS NULL" err := tx.GetContext(ctx, &count, query, fieldAlias, tenantID) return count > 0, err } // updateTableFieldAliasFlow 更新字段别名流水记录 func updateTableFieldAliasFlow(ctx context.Context, tx *sqlx.Tx, req *TableFieldAliasRequest, tenantID string) (tables.DicTableFieldAliasFlowDB, error) { query := ` UPDATE dic_table_field_alias_flow SET field_id = ?, table_id = ?, field_name = ?, description = ?, where_condition = ?, updated_at = CURRENT_TIMESTAMP WHERE field_alias = ? AND tenant_id = ? AND deleted_at IS NULL ` _, err := tx.ExecContext(ctx, query, req.FieldID, req.TableID, req.FieldName, req.Description, req.WhereCondition, req.FieldAlias, tenantID, ) if err != nil { return tables.DicTableFieldAliasFlowDB{}, err } // 查询更新后的记录 var tableFieldAliasFlow tables.DicTableFieldAliasFlowDB selectQuery := ` SELECT id, field_id, table_id, field_name, field_alias, description, where_condition, tenant_id, approval_status, approver, approved_at, created_at, updated_at, deleted_at FROM dic_table_field_alias_flow WHERE field_alias = ? AND tenant_id = ? AND deleted_at IS NULL ` err = tx.GetContext(ctx, &tableFieldAliasFlow, selectQuery, req.FieldAlias, tenantID) return tableFieldAliasFlow, err } // insertTableFieldAliasFlow 插入字段别名流水记录 func insertTableFieldAliasFlow(ctx context.Context, tx *sqlx.Tx, req *TableFieldAliasRequest, tenantID string) (tables.DicTableFieldAliasFlowDB, error) { // 生成ID id := uuid.New().String() query := ` INSERT INTO dic_table_field_alias_flow (id, field_id, table_id, field_name, field_alias, description, where_condition, tenant_id, approval_status, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) ` _, err := tx.ExecContext(ctx, query, id, req.FieldID, req.TableID, req.FieldName, req.FieldAlias, req.Description, req.WhereCondition, tenantID, ) if err != nil { return tables.DicTableFieldAliasFlowDB{}, err } // 查询刚插入的记录 var tableFieldAliasFlow tables.DicTableFieldAliasFlowDB selectQuery := ` SELECT id, field_id, table_id, field_name, field_alias, description, where_condition, tenant_id, approval_status, approver, approved_at, created_at, updated_at, deleted_at FROM dic_table_field_alias_flow WHERE field_alias = ? AND tenant_id = ? AND deleted_at IS NULL ` err = tx.GetContext(ctx, &tableFieldAliasFlow, selectQuery, req.FieldAlias, tenantID) return tableFieldAliasFlow, err }