package service

import (
	"fmt"
	"strconv"

	"github.com/linmadan/egglib-go/core/application"
	"github.com/linmadan/egglib-go/utils/tool_funs"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/adapter"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/query"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/infrastructure/dao"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/log"
)

// 获取我的项目周期列表
func (srv StaffAssessServeice) SearchAssessTaskMeV2(param *query.SearchAssessMeQuery) (map[string]interface{}, error) {
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		_ = transactionContext.RollbackTransaction()
	}()

	staffAssessDao := dao.NewStaffAssessDao(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	var limit int = 360
	var offset int = 0
	if param.PageSize > 0 {
		limit = param.PageSize
	}
	offset = (param.PageNumber - 1) * param.PageSize
	// assessCycleList, err := staffAssessTaskRepo.SearchAssessCycleMe(param.UserId, param.CompanyId, limit, offset)
	// if err != nil {
	// 	return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "查询评估周期"+err.Error())
	// }
	// cnt, err := staffAssessTaskRepo.CountAssessTaskMe(param.UserId, param.CompanyId)
	// if err != nil {
	// 	return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "查询评估周期"+err.Error())
	// }

	assessCycleList, cnt, err := staffAssessDao.SearchExecutorAssessBeforeNow(param.UserId, param.CompanyId, limit, offset)
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "查询评估周期"+err.Error())
	}
	assessCycleList2, err := staffAssessDao.SearchExecutorAssessAfterNow(param.UserId, param.CompanyId)
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "查询评估周期"+err.Error())
	}
	if err := transactionContext.CommitTransaction(); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	listData := make([]adapter.AssessCycleDayResp, 0, len(assessCycleList))

	var temp adapter.AssessCycleDayResp
	for _, v := range assessCycleList2 {
		temp = adapter.AssessCycleDayResp{
			CycleId:   v.CycleId,
			CycleName: v.CycleName,
			BeginDay:  v.BeginDay,
			BeginTime: v.BeginTime,
			EndTime:   v.EndTime,
		}
		listData = append(listData, temp)
	}
	for _, v := range assessCycleList {
		temp = adapter.AssessCycleDayResp{
			CycleId:   v.CycleId,
			CycleName: v.CycleName,
			BeginDay:  v.BeginDay,
			BeginTime: v.BeginTime,
			EndTime:   v.EndTime,
		}
		listData = append(listData, temp)
	}
	return tool_funs.SimpleWrapGridMap(int64(cnt), listData), nil
}

