// 【重要】必须使用 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 (
| 操作 |
|---|
是否确认删除该停车场?