{{ tenant.tenant_name }} 简体中文 English 日本語 🔔 📋 🌐 💬 🔑 {{ (window.t ? (window.t('auth.actions.logout') || '退出') : '退出') }}
{{ (window.t ? (window.t('dashboard.menu') || '仪表盘') : '仪表盘') }} {{ (window.t ? (window.t('workbench.menu') || '个人工作台') : '个人工作台') }} {{ (window.t ? (window.t('equipment.menu') || '设备管理') : '设备管理') }} {{ (window.t ? (window.t('equipmentMap.menu') || '设备地图') : '设备地图') }} {{ (window.t ? (window.t('tool.title') || '工具管理') : '工具管理') }} {{ (window.t ? (window.t('workorder.menu') || '工单管理') : '工单管理') }} {{ (window.t ? (window.t('aggregateReport.menu') || '汇总报告') : '汇总报告') }} {{ (window.t ? (window.t('quotation.menu') || '更换零件报价') : '更换零件报价') }} {{ (window.t ? (window.t('serviceSignature.menu') || '现场服务签字') : '现场服务签字') }} {{ (window.t ? (window.t('inspection.categories') || '点检项分类') : '点检项分类') }} {{ (window.t ? (window.t('inspection.items') || '点检题库') : '点检题库') }} {{ (window.t ? (window.t('inspection.templateCategories') || '模板分类') : '模板分类') }} {{ (window.t ? (window.t('inspection.templates') || '点检模板') : '点检模板') }} {{ (window.t ? (window.t('inspection.plans') || '点检计划') : '点检计划') }} {{ (window.t ? (window.t('inspection.bindingMatrix') || '绑定矩阵') : '绑定矩阵') }} {{ (window.t ? (window.t('inspection.additionalFindings') || '额外问题管理') : '额外问题管理') }} {{ (window.t ? (window.t('inspection.reports') || '分析报表') : '分析报表') }} {{ (window.t ? (window.t('inspection.import') || '数据导入') : '数据导入') }} {{ (window.t ? (window.t('maintenance.plans') || '维护计划') : '维护计划') }} {{ (window.t ? (window.t('maintenance.history') || '执行历史') : '执行历史') }} {{ (window.t ? (window.t('predictiveMaintenance.menu') || '预测性维护') : '预测性维护') }} {{ (window.t ? (window.t('inventory.menu.parts') || '备件管理') : '备件管理') }} {{ (window.t ? (window.t('inventory.menu.transactions') || '库存事务') : '库存事务') }} {{ (window.t ? (window.t('inventory.menu.alerts') || '库存预警') : '库存预警') }} {{ (window.t ? (window.t('inventory.reconcile.menu') || '库存对账') : '库存对账') }} {{ (window.t ? (window.t('inventory.spareInventory.menu') || '备件盘点报表') : '备件盘点报表') }} {{ (window.t ? (window.t('purchaseRequest.title') || '采购申请') : '采购申请') }} {{ (window.t ? (window.t('cost.menu') || '成本分析') : '成本分析') }} {{ (window.t ? (window.t('siteComparison.menu') || '据点对比看板') : '据点对比看板') }} {{ (window.t ? (window.t('equipmentCostRanking.menu') || '设备保全费排名') : '设备保全费排名') }} {{ (window.t ? (window.t('archives.department') || '部门档案') : '部门档案') }} {{ (window.t ? (window.t('archives.location') || '位置档案') : '位置档案') }} {{ (window.t ? (window.t('archives.storageLocation') || '仓库管理') : '仓库管理') }} {{ (window.t ? (window.t('archives.customerCategory') || '客户分类') : '客户分类') }} {{ (window.t ? (window.t('archives.customer') || '客户档案') : '客户档案') }} {{ (window.t ? (window.t('archives.supplierCategory') || '供应商分类') : '供应商分类') }} {{ (window.t ? (window.t('archives.supplier') || '供应商档案') : '供应商档案') }} {{ (window.t ? (window.t('archives.type') || '设备类型档案') : '设备类型档案') }} {{ (window.t ? (window.t('archives.equipmentCategory') || '装备分类') : '装备分类') }} {{ (window.t ? (window.t('archives.equipmentSeries') || '设备系列分类') : '设备系列分类') }} {{ (window.t ? (window.t('archives.equipmentModel') || '设备型号') : '设备型号') }} {{ (window.t ? (window.t('archives.equipmentModelBom') || '型号 BOM') : '型号 BOM') }} {{ (window.t ? (window.t('archives.equipmentModelPicture') || '型号附件·分类图片') : '型号附件·分类图片') }} {{ (window.t ? (window.t('archives.manufacturer') || '制造商') : '制造商') }} {{ (window.t ? (window.t('archives.structureTemplate') || '机构模板') : '机构模板') }} {{ (window.t ? (window.t('archives.equipmentTag') || '设备标签档案') : '设备标签档案') }} {{ (window.t ? (window.t('sparePartCategory.menu') || '备件分类') : '备件分类') }} {{ (window.t ? (window.t('archives.laborRate') || '工时费率档案') : '工时费率档案') }} {{ (window.t ? (window.t('structure.editor') || '设备结构编辑器') : '设备结构编辑器') }} {{ (window.t ? (window.t('structure.versions') || '版本管理') : '版本管理') }} {{ (window.t ? (window.t('sensor.menu.management') || '传感器管理') : '传感器管理') }} {{ (window.t ? (window.t('sensor.menu.monitor') || '传感器实时监控') : '传感器实时监控') }} {{ (window.t ? (window.t('sensor.menu.alertManagement') || '传感器报警管理') : '传感器报警管理') }} {{ (window.t ? (window.t('sensor.menu.simulator') || '传感器模拟器') : '传感器模拟器') }} {{ (window.t ? (window.t('bim.viewer.title') || 'BIM浏览器') : 'BIM浏览器') }} {{ (window.t ? (window.t('bim.files.menu') || 'BIM文件管理') : 'BIM文件管理') }} {{ (window.t ? (window.t('bim.mappings.menu') || 'BIM映射管理') : 'BIM映射管理') }} {{ (window.t ? (window.t('geometry3d.menu') || '3D占位符管理') : '3D占位符管理') }} {{ (window.t ? (window.t('knowledge.menu.management') || '知识库管理') : '知识库管理') }} {{ (window.t ? (window.t('knowledge.menu.ragChat') || '智能问答') : '智能问答') }} {{ (window.t ? (window.t('knowledge.menu.pdfUpload') || 'PDF文档上传') : 'PDF文档上传') }} {{ (window.t ? (window.t('sop.link.title') || 'SOP关联管理') : 'SOP关联管理') }} {{ (window.t ? (window.t('report.menu.templateManagement') || '模板管理') : '模板管理') }} {{ (window.t ? (window.t('equipmentInventory.menu') || '设备盘点') : '设备盘点') }} {{ (window.t ? (window.t('labelManagement.menu') || '标签打印') : '标签打印') }} {{ (window.t ? (window.t('sparePartBorrow.menu') || '备件借用') : '备件借用') }} {{ (window.t ? (window.t('shiftHandover.menu') || '交接班管理') : '交接班管理') }} {{ (window.t ? (window.t('training.menu.courses') || '课程管理') : '课程管理') }} {{ (window.t ? (window.t('training.menu.questions') || '题库管理') : '题库管理') }} {{ (window.t ? (window.t('training.menu.plans') || '培训计划') : '培训计划') }} {{ (window.t ? (window.t('training.menu.analytics') || '学情看板') : '学情看板') }} {{ (window.t ? (window.t('training.menu.requirements') || '工单作业资质要求') : '工单作业资质要求') }} {{ (window.t ? (window.t('training.menu.records') || '学习与考核') : '学习与考核') }} {{ (window.t ? (window.t('training.menu.map') || '培训地图') : '培训地图') }} {{ (window.t ? (window.t('certification.title') || '资质证书') : '资质证书') }} {{ (window.t ? (window.t('shiftTemplate.title') || '班次模板') : '班次模板') }} {{ (window.t ? (window.t('shiftSchedule.title') || '排班管理') : '排班管理') }} {{ (window.t ? (window.t('shiftSchedule.mySchedule') || '我的排班') : '我的排班') }} {{ (window.t ? (window.t('system.menu.permissionManagement') || '权限管理') : '权限管理') }} {{ (window.t ? (window.t('system.menu.approvalWorkflow') || '审批流程管理') : '审批流程管理') }} {{ t('docNumber.menuLabel') }} {{ (window.t ? (window.t('barcodeRule.menu') || '条码规则') : '条码规则') }} {{ (window.t ? (window.t('system.menu.tenantManagement') || '租户管理') : '租户管理') }} {{ (window.t ? (window.t('system.menu.licenseManagement') || '许可管理') : '许可管理') }} {{ t('system.menu.systemConfigCenter') || '系统参数' }} {{ t('system.menu.configWizard') || '配置向导' }} {{ t('schema.menu') || '属性 Schema 设计器' }} {{ t('customField.menu') || '自定义字段' }} {{ t('i18nAdmin.menu') || '翻译管理' }} {{ (window.t ? (window.t('system.menu.metrics') || '运维监控') : '运维监控') }} {{ t('scheduler.menu') || '定时任务管理' }} {{ t('system.menu.systemImport') || '数据导入' }} {{ t('migration.menu') || '数据迁移控制台' }} {{ t('migration.verify.menu') || 'S0 DoD 验收' }} {{ (window.t ? (window.t('manual.menu') || '操作手册') : '操作手册') }}

🧩 {{ t('customField.title') || '自定义字段管理' }}

{{ t('customField.showInactive') || '显示已禁用' }} {{ t('customField.refresh') || '刷新' }} {{ t('customField.create') || '新增字段' }}
{{ t('customField.form.active') || '启用' }}
{{ t('customField.form.addOption') || '添加' }}
{{ t('common.delete') || '删除' }}
用于设备按模板补齐等场景。例:日立=9010,9030;凯道=9020,9030;通用=9030。为空表示该选项不提供类型前缀过滤规则。

🌐 {{ t('i18nAdmin.title') || '多语言翻译管理' }}

{{ (t('i18nAdmin.unsaved') || '未保存') }}: {{ translationModule.dirtyCount }} {{ t('i18nAdmin.markReviewed') || '标记为已确认' }} {{ t('i18nAdmin.refresh') || '刷新' }} {{ t('i18nAdmin.export') || '导出 Excel' }} {{ t('i18nAdmin.import') || '导入 Excel' }} {{ t('i18nAdmin.save') || '保存修改' }}
{{ t('i18nAdmin.platform.desktop') || 'PC 端' }} {{ t('i18nAdmin.platform.mobile') || '移动端' }} {{ (t('i18nAdmin.totalKeys') || '总词条') }}: {{ translationModule.totalKeys }}

{{ t('workbench.title') || '个人工作台' }}

{{ t('workbench.period.week') || '本周' }} {{ t('workbench.period.month') || '本月' }} {{ t('workbench.period.quarter') || '本季' }} {{ t('workbench.period.year') || '本年' }}
{{ t('workbench.shortcuts.empty') || '暂无快捷方式,点击右上角"+ 编辑"添加常用功能' }}
{{ page.icon }} {{ workbenchModule.getPageLabel(page) }} ×
{{ t('workbench.shortcuts.addHint') || '点击添加到快捷方式:' }}
{{ page.icon }} {{ workbenchModule.getPageLabel(page) }}
{{ t('workbench.noData') || '暂无数据' }}
{{ item.title || item.work_order_id }}
{{ t('workbench.overdue') || '逾期' }}
{{ item.equipment_name || '-' }} {{ item.priority || '-' }}
{{ t('workbench.noData') || '暂无数据' }}
{{ item.title || item.work_order_id }}
{{ item.equipment_name || '-' }} {{ t('workbench.onTime') || '准时' }} {{ t('workbench.overdue') || '逾期' }}
{{ t('workbench.noData') || '暂无数据' }}
{{ item.course_name || item.course_id || item.record_id }}
{{ workbenchModule.getTrainingStatusLabel(item.status) }}
{{ item.completion_date || item.assigned_date || '-' }} {{ item.course_has_quiz ? (t('training.quiz.required') || '需考试') : (t('training.quiz.notRequired') || '无需考试') }}
{{ t('workbench.noData') || '暂无数据' }}
{{ t('workbench.favorite.targetTypes.' + fav.target_type) || fav.target_type }}
PDF加载中...
暂无可预览内容
⚙️ {{ t('workbench.homepagePreference.title') || '首页偏好设置' }}
{{ t((homepageOptions.find(o => o.value === homepagePreference.value) || {}).labelKey) || (homepageOptions.find(o => o.value === homepagePreference.value) || {}).fallback || '个人工作台' }}

{{ t('cost.analysis.title') || '成本分析' }}

{{ t('cost.analysis.filters.query') || '查询' }} {{ t('cost.analysis.filters.refresh') || '刷新' }} {{ t('cost.analysis.filters.export') || '导出' }}
{{ (costSummary.outsourced_work_order_count || 0) }} / {{ (costSummary.work_order_count || 0) }}

{{ t('siteComparison.title') || '据点对比看板' }}

{{ t('siteComparison.refresh') || '刷新' }}

{{ t('equipmentCostRanking.title') || '设备别保全费排名' }}

{{ t('equipmentCostRanking.topN') || '显示前 N 名' }}: {{ t('equipmentCostRanking.refresh') || '刷新' }}

{{ (window.t ? (window.t('dashboard.title') || '仪表盘') : '仪表盘') }}

{{ t('dashboard.controls.quickRangeLabel') }}
{{ item.label }}
{{ t('dashboard.controls.dateRangeLabel') }} {{ t('dashboard.controls.granularityLabel') }} {{ t('dashboard.controls.granularity.day') }} {{ t('dashboard.controls.granularity.week') }} {{ t('dashboard.controls.granularity.month') }} {{ t('dashboard.controls.reset') }}
{{ dashboardWindowSummary }}
{{ t('dashboard.quickActions.emergencyRepair') }} {{ t('dashboard.quickActions.scanReport') }} {{ t('dashboard.quickActions.createWorkOrder') }} {{ t('dashboard.quickActions.viewBIMModel') }}

截图标注

⬜ 矩形 ➡️ 箭头 📝 文本 颜色:
🗑️ 清除
{{ t('drilldown.panel.source') || '钻取来源' }}
{{ drilldownTitle }}
{{ t('drilldown.panel.description') || '以下明细由当前仪表盘点击条件筛选得出。' }}
{{ drilldownPagination.total || 0 }}
{{ t('drilldown.conditions.records') || '结果总数' }}
{{ (t('drilldown.panel.loaded') || '当前页已加载') + ' ' + (drilldownLoadedCount || 0) }}
{{ item.label }}
{{ item.value }}
{{ item.label }} {{ item.label }}
{{ t('drilldown.filter.all') || '全部' }} {{ t('drilldown.filter.completed') || '已完成' }} {{ t('drilldown.filter.uncompleted') || '未完成' }} {{ t('drilldown.filter.overdue') || '逾期' }}
{{ t('drilldown.filter.all') || '全部' }} {{ t('drilldown.filter.planned') || '计划中' }} {{ t('drilldown.filter.actual') || '已完成' }}

{{ (window.t ? (window.t('workorder.menu') || '工单管理') : '工单管理') }}