// 获取我的项目周期进度描述
func (srv StaffAssessServeice) AssessTaskDescV2(param *query.AssessTaskDescV2Query) (*adapter.AssessCycleDescResp, error) {
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		_ = transactionContext.RollbackTransaction()
	}()
	// 获取评估任务
	staffAssessTaskRepo := factory.CreateStaffAssessTaskRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	//获取个人参与的评估流程
	staffAssessRepo := factory.CreateStaffAssessRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})

	_, assessTaskList, err := staffAssessTaskRepo.Find(map[string]interface{}{
		"beginDay":  param.BeginDay,
		"cycleId":   param.CycleId,
		"companyId": param.CompanyId,
		"limit":     1,
	})
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, "评估任务不存在,"+err.Error())
	}
	if len(assessTaskList) == 0 {
		return &adapter.AssessCycleDescResp{}, nil
	}
	assessTaskDataAny := assessTaskList[0]
	//返回的数据结果
	result := adapter.AssessCycleDescResp{
		CycleId:   int(assessTaskDataAny.CycleId),
		CycleName: assessTaskDataAny.CycleName,
		BeginDay:  assessTaskDataAny.BeginDay,
		StepList:  []adapter.AssessTaskStep{},
	}

	for _, v := range assessTaskDataAny.StepList {
		stepItem := adapter.AssessTaskStep{
			SortBy:       v.SortBy,
			LinkNodeName: v.LinkNodeName,
			LinkNodeId:   v.LinkNodeId,
			BeginTime:    v.BeginTime.Local().Format("2006-01-02 15:04:05"),
			EndTime:      v.EndTime.Local().Format("2006-01-02 15:04:05"),
			LinkNodeType: v.LinkNodeType,
			Desc:         fmt.Sprintf("截止日期:%s", v.EndTime.Local().Format("2006-01-02 15:04:05")),
			Status:       "",
		}
		switch v.LinkNodeType {
		case domain.LinkNodeSelfAssessment:
			//个人自评完成情况
			_, assessSelfData, err := staffAssessRepo.Find(map[string]interface{}{
				"cycleId":    assessTaskDataAny.CycleId,
				"beginDay":   assessTaskDataAny.BeginDay,
				"executorId": param.UserId, //我作为执行人
				"typesList":  []string{string(domain.AssessSelf)},
			})
			if err != nil {
				return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取个人的评估环节"+err.Error())
			}
			if len(assessSelfData) > 0 {
				stepItem.Status = string(assessSelfData[0].Status)
			}
			stepItem.Desc = fmt.Sprintf("截止日期:%s", stepItem.EndTime)
		case domain.LinkNodeAllInvite:
			//邀请别人评估自己
			_, assessInviteData, err := staffAssessRepo.Find(map[string]interface{}{
				"cycleId":      assessTaskDataAny.CycleId,
				"beginDay":     assessTaskDataAny.BeginDay,
				"targetUserId": param.UserId, //我被作为目标
				"typesList":    []string{string(domain.AssessInviteDiffSuper), string(domain.AssessInviteSameSuper)},
				"limit":        5,
			})
			if err != nil {
				return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取个人的评估环节"+err.Error())
			}
			if len(assessInviteData) > 0 {
				stepItem.Status = string(domain.StaffAssessCompleted)
			} else {
				stepItem.Status = string(domain.StaffAssessUncompleted)
			}
			//待邀请人数,为5人减去已邀请的人数。若邀请人数已等于或大于5人,则只显示截止日期即可
			if len(assessInviteData) > 5 {
				stepItem.Desc = fmt.Sprintf("截止日期:%s", stepItem.EndTime)
			} else {
				stepItem.Desc = fmt.Sprintf("截止日期:%s  待邀请%d人", stepItem.EndTime, 5-len(assessInviteData))
			}
		case domain.LinkNodeAllAssessment:
			//我评估别人,被邀请评估
			_, assessInviteList, err := staffAssessRepo.Find(map[string]interface{}{
				"cycleId":    assessTaskDataAny.CycleId,
				"beginDay":   assessTaskDataAny.BeginDay,
				"executorId": param.UserId, //我作为执行人
				"typesList":  []string{string(domain.AssessInviteDiffSuper), string(domain.AssessInviteSameSuper)},
			})
			if err != nil {
				return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取个人的评估环节"+err.Error())
			}
			if len(assessInviteList) > 0 {
				stepItem.Status = string(domain.StaffAssessCompleted)
				stepItem.Desc = fmt.Sprintf("截止日期:%s", stepItem.EndTime)
				for _, v := range assessInviteList {
					if v.Status == domain.StaffAssessUncompleted {
						stepItem.Status = string(domain.StaffAssessUncompleted)
						break
					}
				}
			}
		case domain.LinkNodeSuperiorAssessment:
			//我评估别人,上级评估
			cnnt, _, err := staffAssessRepo.Find(map[string]interface{}{
				"cycleId":    assessTaskDataAny.CycleId,
				"beginDay":   assessTaskDataAny.BeginDay,
				"executorId": param.UserId,
				"typesList":  []string{string(domain.AssessSuper)},
				"status":     domain.StaffAssessUncompleted,
				"limit":      1,
			})
			if err != nil {
				return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取未完成的评估环节"+err.Error())
			}
			cnnt2, _, err := staffAssessRepo.Find(map[string]interface{}{
				"cycleId":    assessTaskDataAny.CycleId,
				"beginDay":   assessTaskDataAny.BeginDay,
				"executorId": param.UserId,
				"typesList":  []string{string(domain.AssessSuper)},
				"status":     domain.StaffAssessCompleted,
				"limit":      1,
			})
			if err != nil {
				return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取已完成的评估环节"+err.Error())
			}
			if (cnnt + cnnt2) > 0 {
				stepItem.Status = string(domain.StaffAssessCompleted)
				stepItem.Desc = fmt.Sprintf("截止日期:%s", stepItem.EndTime)
				uncompletedNum := cnnt
				if uncompletedNum > 0 {
					stepItem.Status = string(domain.StaffAssessUncompleted)
					stepItem.Desc = fmt.Sprintf("截止日期:%s 待评估%d人", stepItem.EndTime, uncompletedNum)
				}
			}
		}
		result.StepList = append(result.StepList, stepItem)
	}
	if err := transactionContext.CommitTransaction(); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	return &result, nil
}

