| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- 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
- }
|