(共 {{ workOrderViewMode === 'hierarchy' ? hierarchyPagination.total : workOrderPagination.total }} {{ workOrderViewMode === 'hierarchy' ? '个组合' : '条记录' }})
{{ (window.t ? (window.t('dashboard.quickActions.createWorkOrder') || '新建工单') : '新建工单') }} {{ (window.t ? (window.t('common.refresh') || '刷新') : '刷新') }} {{ (window.t ? (window.t('common.exportCsv') || '导出CSV') : '导出CSV') }}
🔍 {{ (window.t ? (window.t('common.filter.title') || '筛选') : '筛选') }}
📝 {{ (window.t ? (window.t('workorder.filter.typeOptions.inspection') || '定期检查') : '定期检查') }} 📝 {{ (window.t ? (window.t('workorder.filter.typeOptions.patrol') || '巡检') : '巡检') }} 📝 {{ (window.t ? (window.t('workorder.filter.typeOptions.preventive') || '预防性维护') : '预防性维护') }} 📝 {{ (window.t ? (window.t('workorder.filter.typeOptions.mandatory_inspection') || '强制检验') : '强制检验') }} {{ (window.t ? (window.t('workorder.filter.typeOptions.corrective') || '故障维修') : '故障维修') }} {{ (window.t ? (window.t('workorder.filter.typeOptions.improvement') || '改进升级') : '改进升级') }} {{ (window.t ? (window.t('workorder.filter.typeOptions.calibration') || '校准') : '校准') }} {{ (window.t ? (window.t('workorder.filter.typeOptions.installation') || '安装') : '安装') }} {{ (window.t ? (window.t('workorder.filter.typeOptions.overhaul') || '大修') : '大修') }} {{ (window.t ? (window.t('workorder.filter.statusOptions.pending') || '待处理') : '待处理') }} {{ (window.t ? (window.t('workorder.filter.statusOptions.inProgress') || '进行中') : '进行中') }} {{ (window.t ? (window.t('workorder.filter.statusOptions.completed') || '已完成') : '已完成') }} {{ (window.t ? (window.t('workorder.filter.statusOptions.rated') || '已评价') : '已评价') }} {{ (window.t ? (window.t('workorder.filter.statusOptions.cancelled') || '已取消') : '已取消') }} {{ (window.t ? (window.t('common.filter.more') || '更多筛选') : '更多筛选') }} ▼
{{ (window.t ? (window.t('workorder.filter.statusOptions.pendingApproval') || '待审批') : '待审批') }} {{ (window.t ? (window.t('workorder.filter.statusOptions.pending') || '待处理') : '待处理') }} {{ (window.t ? (window.t('workorder.filter.statusOptions.assigned') || '已分配') : '已分配') }} {{ (window.t ? (window.t('workorder.filter.statusOptions.inProgress') || '进行中') : '进行中') }} {{ (window.t ? (window.t('workorder.filter.statusOptions.completed') || '已完成') : '已完成') }} {{ (window.t ? (window.t('workorder.filter.statusOptions.rated') || '已评价') : '已评价') }} {{ (window.t ? (window.t('workorder.filter.statusOptions.cancelled') || '已取消') : '已取消') }} {{ (window.t ? (window.t('workorder.filter.statusOptions.dispatched') || '已派单') : '已派单') }}
📝 {{ (window.t ? (window.t('workorder.filter.typeOptions.inspection') || '定期检查') : '定期检查') }} 📝 {{ (window.t ? (window.t('workorder.filter.typeOptions.patrol') || '巡检') : '巡检') }} 📝 {{ (window.t ? (window.t('workorder.filter.typeOptions.preventive') || '预防性维护') : '预防性维护') }} 📝 {{ (window.t ? (window.t('workorder.filter.typeOptions.mandatory_inspection') || '强制检验') : '强制检验') }} {{ (window.t ? (window.t('workorder.filter.typeOptions.corrective') || '故障维修') : '故障维修') }} {{ (window.t ? (window.t('workorder.filter.typeOptions.improvement') || '改进升级') : '改进升级') }} {{ (window.t ? (window.t('workorder.filter.typeOptions.calibration') || '校准') : '校准') }} {{ (window.t ? (window.t('workorder.filter.typeOptions.installation') || '安装') : '安装') }} {{ (window.t ? (window.t('workorder.filter.typeOptions.overhaul') || '大修') : '大修') }} 📝 {{ (window.t ? (window.t('workorder.filter.typeOptions.tool_maintenance') || '工具维护') : '工具维护') }} {{ (window.t ? (window.t('workorder.filter.showHierarchyChildrenOptions.hide') || '隐藏组合子工单') : '隐藏组合子工单') }} {{ (window.t ? (window.t('workorder.filter.showHierarchyChildrenOptions.show') || '显示组合子工单') : '显示组合子工单') }} {{ (window.t ? (window.t('common.filter.more') || '更多筛选') : '更多筛选') }} ▼
{{ (window.t ? (window.t('common.reset') || '重置') : '重置') }} {{ (window.t ? (window.t('common.query') || '查询') : '查询') }}
{{ (window.t ? (window.t('workorder.viewMode.hierarchy') || '组合工单') : '组合工单') }} {{ (window.t ? (window.t('workorder.viewMode.list') || '单工单') : '单工单') }} 📥 {{ (window.t ? (window.t('crossTenantDispatch.tab.dispatchManagement') || '派单管理') : '派单管理') }} 📤 {{ (window.t ? (window.t('crossTenantDispatch.tab.sentDispatches') || '已派出派单') : '已派出派单') }}
{{ ((window.t && window.t('workorder.batchAssign.button')) || '批量分派') + ' (' + workOrderSelectedRowKeys.length + ')' }} {{ (window.t && window.t('workorder.batchAssign.clearSelection')) || '取消选择' }}
{{ hierarchyBatchMode ? ((window.t && window.t('workorder.batchAssign.exitBatchMode')) || '退出批量分派') : ((window.t && window.t('workorder.batchAssign.enterBatchMode')) || '批量分派') }} {{ ((window.t && window.t('workorder.batchAssign.assignSelectedGroups')) || '分派选中组合') + ' (' + selectedHierarchyGroupIds.length + ')' }} {{ (window.t && window.t('workorder.batchAssign.hierarchySelectHint')) || '勾选组合卡片后批量分派(已派出的组合不可选)' }}
{{ t('workorder.detail.approval.approvalStatusLabel') || '审批状态' }}: {{ group.group_approval_status === 'pending' ? (t('workorder.detail.approval.status.pending') || '审批中') : group.group_approval_status === 'approved' ? (t('workorder.detail.approval.status.approved') || '已通过') : group.group_approval_status === 'rejected' ? (t('workorder.detail.approval.status.rejected') || '已拒绝') : group.group_approval_status === 'returned_to_submitter' ? (t('workorder.detail.approval.status.returnedToSubmitter') || '已退回(待修改)') : group.group_approval_status === 'returned_to_node' ? (t('workorder.detail.approval.status.returnedToNode') || '退回重审') : group.group_approval_status === 'cancelled' ? (t('workorder.detail.approval.status.cancelled') || '已撤销') : group.group_approval_status }} {{ t('workorder.detail.approval.recordId') || '审批单号' }}:{{ group.group_approval_record_id }} {{ group._approvalExpanded ? (t('workorder.detail.approval.collapse') || '收起详情 ↑') : (t('workorder.detail.approval.expand') || '查看审批进度 ↓') }} {{ t('workorder.detail.approval.cancelApproval') || '撤销审批' }} {{ t('workorder.detail.approval.resubmitApproval') || '🔄 重新提交审批' }}
{{ group._approvalDetail.workflow_name || (t('workorder.detail.approval.defaultWorkflow') || '默认流程') }} {{ group._approvalDetail.status === 'pending' ? (t('workorder.detail.approval.status.pending') || '审批中') : group._approvalDetail.status === 'approved' ? (t('workorder.detail.approval.status.approved') || '已通过') : group._approvalDetail.status === 'rejected' ? (t('workorder.detail.approval.status.rejected') || '已拒绝') : group._approvalDetail.status === 'returned_to_submitter' ? (t('workorder.detail.approval.status.returnedToSubmitter') || '已退回(待修改)') : group._approvalDetail.status === 'returned_to_node' ? (t('workorder.detail.approval.status.returnedToNode') || '退回重审') : group._approvalDetail.status === 'cancelled' ? (t('workorder.detail.approval.status.cancelled') || '已撤销') : group._approvalDetail.status }} {{ group._approvalDetail.created_by_name || group._approvalDetail.created_by }} {{ group._approvalDetail.created_at ? new Date(group._approvalDetail.created_at).toLocaleString('zh-CN') : '' }}
{{ t('workorder.detail.approval.history') || '审批历史' }}
{{ (t('workorder.detail.approval.step') || '步骤') }} {{ step.step_number }}: {{ step.step_name }} {{ (step.approve_mode === 'all' || (!step.approve_mode && ((group._approvalDetail.steps || []).filter(s => s.step_number === step.step_number).length > 1))) ? (t('workorder.detail.approval.countersign') || '会签') : (t('workorder.detail.approval.anySign') || '或签') }}
{{ t('workorder.detail.approval.approver') || '审批人' }}: {{ step.approver_name }}
{{ t('workorder.detail.approval.statusLabel') || '状态' }}: {{ step.status === 'pending' ? (t('workorder.detail.approval.status.pendingShort') || '待审批') : step.status === 'approved' ? (t('workorder.detail.approval.status.approved') || '已通过') : step.status === 'rejected' ? (t('workorder.detail.approval.status.rejected') || '已拒绝') : (step.status === 'returned_to_submitter' || step.status === 'returned_to_node') ? (t('workorder.detail.approval.status.returned') || '已退回') : step.status === 'cancelled' ? (t('workorder.detail.approval.status.cancelled') || '已撤销') : step.status }}
{{ t('workorder.detail.approval.comment') || '意见' }}: {{ step.comments }}
{{ new Date(step.approved_at).toLocaleString('zh-CN') }}
{{ t('workorder.detail.approval.noSteps') || '暂无审批步骤记录' }}
{{ t('workorder.detail.approval.noRecord') || '暂无审批记录' }}
{{ group.hierarchy_plan_id || '-' }} {{ group.hierarchy_root_equipment_id || '-' }} {{ group.root_department_name || group.department_name || group.root_department_id || group.department_id || '-' }} {{ group.actual_start || '-' }} {{ group.completed_at || '-' }} {{ group.work_orders.length }} {{ group.created_at }} 🏢{{ tt('workorder.detail.outsource.yes') || '外包' }} 自修
{{ (window.t ? (window.t('workorder.hierarchy.statusSummary') || '状态统计') : '状态统计') }}: {{ getWorkOrderStatusText ? getWorkOrderStatusText(status) : status }}: {{ count }} ⭐ 已评价 {{ group.rating_summary.rated_count }}/{{ group.rating_summary.total }} (平均 {{ group.rating_summary.avg_rating }} 分)
📋 {{ t('workorder.hierarchy.childWorkOrders') || '子工单列表' }}({{ group.work_orders.length }})
{{ t('mobile.tasks.batchInspect') || '点检' }} {{ t('workorder.hierarchy.batchStart') || '批量开始' }} {{ t('workorder.hierarchy.batchComplete') || '批量完成' }} {{ t('workorder.hierarchy.batchAssign') || '分派' }} 一键评价 ({{ group.rating_summary.pending_count }}) {{ t('crossTenantDispatch.modal.crossTenantDispatch') || '跨租户派单' }} {{ t('report.hierarchy.batchExport') || '批量导出报告' }} {{ t('workorder.hierarchy.batchMaterial') || '领料' }} {{ t('workorder.hierarchy.batchCost') || '费用' }} {{ tt('sop.link.viewSop') || '查看SOP' }}
🔧 {{ tt('workorder.form.sections.equipmentAndCategory') || '设备与分类' }}
📝 {{ tt('workorder.types.inspection') || '定期检查' }} 📝 {{ tt('workorder.types.patrol') || '巡检' }} 📝 {{ tt('workorder.types.preventive') || '预防性维护' }} 📝 {{ tt('workorder.types.mandatory_inspection') || '强制检验' }} 🔧 {{ tt('workorder.types.corrective') || '故障维修' }} ⚙️ {{ tt('workorder.types.improvement') || '改进升级' }} 📐 {{ tt('workorder.types.calibration') || '校准' }} 📦 {{ tt('workorder.types.installation') || '安装' }} 🔩 {{ tt('workorder.types.overhaul') || '大修' }} 📝 {{ tt('workorder.types.tool_maintenance') || '工具维护' }}
{{ formatEquipmentOptionLabel(eq, { showCustomer: !workOrderForm.customer_id }) }} {{ formatEquipmentOptionLabel(eq, { showParent: true, showCustomer: !workOrderForm.customer_id }) }} {{ formatEquipmentOptionLabel(eq, { showCustomer: !workOrderForm.customer_id }) }} {{ workOrderEquipmentPagination.loading ? ((window.t && (window.t('inventory.common.loadingOption') || '加载中...')) || '加载中...') : (tt('workorder.form.placeholders.moreEquipment') || '更多设备') }} {{ groupedEquipmentForWorkOrder.equipmentGroup.length + (groupedEquipmentForWorkOrder.structureMechanismGroup?.length || 0) + groupedEquipmentForWorkOrder.mechanismGroup.length }}{{ (window.t && window.t('workorder.form.placeholders.countUnit')) ?? '个' }}{{ (workOrderEquipmentTypeFilter || workOrderEquipmentCategoryFilter) ? ((window.t && window.t('workorder.form.placeholders.filtered')) || '(已筛选)') : '' }}
{{ tt('workorder.priority.high') || '高' }} {{ tt('workorder.priority.medium') || '中' }} {{ tt('workorder.priority.low') || '低' }} {{ u.name || u.username }} ({{ u.user_id }}) {{ tt('workorder.assign.onDuty') || '当班' }}
{{ workOrderModule.assigneeFilter?.filteredByOnDuty ? (tt('workorder.assign.onDutyOnlyHint') || '已按当前当班人员筛选') : (tt('workorder.assign.showingAllHint') || '正在显示全部可见人员') }} {{ tt('workorder.assign.showAll') || '显示全部' }}
{{ tt('workorder.assign.nonDutyWarning') || '所选负责人当前不在该部门/时间的已发布排班中,系统允许保存,请确认现场安排。' }}
{{ workOrderModule.workOrderFormQualificationWarning?.value }}
🏗️ {{ tt('workorder.hierarchy.title') || '组合工单' }} {{ tt('workorder.hierarchy.autoDetected') || '自动检测到子设备' }}
{{ tt('workorder.hierarchy.switchHint') || '为该设备及其子设备批量创建关联工单' }}
📝 {{ tt('workorder.form.sections.workOrderContent') || '工单内容' }}
📅 {{ tt('workorder.form.sections.timeSchedule') || '时间安排' }}
🛡️ {{ tt('workorder.safety.title') || '安全与风险' }}
ℹ️ {{ tt('workorder.safety.fromTemplate') || '检查类工单的安全与风险信息将从关联点检模板自动继承,无需手动填写。' }}
🏢 {{ tt('workorder.detail.labels.isOutsourced') || '外包信息' }} {{ tt('workorder.detail.outsource.yes') || '外包' }} {{ tt('workorder.detail.outsource.no') || '自修' }}
📎 {{ tt('workorder.form.sections.additionalInfo') || '附加信息' }}
{{ tt('workorder.form.placeholders.selectFile') || '选择文件' }} {{ (tt('workorder.form.placeholders.filesSelected') || '已选择 {count} 个文件').replace('{count}', newWorkOrderPendingFiles.length) }}
{{ tt('workorder.form.placeholders.refreshAttachments') || '刷新附件' }} {{ (tt('workorder.form.placeholders.totalCount') || '共 {count} 个').replace('{count}', (selectedWorkOrder.attachments||attachmentsListMap[selectedWorkOrder.work_order_id]||[]).length || 0) }}
💬 {{ tt('workorder.form.sections.historyComments') || '历史备注' }} {{ (workOrderComments || []).length }}
{{ tt('common.refresh') || '刷新' }}
📝 {{ (window.t ? (window.t('workorder.detail.sections.basic') || '基本信息') : '基本信息') }}
{{ (window.t ? (window.t('workorder.detail.labels.id') || '工单编号') : '工单编号') }} {{ selectedWorkOrder.work_order_id }}
{{ (window.t ? (window.t('workorder.detail.labels.type') || '工单类型') : '工单类型') }} {{ getWorkOrderTypeText ? getWorkOrderTypeText(selectedWorkOrder.type) : selectedWorkOrder.type }}
{{ (window.t ? (window.t('workorder.detail.labels.title') || '工单标题') : '工单标题') }} {{ selectedWorkOrder.title }}
{{ (window.t ? (window.t('workorder.detail.labels.equipment') || '关联设备') : '关联设备') }} {{ getLocalizedEquipmentName(selectedWorkOrder) || '-' }} [{{ selectedWorkOrder.equipment_id }}] ({{ selectedWorkOrder.asset_number }})
{{ (window.t ? (window.t('workorder.detail.labels.department') || '归属部门') : '归属部门') }} {{ selectedWorkOrder.department_name || '-' }}
{{ (window.t ? (window.t('workorder.detail.labels.customer') || '所属客户') : '所属客户') }} {{ selectedWorkOrder.customer_name || '-' }}
{{ (window.t ? (window.t('workorder.detail.labels.priority') || '优先级') : '优先级') }} {{ selectedWorkOrder.priority === '高' ? (window.t ? (window.t('workorder.priority.high') || '🔴 高') : '🔴 高') : selectedWorkOrder.priority === '中' ? (window.t ? (window.t('workorder.priority.medium') || '🟡 中') : '🟡 中') : (window.t ? (window.t('workorder.priority.low') || '🟢 低') : '🟢 低') }}
{{ (window.t ? (window.t('workorder.detail.labels.assignee') || '负责人') : '负责人') }} {{ selectedWorkOrder.assigned_to_name || selectedWorkOrder.assigned_to || '-' }}
{{ (window.t ? (window.t('workorder.detail.labels.createdBy') || '创建人') : '创建人') }} {{ selectedWorkOrder.created_by_name || selectedWorkOrder.created_by || '-' }}
{{ (window.t ? (window.t('workorder.detail.labels.createdAt') || '创建时间') : '创建时间') }} {{ selectedWorkOrder.created_at ? new Date(selectedWorkOrder.created_at).toLocaleString(getLocale()) : '-' }}
{{ tt('workorder.detail.labels.isOutsourced') || '外包标识' }} 🏢 {{ tt('workorder.detail.outsource.yes') || '外包' }}
{{ tt('workorder.detail.labels.outsourceSupplier') || '外包供应商' }} {{ selectedWorkOrder.outsource_supplier_name }}
🏢 {{ tt('workorder.detail.labels.isOutsourced') || '外包信息' }} 可编辑 {{ getOutsourceLockReason(selectedWorkOrder) }}
组合子工单的外包信息需要在"组合设置"中统一维护,这里仅展示当前结果。
{{ tt('workorder.detail.labels.isOutsourced') || '外包标识' }}
{{ tt('workorder.detail.labels.outsourceSupplier') || '外包供应商' }}
{{ tt('common.save') || '保存外包设定' }}
📄 {{ (window.t ? (window.t('workorder.detail.sections.description') || '问题描述') : '问题描述') }}
{{ selectedWorkOrder.description }}
🛡️ {{ tt('workorder.safety.title') || '安全与风险' }}
{{ tt('workorder.safety.riskLevel') || '风险等级' }} {{ tt('workorder.safety.riskLevels.' + selectedWorkOrder.risk_level) || selectedWorkOrder.risk_level }}
{{ tt('workorder.safety.riskCategories') || '风险类别' }}
{{ riskCategoryLabel(cat) }}
{{ tt('workorder.safety.safetyNotes') || '安全说明' }}
{{ getI18nText(selectedWorkOrder.safety_notes_i18n, selectedWorkOrder.safety_notes) }}
{{ tt('workorder.safety.emergencyMeasures') || '应急措施' }}
{{ getI18nText(selectedWorkOrder.emergency_measures_i18n, selectedWorkOrder.emergency_measures) }}
{{ tt('workorder.safety.requiredPpe') || '所需PPE' }}
{{ ppe }}
{{ tt('workorder.safety.requiredApprovals') || '所需申请' }}
{{ a }}
{{ tt('workorder.safety.affectedSystems') || '影响范围' }}
{{ s }}
{{ (window.t ? (window.t('workorder.detail.approval.pendingTitle') || '工单正在审批中') : '工单正在审批中') }}
{{ selectedWorkOrder.hierarchy_group_id ? (window.t ? (window.t('workorder.detail.approval.groupHint') || '组合工单审批 - 请在组合视图统一处理') : '组合工单审批 - 请在组合视图统一处理') : (window.t ? (window.t('workorder.detail.approval.pendingHint') || '审批通过后才能进行分派、执行、完成等操作') : '审批通过后才能进行分派、执行、完成等操作') }}
{{ approvalModule.inlineApprovalExpanded ? (window.t ? (window.t('workorder.detail.approval.collapse') || '收起详情 ↑') : '收起详情 ↑') : (window.t ? (window.t('workorder.detail.approval.expand') || '查看审批进度 ↓') : '查看审批进度 ↓') }}
{{ approvalModule.inlineApprovalRecord.workflow_name || (window.t ? (window.t('workorder.detail.approval.defaultWorkflow') || '默认流程') : '默认流程') }} {{ approvalModule.inlineApprovalRecord.status === 'pending' ? (window.t ? (window.t('workorder.detail.approval.status.pending') || '审批中') : '审批中') : approvalModule.inlineApprovalRecord.status === 'approved' ? (window.t ? (window.t('workorder.detail.approval.status.approved') || '已通过') : '已通过') : approvalModule.inlineApprovalRecord.status === 'returned_to_submitter' ? '已退回(待修改)' : approvalModule.inlineApprovalRecord.status === 'returned_to_node' ? '已退回(待重审)' : (window.t ? (window.t('workorder.detail.approval.status.rejected') || '已拒绝') : '已拒绝') }} {{ approvalModule.inlineApprovalRecord.created_by_name || approvalModule.inlineApprovalRecord.created_by }} {{ approvalModule.inlineApprovalRecord.created_at ? new Date(approvalModule.inlineApprovalRecord.created_at).toLocaleString(getLocale()) : '' }}
{{ (window.t ? (window.t('workorder.detail.approval.history') || '审批历史') : '审批历史') }}
{{ (window.t ? (window.t('workorder.detail.approval.step') || '步骤') : '步骤') }} {{ step.step_number }}: {{ step.step_name }} {{ step.approve_mode === 'all' ? '会签' : '或签' }}
{{ (window.t ? (window.t('workorder.detail.approval.approver') || '审批人') : '审批人') }}: {{ step.approver_name }}
{{ (window.t ? (window.t('workorder.detail.approval.statusLabel') || '状态') : '状态') }}: {{ step.status === 'pending' ? (window.t ? (window.t('workorder.detail.approval.status.pendingShort') || '待审批') : '待审批') : step.status === 'approved' ? (window.t ? (window.t('workorder.detail.approval.status.approved') || '已通过') : '已通过') : step.status === 'rejected' ? (window.t ? (window.t('workorder.detail.approval.status.rejected') || '已拒绝') : '已拒绝') : (step.status === 'returned_to_submitter' || step.status === 'returned_to_node') ? '已退回' : step.status === 'cancelled' ? '已撤销' : step.status }}
{{ (window.t ? (window.t('workorder.detail.approval.comment') || '意见') : '意见') }}: {{ step.comments }}
{{ new Date(step.approved_at).toLocaleString(getLocale()) }}
{{ (window.t ? (window.t('workorder.detail.approval.noSteps') || '暂无审批步骤记录') : '暂无审批步骤记录') }}
{{ (window.t ? (window.t('workorder.detail.approval.noRecord') || '暂无审批记录') : '暂无审批记录') }}
{{ (window.t ? (window.t('workorder.detail.approval.approvedTitle') || '审批已通过,工单可正常操作') : '审批已通过,工单可正常操作') }}
{{ approvalModule.inlineApprovalExpanded ? (window.t ? (window.t('workorder.detail.approval.collapse') || '收起详情 ↑') : '收起详情 ↑') : (window.t ? (window.t('workorder.detail.approval.expand') || '查看审批进度 ↓') : '查看审批进度 ↓') }}
{{ approvalModule.inlineApprovalRecord.workflow_name || (window.t ? (window.t('workorder.detail.approval.defaultWorkflow') || '默认流程') : '默认流程') }} {{ (window.t ? (window.t('workorder.detail.approval.status.approved') || '已通过') : '已通过') }} {{ approvalModule.inlineApprovalRecord.created_by_name || approvalModule.inlineApprovalRecord.created_by }} {{ approvalModule.inlineApprovalRecord.created_at ? new Date(approvalModule.inlineApprovalRecord.created_at).toLocaleString(getLocale()) : '' }}
{{ (window.t ? (window.t('workorder.detail.approval.history') || '审批历史') : '审批历史') }}
{{ (window.t ? (window.t('workorder.detail.approval.step') || '步骤') : '步骤') }} {{ step.step_number }}: {{ step.step_name }} {{ step.approve_mode === 'all' ? '会签' : '或签' }}
{{ (window.t ? (window.t('workorder.detail.approval.approver') || '审批人') : '审批人') }}: {{ step.approver_name }}
{{ (window.t ? (window.t('workorder.detail.approval.statusLabel') || '状态') : '状态') }}: {{ step.status === 'pending' ? (window.t ? (window.t('workorder.detail.approval.status.pendingShort') || '待审批') : '待审批') : step.status === 'approved' ? (window.t ? (window.t('workorder.detail.approval.status.approved') || '已通过') : '已通过') : step.status === 'rejected' ? (window.t ? (window.t('workorder.detail.approval.status.rejected') || '已拒绝') : '已拒绝') : (step.status === 'returned_to_submitter' || step.status === 'returned_to_node') ? '已退回' : step.status === 'cancelled' ? '已撤销' : step.status }}
{{ (window.t ? (window.t('workorder.detail.approval.comment') || '意见') : '意见') }}: {{ step.comments }}
{{ new Date(step.approved_at).toLocaleString(getLocale()) }}
{{ (window.t ? (window.t('workorder.detail.approval.noSteps') || '暂无审批步骤记录') : '暂无审批步骤记录') }}
{{ (window.t ? (window.t('workorder.detail.approval.noRecord') || '暂无审批记录') : '暂无审批记录') }}
{{ (window.t ? (window.t('workorder.detail.approval.rejectedTitle') || '审批已被拒绝') : '审批已被拒绝') }}
{{ (window.t ? (window.t('workorder.detail.approval.rejectedHint') || '工单已自动取消,如需重新申请请创建新工单') : '工单已自动取消,如需重新申请请创建新工单') }}
↩️
{{ selectedWorkOrder.approval_status === 'returned_to_submitter' ? '审批已退回,请修改后重新提交' : '审批已退回至前置审批节点重审' }}
退回原因: {{ approvalModule.inlineApprovalRecord.return_reason }}
📅 {{ (window.t ? (window.t('workorder.detail.sections.statusTime') || '状态与时间') : '状态与时间') }}
{{ (window.t ? (window.t('workorder.detail.labels.currentStatus') || '当前状态') : '当前状态') }} {{ getWorkOrderStatusText ? getWorkOrderStatusText(selectedWorkOrder.status) : selectedWorkOrder.status }} {{ (window.t ? (window.t('workorder.detail.actions.assign') || '分配') : '分配') }} {{ (window.t ? (window.t('workorder.detail.actions.start') || '开始') : '开始') }} {{ (window.t ? (window.t('workorder.detail.actions.closeWorkOrder') || '关闭工单') : '关闭工单') }} {{ (window.t ? (window.t('workorder.detail.actions.inspectionExecute') || '点检执行') : '点检执行') }} {{ (window.t ? (window.t('workorder.detail.actions.inspectionConfirm') || '点检确认') : '点检确认') }} {{ (window.t ? (window.t('workorder.detail.actions.cancel') || '取消') : '取消') }} 退回源租户 {{ (window.t ? (window.t('workorder.detail.actions.cancelApproval') || '撤销审批') : '撤销审批') }} {{ (window.t ? (window.t('workorder.detail.actions.resubmitApproval') || '🔄 重新提交审批') : '🔄 重新提交审批') }} {{ (window.t ? (window.t('workorder.detail.actions.exportReport') || '导出报表') : '导出报表') }}
{{ (window.t ? (window.t('workorder.detail.labels.scheduledStart') || '计划开始') : '计划开始') }} 📅 {{ formatDateTime(selectedWorkOrder.scheduled_start) }}
{{ (window.t ? (window.t('workorder.detail.labels.scheduledEnd') || '计划完成') : '计划完成') }} 📅 {{ formatDateTime(selectedWorkOrder.scheduled_end) }}
{{ (window.t ? (window.t('workorder.detail.labels.actualStart') || '实际开始') : '实际开始') }} 🕐 {{ formatDateTime(selectedWorkOrder.actual_start) }}
{{ (window.t ? (window.t('workorder.detail.labels.completedAt') || '实际完成') : '实际完成') }} 🕐 {{ formatDateTime(selectedWorkOrder.completed_at) }}
{{ (window.t ? (window.t('workorder.detail.labels.actualHours') || '实际工时') : '实际工时') }} ⏱ {{ selectedWorkOrder.actual_hours != null ? (selectedWorkOrder.actual_hours + ' h') : '-' }}
📋 {{ (window.t ? (window.t('workorder.detail.sections.closeInfo') || '关闭信息') : '关闭信息') }}
{{ (window.t ? (window.t('workorder.detail.labels.closeReason') || '关闭原因') : '关闭原因') }} {{ (window.t ? (window.t('workorder.close.reasons.' + selectedWorkOrder.close_reason) || selectedWorkOrder.close_reason) : selectedWorkOrder.close_reason) }}
{{ (window.t ? (window.t('workorder.detail.labels.closeRemark') || '关闭备注') : '关闭备注') }} {{ selectedWorkOrder.close_remark }}
📷 {{ (window.t ? (window.t('workorder.close.photos') || '现场照片') : '现场照片') }}
{{ (window.t ? (window.t('workorder.detail.sections.rating') || '客户评价') : '客户评价') }}
📎 {{ (window.t ? (window.t('workorder.detail.sections.attachments') || '附件') : '附件') }} {{ (selectedWorkOrder.attachments || []).length }}
{{ (window.t ? (window.t('workorder.detail.actions.refresh') || '刷新') : '刷新') }}
📸 {{ (window.t ? (window.t('workorder.detail.sections.snapshots') || 'BIM截图') : 'BIM截图') }} {{ (workOrderSnapshots || []).length }}
{{ (window.t ? (window.t('workorder.detail.actions.refresh') || '刷新') : '刷新') }}
⚠️ 额外发现 {{ (workOrderFindings || []).length }}
刷新
💬 {{ (window.t ? (window.t('workorder.detail.sections.comments') || '备注记录') : '备注记录') }} {{ (workOrderComments || []).length }}
{{ (window.t ? (window.t('workorder.detail.actions.refresh') || '刷新') : '刷新') }}
{{ user.name || user.username }} ({{ user.user_id }}) {{ tt('workorder.assign.onDuty') || '当班' }}
{{ workOrderModule.assigneeFilter?.filteredByOnDuty ? (tt('workorder.assign.onDutyOnlyHint') || '已按当前当班人员筛选') : (tt('workorder.assign.showingAllHint') || '正在显示全部可见人员') }} {{ tt('workorder.assign.showAll') || '显示全部' }}
{{ tt('workorder.assign.nonDutyWarning') || '所选负责人当前不在该部门/时间的已发布排班中,系统允许保存,请确认现场安排。' }}
{{ batchAssignQualificationWarning }}
{{ t('workorder.hierarchy.batchMaterialRelatedWO') || '关联工单' }} ({{ hierarchyMaterialGroup.work_orders?.length || 0 }}) {{ t('workorder.hierarchy.batchMaterialClickToSelect') || '点击选择领料工单,双击查看详情' }}
{{ t('workorder.hierarchy.batchMaterialAll') || '全部' }} {{ wo.equipment_name || wo.title }} #{{ wo.work_order_id }}
{{ (m.part_name || m.part_id) }} · {{ (m.quotation_meta && m.quotation_meta.quotation_code) || m.quotation_item_id }}
{{ t('workorder.materials_dialog.scopeBom')||'型号BOM' }} {{ t('workorder.materials_dialog.scopeAll')||'全部备件' }}
{{ part.name }}
{{ part.part_number || part.spare_part_id }} | {{ t('workorder.hierarchy.batchMaterialStock') || '库存' }}: {{ part.quantity || 0 }}
{{ t('workorder.materials_dialog.bomEmpty')||'该设备型号暂无 BOM 备件,可切换"全部备件"' }}
{{ t('workorder.hierarchy.batchMaterialCurrentStock') || '当前库存' }}: {{ hierarchyMaterialForm.selectedPart.quantity || 0 }} | {{ t('workorder.hierarchy.batchMaterialUnitPrice') || '单价' }}: ¥{{ hierarchyMaterialForm.selectedPart.unit_price || 0 }}
⚠️ {{ t('workorder.hierarchy.batchMaterialStockInsufficient') || '库存不足' }}
📷
{{ t('workorder.hierarchy.batchMaterialScanHint') || '支持摄像头扫码、图片识别或 USB 扫码枪直接扫入' }}
{{ t('workorder.hierarchy.batchMaterialAllowAdjust') || '库存不足时兜底' }}
{{ t('workorder.hierarchy.batchMaterialAdd') || '添加领料记录' }}
{{ (hierarchyMaterialForm.part_id && hierarchyMaterialForm.quantity >= 1) ? (t('workorder.hierarchy.batchMaterialAddReadyHint') || '添加后会立即写入当前选中工单的已领料记录') : (t('workorder.hierarchy.batchMaterialAddDisabledHint') || '先选择备件并填写数量,再添加到下方已领料记录') }}
{{ t('workorder.hierarchy.batchMaterialRecords') || '已领料记录' }} ({{ hierarchyMaterialList.length }}) {{ t('workorder.hierarchy.batchMaterialAllReadonlyHint') || '全部子机构汇总(只读),如需添加领料请选择具体子机构工单' }}
{{ t('workorder.hierarchy.batchCostRelatedWO') || '关联工单' }} ({{ hierarchyCostGroup.work_orders?.length || 0 }}) {{ t('workorder.hierarchy.batchCostClickToSelect') || '点击选择目标工单,双击查看详情' }}
{{ t('workorder.hierarchy.batchCostAll') || '全部' }} {{ wo.equipment_name || wo.title }} #{{ wo.work_order_id }}
{{ hierarchyCostForm._mode === 'edit' ? (t('cost.modal.editCost')||'编辑费用') : (t('cost.modal.addCost')||'添加费用') }} {{ t('cost.modal.cancelEdit')||'取消编辑' }}
{{ t('cost.modal.type')||'类型' }}
{{ t('cost.modal.typeLabor')||'人工' }} {{ t('cost.modal.typeOutsource')||'外包' }} {{ t('cost.modal.typeOther')||'其他' }}
{{ t('cost.modal.description')||'说明' }}
{{ t('cost.modal.rate')||'费率' }}
{{ r.name }} (¥{{ r.rate_per_hour }}/h)
{{ t('cost.modal.supplier')||'外包商' }}
{{ s.label }}
{{ t('cost.modal.date')||'日期' }}
{{ hierarchyCostForm.cost_type === 'labor' ? (t('cost.modal.hours')||'工时') : (t('cost.modal.quantity')||'数量') }}
{{ t('cost.modal.unitPrice')||'单价' }}
{{ t('cost.modal.amount')||'金额' }}
{{ t('cost.modal.invoiceNo')||'发票号' }}
{{ hierarchyCostForm._mode === 'edit' ? (t('cost.modal.save')||'保存') : (t('cost.modal.add')||'添加') }}
{{ t('cost.modal.filterAll')||'全部' }} {{ t('cost.modal.filterLabor')||'人工' }} {{ t('cost.modal.filterOutsource')||'外包' }} {{ t('cost.modal.filterOther')||'其他' }} {{ (t('cost.modal.totalCount')||'共 {count} 条').replace('{count}', hierarchyCostFilteredItems.length) }}
{{ t('workorder.hierarchy.batchCostAllReadonlyHint') || '全部子机构汇总(只读),如需添加费用请选择具体子机构工单' }}
设置默认评分(可逐个调整)
共 {{ batchRatingPendingWorkOrders.length }} 个待评价工单
{{ batchRatingForm.rating >= star ? '★' : '☆' }}
{{ batchRatingForm.rating ? ['', '很差', '较差', '一般', '满意', '非常满意'][batchRatingForm.rating] : '请点击星星设置默认评分' }}
待评价工单(点击星星可单独调整):
{{ wo.equipment_name }}
{{ wo.title || wo.work_order_id }}
{{ wo._rating >= star ? '★' : '☆' }}
{{ t('crossTenantDispatch.modal.expireHint') || '超时后将自动过期' }}
🔗 {{ hierarchyDispatchForm.hierarchy_plan_name || (t('crossTenantDispatch.modal.groupWorkOrder') || '组合工单') }}
{{ t('crossTenantDispatch.modal.groupIdLabel') || '组合ID' }}: {{ hierarchyDispatchForm.hierarchy_group_id }} {{ t('crossTenantDispatch.modal.workOrderCountLabel') || '工单数' }}: {{ hierarchyDispatchForm.work_order_count }} {{ t('crossTenantDispatch.modal.unitCount') || '个' }}
{{ t('crossTenantDispatch.modal.rootEquipment') || '根设备' }}: {{ hierarchyDispatchForm.root_equipment_name }}
{{ t('crossTenantDispatch.modal.expireHint') || '超时后将自动过期' }}
⚠️ {{ t('crossTenantDispatch.modal.batchDispatchWarning')?.replace('{count}', hierarchyDispatchForm.work_order_count) || ('将整组 ' + hierarchyDispatchForm.work_order_count + ' 个工单批量派单到目标租户') }}
🔗 {{ (window.t ? (window.t('crossTenantDispatch.card.batchDispatch') || '组合派单') : '组合派单') }} {{ window.t ? (window.t('crossTenantDispatch.card.workOrderCount', { count: (hierarchyAcceptForm.dispatch_info.work_orders?.length || 0) }) || `${hierarchyAcceptForm.dispatch_info.work_orders?.length || 0} 个工单`) : `${hierarchyAcceptForm.dispatch_info.work_orders?.length || 0} 个工单` }}
{{ (window.t ? (window.t('crossTenantDispatch.modal.sourceTenant') || '来源租户') : '来源租户') }}: {{ hierarchyAcceptForm.dispatch_info.source_tenant_name }}
{{ (window.t ? (window.t('crossTenantDispatch.modal.groupId') || '组合ID') : '组合ID') }}: {{ hierarchyAcceptForm.dispatch_info.source_hierarchy_group_id }}
{{ (window.t ? (window.t('crossTenantDispatch.modal.remark') || '备注') : '备注') }}: {{ hierarchyAcceptForm.dispatch_info.dispatch_note }}
{{ u.name || u.username }} ({{ u.username || u.user_id }})
{{ crossTenantAcceptForm.dispatch_info.work_order_summary?.title }}
{{ (window.t ? (window.t('crossTenantDispatch.card.from') || '来自') : '来自') }}: {{ crossTenantAcceptForm.dispatch_info.source_tenant_name }} {{ (window.t ? (window.t('crossTenantDispatch.card.type') || '类型') : '类型') }}: {{ crossTenantAcceptForm.dispatch_info.work_order_summary?.type }}
{{ u.name || u.username }} ({{ u.username || u.user_id }})
{{ (window.t ? (window.t(item.labelKey) || item.value) : item.value) }}
📷
{{ (window.t ? (window.t('workorder.close.uploadPhoto') || '上传照片') : '上传照片') }}
{{ (window.t ? (window.t('workorder.close.photoHint') || '最多5张,支持 JPG/PNG 格式') : '最多5张,支持 JPG/PNG 格式') }}
{{ (window.t ? (window.t('workorder.hierarchy.closeInfoHint') || '所有子工单都会被关闭,勾选的子工单将写入关闭原因、备注和照片') : '所有子工单都会被关闭,勾选的子工单将写入关闭原因、备注和照片') }}
{{ wo.equipment_name }} 根设备 已关闭
{{ (window.t ? (window.t(item.labelKey) || item.value) : item.value) }}
{{ (window.t ? (window.t('workorder.complete.actualHoursHintGroupRoot') || '填写后仅写入根装备子工单,自动生成人工费用明细;不填则跳过(避免在多个子机构上重复计费)。') : '填写后仅写入根装备子工单,自动生成人工费用明细;不填则跳过(避免在多个子机构上重复计费)。') }}
📷
{{ (window.t ? (window.t('workorder.close.uploadPhoto') || '上传照片') : '上传照片') }}
{{ (window.t ? (window.t('workorder.close.photoHint') || '最多5张,支持 JPG/PNG 格式') : '最多5张,支持 JPG/PNG 格式') }}
暂无附件

{{ (window.t ? (window.t('equipment.title') || '设备管理') : '设备管理') }}

{{ (window.t ? (window.t('equipment.tree.selectedClear') || '已选中,点击清除') : '已选中,点击清除') }}
{{ (window.t ? (window.t('equipment.tree.all') || '全部设备') : '全部设备') }} {{ equipmentModule?.getLocalizedEquipmentName?.(equipment) || equipment.name }} ({{ equipment.equipment_id }})
{{ (window.t ? (window.t('equipment.structure.currentVersion') || '当前结构版本') : '当前结构版本') }}:{{ (getVersionById(viewerVersion)?.name || getVersionById(viewerVersion)?.version_id || viewerVersion || '-') }}
🔍 {{ (window.t ? (window.t('equipment.filter.title') || '查询条件') : '查询条件') }} {{ (window.t ? (window.t('common.filter.expand') || '点击展开筛选器') : '点击展开筛选器') }} {{ (window.t ? (window.t('equipment.filter.fields.type') || '设备类型') : '设备类型') }}: {{ equipmentModule?.equipmentTypeOptions?.value?.find(t => t.value === equipmentFilter.type)?.label || equipmentFilter.type }} {{ (window.t ? (window.t('equipment.filter.fields.rootEquipment') || '所属装备') : '所属装备') }}: {{ equipmentModule?.selectedRootEquipmentFilterLabel?.value || equipmentFilter.root_equipment_id }}
{{ (window.t ? (window.t('common.reset') || '重置') : '重置') }} {{ (window.t ? (window.t('common.query') || '查询') : '查询') }}
{{ status.label }}
{{ (window.t ? (window.t('equipment.filter.fields.category') || '装备分类') : '装备分类') }} · {{ (window.t ? (window.t('equipment.filter.selectedFromTree') || '已从左侧选中') : '已从左侧选中') }} {{ (window.t ? (window.t('equipment.filter.fields.type') || '设备类型') : '设备类型') }} · {{ (window.t ? (window.t('equipment.filter.selectedFromTree') || '已从左侧选中') : '已从左侧选中') }} {{ (window.t ? (window.t('equipment.filter.fields.customer') || '所属客户') : '所属客户') }} · {{ (window.t ? (window.t('equipment.filter.filteredByCategory') || '已按分类过滤') : '已按分类过滤') }}
{{ (window.t ? (window.t('equipment.filter.fields.rootEquipment') || '所属装备') : '所属装备') }} {{ equipmentModule?.selectedRootEquipmentFilterLabel?.value || equipmentFilter.root_equipment_id }} {{ flatMode ? ((window.t ? (window.t('equipment.filter.filteredByRootEquipment') || '当前列表仅显示该装备及其子机构') : '当前列表仅显示该装备及其子机构')) : '' }}
{{ (window.t ? (window.t('common.filter.expand') || '展开筛选') : '展开筛选') }} {{ (window.t ? (window.t('common.reset') || '清除') : '清除') }}

{{ (window.t ? (window.t('equipment.import.uploadText') || '点击或拖拽文件到此区域上传') : '点击或拖拽文件到此区域上传') }}

{{ (window.t ? (window.t('equipment.import.uploadHint') || '支持 Excel(.xlsx)、CSV 或 JSON 格式,文件需包含 equipment_id(或 code)和 name 字段') : '支持 Excel(.xlsx)、CSV 或 JSON 格式,文件需包含 equipment_id(或 code)和 name 字段') }}

{{ (window.t ? (window.t('equipment.import.templateLabel') || '没有模板?') : '没有模板?') }} {{ (window.t ? (window.t('equipment.import.downloadXlsxTemplate') || '下载 Excel 模板') : '下载 Excel 模板') }} {{ (window.t ? (window.t('equipment.import.downloadCsvTemplate') || '下载 CSV 模板') : '下载 CSV 模板') }}

{{ (window.t ? (window.t('equipment.import.errorDetail') || '错误详情:') : '错误详情:') }}

  • {{ err.row }}: {{ err.error }}
{{ (window.t ? (window.t('equipment.import.linksCreated') || '已按 parent_code 自动挂接 {count} 条父子结构') : '已按 parent_code 自动挂接 {count} 条父子结构').replace('{count}', importResult.links_created) }}

{{ (window.t ? (window.t('equipment.import.warningsTitle') || '警告(不阻断导入):') : '警告(不阻断导入):') }}

  • {{ warn.row }}: {{ warn.error }}

{{ (window.t ? (window.t('equipment.import.templateGuide') || '📋 导入模板说明') : '📋 导入模板说明') }}

必填列: equipment_id(或 code), name
status 可选值: RUNNING, MAINTENANCE, FAULT, STOPPED, IDLE
is_component=1 表示机构/组件,component_kind 填机构类别(葫芦/主梁等); parent_code 填父装备编号则导入后自动挂接结构树,留空即为独立机构
tags 多个标签用逗号分隔

