fix: 补齐知识库元数据管理与生命周期校验
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from app.services.redis_client import get_sync_redis_client
|
||||
|
||||
|
||||
class KnowledgeCatalogCacheService:
|
||||
"""Central invalidation point for current and future KnowledgeList caches."""
|
||||
|
||||
VERSION_KEY = "knowledge:catalog:version"
|
||||
|
||||
@classmethod
|
||||
def invalidate(cls) -> None:
|
||||
client = get_sync_redis_client()
|
||||
if client is None:
|
||||
return
|
||||
try:
|
||||
client.incr(cls.VERSION_KEY)
|
||||
except Exception:
|
||||
# The catalog currently reads MySQL on every request, so Redis failure
|
||||
# must not make a committed metadata change look unsuccessful.
|
||||
return
|
||||
@@ -210,7 +210,7 @@ class KnowledgePipelineService:
|
||||
boundaries=manifest_data["boundaries"],
|
||||
content_hash=_hash(json.dumps(manifest_data, ensure_ascii=False, sort_keys=True)),
|
||||
change_level=change_level,
|
||||
confirmed=1 if previous_manifest and change_level == "minor" else 0,
|
||||
confirmed=1 if previous_manifest and previous_manifest.confirmed == 1 and change_level == "minor" else 0,
|
||||
)
|
||||
db.add(manifest)
|
||||
|
||||
@@ -236,6 +236,26 @@ class KnowledgePipelineService:
|
||||
{"versionId": version.id, "versionNo": version.version_no, **quality}, ensure_ascii=False
|
||||
)
|
||||
job.finished_at = _now()
|
||||
if (
|
||||
knowledge.review_mode == "automatic"
|
||||
and version.quality_status == "passed"
|
||||
and not quality["highRisk"]
|
||||
and manifest.confirmed == 1
|
||||
):
|
||||
cls.review_version(
|
||||
db,
|
||||
knowledge,
|
||||
version,
|
||||
admin_id,
|
||||
"approve",
|
||||
"自动审核方式:质检通过且说明卡可继承,自动发布。",
|
||||
)
|
||||
cls.publish_version(db, knowledge, version, admin_id, keep_open=knowledge.status == 1)
|
||||
job.status = "published"
|
||||
job.result_summary = json.dumps(
|
||||
{"versionId": version.id, "versionNo": version.version_no, "autoPublished": True, **quality},
|
||||
ensure_ascii=False,
|
||||
)
|
||||
db.add_all([knowledge, version, job])
|
||||
db.commit()
|
||||
return job
|
||||
@@ -299,6 +319,10 @@ class KnowledgePipelineService:
|
||||
manifest = db.scalar(select(KnowledgeManifest).where(KnowledgeManifest.version_id == version.id))
|
||||
if manifest is None or manifest.confirmed != 1:
|
||||
raise ValueError("知识库说明卡尚未确认")
|
||||
if keep_open and knowledge.lifecycle_status != "active":
|
||||
raise ValueError("归档知识库不能在发布后开放")
|
||||
if keep_open and knowledge.source_status != "normal":
|
||||
raise ValueError("飞书源文章异常,不能在发布后开放")
|
||||
previous_version_id = knowledge.current_version_id
|
||||
if previous_version_id:
|
||||
previous = db.get(KnowledgeVersion, previous_version_id)
|
||||
@@ -334,12 +358,19 @@ class KnowledgePipelineService:
|
||||
if version.status not in {"published", "superseded"}:
|
||||
raise ValueError("只能回滚到历史正式版本")
|
||||
previous_id = knowledge.current_version_id
|
||||
if previous_id:
|
||||
previous = db.get(KnowledgeVersion, previous_id)
|
||||
if previous:
|
||||
previous.status = "superseded"
|
||||
db.add(previous)
|
||||
version.status = "published"
|
||||
knowledge.current_version_id = version.id
|
||||
knowledge.status = 1 if keep_open else 0
|
||||
knowledge.last_published_at = _now()
|
||||
db.add_all(
|
||||
[
|
||||
knowledge,
|
||||
version,
|
||||
KnowledgePublishLog(
|
||||
knowledge_id=knowledge.id,
|
||||
from_version_id=previous_id,
|
||||
|
||||
Reference in New Issue
Block a user