我的工作台
{{ workbenchGreeting }},{{ currentUser.name || '同事' }}
{{ currentUser.dept || '未设置部门' }} · {{ currentUser.role || '未设置角色' }} · {{ workbenchDateText }}
⌕
没有找到可访问的功能
审批中心
集中处理合同、开票、付款和行政人事审批。
暂无符合条件的审批事项
审批内容
审批过程
完整审批环节及耗时{{step.title}}{{step.status}} 处理人:{{step.owner}}环节用时 {{approvalDetailStepDuration(step)}}
开始:{{step.started_at || '-'}}结束:{{step.ended_at || '进行中'}}意见:{{step.note}}
暂无审批详情
个人待办
优先处理和你直接相关的消息、任务与审批。
我的付款申请
最近 5 条我发起的付款申请及审批进度。
暂无付款申请
待我审批
需要我审批的付款申请。
暂无待审批付款申请
我的便签
记录临时事项,按账号保存在本机。
{{ note.text }}
{{ note.created_at }}
暂无便签
常用入口
把高频工作放在手边,按账号保存。
最近打开
像浏览器一样回到刚才的页面。
暂无最近打开页面
选择你最常用的功能,保存后只显示在当前账号的“我的工作台”。
选择要显示在“我的工作台”的模块,配置会跟随当前账号云端保存。
审批中心
集中处理与我相关的合同、开票、付款和行政人事审批。
{{card.label}}
{{card.value}}
部门工作台
{{ canEnterDept('marketing') ? '可用' : '无权限' }}
市场部
报价、合同、进度追踪与客户管理
智能报价
合同审批 · 签订 · 归档
合同下单 · 合同管理
进度查询(合同·采样·报告全流程)
CRM 客户关系管理未上线
{{ canEnterDept('sampling') ? '可用' : '无权限' }}
采样室
任务派发、排期派单、现场执行、资源台账
任务派发 · 主管视图
排期时间线 · 智能排期
任务单生成 · 现场记录
现场踏勘 · 采样统计
仪器台账 · 车辆管理
{{ canEnterDept('lab') ? '可用' : '无权限' }}
实验室
样品流转、检测任务、耗材/设备台账
流转单管理 · 样品管理
检测任务 · 我的任务
超时任务 · SLA 规则
提交原始记录 · 实验室统计
耗材管理 · 设备台账
{{ canEnterDept('report') ? '可用' : '无权限' }}
报告室
AI 智能生成检测报告、报告审核归档
智能生成报告(数据库 / OCR)
待生成报告队列
任务流转看板
报告任务流(编制·三审·签发·归档)
规划中
行政部
员工、考勤、办公用品与会议室
员工档案未上线
考勤管理未上线
办公用品未上线
会议室预定未上线
{{ canEnterDept('finance') ? '可用' : '无权限' }}
财务部
银行流水、科目归类、财务看板
财务总览看板
银行流水 · 收支查询
待归类点审 · 智能分类
供应商白名单
发票管理
未收款合同
{{ canEnterDept('knowledge') ? '可用' : '无权限' }}
企业知识库
标准、制度、SOP、培训、模板与案例
标准规范 · 作业指导书
管理制度 · 培训资料
表单模板 · 历史案例
上传 / 搜索 / 下载
{{ canEnterDept('bizDashboard') ? '可用' : '无权限' }}
数据看板
业务 / 生产 / 财务多维度数据分析
业务看板(合同·签约金额)
生产看板(采样·检测·报告)
财务看板(收支·成本)
⓵UI 已上线,部分指标占位中
📌 我的报告任务
刷新
只显示状态机轮到您处理的报告 · 共 {{ myDraftingTasks.length }} 条
| 报告编号 | 委托方 | 受检方 | 状态 | 采样室提交 | 实验室提交 | 报告室收纸质 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ rt.task_no }} | {{ rt.client_unit || '—' }} | {{ rt.company_name_full || rt.company_name }} |
|
|
|
采样 |
|
| 暂无轮到您处理的报告任务 | |||||||
报告编号: {{ workspaceData.task.task_no }}
委托方: {{ workspaceData.sampling_task.client_unit || '—' }}
受检方: {{ workspaceData.sampling_task.company_name || '—' }}
编制人: {{ workspaceData.task.drafter_name || '—' }}
📋 采样信息
{{ workspaceData.sampling_passed_count||0 }} / {{ workspaceData.sampling_file_count||0 }} 已审
采样点位 ({{ workspaceData.sampling_points.length }} 个) ·
现场照片 {{ workspaceData.sampling_photo_count }} 张
📦 下载现场照片 zip
| 点位 | 样品类型 | 检测项目 | 点数 | 天数 | 频次 | 执行标准 |
|---|---|---|---|---|---|---|
| {{ p.point_name || '—' }} | {{ p.sample_type || '—' }} | {{ p.test_items || '—' }} | {{ p.point_count }} | {{ p.days }} | {{ p.frequency }} | {{ p.standard || '—' }} |
采样表格 ({{ workspaceData.sampling_files.length }} 张) — 编制人只读 + 审核
| 文件名 | 主管审核 | 操作 | 编制人审核时间 |
|---|---|---|---|
| {{ f.filename }} |
|
|
{{ f.drafter_audited_at || '—' }} |
采样室还未生成任何表格
现场照片 (按点位)
📍 {{ grp.point_name }}
· {{ grp.photos.length }} 张
异常: {{ grp.abnormal_reason || '—' }}
现场暂无上传照片
🧪 实验室检测信息
{{ workspaceData.lab_passed_count||0 }} / {{ workspaceData.lab_file_count||0 }} 已审
实验室原始记录表 ({{ workspaceData.lab_files.length }} 张) — 编制人只读 + 审核
| 文件名 | 实验室三级审核 | 操作 | 编制人审核时间 |
|---|---|---|---|
| {{ f.filename }} |
分析: {{ f.supervisor_audit.analyst.join('/') }}
校核: {{ f.supervisor_audit.reviewer.join('/') }}
审核: {{ f.supervisor_audit.approver.join('/') }}
|
|
{{ f.drafter_audited_at || '—' }} |
实验室还未生成原始记录表
✅ 报告室审核(编制人确认前置条件)
进度: {{ workspaceReviewedCount }} / {{ (workspaceData.review_items||[]).length }} 已勾选
🤖 全部审核通过,可进入智能生成报告环节
点击下方按钮跳转到「智能编制报告」页面,任务号已自动带入,你可以选择对应的报告模板后一键生成.
⏳ 还不能进入生成报告环节: {{ workspaceGateReason }}。
所有采样表格 + 实验室原始记录表都点「已审」+ 6 项前置条件全部勾选后,才能开启「一键生成报告」按钮。
📋 待生成报告
刷新
扫描所有「采样已完成」的任务,按齐全度分类
{{ genQueue.stats.ready_count || 0 }}
✅ 可生成
{{ genQueue.stats.pending_receive_count || 0 }}
📦 等收纸质
{{ genQueue.stats.waiting_lab_count || 0 }}
🧪 缺实验室上交
{{ genQueue.stats.waiting_sampling_count || 0 }}
📝 缺采样上交
| 任务号 | 受检单位 | 项目 | 采样收到 | 实验室收到 | 操作 |
|---|---|---|---|---|---|
| {{ t.task_no }} | {{ t.company_name }} | {{ t.project_name }} | {{ t.received_sampling_at || '—' }} | {{ t.received_lab_at || '—' }} |
|
| 暂无可生成的任务 | |||||
💡 这些任务前两个部门已在系统点了"上交",但纸质版还没送到报告室。延迟时长用于度量前面部门的工作质量。
| 任务号 | 受检单位 | 采样:线上提交 | 实验室:线上提交 | 接收纸质(点击记录时间) |
|---|---|---|---|---|
| {{ t.task_no }} | {{ t.company_name }} |
{{ t.sampling_records_submitted_at || '—' }}
⏱ 滞后 {{ formatPendingDelay(t.sampling_pending_minutes) }}
|
{{ t.lab_records_submitted_at || '—' }}
⏱ 滞后 {{ formatPendingDelay(t.lab_pending_minutes) }}
|
✓ 采样:{{ t.received_sampling_at }}
✓ 实验室:{{ t.received_lab_at }}
|
| 无等收纸质的任务 | ||||
| 任务号 | 受检单位 | 项目 | 采样收到 | 检测进度 | 操作 |
|---|---|---|---|---|---|
| {{ t.task_no }} | {{ t.company_name }} | {{ t.project_name }} | {{ t.received_sampling_at || '—' }} |
|
|
| 无 | |||||
| 任务号 | 受检单位 | 项目 | 采样完成时间 | 说明 |
|---|---|---|---|---|
| {{ t.task_no }} | {{ t.company_name }} | {{ t.project_name }} | {{ t.sampling_completed_at || '—' }} | 需采样室上交原始记录 |
| 无 | ||||
💡 不等整单提交,只要采样/实验室逐条审核通过,报告室就能实时看到。点击任务行可展开看「已审核明细」。
{{ auditRealtime.stats.all_passed || 0 }}
✅ 全部审核通过
{{ auditRealtime.stats.in_progress || 0 }}
⏳ 部分通过
{{ auditRealtime.stats.no_audit_yet || 0 }}
⌛ 尚未审核
| 任务号 | 受检单位 | 项目 | 采样审核 (已通过/总数) | 实验室审核 (已通过/总数) | 总进度 | 操作 | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ auditExpanded[t.task_no] ? '▼' : '▶' }}{{ t.task_no }} | {{ t.company_name }} | {{ t.project_name }} |
|
|
{{ t.overall_passed }}/{{ t.overall_total }} |
|
||||||||||||||||||
|
📝 采样审核明细 ({{ t.sampling.passed }}/{{ t.sampling.total }})
尚无审核表格
🧪 实验室检测审核明细 ({{ t.lab.passed }}/{{ t.lab.total }})
尚无检测任务
|
||||||||||||||||||||||||
| 暂无任务,等待采样/实验室录入 | ||||||||||||||||||||||||
受检单位: {{ auditDetailTask.company_name }}
项目: {{ auditDetailTask.project_name }}
采样状态: {{ auditDetailTask.sampling_status }}
采样完成日: {{ auditDetailTask.sampling_completed_at || '—' }}
{{ auditDetailTask.sampling.passed }} / {{ auditDetailTask.sampling.total }}
📝 采样审核通过
{{ auditDetailTask.lab.passed }} / {{ auditDetailTask.lab.total }}
🧪 实验室检测通过
📝 采样表格审核明细
无
🧪 实验室检测审核明细
无
🔄 任务流转看板
刷新
每张任务当前阶段 + 停留时长 + 负责人
卡 > 小时飘红
{{ kanban.stats.total || 0 }}
总任务
{{ kanban.stats.stuck || 0 }}
⚠ 卡住
{{ kanban.stats.completed || 0 }}
✅ 已完成
{{ dept }}:{{ c }}
按部门分布
| 任务号 | 受检单位 | 项目 | 当前阶段 | 部门 | 负责人 | 停留时长 | 最近完成节点 |
|---|---|---|---|---|---|---|---|
| {{ t.task_no }} | {{ t.company_name }} | {{ t.project_name }} |
|
{{ t.current_dept || '—' }} | {{ t.owner || '—' }} | {{ t.stuck_hours }} h | {{ t.last_done_at || '—' }} |
| 暂无任务 | |||||||
报告运营中心
资料齐套、风险预警、人员负荷和工作量统一管理,不改变原报告状态机。
{{ x.t }}
{{ x.v || 0 }}
节点时效预警当前节点超过对应时效阈值
{{ reportOperations.sla.items.slice(0,3).map(x=>x.task_no+' '+x.status+' 已停留 '+x.hours+'h').join(';') }}
暂无节点超时任务
数据质量中心重复编号与历史台账完整性
重复报告号 {{(reportOperations.quality||{}).duplicate_report_no?.length||0}} · 重复任务号 {{(reportOperations.quality||{}).duplicate_task_no?.length||0}} · 历史缺字段 {{(reportOperations.quality||{}).incomplete_historical?.length||0}}
风险与缺件任务
| 任务号 | 当前状态 | 优先级 | 承诺日 | 待补资料 |
|---|---|---|---|---|
| {{r.task_no}} | {{r.status}} | {{r.priority}} | {{r.due_date||'—'}} | {{(r.gaps||[]).join('、')||'交付超期'}} |
| 暂无风险任务 | ||||
编制人负荷建议
{{p.name}}{{p.pending_score}} 分
{{p.suggestion_reason}}
暂无可用负荷数据
月度工作量结算生成待结算快照 确认本月结算 生成后锁定任务及分数快照;已结算不被后续任务编辑覆盖。
📈 报告室仪表盘
刷新
产能 · 产值统计
📋 报告任务总数
{{ reportDashboard.kpi.total }}
⏳ 编制 + 审核中
{{ (reportDashboard.kpi.drafting||0) + (reportDashboard.kpi.reviewing||0) }}
编制 {{ reportDashboard.kpi.drafting||0 }} · 审核 {{ reportDashboard.kpi.reviewing||0 }}
✅ 累计已签发
{{ reportDashboard.kpi.issued_total }}
本月 {{ reportDashboard.kpi.issued_this_month }} · 本年 {{ reportDashboard.kpi.issued_this_year }}
⌛ 平均出报告天数
{{ reportDashboard.kpi.avg_days_to_issue }}天
样本数 {{ reportDashboard.kpi.timed_sample_size }}
💰 累计签发产值
¥{{ formatMoney(reportDashboard.kpi.revenue_issued_total) }}
📅 本年签发产值
¥{{ formatMoney(reportDashboard.kpi.revenue_issued_year) }}
📆 本月签发产值
¥{{ formatMoney(reportDashboard.kpi.revenue_issued_month) }}
📊 状态分布
| 状态 | 数量 | 占比 |
|---|---|---|
| {{ s.name }} | {{ s.value }} | {{ ((s.value/(reportDashboard.kpi.total||1))*100).toFixed(1) }}% |
📈 月度签发趋势(最近12月)
| 月份 | 签发数 | 条形 |
|---|---|---|
| {{ m.month }} | {{ m.cnt }} |
👤 编制人产能排行
| 名次 | 编制人 | 承接总数 | 已编制 | 已签发 | 在编中 |
|---|---|---|---|---|---|
| {{ i+1 }} | {{ d.name }} | {{ d.total }} | {{ d.drafted }} | {{ d.issued }} | {{ d.in_progress }} |
| 暂无编制人数据 | |||||
🏅 编制人工作量统计(绩效)
按月
按年
查询
| 名次 | 编制人 | 本期已签发 | 计分总分 | 当前在制 |
|---|---|---|---|---|
| {{ i+1 }} | {{ d.name }} | {{ d.issued }} | {{ d.score_total }} | {{ d.in_progress }} |
| 本期暂无编制人工作量数据 | ||||
统计口径:状态为已签发/待签收/已签收的报告,期间按 签发时间→报告日期→创建时间 依次兜底(历史报告补录签发时间后自动归入正确月份);计分取快照(有人工调整分时取调整分);「当前在制」为待编制+编制中,与期间无关
🔍 审核环节产能
{{ g.role }} (top 10)
| {{ it.name }} | {{ it.cnt }} |
| 无 | |
{{ reportTaskStats[s] || 0 }}
{{ s }}
{{ reportTaskStats['合同编号缺失'] || 0 }}
合同编号缺失
| 报告编号 | 委托方 | 受检方 | 采样日期 | 分析日期 | 样品类型 | 点位/样品 | 合同编号 | 状态 | 签发时间 | 已签收时间 | 编制人 | 采样室提交 | 实验室提交 | 报告室接收记录 | 来源 | 操作 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ rt.point_count || 0 }} / {{ rt.sample_count || 0 }} | — | — | {{ rt.drafter_name }} 未指派 |
|
|
|
|
|||||||||
| 暂无报告任务 | ||||||||||||||||
支持 .xlsx/.xls 格式。导入后只建立报告任务记录,不补全采样/检测明细。
已存在于系统中的历史报告默认会更新;若取消勾选覆盖,则跳过已存在的非历史记录。
已存在于系统中的历史报告默认会更新;若取消勾选覆盖,则跳过已存在的非历史记录。
预检:解析 {{reportTaskImportDlg.inspect.total}} 条,唯一任务 {{reportTaskImportDlg.inspect.unique_task_count}} 条;重复任务 {{(reportTaskImportDlg.inspect.duplicate_task_nos||[]).length}} 条;异常 {{(reportTaskImportDlg.inspect.issues||[]).length}} 条。
示例:{{reportTaskImportDlg.inspect.issues.slice(0,3).map(x=>x.task_no+' '+x.issue).join(';')}}
报告编号: {{ assignDrafterDlg.task_no }}
当前编制人: {{ assignDrafterDlg.current_drafter || '未指派' }}
当前编制人: {{ assignDrafterDlg.current_drafter || '未指派' }}
选择编制人 *
计分核实
加载中...
已人工调整为 {{ assignScore.adjusted_score }} 分({{ assignScore.adjustment_reason }})
| 介质 | 项目数 | 点位数 | 分项得分 |
|---|---|---|---|
| {{ row.label }} | {{ scoreItem(assignScore.preview, row.label) }} |
类别系数 ×{{ (assignScore.preview && assignScore.preview.business_factor) || 1 }} 规则总分 {{ (assignScore.preview && assignScore.preview.score) || 0 }} 分
保存计分修正
计分规则:废水/废气 = 点位数 ×(1 + 项目数每满 5 项加 0.5 档,废气上限 +1.5、废水上限 +3);无组织废气 = 项目数 ≤5 得 3 分、6~10 得 4 分、>10 得 5 分;噪声 = 项目数 ≤5 得 1 分、6~10 得 1.5 分、>10 得 2 分;类别系数:委托/送样 ×1,环评/比对 ×1.2,验收/比对验收 ×2
加载中...
签发前必填,建议现在填写
签发前必填,建议现在填写
| 介质 | 项目数 | 点位数 | 分项得分 |
|---|---|---|---|
| {{ row.label }} | {{ scoreItem(reportTaskEditForm.scorePreview, row.label) }} |
类别系数 ×{{ (reportTaskEditForm.scorePreview && reportTaskEditForm.scorePreview.business_factor) || 1 }} 总分 {{ (reportTaskEditForm.scorePreview && reportTaskEditForm.scorePreview.score) || 0 }} 分导入任务单自动识别,有误直接改项目数/点位数,保存时随报告写入
计分规则:废水/废气 = 点位数 ×(1 + 项目数每满 5 项加 0.5 档,废气上限 +1.5、废水上限 +3);无组织废气 = 项目数 ≤5 得 3 分、6~10 得 4 分、>10 得 5 分;噪声 = 项目数 ≤5 得 1 分、6~10 得 1.5 分、>10 得 2 分;类别系数:委托/送样 ×1,环评/比对 ×1.2,验收/比对验收 ×2
自动生成检测报告
从数据库生成
输入报告编号,自动拉取采样和检测数据
OCR识别生成
上传检测数据图片,AI自动识别整理
第一步:选择任务
或直接选择已有任务:
第一步:上传检测数据
📤
点击或拖拽文件到此处上传
支持 PNG / JPG 图片、Excel(.xlsx)、Word(.docx),可多选混传
{{ f.icon }}
{{ f.file.name }}
✕
🤖 OCR 识别进度 ({{ reportOcrProgress.current }}/{{ reportOcrProgress.total }})
{{ log }}
第二步:本地 OCR 识别结果
{{ ocrText }}
✨ AI 正在整理数据 ▊
{{ reportAiStream }}
{{ reportMode === 'db' ? '第二步:核对数据(可编辑)' : '第三步:确认结构化数据' }}
{{ reportDbStats.sampleCount }}
样品数
{{ reportDbStats.itemCount }}
检测项目
{{ reportDbStats.ndCount }}
未检出 (ND)
{{ reportDbStats.wastewaterCount }}
废水数据
{{ reportDbStats.gasCount }}
废气数据
封面信息
检测概况
气象参数
检测内容
| 样品类型 | 采样点位 | 检测项目 | 样品状态 | |
|---|---|---|---|---|
{{ wt.title || '废水检测结果 ' + (wi+1) }}
| 采样点位 | 检测项目 | 单位 | 检测结果 | 标准限值 | |
|---|---|---|---|---|---|
有组织废气检测结果
| 采样点位 | 检测项目 | 标干流量 | 实测浓度 | 排放速率 | 标准限值 | |
|---|---|---|---|---|---|---|
锅炉废气检测结果
| 采样点位 | 检测项目 | 标干流量 | 实测浓度 | 折算浓度 | 排放速率 | 标准限值 | |
|---|---|---|---|---|---|---|---|
无组织废气检测结果
| 检测项目 | 参照点1# | 监控点2# | 监控点3# | 监控点4# | 标准限值 | |
|---|---|---|---|---|---|---|
厂区内无组织废气
| 采样点位 | 检测项目 | 检测结果 | 标准限值 | |
|---|---|---|---|---|
噪声检测结果
| 采样点位 | 主要声源 | 昼间结果 | 夜间结果 | 昼间标准 | 夜间标准 | |
|---|---|---|---|---|---|---|
附表1:检测方法、分析仪器、检出限
| 样品类型 | 检测项目 | 检测方法 | 分析仪器 | 检出限 | |
|---|---|---|---|---|---|
✅
报告生成成功!
{{ resultFilename }}
📈 业务数据
刷新
(数据尚未接入,以下为占位)
—
合同总数
已签订累计
—
本月签约金额
新签+续签
—
本月任务数
下单任务
—
加急任务
priority=加急
📊 近12个月签约金额趋势
ECharts 柱状图占位
🥧 客户类型分布
ECharts 饼图占位
🏆 TOP10 客户(按合同金额)
数据表格占位
🏭 生产数据
刷新
(数据尚未接入,以下为占位)
—
本月采样任务
—
完成率
—
超期率
—
样品总数
—
检测条目
👷 采样员工作量排行
ECharts 横向柱状图占位
🧪 样品类型分布
ECharts 饼图占位(废水/有组织/无组织/噪声/土壤)
📅 日任务完成趋势(近30天)
ECharts 折线图占位
💰 财务数据
刷新
{{ receivableSopVisible ? '收起 SOP' : '查看应收账款 SOP' }}
应收账款 = 已开票未收 + 计划月已到+报告已交付未收
📌 应收账款的判定规则与流程 SOP
应收账款 = 满足下列任一条件 + 未收款
① 已开发票:财务"发票管理"录入发票后,对应回款计划立即列为应收
② 回款计划月已到 + 报告已交付:客户经理点"接收报告"后自动联动
回款计划月未到 / 报告未交付 → 不计入应收(视为正常履约中)
谁该做什么动作
📥 客户付款 → 财务在"回款销账"勾"已收"
🧾 开票 → 财务在"发票管理"新增发票(绑回款计划)
📦 报告交付 → 客户经理在报告任务流程点"接收报告"
兜底:合同详情→回款计划→"标记交付"按钮
兜底:合同详情→回款计划→"标记交付"按钮
¥{{ formatMoney(receivableStats.total_amount) }}
应收账款总额
{{ receivableStats.total_contracts || 0 }}家客户 · {{ receivableStats.total_plans || 0 }}笔回款
¥{{ formatMoney(receivableStats.bucket_0_30) }}
0-30 天
正常账期
¥{{ formatMoney(receivableStats.bucket_31_60) }}
31-60 天
需要催款
¥{{ formatMoney(receivableStats.bucket_61_90) }}
61-90 天
明显逾期
¥{{ formatMoney(receivableStats.bucket_90_plus) }}
90+ 天
高风险 / 坏账
📋 应收账款明细
账龄: {{ receivableBucket }} 天
查询
重置
共 {{ receivableTotal }} 笔
| 合同编号 | 委托单位 | 受检单位 | 期次 | 计划月 | 应收金额 | 原因 | 起算日 | 账龄(天) | 客户经理 |
|---|---|---|---|---|---|---|---|---|---|
| {{ r.contract_no }} | {{ r.seq }} | {{ r.plan_month || '-' }} | ¥{{ formatMoney(r.amount) }} | {{ r.reason }} | {{ r.aging_since || '-' }} | {{ r.aging_days }} | {{ nameOnly(r.account_manager) || '-' }} | ||
| {{ receivableLoading ? '加载中...' : '暂无应收账款' }} | |||||||||
📏 执行标准查询
查询
新增标准
共 {{ kbStandards.length }} 条
📊 标准限值查询
执行标准 {{ kbLimStandards.length }} 份
标准限值 {{ kbLimTotalRows.toLocaleString() }} 条
共 {{ kbLimResults.length }} 条结果
(已达上限 2000 条,请收窄条件)
· 标准 {{ kbLimFilter.standard }}
· 项目 {{ kbLimFilter.test_item }}
🔍
请选择标准号或输入检测项目开始查询
数据库共 {{ kbLimTotalRows.toLocaleString() }} 条限值记录,覆盖国标、行标、广东地标
🤖 基于企业知识库的AI问答
· AI 仅基于知识库已入库文件回答,不使用训练数据或常识补充
· 未收录的内容会如实告知"知识库无相关资料"
· 支持文档格式:Word / PDF / Excel / TXT / Markdown(图片类文件无法进入检索)
· 未收录的内容会如实告知"知识库无相关资料"
· 支持文档格式:Word / PDF / Excel / TXT / Markdown(图片类文件无法进入检索)
💬
输入问题开始对话。例如:"颗粒物采样的空白样规则是什么?"
"HJ836 对无组织废气监测有什么要求?"
{{ m.role==='user' ? '我' : (m.model_name || 'AI') }}
{{ m.content }}
📎 参考资料:
{{ s.category }} · {{ s.title }}
📋 企业 SOP(标准操作流程)
· 以下流程基于领航检测 AI 系统的实际功能整理,每条 SOP 对应一个可在系统里执行的闭环动作。
· 同事入职 / 角色转换时,按所在部门对应的 SOP 列表通读一遍即可上手。
· 流程有调整时,先在系统里做改动,本页 SOP 同步更新。
· 同事入职 / 角色转换时,按所在部门对应的 SOP 列表通读一遍即可上手。
· 流程有调整时,先在系统里做改动,本页 SOP 同步更新。
分类筛选:
{{ cat }}
{{ s.title }}
{{ s.category }}
👤 {{ s.actor }}
{{ s.steps.length }} 步
📌 适用场景:{{ s.scenario }}
🎯 操作步骤:
- {{ step }}
🔗 系统入口:{{ s.entry }}
✅ 完成标志:{{ s.done }}
💡 {{ s.tip }}
没有匹配的 SOP
{{ kbStats.total || 0 }}
文件总数
{{ kbFormatSize(kbStats.total_size) }}
总大小
{{ kbCategoryList.length }}
分类数
{{ kbLatestTime || '—' }}
最近上传
{{ kbCategory || '全部文件' }}
搜索
+ 上传文件
{{ row.filename }}
📂
该分类下暂无文件,点击右上角「上传文件」上传
📄 {{ kbUploadForm.file.name }} · {{ kbFormatSize(kbUploadForm.file.size) }}
周期:
今日
本周
本月
本季度
本年
自定义
~
查询
导出Excel
{{ statsSummary.total_tasks || 0 }}
总任务
{{ statsSummary.completed || 0 }}
已完成
{{ statsSummary.completion_rate || 0 }}%
完成率
{{ statsSummary.on_time_rate || 0 }}%
及时率
{{ statsSummary.total_points || 0 }}
点位数
{{ statsSummary.total_samples || 0 }}
样品数
{{ statsSummary.vehicle_trips || 0 }}
出车次数
{{ statsSummary.field_days || 0 }}
外勤天数
{{ (statsSummary.abnormal||0)+(statsSummary.cancelled||0) }}
异常+取消
任务状态分布
每日任务趋势
人员工作量排行
| 姓名 | 任务数 | 完成 | 及时 | 点位数 | 样品数 | 外勤天 | 完成率 | 及时率 |
|---|---|---|---|---|---|---|---|---|
| {{ p.name }} | {{ p.total_tasks }} | {{ p.completed }} | {{ p.on_time }} | {{ p.points }} | {{ p.samples }} | {{ p.field_days }} | {{ p.completion_rate }}% | {{ p.on_time_rate }}% |
| 暂无数据 | ||||||||
{{ instStats.total }}
总数
{{ instStats.in_use }}
在用
{{ instStats.expiring_30 || 0 }}
30天内到期
{{ instStats.overdue }}
已超期
{{ instStats.checked_out }}
已领用
| 编号 | 名称 | 型号 | 分组 | 类别 | 有效期至 | 检验机构 | 状态 | 存放 | 操作 |
|---|---|---|---|---|---|---|---|---|---|
| {{ inst.instrument_name }} | {{ inst.model || '—' }} |
|
{{ inst.category || '—' }} | {{ inst.calibration_due || '—' }} | {{ inst.check_agency || '—' }} | {{ inst.location || '—' }} |
|
||
| 暂无仪器数据 | |||||||||
提前天数:
刷新
已超期 {{ overdueList.length }} 台
❗ 已超期
| 编号 | 名称 | 有效期至 | 超期天数 | 保管人 |
|---|---|---|---|---|
| {{ inst.instrument_name }} | {{ inst.calibration_due }} | {{ -inst.days_until_due }} | {{ inst.custodian }} {{ inst.custodian_phone }} |
⚠ 即将到期({{ expiringDays }}天内)
| 编号 | 名称 | 有效期至 | 剩余天数 | 保管人 |
|---|---|---|---|---|
| {{ inst.instrument_name }} | {{ inst.calibration_due }} | {{ inst.days_until_due }} | {{ inst.custodian }} {{ inst.custodian_phone }} | |
| 暂无即将到期仪器 | ||||
时间窗口:
天(包含已过期 + 未来 N 天内到期)
刷新
共 {{ maintData.total_items }} 台待送检
(过期 {{ maintData.total_overdue }}
+ 未来 {{ maintData.total_upcoming }})
分布在 {{ maintData.total_groups }} 个检验机构
当前窗口无待送检仪器
| 仪器 | 故障 | 报修人 | 维修方 | 状态 | 操作 |
|---|---|---|---|---|---|
| {{ r.instrument_code }} {{ r.instrument_name }} | {{ r.fault_type }}:{{ r.fault_description }} | {{ r.reported_by }} | {{ r.repair_vendor || '—' }} |
|
|
| 暂无维修记录 | |||||
使用日期:
~
可用 {{ checkoutAvailable.length }} 台 / 已出库 {{ checkoutList.reduce((s,c)=>s+c.instrument_count,0) }} 台
📦 可用仪器(多选后出库)
📋 出库单列表
{{ ck.checkout_no }}
{{ ck.status }}
日期:{{ ck.checkout_date }} ~ {{ ck.checkout_date_end }}
小组长:{{ ck.group_leader_name }}({{ ck.group_leader_phone }})
仪器数:{{ ck.instrument_count }} 台
暂无出库记录
单号:{{ checkoutDetail.checkout_no }}
状态:{{ checkoutDetail.status }}
日期:{{ checkoutDetail.checkout_date }} ~ {{ checkoutDetail.checkout_date_end }}
小组长:{{ checkoutDetail.group_leader_name }}({{ checkoutDetail.group_leader_phone }})
仪器清单({{ checkoutDetail.instrument_count }} 台):
提示:每件仪器 4 通道(Ⅰ/Ⅱ/Ⅲ/Ⅳ) × 采样前 / 采样后 = 8 列读数。无对应通道留空即可。
| 仪器 | 参数 | 采样前校准 | 采样后校准 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 通道Ⅰ | 通道Ⅱ | 通道Ⅲ | 通道Ⅳ | 通道Ⅰ | 通道Ⅱ | 通道Ⅲ | 通道Ⅳ | |||
|
{{ rec.instrument_code }}
{{ rec.instrument_name }}
|
标称流量 L/min |
|
||||||||
| 实际流量 L/min | ||||||||||
| 相对误差 % | ||||||||||
| 无仪器待校准 | ||||||||||
✍ 小组长签名
签名将自动嵌入《流量校准记录表》docx
清除
✓ 已有保存过的签名
{{ calibForm.signer_name || '—' }}{{ calibForm.signed_at ? ' · ' + calibForm.signed_at : '' }}
如需重新签,左侧画板写完即可覆盖
👥 采样小组管理
每组 = 组长 + 组员 + 车辆 + 固定仪器,按时间生效
共 {{ groupsList.length }} 组
+ 新增小组
🔄 刷新
暂无小组,点击右上角"+ 新增小组"添加
跟着小组走,不需要每次出库借还。共享不占用类(如流量校准器)不要勾这里。
{{ vehicleStats.total || 0 }}
车辆总数
{{ vehicleStats.in_use || 0 }}
在用
{{ vehicleStats.repair || 0 }}
维修中
{{ vehicleStats.maintenance || 0 }}
保养中
{{ vehicleStats.inspection_soon || 0 }}
年检30天内到期
{{ vehicleStats.insurance_soon || 0 }}
保险30天内到期
第一步:获取任务数据
📋 方式一:采样主管派给我的任务单
点击任一行直接跳到第三步生成表格
暂无派给您的任务单
🔎 方式二:按任务编号载入
📤 方式三:上传任务下达单
📤
点击或拖拽任务下达单文件
支持图片(PNG/JPG)、Word(DOC/DOCX)、Excel(XLS/XLSX)
{{ f.file.name.endsWith('.xlsx') || f.file.name.endsWith('.xls') ? '📊' : '📄' }}
{{ f.file.name }}
✕
🤖 OCR 识别进度 ({{ samplingOcrProgress.current }}/{{ samplingOcrProgress.total }})
{{ log }}
第二步:OCR 识别结果
{{ samplingOcrText }}
✨ AI 正在解析任务数据 ▊
{{ samplingAiStream }}
第三步:确认任务数据与样品编号
💾 更新并保存
← 返回上级
↩ 返回工作台
基本信息
监测点位({{ samplingTaskData.points ? samplingTaskData.points.length : 0 }} 个)
| 点位序号 | 样品类型 | 监测点位 | 检测项目 | 执行标准 | 点位数 | 天数 | 频次 | |
|---|---|---|---|---|---|---|---|---|
| {{ samplingPointIndexes[i] }} |
|
样品编号预览(共 {{ samplingPreview.reduce((s,sr)=>s+(sr.sample_ids?sr.sample_ids.length:0),0) }} 个编号,{{ samplingPreviewGrouped.length }} 个点位)
🔄 刷新编号预览
🛠 质控样人工调整
系统自动生成的质控样有偏差时可在此手动增减;调整后必须点"💾 保存调整"才生效
+ 增加质控样
💾 保存调整
暂无质控样
⚠ 已有人工调整未保存,点"💾 保存调整"后调整结果才会写入数据库
质控类型
空白(K)
平行(A)
穿透(C)
挂载到
样品编号
系统自动算下一个可用编号;如果不满意可以手动改成你想要的
📌 样品编号
{{ samplesConfirmed ? '✓ 已确认 ('+ samplesConfirmedCount +' 个) · 重新生成' : '✅ 确认并生成样品编号' }}
已固化到数据库 · 现场录数/报告生成都用这一份
点确认后,样品编号写入数据库,后续模块(项目录数、报告生成)都用同一份
生成表格
💧 废水排口({{ surveyForm.wastewater_outlets.length }})
+ 添加
从任务点位预填
💨 废气排口({{ surveyForm.exhaust_outlets.length }})
+ 添加
✍ 采样员签字({{ currentUser.name }})
✍ 客户签字
本机直签
二维码
✓
客户已签字
{{ surveyState.client_signer }} · {{ surveyState.client_signed_at }}
客户用手机扫二维码签字
先点下面"保存调查 + 生成客户签字链接"
之后即可让客户当场签或扫码远程签
之后即可让客户当场签或扫码远程签
已生成 {{ samplingGeneratedFiles.length }} 个文件
🔄 刷新
对该文件进行审核:
驳回原因:{{ row.audit.reject_reason }}
📷 现场采样照片
共 {{ samplingPhotos.length }} 张 · {{ samplingPhotosByPoint.length }} 个点位
对现场采样照片进行审核:
驳回原因:{{ samplingPhotoAudit.reject_reason }}
⚠ 该任务尚无现场采样照片,请采样员在 APP 端按点位上传
📍 {{ grp.point }} ({{ grp.photos.length }} 张)
✕ 已驳回 — {{ samplingPhotoAudit.reject_reason }}
上传人:{{ samplingPhotoPreview.uploaded_by_name }} · {{ (samplingPhotoPreview.created_at || '').slice(0, 16) }}
⚙ 管理员运维:
清空原来数据
计划月:
批量导入新单(选择文件夹)
批量导入新单(选多个文件)
⚠ 仅支持 .docx
{{ bulkImportProgress }}
{{ dispatchStats[label] || 0 }}
{{ label }}
检测项目({{ pointsOf(row).length }} 项)
暂无点位数据
| # | 检测类型 | 点位 | 检测项目 | 点位数 | 天数 | 频次 |
|---|---|---|---|---|---|---|
| {{ i+1 }} | {{ cnSampleType(p.sample_type || p.sample_type_code) }} | {{ p.point_name || '—' }} | {{ p.test_items || p.items || '—' }} | {{ p.point_count || 1 }} | {{ p.days || 1 }} | {{ p.frequency || 1 }} |
{{ w }}
{{ cell.day }}
{{ cell.tasks.length }}单
{{ t.task_no }}
{{ t.address || t.company_name || '-' }}
{{ t.task_no }}
{{ t.status }}
{{ t.priority }}
受检单位{{ t.company_name || '-' }}
受检地址{{ t.address || '-' }}
联系人{{ t.contact || '-' }}
采样内容{{ t.sample_types || '-' }}
点位数{{ t.point_count || 0 }}
采样日期{{ t.plan_date || '-' }}截止 {{ t.deadline }}
采样员{{ t.assigned_names || '未派发' }}
车辆{{ t.vehicle || '未派车' }}
检测项目明细
{{ t.test_items || '(无明细)' }}
{{ p.sample_type || '-' }}
{{ p.point_name || '未命名点位' }}
×{{ p.point_count }}
{{ p.test_items || '-' }}
执行标准:{{ p.standard }}
{{ supervisorStatusCount(label) }}
{{ label }}
共 {{ supervisorRows.length }} 单(当前显示 {{ supervisorDisplayRows.length }}),{{ supervisorDirtyCount }} 个待保存
{{ supervisorFullscreen ? '退出全屏(F1/Esc)' : '全屏编辑(F1)' }}
📤 批量导出
📥 批量导入
批量保存({{ supervisorDirtyCount }})
|
任务编号
无匹配项
|
受检单位
无匹配项
|
地市
无匹配项
|
区/镇
无匹配项
|
受检地址
无匹配项
|
计划月
无匹配项
|
优先级
无匹配项
|
检测项目 |
采样日期
无匹配项
|
小组长 | 采样员 | 备注 | 操作 | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ supervisorFilter.status ? '当前筛选下无任务' : '当月暂无任务' }} | ||||||||||||||||||||||||||||||||||||||||
|
{{ row.task_no }}
{{ row.status }}
加载中...
暂无历史任务单
合同:{{ (historyCache[row.contract_id]||{}).contract_no || '-' }}
受检单位:{{ row.company_name || '-' }}
共 {{ ((historyCache[row.contract_id]||{}).tasks||[]).length }} 份任务单
|
{{ row.company_name }} | {{ row.city || '-' }} | {{ row.district || '-' }} | {{ row.address || '-' }} |
|
|
暂无点位
|
|
|
|
|
|
||||||||||||||||||||||||||||
📅
当日暂无任务
📋 现场调查记录表(LDG-XC-017)
采样员到达现场后填写工况调查;支持手机/平板
💧 废水排口
共 {{ fieldSurvey.wastewater_outlets.length }} 个
+ 添加排口
💨 废气排口
共 {{ fieldSurvey.exhaust_outlets.length }} 个
+ 添加排口
{{ fieldStats.total || 0 }}
总任务
{{ fieldStats.pending || 0 }}
待接收
{{ fieldStats.in_progress || 0 }}
进行中
{{ fieldStats.completed || 0 }}
已完成
{{ fieldStats.completion_rate || 0 }}%
完成率
我的采样任务
刷新
暂无任务
{{ t.company_name }}
{{ t.sample_types }} · {{ t.point_count }}个点位 · {{ t.address }}
受检单位:{{ fieldDetail.company_name }}
状态:{{ fieldDetail.status }}
样品类型:{{ fieldDetail.sample_types }}
点位数:{{ fieldDetail.point_count }}
地址:{{ fieldDetail.address }}
联系人:{{ fieldDetail.contact }} {{ fieldDetail.contact_phone }}
采样日期:{{ fieldDetail.plan_date }}
✓ 已绑定出库单:{{ fieldTaskCheckouts[0].checkout_no }}
日期:{{ fieldTaskCheckouts[0].checkout_date }} ~ {{ fieldTaskCheckouts[0].checkout_date_end }}
仪器数:{{ fieldTaskCheckouts[0].instrument_count || (fieldTaskCheckouts[0].items || []).length }} 台
暂无样品数据 — 请先在采样室"表格生成"中确认并保存样品编号
暂无现场记录
{{ r.point_name || '记录' }}
{{ r.recorded_at }} · {{ r.recorded_by_name }}
天气:{{ r.weather }}
气温:{{ r.temperature }}
湿度:{{ r.humidity }}
风速:{{ r.wind_speed }}
风向:{{ r.wind_direction }}
气压:{{ r.pressure }}
工况:{{ r.work_condition }}
备注:{{ r.field_notes }}
GPS:{{ r.longitude }}, {{ r.latitude }}
暂无照片
暂无签名
{{ s.signer_name }}({{ s.signer_role }})
{{ s.signed_at }}
{{ log.action }} — {{ log.operator_name }}
{{ log.detail }}
加载中...
📦 出库单绑定
✓ 已绑定出库单:{{ fieldTaskCheckouts[0].checkout_no }}
日期:{{ fieldTaskCheckouts[0].checkout_date }} ~ {{ fieldTaskCheckouts[0].checkout_date_end }}
小组长:{{ fieldTaskCheckouts[0].group_leader_name }} · 仪器数:{{ fieldTaskCheckouts[0].instrument_count }}台
暂无绑定出库单
📋 现场仪器使用记录表(31项)
导出Word
🧪 样品仪器记录
📊 {{ fieldItemReadingForm.category }} 字段
= {{ (parseFloat(fieldItemReadingForm.readings.conductivity) * 10).toFixed(2) }} μS/cm(入库时自动换算)
📸 拍仪器小票自动填
已匹配「{{ fieldStripOcrModel }}」({{ fieldCurrentInstrumentModel }})
{{ fieldCurrentInstrumentModel }} 暂无 OCR 模板
先选采样仪器
⏳ 识别中...
{{ s.parsed.report_type || '?' }} · 文件号 {{ s.parsed.file_no || '-' }} · {{ s.parsed.start_time || '' }}
删除
烟温 {{ s.parsed.smoke_temp ?? '-' }}℃ · 含湿量 {{ s.parsed.humidity ?? '-' }}% · 标干流量 {{ s.parsed.std_flow ?? '-' }} m³/h
O₂ {{ s.parsed.o2 ?? '-' }}% · SO₂ {{ s.parsed.so2 ?? '-' }} · NO {{ s.parsed.no_conc ?? '-' }} · NO₂ {{ s.parsed.no2_conc ?? '-' }} · NOx {{ s.parsed.nox_conc ?? '-' }}
环温 {{ s.parsed.ambient_temp ?? '-' }}℃ · 大气压 {{ s.parsed.atm_pressure ?? '-' }}kPa · 流量 {{ s.parsed.flow_rate ?? '-' }}L/min · 工/标/参体 {{ s.parsed.working_volume ?? '-' }}/{{ s.parsed.standard_volume ?? '-' }}/{{ s.parsed.reference_volume ?? '-' }} {{ s.parsed.volume_unit || '' }}
🌬️ 综合采样器附加数据(MH1205 等)
🧪 烟气 {{ fieldItemReadingForm.readings.flue_gas_runs.length }} 次原始(写入记录表时按多行展开)
| # | 时段 | O₂ | SO₂ | NO | NO₂ | NOx |
|---|---|---|---|---|---|---|
| {{ idx+1 }} | {{ (rr.start_time||'').slice(11) }}-{{ (rr.end_time||'').slice(11) }} | {{ rr.o2 ?? '-' }} | {{ rr.so2 ?? '-' }} | {{ rr.no_conc ?? '-' }} | {{ rr.no2_conc ?? '-' }} | {{ rr.nox_conc ?? '-' }} |
📸 拍仪器小票自动填
已匹配「{{ fieldStripOcrModel }}」({{ fieldCurrentInstrumentModel }})
{{ fieldCurrentInstrumentModel }} 暂无 OCR 模板
先选采样仪器
⏳ 识别中...
{{ s.parsed.report_type || '?' }} · 文件号 {{ s.parsed.file_no || '-' }} · 通道 {{ s.parsed.channel || '-' }} · {{ s.parsed.start_time || '' }}
删除
环温 {{ s.parsed.ambient_temp ?? '-' }}℃ · 大气压 {{ s.parsed.atm_pressure ?? '-' }}kPa · 流量 {{ s.parsed.flow_rate ?? '-' }}L/min · 工/标/参体 {{ s.parsed.working_volume ?? '-' }}/{{ s.parsed.standard_volume ?? '-' }}/{{ s.parsed.reference_volume ?? '-' }} {{ s.parsed.volume_unit || '' }}
🌬️ 综合采样器数据(MH1205 等)
📸 拍噪声计小票自动填
已匹配「{{ fieldStripOcrModel }}」({{ fieldCurrentInstrumentModel }})
{{ fieldCurrentInstrumentModel }} 暂无 OCR 模板
先选噪声计
⏳ 识别中...
噪声 · {{ (s.parsed.points||[]).length }} 个测点删除
{{ pp.point_name }}:Leq {{ pp.leq ?? '-' }} · Lmax {{ pp.lmax ?? '-' }} · L10 {{ pp.l10 ?? '-' }} · L90 {{ pp.l90 ?? '-' }}
🔊 噪声 {{ fieldItemReadingForm.readings.noise_points.length }} 个测点原始(写入 LDG-XC-007 时按测点展开)
| 测点 | Leq | Lmax | Lmin | L5 | L10 | L50 | L90 | L95 |
|---|---|---|---|---|---|---|---|---|
| {{ np.point_name }} | {{ np.leq ?? '-' }} | {{ np.lmax ?? '-' }} | {{ np.lmin ?? '-' }} | {{ np.l5 ?? '-' }} | {{ np.l10 ?? '-' }} | {{ np.l50 ?? '-' }} | {{ np.l90 ?? '-' }} | {{ np.l95 ?? '-' }} |
将给以下样品都创建一条相同录数:{{ fieldItemReadingSiblingNos.join('、') }}
该任务尚未绑定出库单,请先在「仪器管理」Tab 绑定本组出库单
勾选本点位实际采集项目对应的保存方式,同点位所有样品共用,无需逐样品录入。
容器:G=棕色玻璃瓶 · P=透明聚乙烯瓶 · Pz=棕色聚乙烯瓶 · 溶解氧瓶=棕色玻璃瓶 · 无菌袋=透明聚乙烯袋
容器:G=棕色玻璃瓶 · P=透明聚乙烯瓶 · Pz=棕色聚乙烯瓶 · 溶解氧瓶=棕色玻璃瓶 · 无菌袋=透明聚乙烯袋
{{ g.note }}
把现场采集的所有样品送到实验室样品室,必须拍至少 1 张留底照片(与实验室交接画面 / 样品归置画面),然后点「确认交接」。流转单会在实验室点「接收样品」时自动产出。
请在 {{ fieldDispoData.deadline || '完成采样 3 天内' }} 前处置每个异常点位({{ fieldDispoRemainText(fieldDispoData.deadline) }});逾期默认推到最近后续任务、无后续则新建递延任务。
✓ 没有待处置的异常点位
整张任务都没法采时用(如:下雨、客户整体取消、现场不具备条件)。
整单内的所有点位会一起按你选的方式处理。
整单内的所有点位会一起按你选的方式处理。
① 整张任务怎么处理?
② 改期怎么安排?
⚠ 无可归并的后续任务,请改选「保留本任务编号」
对应 LDG-XC-001 表头需手填项,整个任务的水样共用一份。任务单号 / 单位 / 采样日期 / 天气 / 仪器编号由系统自动带入,无需在此填写。
※ 校准值相差大于 0.05 则需重新校准
请对每个点位勾选 ✓已采 或 ⚠未采。未采必须填写原因 + 详细说明。
{{ i+1 }}. {{ p.point_name || ('点位'+(i+1)) }}
{{ p.items || '' }}
选择包含任务日期的本小组出库单:
{{ ck.checkout_no }}
日期:{{ ck.checkout_date }} ~ {{ ck.checkout_date_end }}
仪器数:{{ ck.instrument_count }}台
没有包含任务日期的可用出库单,请先在「仪器台账-出入库管理」中创建对应日期范围的出库单。
| 样品类型 | 监测点位 | 检测项目 | 点数 | 天数 | 频次 | 执行标准 | |
|---|---|---|---|---|---|---|---|
|
|
|||||||
| 暂无点位 | |||||||
任务编号:{{ dispatchDetail.task_no }}
状态:{{ dispatchDetail.status }}
受检单位:{{ dispatchDetail.company_name }}
优先级:{{ dispatchDetail.priority || '常规' }}
地址:{{ dispatchDetail.address }}
联系人:{{ dispatchDetail.contact }} {{ dispatchDetail.contact_phone }}
样品类型:{{ dispatchDetail.sample_types }}
点位数:{{ dispatchDetail.point_count }}
检测项目:{{ dispatchDetail.test_items }}
计划日期:{{ dispatchDetail.plan_date }}
截止日期:{{ dispatchDetail.deadline }}
采样员:{{ dispatchDetail.assigned_names }}
车辆:{{ dispatchDetail.vehicle }}
创建人:{{ dispatchDetail.created_by_name }}
创建时间:{{ dispatchDetail.created_at }}
接收时间:{{ dispatchDetail.received_at }}
接收人:{{ dispatchDetail.received_by }}
出发时间:{{ dispatchDetail.started_at }}
完成时间:{{ dispatchDetail.completed_at }}
取消原因:{{ dispatchDetail.cancel_reason }}
异常原因:{{ dispatchDetail.abnormal_reason }}
备注:{{ dispatchDetail.notes }}
采样原始记录上交:{{ dispatchDetail.milestone.sampling_records_submitted_at }}
必备表格清单
({{ requiredDocs.done }}/{{ requiredDocs.total }})
必备表格已全部完成
现场采样已完成,请将原始记录上交给报告室
重新派发
操作日志
{{ log.action }} — {{ log.operator_name || log.operator_phone }}
{{ log.detail }}
已上传文件:{{ taskOrderPreviewFilename }}
必备表格清单
({{ requiredDocs.done }}/{{ requiredDocs.total }})
必备表格已全部完成
已上传 {{ row.extra.photo_count }} 张照片
已录入 {{ row.extra.record_count }} 份原始记录
—
{{ formatDocFilename(f.filename) }}
以下为 AI 识别结果,原文件已归档,请逐字段核对后保存
明细行
+ 添加行
任务编号:{{ quickDispatchTarget.task_no }}
受检单位:{{ quickDispatchTarget.company_name }}
地址:{{ quickDispatchTarget.address }}
计划日期:{{ quickDispatchTarget.plan_date || '未排期' }}
当前状态:{{ quickDispatchTarget.status }}
✓ 已应用「第{{ quickDispatchAppliedGroup.group_no }}组」配置(组员 {{ (quickDispatchAppliedGroup.members||[]).length }} 人 + 车辆 {{ quickDispatchAppliedGroup.vehicle_plate || '无' }}),可手动调整 ↓
任务编号:{{ partialAuditTask.task_no }}
受检单位:{{ partialAuditTask.company_name }}
小组长:{{ partialAuditTask.group_leader_name }}
采样员:{{ partialAuditTask.assigned_names }}
计划日期:{{ partialAuditTask.plan_date }}
场次总数:{{ partialAuditTask.session_count || 1 }}
点位采样情况({{ partialAuditPoints.length }} 个点位)
{{ i+1 }}. {{ p.point_name || '—' }}
{{ p.sampling_status || '未采' }}
第 {{ p.completed_session_no }} 场次完成
{{ p.items || '' }}
未采原因:
{{ p.reschedule_reason_category || '—' }}
{{ p.reschedule_reason_detail || '—' }}
上报人:{{ p.reschedule_by_name }} · {{ p.reschedule_at }}
· GPS {{ p.reschedule_gps[0].toFixed(4) }},{{ p.reschedule_gps[1].toFixed(4) }}
无照片
本次将生成 {{ samplingPreview.reduce((s,sr)=>s+(sr.sample_ids?sr.sample_ids.length:0),0) }} 个样品的二维码
{{ sr.point_name }}({{ sr.sample_type }})
{{ typeof sid === 'string' ? sid : sid.id }}
{{ item.sample_id }}
📊 市场部仪表盘
数据范围:已签约合同(排除草稿/待签约)
合同总数 {{ mktDash.total_contracts }}
🔄 刷新
经营分析导出导出经营分析
{{ card.label }}缺失
{{ card.value }}
占 {{ ((card.value / mktDash.total_contracts) * 100).toFixed(1) }}%
经营转化与合同预警刷新预警
草稿{{ mktOps.stages['草稿']||0 }}
审批中{{ mktOps.stages['审批中']||0 }}
待签约{{ mktOps.stages['待签约']||0 }}
已签约{{ (mktOps.stages['待下单']||0)+(mktOps.stages['履约中']||0)+(mktOps.stages['已完成']||0) }}
合同健康待办{{row.alert}} ¥{{formatMoney(row.paid_amount)}} / {{formatMoney(row.total_amount)}}
客户经理待跟进
客户历史经营(报价次数、签约、开票、回款)
📊 自然月累计实收金额(按签订日期)
总条数:{{ importMissingResult.total }}
更新条数:{{ importMissingResult.updated }}
跳过条数:{{ importMissingResult.skipped }}
失败条数:{{ importMissingResult.failed }}
💬 市场部智能问数
用自然语言查询市场部业务数据,例如:今年已签约合同总金额是多少?
示例:
{{ q }}
你可以试试:
{{ smartQuery.result.title }}
追踪 ID:{{ smartQuery.result.trace_id }}
数据依据:{{ smartQuery.result.evidence.map(e => typeof e === 'string' ? e : (e.tool_name || e.name || JSON.stringify(e))).join('、') }}
{{ smartQuery.result.explanation }}
核心能力
- {{ cap }}
可以这么问
{{ smartQuery.result.title }}
{{ formatMoney(smartQuery.result.data.value) }}
{{ smartQuery.result.data.unit }}
最近 {{ smartQuery.result.data.details.length }} 条合同
对比明细
📊 {{ smartQuery.result.chart.title || '可视化' }}
💡 您还可以问
🤖 AI 分析建议
🧾 开票申请
我的 / 协作合同流程
+ 新增申请
刷新
开票申请必须关联合同,系统自动拦截超额开票和逾期未归档合同。
暂无开票申请
暂无草稿
| 合同编号 | 类型 | 委托方 | 受检方 | 状态 | 发起人 | 发起时间 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ d.contract_no }} | {{ d.contract_type || '-' }} | {{ d.client || '-' }} | {{ d.testee_unit || '-' }} |
|
{{ d.reserved_by || '-' }} | {{ (d.reserved_at || '').slice(0, 16) || '-' }} |
|
第一步:录入检测需求
📎
点击或拖拽上传检测需求文件
支持 Excel / Word / 图片(PNG/JPG)/ TXT
📎 已选择:{{ quotFile.name }}
📝 草稿编号
下一个草稿号:
{{ nextContractNos.draft || '—' }}
|
签订后正式合同号:
常规单 {{ nextContractNos.regular || '—' }}
年度单 {{ nextContractNos.annual || '—' }}
🔄 刷新
· 进入"核对项目"步骤时系统自动领取下一个可用草稿号
· 报价/审批阶段使用草稿号(CG{年}{月}{4位流水}),签订合同时自动转为正式合同号
· 常规单:按月流水编号(非年度检测) · 年度单:按年流水 + 字母N(排污许可证年度检测)
· 报价/审批阶段使用草稿号(CG{年}{月}{4位流水}),签订合同时自动转为正式合同号
· 常规单:按月流水编号(非年度检测) · 年度单:按年流水 + 字母N(排污许可证年度检测)
第二步:AI 智能解析检测项目
🔍 {{ quotStreamMsg || '正在 OCR 识别图片...' }}
✓ OCR 识别完成
{{ quotOcrPreview }}
✨ {{ quotStreamMsg || 'AI 正在解析检测项目' }} ▊
{{ quotAiStream }}
✅
解析成功!共识别 {{ quotItems.length }} 项检测项目
第三步:核对检测项目(共 {{ quotItems.length }} 项)
草稿编号:{{ quotContractNo }} ({{ quotContractType }})
🔒 合同已归档 / 签订,报价只读不可修改
📋 报价单头部信息(写入 Excel)
🟢 库内参数(加盖 CMA 标识)
共 {{ quotInnerItems.length }} 项
| 检测类型 | 点位名称 | 检测项目 | 点位数 | 天数 | 频次 | 次/年 | 单价 | 小计 | |
|---|---|---|---|---|---|---|---|---|---|
| 暂无库内参数 | |||||||||
|
|
{{ (Number(quotItems[it._idx].point_count||0)*Number(quotItems[it._idx].days||0)*Number(quotItems[it._idx].frequency||0)*Number(quotItems[it._idx].times_per_year||0)*Number(quotItems[it._idx].unit_price||0)).toLocaleString() }} | ||||||||
🟠 库外参数(不加 CMA 标识)
共 {{ quotOuterItems.length }} 项
检测类型
点位名称
检测项目(可多选)
| 检测类型 | 点位名称 | 检测项目 | 点位数 | 天数 | 频次 | 次/年 | 单价 | 小计 | |
|---|---|---|---|---|---|---|---|---|---|
| 暂无库外参数 | |||||||||
|
|
{{ (Number(quotItems[it._idx].point_count||0)*Number(quotItems[it._idx].days||0)*Number(quotItems[it._idx].frequency||0)*Number(quotItems[it._idx].times_per_year||0)*Number(quotItems[it._idx].unit_price||0)).toLocaleString() }} | ||||||||
📜 服务条款(写入报价单末尾,最多 15 条)
重置条款
+ 添加条款
暂无条款,点击"+ 添加条款"或上传带条款的 Excel 自动识别。
{{ ci + 1 }}.
删
🏦 开户信息
开户名:
开户银行:
开户账号:
💰 费用预估
检测费:¥ {{ quotEstimate.detection.toLocaleString() }}
采样费:
重置
原¥{{ quotEstimate.autoSampling.toLocaleString() }}
检测报告编制费:
重置
原¥{{ quotEstimate.autoReportFee.toLocaleString() }}
税费(6%):¥ {{ quotEstimate.tax.toFixed(2) }}
合计:¥ {{ quotEstimate.total.toFixed(2) }}
✅
报价单生成成功!
共 {{ quotResult.item_count }} 项 · 总计 ¥ {{ quotResult.total.toLocaleString() }}
非检测业务合同报价
录入合同基础信息和合同正文后,直接进入合同审批流程。
非检测业务合同不需要填写检测方案、点位或采样计划;审批通过后按非检测业务合同继续归档、回款和开票管理。
编号规则
{{ nonTestingQuoteForm.contract_no_mode === 'custom' ? '签订时手工填写并校验是否重复。' : `签订时自动获取下一个可用${nonTestingQuoteForm.testing_contract_type}检测业务合同编号。` }}
合同主体
履约与金额
签约金额 - 居间费 - 分包费,系统自动计算
经办信息
报价阶段可选填;发起审批时为必填项。
第 {{ index + 1 }} 期
%
¥ {{ nonTestingPlanAmount(plan).toLocaleString() }}
删除
支持 PDF、Word、JPG、PNG,单个文件不超过 30MB。
已上传:{{ nonTestingQuoteForm.contract_file_name }}
{{ approvalStats.pending || 0 }}
待审批
{{ approvalStats.approved || 0 }}
已通过
{{ approvalStats.rejected || 0 }}
已驳回
{{ approvalStats.total_pending_sign || 0 }}
待签约
{{ approvalStats.total_pending_archive || 0 }}
待归档
{{ row.client || '—' }}
{{ row.testee_unit || '—' }}
暂无数据
审批方式
或签 · 任一人通过
并行会签 · 全部通过
逐级会签 · 按序逐个审
{{ approvalSubmitForm.sign_mode_ui==='and_sequence' ? '审批级数' : '审批人数' }}
{{ approvalSubmitForm.sign_mode_ui==='or' ? '至少选择 1 名审批人' : '会签至少 2 人' }}
{{ approvalSubmitForm.sign_mode_ui==='and_sequence' ? ('第 '+(i+1)+' 级') : ('审批人 '+(i+1)) }}
逐级顺序:{{ approverSlotNames.join(' → ') }}
✅ 免费单:应收 0 元,无需填写回款计划,提交后视为已结清。报告生成、交付、客户签收等履约流程仍需正常完成。
💰 回款计划 *
必填,未填写无法提交审批
次数:
比例合计必须 = 100%,当前
{{ approvalRatioSum }}%
均分比例
| 期数 | 回款计划编号 | 回款年月 | 支付比例(%) | 对应金额(元) |
|---|---|---|---|---|
| 第 {{ i+1 }} 期 |
{{ approvalSubmitForm.contract_no || '???' }}({{ i+1 }})
|
|
|
|
🧾 发票计划
开票次数:
合计 ¥{{ invoicePlanSum.toLocaleString() }}{{ Number(approvalSubmitForm.total_amount)>0 ? (' / 签约 ¥'+Number(approvalSubmitForm.total_amount).toLocaleString()) : '' }}
| 期数 | 开票截止日期(此日前须开) | 开票金额(元) |
|---|---|---|
| 第 {{ i+1 }} 期 |
|
|
该合同无需开票。需要开票时打开开关,并填写每期"最迟开票日 + 金额",审批通过后会自动推送给财务部开票。
合同编号:{{ approvalDetail.contract_no }}
状态:{{ approvalStatusLabel(approvalDetail.status) }}
委托单位:{{ approvalDetail.client || '-' }}
受检方:{{ approvalDetail.testee_unit || '-' }}
发起人:{{ approvalDetail.initiator_name }}
审批人:{{ approvalDetail.approver_name }}
发起时间:{{ approvalDetail.submitted_at }}
审批时间:{{ approvalDetail.decided_at }}
审批方式:
{{ approvalDetail.sign_mode==='and' ? (approvalDetail.sequential ? '逐级会签(按序逐个审,全部通过)' : '并行会签(同时审,全部通过)') : '或签(任一人通过即可)' }}
{{ approvalDetail.sequential ? (i+1)+'. ' : '' }}{{ s.approver_name }} ·
{{ s.status==='approved'?'✓ 已通过':(s.status==='rejected'?'✗ 已驳回':'… 待审批') }}
合同信息
合同类型:{{ approvalContract.contract_type || '-' }}
业务合同名称:{{ (approvalContract.quotation_data_parsed && approvalContract.quotation_data_parsed.business_title) || '-' }}
检测类别:{{ (approvalContract.quotation_data_parsed && approvalContract.quotation_data_parsed.header && approvalContract.quotation_data_parsed.header.test_category) || approvalContract.test_category || '-' }}
项目地址:{{ (approvalContract.quotation_data_parsed && approvalContract.quotation_data_parsed.header && approvalContract.quotation_data_parsed.header.project_location) || approvalContract.testee_address || '-' }}
客户联系人:{{ (approvalContract.quotation_data_parsed && approvalContract.quotation_data_parsed.header && approvalContract.quotation_data_parsed.header.contact) || approvalContract.contact || '-' }}
客户经理:{{ (approvalContract.quotation_data_parsed && approvalContract.quotation_data_parsed.header && approvalContract.quotation_data_parsed.header.account_manager) || approvalContract.account_manager || '-' }}
客服:{{ (approvalContract.quotation_data_parsed && approvalContract.quotation_data_parsed.header && approvalContract.quotation_data_parsed.header.customer_service) || approvalContract.customer_service || '-' }}
框架合同:
是
否
检测项目({{ approvalContract.quotation_data_parsed.items.length }} 项)
| # | 检测类型 | 点位 | 检测项目 | 点位数 | 天数 | 频次 | 次/年 | 单价 | 小计 |
|---|---|---|---|---|---|---|---|---|---|
| {{ idx + 1 }} | {{ it.detect_type || '-' }} | {{ it.point_name || '-' }} | {{ it.items || '-' }} | {{ it.point_count || 1 }} | {{ it.days || 1 }} | {{ it.frequency || 1 }} | {{ it.times_per_year || 1 }} | ¥ {{ Number(it.unit_price||0).toLocaleString() }} | ¥ {{ (Number(it.point_count||0)*Number(it.days||0)*Number(it.frequency||0)*Number(it.times_per_year||0)*Number(it.unit_price||0)).toLocaleString() }} |
检测费:¥ {{ Number(approvalContract.quotation_data_parsed.result.detection_fee||approvalContract.quotation_data_parsed.result.detection||0).toLocaleString() }}
采样费:¥ {{ Number(approvalContract.quotation_data_parsed.result.sampling_fee||approvalContract.quotation_data_parsed.result.sampling||0).toLocaleString() }}
报告费:¥ {{ Number(approvalContract.quotation_data_parsed.result.report_fee||approvalContract.quotation_data_parsed.result.reportFee||0).toLocaleString() }}
税费:¥ {{ Number(approvalContract.quotation_data_parsed.result.tax||0).toFixed(2) }}
合计:¥ {{ Number(approvalContract.quotation_data_parsed.result.total||0).toFixed(2) }}
🆓 免费单(0元):本单为特殊申请免费做,应收 0 元、无回款计划。通过即视为已结清;报告/交付/签收等履约流程仍需正常完成。
📋 框架合同:金额 / 采样频次不固定,先生产再对账再回款。开票前需先对账确定实际收款金额。
① 合同签约金额:
{{ approvalDetail.is_free ? '免费单(0元)' : (Number(approvalDetail.total_amount||0) > 0 ? ('¥' + Number(approvalDetail.total_amount||0).toLocaleString()) : '待定(需审批人填写)') }}
✓ 通过
✗ 驳回
② 居间费(实付):¥{{ Number(approvalDetail.broker_fee||0).toLocaleString() }}
✓ 通过
✗ 驳回
实收金额:¥{{ Number(approvalDetail.net_amount||0).toLocaleString() }}
折扣:{{ approvalDiscountPercent }}%
(报价合计 ¥{{ approvalQuotationTotal.toLocaleString() }})
③ 回款计划({{ approvalDetailPaymentPlan.length }} 期)
✓ 通过
✗ 驳回
| 期数 | 回款计划编号 | 回款年月 | 比例 | 金额 |
|---|---|---|---|---|
| 第 {{ i+1 }} 期 | {{ approvalDetail.contract_no }}({{ i+1 }}) |
{{ p.month }} | {{ p.ratio }}% | ¥{{ Math.round(Number(approvalDetail.total_amount||0) * (Number(p.ratio)||0) / 100 * 100) / 100 }} |
审批人重新编排(比例合计须 = 100%,当前
{{ reviewPaymentRatioSum }}%)
| 第 {{ i+1 }} 期 | {{ approvalDetail.contract_no }}({{ i+1 }}) |
签约金额:¥{{ Number(approvalDetail.total_amount||0).toLocaleString() }}
居间费(实付):¥{{ Number(approvalDetail.broker_fee||0).toLocaleString() }}
实收金额:¥{{ Number(approvalDetail.net_amount||0).toLocaleString() }}
折扣:{{ approvalDiscountPercent }}%
回款计划:
| 期数 | 回款年月 | 比例 | 金额 |
|---|---|---|---|
| 第 {{ i+1 }} 期 | {{ p.month }} | {{ p.ratio }}% | ¥{{ Math.round(Number(approvalDetail.total_amount||0) * (Number(p.ratio)||0) / 100 * 100) / 100 }} |
驳回明细:
· {{ ({amount:'签约金额',broker:'居间费',payment:'回款计划'})[k] }}:
建议 {{ v.value }}
({{ v.comment }})
审批意见:{{ approvalDetail.approve_comment }}
请输入合同编号
确定
刷新
下一个可用常规单编号:{{ nextContractNos.regular }}
下一个可用年度单编号:{{ nextContractNos.annual }}
📋 我的合同
{{ c.contract_no }}
{{ c.status }}
委托:{{ c.client || '-' }}
受检:{{ c.testee_unit || '-' }}
步骤 1:上传合同文件
📎
点击或拖拽上传合同 PDF / 图片 / Excel / Word
AI 自动识别客户信息、点位、项目、频次
📎 {{ f.name }}
{{ contractEditorMode === 'signing' ? '补充合同信息(签订前)' : '编辑合同信息' }}
当前状态:{{ contractStatusLabel(contractDraft) }}
· 所有字段可编辑;点击"签订合同"后进入"待下单",此后主体不可再改
· 合同已签订,请尽快"一键生成任务单"(生成后状态自动变为"履约中")
· 有全字段编辑权限:已签订合同的任何字段都可修改
· 合同已签订:已有内容的字段锁定,仅可补充空白字段(金额类除外)
· 手工调整状态会记录操作日志,请仅用于纠正历史数据。
草稿号:{{ contractDraft.draft_no }}
归档状态
待归档
去归档
保存后撤销归档:清空归档日期并重新进入待归档清单,历史附件仍保留。
修改合同编号不会自动联动类别,请手动核对
回款计划
(审批已确认,不可修改)
合计 ¥ {{ paymentsTotal.toLocaleString() }}
⚠ 与签约金额 ¥{{ Number(contractDraft.total_amount).toLocaleString() }} 不一致
| 序号 | 回款计划编号 | 回款月份 | 回款金额(元) |
|---|---|---|---|
| 第 {{ i+1 }} 笔 |
{{ contractDraft.contract_no || contractDraft.draft_no || '???' }}({{ i+1 }})
|
|
元 |
采样点位
| # | 点位名 | 检测类型 | 执行标准 | 操作 |
|---|---|---|---|---|
| {{ i+1 }} | ||||
| 暂无点位,点击下方"添加点位" | ||||
每次采样检测项目配置
每个点位独立增减采样次数(右侧 + / − 按钮);"雨水"属送样检测,不在此处配置
请先在上方添加点位
({{ samplingVisibleNum(pi) }})
{{ p.point_name || '(未命名)' }}
{{ p.sample_type }}
项目组 {{ groupsOfPoint(pi).length }}
项目组 {{ g }}
共 {{ itemsOfGroup(pi, g).length }} 次/年
检测项目(本组通用,顿号分隔):
检测点位:
检测天数:
检测频次:
执行标准:
{{ std }}
×
(请先在上方点位表填写执行标准)
各次月份:
第{{ idx+1 }}次
{{ contractApprovalStatus==='pending' ? '⏳' : (contractApprovalStatus==='rejected' ? '⛔' : '⚠') }}
{{
contractApprovalStatus==='pending' ? '待审批' :
contractApprovalStatus==='rejected' ? '审批已驳回' : '尚未发起审批'
}}:
{{
contractApprovalStatus==='pending' ? '审批通过后才能"签订合同"或"一键生成任务单"。' :
contractApprovalStatus==='rejected' ? '请前往"合同审批"页查看驳回原因,修改后重新发起审批。' :
'该合同尚未发起审批,请先前往"合同审批"页发起审批并通过。'
}}
✍
该合同尚未签订
请先补充合同信息并签订,签订后才能生成任务单
{{ contractDraft.contract_no }}
{{ contractDraft.status }}
委托方:{{ contractDraft.client || '-' }}
受检方:{{ contractDraft.testee_unit || '-' }}
客户经理:{{ contractDraft.account_manager || '-' }}
现任客户经理:{{ contractDraft.current_account_manager || '-' }}
客服:{{ contractDraft.customer_service || '-' }}
现任客服:{{ contractDraft.current_customer_service || '-' }}
履约期间:{{ contractDraft.start_date || '-' }} ~ {{ contractDraft.end_date || '-' }}
首次采样:{{ contractDraft.first_sampling_month || '-' }}
采样次数:{{ contractDraft.total_rounds || 0 }} 次/年
签订日期:{{ contractDraft.signed_date || '-' }}
采样点位
| # | 点位名 | 检测类型 | 执行标准 | 操作 |
|---|---|---|---|---|
| {{ i+1 }} | ||||
| 暂无点位,点击下方"添加点位" | ||||
每次采样检测项目配置
每个点位独立增减采样次数(右侧 + / − 按钮);"雨水"属送样检测,不在此处配置
请先在上方添加点位
({{ samplingVisibleNum(pi) }})
{{ p.point_name || '(未命名)' }}
{{ p.sample_type }}
项目组 {{ groupsOfPoint(pi).length }}
项目组 {{ g }}
共 {{ itemsOfGroup(pi, g).length }} 次/年
检测项目(本组通用,顿号分隔):
检测点位:
检测天数:
检测频次:
执行标准:
{{ std }}
×
(请先在上方点位表填写执行标准)
各次月份:
第{{ idx+1 }}次
任务单操作
📋
当前状态:{{ contractDraft.status }}
该合同还未发起(或驳回后重新)审批。请前往"合同审批"页发起审批并通过。
审批进行中,请等待审批人处理。
📋 已生成任务单({{ contractExistingTasks.length }})
📦 一键下载全部任务单(ZIP)
| 任务号 | 第几次 | 计划月份 | 具体日期 | 状态 | 优先级 | 操作 |
|---|---|---|---|---|---|---|
| {{ t.task_no }} | 第{{ t.round_no }}次 | {{ t.plan_month || '-' }} | {{ t.plan_date || '待排期' }} | {{ t.status }} {{ t.status }} |
|
|
审批节点预览
{{line}}
合同:{{contractChangeContract.contract_no}} 甲方:{{contractChangeContract.client||'-'}} 签约金额:¥{{formatMoney(contractChangeContract.total_amount||0)}} 状态:{{contractChangeContract.status}}
{{contractChangeFieldLabel(key)}}
变更前:{{contractChangeFieldText(key, contractChangeContract?.[key])}}
合同作废通过后将冻结该合同后续业务操作,历史审批、发票和流水记录仍保留。
必须上传补充协议({{contractChangeForm.change_type==='合同作废'?'合同作废': '签约金额 / 甲方 / 乙方变更'}})
支持 pdf / word / 图片,提交时随表单一起上传
回款计划编辑
新签约金额:¥{{formatMoney(parseFloat(contractChangeForm.values.total_amount)||0)}} 当前合计:¥{{formatMoney(contractChangePaymentTotal())}}
变更差异
{{contractChangeFieldLabel(key)}}:{{contractChangeFieldText(key, row.before[key])}} → {{contractChangeFieldText(key, value)}}
审批过程{{a.seq}}. {{a.approver_name}}({{a.status}})
{{ contractOverview.draft_reserved || 0 }}
预占 / 草稿
已领号未签订
{{ contractOverview.total || 0 }}
合同总数
已签订合同累计
{{ contractOverview.done || 0 }}
已完成
{{ contractOverview.active || 0 }}
履约中
{{ contractOverview.pending || 0 }}
待下单
{{ contractOverview.cancelled || 0 }}
已作废
{{ contractOverview.ending_soon || 0 }}
60天内到期
年度单签订日+1年临近
| 纸质序号 | 合同编号 | 签订日期 | 归档日期 | 委托单位 | 受检单位 | 合同签约金额 | 已收款 | 已销账金额 | 未销账金额 | 应收余额 | 到期应收 | 未到期 | 实收金额 | 居间费 实付 |
居间费 已付 |
居间费 待付 |
分包费 实付 |
分包费 已付 |
分包费 未付 |
已开票 金额 |
未开票 金额 |
客户经理 | 现任客户经理 | 客服 | 现任客服 | 所属渠道 | 履约进度 | 状态 | 对应发票 | 对应回款计划 | 对应任务 | 关联报告 | 操作 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ c.contract_serial || '-' }} |
{{ c.contract_no }}
|
{{ c.signed_date || '-' }} | {{ c.archive_date }} 待归档 - | {{ (c.total_amount||0).toLocaleString() }} | {{ (c.paid_amount||0).toLocaleString() }} | {{ (c.cleared_amount||0).toLocaleString() }} | {{ Math.max(0,Number(c.paid_amount||0)-Number(c.cleared_amount||0)).toLocaleString() }} | {{ (c.unpaid_amount||0).toLocaleString() }} | {{ (c.receivable_due_amount||0).toLocaleString() }} | {{ (c.not_due_amount||0).toLocaleString() }} | {{ ((c.total_amount||0) - (c.broker_fee||0) - (c.subcontract_fee||0)).toLocaleString() }} | {{ (c.broker_fee||0).toLocaleString() }} | {{ (c.broker_fee_paid||0).toLocaleString() }} | {{ (c.broker_fee_pending||0).toLocaleString() }} | {{ (c.subcontract_fee||0).toLocaleString() }} | {{ (c.subcontract_fee_paid||0).toLocaleString() }} | {{ (c.subcontract_fee_pending||0).toLocaleString() }} | {{ (c.invoiced_amount||0).toLocaleString() }} | {{ Math.max(0,(Number(c.total_amount)||0)-(Number(c.invoiced_amount)||0)).toLocaleString() }} | {{ nameOnly(c.account_manager) || '-' }} | {{ nameOnly(c.current_account_manager) || '-' }} | {{ nameOnly(c.customer_service) || '-' }} | {{ nameOnly(c.current_customer_service) || '-' }} |
{{ (c.task_stats && c.task_stats.completed) || 0 }}/{{ c.total_rounds || 0 }}
|
|
{{ iv.invoice_no }} · {{ iv.issue_date || '-' }}
{{ (iv.amount||0).toLocaleString() }}
|
已回{{ c.payments_brief.filter(p => p.received).length }}期
未回{{ c.payments_brief.filter(p => !p.received).length }}期
第{{ p.seq }}期
{{ p.plan_month || '-' }}
{{ (p.amount||0).toLocaleString() }}
|
共{{ c.tasks_brief.length }}:
已{{ c.tasks_brief.filter(t => t.status === '已完成').length }}
未{{ c.tasks_brief.filter(t => t.status !== '已完成').length }}
{{ t.task_no }}
第{{ t.round_no }}次
{{ t.plan_month || '-' }}
|
共{{ c.reports_brief.length }}:
已签发{{ c.reports_brief.filter(r => r.status === '已签发').length }}
未签发{{ c.reports_brief.filter(r => r.status !== '已签发').length }}
{{ r.task_no }}
|
|
||||
| 暂无合同 | ||||||||||||||||||||||||||||||||||
合同编号:{{ contractReportAttachmentsDialog.contract_no }}
暂无报告附件
报告编号:{{ group.report_no }}({{ group.status }})
{{ att.kind === 'check_version' ? '核对版' : '盖章版' }}:{{ att.filename }}
上传人:{{ att.uploaded_by_name }} {{ att.uploaded_at }}
下载
统计口径
查询
重置
导出对账单
对账周期:{{ reconciliationResult.period.start ? reconciliationResult.period.start + ' ~ ' + reconciliationResult.period.end : '历史以来 ~ ' + reconciliationResult.period.end }} · {{ basisLabel(reconciliationResult.basis || reconciliationFilter.basis) }}
请选择条件并点击查询
🔎
没有找到匹配的合同或任务
{{ contractEditorDialogTitle }}
✕
基本信息
合同编号:{{ contractDetail.contract_no }}
草稿编号:{{ contractDetail.draft_no }}
合同类型:
{{ contractDetail.contract_type || '-' }}
修改
保存
取消
状态:
{{ contractDetail.status }}
业务合同名称:{{ (contractDetail.quotation_data_parsed && contractDetail.quotation_data_parsed.business_title) || '-' }}
合同正文:查看 / 下载 未上传
业务闭环:{{ contractDetail.archived ? '已归档,可进行财务关联' : '签订后待归档' }}
是否框架合同:
是
否
检测类别:{{ contractDetail.test_category || '-' }}
委托单位:{{ contractDetail.client || '-' }}
受检单位:{{ contractDetail.testee_unit || '-' }}
受检地址:{{ contractDetail.testee_address || '-' }}
客户经理:{{ contractDetail.account_manager || '-' }} {{ contractDetail.manager_phone }}
现任客户经理:{{ contractDetail.current_account_manager || '-' }}
客服:{{ contractDetail.customer_service || '-' }}
现任客服:{{ contractDetail.current_customer_service || '-' }}
联系人:{{ contractDetail.contact || '-' }} {{ contractDetail.contact_phone }}
签订日期:{{ contractDetail.signed_date || '-' }}
起止:{{ contractDetail.start_date || '-' }} ~ {{ contractDetail.end_date || '-' }}
合同序号:{{ contractDetail.contract_serial || '-' }}
归档日期:
{{ contractDetail.archive_date || '-' }}
待归档
-
归档人:{{ contractDetail.archived_by || '-' }}
频次:{{ contractDetail.frequency || '-' }}
采样次数:{{ contractDetail.total_rounds || 0 }} 次/年
首次月份:{{ contractDetail.first_sampling_month || '-' }}
合同金额:¥ {{ (contractDetail.total_amount||0).toLocaleString() }}
居间费:¥ {{ (contractDetail.broker_fee||0).toLocaleString() }}
分包费:¥ {{ (contractDetail.subcontract_fee||0).toLocaleString() }}
实收金额:¥ {{ (contractDetail.net_amount||0).toLocaleString() }}
创建时间:{{ contractDetail.created_at || '-' }}
更新时间:{{ contractDetail.updated_at || '-' }}
备注:{{ contractDetail.notes }}
💰 金额构成(签约金额 = 已收款 + 应收未收 + 未到期)
¥{{ formatMoney(contractDetail.total_amount || 0) }}
合同签约金额
¥{{ formatMoney(contractDetail.paid_amount || 0) }}
已收款
¥{{ formatMoney(contractDetail.cleared_amount || 0) }}
已销账金额
财务销账流水累计
¥{{ formatMoney(contractDetail.receivable_due_amount || 0) }}
应收未收
已开票 / 到期已交付
¥{{ formatMoney(contractDetail.not_due_amount || 0) }}
未到期
计划月未到 / 报告未交付
审批信息
审批状态:
{{ {pending:'待审批',approved:'已通过',rejected:'已驳回'}[contractDetail.latest_approval.status] || contractDetail.latest_approval.status }}
审批人:{{ contractDetail.latest_approval.approver_name || '-' }}
发起人:{{ contractDetail.latest_approval.initiator_name || '-' }}
发起时间:{{ contractDetail.latest_approval.submitted_at || '-' }}
审批时间:{{ contractDetail.latest_approval.decided_at || '-' }}
提交说明:{{ contractDetail.latest_approval.submit_comment }}
审批意见:{{ contractDetail.latest_approval.approve_comment }}
采样点位({{ contractDetail.points.length }})
| 序号 | 点位名称 | 检测类型 | 执行标准 | 备注 |
|---|---|---|---|---|
| {{ pi + 1 }} | {{ p.point_name }} | {{ p.sample_type }} | {{ p.standard || '-' }} | {{ p.notes || '-' }} |
检测项目明细({{ contractDetail.items.length }})
| 点位# | 项目组 | 第几次 | 检测项目 | 执行标准 | 计划月份 | 点位数 |
|---|---|---|---|---|---|---|
| {{ (it.point_index ?? 0) + 1 }} | {{ it.group_no }} | 第{{ it.round_no }}次 | {{ it.test_items }} | {{ it.standards || '-' }} | {{ it.plan_month || '-' }} | {{ it.point_count || 1 }} |
回款计划({{ contractDetailPayments.length }})
· 来自审批通过记录
| 序号 | 回款计划编号 | 计划月份 | 金额 | 到账 | 开票 | 报告交付 | 操作 |
|---|---|---|---|---|---|---|---|
| 第 {{ pi + 1 }} 笔 |
{{ contractDetail.contract_no }}({{ pi + 1 }})
|
{{ pay.plan_month || '-' }} | ¥ {{ (pay.amount||0).toLocaleString() }} | 已到账 未到账 | 已开票 未开票 | 已交付 {{ pay.delivered_at || '' }} 未交付 |
合同资料({{ contractDetailAttachments.length }})
盖章版合同({{ contractDetailStampedAttachments.length }})
📄 {{ a.filename }}
({{ (a.size / 1024).toFixed(1) }} KB)
{{ a.uploaded_at }}
其他资料({{ contractDetailOtherAttachments.length }})
📄 {{ a.filename }}
({{ (a.size / 1024).toFixed(1) }} KB)
{{ a.uploaded_at }}
暂无附件
任务单列表({{ (contractDetailTasks || []).length }})
| 任务号 | 第几次 | 计划月份 | 具体日期 | 状态 | 优先级 | 操作 |
|---|---|---|---|---|---|---|
| {{ t.task_no }} | 第{{ t.round_no }}次 | {{ t.plan_month }} | {{ t.plan_date || '待排期' }} | {{ t.status }} {{ t.status }} |
|
|
| 尚未生成任务单 |
该合同暂无上传的资料
盖章版合同({{ contractFilesDialog.stampedFiles.length }})
+ 补充
📄 {{ a.filename }}
({{ (a.size/1024).toFixed(1) }} KB)
{{ a.uploaded_at }}
查看
下载
删除
其他资料({{ contractFilesDialog.otherFiles.length }})
+ 补充
📄 {{ a.filename }}
({{ (a.size/1024).toFixed(1) }} KB)
{{ a.uploaded_at }}
查看
下载
删除
已关联开票合计:¥{{ contractInvoiceDialog.invoicedTotal.toLocaleString() }}
签约金额:¥{{ (contractInvoiceDialog.totalAmount||0).toLocaleString() }}
未开票:¥{{ Math.max(0,(contractInvoiceDialog.totalAmount||0)-contractInvoiceDialog.invoicedTotal).toLocaleString() }}
该合同暂无已关联发票
已选 {{ batchArchiveDialog.rows.length }} 份可归档合同,系统从当前最大纸质序号 +1 开始自动递增,可单独修改。
没有符合归档条件的合同(需为待下单/履约中/已完成且未归档)。
请上传盖章版合同扫描件(将应用到本次向导所有合同)
⬆
拖拽或点击上传
合同编号:{{ archiveForm.contract_no }}
委托单位:{{ archiveForm.client || '-' }}
当前状态:{{ archiveForm.current_status || '-' }}
必须上传至少一份盖章版合同,归档才算正式生效
⬆
拖拽或点击上传盖章版合同扫描件(可多选)
⬆
拖拽或点击上传其他资料(报价单、补充协议等,可选)
新建时只能选已在该组的成员,需先创建再加成员再设组长
共 {{ labGroupCandidates.length }} 名候选(已在组的员工不显示,先从原组移除)
原样品编号:
{{ labAppendSource.sample_id }}受检单位:{{ labAppendSource.company_name }}
检测项目:{{ labAppendSource.test_items }}
{{ labAppendPreviewSid }}
受检单位:{{ labTaskDetail.company_name || '—' }} · 检测员:{{ labTaskDetail.assigned_to || '—' }} · 样品类型:{{ labTaskDetail.sample_type || '—' }} · 采样日期:{{ labTaskDetail.sampling_date || '—' }}
数据录入
检测日期:
~
{{ desc }}({{ key }}):
检测值:
{{ labCalcResult.display }}
原始值: {{ labCalcResult.calc_result }} · 修约(GB/T 8170): {{ labCalcResult.rounded_result }}
📋 原始记录数据
{{ recordLabel(k) }}:
{{ v }}
{{ recordLabel(rk) }}:
{{ rv }}
二氯甲烷浓度计算公式
M={{labTaskDetail.raw_data.molar_mass||'—'}}(g/mol) × D={{labTaskDetail.raw_data.dilution_d||'—'}} × φ={{labTaskDetail.raw_data.target_conc||'—'}}(μmol/mol) ÷ [(1-XSW{{labTaskDetail.raw_data.xsw||'—'}}%)×22.4] = {{labTaskDetail.raw_data.rho||'—'}} mg/m³
{{ labTaskDetail.is_nd ? 'ND' : labTaskDetail.rounded_result }}
原始值: {{ labTaskDetail.calc_result || '—' }} · 修约规则: GB/T 8170
操作记录
{{ t.action }} — {{ t.operator }}
{{ t.time }}
暂无启用的检测员,请先在系统管理 · 用户岗位中配置
{{ labQrcodeLabel }}
共 {{ notifList.length }} 条通知
全部已读
暂无通知
{{ n.title }}
{{ n.created_at }}
{{ n.content }}
🔗 合同、发票、流水三方关联工作台
按金额覆盖核对销项发票、业务收入流水和合同回款计划,优先处理尚未闭环的缺口。
有效合同金额
¥{{ formatMoney(financeRelationship.summary.contracts.amount) }}
{{ financeRelationship.summary.contracts.count || 0 }} 份合同
销项发票金额
¥{{ formatMoney(financeRelationship.summary.out_invoices.amount) }}
{{ financeRelationship.summary.out_invoices.count || 0 }} 张有效销项发票
业务收入流水
¥{{ formatMoney(financeRelationship.summary.business_income.amount) }}
{{ financeRelationship.summary.business_income.count || 0 }} 笔需关联合同
合同 ↔ 发票已关联
¥{{ formatMoney(financeRelationship.summary.contract_invoice.amount) }}
{{ financeRelationship.summary.contract_invoice.count || 0 }} 条分摊
合同 ↔ 流水已关联
¥{{ formatMoney(financeRelationship.summary.contract_tx.amount) }}
{{ financeRelationship.summary.contract_tx.count || 0 }} 条回款
发票 ↔ 流水已核对
¥{{ formatMoney(financeRelationship.summary.invoice_tx.amount) }}
{{ financeRelationship.summary.invoice_tx.count || 0 }} 条核对
优先处理事项
发票待分摊合同 {{ financeRelationship.risk_counts.invoice_contract_gap || 0 }}
发票待核流水 {{ financeRelationship.risk_counts.invoice_tx_gap || 0 }}
业务收入待分摊 {{ financeRelationship.risk_counts.tx_contract_gap || 0 }}
历史超额 {{ financeRelationship.risk_counts.contract_invoice_over }}
显示全部
处理后自动刷新金额缺口
当前筛选范围内没有需要处理的三方关联风险
🤖 智能推荐待办(需人工确认)
全部
高置信
中置信
刷新推荐
高置信 {{ linkRecommendations.high }} 条 / 中置信 {{ linkRecommendations.medium }} 条
确认关联选中
当前没有智能推荐待办
🛡️ 财务数据质量中心
集中检查重复发票、零金额关联、回款计划金额不平,以及三方关联操作轨迹。
合同财务一体化查询查看合同-期次-开票-回款 高风险应收 {{ receivableRisk.high_count || 0 }} 项
重复发票号
{{ financeQuality.duplicate_invoices.length }}
重复流水
{{ financeQuality.duplicate_transactions.length }}
零金额关联
{{ financeQualityZeroLinkCount }}
回款计划金额不平
{{ financeQuality.plan_mismatch.length }}
回款计划金额不平
重复发票号
重复流水
最近关联操作
月结快照
高风险应收预测
对账导出记录
月结后调整记录
经营筛选:
🔄 刷新
导出财务对账
🤖 全量重跑归类
财务闭环工作台
按“申请审批 → 开票 → 流水关联 → 应收回款”排序处理,避免单据停留在中间环节。
当前没有待处理的财务闭环事项
当月确认收入¥{{formatMoney(financeDashboard.business_kpi.recognized_revenue)}}口径:{{ {receipt:'按回款',issued:'按开票',delivery:'按交付',signed:'按签约'}[financeDashboard.business_kpi.recognition_basis] }}月结将同时锁定签约、开票、回款、收支与该月快照
本月应收
¥{{ formatMoney(financeDashboard.business_kpi.month_receivable) }}
{{ financeDashboard.business_kpi.month }}
本月已收
¥{{ formatMoney(financeDashboard.business_kpi.month_received) }}
已关联业务收入流水
审批后待开票
{{ financeDashboard.business_kpi.pending_issue_count || 0 }} 笔
¥{{ formatMoney(financeDashboard.business_kpi.pending_issue_amount) }}
逾期回款
¥{{ formatMoney(financeDashboard.business_kpi.overdue_receivable) }}
未回款计划金额
异常关联
{{ financeDashboard.business_kpi.relation_exception_count || 0 }} 项
发票或业务收入未覆盖
总收入
¥ {{ formatMoney(financeDashboard.kpi?.total_income) }}
总支出
¥ {{ formatMoney(financeDashboard.kpi?.total_expense) }}
净流入
¥ {{ formatMoney(financeDashboard.kpi?.net_cashflow) }}
流水笔数
{{ financeDashboard.kpi?.tx_count ?? 0 }}
归类覆盖率
{{ financeDashboard.coverage?.covered_amount_rate ?? 0 }}%
按金额 · 待归类 ¥{{ formatMoney(financeDashboard.coverage?.uncovered_amount) }}
🏦 银行账户
上月 {{ financeDashboard.bank_stats.last_ym }} · 当月 {{ financeDashboard.bank_stats.this_ym }}
{{ b.name }}
实时余额
截止{{ Number(b.as_of_date.split('-')[1]) }}月{{ Number(b.as_of_date.split('-')[2]) }}日
¥{{ formatMoney(b.balance) }}
上月收入
¥{{ formatMoney(b.last_month_income) }}
上月支出
¥{{ formatMoney(b.last_month_expense) }}
当月收入
¥{{ formatMoney(b.this_month_income) }}
当月支出
¥{{ formatMoney(b.this_month_expense) }}
📊 回款计划预览(未来现金流)
按 plan_month 聚合所有未收回款 → 看老板未来每月该收多少钱
未来应收 ¥{{ formatMoney(forecastStats.future_total) }}
已逾期 ¥{{ formatMoney(forecastStats.overdue_total) }}
📈 月度收支趋势
🥧 支出结构(一级科目)
📊 二级科目 Top 15(支出金额)
💰 收入结构(一级科目)
{{ bankTxProgress || (bankTxExporting ? '导出中...' : '导入中...') }}
批量导出银行流水(Excel)
导出已关联发票、合同的流水
导出未关联合同的流水
导入农行流水(保留关联)
导入华兴流水(保留关联)
批量删除(按银行+年月)
⚠ 将删除该银行该年月的全部流水;已关联(合同/发票/付款/销账)的流水会自动跳过。删除后不可恢复,适用于删除后重新导入官网流水的场景。
已选 {{ bankTxSelected.length }} 条
批量删除流水
{{ planStats.total_count }}
回款计划总数
{{ formatMoney(planStats.received_amount) }}
已收款金额
{{ formatMoney(planStats.pending_amount) }}
未收款金额
{{ formatMoney(planStats.invoiced_amount) }}
已开票金额
{{ planImporting ? '导入中...' : '导出中...' }}
批量导出回款计划(Excel)
批量导入回款计划(Excel)
{{ row.contract_no }}({{ row.seq }})
暂无自定义白名单。在"待归类点审"或"银行流水"页勾选"加入白名单"即可添加。
左侧选流水 → 右侧选合同 → 把回款计划加入分配清单 → 编辑金额 → 提交销账
¥ {{ formatMoney(receivableStats.bucket_0_30) }}
账龄 1-30 天
¥ {{ formatMoney(receivableStats.bucket_31_60) }}
账龄 31-60 天
¥ {{ formatMoney((receivableStats.bucket_61_90 || 0) + (receivableStats.bucket_90_plus || 0)) }}
账龄 60 天以上
{{ unreceivedStats.unreceived_contract_count ?? 0 }}
未收款合同数量
¥ {{ formatMoney(unreceivedStats.unreceived_total_amount) }}
未收款总金额
应收未收 + 未到期
¥ {{ formatMoney(unreceivedStats.receivable_due_total) }}
应收未收金额
已开票 / 到期已交付
¥ {{ formatMoney(unreceivedStats.not_due_total) }}
未到期金额
计划月未到 / 未交付
已回{{ row.payments_brief.filter(p => p.received).length }}期
未回{{ row.payments_brief.filter(p => !p.received).length }}期
第{{ p.seq }}期
{{ p.plan_month || '-' }}
{{ formatMoney(p.amount) }}
已收
未收
已开票
已交付
驳回原因:{{ row.review_comment || row.comment || '请联系财务补充资料' }}
发票附件已可下载
付款管理发起付款申请 我的申请 待我审批 财务待付款 流水分摊核销 导出对账 配置付款审批模板 收款方花名册管理 一笔支出流水可分摊多张申请;一张申请也可分次付款。
原应付款台账
供应商应付
居间费应付
工资绩效应付
{{ payableTypeLabel }}
共 {{ payableTotal }} 笔 · 应付 ¥{{ payableTypeStat.total.toLocaleString() }} · 已付 ¥{{ payableTypeStat.paid.toLocaleString() }} · 未付 ¥{{ payableTypeStat.unpaid.toLocaleString() }}
刷新
+ 新增
批量导出
导入Excel
全新导入
清理重复
暂无记录。可点「导入Excel」导入《应付款明细》,或「+ 新增」。
{{ payDialog.payee }}:应付 ¥{{ Number(payDialog.amount||0).toLocaleString() }},已付 ¥{{ Number(payDialog.paid_amount||0).toLocaleString() }},
尚欠 ¥{{ Math.max(0,Number(payDialog.amount||0)-Number(payDialog.paid_amount||0)).toLocaleString() }}
🧾 发票管理
发票台账
待开发票{{ invoicePlanPending>0 ? '('+invoicePlanPending+')' : '' }}
开票申请{{ invoiceApplicationPending>0 ? '('+invoiceApplicationPending+')' : '' }}
开票项目管理
⏰ 待开发票
刷新
合同审批通过且需开票的,会自动出现在这里。待开 {{ invoicePlanPending }} 期
暂无待开发票
🧾 开票申请
刷新
审批通过后可登记发票号和附件,发票会进入台账并关联申请中的合同。
暂无开票申请
当前筛选
{{ tag.label }}:{{ tag.summary }}
清空全部筛选
{{ row.tx_serial_no }} · {{ row.tx_date }}
一张发票可拆分到多份合同的多个回款计划,分配总额必须等于发票金额
① 上传发票文件
② 票面信息
③ 关联合同 + 回款计划
分配总额:
¥{{ formatMoney(invoiceAllocSum) }}
/ 发票总额 ¥{{ formatMoney(invoiceForm.total_amount) }}
⚠️ 不一致
最近合同:
{{ c.contract_no }} · {{ c.client }} · 剩余可开¥{{ formatMoney(c.remain_invoice) }}
{{ c.contract_no }}
{{ c.client }}
未开票 {{ c.plans.length }} 期
从上方候选合同里点回款计划加入分配
按建议自动填充
📎 上传发票文件(PDF / 图片)→ 自动识别填表
⚠ {{ simpleInvoiceOcrError }}(部分字段未识别,请手动补全)
即发票上"价税合计(小写)"金额,是实际付款金额
{{ t.serial_no }} {{ t.tx_date }} {{ t.bank }}
¥{{ formatMoney(t.income + t.expense) }} {{ t.summary }}
⚠ 暂未关联流水:发票登记后会显示在"未挂流水"列表,提醒后续补登
日期:{{ financeEditor.row.tx_date }} · 银行:{{ financeEditor.row.bank }}
摘要:{{ financeEditor.row.summary }}
{{ financeEditor.row.op_type }}:
¥{{ formatMoney(financeEditor.row.income + financeEditor.row.expense) }}
备注:{{ financeEditor.row.remark }}
农行 NY-XXXX / 华兴 HX-XXXX;唯一,保存后不可修改
余额将根据该账号历史流水自动计算
已关联 {{ txLinkedInvoices.length }} 张发票:
+ 新增并关联发票({{ txFullEditorForm.op_type === '收入' ? '销项' : '进项' }})
{{ inv.invoice_no }}
(¥{{ formatMoney(inv.amount) }})
暂无关联发票
提示:保存后可在「发票管理」里登记发票并关联本流水
不选则进入"待归类"。最终归属:{{ txFinalAccountLabel || '待归类' }}
可简化为对方名的一部分(模糊匹配)
我的行政
我的部门
{{adminhrMe.profile.dept||'-'}}
待审批申请
{{adminhrMe.requests.filter(x=>x.status==='待审批').length}}
本月考勤
{{adminhrMe.attendance.length}} 天
领用资产
{{adminhrMe.assets.length}}
我的申请
我的培训与资质
行政人事工作台
{{k.v||0}}
{{k.n}}
待处理行政人事申请
本月人事与行政运行指标
本月入职 {{adminhrDashboard.monthly_hires||0}}
本月离职 {{adminhrDashboard.monthly_leavers||0}}
请假时长 {{adminhrDashboard.monthly_leave_hours||0}}h
考勤异常 {{adminhrDashboard.monthly_abnormal_days||0}}
组织架构与部门负责人新增部门
劳动合同、试用转正与离职交接新建劳动合同
离职交接任务
薪资档案
绩效周期
资产与办公用品台账{{adminhrLowStockAssets.length}} 项库存预警
会议室、访客与行政资源预约新建预约
车辆协同台账预约用车
招聘、培训与资质台账新增记录
人事分析(近12个月)
在职人员部门分布
人员异动汇总
60天内到期资质
{{templateFlowPreview(((adminhrApprovalTemplates.find(t=>t.id===adminhrRequestDialog.form.template_id)||{}).nodes)||[]).join(' → ')}}
{{index+1}}删除
系统管理
{{ dbTables.length || '' }}
数据库管理
查看、搜索、编辑、删除数据表记录,导出CSV
AI 管理
AI模型切换、API Key配置与管理
用户岗位管理
用户岗位分配、岗位增删管理
系统有效期
系统授权到期控制,过期后普通账号无法登录
飞书推送配置
配置飞书Webhook机器人,采样完成自动推送通知
任务分配规则
配置检测项目与负责人对应关系,自动派发任务
操作日志
全流程操作记录(含财务删改),不可篡改,可追溯
点位库管理
监测点位档案、经纬度、历史记录、Excel导入
权限管理
按账号/部门细粒度配置功能权限,支持 Excel 导入
{{ accountList.length || '' }}
用户账号管理
新增、编辑、删除登录账号,重置密码、停启用
系统更新
一键拉取最新代码并重启服务,升级到最新版本
当前版本
{{ sysUpdate.currentVersion || sysVersion.version || '—' }}
服务器分支
{{ sysUpdate.branch || 'master' }}
gitee 上最新提交
{{ sysUpdate.latestCommit }}
{{ sysUpdate.latestTime }}
{{ sysUpdate.hint }}
{{ sysUpdate.runLog }}
说明:服务器为 Mac,更新动作 = 备份数据库 → 从 gitee 拉取最新代码 → 安装新依赖 →
导入新标准限值 → launchctl 重启服务 → 健康检查(即 mac_setup/upgrade.sh)。
该操作受「权限管理 · 系统运维 · 一键系统更新」权限管控,仅授权账号可执行。
若网络异常或本地代码冲突,脚本会中止并在上方日志说明,数据库已自动备份可回滚。
该操作受「权限管理 · 系统运维 · 一键系统更新」权限管控,仅授权账号可执行。
若网络异常或本地代码冲突,脚本会中止并在上方日志说明,数据库已自动备份可回滚。
| 手机号(账号) | 姓名 | 部门 | 岗位 | 状态 | 密码 | 飞书 ID | 创建时间 | 操作 |
|---|---|---|---|---|---|---|---|---|
| {{ u.phone }} |
{{ u.name }} | {{ u.dept || '—' }} | {{ u.role || '—' }} | {{ u.password || '—' }} | {{ u.feishu_id || '—' }} | {{ u.created_at || '—' }} |
|
|
| 暂无匹配账号 | ||||||||
手机号*
姓名*
初始密码*
部门
岗位*
⚠ 岗位将从「{{ accountForm.origRole }}」改为「{{ accountForm.role }}」,已配置的权限会自动迁移到新岗位。
状态
启用
停用
飞书 ID
目标账号:{{ accountResetPwdTarget.name }}({{ accountResetPwdTarget.phone }})
{{ accountResetPwdTarget.role }}
选择表:
查询
导出CSV
刷新
| {{ c.name }} {{ dbSortDir === 'ASC' ? '↑' : '↓' }} PK | 操作 |
|---|---|
|
|
暂无数据
共 {{ dbTotal }} 条,当前第 {{ Math.floor(dbOffset / dbLimit) + 1 }} / {{ Math.ceil(dbTotal / dbLimit) }} 页
上一页
下一页
AI 模型管理
{{ m.name }}
当前使用
{{ (m.protocol||'openai')==='anthropic' ? 'Anthropic 协议' : 'OpenAI 协议' }}
模型ID: {{ m.id }}
API: {{ m.api_url }}
Key 变量: {{ m.api_key_env || '未设置' }}
API Key 管理
{{ keyName }}
{{ val || '(未设置)' }}
修改
用户岗位分配
| 姓名 | 手机号 | 部门 | 岗位 | 飞书ID | 状态 | 密码 |
|---|---|---|---|---|---|---|
| {{ u.name }} | {{ u.phone }} | {{ u.dept }} |
|
|
{{ u.status }} |
|
| 暂无用户 | ||||||
岗位管理
岗位名称:
岗位说明:
| 序号 | 岗位名称 | 说明 | 操作 |
|---|---|---|---|
| {{ idx + 1 }} | {{ r.name }} | {{ r.description }} |
|
| 暂无岗位 | |||
快捷设置:
+30天
+90天
+半年
+1年
过期后所有普通账号将无法登录,仅管理员(18928105500)可正常进入系统。
使用步骤:
1. App ID 和 Secret 已预填,一般不需要改
2. 在飞书中把机器人添加到目标群
3. 点"获取群列表",选择要推送通知的群
4. 保存配置,点"发送测试"验证
5. 启用后,样品提交/流转单接收会自动推送到群
1. App ID 和 Secret 已预填,一般不需要改
2. 在飞书中把机器人添加到目标群
3. 点"获取群列表",选择要推送通知的群
4. 保存配置,点"发送测试"验证
5. 启用后,样品提交/流转单接收会自动推送到群
添加分配规则
已有规则
| 样品类型 | 检测项目 | 负责人 | 手机号 | 操作 |
|---|---|---|---|---|
| {{ a.sample_type }} | {{ a.test_item }} | {{ a.assigned_name }} | {{ a.assigned_phone }} |
|
| 暂无规则(未配置时,通知将发给所有检测员) | ||||
⚠️ 此页记录所有财务关键操作(流水/发票/销账/回款计划的增删改),用于防止误删/误改重要财务数据
| 时间 | 分类 | 操作 | 操作人 | 详情 |
|---|---|---|---|---|
| {{ l.created_at }} | {{ scopeLabel(l.target_type) }} | {{ l.action }} |
{{ l.operator_name }}
{{ l.operator_phone }}
|
{{ l.detail }} |
| 暂无日志 | ||||
| 编码 | 点位名称 | 受检单位 | 样品类型 | 经度 | 纬度 | 操作 |
|---|---|---|---|---|---|---|
| {{ p.point_code }} | {{ p.point_name }} | {{ p.company_name }} | {{ p.sample_type }} | {{ p.longitude || '—' }} | {{ p.latitude || '—' }} | |
| 暂无点位数据 | ||||||
名称:{{ instDetail.instrument_name }}
型号:{{ instDetail.model }}
生产厂家:{{ instDetail.manufacturer }}
出厂编号:{{ instDetail.serial_number }}
类别:{{ instDetail.category }}
状态:{{ instDetail.status }}
购入日期:{{ instDetail.purchase_date || '—' }}
检定日期:{{ instDetail.calibration_date || '—' }}
有效期至:{{ instDetail.calibration_due || '—' }} (已超期)
检定证书:{{ instDetail.calibration_cert || '—' }}
保管人:{{ instDetail.custodian }} {{ instDetail.custodian_phone }}
存放位置:{{ instDetail.location }}
领用人:{{ instDetail.current_holder || '—' }}
领用时间:{{ instDetail.checkout_time || '—' }}
扫码查看仪器信息
| 时间 | 操作 | 操作人 | 详情 |
|---|---|---|---|
| {{ l.created_at }} | {{ l.action }} | {{ l.operator }} | {{ l.detail }} |
| 暂无操作日志 | |||
| 报修时间 | 故障 | 状态 | 维修方 | 费用 |
|---|---|---|---|---|
| {{ r.reported_at }} | {{ r.fault_type }}:{{ r.fault_description }} | {{ r.status }} | {{ r.repair_vendor || '—' }} | {{ r.repair_cost || 0 }} |
| 暂无维修记录 | ||||
仪器:{{ repairTarget.instrument_code }} {{ repairTarget.instrument_name }}
合同编号:{{ samplingPlanData.contract_no || '(未保存)' }}
采样频次:{{ samplingPlanData.frequency || '-' }}
履约期间:{{ samplingPlanData.start_date || '-' }} ~ {{ samplingPlanData.end_date || '-' }}
首次采样:{{ samplingPlanData.first_sampling_month || '-' }}
委托单位:{{ samplingPlanData.client || '-' }}
受检单位:{{ samplingPlanData.testee_unit || '-' }}
联系人:{{ samplingPlanData.contact || '-' }} {{ samplingPlanData.contact_phone }}
地址:{{ samplingPlanData.testee_address || '-' }}
共 {{ samplingPlanData.rows.length }} 条采样配置 × {{ samplingPlanData.months.length }} 个月份,✓ 表示该月有采样计划
| 第几次 | {{ samplingPlanMonthRoundMap[m] || '' }} | ||
|---|---|---|---|
| 点位 | 检测类型 | 检测项目 | {{ m }} |
| {{ row.point_name }} | {{ row.sample_type }} | {{ row.test_items }} | ✓ · |
| 尚未配置任何项目组或月份 |
⚠ 有 {{ samplingPlanData.unscheduled }} 次采样未指定月份,请返回配置页补齐
任务:{{ scheduleTarget.task_no }} / {{ scheduleTarget.company_name }}
计划月份:{{ scheduleTarget.plan_month || '未指定' }}
计划月份:{{ scheduleTarget.plan_month || '未指定' }}
📌 本次为补采排期,仅涉及以下 {{ schedulePartialPoints.length }} 个改期点位:
· {{ p.point_name }}({{ p.reschedule_reason_category }})
当天暂无任务
👥 {{ grp.name }}
{{ grp.tasks.length }} 单
{{ t.task_no }}
受检单位:{{ t.company_name || '-' }}
采样员:{{ t.assigned_names || '未派发' }}
车辆:{{ formatTaskVehicle(t) }}
采样内容:{{ t.sample_types || '-' }}
渲染中...
⚠ {{ previewError }}
如要继续工作,请下载原文件用 WPS / Office 打开
该文件类型暂不支持网页预览,请下载原文件查看
⚠ 拍一张移交照片上传, 提交后无法撤回
任务号: {{ paperHandDlg.task_no }}
仅显示已收到采样室和实验室纸质记录、当前尚未分配的“待编制”任务。
目标编制人 已选 {{reportBulkAssign.selected.length}} 条
{{ reportOperationsProfile.task.task_no }} · {{ reportOperationsProfile.task.testee_unit || reportOperationsProfile.task.company_name || '—' }}
工作量 {{ reportOperationsProfile.workload.score || 0 }} 分
项目工作量
资料齐套检查{{g.gap_label}} · {{g.owner_stage}} 资料已齐套
报告编号: {{ reportFull.header.report_no || reportTaskCurrent.task.task_no }}
报告状态: {{ reportFull.header.status || reportTaskCurrent.task.status }}
编制人:
{{ reportFull.header.drafter_name }}
未指派
委托方: {{ reportFull.header.client_unit || '—' }}
受检方: {{ reportFull.header.testee_unit || '—' }}
客户经理:
{{ reportFull.header.account_manager }} ({{ reportFull.header.account_manager_phone }})
—
客服:
{{ reportFull.header.customer_service }} ({{ reportFull.header.customer_service_phone }})
—
⏱
编制报告历时{{ reportFull.duration.end_is_now ? '(进行中)' : '(已完成)' }}
{{ reportFull.duration.display }}
起算: {{ reportFull.duration.start_at }} (报告室收到采样/实验室纸质中最晚的) → 截止: {{ reportFull.duration.end_at }}{{ reportFull.duration.end_is_now ? ' (当前时间)' : ' (客户经理已签收)' }}
⌛ 编制历时未开始: 必须采样室+实验室两边纸质原始记录都已接收,才会开始计时。
🛤 生产进度(从下单到客户经理接收)
{{ (reportFull.timeline[i-1]||{}).done ? '✓' : '◷' }} {{ (reportFull.timeline[i-1]||{}).label || '' }}
{{ (reportFull.timeline[i-1]||{}).time || '—' }}
{{ (reportFull.timeline[i+7]||{}).done ? '✓' : '◷' }} {{ (reportFull.timeline[i+7]||{}).label || '' }}
{{ (reportFull.timeline[i+7]||{}).time || '—' }}
📑 同一合同其他报告 ({{ reportFull.other_reports.length }} 份)
- 合同 {{ reportFull.contract.contract_no }}
| 报告编号 | 受检方 | 状态 | 编制人 | 签发时间 | 客户经理接收 |
|---|---|---|---|---|---|
| {{ o.task_no }} | {{ o.testee || '—' }} | {{ o.drafter_name || '—' }} | {{ o.issued_at || '—' }} | {{ o.client_received_at || '—' }} |
最近驳回原因: {{ reportTaskCurrent.task.reject_reason }}
⏳ 等待报告室收到采样/实验室原始记录纸质后,主管在「编制报告任务」点「指派编制」选定编制人.
📌 已具备编制条件,请等主管在「编制报告任务」点「指派编制」, 或被指派的编制人到「我的报告任务」点「开始编制」.
✍ 编制中(编制人: {{ reportTaskCurrent.task.drafter_name || '—' }}),编制人请到「我的报告任务」点「提交初审」.
🔎 等待初审人复核.
🔎 等待二审人复核.
🔎 等待终审人复核.
✒ 等待法人/技术负责人签发.
📦 已签发,等待客户经理「{{ reportTaskCurrent.task.account_manager_name || '—' }}」接收纸质报告.
✅ 报告已签收,流程闭环.
操作日志
暂无日志
{{ log.created_at }}
·
{{ log.action }}
{{ log.from_status }} → {{ log.to_status }}
{{ log.operator_name }}
· {{ log.comment }}
合同状态
签约金额
¥{{ formatMoney(contractLifecycleDialog.contract.total_amount) }}
已开票
¥{{ formatMoney(contractLifecycleDialog.contract.invoiced_amount) }}
已收款 / 已销账
¥{{ formatMoney(contractLifecycleDialog.contract.paid_amount) }}
销账 ¥{{ formatMoney(contractLifecycleDialog.contract.cleared_amount) }}
归档 / 财务闭环
{{ contractLifecycleDialog.contract.archived ? '已归档' : '待归档' }}
归档后关联发票与业务收入流水
履约 / 报告
{{ (contractLifecycleDialog.contract.task_stats||{}).completed || 0 }}/{{ contractLifecycleDialog.contract.total_rounds || 0 }}
报告 {{ (contractLifecycleDialog.contract.reports_brief||[]).length }} 份
签订状态
已签订
合同归档
{{ contractLifecycleDialog.contract.archived ? '已完成' : '待处理' }}
审批回款计划
{{ ((contractLifecycleDialog.contract.payments||[]).length || (contractLifecycleDialog.contract.approved_payments||[]).length) ? '已落实' : '待补齐' }}
财务关联
发票 {{ contractLifecycleDialog.invoices.length }} 笔 · 流水 {{ contractLifecycleDialog.txs.length }} 笔
🧾 已关联发票({{ contractLifecycleDialog.invoices.length }})
暂无关联发票
🏦 已关联回款流水({{ contractLifecycleDialog.txs.length }})
暂无关联回款流水
「已收款」列为历史数据,可与「已销账金额」对比校验真假。
暂无关联记录
新增关联:
¥
添加
编辑回款计划:{{ planEditorContract.contract_no || '' }}
×
合同号:{{ planEditorContract.contract_no }}
委托方:{{ planEditorContract.client }}
签约金额:¥{{ formatMoney(planEditorContract.total_amount) }}
已收款:¥{{ formatMoney(planEditorContract.paid_amount) }}
回款计划合计:
¥{{ formatMoney(planEditorPlanSum) }}
✓ 等于签约金额
⚠️ 与签约金额差 ¥{{ formatMoney(planEditorPlanSum - (planEditorContract.total_amount||0)) }}
| 期次 | 回款计划编号 | 计划月份 | 金额 | 状态 | 操作 |
|---|---|---|---|---|---|
| 第{{ p.seq }}期 | {{ p.plan_no || '-' }} |
|
|
|
|
| 暂无回款计划 | |||||
💡 已收款 / 已销账的期不可改;未收期可改月份/金额、可删;可增加新期。保存时强制校验:回款计划合计必须等于签约金额。
加载中...
签约金额:¥{{ formatMoney(contractFinanceDialog.contract.total_amount) }}
已开票:¥{{ formatMoney(contractFinanceDialog.contract.invoiced_amount) }}
已收款:¥{{ formatMoney(contractFinanceDialog.contract.paid_amount) }}
应收余额:¥{{ formatMoney(Math.max(0,(contractFinanceDialog.contract.total_amount||0)-(contractFinanceDialog.contract.paid_amount||0))) }}
历史跟进
居间费总额 ¥{{ formatMoney(paymentRequestDialog.brokerQuota.broker_fee) }} · 已付 ¥{{ formatMoney(paymentRequestDialog.brokerQuota.broker_fee_paid) }} · 待审批 ¥{{ formatMoney(paymentRequestDialog.brokerQuota.broker_fee_pending_requests) }} · 剩余可申请 ¥{{ formatMoney(paymentRequestDialog.brokerQuota.broker_fee_remaining) }}
{{line}}
已有模板新建
{{i+1}}删除
已有模板新建
{{i+1}}删除
已有模板新建
{{i+1}}删除
{{item.operator_name || item.operator_phone}}
暂无操作日志
申请单号
{{paymentRequestDetailDialog.data.request.request_no}}
状态
{{paymentRequestDetailDialog.data.request.status}}
付款类型
{{paymentRequestDetailDialog.data.request.payment_type}}
申请金额 / 已付
¥{{formatMoney(paymentRequestDetailDialog.data.request.amount)}} / ¥{{formatMoney(paymentRequestDetailDialog.data.request.paid_amount)}}
收款方
{{paymentRequestDetailDialog.data.request.payee}}
开户行 / 账号
{{paymentRequestDetailDialog.data.request.bank_name || '-'}} / {{paymentRequestDetailDialog.data.request.bank_account || '-'}}
申请部门 / 申请人
{{paymentRequestDetailDialog.data.request.dept || '-'}} / {{paymentRequestDetailDialog.data.request.initiator_name}}
付款用途
{{paymentRequestDetailDialog.data.request.purpose || '-'}}
关联合同
{{paymentRequestDetailDialog.data.contract.contract_no}} · {{paymentRequestDetailDialog.data.contract.client}}合同详情
原应付款
{{paymentRequestDetailDialog.data.payable.payable_type}} · ¥{{formatMoney(paymentRequestDetailDialog.data.payable.amount)}}
关联进项发票
{{paymentRequestDetailDialog.data.invoice.invoice_no}} · ¥{{formatMoney(paymentRequestDetailDialog.data.invoice.amount)}}
审批流
暂无审批节点
分摊付款记录
¥{{formatMoney(row.amount)}}
操作日志
{{item.action}}{{item.detail}}
{{item.operator_name || item.operator_phone}}
暂无操作日志
系统按收款方、合同号、金额及日期评分;只展示评分达到阈值的候选申请。
已批准付款申请本次分摊:¥{{formatMoney(paymentLinkTotal)}};流水可用:¥{{formatMoney(paymentLinkRemaining)}}
版本按保存顺序留痕,可直接比较金额、居间费、分包费及条款备注变化。
{{ invoiceApplicationIssueDialog.buyer_name }} · ¥{{ formatMoney(invoiceApplicationIssueDialog.amount) }}
购买方:{{ invoiceAppContractDetailDialog.buyerName }} · 开票金额:¥{{ formatMoney(invoiceAppContractDetailDialog.amount) }}
{{templateFlowPreview(invoiceApplySelectedTemplate.nodes).join(' → ')}}
智能推荐合同:
分摊合计:¥{{ formatMoney(invoiceApplyAllocSum) }}
合同:{{ createPaymentPlanDialog.contract_no }} · {{ createPaymentPlanDialog.client }}
已收完款,签约金额:¥{{ formatMoney(createPaymentPlanDialog.remain_amount) }} 剩余未收款:¥{{ formatMoney(createPaymentPlanDialog.remain_amount) }}
已收完款,签约金额:¥{{ formatMoney(createPaymentPlanDialog.remain_amount) }} 剩余未收款:¥{{ formatMoney(createPaymentPlanDialog.remain_amount) }}
期数:
(修改期数自动刷新,默认平均分配)
合计:¥{{ formatMoney(createPaymentPlanSum) }}
{{ (createPaymentPlanDialog.paid_amount || 0) >= (createPaymentPlanDialog.total_amount || 0) ? '(已收完款,需等于签约金额)' : '(需等于剩余未收款)' }}
签发后,系统会推送消息到指定的客户经理,提示其接收纸质报告。
签发前必填字段缺失:{{ reportIssueForm.missingFields.join('、') }}
{{ reportIssueForm.sample_periods_text || '未填写' }}
{{ reportIssueForm.analysis_periods_text || '未填写' }}
报告编号:{{ reportUploadForm.report_no }}
附件类型:{{ reportUploadForm.kind === 'check_version' ? '核对版' : '盖章版' }}
暂无需要您确认或签收的报告。