package plat import ( "bytes" "context" "dashoo.cn/micro/app/dao/plat" model "dashoo.cn/micro/app/model/plat" "dashoo.cn/micro/app/service" "database/sql" "fmt" "github.com/360EntSecGroup-Skylar/excelize" "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/os/gtime" "github.com/gogf/gf/util/gconv" "strconv" ) type taskService struct { *service.ContextService Dao *plat.PlatTaskDao } func NewTaskService(ctx context.Context) (svc *taskService, err error) { svc = new(taskService) if svc.ContextService, err = svc.Init(ctx); err != nil { return nil, err } svc.Dao = plat.NewPlatTaskDao(svc.Tenant) return svc, nil } // 任务信息列表 func (s *taskService) GetList(req *model.SearchPlatTaskReq) (total int, TaskList []*model.PlatTask, err error) { TaskModel := s.Dao.M if req.TaskTitle != "" { TaskModel = TaskModel.Where("task_title LIKE ?", "%"+req.TaskTitle+"%") } if req.TaskType != "" { TaskModel = TaskModel.Where("task_type", req.TaskType) } if req.TaskStatus != "" { TaskModel = TaskModel.Where("task_status", req.TaskStatus) } if req.IsOverdue != "" { TaskModel = TaskModel.Where("is_overdue", req.IsOverdue) } if req.MainUserId != "" { TaskModel = TaskModel.Where("main_user_id", req.MainUserId) } if req.TargetId != "" { TaskModel = TaskModel.Where("target_id", req.TargetId) } if req.TargetType != "" { TaskModel = TaskModel.Where("target_type", req.TargetType) } if req.MySelf == "1" { TaskModel = TaskModel.Where("created_by", s.GetCxtUserId()) } if req.IsMain == "1" { TaskModel = TaskModel.Where("main_user_id", s.GetCxtUserId()) } total, err = TaskModel.Count() if err != nil { g.Log().Error(err) err = gerror.New("获取总行数失败") return } err = TaskModel.Page(req.PageNum, req.PageSize).Order("created_time DESC").Scan(&TaskList) return } // 导出数据 func (s *taskService) Export(req *model.ExportReq) (content *model.ExportContent, err error) { var con model.ExportContent // 获取数据 total, list, err := s.GetList(&req.SearchPlatTaskReq) if err != nil { return nil, err } //rsp.List f := excelize.NewFile() // Create a new sheet. index := f.NewSheet("Sheet1") for index, item := range req.Columns { sheetPosition := service.Div(index+1) + "1" f.SetCellValue("Sheet1", sheetPosition, item) } if total > 0 { // 构造用户和类型填充数据 userMap := make(map[int]string, 0) typeMap := make(map[string]string, 0) users, err := s.Dao.DB.Model("sys_user").FindAll() if err != nil { return nil, err } types, err := s.Dao.DB.Model("sys_dict_data").Where("dict_type='TaskType'").FindAll() if err != nil { return nil, err } for _, item := range users { userMap[item["id"].Int()] = item["user_name"].String() } for _, item := range types { typeMap[item["dict_value"].String()] = item["dict_label"].String() } // 构造excel数据 for lineNum, item := range list { for index, value := range req.Columns { if value == "督办标题" { f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), item.TaskTitle) } if value == "督办类型" { f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), typeMap[item.TaskType]) } if value == "状态" { data := "" if item.TaskStatus == "10" { data = "进行中" } else if item.TaskStatus == "20" { data = "关闭" } f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), data) } if value == "超期" { data := "" if item.TaskStatus == "10" { data = "否" } else if item.TaskStatus == "20" { data = "是" } f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), data) } if value == "督办说明" { f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), item.TaskDesc) } if value == "关联对象" { f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), item.TargetName) } if value == "负责人" { f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), userMap[item.MainUserId]) } if value == "督办人" { f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), userMap[item.SupervisorUserId]) } if value == "开始时间" { f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), item.TaskStartDate.Format("Y-m-d H:i:s")) } if value == "结束时间" { f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), item.TaskEndDate.Format("Y-m-d H:i:s")) } if value == "创建时间" { f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(lineNum+2), item.CreatedTime.Format("Y-m-d H:i:s")) } } } } f.SetActiveSheet(index) var buffer *bytes.Buffer buffer, _ = f.WriteToBuffer() con.Content = buffer.Bytes() return &con, err } // 统计 func (s *taskService) Statistics(req *model.SearchPlatTaskReq) (*model.TaskNumberCount, error) { var result model.TaskNumberCount // 统计数量 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) if err != nil { if err == sql.ErrNoRows { result.CompletedNumber = 0 result.CreateNumber = 0 result.ToDoNumber = 0 return &result, nil } else { return nil, err } } return &result, nil } // 添加信息 func (s *taskService) Create(req *model.AddPlatTaskReq) (err error) { platTask := new(model.PlatTask) if err = gconv.Struct(req, platTask); err != nil { return } platTask.IsOverdue = "10" // 是否超期(10否20是) if platTask.TaskStartDate == nil { platTask.TaskStartDate = gtime.Now() } // 填充创建信息 service.SetCreatedInfo(platTask, s.GetCxtUserId(), s.GetCxtUserName()) // 填充更新信息 //service.SetUpdatedInfo(platTask, s.GetCxtUserId(), s.GetCxtUserName()) Model := s.Dao.M res, err := Model.Insert(platTask) if err != nil { return } // 流程日志 id, _ := res.LastInsertId() err = CreateTaskLog(s, nil, int(id), s.GetCxtUserId(), s.GetCxtUserName(), "创建督办", "创建督办成功", "") return } // 修改状态 func (s *taskService) ChangeStatus(req *model.ChangeStatusReq) (err error) { data := "" where := fmt.Sprintf("id='%v'", req.TaskId) nodeName := "状态修改" desc := "修改成功" // 类型合规判断 if req.Type == "TaskStatus" { data = fmt.Sprintf("task_status='%v'", req.NowStatus) nodeName = "状态修改" if req.NowStatus == "20" { desc = "关闭" data += fmt.Sprintf(",task_end_date='%v'", gtime.Now().Format("Y-m-d H:i:s")) } } else if req.Type == "IsOverdue" { nodeName = "超期状态修改" if req.NowStatus == "20" { desc = "超期" } data = fmt.Sprintf("is_overdue='%v'", req.NowStatus) } else { return fmt.Errorf("类型不匹配,请仔细检查") } // 读取现有数据 task, err := s.Dao.Where(where).FindOne() if err != nil { return err } // 状态数据一致性判断 if (req.Type == "TaskStatus" && task.TaskStatus != req.OldStatus) || (req.Type == "IsOverdue" && task.IsOverdue != req.OldStatus) { return fmt.Errorf("状态不匹配,进行该操作") } // 更新数据 _, err = s.Dao.Update(data, where) if err != nil { return } // 流程日志 taskId, _ := strconv.Atoi(req.TaskId) err = CreateTaskLog(s, nil, taskId, s.GetCxtUserId(), s.GetCxtUserName(), nodeName, desc, "") return } // 任务日志创建方法 func CreateTaskLog(s1 *taskService, s2 *taskProgressService, taskId, userId int, userName, nodeName, desc, remark string) (err error) { var log model.PlatTaskLog startTime := gtime.Now() endTime := startTime // 默认为当前时间,然后随已有日志情况进行更新 if s1 != nil { logs, err := s1.Dao.DB.Model(plat.PlatTaskLog.Table).Where(fmt.Sprintf("task_id='%v'", taskId)).Order("created_time DESC").FindAll() if err != nil && err != sql.ErrNoRows { return err } if len(logs) > 0 { startTime = logs[0]["end_time"].GTime() } } else { logs, err := s2.Dao.DB.Model(plat.PlatTaskLog.Table).Where(fmt.Sprintf("task_id='%v'", taskId)).Order("created_time DESC").FindAll() if err != nil && err != sql.ErrNoRows { return err } if len(logs) > 0 { startTime = logs[0]["end_time"].GTime() } } // 填入日志相关数据 log.TaskId = taskId log.NodeName = nodeName log.Desc = desc log.StartTime = startTime log.EndTime = endTime log.Remark = remark log.CreatedTime = endTime log.CreatedName = userName log.CreatedBy = userId if s1 != nil { _, err = s1.Dao.DB.Save(plat.PlatTaskLog.Table, log) } else { _, err = s2.Dao.DB.Save(plat.PlatTaskLog.Table, log) } return err }