diff --git a/pkg/service/cast/media.go b/pkg/service/cast/media.go index 3a2e7fd..f50edf5 100644 --- a/pkg/service/cast/media.go +++ b/pkg/service/cast/media.go @@ -12,6 +12,7 @@ import ( "fonchain-fiee/cmd/config" "fonchain-fiee/pkg/e" modelCast "fonchain-fiee/pkg/model/cast" + "fonchain-fiee/pkg/model/login" "fonchain-fiee/pkg/service" "fonchain-fiee/pkg/utils" "net/http" @@ -522,330 +523,128 @@ func SyncAsProfile(ctx *gin.Context) { // ImportMediaAccount 导入自媒体账号 func ImportMediaAccount(ctx *gin.Context) { - var failedRecords []FailedRecord - var successRecords []SuccessRecord - - // 1. 接收上传的Excel文件 excelFile, err := ctx.FormFile("file") if err != nil { - service.Error(ctx, errors.New("缺少Excel文件")) + service.Error(ctx, err) return } - - // 2. 保存临时文件 tempDir := "./runtime/media" _, err = utils.CheckDirPath(tempDir, true) if err != nil { service.Error(ctx, err) return } - fileName := fmt.Sprintf("%d_media_account.xlsx", time.Now().UnixMicro()) excelPath := filepath.Join(tempDir, fileName) if err = ctx.SaveUploadedFile(excelFile, excelPath); err != nil { service.Error(ctx, err) return } - - // 3. 读取Excel数据 - mediaAccounts, err := readMediaAccountExcel(excelPath) + excelData, err := excelize.OpenFile(excelPath) if err != nil { - service.Error(ctx, fmt.Errorf("读取Excel失败: %w", err)) + service.Error(ctx, err) return } - - if len(mediaAccounts) == 0 { - service.Error(ctx, errors.New("Excel中没有有效数据")) + defer excelData.Close() + rows, err := excelData.GetRows("Sheet1") + if err != nil { + service.Error(ctx, err) return } - - // 4. 处理每个账号 - for _, account := range mediaAccounts { - for platformID, accountInfo := range account.Account { - // 跳过空账号信息 - if accountInfo.AccountId == "" && accountInfo.NickName == "" { - continue + loginInfo := login.GetUserInfoFromC(ctx) + for line, row := range rows { + if line == 0 { + continue + } + if len(row) < 3 { + continue + } + subNum := strings.TrimSpace(row[1]) + if subNum == "" { + continue + } + var subInfoResp *accountFiee.UserInfoResponse + //查询艺人信息 + if config.AppConfig.System.AppMode == "dev" { + subInfoResp = &accountFiee.UserInfoResponse{ + Id: 0, + SubNum: "", } - - // 查询用户信息 - res, err := service.AccountFieeProvider.UserList(context.Background(), &accountFiee.UserListRequest{ - Name: account.Name, - SubNum: account.SubNum, - }) - if err != nil { - failedRecords = append(failedRecords, FailedRecord{ - Name: account.Name, - SubNum: account.SubNum, - Platform: modelCast.PlatformNameKv[uint32(platformID)], - Msg: fmt.Sprintf("获取用户信息失败: %s", err.Error()), - }) - continue - } - - if res.Count == 0 { - failedRecords = append(failedRecords, FailedRecord{ - Name: account.Name, - SubNum: account.SubNum, - Platform: modelCast.PlatformNameKv[uint32(platformID)], - Msg: "未找到用户信息", - }) - continue - } - - // 获取用户详细信息 - var infoResp *accountFiee.UserInfoResponse - infoResp, err = GetArtistAccountInfo(res.UserList[0].Id) - if err != nil { - failedRecords = append(failedRecords, FailedRecord{ - Name: account.Name, - SubNum: account.SubNum, - Platform: modelCast.PlatformNameKv[uint32(platformID)], - Msg: fmt.Sprintf("查询用户详细信息失败: %s", err.Error()), - }) - continue - } - - if infoResp.SubNum == "" { - failedRecords = append(failedRecords, FailedRecord{ - Name: account.Name, - SubNum: account.SubNum, - Platform: modelCast.PlatformNameKv[uint32(platformID)], - Msg: "用户不存在", - }) - continue - } - - // 检查并创建AS Profile - if err = CheckAsProfile(infoResp); err != nil { - failedRecords = append(failedRecords, FailedRecord{ - Name: account.Name, - SubNum: account.SubNum, - Platform: modelCast.PlatformNameKv[uint32(platformID)], - Msg: fmt.Sprintf("创建AS Profile失败: %s", err.Error()), - }) - continue - } - - // 验证平台ID - if _, ok := cast.PlatformIDENUM_name[int32(platformID)]; !ok { - failedRecords = append(failedRecords, FailedRecord{ - Name: account.Name, - SubNum: account.SubNum, - Platform: modelCast.PlatformNameKv[uint32(platformID)], - Msg: "无效的平台ID", - }) - continue - } - - artistUuid := strconv.FormatUint(res.UserList[0].Id, 10) - userID := int32(res.UserList[0].Id) - - // 查询该艺人是否已存在该平台账号 - userResp, err := service.CastProvider.MediaUserList(context.Background(), &cast.MediaUserListReq{ - ArtistUuid: artistUuid, - Page: 1, - PageSize: 100, - }) - if err != nil { - failedRecords = append(failedRecords, FailedRecord{ - Name: account.Name, - SubNum: account.SubNum, - Platform: modelCast.PlatformNameKv[uint32(platformID)], - Msg: fmt.Sprintf("查询已有账号失败: %s", err.Error()), - }) - continue - } - - // 检查是否已经存在该平台的账号 - accountExists := false - if userResp != nil && len(userResp.Data) > 0 { - for _, v := range userResp.Data { - if v.PlatformID == uint32(platformID) { - accountExists = true - break - } - } - } - - if accountExists { - failedRecords = append(failedRecords, FailedRecord{ - Name: account.Name, - SubNum: account.SubNum, - Platform: modelCast.PlatformNameKv[uint32(platformID)], - Msg: "该平台账号已存在", - }) - continue - } - - // 检查并消耗账户余额 - if _, err = CheckUserBundleBalance(userID, modelCast.BalanceTypeAccountValue); err != nil { - failedRecords = append(failedRecords, FailedRecord{ - Name: account.Name, - SubNum: account.SubNum, - Platform: modelCast.PlatformNameKv[uint32(platformID)], - Msg: fmt.Sprintf("账户余额不足: %s", err.Error()), - }) - continue - } - - // 增加账户消耗数量 - _, err = service.BundleProvider.AddBundleBalance(context.Background(), &bundle.AddBundleBalanceReq{ - UserId: userID, - AccountConsumptionNumber: 1, - }) - if err != nil { - failedRecords = append(failedRecords, FailedRecord{ - Name: account.Name, - SubNum: account.SubNum, - Platform: modelCast.PlatformNameKv[uint32(platformID)], - Msg: fmt.Sprintf("扣除账户余额失败: %s", err.Error()), - }) - continue - } - - // 创建自媒体账号 - mediaAccountResp, err := service.CastProvider.UpdateMediaAccount(ctx, &cast.UpdateMediaAccountReq{ - ArtistUuid: artistUuid, - PlatformID: platformID, - PlatformUserName: accountInfo.NickName, - PlatformUserID: accountInfo.AccountId, - ArtistName: infoResp.Name, - ArtistPhone: infoResp.TelNum, - ArtistPhoneAreaCode: infoResp.TelAreaCode, - ArtistSubNum: infoResp.SubNum, - }) - - if err != nil { - // 创建失败,回退余额 - _, _ = service.BundleProvider.AddBundleBalance(context.Background(), &bundle.AddBundleBalanceReq{ - UserId: userID, - AccountConsumptionNumber: -1, - }) - failedRecords = append(failedRecords, FailedRecord{ - Name: account.Name, - SubNum: account.SubNum, - Platform: modelCast.PlatformNameKv[uint32(platformID)], - Msg: fmt.Sprintf("创建账号失败: %s", err.Error()), - }) - continue - } - - // 记录成功 - successRecords = append(successRecords, SuccessRecord{ - MediaAccountUuid: mediaAccountResp.MediaAccountUuid, - Name: account.Name, - SubNum: account.SubNum, - Platform: modelCast.PlatformNameKv[uint32(platformID)], - PlatformUserName: accountInfo.NickName, - PlatformUserID: accountInfo.AccountId, + } else { + subInfoResp, err = service.AccountFieeProvider.SubNumGetInfo(context.Background(), &accountFiee.SubNumGetInfoRequest{ + SubNum: subNum, + Domain: "app", }) } - } - // 5. 返回结果 + if err != nil { + excelSetRemark(excelData, line, "查询艺人出错") + continue + } + if subInfoResp.Id == 0 { + excelSetRemark(excelData, line, "艺人不存在") + continue + } + var tiktokName, insName, dmName string + if len(row) >= 3 { + tiktokName = strings.TrimSpace(row[2]) + } + if len(row) >= 4 { + insName = strings.TrimSpace(row[3]) + } + if len(row) >= 5 { + dmName = strings.TrimSpace(row[4]) + } + if tiktokName == "" && insName == "" && dmName == "" { + excelSetRemark(excelData, line, "请填写账号") + continue + } + if tiktokName != "" { + if err = updateMediaAccount(tiktokName, cast.PlatformIDENUM_TIKTOK, subInfoResp, loginInfo); err != nil { + excelSetRemark(excelData, line, err.Error()) + } + } + if insName != "" { + if err = updateMediaAccount(tiktokName, cast.PlatformIDENUM_INS, subInfoResp, loginInfo); err != nil { + excelSetRemark(excelData, line, err.Error()) + } + } + if dmName != "" { + if err = updateMediaAccount(tiktokName, cast.PlatformIDENUM_DM, subInfoResp, loginInfo); err != nil { + excelSetRemark(excelData, line, err.Error()) + } + } + } + urlHost := config.AppConfig.System.FieeHost + urlResult := fmt.Sprintf("%s/api/fiee/static/media/%s", urlHost, fileName) service.Success(ctx, map[string]interface{}{ - "successCount": len(successRecords), - "failedCount": len(failedRecords), - "successRecords": successRecords, - "failedRecords": failedRecords, + "successCount": 0, + "failCount": 0, + "url": urlResult, }) + return } -// readMediaAccountExcel 读取自媒体账号Excel文件 -func readMediaAccountExcel(excelPath string) ([]MediaAccountImport, error) { - f, err := excelize.OpenFile(excelPath) - if err != nil { - return nil, err +func excelSetRemark(excelData *excelize.File, line int, remark string) { + oldRemark, _ := excelData.GetCellValue("Sheet1", fmt.Sprintf("%s%d", "F", line+1)) + if oldRemark != "" { + remark = fmt.Sprintf("%s\n;%s", oldRemark, remark) } - defer f.Close() - - sheetName := f.GetSheetName(0) - rows, err := f.GetRows(sheetName) - if err != nil { - return nil, err - } - - var accounts []MediaAccountImport - for i, row := range rows { - // 跳过表头 - if i == 0 || len(row) < 3 { - continue - } - - // 获取基本信息 - index := strings.TrimSpace(row[0]) - name := strings.TrimSpace(row[1]) - subNum := strings.TrimSpace(row[2]) - - if name == "" && subNum == "" { - continue - } - - tmp := MediaAccountImport{ - Index: index, - Name: name, - SubNum: subNum, - Account: make(map[cast.PlatformIDENUM]AccountInfo), - } - - // 读取TikTok账号信息 (列D, E) - tiktokId, _ := f.GetCellValue(sheetName, fmt.Sprintf("D%d", i+1)) - tiktokNickName, _ := f.GetCellValue(sheetName, fmt.Sprintf("E%d", i+1)) - tmp.Account[cast.PlatformIDENUM_TIKTOK] = AccountInfo{ - AccountId: strings.TrimSpace(tiktokId), - NickName: strings.TrimSpace(tiktokNickName), - } - - // 读取YouTube账号信息 (列F, G) - youtubeId, _ := f.GetCellValue(sheetName, fmt.Sprintf("F%d", i+1)) - youtubeNickName, _ := f.GetCellValue(sheetName, fmt.Sprintf("G%d", i+1)) - tmp.Account[cast.PlatformIDENUM_YOUTUBE] = AccountInfo{ - AccountId: strings.TrimSpace(youtubeId), - NickName: strings.TrimSpace(youtubeNickName), - } - - // 读取Instagram账号信息 (列H, I) - insId, _ := f.GetCellValue(sheetName, fmt.Sprintf("H%d", i+1)) - insNickName, _ := f.GetCellValue(sheetName, fmt.Sprintf("I%d", i+1)) - tmp.Account[cast.PlatformIDENUM_INS] = AccountInfo{ - AccountId: strings.TrimSpace(insId), - NickName: strings.TrimSpace(insNickName), - } - - accounts = append(accounts, tmp) - } - - return accounts, nil + excelData.SetCellValue("Sheet1", fmt.Sprintf("%s%d", "F", line+1), remark) } -// MediaAccountImport 自媒体账号导入结构 -type MediaAccountImport struct { - Index string `json:"index"` - Name string `json:"name"` - SubNum string `json:"subNum"` - Account map[cast.PlatformIDENUM]AccountInfo `json:"account"` -} - -// AccountInfo 账号信息 -type AccountInfo struct { - NickName string `json:"nickName"` - AccountId string `json:"accountId"` -} - -// FailedRecord 失败记录 -type FailedRecord struct { - Name string `json:"name"` - SubNum string `json:"subNum"` - Platform string `json:"platform"` - Msg string `json:"msg"` -} - -// SuccessRecord 成功记录 -type SuccessRecord struct { - MediaAccountUuid string `json:"mediaAccountUuid"` - Name string `json:"name"` - SubNum string `json:"subNum"` - Platform string `json:"platform"` - PlatformUserName string `json:"platformUserName"` - PlatformUserID string `json:"platformUserID"` +func updateMediaAccount(platformName string, platformId cast.PlatformIDENUM, subInfoResp *accountFiee.UserInfoResponse, loginInfo login.Info) error { + _, err := service.CastProvider.UpdateMediaAccount(context.Background(), &cast.UpdateMediaAccountReq{ + PlatformID: platformId, + PlatformUserName: platformName, + PlatformUserID: "", + ArtistUuid: fmt.Sprint(subInfoResp.Id), + ArtistName: subInfoResp.Name, + ArtistPhone: subInfoResp.TelNum, + MediaAccountUuid: "", + ManagerUuid: fmt.Sprint(loginInfo.ID), + ManagerUserName: loginInfo.Name, + ArtistSubNum: subInfoResp.SubNum, + }) + return err }