监控项目预算与报价工作台

面向项目决策、投资评估与商务沟通的可追溯测算

已自动保存

业务规模与 AI 用量

先定义技术基线:监控多少网页、多久检查一次、多少变化需要 AI。结果会自动折算为月度工作量。

核心业务参数

只需先填这 5 项
持续维护和巡检的 URL 总量。
例如每 8 小时检查一次。
使用变更检测后,实际调用 AI 的平均比例。
正文、提示词、上下文的实测平均值。
结构化结论、摘要和理由的平均值。
持续服务默认按 30 天。
每日巡检0
每月巡检0
每月 AI 分析0
每月输入 / 输出0 / 0

估算依据状态

0 / 3 已有依据
采集、存储与模型高级参数
固定模型:gpt-5.6-sol。输入 $5、输出 $30、缓存读取 $0.5、缓存创建 $6.25,单位均为 1M Token,来源为你提供的价格快照。

分阶段研发投入

阶段顺序形成项目自然周期;同一阶段内不同岗位并行投入。成本按每个阶段的岗位 FTE 独立计算后汇总。

阶段周期

可按项目排期单独调整
1. 需求与架构

调研、边界、技术方案和验收基线

2. 核心开发

爬虫、AI、服务端与工作台开发

3. 联调与测试

数据联调、效果、性能与验收测试

4. 上线与验收

部署、培训、上线支持与最终验收

启动自然周期 0 个月验收
岗位投入比例(FTE):每格填写该岗位在该阶段平均占用一名全职人员的比例。1.0 = 100% 全职,0.5 = 50% 半职,0.2 = 20%;多个岗位可以在同一阶段并行投入。
岗位与职责项目人月基准价需求架构
投入比例
核心开发
投入比例
联调测试
投入比例
上线验收
投入比例
合计人月小计
总投入人月0 人月
岗位直接投入¥0
交付配套投入¥0
研发实施预算¥0

阶段时间与人月计算

阶段顺序推进,岗位在阶段内并行投入
计算公式:阶段人月 = 阶段月数 × 该阶段全部岗位投入比例之和。

交付配套费用明细

一次性费用,逐项填写并直接相加
项目计划、进度跟踪、会议沟通和跨团队协调。
架构与代码评审、接口文档、部署手册和验收材料。
环境部署、使用培训、验收配合和上线支持。
约定质保期内已验收范围的问题响应与缺陷修复。
合计进入研发实施预算,但不增加阶段人月。若某项已包含在岗位投入或其他费用中,请填 0,避免重复计算。

团队完整性检查

