作者 郑周

增加环节顺序,

消息发送优化
@@ -177,13 +177,13 @@ func (rs *EvaluationProjectService) UpdateTemplate(in *command.UpdateProjectTemp @@ -177,13 +177,13 @@ func (rs *EvaluationProjectService) UpdateTemplate(in *command.UpdateProjectTemp
177 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 177 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
178 } 178 }
179 179
180 - // FIXME 启动时,需要激活定时任务  
181 - if in.Activate == 1 { 180 + if cycleTemplate == nil || cycleTemplate.Template == nil {
  181 + return nil, application.ThrowError(application.BUSINESS_ERROR, "请添加模板")
  182 + }
  183 +
182 if len(in.Recipients) == 0 { 184 if len(in.Recipients) == 0 {
183 return nil, application.ThrowError(application.BUSINESS_ERROR, "请添加被评估人") 185 return nil, application.ThrowError(application.BUSINESS_ERROR, "请添加被评估人")
184 } 186 }
185 - project.State = domain.ProjectStateEnable  
186 - }  
187 187
188 start, err := time.ParseInLocation("2006-01-02 15:04:05", in.TimeStart, time.Local) 188 start, err := time.ParseInLocation("2006-01-02 15:04:05", in.TimeStart, time.Local)
189 if err != nil { 189 if err != nil {
@@ -209,6 +209,14 @@ func (rs *EvaluationProjectService) UpdateTemplate(in *command.UpdateProjectTemp @@ -209,6 +209,14 @@ func (rs *EvaluationProjectService) UpdateTemplate(in *command.UpdateProjectTemp
209 return nil, application.ThrowError(application.BUSINESS_ERROR, "评估截至时间不能超出周期截至时间") 209 return nil, application.ThrowError(application.BUSINESS_ERROR, "评估截至时间不能超出周期截至时间")
210 } 210 }
211 211
  212 + //// FIXME 启动时,需要激活定时任务
  213 + //if in.Activate == 1 {
  214 + // project.State = domain.ProjectStateEnable
  215 + //} else {
  216 + // project.State = domain.ProjectStateWaitActive
  217 + //}
  218 + project.State = domain.ProjectStateWaitActive
  219 +
212 project.Recipients = in.Recipients 220 project.Recipients = in.Recipients
213 project.Template = cycleTemplate.Template 221 project.Template = cycleTemplate.Template
214 for i := range project.Template.LinkNodes { 222 for i := range project.Template.LinkNodes {
@@ -348,7 +356,9 @@ func (rs *EvaluationProjectService) Activate(in *command.ActivateProjectCommand) @@ -348,7 +356,9 @@ func (rs *EvaluationProjectService) Activate(in *command.ActivateProjectCommand)
348 if len(project.Recipients) == 0 { 356 if len(project.Recipients) == 0 {
349 return nil, application.ThrowError(application.BUSINESS_ERROR, "请添加被评估人") 357 return nil, application.ThrowError(application.BUSINESS_ERROR, "请添加被评估人")
350 } 358 }
351 - 359 + if project.State == domain.TemplateStateEnable {
  360 + return nil, application.ThrowError(application.BUSINESS_ERROR, "项目已启动")
  361 + }
352 //cycle, err := cycleRepository.FindOne(map[string]interface{}{"id": project.CycleId}) 362 //cycle, err := cycleRepository.FindOne(map[string]interface{}{"id": project.CycleId})
353 //if err != nil { 363 //if err != nil {
354 // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 364 // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
@@ -378,6 +388,7 @@ func (rs *EvaluationProjectService) Activate(in *command.ActivateProjectCommand) @@ -378,6 +388,7 @@ func (rs *EvaluationProjectService) Activate(in *command.ActivateProjectCommand)
378 NodeType: node.Type, 388 NodeType: node.Type,
379 NodeName: node.Name, 389 NodeName: node.Name,
380 NodeDescribe: node.Describe, 390 NodeDescribe: node.Describe,
  391 + NodeSort: i + 1,
381 TimeStart: node.TimeStart, 392 TimeStart: node.TimeStart,
382 TimeEnd: node.TimeEnd, 393 TimeEnd: node.TimeEnd,
383 KpiCycle: node.KpiCycle, 394 KpiCycle: node.KpiCycle,
@@ -39,9 +39,6 @@ func (rs *NodeTaskService) SendEvaluationNode() error { @@ -39,9 +39,6 @@ func (rs *NodeTaskService) SendEvaluationNode() error {
39 projectRepository := factory.CreateEvaluationProjectRepository(map[string]interface{}{"transactionContext": transactionContext}) 39 projectRepository := factory.CreateEvaluationProjectRepository(map[string]interface{}{"transactionContext": transactionContext})
40 cycleRepository := factory.CreateEvaluationCycleRepository(map[string]interface{}{"transactionContext": transactionContext}) 40 cycleRepository := factory.CreateEvaluationCycleRepository(map[string]interface{}{"transactionContext": transactionContext})
41 41
42 - //ttaffAssessRepository := factory.CreateStaffAssessTaskRepository(map[string]interface{}{"transactionContext": transactionContext})  
43 - //  
44 -  
45 projectIdsMap := map[int64]*domain.EvaluationProject{} 42 projectIdsMap := map[int64]*domain.EvaluationProject{}
46 cycleIdsMap := map[int64]*domain.EvaluationCycle{} 43 cycleIdsMap := map[int64]*domain.EvaluationCycle{}
47 for i := range tasks { 44 for i := range tasks {
@@ -74,7 +71,7 @@ func (rs *NodeTaskService) SendEvaluationNode() error { @@ -74,7 +71,7 @@ func (rs *NodeTaskService) SendEvaluationNode() error {
74 cycleIdsMap[cycles[i].Id] = cycles[i] 71 cycleIdsMap[cycles[i].Id] = cycles[i]
75 } 72 }
76 73
77 - staffAssessTaskMap := map[int64]*command.CreateStaffAssessTask{} 74 + staffAssessService := service.NewStaffAssessServeice()
78 for i := range tasks { 75 for i := range tasks {
79 task := tasks[i] 76 task := tasks[i]
80 // 项目 77 // 项目
@@ -108,13 +105,12 @@ func (rs *NodeTaskService) SendEvaluationNode() error { @@ -108,13 +105,12 @@ func (rs *NodeTaskService) SendEvaluationNode() error {
108 fmCycleStartTime := cycleTimeStart.Format("2006-1-2 15:04:05") 105 fmCycleStartTime := cycleTimeStart.Format("2006-1-2 15:04:05")
109 fmCycleTimeEnd := cycleTimeEnd.Format("2006-1-2 15:04:05") 106 fmCycleTimeEnd := cycleTimeEnd.Format("2006-1-2 15:04:05")
110 107
111 - var csat, staffOk = staffAssessTaskMap[task.ProjectId]  
112 - if !staffOk {  
113 - csat = &command.CreateStaffAssessTask{ 108 + csat := &command.CreateStaffAssessTask{
114 CompanyId: int(project.CompanyId), 109 CompanyId: int(project.CompanyId),
115 EvaluationProjectId: int(project.Id), 110 EvaluationProjectId: int(project.Id),
116 EvaluationProjectName: project.Name, 111 EvaluationProjectName: project.Name,
117 CycleId: project.CycleId, 112 CycleId: project.CycleId,
  113 + StepList: make([]command.AssessTaskStep, 0),
118 } 114 }
119 115
120 // 周期名称 116 // 周期名称
@@ -129,38 +125,27 @@ func (rs *NodeTaskService) SendEvaluationNode() error { @@ -129,38 +125,27 @@ func (rs *NodeTaskService) SendEvaluationNode() error {
129 csat.ExecutorId = append(csat.ExecutorId, vInt) 125 csat.ExecutorId = append(csat.ExecutorId, vInt)
130 } 126 }
131 127
132 - // FIXME 这里设置时间可能会有歧义,目前原型设计时间均一致,所以直接选取第一个获取到的周期时间,作为本周期的起止和截止时间  
133 csat.BeginTime = fmCycleStartTime 128 csat.BeginTime = fmCycleStartTime
134 csat.EndTime = fmCycleTimeEnd 129 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{ 130 csat.StepList = append(csat.StepList, command.AssessTaskStep{
143 - SortBy: i, 131 + SortBy: task.NodeSort,
144 LinkNodeId: int(task.NodeId), 132 LinkNodeId: int(task.NodeId),
145 LinkNodeName: task.NodeName, 133 LinkNodeName: task.NodeName,
146 LinkNodeType: task.NodeType, 134 LinkNodeType: task.NodeType,
147 BeginTime: fmCycleStartTime, 135 BeginTime: fmCycleStartTime,
148 EndTime: fmCycleTimeEnd, 136 EndTime: fmCycleTimeEnd,
149 }) 137 })
150 - } else {  
151 - task.NextSentAt = nil  
152 - }  
153 138
154 - task, err := taskRepository.Insert(task) 139 + // 创建发送任务
  140 + _, err := staffAssessService.CreateStaffAssessTask(transactionContext, csat)
155 if err != nil { 141 if err != nil {
156 return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 142 return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
157 } 143 }
  144 + } else {
  145 + task.NextSentAt = nil // 项目不存在,取消周期任务发送
158 } 146 }
159 147
160 - staffAssessService := service.NewStaffAssessServeice()  
161 - for i := range staffAssessTaskMap {  
162 - staffAssessTask := staffAssessTaskMap[i]  
163 - _, err := staffAssessService.CreateStaffAssessTask(transactionContext, staffAssessTask) 148 + task, err := taskRepository.Insert(task)
164 if err != nil { 149 if err != nil {
165 return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 150 return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
166 } 151 }
@@ -13,6 +13,7 @@ type NodeTask struct { @@ -13,6 +13,7 @@ type NodeTask struct {
13 NodeType int `json:"nodeType" comment:"环节类型"` 13 NodeType int `json:"nodeType" comment:"环节类型"`
14 NodeName string `json:"nodeName" comment:"环节名称"` 14 NodeName string `json:"nodeName" comment:"环节名称"`
15 NodeDescribe string `json:"nodeDescribe" comment:"环节描述"` 15 NodeDescribe string `json:"nodeDescribe" comment:"环节描述"`
  16 + NodeSort int `json:"nodeSort" comment:"环节顺序"`
16 TimeStart *time.Time `json:"timeStart" comment:"起始时间"` 17 TimeStart *time.Time `json:"timeStart" comment:"起始时间"`
17 TimeEnd *time.Time `json:"timeEnd" comment:"截至时间"` 18 TimeEnd *time.Time `json:"timeEnd" comment:"截至时间"`
18 KpiCycle int `json:"kpiCycle" comment:"考核周期(1日、2周、3月)"` 19 KpiCycle int `json:"kpiCycle" comment:"考核周期(1日、2周、3月)"`
@@ -14,6 +14,7 @@ type NodeTask struct { @@ -14,6 +14,7 @@ type NodeTask struct {
14 NodeType int `comment:"环节类型"` 14 NodeType int `comment:"环节类型"`
15 NodeName string `comment:"环节名称"` 15 NodeName string `comment:"环节名称"`
16 NodeDescribe string `comment:"环节描述"` 16 NodeDescribe string `comment:"环节描述"`
  17 + NodeSort int `comment:"环节顺序"`
17 TimeStart *time.Time `comment:"起始时间"` 18 TimeStart *time.Time `comment:"起始时间"`
18 TimeEnd *time.Time `comment:"截至时间"` 19 TimeEnd *time.Time `comment:"截至时间"`
19 KpiCycle int `comment:"考核周期(1日、2周、3月)"` 20 KpiCycle int `comment:"考核周期(1日、2周、3月)"`
@@ -123,6 +123,10 @@ func (repo *EvaluationCycleRepository) Find(queryOptions map[string]interface{}) @@ -123,6 +123,10 @@ func (repo *EvaluationCycleRepository) Find(queryOptions map[string]interface{})
123 query.Where("name LIKE ?", v) 123 query.Where("name LIKE ?", v)
124 } 124 }
125 125
  126 + if v, ok := queryOptions["ids"]; ok {
  127 + query.Where("id in (?)", pg.In(v))
  128 + }
  129 +
126 if v, ok := queryOptions["companyId"]; ok { 130 if v, ok := queryOptions["companyId"]; ok {
127 query.Where("company_id = ?", v) 131 query.Where("company_id = ?", v)
128 } 132 }
@@ -131,6 +131,10 @@ func (repo *EvaluationProjectRepository) Find(queryOptions map[string]interface{ @@ -131,6 +131,10 @@ func (repo *EvaluationProjectRepository) Find(queryOptions map[string]interface{
131 query.ExcludeColumn(excludeColumns...) 131 query.ExcludeColumn(excludeColumns...)
132 } 132 }
133 133
  134 + if v, ok := queryOptions["ids"]; ok {
  135 + query.Where("id in (?)", pg.In(v))
  136 + }
  137 +
134 if v, ok := queryOptions["name"].(string); ok && len(v) > 0 { 138 if v, ok := queryOptions["name"].(string); ok && len(v) > 0 {
135 query.Where("name = ?", v) 139 query.Where("name = ?", v)
136 } 140 }
@@ -30,6 +30,7 @@ func (repo *NodeTaskRepository) TransformToDomain(m *models.NodeTask) domain.Nod @@ -30,6 +30,7 @@ func (repo *NodeTaskRepository) TransformToDomain(m *models.NodeTask) domain.Nod
30 NodeType: m.NodeType, 30 NodeType: m.NodeType,
31 NodeName: m.NodeName, 31 NodeName: m.NodeName,
32 NodeDescribe: m.NodeDescribe, 32 NodeDescribe: m.NodeDescribe,
  33 + NodeSort: m.NodeSort,
33 TimeStart: m.TimeStart, 34 TimeStart: m.TimeStart,
34 TimeEnd: m.TimeEnd, 35 TimeEnd: m.TimeEnd,
35 KpiCycle: m.KpiCycle, 36 KpiCycle: m.KpiCycle,
@@ -50,6 +51,7 @@ func (repo *NodeTaskRepository) TransformToModel(d *domain.NodeTask) models.Node @@ -50,6 +51,7 @@ func (repo *NodeTaskRepository) TransformToModel(d *domain.NodeTask) models.Node
50 NodeType: d.NodeType, 51 NodeType: d.NodeType,
51 NodeName: d.NodeName, 52 NodeName: d.NodeName,
52 NodeDescribe: d.NodeDescribe, 53 NodeDescribe: d.NodeDescribe,
  54 + NodeSort: d.NodeSort,
53 TimeStart: d.TimeStart, 55 TimeStart: d.TimeStart,
54 TimeEnd: d.TimeEnd, 56 TimeEnd: d.TimeEnd,
55 KpiCycle: d.KpiCycle, 57 KpiCycle: d.KpiCycle,
@@ -43,7 +43,7 @@ func NextTime(now0 time.Time, start *time.Time, kpiCycle int) time.Time { @@ -43,7 +43,7 @@ func NextTime(now0 time.Time, start *time.Time, kpiCycle int) time.Time {
43 var nextTime time.Time 43 var nextTime time.Time
44 switch kpiCycle { 44 switch kpiCycle {
45 case domain.KpiCycleDay: 45 case domain.KpiCycleDay:
46 - nextTime = timeconv.AddDate(now0, 0, 0, 1) // 当前时间的下一天开始发送 46 + nextTime = timeconv.AddDate(now0, 0, 0, 1) // 当前时间的下一天0点开始发送
47 break 47 break
48 case domain.KpiCycleWeek: 48 case domain.KpiCycleWeek:
49 offsetSeconds := int64(now0.Sub(start0).Seconds()) 49 offsetSeconds := int64(now0.Sub(start0).Seconds())