修复快捷工具无法显示
This commit is contained in:
1 parent
9898962836
commit
2e2b837a20
23 files changed
+1941
-38
No files matched your search
@@ -73,7 +73,11 @@ type compensationItemPayload struct {
|
||||
}
|
||||
|
||||
type compensationSchemePayload struct {
|
||||
EmployeeID uint64 `json:"employee_id"`
|
||||
EmployeeID uint64 `json:"employee_id"`
|
||||
// RankID 职级ID(yz_backend_job_rank.id),0=未指定。
|
||||
// 传 0 时后端会按「员工 → 职位 → 职级」自动带出;带上后按职级的
|
||||
// 标准薪资区间给出参考薪资(base_salary 未填时自动取下限)。
|
||||
RankID uint64 `json:"rank_id"`
|
||||
SchemeName string `json:"scheme_name"`
|
||||
EffectiveDate string `json:"effective_date"`
|
||||
ExpiryDate string `json:"expiry_date"`
|
||||
@@ -299,7 +303,80 @@ func (c *BackendOaCompensationController) SchemeList() {
|
||||
if rows == nil {
|
||||
rows = []models.BackendOaCompensationScheme{}
|
||||
}
|
||||
c.compensationOK(rows)
|
||||
c.compensationOK(compensationSchemeViews(uint64(claims.TenantId), rows))
|
||||
}
|
||||
|
||||
// compensationSchemeView 给单个薪酬方案补上职级信息:
|
||||
// 职级名称与该职级的标准薪资区间,前端据此展示「按职级带出的标准薪资」。
|
||||
func compensationSchemeView(tid uint64, row models.BackendOaCompensationScheme) map[string]interface{} {
|
||||
item := map[string]interface{}{}
|
||||
if b, err := json.Marshal(row); err == nil {
|
||||
_ = json.Unmarshal(b, &item)
|
||||
}
|
||||
item["rank_name"] = ""
|
||||
item["rank_code"] = ""
|
||||
item["rank_level_no"] = 0
|
||||
item["rank_salary_min"] = float64(0)
|
||||
item["rank_salary_max"] = float64(0)
|
||||
if row.RankID > 0 {
|
||||
if rank, ok := JobRankMap(tid)[row.RankID]; ok {
|
||||
item["rank_name"] = rank.RankName
|
||||
item["rank_code"] = rank.RankCode
|
||||
item["rank_level_no"] = rank.LevelNo
|
||||
item["rank_salary_min"] = rank.SalaryMin
|
||||
item["rank_salary_max"] = rank.SalaryMax
|
||||
}
|
||||
}
|
||||
return item
|
||||
}
|
||||
|
||||
// compensationSchemeViews 给薪酬方案列表补上职级信息。
|
||||
func compensationSchemeViews(tid uint64, rows []models.BackendOaCompensationScheme) []map[string]interface{} {
|
||||
list := make([]map[string]interface{}, 0, len(rows))
|
||||
for _, row := range rows {
|
||||
list = append(list, compensationSchemeView(tid, row))
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
// compensationResolveRank 解析薪酬方案使用的职级:
|
||||
// - 显式传了 rank_id:必须属于当前租户,且适用部门要与员工部门一致
|
||||
// (全公司通用职级不受限);
|
||||
// - 没传:按「员工 → 职位 → 职级」自动带出。
|
||||
// 第三个返回值为错误提示,空串表示解析成功。
|
||||
func (c *BackendOaCompensationController) compensationResolveRank(
|
||||
tid uint64, employee *models.BackendEmployee, rankID uint64,
|
||||
) (uint64, models.BackendJobRank, string) {
|
||||
if employee == nil {
|
||||
return 0, models.BackendJobRank{}, "员工不存在或不属于当前租户"
|
||||
}
|
||||
ranks := JobRankMap(tid)
|
||||
|
||||
if rankID == 0 {
|
||||
// 未指定:按员工所在职位带出职级
|
||||
derived := ResolveEmployeeRankID(tid, *employee)
|
||||
if derived == 0 {
|
||||
return 0, models.BackendJobRank{}, ""
|
||||
}
|
||||
rank, ok := ranks[derived]
|
||||
if !ok {
|
||||
return 0, models.BackendJobRank{}, ""
|
||||
}
|
||||
return derived, rank, ""
|
||||
}
|
||||
|
||||
rank, ok := ranks[rankID]
|
||||
if !ok {
|
||||
return 0, models.BackendJobRank{}, "职级不存在或不属于当前租户"
|
||||
}
|
||||
// 职级适用部门必须覆盖员工所在部门
|
||||
if rank.DepartmentID != 0 {
|
||||
departmentID, err := strconv.ParseUint(strings.TrimSpace(compensationString(employee.Department)), 10, 64)
|
||||
if err == nil && departmentID > 0 && rank.DepartmentID != departmentID {
|
||||
return 0, models.BackendJobRank{}, "职级「" + rank.RankName + "」不适用于该员工所在部门"
|
||||
}
|
||||
}
|
||||
return rankID, rank, ""
|
||||
}
|
||||
|
||||
// CreateScheme POST /backend/oa/compensation/schemes
|
||||
@@ -342,9 +419,21 @@ func (c *BackendOaCompensationController) CreateScheme() {
|
||||
if status != 0 {
|
||||
status = 1
|
||||
}
|
||||
// 职级:未指定时按「员工 → 职位 → 职级」自动带出;
|
||||
// 带出后 base_salary 留空则取职级标准薪资下限作为参考值。
|
||||
rankID, rank, rankErr := c.compensationResolveRank(uint64(claims.TenantId), employee, payload.RankID)
|
||||
if rankErr != "" {
|
||||
c.compensationError(400, rankErr)
|
||||
return
|
||||
}
|
||||
baseSalary := compensationMoney(payload.BaseSalary)
|
||||
if baseSalary <= 0 && rank.SalaryMin > 0 {
|
||||
baseSalary = compensationMoney(rank.SalaryMin)
|
||||
}
|
||||
row := &models.BackendOaCompensationScheme{
|
||||
Tid: uint64(claims.TenantId), EmployeeID: payload.EmployeeID, SchemeName: strings.TrimSpace(payload.SchemeName),
|
||||
EffectiveDate: date, ExpiryDate: expiry, BaseSalary: compensationMoney(payload.BaseSalary),
|
||||
Tid: uint64(claims.TenantId), EmployeeID: payload.EmployeeID, RankID: rankID,
|
||||
SchemeName: strings.TrimSpace(payload.SchemeName),
|
||||
EffectiveDate: date, ExpiryDate: expiry, BaseSalary: baseSalary,
|
||||
PostAllowance: compensationMoney(payload.PostAllowance), PerformanceSalary: compensationMoney(payload.PerformanceSalary),
|
||||
TransportAllowance: compensationMoney(payload.TransportAllowance), MealAllowance: compensationMoney(payload.MealAllowance),
|
||||
CommunicationAllowance: compensationMoney(payload.CommunicationAllowance), SocialInsuranceBase: compensationMoney(payload.SocialInsuranceBase),
|
||||
@@ -355,7 +444,7 @@ func (c *BackendOaCompensationController) CreateScheme() {
|
||||
c.compensationError(500, "保存薪酬方案失败")
|
||||
return
|
||||
}
|
||||
c.compensationOK(row)
|
||||
c.compensationOK(compensationSchemeView(uint64(claims.TenantId), *row))
|
||||
}
|
||||
|
||||
// UpdateScheme POST /backend/oa/compensation/schemes/:id
|
||||
@@ -385,10 +474,16 @@ func (c *BackendOaCompensationController) UpdateScheme() {
|
||||
c.compensationError(400, "方案内容无效")
|
||||
return
|
||||
}
|
||||
if _, ok = c.employee(uint64(claims.TenantId), payload.EmployeeID); !ok {
|
||||
employee, ok := c.employee(uint64(claims.TenantId), payload.EmployeeID)
|
||||
if !ok {
|
||||
c.compensationError(400, "员工不存在或不属于当前租户")
|
||||
return
|
||||
}
|
||||
rankID, rank, rankErr := c.compensationResolveRank(uint64(claims.TenantId), employee, payload.RankID)
|
||||
if rankErr != "" {
|
||||
c.compensationError(400, rankErr)
|
||||
return
|
||||
}
|
||||
var expiry *time.Time
|
||||
if strings.TrimSpace(payload.ExpiryDate) != "" {
|
||||
value, dateOK := validCompensationDate(payload.ExpiryDate)
|
||||
@@ -400,7 +495,12 @@ func (c *BackendOaCompensationController) UpdateScheme() {
|
||||
}
|
||||
now := time.Now()
|
||||
row.EmployeeID, row.SchemeName, row.EffectiveDate, row.ExpiryDate = payload.EmployeeID, strings.TrimSpace(payload.SchemeName), date, expiry
|
||||
row.RankID = rankID
|
||||
row.BaseSalary, row.PostAllowance, row.PerformanceSalary = compensationMoney(payload.BaseSalary), compensationMoney(payload.PostAllowance), compensationMoney(payload.PerformanceSalary)
|
||||
// 职级带出:base_salary 未填且职级有标准薪资时取下限作为参考值
|
||||
if row.BaseSalary <= 0 && rank.SalaryMin > 0 {
|
||||
row.BaseSalary = compensationMoney(rank.SalaryMin)
|
||||
}
|
||||
row.TransportAllowance, row.MealAllowance, row.CommunicationAllowance = compensationMoney(payload.TransportAllowance), compensationMoney(payload.MealAllowance), compensationMoney(payload.CommunicationAllowance)
|
||||
row.SocialInsuranceBase, row.HousingFundBase, row.SocialInsuranceRate, row.HousingFundRate = compensationMoney(payload.SocialInsuranceBase), compensationMoney(payload.HousingFundBase), payload.SocialInsuranceRate, payload.HousingFundRate
|
||||
row.Status, row.Remark, row.UpdateTime = payload.Status, strings.TrimSpace(payload.Remark), &now
|
||||
@@ -411,7 +511,7 @@ func (c *BackendOaCompensationController) UpdateScheme() {
|
||||
c.compensationError(500, "更新薪酬方案失败")
|
||||
return
|
||||
}
|
||||
c.compensationOK(row)
|
||||
c.compensationOK(compensationSchemeView(uint64(claims.TenantId), row))
|
||||
}
|
||||
|
||||
// DeleteScheme DELETE /backend/oa/compensation/schemes/:id
|
||||
|
||||
Reference in new issue
Block a user