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

当前页面版本: {{ clientVersion }}
服务器最新版本: {{ latestVersion }}
该手机号下有多个岗位账号,请选择本次登录的岗位:
{{ r.role }} {{ r.dept }}
密码规则:≤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') ? '可用' : '无权限' }}
📊
数据看板
业务 / 生产 / 财务多维度数据分析
业务看板(合同·签约金额)
生产看板(采样·检测·报告)
财务看板(收支·成本)
⓵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.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.slice(0,3).map(x=>x.task_no+' '+x.issue).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
自动生成检测报告
从数据库生成
输入报告编号,自动拉取采样和检测数据
OCR识别生成
上传检测数据图片,AI自动识别整理
第一步:选择任务
拉取数据
或直接选择已有任务:
{{ t.task_number }}({{ t.company_name }},{{ t.sample_count }}个样品)
第一步:上传检测数据

📤

点击或拖拽文件到此处上传

支持 PNG / JPG 图片、Excel(.xlsx)、Word(.docx),可多选混传

{{ f.icon }} {{ f.file.name }}
✕
已选择 {{ files.length }} 个文件 {{ recognizing ? '识别中...' : '开始识别' }}
🤖 OCR 识别进度 ({{ reportOcrProgress.current }}/{{ reportOcrProgress.total }})
{{ log }}
第二步:本地 OCR 识别结果
本地 OCR 识别完成,共识别 {{ fileCount }} 个文件。以下是提取的原始文本,请确认内容是否完整。
{{ ocrText }}
✨ AI 正在整理数据 ▊
{{ reportAiStream }}
上一步:重新上传 {{ structuring ? 'AI 整理中...' : '下一步:AI 智能整理' }}
{{ reportMode === 'db' ? '第二步:核对数据(可编辑)' : '第三步:确认结构化数据' }}
{{ reportMode === 'db' ? '已从数据库拉取数据,请核对以下内容是否正确,可直接修改。' : 'AI 已将 OCR 文本整理为结构化数据,请核对以下内容是否正确,可直接修改。' }}
{{ reportDbStats.sampleCount }}
样品数
{{ reportDbStats.itemCount }}
检测项目
{{ reportDbStats.ndCount }}
未检出 (ND)
{{ reportDbStats.wastewaterCount }}
废水数据
{{ reportDbStats.gasCount }}
废气数据
封面信息
检测概况
气象参数
检测内容
样品类型采样点位检测项目样品状态
删
+ 添加行
{{ wt.title || '废水检测结果 ' + (wi+1) }}
采样点位检测项目单位检测结果标准限值
删
+ 添加行
有组织废气检测结果
采样点位检测项目标干流量实测浓度排放速率标准限值
删
+ 添加行
锅炉废气检测结果
采样点位检测项目标干流量实测浓度折算浓度排放速率标准限值
删
+ 添加行
无组织废气检测结果
检测项目参照点1#监控点2#监控点3#监控点4#标准限值
删
+ 添加行
厂区内无组织废气
采样点位检测项目检测结果标准限值
删
+ 添加行
噪声检测结果
采样点位主要声源昼间结果夜间结果昼间标准夜间标准
删
+ 添加行
附表1:检测方法、分析仪器、检出限
样品类型检测项目检测方法分析仪器检出限
删
+ 添加行
上一步
报告模板:
{{ generating ? '生成中...' : '📄 一键生成报告' }}

✅

报告生成成功!

{{ resultFilename }}

