🧩 {{ t('customField.title') || '自定义字段管理' }}
{{ t('customField.showInactive') || '显示已禁用' }}
{{ t('customField.refresh') || '刷新' }}
{{ t('customField.create') || '新增字段' }}
{{ t('customField.fieldTypes.' + record.field_type) || record.field_type }}
{{ record.required ? '✓' : '—' }}
{{ record.is_active ? (t('customField.active') || '启用') : (t('customField.inactive') || '禁用') }}
{{ 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') || '保存修改' }}
translationModule.changePlatform(e.target.value)">
{{ t('i18nAdmin.platform.desktop') || 'PC 端' }}
{{ t('i18nAdmin.platform.mobile') || '移动端' }}
{{ (t('i18nAdmin.totalKeys') || '总词条') }}: {{ translationModule.totalKeys }}
{{ record.key }}
{{ record.namespace }}
{{ t('i18nAdmin.status.edited') || '已修改' }}
{{ t('i18nAdmin.status.reviewed') || '已确认' }}
{{ t('i18nAdmin.status.machine') || '机翻待审' }}
{{ t('i18nAdmin.status.missingShort') || '缺失' }}
{{ t('i18nAdmin.status.mismatchShort') || '占位符' }}
{{ t('workbench.title') || '个人工作台' }}
workbenchModule.loadMyStats(e.target.value)">
{{ t('workbench.period.week') || '本周' }}
{{ t('workbench.period.month') || '本月' }}
{{ t('workbench.period.quarter') || '本季' }}
{{ t('workbench.period.year') || '本年' }}
{{ t('workbench.shortcuts.title') || '常用功能' }}
{{ t('workbench.shortcuts.subtitle') || '点击直达页面' }}
{{ workbenchModule.state.showShortcutPicker ? (t('workbench.shortcuts.done') || '完成') : (t('workbench.shortcuts.edit') || '+ 编辑') }}
{{ t('workbench.shortcuts.empty') || '暂无快捷方式,点击右上角"+ 编辑"添加常用功能' }}
{{ page.icon }}
{{ workbenchModule.getPageLabel(page) }}
×
{{ t('workbench.shortcuts.addHint') || '点击添加到快捷方式:' }}
{{ page.icon }} {{ workbenchModule.getPageLabel(page) }}
{{ t('workbench.pendingWorkOrders') || '我的待办' }}
{ selectedMenu = 'workorder'; handleMenuClick({ key: 'workorder' }); }">{{ t('workbench.viewAll') || '查看全部' }}
{{ t('workbench.noData') || '暂无数据' }}
workbenchModule.openWorkOrderDetail(item)">
{{ item.title || item.work_order_id }}
{{ t('workbench.overdue') || '逾期' }}
{{ item.equipment_name || '-' }}
{{ item.priority || '-' }}
{{ t('workbench.recentCompleted') || '最近完成' }}
{ selectedMenu = 'workorder'; handleMenuClick({ key: 'workorder' }); }">{{ t('workbench.viewAll') || '查看全部' }}
{{ t('workbench.noData') || '暂无数据' }}
workbenchModule.openWorkOrderDetail(item)">
{{ item.title || item.work_order_id }}
{{ item.equipment_name || '-' }}
{{ t('workbench.onTime') || '准时' }}
{{ t('workbench.overdue') || '逾期' }}
{{ t('workbench.myLearning') || '我的学习' }}
{ selectedMenu = 'training-records'; handleMenuClick({ key: 'training-records' }); }">{{ t('workbench.viewAll') || '查看全部' }}
{{ t('workbench.noData') || '暂无数据' }}
workbenchModule.openTrainingRecordDetail(item)"
style="height:84px;padding:10px 12px;border:1px solid #eef0f3;border-radius:8px;background:#fff;cursor:pointer;display:flex;flex-direction:column;justify-content:space-between;transition:border-color .2s, box-shadow .2s;">
{{ 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.favorites') || '我的收藏' }}
{{ t('workbench.refreshFavorites') || '刷新' }}
{{ t('workbench.noData') || '暂无数据' }}
{{ workbenchModule.getFavTypeIcon(fav.target_type) }} {{ fav.target_title || fav.target_id }}
{{ t('workbench.favorite.targetTypes.' + fav.target_type) || fav.target_type }}
⚙️
{{ 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('cost.analysis.groupBy.equipment') || '设备别' }}
{{ t('cost.analysis.groupBy.department') || '部门别' }}
{{ t('cost.analysis.groupBy.costType') || '费用类型' }}
¥{{ (record[column.dataIndex] || 0).toFixed(2) }}
{{
record.cost_type === 'material' ? (t('cost.analysis.legend.material') || '材料') :
record.cost_type === 'labor' ? (t('cost.analysis.legend.labor') || '人工') :
record.cost_type === 'outsource' ? (t('cost.analysis.legend.outsource') || '外包') :
record.cost_type === 'other' ? (t('cost.analysis.legend.other') || '其他') :
(record.cost_type || '-')
}}
{{ Number(record[column.dataIndex] || 0).toFixed(1) }}%
{{ t('siteComparison.title') || '据点对比看板' }}
{{ t('siteComparison.refresh') || '刷新' }}
¥{{ (record[column.dataIndex] || 0).toFixed(2) }}
{{ t('equipmentCostRanking.title') || '设备别保全费排名' }}
{{ t('equipmentCostRanking.topN') || '显示前 N 名' }}:
{{ t('equipmentCostRanking.refresh') || '刷新' }}
¥{{ (record[column.dataIndex] || 0).toFixed(2) }}
{{ (window.t ? (window.t('dashboard.title') || '仪表盘') : '仪表盘') }}
{{ t('dashboard.controls.quickRangeLabel') }}
{{ 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 }}
⭐ {{ ratingStats.average_rating || 0 }}
{{ t('dashboard.ratingStats.totalRated', { count: ratingStats.total_rated || 0 }) }}
{{ t('dashboard.quickActions.emergencyRepair') }}
{{ t('dashboard.quickActions.scanReport') }}
{{ t('dashboard.quickActions.createWorkOrder') }}
{{ t('dashboard.quickActions.viewBIMModel') }}
{{ wsConnected ? t('dashboard.realtimeSensor.connected') : t('dashboard.realtimeSensor.disconnected') }}
{{ t('dashboard.realtimeSensor.connect') }}
{{ t('dashboard.realtimeSensor.disconnect') }}
{{ record.value }}
{{ record.quality }}
{{ new Date(record.timestamp).toLocaleString('zh-CN') }}
{{ record.work_order_id }}
{{ record.equipment_name }}
{{ getWorkOrderStatusText(record.status) }}
{{ record.priority }}
{{ record.created_at ? record.created_at.split('T')[0] : '' }}
{{ 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 }}
{{ record.status_display || record.status }}
{{ record.priority }}
{{ record.record_type_label }}
{{ '⭐'.repeat(Math.round(record.rating || 0)) }}
¥ {{ record[column.dataIndex] }}
{{ record[column.dataIndex] }}
{{ (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') || '筛选') : '筛选') }}
{ if (v && loadAllEquipmentForWorkOrder) loadAllEquipmentForWorkOrder(); }"
@change="handleWorkOrderQuery"
>
📝 {{ (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') || '已取消') : '已取消') }}
{ if (workOrderFilter.hierarchyRootEquipmentId) { const validIds = (filteredRootEquipmentForWorkOrderFilter || []).map(e => e.equipment_id); if (!validIds.includes(workOrderFilter.hierarchyRootEquipmentId)) { workOrderFilter.hierarchyRootEquipmentId = undefined; } } handleWorkOrderQuery(); }"
>
{{ (window.t ? (window.t('common.filter.more') || '更多筛选') : '更多筛选') }} ▼
📝 {{ (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('common.filter.title') || '筛选') : '筛选') }}
{{ (window.t ? (window.t('common.filter.collapse') || '点击折叠') : '点击折叠') }}
{{ (window.t ? (window.t('common.reset') || '重置') : '重置') }}
{{ (window.t ? (window.t('common.query') || '查询') : '查询') }}
{ workOrderFilter.hierarchyRootEquipmentId = undefined; filterWorkOrders(); }"
>
{{ plan.name }}
{ if (workOrderFilter.equipmentId) { const validIds = (filteredEquipmentForWorkOrderFilter || []).map(e => e.equipment_id); if (!validIds.includes(workOrderFilter.equipmentId)) { workOrderFilter.equipmentId = undefined; } } }"
>
{ if (v && loadAllEquipmentForWorkOrder) loadAllEquipmentForWorkOrder(); }"
>
{{ (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')) || '大修' }}
{ if (workOrderFilter.equipmentId) { const validIds = (filteredEquipmentForWorkOrderFilter || []).map(e => e.equipment_id); if (!validIds.includes(workOrderFilter.equipmentId)) { workOrderFilter.equipmentId = undefined; } } }"
>
低
中
高
紧急
{{ (window.t && window.t('workorder.filter.assignStatusOptions.assigned')) || '已分配' }}
{{ (window.t && window.t('workorder.filter.assignStatusOptions.unassigned')) || '未分配' }}
{{ (window.t && window.t('workorder.filter.showHierarchyChildrenOptions.hide')) || '隐藏组合子工单' }}
{{ (window.t && window.t('workorder.filter.showHierarchyChildrenOptions.show')) || '显示组合子工单' }}
{{ (window.t && window.t('workorder.filter.equipmentType')) || '设备类型' }} · {{ (window.t && window.t('workorder.filter.filteredByType')) || '已按类型过滤' }}
{{ (window.t && window.t('workorder.filter.customerCategory')) || '客户分类' }} · {{ (window.t && window.t('workorder.filter.filteredByCategory')) || '已按分类过滤' }}
{{ plan.name }}
{ if (workOrderFilter.hierarchyRootEquipmentId) { const validIds = (filteredRootEquipmentForWorkOrderFilter || []).map(e => e.equipment_id); if (!validIds.includes(workOrderFilter.hierarchyRootEquipmentId)) { workOrderFilter.hierarchyRootEquipmentId = undefined; } } }"
>
{ if (v && loadAllEquipmentForWorkOrder) loadAllEquipmentForWorkOrder(); }"
>
📝 {{ (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('workorder.filter.assignStatusOptions.assigned')) || '已分配' }}
{{ (window.t && window.t('workorder.filter.assignStatusOptions.unassigned')) || '未分配' }}
{ if (workOrderFilter.hierarchyRootEquipmentId) { const validIds = (filteredRootEquipmentForWorkOrderFilter || []).map(e => e.equipment_id); if (!validIds.includes(workOrderFilter.hierarchyRootEquipmentId)) { workOrderFilter.hierarchyRootEquipmentId = undefined; } } }"
>
{{ (window.t && window.t('workorder.filter.equipmentAssetCategory')) || '装备分类' }} · {{ (window.t && window.t('workorder.filter.filteredByCategory')) || '已按分类过滤' }}
{{ (window.t && window.t('workorder.filter.customerCategory')) || '客户分类' }} · {{ (window.t && window.t('workorder.filter.filteredByCategory')) || '已按分类过滤' }}
switchWorkOrderViewMode(e.target.value)"
>
{{ (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')) || '勾选组合卡片后批量分派(已派出的组合不可选)' }}
({{ group.hierarchy_group_id }}) {{ group.primary_title || '-' }}
{{ getWorkOrderTypeText ? getWorkOrderTypeText(workOrderModule.getGroupWorkOrderType(group)) : workOrderModule.getGroupWorkOrderType(group) }}
{{ workbenchModule.getFavoriteState('work_order_group', group.hierarchy_group_id).is_favorited ? '★' : '☆' }}
📅 {{ (window.t ? (window.t('workorder.list.columns.scheduledStart') || '计划开始') : '计划开始') }}: {{ group.scheduled_start || '-' }}
→
{{ (window.t ? (window.t('workorder.list.columns.scheduledEnd') || '计划完成') : '计划完成') }}: {{ group.scheduled_end || '-' }}
👤 {{ (window.t ? (window.t('workorder.list.columns.assignee') || '负责人') : '负责人') }}: {{ getGroupAssigneeDisplay(group) }}
🏢 {{ (window.t ? (window.t('workorder.list.columns.customer') || '所属客户') : '所属客户') }}: {{ group.customer_summary }}
{{ 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') || '外包' }}
自修
{{ group.outsource_supplier_name || '-' }}
-
{{ (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' }}
{{ (window.t ? (window.t('crossTenantDispatch.card.unit') || '单') : '单') }}
{{ (window.t ? (window.t('crossTenantDispatch.card.unit') || '单') : '单') }}
{{ (window.t ? (window.t('crossTenantDispatch.card.unit') || '单') : '单') }}
📦 {{ (window.t ? (window.t('crossTenantDispatch.card.batchDispatch') || '组合派单') : '组合派单') }}
{{ (window.t ? (window.t('crossTenantDispatch.card.from') || '来自') : '来自') }}: {{ dispatch.source_tenant_name }}
{{ window.t ? (window.t('crossTenantDispatch.card.workOrderCount', { count: (dispatch.work_orders?.length || 0) }) || `${dispatch.work_orders?.length || 0} 个工单`) : `${dispatch.work_orders?.length || 0} 个工单` }}
{{ (window.t ? (window.t('crossTenantDispatch.stats.pendingToAccept') || '待接受') : '待接受') }}: {{ dispatch.status_summary.pending }}
{{ (window.t ? (window.t('crossTenantDispatch.stats.accepted') || '已接受') : '已接受') }}: {{ dispatch.status_summary.accepted }}
{{ (window.t ? (window.t('crossTenantDispatch.stats.rejected') || '已拒绝') : '已拒绝') }}: {{ dispatch.status_summary.rejected }}
{{ dispatch.dispatched_at ? new Date(dispatch.dispatched_at).toLocaleString() : '' }}
{{ idx + 1 }}.
{{ wo.work_order_summary?.title || wo.source_work_order_id }}
工单编码: {{ wo.target_work_order_id || wo.source_work_order_id || '-' }}
{{ wo.work_order_summary?.equipment_name || '-' }}
{{ wo.work_order_summary?.type || '-' }}
{{ wo.work_order_summary?.priority || '-' }}
{{ getCrossTenantDispatchStatusText(wo.dispatch_status) }}
👁️ {{ (window.t ? (window.t('crossTenantDispatch.action.viewDetail') || '查看') : '查看') }}
{{ (window.t ? (window.t('crossTenantDispatch.card.dispatchNote') || '派单备注') : '派单备注') }}: {{ dispatch.dispatch_note }}
✓ {{ (window.t ? (window.t('crossTenantDispatch.action.accept') || '接受派单') : '接受派单') }} ({{ dispatch.status_summary.pending }})
✕ {{ (window.t ? (window.t('crossTenantDispatch.action.reject') || '拒绝派单') : '拒绝派单') }}
↩️ {{ (window.t ? (window.t('crossTenantDispatch.action.returnBatch') || '退回组合派单') : '退回组合派单') }}
{{ (window.t ? (window.t('crossTenantDispatch.card.from') || '来自') : '来自') }}: {{ dispatch.source_tenant_name }}
{{ getCrossTenantDispatchStatusText(dispatch.dispatch_status) }}
{{ dispatch.dispatched_at ? new Date(dispatch.dispatched_at).toLocaleString() : '' }}
→ {{ new Date(dispatch.responded_at).toLocaleString() }}
{{ dispatch.work_order_summary?.title || dispatch.source_work_order_id }}
工单编码: {{ dispatch.target_work_order_id || dispatch.source_work_order_id || '-' }}
{{ (window.t ? (window.t('crossTenantDispatch.card.type') || '类型') : '类型') }}: {{ dispatch.work_order_summary?.type || '-' }}
{{ (window.t ? (window.t('crossTenantDispatch.card.equipment') || '设备') : '设备') }}: {{ dispatch.work_order_summary?.equipment_name || '-' }}
{{ (window.t ? (window.t('crossTenantDispatch.card.priority') || '优先级') : '优先级') }}: {{ dispatch.work_order_summary?.priority || '-' }}
{{ (window.t ? (window.t('crossTenantDispatch.card.dispatchNote') || '派单备注') : '派单备注') }}: {{ dispatch.dispatch_note }}
{{ (window.t ? (window.t('crossTenantDispatch.card.rejectReason') || '拒绝原因') : '拒绝原因') }}: {{ dispatch.reject_reason }}
{{ (window.t ? (window.t('crossTenantDispatch.card.viewWorkOrder') || '查看工单') : '查看工单') }}
{{ (window.t ? (window.t('crossTenantDispatch.action.accept') || '接受派单') : '接受派单') }}
{{ (window.t ? (window.t('crossTenantDispatch.action.reject') || '拒绝派单') : '拒绝派单') }}
↩️ {{ (window.t ? (window.t('crossTenantDispatch.card.return') || '退回') : '退回') }}
{{ (window.t ? (window.t('crossTenantDispatch.card.unit') || '单') : '单') }}
{{ (window.t ? (window.t('crossTenantDispatch.card.unit') || '单') : '单') }}
{{ (window.t ? (window.t('crossTenantDispatch.card.unit') || '单') : '单') }}
{{ (window.t ? (window.t('crossTenantDispatch.card.unit') || '单') : '单') }}
📦 {{ (window.t ? (window.t('crossTenantDispatch.card.batchDispatch') || '组合派单') : '组合派单') }}
{{ (window.t ? (window.t('crossTenantDispatch.card.dispatchTo') || '派至') : '派至') }}: {{ dispatch.target_tenant_name }}
{{ window.t ? (window.t('crossTenantDispatch.card.workOrderCount', { count: (dispatch.work_orders?.length || 0) }) || `${dispatch.work_orders?.length || 0} 个工单`) : `${dispatch.work_orders?.length || 0} 个工单` }}
{{ dispatch.dispatched_at ? new Date(dispatch.dispatched_at).toLocaleString() : '' }}
{{ (window.t ? (window.t('crossTenantDispatch.stats.pendingToAccept') || '待接受') : '待接受') }}: {{ dispatch.status_summary.pending }}
{{ (window.t ? (window.t('crossTenantDispatch.stats.accepted') || '已接受') : '已接受') }}: {{ dispatch.status_summary.accepted }}
{{ (window.t ? (window.t('crossTenantDispatch.status.completed') || '已完成') : '已完成') }}: {{ dispatch.status_summary.completed }}
{{ (window.t ? (window.t('crossTenantDispatch.stats.rejected') || '已拒绝') : '已拒绝') }}: {{ dispatch.status_summary.rejected }}
{{ (window.t ? (window.t('crossTenantDispatch.status.cancelled') || '已撤回') : '已撤回') }}: {{ dispatch.status_summary.cancelled }}
{{ idx + 1 }}.
{{ wo.work_order_summary?.title || wo.source_work_order_id }}
工单编码: {{ wo.source_work_order_id || wo.target_work_order_id || '-' }}
📦 {{ wo.work_order_summary.equipment_name }}
{{ getCrossTenantDispatchStatusText(wo.dispatch_status) }}
{{ wo.work_order_summary?.priority || '-' }}
👁️ {{ (window.t ? (window.t('crossTenantDispatch.action.viewDetail') || '查看') : '查看') }}
{{ (window.t ? (window.t('crossTenantDispatch.card.dispatchNote') || '派单备注') : '派单备注') }}: {{ dispatch.dispatch_note }}
🔄 {{ (window.t ? (window.t('crossTenantDispatch.action.syncStatus') || '重新同步') : '重新同步') }}
↩️ {{ (window.t ? (window.t('crossTenantDispatch.action.cancel') || '撤回派单') : '撤回派单') }}
{{ (window.t ? (window.t('crossTenantDispatch.card.dispatchTo') || '派至') : '派至') }}: {{ dispatch.target_tenant_name }}
{{ getCrossTenantDispatchStatusText(dispatch.dispatch_status) }}
{{ dispatch.dispatched_at ? new Date(dispatch.dispatched_at).toLocaleString() : '' }}
{{ dispatch.work_order_summary?.title || dispatch.source_work_order_id }}
工单编码: {{ dispatch.source_work_order_id || dispatch.target_work_order_id || '-' }}
{{ (window.t ? (window.t('crossTenantDispatch.card.type') || '类型') : '类型') }}: {{ dispatch.work_order_summary?.type || '-' }}
{{ (window.t ? (window.t('crossTenantDispatch.card.equipment') || '设备') : '设备') }}: {{ dispatch.work_order_summary?.equipment_name || '-' }}
{{ (window.t ? (window.t('crossTenantDispatch.card.priority') || '优先级') : '优先级') }}: {{ dispatch.work_order_summary?.priority || '-' }}
{{ dispatch.return_reason ? ((window.t ? (window.t('crossTenantDispatch.card.returnReason') || '退回原因') : '退回原因') + ':') : ((window.t ? (window.t('crossTenantDispatch.card.rejectReason') || '拒绝原因') : '拒绝原因') + ':') }}
{{ dispatch.return_reason || dispatch.reject_reason }}
{{ (window.t ? (window.t('crossTenantDispatch.card.viewWorkOrder') || '查看工单') : '查看工单') }}
{{ (window.t ? (window.t('crossTenantDispatch.card.cancelDispatch') || '撤回派单') : '撤回派单') }}
🔧 {{ tt('workorder.form.sections.equipmentAndCategory') || '设备与分类' }}
{ if (workOrderForm.equipment_id) { workOrderForm.equipment_id = ''; workOrderModule.checkEquipmentChildren(''); } }"
style="width: 100%;"
>
{
// 切换类型时清空已选设备
if (workOrderForm.equipment_id) {
workOrderForm.equipment_id = '';
workOrderModule.checkEquipmentChildren('');
}
}"
style="width: 100%;"
>
{
// 客户切换:若已选设备不属于当前客户(按生效客户判断,子机构继承父装备),则清空设备以避免数据错配
if (workOrderForm.equipment_id) {
const grouped = groupedEquipmentForWorkOrder || { equipmentGroup: [], structureMechanismGroup: [], mechanismGroup: [] };
const pool = [
...(grouped.equipmentGroup || []),
...(grouped.structureMechanismGroup || []),
...(grouped.mechanismGroup || []),
...(allEquipmentForWorkOrder || [])
];
const eq = pool.find(e => e.equipment_id === workOrderForm.equipment_id);
const effCust = eq && (eq.effective_customer_id || eq.customer_id);
if (eq && val && effCust && effCust !== val) {
workOrderForm.equipment_id = '';
workOrderModule.checkEquipmentChildren('');
}
}
}"
style="width:100%"
>
{
// 切换工具维护↔其他类型时,清空已选设备和类型筛选
const isToolNow = val === 'TOOL_MAINTENANCE';
const wasEquipment = workOrderForm.equipment_id;
if (wasEquipment) {
const eq = (allEquipmentForWorkOrder || []).find(e => e.equipment_id === wasEquipment);
const cat = eq?.asset_category || 'equipment';
if ((isToolNow && cat !== 'tool') || (!isToolNow && cat === 'tool')) {
workOrderForm.equipment_id = '';
}
}
if (isToolNow) { workOrderEquipmentTypeFilter = ''; workOrderEquipmentCategoryFilter = null; }
}"
>
📝 {{ 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') || '工具维护' }}
{
if (!v) return;
// 若未全量加载(被分页同步只塞了一页),强制全量拉取,避免搜索框只能在当前页内匹配
const list = allEquipmentForWorkOrder || [];
const needLoad = list.length === 0 || workOrderEquipmentPagination.hasMore;
if (needLoad && !workOrderEquipmentPagination.loading) {
loadAllEquipmentForWorkOrder();
}
}"
@search="(kw) => {
if (!kw) return;
if (workOrderEquipmentPagination.hasMore && !workOrderEquipmentPagination.loading) {
loadAllEquipmentForWorkOrder();
}
}"
@change="(val) => {
// 数据联动:当选择设备时从最新缓存中同步所属部门和客户(含父装备继承)
if (val) {
const grouped = groupedEquipmentForWorkOrder || { equipmentGroup: [], structureMechanismGroup: [], mechanismGroup: [] };
const pool = [
...(grouped.equipmentGroup || []),
...(grouped.structureMechanismGroup || []),
...(grouped.mechanismGroup || []),
...(allEquipmentForWorkOrder || [])
];
const eq = pool.find(e => e.equipment_id === val);
if (eq) {
workOrderForm.department_id = eq.department_id || eq.effective_department_id || null;
workOrderForm.customer_id = eq.customer_id || eq.effective_customer_id || null;
}
}
// 检查是否有子设备(装备/组合工单)
workOrderModule.checkEquipmentChildren(val);
}"
style="flex: 1;"
>
{{ formatEquipmentOptionLabel(eq, { showCustomer: !workOrderForm.customer_id }) }}
{{ formatEquipmentOptionLabel(eq, { showParent: true, showCustomer: !workOrderForm.customer_id }) }}
{{ formatEquipmentOptionLabel(eq, { showCustomer: !workOrderForm.customer_id }) }}
{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_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') || '低' }}
workOrderModule.loadAssigneeOptions && workOrderModule.loadAssigneeOptions()" @change="() => workOrderModule.checkWorkOrderFormQualification && workOrderModule.checkWorkOrderFormQualification()">
{{ u.name || u.username }} ({{ u.user_id }})
{{ tt('workorder.assign.onDuty') || '当班' }}
{{ workOrderModule.assigneeFilter?.filteredByOnDuty ? (tt('workorder.assign.onDutyOnlyHint') || '已按当前当班人员筛选') : (tt('workorder.assign.showingAllHint') || '正在显示全部可见人员') }}
workOrderModule.setAssigneeShowAll && workOrderModule.setAssigneeShowAll(e.target.checked)">
{{ tt('workorder.assign.showAll') || '显示全部' }}
{{ tt('workorder.assign.nonDutyWarning') || '所选负责人当前不在该部门/时间的已发布排班中,系统允许保存,请确认现场安排。' }}
{{ workOrderModule.workOrderFormQualificationWarning?.value }}
🏗️ {{ tt('workorder.hierarchy.title') || '组合工单' }}
{{ tt('workorder.hierarchy.autoDetected') || '自动检测到子设备' }}
{{ tt('workorder.hierarchy.switchHint') || '为该设备及其子设备批量创建关联工单' }}
workOrderModule.toggleHierarchySelectAll(e.target.checked)">
{{ tt('workorder.hierarchy.selectAll') || '全选' }}
{{ tt('workorder.hierarchy.selectedCount') || '已选' }}: {{ workOrderModule.hierarchySelectedEquipmentIds?.value?.length || 0 }} / {{ (workOrderModule.hierarchyChildrenPreview?.value?.length || 0) + 1 }}
{{ tt('common.loading') || '加载中...' }}
workOrderModule.toggleHierarchyEquipment(workOrderForm.equipment_id)"
>
🔧 {{ workOrderForm.equipment_id }}
{{ tt('workorder.hierarchy.rootDevice') || '根设备' }}
workOrderModule.toggleHierarchyEquipment(child.equipment_id)"
>
{{ child.indent ? '└─ ' : '' }}{{ child.name || child.equipment_id }}
({{ child.equipment_id }})
L{{ child.level }}
💡 {{ tt('workorder.hierarchy.hint') || '将为每台选中的设备自动创建独立工单,并关联为同一组合工单组' }}
📝 {{ tt('workorder.form.sections.workOrderContent') || '工单内容' }}
📅 {{ tt('workorder.form.sections.timeSchedule') || '时间安排' }}
🛡️ {{ tt('workorder.safety.title') || '安全与风险' }}
ℹ️
{{ tt('workorder.safety.fromTemplate') || '检查类工单的安全与风险信息将从关联点检模板自动继承,无需手动填写。' }}
●
{{ tt(opt.labelKey) || opt.value }}
EN
JP
EN
JP
EN
JP
🏢 {{ tt('workorder.detail.labels.isOutsourced') || '外包信息' }}
{{ tt('workorder.detail.outsource.yes') || '外包' }}
{{ tt('workorder.detail.outsource.no') || '自修' }}
▼
🏢{{ tt('workorder.form.placeholders.outsourceTag') || '外包' }}
{{ tt('workorder.form.placeholders.selfRepairTag') || '自修' }}
{{ tt('workorder.form.placeholders.supplierPrefix') || '供应商:' }}{{ (supplierSelectOptions || []).find(s => s.value === workOrderForm.outsource_supplier_id)?.label || workOrderForm.outsource_supplier_id }}
💡 {{ tt('workorder.form.placeholders.outsourceEditHint') || '请在工单详情中修改外包设定' }}
{ if (!checked) workOrderForm.outsource_supplier_id = null; }">
📎 {{ tt('workorder.form.sections.additionalInfo') || '附加信息' }}
{{ tt('workorder.form.placeholders.selectFile') || '选择文件' }}
{{ (tt('workorder.form.placeholders.filesSelected') || '已选择 {count} 个文件').replace('{count}', newWorkOrderPendingFiles.length) }}
💬 {{ tt('workorder.form.sections.historyComments') || '历史备注' }}
{{ (workOrderComments || []).length }}
{{ tt('common.refresh') || '刷新' }}
{{ comment.user_name || '系统' }}
{{ getCommentTypeText(comment.comment_type) }}
{{ formatCommentTime(comment.created_at) }}
{{ comment.content }}
{{ tt('workorder.form.placeholders.noComments') || '暂无备注记录' }}
{ workOrderDetailModalVisible = v; if (v && selectedWorkOrder) workbenchModule.checkCurrentFav('work_order', selectedWorkOrder.work_order_id); }"
:width="960"
:z-index="2100"
:wrap-class-name="'workorder-detail-modal-wrap'"
:mask-class-name="'workorder-detail-modal-mask'"
:body-style="{ padding: '16px 24px', maxHeight: '75vh', overflowY: 'auto' }"
>
📋 {{ (window.t ? (window.t('workorder.detail.title') || '工单详情') : '工单详情') }}
{{ getWorkOrderStatusText ? getWorkOrderStatusText(selectedWorkOrder.status) : selectedWorkOrder.status }}
{{ workbenchModule.getFavStarText(workbenchModule.getFavoriteState('work_order', selectedWorkOrder.work_order_id).is_favorited) }}
(viewWorkOrderLogs && selectedWorkOrder) ? viewWorkOrderLogs(selectedWorkOrder) : null">
{{ (window.t ? (window.t('workorder.detail.actions.timeline') || '时间线') : '时间线') }}
{{ (window.t ? (window.t('workorder.detail.actions.viewInBim') || '在BIM中查看') : '在BIM中查看') }}
{{ (window.t ? (window.t('workorder.detail.actions.materials') || '材料/备件') : '材料/备件') }}
{{ (window.t ? (window.t('workorder.detail.actions.cost') || '费用') : '费用') }}
{{ tt('sop.link.viewSop') || '查看SOP' }}
{{ t('crossTenantDispatch.modal.dispatchToAgent') || '派单给代理店' }}
{{ (window.t ? (window.t('workorder.detail.actions.close') || '关闭') : '关闭') }}
📝 {{ (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') || '外包标识' }}
{ if (!checked) detailOutsourceForm.outsource_supplier_id = null; }">
{{ 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' }}
{{ tt('workorder.safety.requiredApprovals') || '所需申请' }}
{{ tt('workorder.safety.affectedSystems') || '影响范围' }}
⏳
{{ (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') || '取消') : '取消') }}
退回源租户
{
if(await cancelSingleApproval(selectedWorkOrder)) {
workOrderDetailModalVisible = false;
window.setTimeout(() => { if(window.destroyConfirmModal) window.destroyConfirmModal(null); }, 500);
}
}"
>
{{ (window.t ? (window.t('workorder.detail.actions.cancelApproval') || '撤销审批') : '撤销审批') }}
{
if (selectedWorkOrder.approval_status === 'returned_to_submitter') {
let record = approvalModule.inlineApprovalRecord;
if (!record || !record.record_id) {
try {
record = await window.AppAPI.request('/api/v1/approvals/by-business/work_order_create/' + selectedWorkOrder.work_order_id);
} catch(e) { console.error('查询审批记录失败:', e); }
}
if (!record || !record.record_id) {
window.antd?.message?.error('找不到该工单的审批记录');
return;
}
if(await approvalModule.resubmitReturnedApproval(record)) {
workOrderDetailModalVisible = false;
window.setTimeout(() => { if(window.destroyConfirmModal) window.destroyConfirmModal(null); }, 500);
}
} else {
if(await resubmitSingleApproval(selectedWorkOrder)) {
workOrderDetailModalVisible = false;
window.setTimeout(() => { if(window.destroyConfirmModal) window.destroyConfirmModal(null); }, 500);
}
}
}"
>
{{ (window.t ? (window.t('workorder.detail.actions.resubmitApproval') || '🔄 重新提交审批') : '🔄 重新提交审批') }}
{{ (window.t ? (window.t('workorder.detail.actions.exportReport') || '导出报表') : '导出报表') }}
{ domEvent?.preventDefault?.(); domEvent?.stopPropagation?.(); if (reportModule && reportModule.exportReport) { reportModule.exportReport('work_order', selectedWorkOrder.work_order_id, null, key); } else { window.antd?.message?.error((window.t ? (window.t('workorder.detail.messages.reportModuleMissing') || '报表模块未加载') : '报表模块未加载')); } }">
{{ (window.t ? (window.t('workorder.detail.actions.exportPdf') || '📄 导出 PDF') : '📄 导出 PDF') }}
{{ (window.t ? (window.t('workorder.detail.actions.exportExcel') || '📊 导出 Excel') : '📊 导出 Excel') }}
{{ (window.t ? (window.t('workorder.detail.actions.exportWord') || '📝 导出 Word') : '📝 导出 Word') }}
{{ (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') || '客户评价') : '客户评价') }}
{{ star <= selectedWorkOrder.rating ? '⭐' : '☆' }}
{{ selectedWorkOrder.rating }}{{ (window.t ? (window.t('workorder.detail.rating.points') || '分') : '分') }}
"{{ selectedWorkOrder.feedback }}"
{{ (window.t ? (window.t('workorder.detail.rating.ratedAt') || '评价时间') : '评价时间') }}: {{ selectedWorkOrder.rated_at }}
{{ (window.t ? (window.t('workorder.detail.rating.prompt') || '请为本次服务评分:') : '请为本次服务评分:') }}
{{ star <= workOrderRatingForm.rating ? '⭐' : '☆' }}
{{ (window.t ? (window.t('workorder.detail.rating.submit') || '提交评价') : '提交评价') }}
{{ (window.t ? (window.t('workorder.detail.rating.waiting') || '等待客户评价中...') : '等待客户评价中...') }}
📎 {{ (window.t ? (window.t('workorder.detail.sections.attachments') || '附件') : '附件') }}
{{ (selectedWorkOrder.attachments || []).length }}
loadAttachmentsForRecord(selectedWorkOrder)">
{{ (window.t ? (window.t('workorder.detail.actions.refresh') || '刷新') : '刷新') }}
📄
{{ item.filename || (window.t ? (window.t('workorder.detail.attachments.defaultName') || '附件') : '附件') }}
{{ (window.t ? (window.t('workorder.detail.attachments.empty') || '暂无附件') : '暂无附件') }}
📸 {{ (window.t ? (window.t('workorder.detail.sections.snapshots') || 'BIM截图') : 'BIM截图') }}
{{ (workOrderSnapshots || []).length }}
{{ (window.t ? (window.t('workorder.detail.actions.refresh') || '刷新') : '刷新') }}
{{ snapshot.title || (window.t ? (window.t('workorder.detail.snapshots.untitled') || '未命名') : '未命名') }}
{{ snapshot.created_at }}
{{ (window.t ? (window.t('workorder.detail.snapshots.empty') || '暂无截图') : '暂无截图') }}
⚠️ 额外发现
{{ (workOrderFindings || []).length }}
刷新
{{ getSeverityText(finding.severity) }}
{{ getFindingStatusText(finding.status) }}
{{ formatCommentTime(finding.created_at) }}
{{ finding.description }}
暂无额外发现
💬 {{ (window.t ? (window.t('workorder.detail.sections.comments') || '备注记录') : '备注记录') }}
{{ (workOrderComments || []).length }}
{{ (window.t ? (window.t('workorder.detail.actions.refresh') || '刷新') : '刷新') }}
{{ comment.user_name || (window.t ? (window.t('workorder.detail.comments.system') || '系统') : '系统') }}
{{ getCommentTypeText(comment.comment_type) }}
{{ formatCommentTime(comment.created_at) }}
{{ comment.content }}
{{ (window.t ? (window.t('workorder.detail.comments.empty') || '暂无备注') : '暂无备注') }}
{{ item.source_type === 'pdf' ? '📕' : '📄' }}
{{ item.source_title || item.knowledge_title || item.source_id }}
{{ item.source_type === 'pdf' ? (tt('sop.sources.pdf') || 'PDF文档') : (tt('sop.sources.knowledge') || '知识库文档') }}
{{ tt('sop.link.mandatory') || '必看' }}
{{ tt('sop.link.optional') || '可选' }}
{{ item.source_subtitle || item.knowledge_category }}
{{ tt('sop.actions.openSource') || '打开原文' }}
{{ tt('sop.match.empty') || '无匹配的SOP文档' }}
💡 {{ item.description }}
{{ item.source_type === 'pdf' ? '📕' : '📄' }}
{{ item.source_title || item.knowledge_title || item.source_id }}
{{ item.source_type === 'pdf' ? (tt('sop.sources.pdf') || 'PDF文档') : (tt('sop.sources.knowledge') || '知识库文档') }}
{{ tt('sop.link.mandatory') || '必看' }}
{{ tt('sop.link.optional') || '可选' }}
{{ item.source_subtitle || item.knowledge_category }}
{{ tt('sop.actions.openSource') || '打开原文' }}
💡 {{ item.description }}
checkBatchAssignQualification && checkBatchAssignQualification()"
>
{{ user.name || user.username }} ({{ user.user_id }})
{{ tt('workorder.assign.onDuty') || '当班' }}
{{ workOrderModule.assigneeFilter?.filteredByOnDuty ? (tt('workorder.assign.onDutyOnlyHint') || '已按当前当班人员筛选') : (tt('workorder.assign.showingAllHint') || '正在显示全部可见人员') }}
loadBatchAssignAssigneeOptions && loadBatchAssignAssigneeOptions(e.target.checked)">
{{ tt('workorder.assign.showAll') || '显示全部' }}
{{ tt('workorder.assign.nonDutyWarning') || '所选负责人当前不在该部门/时间的已发布排班中,系统允许保存,请确认现场安排。' }}
{{ batchAssignQualificationWarning }}
loadBatchAssignAssigneeOptions && loadBatchAssignAssigneeOptions(workOrderModule.assigneeFilter?.showAll)"
>
组合工单作为整体维护外包状态,修改后会同步到组内全部子工单。
{ batchAssignForm._outsourceChanged = true; if (!checked) batchAssignForm.outsource_supplier_id = null; }"
>
{{ 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 }}
setHierarchyMaterialPartScope(e.target.value)">
{{ t('workorder.materials_dialog.scopeBom')||'型号BOM' }}
{{ t('workorder.materials_dialog.scopeAll')||'全部备件' }}
{
const parts = hierarchyMaterialPartOptions || [];
const found = parts.find(p => p.spare_part_id === val);
hierarchyMaterialForm.selectedPart = found || null;
if (found?.storage_location_id) {
hierarchyMaterialForm.storage_location_id = found.storage_location_id;
}
}"
:get-popup-container="trigger => trigger?.closest?.('.ant-modal-wrap') || document.body"
>
{{ 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') || '全部子机构汇总(只读),如需添加领料请选择具体子机构工单' }}
{{ record._source_wo_name || '-' }}
¥{{ record.unit_cost || 0 }}
📋 {{ t('workorder.materials_dialog.fromQuotation') || '报价反写' }}{{ (record.quotation_meta && record.quotation_meta.quotation_code) ? (' ' + record.quotation_meta.quotation_code) : '' }}
{{ t('workorder.materials_dialog.manualEntry') || '手动录入' }}
{{ record.created_at ? new Date(record.created_at).toLocaleString('zh-CN') : '-' }}
{{ t('common.delete') || '删除' }}
{{ t('common.delete') || '删除' }}
{{ t('common.delete') || '删除' }}
{{ 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 }}
{{ 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') || '全部子机构汇总(只读),如需添加费用请选择具体子机构工单' }}
{{ record._source_wo_name || '-' }}
{{ t('cost.modal.typeLabor')||'人工' }}
{{ t('cost.modal.typeOutsource')||'外包' }}
{{ t('cost.modal.typeOther')||'其他' }}
⚡自动{{ record.description }}
¥{{ (record.unit_price||0).toFixed(2) }}
¥{{ (record.amount||0).toFixed(2) }}
{{ t('cost.modal.viewOnly') || '只读' }}
设置默认评分(可逐个调整)
共 {{ 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('crossTenantDispatch.modal.returnWarning') || '退回后,工单将返还给源租户,本租户中的工单副本将被删除。') : '退回后,工单将返还给源租户,本租户中的工单副本将被删除。') }}
{{ (window.t ? (window.t('crossTenantDispatch.modal.returnBatchWarning') || '退回后,该组合派单中所有已接受的工单将返还给源租户,本租户中的工单副本将被删除。') : '退回后,该组合派单中所有已接受的工单将返还给源租户,本租户中的工单副本将被删除。') }}
{{ (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') || '已选中,点击清除') : '已选中,点击清除') }}
equipmentModule?.onSelectLeftTree && equipmentModule.onSelectLeftTree(keys, info)"
@expand="(keys) => equipmentModule?.onExpandLeftTree && equipmentModule.onExpandLeftTree(keys)"
:show-line="{ showLeafIcon: false }"
:blockNode="true"
:default-expand-all="true"
>
{{ title }}
{{ total_equipment_count || equipment_count }}
0
{ if (selectedEquipmentForTree !== 'all') { selectedEquipmentForTree = 'all'; handleEquipmentTreeChange('all'); } }"
>
{{ (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') || '查询') : '查询') }}
🔍 {{ (window.t ? (window.t('equipment.filter.title') || '查询条件') : '查询条件') }}
{{ (window.t ? (window.t('common.filter.collapse') || '点击折叠') : '点击折叠') }}
{{ (window.t ? (window.t('common.reset') || '重置') : '重置') }}
{{ (window.t ? (window.t('common.refresh') || '刷新') : '刷新') }}
{{ (window.t ? (window.t('common.query') || '查询') : '查询') }}
{
if (val) {
equipmentModule && equipmentModule.selectedCategoryKeys && (equipmentModule.selectedCategoryKeys.value = [val]);
} else {
equipmentModule && equipmentModule.selectedCategoryKeys && (equipmentModule.selectedCategoryKeys.value = []);
}
}"
>
{
if (val) {
equipmentModule && equipmentModule.selectedTypeKeys && (equipmentModule.selectedTypeKeys.value = [val]);
} else {
equipmentModule && equipmentModule.selectedTypeKeys && (equipmentModule.selectedTypeKeys.value = []);
}
}"
>
{{ 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.list.title') || '设备列表') : '设备列表') }}
({{ equipmentListData.length }})
{{ (window.t ? (window.t('equipment.flatMode') || '展平模式(高级)') : '展平模式(高级)') }}
{{ (window.t ? (window.t('equipment.actions.import') || '导入') : '导入') }}
{{ (window.t ? (window.t('equipment.actions.export') || '导出') : '导出') }}
handleExportEquipment(key)">
{{ (window.t ? (window.t('equipment.actions.exportCsv') || '导出 CSV') : '导出 CSV') }}
{{ (window.t ? (window.t('equipment.actions.exportJson') || '导出 JSON') : '导出 JSON') }}
{{ (window.t ? (window.t('equipment.actions.exportPdf') || '导出 PDF 台账') : '导出 PDF 台账') }}
{{ (window.t ? (window.t('equipment.actions.create') || '新建设备') : '新建设备') }}
{{ (window.t ? (window.t('common.refresh') || '刷新') : '刷新') }}
{{ (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') || '清除') : '清除') }}
{{ getStatusText(record.status) }}
{{ formatOEE(record.oee) }}
{{ (window.t ? (window.t('equipment.actions.view') || '查看') : '查看') }}
{{ (window.t ? (window.t('equipment.actions.edit') || '编辑') : '编辑') }}
{{ (window.t ? (window.t('equipment.actions.maintenance') || '维护') : '维护') }}
{{ (window.t ? (window.t('equipment.actions.delete') || '删除') : '删除') }}
{{ (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('common.cancel') || '取消') : '取消') }}
{{ (window.t ? (window.t('common.ok') || '确定') : '确定') }}
📋 {{ (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') || '子机构件') : '子机构件') }}
onCategoryChange(newEquipmentForm, v)"
:getPopupContainer="trigger => trigger.parentNode"
>
📍 {{ (window.t ? (window.t('equipment.form.sections.locationOwnership') || '位置与归属') : '位置与归属') }}
保存后按当前周期运行数据自动计算 OEE,创建时不会把这里的值写入设备档案。
📅 {{ (window.t ? (window.t('equipment.form.sections.timeInfo') || '时间信息') : '时间信息') }}
🔒 {{ (window.t ? (window.t('equipment.specialEquipment.title') || '特种设备强检计划') : '特种设备强检计划') }}
newEquipmentForm.is_special_equipment = val ? 1 : 0"
size="small"
>
{{ (window.t ? (window.t('equipment.specialEquipment.types.pressure_vessel') || '压力容器') : '压力容器') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.crane') || '起重机械') : '起重机械') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.elevator') || '电梯') : '电梯') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.boiler') || '锅炉') : '锅炉') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.pressure_pipeline') || '压力管道') : '压力管道') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.amusement_ride') || '游乐设施') : '游乐设施') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.passenger_ropeway') || '客运索道') : '客运索道') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.special_vehicle') || '场(厂)内专用机动车辆') : '场(厂)内专用机动车辆') }}
🏷️ {{ (window.t ? (window.t('equipment.parameters.typeAttrs') || '类型属性') : '类型属性') }}
{{ equipmentModule.getSchemaFieldLabel(sf) }}({{ sf.unit }}) *
{ const r = equipmentModule.getSchemaParamRow(newEquipmentForm, sf.key); if (r) r.value = v; }">
{ const r = equipmentModule.getSchemaParamRow(newEquipmentForm, sf.key); if (r) r.value = v; }">
{ const r = equipmentModule.getSchemaParamRow(newEquipmentForm, sf.key); if (r) r.value = v; }"
:get-popup-container="trigger => trigger?.closest?.('.ant-modal-wrap') || document.body">
{ const r = equipmentModule.getSchemaParamRow(newEquipmentForm, sf.key); if (r) r.value = v; }"
:get-popup-container="trigger => trigger?.closest?.('.ant-modal-wrap') || document.body">
{ const r = equipmentModule.getSchemaParamRow(newEquipmentForm, sf.key); if (r) r.value = v; }"
:get-popup-container="trigger => trigger?.closest?.('.ant-modal-wrap') || document.body">
{ const r = equipmentModule.getSchemaParamRow(newEquipmentForm, sf.key); if (r) r.value = v; }">
⚙️ {{ (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') || '附加信息') : '附加信息') }}
{{ label }}
{{ (window.t ? (window.t('equipment.form.imageSupportHint') || '支持 JPG/PNG/GIF,大小不超过5MB') : '支持 JPG/PNG/GIF,大小不超过5MB') }}
{{ (window.t ? (window.t('common.cancel') || '取消') : '取消') }}
{{ (window.t ? (window.t('common.ok') || '确定') : '确定') }}
📋 {{ (window.t ? (window.t('equipment.form.sections.basicInfo') || '基本信息') : '基本信息') }}
🔖
{{ (window.t ? (window.t('equipment.isComponent.root') || '根设备(装备)') : '根设备(装备)') }}
{{ (window.t ? (window.t('equipment.isComponent.component') || '子机构件') : '子机构件') }}
onCategoryChange(editEquipmentForm, v)"
:getPopupContainer="trigger => trigger.parentNode"
>
📍 {{ (window.t ? (window.t('equipment.form.sections.locationOwnership') || '位置与归属') : '位置与归属') }}
这里展示的是当前周期计算值,编辑保存不会覆盖 OEE。
📅 {{ (window.t ? (window.t('equipment.form.sections.timeInfo') || '时间信息') : '时间信息') }}
🔒 {{ (window.t ? (window.t('equipment.specialEquipment.title') || '特种设备强检计划') : '特种设备强检计划') }}
editEquipmentForm.is_special_equipment = val ? 1 : 0"
size="small"
>
{{ (window.t ? (window.t('equipment.specialEquipment.types.pressure_vessel') || '压力容器') : '压力容器') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.crane') || '起重机械') : '起重机械') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.elevator') || '电梯') : '电梯') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.boiler') || '锅炉') : '锅炉') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.pressure_pipeline') || '压力管道') : '压力管道') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.amusement_ride') || '游乐设施') : '游乐设施') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.passenger_ropeway') || '客运索道') : '客运索道') }}
{{ (window.t ? (window.t('equipment.specialEquipment.types.special_vehicle') || '场(厂)内专用机动车辆') : '场(厂)内专用机动车辆') }}
🏷️ {{ (window.t ? (window.t('equipment.parameters.typeAttrs') || '类型属性') : '类型属性') }}
{{ equipmentModule.getSchemaFieldLabel(sf) }}({{ sf.unit }}) *
{ const r = equipmentModule.getSchemaParamRow(editEquipmentForm, sf.key); if (r) r.value = v; }">
{ const r = equipmentModule.getSchemaParamRow(editEquipmentForm, sf.key); if (r) r.value = v; }">
{ const r = equipmentModule.getSchemaParamRow(editEquipmentForm, sf.key); if (r) r.value = v; }"
:get-popup-container="trigger => trigger?.closest?.('.ant-modal-wrap') || document.body">
{ const r = equipmentModule.getSchemaParamRow(editEquipmentForm, sf.key); if (r) r.value = v; }"
:get-popup-container="trigger => trigger?.closest?.('.ant-modal-wrap') || document.body">
{ const r = equipmentModule.getSchemaParamRow(editEquipmentForm, sf.key); if (r) r.value = v; }"
:get-popup-container="trigger => trigger?.closest?.('.ant-modal-wrap') || document.body">
{ const r = equipmentModule.getSchemaParamRow(editEquipmentForm, sf.key); if (r) r.value = v; }">
⚙️ {{ (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') || '附加信息') : '附加信息') }}
{{ label }}
{{ (window.t ? (window.t('equipment.form.imageSupportHint') || '支持 JPG/PNG/GIF,大小不超过5MB') : '支持 JPG/PNG/GIF,大小不超过5MB') }}
{ equipmentDetailModalVisible = v; if (v && selectedEquipment) workbenchModule.checkCurrentFav('equipment', selectedEquipment.equipment_id); }"
:width="800"
:footer="null"
:z-index="1000"
:body-style="{ padding: '16px 24px', maxHeight: '70vh', overflowY: 'auto' }"
@cancel="handleEquipmentDetailModalCancel"
>
← {{ (window.t ? (window.t('equipment.detail.back') || '返回上级') : '返回上级') }}
{{ (window.t ? (window.t('equipment.detail.title') || '设备详情') : '设备详情') }}
{{ (window.t ? (window.t('equipment.isComponent.root') || '装备') : '装备') }}
{{ (window.t ? (window.t('equipment.isComponent.component') || '子机构件') : '子机构件') }}
{{ workbenchModule.getFavStarText(workbenchModule.getFavoriteState('equipment', selectedEquipment.equipment_id).is_favorited) }}
{{ 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 || '-' }}
{{ tag }}
{{ (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 || '-' }}
{{ (window.t ? (window.t('equipment.specialEquipment.isSpecial') || '特种设备') : '特种设备') }}
{{ selectedEquipment.special_equipment_type ? (window.t ? (window.t('equipment.specialEquipment.types.' + selectedEquipment.special_equipment_type) || selectedEquipment.special_equipment_type) : selectedEquipment.special_equipment_type) : '-' }}
{{ selectedEquipment.mandatory_inspection_cycle ?? '-' }}
{{ selectedEquipment.last_mandatory_inspection || '-' }}
{{ selectedEquipment.next_mandatory_inspection || '-' }}
{{ selectedEquipment.inspection_certificate_no || '-' }}
{{ selectedEquipment.certificate_expiry || '-' }}
{{ equipmentModule?.getMainParamLabel ? equipmentModule.getMainParamLabel(p.key) : p.key }}: {{ p.value }}{{ equipmentModule?.getMainParamUnit && equipmentModule.getMainParamUnit(p.key) ? ' ' + equipmentModule.getMainParamUnit(p.key) : '' }}
-
{{ group.label }}
{{ item.label }}
:
{{ item.value }}
-
{{ sp.name }}{{ sp.part_no ? ` (${sp.part_no})` : '' }}
← 备件关联
-
{{ 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') || '绿色=新增,灰色=跳过。点击「确认创建」处理。') : '绿色=新增,灰色=跳过。点击「确认创建」处理。') }}
equipmentMapModule.onScopeChange(e?.target?.value)"
>
{{ (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.locate.preview.equipment') || '设备') : '设备') }}:
{{ getLocalizedEquipmentName(equipmentMapModule.selectedEquipmentPreview.value) }}
({{ equipmentMapModule.selectedEquipmentPreview.value?.equipment_id }})
{{ (window.t ? (window.t('equipmentMap.locate.preview.status') || '状态') : '状态') }}:
{{ equipmentMapModule.resolveStatus(equipmentMapModule.selectedEquipmentPreview.value?.status) }}
{{ (window.t ? (window.t('equipmentMap.locate.preview.location') || '位置') : '位置') }}:
{{ equipmentMapModule.selectedEquipmentPreview.value?.location }}
{{ (window.t ? (window.t('equipmentMap.locate.preview.coordinates') || '当前坐标') : '当前坐标') }}:
{{ equipmentMapModule.selectedEquipmentPreview.value?.gps_longitude }},
{{ equipmentMapModule.selectedEquipmentPreview.value?.gps_latitude }}
📍 {{ (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') : '设备层级' }}
equipmentMapModule.onScopeChange(e?.target?.value)"
button-style="solid"
size="small"
>
{{ (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') || '未知') : '未知') }}
equipmentMapModule.switchLayer(e.target.value)"
button-style="solid"
>
{{ (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') || '设备地图定位') : '设备地图定位') }}
{{ item.label }}
{{ equipmentMapModule.stats[item.key] || 0 }}
{{ (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.addressResolving') || '正在解析...') : '正在解析...') }}
{{ equipmentMapModule.selectedEquipment.value?.coordinateAddress || equipmentMapModule.formatCoordinateDisplay(equipmentMapModule.selectedEquipment.value?.coordinates) }}
👁️ {{ (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') }}
{{ bimFilteredCount }}个
/{{ bimTotalCount }}
{{ bimEquipmentPagination.loading ? t('bim.viewer.loading') : t('bim.viewer.controls.refresh_view') }}
{{ t('bim.viewer.view_mode') }}
switchViewMode(e.target.value)"
size="small"
button-style="solid"
>
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') }}
{
try {
if (handleEquipmentFilterChange) {
handleEquipmentFilterChange(value);
} else {
console.warn('⚠️ handleEquipmentFilterChange不可用,使用备用函数');
handleEquipmentFilterChangeBackup(value);
}
} catch (error) {
console.error('❌ 设备选择处理异常:', error);
handleEquipmentFilterChangeBackup(value);
}
}"
style="flex: 1; min-width: 120px;"
size="small"
:placeholder="t('bim.viewer.select_equipment_placeholder')"
allow-clear
show-search
:filter-option="(input, option) => {
const kw = `${input || ''}`.toLowerCase().trim();
if (!kw) return true;
const label = `${option.label || ''}`.toLowerCase();
const value = `${option.value || ''}`.toLowerCase();
const equipmentId = `${option.equipmentId || option['equipment-id'] || ''}`.toLowerCase();
const equipmentName = `${option.equipmentName || option['equipment-name'] || ''}`.toLowerCase();
return label.includes(kw) || value.includes(kw) || equipmentId.includes(kw) || equipmentName.includes(kw);
}"
option-label-prop="label"
>
{{ 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.controls.grid') }}
{{ t('bim.viewer.controls.axes') }}
{{ t('bim.viewer.controls.wireframe') }}
{{ t('bim.viewer.controls.shadows') }}
{{ t('bim.viewer.controls.auto_rotate') }}
{{ t('bim.viewer.controls.show_2d_devices') }}
{{ t('bim.viewer.controls.show_3d_models') }}
相机
刷新
重置
截图
测量
测量距离
测量角度
取消测量
清除全部
{
const run = async () => {
try {
if (window.bimModule && typeof window.bimModule.deleteLatestMeasurement === 'function') {
const ok = await window.bimModule.deleteLatestMeasurement();
if (ok) window.antd?.message?.success('已删除最后一条');
return;
}
if (typeof deleteLatestMeasurement === 'function') {
const ok = await deleteLatestMeasurement();
if (ok) window.antd?.message?.success('已删除最后一条');
return;
}
} catch (e) {
window.antd?.message?.error('删除失败');
}
};
run();
}"
>
删除最后一条
保存测量
{
window.antd?.message?.info('正在加载历史记录...');
if (typeof loadAndRenderMeasurementHistory === 'function') {
loadAndRenderMeasurementHistory(undefined, { clearExisting: true });
} else if (window.bimModule && window.bimModule.loadAndRenderMeasurementHistory) {
window.bimModule.loadAndRenderMeasurementHistory(undefined, { clearExisting: true });
}
}"
>
历史记录
✅ {{ 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') }}
📁 当前版本
loadNodes(v)"
:allowClear="false"
option-label-prop="label"
>
{{ v.name || v.version_id }}
{{ v.version_id }}
已发布
当前
+ 新建
发布
取消发布
setActiveVersion(currentVersion)"
:disabled="!currentVersion || !(getVersionById(currentVersion)?.is_published) || getVersionById(currentVersion)?.is_active"
>设为当前
🌳 节点操作
➕ 添加根节点
➕ 添加子节点
({{ selectedNode.title || selectedNode.name || '已选' }})
💡 当前版本已发布(只读),请新建版本后编辑
💡 在右侧树中点击节点后可添加子节点
{{ v.version_id }}
⇄
{{ v.version_id }}
structureModule && structureModule.diffVersions && structureModule.diffVersions()"
>对比
✅ 两个版本完全相同,无差异
🌳 节点变化
➕ 新增 {{ (structureModule.diffResultData?.value?.nodes?.added_keys||[]).length }} 个
➖ 删除 {{ (structureModule.diffResultData?.value?.nodes?.removed_keys||[]).length }} 个
↔️ 移动 {{ (structureModule.diffResultData?.value?.nodes?.moved||[]).length }} 个
✏️ 修改 {{ (structureModule.diffResultData?.value?.nodes?.changed||[]).length }} 个
新增节点:
{{ (structureModule.diffResultData?.value?.nodes?.added_keys||[]).slice(0, 5).join(', ') }}
... 等{{ (structureModule.diffResultData?.value?.nodes?.added_keys||[]).length }}个
删除节点:
{{ (structureModule.diffResultData?.value?.nodes?.removed_keys||[]).slice(0, 5).join(', ') }}
... 等{{ (structureModule.diffResultData?.value?.nodes?.removed_keys||[]).length }}个
🔗 设备映射变化
➕ 新增映射 {{ (structureModule.diffResultData?.value?.mappings?.added||[]).length }} 个
➖ 移除映射 {{ (structureModule.diffResultData?.value?.mappings?.removed||[]).length }} 个
选择两个版本后点击"对比"查看差异
🌳 设备结构树
{{ structureNodes.length }} 节点
🔄
📂
{ try { focusNodeInBIM(selectedNode.id); } catch(_) { window.antd?.message?.warning('BIM聚焦不可用'); } }">
📍 BIM
{ const node = (info && info.node && (info.node.dataRef || info.node)) || null; setSelectedNode(node); }"
>
{{ title }}
{{ (dataRef && dataRef.id) || id }}
· 设备: {{ (dataRef.display_equipment_id || dataRef.equipment_id) }}
✏️
{ try { focusNodeInBIM((dataRef && dataRef.id) || id); } catch(_) { window.antd?.message?.warning('BIM聚焦不可用'); } }">
📍
🗑️
🌳
{{ 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') || '切换到结构编辑器') : '切换到结构编辑器') }}
{{ v.name || v.version_id }}
{{ v.version_id }}
{{ (window.t ? (window.t('structure.common.published') || '已发布') : '已发布') }}
{{ v.created_at }}
{ selectedMenu = 'structure-editor'; loadNodes(v.version_id); }">{{ (window.t ? (window.t('structure.versionsPage.editStructure') || '编辑结构') : '编辑结构') }}
{ showVersionModal = true; structureModule.versionFormModal.copy_from_version = v.version_id; }">{{ (window.t ? (window.t('structure.versionsPage.copyAsNew') || '复制为新版本') : '复制为新版本') }}
{{ (window.t ? (window.t('structure.versionsPanel.publish') || '发布') : '发布') }}
{{ (window.t ? (window.t('structure.versionsPanel.unpublish') || '取消发布') : '取消发布') }}
setActiveVersion(v.version_id)"
>{{ (window.t ? (window.t('structure.versionsPanel.setActive') || '设为当前') : '设为当前') }}
{{ node.name }} ({{ node.id }})
{
if (!v) return;
try {
let page = 1;
const pageSize = 200;
let total = Infinity;
const all = [];
while ((page - 1) * pageSize < total) {
const res = await window.AppAPI.equipmentAPI.getList({ page, page_size: pageSize, sort_by: 'created_at', order: 'desc', include_components: true });
const items = Array.isArray(res?.items) ? res.items : (Array.isArray(res?.data) ? res.data : (Array.isArray(res) ? res : []));
const t = typeof res?.total === 'number' ? res.total : ((page - 1) * pageSize + (items?.length || 0));
total = t;
if (Array.isArray(items) && items.length) { all.push(...items); }
if (!items || items.length < pageSize) break;
page += 1;
}
equipmentList.splice(0, equipmentList.length, ...all);
} catch(e) { console.warn('加载设备失败', e); }
}"
:getPopupContainer="() => document.body"
:dropdown-style="{ zIndex: 10000 }"
>
{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
{{ v.name || v.version_id }}
{{ (window.t ? (window.t('structure.common.publishedParen') || '(已发布)') : '(已发布)') }}
支持粘贴 JSON 或选择 CSV 文件(模板与导出格式一致)
{{ (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') || '筛选') : '筛选') }}
{
if (typeof onEquipmentDropdownOpen === 'function') onEquipmentDropdownOpen(v);
if (!v) return;
try {
let page = 1;
const pageSize = 200;
let total = Infinity;
const all = [];
while ((page - 1) * pageSize < total) {
const res = await window.AppAPI.equipmentAPI.getList({ page, page_size: pageSize, sort_by: 'equipment_id', order: 'asc' });
const items = Array.isArray(res?.items) ? res.items : (Array.isArray(res?.data) ? res.data : (Array.isArray(res) ? res : []));
const t = typeof res?.total === 'number' ? res.total : ((page - 1) * pageSize + (items?.length || 0));
total = t;
if (Array.isArray(items) && items.length) { all.push(...items); }
if (!items || items.length < pageSize) break;
page += 1;
}
equipmentListForSpare.splice(0, equipmentListForSpare.length, ...all);
} catch(e) { console.warn('加载设备失败', e); }
}"
:not-found-content="equipmentListForSpare.length === 0 ? (window.t ? (window.t('equipment.list.empty') || '暂无设备数据,请先添加设备') : '暂无设备数据,请先添加设备') : (window.t ? (window.t('common.search') || '搜索') : '搜索')"
:loading="loading.equipmentList"
>
{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
{{ (window.t ? (window.t('inventory.sparePart.messages.noEquipmentData') || '暂无设备数据') : '暂无设备数据') }}
{{ (window.t ? (window.t('inventory.sparePart.messages.addEquipmentFirst') || '请先在设备管理中添加设备') : '请先在设备管理中添加设备') }}
{ if (v && (!storageLocationFilterTreeOptions || storageLocationFilterTreeOptions.length === 0)) loadStorageLocationFilterTreeOptions(); }"
>
{{ (window.t ? (window.t('inventory.sparePart.filters.listTitle') || '备件清单筛选') : '备件清单筛选') }}
{ if (v && (!sparePartLocationTreeOptions || sparePartLocationTreeOptions.length === 0)) loadSparePartLocationTreeOptions(); }"
>
{{ (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.refresh') || '刷新') : '刷新') }}
sparePartCategoryModule.onCategoryExpand((keys || []).filter(k => k !== '__all_spare_parts__'))">
{{ title }}
{{ code }}
{{ getI18nText(name_i18n, name || title) }}
{ if(key === 'stock-by-location') { if(typeof reloadStockByLocation === 'function') reloadStockByLocation(); else loadAllStockByLocation(); } }">
{{ (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') || '刷新') : '刷新') }}
{{ record.total_qty || 0 }}
{{ (window.t ? (window.t('common.table.showTotal', { total: pagination.spareParts.total }) || ('共 ' + pagination.spareParts.total + ' 条记录')) : ('共 ' + pagination.spareParts.total + ' 条记录')) }}
¥{{ (record.unit_price || 0).toFixed(2) }}
¥{{ (record.cost_price || 0).toFixed(2) }}
{{ (window.t ? (window.t('inventory.sparePart.actions.edit') || '编辑') : '编辑') }}
{{ (window.t ? (window.t('inventory.sparePart.actions.stockOperation') || '库存操作') : '库存操作') }}
{{ (window.t ? (window.t('inventory.sparePart.actions.delete') || '删除') : '删除') }}
📦 {{ (window.t ? (window.t('inventory.sparePart.sections.basicInfo') || '基本信息') : '基本信息') }}
📝
{{ (window.t ? (window.t('inventory.sparePart.form.partNoLabel') || '物料编号') : '物料编号') }}
ⓘ
🏷️
{{ (window.t ? (window.t('inventory.sparePart.form.idLabel') || '备件ID') : '备件ID') }}
ⓘ
{ if (v && (!supplierOptionsForSparePart || supplierOptionsForSparePart.length === 0)) loadSupplierOptionsForSparePart(); }"
style="width: 100%"
>
📍
{ if (v && (!storageLocationFilterTreeOptions || storageLocationFilterTreeOptions.length === 0)) loadStorageLocationFilterTreeOptions(); }"
style="width: 100%"
>
🏠
💡 {{ (window.t ? (window.t('inventory.sparePart.form.storageLocationHint') || '仅作为默认仓库展示,不参与库存数量计算与权限控制') : '仅作为默认仓库展示,不参与库存数量计算与权限控制') }}
{
if (typeof onEquipmentDropdownOpen === 'function') onEquipmentDropdownOpen(v);
if (!v) return;
try {
let page = 1;
const pageSize = 200;
let total = Infinity;
const all = [];
while ((page - 1) * pageSize < total) {
const res = await window.AppAPI.equipmentAPI.getList({ page, page_size: pageSize, sort_by: 'equipment_id', order: 'asc' });
const items = Array.isArray(res?.items) ? res.items : (Array.isArray(res?.data) ? res.data : (Array.isArray(res) ? res : []));
const t = typeof res?.total === 'number' ? res.total : ((page - 1) * pageSize + (items?.length || 0));
total = t;
if (Array.isArray(items) && items.length) { all.push(...items); }
if (!items || items.length < pageSize) break;
page += 1;
}
equipmentListForSpare.splice(0, equipmentListForSpare.length, ...all);
} catch(e) { console.warn('加载设备失败', e); }
}"
:not-found-content="equipmentListForSpare.length === 0 ? (window.t ? (window.t('equipment.list.empty') || '暂无设备数据,请先添加设备') : '暂无设备数据,请先添加设备') : (window.t ? (window.t('common.search') || '搜索') : '搜索')"
:loading="loading.equipmentList"
>
{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
{{ (window.t ? (window.t('inventory.sparePart.messages.noEquipmentData') || '暂无设备数据') : '暂无设备数据') }}
{{ (window.t ? (window.t('inventory.sparePart.messages.addEquipmentFirst') || '请先在设备管理中添加设备') : '请先在设备管理中添加设备') }}
🏢
💡 {{ (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.form.minStockLabel') || '最小库存') : '最小库存') }}
⚠️
{{ (window.t ? (window.t('inventory.sparePart.form.safetyStockLabel') || '安全库存') : '安全库存') }}
💡
📝 {{ (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') }}
{ if (e.target.value === 'in' && currentSparePart?.supplier_id) { stockForm.supplier_id = currentSparePart.supplier_id; } else if (e.target.value !== 'in') { stockForm.supplier_id = null; } }">
📥 {{ 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.stockModal.unitCostWithUnit') }}
{{ t('inventory.costAdjust.costChange') || '成本变动' }}
¥{{ (currentSparePart?.current_cost || currentSparePart?.cost_price || 0).toFixed(2) }}
→ ¥{{ Number(stockForm.new_cost).toFixed(2) }}
💡 {{ t('inventory.costAdjust.impactHint') || '库存价值变动' }}: ¥{{ ((currentSparePart?.current_cost || currentSparePart?.cost_price || 0) * (currentSparePart?.quantity || 0)).toFixed(2) }} → ¥{{ (stockForm.new_cost * (currentSparePart?.quantity || 0)).toFixed(2) }}
{{ t('inventory.transaction.newModal.scanHint') || '支持摄像头扫码、图片识别或 USB 扫码枪直接扫入' }}
{ if (v && (!supplierOptionsForSparePart || supplierOptionsForSparePart.length === 0)) loadSupplierOptionsForSparePart(); }"
>
✓ {{ 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('sparePartCategory.treeTitle') || '备件分类') : '备件分类') }}
sparePartCategoryModule.onCategoryExpand((keys || []).filter(k => k !== '__all_transaction_parts__'))">
{{ title }}
{{ title }}
{{ (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('common.table.showTotal', { total: pagination.transactions.total }) || ('共 ' + pagination.transactions.total + ' 条记录')) : ('共 ' + pagination.transactions.total + ' 条记录')) }}
{{ getTransactionTypeText(record.type) }}
{{ formatQuantity(record.type, record.quantity) }}
¥{{ (record.unit_cost || 0).toFixed(2) }}
¥{{ ((record.quantity || 0) * (record.unit_cost || 0)).toFixed(2) }}
{{ formatDateTime(record.created_at) }}
{{ (window.t ? (window.t('inventory.alerts.panel.setThreshold') || '设置阈值') : '设置阈值') }}
💡 {{ (window.t ? (window.t('inventory.alerts.panel.tipsTitle') || '操作提示') : '操作提示') }}
{{ (window.t ? (window.t('inventory.alerts.panel.tipsSetThreshold') || '点击"设置阈值"按钮为备件设置库存预警阈值') : '点击"设置阈值"按钮为备件设置库存预警阈值') }}
refreshAlertsData && refreshAlertsData()" :loading="inventoryModule?.loading?.alerts || false" block>
{{ (window.t ? (window.t('inventory.alerts.panel.refresh') || '刷新预警') : '刷新预警') }}
{{ (window.t ? (window.t('inventory.alerts.panel.filters') || '筛选条件') : '筛选条件') }}
filterAlerts && filterAlerts()"
>
{{ (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') || '全部') : '全部') }}
filterAlerts && filterAlerts()"
>
{{ (window.t ? (window.t('inventory.alerts.severity.critical') || '严重') : '严重') }}
{{ (window.t ? (window.t('inventory.alerts.severity.medium') || '中等') : '中等') }}
{{ (window.t ? (window.t('inventory.alerts.severity.low') || '轻微') : '轻微') }}
filterAlerts && filterAlerts()"
>
{{ part.name }} ({{ part.spare_part_id || part.value }})
{{ (window.t ? (window.t('inventory.alerts.list.badge') || '预警记录') : '预警记录') }}
{{ (window.t ? (window.t('inventory.alerts.loading') || '正在加载预警数据...') : '正在加载预警数据...') }}
{{ (window.t ? (window.t('inventory.alerts.thresholds.total', { count: thresholds.length }) || ('共 ' + thresholds.length + ' 个阈值')) : ('共 ' + thresholds.length + ' 个阈值')) }}
{{ (window.t ? (window.t('inventory.alerts.thresholds.edit') || '编辑') : '编辑') }}
{{ (window.t ? (window.t('inventory.alerts.thresholds.delete') || '删除') : '删除') }}
{{ 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') || '新建盘点' }}
{{ getSparePartInventoryStatusText(record.status) }}
{{ getSparePartInventoryScopeText(record.scope_type) }}:{{ record.scope_value_display || record.scope_value }}
¥{{ (((record.surplus_amount || 0) - (record.deficit_amount || 0)) || 0).toFixed(2) }}
{{ getSparePartInventoryScopeText('all') }}
{{ getSparePartInventoryScopeText('storage_location') }}
{{ getSparePartInventoryScopeText('equipment') }}
{{ eq.name || eq.equipment_id }}
{{ 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') || '新增盘盈行' }}
{{ record.location_full_path || record.location_name || record.storage_location_id }}
{{ getSparePartInventoryLiveDifference(record).toFixed(2).replace(/\.00$/, '') }}
{{ getSparePartInventoryResultText(record.result) }}
{{ 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 }}
{{ record.location_full_path || record.location_name || record.storage_location_id }}
{{ getSparePartInventoryResultText(record.result) }}
{{ 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') || '当前无带生成模板的规则。请先编辑规则并填写“生成模板”字段。' }}
💡 {{ 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 || '生成失败' }}
{{ barcodeRuleModule.getCategoryLabel(record.category) }}
{{ record.barcode_type || '-' }}
{{ record.example || record.sample || '-' }}
{{ record.priority }}
📋 {{ 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.onSelectCategory(keys, info)"
:show-line="{ showLeafIcon: false }"
default-expand-all>
{{ code }}
{{ getI18nText(name_i18n, title) }}
{{ item_count }}
{{ categoryModule.selectedCategory.value.code }}
{{ getI18nText(categoryModule.selectedCategory.value.name_i18n, categoryModule.selectedCategory.value.name) }}
{{ categoryModule.selectedCategory.value.level }}
{{ categoryModule.selectedCategory.value.sort_order }}
{{ categoryModule.getEquipmentTypeName(categoryModule.selectedCategory.value.equipment_type_id) }}
通用分类
{{ categoryModule.selectedCategory.value.is_active ? '启用' : '禁用' }}
{{ categoryModule.selectedCategory.value.description || '-' }}
{{ categoryModule.selectedCategory.value.children_count || 0 }}
{{ categoryModule.selectedCategory.value.items_count || 0 }}
该分类下的点检项
(含子分类,共 {{ categoryModule.itemsPagination?.total || 0 }} 项)
categoryModule.handleItemsTableChange(pagination)">
{{ getI18nText(record.title_i18n, record.title) }}
{{ record.category_code }}
|
{{ getI18nText(record.category_name_i18n, record.category_name) }}
未分类
{{ record.type }}
{{ tag }}
+{{ record.tags.length - 2 }}
-
📂
{{ categoryModule.isEdit?.value ? '修改点检分类' : '创建新分类' }}
{{ categoryModule.isEdit?.value ? '更新分类的基本信息和层级关系' : '添加一个新的点检分类节点到分类树中' }}
🔗
层级关系
父分类
ⓘ
📁
关联设备类型
ⓘ
⚙️
* 为必填项
取消
{{ categoryModule.isEdit?.value ? '保存修改' : '创建分类' }}
包含子分类的点检项
预计将包含 {{ categoryModule.previewItemsCount?.value || 0 }} 个点检项
{{ t('inspection.templateCategory.title') || '模板分类管理' }}
{{ t('inspection.templateCategory.subtitle') || '管理点检模板的分类,支持业务类型和设备类型关联' }}
刷新
新增分类
templateCategoryModule.onSelectCategory(keys, info)"
:show-line="{ showLeafIcon: false }"
default-expand-all>
{{ code }}
{{ getI18nText(name_i18n, title) }}
{{ template_count }}
{{ templateCategoryModule?.getBusinessTypeLabel ? templateCategoryModule.getBusinessTypeLabel(business_type) : business_type }}
{{ templateCategoryModule.selectedCategory.value?.code }}
{{ getI18nText(templateCategoryModule.selectedCategory.value?.name_i18n, templateCategoryModule.selectedCategory.value?.name) }}
{{ templateCategoryModule.getBusinessTypeLabel(templateCategoryModule.selectedCategory.value?.business_type) }}
{{ templateCategoryModule.selectedCategory.value?.level }}
{{ templateCategoryModule.getEquipmentTypeName(templateCategoryModule.selectedCategory.value?.equipment_type_id) }}
通用分类
{{ templateCategoryModule.selectedCategory.value?.is_active ? '启用' : '禁用' }}
{{ templateCategoryModule.selectedCategory.value?.description || '-' }}
该分类下的点检模板
(含子分类,共 {{ templateCategoryModule.templatesPagination?.total ?? (templateCategoryModule.categoryTemplates?.value?.length || 0) }} 个)
templateCategoryModule.onTemplatesTableChange(pagination)">
{{ record.version_state === 'published' ? '已发布' : (record.version_state === 'draft' ? '草稿' : '已冻结') }}
📁
{{ templateCategoryModule.isEdit?.value ? '修改模板分类' : '创建新模板分类' }}
{{ templateCategoryModule.isEdit?.value ? '更新模板分类的基本信息和关联设置' : '添加一个新的模板分类节点' }}
🔗
关联设置
父分类
ⓘ
关联设备类型
ⓘ
默认点检项分类
ⓘ
* 为必填项
取消
{{ templateCategoryModule.isEdit?.value ? '保存修改' : '创建分类' }}
{{ (window.t ? window.t('inspection.item.title') : '点检题库') }}
{{ code }}
{{ getI18nText(name_i18n, title) }}
0
{{ tag }}
显示禁用项
清除筛选
{{ (window.t ? window.t('common.refresh') : '刷新') }}
导出
+
新建点检项目
当前分类:{{ selectedItemCategoryName || '未分类' }}
共 {{ inspectionItems?.length || 0 }} 条
{{ record.code }}
{{ getI18nText(record.title_i18n, record.title) }}
{{ record.category_code }}
{{ getI18nText(record.category_name_i18n, record.category_name) }}
未分类
{{ tag }}
+{{ record.tags.length - 3 }}
-
{{ { text: '文本', number: '数值', boolean: '是否', select: '选择', image: '图片', signature: '签名' }[record.type] || record.type }}
{{ record.required ? '是' : '否' }}
范围: {{ record.rules?.min ?? '-∞' }} ~ {{ record.rules?.max ?? '+∞' }}
{{ record.rules.uom }}
未设置
最大{{ record.rules.maxLength }}字
未设置
合格值: {{ record.rules.passWhen ? '是' : '否' }}
未设置
{{ record.rules.options.length }}个选项
未设置
-
{{ record.is_active !== false ? '启用' : '禁用' }}
编辑
删除
基本信息
中
EN
JP
文本
数值
是/否
选择
图片
签名
分类与标签
⚠️ 原分类编码 "{{ itemEditForm.category_code }}" 未关联,请重新选择
{{ tag }}
检查标准
{{ label || value }}
规则配置
%
超出 [min,max] 但仍在 ±此百分比内 → 判定为「磨损」(橙色),超出则「需更换」(红色)
用于数值录入时显示
字符数
选择"是"为合格
选择"否"为合格
不判定
提示:每行一个选项,保存时自动解析
{{ itemEditForm.type === 'photo' ? '图片类型' : itemEditForm.type === 'signature' ? '签名类型' : '此类型' }}暂无额外规则配置
基本信息
中
EN
JP
文本
数值
是/否
选择
图片
签名
分类与标签
{{ cat.code }} - {{ cat.name }}
{{ tag }}
检查标准
{{ label || value }}
{{ (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.listTitle') || '模板列表' }}
{{ t('inspection.template.filters.all') || '全部' }}
{{ t('inspection.template.filters.draft') || '草稿' }}
{{ t('inspection.template.filters.published') || '已发布' }}
{{ t('inspection.template.filters.frozen') || '冻结' }}
{{ record.name || record.id }}
{{ t('inspection.template.templateLibrary.builtinBadge') || '内置' }}
{{ record.id }}
{{ record.category === 'maintenance' ? (t('inspection.template.type.maintenance') || '维护') : (t('inspection.template.type.inspection') || '点检') }}
{{ record.template_category_name }}
-
{{ getTemplateStatusMeta(record.version_state).label }}
{{ record.version_no || '1.0' }}
{{ t('inspection.template.actions.edit') || '编辑' }}
{{ t('inspection.template.actions.publish') || '发布' }}
{{ t('inspection.template.actions.freeze') || '冻结' }}
{{ t('inspection.template.actions.unfreeze') || '解冻' }}
{{ t('inspection.template.actions.configure') || '配置' }}
{{ t('inspection.template.actions.delete') || '删除' }}
{{ t('inspection.template.actions.edit') || '编辑' }}
{{ t('inspection.template.actions.publish') || '发布' }}
{{ t('inspection.template.actions.delete') || '删除' }}
{{ 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') || '未选择') }}
▼
{{ group.category_code }}
{{ getI18nText(group.category_name_i18n, group.category_name) }}
{{ group.items.length }}
{{ record.code || record.item_id }}
{{ getI18nText(record.title_i18n, record.title) }}
{{ record.code || record.item_id }}
{{ getTypeLabel(record.type) }}
{{ record.required ? (t('inspection.item.yesNo.yes') || '是') : (t('inspection.item.yesNo.no') || '否') }}
{{ t('inspection.template.templateItems.rules.range') || '范围:' }} {{ record.rules?.min ?? '-∞' }} ~ {{ record.rules?.max ?? '+∞' }}
{{ record.rules.uom }}
{{ t('inspection.template.templateItems.rules.notSet') || '未设置' }}
{{ t('inspection.template.templateItems.rules.maxChars', { n: record.rules.maxLength }) || ('最大' + record.rules.maxLength + '字') }}
{{ t('inspection.template.templateItems.rules.notSet') || '未设置' }}
{{ t('inspection.template.templateItems.rules.passValue') || '合格值:' }} {{ record.rules.passWhen ? (t('inspection.item.yesNo.yes') || '是') : (t('inspection.item.yesNo.no') || '否') }}
{{ t('inspection.template.templateItems.rules.notSet') || '未设置' }}
-
{{ t('inspection.template.templateItems.rules.min') || '最小值' }}
{{ t('inspection.template.templateItems.rules.max') || '最大值' }}
{{ t('inspection.template.templateItems.rules.decimals') || '小数位' }}
{{ t('inspection.template.templateItems.rules.unit') || '单位' }}
{{ t('inspection.template.templateItems.rules.maxLength') || '最大长度' }}
{{ t('inspection.template.templateItems.rules.passCondition') || '合格条件' }}
{{ t('inspection.template.templateItems.rules.noQuickConfig') || '此类型暂无快捷规则配置' }}
{{ t('common.buttons.ok') || '确定' }}
{{ t('inspection.template.actions.remove') || '移除' }}
{{ t('inspection.template.actions.bindEquipment') || '绑定' }}
{{ t('inspection.template.actions.refreshBindings') || '刷新' }}
{{ t('inspection.template.bindingForm.boundEquipment') || '已绑定设备' }}
{{ templateBindings?.length || 0 }} {{ t('inspection.template.bindingForm.boundEquipmentUnit') || '台' }}
{{ b.equipment_id }}
{{ t('inspection.template.actions.unbind') || '解绑' }}
{{ t('inspection.template.bindingForm.noBindings') || '暂无绑定设备' }}
{{ t('inspection.template.actions.copyTemplate') || '复制' }}
{{ t('inspection.template.form.sourceTemplateId') || '源模板' }}:
{{ t('inspection.template.form.newTemplateName') || '新模板名称' }}:
{{ t('inspection.template.actions.compare') || '对比' }}
{{ t('inspection.template.form.compareTemplateA') || '模板A' }}:
{{ t('inspection.template.form.compareTemplateB') || '模板B' }}:
{{ item.title || (t('inspection.template.diff.noTitle') || '(无标题)') }}{{ item.code || item.item_id }}
{{ item.title || (t('inspection.template.diff.noTitle') || '(无标题)') }}{{ item.code || item.item_id }}
{{ 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 秒)...' }}
{{ inspectionModule.aiProposal.value.template_name }}
{{ t('workorder.safety.riskLevels.' + inspectionModule.aiProposal.value.risk_level) || inspectionModule.aiProposal.value.risk_level }}
{{ inspectionModule.aiProposal.value.description }}
⚠️ {{ inspectionModule.aiProposal.value.safety_notes }}
{{ record.title }}
{{ t('inspection.template.templateLibrary.aiReusedBadge') || '复用题库' }}
{{ record.code }}
{{ record.default_standard || '-' }}
({{ record.rules.min }} ~ {{ record.rules.max }} {{ record.rules.uom || record.uom || '' }})
{{ t('inspection.template.templateLibrary.aiDraftHint') || 'AI 提案保存后为「草稿」,需人工审核发布后方可编排点检计划' }}
{{ t('inspection.template.templateLibrary.aiSave') || '保存为草稿模板' }}
{{ inspectionModule.templateLibraryPreview.value.description }}
{{ tpl.name }}
{{ (t('inspection.template.templateLibrary.itemsCount') || '点检项') }} {{ tpl.items_count }}
{{ t('workorder.safety.riskLevels.' + tpl.risk_level) || tpl.risk_level }}
⚠️ {{ tpl.safety_notes }}
{{ t('inspection.template.templateLibrary.importHint') || '导入后模板为已发布状态,可直接编排点检计划;重复导入不会重复创建。' }}
{{ 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.listTitle') }}
{{ t('inspection.plan.actions.newPlan') }}
{{ t('common.actions.refresh') }}
{{ record.id }}
{{ record.name }}
🏢 {{ record.department_name }}
-
🌳
{{ t('inspection.plan.scope.hierarchy') }}
🔧
{{ t('inspection.plan.scope.tool') }}
📦
{{ t('inspection.plan.scope.equipment') }}
{{ record.cron_or_simple_rule && record.cron_or_simple_rule.cron ? formatCronReadable(record.cron_or_simple_rule.cron) : '未设置' }}
{{ record.last_triggered_at.replace('T', ' ').substring(0, 16) }}
-
{{ record.next_trigger_at.replace('T', ' ').substring(0, 16) }}
-
handleTogglePlanEnabled(record)"
:checked-children="t('inspection.plan.form.enabledOn')"
:un-checked-children="t('inspection.plan.form.enabledOff')"
:disabled="!hasPermission('inspection:plan:enable')"
/>
{{ t('inspection.plan.actions.edit') || '编辑' }}
{{ t('inspection.plan.actions.generate') || '生成' }}
{{ t('common.actions.delete') || '删除' }}
{ if (inspectionModule?.planModalVisible) inspectionModule.planModalVisible.value = val; }"
@cancel="() => { if (inspectionModule?.planModalVisible) inspectionModule.planModalVisible.value = false; }"
>
{{ 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') }}
{ planForm.template_id = ''; }"
>
📁
{{ title }}
{{ templateCount }}
📄
{{ t('inspection.plan.form.cron') || '执行周期' }}
{{ cronReadableText || t('inspection.plan.form.cronClickHint') }}
{ planForm.equipment_ids = []; planForm.root_equipment_id = ''; }"
>
🏢
{ planForm.equipment_ids = []; }"
style="width: 100%;"
>
{{ t('inspection.plan.form.equipmentScope') }}
{
if (!v) return;
// 设备范围选项来自 filteredEquipmentForInspectionPlan(allEquipmentForWorkOrder),
// 未全量加载时(如刷新后直接进入点检管理,或被设备管理分页数据部分填充),
// 展开下拉时兜底触发全量加载
try {
if (typeof loadAllEquipmentForWorkOrder === 'function'
&& !(allEquipmentForWorkOrderFullyLoaded && allEquipmentForWorkOrderFullyLoaded.value)) {
loadAllEquipmentForWorkOrder();
}
} catch(e) { console.warn('加载设备失败', e); }
}"
>
📦
{{ label }}
📦
{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
{{ t('inspection.plan.form.toolSelection') }}
{
if (!v) return;
await loadPlanToolOptions();
}"
>
🔧
{{ label }}
🔧
{{ tl.name }}{{ tl.asset_number ? ' (' + tl.asset_number + ')' : '' }}
{{ t('inspection.plan.hierarchy.title') }}
{ planForm.root_equipment_ids = []; }"
style="width: 100%;"
>
{
if (!v) return;
// 确保根装备源已加载(equipment_structures ∪ equipment_structure_nodes 的根)
try {
const roots = (typeof rootEquipmentForWorkOrder !== 'undefined') ? (rootEquipmentForWorkOrder.value || rootEquipmentForWorkOrder || []) : [];
if ((!roots || roots.length === 0) && typeof loadWorkOrderSelectableSources === 'function') {
loadWorkOrderSelectableSources();
}
} catch (e) { /* ignore */ }
}"
>
🏗️
{{ label }}
🏗️
{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
{{ (filteredRootEquipmentForInspectionPlan || []).length }} 台可选根装备{{ (planRootEquipmentTypeFilter || planCustomerFilter) ? '(已筛选)' : '' }}
👁️ {{ t('inspection.plan.hierarchy.previewButton') }}
按分类筛选:
{{ title }}
{{ templateCount }}
✓ 已筛选 {{ filteredTemplatesForPlan.length }} 个模板
{{ t('inspection.plan.hierarchy.addMapping') }}
一键添加全部(按装备分组 + 子机构按顺序)
暂无映射配置,点击上方按钮添加
🏗️{{ grp.root_name }}
{{ grp.items.length }} 项
onMappingEquipmentChange(value, record)"
>
📦{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
{{ t('inspection.plan.hierarchy.mappingColumns.equipmentType') }}
{{ record.equipment_type }}
未设置
📄{{ tpl.name }} ({{ tpl.id }})
{{ t('common.actions.delete') }}
{{ t('inspection.plan.form.validPeriod') }}
{ if (inspectionModule?.planModalVisible) inspectionModule.planModalVisible.value = false; }"
style="min-width: 88px; height: 36px; border-radius: 6px;"
>
{{ 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') || '批量导入点检分类、点检项目和模板绑定数据' }}
importModule.activeTab = key">
下载模板 / 导出数据
下载空白 CSV 模板
导出现有模板分类数据
管理点检/巡检/维护等模板的分类体系
点击或拖拽 CSV 文件到此区域
已解析 {{ importModule.previewData.total }} 条记录
{{ t('common.import.downloadBtnLabel') || '下载模板 / 导出数据' }}
{{ t('common.import.downloadBlankTemplate') || '下载空白 CSV 模板' }}
{{ t('inspection.importData.exportCategoryData') || '导出现有分类数据' }}
{{ t('common.import.exportHint') || '导出后可修改再上传,或导入其他租户' }}
点击或拖拽 CSV 文件到此区域
支持 UTF-8 或 GB2312 编码的 CSV 文件
已解析 {{ importModule.previewData.total }} 条记录
缺少必填字段: {{ importModule.previewData.missing_required_fields.join(', ') }}
新增: {{ importModule.importResult.data?.created || 0 }}
更新: {{ importModule.importResult.data?.updated || 0 }}
跳过: {{ importModule.importResult.data?.skipped || 0 }}
失败: {{ importModule.importResult.data?.failed || 0 }}
-
行 {{ err.row }}: {{ err.message }}
{{ t('common.import.downloadBtnLabel') || '下载模板 / 导出数据' }}
{{ t('common.import.downloadBlankTemplate') || '下载空白 CSV 模板' }}
{{ t('inspection.importData.exportItemData') || '导出现有点检项数据' }}
{{ t('common.import.exportHint') || '导出后可修改再上传,或导入其他租户' }}
点击或拖拽 CSV 文件到此区域
已解析 {{ importModule.previewData.total }} 条记录
下载模板 / 导出数据
下载空白 CSV 模板
导出现有模板数据
导入模板定义及其点检项(不含设备绑定)
点击或拖拽 CSV 文件到此区域
已解析 {{ importModule.previewData.total }} 条记录
{{ t('common.import.downloadBtnLabel') || '下载模板 / 导出数据' }}
{{ t('common.import.downloadBlankTemplate') || '下载空白 CSV 模板' }}
{{ t('inspection.importData.exportBindingData') || '导出现有模板绑定数据' }}
{{ t('common.import.exportHint') || '导出后可修改再上传,或导入其他租户' }}
点击或拖拽 CSV 文件到此区域
已解析 {{ importModule.previewData.total }} 条记录
下载模板 / 导出数据
下载空白 CSV 模板
导出现有点检计划
导入点检计划(含调度规则和模板绑定)
点击或拖拽 CSV 文件到此区域
已解析 {{ importModule.previewData.total }} 条记录
下载模板 / 导出数据
下载空白 CSV 模板
导出现有维护计划
导入维护计划(含触发规则和工单模板)
点击或拖拽 CSV 文件到此区域
已解析 {{ importModule.previewData.total }} 条记录
下载模板 / 导出数据
下载空白 CSV 模板
导出现有绑定设定
导入模板绑定规则(设备/标签/类型绑定、优先级、继承等设定)
点击或拖拽 CSV 文件到此区域
已解析 {{ importModule.previewData.total }} 条记录
{{ t('geometry3d.title') || '3D占位符管理' }}
{{ t('geometry3d.subtitle') || '管理设备在BIM 3D视图中的占位几何体(无BIM模型时显示)' }}
{{ t('geometry3d.create') || '新建占位符' }}
{{ record.position ? record.position.map(v => Number(v).toFixed(1)).join(', ') : '' }}
{{ record.scale ? record.scale.map(v => Number(v).toFixed(1)).join(', ') : '' }}
{{ record.color_hex }}
{{ 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') || '部分配置需要重启后生效,请在业务低峰期完成重启。' }}
{{ systemConfigCenterModule ? systemConfigCenterModule.getCategoryLabel(systemConfigCenterModule.activeCategory) : '' }}
{{ t('systemConfigCenter.actions.reset') || '撤销未保存' }}
{{ 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 }}
systemConfigCenterModule.setDraftValue(item, val)">
systemConfigCenterModule.setDraftValue(item, val)">
systemConfigCenterModule.setDraftValue(item, val)">
{{ opt }}
{{ item.has_value ? (t('systemConfigCenter.flags.configured') || '已配置') : (t('systemConfigCenter.flags.notConfigured') || '未配置') }}
systemConfigCenterModule.setDraftValue(item, val)">
systemConfigCenterModule.setDraftValue(item, val)">
{{ t('systemConfigCenter.test.title') || '连通性测试' }}
{{ t('systemConfigCenter.audit.title') || '变更记录' }}
{{ t('common.refresh') || '刷新' }}
{{ t('configWizard.title') || '配置向导' }}
{{ t('configWizard.subtitle') || '引导式系统配置,快速完成位置、设备和点检数据初始化' }}
configWizardModule.setWizardMode(e.target.value)">
{{ t('liteWizard.modeLite') || '精简向导(4步)' }}
{{ t('liteWizard.modeFull') || '完整向导' }}
{{ t('liteWizard.dismiss') || '稍后再说' }}
{{ t('configWizard.startWizard') || '开始配置向导' }}
{{ t('configWizard.dashboard.requiredProgress') || '必填项完成度' }}
💡 {{ configWizardModule.nextRecommendation }}
{{ t('configWizard.dashboard.viewAll') || '查看全部配置清单' }}
({{ Object.values(configWizardModule?.groupedCategories || {}).reduce((n, arr) => n + arr.length, 0) }})
{{ 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('configWizard.steps.prefix') || '步骤' }} {{ configWizardModule.currentStep.step }}: {{ t(configWizardModule.currentStep.titleKey) || configWizardModule.currentStep.title }}
{{ t('configWizard.dashboard.optional') || '可选' }}
{{ t('configWizard.navigate.goTo') || '前往配置' }}
{{ t('configWizard.navigate.markDone') || '标记为已完成' }}
{{ 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('liteWizard.packResultSummary', { bindings: configWizardModule.templatePackResult.bindingsTotal, overall: configWizardModule.templatePackResult.overallTotal }) || ('按设备类型绑定 ' + configWizardModule.templatePackResult.bindingsTotal + ' 条 + 兜底模板 ' + configWizardModule.templatePackResult.overallTotal + ' 个已就绪') }}
{{ t('liteWizard.packResultHint') || '新增该类型设备建单将自动命中模板,无需手工绑定。后续 CSV 导入步骤可按需跳过。' }}
{{ t('common.import.downloadBtnLabel') || '下载模板 / 导出数据' }}
{{ t('liteWizard.downloadEquipmentXlsxTemplate') || '下载 Excel 模板(类型/型号下拉)' }}
{{ t('common.import.downloadBlankTemplate') || '下载空白 CSV 模板' }}
{{ t('common.import.exportExistingCsv') || '导出现有数据为 CSV' }}
{{ 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.guide.operationSteps') || '操作步骤:① 下载 CSV 模板 → ② 填写数据 → ③ 上传 CSV 文件 → ④ 确认预览 → ⑤ 点击「执行导入」保存到数据库' }}
{{ t('configWizard.guide.stepCompleted') || '此步骤已完成导入。如需更新数据,可重新上传 CSV 文件。' }}
{{ t('configWizard.preview.parsed', { total: configWizardModule.previewData.total }) || ('已解析 ' + configWizardModule.previewData.total + ' 条记录') }},{{ t('configWizard.preview.confirmHint') || '请确认后点击下方「执行导入」按钮保存到数据库' }}
{{ t('configWizard.preview.missingFields', { fields: configWizardModule.previewData.missing_required_fields.join(', ') }) || ('缺少必填字段: ' + configWizardModule.previewData.missing_required_fields.join(', ')) }}
{{ t('configWizard.preview.updateExisting') || '更新已存在的记录' }}
{{ t('configWizard.preview.executeImportFull') || '执行导入(保存到数据库)' }}
{{ t('configWizard.preview.saveHint') || '点击后数据将写入数据库,「下一步」不会自动保存' }}
{{ t('configWizard.result.created') || '新增' }}: {{ configWizardModule.importResult.data?.created || 0 }},
{{ t('configWizard.result.updated') || '更新' }}: {{ configWizardModule.importResult.data?.updated || 0 }},
{{ t('configWizard.result.skipped') || '跳过' }}: {{ configWizardModule.importResult.data?.skipped || 0 }},
{{ t('configWizard.result.failed') || '失败' }}: {{ configWizardModule.importResult.data?.failed || 0 }}
- {{ t('configWizard.result.rowError', { row: err.row, message: err.message }) || ('行 ' + err.row + ': ' + err.message) }}
{{ 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('liteWizard.goPlans') || '前往点检计划' }}
{{ t('liteWizard.goWorkbench') || '回到工作台' }}
{{ t('configWizard.steps.prefix') || '步骤' }} {{ configWizardModule.currentLiteStep.step }}/{{ configWizardModule.liteWizardSteps.length }}:{{ t(configWizardModule.currentLiteStep.titleKey) || configWizardModule.currentLiteStep.title }}
{{ t('liteWizard.stepDone') || '已完成' }}
{{ t(configWizardModule.currentLiteStep.descKey) }}
{{ t('liteWizard.templateLibraryTitle') || '可选:先导入行业模板包(推荐)' }}
{{ t('liteWizard.templateLibraryInlineDesc') || '导入后行业设备类型/型号自动落入本步档案,设备 Excel 模板的类型/型号下拉会自动带出;模板包同时含点检模板,第 3 步可直接下一步或导出修改后重新导入。' }}
{{ pack.name }}
{{ pack.description }}
{{ configWizardModule.stepStates['templates'] === 'completed' ? (t('liteWizard.imported') || '已导入') : (t('liteWizard.importPack') || '一键导入') }}
{{ t('liteWizard.packResultSummary', { bindings: configWizardModule.templatePackResult.bindingsTotal, overall: configWizardModule.templatePackResult.overallTotal }) || ('按设备类型绑定 ' + configWizardModule.templatePackResult.bindingsTotal + ' 条 + 兜底模板 ' + configWizardModule.templatePackResult.overallTotal + ' 个已就绪') }}
{{ t('liteWizard.packResultHint') || '新增该类型设备建单将自动命中模板,无需手工绑定。' }}
{{ t('liteWizard.equipmentOrgHint') || '设备导入模板含 parent_code(父设备编码)与 is_component(机构标记)两列:is_component=1 表示机构/组件,填写 parent_code 后自动挂接到父装备结构树,留空则为独立机构;机构设备将走免签字点检链路。' }}
{{ t('liteWizard.viewFieldNotes') || '查看字段说明' }}
{{ t('liteWizard.packResultSummary', { bindings: configWizardModule.templatePackResult.bindingsTotal, overall: configWizardModule.templatePackResult.overallTotal }) || ('按设备类型绑定 ' + configWizardModule.templatePackResult.bindingsTotal + ' 条 + 兜底模板 ' + configWizardModule.templatePackResult.overallTotal + ' 个已就绪') }}
{{ t('liteWizard.packResultStep3Hint') || '模板包已在第 2 步导入。如需调整模板内容,可在下方导出现有模板 CSV,修改后重新导入。' }}
{{ t(imp.titleKey) || imp.title }}
{{ t('configWizard.dashboard.optional') || '可选' }}
✓ {{ t('liteWizard.importDone') || '已完成' }}
— {{ t('liteWizard.skipped') || '已跳过' }}
{{ t('configWizard.nav.skipStep') || '跳过此步' }}
{{ t('liteWizard.markDone') || '已配置,标记完成' }}
{{ t('common.import.downloadBtnLabel') || '下载模板 / 导出数据' }}
{{ t('liteWizard.downloadEquipmentXlsxTemplate') || '下载 Excel 模板(类型/型号下拉)' }}
{{ t('common.import.downloadBlankTemplate') || '下载空白 CSV 模板' }}
{{ t('common.import.exportExistingCsv') || '导出现有数据为 CSV' }}
{{ t('common.import.exportHint') || '导出后可修改再上传,或导入其他租户' }}
{{ imp.apiBase === '/api/v1/import' ? (t('configWizard.upload.dragText') || '点击或拖拽 CSV / Excel 文件到此区域') : (t('liteWizard.uploadDragTextCsv') || '点击或拖拽 CSV 文件到此区域') }}
{{ imp.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.parsed', { total: configWizardModule.getLiteImportState(imp.importType).previewData.total }) || ('已解析 ' + configWizardModule.getLiteImportState(imp.importType).previewData.total + ' 条记录') }},{{ t('configWizard.preview.confirmHint') || '请确认后点击下方「执行导入」按钮保存到数据库' }}
{{ t('configWizard.preview.missingFields', { fields: configWizardModule.getLiteImportState(imp.importType).previewData.missing_required_fields.join(', ') }) || ('缺少必填字段: ' + configWizardModule.getLiteImportState(imp.importType).previewData.missing_required_fields.join(', ')) }}
{{ t('configWizard.preview.updateExisting') || '更新已存在的记录' }}
{{ t('configWizard.preview.executeImportFull') || '执行导入(保存到数据库)' }}
{{ t('configWizard.preview.saveHint') || '点击后数据将写入数据库,「下一步」不会自动保存' }}
{{ t('configWizard.result.created') || '新增' }}: {{ configWizardModule.getLiteImportState(imp.importType).importResult.data?.created || 0 }},
{{ t('configWizard.result.updated') || '更新' }}: {{ configWizardModule.getLiteImportState(imp.importType).importResult.data?.updated || 0 }},
{{ t('configWizard.result.skipped') || '跳过' }}: {{ configWizardModule.getLiteImportState(imp.importType).importResult.data?.skipped || 0 }},
{{ t('configWizard.result.failed') || '失败' }}: {{ configWizardModule.getLiteImportState(imp.importType).importResult.data?.failed || 0 }}
{{ t('configWizard.nav.prevStep') || '上一步' }}
{{ configWizardModule.liteStepIndex >= configWizardModule.liteWizardSteps.length - 1 ? (t('configWizard.nav.finishConfig') || '完成配置') : (t('configWizard.nav.nextStep') || '下一步') }}
{{ t('systemImport.title') || '系统数据导入' }}
{{ t('systemImport.subtitle') || '批量导入位置、设备类型、设备档案等基础数据' }}
systemImportModule.activeTab = key">
{{ t('common.import.downloadBtnLabel') || '下载模板 / 导出数据' }}
{{ t('common.import.downloadBlankXlsxTemplate') || '下载空白 Excel 模板' }}
{{ t('common.import.downloadBlankTemplate') || '下载空白 CSV 模板' }}
{{ t('common.import.exportExistingCsv') || '导出现有数据为 CSV' }}
{{ t('common.import.exportExistingXlsx') || '导出现有数据为 Excel' }}
{{ t('common.import.exportHintAlt') || '导出后可修改再重新上传,也可导入到其他租户' }}
{{ t('configWizard.upload.dragText') || '点击或拖拽 CSV / Excel 文件到此区域' }}
{{ t('configWizard.upload.hint') || '支持 .xlsx/.xls 原生 Excel,或 UTF-8 / GB2312 编码的 CSV 文件' }}
{{ t('configWizard.preview.parsed', { total: systemImportModule.previewData.total }) || ('已解析 ' + systemImportModule.previewData.total + ' 条记录') }}
{{ t('configWizard.preview.missingFields', { fields: systemImportModule.previewData.missing_required_fields.join(', ') }) || ('缺少必填字段: ' + systemImportModule.previewData.missing_required_fields.join(', ')) }}
{{ t('configWizard.preview.updateExisting') || '更新已存在的记录' }}
{{ t('configWizard.preview.executeImport') || '执行导入' }}
{{ t('configWizard.result.created') || '新增' }}: {{ systemImportModule.importResult.data?.created || 0 }},
{{ t('configWizard.result.updated') || '更新' }}: {{ systemImportModule.importResult.data?.updated || 0 }},
{{ t('configWizard.result.skipped') || '跳过' }}: {{ systemImportModule.importResult.data?.skipped || 0 }},
{{ t('configWizard.result.failed') || '失败' }}: {{ systemImportModule.importResult.data?.failed || 0 }}
- {{ t('configWizard.result.rowError', { row: err.row, message: err.message }) || ('行 ' + err.row + ': ' + err.message) }}
{{ t('scheduler.overview.status') || '调度器状态' }}
{{ schedulerModule.schedulerStatus?.scheduler_running ? '调度器运行中' : '调度器未启动' }}
{{ schedulerModule.getJobDisplayName(record) }}
{{ schedulerModule.CATEGORY_MAP[record.category]?.label() || record.category }}
{{ schedulerModule.formatTrigger(record) }}
{{ schedulerModule.formatTime(record.last_run_at) }}
OK
{{ t('scheduler.history.partial') || '部分失败' }}
FAIL
{{ schedulerModule.formatTime(record.next_run_at) }}
{{ record.total_failures }}
{{ t('scheduler.actions.trigger') || '立即执行' }}
{{ t('scheduler.actions.pause') || '暂停' }}
{{ t('scheduler.actions.resume') || '恢复' }}
{{ schedulerModule.expandedJobId === record.job_id ? (t('scheduler.actions.collapse') || '收起') : (t('scheduler.actions.expand') || '展开') }}
{{ t('scheduler.actions.collapse') || '收起' }}
{{ schedulerModule.getJobDisplayName(schedulerModule.selectedJob) }}
{{ schedulerModule.CATEGORY_MAP[schedulerModule.selectedJob.category]?.label() || schedulerModule.selectedJob.category }}
{{ schedulerModule.getJobScopeSummary() }}
{{ schedulerModule.STATUS_MAP[schedulerModule.selectedJob.status]?.label() || schedulerModule.selectedJob.status }}
{{ t('scheduler.overview.currentTrigger') || '当前频率' }}: {{ schedulerModule.formatTrigger(schedulerModule.selectedJob) }}
{{ t('scheduler.overview.lastRun') || '最近执行' }}: {{ schedulerModule.formatTime(schedulerModule.selectedJob.last_run_at) }}
⚙️ {{ t('scheduler.config.title') || '触发频率设置' }}
{{ t('scheduler.actions.collapse') || '收起' }} ⚙️
{{ t('scheduler.filter.title') || '筛选' }}
{{ tc.tenant_name || tc.tenant_id }}
{{ (t('scheduler.filter.tenantPlaceholder') || '按账套过滤') + ':' + schedulerModule.getCurrentTenantName() }}
{{ t('scheduler.history.success') || '成功' }}
{{ t('scheduler.history.failed') || '失败' }}
{{ t('scheduler.history.partial') || '部分失败' }}
{{ t('scheduler.history.skipped') || '跳过' }}
{{ t('scheduler.history.running') || '执行中' }}
{{ t('scheduler.actions.resetFilter') || '重置筛选' }}
{{ t('scheduler.filter.defaultHint') || '租户用户固定当前账套,全局用户可切换账套。失败记录可按状态筛到 failed。' }}
{{ t('scheduler.config.minutes') || '分钟' }}
{{ t('scheduler.config.hours') || '小时' }}
{{ t('scheduler.config.intervalHint') || '修改后会立即重载调度器。' }}
{{ t('scheduler.config.weekdays.mon') || '周一' }}
{{ t('scheduler.config.weekdays.tue') || '周二' }}
{{ t('scheduler.config.weekdays.wed') || '周三' }}
{{ t('scheduler.config.weekdays.thu') || '周四' }}
{{ t('scheduler.config.weekdays.fri') || '周五' }}
{{ t('scheduler.config.weekdays.sat') || '周六' }}
{{ t('scheduler.config.weekdays.sun') || '周日' }}
{{ t('scheduler.config.cronHint') || '不选星期表示每天执行。' }}
{{ t('scheduler.msg.unsupportedTrigger') || '暂不支持修改该任务的触发器类型' }}
{{ t('scheduler.actions.saveFrequency') || '保存频率' }}
{{ t('scheduler.config.previewTitle') || '保存后预览' }}
{{ schedulerModule.getTriggerDraftPreview() }}
{{ schedulerModule.getConfigImpactSummary() }}
schedulerModule.updateTenantConfig(schedulerModule.expandedJobId, tc.tenant_id, { enabled: v })">
{{ t('scheduler.config.current') || '当前频率' }}
{{ schedulerModule.formatTenantOverride(tc) }}
{{ tc.trigger_override && Object.keys(tc.trigger_override).length ? (t('scheduler.tenantConfig.overrideActive') || '已覆盖') : (t('scheduler.tenantConfig.overrideInherited') || '继承默认') }}
{{ t('scheduler.config.minutes') || '分钟' }}
{{ t('scheduler.config.hours') || '小时' }}
{{ t('scheduler.config.weekdays.mon') || '周一' }}
{{ t('scheduler.config.weekdays.tue') || '周二' }}
{{ t('scheduler.config.weekdays.wed') || '周三' }}
{{ t('scheduler.config.weekdays.thu') || '周四' }}
{{ t('scheduler.config.weekdays.fri') || '周五' }}
{{ t('scheduler.config.weekdays.sat') || '周六' }}
{{ t('scheduler.config.weekdays.sun') || '周日' }}
{{ t('scheduler.config.previewTitle') || '保存后预览' }}: {{ schedulerModule.getTenantTriggerDraftPreview(tc.tenant_id) }}
{{ schedulerModule.formatTime(tc.last_run_at) }}
OK
{{ t('scheduler.history.partial') || '部分失败' }}
FAIL
{{ t('scheduler.actions.trigger') || '执行' }}
{{ schedulerModule.formatTime(h.started_at) }}
{{ t('scheduler.history.' + h.status) || h.status }}
{{ schedulerModule.formatDuration(h.duration_ms) }}
{{ h.result_summary || h.error_message || '-' }}
📧 {{ (window.t ? (window.t('scheduler.history.notifiedTo') || '通知人') : '通知人') }}: {{ schedulerModule.formatNotificationInfo(h).list }} ({{ schedulerModule.formatNotificationInfo(h).count }}{{ (window.t ? (window.t('scheduler.history.notifiedToUnit') || '人') : '人') }})
{{ d.plan_id }}:
{{ d.error || '未知错误' }}
{{ h.trigger_type === 'manual' ? (t('scheduler.history.manual') || '手动') : (t('scheduler.history.scheduled') || '自动') }}
{{ 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') || '刷新' }}
{{ getLocalizedEquipmentName(eq) }}
{{ t('common.enabled') || '启用' }}
{{ t('common.disabled') || '停用' }}
{{ t('maintenance.plan.triggerType.periodic') || '周期触发' }}
{{ t('maintenance.plan.triggerType.counter') || '计数触发' }}
{{ t('maintenance.plan.triggerType.condition') || '条件触发' }}
{{ t('maintenance.plan.scopeSingle') || '机构维护' }}
{{ t('maintenance.plan.scopeHierarchy') || '装备维护' }}
{{ record.plan_id }}
{{ record.name }}
{{ t('maintenance.plan.scopeHierarchy') || '组合' }}
{{ record.root_equipment_name || record.equipment_name || record.equipment_id }}
({{ t('maintenance.plan.hierarchyEquipmentCountValue', { count: record.hierarchy_equipment_count }) || (record.hierarchy_equipment_count + ' 台') }})
{{ record.equipment?.name || record.equipment_name || record.equipment_id || '-' }}
🏢 {{ record.department_name }}
-
{{ maintenancePlanModule && maintenancePlanModule.formatTriggerType(record.trigger_type) }}
{{ maintenancePlanModule && maintenancePlanModule.formatTriggerConfig(record.trigger_type, record.trigger_config) }}
{{ record.last_triggered_at.replace('T', ' ').substring(0, 16) }}
-
{{ record.next_trigger_at.replace('T', ' ').substring(0, 16) }}
-
maintenancePlanModule && maintenancePlanModule.toggleEnabled(record.plan_id, checked)"
size="small"
:disabled="!hasPermission('maintenance:plan:enable')"
/>
{{ t('common.actions.edit') || '编辑' }}
{{ t('maintenance.plan.actions.trigger') || '触发' }}
{{ t('common.actions.delete') || '删除' }}
{{ t('maintenance.plan.actions.simulate') || '模拟' }}
⚙️ {{ t('maintenance.plan.modeLabel') || '维护模式' }}:
{
const v = e.target.value;
if (v === 'batch') {
maintenancePlanModule.batchMode = true;
maintenancePlanModule.form.scope_type = 'single';
} else {
maintenancePlanModule.batchMode = false;
maintenancePlanModule.form.scope_type = v;
}
}"
>
🌳 {{ t('maintenance.plan.modeHierarchy') || '装备维护' }}
🔧 {{ t('maintenance.plan.modeSingle') || '机构维护' }}
📦 {{ t('maintenance.plan.modeBatchSingle') || '批量机构维护' }}
{{ t('maintenance.plan.batchHint') || '为多台机构批量创建计划' }}
{{ t('maintenance.plan.hierarchyHint') || '为装备(根设备 + 子机构)创建一条组合计划' }}
{{ t('maintenance.plan.singleHint') || '为单台机构创建计划' }}
📋 {{ t('maintenance.plan.basicInfo') || '基本信息' }}
{{ t('maintenance.plan.name') || '计划名称' }}
{{ t('maintenance.plan.descriptionLabel') || '计划描述' }}
🏢 {{ t('common.department') || '归属部门' }}
🧩 {{ t('inspection.plan.form.equipmentCategory') || '装备分类' }}
{ maintenancePlanModule.form.root_equipment_id = ''; }"
style="width: 100%;"
>
🌳 {{ t('maintenance.plan.rootEquipment') || '根设备' }}
maintenancePlanModule.loadSubtreeEquipment && maintenancePlanModule.loadSubtreeEquipment(val)"
@dropdownVisibleChange="v => {
if (!v) return;
try {
const roots = window.modules?.rootEquipmentForWorkOrder?.value || [];
const fn = window.modules?.loadWorkOrderSelectableSources;
if ((!roots || roots.length === 0) && typeof fn === 'function') {
fn();
}
} catch (e) { /* ignore */ }
}"
>
{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
{{ t('maintenance.plan.hierarchyEquipmentCount') || '组内设备' }}:
{{ t('maintenance.plan.hierarchyEquipmentCountValue', { count: (maintenancePlanModule.subtreeEquipments ? maintenancePlanModule.subtreeEquipments.length : 0) }) || ((maintenancePlanModule.subtreeEquipments ? maintenancePlanModule.subtreeEquipments.length : 0) + ' 台') }}
👁️ {{ t('maintenance.plan.previewEquipmentTreeButton') || '预览设备树' }}
🧩 {{ t('equipment.type') || '设备类型' }}
🔧 {{ t('maintenance.plan.equipment') || '关联设备' }}
{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
📋 {{ t('maintenance.plan.templateMapping') || '设备-模板映射' }}
{{ t('maintenance.plan.templateMappingTip') || '从子树中选择设备并为每台指定检查模板' }}
+ {{ t('maintenance.plan.addMapping') || '添加设备映射' }}
一键添加全部(根装备置顶 + 子机构按顺序)
{
const eq = (maintenancePlanModule.subtreeEquipments || maintenancePlanModule.equipmentList || []).find(e => e.equipment_id === val);
if (eq) mapping.equipment_type = eq.type || eq.equipment_type || '';
}"
>
{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
{{ mapping.equipment_type }}
{{ tpl.name }} ({{ tpl.template_id || tpl.id }})
🧩 设备类型
📱 选择设备进行绑定
已选 {{ maintenancePlanModule.batchEquipmentIds.length }} 台
{{ maintenancePlanModule.equipmentList.find(e => e.equipment_id === eqId)?.name || eqId }}
⏱️ 错开触发时间
避免资源冲突
⏰ 触发配置
触发类型
📅 周期
🔢 计数
⚡ 条件
每日
每周
每月
每季度
每年
周一
周二
周三
周四
周五
周六
周日
第1月
第2月
第3月
{{ m }}月
运行时长(h)
生产数量
循环次数
触发后自动重置计数
设备状态
传感器数据
报警事件
等于
不等于
大于
小于
≥
≤
包含
📝 工单模板
工单类型
🛠️ 预防性维护
📐 校准
🔧 大修
🔧 工具维护
优先级
🟢 低
🔵 中
🟠 高
🔴 紧急
工单标题
预估工时
工单描述
📂 模板分类
{{ title }}
{{ templateCount }}
📋 检查模板
🔧 {{ template.name }}
v{{ template.version_no }}
月视图
周视图
列表视图
今天
{{ maintenancePlanModule.currentCalendarTitle }}
拖拽模式
拖拽模式
{{ day.value.format('DD') }}
{{ event.time }} {{ event.title }}
+{{ maintenancePlanModule.getEventsForDate(day.value).length - 3 }} 更多
{{ day.label }}
无计划
{{ event.time }} - {{ event.title }}
{{ event.equipment_name }}
{{ item.title }}
设备: {{ item.equipment_name }}
触发时间: {{ item.dateTime }}
{{ item.description }}
设备:{{ maintenancePlanModule.selectedEvent.equipment_name }}
触发时间:{{ maintenancePlanModule.selectedEvent.dateTime }}
触发类型:{{ maintenancePlanModule.getTriggerTypeLabel(maintenancePlanModule.selectedEvent.trigger_type) }}
状态:{{ maintenancePlanModule.selectedEvent.enabled ? '启用' : '停用' }}
描述:{{ maintenancePlanModule.selectedEvent.description || '-' }}
{{ tpl.description }}
{{ maintenancePlanModule.getTriggerTypeLabel(tpl.trigger_type) }}
已使用 {{ tpl.usage_count || 0 }} 次
{{ tpl.description }}
{{ maintenancePlanModule.getTriggerTypeLabel(tpl.trigger_type) }}
已使用 {{ tpl.usage_count || 0 }} 次
{{ tpl.name }}
{{ tpl.description }}
{{ maintenancePlanModule.getTriggerTypeLabel(tpl.trigger_type) }}
已使用 {{ tpl.usage_count || 0 }} 次
📱 批量选择设备
已选 {{ maintenancePlanModule.batchEquipmentIds.length }} 台
📊 计数器状态
{{ maintenancePlanModule.simulatorInfo?.trigger_config?.current_value || 0 }} / {{ maintenancePlanModule.simulatorInfo?.trigger_config?.threshold || 0 }}
计数类型: {{ {running_hours: '运行时长(h)', production_count: '生产数量', cycle_count: '循环次数'}[maintenancePlanModule.simulatorInfo?.trigger_config?.counter_type] || '-' }}
自动重置: {{ maintenancePlanModule.simulatorInfo?.trigger_config?.auto_reset ? '是' : '否' }}
⏱ 值已更新后,将在下次调度检查时自动触发(当前值 ≥ 阈值)
📋 条件配置
监控设备: {{ maintenancePlanModule.simulatorInfo?.equipment_name || maintenancePlanModule.simulatorInfo?.equipment_id || '-' }}
监测字段: {{ maintenancePlanModule.simulatorInfo?.trigger_config?.field || '-' }}
操作符: {{ maintenancePlanModule.simulatorInfo?.trigger_config?.operator || '-' }}
目标值: {{ maintenancePlanModule.simulatorInfo?.trigger_config?.value }}
检查间隔: {{ maintenancePlanModule.simulatorInfo?.trigger_config?.check_interval_minutes || 60 }} 分钟
当前值:
{{ maintenancePlanModule.simulatorInfo?.current_field_value ?? '(空)' }}
⏱ 值已更新后,将在下次调度检查时判定条件(检查间隔: {{ maintenancePlanModule.simulatorInfo?.trigger_config?.check_interval_minutes || 60 }} 分钟)
加载模拟器信息失败
{{ t('maintenance.history.title') || '📊 维护计划执行历史' }}
{{ t('maintenance.history.description') || '查看所有维护计划的执行记录和生成的工单' }}
{{ t('maintenance.history.status.success') || '成功' }}
{{ t('maintenance.history.status.failed') || '失败' }}
{{ t('common.actions.refresh') || '刷新' }}
{{ record.plan_name }}
ID: {{ record.plan_id }}
{{ maintenancePlanModule && maintenancePlanModule.formatDateTime(record.triggered_at) }}
{{ record.status === 'success' ? '✅ 成功' : '❌ 失败' }}
handleViewWorkOrder({ work_order_id: record.work_order_id })"
>
{{ record.work_order_id }}
-
{{ record.error_message }}
{{ record.trigger_data.error }}
⚠️ {{ record.trigger_data.approval }}
-
📁 {{ t('bim.files.title') }}
{{ bimFiles.length }} 个文件
管理和组织 BIM 模型文件
{{ t('bim.files.refresh') }}
📤
{{ t('bim.files.upload_file_card') }}
💡
{{ t('bim.files.formats_recommend_desc') }}
{{ t('bim.files.formats_supported') }}:
⚠️
{{ 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.annotation_management') }}
{{ 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.divider.upload_sidecar') }}
{{ t('bim.files.divider.download_export') }}
{{ t('bim.files.download.latest_glb') }}
{{ t('bim.files.export.mapping') }}
📋
{{ t('bim.files.file_list_title') }}
{{ bimFiles.length }} {{ t('bim.files.file_count') }}
(bimFilesModule && (bimFilesModule.bindModelVisible.value = !!v))"
@ok="() => bimFilesModule && bimFilesModule.submitBindModel()"
@cancel="() => (bimFilesModule && (bimFilesModule.bindModelVisible.value = false))"
>
{{ 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') }}
{{ editingMapping ? t('bim.mappings.modal.editTitle') : t('bim.mappings.modal.createTitle') }}
{{ 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') }}
mappingNodeDrawerVisible = false"
>
{{ title }}
({{ dataRef.display_equipment_id }})
{{ eid }}
📝 {{ 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') }}
{ workflow.enabled = checked; approvalModule.toggleWorkflow(workflow); }"
:checked-children="t('system.approval.status.enabled')"
:un-checked-children="t('system.approval.status.disabled')"
size="small"
style="margin-left: auto;"
/>
🔢 {{ t('docNumber.title') }}
{{ t('docNumber.subtitle') }}
{{ t('docNumber.createRule') }}
📋
✅
⏸️
🔢
key === 'logs' && docNumberModule?.loadLogs()" style="flex: 1; min-height: 0;" class="flex-tabs">
{{ item.name }}
{{ t('common.enabled') || '启用' }}
{{ t('common.disabled') || '禁用' }}
{{ item.name }}
{{ t('docNumber.form.codeHint') }}
{{ item.name }}
docNumberModule?.switchBuilderMode(e.target.value)">
🎨 可视化构建
✏️ 手动输入
📋 快速模板:
{{ tpl.name }}
{{ tpl.example }}
点击上方模板或下方按钮添加规则段
🏷️
➖
{{ opt.label }}
📅
{{ opt.label }}
🏢
{{ opt.label }}
🔢
{{ opt.label }}
×
→
🏷️ 前缀
➖ 分隔符
📅 日期
🏢 上下文
🔢 流水号
📝 生成的表达式:
{{ 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.designIframe') || '内嵌打开') : '内嵌打开') }}
{{ (window.t ? (window.t('report.template.actions.designWindow') || '新窗口打开') : '新窗口打开') }}
{{ (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') || '使用说明') : '使用说明') }}
- {{ (window.t ? (window.t('report.template.upload.guideStep1') || '先点击「下载」获取当前模板 .frx 文件') : '先点击「下载」获取当前模板 .frx 文件') }}
- {{ (window.t ? (window.t('report.template.upload.guideStep2') || '用 FastReport Designer 打开编辑') : '用 FastReport Designer 打开编辑') }}
- {{ (window.t ? (window.t('report.template.upload.guideStep3') || '保存后在此上传修改后的文件') : '保存后在此上传修改后的文件') }}
- {{ (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.panels.sensorList') || '传感器列表') : '传感器列表') }}
{{ (window.t ? (window.t('sensor.monitor.panels.latestAlerts') || '最新报警') : '最新报警') }}
| {{ (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.sections.basicInfo') || '基本信息') : '基本信息') }}
{{ (window.t ? (window.t('sensor.management.form.equipmentCount', { count: sensorEquipmentOptions.length }) || (sensorEquipmentOptions.length + ' 个设备')) : (sensorEquipmentOptions.length + ' 个设备')) }}
{{ (window.t ? (window.t('sensor.management.form.loadMoreEquipment') || '加载更多') : '加载更多') }}
🌡️ {{ (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') || '阈值配置') : '阈值配置') }}
{{ sensorViewData.normal_min ?? '--' }} ~ {{ sensorViewData.normal_max ?? '--' }}
{{ sensorViewData.warning_min ?? '--' }} ~ {{ sensorViewData.warning_max ?? '--' }}
{{ sensorViewData.alert_min ?? '--' }} ~ {{ sensorViewData.alert_max ?? '--' }}
{{ (window.t ? (window.t('sensor.management.viewModal.close') || '关闭') : '关闭') }}
{{ (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.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.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') || '手动发送') : '手动发送') }}
📊 {{ (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') || '暂无发送记录') : '暂无发送记录') }}
设备范围
{{ 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.stats.failureProbability') || '故障概率') : '故障概率') }}
{{ (predictiveMaintenance.prediction?.value?.failure_probability * 100).toFixed(1) }}{{ (window.t ? (window.t('predictiveMaintenance.stats.percentUnit') || '%') : '%') }}
{{ (window.t ? (window.t('predictiveMaintenance.stats.predictedRulDays') || '预测稳定运行期间') : '预测稳定运行期间') }}
{{ predictiveMaintenance.prediction?.value?.predicted_rul_days }}{{ (window.t ? (window.t('predictiveMaintenance.stats.daysUnit') || '天') : '天') }}
{{ (window.t ? (window.t('predictiveMaintenance.stats.riskLevel') || '风险等级') : '风险等级') }}
{{ predictiveMaintenance.getRiskLevelText(predictiveMaintenance.prediction?.value?.risk_level) }}
{{ (window.t ? (window.t('predictiveMaintenance.stats.confidence') || '预测置信度') : '预测置信度') }}
{{ (predictiveMaintenance.prediction?.value?.confidence_level * 100).toFixed(1) }}{{ (window.t ? (window.t('predictiveMaintenance.stats.percentUnit') || '%') : '%') }}
📊 {{ (window.t ? (window.t('predictiveMaintenance.detail.title') || '预测详情') : '预测详情') }}
{{ predictiveMaintenance.prediction?.value?.equipment_id }}
{{ predictiveMaintenance.prediction?.value?.prediction_date }}
{{ predictiveMaintenance.prediction?.value?.predicted_failure_date }}
{{ predictiveMaintenance.prediction?.value?.model_name }} {{ predictiveMaintenance.prediction?.value?.model_version }}
{{ predictiveMaintenance.prediction?.value?.predicted_issue }}
💡 {{ (window.t ? (window.t('predictiveMaintenance.recommendations.title') || '维护建议') : '维护建议') }}
-
{{ predictiveMaintenance.getPriorityText(rec.priority) }}
{{ rec.action }}
{{ rec.reason }}
{{ (window.t ? (window.t('predictiveMaintenance.recommendations.estimatedHours', { hours: rec.estimated_hours }) || ('预计工时: ' + rec.estimated_hours + ' 小时')) : ('预计工时: ' + rec.estimated_hours + ' 小时')) }}
📈 {{ (window.t ? (window.t('predictiveMaintenance.trendTitle') || '故障风险趋势') : '故障风险趋势') }}
🎯 {{ (window.t ? (window.t('predictiveMaintenance.featureImportanceTitle') || '模型特征重要性') : '模型特征重要性') }}
{{ predictiveMaintenance.getFeatureName(feature) }}
{{ (importance * 100).toFixed(1) }}%
📊 {{ (window.t ? (window.t('predictiveMaintenance.modelMetricsTitle') || '模型性能指标') : '模型性能指标') }}
{{ (window.t ? (window.t('predictiveMaintenance.modelInfo.trainedAt') || '模型训练时间') : '模型训练时间') }}: {{ predictiveMaintenance.formatDateTime(predictiveMaintenance.modelPerformance?.value?.model_info?.trained_at) }}
{{ (window.t ? (window.t('predictiveMaintenance.modelInfo.trainingSamples') || '训练样本') : '训练样本') }}: {{ predictiveMaintenance.modelPerformance?.value?.training_info?.training_samples }} ({{ (window.t ? (window.t('predictiveMaintenance.modelInfo.positiveSamples') || '正样本') : '正样本') }}: {{ predictiveMaintenance.modelPerformance?.value?.training_info?.positive_samples }})
📜 {{ (window.t ? (window.t('predictiveMaintenance.history.title') || '预测历史') : '预测历史') }}
{{ record.predicted_issue }}
{{ (window.t ? (window.t('predictiveMaintenance.train.tip1') || '训练新的预测模型需要足够的历史数据(至少100个样本)。') : '训练新的预测模型需要足够的历史数据(至少100个样本)。') }}
{{ (window.t ? (window.t('predictiveMaintenance.train.tip2') || '训练时间取决于数据量,通常需要1-5分钟。') : '训练时间取决于数据量,通常需要1-5分钟。') }}
{{ (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.photo_urls.length - 3 }}
additionalFindings.state.showNewModal = false"
destroy-on-close
width="600px"
>
已加载 {{ additionalFindings.workOrderOptions?.value?.length || 0 }} 个工单,支持搜索过滤
暂无可用工单,请先创建工单
正在加载工单列表...
{{ opt.icon || opt.label }} {{ opt.label }}
电气
机械
安全隐患
环境问题
其他
additionalFindings.pickPhotoUrls(fileList.map(item => item.originFileObj).filter(Boolean))"
>
{{ opt.icon || opt.label }} {{ opt.label }}
电气
机械
安全隐患
环境问题
其他
additionalFindings.pickEditPhotoUrls(fileList.map(item => item.originFileObj).filter(Boolean))"
>
additionalFindings.state.showDetailModal = false"
>
{{ additionalFindings.selectedFinding.description }}
{{ additionalFindings.severityOptions.find(opt => opt.value === additionalFindings.selectedFinding.severity)?.label || additionalFindings.selectedFinding.severity }}
{{ additionalFindings.statusOptions.find(opt => opt.value === additionalFindings.selectedFinding.status)?.label || additionalFindings.selectedFinding.status }}
{{ additionalFindings.selectedFinding.category || '-' }}
{{ additionalFindings.selectedFinding.location || '-' }}
{{ additionalFindings.selectedFinding.discoverer_name || '-' }}
{{ additionalFindings.selectedFinding.discovered_at ? formatDateTime(additionalFindings.selectedFinding.discovered_at) : '-' }}
window.modules.emergencyRepair.showEmergencyRepairModal.value = val"
title="紧急报修"
:confirm-loading="window.modules.emergencyRepair.emergencyRepairSubmitting.value"
@ok="window.modules.emergencyRepair.submitEmergencyRepair"
:mask-closable="true"
:keyboard="true"
width="700px"
:destroy-on-close="false"
>
{{ getLocalizedEquipmentName(eq) }} ({{ eq.equipment_id }})
🔴 紧急
🟠 高
🟡 中
🟢 低
{{ u.name || u.username }} ({{ u.user_id }})
客户分类管理
管理客户的多级分类,支持树形层级结构
新增分类
刷新
customerModule.onCategorySelect(keys, info)"
@expand="(keys) => customerModule.onCategoryExpand(keys)"
:show-line="{ showLeafIcon: false }"
default-expand-all
style="font-size: 13px;"
>
{{ title }}
({{ code }})
已禁用
编辑
删除
{{ customerModule.selectedCategory?.name }}
{{ customerModule.selectedCategory?.code || '-' }}
{{ customerModule.selectedCategory?.level || 1 }}
{{ customerModule.selectedCategory?.is_active ? '启用' : '禁用' }}
{{ customerModule.selectedCategory?.full_path || '-' }}
{{ customerModule.selectedCategory?.description || '-' }}
📁
将在选中的分类下创建子分类
用于系统内部识别,建议使用英文字母或数字
数字越小排序越靠前
客户档案管理
管理客户信息档案,支持按分类筛选和搜索
新增客户
刷新
customerModule?.onFilterCategorySelect(keys)"
:show-line="{ showLeafIcon: false }"
default-expand-all
class="customer-category-tree"
style="font-size: 13px;"
>
{{ title }}
禁用
{{ customer_count }}
📋 基本信息
📞 联系信息
🏷️ 服务信息
金牌
银牌
铜牌
在用
停用
暂停
{{ 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 || '-' }}
{{ (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') || '当日无匹配工单') : '当日无匹配工单') }}
{{ (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') || '项') : '项') }}
{{ 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') || '批量导出') : '批量导出') }}
{{ record.report_code || '-' }}
{{ (window.t ? (window.t('aggregateReport.tag.stale') || '需重算') : '需重算') }}
{{ record.title || '-' }}
{{ record.customer_name || '-' }}
{{ aggregateReportModule.formatDate(record.period_start) }} ~ {{ aggregateReportModule.formatDate(record.period_end) }}
{{ (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.rejected') || '审批驳回') : '审批驳回') }}
{{ record.source_count ?? 0 }}
{{ aggregateReportModule.formatNumber(record.pass_rate, 2) }}
{ if (!v) aggregateReportModule.closeBatchExportModal(); }"
:title="(window.t ? (window.t('aggregateReport.batch.exportModalTitle') || '批量导出汇总报告') : '批量导出汇总报告')"
:confirm-loading="aggregateReportModule.batchProcessing"
@ok="aggregateReportModule.doBatchExport()"
@cancel="aggregateReportModule.closeBatchExportModal()"
:ok-text="(window.t ? (window.t('aggregateReport.batch.exportConfirm') || '导出 ZIP') : '导出 ZIP')"
width="420px"
>
PDF
Excel
中文
日本語
English
{{ (window.t ? (window.t('aggregateReport.batch.exportHint') || '将选中的 {n} 份报告打包为 ZIP 下载') : '将选中的 {n} 份报告打包为 ZIP 下载').replace('{n}', aggregateReportModule.selectedRowKeys.length) }}
{ if (!v) aggregateReportModule.closeEditModal(); }"
:title="aggregateReportModule.editFormMode === 'create' ? ((window.t ? (window.t('aggregateReport.modal.createTitle') || '新建汇总报告') : '新建汇总报告')) : (aggregateReportModule.editFormMode === 'view' ? ((window.t ? (window.t('aggregateReport.modal.viewTitle') || '汇总报告详情') : '汇总报告详情')) : ((window.t ? (window.t('aggregateReport.modal.editTitle') || '编辑汇总报告') : '编辑汇总报告')))"
:footer="null"
:mask-closable="true"
:keyboard="true"
@cancel="aggregateReportModule.closeEditModal()"
width="1200px"
wrap-class-name="aggregate-report-edit-modal-wrap"
:body-style="{ padding: '16px 24px', maxHeight: '76vh', overflowY: 'auto' }"
>
📋 {{ (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') || '选择来源工单') : '选择来源工单') }}
{{ record.equipment_name }}
{{ record.equipment_name || '-' }}
{{ record.assignee_name || '-' }}
{{ record.title || '-' }}
{{ record._isGroup ? (record.inspection_date_display || '-') : aggregateReportModule.formatDate(record.inspection_date) }}
{{ record.pass_count ?? '-' }}
{{ record.fail_count ?? '-' }}
{{ record.abnormal_count ?? '-' }}
{{ (window.t ? (window.t('common.remove') || '移除') : '移除') }}
{{ (window.t ? (window.t('aggregateReport.actions.viewWorkOrder') || '查看') : '查看') }}
⚠️ {{ (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') || '更换') : '更换') }}
{{ record.equipment_group_name || record.equipment_group_id || record.equipment_name || '-' }}
{{ record.component_equipment_name }}
{{ record.category_code }}
{{ record.category_name || '-' }}
-
{{ record.item_title || record.item_code || '-' }}
{{ (window.t ? (window.t('aggregateReport.verdict.wear') || '磨损') : '磨损') }}
{{ (window.t ? (window.t('aggregateReport.verdict.replace') || '更换') : '更换') }}
{{ record.verdict || '-' }}
{{ record.value || '-' }}
-
+{{ record.photos.length - 1 }}
📊 {{ (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') || '暂无附件') : '暂无附件') }}
✅ {{ (window.t ? (window.t('aggregateReport.approval.approvedHeader') || '汇总报告审批已通过') : '汇总报告审批已通过') }}
❌ {{ (window.t ? (window.t('aggregateReport.approval.rejectedHeader') || '汇总报告审批已驳回') : '汇总报告审批已驳回') }}
⏳ {{ (window.t ? (window.t('aggregateReport.approval.pendingHeader') || '汇总报告正在审批中') : '汇总报告正在审批中') }}
{{ (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') || '导出') : '导出') }}
▾
aggregateReportModule.onExportMenuClick(null, info)">
{{ (window.t ? (window.t('aggregateReport.actions.exportPdf') || '导出 PDF') : '导出 PDF') }}
{{ (window.t ? (window.t('aggregateReport.actions.exportExcel') || '导出 Excel') : '导出 Excel') }}
{{ (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.collapseApproval') || '收起审批详情 ↑') : '收起审批详情 ↑') }}
{{ (window.t ? (window.t('aggregateReport.actions.viewApproval') || '查看审批进度') : '查看审批进度') }} ↓
{{ (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) }}
{{ record.equipment_name }}
{{ record.equipment_name || '-' }}
{{ record.assignee_name || '-' }}
{{ record.completed_at || record.scheduled_start || '-' }}
{{ (window.t ? (window.t('aggregateReport.sourceCols.referencedYes') || '已引用') : '已引用') }}
-
{{ (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') || '重置') : '重置') }}
quotationModule.onPageChange(pag.current, pag.pageSize)"
size="middle"
:scroll="{ x: 1300, y: 'auto' }"
:sticky="true"
class="flex-table"
bordered
>
{{ quotationModule.formatDate(record.quotation_date) }}
{{ quotationModule.tt(opt.labelKey, opt.defaultLabel) }}
{{ (window.t ? (window.t('quotation.tag.writeback') || '已反写') : '已反写') }}
{{ quotationModule.formatNumber(record.total_amount, 2) }}
{ if (!v) quotationModule.closeEditForm(); }"
:title="quotationModule.editFormMode === 'create' ? ((window.t ? (window.t('quotation.modal.createTitle') || '新建报价单') : '新建报价单')) : (quotationModule.editFormMode === 'view' ? ((window.t ? (window.t('quotation.modal.viewTitle') || '报价单详情') : '报价单详情')) : ((window.t ? (window.t('quotation.modal.editTitle') || '编辑报价单') : '编辑报价单')))"
width="1100px"
:style="{ top: '24px' }"
:body-style="{ maxHeight: 'calc(100vh - 140px)', overflowY: 'auto' }"
:mask-closable="true"
:keyboard="true"
wrap-class-name="quotation-edit-modal-wrap"
:confirm-loading="quotationModule.saveLoading"
:ok-text="(window.t ? (window.t('common.save') || '保存') : '保存')"
:cancel-text="(window.t ? (window.t('common.cancel') || '取消') : '取消')"
:footer="quotationModule.isViewMode ? null : undefined"
@ok="quotationModule.saveQuotation()"
@cancel="quotationModule.closeEditForm()"
>
📋 {{ (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') || '选择关联报告') : '选择关联报告') }}
{ e && e.preventDefault && e.preventDefault(); quotationModule.removeLinkedReport(r.aggregate_report_id); }">
{{ 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') || '添加明细行') : '添加明细行') }}
{{ index + 1 }}
{{ getI18nText(record.equipment_group_name_i18n, record.equipment_group_name) || '-' }}
{{ getI18nText(record.component_equipment_name_i18n, record.component_equipment_name) || '-' }}
{{ getI18nText(record.part_name_i18n, record.part_name) }}
{{ (window.t ? (window.t('quotation.status.replaced') || '已更换') : '已更换') }}
{{ (window.t ? (window.t('quotation.status.used') || '已使用') : '已使用') }}
{{ (window.t ? (window.t('quotation.status.cancelled') || '已作废') : '已作废') }}
quotationModule.onItemAmountChange(record)">
quotationModule.onItemAmountChange(record)">
{{ quotationModule.formatNumber((Number(record.quantity)||0) * (Number(record.unit_price)||0), 2) }}
🔗{{ getI18nText(record.source_check_item_i18n, record.source_check_item) }}
-
📷 {{ quotationModule.imageCountText(record) }}
+{{ (window.t ? (window.t('quotation.actions.addPartShort') || '备件') : '备件') }}
{{ (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) }}
{ if (!v) quotationModule.reportPickerVisible = false; }"
:title="(window.t ? (window.t('quotation.reportPicker.title') || '选择关联汇总报告') : '选择关联汇总报告')"
width="800px"
@ok="quotationModule.confirmReportPicker()"
@cancel="quotationModule.reportPickerVisible = false"
:ok-text="(window.t ? (window.t('common.confirm') || '确定') : '确定')"
>
{{ record.title }}
{{ (window.t ? (window.t('quotation.reportPicker.alreadyQuoted') || '已报价') : '已报价') }}
{{ record.period_start || '-' }} ~ {{ record.period_end || '-' }}
{ if (!v) quotationModule.partPickerVisible = false; }"
:title="(window.t ? (window.t('quotation.partPicker.title') || '选择备件') : '选择备件')"
width="700px"
:footer="null"
@cancel="quotationModule.partPickerVisible = false"
>
quotationModule.setPartPickerScope(e.target.value)"
>
{{ (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 }}
{{ quotationModule.formatNumber(record.current_cost ?? record.cost_price ?? 0, 2) }}
{{ (window.t ? (window.t('common.select') || '选择') : '选择') }}
{ if (!v) quotationModule.closeImageEditor(); }"
:title="(window.t ? (window.t('quotation.image.editorTitle') || '更换前/后图片') : '更换前/后图片')"
width="620px"
:footer="null"
@cancel="quotationModule.closeImageEditor()"
>
{{ (window.t ? (window.t('quotation.image.before') || '更换前图片') : '更换前图片') }}
{{ (window.t ? (window.t('quotation.image.after') || '更换后图片') : '更换后图片') }}
{{ (window.t ? (window.t('quotation.image.afterSupplement') || '(审批后可补传完工凭证)') : '(审批后可补传完工凭证)') }}
{ if (!v) quotationModule.imagePreviewVisible = false; }"
:footer="null"
:title="null"
width="auto"
:body-style="{ padding: '8px', textAlign: 'center' }"
@cancel="quotationModule.imagePreviewVisible = false"
>
{ if (!v) quotationModule.approveModalVisible = false; }"
:title="(window.t ? (window.t('quotation.approve.title') || '审批通过') : '审批通过')"
:confirm-loading="quotationModule.transitioning"
:ok-text="(window.t ? (window.t('quotation.approve.confirmBtn') || '确认通过') : '确认通过')"
@ok="quotationModule.confirmApprove()"
@cancel="quotationModule.approveModalVisible = false"
>
{ if (!v) quotationModule.rejectModalVisible = false; }"
:title="(window.t ? (window.t('quotation.reject.title') || '驳回报价') : '驳回报价')"
:confirm-loading="quotationModule.transitioning"
:ok-text="(window.t ? (window.t('quotation.reject.confirmBtn') || '确认驳回') : '确认驳回')"
ok-type="danger"
@ok="quotationModule.confirmReject()"
@cancel="quotationModule.rejectModalVisible = false"
>
{{ (window.t ? (window.t('quotation.reject.hint') || '驳回后报价单将回到草稿状态,可修改后重新提交') : '驳回后报价单将回到草稿状态,可修改后重新提交') }}
{ if (!v) quotationModule.approvalProgressVisible = false; }"
:title="(window.t ? (window.t('quotation.approvalProgress.title') || '审批进度') : '审批进度')"
width="640px"
:footer="null"
@cancel="quotationModule.approvalProgressVisible = false"
>
{{ (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') || '审批通过/驳回请前往「审批中心」处理') : '审批通过/驳回请前往「审批中心」处理') }}
{ if (!v) quotationModule.cancelModalVisible = false; }"
:title="(window.t ? (window.t('quotation.cancel.title') || '作废报价') : '作废报价')"
:confirm-loading="quotationModule.transitioning"
:ok-text="(window.t ? (window.t('quotation.cancel.confirmBtn') || '确认作废') : '确认作废')"
ok-type="danger"
@ok="quotationModule.confirmCancel()"
@cancel="quotationModule.cancelModalVisible = false"
>
{{ (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') || '刷新') : '刷新') }}
sparePartCategoryModule.onCategorySelect(keys, info)"
@expand="(keys) => sparePartCategoryModule.onCategoryExpand(keys)"
:show-line="{ showLeafIcon: false }"
default-expand-all
style="font-size: 13px;"
>
{{ title }}
({{ code }})
{{ (window.t ? (window.t('common.disabled') || '已禁用') : '已禁用') }}
{{ (window.t ? (window.t('sparePartCategory.actions.edit') || '编辑') : '编辑') }}
{{ (window.t ? (window.t('sparePartCategory.actions.delete') || '删除') : '删除') }}
{{ sparePartCategoryModule.selectedCategory?.name }}
{{ sparePartCategoryModule.selectedCategory?.code || '-' }}
{{ sparePartCategoryModule.selectedCategory?.name_i18n?.ja || '-' }}
{{ sparePartCategoryModule.selectedCategory?.name_i18n?.en || '-' }}
{{ sparePartCategoryModule.selectedCategory?.level || 1 }}
{{ sparePartCategoryModule.selectedCategory?.is_active ? ((window.t ? (window.t('common.enabled') || '启用') : '启用')) : ((window.t ? (window.t('common.disabled') || '禁用') : '禁用')) }}
{{ sparePartCategoryModule.selectedCategory?.description || '-' }}
{{ (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') || '刷新') : '刷新') }}
supplierModule.onCategorySelect(keys, info)"
@expand="(keys) => supplierModule.onCategoryExpand(keys)"
:show-line="{ showLeafIcon: false }"
default-expand-all
style="font-size: 13px;"
>
{{ title }}
({{ code }})
已禁用
{{ (window.t ? (window.t('supplierMgmt.common.edit') || '编辑') : '编辑') }}
{{ (window.t ? (window.t('supplierMgmt.common.delete') || '删除') : '删除') }}
{{ supplierModule.selectedCategory?.name }}
{{ supplierModule.selectedCategory?.code || '-' }}
{{ supplierModule.selectedCategory?.level || 1 }}
{{ supplierModule.selectedCategory?.is_active ? ((window.t ? (window.t('supplierMgmt.common.enabled') || '启用') : '启用')) : ((window.t ? (window.t('supplierMgmt.common.disabled') || '禁用') : '禁用')) }}
{{ supplierModule.selectedCategory?.full_path || '-' }}
{{ supplierModule.selectedCategory?.description || '-' }}
📁
{{ (window.t ? (window.t('supplierMgmt.categoryPage.createChildHint') || '将在选中的分类下创建子分类') : '将在选中的分类下创建子分类') }}
{{ (window.t ? (window.t('supplierMgmt.categoryPage.codeHint') || '用于系统内部识别,建议使用英文字母或数字') : '用于系统内部识别,建议使用英文字母或数字') }}
{{ (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') || '刷新') : '刷新') }}
supplierModule.onFilterCategorySelect(keys)"
:show-line="{ showLeafIcon: false }"
default-expand-all
class="supplier-category-tree"
style="font-size: 12px;"
>
{{ title }}
{{ (window.t ? (window.t('supplierMgmt.common.disabled') || '禁用') : '禁用') }}
{{ supplier_count }}
{{ (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 || '-' }}
工时费率档案
维护人工费用的标准小时费率,供工单费用录入下拉选择
{ laborRateMgmtPagination.current = 1; loadLaborRateMgmtList(1); }"
>
刷新
新增费率
¥{{ Number(record.rate_per_hour || 0).toFixed(2) }}/h
{{ (record.effective_from || '').slice(0, 10) || '-' }}
{{ (record.effective_to || '').slice(0, 10) || '-' }}
{{ record.is_active ? '启用' : '停用' }}
★ 默认
—
{{ record.updated_at || '-' }}
编辑
设为默认
停用
工单完成时自动生成人工费用使用此费率(全局唯一)
{{ 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') || '刷新' }}
{{ dataRef.name }}
L{{ dataRef.level }}
{{ t('locationArchive.tree.customerPrefix') || '客户:' }}{{ dataRef.customer_name }}
· {{ dataRef.building }}
· {{ dataRef.floor }}
· {{ dataRef.area }}
{{ t('locationArchive.actions.addChild') || '添加子位置' }}
{{ t('locationArchive.actions.edit') || '编辑' }}
{{ t('locationArchive.actions.delete') || '删除' }}
📍
{{ t('locationArchive.empty.title') || '暂无位置数据' }}
{{ t('locationArchive.empty.description') || '点击上方"新增位置"按钮开始创建位置档案' }}
{{ 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 }}
locationModule.importFileList.value = []"
accept=".csv,.xlsx,.xls"
>
{{ t('locationArchive.importModal.chooseFile') || '选择文件' }}
{{ t('locationArchive.importModal.supported') || '支持格式' }}: CSV、Excel (xlsx/xls)
{{ t('locationArchive.importModal.requiredFields') || '必需字段' }}: name({{ t('locationArchive.importModal.nameFieldHint') || '位置名称' }})
{{ t('locationArchive.importModal.optionalFields') || '可选字段' }}: location_id、parent_location_id、area、building、floor、description
{{ t('locationArchive.importModal.sampleData') || '示例数据' }}:
| name |
area |
building |
floor |
| 车间1 |
生产区 |
A栋 |
1F |
{{ t('locationArchive.importModal.importedCount', { count: locationModule.importResult?.value?.count || 0 }) || ('成功导入: ' + (locationModule.importResult?.value?.count || 0) + ' 条') }}
{{ t('locationArchive.importModal.errorListTitle') || '错误信息:' }}
{{ t('storageLocation.title') || '仓库管理' }}
{{ t('storageLocation.subtitle') || '管理仓库、区域、货架、层位、库位的层级结构' }}
{ if (storageLocationModule) storageLocationModule.expandedKeys = keys; }"
@select="storageLocationModule?.onTreeSelect"
show-icon
block-node
>
{{ storageLocationModule.typeLabelMap[location_type] || location_type }}
{{ title }}
{{ t('storageLocation.disabled') || '停用' }}
{{ t('storageLocation.createFirst') || '创建第一个仓库' }}
{{ storageLocationModule.typeLabelMap[storageLocationModule.selectedItem?.location_type] || '' }}
{{ storageLocationModule.selectedItem?.name }}
({{ storageLocationModule.selectedItem?.code }})
{{ t('storageLocation.actions.addChild') || '新增子节点' }}
{{ t('storageLocation.actions.edit') || '编辑' }}
{{ t('storageLocation.actions.move') || '移动' }}
{{ t('storageLocation.actions.delete') || '删除' }}
{{ storageLocationModule.selectedItem?.name }}
{{ storageLocationModule.selectedItem?.code || '-' }}
{{ storageLocationModule.typeLabelMap[storageLocationModule.selectedItem?.location_type] }}
{{ storageLocationModule.selectedItem?.is_active !== false ? (t('storageLocation.detail.enabled') || '启用') : (t('storageLocation.detail.disabled') || '停用') }}
{{ storageLocationModule.selectedItem?.full_path || '-' }}
{{ storageLocationModule.selectedItem?.address || '-' }}
{{ storageLocationModule.selectedItem?.manager_name || '-' }}
{{ storageLocationModule.selectedItem?.contact_phone || '-' }}
{{ storageLocationModule.selectedItem?.department_name || storageLocationModule.getDepartmentNameById(storageLocationModule.selectedItem?.department_id) || '-' }}
{{ storageLocationModule.selectedItem?.customer_name || storageLocationModule.getCustomerNameById(storageLocationModule.selectedItem?.customer_id) || '-' }}
{{ storageLocationModule.selectedItem?.capacity != null ? storageLocationModule.selectedItem?.capacity : '-' }}
{{ storageLocationModule.selectedItem?.sort_order }}
{{ storageLocationModule.selectedItem?.description || '-' }}
{{ storageLocationModule.selectedItem?.created_at || '-' }}
{{ storageLocationModule.selectedItem?.updated_at || '-' }}
{ if (storageLocationModule) storageLocationModule.modalVisible = false; }"
:width="640"
>
{{ t('storageLocation.form.sectionBasic') || '基本信息' }}
{{ t('storageLocation.form.sectionWarehouse') || '仓库属性' }}
{ const u = (storageLocationModule.userOptions || []).find(o => o.value === val); storageLocationModule.form.manager_name = u ? u.label : ''; }"
style="width:100%;"
>
{{ u.label }}
{{ t('storageLocation.form.sectionOther') || '其他设置' }}
{ if (storageLocationModule) storageLocationModule.moveModalVisible = false; }"
>
{{ 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') || '已禁用' }}
{{ dataRef.name }}
{{ dataRef.code }}
{{ t('departmentArchive.tree.disabled') || '已禁用' }}
{{ t('departmentArchive.tree.managerPrefix') || '负责人:' }} {{ dataRef.manager_name }}
· {{ t('departmentArchive.tree.memberCount', { count: dataRef.member_count }) || (dataRef.member_count + ' 人') }}
{{ t('departmentArchive.actions.addChild') || '添加子部门' }}
{{ t('departmentArchive.actions.memberManage') || '成员管理' }}
{{ t('departmentArchive.actions.edit') || '编辑' }}
{{ dataRef.is_active ? (t('departmentArchive.actions.disable') || '禁用') : (t('departmentArchive.actions.enable') || '启用') }}
{{ t('departmentArchive.actions.delete') || '删除' }}
🏢
{{ t('departmentArchive.empty.title') || '暂无部门数据' }}
{{ t('departmentArchive.empty.description') || '点击上方"新增部门"按钮开始创建部门档案' }}
{{ t('departmentArchive.memberModal.add') || '添加成员' }}
{{ record.username }}
{{ record.name }}
{{ record.role }}
{{ record.phone }}
{{ record.email }}
{{ t('departmentArchive.memberModal.remove') || '移除' }}
{{ 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') || '收起全部' }}
{
const keys = [...(equipmentTypeModule.expandedKeys?.value || [])];
if (expanded) { keys.push(record.key); } else { const idx = keys.indexOf(record.key); if (idx > -1) keys.splice(idx, 1); }
equipmentTypeModule.onExpandKeys(keys);
}"
children-column-name="children"
:indent-size="24"
class="flex-table equipment-type-tree-table"
:loading="equipmentTypeModule.loading?.value"
:custom-row="(record) => ({
onClick: () => equipmentTypeModule.onRowClick(record),
style: equipmentTypeModule.selectedType?.value?.type_id === record.type_id ?
'background-color: #e6f7ff; cursor: pointer;' : 'cursor: pointer;'
})"
>
{{ record.type_id }}
{{ (window.formatI18nName && window.formatI18nName(record)) || record.name }}
L{{ record.level }}
{{ record.full_name || record.name }}
{{ window.formatI18nName(record) }}
{{ window.formatComponentKind ? window.formatComponentKind(record.component_kind) : record.component_kind }}
-
equipmentTypeModule.changeSort(record, v)"
size="small"
style="width: 70px;"
v-if="hasPermission('equipment:update')"
>
{{ record.sort_order }}
equipmentTypeModule.toggleActive(record, val)"
size="small"
>
{{ record.is_active ? (t('equipmentTypePage.table.yes') || '是') : (t('equipmentTypePage.table.no') || '否') }}
{{ t('equipmentTypePage.actions.addChild') || '子类型' }}
{{ t('equipmentTypePage.actions.edit') || '编辑' }}
{{ t('equipmentTypePage.actions.delete') || '删除' }}
{{ (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('equipmentTypeModal.sections.archiveFoundation') || '档案基建') : '档案基建') }}
{{ (window.t ? (window.t('equipmentTypeModal.helps.structureTemplate') || '绑定后,设备页可一键按模板展开子设备') : '绑定后,设备页可一键按模板展开子设备') }}
{{ (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') || '刷新') : '刷新') }}
{ const k = equipmentCategoryModule.expandedKeys?.value || []; if (expanded) { if (!k.includes(record.category_id)) equipmentCategoryModule.expandedKeys.value = [...k, record.category_id]; } else { equipmentCategoryModule.expandedKeys.value = k.filter(x => x !== record.category_id); } }"
:indent-size="24"
size="middle"
:scroll="{ x: 1280 }"
test-id="equipment-category-table"
>
{{ record.category_id }}
{{ (window.formatI18nName && window.formatI18nName(record)) || record.name || '-' }}
L{{ record.level || 1 }}
{{ equipmentCategoryModule.getTemplateName(record.structure_template_id) }}
—
{{ record.equipment_count || 0 }}
equipmentCategoryModule.toggleActive(record, v)"
>
{{ (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') || '全部') : '全部') }}
equipmentModelModule.onTypeTreeSelect(keys)"
>
{{ title }}
{{ (window.t ? (window.t('equipmentModel.actions.add') || '新增设备型号') : '新增设备型号') }}
{{ (window.t ? (window.t('equipmentModel.actions.refresh') || '刷新') : '刷新') }}
equipmentModelModule.onPageChange(p.current, p.pageSize)"
size="middle"
:scroll="{ x: 1520, y: 'auto' }"
:sticky="true"
class="flex-table"
test-id="equipment-model-table"
>
{{ record.code }}
{{ (window.formatI18nName && window.formatI18nName(record)) || record.name || '-' }}
{{ record.type_name || equipmentModelModule.getTypeName(record.type_id) }}
—
{{ window.formatComponentKind ? window.formatComponentKind(record.component_kind) : (record.component_kind || '') }}
{{ record.series_category_id }}
—
{{ record.equipment_count || 0 }}
equipmentModelModule.toggleActive(record, v)"
>
{{ (window.t ? (window.t('equipmentModel.form.manufacturers') || '关联制造商(可选,多选)') : '关联制造商(可选,多选)') }}
{{ (window.t ? (window.t('equipmentModel.form.addManufacturer') || '添加制造商') : '添加制造商') }}
{{ (window.t ? (window.t('common.remove') || '移除') : '移除') }}
{{ (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') || '刷新') : '刷新') }}
manufacturerModule.onPageChange(p.current, p.pageSize)"
size="middle"
:scroll="{ x: 1200, y: 'auto' }"
:sticky="true"
class="flex-table"
test-id="manufacturer-table"
>
{{ record.code || '—' }}
{{ (window.formatI18nName && window.formatI18nName(record)) || record.name }}
({{ record.short_name }})
{{ record.website }}
—
{{ record.supplier_name }}
—
{{ record.model_count || 0 }}
manufacturerModule.toggleActive(record, v)"
>
{{ (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') || '全部') : '全部') }}
equipmentModelBomModule.onTypeTreeSelect(keys)"
>
{{ title }}
{{ (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') || '有未保存修改') : '有未保存修改') }}
{{ equipmentModelBomModule.getSparePartName(record) || '-' }}
{{ (window.t ? (window.t('common.delete') || '删除') : '删除') }}
{{ (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.delete') || '删除') : '删除') }}
{{ (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') || '全部') : '全部') }}
equipmentModelPictureModule.onTypeTreeSelect(keys)"
>
{{ title }}
{{ (window.t ? (window.t('equipmentModelPicture.selectModel') || '设备型号') : '设备型号') }}
[{{ equipmentModelPictureModule.selectedModel.value.code }}] {{ equipmentModelPictureModule.localizeName(equipmentModelPictureModule.selectedModel.value) }}
{{ (window.t ? (window.t('common.refresh') || '刷新') : '刷新') }}
{{ equipmentModelPictureModule.localizeName(record) }}
{{ (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') }}
{{ record.file_type || 'file' }}
{{ (window.t ? (window.t('equipmentModelPicture.tags.cover') || '封面') : '封面') }}
{{ (window.t ? (window.t('equipmentModelPicture.buttons.setCover') || '设为封面') : '设为封面') }}
{{ (window.t ? (window.t('common.delete') || '删除') : '删除') }}
{{ (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') || '上传分类图片') : '上传分类图片') }}
{{ record.file_type || 'file' }}
[{{ record.category.code }}] {{ equipmentModelPictureModule.localizeCategoryName(record.category) }}
{{ record.category_id }}
{{ (window.t ? (window.t('common.delete') || '删除') : '删除') }}
{{ (window.t ? (window.t('equipmentTag.title') || '设备标签档案') : '设备标签档案') }}
{{ (window.t ? (window.t('equipmentTag.subtitle') || '管理设备标签,用于对设备进行分类和标记') : '管理设备标签,用于对设备进行分类和标记') }}
{{ (window.t ? (window.t('equipmentTag.addTag') || '新增标签') : '新增标签') }}
{{ (window.t ? (window.t('equipmentTag.refresh') || '刷新') : '刷新') }}
{{ bim3DLoadingText }}
{{ current3DFile.display_name || current3DFile.name }}
({{ formatFileSize(current3DFile.size) }})
❌ {{ t('bim.viewer.preview_3d.loading_failed') }}
{{ bim3DPreviewError }}
{{ t('bim.viewer.preview_3d.retry') }}
{{ t('bim.viewer.preview_3d.open_in_new_window') }}
{ annotateSearch = val; refreshAnnotatedList(); }"
@change="(val) => { if (val) { selectAnnotatedItem(String(val)); } }"
allow-clear>
{ refreshAnnotatedList(); }">{{ 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)) }) }}
{ refreshAnnotatedList(); }">{{ t('bim.viewer.preview_3d.load_annotations') }}
{ clear3DSelection(); refreshAnnotatedList(); }">{{ t('bim.viewer.preview_3d.clear_selection') }}
{{ t('bim.viewer.preview_3d.delete_annotation') }}
highlightAnnotatedItem(item.elementId)" @click="() => selectAnnotatedItem(item.elementId)" style="cursor:pointer;">
{{ t('bim.viewer.preview_3d.selected') }}
{{ t('bim.viewer.preview_3d.reset_view') }}
{{ t('bim.viewer.preview_3d.wireframe_mode') }}
{{ t('bim.viewer.preview_3d.auto_rotate') }}
{{ t('bim.viewer.preview_3d.manual_control') }}
{{ 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.clearFilter') }}
{{ toolModule.selectedTypeName.value }}
toolModule.onSelectTypeTree(keys, info)"
@expand="(keys) => toolModule.onExpandTypeTree(keys)"
:show-line="{ showLeafIcon: false }"
:block-node="true">
{{ title }}
{{ count }}
{{ 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') }}
{{ record.request_id }}
{{ record.title }}
{{ (record.status === 'pending_approval' && record.approval_status === 'returned_to_submitter')
? t('purchaseRequest.status.returned')
: t('purchaseRequest.status.' + (record.status === 'pending_approval' ? 'pendingApproval' : record.status)) }}
{{ record.total_amount != null ? '¥' + record.total_amount : '-' }}
{{ prModule.formatTriggerType(record.trigger_type) }}
{{ record.created_by_name || record.created_by }}
{{ record.created_at }}
{{ t('common.detail') || '详情' }}
{{ t('common.edit') || '编辑' }}
{{ t('purchaseRequest.actions.submit') }}
{{ t('purchaseRequest.actions.resubmit') }}
📦 {{ t('purchaseRequest.actions.registerReceipt') }}
{{ prModule.selectedRequest.value.request_id }}
{{ (prModule.selectedRequest.value.status === 'pending_approval' && prModule.selectedRequest.value.approval_status === 'returned_to_submitter')
? t('purchaseRequest.status.returned')
: t('purchaseRequest.status.' + (prModule.selectedRequest.value.status === 'pending_approval' ? 'pendingApproval' : prModule.selectedRequest.value.status)) }}
{{ prModule.selectedRequest.value.title }}
{{ t('purchaseRequest.priority.' + (prModule.selectedRequest.value.priority || 'normal')) || prModule.selectedRequest.value.priority || '普通' }}
{{ prModule.selectedRequest.value.department_id || '-' }}
{{ prModule.selectedRequest.value.equipment_id }}
-
{{ prModule.selectedRequest.value.work_order_id }}
-
{{ prModule.selectedRequest.value.total_amount != null ? '¥' + prModule.selectedRequest.value.total_amount : '-' }}
{{ prModule.selectedRequest.value.created_by_name || prModule.selectedRequest.value.created_by }}
{{ prModule.selectedRequest.value.expected_date || '-' }}
{{ prModule.selectedRequest.value.created_at }}
{{ prModule.selectedRequest.value.remark || '-' }}
{{ t('approvalDrawer.title') || '审批详情' }}
{{ t('approvalDrawer.status.pending') }}
{{ t('approvalDrawer.status.approved') }}
{{ t('approvalDrawer.status.rejected') }}
{{ t('approvalDrawer.status.cancelled') }}
{{ t('workorder.detail.approval.cancelApproval') || '撤销审批' }}
{{ t('workorder.detail.approval.resubmitApproval') || '🔄 重新提交审批' }}
{{ prModule.approvalRecord.value.workflow_name || (t('workorder.detail.approval.defaultWorkflow') || '默认流程') }}
{{ prModule.approvalRecord.value.status === 'pending' ? (t('workorder.detail.approval.status.pending') || '审批中') : prModule.approvalRecord.value.status === 'approved' ? (t('workorder.detail.approval.status.approved') || '已通过') : prModule.approvalRecord.value.status === 'returned_to_submitter' ? '已退回(待修改)' : prModule.approvalRecord.value.status === 'returned_to_node' ? '已退回(待重审)' : (t('workorder.detail.approval.status.rejected') || '已拒绝') }}
{{ prModule.approvalRecord.value.created_by_name || prModule.approvalRecord.value.created_by }}
{{ prModule.approvalRecord.value.created_at ? new Date(prModule.approvalRecord.value.created_at).toLocaleString(getLocale ? getLocale() : undefined) : '' }}
{{ t('workorder.detail.approval.history') || '审批历史' }}
{{ t('workorder.detail.approval.step') || '步骤' }} {{ step.step_number }}: {{ step.step_name }}
{{ step.approve_mode === 'all' ? '会签' : '或签' }}
{{ 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') ? '已退回' : step.status === 'cancelled' ? '已撤销' : step.status }}
{{ t('workorder.detail.approval.comment') || '意见' }}: {{ step.comments }}
{{ new Date(step.approved_at).toLocaleString(getLocale ? getLocale() : undefined) }}
{{ t('workorder.detail.approval.noSteps') || '暂无审批步骤记录' }}
{{ t('workorder.detail.approval.noRecord') || '暂无审批记录' }}
{{ t('purchaseRequest.form.sparePart') }}
{{ record.part_no || '-' }}
{{ record.amount || ((record.quantity || 0) * (record.unit_price || 0)).toFixed(2) }}
{{ t('purchaseRequest.receipt.title') || '到货记录' }}
{{ t('purchaseRequest.actions.registerReceipt') || '登记到货' }}
{{ p.spare_part_name || p.spare_part_id }}
{{ p.received_qty }} / {{ p.ordered_qty }}
{{ t('purchaseRequest.logActions.inbound') || '入库' }}
{{ r.received_at ? new Date(r.received_at).toLocaleString(getLocale ? getLocale() : undefined) : '' }}
·
{{ r.received_by_name || r.received_by || '-' }}
·
{{ r.storage_location_name }}
·
{{ t('purchaseRequest.receipt.columns.batchNo') }}: {{ r.batch_no }}
{{ it.spare_part_name || it.spare_part_id }} × {{ it.received_qty }}
{{ r.remark }}
{{ t('purchaseRequest.receipt.noReceipt') || '暂无到货记录' }}
{{ t('purchaseRequest.detail.operationLog') || '操作日志' }}
{{ t('purchaseRequest.logActions.' + log.action) || log.action }}
{{ log.actor_name || log.actor_id || '-' }}
{{ log.from_status }} → {{ log.to_status }}
{{ log.message }}
{{ log.created_at ? new Date(log.created_at).toLocaleString(getLocale ? getLocale() : undefined) : '' }}
{{ t('purchaseRequest.detail.noLog') || '暂无操作日志' }}
{{ 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') || '小计' }}
{ item.spare_part_id = ''; item.spare_part_name = ''; prModule.loadSparePartOptions('', val || null); }"
style="width:100%;"
>
{ if (open) prModule.loadSparePartOptions('', item.category_id || null); }"
@search="(kw) => prModule.loadSparePartOptions(kw || '', item.category_id || null)"
@change="(val) => prModule.onSparePartSelect(item, val)"
style="width:100%;"
>
¥{{ ((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') || '筛选用户' }}:
{ certModule.loadCertifications(val || null); certModule.loadStatistics(val || null); }" show-search
:filter-option="(input, option) => (option.label || '').toLowerCase().includes(input.toLowerCase())">
{{ u.name }} ({{ u.username }})
{{ t('certification.create') || '添加证书' }}
{{ record.user_name || '-' }}
{{ record.name }}
{{ certModule.getQualificationTypeLabel(record) || record.qualification_type_id }}
-
{{ record.certification_no || '-' }}
{{ record.certification_type }}
{{ record.issuing_authority || '-' }}
{{ record.expiry_date || '-' }}
{{ t('certification.statusLabel.' + record.status) || record.status }}
{{ record.attachment_count }}
-
{{ t('common.edit') || '编辑' }}
{{ t('common.delete') || '删除' }}
{{ record.user_name || '-' }}
{{ record.name }}
{{ certModule.getQualificationTypeLabel(record) || record.qualification_type_id }}
-
{{ record.certification_no || '-' }}
{{ record.expiry_date }}
{{ record.days_left }} {{ t('certification.daysUnit') }}
{{ t('certification.statusLabel.' + record.status) || record.status }}
{{ record.attachment_count }}
-
{{ t('common.edit') || '编辑' }}
{{ t('certification.form.sectionBasic') || '基本信息' }}
{{ u.name }} ({{ u.username }})
{{ t('certification.form.sectionValidity') || '有效期' }}
{{ t('certification.attachment.scan') }}
{{ t('certification.attachment.upload') }}
JPG / PNG / PDF, max 10MB
{{ t('certification.attachment.noAttachment') }}
{{ 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') || '显示当前筛选条件下的全部课程') : '显示当前筛选条件下的全部课程' }}
{{ c.name }}
{{ c.code || c.category_id }}
{{ trainingModule.formatCategoryType(c.type) }}
{{ c.description }}
{{ 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') || '课程资料优先取知识库已发布内容') : '课程资料优先取知识库已发布内容' }}
{{ trainingModule.categoryNameById.value[record.category_id] || '-' }}
{{ record.course_type }}
{{ record.is_mandatory ? '必修' : '选修' }}
{{ trainingModule.getCourseQuizStatusLabel(record) }}
{{ record.status }}
{{ window.t ? (window.t('training.btn.newPlan') || '新建计划') : '新建计划' }}
{{ (record.course_ids || []).length }}
{{ record.status }}
trainingModule.setRecordScope(e.target.value)">
{{ 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') || '刷新') : '刷新' }}
{{ trainingModule.userNameById.value[record.user_id] || record.user_id }}
{{ record.user_id }}
{{ record.is_mandatory ? ((window.t ? window.t('training.mandatory.yes') : '') || '必修') : ((window.t ? window.t('training.mandatory.no') : '') || '选修') }}
{{ trainingModule.getRecordQuizTag(record) }}
{{ trainingModule.getRecordStatusLabel(record.status) }}
{{ record.score }}
{{ record.best_passed_score_pct }}
{{ record.last_attempt_score }}
{{ window.t ? (window.t('training.attempt.failed') || '未通过') : '未通过' }}
-
trainingModule.loadPersonalMap(uid)">
trainingModule.loadPersonalMap()">{{ window.t ? (window.t('training.btn.myMap') || '查看我的地图') : '查看我的地图' }}
{{ record.is_mandatory ? '必修' : '选修' }}
{{ record.status }}
{{ 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') || '判断') : '判断' }}
trainingModule.showQuestionCreate(trainingModule.questionFilters.course_id)">
+ {{ window.t ? (window.t('training.question.addQuestion') || '新建题目') : '新建题目' }}
trainingModule.showAIGenerate(trainingModule.questionFilters.course_id)">
✨ {{ window.t ? (window.t('training.question.aiGenerate') || 'AI 出题') : 'AI 出题' }}
{{ record.qtype === 'single' ? (window.t ? (window.t('training.question.single') || '单选') : '单选') : (record.qtype === 'multiple' ? (window.t ? (window.t('training.question.multiple') || '多选') : '多选') : (window.t ? (window.t('training.question.boolean') || '判断') : '判断')) }}
{{ record.status }}
{{ window.t ? (window.t('common.edit') || '编辑') : '编辑' }}
{{ window.t ? (window.t('training.question.approve') || '通过') : '通过' }}
{{ window.t ? (window.t('training.question.reject') || '驳回') : '驳回' }}
EN
JA
{{ window.t ? (window.t('common.delete') || '删除') : '删除' }}
{{ window.t ? (window.t('common.refresh') || '刷新') : '刷新' }}
{{ record.wrong_count }} / {{ record.total_count }}
{{ ((record.wrong_rate || 0) * 100).toFixed(1) }}%
{{ 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(trainingModule.getQualificationTypeById(value)?.kind) }}
{{ trainingModule.getQualificationTypeLabel(value) }}
[法规]
{{ 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') || '困难') : '困难' }}
{{ 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') || '判断') : '判断' }}
{{ window.t ? (window.t('training.translation.markApproved') || '标记为已审核') : '标记为已审核' }}
{{ window.t ? (window.t('common.close') || '关闭') : '关闭' }}
{{ window.t ? (window.t('training.attempt.retry') || '再考一次') : '再考一次' }}
{{ window.t ? (window.t('training.attempt.submit') || '交卷') : '交卷' }}
⏱ {{ 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') || '可点击下方"再考一次"重新尝试,或关闭窗口。') : '可点击下方"再考一次"重新尝试,或关闭窗口。' }}
{{ idx + 1 }}.
{{ q.qtype === 'single' ? (window.t ? (window.t('training.question.single') || '单选') : '单选') : (q.qtype === 'multiple' ? (window.t ? (window.t('training.question.multiple') || '多选') : '多选') : (window.t ? (window.t('training.question.boolean') || '判断') : '判断')) }}
{{ q.stem }}
{ trainingModule.attemptAnswers.value[q.question_id] = [e.target.value]; }">
{{ opt.key }}. {{ opt.text }}
{ trainingModule.attemptAnswers.value[q.question_id] = v; }">
{{ opt.key }}. {{ opt.text }}
{{ 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') || '新建课时') : '新建课时' }}
{{ record.content_type }}
{{ record.is_required ? (window.t ? (window.t('training.lesson.yes') || '是') : '是') : (window.t ? (window.t('training.lesson.no') || '否') : '否') }}
{{ 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') || '请从左侧选择课时开始学习') : '请从左侧选择课时开始学习' }}
📘 {{ trainingModule.lessonStudyKnowledge.value.title || trainingModule.lessonStudyKnowledge.value.name || '' }}
{{ trainingModule.lessonStudyKnowledge.value.summary }}
{{ window.t ? (window.t('training.lesson.knowledgeNotFound') || '关联的知识库内容未找到或无访问权限') : '关联的知识库内容未找到或无访问权限' }}
{{ window.t ? (window.t('training.lesson.noMediaUrl') || '未配置媒体URL') : '未配置媒体URL' }}
{{ window.t ? (window.t('training.lesson.noMediaUrl') || '未配置媒体URL') : '未配置媒体URL' }}
{{ trainingModule.lessonStudyCurrent.value.media_url }}
{{ window.t ? (window.t('training.lesson.noMediaUrl') || '未配置媒体URL') : '未配置媒体URL' }}
{{ t('shiftTemplate.title') || '班次模板管理' }}
{{ t('shiftTemplate.subtitle') || '维护班次编制规则与部门授权' }}
stplState.toggleExpand(record)">
{{ record.name }}
{{ record.start_time }} ~ {{ record.end_time }}
{{ t('shiftSchedule.crossesMidnight') || '跨夜' }}
{{ t('shiftSchedule.category.' + (record.category || 'day')) || record.category }}
{{ t('shiftTemplate.globalTemplate') || '全局' }}
{{ stplState.deptName(record.department_id) }}
{{ t('shiftTemplate.allDepartments') || '全部门可用' }}
{{ t('shiftTemplate.ownerOnly') || '仅归属部门' }}
{{ stplState.deptName(did) }}
+{{ stplState.allUsableDepts(record).length - 2 }}
{{ t('certification.type.' + (certType === 'special_equipment' ? 'specialEquipment' : certType)) || certType }}
-
{{ record.is_active ? '✓' : '✗' }}
{{ t('shiftTemplate.expand.usableIn') || '可被以下部门使用:' }}
{{ record.department_id ? (t('shiftTemplate.ownerOnly') || '仅归属部门可用') : (t('shiftTemplate.allDepartments') || '全部门可用(全局模板)') }}
{{ stplState.deptName(did) }}
({{ t('shiftTemplate.owner') || '归属' }})
{{ 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') || '归属' }}
✓
stplState.setBound(tpl.template_id, dept.department_id, e.target.checked)">
|
|
{{ 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') || '清空' }}
<
{{ ssModule.currentMonth.value }}
>
<
{{ ssModule.currentWeekStart.value }}
>
<
{{ ssModule.currentDay.value }}
>
{{ t('shiftSchedule.undo') }}
{{ t('shiftSchedule.redo') }}
{{ t('shiftSchedule.batchCreate') }}
{{ t('shiftSchedule.publish') }}
{{ t('shiftSchedule.unpublish') }}
{{ t('shiftSchedule.copyToDepartment.button') || '复制到其他部门' }}
{{ t('shiftSchedule.export') }}
{ ssModule.toggleIncludeSubtree(); ssModule.refreshActiveView(); }"
style="margin-left:8px;">
{{ t('shiftSchedule.includeSubtree') || '含下级部门' }}
{{ 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.form.selectDepartment') }}
{{ t('shiftSchedule.messages.noData') }}
{{ t('shiftSchedule.form.selectDepartment') }}
{{ t('shiftSchedule.messages.noData') }}
{{ t('shiftSchedule.hourCoverage') }}
ssModule.onGanttWrapperContextMenu(e)">
{{ t('shiftSchedule.columns.name') }}
ssModule.onGanttRowContextMenu(e, row)">
{{ row.user_name }}
{{ row.shifts.length }}
ssModule.onGanttBarMouseDown(e, sh, 'move')"
@dblclick="ssModule.openDurationEdit(sh)"
@contextmenu.prevent.stop="(e) => ssModule.onGanttBarContextMenu(e, sh)">
ssModule.onGanttBarMouseDown(e, sh, 'resize-l')">
{{ sh.template_name }}
{{ ssModule.ganttPreviewText(sh) }}
ssModule.onGanttBarMouseDown(e, sh, 'resize-r')">
{{ t('shiftSchedule.messages.noData') }}
{{ t('shiftSchedule.form.selectDepartment') }}
{{ t('shiftSchedule.messages.noData') }}
{{ text }}
{{ t('shiftSchedule.action.' + text) || text }}
{{ record.user_name }}
{{ record.user_id }}
—
{{ text }}
—
{{ record.before_summary }}
—
{{ record.after_summary }}
—
{{ text }}
—
{{ record.operator_name }}
{{ record.operator_id }}
—
{{ 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) }}
ssModule.setRuleEnabled(rt, v)">
{{ 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') }}
{{ record.is_active !== false ? (t('system.permission.user.active') || '启用') : (t('system.permission.user.disabled') || '停用') }}
{{ record.department_name }}
{{ t('system.permission.user.unassigned') }}
{{ record.email }}
-
{{ t('system.permission.common.edit') }}
{{ t('system.permission.user.assignRole') }}
{{ t('system.permission.user.resetPassword') }}
{{ record.is_active !== false ? (t('system.permission.user.disable') || '停用') : (t('system.permission.user.enable') || '启用') }}
{{ t('system.permission.common.delete') }}
{{ 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') }}
{{ permModule.getModuleName(module) }}
{{ permModule.getModuleSelectedCount(module) }}/{{ permModule.permissionsByModule[module]?.length || 0 }}
{ if(e.target.checked) { permModule.selectedPermissions.push(perm.code); } else { const idx = permModule.selectedPermissions.indexOf(perm.code); if(idx > -1) permModule.selectedPermissions.splice(idx, 1); } }"
:style="{
margin: 0,
padding: '2px 6px',
borderRadius: '4px',
background: permModule.selectedPermissions?.includes(perm.code) ? '#e6f7ff' : 'transparent'
}"
>
{{ perm.name }}📱
👈
{{ 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') }}
{{ record.target_type === 'role' ? t('system.permission.data.targetType.role') : t('system.permission.data.targetType.user') }}
{{ permModule.getDataRuleTargetLabel(record) }}
{{ permModule.getScopeTypeName(record.scope_type) }}
{{ t('system.permission.common.edit') }}
{{ t('system.permission.common.delete') }}
-
📊 {{ t('system.permission.data.scopeLabel') }}
{{ permModule.getScopeTypeName(group.scope_type) }}
{{ t('system.permission.data.count.department', { count: group.conditions.department_ids.length }) }}
{{ t('system.permission.data.count.location', { count: group.conditions.location_ids.length }) }}
{{ t('system.permission.data.count.equipmentType', { count: group.conditions.equipment_type_ids.length }) }}
📦 {{ t('system.permission.data.resourceLabel') }}
{{ 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.noRoles') }}
{{ permModule.getPermissionName(perm) || perm.split(':')[1] || perm }}
{{ (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.statusOptions.' + text) : text) }}
{{ (window.t ? (window.t('equipmentInventory.actions.viewItems') || '查看明细') : '查看明细') }}
{{ (window.t ? (window.t('equipmentInventory.actions.viewDiff') || '差异报表') : '差异报表') }}
{{ (window.t ? (window.t('equipmentInventory.actions.start') || '开始盘点') : '开始盘点') }}
{{ (window.t ? (window.t('equipmentInventory.actions.complete') || '完成盘点') : '完成盘点') }}
{{ (window.t ? (window.t('common.delete') || '删除') : '删除') }}
{{ (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.exportItems') || '导出明细') : '导出明细') }}
{{ (window.t ? (window.t('common.close') || '关闭') : '关闭') }}
{{ record.location_name || record.expected_location_id || '-' }}
{{ record.actual_location_name || record.actual_location_id || '-' }}
{{ inventoryStatusLabel(record.actual_status) }}
运行
停机
维护
故障
待机
预留
{{ record.remark || '' }}
{{ inventoryResultLabel(record) }}
{{ record.counted_by_name || record.counted_by || '-' }}
{{ record.counted_at ? record.counted_at.replace('T', ' ').slice(0, 19) : '-' }}
{{ (window.t ? (window.t('equipmentInventory.actions.confirmCount') || '确认') : '确认') }}
{{ (window.t ? (window.t('equipmentInventory.actions.counted') || '已盘') : '已盘') }}
{{ (window.t ? (window.t('equipmentInventory.actions.batchUpdateLocation') || '批量更新位置') : '批量更新位置') }}
{{ (window.t ? (window.t('equipmentInventory.actions.batchUpdateStatus') || '批量更新状态') : '批量更新状态') }}
{{ (window.t ? (window.t('equipmentInventory.actions.exportDiff') || '导出差异明细') : '导出差异明细') }}
{{ inventoryResultLabel(record) }}
{{ record.expected_location_name || record.expected_location_id || '-' }}
{{ record.actual_location_name || record.actual_location_id || '-' }}
{{ inventoryStatusLabel(record.expected_status) }}
{{ inventoryStatusLabel(record.actual_status) }}
{{ (window.t ? (window.t('equipmentInventory.actions.registerSurplus') || '登记设备') : '登记设备') }}
{{ (window.t ? (window.t('equipmentInventory.actions.markDeficit') || '标记异常') : '标记异常') }}
{{ (window.t ? (window.t('equipmentInventory.actions.updateLocation') || '更新位置') : '更新位置') }}
{{ (window.t ? (window.t('equipmentInventory.actions.updateStatus') || '更新状态') : '更新状态') }}
{{ (window.t ? (window.t('labelManagement.title') || '标签管理') : '标签管理') }}
{{ (window.t ? (window.t('labelManagement.batchPrint') || '批量打印') : '批量打印') }}
{ labelState.editingId = null; resetLabelForm(); labelState.showCreateModal = true; }" v-if="hasPermission('label:manage')">
{{ (window.t ? (window.t('labelManagement.createTemplate') || '新建模板') : '新建模板') }}
{{ (window.t ? (window.t('labelManagement.targetTypes.' + text) || text) : text) }}
{{ record.width_mm }}×{{ record.height_mm }}mm
{{ (window.t ? (window.t('labelManagement.barcodeTypes.' + text) || text) : text) }}
{{ text ? '✓' : '-' }}
{{ (window.t ? (window.t('labelManagement.actions.preview') || '预览') : '预览') }}
{{ (window.t ? (window.t('common.edit') || '编辑') : '编辑') }}
{{ (window.t ? (window.t('common.delete') || '删除') : '删除') }}
{{ (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') || '创建借用申请') : '创建借用申请') }}
{{ (window.t ? (window.t('sparePartCategory.treeTitle') || '备件分类') : '备件分类') }}
{ const selectedKey = Array.isArray(keys) ? keys[0] : keys; borrowState.categoryFilter = selectedKey && selectedKey !== '__all_borrow_parts__' ? selectedKey : null; borrowState.page = 1; loadBorrowList(); }"
@expand="(keys) => sparePartCategoryModule.onCategoryExpand((keys || []).filter(k => k !== '__all_borrow_parts__'))">
{{ title }}
{{ title }}
{{ (window.t ? (window.t('sparePartBorrow.statusOptions.' + text) || text) : text) }}
{{ (window.t ? (window.t('sparePartBorrow.actions.logs') || '日志') : '日志') }}
{{ (window.t ? (window.t('sparePartBorrow.actions.approve') || '审批') : '审批') }}
{{ (window.t ? (window.t('sparePartBorrow.actions.reject') || '拒绝') : '拒绝') }}
{{ (window.t ? (window.t('sparePartBorrow.actions.lend') || '借出') : '借出') }}
{{ (window.t ? (window.t('sparePartBorrow.actions.return') || '归还') : '归还') }}
{{ (window.t ? (window.t('sparePartBorrow.actions.cancel') || '取消') : '取消') }}
{ borrowState.form.spare_part_id = ''; searchSparePartsForBorrow('', val || null); }"
style="width:100%"
>
{ if (open) searchSparePartsForBorrow('', borrowState.form.category_id || null); }"
@search="(kw) => searchSparePartsForBorrow(kw || '', borrowState.form.category_id || null)" :placeholder="(window.t ? (window.t('sparePartBorrow.form.sparePartPlaceholder') || '请选择备件') : '请选择备件')" style="width:100%" allow-clear>
{{ 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.' + text) || text) : text) }}
{{ record.created_by_username || record.created_by_name || '-' }}
{{ record.department_name || record.department_id || '-' }}
{{ (window.t ? (window.t('shiftHandover.statusOptions.' + text) || text) : text) }}
{{ (window.t ? (window.t('shiftHandover.actions.detail') || '详情') : '详情') }}
{{ (window.t ? (window.t('common.edit') || '编辑') : '编辑') }}
{{ (window.t ? (window.t('shiftHandover.actions.submit') || '提交') : '提交') }}
{{ (window.t ? (window.t('common.delete') || '删除') : '删除') }}
{{ (window.t ? (window.t('shiftHandover.shiftTypes.morning') || '早班') : '早班') }}{{ (window.t ? (window.t('shiftHandover.shiftTypes.afternoon') || '中班') : '中班') }}{{ (window.t ? (window.t('shiftHandover.shiftTypes.night') || '晚班') : '晚班') }}
{ if (!handoverState.userOptions || handoverState.userOptions.length === 0) searchUsersForHandover(''); }">
{{ u.username ? `${u.name} (${u.username})` : (u.name || u.user_id) }}
{{ getPendingItemDisplay(item) }}
@{{ item.assignee }}
编辑:{{ getPendingItemDisplay(handoverState.form.pending_items[handoverState.expandedPendingIdx]) }}
{ if (!handoverState.userOptions || handoverState.userOptions.length === 0) searchUsersForHandover(''); }">
{{ u.name }} ({{ u.username }})
{{ (window.t ? (window.t('shiftHandover.pendingStatus.pending') || '待办') : '待办') }}
{{ (window.t ? (window.t('shiftHandover.pendingStatus.done') || '完成') : '完成') }}
收起
{{ (window.t ? (window.t('common.close') || '关闭') : '关闭') }}
{{ (window.t ? (window.t('shiftHandover.actions.print') || '打印') : '打印') }}
{{ 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') || '待办事项') : '待办事项') }}
{{ getPendingItemDisplay(record) }}
{{ (window.t ? (window.t('shiftHandover.pendingStatus.' + text) || text) : text) }}