// 根据周期获取,我的自评任务添加的邀请人
func (srv StaffAssessServeice) ListAssessInviteUserV2(param *query.ListInviteUserQuery) (*adapter.AssessInviteUserResp, error) {
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		_ = transactionContext.RollbackTransaction()
	}()

	assessReps := factory.CreateStaffAssessRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	companyReps := factory.CreateCompanyRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	companyInfo, _ := companyReps.FindOne(map[string]interface{}{
		"id": param.CompanyId,
	})
	assessTaskRepo := factory.CreateStaffAssessTaskRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	_, myAssessTask, err := assessTaskRepo.Find(map[string]interface{}{
		"cycleId":    param.CycleId,
		"beginDay":   param.BeginDay,
		"executorId": param.TargetUserId,
		"limit":      1,
	})
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, "我的自评任务不存在,"+err.Error())
	}

	if len(myAssessTask) == 0 {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, "未参与本次的自评")
	}

	assessTaskData := myAssessTask[0]

	_, assessList, err := assessReps.Find(map[string]interface{}{
		"typesList":         []string{string(domain.AssessInviteDiffSuper), string(domain.AssessInviteSameSuper)},
		"staffAssessTaskId": assessTaskData.Id,
		"targetUserId":      param.TargetUserId,
	})
	if err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, "获取个人邀请列表"+err.Error())
	}
	if err := transactionContext.CommitTransaction(); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}

	result := adapter.AssessInviteUserResp{
		AssessTaskId:    assessTaskData.Id,
		InviteDiffSuper: []domain.StaffDesc{},
		InviteSameSuper: []domain.StaffDesc{},
	}
	for _, v := range assessTaskData.StepList {
		if v.LinkNodeType != domain.LinkNodeAllInvite {
			continue
		}
		result.LinkNodeId = v.LinkNodeId
		result.LinkNodeName = v.LinkNodeName
		result.BeginTime = v.BeginTime.Local().Format("2006-01-02 15:04:05")
		result.EndTime = v.EndTime.Local().Format("2006-01-02 15:04:05")
		break
	}
	companyName := ""
	if companyInfo != nil {
		companyName = companyInfo.Name
	}
	for _, v := range assessList {
		if v.Types == domain.AssessInviteDiffSuper {
			v.Executor.CompanyName = companyName
			result.InviteDiffSuper = append(result.InviteDiffSuper, v.Executor)
		}
		if v.Types == domain.AssessInviteSameSuper {
			v.Executor.CompanyName = companyName
			result.InviteSameSuper = append(result.InviteSameSuper, v.Executor)
		}
	}
	return &result, nil
}

