Przeglądaj źródła

创意审核检查删除 fix

wangyunpeng 1 tydzień temu
rodzic
commit
e9f7b2a395

+ 2 - 2
examples/auto_put_ad_mini/docs/unified_services_deployment.md

@@ -187,12 +187,12 @@ Excel 中
 已知状态枚举按腾讯中文描述展示,未知枚举保留原值;删除判断和数据库审计始终使用腾讯返回的
 原始枚举值。报表通过现有
 `ROI_AGENCY_WEBHOOKS_JSON` 精确路由到代理群;同批次还会生成包含全部代理创意的汇总表,通过飞书应用
-发送到 `FEISHU_OPERATOR_CHAT_ID` 投放调控通知群。代理通知与投放调控汇总通知分别记录成功状态;
+发送到 `FEISHU_AD_PROJECT_CHAT_ID` 投放调控通知群。代理通知与投放调控汇总通知分别记录成功状态;
 单一目标失败时只重试失败目标,已成功目标不会重复发送。上传或机器人通知失败时复用已有在线表,
 只重试通知,不重复删除。每天的检查使用独立日级审计记录,同一需人工判断创意如果次日仍命中规则,
 会按当天新检查再次提醒。代理归属为空,或已解析代理但没有配置对应代理群时,记录置为 `DEFERRED`,
 禁止执行腾讯删除,待归属和路由完整后再处理。该任务要求同时设置
-`ROI_AGENCY_WEBHOOK_ENABLED=1` 和 `FEISHU_OPERATOR_CHAT_ID`;启用真实删除但缺少任一配置时,
+`ROI_AGENCY_WEBHOOK_ENABLED=1` 和 `FEISHU_AD_PROJECT_CHAT_ID`;启用真实删除但缺少任一配置时,
 任务会在腾讯写操作前拒绝启动。生产启用顺序为:先只开启任务完成只读审核结果核对,再开启
 `ROI_AGENCY_WEBHOOK_ENABLED=1` 和 `DAILY_REJECTED_CREATIVE_APPLY_ENABLED=1`。
 

+ 25 - 1
examples/auto_put_ad_mini/test_creative_review_scan.py

@@ -1427,6 +1427,29 @@ class CreativeRejectionCleanupTests(unittest.TestCase):
         self.assertEqual(outcome["status"], "SENT")
         self.assertEqual(update.call_args.kwargs["status"], "SENT")
 
+    def test_operator_summary_chat_uses_ad_project_group(self):
+        from tools import creative_rejection_cleanup as cleanup
+
+        with patch.dict(
+            os.environ,
+            {
+                "FEISHU_OPERATOR_CHAT_ID": "chat-operator",
+                "FEISHU_AD_PROJECT_CHAT_ID": "chat-project",
+            },
+            clear=False,
+        ):
+            self.assertEqual(cleanup._operator_summary_chat_id(), "chat-project")
+
+        with patch.dict(
+            os.environ,
+            {
+                "FEISHU_OPERATOR_CHAT_ID": "chat-operator",
+                "FEISHU_AD_PROJECT_CHAT_ID": "",
+            },
+            clear=False,
+        ):
+            self.assertEqual(cleanup._operator_summary_chat_id(), "")
+
     def test_apply_deletes_denied_creative_and_marks_sent_notification(self):
         from tools import creative_rejection_cleanup as cleanup
 
@@ -2255,7 +2278,7 @@ class CreativeRejectionCleanupTests(unittest.TestCase):
         publish.assert_not_called()
         self.assertEqual(summary["deliveries"], [])
 
-    def test_apply_requires_operator_chat_before_any_external_work(self):
+    def test_apply_requires_ad_project_chat_before_any_external_work(self):
         from tools import creative_rejection_cleanup as cleanup
 
         with patch.dict(
@@ -2271,6 +2294,7 @@ class CreativeRejectionCleanupTests(unittest.TestCase):
                         )
                     }
                 ),
+                "FEISHU_OPERATOR_CHAT_ID": "",
                 "FEISHU_AD_PROJECT_CHAT_ID": "",
             },
             clear=False,

+ 8 - 2
examples/auto_put_ad_mini/tools/creative_rejection_cleanup.py

@@ -84,6 +84,12 @@ OPERATOR_REPORT_COLUMNS = (
 REPORT_COLUMNS = AGENCY_REPORT_COLUMNS
 
 
+def _operator_summary_chat_id() -> str:
+    """Resolve the ad project chat used for the operator cleanup summary."""
+
+    return os.getenv("FEISHU_AD_PROJECT_CHAT_ID", "").strip()
+
+
 def _json(value: Any) -> str:
     return json.dumps(value, ensure_ascii=False, default=str)
 
@@ -1353,7 +1359,7 @@ def run_rejected_creative_cleanup(
             "DAILY_REJECTED_CREATIVE_APPLY_ENABLED=1 requires "
             "ROI_AGENCY_WEBHOOK_ENABLED=1"
         )
-    if apply_enabled and not os.getenv("FEISHU_AD_PROJECT_CHAT_ID", "").strip():
+    if apply_enabled and not _operator_summary_chat_id():
         raise RuntimeError(
             "DAILY_REJECTED_CREATIVE_APPLY_ENABLED=1 requires "
             "FEISHU_AD_PROJECT_CHAT_ID"
@@ -2082,7 +2088,7 @@ def run_rejected_creative_cleanup(
                         operator_outcome = publish_cleanup_operator_summary(
                             run_id=str(operator_report["run_id"]),
                             report=operator_report,
-                            chat_id=os.getenv("FEISHU_AD_PROJECT_CHAT_ID", ""),
+                            chat_id=_operator_summary_chat_id(),
                             publisher=sheet_publisher,
                             now=effective_now,
                         )