Initial commit: ONE-OS project

Made-with: Cursor
This commit is contained in:
王冕
2026-02-27 18:11:40 +08:00
commit 09cc45db36
47 changed files with 17589 additions and 0 deletions

View File

@@ -0,0 +1,481 @@
// 【重要】必须使用 const Component 作为组件变量名
// 后装设备 - 运维管理-车辆业务
var ARCO_TOKEN = {
primary: '#165DFF',
primaryHover: '#4080FF',
danger: '#F53F3F',
success: '#00B42A',
neutral1: '#FFFFFF',
neutral2: '#F7F8FA',
neutral3: '#F2F3F5',
neutral4: '#E5E6EB',
neutral5: '#C9CDD4',
neutral6: '#86909C',
neutral7: '#4E5969',
neutral8: '#1D2129',
border: '#E5E6EB',
fill: '#F2F3F5',
fillSecondary: '#F7F8FA',
shadowLight: '0 1px 2px rgba(0,0,0,0.05)',
radiusMedium: '4px',
radiusLarge: '8px',
spacing8: '8px',
spacing12: '12px',
spacing16: '16px',
spacing24: '24px',
fontSize14: '14px',
fontSize16: '16px',
fontFamily: '-apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", Arial, sans-serif',
link: '#165DFF'
};
var DEVICE_TYPES = ['GPS', '尾板', '车身广告', 'G7安全套件', 'G7普通设备', 'G7温控设备', '备胎'];
var MOCK_VEHICLE_OPTIONS = ['粤A12345', '粤A67890', '粤B11111', '粤B22222', '粤C33333', '京A88888'];
var MOCK_LIST = [
{ id: '1', deviceType: 'GPS', plateNo: '粤A12345', supplier: '深圳智联', lastOpType: '安装', createTime: '2025-02-20 10:30', removeTime: '', createOperator: '张明', removeOperator: '' },
{ id: '2', deviceType: '尾板', plateNo: '粤A67890', supplier: '广州机械', lastOpType: '拆除', createTime: '2025-02-01 09:00', removeTime: '2025-02-18 14:20', createOperator: '李强', removeOperator: '王芳' },
{ id: '3', deviceType: '车身广告', plateNo: '粤B11111', supplier: '东莞广告', lastOpType: '安装', createTime: '2025-02-15 09:00', removeTime: '', createOperator: '李强', removeOperator: '' },
{ id: '4', deviceType: 'G7安全套件', plateNo: '粤A12345', supplier: 'G7科技', lastOpType: '安装', createTime: '2025-02-10 16:45', removeTime: '', createOperator: '张明', removeOperator: '' },
{ id: '5', deviceType: '备胎', plateNo: '粤C33333', supplier: '华南轮胎', lastOpType: '拆除', createTime: '2025-01-20 08:00', removeTime: '2025-02-08 11:20', createOperator: '赵六', removeOperator: '赵六' }
];
const Component = function () {
var antd = window.antd;
var Select = antd.Select;
var Button = antd.Button;
var DatePicker = antd.DatePicker;
var Table = antd.Table;
var Modal = antd.Modal;
var Input = antd.Input;
var message = antd.message;
var Option = Select.Option;
var RangePicker = DatePicker.RangePicker;
var Tabs = antd.Tabs;
var _useStateTab = React.useState('installed');
var activeTab = _useStateTab[0];
var setActiveTab = _useStateTab[1];
var _useState = React.useState('');
var filterDeviceType = _useState[0];
var setFilterDeviceType = _useState[1];
var _useState2 = React.useState('');
var filterVehicle = _useState2[0];
var setFilterVehicle = _useState2[1];
var _useState3 = React.useState([]);
var filterDateRange = _useState3[0];
var setFilterDateRange = _useState3[1];
var _useState4 = React.useState({ deviceType: '', vehicle: '', dateStart: '', dateEnd: '' });
var appliedFilter = _useState4[0];
var setAppliedFilter = _useState4[1];
var _useState5 = React.useState(1);
var currentPage = _useState5[0];
var setCurrentPage = _useState5[1];
var _useState6 = React.useState(10);
var pageSize = _useState6[0];
var setPageSize = _useState6[1];
var _useState7 = React.useState(MOCK_LIST);
var dataList = _useState7[0];
var setDataList = _useState7[1];
var _useState8 = React.useState(null);
var viewRecord = _useState8[0];
var setViewRecord = _useState8[1];
var _useState9 = React.useState(null);
var editRecord = _useState9[0];
var setEditRecord = _useState9[1];
var _useState10 = React.useState(null);
var removeConfirmRecord = _useState10[0];
var setRemoveConfirmRecord = _useState10[1];
var _useState11 = React.useState(false);
var addModalVisible = _useState11[0];
var setAddModalVisible = _useState11[1];
var _useState12 = React.useState(false);
var showRequirementModal = _useState12[0];
var setShowRequirementModal = _useState12[1];
var applyBaseFilter = function (list) {
if (appliedFilter.deviceType) {
list = list.filter(function (r) { return r.deviceType === appliedFilter.deviceType; });
}
if (appliedFilter.vehicle) {
list = list.filter(function (r) { return r.plateNo && r.plateNo.indexOf(appliedFilter.vehicle) >= 0; });
}
return list;
};
var installedList = dataList.filter(function (r) { return !r.removeTime || r.removeTime === ''; });
var removedList = dataList.filter(function (r) { return r.removeTime && r.removeTime !== ''; });
var installedFiltered = applyBaseFilter(installedList).filter(function (r) {
if (appliedFilter.dateStart && r.createTime) { if (r.createTime.slice(0, 10) < appliedFilter.dateStart) return false; }
if (appliedFilter.dateEnd && r.createTime) { if (r.createTime.slice(0, 10) > appliedFilter.dateEnd) return false; }
return true;
});
var removedFiltered = applyBaseFilter(removedList).filter(function (r) {
if (appliedFilter.dateStart && r.removeTime) { if (r.removeTime.slice(0, 10) < appliedFilter.dateStart) return false; }
if (appliedFilter.dateEnd && r.removeTime) { if (r.removeTime.slice(0, 10) > appliedFilter.dateEnd) return false; }
return true;
});
var filteredList = activeTab === 'installed' ? installedFiltered : removedFiltered;
var totalItems = filteredList.length;
var totalPages = Math.ceil(totalItems / pageSize) || 1;
var validPage = currentPage > totalPages && totalPages > 0 ? 1 : (currentPage < 1 ? 1 : currentPage);
var startIndex = (validPage - 1) * pageSize;
var paginatedList = filteredList.slice(startIndex, startIndex + pageSize);
var handleQuery = function () {
var dateStart = '';
var dateEnd = '';
if (filterDateRange && filterDateRange.length >= 2 && filterDateRange[0] && filterDateRange[1]) {
if (filterDateRange[0].format) {
dateStart = filterDateRange[0].format('YYYY-MM-DD');
dateEnd = filterDateRange[1].format('YYYY-MM-DD');
} else if (window.dayjs) {
dateStart = window.dayjs(filterDateRange[0]).format('YYYY-MM-DD');
dateEnd = window.dayjs(filterDateRange[1]).format('YYYY-MM-DD');
}
}
setAppliedFilter({
deviceType: filterDeviceType,
vehicle: filterVehicle,
dateStart: dateStart,
dateEnd: dateEnd
});
setCurrentPage(1);
message.success('查询成功');
};
var handleReset = function () {
setFilterDeviceType('');
setFilterVehicle('');
setFilterDateRange([]);
setAppliedFilter({ deviceType: '', vehicle: '', dateStart: '', dateEnd: '' });
setCurrentPage(1);
};
var handleRemoveConfirm = function (row) {
var nowStr = '2025-02-24 15:00';
if (window.dayjs) { nowStr = window.dayjs().format('YYYY-MM-DD HH:mm'); }
setDataList(dataList.map(function (r) {
if (r.id === row.id) {
return { id: r.id, deviceType: r.deviceType, plateNo: r.plateNo, supplier: r.supplier, lastOpType: '拆除', createTime: r.createTime, removeTime: nowStr, createOperator: r.createOperator, removeOperator: '当前用户' };
}
return r;
}));
setRemoveConfirmRecord(null);
message.success('拆除成功');
};
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: '8px' },
breadcrumbCurrent: { color: t.neutral8 },
requirementLink: { color: t.link, textDecoration: 'none', fontSize: t.fontSize14, cursor: 'pointer' },
modalContent: { fontSize: t.fontSize14, color: t.neutral8, lineHeight: 1.6 },
requirementSection: { marginBottom: t.spacing16 },
requirementSectionTitle: { fontSize: t.fontSize16, fontWeight: 600, color: t.neutral8, marginBottom: 8 },
requirementItem: { marginBottom: 8, paddingLeft: 16 },
requirementSubItem: { marginBottom: 4, paddingLeft: 16, color: t.neutral7 },
card: { backgroundColor: t.neutral1, borderRadius: t.radiusLarge, boxShadow: t.shadowLight, marginBottom: t.spacing16, padding: t.spacing16 },
filterRow: { display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: t.spacing12 },
label: { marginRight: t.spacing8, fontSize: t.fontSize14, color: t.neutral8, whiteSpace: 'nowrap' },
filterRight: { marginLeft: 'auto', display: 'flex', gap: t.spacing8 },
toolbar: { display: 'flex', justifyContent: 'flex-end', gap: t.spacing12, marginBottom: t.spacing8 }
};
var deviceTypeOptions = DEVICE_TYPES.map(function (type) {
return React.createElement(Option, { key: type, value: type }, type);
});
var vehicleOptions = MOCK_VEHICLE_OPTIONS.map(function (v) {
return React.createElement(Option, { key: v, value: v }, v);
});
return React.createElement(
'div',
{ style: styles.page },
React.createElement(
'div',
{ style: styles.breadcrumb },
React.createElement('div', { style: styles.breadcrumbLeft },
React.createElement('a', { href: '#', style: styles.breadcrumbLink, onClick: function (e) { e.preventDefault(); } }, '运维管理'),
React.createElement('span', { style: { marginRight: '8px' } }, '/'),
React.createElement('a', { href: '#', style: styles.breadcrumbLink, onClick: function (e) { e.preventDefault(); } }, '车辆业务'),
React.createElement('span', { style: { marginRight: '8px' } }, '/'),
React.createElement('span', { style: styles.breadcrumbCurrent }, '后装设备')
),
React.createElement('a', { href: '#', style: styles.requirementLink, onClick: function (e) { e.preventDefault(); setShowRequirementModal(true); } }, '查看需求说明')
),
React.createElement(
'div',
{ style: styles.card },
React.createElement(
'div',
{ style: styles.filterRow },
React.createElement('span', { style: styles.label }, '设备类型:'),
React.createElement(Select, {
placeholder: '请选择设备类型',
style: { width: 160 },
value: filterDeviceType || undefined,
onChange: function (v) { setFilterDeviceType(v || ''); },
allowClear: true
}, deviceTypeOptions),
React.createElement('span', { style: styles.label }, '使用车辆:'),
React.createElement(Select, {
placeholder: '请选择或输入搜索',
style: { width: 180 },
value: filterVehicle || undefined,
onChange: function (v) { setFilterVehicle(v || ''); },
showSearch: true,
allowClear: true,
filterOption: function (input, opt) {
var c = opt && opt.children;
return c && String(c).toLowerCase().indexOf((input || '').toLowerCase()) >= 0;
}
}, vehicleOptions),
React.createElement('span', { style: styles.label }, '安装时间:'),
React.createElement(RangePicker, {
style: { width: 260 },
format: 'YYYY-MM-DD',
placeholder: ['开始日期', '结束日期'],
value: filterDateRange,
onChange: function (dates) { setFilterDateRange(dates || []); }
}),
React.createElement('div', { style: styles.filterRight },
React.createElement(Button, { type: 'primary', onClick: handleQuery }, '查询'),
React.createElement(Button, { onClick: handleReset }, '重置')
)
)
),
React.createElement(
'div',
{ style: styles.card },
React.createElement(
'div',
{ style: styles.toolbar },
activeTab === 'installed' && React.createElement(Button, { type: 'primary', onClick: function () { message.info('请查看运维管理-车辆业务-后装设备-新增后装设备'); } }, '新增'),
React.createElement(Button, { onClick: function () { message.info('根据筛选条件导出excel'); } }, '导出')
),
React.createElement(Tabs, {
activeKey: activeTab,
onChange: function (key) { setActiveTab(key); setCurrentPage(1); },
items: [
{
key: 'installed',
label: '已安装',
children: React.createElement(Table, {
rowKey: 'id',
size: 'small',
columns: [
{ title: '设备类型', dataIndex: 'deviceType', key: 'deviceType', width: 120 },
{ title: '车牌号', dataIndex: 'plateNo', key: 'plateNo', width: 120 },
{ title: '供应商', dataIndex: 'supplier', key: 'supplier', width: 120 },
{ title: '安装时间', dataIndex: 'createTime', key: 'createTime', width: 160 },
{ title: '安装人', dataIndex: 'createOperator', key: 'createOperator', width: 100 },
{
title: '操作',
key: 'action',
width: 160,
render: function (_, row) {
return React.createElement(React.Fragment, null,
React.createElement(Button, { type: 'link', size: 'small', onClick: function () { message.info('请查看运维管理-车辆业务-后装设备-查看'); } }, '查看'),
React.createElement(Button, { type: 'link', size: 'small', onClick: function () { message.info('请查看运维管理-车辆业务-后装设备-编辑'); } }, '编辑'),
React.createElement(Button, { type: 'link', size: 'small', danger: true, onClick: function () { setRemoveConfirmRecord(row); } }, '拆除')
);
}
}
],
dataSource: paginatedList,
pagination: {
current: validPage,
pageSize: pageSize,
total: totalItems,
showSizeChanger: true,
showQuickJumper: true,
pageSizeOptions: ['10', '20', '50', '100'],
showTotal: function (total) { return '共 ' + total + ' 条'; },
onChange: function (page, size) {
setCurrentPage(page);
if (size !== pageSize) setPageSize(size);
}
}
})
},
{
key: 'removed',
label: '拆除记录',
children: React.createElement(Table, {
rowKey: 'id',
size: 'small',
columns: [
{ title: '设备类型', dataIndex: 'deviceType', key: 'deviceType', width: 120 },
{ title: '车牌号', dataIndex: 'plateNo', key: 'plateNo', width: 120 },
{ title: '供应商', dataIndex: 'supplier', key: 'supplier', width: 120 },
{ title: '拆除时间', dataIndex: 'removeTime', key: 'removeTime', width: 160 },
{ title: '拆除人', dataIndex: 'removeOperator', key: 'removeOperator', width: 100 },
{
title: '操作',
key: 'action',
width: 80,
render: function (_, row) {
return React.createElement(Button, { type: 'link', size: 'small', onClick: function () { message.info('请查看运维管理-车辆业务-后装设备-查看'); } }, '查看');
}
}
],
dataSource: paginatedList,
pagination: {
current: validPage,
pageSize: pageSize,
total: totalItems,
showSizeChanger: true,
showQuickJumper: true,
pageSizeOptions: ['10', '20', '50', '100'],
showTotal: function (total) { return '共 ' + total + ' 条'; },
onChange: function (page, size) {
setCurrentPage(page);
if (size !== pageSize) setPageSize(size);
}
}
})
}
]
})
),
viewRecord && React.createElement(Modal, {
title: '查看后装设备',
open: !!viewRecord,
onCancel: function () { setViewRecord(null); },
footer: React.createElement(Button, { onClick: function () { setViewRecord(null); } }, '关闭'),
width: 520,
children: viewRecord ? React.createElement('div', { style: { lineHeight: '2' } },
React.createElement('div', null, '设备类型:', viewRecord.deviceType),
React.createElement('div', null, '车牌号:', viewRecord.plateNo),
React.createElement('div', null, '供应商:', viewRecord.supplier),
React.createElement('div', null, '安装时间:', viewRecord.createTime || '-'),
React.createElement('div', null, '安装人:', viewRecord.createOperator || '-'),
React.createElement('div', null, '拆除时间:', viewRecord.removeTime || '-'),
React.createElement('div', null, '拆除人:', viewRecord.removeOperator || '-')
) : null
}),
editRecord && React.createElement(Modal, {
title: '编辑后装设备',
open: !!editRecord,
onCancel: function () { setEditRecord(null); },
onOk: function () {
setEditRecord(null);
message.success('保存成功');
},
okText: '保存',
cancelText: '取消',
width: 520,
children: editRecord ? React.createElement('div', { style: { display: 'flex', flexDirection: 'column', gap: 16 } },
React.createElement('div', null, React.createElement('span', { style: styles.label }, '设备类型'), React.createElement(Select, { style: { width: '100%' }, value: editRecord.deviceType, options: DEVICE_TYPES.map(function (d) { return { label: d, value: d }; }) })),
React.createElement('div', null, React.createElement('span', { style: styles.label }, '车牌号'), React.createElement(Input, { style: { width: '100%' }, value: editRecord.plateNo, readOnly: true })),
React.createElement('div', null, React.createElement('span', { style: styles.label }, '供应商'), React.createElement(Input, { style: { width: '100%' }, defaultValue: editRecord.supplier }))
) : null
}),
removeConfirmRecord && React.createElement(Modal, {
title: '确认拆除',
open: !!removeConfirmRecord,
onCancel: function () { setRemoveConfirmRecord(null); },
onOk: function () { handleRemoveConfirm(removeConfirmRecord); },
okText: '确认拆除',
cancelText: '取消',
okButtonProps: { danger: true },
children: removeConfirmRecord ? React.createElement('div', null, '确定要拆除该车辆「', removeConfirmRecord.deviceType, '」后装设备吗?') : null
}),
React.createElement(Modal, {
title: '需求说明',
open: showRequirementModal,
onCancel: function () { setShowRequirementModal(false); },
footer: React.createElement(Button, { onClick: function () { setShowRequirementModal(false); } }, '关闭'),
width: 720,
children: React.createElement('div', { style: styles.modalContent },
React.createElement('div', { style: styles.requirementSection },
React.createElement('div', { style: styles.requirementSectionTitle }, '1. 面包屑:'),
React.createElement('div', { style: styles.requirementItem }, '1.1. 运维管理-车辆业务-后装设备')
),
React.createElement('div', { style: styles.requirementSection },
React.createElement('div', { style: styles.requirementSectionTitle }, '2. 筛选:'),
React.createElement('div', { style: styles.requirementItem }, '2.1. 支持通过设备类型、使用车辆、安装日期进行管理,点击查询后,筛选条件与列表内容联动。点击重置会回到默认筛选条件并在列表展示结果:'),
React.createElement('div', { style: styles.requirementSubItem }, '2.1.1. 设备类型选择器包括GPS、尾板、车身广告、G7安全套件、G7普通设备、G7温控设备、备胎'),
React.createElement('div', { style: styles.requirementSubItem }, '2.1.2. 使用车辆:选择器,支持通过输入框对输入内容模糊搜索,并下拉对应选项;'),
React.createElement('div', { style: styles.requirementSubItem }, '2.1.3. 安装时间:日期选择器,支持单输入框内双日历选择开始-结束时间;')
),
React.createElement('div', { style: styles.requirementSection },
React.createElement('div', { style: styles.requirementSectionTitle }, '3. 列表:'),
React.createElement('div', { style: styles.requirementItem }, '列表分为2个tab已安装/拆除记录;'),
React.createElement('div', { style: styles.requirementItem }, '当已安装列表对应车辆存在车身广告/尾板时,在备车时会自动拉取车身广告/尾板为有的状态;'),
React.createElement('div', { style: styles.requirementItem }, '当已安装列表不存在车身广告/尾板时,在备车时车身广告/尾板为无的状态;'),
React.createElement('div', { style: styles.requirementItem }, '如果在备车/交车时手动取消或勾选车身广告尾板,并完成提交,后装设备列表也会新增一条该车辆的车身广告/尾板安装数据;'),
React.createElement('div', { style: styles.requirementSectionTitle }, '3.1. 已安装:'),
React.createElement('div', { style: styles.requirementSubItem }, '3.1.1. 列表展示所有后装设备信息,字段依次为:设备类型、车牌号、供应商、安装时间、安装人、操作;列表右上角为新增、导出;'),
React.createElement('div', { style: styles.requirementSubItem }, '3.1.1.1. 设备类型显示后装设备类型包括GPS、尾板、车身广告、G7安全套件、G7普通设备、G7温控设备、备胎'),
React.createElement('div', { style: styles.requirementSubItem }, '3.1.1.2. 车牌号:显示后装设备对应车牌号信息;'),
React.createElement('div', { style: styles.requirementSubItem }, '3.1.1.3. 供应商:显示后装设备供应商信息;'),
React.createElement('div', { style: styles.requirementSubItem }, '3.1.1.4. 安装时间显示后装设备安装时间格式为YYYY-MM-DD HH:MM'),
React.createElement('div', { style: styles.requirementSubItem }, '3.1.1.5. 安装人:显示后装设备安装用户名称;'),
React.createElement('div', { style: styles.requirementSubItem }, '3.1.1.6. 操作:支持查看、编辑、拆除;'),
React.createElement('div', { style: styles.requirementSectionTitle }, '3.2. 拆除记录:'),
React.createElement('div', { style: styles.requirementSubItem }, '3.2.1. 列表展示所有后装设备拆除记录,字段依次为:设备类型、车牌号、供应商、拆除时间、拆除人、操作;列表右上角为新增、导出;'),
React.createElement('div', { style: styles.requirementSubItem }, '3.2.1.1. 设备类型显示后装设备类型包括GPS、尾板、车身广告、G7安全套件、G7普通设备、G7温控设备、备胎'),
React.createElement('div', { style: styles.requirementSubItem }, '3.2.1.2. 车牌号:显示后装设备对应车牌号信息;'),
React.createElement('div', { style: styles.requirementSubItem }, '3.2.1.3. 供应商:显示后装设备供应商信息;'),
React.createElement('div', { style: styles.requirementSubItem }, '3.2.1.4. 拆除时间显示后装设备拆除时间格式为YYYY-MM-DD HH:MM'),
React.createElement('div', { style: styles.requirementSubItem }, '3.2.1.5. 拆除人:显示后装设备拆除用户名称;'),
React.createElement('div', { style: styles.requirementSubItem }, '3.2.1.6. 操作:支持查看;')
)
)
}),
addModalVisible && React.createElement(Modal, {
title: '新增后装设备',
open: addModalVisible,
onCancel: function () { setAddModalVisible(false); },
onOk: function () {
setDataList([{ id: String(Date.now()), deviceType: 'GPS', plateNo: '粤A12345', supplier: '新供应商', lastOpType: '安装', createTime: '2025-02-24 12:00', removeTime: '', createOperator: '当前用户', removeOperator: '' }].concat(dataList));
setAddModalVisible(false);
message.success('新增成功');
},
okText: '确定',
cancelText: '取消',
width: 520,
children: React.createElement('div', { style: { display: 'flex', flexDirection: 'column', gap: 16 } },
React.createElement('div', null, React.createElement('span', { style: styles.label }, '设备类型'), React.createElement(Select, { style: { width: '100%' }, placeholder: '请选择', options: DEVICE_TYPES.map(function (d) { return { label: d, value: d }; }) })),
React.createElement('div', null, React.createElement('span', { style: styles.label }, '使用车辆'), React.createElement(Select, { style: { width: '100%' }, placeholder: '请选择或搜索', showSearch: true, options: MOCK_VEHICLE_OPTIONS.map(function (v) { return { label: v, value: v }; }) })),
React.createElement('div', null, React.createElement('span', { style: styles.label }, '供应商'), React.createElement(Input, { style: { width: '100%' }, placeholder: '请输入供应商' }))
)
})
);
};
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);
}
}