feat: add backend rule group and permission support

This commit is contained in:
wren
2026-05-06 09:40:37 +08:00
parent 7acbe0f1d9
commit 76ba7e65ed
45 changed files with 6175 additions and 110 deletions
@@ -58,6 +58,15 @@ class AuditServiceImpl(IAuditService):
async with GetAsyncSession() as session:
logger.info(f"触发评查: documentId={DocumentId}, ruleType={RuleType}")
normalizedSpeed = _normalize_speed(Speed)
await session.execute(
text(
"""
ALTER TABLE leaudit_documents
ADD COLUMN IF NOT EXISTS group_id BIGINT NULL
REFERENCES leaudit_evaluation_point_groups(id)
"""
)
)
document = await session.get(LeauditDocument, DocumentId)
if not document:
raise LeauditException(StatusCodeEnum.HTTP_404_NOT_FOUND, "评查文档不存在")
@@ -99,6 +108,7 @@ class AuditServiceImpl(IAuditService):
.where(
LeauditDocumentFile.documentId == DocumentId,
LeauditDocumentFile.isActive.is_(True),
LeauditDocumentFile.fileRole == "primary",
)
.order_by(LeauditDocumentFile.Id.desc())
.limit(1)
@@ -115,30 +125,91 @@ class AuditServiceImpl(IAuditService):
)
latestRunNo = runNoResult.scalar_one_or_none() or 0
bindingResult = await session.execute(
text(
"""
SELECT
rs.id AS rule_set_id,
rs.current_version_id AS rule_version_id,
rv.oss_url AS rule_source_oss_url,
rv.file_sha256 AS rule_source_sha256,
rv.metadata_type_id AS rule_type_id
FROM leaudit_rule_type_bindings b
JOIN leaudit_rule_sets rs ON rs.id = b.rule_set_id
LEFT JOIN leaudit_rule_versions rv ON rv.id = rs.current_version_id
WHERE b.doc_type_id = :doc_type_id
AND b.is_active = true
AND b.region = :region
ORDER BY b.priority DESC, b.id DESC
LIMIT 1
"""
),
{"doc_type_id": document.typeId, "region": document.region},
)
binding = bindingResult.mappings().first()
if not binding or not binding["rule_set_id"] or not binding["rule_version_id"]:
raise LeauditException(StatusCodeEnum.HTTP_400_BAD_REQUEST, "当前文档类型未绑定可用规则版本")
binding = None
if getattr(document, "groupId", None):
groupBindingResult = await session.execute(
text(
"""
SELECT
rs.id AS rule_set_id,
COALESCE(rs.current_version_id, fallback_rv.id) AS rule_version_id,
COALESCE(current_rv.oss_url, fallback_rv.oss_url) AS rule_source_oss_url,
COALESCE(current_rv.file_sha256, fallback_rv.file_sha256) AS rule_source_sha256,
COALESCE(current_rv.metadata_type_id, fallback_rv.metadata_type_id) AS rule_type_id
FROM leaudit_rule_group_bindings rgb
JOIN leaudit_rule_sets rs ON rs.id = rgb.rule_set_id
LEFT JOIN leaudit_rule_versions current_rv ON current_rv.id = rs.current_version_id
LEFT JOIN LATERAL (
SELECT
rv.id,
rv.oss_url,
rv.file_sha256,
rv.metadata_type_id
FROM leaudit_rule_versions rv
WHERE rv.rule_set_id = rs.id
AND rv.status IN ('published', 'rollback')
ORDER BY rv.version_seq DESC, rv.id DESC
LIMIT 1
) fallback_rv ON TRUE
WHERE rgb.group_id = :group_id
AND rgb.is_active = TRUE
AND rgb.deleted_at IS NULL
ORDER BY rgb.priority DESC, rgb.id ASC
LIMIT 1
"""
),
{"group_id": int(document.groupId)},
)
binding = groupBindingResult.mappings().first()
if not binding or not binding["rule_set_id"] or not binding["rule_version_id"]:
raise LeauditException(StatusCodeEnum.HTTP_400_BAD_REQUEST, "当前子类型未绑定可执行规则集,请先检查二级分组规则配置")
if binding is None:
bindingResult = await session.execute(
text(
"""
SELECT
rs.id AS rule_set_id,
COALESCE(rs.current_version_id, fallback_rv.id) AS rule_version_id,
COALESCE(current_rv.oss_url, fallback_rv.oss_url) AS rule_source_oss_url,
COALESCE(current_rv.file_sha256, fallback_rv.file_sha256) AS rule_source_sha256,
COALESCE(current_rv.metadata_type_id, fallback_rv.metadata_type_id) AS rule_type_id
FROM leaudit_rule_type_bindings b
JOIN leaudit_rule_sets rs ON rs.id = b.rule_set_id
LEFT JOIN leaudit_rule_versions current_rv ON current_rv.id = rs.current_version_id
LEFT JOIN LATERAL (
SELECT
rv.id,
rv.oss_url,
rv.file_sha256,
rv.metadata_type_id
FROM leaudit_rule_versions rv
WHERE rv.rule_set_id = rs.id
AND rv.status IN ('published', 'rollback')
ORDER BY rv.version_seq DESC, rv.id DESC
LIMIT 1
) fallback_rv ON TRUE
WHERE b.doc_type_id = :doc_type_id
AND b.is_active = true
AND b.deleted_at IS NULL
AND (
b.region = :region
OR b.region = 'default'
OR b.region IS NULL
OR b.region = ''
)
ORDER BY
CASE WHEN b.region = :region THEN 0 ELSE 1 END,
b.priority DESC,
b.id DESC
LIMIT 1
"""
),
{"doc_type_id": document.typeId, "region": document.region},
)
binding = bindingResult.mappings().first()
if not binding or not binding["rule_set_id"] or not binding["rule_version_id"]:
raise LeauditException(StatusCodeEnum.HTTP_400_BAD_REQUEST, "当前文档类型未绑定可用规则版本")
triggerSource = f"{'retry' if Force else 'upload'}:{normalizedSpeed}"