作者 tangxvhui
1 package adapter 1 package adapter
2 2
3 type DepartmentAdapter struct { 3 type DepartmentAdapter struct {
4 - Id int64 `comment:"部门ID" json:"id"` 4 + Id int64 `comment:"部门ID" json:"id,string"`
5 Name string `comment:"部门名称" json:"name"` 5 Name string `comment:"部门名称" json:"name"`
6 - CompanyId int64 `comment:"公司ID" json:"companyId"`  
7 - ParentId int64 `comment:"父级ID" json:"parentId"` 6 + CompanyId int64 `comment:"公司ID" json:"companyId,string"`
  7 + ParentId int64 `comment:"父级ID" json:"parentId,string"`
8 Departments []*DepartmentAdapter `comment:"子部门" json:"departments"` 8 Departments []*DepartmentAdapter `comment:"子部门" json:"departments"`
9 UserTotal int `comment:"部门用户总数量(包含子部门)" json:"userTotal"` 9 UserTotal int `comment:"部门用户总数量(包含子部门)" json:"userTotal"`
10 } 10 }
1 package command 1 package command
2 2
3 import ( 3 import (
  4 + "fmt"
4 "github.com/beego/beego/v2/core/validation" 5 "github.com/beego/beego/v2/core/validation"
5 "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain" 6 "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
6 ) 7 )
@@ -20,19 +21,24 @@ func (in *UpdateTemplateCommand) Valid(validation *validation.Validation) { @@ -20,19 +21,24 @@ func (in *UpdateTemplateCommand) Valid(validation *validation.Validation) {
20 return 21 return
21 } 22 }
22 23
23 - //if len(in.Name) > 40 {  
24 - // validation.SetError("name", "模板名称最大长度40个字符")  
25 - // return  
26 - //}  
27 - //  
28 - //if len(in.Describe) > 100 {  
29 - // validation.SetError("describe", "备注最大长度100个字符")  
30 - // return  
31 - //}  
32 -  
33 if len(in.LinkNodes) == 0 { 24 if len(in.LinkNodes) == 0 {
34 validation.SetError("linkNodes", "评估模板流程不能为空") 25 validation.SetError("linkNodes", "评估模板流程不能为空")
35 return 26 return
  27 + } else {
  28 + for i := range in.LinkNodes {
  29 + linkNode := in.LinkNodes[i]
  30 + // 填写自评反馈,如果有评估内容时,内容权重相加 = 100%
  31 + if linkNode.Type == domain.LinkNodeSelfAssessment && len(linkNode.NodeContents) > 0 {
  32 + weightTotal := 0.0
  33 + for i2 := range linkNode.NodeContents {
  34 + weightTotal += linkNode.NodeContents[i2].Weight
  35 + }
  36 + if weightTotal != 100 {
  37 + validation.SetError("linkNodes", fmt.Sprintf("权重错误,当前%s的总权重值为:%f(必须等于100)", linkNode.Name, weightTotal))
  38 + return
  39 + }
  40 + }
  41 + }
36 } 42 }
37 43
38 } 44 }
@@ -41,6 +41,7 @@ type NodeContent struct { @@ -41,6 +41,7 @@ type NodeContent struct {
41 PromptText string `json:"promptText" comment:"提示项正文"` 41 PromptText string `json:"promptText" comment:"提示项正文"`
42 EntryItems []*EntryItem `json:"entryItems" comment:"填写项"` 42 EntryItems []*EntryItem `json:"entryItems" comment:"填写项"`
43 Required int `json:"required" comment:"必填项"` 43 Required int `json:"required" comment:"必填项"`
  44 + EvaluatorId int64 `json:"evaluatorId,string" comment:"项目评估人ID ( 0=无评估人、-1=HRBP )"`
44 } 45 }
45 46
46 // LinkNode 评估流程、环节 47 // LinkNode 评估流程、环节
@@ -6,26 +6,28 @@ import ( @@ -6,26 +6,28 @@ import (
6 ) 6 )
7 7
8 type PerformanceApplicationForm struct { 8 type PerformanceApplicationForm struct {
9 - DimensionName string //维度名称  
10 - ModuleName string //模块名称  
11 - Weight string //权重  
12 - Standard string //标准  
13 - Task string //任务、指标  
14 - Definition string //定义 9 + DimensionName string // 维度名称
  10 + ModuleName string // 模块名称
  11 + Weight string // 权重
  12 + Standard string // 标准
  13 + Task string // 任务、指标
  14 + Definition string // 定义
15 Required string // 是否必填 是 否 15 Required string // 是否必填 是 否
  16 + Evaluator string // 项目评估人
16 } 17 }
17 18
18 type PerformanceDimension struct { 19 type PerformanceDimension struct {
19 - Name string `json:"name"` //维度名称  
20 - PerformanceModule []*PerformanceModule `json:"performanceModule"` //模块 20 + Name string `json:"name"` // 维度名称
  21 + PerformanceModule []*PerformanceModule `json:"performanceModule"` // 模块
21 } 22 }
22 23
23 type PerformanceModule struct { 24 type PerformanceModule struct {
24 - ModuleName string `json:"moduleName"` //模块名称  
25 - Weight string `json:"weight"` //权重  
26 - Standard string `json:"standard"` //标准(结构化的成果描述)  
27 - Target []*PerformanceTarget `json:"performanceTarget"` //任务\指标 25 + ModuleName string `json:"moduleName"` // 模块名称
  26 + Weight string `json:"weight"` // 权重
  27 + Standard string `json:"standard"` // 标准(结构化的成果描述)
  28 + Target []*PerformanceTarget `json:"performanceTarget"` // 任务\指标
28 Required int `json:"required"` // 是否必填 29 Required int `json:"required"` // 是否必填
  30 + Evaluator string `json:"evaluator"` // 项目评估人
29 } 31 }
30 32
31 type PerformanceTarget struct { 33 type PerformanceTarget struct {
@@ -35,7 +37,7 @@ type PerformanceTarget struct { @@ -35,7 +37,7 @@ type PerformanceTarget struct {
35 37
36 func LoadPerformanceDimensions(rows [][]string) ([]*PerformanceDimension, error) { 38 func LoadPerformanceDimensions(rows [][]string) ([]*PerformanceDimension, error) {
37 formRows := make([]*PerformanceApplicationForm, 0) 39 formRows := make([]*PerformanceApplicationForm, 0)
38 - var dimensionName, moduleName, taskName, weightName, standardName string 40 + var dimensionName, moduleName, taskName, weightName, standardName, evaluator string
39 required := "是" 41 required := "是"
40 for key, item := range rows { 42 for key, item := range rows {
41 if key < 3 { 43 if key < 3 {
@@ -88,6 +90,13 @@ func LoadPerformanceDimensions(rows [][]string) ([]*PerformanceDimension, error) @@ -88,6 +90,13 @@ func LoadPerformanceDimensions(rows [][]string) ([]*PerformanceDimension, error)
88 required = strings.TrimSpace(item[9]) 90 required = strings.TrimSpace(item[9])
89 } 91 }
90 form.Required = required 92 form.Required = required
  93 +
  94 + // 项目评估人
  95 + if len(item) > 10 && item[10] != "" {
  96 + evaluator = strings.TrimSpace(item[10])
  97 + }
  98 + form.Evaluator = evaluator
  99 +
91 formRows = append(formRows, form) 100 formRows = append(formRows, form)
92 } 101 }
93 dimensions := make([]*PerformanceDimension, 0) 102 dimensions := make([]*PerformanceDimension, 0)
@@ -156,12 +165,17 @@ func loadPerformanceModule(forms []*PerformanceApplicationForm) ([]*PerformanceM @@ -156,12 +165,17 @@ func loadPerformanceModule(forms []*PerformanceApplicationForm) ([]*PerformanceM
156 if err != nil { 165 if err != nil {
157 return modules, err 166 return modules, err
158 } 167 }
  168 + evaluator, err := getEvaluator(item)
  169 + if err != nil {
  170 + return modules, err
  171 + }
159 module := &PerformanceModule{ 172 module := &PerformanceModule{
160 ModuleName: moduleName, 173 ModuleName: moduleName,
161 Weight: weightName, 174 Weight: weightName,
162 Standard: standardName, 175 Standard: standardName,
163 Target: tasks, 176 Target: tasks,
164 Required: required, 177 Required: required,
  178 + Evaluator: evaluator,
165 } 179 }
166 modules = append(modules, module) 180 modules = append(modules, module)
167 } 181 }
@@ -235,6 +249,23 @@ func getRequired(items []*PerformanceApplicationForm) (int, error) { @@ -235,6 +249,23 @@ func getRequired(items []*PerformanceApplicationForm) (int, error) {
235 } 249 }
236 } 250 }
237 251
  252 +// 获取项目评估人
  253 +func getEvaluator(items []*PerformanceApplicationForm) (string, error) {
  254 + if len(items) <= 0 {
  255 + return "", nil
  256 + }
  257 + var prevName string
  258 + for _, item := range items {
  259 + if prevName == "" {
  260 + prevName = item.Evaluator
  261 + }
  262 + if prevName != item.Evaluator {
  263 + return "", errors.New(item.ModuleName + " 对应的项目评估人填不一致")
  264 + }
  265 + }
  266 + return prevName, nil
  267 +}
  268 +
238 // 获取任务 269 // 获取任务
239 func getTasks(items []*PerformanceApplicationForm) ([]*PerformanceTarget, error) { 270 func getTasks(items []*PerformanceApplicationForm) ([]*PerformanceTarget, error) {
240 tasks := make([]*PerformanceTarget, 0) 271 tasks := make([]*PerformanceTarget, 0)
@@ -133,6 +133,9 @@ func (repo *UserRepository) Find(queryOptions map[string]interface{}) (int, []*d @@ -133,6 +133,9 @@ func (repo *UserRepository) Find(queryOptions map[string]interface{}) (int, []*d
133 if v, ok := queryOptions["name"].(string); ok && len(v) > 0 { 133 if v, ok := queryOptions["name"].(string); ok && len(v) > 0 {
134 query.Where("name like ?", fmt.Sprintf("%%%v%%", v)) 134 query.Where("name like ?", fmt.Sprintf("%%%v%%", v))
135 } 135 }
  136 + if v, ok := queryOptions["names"]; ok {
  137 + query.Where("name in(?)", pg.In(v))
  138 + }
136 if v, ok := queryOptions["offset"]; ok { 139 if v, ok := queryOptions["offset"]; ok {
137 if value, ok := v.(int); ok { 140 if value, ok := v.(int); ok {
138 query.Offset(value) 141 query.Offset(value)
@@ -65,6 +65,8 @@ func (controller *ImportController) parseTemplateNodeContent(data []*domain.Perf @@ -65,6 +65,8 @@ func (controller *ImportController) parseTemplateNodeContent(data []*domain.Perf
65 }() 65 }()
66 // 获取当前公司下的默认规则 66 // 获取当前公司下的默认规则
67 ua := middlewares.GetUser(controller.Ctx) 67 ua := middlewares.GetUser(controller.Ctx)
  68 +
  69 + // 系统默认规则确认
68 ruleRepository := factory.CreateEvaluationRuleRepository(map[string]interface{}{"transactionContext": transactionContext}) 70 ruleRepository := factory.CreateEvaluationRuleRepository(map[string]interface{}{"transactionContext": transactionContext})
69 _, rules, err := ruleRepository.Find(map[string]interface{}{"companyId": ua.CompanyId, "sysType": domain.EvaluationSysTypeSystem, "limit": 1}) 71 _, rules, err := ruleRepository.Find(map[string]interface{}{"companyId": ua.CompanyId, "sysType": domain.EvaluationSysTypeSystem, "limit": 1})
70 if err != nil { 72 if err != nil {
@@ -85,6 +87,10 @@ func (controller *ImportController) parseTemplateNodeContent(data []*domain.Perf @@ -85,6 +87,10 @@ func (controller *ImportController) parseTemplateNodeContent(data []*domain.Perf
85 ruleId = rules[0].Id 87 ruleId = rules[0].Id
86 } 88 }
87 89
  90 + // 评估内容主导人名称
  91 + evaluatorNames := make([]string, 0)
  92 + evaluatorMap := map[string]string{}
  93 +
88 for i := range data { 94 for i := range data {
89 dimension := data[i] 95 dimension := data[i]
90 for i2 := range dimension.PerformanceModule { 96 for i2 := range dimension.PerformanceModule {
@@ -122,9 +128,46 @@ func (controller *ImportController) parseTemplateNodeContent(data []*domain.Perf @@ -122,9 +128,46 @@ func (controller *ImportController) parseTemplateNodeContent(data []*domain.Perf
122 128
123 // 必填项 129 // 必填项
124 nc.Required = module.Required 130 nc.Required = module.Required
  131 + // 项目评估人
  132 + if module.Evaluator == "HRBP" {
  133 + nc.EvaluatorId = -1
  134 + } else {
  135 +
  136 + if len(module.Evaluator) > 0 {
  137 + evaluatorNames = append(evaluatorNames, module.Evaluator) // 项目评估人名称数组
  138 + evaluatorMap[nc.Category+nc.Name] = module.Evaluator // k,v = (类别+名称, 项目评估人名称)
  139 + }
  140 + }
  141 +
125 nodeContents = append(nodeContents, nc) 142 nodeContents = append(nodeContents, nc)
126 } 143 }
127 } 144 }
128 145
  146 + if len(evaluatorNames) > 0 {
  147 + userRepository := factory.CreateUserRepository(map[string]interface{}{"transactionContext": transactionContext})
  148 + _, users, err := userRepository.Find(map[string]interface{}{"companyId": ua.CompanyId, "names": evaluatorNames})
  149 + if err != nil {
  150 + return nodeContents
  151 + }
  152 + nameIdMap := map[string]int64{}
  153 + for i := range users {
  154 + nameIdMap[users[i].Name] = users[i].Id
  155 + }
  156 +
  157 + // 名称 -> ID
  158 + var nc *domain.NodeContent
  159 + for i := range nodeContents {
  160 + nc = nodeContents[i]
  161 + if nc.EvaluatorId == -1 { // HRBP
  162 + continue
  163 + }
  164 + if evaluatorName, ok := evaluatorMap[nc.Category+nc.Name]; ok {
  165 + if userId, ok := nameIdMap[evaluatorName]; ok {
  166 + nc.EvaluatorId = userId
  167 + }
  168 + }
  169 + }
  170 + }
  171 +
129 return nodeContents 172 return nodeContents
130 } 173 }