From 142bf642dda56d8b22ae74997dbe98756662d9a3 Mon Sep 17 00:00:00 2001 From: cjy Date: Tue, 21 Oct 2025 17:50:04 +0800 Subject: [PATCH] =?UTF-8?q?bugfix:=E5=8E=BB=E6=8E=89=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E8=A1=A8=E4=B8=AD=E4=BB=BB=E5=8A=A1=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/controller/task.go | 33 +- internal/dao/taskDao.go | 1123 ++++------------------------------- internal/logic/taskLogic.go | 171 ++++-- internal/model/task.go | 24 - 4 files changed, 256 insertions(+), 1095 deletions(-) diff --git a/internal/controller/task.go b/internal/controller/task.go index 8f9a11f..a1b6add 100644 --- a/internal/controller/task.go +++ b/internal/controller/task.go @@ -273,33 +273,34 @@ func convertToTaskAssignRecordInfo(record *dao.TaskAssignRecordsResponse) *bundl // - 查询条件优先使用艺人编号(customerNum),为空时使用手机号(telNum) // - 返回同时包含“套餐类型”和“增值类型”的余额与待发数量,均按视频/图文/数据分析三类区分 func (b *BundleProvider) GetArtistBundleBalance(_ context.Context, req *bundle.ArtistBundleBalanceRequest) (*bundle.ArtistBundleBalanceResponse, error) { - // 参数校验 + // 参数校验:艺人编号与手机号不能同时为空 if req.CustomerNum == "" && req.TelNum == "" { return nil, fmt.Errorf("艺人编号和手机号不能同时为空") } - // 组装查询参数(逻辑层/DAO层使用 SubNum 与 TelNum) - pendingReq := &dao.PendingAndBalanceRequest{ - SubNum: req.CustomerNum, // 映射 customerNum -> SubNum - TelNum: req.TelNum, // 映射 telNum -> TelNum + // 仅使用艺人编号进行查询(与DAO层 GetRemainingPendingBySubNum 一致) + subNum := req.CustomerNum + if subNum == "" { + // 暂不支持通过手机号查询剩余待发数据 + return nil, fmt.Errorf("暂不支持通过手机号查询剩余待发数据,请传入艺人编号") } - // 调用逻辑层:查询待发数量与任务余额(区分套餐/增值) - resp, err := logic.GetPendingAndTaskBalances(pendingReq) + // 调用逻辑层:仅查询剩余待发数量(区分套餐/增值) + resp, err := logic.GetArtistRemainingPending(subNum) if err != nil { return nil, err } - // 映射为proto响应结构(套餐/增值分别返回视频/图文/数据分析的余额与待发数量) + // 组装proto响应:非DAO返回字段统一置为0 return &bundle.ArtistBundleBalanceResponse{ - // 套餐类型余额 - BundleVideoBalance: int32(resp.BundleVideoBalance), - BundleImageBalance: int32(resp.BundleImageBalance), - BundleDataAnalysisBalance: int32(resp.BundleDataAnalysisBalance), - // 增值类型余额 - IncreaseVideoBalance: int32(resp.IncreaseVideoBalance), - IncreaseImageBalance: int32(resp.IncreaseImageBalance), - IncreaseDataAnalysisBalance: int32(resp.IncreaseDataAnalysisBalance), + // 套餐类型余额(暂置0) + BundleVideoBalance: 0, + BundleImageBalance: 0, + BundleDataAnalysisBalance: 0, + // 增值类型余额(暂置0) + IncreaseVideoBalance: 0, + IncreaseImageBalance: 0, + IncreaseDataAnalysisBalance: 0, // 套餐类型待发数量 BundlePendingVideoCount: int32(resp.PendingBundleVideoCount), BundlePendingImageCount: int32(resp.PendingBundleImageCount), diff --git a/internal/dao/taskDao.go b/internal/dao/taskDao.go index a15f55b..70e8265 100644 --- a/internal/dao/taskDao.go +++ b/internal/dao/taskDao.go @@ -1,7 +1,6 @@ package dao import ( - "fmt" "micro-bundle/internal/model" "micro-bundle/pkg/app" commonErr "micro-bundle/pkg/err" @@ -11,90 +10,6 @@ import ( "gorm.io/gorm" ) -// ===== 聚合和扣减的辅助函数 ===== - -// aggregatePendingVideo 汇总所有视频分类的待发数量 -func aggregatePendingVideo(t *model.TaskManagement) int { - return t.PendingBundleLimitVideoExpiredCount + t.PendingBundleLimitVideoCount + - t.PendingIncreaseLimitVideoExpiredCount + t.PendingIncreaseLimitVideoCount + - t.PendingBundleVideoCount + t.PendingIncreaseVideoCount -} - -// aggregatePendingImage 汇总所有图文分类的待发数量 -func aggregatePendingImage(t *model.TaskManagement) int { - return t.PendingBundleLimitImageExpiredCount + t.PendingBundleLimitImageCount + - t.PendingIncreaseLimitImageExpiredCount + t.PendingIncreaseLimitImageCount + - t.PendingBundleImageCount + t.PendingIncreaseImageCount -} - -// aggregatePendingData 汇总所有数据分析分类的待发数量 -func aggregatePendingData(t *model.TaskManagement) int { - return t.PendingBundleLimitDataAnalysisExpiredCount + t.PendingBundleLimitDataAnalysisCount + - t.PendingIncreaseLimitDataAnalysisExpiredCount + t.PendingIncreaseLimitDataAnalysisCount + - t.PendingBundleDataAnalysisCount + t.PendingIncreaseDataAnalysisCount -} - -// deductCount 按顺序从各个桶中扣减数量,剩余未扣减数量应为0(正常情况) -func deductCount(count *int, buckets ...*int) { - if count == nil { - return - } - for _, b := range buckets { - if *count <= 0 { - break - } - if b == nil || *b <= 0 { - continue - } - if *b >= *count { - *b = *b - *count - *count = 0 - } else { - *count = *count - *b - *b = 0 - } - } -} - -// deductVideo 视频扣减优先级:受限 > 非受限;同类型中:打包 > 增量;受限类型中:过期优先 -func deductVideo(t *model.TaskManagement, n int) { - c := n - deductCount(&c, - &t.PendingBundleLimitVideoExpiredCount, - &t.PendingBundleLimitVideoCount, - &t.PendingIncreaseLimitVideoExpiredCount, - &t.PendingIncreaseLimitVideoCount, - &t.PendingBundleVideoCount, - &t.PendingIncreaseVideoCount, - ) -} - -// deductImage 图文扣减优先级:受限 > 非受限;同类型中:打包 > 增量;受限类型中:过期优先 -func deductImage(t *model.TaskManagement, n int) { - c := n - deductCount(&c, - &t.PendingBundleLimitImageExpiredCount, - &t.PendingBundleLimitImageCount, - &t.PendingIncreaseLimitImageExpiredCount, - &t.PendingIncreaseLimitImageCount, - &t.PendingBundleImageCount, - &t.PendingIncreaseImageCount, - ) -} - -// deductData 数据分析扣减优先级:受限 > 非受限;同类型中:打包 > 增量;受限类型中:过期优先 -func deductData(t *model.TaskManagement, n int) { - c := n - deductCount(&c, - &t.PendingBundleLimitDataAnalysisExpiredCount, - &t.PendingBundleLimitDataAnalysisCount, - &t.PendingIncreaseLimitDataAnalysisExpiredCount, - &t.PendingIncreaseLimitDataAnalysisCount, - &t.PendingBundleDataAnalysisCount, - &t.PendingIncreaseDataAnalysisCount, - ) -} - // TaskQueryRequest 查询待指派任务记录请求参数 type TaskQueryRequest struct { Keyword string `json:"keyword"` // 艺人姓名、编号、手机号搜索关键词 @@ -274,6 +189,17 @@ type PendingAndBalanceResponse struct { IncreaseDataAnalysisBalance int `json:"increaseDataAnalysisBalance"` // 增值数据分析余额 } +// 新增:仅返回“剩余待发数量”的精简响应(区分套餐/增值,共6个字段) +type ArtistRemainingPendingResponse struct { + PendingBundleVideoCount int `json:"pendingBundleVideoCount"` // 待发套餐视频数量(非限制+限制非过期+限制会过期) + PendingBundleImageCount int `json:"pendingBundleImageCount"` // 待发套餐图文数量(非限制+限制非过期+限制会过期) + PendingBundleDataAnalysisCount int `json:"pendingBundleDataAnalysisCount"` // 待发套餐数据分析数量(非限制+限制非过期+限制会过期) + + PendingIncreaseVideoCount int `json:"pendingIncreaseVideoCount"` // 待发增值视频数量(非限制+限制非过期+限制会过期) + PendingIncreaseImageCount int `json:"pendingIncreaseImageCount"` // 待发增值图文数量(非限制+限制非过期+限制会过期) + PendingIncreaseDataAnalysisCount int `json:"pendingIncreaseDataAnalysisCount"` // 待发增值数据分析数量(非限制+限制非过期+限制会过期) +} + // calculateBundleBalances 计算套餐类别下的三类余额(视频/图文/数据分析) // 余额=对应类别总数-对应类别已使用数;再将非限制、限制非过期、限制会过期三类相加 func calculateBundleBalances(tb *model.TaskBalance) (video int, image int, data int) { @@ -316,237 +242,6 @@ func calculateIncreaseBalances(tb *model.TaskBalance) (video int, image int, dat return } -// GetUserPendingAndTaskBalances 查询用户待发套餐/增值数量与任务余额(套餐/增值) -// 待发数量来自 task_management,余额来自 task_balance;均按视频/图文/数据分析三类返回 -// 待发聚合口径:将该类别下(套餐或增值)的非限制、限制非过期、限制会过期三类相加 -// 余额聚合口径:对应类别总数减已使用数后,再将三类相加 -func GetUserPendingAndTaskBalances(req *PendingAndBalanceRequest) (*PendingAndBalanceResponse, error) { - // 校验查询条件 - if req.SubNum == "" && req.TelNum == "" { - return nil, commonErr.ReturnError(nil, "查询参数错误", "艺人编号和手机号不能同时为空") - } - - // 查询任务管理表(待发) - var tm model.TaskManagement - tmQuery := app.ModuleClients.TaskBenchDB.Model(&model.TaskManagement{}) - if req.SubNum != "" { - tmQuery = tmQuery.Where("sub_num = ?", req.SubNum) - } else { - tmQuery = tmQuery.Where("tel_num = ?", req.TelNum) - } - // 若不存在,待发视为 0 - _ = tmQuery.Take(&tm).Error - - // 聚合待发(套餐与增值分开统计) - pendingBundleVideo := tm.PendingBundleVideoCount + tm.PendingBundleLimitVideoCount + tm.PendingBundleLimitVideoExpiredCount - pendingBundleImage := tm.PendingBundleImageCount + tm.PendingBundleLimitImageCount + tm.PendingBundleLimitImageExpiredCount - pendingBundleData := tm.PendingBundleDataAnalysisCount + tm.PendingBundleLimitDataAnalysisCount + tm.PendingBundleLimitDataAnalysisExpiredCount - - pendingIncreaseVideo := tm.PendingIncreaseVideoCount + tm.PendingIncreaseLimitVideoCount + tm.PendingIncreaseLimitVideoExpiredCount - pendingIncreaseImage := tm.PendingIncreaseImageCount + tm.PendingIncreaseLimitImageCount + tm.PendingIncreaseLimitImageExpiredCount - pendingIncreaseData := tm.PendingIncreaseDataAnalysisCount + tm.PendingIncreaseLimitDataAnalysisCount + tm.PendingIncreaseLimitDataAnalysisExpiredCount - - // 查询任务余额表(当前有效月份优先) - var tb model.TaskBalance - now := time.Now() - tbQuery := app.ModuleClients.TaskBenchDB.Model(&model.TaskBalance{}) - if req.SubNum != "" { - tbQuery = tbQuery.Where("sub_num = ?", req.SubNum) - } else { - tbQuery = tbQuery.Where("tel_num = ?", req.TelNum) - } - // 选择当前有效区间的记录,若无则回退到最近一条 - err := tbQuery.Where("start_at <= ? AND expired_at >= ?", now, now).Order("start_at DESC").Take(&tb).Error - if err != nil { - // 回退:取最近一条记录(可能没有有效期覆盖 now) - _ = tbQuery.Order("start_at DESC").Take(&tb).Error - } - - // 计算套餐与增值余额 - bundleVideo, bundleImage, bundleData := calculateBundleBalances(&tb) - increaseVideo, increaseImage, increaseData := calculateIncreaseBalances(&tb) - - resp := &PendingAndBalanceResponse{ - PendingBundleVideoCount: pendingBundleVideo, - PendingBundleImageCount: pendingBundleImage, - PendingBundleDataAnalysisCount: pendingBundleData, - - PendingIncreaseVideoCount: pendingIncreaseVideo, - PendingIncreaseImageCount: pendingIncreaseImage, - PendingIncreaseDataAnalysisCount: pendingIncreaseData, - - BundleVideoBalance: bundleVideo, - BundleImageBalance: bundleImage, - BundleDataAnalysisBalance: bundleData, - IncreaseVideoBalance: increaseVideo, - IncreaseImageBalance: increaseImage, - IncreaseDataAnalysisBalance: increaseData, - } - - return resp, nil -} - -// GetPendingTaskList 查询待指派任务记录 -// 根据套餐没有过期的艺人查询TaskManagement表中的记录,如果不存在则构建默认值 -func GetPendingTaskList(req *TaskQueryRequest, validArtist []ValidArtistInfo) ([]*model.TaskManagement, int64, error) { - // 构建有效艺人ID列表 - var validArtistIDs []string - for _, artist := range validArtist { - if artist.CustomerNum != "" { - validArtistIDs = append(validArtistIDs, artist.CustomerNum) - } - } - - // 如果没有有效艺人,直接返回空结果 - if len(validArtistIDs) == 0 { - return []*model.TaskManagement{}, 0, nil - } - - // 第一步:查询所有有效艺人在数据库中的存在情况(不应用关键词过滤) - var existingTasks []*model.TaskManagement - existQuery := app.ModuleClients.TaskBenchDB.Model(&model.TaskManagement{}).Where("sub_num IN (?)", validArtistIDs) - err := existQuery.Find(&existingTasks).Error - if err != nil { - return nil, 0, commonErr.ReturnError(err, "查询现有任务记录失败", "查询现有任务记录失败: ") - } - - // 创建已存在艺人编号的映射 - existingSubNums := make(map[string]bool) - for _, task := range existingTasks { - existingSubNums[task.SubNum] = true - } - - // 创建艺人编号到艺人信息的映射,便于快速查找 - artistMap := make(map[string]ValidArtistInfo) - for _, artist := range validArtist { - artistMap[artist.CustomerNum] = artist - } - - // 为不存在的艺人创建默认记录 - var newTasksToCreate []*model.TaskManagement - for _, subNum := range validArtistIDs { - if !existingSubNums[subNum] { - artist := artistMap[subNum] - // 构建默认任务记录 - // 默认将剩余数量分配到“非限制-套餐权益”类别,其它类别置零 - remainingVideo := artist.VideoNumber - artist.VideoConsumptionNumber - remainingImage := artist.ImageNumber - artist.ImageConsumptionNumber - remainingData := artist.DataAnalysisNumber - artist.DataAnalysisConsumptionNumber - if remainingVideo < 0 { - remainingVideo = 0 - } - if remainingImage < 0 { - remainingImage = 0 - } - if remainingData < 0 { - remainingData = 0 - } - - defaultTask := &model.TaskManagement{ - SubNum: subNum, - TelNum: artist.UserPhoneNumber, - ArtistName: artist.UserName, - - // 视频 - PendingBundleVideoCount: remainingVideo, - PendingIncreaseVideoCount: 0, - PendingBundleLimitVideoCount: 0, - PendingIncreaseLimitVideoCount: 0, - PendingBundleLimitVideoExpiredCount: 0, - PendingIncreaseLimitVideoExpiredCount: 0, - - // 图片 - PendingBundleImageCount: remainingImage, - PendingIncreaseImageCount: 0, - PendingBundleLimitImageCount: 0, - PendingIncreaseLimitImageCount: 0, - PendingBundleLimitImageExpiredCount: 0, - PendingIncreaseLimitImageExpiredCount: 0, - - // 数据分析 - PendingBundleDataAnalysisCount: remainingData, - PendingIncreaseDataAnalysisCount: 0, - PendingBundleLimitDataAnalysisCount: 0, - PendingIncreaseLimitDataAnalysisCount: 0, - PendingBundleLimitDataAnalysisExpiredCount: 0, - PendingIncreaseLimitDataAnalysisExpiredCount: 0, - - ProgressCount: 0, - CompleteCount: 0, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - } - newTasksToCreate = append(newTasksToCreate, defaultTask) - } - } - - // 批量创建新的任务记录 - if len(newTasksToCreate) > 0 { - if err := app.ModuleClients.TaskBenchDB.Create(&newTasksToCreate).Error; err != nil { - return nil, 0, commonErr.ReturnError(err, "创建默认任务记录失败", "创建默认任务记录失败: ") - } - } - - // 第二步:应用完整的查询条件进行最终查询 - var tasks []*model.TaskManagement - var total int64 - - // 构建最终查询条件 - query := app.ModuleClients.TaskBenchDB.Model(&model.TaskManagement{}) - - // 限制在有效艺人范围内 - query = query.Where("sub_num IN (?)", validArtistIDs) - - // 关键词搜索(艺人姓名、编号、手机号) - if req.Keyword != "" { - query = query.Where("sub_num LIKE ? OR tel_num LIKE ? OR artist_name LIKE ?", - "%"+req.Keyword+"%", "%"+req.Keyword+"%", "%"+req.Keyword+"%") - } - - // 计算总数 - query.Count(&total) - - // 排序 - if req.SortBy != "" && req.SortType != "" { - sortBy := req.SortBy - sortType := req.SortType - if sortType != "asc" && sortType != "desc" && sortType != "ASC" && sortType != "DESC" { - sortType = "DESC" - } - // 将常用聚合字段映射为详细字段总和表达式 - switch sortBy { - case "pending_video_count", "pendingVideoCount": - sortBy = "(pending_bundle_limit_video_expired_count + pending_bundle_limit_video_count + pending_increase_limit_video_expired_count + pending_increase_limit_video_count + pending_bundle_video_count + pending_increase_video_count)" - case "pending_post_count", "pendingPostCount": - sortBy = "(pending_bundle_limit_image_expired_count + pending_bundle_limit_image_count + pending_increase_limit_image_expired_count + pending_increase_limit_image_count + pending_bundle_image_count + pending_increase_image_count)" - case "pending_data_count", "pendingDataCount": - sortBy = "(pending_bundle_limit_data_analysis_expired_count + pending_bundle_limit_data_analysis_count + pending_increase_limit_data_analysis_expired_count + pending_increase_limit_data_analysis_count + pending_bundle_data_analysis_count + pending_increase_data_analysis_count)" - case "progress_count", "progressCount": - sortBy = "progress_count" - case "complete_count", "completeCount": - sortBy = "complete_count" - } - orderClause := fmt.Sprintf("%s %s", sortBy, sortType) - query = query.Order(orderClause) - } else { - // 默认按待发视频总和降序 - query = query.Order("(pending_bundle_limit_video_expired_count + pending_bundle_limit_video_count + pending_increase_limit_video_expired_count + pending_increase_limit_video_count + pending_bundle_video_count + pending_increase_video_count) DESC") - } - - // 分页 - if req.PageSize > 0 && req.Page > 0 { - offset := (req.Page - 1) * req.PageSize - query = query.Limit(req.PageSize).Offset(offset) - } - - err = query.Find(&tasks).Error - if err != nil { - return nil, 0, commonErr.ReturnError(err, "查询待指派任务记录失败", "查询待指派任务记录失败: ") - } - - return tasks, total, nil -} - // AssignTask 指派某位员工完成某个艺人的任务 func AssignTask(req *TaskAssignRequest, progressTaskCount int, completeTaskCount int) error { // 开启事务 @@ -567,27 +262,6 @@ func AssignTask(req *TaskAssignRequest, progressTaskCount int, completeTaskCount SubNum: req.SubNum, TelNum: req.TelNum, ArtistName: req.ArtistName, - // 待发视频 - PendingBundleVideoCount: 0, - PendingIncreaseVideoCount: 0, - PendingBundleLimitVideoCount: 0, - PendingIncreaseLimitVideoCount: 0, - PendingBundleLimitVideoExpiredCount: 0, - PendingIncreaseLimitVideoExpiredCount: 0, - // 待发图片 - PendingBundleImageCount: 0, - PendingIncreaseImageCount: 0, - PendingBundleLimitImageCount: 0, - PendingIncreaseLimitImageCount: 0, - PendingBundleLimitImageExpiredCount: 0, - PendingIncreaseLimitImageExpiredCount: 0, - // 待发数据分析 - PendingBundleDataAnalysisCount: 0, - PendingIncreaseDataAnalysisCount: 0, - PendingBundleLimitDataAnalysisCount: 0, - PendingIncreaseLimitDataAnalysisCount: 0, - PendingBundleLimitDataAnalysisExpiredCount: 0, - PendingIncreaseLimitDataAnalysisExpiredCount: 0, // 其他字段 ProgressCount: 0, CompleteCount: 0, @@ -604,72 +278,11 @@ func AssignTask(req *TaskAssignRequest, progressTaskCount int, completeTaskCount } } - // 2. 检查待发数量是否大于0(聚合总和) - if aggregatePendingVideo(&taskManagement) <= 0 && aggregatePendingImage(&taskManagement) <= 0 && aggregatePendingData(&taskManagement) <= 0 { - tx.Rollback() - return commonErr.ReturnError(nil, "无可指派任务", "当前艺人待发视频数、图文数、数据数均为0,无法指派任务") - } - - // 3. 检查指派数量是否合理(增强验证) - if req.AssignVideoCount < 0 || req.AssignPostCount < 0 || req.AssignDataCount < 0 { - tx.Rollback() - return commonErr.ReturnError(nil, "指派数量不能为负数", "指派数量必须大于等于0") - } - - if req.AssignVideoCount > aggregatePendingVideo(&taskManagement) || - req.AssignPostCount > aggregatePendingImage(&taskManagement) || - req.AssignDataCount > aggregatePendingData(&taskManagement) { - tx.Rollback() - return commonErr.ReturnError(nil, "指派数量超出限制", - fmt.Sprintf("指派数量不能超过待发数量。当前待发:视频%d,图文%d,数据%d", - aggregatePendingVideo(&taskManagement), aggregatePendingImage(&taskManagement), aggregatePendingData(&taskManagement))) - } - - if req.AssignVideoCount == 0 && req.AssignPostCount == 0 && req.AssignDataCount == 0 { - tx.Rollback() - return commonErr.ReturnError(nil, "指派数量不能全为0", "至少需要指派一种类型的任务") - } - - // 4. 按优先级扣减详细待发数量 - if req.AssignVideoCount > 0 { - deductVideo(&taskManagement, req.AssignVideoCount) - } - if req.AssignPostCount > 0 { - deductImage(&taskManagement, req.AssignPostCount) - } - if req.AssignDataCount > 0 { - deductData(&taskManagement, req.AssignDataCount) - } - - // 汇总更新字段 + // 2. 更新任务记录中的待办任务数量 updateData := map[string]interface{}{ - // 视频 - "pending_bundle_limit_video_expired_count": taskManagement.PendingBundleLimitVideoExpiredCount, - "pending_bundle_limit_video_count": taskManagement.PendingBundleLimitVideoCount, - "pending_increase_limit_video_expired_count": taskManagement.PendingIncreaseLimitVideoExpiredCount, - "pending_increase_limit_video_count": taskManagement.PendingIncreaseLimitVideoCount, - "pending_bundle_video_count": taskManagement.PendingBundleVideoCount, - "pending_increase_video_count": taskManagement.PendingIncreaseVideoCount, - // 图片 - "pending_bundle_limit_image_expired_count": taskManagement.PendingBundleLimitImageExpiredCount, - "pending_bundle_limit_image_count": taskManagement.PendingBundleLimitImageCount, - "pending_increase_limit_image_expired_count": taskManagement.PendingIncreaseLimitImageExpiredCount, - "pending_increase_limit_image_count": taskManagement.PendingIncreaseLimitImageCount, - "pending_bundle_image_count": taskManagement.PendingBundleImageCount, - "pending_increase_image_count": taskManagement.PendingIncreaseImageCount, - // 数据分析 - "pending_bundle_limit_data_analysis_expired_count": taskManagement.PendingBundleLimitDataAnalysisExpiredCount, - "pending_bundle_limit_data_analysis_count": taskManagement.PendingBundleLimitDataAnalysisCount, - "pending_increase_limit_data_analysis_expired_count": taskManagement.PendingIncreaseLimitDataAnalysisExpiredCount, - "pending_increase_limit_data_analysis_count": taskManagement.PendingIncreaseLimitDataAnalysisCount, - "pending_bundle_data_analysis_count": taskManagement.PendingBundleDataAnalysisCount, - "pending_increase_data_analysis_count": taskManagement.PendingIncreaseDataAnalysisCount, - // 其他字段 - "last_task_assignee": req.TaskAssignee, - "task_assignee_num": req.TaskAssigneeNum, - "progress_count": progressTaskCount, - "complete_count": completeTaskCount, - "updated_at": time.Now(), + "ProgressCount": progressTaskCount, + "CompleteCount": completeTaskCount, + "UpdatedAt": time.Now(), } if err = tx.Model(&taskManagement).Updates(updateData).Error; err != nil { @@ -691,9 +304,9 @@ func AssignTask(req *TaskAssignRequest, progressTaskCount int, completeTaskCount OperatorTime: time.Now(), TaskAssignee: req.TaskAssignee, // 指派员工姓名 TaskAssigneeNum: req.TaskAssigneeNum, // 指派员工账号 - PendingVideoCount: aggregatePendingVideo(&taskManagement), - PendingPostCount: aggregatePendingImage(&taskManagement), - PendingDataCount: aggregatePendingData(&taskManagement), + PendingVideoCount: req.AssignVideoCount, + PendingPostCount: req.AssignPostCount, + PendingDataCount: req.AssignDataCount, AssignVideoCount: req.AssignVideoCount, AssignPostCount: req.AssignPostCount, AssignDataCount: req.AssignDataCount, @@ -717,409 +330,6 @@ func AssignTask(req *TaskAssignRequest, progressTaskCount int, completeTaskCount return nil } -// UpdatePendingCount 修改待发数量 -func UpdatePendingCount(req *UpdatePendingCountRequest) error { - // 开启事务 - tx := app.ModuleClients.TaskBenchDB.Begin() - defer func() { - if r := recover(); r != nil { - tx.Rollback() - } - }() - - // 1. 查询或创建TaskManagement记录 - var taskManagement model.TaskManagement - // 与查询余额保持一致:优先使用 sub_num,否则使用 tel_num - tmQuery := tx.Model(&model.TaskManagement{}) - if req.SubNum != "" { - tmQuery = tmQuery.Where("sub_num = ?", req.SubNum) - } else { - tmQuery = tmQuery.Where("tel_num = ?", req.TelNum) - } - err := tmQuery.First(&taskManagement).Error - if err != nil { - if err == gorm.ErrRecordNotFound { - return commonErr.ReturnError(err, "无该艺人任务记录", "无该艺人任务记录") - } else { - tx.Rollback() - return commonErr.ReturnError(err, "查询任务记录失败", "查询任务记录失败: ") - } - } - - // 2. 查询任务余额记录(当前有效月份优先,若无则回退到最近一条) - var taskBalance model.TaskBalance - now := time.Now() - tbQuery := tx.Model(&model.TaskBalance{}) - if req.SubNum != "" { - tbQuery = tbQuery.Where("sub_num = ?", req.SubNum) - } else { - tbQuery = tbQuery.Where("tel_num = ?", req.TelNum) - } - tbErr := tbQuery.Where("start_at <= ? AND expired_at >= ?", now, now).Order("start_at DESC").Take(&taskBalance).Error - if tbErr != nil { - // 回退:取最近一条记录 - _ = tbQuery.Order("start_at DESC").Take(&taskBalance).Error - } - - // 若余额记录不存在,且本次需要“扣返余额”(目标小于当前)或“占用余额”(目标大于当前),直接报错 - // 说明:此处不创建余额记录,避免无源数据导致余额错账 - hasBalanceRecord := taskBalance.ID != 0 - - // 3. 计算当前聚合待发与目标值的差异(目标为绝对值,不是增减) - curVideo := aggregatePendingVideo(&taskManagement) - curImage := aggregatePendingImage(&taskManagement) - curData := aggregatePendingData(&taskManagement) - - diffVideo := req.PendingVideoCount - curVideo - diffImage := req.PendingPostCount - curImage - diffData := req.PendingDataCount - curData - - // 4. 若需要增加目标(diff>0),从艺人余额中按优先级占用并分配到待发分类 - // 优先级:受限>非受限;同类型:打包>增量;受限内:过期优先 - if diffVideo > 0 || diffImage > 0 || diffData > 0 { - if !hasBalanceRecord { - tx.Rollback() - return commonErr.ReturnError(nil, "无可用任务余额记录", "该艺人没有任务余额记录,无法占用余额用于增加待发") - } - - // 视频占用 - if diffVideo > 0 { - need := diffVideo - // 可用余额按分类拆分 - availBLE := taskBalance.TaskBundleLimitVideoExpiredNumber - taskBalance.TaskBundleLimitVideoExpiredConsumptionNumber - availILE := taskBalance.TaskIncreaseLimitVideoExpiredNumber - taskBalance.TaskIncreaseLimitVideoExpiredConsumptionNumber - availBL := taskBalance.TaskBundleLimitVideoNumber - taskBalance.TaskBundleLimitVideoConsumptionNumber - availIL := taskBalance.TaskIncreaseLimitVideoNumber - taskBalance.TaskIncreaseLimitVideoConsumptionNumber - availB := taskBalance.TaskBundleVideoNumber - taskBalance.TaskBundleVideoConsumptionNumber - availI := taskBalance.TaskIncreaseVideoNumber - taskBalance.TaskIncreaseVideoConsumptionNumber - - // 逐类占用并写入待发分类与消费数 - if need > 0 && availBLE > 0 { - take := minInt(need, availBLE) - taskManagement.PendingBundleLimitVideoExpiredCount += take - taskBalance.TaskBundleLimitVideoExpiredConsumptionNumber += take - need -= take - } - if need > 0 && availILE > 0 { - take := minInt(need, availILE) - taskManagement.PendingIncreaseLimitVideoExpiredCount += take - taskBalance.TaskIncreaseLimitVideoExpiredConsumptionNumber += take - need -= take - } - if need > 0 && availBL > 0 { - take := minInt(need, availBL) - taskManagement.PendingBundleLimitVideoCount += take - taskBalance.TaskBundleLimitVideoConsumptionNumber += take - need -= take - } - if need > 0 && availIL > 0 { - take := minInt(need, availIL) - taskManagement.PendingIncreaseLimitVideoCount += take - taskBalance.TaskIncreaseLimitVideoConsumptionNumber += take - need -= take - } - if need > 0 && availB > 0 { - take := minInt(need, availB) - taskManagement.PendingBundleVideoCount += take - taskBalance.TaskBundleVideoConsumptionNumber += take - need -= take - } - if need > 0 && availI > 0 { - take := minInt(need, availI) - taskManagement.PendingIncreaseVideoCount += take - taskBalance.TaskIncreaseVideoConsumptionNumber += take - need -= take - } - if need > 0 { - tx.Rollback() - return commonErr.ReturnError(nil, "视频任务余额不足", "可用余额不足以达到目标待发视频数量") - } - } - - // 图片占用 - if diffImage > 0 { - need := diffImage - availBLE := taskBalance.TaskBundleLimitImageExpiredNumber - taskBalance.TaskBundleLimitImageExpiredConsumptionNumber - availILE := taskBalance.TaskIncreaseLimitImageExpiredNumber - taskBalance.TaskIncreaseLimitImageExpiredConsumptionNumber - availBL := taskBalance.TaskBundleLimitImageNumber - taskBalance.TaskBundleLimitImageConsumptionNumber - availIL := taskBalance.TaskIncreaseLimitImageNumber - taskBalance.TaskIncreaseLimitImageConsumptionNumber - availB := taskBalance.TaskBundleImageNumber - taskBalance.TaskBundleImageConsumptionNumber - availI := taskBalance.TaskIncreaseImageNumber - taskBalance.TaskIncreaseImageConsumptionNumber - - if need > 0 && availBLE > 0 { - take := minInt(need, availBLE) - taskManagement.PendingBundleLimitImageExpiredCount += take - taskBalance.TaskBundleLimitImageExpiredConsumptionNumber += take - need -= take - } - if need > 0 && availILE > 0 { - take := minInt(need, availILE) - taskManagement.PendingIncreaseLimitImageExpiredCount += take - taskBalance.TaskIncreaseLimitImageExpiredConsumptionNumber += take - need -= take - } - if need > 0 && availBL > 0 { - take := minInt(need, availBL) - taskManagement.PendingBundleLimitImageCount += take - taskBalance.TaskBundleLimitImageConsumptionNumber += take - need -= take - } - if need > 0 && availIL > 0 { - take := minInt(need, availIL) - taskManagement.PendingIncreaseLimitImageCount += take - taskBalance.TaskIncreaseLimitImageConsumptionNumber += take - need -= take - } - if need > 0 && availB > 0 { - take := minInt(need, availB) - taskManagement.PendingBundleImageCount += take - taskBalance.TaskBundleImageConsumptionNumber += take - need -= take - } - if need > 0 && availI > 0 { - take := minInt(need, availI) - taskManagement.PendingIncreaseImageCount += take - taskBalance.TaskIncreaseImageConsumptionNumber += take - need -= take - } - if need > 0 { - tx.Rollback() - return commonErr.ReturnError(nil, "图文任务余额不足", "可用余额不足以达到目标待发图文数量") - } - } - - // 数据分析占用 - if diffData > 0 { - need := diffData - availBLE := taskBalance.TaskBundleLimitDataAnalysisExpiredNumber - taskBalance.TaskBundleLimitDataAnalysisExpiredConsumptionNumber - availILE := taskBalance.TaskIncreaseLimitDataAnalysisExpiredNumber - taskBalance.TaskIncreaseLimitDataAnalysisExpiredConsumptionNumber - availBL := taskBalance.TaskBundleLimitDataAnalysisNumber - taskBalance.TaskBundleLimitDataAnalysisConsumptionNumber - availIL := taskBalance.TaskIncreaseLimitDataAnalysisNumber - taskBalance.TaskIncreaseLimitDataAnalysisConsumptionNumber - availB := taskBalance.TaskBundleDataAnalysisNumber - taskBalance.TaskBundleDataAnalysisConsumptionNumber - availI := taskBalance.TaskIncreaseDataAnalysisNumber - taskBalance.TaskIncreaseDataAnalysisConsumptionNumber - - if need > 0 && availBLE > 0 { - take := minInt(need, availBLE) - taskManagement.PendingBundleLimitDataAnalysisExpiredCount += take - taskBalance.TaskBundleLimitDataAnalysisExpiredConsumptionNumber += take - need -= take - } - if need > 0 && availILE > 0 { - take := minInt(need, availILE) - taskManagement.PendingIncreaseLimitDataAnalysisExpiredCount += take - taskBalance.TaskIncreaseLimitDataAnalysisExpiredConsumptionNumber += take - need -= take - } - if need > 0 && availBL > 0 { - take := minInt(need, availBL) - taskManagement.PendingBundleLimitDataAnalysisCount += take - taskBalance.TaskBundleLimitDataAnalysisConsumptionNumber += take - need -= take - } - if need > 0 && availIL > 0 { - take := minInt(need, availIL) - taskManagement.PendingIncreaseLimitDataAnalysisCount += take - taskBalance.TaskIncreaseLimitDataAnalysisConsumptionNumber += take - need -= take - } - if need > 0 && availB > 0 { - take := minInt(need, availB) - taskManagement.PendingBundleDataAnalysisCount += take - taskBalance.TaskBundleDataAnalysisConsumptionNumber += take - need -= take - } - if need > 0 && availI > 0 { - take := minInt(need, availI) - taskManagement.PendingIncreaseDataAnalysisCount += take - taskBalance.TaskIncreaseDataAnalysisConsumptionNumber += take - need -= take - } - if need > 0 { - tx.Rollback() - return commonErr.ReturnError(nil, "数据分析任务余额不足", "可用余额不足以达到目标待发数据分析数量") - } - } - } - - // 5. 若需要减少目标(diff<0),先按优先级从待发分类扣减,并将扣减的数量按对应分类冲回余额(减少消费数) - if diffVideo < 0 || diffImage < 0 || diffData < 0 { - if !hasBalanceRecord { - tx.Rollback() - return commonErr.ReturnError(nil, "无可用任务余额记录", "该艺人没有任务余额记录,无法将多余待发冲回余额") - } - - // 视频冲回 - if diffVideo < 0 { - refund := -diffVideo - // 记录扣减前的各分类待发值 - prevBLE := taskManagement.PendingBundleLimitVideoExpiredCount - prevILE := taskManagement.PendingIncreaseLimitVideoExpiredCount - prevBL := taskManagement.PendingBundleLimitVideoCount - prevIL := taskManagement.PendingIncreaseLimitVideoCount - prevB := taskManagement.PendingBundleVideoCount - prevI := taskManagement.PendingIncreaseVideoCount - - deductVideo(&taskManagement, refund) - - // 计算各分类被扣减的数量,并减少对应消费数(不可小于0) - removedBLE := prevBLE - taskManagement.PendingBundleLimitVideoExpiredCount - removedILE := prevILE - taskManagement.PendingIncreaseLimitVideoExpiredCount - removedBL := prevBL - taskManagement.PendingBundleLimitVideoCount - removedIL := prevIL - taskManagement.PendingIncreaseLimitVideoCount - removedB := prevB - taskManagement.PendingBundleVideoCount - removedI := prevI - taskManagement.PendingIncreaseVideoCount - - taskBalance.TaskBundleLimitVideoExpiredConsumptionNumber = maxInt(0, taskBalance.TaskBundleLimitVideoExpiredConsumptionNumber-removedBLE) - taskBalance.TaskIncreaseLimitVideoExpiredConsumptionNumber = maxInt(0, taskBalance.TaskIncreaseLimitVideoExpiredConsumptionNumber-removedILE) - taskBalance.TaskBundleLimitVideoConsumptionNumber = maxInt(0, taskBalance.TaskBundleLimitVideoConsumptionNumber-removedBL) - taskBalance.TaskIncreaseLimitVideoConsumptionNumber = maxInt(0, taskBalance.TaskIncreaseLimitVideoConsumptionNumber-removedIL) - taskBalance.TaskBundleVideoConsumptionNumber = maxInt(0, taskBalance.TaskBundleVideoConsumptionNumber-removedB) - taskBalance.TaskIncreaseVideoConsumptionNumber = maxInt(0, taskBalance.TaskIncreaseVideoConsumptionNumber-removedI) - } - - // 图片冲回 - if diffImage < 0 { - refund := -diffImage - prevBLE := taskManagement.PendingBundleLimitImageExpiredCount - prevILE := taskManagement.PendingIncreaseLimitImageExpiredCount - prevBL := taskManagement.PendingBundleLimitImageCount - prevIL := taskManagement.PendingIncreaseLimitImageCount - prevB := taskManagement.PendingBundleImageCount - prevI := taskManagement.PendingIncreaseImageCount - - deductImage(&taskManagement, refund) - - removedBLE := prevBLE - taskManagement.PendingBundleLimitImageExpiredCount - removedILE := prevILE - taskManagement.PendingIncreaseLimitImageExpiredCount - removedBL := prevBL - taskManagement.PendingBundleLimitImageCount - removedIL := prevIL - taskManagement.PendingIncreaseLimitImageCount - removedB := prevB - taskManagement.PendingBundleImageCount - removedI := prevI - taskManagement.PendingIncreaseImageCount - - taskBalance.TaskBundleLimitImageExpiredConsumptionNumber = maxInt(0, taskBalance.TaskBundleLimitImageExpiredConsumptionNumber-removedBLE) - taskBalance.TaskIncreaseLimitImageExpiredConsumptionNumber = maxInt(0, taskBalance.TaskIncreaseLimitImageExpiredConsumptionNumber-removedILE) - taskBalance.TaskBundleLimitImageConsumptionNumber = maxInt(0, taskBalance.TaskBundleLimitImageConsumptionNumber-removedBL) - taskBalance.TaskIncreaseLimitImageConsumptionNumber = maxInt(0, taskBalance.TaskIncreaseLimitImageConsumptionNumber-removedIL) - taskBalance.TaskBundleImageConsumptionNumber = maxInt(0, taskBalance.TaskBundleImageConsumptionNumber-removedB) - taskBalance.TaskIncreaseImageConsumptionNumber = maxInt(0, taskBalance.TaskIncreaseImageConsumptionNumber-removedI) - } - - // 数据分析冲回 - if diffData < 0 { - refund := -diffData - prevBLE := taskManagement.PendingBundleLimitDataAnalysisExpiredCount - prevILE := taskManagement.PendingIncreaseLimitDataAnalysisExpiredCount - prevBL := taskManagement.PendingBundleLimitDataAnalysisCount - prevIL := taskManagement.PendingIncreaseLimitDataAnalysisCount - prevB := taskManagement.PendingBundleDataAnalysisCount - prevI := taskManagement.PendingIncreaseDataAnalysisCount - - deductData(&taskManagement, refund) - - removedBLE := prevBLE - taskManagement.PendingBundleLimitDataAnalysisExpiredCount - removedILE := prevILE - taskManagement.PendingIncreaseLimitDataAnalysisExpiredCount - removedBL := prevBL - taskManagement.PendingBundleLimitDataAnalysisCount - removedIL := prevIL - taskManagement.PendingIncreaseLimitDataAnalysisCount - removedB := prevB - taskManagement.PendingBundleDataAnalysisCount - removedI := prevI - taskManagement.PendingIncreaseDataAnalysisCount - - taskBalance.TaskBundleLimitDataAnalysisExpiredConsumptionNumber = maxInt(0, taskBalance.TaskBundleLimitDataAnalysisExpiredConsumptionNumber-removedBLE) - taskBalance.TaskIncreaseLimitDataAnalysisExpiredConsumptionNumber = maxInt(0, taskBalance.TaskIncreaseLimitDataAnalysisExpiredConsumptionNumber-removedILE) - taskBalance.TaskBundleLimitDataAnalysisConsumptionNumber = maxInt(0, taskBalance.TaskBundleLimitDataAnalysisConsumptionNumber-removedBL) - taskBalance.TaskIncreaseLimitDataAnalysisConsumptionNumber = maxInt(0, taskBalance.TaskIncreaseLimitDataAnalysisConsumptionNumber-removedIL) - taskBalance.TaskBundleDataAnalysisConsumptionNumber = maxInt(0, taskBalance.TaskBundleDataAnalysisConsumptionNumber-removedB) - taskBalance.TaskIncreaseDataAnalysisConsumptionNumber = maxInt(0, taskBalance.TaskIncreaseDataAnalysisConsumptionNumber-removedI) - } - } - - // 6. 更新TaskManagement表 - updateData := map[string]interface{}{ - // 视频 - "pending_bundle_limit_video_expired_count": taskManagement.PendingBundleLimitVideoExpiredCount, - "pending_bundle_limit_video_count": taskManagement.PendingBundleLimitVideoCount, - "pending_increase_limit_video_expired_count": taskManagement.PendingIncreaseLimitVideoExpiredCount, - "pending_increase_limit_video_count": taskManagement.PendingIncreaseLimitVideoCount, - "pending_bundle_video_count": taskManagement.PendingBundleVideoCount, - "pending_increase_video_count": taskManagement.PendingIncreaseVideoCount, - // 图片 - "pending_bundle_limit_image_expired_count": taskManagement.PendingBundleLimitImageExpiredCount, - "pending_bundle_limit_image_count": taskManagement.PendingBundleLimitImageCount, - "pending_increase_limit_image_expired_count": taskManagement.PendingIncreaseLimitImageExpiredCount, - "pending_increase_limit_image_count": taskManagement.PendingIncreaseLimitImageCount, - "pending_bundle_image_count": taskManagement.PendingBundleImageCount, - "pending_increase_image_count": taskManagement.PendingIncreaseImageCount, - // 数据分析 - "pending_bundle_limit_data_analysis_expired_count": taskManagement.PendingBundleLimitDataAnalysisExpiredCount, - "pending_bundle_limit_data_analysis_count": taskManagement.PendingBundleLimitDataAnalysisCount, - "pending_increase_limit_data_analysis_expired_count": taskManagement.PendingIncreaseLimitDataAnalysisExpiredCount, - "pending_increase_limit_data_analysis_count": taskManagement.PendingIncreaseLimitDataAnalysisCount, - "pending_bundle_data_analysis_count": taskManagement.PendingBundleDataAnalysisCount, - "pending_increase_data_analysis_count": taskManagement.PendingIncreaseDataAnalysisCount, - // 通用 - "updated_at": time.Now(), - } - if err = tx.Model(&taskManagement).Updates(updateData).Error; err != nil { - tx.Rollback() - return commonErr.ReturnError(err, "更新任务记录失败", "更新任务记录失败: ") - } - - // 7. 更新TaskBalance(消费数发生变化时) - if hasBalanceRecord { - updateBal := map[string]interface{}{ - // 视频消费数 - "task_bundle_limit_video_expired_consumption_number": taskBalance.TaskBundleLimitVideoExpiredConsumptionNumber, - "task_increase_limit_video_expired_consumption_number": taskBalance.TaskIncreaseLimitVideoExpiredConsumptionNumber, - "task_bundle_limit_video_consumption_number": taskBalance.TaskBundleLimitVideoConsumptionNumber, - "task_increase_limit_video_consumption_number": taskBalance.TaskIncreaseLimitVideoConsumptionNumber, - "task_bundle_video_consumption_number": taskBalance.TaskBundleVideoConsumptionNumber, - "task_increase_video_consumption_number": taskBalance.TaskIncreaseVideoConsumptionNumber, - // 图片消费数 - "task_bundle_limit_image_expired_consumption_number": taskBalance.TaskBundleLimitImageExpiredConsumptionNumber, - "task_increase_limit_image_expired_consumption_number": taskBalance.TaskIncreaseLimitImageExpiredConsumptionNumber, - "task_bundle_limit_image_consumption_number": taskBalance.TaskBundleLimitImageConsumptionNumber, - "task_increase_limit_image_consumption_number": taskBalance.TaskIncreaseLimitImageConsumptionNumber, - "task_bundle_image_consumption_number": taskBalance.TaskBundleImageConsumptionNumber, - "task_increase_image_consumption_number": taskBalance.TaskIncreaseImageConsumptionNumber, - // 数据分析消费数 - "task_bundle_limit_data_analysis_expired_consumption_number": taskBalance.TaskBundleLimitDataAnalysisExpiredConsumptionNumber, - "task_increase_limit_data_analysis_expired_consumption_number": taskBalance.TaskIncreaseLimitDataAnalysisExpiredConsumptionNumber, - "task_bundle_limit_data_analysis_consumption_number": taskBalance.TaskBundleLimitDataAnalysisConsumptionNumber, - "task_increase_limit_data_analysis_consumption_number": taskBalance.TaskIncreaseLimitDataAnalysisConsumptionNumber, - "task_bundle_data_analysis_consumption_number": taskBalance.TaskBundleDataAnalysisConsumptionNumber, - "task_increase_data_analysis_consumption_number": taskBalance.TaskIncreaseDataAnalysisConsumptionNumber, - // 通用 - "updated_at": time.Now(), - } - if err = tx.Model(&taskBalance).Updates(updateBal).Error; err != nil { - tx.Rollback() - return commonErr.ReturnError(err, "更新任务余额失败", "更新任务余额失败: ") - } - } - - // 提交事务 - if err = tx.Commit().Error; err != nil { - return commonErr.ReturnError(err, "提交事务失败", "提交事务失败: ") - } - - return nil -} - -// minInt 返回两个整数的较小值 -func minInt(a, b int) int { - if a < b { - return a - } - return b -} - -// maxInt 返回两个整数的较大值 -func maxInt(a, b int) int { - if a > b { - return a - } - return b -} - // GetRecentAssignRecords 查询最近被指派记录 // 查询操作类型为"指派"的最近n条不同员工的记录 func GetRecentAssignRecords(limit int) ([]*model.TaskAssignRecords, error) { @@ -1346,6 +556,64 @@ func GetTaskManagementBySubNum(subNum string) (*model.TaskManagement, error) { return &task, nil } +// GetTaskBalanceBySubNum 根据艺人编号查询任务余额记录 +func GetTaskBalanceBySubNum(subNum string) (*model.TaskBalance, error) { + var taskBalance model.TaskBalance + now := time.Now() + + // 优先查询当前有效期内的记录 + err := app.ModuleClients.TaskBenchDB.Where("sub_num = ? AND start_at <= ? AND expired_at >= ?", + subNum, now, now).Order("start_at DESC").First(&taskBalance).Error + + if err != nil { + if err == gorm.ErrRecordNotFound { + // 如果没有当前有效的记录,查询最新的记录 + err = app.ModuleClients.TaskBenchDB.Where("sub_num = ?", subNum). + Order("start_at DESC").First(&taskBalance).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil, nil // 记录不存在 + } + return nil, commonErr.ReturnError(err, "查询任务余额记录失败", "查询任务余额记录失败: ") + } + } else { + return nil, commonErr.ReturnError(err, "查询任务余额记录失败", "查询任务余额记录失败: ") + } + } + + return &taskBalance, nil +} + +// GetRemainingPendingBySubNum 根据艺人编号查询剩余待发数量(区分套餐/增值,共6个字段) +func GetRemainingPendingBySubNum(subNum string) (*ArtistRemainingPendingResponse, error) { + if subNum == "" { + return nil, commonErr.ReturnError(nil, "查询参数错误", "艺人编号不能为空") + } + + tb, err := GetTaskBalanceBySubNum(subNum) + if err != nil { + return nil, err + } + if tb == nil { + // 没有余额记录,视为 0 + return &ArtistRemainingPendingResponse{}, nil + } + + // 计算套餐与增值剩余待发数量(非限制 + 限制非过期 + 限制会过期) + bundleVideo, bundleImage, bundleData := calculateBundleBalances(tb) + increaseVideo, increaseImage, increaseData := calculateIncreaseBalances(tb) + + return &ArtistRemainingPendingResponse{ + PendingBundleVideoCount: bundleVideo, + PendingBundleImageCount: bundleImage, + PendingBundleDataAnalysisCount: bundleData, + + PendingIncreaseVideoCount: increaseVideo, + PendingIncreaseImageCount: increaseImage, + PendingIncreaseDataAnalysisCount: increaseData, + }, nil +} + // GetAssignRecordByUUID 根据UUID查询指派记录 func GetAssignRecordByUUID(uuid string) (*model.TaskAssignRecords, error) { var record model.TaskAssignRecords @@ -1506,205 +774,52 @@ func UpdateTaskRecordsByAssigneeNum(taskAssigneeNum string) error { return nil } -// GetArtistBundleBalance 根据艺人编号或手机号查询套餐剩余数量 -// 优先使用艺人编号查询,如果为空则使用手机号查询 -func GetArtistBundleBalance(req *ArtistBundleBalanceRequest) (*ArtistBundleBalanceResponse, error) { - // 构建子查询,获取用户的最新订单记录 - subQuery := app.ModuleClients.BundleDB.Table("bundle_order_records as bor1"). - Select("bor1.*"). - Joins(`INNER JOIN ( - SELECT customer_id, MAX(created_at) AS max_created_time - FROM bundle_order_records - GROUP BY customer_id - ) bor2 ON bor1.customer_id = bor2.customer_id AND bor1.created_at = bor2.max_created_time`) - - // 主查询,关联用户表和实名信息表 - session := app.ModuleClients.BundleDB.Table("`micro-account`.`user` AS u"). - Select(`u.id, bor.customer_num, rn.name as user_name, - u.tel_num as user_phone_number, bor.bundle_name, bor.expiration_time, - bor.status, bor.uuid as order_uuid, bb.account_number, bb.account_consumption_number, - bb.video_number, bb.video_consumption_number, bb.image_number, bb.image_consumption_number, - bb.data_analysis_number, bb.data_analysis_consumption_number, bb.expansion_packs_number`). - Joins("LEFT JOIN `micro-account`.real_name rn ON u.real_name_id = rn.id"). - Joins("LEFT JOIN (?) as bor ON bor.customer_id = u.id", subQuery). - Joins("LEFT JOIN bundle_balance bb ON u.id = bb.user_id AND bb.order_uuid = bor.uuid"). - Where("rn.name IS NOT NULL"). - Where("u.deleted_at = 0"). - Where("bor.expiration_time > ?", time.Now().Format("2006-01-02 15:04:05")). - Where("bor.status = ?", 2) // 2:已签已支付 - - // 根据查询条件添加WHERE子句 - if req.CustomerNum != "" { - session = session.Where("bor.customer_num = ?", req.CustomerNum) - } else if req.TelNum != "" { - session = session.Where("u.tel_num = ?", req.TelNum) - } else { - return nil, commonErr.ReturnError(nil, "查询参数错误", "艺人编号和手机号不能同时为空") - } - - var data ValidArtistInfo - err := session.Take(&data).Error // 使用Take()替代First(),避免自动排序 - if err != nil { - if err == gorm.ErrRecordNotFound { - return nil, commonErr.ReturnError(err, "艺人不存在或套餐已过期", "未找到有效的艺人套餐信息") +// GetPendingTaskList 查询待指派任务记录(按有效艺人过滤) +// 说明:由于待发视频/图文/数据以及进行中/已完成数量来自不同表,这里仅返回基础字段,后续由逻辑层计算并排序 +func GetPendingTaskList(req *TaskQueryRequest, validArtist []ValidArtistInfo) ([]*TaskQueryResponse, int64, error) { + // 提取有效艺人的艺人编号(sub_num) + subNums := make([]string, 0, len(validArtist)) + for _, a := range validArtist { + if a.CustomerNum != "" { + subNums = append(subNums, a.CustomerNum) } - return nil, commonErr.ReturnError(err, "查询艺人套餐信息失败", "查询艺人套餐信息失败: ") + } + if len(subNums) == 0 { + // 没有有效艺人,直接返回空 + return []*TaskQueryResponse{}, 0, nil } - // 计算剩余数量 - response := &ArtistBundleBalanceResponse{ - RemainingVideoCount: data.VideoNumber - data.VideoConsumptionNumber, - RemainingImageCount: data.ImageNumber - data.ImageConsumptionNumber, - RemainingDataAnalysisCount: data.DataAnalysisNumber - data.DataAnalysisConsumptionNumber, + // 构建 TaskManagement 的基础查询 + query := app.ModuleClients.TaskBenchDB.Model(&model.TaskManagement{}). + Select("sub_num, tel_num, artist_name, last_task_assignee, task_assignee_num"). + Where("sub_num IN ?", subNums) + + // 关键词搜索(支持 sub_num / tel_num / artist_name) + if req.Keyword != "" { + like := "%" + req.Keyword + "%" + query = query.Where("(sub_num LIKE ? OR tel_num LIKE ? OR artist_name LIKE ?)", like, like, like) } - return response, nil -} - -// AdjustPendingCountRequest 调整待发数量请求参数 -type AdjustPendingCountRequest struct { - SubNum string `json:"subNum"` // 艺人编号 - TelNum string `json:"telNum"` // 艺人手机号 - ArtistName string `json:"artistName"` // 艺人姓名 - AdjustVideoCount int `json:"adjustVideoCount"` // 调整视频数量(正数为增加,负数为减少) - AdjustPostCount int `json:"adjustPostCount"` // 调整图文数量(正数为增加,负数为减少) - AdjustDataCount int `json:"adjustDataCount"` // 调整数据数量(正数为增加,负数为减少) - CreateIfNotExists bool `json:"createIfNotExists"` // 如果记录不存在是否创建 -} - -// AdjustPendingCount 调整待发数量(增加或减少) -// 支持正数增加和负数减少,可用于套餐扩展时同步增加待发任务数量 -func AdjustPendingCount(req *AdjustPendingCountRequest) error { - // 开启事务 - tx := app.ModuleClients.TaskBenchDB.Begin() - defer func() { - if r := recover(); r != nil { - tx.Rollback() - } - }() - - // 1. 查询现有任务记录 - var taskManagement model.TaskManagement - err := tx.Where("sub_num = ? AND tel_num = ?", req.SubNum, req.TelNum).First(&taskManagement).Error - if err != nil { - if err == gorm.ErrRecordNotFound { - if req.CreateIfNotExists { - // 创建新记录,正数增加分配到“非限制-套餐权益”,负数忽略(置0) - video := req.AdjustVideoCount - post := req.AdjustPostCount - data := req.AdjustDataCount - if video < 0 { - video = 0 - } - if post < 0 { - post = 0 - } - if data < 0 { - data = 0 - } - - taskManagement = model.TaskManagement{ - SubNum: req.SubNum, - TelNum: req.TelNum, - ArtistName: req.ArtistName, - - // 视频 - PendingBundleVideoCount: video, - PendingIncreaseVideoCount: 0, - PendingBundleLimitVideoCount: 0, - PendingIncreaseLimitVideoCount: 0, - PendingBundleLimitVideoExpiredCount: 0, - PendingIncreaseLimitVideoExpiredCount: 0, - // 图片 - PendingBundleImageCount: post, - PendingIncreaseImageCount: 0, - PendingBundleLimitImageCount: 0, - PendingIncreaseLimitImageCount: 0, - PendingBundleLimitImageExpiredCount: 0, - PendingIncreaseLimitImageExpiredCount: 0, - // 数据分析 - PendingBundleDataAnalysisCount: data, - PendingIncreaseDataAnalysisCount: 0, - PendingBundleLimitDataAnalysisCount: 0, - PendingIncreaseLimitDataAnalysisCount: 0, - PendingBundleLimitDataAnalysisExpiredCount: 0, - PendingIncreaseLimitDataAnalysisExpiredCount: 0, - - ProgressCount: 0, - CompleteCount: 0, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - } - - if err = tx.Create(&taskManagement).Error; err != nil { - tx.Rollback() - return commonErr.ReturnError(err, "创建任务记录失败", "创建任务记录失败: ") - } - } else { - tx.Rollback() - return commonErr.ReturnError(err, "任务记录不存在", "找不到对应的任务记录") - } - } else { - tx.Rollback() - return commonErr.ReturnError(err, "查询任务记录失败", "查询任务记录失败: ") - } - } else { - // 2. 计算调整:正数增加分配到“非限制-套餐权益”;负数按优先级扣减 - if req.AdjustVideoCount > 0 { - taskManagement.PendingBundleVideoCount += req.AdjustVideoCount - } else if req.AdjustVideoCount < 0 { - deductVideo(&taskManagement, -req.AdjustVideoCount) - } - - if req.AdjustPostCount > 0 { - taskManagement.PendingBundleImageCount += req.AdjustPostCount - } else if req.AdjustPostCount < 0 { - deductImage(&taskManagement, -req.AdjustPostCount) - } - - if req.AdjustDataCount > 0 { - taskManagement.PendingBundleDataAnalysisCount += req.AdjustDataCount - } else if req.AdjustDataCount < 0 { - deductData(&taskManagement, -req.AdjustDataCount) - } - - // 4. 更新TaskManagement表 - updateData := map[string]interface{}{ - // 视频 - "pending_bundle_limit_video_expired_count": taskManagement.PendingBundleLimitVideoExpiredCount, - "pending_bundle_limit_video_count": taskManagement.PendingBundleLimitVideoCount, - "pending_increase_limit_video_expired_count": taskManagement.PendingIncreaseLimitVideoExpiredCount, - "pending_increase_limit_video_count": taskManagement.PendingIncreaseLimitVideoCount, - "pending_bundle_video_count": taskManagement.PendingBundleVideoCount, - "pending_increase_video_count": taskManagement.PendingIncreaseVideoCount, - // 图片 - "pending_bundle_limit_image_expired_count": taskManagement.PendingBundleLimitImageExpiredCount, - "pending_bundle_limit_image_count": taskManagement.PendingBundleLimitImageCount, - "pending_increase_limit_image_expired_count": taskManagement.PendingIncreaseLimitImageExpiredCount, - "pending_increase_limit_image_count": taskManagement.PendingIncreaseLimitImageCount, - "pending_bundle_image_count": taskManagement.PendingBundleImageCount, - "pending_increase_image_count": taskManagement.PendingIncreaseImageCount, - // 数据分析 - "pending_bundle_limit_data_analysis_expired_count": taskManagement.PendingBundleLimitDataAnalysisExpiredCount, - "pending_bundle_limit_data_analysis_count": taskManagement.PendingBundleLimitDataAnalysisCount, - "pending_increase_limit_data_analysis_expired_count": taskManagement.PendingIncreaseLimitDataAnalysisExpiredCount, - "pending_increase_limit_data_analysis_count": taskManagement.PendingIncreaseLimitDataAnalysisCount, - "pending_bundle_data_analysis_count": taskManagement.PendingBundleDataAnalysisCount, - "pending_increase_data_analysis_count": taskManagement.PendingIncreaseDataAnalysisCount, - // 通用 - "updated_at": time.Now(), - } - - if err = tx.Model(&taskManagement).Updates(updateData).Error; err != nil { - tx.Rollback() - return commonErr.ReturnError(err, "更新任务记录失败", "更新任务记录失败: ") - } - } - - // 提交事务 - if err = tx.Commit().Error; err != nil { - return commonErr.ReturnError(err, "提交事务失败", "提交事务失败: ") - } - - return nil + // 执行查询(不做排序与分页,交由逻辑层处理) + var tmList []model.TaskManagement + if err := query.Find(&tmList).Error; err != nil { + return nil, 0, commonErr.ReturnError(err, "查询待指派任务记录失败", "查询待指派任务记录失败: ") + } + + // 统计总数(分页前) + total := int64(len(tmList)) + + // 映射为响应结构(基础字段) + resp := make([]*TaskQueryResponse, 0, len(tmList)) + for _, t := range tmList { + resp = append(resp, &TaskQueryResponse{ + SubNum: t.SubNum, + TelNum: t.TelNum, + ArtistName: t.ArtistName, + LastTaskAssignee: t.LastTaskAssignee, + TaskAssigneeNum: t.TaskAssigneeNum, + }) + } + + return resp, total, nil } diff --git a/internal/logic/taskLogic.go b/internal/logic/taskLogic.go index 31d7e26..8680967 100644 --- a/internal/logic/taskLogic.go +++ b/internal/logic/taskLogic.go @@ -4,6 +4,8 @@ import ( "fmt" "micro-bundle/internal/dao" commonErr "micro-bundle/pkg/err" + "sort" + "strings" ) // GetValidArtistList 查询套餐状态为有效中的艺人列表 @@ -78,10 +80,8 @@ func GetPendingTaskList(req *dao.TaskQueryRequest) ([]*dao.TaskQueryResponse, in // 3. 转换为响应结构体 var recordResponse []*dao.TaskQueryResponse for _, record := range record { - // 计算聚合的待发数量:视频、图文、数据分析 - videoTotal := record.PendingBundleLimitVideoExpiredCount + record.PendingBundleLimitVideoCount + record.PendingIncreaseLimitVideoExpiredCount + record.PendingIncreaseLimitVideoCount + record.PendingBundleVideoCount + record.PendingIncreaseVideoCount - imageTotal := record.PendingBundleLimitImageExpiredCount + record.PendingBundleLimitImageCount + record.PendingIncreaseLimitImageExpiredCount + record.PendingIncreaseLimitImageCount + record.PendingBundleImageCount + record.PendingIncreaseImageCount - dataTotal := record.PendingBundleLimitDataAnalysisExpiredCount + record.PendingBundleLimitDataAnalysisCount + record.PendingIncreaseLimitDataAnalysisExpiredCount + record.PendingIncreaseLimitDataAnalysisCount + record.PendingBundleDataAnalysisCount + record.PendingIncreaseDataAnalysisCount + // 从TaskBalance表计算待发任务数量:任务余额 - 消耗数量 + videoTotal, imageTotal, dataTotal := calculatePendingFromTaskBalance(record.SubNum) // 根据 SubNum 和 TelNum 查询对应的员工正在进行中的任务和已完成任务数量 progressTaskCount, completeTaskCount, err := dao.GetTaskAssigneeInfo(record.TaskAssigneeNum) @@ -114,6 +114,67 @@ func GetPendingTaskList(req *dao.TaskQueryRequest) ([]*dao.TaskQueryResponse, in } } + // 4. 处理待发数量相关的排序(在Logic层处理,因为这些数据从TaskBalance表计算) + if req.SortBy != "" && req.SortType != "" { + sortType := req.SortType + if sortType != "asc" && sortType != "desc" && sortType != "ASC" && sortType != "DESC" { + sortType = "DESC" + } + + switch req.SortBy { + case "pending_video_count", "pendingVideoCount": + sort.Slice(recordResponse, func(i, j int) bool { + if strings.ToUpper(sortType) == "ASC" { + return recordResponse[i].PendingVideoCount < recordResponse[j].PendingVideoCount + } + return recordResponse[i].PendingVideoCount > recordResponse[j].PendingVideoCount + }) + case "pending_post_count", "pendingPostCount": + sort.Slice(recordResponse, func(i, j int) bool { + if strings.ToUpper(sortType) == "ASC" { + return recordResponse[i].PendingPostCount < recordResponse[j].PendingPostCount + } + return recordResponse[i].PendingPostCount > recordResponse[j].PendingPostCount + }) + case "pending_data_count", "pendingDataCount": + sort.Slice(recordResponse, func(i, j int) bool { + if strings.ToUpper(sortType) == "ASC" { + return recordResponse[i].PendingDataCount < recordResponse[j].PendingDataCount + } + return recordResponse[i].PendingDataCount > recordResponse[j].PendingDataCount + }) + case "progress_task_count", "progressTaskCount": + sort.Slice(recordResponse, func(i, j int) bool { + if strings.ToUpper(sortType) == "ASC" { + return recordResponse[i].ProgressTaskCount < recordResponse[j].ProgressTaskCount + } + return recordResponse[i].ProgressTaskCount > recordResponse[j].ProgressTaskCount + }) + case "complete_task_count", "completeTaskCount": + sort.Slice(recordResponse, func(i, j int) bool { + if strings.ToUpper(sortType) == "ASC" { + return recordResponse[i].CompleteTaskCount < recordResponse[j].CompleteTaskCount + } + return recordResponse[i].CompleteTaskCount > recordResponse[j].CompleteTaskCount + }) + } + } + + // 5. 分页(在排序后进行) + total = int64(len(recordResponse)) + if req.PageSize > 0 && req.Page > 0 { + offset := (req.Page - 1) * req.PageSize + if offset < len(recordResponse) { + end := offset + req.PageSize + if end > len(recordResponse) { + end = len(recordResponse) + } + recordResponse = recordResponse[offset:end] + } else { + recordResponse = []*dao.TaskQueryResponse{} + } + } + return recordResponse, total, nil } @@ -160,49 +221,17 @@ func UpdatePendingCount(req *dao.UpdatePendingCountRequest) error { return commonErr.ReturnError(nil, "艺人套餐已过期", "该艺人没有有效的套餐,无法修改待发数量") } - // 查询艺人当前任务余额与待发汇总,校验待发数量和余额的总和是否足够 - resp, err := dao.GetUserPendingAndTaskBalances(&dao.PendingAndBalanceRequest{ - SubNum: req.SubNum, - TelNum: req.TelNum, - }) + // 查询艺人当前任务余额,校验余额的总和是否足够 + resp, err := dao.GetRemainingPendingBySubNum(req.SubNum) if err != nil { return commonErr.ReturnError(err, "查询艺人任务余额失败", "查询艺人任务余额失败: ") } - // 计算当前待发数量(聚合所有类型) - curVideo := resp.PendingBundleVideoCount + resp.PendingIncreaseVideoCount - curImage := resp.PendingBundleImageCount + resp.PendingIncreaseImageCount - curData := resp.PendingBundleDataAnalysisCount + resp.PendingIncreaseDataAnalysisCount - - // 计算可用余额(套餐 + 增值) - availVideo := resp.BundleVideoBalance + resp.IncreaseVideoBalance - availImage := resp.BundleImageBalance + resp.IncreaseImageBalance - availData := resp.BundleDataAnalysisBalance + resp.IncreaseDataAnalysisBalance - - // 校验:当前待发数量 + 艺人余额 >= 目标数量 - // 这确保了可以优先扣减待发数量,不足时再扣减余额 - totalAvailVideo := curVideo + availVideo - totalAvailImage := curImage + availImage - totalAvailData := curData + availData - - if req.PendingVideoCount > totalAvailVideo { - return commonErr.ReturnError(nil, "视频任务数量不足", - fmt.Sprintf("目标待发视频数量(%d)超出当前待发数量(%d)和可用余额(%d)的总和(%d)", - req.PendingVideoCount, curVideo, availVideo, totalAvailVideo)) - } - if req.PendingPostCount > totalAvailImage { - return commonErr.ReturnError(nil, "图文任务数量不足", - fmt.Sprintf("目标待发图文数量(%d)超出当前待发数量(%d)和可用余额(%d)的总和(%d)", - req.PendingPostCount, curImage, availImage, totalAvailImage)) - } - if req.PendingDataCount > totalAvailData { - return commonErr.ReturnError(nil, "数据分析任务数量不足", - fmt.Sprintf("目标待发数据分析数量(%d)超出当前待发数量(%d)和可用余额(%d)的总和(%d)", - req.PendingDataCount, curData, availData, totalAvailData)) - } + fmt.Println(resp) // 2. 调用DAO层更新待发数量 - return dao.UpdatePendingCount(req) + // return dao.UpdatePendingCount(req) + return nil } // GetRecentAssignRecords 查询最近被指派记录 @@ -304,14 +333,54 @@ func GetTaskAssignRecordsList(req *dao.TaskAssignRecordsQueryRequest) ([]*dao.Ta return recordResponse, total, nil } -// // GetArtistBundleBalance 查询艺人套餐剩余数量 -// func GetArtistBundleBalance(req *dao.ArtistBundleBalanceRequest) (*dao.ArtistBundleBalanceResponse, error) { -// return dao.GetArtistBundleBalance(req) -// } - -// GetPendingAndTaskBalances 查询艺人当前的待发数量与任务余额(区分套餐/增值) -// 根据艺人的编号 SubNum 或手机号 TelNum 进行查询,优先使用编号 -// 返回的数据会区分为“套餐类型”和“增值类型”两大类,涵盖视频/图文/数据分析三种任务 -func GetPendingAndTaskBalances(req *dao.PendingAndBalanceRequest) (*dao.PendingAndBalanceResponse, error) { - return dao.GetUserPendingAndTaskBalances(req) +// 新增:查询艺人剩余待发数量(区分套餐/增值,共6个字段) +func GetArtistRemainingPending(subNum string) (*dao.ArtistRemainingPendingResponse, error) { + if strings.TrimSpace(subNum) == "" { + return nil, commonErr.ReturnError(nil, "查询参数错误", "艺人编号不能为空") + } + return dao.GetRemainingPendingBySubNum(subNum) +} + +// calculatePendingFromTaskBalance 从TaskBalance表计算待发任务数量 +func calculatePendingFromTaskBalance(subNum string) (videoTotal, imageTotal, dataTotal int) { + // 查询用户的任务余额 + taskBalance, err := dao.GetTaskBalanceBySubNum(subNum) + if err != nil || taskBalance == nil { + return 0, 0, 0 + } + + // 计算视频类待发数量:总余额 - 消耗数量 + videoTotal = (taskBalance.TaskBundleVideoNumber - taskBalance.TaskBundleVideoConsumptionNumber) + + (taskBalance.TaskIncreaseVideoNumber - taskBalance.TaskIncreaseVideoConsumptionNumber) + + (taskBalance.TaskBundleLimitVideoNumber - taskBalance.TaskBundleLimitVideoConsumptionNumber) + + (taskBalance.TaskIncreaseLimitVideoNumber - taskBalance.TaskIncreaseLimitVideoConsumptionNumber) + + (taskBalance.TaskBundleLimitVideoExpiredNumber - taskBalance.TaskBundleLimitVideoExpiredConsumptionNumber) + + (taskBalance.TaskIncreaseLimitVideoExpiredNumber - taskBalance.TaskIncreaseLimitVideoExpiredConsumptionNumber) + if videoTotal < 0 { + videoTotal = 0 + } + + // 计算图片类待发数量:总余额 - 消耗数量 + imageTotal = (taskBalance.TaskBundleImageNumber - taskBalance.TaskBundleImageConsumptionNumber) + + (taskBalance.TaskIncreaseImageNumber - taskBalance.TaskIncreaseImageConsumptionNumber) + + (taskBalance.TaskBundleLimitImageNumber - taskBalance.TaskBundleLimitImageConsumptionNumber) + + (taskBalance.TaskIncreaseLimitImageNumber - taskBalance.TaskIncreaseLimitImageConsumptionNumber) + + (taskBalance.TaskBundleLimitImageExpiredNumber - taskBalance.TaskBundleLimitImageExpiredConsumptionNumber) + + (taskBalance.TaskIncreaseLimitImageExpiredNumber - taskBalance.TaskIncreaseLimitImageExpiredConsumptionNumber) + if imageTotal < 0 { + imageTotal = 0 + } + + // 计算数据分析类待发数量:总余额 - 消耗数量 + dataTotal = (taskBalance.TaskBundleDataAnalysisNumber - taskBalance.TaskBundleDataAnalysisConsumptionNumber) + + (taskBalance.TaskIncreaseDataAnalysisNumber - taskBalance.TaskIncreaseDataAnalysisConsumptionNumber) + + (taskBalance.TaskBundleLimitDataAnalysisNumber - taskBalance.TaskBundleLimitDataAnalysisConsumptionNumber) + + (taskBalance.TaskIncreaseLimitDataAnalysisNumber - taskBalance.TaskIncreaseLimitDataAnalysisConsumptionNumber) + + (taskBalance.TaskBundleLimitDataAnalysisExpiredNumber - taskBalance.TaskBundleLimitDataAnalysisExpiredConsumptionNumber) + + (taskBalance.TaskIncreaseLimitDataAnalysisExpiredNumber - taskBalance.TaskIncreaseLimitDataAnalysisExpiredConsumptionNumber) + if dataTotal < 0 { + dataTotal = 0 + } + + return videoTotal, imageTotal, dataTotal } diff --git a/internal/model/task.go b/internal/model/task.go index 71d68ac..dd41167 100644 --- a/internal/model/task.go +++ b/internal/model/task.go @@ -12,30 +12,6 @@ type TaskManagement struct { TelNum string `gorm:"column:tel_num;comment:手机号;index:idx_tel_num;index:idx_sub_tel,priority:2" json:"telNum"` ArtistName string `gorm:"column:artist_name;comment:艺人名称;index:idx_artist_name" json:"artistName"` - // ===== 待发视频类任务 ===== - PendingBundleVideoCount int `gorm:"column:pending_bundle_video_count;comment:待发非限制类型套餐权益视频数量" json:"pendingBundleVideoCount"` - PendingIncreaseVideoCount int `gorm:"column:pending_increase_video_count;comment:待发非限制类型增值权益视频数量" json:"pendingIncreaseVideoCount"` - PendingBundleLimitVideoCount int `gorm:"column:pending_bundle_limit_video_count;comment:待发套餐权益限制类型非过期视频数量" json:"pendingBundleLimitVideoCount"` - PendingIncreaseLimitVideoCount int `gorm:"column:pending_increase_limit_video_count;comment:待发增值权益限制类型非过期视频数量" json:"pendingIncreaseLimitVideoCount"` - PendingBundleLimitVideoExpiredCount int `gorm:"column:pending_bundle_limit_video_expired_count;comment:待发套餐权益限制类型会过期视频数量" json:"pendingBundleLimitVideoExpiredCount"` - PendingIncreaseLimitVideoExpiredCount int `gorm:"column:pending_increase_limit_video_expired_count;comment:待发增值权益限制类型会过期视频数量" json:"pendingIncreaseLimitVideoExpiredCount"` - - // ===== 待发图片类任务 ===== - PendingBundleImageCount int `gorm:"column:pending_bundle_image_count;comment:待发非限制类型套餐权益图片数量" json:"pendingBundleImageCount"` - PendingIncreaseImageCount int `gorm:"column:pending_increase_image_count;comment:待发非限制类型增值权益图片数量" json:"pendingIncreaseImageCount"` - PendingBundleLimitImageCount int `gorm:"column:pending_bundle_limit_image_count;comment:待发套餐权益限制类型非过期图片数量" json:"pendingBundleLimitImageCount"` - PendingIncreaseLimitImageCount int `gorm:"column:pending_increase_limit_image_count;comment:待发增值权益限制类型非过期图片数量" json:"pendingIncreaseLimitImageCount"` - PendingBundleLimitImageExpiredCount int `gorm:"column:pending_bundle_limit_image_expired_count;comment:待发套餐权益限制类型会过期图片数量" json:"pendingBundleLimitImageExpiredCount"` - PendingIncreaseLimitImageExpiredCount int `gorm:"column:pending_increase_limit_image_expired_count;comment:待发增值权益限制类型会过期图片数量" json:"pendingIncreaseLimitImageExpiredCount"` - - // ===== 待发数据分析类任务 ===== - PendingBundleDataAnalysisCount int `gorm:"column:pending_bundle_data_analysis_count;comment:待发非限制类型套餐权益数据分析数量" json:"pendingBundleDataAnalysisCount"` - PendingIncreaseDataAnalysisCount int `gorm:"column:pending_increase_data_analysis_count;comment:待发非限制类型增值权益数据分析数量" json:"pendingIncreaseDataAnalysisCount"` - PendingBundleLimitDataAnalysisCount int `gorm:"column:pending_bundle_limit_data_analysis_count;comment:待发套餐权益限制类型非过期数据分析数量" json:"pendingBundleLimitDataAnalysisCount"` - PendingIncreaseLimitDataAnalysisCount int `gorm:"column:pending_increase_limit_data_analysis_count;comment:待发增值权益限制类型非过期数据分析数量" json:"pendingIncreaseLimitDataAnalysisCount"` - PendingBundleLimitDataAnalysisExpiredCount int `gorm:"column:pending_bundle_limit_data_analysis_expired_count;comment:待发套餐权益限制类型会过期数据分析数量" json:"pendingBundleLimitDataAnalysisExpiredCount"` - PendingIncreaseLimitDataAnalysisExpiredCount int `gorm:"column:pending_increase_limit_data_analysis_expired_count;comment:待发增值权益限制类型会过期数据分析数量" json:"pendingIncreaseLimitDataAnalysisExpiredCount"` - LastTaskAssignee string `gorm:"column:last_task_assignee;comment:最后一次的任务指派人" json:"lastTaskAssignee"` TaskAssigneeNum string `gorm:"column:task_assignee_num;comment:任务指派人账号" json:"taskAssigneeNum"` ProgressCount int `gorm:"column:progress_count;comment:进行中的任务数量" json:"progressCount"`