Files
ONE-OS/web端/运维管理/车辆业务/还车管理.jsx
王冕 3a04a3d1c1 运维/车辆业务:新增还车管理列表与还车单页面
- 新增还车管理列表页(待处理/历史记录)及筛选、导出、分页
- 新增还车单(还车)与只读查看页,含检查单抽屉与照片对照

Made-with: Cursor
2026-03-19 01:24:48 +08:00

480 lines
21 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 【重要】必须使用 const Component 作为组件变量名
// 运维管理 - 车辆业务 - 还车管理
const Component = function () {
var useState = React.useState;
var useMemo = React.useMemo;
var useCallback = React.useCallback;
var antd = window.antd;
var Breadcrumb = antd.Breadcrumb;
var Card = antd.Card;
var Select = antd.Select;
var Button = antd.Button;
var Table = antd.Table;
var Tabs = antd.Tabs;
var Modal = antd.Modal;
var message = antd.message;
var App = antd.App;
function filterOption(input, option) {
var label = (option && (option.label || option.children)) || '';
return String(label).toLowerCase().indexOf(String(input || '').toLowerCase()) >= 0;
}
var contractOptions = [
{ value: 'HT-ZL-2025-001', label: 'HT-ZL-2025-001' },
{ value: 'HT-ZL-2025-002', label: 'HT-ZL-2025-002' },
{ value: 'HT-ZL-2025-003', label: 'HT-ZL-2025-003' },
{ value: 'HT-ZL-2025-004', label: 'HT-ZL-2025-004' }
];
var projectOptions = [
{ value: '嘉兴氢能示范项目', label: '嘉兴氢能示范项目' },
{ value: '上海物流租赁项目', label: '上海物流租赁项目' },
{ value: '杭州城配租赁项目', label: '杭州城配租赁项目' }
];
var customerOptions = [
{ value: '嘉兴某某物流有限公司', label: '嘉兴某某物流有限公司' },
{ value: '上海某某运输公司', label: '上海某某运输公司' },
{ value: '杭州某某租赁有限公司', label: '杭州某某租赁有限公司' }
];
var plateOptions = [
{ value: '京A12345', label: '京A12345' },
{ value: '沪B20001', label: '沪B20001' },
{ value: '浙A88888', label: '浙A88888' },
{ value: '浙F66666', label: '浙F66666' }
];
var vehicleTypeOptions = [
{ value: '轻型厢式货车', label: '轻型厢式货车' },
{ value: '重型厢式货车', label: '重型厢式货车' },
{ value: '厢式货车', label: '厢式货车' },
{ value: '平板货车', label: '平板货车' },
{ value: '栏板货车', label: '栏板货车' },
{ value: '小型普通客车', label: '小型普通客车' }
];
var brandOptions = [
{ value: '东风', label: '东风' },
{ value: '福田', label: '福田' },
{ value: '江淮', label: '江淮' },
{ value: '重汽', label: '重汽' },
{ value: '陕汽', label: '陕汽' },
{ value: '苏龙', label: '苏龙' }
];
var modelOptions = [
{ value: 'DFH1180', label: 'DFH1180' },
{ value: 'BJ1180', label: 'BJ1180' },
{ value: 'HFC1180', label: 'HFC1180' },
{ value: 'ZZ1180', label: 'ZZ1180' },
{ value: 'KLQ6129', label: 'KLQ6129' }
];
var defaultPending = [
{ id: 'p1', deliveryTime: '2025-02-20 09:30', deliveryPerson: '张三', plateNo: '京A12345', vehicleType: '重型厢式货车', brand: '东风', model: 'DFH1180', vin: 'LGHXCAE28M1234567', contractCode: 'HT-ZL-2025-001', customerName: '嘉兴某某物流有限公司', projectName: '嘉兴氢能示范项目', dept: '华东业务部', bizOwner: '李经理', vehicleArrived: false },
{ id: 'p2', deliveryTime: '2025-02-21 14:00', deliveryPerson: '李四', plateNo: '沪B20001', vehicleType: '厢式货车', brand: '福田', model: 'BJ1180', vin: 'LGHXCAE28M7654321', contractCode: 'HT-ZL-2025-002', customerName: '上海某某运输公司', projectName: '上海物流租赁项目', dept: '华东业务部', bizOwner: '王经理', vehicleArrived: true },
{ id: 'p3', deliveryTime: '2025-02-22 10:15', deliveryPerson: '王五', plateNo: '浙A88888', vehicleType: '轻型厢式货车', brand: '江淮', model: 'HFC1180', vin: 'LGHXCAE28M8888888', contractCode: 'HT-ZL-2025-003', customerName: '杭州某某租赁有限公司', projectName: '杭州城配租赁项目', dept: '浙江业务部', bizOwner: '赵经理', vehicleArrived: false },
{ id: 'p4', deliveryTime: '2025-02-23 16:45', deliveryPerson: '张三', plateNo: '浙F66666', vehicleType: '栏板货车', brand: '重汽', model: 'ZZ1180', vin: 'LGHXCAE28M7777777', contractCode: 'HT-ZL-2025-001', customerName: '嘉兴某某物流有限公司', projectName: '嘉兴氢能示范项目', dept: '华东业务部', bizOwner: '李经理', vehicleArrived: false }
];
var defaultHistory = [
{ id: 'h1', deliveryTime: '2025-01-10 08:00', deliveryPerson: '张三', returnTime: '2025-02-01 17:30', plateNo: '京C11111', vehicleType: '重型厢式货车', brand: '东风', model: 'DFH1180', vin: 'LGHXCAE28M1111111', contractCode: 'HT-ZL-2024-001', customerName: '嘉兴某某物流有限公司', projectName: '嘉兴氢能示范项目', dept: '华东业务部', bizOwner: '李经理' },
{ id: 'h2', deliveryTime: '2025-01-15 11:20', deliveryPerson: '李四', returnTime: '2025-02-05 09:00', plateNo: '沪A10001', vehicleType: '厢式货车', brand: '江淮', model: 'HFC1180', vin: 'LGHXCAE28M2222222', contractCode: 'HT-ZL-2024-002', customerName: '上海某某运输公司', projectName: '上海物流租赁项目', dept: '华东业务部', bizOwner: '王经理' },
{ id: 'h3', deliveryTime: '2025-01-20 13:00', deliveryPerson: '王五', returnTime: '2025-02-10 15:45', plateNo: '浙B99999', vehicleType: '平板货车', brand: '福田', model: 'BJ1180', vin: 'LGHXCAE28M3333333', contractCode: 'HT-ZL-2024-003', customerName: '杭州某某租赁有限公司', projectName: '杭州城配租赁项目', dept: '浙江业务部', bizOwner: '赵经理' }
];
var filterDraftState = useState({
contractCode: undefined,
projectName: undefined,
customerName: undefined,
plateNo: undefined,
vehicleTypes: [],
brands: [],
model: undefined
});
var fd = filterDraftState[0];
var setFd = filterDraftState[1];
var appliedState = useState({
contractCode: undefined,
projectName: undefined,
customerName: undefined,
plateNo: undefined,
vehicleTypes: [],
brands: [],
model: undefined
});
var applied = appliedState[0];
var setApplied = appliedState[1];
var pendingDataState = useState(defaultPending.slice());
var pendingData = pendingDataState[0];
var setPendingData = pendingDataState[1];
var historyDataState = useState(defaultHistory.slice());
var historyData = historyDataState[0];
var tabState = useState('pending');
var tab = tabState[0];
var setTab = tabState[1];
var pageState = useState(1);
var page = pageState[0];
var setPage = pageState[1];
var pageSizeState = useState(10);
var pageSize = pageSizeState[0];
var setPageSize = pageSizeState[1];
var filterExpandedState = useState(false);
var filterExpanded = filterExpandedState[0];
var setFilterExpanded = filterExpandedState[1];
var requirementModalVisibleState = useState(false);
var requirementModalVisible = requirementModalVisibleState[0];
var setRequirementModalVisible = requirementModalVisibleState[1];
var handleQuery = useCallback(function () {
setApplied(Object.assign({}, fd));
setPage(1);
message.success('已查询(原型)');
}, [fd]);
var handleReset = useCallback(function () {
var empty = { contractCode: undefined, projectName: undefined, customerName: undefined, plateNo: undefined, vehicleTypes: [], brands: [], model: undefined };
setFd(empty);
setApplied(empty);
setPage(1);
}, []);
function matchFilters(row) {
if (applied.contractCode && row.contractCode !== applied.contractCode) return false;
if (applied.projectName && row.projectName !== applied.projectName) return false;
if (applied.customerName && row.customerName !== applied.customerName) return false;
if (applied.plateNo && row.plateNo !== applied.plateNo) return false;
if (applied.vehicleTypes && applied.vehicleTypes.length > 0 && applied.vehicleTypes.indexOf(row.vehicleType) === -1) return false;
if (applied.brands && applied.brands.length > 0 && applied.brands.indexOf(row.brand) === -1) return false;
if (applied.model && row.model !== applied.model) return false;
return true;
}
var filteredPending = useMemo(function () {
return pendingData.filter(matchFilters);
}, [pendingData, applied]);
var filteredHistory = useMemo(function () {
return historyData.filter(matchFilters);
}, [historyData, applied]);
var pagedPending = useMemo(function () {
var start = (page - 1) * pageSize;
return filteredPending.slice(start, start + pageSize);
}, [filteredPending, page, pageSize]);
var pagedHistory = useMemo(function () {
var start = (page - 1) * pageSize;
return filteredHistory.slice(start, start + pageSize);
}, [filteredHistory, page, pageSize]);
var handleVehicleArrived = useCallback(function (record) {
Modal.confirm({
title: '确认',
content: '请确认车辆是否到达',
okText: '确认',
cancelText: '取消',
onOk: function () {
setPendingData(function (prev) {
return prev.map(function (r) {
if (r.id !== record.id) return r;
return Object.assign({}, r, { vehicleArrived: true });
});
});
message.success('已确认车辆到达(原型)');
}
});
}, []);
var handleReturnCar = useCallback(function () {
message.info('跳转还车管理-还车页(原型)');
}, []);
var handleViewHistory = useCallback(function () {
message.info('跳转还车管理-查看(原型)');
}, []);
var handleExport = useCallback(function () {
message.success('导出(原型)');
}, []);
var filterLabelStyle = { marginBottom: 6, fontSize: 14, color: 'rgba(0,0,0,0.65)' };
var filterItemStyle = { marginBottom: 12 };
var filterControlStyle = { width: '100%' };
var layoutStyle = { padding: '16px 24px', background: '#f5f5f5', minHeight: '100vh' };
var tableSingleLineStyle = '.return-car-list-table .ant-table-thead th,.return-car-list-table .ant-table-tbody td{white-space:nowrap;}';
var reqTitleStyle = { fontSize: 18, fontWeight: 600, marginBottom: 16, color: 'rgba(0,0,0,0.85)' };
var reqSectionStyle = { fontSize: 15, fontWeight: 600, marginTop: 16, marginBottom: 8, color: 'rgba(0,0,0,0.85)' };
var reqItemStyle = { fontSize: 13, marginLeft: 16, marginTop: 4, marginBottom: 2, lineHeight: 1.6, color: 'rgba(0,0,0,0.75)' };
var pendingColumns = [
{ title: '交车时间', dataIndex: 'deliveryTime', key: 'deliveryTime', width: 160 },
{ title: '交车人', dataIndex: 'deliveryPerson', key: 'deliveryPerson', width: 90 },
{ title: '车牌号', dataIndex: 'plateNo', key: 'plateNo', width: 100 },
{ title: '车辆类型', dataIndex: 'vehicleType', key: 'vehicleType', width: 120, ellipsis: true },
{ title: '品牌', dataIndex: 'brand', key: 'brand', width: 80 },
{ title: '型号', dataIndex: 'model', key: 'model', width: 110, ellipsis: true },
{ title: '车辆识别代码', dataIndex: 'vin', key: 'vin', width: 160, ellipsis: true },
{ title: '合同编码', dataIndex: 'contractCode', key: 'contractCode', width: 130, ellipsis: true },
{ title: '客户名称', dataIndex: 'customerName', key: 'customerName', width: 160, ellipsis: true },
{ title: '项目名称', dataIndex: 'projectName', key: 'projectName', width: 140, ellipsis: true },
{ title: '业务部门', dataIndex: 'dept', key: 'dept', width: 110, ellipsis: true },
{ title: '业务负责人', dataIndex: 'bizOwner', key: 'bizOwner', width: 100 },
{
title: '操作',
key: 'action',
width: 160,
fixed: 'right',
render: function (_, record) {
return React.createElement('div', { style: { display: 'flex', gap: 8, flexWrap: 'wrap' } },
record.vehicleArrived
? React.createElement(Button, { type: 'link', size: 'small', style: { padding: 0 }, onClick: handleReturnCar }, '还车')
: React.createElement(Button, { type: 'link', size: 'small', style: { padding: 0 }, onClick: function () { handleVehicleArrived(record); } }, '车辆到达')
);
}
}
];
var historyColumns = [
{ title: '交车时间', dataIndex: 'deliveryTime', key: 'deliveryTime', width: 160 },
{ title: '交车人', dataIndex: 'deliveryPerson', key: 'deliveryPerson', width: 90 },
{ title: '还车时间', dataIndex: 'returnTime', key: 'returnTime', width: 160 },
{ title: '还车人', dataIndex: 'deliveryPerson', key: 'returnPersonAsDelivery', width: 90 },
{ title: '车牌号', dataIndex: 'plateNo', key: 'plateNo', width: 100 },
{ title: '车辆类型', dataIndex: 'vehicleType', key: 'vehicleType', width: 120, ellipsis: true },
{ title: '品牌', dataIndex: 'brand', key: 'brand', width: 80 },
{ title: '型号', dataIndex: 'model', key: 'model', width: 110, ellipsis: true },
{ title: '车辆识别代码', dataIndex: 'vin', key: 'vin', width: 160, ellipsis: true },
{ title: '合同编码', dataIndex: 'contractCode', key: 'contractCode', width: 130, ellipsis: true },
{ title: '客户名称', dataIndex: 'customerName', key: 'customerName', width: 160, ellipsis: true },
{ title: '项目名称', dataIndex: 'projectName', key: 'projectName', width: 140, ellipsis: true },
{ title: '业务部门', dataIndex: 'dept', key: 'dept', width: 110, ellipsis: true },
{ title: '业务负责人', dataIndex: 'bizOwner', key: 'bizOwner', width: 100 },
{
title: '操作',
key: 'action',
width: 80,
fixed: 'right',
render: function () {
return React.createElement(Button, { type: 'link', size: 'small', style: { padding: 0 }, onClick: handleViewHistory }, '查看');
}
}
];
var filterItems = [
React.createElement('div', { key: 'contractCode', style: filterItemStyle },
React.createElement('div', { style: filterLabelStyle }, '合同编码'),
React.createElement(Select, {
placeholder: '请选择或输入合同编码',
style: filterControlStyle,
value: fd.contractCode,
onChange: function (v) { setFd(function (p) { return Object.assign({}, p, { contractCode: v }); }); },
allowClear: true,
showSearch: true,
options: contractOptions,
filterOption: filterOption
})),
React.createElement('div', { key: 'projectName', style: filterItemStyle },
React.createElement('div', { style: filterLabelStyle }, '项目名称'),
React.createElement(Select, {
placeholder: '请选择或输入项目名称',
style: filterControlStyle,
value: fd.projectName,
onChange: function (v) { setFd(function (p) { return Object.assign({}, p, { projectName: v }); }); },
allowClear: true,
showSearch: true,
options: projectOptions,
filterOption: filterOption
})),
React.createElement('div', { key: 'customerName', style: filterItemStyle },
React.createElement('div', { style: filterLabelStyle }, '客户名称'),
React.createElement(Select, {
placeholder: '请选择或输入客户名称',
style: filterControlStyle,
value: fd.customerName,
onChange: function (v) { setFd(function (p) { return Object.assign({}, p, { customerName: v }); }); },
allowClear: true,
showSearch: true,
options: customerOptions,
filterOption: filterOption
})),
React.createElement('div', { key: 'plateNo', style: filterItemStyle },
React.createElement('div', { style: filterLabelStyle }, '车牌号'),
React.createElement(Select, {
placeholder: '请选择或输入车牌号',
style: filterControlStyle,
value: fd.plateNo,
onChange: function (v) { setFd(function (p) { return Object.assign({}, p, { plateNo: v }); }); },
allowClear: true,
showSearch: true,
options: plateOptions,
filterOption: filterOption
})),
React.createElement('div', { key: 'vehicleTypes', style: filterItemStyle },
React.createElement('div', { style: filterLabelStyle }, '车辆类型'),
React.createElement(Select, {
mode: 'multiple',
placeholder: '请选择(可多选)',
style: filterControlStyle,
value: fd.vehicleTypes,
onChange: function (v) { setFd(function (p) { return Object.assign({}, p, { vehicleTypes: v || [] }); }); },
allowClear: true,
options: vehicleTypeOptions
})),
React.createElement('div', { key: 'brands', style: filterItemStyle },
React.createElement('div', { style: filterLabelStyle }, '品牌'),
React.createElement(Select, {
mode: 'multiple',
placeholder: '请选择(可多选)',
style: filterControlStyle,
value: fd.brands,
onChange: function (v) { setFd(function (p) { return Object.assign({}, p, { brands: v || [] }); }); },
allowClear: true,
options: brandOptions
})),
React.createElement('div', { key: 'model', style: filterItemStyle },
React.createElement('div', { style: filterLabelStyle }, '型号'),
React.createElement(Select, {
placeholder: '请选择或输入型号',
style: filterControlStyle,
value: fd.model,
onChange: function (v) { setFd(function (p) { return Object.assign({}, p, { model: v }); }); },
allowClear: true,
showSearch: true,
options: modelOptions,
filterOption: filterOption
}))
];
var filterCount = filterExpanded ? 7 : 3;
var filterNodes = [];
for (var fi = 0; fi < filterCount && fi < filterItems.length; fi++) {
filterNodes.push(filterItems[fi]);
}
var tabItems = [
{
key: 'pending',
label: '待处理',
children: React.createElement(Table, {
rowKey: 'id',
columns: pendingColumns,
dataSource: pagedPending,
scroll: { x: 1680 },
size: 'small',
pagination: {
current: page,
pageSize: pageSize,
total: filteredPending.length,
showSizeChanger: true,
showQuickJumper: true,
showTotal: function (t) { return '共 ' + t + ' 条'; },
onChange: function (pg, ps) { setPage(pg); if (ps) setPageSize(ps); }
}
})
},
{
key: 'history',
label: '历史记录',
children: React.createElement(Table, {
rowKey: 'id',
columns: historyColumns,
dataSource: pagedHistory,
scroll: { x: 1880 },
size: 'small',
pagination: {
current: page,
pageSize: pageSize,
total: filteredHistory.length,
showSizeChanger: true,
showQuickJumper: true,
showTotal: function (t) { return '共 ' + t + ' 条'; },
onChange: function (pg, ps) { setPage(pg); if (ps) setPageSize(ps); }
}
})
}
];
return React.createElement(App, null,
React.createElement('div', { style: layoutStyle },
React.createElement('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 16 } },
React.createElement(Breadcrumb, {
items: [
{ title: '运维管理' },
{ title: '车辆业务' },
{ title: '还车管理' }
]
}),
React.createElement(Button, { type: 'link', style: { padding: 0 }, onClick: function () { setRequirementModalVisible(true); } }, '查看需求说明')
),
React.createElement(Card, { style: { marginBottom: 16 } },
React.createElement('div', {
style: {
display: 'grid',
gridTemplateColumns: '1fr 1fr 1fr',
gap: '16px 24px',
alignItems: 'start',
flex: 1,
minWidth: 0
}
}, filterNodes),
React.createElement('div', { style: { display: 'flex', justifyContent: 'flex-end', gap: 8, marginTop: 16 } },
React.createElement(Button, { onClick: handleReset }, '重置'),
React.createElement(Button, { type: 'primary', onClick: handleQuery }, '查询'),
React.createElement(Button, { type: 'link', size: 'small', onClick: function () { setFilterExpanded(!filterExpanded); } }, filterExpanded ? '收起' : '展开')
)
),
React.createElement(Card, null,
React.createElement(React.Fragment, null,
React.createElement('style', null, tableSingleLineStyle),
React.createElement('div', { className: 'return-car-list-table' },
React.createElement(Tabs, {
activeKey: tab,
onChange: function (k) { setTab(k); setPage(1); },
tabBarExtraContent: React.createElement(Button, { onClick: handleExport }, '导出'),
items: tabItems
})
)
)
),
React.createElement(Modal, {
title: '需求说明',
open: requirementModalVisible,
onCancel: function () { setRequirementModalVisible(false); },
width: 720,
footer: React.createElement(Button, { onClick: function () { setRequirementModalVisible(false); } }, '关闭'),
bodyStyle: { maxHeight: '70vh', overflow: 'auto' }
}, React.createElement('div', { style: { padding: '8px 0' } },
React.createElement('div', { style: reqTitleStyle }, '还车管理'),
React.createElement('div', { style: { fontSize: 14, marginBottom: 12, color: 'rgba(0,0,0,0.85)' } }, '数字化资产 ONEOS 运管平台 · 运维管理 - 车辆业务 - 还车管理'),
React.createElement('div', { style: reqSectionStyle }, '筛选与列表'),
React.createElement('div', { style: reqItemStyle }, '面包屑:运维管理 - 车辆业务 - 还车管理;筛选区为三列栅格,默认一行(合同编码、项目名称、客户名称),展开后显示车牌号、车辆类型(多选)、品牌(多选)、型号;重置、查询、展开/收起与列表联动。'),
React.createElement('div', { style: reqItemStyle }, '列表分「待处理」「历史记录」TabTab 右侧为导出;待处理支持车辆到达确认后显示还车;历史记录支持查看。')
))
)
);
};
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));
}
}
}