Files
ONE-OS/web端/运维管理/车辆业务/新增故障.jsx
王冕 d432d51eed feat(web): 同步 web 端目录更新至 Gitea
包含加氢站站点信息、运维交车/故障、台账与数据分析等页面新增与改动。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 19:57:30 +08:00

418 lines
20 KiB
JavaScript

// 【重要】必须使用 const Component 作为组件变量名
// ONEOS-web - 运维管理 - 车辆业务 - 新增故障
const Component = function () {
var useState = React.useState;
var useEffect = React.useEffect;
var antd = window.antd;
var Button = antd.Button;
var Input = antd.Input;
var Select = antd.Select;
var DatePicker = antd.DatePicker;
var Form = antd.Form;
var Row = antd.Row;
var Col = antd.Col;
var Breadcrumb = antd.Breadcrumb;
var Layout = antd.Layout;
var message = antd.message;
var Card = antd.Card;
var Upload = antd.Upload;
var Modal = antd.Modal;
var _form = Form.useForm();
var faultForm = _form[0];
var _specOpen = useState(false);
var specModalOpen = _specOpen[0];
var setSpecModalOpen = _specOpen[1];
var _formDirty = useState(false);
var formDirty = _formDirty[0];
var setFormDirty = _formDirty[1];
var faultLevelOptions = [
{ label: 'L1-特急', value: '特急' },
{ label: 'L2-紧急', value: '紧急' },
{ label: 'L3-一般', value: '一般' },
{ label: 'L4-提示', value: '提示' }
];
var faultTypeOptions = [
{ label: '底盘故障', value: '底盘故障' },
{ label: '三电故障', value: '三电故障' },
{ label: '整车系统', value: '整车系统' },
{ label: '燃料电池系统故障', value: '燃料电池系统故障' },
{ label: '供氢系统故障', value: '供氢系统故障' },
{ label: '空调系统故障', value: '空调系统故障' },
{ label: '冷机故障', value: '冷机故障' },
{ label: '其他故障', value: '其他故障' }
];
var faultSourceOptions = [
{ label: '客户报告', value: '客户报告' },
{ label: '定期保养', value: '定期保养' },
{ label: '周期性维护', value: '周期性维护' },
{ label: '预防性维护', value: '预防性维护' },
{ label: '整备', value: '整备' }
];
var resolveStatusOptions = [
{ label: '未解决', value: '未解决' },
{ label: '临时排故', value: '临时排故' },
{ label: '已解决', value: '已解决' }
];
/** 运营公司枚举:浙江羚牛、上海羚牛、广东羚牛 */
var plateOptions = [
{ label: '沪A12345', value: '沪A12345', brand: '一汽解放', model: 'J6P', company: '上海羚牛', vin: 'LNW1234567890ABCD' },
{ label: '浙B88888', value: '浙B88888', brand: '东风商用车', model: '天龙', company: '浙江羚牛', vin: 'LNW0987654321EFGH' },
{ label: '粤A00001', value: '粤A00001', brand: '福田欧曼', model: 'EST', company: '广东羚牛', vin: 'LNW1357924680IJKL' },
{ label: '沪D99999', value: '沪D99999', brand: '陕汽重卡', model: '德龙', company: '上海羚牛', vin: 'LNW2468013579MNOP' }
];
var PlusIcon = function() { return React.createElement('svg', { viewBox: '0 0 1024 1024', width: 14, height: 14, fill: 'currentColor' }, React.createElement('path', { d: 'M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z' }), React.createElement('path', { d: 'M192 474h672q8 0 8 8v60q0 8-8 8H192q-8 0-8-8v-60q0-8 8-8z' })); };
var FileTextIcon = function() { return React.createElement('svg', { viewBox: '0 0 1024 1024', width: 16, height: 16, fill: 'currentColor' }, React.createElement('path', { d: 'M854.6 288.7L639.4 73.4c-6-6-14.2-9.4-22.7-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216c0 22.1 17.9 40 40 40h216v494zM504 618H320c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM702 458H320c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h382c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z' })); };
var DESC_PLACEHOLDER = '在何种状态下\n产生何种现象\n导致何种事故';
var goBackList = function () {
message.info('返回列表');
};
var requestExit = function () {
if (formDirty) {
Modal.confirm({
title: '确定要退出吗?',
content: '未保存的数据将丢失',
okText: '确定',
cancelText: '取消',
onOk: function () {
setFormDirty(false);
goBackList();
}
});
} else {
goBackList();
}
};
var openResultModal = function (title, okText, cancelText, onPrimary) {
Modal.success({
title: title,
content: title === '提交成功' ? '故障已提交并加入历史记录。' : '单据已保存在待处理,可继续编辑或稍后提交。',
okText: okText,
cancelText: cancelText,
okCancel: true,
centered: true,
onOk: function () {
if (onPrimary) onPrimary();
},
onCancel: function () {}
});
};
var handleSave = function () {
// 弱校验:不触发表单校验;落库时解决情况空值按「未解决」与列表一致
faultForm.getFieldsValue();
setFormDirty(false);
openResultModal('保存成功', '返回列表', '确定', goBackList);
};
var runSubmit = function () {
faultForm.validateFields(['plate', 'type', 'source', 'level', 'reportTime', 'desc']).then(function () {
var list = faultForm.getFieldValue('evidence') || [];
if (!list.length) {
message.error('请上传故障证据');
return;
}
setFormDirty(false);
openResultModal('提交成功', '返回列表', '确定', goBackList);
}).catch(function () {});
};
var handleSubmitClick = function () {
Modal.confirm({
title: '确认提交',
content: '故障提交后无法修改,如未完成所有步骤填写请先进行保存。点击确认加入历史记录',
okText: '确认',
cancelText: '取消',
centered: true,
onOk: function () {
runSubmit();
}
});
};
useEffect(function () {
var fn = function (e) {
if (formDirty) {
e.preventDefault();
e.returnValue = '';
}
};
window.addEventListener('beforeunload', fn);
return function () { window.removeEventListener('beforeunload', fn); };
}, [formDirty]);
var specSection = function (title, lines) {
return React.createElement('div', { style: { marginBottom: 16 } },
React.createElement('div', { style: { fontWeight: 600, color: '#1d2129', marginBottom: 8, fontSize: 14 } }, title),
lines.map(function (text, i) {
return React.createElement('div', { key: i, style: { fontSize: 13, color: '#4e5969', lineHeight: 1.75 } }, text);
})
);
};
var renderSpecModal = function () {
return React.createElement(Modal, {
title: '故障信息表单页 — 需求说明',
open: specModalOpen,
onCancel: function () { setSpecModalOpen(false); },
footer: React.createElement(Button, { type: 'primary', onClick: function () { setSpecModalOpen(false); } }, '知道了'),
width: 720,
centered: true,
destroyOnClose: true
},
React.createElement('div', { style: { maxHeight: '70vh', overflowY: 'auto', paddingRight: 4 } },
specSection('3. 故障信息表单页', ['用于新增/编辑故障记录,保存到待处理或提交到历史记录。']),
specSection('3.1 车辆信息卡片(自动带出)', [
'3.1.1 车牌号:必填,下拉可搜索;',
'3.1.2 车辆品牌:禁用,随车牌自动反填;',
'3.1.3 车辆型号:禁用,随车牌自动反填;',
'3.1.4 车辆识别代码:禁用,随车牌自动反填;',
'3.1.5 运营公司:禁用,随车牌自动反填。',
'3.1.6 运营公司枚举统一为:浙江羚牛、上海羚牛、广东羚牛。'
]),
specSection('3.2 故障信息卡片', [
'3.2.1 故障类型:必填,下拉选择;',
'3.2.2 故障来源:必填,下拉选择,选项:客户报告、定期保养、周期性维护、预防性维护、整备;',
'3.2.3 故障等级:必填,下拉选择;',
'3.2.4 故障上报时间:必填,日期时间选择器;',
'3.2.5 解决情况:选填,下拉选择,选项:临时排故、已解决、未解决。'
]),
specSection('3.3 故障描述与证据卡片(顺序已调整)', [
'3.3.1 故障描述:必填,多行文本,默认引导语:在何种状态下 / 产生何种现象 / 导致何种事故;',
'3.3.2 故障证据:提交时必填,上传控件,支持照片/视频/录音;',
'提示文案:支持上传照片、视频、录音。'
]),
specSection('4. 底部操作按钮组', [
'控制保存与提交流程。',
'4.1 保存按钮:保存当前已填写内容,不做严格必填校验,单据留在待处理;',
'4.2 提交按钮:执行严格校验(含带*字段及故障证据);',
'4.3 点击提交先弹确认提示:故障提交后无法修改… 按钮:取消 / 确认;',
'4.4 提交成功后提示提交成功,并提供确定/返回列表;',
'4.5 保存成功后提示保存成功,并提供确定/返回列表。'
]),
specSection('5. 联动与校验规则', [
'5.1 车牌联动:自动反填车辆品牌、车辆型号、车辆识别代码、运营公司;',
'5.2 保存校验:弱校验(允许未填必填项);',
'5.3 提交校验:强校验(必填项+故障证据);',
'5.4 解决情况默认值兜底:未填写时按未解决处理(列表展示与保存一致)。'
]),
specSection('6. 退出与返回拦截规则', [
'6.1 表单发生修改且未保存时,触发返回/关闭/刷新拦截;',
'6.2 弹窗文案:确定要退出吗?未保存的数据将丢失;',
'6.3 按钮:确定 / 取消;',
'6.4 已保存后再退出,不触发该拦截。'
])
)
);
};
return React.createElement(Layout, { className: 'arco-theme-overrides', style: { minHeight: '100vh', background: '#f2f3f5', fontFamily: 'Inter, Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif' } },
React.createElement('style', null, `
.arco-theme-overrides .ant-btn { border-radius: 4px; }
.arco-theme-overrides .ant-btn-primary { background-color: #165dff; border-color: #165dff; }
.arco-theme-overrides .ant-btn-primary:hover { background-color: #4080ff; border-color: #4080ff; }
.arco-grouped-form-page { display: flex; flex-direction: column; min-height: 100vh; }
.arco-grouped-form-page-content { flex: 1; padding: 16px 20px 24px; }
.arco-grouped-form-page .ant-card { margin-bottom: 16px; border-radius: 4px; border: none; box-shadow: 0 1px 2px rgba(0,0,0,0.06); }
.arco-grouped-form-page .ant-card-head { border-bottom: none; padding: 20px 24px 0; min-height: auto; }
.arco-grouped-form-page .ant-card-head-title { font-size: 16px; font-weight: 500; color: #1d2129; padding: 0; }
.arco-grouped-form-page .ant-card-body { padding: 24px; }
.arco-grouped-form-page .ant-form-vertical .ant-form-item-label { padding-bottom: 8px; height: auto; line-height: 1.5715; }
.arco-grouped-form-page .ant-form-item { margin-bottom: 24px; }
.arco-grouped-form-page .ant-input,
.arco-grouped-form-page .ant-select-selector,
.arco-grouped-form-page .ant-picker,
.arco-grouped-form-page .ant-input-affix-wrapper { background-color: #f2f3f5; border: 1px solid #e5e6eb; border-radius: 2px; transition: all 0.1s cubic-bezier(0, 0, 1, 1); }
.arco-grouped-form-page .ant-input:hover,
.arco-grouped-form-page .ant-select:not(.ant-select-disabled):hover .ant-select-selector,
.arco-grouped-form-page .ant-picker:hover,
.arco-grouped-form-page .ant-input-affix-wrapper:hover { background-color: #f2f3f5; border-color: #165dff; }
.arco-grouped-form-page .ant-input:focus,
.arco-grouped-form-page .ant-input-focused,
.arco-grouped-form-page .ant-select-focused .ant-select-selector,
.arco-grouped-form-page .ant-picker-focused,
.arco-grouped-form-page .ant-input-affix-wrapper-focused { background-color: #fff; border: 1px solid #165dff !important; box-shadow: 0 0 0 2px rgba(22, 93, 255, 0.2) !important; outline: 0; }
.arco-grouped-form-page .ant-input[disabled],
.arco-grouped-form-page .ant-select-disabled .ant-select-selector,
.arco-grouped-form-page .ant-picker-disabled { color: #86909c; background-color: #f2f3f5; border-color: #e5e6eb; cursor: not-allowed; }
.arco-grouped-form-page .ant-input-affix-wrapper[disabled] { background-color: #f2f3f5; border-color: #e5e6eb; cursor: not-allowed; }
.arco-grouped-form-page .ant-input-affix-wrapper > input.ant-input { background-color: transparent; }
.arco-grouped-form-page .ant-input-affix-wrapper > input.ant-input:focus { background-color: transparent; box-shadow: none !important; border: none !important; }
.arco-grouped-form-footer { background: #fff; padding: 16px 24px; border-top: 1px solid #e5e6eb; display: flex; justify-content: flex-end; align-items: center; gap: 12px; position: sticky; bottom: 0; z-index: 100; box-shadow: 0 -2px 10px rgba(0,0,0,0.05); }
.arco-grouped-form-footer .ant-btn { border-radius: 5px; height: 32px; padding: 4px 16px; font-size: 14px; }
.arco-theme-overrides .ant-breadcrumb { color: #86909c; font-size: 14px; white-space: nowrap; flex-shrink: 0; margin-bottom: 0; }
.arco-theme-overrides .ant-breadcrumb a { color: #4e5969; }
.arco-theme-overrides .ant-breadcrumb a:hover { color: #165dff; background-color: transparent; }
.arco-theme-overrides .ant-form-item-label > label { color: #4e5969; white-space: nowrap; }
.arco-theme-overrides .ant-form-item-label > label::after { display: none !important; content: "" !important; margin: 0 !important; }
`),
React.createElement('div', { className: 'arco-grouped-form-page' },
React.createElement('div', { className: 'arco-grouped-form-page-content' },
React.createElement('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 20, flexWrap: 'nowrap', gap: 12 } },
React.createElement(Breadcrumb, {
separator: React.createElement('span', { style: { color: '#c9cdd4' } }, '/'),
items: [
{ title: '首页' },
{ title: '运维管理' },
{ title: '车辆业务' },
{ title: React.createElement('a', { href: '#', onClick: function (e) { e.preventDefault(); requestExit(); } }, '故障管理') },
{ title: React.createElement('span', { style: { color: '#1d2129' } }, '新建故障单') }
]
}),
React.createElement(Button, {
type: 'link',
icon: React.createElement(FileTextIcon, null),
style: { display: 'flex', alignItems: 'center', gap: 4, padding: '0 4px', color: '#165dff', fontWeight: 500, flexShrink: 0 },
onClick: function () { setSpecModalOpen(true); }
}, '查看需求说明')
),
React.createElement(Form, {
form: faultForm,
layout: 'vertical',
onValuesChange: function () {
setFormDirty(true);
}
},
React.createElement(Card, { title: '车辆信息', bordered: false },
React.createElement(Row, { gutter: 24 },
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '车牌号', name: 'plate', rules: [{ required: true, message: '请选择车牌号' }] },
React.createElement(Select, {
placeholder: '请选择车牌号(可搜索)',
options: plateOptions,
showSearch: true,
optionFilterProp: 'label',
onChange: function (val, option) {
if (option) {
faultForm.setFieldsValue({
brand: option.brand,
model: option.model,
company: option.company,
vin: option.vin
});
} else {
faultForm.setFieldsValue({ brand: undefined, model: undefined, company: undefined, vin: undefined });
}
}
})
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '车辆品牌', name: 'brand' },
React.createElement(Input, { placeholder: '自动带入', disabled: true, style: { backgroundColor: '#f2f3f5', color: '#86909c' } })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '车辆型号', name: 'model' },
React.createElement(Input, { placeholder: '自动带入', disabled: true, style: { backgroundColor: '#f2f3f5', color: '#86909c' } })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '车辆识别代码', name: 'vin' },
React.createElement(Input, { placeholder: '自动带入', disabled: true, style: { backgroundColor: '#f2f3f5', color: '#86909c' } })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '运营公司', name: 'company' },
React.createElement(Input, { placeholder: '自动带入', disabled: true, style: { backgroundColor: '#f2f3f5', color: '#86909c' } })
)
)
)
),
React.createElement(Card, { title: '故障信息', bordered: false },
React.createElement(Row, { gutter: 24 },
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '故障类型', name: 'type', rules: [{ required: true, message: '请选择故障类型' }] },
React.createElement(Select, { placeholder: '请选择故障类型', options: faultTypeOptions })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '故障来源', name: 'source', rules: [{ required: true, message: '请选择故障来源' }] },
React.createElement(Select, { placeholder: '请选择故障来源', options: faultSourceOptions })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '故障等级', name: 'level', rules: [{ required: true, message: '请选择故障等级' }] },
React.createElement(Select, { placeholder: '请选择故障等级', options: faultLevelOptions })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '故障上报时间', name: 'reportTime', rules: [{ required: true, message: '请选择故障上报时间' }] },
React.createElement(DatePicker, { style: { width: '100%' }, placeholder: '请选择上报时间', showTime: true })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '解决情况', name: 'status', extra: '选填;保存时未填按「未解决」处理' },
React.createElement(Select, { allowClear: true, placeholder: '请选择(可选)', options: resolveStatusOptions })
)
)
)
),
React.createElement(Card, { title: '故障描述与证据', bordered: false },
React.createElement(Row, { gutter: 24 },
React.createElement(Col, { span: 24 },
React.createElement(Form.Item, { label: '故障描述', name: 'desc', rules: [{ required: true, message: '请填写故障描述' }] },
React.createElement(Input.TextArea, {
placeholder: DESC_PLACEHOLDER,
style: { minHeight: 104, height: 104, resize: 'none' }
})
)
),
React.createElement(Col, { span: 24 },
React.createElement(Form.Item, {
label: '故障证据',
name: 'evidence',
valuePropName: 'fileList',
getValueFromEvent: function (e) { return (e && e.fileList) ? e.fileList : []; }
},
React.createElement(Upload, {
listType: 'picture-card',
beforeUpload: function () { return false; },
multiple: true,
accept: 'image/*,video/*,audio/*'
},
React.createElement('div', null,
React.createElement(PlusIcon, null),
React.createElement('div', { style: { marginTop: 8 } }, '上传文件')
)
),
React.createElement('div', { style: { fontSize: 12, color: '#86909c', marginTop: 8 } }, '支持上传照片、视频、录音')
)
)
)
)
)
),
React.createElement('div', { className: 'arco-grouped-form-footer' },
React.createElement(Button, { onClick: requestExit, style: { borderRadius: 5 } }, '取消'),
React.createElement(Button, { onClick: handleSave, style: { borderRadius: 5 } }, '保存'),
React.createElement(Button, { type: 'primary', onClick: handleSubmitClick, style: { borderRadius: 5 } }, '提交')
)
),
renderSpecModal()
);
};
if (typeof module !== 'undefined' && module.exports) module.exports = Component;