检测到系统已升级到新版本,刷新页面即可使用新功能。

当前页面版本: {{ clientVersion }}
服务器最新版本: {{ latestVersion }}
该手机号下有多个岗位账号,请选择本次登录的岗位:
{{ r.role }} {{ r.dept }}
密码规则:8-10 位,必须同时包含字母和数字,允许英文符号,区分大小写,不能含中文。
快捷键 Ctrl + K 可随时打开,回车进入第一个结果。
没有找到可访问的功能
⚠ 管理员操作:直接覆盖目标账号密码,无需旧密码。重置后请告知该员工新密码。
{{ appActivePageTitle }}
{{ appActiveBreadcrumb }}
{{ currentUser.name }}-{{ currentUser.dept }}-{{ currentUser.role }}
{{ appOpenTabs.length }} 页 / {{ appPinnedTabCount }} 固定
我的工作台

{{ workbenchGreeting }},{{ currentUser.name || '同事' }}

{{ currentUser.dept || '未设置部门' }} · {{ currentUser.role || '未设置角色' }} · {{ workbenchDateText }}

没有找到可访问的功能

审批中心

集中处理合同、开票、付款和行政人事审批。

发起报价/签约审批发起合同变更审批开票申请付款申请用章申请审批模板配置刷新
暂无符合条件的审批事项
暂无审批详情

个人待办

优先处理和你直接相关的消息、任务与审批。

我的付款申请

最近 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') ? '可用' : '无权限' }}
📊
CEO驾驶舱
业务 / 生产 / 财务多维度数据分析
业务看板(合同·签约金额)
生产看板(采样·检测·报告)
财务看板(收支·成本)
⓵UI 已上线,部分指标占位中
已上线
📌 我的报告任务 刷新 只显示状态机轮到您处理的报告 · 共 {{ myDraftingTasks.length }} 条
报告编号 委托方 受检方 状态 采样室提交 实验室提交 报告室收纸质 操作
{{ rt.task_no }} {{ rt.client_unit || '—' }} {{ rt.company_name_full || rt.company_name }} {{ rt.status }} ✓ — ✓ — 采样 {{ rt.received_sampling_at ? '✓' : '×' }} / 实验室 {{ rt.received_lab_at ? '✓' : '×' }}
详情 开始编制 继续编制 重新编制
暂无轮到您处理的报告任务
← 返回我的报告任务 ✍ 编制工作台 {{ workspaceData.task.task_no }} {{ workspaceData.task.status }}
报告编号: {{ workspaceData.task.task_no }}
委托方: {{ workspaceData.sampling_task.client_unit || '—' }}
受检方: {{ workspaceData.sampling_task.company_name || '—' }}
编制人: {{ workspaceData.task.drafter_name || '—' }}
采样点位 ({{ 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.supervisor_audit && f.supervisor_audit.audit_status) || '—' }} 预览 下载 {{ f.drafter_status==='passed' ? '✅ 已审' : '⏳ 待审' }} {{ f.drafter_audited_at || '—' }}
采样室还未生成任何表格
现场照片 (按点位)
📍 {{ grp.point_name }} · {{ grp.photos.length }} 张 异常: {{ grp.abnormal_reason || '—' }}
现场暂无上传照片
实验室原始记录表 ({{ workspaceData.lab_files.length }} 张) — 编制人只读 + 审核
文件名 实验室三级审核 操作 编制人审核时间
{{ f.filename }} {{ (f.supervisor_audit && f.supervisor_audit.label) || '—' }}
分析: {{ f.supervisor_audit.analyst.join('/') }}
校核: {{ f.supervisor_audit.reviewer.join('/') }}
审核: {{ f.supervisor_audit.approver.join('/') }}
预览 下载 {{ f.drafter_status==='passed' ? '✅ 已审' : '⏳ 待审' }} {{ f.drafter_audited_at || '—' }}
实验室还未生成原始记录表
✅ 报告室审核(编制人确认前置条件)
{{ item.label }}
进度: {{ 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.data_quality.warnings.join(';') }}
{{ 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.lab_done || 0 }} / {{ t.lab_total || 0 }} 查看实验室
无
任务号 受检单位 项目 采样完成时间 说明
{{ 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 }}
⌛ 尚未审核
刷新
任务号 受检单位 项目 采样审核 (已通过/总数) 实验室审核 (已通过/总数) 总进度 操作
暂无任务,等待采样/实验室录入
受检单位: {{ 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_node }} {{ 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 }}
无
报告任务 刷新 ➕ 新增报告 只看历史导入 查询
导入历史报告 回填合同编号 导出合同编号缺失的报告 导入合同编号 一键生成报告 共 {{ reportTaskTotal }} 条 / 第 {{ reportTaskPage }} 页
{{ reportTaskStats[s] || 0 }}
{{ s }}
{{ reportTaskStats['合同编号缺失'] || 0 }}
合同编号缺失
报告编号 委托方 受检方 采样日期 分析日期 样品类型 点位/样品 合同编号 状态 签发时间 已签收时间 编制人 采样室提交 实验室提交 报告室接收记录 来源 操作
{{ rt.task_no }} 历史
{{ rt.client || rt.client_unit || '—' }}
{{ rt.testee_unit || rt.company_name_full || rt.company_name || '—' }}
{{ formatPeriods(rt.sample_periods) || rt.sample_date || '—' }}
{{ formatPeriods(rt.analysis_periods) || '—' }}
{{ rt.sample_types || '—' }}
{{ rt.point_count || 0 }} / {{ rt.sample_count || 0 }}
{{ rt.contract_no || '—' }}
{{ rt.status }}
{{ rt.issued_at }}
—
{{ rt.client_received_at }}
—
{{ rt.drafter_name }} 未指派 已提交 未提交
{{ rt.sampling_submitted_at }}
已提交 未提交
{{ rt.lab_submitted_at }}
✓ 采样纸质 {{ rt.received_sampling_at }} 📥 收到采样室纸质 —
✓ 实验室纸质 {{ rt.received_lab_at }} 📥 收到实验室纸质 —
{{ rt.source_excel || '系统生成' }}
详情 运营 编辑 开始编制 {{ 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||[]).length}} 条):
{{x.task_no}} {{x.issue}}
重复任务号({{(reportTaskImportDlg.inspect.duplicate_task_nos||[]).length}} 个,导入时同号只保留最后一条):
{{reportTaskImportDlg.inspect.duplicate_task_nos.join('、')}}
报告编号: {{ assignDrafterDlg.task_no }}
当前编制人: {{ assignDrafterDlg.current_drafter || '未指派' }}
选择编制人 *
上传任务单并识别 仅支持 DOCX,自动补齐合同、客户、采样、点位、项目和工作量初值。 已识别:{{ reportTaskEditForm.task_order_filename }}({{ reportTaskEditForm.taskOrderConfidence }})
加载中...
{{ h.task_no }} - {{ h.drafter_name || '未指派' }}
{{ reportTaskEditForm.contract_no ? '该合同暂无其他报告' : '选择合同编号后显示该合同所有报告的编制人' }}
删除
+ 添加采样时间段
签发前必填,建议现在填写
删除
+ 添加分析时间段
签发前必填,建议现在填写
介质项目数点位数分项得分
{{ 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
比对数据 / 设备信息 烟气在线比对报告(表2.1/表2.2)数据源,保存后生成草稿自动带入
项目仪器名称型号原理制造单位
删
+ 添加设备 用于前言设备叙述与表2.1 技术参数;未填的项目保留模板原文
项目仪器名称型号/编号原理方法依据
删
+ 添加参比设备 表2.1 参比方法侧;未填的项目保留模板原文(XC-045 识别参比仪器信息可由报告员参考填写)
{{ k }}
时段CEMS 值参比值
删
+ 添加行
时段可留空;全空行保存时自动忽略;分段限值与评定按 HJ 75-2017 由系统自动计算
项目CEMS均值参比均值比对结果限值评定
{{ b.key }} {{ b.cems_avg }} {{ b.ref_avg }} {{ b.result }} {{ b.limit }} {{ b.verdict }}
智能生成检测报告
报告模板: 有组织废气: 智能生成前请先选择模板 ● 在线编辑:WPS WebOffice{{ onlyofficeAvailable ? '(OnlyOffice 兜底)' : '' }} ● 在线编辑:OnlyOffice
第一步:选择任务(采样完成即可提前编制,签发前都可编辑) 🔄 刷新
任务号 受检单位 项目 采样记录 实验记录 数据检查 操作
{{ t.task_no }}
报告状态:{{ t.report_status }}
{{ t.company_name }} {{ t.project_name }} — 送样免采样 {{ sideStatus(t.received_sampling_at, t.sampling_records_submitted_at).t }} {{ sideStatus(t.received_lab_at, t.lab_records_submitted_at).t }} ⚠ {{ t.data_quality.warnings.join(';') }} ✓ 无异常 🤖 智能生成 质控报告 ⬇ 下载 🗑 删除报告文件
暂无采样已完成的任务
🤖 智能生成 {{ smartGen.task_no }} 进行中… 失败 已预填,待核对
{{ log }}
✅ 数据已预填到下方「第二步:核对数据」,可手工调整;确认无误后点击底部「一键生成报告」输出 Word。
不在列表的历史任务: 拉取数据(人工核对模式)
第二步:核对数据(可编辑)
已从数据库拉取数据,请核对以下内容是否正确,可直接修改。
{{ reportDbStats.sampleCount }}
样品数
{{ reportDbStats.itemCount }}
检测项目
{{ reportDbStats.ndCount }}
未检出 (ND)
{{ reportDbStats.wastewaterCount }}
废水数据
{{ reportDbStats.gasCount }}
废气数据
封面信息
检测概况
气象参数
检测内容
样品类型采样点位检测项目样品状态
删
+ 添加行
{{ wt.title || '废水检测结果 ' + (wi+1) }}
采样点位检测项目单位检测结果标准限值
删
+ 添加行
有组织废气检测结果{{ reportData.organized_gas.length > 1 ? ' ' + (ogi+1) : '' }}
采样点位检测项目标干流量实测浓度排放速率标准限值最高允许排放速率
删
+ 添加行
锅炉废气检测结果
采样点位检测项目标干流量实测浓度折算浓度排放速率标准限值
删
+ 添加行
无组织废气检测结果
检测项目参照点1#监控点2#监控点3#监控点4#标准限值
删
+ 添加行
厂区内无组织废气
采样点位检测项目检测结果标准限值
删
+ 添加行
噪声检测结果
采样点位主要声源昼间结果夜间结果昼间标准夜间标准
删
+ 添加行
附表1:检测方法、分析仪器、检出限
样品类型检测项目检测方法分析仪器检出限
删
+ 添加行
上一步 🔄 重新拉取数据(AI 刷新)
报告模板:
{{ generating ? '生成中...' : '📄 一键生成报告' }}

✅

报告生成成功!

{{ resultFilename }}

下载报告 生成新报告
📈 业务数据 🏭 生产数据 💰 财务数据 👥 人力资源 🧮 产值统计 💬 智能问数
¥{{ formatMoney(b.balance) }}
{{ b.bank }}
¥{{ formatMoney(ceoZoom.aging.b0_30) }}
账龄 30 天内
¥{{ formatMoney(ceoZoom.aging.b31_60) }}
账龄 31-60 天
¥{{ formatMoney(ceoZoom.aging.b61_90) }}
账龄 61-90 天
¥{{ formatMoney(ceoZoom.aging.b90_plus) }}
账龄 90 天以上
¥{{ formatMoney(ceoZoom.broker.amount) }}
{{ ceoZoom.broker.label }}
占签约额 {{ (ceoZoom.broker.ratio * 100).toFixed(1) }}% · 居间费是检测行业主要成本,建议控制在签约额的合理比例内
暂无数据
📈 业务维度 · CEO 决策看板 刷新 按月 按季度 按年
详情
¥{{ formatMoney(bizDash.overview.signed_net) }}
{{ bizDash.period_label }}签约额(实收)
详情
{{ bizDash.overview.signed_count }}
{{ bizDash.period_label }}签约合同数
详情
¥{{ formatMoney(bizDash.overview.avg_amount) }}
平均单合同金额
详情
{{ bizDash.overview.new_clients }}
{{ bizDash.period_label }}新增客户
首签落在本期间
详情
{{ bizDash.overview.active_clients }}
{{ bizDash.period_label }}活跃客户
期间内有签约
📊 {{ bizDash.window_label }}签约趋势(签约额 + 合同数)
详情
🥧 {{ bizDash.period_label }}业务结构(按合同类型·金额)
详情
🏆 TOP10 客户({{ bizDash.period_label }}签约额) TOP1 集中度 {{ bizDash.customers.top1_ratio }}%
详情
👥 新客 / 老客签约金额({{ bizDash.period_label }})
详情
🧑‍💼 客户经理业绩榜(按{{ bizDash.period_label }}签约额排序)
详情
⚠️ 任务风险(实时)
详情
{{ bizDash.risk.open_tasks }}
进行中采样任务
待排期+待采样+采样中
详情
{{ bizDash.risk.urgent_open }}
加急未完成任务
priority=加急
🏭 生产数据 刷新 (数据尚未接入,以下为占位)
—
本月采样任务
—
完成率
—
超期率
—
样品总数
—
检测条目
👷 采样员工作量排行
ECharts 横向柱状图占位
🧪 样品类型分布
ECharts 饼图占位(废水/有组织/无组织/噪声/土壤)
📅 日任务完成趋势(近30天)
ECharts 折线图占位
💰 财务维度 · CEO 决策看板 刷新 按月 按季度 按年
详情
¥{{ formatMoney(ceoDash.overview.signed_month) }}
{{ ceoDash.period_label }}签约额(实收)
详情
¥{{ formatMoney(ceoDash.overview.income_month) }}
{{ ceoDash.period_label }}回款(流水收入)
详情
¥{{ formatMoney(ceoDash.overview.expense_month) }}
{{ ceoDash.period_label }}支出(流水支出)
详情
{{ ceoDash.overview.net_flow_month >= 0 ? '+' : '-' }}¥{{ formatMoney(Math.abs(ceoDash.overview.net_flow_month)) }}
{{ ceoDash.period_label }}净现金流
详情
¥{{ formatMoney(ceoDash.overview.total_balance) }}
账户总余额
{{ b.bank }} ¥{{ formatMoney(b.balance) }}
详情
¥{{ formatMoney(ceoDash.overview.receivable_total) }}
应收账款总额
详情
¥{{ formatMoney(ceoDash.overview.invoiced_total) }}
已开票总额
详情
¥{{ formatMoney(ceoDash.overview.invoiced_unpaid) }}
已开票未收款
详情
¥{{ formatMoney(ceoDash.overview.received_uninvoiced) }}
已收款未开票
{{ ceoDashLoading ? '驾驶舱数据加载中...' : '暂无驾驶舱数据' }}
📈 {{ ceoDash.window_label }} 签约 / 回款 / 支出
详情
💧 账户余额走势(月末)
详情
⚠️ 付款压力:待支付 vs 账户余额
详情
付款申请待付¥{{ formatMoney(ceoDash.risk.payment_pressure.requests) }}
应付款台账待付¥{{ formatMoney(ceoDash.risk.payment_pressure.payables) }}
待支付合计¥{{ formatMoney(ceoDash.risk.payment_pressure.total) }}
账户总余额¥{{ formatMoney(ceoDash.risk.payment_pressure.balance) }}
支付后预计结余¥{{ formatMoney(ceoDash.risk.payment_pressure.gap) }}
资金缺口预警:余额不足以覆盖待支付,请优先催收应收
🏆 Top10 欠款客户(按未收金额)
详情
合同编号客户客户经理笔数欠款金额
{{ d.contract_no }} {{ d.client }} {{ nameOnly(d.account_manager) || '-' }} {{ d.plans }} ¥{{ formatMoney(d.owed) }}
暂无欠款客户
🍰 {{ ceoDash.period_label }}支出结构(按已付金额)
详情
详情
¥{{ formatMoney(ceoDash.cost.broker_month) }}
{{ ceoDash.period_label }}居间费支出
占{{ ceoDash.period_label }}签约额 {{ (ceoDash.cost.broker_ratio * 100).toFixed(1) }}%
居间费是检测行业主要成本,建议控制在签约额的合理比例内
📊 {{ ceoDash.window_label }}成本趋势 · 按财务科目(前 5 大科目 + 其他)
详情
🍰 {{ ceoDash.period_label }}成本占比 · 按一级科目
详情
🧾 {{ ceoDash.period_label }}科目成本明细详情 (流水支出合计 ¥{{ formatMoney(ceoDash.cost.by_account.total) }})
📌 应收账款的判定规则与流程 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.client }} {{ r.testee_unit || '-' }} {{ r.seq }} {{ r.plan_month || '-' }} ¥{{ formatMoney(r.amount) }} {{ r.reason }} {{ r.aging_since || '-' }} {{ r.aging_days }} {{ nameOnly(r.account_manager) || '-' }}
{{ receivableLoading ? '加载中...' : '暂无应收账款' }}
👥 人力资源 · 人工成本分析 刷新 按月 按季度 按年
¥{{ formatMoney(hrDash.latest.total) }}
{{ hrDash.period_label || hrDash.latest.month }} 人工成本(应发)
{{ hrDash.latest.headcount }}
{{ hrGranularity==='month' ? '发薪人数' : '月均发薪人数' }}
¥{{ formatMoney(hrDash.latest.per_capita) }}
人均工资(月均)
{{ hrDash.latest.cost_rate == null ? '—' : (hrDash.latest.cost_rate * 100).toFixed(1) + '%' }}
人工成本率
¥{{ formatMoney(hrDash.trend.reduce((a, t) => a + t.total, 0)) }}
{{ hrDash.trend.length ? hrDash.trend[0].month + ' 起累计人工成本' : '累计人工成本' }}
{{ hrDashLoading ? '人力资源数据加载中...' : (hrDash && !hrDash.latest ? '该期间暂无薪酬数据' : '暂无薪酬数据(请先运行历史灌库脚本导入工资表)') }}
📈 人工成本趋势与人工成本率
🥧 {{ hrDash.period_label || hrDash.latest.month }} 工资结构(基本/绩效/补贴)
🏢 {{ hrDash.period_label || hrDash.latest.month }} 部门人工成本分布
📊 部门 × 月份 人工成本对比
🧮 产值统计 · 报告清单回填合同金额 上传《报告完成清单》xlsx,系统按任务号匹配合同,回填「合同金额 / 实收金额」后输出新文件
📤 上传清单并回填 明细表回填到 N/O 列;「合同编号产值汇总」表在合同金额列右侧增加实收金额列。实收金额为理论值口径(签约金额 − 居间费 − 分包费,以最新已通过审批为准),与未收款合同列表一致。
📊 匹配结果(文件已自动下载)
{{ pvStats.task_matched }} / {{ pvStats.task_rows }}
明细行匹配(含总表/各月)
{{ pvStats.summary_matched }} / {{ pvStats.summary_rows }}
汇总表合同匹配
{{ pvStats.task_unmatched.length }}
未匹配合同号(明细,去重前100)
{{ pvStats.summary_unmatched.length }}
未匹配合同号(汇总)
未匹配合同号(系统合同库中不存在,需补录合同):{{ pvStats.summary_unmatched.join('、') }}
📋 任务单产值(完成采样即算) 检测费基数×当次工作量/全年总工作量 + 采样费/N + 报告费/N;平台上传费单列,不进采样室产值;采样提成按《采样室绩效方案》提成标准逐已采点位计算(单列,不计入产值)
查询 重算
{{ pvTvNote }}
¥{{ formatMoney(pvTvSummary.total_value) }}
采样室产值合计
¥{{ formatMoney(pvTvSummary.detection_value) }}
其中·检测费产值
¥{{ formatMoney(pvTvSummary.sampling_share) }}
其中·采样费分摊
¥{{ formatMoney(pvTvSummary.report_share) }}
其中·报告费分摊
¥{{ formatMoney(pvTvSummary.platform_share) }}
平台上传费(单列)
¥{{ formatMoney(pvTvSummary.commission) }}
采样提成(单列)
{{ pvTvSummary.no_quote_count }} / {{ pvTvTotal }}
无报价单 / 总场次
💬 智能问数 用自然语言查询公司经营与业务数据,支持多轮追问(如:那7月呢?) 清空会话
💬
你好,我是经营数据助手
用自然语言查询公司经营与业务数据,例如:今年已签约合同总金额是多少?
{{ q }}
发送
📏 执行标准查询 查询 新增标准 共 {{ kbStandards.length }} 条
📊 标准限值查询 执行标准 {{ kbLimStandards.length }} 份 标准限值 {{ kbLimTotalRows.toLocaleString() }} 条
查询 清空
常用: {{ s }}
共 {{ kbLimResults.length }} 条结果 (已达上限 2000 条,请收窄条件) · 标准 {{ kbLimFilter.standard }} · 项目 {{ kbLimFilter.test_item }}
🔍
请选择标准号或输入检测项目开始查询
数据库共 {{ kbLimTotalRows.toLocaleString() }} 条限值记录,覆盖国标、行标、广东地标
🎓 CMA 资质查询 资质 {{ (kbCmaStats.total || 0).toLocaleString() }} 条 检测项目 {{ kbCmaStats.unique_items || 0 }} 项 标准方法 {{ kbCmaStats.unique_standards || 0 }} 份 数据源:资质附表汇总(报告专用)变更.xlsx(1113+59 项)
查询 清空
领域/类别级联筛选;标「变更」的限制范围表示资质变更中
共 {{ kbCmaTotal.toLocaleString() }} 条资质 (仅显示前 {{ kbCmaResults.length }} 条,请收窄条件)
📋 记录表查询 查询 清空
输入检测项目(如 pH值、非甲烷总烃)查询对应的原始记录表
未找到完全匹配的项目,你可能想查: {{ it }}
🔍
未查询到对应的原始记录表,请调整检测项目或样品类型后重试
🧭 采样室 · 现场记录表({{ kbRtSampling.length }})
🧪 实验室 · 分析原始记录表({{ kbRtLab.length }})
💰 指导价查询 指导价 {{ (kbGpStats.total || 0).toLocaleString() }} 条 产品类别 {{ kbGpStats.categories || 0 }} 类 检测项目 {{ kbGpStats.unique_items || 0 }} 项 数据源:{{ kbGpSource || '广东省环境监测行业指导价(2021年修订稿)' }}
查询 清空
共 {{ kbGpTotal.toLocaleString() }} 条指导价 (仅显示前 {{ kbGpResults.length }} 条,请收窄条件)
📌 附加说明(计价口径)
{{ i + 1 }}. {{ n }}
🤖 基于企业知识库的AI问答
· AI 仅基于知识库已入库文件回答,不使用训练数据或常识补充
· 未收录的内容会如实告知"知识库无相关资料"
· 支持文档格式:Word / PDF / Excel / TXT / Markdown(图片类文件无法进入检索)
💬
输入问题开始对话。例如:
"颗粒物采样的空白样规则是什么?"
"HJ836 对无组织废气监测有什么要求?"
{{ m.role==='user' ? '我' : (m.model_name || 'AI') }}
{{ m.content }}
📎 参考资料: {{ s.category }} · {{ s.title }}
AI 正在检索并思考...
发送 清空
📋 企业 SOP(标准操作流程)
· 以下流程基于本系统的实际功能整理,每条 SOP 对应一个可在系统里执行的闭环动作。
· 同事入职 / 角色转换时,按所在部门对应的 SOP 列表通读一遍即可上手。
· 流程有调整时,先在系统里做改动,本页 SOP 同步更新。
分类筛选: {{ cat }}
📌 适用场景:{{ s.scenario }}
🎯 操作步骤:
  1. {{ step }}
