Merge branch 'feat-cjy-taskLog' into dev

# Conflicts:
#	internal/logic/bundleExtendLogic.go
#	pb/bundle.proto
#	pb/bundle/bundle.pb.go
#	pb/bundle/bundle_triple.pb.go
#	pkg/msg/msg.go
This commit is contained in:
cjy 2025-12-28 12:56:46 +08:00
commit b8dfc8a6e6
11 changed files with 8302 additions and 3525 deletions

View File

@ -590,3 +590,35 @@ func (b *BundleProvider) AddHiddenTaskAssignee(_ context.Context, req *bundle.Ad
}
return &bundle.ComResponse{Msg: "删除该指派人成功"}, nil
}
// CreateTaskWorkLog 创建任务日志记录
func (b *BundleProvider) CreateTaskWorkLog(_ context.Context, req *bundle.CreateTaskWorkLogRequest) (*bundle.CommonResponse, error) {
// 转换请求参数
daoReq := &dao.CreateTaskWorkLogRequest{
AssignRecordsUUID: req.AssignRecordsUUID,
WorkUUID: req.WorkUUID,
Title: req.Title,
ArtistUUID: req.ArtistUUID,
SubNum: req.SubNum,
TelNum: req.TelNum,
ArtistName: req.ArtistName,
OperationType: int(req.OperationType),
TaskType: int(req.TaskType),
TaskCount: int(req.TaskCount),
Remark: req.Remark,
OperatorName: req.OperatorName,
OperatorNum: req.OperatorNum,
}
// 调用logic层
err := logic.CreateTaskWorkLog(daoReq)
if err != nil {
return &bundle.CommonResponse{
Msg: err.Error(),
}, err
}
return &bundle.CommonResponse{
Msg: "任务日志创建成功",
}, nil
}

View File

@ -3271,3 +3271,67 @@ func CreateMissingTaskManagementRecords(validArtist []ValidArtistInfo) error {
return nil
}
// CreateTaskWorkLogRequest 创建任务日志请求参数
type CreateTaskWorkLogRequest struct {
AssignRecordsUUID string `json:"assignRecordsUUID"` // 任务指派记录UUID必填
WorkUUID string `json:"workUUID"` // 任务作品UUID必填
Title string `json:"title"` // 任务作品标题
ArtistUUID string `json:"artistUUID"` // 任务艺人UUID
SubNum string `json:"subNum"` // 任务用户编号(必填)
TelNum string `json:"telNum"` // 任务用户手机号(必填)
ArtistName string `json:"artistName"` // 任务艺人名称
// 操作信息
OperationType int `json:"operationType"` // 任务操作类型 1:加任务 2:消耗任务 3:完成任务 4:任务过期(必填)
TaskType int `json:"taskType"` // 任务类型 1:视频 2:图片 3:数据分析(必填)
TaskCount int `json:"taskCount"` // 任务数量(必填)
Remark string `json:"remark"` // 任务备注
// 操作人信息
OperatorName string `json:"operatorName"` // 任务操作人姓名
OperatorNum string `json:"operatorNum"` // 任务操作人账号
}
// CreateTaskWorkLog 创建任务日志记录
func CreateTaskWorkLog(req *CreateTaskWorkLogRequest) error {
// 参数校验
if req == nil {
return commonErr.ReturnError(nil, "参数错误", "请求参数不能为空")
}
// 生成日志UUID
workLogUUID := uuid.New().String()
// 获取当前时间戳Unix时间戳秒级
now := int(time.Now().Unix())
// 构建日志记录
workLog := &model.TaskWorkLog{
WorkLogUUID: workLogUUID,
AssignRecordsUUID: req.AssignRecordsUUID,
WorkUUID: req.WorkUUID,
Title: req.Title,
ArtistUUID: req.ArtistUUID,
SubNum: req.SubNum,
TelNum: req.TelNum,
ArtistName: req.ArtistName,
OperationType: req.OperationType,
TaskType: req.TaskType,
TaskCount: req.TaskCount,
Remark: req.Remark,
OperatorName: req.OperatorName,
OperatorNum: req.OperatorNum,
OperationTime: now,
CreatedAt: now,
UpdatedAt: now,
}
// 插入数据库
if err := app.ModuleClients.TaskBenchDB.Create(workLog).Error; err != nil {
return commonErr.ReturnError(err, "创建任务日志失败", "创建任务日志失败: ")
}
return nil
}

