diff --git a/web端/工作台.jsx b/web端/工作台.jsx index 70b2c29..5b62746 100644 --- a/web端/工作台.jsx +++ b/web端/工作台.jsx @@ -115,7 +115,7 @@ const Component = function () { var todoMoreStatus = todoMoreStatusState[0]; var setTodoMoreStatus = todoMoreStatusState[1]; - var todoBoardFilterState = useState('pending'); + var todoBoardFilterState = useState('all'); var todoBoardFilter = todoBoardFilterState[0]; var setTodoBoardFilter = todoBoardFilterState[1]; @@ -282,34 +282,35 @@ const Component = function () { setOverdueReturnModalOpen(true); }, []); - // 待办任务表(原型:任务类型、任务名称、状态、生成时间、操作) + // 待办任务表(原型:任务类型、任务名称、状态、任务时间、操作) var dashboardTodoRows = useMemo(function () { return [ - { id: '1', taskType: '交车', taskName: '交车任务 · 粤A12345 待确认交车单', genDate: '2026-02-27', path: 'web端/运维管理/车辆业务/交车管理.jsx', status: 'pending' }, - { id: '2', taskType: '调拨', taskName: '调拨任务 · 调拨单 DB-2026-009 待接收', genDate: '2026-02-26', path: 'web端/运维管理/车辆业务/调拨管理.jsx', status: 'overdue' }, - { id: '3', taskType: '异动', taskName: '异动任务 · 异动单待结束登记', genDate: '2026-02-26', path: 'web端/运维管理/车辆业务/异动管理-结束异动.jsx', status: 'pending' }, - { id: '4', taskType: '年审', taskName: '年审任务 · 粤B11111 年审材料待上传', genDate: '2026-02-25', path: 'web端/运维管理/车辆业务/异动管理.jsx', status: 'overdue' }, - { id: '5', taskType: '保险', taskName: '商业险到期 · 粤C22334 续保跟进', genDate: '2026-02-24', path: 'web端/车辆管理.jsx', status: 'pending' }, - { id: '6', taskType: '租赁账单', taskName: '租赁账单生成 · 项目「华南物流」2月账单', genDate: '2026-02-24', path: 'web端/业务管理/租赁账单.jsx', status: 'pending' }, - { id: '7', taskType: '审批中心', taskName: '提车应收款 · TK-2026-018 待提交', genDate: '2026-02-23', path: 'web端/财务管理/提车应收款.jsx', status: 'done' }, - { id: '8', taskType: '审批中心', taskName: '租赁合同审核 · HT-2025-088 法务附件', genDate: '2026-02-22', path: 'web端/车辆租赁合同/车辆租赁合同.jsx', status: 'done' } + { id: '1', taskType: '交车', taskName: '顺通运输租赁苏龙18T(交车数:5)', genDate: '2026-03-26 20:08', path: 'web端/运维管理/车辆业务/交车管理.jsx', status: 'pending' }, + { id: '2', taskType: '异动', taskName: '异动任务-魏山(异动车数:9)', genDate: '2026-03-27 12:26', path: 'web端/运维管理/车辆业务/异动管理-结束异动.jsx', status: 'overdue' }, + { id: '3', taskType: '年审', taskName: '年审任务(沪A62261F)', genDate: '2026-03-27 16:32', path: 'web端/运维管理/车辆业务/异动管理.jsx', status: 'pending' }, + { id: '4', taskType: '租赁账单', taskName: '御盛合-租赁苏龙18T(账单编号xxxxxxx)', genDate: '2026-03-28 00:00', path: 'web端/业务管理/租赁账单.jsx', status: 'pending' }, + { id: '5', taskType: '还车应结款', taskName: '云通-租赁帕力安18T(粤AGP3649)', genDate: '2026-03-28 11:53', path: 'web端/财务管理/提车应收款.jsx', status: 'pending' } ]; }, []); var todoSummary = useMemo(function () { - var p = 0, o = 0, d = 0; + var p = 0, o = 0; dashboardTodoRows.forEach(function (r) { if (r.status === 'pending') p++; else if (r.status === 'overdue') o++; - else if (r.status === 'done') d++; }); - return { pending: p, overdue: o, done: d }; + return { pending: p, overdue: o }; }, [dashboardTodoRows]); var dashboardTodoBoardRows = useMemo(function () { - return dashboardTodoRows.filter(function (r) { + var rows = dashboardTodoRows.filter(function (r) { + if (todoBoardFilter === 'all') return true; return r.status === todoBoardFilter; }); + rows.sort(function (a, b) { + return String(b.genDate || '').localeCompare(String(a.genDate || '')); + }); + return rows; }, [dashboardTodoRows, todoBoardFilter]); var dashboardTodoBoardPreviewRows = useMemo(function () { @@ -319,7 +320,7 @@ const Component = function () { // 全部待办弹窗:任务类型下拉展示业务全量类型(与示意数据并集,联调可改为接口枚举) var todoMoreTaskTypeFilterOptions = useMemo(function () { var catalog = [ - '交车', '调拨', '异动', '年审', '保险', '租赁账单', '审批中心', + '交车', '调拨', '异动', '年审', '保险', '租赁账单', '审批中心', '还车应结款', '还车', '备车', '提车应收', '替换车', '违章', '事故', '充电', 'ETC', '能源账户', '氢费', '电费' ]; var seen = {}; @@ -1039,11 +1040,12 @@ const Component = function () { render: renderTodoStatusCell }, { - title: '生成时间', + title: '任务时间', dataIndex: 'genDate', key: 'genDate', - width: 120, + width: 160, showSorterTooltip: false, + defaultSortOrder: 'descend', sorter: function (a, b) { return String(a.genDate || '').localeCompare(String(b.genDate || '')); } @@ -1084,11 +1086,12 @@ const Component = function () { render: renderTodoStatusCell }, { - title: '生成时间', + title: '任务时间', dataIndex: 'genDate', key: 'genDate', - width: 120, + width: 160, showSorterTooltip: false, + defaultSortOrder: 'descend', sorter: function (a, b) { return String(a.genDate || '').localeCompare(String(b.genDate || '')); } @@ -1119,13 +1122,17 @@ const Component = function () { }, [pushUrgeNotice]); var todoMoreFilteredRows = useMemo(function () { - return dashboardTodoRows.filter(function (r) { + var rows = dashboardTodoRows.filter(function (r) { if (todoMoreTaskType && r.taskType !== todoMoreTaskType) return false; if (todoMoreStatus && r.status !== todoMoreStatus) return false; if (todoMoreDateStart && r.genDate < todoMoreDateStart) return false; if (todoMoreDateEnd && r.genDate > todoMoreDateEnd) return false; return true; }); + rows.sort(function (a, b) { + return String(b.genDate || '').localeCompare(String(a.genDate || '')); + }); + return rows; }, [dashboardTodoRows, todoMoreTaskType, todoMoreStatus, todoMoreDateStart, todoMoreDateEnd]); var openTodoMoreModal = useCallback(function () { @@ -1474,6 +1481,9 @@ const Component = function () { '.workbench-todo-table .ant-table-column-sorter{color:#98a1b0!important}' + '.workbench-todo-table .ant-table-column-sorter-up.active,.workbench-todo-table .ant-table-column-sorter-down.active{color:#707d8f!important}' + '.workbench-todo-table.ant-table-small .ant-table-thead>tr>th{padding:10px 12px!important}' + + '.workbench-todo-table .ant-table-thead>tr>th.ant-table-column-sort{background:#f7f8fa!important}' + + '.workbench-todo-table .ant-table-tbody>tr>td.ant-table-column-sort{background:#fff!important}' + + '.workbench-todo-table .ant-table-tbody>tr.ant-table-row:hover>td.ant-table-column-sort{background:#fafafa!important}' + '.workbench-one-screen .workbench-quick-card.ant-card{display:flex;flex-direction:column;min-height:0;height:100%}' + '.workbench-one-screen .workbench-quick-card .ant-card-body{padding:0;flex:1;min-height:0;display:flex;flex-direction:column}' + '.workbench-quick-scroll{flex:1;min-height:0;overflow:auto;-webkit-overflow-scrolling:touch}' + @@ -1585,9 +1595,9 @@ const Component = function () { title: React.createElement(Space, { size: 8, wrap: true, align: 'center' }, React.createElement('span', { className: 'workbench-dash-pair-head-title' }, '待办任务'), React.createElement(Badge, { count: todoSummary.pending + todoSummary.overdue, style: { backgroundColor: accentBlue } }), + renderTodoStatChip('all', '全部', dashboardTodoRows.length, 'rgba(0,0,0,0.04)', '#595959'), renderTodoStatChip('pending', '待处理', todoSummary.pending, 'rgba(22,119,255,0.06)', accentBlue), - renderTodoStatChip('overdue', '已超时', todoSummary.overdue, 'rgba(245,34,45,0.06)', '#f5222d'), - renderTodoStatChip('done', '已完成', todoSummary.done, 'rgba(82,196,26,0.08)', '#52c41a') + renderTodoStatChip('overdue', '已超时', todoSummary.overdue, 'rgba(245,34,45,0.06)', '#f5222d') ), bordered: false, style: Object.assign({}, cardStyle, { flex: 1, width: '100%', minHeight: 0, display: 'flex', flexDirection: 'column' }), @@ -1731,7 +1741,7 @@ const Component = function () { value: todoMoreStatus, onChange: setTodoMoreStatus }), - React.createElement(Text, { type: 'secondary', style: { fontSize: 12 } }, '生成时间'), + React.createElement(Text, { type: 'secondary', style: { fontSize: 12 } }, '任务时间'), React.createElement(DatePicker.RangePicker, { style: { width: 140 }, format: 'YYYY-MM-DD', diff --git a/web端/数据分析/业务部汇总台账.jsx b/web端/数据分析/业务部汇总台账.jsx new file mode 100644 index 0000000..c916513 --- /dev/null +++ b/web端/数据分析/业务部汇总台账.jsx @@ -0,0 +1,553 @@ +// 【重要】必须使用 const Component 作为组件变量名 +// 数据分析 - 浙江羚牛氢能业务部汇总台账(月度 × 业务 × 业绩/成本/利润) +// 原型:年份 + 业务部筛选、导出;点击「业绩」金额钻取业务员 → 再钻取项目明细(联调可替换为接口) + +const Component = function () { + var useState = React.useState; + var useMemo = React.useMemo; + var useCallback = React.useCallback; + + var antd = window.antd; + var App = antd.App; + var Breadcrumb = antd.Breadcrumb; + var Card = antd.Card; + var Button = antd.Button; + var Table = antd.Table; + var Select = antd.Select; + var DatePicker = antd.DatePicker; + var Row = antd.Row; + var Col = antd.Col; + var Space = antd.Space; + var Modal = antd.Modal; + var message = antd.message; + + /** 业务板块(与示意图一致):自营 / 租赁 / 销售 / 审车 / 代办 / ETC / 其他 */ + var CATEGORY_DEFS = [ + { key: 'self', label: '自营业务' }, + { key: 'lease', label: '租赁业务' }, + { key: 'sales', label: '销售' }, + { key: 'inspection', label: '审车' }, + { key: 'agency', label: '代办' }, + { key: 'etc', label: 'ETC' }, + { key: 'other', label: '其他' } + ]; + + var CATEGORY_KEYS = CATEGORY_DEFS.map(function (c) { return c.key; }); + + function filterOption(input, option) { + var label = (option && (option.label || option.children)) || ''; + return String(label).toLowerCase().indexOf(String(input || '').toLowerCase()) >= 0; + } + + function fmtMoney(n) { + if (n === null || n === undefined || n === '') return '-'; + var x = Number(n); + if (isNaN(x)) return '-'; + if (x === 0) return '-'; + return x.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); + } + + function escapeCsv(v) { + var s = v == null ? '' : String(v); + if (s.indexOf(',') !== -1 || s.indexOf('"') !== -1 || s.indexOf('\n') !== -1 || s.indexOf('\r') !== -1) { + return '"' + s.replace(/"/g, '""') + '"'; + } + return s; + } + + function downloadCsv(filename, lines) { + var csv = lines.map(function (row) { return row.map(escapeCsv).join(','); }).join('\n'); + var blob = new Blob(['\ufeff' + csv], { type: 'text/csv;charset=utf-8' }); + var url = URL.createObjectURL(blob); + var a = document.createElement('a'); + a.href = url; + a.download = filename; + a.click(); + URL.revokeObjectURL(url); + } + + function initialYear() { + try { + if (window.dayjs) return window.dayjs('2026-01-01'); + } catch (e1) {} + return null; + } + + function numOrZero(v) { + if (v === null || v === undefined || v === '') return 0; + var n = Number(v); + return isNaN(n) ? 0 : n; + } + + /** 汇总行:对 1–12 月逐字段求和 */ + function sumLedgerRows(monthRows) { + var acc = { month: 13, monthLabel: '合计', rowType: 'total', key: 'total' }; + CATEGORY_KEYS.forEach(function (k) { + acc[k + 'Perf'] = 0; + acc[k + 'Cost'] = 0; + acc[k + 'Profit'] = 0; + }); + (monthRows || []).forEach(function (r) { + CATEGORY_KEYS.forEach(function (k) { + acc[k + 'Perf'] += numOrZero(r[k + 'Perf']); + acc[k + 'Cost'] += numOrZero(r[k + 'Cost']); + acc[k + 'Profit'] += numOrZero(r[k + 'Profit']); + }); + }); + CATEGORY_KEYS.forEach(function (k) { + if (acc[k + 'Perf'] === 0) acc[k + 'Perf'] = null; + if (acc[k + 'Cost'] === 0) acc[k + 'Cost'] = null; + if (acc[k + 'Profit'] === 0) acc[k + 'Profit'] = null; + }); + return acc; + } + + /** + * 原型数据:2026 年按月;1 月部分数值与示意图/样例一致(审车业绩、代办业绩、ETC业绩) + * 其余月份为演示占位,可联调替换 + */ + function buildMockYear2026() { + var rows = []; + var template = [ + { + month: 1, + selfPerf: 285000.5, selfCost: 240000, selfProfit: 45000.5, + leasePerf: 188000, leaseCost: 120000, leaseProfit: 68000, + salesPerf: 420000, salesCost: 310000, salesProfit: 110000, + inspectionPerf: 131241.59, inspectionCost: 88000, inspectionProfit: 43241.59, + agencyPerf: 4004.73, agencyCost: 1200, agencyProfit: 2804.73, + etcPerf: 79750.92, etcCost: 45000, etcProfit: 34750.92, + otherPerf: 12000, otherCost: 5000, otherProfit: 7000 + }, + { + month: 2, + selfPerf: 260000, selfCost: 230000, selfProfit: 30000, + leasePerf: 195000, leaseCost: 125000, leaseProfit: 70000, + salesPerf: null, salesCost: null, salesProfit: null, + inspectionPerf: 98000, inspectionCost: 60000, inspectionProfit: 38000, + agencyPerf: 3200, agencyCost: 1000, agencyProfit: 2200, + etcPerf: 72000, etcCost: 40000, etcProfit: 32000, + otherPerf: null, otherCost: null, otherProfit: null + }, + { + month: 3, + selfPerf: 270000, selfCost: 235000, selfProfit: 35000, + leasePerf: 200000, leaseCost: 128000, leaseProfit: 72000, + salesPerf: 380000, salesCost: 290000, salesProfit: 90000, + inspectionPerf: 105000, inspectionCost: 70000, inspectionProfit: 35000, + agencyPerf: 4100, agencyCost: 1100, agencyProfit: 3000, + etcPerf: 81000, etcCost: 43000, etcProfit: 38000, + otherPerf: 8500, otherCost: 3000, otherProfit: 5500 + } + ]; + var i; + for (i = 1; i <= 12; i++) { + var src = template[i - 1]; + if (!src) { + src = { + month: i, + selfPerf: null, selfCost: null, selfProfit: null, + leasePerf: null, leaseCost: null, leaseProfit: null, + salesPerf: null, salesCost: null, salesProfit: null, + inspectionPerf: null, inspectionCost: null, inspectionProfit: null, + agencyPerf: null, agencyCost: null, agencyProfit: null, + etcPerf: null, etcCost: null, etcProfit: null, + otherPerf: null, otherCost: null, otherProfit: null + }; + } + rows.push({ + key: 'm' + i, + month: i, + monthLabel: i + '月', + rowType: 'month', + selfPerf: src.selfPerf, selfCost: src.selfCost, selfProfit: src.selfProfit, + leasePerf: src.leasePerf, leaseCost: src.leaseCost, leaseProfit: src.leaseProfit, + salesPerf: src.salesPerf, salesCost: src.salesCost, salesProfit: src.salesProfit, + inspectionPerf: src.inspectionPerf, inspectionCost: src.inspectionCost, inspectionProfit: src.inspectionProfit, + agencyPerf: src.agencyPerf, agencyCost: src.agencyCost, agencyProfit: src.agencyProfit, + etcPerf: src.etcPerf, etcCost: src.etcCost, etcProfit: src.etcProfit, + otherPerf: src.otherPerf, otherCost: src.otherCost, otherProfit: src.otherProfit + }); + } + rows.push(sumLedgerRows(rows)); + return rows; + } + + /** 业务员钻取:按 月 + 业务 返回演示列表(金额拆分为比例,末行补齐差额) */ + function mockSalesmenDrill(month, catKey, cellPerf) { + var base = [ + { key: 's1', name: '尚建华', ratio: 0.42 }, + { key: 's2', name: '刘念念', ratio: 0.35 }, + { key: 's3', name: '谯云', ratio: 0.15 }, + { key: 's4', name: '董剑煜', ratio: 0.08 } + ]; + var total = numOrZero(cellPerf); + if (total <= 0) total = 100000; + var assigned = 0; + var parts = base.map(function (b, idx) { + if (idx === base.length - 1) { + var last = Math.round((total - assigned) * 100) / 100; + return { key: b.key, salesperson: b.name, amount: last }; + } + var amt = Math.round(total * b.ratio * 100) / 100; + assigned += amt; + return { key: b.key, salesperson: b.name, amount: amt }; + }); + return parts; + } + + /** 项目明细钻取 */ + function mockProjectRows(salesperson, catKey) { + var catLabel = (CATEGORY_DEFS.find(function (c) { return c.key === catKey; }) || {}).label || catKey; + return [ + { key: 'p1', projectCode: 'PRJ-2026-001', projectName: catLabel + ' · 嘉兴冷链城配项目', plateNo: '沪A62261F', amount: null, bizDate: '2026-01-08', remark: '演示' }, + { key: 'p2', projectCode: 'PRJ-2026-018', projectName: catLabel + ' · 沪浙干线运输', plateNo: '粤AGP3649', amount: null, bizDate: '2026-01-15', remark: '-' }, + { key: 'p3', projectCode: 'PRJ-2026-033', projectName: catLabel + ' · 园区短驳', plateNo: '苏E·D32891', amount: null, bizDate: '2026-01-22', remark: '-' } + ].map(function (r, i, arr) { + var share = i === arr.length - 1 ? 1 - arr.slice(0, -1).reduce(function (a) { return a + 0.31; }, 0) : 0.31; + return Object.assign({}, r, { amount: Math.round(88000 * share * 100) / 100 }); + }); + } + + var layoutStyle = { padding: '16px 24px', background: '#f5f5f5', minHeight: '100vh' }; + var filterLabelStyle = { marginBottom: 6, fontSize: 14, color: 'rgba(0,0,0,0.65)' }; + var filterItemStyle = { marginBottom: 12 }; + var filterControlStyle = { width: '100%' }; + var filterActionsColStyle = { flex: '0 0 auto', marginLeft: 'auto' }; + + var ledgerTableStyle = + '.biz-ledger-summary-table .ant-table-thead>tr>th{color:rgba(0,0,0,0.75)!important;font-weight:500!important;font-size:12px!important;background:#e6f4ff!important;border-color:rgba(0,0,0,0.06)!important}' + + '.biz-ledger-summary-table .ant-table-thead>tr>th.ant-table-cell{background:#e6f4ff!important}' + + '.biz-ledger-summary-table .ant-table-tbody>tr>td,.biz-ledger-summary-table .ant-table-tbody>tr.ant-table-row{white-space:nowrap}' + + '.biz-ledger-summary-table .ant-table-tbody>tr[data-row-key=\"total\"]>td{font-weight:600;background:#fafafa!important}' + + '.biz-ledger-perf-link{cursor:pointer;color:#1677ff;padding:0;border:none;background:none;font:inherit}' + + '.biz-ledger-perf-link:hover{text-decoration:underline;color:#4096ff}'; + + var deptOptions = useMemo(function () { + return [ + { value: '业务二部', label: '业务二部' }, + { value: '华东业务部', label: '华东业务部' }, + { value: '华南业务部', label: '华南业务部' }, + { value: '华北业务部', label: '华北业务部' }, + { value: '西南业务部', label: '西南业务部' } + ]; + }, []); + + var yearDraftState = useState(initialYear); + var yearDraft = yearDraftState[0]; + var setYearDraft = yearDraftState[1]; + + var yearAppliedState = useState(initialYear); + var yearApplied = yearAppliedState[0]; + var setYearApplied = yearAppliedState[1]; + + var deptDraftState = useState('业务二部'); + var deptDraft = deptDraftState[0]; + var setDeptDraft = deptDraftState[1]; + + var deptAppliedState = useState('业务二部'); + var deptApplied = deptAppliedState[0]; + var setDeptApplied = deptAppliedState[1]; + + var dataSource = useMemo(function () { + var y = yearApplied && yearApplied.format ? yearApplied.format('YYYY') : ''; + if (y === '2026') return buildMockYear2026(); + return []; + }, [yearApplied]); + + var tableTitle = useMemo(function () { + var y = yearApplied && yearApplied.format ? yearApplied.format('YYYY') : '—'; + return y + '年度浙江羚牛氢能业务部汇总台账'; + }, [yearApplied]); + + var handleQuery = useCallback(function () { + setYearApplied(yearDraft); + setDeptApplied(deptDraft); + }, [yearDraft, deptDraft]); + + var handleReset = useCallback(function () { + var y0 = initialYear(); + setYearDraft(y0); + setYearApplied(y0); + setDeptDraft('业务二部'); + setDeptApplied('业务二部'); + }, []); + + var salesModalState = useState({ open: false, month: null, monthLabel: '', catKey: '', catLabel: '', perf: null }); + var salesModal = salesModalState[0]; + var setSalesModal = salesModalState[1]; + + var projectModalState = useState({ open: false, salesperson: '', catKey: '', amount: null }); + var projectModal = projectModalState[0]; + var setProjectModal = projectModalState[1]; + + var salesModalRows = useMemo(function () { + if (!salesModal.open || salesModal.month == null || !salesModal.catKey) return []; + return mockSalesmenDrill(salesModal.month, salesModal.catKey, salesModal.perf); + }, [salesModal.open, salesModal.month, salesModal.catKey, salesModal.perf]); + + var projectModalRows = useMemo(function () { + if (!projectModal.open || !projectModal.salesperson) return []; + return mockProjectRows(projectModal.salesperson, projectModal.catKey || 'self'); + }, [projectModal.open, projectModal.salesperson, projectModal.catKey]); + + var openPerfDrill = useCallback(function (row, catKey) { + if (row.rowType === 'total') { + message.info('合计行演示不支持钻取,请从各月份「业绩」进入'); + return; + } + var v = row[catKey + 'Perf']; + if (v === null || v === undefined || v === '' || numOrZero(v) === 0) { + message.warning('该单元格无业绩数据'); + return; + } + var catLabel = (CATEGORY_DEFS.find(function (c) { return c.key === catKey; }) || {}).label || catKey; + setSalesModal({ + open: true, + month: row.month, + monthLabel: row.monthLabel, + catKey: catKey, + catLabel: catLabel, + perf: v + }); + }, []); + + var closeSalesModal = useCallback(function () { + setSalesModal(function (s) { return Object.assign({}, s, { open: false }); }); + }, []); + + var openProjectDrill = useCallback(function (r) { + setProjectModal({ + open: true, + salesperson: r.salesperson, + catKey: salesModal.catKey, + amount: r.amount + }); + }, [salesModal.catKey]); + + var closeProjectModal = useCallback(function () { + setProjectModal({ open: false, salesperson: '', catKey: '', amount: null }); + }, []); + + var salesModalColumns = useMemo(function () { + return [ + { title: '业务员', dataIndex: 'salesperson', key: 'salesperson', width: 120 }, + { + title: '业绩金额', + dataIndex: 'amount', + key: 'amount', + align: 'right', + render: function (v, r) { + return React.createElement('button', { + type: 'button', + className: 'biz-ledger-perf-link', + onClick: function () { openProjectDrill(r); } + }, fmtMoney(v)); + } + }, + { title: '说明', key: 'hint', width: 200, render: function () { return React.createElement('span', { style: { color: 'rgba(0,0,0,0.45)', fontSize: 12 } }, '点击金额查看项目明细'); } } + ]; + }, [openProjectDrill]); + + var projectModalColumns = useMemo(function () { + return [ + { title: '项目编号', dataIndex: 'projectCode', key: 'projectCode', width: 130 }, + { title: '项目名称', dataIndex: 'projectName', key: 'projectName', ellipsis: true }, + { title: '车牌号', dataIndex: 'plateNo', key: 'plateNo', width: 110 }, + { title: '业绩金额', dataIndex: 'amount', key: 'amount', align: 'right', render: function (v) { return fmtMoney(v); } }, + { title: '业务日期', dataIndex: 'bizDate', key: 'bizDate', width: 110 }, + { title: '备注', dataIndex: 'remark', key: 'remark', width: 80 } + ]; + }, []); + + var handleExport = useCallback(function () { + if (!dataSource || dataSource.length === 0) { + message.warning('当前无数据可导出,请先查询'); + return; + } + var y = yearApplied && yearApplied.format ? yearApplied.format('YYYY') : 'ledger'; + var headers = ['月份']; + CATEGORY_DEFS.forEach(function (c) { + headers.push(c.label + '-业绩', c.label + '-成本', c.label + '-利润'); + }); + var body = [headers]; + dataSource.forEach(function (r) { + var line = [r.monthLabel]; + CATEGORY_KEYS.forEach(function (k) { + line.push(fmtMoney(r[k + 'Perf']), fmtMoney(r[k + 'Cost']), fmtMoney(r[k + 'Profit'])); + }); + body.push(line); + }); + body.push(['业务部', deptApplied]); + downloadCsv('业务部汇总台账_' + y + '_' + new Date().getTime() + '.csv', body); + message.success('已导出'); + }, [dataSource, yearApplied, deptApplied]); + + var ledgerColumns = useMemo(function () { + var cols = [ + { + title: '月份', + dataIndex: 'monthLabel', + key: 'monthLabel', + fixed: 'left', + width: 72, + align: 'center', + render: function (t, r) { + if (r.rowType === 'total') return React.createElement('span', { style: { fontWeight: 600 } }, t); + return t; + } + } + ]; + CATEGORY_DEFS.forEach(function (cat) { + var ck = cat.key; + cols.push({ + title: cat.label, + key: 'grp-' + ck, + children: [ + { + title: '业绩', + dataIndex: ck + 'Perf', + key: ck + 'Perf', + width: 108, + align: 'right', + render: function (v, row) { + if (row.rowType === 'total' || v === null || v === undefined || v === '' || numOrZero(v) === 0) { + return fmtMoney(v); + } + return React.createElement('button', { + type: 'button', + className: 'biz-ledger-perf-link', + onClick: function () { openPerfDrill(row, ck); } + }, fmtMoney(v)); + } + }, + { + title: '成本', + dataIndex: ck + 'Cost', + key: ck + 'Cost', + width: 108, + align: 'right', + render: function (v) { return fmtMoney(v); } + }, + { + title: '利润', + dataIndex: ck + 'Profit', + key: ck + 'Profit', + width: 108, + align: 'right', + render: function (v) { return fmtMoney(v); } + } + ] + }); + }); + return cols; + }, [openPerfDrill]); + + return React.createElement(App, null, + React.createElement('style', null, ledgerTableStyle), + React.createElement('div', { style: layoutStyle }, + React.createElement(Breadcrumb, { style: { marginBottom: 12 }, items: [ + { title: '数据分析' }, + { title: '业务部汇总台账' } + ] }), + React.createElement(Card, { style: { marginBottom: 16 } }, + React.createElement(Row, { gutter: [16, 16], align: 'bottom' }, + React.createElement(Col, { xs: 24, sm: 12, md: 8, lg: 6 }, + React.createElement('div', { style: filterItemStyle }, + React.createElement('div', { style: filterLabelStyle }, '年份选择'), + React.createElement(DatePicker, { + picker: 'year', + style: filterControlStyle, + placeholder: '请选择年份', + format: 'YYYY', + value: yearDraft, + onChange: function (v) { setYearDraft(v); } + }) + ) + ), + React.createElement(Col, { xs: 24, sm: 12, md: 8, lg: 6 }, + React.createElement('div', { style: filterItemStyle }, + React.createElement('div', { style: filterLabelStyle }, '业务部'), + React.createElement(Select, { + placeholder: '请选择业务部', + style: filterControlStyle, + value: deptDraft, + onChange: function (v) { setDeptDraft(v); }, + options: deptOptions, + showSearch: true, + allowClear: false, + filterOption: filterOption + }) + ) + ), + React.createElement(Col, { xs: 24, sm: 12, md: 8, lg: 6, style: filterActionsColStyle }, + React.createElement('div', { style: filterItemStyle }, + React.createElement('div', { style: filterLabelStyle }, '\u00a0'), + React.createElement(Space, { wrap: true }, + React.createElement(Button, { onClick: handleReset }, '重置'), + React.createElement(Button, { type: 'primary', onClick: handleQuery }, '查询'), + React.createElement(Button, { onClick: handleExport }, '导出') + ) + ) + ) + ) + ), + React.createElement(Card, null, + React.createElement('div', { style: { textAlign: 'center', marginBottom: 16, fontSize: 16, fontWeight: 600, color: 'rgba(0,0,0,0.88)' } }, tableTitle), + React.createElement('div', { style: { textAlign: 'center', marginBottom: 8, fontSize: 12, color: 'rgba(0,0,0,0.45)' } }, + '业务部:', deptApplied, ' (原型:仅 2026 年有演示数据;筛选业务部不影响数值,联调后按接口过滤)' + ), + React.createElement(Table, { + className: 'biz-ledger-summary-table', + size: 'small', + bordered: true, + rowKey: 'key', + columns: ledgerColumns, + dataSource: dataSource, + pagination: false, + scroll: { x: 2600, y: 520 }, + sticky: true + }) + ), + React.createElement(Modal, { + title: '业务员业绩 — ' + (salesModal.monthLabel || '') + ' / ' + (salesModal.catLabel || ''), + open: salesModal.open, + width: 720, + onCancel: closeSalesModal, + footer: React.createElement(Button, { onClick: closeSalesModal }, '关闭'), + destroyOnClose: true + }, + React.createElement('p', { style: { marginBottom: 12, color: 'rgba(0,0,0,0.55)', fontSize: 12 } }, + '从总表钻取:本业务线下各业务员业绩构成。点击「业绩金额」继续查看项目明细。' + ), + React.createElement(Table, { + size: 'small', + rowKey: 'key', + columns: salesModalColumns, + dataSource: salesModalRows, + pagination: false + }) + ), + React.createElement(Modal, { + title: '项目明细 — ' + (projectModal.salesperson || '') + ' · ' + ((CATEGORY_DEFS.find(function (c) { return c.key === projectModal.catKey; }) || {}).label || ''), + open: projectModal.open, + width: 900, + onCancel: closeProjectModal, + footer: React.createElement(Button, { onClick: closeProjectModal }, '关闭'), + destroyOnClose: true + }, + React.createElement('p', { style: { marginBottom: 12, color: 'rgba(0,0,0,0.55)', fontSize: 12 } }, + '二级钻取:该项目业务员名下具体项目/车辆维度业绩(演示数据)。' + ), + React.createElement(Table, { + size: 'small', + rowKey: 'key', + columns: projectModalColumns, + dataSource: projectModalRows, + pagination: false, + scroll: { x: 800 } + }) + ) + ) + ); +}; diff --git a/web端/财务管理/提车应收款-查看.jsx b/web端/财务管理/提车应收款-查看.jsx index e47468f..51f5c51 100644 --- a/web端/财务管理/提车应收款-查看.jsx +++ b/web端/财务管理/提车应收款-查看.jsx @@ -43,6 +43,12 @@ const Component = function () { ]; }, []); + // 与提车收款单一致:存在氢费预付款时参与总额;应收/实收金额取值与编辑页 hydrogen 字段一致 + var hasHydrogenPrepay = true; + var hydrogen = useMemo(function () { + return { receivable: '3580.00', actual: '3500.00', discount: '80.00', discountRemark: '预付款批量减免' }; + }, []); + var totals = useMemo(function () { var receivableRent = 0, actualRent = 0, receivableDeposit = 0, receivableService = 0, actualService = 0, discountTotal = 0; vehicles.forEach(function (v) { @@ -63,41 +69,63 @@ const Component = function () { }; }, [vehicles]); - var receivableTotal = (parseFloat(totals.receivableRent) + parseFloat(totals.receivableDeposit) + parseFloat(totals.receivableService)).toFixed(2); - var actualTotal = (parseFloat(totals.actualRent) + parseFloat(totals.receivableDeposit) + parseFloat(totals.actualService) - parseFloat(totals.discountTotal)).toFixed(2); + var hydrogenReceivable = hasHydrogenPrepay ? (parseFloat(hydrogen.receivable) || 0) : 0; + var hydrogenActual = hasHydrogenPrepay ? (parseFloat(hydrogen.actual) || 0) : 0; - var receivablePopoverContent = React.createElement('div', { style: { padding: 8, minWidth: 220 } }, - React.createElement('table', { style: { width: '100%', borderCollapse: 'collapse', fontSize: 13 } }, - React.createElement('thead', null, - React.createElement('tr', null, - React.createElement('th', { style: { textAlign: 'left', padding: '6px 8px', borderBottom: '1px solid #f0f0f0' } }, '项目'), - React.createElement('th', { style: { textAlign: 'right', padding: '6px 8px', borderBottom: '1px solid #f0f0f0' } }, '金额') - ) - ), - React.createElement('tbody', null, - React.createElement('tr', null, React.createElement('td', { style: { padding: '6px 8px' } }, '总计应收车辆月租金'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.receivableRent + ' 元')), - React.createElement('tr', null, React.createElement('td', { style: { padding: '6px 8px' } }, '总计应收车辆保证金'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.receivableDeposit + ' 元')), - React.createElement('tr', null, React.createElement('td', { style: { padding: '6px 8px' } }, '总计应收服务费'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.receivableService + ' 元')) - ) - ) - ); + var receivableTotal = useMemo(function () { + var base = parseFloat(totals.receivableRent) + parseFloat(totals.receivableDeposit) + parseFloat(totals.receivableService); + return (base + hydrogenReceivable).toFixed(2); + }, [totals, hydrogenReceivable]); - var actualPopoverContent = React.createElement('div', { style: { padding: 8, minWidth: 220 } }, - React.createElement('table', { style: { width: '100%', borderCollapse: 'collapse', fontSize: 13 } }, - React.createElement('thead', null, - React.createElement('tr', null, - React.createElement('th', { style: { textAlign: 'left', padding: '6px 8px', borderBottom: '1px solid #f0f0f0' } }, '项目'), - React.createElement('th', { style: { textAlign: 'right', padding: '6px 8px', borderBottom: '1px solid #f0f0f0' } }, '金额') - ) - ), - React.createElement('tbody', null, - React.createElement('tr', null, React.createElement('td', { style: { padding: '6px 8px' } }, '总计实收车辆月租金'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.actualRent + ' 元')), - React.createElement('tr', null, React.createElement('td', { style: { padding: '6px 8px' } }, '总计应收车辆保证金'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.receivableDeposit + ' 元')), - React.createElement('tr', null, React.createElement('td', { style: { padding: '6px 8px' } }, '总计实收服务费'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.actualService + ' 元')), - React.createElement('tr', null, React.createElement('td', { style: { padding: '6px 8px' } }, '总计减免金额'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.discountTotal + ' 元')) + var actualTotal = useMemo(function () { + var base = parseFloat(totals.actualRent) + parseFloat(totals.receivableDeposit) + parseFloat(totals.actualService) - parseFloat(totals.discountTotal); + return (base + hydrogenActual).toFixed(2); + }, [totals, hydrogenActual]); + + var receivablePopoverContent = useMemo(function () { + var rows = [ + React.createElement('tr', { key: 'rent' }, React.createElement('td', { style: { padding: '6px 8px' } }, '总计应收车辆月租金'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.receivableRent + ' 元')), + React.createElement('tr', { key: 'deposit' }, React.createElement('td', { style: { padding: '6px 8px' } }, '总计应收车辆保证金'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.receivableDeposit + ' 元')), + React.createElement('tr', { key: 'service' }, React.createElement('td', { style: { padding: '6px 8px' } }, '总计应收服务费'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.receivableService + ' 元')) + ]; + if (hasHydrogenPrepay) { + rows.push(React.createElement('tr', { key: 'hydrogen' }, React.createElement('td', { style: { padding: '6px 8px' } }, '氢费预充值应收金额'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, (hydrogen.receivable || '0.00') + ' 元'))); + } + return React.createElement('div', { style: { padding: 8, minWidth: 220 } }, + React.createElement('table', { style: { width: '100%', borderCollapse: 'collapse', fontSize: 13 } }, + React.createElement('thead', null, + React.createElement('tr', null, + React.createElement('th', { style: { textAlign: 'left', padding: '6px 8px', borderBottom: '1px solid #f0f0f0' } }, '项目'), + React.createElement('th', { style: { textAlign: 'right', padding: '6px 8px', borderBottom: '1px solid #f0f0f0' } }, '金额') + ) + ), + React.createElement('tbody', null, rows) ) - ) - ); + ); + }, [totals, hasHydrogenPrepay, hydrogen.receivable]); + + var actualPopoverContent = useMemo(function () { + var rows = [ + React.createElement('tr', { key: 'rent' }, React.createElement('td', { style: { padding: '6px 8px' } }, '总计实收车辆月租金'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.actualRent + ' 元')), + React.createElement('tr', { key: 'deposit' }, React.createElement('td', { style: { padding: '6px 8px' } }, '总计应收车辆保证金'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.receivableDeposit + ' 元')), + React.createElement('tr', { key: 'service' }, React.createElement('td', { style: { padding: '6px 8px' } }, '总计实收服务费'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.actualService + ' 元')), + React.createElement('tr', { key: 'discount' }, React.createElement('td', { style: { padding: '6px 8px' } }, '总计减免金额'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, totals.discountTotal + ' 元')) + ]; + if (hasHydrogenPrepay) { + rows.push(React.createElement('tr', { key: 'hydrogen' }, React.createElement('td', { style: { padding: '6px 8px' } }, '氢费预充值实收金额'), React.createElement('td', { style: { textAlign: 'right', padding: '6px 8px' } }, (hydrogen.actual || '0.00') + ' 元'))); + } + return React.createElement('div', { style: { padding: 8, minWidth: 220 } }, + React.createElement('table', { style: { width: '100%', borderCollapse: 'collapse', fontSize: 13 } }, + React.createElement('thead', null, + React.createElement('tr', null, + React.createElement('th', { style: { textAlign: 'left', padding: '6px 8px', borderBottom: '1px solid #f0f0f0' } }, '项目'), + React.createElement('th', { style: { textAlign: 'right', padding: '6px 8px', borderBottom: '1px solid #f0f0f0' } }, '金额') + ) + ), + React.createElement('tbody', null, rows) + ) + ); + }, [totals, hasHydrogenPrepay, hydrogen.actual]); // 审批情况:竖向步骤条 var approvalSteps = useMemo(function () { @@ -231,10 +259,10 @@ const Component = function () { ) ), React.createElement('div', { style: { marginTop: 16, display: 'grid', gridTemplateColumns: '1fr 1fr 1fr 1fr', gap: 16, maxWidth: 800 } }, - React.createElement('div', { style: formItemStyle }, React.createElement('div', { style: labelStyle }, '氢费预付款应收金额'), React.createElement('div', { style: valueStyle }, '3580.00 元')), - React.createElement('div', { style: formItemStyle }, React.createElement('div', { style: labelStyle }, '氢费预付款实收金额'), React.createElement('div', { style: valueStyle }, '3500.00 元')), - React.createElement('div', { style: formItemStyle }, React.createElement('div', { style: labelStyle }, '减免金额'), React.createElement('div', { style: valueStyle }, '80.00 元')), - React.createElement('div', { style: formItemStyle }, React.createElement('div', { style: labelStyle }, '减免金额备注'), React.createElement('div', { style: valueStyle }, '预付款批量减免')) + React.createElement('div', { style: formItemStyle }, React.createElement('div', { style: labelStyle }, '氢费预付款应收金额'), React.createElement('div', { style: valueStyle }, (hydrogen.receivable || '0.00') + ' 元')), + React.createElement('div', { style: formItemStyle }, React.createElement('div', { style: labelStyle }, '氢费预付款实收金额'), React.createElement('div', { style: valueStyle }, (hydrogen.actual || '0.00') + ' 元')), + React.createElement('div', { style: formItemStyle }, React.createElement('div', { style: labelStyle }, '减免金额'), React.createElement('div', { style: valueStyle }, (hydrogen.discount || '0.00') + ' 元')), + React.createElement('div', { style: formItemStyle }, React.createElement('div', { style: labelStyle }, '减免金额备注'), React.createElement('div', { style: valueStyle }, hydrogen.discountRemark || '—')) ), React.createElement('div', { style: { display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '16px 24px', marginTop: 16 } }, React.createElement('div', { style: formItemStyle }, React.createElement('div', { style: labelStyle }, '开票方式'), React.createElement('div', { style: valueStyle }, '先开票后付款')), diff --git a/web端/车辆管理-查看.jsx b/web端/车辆管理-查看.jsx index 280333c..a97cd6b 100644 --- a/web端/车辆管理-查看.jsx +++ b/web端/车辆管理-查看.jsx @@ -25,30 +25,27 @@ const Component = function () { vin: 'LA9HE60A0NBAF4031', vehicleNo: '22FHD0007', owner: '浙江羚牛氢能科技有限公司', + operateCompany: '羚牛运营(嘉兴)', + vehicleSource: '自有', + leaseCompany: '上海迅杰物流有限公司', contractNo: 'LNZLHTSH2023071301', - outStatus: '租赁交车', + // 与「车辆管理」列表一致:车辆状态、出库状态、证照状态、保险状态枚举见 web端/车辆管理.jsx 注释 + vehicleStatus: '已交车', + outStatus: '无', licenseStatus: '正常', + insuranceStatus: '正常', location: '浙江省嘉兴市平湖市XXXXXXXXXXX街道XXXXXXXXXXX号XXXXXXXx', bodyColor: '白色', purchaseDate: '2026-09-09', - warehouseStatus: '已交付车-租赁服务', customerName: '上海迅杰物流有限公司', - prepStatus: '正常', - scrapStatus: '无', gpsLastTime: '2026-09-09 10:50', - resourceCategory: 'XXXXXXXXXX', manufactureYear: '2025', parkingPlace: '-', bizDept: '业务三部', - lastPrepTime: '2026-09-09', - assetRating: 'XXXXXXXXXX', ratingTime: '2027-09-09', forceScrapDate: '2026-09-09', nextInspectionTime: '2026-09-09', - bizManager: '金可鹏', - maintainStatus: '正常', - preemptStatus: '无', - transferStatus: '无' + bizManager: '金可鹏' }; // 型号参数 tab 数据 @@ -1278,37 +1275,32 @@ const Component = function () { React.createElement('div', { style: styles.cardBody }, React.createElement('div', { style: styles.overviewHeader }, React.createElement('span', { style: styles.plateNo }, overview.plateNo), - React.createElement(Tag, { color: 'blue' }, overview.plateTag), - React.createElement(Button, { type: 'link', size: 'small', style: { padding: 0 } }, '1') + React.createElement(Tag, { color: 'blue' }, overview.plateTag) ), React.createElement('div', { style: styles.overviewGrid }, React.createElement(InfoRow, { label: '车架号', value: overview.vin }), React.createElement(InfoRow, { label: '车辆编号', value: overview.vehicleNo }), React.createElement(InfoRow, { label: '登记所有权', value: overview.owner }), + React.createElement(InfoRow, { label: '运营公司', value: overview.operateCompany }), + React.createElement(InfoRow, { label: '车辆来源', value: overview.vehicleSource }), + React.createElement(InfoRow, { label: '租赁公司', value: overview.leaseCompany }), React.createElement(InfoRow, { label: '合同编号', value: overview.contractNo }), + React.createElement(InfoRow, { label: '车辆状态', value: overview.vehicleStatus }), React.createElement(InfoRow, { label: '出库状态', value: overview.outStatus }), React.createElement(InfoRow, { label: '证照状态', value: overview.licenseStatus }), + React.createElement(InfoRow, { label: '保险状态', value: overview.insuranceStatus }), React.createElement(InfoRow, { label: '车辆当前位置', value: overview.location, ellipsisWithTooltip: true }), React.createElement(InfoRow, { label: '车身颜色', value: overview.bodyColor }), React.createElement(InfoRow, { label: '采购入库日期', value: overview.purchaseDate }), - React.createElement(InfoRow, { label: '库位状态', value: overview.warehouseStatus }), React.createElement(InfoRow, { label: '客户名称', value: overview.customerName }), - React.createElement(InfoRow, { label: '整备状态', value: overview.prepStatus }), - React.createElement(InfoRow, { label: '报废状态', value: overview.scrapStatus }), React.createElement(InfoRow, { label: 'GPS最后上传', value: overview.gpsLastTime }), - React.createElement(InfoRow, { label: '资源分类', value: overview.resourceCategory }), React.createElement(InfoRow, { label: '出厂年份', value: overview.manufactureYear }), React.createElement(InfoRow, { label: '停车位置', value: overview.parkingPlace }), React.createElement(InfoRow, { label: '业务部门', value: overview.bizDept }), - React.createElement(InfoRow, { label: '上次整备时间', value: overview.lastPrepTime }), - React.createElement(InfoRow, { label: '资产评级', value: overview.assetRating }), React.createElement(InfoRow, { label: '等评时间', value: overview.ratingTime }), React.createElement(InfoRow, { label: '强制报废期', value: overview.forceScrapDate }), React.createElement(InfoRow, { label: '下次年检时间', value: overview.nextInspectionTime }), - React.createElement(InfoRow, { label: '业务负责人', value: overview.bizManager }), - React.createElement(InfoRow, { label: '维修状态', value: overview.maintainStatus }), - React.createElement(InfoRow, { label: '预占状态', value: overview.preemptStatus }), - React.createElement(InfoRow, { label: '过户状态', value: overview.transferStatus }) + React.createElement(InfoRow, { label: '业务负责人', value: overview.bizManager }) ) ) ), diff --git a/web端/车辆管理.jsx b/web端/车辆管理.jsx index 591dd82..2acd4b5 100644 --- a/web端/车辆管理.jsx +++ b/web端/车辆管理.jsx @@ -30,6 +30,9 @@ const Component = function () { var _department = useState(undefined); var _contractNo = useState(undefined); var _ownership = useState(undefined); + var _operateCompany = useState(undefined); + var _vehicleSource = useState(undefined); + var _leaseCompany = useState(undefined); var _plateFilter = useState(''); var _selectedRowKeys = useState([]); @@ -62,6 +65,22 @@ const Component = function () { var departmentOptions = [{ label: '无', value: 'none' }, { label: '华南区', value: 'd1' }, { label: '华东区', value: 'd2' }]; var contractOptions = [{ label: 'HT-2024-001', value: 'HT-2024-001' }, { label: 'HT-2024-002', value: 'HT-2024-002' }]; var ownershipOptions = [{ label: '某某租赁公司', value: 'o1' }, { label: '某某科技有限公司', value: 'o2' }]; + var operateCompanyOptions = [ + { label: '羚牛运营(嘉兴)', value: '羚牛运营(嘉兴)' }, + { label: '羚牛运营(上海)', value: '羚牛运营(上海)' }, + { label: '羚牛运营(广东)', value: '羚牛运营(广东)' } + ]; + var vehicleSourceOptions = [ + { label: '自有', value: '自有' }, + { label: '外租', value: '外租' }, + { label: '挂靠', value: '挂靠' } + ]; + var leaseCompanyOptions = [ + { label: '某某租赁公司', value: '某某租赁公司' }, + { label: '某某科技有限公司', value: '某某科技有限公司' }, + { label: '第三方融资租赁有限公司', value: '第三方融资租赁有限公司' }, + { label: '无', value: '-' } + ]; // 表格数据(模拟 20 条)— 状态字段按《车辆状态》脑图(2026-03): // 运营状态:租赁、自营、可运营、待运营、退出运营(原「库存」并入「可运营」) @@ -70,26 +89,26 @@ const Component = function () { // 证照状态:正常、异常、无 // 保险状态:正常、异常 var rawData = [ - { id: '1', region: '广东省/广州市', vin: 'LGWEF4A59NS123456', plateNo: '粤A12345', vehicleNo: 'V001', vehicleType: '小型轿车', brand: '比亚迪', model: '汉EV', color: '白色', parking: '天河停车场', customer: '客户A', department: '华南区', manager: '张三', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', onlineStatus: '在线', year: '2023', mileage: '12580.50', purchaseDate: '2023-06-15', regDate: '2023-07-01', inspectExpire: '2025-07', lastDeliveryTime: '2024-01-10', lastDeliveryMile: '12000.00', lastReturnTime: '2024-02-01', lastReturnMile: '12580.50', scrapDate: '2038-12-31', contractNo: 'HT-2024-001', location: '广东省广州市天河区天河路100号', gpsTime: '2024-02-12 14:30' }, - { id: '2', region: '广东省/深圳市', vin: 'LGWEF4A59NS789012', plateNo: '粤B67890', vehicleNo: '-', vehicleType: 'SUV', brand: '特斯拉', model: 'Model 3', color: '黑色', parking: '-', customer: '客户B', department: '华南区', manager: '李四', operateStatus: '可运营', vehicleStatus: '未备车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某科技有限公司', onlineStatus: '离线', year: '2022', mileage: '25600.00', purchaseDate: '2022-08-20', regDate: '2022-09-01', inspectExpire: '2024-09', lastDeliveryTime: '2024-01-05', lastDeliveryMile: '25500.00', lastReturnTime: '2024-01-20', lastReturnMile: '25600.00', scrapDate: '2037-09-30', contractNo: '-', location: '广东省深圳市南山区科技园南路', gpsTime: '2024-02-11 09:00' }, - { id: '3', region: '广东省/广州市', vin: 'LSJA24U70PS001234', plateNo: '粤A88K88', vehicleNo: 'V003', vehicleType: '小型轿车', brand: '蔚来', model: 'ET5', color: '灰色', parking: '黄埔停车场', customer: '客户A', department: '华南区', manager: '王五', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', onlineStatus: '在线', year: '2023', mileage: '8320.00', purchaseDate: '2023-09-01', regDate: '2023-09-20', inspectExpire: '2025-09', lastDeliveryTime: '2024-02-05', lastDeliveryMile: '8100.00', lastReturnTime: '2024-02-10', lastReturnMile: '8320.00', scrapDate: '2039-09-30', contractNo: 'HT-2024-002', location: '广东省广州市黄埔区开泰大道200号', gpsTime: '2024-02-12 10:15' }, - { id: '4', region: '北京市/北京市', vin: 'WVWZZZ3CZWE123456', plateNo: '京C12345', vehicleNo: '-', vehicleType: 'SUV', brand: '特斯拉', model: 'Model Y', color: '蓝色', parking: '朝阳停车场', customer: '无', department: '无', manager: '-', operateStatus: '自营', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某科技有限公司', onlineStatus: '离线', year: '2022', mileage: '18900.25', purchaseDate: '2022-11-10', regDate: '2022-12-01', inspectExpire: '2024-12', lastDeliveryTime: '2024-01-15', lastDeliveryMile: '18500.00', lastReturnTime: '2024-01-28', lastReturnMile: '18900.25', scrapDate: '2037-12-31', contractNo: '-', location: '北京市朝阳区望京街88号', gpsTime: '2024-02-10 16:00' }, - { id: '5', region: '上海市/上海市', vin: 'LSVAU2BR3NS567890', plateNo: '沪D66666', vehicleNo: 'V005', vehicleType: '厢式货车', brand: '比亚迪', model: '汉EV', color: '白色', parking: '-', customer: '客户C', department: '华东区', manager: '赵六', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '异常', insuranceStatus: '异常', ownership: '某某租赁公司', onlineStatus: '在线', year: '2021', mileage: '45200.80', purchaseDate: '2021-05-20', regDate: '2021-06-15', inspectExpire: '2024-06', lastDeliveryTime: '2024-02-01', lastDeliveryMile: '44800.00', lastReturnTime: '2024-02-08', lastReturnMile: '45200.80', scrapDate: '2036-06-30', contractNo: 'HT-2024-003', location: '上海市浦东新区张江高科路500号', gpsTime: '2024-02-12 09:45' }, - { id: '6', region: '广东省/深圳市', vin: '5YJ3E1EA1NF123456', plateNo: '粤B12345', vehicleNo: '-', vehicleType: '小型轿车', brand: '特斯拉', model: 'Model 3', color: '红色', parking: '福田停车场', customer: '客户B', department: '华南区', manager: '李四', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', onlineStatus: '在线', year: '2023', mileage: '5600.00', purchaseDate: '2023-03-08', regDate: '2023-04-01', inspectExpire: '2025-04', lastDeliveryTime: '2024-02-02', lastDeliveryMile: '5200.00', lastReturnTime: '2024-02-11', lastReturnMile: '5600.00', scrapDate: '2038-04-30', contractNo: 'HT-2024-004', location: '广东省深圳市福田区福华路188号', gpsTime: '2024-02-12 11:20' }, - { id: '7', region: '广东省/广州市', vin: 'LGWEF4A59NS234567', plateNo: '粤A99A99', vehicleNo: 'V007', vehicleType: '小型轿车', brand: '比亚迪', model: '汉EV', color: '黑色', parking: '天河停车场', customer: '客户A', department: '华南区', manager: '张三', operateStatus: '可运营', vehicleStatus: '待还车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', onlineStatus: '离线', year: '2022', mileage: '22100.30', purchaseDate: '2022-07-15', regDate: '2022-08-01', inspectExpire: '2024-08', lastDeliveryTime: '2024-01-20', lastDeliveryMile: '21800.00', lastReturnTime: '2024-02-05', lastReturnMile: '22100.30', scrapDate: '2037-08-31', contractNo: '-', location: '广东省广州市天河区体育西路200号', gpsTime: '2024-02-11 18:30' }, - { id: '8', region: '北京市/北京市', vin: 'WVWZZZ3CZWE789012', plateNo: '京E88888', vehicleNo: '-', vehicleType: 'SUV', brand: '蔚来', model: 'ET5', color: '绿色', parking: '-', customer: '客户D', department: '华北区', manager: '孙七', operateStatus: '自营', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某科技有限公司', onlineStatus: '在线', year: '2023', mileage: '11200.00', purchaseDate: '2023-01-12', regDate: '2023-02-01', inspectExpire: '2025-02', lastDeliveryTime: '2024-02-06', lastDeliveryMile: '11000.00', lastReturnTime: '2024-02-12', lastReturnMile: '11200.00', scrapDate: '2038-02-28', contractNo: 'HT-2024-005', location: '北京市海淀区中关村大街1号', gpsTime: '2024-02-12 08:00' }, - { id: '9', region: '上海市/上海市', vin: 'LSVAU2BR3NS111222', plateNo: '沪A12345', vehicleNo: '-', vehicleType: '小型轿车', brand: '比亚迪', model: '汉EV', color: '银色', parking: '浦东停车场', customer: '无', department: '无', manager: '-', operateStatus: '可运营', vehicleStatus: '待还车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', onlineStatus: '离线', year: '2021', mileage: '38500.60', purchaseDate: '2021-10-05', regDate: '2021-11-01', inspectExpire: '2024-11', lastDeliveryTime: '2024-01-08', lastDeliveryMile: '38000.00', lastReturnTime: '2024-01-25', lastReturnMile: '38500.60', scrapDate: '2036-11-30', contractNo: '-', location: '上海市徐汇区漕溪路250号', gpsTime: '2024-02-09 14:00' }, - { id: '10', region: '广东省/深圳市', vin: '5YJ3E1EA2NF333444', plateNo: '粤B55B55', vehicleNo: 'V010', vehicleType: 'SUV', brand: '特斯拉', model: 'Model Y', color: '白色', parking: '南山停车场', customer: '客户B', department: '华南区', manager: '李四', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某科技有限公司', onlineStatus: '在线', year: '2022', mileage: '16800.00', purchaseDate: '2022-04-18', regDate: '2022-05-10', inspectExpire: '2024-05', lastDeliveryTime: '2024-01-30', lastDeliveryMile: '16500.00', lastReturnTime: '2024-02-09', lastReturnMile: '16800.00', scrapDate: '2037-05-31', contractNo: 'HT-2024-006', location: '广东省深圳市南山区后海大道300号', gpsTime: '2024-02-12 13:10' }, - { id: '11', region: '广东省/广州市', vin: 'LSJA24U70PS555666', plateNo: '粤A11B22', vehicleNo: '-', vehicleType: '小型轿车', brand: '蔚来', model: 'ET5', color: '蓝色', parking: '番禺停车场', customer: '客户A', department: '华南区', manager: '王五', operateStatus: '租赁', vehicleStatus: '替换中', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', onlineStatus: '在线', year: '2023', mileage: '7200.50', purchaseDate: '2023-07-20', regDate: '2023-08-05', inspectExpire: '2025-08', lastDeliveryTime: '2024-02-03', lastDeliveryMile: '7000.00', lastReturnTime: '2024-02-11', lastReturnMile: '7200.50', scrapDate: '2038-08-31', contractNo: 'HT-2024-007', location: '广东省广州市番禺区市桥街100号', gpsTime: '2024-02-12 12:00' }, - { id: '12', region: '北京市/北京市', vin: 'WVWZZZ3CZWE333555', plateNo: '京F33333', vehicleNo: '-', vehicleType: '厢式货车', brand: '比亚迪', model: '汉EV', color: '灰色', parking: '大兴停车场', customer: '客户D', department: '华北区', manager: '孙七', operateStatus: '可运营', vehicleStatus: '未备车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', onlineStatus: '离线', year: '2020', mileage: '52100.00', purchaseDate: '2020-09-01', regDate: '2020-10-01', inspectExpire: '2024-10', lastDeliveryTime: '2024-01-12', lastDeliveryMile: '51800.00', lastReturnTime: '2024-01-30', lastReturnMile: '52100.00', scrapDate: '2035-10-31', contractNo: '-', location: '北京市大兴区亦庄经济开发区', gpsTime: '2024-02-08 11:00' }, - { id: '13', region: '上海市/上海市', vin: 'LSVAU2BR3NS777888', plateNo: '沪B99999', vehicleNo: 'V013', vehicleType: '小型轿车', brand: '特斯拉', model: 'Model 3', color: '黑色', parking: '-', customer: '客户C', department: '华东区', manager: '赵六', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某科技有限公司', onlineStatus: '在线', year: '2022', mileage: '19800.00', purchaseDate: '2022-12-01', regDate: '2023-01-05', inspectExpire: '2025-01', lastDeliveryTime: '2024-02-07', lastDeliveryMile: '19500.00', lastReturnTime: '2024-02-12', lastReturnMile: '19800.00', scrapDate: '2038-01-31', contractNo: 'HT-2024-008', location: '上海市闵行区莘庄镇莘松路88号', gpsTime: '2024-02-12 15:45' }, - { id: '14', region: '广东省/深圳市', vin: 'LGWEF4A59NS888999', plateNo: '粤B22C33', vehicleNo: '-', vehicleType: 'SUV', brand: '比亚迪', model: '汉EV', color: '白色', parking: '龙岗停车场', customer: '客户B', department: '华南区', manager: '李四', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', onlineStatus: '在线', year: '2023', mileage: '4200.00', purchaseDate: '2023-10-10', regDate: '2023-11-01', inspectExpire: '2025-11', lastDeliveryTime: '2024-02-04', lastDeliveryMile: '4000.00', lastReturnTime: '2024-02-10', lastReturnMile: '4200.00', scrapDate: '2038-11-30', contractNo: 'HT-2024-009', location: '广东省深圳市龙岗区龙城大道500号', gpsTime: '2024-02-12 10:30' }, - { id: '15', region: '广东省/广州市', vin: 'LSJA24U70PS000111', plateNo: '粤A66D66', vehicleNo: 'V015', vehicleType: '小型轿车', brand: '蔚来', model: 'ET5', color: '红色', parking: '天河停车场', customer: '无', department: '无', manager: '-', operateStatus: '待运营', vehicleStatus: '待验车', outStatus: '无', licenseStatus: '异常', insuranceStatus: '异常', ownership: '某某科技有限公司', onlineStatus: '离线', year: '2021', mileage: '31200.40', purchaseDate: '2021-03-15', regDate: '2021-04-01', inspectExpire: '2024-04', lastDeliveryTime: '2024-01-18', lastDeliveryMile: '30800.00', lastReturnTime: '2024-02-02', lastReturnMile: '31200.40', scrapDate: '2036-04-30', contractNo: '-', location: '广东省广州市越秀区中山五路66号', gpsTime: '2024-02-07 09:00' }, - { id: '16', region: '北京市/北京市', vin: '5YJ3E1EA3NF222333', plateNo: '京G12345', vehicleNo: '-', vehicleType: '小型轿车', brand: '特斯拉', model: 'Model 3', color: '银色', parking: '西城停车场', customer: '客户D', department: '华北区', manager: '孙七', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', onlineStatus: '在线', year: '2023', mileage: '9800.00', purchaseDate: '2023-05-01', regDate: '2023-05-20', inspectExpire: '2025-05', lastDeliveryTime: '2024-02-01', lastDeliveryMile: '9500.00', lastReturnTime: '2024-02-11', lastReturnMile: '9800.00', scrapDate: '2038-05-31', contractNo: 'HT-2024-010', location: '北京市西城区金融街28号', gpsTime: '2024-02-12 14:00' }, - { id: '17', region: '上海市/上海市', vin: 'LGWEF4A59NS444555', plateNo: '沪C11111', vehicleNo: '-', vehicleType: '小型轿车', brand: '比亚迪', model: '汉EV', color: '黑色', parking: '虹口停车场', customer: '客户C', department: '华东区', manager: '赵六', operateStatus: '可运营', vehicleStatus: '已备车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', onlineStatus: '离线', year: '2022', mileage: '24500.00', purchaseDate: '2022-02-28', regDate: '2022-03-15', inspectExpire: '2024-03', lastDeliveryTime: '2024-01-22', lastDeliveryMile: '24200.00', lastReturnTime: '2024-02-06', lastReturnMile: '24500.00', scrapDate: '2037-03-31', contractNo: '-', location: '上海市虹口区四川北路1688号', gpsTime: '2024-02-11 17:00' }, - { id: '18', region: '广东省/深圳市', vin: 'LSVAU2BR3NS666777', plateNo: '粤B44E44', vehicleNo: 'V018', vehicleType: '厢式货车', brand: '比亚迪', model: '汉EV', color: '灰色', parking: '-', customer: '客户B', department: '华南区', manager: '李四', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某科技有限公司', onlineStatus: '在线', year: '2020', mileage: '67800.25', purchaseDate: '2020-06-10', regDate: '2020-07-01', inspectExpire: '2024-07', lastDeliveryTime: '2024-01-25', lastDeliveryMile: '67500.00', lastReturnTime: '2024-02-09', lastReturnMile: '67800.25', scrapDate: '2035-07-31', contractNo: 'HT-2024-011', location: '广东省深圳市宝安区新安街道创业路', gpsTime: '2024-02-12 08:20' }, - { id: '19', region: '广东省/广州市', vin: '5YJ3E1EA4NF888999', plateNo: '粤A77F77', vehicleNo: '-', vehicleType: 'SUV', brand: '特斯拉', model: 'Model Y', color: '蓝色', parking: '白云停车场', customer: '客户A', department: '华南区', manager: '张三', operateStatus: '租赁', vehicleStatus: '销售中', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', onlineStatus: '在线', year: '2023', mileage: '3500.00', purchaseDate: '2023-11-05', regDate: '2023-11-25', inspectExpire: '2025-11', lastDeliveryTime: '2024-02-08', lastDeliveryMile: '3200.00', lastReturnTime: '2024-02-12', lastReturnMile: '3500.00', scrapDate: '2038-11-30', contractNo: 'HT-2024-012', location: '广东省广州市白云区白云大道南888号', gpsTime: '2024-02-12 16:00' }, - { id: '20', region: '北京市/北京市', vin: 'LSJA24U70PS999000', plateNo: '京H88888', vehicleNo: '-', vehicleType: '小型轿车', brand: '蔚来', model: 'ET5', color: '白色', parking: '昌平停车场', customer: '客户D', department: '华北区', manager: '孙七', operateStatus: '退出运营', vehicleStatus: '无', outStatus: '报废出库', licenseStatus: '无', insuranceStatus: '正常', ownership: '某某科技有限公司', onlineStatus: '离线', year: '2022', mileage: '15600.00', purchaseDate: '2022-06-20', regDate: '2022-07-10', inspectExpire: '2024-07', lastDeliveryTime: '2024-01-10', lastDeliveryMile: '15300.00', lastReturnTime: '2024-01-28', lastReturnMile: '15600.00', scrapDate: '2037-07-31', contractNo: '-', location: '北京市昌平区回龙观西大街100号', gpsTime: '2024-02-10 12:30' } + { id: '1', region: '广东省/广州市', vin: 'LGWEF4A59NS123456', plateNo: '粤A12345', vehicleNo: 'V001', vehicleType: '小型轿车', brand: '比亚迪', model: '汉EV', color: '白色', parking: '天河停车场', customer: '客户A', department: '华南区', manager: '张三', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', operateCompany: '羚牛运营(嘉兴)', vehicleSource: '自有', leaseCompany: '某某租赁公司', onlineStatus: '在线', year: '2023', mileage: '12580.50', purchaseDate: '2023-06-15', regDate: '2023-07-01', inspectExpire: '2025-07', lastDeliveryTime: '2024-01-10', lastDeliveryMile: '12000.00', lastReturnTime: '2024-02-01', lastReturnMile: '12580.50', scrapDate: '2038-12-31', contractNo: 'HT-2024-001', location: '广东省广州市天河区天河路100号', gpsTime: '2024-02-12 14:30' }, + { id: '2', region: '广东省/深圳市', vin: 'LGWEF4A59NS789012', plateNo: '粤B67890', vehicleNo: '-', vehicleType: 'SUV', brand: '特斯拉', model: 'Model 3', color: '黑色', parking: '-', customer: '客户B', department: '华南区', manager: '李四', operateStatus: '可运营', vehicleStatus: '未备车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某科技有限公司', operateCompany: '羚牛运营(上海)', vehicleSource: '外租', leaseCompany: '某某科技有限公司', onlineStatus: '离线', year: '2022', mileage: '25600.00', purchaseDate: '2022-08-20', regDate: '2022-09-01', inspectExpire: '2024-09', lastDeliveryTime: '2024-01-05', lastDeliveryMile: '25500.00', lastReturnTime: '2024-01-20', lastReturnMile: '25600.00', scrapDate: '2037-09-30', contractNo: '-', location: '广东省深圳市南山区科技园南路', gpsTime: '2024-02-11 09:00' }, + { id: '3', region: '广东省/广州市', vin: 'LSJA24U70PS001234', plateNo: '粤A88K88', vehicleNo: 'V003', vehicleType: '小型轿车', brand: '蔚来', model: 'ET5', color: '灰色', parking: '黄埔停车场', customer: '客户A', department: '华南区', manager: '王五', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', operateCompany: '羚牛运营(广东)', vehicleSource: '挂靠', leaseCompany: '第三方融资租赁有限公司', onlineStatus: '在线', year: '2023', mileage: '8320.00', purchaseDate: '2023-09-01', regDate: '2023-09-20', inspectExpire: '2025-09', lastDeliveryTime: '2024-02-05', lastDeliveryMile: '8100.00', lastReturnTime: '2024-02-10', lastReturnMile: '8320.00', scrapDate: '2039-09-30', contractNo: 'HT-2024-002', location: '广东省广州市黄埔区开泰大道200号', gpsTime: '2024-02-12 10:15' }, + { id: '4', region: '北京市/北京市', vin: 'WVWZZZ3CZWE123456', plateNo: '京C12345', vehicleNo: '-', vehicleType: 'SUV', brand: '特斯拉', model: 'Model Y', color: '蓝色', parking: '朝阳停车场', customer: '无', department: '无', manager: '-', operateStatus: '自营', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某科技有限公司', operateCompany: '羚牛运营(嘉兴)', vehicleSource: '自有', leaseCompany: '-', onlineStatus: '离线', year: '2022', mileage: '18900.25', purchaseDate: '2022-11-10', regDate: '2022-12-01', inspectExpire: '2024-12', lastDeliveryTime: '2024-01-15', lastDeliveryMile: '18500.00', lastReturnTime: '2024-01-28', lastReturnMile: '18900.25', scrapDate: '2037-12-31', contractNo: '-', location: '北京市朝阳区望京街88号', gpsTime: '2024-02-10 16:00' }, + { id: '5', region: '上海市/上海市', vin: 'LSVAU2BR3NS567890', plateNo: '沪D66666', vehicleNo: 'V005', vehicleType: '厢式货车', brand: '比亚迪', model: '汉EV', color: '白色', parking: '-', customer: '客户C', department: '华东区', manager: '赵六', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '异常', insuranceStatus: '异常', ownership: '某某租赁公司', operateCompany: '羚牛运营(上海)', vehicleSource: '外租', leaseCompany: '某某租赁公司', onlineStatus: '在线', year: '2021', mileage: '45200.80', purchaseDate: '2021-05-20', regDate: '2021-06-15', inspectExpire: '2024-06', lastDeliveryTime: '2024-02-01', lastDeliveryMile: '44800.00', lastReturnTime: '2024-02-08', lastReturnMile: '45200.80', scrapDate: '2036-06-30', contractNo: 'HT-2024-003', location: '上海市浦东新区张江高科路500号', gpsTime: '2024-02-12 09:45' }, + { id: '6', region: '广东省/深圳市', vin: '5YJ3E1EA1NF123456', plateNo: '粤B12345', vehicleNo: '-', vehicleType: '小型轿车', brand: '特斯拉', model: 'Model 3', color: '红色', parking: '福田停车场', customer: '客户B', department: '华南区', manager: '李四', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', operateCompany: '羚牛运营(广东)', vehicleSource: '挂靠', leaseCompany: '某某科技有限公司', onlineStatus: '在线', year: '2023', mileage: '5600.00', purchaseDate: '2023-03-08', regDate: '2023-04-01', inspectExpire: '2025-04', lastDeliveryTime: '2024-02-02', lastDeliveryMile: '5200.00', lastReturnTime: '2024-02-11', lastReturnMile: '5600.00', scrapDate: '2038-04-30', contractNo: 'HT-2024-004', location: '广东省深圳市福田区福华路188号', gpsTime: '2024-02-12 11:20' }, + { id: '7', region: '广东省/广州市', vin: 'LGWEF4A59NS234567', plateNo: '粤A99A99', vehicleNo: 'V007', vehicleType: '小型轿车', brand: '比亚迪', model: '汉EV', color: '黑色', parking: '天河停车场', customer: '客户A', department: '华南区', manager: '张三', operateStatus: '可运营', vehicleStatus: '待还车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', operateCompany: '羚牛运营(嘉兴)', vehicleSource: '自有', leaseCompany: '第三方融资租赁有限公司', onlineStatus: '离线', year: '2022', mileage: '22100.30', purchaseDate: '2022-07-15', regDate: '2022-08-01', inspectExpire: '2024-08', lastDeliveryTime: '2024-01-20', lastDeliveryMile: '21800.00', lastReturnTime: '2024-02-05', lastReturnMile: '22100.30', scrapDate: '2037-08-31', contractNo: '-', location: '广东省广州市天河区体育西路200号', gpsTime: '2024-02-11 18:30' }, + { id: '8', region: '北京市/北京市', vin: 'WVWZZZ3CZWE789012', plateNo: '京E88888', vehicleNo: '-', vehicleType: 'SUV', brand: '蔚来', model: 'ET5', color: '绿色', parking: '-', customer: '客户D', department: '华北区', manager: '孙七', operateStatus: '自营', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某科技有限公司', operateCompany: '羚牛运营(上海)', vehicleSource: '外租', leaseCompany: '-', onlineStatus: '在线', year: '2023', mileage: '11200.00', purchaseDate: '2023-01-12', regDate: '2023-02-01', inspectExpire: '2025-02', lastDeliveryTime: '2024-02-06', lastDeliveryMile: '11000.00', lastReturnTime: '2024-02-12', lastReturnMile: '11200.00', scrapDate: '2038-02-28', contractNo: 'HT-2024-005', location: '北京市海淀区中关村大街1号', gpsTime: '2024-02-12 08:00' }, + { id: '9', region: '上海市/上海市', vin: 'LSVAU2BR3NS111222', plateNo: '沪A12345', vehicleNo: '-', vehicleType: '小型轿车', brand: '比亚迪', model: '汉EV', color: '银色', parking: '浦东停车场', customer: '无', department: '无', manager: '-', operateStatus: '可运营', vehicleStatus: '待还车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', operateCompany: '羚牛运营(广东)', vehicleSource: '挂靠', leaseCompany: '某某租赁公司', onlineStatus: '离线', year: '2021', mileage: '38500.60', purchaseDate: '2021-10-05', regDate: '2021-11-01', inspectExpire: '2024-11', lastDeliveryTime: '2024-01-08', lastDeliveryMile: '38000.00', lastReturnTime: '2024-01-25', lastReturnMile: '38500.60', scrapDate: '2036-11-30', contractNo: '-', location: '上海市徐汇区漕溪路250号', gpsTime: '2024-02-09 14:00' }, + { id: '10', region: '广东省/深圳市', vin: '5YJ3E1EA2NF333444', plateNo: '粤B55B55', vehicleNo: 'V010', vehicleType: 'SUV', brand: '特斯拉', model: 'Model Y', color: '白色', parking: '南山停车场', customer: '客户B', department: '华南区', manager: '李四', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某科技有限公司', operateCompany: '羚牛运营(嘉兴)', vehicleSource: '自有', leaseCompany: '某某科技有限公司', onlineStatus: '在线', year: '2022', mileage: '16800.00', purchaseDate: '2022-04-18', regDate: '2022-05-10', inspectExpire: '2024-05', lastDeliveryTime: '2024-01-30', lastDeliveryMile: '16500.00', lastReturnTime: '2024-02-09', lastReturnMile: '16800.00', scrapDate: '2037-05-31', contractNo: 'HT-2024-006', location: '广东省深圳市南山区后海大道300号', gpsTime: '2024-02-12 13:10' }, + { id: '11', region: '广东省/广州市', vin: 'LSJA24U70PS555666', plateNo: '粤A11B22', vehicleNo: '-', vehicleType: '小型轿车', brand: '蔚来', model: 'ET5', color: '蓝色', parking: '番禺停车场', customer: '客户A', department: '华南区', manager: '王五', operateStatus: '租赁', vehicleStatus: '替换中', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', operateCompany: '羚牛运营(上海)', vehicleSource: '外租', leaseCompany: '第三方融资租赁有限公司', onlineStatus: '在线', year: '2023', mileage: '7200.50', purchaseDate: '2023-07-20', regDate: '2023-08-05', inspectExpire: '2025-08', lastDeliveryTime: '2024-02-03', lastDeliveryMile: '7000.00', lastReturnTime: '2024-02-11', lastReturnMile: '7200.50', scrapDate: '2038-08-31', contractNo: 'HT-2024-007', location: '广东省广州市番禺区市桥街100号', gpsTime: '2024-02-12 12:00' }, + { id: '12', region: '北京市/北京市', vin: 'WVWZZZ3CZWE333555', plateNo: '京F33333', vehicleNo: '-', vehicleType: '厢式货车', brand: '比亚迪', model: '汉EV', color: '灰色', parking: '大兴停车场', customer: '客户D', department: '华北区', manager: '孙七', operateStatus: '可运营', vehicleStatus: '未备车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', operateCompany: '羚牛运营(广东)', vehicleSource: '挂靠', leaseCompany: '-', onlineStatus: '离线', year: '2020', mileage: '52100.00', purchaseDate: '2020-09-01', regDate: '2020-10-01', inspectExpire: '2024-10', lastDeliveryTime: '2024-01-12', lastDeliveryMile: '51800.00', lastReturnTime: '2024-01-30', lastReturnMile: '52100.00', scrapDate: '2035-10-31', contractNo: '-', location: '北京市大兴区亦庄经济开发区', gpsTime: '2024-02-08 11:00' }, + { id: '13', region: '上海市/上海市', vin: 'LSVAU2BR3NS777888', plateNo: '沪B99999', vehicleNo: 'V013', vehicleType: '小型轿车', brand: '特斯拉', model: 'Model 3', color: '黑色', parking: '-', customer: '客户C', department: '华东区', manager: '赵六', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某科技有限公司', operateCompany: '羚牛运营(嘉兴)', vehicleSource: '自有', leaseCompany: '某某租赁公司', onlineStatus: '在线', year: '2022', mileage: '19800.00', purchaseDate: '2022-12-01', regDate: '2023-01-05', inspectExpire: '2025-01', lastDeliveryTime: '2024-02-07', lastDeliveryMile: '19500.00', lastReturnTime: '2024-02-12', lastReturnMile: '19800.00', scrapDate: '2038-01-31', contractNo: 'HT-2024-008', location: '上海市闵行区莘庄镇莘松路88号', gpsTime: '2024-02-12 15:45' }, + { id: '14', region: '广东省/深圳市', vin: 'LGWEF4A59NS888999', plateNo: '粤B22C33', vehicleNo: '-', vehicleType: 'SUV', brand: '比亚迪', model: '汉EV', color: '白色', parking: '龙岗停车场', customer: '客户B', department: '华南区', manager: '李四', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', operateCompany: '羚牛运营(上海)', vehicleSource: '外租', leaseCompany: '某某科技有限公司', onlineStatus: '在线', year: '2023', mileage: '4200.00', purchaseDate: '2023-10-10', regDate: '2023-11-01', inspectExpire: '2025-11', lastDeliveryTime: '2024-02-04', lastDeliveryMile: '4000.00', lastReturnTime: '2024-02-10', lastReturnMile: '4200.00', scrapDate: '2038-11-30', contractNo: 'HT-2024-009', location: '广东省深圳市龙岗区龙城大道500号', gpsTime: '2024-02-12 10:30' }, + { id: '15', region: '广东省/广州市', vin: 'LSJA24U70PS000111', plateNo: '粤A66D66', vehicleNo: 'V015', vehicleType: '小型轿车', brand: '蔚来', model: 'ET5', color: '红色', parking: '天河停车场', customer: '无', department: '无', manager: '-', operateStatus: '待运营', vehicleStatus: '待验车', outStatus: '无', licenseStatus: '异常', insuranceStatus: '异常', ownership: '某某科技有限公司', operateCompany: '羚牛运营(广东)', vehicleSource: '挂靠', leaseCompany: '第三方融资租赁有限公司', onlineStatus: '离线', year: '2021', mileage: '31200.40', purchaseDate: '2021-03-15', regDate: '2021-04-01', inspectExpire: '2024-04', lastDeliveryTime: '2024-01-18', lastDeliveryMile: '30800.00', lastReturnTime: '2024-02-02', lastReturnMile: '31200.40', scrapDate: '2036-04-30', contractNo: '-', location: '广东省广州市越秀区中山五路66号', gpsTime: '2024-02-07 09:00' }, + { id: '16', region: '北京市/北京市', vin: '5YJ3E1EA3NF222333', plateNo: '京G12345', vehicleNo: '-', vehicleType: '小型轿车', brand: '特斯拉', model: 'Model 3', color: '银色', parking: '西城停车场', customer: '客户D', department: '华北区', manager: '孙七', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', operateCompany: '羚牛运营(嘉兴)', vehicleSource: '自有', leaseCompany: '-', onlineStatus: '在线', year: '2023', mileage: '9800.00', purchaseDate: '2023-05-01', regDate: '2023-05-20', inspectExpire: '2025-05', lastDeliveryTime: '2024-02-01', lastDeliveryMile: '9500.00', lastReturnTime: '2024-02-11', lastReturnMile: '9800.00', scrapDate: '2038-05-31', contractNo: 'HT-2024-010', location: '北京市西城区金融街28号', gpsTime: '2024-02-12 14:00' }, + { id: '17', region: '上海市/上海市', vin: 'LGWEF4A59NS444555', plateNo: '沪C11111', vehicleNo: '-', vehicleType: '小型轿车', brand: '比亚迪', model: '汉EV', color: '黑色', parking: '虹口停车场', customer: '客户C', department: '华东区', manager: '赵六', operateStatus: '可运营', vehicleStatus: '已备车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', operateCompany: '羚牛运营(上海)', vehicleSource: '外租', leaseCompany: '某某租赁公司', onlineStatus: '离线', year: '2022', mileage: '24500.00', purchaseDate: '2022-02-28', regDate: '2022-03-15', inspectExpire: '2024-03', lastDeliveryTime: '2024-01-22', lastDeliveryMile: '24200.00', lastReturnTime: '2024-02-06', lastReturnMile: '24500.00', scrapDate: '2037-03-31', contractNo: '-', location: '上海市虹口区四川北路1688号', gpsTime: '2024-02-11 17:00' }, + { id: '18', region: '广东省/深圳市', vin: 'LSVAU2BR3NS666777', plateNo: '粤B44E44', vehicleNo: 'V018', vehicleType: '厢式货车', brand: '比亚迪', model: '汉EV', color: '灰色', parking: '-', customer: '客户B', department: '华南区', manager: '李四', operateStatus: '租赁', vehicleStatus: '已交车', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某科技有限公司', operateCompany: '羚牛运营(广东)', vehicleSource: '挂靠', leaseCompany: '某某科技有限公司', onlineStatus: '在线', year: '2020', mileage: '67800.25', purchaseDate: '2020-06-10', regDate: '2020-07-01', inspectExpire: '2024-07', lastDeliveryTime: '2024-01-25', lastDeliveryMile: '67500.00', lastReturnTime: '2024-02-09', lastReturnMile: '67800.25', scrapDate: '2035-07-31', contractNo: 'HT-2024-011', location: '广东省深圳市宝安区新安街道创业路', gpsTime: '2024-02-12 08:20' }, + { id: '19', region: '广东省/广州市', vin: '5YJ3E1EA4NF888999', plateNo: '粤A77F77', vehicleNo: '-', vehicleType: 'SUV', brand: '特斯拉', model: 'Model Y', color: '蓝色', parking: '白云停车场', customer: '客户A', department: '华南区', manager: '张三', operateStatus: '租赁', vehicleStatus: '销售中', outStatus: '无', licenseStatus: '正常', insuranceStatus: '正常', ownership: '某某租赁公司', operateCompany: '羚牛运营(嘉兴)', vehicleSource: '自有', leaseCompany: '第三方融资租赁有限公司', onlineStatus: '在线', year: '2023', mileage: '3500.00', purchaseDate: '2023-11-05', regDate: '2023-11-25', inspectExpire: '2025-11', lastDeliveryTime: '2024-02-08', lastDeliveryMile: '3200.00', lastReturnTime: '2024-02-12', lastReturnMile: '3500.00', scrapDate: '2038-11-30', contractNo: 'HT-2024-012', location: '广东省广州市白云区白云大道南888号', gpsTime: '2024-02-12 16:00' }, + { id: '20', region: '北京市/北京市', vin: 'LSJA24U70PS999000', plateNo: '京H88888', vehicleNo: '-', vehicleType: '小型轿车', brand: '蔚来', model: 'ET5', color: '白色', parking: '昌平停车场', customer: '客户D', department: '华北区', manager: '孙七', operateStatus: '退出运营', vehicleStatus: '无', outStatus: '报废出库', licenseStatus: '无', insuranceStatus: '正常', ownership: '某某科技有限公司', operateCompany: '羚牛运营(上海)', vehicleSource: '外租', leaseCompany: '-', onlineStatus: '离线', year: '2022', mileage: '15600.00', purchaseDate: '2022-06-20', regDate: '2022-07-10', inspectExpire: '2024-07', lastDeliveryTime: '2024-01-10', lastDeliveryMile: '15300.00', lastReturnTime: '2024-01-28', lastReturnMile: '15600.00', scrapDate: '2037-07-31', contractNo: '-', location: '北京市昌平区回龙观西大街100号', gpsTime: '2024-02-10 12:30' } ]; var dataSource = useMemo(function () { @@ -286,7 +305,10 @@ const Component = function () { { title: '出库状态', dataIndex: 'outStatus', key: 'outStatus', width: 120, render: function (text) { return formatStatusDisplay(text); } }, { title: '证照状态', dataIndex: 'licenseStatus', key: 'licenseStatus', width: 90, render: function (text) { return formatStatusDisplay(text); } }, { title: '保险状态', dataIndex: 'insuranceStatus', key: 'insuranceStatus', width: 90, render: function (text) { return formatStatusDisplay(text); } }, - { title: '登记所有权', dataIndex: 'ownership', key: 'ownership', width: 160 }, + { title: '登记所有权', dataIndex: 'ownership', key: 'ownership', width: 160, ellipsis: true }, + { title: '运营公司', dataIndex: 'operateCompany', key: 'operateCompany', width: 150, ellipsis: true }, + { title: '车辆来源', dataIndex: 'vehicleSource', key: 'vehicleSource', width: 90 }, + { title: '租赁公司', dataIndex: 'leaseCompany', key: 'leaseCompany', width: 160, ellipsis: true }, { title: '在线状态', dataIndex: 'onlineStatus', key: 'onlineStatus', width: 90 }, { title: '出厂年份', dataIndex: 'year', key: 'year', width: 90 }, { title: '行驶公里数(KM)', dataIndex: 'mileage', key: 'mileage', width: 130 }, @@ -322,7 +344,7 @@ const Component = function () { var filterLabelStyle = { marginBottom: 6, fontSize: 14, color: 'rgba(0,0,0,0.65)' }; var filterItemStyle = { marginBottom: 12 }; var toolbarStyle = { marginBottom: 12, display: 'flex', justifyContent: 'space-between', alignItems: 'center', flexWrap: 'wrap', gap: 8 }; - var tableSingleLineStyle = '.vehicle-mgmt-table .ant-table-thead th,.vehicle-mgmt-table .ant-table-tbody td{white-space:nowrap;}'; + var tableSingleLineStyle = '.vehicle-mgmt-table .ant-table-content table{table-layout:fixed;}.vehicle-mgmt-table .ant-table-thead th,.vehicle-mgmt-table .ant-table-tbody > tr > td{white-space:nowrap;overflow:hidden;vertical-align:middle;}.vehicle-mgmt-table .ant-table-tbody > tr > td.ant-table-cell-fix-right{overflow:visible;}'; // 车辆详情页:卡片标题、默认只显示前三列+收起/展开,下方 Tab+内容卡片 var detailRecord = _detailRecord[0]; @@ -348,6 +370,9 @@ const Component = function () { { label: '车身颜色', node: field('车身颜色', r.color || '-') }, { label: '采购交车日期', node: field('采购交车日期', r.purchaseDate || '-') }, { label: '登记所有权', node: field('登记所有权', r.ownership || '-') }, + { label: '运营公司', node: field('运营公司', r.operateCompany || '-') }, + { label: '车辆来源', node: field('车辆来源', r.vehicleSource || '-') }, + { label: '租赁公司', node: field('租赁公司', r.leaseCompany && r.leaseCompany !== '-' ? r.leaseCompany : '-') }, { label: '客户名称', node: field('客户名称', r.customer || '-') }, { label: '证照状态', node: field('证照状态', formatStatusDisplay(r.licenseStatus) || '-') }, { label: '保险状态', node: field('保险状态', formatStatusDisplay(r.insuranceStatus) || '-') }, @@ -366,7 +391,7 @@ const Component = function () { { label: 'GPS最后上传时间', node: field('GPS最后上传时间', r.gpsTime || '-') }, { label: '车辆当前位置', node: fieldLink('车辆当前位置', r.location || '-', function () { message.info('查看位置(原型)'); }) } ]; - var rowCount = _detailCardExpanded[0] ? 7 : 3; + var rowCount = _detailCardExpanded[0] ? 8 : 3; var rows = []; for (var i = 0; i < rowCount; i++) { var rowCells = []; @@ -502,7 +527,7 @@ const Component = function () { ); } - var requirementText = '# 车辆管理\n一个「车辆资产管理」后台的「车辆管理」模块,功能从上到下依次为:\n\n1.面包屑:\n运维管理-车辆管理\n\n2.筛选:\n2.1.运营城市:地区选择器,支持省-市2级地区选择;\n2.2.车辆类型:选择器,根据车辆类型表拉取;\n2.3.品牌:选择器,根据型号参数表拉取品牌字段;\n2.4.型号:选择器,根据型号参数表拉取型号字段;\n2.5.客户名称:选择器,根据租赁合同/自营合同对应客户名称拉取,并包含无;\n2.6.归属业务部门:选择器,根据租赁合同/自营合同对应归属业务部门拉取,并包含无;\n2.7.合同编号:选择器,支持输入框内输入内容模糊匹配选项;\n2.8.登记所有权:选择器,支持输入框内输入内容模糊匹配选项;\n\n3.列表:\n列表左上角为车牌号筛选框,输入车牌号可快速筛选列表内记录;右侧按钮为导出(联动多选)、批量导入,字段依次为运营城市、车辆识别代号、车牌号、车辆编号、车辆类型、品牌、型号、车身颜色、归属停车场、客户名称、业务部门、业务负责人、运营状态、车辆状态、出库状态、证照状态、保险状态、登记所有权、在线状态、出厂年份、行驶公里数、采购入库时间、行驶证注册日期、行驶证检验有效期、上次交车时间、上次交车里程(KM)、上次还车时间、上次还车里程(KM)、强制报废日期、合同编号、当前位置、GPS最后上传时间、操作;\n(状态字段规则见《车辆状态》脑图:原库位/整备/过户/维修/报废等维度合并为「车辆状态」;「出库状态」仅保留三方退租出库、销售出库、报废出库、无。)\n\n3.1.运营城市:列固定在左侧,车辆实际运营城市,通过GPS当前位置获取,只显示至省-市2级;\n3.2.车辆识别代号:列固定在左侧,显示车辆识别代号(VIN码),为唯一值,采购、外部租赁等方式录入的车架号与系统现有车架号不能重复,导入亦然;\n3.3.车牌号:列固定在左侧,显示车牌号,主要通过上牌管理功能录入;\n3.4.车辆编号:显示车辆编号,主要由旧版迁移数据获取(这批车在港口需要单独以编号记录),其他车辆无此需求;\n3.5.车辆类型:显示车辆对应车辆类型,由车辆类型表中获取;\n3.6.品牌:显示车辆对应品牌,由型号参数表-品牌字段获取;\n3.7.型号:显示车辆对应型号,由型号参数表-型号字段获取;\n3.8.车身颜色:显示车辆对应颜色,由用户采购/外部租赁车辆合同时填写车身颜色(旧版迁移数据)字段获取;\n3.9.归属停车场:显示车辆归属停车场,交车出去租赁给客户的车辆显示为-,还车或发生异动时,根据运维记录,记录最后停放的停车场,停车场从停车场表中获取;\n3.10.客户名称:显示车辆租赁/自营合同发生时,该合同对应客户名称;\n3.11.业务部门:显示车辆租赁/自营合同发生时,该合同对应业务部门;\n3.12.业务负责人:显示车辆租赁/自营合同发生时,该合同对应业务负责人;\n3.13.运营状态:租赁、自营、可运营、待运营、退出运营(用以界定车辆当前业务情况);\n3.14.车辆状态:合并展示原库位/整备/在途业务等,枚举含待验车、未备车、已备车、待交车、已交车、待还车、销售中、替换中、调拨中、异动中、三方退租中、无等;不含等待验车功能上线、呆滞车、过户中、报废中、维修中(用以界定用户可见的车辆资产状态);\n3.15.出库状态:三方退租出库、销售出库、报废出库、无;\n3.16.证照状态:正常、异常、无(退出运营车辆可为无);\n3.17.保险状态:正常、异常(交强险/商业险缺失或过期等);\n3.18.登记所有权:行驶证对应所有人;\n3.19.在线状态:分为在线、离线,显示GPS在线状态,根据实际对接设备取状态;\n3.20.出厂年份:格式为YYYY,根据车辆采购合同时记录的出厂年份获取;\n3.21.行驶公里数(KM):精确至2位小数,根据最近一次交车/还车/备车/异动/调拨记录时记录的行驶公里数获取;\n3.22.采购入库时间:格式为YYYY-MM-DD,根据采购合同时,采购完成车辆验车单提交时的时间;\n3.23.行驶证注册日期:格式为YYYY-MM-DD,根据上牌管理中,最后一次上传行驶证时的行驶证注册日期获取;\n3.24.行驶证检验有效期:根据行驶证(副联)中,检验记录中检验有效期获取;\n3.25.上次交车时间:格式为YYYY-MM-DD,根据最近一次交车记录完成时间获取;\n3.26.上次交车里程(KM):精确至2位小数,根据最近一次交车记录中记录的里程获取;\n3.27.上次还车日期:格式为YYYY-MM-DD,根据最近一次还车记录完成时间获取;\n3.28.上次还车里程(KM):精确至2位小数,根据最近一次还车记录中记录的里程获取;\n3.29.强制报废日期:格式为YYYY-MM-DD,根据行驶证(副联)中强制报废期获取;\n3.30.合同编号:显示当前租赁/自营合同合同编号,如无则显示为-;\n3.31.当前位置:根据车辆GPS当前定位获取,格式为xxx省xx市xx区/县xxxxx路xxxxx号xxxxxx\n3.32.GPS最后上传时间:格式为YYYY-MM-DD HH:MM,显示车辆GPS最后一次获取时间\n3.33.操作:操作列固定在右侧,显示查看、更多,悬浮更多时,显示车辆上牌、车辆过户、车辆异动、车辆调拨、车辆报废、车辆年审、车辆出售、故障提报;\n3.33.1.查看,点击跳转车辆详情页;\n3.34.2.车辆上牌,点击后上传照片,OCR识别过程中卡片提示:识别中,请勿关闭页面,之后弹出卡片,标题为确认上牌信息,左侧为行驶证照片,右侧为车辆识别代号(输入框,根据行驶证照片反写,可编辑)与车牌号(输入框,根据行驶证照片反写,可编辑),下侧为取消和确认按钮,点击确认,判断车辆识别代码与车牌号是否一致,如不一致提示车辆识别代号与该车辆不匹配,如一致则更新车牌号和行驶证照片(具体参考车辆业务-上牌管理);\n3.34.3.车辆过户:\n3.34.4.车辆异动:\n3.34.5.车辆调拨:\n3.34.6.车辆报废:\n3.34.7.车辆年审:\n3.34.8.车辆出售;\n3.34.9.故障提报:'; + var requirementText = '# 车辆管理\n一个「车辆资产管理」后台的「车辆管理」模块,功能从上到下依次为:\n\n1.面包屑:\n运维管理-车辆管理\n\n2.筛选:\n2.1.运营城市:地区选择器,支持省-市2级地区选择;\n2.2.车辆类型:选择器,根据车辆类型表拉取;\n2.3.品牌:选择器,根据型号参数表拉取品牌字段;\n2.4.型号:选择器,根据型号参数表拉取型号字段;\n2.5.客户名称:选择器,根据租赁合同/自营合同对应客户名称拉取,并包含无;\n2.6.归属业务部门:选择器,根据租赁合同/自营合同对应归属业务部门拉取,并包含无;\n2.7.合同编号:选择器,支持输入框内输入内容模糊匹配选项;\n2.8.登记所有权:选择器,支持输入框内输入内容模糊匹配选项;\n2.9.运营公司:选择器,根据集团内运营公司维护,支持模糊搜索;批量导入时模板含该列则直接导入;\n2.10.车辆来源:选择器,选项为:自有、外租、挂靠;\n2.11.租赁公司:选择器,支持模糊搜索;批量导入时模板含该列则直接导入;\n\n3.列表:\n列表左上角为车牌号筛选框,输入车牌号可快速筛选列表内记录;右侧按钮为导出(联动多选)、批量导入,字段依次为运营城市、车辆识别代号、车牌号、车辆编号、车辆类型、品牌、型号、车身颜色、归属停车场、客户名称、业务部门、业务负责人、运营状态、车辆状态、出库状态、证照状态、保险状态、登记所有权、运营公司、车辆来源、租赁公司、在线状态、出厂年份、行驶公里数、采购入库时间、行驶证注册日期、行驶证检验有效期、上次交车时间、上次交车里程(KM)、上次还车时间、上次还车里程(KM)、强制报废日期、合同编号、当前位置、GPS最后上传时间、操作;\n(状态字段规则见《车辆状态》脑图:原库位/整备/过户/维修/报废等维度合并为「车辆状态」;「出库状态」仅保留三方退租出库、销售出库、报废出库、无。)\n\n3.1.运营城市:列固定在左侧,车辆实际运营城市,通过GPS当前位置获取,只显示至省-市2级;\n3.2.车辆识别代号:列固定在左侧,显示车辆识别代号(VIN码),为唯一值,采购、外部租赁等方式录入的车架号与系统现有车架号不能重复,导入亦然;\n3.3.车牌号:列固定在左侧,显示车牌号,主要通过上牌管理功能录入;\n3.4.车辆编号:显示车辆编号,主要由旧版迁移数据获取(这批车在港口需要单独以编号记录),其他车辆无此需求;\n3.5.车辆类型:显示车辆对应车辆类型,由车辆类型表中获取;\n3.6.品牌:显示车辆对应品牌,由型号参数表-品牌字段获取;\n3.7.型号:显示车辆对应型号,由型号参数表-型号字段获取;\n3.8.车身颜色:显示车辆对应颜色,由用户采购/外部租赁车辆合同时填写车身颜色(旧版迁移数据)字段获取;\n3.9.归属停车场:显示车辆归属停车场,交车出去租赁给客户的车辆显示为-,还车或发生异动时,根据运维记录,记录最后停放的停车场,停车场从停车场表中获取;\n3.10.客户名称:显示车辆租赁/自营合同发生时,该合同对应客户名称;\n3.11.业务部门:显示车辆租赁/自营合同发生时,该合同对应业务部门;\n3.12.业务负责人:显示车辆租赁/自营合同发生时,该合同对应业务负责人;\n3.13.运营状态:租赁、自营、可运营、待运营、退出运营(用以界定车辆当前业务情况);\n3.14.车辆状态:合并展示原库位/整备/在途业务等,枚举含待验车、未备车、已备车、待交车、已交车、待还车、销售中、替换中、调拨中、异动中、三方退租中、无等;不含等待验车功能上线、呆滞车、过户中、报废中、维修中(用以界定用户可见的车辆资产状态);\n3.15.出库状态:三方退租出库、销售出库、报废出库、无;\n3.16.证照状态:正常、异常、无(退出运营车辆可为无);\n3.17.保险状态:正常、异常(交强险/商业险缺失或过期等);\n3.18.登记所有权:行驶证对应所有人;\n3.19.运营公司:用于界定归属集团哪个公司运营,数据可来自手工维护或批量导入直接写入;\n3.20.车辆来源:分为:自有、外租、挂靠;\n3.21.租赁公司:车辆关联的租赁公司等信息,无则显示为-;可来自批量导入直接写入;\n3.22.在线状态:分为在线、离线,显示GPS在线状态,根据实际对接设备取状态;\n3.23.出厂年份:格式为YYYY,根据车辆采购合同时记录的出厂年份获取;\n3.24.行驶公里数(KM):精确至2位小数,根据最近一次交车/还车/备车/异动/调拨记录时记录的行驶公里数获取;\n3.25.采购入库时间:格式为YYYY-MM-DD,根据采购合同时,采购完成车辆验车单提交时的时间;\n3.26.行驶证注册日期:格式为YYYY-MM-DD,根据上牌管理中,最后一次上传行驶证时的行驶证注册日期获取;\n3.27.行驶证检验有效期:根据行驶证(副联)中,检验记录中检验有效期获取;\n3.28.上次交车时间:格式为YYYY-MM-DD,根据最近一次交车记录完成时间获取;\n3.29.上次交车里程(KM):精确至2位小数,根据最近一次交车记录中记录的里程获取;\n3.30.上次还车日期:格式为YYYY-MM-DD,根据最近一次还车记录完成时间获取;\n3.31.上次还车里程(KM):精确至2位小数,根据最近一次还车记录中记录的里程获取;\n3.32.强制报废日期:格式为YYYY-MM-DD,根据行驶证(副联)中强制报废期获取;\n3.33.合同编号:显示当前租赁/自营合同合同编号,如无则显示为-;\n3.34.当前位置:根据车辆GPS当前定位获取,格式为xxx省xx市xx区/县xxxxx路xxxxx号xxxxxx\n3.35.GPS最后上传时间:格式为YYYY-MM-DD HH:MM,显示车辆GPS最后一次获取时间\n3.36.操作:操作列固定在右侧,显示查看、更多,悬浮更多时,显示车辆上牌、车辆过户、车辆异动、车辆调拨、车辆报废、车辆年审、车辆出售、故障提报;\n3.36.1.查看,点击跳转车辆详情页;\n3.36.2.车辆上牌,点击后上传照片,OCR识别过程中卡片提示:识别中,请勿关闭页面,之后弹出卡片,标题为确认上牌信息,左侧为行驶证照片,右侧为车辆识别代号(输入框,根据行驶证照片反写,可编辑)与车牌号(输入框,根据行驶证照片反写,可编辑),下侧为取消和确认按钮,点击确认,判断车辆识别代码与车牌号是否一致,如不一致提示车辆识别代号与该车辆不匹配,如一致则更新车牌号和行驶证照片(具体参考车辆业务-上牌管理);\n3.36.3.车辆过户:\n3.36.4.车辆异动:\n3.36.5.车辆调拨:\n3.36.6.车辆报废:\n3.36.7.车辆年审:\n3.36.8.车辆出售;\n3.36.9.故障提报:'; return React.createElement(App, null, React.createElement('div', { style: layoutStyle }, @@ -530,9 +555,12 @@ const Component = function () { React.createElement('div', { key: 'customer', style: filterItemStyle }, React.createElement('div', { style: filterLabelStyle }, '客户名称'), React.createElement(Select, { placeholder: '请选择', style: filterControlStyle, options: customerOptions, value: _customer[0], onChange: _customer[1], allowClear: true })), React.createElement('div', { key: 'dept', style: filterItemStyle }, React.createElement('div', { style: filterLabelStyle }, '归属业务部门'), React.createElement(Select, { placeholder: '请选择', style: filterControlStyle, options: departmentOptions, value: _department[0], onChange: _department[1], allowClear: true })), React.createElement('div', { key: 'contract', style: filterItemStyle }, React.createElement('div', { style: filterLabelStyle }, '合同编号'), React.createElement(Select, { placeholder: '请选择', style: filterControlStyle, options: contractOptions, value: _contractNo[0], onChange: _contractNo[1], allowClear: true, showSearch: true, filterOption: function (input, opt) { return (opt.label || '').toString().toLowerCase().indexOf((input || '').toLowerCase()) !== -1; } })), - React.createElement('div', { key: 'ownership', style: filterItemStyle }, React.createElement('div', { style: filterLabelStyle }, '登记所有权'), React.createElement(Select, { placeholder: '请选择', style: filterControlStyle, options: ownershipOptions, value: _ownership[0], onChange: _ownership[1], allowClear: true, showSearch: true, filterOption: function (input, opt) { return (opt.label || '').toString().toLowerCase().indexOf((input || '').toLowerCase()) !== -1; } })) + React.createElement('div', { key: 'ownership', style: filterItemStyle }, React.createElement('div', { style: filterLabelStyle }, '登记所有权'), React.createElement(Select, { placeholder: '请选择', style: filterControlStyle, options: ownershipOptions, value: _ownership[0], onChange: _ownership[1], allowClear: true, showSearch: true, filterOption: function (input, opt) { return (opt.label || '').toString().toLowerCase().indexOf((input || '').toLowerCase()) !== -1; } })), + React.createElement('div', { key: 'operateCompany', style: filterItemStyle }, React.createElement('div', { style: filterLabelStyle }, '运营公司'), React.createElement(Select, { placeholder: '请选择', style: filterControlStyle, options: operateCompanyOptions, value: _operateCompany[0], onChange: _operateCompany[1], allowClear: true, showSearch: true, filterOption: function (input, opt) { return (opt.label || '').toString().toLowerCase().indexOf((input || '').toLowerCase()) !== -1; } })), + React.createElement('div', { key: 'vehicleSource', style: filterItemStyle }, React.createElement('div', { style: filterLabelStyle }, '车辆来源'), React.createElement(Select, { placeholder: '请选择', style: filterControlStyle, options: vehicleSourceOptions, value: _vehicleSource[0], onChange: _vehicleSource[1], allowClear: true })), + React.createElement('div', { key: 'leaseCompany', style: filterItemStyle }, React.createElement('div', { style: filterLabelStyle }, '租赁公司'), React.createElement(Select, { placeholder: '请选择', style: filterControlStyle, options: leaseCompanyOptions, value: _leaseCompany[0], onChange: _leaseCompany[1], allowClear: true, showSearch: true, filterOption: function (input, opt) { return (opt.label || '').toString().toLowerCase().indexOf((input || '').toLowerCase()) !== -1; } })) ]; - var limit = _filterExpanded[0] ? 8 : 6; + var limit = _filterExpanded[0] ? 11 : 6; var out = []; for (var i = 0; i < limit && i < filterItems.length; i++) { out.push(filterItems[i]); @@ -550,6 +578,9 @@ const Component = function () { _department[1](undefined); _contractNo[1](undefined); _ownership[1](undefined); + _operateCompany[1](undefined); + _vehicleSource[1](undefined); + _leaseCompany[1](undefined); } }, '重置'), React.createElement(Button, { type: 'link', size: 'small', onClick: function () { _filterExpanded[1](!_filterExpanded[0]); } }, _filterExpanded[0] ? '收起' : '展开') ) @@ -579,7 +610,7 @@ const Component = function () { columns: columns, dataSource: dataSource, rowSelection: rowSelection, - scroll: { x: 3400 }, + scroll: { x: 4020 }, size: 'small', pagination: { showSizeChanger: true, showQuickJumper: true, showTotal: function (t) { return '共 ' + t + ' 条'; } } }) diff --git a/web端/需求说明/财务管理/提车应收款-提车收款单-编辑 b/web端/需求说明/财务管理/提车应收款-提车收款单-编辑 index 58e8aa6..1ba28da 100644 --- a/web端/需求说明/财务管理/提车应收款-提车收款单-编辑 +++ b/web端/需求说明/财务管理/提车应收款-提车收款单-编辑 @@ -18,7 +18,7 @@ 2.提车应收款信息: #上方显示应收款总额、实收款总额; -2.1.应收款总额:格式为:xx.xx元,重点色,计算方式为:「选中车辆应收车辆月租金总和」+「选中车辆应收车辆保证金总和」+「选中车辆应收服务费总和」; +2.1.应收款总额:格式为:xx.xx元,重点色,计算方式为:「选中车辆应收车辆月租金总和」+「选中车辆应收车辆保证金总和」+「选中车辆应收服务费总和」+「氢费预充值应收金额」; 点击应收款总额金额,弹出气泡卡片,气泡卡片列表展示:项目、金额; 2.1.1.项目:包括总计应收车辆月租金、总计应收车辆保证金、总计应收服务费三项; 2.1.2.金额:显示该项目对应应收金额;