下载报告 生成新报告
📈 业务数据 刷新 (数据尚未接入,以下为占位)
—
合同总数
已签订累计
—
本月签约金额
新签+续签
—
本月任务数
下单任务
—
加急任务
priority=加急
📊 近12个月签约金额趋势
ECharts 柱状图占位
🥧 客户类型分布
ECharts 饼图占位
🏆 TOP10 客户(按合同金额)
数据表格占位
🏭 生产数据 刷新 (数据尚未接入,以下为占位)
—
本月采样任务
—
完成率
—
超期率
—
样品总数
—
检测条目
👷 采样员工作量排行
ECharts 横向柱状图占位
🧪 样品类型分布
ECharts 饼图占位(废水/有组织/无组织/噪声/土壤)
📅 日任务完成趋势(近30天)
ECharts 折线图占位
💰 财务数据 刷新 {{ receivableSopVisible ? '收起 SOP' : '查看应收账款 SOP' }} 应收账款 = 已开票未收 + 计划月已到+报告已交付未收
📌 应收账款的判定规则与流程 SOP
应收账款 = 满足下列任一条件 + 未收款
① 已开发票:财务"发票管理"录入发票后,对应回款计划立即列为应收
② 回款计划月已到 + 报告已交付:客户经理点"接收报告"后自动联动
回款计划月未到 / 报告未交付 → 不计入应收(视为正常履约中)
谁该做什么动作
📥 客户付款 → 财务在"回款销账"勾"已收"
🧾 开票 → 财务在"发票管理"新增发票(绑回款计划)
📦 报告交付 → 客户经理在报告任务流程点"接收报告"
兜底:合同详情→回款计划→"标记交付"按钮
¥{{ formatMoney(receivableStats.total_amount) }}
应收账款总额
{{ receivableStats.total_contracts || 0 }}家客户 · {{ receivableStats.total_plans || 0 }}笔回款
¥{{ formatMoney(receivableStats.bucket_0_30) }}
0-30 天
正常账期
¥{{ formatMoney(receivableStats.bucket_31_60) }}
31-60 天
需要催款
¥{{ formatMoney(receivableStats.bucket_61_90) }}
61-90 天
明显逾期
¥{{ formatMoney(receivableStats.bucket_90_plus) }}
90+ 天
高风险 / 坏账
📋 应收账款明细 账龄: {{ receivableBucket }} 天 查询 重置 共 {{ receivableTotal }} 笔
合同编号 委托单位 受检单位 期次 计划月 应收金额 原因 起算日 账龄(天) 客户经理
{{ r.contract_no }} {{ r.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 ? '加载中...' : '暂无应收账款' }}
📏 执行标准查询 查询 新增标准 共 {{ kbStandards.length }} 条
📊 标准限值查询 执行标准 {{ kbLimStandards.length }} 份 标准限值 {{ kbLimTotalRows.toLocaleString() }} 条
查询 清空
常用: {{ s }}
共 {{ kbLimResults.length }} 条结果 (已达上限 2000 条,请收窄条件) · 标准 {{ kbLimFilter.standard }} · 项目 {{ kbLimFilter.test_item }}
🔍
请选择标准号或输入检测项目开始查询
数据库共 {{ kbLimTotalRows.toLocaleString() }} 条限值记录,覆盖国标、行标、广东地标
🤖 基于企业知识库的AI问答
· AI 仅基于知识库已入库文件回答,不使用训练数据或常识补充
· 未收录的内容会如实告知"知识库无相关资料"
· 支持文档格式:Word / PDF / Excel / TXT / Markdown(图片类文件无法进入检索)
💬
输入问题开始对话。例如:
"颗粒物采样的空白样规则是什么?"
"HJ836 对无组织废气监测有什么要求?"
{{ m.role==='user' ? '我' : (m.model_name || 'AI') }}
{{ m.content }}
📎 参考资料: {{ s.category }} · {{ s.title }}
AI 正在检索并思考...
发送 清空
📋 企业 SOP(标准操作流程)
· 以下流程基于领航检测 AI 系统的实际功能整理,每条 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) }}
周期: 今日 本周 本月 本季度 本年 自定义 导出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 }} 天 校准补录已截止 仅小组长可操作
暂无出库记录
单号:{{ 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 }}
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天内到期
搜索 + 新增车辆
第一步:获取任务数据
📋 方式一:采样主管派给我的任务单
点击任一行直接跳到第三步生成表格 刷新
暂无派给您的任务单
任务编号 受检单位 计划日期 状态 角色 操作
{{ t.task_no }} {{ t.company_name }} {{ t.plan_date || '—' }} {{ t.status }} 组长 采样员 载入并生成
🔎 方式二:按任务编号载入
载入任务数据 免 OCR/AI,直接跳到第三步确认 & 生成表格
📤 方式三:上传任务下达单

📤

点击或拖拽任务下达单文件

支持图片(PNG/JPG)、Word(DOC/DOCX)、Excel(XLS/XLSX)

