修复工作人员资质关联与角色过滤
按安装、配送、运维菜单显式过滤工作人员,锁定资质所有者并使用姓名和角色回显。 扩展工作人员状态与多角色查询,补充权限校验、回归测试、操作日志和项目文档。
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package staff
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
@@ -12,23 +13,80 @@ import (
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// ListStaff 查询服务人员分页列表。
|
||||
func ListStaff(ctx *gin.Context) {
|
||||
roleCode := strings.TrimSpace(ctx.Query("role_code"))
|
||||
if roleCode == "" {
|
||||
common.ListPage[models.StaffAccount](ctx)
|
||||
return
|
||||
type staffListFilters struct {
|
||||
RoleCodes []string
|
||||
Status *int
|
||||
WorkStatus string
|
||||
}
|
||||
|
||||
// parseStaffListFilters 将工作人员列表查询参数收敛为闭集条件,拒绝含糊或冲突值。
|
||||
func parseStaffListFilters(roleCode, roleCodes, status, workStatus string) (staffListFilters, bool) {
|
||||
filters := staffListFilters{}
|
||||
roleCode = strings.TrimSpace(roleCode)
|
||||
roleCodes = strings.TrimSpace(roleCodes)
|
||||
if roleCode != "" && roleCodes != "" {
|
||||
return filters, false
|
||||
}
|
||||
if !validStaffRole(roleCode) {
|
||||
if roleCode != "" {
|
||||
filters.RoleCodes = []string{roleCode}
|
||||
} else if roleCodes != "" {
|
||||
seen := map[string]bool{}
|
||||
for _, value := range strings.Split(roleCodes, ",") {
|
||||
value = strings.TrimSpace(value)
|
||||
if value == "" || seen[value] {
|
||||
return staffListFilters{}, false
|
||||
}
|
||||
seen[value] = true
|
||||
filters.RoleCodes = append(filters.RoleCodes, value)
|
||||
}
|
||||
}
|
||||
for _, value := range filters.RoleCodes {
|
||||
if !validStaffRole(value) {
|
||||
return staffListFilters{}, false
|
||||
}
|
||||
}
|
||||
status = strings.TrimSpace(status)
|
||||
if status != "" {
|
||||
value, err := strconv.Atoi(status)
|
||||
if err != nil || !common.IsGenericRecordStatus(value) || value == common.StatusArchived {
|
||||
return staffListFilters{}, false
|
||||
}
|
||||
filters.Status = &value
|
||||
}
|
||||
workStatus = strings.TrimSpace(workStatus)
|
||||
if workStatus != "" && !validWorkStatus(workStatus) {
|
||||
return staffListFilters{}, false
|
||||
}
|
||||
filters.WorkStatus = workStatus
|
||||
return filters, true
|
||||
}
|
||||
|
||||
// ListStaff 查询服务人员分页列表,并应用调用方显式声明的角色与在岗状态条件。
|
||||
func ListStaff(ctx *gin.Context) {
|
||||
filters, ok := parseStaffListFilters(
|
||||
ctx.Query("role_code"),
|
||||
ctx.Query("role_codes"),
|
||||
ctx.Query("status"),
|
||||
ctx.Query("work_status"),
|
||||
)
|
||||
if !ok {
|
||||
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
|
||||
return
|
||||
}
|
||||
page, size := common.PageSize(ctx)
|
||||
var list []models.StaffAccount
|
||||
var total int64
|
||||
query := common.ApplyKeywordFilter(ctx,
|
||||
common.ActiveRecords(impl.DBService.Model(&models.StaffAccount{})).Where("role_code = ?", roleCode),
|
||||
&models.StaffAccount{})
|
||||
query := common.ActiveRecords(impl.DBService.Model(&models.StaffAccount{}))
|
||||
if len(filters.RoleCodes) > 0 {
|
||||
query = query.Where("role_code IN ?", filters.RoleCodes)
|
||||
}
|
||||
if filters.Status != nil {
|
||||
query = query.Where("status = ?", *filters.Status)
|
||||
}
|
||||
if filters.WorkStatus != "" {
|
||||
query = query.Where("work_status = ?", filters.WorkStatus)
|
||||
}
|
||||
query = common.ApplyKeywordFilter(ctx, query, &models.StaffAccount{})
|
||||
if err := query.Count(&total).Error; err != nil {
|
||||
infra.Response.Error(ctx, err)
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user