diff --git a/pkg/application/factory/reposetory.go b/pkg/application/factory/reposetory.go index 5fc4a67..1f73a1c 100644 --- a/pkg/application/factory/reposetory.go +++ b/pkg/application/factory/reposetory.go @@ -128,3 +128,27 @@ func CreateEvaluationProjectRepository(options map[string]interface{}) domain.Ev } return repository.NewEvaluationProjectRepository(transactionContext) } + +func CreateStaffAssessRepository(options map[string]interface{}) domain.StaffAssessRepository { + var transactionContext *pg.TransactionContext + if value, ok := options["transactionContext"]; ok { + transactionContext = value.(*pg.TransactionContext) + } + return repository.NewStaffAssessRepository(transactionContext) +} + +func CreateStaffAssessContentRepository(options map[string]interface{}) domain.StaffAssessContentRepository { + var transactionContext *pg.TransactionContext + if value, ok := options["transactionContext"]; ok { + transactionContext = value.(*pg.TransactionContext) + } + return repository.NewStaffAssessContentRepository(transactionContext) +} + +func CreateStaffAssessTaskRepository(options map[string]interface{}) domain.StaffAssessTaskRepository { + var transactionContext *pg.TransactionContext + if value, ok := options["transactionContext"]; ok { + transactionContext = value.(*pg.TransactionContext) + } + return repository.NewStaffAssessTaskRepository(transactionContext) +} diff --git a/pkg/application/staff_assess/adapter/assess_info.go b/pkg/application/staff_assess/adapter/assess_info.go new file mode 100644 index 0000000..296fc33 --- /dev/null +++ b/pkg/application/staff_assess/adapter/assess_info.go @@ -0,0 +1,25 @@ +package adapter + +import "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain" + +//评估内容详情 +type AssessInfoResp struct { + CycleId int64 `json:"cycleId"` //周期id + CycleName string `json:"cycleName"` //周期名称 + EvaluationProjectId int `json:"evaluationProjectId"` //项目id + EvaluationProjectName string `json:"evaluationProjectName"` //项目名称 + BeginTime string `json:"beginTime"` //开始时间 2006-01-02 15:04:05 + EndTime string `json:"endTime"` //结束时间 2006-01-02 15:04:05 + Status string `json:"status"` //完成状态 + TargetUserId int `json:"targetUser"` // + TargetUserName string `json:"targetUserName"` // + AssessContent []AssessContent `json:"assessContent"` //评估内容 +} + +type AssessContent struct { + Category string `json:"category" comment:"类别"` + Name string `json:"name" comment:"名称"` + PromptTitle string `json:"promptTitle" comment:"提示项标题"` + PromptText string `json:"promptText" comment:"提示项正文"` + EntryItems []*domain.EntryItem `json:"entryItems" comment:"填写项"` +} diff --git a/pkg/application/staff_assess/adapter/assess_invite_user.go b/pkg/application/staff_assess/adapter/assess_invite_user.go new file mode 100644 index 0000000..c475fb9 --- /dev/null +++ b/pkg/application/staff_assess/adapter/assess_invite_user.go @@ -0,0 +1,13 @@ +package adapter + +import "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain" + +type AssessInviteUserResp struct { + LinkNodeId int `json:"linkNodeId"` + LinkNodeName string `json:"linkNodeName"` + BeginTime string `json:"beginTime"` + EndTime string `json:"endTime"` + AssessTaskId int `json:"assessTaskId"` + InviteSameSuper []domain.StaffDesc `json:"inviteSameSuper"` + InviteDiffSuper []domain.StaffDesc `json:"inviteDiffSuper"` +} diff --git a/pkg/application/staff_assess/adapter/assess_self_list.go b/pkg/application/staff_assess/adapter/assess_self_list.go new file mode 100644 index 0000000..ee12844 --- /dev/null +++ b/pkg/application/staff_assess/adapter/assess_self_list.go @@ -0,0 +1,18 @@ +package adapter + +type AssessSelfList struct { + AssessId int `json:"assessId"` //用户执行的评估项id + BeginTime string `json:"beginTime"` //开始时间 2006-01-02 15:04:05 + EndTime string `json:"endTime"` //开始时间 2006-01-02 15:04:05 + CycleId int64 `json:"cycleId"` //周期id + CycleName string `json:"cycleName"` //周期名称 + EvaluationProjectId int `json:"evaluationProjectId"` //项目id + EvaluationProjectName string `json:"evaluationProjectName"` //项目名称 +} + +type StaffInfo struct { + UserName string `json:"userName"` //员工名称 + CompanyName string `json:"companyName"` //公司名称 + SupperUserName string `json:"supperUserName"` //上级名称 + DutyTime string `json:"dutyTime"` //上岗时间 +} diff --git a/pkg/application/staff_assess/adapter/assess_task_desc.go b/pkg/application/staff_assess/adapter/assess_task_desc.go new file mode 100644 index 0000000..2e076f1 --- /dev/null +++ b/pkg/application/staff_assess/adapter/assess_task_desc.go @@ -0,0 +1,21 @@ +package adapter + +type AssessTaskDescResp struct { + AssessTaskId int `json:"assessTaskId"` // + EvaluationProjectId int `json:"evaluationProjectId"` //项目id + EvaluationProjectName string `json:"evaluationProjectName"` //项目名称 + CycleName string `json:"cycleName"` //周期名称 + BeginTime string `json:"beginTime"` //开始时间 2006-01-02 15:04:05 + EndTime string `json:"endTime"` //结束时间 2006-01-02 15:04:05 + StepList []AssessTaskStep `json:"stepList"` // 考评流程 +} + +type AssessTaskStep struct { + SortBy int `json:"sortBy"` //排序 + LinkNodeName string `json:"linkNodeName"` //流程名称 + BeginTime string `json:"beginTime"` //开始时间时间 + EndTime string `json:"endTime"` //结束时间 + LinkNodeType int `json:"linkNodeType"` //流程类型 + Desc string `json:"desc"` //情况描述 + Status string `json:"status"` //流程是否完成 "":未参加,"uncompleted":未完成,"completed":完成 +} diff --git a/pkg/application/staff_assess/adapter/search_assess_me.go b/pkg/application/staff_assess/adapter/search_assess_me.go new file mode 100644 index 0000000..2e757b5 --- /dev/null +++ b/pkg/application/staff_assess/adapter/search_assess_me.go @@ -0,0 +1,11 @@ +package adapter + +type SearchAssessMeResp struct { + AssessTaskId int `json:"assessTaskId"` + BeginTime string `json:"beginTime"` + EndTime string `json:"endTime"` + CycleId int64 `json:"cycleId"` + CycleName string `json:"cycleName"` + EvaluationProjectId int `json:"evaluationProjectId"` + EvaluationProjectName string `json:"evaluationProjectName"` +} diff --git a/pkg/application/staff_assess/command/create_staff_assess_task.go b/pkg/application/staff_assess/command/create_staff_assess_task.go new file mode 100644 index 0000000..2e5e816 --- /dev/null +++ b/pkg/application/staff_assess/command/create_staff_assess_task.go @@ -0,0 +1,22 @@ +package command + +type CreateStaffAssessTask struct { + CompanyId int `json:"companyId"` //公司id + EvaluationProjectId int `json:"evaluationProjectId"` //项目id + EvaluationProjectName string `json:"evaluationProjectName"` //项目名称 + CycleId int64 `json:"cycleId"` //对应的周期id + CycleName string `json:"cycleName"` //对应周期的名称 + BeginTime string `json:"beginTime"` //绩效考核开始时间 + EndTime string `json:"endTime"` //绩效考核截止时间 + StepList []AssessTaskStep `json:"steps"` //考评的流程 + ExecutorId []int `json:"executorId"` //参与此次考评的人 +} + +type AssessTaskStep struct { + SortBy int `json:"sortBy"` //排序 + LinkNodeId int `json:"linkNodeId"` //考评的流程id + LinkNodeName string `json:"linkNodeName"` //流程名称 + LinkNodeType int `json:"linkNodeType"` //流程类型 同evaluation_template.go->LinkNode.Type + BeginTime string `json:"beginTime"` //绩效考核开始时间 + EndTime string `json:"endTime"` //绩效考核截止时间 +} diff --git a/pkg/application/staff_assess/command/save_assess_invite.go b/pkg/application/staff_assess/command/save_assess_invite.go new file mode 100644 index 0000000..3c3f830 --- /dev/null +++ b/pkg/application/staff_assess/command/save_assess_invite.go @@ -0,0 +1,8 @@ +package command + +type SaveAssessInvite struct { + InviteSameSuper []string `json:"inviteSameSuper"` //相同上级同事 + InviteDiffSuper []string `json:"inviteDiffSuper"` //不同上级同事 + AssessTaskId int `json:"assessTaskId"` //评估任务id + TargetUserId int `json:"targetUserId"` //被评估的员工id +} diff --git a/pkg/application/staff_assess/query/assess_info.go b/pkg/application/staff_assess/query/assess_info.go new file mode 100644 index 0000000..1d9f378 --- /dev/null +++ b/pkg/application/staff_assess/query/assess_info.go @@ -0,0 +1,8 @@ +package query + +type AssessInfoQuery struct { + AssessTaskId int `json:"assessTaskId"` //StaffAssess 的id + TargetUserId int `json:"targetUserId"` //被评估的人id + CompanyId int `json:"companyId"` //公司id + +} diff --git a/pkg/application/staff_assess/query/assess_self_list.go b/pkg/application/staff_assess/query/assess_self_list.go new file mode 100644 index 0000000..c9a347b --- /dev/null +++ b/pkg/application/staff_assess/query/assess_self_list.go @@ -0,0 +1,8 @@ +package query + +type AssessSelfListQuery struct { + UserId int `json:"userId"` //用户id + CompanyId int `json:"companyId"` //公司Id + PageSize int `json:"pageSize"` //每页的记录数 + PageNumber int `json:"pageNumber"` //页码 +} diff --git a/pkg/application/staff_assess/query/assess_task_desc.go b/pkg/application/staff_assess/query/assess_task_desc.go new file mode 100644 index 0000000..234beb3 --- /dev/null +++ b/pkg/application/staff_assess/query/assess_task_desc.go @@ -0,0 +1,7 @@ +package query + +type AssessTaskDescQuery struct { + AssessTaskId int `json:"assessTaskId"` //评估任务的id + UserId int `json:"userId"` //当前登录人的id + CompanyId int `json:"companyId"` //当前登录的公司 +} diff --git a/pkg/application/staff_assess/query/get_assess_invite_user.go b/pkg/application/staff_assess/query/get_assess_invite_user.go new file mode 100644 index 0000000..ccb1e84 --- /dev/null +++ b/pkg/application/staff_assess/query/get_assess_invite_user.go @@ -0,0 +1,7 @@ +package query + +type GetAssessInviteUserQuery struct { + CompanyId int `json:"companyId"` //对公司 + UsrId int `json:"usrId"` //被评估的员工id + AssessTaskId int `json:"assessTaskId"` //评估任务的id +} diff --git a/pkg/application/staff_assess/query/search_assess_me.go b/pkg/application/staff_assess/query/search_assess_me.go new file mode 100644 index 0000000..ed9805b --- /dev/null +++ b/pkg/application/staff_assess/query/search_assess_me.go @@ -0,0 +1,8 @@ +package query + +type SearchAssessMeQuery struct { + UserId int `json:"userId"` // 当前登录人的用户id + CompanyId int `json:"companyId"` //当前登录人的公司Id + PageSize int `json:"pageSize"` //每页的记录数 + PageNumber int `json:"pageNumber"` //页码 +} diff --git a/pkg/application/staff_assess/service/service.go b/pkg/application/staff_assess/service/service.go new file mode 100644 index 0000000..4a557a6 --- /dev/null +++ b/pkg/application/staff_assess/service/service.go @@ -0,0 +1,848 @@ +package service + +import ( + "fmt" + "strconv" + "time" + + "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/command" + "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/log" +) + +// 员工评绩效评估 +type StaffAssessServeice struct { +} + +func NewStaffAssessServeice() *StaffAssessServeice { + newService := &StaffAssessServeice{} + return newService +} + +// 获取我参与过的评估任务列表 +func (srv StaffAssessServeice) SearchAssessTaskMe(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() + }() + staffAssessTaskRepo := factory.CreateStaffAssessTaskRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + var limit int = 20 + var offset int = 0 + if param.PageSize > 0 { + limit = param.PageSize + } + offset = (param.PageNumber - 1) * param.PageSize + condition := map[string]interface{}{ + "executorId": param.UserId, + "companyId": param.CompanyId, + "limit": limit, + } + if offset > 0 { + condition["offset"] = offset + } + cnt, assessTaskList, err := staffAssessTaskRepo.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 := make([]adapter.SearchAssessMeResp, 0, len(assessTaskList)) + var temp adapter.SearchAssessMeResp + for _, v := range assessTaskList { + temp = adapter.SearchAssessMeResp{ + AssessTaskId: v.Id, + BeginTime: v.BeginTime.Format("2006-01-02 15:04:05"), + EndTime: v.EndTime.Format("2006-01-02 15:04:05"), + CycleId: v.CycleId, + CycleName: v.CycleName, + EvaluationProjectId: v.EvaluationProjectId, + EvaluationProjectName: v.EvaluationProjectName, + } + listData = append(listData, temp) + } + return tool_funs.SimpleWrapGridMap(int64(cnt), listData), nil +} + +// 获取项目评估进度描述 +func (srv StaffAssessServeice) AssessTaskDesc(param *query.AssessTaskDescQuery) (*adapter.AssessTaskDescResp, 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, + }) + assessTaskData, err := staffAssessTaskRepo.FindOne(map[string]interface{}{ + "id": param.AssessTaskId, + }) + if err != nil { + return nil, application.ThrowError(application.TRANSACTION_ERROR, "评估任务不存在,"+err.Error()) + } + //返回的数据结果 + result := adapter.AssessTaskDescResp{ + AssessTaskId: assessTaskData.Id, + EvaluationProjectId: assessTaskData.EvaluationProjectId, + EvaluationProjectName: assessTaskData.EvaluationProjectName, + CycleName: assessTaskData.CycleName, + BeginTime: assessTaskData.BeginTime.Local().Format("2006-01-02 15:04-05"), + EndTime: assessTaskData.EndTime.Local().Format("2006-01-02 15:04-05"), + StepList: []adapter.AssessTaskStep{}, + } + + for _, v := range assessTaskData.StepList { + stepItem := adapter.AssessTaskStep{ + SortBy: v.SortBy, + LinkNodeName: v.LinkNodeName, + 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{}{ + "staffAssessTaskId": assessTaskData.Id, + "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{}{ + "staffAssessTaskId": assessTaskData.Id, + "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()) + } + //待邀请人数,为5人减去已邀请的人数。若邀请人数已等于或大于5人,则只显示截止日期即可 + if len(assessInviteData) > 5 { + stepItem.Desc = fmt.Sprintf("截止日期:%s", stepItem.EndTime) + stepItem.Status = string(domain.StaffAssessCompleted) + } else { + stepItem.Desc = fmt.Sprintf("截止日期:%s 待邀请%d人", stepItem.EndTime, 5-len(assessInviteData)) + stepItem.Status = string(domain.StaffAssessUncompleted) + } + case domain.LinkNodeAllAssessment: + //我评估别人,被邀请评估 + _, assessInviteList, err := staffAssessRepo.Find(map[string]interface{}{ + "staffAssessTaskId": assessTaskData.Id, + "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: + //我评估别人,上级评估 + _, assessSupperList, err := staffAssessRepo.Find(map[string]interface{}{ + "staffAssessTaskId": assessTaskData.Id, + "executorId": param.UserId, + "typesList": []string{string(domain.AssessSuper)}, + }) + if err != nil { + return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取个人的评估环节"+err.Error()) + } + if len(assessSupperList) > 0 { + stepItem.Status = string(domain.StaffAssessCompleted) + stepItem.Desc = fmt.Sprintf("截止日期:%s", stepItem.EndTime) + uncompletedNum := 0 + for _, v := range assessSupperList { + if v.Status == domain.StaffAssessUncompleted { + uncompletedNum += 1 + } + } + if uncompletedNum > 0 { + 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) AssessSelfList(param *query.AssessSelfListQuery) (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() + }() + //获取个人参与的评估流程 + staffAssessRepo := factory.CreateStaffAssessRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + var limit int = 20 + var offset int = 0 + if param.PageSize > 0 { + limit = param.PageSize + } + offset = (param.PageNumber - 1) * param.PageSize + condition := map[string]interface{}{ + "executorId": param.UserId, + "companyId": param.CompanyId, + "typesList": []string{string(domain.AssessSelf)}, + "limit": limit, + "status": string(domain.StaffAssessCompleted), + } + if offset > 0 { + condition["offset"] = offset + } + //获取历史列表 + cnt, assessList, err := staffAssessRepo.Find(condition) + if err != nil { + return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取评估任务列表,"+err.Error()) + } + + //获取公司数据 + companyRep := factory.CreateCompanyRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + + companyData, err := companyRep.FindOne(map[string]interface{}{ + "id": param.CompanyId, + }) + if err != nil { + log.Logger.Error("获取公司信息," + err.Error()) + return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取公司信息,"+err.Error()) + } + + //获取用户数据 + userRepo := factory.CreateUserRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + userData, err := userRepo.FindOne(map[string]interface{}{ + "id": param.UserId, + }) + if err != nil { + log.Logger.Error("获取用户信息," + err.Error()) + return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取用户信息,"+err.Error()) + } + departmentRepo := factory.CreateDepartmentRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + var supperUserList []*domain.User + if len(userData.DepartmentId) > 0 { + _, departmentList, err := departmentRepo.Find(map[string]interface{}{ + "ids": userData.DepartmentId, + }) + if err != nil { + return nil, application.ThrowError(application.TRANSACTION_ERROR, "获取部门信息,"+err.Error()) + } + var chargeUserIds []int64 + for _, v := range departmentList { + chargeUserIds = append(chargeUserIds, v.ChargeUserIds...) + } + if len(chargeUserIds) > 0 { + _, supperUserList, err = userRepo.Find(map[string]interface{}{ + "ids": chargeUserIds, + }) + 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()) + } + listData := make([]adapter.AssessSelfList, 0, len(assessList)) + var itemTemp adapter.AssessSelfList + for _, v := range assessList { + itemTemp = adapter.AssessSelfList{ + AssessId: v.Id, + BeginTime: v.BeginTime.Local().Format("2006-01-02 15:04:05"), + EndTime: v.EndTime.Local().Format("2006-01-02 15:04:05"), + CycleId: v.CycleId, + CycleName: v.CycleName, + EvaluationProjectId: v.EvaluationProjectId, + EvaluationProjectName: v.EvaluationProjectName, + } + listData = append(listData, itemTemp) + } + userInfo := adapter.StaffInfo{ + UserName: userData.Name, + CompanyName: companyData.Name, + SupperUserName: "", + DutyTime: userData.CreatedAt.Local().Format("2006-01-02 15:04:05"), + } + for _, v := range supperUserList { + userInfo.SupperUserName = userInfo.SupperUserName + v.Name + ";" + } + result := tool_funs.SimpleWrapGridMap(int64(cnt), listData) + result["userInfo"] = userInfo + return result, nil +} + +// 更具项目评估的配置,创建员工的评估任务 +func (srv StaffAssessServeice) CreateStaffAssessTask(param *command.CreateStaffAssessTask) (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() + }() + + taskBeginTime, err := time.ParseInLocation("2006-01-02 15:04:05", param.BeginTime, time.Local) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "任务开始时间填写错误,"+param.BeginTime) + } + taskEndTime, err := time.ParseInLocation("2006-01-02 15:04:05", param.EndTime, time.Local) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "任务结束时间填写错误,"+param.EndTime) + } + nowTime := time.Now() + //建立评估任务 + assessTask := domain.StaffAssessTask{ + Id: 0, + CompanyId: param.CompanyId, + EvaluationProjectId: param.EvaluationProjectId, + EvaluationProjectName: param.EvaluationProjectName, + CycleId: param.CycleId, + CycleName: param.CycleName, + BeginTime: taskBeginTime, + EndTime: taskEndTime, + StepList: []domain.AssessTaskStep{}, + ExecutorId: nil, + CreatedAt: nowTime, + UpdatedAt: nowTime, + DeletedAt: nil, + } + //填充评估环节 + for _, v := range param.StepList { + stepBeginTime, err := time.ParseInLocation("2006-01-02 15:04:05", param.BeginTime, time.Local) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "评估环节开始时间填写错误,"+param.BeginTime) + } + stepEndTime, err := time.ParseInLocation("2006-01-02 15:04:05", param.EndTime, time.Local) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "评估环节结束时间填写错误,"+param.EndTime) + } + step := domain.AssessTaskStep{ + SortBy: v.SortBy, + LinkNodeId: v.LinkNodeId, + LinkNodeName: v.LinkNodeName, + LinkNodeType: v.LinkNodeType, + BeginTime: stepBeginTime, + EndTime: stepEndTime, + } + assessTask.StepList = append(assessTask.StepList, step) + } + + assessTaskRepo := factory.CreateStaffAssessTaskRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + _, err = assessTaskRepo.Save(&assessTask) + if err != nil { + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "保存评估任务"+err.Error()) + } + + assessList, err := srv.createStaffAssess(transactionContext, &assessTask) + if err != nil { + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "生成个人评估项"+err.Error()) + } + + assessRepo := factory.CreateStaffAssessRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + + for i := range assessList { + _, err = assessRepo.Save(&assessList[i]) + 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()) + } + return map[string]interface{}{ + "assessTaskId": assessTask.Id, + }, nil +} + +// 添加自评节点任务 +func (srv StaffAssessServeice) createStaffAssess(transactionContext application.TransactionContext, param *domain.StaffAssessTask) ([]domain.StaffAssess, error) { + //评估的参与人 + selfUserId := []int{} + userIdMap := map[int]struct{}{} //过滤重复的用户 + for _, v := range param.ExecutorId { + if _, ok := userIdMap[v]; ok { + continue + } + selfUserId = append(selfUserId, v) + } + // 获取用户的信息 + if len(selfUserId) == 0 { + return nil, application.ThrowError(application.ARG_ERROR, "未填写评估任务的执行人") + } + userRepo := factory.CreateUserRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + //获取员工信息 + _, userList, err := userRepo.Find(map[string]interface{}{ + "ids": selfUserId, + }) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "获取员工信息"+err.Error()) + } + departmentRepo := factory.CreateDepartmentRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + //获取用户的部门 + userDepartmentMap := map[int64][]*domain.Department{} + for _, v := range userList { + _, departmemtList, err := departmentRepo.Find(map[string]interface{}{ + "ids": v.DepartmentId, + }) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "获取员工的部门信息"+err.Error()) + } + userDepartmentMap[v.Id] = departmemtList + } + assessList := []domain.StaffAssess{} + //数据样板 + stepSelfTemp := domain.StaffAssess{ + Id: 0, + CompanyId: param.CompanyId, + EvaluationProjectId: param.EvaluationProjectId, + EvaluationProjectName: param.EvaluationProjectName, + CycleId: param.CycleId, + CycleName: param.CycleName, + StaffAssessTaskId: param.Id, + // TargetUser: domain.StaffDesc{}, + // TargetDepartment: nil, + // Executor: domain.StaffDesc{}, + Types: domain.AssessSelf, + // LinkNodeId: v.LinkNodeId, + Status: domain.StaffAssessUncompleted, + // BeginTime: time.Time{}, + // EndTime: time.Time{}, + CreatedAt: param.CreatedAt, + UpdatedAt: param.UpdatedAt, + DeletedAt: nil, + } + for _, v := range param.StepList { + if v.LinkNodeType == domain.LinkNodeSelfAssessment { + //员工自评 + stepSelfTemp.BeginTime = v.BeginTime + stepSelfTemp.EndTime = v.EndTime + stepSelfTemp.LinkNodeId = v.LinkNodeId + stepSelfTemp.LinkNodeName = v.LinkNodeName + assessListTemp := srv.createStaffAssessSelf(stepSelfTemp, userList, userDepartmentMap) + assessList = append(assessList, assessListTemp...) + } + if v.LinkNodeType == domain.LinkNodeSuperiorAssessment { + // TODO + stepSelfTemp.BeginTime = v.BeginTime + stepSelfTemp.EndTime = v.EndTime + stepSelfTemp.LinkNodeId = v.LinkNodeId + stepSelfTemp.LinkNodeName = v.LinkNodeName + assessListTemp, err := srv.createStaffAssessSupper(transactionContext, stepSelfTemp, userList, userDepartmentMap) + if err != nil { + return nil, err + } + assessList = append(assessList, assessListTemp...) + } + } + return assessList, nil +} + +// 构建员工自评 +func (srv StaffAssessServeice) createStaffAssessSelf(assessTemp domain.StaffAssess, + userList []*domain.User, userDepartmentMap map[int64][]*domain.Department) []domain.StaffAssess { + result := []domain.StaffAssess{} + for _, usr := range userList { + assessTemp.TargetUser = domain.StaffDesc{ + UserId: int(usr.Id), + Account: usr.Account, + UserName: usr.Account, + } + assessTemp.Executor = domain.StaffDesc{ + UserId: int(usr.Id), + Account: usr.Account, + UserName: usr.Account, + } + if depList, ok := userDepartmentMap[usr.Id]; ok { + for _, dep := range depList { + assessTemp.TargetDepartment = append(assessTemp.TargetDepartment, domain.StaffDepartment{ + DepartmentId: int(dep.Id), + DepartmentName: dep.Name, + }) + } + } + result = append(result, assessTemp) + } + return result +} + +// 构建员工上级评估 +func (srv StaffAssessServeice) createStaffAssessSupper( + transactionContext application.TransactionContext, + assessTemp domain.StaffAssess, + userList []*domain.User, userDepartmentMap map[int64][]*domain.Department, +) ([]domain.StaffAssess, error) { + + // 获取员工的上级用户 + + return nil, nil +} + +// 获取某个员工360邀请的人员 +func (srv StaffAssessServeice) GetAssessInviteUser(param *query.GetAssessInviteUserQuery) (*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, + }) + + assessTaskReps := factory.CreateStaffAssessTaskRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + assessTaskData, err := assessTaskReps.FindOne(map[string]interface{}{ + "id": param.AssessTaskId, + }) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "获取评估任务"+err.Error()) + } + _, assessList, err := assessReps.Find(map[string]interface{}{ + "typesList": []string{string(domain.AssessInviteDiffSuper), string(domain.AssessInviteSameSuper)}, + "staffAssessTaskId": param.AssessTaskId, + "targetUserId": param.UsrId, + }) + 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, + } + 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 + } + for _, v := range assessList { + if v.Types == domain.AssessInviteDiffSuper { + result.InviteDiffSuper = append(result.InviteDiffSuper, v.Executor) + } + if v.Types == domain.AssessInviteSameSuper { + result.InviteSameSuper = append(result.InviteDiffSuper, v.Executor) + } + } + return &result, nil +} + +// 获取某个员工360邀请的人员 +func (srv StaffAssessServeice) SaveAssessInviteUser(param *command.SaveAssessInvite) (*adapter.AssessInviteUserResp, error) { + inviteSameSuperId := []int{} + InviteDiffSuperId := []int{} + for _, v := range param.InviteDiffSuper { + id, err := strconv.Atoi(v) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "用户填写错误") + } + InviteDiffSuperId = append(InviteDiffSuperId, id) + } + for _, v := range param.InviteSameSuper { + id, err := strconv.Atoi(v) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "用户填写错误") + } + inviteSameSuperId = append(inviteSameSuperId, id) + } + 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, + }) + userRepo := factory.CreateUserRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + departmentRepo := factory.CreateDepartmentRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + + assessTaskReps := factory.CreateStaffAssessTaskRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + assessTaskData, err := assessTaskReps.FindOne(map[string]interface{}{ + "id": param.AssessTaskId, + }) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "获取评估任务"+err.Error()) + } + + targetUser, err := userRepo.FindOne(map[string]interface{}{ + "id": param.TargetUserId, + }) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "获取被评估员工"+err.Error()) + } + //被评估人的部门 + var targetUserDepartment []domain.StaffDepartment + if len(targetUser.DepartmentId) > 0 { + _, departmentList, err := departmentRepo.Find(map[string]interface{}{ + "ids": targetUser.DepartmentId, + }) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "获取部门信息"+err.Error()) + } + for _, v := range departmentList { + targetUserDepartment = append(targetUserDepartment, domain.StaffDepartment{ + DepartmentId: int(v.Id), + DepartmentName: v.Name, + }) + } + } + //邀请的相同上级的员工 + var inviteSameSuper []domain.StaffDesc + if len(inviteSameSuperId) > 0 { + _, userList, err := userRepo.Find(map[string]interface{}{ + "ids": inviteSameSuperId, + }) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "获取用户信息"+err.Error()) + } + for _, v := range userList { + inviteSameSuper = append(inviteSameSuper, domain.StaffDesc{ + UserId: int(v.Id), + UserName: v.Name, + Account: v.Account, + }) + } + } + //邀请的不同上级的员工 + var inviteDiffSuper []domain.StaffDesc + if len(InviteDiffSuperId) > 0 { + _, userList, err := userRepo.Find(map[string]interface{}{ + "ids": InviteDiffSuperId, + }) + if err != nil { + return nil, application.ThrowError(application.ARG_ERROR, "获取用户信息"+err.Error()) + } + for _, v := range userList { + inviteDiffSuper = append(inviteDiffSuper, domain.StaffDesc{ + UserId: int(v.Id), + UserName: v.Name, + Account: v.Account, + }) + } + } + _ = assessReps + _ = inviteSameSuper + _ = inviteDiffSuper + _ = targetUserDepartment + // _, assessList, err := assessReps.Find(map[string]interface{}{ + // "typesList": []string{string(domain.AssessInviteDiffSuper), string(domain.AssessInviteSameSuper)}, + // "staffAssessTaskId": param.AssessTaskId, + // "targetUserId": param.TargetUserId, + // }) + // if err != nil { + // return nil, application.ThrowError(application.ARG_ERROR, "获取个人评估任务"+err.Error()) + // } + // TODO + + if err := transactionContext.CommitTransaction(); err != nil { + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) + } + + result := adapter.AssessInviteUserResp{ + AssessTaskId: assessTaskData.Id, + } + // 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 + // } + // for _, v := range assessList { + // if v.Types == domain.AssessInviteDiffSuper { + // result.InviteDiffSuper = append(result.InviteDiffSuper, v.Executor) + // } + // if v.Types == domain.AssessInviteSameSuper { + // result.InviteSameSuper = append(result.InviteDiffSuper, v.Executor) + // } + // } + return &result, nil +} + +// 获取员工自评的评估内容详情 +func (srv StaffAssessServeice) GetAssessSelfInfo(param *query.AssessInfoQuery) (*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, + "staffAssessTaskId": param.AssessTaskId, + "targetUserId": param.TargetUserId, + "typesList": []string{string(domain.AssessSelf)}, + }) + if err != nil { + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取员工的评估"+err.Error()) + } + if len(assessList) == 0 { + return &adapter.AssessInfoResp{}, nil + } + assessData := assessList[0] + projectRepo := factory.CreateEvaluationProjectRepository(map[string]interface{}{ + "transactionContext": transactionContext, + }) + projectData, err := projectRepo.FindOne(map[string]interface{}{ + "id": assessData.EvaluationProjectId, + }) + if err != nil { + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取项目评估配置"+err.Error()) + } + if projectData.Template == nil { + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "未获取到项目评估配置模板") + } + var selfLinkNode *domain.LinkNode + for _, v := range projectData.Template.LinkNodes { + if v.Type == domain.LinkNodeSelfAssessment { + selfLinkNode = v + break + } + } + if selfLinkNode == nil { + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "未获取到项目评估自评配置") + } + //获取员工评估的填写内容 + // assessContentReps := factory.CreateStaffAssessContentRepository(map[string]interface{}{ + // "transactionContext": transactionContext, + // }) + // _, assessContentList, err := assessContentReps.Find(map[string]interface{}{ + // "staffAssessId": assessData.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.INTERNAL_SERVER_ERROR, err.Error()) + } + + result := adapter.AssessInfoResp{ + CycleId: assessData.CycleId, + CycleName: assessData.CycleName, + 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, + AssessContent: nil, + } + assessContent := make([]adapter.AssessContent, 0) + for _, v := range selfLinkNode.NodeContents { + assessContent = append(assessContent, adapter.AssessContent{ + Category: v.Category, + Name: v.Name, + PromptTitle: v.PromptTitle, + PromptText: v.PromptText, + EntryItems: v.EntryItems, + }) + } + result.AssessContent = assessContent + return &result, nil +} diff --git a/pkg/domain/staff_assess.go b/pkg/domain/staff_assess.go index 226be02..9fff146 100644 --- a/pkg/domain/staff_assess.go +++ b/pkg/domain/staff_assess.go @@ -21,24 +21,27 @@ const ( StaffAssessCompleted StaffAssessStatus = "completed" //已完成 ) -// 记录用户需要的评估项 +// 记录用户需要的评估项目 type StaffAssess struct { - Id int `json:"id"` //id - CompanyId int `json:"companyId"` //公司id - EvaluationProjectId int `json:"evaluationProjectId"` //对应的项目id - CycleId int64 `json:"cycleId"` //对应的周期id - StaffAssessTaskId int `json:"staffAssessTaskId"` //执行评估的任务id - TargetUser StaffDesc `json:"targetUser"` //被评估的目标用户 - TargetDepartment []StaffDepartment `json:"targetDepartment"` //被评估的目标用户所在的部门 - Executor StaffDesc `json:"executor"` //填写评估的用户 - Types StaffAssessType `json:"types"` //填写评估对应的类型 - LinkNodeId int `json:"linkNodeId"` //评估环节对应的id,用于调取评估模板 - Status StaffAssessStatus `json:"status"` //评估的填写状态 - BeginTime time.Time `json:"beginTime"` //开始时间 - EndTime time.Time `json:"endTime"` //截止时间 - CreatedAt time.Time `json:"createdAt"` //数据创建时间 - UpdatedAt time.Time `json:"updatedAt"` //数据更新时间 - DeletedAt *time.Time `json:"deletedAt"` //数据删除时间 + Id int `json:"id"` //id + CompanyId int `json:"companyId"` //公司id + EvaluationProjectId int `json:"evaluationProjectId"` //对应的项目id + EvaluationProjectName string `json:"evaluationProjectName"` //对应的项目名称 + CycleId int64 `json:"cycleId"` //对应的周期id + CycleName string `json:"cycleName"` //对应的周期名称 + StaffAssessTaskId int `json:"staffAssessTaskId"` //执行评估的任务id + TargetUser StaffDesc `json:"targetUser"` //被评估的目标用户 + TargetDepartment []StaffDepartment `json:"targetDepartment"` //被评估的目标用户所在的部门 + Executor StaffDesc `json:"executor"` //填写评估的用户 + Types StaffAssessType `json:"types"` //填写评估对应的类型 + LinkNodeId int `json:"linkNodeId"` //评估环节对应的id,用于调取评估模板 + LinkNodeName string `json:"linkNodeName"` //评估环节对应的id,用于调取评估模板 + Status StaffAssessStatus `json:"status"` //评估的填写状态 + BeginTime time.Time `json:"beginTime"` //开始时间 + EndTime time.Time `json:"endTime"` //截止时间 + CreatedAt time.Time `json:"createdAt"` //数据创建时间 + UpdatedAt time.Time `json:"updatedAt"` //数据更新时间 + DeletedAt *time.Time `json:"deletedAt"` //数据删除时间 } type StaffAssessRepository interface { diff --git a/pkg/domain/staff_assess_content.go b/pkg/domain/staff_assess_content.go index 1f7f220..1086ca5 100644 --- a/pkg/domain/staff_assess_content.go +++ b/pkg/domain/staff_assess_content.go @@ -17,6 +17,11 @@ type StaffAssessContent struct { //TODO } +type AssessContemtRemark struct { + Title string `json:"title"` //comment:"填写标题" + RemarkText string `json:"hintText"` // comment:"填写文本内容" +} + type StaffAssessContentRepository interface { Save(param *StaffAssessContent) (*StaffAssessContent, error) Remove(id int) error diff --git a/pkg/domain/staff_assess_task.go b/pkg/domain/staff_assess_task.go index b0a264d..b10b533 100644 --- a/pkg/domain/staff_assess_task.go +++ b/pkg/domain/staff_assess_task.go @@ -25,18 +25,21 @@ type StaffAssessTask struct { CycleName string `json:"cycleName"` //对应周期的名称 BeginTime time.Time `json:"beginTime"` //绩效考核开始时间 EndTime time.Time `json:"endTime"` //绩效考核截止时间 - StepList []AssessTaskStep `json:"steps"` //考评的流程 + StepList []AssessTaskStep `json:"stepList"` //考评的流程 + ExecutorId []int `json:"executorId"` //参与此次考评的人 CreatedAt time.Time `json:"createdAt"` //数据创建时间 UpdatedAt time.Time `json:"updatedAt"` //数据更新时间 - DeletedAt time.Time `json:"deletedAt"` //数据删除时间 + DeletedAt *time.Time `json:"deletedAt"` //数据删除时间 } //考评的流程 type AssessTaskStep struct { - SortBy int `json:"sortBy"` //排序 - LinkNodeId int `json:"linkNodeId"` //考评的流程id - LinkNodeName string `json:"linkNodeName"` //流程名称 - LinkNodeType int `json:"linkNodeType"` //流程类型 同evaluation_template.go->LinkNode.Type + SortBy int `json:"sortBy"` //排序 + LinkNodeId int `json:"linkNodeId"` //考评的流程id + LinkNodeName string `json:"linkNodeName"` //流程名称 + LinkNodeType int `json:"linkNodeType"` //流程类型 同evaluation_template.go->LinkNode.Type + BeginTime time.Time `json:"beginTime"` //绩效考核开始时间 + EndTime time.Time `json:"endTime"` //绩效考核截止时间 } type StaffAssessTaskRepository interface { diff --git a/pkg/infrastructure/pg/init.go b/pkg/infrastructure/pg/init.go index 8ef7862..c144ad1 100644 --- a/pkg/infrastructure/pg/init.go +++ b/pkg/infrastructure/pg/init.go @@ -2,6 +2,7 @@ package pg import ( "fmt" + "github.com/go-pg/pg/v10" "github.com/go-pg/pg/v10/orm" "github.com/linmadan/egglib-go/persistent/pg/comment" @@ -39,6 +40,8 @@ func init() { &models.EvaluationCycle{}, &models.EvaluationCycleTemplate{}, &models.EvaluationProject{}, + &models.StaffAssess{}, + &models.StaffAssessTask{}, } for _, model := range tables { err := DB.Model(model).CreateTable(&orm.CreateTableOptions{ diff --git a/pkg/infrastructure/pg/models/staff_assess.go b/pkg/infrastructure/pg/models/staff_assess.go index 1d0163b..b52f41b 100644 --- a/pkg/infrastructure/pg/models/staff_assess.go +++ b/pkg/infrastructure/pg/models/staff_assess.go @@ -8,20 +8,24 @@ import ( // 记录用户需要的评估项 type StaffAssess struct { - tableName struct{} `pg:"staff_assess" comment:"记录用户需要的评估项"` - Id int `pg:",pk"` //id - CompanyId int `comment:"公司id"` //公司id - EvaluationProjectId int `comment:"对应的项目id"` //对应的项目id - CycleId int64 `comment:"对应的周期id"` //对应的周期id - TargetUser domain.StaffDesc `comment:"被评估的目标用户"` //被评估的目标用户 - TargetDepartment []domain.StaffDepartment `comment:"被评估的用户所在的部门"` //被评估的用户所在的部门 - Executor domain.StaffDesc `comment:"填写评估的用户"` //填写评估的用户 - Types string `comment:"填写评估对应的类型"` //填写评估对应的类型 - LinkNodeId int `comment:"评估环节id"` - Status string `comment:"评估的填写状态"` //评估的填写状态 - BeginTime time.Time `comment:"开始时间"` //开始时间 - EndTime time.Time `comment:"截止时间"` //截止时间 - CreatedAt time.Time `comment:"数据创建时间"` //数据创建时间 - UpdatedAt time.Time `comment:"数据更新时间"` //数据更新时间 - DeletedAt *time.Time `comment:"数据删除时间"` //数据删除时间 + tableName struct{} `pg:"staff_assess" comment:"记录用户需要的评估项"` + Id int `pg:",pk"` //id + CompanyId int `comment:"公司id"` //公司id + EvaluationProjectId int `comment:"对应的项目id"` //对应的项目id + EvaluationProjectName string + CycleId int64 `comment:"对应的周期id"` //对应的周期id + CycleName string + StaffAssessTaskId int + TargetUser domain.StaffDesc `comment:"被评估的目标用户"` //被评估的目标用户 + TargetDepartment []domain.StaffDepartment `comment:"被评估的用户所在的部门"` //被评估的用户所在的部门 + Executor domain.StaffDesc `comment:"填写评估的用户"` //填写评估的用户 + Types string `comment:"填写评估对应的类型"` //填写评估对应的类型 + LinkNodeId int `comment:"评估环节id"` + LinkNodeName string + Status string `comment:"评估的填写状态"` //评估的填写状态 + BeginTime time.Time `comment:"开始时间"` //开始时间 + EndTime time.Time `comment:"截止时间"` //截止时间 + CreatedAt time.Time `comment:"数据创建时间"` //数据创建时间 + UpdatedAt time.Time `comment:"数据更新时间"` //数据更新时间 + DeletedAt *time.Time `comment:"数据删除时间"` //数据删除时间 } diff --git a/pkg/infrastructure/pg/models/staff_assess_task.go b/pkg/infrastructure/pg/models/staff_assess_task.go index a0106a6..7fa89cf 100644 --- a/pkg/infrastructure/pg/models/staff_assess_task.go +++ b/pkg/infrastructure/pg/models/staff_assess_task.go @@ -1,19 +1,25 @@ package models -import "time" +import ( + "time" + + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain" +) // 执行评估的任务列表 type StaffAssessTask struct { - tableName struct{} `pg:"staff_assess_task" comment:"执行评估的任务列表"` - Id int `pg:",pk"` - CompanyId int `` //公司id - EvaluationProjectId int `` //项目id - EvaluationProjectName string `` //项目名称 - CycleId int64 //对应的周期id - CycleName string //对应周期的名称 - BeginTime time.Time //开始时间 - EndTime time.Time //截止时间 - CreatedAt time.Time //数据创建时间 - UpdatedAt time.Time //数据更新时间 - DeletedAt time.Time //数据删除时间 + tableName struct{} `pg:"staff_assess_task" comment:"执行评估的任务列表"` + Id int `pg:",pk"` + CompanyId int `` //公司id + EvaluationProjectId int `` //项目id + EvaluationProjectName string `` //项目名称 + CycleId int64 //对应的周期id + CycleName string //对应周期的名称 + ExecutorId []int //参与考评的人 + StepList []domain.AssessTaskStep `` //考评的流程 + BeginTime time.Time //开始时间 + EndTime time.Time //截止时间 + CreatedAt time.Time //数据创建时间 + UpdatedAt time.Time //数据更新时间 + DeletedAt *time.Time //数据删除时间 } diff --git a/pkg/infrastructure/repository/pg_department_repository.go b/pkg/infrastructure/repository/pg_department_repository.go index d5f0baa..66255e1 100644 --- a/pkg/infrastructure/repository/pg_department_repository.go +++ b/pkg/infrastructure/repository/pg_department_repository.go @@ -91,9 +91,8 @@ func (repo *DepartmentRepository) FindOne(queryOptions map[string]interface{}) ( func (repo *DepartmentRepository) Find(queryOptions map[string]interface{}) (int, []*domain.Department, error) { tx := repo.transactionContext.PgTx - var dparmentModel []models.Department - query := tx.Model(&dparmentModel). - Limit(20) + dparmentModel := []models.Department{} + query := tx.Model(&dparmentModel).Where("delete_at isnull") if v, ok := queryOptions["id"]; ok { query.Where("id=?", v) } diff --git a/pkg/infrastructure/repository/pg_evaluation_cycle_repository.go b/pkg/infrastructure/repository/pg_evaluation_cycle_repository.go index 3c783e5..c228bd1 100644 --- a/pkg/infrastructure/repository/pg_evaluation_cycle_repository.go +++ b/pkg/infrastructure/repository/pg_evaluation_cycle_repository.go @@ -3,13 +3,14 @@ package repository import ( "errors" "fmt" + "time" + "github.com/go-pg/pg/v10" "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" pgTransaction "github.com/linmadan/egglib-go/transaction/pg" "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain" "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/infrastructure/pg/models" "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/utils" - "time" ) type EvaluationCycleRepository struct { @@ -133,6 +134,16 @@ func (repo *EvaluationCycleRepository) Find(queryOptions map[string]interface{}) query.Offset(v) } + if v, ok := queryOptions["timeStart"]; ok { + t := v.(time.Time) + query.Where("time_start<=?", t) + } + + if v, ok := queryOptions["timeEnd"]; ok { + t := v.(time.Time) + query.Where("time_end>=?", t) + } + count, err := query.SelectAndCount() if err != nil { return 0, nil, err diff --git a/pkg/infrastructure/repository/pg_staff_assess_content_repository.go b/pkg/infrastructure/repository/pg_staff_assess_content_repository.go index eece418..1a5f309 100644 --- a/pkg/infrastructure/repository/pg_staff_assess_content_repository.go +++ b/pkg/infrastructure/repository/pg_staff_assess_content_repository.go @@ -17,7 +17,7 @@ type StaffAssessContentRepository struct { var _ domain.StaffAssessContentRepository = (*StaffAssessContentRepository)(nil) -func NewStaffEvaluationRepository(transactionContext *pgTransaction.TransactionContext) *StaffAssessContentRepository { +func NewStaffAssessContentRepository(transactionContext *pgTransaction.TransactionContext) *StaffAssessContentRepository { return &StaffAssessContentRepository{transactionContext: transactionContext} } @@ -89,7 +89,9 @@ func (repo *StaffAssessContentRepository) Find(queryOptions map[string]interface if v, ok := queryOptions["offset"].(int); ok { query.Offset(v) } - + if v, ok := queryOptions["staffAssessId"]; ok { + query.Where("staff_assess_id=?", v) + } count, err := query.SelectAndCount() if err != nil { return 0, nil, err diff --git a/pkg/infrastructure/repository/pg_staff_assess_repository.go b/pkg/infrastructure/repository/pg_staff_assess_repository.go index 1ec4ddf..bad4f50 100644 --- a/pkg/infrastructure/repository/pg_staff_assess_repository.go +++ b/pkg/infrastructure/repository/pg_staff_assess_repository.go @@ -23,39 +23,49 @@ func NewStaffAssessRepository(transactionContext *pgTransaction.TransactionConte func (repo *StaffAssessRepository) TransformToDomain(d *models.StaffAssess) *domain.StaffAssess { return &domain.StaffAssess{ - Id: d.Id, - CompanyId: d.CompanyId, - EvaluationProjectId: d.EvaluationProjectId, - CycleId: d.CycleId, - TargetUser: d.TargetUser, - TargetDepartment: d.TargetDepartment, - Executor: d.Executor, - Types: domain.StaffAssessType(d.Types), - Status: domain.StaffAssessStatus(d.Status), - BeginTime: d.BeginTime, - EndTime: d.EndTime, - CreatedAt: d.EndTime, - UpdatedAt: d.CreatedAt, - DeletedAt: d.DeletedAt, + Id: d.Id, + CompanyId: d.CompanyId, + EvaluationProjectId: d.EvaluationProjectId, + EvaluationProjectName: d.EvaluationProjectName, + CycleId: d.CycleId, + CycleName: d.CycleName, + StaffAssessTaskId: d.StaffAssessTaskId, + TargetUser: d.TargetUser, + TargetDepartment: d.TargetDepartment, + Executor: d.Executor, + Types: domain.StaffAssessType(d.Types), + LinkNodeId: d.LinkNodeId, + LinkNodeName: d.LinkNodeName, + Status: domain.StaffAssessStatus(d.Status), + BeginTime: d.BeginTime, + EndTime: d.EndTime, + CreatedAt: d.EndTime, + UpdatedAt: d.CreatedAt, + DeletedAt: d.DeletedAt, } } func (repo *StaffAssessRepository) Save(d *domain.StaffAssess) (*domain.StaffAssess, error) { saveModel := models.StaffAssess{ - Id: d.Id, - CompanyId: d.CompanyId, - EvaluationProjectId: d.EvaluationProjectId, - CycleId: d.CycleId, - TargetUser: d.TargetUser, - TargetDepartment: d.TargetDepartment, - Executor: d.Executor, - Types: string(d.Types), - Status: string(d.Status), - BeginTime: d.BeginTime, - EndTime: d.EndTime, - CreatedAt: d.EndTime, - UpdatedAt: d.CreatedAt, - DeletedAt: d.DeletedAt, + Id: d.Id, + CompanyId: d.CompanyId, + EvaluationProjectId: d.EvaluationProjectId, + EvaluationProjectName: d.EvaluationProjectName, + CycleId: d.CycleId, + CycleName: d.CycleName, + StaffAssessTaskId: d.StaffAssessTaskId, + TargetUser: d.TargetUser, + TargetDepartment: d.TargetDepartment, + Executor: d.Executor, + Types: string(d.Types), + LinkNodeId: d.LinkNodeId, + LinkNodeName: d.LinkNodeName, + Status: string(d.Status), + BeginTime: d.BeginTime, + EndTime: d.EndTime, + CreatedAt: d.EndTime, + UpdatedAt: d.CreatedAt, + DeletedAt: d.DeletedAt, } tx := repo.transactionContext.PgTx var err error @@ -107,7 +117,7 @@ func (repo *StaffAssessRepository) Find(queryOptions map[string]interface{}) (in tx := repo.transactionContext.PgTx var m []*models.StaffAssess query := tx.Model(&m). - Where("deleted_at isnull").Limit(20) + Where("deleted_at isnull") if companyId, ok := queryOptions["companyId"]; ok { query.Where("company_id = ?", companyId) } @@ -117,7 +127,26 @@ func (repo *StaffAssessRepository) Find(queryOptions map[string]interface{}) (in if v, ok := queryOptions["offset"].(int); ok { query.Offset(v) } + if v, ok := queryOptions["targetUserId"].(int); ok && v > 0 { + query.Where(`target_user->>'userId'='?'`, v) + } + if v, ok := queryOptions["executorId"].(int); ok && v > 0 { + query.Where(`executor->>'userId'='?'`, v) + } + if v, ok := queryOptions["cycleId"].(int64); ok && v > 0 { + query.Where(`cycle_id=?`, v) + } + if v, ok := queryOptions["staffAssessTaskId"]; ok { + query.Where(`staff_assess_task_id=?`, v) + } + + if v, ok := queryOptions["typesList"].([]string); ok && len(v) > 0 { + query.Where("types in(?)", pg.In(v)) + } + if v, ok := queryOptions["status"].(string); ok && len(v) > 0 { + query.Where("status=?", v) + } count, err := query.SelectAndCount() if err != nil { return 0, nil, err diff --git a/pkg/infrastructure/repository/pg_staff_assess_task_repository.go b/pkg/infrastructure/repository/pg_staff_assess_task_repository.go index f635a2f..eaa1942 100644 --- a/pkg/infrastructure/repository/pg_staff_assess_task_repository.go +++ b/pkg/infrastructure/repository/pg_staff_assess_task_repository.go @@ -31,6 +31,8 @@ func (repo *StaffAssessTaskRepository) TransformToDomain(d *models.StaffAssessTa CycleName: d.CycleName, BeginTime: d.BeginTime, EndTime: d.EndTime, + StepList: d.StepList, + ExecutorId: d.ExecutorId, CreatedAt: d.EndTime, UpdatedAt: d.CreatedAt, DeletedAt: d.DeletedAt, @@ -45,6 +47,8 @@ func (repo *StaffAssessTaskRepository) Save(d *domain.StaffAssessTask) (*domain. EvaluationProjectName: d.EvaluationProjectName, CycleId: d.CycleId, CycleName: d.CycleName, + ExecutorId: d.ExecutorId, + StepList: d.StepList, BeginTime: d.BeginTime, EndTime: d.EndTime, CreatedAt: d.EndTime, @@ -111,7 +115,9 @@ func (repo *StaffAssessTaskRepository) Find(queryOptions map[string]interface{}) if v, ok := queryOptions["offset"].(int); ok { query.Offset(v) } - + if v, ok := queryOptions["executorId"].(int); ok && v > 0 { + query.Where(`executor_id @>'[?]'`, v) + } count, err := query.SelectAndCount() if err != nil { return 0, nil, err diff --git a/pkg/infrastructure/repository/pg_user_repository.go b/pkg/infrastructure/repository/pg_user_repository.go index 7a5e449..2555529 100644 --- a/pkg/infrastructure/repository/pg_user_repository.go +++ b/pkg/infrastructure/repository/pg_user_repository.go @@ -73,7 +73,7 @@ func (repo *UserRepository) Remove(userId []int64) error { func (repo *UserRepository) FindOne(queryOptions map[string]interface{}) (*domain.User, error) { tx := repo.transactionContext.PgTx userModel := models.User{} - query := tx.Model(&userModel) + query := tx.Model(&userModel).Where("deleted_at isnull") if v, ok := queryOptions["id"]; ok { query.Where("id=?", v) } diff --git a/pkg/port/beego/controllers/staff_assess_controller.go b/pkg/port/beego/controllers/staff_assess_controller.go new file mode 100644 index 0000000..cad6e73 --- /dev/null +++ b/pkg/port/beego/controllers/staff_assess_controller.go @@ -0,0 +1,87 @@ +package controllers + +import ( + "github.com/linmadan/egglib-go/core/application" + "github.com/linmadan/egglib-go/web/beego" + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/command" + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/query" + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/staff_assess/service" +) + +type StaffAssessController struct { + beego.BaseController +} + +// 获取我的绩效任务列表 +func (c *StaffAssessController) SearchAssessTaskMe() { + srv := service.NewStaffAssessServeice() + paramReq := &query.SearchAssessMeQuery{} + err := c.BindJSON(paramReq) + if err != nil { + e := application.ThrowError(application.ARG_ERROR, "json 解析错误"+err.Error()) + c.Response(nil, e) + return + } + //TODO 获取当前用户信息 + paramReq.CompanyId = 1 + paramReq.UserId = 1 + data, err := srv.SearchAssessTaskMe(paramReq) + c.Response(data, err) +} + +// 获取我的绩效任务各环节完成情况 +func (c *StaffAssessController) AssessTaskMeDesc() { + srv := service.NewStaffAssessServeice() + paramReq := &query.AssessTaskDescQuery{} + err := c.BindJSON(paramReq) + if err != nil { + e := application.ThrowError(application.ARG_ERROR, "json 解析错误"+err.Error()) + c.Response(nil, e) + return + } + //TODO 获取当前用户信息 + paramReq.CompanyId = 1 + paramReq.UserId = 1 + data, err := srv.AssessTaskDesc(paramReq) + c.Response(data, err) +} + +// 获取个人的自评反馈历史记录列表 +func (c *StaffAssessController) AssessSelfMeList() { + srv := service.NewStaffAssessServeice() + paramReq := &query.AssessSelfListQuery{} + err := c.BindJSON(paramReq) + if err != nil { + e := application.ThrowError(application.ARG_ERROR, "json 解析错误"+err.Error()) + c.Response(nil, e) + return + } + //TODO 获取当前用户信息 + paramReq.CompanyId = 1 + paramReq.UserId = 1 + data, err := srv.AssessSelfList(paramReq) + c.Response(data, err) +} + +// 更具项目评估的配置,创建员工的评估任务,(调试用) +func (c *StaffAssessController) CreateStaffAssessTask() { + srv := service.NewStaffAssessServeice() + paramReq := &command.CreateStaffAssessTask{} + err := c.BindJSON(paramReq) + if err != nil { + e := application.ThrowError(application.ARG_ERROR, "json 解析错误"+err.Error()) + c.Response(nil, e) + return + } + //服务调用,实际由定时任务触发 + data, err := srv.CreateStaffAssessTask(paramReq) + c.Response(data, err) +} + +//获取员工自评详情 + +//保存员工自评填写内容 + +//获取员工邀请的人 + +//保持员工邀请的人 diff --git a/pkg/port/beego/routers/staff_assess_router.go b/pkg/port/beego/routers/staff_assess_router.go new file mode 100644 index 0000000..40208ff --- /dev/null +++ b/pkg/port/beego/routers/staff_assess_router.go @@ -0,0 +1,23 @@ +package routers + +import ( + "github.com/beego/beego/v2/server/web" + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/port/beego/controllers" +) + +func init() { + assessTaskNS := web.NewNamespace("/v1/staff-assess-task", + // web.NSBefore(filters.AllowCors(), middlewares.CheckToken()), + web.NSCtrlPost("/search/me", (*controllers.StaffAssessController).SearchAssessTaskMe), //获取我参与过的评估项目列表 + web.NSCtrlPost("/desc/me", (*controllers.StaffAssessController).AssessTaskMeDesc), //获取我的项目评估进度描述 + web.NSCtrlPost("/", (*controllers.StaffAssessController).CreateStaffAssessTask), //创建员工的评估任务 + ) + // /v1/staff-assess/self/me/list + assessNS := web.NewNamespace("/v1/staff-assess", + // web.NSBefore(filters.AllowCors(), middlewares.CheckToken()), + web.NSCtrlPost("/self/me/list", (*controllers.StaffAssessController).AssessSelfMeList), //获取我的自评反馈列表 + // web.NSCtrlPost("/self/me/info", (*controllers.StaffAssessController).AssessSelfMeList), + ) + web.AddNamespace(assessTaskNS) + web.AddNamespace(assessNS) +}