plat_task.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. package plat
  2. import (
  3. "bytes"
  4. "context"
  5. "dashoo.cn/micro/app/dao/plat"
  6. model "dashoo.cn/micro/app/model/plat"
  7. "dashoo.cn/micro/app/service"
  8. "database/sql"
  9. "fmt"
  10. "github.com/360EntSecGroup-Skylar/excelize"
  11. "github.com/gogf/gf/errors/gerror"
  12. "github.com/gogf/gf/frame/g"
  13. "github.com/gogf/gf/os/gtime"
  14. "github.com/gogf/gf/util/gconv"
  15. "strconv"
  16. )
  17. type taskService struct {
  18. *service.ContextService
  19. Dao *plat.PlatTaskDao
  20. }
  21. func NewTaskService(ctx context.Context) (svc *taskService, err error) {
  22. svc = new(taskService)
  23. if svc.ContextService, err = svc.Init(ctx); err != nil {
  24. return nil, err
  25. }
  26. svc.Dao = plat.NewPlatTaskDao(svc.Tenant)
  27. return svc, nil
  28. }
  29. // 任务信息列表
  30. func (s *taskService) GetList(req *model.SearchPlatTaskReq) (total int, TaskList []*model.PlatTask, err error) {
  31. TaskModel := s.Dao.M
  32. if req.TaskTitle != "" {
  33. TaskModel = TaskModel.Where("task_title LIKE ?", "%"+req.TaskTitle+"%")
  34. }
  35. if req.TaskType != "" {
  36. TaskModel = TaskModel.Where("task_type", req.TaskType)
  37. }
  38. if req.TaskStatus != "" {
  39. TaskModel = TaskModel.Where("task_status", req.TaskStatus)
  40. }
  41. if req.IsOverdue != "" {
  42. TaskModel = TaskModel.Where("is_overdue", req.IsOverdue)
  43. }
  44. if req.MainUserId != "" {
  45. TaskModel = TaskModel.Where("main_user_id", req.MainUserId)
  46. }
  47. if req.TargetId != "" {
  48. TaskModel = TaskModel.Where("target_id", req.TargetId)
  49. }
  50. if req.TargetType != "" {
  51. TaskModel = TaskModel.Where("target_type", req.TargetType)
  52. }
  53. if req.MySelf == "1" {
  54. TaskModel = TaskModel.Where("created_by", s.GetCxtUserId())
  55. }
  56. if req.IsMain == "1" {
  57. TaskModel = TaskModel.Where("main_user_id", s.GetCxtUserId())
  58. }
  59. total, err = TaskModel.Count()
  60. if err != nil {
  61. g.Log().Error(err)
  62. err = gerror.New("获取总行数失败")
  63. return
  64. }
  65. err = TaskModel.Page(req.PageNum, req.PageSize).Order("created_time DESC").Scan(&TaskList)
  66. return
  67. }
  68. // 导出数据
  69. func (s *taskService) Export(req *model.ExportReq) (content *model.ExportContent, err error) {
  70. var con model.ExportContent
  71. // 获取数据
  72. total, list, err := s.GetList(&req.SearchPlatTaskReq)
  73. if err != nil {
  74. return nil, err
  75. }
  76. //rsp.List
  77. f := excelize.NewFile()
  78. // Create a new sheet.
  79. index := f.NewSheet("Sheet1")
  80. for index, item := range req.Columns {
  81. sheetPosition := service.Div(index+1) + "1"
  82. f.SetCellValue("Sheet1", sheetPosition, item)
  83. }
  84. if total > 0 {
  85. // 构造用户和类型填充数据
  86. userMap := make(map[int]string, 0)
  87. typeMap := make(map[string]string, 0)
  88. users, err := s.Dao.DB.Model("sys_user").FindAll()
  89. if err != nil {
  90. return nil, err
  91. }
  92. types, err := s.Dao.DB.Model("sys_dict_data").Where("dict_type='TaskType'").FindAll()
  93. if err != nil {
  94. return nil, err
  95. }
  96. for _, item := range users {
  97. userMap[item["id"].Int()] = item["user_name"].String()
  98. }
  99. for _, item := range types {
  100. typeMap[item["dict_value"].String()] = item["dict_label"].String()
  101. }
  102. // 构造excel数据
  103. for lineNum, item := range list {
  104. for index, value := range req.Columns {
  105. if value == "督办标题" {
  106. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), item.TaskTitle)
  107. }
  108. if value == "督办类型" {
  109. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), typeMap[item.TaskType])
  110. }
  111. if value == "状态" {
  112. data := ""
  113. if item.TaskStatus == "10" {
  114. data = "进行中"
  115. } else if item.TaskStatus == "20" {
  116. data = "关闭"
  117. }
  118. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), data)
  119. }
  120. if value == "超期" {
  121. data := ""
  122. if item.TaskStatus == "10" {
  123. data = "否"
  124. } else if item.TaskStatus == "20" {
  125. data = "是"
  126. }
  127. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), data)
  128. }
  129. if value == "督办说明" {
  130. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), item.TaskDesc)
  131. }
  132. if value == "关联对象" {
  133. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), item.TargetName)
  134. }
  135. if value == "负责人" {
  136. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), userMap[item.MainUserId])
  137. }
  138. if value == "督办人" {
  139. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), userMap[item.SupervisorUserId])
  140. }
  141. if value == "开始时间" {
  142. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), item.TaskStartDate.Format("Y-m-d H:i:s"))
  143. }
  144. if value == "结束时间" {
  145. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), item.TaskEndDate.Format("Y-m-d H:i:s"))
  146. }
  147. if value == "创建时间" {
  148. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), item.CreatedTime.Format("Y-m-d H:i:s"))
  149. }
  150. }
  151. }
  152. }
  153. f.SetActiveSheet(index)
  154. var buffer *bytes.Buffer
  155. buffer, _ = f.WriteToBuffer()
  156. con.Content = buffer.Bytes()
  157. return &con, err
  158. }
  159. // 统计
  160. func (s *taskService) Statistics(req *model.SearchPlatTaskReq) (*model.TaskNumberCount, error) {
  161. var result model.TaskNumberCount
  162. // 统计数量
  163. err := s.Dao.M.Fields(fmt.Sprintf("SUM(main_user_id='%v' AND task_status='10') ToDoNumber, SUM(main_user_id='%v' AND task_status='20') CompletedNumber, SUM(created_by='%v') CreateNumber", s.GetCxtUserId(), s.GetCxtUserId(), s.GetCxtUserId())).Scan(&result)
  164. if err != nil {
  165. if err == sql.ErrNoRows {
  166. result.CompletedNumber = 0
  167. result.CreateNumber = 0
  168. result.ToDoNumber = 0
  169. return &result, nil
  170. } else {
  171. return nil, err
  172. }
  173. }
  174. return &result, nil
  175. }
  176. // 添加信息
  177. func (s *taskService) Create(req *model.AddPlatTaskReq) (err error) {
  178. platTask := new(model.PlatTask)
  179. if err = gconv.Struct(req, platTask); err != nil {
  180. return
  181. }
  182. platTask.IsOverdue = "10" // 是否超期(10否20是)
  183. if platTask.TaskStartDate == nil {
  184. platTask.TaskStartDate = gtime.Now()
  185. }
  186. // 填充创建信息
  187. service.SetCreatedInfo(platTask, s.GetCxtUserId(), s.GetCxtUserName())
  188. // 填充更新信息
  189. //service.SetUpdatedInfo(platTask, s.GetCxtUserId(), s.GetCxtUserName())
  190. Model := s.Dao.M
  191. res, err := Model.Insert(platTask)
  192. if err != nil {
  193. return
  194. }
  195. // 流程日志
  196. id, _ := res.LastInsertId()
  197. err = CreateTaskLog(s, nil, int(id), s.GetCxtUserId(), s.GetCxtUserName(), "创建督办", "创建督办成功", "")
  198. return
  199. }
  200. // 修改状态
  201. func (s *taskService) ChangeStatus(req *model.ChangeStatusReq) (err error) {
  202. data := ""
  203. where := fmt.Sprintf("id='%v'", req.TaskId)
  204. nodeName := "状态修改"
  205. desc := "修改成功"
  206. // 类型合规判断
  207. if req.Type == "TaskStatus" {
  208. data = fmt.Sprintf("task_status='%v'", req.NowStatus)
  209. nodeName = "状态修改"
  210. if req.NowStatus == "20" {
  211. desc = "关闭"
  212. data += fmt.Sprintf(",task_end_date='%v'", gtime.Now().Format("Y-m-d H:i:s"))
  213. }
  214. } else if req.Type == "IsOverdue" {
  215. nodeName = "超期状态修改"
  216. if req.NowStatus == "20" {
  217. desc = "超期"
  218. }
  219. data = fmt.Sprintf("is_overdue='%v'", req.NowStatus)
  220. } else {
  221. return fmt.Errorf("类型不匹配,请仔细检查")
  222. }
  223. // 读取现有数据
  224. task, err := s.Dao.Where(where).FindOne()
  225. if err != nil {
  226. return err
  227. }
  228. // 状态数据一致性判断
  229. if (req.Type == "TaskStatus" && task.TaskStatus != req.OldStatus) || (req.Type == "IsOverdue" && task.IsOverdue != req.OldStatus) {
  230. return fmt.Errorf("状态不匹配,进行该操作")
  231. }
  232. // 更新数据
  233. _, err = s.Dao.Update(data, where)
  234. if err != nil {
  235. return
  236. }
  237. // 流程日志
  238. taskId, _ := strconv.Atoi(req.TaskId)
  239. err = CreateTaskLog(s, nil, taskId, s.GetCxtUserId(), s.GetCxtUserName(), nodeName, desc, "")
  240. return
  241. }
  242. // 任务日志创建方法
  243. func CreateTaskLog(s1 *taskService, s2 *taskProgressService, taskId, userId int, userName, nodeName, desc, remark string) (err error) {
  244. var log model.PlatTaskLog
  245. startTime := gtime.Now()
  246. endTime := startTime
  247. // 默认为当前时间,然后随已有日志情况进行更新
  248. if s1 != nil {
  249. logs, err := s1.Dao.DB.Model(plat.PlatTaskLog.Table).Where(fmt.Sprintf("task_id='%v'", taskId)).Order("created_time DESC").FindAll()
  250. if err != nil && err != sql.ErrNoRows {
  251. return err
  252. }
  253. if len(logs) > 0 {
  254. startTime = logs[0]["end_time"].GTime()
  255. }
  256. } else {
  257. logs, err := s2.Dao.DB.Model(plat.PlatTaskLog.Table).Where(fmt.Sprintf("task_id='%v'", taskId)).Order("created_time DESC").FindAll()
  258. if err != nil && err != sql.ErrNoRows {
  259. return err
  260. }
  261. if len(logs) > 0 {
  262. startTime = logs[0]["end_time"].GTime()
  263. }
  264. }
  265. // 填入日志相关数据
  266. log.TaskId = taskId
  267. log.NodeName = nodeName
  268. log.Desc = desc
  269. log.StartTime = startTime
  270. log.EndTime = endTime
  271. log.Remark = remark
  272. log.CreatedTime = endTime
  273. log.CreatedName = userName
  274. log.CreatedBy = userId
  275. if s1 != nil {
  276. _, err = s1.Dao.DB.Save(plat.PlatTaskLog.Table, log)
  277. } else {
  278. _, err = s2.Dao.DB.Save(plat.PlatTaskLog.Table, log)
  279. }
  280. return err
  281. }