diff --git a/wwwroot/api/pbl_evidence_delete.dspy b/wwwroot/api/pbl_evidence_delete.dspy index 1d9959f..4fba7bf 100644 --- a/wwwroot/api/pbl_evidence_delete.dspy +++ b/wwwroot/api/pbl_evidence_delete.dspy @@ -1,15 +1,26 @@ debug(f'pbl_evidence_delete.dspy: START params_kw={dict(params_kw)}') -# 证据删除端点(json/pbl_evidence.json -> params.editable.delete_data_url)。 +# 证据删除端点(json/pbl_evidence.json -> delete_data_url,DataViewer editable 提交目标)。 # 薄包装:无 import、无业务逻辑,直接委托 init.py 注册的 pbl_evidence_delete # (支持单条 id 与批量 ids;每条都按 tenant_id + id 双条件校验归属,防越权删除)。 +# +# 返回形态(两处规范硬约束): +# 1) dspy-file-implementation-spec「DataViewer CRUD endpoints 必须返回 Message widget +# JSON 字符串」——本端点是 editable 提交端点,故返回 bricks Message widget, +# 删除提交后能正确渲染成功/失败提示;不得返回裸数据 dict。 +# 2) 禁项 f-string 出现在 dict 字面量内会被 ahserver exec() 误判提前闭合外层 dict +# (SyntaxError: '{' was never closed,整文件编译失败),异常分支一律用字符串拼接。 try: _data = await pbl_evidence_delete(**dict(params_kw)) - _msg = (_data or {}).get('message', '证据已删除') - debug(f'pbl_evidence_delete.dspy: OK deleted={(_data or {}).get("deleted")}') - return json.dumps({'status': 'OK', 'ok': True, 'data': _data, - 'message': _msg}, ensure_ascii=False) + _msg = (_data or {}).get('message') or '证据已删除' + _widget = {'widgettype': 'Message', + 'options': {'title': '成功', 'message': _msg, 'type': 'success'}} + debug('pbl_evidence_delete.dspy: OK deleted=' + str((_data or {}).get('deleted'))) + return json.dumps(_widget, ensure_ascii=False) except Exception as e: debug(f'pbl_evidence_delete.dspy: FAIL {e}') debug(f'pbl_evidence_delete.dspy: TRACE {format_exc()}') - return json.dumps({'status': 'ERROR', 'ok': False, 'data': None, - 'message': f'证据删除失败:{e}'}, ensure_ascii=False) + _widget = {'widgettype': 'Message', + 'options': {'title': '失败', + 'message': '证据删除失败:' + str(e), + 'type': 'error'}} + return json.dumps(_widget, ensure_ascii=False) diff --git a/wwwroot/api/pbl_evidence_update.dspy b/wwwroot/api/pbl_evidence_update.dspy index cce11b0..046a9c3 100644 --- a/wwwroot/api/pbl_evidence_update.dspy +++ b/wwwroot/api/pbl_evidence_update.dspy @@ -1,16 +1,26 @@ debug(f'pbl_evidence_update.dspy: START params_kw={dict(params_kw)}') -# 证据人工修订端点(json/pbl_evidence.json -> params.editable.update_data_url, -# 注意:new/update/delete_data_url 在 CRUD JSON 中位于 params 顶层语义,由 xls2ui 读取)。 +# 证据人工修订端点(json/pbl_evidence.json -> update_data_url,DataViewer editable 提交目标)。 # 薄包装:无 import、无业务逻辑,直接委托 init.py 注册的 pbl_evidence_update # (强制 tenant_id 打头校验归属;改唯一索引三元组时同步重算 dedup_key)。 +# +# 返回形态(两处规范硬约束): +# 1) dspy-file-implementation-spec「DataViewer CRUD endpoints 必须返回 Message widget +# JSON 字符串」——本端点是 editable 提交端点,故返回 bricks Message widget, +# 表单提交后能正确渲染成功/失败提示;不得返回裸数据 dict。 +# 2) 禁项 f-string 出现在 dict 字面量内会被 ahserver exec() 误判提前闭合外层 dict +# (SyntaxError: '{' was never closed,整文件编译失败),异常分支一律用字符串拼接。 try: _data = await pbl_evidence_update(**dict(params_kw)) - _msg = (_data or {}).get('message', '证据已更新') - debug(f'pbl_evidence_update.dspy: OK id={(_data or {}).get("id")}') - return json.dumps({'status': 'OK', 'ok': True, 'data': _data, - 'message': _msg}, ensure_ascii=False) + _msg = (_data or {}).get('message') or '证据已更新' + _widget = {'widgettype': 'Message', + 'options': {'title': '成功', 'message': _msg, 'type': 'success'}} + debug('pbl_evidence_update.dspy: OK') + return json.dumps(_widget, ensure_ascii=False) except Exception as e: debug(f'pbl_evidence_update.dspy: FAIL {e}') debug(f'pbl_evidence_update.dspy: TRACE {format_exc()}') - return json.dumps({'status': 'ERROR', 'ok': False, 'data': None, - 'message': f'证据更新失败:{e}'}, ensure_ascii=False) + _widget = {'widgettype': 'Message', + 'options': {'title': '失败', + 'message': '证据更新失败:' + str(e), + 'type': 'error'}} + return json.dumps(_widget, ensure_ascii=False)