urbanu hai 1 mes
pai
achega
911134debe

+ 0 - 65
model/biz_modules/daytask/dt_finance.go

@@ -1,39 +1,5 @@
 package daytask
 
-// DtRechargeOrder 充值订单表
-type DtRechargeOrder struct {
-	Id             int64   `json:"id" gorm:"column:id;type:bigint;primarykey;comment:订单ID"`
-	OrderNo        string  `json:"orderNo" gorm:"column:order_no;type:varchar(32);not null;uniqueIndex:uk_order_no;comment:订单编号"`
-	UserId         int64   `json:"userId" gorm:"column:user_id;type:bigint;not null;index:idx_user_id;comment:用户ID"`
-	UserUid        string  `json:"userUid" gorm:"column:user_uid;type:varchar(32);comment:用户UID"`
-	Channel        string  `json:"channel" gorm:"column:channel;type:varchar(32);not null;index:idx_channel;comment:充值渠道: usdt/momo/zalopay/bank"`
-	Amount         float64 `json:"amount" gorm:"column:amount;type:decimal(18,2);default:0.00;comment:充值金额(USDT)"`
-	ActualAmount   float64 `json:"actualAmount" gorm:"column:actual_amount;type:decimal(18,2);default:0.00;comment:实际到账"`
-	Fee            float64 `json:"fee" gorm:"column:fee;type:decimal(18,2);default:0.00;comment:手续费"`
-	ExchangeRate   float64 `json:"exchangeRate" gorm:"column:exchange_rate;type:decimal(18,6);default:1.000000;comment:汇率"`
-	PayAmount      float64 `json:"payAmount" gorm:"column:pay_amount;type:decimal(18,2);default:0.00;comment:支付金额(原币种)"`
-	PayCurrency    string  `json:"payCurrency" gorm:"column:pay_currency;type:varchar(16);default:USDT;comment:支付币种"`
-	Txid           string  `json:"txid" gorm:"column:txid;type:varchar(128);comment:交易哈希/流水号"`
-	FromAddress    string  `json:"fromAddress" gorm:"column:from_address;type:varchar(128);comment:付款地址"`
-	ToAddress      string  `json:"toAddress" gorm:"column:to_address;type:varchar(128);comment:收款地址"`
-	Screenshot     string  `json:"screenshot" gorm:"column:screenshot;type:varchar(255);comment:付款截图"`
-	PayTime        int64   `json:"payTime" gorm:"column:pay_time;type:bigint;comment:支付时间"`
-	ConfirmTime    int64   `json:"confirmTime" gorm:"column:confirm_time;type:bigint;comment:确认时间"`
-	ConfirmAdminId int64   `json:"confirmAdminId" gorm:"column:confirm_admin_id;type:bigint;comment:确认管理员ID"`
-	Remark         string  `json:"remark" gorm:"column:remark;type:varchar(255);comment:备注"`
-	Status         int8    `json:"status" gorm:"column:status;type:tinyint;default:0;index:idx_status;comment:状态: 0=待支付 1=待确认 2=已完成 3=已取消 4=已退款"`
-	CreatedAt      int64   `json:"createdAt" gorm:"column:created_at;type:bigint;autoCreateTime;index:idx_created_at;comment:创建时间"`
-	UpdatedAt      int64   `json:"updatedAt" gorm:"column:updated_at;type:bigint;autoUpdateTime;comment:更新时间"`
-}
-
-func (*DtRechargeOrder) TableName() string {
-	return "dt_recharge_order"
-}
-
-func NewDtRechargeOrder() *DtRechargeOrder {
-	return &DtRechargeOrder{}
-}
-
 // DtWithdrawOrder 提现订单表
 type DtWithdrawOrder struct {
 	Id              int64   `json:"id" gorm:"column:id;type:bigint;primarykey;comment:订单ID"`
@@ -96,34 +62,3 @@ func (*DtBalanceLog) TableName() string {
 func NewDtBalanceLog() *DtBalanceLog {
 	return &DtBalanceLog{}
 }
-
-// DtPaymentChannel 支付渠道配置表
-type DtPaymentChannel struct {
-	Id             int64   `json:"id" gorm:"column:id;type:bigint;primarykey;comment:渠道ID"`
-	Code           string  `json:"code" gorm:"column:code;type:varchar(32);not null;uniqueIndex:uk_code;comment:渠道编码: usdt/momo/zalopay/bank"`
-	Name           string  `json:"name" gorm:"column:name;type:varchar(64);not null;comment:渠道名称"`
-	NameVi         string  `json:"nameVi" gorm:"column:name_vi;type:varchar(64);comment:渠道名称(越南语)"`
-	Icon           string  `json:"icon" gorm:"column:icon;type:varchar(255);comment:渠道图标"`
-	Type           int8    `json:"type" gorm:"column:type;type:tinyint;default:1;comment:类型: 1=充值 2=提现 3=双向"`
-	MinAmount      float64 `json:"minAmount" gorm:"column:min_amount;type:decimal(18,2);default:0.00;comment:最小金额"`
-	MaxAmount      float64 `json:"maxAmount" gorm:"column:max_amount;type:decimal(18,2);default:0.00;comment:最大金额"`
-	FeeType        int8    `json:"feeType" gorm:"column:fee_type;type:tinyint;default:1;comment:手续费类型: 1=固定 2=比例"`
-	FeeValue       float64 `json:"feeValue" gorm:"column:fee_value;type:decimal(18,4);default:0.0000;comment:手续费值"`
-	ExchangeRate   float64 `json:"exchangeRate" gorm:"column:exchange_rate;type:decimal(18,6);default:1.000000;comment:汇率"`
-	Config         string  `json:"config" gorm:"column:config;type:json;comment:渠道配置(API密钥等)"`
-	ReceiveAddress string  `json:"receiveAddress" gorm:"column:receive_address;type:varchar(128);comment:收款地址(USDT)"`
-	ReceiveQrcode  string  `json:"receiveQrcode" gorm:"column:receive_qrcode;type:varchar(255);comment:收款二维码"`
-	Description    string  `json:"description" gorm:"column:description;type:varchar(512);comment:说明"`
-	Status         int8    `json:"status" gorm:"column:status;type:tinyint;default:1;comment:状态: 0=禁用 1=启用"`
-	Sort           int     `json:"sort" gorm:"column:sort;type:int;default:0;comment:排序"`
-	CreatedAt      int64   `json:"createdAt" gorm:"column:created_at;type:bigint;autoCreateTime;comment:创建时间"`
-	UpdatedAt      int64   `json:"updatedAt" gorm:"column:updated_at;type:bigint;autoUpdateTime;comment:更新时间"`
-}
-
-func (*DtPaymentChannel) TableName() string {
-	return "dt_payment_channel"
-}
-
-func NewDtPaymentChannel() *DtPaymentChannel {
-	return &DtPaymentChannel{}
-}

+ 12 - 6
model/biz_modules/daytask/dt_material.go

@@ -6,6 +6,7 @@ type DtMaterial struct {
 	Name      string `json:"name" gorm:"column:name;type:varchar(128);not null;comment:文件名"`
 	Path      string `json:"path" gorm:"column:path;type:varchar(512);not null;comment:文件路径"`
 	Url       string `json:"url" gorm:"column:url;type:varchar(512);not null;comment:访问URL"`
+	Cover     string `json:"cover" gorm:"column:cover;type:varchar(512);comment:封面图URL(视频/音频)"`
 	Type      string `json:"type" gorm:"column:type;type:varchar(32);not null;index:idx_type;comment:类型: image/video/audio/document"`
 	MimeType  string `json:"mimeType" gorm:"column:mime_type;type:varchar(128);comment:MIME类型"`
 	Size      int64  `json:"size" gorm:"column:size;type:bigint;default:0;comment:文件大小(字节)"`
@@ -15,6 +16,8 @@ type DtMaterial struct {
 	Storage   string `json:"storage" gorm:"column:storage;type:varchar(32);default:local;comment:存储: local/oss/cos"`
 	GroupId   int64  `json:"groupId" gorm:"column:group_id;type:bigint;default:0;index:idx_group_id;comment:分组ID"`
 	AdminId   int64  `json:"adminId" gorm:"column:admin_id;type:bigint;default:0;comment:上传管理员ID"`
+	Sort      int    `json:"sort" gorm:"column:sort;type:int;default:0;comment:排序"`
+	Status    int    `json:"status" gorm:"column:status;type:tinyint;default:1;comment:状态:1启用,0禁用"`
 	CreatedAt int64  `json:"createdAt" gorm:"column:created_at;type:bigint;autoCreateTime;comment:创建时间"`
 }
 
@@ -28,12 +31,15 @@ func NewDtMaterial() *DtMaterial {
 
 // DtMaterialGroup 素材分组表
 type DtMaterialGroup struct {
-	Id        int64  `json:"id" gorm:"column:id;type:bigint;primarykey;comment:分组ID"`
-	Name      string `json:"name" gorm:"column:name;type:varchar(64);not null;comment:分组名称"`
-	ParentId  int64  `json:"parentId" gorm:"column:parent_id;type:bigint;default:0;index:idx_parent_id;comment:父级ID"`
-	Sort      int    `json:"sort" gorm:"column:sort;type:int;default:0;comment:排序"`
-	CreatedAt int64  `json:"createdAt" gorm:"column:created_at;type:bigint;autoCreateTime;comment:创建时间"`
-	UpdatedAt int64  `json:"updatedAt" gorm:"column:updated_at;type:bigint;autoUpdateTime;comment:更新时间"`
+	Id          int64  `json:"id" gorm:"column:id;type:bigint;primarykey;comment:分组ID"`
+	Name        string `json:"name" gorm:"column:name;type:varchar(64);not null;comment:分组名称"`
+	Code        string `json:"code" gorm:"column:code;type:varchar(64);comment:分组代码"`
+	ParentId    int64  `json:"parentId" gorm:"column:parent_id;type:bigint;default:0;index:idx_parent_id;comment:父级ID"`
+	Sort        int    `json:"sort" gorm:"column:sort;type:int;default:0;comment:排序"`
+	Status      int    `json:"status" gorm:"column:status;type:tinyint;default:1;comment:状态:1启用,0禁用"`
+	Description string `json:"description" gorm:"column:description;type:varchar(255);comment:描述"`
+	CreatedAt   int64  `json:"createdAt" gorm:"column:created_at;type:bigint;autoCreateTime;comment:创建时间"`
+	UpdatedAt   int64  `json:"updatedAt" gorm:"column:updated_at;type:bigint;autoUpdateTime;comment:更新时间"`
 }
 
 func (*DtMaterialGroup) TableName() string {

+ 0 - 2
model/biz_modules/daytask/dt_system.go

@@ -134,8 +134,6 @@ type DtDailyStats struct {
 	ActiveUserCount     int     `json:"activeUserCount" gorm:"column:active_user_count;type:int;default:0;comment:活跃用户数"`
 	TaskPublishCount    int     `json:"taskPublishCount" gorm:"column:task_publish_count;type:int;default:0;comment:发布任务数"`
 	TaskCompleteCount   int     `json:"taskCompleteCount" gorm:"column:task_complete_count;type:int;default:0;comment:完成任务数"`
-	RechargeCount       int     `json:"rechargeCount" gorm:"column:recharge_count;type:int;default:0;comment:充值笔数"`
-	RechargeAmount      float64 `json:"rechargeAmount" gorm:"column:recharge_amount;type:decimal(18,2);default:0.00;comment:充值金额"`
 	WithdrawCount       int     `json:"withdrawCount" gorm:"column:withdraw_count;type:int;default:0;comment:提现笔数"`
 	WithdrawAmount      float64 `json:"withdrawAmount" gorm:"column:withdraw_amount;type:decimal(18,2);default:0.00;comment:提现金额"`
 	TaskRewardAmount    float64 `json:"taskRewardAmount" gorm:"column:task_reward_amount;type:decimal(18,2);default:0.00;comment:任务奖励金额"`

+ 24 - 7
model/biz_modules/daytask/dt_task.go

@@ -8,7 +8,6 @@ import (
 type DtTaskCategory struct {
 	Id          int64  `json:"id" gorm:"column:id;type:bigint;primarykey;comment:分类ID"`
 	Name        string `json:"name" gorm:"column:name;type:varchar(64);not null;comment:分类名称"`
-	NameVi      string `json:"nameVi" gorm:"column:name_vi;type:varchar(64);comment:分类名称(越南语)"`
 	Icon        string `json:"icon" gorm:"column:icon;type:varchar(255);comment:分类图标"`
 	Platform    string `json:"platform" gorm:"column:platform;type:varchar(32);comment:关联平台: tiktok/youtube/instagram/facebook"`
 	Description string `json:"description" gorm:"column:description;type:varchar(255);comment:分类描述"`
@@ -32,9 +31,7 @@ type DtTask struct {
 	TaskNo            string     `json:"taskNo" gorm:"column:task_no;type:varchar(32);not null;uniqueIndex:uk_task_no;comment:任务编号"`
 	CategoryId        int64      `json:"categoryId" gorm:"column:category_id;type:bigint;not null;index:idx_category_id;comment:分类ID"`
 	Title             string     `json:"title" gorm:"column:title;type:varchar(128);not null;comment:任务标题"`
-	TitleVi           string     `json:"titleVi" gorm:"column:title_vi;type:varchar(128);comment:任务标题(越南语)"`
 	Description       string     `json:"description" gorm:"column:description;type:text;comment:任务描述"`
-	DescriptionVi     string     `json:"descriptionVi" gorm:"column:description_vi;type:text;comment:任务描述(越南语)"`
 	Cover             string     `json:"cover" gorm:"column:cover;type:varchar(255);comment:封面图"`
 	TargetUrl         string     `json:"targetUrl" gorm:"column:target_url;type:varchar(512);comment:目标链接"`
 	TaskType          int8       `json:"taskType" gorm:"column:task_type;type:tinyint;default:1;comment:任务类型: 1=关注 2=点赞 3=评论 4=分享 5=观看"`
@@ -49,6 +46,10 @@ type DtTask struct {
 	RequireScreenshot int8       `json:"requireScreenshot" gorm:"column:require_screenshot;type:tinyint;default:1;comment:是否需要截图: 0=否 1=是"`
 	AutoAudit         int8       `json:"autoAudit" gorm:"column:auto_audit;type:tinyint;default:0;comment:是否自动审核: 0=否 1=是"`
 	AuditTimeout      int        `json:"auditTimeout" gorm:"column:audit_timeout;type:int;default:24;comment:审核超时(小时)"`
+	// 认证要求标签
+	RequirePhone    int8       `json:"requirePhone" gorm:"column:require_phone;type:tinyint;default:0;comment:需要手机认证: 0=否 1=是"`
+	RequireRealname int8       `json:"requireRealname" gorm:"column:require_realname;type:tinyint;default:0;comment:需要实名认证: 0=否 1=是"`
+	RequireIdcard   int8       `json:"requireIdcard" gorm:"column:require_idcard;type:tinyint;default:0;comment:需要身份认证: 0=否 1=是"`
 	Status            int8       `json:"status" gorm:"column:status;type:tinyint;default:0;index:idx_status;comment:状态: 0=草稿 1=上架 2=下架 3=已结束"`
 	Sort              int        `json:"sort" gorm:"column:sort;type:int;default:0;comment:排序"`
 	Remark            string     `json:"remark" gorm:"column:remark;type:varchar(255);comment:备注"`
@@ -71,12 +72,9 @@ type DtTaskStep struct {
 	TaskId        int64  `json:"taskId" gorm:"column:task_id;type:bigint;not null;index:idx_task_id;comment:任务ID"`
 	StepNo        int    `json:"stepNo" gorm:"column:step_no;type:int;default:1;comment:步骤序号"`
 	Title         string `json:"title" gorm:"column:title;type:varchar(128);not null;comment:步骤标题"`
-	TitleVi       string `json:"titleVi" gorm:"column:title_vi;type:varchar(128);comment:步骤标题(越南语)"`
 	Description   string `json:"description" gorm:"column:description;type:text;comment:步骤说明"`
-	DescriptionVi string `json:"descriptionVi" gorm:"column:description_vi;type:text;comment:步骤说明(越南语)"`
-	Image         string `json:"image" gorm:"column:image;type:varchar(255);comment:示例图片"`
+	Image         string `json:"image" gorm:"column:image;type:varchar(255);comment:步骤图片"`
 	RequireUpload int8   `json:"requireUpload" gorm:"column:require_upload;type:tinyint;default:0;comment:是否需要上传凭证: 0=否 1=是"`
-	Sort          int    `json:"sort" gorm:"column:sort;type:int;default:0;comment:排序"`
 	CreatedAt     int64  `json:"createdAt" gorm:"column:created_at;type:bigint;autoCreateTime;comment:创建时间"`
 	UpdatedAt     int64  `json:"updatedAt" gorm:"column:updated_at;type:bigint;autoUpdateTime;comment:更新时间"`
 }
@@ -89,6 +87,25 @@ func NewDtTaskStep() *DtTaskStep {
 	return &DtTaskStep{}
 }
 
+// DtTaskExample 审核样例表
+type DtTaskExample struct {
+	Id          int64  `json:"id" gorm:"column:id;type:bigint;primarykey;comment:样例ID"`
+	TaskId      int64  `json:"taskId" gorm:"column:task_id;type:bigint;not null;index:idx_task_id;comment:任务ID"`
+	Image       string `json:"image" gorm:"column:image;type:varchar(255);not null;comment:样例图片"`
+	Description string `json:"description" gorm:"column:description;type:varchar(255);comment:样例描述"`
+	Sort        int    `json:"sort" gorm:"column:sort;type:int;default:0;comment:排序"`
+	CreatedAt   int64  `json:"createdAt" gorm:"column:created_at;type:bigint;autoCreateTime;comment:创建时间"`
+	UpdatedAt   int64  `json:"updatedAt" gorm:"column:updated_at;type:bigint;autoUpdateTime;comment:更新时间"`
+}
+
+func (*DtTaskExample) TableName() string {
+	return "dt_task_example"
+}
+
+func NewDtTaskExample() *DtTaskExample {
+	return &DtTaskExample{}
+}
+
 // DtUserTask 用户任务记录表
 type DtUserTask struct {
 	Id           int64  `json:"id" gorm:"column:id;type:bigint;primarykey;comment:记录ID"`

+ 0 - 34
router/daytask/dt_finance.go

@@ -5,23 +5,6 @@ import (
 	"go_server/service"
 )
 
-// DtRechargeOrderRouter 充值订单路由
-type DtRechargeOrderRouter struct{}
-
-func (DtRechargeOrderRouter) Route() string {
-	return "/recharge_order"
-}
-
-var dtRechargeOrderService = service.RealizationLayer.DaytaskServiceGroup.DtRechargeOrderService
-
-func (h DtRechargeOrderRouter) Register(group *gin.RouterGroup) {
-	group.GET("get", dtRechargeOrderService.Get)
-	group.GET("find", dtRechargeOrderService.Find)
-	group.POST("create", dtRechargeOrderService.Create)
-	group.POST("update", dtRechargeOrderService.Update)
-	group.POST("confirm", dtRechargeOrderService.Confirm)
-}
-
 // DtWithdrawOrderRouter 提现订单路由
 type DtWithdrawOrderRouter struct{}
 
@@ -53,20 +36,3 @@ func (h DtBalanceLogRouter) Register(group *gin.RouterGroup) {
 	group.GET("get", dtBalanceLogService.Get)
 	group.GET("find", dtBalanceLogService.Find)
 }
-
-// DtPaymentChannelRouter 支付渠道路由
-type DtPaymentChannelRouter struct{}
-
-func (DtPaymentChannelRouter) Route() string {
-	return "/payment_channel"
-}
-
-var dtPaymentChannelService = service.RealizationLayer.DaytaskServiceGroup.DtPaymentChannelService
-
-func (h DtPaymentChannelRouter) Register(group *gin.RouterGroup) {
-	group.GET("get", dtPaymentChannelService.Get)
-	group.GET("find", dtPaymentChannelService.Find)
-	group.POST("create", dtPaymentChannelService.Create)
-	group.POST("update", dtPaymentChannelService.Update)
-	group.POST("delete", dtPaymentChannelService.Delete)
-}

+ 1 - 0
router/daytask/dt_material.go

@@ -18,6 +18,7 @@ func (h DtMaterialRouter) Register(group *gin.RouterGroup) {
 	group.GET("get", dtMaterialService.Get)
 	group.GET("find", dtMaterialService.Find)
 	group.POST("create", dtMaterialService.Create)
+	group.POST("update", dtMaterialService.Update)
 	group.POST("delete", dtMaterialService.Delete)
 }
 

+ 17 - 0
router/daytask/dt_task.go

@@ -56,6 +56,23 @@ func (h DtTaskStepRouter) Register(group *gin.RouterGroup) {
 	group.POST("delete", dtTaskStepService.Delete)
 }
 
+// DtTaskExampleRouter 审核样例路由
+type DtTaskExampleRouter struct{}
+
+func (DtTaskExampleRouter) Route() string {
+	return "/task_example"
+}
+
+var dtTaskExampleService = service.RealizationLayer.DaytaskServiceGroup.DtTaskExampleService
+
+func (h DtTaskExampleRouter) Register(group *gin.RouterGroup) {
+	group.GET("get", dtTaskExampleService.Get)
+	group.GET("find", dtTaskExampleService.Find)
+	group.POST("create", dtTaskExampleService.Create)
+	group.POST("update", dtTaskExampleService.Update)
+	group.POST("delete", dtTaskExampleService.Delete)
+}
+
 // DtUserTaskRouter 用户任务记录路由
 type DtUserTaskRouter struct{}
 

+ 1 - 2
router/daytask/enter.go

@@ -16,12 +16,11 @@ var (
 		DtTaskCategoryRouter{},
 		DtTaskRouter{},
 		DtTaskStepRouter{},
+		DtTaskExampleRouter{},
 		DtUserTaskRouter{},
 		// 财务模块
-		DtRechargeOrderRouter{},
 		DtWithdrawOrderRouter{},
 		DtBalanceLogRouter{},
-		DtPaymentChannelRouter{},
 		// 内容模块
 		DtNoticeRouter{},
 		DtBannerRouter{},

+ 8 - 1
service/base/query_handle_base.go

@@ -62,8 +62,15 @@ func (*ModelBaseHandler[T]) UpdateOne(c *gin.Context, db *gorm.DB) {
 		response.Resp(c, err.Error())
 		return
 	}
+	// 将 req.Data 转换为结构体,以便 GORM 能正确映射 json tag 到数据库列名
+	updateData := new(T)
+	body, _ := json.Marshal(req.Data)
+	if err := json.Unmarshal(body, updateData); err != nil {
+		response.Resp(c, err.Error())
+		return
+	}
 	dbEx := db.Model(&tempInfo).Where("id", req.Id).
-		Updates(req.Data)
+		Updates(updateData)
 	if dbEx.Error != nil {
 		response.Resp(c, dbEx.Error.Error())
 		return

+ 0 - 173
service/daytask/dt_finance.go

@@ -8,112 +8,6 @@ import (
 	"github.com/gin-gonic/gin"
 )
 
-// DtRechargeOrderService 充值订单服务
-type DtRechargeOrderService struct {
-	base.BizCommonService
-}
-
-func (s *DtRechargeOrderService) Get(c *gin.Context) {
-	s.SetDbAlias("daytask")
-	base.NewBaseHandler(model.NewDtRechargeOrder()).Get(c, s.DB())
-}
-
-func (s *DtRechargeOrderService) Find(c *gin.Context) {
-	s.SetDbAlias("daytask")
-	type request[T any] struct {
-		base.ListRequest[T]
-		Id        *int64  `form:"id"`
-		OrderNo   *string `form:"orderNo"`
-		UserId    *int64  `form:"userId"`
-		UserUid   *string `form:"userUid"`
-		Channel   *string `form:"channel"`
-		Status    *int8   `form:"status"`
-		BeginTime *int64  `form:"beginTime"`
-		EndTime   *int64  `form:"endTime"`
-	}
-	req := new(request[model.DtRechargeOrder])
-	if err := c.BindQuery(req); err != nil {
-		response.Resp(c, err.Error())
-		return
-	}
-	db := s.DB()
-	if req.Id != nil && *req.Id != 0 {
-		db = db.Where("id", req.Id)
-	}
-	if req.OrderNo != nil && *req.OrderNo != "" {
-		db = db.Where("order_no", req.OrderNo)
-	}
-	if req.UserId != nil && *req.UserId != 0 {
-		db = db.Where("user_id", req.UserId)
-	}
-	if req.UserUid != nil && *req.UserUid != "" {
-		db = db.Where("user_uid", req.UserUid)
-	}
-	if req.Channel != nil && *req.Channel != "" {
-		db = db.Where("channel", req.Channel)
-	}
-	if req.Status != nil {
-		db = db.Where("status", req.Status)
-	}
-	if req.BeginTime != nil && *req.BeginTime > 0 && req.EndTime != nil && *req.EndTime > 0 {
-		db = db.Where("created_at BETWEEN ? AND ?", *req.BeginTime, *req.EndTime)
-	}
-
-	colInfo := s.GetColumnCommentFromStruct(model.DtRechargeOrder{})
-	resp, err := base.NewQueryBaseHandler(model.NewDtRechargeOrder()).List(db, req)
-	if err != nil {
-		response.Resp(c, err.Error())
-		return
-	}
-	response.Resp(c, map[string]interface{}{
-		"cols":   colInfo,
-		"list":   resp.List,
-		"paging": resp.Paging,
-	})
-}
-
-func (s *DtRechargeOrderService) Create(c *gin.Context) {
-	s.SetDbAlias("daytask")
-	base.NewBaseHandler(model.NewDtRechargeOrder()).Create(c, s.DB())
-}
-
-func (s *DtRechargeOrderService) Update(c *gin.Context) {
-	s.SetDbAlias("daytask")
-	base.NewBaseHandler(model.NewDtRechargeOrder()).UpdateOne(c, s.DB())
-}
-
-// Confirm 确认充值
-func (s *DtRechargeOrderService) Confirm(c *gin.Context) {
-	s.SetDbAlias("daytask")
-	type request struct {
-		Id           int64   `json:"id" binding:"required"`
-		Status       int8    `json:"status" binding:"required"` // 2=完成 3=取消
-		ActualAmount float64 `json:"actualAmount"`
-		Remark       string  `json:"remark"`
-	}
-	var req request
-	if err := c.ShouldBindJSON(&req); err != nil {
-		response.Resp(c, err.Error())
-		return
-	}
-
-	updates := map[string]interface{}{
-		"status":       req.Status,
-		"remark":       req.Remark,
-		"confirm_time": c.GetInt64("now"),
-	}
-	if req.ActualAmount > 0 {
-		updates["actual_amount"] = req.ActualAmount
-	}
-
-	err := s.DB().Model(&model.DtRechargeOrder{}).Where("id = ? AND status = 1", req.Id).Updates(updates).Error
-	if err != nil {
-		response.Resp(c, err.Error())
-		return
-	}
-	response.Resp(c, "操作成功")
-}
-
 // DtWithdrawOrderService 提现订单服务
 type DtWithdrawOrderService struct {
 	base.BizCommonService
@@ -302,70 +196,3 @@ func (s *DtBalanceLogService) Find(c *gin.Context) {
 		"paging": resp.Paging,
 	})
 }
-
-// DtPaymentChannelService 支付渠道服务
-type DtPaymentChannelService struct {
-	base.BizCommonService
-}
-
-func (s *DtPaymentChannelService) Get(c *gin.Context) {
-	s.SetDbAlias("daytask")
-	base.NewBaseHandler(model.NewDtPaymentChannel()).Get(c, s.DB())
-}
-
-func (s *DtPaymentChannelService) Find(c *gin.Context) {
-	s.SetDbAlias("daytask")
-	type request[T any] struct {
-		base.ListRequest[T]
-		Id     *int64  `form:"id"`
-		Code   *string `form:"code"`
-		Type   *int8   `form:"type"`
-		Status *int8   `form:"status"`
-	}
-	req := new(request[model.DtPaymentChannel])
-	if err := c.BindQuery(req); err != nil {
-		response.Resp(c, err.Error())
-		return
-	}
-	db := s.DB()
-	if req.Id != nil && *req.Id != 0 {
-		db = db.Where("id", req.Id)
-	}
-	if req.Code != nil && *req.Code != "" {
-		db = db.Where("code", req.Code)
-	}
-	if req.Type != nil {
-		db = db.Where("type", req.Type)
-	}
-	if req.Status != nil {
-		db = db.Where("status", req.Status)
-	}
-	db = db.Order("sort ASC")
-
-	colInfo := s.GetColumnCommentFromStruct(model.DtPaymentChannel{})
-	resp, err := base.NewQueryBaseHandler(model.NewDtPaymentChannel()).List(db, req)
-	if err != nil {
-		response.Resp(c, err.Error())
-		return
-	}
-	response.Resp(c, map[string]interface{}{
-		"cols":   colInfo,
-		"list":   resp.List,
-		"paging": resp.Paging,
-	})
-}
-
-func (s *DtPaymentChannelService) Create(c *gin.Context) {
-	s.SetDbAlias("daytask")
-	base.NewBaseHandler(model.NewDtPaymentChannel()).Create(c, s.DB())
-}
-
-func (s *DtPaymentChannelService) Update(c *gin.Context) {
-	s.SetDbAlias("daytask")
-	base.NewBaseHandler(model.NewDtPaymentChannel()).UpdateOne(c, s.DB())
-}
-
-func (s *DtPaymentChannelService) Delete(c *gin.Context) {
-	s.SetDbAlias("daytask")
-	base.NewBaseHandler(model.NewDtPaymentChannel()).DeleteOne(c, s.DB())
-}

+ 5 - 0
service/daytask/dt_material.go

@@ -69,6 +69,11 @@ func (s *DtMaterialService) Create(c *gin.Context) {
 	base.NewBaseHandler(model.NewDtMaterial()).Create(c, s.DB())
 }
 
+func (s *DtMaterialService) Update(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	base.NewBaseHandler(model.NewDtMaterial()).UpdateOne(c, s.DB())
+}
+
 func (s *DtMaterialService) Delete(c *gin.Context) {
 	s.SetDbAlias("daytask")
 	base.NewBaseHandler(model.NewDtMaterial()).DeleteOne(c, s.DB())

+ 166 - 4
service/daytask/dt_task.go

@@ -1,6 +1,9 @@
 package daytask
 
 import (
+	"fmt"
+	"time"
+
 	model "go_server/model/biz_modules/daytask"
 	"go_server/model/common/response"
 	"go_server/service/base"
@@ -183,7 +186,7 @@ func (s *DtTaskStepService) Find(c *gin.Context) {
 	if req.TaskId != nil && *req.TaskId != 0 {
 		db = db.Where("task_id", req.TaskId)
 	}
-	db = db.Order("step_no ASC, sort ASC")
+	db = db.Order("step_no ASC")
 
 	colInfo := s.GetColumnCommentFromStruct(model.DtTaskStep{})
 	resp, err := base.NewQueryBaseHandler(model.NewDtTaskStep()).List(db, req)
@@ -213,6 +216,61 @@ func (s *DtTaskStepService) Delete(c *gin.Context) {
 	base.NewBaseHandler(model.NewDtTaskStep()).DeleteOne(c, s.DB())
 }
 
+// DtTaskExampleService 审核样例服务
+type DtTaskExampleService struct {
+	base.BizCommonService
+}
+
+func (s *DtTaskExampleService) Get(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	base.NewBaseHandler(model.NewDtTaskExample()).Get(c, s.DB())
+}
+
+func (s *DtTaskExampleService) Find(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	type request[T any] struct {
+		base.ListRequest[T]
+		TaskId *int64 `form:"taskId"`
+	}
+	req := new(request[model.DtTaskExample])
+	if err := c.BindQuery(req); err != nil {
+		response.Resp(c, err.Error())
+		return
+	}
+	db := s.DB()
+	if req.TaskId != nil && *req.TaskId != 0 {
+		db = db.Where("task_id", req.TaskId)
+	}
+	db = db.Order("sort ASC, id ASC")
+
+	colInfo := s.GetColumnCommentFromStruct(model.DtTaskExample{})
+	resp, err := base.NewQueryBaseHandler(model.NewDtTaskExample()).List(db, req)
+	if err != nil {
+		response.Resp(c, err.Error())
+		return
+	}
+	response.Resp(c, map[string]interface{}{
+		"cols":   colInfo,
+		"list":   resp.List,
+		"paging": resp.Paging,
+	})
+}
+
+func (s *DtTaskExampleService) Create(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	base.NewBaseHandler(model.NewDtTaskExample()).Create(c, s.DB())
+}
+
+func (s *DtTaskExampleService) Update(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	base.NewBaseHandler(model.NewDtTaskExample()).UpdateOne(c, s.DB())
+}
+
+func (s *DtTaskExampleService) Delete(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	base.NewBaseHandler(model.NewDtTaskExample()).DeleteOne(c, s.DB())
+}
+
 // DtUserTaskService 用户任务记录服务
 type DtUserTaskService struct {
 	base.BizCommonService
@@ -299,6 +357,9 @@ func (s *DtUserTaskService) Delete(c *gin.Context) {
 // Audit 审核任务
 func (s *DtUserTaskService) Audit(c *gin.Context) {
 	s.SetDbAlias("daytask")
+	db := s.DB()
+	now := time.Now().Unix()
+
 	type request struct {
 		Id           int64  `json:"id" binding:"required"`
 		Status       int8   `json:"status" binding:"required"` // 2=通过 3=拒绝
@@ -315,19 +376,120 @@ func (s *DtUserTaskService) Audit(c *gin.Context) {
 		return
 	}
 
+	// 查询用户任务记录
+	var userTask model.DtUserTask
+	if err := db.Where("id = ? AND status = 1", req.Id).First(&userTask).Error; err != nil {
+		response.Resp(c, "任务记录不存在或状态不正确")
+		return
+	}
+
+	// 开启事务
+	tx := db.Begin()
+
+	// 更新任务状态
 	updates := map[string]interface{}{
 		"status":       req.Status,
 		"audit_remark": req.AuditRemark,
-		"audit_time":   c.GetInt64("now"),
+		"audit_time":   now,
 	}
 	if req.Status == 3 {
 		updates["reject_reason"] = req.RejectReason
 	}
 
-	err := s.DB().Model(&model.DtUserTask{}).Where("id = ? AND status = 1", req.Id).Updates(updates).Error
-	if err != nil {
+	if err := tx.Model(&model.DtUserTask{}).Where("id = ?", req.Id).Updates(updates).Error; err != nil {
+		tx.Rollback()
 		response.Resp(c, err.Error())
 		return
 	}
+
+	// 审核通过,发放奖励
+	if req.Status == 2 {
+		// 1. 查询用户信息
+		var user model.DtUser
+		if err := tx.Where("id = ?", userTask.UserId).First(&user).Error; err != nil {
+			tx.Rollback()
+			response.Resp(c, "用户不存在")
+			return
+		}
+
+		// 2. 更新任务完成数量
+		tx.Exec("UPDATE dt_task SET completed_count = completed_count + 1 WHERE id = ?", userTask.TaskId)
+
+		// 3. 给用户发放任务奖励
+		rewardAmount := userTask.RewardAmount
+		newBalance := user.Balance + rewardAmount
+
+		tx.Model(&model.DtUser{}).Where("id = ?", user.Id).Updates(map[string]interface{}{
+			"balance":           newBalance,
+			"total_task_income": user.TotalTaskIncome + rewardAmount,
+			"total_task_count":  user.TotalTaskCount + 1,
+		})
+
+		// 4. 记录用户余额流水
+		tx.Create(&model.DtBalanceLog{
+			UserId:        user.Id,
+			UserUid:       user.Uid,
+			Type:          "task_reward",
+			Amount:        rewardAmount,
+			BalanceBefore: user.Balance,
+			BalanceAfter:  newBalance,
+			RelatedId:     userTask.Id,
+			RelatedNo:     userTask.OrderNo,
+			Title:         "任务奖励 - " + userTask.TaskTitle,
+			Remark:        "完成任务获得奖励",
+			CreatedAt:     now,
+		})
+
+		// 5. 处理一级上级返佣
+		if user.ParentId > 0 {
+			// 获取返佣比例配置
+			var config model.DtConfig
+			commissionRate := 0.1 // 默认10%
+			if err := tx.Where("`group` = ? AND `key` = ?", "commission", "level1_rate").First(&config).Error; err == nil {
+				if rate, err := parseFloat(config.Value); err == nil && rate > 0 {
+					commissionRate = rate
+				}
+			}
+
+			// 计算返佣金额
+			commission := rewardAmount * commissionRate
+			if commission > 0 {
+				// 查询上级用户
+				var parent model.DtUser
+				if err := tx.Where("id = ?", user.ParentId).First(&parent).Error; err == nil {
+					// 更新上级余额
+					parentNewBalance := parent.Balance + commission
+					tx.Model(&model.DtUser{}).Where("id = ?", parent.Id).Updates(map[string]interface{}{
+						"balance":             parentNewBalance,
+						"total_invite_income": parent.TotalInviteIncome + commission,
+					})
+
+					// 记录上级余额流水
+					tx.Create(&model.DtBalanceLog{
+						UserId:        parent.Id,
+						UserUid:       parent.Uid,
+						Type:          "invite_reward",
+						Amount:        commission,
+						BalanceBefore: parent.Balance,
+						BalanceAfter:  parentNewBalance,
+						RelatedId:     userTask.Id,
+						RelatedNo:     userTask.OrderNo,
+						Title:         "推广返佣 - " + user.Nickname,
+						Remark:        "下级完成任务返佣",
+						CreatedAt:     now,
+					})
+				}
+			}
+		}
+	}
+
+	tx.Commit()
 	response.Resp(c, "操作成功")
 }
+
+// parseFloat 解析浮点数
+func parseFloat(s string) (float64, error) {
+	var f float64
+	_, err := fmt.Sscanf(s, "%f", &f)
+	return f, err
+}

+ 1 - 2
service/daytask/enter.go

@@ -10,13 +10,12 @@ type ServiceGroup struct {
 	DtTaskCategoryService
 	DtTaskService
 	DtTaskStepService
+	DtTaskExampleService
 	DtUserTaskService
 
 	// 财务模块
-	DtRechargeOrderService
 	DtWithdrawOrderService
 	DtBalanceLogService
-	DtPaymentChannelService
 
 	// 内容模块
 	DtNoticeService

+ 122 - 0
service/system/sys_file.go

@@ -1,11 +1,18 @@
 package system
 
 import (
+	"path/filepath"
+	"strconv"
+	"strings"
+
 	"github.com/gin-gonic/gin"
 	"go_server/base/config"
+	"go_server/global"
+	"go_server/model/biz_modules/daytask"
 	"go_server/model/common/response"
 	"go_server/service/base"
 	"go_server/utils"
+	"gorm.io/gorm"
 )
 
 type FileService struct {
@@ -23,12 +30,127 @@ func (s *FileService) UploadFile(c *gin.Context) {
 		response.Resp(c, err.Error())
 		return
 	}
+
+	// 自动保存到素材库
+	groupIdStr := c.PostForm("groupId")
+	groupCode := c.PostForm("groupCode") // 分组代码,如 banner, task, notice 等
+	autoSave := c.PostForm("autoSave")   // 是否自动保存到素材库,默认true
+
+	// 默认自动保存,除非明确设置为 "false" 或 "0"
+	shouldSave := autoSave != "false" && autoSave != "0"
+
+	if shouldSave {
+		// 获取daytask数据库连接
+		db, dbErr := global.BizDBByAlias("daytask")
+		if dbErr == nil && db != nil {
+			// 解析文件信息
+			filename := header.Filename
+			fileSize := header.Size
+			mimeType := header.Header.Get("Content-Type")
+
+			// 判断文件类型
+			fileType := getFileType(mimeType, filename)
+
+			// 获取groupId
+			var groupId int64 = 0
+			if groupIdStr != "" {
+				groupId, _ = strconv.ParseInt(groupIdStr, 10, 64)
+			} else if groupCode != "" {
+				// 通过groupCode查找或创建分组
+				groupId = getOrCreateGroupByCode(db, groupCode)
+			}
+
+			// 获取管理员ID
+			adminId := c.GetInt64("userId")
+
+			// 创建素材记录(不包含cover字段)
+			material := daytask.DtMaterial{
+				Name:     filename,
+				Path:     file,
+				Url:      path,
+				Type:     fileType,
+				MimeType: mimeType,
+				Size:     fileSize,
+				Storage:  "local",
+				GroupId:  groupId,
+				AdminId:  adminId,
+				Status:   1,
+			}
+
+			// 保存到数据库,排除cover字段
+			db.Omit("cover").Create(&material)
+		}
+	}
+
 	response.Resp(c, map[string]interface{}{
 		"path": path,
 		"file": file,
 	})
 }
 
+// getOrCreateGroupByCode 通过分组代码获取或创建分组
+func getOrCreateGroupByCode(db *gorm.DB, code string) int64 {
+	// 分组代码与名称的映射
+	codeNameMap := map[string]string{
+		"banner":  "Banner图片",
+		"task":    "任务素材",
+		"notice":  "公告素材",
+		"help":    "帮助中心",
+		"avatar":  "用户头像",
+		"default": "默认分组",
+	}
+
+	// 查找已存在的分组
+	var group daytask.DtMaterialGroup
+	result := db.Where("code = ?", code).First(&group)
+	if result.Error == nil {
+		return group.Id
+	}
+
+	// 分组不存在,创建新分组
+	groupName := codeNameMap[code]
+	if groupName == "" {
+		groupName = code // 如果没有映射,直接使用code作为名称
+	}
+
+	newGroup := daytask.DtMaterialGroup{
+		Name:   groupName,
+		Code:   code,
+		Status: 1,
+	}
+	db.Create(&newGroup)
+	return newGroup.Id
+}
+
+// getFileType 根据MIME类型和文件名判断文件类型
+func getFileType(mimeType, filename string) string {
+	// 优先根据MIME类型判断
+	if strings.HasPrefix(mimeType, "image/") {
+		return "image"
+	}
+	if strings.HasPrefix(mimeType, "video/") {
+		return "video"
+	}
+	if strings.HasPrefix(mimeType, "audio/") {
+		return "audio"
+	}
+
+	// 根据文件扩展名判断
+	ext := strings.ToLower(filepath.Ext(filename))
+	switch ext {
+	case ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".svg", ".ico":
+		return "image"
+	case ".mp4", ".avi", ".mov", ".wmv", ".flv", ".mkv", ".webm":
+		return "video"
+	case ".mp3", ".wav", ".ogg", ".flac", ".aac", ".m4a":
+		return "audio"
+	case ".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".txt":
+		return "document"
+	default:
+		return "other"
+	}
+}
+
 func (s *FileService) DeleteFile(c *gin.Context) {
 	filename, ok := c.GetQuery("filename")
 	if !ok {