📋 {{ (window.t ? (window.t('equipment.form.sections.basicInfo') || '基本信息') : '基本信息') }}
{{ (window.t ? (window.t('equipment.form.autoGenHint') || '未填写将按编号规则自动生成') : '未填写将按编号规则自动生成') }}
{{ (window.t ? (window.t('equipment.isComponent.root') || '根设备(装备)') : '根设备(装备)') }} {{ (window.t ? (window.t('equipment.isComponent.component') || '子机构件') : '子机构件') }}
📍 {{ (window.t ? (window.t('equipment.form.sections.locationOwnership') || '位置与归属') : '位置与归属') }}
保存后按当前周期运行数据自动计算 OEE,创建时不会把这里的值写入设备档案。
📅 {{ (window.t ? (window.t('equipment.form.sections.timeInfo') || '时间信息') : '时间信息') }}
🔒 {{ (window.t ? (window.t('equipment.specialEquipment.title') || '特种设备强检计划') : '特种设备强检计划') }}
🏷️ {{ (window.t ? (window.t('equipment.parameters.typeAttrs') || '类型属性') : '类型属性') }}
{{ equipmentModule.getSchemaFieldLabel(sf) }}({{ sf.unit }}) *
⚙️ {{ (window.t ? (window.t('equipment.parameters.title') || '设备参数') : '设备参数') }}
+ {{ (window.t ? (window.t('equipment.parameters.addParam') || '添加参数') : '添加参数') }}
🔧 {{ (window.t ? (window.t('equipment.spareParts.title') || '关联备件') : '关联备件') }}
📎 {{ (window.t ? (window.t('equipment.form.sections.additionalInfo') || '附加信息') : '附加信息') }}
{{ (window.t ? (window.t('equipment.form.imageSupportHint') || '支持 JPG/PNG/GIF,大小不超过5MB') : '支持 JPG/PNG/GIF,大小不超过5MB') }}
📋 {{ (window.t ? (window.t('equipment.form.sections.basicInfo') || '基本信息') : '基本信息') }}
{{ (window.t ? (window.t('equipment.isComponent.root') || '根设备(装备)') : '根设备(装备)') }} {{ (window.t ? (window.t('equipment.isComponent.component') || '子机构件') : '子机构件') }}
📍 {{ (window.t ? (window.t('equipment.form.sections.locationOwnership') || '位置与归属') : '位置与归属') }}
这里展示的是当前周期计算值,编辑保存不会覆盖 OEE。
📅 {{ (window.t ? (window.t('equipment.form.sections.timeInfo') || '时间信息') : '时间信息') }}
🔒 {{ (window.t ? (window.t('equipment.specialEquipment.title') || '特种设备强检计划') : '特种设备强检计划') }}
🏷️ {{ (window.t ? (window.t('equipment.parameters.typeAttrs') || '类型属性') : '类型属性') }}
{{ equipmentModule.getSchemaFieldLabel(sf) }}({{ sf.unit }}) *
⚙️ {{ (window.t ? (window.t('equipment.parameters.title') || '设备参数') : '设备参数') }}
+ {{ (window.t ? (window.t('equipment.parameters.addParam') || '添加参数') : '添加参数') }}
🔧 {{ (window.t ? (window.t('equipment.spareParts.title') || '关联备件') : '关联备件') }}
📎 {{ (window.t ? (window.t('equipment.form.sections.additionalInfo') || '附加信息') : '附加信息') }}
{{ (window.t ? (window.t('equipment.form.imageSupportHint') || '支持 JPG/PNG/GIF,大小不超过5MB') : '支持 JPG/PNG/GIF,大小不超过5MB') }}
{{ selectedEquipment.equipment_id }} {{ (window.formatI18nName && window.formatI18nName(selectedEquipment)) || selectedEquipment.name }} {{ equipmentModule?.getLocalizedEquipmentType ? equipmentModule.getLocalizedEquipmentType(selectedEquipment.type) : selectedEquipment.type }} {{ getStatusText(selectedEquipment.status) }} {{ formatOEE(selectedEquipment.oee || 0) }} {{ selectedEquipment.location }} {{ selectedEquipment.department_name || '-' }} {{ selectedEquipment.customer_name || '-' }} {{ (window.t ? (window.t('equipment.detail.noTags') || '无标签') : '无标签') }} {{ getLocalizedEquipmentCategory(selectedEquipment) || '-' }} {{ selectedEquipment.model || (window.t ? (window.t('equipment.detail.unknown') || '未知') : '未知') }} {{ selectedEquipment.manufacturer || (window.t ? (window.t('equipment.detail.unknown') || '未知') : '未知') }} {{ selectedEquipment.asset_number || '-' }} {{ selectedEquipment.installation_date || selectedEquipment.install_date || (window.t ? (window.t('equipment.detail.unknown') || '未知') : '未知') }} {{ selectedEquipment.warranty_end_date || selectedEquipment.warranty_end || (window.t ? (window.t('equipment.detail.unknown') || '未知') : '未知') }} {{ selectedEquipment.last_maintenance_date || selectedEquipment.last_maintenance || (window.t ? (window.t('equipment.detail.unknown') || '未知') : '未知') }} {{ selectedEquipment.next_maintenance_date || selectedEquipment.next_maintenance || (window.t ? (window.t('equipment.detail.notPlanned') || '未计划') : '未计划') }} {{ selectedEquipment.commissioning_date || '-' }} {{ selectedEquipment.scrap_date || '-' }} - - - {{ selectedEquipment.qr_code_url }}
📱 {{ (window.t ? (window.t('qrCode.title') || '二维码') : '二维码') }}
{{ (window.t ? (window.t('equipment.components.tabTitle') || '子件清单') : '子件清单') }} ({{ (componentsCache[selectedEquipment.equipment_id] || []).length }}) {{ (window.t ? (window.t('equipment.components.generateFromTemplate') || '按模板补齐') : '按模板补齐') }}
{{ (window.t ? (window.t('equipment.detail.healthScore') || '设备健康评分') : '设备健康评分') }}
{{ equipmentModule?.equipmentHistorySummary?.maintenance_summary?.total_count || 0 }}
{{ (window.t ? (window.t('equipment.history.totalCount') || '总次数') : '总次数') }}
{{ equipmentModule?.equipmentHistorySummary?.maintenance_summary?.this_year_count || 0 }}
{{ (window.t ? (window.t('equipment.history.thisYearCount') || '本年度') : '本年度') }}
{{ equipmentModule?.equipmentHistorySummary?.maintenance_summary?.last_date ? equipmentModule.equipmentHistorySummary.maintenance_summary.last_date.substring(0, 10) : '-' }}
{{ (window.t ? (window.t('equipment.history.lastDate') || '最近日期') : '最近日期') }}
{{ (window.t ? (window.t('equipment.history.noRecords') || '暂无记录') : '暂无记录') }}
{{ wo.work_order_id }} {{ wo.status }} 🔗 {{ (window.t ? (window.t('equipment.history.combined') || '组合') : '组合') }}
{{ wo.priority || '' }}
{{ wo.title }}
{{ wo.type || '' }} · {{ wo.created_at ? wo.created_at.substring(0, 10) : '-' }}
加载更多...
已显示全部 {{ equipmentModule.maintenanceHistoryData.value.length }} 条记录
{{ equipmentModule?.equipmentHistorySummary?.repair_summary?.total_count || 0 }}
{{ (window.t ? (window.t('equipment.history.totalCount') || '总次数') : '总次数') }}
{{ equipmentModule?.equipmentHistorySummary?.repair_summary?.this_year_count || 0 }}
{{ (window.t ? (window.t('equipment.history.thisYearCount') || '本年度') : '本年度') }}
{{ equipmentModule?.equipmentHistorySummary?.repair_summary?.last_date ? equipmentModule.equipmentHistorySummary.repair_summary.last_date.substring(0, 10) : '-' }}
{{ (window.t ? (window.t('equipment.history.lastDate') || '最近日期') : '最近日期') }}
{{ (window.t ? (window.t('equipment.history.noRecords') || '暂无记录') : '暂无记录') }}
{{ wo.work_order_id }} {{ wo.status }} 🔗 {{ (window.t ? (window.t('equipment.history.combined') || '组合') : '组合') }}
{{ wo.priority || '' }}
{{ wo.title }}
{{ wo.type || '' }} · {{ wo.created_at ? wo.created_at.substring(0, 10) : '-' }} — {{ wo.description.length > 30 ? wo.description.substring(0, 30) + '...' : wo.description }}
加载更多...
已显示全部 {{ equipmentModule.repairHistoryData.value.length }} 条记录
{{ equipmentModule?.equipmentHistorySummary?.spare_usage_summary?.total_count || 0 }}
{{ (window.t ? (window.t('equipment.history.totalCount') || '总次数') : '总次数') }}
¥{{ (equipmentModule?.equipmentHistorySummary?.spare_usage_summary?.total_cost || 0).toLocaleString() }}
{{ (window.t ? (window.t('equipment.history.totalCost') || '总费用') : '总费用') }}
{{ (window.t ? (window.t('equipment.history.noRecords') || '暂无记录') : '暂无记录') }}
{{ item.part_name || item.part_id }} ×{{ item.quantity }}
🔧 {{ item.work_order_title }}
{{ item.work_order_id }} {{ item.total_cost != null ? '¥' + Number(item.total_cost).toLocaleString() : '' }}
📍 {{ (window.t ? (window.t('equipment.history.fromChild') || '来自子机构') : '来自子机构') }}:{{ item.source_equipment_name || item.source_equipment_id }}
{{ item.created_at ? item.created_at.substring(0, 10) : '-' }}
加载更多...
已显示全部 {{ equipmentModule.spareUsageHistoryData.value.length }} 条记录
{{ generateRootEquipment.equipment_id }} · {{ generateRootEquipment.name }}
{{ (window.t ? (window.t('equipment.components.modeCreateMissing') || '仅创建缺失项') : '仅创建缺失项') }} {{ (window.t ? (window.t('equipment.components.modeCreateAll') || '按模板数量全量创建') : '按模板数量全量创建') }}

{{ (window.t ? (window.t('equipment.components.diffHint') || '绿色=新增,灰色=跳过。点击「确认创建」处理。') : '绿色=新增,灰色=跳过。点击「确认创建」处理。') }}

{{ (window.t && window.t('equipmentMap.panel.controls.scopeRootOnly') !== 'equipmentMap.panel.controls.scopeRootOnly') ? window.t('equipmentMap.panel.controls.scopeRootOnly') : '仅装备' }} {{ (window.t && window.t('equipmentMap.panel.controls.scopeAll') !== 'equipmentMap.panel.controls.scopeAll') ? window.t('equipmentMap.panel.controls.scopeAll') : '全部' }}
👆 {{ (window.t ? (window.t('equipmentMap.locate.tip') || '请在地图上点击设备的实际位置') : '请在地图上点击设备的实际位置') }}
{{ (window.t ? (window.t('common.cancel') || '取消') : '取消') }}
🎯
{{ (window.t ? (window.t('equipmentMap.panel.controls.title') || '设备状态筛选') : '设备状态筛选') }}
{{ (window.t ? (window.t('equipmentMap.panel.controls.subtitleLoaded', { count: equipmentMapModule.stats.total }) || ('已加载 ' + equipmentMapModule.stats.total + ' 台设备')) : ('已加载 ' + equipmentMapModule.stats.total + ' 台设备')) }}
{{ (window.t ? (window.t('equipmentMap.panel.controls.selectedCount', { count: (equipmentMapModule.statusFilter?.value?.length || 0) }) || ('已选 ' + (equipmentMapModule.statusFilter?.value?.length || 0))) : ('已选 ' + (equipmentMapModule.statusFilter?.value?.length || 0))) }}
📍 {{ (window.t ? (window.t('equipmentMap.panel.controls.locationFilter') || '地点筛选') : '地点筛选') }}
👤 {{ (window.t ? (window.t('equipmentMap.panel.controls.customerFilter') || '客户') : '客户') }}
{{ (window.t && window.t('equipmentMap.panel.controls.scopeFilter') !== 'equipmentMap.panel.controls.scopeFilter') ? window.t('equipmentMap.panel.controls.scopeFilter') : '设备层级' }}
{{ (window.t && window.t('equipmentMap.panel.controls.scopeRootOnly') !== 'equipmentMap.panel.controls.scopeRootOnly') ? window.t('equipmentMap.panel.controls.scopeRootOnly') : '仅装备' }} {{ (window.t && window.t('equipmentMap.panel.controls.scopeAll') !== 'equipmentMap.panel.controls.scopeAll') ? window.t('equipmentMap.panel.controls.scopeAll') : '全部' }}
{{ (window.t ? (window.t('equipmentMap.panel.controls.statusList') || '状态列表') : '状态列表') }}
{{ (window.t ? (window.t('equipmentMap.status.running') || '运行') : '运行') }} {{ (window.t ? (window.t('equipmentMap.status.stopped') || '停机') : '停机') }} {{ (window.t ? (window.t('equipmentMap.status.fault') || '故障') : '故障') }} {{ (window.t ? (window.t('equipmentMap.status.maintenance') || '维护') : '维护') }} {{ (window.t ? (window.t('equipmentMap.status.reserved') || '预留') : '预留') }} {{ (window.t ? (window.t('equipmentMap.status.standby') || '待机') : '待机') }} {{ (window.t ? (window.t('equipmentMap.status.unknown') || '未知') : '未知') }}
{{ (window.t ? (window.t('equipmentMap.panel.controls.layerPoint') || '点位图') : '点位图') }} {{ (window.t ? (window.t('equipmentMap.panel.controls.layerHeatmap') || '热力图') : '热力图') }}
{{ (window.t ? (window.t('equipmentMap.panel.controls.heatmapMetric') || '热力指标') : '热力指标') }}
{{ (window.t ? (window.t('equipmentMap.panel.controls.heatmapMetricOptions.faultCount') || '故障次数') : '故障次数') }} {{ (window.t ? (window.t('equipmentMap.panel.controls.heatmapMetricOptions.maintenanceHours') || '维护工时') : '维护工时') }} {{ (window.t ? (window.t('equipmentMap.panel.controls.heatmapMetricOptions.downtime') || '停机时长') : '停机时长') }} {{ (window.t ? (window.t('equipmentMap.panel.controls.heatmapMetricOptions.healthScore') || '健康分数 (反转)') : '健康分数 (反转)') }}
{{ (window.t ? (window.t('equipmentMap.panel.controls.timeRange') || '时间范围') : '时间范围') }}
{{ (window.t ? (window.t('equipmentMap.panel.controls.timeRangeOptions.days7') || '近7天') : '近7天') }} {{ (window.t ? (window.t('equipmentMap.panel.controls.timeRangeOptions.days30') || '近30天') : '近30天') }} {{ (window.t ? (window.t('equipmentMap.panel.controls.timeRangeOptions.days90') || '近90天') : '近90天') }} {{ (window.t ? (window.t('equipmentMap.panel.controls.timeRangeOptions.days180') || '近半年') : '近半年') }} {{ (window.t ? (window.t('equipmentMap.panel.controls.timeRangeOptions.days365') || '近一年') : '近一年') }}
🔄 {{ (window.t ? (window.t('equipmentMap.panel.controls.refreshMap') || '刷新地图') : '刷新地图') }} 📍 {{ (window.t ? (window.t('equipmentMap.panel.controls.locateCurrent') || '定位当前位置') : '定位当前位置') }}
📌 {{ (window.t ? (window.t('equipmentMap.panel.controls.startLocate') || '设备地图定位') : '设备地图定位') }}
🧭
{{ (window.t ? (window.t('equipmentMap.panel.legend.title') || '设备状态') : '设备状态') }}
{{ (window.t ? (window.t('equipmentMap.panel.legend.subtitle') || '颜色与数量对照') : '颜色与数量对照') }}
{{ item.label }} {{ equipmentMapModule.stats[item.key] || 0 }}
📊
{{ (window.t ? (window.t('equipmentMap.panel.stats.title') || '设备总数') : '设备总数') }}
{{ (window.t ? (window.t('equipmentMap.panel.stats.subtitle') || '当前视图实时统计') : '当前视图实时统计') }}
{{ equipmentMapModule.stats.total }} {{ (window.t ? (window.t('equipmentMap.units.equipment') || '台') : '台') }}
{{ (window.t ? (window.t('equipmentMap.panel.stats.runningRate') || '运行占比') : '运行占比') }}
{{ equipmentMapModule.getRunningPercent() }}%
{{ (window.t ? (window.t('equipmentMap.panel.stats.runningHint') || '在线运行') : '在线运行') }}
{{ item.label }} {{ equipmentMapModule.stats[item.key] || 0 }}
📷
{{ (window.t ? (window.t('equipmentMap.detail.imageEmpty') || '暂无设备图片') : '暂无设备图片') }}
🔍 {{ (window.t ? (window.t('equipmentMap.detail.imageViewLarge') || '点击查看大图') : '点击查看大图') }}
{{ equipmentMapModule.selectedEquipment.value?.equipment_id }} {{ getLocalizedEquipmentName(equipmentMapModule.selectedEquipment.value) }} {{ equipmentMapModule.getLocalizedEquipmentType(equipmentMapModule.selectedEquipment.value?.type) || '-' }} {{ equipmentMapModule.selectedEquipment.value?.status }} {{ equipmentMapModule.selectedEquipment.value?.locationDisplay || equipmentMapModule.selectedEquipment.value?.location_name || (window.t ? (window.t('equipmentMap.detail.notProvided') || '未提供') : '未提供') }} {{ equipmentMapModule.selectedEquipment.value?.department_name || '-' }} {{ equipmentMapModule.selectedEquipment.value?.customer_name || '-' }} 👁️ {{ (window.t ? (window.t('equipmentMap.detail.viewDetail') || '查看详情') : '查看详情') }} ➕ {{ (window.t ? (window.t('equipmentMap.detail.createWorkOrder') || '创建工单') : '创建工单') }} 📋 {{ (window.t ? (window.t('equipmentMap.detail.inspect') || '点检') : '点检') }} 🧭 {{ (window.t ? (window.t('equipmentMap.detail.navigate') || '导航') : '导航') }} 📱 {{ (window.t ? (window.t('qrCode.title') || '二维码') : '二维码') }}
{{ equipmentMapModule?.mapHistorySummary?.maintenance_summary?.total_count || 0 }}
{{ (window.t ? (window.t('equipment.history.totalCount') || '总次数') : '总次数') }}
{{ equipmentMapModule?.mapHistorySummary?.maintenance_summary?.this_year_count || 0 }}
{{ (window.t ? (window.t('equipment.history.thisYearCount') || '本年度') : '本年度') }}
{{ equipmentMapModule?.mapHistorySummary?.maintenance_summary?.last_date ? equipmentMapModule.mapHistorySummary.maintenance_summary.last_date.substring(0, 10) : '-' }}
{{ (window.t ? (window.t('equipment.history.lastDate') || '最近日期') : '最近日期') }}
{{ (window.t ? (window.t('equipment.history.noRecords') || '暂无记录') : '暂无记录') }}
{{ wo.work_order_id }} {{ wo.status }} 🔗 {{ (window.t ? (window.t('equipment.history.combined') || '组合') : '组合') }}
{{ wo.priority || '' }}
{{ wo.title }}
{{ wo.type || '' }} · {{ wo.created_at ? wo.created_at.substring(0, 10) : '-' }}
{{ equipmentMapModule?.mapHistorySummary?.repair_summary?.total_count || 0 }}
{{ (window.t ? (window.t('equipment.history.totalCount') || '总次数') : '总次数') }}
{{ equipmentMapModule?.mapHistorySummary?.repair_summary?.this_year_count || 0 }}
{{ (window.t ? (window.t('equipment.history.thisYearCount') || '本年度') : '本年度') }}
{{ equipmentMapModule?.mapHistorySummary?.repair_summary?.last_date ? equipmentMapModule.mapHistorySummary.repair_summary.last_date.substring(0, 10) : '-' }}
{{ (window.t ? (window.t('equipment.history.lastDate') || '最近日期') : '最近日期') }}
{{ (window.t ? (window.t('equipment.history.noRecords') || '暂无记录') : '暂无记录') }}
{{ wo.work_order_id }} {{ wo.status }} 🔗 {{ (window.t ? (window.t('equipment.history.combined') || '组合') : '组合') }}
{{ wo.priority || '' }}
{{ wo.title }}
{{ wo.type || '' }} · {{ wo.created_at ? wo.created_at.substring(0, 10) : '-' }}
{{ equipmentMapModule?.mapHistorySummary?.spare_usage_summary?.total_count || 0 }}
{{ (window.t ? (window.t('equipment.history.totalCount') || '总次数') : '总次数') }}
¥{{ (equipmentMapModule?.mapHistorySummary?.spare_usage_summary?.total_cost || 0).toLocaleString() }}
{{ (window.t ? (window.t('equipment.history.totalCost') || '总费用') : '总费用') }}
{{ (window.t ? (window.t('equipment.history.noRecords') || '暂无记录') : '暂无记录') }}
{{ item.part_name || item.part_id }} ×{{ item.quantity }}
{{ item.work_order_id }} {{ item.total_cost != null ? '¥' + Number(item.total_cost).toLocaleString() : '' }}
{{ item.created_at ? item.created_at.substring(0, 10) : '-' }}
{{ equipmentMapModule.qrEquipment.value?.equipment_id }}
⬇️ {{ (window.t ? (window.t('qrCode.download') || '下载二维码') : '下载二维码') }}

{{ t('bim.title') }}

{{ t('bim.viewer.view_mode') }} 2D 3D
{{ (window.t ? (window.t('bim.viewer.flat_mode') || '展平模式') : '展平模式') }}
位置
{{ bimFlatMode ? ((window.t ? (window.t('bim.viewer.type_filter') || '设备类型') : '设备类型')) : ((window.t ? (window.t('bim.viewer.category_filter') || '装备分类') : '装备分类')) }}
{{ t('bim.viewer.select_equipment') }} {{ t('bim.viewer.all_equipment') }} {{ getLocalizedEquipmentName(equipment) }} ({{ equipment.equipment_id }})
{{ t('bim.viewer.structure_version') }} {{ (ver.name || ver.version_id) + (ver.is_active ? (' (' + t('bim.viewer.version_status.current') + ')') : (ver.is_published ? (' (' + t('bim.viewer.version_status.published') + ')') : (' (' + t('bim.viewer.version_status.draft') + ')'))) }}
显示控制 相机 刷新 重置 截图 测量
✅ {{ t('bim.viewer.status.ready') }} ⏳ {{ t('bim.viewer.status.loading') }} {{ t('bim.viewer.view_mode') }}: {{ bimSettings.viewMode === '2d' ? t('bim.viewer.mode_display.2d') : t('bim.viewer.mode_display.3d') }} {{ t('bim.viewer.mouse_tips') }}
{{ t('bim.viewer.stats.2d_devices') }}: {{ equipmentMarkers.length }} {{ t('bim.viewer.stats.count_unit') }} | {{ t('bim.viewer.stats.3d_models') }}: {{ models3D.length }} {{ t('bim.viewer.stats.count_unit') }}
{{ selectedMarker.id }} {{ selectedMarker.name }} {{ selectedMarker.position ? selectedMarker.position.join(', ') : t('bim.viewer.equipment_info.unknown') }} {{ t('bim.viewer.equipment_info.status_running') }}
{{ t('bim.viewer.equipment_info.focus_equipment') }} {{ t('bim.viewer.equipment_info.close') }}
📁 当前版本
{{ v.name || v.version_id }} {{ v.version_id }}
已发布 当前
+ 新建 发布 取消发布 设为当前
🌳 节点操作
➕ 添加根节点 ➕ 添加子节点 ({{ selectedNode.title || selectedNode.name || '已选' }})
💡 当前版本已发布(只读),请新建版本后编辑
💡 在右侧树中点击节点后可添加子节点
📤 导入导出
JSON CSV 导入
{{ v.version_id }} {{ v.version_id }} 对比
✅ 两个版本完全相同,无差异
选择两个版本后点击"对比"查看差异
🌳
{{ currentVersion ? '暂无结构节点' : '请先选择版本' }}
➕ 创建第一个节点 📁 新建版本
💡 快速入门
1️⃣ 选择或新建一个结构版本
2️⃣ 添加根节点(如:工厂、车间)
3️⃣ 选中节点后添加子节点
4️⃣ 拖拽节点调整层级关系
5️⃣ 发布版本使其生效

{{ (window.t ? (window.t('structure.versions') || '结构版本管理') : '结构版本管理') }}

