作者 郑周

定时器 通知

@@ -371,14 +371,17 @@ func (rs *EvaluationProjectService) Activate(in *command.ActivateProjectCommand) @@ -371,14 +371,17 @@ func (rs *EvaluationProjectService) Activate(in *command.ActivateProjectCommand)
371 for i := range project.Template.LinkNodes { 371 for i := range project.Template.LinkNodes {
372 node := project.Template.LinkNodes[i] 372 node := project.Template.LinkNodes[i]
373 task := &domain.NodeTask{ 373 task := &domain.NodeTask{
374 - Id: 0,  
375 - CompanyId: project.CompanyId,  
376 - CycleId: project.CycleId,  
377 - ProjectId: project.Id,  
378 - NodeId: node.Id,  
379 - KpiCycle: node.KpiCycle,  
380 - BeginAt: node.TimeStart,  
381 - EndAt: node.TimeEnd, 374 + Id: 0,
  375 + CompanyId: project.CompanyId,
  376 + CycleId: project.CycleId,
  377 + ProjectId: project.Id,
  378 + NodeId: node.Id,
  379 + NodeType: node.Type,
  380 + NodeName: node.Name,
  381 + NodeDescribe: node.Describe,
  382 + TimeStart: node.TimeStart,
  383 + TimeEnd: node.TimeEnd,
  384 + KpiCycle: node.KpiCycle,
382 } 385 }
383 // 在当前时间之前,则计算下一个周期时间 386 // 在当前时间之前,则计算下一个周期时间
384 if node.TimeStart.Before(now) { 387 if node.TimeStart.Before(now) {
@@ -3,8 +3,11 @@ package service @@ -3,8 +3,11 @@ package service
3 import ( 3 import (
4 "github.com/linmadan/egglib-go/core/application" 4 "github.com/linmadan/egglib-go/core/application"
5 "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory" 5 "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
  6 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/command"
  7 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/service"
6 "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain" 8 "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
7 "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/utils" 9 "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/utils"
  10 + "strconv"
8 "time" 11 "time"
9 ) 12 )
10 13
@@ -26,13 +29,15 @@ func (rs *NodeTaskService) SendEvaluationNode() error { @@ -26,13 +29,15 @@ func (rs *NodeTaskService) SendEvaluationNode() error {
26 transactionContext.RollbackTransaction() 29 transactionContext.RollbackTransaction()
27 }() 30 }()
28 taskRepository := factory.CreateNodeTaskRepository(map[string]interface{}{"transactionContext": transactionContext}) 31 taskRepository := factory.CreateNodeTaskRepository(map[string]interface{}{"transactionContext": transactionContext})
29 - projectRepository := factory.CreateEvaluationProjectRepository(map[string]interface{}{"transactionContext": transactionContext})  
30 - //cycleRepository := factory.CreateEvaluationCycleRepository(map[string]interface{}{"transactionContext": transactionContext})  
31 -  
32 tasks, err := taskRepository.Find(map[string]interface{}{"now": time.Now().Local()}) 32 tasks, err := taskRepository.Find(map[string]interface{}{"now": time.Now().Local()})
33 if err != nil { 33 if err != nil {
34 return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 34 return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
35 } 35 }
  36 + if len(tasks) == 0 {
  37 + return nil
  38 + }
  39 + projectRepository := factory.CreateEvaluationProjectRepository(map[string]interface{}{"transactionContext": transactionContext})
  40 + cycleRepository := factory.CreateEvaluationCycleRepository(map[string]interface{}{"transactionContext": transactionContext})
36 41
37 //ttaffAssessRepository := factory.CreateStaffAssessTaskRepository(map[string]interface{}{"transactionContext": transactionContext}) 42 //ttaffAssessRepository := factory.CreateStaffAssessTaskRepository(map[string]interface{}{"transactionContext": transactionContext})
38 // 43 //
@@ -53,49 +58,114 @@ func (rs *NodeTaskService) SendEvaluationNode() error { @@ -53,49 +58,114 @@ func (rs *NodeTaskService) SendEvaluationNode() error {
53 cycleIds = append(cycleIds, k) 58 cycleIds = append(cycleIds, k)
54 } 59 }
55 60
56 - _, projects, err := projectRepository.Find(map[string]interface{}{"ids": projectIds}) 61 + _, projects, err := projectRepository.Find(map[string]interface{}{"ids": projectIds}, "template")
  62 + if err != nil {
  63 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  64 + }
  65 + _, cycles, err := cycleRepository.Find(map[string]interface{}{"ids": cycleIds})
57 if err != nil { 66 if err != nil {
58 return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 67 return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
59 } 68 }
60 - //_, cycles, err := cycleRepository.Find(map[string]interface{}{"ids": cycleIds})  
61 - //if err != nil {  
62 - // return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())  
63 - //}  
64 69
65 for i := range projects { 70 for i := range projects {
66 projectIdsMap[projects[i].Id] = projects[i] 71 projectIdsMap[projects[i].Id] = projects[i]
67 } 72 }
  73 + for i := range cycles {
  74 + cycleIdsMap[cycles[i].Id] = cycles[i]
  75 + }
68 76
69 - //staffAssessService := service.NewStaffAssessServeice()  
70 - 77 + staffAssessTaskMap := map[int64]*command.CreateStaffAssessTask{}
71 for i := range tasks { 78 for i := range tasks {
72 task := tasks[i] 79 task := tasks[i]
73 -  
74 - //if project, ok := projectIdsMap[task.ProjectId]; ok {  
75 -  
76 - //csat := &command.CreateStaffAssessTask{  
77 - // CompanyId: project.CompanyId,  
78 - // EvaluationProjectId: project.Id,  
79 - // EvaluationProjectName: project.Name,  
80 - // CycleId: project.CycleId,  
81 - //}  
82 - //  
83 - //staffAssessService.CreateStaffAssessTask(csat)  
84 - //}  
85 -  
86 - // 下一次发送时间  
87 - nextTime := utils.NextTimeInc(task.NextSentAt, task.KpiCycle)  
88 - task.NextSentAt = &nextTime  
89 - // 如果超出截至时间,则周期置空  
90 - if task.NextSentAt.After(*task.EndAt) { 80 + // 项目
  81 + project, ok := projectIdsMap[task.ProjectId]
  82 + if ok {
  83 +
  84 + // 环节截止时间
  85 + maxTime := time.Date(task.TimeEnd.Year(), task.TimeEnd.Month(), task.TimeEnd.Day(), task.TimeEnd.Hour(), task.TimeEnd.Minute(), 0, 0, time.Local)
  86 +
  87 + // 当前周起始时间和截止时间
  88 + var cycleTimeStart = task.NextSentAt
  89 + var cycleTimeEnd *time.Time
  90 +
  91 + // 下个周期起始时间
  92 + nextTime := utils.NextTimeInc(task.NextSentAt, task.KpiCycle)
  93 + // 超过截止时间
  94 + if nextTime.After(maxTime) {
  95 + task.NextSentAt = nil
  96 + } else {
  97 + task.NextSentAt = &nextTime
  98 + }
  99 +
  100 + // 下个周期的起始时间=当前周期的截止时间
  101 + if task.NextSentAt == nil {
  102 + cycleTimeEnd = &maxTime
  103 + } else {
  104 + cycleTimeEnd = task.NextSentAt
  105 + }
  106 +
  107 + // 格式化周期的起始和截止时间
  108 + fmCycleStartTime := cycleTimeStart.Format("2006-1-2 15:04:05")
  109 + fmCycleTimeEnd := cycleTimeEnd.Format("2006-1-2 15:04:05")
  110 +
  111 + var csat, staffOk = staffAssessTaskMap[task.ProjectId]
  112 + if !staffOk {
  113 + csat = &command.CreateStaffAssessTask{
  114 + CompanyId: int(project.CompanyId),
  115 + EvaluationProjectId: int(project.Id),
  116 + EvaluationProjectName: project.Name,
  117 + CycleId: project.CycleId,
  118 + }
  119 +
  120 + // 周期名称
  121 + if cycle, ok := cycleIdsMap[project.CycleId]; ok {
  122 + csat.CycleName = cycle.Name
  123 + }
  124 +
  125 + // 接收人
  126 + csat.ExecutorId = make([]int, 0)
  127 + for rIndex := range project.Recipients {
  128 + vInt, _ := strconv.Atoi(project.Recipients[rIndex])
  129 + csat.ExecutorId = append(csat.ExecutorId, vInt)
  130 + }
  131 +
  132 + // FIXME 这里设置时间可能会有歧义,目前原型设计时间均一致,所以直接选取第一个获取到的周期时间,作为本周期的起止和截止时间
  133 + csat.BeginTime = fmCycleStartTime
  134 + csat.EndTime = fmCycleTimeEnd
  135 +
  136 + staffAssessTaskMap[task.ProjectId] = csat
  137 + }
  138 +
  139 + if csat.StepList == nil {
  140 + csat.StepList = make([]command.AssessTaskStep, 0)
  141 + }
  142 + csat.StepList = append(csat.StepList, command.AssessTaskStep{
  143 + SortBy: i,
  144 + LinkNodeId: int(task.NodeId),
  145 + LinkNodeName: task.NodeName,
  146 + LinkNodeType: task.NodeType,
  147 + BeginTime: fmCycleStartTime,
  148 + EndTime: fmCycleTimeEnd,
  149 + })
  150 + } else {
91 task.NextSentAt = nil 151 task.NextSentAt = nil
92 } 152 }
  153 +
93 task, err := taskRepository.Insert(task) 154 task, err := taskRepository.Insert(task)
94 if err != nil { 155 if err != nil {
95 return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 156 return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
96 } 157 }
97 } 158 }
98 159
  160 + staffAssessService := service.NewStaffAssessServeice()
  161 + for i := range staffAssessTaskMap {
  162 + staffAssessTask := staffAssessTaskMap[i]
  163 + _, err := staffAssessService.CreateStaffAssessTask(staffAssessTask)
  164 + if err != nil {
  165 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  166 + }
  167 + }
  168 +
99 if err := transactionContext.CommitTransaction(); err != nil { 169 if err := transactionContext.CommitTransaction(); err != nil {
100 return application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 170 return application.ThrowError(application.TRANSACTION_ERROR, err.Error())
101 } 171 }
@@ -5,18 +5,21 @@ import ( @@ -5,18 +5,21 @@ import (
5 ) 5 )
6 6
7 type NodeTask struct { 7 type NodeTask struct {
8 - Id int64 `json:"id,string" comment:"ID"`  
9 - CompanyId int64 `json:"companyId,string" comment:"公司ID"`  
10 - CycleId int64 `json:"cycleId,string" comment:"周期ID"`  
11 - ProjectId int64 `json:"projectId,string" comment:"项目ID"`  
12 - NodeId int64 `json:"nodeId,string" comment:"节点ID"`  
13 - KpiCycle int `json:"kpiCycle" comment:"周期"`  
14 - BeginAt *time.Time `json:"beginAt" comment:"起始时间"`  
15 - EndAt *time.Time `json:"endAt" comment:"截至时间"`  
16 - NextSentAt *time.Time `json:"nextSentAt" comment:"下一次发送时间"`  
17 - CreatedAt time.Time `json:"createdAt" comment:"创建时间"`  
18 - UpdatedAt time.Time `json:"updatedAt" comment:"更新时间"`  
19 - DeletedAt *time.Time `json:"deletedAt" comment:"删除时间"` 8 + Id int64 `json:"id,string" comment:"ID"`
  9 + CompanyId int64 `json:"companyId,string" comment:"公司ID"`
  10 + CycleId int64 `json:"cycleId,string" comment:"周期ID"`
  11 + ProjectId int64 `json:"projectId,string" comment:"项目ID"`
  12 + NodeId int64 `json:"nodeId,string" comment:"节点ID"`
  13 + NodeType int `json:"nodeType" comment:"环节类型"`
  14 + NodeName string `json:"nodeName" comment:"环节名称"`
  15 + NodeDescribe string `json:"nodeDescribe" comment:"环节描述"`
  16 + TimeStart *time.Time `json:"timeStart" comment:"起始时间"`
  17 + TimeEnd *time.Time `json:"timeEnd" comment:"截至时间"`
  18 + KpiCycle int `json:"kpiCycle" comment:"考核周期(1日、2周、3月)"`
  19 + NextSentAt *time.Time `json:"nextSentAt" comment:"下一次发送时间"`
  20 + CreatedAt time.Time `json:"createdAt" comment:"创建时间"`
  21 + UpdatedAt time.Time `json:"updatedAt" comment:"更新时间"`
  22 + DeletedAt *time.Time `json:"deletedAt" comment:"删除时间"`
20 } 23 }
21 24
22 type NodeTaskRepository interface { 25 type NodeTaskRepository interface {
@@ -5,17 +5,20 @@ import ( @@ -5,17 +5,20 @@ import (
5 ) 5 )
6 6
7 type NodeTask struct { 7 type NodeTask struct {
8 - tableName struct{} `comment:"环节任务" pg:"node_task"`  
9 - Id int64 `comment:"ID" pg:"pk:id"`  
10 - CompanyId int64 `comment:"公司ID"`  
11 - CycleId int64 `comment:"周期ID"`  
12 - ProjectId int64 `comment:"项目ID"`  
13 - NodeId int64 `comment:"环节ID"`  
14 - KpiCycle int `comment:"周期"`  
15 - BeginAt *time.Time `comment:"起始时间"`  
16 - EndAt *time.Time `comment:"截止时间"`  
17 - NextSentAt *time.Time `comment:"下一次发送时间"`  
18 - CreatedAt time.Time `comment:"创建时间"`  
19 - UpdatedAt time.Time `comment:"更新时间"`  
20 - DeletedAt *time.Time `comment:"删除时间"` 8 + tableName struct{} `comment:"环节任务" pg:"node_task"`
  9 + Id int64 `comment:"ID" pg:"pk:id"`
  10 + CompanyId int64 `comment:"公司ID"`
  11 + CycleId int64 `comment:"周期ID"`
  12 + ProjectId int64 `comment:"项目ID"`
  13 + NodeId int64 `comment:"环节ID"`
  14 + NodeType int `comment:"环节类型"`
  15 + NodeName string `comment:"环节名称"`
  16 + NodeDescribe string `comment:"环节描述"`
  17 + TimeStart *time.Time `comment:"起始时间"`
  18 + TimeEnd *time.Time `comment:"截至时间"`
  19 + KpiCycle int `comment:"考核周期(1日、2周、3月)"`
  20 + NextSentAt *time.Time `comment:"下一次发送时间"`
  21 + CreatedAt time.Time `comment:"创建时间"`
  22 + UpdatedAt time.Time `comment:"更新时间"`
  23 + DeletedAt *time.Time `comment:"删除时间"`
21 } 24 }
@@ -21,35 +21,41 @@ func NewNodeTaskRepository(transactionContext *pgTransaction.TransactionContext) @@ -21,35 +21,41 @@ func NewNodeTaskRepository(transactionContext *pgTransaction.TransactionContext)
21 21
22 func (repo *NodeTaskRepository) TransformToDomain(m *models.NodeTask) domain.NodeTask { 22 func (repo *NodeTaskRepository) TransformToDomain(m *models.NodeTask) domain.NodeTask {
23 return domain.NodeTask{ 23 return domain.NodeTask{
24 - Id: m.Id,  
25 - CompanyId: m.CompanyId,  
26 - CycleId: m.CycleId,  
27 - ProjectId: m.ProjectId,  
28 - NodeId: m.NodeId,  
29 - KpiCycle: m.KpiCycle,  
30 - BeginAt: m.BeginAt,  
31 - EndAt: m.EndAt,  
32 - NextSentAt: m.NextSentAt,  
33 - CreatedAt: m.CreatedAt,  
34 - UpdatedAt: m.UpdatedAt,  
35 - DeletedAt: m.DeletedAt, 24 + Id: m.Id,
  25 + CompanyId: m.CompanyId,
  26 + CycleId: m.CycleId,
  27 + ProjectId: m.ProjectId,
  28 + NodeId: m.NodeId,
  29 + NodeType: m.NodeType,
  30 + NodeName: m.NodeName,
  31 + NodeDescribe: m.NodeDescribe,
  32 + TimeStart: m.TimeStart,
  33 + TimeEnd: m.TimeEnd,
  34 + KpiCycle: m.KpiCycle,
  35 + NextSentAt: m.NextSentAt,
  36 + CreatedAt: m.CreatedAt,
  37 + UpdatedAt: m.UpdatedAt,
  38 + DeletedAt: m.DeletedAt,
36 } 39 }
37 } 40 }
38 41
39 func (repo *NodeTaskRepository) TransformToModel(d *domain.NodeTask) models.NodeTask { 42 func (repo *NodeTaskRepository) TransformToModel(d *domain.NodeTask) models.NodeTask {
40 return models.NodeTask{ 43 return models.NodeTask{
41 - Id: d.Id,  
42 - CompanyId: d.CompanyId,  
43 - CycleId: d.CycleId,  
44 - ProjectId: d.ProjectId,  
45 - NodeId: d.NodeId,  
46 - KpiCycle: d.KpiCycle,  
47 - BeginAt: d.BeginAt,  
48 - EndAt: d.EndAt,  
49 - NextSentAt: d.NextSentAt,  
50 - CreatedAt: d.CreatedAt,  
51 - UpdatedAt: d.UpdatedAt,  
52 - DeletedAt: d.DeletedAt, 44 + Id: d.Id,
  45 + CompanyId: d.CompanyId,
  46 + CycleId: d.CycleId,
  47 + ProjectId: d.ProjectId,
  48 + NodeId: d.NodeId,
  49 + NodeType: d.NodeType,
  50 + NodeName: d.NodeName,
  51 + NodeDescribe: d.NodeDescribe,
  52 + TimeStart: d.TimeStart,
  53 + TimeEnd: d.TimeEnd,
  54 + KpiCycle: d.KpiCycle,
  55 + NextSentAt: d.NextSentAt,
  56 + CreatedAt: d.CreatedAt,
  57 + UpdatedAt: d.UpdatedAt,
  58 + DeletedAt: d.DeletedAt,
53 } 59 }
54 } 60 }
55 61
@@ -121,6 +127,7 @@ func (repo *NodeTaskRepository) Find(queryOptions map[string]interface{}) ([]*do @@ -121,6 +127,7 @@ func (repo *NodeTaskRepository) Find(queryOptions map[string]interface{}) ([]*do
121 query := tx.Model(&m).Where("deleted_at isnull") 127 query := tx.Model(&m).Where("deleted_at isnull")
122 128
123 if v, ok := queryOptions["now"].(time.Time); ok { 129 if v, ok := queryOptions["now"].(time.Time); ok {
  130 + query.Where("next_sent_at isnull")
124 query.Where("next_sent_at <= ?", v) 131 query.Where("next_sent_at <= ?", v)
125 } 132 }
126 133