// 根据周期和日期获取我要执行的的360评估,用户列表和评估填写的值
func (srv StaffAssessServeice) ListExecutorInviteAssessV2(param *query.ListExecutorAssessQuery) (
	*adapter.ListInviteUserAssessResp, error) {
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		_ = transactionContext.RollbackTransaction()
	}()
	//获取对应的评估任务
	assessRepo := factory.CreateStaffAssessRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	companyRepo := factory.CreateCompanyRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	companyInfo, _ := companyRepo.FindOne(map[string]interface{}{
		"id": param.CompanyId,
	})
	//获取 executorId 对应的360评估任务 用户
	condition := map[string]interface{}{
		"beginDay":   param.BeginDay,
		"cycleId":    param.CycleId,
		"executorId": param.ExecutorId,
		"typesList":  []string{string(domain.AssessInviteDiffSuper), string(domain.AssessInviteSameSuper)},
		"limit":      20,
	}
	if len(param.UserName) > 0 {
		condition["targetUserName"] = param.UserName
	}
	if param.PageSize > 0 {
		condition["limit"] = param.PageSize
	}
	offset := (param.PageNumber - 1) * param.PageSize
	if offset > 0 {
		condition["offset"] = offset
	}

	cnt, assessList, err := assessRepo.Find(condition)
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	var assessContentList []*domain.StaffAssessContent
	projectIdMap := map[int]struct{}{}
	//获取评估用的所有评估项
	for i := range assessList {
		if _, ok := projectIdMap[assessList[i].EvaluationProjectId]; ok {
			continue
		}
		projectIdMap[assessList[i].EvaluationProjectId] = struct{}{}
		assessContentListTemp, err := srv.getAssessSelfInfoUncompleted(transactionContext, assessList[i])
		if err != nil {
			return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取评估任务"+err.Error())
		}
		assessContentList = append(assessContentList, assessContentListTemp...)
	}
	//可变的表格列
	changeableHeader := []adapter.ListTableHeader{}
	//列名与字段对应
	keyMap := map[string]string{}
	for i, v := range assessContentList {
		name := fmt.Sprintf("%s-%s", v.Category, v.Name)
		key := fmt.Sprintf("k%d", i)
		if _, ok := keyMap[name]; ok {
			continue
		}
		keyMap[name] = key
		changeableHeader = append(changeableHeader, adapter.ListTableHeader{
			Key:  key,
			Name: name,
		})
	}
	assessContentRepo := factory.CreateStaffAssessContentRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	// 获取已经填报的内容
	changeableRows := map[int]map[string]string{}
	for _, v := range assessList {
		_, contentList, err := assessContentRepo.Find(map[string]interface{}{
			"staffAssessId": v.Id,
		})
		if err != nil {
			return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取评估内容"+err.Error())
		}
		row := map[string]string{}
		for _, vv := range contentList {
			name := fmt.Sprintf("%s-%s", vv.Category, vv.Name)
			if kk, ok := keyMap[name]; ok {
				row[kk] = vv.Value
			}
		}
		changeableRows[v.TargetUser.UserId] = row
	}

	//获取360邀请评估完成情况
	//我评估别人,被邀请评估
	cnnt, _, err := assessRepo.Find(map[string]interface{}{
		"beginDay":   param.BeginDay,
		"cycleId":    param.CycleId,
		"executorId": param.ExecutorId,
		"typesList":  []string{string(domain.AssessInviteDiffSuper), string(domain.AssessInviteSameSuper)},
		"status":     domain.StaffAssessUncompleted,
		"limit":      1,
	})
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取个人的评估环节"+err.Error())
	}

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

	//评估填写数据行转列
	tableHeader := []adapter.ListTableHeader{
		{Key: "userName", Name: "姓名"},
		{Key: "status", Name: "状态"},
		{Key: "types", Name: "360°评估关系"},
		{Key: "endTime", Name: "360°评估截止日期"},
	}
	tableHeader = append(tableHeader, changeableHeader...)
	listData := []map[string]interface{}{}
	companyName := ""
	if companyInfo != nil {
		companyName = companyInfo.Name
	}
	for _, v := range assessList {
		m := map[string]interface{}{
			"staffAssessTaskId": v.StaffAssessTaskId,
			"userName":          v.TargetUser.UserName,
			"userId":            strconv.Itoa(v.TargetUser.UserId),
			"status":            string(v.Status),
			"cycleId":           strconv.FormatInt(v.CycleId, 10),
			"beginDay":          v.BeginTime.Local().Format("2006-01-02"),
			"types":             string(v.Types),
			"endTime":           v.EndTime.Local().Format("2006-01-02 15:04:05"),
			"assessId":          strconv.Itoa(v.Id),
			"companyName":       companyName,
		}
		switch v.Status {
		case domain.StaffAssessCompleted:
			m["status"] = "已经完成"
		case domain.StaffAssessUncompleted:
			m["status"] = "未完成"
		}
		switch v.Types {
		case domain.AssessInviteDiffSuper:
			m["types"] = "不同上级同事"
		case domain.AssessInviteSameSuper:
			m["types"] = "相同上级同事"
		}
		if row, ok := changeableRows[v.TargetUser.UserId]; ok {
			for k, v := range row {
				m[k] = v
			}
		} else {
			for _, v := range changeableHeader {
				m[v.Key] = ""
			}
		}
		listData = append(listData, m)
	}
	result := adapter.ListInviteUserAssessResp{
		TableHeader: tableHeader,
		List:        listData,
		Total:       cnt,
	}

	if len(assessList) > 0 {
		result.BeginDay = assessList[0].BeginTime.Local().Format("2006-01-02")
		result.CycleId = int(assessList[0].CycleId)
		result.LintNodeDesc = fmt.Sprintf("截止时间 %s 待评估%d人", assessList[0].EndTime.Local().Format("2006-01-02 15:04:05"), cnnt)
	}

	return &result, nil
}

