# tech_template_confirm.dspy - 技术方案书章节骨架的用户确认/驳回端点 # (纯技术方案流程 bid_tech_proposal,2026-09-15 批2收口) # # 入参(form-encoded): # human_task_id 模版确认待办 id(pipeline_human_tasks.id,task_type=tech_template_confirm) # decision confirm | reject # comment 驳回意见(reject 时必填;confirm 可空) # # 安全:确认动作是用户专属(同机构校验在 bid_tech_capability.confirm_tech_template); # agent 无对应工具,无法代替确认。确认后骨架落 bid_chapters(section=technical) 开写; # 驳回意见存 result_data,对账器重派模版任务时注入(get_template_reject_comment)。 import json as _json user_id = await get_user() if not user_id: return _json.dumps({"success": False, "error": "未登录"}, ensure_ascii=False) human_task_id = str((params_kw or {}).get('human_task_id') or '').strip() decision = str((params_kw or {}).get('decision') or '').strip().lower() comment = str((params_kw or {}).get('comment') or '').strip() if not human_task_id: return _json.dumps({"success": False, "error": "缺少 human_task_id"}, ensure_ascii=False) if decision not in ('confirm', 'reject'): return _json.dumps({"success": False, "error": "decision 必须是 confirm 或 reject"}, ensure_ascii=False) try: from pipeline_bidding.bid_tech_capability import confirm_tech_template except Exception as e: return _json.dumps({"success": False, "error": "投标产线技术能力模块不可用:%s" % str(e)[:150]}, ensure_ascii=False) ok, msg = await confirm_tech_template(human_task_id, decision, comment, operator_id=user_id) if ok: return _json.dumps({"success": True, "message": msg}, ensure_ascii=False) return _json.dumps({"success": False, "error": msg}, ensure_ascii=False)