...
|
...
|
@@ -135,110 +135,169 @@ func (rs *EvaluationProjectService) UpdateTemplate(in *command.UpdateProjectTemp |
|
|
cycleRepository := factory.CreateEvaluationCycleRepository(map[string]interface{}{"transactionContext": transactionContext})
|
|
|
cycleTemplateRepository := factory.CreateEvaluationCycleTemplateRepository(map[string]interface{}{"transactionContext": transactionContext})
|
|
|
|
|
|
_, projects, err := projectRepository.Find(map[string]interface{}{"companyId": in.CompanyId, "cycleId": in.CycleId}, "template")
|
|
|
project, err := projectRepository.FindOne(map[string]interface{}{"id": in.Id})
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
|
|
|
cycle, err := cycleRepository.FindOne(map[string]interface{}{"id": in.CycleId})
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
// 如果是已经启用的项目,只能编辑环节的截至时间
|
|
|
if project.State == domain.ProjectStateEnable {
|
|
|
end, err := time.ParseInLocation("2006-01-02 15:04:05", in.TimeEnd, time.Local)
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
|
|
|
// 周期内的所有项目,员工不能重复被评估
|
|
|
rids := map[string]bool{}
|
|
|
for i := range projects {
|
|
|
// 排除当前项目
|
|
|
if in.Id != projects[i].Id {
|
|
|
ids := projects[i].Recipients
|
|
|
for j := range ids {
|
|
|
rids[ids[j]] = true
|
|
|
cycle, err := cycleRepository.FindOne(map[string]interface{}{"id": in.CycleId})
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
maxTime := cycle.TimeEnd.Local()
|
|
|
if end.After(maxTime) {
|
|
|
return nil, application.ThrowError(application.BUSINESS_ERROR, "评估截至时间不能超出周期截至时间")
|
|
|
}
|
|
|
if project.Template != nil {
|
|
|
for i := range project.Template.LinkNodes {
|
|
|
node := project.Template.LinkNodes[i]
|
|
|
node.TimeEnd = &end
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
repeatNum := 0
|
|
|
for i := range in.Recipients {
|
|
|
id := in.Recipients[i]
|
|
|
if _, ok := rids[id]; ok {
|
|
|
repeatNum++
|
|
|
// 项目起始截止时间(暂时环节中的时间未分开)
|
|
|
project.EndTime = end
|
|
|
project, err = projectRepository.Insert(project)
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
}
|
|
|
if repeatNum > 0 {
|
|
|
return nil, application.ThrowError(application.BUSINESS_ERROR, fmt.Sprintf("有%d人已经在本周期其他项目内,需要将他们移除", repeatNum))
|
|
|
}
|
|
|
|
|
|
project, err := projectRepository.FindOne(map[string]interface{}{"id": in.Id})
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
// 查看任务过程,重新日计算任务截至期
|
|
|
taskRepository := factory.CreateNodeTaskRepository(map[string]interface{}{"transactionContext": transactionContext})
|
|
|
tasks, err := taskRepository.Find(map[string]interface{}{"projectId": in.Id})
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
|
|
|
cycleTemplate, err := cycleTemplateRepository.FindOne(map[string]interface{}{"id": in.TemplateId, "includeDeleted": true})
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
now := time.Now().Local()
|
|
|
nowO := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local) // 当前时间0点0分0秒时刻
|
|
|
|
|
|
for i := range tasks {
|
|
|
task := tasks[i]
|
|
|
task.TimeEnd = &end
|
|
|
|
|
|
// 重新计算
|
|
|
if task.NextSentAt == nil {
|
|
|
// 环节起始和截止本地时间
|
|
|
startLocal := task.TimeStart.Local()
|
|
|
endLocal := task.TimeEnd.Local()
|
|
|
|
|
|
// 在当前时间之前,则计算下一个周期时间
|
|
|
if startLocal.Before(now) {
|
|
|
nextTime := utils.NextTime(nowO, startLocal, task.KpiCycle)
|
|
|
task.NextSentAt = &nextTime
|
|
|
} else {
|
|
|
task.NextSentAt = &startLocal
|
|
|
}
|
|
|
// 如果超出截至时间,则周期置空
|
|
|
if task.NextSentAt.After(endLocal) {
|
|
|
task.NextSentAt = nil
|
|
|
}
|
|
|
} else {
|
|
|
// 新的截止时间在下一次发送周期任务之前,则结束
|
|
|
if end.Before(task.NextSentAt.Local()) {
|
|
|
task.NextSentAt = nil
|
|
|
} else {
|
|
|
// do nothing
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if cycleTemplate == nil || cycleTemplate.Template == nil {
|
|
|
return nil, application.ThrowError(application.BUSINESS_ERROR, "请添加模板")
|
|
|
}
|
|
|
if err := transactionContext.CommitTransaction(); err != nil {
|
|
|
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
|
|
|
}
|
|
|
return project, nil
|
|
|
|
|
|
if len(in.Recipients) == 0 {
|
|
|
return nil, application.ThrowError(application.BUSINESS_ERROR, "请添加被评估人")
|
|
|
}
|
|
|
} else {
|
|
|
_, projects, err := projectRepository.Find(map[string]interface{}{"companyId": in.CompanyId, "cycleId": in.CycleId}, "template")
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
// 周期内的所有项目,员工不能重复被评估
|
|
|
rids := map[string]bool{}
|
|
|
for i := range projects {
|
|
|
// 排除当前项目
|
|
|
if in.Id != projects[i].Id {
|
|
|
ids := projects[i].Recipients
|
|
|
for j := range ids {
|
|
|
rids[ids[j]] = true
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
repeatNum := 0
|
|
|
for i := range in.Recipients {
|
|
|
id := in.Recipients[i]
|
|
|
if _, ok := rids[id]; ok {
|
|
|
repeatNum++
|
|
|
}
|
|
|
}
|
|
|
if repeatNum > 0 {
|
|
|
return nil, application.ThrowError(application.BUSINESS_ERROR, fmt.Sprintf("有%d人已经在本周期其他项目内,需要将他们移除", repeatNum))
|
|
|
}
|
|
|
|
|
|
start, err := time.ParseInLocation("2006-01-02 15:04:05", in.TimeStart, time.Local)
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
end, err := time.ParseInLocation("2006-01-02 15:04:05", in.TimeEnd, time.Local)
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
kpiStart, err := time.ParseInLocation("2006-01-02 15:04:05", in.KpiResultStart, time.Local)
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
cycleTemplate, err := cycleTemplateRepository.FindOne(map[string]interface{}{"id": in.TemplateId, "includeDeleted": true})
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
if cycleTemplate == nil || cycleTemplate.Template == nil {
|
|
|
return nil, application.ThrowError(application.BUSINESS_ERROR, "请添加模板")
|
|
|
}
|
|
|
|
|
|
minTime := cycle.TimeStart.Local()
|
|
|
maxTime := cycle.TimeEnd.Local()
|
|
|
start, err := time.ParseInLocation("2006-01-02 15:04:05", in.TimeStart, time.Local)
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
end, err := time.ParseInLocation("2006-01-02 15:04:05", in.TimeEnd, time.Local)
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
|
|
|
if start.Before(minTime) {
|
|
|
return nil, application.ThrowError(application.BUSINESS_ERROR, "评估起始时间不能超出周期起始时间")
|
|
|
}
|
|
|
cycle, err := cycleRepository.FindOne(map[string]interface{}{"id": in.CycleId})
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
minTime := cycle.TimeStart.Local()
|
|
|
maxTime := cycle.TimeEnd.Local()
|
|
|
|
|
|
if end.After(maxTime) {
|
|
|
return nil, application.ThrowError(application.BUSINESS_ERROR, "评估截至时间不能超出周期截至时间")
|
|
|
}
|
|
|
if start.Before(minTime) {
|
|
|
return nil, application.ThrowError(application.BUSINESS_ERROR, "评估起始时间不能超出周期起始时间")
|
|
|
}
|
|
|
|
|
|
//// FIXME 启动时,需要激活定时任务
|
|
|
//if in.Activate == 1 {
|
|
|
// project.State = domain.ProjectStateEnable
|
|
|
//} else {
|
|
|
// project.State = domain.ProjectStateWaitActive
|
|
|
//}
|
|
|
project.State = domain.ProjectStateWaitActive
|
|
|
if end.After(maxTime) {
|
|
|
return nil, application.ThrowError(application.BUSINESS_ERROR, "评估截至时间不能超出周期截至时间")
|
|
|
}
|
|
|
|
|
|
project.Recipients = in.Recipients
|
|
|
project.Template = cycleTemplate.Template
|
|
|
for i := range project.Template.LinkNodes {
|
|
|
node := project.Template.LinkNodes[i]
|
|
|
node.KpiCycle = in.KpiCycle // 设置周期
|
|
|
if node.Type == domain.LinkNodeViewResult {
|
|
|
node.TimeStart = &kpiStart
|
|
|
node.TimeEnd = &maxTime // 绩效查看时间跟随周期截止时间
|
|
|
} else {
|
|
|
if project.State == domain.ProjectStateWaitConfig {
|
|
|
project.State = domain.ProjectStateWaitActive
|
|
|
}
|
|
|
project.Recipients = in.Recipients
|
|
|
project.Template = cycleTemplate.Template
|
|
|
|
|
|
// 项目起始截止时间(环节中的时间暂未分开计算)
|
|
|
project.BeginTime = start
|
|
|
project.EndTime = end
|
|
|
for i := range project.Template.LinkNodes {
|
|
|
node := project.Template.LinkNodes[i]
|
|
|
node.KpiCycle = in.KpiCycle // 设置周期
|
|
|
node.TimeStart = &start
|
|
|
node.TimeEnd = &end
|
|
|
}
|
|
|
}
|
|
|
|
|
|
project, err = projectRepository.Insert(project)
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
if err := transactionContext.CommitTransaction(); err != nil {
|
|
|
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
|
|
|
project, err = projectRepository.Insert(project)
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
if err := transactionContext.CommitTransaction(); err != nil {
|
|
|
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
|
|
|
}
|
|
|
return project, nil
|
|
|
}
|
|
|
return project, nil
|
|
|
}
|
|
|
|
|
|
func (rs *EvaluationProjectService) Get(in *command.GetProjectCommand) (interface{}, error) {
|
...
|
...
|
@@ -285,6 +344,7 @@ func (rs *EvaluationProjectService) Remove(in *command.DeleteProjectCommand) (in |
|
|
}()
|
|
|
|
|
|
projectRepository := factory.CreateEvaluationProjectRepository(map[string]interface{}{"transactionContext": transactionContext})
|
|
|
taskRepository := factory.CreateNodeTaskRepository(map[string]interface{}{"transactionContext": transactionContext})
|
|
|
|
|
|
project, err := projectRepository.FindOne(map[string]interface{}{"id": in.Id})
|
|
|
if err != nil {
|
...
|
...
|
@@ -294,6 +354,17 @@ func (rs *EvaluationProjectService) Remove(in *command.DeleteProjectCommand) (in |
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
|
|
|
// 查看任务过程,移除项目关联的所有任务
|
|
|
tasks, err := taskRepository.Find(map[string]interface{}{"projectId": in.Id})
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
for i := range tasks {
|
|
|
if _, err := taskRepository.Remove(tasks[i]); err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if err := transactionContext.CommitTransaction(); err != nil {
|
|
|
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
|
|
|
}
|
...
|
...
|
@@ -314,6 +385,8 @@ func (rs *EvaluationProjectService) List(in *command.QueryProjectCommand) (inter |
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
|
|
|
now := time.Now().Unix()
|
|
|
pmpUsers := make([]*domain.User, 0)
|
|
|
pmpUserIds := make([]int64, 0)
|
|
|
for i := range projects {
|
...
|
...
|
@@ -322,7 +395,13 @@ func (rs *EvaluationProjectService) List(in *command.QueryProjectCommand) (inter |
|
|
userId, _ := strconv.ParseInt(project.PmpIds[j], 10, 64)
|
|
|
pmpUserIds = append(pmpUserIds, userId)
|
|
|
}
|
|
|
|
|
|
// 当前时间超过截至时间显示【已结束】
|
|
|
if now > project.EndTime.Unix() {
|
|
|
project.State = domain.ProjectStateDisable
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if len(pmpUserIds) > 0 {
|
|
|
userRepository := factory.CreateUserRepository(map[string]interface{}{"transactionContext": transactionContext})
|
|
|
_, users, _ := userRepository.Find(map[string]interface{}{"ids": pmpUserIds, "limit": len(pmpUserIds)})
|
...
|
...
|
@@ -342,29 +421,20 @@ func (rs *EvaluationProjectService) Activate(in *command.ActivateProjectCommand) |
|
|
}()
|
|
|
|
|
|
projectRepository := factory.CreateEvaluationProjectRepository(map[string]interface{}{"transactionContext": transactionContext})
|
|
|
//cycleRepository := factory.CreateEvaluationCycleRepository(map[string]interface{}{"transactionContext": transactionContext})
|
|
|
|
|
|
project, err := projectRepository.FindOne(map[string]interface{}{"id": in.Id})
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
|
|
|
if project.Template == nil {
|
|
|
return nil, application.ThrowError(application.BUSINESS_ERROR, "请添加评估模板")
|
|
|
}
|
|
|
|
|
|
if len(project.Recipients) == 0 {
|
|
|
return nil, application.ThrowError(application.BUSINESS_ERROR, "请添加被评估人")
|
|
|
}
|
|
|
if project.State == domain.TemplateStateEnable {
|
|
|
return nil, application.ThrowError(application.BUSINESS_ERROR, "项目已启动")
|
|
|
}
|
|
|
//cycle, err := cycleRepository.FindOne(map[string]interface{}{"id": project.CycleId})
|
|
|
//if err != nil {
|
|
|
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
//}
|
|
|
//startMin := cycle.TimeStart
|
|
|
//maxTime := cycle.TimeEnd
|
|
|
|
|
|
project.State = domain.TemplateStateEnable
|
|
|
project, err = projectRepository.Insert(project)
|
...
|
...
|
@@ -422,42 +492,6 @@ func (rs *EvaluationProjectService) Activate(in *command.ActivateProjectCommand) |
|
|
return project, nil
|
|
|
}
|
|
|
|
|
|
//
|
|
|
//// 0点时刻为标准计算
|
|
|
//func (rs *EvaluationProjectService) nextTime(now0 time.Time, start *time.Time, kpiCycle int) time.Time {
|
|
|
// // 起始时间0点时刻
|
|
|
// start0 := time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, time.Local)
|
|
|
//
|
|
|
// var nextTime time.Time
|
|
|
// switch kpiCycle {
|
|
|
// case domain.KpiCycleDay:
|
|
|
// nextTime = timeconv.AddDate(now0, 0, 0, 1) // 当前时间的下一天开始发送
|
|
|
// break
|
|
|
// case domain.KpiCycleWeek:
|
|
|
// offsetSeconds := int64(now0.Sub(start0).Seconds())
|
|
|
// offsetDay := offsetSeconds / (24 * 60 * 60)
|
|
|
// cycleCount := int(offsetDay)/7 + 1
|
|
|
// nextTime = timeconv.AddDate(start0, 0, 0, cycleCount*7)
|
|
|
// break
|
|
|
// case domain.KpiCycleOneMonth:
|
|
|
// nextTime = timeconv.AddDate(start0, 0, 1, 0)
|
|
|
// break
|
|
|
// case domain.KpiCycleTwoMonth:
|
|
|
// nextTime = timeconv.AddDate(start0, 0, 2, 0)
|
|
|
// break
|
|
|
// case domain.KpiCycleThreeMonth:
|
|
|
// nextTime = timeconv.AddDate(start0, 0, 3, 0)
|
|
|
// break
|
|
|
// case domain.KpiCycleSixMonth:
|
|
|
// nextTime = timeconv.AddDate(start0, 0, 6, 0)
|
|
|
// break
|
|
|
// case domain.KpiCycleYear:
|
|
|
// nextTime = timeconv.AddDate(start0, 1, 0, 0)
|
|
|
// break
|
|
|
// }
|
|
|
// return nextTime
|
|
|
//}
|
|
|
|
|
|
func (rs *EvaluationProjectService) Copy(in *command.CopyProjectCommand) (interface{}, error) {
|
|
|
transactionContext, err := factory.ValidateStartTransaction(in)
|
|
|
if err != nil {
|
...
|
...
|
|