// 根据周期和日期获取我需要执行的上级评估成员列表
func (srv StaffAssessServeice) ListExecutorSupperAssessV2(param *query.ListExecutorAssessQuery) (map[string]interface{}, error) {
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		_ = transactionContext.RollbackTransaction()
	}()
	//获取对应的评估任务
	assessRepo := factory.CreateStaffAssessRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	//公司存储
	companyRepo := factory.CreateCompanyRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})

	companyInfo, _ := companyRepo.FindOne(map[string]interface{}{
		"id": param.CompanyId,
	})

	limit := 20
	if param.PageSize > 0 {
		limit = param.PageSize
	}
	condition := map[string]interface{}{
		"beginDay":   param.BeginDay,
		"cycleId":    param.CycleId,
		"executorId": param.ExecutorId,
		"typesList":  []string{string(domain.AssessSuper)},
		"limit":      limit,
	}
	if len(param.UserName) > 0 {
		condition["targetUserName"] = param.UserName
	}
	offset := (param.PageNumber - 1) * param.PageSize
	if offset > 0 {
		condition["offset"] = offset
	}
	//获取 executorId 对应的上级评估列表
	cnt, assessList, err := assessRepo.Find(condition)
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}

	//获取目标用户
	userIds := []int{}
	for _, v := range assessList {
		userIds = append(userIds, v.TargetUser.UserId)
	}
	//获取员工信息
	userRepo := factory.CreateUserRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	var targetUserList []*domain.User
	if len(userIds) > 0 {
		_, targetUserList, _ = userRepo.Find(map[string]interface{}{
			"ids": userIds,
		})
	}
	//获取职位信息
	positionRepo := factory.CreatePositionRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	//获取员工的职位
	userPositionMap := map[int64][]*domain.Position{}
	for _, v := range targetUserList {
		if len(v.PositionId) == 0 {
			continue
		}
		_, positionList, _ := positionRepo.Find(map[string]interface{}{
			"ids": v.PositionId,
		})
		userPositionMap[v.Id] = positionList
	}
	//获取目标员工邀请的人完成360评估的数量
	var inviteCompletedCount []dao.CountData
	d := dao.NewStaffAssessDao(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	if len(userIds) > 0 {
		inviteCompletedCount, err = d.CountTargetUserInviteAssess1(userIds, param.CycleId, param.BeginDay)
		if err != nil {
			log.Logger.Error("获取员工邀请的人完成情况" + err.Error())
		}
	}

	//我评估别人,被邀请评估
	cnnt, _, err := assessRepo.Find(map[string]interface{}{
		"beginDay":   param.BeginDay,
		"cycleId":    param.CycleId,
		"executorId": param.ExecutorId,
		"typesList":  []string{string(domain.AssessSuper)},
		"status":     string(domain.StaffAssessUncompleted),
		"limit":      1,
	})
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取个人的评估环节"+err.Error())
	}
	var allAssessId []int
	for _, v := range assessList {
		allAssessId = append(allAssessId, v.Id)
	}

	assessValueMap := d.SearchContentValueByAssessId(allAssessId)

	if err := transactionContext.CommitTransaction(); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	companyName := ""
	if companyInfo != nil {
		companyName = companyInfo.Name
	}
	resultList := []adapter.ListSupperAssessResp{}
	for _, v := range assessList {
		item := adapter.ListSupperAssessResp{
			StaffAssessTaskId: v.StaffAssessTaskId,
			AssessId:          v.Id,
			CycleId:           int(v.CycleId),
			BeginDay:          v.BeginTime.Local().Format("2006-01-02"),
			UserId:            v.TargetUser.UserId,
			UserName:          v.TargetUser.UserName,
			EndTime:           v.EndTime.Local().Format("2006-01-02 15:04:05"),
			InviteCompleted:   0,
			Status:            string(v.Status),
			InviteTotal:       5,
			Department:        "",
			Position:          "",
			CompanyName:       companyName,
			DutyTime:          "",
			ContentValue:      []string{},
		}
		if values, ok := assessValueMap[v.Id]; ok {
			item.ContentValue = values
		}
		//填入部门
		for _, vv := range v.TargetDepartment {
			item.Department += vv.DepartmentName + " "
		}
		for _, vv := range targetUserList {
			if vv.Id != int64(v.TargetUser.UserId) {
				continue
			}
			//填入入职时间
			item.DutyTime = vv.CreatedAt.Local().Format("2006-01-02 15:04:05")
			//填入职位
			for _, vvv := range userPositionMap[vv.Id] {
				item.Position += vvv.Name + " "
			}
			break
		}
		//
		for _, vv := range inviteCompletedCount {
			if v.TargetUser.UserId == vv.TargetUserId {
				item.InviteCompleted = vv.InviteCompleted
				item.InviteTotal = vv.InviteTotal
				break
			}
		}
		resultList = append(resultList, item)
	}
	result := tool_funs.SimpleWrapGridMap(int64(cnt), resultList)
	result["lintNodeDesc"] = ""
	if len(assessList) > 0 {
		result["cycleId"] = assessList[0].CycleId
		result["beginDay"] = assessList[0].BeginTime.Local().Format("2006-01-02")
		result["lintNodeDesc"] = fmt.Sprintf("截止时间 %s 待评估 %d 人", assessList[0].EndTime.Local().Format("2006-01-02 15:04:05"), cnnt)
	}
	return result, nil
}

