Merge branch 'test' of http://gitlab.fjmaimaimai.com/allied-creation/performance into test
正在显示
7 个修改的文件
包含
110 行增加
和
26 行删除
| 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 | } |
不能预览此文件类型
-
请 注册 或 登录 后发表评论