// 【重要】必须使用 const Component 作为组件变量名 // 停车场管理 - 车辆资产管理后台模块 // 设计变量参考 Arco Design Token: https://arco.design/react/docs/token var ARCO_TOKEN = { // 主色 / 品牌色 primary: '#165DFF', primaryHover: '#4080FF', primaryActive: '#0E42D2', // 功能色 danger: '#F53F3F', success: '#00B42A', warning: '#FF7D00', link: '#165DFF', // 中性色 (Neutral) neutral1: '#FFFFFF', neutral2: '#F7F8FA', neutral3: '#F2F3F5', neutral4: '#E5E6EB', neutral5: '#C9CDD4', neutral6: '#86909C', neutral7: '#4E5969', neutral8: '#1D2129', // 边框 border: '#E5E6EB', borderSecondary: '#C9CDD4', // 填充/背景 fill: '#F2F3F5', fillSecondary: '#F7F8FA', // 阴影 shadowLight: '0 1px 2px rgba(0,0,0,0.05)', shadowMedium: '0 2px 8px rgba(0,0,0,0.08)', // 圆角 radiusSmall: '2px', radiusMedium: '4px', radiusLarge: '8px', // 间距 spacing4: '4px', spacing8: '8px', spacing12: '12px', spacing16: '16px', spacing24: '24px', // 字体 fontSize14: '14px', fontSize16: '16px', fontFamily: '-apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", Arial, sans-serif' }; const Component = function () { var _useState = React.useState('list'); var currentView = _useState[0]; var setCurrentView = _useState[1]; var _useState2 = React.useState([]); var regionProvince = _useState2[0]; var setRegionProvince = _useState2[1]; var _useState3 = React.useState(''); var regionCity = _useState3[0]; var setRegionCity = _useState3[1]; var _useState4 = React.useState(''); var filterParkingName = _useState4[0]; var setFilterParkingName = _useState4[1]; var _useState5 = React.useState(''); var filterManager = _useState5[0]; var setFilterManager = _useState5[1]; var _useState5b = React.useState(false); var parkingNameInputFocused = _useState5b[0]; var setParkingNameInputFocused = _useState5b[1]; var _useState5d = React.useState(false); var managerInputFocused = _useState5d[0]; var setManagerInputFocused = _useState5d[1]; var _useState6 = React.useState(false); var showColumnSettings = _useState6[0]; var setShowColumnSettings = _useState6[1]; var _useState6b = React.useState(false); var columnIconHover = _useState6b[0]; var setColumnIconHover = _useState6b[1]; var _useState6c = React.useState(false); var regionCascaderOpen = _useState6c[0]; var setRegionCascaderOpen = _useState6c[1]; var _useState6d = React.useState(false); var formRegionCascaderOpen = _useState6d[0]; var setFormRegionCascaderOpen = _useState6d[1]; var _useState6e = React.useState(''); var regionCascaderHover = _useState6e[0]; var setRegionCascaderHover = _useState6e[1]; var _useState6f = React.useState(''); var formRegionCascaderHover = _useState6f[0]; var setFormRegionCascaderHover = _useState6f[1]; var _useState7 = React.useState(null); var vehicleDetailParkingId = _useState7[0]; var setVehicleDetailParkingId = _useState7[1]; var _useState8 = React.useState(null); var viewParking = _useState8[0]; var setViewParking = _useState8[1]; var _useState9 = React.useState(null); var editParking = _useState9[0]; var setEditParking = _useState9[1]; var _useState10 = React.useState(null); var deleteConfirmParking = _useState10[0]; var setDeleteConfirmParking = _useState10[1]; var _useState11 = React.useState(''); var toastMessage = _useState11[0]; var setToastMessage = _useState11[1]; var _useState11b = React.useState(false); var showRequirementModal = _useState11b[0]; var setShowRequirementModal = _useState11b[1]; // 分页状态 var _useState12 = React.useState(1); var currentPage = _useState12[0]; var setCurrentPage = _useState12[1]; var _useState13 = React.useState(10); var pageSize = _useState13[0]; var setPageSize = _useState13[1]; // 新建表单状态 var _useState12 = React.useState({ regionProvince: '', regionCity: '', parkingName: '', parkingSpaces: '', address: '', manager: '', managerPhone: '', contactName: '', contactPhone: '', leaseStart: '', leaseEnd: '', rentFee: '', contractFile: null }); var formData = _useState12[0]; var setFormData = _useState12[1]; // 列显示配置 var defaultColumnsVisible = { region: true, parkingName: true, parkedVehicles: true, parkingSpaces: true, address: true, leaseStart: true, leaseEnd: true, manager: true, managerPhone: true, contactName: true, contactPhone: true }; var _useState13 = React.useState(defaultColumnsVisible); var columnsVisible = _useState13[0]; var setColumnsVisible = _useState13[1]; // 模拟省-市数据 var provinceList = [ { code: 'gd', name: '广东省' }, { code: 'zj', name: '浙江省' }, { code: 'bj', name: '北京市' } ]; var cityMap = { gd: [{ code: 'gz', name: '广州市' }, { code: 'sz', name: '深圳市' }], zj: [{ code: 'hz', name: '杭州市' }, { code: 'nb', name: '宁波市' }], bj: [{ code: 'bj', name: '北京市' }] }; // 模拟停车场列表数据 var mockParkingList = [ { id: '1', regionProvince: '广东省', regionCity: '广州市', parkingName: '天河智慧停车场', parkedCount: 12, parkingSpaces: 50, address: '广州市天河区体育西路123号', leaseStart: '2023-01-01', leaseEnd: '2025-12-31', manager: '张明', managerPhone: '13800138001', contactName: '李华', contactPhone: '13900139001', vehicles: [ { city: '广州', frameNo: 'LGW123456', plateNo: '粤A12345', code: 'V001', brand: '比亚迪', model: '秦', color: '白色', status: '正常', mileage: 12000, location: '天河区体育西路', gpsTime: '2025-02-06 10:30:00' }, { city: '广州', frameNo: 'LGW789012', plateNo: '粤A67890', code: 'V002', brand: '特斯拉', model: 'Model 3', color: '黑色', status: '正常', mileage: 8000, location: '天河区体育西路', gpsTime: '2025-02-06 10:28:00' } ] }, { id: '2', regionProvince: '广东省', regionCity: '深圳市', parkingName: '南山科技园停车场', parkedCount: 0, parkingSpaces: 80, address: '深圳市南山区科技园南路88号', leaseStart: '2022-06-01', leaseEnd: '2025-05-31', manager: '王芳', managerPhone: '13700137001', contactName: '赵强', contactPhone: '13600136001', vehicles: [] }, { id: '3', regionProvince: '浙江省', regionCity: '杭州市', parkingName: '西湖景区停车场', parkedCount: 5, parkingSpaces: 30, address: '杭州市西湖区杨公堤1号', leaseStart: '2024-01-01', leaseEnd: '2026-12-31', manager: '陈静', managerPhone: '13500135001', contactName: '刘洋', contactPhone: '13400134001', vehicles: [ { city: '杭州', frameNo: 'HZ111', plateNo: '浙A11111', code: 'V003', brand: '小鹏', model: 'P7', color: '灰色', status: '维修', mileage: 15000, location: '西湖区杨公堤', gpsTime: '2025-02-05 18:00:00' } ] } ]; // 获取所有唯一的停车场名称和负责人 var getAllParkingNames = function () { var names = []; var seen = {}; mockParkingList.forEach(function (item) { if (item.parkingName && !seen[item.parkingName]) { seen[item.parkingName] = true; names.push(item.parkingName); } }); return names.sort(); }; var getAllManagers = function () { var managers = []; var seen = {}; mockParkingList.forEach(function (item) { if (item.manager && !seen[item.manager]) { seen[item.manager] = true; managers.push(item.manager); } }); return managers.sort(); }; var allParkingNames = getAllParkingNames(); var allManagers = getAllManagers(); var getFilteredList = function () { var list = mockParkingList; if (regionProvince && regionProvince.length > 0) { var p = provinceList.find(function (x) { return x.code === regionProvince; }); var pName = p ? p.name : ''; list = list.filter(function (item) { return item.regionProvince === pName; }); } if (regionCity) { var cities = cityMap[regionProvince]; var c = cities && cities.find(function (x) { return x.code === regionCity; }); var cName = c ? c.name : ''; list = list.filter(function (item) { return item.regionCity === cName; }); } if (filterParkingName) { list = list.filter(function (item) { return item.parkingName && item.parkingName.indexOf(filterParkingName) >= 0; }); } if (filterManager) { list = list.filter(function (item) { return item.manager && item.manager.indexOf(filterManager) >= 0; }); } return list; }; var filteredList = getFilteredList(); var totalItems = filteredList.length; var totalPages = Math.ceil(totalItems / pageSize) || 1; var validPage = currentPage > totalPages && totalPages > 0 ? 1 : (currentPage < 1 ? 1 : currentPage); if (validPage !== currentPage && totalPages > 0) { setCurrentPage(1); validPage = 1; } var startIndex = (validPage - 1) * pageSize; var endIndex = startIndex + pageSize; var paginatedList = filteredList.slice(startIndex, endIndex); var handleExport = function () { setToastMessage('导出功能为原型演示'); setTimeout(function () { setToastMessage(''); }, 2000); }; var handleDeleteConfirm = function () { if (!deleteConfirmParking) return; if (deleteConfirmParking.parkedCount > 0) { setToastMessage('该停车场存在车辆,无法删除'); setDeleteConfirmParking(null); setTimeout(function () { setToastMessage(''); }, 2000); return; } setToastMessage('删除成功'); setDeleteConfirmParking(null); setTimeout(function () { setToastMessage(''); }, 2000); }; var handleFormChange = function (field, value) { var next = {}; for (var k in formData) { next[k] = formData[k]; } next[field] = value; setFormData(next); }; var handleSubmitNew = function () { if (!formData.regionProvince || !formData.regionCity) { setToastMessage('请选择地区'); setTimeout(function () { setToastMessage(''); }, 2000); return; } if (!formData.parkingName || !formData.parkingName.trim()) { setToastMessage('请填写停车场名称'); setTimeout(function () { setToastMessage(''); }, 2000); return; } if (!formData.leaseStart) { setToastMessage('请选择租赁开始时间'); setTimeout(function () { setToastMessage(''); }, 2000); return; } if (!formData.leaseEnd) { setToastMessage('请选择租赁到期时间'); setTimeout(function () { setToastMessage(''); }, 2000); return; } if (formData.leaseEnd < formData.leaseStart) { setToastMessage('租赁到期时间不能早于租赁开始时间'); setTimeout(function () { setToastMessage(''); }, 2000); return; } if (!formData.rentFee || formData.rentFee.trim() === '') { setToastMessage('请填写租赁费'); setTimeout(function () { setToastMessage(''); }, 2000); return; } setToastMessage('提交成功'); setTimeout(function () { setToastMessage(''); }, 1500); setCurrentView('list'); setFormData({ regionProvince: '', regionCity: '', parkingName: '', parkingSpaces: '', address: '', manager: '', managerPhone: '', contactName: '', contactPhone: '', leaseStart: '', leaseEnd: '', rentFee: '', contractFile: null }); }; var handleCancelNew = function () { setCurrentView('list'); setFormData({ regionProvince: '', regionCity: '', parkingName: '', parkingSpaces: '', address: '', manager: '', managerPhone: '', contactName: '', contactPhone: '', leaseStart: '', leaseEnd: '', rentFee: '', contractFile: null }); }; var t = ARCO_TOKEN; var styles = { page: { padding: t.spacing24, fontFamily: t.fontFamily, backgroundColor: t.fill, minHeight: '100vh' }, breadcrumb: { marginBottom: t.spacing16, fontSize: t.fontSize14, color: t.neutral6, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }, breadcrumbLeft: { display: 'flex', alignItems: 'center' }, breadcrumbLink: { color: t.link, textDecoration: 'none', marginRight: t.spacing8 }, breadcrumbCurrent: { color: t.neutral8 }, breadcrumbRight: { display: 'flex', alignItems: 'center' }, requirementLink: { color: t.link, textDecoration: 'none', fontSize: t.fontSize14, cursor: 'pointer' }, card: { backgroundColor: t.neutral1, borderRadius: t.radiusLarge, boxShadow: t.shadowLight, marginBottom: t.spacing16, padding: t.spacing16 }, filterRow: { display: 'flex', flexWrap: 'wrap', alignItems: 'center', justifyContent: 'space-between', gap: t.spacing12 }, filterRowLeft: { display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: t.spacing12 }, filterRowRight: { display: 'flex', alignItems: 'center', gap: t.spacing8, marginLeft: 'auto' }, label: { marginRight: t.spacing8, fontSize: t.fontSize14, color: t.neutral8 }, select: { padding: '0 10px', height: '32px', borderRadius: '2px', border: '1px solid ' + t.border, fontSize: t.fontSize14, boxSizing: 'border-box' }, input: { padding: '0 10px', height: '32px', width: '100%', borderRadius: '2px', border: '1px solid ' + t.border, fontSize: t.fontSize14, boxSizing: 'border-box' }, toolbar: { display: 'flex', alignItems: 'center', justifyContent: 'flex-end', gap: t.spacing12, marginBottom: t.spacing16 }, btn: { padding: t.spacing8 + ' ' + t.spacing16, borderRadius: t.radiusMedium, cursor: 'pointer', fontSize: t.fontSize14, display: 'inline-flex', alignItems: 'center', justifyContent: 'center', gap: '6px', boxSizing: 'border-box' }, btnFixed: { width: '100px', height: '32px', padding: 0, borderRadius: '2px', lineHeight: '1' }, btnIcon: { width: '14px', height: '14px', flexShrink: 0, display: 'block' }, btnPrimary: { backgroundColor: t.primary, color: t.neutral1, border: 'none' }, btnFillBlue: { backgroundColor: t.primary, color: t.neutral1, border: 'none' }, btnOutlineBlue: { backgroundColor: t.neutral1, color: t.primary, border: '1px solid ' + t.primary }, btnDefault: { backgroundColor: t.neutral1, color: t.neutral8, border: '1px solid ' + t.border }, btnDanger: { backgroundColor: t.danger, color: t.neutral1, border: 'none' }, tableWrap: { overflowX: 'auto', backgroundColor: t.neutral1, borderRadius: t.radiusMedium, border: '1px solid ' + t.neutral4 }, table: { width: '100%', borderCollapse: 'separate', borderSpacing: 0, fontSize: t.fontSize14 }, th: { textAlign: 'left', padding: '12px 16px', backgroundColor: t.fillSecondary, borderBottom: '1px solid ' + t.neutral4, fontWeight: 600, color: t.neutral8, fontSize: t.fontSize14, whiteSpace: 'nowrap' }, td: { padding: '12px 16px', borderBottom: '1px solid ' + t.neutral4, color: t.neutral8, fontSize: t.fontSize14 }, trHover: { backgroundColor: t.fillSecondary }, pagination: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '16px', borderTop: '1px solid ' + t.neutral4, backgroundColor: t.neutral1 }, paginationLeft: { display: 'flex', alignItems: 'center', gap: '8px', fontSize: t.fontSize14, color: t.neutral7 }, paginationRight: { display: 'flex', alignItems: 'center', gap: '8px' }, paginationSelect: { padding: '4px 8px', height: '28px', borderRadius: '2px', border: '1px solid ' + t.border, fontSize: t.fontSize14, backgroundColor: t.neutral1 }, paginationBtn: { minWidth: '28px', height: '28px', padding: '0 8px', borderRadius: '2px', border: '1px solid ' + t.border, backgroundColor: t.neutral1, color: t.neutral8, cursor: 'pointer', fontSize: t.fontSize14, display: 'inline-flex', alignItems: 'center', justifyContent: 'center' }, paginationBtnActive: { backgroundColor: t.primary, color: t.neutral1, borderColor: t.primary }, paginationBtnDisabled: { opacity: 0.5, cursor: 'not-allowed' }, paginationInput: { width: '50px', height: '28px', padding: '0 8px', borderRadius: '2px', border: '1px solid ' + t.border, fontSize: t.fontSize14, textAlign: 'center' }, linkBlue: { color: t.link, cursor: 'pointer', textDecoration: 'none' }, actionLink: { color: t.link, cursor: 'pointer', marginRight: t.spacing12, fontSize: t.fontSize14 }, modalMask: { position: 'fixed', left: 0, top: 0, right: 0, bottom: 0, backgroundColor: 'rgba(0,0,0,0.45)', zIndex: 1000, display: 'flex', alignItems: 'center', justifyContent: 'center' }, modalBox: { backgroundColor: t.neutral1, borderRadius: t.radiusLarge, maxWidth: '90%', maxHeight: '90%', overflow: 'auto', padding: t.spacing24, minWidth: '500px', position: 'relative' }, modalTitle: { fontSize: t.fontSize16, fontWeight: 600, marginBottom: t.spacing16, color: t.neutral8 }, modalHeader: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: t.spacing16 }, modalCloseBtn: { position: 'absolute', right: t.spacing16, top: t.spacing16, width: '24px', height: '24px', display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', borderRadius: t.radiusMedium, backgroundColor: 'transparent', border: 'none', color: t.neutral6, fontSize: '18px', lineHeight: '1', padding: 0 }, modalCloseBtnHover: { backgroundColor: t.fill, color: t.neutral8 }, modalContent: { fontSize: t.fontSize14, color: t.neutral8, lineHeight: '1.6', whiteSpace: 'pre-wrap' }, requirementSection: { marginBottom: t.spacing16 }, requirementSectionTitle: { fontSize: t.fontSize16, fontWeight: 600, color: t.neutral8, marginBottom: t.spacing8 }, requirementItem: { marginBottom: t.spacing8, paddingLeft: t.spacing16 }, requirementSubItem: { marginBottom: t.spacing4, paddingLeft: t.spacing16, fontSize: t.fontSize14, color: t.neutral7 }, modalFooter: { marginTop: t.spacing24, display: 'flex', justifyContent: 'flex-end', gap: t.spacing8 }, toast: { position: 'fixed', top: t.spacing24, left: '50%', transform: 'translateX(-50%)', backgroundColor: 'rgba(0,0,0,0.75)', color: t.neutral1, padding: '10px 20px', borderRadius: t.radiusMedium, zIndex: 2000, fontSize: t.fontSize14 }, formRow: { marginBottom: t.spacing16 }, formLabel: { display: 'block', marginBottom: '6px', fontSize: t.fontSize14, color: t.neutral8 }, formLabelReq: { color: t.danger, marginLeft: '2px' }, vehicleCard: { border: '1px solid ' + t.neutral4, borderRadius: '6px', padding: t.spacing12, backgroundColor: t.fillSecondary, fontSize: '13px', color: t.neutral8 }, vehicleCardRow: { marginBottom: t.spacing4 }, vehicleModalBox: { backgroundColor: t.neutral1, borderRadius: t.radiusLarge, maxWidth: '1200px', width: '90%', maxHeight: '80vh', overflow: 'auto', padding: t.spacing24, boxShadow: t.shadowMedium }, vehicleModalTitle: { fontSize: t.fontSize16, fontWeight: 600, marginBottom: t.spacing16, color: t.neutral8 }, columnSettingsBox: { position: 'absolute', right: 0, top: '100%', marginTop: t.spacing4, backgroundColor: t.neutral1, border: '1px solid ' + t.border, borderRadius: t.radiusMedium, padding: 0, minWidth: '220px', boxShadow: t.shadowMedium, zIndex: 100 }, columnSettingsHeader: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: t.spacing12, borderBottom: '1px solid ' + t.neutral4, fontSize: t.fontSize14, fontWeight: 600, color: t.neutral8 }, columnSettingsBody: { padding: t.spacing12, maxHeight: '320px', overflowY: 'auto' }, checkboxRow: { marginBottom: '6px', fontSize: t.fontSize14 }, iconBtn: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '32px', height: '32px', padding: 0, margin: 0, backgroundColor: 'transparent', border: 'none', borderRadius: t.radiusMedium, cursor: 'pointer', color: t.neutral6, transition: 'background-color 0.2s, color 0.2s' }, newPageLayout: { display: 'flex', gap: t.spacing24, flexWrap: 'wrap' }, newPageForm: { flex: '2', minWidth: '400px' }, newPageMap: { flex: '1', minWidth: '300px', height: '400px', backgroundColor: t.neutral4, borderRadius: t.radiusLarge, display: 'flex', alignItems: 'center', justifyContent: 'center', color: t.neutral6, fontSize: t.fontSize14 }, cascaderWrap: { position: 'relative', width: '300px' }, cascaderInput: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', width: '100%', height: '32px', padding: '0 10px', borderRadius: '2px', border: '1px solid ' + t.border, backgroundColor: t.neutral1, fontSize: t.fontSize14, color: t.neutral8, cursor: 'pointer', boxSizing: 'border-box' }, cascaderInputFocus: { borderColor: t.primary, outline: 'none' }, cascaderPlaceholder: { color: t.neutral6 }, cascaderChevron: { marginLeft: '8px', color: t.neutral6, transition: 'transform 0.2s' }, cascaderPanel: { position: 'absolute', left: 0, top: '100%', marginTop: '4px', backgroundColor: t.neutral1, borderRadius: t.radiusMedium, border: '1px solid ' + t.border, boxShadow: t.shadowMedium, zIndex: 100, display: 'flex', minWidth: '280px', maxHeight: '280px' }, cascaderColumn: { minWidth: '120px', maxHeight: '280px', overflowY: 'auto', borderRight: '1px solid ' + t.neutral4 }, cascaderColumnLast: { borderRight: 'none' }, cascaderOption: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '8px 12px', fontSize: t.fontSize14, color: t.neutral8, cursor: 'pointer', whiteSpace: 'nowrap' }, cascaderOptionHover: { backgroundColor: t.fill }, autocompleteWrap: { position: 'relative', width: '300px' }, autocompletePanel: { position: 'absolute', left: 0, top: '100%', marginTop: '4px', backgroundColor: t.neutral1, borderRadius: t.radiusMedium, border: '1px solid ' + t.border, boxShadow: t.shadowMedium, zIndex: 100, minWidth: '100%', maxHeight: '240px', overflowY: 'auto' }, autocompleteOption: { padding: '8px 12px', fontSize: t.fontSize14, color: t.neutral8, cursor: 'pointer' }, autocompleteOptionHover: { backgroundColor: t.fill } }; return (
{/* 面包屑 */}
基本数据维护 / 停车场
查看需求说明
{currentView === 'list' && ( {/* 筛选栏 - 单独卡片 */}
地区:
{regionProvince && regionCity ? (function () { var p = provinceList.find(function (x) { return x.code === regionProvince; }); var cities = cityMap[regionProvince]; var c = cities && cities.find(function (x) { return x.code === regionCity; }); return (p ? p.name : '') + (p && c ? ' - ' : '') + (c ? c.name : ''); }()) : '请选择省/市'}
{regionCascaderOpen && (
{provinceList.map(function (p) { var isSelected = regionProvince === p.code; var isHovered = regionCascaderHover === 'p-' + p.code; return React.createElement('div', { key: p.code, style: Object.assign({}, styles.cascaderOption, (isSelected || isHovered) ? styles.cascaderOptionHover : {}), onClick: function () { setRegionProvince(p.code); setRegionCity(''); }, onMouseEnter: function () { setRegionCascaderHover('p-' + p.code); }, onMouseLeave: function () { setRegionCascaderHover(''); } }, p.name, React.createElement('span', { style: { color: t.neutral6 } }, '>')); })}
{(cityMap[regionProvince] || []).map(function (c) { var isSelected = regionCity === c.code; var isHovered = regionCascaderHover === 'c-' + c.code; return React.createElement('div', { key: c.code, style: Object.assign({}, styles.cascaderOption, (isSelected || isHovered) ? styles.cascaderOptionHover : {}), onClick: function () { setRegionCity(c.code); setRegionCascaderOpen(false); }, onMouseEnter: function () { setRegionCascaderHover('c-' + c.code); }, onMouseLeave: function () { setRegionCascaderHover(''); } }, c.name); })}
)}
停车场名称:
{(parkingNameInputFocused || filterParkingName) && allParkingNames.filter(function (name) { return !filterParkingName || name.indexOf(filterParkingName) >= 0; }).length > 0 && (
{allParkingNames.filter(function (name) { return !filterParkingName || name.indexOf(filterParkingName) >= 0; }).map(function (name) { var isSelected = filterParkingName === name; return React.createElement('div', { key: name, style: Object.assign({}, styles.autocompleteOption, isSelected ? styles.autocompleteOptionHover : {}), onMouseDown: function (e) { e.preventDefault(); }, onClick: function () { setFilterParkingName(name); setParkingNameInputFocused(false); }, onMouseEnter: function (e) { e.currentTarget.style.backgroundColor = t.fill; }, onMouseLeave: function (e) { if (!isSelected) e.currentTarget.style.backgroundColor = 'transparent'; } }, name); })}
)}
负责人:
{(managerInputFocused || filterManager) && allManagers.filter(function (manager) { return !filterManager || manager.indexOf(filterManager) >= 0; }).length > 0 && (
{allManagers.filter(function (manager) { return !filterManager || manager.indexOf(filterManager) >= 0; }).map(function (manager) { var isSelected = filterManager === manager; return React.createElement('div', { key: manager, style: Object.assign({}, styles.autocompleteOption, isSelected ? styles.autocompleteOptionHover : {}), onMouseDown: function (e) { e.preventDefault(); }, onClick: function () { setFilterManager(manager); setManagerInputFocused(false); }, onMouseEnter: function (e) { e.currentTarget.style.backgroundColor = t.fill; }, onMouseLeave: function (e) { if (!isSelected) e.currentTarget.style.backgroundColor = 'transparent'; } }, manager); })}
)}
{/* 列表区 - 单独卡片 */}
{showColumnSettings && (
列展示
{Object.keys(columnsVisible).map(function (key) { var labels = { region: '地区', parkingName: '停车场名称', parkedVehicles: '停放车辆', parkingSpaces: '车位数', address: '地址', leaseStart: '租赁开始时间', leaseEnd: '租赁结束时间', manager: '负责人', managerPhone: '负责人联系方式', contactName: '停车场联系人', contactPhone: '停车场电话' }; return React.createElement( 'div', { key: key, style: styles.checkboxRow }, React.createElement('label', { style: { display: 'flex', alignItems: 'center', cursor: 'pointer' }}, React.createElement('input', { type: 'checkbox', checked: columnsVisible[key], onChange: function () { var next = {}; for (var k in columnsVisible) { next[k] = columnsVisible[k]; } next[key] = !columnsVisible[key]; setColumnsVisible(next); } }), React.createElement('span', { style: { marginLeft: '8px' } }, labels[key] || key) ) ); })}
)}
{/* 表格 */}
{columnsVisible.region && React.createElement('th', { style: styles.th }, '地区')} {columnsVisible.parkingName && React.createElement('th', { style: styles.th }, '停车场名称')} {columnsVisible.parkedVehicles && React.createElement('th', { style: styles.th }, '停放车辆')} {columnsVisible.parkingSpaces && React.createElement('th', { style: styles.th }, '车位数')} {columnsVisible.address && React.createElement('th', { style: styles.th }, '地址')} {columnsVisible.leaseStart && React.createElement('th', { style: styles.th }, '租赁开始时间')} {columnsVisible.leaseEnd && React.createElement('th', { style: styles.th }, '租赁结束时间')} {columnsVisible.manager && React.createElement('th', { style: styles.th }, '负责人')} {columnsVisible.managerPhone && React.createElement('th', { style: styles.th }, '负责人联系方式')} {columnsVisible.contactName && React.createElement('th', { style: styles.th }, '停车场联系人')} {columnsVisible.contactPhone && React.createElement('th', { style: styles.th }, '停车场电话')} {paginatedList.length === 0 ? ( React.createElement('tr', {}, React.createElement('td', { colSpan: Object.keys(columnsVisible).filter(function (k) { return columnsVisible[k]; }).length + 1, style: Object.assign({}, styles.td, { textAlign: 'center', color: t.neutral6, padding: '40px' }) }, '暂无数据') ) ) : paginatedList.map(function (row) { return React.createElement( 'tr', { key: row.id, style: { transition: 'background-color 0.2s' }, onMouseEnter: function (e) { e.currentTarget.style.backgroundColor = t.fillSecondary; }, onMouseLeave: function (e) { e.currentTarget.style.backgroundColor = 'transparent'; } }, columnsVisible.region && React.createElement('td', { style: styles.td }, row.regionProvince + '-' + row.regionCity), columnsVisible.parkingName && React.createElement('td', { style: styles.td }, row.parkingName), columnsVisible.parkedVehicles && React.createElement('td', { style: styles.td }, React.createElement('span', { style: styles.linkBlue, onClick: function () { if (row.parkedCount > 0 && row.vehicles && row.vehicles.length > 0) { setVehicleDetailParkingId(row.id); } else { setToastMessage('该停车场暂无车辆'); setTimeout(function () { setToastMessage(''); }, 2000); } } }, row.parkedCount) ), columnsVisible.parkingSpaces && React.createElement('td', { style: styles.td }, row.parkingSpaces), columnsVisible.address && React.createElement('td', { style: styles.td }, row.address), columnsVisible.leaseStart && React.createElement('td', { style: styles.td }, row.leaseStart), columnsVisible.leaseEnd && React.createElement('td', { style: styles.td }, row.leaseEnd), columnsVisible.manager && React.createElement('td', { style: styles.td }, row.manager), columnsVisible.managerPhone && React.createElement('td', { style: styles.td }, row.managerPhone), columnsVisible.contactName && React.createElement('td', { style: styles.td }, row.contactName), columnsVisible.contactPhone && React.createElement('td', { style: styles.td }, row.contactPhone), React.createElement('td', { style: styles.td }, React.createElement('a', { style: styles.actionLink, onClick: function (e) { e.preventDefault(); setViewParking(row); } }, '查看'), React.createElement('a', { style: styles.actionLink, onClick: function (e) { e.preventDefault(); setEditParking(row); } }, '编辑'), React.createElement('a', { style: Object.assign({}, styles.actionLink, { color: t.danger }), onClick: function (e) { e.preventDefault(); setDeleteConfirmParking(row); } }, '删除') ) ); })}
操作
{/* 分页 */} {totalItems > 0 && (
共 {totalItems} 条 每页显示
{(function () { var pages = []; var showPages = 5; var startPage = Math.max(1, currentPage - Math.floor(showPages / 2)); var endPage = Math.min(totalPages, startPage + showPages - 1); if (endPage - startPage < showPages - 1) { startPage = Math.max(1, endPage - showPages + 1); } if (startPage > 1) { pages.push(React.createElement('button', { key: 1, style: styles.paginationBtn, onClick: function () { setCurrentPage(1); }, onMouseLeave: function (e) { e.currentTarget.style.borderColor = t.border; e.currentTarget.style.color = t.neutral8; } }, '1')); if (startPage > 2) { pages.push(React.createElement('span', { key: 'ellipsis1', style: { padding: '0 4px', color: t.neutral7 } }, '...')); } } for (var i = startPage; i <= endPage; i++) { var isActive = i === currentPage; pages.push(React.createElement('button', { key: i, style: Object.assign({}, styles.paginationBtn, isActive ? styles.paginationBtnActive : {}), onClick: function (page) { return function () { setCurrentPage(page); }; }(i), onMouseLeave: function (e) { if (!isActive) { e.currentTarget.style.borderColor = t.border; e.currentTarget.style.color = t.neutral8; } } }, i)); } if (endPage < totalPages) { if (endPage < totalPages - 1) { pages.push(React.createElement('span', { key: 'ellipsis2', style: { padding: '0 4px', color: t.neutral7 } }, '...')); } pages.push(React.createElement('button', { key: totalPages, style: styles.paginationBtn, onClick: function () { setCurrentPage(totalPages); }, onMouseLeave: function (e) { e.currentTarget.style.borderColor = t.border; e.currentTarget.style.color = t.neutral8; } }, totalPages)); } return pages; })()} 跳至 = 1 && page <= totalPages) { setCurrentPage(page); } }} onKeyDown={function (e) { if (e.key === 'Enter') { var page = parseInt(e.target.value, 10); if (page >= 1 && page <= totalPages) { setCurrentPage(page); } } }} />
)}
)} {/* 新建停车场页面 */} {currentView === 'new' && (
新建停车场
地区 *
{formData.regionProvince && formData.regionCity ? (function () { var p = provinceList.find(function (x) { return x.code === formData.regionProvince; }); var cities = cityMap[formData.regionProvince]; var c = cities && cities.find(function (x) { return x.code === formData.regionCity; }); return (p ? p.name : '') + (p && c ? ' - ' : '') + (c ? c.name : ''); }()) : '请选择省/市'}
{formRegionCascaderOpen && (
{provinceList.map(function (p) { var isSelected = formData.regionProvince === p.code; var isHovered = formRegionCascaderHover === 'p-' + p.code; return React.createElement('div', { key: p.code, style: Object.assign({}, styles.cascaderOption, (isSelected || isHovered) ? styles.cascaderOptionHover : {}), onClick: function () { handleFormChange('regionProvince', p.code); handleFormChange('regionCity', ''); }, onMouseEnter: function () { setFormRegionCascaderHover('p-' + p.code); }, onMouseLeave: function () { setFormRegionCascaderHover(''); } }, p.name, React.createElement('span', { style: { color: t.neutral6 } }, '>')); })}
{(cityMap[formData.regionProvince] || []).map(function (c) { var isSelected = formData.regionCity === c.code; var isHovered = formRegionCascaderHover === 'c-' + c.code; return React.createElement('div', { key: c.code, style: Object.assign({}, styles.cascaderOption, (isSelected || isHovered) ? styles.cascaderOptionHover : {}), onClick: function () { handleFormChange('regionCity', c.code); setFormRegionCascaderOpen(false); }, onMouseEnter: function () { setFormRegionCascaderHover('c-' + c.code); }, onMouseLeave: function () { setFormRegionCascaderHover(''); } }, c.name); })}
)}
停车场名称 *
车位数
地址
负责人
负责人电话
停车场联系人
停车场电话
租赁开始时间 *
租赁到期时间 *
租赁费 *
租赁合同 支持上传PDF
地图区域(输入地址可定位,拖动反写地址) {formData.address && React.createElement('div', { style: { marginTop: '8px', fontSize: '12px' } }, '当前地址:' + formData.address)}
)} {/* 编辑弹窗 - 与新增相同可编辑 */} {editParking && (
编辑停车场
地区 * {editParking.regionProvince}-{editParking.regionCity}
停车场名称
车位数
地址
负责人 / 负责人电话
停车场联系人 / 停车场电话
租赁开始时间 / 租赁结束时间 {editParking.leaseStart} / {editParking.leaseEnd}
)} {/* 查看弹窗 - 与新增相同但只读 */} {viewParking && (
查看停车场
地区 {viewParking.regionProvince}-{viewParking.regionCity}
停车场名称 {viewParking.parkingName}
车位数 {viewParking.parkingSpaces}
地址 {viewParking.address}
负责人 / 负责人电话 {viewParking.manager} / {viewParking.managerPhone}
停车场联系人 / 停车场电话 {viewParking.contactName} / {viewParking.contactPhone}
租赁开始时间 / 租赁结束时间 {viewParking.leaseStart} / {viewParking.leaseEnd}
)} {/* 删除确认弹窗 */} {deleteConfirmParking && (
确认删除

是否确认删除该停车场?

)} {/* 车辆信息弹框 */} {vehicleDetailParkingId && (function () { var row = mockParkingList.find(function (r) { return r.id === vehicleDetailParkingId; }); if (!row || !row.vehicles || row.vehicles.length === 0) { return null; } return React.createElement( 'div', { style: styles.modalMask, onClick: function () { setVehicleDetailParkingId(null); } }, React.createElement('div', { style: styles.vehicleModalBox, onClick: function (e) { e.stopPropagation(); } }, React.createElement('div', { style: styles.vehicleModalTitle }, row.parkingName + ' - 车辆明细'), React.createElement('div', { style: styles.tableWrap }, React.createElement('table', { style: styles.table }, React.createElement('thead', {}, React.createElement('tr', {}, React.createElement('th', { style: styles.th }, '运营城市'), React.createElement('th', { style: styles.th }, '车架号'), React.createElement('th', { style: styles.th }, '车牌号'), React.createElement('th', { style: styles.th }, '车辆编号'), React.createElement('th', { style: styles.th }, '品牌'), React.createElement('th', { style: styles.th }, '型号'), React.createElement('th', { style: styles.th }, '车身颜色'), React.createElement('th', { style: styles.th }, '整备状态'), React.createElement('th', { style: styles.th }, '行驶公里数'), React.createElement('th', { style: styles.th }, '当前位置'), React.createElement('th', { style: styles.th }, 'GPS最后上传时间') ) ), React.createElement('tbody', {}, row.vehicles.map(function (v, i) { return React.createElement('tr', { key: i }, React.createElement('td', { style: styles.td }, v.city), React.createElement('td', { style: styles.td }, v.frameNo), React.createElement('td', { style: styles.td }, v.plateNo), React.createElement('td', { style: styles.td }, v.code), React.createElement('td', { style: styles.td }, v.brand), React.createElement('td', { style: styles.td }, v.model), React.createElement('td', { style: styles.td }, v.color), React.createElement('td', { style: styles.td }, v.status), React.createElement('td', { style: styles.td }, v.mileage), React.createElement('td', { style: styles.td }, v.location), React.createElement('td', { style: styles.td }, v.gpsTime) ); }) ) ) ), React.createElement('div', { style: styles.modalFooter }, React.createElement('button', { style: Object.assign({}, styles.btn, styles.btnDefault), onClick: function () { setVehicleDetailParkingId(null); } }, '关闭') ) ) ); })()} {/* 需求说明弹窗 */} {showRequirementModal && (
筛选:
包括地区(级联选择器,省-市)、停车场名称(选择器,支持输入框中模糊搜索)、负责人(选择器,支持输入框中模糊搜索)
停车场列表:
支持新建、导出、列设置
字段显示依次为地区、停车场名称、停放车辆、车位数、地址、租赁开始时间、租赁结束时间、负责人、负责人联系方式、停车场联系人、停车场联系方式
1. 地区字段显示精确至省-市即可
2. 停车场名称字段显示实际停车场名称
3. 停放车辆显示停车场当前停放车辆数,车辆数标注为重点色(如蓝色),点击车辆数以卡片模式展开对应车辆明细,车辆明细显示运营城市、车架号、车牌号、车辆编号、品牌、型号、车身颜色、整备状态、行驶公里数、当前位置、GPS最后上传时间
4. 车位数显示停车场实际车位数
5. 地址显示停车场实际地址
6. 租赁开始时间显示停车场合同实际租赁时间,显示格式为年月日
7. 租赁结束时间显示停车场合同实际租赁时间,显示格式为年月日
8. 负责人显示停车场实际负责人姓名
9. 负责人联系方式显示停车场实际负责人手机号
10. 停车场联系人显示停车场联系人姓名
11. 停车场电话显示停车场联系人手机号
12. 操作列支持查看、编辑、删除
查看与新增页面相同,只是所有信息输入为禁用状态
点击删除进行二次确认,提示"是否确认删除该停车场",同时判断停车场是否有车辆数据,如有车辆数据则提示"该停车场存在车辆,无法删除",如停车场无车辆,则toast提示删除成功
)} {toastMessage && React.createElement('div', { style: styles.toast }, toastMessage)}
); }; if (typeof window !== 'undefined') { window.Component = Component; function mount() { var rootEl = document.getElementById('root'); if (rootEl && window.ReactDOM && window.React) { var root = ReactDOM.createRoot(rootEl); root.render(React.createElement(Component)); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', mount); } else { setTimeout(mount, 0); } }