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" ) // BatchSaveTableAliasFlow 批量保存表别名字典流水记录 func BatchSaveTableAliasFlow(req *BatchTableAliasRequest, tenantID string, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[[]tables.DicTableAliasFlowDB] { logger.Debug(fmt.Sprintf("BatchSaveTableAliasFlow-开始批量保存表别名字典流水,租户ID: %s, 数量: %d", tenantID, len(req.Items))) // 参数验证 if tenantID == "" { logger.ErrorC(reqCtx, "租户ID不能为空") return util.CreateErrorResult[[]tables.DicTableAliasFlowDB]("租户ID不能为空", reqCtx) } if len(req.Items) == 0 { logger.ErrorC(reqCtx, "批量保存的表别名字典列表不能为空") return util.CreateErrorResult[[]tables.DicTableAliasFlowDB]("批量保存的表别名字典列表不能为空", reqCtx) } for i, item := range req.Items { if err := validateTableAliasRequest(&item); err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("第%d个表别名参数验证失败: %v", i+1, err)) return util.CreateErrorResult[[]tables.DicTableAliasFlowDB](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.DicTableAliasFlowDB](fmt.Sprintf("开始事务失败: %v", err), reqCtx) } defer func() { if p := recover(); p != nil { tx.Rollback() panic(p) } }() var savedItems []tables.DicTableAliasFlowDB var errors []string // 批量处理每个表别名流水记录 for i, item := range req.Items { logger.Debug(fmt.Sprintf("处理第%d个表别名流水记录: table_id=%s, table_alias=%s", i+1, item.TableID, item.TableAlias)) // 检查是否已存在相同的流水记录(基于table_alias和tenant_id) exists, err := checkTableAliasFlowExists(ctx, tx, item.TableAlias, tenantID) if err != nil { errors = append(errors, fmt.Sprintf("第%d个表别名流水记录检查存在性失败: %v", i+1, err)) continue } var tableAliasFlow tables.DicTableAliasFlowDB if exists { // 更新流水记录(保持审批状态不变) tableAliasFlow, err = updateTableAliasFlow(ctx, tx, &item, tenantID) if err != nil { errors = append(errors, fmt.Sprintf("第%d个表别名流水记录更新失败: %v", i+1, err)) continue } logger.Debug(fmt.Sprintf("更新表别名流水记录成功: %s", item.TableAlias)) } else { // 插入新的流水记录 tableAliasFlow, err = insertTableAliasFlow(ctx, tx, &item, tenantID) if err != nil { errors = append(errors, fmt.Sprintf("第%d个表别名流水记录插入失败: %v", i+1, err)) continue } logger.Debug(fmt.Sprintf("插入表别名流水记录成功: %s", item.TableAlias)) } savedItems = append(savedItems, tableAliasFlow) } // 如果有错误,回滚事务 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.DicTableAliasFlowDB](fmt.Sprintf("批量保存表别名字典流水失败: %s", errorMsg), reqCtx) } // 提交事务 if err := tx.Commit(); err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("提交事务失败: %v", err)) return util.CreateErrorResult[[]tables.DicTableAliasFlowDB](fmt.Sprintf("提交事务失败: %v", err), reqCtx) } logger.Debug(fmt.Sprintf("成功批量保存 %d 个表别名字典流水记录", len(savedItems))) return util.CreateSuccessResultData[[]tables.DicTableAliasFlowDB](savedItems, reqCtx) } // checkTableAliasFlowExists 检查表别名流水记录是否存在(基于table_alias和tenant_id) func checkTableAliasFlowExists(ctx context.Context, tx *sqlx.Tx, tableAlias, tenantID string) (bool, error) { var count int query := "SELECT COUNT(*) FROM dic_table_alias_flow WHERE table_alias = ? AND tenant_id = ? AND deleted_at IS NULL" err := tx.GetContext(ctx, &count, query, tableAlias, tenantID) return count > 0, err } // updateTableAliasFlow 更新表别名流水记录 func updateTableAliasFlow(ctx context.Context, tx *sqlx.Tx, req *TableAliasRequest, tenantID string) (tables.DicTableAliasFlowDB, error) { query := ` UPDATE dic_table_alias_flow SET table_id = ?, updated_at = CURRENT_TIMESTAMP WHERE table_alias = ? AND tenant_id = ? AND deleted_at IS NULL ` _, err := tx.ExecContext(ctx, query, req.TableID, req.TableAlias, tenantID, ) if err != nil { return tables.DicTableAliasFlowDB{}, err } // 查询更新后的记录 var tableAliasFlow tables.DicTableAliasFlowDB selectQuery := ` SELECT id, table_id, table_alias, tenant_id, approval_status, approver, approved_at, created_at, updated_at, deleted_at FROM dic_table_alias_flow WHERE table_alias = ? AND tenant_id = ? AND deleted_at IS NULL ` err = tx.GetContext(ctx, &tableAliasFlow, selectQuery, req.TableAlias, tenantID) return tableAliasFlow, err } // insertTableAliasFlow 插入表别名流水记录 func insertTableAliasFlow(ctx context.Context, tx *sqlx.Tx, req *TableAliasRequest, tenantID string) (tables.DicTableAliasFlowDB, error) { // 生成ID id := uuid.New().String() query := ` INSERT INTO dic_table_alias_flow (id, table_id, table_alias, tenant_id, approval_status, created_at, updated_at) VALUES (?, ?, ?, ?, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) ` _, err := tx.ExecContext(ctx, query, id, req.TableID, req.TableAlias, tenantID, ) if err != nil { return tables.DicTableAliasFlowDB{}, err } // 查询刚插入的记录 var tableAliasFlow tables.DicTableAliasFlowDB selectQuery := ` SELECT id, table_id, table_alias, tenant_id, approval_status, approver, approved_at, created_at, updated_at, deleted_at FROM dic_table_alias_flow WHERE table_alias = ? AND tenant_id = ? AND deleted_at IS NULL ` err = tx.GetContext(ctx, &tableAliasFlow, selectQuery, req.TableAlias, tenantID) return tableAliasFlow, err }