功能:完善用户服务关系展示与组织联动

统一平台、气站和配送点后台的服务关系业务名称展示。
新增气站、配送点、服务人员三级联动及暂未分配语义。
后端补充组织归属、人员角色和启用状态的严格校验。
补充前后端测试、项目文档、操作日志及本机日志忽略规则。
This commit is contained in:
czl231
2026-08-12 00:37:58 +08:00
parent a37b147f5f
commit 6bcde94388
24 changed files with 682 additions and 27 deletions

View File

@@ -226,10 +226,38 @@ func resolveServiceRelation(ctx *gin.Context, request serviceRelationRequest) (u
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
return 0, 0, 0, 0, false
}
if gasBasicID == 0 && deliveryBasicID == 0 && staffAccountID == 0 ||
!common.ValidateOrganizationIDs(gasBasicID, deliveryBasicID, staffAccountID) {
if !validateServiceRelationOrganization(gasBasicID, deliveryBasicID, staffAccountID) {
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
return 0, 0, 0, 0, false
}
return userAccountID, gasBasicID, deliveryBasicID, staffAccountID, true
}
// validateServiceRelationOrganization 读取组织记录并执行服务关系专用的严格归属校验。
func validateServiceRelationOrganization(gasBasicID, deliveryBasicID, staffAccountID uint64) bool {
var delivery models.DeliveryBasic
if deliveryBasicID != 0 {
if err := common.ActiveRecords(impl.DBService).First(&delivery, deliveryBasicID).Error; err != nil {
return false
}
}
var staff models.StaffAccount
if staffAccountID != 0 {
if err := common.ActiveRecords(impl.DBService).First(&staff, staffAccountID).Error; err != nil {
return false
}
}
return serviceRelationOrganizationMatches(gasBasicID, deliveryBasicID, staffAccountID, delivery, staff)
}
// serviceRelationOrganizationMatches 要求配送点、服务人员与当前选择完全一致;全空表示暂未分配。
func serviceRelationOrganizationMatches(gasBasicID, deliveryBasicID, staffAccountID uint64, delivery models.DeliveryBasic, staff models.StaffAccount) bool {
if deliveryBasicID != 0 && delivery.GasBasicID != gasBasicID {
return false
}
if staffAccountID == 0 {
return true
}
validRole := staff.RoleCode == "installer" || staff.RoleCode == "delivery" || staff.RoleCode == "operations"
return validRole && staff.Status == common.StatusEnable && staff.GasBasicID == gasBasicID && staff.DeliveryBasicID == deliveryBasicID
}

View File

@@ -65,3 +65,30 @@ func TestUserAddressUpdateValuesUsesSupportedMap(t *testing.T) {
t.Fatalf("update field count = %d, want 5", len(values))
}
}
// TestServiceRelationOrganizationMatches 验证暂未分配与严格组织一致性规则。
func TestServiceRelationOrganizationMatches(t *testing.T) {
if !serviceRelationOrganizationMatches(0, 0, 0, models.DeliveryBasic{}, models.StaffAccount{}) {
t.Fatal("全空服务关系应允许保存为暂未分配")
}
delivery := models.DeliveryBasic{GasBasicID: 10}
staff := models.StaffAccount{
Entity: models.Entity{Status: 1},
RoleCode: "delivery",
GasBasicID: 10,
DeliveryBasicID: 20,
}
if !serviceRelationOrganizationMatches(10, 20, 30, delivery, staff) {
t.Fatal("完全一致的服务关系被拒绝")
}
if serviceRelationOrganizationMatches(11, 20, 30, delivery, staff) {
t.Fatal("配送点或服务人员气站不一致时不应通过")
}
if serviceRelationOrganizationMatches(10, 0, 30, models.DeliveryBasic{}, staff) {
t.Fatal("服务人员配送点与空选择不一致时不应通过")
}
staff.Status = 2
if serviceRelationOrganizationMatches(10, 20, 30, delivery, staff) {
t.Fatal("停用服务人员不应写入服务关系")
}
}