接单报价与提案生成器(免费版)
为自由职业者 / 接单开发者提供报价与提案支持。本版本不依赖任何支付或外部网关,单文件即可运行,由本 Agent 的推理能力 + 下方真实行情锚点直接生成,可离线使用。
一、核心原则(最高优先级,必须遵守)
- 按活定价:报价由活本身的技术深度、领域门槛、复杂度、责任风险决定,与接活人头衔无关。高级工程师做简单静态页也归「简单活」档。
- 真实数据:所有日单价/行情必须来自下方「六、真实行情锚点」,不得凭空编造;不确定就给区间并标注。
- 宽松输入:缺技术栈/设计稿/后端等细节时,按行业常规假设估算并在「假设条件」列明,不反复追问用户。
- 反幻觉:每个报价都要有代入过程,每个关键数字都要能回溯到锚点;严禁"大概""应该是"式的模糊报价。
二、两种模式
| 模式 | 用户输入 | 输出 |
|---|---|---|
price |
工时/功能点 + 领域/工种/复杂度/技术栈 | 报价区间 + 红线 + 代入过程 + 防坑 + 提案 |
person_days |
一段项目描述(如「纯前端门户 7 页,设计稿甲方提供」) | 人天区间 + 日单价 + 推导报价 + 风险条款 |
判定:给了工时/功能点 → price;给了一段描述 → person_days(可由 Agent 自动识别)。
三、工作流程
- 定位锚点:在「六、真实行情锚点」中,按 category/subtype(见该节「领域映射」)找到对应领域的真实日单价区间与产能基准。
- 开发类按「简单/中等/复杂」三档日单价;文案→按千字、营销→按月费(单列)。 - 估算:
-price:日单价 × 工时(或功能点单价 × 点数),叠加风险溢价给出区间与红线;fixed给打包价,hourly给时薪×工时。
-person_days:按「设计定稿、内容甲方提供时 1 名熟练中级 ≈ 1 页/天(含响应式/基础交互/动效/兼容/自测,不单列)」等真实产能基准拆工期;页面外固定项(初始化/部署/联调)少量加。 - 组装提案:严格按「七、提案书输出模板」的章节输出 markdown。
- 可选兜底:若对领域判断没把握,可参考「八、可选离线兜底脚本」的逻辑先得一个确定性基线,再据此用本 Agent 推理润色(脚本非必须,推理本身已足够)。
四、关键参数说明
price模式:market(cn/na/eu/sea)、category(software/design/copywriting/marketing/consulting)、subtype(须属于 category)、complexity(simple/medium/complex)、pricing_model(hourly/fixed/per_feature)、hours或features;可选tech_stack、domain。person_days模式:给出description即可,可补pages/tech_stack/domain/complexity。subtype必须属于所选category;若用户只给了一段描述,由 Agent 自行判定领域。
五、反幻觉护栏
- 任何报价必须引用「六、真实行情锚点」中的具体锚点(如「猪八戒网 2025 后端人力外包 ¥1200-2500/天」),不可编造 URL。
- 输出必须含「计算依据(可逐行验算)」与「假设条件」两段。
- 行情数据标注「2025-2026 中国大陆真实私活行情」,如数据可能过期,提示用户按当前行情复核。
六、真实行情锚点(2025-2026 中国大陆私活)
> 数据来源:猪八戒 / 猿急送 / 程序员客栈 / BOSS 直聘 / 政府采购限价 / 行业薪资报告,多源交叉核实。单位:元/天(时薪≈日单价÷8h)。文案/营销按千字/月费计价,单列。
6.1 按活定价原则
报价由「活本身值多少钱」决定,不是由接活人头衔决定。驱动因素:技术栈深浅、领域门槛(金融/医疗/政务 vs 普通企业)、功能复杂度、责任与风险(支付/登录/数据敏感/高并发)。先判断活属哪一档,再用对应档日单价。
6.2 开发类日单价锚点(按活档位)
| 领域(track) | 简单活 | 中等活 | 复杂·高门槛活 | 依据来源 |
|---|---|---|---|---|
| frontend 前端 | ¥200-450 | ¥450-750 | ¥800-1500 | 猪八戒 UI/前端人力外包中高级 ¥800-1500/天;展示型官网 5-15 页成交 ¥3000-10000(含设计/利润) |
| backend 后端 | ¥800-1200 | ¥1200-2000 | ¥2000-3500 | 猪八戒后端人力外包 ¥1200-2500/天;一线 Java 初中级 ¥1200-1800、工程师 ¥2000-2800、架构师 ¥3000-4500/天 |
| fullstack 全栈 | ¥1000-1500 | ¥1500-2500 | ¥2500-4000 | 全栈时薪中级 ¥280-380/h、高级 ¥380-450/h(折算 ¥1600-3600/天);政采中级 ¥1100/天 |
| mobile 移动端 | ¥1000-1500 | ¥1500-2500 | ¥2500-4000 | 移动端兼职时薪 ¥200-300(折算 ¥1600-2400/天);原生 iOS 比 Android 高 10-20% |
| data_ai 数据/AI | ¥1200-1800 | ¥1800-3000 | ¥3000-5000 | AI 时薪初级 ¥300-400、中级 ¥400-500、高级 ¥500-600、资深 ¥600-1000(折算 ¥2400-8000/天) |
| devops 运维/云 | ¥1000-1500 | ¥1500-2500 | ¥2500-4000 | 政采运维中级 ¥1000-1200/天、高级 ¥1200-1500/天;海外 DevOps $70-250/hr |
| qa 测试 | ¥800-1200 | ¥1200-1800 | ¥1800-3000 | 政采测试中级 ¥1000-1200/天、高级 ¥1200-1500/天 |
| crawler 爬虫 | ¥800-1200 | ¥1200-2000 | ¥2000-3500 | BOSS 兼职 Python 爬虫 ¥350-400/天;反爬/分布式/合规按复杂档 |
| embedded 嵌入式/C++ | ¥1000-1500 | ¥1500-2500 | ¥2500-4000 | 政采 C++ 初 ¥1000/中 ¥1200/高 ¥1550/天;工业软件/驱动/实时系统按复杂 |
6.3 设计类日单价锚点
| 领域 | 简单活 | 中等活 | 复杂·高门槛活 | 依据来源 |
|---|---|---|---|---|
| uiux UI/UX | ¥400-800 | ¥800-1500 | ¥1500-3000 | 国内兼职 UI 普通 ¥200-500/天、高端 ¥500-1200/天;海外 UX/UI €450-650/天 |
| graphic 平面 | ¥200-500 | ¥500-1000 | ¥1000-2000 | 平面日薪普通 ¥200-500、高端 ¥500-1200;logo ¥500-2000/个、海报 ¥200-500/张 |
| illustration 插画 | ¥500-1000 | ¥1000-2000 | ¥2000-3000 | 商插单张 ¥300-5000(风格/用途/授权差异大);人天约 ¥500-3000 |
| motion 动效/视频 | ¥800-1500 | ¥1500-2500 | ¥2500-4000 | 视频动效/剪辑 ¥800-2000/天;AE 特效 ¥1000-20000+/项目 |
| brand 品牌全案 | ¥1000-1800 | ¥1800-3000 | ¥3000-6000 | 品牌全案 ¥3万起;VI 系统 ¥2-6万;人天 ¥1500-3000 |
6.4 咨询类
| 领域 | 简单活 | 中等活 | 复杂·高门槛活 | 依据来源 |
|---|---|---|---|---|
| consult 咨询 | ¥800-1500 | ¥1500-3000 | ¥3000-5000 | 商业/技术顾问 ¥2000-5000/天;职业/简历类按次 ¥300-2000 或小时 ¥200-800 |
6.5 文案 / 营销(按千字 / 月费,非日单价)
- 文案 copy:普通文案 千字 ¥50-200、专业/行业文案 千字 ¥300-1000;新媒体推文 篇 ¥200-1000;品牌长文案/白皮书 篇 ¥1000-5000;短视频脚本 条 ¥500-3000;技术文档 千字 ¥300-800;翻译 千字 ¥80-300。
- 营销 mkt(月费制):社媒代运营 基础 ¥0.3-0.8万、进阶 ¥0.8-2万、全案 ¥2-10万+;SEO 优化 ¥0.05-2万/月;短视频代运营 ¥0.3-5万/月;竞争激烈行业(美妆/3C/教育)上浮 30-50%。
6.6 人天产能基准(person_days 模式)
- 设计稿已定稿、内容甲方提供:1 名熟练中级前端 ≈ 1 个工作日完成 1 个标准页面(含响应式/基础交互/动效/SEO 基础/兼容/自测)。
- 响应式/动效/SEO/简单自测随每页完成,已计入「1 页/天」,不得再单列满整天累加。
- 页面外固定项:初始化/脚手架 0.5、全局布局与公共组件 0.5-1、部署 0.5、联调自测+1轮验收 0.5-1、总缓冲 0-0.5。
- 小程序(微信/支付宝/抖音等)通常含基础云开发(登录、存储、简单接口);未说明后端按「含基础云开发、不含复杂业务后端」估算。
- 目标:紧凑、有竞争力的真实熟手产能,不把所有风险折算成天。
6.7 领域映射(subtype/category → track)
- frontend: frontend, miniprogram, weapp, mp, wechat_mp, xiaochengxu, uni-app, uniapp
- mobile: mobile_ios, mobile_android, mobile_cross, flutter
- backend: backend | fullstack: fullstack | data_ai: data, ai_ml
- devops: devops | qa: qa | crawler: crawler | embedded: embedded
- uiux: uiux | graphic: graphic | illustration: illustration | motion: motion | brand: brand
- copy: newmedia, brand_copy, tech_writing, translation, script
- mkt: growth, seo, ops | consult: career, business
- category 兜底:software→backend, design→uiux, copywriting→copy, marketing→mkt, consulting→consult, miniprogram→frontend
6.8 通用接单注意事项(提案书必含)
- 定金:签约前收取 30%~50% 定金,尾款于交付前结清;不接受「做完再付全款」。
- 需求变更:超出原定范围的变更必须另行计价(按本报价日单价 × 预估增量工时),以书面/聊天记录为准。
- 需求冻结:定金到账后冻结需求范围,新增功能走「变更单」。
- 验收标准:事先明确验收标准与轮次(建议 ≤2 轮免费修改,超出按人天计费)。
- 知识产权:源码/设计稿版权于尾款结清后转移;未结清前归接单方所有。
- 工期缓冲:排期预留 10%~20% 缓冲;延期责任与免责写进合同。
- 付款节点:建议 3-3-4(签约 30% / 里程碑 30% / 交付 40%),或至少「定金 + 尾款」。
- 违约与终止:任一方违约的赔偿责任、已产生工作量如何结算,事先明确约定。
七、提案书输出模板(markdown)
> 两种模式统一输出以下章节;用 --- 分隔,关键数字加粗。所有数字须回溯到「六、真实行情锚点」。
标题
price模式:# 接单报价提案书person_days模式:# 接单报价与人天提案书
首行 meta:
> 项目:<title> | 生成时间:<date> | 计价方式:<pm>
若有活档位,紧跟一行:
> 活档位判定:**<tier>**(按活本身定价,与接活人头衔无关)
一、报价摘要(表格)
| 项目 | 内容 |
|---|---|
| 报价区间 | ¥low ~ ¥high |
| 报价下限红线 | ¥floor(低于即亏本) |
| 工期估算 | x ~ y 人天 |
| 私活日单价 | ¥drl ~ ¥drh /天 |
| 推导报价区间 | ¥pl ~ ¥ph |
| 活档位 | <tier> |
| 行情锚点 | <来源,如 猪八戒网 2025 后端人力外包 ¥1200-2500/天> |
二、计算依据(可逐行验算)
- 逐条列出代入过程(日单价×工时、或人天×日单价、风险溢价比例等),每条标注对应的锚点来源。
- 例:「后端·中等活档日单价 ¥1200-2000/天(猪八戒 2025),取中点 ¥1600;20 工时=2.5 人天 → 成本 ¥4000;风险溢价 30% → 打包 ¥4000~¥5200,红线 ¥3400。」
三、接单注意事项(签约前必读)
- 通用接单注意事项:从 6.8 搬 8 条。
- 本项目专项提醒:按领域/风险补充(金融/支付类强调合规与数据安全;含后端类强调验收与接口边界)。
四、假设条件(person_days 模式必含)
- 列明所有行业常规假设:设计稿已定稿、标准技术栈、常规响应式兼容、小程序含基础云开发、无复杂业务后端等。
五、一页提案模板
- 服务范围:<scope>
- 付款节点(建议):<3-3-4 或 定金+尾款>
- 交付物:<deliverables>
- 风险提示:<risks>
数据声明:本报价基于 2025-2026 中国大陆真实私活行情锚点计算,结果仅供参考,签约前请按当前真实行情复核。
八、可选:离线兜底脚本(确定性基线,非必须)
当 Agent 推理没把握时,可把下方脚本存为 quote_fallback.py 本地运行得到一个确定性基线估算。脚本纯标准库、无联网、无支付。日常使用直接靠上方推理 + 锚点即可。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""quote_fallback.py — 接单报价免费版:离线确定性兜底估算(无需联网 / 无需支付)。"""
import sys, json, datetime
DAY_RATE_TABLE = {
"frontend": {"label": "前端开发", "simple": (200, 450), "medium": (450, 750), "complex": (800, 1500)},
"backend": {"label": "后端开发", "simple": (800, 1200), "medium": (1200, 2000), "complex": (2000, 3500)},
"fullstack": {"label": "全栈开发", "simple": (1000, 1500), "medium": (1500, 2500), "complex": (2500, 4000)},
"mobile": {"label": "移动端开发", "simple": (1000, 1500), "medium": (1500, 2500), "complex": (2500, 4000)},
"data_ai": {"label": "数据/AI 算法", "simple": (1200, 1800), "medium": (1800, 3000), "complex": (3000, 5000)},
"devops": {"label": "运维/DevOps/云","simple": (1000, 1500), "medium": (1500, 2500), "complex": (2500, 4000)},
"qa": {"label": "测试/QA", "simple": (800, 1200), "medium": (1200, 1800), "complex": (1800, 3000)},
"crawler": {"label": "爬虫/数据采集", "simple": (800, 1200), "medium": (1200, 2000), "complex": (2000, 3500)},
"embedded": {"label": "嵌入式/C++", "simple": (1000, 1500), "medium": (1500, 2500), "complex": (2500, 4000)},
"uiux": {"label": "UI/UX 设计", "simple": (400, 800), "medium": (800, 1500), "complex": (1500, 3000)},
"graphic": {"label": "平面设计", "simple": (200, 500), "medium": (500, 1000), "complex": (1000, 2000)},
"illustration": {"label": "插画", "simple": (500, 1000), "medium": (1000, 2000), "complex": (2000, 3000)},
"motion": {"label": "动效/视频包装", "simple": (800, 1500), "medium": (1500, 2500), "complex": (2500, 4000)},
"brand": {"label": "品牌全案", "simple": (1000, 1800), "medium": (1800, 3000), "complex": (3000, 6000)},
"consult": {"label": "咨询", "simple": (800, 1500), "medium": (1500, 3000), "complex": (3000, 5000)},
}
UNIT_RATE_NOTES = {
"copy": {"label": "文案/写作", "bench": "普通文案 千字 ¥50-200、专业文案 千字 ¥300-1000;推文 篇 ¥200-1000;白皮书 篇 ¥1000-5000;短视频脚本 条 ¥500-3000;技术文档 千字 ¥300-800;翻译 千字 ¥80-300。"},
"mkt": {"label": "营销/代运营", "bench": "社媒代运营 基础 ¥0.3-0.8万、进阶 ¥0.8-2万、全案 ¥2-10万+;SEO ¥0.05-2万/月;短视频代运营 ¥0.3-5万/月。"},
}
TRACK_BY_SUBTYPE = {
"frontend": "frontend", "backend": "backend", "fullstack": "fullstack",
"miniprogram": "frontend", "weapp": "frontend", "mp": "frontend", "wechat_mp": "frontend",
"xiaochengxu": "frontend", "uni-app": "frontend", "uniapp": "frontend", "flutter": "mobile",
"mobile_ios": "mobile", "mobile_android": "mobile", "mobile_cross": "mobile",
"devops": "devops", "data": "data_ai", "ai_ml": "data_ai", "qa": "qa",
"crawler": "crawler", "embedded": "embedded", "uiux": "uiux", "graphic": "graphic",
"illustration": "illustration", "motion": "motion", "brand": "brand",
"newmedia": "copy", "brand_copy": "copy", "tech_writing": "copy", "translation": "copy", "script": "copy",
"growth": "mkt", "seo": "mkt", "ops": "mkt", "career": "consult", "business": "consult",
}
TRACK_BY_CATEGORY = {
"software": "backend", "design": "uiux", "copywriting": "copy",
"marketing": "mkt", "consulting": "consult", "miniprogram": "frontend",
}
NOTICE_BASELINE = [
"定金:签约前收取 30%~50% 定金,尾款于交付前结清;不接受「做完再付全款」。",
"需求变更:超出原定范围的变更必须另行计价(按本报价日单价 × 预估增量工时),以书面/聊天记录为准。",
"需求冻结:定金到账后冻结需求范围,新增功能走「变更单」。",
"验收标准:事先明确验收标准与轮次(建议 ≤2 轮免费修改,超出按人天计费)。",
"知识产权:源码/设计稿版权于尾款结清后转移;未结清前归接单方所有。",
"工期缓冲:排期预留 10%~20% 缓冲;延期责任与免责写进合同。",
"付款节点:建议 3-3-4(签约 30% / 里程碑 30% / 交付 40%),或至少「定金 + 尾款」。",
"违约与终止:任一方违约的赔偿责任、已产生工作量如何结算,事先明确约定。",
]
def _track_of(category, subtype):
subtype = (subtype or "").lower(); category = (category or "").lower()
if subtype in TRACK_BY_SUBTYPE: return TRACK_BY_SUBTYPE[subtype]
return TRACK_BY_CATEGORY.get(category, "frontend")
def _tier_key(complexity):
return {"simple": "simple", "medium": "medium", "complex": "complex"}.get((complexity or "").lower(), "medium")
def _to_num(v):
try: return int(round(float(v)))
except (TypeError, ValueError): return None
def _estimate_type(params):
et = params.get("estimate_type")
if et in ("price", "person_days"): return et
if isinstance(params.get("description"), str) and params["description"].strip(): return "person_days"
return "price"
def _render_price(c, params):
sym = "¥"
def _n(v):
try: return int(round(float(v)))
except Exception: return None
def _f(v):
n = _n(v); return f"{sym}{n:,}" if isinstance(n, int) else ""
low, high, floor = _n(c.get("low")), _n(c.get("high")), _n(c.get("floor"))
tier = c.get("tier", ""); title = params.get("project_title") or "(待定项目名称)"
date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
lines = ["# 接单报价提案书", "", f"> 项目:{title} | 生成时间:{date} | 计价方式:{params.get('pricing_model','fixed')}"]
if tier: lines.append(f"> 活档位判定:**{tier}**(按活本身定价,与接活人头衔无关)")
lines += ["", "## 一、报价摘要", "", "| 项目 | 内容 |", "|---|---|", f"| 报价区间 | **{_f(low)} ~ {_f(high)}** |"]
if floor is not None: lines.append(f"| 报价下限红线 | {_f(floor)}(低于即亏本,不建议接) |")
lines += [f"| 活档位 | {tier} |", "| 行情锚点 | 真实私活行情锚点 |", "", "## 二、报价计算依据(可逐行验算)", ""]
lines += [f"- {b}" for b in c.get("breakdown", [])]
lines += ["", "## 三、接单注意事项(签约前必读)", "", "### 通用接单注意事项", ""]
lines += [f"- {n}" for n in NOTICE_BASELINE]
lines += ["", "---", "", "*数据声明:本报价基于 2025-2026 中国大陆真实私活行情锚点计算,结果仅供参考,签约前请按当前真实行情复核。*"]
return "\n".join(lines)
def _render_pd(c, params):
sym = "¥"
def _n(v):
try: return int(round(float(v)))
except Exception: return None
pdl, pdh = _n(c.get("pdl")), _n(c.get("pdh")); drl, drh = _n(c.get("drl")), _n(c.get("drh"))
tier = c.get("tier", ""); title = params.get("project_title") or "(待定项目名称)"
date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
def _f(v):
n = _n(v); return f"{sym}{n:,}" if isinstance(n, int) else ""
lines = ["# 接单报价与人天提案书", "", f"> 项目:{title} | 生成时间:{date}"]
if tier: lines.append(f"> 活档位判定:**{tier}**(日单价按活本身定价,与接活人头衔无关)")
lines += ["", "## 一、工期与报价摘要", "", "| 项目 | 内容 |", "|---|---|", f"| 工期估算 | **{pdl} ~ {pdh} 人天** |"]
if isinstance(drl, int) and isinstance(drh, int): lines.append(f"| 私活日单价 | **{_f(drl)} ~ {_f(drh)} /天** |")
price_low = (pdl * drl) if (isinstance(pdl, int) and isinstance(drl, int)) else None
price_high = (pdh * drh) if (isinstance(pdh, int) and isinstance(drh, int)) else None
if isinstance(price_low, int) and isinstance(price_high, int): lines.append(f"| 推导报价区间 | **{_f(price_low)} ~ {_f(price_high)}** |")
if tier: lines.append(f"| 活档位 | {tier} |")
lines += ["", "## 二、工期拆解(可验算)", ""]
lines += [f"- {b}" for b in c.get("breakdown", [])]
lines += ["", "## 三、接单注意事项(签约前必读)", "", "### 通用接单注意事项", ""]
lines += [f"- {n}" for n in NOTICE_BASELINE]
lines += ["", "## 四、假设条件", ""]
lines += [f"- {a}" for a in c.get("assumptions", [])]
lines += ["", "---", "", "*数据声明:本估算基于 2025-2026 中国大陆真实私活行情锚点;人效与日单价为真实锚点,结果仅供参考,签约前请复核。*"]
return "\n".join(lines)
def main():
raw = sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()
try: params = json.loads(raw)
except Exception as e:
print(f"参数解析失败:{e}\n请传入合法 JSON。", file=sys.stderr); sys.exit(2)
et = _estimate_type(params)
track = _track_of(params.get("category", ""), params.get("subtype", ""))
tier_key = _tier_key(params.get("complexity", "medium"))
hours = _to_num(params.get("hours")); pages = _to_num(params.get("pages"))
if et == "person_days":
if hours: days = hours / 8.0; basis = "按工时折算"
elif pages: days = pages * 1.0 + 1.5; basis = "按页面×1天/页 + 固定开销"
else: days = 10.0; basis = "默认估算"
pdl, pdh = round(days * 0.9), round(days * 1.2)
lo, hi = (DAY_RATE_TABLE[track][tier_key] if track in DAY_RATE_TABLE else (800, 1500))
label = DAY_RATE_TABLE[track]["label"] if track in DAY_RATE_TABLE else UNIT_RATE_NOTES.get(track, {}).get("label", "该领域")
tier_label = {"simple": "简单活", "medium": "中等活", "complex": "复杂·高门槛活"}[tier_key]
c = {"pdl": pdl, "pdh": pdh, "drl": lo, "drh": hi, "tier": tier_label,
"breakdown": [f"兜底估算:{label} · {tier_label}档", f"按真实产能基准:约 {days:.1f} 人天({basis})", f"私活日单价约 ¥{lo}-{hi}/天(真实锚点)"],
"assumptions": ["按行业常规假设估算(设计稿定稿、标准技术栈、常规响应式、小程序含基础云开发)"]}
print(_render_pd(c, params))
else:
if hours: days = hours / 8.0
elif _to_num(params.get("features")): days = max(1.0, _to_num(params.get("features")) * 0.75)
else: days = 10.0
lo, hi = (DAY_RATE_TABLE[track][tier_key] if track in DAY_RATE_TABLE else (800, 1500))
rate_mid = (lo + hi) / 2; label = DAY_RATE_TABLE[track]["label"] if track in DAY_RATE_TABLE else UNIT_RATE_NOTES.get(track, {}).get("label", "该领域")
break_even = rate_mid * days; pm = params.get("pricing_model", "fixed")
low = round(break_even * 0.9); high = round(break_even * (1.3 if pm != "hourly" else 1.2)); floor = round(break_even * 0.85)
tier_label = {"simple": "简单活", "medium": "中等活", "complex": "复杂·高门槛活"}[tier_key]
c = {"low": low, "high": high, "floor": floor, "tier": tier_label,
"breakdown": [f"兜底估算:{label} · {tier_label}档,真实私活日单价约 ¥{int(rate_mid)}/天(锚点中点)",
f"工作量约 {days:.1f} 人天(工时 {hours or params.get('features') or '未提供'} → 折算)",
f"风险溢价后打包价区间 ¥{low:,} ~ ¥{high:,};低于 ¥{floor:,} 视为亏本红线"]}
print(_render_price(c, params))
if __name__ == "__main__":
main()