运维/车辆业务:新增还车管理列表与还车单页面

- 新增还车管理列表页(待处理/历史记录)及筛选、导出、分页
- 新增还车单(还车)与只读查看页,含检查单抽屉与照片对照

Made-with: Cursor
This commit is contained in:
王冕
2026-03-19 01:24:48 +08:00
parent fbd54141a0
commit 3a04a3d1c1
3 changed files with 2151 additions and 0 deletions

View File

@@ -0,0 +1,479 @@
// 【重要】必须使用 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));
}
}
}