View File

@ -12,6 +12,8 @@ import (
"strconv"
"time"
"micro-bundle/pkg/msg"
"dubbo.apache.org/dubbo-go/v3/common/logger"
"github.com/jinzhu/copier"
"github.com/samber/lo"
@ -197,9 +199,9 @@ func GetBundleBalanceByUserId(req *bundle.GetBundleBalanceByUserIdReq) (*bundle.
}
var IsExpired int32
if data.ExpiredAt.Before(time.Now()) {
IsExpired = msg.IsExpired
IsExpired = msg.IsExpired //已过期
} else {
IsExpired = msg.NotExpired
IsExpired = msg.NotExpired //未过期
}
result := &bundle.GetBundleBalanceByUserIdResp{
OrderUUID: data.OrderUUID,

View File

@ -546,3 +546,22 @@ func AddHiddenTaskAssignee(taskAssignee string, taskAssigneeNum string) error {
}
return dao.AddHiddenTaskAssignee(taskAssignee, taskAssigneeNum)
}
// CreateTaskWorkLog 创建任务日志记录
// 用于记录任务操作日志,包括加任务、消耗任务、完成任务、任务过期等操作
func CreateTaskWorkLog(req *dao.CreateTaskWorkLogRequest) error {
// 参数校验已在 DAO 层完成,这里可以添加额外的业务逻辑校验
// 例如:校验操作类型是否合法、任务类型是否合法等
if req.OperationType < 1 || req.OperationType > 4 {
return commonErr.ReturnError(nil, "参数错误", "操作类型必须在1-4之间")
}
if req.TaskType < 1 || req.TaskType > 3 {
return commonErr.ReturnError(nil, "参数错误", "任务类型必须在1-3之间")
}
if req.TaskCount < 0 {
return commonErr.ReturnError(nil, "参数错误", "任务数量不能为负数")
}
// 调用 DAO 层创建日志
return dao.CreateTaskWorkLog(req)
}

View File

@ -241,41 +241,6 @@ func (TaskSyncStatus) TableName() string { return "task_sync_status" }
// InitialSyncKey 一次性同步的唯一标识键
const InitialSyncKey = "bundle_to_task_balance_initial_sync"
// 任务日志表
type TaskLog struct {
LogUUID string `gorm:"column:log_uuid;type:varchar(50);comment:任务日志UUID;not null" json:"taskLogUUID"`
SubNum string `gorm:"column:sub_num;comment:任务用户编号;index:idx_task_log_sub_num;not null" json:"taskSubNum"`
TelNum string `gorm:"column:tel_num;comment:任务用户手机号;index:idx_task_log_tel_num;not null" json:"taskTelNum"`
ArtistName string `gorm:"column:artist_name;comment:任务艺人名称;index:idx_task_log_artist_name" json:"taskArtistName"`
// ===== 操作信息 =====
OperationType int `gorm:"column:operation_type;type:int(11);comment:任务操作类型 1:加任务 2:消耗任务 3:完成任务;4:任务过期;index:idx_task_operation_type;not null" json:"taskOperationType"`
TaskType int `gorm:"column:task_type;type:int(11);comment:任务类型 1:视频 2:图片 3:数据分析;index:idx_task_type;not null" json:"taskType"`
TaskCount int `gorm:"column:task_count;type:int(11);comment:任务数量;not null" json:"taskCount"`
Remark string `gorm:"column:remark;type:varchar(500);comment:任务备注" json:"taskRemark"`
// ===== 操作人信息 =====
OperatorName string `gorm:"column:operator_name;comment:任务操作人姓名;index:idx_task_operator_name" json:"taskOperatorName"`
OperatorNum string `gorm:"column:operator_num;comment:任务操作人账号;index:idx_task_operator_num" json:"taskOperatorNum"`
CompletorName string `gorm:"column:completor_name;comment:任务完成人姓名;index:idx_task_completor_name" json:"taskCompletorName"`
CompletorNum string `gorm:"column:completor_num;comment:任务完成人账号;index:idx_task_completor_num" json:"taskCompletorNum"`
// ===== 关联ID字段 =====
VideoPublishUUID string `gorm:"column:video_publish_id;type:varchar(50);comment:任务关联的发布视频UUID;index:idx_task_video_publish_id" json:"taskVideoPublishID"`
PostPublishUUID string `gorm:"column:post_publish_id;type:varchar(50);comment:任务关联的图文发布UUID;index:idx_task_post_publish_id" json:"taskPostPublishID"`
DataAnalysisUUID string `gorm:"column:data_analysis_id;type:varchar(50);comment:任务关联的数据分析UUID;index:idx_task_data_analysis_id" json:"taskDataAnalysisID"`
// ===== 时间字段 =====
OperationTime int `gorm:"column:operation_time;type:int(11);comment:任务操作时间;index:idx_task_operation_time;not null" json:"taskOperationTime"`
CreatedAt int `gorm:"column:created_at;type:int(11);comment:任务日志创建时间" json:"taskCreatedAt"`
UpdatedAt int `gorm:"column:updated_at;type:int(11);comment:任务日志更新时间" json:"taskUpdatedAt"`
DeletedAt soft_delete.DeletedAt `gorm:"column:deleted_at;type:int(11);index:idx_task_log_deleted_at" json:"taskDeletedAt"`
}
func (t *TaskLog) TableName() string {
return "task_log"
}
// 隐藏指派人表
type TaskAssigneeHidden struct {
// 让id自增
@ -291,3 +256,36 @@ type TaskAssigneeHidden struct {
func (TaskAssigneeHidden) TableName() string {
return "task_assignee_hidden"
}
// 任务日志表
type TaskWorkLog struct {
WorkLogUUID string `gorm:"column:work_log_uuid;type:varchar(50);comment:任务作品日志UUID;primarykey;not null" json:"taskWorkLogUUID"`
AssignRecordsUUID string `gorm:"column:assign_records_uuid;type:varchar(50);comment:任务指派记录UUID;index:idx_assign_records_uuid;not null" json:"assignRecordsUUID"`
WorkUUID string `gorm:"column:work_uuid;type:varchar(50);comment:任务作品UUID;index:idx_work_uuid;not null" json:"workUUID"`
Title string `gorm:"column:title;type:varchar(50);comment:任务作品标题;not null" default:"" json:"title"`
ArtistUUID string `gorm:"column:artist_uuid;type:varchar(50);comment:任务艺人UUID;index:idx_artist_uuid;not null" default:"" json:"artistUUID"`
SubNum string `gorm:"column:sub_num;comment:任务用户编号;index:idx_sub_num;not null" default:"" json:"subNum"`
TelNum string `gorm:"column:tel_num;comment:任务用户手机号;index:idx_tel_num;not null" default:"" json:"telNum"`
ArtistName string `gorm:"column:artist_name;comment:任务艺人名称;index:idx_artist_name" default:"" json:"artistName"`
// ===== 操作信息 =====
OperationType int `gorm:"column:operation_type;type:int(11);comment:任务操作类型 1:加任务 2:消耗任务 3:完成任务;4:任务过期;index:idx_operation_type;not null" default:"0" json:"operationType"`
TaskType int `gorm:"column:task_type;type:int(11);comment:任务类型 1:视频 2:图片 3:数据分析;index:idx_task_type;not null" default:"0" json:"taskType"`
TaskCount int `gorm:"column:task_count;type:int(11);comment:任务数量;not null" default:"0" json:"taskCount"`
Remark string `gorm:"column:remark;type:varchar(500);comment:任务备注" default:"" json:"remark"`
// ===== 操作人信息 =====
OperatorName string `gorm:"column:operator_name;comment:任务操作人姓名;index:idx_operator_name" json:"taskOperatorName"`
OperatorNum string `gorm:"column:operator_num;comment:任务操作人账号;index:idx_operator_num" json:"taskOperatorNum"`
// ===== 时间字段 =====
OperationTime int `gorm:"column:operation_time;type:int(11);comment:任务操作时间;index:idx_operation_time;not null" json:"taskOperationTime"`
CreatedAt int `gorm:"column:created_at;type:int(11);comment:任务日志创建时间" json:"taskCreatedAt"`
UpdatedAt int `gorm:"column:updated_at;type:int(11);comment:任务日志更新时间" json:"taskUpdatedAt"`
DeletedAt soft_delete.DeletedAt `gorm:"column:deleted_at;type:int(11);index:idx_work_log_deleted_at" json:"taskDeletedAt"`
}
func (t *TaskWorkLog) TableName() string {
return "task_work_log"
}

View File

@ -100,6 +100,7 @@ service Bundle {
rpc BatchAssignTask(BatchAssignTaskRequest) returns (ComResponse) {}
rpc BatchTerminateTask(BatchTerminateTaskRequest) returns (ComResponse) {} // UUID列表
rpc GetArtistUploadStatsList(TaskQueryRequest) returns (ArtistUploadStatsResponse) {} //
rpc CreateTaskWorkLog(CreateTaskWorkLogRequest) returns (CommonResponse) {} //
//
rpc MetricsBusiness(MetricsBusinessReq) returns (MetricsBusinessResp) {}
@ -1579,6 +1580,23 @@ message GetPendingTaskLayoutResp{ string data = 1; }
message SetPendingTaskLayoutReq{ string data = 1; }
message SetPendingTaskLayoutResp{}
//
message CreateTaskWorkLogRequest {
string assignRecordsUUID = 1 [json_name = "assignRecordsUUID"]; // UUID
string workUUID = 2 [json_name = "workUUID"]; // UUID
string title = 3 [json_name = "title"]; //
string artistUUID = 4 [json_name = "artistUUID"]; // UUID
string subNum = 5 [json_name = "subNum"]; //
string telNum = 6 [json_name = "telNum"]; //
string artistName = 7 [json_name = "artistName"]; //
int32 operationType = 8 [json_name = "operationType"]; // 1: 2: 3: 4:
int32 taskType = 9 [json_name = "taskType"]; // 1: 2: 3:
int32 taskCount = 10 [json_name = "taskCount"]; //
string remark = 11 [json_name = "remark"]; //
string operatorName = 12 [json_name = "operatorName"]; //
string operatorNum = 13 [json_name = "operatorNum"]; //
}
message MetricsBusinessReq{
string bundleUuid = 1;
string start = 2;

File diff suppressed because it is too large Load Diff

View File

@ -740,6 +740,9 @@ func (this *SetPendingTaskLayoutReq) Validate() error {
func (this *SetPendingTaskLayoutResp) Validate() error {
return nil
}
func (this *CreateTaskWorkLogRequest) Validate() error {
return nil
}
func (this *MetricsBusinessReq) Validate() error {
return nil
}

View File

@ -1,7 +1,7 @@
// Code generated by protoc-gen-go-triple. DO NOT EDIT.
// versions:
// - protoc-gen-go-triple v1.0.5
// - protoc v6.32.0
// - protoc-gen-go-triple v1.0.8
// - protoc v3.21.1
// source: pb/bundle.proto
package bundle
@ -104,6 +104,7 @@ type BundleClient interface {
BatchAssignTask(ctx context.Context, in *BatchAssignTaskRequest, opts ...grpc_go.CallOption) (*ComResponse, common.ErrorWithAttachment)
BatchTerminateTask(ctx context.Context, in *BatchTerminateTaskRequest, opts ...grpc_go.CallOption) (*ComResponse, common.ErrorWithAttachment)
GetArtistUploadStatsList(ctx context.Context, in *TaskQueryRequest, opts ...grpc_go.CallOption) (*ArtistUploadStatsResponse, common.ErrorWithAttachment)
CreateTaskWorkLog(ctx context.Context, in *CreateTaskWorkLogRequest, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment)
// 数据指标
MetricsBusiness(ctx context.Context, in *MetricsBusinessReq, opts ...grpc_go.CallOption) (*MetricsBusinessResp, common.ErrorWithAttachment)
MetricsOperatingCreate(ctx context.Context, in *MetricsOperatingCreateReq, opts ...grpc_go.CallOption) (*MetricsOperatingCreateResp, common.ErrorWithAttachment)
@ -194,6 +195,7 @@ type BundleClientImpl struct {
BatchAssignTask func(ctx context.Context, in *BatchAssignTaskRequest) (*ComResponse, error)
BatchTerminateTask func(ctx context.Context, in *BatchTerminateTaskRequest) (*ComResponse, error)
GetArtistUploadStatsList func(ctx context.Context, in *TaskQueryRequest) (*ArtistUploadStatsResponse, error)
CreateTaskWorkLog func(ctx context.Context, in *CreateTaskWorkLogRequest) (*CommonResponse, error)
MetricsBusiness func(ctx context.Context, in *MetricsBusinessReq) (*MetricsBusinessResp, error)
MetricsOperatingCreate func(ctx context.Context, in *MetricsOperatingCreateReq) (*MetricsOperatingCreateResp, error)
MetricsOperatingStatus func(ctx context.Context, in *MetricsOperatingStatusReq) (*MetricsOperatingStatusResp, error)
@ -635,6 +637,12 @@ func (c *bundleClient) GetArtistUploadStatsList(ctx context.Context, in *TaskQue
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/GetArtistUploadStatsList", in, out)
}
func (c *bundleClient) CreateTaskWorkLog(ctx context.Context, in *CreateTaskWorkLogRequest, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment) {
out := new(CommonResponse)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/CreateTaskWorkLog", in, out)
}
func (c *bundleClient) MetricsBusiness(ctx context.Context, in *MetricsBusinessReq, opts ...grpc_go.CallOption) (*MetricsBusinessResp, common.ErrorWithAttachment) {
out := new(MetricsBusinessResp)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
@ -793,6 +801,7 @@ type BundleServer interface {
BatchAssignTask(context.Context, *BatchAssignTaskRequest) (*ComResponse, error)
BatchTerminateTask(context.Context, *BatchTerminateTaskRequest) (*ComResponse, error)
GetArtistUploadStatsList(context.Context, *TaskQueryRequest) (*ArtistUploadStatsResponse, error)
CreateTaskWorkLog(context.Context, *CreateTaskWorkLogRequest) (*CommonResponse, error)
// 数据指标
MetricsBusiness(context.Context, *MetricsBusinessReq) (*MetricsBusinessResp, error)
MetricsOperatingCreate(context.Context, *MetricsOperatingCreateReq) (*MetricsOperatingCreateResp, error)
@ -1022,6 +1031,9 @@ func (UnimplementedBundleServer) BatchTerminateTask(context.Context, *BatchTermi
func (UnimplementedBundleServer) GetArtistUploadStatsList(context.Context, *TaskQueryRequest) (*ArtistUploadStatsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetArtistUploadStatsList not implemented")
}
func (UnimplementedBundleServer) CreateTaskWorkLog(context.Context, *CreateTaskWorkLogRequest) (*CommonResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateTaskWorkLog not implemented")
}
func (UnimplementedBundleServer) MetricsBusiness(context.Context, *MetricsBusinessReq) (*MetricsBusinessResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method MetricsBusiness not implemented")
}
@ -3090,6 +3102,35 @@ func _Bundle_GetArtistUploadStatsList_Handler(srv interface{}, ctx context.Conte
return interceptor(ctx, in, info, handler)
}
func _Bundle_CreateTaskWorkLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(CreateTaskWorkLogRequest)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("CreateTaskWorkLog", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Bundle_MetricsBusiness_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(MetricsBusinessReq)
if err := dec(in); err != nil {
@ -3750,6 +3791,10 @@ var Bundle_ServiceDesc = grpc_go.ServiceDesc{
MethodName: "GetArtistUploadStatsList",
Handler: _Bundle_GetArtistUploadStatsList_Handler,
},
{
MethodName: "CreateTaskWorkLog",
Handler: _Bundle_CreateTaskWorkLog_Handler,
},
{
MethodName: "MetricsBusiness",
Handler: _Bundle_MetricsBusiness_Handler,

View File

@ -106,12 +106,12 @@ func loadTaskBenchMysqlConn(conn string) *gorm.DB {
&model.TaskManagement{},
&model.TaskAssignRecords{},
// &model.TaskBalance{},
&model.TaskLog{},
&model.TaskSyncStatus{},
&model.TaskPendingLayout{},
&model.TaskAssignUUIDItems{},
// 隐藏人员人记录表
&model.TaskAssigneeHidden{},
&model.TaskWorkLog{},
)
if err != nil {

View File

@ -121,8 +121,8 @@ const (
AvailableTimeService = 5 //可用时长
)
// 是否过期
// 套餐状态
const (
IsExpired = 1 //
NotExpired = 0 //
IsExpired = 1 //已过期
NotExpired = 0 //未过期
)