{{ f.file.name.endsWith('.xlsx') || f.file.name.endsWith('.xls') ? '📊' : '📄' }}
{{ f.file.name }}
✕
已选择 {{ samplingFiles.length }} 个文件 {{ samplingOcring ? '识别中...' : '开始识别' }}
🤖 OCR 识别进度 ({{ samplingOcrProgress.current }}/{{ samplingOcrProgress.total }})
{{ log }}
第二步:OCR 识别结果
本地 OCR 识别完成,请确认内容完整后进行 AI 解析。
{{ samplingOcrText }}
✨ AI 正在解析任务数据 ▊
{{ samplingAiStream }}
上一步 {{ samplingParsing ? 'AI 解析中...' : '下一步:AI 解析任务数据' }}
第三步:确认任务数据与样品编号 💾 更新并保存 ← 返回上级 ↩ 返回工作台
基本信息
监测点位({{ samplingTaskData.points ? samplingTaskData.points.length : 0 }} 个)
点位序号样品类型监测点位检测项目执行标准点位数天数频次
{{ samplingPointIndexes[i] }} 删
+ 添加点位
样品编号预览(共 {{ samplingPreview.reduce((s,sr)=>s+(sr.sample_ids?sr.sample_ids.length:0),0) }} 个编号,{{ samplingPreviewGrouped.length }} 个点位) 🔄 刷新编号预览
({{ gi + 1 }}) {{ grp.point_name }} ({{ grp.sample_type }}) {{ grp.total_item_count }} 个检测项目 :{{ grp.regular_sample_count }} 个常规样、{{ grp.qc_sample_count }} 个质控样
点位 检测天数 检测频次 {{ 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 }}
🛠 质控样人工调整 系统自动生成的质控样有偏差时可在此手动增减;调整后必须点"💾 保存调整"才生效 + 增加质控样 💾 保存调整
暂无质控样
{{ qc.qc_type === 'parallel' ? '平行' : qc.qc_type === 'breakthrough' ? '穿透' : qc.qc_type === 'transport_blank' ? '运输' : '空白' }} {{ qc.sample_id }} {{ qc.test_items }} ×
⚠ 已有人工调整未保存,点"💾 保存调整"后调整结果才会写入数据库
质控类型 空白(K) 平行(A) 穿透(C)
挂载到
样品编号
系统自动算下一个可用编号;如果不满意可以手动改成你想要的
📌 样品编号 {{ samplesConfirmed ? '✓ 已确认 ('+ samplesConfirmedCount +' 个) · 重新生成' : '✅ 确认并生成样品编号' }} 已固化到数据库 · 现场录数/报告生成都用这一份 点确认后,样品编号写入数据库,后续模块(项目录数、报告生成)都用同一份
生成表格
{{ samplingGenHandover ? '生成中...' : '1. 样品交接记录表' }} {{ samplingGenRecords ? '生成中...' : '2. 原始记录表' }} {{ surveyGenerating ? '生成中...' : '3. 生成现场调查记录表' }} 查看/编辑 {{ samplingGenPreservation ? '生成中...' : '4. 样品采样及保存方法' }} 📐 5. 录入流量校准记录表
已生成 客户已签字 / 待生成 等待客户签字 未填写 基本信息从当前任务自动带过来
💧 废水排口({{ surveyForm.wastewater_outlets.length }}) + 添加 从任务点位预填
💨 废气排口({{ surveyForm.exhaust_outlets.length }}) + 添加
✍ 采样员签字({{ currentUser.name }})
请在此区域签字
🗑 清除重签 ✓ 已保存
✍ 客户签字 本机直签 二维码
✓
客户已签字
{{ surveyState.client_signer }} · {{ surveyState.client_signed_at }}
客户在此签字
🗑 清除 ✓ 提交客户签字
客户用手机扫二维码签字
📋 复制链接 🔄 刷新
先点下面"保存调查 + 生成客户签字链接"
之后即可让客户当场签或扫码远程签
{{ surveyState.id ? '更新调查 + 重新签字' : '保存调查 + 生成客户签字链接' }} 📄 生成 LDG-XC-017 word 文档 先点左侧按钮保存调查后即可生成(未签字也可生成临时版,签字后再次点会覆盖) ⚠️ 客户未签字,将生成"未签字版"(客户签字后可重新点击覆盖)
已生成 {{ samplingGeneratedFiles.length }} 个文件 🔄 刷新
📷 现场采样照片 共 {{ 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 }} ↩ 撤销提交 刷新编号预览 生成样品二维码 新建采样任务
⚙ 管理员运维: 清空原来数据 计划月: 批量导入新单(选择文件夹) 批量导入新单(选多个文件) ⚠ 仅支持 .docx {{ bulkImportProgress }}
{{ 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 }}
接收任务 等待派单完善 开始任务 等待小组长开始 完成任务 现场记录
现在
现在
📊 {{ fieldItemReadingForm.category }} 字段
= {{ (parseFloat(fieldItemReadingForm.readings.conductivity) * 10).toFixed(2) }} μS/cm(入库时自动换算)
📸 拍仪器小票自动填 已匹配「{{ fieldStripOcrModel }}」({{ fieldCurrentInstrumentModel }}) {{ fieldCurrentInstrumentModel }} 暂无 OCR 模板 先选采样仪器
⏳ 识别中...
{{ s.parsed.report_type || '?' }} · 文件号 {{ s.parsed.file_no || '-' }} · {{ s.parsed.start_time || '' }} 删除
烟温 {{ s.parsed.smoke_temp ?? '-' }}℃ · 含湿量 {{ s.parsed.humidity ?? '-' }}% · 标干流量 {{ s.parsed.std_flow ?? '-' }} m³/h
O₂ {{ s.parsed.o2 ?? '-' }}% · SO₂ {{ s.parsed.so2 ?? '-' }} · NO {{ s.parsed.no_conc ?? '-' }} · NO₂ {{ s.parsed.no2_conc ?? '-' }} · NOx {{ s.parsed.nox_conc ?? '-' }}
环温 {{ s.parsed.ambient_temp ?? '-' }}℃ · 大气压 {{ s.parsed.atm_pressure ?? '-' }}kPa · 流量 {{ s.parsed.flow_rate ?? '-' }}L/min · 工/标/参体 {{ s.parsed.working_volume ?? '-' }}/{{ s.parsed.standard_volume ?? '-' }}/{{ s.parsed.reference_volume ?? '-' }} {{ s.parsed.volume_unit || '' }}
🌬️ 综合采样器附加数据(MH1205 等)
🧪 烟气 {{ fieldItemReadingForm.readings.flue_gas_runs.length }} 次原始(写入记录表时按多行展开)
#时段O₂SO₂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('、') }}
该任务尚未绑定出库单,请先在「仪器管理」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.checkout_date }} ~ {{ ck.checkout_date_end }}
仪器数:{{ ck.instrument_count }}台
{{ it.instrument_code }}
没有包含任务日期的可用出库单,请先在「仪器台账-出入库管理」中创建对应日期范围的出库单。
直接派发给采样员 先派发给组长分配
其他
样品类型 监测点位 检测项目 点数 天数 频次 执行标准
删
暂无点位
+ 添加点位
已上传文件:{{ taskOrderPreviewFilename }}
必备表格清单 ({{ requiredDocs.done }}/{{ requiredDocs.total }})
{{ m }}
必备表格已全部完成
{{ formatDocFilename(f.filename) }}
已通过 已驳回 待审核
文件预览 识别数据 下载原文件
以下为 AI 识别结果,原文件已归档,请逐字段核对后保存
明细行 + 添加行
任务编号:{{ quickDispatchTarget.task_no }}
受检单位:{{ quickDispatchTarget.company_name }}
地址:{{ quickDispatchTarget.address }}
计划日期:{{ quickDispatchTarget.plan_date || '未排期' }}
当前状态:{{ quickDispatchTarget.status }}
直派采样员 派给组长
✓ 已应用「第{{ quickDispatchAppliedGroup.group_no }}组」配置(组员 {{ (quickDispatchAppliedGroup.members||[]).length }} 人 + 车辆 {{ quickDispatchAppliedGroup.vehicle_plate || '无' }}),可手动调整 ↓
任务编号:{{ partialAuditTask.task_no }}
受检单位:{{ partialAuditTask.company_name }}
小组长:{{ partialAuditTask.group_leader_name }}
采样员:{{ partialAuditTask.assigned_names }}
计划日期:{{ partialAuditTask.plan_date }}
场次总数:{{ partialAuditTask.session_count || 1 }}
点位采样情况({{ partialAuditPoints.length }} 个点位)
{{ i+1 }}. {{ p.point_name || '—' }} {{ p.sampling_status || '未采' }} 第 {{ p.completed_session_no }} 场次完成
{{ p.items || '' }}
未采原因: {{ p.reschedule_reason_category || '—' }}
{{ p.reschedule_reason_detail || '—' }}
上报人:{{ p.reschedule_by_name }} · {{ p.reschedule_at }} · GPS {{ p.reschedule_gps[0].toFixed(4) }},{{ p.reschedule_gps[1].toFixed(4) }}
无照片
请确认样品编号无误后再生成二维码。生成后将自动创建样品记录和流转单。
本次将生成 {{ samplingPreview.reduce((s,sr)=>s+(sr.sample_ids?sr.sample_ids.length:0),0) }} 个样品的二维码
共 {{ samplingQrcodeResults.length }} 个样品二维码
{{ item.sample_id }}
📊 市场部仪表盘 数据范围:已签约合同(排除草稿/待签约) 合同总数 {{ mktDash.total_contracts }} 🔄 刷新
经营分析导出导出经营分析
{{ card.label }}缺失
{{ card.value }}
占 {{ ((card.value / mktDash.total_contracts) * 100).toFixed(1) }}%
⬇️ 导出数据缺失合同 📤 导入更新
经营转化与合同预警刷新预警
草稿{{ mktOps.stages['草稿']||0 }}
审批中{{ mktOps.stages['审批中']||0 }}
待签约{{ mktOps.stages['待签约']||0 }}
已签约{{ (mktOps.stages['待下单']||0)+(mktOps.stages['履约中']||0)+(mktOps.stages['已完成']||0) }}
合同健康待办
客户经理待跟进
客户历史经营(报价次数、签约、开票、回款)
📊 自然月累计实收金额(按签订日期)

