作者 Your Name

Merge branch 'dev-tangxvhui' into test

package service
import (
"fmt"
"strings"
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/infrastructure/dao"
)
// 员工绩效-综合管理-导出绩效指标
// excel表头部字段
type headerLevel struct {
Name string
Filter map[string]int
Child []headerLevel
}
// 添加下一层级的字段
func (h *headerLevel) addChild(name string) (child *headerLevel) {
cIndex, ok := h.Filter[name]
if !ok {
h.Child = append(h.Child, headerLevel{
Name: name,
Filter: map[string]int{},
Child: []headerLevel{},
})
h.Filter[name] = len(h.Child) - 1
cIndex = h.Filter[name]
}
return &h.Child[cIndex]
}
// 获取表头的所有列表名
func (h *headerLevel) collectAllColumn(all *[][]string) {
for _, v := range h.Child {
v.collectColumn(&v, all, nil)
}
}
func (h *headerLevel) collectColumn(child *headerLevel, columns *[][]string, column *[]string) {
if column == nil {
column = &[]string{}
}
*column = append(*column, h.Name)
for _, v := range child.Child {
if len(v.Child) > 0 {
v.collectColumn(&v, columns, column)
}
if len(v.Child) == 0 {
item := make([]string, len(*column))
copy(item, *column)
item = append(item, v.Name)
*columns = append(*columns, item)
}
}
}
type exportData struct {
userName []string //员工的名称列表 ,对应excel文件的多个sheet
usrIdMap map[string]string
userDayMap map[string][]string //每个员工对应的日期列表 key=员工名称 value= 日期列表
tableHeader map[string]*headerLevel //每个员工数据表格对应表头 key=员工名称
data map[string]*strings.Builder //每个员工表头对应的评估填写的数据 key=员工名称+日期+表头
data2 map[string]string //每个员工评估项的标准描述
data3 map[string]string //每个员工评估项的标准权重
}
// 设置表格头部字段。和对应的员工列表
func (e *exportData) setCategoryNameList(param []dao.ContentCategoryName) {
for _, v := range param {
if _, ok := e.usrIdMap[v.TargetUserId]; !ok {
if _, ok := e.tableHeader[v.TargetUserName]; ok {
//出现重名,id不同但名称相同
uname := fmt.Sprintf("%s%d", v.TargetUserName, len(e.usrIdMap))
e.usrIdMap[v.TargetUserId] = uname
} else {
e.usrIdMap[v.TargetUserId] = v.TargetUserName
}
e.userName = append(e.userName, e.usrIdMap[v.TargetUserId])
}
userName := e.usrIdMap[v.TargetUserId]
if _, ok := e.tableHeader[userName]; !ok {
e.tableHeader[userName] = &headerLevel{
Name: "个人绩效评估等级统计表",
Filter: map[string]int{},
Child: []headerLevel{},
}
}
child := e.tableHeader[userName].addChild(v.Category) //第一级,"分类"
if v.Weight == 0 {
child = child.addChild("加分项") //第二级 '得分项' '加分项'
} else {
child = child.addChild("得分项") //第二级 '得分项' '加分项'
}
child.addChild(v.Name) //第三级 评估项名称
}
}
func (e *exportData) setData(param []*dao.ExportData2) {
userName := ""
key := ""
userDay := map[string]struct{}{}
for _, v := range param {
//员工填写的评估内容
if _, ok := e.usrIdMap[v.TargetUserId]; !ok {
continue
}
userName = e.usrIdMap[v.TargetUserId]
if v.Weight == 0 {
key = fmt.Sprintf("%s-%s-加分项-%s-%s", userName, v.BeginDay, v.Category, v.ContentName)
e.data3[key] = ""
} else {
key = fmt.Sprintf("%s-%s-得分项-%s-%s", userName, v.BeginDay, v.Category, v.ContentName)
e.data3[key] = fmt.Sprintf("%.2f %%", v.Weight)
}
e.data[key] = &strings.Builder{}
e.data[key].WriteString(v.Value + "\n") //填写的等级
for _, vv := range v.Remark {
e.data[key].WriteString(vv.Definition + "\n")
e.data[key].WriteString(vv.RemarkText + "\n")
}
e.data2[key] = v.PromptText
if _, ok := userDay[userName+v.BeginDay]; !ok {
userDay[userName+v.BeginDay] = struct{}{}
e.userDayMap[userName] = append(e.userDayMap[userName], v.BeginDay)
}
}
}
... ...
... ... @@ -211,13 +211,6 @@ func (srv StaffAssessServeice) ListUserAssessContentCycleDay(param *query.ListAs
return &result, nil
}
type excelTableHeader struct {
Level1 string
Level2 string
Level3 string
Level4 string
}
func (srv StaffAssessServeice) ExportUserAssess(param *query.ListAssessContentCycleDay) (*excelize.File, error) {
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
... ... @@ -590,3 +583,68 @@ func (srv StaffAssessServeice) AnalysisData(param *query.ListAssessContentCycleD
}
return &result, nil
}
func (srv StaffAssessServeice) ExportUserAssess2(param *query.SummaryCommand) (*excelize.File, 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()
}()
roleRepo := factory.CreateRoleRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
roleUserRepo := factory.CreateRoleUserRepository(map[string]interface{}{
"transactionContext": transactionContext,
})
_, roleList, err := roleRepo.Find(map[string]interface{}{
"type": domain.RoleTypeSystem,
"companyId": param.CompanyId,
})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取用户的角色信息列表"+err.Error())
}
_, userRoleList, err := roleUserRepo.Find(map[string]interface{}{
"companyId": param.CompanyId,
"userId": param.OperatorId,
})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取用户的角色信息列表"+err.Error())
}
hrbp := -1
for _, v := range userRoleList {
for _, v2 := range roleList {
if v.RoleId == v2.Id {
hrbp = 1
break
}
}
if hrbp == 1 {
break
}
}
// assessDao := dao.NewStaffAssessDao(map[string]interface{}{
// "transactionContext": transactionContext,
// })
// 获取所有的评估项
// categoryNameList, err := assessDao.SearchContentCategoryName(param.CompanyId, param.CycleId, param.OperatorId, hrbp)
// if err != nil {
// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
// }
// categoryNameTree := map[string]headerLevel{}
// userNameMap := map[string]struct{}{} //处理员工重名
// userIdMap := map[string]string{} //映射员工id和员工名称
// userNameList := []string{} //员工名称列表
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
// tableHeader := excelTableHeader{}
return nil, nil
}
... ...
package service
// excel表头部字段
type excelTableHeader struct {
Level1 string
Level2 string
Level3 string
Level4 string
}
... ...
... ... @@ -209,7 +209,6 @@ type UserAssessContent struct {
type SearchConditin1 struct {
CompanyId int //公司id
AssessId int //评估任务id
CycleId int //周期id
BeginDay string //评估的日期
TargetUserName string //被评估人的名称
... ... @@ -289,14 +288,14 @@ func (d *StaffAssessDao) CountUserAssess(param SearchConditin1) (int, error) {
}
// 生成的sql 根据用户的查看权限 ,获取可查看的评估任务,
// companyId int 公司id
// cycleId int, 评估周期id
// userId int, 用户id,谁要查看数据
// beginDay string, 周期中执行项目的时间
// hrbp 是否搜索HRBP角色的用户可以查看,1:是;-1:否
// limit int, 分页条数
// offset int 分页偏移
// assessType string 评估的类型
// companyId int 公司id (必填)
// cycleId int, 评估周期id (必填)
// userId int, 用户id,谁要查看数据 (必填)
// beginDay string, 周期中执行项目的时间 (选填)
// hrbp 是否搜索HRBP角色的用户可以查看,1:是;-1:否 (必填)
// limit int, 分页条数 (必填)
// offset int 分页偏移 (必填)
// assessType string 评估的类型 (选填)
func (d *StaffAssessDao) useTStaffAssess(companyId int, cycleId int, userId int, beginDay string, hrbp int, limit int, offset int, assessType string) string {
sqlstr := `
set time zone 'PRC';
... ... @@ -340,6 +339,7 @@ func (d *StaffAssessDao) useTStaffAssess(companyId int, cycleId int, userId int,
t_staff_assess_0 as (
select staff_assess.id as assess_id,
staff_assess.cycle_id,
staff_assess.cycle_name,
staff_assess.target_user->>'userId' as target_user_id,
staff_assess.target_user->>'userName' as target_user_name,
to_char(staff_assess.begin_time,'YYYY-MM-DD') as begin_day,
... ... @@ -348,8 +348,8 @@ func (d *StaffAssessDao) useTStaffAssess(companyId int, cycleId int, userId int,
join staff_assess_task on staff_assess.staff_assess_task_id = staff_assess_task.id
and staff_assess_task.deleted_at isnull
where staff_assess.cycle_id = %d
and to_char(staff_assess.begin_time,'YYYY-MM-DD')='%s'
and staff_assess."types" ='%s'
%s
-- 根据条件拼接查询条件
),
-- 根据查看权限过滤合并数据
t_staff_assess_1 as (
... ... @@ -357,6 +357,7 @@ func (d *StaffAssessDao) useTStaffAssess(companyId int, cycleId int, userId int,
t_staff_assess_0.target_user_id,
t_staff_assess_0.target_user_name,
t_staff_assess_0.begin_day,
t_staff_assess_0.cycle_name,
t_staff_assess_0.cycle_id
from t_staff_assess_0
join t_project_3 on t_staff_assess_0.evaluation_project_id = t_project_3.project_id
... ... @@ -364,6 +365,7 @@ func (d *StaffAssessDao) useTStaffAssess(companyId int, cycleId int, userId int,
t_staff_assess_0.target_user_id,
t_staff_assess_0.target_user_name,
t_staff_assess_0.begin_day,
t_staff_assess_0.cycle_name,
t_staff_assess_0.cycle_id
from t_staff_assess_0
join t_user_1 on t_staff_assess_0.target_user_id=t_user_1.user_id
... ... @@ -371,10 +373,25 @@ func (d *StaffAssessDao) useTStaffAssess(companyId int, cycleId int, userId int,
limit %d offset %d
)
`
//根据条件拼接查询条件
staffAssessWhere := map[string]string{
"beginDay": ` and to_char(staff_assess.begin_time,'YYYY-MM-DD') like '%s' `,
"assessType": ` and staff_assess."types" ='%s' `,
}
params := []interface{}{
companyId, userId, cycleId, hrbp, cycleId, userId, cycleId, beginDay, assessType, limit, offset,
companyId, userId, cycleId, hrbp, cycleId, userId, cycleId,
}
if len(beginDay) > 0 {
str := fmt.Sprintf(staffAssessWhere["beginDay"]+"\n", beginDay)
params = append(params, str)
}
if len(assessType) > 0 {
str := fmt.Sprintf(staffAssessWhere["assessType"]+"\n", assessType)
params = append(params, str)
}
params = append(params, limit, offset)
sqlstr = fmt.Sprintf(sqlstr, params...)
return sqlstr
}
... ... @@ -781,6 +798,8 @@ func (d *StaffAssessDao) MemberPerformanceIndicator(likeUserName string, company
type ExportData1 struct {
AssessId string
ContentId int
CycleId string //周期id
CycleName string //周期名称
TargetUserId string //被评估人的id
TargetUserName string //被评估人的名称
BeginDay string //评估的日期
... ... @@ -803,11 +822,20 @@ func (d *StaffAssessDao) ExportDataUserAssess(param SearchConditin1) ([]ExportDa
param.Limit = 5000
}
sqlStr := ` select
t_staff_assess_1.target_user_id,t_staff_assess_1.target_user_name,t_staff_assess_1.begin_day,
t_staff_assess_1.assess_id,staff_assess_content.id as content_id,
staff_assess_content.value ,staff_assess_content.sort_by ,
staff_assess_content.category ,staff_assess_content."name" as content_name ,
staff_assess_content.weight,staff_assess_content.prompt_text ,staff_assess_content.remark
t_staff_assess_1.target_user_id,
t_staff_assess_1.target_user_name,
t_staff_assess_1.begin_day,
t_staff_assess_1.assess_id,
t_staff_assess_1.cycle_id,
t_staff_assess_1.cycle_name,
staff_assess_content.id as content_id,
staff_assess_content.value ,
staff_assess_content.sort_by ,
staff_assess_content.category ,
staff_assess_content."name" as content_name ,
staff_assess_content.weight,
staff_assess_content.prompt_text ,
staff_assess_content.remark
from t_staff_assess_1
left join staff_assess_content on t_staff_assess_1.assess_id = staff_assess_content.staff_assess_id
where 1=1
... ... @@ -890,3 +918,99 @@ func (d *StaffAssessDao) CountAssessCycleMe(executorId int, companyId int) (int,
_, err := tx.QueryOne(pg.Scan(&result), sqlStr, condition...)
return result, err
}
// 评估的指标
type ContentCategoryName struct {
Category string //指标分类
Name string //指标名称
Weight float64 //指标权重
CycleId string //周期id
CycleName string //周期名称
TargetUserId string //评估的目标员工id
TargetUserName string //评估的目标员工名称
Cnt int //排序
}
// 员工绩效-综合管理-导出绩效指标
// 抽取出评估的指标
func (d *StaffAssessDao) SearchContentCategoryName(companyId int, cycleId int, userId int, hrbp int) ([]ContentCategoryName, error) {
sqlStr := `
select
staff_assess_content.category,
staff_assess_content."name" ,
staff_assess_content.weight ,
staff_assess.cycle_id ,
staff_assess.cycle_name,
t_staff_assess_1.target_user_id,
t_staff_assess_1.target_user_name,
sum(
case
when staff_assess_content.value isnull then 0
when staff_assess_content.value='' then 0
ELSE 1
END) as cnt
from staff_assess_content
join t_staff_assess_1 on staff_assess_content.staff_assess_id = t_staff_assess_1.id
group by staff_assess_content.category,
staff_assess_content."name" ,
staff_assess.cycle_id ,
staff_assess.cycle_name,
staff_assess_content.weight ,
target_user_id,target_user_name
order by cnt desc,user_id
`
sqlStr0 := d.useTStaffAssess(companyId, cycleId, userId, "", hrbp, 0, 5000, string(domain.AssessSelf))
sqlStr = sqlStr0 + sqlStr
tx := d.transactionContext.PgTx
result := []ContentCategoryName{}
_, err := tx.Query(&result, sqlStr)
return result, err
}
type ExportData2 struct {
CycleId string `pg:"cycle_id"` //周期id
CycleName string `pg:"cycle_name"` //周期名称
TargetUserId string `pg:"target_user_id"` //被评估人的id
TargetUserName string `pg:"target_user_name"` //被评估人的名称
BeginDay string `pg:"begin_day"` //评估的日期
Value string `pg:"value"` //评估填写的值
Category string `pg:"category"` //评估项分类
ContentName string `pg:"content_name"` //评估项名称
Weight float64 `pg:"weight"` //权重
PromptText string `pg:"prompt_text"` //评估标准
Remark []domain.AssessContemtRemark `pg:"remark"`
}
// 员工绩效-综合管理-导出绩效指标
// companyId int 公司id
// cycleId int, 评估周期id
// userId int, 用户id,谁要查看数据
// hrbp 是否搜索HRBP角色的用户可以查看,1:是;-1:否
func (d *StaffAssessDao) ExportDataUserAssess2(companyId int, cycleId int, operaterId int, hrbp int) ([]*ExportData2, error) {
sqlStr := ` select
t_staff_assess_1.target_user_id,
t_staff_assess_1.target_user_name,
t_staff_assess_1.begin_day,
t_staff_assess_1.cycle_id,
t_staff_assess_1.cycle_name,
staff_assess_content.value ,
staff_assess_content.category ,
staff_assess_content."name" as content_name ,
staff_assess_content.weight,
staff_assess_content.prompt_text ,
staff_assess_content.remark
from t_staff_assess_1
left join staff_assess_content on t_staff_assess_1.assess_id = staff_assess_content.staff_assess_id
where 1=1
`
condition := []interface{}{}
//加入排序
sqlStr += ` order by t_staff_assess_1.begin_day`
//获取前置sql语句
sqlStr0 := d.useTStaffAssess(companyId, cycleId, operaterId, "", hrbp, 5000, 0, string(domain.AssessSelf))
sqlStr = sqlStr0 + sqlStr
tx := d.transactionContext.PgTx
result := []*ExportData2{}
_, err := tx.Query(&result, sqlStr, condition...)
return result, err
}
... ...