修复快捷工具无法显示

This commit is contained in:
hero920103 committed 2026-10-30 17:29:28 +08:00
1 parent 9898962836
commit 2e2b837a20
23 files changed
+1941 -38

No files matched your search

+107 -7
View File
@@ -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