// 根据周期和日期,获取员工的自评内容
func (srv StaffAssessServeice) GetAssessSelfInfoV2(param *query.GetExecutorSelfAssessQuery) (*adapter.AssessInfoResp, error) {
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		_ = transactionContext.RollbackTransaction()
	}()
	assessReps := factory.CreateStaffAssessRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	// 获取员工的评估
	_, assessList, err := assessReps.Find(map[string]interface{}{
		"companyId":  param.CompanyId,
		"executorId": param.TargetUserId,
		"cycleId":    param.CycleId,
		"beginDay":   param.BeginDay,
		"typesList":  []string{string(domain.AssessSelf)},
		"limit":      1,
	})
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工的评估"+err.Error())
	}
	if len(assessList) == 0 {
		return nil, application.ThrowError(application.BUSINESS_ERROR, "不存在员工的自评内容")
	}
	assessData := assessList[0]

	assessContentList := []*domain.StaffAssessContent{}
	if assessData.Status == domain.StaffAssessCompleted {
		//已完成
		assessContentRepo := factory.CreateStaffAssessContentRepository(map[string]interface{}{
			"transactionContext": transactionContext,
		})
		_, assessContentList, err = assessContentRepo.Find(map[string]interface{}{
			"staffAssessId": assessData.Id,
		})
		if err != nil {
			return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取项目填写内容"+err.Error())
		}
	} else if assessData.Status == domain.StaffAssessUncompleted {
		//未完成
		assessContentList, err = srv.getAssessSelfInfoUncompleted(transactionContext, assessData)
		if err != nil {
			return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取项目填写内容"+err.Error())
		}
	}

	// 恢复缓存数据
	if param.AcquireCache != 0 {
		srv.recoverAssessCache(transactionContext, assessData.Id, assessContentList)
	}

	//获取员工描述
	staffDesc, _ := srv.getStaffDescrip(transactionContext, int64(param.TargetUserId))
	if err := transactionContext.CommitTransaction(); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	result := adapter.AssessInfoResp{
		AssessId:              assessData.Id,
		CycleId:               assessData.CycleId,
		CycleName:             assessData.CycleName,
		LinkNodeId:            assessData.LinkNodeId,
		LinkNodeName:          assessData.LinkNodeName,
		EvaluationProjectId:   assessData.EvaluationProjectId,
		EvaluationProjectName: assessData.EvaluationProjectName,
		BeginTime:             assessData.BeginTime.Local().Format("2006-01-02 15:04:05"),
		EndTime:               assessData.EndTime.Local().Format("2006-01-02 15:04:05"),
		Status:                string(assessData.Status),
		TargetUserId:          assessData.TargetUser.UserId,
		TargetUserName:        assessData.TargetUser.UserName,
		CompanyId:             assessData.CompanyId,
		CompanyName:           "",
		CompanyLogo:           "",
		SupperUser:            "",
		DutyTime:              "",
		AssessContent:         assessContentList,
	}
	if staffDesc != nil {
		result.CompanyName = staffDesc.CompanyName
		result.CompanyLogo = staffDesc.CompanyLogo
		result.SupperUser = staffDesc.SupperUserName
		result.DutyTime = staffDesc.DutyTime
	}
	return &result, nil
}