🔗 系统入口:{{ s.entry }}
✅ 完成标志:{{ s.done }}
💡 {{ s.tip }}
没有匹配的 SOP
{{ kbStats.total || 0 }}
文件总数
{{ kbFormatSize(kbStats.total_size) }}
总大小
{{ kbCategoryList.length }}
分类数
{{ kbLatestTime || '—' }}
最近上传
{{ kbCategory || '全部文件' }} 搜索 + 上传文件
📂
该分类下暂无文件,点击右上角「上传文件」上传
选择文件
📄 {{ kbUploadForm.file.name }} · {{ kbFormatSize(kbUploadForm.file.size) }}
▣ 采样室看板 刷新 任务进度 · 人员工作量 · 资源预警 · 采样统计 → 任务派发 → 仪器台账 → 车辆管理
📋 任务总数
{{ samplingBoard.taskStats.total || 0 }}
🚀 进行中
{{ (samplingBoard.taskStats['待采样']||0) + (samplingBoard.taskStats['采样中']||0) + (samplingBoard.taskStats['部分完成']||0) }}
待采样 {{ samplingBoard.taskStats['待采样']||0 }} · 采样中 {{ samplingBoard.taskStats['采样中']||0 }} · 部分完成 {{ samplingBoard.taskStats['部分完成']||0 }}
✅ 已完成
{{ samplingBoard.taskStats['已完成'] || 0 }}
⚠️ 异常任务
{{ samplingBoard.taskStats['异常'] || 0 }}
📅 今日任务
{{ samplingBoard.taskStats.today_completed || 0 }} / {{ samplingBoard.taskStats.today_count || 0 }}
已完成 / 总数
⏰ 超期未完成
{{ samplingBoard.taskStats.overdue_count || 0 }}
本月任务
{{ samplingBoard.summary.total_tasks || 0 }}
完成率
{{ samplingBoard.summary.completion_rate || 0 }}%
及时率
{{ samplingBoard.summary.on_time_rate || 0 }}%
点位数
{{ samplingBoard.summary.total_points || 0 }}
样品数
{{ samplingBoard.summary.total_samples || 0 }}
出车次数 / 出勤天数
{{ samplingBoard.summary.vehicle_trips || 0 }} / {{ samplingBoard.summary.field_days || 0 }}
🔬 仪器资源
总数 {{ samplingBoard.instStats.total || 0 }} 在用 {{ samplingBoard.instStats.in_use || 0 }} 出库中 {{ samplingBoard.instStats.checked_out || 0 }} 30天内到期 {{ samplingBoard.instStats.expiring_30 || 0 }} 已超期 {{ samplingBoard.instStats.overdue || 0 }}
🚗 车辆资源
总数 {{ samplingBoard.vehicleStats.total || 0 }} 在用 {{ samplingBoard.vehicleStats.in_use || 0 }} 维修/保养 {{ (samplingBoard.vehicleStats.repair||0) + (samplingBoard.vehicleStats.maintenance||0) }} 年检临期 {{ samplingBoard.vehicleStats.inspection_soon || 0 }} 保险临期 {{ samplingBoard.vehicleStats.insurance_soon || 0 }}
无车辆管理权限,暂不显示
👤 人员工作量(本月,按完成数排序)
名次 姓名 任务 完成 点位 样品 完成率 及时率
{{ i+1 }} {{ p.name }} {{ p.total_tasks }} {{ p.completed }} {{ p.points }} {{ p.samples }} {{ p.completion_rate }}% {{ p.on_time_rate }}%
本月暂无人员工作量数据
完整周期/自定义筛选见下方「采样统计」
👥 小组工作量(本月)
小组 任务 完成 完成率
{{ g.group }} {{ g.total_tasks }} {{ g.completed }} {{ g.completion_rate }}%
本月暂无小组数据
📊 采样统计
周期: 今日 本周 本月 本季度 本年 自定义 导出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_code }} {{ inst.instrument_name }} {{ inst.model || '—' }} {{ inst.category_group || '—' }} {{ inst.category || '—' }} {{ inst.calibration_due || '—' }} {{ inst.check_agency || '—' }} {{ inst.status || '—' }} {{ inst.location || '—' }} 领用 归还 报修 编辑
暂无仪器数据
提前天数: 刷新 已超期 {{ overdueList.length }} 台
❗ 已超期
编号名称有效期至超期天数保管人
{{ inst.instrument_code }} {{ inst.instrument_name }} {{ inst.calibration_due }} {{ -inst.days_until_due }} {{ inst.custodian }} {{ inst.custodian_phone }}
⚠ 即将到期({{ expiringDays }}天内)
编号名称有效期至剩余天数保管人
{{ inst.instrument_code }} {{ 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 }} 个检验机构
当前窗口无待送检仪器
🏢 {{ g.agency }} 过期 {{ g.overdue }} 未来 {{ g.upcoming }} 合计 {{ g.total }} 台 导出清单
编号 名称 型号 类别 检定日期 剩余天 存放 保管人
{{ inst.instrument_code }} {{ inst.instrument_name }} {{ inst.model || '—' }} {{ inst.calibration_type || '—' }} {{ inst.calibration_due }} {{ inst.is_overdue ? ('过期 ' + (-inst.days_until_due)) : inst.days_until_due }} {{ inst.location || '—' }} {{ inst.custodian || '—' }}
刷新
仪器故障报修人维修方状态操作
{{ r.instrument_code }} {{ r.instrument_name }} {{ r.fault_type }}:{{ r.fault_description }} {{ r.reported_by }} {{ r.repair_vendor || '—' }} {{ r.status }} 开始维修 维修完成 验收
暂无维修记录
使用日期: ~
刷新
可用 {{ checkoutAvailable.length }} 台 / 已出库 {{ checkoutList.reduce((s,c)=>s+c.instrument_count,0) }} 台
📦 可用仪器(多选后出库)
{{ cat.name }}
总{{ cat.items.length }}台 已出库{{ cat.items.filter(i=>i.is_checked_out).length }}台 当前选择{{ checkoutSelectedIds.filter(id=>cat.items.find(i=>i.id===id)).length }}台
暂无可用仪器
← 返回类别
{{ item.instrument_code }} {{ item.instrument_name }} {{ item.model }} 已被 {{ item.current_holder }} 出库
出库({{ checkoutSelectedIds.length }}台)
📋 出库单列表
{{ ck.checkout_no }} {{ ck.status }}
日期:{{ ck.checkout_date }} ~ {{ ck.checkout_date_end }}
小组长:{{ ck.group_leader_name }}({{ ck.group_leader_phone }})
仪器数:{{ ck.instrument_count }} 台
{{ it.instrument_code }}
详情
📐 {{ ck.status==='出库中' ? '录入' : '补录' }}流量校准 归还 已归还 {{ ck.returned_at ? ck.returned_at.slice(0,16) : '' }} 校准补录剩 {{ ck.calib_window_days_left }} 天 校准补录已超期(仍可补录) 仅小组长可操作
暂无出库记录
出库单:{{ retDlg.checkoutNo }} 勾选本次要归还的仪器(默认全选;只还部分时,剩余仪器仍属本出库单,已归还的即刻可被其他小组领用)
{{ item.instrument_code }} {{ item.instrument_name }}({{ item.model }})
单号:{{ checkoutDetail.checkout_no }}
状态:{{ checkoutDetail.status }}
日期:{{ checkoutDetail.checkout_date }} ~ {{ checkoutDetail.checkout_date_end }}
小组长:{{ checkoutDetail.group_leader_name }}({{ checkoutDetail.group_leader_phone }})
仪器清单({{ checkoutDetail.instrument_count }} 台):
{{ it.instrument_code }} {{ it.instrument_name }}
日期: ~ 查询 共 {{ ckrTotal }} 条
LDG-XS-006 LDG-XS-006-1
提示:每件仪器 4 通道(Ⅰ/Ⅱ/Ⅲ/Ⅳ) × 采样前 / 采样后 = 8 列读数。无对应通道留空即可。
仪器 参数 采样前校准 采样后校准 备注
通道Ⅰ通道Ⅱ通道Ⅲ通道Ⅳ 通道Ⅰ通道Ⅱ通道Ⅲ通道Ⅳ
无仪器待校准
✍ 小组长签名 签名将自动嵌入《流量校准记录表》docx 清除
✓ 已有保存过的签名
{{ calibForm.signer_name || '—' }}{{ calibForm.signed_at ? ' · ' + calibForm.signed_at : '' }}
如需重新签,左侧画板写完即可覆盖
👥 采样小组管理 每组 = 组长 + 组员 + 车辆 + 固定仪器,按时间生效 共 {{ groupsList.length }} 组 + 新增小组 🔄 刷新
第{{ g.group_no }}组 {{ g.group_name }} 生效:{{ g.effective_from }} 编辑
组长
{{ g.leader_name || g.leader_phone }} {{ g.leader_phone }}
组员({{ (g.members||[]).length }})
{{ m.name || m.phone }} 未分配
车辆
🚗 {{ g.vehicle_plate }} 未分配
固定仪器({{ (g.instruments||[]).length }})
{{ it.instrument_code }} {{ it.instrument_name }}
无固定仪器
暂无小组,点击右上角"+ 新增小组"添加
在用 历史
跟着小组走,不需要每次出库借还。共享不占用类(如流量校准器)不要勾这里。
{{ vehicleStats.total || 0 }}
车辆总数
{{ vehicleStats.in_use || 0 }}
在用
{{ vehicleStats.repair || 0 }}
维修中
{{ vehicleStats.maintenance || 0 }}
保养中
{{ vehicleStats.inspection_soon || 0 }}
年检30天内到期
{{ vehicleStats.insurance_soon || 0 }}
保险30天内到期
搜索 + 新增车辆
📋 任务单产值及采样提成(完成采样即算) 检测费基数×当次工作量/全年总工作量 + 采样费/N + 报告费/N;平台上传费单列,不进采样室产值;采样提成按《采样室绩效方案》提成标准逐已采点位计算(单列,不计入产值)
查询
{{ pvTvNote }}
¥{{ formatMoney(pvTvSummary.total_value) }}
采样室产值合计
¥{{ formatMoney(pvTvSummary.detection_value) }}
其中·检测费产值
¥{{ formatMoney(pvTvSummary.sampling_share) }}
其中·采样费分摊
¥{{ formatMoney(pvTvSummary.report_share) }}
其中·报告费分摊
¥{{ formatMoney(pvTvSummary.platform_share) }}
平台上传费(单列)
¥{{ formatMoney(pvTvSummary.commission) }}
采样提成(单列)
{{ pvTvSummary.no_quote_count }} / {{ pvTvTotal }}
无报价单 / 总场次
① 任务 📋 选择派单任务 载入任务数据 载入后核对点位、确认样品编号即可生成表格
点击「载入」直接载入任务 刷新
暂无派给您的任务单
任务编号 受检单位 计划日期 状态 角色 操作
{{ t.task_no }} {{ t.company_name }} {{ t.plan_date || '—' }} {{ t.status }} 组长 采样员 载入
② 任务信息:{{ samplingTaskData.task_number }} 💾 更新并保存 ✕ 切换任务 ↩ 返回工作台
受检单位:{{ samplingTaskData.inspected_unit || samplingTaskData.company || '—' }} 计划日期:{{ samplingTaskData.sampling_date || '—' }} 点位数:{{ (samplingTaskData.points || []).length }} 样品数:{{ samplingSampleTotal }} 编号已固化 编号未固化
基本信息
监测点位({{ samplingTaskData.points ? samplingTaskData.points.length : 0 }} 个)
点位序号样品类型监测点位检测项目执行标准点位数天数频次
{{ samplingPointIndexes[i] }} 拆分 删
+ 添加点位
解析出 {{ splitStdDlg.standards.length }} 个标准: {{ s.label }}
{{ a.name }} {{ s.label }}(库中也有) 不用标准
没有可归组的检测项目
样品编号预览(共 {{ samplingPreview.reduce((s,sr)=>s+(sr.sample_ids?sr.sample_ids.length:0),0) }} 个编号,{{ samplingPreviewGrouped.length }} 个点位) 🧹 更新监测点位 📄 上传样品交接表识别 🖼️ 上传图片AI识别 🔄 刷新编号预览
({{ gi + 1 }}) {{ grp.point_name }} ({{ grp.sample_type }}) {{ grp.total_item_count }} 个检测项目 :{{ grp.regular_sample_count }} 个常规样、{{ grp.qc_sample_count }} 个质控样 🗑 删除所选({{ (mergeSel[grp._key] || []).length }}) ⇄ 合并所选({{ (mergeSel[grp._key] || []).length }}) 💾 保存当前点位修改 ↻ 重排编号 ⇅ 重排检测项目 + 新增项目
点位 检测天数 检测频次
{{ it.test_items }} {{ grp.category_code === 'FQ' ? '仪器直读' : '现场测量' }} {{ it.qc_type === 'parallel' ? '平行样' : (it.qc_type === 'breakthrough' ? '穿透样' : (it.qc_type === 'transport_blank' ? '运输空白' : '空白样')) }} ({{ it.sample_ids.length }}) 添加 拆分 +质控 编辑
{{ row.sub_point_name }} 第{{ row.day }}天 频次{{ row.freq }}
{{ qr.sub_point_name || '—' }} 质控样 —
🛠 质控样人工调整 系统自动生成的质控样有偏差时可在此手动增减;调整后必须点"💾 保存调整"才生效 + 增加质控样 💾 保存调整
暂无质控样
{{ qc.qc_type === 'parallel' ? '平行' : qc.qc_type === 'breakthrough' ? '穿透' : qc.qc_type === 'transport_blank' ? '运输' : '空白' }} {{ qc.sample_id }} {{ qc.test_items }} ×
⚠ 已有人工调整未保存,点"💾 保存调整"后调整结果才会写入数据库
质控类型 空白(K) 平行(A) 穿透(C)
挂载到
{{ (addQcHostOptions.find(o => o.idx === addQcForm.host_idx) || {}).label }}
样品编号
系统自动算下一个可用编号;如果不满意可以手动改成你想要的
已自动预填(按该行最后一个编号顺延;空行则参考同点位编号族,同点位没有时按点位序号推导本点位编号族,取最小空号填断号),可手动改成你想要的
{{ s.sub }}{{ s.sid }}
各子点位分别顺延一个编号;要调整可在添加后双击编号改名
{{ editItemDialog.nameError }}
下拉列出任务单里本点位原有但预览中还没有的检测项目,可一次多选;点位没有的新项目直接输入名称后回车创建。新增后按本点位的检测天数×频次自动生成样品编号(顺延现有编号族、自动填断号);水温/pH/烟气直读类项目自动识别为现场测量/仪器直读(不占编号)。有子点位的点位会给每个子点位各加一列。
改名只改项目名称,样品编号不动;有子点位时所有子点位的同名项目会一起改。删除整列会连带删掉该列所有编号。
识别方式:{{ handoverDlg.parser === 'image_ai' ? '图片 AI 识别' : '文件解析' }} · 共 {{ handoverDlg.rows.length }} 行。请核对/修正样品编号(点位名称可下拉选择;先手工选几行作为线索,再点「智能填充点位名称」按编号规则+线索外推剩余行)。
确认后编号预览以交接表为最终版整体重建:预览现有编号全部清空,按交接表逐行落位(对不上的追加新行,重复导入不叠加)。核对预览无误后点「✅ 确认并生成样品编号」才正式入库。
+ 添加行 智能填充点位名称
📌 样品编号 {{ samplesConfirmed ? '✓ 已确认 ('+ samplesConfirmedCount +' 个) · 按点位重算编号' : '✅ 确认并生成样品编号' }} 🏷 生成样品标签 已固化到数据库 · 现场录数/报告生成都用这一份 点确认后,样品编号写入数据库,后续模块(项目录数、报告生成)都用同一份 ↺ 恢复出厂
🏷 {{ sampleLabelDoc.name }} {{ formatMtime(sampleLabelDoc.mtime) }} 在线编辑 查看 下载 删除
④ 生成表格
{{ pregenerating ? '生成中...' : (workbenchDocs.length ? '🗂 生成缺失表格(补缺)' : '🗂 预生成全部表格') }} 只生成还没有的表格(必备表 + 全部原始记录表);已存在的一律跳过、不覆盖。编号变更后已有表格标「待同步」,打开/下载时自动原位刷新编号,不需要在这里重生成
已生成 客户已签字 / 待生成 等待客户签字 未填写 基本信息从当前任务自动带过来
💧 废水排口({{ surveyForm.wastewater_outlets.length }}) + 添加 从任务点位预填
💨 废气排口({{ surveyForm.exhaust_outlets.length }}) + 添加
✍ 采样员签字({{ currentUser.name }})
请在此区域签字
🗑 清除重签 ✓ 已保存
✍ 客户签字 本机直签 二维码
✓
客户已签字
{{ surveyState.client_signer }} · {{ surveyState.client_signed_at }}
客户在此签字
🗑 清除 ✓ 提交客户签字
客户用手机扫二维码签字
📋 复制链接 🔄 刷新
先点下面"保存调查 + 生成客户签字链接"
之后即可让客户当场签或扫码远程签
{{ surveyState.id ? '更新调查 + 重新签字' : '保存调查 + 生成客户签字链接' }} 📄 生成 LDG-XC-017 word 文档 先点左侧按钮保存调查后即可生成(未签字也可生成临时版,签字后再次点会覆盖) ⚠️ 客户未签字,将生成"未签字版"(客户签字后可重新点击覆盖)
⑤ 表格清单({{ workbenchDocs.length }} 张) 🔄 刷新清单 尚未生成表格 — 请先在 ③ 确认样品编号,再点 ④「🗂 预生成全部表格」
{{ workbenchDocStatus(wbView.row) }} 待同步 驳回原因:{{ wbView.row.reject_reason }} {{ wbView.row.audited_by_name }} · {{ wbView.row.audited_at }} ⬇ 下载
{{ wbView.imgError ? '图片加载失败,请点右上角「下载」查看' : '正在加载图片...' }}
{{ wbView.ooReady ? '该文件类型暂不支持在线预览' : '在线编辑器不可用(WPS/OnlyOffice 均未就绪)' }}
⬇ 下载查看
📷 现场采样照片 共 {{ samplingPhotos.length }} 张 · {{ samplingPhotosByPoint.length }} 个点位
{{ samplingPhotoAudit.audit_status === '已通过' ? '✓ 已通过' : samplingPhotoAudit.audit_status === '已驳回' ? '✕ 已驳回' : '未审核' }}
对现场采样照片进行审核:
✓ 通过 ✕ 驳回(要求修改)
驳回原因:{{ samplingPhotoAudit.reject_reason }}
⚠ 该任务尚无现场采样照片,请采样员在 APP 端按点位上传
📍 {{ grp.point }} ({{ grp.photos.length }} 张)
×
✕ 已驳回 — {{ samplingPhotoAudit.reject_reason }}
上传人:{{ samplingPhotoPreview.uploaded_by_name }} · {{ (samplingPhotoPreview.created_at || '').slice(0, 16) }}
返回上级 返回工作台
📋 提交纸质记录(上传移交照) ✓ 纸质已移交 {{ samplingTaskData.sampling_paper_handed_at }} 📤 提交全部记录{{ allRecordsAuditedHint }} ↩ 撤销提交 刷新编号预览 生成样品二维码 新建采样任务
💰 我的绩效 日 月 季 年 刷新 采样提成 · 按采样日期统计 · 分配确认后生效
💰 我的提成 ✏️ 待我分配({{ perfAllocFiltered.length }}) 🛠️ 分配管理 📈 产值
{{ perfSession.task.task_no }} · 第{{ perfSession.record ? perfSession.record.session_no : perfSession.session_no }}场 · {{ perfSession.task.company_name }} 采样日期:{{ perfSession.record ? perfSession.record.sampled_date : '—' }} 本场提成:¥{{ fmtAmt(perfSession.record ? perfSession.record.commission : 0) }}
✅ 计入提成的点位({{ perfSession.commission_detail.length }})
🚫 不计提成的点位({{ perfSession.excluded_points.length }})异常/未采点位不计算提成
📝 分配记录({{ perfSession.batches.length }} 轮)
尚未分配
第{{ b.round_no }}轮 {{ {pending:'待确认',confirmed:'已生效',final: b.is_legacy ? '历史均分' : '终审生效',rejected:'已驳回',superseded:'已失效(提成变动)'}[b.status] }} 分配人:{{ b.allocator_name }} · {{ b.created_at }} 驳回原因:{{ b.reject_by }}:{{ b.reject_reason }}
{{ a.member_name }} ¥{{ fmtAmt(a.amount) }} ✓ ✗ …
{{ perfAllocForm.task_no }} · 第{{ perfAllocForm.session_no }}场 · 第{{ perfAllocForm.round_no }}轮分配 终审轮:提交即生效,不可驳回
本场待分提成:¥{{ fmtAmt(perfAllocForm.total) }} 均分
合计:¥{{ fmtAmt(perfAllocSum) }} / 应为 ¥{{ fmtAmt(perfAllocForm.total) }} (差额 ¥{{ fmtAmt(Math.round((perfAllocForm.total - perfAllocSum) * 100) / 100) }}) ✓
你本人的份额提交后自动确认;其他成员需逐个确认,任何人驳回(必填原因)则整张回炉重分。
⚙ 管理员运维: 清空原来数据 计划月: 批量导入新单(选择文件夹) 批量导入新单(选多个文件) 批量导入历史单·已完成(选择文件夹) 批量导入历史单·已完成(选多个文件) ⚠ 仅支持 .docx {{ bulkImportProgress }}
共 {{ bulkDupDlg.rows.length }} 条重号(另有 {{ bulkDupDlg.newCount }} 条新单将正常导入) 全部覆盖并更新 全部跳过
{{ bulkDupDlg.failed.length }} 个文件未导入(非任务单或解析失败):{{ bulkDupDlg.failed.map(f => f.file).join('、') }}
覆盖并更新:只刷新任务单内容(单位/地址/联系人/点位/检测项目/计划月等),不动状态、排期、派单和执行数据,操作留痕。
{{ dispatchStats[label] || 0 }}
{{ label }}
查询 重置 全部接收 + 创建任务
‹ 上月 今天 下月 › 计划采样月份: {{ timelineMonthLabel }} 密度: ≤3 单 4-6 单 ≥7 单 {{ timelineFullscreen ? '退出全屏(F1/Esc)' : '全屏展示(F1)' }} 刷新
{{ w }}
{{ cell.day }} {{ cell.tasks.length }}单
{{ 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 }}
‹ 上月 本月 下月 › {{ supervisorMonthLabel }} 查询 重置
共 {{ supervisorRows.length }} 单(当前显示 {{ supervisorDisplayRows.length }}),{{ supervisorDirtyCount }} 个待保存 {{ supervisorFullscreen ? '退出全屏(F1/Esc)' : '全屏编辑(F1)' }} 📤 批量导出 📥 批量导入 批量保存({{ supervisorDirtyCount }})
任务编号{{ supervisorSortIcon('task_no') }}
全选 清除
无匹配项
{{ v }}
受检单位{{ supervisorSortIcon('company_name') }}
全选 清除
无匹配项
{{ v }}
地市{{ supervisorSortIcon('city') }}
全选 清除
无匹配项
{{ v }}
区/镇{{ supervisorSortIcon('district') }}
全选 清除
无匹配项
{{ v }}
受检地址{{ supervisorSortIcon('address') }}
全选 清除
无匹配项
{{ v }}
计划月{{ supervisorSortIcon('plan_month') }}
全选 清除
无匹配项
{{ v }}
优先级{{ supervisorSortIcon('priority') }}
全选 清除
无匹配项
{{ v }}
检测项目 采样日期{{ supervisorSortIcon('plan_date') }}
全选 清除
无匹配项
{{ v }}
小组长 采样员 备注 操作
{{ supervisorFilter.status ? '当前筛选下无任务' : '当月暂无任务' }}
{{ row.task_no }}
{{ row.status }}
加载中...
暂无历史任务单
合同:{{ (historyCache[row.contract_id]||{}).contract_no || '-' }} 受检单位:{{ row.company_name || '-' }} 共 {{ ((historyCache[row.contract_id]||{}).tasks||[]).length }} 份任务单
# 任务编号 计划月 采样日期 优先级 状态 采样员
{{ i+1 }} {{ t.task_no }} 当前 {{ t.plan_month || '-' }} {{ t.plan_date }} 未排期 {{ t.priority || '常规' }} {{ t.status }} {{ t.assigned_names }} 未分配
{{ row.company_name }} {{ row.city || '-' }} {{ row.district || '-' }} {{ row.address || '-' }} {{ row.priority || '常规' }}
暂无点位
# 检测类型 点位 检测项目 点位数 天数 频次
{{ i+1 }} {{ cnSampleType(p.sample_type || p.sample_type_code) }} {{ p.point_name || '—' }} {{ p.test_items || '—' }} {{ p.point_count || 1 }} {{ p.days || 1 }} {{ p.frequency || 1 }}
保存信息 {{ ['待派单','待采样','采样中','部分完成','已完成'].includes(row.status) ? '✓已确认' : '确认日期' }} {{ ['待采样','采样中','部分完成','已完成'].includes(row.status) ? '✓已派单' : '确认派单' }}
‹ 前一天 后一天 › 今天 计划采样日期: {{ dailyLabel }} 共 {{ dailyTasks.length }} 个任务 / {{ dailyGroupedByLeader.length }} 个小组 {{ schedulerFullscreen ? '退出全屏(F1/Esc)' : '全屏展示(F1)' }} 刷新
📅
当日暂无任务
👥 {{ grp.leader_name || '(未指定组长)' }}
{{ grp.tasks.length }} 单 · 组员: {{ grp.members.join('、') || '—' }}
{{ t.task_no }} {{ t.priority || '常规' }} {{ t.status }}
{{ t.company_name }}
📍 {{ t.address || '—' }}
🧪 {{ t.sample_types }} · {{ t.point_count }} 点位
👤 {{ t.assigned_names }}
样品编号 ✓ 📋 生成样品编号
需采样主管先接收任务
📋 现场调查记录表(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.status }} ⚠ 待处置异常 加急 {{ t.task_no }} {{ t.plan_date }}
{{ t.company_name }}
{{ t.sample_types }} · {{ t.point_count }}个点位 · {{ t.address }}
接收任务 等待派单完善 开始任务 等待现场开始 完成任务 现场记录
现在
现在
📸 拍小票对象: {{ c }}
📊 {{ 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 || '' }} 删除
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.gas_runs.length }} 张)
烟温 {{ s.parsed.smoke_temp ?? '-' }}℃ · 标干流量 {{ s.parsed.std_flow ?? '-' }} m³/h · 流速 {{ s.parsed.flow_velocity ?? '-' }} m/s
🧾 烟气第 {{ fieldSmokeRunSeq }} 次录数 / 共 {{ fieldSmokeRunTotal }} 次(连打小票)
🧾 连打小票待录入 {{ fieldSmokeRunQueue.length }} 张(保存当前条后自动填入下一张)
第 {{ q.seq || (qi + 2) }} 次 · 文件号 {{ q.file_no || '-' }} · {{ (q.start_time || '').slice(11) || '—' }} · O₂ {{ q.o2 ?? '-' }}% · NOx {{ q.nox_conc ?? '-' }} 填入此张
🔀 同小票分发:这张小票还有其他直读项目的数据,勾选后保存时一并各录一条(共用时段/仪器/文件号,因子各取各的)
{{ t.test_item }} {{ fieldSmokeSharePreview(t.test_item) || '(这张小票无该项因子)' }} 已录 {{ t.done }} 次
字段对应 XC-012 表数据列;烟尘工况区填「烟尘工况」时段,烟气区填「烟气」起/止,两区不串。
📸 拍仪器小票自动填 吸附管采样:大机/小机小票分开拍,各填各的字段
→ 烟温/含湿量/流速/标干流量 {{ fieldVocsBigMachineCode }}先勾选大机仪器
→ 采样流量/采样时间/采样体积/标况体积/打印条编号 {{ fieldVocsSmallMachineCode }}先勾选小机仪器
⏳ 识别中...
{{ 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.gas_runs.length }} 张)
环温 {{ 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₂NONO₂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 时按测点展开)
测点LeqLmaxLminL5L10L50L90L95
{{ np.point_name }}{{ np.leq ?? '-' }}{{ np.lmax ?? '-' }}{{ np.lmin ?? '-' }}{{ np.l5 ?? '-' }}{{ np.l10 ?? '-' }}{{ np.l50 ?? '-' }}{{ np.l90 ?? '-' }}{{ np.l95 ?? '-' }}
应用到本项目其他样品(共 {{ fieldItemReadingSiblingNos.length }} 个 · 共用同一条打印纸)
将给以下样品都创建一条相同录数:{{ fieldItemReadingSiblingNos.join('、') }}(采样开始/结束时间不复制,各样品单独填写)
该点位「{{ fieldItemReadingForm.test_item }}」的历史采样/检测/报告数据
该任务尚未绑定出库单,请先在「仪器管理」Tab 绑定本组出库单
{{ ins.instrument_code }} {{ ins.instrument_name }} {{ ins.model }}
勾选本点位实际采集项目对应的保存方式,同点位所有样品共用,无需逐样品录入。
容器:G=棕色玻璃瓶 · P=透明聚乙烯瓶 · Pz=棕色聚乙烯瓶 · 溶解氧瓶=棕色玻璃瓶 · 无菌袋=透明聚乙烯袋
{{ it }}
{{ g.note }}
把现场采集的所有样品送到实验室样品室,建议拍至少 1 张留底照片(与实验室交接画面 / 样品归置画面),然后点「确认交接」(未拍照也可交接,系统只提醒不拦截)。流转单会在实验室点「接收样品」时自动产出。
📷 拍照 / 上传 已留底 {{ fieldHandoverPhotos.length }} 张
请在 {{ fieldDispoData.deadline || '完成采样 3 天内' }} 前处置每个异常点位({{ fieldDispoRemainText(fieldDispoData.deadline) }});逾期将每天提醒主管处置,不自动改期。
✓ 没有待处置的异常点位
📍 {{ c.point_name }} 异常:{{ (fieldDispoData.pending[i]||{}).abnormal_reason || '未填写原因' }}
① 这个点位怎么处理?
改期(下次再采) — 本次没采到,安排以后补采;样品编号保留,不作废 永久取消(放弃) — 这个点位以后也不采了,直接作废;不影响同单的其他点位
② 补采安排到哪里?
本任务下次补采(子任务) — 在当前任务下挂一个子任务,过几天回这家单位单独补这个点 归并到后续任务 — 并到这家单位后面已排期的任务里一起采,省得单独跑一趟 新建递延任务 — 没有合适的后续任务可并时,新建一个延期任务来采
⚠ 无可归并的后续任务,请改选「本任务下次补采」或「新建递延任务」
整张任务都没法采时用(如:下雨、客户整体取消、现场不具备条件)。
整单内的所有点位会一起按你选的方式处理。
① 整张任务怎么处理?
整单改期(下次再采) — 这次先不采,整单挪到以后再采;样品编号可保留 整单取消(永久不采,作废) — 整张任务以后也不采了,直接作废
② 改期怎么安排?
保留本任务编号(只改采样时间) — 还是这个任务号,只是换个日期重新采 归并到后续任务编号 — 并到这家单位后面已排期的任务一起采
⚠ 无可归并的后续任务,请改选「保留本任务编号」
对应 LDG-XC-001 表头需手填项,整个任务的水样共用一份。任务单号 / 单位 / 采样日期 / 天气 / 仪器编号由系统自动带入,无需在此填写。

{{ t }}

瞬时水样混合水样

PHB-5其他

{{ m }}
※ 校准值相差大于 0.05 则需重新校准
请对每个点位勾选 ✓已采 或 ⚠未采。未采必须填写原因 + 详细说明。
{{ i+1 }}. {{ p.point_name || ('点位'+(i+1)) }}
{{ p.items || '' }}
✓ 已采 ⚠ 未采
清除
本小组名下未查到出库单,已列出当天全部出库中的单,请确认小组后再绑定:
选择本任务采样人员名下、日期包含任务日期的出库单:
{{ ck.checkout_no }}
小组长:{{ ck.group_leader_name || ck.group_leader_phone || '—' }} ・日期:{{ ck.checkout_date }} ~ {{ ck.checkout_date_end }}
仪器数:{{ ck.instrument_count }}台
{{ it.instrument_code }}
没有包含任务日期({{ fieldDetail.plan_date }})且「出库中」的出库单。
若确定已出库,请检查出库单的小组长和日期范围;或在「仪器台账-出入库管理」中创建对应日期范围的出库单。
✓ 仪器齐备({{ bindFit.satisfied }}/{{ bindFit.required_total }} 项)
缺 {{ bindFit.missing.length }} 项(已满足 {{ bindFit.satisfied }}/{{ bindFit.required_total }} 项) {{ bindFitExpanded ? '▲ 收起候选仪器' : '▼ 展开候选仪器(可勾选追加)' }}
追加到出库单:{{ fieldDisplayCheckout ? fieldDisplayCheckout.checkout_no : '' }}(追加后生成新出库单,原单视为归还;本组今天任务自动改绑新单)
{{ fieldAppendCk.expanded[cat.name] ? '▾' : '▸' }} {{ cat.name }} 总{{ cat.total }}台 已出库{{ cat.checkedOut }}台 已选{{ cat.selectedCount }}台
没有可追加的仪器
任务:{{ smartCk.taskNo }} 小组长:{{ smartCk.leaderName }}({{ smartCk.groupName }})
借出日期 归还日期 默认任务计划日期,可调整
已按小组固定仪器智能预选({{ smartCk.selected.length }} 台),可手工调整;已被其他小组出库的仪器不可选
{{ smartCk.expanded[cat.name] ? '▾' : '▸' }} {{ cat.name }} 总{{ cat.total }}台 已出库{{ cat.checkedOut }}台 已选{{ cat.selectedCount }}台
直接派发给采样员 先派发给组长分配
其他
样品类型 监测点位 检测项目 点数 天数 频次 执行标准
删
暂无点位
+ 添加点位
已上传文件:{{ taskOrderPreviewFilename }}
同合同任务单({{ siblingTasks.length }})
{{ siteMapDialog.error || '该任务暂无点位图' }}
任务编号:{{ quickDispatchTarget.task_no }}
受检单位:{{ quickDispatchTarget.company_name }}
地址:{{ quickDispatchTarget.address }}
计划日期:{{ planRangeText(quickDispatchTarget) }}
当前状态:{{ 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) }} 个样品的二维码
共 {{ samplingQrcodeResults.length }} 个样品二维码
{{ item.sample_id }}
🧭 智能排单中心 月度分析 · 智能预排 · 日级派单 · 任务地图
起始月份 分析月数 开始分析
{{ m.plan_month }} 完成 {{ m.done_rate }}%
任务 {{ m.task_count }} 单 · 点位 {{ m.point_count }} 个
预估工时 {{ m.est_hours }} h · 已完成 {{ m.done_count }} 单
预测新增:{{ m.predicted_new >= 0 ? m.predicted_new + ' 单' : '数据不足' }}
预排月份 每日容量 工时/日(留空=自动:小组数×6.5h,按可采样时段 9:00-12:00 / 14:00-17:30) 生成预排方案 📅 同步节假日
派单日期 生成派单方案 规则基线 + AI 增强:技能匹配 · 工作量均衡 · 休假避让 · 仪器车辆匹配
今天 本周 本月 下月 刷新 📍 批量补全坐标 当前 {{ smartSchedule.map.tasks.length }} 个任务点(仅显示已完成地理编码的任务) 灰=未派单 紫=已派单 蓝=采样中 绿=已完成 红闪=特急
刷新 📍 批量补全坐标 共 {{ smartSchedule.customerMap.tasks.length }} 个客户地址(按受检地址去重) 红色大头针=客户受检地址,悬停查看详情
📍 企业点位库 签订合同时自动归户建档;点位默认检测项目用于现场录数参照 合并客户 🔄 刷新
暂无点位库数据。签订合同(受检方为公司需填统一社会信用代码)后系统会自动归户建档。
🏭 {{ site.address || '(未填地址)' }} {{ site.status }} {{ (site.points || []).length }} 个点位 📷 {{ site.photo_count || 0 }} 改地址 停用 启用
该客户暂无厂区/点位
{{ pointLibPointDialog.point_code || '—' }}
暂无照片,可点击下方按钮上传
{{ ph.remark }}
{{ ph.uploaded_by }} {{ (ph.created_at||'').slice(0,10) }}
✕
📷 上传照片 采样员现场踩点照都可上传,长期有效
{{ pointLibSiteDialog.customer_name || '—' }} 合并后「被合并客户」的厂区、点位、合同全部并入「目标客户」,被合并客户标记为「已合并」。操作不可撤销,请确认两个客户为同一企业(别名/曾用名)。
📊 市场部仪表盘 数据范围:已签约合同(排除草稿/待签约) 合同总数 {{ 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) }}
合同健康待办
客户经理待跟进
客户历史经营(报价次数、签约、开票、回款)
📊 自然月累计实收金额(按签订日期)

