|
@@ -172,7 +172,7 @@ export const EQUIPMENT_SECTION_PANELS = [
|
|
|
{ name: 'metrics', label: '最新指标', kind: 'metrics' },
|
|
{ name: 'metrics', label: '最新指标', kind: 'metrics' },
|
|
|
{ name: 'warnings', label: '预警信息', kind: 'events' },
|
|
{ name: 'warnings', label: '预警信息', kind: 'events' },
|
|
|
{ name: 'alarms', label: '报警信息', kind: 'events' },
|
|
{ name: 'alarms', label: '报警信息', kind: 'events' },
|
|
|
- { name: 'workOrders', label: '工单状态', kind: 'orders' },
|
|
|
|
|
|
|
+ { name: 'workOrders', label: '工单信息', kind: 'orders' },
|
|
|
{ name: 'latestImage', label: '设备图片', kind: 'image', mergedInto: 'archive' },
|
|
{ name: 'latestImage', label: '设备图片', kind: 'image', mergedInto: 'archive' },
|
|
|
]
|
|
]
|
|
|
|
|
|
|
@@ -190,7 +190,7 @@ export const EQUIPMENT_TABS = [
|
|
|
{ name: 'metrics', label: '最新指标', sections: ['metrics'] },
|
|
{ name: 'metrics', label: '最新指标', sections: ['metrics'] },
|
|
|
{ name: 'warnings', label: '预警信息', sections: ['warnings'] },
|
|
{ name: 'warnings', label: '预警信息', sections: ['warnings'] },
|
|
|
{ name: 'alarms', label: '报警信息', sections: ['alarms'] },
|
|
{ name: 'alarms', label: '报警信息', sections: ['alarms'] },
|
|
|
- { name: 'workOrders', label: '工单状态', sections: ['workOrders'] },
|
|
|
|
|
|
|
+ { name: 'workOrders', label: '工单信息', sections: ['workOrders'] },
|
|
|
]
|
|
]
|
|
|
|
|
|
|
|
/** 默认页签(维护者点名「设备档案(默认)」)。 */
|
|
/** 默认页签(维护者点名「设备档案(默认)」)。 */
|
|
@@ -420,8 +420,9 @@ export function eventRows(data) {
|
|
|
code: event.code || DETAIL_PLACEHOLDER,
|
|
code: event.code || DETAIL_PLACEHOLDER,
|
|
|
codeText: event.codeText || '编码未提供',
|
|
codeText: event.codeText || '编码未提供',
|
|
|
name: eventNameText(event.name) || DETAIL_PLACEHOLDER,
|
|
name: eventNameText(event.name) || DETAIL_PLACEHOLDER,
|
|
|
- // 卡片标题用单号;名称很多时候等于单号,重复显示没有信息量,改为「预告描述」。
|
|
|
|
|
- title: event.codeText || event.code || DETAIL_PLACEHOLDER,
|
|
|
|
|
|
|
+ // 卡片标题用业务单号;报警普遍没有业务编号(只有 alarmId 主键哈希),
|
|
|
|
|
+ // 那种情况下退回设备编码,绝不把内部主键印到界面上(维护者 2026-11-13)。
|
|
|
|
|
+ title: event.codeText || event.deviceCode || event.code || DETAIL_PLACEHOLDER,
|
|
|
description: describeEvent(event),
|
|
description: describeEvent(event),
|
|
|
// 等级名称取后端字典(alert_level / alarm_level)下发的标签;
|
|
// 等级名称取后端字典(alert_level / alarm_level)下发的标签;
|
|
|
// 缺失时明确说「未提供」,不拿「N 级」冒充字典口径。
|
|
// 缺失时明确说「未提供」,不拿「N 级」冒充字典口径。
|
|
@@ -476,6 +477,20 @@ export function workOrderRows(data) {
|
|
|
stateName: workOrderStateName(order.stateCode) || (/[\u3400-\u9fff]/u.test(order.stateName || '') ? order.stateName : '状态未知'),
|
|
stateName: workOrderStateName(order.stateCode) || (/[\u3400-\u9fff]/u.test(order.stateName || '') ? order.stateName : '状态未知'),
|
|
|
typeName: order.orderTypeName || '',
|
|
typeName: order.orderTypeName || '',
|
|
|
description: order.description || '',
|
|
description: order.description || '',
|
|
|
|
|
+ // 维护者 2026-11-13:卡片按管理端样式展示(工单号/描述/关联设备/设备位置/故障时间)。
|
|
|
|
|
+ title: order.code || DETAIL_PLACEHOLDER,
|
|
|
|
|
+ deviceLabel: [order.deviceName, order.deviceCode ? `(${order.deviceCode})` : ''].filter(Boolean).join('') || DETAIL_PLACEHOLDER,
|
|
|
|
|
+ deviceLocation: order.deviceLocation || DETAIL_PLACEHOLDER,
|
|
|
|
|
+ faultTimeText: formatEventTime(order.faultTime),
|
|
|
|
|
+ // 详情要用的其余字段原样带到行视图(组件不回头翻领域对象)。
|
|
|
|
|
+ deviceTypeName: order.deviceTypeName || '',
|
|
|
|
|
+ orderLevel: order.orderLevel ?? null,
|
|
|
|
|
+ orderLevelName: order.orderLevelName || '',
|
|
|
|
|
+ receiveUserName: order.receiveUserName || '',
|
|
|
|
|
+ verifyUserName: order.verifyUserName || '',
|
|
|
|
|
+ maintenanceBeforeImages: order.maintenanceBeforeImages || [],
|
|
|
|
|
+ maintenanceAfterImages: order.maintenanceAfterImages || [],
|
|
|
|
|
+ delayApply: order.delayApply || null,
|
|
|
associationText: order.associatedWithCurrentEvent === true ? '已关联当前事件'
|
|
associationText: order.associatedWithCurrentEvent === true ? '已关联当前事件'
|
|
|
: order.associatedWithCurrentEvent === false ? '未关联当前事件' : '当前事件关联关系未发布',
|
|
: order.associatedWithCurrentEvent === false ? '未关联当前事件' : '当前事件关联关系未发布',
|
|
|
createTime: order.createTime || '',
|
|
createTime: order.createTime || '',
|
|
@@ -660,18 +675,36 @@ export function eventDetailRows(row) {
|
|
|
export function workOrderDetailRows(row) {
|
|
export function workOrderDetailRows(row) {
|
|
|
const current = row || {}
|
|
const current = row || {}
|
|
|
return detailRowList([
|
|
return detailRowList([
|
|
|
- detailRow(TIME_LABELS.workOrderCreated, current.createTime, true),
|
|
|
|
|
detailRow('状态', current.stateName, true),
|
|
detailRow('状态', current.stateName, true),
|
|
|
- detailRow('来源', current.source || current.typeName, true),
|
|
|
|
|
- detailRow('关联对象', current.associationText, true),
|
|
|
|
|
- detailRow('编码', current.code),
|
|
|
|
|
- detailRow('计划结案', current.planFinishTime),
|
|
|
|
|
- detailRow('实际结案', current.realFinishTime, true),
|
|
|
|
|
- detailRow('说明', current.description),
|
|
|
|
|
|
|
+ detailRow('故障描述', current.description, true),
|
|
|
|
|
+ detailRow('优先级', current.orderLevelName || (current.orderLevel !== null && current.orderLevel !== undefined ? `${current.orderLevel} 级` : '')),
|
|
|
|
|
+ detailRow('故障发生时间', current.faultTimeText || current.timeText, true),
|
|
|
|
|
+ detailRow('计划完成时间', formatEventTime(current.planFinishTime)),
|
|
|
|
|
+ detailRow('设备名称', current.deviceLabel),
|
|
|
|
|
+ detailRow('设备类型', current.deviceTypeName),
|
|
|
|
|
+ detailRow('安装位置', current.deviceLocation),
|
|
|
|
|
+ detailRow('处置人', current.receiveUserName),
|
|
|
|
|
+ detailRow('核验人', current.verifyUserName),
|
|
|
|
|
+ detailRow('维修前附件', imageSummary(current.maintenanceBeforeImages)),
|
|
|
|
|
+ detailRow('维修后附件', imageSummary(current.maintenanceAfterImages)),
|
|
|
|
|
+ detailRow('延期申请', delayApplyText(current.delayApply), true),
|
|
|
|
|
+ detailRow('实际结案', current.realFinishTime),
|
|
|
])
|
|
])
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/** 详情行清单:剔除「可选项没值」的 null(必选项即使占位符也保留)。 */
|
|
/** 详情行清单:剔除「可选项没值」的 null(必选项即使占位符也保留)。 */
|
|
|
|
|
+/** 附件数量摘要:有图给「N 项」,没给就说没有(不把缺省当成功)。 */
|
|
|
|
|
+function imageSummary(list) {
|
|
|
|
|
+ return Array.isArray(list) && list.length ? `${list.length} 项` : '暂无'
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/** 延期申请一句话:状态 · 原因 · 新期限;完全没有申请时明确写出来。 */
|
|
|
|
|
+function delayApplyText(apply) {
|
|
|
|
|
+ if (!apply) return '没有延期信息'
|
|
|
|
|
+ const parts = [apply.statusName || apply.status, apply.reason, formatEventTime(apply.deadline)].filter(Boolean)
|
|
|
|
|
+ return parts.length ? parts.join(' · ') : '没有延期信息'
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
function detailRowList(rows) {
|
|
function detailRowList(rows) {
|
|
|
return rows.filter(Boolean)
|
|
return rows.filter(Boolean)
|
|
|
}
|
|
}
|