|
|
@@ -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
|
|
|
+}
|