总条数:{{ importMissingResult.total }}

更新条数:{{ importMissingResult.updated }}

跳过条数:{{ importMissingResult.skipped }}

失败条数:{{ importMissingResult.failed }}

🧾 开票申请 我的 / 协作合同流程 + 新增申请 刷新 开票申请必须关联合同,系统自动拦截超额开票(框架合同除外)和逾期未归档合同。
暂无开票申请
暂无草稿
合同编号类型委托方受检方状态 发起人发起时间操作
{{ d.contract_no }} {{ d.contract_type || '-' }} {{ d.client || '-' }} {{ d.testee_unit || '-' }} {{ d.status }} {{ d.reserved_by || '-' }} {{ (d.reserved_at || '').slice(0, 16) || '-' }} 继续编辑 重新生成 版本 发起审批 放弃
第一步:录入检测需求

📎

点击或拖拽上传检测需求文件

支持 Excel / Word / 图片(PNG/JPG)/ TXT

📎 已选择:{{ quotFile.name }}
📝 草稿编号
常规单(签订后正式号示例:LDG2503012) 年度单(签订后正式号示例:LDG24N124) 非检测业务合同
下一个草稿号: {{ nextContractNos.draft || '—' }} | 签订后正式合同号: 常规单 {{ nextContractNos.regular || '—' }} 年度单 {{ nextContractNos.annual || '—' }} 🔄 刷新
读取草稿 放弃此号码
· 进入"核对项目"步骤时系统自动领取下一个可用草稿号
· 报价/审批阶段使用草稿号(CG{年}{月}{4位流水}),签订合同时自动转为正式合同号
· 常规单:按月流水编号(非年度检测) · 年度单:按年流水 + 字母N(排污许可证年度检测)
返回工作台 下一步:AI 解析
第二步:AI 智能解析检测项目
🔍 {{ quotStreamMsg || '正在 OCR 识别图片...' }}
✓ OCR 识别完成
{{ quotOcrPreview }}
✨ {{ quotStreamMsg || 'AI 正在解析检测项目' }} ▊
{{ quotAiStream }}

