审查视图

pkg/application/node_task/node_task_service.go 5.7 KB
郑周 authored
1 2 3
package service

import (
4
	"fmt"
Your Name authored
5 6 7
	"strconv"
	"time"
tangxvhui authored
8 9
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/log"
郑周 authored
10 11
	"github.com/linmadan/egglib-go/core/application"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
郑周 authored
12 13
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/command"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/service"
郑周 authored
14
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
郑周 authored
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/utils"
)

type NodeTaskService struct {
}

func NewNodeTaskService() *NodeTaskService {
	newRoleService := &NodeTaskService{}
	return newRoleService
}

// SendEvaluationNode 发送评估环节
func (rs *NodeTaskService) SendEvaluationNode() error {
	transactionContext, err := factory.StartTransaction()
	if err != nil {
		return err
	}
	defer func() {
		transactionContext.RollbackTransaction()
34
郑周 authored
35 36 37
		if err := recover(); err != nil {
			log.Logger.Error(application.ThrowError(application.BUSINESS_ERROR, fmt.Sprintf("定时发送评估任务异常:%s", err)).Error())
		}
郑周 authored
38 39 40 41 42 43
	}()
	taskRepository := factory.CreateNodeTaskRepository(map[string]interface{}{"transactionContext": transactionContext})
	tasks, err := taskRepository.Find(map[string]interface{}{"now": time.Now().Local()})
	if err != nil {
		return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
郑周 authored
44 45 46 47 48
	if len(tasks) == 0 {
		return nil
	}
	projectRepository := factory.CreateEvaluationProjectRepository(map[string]interface{}{"transactionContext": transactionContext})
	cycleRepository := factory.CreateEvaluationCycleRepository(map[string]interface{}{"transactionContext": transactionContext})
郑周 authored
49
郑周 authored
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
	projectIdsMap := map[int64]*domain.EvaluationProject{}
	cycleIdsMap := map[int64]*domain.EvaluationCycle{}
	for i := range tasks {
		task := tasks[i]
		projectIdsMap[task.ProjectId] = nil
		cycleIdsMap[task.CycleId] = nil
	}
	projectIds := make([]int64, 0)
	cycleIds := make([]int64, 0)
	for k := range projectIdsMap {
		projectIds = append(projectIds, k)
	}
	for k := range cycleIdsMap {
		cycleIds = append(cycleIds, k)
	}
郑周 authored
66 67 68 69 70
	_, projects, err := projectRepository.Find(map[string]interface{}{"ids": projectIds}, "template")
	if err != nil {
		return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	_, cycles, err := cycleRepository.Find(map[string]interface{}{"ids": cycleIds})
郑周 authored
71 72 73
	if err != nil {
		return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
郑周 authored
74
郑周 authored
75 76 77
	for i := range projects {
		projectIdsMap[projects[i].Id] = projects[i]
	}
郑周 authored
78 79 80
	for i := range cycles {
		cycleIdsMap[cycles[i].Id] = cycles[i]
	}
郑周 authored
81
郑周 authored
82
	staffAssessService := service.NewStaffAssessServeice()
83 84

	now := time.Now().Local()
郑周 authored
85 86
	for i := range tasks {
		task := tasks[i]
87 88
		project, ok := projectIdsMap[task.ProjectId] // 项目
		if ok && project != nil {
郑周 authored
89
			// 环节截止时间
郑周 authored
90
			maxTime := task.TimeEnd.Local()
郑周 authored
91
92 93 94
			// 更新任务最后一次的发送时间(取当前时间)
			task.LastSentAt = &now
郑周 authored
95
			// 当前周起始时间和截止时间
96
			var cycleTimeStart = task.NextSentAt.Local()
郑周 authored
97
			var cycleTimeEnd time.Time
郑周 authored
98 99

			// 下个周期起始时间
郑周 authored
100
			nextTime := utils.NextTimeInc(cycleTimeStart, task.KpiCycle)
郑周 authored
101 102 103 104 105 106 107
			// 超过截止时间
			if nextTime.After(maxTime) {
				task.NextSentAt = nil
			} else {
				task.NextSentAt = &nextTime
			}
108
			// 周期的截至时间=下一个周期的开始时间-1秒(需求方要求提交数据时间延长到第二天8点30分截止)
郑周 authored
109
			if task.NextSentAt == nil {
110 111 112 113
				//cycleTimeEnd = maxTime
				maxYear, maxMonth, maxDay := maxTime.Date()
				cycleTimeEnd = time.Date(maxYear, maxMonth, maxDay, 0, 0, 0, 0, time.Local)
				cycleTimeEnd = cycleTimeEnd.Add(24*time.Hour + 8*time.Hour + 30*time.Minute) // 注.延长8.5小时
郑周 authored
114
			} else {
115 116
				//cycleTimeEnd = task.NextSentAt.Local().Add(-1 * time.Second) // 周期截至时间=下一个周期起始时间-1秒
				cycleTimeEnd = task.NextSentAt.Local().Add(8*time.Hour + 30*time.Minute) // 注.延长8.5小时
郑周 authored
117 118 119
			}

			// 格式化周期的起始和截止时间
郑周 authored
120 121
			fmCycleStartTime := cycleTimeStart.Format("2006-01-02 15:04:05")
			fmCycleTimeEnd := cycleTimeEnd.Format("2006-01-02 15:04:05")
郑周 authored
122
郑周 authored
123 124 125 126 127 128 129 130 131 132 133
			csat := &command.CreateStaffAssessTask{
				CompanyId:             int(project.CompanyId),
				EvaluationProjectId:   int(project.Id),
				EvaluationProjectName: project.Name,
				CycleId:               project.CycleId,
				StepList:              make([]command.AssessTaskStep, 0),
			}

			// 周期名称
			if cycle, ok := cycleIdsMap[project.CycleId]; ok {
				csat.CycleName = cycle.Name
郑周 authored
134 135
			}
郑周 authored
136 137 138 139 140
			// 接收人
			csat.ExecutorId = make([]int, 0)
			for rIndex := range project.Recipients {
				vInt, _ := strconv.Atoi(project.Recipients[rIndex])
				csat.ExecutorId = append(csat.ExecutorId, vInt)
郑周 authored
141
			}
郑周 authored
142 143 144

			csat.BeginTime = fmCycleStartTime
			csat.EndTime = fmCycleTimeEnd
郑周 authored
145
			csat.StepList = append(csat.StepList, command.AssessTaskStep{
郑周 authored
146
				SortBy:       task.NodeSort,
郑周 authored
147 148 149 150 151 152
				LinkNodeId:   int(task.NodeId),
				LinkNodeName: task.NodeName,
				LinkNodeType: task.NodeType,
				BeginTime:    fmCycleStartTime,
				EndTime:      fmCycleTimeEnd,
			})
郑周 authored
153 154 155 156

			// 创建发送任务
			_, err := staffAssessService.CreateStaffAssessTask(transactionContext, csat)
			if err != nil {
tangxvhui authored
157
				return application.ThrowError(application.INTERNAL_SERVER_ERROR, "创建发送任务"+err.Error())
郑周 authored
158
			}
郑周 authored
159
		} else {
郑周 authored
160
			task.NextSentAt = nil // 项目不存在,取消周期任务发送
郑周 authored
161
		}
郑周 authored
162
郑周 authored
163 164 165 166 167 168 169 170 171 172 173 174 175
		task, err := taskRepository.Insert(task)
		if err != nil {
			return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
		}
	}

	if err := transactionContext.CommitTransaction(); err != nil {
		return application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}

	return nil

}