plat_task.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package plat
  2. import (
  3. "context"
  4. "dashoo.cn/micro/app/dao/plat"
  5. model "dashoo.cn/micro/app/model/plat"
  6. "dashoo.cn/micro/app/service"
  7. "database/sql"
  8. "fmt"
  9. "github.com/gogf/gf/errors/gerror"
  10. "github.com/gogf/gf/frame/g"
  11. "github.com/gogf/gf/os/gtime"
  12. "github.com/gogf/gf/util/gconv"
  13. "strconv"
  14. )
  15. type taskService struct {
  16. *service.ContextService
  17. Dao *plat.PlatTaskDao
  18. }
  19. func NewTaskService(ctx context.Context) (svc *taskService, err error) {
  20. svc = new(taskService)
  21. if svc.ContextService, err = svc.Init(ctx); err != nil {
  22. return nil, err
  23. }
  24. svc.Dao = plat.NewPlatTaskDao(svc.Tenant)
  25. return svc, nil
  26. }
  27. // 任务信息列表
  28. func (s *taskService) GetList(req *model.SearchPlatTaskReq) (total int, TaskList []*model.PlatTask, err error) {
  29. TaskModel := s.Dao.M
  30. if req.TaskTitle != "" {
  31. TaskModel = TaskModel.Where("task_title LIKE ?", "%" + req.TaskTitle + "%")
  32. }
  33. if req.TaskType != "" {
  34. TaskModel = TaskModel.Where("task_type", req.TaskType)
  35. }
  36. if req.TaskStatus != "" {
  37. TaskModel = TaskModel.Where("task_status", req.TaskStatus)
  38. }
  39. if req.IsOverdue != "" {
  40. TaskModel = TaskModel.Where("is_overdue", req.IsOverdue)
  41. }
  42. if req.MainUserId != "" {
  43. TaskModel = TaskModel.Where("main_user_id", req.MainUserId)
  44. }
  45. if req.TargetId != "" {
  46. TaskModel = TaskModel.Where("target_id", req.TargetId)
  47. }
  48. if req.TargetType != "" {
  49. TaskModel = TaskModel.Where("target_type", req.TargetType)
  50. }
  51. total, err = TaskModel.Count()
  52. if err != nil {
  53. g.Log().Error(err)
  54. err = gerror.New("获取总行数失败")
  55. return
  56. }
  57. err = TaskModel.Page(req.PageNum, req.PageSize).Order("created_time DESC").Scan(&TaskList)
  58. return
  59. }
  60. // 添加信息
  61. func (s *taskService) Create(req *model.AddPlatTaskReq) (err error) {
  62. platTask := new(model.PlatTask)
  63. if err = gconv.Struct(req, platTask); err != nil {
  64. return
  65. }
  66. platTask.IsOverdue = "10" // 是否超期(10否20是)
  67. if platTask.TaskStartDate == nil {
  68. platTask.TaskStartDate = gtime.Now()
  69. }
  70. // 填充创建信息
  71. service.SetCreatedInfo(platTask, s.GetCxtUserId(), s.GetCxtUserName())
  72. // 填充更新信息
  73. //service.SetUpdatedInfo(platTask, s.GetCxtUserId(), s.GetCxtUserName())
  74. Model := s.Dao.M
  75. res, err := Model.Insert(platTask)
  76. if err != nil {
  77. return
  78. }
  79. // 流程日志
  80. id, _ := res.LastInsertId()
  81. err = CreateTaskLog(s, nil, int(id), s.GetCxtUserId(), s.GetCxtUserName(), "创建任务", "创建任务成功", "")
  82. return
  83. }
  84. // 修改状态
  85. func (s *taskService) ChangeStatus(req *model.ChangeStatusReq) (err error) {
  86. data := ""
  87. where := fmt.Sprintf("id='%v'", req.TaskId)
  88. nodeName := "状态修改"
  89. desc := "修改成功"
  90. // 类型合规判断
  91. if req.Type == "TaskStatus" {
  92. data = fmt.Sprintf("task_status='%v'", req.NowStatus)
  93. nodeName = "任务状态修改"
  94. if req.NowStatus == "20" {
  95. desc = "任务关闭"
  96. } else if req.NowStatus == "30" {
  97. desc = "任务完成"
  98. data += fmt.Sprintf(",task_end_date='%v'", gtime.Now().Format("Y-m-d H:i:s"))
  99. }
  100. } else if req.Type == "IsOverdue" {
  101. nodeName = "超期状态修改"
  102. if req.NowStatus == "20" {
  103. desc = "任务超期"
  104. }
  105. data = fmt.Sprintf("is_overdue='%v'", req.NowStatus)
  106. } else {
  107. return fmt.Errorf("类型不匹配,请仔细检查")
  108. }
  109. // 读取现有数据
  110. task, err := s.Dao.FindOne(where)
  111. if err != nil {
  112. return err
  113. }
  114. // 状态数据一致性判断
  115. if (req.Type == "TaskStatus" && task.TaskStatus != req.OldStatus) || (req.Type == "IsOverdue" && task.IsOverdue != req.OldStatus) {
  116. return fmt.Errorf("状态不匹配,进行该操作")
  117. }
  118. // 更新数据
  119. _, err = s.Dao.Update(data, where)
  120. if err != nil {
  121. return
  122. }
  123. // 流程日志
  124. taskId, _ := strconv.Atoi(req.TaskId)
  125. err = CreateTaskLog(s, nil, taskId, s.GetCxtUserId(), s.GetCxtUserName(), nodeName, desc, "")
  126. return
  127. }
  128. // 任务日志创建方法
  129. func CreateTaskLog(s1 *taskService, s2 *taskProgressService, taskId, userId int, userName, nodeName, desc, remark string) (err error) {
  130. var log model.PlatTaskLog
  131. startTime := gtime.Now()
  132. endTime := startTime
  133. // 默认为当前时间,然后随已有日志情况进行更新
  134. if s1 != nil {
  135. logs, err := s1.Dao.DB.Model(plat.PlatTaskLog.Table).Where(fmt.Sprintf("task_id='%v'", taskId)).Order("created_time DESC").FindAll()
  136. if err != nil && err != sql.ErrNoRows {
  137. return err
  138. }
  139. if len(logs) > 0 {
  140. startTime = logs[0]["end_time"].GTime()
  141. }
  142. } else {
  143. logs, err := s2.Dao.DB.Model(plat.PlatTaskLog.Table).Where(fmt.Sprintf("task_id='%v'", taskId)).Order("created_time DESC").FindAll()
  144. if err != nil && err != sql.ErrNoRows {
  145. return err
  146. }
  147. if len(logs) > 0 {
  148. startTime = logs[0]["end_time"].GTime()
  149. }
  150. }
  151. // 填入日志相关数据
  152. log.TaskId = taskId
  153. log.NodeName = nodeName
  154. log.Desc = desc
  155. log.StartTime = startTime
  156. log.EndTime = endTime
  157. log.Remark = remark
  158. log.CreatedTime = endTime
  159. log.CreatedName = userName
  160. log.CreatedBy = userId
  161. if s1 != nil {
  162. _, err = s1.Dao.DB.Save(plat.PlatTaskLog.Table, log)
  163. } else {
  164. _, err = s2.Dao.DB.Save(plat.PlatTaskLog.Table, log)
  165. }
  166. return err
  167. }