bugfix:去掉任务管理表中任务字段

This commit is contained in:
cjy 2025-10-21 17:50:04 +08:00
parent 3e1739d5c0
commit 142bf642dd
4 changed files with 256 additions and 1095 deletions

View File

@ -273,33 +273,34 @@ func convertToTaskAssignRecordInfo(record *dao.TaskAssignRecordsResponse) *bundl
// - 查询条件优先使用艺人编号customerNum为空时使用手机号telNum // - 查询条件优先使用艺人编号customerNum为空时使用手机号telNum
// - 返回同时包含“套餐类型”和“增值类型”的余额与待发数量,均按视频/图文/数据分析三类区分 // - 返回同时包含“套餐类型”和“增值类型”的余额与待发数量,均按视频/图文/数据分析三类区分
func (b *BundleProvider) GetArtistBundleBalance(_ context.Context, req *bundle.ArtistBundleBalanceRequest) (*bundle.ArtistBundleBalanceResponse, error) { func (b *BundleProvider) GetArtistBundleBalance(_ context.Context, req *bundle.ArtistBundleBalanceRequest) (*bundle.ArtistBundleBalanceResponse, error) {
// 参数校验 // 参数校验:艺人编号与手机号不能同时为空
if req.CustomerNum == "" && req.TelNum == "" { if req.CustomerNum == "" && req.TelNum == "" {
return nil, fmt.Errorf("艺人编号和手机号不能同时为空") return nil, fmt.Errorf("艺人编号和手机号不能同时为空")
} }
// 组装查询参数(逻辑层/DAO层使用 SubNum 与 TelNum // 仅使用艺人编号进行查询与DAO层 GetRemainingPendingBySubNum 一致)
pendingReq := &dao.PendingAndBalanceRequest{ subNum := req.CustomerNum
SubNum: req.CustomerNum, // 映射 customerNum -> SubNum if subNum == "" {
TelNum: req.TelNum, // 映射 telNum -> TelNum // 暂不支持通过手机号查询剩余待发数据
return nil, fmt.Errorf("暂不支持通过手机号查询剩余待发数据,请传入艺人编号")
} }
// 调用逻辑层:查询待发数量与任务余额(区分套餐/增值) // 调用逻辑层:查询剩余待发数量(区分套餐/增值)
resp, err := logic.GetPendingAndTaskBalances(pendingReq) resp, err := logic.GetArtistRemainingPending(subNum)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// 映射为proto响应结构套餐/增值分别返回视频/图文/数据分析的余额与待发数量) // 组装proto响应非DAO返回字段统一置为0
return &bundle.ArtistBundleBalanceResponse{ return &bundle.ArtistBundleBalanceResponse{
// 套餐类型余额 // 套餐类型余额暂置0
BundleVideoBalance: int32(resp.BundleVideoBalance), BundleVideoBalance: 0,
BundleImageBalance: int32(resp.BundleImageBalance), BundleImageBalance: 0,
BundleDataAnalysisBalance: int32(resp.BundleDataAnalysisBalance), BundleDataAnalysisBalance: 0,
// 增值类型余额 // 增值类型余额暂置0
IncreaseVideoBalance: int32(resp.IncreaseVideoBalance), IncreaseVideoBalance: 0,
IncreaseImageBalance: int32(resp.IncreaseImageBalance), IncreaseImageBalance: 0,
IncreaseDataAnalysisBalance: int32(resp.IncreaseDataAnalysisBalance), IncreaseDataAnalysisBalance: 0,
// 套餐类型待发数量 // 套餐类型待发数量
BundlePendingVideoCount: int32(resp.PendingBundleVideoCount), BundlePendingVideoCount: int32(resp.PendingBundleVideoCount),
BundlePendingImageCount: int32(resp.PendingBundleImageCount), BundlePendingImageCount: int32(resp.PendingBundleImageCount),

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,8 @@ import (
"fmt" "fmt"
"micro-bundle/internal/dao" "micro-bundle/internal/dao"
commonErr "micro-bundle/pkg/err" commonErr "micro-bundle/pkg/err"
"sort"
"strings"
) )
// GetValidArtistList 查询套餐状态为有效中的艺人列表 // GetValidArtistList 查询套餐状态为有效中的艺人列表
@ -78,10 +80,8 @@ func GetPendingTaskList(req *dao.TaskQueryRequest) ([]*dao.TaskQueryResponse, in
// 3. 转换为响应结构体 // 3. 转换为响应结构体
var recordResponse []*dao.TaskQueryResponse var recordResponse []*dao.TaskQueryResponse
for _, record := range record { for _, record := range record {
// 计算聚合的待发数量:视频、图文、数据分析 // 从TaskBalance表计算待发任务数量任务余额 - 消耗数量
videoTotal := record.PendingBundleLimitVideoExpiredCount + record.PendingBundleLimitVideoCount + record.PendingIncreaseLimitVideoExpiredCount + record.PendingIncreaseLimitVideoCount + record.PendingBundleVideoCount + record.PendingIncreaseVideoCount videoTotal, imageTotal, dataTotal := calculatePendingFromTaskBalance(record.SubNum)
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
// 根据 SubNum 和 TelNum 查询对应的员工正在进行中的任务和已完成任务数量 // 根据 SubNum 和 TelNum 查询对应的员工正在进行中的任务和已完成任务数量
progressTaskCount, completeTaskCount, err := dao.GetTaskAssigneeInfo(record.TaskAssigneeNum) 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 return recordResponse, total, nil
} }
@ -160,49 +221,17 @@ func UpdatePendingCount(req *dao.UpdatePendingCountRequest) error {
return commonErr.ReturnError(nil, "艺人套餐已过期", "该艺人没有有效的套餐,无法修改待发数量") return commonErr.ReturnError(nil, "艺人套餐已过期", "该艺人没有有效的套餐,无法修改待发数量")
} }
// 查询艺人当前任务余额与待发汇总,校验待发数量和余额的总和是否足够 // 查询艺人当前任务余额,校验余额的总和是否足够
resp, err := dao.GetUserPendingAndTaskBalances(&dao.PendingAndBalanceRequest{ resp, err := dao.GetRemainingPendingBySubNum(req.SubNum)
SubNum: req.SubNum,
TelNum: req.TelNum,
})
if err != nil { if err != nil {
return commonErr.ReturnError(err, "查询艺人任务余额失败", "查询艺人任务余额失败: ") return commonErr.ReturnError(err, "查询艺人任务余额失败", "查询艺人任务余额失败: ")
} }
// 计算当前待发数量(聚合所有类型) fmt.Println(resp)
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))
}
// 2. 调用DAO层更新待发数量 // 2. 调用DAO层更新待发数量
return dao.UpdatePendingCount(req) // return dao.UpdatePendingCount(req)
return nil
} }
// GetRecentAssignRecords 查询最近被指派记录 // GetRecentAssignRecords 查询最近被指派记录
@ -304,14 +333,54 @@ func GetTaskAssignRecordsList(req *dao.TaskAssignRecordsQueryRequest) ([]*dao.Ta
return recordResponse, total, nil return recordResponse, total, nil
} }
// // GetArtistBundleBalance 查询艺人套餐剩余数量 // 新增:查询艺人剩余待发数量(区分套餐/增值共6个字段
// func GetArtistBundleBalance(req *dao.ArtistBundleBalanceRequest) (*dao.ArtistBundleBalanceResponse, error) { func GetArtistRemainingPending(subNum string) (*dao.ArtistRemainingPendingResponse, error) {
// return dao.GetArtistBundleBalance(req) if strings.TrimSpace(subNum) == "" {
// } return nil, commonErr.ReturnError(nil, "查询参数错误", "艺人编号不能为空")
}
// GetPendingAndTaskBalances 查询艺人当前的待发数量与任务余额(区分套餐/增值) return dao.GetRemainingPendingBySubNum(subNum)
// 根据艺人的编号 SubNum 或手机号 TelNum 进行查询,优先使用编号 }
// 返回的数据会区分为“套餐类型”和“增值类型”两大类,涵盖视频/图文/数据分析三种任务
func GetPendingAndTaskBalances(req *dao.PendingAndBalanceRequest) (*dao.PendingAndBalanceResponse, error) { // calculatePendingFromTaskBalance 从TaskBalance表计算待发任务数量
return dao.GetUserPendingAndTaskBalances(req) 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
} }

View File

@ -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"` 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"` 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"` LastTaskAssignee string `gorm:"column:last_task_assignee;comment:最后一次的任务指派人" json:"lastTaskAssignee"`
TaskAssigneeNum string `gorm:"column:task_assignee_num;comment:任务指派人账号" json:"taskAssigneeNum"` TaskAssigneeNum string `gorm:"column:task_assignee_num;comment:任务指派人账号" json:"taskAssigneeNum"`
ProgressCount int `gorm:"column:progress_count;comment:进行中的任务数量" json:"progressCount"` ProgressCount int `gorm:"column:progress_count;comment:进行中的任务数量" json:"progressCount"`