// 根据周期和日期。获取360评估的列表,员工的被其他人评估
func (srv StaffAssessServeice) ListTargetUserInviteAssess(param *query.ListTargetAssessQuery) (map[string]interface{}, error) {

	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		_ = transactionContext.RollbackTransaction()
	}()
	assessReps := factory.CreateStaffAssessRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	//获取员工的评估
	cnt, assessList, err := assessReps.Find(map[string]interface{}{
		"cycleId":      param.CycleId,
		"beginDay":     param.BeginDay,
		"companyId":    param.CompanyId,
		"targetUserId": param.TargetUserId,
		"typesList":    []string{string(domain.AssessInviteSameSuper), string(domain.AssessInviteDiffSuper)},
	})
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工的评估"+err.Error())
	}
	if err := transactionContext.CommitTransaction(); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	var resultList []map[string]interface{}
	for _, v := range assessList {
		item := map[string]interface{}{
			"id":         v.Id,
			"targetUser": v.TargetUser,
			"executor":   v.Executor,
		}
		resultList = append(resultList, item)
	}
	return tool_funs.SimpleWrapGridMap(int64(cnt), resultList), nil
}

// 根据周期和日期。获取上级评估的列表,员工的被其他人评估
func (srv StaffAssessServeice) ListTargetUserSuperAssess(param *query.ListTargetAssessQuery) (map[string]interface{}, error) {

	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		_ = transactionContext.RollbackTransaction()
	}()
	assessReps := factory.CreateStaffAssessRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	//获取员工的评估
	cnt, assessList, err := assessReps.Find(map[string]interface{}{
		"cycleId":      param.CycleId,
		"beginDay":     param.BeginDay,
		"companyId":    param.CompanyId,
		"targetUserId": param.TargetUserId,
		"typesList":    []string{string(domain.AssessSuper)},
	})
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工的评估"+err.Error())
	}
	if err := transactionContext.CommitTransaction(); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	resultList := []map[string]interface{}{}
	for _, v := range assessList {
		item := map[string]interface{}{
			"id":         v.Id,
			"targetUser": v.TargetUser,
			"executor":   v.Executor,
		}
		resultList = append(resultList, item)
	}
	return tool_funs.SimpleWrapGridMap(int64(cnt), resultList), nil
}

// 选择员工评估可邀请的用户
func (srv StaffAssessServeice) SelectAssessInviteUserV2(param *query.SelectAssessInviteUser) (map[string]interface{}, error) {
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		_ = transactionContext.RollbackTransaction()
	}()
	//获取被评估的目标用户
	userRepo := factory.CreateUserRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	//获取公司信息
	companyRepo := factory.CreateCompanyRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	})
	companyInfo, _ := companyRepo.FindOne(map[string]interface{}{
		"id": param.CompanyId,
	})
	targetUser, err := userRepo.FindOne(map[string]interface{}{
		"id": param.TargetUserId,
	})
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工信息"+err.Error())
	}

	//查询员工数据
	condition := map[string]interface{}{
		"companyId": param.CompanyId,
		"name":      param.InviteUserName,
		"limit":     20,
		"status":    1,
	}
	if param.PageSize > 0 {
		condition["limit"] = param.PageSize
	}
	offset := (param.PageNumber - 1) * param.PageSize
	if offset > 0 {
		condition["offset"] = offset
	}
	cnt, userList, err := userRepo.Find(condition)
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工列表信息"+err.Error())
	}
	if err := transactionContext.CommitTransaction(); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	listData := []adapter.SelectInviteUser{}
	companyName := ""
	if companyInfo != nil {
		companyName = companyInfo.Name
	}
	for _, v := range userList {
		_ = v
		_ = companyName
		item := adapter.SelectInviteUser{
			UserId:      int(v.Id),
			UserName:    v.Name,
			CompanyName: companyName,
			IsSupper:    false,
			Types:       2, //默认是不同上级
		}
		if targetUser.ParentId == v.ParentId {
			item.Types = 1
		}
		listData = append(listData, item)
	}
	return tool_funs.SimpleWrapGridMap(int64(cnt), listData), nil
}