总条数:{{ importMissingResult.total }}

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

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

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

💬 市场部智能问数
用自然语言查询市场部业务数据,例如:今年已签约合同总金额是多少?
查询 清空会话
示例: {{ q }}
你可以试试:
{{ s }}
🧾 开票申请 我的 / 协作合同流程 + 新增申请 刷新 开票申请必须关联合同,系统自动拦截超额开票和逾期未归档合同。
暂无开票申请
暂无草稿
合同编号类型委托方受检方状态 发起人发起时间操作
{{ 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].point_count||0)*Number(quotItems[it._idx].days||0)*Number(quotItems[it._idx].frequency||0)*Number(quotItems[it._idx].times_per_year||0)*Number(quotItems[it._idx].unit_price||0)).toLocaleString() }} 删
+ 添加库内项目
🟠 库外参数(不加 CMA 标识) 共 {{ quotOuterItems.length }} 项
检测类型
点位名称
检测项目(可多选)
+ 添加库外项目
检测类型 点位名称 检测项目 点位数天数频次次/年单价 小计
暂无库外参数
{{ (Number(quotItems[it._idx].point_count||0)*Number(quotItems[it._idx].days||0)*Number(quotItems[it._idx].frequency||0)*Number(quotItems[it._idx].times_per_year||0)*Number(quotItems[it._idx].unit_price||0)).toLocaleString() }} 删
📜 服务条款(写入报价单末尾,最多 15 条)
重置条款 + 添加条款
暂无条款,点击"+ 添加条款"或上传带条款的 Excel 自动识别。
{{ ci + 1 }}. 删
🏦 开户信息
开户名:
开户银行:
开户账号:
💰 费用预估
检测费:¥ {{ quotEstimate.detection.toLocaleString() }} 采样费: 重置 原¥{{ quotEstimate.autoSampling.toLocaleString() }} 检测报告编制费: 重置 原¥{{ quotEstimate.autoReportFee.toLocaleString() }} 税费(6%):¥ {{ quotEstimate.tax.toFixed(2) }} 合计:¥ {{ quotEstimate.total.toFixed(2) }}
上一步 返回工作台
保存草稿并返回 {{ 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 }}
待归档
我发起的 待我审批 待签约 待归档 搜索 · 当前展示全公司数据 · 仅展示原/现客户经理或客服相关的合同 + 发起报价/签约审批发起合同变更审批合同变更审批
暂无数据
免费单(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 || '-' }}
框架合同: 是 否
查看合同正文
检测项目({{ 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}}
字段变更合同作废
合同作废通过后将冻结该合同后续业务操作,历史审批、发票和流水记录仍保留。
必须上传补充协议({{contractChangeForm.change_type==='合同作废'?'合同作废': '签约金额 / 甲方 / 乙方变更'}})
选择补充协议文件
回款计划编辑
新签约金额:¥{{formatMoney(parseFloat(contractChangeForm.values.total_amount)||0)}} 当前合计:¥{{formatMoney(contractChangePaymentTotal())}}
+ 添加回款计划
我发起的待我审批已完成
{{ contractOverview.draft_reserved || 0 }}
预占 / 草稿
已领号未签订
{{ contractOverview.total || 0 }}
合同总数
已签订合同累计
{{ contractOverview.done || 0 }} 已完成
{{ contractOverview.active || 0 }} 履约中
{{ contractOverview.pending || 0 }} 待下单
{{ contractOverview.cancelled || 0 }} 已作废
{{ contractOverview.ending_soon || 0 }}
60天内到期
年度单签订日+1年临近
合同管理
{{ 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||0).toLocaleString() }} {{ (c.broker_fee_paid||0).toLocaleString() }} {{ (c.broker_fee_pending||0).toLocaleString() }} {{ (c.subcontract_fee||0).toLocaleString() }} {{ (c.subcontract_fee_paid||0).toLocaleString() }} {{ (c.subcontract_fee_pending||0).toLocaleString() }} {{ (c.invoiced_amount||0).toLocaleString() }} {{ Math.max(0,(Number(c.total_amount)||0)-(Number(c.invoiced_amount)||0)).toLocaleString() }} {{ nameOnly(c.account_manager) || '-' }} {{ nameOnly(c.current_account_manager) || '-' }} {{ nameOnly(c.customer_service) || '-' }} {{ nameOnly(c.current_customer_service) || '-' }} 公司自营 {{ c.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.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_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.broker_fee||0).toLocaleString() }}
分包费:¥ {{ (contractDetail.subcontract_fee||0).toLocaleString() }}
实收金额:¥ {{ (contractDetail.net_amount||0).toLocaleString() }}
创建时间:{{ contractDetail.created_at || '-' }}
更新时间:{{ contractDetail.updated_at || '-' }}
备注:{{ contractDetail.notes }}
💰 金额构成(签约金额 = 已收款 + 应收未收 + 未到期)
¥{{ formatMoney(contractDetail.total_amount || 0) }}
合同签约金额
¥{{ formatMoney(contractDetail.paid_amount || 0) }}
已收款
¥{{ formatMoney(contractDetail.cleared_amount || 0) }}
已销账金额
财务销账流水累计
¥{{ formatMoney(contractDetail.receivable_due_amount || 0) }}
应收未收
已开票 / 到期已交付
¥{{ formatMoney(contractDetail.not_due_amount || 0) }}
未到期
计划月未到 / 报告未交付
审批信息
审批状态: {{ {pending:'待审批',approved:'已通过',rejected:'已驳回'}[contractDetail.latest_approval.status] || contractDetail.latest_approval.status }}
审批人:{{ contractDetail.latest_approval.approver_name || '-' }}
发起人:{{ contractDetail.latest_approval.initiator_name || '-' }}
发起时间:{{ contractDetail.latest_approval.submitted_at || '-' }}
审批时间:{{ contractDetail.latest_approval.decided_at || '-' }}
提交说明:{{ contractDetail.latest_approval.submit_comment }}
审批意见:{{ contractDetail.latest_approval.approve_comment }}
采样点位({{ contractDetail.points.length }})
序号 点位名称 检测类型 执行标准 备注
{{ pi + 1 }} {{ p.point_name }} {{ p.sample_type }} {{ p.standard || '-' }} {{ p.notes || '-' }}
检测项目明细({{ contractDetail.items.length }})
点位# 项目组 第几次 检测项目 执行标准 计划月份 点位数
{{ (it.point_index ?? 0) + 1 }} {{ it.group_no }} 第{{ it.round_no }}次 {{ it.test_items }} {{ it.standards || '-' }} {{ it.plan_month || '-' }} {{ it.point_count || 1 }}
回款计划({{ contractDetailPayments.length }}) · 来自审批通过记录
序号 回款计划编号 计划月份 金额 到账 开票 报告交付 操作
第 {{ pi + 1 }} 笔 {{ contractDetail.contract_no }}({{ pi + 1 }}) {{ pay.plan_month || '-' }} ¥ {{ (pay.amount||0).toLocaleString() }} 已到账 未到账 已开票 未开票 已交付 {{ pay.delivered_at || '' }} 未交付
合同资料({{ contractDetailAttachments.length }})
盖章版合同({{ contractDetailStampedAttachments.length }})
📄 {{ a.filename }} ({{ (a.size / 1024).toFixed(1) }} KB) {{ a.uploaded_at }}
其他资料({{ contractDetailOtherAttachments.length }})
📄 {{ a.filename }} ({{ (a.size / 1024).toFixed(1) }} KB) {{ a.uploaded_at }}
暂无附件
任务单列表({{ (contractDetailTasks || []).length }})
任务号 第几次 计划月份 具体日期 状态 优先级 操作
{{ t.task_no }} 第{{ t.round_no }}次 {{ t.plan_month }} {{ t.plan_date || '待排期' }} {{ t.status }} {{ t.status }} {{ t.priority || '常规' }} 发送至采样室
尚未生成任务单
该合同暂无上传的资料
盖章版合同({{ contractFilesDialog.stampedFiles.length }}) + 补充
📄 {{ a.filename }} ({{ (a.size/1024).toFixed(1) }} KB) {{ a.uploaded_at }} 查看 下载 删除
其他资料({{ contractFilesDialog.otherFiles.length }}) + 补充
📄 {{ a.filename }} ({{ (a.size/1024).toFixed(1) }} KB) {{ a.uploaded_at }} 查看 下载 删除
搜索
已关联开票合计:¥{{ contractInvoiceDialog.invoicedTotal.toLocaleString() }} 签约金额:¥{{ (contractInvoiceDialog.totalAmount||0).toLocaleString() }} 未开票:¥{{ Math.max(0,(contractInvoiceDialog.totalAmount||0)-contractInvoiceDialog.invoicedTotal).toLocaleString() }}
该合同暂无已关联发票
已选 {{ batchArchiveDialog.rows.length }} 份可归档合同,系统从当前最大纸质序号 +1 开始自动递增,可单独修改。
没有符合归档条件的合同(需为待下单/履约中/已完成且未归档)。
请上传盖章版合同扫描件(将应用到本次向导所有合同)
⬆
拖拽或点击上传
合同编号:{{ archiveForm.contract_no }}
委托单位:{{ archiveForm.client || '-' }}
当前状态:{{ archiveForm.current_status || '-' }}
必须上传至少一份盖章版合同,归档才算正式生效
⬆
拖拽或点击上传盖章版合同扫描件(可多选)
⬆
拖拽或点击上传其他资料(报价单、补充协议等,可选)
📥 待接收样品 🔄 刷新 采样员已交接但实验室还没接收的任务(共 {{ 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 || '—' }}
暂无预告
⚙️ 任务分配规则 刷新 配置「样品类型 + 检测项目 → 默认检测员」,派检测任务时自动分配
添加规则
添加
已有规则 (共 {{ assignmentList.length }} 条)
序号 样品类型 检测项目 负责检测员 手机号 操作
{{ idx+1 }} {{ a.sample_type }} {{ a.test_item }} {{ a.assigned_name }} {{ a.assigned_phone }}
暂无规则,请先添加
📦 流转单管理 🔄 刷新 每张流转单对应一张任务单 = 报告编号 · 共 {{ transferTaskList.length }} 张
流转单编号 样品类型 检测项目 已分派检测员 自动分配 操作
{{ t.task_no }} {{ st }} {{ (t.test_items || []).join('、') || '—' }} {{ t.assigned_detectors.join('、') }} — ✓ 完毕 ⚠ 待手动分配 {{ t.unassigned_count }} 条 未派单 详情 🔄 自动分配 手工分配 编辑 下载
暂无已接收的流转单
接收时间:{{ 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 }} 保存
无待分配项目
搜索:
筛选: 搜索 刷新 重置
样品编号 任务编号 受检单位 采样点位 样品类型 检测项目 采样日期 状态 二维码 实验室追加
{{ row.sample_id }} {{ row.task_number }} {{ row.company_name }} {{ row.point_name }} {{ row.sample_type }} {{ row.test_items }} {{ row.sampling_date }} {{ row.status }} — +加标 +实验室平行 +质控样
暂无样品
刷新
检测项目 样品编号 受检单位 采样点位 检测人 结果 状态 操作
{{ t.test_item }} {{ t.sample_code }} {{ t.company_name }} {{ t.point_name }} {{ t.assigned_to || '—' }} ND {{ t.rounded_result }} — {{ t.status }} 详情 通过 驳回
暂无检测任务
{{ 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 }} 张 · 按检测项目生成原始记录表
{{ t.task_no }} 接收时间:{{ t.sample_received_at }} 检测项目数:{{ t.test_item_groups.length }} ✅ 已上交:{{ t.lab_records_submitted_at }} 📤 提交全部记录(完成实验室环节) 待全部审核完成后可提交 📋 提交纸质(含移交照) ✓ 纸质已移交 {{ t.lab_paper_handed_at }}
检测项目 分派检测员 录数进度 已通过审核 操作
{{ g.test_item }} {{ (g.assigned || []).join('、') || '—' }} {{ g.with_readings }} / {{ g.total }} {{ g.approved }} / {{ g.total }} 📥 生成原始记录表
该流转单暂无检测任务
暂无已接收的流转单
刷新 手动推送飞书 已超期 {{ 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
暂无即将到期
刷新 共 {{ 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 || '—' }} 上交原始记录 已上交 检测未完成
暂无任务
刷新 导出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
💡 这里定义每个检测项目的标准完成时限(单位小时),系统按这个时限自动给新任务打上 deadline,超期就告警。 国标和行业惯例已内置 45 条默认规则(pH 24h / COD 72h / BOD5 168h / 重金属 120h …),可按本实验室实际能力调整。
新增/修改: 时限: 小时
共 {{ slaRules.length }} 条规则
检测项目 方法标准 标准时限(小时) 更新时间 操作
{{ r.test_item }} {{ r.method_standard || '通用' }} {{ r.sla_hours }} {{ r.updated_at }}
暂无规则,点击"恢复默认时效"一键导入
{{ 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 }}
已超期
搜索 + 新增设备
LDG-QP-15 §4.4.6 — 质控样独立编号 = QC(批号) 显示已停用 + 新增批号
暂无质控批号,点上方"+ 新增批号"添加
👥 实验室小组管理 按专业方向(理化/无机/有机)划分,每组可设组长
+ 新建小组
暂无小组
{{ g.group_name }}组 · {{ g.member_count }} 人
编辑 删除
专业方向: {{ g.specialty || '-' }}
组长: ⭐ {{ g.leader_name }} (待定)
组员
⭐ {{ m.name }} {{ m.phone }}
移除
+ 添加成员
新建时只能选已在该组的成员,需先创建再加成员再设组长
共 {{ 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 }}
受检单位:{{ 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 }}
📋 原始记录数据
{{ labTaskDetail.is_nd ? 'ND' : labTaskDetail.rounded_result }}
原始值: {{ labTaskDetail.calc_result || '—' }} · 修约规则: GB/T 8170
操作记录
{{ t.action }} — {{ t.operator }} {{ t.time }}
通过 驳回
{{ 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
暂无启用的检测员,请先在系统管理 · 用户岗位中配置
{{ 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) 导出已关联发票、合同的流水 导出未关联合同的流水 导入农行流水(保留关联) 导入华兴流水(保留关联) 批量删除(按银行+年月)
⚠ 将删除该银行该年月的全部流水;已关联(合同/发票/付款/销账)的流水会自动跳过。删除后不可恢复,适用于删除后重新导入官网流水的场景。
已选 {{ 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」导入《应付款明细》,或「+ 新增」。
{{ 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 }}
⚠ 暂未关联流水:发票登记后会显示在"未挂流水"列表,提醒后续补登
日期:{{ 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}}
组织架构与部门负责人新增部门
查询新增员工档案
劳动合同、试用转正与离职交接新建劳动合同
离职交接任务
发起申请审批模板我的申请待审批全部申请
登记考勤
新建工资核算
维护薪资档案新建绩效周期录入绩效评价
薪资档案
绩效周期
资产与办公用品台账{{adminhrLowStockAssets.length}} 项库存预警
新增资产/用品
会议室、访客与行政资源预约新建预约
车辆协同台账预约用车
招聘、培训与资质台账新增记录
人事分析(近12个月)
在职人员部门分布
人员异动汇总
60天内到期资质
{{adminhrChangeDialog.employee.name}}({{adminhrChangeDialog.employee.dept||'未分配'}})
{{templateFlowPreview(((adminhrApprovalTemplates.find(t=>t.id===adminhrRequestDialog.form.template_id)||{}).nodes)||[]).join(' → ')}}
{{index+1}}删除
新增节点
系统管理
{{ dbTables.length || '' }}
🗃
数据库管理
查看、搜索、编辑、删除数据表记录,导出CSV
🤖
AI 管理
AI模型切换、API Key配置与管理
👥
用户岗位管理
用户岗位分配、岗位增删管理
🔒
系统有效期
系统授权到期控制,过期后普通账号无法登录
💬
飞书推送配置
配置飞书Webhook机器人,采样完成自动推送通知
📋
任务分配规则
配置检测项目与负责人对应关系,自动派发任务
📜
操作日志
全流程操作记录(含财务删改),不可篡改,可追溯
📍
点位库管理
监测点位档案、经纬度、历史记录、Excel导入
🔐
权限管理
按账号/部门细粒度配置功能权限,支持 Excel 导入
{{ accountList.length || '' }}
👤
用户账号管理
新增、编辑、删除登录账号,重置密码、停启用
🔄
系统更新
一键拉取最新代码并重启服务,升级到最新版本
< 返回系统管理 🔄 系统更新 重新检查
当前版本
{{ sysUpdate.currentVersion || sysVersion.version || '—' }}
→
服务器分支
{{ sysUpdate.branch || 'master' }}
检查中… 检查失败 有新版本(落后 {{ sysUpdate.behind }} 个提交) 已是最新
gitee 上最新提交
{{ sysUpdate.latestCommit }}
{{ sysUpdate.latestTime }}
{{ sysUpdate.updating ? '正在更新并重启…' : (sysUpdate.hasUpdate ? '立即更新到最新版本' : '重新拉取最新代码') }} 点击后服务器会备份数据库、拉取最新代码并自动重启,约 15~30 秒后可用。
{{ 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 || '未设置' }}
切换使用 编辑 删除
添加新模型 添加模型
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)可正常进入系统。
< 返回系统管理 飞书推送配置
获取群列表
保存配置 发送测试
使用步骤:
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 }}
暂无日志
< 返回系统管理 点位库管理
搜索 {{ 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 }})
暂无关联回款流水
关联合同↔发票会自动累计「已开票金额」;关联合同↔银行流水会自动累计「已销账金额」。
「已收款」列为历史数据,可与「已销账金额」对比校验真假。
{{ 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))) }}
历史跟进
新增收款方
居间费总额 ¥{{ formatMoney(paymentRequestDialog.brokerQuota.broker_fee) }} · 已付 ¥{{ formatMoney(paymentRequestDialog.brokerQuota.broker_fee_paid) }} · 待审批 ¥{{ formatMoney(paymentRequestDialog.brokerQuota.broker_fee_pending_requests) }} · 剩余可申请 ¥{{ formatMoney(paymentRequestDialog.brokerQuota.broker_fee_remaining) }}
上传附件
{{file.name}}
{{line}}
已有模板新建
{{i+1}}删除
新增节点
已有模板新建
{{i+1}}删除
新增节点
已有模板新建
{{i+1}}删除
新增节点
查询 新增收款方
公司个人 保存清空
公司个人 {{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.dept || '-'}} / {{paymentRequestDetailDialog.data.request.initiator_name}}
付款用途
{{paymentRequestDetailDialog.data.request.purpose || '-'}}
关联合同
{{paymentRequestDetailDialog.data.contract.contract_no}} · {{paymentRequestDetailDialog.data.contract.client}}合同详情
原应付款
{{paymentRequestDetailDialog.data.payable.payable_type}} · ¥{{formatMoney(paymentRequestDetailDialog.data.payable.amount)}}
关联进项发票
{{paymentRequestDetailDialog.data.invoice.invoice_no}} · ¥{{formatMoney(paymentRequestDetailDialog.data.invoice.amount)}}
审批流
暂无审批节点
分摊付款记录
操作日志 {{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' ? '核对版' : '盖章版' }}
选择文件
暂无需要您确认或签收的报告。