强化配送订单合同调度约束
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
// 功能描述:提供平台工作人员资源管理与受控候选筛选。
|
||||
// 版本:v1.1.0
|
||||
package staff
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
"git.apinb.com/bsm-sdk/core/infra"
|
||||
@@ -14,9 +17,10 @@ import (
|
||||
)
|
||||
|
||||
type staffListFilters struct {
|
||||
RoleCodes []string
|
||||
Status *int
|
||||
WorkStatus string
|
||||
RoleCodes []string
|
||||
Status *int
|
||||
WorkStatus string
|
||||
ValidCredentialOnly bool
|
||||
}
|
||||
|
||||
type staffOrganizationFilters struct {
|
||||
@@ -27,7 +31,7 @@ type staffOrganizationFilters struct {
|
||||
}
|
||||
|
||||
// parseStaffListFilters 将工作人员列表查询参数收敛为闭集条件,拒绝含糊或冲突值。
|
||||
func parseStaffListFilters(roleCode, roleCodes, status, workStatus string) (staffListFilters, bool) {
|
||||
func parseStaffListFilters(roleCode, roleCodes, status, workStatus, validCredentialOnly string) (staffListFilters, bool) {
|
||||
filters := staffListFilters{}
|
||||
roleCode = strings.TrimSpace(roleCode)
|
||||
roleCodes = strings.TrimSpace(roleCodes)
|
||||
@@ -65,6 +69,11 @@ func parseStaffListFilters(roleCode, roleCodes, status, workStatus string) (staf
|
||||
return staffListFilters{}, false
|
||||
}
|
||||
filters.WorkStatus = workStatus
|
||||
validCredentialOnly = strings.TrimSpace(validCredentialOnly)
|
||||
if validCredentialOnly != "" && validCredentialOnly != "1" {
|
||||
return staffListFilters{}, false
|
||||
}
|
||||
filters.ValidCredentialOnly = validCredentialOnly == "1"
|
||||
return filters, true
|
||||
}
|
||||
|
||||
@@ -103,6 +112,7 @@ func ListStaff(ctx *gin.Context) {
|
||||
ctx.Query("role_codes"),
|
||||
ctx.Query("status"),
|
||||
ctx.Query("work_status"),
|
||||
ctx.Query("valid_credential_only"),
|
||||
)
|
||||
if !ok {
|
||||
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
|
||||
@@ -131,6 +141,14 @@ func ListStaff(ctx *gin.Context) {
|
||||
if filters.WorkStatus != "" {
|
||||
query = query.Where("work_status = ?", filters.WorkStatus)
|
||||
}
|
||||
if filters.ValidCredentialOnly {
|
||||
now := time.Now()
|
||||
query = query.Where(
|
||||
"EXISTS (SELECT 1 FROM staff_credential WHERE staff_credential.staff_account_id = staff_account.id AND staff_credential.status = ? AND (staff_credential.expired_at IS NULL OR staff_credential.expired_at > ?))",
|
||||
common.StatusEnable,
|
||||
now,
|
||||
)
|
||||
}
|
||||
if organizationFilters.GasIdentity != "" {
|
||||
query = query.Where(
|
||||
"gas_basic_id IN (SELECT id FROM gas_basic WHERE identity = ? AND status <> ?)",
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
// 功能描述:验证工作人员角色、状态和组织候选筛选规则。
|
||||
// 版本:v1.1.0
|
||||
package staff
|
||||
|
||||
import "testing"
|
||||
@@ -25,30 +27,34 @@ func TestStaffRoleIsClosedEnumeration(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestStaffListFiltersAcceptExplicitBusinessScopes(t *testing.T) {
|
||||
filters, ok := parseStaffListFilters("delivery", "", "1", "on_duty")
|
||||
filters, ok := parseStaffListFilters("delivery", "", "1", "on_duty", "1")
|
||||
if !ok || len(filters.RoleCodes) != 1 || filters.RoleCodes[0] != "delivery" {
|
||||
t.Fatal("delivery assignment filters were rejected")
|
||||
}
|
||||
if filters.Status == nil || *filters.Status != 1 || filters.WorkStatus != "on_duty" {
|
||||
t.Fatal("staff status filters were not preserved")
|
||||
}
|
||||
filters, ok = parseStaffListFilters("", "installer,delivery,operations", "1", "")
|
||||
if !filters.ValidCredentialOnly {
|
||||
t.Fatal("有效资质过滤条件未保留")
|
||||
}
|
||||
filters, ok = parseStaffListFilters("", "installer,delivery,operations", "1", "", "")
|
||||
if !ok || len(filters.RoleCodes) != 3 {
|
||||
t.Fatal("multi-role service-relation filters were rejected")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStaffListFiltersRejectAmbiguousOrUnknownValues(t *testing.T) {
|
||||
tests := [][4]string{
|
||||
{"delivery", "installer,delivery", "", ""},
|
||||
{"", "delivery,delivery", "", ""},
|
||||
{"admin", "", "", ""},
|
||||
{"", "", "3", ""},
|
||||
{"", "", "enabled", ""},
|
||||
{"", "", "", "available"},
|
||||
tests := [][5]string{
|
||||
{"delivery", "installer,delivery", "", "", ""},
|
||||
{"", "delivery,delivery", "", "", ""},
|
||||
{"admin", "", "", "", ""},
|
||||
{"", "", "3", "", ""},
|
||||
{"", "", "enabled", "", ""},
|
||||
{"", "", "", "available", ""},
|
||||
{"", "", "", "", "true"},
|
||||
}
|
||||
for _, test := range tests {
|
||||
if _, ok := parseStaffListFilters(test[0], test[1], test[2], test[3]); ok {
|
||||
if _, ok := parseStaffListFilters(test[0], test[1], test[2], test[3], test[4]); ok {
|
||||
t.Fatalf("invalid staff filters were accepted: %#v", test)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user