缺失岗位必须明确职责承接人

    运行成本与合作预算

    先核算每月持续服务成本,再加入实施风险准备、项目服务与履约管理费用以及税费。

    运行资源

    云服务器与服务器之外的增量托管服务分别计费
    仅填写服务器月租之外的数据库、日志、监控告警、备份等增量托管费用;若云服务器套餐已包含这些能力,请填 0。
    一台云服务器处理抓取、解析和任务队列的实测平均吞吐。
    每日巡检任务要求完成的时间窗口。
    包含网页抓取、解析和任务处理所需云主机月租;首台也可承载轻量后台和调度服务。
    所需云服务器0 台
    AI 模型服务月费¥0
    服务器、基础服务与存储月费¥0
    持续服务成本/月¥0
    运行成本明细
    AI 模型服务:¥0
    公共基础服务(不含服务器):¥0 / 月
    云服务器租用:0 台 × ¥0 = ¥0 / 月
    对象存储:0 GB × ¥0 = ¥0 / 月
    新增持续费用:未添加
    不重复计费:服务器月租只计入“云服务器租用”;数据库、日志、备份等已包含在服务器套餐时,公共基础服务费填 0。
    添加代理、第三方数据、人工审核等费用项目

    合同预算调整项

    明确计算基数,避免重复计费
    计算顺序:先核算研发实施与服务期成本,再计算一次性实施风险准备、项目服务与履约管理费,最后计算税费。下列比例均可按合同实际约定调整。
    仅按一次性研发、交付配套及其他一次性费用计算,用于范围变化、第三方网站变化和验收返工等实施不确定性。
    按实施成本、服务期成本及风险准备的合计计算,覆盖项目责任、持续协调、服务响应和履约管理。
    按税前合同金额计算;应根据实际纳税主体、发票类型和适用税率调整。
    最终验收后,免费修复已验收范围内缺陷的期限;不包含新增需求和第三方变化。
    本预算可被接受的期限;超过期限后可根据人力、模型和云资源价格重新核算。

    合同范围边界

    随报价摘要一并导出
    网页数、巡检间隔、AI 比例以本方案为上限。
    网站改版、验证码、登录和反爬变化走变更评估。
    模型、云、代理和第三方数据随供应商价格调整。
    新增功能、指标和报表进入书面变更流程。
    质保仅修复已验收范围缺陷,不含新增需求。
    实施款建议按启动 40%、阶段 40%、验收 20%。

    项目预算决策报告

    同时呈现项目投入基准、建议合作预算、审慎预算上限和主要成本驱动因素,便于投资评审与商务沟通。

    预算区间

    审慎预算按用量与研发周期不确定性计算
    项目投入基准¥0

    研发实施投入 + 首个服务月成本,不含商务服务费和税费。

    审慎预算上限¥0

    同时考虑用量上浮和研发周期延长,用于资金储备与风险评审。

    敏感性分析

    每项单独上浮 20% 的合同价影响

    依据补充清单

    内部操作,不进入对外评分

    合作预算逐项计算

    实施阶段合同款 + 服务期合同款
    研发与交付基础投入:¥0
    服务期持续成本:¥0
    实施风险准备:¥0
    项目服务与履约管理费:¥0
    税费:¥0
    建议合作预算(实施 + 全服务期):¥0

    可复制预算摘要

    包含岗位、公式、付款和范围边界
    查看方法依据与计算公式
    方法采用技术基线、工作分解、假设记录、生命周期成本、敏感性分析和风险区间;运行成本同时给出单位成本,便于后续用实际账单持续校正。
    `} function canvasPage(title,subtitle,pageNo){const canvas=document.createElement('canvas');canvas.width=1240;canvas.height=1754;const x=canvas.getContext('2d');x.fillStyle='#fff';x.fillRect(0,0,canvas.width,canvas.height);x.fillStyle='#075c4b';x.fillRect(0,0,canvas.width,18);x.fillStyle='#173c32';x.font='700 42px "PingFang SC","Microsoft YaHei",sans-serif';x.fillText(title,76,92);x.fillStyle='#6b756f';x.font='20px "PingFang SC","Microsoft YaHei",sans-serif';x.fillText(subtitle,76,128);x.strokeStyle='#d8e1da';x.beginPath();x.moveTo(76,151);x.lineTo(1164,151);x.stroke();x.fillStyle='#8a938e';x.font='17px sans-serif';x.fillText(`${$('projectName').value} · 第 ${pageNo} 页`,76,1710);return{canvas,x,y:190}} function drawSection(p,title){p.y+=12;p.x.fillStyle='#173c32';p.x.font='700 27px "PingFang SC","Microsoft YaHei",sans-serif';p.x.fillText(title,76,p.y);p.y+=18;p.x.fillStyle='#075c4b';p.x.fillRect(76,p.y,1088,3);p.y+=25} function wrapCanvasText(x,text,maxWidth){const out=[];let line='';for(const ch of String(text)){if(ch==='\n'){out.push(line);line='';continue}const next=line+ch;if(x.measureText(next).width>maxWidth&&line){out.push(line);line=ch}else line=next}if(line)out.push(line);return out} function drawTable(p,headers,rows,widths){const left=76,total=widths.reduce((a,v)=>a+v,0),rowH=48;p.x.font='700 18px "PingFang SC","Microsoft YaHei",sans-serif';p.x.fillStyle='#eaf2ed';p.x.fillRect(left,p.y,total,rowH);let cx=left;headers.forEach((h,i)=>{p.x.fillStyle='#29483e';p.x.fillText(h,cx+9,p.y+30);cx+=widths[i]});p.y+=rowH;p.x.font='17px "PingFang SC","Microsoft YaHei",sans-serif';rows.forEach((row,ri)=>{p.x.fillStyle=ri===rows.length-1&&String(row[0]).includes('合计')?'#eef5f0':ri%2?'#fbfcfa':'#fff';p.x.fillRect(left,p.y,total,rowH);cx=left;row.forEach((v,i)=>{p.x.fillStyle='#34453f';const t=String(v),tx=i===0?cx+9:cx+widths[i]-9-p.x.measureText(t).width;p.x.fillText(t,tx,p.y+30);cx+=widths[i]});p.x.strokeStyle='#dce4de';p.x.strokeRect(left,p.y,total,rowH);p.y+=rowH});p.y+=16} function drawOverviewPage(s,c,high){const p=canvasPage('项目预算图文报告','预算总览、成本构成与月度运行成本',1);const cards=[['建议合作预算',CNY.format(c.quote)],['一次性实施预算',CNY.format(c.implementation)],['月度服务预算',CNY.format(c.monthlyQuote)]];cards.forEach((v,i)=>{const x=76+i*362;p.x.fillStyle=i===0?'#075c4b':'#eef5f0';p.x.fillRect(x,p.y,344,112);p.x.fillStyle=i===0?'#cde9de':'#61706a';p.x.font='18px sans-serif';p.x.fillText(v[0],x+18,p.y+32);p.x.fillStyle=i===0?'#fff':'#075c4b';p.x.font='700 31px sans-serif';p.x.fillText(v[1],x+18,p.y+77)});p.y+=145;drawSection(p,'一、预算构成图');const vals=[['研发实施预算',c.dev],['服务期持续成本',c.recurring*s.serviceMonths],['风险准备',c.risk],['项目服务与履约管理费',c.margin],['税费',c.tax]],max=Math.max(...vals.map(v=>v[1]),1);vals.forEach(([n,v],i)=>{p.x.fillStyle='#43554e';p.x.font='19px sans-serif';p.x.fillText(n,76,p.y+22);p.x.fillStyle='#e7ece8';p.x.fillRect(300,p.y,650,25);p.x.fillStyle=['#075c4b','#397f9c','#bd7b16','#9b6550','#7d8882'][i];p.x.fillRect(300,p.y,Math.max(3,650*v/max),25);p.x.fillStyle='#263a33';p.x.font='700 19px sans-serif';p.x.fillText(CNY.format(v),980,p.y+22);p.y+=48});p.y+=8;p.x.fillStyle='#fff5dc';p.x.fillRect(76,p.y,1088,72);p.x.fillStyle='#684e20';p.x.font='19px sans-serif';p.x.fillText(`建议合作预算 ${CNY.format(c.quote)} · 审慎预算上限 ${CNY.format(high.quote)}`,94,p.y+43);p.y+=105;drawSection(p,'二、每月运行成本表');drawTable(p,['项目','计算依据','月度金额'],[['AI 模型服务',`${compact(c.input)} 输入 / ${compact(c.output)} 输出`,CNY.format(c.ai)],['公共基础服务','服务器外增量托管服务',CNY.format(s.platformCost)],['云服务器租用',`${c.workers} 台 × ${CNY.format(s.workerCost)}`,CNY.format(c.workerTotal)],['对象存储',`${fmt(c.stored,2)} GB × ${CNY_PRECISE.format(s.storageRate)}`,CNY_PRECISE.format(c.storage)],...extraCanvasRows(s.extras,'monthly',3),['合计','持续服务成本 / 月',CNY.format(c.recurring)]],[260,540,288]);return p.canvas} function drawStagesPage(s,c){const p=canvasPage('研发阶段与投入','时间甘特图、阶段人月与阶段成本',2);drawSection(p,'一、阶段时间甘特图');let start=0;PHASES.forEach((phase,i)=>{const d=s.phases[phase.key],fte=s.roles.reduce((a,r)=>a+r.allocation[phase.key],0),left=300+start/c.calendarMonths*650,width=d/c.calendarMonths*650;p.x.fillStyle='#334a42';p.x.font='19px sans-serif';p.x.fillText(phase.name,76,p.y+23);p.x.fillStyle='#e5ebe7';p.x.fillRect(300,p.y,650,28);p.x.fillStyle=['#075c4b','#397f9c','#6f9368','#bd7b16'][i];p.x.fillRect(left,p.y,Math.max(4,width),28);p.x.fillStyle='#263a33';p.x.font='700 18px sans-serif';p.x.fillText(`${fmt(d,2)}月 / ${fmt(d*fte,2)}人月`,975,p.y+22);start+=d;p.y+=58});p.y+=15;p.x.fillStyle='#eef5f0';p.x.fillRect(76,p.y,1088,66);p.x.fillStyle='#3f5b51';p.x.font='19px sans-serif';p.x.fillText(`自然周期 ${fmt(c.calendarMonths,2)} 个月;合计 ${fmt(c.personMonths,2)} 人月。阶段人月 = 阶段月数 × 岗位投入比例之和。`,94,p.y+40);p.y+=100;drawSection(p,'二、阶段投入与成本');const rows=PHASES.map(phase=>{const f=s.roles.reduce((a,r)=>a+r.allocation[phase.key],0);return[phase.name,`${fmt(s.phases[phase.key],2)} 月`,`${fmt(f,2)} FTE`,`${fmt(f*s.phases[phase.key],2)} 人月`,CNY.format(c.phaseCosts[phase.key])]});rows.push(['合计',`${fmt(c.calendarMonths,2)} 月`,'',`${fmt(c.personMonths,2)} 人月`,CNY.format(c.direct)]);drawTable(p,['阶段','周期','合计投入','阶段人月','阶段成本'],rows,[300,160,190,190,248]);drawSection(p,'三、交付配套及新增一次性费用');drawTable(p,['费用项目','金额'],[['项目管理与协调',CNY.format(s.deliveryItems.management)],['技术评审与交付文档',CNY.format(s.deliveryItems.review)],['部署、培训与验收',CNY.format(s.deliveryItems.acceptance)],['质保支持',CNY.format(s.deliveryItems.warranty)],...extraCanvasRows(s.extras,'oneoff',2),['交付及新增费用合计',CNY.format(c.delivery+c.extraOneoff)]],[780,308]);return p.canvas} function drawRolesPage(s,c){const p=canvasPage('岗位人月与费用','岗位职责、合计人月、人月单价与小计',3);drawSection(p,'岗位投入明细');const rows=s.roles.filter(r=>r.personMonths>0).map(r=>[r.name,`${fmt(r.personMonths,2)} 人月`,CNY.format(r.effective),CNY.format(r.cost)]);rows.push(['合计',`${fmt(c.personMonths,2)} 人月`,'',CNY.format(c.direct)]);drawTable(p,['岗位','合计人月','人月单价','小计'],rows,[390,220,220,258]);p.y+=20;p.x.fillStyle='#eef5f0';p.x.fillRect(76,p.y,1088,165);p.x.fillStyle='#365248';p.x.font='700 22px sans-serif';p.x.fillText('研发实施预算',98,p.y+42);p.x.font='19px sans-serif';p.x.fillText(`岗位直接投入 ${CNY.format(c.direct)}`,98,p.y+82);p.x.fillText(`+ 交付配套费用 ${CNY.format(c.delivery)}`,98,p.y+113);p.x.font='700 25px sans-serif';p.x.fillStyle='#075c4b';p.x.fillText(`= ${CNY.format(c.dev)}`,800,p.y+101);return p.canvas} function drawTextPages(){const pages=[],paragraphs=currentReport.split('\n');let p=canvasPage('完整测算说明','计算公式、范围边界与待确认事项',4);p.x.font='19px "PingFang SC","Microsoft YaHei",sans-serif';p.x.fillStyle='#34453f';for(const para of paragraphs){const lines=wrapCanvasText(p.x,para||' ',1060);for(const line of lines){if(p.y>1630){pages.push(p.canvas);p=canvasPage('完整测算说明(续)','计算公式、范围边界与待确认事项',pages.length+4);p.x.font='19px "PingFang SC","Microsoft YaHei",sans-serif';p.x.fillStyle='#34453f'}p.x.fillText(line,76,p.y);p.y+=31}p.y+=para?7:16}pages.push(p.canvas);return pages} function jpegBytes(canvas){const b64=canvas.toDataURL('image/jpeg',.92).split(',')[1],raw=atob(b64),out=new Uint8Array(raw.length);for(let i=0;ienc.encode(s),objects=[],kids=[];objects[1]=ascii('<< /Type /Catalog /Pages 2 0 R >>');canvases.forEach((canvas,i)=>{const page=3+i*3,image=page+1,content=page+2,jpeg=jpegBytes(canvas),stream=ascii(`q\n595.28 0 0 841.89 0 0 cm\n/Im${i+1} Do\nQ`);kids.push(`${page} 0 R`);objects[page]=ascii(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 595.28 841.89] /Resources << /XObject << /Im${i+1} ${image} 0 R >> >> /Contents ${content} 0 R >>`);objects[image]=[ascii(`<< /Type /XObject /Subtype /Image /Width ${canvas.width} /Height ${canvas.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${jpeg.length} >>\nstream\n`),jpeg,ascii('\nendstream')];objects[content]=[ascii(`<< /Length ${stream.length} >>\nstream\n`),stream,ascii('\nendstream')]});objects[2]=ascii(`<< /Type /Pages /Count ${canvases.length} /Kids [${kids.join(' ')}] >>`);const chunks=[ascii('%PDF-1.4\n')],offsets=[0];let offset=chunks[0].length;for(let i=1;ia+v.length,0)}const xref=offset,x=[`xref\n0 ${objects.length}\n0000000000 65535 f \n`];for(let i=1;i>\nstartxref\n${xref}\n%%EOF`);chunks.push(ascii(x.join('')));return new Blob(chunks,{type:'application/pdf'})} function printVisualPdf(button){const btn=button instanceof HTMLElement?button:null,old=btn?btn.innerHTML:'';if(btn){btn.disabled=true;btn.innerHTML=btn.id==='printReportBtn'?'正在生成 PDF…图表与表格正在渲染':'正在生成…'}try{calculate();const {s,c,high}=currentCalc,canvases=[drawOverviewPage(s,c,high),drawStagesPage(s,c),drawRolesPage(s,c),...drawTextPages()],blob=makePdf(canvases),a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download=`${$('projectName').value}-图文预算报告.pdf`;document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(a.href),3000);if(btn)btn.innerHTML=btn.id==='printReportBtn'?'PDF 已下载请在下载列表中查看':'PDF 已下载'}catch(e){console.error(e);alert('PDF 生成失败,请改用“导出 HTML 报告”。')}setTimeout(()=>{if(btn){btn.disabled=false;btn.innerHTML=old}},2200)} function openExportSheet(){calculate();$('exportSheet').classList.add('open');$('exportSheet').setAttribute('aria-hidden','false')} function closeExportSheet(){$('exportSheet').classList.remove('open');$('exportSheet').setAttribute('aria-hidden','true')} async function shareReport(){calculate();try{if(navigator.share){await navigator.share({title:`${$('projectName').value}预算报告`,text:currentReport})}else{await navigator.clipboard.writeText(currentReport);alert('报告已复制,可粘贴到微信或邮件发送。')}}catch(e){if(e.name!=='AbortError')alert('当前浏览器无法分享,请改用导出 HTML 或文本。')}} function updateMobileDock(){if(!$('mobileStepText'))return;$('mobileStepText').textContent=`第 ${activeStep} / 4 步`;$('mobileQuote').textContent=currentCalc?CNY.format(currentCalc.c.quote):'计算中';$('mobilePrev').disabled=activeStep===1;$('mobileNext').textContent=activeStep===4?'导出结果':'下一步'} const originalShowStep=showStep;showStep=function(n){originalShowStep(n);updateMobileDock()}; document.addEventListener('DOMContentLoaded',()=>{$('mobilePrev').addEventListener('click',()=>showStep(Math.max(1,activeStep-1)));$('mobileNext').addEventListener('click',()=>activeStep===4?openExportSheet():showStep(Math.min(4,activeStep+1)));$('exportSheet').addEventListener('click',e=>{if(e.target===$('exportSheet'))closeExportSheet()});$('exportClose').addEventListener('click',closeExportSheet);$('shareReportBtn').addEventListener('click',shareReport);$('htmlReportBtn').addEventListener('click',()=>downloadFile(standaloneReport(),'text/html;charset=utf-8','预算报告.html'));$('textReportBtn').addEventListener('click',()=>{calculate();downloadFile(currentReport,'text/plain;charset=utf-8','预算报告.txt')});$('printReportBtn').addEventListener('click',()=>{closeExportSheet();printVisualPdf($('printReportBtn'))});$('jsonPlanBtn').addEventListener('click',()=>$('exportBtn').click());updateMobileDock()});