✅

解析成功!共识别 {{ quotItems.length }} 项检测项目

上一步 网页核对编辑(降级) 下一步:在线编辑核实(推荐)
第三步:核对检测项目(共 {{ quotItems.length }} 项)
草稿编号:{{ quotContractNo }} ({{ quotContractType }}) 🔒 合同已归档 / 签订,报价只读不可修改
📋 报价单头部信息(写入 Excel)
检测类别
🟢 库内参数(加盖 CMA 标识) 共 {{ quotInnerItems.length }} 项
检测类型 点位名称 检测项目 点位数天数频次次/年单价 小计
暂无库内参数
指导价:{{ Number(quotItems[it._idx].guidance_total).toLocaleString() }}
未匹配:{{ quotItems[it._idx].guidance_missed.join('、') }},请人工核价
阶梯计价:{{ quotItems[it._idx].guidance_tiered.join('、') }},请人工核价
{{ (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].guidance_total).toLocaleString() }}
未匹配:{{ quotItems[it._idx].guidance_missed.join('、') }},请人工核价
阶梯计价:{{ quotItems[it._idx].guidance_tiered.join('、') }},请人工核价
{{ (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) }}
上一步 返回工作台
全部按指导价重算 保存草稿并返回 {{ quotReadOnly ? '🔒 只读模式' : (quotGenerating ? '生成中...' : '生成报价单 Excel') }}

✅

报价单生成成功!

共 {{ quotResult.item_count }} 项 · 总计 ¥ {{ quotResult.total.toLocaleString() }}