{{ (window.t ? (window.t('structure.versionsPage.refresh') || '刷新版本') : '刷新版本') }} {{ (window.t ? (window.t('structure.versionsPage.switchToEditor') || '切换到结构编辑器') : '切换到结构编辑器') }}
{{ node.name }} ({{ node.id }}) {{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }}) {{ v.name || v.version_id }} {{ (window.t ? (window.t('structure.common.publishedParen') || '(已发布)') : '(已发布)') }} {{ (window.t ? (window.t('structure.importModal.mode.replace') || '替换现有数据') : '替换现有数据') }} {{ (window.t ? (window.t('structure.importModal.mode.merge') || '合并数据') : '合并数据') }}
{{ (window.t ? (window.t('common.refresh') || '刷新') : '刷新') }} {{ (window.t ? (window.t('common.filter.title') || '筛选') : '筛选') }} {{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }}) {{ (window.t ? (window.t('inventory.sparePart.filters.listTitle') || '备件清单筛选') : '备件清单筛选') }} {{ (window.t ? (window.t('inventory.sparePart.filters.stockStatus.lowStock') || '低库存预警') : '低库存预警') }} {{ (window.t ? (window.t('common.all') || '全部') : '全部') }}
{{ (window.t ? (window.t('inventory.sparePart.filters.clearAll') || '清空所有筛选条件') : '清空所有筛选条件') }}
{{ (window.t ? (window.t('common.table.showTotal', { total: pagination.stockByLocation.total || 0 }) || ('合计:' + (pagination.stockByLocation.total || 0))) : ('合计:' + (pagination.stockByLocation.total || 0))) }} {{ (window.t ? (window.t('common.refresh') || '刷新') : '刷新') }}
{{ (window.t ? (window.t('common.table.showTotal', { total: pagination.spareParts.total }) || ('共 ' + pagination.spareParts.total + ' 条记录')) : ('共 ' + pagination.spareParts.total + ' 条记录')) }}
📦 {{ (window.t ? (window.t('inventory.sparePart.sections.basicInfo') || '基本信息') : '基本信息') }}
💡 {{ (window.t ? (window.t('inventory.sparePart.form.storageLocationHint') || '仅作为默认仓库展示,不参与库存数量计算与权限控制') : '仅作为默认仓库展示,不参与库存数量计算与权限控制') }}
{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
💡 {{ (window.t ? (window.t('inventory.sparePart.form.customerTooltip') || '不选择客户表示通用备件,所有人可见;选择后仅对有权访问该客户的用户可见') : '不选择客户表示通用备件,所有人可见;选择后仅对有权访问该客户的用户可见') }}
📊 {{ (window.t ? (window.t('inventory.sparePart.sections.stockPrice') || '库存与价格') : '库存与价格') }}
📊 库存数量请通过「库存操作」修改
{{ (window.t ? (window.t('inventory.sparePart.units.piece') || '个') : '个') }} {{ (window.t ? (window.t('inventory.sparePart.units.item') || '件') : '件') }} {{ (window.t ? (window.t('inventory.sparePart.units.set') || '套') : '套') }} {{ (window.t ? (window.t('inventory.sparePart.units.meter') || '米') : '米') }} {{ (window.t ? (window.t('inventory.sparePart.units.kg') || '千克') : '千克') }} {{ (window.t ? (window.t('inventory.sparePart.units.liter') || '升') : '升') }} {{ (window.t ? (window.t('inventory.sparePart.units.pack') || '包') : '包') }} {{ (window.t ? (window.t('inventory.sparePart.units.box') || '箱') : '箱') }}
📝 {{ (window.t ? (window.t('inventory.sparePart.sections.notes') || '备注说明') : '备注说明') }}
{{ (window.t ? (window.t('inventory.sparePart.actions.cancel') || '取消') : '取消') }} {{ editingSparePart ? (window.t ? (window.t('inventory.sparePart.actions.save') || '保存修改') : '保存修改') : (window.t ? (window.t('inventory.sparePart.actions.add') || '确认添加') : '确认添加') }}
{{ currentSparePart?.name || '-' }}
{{ t('inventory.stockModal.partNo') }}: {{ currentSparePart?.part_no || '-' }} | {{ t('inventory.stockModal.model') }}: {{ currentSparePart?.model || '-' }}
{{ currentSparePart?.quantity || 0 }}
{{ t('inventory.stockModal.currentStock') }}
📥 {{ t('inventory.transaction.newModal.typeIn') }} 📤 {{ t('inventory.transaction.newModal.typeOut') }} 🔀 {{ t('inventory.transaction.newModal.typeTransfer') }} 🔄 {{ t('inventory.transaction.newModal.typeAdjust') }} 💰 {{ t('inventory.transaction.newModal.typeCostAdjust') || '成本调整' }}
{{ t('inventory.transaction.newModal.warehouseHint') }}
{{ t('inventory.transaction.newModal.sameWarehouseWarning') }}
{{ t('inventory.transaction.newStockTitle') }} {{ calculateNewStock() }} {{ currentSparePart?.unit || t('inventory.transaction.newModal.unit') }}
⚠️ {{ t('inventory.stockModal.outboundOverstockWarning') }}
❌ {{ t('inventory.stockModal.outboundNoPermission') }}
{{ t('inventory.transaction.newModal.allowAdjustHint') }}
📷
{{ t('inventory.transaction.newModal.scanHint') || '支持摄像头扫码、图片识别或 USB 扫码枪直接扫入' }}
✓ {{ t('inventory.transaction.newModal.supplierFromDefault') || '已自动填入备件默认供应商' }}
{{ t('inventory.transaction.newModal.noRelation') }} {{ wo.work_order_id }} - {{ wo.title }}
{{ t('inventory.transaction.newModal.cancel') }} {{ stockForm.type === 'in' ? t('inventory.transaction.newModal.confirmIn') : stockForm.type === 'out' ? t('inventory.transaction.newModal.confirmOut') : stockForm.type === 'transfer' ? t('inventory.transaction.newModal.confirmTransfer') : stockForm.type === 'cost_adjust' ? (t('inventory.transaction.newModal.confirmCostAdjust') || '确认调整') : t('inventory.transaction.newModal.confirmAdjust') }}
{{ (window.t ? (window.t('inventory.transactionPanel.create') || '新建事务') : '新建事务') }}
💡 {{ (window.t ? (window.t('inventory.transactionPanel.tipsTitle') || '操作提示') : '操作提示') }}
{{ (window.t ? (window.t('inventory.transactionPanel.tipsCreate') || '点击"新建事务"按钮创建库存变动记录') : '点击"新建事务"按钮创建库存变动记录') }}
{{ (window.t ? (window.t('inventory.transactionPanel.refresh') || '刷新列表') : '刷新列表') }} {{ (window.t ? (window.t('inventory.transactionPanel.filters') || '筛选条件') : '筛选条件') }} {{ (window.t ? (window.t('inventory.transaction.form.type.in') || '入库') : '入库') }} {{ (window.t ? (window.t('inventory.transaction.form.type.out') || '出库') : '出库') }} {{ (window.t ? (window.t('inventory.transaction.form.type.adjust') || '调整') : '调整') }} {{ part.name }} ({{ part.spare_part_id || part.value }}) {{ (window.t ? (window.t('inventory.transactionPanel.clear') || '清空筛选') : '清空筛选') }}
{{ (window.t ? (window.t('inventory.alerts.panel.setThreshold') || '设置阈值') : '设置阈值') }}
💡 {{ (window.t ? (window.t('inventory.alerts.panel.tipsTitle') || '操作提示') : '操作提示') }}
{{ (window.t ? (window.t('inventory.alerts.panel.tipsSetThreshold') || '点击"设置阈值"按钮为备件设置库存预警阈值') : '点击"设置阈值"按钮为备件设置库存预警阈值') }}
{{ (window.t ? (window.t('inventory.alerts.panel.refresh') || '刷新预警') : '刷新预警') }} {{ (window.t ? (window.t('inventory.alerts.panel.filters') || '筛选条件') : '筛选条件') }} {{ (window.t ? (window.t('inventory.alerts.status.active') || '生效中') : '生效中') }} {{ (window.t ? (window.t('inventory.alerts.status.processing') || '处理中') : '处理中') }} {{ (window.t ? (window.t('inventory.alerts.status.resolved') || '已解除') : '已解除') }} {{ (window.t ? (window.t('inventory.alerts.status.all') || '全部') : '全部') }} {{ (window.t ? (window.t('inventory.alerts.severity.critical') || '严重') : '严重') }} {{ (window.t ? (window.t('inventory.alerts.severity.medium') || '中等') : '中等') }} {{ (window.t ? (window.t('inventory.alerts.severity.low') || '轻微') : '轻微') }} {{ part.name }} ({{ part.spare_part_id || part.value }})
{{ (window.t ? (window.t('inventory.alerts.loading') || '正在加载预警数据...') : '正在加载预警数据...') }}
{{ t('common.search') }} {{ t('common.exportCsv') }}
{{ t('inventory.reconcile.stat.count') }}
{{ (reconcileSummary && reconcileSummary.count) || reconcileItems.length || 0 }}
{{ t('inventory.reconcile.stat.pos') }}
{{ (reconcileSummary && reconcileSummary.posCount) || 0 }}
{{ t('inventory.reconcile.stat.neg') }}
{{ (reconcileSummary && reconcileSummary.negCount) || 0 }}
{{ t('inventory.reconcile.stat.impact') }}
¥{{ ((reconcileSummary && reconcileSummary.sumImpact) || 0).toFixed(2) }}

{{ t('inventory.spareInventory.title') || '备件盘点管理' }}

{{ t('inventory.spareInventory.subtitle') || '按库位核对备件账面库存、实盘数量和差异金额' }}
{{ getSparePartInventoryStatusText('draft') }} {{ getSparePartInventoryStatusText('in_progress') }} {{ getSparePartInventoryStatusText('completed') }}
{{ t('common.refresh') || '刷新' }} {{ t('inventory.spareInventory.create') || '新建盘点' }}
{{ getSparePartInventoryScopeText('all') }} {{ getSparePartInventoryScopeText('storage_location') }} {{ getSparePartInventoryScopeText('equipment') }} {{ eq.name || eq.equipment_id }}
!
{{ line }}
{{ t('inventory.spareInventory.summary.totalSku') || 'SKU数' }}:{{ sparePartInventoryItems?.length || 0 }} {{ t('inventory.spareInventory.summary.counted') || '已盘' }}:{{ (sparePartInventoryItems || []).filter(item => item.actual_quantity !== null && item.actual_quantity !== undefined).length }} {{ t('inventory.spareInventory.summary.surplus') || '盘盈' }}:{{ (sparePartInventoryItems || []).filter(item => item.result === 'surplus').length }} {{ t('inventory.spareInventory.summary.deficit') || '盘亏' }}:{{ (sparePartInventoryItems || []).filter(item => item.result === 'deficit').length }}
{{ t('inventory.spareInventory.importTemplate') || '导入模板' }} {{ t('inventory.spareInventory.importResults') || '导入结果' }} {{ t('inventory.spareInventory.addSurplus') || '新增盘盈行' }}
{{ part.name || '-' }} {{ part.spare_part_id }} | {{ part.part_no || '-' }}
{{ t('inventory.spareInventory.addSurplusHint') || '用于库位原本无账面库存、现场发现实物的场景;保存后生成账面数量为 0 的盘盈明细。' }}

{{ t('inventory.spareInventory.importUploadText') || '点击或拖拽 CSV 文件到此区域上传' }}

{{ t('inventory.spareInventory.importUploadHint') || '支持 item_id 或 物料编号+库位定位明细;库位无账面库存时自动新增盘盈行。' }}

{{ t('inventory.spareInventory.importTemplate') || '下载导入模板' }}
{{ t('inventory.spareInventory.importSuccessCount') || '成功导入' }}:{{ sparePartInventoryImportResult.success_count || 0 }}
{{ t('inventory.spareInventory.importErrorCount') || '失败' }}:{{ sparePartInventoryImportResult.error_count }}
  • {{ err }}

{{ t('barcodeRule.title') || '条码规则管理' }}

{{ t('barcodeRule.subtitle') || '维护条码格式匹配规则,支持扫码自动识别备件和批次号' }}

{{ opt.label }} {{ t('common.refresh') || '刷新' }} {{ t('barcodeRule.create') || '新增规则' }} 🏷️ {{ t('barcodeRule.generate.btn') || '生成条码' }}

🔍 {{ t('barcodeRule.testPanel') || '条码解析测试' }}

{{ t('barcodeRule.testBtn') || '测试解析' }}
✅ {{ t('barcodeRule.testMatched') || '匹配成功' }} — {{ barcodeRuleModule.testResult.rule_name }}
❌ {{ t('barcodeRule.testUnmatched') || '未匹配到任何规则' }}
{{ JSON.stringify(barcodeRuleModule.testResult, null, 2) }}

🏷️ {{ t('barcodeRule.generate.title') || '条码生成器' }}

{{ t('barcodeRule.generate.selectRule') || '选择规则' }}
{{ rule.name }} {{ barcodeRuleModule.getCategoryLabel(rule.category) }}
⚠️ {{ t('barcodeRule.generate.noTemplateRules') || '当前无带生成模板的规则。请先编辑规则并填写“生成模板”字段。' }}
{{ field }}
💡 {{ t('barcodeRule.generate.builtInHint') || '内置变量自动填充: {date}=今日日期 {datetime}=当前时间 {year} {month} {day}' }}
🏷️ {{ t('barcodeRule.generate.run') || '生成' }}
✅ {{ t('barcodeRule.generate.success') || '生成成功' }}
{{ barcodeRuleModule.generateResult.barcode }} 📋 {{ t('barcodeRule.generate.copy') || '复制' }} ⬇️ {{ t('barcodeRule.generate.download') || '下载PNG' }}
⚠️ {{ t('barcodeRule.generate.validationWarning') || '生成结果未通过该规则自身的正则验证,请检查字段值是否包含正则不允许的字符(如连字符、空格等)' }}
{{ barcodeRuleModule.generateResult.barcode }}
❌ {{ barcodeRuleModule.generateResult.error || '生成失败' }}
📋 {{ t('barcodeRule.form.sectionBasic') || '基本信息' }}
{{ opt.label }}
{{ t('barcodeRule.form.priorityHint') || '数值越大越先匹配' }}
🔍 {{ t('barcodeRule.form.sectionParse') || '解析规则' }}
{{ t('barcodeRule.form.mappingHint') || 'JSON 格式:捕获组名 → 输出字段名。使用命名捕获组时可留空。' }}
{{ t('barcodeRule.form.testMatch') || '测试匹配' }}
🏷️ {{ t('barcodeRule.form.sectionGenerate') || '条码生成(可选)' }}
{{ t('barcodeRule.form.generateTemplateHint') || '用 {field_name} 占位符,支持内置变量: {date} {datetime} {year} {month} {day}' }}
📝 {{ t('barcodeRule.form.sectionNote') || '补充说明' }}

{{ t('inspection.category.title') || '点检分类管理' }}

{{ t('inspection.category.subtitle') || '管理点检项目的多级分类,支持与设备类型关联' }}

刷新 新增分类
📂
{{ categoryModule.isEdit?.value ? '修改点检分类' : '创建新分类' }}
{{ categoryModule.isEdit?.value ? '更新分类的基本信息和层级关系' : '添加一个新的点检分类节点到分类树中' }}
📋 基本信息
🔗 层级关系
📝 描述信息 可选
包含子分类的点检项

{{ t('inspection.templateCategory.title') || '模板分类管理' }}

{{ t('inspection.templateCategory.subtitle') || '管理点检模板的分类,支持业务类型和设备类型关联' }}

刷新 新增分类
📁
{{ templateCategoryModule.isEdit?.value ? '修改模板分类' : '创建新模板分类' }}
{{ templateCategoryModule.isEdit?.value ? '更新模板分类的基本信息和关联设置' : '添加一个新的模板分类节点' }}
📋 基本信息
🔗 关联设置
📝 描述信息 可选

{{ (window.t ? window.t('inspection.item.title') : '点检题库') }}

{{ tag }} 显示禁用项 清除筛选 {{ (window.t ? window.t('common.refresh') : '刷新') }} 导出 新建点检项目
当前分类:{{ selectedItemCategoryName || '未分类' }}
基本信息 文本 数值 是/否 选择 图片 签名 分类与标签
⚠️ 原分类编码 "{{ itemEditForm.category_code }}" 未关联,请重新选择
{{ tag }} 检查标准 规则配置
基本信息 文本 数值 是/否 选择 图片 签名 分类与标签 {{ cat.code }} - {{ cat.name }} {{ tag }} 检查标准
{{ (window.t ? (window.t('inspection.item.form.rulesHint') || '请输入合法 JSON 对象') : '请输入合法 JSON 对象') }}

{{ t('inspection.template.title') }}

{{ t('inspection.template.subtitle') || '集中管理点检模板,快速完成配置、绑定与差异分析' }}

{{ t('inspection.template.actions.create') || '新建模板' }} {{ t('inspection.template.actions.library') || '模板库' }} {{ t('inspection.template.actions.advancedTools') || '高级工具' }} {{ t('common.actions.refresh') }}
{{ t('inspection.template.summary.total') || '模板总数' }} {{ inspectionTemplateStats.total }}
{{ t('inspection.template.summary.draft') || '草稿' }} {{ inspectionTemplateStats.draft }}
{{ t('inspection.template.summary.published') || '已发布' }} {{ inspectionTemplateStats.published }}
{{ t('inspection.template.summary.frozen') || '冻结' }} {{ inspectionTemplateStats.frozen }}
📄 {{ t('inspection.template.category.uncategorized') || '未分类' }}
📁 {{ t('inspection.template.category.all') || '全部分类' }}
{{ inspectionTemplateSelected ? (inspectionTemplateSelected.name || inspectionTemplateSelected.id) : (t('inspection.template.workbench.selectTemplate') || '请选择模板') }}
ID: {{ inspectionTemplateSelected.id }} · {{ t('inspection.template.workbench.version') || '版本' }} {{ inspectionTemplateSelected.version_no || '-' }}
{{ inspectionTemplateSelected ? getTemplateStatusMeta(inspectionTemplateSelected.version_state).label : (t('inspection.template.status.unselected') || '未选择') }}
{{ t('inspection.template.library.title') || '题库' }} {{ t('inspection.template.actions.addToTemplate') || '添加到模板' }}
{{ t('inspection.template.templateItems.title') || '模板项目' }} {{ t('inspection.template.templateItems.count', { count: templateItems.length }) || ('共 ' + templateItems.length + ' 项') }} {{ t('inspection.template.actions.expandAll') || '全部展开' }} {{ t('inspection.template.actions.collapseAll') || '全部折叠' }}
{{ group.category_code }} {{ getI18nText(group.category_name_i18n, group.category_name) }} {{ group.items.length }}
{{ t('inspection.template.actions.bindEquipment') || '绑定' }} {{ t('inspection.template.actions.refreshBindings') || '刷新' }}
{{ t('inspection.template.bindingForm.boundEquipment') || '已绑定设备' }} {{ templateBindings?.length || 0 }} {{ t('inspection.template.bindingForm.boundEquipmentUnit') || '台' }}
{{ t('inspection.template.form.sourceTemplateId') || '源模板' }}:
{{ t('inspection.template.form.newTemplateName') || '新模板名称' }}:
{{ t('inspection.template.form.compareTemplateA') || '模板A' }}:
{{ t('inspection.template.form.compareTemplateB') || '模板B' }}:
{{ t('inspection.template.diff.added') || '新增' }} {{ t('inspection.template.diff.itemCount', { count: templateDiffResult.added.length }) || (templateDiffResult.added.length + ' 项') }}
{{ item.title || (t('inspection.template.diff.noTitle') || '(无标题)') }}{{ item.code || item.item_id }}
{{ t('inspection.template.diff.removed') || '移除' }} {{ t('inspection.template.diff.itemCount', { count: templateDiffResult.removed.length }) || (templateDiffResult.removed.length + ' 项') }}
{{ item.title || (t('inspection.template.diff.noTitle') || '(无标题)') }}{{ item.code || item.item_id }}
{{ t('inspection.template.diff.changed') || '变更' }} {{ t('inspection.template.diff.itemCount', { count: templateDiffResult.changed.length }) || (templateDiffResult.changed.length + ' 项') }}
{{ item.title || item.from?.title || (t('inspection.template.diff.noTitle') || '(无标题)') }}{{ item.code || item.item_id || item.from?.code }}
{{ pack.name }} {{ inspectionModule?.templatePackIndustryName?.(pack.industry) }} {{ t('inspection.template.templateLibrary.imported') || '已导入' }} v{{ pack.version }}
{{ pack.description }}
{{ (t('inspection.template.templateLibrary.statTemplates') || '模板') }} {{ pack.template_count }} {{ (t('inspection.template.templateLibrary.statItems') || '点检项') }} {{ pack.item_count }} {{ (t('inspection.template.templateLibrary.statCategories') || '分类') }} {{ pack.category_count }} {{ (t('inspection.template.templateLibrary.statUsage') || '被导入') }} {{ pack.usage_count }} {{ t('inspection.template.templateLibrary.statUsageUnit') || '次' }}
{{ t('inspection.template.templateLibrary.preview') || '预览' }} {{ pack.imported ? (t('inspection.template.templateLibrary.reimport') || '重新导入') : (t('inspection.template.templateLibrary.import') || '一键导入') }}
{{ t('inspection.template.templateLibrary.aiDescLabel') || '设备/场景' }}
{{ t('inspection.template.templateLibrary.aiIndustryLabel') || '行业' }}
{{ t('inspection.template.templateLibrary.aiItemCountLabel') || '点检项数量' }}
{{ t('inspection.template.templateLibrary.aiNameLabel') || '模板名称(可选)' }}
{{ (inspectionModule?.aiGenerating?.value) ? (t('inspection.template.templateLibrary.aiGeneratingBtn') || '生成中...') : (t('inspection.template.templateLibrary.aiGenerate') || '生成提案') }}
{{ t('inspection.template.templateLibrary.aiGenerating') || 'AI 正在生成提案,请稍候(通常 10~30 秒)...' }}

{{ t('inspection.plan.title') }}

{{ t('inspection.plan.description') }}

{{ (inspectionPlansPagination && inspectionPlansPagination.total) || ((inspectionPlans && inspectionPlans.length) || 0) }}
{{ t('inspection.plan.stats.total') }}
{{ (inspectionPlansPagination && inspectionPlansPagination.enabledTotal) || ((inspectionPlans && inspectionPlans.filter(p => p.enabled).length) || 0) }}
{{ t('inspection.plan.stats.active') }}
{{ t('inspection.plan.form.basicInfo') }}
{{ planForm.enabled ? t('inspection.plan.form.enabledHintActive') : t('inspection.plan.form.enabledHintPaused') }} 📋{{ t('inspection.plan.form.woTypeInspection') }} 🚶{{ t('inspection.plan.form.woTypePatrol') }} 🔧{{ t('inspection.plan.form.woTypeToolMaintenance') }}
{{ t('inspection.plan.form.scopeConfig') }}
🌳 {{ t('inspection.plan.scope.hierarchy') }} 📦 {{ t('inspection.plan.scope.equipment') }} 🔧 {{ t('inspection.plan.scope.tool') }}
{{ cronReadableText || t('inspection.plan.form.cronClickHint') }}
📦 {{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
{{ t('inspection.plan.form.toolSelection') }}
🔧 {{ tl.name }}{{ tl.asset_number ? ' (' + tl.asset_number + ')' : '' }}
{{ t('inspection.plan.hierarchy.title') }}
🏗️ {{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
{{ (filteredRootEquipmentForInspectionPlan || []).length }} 台可选根装备{{ (planRootEquipmentTypeFilter || planCustomerFilter) ? '(已筛选)' : '' }}
👁️ {{ t('inspection.plan.hierarchy.previewButton') }}
按分类筛选: ✓ 已筛选 {{ filteredTemplatesForPlan.length }} 个模板
{{ t('inspection.plan.hierarchy.addMapping') }} 一键添加全部(按装备分组 + 子机构按顺序)
暂无映射配置,点击上方按钮添加
{{ t('inspection.plan.form.validPeriod') }}
{{ t('inspection.plan.form.cancel') }} 💾 {{ inspectionModule?.planModalIsEdit?.value ? t('inspection.plan.form.saveEdit') : t('inspection.plan.form.createPlan') }}

📊 分析报表

查看点检工单的统计分析,包括合格率、逾期率和漏检率等关键指标

{{ inspectionReportsModule?.isFullscreen?.value ? '退出全屏' : '🖥️ 全屏显示' }}
{{ getLocalizedEquipmentName(eq) }} {{ tpl.name }} 🔍 查询 📥 导出报表
合格率
{{ inspectionReportsModule?.reportData?.value?.summary?.pass_rate }}%
通过: {{ inspectionReportsModule?.reportData?.value?.summary?.passed_work_orders }} / 完成: {{ inspectionReportsModule?.reportData?.value?.summary?.completed_work_orders }}
逾期率
{{ inspectionReportsModule?.reportData?.value?.summary?.overdue_rate }}%
逾期: {{ inspectionReportsModule?.reportData?.value?.summary?.overdue_work_orders }} / 总计: {{ inspectionReportsModule?.reportData?.value?.summary?.total_work_orders }}
漏检率
{{ inspectionReportsModule?.reportData?.value?.summary?.missed_rate }}%
漏检: {{ inspectionReportsModule?.reportData?.value?.summary?.missed_work_orders }} / 总计: {{ inspectionReportsModule?.reportData?.value?.summary?.total_work_orders }}

📈 点检趋势分析

🎯 工单状态分布

📊
请选择时间范围并点击查询按钮加载报表数据

{{ t('inspection.importData.title') || '数据导入' }}

{{ t('inspection.importData.subtitle') || '批量导入点检分类、点检项目和模板绑定数据' }}

下载模板 / 导出数据 管理点检/巡检/维护等模板的分类体系

点击或拖拽 CSV 文件到此区域

更新已存在的记录
执行导入
{{ t('common.import.downloadBtnLabel') || '下载模板 / 导出数据' }} {{ t('common.import.exportHint') || '导出后可修改再上传,或导入其他租户' }}

点击或拖拽 CSV 文件到此区域

支持 UTF-8 或 GB2312 编码的 CSV 文件

更新已存在的记录 执行导入
{{ t('common.import.downloadBtnLabel') || '下载模板 / 导出数据' }} {{ t('common.import.exportHint') || '导出后可修改再上传,或导入其他租户' }}

点击或拖拽 CSV 文件到此区域

更新已存在的记录
执行导入
下载模板 / 导出数据 导入模板定义及其点检项(不含设备绑定)

点击或拖拽 CSV 文件到此区域

更新已存在的记录
执行导入
{{ t('common.import.downloadBtnLabel') || '下载模板 / 导出数据' }} {{ t('common.import.exportHint') || '导出后可修改再上传,或导入其他租户' }}

点击或拖拽 CSV 文件到此区域

执行导入
下载模板 / 导出数据 导入点检计划(含调度规则和模板绑定)

点击或拖拽 CSV 文件到此区域

更新已存在的计划
执行导入
下载模板 / 导出数据 导入维护计划(含触发规则和工单模板)

点击或拖拽 CSV 文件到此区域

更新已存在的计划
执行导入
下载模板 / 导出数据 导入模板绑定规则(设备/标签/类型绑定、优先级、继承等设定)

点击或拖拽 CSV 文件到此区域

更新已存在的绑定设定
执行导入

{{ t('geometry3d.title') || '3D占位符管理' }}

{{ t('geometry3d.subtitle') || '管理设备在BIM 3D视图中的占位几何体(无BIM模型时显示)' }}

{{ t('geometry3d.create') || '新建占位符' }}
{{ t('geometry3d.type.box') || '立方体 (box)' }} {{ t('geometry3d.type.cylinder') || '圆柱体 (cylinder)' }} {{ t('geometry3d.type.sphere') || '球体 (sphere)' }} {{ t('geometry3d.type.cone') || '圆锥 (cone)' }} {{ t('geometry3d.type.octa') || '八面体 (octa)' }}
{{ t('geometry3d.preview') || '实时预览' }}
{{ t('geometry3d.previewHint') || '拖拽旋转 · 滚轮缩放' }}

{{ t('systemConfigCenter.title') || '系统参数设定中心' }}

{{ t('systemConfigCenter.subtitle') || '维护白名单系统参数,避免直接修改环境配置文件' }}

{{ t('systemConfigCenter.actions.importEnv') || '从 .env 导入' }} {{ t('systemConfigCenter.actions.reload') || '刷新运行配置' }} {{ t('systemConfigCenter.actions.refreshList') || '重新读取列表' }} {{ t('systemConfigCenter.actions.saveAll') || '保存变更' }} ({{ systemConfigCenterModule.changedCount }})
{{ t('systemConfigCenter.messages.restartPending') || '部分配置需要重启后生效,请在业务低峰期完成重启。' }}
{{ t('systemConfigCenter.empty') || '暂无配置项' }}
{{ t(item.label_key) || item.key }} {{ t('systemConfigCenter.flags.readonly') || '只读' }} {{ t('systemConfigCenter.flags.sensitive') || '敏感' }} {{ t('systemConfigCenter.flags.restart') || '需重启' }} {{ t(item.scope_key) || (item.scope === 'system' ? '系统级' : '租户级') }} {{ systemConfigCenterModule.getSourceLabel(item.source) }}
{{ t(item.description_key) || item.description || item.key }}
{{ item.key }}
{{ test.label }}

{{ t('configWizard.title') || '配置向导' }}

{{ t('configWizard.subtitle') || '引导式系统配置,快速完成位置、设备和点检数据初始化' }}

{{ t('liteWizard.modeLite') || '精简向导(4步)' }} {{ t('liteWizard.modeFull') || '完整向导' }} {{ t('liteWizard.dismiss') || '稍后再说' }} {{ t('configWizard.startWizard') || '开始配置向导' }}
{{ t('configWizard.dashboard.requiredProgress') || '必填项完成度' }} 💡 {{ configWizardModule.nextRecommendation }}
{{ group }}
! {{ t(item.name_key) || item.name }} ({{ item.count }}) {{ t('configWizard.dashboard.optional') || '可选' }} {{ t(item.message_key, {count: item.count}) || item.message }} {{ t('configWizard.dashboard.goConfig') || '去配置' }}
{{ group }}
{{ s.localizedTitle || s.title }} {{ t('configWizard.dashboard.optional') || '可选' }}
{{ t('liteWizard.templateLibraryTitle') || '可选:先导入行业模板包(推荐)' }} {{ t('common.refresh') || '刷新' }}
{{ t('liteWizard.templateLibraryInlineDesc') || '导入后行业设备类型/型号自动落入本步档案,设备 Excel 模板的类型/型号下拉会自动带出;模板包同时含点检模板,后续步骤可直接跳过或导出修改后重新导入。' }}
{{ pack.name }}
{{ pack.description }}
{{ configWizardModule.stepStates['templates'] === 'completed' ? (t('liteWizard.imported') || '已导入') : (t('liteWizard.importPack') || '一键导入') }}
{{ t('common.import.downloadBtnLabel') || '下载模板 / 导出数据' }} {{ t('common.import.exportHint') || '导出后可修改再上传,或导入其他租户' }}

{{ configWizardModule.currentStep && configWizardModule.currentStep.apiBase === '/api/v1/import' ? (t('configWizard.upload.dragText') || '点击或拖拽 CSV / Excel 文件到此区域') : (t('liteWizard.uploadDragTextCsv') || '点击或拖拽 CSV 文件到此区域') }}

{{ configWizardModule.currentStep && configWizardModule.currentStep.apiBase === '/api/v1/import' ? (t('configWizard.upload.hint') || '支持 .xlsx/.xls 原生 Excel,或 UTF-8 / GB2312 编码的 CSV 文件') : (t('liteWizard.uploadHintCsv') || '支持 UTF-8 或 GB2312 编码的 CSV 文件') }}

{{ t('configWizard.preview.updateExisting') || '更新已存在的记录' }} {{ t('configWizard.preview.executeImportFull') || '执行导入(保存到数据库)' }} {{ t('configWizard.preview.saveHint') || '点击后数据将写入数据库,「下一步」不会自动保存' }}
{{ t('configWizard.nav.prevStep') || '上一步' }} {{ t('configWizard.nav.skipStep') || '跳过此步' }} {{ configWizardModule.currentStepIndex >= configWizardModule.wizardSteps.length - 1 ? (t('configWizard.nav.finishConfig') || '完成配置') : (t('configWizard.nav.nextStep') || '下一步') }} {{ configWizardModule.currentStepIndex >= configWizardModule.wizardSteps.length - 1 ? (t('configWizard.nav.finishConfig') || '完成配置') : (t('configWizard.nav.nextStep') || '下一步') }}

{{ t('systemImport.title') || '系统数据导入' }}

{{ t('systemImport.subtitle') || '批量导入位置、设备类型、设备档案等基础数据' }}

{{ t('common.import.downloadBtnLabel') || '下载模板 / 导出数据' }} {{ t('common.import.exportHintAlt') || '导出后可修改再重新上传,也可导入到其他租户' }}

{{ t('configWizard.upload.dragText') || '点击或拖拽 CSV / Excel 文件到此区域' }}

{{ t('configWizard.upload.hint') || '支持 .xlsx/.xls 原生 Excel,或 UTF-8 / GB2312 编码的 CSV 文件' }}

{{ t('configWizard.preview.updateExisting') || '更新已存在的记录' }} {{ t('configWizard.preview.executeImport') || '执行导入' }}

{{ t('scheduler.title') || '定时任务管理' }}

{{ t('scheduler.subtitle') || '统一查看任务状态、执行历史与频率覆盖,减少定时策略调整时的认知负担。' }}

{{ t('common.refresh') || '刷新' }}
{{ t('scheduler.overview.status') || '调度器状态' }} {{ schedulerModule.schedulerStatus?.scheduler_running ? '调度器运行中' : '调度器未启动' }}
{{ t('scheduler.category.planTrigger') || '计划触发' }} {{ t('scheduler.category.cacheSync') || '缓存同步' }} {{ t('scheduler.category.alert') || '告警检查' }} {{ t('scheduler.category.analytics') || '分析计算' }} {{ t('scheduler.category.assetManagement') || '资产管理' }} {{ t('scheduler.category.maintenance') || '系统维护' }} {{ t('scheduler.category.personnelManagement') || '人员管理' }} {{ t('scheduler.category.license') || '许可管理' }}
{{ t('scheduler.listTitle') || '任务清单' }} {{ (t('scheduler.listCount') || '共 {n} 个任务').replace('{n}', String((schedulerModule.filteredJobs || []).length)) }}

{{ t('inspection.bindingMatrix') || '点检绑定矩阵' }}

{{ t('maintenance.plan.title') || '🔧 维护计划管理' }}

{{ t('maintenance.plan.description') || '配置和管理设备的预防性维护计划,支持周期触发、计数触发和条件触发' }}

{{ t('maintenance.plan.actions.create') || '新增维护计划' }} {{ t('maintenance.plan.actions.fromTemplate') || '从模板创建' }} {{ t('maintenance.plan.actions.calendar') || '日历视图' }} {{ t('maintenance.plan.actions.executeDue') || '执行到期计划' }} {{ t('common.actions.refresh') || '刷新' }}

{{ t('maintenance.history.title') || '📊 维护计划执行历史' }}

{{ t('maintenance.history.description') || '查看所有维护计划的执行记录和生成的工单' }}

📁 {{ t('bim.files.title') }} {{ bimFiles.length }} 个文件

管理和组织 BIM 模型文件

{{ t('bim.files.refresh') }}
💡
{{ t('bim.files.formats_recommend_desc') }}
{{ t('bim.files.formats_supported') }}:
GLB GLTF IFC OBJ FBX
⚠️ {{ t('bim.files.formats_gltf_note') }}
📁
选择文件
或拖拽文件到此处
✅ {{ t('bim.files.file_selected') }}: {{ selectedFiles.length }} 个文件
{{ t('bim.files.start_upload') }} {{ t('bim.files.clear_list') }}
上传进度: {{ bimFilesModule.uploadProgress }}%
{{ t('bim.files.select_model') }}: {{ m.name || (m.model_id || m.id) }} {{ t('bim.files.refresh') }} {{ t('bim.files.divider.upload_tagged_glb') }}
{{ t('bim.files.force') }} {{ t('bim.files.upload_glb') }}
{{ t('bim.files.divider.upload_sidecar') }}
{{ t('bim.files.dryRun') }} {{ t('bim.files.confirm') }} {{ t('bim.files.persistDb') }} {{ t('bim.files.submit') }}
{{ t('bim.files.conflict_detected_count', { count: bimFilesModule.annotate.sidecar.lastConflicts.length }) }}
{{ JSON.stringify(bimFilesModule.annotate.sidecar.lastConflicts.slice(0,5), null, 2) }}\n{{ t('bim.files.more_omitted') }}
{{ t('bim.files.divider.download_export') }} {{ t('bim.files.download.latest_glb') }} {{ t('bim.files.export.mapping') }}
{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
{{ t('bim.model.form.file_path_hint') }}
GLB GLTF 2.0 IFC {{ v.name || v.version_id }} ({{ v.version_id }})
{{ t('bim.model.form.bind_file_label') }}:{{ bimFilesModule.bindModelForm.file_name || '-' }}

{{ t('bim.mappings.title') }}

{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }}) {{ v.name || v.version_id }} ({{ v.version_id }}) {{ t('bim.mappings.versionPublished') }} {{ t('bim.files.refresh') }} {{ t('bim.mappings.actions.create') }}
{{ v.name || v.version_id }} ({{ v.version_id }}) {{ t('bim.mappings.versionPublished') }} {{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
{{ t('bim.mappings.form.selectNode') }} {{ selectedMappingNodePathLabel || mappingForm.structure_node_id }} {{ t('bim.mappings.form.notSelected') }}
{{ eid }}

{{ t('metrics.title') }}

📝 {{ t('system.approval.title') }}

{{ t('system.approval.description') }}

{{ t('system.approval.actions.create') }} {{ t('system.approval.actions.refresh') }}
📋
{{ t('system.approval.empty') }}
{{ t('system.approval.actions.createNow') }}
{{ workflow.name }}
{{ approvalModule.getBusinessTypeLabel(workflow.type) }}
{{ workflow.enabled ? t('system.approval.status.enabled') : t('system.approval.status.disabled') }}
{{ t('system.approval.labels.steps') }}
{{ approvalModule.formatSteps(workflow.steps) }}
{{ workflow.description }}
{{ t('system.approval.actions.edit') }}

🔢 {{ t('docNumber.title') }}

{{ t('docNumber.subtitle') }}

{{ t('docNumber.createRule') }}
{{ item.name }} {{ t('common.enabled') || '启用' }} {{ t('common.disabled') || '禁用' }}
{{ item.name }}
{{ t('docNumber.form.codeHint') }}
{{ item.name }}
🎨 可视化构建 ✏️ 手动输入
📋 快速模板:
{{ tpl.name }} {{ tpl.example }}
点击上方模板或下方按钮添加规则段
🏷️ 前缀 ➖ 分隔符 📅 日期 🏢 上下文 🔢 流水号
{{ token.code }}
📝 生成的表达式:
{{ docNumberModule?.ruleForm?.pattern || '(空)' }}
✨ 效果预览:
{{ docNumberModule?.builderMode === 'visual' ? docNumberModule?.getBuilderPreview() : docNumberModule?.previewPattern(docNumberModule?.ruleForm?.pattern) }}
✗ {{ t('docNumber.patternInvalid') }}: {{ err }}
{{ t('docNumber.resetPolicy.never') }} {{ t('docNumber.resetPolicy.daily') }} {{ t('docNumber.resetPolicy.monthly') }} {{ t('docNumber.resetPolicy.yearly') }} {{ t('docNumber.overflowPolicy.error') }} {{ t('docNumber.overflowPolicy.recycle') }} {{ t('docNumber.overflowPolicy.extend') }}
{{ t('docNumber.form.priorityHint') }}
{{ docNumberModule?.getHistoryActionName(item.action) }} {{ item.created_at }} by {{ item.created_by }}
{{ item.change_reason }}

📄 {{ (window.t ? (window.t('report.template.title') || '报表模板管理') : '报表模板管理') }}

{{ (window.t ? (window.t('report.template.description') || '管理系统报表模板,支持可视化设计和多格式导出') : '管理系统报表模板,支持可视化设计和多格式导出') }}

{{ reportModule?.engineHealth?.status === 'healthy' ? (window.t ? (window.t('report.template.engine.healthyLabel') || '🟢 引擎正常') : '🟢 引擎正常') : (window.t ? (window.t('report.template.engine.unhealthyLabel') || '🔴 引擎异常') : '🔴 引擎异常') }}
{{ (window.t ? (window.t('report.template.stats.totalTemplates') || '模板总数') : '模板总数') }} {{ reportModule?.stats?.total_templates || 0 }}
{{ (window.t ? (window.t('report.template.stats.publishedTemplates') || '已发布') : '已发布') }} {{ reportModule?.stats?.published_templates || 0 }}
{{ (window.t ? (window.t('report.template.stats.exportsToday') || '今日导出') : '今日导出') }} {{ reportModule?.stats?.total_exports_today || 0 }}
{{ (window.t ? (window.t('report.template.stats.exportsMonth') || '本月导出') : '本月导出') }} {{ reportModule?.stats?.total_exports_month || 0 }}
{{ (window.t ? (window.t('report.template.actions.create') || '新建模板') : '新建模板') }} {{ (window.t ? (window.t('report.template.actions.exportLogs') || '导出日志') : '导出日志') }}
{{ opt.label }} {{ opt.label }}
📄
{{ (window.t ? (window.t('report.template.empty') || '暂无报表模板') : '暂无报表模板') }}
{{ (window.t ? (window.t('report.template.actions.createNow') || '立即创建') : '立即创建') }}
{{ tpl.template_name }}
{{ tpl.template_code }}
{{ (window.t ? (window.t('report.template.tags.system') || '系统') : '系统') }} {{ (window.t ? (window.t('report.template.tags.default') || '默认') : '默认') }} {{ reportModule?.getStatusTag(tpl.status)?.label }}
{{ (window.t ? (window.t('report.template.labels.type') || '类型:') : '类型:') }} {{ reportModule?.getTypeLabel(tpl.template_type) }}
{{ tpl.description }}
{{ (window.t ? (window.t('report.template.labels.created') || '创建:') : '创建:') }}{{ tpl.created_by_name || '-' }} · {{ tpl.created_at ? new Date(tpl.created_at).toLocaleDateString() : '-' }}
{{ (window.t ? (window.t('report.template.actions.design') || '设计') : '设计') }} {{ (window.t ? (window.t('report.template.actions.download') || '下载') : '下载') }} {{ (window.t ? (window.t('report.template.actions.upload') || '上传') : '上传') }} {{ (window.t ? (window.t('report.template.actions.properties') || '属性') : '属性') }} {{ (window.t ? (window.t('report.template.actions.publish') || '发布') : '发布') }} {{ (window.t ? (window.t('report.template.actions.disable') || '禁用') : '禁用') }} {{ (window.t ? (window.t('report.template.actions.enable') || '启用') : '启用') }}
{{ (window.t ? (window.t('report.template.form.createModeBlank') || '空白模板') : '空白模板') }} {{ (window.t ? (window.t('report.template.form.createModeCopy') || '复制系统模板') : '复制系统模板') }} {{ st.template_name }} ({{ st.template_code }})
{{ (window.t ? (window.t('report.template.form.sourceTemplateTip') || '复制后可下载编辑,再上传回系统') : '复制后可下载编辑,再上传回系统') }}
{{ opt.label }} {{ (window.t ? (window.t('report.template.form.isDefaultTip') || '同类型仅一个默认模板') : '同类型仅一个默认模板') }}

{{ (window.t ? (window.t('report.template.upload.dragText') || '点击或拖拽 .frx 文件到此处上传') : '点击或拖拽 .frx 文件到此处上传') }}

{{ (window.t ? (window.t('report.template.upload.hint') || '支持 FastReport 模板文件 (.frx),文件大小不超过 10MB') : '支持 FastReport 模板文件 (.frx),文件大小不超过 10MB') }}

📌 {{ (window.t ? (window.t('report.template.upload.guideTitle') || '使用说明') : '使用说明') }}
  1. {{ (window.t ? (window.t('report.template.upload.guideStep1') || '先点击「下载」获取当前模板 .frx 文件') : '先点击「下载」获取当前模板 .frx 文件') }}
  2. {{ (window.t ? (window.t('report.template.upload.guideStep2') || '用 FastReport Designer 打开编辑') : '用 FastReport Designer 打开编辑') }}
  3. {{ (window.t ? (window.t('report.template.upload.guideStep3') || '保存后在此上传修改后的文件') : '保存后在此上传修改后的文件') }}
  4. {{ (window.t ? (window.t('report.template.upload.guideStep4') || '上传后模板状态变为草稿,需重新「发布」') : '上传后模板状态变为草稿,需重新「发布」') }}
📐 {{ (window.t ? (window.t('report.template.designer.designing') || '正在设计: ') : '正在设计: ') }}{{ reportModule?.designerTemplate?.template_name }} {{ reportModule?.designerTemplate?.template_code }}
{{ (window.t ? (window.t('report.template.designer.newWindow') || '新窗口') : '新窗口') }} {{ (window.t ? (window.t('report.template.designer.close') || '关闭') : '关闭') }}

🔧 {{ (window.t ? (window.t('sensor.monitor.title') || '传感器实时监控') : '传感器实时监控') }}

{{ (window.t ? (window.t('sensor.monitor.status.disconnected') || '未连接') : '未连接') }}
{{ (window.t ? (window.t('sensor.monitor.stats.onlineSensors') || '在线传感器') : '在线传感器') }}: 0
{{ (window.t ? (window.t('sensor.monitor.stats.alertCount') || '报警数量') : '报警数量') }}: 0
{{ (window.t ? (window.t('sensor.monitor.stats.lastUpdate') || '数据更新') : '数据更新') }}: --

{{ (window.t ? (window.t('sensor.monitor.panels.sensorList') || '传感器列表') : '传感器列表') }}

{{ (window.t ? (window.t('sensor.monitor.panels.realtimeChart') || '实时数据曲线') : '实时数据曲线') }}

{{ (window.t ? (window.t('sensor.monitor.panels.latestAlerts') || '最新报警') : '最新报警') }}

📡 {{ (window.t ? (window.t('sensor.management.title') || '传感器管理') : '传感器管理') }}

{{ (window.t ? (window.t('sensor.management.table.columns.sensorId') || '传感器ID') : '传感器ID') }} {{ (window.t ? (window.t('sensor.management.table.columns.name') || '名称') : '名称') }} {{ (window.t ? (window.t('sensor.management.table.columns.equipmentId') || '设备ID') : '设备ID') }} {{ (window.t ? (window.t('sensor.management.table.columns.type') || '类型') : '类型') }} {{ (window.t ? (window.t('sensor.management.table.columns.unit') || '单位') : '单位') }} {{ (window.t ? (window.t('sensor.management.table.columns.latestValue') || '最新值') : '最新值') }} {{ (window.t ? (window.t('sensor.management.table.columns.status') || '状态') : '状态') }} {{ (window.t ? (window.t('sensor.management.table.columns.enabled') || '启用') : '启用') }} {{ (window.t ? (window.t('sensor.management.table.columns.lastCollectTime') || '最后采集时间') : '最后采集时间') }} {{ (window.t ? (window.t('sensor.management.table.columns.actions') || '操作') : '操作') }}
{{ (window.t ? (window.t('sensor.management.table.loading') || '加载中...') : '加载中...') }}
{{ (window.t ? (window.t('sensor.management.pagination.totalPrefix') || '共') : '共') }} 0 {{ (window.t ? (window.t('sensor.management.pagination.totalSuffix') || '条记录') : '条记录') }}
{{ (window.t ? (window.t('sensor.management.pagination.pagePrefix') || '第') : '第') }} 1 {{ (window.t ? (window.t('sensor.management.pagination.pageMiddle') || '页,共') : '页,共') }} 1 {{ (window.t ? (window.t('sensor.management.pagination.pageSuffix') || '页') : '页') }}
📡 {{ (window.t ? (window.t('sensor.management.sections.basicInfo') || '基本信息') : '基本信息') }}
🌡️ {{ (window.t ? (window.t('sensor.common.types.temperature') || '温度') : '温度') }} 📳 {{ (window.t ? (window.t('sensor.common.types.vibration') || '振动') : '振动') }} 🔘 {{ (window.t ? (window.t('sensor.common.types.pressure') || '压力') : '压力') }} ⚡ {{ (window.t ? (window.t('sensor.common.types.current') || '电流') : '电流') }} 🔌 {{ (window.t ? (window.t('sensor.common.types.voltage') || '电压') : '电压') }} 💧 {{ (window.t ? (window.t('sensor.common.types.humidity') || '湿度') : '湿度') }} 📦 {{ (window.t ? (window.t('sensor.common.types.other') || '其他') : '其他') }}
🔗 {{ (window.t ? (window.t('sensor.management.sections.communication') || '通讯配置') : '通讯配置') }}
MQTT HTTP Modbus
⚠️ {{ (window.t ? (window.t('sensor.management.sections.thresholds') || '阈值配置') : '阈值配置') }}
{{ (window.t ? (window.t('sensor.common.thresholds.normal') || '正常范围') : '正常范围') }} ~ {{ (window.t ? (window.t('sensor.common.thresholds.warning') || '预警范围') : '预警范围') }} ~ {{ (window.t ? (window.t('sensor.common.thresholds.alert') || '报警范围') : '报警范围') }} ~
📡 {{ (window.t ? (window.t('sensor.management.sections.basicInfo') || '基本信息') : '基本信息') }}
{{ sensorViewData.sensor_id }} {{ sensorViewData.name }} {{ sensorViewData.equipment_id }} {{ sensorTypeLabel(sensorViewData.sensor_type) }} {{ sensorViewData.unit || '--' }} {{ sensorViewData.is_active ? (window.t ? (window.t('sensor.common.enabled') || '启用') : '启用') : (window.t ? (window.t('sensor.common.disabled') || '禁用') : '禁用') }}
🔗 {{ (window.t ? (window.t('sensor.management.sections.communication') || '通讯配置') : '通讯配置') }}
{{ sensorViewData.protocol?.toUpperCase() || 'MQTT' }} {{ sensorViewData.collect_interval || 60 }} {{ (window.t ? (window.t('sensor.common.units.second') || '秒') : '秒') }} {{ sensorViewData.topic || '--' }}
📊 {{ (window.t ? (window.t('sensor.management.sections.realtime') || '实时数据') : '实时数据') }}
{{ sensorViewData.last_value ?? '--' }} {{ sensorViewData.unit || '' }} {{ sensorStatusLabel(sensorViewData.status) }} {{ sensorFormatDateTime(sensorViewData.last_collect_time) }}
⚠️ {{ (window.t ? (window.t('sensor.management.sections.thresholds') || '阈值配置') : '阈值配置') }}

🚨 {{ (window.t ? (window.t('sensor.alert.title') || '传感器报警管理') : '传感器报警管理') }}

{{ (window.t ? (window.t('sensor.alert.stats.total') || '总报警数') : '总报警数') }}: 0
{{ (window.t ? (window.t('sensor.alert.stats.open') || '待处理') : '待处理') }}: 0
{{ (window.t ? (window.t('sensor.alert.stats.acknowledged') || '已确认') : '已确认') }}: 0

{{ (window.t ? (window.t('sensor.alert.charts.trend') || '报警趋势') : '报警趋势') }}

{{ (window.t ? (window.t('sensor.alert.charts.levelDistribution') || '级别分布') : '级别分布') }}

{{ (window.t ? (window.t('sensor.alert.charts.statusDistribution') || '状态分布') : '状态分布') }}

{{ (window.t ? (window.t('sensor.alert.list.title') || '报警列表') : '报警列表') }}

{{ (window.t ? (window.t('sensor.alert.list.paginationInfo') || '显示 0-0 条,共 0 条') : '显示 0-0 条,共 0 条') }}
{{ (window.t ? (window.t('sensor.alert.list.columns.alertId') || '报警ID') : '报警ID') }} {{ (window.t ? (window.t('sensor.alert.list.columns.time') || '时间') : '时间') }} {{ (window.t ? (window.t('sensor.alert.list.columns.equipment') || '设备') : '设备') }} {{ (window.t ? (window.t('sensor.alert.list.columns.sensor') || '传感器') : '传感器') }} {{ (window.t ? (window.t('sensor.alert.list.columns.level') || '级别') : '级别') }} {{ (window.t ? (window.t('sensor.alert.list.columns.status') || '状态') : '状态') }} {{ (window.t ? (window.t('sensor.alert.list.columns.message') || '报警信息') : '报警信息') }} {{ (window.t ? (window.t('sensor.alert.list.columns.workOrderId') || '工单ID') : '工单ID') }} {{ (window.t ? (window.t('sensor.alert.list.columns.actions') || '操作') : '操作') }}
{{ (window.t ? (window.t('sensor.alert.list.loading') || '加载中...') : '加载中...') }}

🎛️ {{ (window.t ? (window.t('sensor.simulator.title') || 'MQTT传感器模拟器') : 'MQTT传感器模拟器') }}

v1.0
{{ (window.t ? (window.t('sensor.simulator.mqttStatus') || 'MQTT状态') : 'MQTT状态') }}:

🎮 {{ (window.t ? (window.t('sensor.simulator.panels.control') || '控制面板') : '控制面板') }}

{{ getSelectedSensorConfig().name }}

{{ (window.t ? (window.t('sensor.simulator.labels.equipmentId') || '设备ID') : '设备ID') }}: {{ getSelectedSensorConfig().equipment_id }} {{ (window.t ? (window.t('sensor.simulator.labels.type') || '类型') : '类型') }}: {{ getSelectedSensorConfig().sensor_type }} {{ (window.t ? (window.t('sensor.simulator.labels.unit') || '单位') : '单位') }}: {{ getSelectedSensorConfig().unit || (window.t ? (window.t('sensor.common.na') || 'N/A') : 'N/A') }}

🎯 {{ (window.t ? (window.t('sensor.simulator.sections.manualSend') || '手动发送') : '手动发送') }}

{{ getSelectedSensorConfig()?.unit || '' }}

📊 {{ (window.t ? (window.t('sensor.management.sections.thresholds') || '阈值配置') : '阈值配置') }}

{{ (window.t ? (window.t('sensor.common.thresholds.normal') || '正常范围') : '正常范围') }}: {{ getSelectedSensorConfig().thresholds.normal_min !== null && getSelectedSensorConfig().thresholds.normal_min !== undefined ? getSelectedSensorConfig().thresholds.normal_min : (window.t ? (window.t('sensor.common.na') || 'N/A') : 'N/A') }} ~ {{ getSelectedSensorConfig().thresholds.normal_max !== null && getSelectedSensorConfig().thresholds.normal_max !== undefined ? getSelectedSensorConfig().thresholds.normal_max : (window.t ? (window.t('sensor.common.na') || 'N/A') : 'N/A') }}
{{ (window.t ? (window.t('sensor.common.thresholds.warning') || '预警范围') : '预警范围') }}: {{ getSelectedSensorConfig().thresholds.warning_min !== null && getSelectedSensorConfig().thresholds.warning_min !== undefined ? getSelectedSensorConfig().thresholds.warning_min : (window.t ? (window.t('sensor.common.na') || 'N/A') : 'N/A') }} ~ {{ getSelectedSensorConfig().thresholds.warning_max !== null && getSelectedSensorConfig().thresholds.warning_max !== undefined ? getSelectedSensorConfig().thresholds.warning_max : (window.t ? (window.t('sensor.common.na') || 'N/A') : 'N/A') }}
{{ (window.t ? (window.t('sensor.common.thresholds.alert') || '报警范围') : '报警范围') }}: {{ getSelectedSensorConfig().thresholds.alert_min !== null && getSelectedSensorConfig().thresholds.alert_min !== undefined ? getSelectedSensorConfig().thresholds.alert_min : (window.t ? (window.t('sensor.common.na') || 'N/A') : 'N/A') }} ~ {{ getSelectedSensorConfig().thresholds.alert_max !== null && getSelectedSensorConfig().thresholds.alert_max !== undefined ? getSelectedSensorConfig().thresholds.alert_max : (window.t ? (window.t('sensor.common.na') || 'N/A') : 'N/A') }}

👈 {{ (window.t ? (window.t('sensor.simulator.empty.selectSensor') || '请选择一个传感器') : '请选择一个传感器') }}

📈 {{ (window.t ? (window.t('sensor.simulator.panels.statistics') || '统计信息') : '统计信息') }}

{{ (window.t ? (window.t('sensor.simulator.stats.activeSensors') || '活跃传感器') : '活跃传感器') }}: {{ statistics.active_sensors }} / {{ statistics.total_sensors }}
{{ (window.t ? (window.t('sensor.simulator.stats.totalSent') || '总发送数') : '总发送数') }}: {{ statistics.total_sent }}
{{ (window.t ? (window.t('sensor.simulator.stats.successCount') || '成功数') : '成功数') }}: {{ statistics.success_count }}
{{ (window.t ? (window.t('sensor.simulator.stats.failureCount') || '失败数') : '失败数') }}: {{ statistics.failure_count }}
{{ (window.t ? (window.t('sensor.simulator.stats.successRate') || '成功率') : '成功率') }}: {{ statistics.success_rate }}%

📜 {{ (window.t ? (window.t('sensor.simulator.panels.sendHistory') || '发送历史') : '发送历史') }}

{{ record.time }} {{ record.sensor_id }} {{ record.value }}{{ record.unit }} {{ record.status === 'success' ? '✅' : '❌' }}

{{ (window.t ? (window.t('sensor.simulator.empty.noHistory') || '暂无发送记录') : '暂无发送记录') }}

{{ editMode ? (window.t ? (window.t('sensor.simulator.dialog.titleEdit') || '编辑传感器') : '编辑传感器') : (window.t ? (window.t('sensor.simulator.dialog.titleAdd') || '新增传感器') : '新增传感器') }}

{{ (window.t ? (window.t('sensor.simulator.dialog.loadMoreEquipment') || '更多设备') : '更多设备') }} {{ sensorEquipmentOptions.length }}个

{{ (window.t ? (window.t('sensor.simulator.sections.simulationConfig') || '模拟配置') : '模拟配置') }}

{{ (window.t ? (window.t('sensor.management.sections.thresholds') || '阈值配置') : '阈值配置') }}

维护分析

{{ (window.t ? (window.t('predictiveMaintenance.title') || '预测性维护') : '预测性维护') }}

{{ (window.t ? (window.t('predictiveMaintenance.subtitle') || '基于机器学习的设备故障预测与维护建议') : '基于机器学习的设备故障预测与维护建议') }}

历史窗口 180天
执行方式 手动 / 定时
设备范围
{{ getLocalizedEquipmentName(equipment) }} ({{ equipment.equipment_id }})
{{ (window.t ? (window.t('predictiveMaintenance.buttons.runPrediction') || '立即预测') : '立即预测') }} {{ (window.t ? (window.t('predictiveMaintenance.buttons.refresh') || '刷新') : '刷新') }} {{ (window.t ? (window.t('predictiveMaintenance.buttons.trainModel') || '训练模型') : '训练模型') }}
❌ {{ predictiveMaintenance.errorMessage?.value }}
{{ (window.t ? (window.t('predictiveMaintenance.loading.prediction') || '加载预测数据...') : '加载预测数据...') }}
{{ (window.t ? (window.t('predictiveMaintenance.train.baseParams') || '基础参数') : '基础参数') }} {{ (window.t ? (window.t('predictiveMaintenance.train.scopeAll') || '全部设备') : '全部设备') }} {{ (window.t ? (window.t('predictiveMaintenance.train.scopeSelected') || '当前选中设备') : '当前选中设备') }}
{{ (window.t ? (window.t('predictiveMaintenance.train.lookbackHint') || '建议至少90天以获得更准确的模型') : '建议至少90天以获得更准确的模型') }}
额外问题管理
工单号: 查询 刷新
{{ additionalFindings.stats?.total ?? 0 }}
总数
{{ (additionalFindings.stats.bySeverity?.critical || 0) + (additionalFindings.stats.bySeverity?.urgent || 0) }}
严重/紧急
{{ additionalFindings.stats.byStatus?.pending || 0 }}
待处理
{{ additionalFindings.stats.byStatus?.resolved || 0 }}
已解决
新增额外问题
{{ finding.description || '暂无描述' }}
{{ (additionalFindings.severityOptions || []).find(opt => opt.value === finding.severity)?.label || finding.severity }} {{ (additionalFindings.statusOptions || []).find(opt => opt.value === finding.status)?.label || finding.status }} {{ finding.work_order_id }} {{ finding.category }}
attachment
+{{ finding.photo_urls.length - 3 }}
已加载 {{ additionalFindings.workOrderOptions?.value?.length || 0 }} 个工单,支持搜索过滤 暂无可用工单,请先创建工单 正在加载工单列表...
{{ opt.icon || opt.label }} {{ opt.label }} 电气 机械 安全隐患 环境问题 其他
上传
finding
{{ opt.icon || opt.label }} {{ opt.label }} 电气 机械 安全隐患 环境问题 其他
上传
finding
{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }}) 🔴 紧急 🟠 高 🟡 中 🟢 低 {{ u.name || u.username }} ({{ u.user_id }})

客户分类管理

管理客户的多级分类,支持树形层级结构

新增分类 刷新
📁 将在选中的分类下创建子分类

客户档案管理

管理客户信息档案,支持按分类筛选和搜索

新增客户 刷新
在用 停用 暂停 金牌 银牌 铜牌
📋 基本信息
📞 联系信息
🏷️ 服务信息
金牌 银牌 铜牌 在用 停用 暂停
{{ customerModule.customerDetail?.name }} {{ customerModule.customerDetail?.code || '-' }} {{ customerModule.customerDetail?.short_name || '-' }} {{ customerModule.customerDetail?.category_name || '-' }} 金牌 银牌 铜牌 - {{ customerModule.customerDetail?.contact_person || '-' }} {{ customerModule.customerDetail?.contact_phone || '-' }} {{ customerModule.customerDetail?.contact_email || '-' }} {{ customerModule.customerDetail?.address || '-' }} {{ customerModule.customerDetail?.contract_start || '-' }} {{ customerModule.customerDetail?.contract_end || '-' }} 在用 停用 暂停 {{ customerModule.customerDetail?.created_at }} {{ customerModule.customerDetail?.remarks || '-' }}
健康趋势(近12个月)

{{ (window.t ? (window.t('serviceSignature.title') || '现场服务签字') : '现场服务签字') }}

{{ (window.t ? (window.t('serviceSignature.subtitle') || '按客户+技师+服务日期归集的现场签字记录(采集走移动端,此处仅追溯查看)') : '按客户+技师+服务日期归集的现场签字记录(采集走移动端,此处仅追溯查看)') }}

{{ (window.t ? (window.t('common.refresh') || '刷新') : '刷新') }}
{{ c.label || c.name }} {{ u.label }} {{ serviceSignatureModule.tt(opt.labelKey, opt.defaultLabel) }} {{ (window.t ? (window.t('common.reset') || '重置') : '重置') }}
{{ serviceSignatureModule.detail?.signature_code }} {{ serviceSignatureModule.tt(serviceSignatureModule.statusMeta(serviceSignatureModule.detail?.status).labelKey, serviceSignatureModule.statusMeta(serviceSignatureModule.detail?.status).defaultLabel) }} {{ serviceSignatureModule.detail?.customer_name }} {{ serviceSignatureModule.detail?.technician_name }} {{ serviceSignatureModule.formatDate(serviceSignatureModule.detail?.service_date) }} {{ serviceSignatureModule.detail?.customer_signer_name }} {{ serviceSignatureModule.formatDateTime(serviceSignatureModule.detail?.signed_at) }} {{ serviceSignatureModule.detail?.remarks || '-' }}
{{ (window.t ? (window.t('serviceSignature.detail.customerSign') || '客户签名') : '客户签名') }}
-
{{ (window.t ? (window.t('serviceSignature.detail.technicianSign') || '技师签名') : '技师签名') }}
{{ (window.t ? (window.t('serviceSignature.detail.noTechSign') || '技师未签(可选)') : '技师未签(可选)') }}
{{ (window.t ? (window.t('serviceSignature.detail.workOrders') || '本次签字覆盖的工单(实时聚合)') : '本次签字覆盖的工单(实时聚合)') }}
{{ (window.t ? (window.t('serviceSignature.detail.noWorkOrders') || '当日无匹配工单') : '当日无匹配工单') }}
{{ card.equipment_name || card.title || '-' }} {{ (window.t ? (window.t('serviceSignature.detail.group') || '组合') : '组合') }} · {{ card.work_order_count }} {{ (window.t ? (window.t('serviceSignature.detail.single') || '单工单') : '单工单') }} {{ (window.t ? (window.t('serviceSignature.detail.paid') || '付费') : '付费') }}
{{ (window.t ? (window.t('serviceSignature.detail.viewInspection') || '查看点检详情 →') : '查看点检详情 →') }}
{{ (window.t ? (window.t('serviceSignature.detail.woTitle') || '标题') : '标题') }}:{{ card.title }}
⚠️ {{ (window.t ? (window.t('serviceSignature.detail.abnormalCount') || '磨损/更换项') : '磨损/更换项') }}({{ card.abnormal_items.length }})
· {{ it.equipment_name || '' }} {{ it.category_name ? '/' + it.category_name : '' }} / {{ it.item_name }} [{{ it.verdict_label || (window.t ? (window.t('serviceSignature.detail.verdict.' + it.verdict) || it.verdict) : it.verdict) }}]
… {{ (window.t ? (window.t('serviceSignature.detail.moreItems') || '更多') : '更多') }} {{ card.abnormal_items.length - 5 }} {{ (window.t ? (window.t('serviceSignature.detail.items') || '项') : '项') }}

{{ (window.t ? (window.t('aggregateReport.title') || '多点检单汇总报告') : '多点检单汇总报告') }}

{{ (window.t ? (window.t('aggregateReport.subtitle') || '按客户/期间合并多个点检工单的统计结果,生成可导出的汇总报告') : '按客户/期间合并多个点检工单的统计结果,生成可导出的汇总报告') }}

{{ (window.t ? (window.t('aggregateReport.actions.create') || '新建汇总报告') : '新建汇总报告') }} {{ (window.t ? (window.t('common.refresh') || '刷新') : '刷新') }} {{ (window.t ? (window.t('aggregateReport.actions.approvalConfig') || '审批流配置') : '审批流配置') }}
{{ c.name || c.short_name || c.code }} {{ (window.t ? (window.t(opt.labelKey) || opt.defaultLabel) : opt.defaultLabel) }} {{ u.label }} {{ (window.t ? (window.t(opt.labelKey) || opt.defaultLabel) : opt.defaultLabel) }} {{ (window.t ? (window.t('aggregateReport.filter.onlyStale') || '仅陈旧') : '仅陈旧') }} {{ (window.t ? (window.t('aggregateReport.filter.onlyAttachments') || '仅有附件') : '仅有附件') }} {{ (window.t ? (window.t('common.reset') || '重置') : '重置') }}
{{ (window.t ? (window.t('aggregateReport.batch.selected') || '已选 {n} 条') : '已选 {n} 条').replace('{n}', aggregateReportModule.selectedRowKeys.length) }} {{ (window.t ? (window.t('aggregateReport.batch.recalc') || '批量重算') : '批量重算') }} {{ (window.t ? (window.t('aggregateReport.batch.submit') || '批量提交') : '批量提交') }} {{ (window.t ? (window.t('aggregateReport.batch.export') || '批量导出') : '批量导出') }}
PDF Excel 中文 日本語 English
{{ (window.t ? (window.t('aggregateReport.batch.exportHint') || '将选中的 {n} 份报告打包为 ZIP 下载') : '将选中的 {n} 份报告打包为 ZIP 下载').replace('{n}', aggregateReportModule.selectedRowKeys.length) }}
📋 {{ (window.t ? (window.t('aggregateReport.section.basic') || '基本信息') : '基本信息') }} {{ (window.t ? (window.t('aggregateReport.tag.stale') || '需重算') : '需重算') }} {{ aggregateReportModule.editForm.report_code }}
{{ c.name || c.short_name || c.code }} {{ (window.t ? (window.t(opt.labelKey) || opt.defaultLabel) : opt.defaultLabel) }} {{ (window.t ? (window.t(opt.labelKey) || opt.defaultLabel) : opt.defaultLabel) }} {{ (window.t ? (window.t('aggregateReport.approvalStatus.pending') || '审批中') : '审批中') }} {{ (window.t ? (window.t('aggregateReport.approvalStatus.approved') || '审批通过') : '审批通过') }} {{ (window.t ? (window.t('aggregateReport.approvalStatus.rejected') || '审批驳回') : '审批驳回') }}
{{ p.name }}×{{ p.work_order_count }}
{{ (window.t ? (window.t('aggregateReport.fields.participantsEmpty') || '选择来源工单后自动带入工单负责人') : '选择来源工单后自动带入工单负责人') }}
📑 {{ (window.t ? (window.t('aggregateReport.section.sources') || '来源工单') : '来源工单') }} {{ (window.t ? (window.t('aggregateReport.actions.selectSources') || '选择来源工单') : '选择来源工单') }}
⚠️ {{ (window.t ? (window.t('aggregateReport.section.abnormalItems') || '异常项明细(磨损/更换)') : '异常项明细(磨损/更换)') }} {{ aggregateReportModule.abnormalTotal }} {{ (window.t ? (window.t('aggregateReport.verdictFilter.all') || '全部') : '全部') }} {{ (window.t ? (window.t('aggregateReport.verdictFilter.wear') || '磨损') : '磨损') }} {{ (window.t ? (window.t('aggregateReport.verdictFilter.replace') || '更换') : '更换') }}
📊 {{ (window.t ? (window.t('aggregateReport.section.summary') || '统计预览') : '统计预览') }} {{ (window.t ? (window.t('aggregateReport.lastRecalcAt') || '上次计算') : '上次计算') }}:{{ aggregateReportModule.editForm.last_recalc_at }}
{{ (window.t ? (window.t('aggregateReport.summary.topAbnormal') || 'TOP 异常分类') : 'TOP 异常分类') }}:
{{ it.category }} × {{ it.count }}
🖼️ {{ (window.t ? (window.t('aggregateReport.section.featuredPhotos') || '代表性照片') : '代表性照片') }} {{ aggregateReportModule.featuredPhotos.length }}
{{ ph.verdict === 'replace' ? (window.t ? (window.t('aggregateReport.verdict.replace') || '更换') : '更换') : (window.t ? (window.t('aggregateReport.verdict.wear') || '磨损') : '磨损') }}
{{ ph.equipment_name || '-' }}
{{ ph.caption }}
📎 {{ (window.t ? (window.t('aggregateReport.section.attachments') || '附件') : '附件') }} {{ (window.t ? (window.t('aggregateReport.fields.attachmentUpload') || '上传附件') : '上传附件') }}
{{ (window.t ? (window.t('aggregateReport.fields.attachmentEmpty') || '暂无附件') : '暂无附件') }}
{{ (item && (item.original_filename || item.filename)) || '-' }} {{ Math.round(((item && item.size) || 0) / 1024) }} KB {{ item.uploaded_at }} by {{ aggregateReportModule.getUploaderDisplay(item) }}
{{ (window.t ? (window.t('common.delete') || '删除') : '删除') }}
{{ (window.t ? (window.t('aggregateReport.approval.step') || '第') : '第') }} {{ aggregateReportModule.approvalRecord.current_step }} / {{ aggregateReportModule.approvalRecord.total_steps }} {{ (window.t ? (window.t('aggregateReport.approval.stepUnit') || '步') : '步') }}
{{ aggregateReportModule.inlineApprovalDetail.workflow_name || aggregateReportModule.inlineApprovalDetail.workflow_id || '-' }} {{ aggregateReportModule.inlineApprovalDetail.status || '-' }} {{ aggregateReportModule.inlineApprovalDetail.created_by_name || aggregateReportModule.inlineApprovalDetail.created_by || '-' }} {{ aggregateReportModule.inlineApprovalDetail.created_at || '-' }}
📋 {{ (window.t ? (window.t('aggregateReport.approval.history') || '审批历史') : '审批历史') }}
{{ (window.t ? (window.t('aggregateReport.approval.step') || '第') : '第') }}{{ step.step_number }}{{ (window.t ? (window.t('aggregateReport.approval.stepUnit') || '步') : '步') }}:{{ step.step_name || '-' }} {{ step.status }}
👤 {{ step.approver_name || step.approver_id || '-' }}
💬 {{ step.comments }}
🕓 {{ step.approved_at }}
{{ (window.t ? (window.t('aggregateReport.approval.noSteps') || '暂无审批步骤') : '暂无审批步骤') }}
{{ (window.t ? (window.t('aggregateReport.approval.empty') || '未获取到审批详情') : '未获取到审批详情') }}
{{ (window.t ? (window.t('common.close') || '关闭') : '关闭') }} {{ (window.t ? (window.t('aggregateReport.actions.recalc') || '重新计算') : '重新计算') }} {{ (window.t ? (window.t('aggregateReport.actions.export') || '导出') : '导出') }} {{ (window.t ? (window.t('aggregateReport.actions.gotoFailureRate') || '本期故障率') : '本期故障率') }} {{ (window.t ? (window.t('aggregateReport.actions.gotoAbnormal') || '本期异常 TOP10') : '本期异常 TOP10') }} {{ (window.t ? (window.t('aggregateReport.actions.publish') || '提交生成') : '提交生成') }} {{ (window.t ? (window.t('aggregateReport.actions.submitApproval') || '提交审批') : '提交审批') }} {{ (window.t ? (window.t('aggregateReport.actions.submitArchive') || '提交(直接归档)') : '提交(直接归档)') }} {{ (window.t ? (window.t('aggregateReport.actions.revertDraft') || '回退草稿') : '回退草稿') }} {{ (window.t ? (window.t('aggregateReport.actions.revertDraft') || '重新打回') : '重新打回') }} {{ aggregateReportModule.isEditMode ? ((window.t ? (window.t('common.save') || '保存') : '保存')) : ((window.t ? (window.t('common.create') || '创建') : '创建')) }}
{{ c.name || c.short_name || c.code }} {{ (window.t ? (window.t('common.search') || '查询') : '查询') }} {{ (window.t ? (window.t('aggregateReport.sourceModal.tip') || '已选 {n} 条') : '已选 {n} 条').replace('{n}', aggregateReportModule.sourceSelectedIds?.length || 0) }}

{{ (window.t ? (window.t('quotation.title') || '更换零件报价') : '更换零件报价') }}

{{ (window.t ? (window.t('quotation.subtitle') || '从汇总报告的更换异常项生成报价单;审批通过后自动反写到对应工单领料') : '从汇总报告的更换异常项生成报价单;审批通过后自动反写到对应工单领料') }}

{{ (window.t ? (window.t('quotation.actions.create') || '新建报价') : '新建报价') }} {{ (window.t ? (window.t('common.refresh') || '刷新') : '刷新') }}
{{ c.name || c.short_name || c.code || c.label }} {{ quotationModule.tt(opt.labelKey, opt.defaultLabel) }} {{ (window.t ? (window.t('common.reset') || '重置') : '重置') }}
📋 {{ (window.t ? (window.t('quotation.section.basic') || '基本信息') : '基本信息') }} {{ quotationModule.editForm.quotation_code }} {{ quotationModule.tt(opt.labelKey, opt.defaultLabel) }}
{{ c.name || c.short_name || c.code || c.label }}
📑 {{ (window.t ? (window.t('quotation.section.reports') || '关联汇总报告') : '关联汇总报告') }} {{ (window.t ? (window.t('quotation.actions.selectReports') || '选择关联报告') : '选择关联报告') }}
{{ r.title || r.report_code || r.aggregate_report_id }} ({{ r.report_code }})
{{ (window.t ? (window.t('quotation.tip.noLinkedReports') || '尚未关联汇总报告') : '尚未关联汇总报告') }}
🔧 {{ (window.t ? (window.t('quotation.section.items') || '更换明细') : '更换明细') }} {{ (window.t ? (window.t('quotation.tip.openWorkOrder') || '(点击明细行或来源标签可查看对应工单详情)') : '(点击明细行或来源标签可查看对应工单详情)') }}
{{ (window.t ? (window.t('quotation.actions.addItem') || '添加明细行') : '添加明细行') }}
{{ (window.t ? (window.t('quotation.summary.itemsAmount') || '零件合计') : '零件合计') }}: {{ quotationModule.formatNumber(quotationModule.computedItemsAmount, 2) }}
{{ (window.t ? (window.t('quotation.fields.serviceCharge') || '服务费') : '服务费') }}:
{{ (window.t ? (window.t('quotation.summary.totalAmount') || '总计') : '总计') }}: {{ quotationModule.formatNumber(quotationModule.computedTotalAmount, 2) }}
{{ (window.t ? (window.t('quotation.partPicker.scopeBom') || '子机构BOM') : '子机构BOM') }} {{ (window.t ? (window.t('quotation.partPicker.scopeAll') || '全部备件') : '全部备件') }}
{{ (window.t ? (window.t('quotation.partPicker.bomHint') || '仅显示子机构所属型号 BOM 范围内的备件') : '仅显示子机构所属型号 BOM 范围内的备件') }} · {{ quotationModule.partPickerComponentName }}
{{ (window.t ? (window.t('quotation.image.before') || '更换前图片') : '更换前图片') }}
×
-
{{ (window.t ? (window.t('quotation.image.after') || '更换后图片') : '更换后图片') }} {{ (window.t ? (window.t('quotation.image.afterSupplement') || '(审批后可补传完工凭证)') : '(审批后可补传完工凭证)') }}
×
-

{{ (window.t ? (window.t('quotation.reject.hint') || '驳回后报价单将回到草稿状态,可修改后重新提交') : '驳回后报价单将回到草稿状态,可修改后重新提交') }}

{{ (window.t ? (window.t('quotation.approvalProgress.step') || '当前步骤') : '当前步骤') }}: {{ quotationModule.approvalProgressRecord.current_step }} / {{ quotationModule.approvalProgressRecord.total_steps }} {{ quotationModule.approvalProgressRecord.status }}
{{ s.step_name || ('步骤 ' + (s.step_number || (i+1))) }} {{ s.approver_name || s.approver_id || '' }}
{{ s.status }} · {{ s.approved_at }}
{{ s.comments }}
{{ (window.t ? (window.t('quotation.approvalProgress.hint') || '审批通过/驳回请前往「审批中心」处理') : '审批通过/驳回请前往「审批中心」处理') }}

{{ (window.t ? (window.t('quotation.cancel.hint') || '作废后该报价单将被标记为已作废,不可恢复') : '作废后该报价单将被标记为已作废,不可恢复') }}

{{ (window.t ? (window.t('sparePartCategory.title') || '备件分类管理') : '备件分类管理') }}

{{ (window.t ? (window.t('sparePartCategory.subtitle') || '管理备件的多级分类,支持中/日/英三语名称') : '管理备件的多级分类,支持中/日/英三语名称') }}

{{ (window.t ? (window.t('sparePartCategory.actions.create') || '新增分类') : '新增分类') }} {{ (window.t ? (window.t('common.refresh') || '刷新') : '刷新') }}

{{ (window.t ? (window.t('supplierMgmt.categoryPage.title') || '供应商分类管理') : '供应商分类管理') }}

{{ (window.t ? (window.t('supplierMgmt.categoryPage.subtitle') || '管理供应商的多级分类,支持树形层级结构') : '管理供应商的多级分类,支持树形层级结构') }}

{{ (window.t ? (window.t('supplierMgmt.categoryPage.addCategory') || '新增分类') : '新增分类') }} {{ (window.t ? (window.t('supplierMgmt.common.refresh') || '刷新') : '刷新') }}
📁 {{ (window.t ? (window.t('supplierMgmt.categoryPage.createChildHint') || '将在选中的分类下创建子分类') : '将在选中的分类下创建子分类') }}

{{ (window.t ? (window.t('supplierMgmt.managementPage.title') || '供应商档案管理') : '供应商档案管理') }}

{{ (window.t ? (window.t('supplierMgmt.managementPage.subtitle') || '管理供应商信息,支持评级、合同和财务信息管理') : '管理供应商信息,支持评级、合同和财务信息管理') }}

{{ (window.t ? (window.t('supplierMgmt.managementPage.addSupplier') || '新增供应商') : '新增供应商') }} {{ (window.t ? (window.t('supplierMgmt.common.refresh') || '刷新') : '刷新') }}
{{ (window.t ? (window.t('supplierMgmt.common.active') || '在用') : '在用') }} {{ (window.t ? (window.t('supplierMgmt.common.inactive') || '停用') : '停用') }} {{ (window.t ? (window.t('supplierMgmt.common.blacklisted') || '黑名单') : '黑名单') }} A级 B级 C级 D级 {{ (window.t ? (window.t('supplierMgmt.common.reset') || '重置') : '重置') }}
{{ (window.t ? (window.t('supplierMgmt.managementPage.total') || '共') : '共') }} {{ supplierModule.stats.total }} {{ (window.t ? (window.t('supplierMgmt.managementPage.companyUnit') || '家') : '家') }} {{ (window.t ? (window.t('supplierMgmt.common.active') || '在用') : '在用') }} {{ supplierModule.stats.by_status?.active || 0 }} {{ (window.t ? (window.t('supplierMgmt.common.inactive') || '停用') : '停用') }} {{ supplierModule.stats.by_status?.inactive || 0 }} {{ (window.t ? (window.t('supplierMgmt.common.blacklisted') || '黑名单') : '黑名单') }} {{ supplierModule.stats.by_status?.blacklisted || 0 }}
{{ opt.label }} {{ (window.t ? (window.t('supplierMgmt.modal.financeSection') || '财务信息') : '财务信息') }} {{ opt.label }} {{ opt.label }} {{ (window.t ? (window.t('supplierMgmt.modal.contractStatusSection') || '合同与状态') : '合同与状态') }} {{ opt.label }} {{ supplierModule.supplierDetail?.name }} {{ supplierModule.supplierDetail?.code || '-' }} {{ supplierModule.supplierDetail?.short_name || '-' }} {{ supplierModule.supplierDetail?.category_name || '-' }} {{ supplierModule.supplierDetail?.contact_person || '-' }} {{ supplierModule.supplierDetail?.contact_phone || '-' }} {{ supplierModule.supplierDetail?.contact_email || '-' }} {{ supplierModule.supplierDetail?.address || '-' }} A级 B级 C级 D级 - 在用 停用 黑名单 {{ supplierModule.supplierDetail?.bank_name || '-' }} {{ supplierModule.supplierDetail?.bank_account || '-' }} {{ supplierModule.supplierDetail?.tax_number || '-' }} {{ supplierModule.supplierDetail?.payment_terms || '-' }} {{ supplierModule.supplierDetail?.currency || '-' }} {{ supplierModule.supplierDetail?.lead_time_days ? supplierModule.supplierDetail.lead_time_days + '天' : '-' }} {{ supplierModule.supplierDetail?.contract_start || '-' }} {{ supplierModule.supplierDetail?.contract_end || '-' }} {{ supplierModule.supplierDetail?.created_at }} {{ supplierModule.supplierDetail?.remarks || '-' }}

工时费率档案

维护人工费用的标准小时费率,供工单费用录入下拉选择

刷新 新增费率
工单完成时自动生成人工费用使用此费率(全局唯一)

{{ t('archives.location') || '位置档案' }}

{{ t('locationArchive.subtitle') || '管理设备位置信息,支持树形层级结构组织' }}

{{ t('locationArchive.actions.add') || '新增位置' }} {{ t('locationArchive.actions.import') || '批量导入' }} {{ t('locationArchive.actions.expandAll') || '展开全部' }} {{ t('locationArchive.actions.collapseAll') || '收起全部' }} {{ t('locationArchive.actions.refresh') || '刷新' }}
📍

{{ t('locationArchive.empty.title') || '暂无位置数据' }}

{{ t('locationArchive.empty.description') || '点击上方"新增位置"按钮开始创建位置档案' }}

{{ t('locationArchive.modal.sections.basic') || '基本信息' }}
{{ t('locationArchive.modal.sections.detail') || '详细信息' }}
{{ t('locationArchive.modal.help.customer') || '💡 关联客户后,此位置仅对有权访问该客户的用户可见' }}
{{ t('locationArchive.modal.sections.gps') || 'GPS配置' }} {{ t('locationArchive.modal.actions.clearGps') || '清除GPS' }}
{{ t('locationArchive.modal.actions.pickOnMap') || '在地图上选点' }} {{ t('locationArchive.modal.actions.geocode') || '地理编码' }}
{{ t('locationArchive.modal.help.geocode') || '输入地址后点击"地理编码"可自动获取经纬度' }}
{{ locationModule.locationForm.geo_data.radius }}{{ t('locationArchive.modal.units.meter') || '米' }}
{{ t('locationArchive.modal.help.radius') || '移动端工单签到时,距离此位置在该范围内即视为到位' }}
{{ t('locationArchive.mapModal.hint') || '点击地图或拖动标记选择位置' }}
{{ t('locationArchive.mapModal.longitude') || '经度' }}: {{ locationModule.locationForm.longitude }}
{{ t('locationArchive.mapModal.latitude') || '纬度' }}: {{ locationModule.locationForm.latitude }}
{{ t('locationArchive.mapModal.address') || '地址' }}: {{ locationModule.locationForm.address }}
{{ t('locationArchive.importModal.chooseFile') || '选择文件' }}

{{ t('storageLocation.title') || '仓库管理' }}

{{ t('storageLocation.subtitle') || '管理仓库、区域、货架、层位、库位的层级结构' }}

{{ t('storageLocation.createFirst') || '创建第一个仓库' }}
{{ t('storageLocation.form.sectionBasic') || '基本信息' }} {{ t('storageLocation.form.sectionWarehouse') || '仓库属性' }} {{ t('storageLocation.form.sectionOther') || '其他设置' }}

{{ t('archives.department') || '部门档案' }}

{{ t('departmentArchive.subtitle') || '管理组织部门架构,支持树形层级结构和成员关联' }}

{{ t('departmentArchive.actions.add') || '新增部门' }} {{ t('departmentArchive.actions.expandAll') || '展开全部' }} {{ t('departmentArchive.actions.collapseAll') || '收起全部' }} {{ t('departmentArchive.actions.refresh') || '刷新' }} {{ t('departmentArchive.filter.enabled') || '已启用' }} {{ t('departmentArchive.filter.disabled') || '已禁用' }}
🏢

{{ t('departmentArchive.empty.title') || '暂无部门数据' }}

{{ t('departmentArchive.empty.description') || '点击上方"新增部门"按钮开始创建部门档案' }}

{{ t('departmentArchive.memberModal.add') || '添加成员' }}

{{ t('departmentArchive.addMemberModal.transferHint') || '带有 [部门名] 标记的用户已属于其他部门,添加后将从原部门转移' }}

{{ t('archives.type') || '设备类型档案' }}

{{ t('equipmentTypePage.subtitle') || '管理设备类型层级结构,支持无限层级的设备类型分类' }}

{{ t('equipmentTypePage.actions.add') || '新增类型' }} {{ t('equipmentTypePage.actions.refresh') || '刷新' }} {{ t('equipmentTypePage.actions.expandAll') || '展开全部' }} {{ t('equipmentTypePage.actions.collapseAll') || '收起全部' }}
{{ (window.t ? (window.t('equipmentTypeModal.helps.nameEn') || '可选;用于英文界面展示,留空时回退到中文名') : '可选;用于英文界面展示,留空时回退到中文名') }}
{{ (window.t ? (window.t('equipmentTypeModal.helps.nameJa') || '可选;用于日文界面展示,留空时回退到中文名') : '可选;用于日文界面展示,留空时回退到中文名') }}
{{ option.label }}
{{ (window.t ? (window.t('equipmentTypeModal.helps.parent') || '设置此类型的上级类型,用于构建层级结构') : '设置此类型的上级类型,用于构建层级结构') }}
{{ (window.t ? (window.t('equipmentTypeModal.helps.sortOrder') || '数值越小排序越靠前,相同序号按名称排序') : '数值越小排序越靠前,相同序号按名称排序') }}
{{ (window.t ? window.t('equipmentTypeModal.helps.componentKind', '机构种类标签,用于与机构模板的机构种类精确匹配;机构级(叶子)类型建议填写') : '机构种类标签,用于与机构模板的机构种类精确匹配;机构级(叶子)类型建议填写') }}

{{ (window.t ? (window.t('equipmentCategory.title') || '装备分类档案') : '装备分类档案') }}

{{ (window.t ? (window.t('equipmentCategory.subtitle') || '面向根设备(is_component=0)的归属分类。子件类型请在"零部件分类"中维护。') : '面向根设备(is_component=0)的归属分类。子件类型请在"零部件分类"中维护。') }}

{{ (window.t ? (window.t('equipmentCategory.actions.add') || '新增装备分类') : '新增装备分类') }} {{ (window.t ? (window.t('equipmentCategory.actions.refresh') || '刷新') : '刷新') }}

{{ (window.t ? (window.t('equipmentModel.title') || '设备型号档案') : '设备型号档案') }}

{{ (window.t ? (window.t('equipmentModel.subtitle') || '介于设备类型与设备实例之间的型号档案。') : '介于设备类型与设备实例之间的型号档案。') }}

{{ (window.t ? (window.t('equipmentModel.table.type') || '设备类型') : '设备类型') }} {{ (window.t ? (window.t('common.all') || '全部') : '全部') }}
{{ (window.t ? (window.t('equipmentModel.actions.add') || '新增设备型号') : '新增设备型号') }} {{ (window.t ? (window.t('equipmentModel.actions.refresh') || '刷新') : '刷新') }}
{{ (window.t ? (window.t('equipmentModel.form.manufacturers') || '关联制造商(可选,多选)') : '关联制造商(可选,多选)') }}
{{ (window.t ? (window.t('equipmentModel.form.addManufacturer') || '添加制造商') : '添加制造商') }}

{{ (window.t ? (window.t('manufacturer.title') || '制造商档案') : '制造商档案') }}

{{ (window.t ? (window.t('manufacturer.subtitle') || '设备/型号的制造商主数据,支持代码、多语言名称、关联供应商') : '设备/型号的制造商主数据,支持代码、多语言名称、关联供应商') }}

{{ (window.t ? (window.t('manufacturer.actions.add') || '新增制造商') : '新增制造商') }} {{ (window.t ? (window.t('manufacturer.actions.refresh') || '刷新') : '刷新') }}

{{ (window.t ? (window.t('equipmentModelBom.title') || '设备型号 BOM') : '设备型号 BOM') }}

{{ (window.t ? (window.t('equipmentModelBom.subtitle') || '为每种设备型号维护标准备件清单,工单创建时按 BOM 自动建议耗材/备件') : '为每种设备型号维护标准备件清单,工单创建时按 BOM 自动建议耗材/备件') }}

{{ (window.t ? (window.t('equipmentModel.table.type') || '设备类型') : '设备类型') }} {{ (window.t ? (window.t('common.all') || '全部') : '全部') }}
{{ (window.t ? (window.t('equipmentModelBom.selectModel') || '设备型号') : '设备型号') }} {{ equipmentModelBomModule.selectedModel.value.label }} {{ (window.t ? (window.t('common.refresh') || '刷新') : '刷新') }} {{ (window.t ? (window.t('equipmentModelBom.addRow') || '新增行') : '新增行') }} {{ (window.t ? (window.t('equipmentModelBom.saveAll') || '批量保存') : '批量保存') }} {{ (window.t ? (window.t('equipmentModelBom.unsaved') || '有未保存修改') : '有未保存修改') }}

{{ (window.t ? (window.t('equipmentSeries.title') || '设备系列分类') : '设备系列分类') }}

{{ (window.t ? (window.t('equipmentSeries.subtitle') || '3 级树:品牌 → 产品线 → 形式;主键沿用历史系列编码') : '3 级树:品牌 → 产品线 → 形式;主键沿用历史系列编码') }}

{{ (window.t ? (window.t('equipmentSeries.actions.addRoot') || '新增顶级分类') : '新增顶级分类') }} {{ (window.t ? (window.t('equipmentSeries.actions.refresh') || '刷新') : '刷新') }}

{{ (window.t ? (window.t('structureTemplate.title') || '机构模板(共享池)') : '机构模板(共享池)') }}

{{ (window.t ? (window.t('structureTemplate.subtitle') || '定义"主梁×2 / 端梁×2 / 起升机构×1"等组件清单;设备类型通过引用模板共享配置') : '定义"主梁×2 / 端梁×2 / 起升机构×1"等组件清单;设备类型通过引用模板共享配置') }}

{{ (window.t ? (window.t('structureTemplate.actions.add') || '新增模板') : '新增模板') }} {{ (window.t ? (window.t('structureTemplate.actions.refresh') || '刷新') : '刷新') }}
{{ (window.t ? (window.t('structureTemplate.actions.addComponent') || '添加组件') : '添加组件') }}

{{ (window.t ? (window.t('structureTemplate.usageSummary', { templateId: equipmentStructureTemplateModule.currentUsage.value.template_id, count: equipmentStructureTemplateModule.currentUsage.value.count }) || `模板 ${equipmentStructureTemplateModule.currentUsage.value.template_id} 被 ${equipmentStructureTemplateModule.currentUsage.value.count} 个设备类型引用:`) : `模板 ${equipmentStructureTemplateModule.currentUsage.value.template_id} 被 ${equipmentStructureTemplateModule.currentUsage.value.count} 个设备类型引用:`) }}

{{ (window.t ? (window.t('equipmentModelPicture.title') || '型号附件 · 分类图片') : '型号附件 · 分类图片') }}

{{ (window.t ? (window.t('equipmentModelPicture.subtitle') || '为每种设备型号维护铭牌图片、附属资料,以及型号×点检项目分类的参考图') : '为每种设备型号维护铭牌图片、附属资料,以及型号×点检项目分类的参考图') }}

{{ (window.t ? (window.t('equipmentModelPicture.deviceCategory') || '设备分类') : '设备分类') }} {{ (window.t ? (window.t('common.all') || '全部') : '全部') }}
{{ (window.t ? (window.t('equipmentModelPicture.selectModel') || '设备型号') : '设备型号') }} [{{ equipmentModelPictureModule.selectedModel.value.code }}] {{ equipmentModelPictureModule.localizeName(equipmentModelPictureModule.selectedModel.value) }} {{ (window.t ? (window.t('common.refresh') || '刷新') : '刷新') }}
{{ (window.t ? (window.t('equipmentModelPicture.buttons.uploadAttachment') || '上传附件') : '上传附件') }} {{ (window.t ? (window.t('equipmentModelPicture.tips.maxSize') || '单文件 ≤ 10MB,支持 JPG/PNG/GIF/WEBP/PDF') : '单文件 ≤ 10MB,支持 JPG/PNG/GIF/WEBP/PDF') }}
{{ (window.t ? (window.t('equipmentModelPicture.categoryFallbackHint') || '该型号暂无绑定模板,下拉将显示全部启用分类') : '该型号暂无绑定模板,下拉将显示全部启用分类') }}
{{ (window.t ? (window.t('equipmentModelPicture.categoryFromTemplatesHint') || '下拉已按型号绑定的模板收敛') : '下拉已按型号绑定的模板收敛') }} {{ (window.t ? (window.t('equipmentModelPicture.source.model') || '型号绑定') : '型号绑定') }} {{ (window.t ? (window.t('equipmentModelPicture.source.inherited') || '继承自类型') : '继承自类型') }} {{ (window.t ? (window.t('equipmentModelPicture.source.mixed') || '型号+类型') : '型号+类型') }}
{{ (window.t ? (window.t('equipmentModelPicture.selectCategory') || '点检项目分类') : '点检项目分类') }}: {{ (window.t ? (window.t('equipmentModelPicture.buttons.uploadCategoryPicture') || '上传分类图片') : '上传分类图片') }}

{{ (window.t ? (window.t('equipmentTag.title') || '设备标签档案') : '设备标签档案') }}

{{ (window.t ? (window.t('equipmentTag.subtitle') || '管理设备标签,用于对设备进行分类和标记') : '管理设备标签,用于对设备进行分类和标记') }}

{{ (window.t ? (window.t('equipmentTag.addTag') || '新增标签') : '新增标签') }} {{ (window.t ? (window.t('equipmentTag.refresh') || '刷新') : '刷新') }}
{{ (window.t ? (window.t('equipmentTag.form.preview') || '预览') : '预览') }}
{{ t('bim.viewer.preview_3d.refresh') }} {{ t('bim.viewer.preview_3d.total_count', { count: (Array.isArray(filteredAnnotated) ? filteredAnnotated.length : (Array.isArray(filteredAnnotated?.value) ? filteredAnnotated.value.length : 0)) }) }}
{{ t('bim.viewer.preview_3d.load_annotations') }} {{ t('bim.viewer.preview_3d.clear_selection') }} {{ t('bim.viewer.preview_3d.delete_annotation') }}
{{ t('bim.viewer.preview_3d.reset_view') }} {{ t('bim.viewer.preview_3d.wireframe_mode') }}
{{ t('bim.viewer.preview_3d.write_id') }}
{{ t('bim.viewer.preview_3d.export_tagged_glb') }} {{ t('bim.viewer.preview_3d.submit_sidecar') }}
{{ current3DFile.display_name || current3DFile.name }} ({{ formatFileSize(current3DFile.size || 0) }})
⚠️ {{ t('bim.viewer.preview_3d.ifc_placeholder') }}

{{ t('tool.title') }}

{{ t('tool.create') }}
{{ toolModule.selectedTypeName.value }}
{{ toolModule.selectedTool.value.name }} {{ toolModule.selectedTool.value?.type_name || toolModule.toolTypeName(toolModule.selectedTool.value?.type) }} {{ toolModule.selectedTool.value.model || '-' }} {{ toolModule.selectedTool.value.asset_number || '-' }} {{ toolModule.selectedTool.value.status || '-' }} {{ toolModule.selectedTool.value.manufacturer || '-' }} {{ toolModule.selectedTool.value.unit_price != null ? '¥' + toolModule.selectedTool.value.unit_price : '-' }} {{ toolModule.selectedTool.value?.quantity || 1 }} {{ toolModule.inspectionTypeLabel(toolModule.selectedTool.value?.periodic_inspection_type) }} {{ toolModule.selectedTool.value?.last_inspection_date || '-' }} {{ toolModule.selectedTool.value?.next_inspection_date || '-' }}

{{ t('purchaseRequest.title') }}

{{ t('purchaseRequest.status.all') }} {{ t('purchaseRequest.status.draft') }} {{ t('purchaseRequest.status.pendingApproval') }} {{ t('purchaseRequest.status.approved') }} {{ t('purchaseRequest.status.rejected') }} {{ t('purchaseRequest.status.ordered') }} {{ t('purchaseRequest.status.cancelled') }} {{ t('purchaseRequest.create') }}
{{ t('purchaseRequest.receipt.form.items') || '到货明细' }}
📷{{ t('purchaseRequest.receipt.scan.button') || '扫码' }} {{ prModule.scannerMessage.value }}
{{ prModule.receiptForm.items.length }} {{ t('common.items') || '项' }},默认带入未到数量与采购单价
{{ record.spare_part_name || '-' }}
✓ {{ t('purchaseRequest.receipt.scan.verified') || '已扫码' }}
{{ t('purchaseRequest.form.sparePartId') || '备件ID' }}
{{ record.spare_part_id || '-' }}
{{ t('purchaseRequest.form.sparePartCode') || '备件编码' }}
{{ record.part_no || '-' }}
订购 / 已到 / 未到
订购 {{ record.ordered_qty || 0 }} 已到 {{ (record.ordered_qty || 0) - (record.remaining_qty || 0) }} 未到 {{ record.remaining_qty || 0 }}
{{ t('purchaseRequest.receipt.columns.receivedQty') || '本次数量' }}
{{ t('purchaseRequest.receipt.columns.unitPrice') || '单价' }}
{{ t('purchaseRequest.receipt.form.batchNo') || '批次号' }}
{{ t('purchaseRequest.form.basicInfo') || '基本信息' }}
{{ t('purchaseRequest.form.sparePart') }} {{ prModule.requestForm.items.length }}
{{ t('purchaseRequest.form.totalAmount') }}: ¥{{ prModule.computedTotalAmount.value }}
{{ t('sparePartCategory.treeTitle') || '备件分类' }}
{{ t('purchaseRequest.form.sparePart') }} *
{{ t('purchaseRequest.form.quantity') }}
{{ t('purchaseRequest.form.unitPrice') }} (结存)
{{ t('purchaseRequest.form.subtotal') || '小计' }}
¥{{ ((Number(item.quantity)||0) * (Number(item.unit_price)||0)).toFixed(2) }}
{{ t('purchaseRequest.actions.addItem') }}

{{ t('certification.title') || '资质证书管理' }}

{{ t('certification.stats.total') }}: {{ certModule.statistics.value.total || 0 }}
{{ t('certification.stats.valid') }}: {{ certModule.statistics.value.valid || 0 }}
{{ t('certification.stats.expiringSoon') }}: {{ certModule.statistics.value.expiring_soon || 0 }}
{{ t('certification.stats.expired') }}: {{ certModule.statistics.value.expired || 0 }}
{{ t('certification.form.filterUser') || '筛选用户' }}: {{ u.name }} ({{ u.username }}) {{ t('certification.create') || '添加证书' }}
{{ t('certification.form.sectionBasic') || '基本信息' }}
{{ u.name }} ({{ u.username }})
{{ t('certification.form.sectionValidity') || '有效期' }}
{{ t('certification.attachment.scan') }}
PDF
{{ att.file_name }} {{ certModule.formatFileSize(att.file_size) }}
{{ t('certification.attachment.delete') }}
{{ t('certification.attachment.upload') }} JPG / PNG / PDF, max 10MB
{{ t('certification.attachment.noAttachment') }}
PDF
{{ att.file_name }}
{{ certModule.formatFileSize(att.file_size) }}
{{ t('certification.attachment.preview') }}
证书附件

{{ trainingModule.currentSubtitle ? trainingModule.currentSubtitle.value : (window.t ? (window.t('training.title') || '培训管理') : '培训管理') }}

{{ window.t ? (window.t('training.categoryPanel.title') || '课程分类') : '课程分类' }}
{{ window.t ? (window.t('training.categoryPanel.subtitle') || '按分类管理课程与资料') : '按分类管理课程与资料' }}
{{ window.t ? (window.t('training.filter.allCategories') || '全部课程') : '全部课程' }}
{{ trainingModule.courses.value.length }}
{{ window.t ? (window.t('training.categoryPanel.allHint') || '显示当前筛选条件下的全部课程') : '显示当前筛选条件下的全部课程' }}
{{ trainingModule.activeCourseCategoryName.value }}
{{ trainingModule.formatCategoryType(trainingModule.activeCourseCategory.value?.type) }}
{{ trainingModule.activeCourseCategory.value?.description || (window.t ? (window.t('training.coursePanel.defaultHint') || '课程可以关联知识库条目,外部链接只作为补充资料。') : '课程可以关联知识库条目,外部链接只作为补充资料。') }}
{{ window.t ? (window.t('training.btn.newCourse') || '新建课程') : '新建课程' }}
{{ window.t ? (window.t('training.mandatory.yes') || '必修') : '必修' }} {{ window.t ? (window.t('training.mandatory.no') || '选修') : '选修' }} {{ window.t ? (window.t('training.status.active') || '启用') : '启用' }} {{ window.t ? (window.t('training.status.inactive') || '停用') : '停用' }} {{ window.t ? (window.t('common.refresh') || '刷新') : '刷新' }}
{{ window.t ? (window.t('training.coursePanel.materialHint') || '课程资料优先取知识库已发布内容') : '课程资料优先取知识库已发布内容' }}
{{ window.t ? (window.t('training.btn.newPlan') || '新建计划') : '新建计划' }}
{{ window.t ? (window.t('training.scope.my') || '我的') : '我的' }} {{ window.t ? (window.t('training.scope.all') || '全部') : '全部' }} {{ window.t ? (window.t('training.recStatus.assigned') || '已分配') : '已分配' }} {{ window.t ? (window.t('training.recStatus.inProgress') || '进行中') : '进行中' }} {{ window.t ? (window.t('training.recStatus.completed') || '已完成') : '已完成' }} {{ window.t ? (window.t('training.recStatus.expired') || '已过期') : '已过期' }} {{ window.t ? (window.t('training.recStatus.failed') || '未通过') : '未通过' }} {{ window.t ? (window.t('training.recStatus.archived') || '已归档') : '已归档' }} {{ window.t ? (window.t('common.refresh') || '刷新') : '刷新' }}
{{ window.t ? (window.t('training.btn.myMap') || '查看我的地图') : '查看我的地图' }}
{{ window.t ? (window.t('training.question.draft') || '草稿') : '草稿' }} {{ window.t ? (window.t('training.question.approved') || '已审核') : '已审核' }} {{ window.t ? (window.t('training.question.rejected') || '已驳回') : '已驳回' }} {{ window.t ? (window.t('training.question.stale') || '陈旧') : '陈旧' }} {{ window.t ? (window.t('training.question.single') || '单选') : '单选' }} {{ window.t ? (window.t('training.question.multiple') || '多选') : '多选' }} {{ window.t ? (window.t('training.question.boolean') || '判断') : '判断' }} + {{ window.t ? (window.t('training.question.addQuestion') || '新建题目') : '新建题目' }} ✨ {{ window.t ? (window.t('training.question.aiGenerate') || 'AI 出题') : 'AI 出题' }}
{{ window.t ? (window.t('common.refresh') || '刷新') : '刷新' }}
{{ window.t ? (window.t('training.requirement.hint') || '按工单风险等级配置必须完成的培训课程;阻断模式会禁止派单或开始执行。') : '按工单风险等级配置必须完成的培训课程;阻断模式会禁止派单或开始执行。' }}
{{ window.t ? (window.t('common.refresh') || '刷新') : '刷新' }} {{ window.t ? (window.t('common.create') || '新建') : '新建' }}
{{ window.t ? (window.t('qualification.requirement.riskCategory') || '风险类别') : '风险类别' }} {{ window.t ? (window.t('training.requirement.riskLevel') || '风险等级') : '风险等级' }} {{ window.t ? (window.t('qualification.requirement.requiredQualifications') || '要求资质') : '要求资质' }} {{ window.t ? (window.t('training.requirement.enforcement') || '控制方式') : '控制方式' }} {{ window.t ? (window.t('training.columns.status') || '状态') : '状态' }} {{ window.t ? (window.t('training.requirement.description') || '说明') : '说明' }} {{ window.t ? (window.t('common.action') || '操作') : '操作' }}
{{ window.t ? (window.t('common.loading') || '加载中...') : '加载中...' }}
{{ window.t ? (window.t('common.noData') || '暂无数据') : '暂无数据' }}
{{ trainingModule.getRiskCategoryLabel(record.risk_category_code) }} {{ window.t ? (window.t('qualification.requirement.any') || '不限') : '不限' }} {{ trainingModule.riskLevelLabel(record.risk_level) }} {{ window.t ? (window.t('qualification.requirement.any') || '不限') : '不限' }}
{{ course.name || course.course_id }} -
{{ record.enforcement === 'block' ? (window.t ? (window.t('training.requirement.block') || '阻断') : '阻断') : (window.t ? (window.t('training.requirement.warn') || '提醒') : '提醒') }} {{ record.is_active ? (window.t ? (window.t('common.enabled') || '启用') : '启用') : (window.t ? (window.t('common.disabled') || '停用') : '停用') }} {{ record.description || '-' }} -
入职培训 在岗培训(OJT) 强制培训 服务商培训 通用 启用 {{ trainingModule.getRiskCategoryLabel(rc.code) }} {{ window.t ? (window.t('workorder.risk.low') || '低风险') : '低风险' }} {{ window.t ? (window.t('workorder.risk.medium') || '中风险') : '中风险' }} {{ window.t ? (window.t('workorder.risk.high') || '高风险') : '高风险' }} {{ window.t ? (window.t('workorder.risk.critical') || '重大风险') : '重大风险' }} {{ trainingModule.getQualificationKindBadge(qt.kind) }} {{ trainingModule.getQualificationKindBadge(qt.kind) }} {{ trainingModule.getQualificationKindBadge(qt.kind) }} {{ trainingModule.getQualificationTypeLabel(qt.qualification_type_id) }} [法规] {{ qt.code }} {{ window.t ? (window.t('training.requirement.block') || '阻断') : '阻断' }} {{ window.t ? (window.t('training.requirement.warn') || '提醒') : '提醒' }}
{{ window.t ? (window.t('qualification.requirement.statutoryHint') || '已选法规要求资质,必须使用「阻断」') : '已选法规要求资质,必须使用「阻断」' }}
{{ window.t ? (window.t('common.enabled') || '启用') : '启用' }}
{{ c.name }} 线上 线下 文档
{{ window.t ? (window.t('training.courseForm.knowledgeHint') || '课程资料优先使用知识库内容,便于版本维护、全文检索和统一发布。') : '课程资料优先使用知识库内容,便于版本维护、全文检索和统一发布。' }}
必修课程 启用 停用
指定人员 岗位 部门 {{ c.name }} 已完成 进行中 {{ c.name }} {{ window.t ? (window.t('training.question.single') || '单选') : '单选' }} {{ window.t ? (window.t('training.question.multiple') || '多选') : '多选' }} {{ window.t ? (window.t('training.question.boolean') || '判断') : '判断' }} {{ window.t ? (window.t('training.question.easy') || '简单') : '简单' }} {{ window.t ? (window.t('training.question.medium') || '中等') : '中等' }} {{ window.t ? (window.t('training.question.hard') || '困难') : '困难' }}
{{ opt.key }}
{{ window.t ? (window.t('training.question.draft') || '草稿') : '草稿' }} {{ window.t ? (window.t('training.question.approved') || '已审核') : '已审核' }}
中文 English 日本語
{{ window.t ? (window.t('training.question.single') || '单选') : '单选' }} {{ window.t ? (window.t('training.question.multiple') || '多选') : '多选' }} {{ window.t ? (window.t('training.question.boolean') || '判断') : '判断' }}
{{ opt.key }}
{{ window.t ? (window.t('training.translation.markApproved') || '标记为已审核') : '标记为已审核' }}
⏱ {{ window.t ? (window.t('training.attempt.countdown') || '剩余时间') : '剩余时间' }}: {{ Math.floor(trainingModule.examCountdown.value / 60) }}:{{ String(trainingModule.examCountdown.value % 60).padStart(2, '0') }}
{{ trainingModule.currentAttempt.value.is_passed ? (window.t ? (window.t('training.attempt.passed') || '通过') : '通过') : (window.t ? (window.t('training.attempt.failed') || '未通过') : '未通过') }} {{ window.t ? (window.t('training.attempt.score') || '成绩') : '成绩' }}: {{ trainingModule.currentAttempt.value.score }} / {{ trainingModule.currentAttempt.value.total_score }}
{{ window.t ? (window.t('training.attempt.retryHint') || '可点击下方"再考一次"重新尝试,或关闭窗口。') : '可点击下方"再考一次"重新尝试,或关闭窗口。' }}
{{ window.t ? (window.t('training.feedback.tooEasy') || '偏简单') : '偏简单' }} {{ window.t ? (window.t('training.feedback.moderate') || '适中') : '适中' }} {{ window.t ? (window.t('training.feedback.tooHard') || '偏难') : '偏难' }}
{{ window.t ? (window.t('training.question.single') || '单选') : '单选' }} {{ window.t ? (window.t('training.question.multiple') || '多选') : '多选' }} {{ window.t ? (window.t('training.question.boolean') || '判断') : '判断' }}
{{ window.t ? (window.t('training.quiz.shuffleQuestions') || '题目乱序') : '题目乱序' }} {{ window.t ? (window.t('training.quiz.shuffleOptions') || '选项乱序') : '选项乱序' }} {{ window.t ? (window.t('training.quiz.isActive') || '启用') : '启用' }}
{{ window.t ? (window.t('training.lesson.tip') || '调整顺序、设置时长与达成阈值;学员侧将按顺序展示') : '调整顺序、设置时长与达成阈值;学员侧将按顺序展示' }}
{{ window.t ? (window.t('training.lesson.addLesson') || '新建课时') : '新建课时' }}
{{ window.t ? (window.t('training.lesson.knowledge') || '知识库') : '知识库' }} {{ window.t ? (window.t('training.lesson.markdown') || '富文本') : '富文本' }} {{ window.t ? (window.t('training.lesson.video') || '视频') : '视频' }} PDF {{ window.t ? (window.t('training.lesson.external') || '外部链接') : '外部链接' }} {{ window.t ? (window.t('training.lesson.required') || '必修') : '必修' }}
{{ idx + 1 }}. {{ l.title }}
{{ l.content_type }} {{ window.t ? (window.t('training.lesson.required') || '必修') : '必修' }} {{ l.duration_minutes }}m
{{ trainingModule.lessonStudyCurrent.value.title }} {{ window.t ? (window.t('training.lesson.completed') || '已完成') : '已完成' }}
⏱ {{ trainingModule.getLessonStudyDwellDisplay() }}s / {{ trainingModule.lessonStudyCurrent.value.min_dwell_seconds || 0 }}s 🎬 {{ trainingModule.getLessonStudyVideoDisplay() }}% / {{ trainingModule.lessonStudyCurrent.value.min_video_pct || 0 }}% 📜 {{ trainingModule.getLessonStudyScrollDisplay() }}% / {{ trainingModule.lessonStudyCurrent.value.min_scroll_pct || 0 }}% {{ window.t ? (window.t('training.lesson.markComplete') || '完成本课时') : '完成本课时' }}
{{ window.t ? (window.t('training.lesson.selectHint') || '请从左侧选择课时开始学习') : '请从左侧选择课时开始学习' }}

{{ t('shiftTemplate.title') || '班次模板管理' }}

{{ t('shiftTemplate.subtitle') || '维护班次编制规则与部门授权' }}
{{ t('common.create') }}
{{ t('shiftTemplate.matrix.desc') || '勾选表示允许该部门使用此模板。行=模板,列=部门(按上下级缩进显示)。勾选上级部门会自动级联勾选所有下级部门。' }}
L1 L2 L3 = 部门层级 归属 = 该模板归属部门(永远可用,不可取消) = 全局模板(所有部门自动可用) = 可授权(勾选=允许该部门使用)
{{ t('shiftTemplate.matrix.pendingChanges') || '待保存' }}: {{ stplState.dirtyCount }} {{ t('common.reset') || '重置' }} {{ t('common.save') || '保存全部' }} ({{ stplState.dirtyCount }})
{{ t('shiftTemplate.matrix.templateCol') || '模板 / 部门' }}
L{{ dept.level + 1 }} {{ dept.name }}
{{ tpl.name }} {{ tpl.start_time }}~{{ tpl.end_time }} {{ t('shiftTemplate.globalTemplate') || '全局' }}
{{ t('shiftTemplate.owner') || '归属' }}
{{ t('common.noData') || '暂无数据' }}
{{ t('shiftSchedule.category.day') || '白班' }} {{ t('shiftSchedule.category.evening') || '晚班' }} {{ t('shiftSchedule.category.night') || '夜班' }} {{ t('shiftSchedule.category.overtime') || '加班' }} {{ t('shiftSchedule.category.rest') || '休息' }}

{{ t('shiftSchedule.title') }}

{{ t('shiftSchedule.status.publishing') || '发布中...' }} {{ t('shiftSchedule.status.published') }} v{{ ssModule.scheduleData.value.revision || 1 }} {{ t('shiftSchedule.status.draft') }} {{ t('shiftSchedule.selectedCount') || '已选' }} {{ ssModule.selectedCells.value.length }} — {{ t('shiftSchedule.batchEdit') || '批量改班' }} {{ t('common.clear') || '清空' }}
{{ t('shiftSchedule.undo') }} {{ t('shiftSchedule.redo') }} {{ t('shiftSchedule.batchCreate') }} {{ t('shiftSchedule.publish') }} {{ t('shiftSchedule.unpublish') }} {{ t('shiftSchedule.copyToDepartment.button') || '复制到其他部门' }} {{ t('shiftSchedule.export') }} {{ t('shiftSchedule.includeSubtree') || '含下级部门' }}
{{ ssModule.validationPanelCollapsed.value ? '▸' : '▾' }} ⚠ {{ t('shiftSchedule.validation.summary') || '存在校验提示' }} {{ t('shiftSchedule.validationScope.' + (ssModule.activeDateRange().scope || 'all')) || '范围' }} {{ t('shiftSchedule.validation.levels.error') || '错误' }} {{ ssModule.validationCountsInScope.value.error }} {{ t('shiftSchedule.validation.levels.warning') || '警告' }} {{ ssModule.validationCountsInScope.value.warning }} {{ t('shiftSchedule.validation.levels.info') || '提示' }} {{ ssModule.validationCountsInScope.value.info }} {{ ssModule.validationPanelCollapsed.value ? (t('shiftSchedule.showPanel') || '展开') : (t('shiftSchedule.hidePanel') || '折叠') }} {{ t('shiftSchedule.showPanel') || '展开' }}
{{ t('shiftSchedule.validation.colDate') || '日期' }} {{ t('shiftSchedule.columns.name') || '姓名' }} {{ t('shiftSchedule.validation.colType') || '类型' }} {{ t('shiftSchedule.validation.colMessage') || '说明' }}
{{ t('shiftSchedule.validation.noInScope') || '当前视图范围内没有校验提示' }}
{{ row.date.slice(5) }} {{ ssModule.weekdayShort(row.date) }} {{ row.userName }} {{ t(ssModule.issueTypeI18n(row.type)) || row.type }} {{ ssModule.localizeIssueMessage(row) }}
{{ t('shiftSchedule.columns.name') }} {{ t('shiftSchedule.columns.department') || '部门' }} {{ d.split('-')[2] }} {{ t('shiftSchedule.summary.work') }} {{ t('shiftSchedule.summary.leave') }} {{ t('shiftSchedule.summary.overtime') }}
{{ u.user_name }} {{ u.department_name }} {{ (ssModule.userMonthlySummary.value[u.user_id] || {}).work || 0 }} {{ (ssModule.userMonthlySummary.value[u.user_id] || {}).leave || 0 }} {{ (ssModule.userMonthlySummary.value[u.user_id] || {}).overtime || 0 }}
{{ t('shiftSchedule.hints.monthGrid') }}

{{ t('shiftSchedule.form.selectDepartment') }}

{{ t('shiftSchedule.messages.noData') }}

{{ t('shiftSchedule.columns.name') }}
{{ d.split('-').slice(1).join('-') }}
{{ t('shiftSchedule.weekdays.' + ['sunday','monday','tuesday','wednesday','thursday','friday','saturday'][new Date(d).getDay()]) }}
{{ u.user_name }}
{{ t('shiftSchedule.hints.week') }}

{{ t('shiftSchedule.form.selectDepartment') }}

{{ t('shiftSchedule.messages.noData') }}

{{ t('shiftSchedule.hourCoverage') }}
{{ hc.hour }}
{{ t('shiftSchedule.columns.name') }}
{{ h - 1 }}
{{ row.user_name }} {{ row.shifts.length }}
{{ sh.template_name }} {{ ssModule.ganttPreviewText(sh) }}
{{ t('shiftSchedule.messages.noData') }}

{{ t('shiftSchedule.form.selectDepartment') }}

{{ t('shiftSchedule.messages.noData') }}
{{ t('shiftSchedule.messages.noData') }}
{{ ssModule.editingCell.value.userName }} @ {{ ssModule.editingCell.value.date }}
{{ t('shiftSchedule.cellEdit.shiftIndex') || '班次' }} #{{ idx + 1 }} {{ t('common.existing') || '已有' }} {{ t('common.new') || '新增' }} {{ t('common.delete') }}
{{ tpl.name }} ({{ tpl.start_time }}~{{ tpl.end_time }}) {{ t('shiftSchedule.status.scheduled') }} {{ t('shiftSchedule.status.published') }} {{ t('shiftSchedule.status.draft') }} {{ t('shiftSchedule.status.leave') }} {{ t('shiftSchedule.status.swapped') }}
+ {{ t('shiftSchedule.cellEdit.addShift') || '添加班次' }}
{{ t('shiftSchedule.ctx.edit') }}
{{ t('shiftSchedule.ctx.markLeave') }}
{{ t('shiftSchedule.ctx.copy') }}
{{ t('shiftSchedule.ctx.paste') }}
{{ t('shiftSchedule.ctx.history') }}
{{ t('shiftSchedule.ctx.clear') }}
{{ t('shiftSchedule.validation.settings.desc') || '关闭后,被禁用规则产生的提示将不再显示与判定(仅影响本机浏览器)。' }}
{{ t(ssModule.issueTypeI18n(rt)) }} {{ t('shiftSchedule.validation.settings.desc_' + rt) }}
{{ t('shiftSchedule.validation.settings.reset') || '恢复默认' }} {{ t('common.close') || '关闭' }}
{{ tpl.name }} ({{ tpl.start_time }}~{{ tpl.end_time }}) {{ t('shiftSchedule.status.scheduled') }} {{ t('shiftSchedule.status.leave') }}
{{ t('shiftSchedule.batchEditHint') || '该操作将批量写入选中的所有单元格' }}
{{ t('shiftSchedule.durationHint') || '可精确调整班次实际起止时间,支持跨天夜班。' }}
{{ ssModule.clearProgress.current }} / {{ ssModule.clearProgress.total }} {{ ssModule.clearProgress.label }}
{{ t('shiftSchedule.weekdays.monday') }} ~ {{ t('shiftSchedule.weekdays.sunday') }} {{ tpl.name }} ({{ tpl.start_time }}~{{ tpl.end_time }}) {{ (permModule.departments || []).find(d => d.department_id === ssModule.currentDepartment.value)?.name || ssModule.currentDepartment.value }} {{ ssModule.currentMonth.value }} {{ t('shiftSchedule.copyToDepartment.overwriteHint') || '开启后目标部门当月现有草稿将被清空后再创建' }}

{{ (window.t ? (window.t('shiftSchedule.mySchedule') || '我的排班') : '我的排班') }}

{{ ssModule.currentMonth.value }}
< {{ ssModule.currentMonth.value }} > {{ t('common.refresh') || '刷新' }}

{{ t('shiftSchedule.hints.myFullCalendar') }}

👥
{{ permModule?.stats?.roleCount || 0 }}
{{ t('system.permission.stats.roleCount') }}
🔑
{{ permModule?.stats?.permissionCount || 0 }}
{{ t('system.permission.stats.permissionCount') }}
👤
{{ permModule?.stats?.userCount || 0 }}
{{ t('system.permission.stats.userCount') }}
🏢
{{ permModule?.stats?.deptCount || 0 }}
{{ t('system.permission.stats.departmentCount') }}
{{ t('system.permission.user.create') }}

{{ t('system.permission.role.listTitle') }}

{{ t('system.permission.role.create') }}
{{ role.name }} {{ t('system.permission.role.tags.system') }} 🌐 {{ t('system.permission.role.tags.global') }} 🏢 {{ t('system.permission.role.tags.tenant') }} {{ role.seat_type === 'admin' ? t('system.permission.role.tags.adminSeat') : t('system.permission.role.tags.fieldSeat') }}
{{ role.code }}
👥 {{ t('system.permission.role.userCount', { count: role.user_count || 0 }) }} 🔑 {{ t('system.permission.role.permissionCount', { count: role.permission_count || 0 }) }}

{{ permModule.selectedRole?.name }} - {{ t('system.permission.role.permissionConfig') }} {{ t('system.permission.role.tags.system') }} {{ t('system.permission.role.selectedPermissionCount', { count: permModule.selectedPermissions?.length || 0 }) }}

{{ t('system.permission.role.update') }} {{ t('system.permission.role.delete') }} {{ t('system.permission.role.selectAll') }} {{ t('system.permission.role.clearAll') }} {{ t('system.permission.role.savePermissions') }}
👈

{{ t('system.permission.role.selectRoleHint') }}

ℹ️ {{ t('system.permission.data.description') }}
{{ t('system.permission.data.create') }}
{{ opt.label }} {{ opt.label }} {{ opt.label }} {{ t('system.permission.common.search') }} {{ t('system.permission.common.reset') }}
{{ group.name }} {{ group.target_type === 'role' ? t('system.permission.data.targetType.role') : t('system.permission.data.targetType.user') }} {{ permModule.getDataRuleTargetLabel(group) }}
✏️ {{ t('system.permission.common.edit') }} 🗑️ {{ t('system.permission.common.delete') }}
📊 {{ t('system.permission.data.scopeLabel') }} {{ permModule.getScopeTypeName(group.scope_type) }}
📦 {{ t('system.permission.data.resourceLabel') }}
{{ permModule.getResourceTypeLabel(rt) }} + {{ t('system.permission.common.add') }}
👤 {{ t('system.permission.my.basicInfo') }}
{{ t('system.permission.my.userId') }} {{ permModule.myPermissions?.user_id }}
{{ t('system.permission.my.tenant') }} {{ permModule.myPermissions?.tenant_id || t('system.permission.my.defaultTenant') }}
{{ t('system.permission.my.permissionCount') }}
🎭 {{ t('system.permission.my.rolesTitle') }}
{{ role.name }}
{{ t('system.permission.my.noRoles') }}
🔐 {{ t('system.permission.my.permissionsTitle') }} {{ t('system.permission.my.permissionsCount', { count: permModule.myPermissions?.permissions?.length || 0 }) }}

{{ (window.t ? (window.t('equipmentInventory.title') || '设备盘点管理') : '设备盘点管理') }}

{{ (window.t ? (window.t('equipmentInventory.statusOptions.draft') || '草稿') : '草稿') }} {{ (window.t ? (window.t('equipmentInventory.statusOptions.in_progress') || '进行中') : '进行中') }} {{ (window.t ? (window.t('equipmentInventory.statusOptions.completed') || '已完成') : '已完成') }} {{ (window.t ? (window.t('equipmentInventory.actions.exportItems') || '导出明细') : '导出明细') }} {{ (window.t ? (window.t('equipmentInventory.createBtn') || '创建盘点任务') : '创建盘点任务') }}
{{ (window.t ? (window.t('equipmentInventory.scopeTypes.all') || '全部') : '全部') }} {{ (window.t ? (window.t('equipmentInventory.scopeTypes.location') || '按位置') : '按位置') }} {{ (window.t ? (window.t('equipmentInventory.scopeTypes.department') || '按部门') : '按部门') }} {{ (window.t ? (window.t('equipmentInventory.scopeTypes.equipment_type') || '按类型') : '按类型') }} {{ (window.t ? (window.t('equipmentInventory.form.includeChildren') || '包含所属下级') : '包含所属下级') }}
{{ (window.t ? (window.t('equipmentInventory.actions.batchUpdateLocation') || '批量更新位置') : '批量更新位置') }} {{ (window.t ? (window.t('equipmentInventory.actions.batchUpdateStatus') || '批量更新状态') : '批量更新状态') }} {{ (window.t ? (window.t('equipmentInventory.actions.exportDiff') || '导出差异明细') : '导出差异明细') }}

{{ (window.t ? (window.t('labelManagement.title') || '标签管理') : '标签管理') }}

{{ (window.t ? (window.t('labelManagement.batchPrint') || '批量打印') : '批量打印') }} {{ (window.t ? (window.t('labelManagement.createTemplate') || '新建模板') : '新建模板') }}
{{ (window.t ? (window.t('labelManagement.targetTypes.equipment') || '设备') : '设备') }} {{ (window.t ? (window.t('labelManagement.targetTypes.spare_part') || '备件') : '备件') }} {{ (window.t ? (window.t('labelManagement.barcodeTypes.qrcode') || '二维码') : '二维码') }} {{ (window.t ? (window.t('labelManagement.barcodeTypes.code128') || 'Code128') : 'Code128') }} {{ (window.t ? (window.t('labelManagement.barcodeTypes.code39') || 'Code39') : 'Code39') }} {{ (window.t ? (window.t('labelManagement.sizeOptions.small') || '小 (40×25mm)') : '小 (40×25mm)') }} {{ (window.t ? (window.t('labelManagement.sizeOptions.medium') || '中 (60×40mm)') : '中 (60×40mm)') }} {{ (window.t ? (window.t('labelManagement.sizeOptions.large') || '大 (80×60mm)') : '大 (80×60mm)') }} {{ (window.t ? (window.t('labelManagement.sizeOptions.custom') || '自定义') : '自定义') }} 资产编号 (asset_number) 设备ID (equipment_id) 设备名称 (name)
内置模板 FastReport(PDF) {{ tpl.name }}
{{ ft.name }} ({{ ft.paper }}) PDF HTML
已选 {{ (labelState.selectedEquipmentIds || []).length }} 台设备
取消 打印 生成标签

{{ (window.t ? (window.t('sparePartBorrow.title') || '备件借用管理') : '备件借用管理') }}

{{ (window.t ? (window.t('sparePartBorrow.statusOptions.pending') || '待审批') : '待审批') }} {{ (window.t ? (window.t('sparePartBorrow.statusOptions.approved') || '已审批') : '已审批') }} {{ (window.t ? (window.t('sparePartBorrow.statusOptions.borrowed') || '已借出') : '已借出') }} {{ (window.t ? (window.t('sparePartBorrow.statusOptions.returned') || '已归还') : '已归还') }} {{ (window.t ? (window.t('sparePartBorrow.statusOptions.cancelled') || '已取消') : '已取消') }} {{ (window.t ? (window.t('sparePartBorrow.createBtn') || '创建借用申请') : '创建借用申请') }}
{{ sp.name }} ({{ sp.spare_part_id }})
📷
{{ (window.t ? (window.t('sparePartBorrow.returnModal.scanHint') || '支持摄像头扫码、图片识别或 USB 扫码枪直接扫入') : '支持摄像头扫码、图片识别或 USB 扫码枪直接扫入') }}
{{ (window.t ? (window.t('sparePartBorrow.lendModal.borrowQuantity') || '借用数量') : '借用数量') }}: {{ borrowState.currentBorrow?.quantity }}
📷
{{ (window.t ? (window.t('sparePartBorrow.lendModal.scanHint') || '支持摄像头扫码、图片识别或 USB 扫码枪直接扫入') : '支持摄像头扫码、图片识别或 USB 扫码枪直接扫入') }}
{{ (window.t ? (window.t('sparePartBorrow.lendModal.allowAdjustHint') || '开启后,如借出数量超出当前库存,将自动创建调整事务后出库') : '开启后,如借出数量超出当前库存,将自动创建调整事务后出库') }}
{{ log.action === 'create' ? (window.t ? (window.t('sparePartBorrow.logsModal.actionCreate') || '创建申请') : '创建申请') : log.action === 'approve' ? (window.t ? (window.t('sparePartBorrow.logsModal.actionApprove') || '审批通过') : '审批通过') : log.action === 'reject' ? (window.t ? (window.t('sparePartBorrow.logsModal.actionReject') || '审批拒绝') : '审批拒绝') : log.action === 'lend' ? (window.t ? (window.t('sparePartBorrow.logsModal.actionLend') || '确认借出') : '确认借出') : log.action === 'return' ? (window.t ? (window.t('sparePartBorrow.logsModal.actionReturn') || '确认归还') : '确认归还') : log.action === 'cancel' ? (window.t ? (window.t('sparePartBorrow.logsModal.actionCancel') || '取消借用') : '取消借用') : log.action }} {{ log.user_name }}
{{ log.created_at?.replace('T', ' ')?.substring(0, 19) }}
{{ (window.t ? (window.t('sparePartBorrow.logsModal.quantity') || '数量') : '数量') }}: {{ log.payload.quantity }} | {{ (window.t ? (window.t('sparePartBorrow.logsModal.stockFlow') || '库存流水') : '库存流水') }}: {{ log.payload.transaction_id }}
{{ (window.t ? (window.t('sparePartBorrow.logsModal.warehouse') || '仓库') : '仓库') }}: {{ log.payload.storage_location_name }} | {{ (window.t ? (window.t('sparePartBorrow.logsModal.batchNo') || '批次') : '批次') }}: {{ log.payload.batch_no }}
{{ (window.t ? (window.t('sparePartBorrow.logsModal.thisReturn') || '本次归还') : '本次归还') }}: {{ log.payload.return_quantity }} | {{ (window.t ? (window.t('sparePartBorrow.logsModal.totalReturned') || '累计归还') : '累计归还') }}: {{ log.payload.total_returned }}

{{ (window.t ? (window.t('shiftHandover.title') || '交接班管理') : '交接班管理') }}

{{ (window.t ? (window.t('shiftHandover.shiftTypes.morning') || '早班') : '早班') }} {{ (window.t ? (window.t('shiftHandover.shiftTypes.afternoon') || '中班') : '中班') }} {{ (window.t ? (window.t('shiftHandover.shiftTypes.night') || '晚班') : '晚班') }} {{ (window.t ? (window.t('shiftHandover.statusOptions.draft') || '草稿') : '草稿') }} {{ (window.t ? (window.t('shiftHandover.statusOptions.submitted') || '已提交') : '已提交') }} {{ (window.t ? (window.t('shiftHandover.createBtn') || '新建交接班') : '新建交接班') }}
{{ (window.t ? (window.t('shiftHandover.shiftTypes.morning') || '早班') : '早班') }}{{ (window.t ? (window.t('shiftHandover.shiftTypes.afternoon') || '中班') : '中班') }}{{ (window.t ? (window.t('shiftHandover.shiftTypes.night') || '晚班') : '晚班') }} {{ u.username ? `${u.name} (${u.username})` : (u.name || u.user_id) }}
编辑:{{ getPendingItemDisplay(handoverState.form.pending_items[handoverState.expandedPendingIdx]) }}
{{ u.name }} ({{ u.username }}) {{ (window.t ? (window.t('shiftHandover.pendingStatus.pending') || '待办') : '待办') }} {{ (window.t ? (window.t('shiftHandover.pendingStatus.done') || '完成') : '完成') }} 收起
{{ handoverState.currentDetail.handover_date }} {{ (window.t ? (window.t('shiftHandover.shiftTypes.' + handoverState.currentDetail.shift_type) || handoverState.currentDetail.shift_type) : handoverState.currentDetail.shift_type) }} {{ handoverState.currentDetail.created_by_username || handoverState.currentDetail.created_by_name || '-' }} {{ handoverState.currentDetail.leader_name || handoverState.currentDetail.leader_id }} {{ handoverState.currentDetail.department_name || handoverState.currentDetail.department_id || '-' }} {{ (window.t ? (window.t('shiftHandover.statusOptions.' + handoverState.currentDetail.status) || handoverState.currentDetail.status) : handoverState.currentDetail.status) }}

{{ (window.t ? (window.t('shiftHandover.form.mainContent') || '交接内容') : '交接内容') }}

{{ handoverState.currentDetail.main_content || '-' }}

{{ (window.t ? (window.t('shiftHandover.form.abnormalDescription') || '异常情况') : '异常情况') }}

{{ handoverState.currentDetail.abnormal_description }}

{{ (window.t ? (window.t('shiftHandover.form.pendingItems') || '待办事项') : '待办事项') }}

{{ approvalModule.currentRecord?.business_title }}
{{ (t('approvalDrawer.batch.selectedCount') || '已选 {n}').replace('{n}', approvalModule.selectedRecordIds.length) }}
{{ (t('approvalDrawer.batch.resultPartial') || '成功 {ok} 条,失败 {fail} 条').replace('{ok}', approvalModule.batchResult.succeeded).replace('{fail}', approvalModule.batchResult.failed) }}
{{ t('approvalDrawer.batch.failureList') || '失败明细' }}
{{ r.business_title || r.record_id }}
{{ r.message }}
{{ approvalModule.currentRecord.business_title }} {{ approvalModule.getBusinessTypeLabel ? approvalModule.getBusinessTypeLabel(approvalModule.currentRecord.business_type) : approvalModule.currentRecord.business_type }} {{ approvalModule.currentRecord.business_id }} {{ approvalModule.currentRecord.status === 'pending' ? (t('workorder.detail.approval.status.pending') || '审批中') : approvalModule.currentRecord.status === 'approved' ? (t('workorder.detail.approval.status.approved') || '已通过') : approvalModule.currentRecord.status === 'rejected' ? (t('workorder.detail.approval.status.rejected') || '已拒绝') : approvalModule.currentRecord.status === 'returned_to_submitter' ? (t('workorder.detail.approval.status.returnedToSubmitter') || '已退回(待修改)') : approvalModule.currentRecord.status === 'returned_to_node' ? (t('workorder.detail.approval.status.returnedToNode') || '退回重审') : approvalModule.currentRecord.status === 'cancelled' ? (t('workorder.detail.approval.status.cancelled') || '已撤销') : approvalModule.currentRecord.status }} {{ approvalModule.currentRecord.created_by_name || approvalModule.currentRecord.created_by || '-' }} {{ approvalModule.currentRecord.created_at ? new Date(approvalModule.currentRecord.created_at).toLocaleString('zh-CN') : approvalModule.currentRecord.created_at }} {{ t('workorder.detail.approval.viewWorkOrder') || '📄 查看工单详情' }} {{ t('workorder.detail.approval.viewGroupWorkOrder') || '📦 查看组合工单详情' }} {{ t('aggregateReport.actions.viewReport') || '📊 查看汇总报告' }} {{ t('quotation.actions.viewQuotation') || '📄 查看报价单' }} {{ approvalModule.currentRecord.return_reason || '-' }} {{ approvalModule.currentRecord.returned_by_name }} {{ approvalModule.currentRecord.return_count }} {{ t('workorder.detail.approval.times') || '次' }} {{ t('workorder.detail.approval.history') || '审批历史' }}
{{ t('workorder.detail.approval.loading') || '加载中...' }} {{ t('workorder.detail.approval.noSteps') || '暂无审批步骤记录' }}

{{ t('workorder.detail.approval.step') || '步骤' }} {{ step.step_number }}: {{ step.step_name }}{{ step.approve_mode === 'all' ? (t('workorder.detail.approval.countersign') || '会签') : (t('workorder.detail.approval.anySign') || '或签') }}

{{ t('workorder.detail.approval.approver') || '审批人' }}: {{ step.approver_name }}

{{ t('workorder.detail.approval.statusLabel') || '状态' }}: {{ step.status === 'pending' ? (t('workorder.detail.approval.status.pendingShort') || '待审批') : step.status === 'approved' ? (t('workorder.detail.approval.status.approved') || '已通过') : step.status === 'rejected' ? (t('workorder.detail.approval.status.rejected') || '已拒绝') : (step.status === 'returned_to_submitter' || step.status === 'returned_to_node') ? (t('workorder.detail.approval.status.returned') || '已退回') : step.status === 'cancelled' ? (t('workorder.detail.approval.status.cancelled') || '已撤销') : step.status }}

{{ t('workorder.detail.approval.comment') || '意见' }}: {{ step.comments }}

{{ new Date(step.approved_at).toLocaleString('zh-CN') }}

📭
{{ t('workorder.hierarchy.detail.noData') || '未找到组合工单数据' }}
{{ passwordModal.error }}
{{ t('workbench.homepagePreference.description') || '选择登录后默认显示的首页' }}
{{ opt.icon }}
{{ t(opt.labelKey) || opt.fallback }}
{{ t('workbench.homepagePreference.saving') || '保存中...' }}
{{ window.t ? (window.t('notification.noNotifications') || '暂无通知') : '暂无通知' }}
{{ notificationModule.getCategoryIcon(item.category) }}
{{ notificationModule.resolveI18n(item.title_key, item.title_params, item.title) || item.title }}
{{ notificationModule.resolveI18n(item.body_key, item.body_params, item.body) || item.body }}
{{ item.created_at }}
{{ window.t ? (window.t('notification.loadMore') || '加载更多') : '加载更多' }}
{{ window.t ? (window.t('notification.preferences.channels') || '通知渠道') : '通知渠道' }}
{{ window.t ? (window.t('notification.preferences.channelLabels.' + ch) || ch) : ch }}
{{ window.t ? (window.t('notification.preferences.categories') || '通知分类') : '通知分类' }}
{{ window.t ? (window.t('notification.preferences.categoryLabels.' + cat) || cat) : cat }}
{{ window.t ? (window.t('notification.preferences.quietHours') || '免打扰时段') : '免打扰时段' }}
{{ window.t ? (window.t('notification.preferences.save') || '保存设置') : '保存设置' }}
📋 {{ t('approvalDrawer.pendingLabel') || '待处理审批' }}
{{ approvalModule.pendingCount }}
{{ t('approvalDrawer.batch.selectAll') || '全选' }} {{ t('approvalDrawer.batch.clearSelection') || '清空' }} {{ (t('approvalDrawer.batch.selectedCount') || '已选 {n}').replace('{n}', approvalModule.selectedRecordIds.length) }}
{{ t('approvalDrawer.empty.pending') || '暂无待审批事项' }}
{{ t('approvalDrawer.loading') || '加载中...' }}
{{ item.business_title || t('approvalDrawer.unnamed') || '未命名审批' }}
{{ t('purchaseRequest.columns.requestId') || '申请单号' }}: {{ item.business_id }}
{{ approvalModule.getBusinessTypeLabel ? approvalModule.getBusinessTypeLabel(item.business_type) : item.business_type }} · {{ item.created_by_name || t('approvalDrawer.unknown') || '未知' }}
{{ item.status === 'pending' ? (t('approvalDrawer.status.pending') || '待审批') : item.status }}
{{ item.created_at ? new Date(item.created_at).toLocaleString() : '' }}
{{ t('approvalDrawer.empty.submitted') || '暂无发起的审批' }}
{{ t('approvalDrawer.loading') || '加载中...' }}
{{ item.business_title || t('approvalDrawer.unnamed') || '未命名审批' }}
{{ t('purchaseRequest.columns.requestId') || '申请单号' }}: {{ item.business_id }}
{{ approvalModule.getBusinessTypeLabel ? approvalModule.getBusinessTypeLabel(item.business_type) : item.business_type }}
{{ item.status === 'pending' ? (t('approvalDrawer.status.approving') || '审批中') : item.status === 'approved' ? (t('approvalDrawer.status.approved') || '已通过') : item.status === 'rejected' ? (t('approvalDrawer.status.rejected') || '已拒绝') : item.status === 'returned_to_submitter' ? (t('approvalDrawer.status.returned') || '已退回') : item.status === 'returned_to_node' ? (t('approvalDrawer.status.returnedToNode') || '退回重审') : item.status === 'cancelled' ? (t('approvalDrawer.status.cancelled') || '已撤销') : item.status }}
↩ {{ t('approvalDrawer.returnReason') || '退回原因' }}: {{ item.return_reason }}
{{ item.created_at ? new Date(item.created_at).toLocaleString() : '' }}
📋
{{ t('approvalDrawer.empty.myApproved') || '暂无已审批记录' }}
{{ t('approvalDrawer.loading') || '加载中...' }}
{{ item.business_title || t('approvalDrawer.unnamed') || '未命名审批' }}
{{ t('purchaseRequest.columns.requestId') || '申请单号' }}: {{ item.business_id }}
{{ approvalModule.getBusinessTypeLabel ? approvalModule.getBusinessTypeLabel(item.business_type) : item.business_type }} · {{ t('approvalDrawer.initiator') || '发起人' }}: {{ item.created_by_name || t('approvalDrawer.unknown') || '未知' }}
{{ item.status === 'pending' ? (t('approvalDrawer.status.approving') || '审批中') : item.status === 'approved' ? (t('approvalDrawer.status.approved') || '已通过') : (t('approvalDrawer.status.rejected') || '已拒绝') }}
{{ item.updated_at ? new Date(item.updated_at).toLocaleString() : (item.created_at ? new Date(item.created_at).toLocaleString() : '') }}
{{ t('system.approval.actions.create') }}
{{ t('system.approval.modal.empty') }}
{{ opt.label }} {{ t('system.approval.form.stepsTitle') }}
📋 {{ t('system.approval.form.stepLabel', { step: step.step }) }}
🗑️ {{ t('system.permission.common.delete') }}
{{ t('system.approval.form.stepName') }}
{{ t('system.approval.form.approverType') }}
{{ opt.label }}
{{ step.approver_type === 'role' ? t('system.approval.form.selectRole') : t('system.approval.form.selectUser') }}
{{ role.name || role.role_id }} {{ user.name || user.username }} ({{ user.username }})
💡 {{ step.approver_type === 'department_head' ? t('system.approval.form.autoDepartmentHead') : t('system.approval.form.autoLeader') }}
{{ t('system.approval.form.approveMode') }}
{{ t('system.approval.form.approveModeAny') }} {{ t('system.approval.form.approveModeAll') }}
{{ step.approve_mode === 'all' ? t('system.approval.form.approveModeAllHint') : t('system.approval.form.approveModeAnyHint') }}
{{ t('system.approval.form.addStep') }}
📷
{{ t('userExtend.uploadAvatar') }}
{{ t('userExtend.removeAvatar') }}
{{ t('system.permission.user.accountStatus') || '账户状态' }}
{{ permModule.userForm.is_active !== false ? (t('system.permission.user.activeDesc') || '账户正常,用户可以登录系统') : (t('system.permission.user.disabledDesc') || '账户已停用,用户无法选择租户登录') }}
{{ t('userExtend.workInfo') }}
{{ t('userExtend.contactInfo') }}
{{ t('userExtend.otherInfo') }}

{{ t('system.permission.modal.assignRole.description', { name: permModule.editingUser?.name, username: permModule.editingUser?.username }) }}

{{ role.name }}

{{ t('system.permission.modal.resetPassword.description', { name: permModule.editingUser?.name }) }}

{{ tpl.name }} {{ t('system.permission.modal.roleCreate.templateCount', { count: tpl.permission_count }) }} {{ dept.name }} {{ user.name }} ({{ user.username }})

{{ t('system.permission.modal.addMember.description', { name: permModule.selectedDept?.name }) }}

{{ user.name }} ({{ user.username }})
💡
{{ t('system.permission.dataRuleModal.header.title') }}
{{ t('system.permission.dataRuleModal.header.description') }}
{{ t('system.permission.dataRuleModal.header.example') }}
📝 {{ t('system.permission.dataRuleModal.sections.basicInfo') }}
🎯 {{ t('system.permission.dataRuleModal.sections.targetConfig') }}
👥 {{ t('system.permission.dataRuleModal.form.targetTypeRole') }} 👤 {{ t('system.permission.dataRuleModal.form.targetTypeUser') }}
{{ role.name }} {{ t('system.permission.role.tags.system') }}
{{ user.name?.charAt(0) || '?' }} {{ user.name }} @{{ user.username }}
🔒 {{ t('system.permission.dataRuleModal.sections.scopeConfig') }}
🔧 {{ t('system.permission.dataRuleModal.form.resource.equipment') }} 📋 {{ t('system.permission.dataRuleModal.form.resource.workorder') }} 📍 {{ t('system.permission.dataRuleModal.form.resource.location') }} ✅ {{ t('system.permission.dataRuleModal.form.resource.inspection') }} 📦 {{ t('system.permission.dataRuleModal.form.resource.sparePart') }} 📚 {{ t('system.permission.dataRuleModal.form.resource.knowledge') }} 📊 {{ t('system.permission.dataRuleModal.form.resource.aggregateReport') }} 💰 {{ t('system.permission.dataRuleModal.form.resource.quotation') }} ✍️ {{ t('system.permission.dataRuleModal.form.resource.serviceSignature') }}
💡 {{ t('system.permission.dataRuleModal.form.resourceSelectedHint', { count: permModule.dataRuleForm.resource_types.length }) }}
{{ t('system.permission.dataRuleModal.form.resourceEditHint') }}
{{ t('system.permission.dataRuleModal.scopeOption.all') }} {{ t('system.permission.dataRuleModal.scopeOption.department') }} {{ t('system.permission.dataRuleModal.scopeOption.departmentTree') }} {{ t('system.permission.dataRuleModal.scopeOption.customDepartment') }} {{ t('system.permission.dataRuleModal.scopeOption.customDepartmentTree') }} {{ t('system.permission.dataRuleModal.scopeOption.location') }} {{ t('system.permission.dataRuleModal.scopeOption.locationTree') }} {{ t('system.permission.dataRuleModal.scopeOption.equipmentType') }} {{ t('system.permission.dataRuleModal.scopeOption.equipmentTypeTree') }} {{ t('system.permission.dataRuleModal.scopeOption.customerCategory') }} {{ t('system.permission.dataRuleModal.scopeOption.customerCategoryTree') }} {{ t('system.permission.dataRuleModal.scopeOption.customer') }} {{ t('system.permission.dataRuleModal.scopeOption.customerSelf') }} {{ t('system.permission.dataRuleModal.scopeOption.warehouse') }} {{ t('system.permission.dataRuleModal.scopeOption.warehouseTree') }}
💡 {{ t('system.permission.dataRuleModal.selector.department.hintDirect') }} 💡 {{ t('system.permission.dataRuleModal.selector.department.hintTree') }}
💡 {{ t('system.permission.dataRuleModal.selector.location.hintDirect') }} 💡 {{ t('system.permission.dataRuleModal.selector.location.hintTree') }}
💡 {{ t('system.permission.dataRuleModal.selector.equipmentType.hintDirect') }} 💡 {{ t('system.permission.dataRuleModal.selector.equipmentType.hintTree') }}
💡 {{ t('system.permission.dataRuleModal.selector.customerCategory.hintDirect') }} 💡 {{ t('system.permission.dataRuleModal.selector.customerCategory.hintTree') }}
🏢 {{ customer.name }} ({{ customer.code }})
💡 {{ t('system.permission.dataRuleModal.selector.customer.hint') }}
💡 {{ t('system.permission.dataRuleModal.selector.warehouse.hintDirect') }} 💡 {{ t('system.permission.dataRuleModal.selector.warehouse.hintTree') }}
📝 {{ t('system.permission.dataRuleModal.sections.otherConfig') }}
{{ t('system.permission.dataRuleModal.form.ruleTypeGrant') }} {{ t('system.permission.dataRuleModal.form.ruleTypeRestrict') }}
{{ permModule.dataRuleForm.rule_type === 'grant' ? t('system.permission.dataRuleModal.form.ruleTypeHintGrant') : t('system.permission.dataRuleModal.form.ruleTypeHintRestrict') }}
{{ t('system.permission.dataRuleModal.buttons.cancel') }} {{ permModule.isEditingDataRule ? t('system.permission.dataRuleModal.buttons.saveEdit') : t('system.permission.dataRuleModal.buttons.create') }}
🎭 {{ t('system.permission.groupEditModal.form.targetRole') }} 👤 {{ t('system.permission.groupEditModal.form.targetUser') }} {{ role.name }} {{ user.name || user.username }} {{ opt.label }} {{ t('system.permission.dataRuleModal.scopeOption.all') }} {{ t('system.permission.dataRuleModal.scopeOption.department') }} {{ t('system.permission.dataRuleModal.scopeOption.departmentTree') }} {{ t('system.permission.dataRuleModal.scopeOption.customDepartment') }} {{ t('system.permission.dataRuleModal.scopeOption.customDepartmentTree') }} {{ t('system.permission.dataRuleModal.scopeOption.location') }} {{ t('system.permission.dataRuleModal.scopeOption.locationTree') }} {{ t('system.permission.dataRuleModal.scopeOption.equipmentType') }} {{ t('system.permission.dataRuleModal.scopeOption.equipmentTypeTree') }} {{ t('system.permission.dataRuleModal.scopeOption.customerCategory') }} {{ t('system.permission.dataRuleModal.scopeOption.customerCategoryTree') }} {{ t('system.permission.dataRuleModal.scopeOption.customer') }} {{ t('system.permission.dataRuleModal.scopeOption.customerSelf') }} {{ t('system.permission.dataRuleModal.scopeOption.warehouse') }} {{ t('system.permission.dataRuleModal.scopeOption.warehouseTree') }}
{{ t('system.permission.groupEditModal.selector.department.hintDirect') }} {{ t('system.permission.groupEditModal.selector.department.hintTree') }}
{{ t('system.permission.groupEditModal.selector.location.hintDirect') }} {{ t('system.permission.groupEditModal.selector.location.hintTree') }}
{{ t('system.permission.groupEditModal.selector.equipmentType.hintDirect') }} {{ t('system.permission.groupEditModal.selector.equipmentType.hintTree') }}
{{ t('system.permission.groupEditModal.selector.customerCategory.hintDirect') }} {{ t('system.permission.groupEditModal.selector.customerCategory.hintTree') }}
🏢 {{ customer.name }} ({{ customer.code }})
{{ t('system.permission.groupEditModal.selector.warehouse.hintDirect') }} {{ t('system.permission.groupEditModal.selector.warehouse.hintTree') }}
{{ t('system.permission.groupEditModal.form.ruleTypeGrant') }} {{ t('system.permission.groupEditModal.form.ruleTypeRestrict') }} ℹ️ {{ t('system.permission.groupEditModal.form.ruleTypeHintLabel') }}
{{ t('system.permission.groupEditModal.buttons.cancel') }} 💾 {{ t('system.permission.groupEditModal.buttons.save') }}
{{ t('inspection.template.form.inspectionType') || '📋 点检模板' }} {{ t('inspection.template.form.maintenanceType') || '🔧 维护模板' }}
{{ t('inspection.template.form.typeHint') || '点检模板用于例行点检,维护模板用于维护工单' }}
{{ t('inspection.template.form.categoryHint') || '模板分类用于对模板进行分组管理' }}
{{ t('inspection.template.form.stateDraft') || '草稿' }} {{ t('inspection.template.form.statePublished') || '已发布' }} {{ t('inspection.template.form.stateFrozen') || '冻结' }} 🛡️ {{ t('inspection.template.form.safetySection') || '安全与风险(生成工单时自动继承)' }} {{ tt(opt.labelKey) || opt.value }}
EN
JP
EN
JP
EN
JP
📋 {{ (window.t ? (window.t('inventory.alerts.thresholds.modal.selectPart') || '选择备件') : '选择备件') }} *
[{{ part.spare_part_id }}] {{ part.name }} {{ (window.t ? (window.t('inventory.alerts.thresholds.modal.currentThreshold') || '当前阈值') : '当前阈值') }}: {{ part.min_stock_qty !== null ? part.min_stock_qty : (window.t ? (window.t('inventory.alerts.thresholds.modal.notSet') || '未设置') : '未设置') }}
⚙️ {{ (window.t ? (window.t('inventory.alerts.thresholds.modal.configSection') || '阈值配置') : '阈值配置') }}
💡 {{ (window.t ? (window.t('inventory.alerts.thresholds.modal.warehouseHint') || '留空表示监控该备件的全局库存,选择仓库则只监控该仓库的库存') : '留空表示监控该备件的全局库存,选择仓库则只监控该仓库的库存') }}
💡 {{ (window.t ? (window.t('inventory.alerts.thresholds.modal.minQtyHint') || '当库存数量低于此阈值时,系统将自动生成预警') : '当库存数量低于此阈值时,系统将自动生成预警') }}
📧 {{ (window.t ? (window.t('inventory.alerts.thresholds.modal.notifySection') || '通知与启用') : '通知与启用') }}
{{ thresholdForm.enabled ? (window.t ? (window.t('inventory.alerts.thresholds.modal.enabled') || '已启用') : '已启用') : (window.t ? (window.t('inventory.alerts.thresholds.modal.disabled') || '已禁用') : '已禁用') }}
{{ (window.t ? (window.t('inventory.alerts.thresholds.modal.cancel') || '取消') : '取消') }} {{ editingThreshold ? (window.t ? (window.t('inventory.alerts.thresholds.modal.submitSave') || '保存修改') : '保存修改') : (window.t ? (window.t('inventory.alerts.thresholds.modal.submitSet') || '设置阈值') : '设置阈值') }}
导出CSV
{{ log.event_type === 'state' ? '状态' : (log.event_type === 'approval' ? '审批' : (log.event_type === 'material' ? '材料' : (log.event_type === 'attachment' ? '附件' : (log.event_type || '事件')))) }} {{ log.action }}
操作人: {{ log.operator_name || log.operator_id || '系统' }} | 时间: {{ formatDateTime(log.created_at) }}
{{ log.message }}
{{ t('workorder.materials_dialog.addMaterial')||'添加材料' }}
{{ (m.part_name || m.part_id) }} · {{ (m.quotation_meta && m.quotation_meta.quotation_code) || m.quotation_item_id }}
{{ t('workorder.materials_dialog.scopeBom')||'型号BOM' }} {{ t('workorder.materials_dialog.scopeAll')||'全部备件' }}
{{ part.name }} ({{ part.spare_part_id }}) - {{ t('workorder.materials_dialog.stock')||'库存' }}: {{ part.quantity || 0 }}
{{ t('workorder.materials_dialog.bomEmpty')||'该设备型号暂无 BOM 备件,可切换"全部备件"' }}
{{ t('workorder.materials_dialog.warehouseHint')||'入库/出库必须指定仓库或库位' }}
📷
{{ t('workorder.materials_dialog.scanHint')||'支持摄像头扫码、图片识别或 USB 扫码枪直接扫入' }}
{{ t('workorder.materials_dialog.allowAdjustHint')||'开启后,如出库数量超出当前库存,将自动调整后出库' }}
{{ costItemFormMode === 'edit' ? (t('cost.modal.editCost')||'编辑费用') : (t('cost.modal.addCost')||'添加费用') }} {{ t('cost.modal.cancelEdit')||'取消编辑' }}
{{ t('cost.modal.type')||'类型' }}
{{ t('cost.modal.typeLabor')||'人工' }} {{ t('cost.modal.typeOutsource')||'外包' }} {{ t('cost.modal.typeOther')||'其他' }}
{{ t('cost.modal.description')||'说明' }}
{{ t('cost.modal.rate')||'费率' }}
{{ r.name }} (¥{{ r.rate_per_hour }}/h)
{{ t('cost.modal.supplier')||'外包商' }}
{{ s.label }}
{{ t('cost.modal.date')||'日期' }}
{{ costItemForm.cost_type === 'labor' ? (t('cost.modal.hours')||'工时') : (t('cost.modal.quantity')||'数量') }}
{{ t('cost.modal.unitPrice')||'单价' }}
{{ t('cost.modal.amount')||'金额' }}
{{ t('cost.modal.invoiceNo')||'发票号' }}
{{ costItemFormMode === 'edit' ? (t('cost.modal.save')||'保存') : (t('cost.modal.add')||'添加') }}
{{ t('cost.modal.filterAll')||'全部' }} {{ t('cost.modal.filterLabor')||'人工' }} {{ t('cost.modal.filterOutsource')||'外包' }} {{ t('cost.modal.filterOther')||'其他' }} {{ (t('cost.modal.totalCount')||'共 {count} 条').replace('{count}', costFilteredItems.length) }}
请选择任务的执行频率(每天、每周或每月固定时间)
小时
:
分钟
显示未来 5 次任务执行的具体日期和时间,帮助您确认设置是否正确
请先选择频率和时间
取消 应用到表单