template_service.go 9.7 KB
package service

import (
	"github.com/linmadan/egglib-go/core/application"
	"github.com/linmadan/egglib-go/utils/tool_funs"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/evaluation_template/command"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
	"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/utils"
)

type EvaluationTemplateService struct {
}

func NewEvaluationTemplateService() *EvaluationTemplateService {
	newRoleService := &EvaluationTemplateService{}
	return newRoleService
}

// Create 创建
func (rs *EvaluationTemplateService) Create(in *command.CreateTemplateCommand) (interface{}, error) {
	transactionContext, err := factory.ValidateStartTransaction(in)
	if err != nil {
		return nil, err
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()
	templateRepository := factory.CreateEvaluationTemplateRepository(map[string]interface{}{"transactionContext": transactionContext})

	// 检测名称重复
	count, err := templateRepository.Count(map[string]interface{}{"name": in.Name, "companyId": in.CompanyId})
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	if count > 0 {
		return nil, application.ThrowError(application.BUSINESS_ERROR, "已存在相同名称的评估模板")
	}

	linkNodes := make([]*domain.LinkNode, 0)

	sid, _ := utils.NewSnowflakeId()

	// 自评反馈
	selfLinkNode := &domain.LinkNode{
		Id:           sid + 1,
		Type:         domain.LinkNodeSelfAssessment,
		Name:         "填写自评反馈",
		NodeContents: make([]*domain.NodeContent, 0),
		KpiCycle:     domain.KpiCycleDay,
	}
	// 有环节自评评估内容,则直接使用
	if len(in.NodeContents) > 0 {
		selfLinkNode.NodeContents = in.NodeContents
	}

	linkNodes = append(linkNodes, selfLinkNode)
	linkNodes = append(linkNodes, &domain.LinkNode{
		Id:           sid + 2,
		Type:         domain.LinkNodeAllInvite,
		Name:         "360°邀请",
		NodeContents: make([]*domain.NodeContent, 0),
		KpiCycle:     domain.KpiCycleDay,
	})
	linkNodes = append(linkNodes, &domain.LinkNode{
		Id:           sid + 3,
		Type:         domain.LinkNodeAllAssessment,
		Name:         "360°评估",
		NodeContents: make([]*domain.NodeContent, 0),
		KpiCycle:     domain.KpiCycleDay,
	})
	linkNodes = append(linkNodes, &domain.LinkNode{
		Id:           sid + 4,
		Type:         domain.LinkNodeSuperiorAssessment,
		Name:         "上级评估",
		NodeContents: make([]*domain.NodeContent, 0),
		KpiCycle:     domain.KpiCycleDay,
	})
	linkNodes = append(linkNodes, &domain.LinkNode{
		Id:           sid + 5,
		Type:         domain.LinkNodeViewResult,
		Name:         "绩效结果查看",
		NodeContents: make([]*domain.NodeContent, 0),
		KpiCycle:     domain.KpiCycleDay,
	})

	newTemplate := &domain.EvaluationTemplate{
		Id:        0,
		Name:      in.Name,
		Describe:  in.Describe,
		CompanyId: in.CompanyId,
		CreatorId: in.CreatorId,
		State:     domain.TemplateStateWaitConfig,
		LinkNodes: linkNodes,
	}
	if in.State > domain.TemplateStateWaitConfig {
		newTemplate.State = in.State
	}

	template, err := templateRepository.Insert(newTemplate)
	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 template, nil

}

func (rs *EvaluationTemplateService) Update(in *command.UpdateTemplateCommand) (interface{}, error) {
	transactionContext, err := factory.ValidateStartTransaction(in)
	if err != nil {
		return nil, err
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()

	templateRepository := factory.CreateEvaluationTemplateRepository(map[string]interface{}{"transactionContext": transactionContext})

	// 检测名称重复(排除自己)
	count, err := templateRepository.Count(map[string]interface{}{"name": in.Name, "companyId": in.CompanyId, "notId": in.Id})
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	if count > 0 {
		return nil, application.ThrowError(application.BUSINESS_ERROR, "名称已存在")
	}

	template, err := templateRepository.FindOne(map[string]interface{}{"id": in.Id})
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}

	template.Name = in.Name
	template.Describe = in.Describe
	template.LinkNodes = in.LinkNodes

	// 完成配置保存,更新状态
	if in.FinishConfig == 1 && template.State == domain.TemplateStateWaitConfig {
		template.State = domain.TemplateStateWaitActive
	}

	template, err = templateRepository.Insert(template)
	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 template, nil
}

func (rs *EvaluationTemplateService) Get(in *command.GetTemplateCommand) (interface{}, error) {
	transactionContext, err := factory.ValidateStartTransaction(in)
	if err != nil {
		return nil, err
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()
	templateRepository := factory.CreateEvaluationTemplateRepository(map[string]interface{}{"transactionContext": transactionContext})
	template, err := templateRepository.FindOne(map[string]interface{}{"id": in.Id})
	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 template, nil
}

func (rs *EvaluationTemplateService) Remove(in *command.DeleteTemplateCommand) (interface{}, error) {
	transactionContext, err := factory.ValidateStartTransaction(in)
	if err != nil {
		return nil, err
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()

	templateRepository := factory.CreateEvaluationTemplateRepository(map[string]interface{}{"transactionContext": transactionContext})

	template, err := templateRepository.FindOne(map[string]interface{}{"id": in.Id})
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	if _, err := templateRepository.Remove(template); 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 template, nil
}

func (rs *EvaluationTemplateService) List(in *command.QueryTemplateCommand) (interface{}, error) {
	transactionContext, err := factory.ValidateStartTransaction(in)
	if err != nil {
		return nil, err
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()

	queryOptions := tool_funs.SimpleStructToMap(in)
	if len(in.CreatedAt) == 0 {
		delete(queryOptions, "createdAt") // 删除创建时间
	}

	templateRepository := factory.CreateEvaluationTemplateRepository(map[string]interface{}{"transactionContext": transactionContext})
	total, templates, err := templateRepository.Find(queryOptions, "link_nodes")
	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 tool_funs.SimpleWrapGridMap(total, templates), nil
}

func (rs *EvaluationTemplateService) State(in *command.StateTemplateCommand) (interface{}, error) {
	transactionContext, err := factory.ValidateStartTransaction(in)
	if err != nil {
		return nil, err
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()

	templateRepository := factory.CreateEvaluationTemplateRepository(map[string]interface{}{"transactionContext": transactionContext})

	template, err := templateRepository.FindOne(map[string]interface{}{"id": in.Id})
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}

	template.State = in.State
	template, err = templateRepository.Insert(template)
	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 template, nil
}

func (rs *EvaluationTemplateService) Copy(in *command.CopyTemplateCommand) (interface{}, error) {
	transactionContext, err := factory.ValidateStartTransaction(in)
	if err != nil {
		return nil, err
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()
	templateRepository := factory.CreateEvaluationTemplateRepository(map[string]interface{}{"transactionContext": transactionContext})
	template, err := templateRepository.FindOne(map[string]interface{}{"id": in.Id})
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	// ID重置
	template.Id = 0
	template.Name = template.Name + " 副本"
	template.CreatorId = in.CreatorId

	// 如果拷贝已经启用的模板,默认先设置为待启用
	if template.State == domain.TemplateStateEnable {
		template.State = domain.TemplateStateWaitActive
	}

	// 流程环节ID重置
	sid, _ := utils.NewSnowflakeId()
	for i := range template.LinkNodes {
		template.LinkNodes[i].Id = sid + int64(i+1)
	}

	template, err = templateRepository.Insert(template)
	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 template, nil
}