user_id = await get_user() if not user_id: return json.dumps({'status': 'error', 'message': '未登录'}, ensure_ascii=False) reporter_type = params_kw.get('reporter_type', '') if not reporter_type: reporter_type = 'agent' if params_kw.get('is_agent', '') else 'human' data = { 'id': getID(), 'iteration_id': params_kw.get('iteration_id', ''), 'case_id': params_kw.get('case_id', ''), 'step_name': params_kw.get('step_name', ''), 'title': params_kw.get('title', ''), 'description': params_kw.get('description', ''), 'severity': params_kw.get('severity', 'medium'), 'priority': params_kw.get('priority', 'medium'), 'status': 'new', 'reporter_type': reporter_type, 'reporter_id': user_id, 'assignee_id': params_kw.get('assignee_id', ''), 'created_at': curDateString(), } try: async with get_sor_context(request._run_ns, 'pipeline') as sor: # 同机构校验:人类报告的 bug 须与项目同机构(agent 报告跳过) if reporter_type == 'human' and data.get('iteration_id'): it = await sor.sqlExe( "SELECT project_id FROM sd_iterations WHERE id=${iid}$", {"iid": data['iteration_id']}) await sor.sqlExe("COMMIT", {}) pid = getattr(it[0], 'project_id', '') if it else '' if pid: p = await sor.sqlExe("SELECT org_id FROM sd_projects WHERE id=${pid}$", {"pid": pid}) await sor.sqlExe("COMMIT", {}) proj_org = getattr(p[0], 'org_id', '') if p else '' u = await sor.sqlExe("SELECT orgid FROM users WHERE id=${u}$", {"u": user_id}) await sor.sqlExe("COMMIT", {}) user_org = getattr(u[0], 'orgid', '') if u else '' if proj_org and user_org != proj_org: return json.dumps({'status': 'error', 'message': '仅同机构用户可报告 Bug'}, ensure_ascii=False) await sor.C('sd_bugs', data) return json.dumps({'status': 'ok', 'id': data['id']}, ensure_ascii=False) except Exception as e: return json.dumps({'status': 'error', 'message': str(e)}, ensure_ascii=False)