📥 下载 {{ quotResult.filename }} 📝 重新打开在线编辑 📝 发起审批
在线编辑保存后系统会自动回写,此处下载的即最新版(库外示例行可在在线编辑里自行保留或删除)。
新建报价单 返回工作台
非检测业务合同报价
录入合同基础信息和合同正文后,直接进入合同审批流程。
返回智能报价
非检测业务合同不需要填写检测方案、点位或采样计划;审批通过后按非检测业务合同继续归档、回款和开票管理。
编号规则
领取草稿号
{{ nonTestingQuoteForm.contract_no_mode === 'custom' ? '签订时手工填写并校验是否重复。' : `签订时自动获取下一个可用${nonTestingQuoteForm.testing_contract_type}检测业务合同编号。` }}
合同主体
履约与金额
至
签约金额 - 居间费 - 分包费,系统自动计算
经办信息
报价阶段可选填;发起审批时为必填项。
第 {{ index + 1 }} 期 ¥ {{ nonTestingPlanAmount(plan).toLocaleString() }} 删除
+ 添加一期 比例合计 {{ nonTestingPlanRatioSum }}%
上传合同正文
已上传:{{ nonTestingQuoteForm.contract_file_name }}
重置 {{ nonTestingQuoteForm.status === '待签约' ? '保存签订信息' : '保存草稿' }} 保存并签订合同 保存并发起审批
{{ approvalStats.pending || 0 }}
待审批
{{ approvalStats.approved || 0 }}
已通过
{{ approvalStats.rejected || 0 }}
已驳回
{{ approvalStats.total_pending_sign || 0 }}
待签约
{{ approvalStats.total_pending_archive || 0 }}
待归档
我发起的 待我审批 待签约 待归档 搜索 · 当前展示全公司数据 · 仅展示原/现客户经理或客服相关的合同 + 发起报价/签约审批发起合同变更审批合同变更审批
暂无数据
校验中…
{{ manualNoCheck.msg }}
· {{ r.label }}:{{ r.count }} 条({{ r.plans.join('、') }})(记录ID:{{ r.ids.join('、') }})
请到对应模块清理/解除以上引用后,编号即可自动释放复用
报价方式 智能报价 手工报价(Excel/图片)
合同类型 *
报价模版(Excel)* 选择文件 仅支持 .xlsx/.xls;上传后自动识别并回填表单空字段,提交时作为审批依据
{{ f.name }}
盖章版合同 选择文件 选传,支持 .pdf/.jpg/.jpeg/.png,可多选
{{ f.name }}
其他附件 选择文件 选传,不限格式,可多选
{{ f.name }}
请先输入合同编号,再上传附件
免费单(0元) 特殊申请免费做:金额按 0 处理、无需回款计划、视为已结清;报告 / 交付 / 签收等履约流程照常走。
框架合同 金额 / 采样频次不固定,先生产再对账再回款。开票前需先对账确定实际金额。
审批方式 或签 · 任一人通过 并行会签 · 全部通过 逐级会签 · 按序逐个审
{{ 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 }})
🧾 发票计划
期数 开票截止日期(此日前须开) 开票金额(元)
第 {{ 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 || '-' }}
框架合同: 是 否
查看合同正文
手工报价文件({{ approvalManualQuoteAttachments.length }})
📄 {{ a.filename }} ({{ (a.size / 1024).toFixed(1) }} KB) {{ a.uploaded_at }} 在线预览 下载
检测项目({{ 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 }}
跳过识别,手工录入 {{ contractAnalyzing ? 'AI 识别中...' : '下一步:AI 识别' }}
{{ 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 }}
暂无点位,点击下方"添加点位"
每次采样检测项目配置 每个点位独立增减采样次数(右侧 + / − 按钮);"雨水"属送样检测,不在此处配置
请先在上方添加点位
{{ contractApprovalStatus==='pending' ? '⏳' : (contractApprovalStatus==='rejected' ? '⛔' : '⚠') }} {{ contractApprovalStatus==='pending' ? '待审批' : contractApprovalStatus==='rejected' ? '审批已驳回' : '尚未发起审批' }}: {{ contractApprovalStatus==='pending' ? '审批通过后才能"签订合同"或"一键生成任务单"。' : contractApprovalStatus==='rejected' ? '请前往"合同审批"页查看驳回原因,修改后重新发起审批。' : '该合同尚未发起审批,请先前往"合同审批"页发起审批并通过。' }}
取消
{{ contractSaving ? '保存中...' : '保存合同信息' }} {{ contractApprovalStatus !== 'approved' ? '🔒 需审批通过' : '签订合同' }} 预览采样计划 {{ contractSaving ? '保存中...' : (contractLoadedId ? '更新合同' : '保存合同') }} {{ samplingPlanSaving ? '保存中...' : '仅更新采样计划' }} {{ contractGenerating ? '生成中...' : '一键生成任务单' }}
✍
该合同尚未签订
请先补充合同信息并签订,签订后才能生成任务单
补充合同信息并签订 取消
{{ 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 }}
暂无点位,点击下方"添加点位"
每次采样检测项目配置 每个点位独立增减采样次数(右侧 + / − 按钮);"雨水"属送样检测,不在此处配置
请先在上方添加点位
任务单操作
预览采样计划 {{ samplingPlanSaving ? '保存中...' : '更新并保存' }}
{{ contractGenerating ? '生成中...' : '一键生成任务单' }}
📋
当前状态:{{ contractDraft.status }}
该合同还未发起(或驳回后重新)审批。请前往"合同审批"页发起审批并通过。 审批进行中,请等待审批人处理。
去合同审批页 关闭
📋 已生成任务单({{ contractExistingTasks.length }}) 📦 一键下载全部任务单(ZIP)
任务号 第几次 计划月份 具体日期 状态 优先级 操作
{{ t.task_no }} 第{{ t.round_no }}次 {{ t.plan_month || '-' }} {{ t.plan_date || '待排期' }} {{ t.status }} {{ t.status }} {{ t.priority || '常规' }} 发送任务单至采样室
返回
审批节点预览
{{line}}
合同:{{contractChangeContract.contract_no}} 甲方:{{contractChangeContract.client||'-'}} 签约金额:¥{{formatMoney(contractChangeContract.total_amount||0)}} 状态:{{contractChangeContract.status}}
字段变更回款计划变更合同终止
合同终止通过后将冻结该合同后续业务操作,历史审批、发票和流水记录仍保留。履行到一半终止合作(中途终止)可在下方同步调整签约金额 / 居间费 / 分包费并重排回款计划;留空表示保持原值。签了未履行的,金额填 0 整单全止。终态分流:金额大于 0 落为「已终止」(有过交付,继续参与业绩、提成、应收统计,剩余款项照收);金额填 0 落为「已作废」(视作未发生,不计入统计)。
新签约金额
原值 ¥{{formatMoney(contractChangeContract?.total_amount||0)}} · 已回款 ¥{{formatMoney(contractChangeContract?.paid_amount||0)}}(下限)
新居间费
原值 ¥{{formatMoney(contractChangeContract?.broker_fee||0)}} · 已付 ¥{{formatMoney(contractChangeContract?.broker_fee_paid||0)}}(下限,另含在途申请)
新分包费
原值 ¥{{formatMoney(contractChangeContract?.subcontract_fee||0)}} · 已付 ¥{{formatMoney(contractChangeContract?.subcontract_fee_paid||0)}}(下限,另含在途申请)
回款计划变更:签约金额不变,只调整期数、回款年月和每期金额。审批通过后整体替换未收款的计划;已收款/已销账/已开票的期会自动锁定保留。
必须上传补充协议({{isVoidChangeType()?'合同终止': '签约金额 / 甲方 / 乙方变更'}})
选择补充协议文件
回款计划编辑
{{ (contractChangeForm.fields.includes('total_amount') || voidAmountEntered()) ? ('新签约金额:¥'+formatMoney(contractChangeEffectiveAmount())) : ('签约金额(不变):¥'+formatMoney(contractChangeContract?.total_amount||0)) }} 当前合计:¥{{formatMoney(contractChangePaymentTotal())}} 已收款/已销账的期锁定不动;已开票未收款的期金额不得低于已开票(发票即应收,不收了请先作废发票)
+ 添加回款计划
我发起的待我审批已完成
{{ contractOverview.draft_reserved || 0 }}
预占 / 草稿
已领号未签订
{{ contractOverview.total || 0 }}
合同总数
已签订合同累计
{{ contractOverview.done || 0 }} 已完成
{{ contractOverview.active || 0 }} 履约中
{{ contractOverview.pending || 0 }} 待下单
{{ contractOverview.terminated || 0 }} 已终止
{{ contractOverview.cancelled || 0 }} 已作废
{{ contractOverview.ending_soon || 0 }}
60天内到期
年度单签订日+1年临近
合同管理
{{ bulkContractsProgress || (bulkContractsExporting ? '导出中...' : '导入中...') }} 管理框架合同 已收完款 → 已完成 报告编号回填 批量导出合同(Excel) 批量导入合同(Excel) 恢复数据库
全选本页 已选 {{ selectedContractIds.length }} 份合同 导出选中 Excel 作废选中 连续归档向导 清空
查询 重置
纸质序号{{ contractSortIcon('contract_serial') }} 合同编号{{ contractSortIcon('contract_no') }} 签订日期{{ contractSortIcon('signed_date') }} 归档日期{{ contractSortIcon('archive_date') }} 委托单位{{ contractSortIcon('client') }} 受检单位{{ contractSortIcon('testee_unit') }} 合同签约金额{{ contractSortIcon('total_amount') }} 已收款 已销账金额 未销账金额 应收余额 到期应收 未到期 实收金额{{ contractSortIcon('net_amount') }} 居间费
实付
居间费
已付
居间费
待付
分包费
实付
分包费
已付
分包费
未付
已开票
金额
未开票
金额
客户经理{{ contractSortIcon('account_manager') }} 现任客户经理{{ contractSortIcon('current_account_manager') }} 客服 现任客服 所属渠道 履约进度{{ contractSortIcon('progress') }} 状态{{ contractSortIcon('status') }} 对应发票 对应回款计划 对应任务 关联报告 操作
{{ c.contract_serial || '-' }}
{{ c.contract_no }}
{{ c.contract_type || '-' }}
框架
{{ c.signed_date || '-' }} {{ c.archive_date }} 待归档 - {{ c.client || '-' }} {{ c.testee_unit || '-' }} {{ (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_paid||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.channel_name }} 未填
{{ (c.task_stats && c.task_stats.completed) || 0 }}/{{ c.total_rounds || 0 }}
{{ contractStatusLabel(c) }}
{{ iv.invoice_no }} · {{ iv.issue_date || '-' }}
{{ (iv.amount||0).toLocaleString() }}
0
第{{ p.seq }}期 {{ p.plan_month || '-' }} {{ (p.amount||0).toLocaleString() }} 已收 未收 已开票
无
{{ t.task_no }} 第{{ t.round_no }}次 {{ t.plan_month || '-' }} {{ t.status }}
无
{{ r.task_no }} {{ r.status }}
无
暂无合同
合同编号:{{ contractReportAttachmentsDialog.contract_no }}
暂无报告附件
报告编号:{{ group.report_no }}({{ group.status }})
确认核对版 签收
{{ att.kind === 'check_version' ? '核对版' : (att.kind === 'qc_report' ? '质控报告' : '盖章版') }}:{{ 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) }}
请选择条件并点击查询
🔍 查询 重置 共 {{ progressResults.length }} 条结果
🔎
没有找到匹配的合同或任务
{{ item.type === 'contract' ? '📁' : '📋' }} {{ item.title }} {{ item.status || (item.type === 'contract' ? '合同' : '任务') }} {{ item.type === 'contract' ? '合同下共 ' + (item.tasks?.length||0) + ' 个任务' : '独立任务' }}
{{ key }}:{{ val || '—' }}
🕒 全流程进度
{{ ev.stage }}
{{ ev.time || (ev.done === false ? '待完成' : '—') }}
{{ ev.detail }}
📋 该合同下的采样任务 ({{ item.tasks.length }})
{{ ct.title }} {{ ct.status }} {{ ct.meta['计划日期'] || '未排期' }} 小组长:{{ ct.meta['小组长'] || '—' }} 查看生产进度
{{ ev.stage }}
{{ ev.time || (ev.done === false ? '待完成' : '—') }}
{{ ev.detail }}
{{ contractEditorDialogTitle }} ✕
基本信息
合同编号:{{ contractDetail.contract_no }}
草稿编号:{{ contractDetail.draft_no }}
合同类型:
状态: {{ contractDetail.status }}
是否框架合同: 是 否
检测类别:{{ contractDetail.test_category || '-' }}
委托单位:{{ contractDetail.client || '-' }}
受检单位:{{ contractDetail.testee_unit || '-' }}
统一社会信用代码:{{ contractDetail.testee_credit_code || '-' }}
受检地址:{{ 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.total_amount||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:'已驳回',withdrawn:'已撤回',cancelled:'已取消'}[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.received_tx_date }} - 已开票 未开票 {{ pay.invoiced_date }} - 已交付 {{ 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 }} {{ t.priority || '常规' }} 发送至采样室
尚未生成任务单
该合同暂无上传的资料
盖章版合同({{ contractFilesDialog.stampedFiles.length }}) + 补充
📄 {{ a.filename }} ({{ (a.size/1024).toFixed(1) }} KB) {{ a.uploaded_at }} 查看 下载 删除
报价单({{ contractFilesDialog.quoteFiles.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 || '-' }}
必须上传至少一份盖章版合同,归档才算正式生效
⬆
拖拽或点击上传盖章版合同扫描件(可多选)
⬆
拖拽或点击上传其他资料(报价单、补充协议等,可选)
📥 待接收样品 🔄 刷新 采样员已交接但实验室还没接收的任务(共 {{ pendingReceiveList.length }} 张)
💡 接收时会自动:① 生成实验室流转单 V2 ② 按"任务分配规则"派检测员(lab_tasks 自动建)。
任务编号 委托方 受检方 采样组长 交接时间 交接人 样品总数 留底照片 操作
{{ t.task_no }} {{ t.client_unit || '—' }} {{ t.company_name }} {{ t.group_leader_name }} {{ t.sample_handover_at }} {{ t.sample_handover_by }} {{ t.sample_count }} 📷 {{ t.handover_photo_count }} ✓ 接收 ↩ 退回
无待接收任务
🔮 样品预告 采样室已排期/进行中但尚未交接样品的任务(共 {{ pendingPreviewList.length }} 张),可提前安排检测资源
任务编号 委托方 受检方 采样状态 采样组长 计划日期
{{ t.task_no }} {{ t.client_unit || '—' }} {{ t.company_name }} {{ t.status }} {{ t.group_leader_name || '—' }} {{ t.plan_date || '—' }}
暂无预告
📦 流转单管理 🔄 刷新 订单级维度:每张流转单 = 一张任务单 = 报告编号(样品级明细见「样品台账」子页签)· 共 {{ filteredTransferTaskList.length }} / {{ transferTaskList.length }} 张
全部 待接收 待派单 检测中 已完成 已上交
清空条件
流转单编号 状态 样品类型 检测项目 已分派检测员 自动分配 操作
{{ transferTaskList.length ? '没有符合查询条件的流转单' : '暂无流转单(可通过右上角批量导入)' }}
🔮 样品预告 采样室已排期/进行中但尚未交接样品的任务(共 {{ pendingPreviewList.length }} 张),可提前安排检测资源
任务编号 委托方 受检方 采样状态 采样组长 计划日期
{{ t.task_no }} {{ t.client_unit || '—' }} {{ t.company_name }} {{ t.status }} {{ t.group_leader_name || '—' }} {{ t.plan_date || '—' }}
暂无预告
搜索:
筛选: 搜索 刷新 重置 🖨 打印标签({{ labPrintChecked.length }})
样品编号 任务编号 受检单位 采样点位 样品类型 检测项目 采样日期 存储位置 状态 二维码 操作
{{ labSampleExpanded[it.row.id] ? '▼' : '▶' }} ↳ {{ it.row.sample_id }} 子样 子样×{{ labSampleChildrenMap[it.row.id].length }} {{ it.row.task_number }} {{ it.row.company_name }} {{ it.row.point_name }} {{ it.row.sample_type }} {{ it.row.test_items }} {{ it.row.sampling_date }} {{ it.row.storage_location || '—' }} {{ it.row.status }} — +加标 +实验室平行 +质控样 转留样 分样 位置 退样 处置 标签
暂无样品
共 {{ transferDupDlg.rows.length }} 条重号(另有 {{ transferDupDlg.newCount }} 条新单将正常导入) 全部覆盖并更新 全部跳过
{{ transferDupDlg.failed.length }} 个文件解析失败:{{ transferDupDlg.failed.map(f => f.file).join('、') }}
覆盖并更新:只刷新流转单内容(点位/检测项目/样品编号/计划月等),不动状态、排期、派单和执行数据,操作留痕。
接收时间:{{ transferDetail.task.sample_received_at || '—' }} 接收人:{{ transferDetail.task.sample_received_by || '—' }} 检测任务总数:{{ transferDetail.count }} 🔄 刷新 📝 在线预览
📄 生成实验室原始记录表(按检测项目): {{ ti }} (无)
样品编号 点位 样品类型 检测项目 分析(检测员) 校核 审核 状态
{{ r.sample_no }} {{ r.point_name || '—' }} {{ r.sample_type || '—' }} {{ r.test_item }} {{ r.assigned_to }} ⚠ 未分配 {{ r.reviewer || '—' }} {{ r.approver || '—' }} {{ r.status }}
无检测任务
下列项目未匹配到「任务分配规则」,请逐条指定检测员:
样品编号 样品类型 检测项目 指派给 操作
{{ u.sample_no }} {{ u.sample_type }} {{ u.test_item }} 保存
无待分配项目
搜索:
筛选: 搜索 刷新 重置 🖨 打印标签({{ labPrintChecked.length }})
样品编号 任务编号 受检单位 采样点位 样品类型 检测项目 采样日期 存储位置 状态 二维码 操作
{{ labSampleExpanded[it.row.id] ? '▼' : '▶' }} ↳ {{ it.row.sample_id }} 子样 子样×{{ labSampleChildrenMap[it.row.id].length }} {{ it.row.task_number }} {{ it.row.company_name }} {{ it.row.point_name }} {{ it.row.sample_type }} {{ it.row.test_items }} {{ it.row.sampling_date }} {{ it.row.storage_location || '—' }} {{ it.row.status }} — +加标 +实验室平行 +质控样 转留样 分样 位置 退样 处置 标签
暂无样品
{{ labTasks.length }}
在手任务
{{ labTasksWarning }}
24h内到期
{{ labTasksOverdue }}
已超期
{{ labTasksCritical }}
4h内紧急
全部 待检测 检测中 待校验 待审核 完成 已暂停 刷新 📦 组批检测 📤 上传记录表 🔍 识别数据 ✔ 批量通过({{ labTaskChecked.length }}) ✕ 批量驳回({{ labTaskChecked.length }})
检测项目 样品编号 受检单位 采样点位 检测人 批次 结果 状态 操作
{{ t.test_item }} {{ t.sample_code }} {{ t.company_name }} {{ t.point_name }} {{ t.assigned_to || '—' }} {{ t.batch_no || '—' }} ND {{ t.rounded_result }} — {{ labStatusText(t.status) }}
{{ t.pause_reason }}
详情 📝 录数 提交 🔍 校验 🔍 审核 记录表工作台 暂停 恢复 通过 驳回
暂无检测任务
{{ myTasks.length }}
在手任务
{{ myTasksWarning }}
24h内到期
{{ myTasksOverdue }}
已超期
{{ myTasksCritical }}
4h内紧急
刷新
全部
待检测
待校验
待审核
样品编号 检测项目 检测员 状态 截止时间 剩余时间 操作
{{ t.sample_no || t.sample_code || '—' }} {{ t.test_item }} {{ t.assigned_to || '—' }} {{ labStatusText(t.status) }} {{ t.deadline || '—' }} {{ t.remaining_hours < 0 ? '超 ' + (-t.remaining_hours) + 'h' : t.remaining_hours + 'h' }} 📝 录数 🔍 校验 🔍 审核
暂无{{ myTaskFilter ? labStatusText(myTaskFilter) : '' }}任务
受检单位:{{ labReadingTask.company_name || '—' }} · 检测员:{{ labReadingTask.assigned_to || '—' }} · 样品类型:{{ labReadingTask.sample_type || '—' }}
① 选择检测方法 (从资质附表)
{{ q.standard_code || '(无标准号)' }} {{ q.sample_object }}
{{ q.method_name }}
仪器:{{ q.instrument || '—' }} · 检出限:{{ q.detect_limit || '—' }}
✓ 已选:{{ selectedQualification.standard_code }} 《{{ selectedQualification.method_name }}》 · 仪器 {{ selectedQualification.instrument }} · 检出限 {{ selectedQualification.detect_limit }}
📋 原始记录表:{{ recordTpl.template_code }} 置信度 {{ recordTpl.confidence }}{{ recordTpl.need_audit ? ' · 待审' : '' }}
{{ recordTpl.template_name }}
{{ recordTpl.match_reason }}
② 录入实验数据
📑 实验室表格生成 🔄 刷新 📤 上传记录表 🔍 识别数据 共 {{ recordGenList.length }} 张流转单(生产 {{ recordGenList.filter(t => !t.is_history).length }} · 历史补录 {{ recordGenList.filter(t => t.is_history).length }})
清空 筛选结果 {{ recordGenFiltered.length }} / {{ recordGenList.length }} 张
{{ t.task_no }} 历史 生产 {{ t.is_history ? '识别时间' : '接收时间' }}:{{ t.sample_received_at }} 检测项目数:{{ t.test_item_groups.length }} 📤 上传识别 历史补录归档,不进生产流程
检测项目 分派检测员 录数进度 已通过审核 操作
{{ g.test_item }}
{{ g.template_name }}
{{ (g.assigned || []).join('、') || '—' }} {{ g.with_readings }} / {{ g.total }} {{ g.record_status }} {{ g.approved }} / {{ g.total }}
🔍 管理数据
该流转单暂无检测任务
{{ recordGenList.length ? '没有符合筛选条件的流转单' : '暂无已接收的流转单' }}
刷新 共 {{ labSubmitList.length }} 单 可上交 {{ labSubmitList.filter(i => i.can_submit).length }} 单 / 已上交 {{ labSubmitList.filter(i => i.lab_records_submitted_at).length }} 单
任务号 受检单位 项目 检测进度 最晚完成时间 上交时间 操作
{{ item.task_no }} {{ item.company_name }} {{ item.project_name }} {{ item.done }}/{{ item.total }} {{ item.max_completed_at || '—' }} {{ item.lab_records_submitted_at || '—' }} 上交原始记录 已上交 检测未完成
暂无任务
① 选择检测任务
载入
任务编号:{{ labWbLoaded }} 受检单位:{{ labWbTaskInfo.company_name || '—' }} 文件数:{{ labWbDocs.length }} 已确认记录:{{ labWbConfirmedCount }} ✅ 已上交 {{ labWbSubmitInfo.lab_records_submitted_at }} ✓ 纸质已移交 {{ labWbSubmitInfo.lab_paper_handed_at }} 🔍 核对识别数据 📋 提交纸质(含移交照) 🔄 刷新
④ 生成空白记录表 🗂 预生成全部记录表 按任务样品 × 模版映射一次性生成;已存在的文件自动跳过,不会覆盖已录数据
⑤ 表格清单({{ labWbDocs.length }} 张) 尚未生成表格 — 请先点上方「🗂 预生成全部记录表」
⑥ 提交全部检测记录 全部文件审核已通过,可提交 存在未通过审核的文件,提交将被系统拦截 提交「{{ labWbLoaded }}」全部检测记录 提交后实验室环节完成,报告室可开始编制;记录表将锁定
{{ labWbDocStatus(labWbAudit.row) }} 待同步
驳回原因:{{ labWbAudit.row.reject_reason }}
已通过:{{ labWbAudit.row.audited_by_name }} · {{ labWbAudit.row.audited_at }}
审核通过后文件锁定,如需修改请先「撤回审核」;驳回需填写原因,将联动回退对应识别记录。
刷新 手动推送飞书 已超期 {{ labOverdueList.length }} 项 24h内到期 {{ labExpiringList.length }} 项
❗ 已超期
样品 受检单位 项目 检测员 状态 超期 操作
{{ t.sample_code }} {{ t.company_name }} {{ t.test_item }} {{ t.assigned_to || '—' }} {{ t.status }} {{ -t.remaining_hours }}h
⚠ 24h内即将到期
样品 受检单位 项目 检测员 状态 剩余 操作
{{ t.sample_code }} {{ t.company_name }} {{ t.test_item }} {{ t.assigned_to || '—' }} {{ t.status }} {{ t.remaining_hours }}h
暂无即将到期
📊 实验室看板 刷新 导出Excel → 检测任务 → 超期告警 → 实验室管理
{{ labSlaSummary.total||0 }}
总任务
{{ labSlaSummary.done||0 }}
已完成
{{ labSlaSummary.on_time_rate||0 }}%
及时率
{{ labSlaSummary.overdue||0 }}
超期
{{ labSlaSummary.expiring_24h||0 }}
24h内到期
{{ labSlaSummary.pending||0 }}
待检测
{{ labSlaSummary.testing||0 }}
检测中
{{ labSlaSummary.reviewing||0 }}
待校验
{{ labSlaSummary.auditing||0 }}
待审核
检测员工作量排行
检测员 任务数 完成 进行中 超期 完成率 及时率
{{ p.name }} {{ p.total }} {{ p.completed }} {{ p.in_progress }} {{ p.overdue }} {{ p.completion_rate }}% {{ p.on_time_rate }}%
暂无数据
各阶段平均耗时(瓶颈分析)
阶段 平均耗时(小时) 可视化
{{ b.stage }} {{ b.avg_hours }}h
审核时效统计(提交审核 → 审核完成) 刷新 驳回后重新审核的任务按首次时间计
按审核人
审核人 审核数 平均耗时 超24h 超48h
{{ a.name }} {{ a.count }} {{ a.avg_hours }}h {{ a.over_24h }} {{ a.over_48h }}
暂无数据
按月份
月份 审核数 平均耗时 超24h 超48h
{{ m.month }} {{ m.count }} {{ m.avg_hours }}h {{ m.over_24h }} {{ m.over_48h }}
暂无数据
按检测员(其任务的审核耗时)
检测员 任务数 平均耗时 超24h 超48h
{{ p.name }} {{ p.count }} {{ p.avg_hours }}h {{ p.over_24h }} {{ p.over_48h }}
暂无数据
💡 这里定义每个检测项目的标准完成时限(单位小时),系统按这个时限自动给新任务打上 deadline,超期就告警。 国标和行业惯例已内置 45 条默认规则(pH 24h / COD 72h / BOD5 168h / 重金属 120h …),可按本实验室实际能力调整。
新增/修改: 时限: 小时
共 {{ slaRules.length }} 条规则
检测项目 方法标准 标准时限(小时) 更新时间 操作
{{ r.test_item }} {{ r.method_standard || '通用' }} {{ r.sla_hours }} {{ r.updated_at }}
暂无规则,点击"恢复默认时效"一键导入
刷新 配置「样品类型 + 检测项目 → 默认检测员」,派检测任务时自动分配
添加规则
添加
已有规则 (共 {{ assignmentList.length }} 条)
序号 样品类型 检测项目 负责检测员 手机号 操作
{{ idx+1 }} {{ a.sample_type }} {{ a.test_item }} {{ a.assigned_name }} {{ a.assigned_phone }}
暂无规则,请先添加
{{ consumableStats.total || 0 }}
耗材种类
{{ consumableStats.ok || 0 }}
库存充足
{{ consumableStats.low || 0 }}
库存不足
{{ consumableStats.expiring || 0 }}
效期临近(30天)
搜索 + 新增耗材
{{ equipmentStats.total || 0 }}
设备总数
{{ equipmentStats.in_use || 0 }}
在用
{{ equipmentStats.calibration_soon || 0 }}
校准30天内到期
{{ equipmentStats.overdue || 0 }}
已超期
搜索 + 新增设备
⏰ {{ equipDuePlans.length }} 项保养计划已到期或 30 天内到期(点击查看明细) 推送飞书提醒
设备保养计划(到期自动预警 + 飞书每日提醒) + 新增保养计划
暂无保养计划
刷新 报修/保养从「台账」行内「更多」发起;维修验收合格后设备自动恢复「在用」
暂无工单
查询 利用率 = 使用时长 ÷ 周期内可用工时(按每天 8 小时)
设备利用率({{ equipUsageStats.start || '-' }} ~ {{ equipUsageStats.end || '-' }})
该周期暂无使用记录(从「台账」行内「更多 → 登记使用」录入)
暂无使用记录
提交后生成维修工单,设备状态自动置为「维修」
登记后生成已完成保养工单,关联计划的「上次保养/下次到期」自动推进
周期(天)*
合格(设备恢复在用) 不合格(返回处理中)
👥 实验室小组管理 按专业方向(理化/无机/有机)划分,每组可设组长
+ 新建小组
暂无小组
{{ g.group_name }}组 · {{ g.member_count }} 人
编辑 删除
专业方向: {{ g.specialty || '-' }}
组长: ⭐ {{ g.leader_name }} (待定)
组员
⭐ {{ m.name }} {{ m.phone }}
移除
+ 添加成员
⏰ {{ compExpiring.length }} 条上岗授权 30 天内到期或已到期(点击查看明细) 推送飞书提醒
授权矩阵(人员 × 检测项目,勾选 = 授权) 勾选立即保存;方法/仪器类授权请用下方明细列表维护
人员 {{ it }}
{{ p.name }}({{ p.role }})
暂无检测员(检测员/实验员/分析员角色)
搜索 + 新增授权
暂无授权记录
⚠️ {{ ncOverdue.length }} 条不符合项已超过纠正措施期限(点击查看明细) 推送飞书提醒
{{ ncStats.total || 0 }}
总数
{{ ncOpenCount }}
处理中
{{ ncClosedCount }}
已关闭
{{ ncStats.overdue_count || 0 }}
超期未关闭
按类别汇总
按月份汇总
搜索 + 登记不符合项
暂无不符合项记录
⚠️ {{ retPending.length }} 份留样已过留样期限,待处置(点击查看明细) 推送飞书提醒
搜索 在留 {{ retActiveCount }} | 到期 {{ retPending.length }} | 审批中 {{ retDisposingCount }} | 已处置 {{ retDisposedCount }}
暂无留样记录(在「样品库」每行点"转留样"创建)
⚠️ {{ qcOverlimitTotal }} 条质控判定超限(点击查看明细) 推送飞书提醒
搜索 重新判定(全部配对)
暂无判定记录(录入平行样 P / 加标样 J 的读数后自动判定)
限值配置(检测项目 × 判定类型) 导入预置常用限值
保存
暂无限值配置,点"导入预置常用限值"一键导入
近90天 近180天 近365天 控制限来源:{{ qcChartData.limit_source === 'qc_limits' ? '限值配置(质控判定)' : '均值 ± 3σ(未配置限值)' }}
总点数
{{ qcChartData.summary.total }}
失控数
{{ qcChartData.summary.out_count }}
合格率
{{ qcChartData.summary.pass_rate }}%
均值
{{ qcChartData.summary.mean }}
标准差 σ
{{ qcChartData.summary.sigma }}
{{ qcChartMeta.test_items.length ? '该条件下暂无数据(可切换时间范围或判定类型)' : '暂无质控判定数据(在「质控判定」产生判定记录后自动生成控制图)' }}
查询 导出 Excel
总样品数
{{ qcMonthlyData.summary.total_samples }}
空白样
{{ qcMonthlyData.summary.blank_count }}
平行样(合格率)
{{ qcMonthlyData.summary.parallel_count }}({{ qcMonthlyData.summary.parallel_pass_rate === null ? '—' : qcMonthlyData.summary.parallel_pass_rate + '%' }})
加标样(合格率)
{{ qcMonthlyData.summary.spike_count }}({{ qcMonthlyData.summary.spike_pass_rate === null ? '—' : qcMonthlyData.summary.spike_pass_rate + '%' }})
该月暂无检测数据
口径:平行/加标按判定时间(qc_results),空白样(K 尾缀,采样环节空白无自动判定,合格率显"—")与总样品按完成/提交时间统计。
数据关联性逻辑预警规则 同一样品内两项目结果的大小关系校验(如 COD > BOD5);命中只在录入提交/报告审核时黄色提醒,不拦截
{{ logicRuleForm.id ? '保存修改' : '新增规则' }} 取消编辑
暂无规则
采购请购单 待审批 {{ prPendingCount }} 搜索 + 新增请购
暂无请购单,点右上角"新增请购"发起
⚠️ {{ rmExpiring.length }} 种标准物质 30 天内到期或已到期(点击查看明细) 推送飞书提醒
标准物质台账 搜索 + 新增标准物质
暂无标准物质记录
{{ prApproveTarget.item_name }}({{ prApproveTarget.spec || '无规格' }})× {{ prApproveTarget.quantity }}{{ prApproveTarget.unit }},申请人:{{ prApproveTarget.applicant }}
通过 驳回
{{ prAcceptTarget.item_name }}({{ prAcceptTarget.spec || '无规格' }}),请购数量:{{ prAcceptTarget.quantity }}{{ prAcceptTarget.unit }}
登记配制记录
暂无配制记录
搜索 + 新增监控点
暂无监控点(如培养箱、冰箱、实验室环境),点上方"+ 新增监控点"添加
搜索 + 录入监测值
暂无监测记录,点上方"+ 录入监测值"手工录入
当前阈值:{{ envThresholdText(envRecordPoint) }}
搜索 + 新建曲线
暂无校准曲线,点右上角"+ 新建曲线"登记
标准系列点(浓度 c → 响应值 a) + 添加点 拟合预览
y = {{ calNum(calPreview.slope) }} x {{ calPreview.intercept >= 0 ? '+' : '-' }} {{ calNum(Math.abs(calPreview.intercept)) }}  R² = {{ calPreview.r2Text }}  判定:{{ calPreview.ok ? '合格' : '不合格' }} (阈值 R² ≥ {{ calForm.r2_threshold || 0.999 }})
搜索 + 新建能力验证
暂无能力验证记录,点右上角"+ 新建能力验证"登记
搜索 + 新建内审
暂无内审记录,点右上角"+ 新建内审"登记
搜索 + 新建管理评审
暂无管理评审记录,点右上角"+ 新建管理评审"登记
LDG-QP-15 §4.4.6 — 质控样独立编号 = QC(批号) 显示已停用 + 新增批号
暂无质控批号,点上方"+ 新增批号"添加
一般 严重 通过(关闭) 不通过(退回实施)
{{ ncStatusLabels[ncDetail.status] || ncDetail.status }} {{ ncDetail.severity }} 超期
{{ ncDetail.source }} {{ ncDetail.category }} {{ ncDetail.description }} {{ ncDetail.found_by }}({{ ncDetail.found_at }}) {{ ncDetail.dept || '-' }} {{ ncDetail.responsible || '-' }} {{ ncDetail.root_cause || '-' }} {{ ncDetail.corrective_action || '-' }} {{ ncDetail.action_deadline || '-' }} {{ ncDetail.implemented_at ? (ncDetail.implemented_at + '(' + (ncDetail.implemented_by || '-') + ')') : '-' }} {{ ncDetail.verify_by ? (ncDetail.verify_by + '|' + ncDetail.verify_at + '|' + ncDetail.verify_result + (ncDetail.verify_note ? '|' + ncDetail.verify_note : '')) : '-' }} {{ ncDetail.closed_at || '-' }}
填写原因与措施 开始实施 提交验证 验证关闭
流转记录
{{ h.actor }}:{{ ncActionLabel(h.action) }}({{ ncStatusLabels[h.from] || h.from }} → {{ ncStatusLabels[h.to] || h.to }})
原因:{{ h.detail.root_cause }}
措施:{{ h.detail.corrective_action }}
结论:{{ h.detail.verify_result }}|{{ h.detail.verify_note }}
备注:{{ h.detail.note }}
暂无流转记录
{{ retCreateForm.sample_code }}({{ retCreateForm.sample_type || '-' }}|任务号 {{ retCreateForm.task_no || '-' }})
已按样品类型给建议值(水 7 天 / 土壤 30 天 / 气 3 天 / 其他 7 天),可修改
{{ retApplyForm.sample_code }}(留样期限 {{ retApplyForm.retain_until }}|{{ retApplyForm.location }}) {{ retApproveForm.sample_code }}({{ retApproveForm.location }}) {{ retApproveForm.dispose_method }} {{ retApproveForm.dispose_apply_by }}({{ retApproveForm.dispose_apply_at }}) 通过 驳回
审批人不能与申请人为同一人;通过后记录处置时间,驳回后回到在留/到期可重新申请。
{{ retStatusLabels[retDetail.status] || retDetail.status }} 已过留样期限
{{ retDetail.sample_code }} {{ retDetail.task_no || '-' }} {{ retDetail.sample_type || '-' }} {{ retDetail.retain_until || '-' }} {{ retDetail.location }} {{ retDetail.notes || '-' }} {{ retDetail.created_by }}({{ retDetail.created_at }}) {{ retDetail.dispose_apply_by ? (retDetail.dispose_apply_by + '|' + retDetail.dispose_apply_at + '|' + retDetail.dispose_method) : '-' }} {{ retDetail.dispose_approve_by ? (retDetail.dispose_approve_by + '|' + retDetail.dispose_approve_at) : '-' }} {{ retDetail.disposed_at || '-' }}
申请处置 审批
{{ slcSplitForm.sample_code }}
子样编号 = 母样编号 + “-序号”(如 {{ slcSplitForm.sample_code }}-1),继承项目/点位/类型/检测项目,可单独流转
{{ c.sample_id }}({{ c.status }})
{{ slcStorageForm.sample_code }}(当前位置:{{ slcStorageForm.current || '未登记' }})
变更历史
样品:{{ slcReturnForm.sample_code }}
退样记录
{{ slcDisposeForm.sample_code }} {{ m }}
仅针对未转入留样的普通样品;已转留样的请在「留样管理」走处置审批。登记后样品状态变为「已处置」。
新建时只能选已在该组的成员,需先创建再加成员再设组长
共 {{ labGroupCandidates.length }} 名候选(已在组的员工不显示,先从原组移除)
原样品编号:{{ labAppendSource.sample_id }}
受检单位:{{ labAppendSource.company_name }}
检测项目:{{ labAppendSource.test_items }}
将生成 J{{ labAppendForm.times === 1 ? '' : labAppendForm.times }}(如 1 次=J,2 次=J2) 将生成 P{{ labAppendForm.times === 1 ? '' : labAppendForm.times }} {{ labAppendPreviewSid }}
将驳回已勾选的 {{ labTaskChecked.length }} 条任务(逐条处理,失败不影响其他)
受检单位:{{ labTaskDetail.company_name || '—' }} · 检测员:{{ labTaskDetail.assigned_to || '—' }} · 样品类型:{{ labTaskDetail.sample_type || '—' }} · 采样日期:{{ labTaskDetail.sampling_date || '—' }}
{{ labTaskDetail.test_item }} {{ labTaskDetail.status }} {{ labTaskDetail.transfer_no || '—' }} {{ labTaskDetail.sample_code || '—' }} {{ labTaskDetail.point_name || '—' }} {{ labTaskDetail.assigned_to || '—' }} {{ labTaskDetail.selected_standard || labTaskDetail.method_standard || labTaskDetail.formula_info?.method_standard || '—' }} {{ labTaskDetail.formula_info?.detect_limit || labTaskDetail.detect_limit || '—' }} {{ labTaskDetail.calc_result || '—' }} ND {{ labTaskDetail.rounded_result || '—' }} {{ labTaskDetail.detect_date_start }} ~ {{ labTaskDetail.detect_date_end }} {{ labTaskDetail.detect_date_start }} —
数据录入
检测日期: ~
{{ desc }}({{ key }}):
检测值:
提交数据 · 自动计算
{{ labCalcResult.display }}
原始值: {{ labCalcResult.calc_result }} · 修约(GB/T 8170): {{ labCalcResult.rounded_result }}
{{ labCalcResult.warning.message || labCalcResult.warning }}
⚠ 数据关联性预警(不拦截,请复核)
· {{ w.message }}({{ w.item_a }}={{ w.value_a }},{{ w.item_b }}={{ w.value_b }})
📋 原始记录数据
{{ labTaskDetail.is_nd ? 'ND' : labTaskDetail.rounded_result }}
原始值: {{ labTaskDetail.calc_result || '—' }} · 修约规则: GB/T 8170
操作记录
{{ t.action }} — {{ t.operator }} {{ t.time }}
通过 驳回
查询识别数据 📤 上传记录表 支持 Excel 原件 / 照片 / PDF(照片和 PDF 走 AI 视觉识别,入库后请逐条核对再确认)
✔ {{ r.filename }} — {{ r.template_name || r.template_code }} · 匹配:{{ r.match_way || '人工指定' }} · 样品行数:{{ r.rows_n }} 📝 打开核实(在线编辑) ✘ {{ r.filename }} — {{ r.error }}
⚠ {{ r.warning }}
暂无识别记录
{{ it.test_item || '未指定项目' }} {{ it.status }}
{{ it.template_name || it.template_code || '未识别模版' }}
低置信度 {{ it.low_confidence.length }}
请选择左侧记录
{{ labTransferDetail.transfer_no }} {{ labTransferDetail.status }} {{ labTransferDetail.from_dept }} {{ labTransferDetail.to_dept }} {{ labTransferDetail.receiver || '—' }} {{ labTransferDetail.transfer_time }} {{ labTransferDetail.task_number }} {{ labTransferDetail.company_name }} {{ labTransferDetail.sample_code }} {{ labTransferDetail.sample_type }} {{ labTransferDetail.point_name }} {{ labTransferDetail.test_items }} {{ labTransferDetail.sampling_date }} {{ labTransferDetail.sampler }}
接收 导出PDF
暂无启用的检测员,请先在系统管理 · 用户岗位中配置
创建批次
批次号 批次名 检测项目 检测员 任务数 创建人 创建时间 操作
{{ b.batch_no }} {{ b.batch_name }} {{ b.test_item || '—' }} {{ b.detector || '—' }} {{ b.task_count || 0 }} {{ b.created_by || '—' }} {{ b.created_at }} 管理任务
暂无批次
{{ batchDetail.batch_no }} · {{ batchDetail.batch_name }} (已进入流转的任务不可移出)
加入批次
任务# 样品编号 检测项目 检测员 状态 操作
{{ t.id }} {{ t.sample_no || '—' }} {{ t.test_item }} {{ t.assigned_to || '—' }} {{ t.status }} 移出
批次内暂无任务
{{ labQrcodeLabel }}
共 {{ notifList.length }} 条通知 全部已读
暂无通知
{{ n.title }} {{ n.created_at }}
{{ n.content }}
确认核对版 签收 上传核对版 上传盖章版 确认送出 去签发
🔗 合同、发票、流水三方关联工作台
按金额覆盖核对销项发票、业务收入流水和合同回款计划,优先处理尚未闭环的缺口。
更新于 {{ financeRelationship.generated_at }} 刷新工作台
有效合同金额
¥{{ 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 }}
回款计划金额不平
重复发票号
重复流水
最近关联操作
月结快照
高风险应收预测
对账导出记录
月结后调整记录
经营筛选: 🔄 刷新 导出财务对账 🤖 全量重跑归类
财务闭环工作台
按“申请审批 → 开票 → 流水关联 → 应收回款”排序处理,避免单据停留在中间环节。
更新于 {{ financeClosure.generated_at }} 刷新待办
当前没有待处理的财务闭环事项
当月确认收入¥{{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(支出金额)
💰 收入结构(一级科目)
只看待归类 查询 重置 + 新增流水 共 {{ financeTxTotal }} 笔 · 收入 ¥{{ formatMoney(financeTxSumIn) }} · 支出 ¥{{ formatMoney(financeTxSumOut) }}
{{ bankTxProgress || (bankTxExporting ? '导出中...' : '导入中...') }} 批量导出银行流水(Excel) 导出已关联发票、合同的流水 导出未关联合同流水({{ unlinkedTxStats.count }} 条 · 共 ¥{{ formatMoney(unlinkedTxStats.amount) }}) 导入农行流水(保留关联) 导入华兴流水(保留关联) 批量删除(按银行+年月)
⚠ 将删除该银行该年月的全部流水;已关联(合同/发票/付款/销账)的流水会自动跳过。删除后不可恢复,适用于删除后重新导入官网流水的场景。
已选 {{ bankTxSelected.length }} 条 批量删除流水
{{ planStats.total_count }}
回款计划总数
{{ formatMoney(planStats.received_amount) }}
已收款金额
{{ formatMoney(planStats.pending_amount) }}
未收款金额
{{ formatMoney(planStats.invoiced_amount) }}
已开票金额
查询 重置
{{ planImporting ? '导入中...' : '导出中...' }} 批量导出回款计划(Excel) 批量导入回款计划(Excel)
以下对方名的流水未能自动归类。为某一组设置科目后,可勾选"加入白名单"让以后相同对方名自动打标。
🔄 刷新 共 {{ financePending.length }} 组
用户手工确认的"对方名→科目"映射。新流水入库时优先按此规则归类,置信度 high。
暂无自定义白名单。在"待归类点审"或"银行流水"页勾选"加入白名单"即可添加。
一笔流水可分配给多个合同的多个回款计划。部分销账(实际金额 < 计划金额)时,剩余金额会自动拆成新计划,需指定新回款月份。
左侧选流水 → 右侧选合同 → 把回款计划加入分配清单 → 编辑金额 → 提交销账
📥 待销账流水({{ unclearedTx.length }}) 🔄
暂无待销账流水
{{ tx.tx_date }} ¥{{ formatMoney(tx.income) }} 余 ¥{{ formatMoney(tx.balance) }} {{ tx.account_name }} {{ tx.contract_no }}
{{ tx.summary || '—' }}
{{ tx.bank }} · {{ tx.serial_no }}
📋 销账分配 先在左侧选一条流水
👈 选一条流水后,右侧会显示推荐合同清单
流水: {{ clearingTx.summary || '—' }}
总额 ¥{{ formatMoney(clearingTx.income) }} 已销 ¥{{ formatMoney(clearingTxClearedAmount) }} 本次分配 ¥{{ formatMoney(clearingAllocTotal) }} 剩余 ¥{{ formatMoney(clearingRemaining) }}
🎯 智能推荐(多维度匹配)
{{ s.contract_no }} {{ s.score }}分 {{ s.client }}{{ s.testee_unit ? ' → ' + s.testee_unit : '' }} 未收 ¥{{ formatMoney(s.unpaid_amount) }}
· {{ r }}
第{{ p.seq }}期 {{ p.plan_month || '-' }} ¥{{ formatMoney(p.amount) }}
查找
{{ clearingContract.contract_no }} · {{ clearingContract.client }}
第{{ p.seq }}期 {{ p.plan_month || '-' }} ¥{{ formatMoney(p.amount) }}
📦 本次销账分配清单({{ clearingAllocations.length }} 笔)
{{ alloc.contract_no }} 第{{ alloc.seq }}期 / {{ alloc.plan_month || '-' }} 计划 ¥{{ formatMoney(alloc.plan_amount) }} 移除
实际金额:
确认销账(共 {{ clearingAllocations.length }} 笔,¥{{ formatMoney(clearingAllocTotal) }}) 清空分配 ⚠️ 分配总额超过流水余额 从上方推荐或合同查询里点回款计划加入分配
该流水已有销账记录(可撤销)
{{ r.contract_no }} 第{{ r.seq }}期 ¥{{ formatMoney(r.amount) }} {{ r.cleared_at }} 撤销
¥ {{ 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) }}
未到期金额
计划月未到 / 未交付
查询 重置 批量导出
付款管理发起付款申请流水分摊核销导出对账配置付款审批模板收款方花名册管理一笔支出流水可分摊多张申请;一张申请也可分次付款。
我的申请待我审批财务待付款全部申请
待付款 ¥{{formatMoney(paymentQuality.summary.pending)}}未完全关联支出流水 {{paymentQuality.unlinked_expenses.length}} 笔付款申请 {{paymentQuality.summary.request_count||0}} 笔刷新异常
原应付款台账 供应商应付 居间费应付 工资绩效应付
{{ payableTypeLabel }} 共 {{ payableTotal }} 笔 · 应付 ¥{{ payableTypeStat.total.toLocaleString() }} · 已付 ¥{{ payableTypeStat.paid.toLocaleString() }} · 未付 ¥{{ payableTypeStat.unpaid.toLocaleString() }}
刷新 + 新增 批量导出 导入Excel 全新导入 清理重复
暂无记录。可点「导入Excel」导入《应付款明细》,或「+ 新增」。
🗂️ 财务科目管理 新增一级科目 刷新 共 {{ finAccountsManage.length }} 个科目 · 被流水/归类规则引用的科目不可删除,只能停用;停用后不再出现在打标选项中。
开启后流水打标该科目时需选部门
{{ 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 }} 清空全部筛选
流程:① 上传发票(OCR 自动识别)→ ② 搜合同选回款计划加入分配清单 → ③ 编辑各笔金额 → ④ 确认登记
一张发票可拆分到多份合同的多个回款计划,分配总额必须等于发票金额
① 上传发票文件
{{ invoiceForm._attachment_filename ? '重新上传' : '选择 PDF / 图片' }} ✓ {{ invoiceForm._attachment_filename }} 🔍 OCR 识别中... ✓ 已自动填入识别结果
② 票面信息
③ 关联合同 + 回款计划 分配总额: ¥{{ formatMoney(invoiceAllocSum) }} / 发票总额 ¥{{ formatMoney(invoiceForm.total_amount) }} ⚠️ 不一致
最近合同: {{ c.contract_no }} · {{ c.client }} · 剩余可开¥{{ formatMoney(c.remain_invoice) }}
{{ c.contract_no }} {{ c.client }} 未开票 {{ c.plans.length }} 期
第{{ p.seq }}期 {{ p.plan_month || '-' }} ¥{{ formatMoney(p.amount) }}
📦 分配清单({{ invoiceAllocations.length }} 笔) 按剩余可开自动拆分
{{ a.contract_no }} 第{{ a.seq }}期/{{ a.plan_month || '-' }} 计划 ¥{{ formatMoney(a.plan_amount) }} 移除
从上方候选合同里点回款计划加入分配 按建议自动填充
📎 上传发票文件(PDF / 图片)→ 自动识别填表
{{ simpleInvoiceForm.attachment_path ? '重新上传' : '选择 PDF / 图片' }} ✓ {{ simpleInvoiceForm._attachment_filename || '已上传' }} 🔍 识别中... ✓ 已自动填入识别结果,请检查后保存
⚠ {{ simpleInvoiceOcrError }}(部分字段未识别,请手动补全)
销项(开给客户) 进项(供应商开来)
即发票上"价税合计(小写)"金额,是实际付款金额
{{ t.serial_no }} {{ t.tx_date }} {{ t.bank }} ¥{{ formatMoney(t.income + t.expense) }} {{ t.summary }}
⚠ 暂未关联流水:发票登记后会显示在"未挂流水"列表,提醒后续补登
原发票号:{{ redFlushForm.row.invoice_no }}
购买方:{{ redFlushForm.row.buyer_name || '—' }}
价税合计:¥{{ formatMoney(redFlushForm.row.amount) }}
将开具一张金额为负的红字发票冲抵原票,两张票都留档,不可作废/删除。
日期:{{ financeEditor.row.tx_date }} · 银行:{{ financeEditor.row.bank }}
摘要:{{ financeEditor.row.summary }}
{{ financeEditor.row.op_type }}: ¥{{ formatMoney(financeEditor.row.income + financeEditor.row.expense) }}
备注:{{ financeEditor.row.remark }}
让以后含"{{ financeEditor.whitelist_keyword }}"的流水自动归为此科目
农行 NY-XXXX / 华兴 HX-XXXX;唯一,保存后不可修改
收入 支出
余额将根据该账号历史流水自动计算
已关联 {{ txLinkedInvoices.length }} 张发票: {{ inv.invoice_no }} (¥{{ formatMoney(inv.amount) }}) 暂无关联发票 + 新增并关联发票({{ txFullEditorForm.op_type === '收入' ? '销项' : '进项' }})
提示:保存后可在「发票管理」里登记发票并关联本流水
不选则进入"待归类"。最终归属:{{ txFinalAccountLabel || '待归类' }}
将会把所有摘要含 "{{ financeBatch.row.summary }}" 且状态为待归类的 {{ financeBatch.row.n }} 笔流水统一归类。
可简化为对方名的一部分(模糊匹配)
仅摘要 摘要或备注 以后遇到自动归此科目
我的行政
我的部门
{{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}}
全体成员 {{orgMembers.length}}
+ 新建部门
{{orgSelectedDept||'全体成员'}} 共 {{orgFilteredMembers.length}} 人
查询新建员工导入名册
劳动合同、试用转正与离职交接新建劳动合同
离职交接任务
发起申请审批模板我的申请待审批全部申请
发起用章申请 模板配置 我的申请 待我审批 全部 查询 ↻
公司 部门 个人
下载考勤表
手工日考勤登记汇总(旧)
{{attMonthly.detail.row.dept||'-'}} {{attMonthly.detail.row.position||'-'}} {{attMonthly.detail.row.plan_days}} {{attMonthly.detail.row.actual_days}} {{attMonthly.detail.row.normal_days}} {{attMonthly.detail.row.rest_days}} {{attMonthly.detail.row.std_hours}} 小时 {{attMonthly.detail.row.actual_hours}} 小时 {{attMonthly.detail.row.late_count}} 次 / {{attMonthly.detail.row.late_minutes}} 分钟 {{attMonthly.detail.row.early_count}} 次 / {{attMonthly.detail.row.early_minutes}} 分钟 {{attMonthly.detail.row.absent_count}} 次 / {{attMonthly.detail.row.absent_minutes}} 分钟 {{attMonthly.detail.row.miss_card_count}} / {{attMonthly.detail.row.makeup_card_count}} 次 {{attMonthly.detail.row.out_count}} {{attMonthly.detail.row.abnormal_days}} {{attMonthly.detail.row.leave_annual}} 天 {{attMonthly.detail.row.leave_personal}} 天 {{attMonthly.detail.row.leave_sick}} 天 {{attMonthly.detail.row.leave_comp}} 天 {{attMonthly.detail.row.leave_marriage}} 天 {{attMonthly.detail.row.leave_maternity}} 天 {{attMonthly.detail.row.leave_paternity}} 天 {{attMonthly.detail.row.leave_childcare}} 天 {{attMonthly.detail.row.leave_other}} 天 {{attMonthly.detail.row.ot_total_hours}} 小时 {{attMonthly.detail.row.ot_workday_hours}} / {{attMonthly.detail.row.ot_restday_hours}} / {{attMonthly.detail.row.ot_holiday_hours}} 小时 {{attMonthly.detail.row.confirm_status||'-'}} {{attMonthly.detail.row.confirm_time||'-'}}
公司 部门 个人
绩效表(在线编辑 / 下载 / 上传覆盖)
同步生成 {{adminhrMonth}} 绩效表 上传绩效表
绩效源表(各部门原表留档) 刷新
批量上传自动分流时留档的原始表格(各部门绩效统计 / 业务提成 / 个人绩效登记 / 报告核算 / 样品交接 / 现场补贴)。「详情」原样查看;「在线编辑」保存后自动按类型重新解析回库,绩效总表再点「同步生成」刷新。
公司 部门 个人
维护薪资档案
薪资档案
绩效周期
工资表(在线编辑 / 下载 / 上传覆盖)
预生成下一月上传新月表重传工资表(修正数据)批量上传(选文件夹)
资产与办公用品台账{{adminhrLowStockAssets.length}} 项库存预警
新增资产/用品
会议室、访客与行政资源预约新建预约
车辆协同台账预约用车
招聘、培训与资质台账新增记录
人事分析(近12个月)
在职人员部门分布
人员异动汇总
60天内到期资质
{{adminhrChangeDialog.employee.name}}({{adminhrChangeDialog.employee.dept||'未分配'}}) {{adminhrEmpDetail.row.employee_no||'—'}}{{adminhrEmpDetail.row.name||'—'}}{{adminhrEmpDetail.row.dept||'—'}}{{adminhrEmpDetail.row.position||'—'}}{{adminhrEmpDetail.row.gender||'—'}}{{adminhrEmpDetail.row.birth_date||'—'}}{{adminhrEmpDetail.row.age!=null?adminhrEmpDetail.row.age:'—'}}{{adminhrEmpDetail.row.phone||'—'}}{{adminhrEmpDetail.row.education||'—'}}{{adminhrEmpDetail.row.title||'—'}}{{adminhrEmpDetail.row.hire_date||'—'}}{{adminhrEmpDetail.row.tenure_years!=null?adminhrEmpDetail.row.tenure_years+'年':'—'}}{{adminhrEmpDetail.row.regular_date||'—'}}{{adminhrEmpDetail.row.employment_type||'—'}}{{adminhrEmpDetail.row.contract_end||'—'}}{{adminhrEmpDetail.row.status||'—'}}{{adminhrEmpDetail.row.leave_date}}{{adminhrEmpDetail.row.id_masked||'—'}}{{(adminhrEmpDetail.row.emergency_contact||'—')+(adminhrEmpDetail.row.emergency_phone?'('+adminhrEmpDetail.row.emergency_phone+')':'')}}{{adminhrEmpDetail.row.account_phone||'—'}}停用{{adminhrEmpDetail.row.notes||'—'}}
追加任职不会清除成员既有部门。
将对已选 {{orgSelection.length}} 人生效,变更后每人仅保留目标部门(单部门)。
新增
改名会级联员工职别与「部门-职别」组合角色;删除时仍被员工使用会被拒绝。
{{orgDetailDialog.row.name}} {{orgDetailDialog.row.has_account?orgDetailDialog.row.phone:'—'}} {{orgDetailDialog.row.account_status}} {{(orgDetailDialog.row.depts||[]).join('、')||'—'}} {{orgDetailDialog.row.position||'—'}} {{orgDetailDialog.row.dept||'—'}} {{orgDetailDialog.row.report_to_name||'—'}}
归属变更留痕
{{templateFlowPreview(((adminhrApprovalTemplates.find(t=>t.id===adminhrRequestDialog.form.template_id)||{}).nodes)||[]).join(' → ')}}
{{index+1}}删除
新增节点
选择文件(可多选) {{sealApplyDialog.form.file_type==='采购合同'?'上传采购合同电子稿':'上传待盖章文件'}}
{{f.name}}({{sealFileSizeText(f.size)}})移除
{{sealTemplatePreview}}
已有模板新建
{{i+1}} 删除
新增节点
系统管理
{{ dbTables.length || '' }}
🗃
数据库管理
查看、搜索、编辑、删除数据表记录,导出CSV
🤖
AI 管理
AI模型切换、API Key配置与管理
👥
用户岗位管理
用户岗位分配、岗位增删管理
🔒
系统有效期
系统授权到期控制,过期后普通账号无法登录
💬
飞书推送配置
配置飞书Webhook机器人,采样完成自动推送通知
📋
任务分配规则
配置检测项目与负责人对应关系,自动派发任务
📜
操作日志
全流程操作记录(含财务删改),不可篡改,可追溯
🖊
审计日志
统一审计追踪:合同/财务/检测/报告/权限关键写操作前后快照,只读
📍
点位库管理
监测点位档案、经纬度、历史记录、Excel导入
🔐
权限管理
按账号/部门细粒度配置功能权限,支持 Excel 导入
{{ accountList.length || '' }}
👤
用户账号管理
新增、编辑、删除登录账号,重置密码、停启用
🔄
系统更新
一键拉取最新代码并重启服务,升级到最新版本
⚙
系统配置
编码规则前缀、数据字典维护(样品处置方式等)
< 返回系统管理 ⚙ 系统配置
刷新 新增字典项
< 返回系统管理 🔄 系统更新 重新检查
当前版本
{{ sysUpdate.currentVersion || sysVersion.version || '—' }}
→
服务器分支
{{ sysUpdate.branch || 'master' }}
检查中… 检查失败 有新版本(落后 {{ sysUpdate.behind }} 个提交) 已是最新
gitee 上最新提交
{{ sysUpdate.latestCommit }}
{{ sysUpdate.latestTime }}
{{ sysUpdate.updating ? '正在更新并重启…' : (sysUpdate.hasUpdate ? '立即更新到最新版本' : '重新拉取最新代码') }} 点击后服务器会备份数据库、拉取最新代码并自动重启,约 1~3 分钟后可用。
上次更新 {{ sysUpdate.lastLogTime }} 成功 失败 进行中 中断/未完成 {{ sysUpdate.showLastLog ? '收起日志' : '查看完整日志' }}
{{ sysUpdate.lastLog }}
{{ sysUpdate.runLog }}
说明:服务器为 Mac,更新动作 = 备份数据库 → 从 gitee 拉取最新代码 → 安装新依赖 → 导入新标准限值 → launchctl 重启服务 → 健康检查(即 mac_setup/upgrade.sh)。
该操作受「权限管理 · 系统运维 · 一键系统更新」权限管控,仅授权账号可执行。
若网络异常或本地代码冲突,脚本会中止并在上方日志说明,数据库已自动备份可回滚。
< 返回系统管理 👤 用户账号管理 刷新 + 新增账号 共 {{ accountList.length }} 个账号(启用 {{ accountList.filter(u => u.status==='启用').length }})
手机号(账号) 姓名 部门 岗位 状态 密码 飞书 ID 创建时间 操作
{{ u.phone }}管理员 {{ u.name }} {{ u.dept || '—' }} {{ u.role || '—' }} {{ u.status || '启用' }}已锁定 {{ u.password || '—' }} {{ u.feishu_id || '—' }} {{ u.created_at || '—' }} 编辑 重置密码 解锁 删除
暂无匹配账号
手机号*
姓名*
初始密码*
部门
岗位*
⚠ 岗位将从「{{ accountForm.origRole }}」改为「{{ accountForm.role }}」,已配置的权限会自动迁移到新岗位。
状态 启用 停用
飞书 ID
目标账号:{{ accountResetPwdTarget.name }}({{ accountResetPwdTarget.phone }}) {{ accountResetPwdTarget.role }}
< 返回系统管理 🔐 权限管理 刷新 📥 导出权限 Excel 📤 上传本地 Excel 导入 🔄 重置岗位初始权限 共 {{ permAdmin.users.length }} 个账号
全部展开 全部折叠
无匹配账号
👈 请从左侧选择一个账号
< 返回系统管理 数据库管理
选择表: 查询 导出CSV 刷新
{{ c.name }} {{ dbSortDir === 'ASC' ? '↑' : '↓' }} PK 操作
暂无数据
共 {{ dbTotal }} 条,当前第 {{ Math.floor(dbOffset / dbLimit) + 1 }} / {{ Math.ceil(dbTotal / dbLimit) }} 页
上一页 下一页
< 返回系统管理 AI 管理
AI 模型管理
{{ m.name }} 当前使用 {{ (m.protocol||'openai')==='anthropic' ? 'Anthropic 协议' : 'OpenAI 协议' }}
模型ID: {{ m.id }}
API: {{ m.api_url }}
Key 变量: {{ m.api_key_env || '未设置' }}
切换使用 编辑 删除
添加新模型 添加模型
WPS 在线编辑(WebOffice)
启用后,报价单/记录表的在线编辑走 WPS WebOffice(金山云编辑器,单实例 HTTPS 即可); 不启用走 OnlyOffice(仅 8100 实例)。回调网关填:{{ wpsCfg.public_base || 'https://公网域名' }}/wps
保存配置 保存即生效,无需重启
API Key 管理
{{ keyName }} {{ val || '(未设置)' }} 修改
添加新 Key
保存
< 返回系统管理 用户岗位管理
用户岗位分配
刷新
姓名 手机号 部门 岗位 飞书ID 状态 密码
{{ u.name }} {{ u.phone }} {{ u.dept }} {{ u.status }} 🔑 重置
暂无用户
岗位管理
岗位名称:
岗位说明:
新增岗位
序号 岗位名称 说明 操作
{{ idx + 1 }} {{ r.name }} {{ r.description }}
暂无岗位
< 返回系统管理 系统有效期
当前状态:永久有效(未设置到期时间) 当前状态:已过期({{ adminConfig.expire_date }}),普通账号无法登录 当前状态:有效期至 {{ adminConfig.expire_date }},剩余 {{ daysLeft }} 天
设置有效期 清除(永久有效)
快捷设置: +30天 +90天 +半年 +1年
过期后所有普通账号将无法登录,仅管理员(18928105500)可正常进入系统。
< 返回系统管理 飞书推送配置
获取群列表
每天定点给有待办的人推一张汇总卡片 设备/质量类每日汇总自动推送(默认关,避免群消息轰炸)
按类别一键开关各类飞书推送,关闭后该类消息不再发送(站内通知不受影响)
{{ c.label }}
立即同步绑定 立即推送今日待办 已绑定 {{ feishuBindStatus.bound }} 人
{{ feishuBindStatus.unbound.map(u => u.name + '(' + u.phone + ')').join('、') }}
已绑定 {{ feishuBoundUsers.length }} 个账号,点「测试」给该账号点对点发一张测试卡片,验证系统与该账号飞书是否联通
{{ u.name }} {{ u.phone }} {{ u.feishu_id_masked }} ✓ 已送达 ✗ {{ feishuUserTestState[u.phone] }} 测试
暂无已绑定账号,先点「立即同步绑定」
保存配置 发送测试
使用步骤:
1. App ID 和 Secret 已预填,一般不需要改
2. 在飞书中把机器人添加到目标群
3. 点"获取群列表",选择要推送通知的群
4. 保存配置,点"发送测试"验证
5. 启用后,样品提交/流转单接收会自动推送到群
< 返回系统管理 任务分配规则
添加分配规则
添加
已有规则
刷新
样品类型 检测项目 负责人 手机号 操作
{{ a.sample_type }} {{ a.test_item }} {{ a.assigned_name }} {{ a.assigned_phone }}
暂无规则(未配置时,通知将发给所有检测员)
< 返回系统管理 {{ auditFilter.scope==='finance' ? '💰 财务部操作日志' : '操作日志' }}
⚠️ 此页记录所有财务关键操作(流水/发票/销账/回款计划的增删改),用于防止误删/误改重要财务数据
全部 💰 财务部 └ 流水 └ 发票 └ 销账 └ 回款计划 用户管理 实验室
日期: 至 查询 重置 导出Excel(CSV) 导出PDF 共 {{ auditLogs.length }} 条记录
时间 分类 操作 操作人 详情
{{ l.created_at }} {{ scopeLabel(l.target_type) }} {{ l.action }}
{{ l.operator_name }}
{{ l.operator_phone }}
{{ l.detail }}
暂无日志
< 返回系统管理 🖊 审计日志 统一审计追踪:关键写操作前后快照,只读,不可修改/删除
日期: 至 查询 重置 共 {{ trailTotal }} 条记录
< 返回系统管理 点位库管理
搜索 {{ ptShowAdd ? '收起' : '新增点位' }}
添加
编码点位名称 受检单位样品类型 经度纬度 操作
{{ 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 || '未指定' }}
📌 本次为补采排期,仅涉及以下 {{ 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}} 条
合同状态
{{ contractStatusLabel(contractLifecycleDialog.contract) }}
签约金额
¥{{ formatMoney(contractLifecycleDialog.contract.total_amount) }}
已开票
¥{{ formatMoney(contractLifecycleDialog.contract.invoiced_amount) }}
已收款 / 已销账
¥{{ formatMoney(contractLifecycleDialog.contract.paid_amount) }}
销账 ¥{{ formatMoney(contractLifecycleDialog.contract.cleared_amount) }}
{{ contractLifecycleDialog.contract.client || '未填写甲方' }} · {{ contractLifecycleDialog.contract.testee_unit || '未填写乙方' }} · 客户经理 {{ nameOnly(contractLifecycleDialog.contract.account_manager) || '未填写' }} · 客服 {{ nameOnly(contractLifecycleDialog.contract.customer_service) || '未填写' }}
签订状态
已签订
合同归档
{{ contractLifecycleDialog.contract.archived ? '已完成' : '待处理' }}
审批回款计划
{{ ((contractLifecycleDialog.contract.payments||[]).length || (contractLifecycleDialog.contract.approved_payments||[]).length) ? '已落实' : '待补齐' }}
财务关联
发票 {{ contractLifecycleDialog.invoices.length }} 笔 · 流水 {{ contractLifecycleDialog.txs.length }} 笔
🧾 已关联发票({{ contractLifecycleDialog.invoices.length }})
暂无关联发票
🏦 已关联回款流水({{ contractLifecycleDialog.txs.length }})
暂无关联回款流水
关联合同↔发票会自动累计「已开票金额」;关联合同↔银行流水会自动累计「已销账金额」。
「已收款」列为历史数据,可与「已销账金额」对比校验真假。
交易日期:{{ linksDialog.ctx.tx_date || '-' }}  金额:¥{{ Number(linksDialog.ctx.tx_amount || 0).toLocaleString() }}
{{ createPlanDialog.contract_no }}
编辑回款计划:{{ 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 || '-' }} {{ p.plan_month || '-' }} ¥{{ formatMoney(p.amount) }} 已收 已销账 新增 未收 删除
暂无回款计划
+ 增加一期 按签约金额自动平摊未收期
💡 已收款 / 已销账的期不可改;未收期可改月份/金额、可删;可增加新期。保存时强制校验:回款计划合计必须等于签约金额。
加载中...
取消 保存全部变更
签约金额:¥{{ 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))) }}
历史跟进
新增收款方
{{ row.contract_no }} · {{ row.client || '(合同信息加载中)' }} 分包费余额(参考)¥{{ formatMoney(row.remaining) }}
分摊合计 ¥{{ formatMoney(paymentSplitTotal()) }} / 申请金额 ¥{{ formatMoney(paymentRequestDialog.form.amount || 0) }} 按剩余额度自动分摊
选择合同后需为每个合同填写分摊金额,合计须等于申请金额。
上传附件
{{file.name}}
{{line}}
已有模板新建
{{i+1}}删除
新增节点
已有模板新建
{{i+1}}删除
新增节点
已有模板新建
{{i+1}}删除
新增节点
查询 新增收款方
公司个人 保存清空
公司个人
审批结果:已通过 · 通过时间:{{paymentPayDialog.row.approved_at||'-'}} · 审批人:{{(paymentPayDialog.row.approvals||[]).map(a=>a.approver_name).filter(Boolean).join('、')||'-'}}
{{paymentPayDialog.row.request_no}} · {{paymentPayDialog.row.payee}}
{{item.action}}{{item.detail}}
{{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.bank_branch || '-'}}
付款方式 / 账户类型
{{paymentRequestDetailDialog.data.request.payment_method || '-'}} / {{paymentRequestDetailDialog.data.request.payee_account_type || '-'}}
申请部门 / 申请人
{{paymentRequestDetailDialog.data.request.dept || '-'}} / {{paymentRequestDetailDialog.data.request.initiator_name}}
申请时间
{{paymentRequestDetailDialog.data.request.submitted_at || paymentRequestDetailDialog.data.request.created_at || '-'}}
付款用途
{{paymentRequestDetailDialog.data.request.purpose || '-'}}
部门全路径
{{paymentRequestDetailDialog.data.request.dept_path || paymentRequestDetailDialog.data.request.dept || '-'}}
抄送人
{{(paymentRequestDetailDialog.data.cc||[]).map(c=>c.name).join('、') || '-'}}
关联合同
{{cc.contract_no}} · {{cc.client || '(合同不存在)'}}分摊 ¥{{formatMoney(cc.amount)}}合同详情
{{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)}}
申请附件 后补上传
PDF
PDF
{{isImageAttachment(file)?'查看/下载':'下载'}} {{file.name}}
审批流
暂无审批节点
分摊付款记录
操作日志 {{item.action}}{{item.detail}}
{{item.operator_name || item.operator_phone}}
暂无操作日志
评论
发表评论
选择一笔已发生的支出流水,再把金额分摊到一张或多张已批准付款申请。智能建议只辅助填充,提交前仍可人工调整。应用智能建议({{paymentLinkDialog.suggestions.length}})
系统按收款方、合同号、金额及日期评分;只展示评分达到阈值的候选申请。
已批准付款申请本次分摊:¥{{formatMoney(paymentLinkTotal)}};流水可用:¥{{formatMoney(paymentLinkRemaining)}}
版本按保存顺序留痕,可直接比较金额、居间费、分包费及条款备注变化。
{{ invoiceApplicationIssueDialog.buyer_name }} · ¥{{ formatMoney(invoiceApplicationIssueDialog.amount) }}
选择 PDF / 图片 已上传,可供申请人下载
购买方:{{ invoiceAppContractDetailDialog.buyerName }} · 开票金额:¥{{ formatMoney(invoiceAppContractDetailDialog.amount) }}
框架合同提醒:本次开票关联的合同中包含框架合同,需要先对账确定实际收款金额、开具发票给予客户再进行回款。
关联合同开票 非合同开票(无合同的临时开票)
{{templateFlowPreview(invoiceApplySelectedTemplate.nodes).join(' → ')}}
非合同开票:适用于没有合同的临时开票(非检测业务、非非检测业务合同),无需关联合同与回款计划;审批通过后财务按申请内容直接开票,发票台账中该张发票不带合同号。
添加
智能推荐合同:
{{ c.contract_no }} · {{ c.client || '' }} · ¥{{ formatMoney(c.suggest_amount || c.amount || 0) }}
框架合同提醒:本次开票关联的合同中包含框架合同,金额 / 采样频次不固定。请先对账确定实际收款金额后再开具发票。
分摊合计:¥{{ formatMoney(invoiceApplyAllocSum) }}
添加
合同:{{ createPaymentPlanDialog.contract_no }} · {{ createPaymentPlanDialog.client }}
已收完款,签约金额:¥{{ formatMoney(createPaymentPlanDialog.remain_amount) }} 剩余未收款:¥{{ formatMoney(createPaymentPlanDialog.remain_amount) }}
期数: (修改期数自动刷新,默认平均分配)
合计:¥{{ formatMoney(createPaymentPlanSum) }} {{ (createPaymentPlanDialog.paid_amount || 0) >= (createPaymentPlanDialog.total_amount || 0) ? '(已收完款,需等于签约金额)' : '(需等于剩余未收款)' }}
签发后,系统会推送消息到指定的客户经理,提示其接收纸质报告。
签发前必填字段缺失:{{ reportIssueForm.missingFields.join('、') }}
{{ reportIssueForm.task_no }} {{ reportIssueForm.testee_unit || '—' }}
{{ reportIssueForm.sample_periods_text || '未填写' }}
{{ reportIssueForm.analysis_periods_text || '未填写' }}
{{ currentUser.name }}
报告编号:{{ reportUploadForm.report_no }}
附件类型:{{ reportUploadForm.kind === 'check_version' ? '核对版' : '盖章版' }}
选择文件
暂无需要您确认或签收的报告。