feat(web): 运维管理-备车/型号参数与需求说明更新

- 备车管理、新增备车、查看备车、备车-编辑:布局与字段调整,新增取消按钮
- 基本数据维护:型号参数列表/新增/查看/编辑页
- 车辆业务:备车-编辑页,示例图片、提交/保存/取消按钮
- 需求说明目录与文档整理

Made-with: Cursor
This commit is contained in:
王冕
2026-03-13 00:23:02 +08:00
parent cef9c8e24a
commit fc86688beb
17 changed files with 2658 additions and 274 deletions

View File

@@ -0,0 +1,289 @@
// 【重要】必须使用 const Component 作为组件变量名
// 运维管理 - 车辆数据 - 车辆详情(只读展示)
const Component = function () {
var useState = React.useState;
var antd = window.antd;
var Breadcrumb = antd.Breadcrumb;
var Card = antd.Card;
var Tabs = antd.Tabs;
var Table = antd.Table;
var Tag = antd.Tag;
var Button = antd.Button;
var Tooltip = antd.Tooltip;
// 顶部概览 mock 数据(与图片一致)
var overview = {
plateNo: '浙F06900F',
plateTag: '租赁',
vin: 'LA9HE60A0NBAF4031',
vehicleNo: '22FHD0007',
owner: '浙江羚牛氢能科技有限公司',
contractNo: 'LNZLHTSH2023071301',
outStatus: '租赁交车',
licenseStatus: '正常',
location: '浙江省嘉兴市平湖市XXXXXXXXXXX街道XXXXXXXXXXX号XXXXXXXx',
bodyColor: '白色',
purchaseDate: '2026-09-09',
warehouseStatus: '已交付车-租赁服务',
customerName: '上海迅杰物流有限公司',
prepStatus: '正常',
scrapStatus: '无',
gpsLastTime: '2026-09-09 10:50',
resourceCategory: 'XXXXXXXXXX',
manufactureYear: '2025',
parkingPlace: '-',
bizDept: '业务三部',
lastPrepTime: '2026-09-09',
assetRating: 'XXXXXXXXXX',
ratingTime: '2027-09-09',
forceScrapDate: '2026-09-09',
nextInspectionTime: '2026-09-09',
bizManager: '金可鹏',
maintainStatus: '正常',
preemptStatus: '无',
transferStatus: '无'
};
// 型号参数 tab 数据
var modelParams = {
brand: '苏龙',
model: '海格牌KLQ5180XYKFCEV',
vehicleType: '18吨双飞翼货车',
fuelType: '氢',
cabinColor: '绿牌',
wholeSize: '5995mm x 2145mm x 3130mm'
};
var tireInfo = { tireCount: '8', tireSpec: '15/80R22.5' };
var electricSystem = {
batteryType: '磷酸铁锂',
batteryVendor: 'xxxxxxxxxxxxx企业名称',
capacity: '100000 kWh',
range: '200 KM'
};
var hydrogenSystem = {
vendor: '某某供氢系统科技有限公司',
cylinderCapacity: 'xxx L',
gaugeMode: 'MPa',
range: '1000 KM'
};
var otherSystem = {
coldMachineVendor: 'xxxxxxxx企业',
stackVendor: 'XXXXXXXX企业'
};
var maintenanceList = [
{ key: '1', item: '变速器油', kmCycle: '60000', monthCycle: '24', laborCost: '0', materialCost: '571', total: '571', lastKm: '' },
{ key: '2', item: '变速器油', kmCycle: '60000', monthCycle: '24', laborCost: '0', materialCost: '571', total: '571', lastKm: '' },
{ key: '3', item: '变速器油', kmCycle: '60000', monthCycle: '24', laborCost: '0', materialCost: '571', total: '571', lastKm: '5000' },
{ key: '4', item: '变速器油', kmCycle: '60000', monthCycle: '24', laborCost: '0', materialCost: '571', total: '571', lastKm: '5000' },
{ key: '5', item: '变速器油', kmCycle: '60000', monthCycle: '24', laborCost: '0', materialCost: '571', total: '571', lastKm: '5000' }
];
var activeTab = useState('model');
var styles = {
page: { padding: '16px 24px 40px', backgroundColor: '#f5f5f5', minHeight: '100vh', fontSize: 14 },
breadcrumb: { marginBottom: 16, color: '#666' },
breadcrumbSep: { margin: '0 8px', color: '#999' },
card: { backgroundColor: '#fff', borderRadius: 8, marginBottom: 16, boxShadow: '0 1px 2px rgba(0,0,0,0.05)', overflow: 'hidden' },
cardBody: { padding: '20px 24px' },
overviewHeader: { display: 'flex', alignItems: 'center', gap: 12, marginBottom: 20, flexWrap: 'wrap' },
plateNo: { fontSize: 18, fontWeight: 600, color: '#333' },
overviewGrid: { display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: '12px 24px' },
overviewItem: { display: 'flex', gap: 8, minWidth: 0 },
overviewLabel: { color: '#666', flex: '0 0 110px' },
overviewValue: { color: '#333', flex: 1 },
cardTitleBar: { display: 'flex', alignItems: 'center', marginBottom: 16, fontSize: 15, fontWeight: 500 },
cardTitleBarLine: { width: 4, height: 16, backgroundColor: '#1890ff', marginRight: 8, borderRadius: 2 },
infoGrid: { display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: '12px 24px', marginBottom: 20 },
infoItem: { display: 'flex', gap: 8 },
infoLabel: { color: '#666', flex: '0 0 100px' },
infoValue: { color: '#333' }
};
function InfoRow(props) {
var val = props.value || '-';
var valueNode = props.ellipsisWithTooltip
? React.createElement(Tooltip, { title: val },
React.createElement('span', {
style: Object.assign({}, styles.overviewValue, { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', display: 'block' })
}, val)
)
: React.createElement('span', { style: styles.overviewValue }, val);
return React.createElement('div', { style: styles.overviewItem },
React.createElement('span', { style: styles.overviewLabel }, props.label + ''),
valueNode
);
}
function CardTitleWithBar(props) {
return React.createElement('div', { style: styles.cardTitleBar },
React.createElement('span', { style: styles.cardTitleBarLine }),
props.title
);
}
var tabItems = [
{
key: 'model',
label: '型号参数',
children: React.createElement('div', { style: { padding: '0 4px' } },
React.createElement(Card, { size: 'small', style: { marginBottom: 16 } },
React.createElement(CardTitleWithBar, { title: '型号参数' }),
React.createElement('div', { style: styles.infoGrid },
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '品牌:'), React.createElement('span', { style: styles.infoValue }, modelParams.brand)),
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '型号:'), React.createElement('span', { style: styles.infoValue }, modelParams.model)),
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '车辆类型:'), React.createElement('span', { style: styles.infoValue }, modelParams.vehicleType)),
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '燃料种类:'), React.createElement('span', { style: styles.infoValue }, modelParams.fuelType)),
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '车厢颜色:'), React.createElement('span', { style: styles.infoValue }, modelParams.cabinColor)),
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '整车尺寸:'), React.createElement('span', { style: styles.infoValue }, modelParams.wholeSize))
)
),
React.createElement(Card, { size: 'small', style: { marginBottom: 16 } },
React.createElement(CardTitleWithBar, { title: '轮胎情况' }),
React.createElement('div', { style: styles.infoGrid },
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '轮胎数量:'), React.createElement('span', { style: styles.infoValue }, tireInfo.tireCount)),
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '轮胎规格:'), React.createElement('span', { style: styles.infoValue }, tireInfo.tireSpec))
)
),
React.createElement(Card, { size: 'small', style: { marginBottom: 16 } },
React.createElement(CardTitleWithBar, { title: '电气系统' }),
React.createElement('div', { style: styles.infoGrid },
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '电池类型:'), React.createElement('span', { style: styles.infoValue }, electricSystem.batteryType)),
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '电池厂家:'), React.createElement('span', { style: styles.infoValue }, electricSystem.batteryVendor)),
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '储电量:'), React.createElement('span', { style: styles.infoValue }, electricSystem.capacity)),
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '续航里程:'), React.createElement('span', { style: styles.infoValue }, electricSystem.range))
)
),
React.createElement(Card, { size: 'small', style: { marginBottom: 16 } },
React.createElement(CardTitleWithBar, { title: '供氢系统' }),
React.createElement('div', { style: styles.infoGrid },
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '供氢系统厂家:'), React.createElement('span', { style: styles.infoValue }, hydrogenSystem.vendor)),
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '氢瓶容量:'), React.createElement('span', { style: styles.infoValue }, hydrogenSystem.cylinderCapacity)),
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '仪表盘模式:'), React.createElement('span', { style: styles.infoValue }, hydrogenSystem.gaugeMode)),
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '续航里程:'), React.createElement('span', { style: styles.infoValue }, hydrogenSystem.range))
)
),
React.createElement(Card, { size: 'small', style: { marginBottom: 16 } },
React.createElement(CardTitleWithBar, { title: '其他系统' }),
React.createElement('div', { style: styles.infoGrid },
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '冷机生产企业:'), React.createElement('span', { style: styles.infoValue }, otherSystem.coldMachineVendor)),
React.createElement('div', { style: styles.infoItem }, React.createElement('span', { style: styles.infoLabel }, '电堆生产企业:'), React.createElement('span', { style: styles.infoValue }, otherSystem.stackVendor))
)
),
React.createElement(Card, { size: 'small' },
React.createElement(CardTitleWithBar, { title: '保养参数' }),
React.createElement(Table, {
dataSource: maintenanceList,
columns: [
{ title: '序号', dataIndex: 'key', key: 'key', width: 60, render: function (_, __, i) { return i + 1; } },
{ title: '养护项目', dataIndex: 'item', key: 'item', width: 120 },
{ title: '保养公里周期(km)', dataIndex: 'kmCycle', key: 'kmCycle', width: 140 },
{ title: '保养时间周期(月)', dataIndex: 'monthCycle', key: 'monthCycle', width: 140 },
{ title: '工时费(元)', dataIndex: 'laborCost', key: 'laborCost', width: 100 },
{ title: '材料费(元)', dataIndex: 'materialCost', key: 'materialCost', width: 100 },
{ title: '合计', dataIndex: 'total', key: 'total', width: 80 },
{ title: '上次保养公里数(KM)', dataIndex: 'lastKm', key: 'lastKm', render: function (v) { return v || '—'; } }
],
pagination: false,
size: 'small',
bordered: true
})
)
)
},
{ key: 'equip', label: '后装设备', children: React.createElement('div', { style: { padding: 24, color: '#999' } }, '暂无数据') },
{ key: 'license', label: '证照信息', children: React.createElement('div', { style: { padding: 24, color: '#999' } }, '暂无数据') },
{ key: 'lease', label: '租赁记录', children: React.createElement('div', { style: { padding: 24, color: '#999' } }, '暂无数据') },
{ key: 'insurance', label: '保险记录', children: React.createElement('div', { style: { padding: 24, color: '#999' } }, '暂无数据') },
{ key: 'repair', label: '维修记录', children: React.createElement('div', { style: { padding: 24, color: '#999' } }, '暂无数据') },
{ key: 'maintain', label: '保养记录', children: React.createElement('div', { style: { padding: 24, color: '#999' } }, '暂无数据') },
{ key: 'accident', label: '事故记录', children: React.createElement('div', { style: { padding: 24, color: '#999' } }, '暂无数据') },
{ key: 'fault', label: '故障记录', children: React.createElement('div', { style: { padding: 24, color: '#999' } }, '暂无数据') },
{ key: 'violation', label: '违章记录', children: React.createElement('div', { style: { padding: 24, color: '#999' } }, '暂无数据') },
{ key: 'change', label: '异动记录', children: React.createElement('div', { style: { padding: 24, color: '#999' } }, '暂无数据') },
{ key: 'transfer', label: '调拨记录', children: React.createElement('div', { style: { padding: 24, color: '#999' } }, '暂无数据') },
{ key: 'prep', label: '整备记录', children: React.createElement('div', { style: { padding: 24, color: '#999' } }, '暂无数据') },
{ key: 'inspect', label: '抽检记录', children: React.createElement('div', { style: { padding: 24, color: '#999' } }, '暂无数据') }
];
var breadcrumbNodes = [
React.createElement('span', { key: '1' }, '车辆管理'),
React.createElement('span', { key: '2', style: styles.breadcrumbSep }, ' / '),
React.createElement('span', { key: '3' }, '车辆数据'),
React.createElement('span', { key: '4', style: styles.breadcrumbSep }, ' / '),
React.createElement('span', { key: '5', style: { color: '#1890ff' } }, '详情')
];
return React.createElement('div', { style: styles.page },
React.createElement('div', { style: styles.breadcrumb }, breadcrumbNodes),
React.createElement('div', { style: styles.card },
React.createElement('div', { style: styles.cardBody },
React.createElement('div', { style: styles.overviewHeader },
React.createElement('span', { style: styles.plateNo }, overview.plateNo),
React.createElement(Tag, { color: 'blue' }, overview.plateTag),
React.createElement(Button, { type: 'link', size: 'small', style: { padding: 0 } }, '1')
),
React.createElement('div', { style: styles.overviewGrid },
React.createElement(InfoRow, { label: '车架号', value: overview.vin }),
React.createElement(InfoRow, { label: '车辆编号', value: overview.vehicleNo }),
React.createElement(InfoRow, { label: '登记所有权', value: overview.owner }),
React.createElement(InfoRow, { label: '合同编号', value: overview.contractNo }),
React.createElement(InfoRow, { label: '出库状态', value: overview.outStatus }),
React.createElement(InfoRow, { label: '证照状态', value: overview.licenseStatus }),
React.createElement(InfoRow, { label: '车辆当前位置', value: overview.location, ellipsisWithTooltip: true }),
React.createElement(InfoRow, { label: '车身颜色', value: overview.bodyColor }),
React.createElement(InfoRow, { label: '采购入库日期', value: overview.purchaseDate }),
React.createElement(InfoRow, { label: '库位状态', value: overview.warehouseStatus }),
React.createElement(InfoRow, { label: '客户名称', value: overview.customerName }),
React.createElement(InfoRow, { label: '整备状态', value: overview.prepStatus }),
React.createElement(InfoRow, { label: '报废状态', value: overview.scrapStatus }),
React.createElement(InfoRow, { label: 'GPS最后上传', value: overview.gpsLastTime }),
React.createElement(InfoRow, { label: '资源分类', value: overview.resourceCategory }),
React.createElement(InfoRow, { label: '出厂年份', value: overview.manufactureYear }),
React.createElement(InfoRow, { label: '停车位置', value: overview.parkingPlace }),
React.createElement(InfoRow, { label: '业务部门', value: overview.bizDept }),
React.createElement(InfoRow, { label: '上次整备时间', value: overview.lastPrepTime }),
React.createElement(InfoRow, { label: '资产评级', value: overview.assetRating }),
React.createElement(InfoRow, { label: '等评时间', value: overview.ratingTime }),
React.createElement(InfoRow, { label: '强制报废期', value: overview.forceScrapDate }),
React.createElement(InfoRow, { label: '下次年检时间', value: overview.nextInspectionTime }),
React.createElement(InfoRow, { label: '业务负责人', value: overview.bizManager }),
React.createElement(InfoRow, { label: '维修状态', value: overview.maintainStatus }),
React.createElement(InfoRow, { label: '预占状态', value: overview.preemptStatus }),
React.createElement(InfoRow, { label: '过户状态', value: overview.transferStatus })
)
)
),
React.createElement('div', { style: Object.assign({}, styles.card, { marginBottom: 0 }) },
React.createElement('div', { style: styles.cardBody },
React.createElement(Tabs, {
activeKey: activeTab[0],
onChange: function (key) { activeTab[1](key); },
items: tabItems,
type: 'line'
})
)
)
);
};
if (typeof window !== 'undefined') {
window.Component = Component;
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function () {
var rootEl = document.getElementById('root');
if (rootEl && window.ReactDOM && window.React) {
var root = ReactDOM.createRoot(rootEl);
root.render(React.createElement(Component));
}
});
} else {
var rootEl = document.getElementById('root');
if (rootEl && window.ReactDOM && window.React) {
var root = ReactDOM.createRoot(rootEl);
root.render(React.createElement(Component));
}
}
}