From 3360dc785ebf87f5f5ee47608ce9a65f004311b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=86=95?= Date: Thu, 19 Mar 2026 11:54:44 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=90=E7=BB=B4/=E8=B4=A2=E5=8A=A1=EF=BC=9A?= =?UTF-8?q?=E8=BF=98=E8=BD=A6=E5=BA=94=E7=BB=93=E6=AC=BE=E5=88=86=E9=92=9F?= =?UTF-8?q?=E7=BA=A7=E6=97=B6=E9=97=B4=E4=B8=8E=E8=B4=B9=E7=94=A8=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E4=BA=A4=E4=BA=92=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 还车应结款/查看/费用明细:交车/还车时间统一显示到分钟 - 待审批与审批中状态操作列支持撤回 - 费用明细:已收租金可编辑、预付款退费展示最后一辆车提示、证件丢失费用可编辑 - 同步更新相关需求说明文案 Made-with: Cursor --- web端/财务管理/还车应结款-查看.jsx | 24 ++++++-- web端/财务管理/还车应结款-费用明细.jsx | 52 +++++++++++++---- web端/财务管理/还车应结款.jsx | 56 ++++++++++++------- .../运维管理/车辆业务/交车管理-交车单-编辑.jsx | 6 +- web端/需求说明/财务管理/还车应结款 | 6 +- web端/需求说明/财务管理/还车应结款-费用明细 | 10 ++-- .../运维管理-车务管理/交车管理-交车单-编辑 | 2 +- 7 files changed, 110 insertions(+), 46 deletions(-) diff --git a/web端/财务管理/还车应结款-查看.jsx b/web端/财务管理/还车应结款-查看.jsx index f89f4d5..c156da7 100644 --- a/web端/财务管理/还车应结款-查看.jsx +++ b/web端/财务管理/还车应结款-查看.jsx @@ -28,6 +28,22 @@ const Component = function () { return n.toFixed(2); } + function fmtYMDHM(v) { + if (v === null || v === undefined) return '-'; + var s = String(v).trim(); + if (!s) return '-'; + if (/^\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}/.test(s)) return s.slice(0, 16); + if (/^\d{4}-\d{2}-\d{2}$/.test(s)) return s + ' 00:00'; + try { + var d = new Date(s.replace(/-/g, '/')); + if (isNaN(d.getTime())) return s; + var p2 = function (n) { return n < 10 ? '0' + n : '' + n; }; + return d.getFullYear() + '-' + p2(d.getMonth() + 1) + '-' + p2(d.getDate()) + ' ' + p2(d.getHours()) + ':' + p2(d.getMinutes()); + } catch (e) { + return s; + } + } + // 页面样式 var layoutStyle = { padding: '16px 24px 72px', background: '#f5f5f5', minHeight: '100vh' }; var cardStyle = { marginBottom: 16 }; @@ -41,8 +57,8 @@ const Component = function () { contractCode: 'LNZLHT20251106001', projectName: '嘉兴腾4.5T租赁', customerName: '嘉兴某某物流有限公司', - deliveryTime: '2026-02-01', - returnTime: '2026-02-27', + deliveryTime: '2026-02-01 09:30', + returnTime: '2026-02-27 16:20', fragileInsurance: '是', tireInsurance: '否', maintenanceInsurance: '是' @@ -268,8 +284,8 @@ const Component = function () { { title: '合同编码', dataIndex: 'contractCode', key: 'contractCode', width: 160, ellipsis: true }, { title: '项目名称', dataIndex: 'projectName', key: 'projectName', width: 140, ellipsis: true }, { title: '客户名称', dataIndex: 'customerName', key: 'customerName', width: 140, ellipsis: true }, - { title: '交车时间', dataIndex: 'deliveryTime', key: 'deliveryTime', width: 110 }, - { title: '还车时间', dataIndex: 'returnTime', key: 'returnTime', width: 110 }, + { title: '交车时间', dataIndex: 'deliveryTime', key: 'deliveryTime', width: 160, render: function (v) { return fmtYMDHM(v); } }, + { title: '还车时间', dataIndex: 'returnTime', key: 'returnTime', width: 160, render: function (v) { return fmtYMDHM(v); } }, { title: '易损保', dataIndex: 'fragileInsurance', key: 'fragileInsurance', width: 110, render: function (v) { diff --git a/web端/财务管理/还车应结款-费用明细.jsx b/web端/财务管理/还车应结款-费用明细.jsx index 65beb42..5410785 100644 --- a/web端/财务管理/还车应结款-费用明细.jsx +++ b/web端/财务管理/还车应结款-费用明细.jsx @@ -34,6 +34,22 @@ const Component = function () { return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()) + ' ' + pad(d.getHours()) + ':' + pad(d.getMinutes()); } + function fmtYMDHM(v) { + if (v === null || v === undefined) return '-'; + var s = String(v).trim(); + if (!s) return '-'; + if (/^\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}/.test(s)) return s.slice(0, 16); + if (/^\d{4}-\d{2}-\d{2}$/.test(s)) return s + ' 00:00'; + try { + var d = new Date(s.replace(/-/g, '/')); + if (isNaN(d.getTime())) return s; + var p2 = function (n) { return n < 10 ? '0' + n : '' + n; }; + return d.getFullYear() + '-' + p2(d.getMonth() + 1) + '-' + p2(d.getDate()) + ' ' + p2(d.getHours()) + ':' + p2(d.getMinutes()); + } catch (e) { + return s; + } + } + function toFixed2(v) { if (v === null || v === undefined || v === '') return ''; var n = typeof v === 'number' ? v : parseFloat(v); @@ -53,8 +69,8 @@ const Component = function () { contractCode: 'LNZLHT20251106001', projectName: '嘉兴腾4.5T租赁', customerName: '嘉兴某某物流有限公司', - deliveryTime: '2026-02-01', - returnTime: '2026-02-27', + deliveryTime: '2026-02-01 09:30', + returnTime: '2026-02-27 16:20', fragileInsurance: '是', tireInsurance: '否', maintenanceInsurance: '是' @@ -70,6 +86,11 @@ const Component = function () { }; }, [vehicleDetail]); + // 原型判断:当前合同仅展示 1 辆车,则视为“最后一辆车还车” + var isLastVehicleInContract = useMemo(function () { + return (vehicleDetail || []).length === 1; + }, [vehicleDetail]); + // 费用统计 var statsState = useState({ depositAmount: '5000.00', @@ -386,7 +407,7 @@ const Component = function () { setOperationRows(function (p) { var next = p.map(function (r) { var n = {}; for (var k in r) n[k] = r[k]; - if (n.feeItem === '证件丢失费用') n.amount = operationAuto.docLossFee; + if (n.feeItem === '证件丢失费用' && !String(n.amount || '').trim()) n.amount = operationAuto.docLossFee; if (n.feeItem === '送车服务费') n.amount = operationAuto.deliveryServiceFee; if (n.feeItem === '接车服务费') n.amount = operationAuto.receiveServiceFee; if (n.feeItem === '轮胎磨损费用' && !String(n.amount || '').trim()) n.amount = operationAuto.tireWearFee; @@ -647,7 +668,7 @@ var requirementDocContent = useMemo(function () { 4.13.附件:附件上传按钮,文案为:上传附件,支持多个附件; 4.14.操作:除固定费用项外,其余操作中为删除; 列表下方为车辆租金:包含本期账单已收租金、车辆实际租金、车辆应退租金; -4.15.本期账单已收租金:输入框(禁用),反写本期账单实际到账租金(从租赁账单中,首期由于未和用友YS打通,先显示为0,对接完成后显示财务实际到账金额); +4.15.本期账单已收租金:输入框(可编辑),反写本期账单该车辆实收款租金金额(后期与用友YS打通后,显示财务到账金额) 4.16.车辆实际租金:输入框(可编辑),自动计算车辆实际租金,按照:(车辆月租金/30)*(账单开始日期-还车日期总天数,取整) 4.17.车辆应退租金:输入框(可编辑),根据:本期账单已收租金-车辆实际租金计算并反写; @@ -664,7 +685,7 @@ var requirementDocContent = useMemo(function () { 5.9.还车氢量:格式为:xx.xxMPa,保留2位小数,从该车辆交车在该合同还车时间氢量获取; 5.10.退还车氢气单价:xx.xx元,从车辆租赁合同中获取; 5.11.能源费补缴金额:右侧为2个输入框,分别为氢费补缴金额、电费补缴金额,支持2位小数,后缀为元; -5.12.预付款退费金额:输入框,支持2位小数,后缀为元;输入框下方显示项目预充值余额; +5.12.预付款退费金额:输入框,支持2位小数,后缀为元;输入框下方显示项目预充值余额,如果当前租赁合同已是最后一辆车还车,则输入框右侧加红提示:当前车辆为该合同最后一辆车; 6.运维部:仅由运维部人员进行填写;标题栏标题为运维部,后方为总金额、提交人、状态(待提交、已提交),该部分只有运维部能查看; 6.1.总金额:显示运维部所有费用项费用金额总额; @@ -717,8 +738,8 @@ var requirementDocContent = useMemo(function () { { title: '合同编码', dataIndex: 'contractCode', key: 'contractCode', width: 160, ellipsis: true }, { title: '项目名称', dataIndex: 'projectName', key: 'projectName', width: 140, ellipsis: true }, { title: '客户名称', dataIndex: 'customerName', key: 'customerName', width: 140, ellipsis: true }, - { title: '交车时间', dataIndex: 'deliveryTime', key: 'deliveryTime', width: 110 }, - { title: '还车时间', dataIndex: 'returnTime', key: 'returnTime', width: 110 }, + { title: '交车时间', dataIndex: 'deliveryTime', key: 'deliveryTime', width: 160, render: function (v) { return fmtYMDHM(v); } }, + { title: '还车时间', dataIndex: 'returnTime', key: 'returnTime', width: 160, render: function (v) { return fmtYMDHM(v); } }, { title: '易损保', dataIndex: 'fragileInsurance', key: 'fragileInsurance', width: 110, render: function (v) { @@ -921,7 +942,7 @@ var requirementDocContent = useMemo(function () { var readOnly = meta.status === '已提交'; var fee = r && r.feeItem; var disabled = readOnly; - if (fee === '送车服务费' || fee === '接车服务费' || fee === '证件丢失费用') disabled = true; + if (fee === '送车服务费' || fee === '接车服务费') disabled = true; return React.createElement(Input, { value: v, onChange: function (e) { ref.updateOperationRow(r.key, 'amount', e.target.value); }, placeholder: '0.00', addonAfter: '元', disabled: disabled }); } }, @@ -1130,7 +1151,13 @@ return React.createElement('div', { style: layoutStyle }, React.createElement('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(3, minmax(0, 1fr))', gap: 12 } }, React.createElement('div', null, React.createElement('div', { style: { fontSize: 12, color: '#666', marginBottom: 6 } }, '本期账单已收租金'), - React.createElement(Input, { value: billInfo.receivedRent, addonAfter: '元', disabled: true }) + React.createElement(Input, { + value: billInfo.receivedRent, + onChange: function (e) { var v = e.target.value; setBillInfo(function (p) { var n = {}; for (var k in p) n[k] = p[k]; n.receivedRent = v; return n; }); }, + placeholder: '0.00', + addonAfter: '元', + disabled: businessServiceMeta.status === '已提交' + }) ), React.createElement('div', null, React.createElement('div', { style: { fontSize: 12, color: '#666', marginBottom: 6 } }, RequiredLabel('车辆实际租金')), @@ -1218,7 +1245,12 @@ return React.createElement('div', { style: layoutStyle }, React.createElement('div', { style: { marginBottom: 8, fontWeight: 500 } }, RequiredLabel('预付款退费金额')), React.createElement('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: 12 } }, React.createElement('div', null, - React.createElement(Input, { value: energy.prepayRefund, onChange: function (e) { setEnergy(function (p) { var n = {}; for (var k in p) n[k] = p[k]; n.prepayRefund = e.target.value; return n; }); }, placeholder: '0.00', addonAfter: '元', style: { width: '100%' }, disabled: energyMeta.status === '已提交' }) + React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 12 } }, + React.createElement('div', { style: { flex: 1, minWidth: 0 } }, + React.createElement(Input, { value: energy.prepayRefund, onChange: function (e) { setEnergy(function (p) { var n = {}; for (var k in p) n[k] = p[k]; n.prepayRefund = e.target.value; return n; }); }, placeholder: '0.00', addonAfter: '元', style: { width: '100%' }, disabled: energyMeta.status === '已提交' }) + ), + isLastVehicleInContract ? React.createElement('span', { style: { color: '#f5222d', fontSize: 12, fontWeight: 600, whiteSpace: 'nowrap' } }, '当前车辆为该合同最后一辆车') : null + ) ), React.createElement('div', null), React.createElement('div', null), diff --git a/web端/财务管理/还车应结款.jsx b/web端/财务管理/还车应结款.jsx index 1e75acf..36b5728 100644 --- a/web端/财务管理/还车应结款.jsx +++ b/web端/财务管理/还车应结款.jsx @@ -27,6 +27,22 @@ var message = antd.message; return dd.getFullYear() + '-' + p2(dd.getMonth() + 1) + '-' + p2(dd.getDate()); } + function fmtYMDHM(v) { + if (v === null || v === undefined) return '-'; + var s = String(v).trim(); + if (!s) return '-'; + if (/^\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}/.test(s)) return s.slice(0, 16); + if (/^\d{4}-\d{2}-\d{2}$/.test(s)) return s + ' 00:00'; + try { + var d = new Date(s.replace(/-/g, '/')); + if (isNaN(d.getTime())) return s; + var p2 = function (n) { return n < 10 ? '0' + n : '' + n; }; + return d.getFullYear() + '-' + p2(d.getMonth() + 1) + '-' + p2(d.getDate()) + ' ' + p2(d.getHours()) + ':' + p2(d.getMinutes()); + } catch (e) { + return s; + } + } + function fmtMoney(v) { var n = typeof v === 'number' ? v : parseFloat(v); if (isNaN(n)) n = 0; @@ -83,8 +99,8 @@ var message = antd.message; plateNo: '粤AGP5621', businessDept: '业务一部', businessOwner: '张经理', - deliveryTime: '2026-02-01', - returnTime: '2026-02-27', + deliveryTime: '2026-02-01 09:30', + returnTime: '2026-02-27 16:20', returnPerson: '陈还车' }, { @@ -100,8 +116,8 @@ var message = antd.message; plateNo: '浙F03218F', businessDept: '业务二部', businessOwner: '李主管', - deliveryTime: '2026-01-10', - returnTime: '2026-02-20', + deliveryTime: '2026-01-10 10:00', + returnTime: '2026-02-20 18:05', returnPerson: '周还车' }, { @@ -117,8 +133,8 @@ var message = antd.message; plateNo: '京A29256F', businessDept: '业务三部', businessOwner: '王总', - deliveryTime: '2025-08-01', - returnTime: '2026-02-02', + deliveryTime: '2025-08-01 08:30', + returnTime: '2026-02-02 11:15', returnPerson: '刘还车' }, { @@ -134,8 +150,8 @@ var message = antd.message; plateNo: '苏E8K2P1', businessDept: '业务一部', businessOwner: '张经理', - deliveryTime: '2026-02-15', - returnTime: '2026-02-26', + deliveryTime: '2026-02-15 13:40', + returnTime: '2026-02-26 09:10', returnPerson: '孙还车' }, { @@ -342,14 +358,14 @@ var requirementDocContent = useMemo(function () { 2.6.车牌号:显示合同对应车牌号; 2.7.业务部门:显示合同对应业务部门; 2.8.业务负责人:显示合同对应业务负责人; -2.9.交车时间:显示该车辆交车时间; -2.10.还车时间:显示该车辆还车时间; +2.9.交车时间:显示该车辆交车时间,格式为:YYYY-MM-DD HH:MM; +2.10.还车时间:显示该车辆还车时间,格式为:YYYY-MM-DD HH:MM; 2.11.还车人:显示该车辆还车人姓名; 2.12.操作:查看、生成账单、费用明细、撤回; 2.12.1.查看:点击跳转还车应结款-查看页面; 2.12.2.生成账单:点击生成账单,弹框显示账单界面,审批状态为待审批的记录才可生成账单,其他状态生成账单隐藏; 2.12.3.费用明细:点击跳转还车应结款-费用明细页面,审批状态为待审批、审批中、审批完成时,不显示费用明细; - 2.12.4.撤回:审批状态为审批中时,不显示费用明细点击二次确认,提示:是否确认撤回,点击确定后,提示:撤回成功,同时审批状态修改为撤回; + 2.12.4.撤回:审批状态为待审批、审批中时,不显示费用明细点击二次确认,提示:是否确认撤回,点击确定后,提示:撤回成功,同时审批状态修改为撤回; 2.13.右下角为分页符,支持单页查看数据条数; `); }, []); @@ -358,8 +374,8 @@ var requirementDocContent = useMemo(function () { var row = billRowState[0] || (filteredData && filteredData[0]) || (tableDataAll && tableDataAll[0]) || {}; var customerName = row.customerName || '广州毅斌物流有限公司'; var plateNo = row.plateNo || '粤AGP6579'; - var deliveryTime = row.deliveryTime || '2025-07-21'; - var returnTime = row.returnTime || '2025-10-01'; + var deliveryTime = fmtYMDHM(row.deliveryTime || '2025-07-21 00:00'); + var returnTime = fmtYMDHM(row.returnTime || '2025-10-01 00:00'); var billDate = fmtYMD(new Date()); var feeRows = [ @@ -509,8 +525,8 @@ var requirementDocContent = useMemo(function () { { title: '车牌号', dataIndex: 'plateNo', key: 'plateNo', width: 110 }, { title: '业务部门', dataIndex: 'businessDept', key: 'businessDept', width: 110 }, { title: '业务负责人', dataIndex: 'businessOwner', key: 'businessOwner', width: 110 }, - { title: '交车时间', dataIndex: 'deliveryTime', key: 'deliveryTime', width: 110 }, - { title: '还车时间', dataIndex: 'returnTime', key: 'returnTime', width: 110 }, + { title: '交车时间', dataIndex: 'deliveryTime', key: 'deliveryTime', width: 160, render: function (v) { return fmtYMDHM(v); } }, + { title: '还车时间', dataIndex: 'returnTime', key: 'returnTime', width: 160, render: function (v) { return fmtYMDHM(v); } }, { title: '还车人', dataIndex: 'returnPerson', key: 'returnPerson', width: 110 }, { title: '操作', @@ -520,7 +536,7 @@ var requirementDocContent = useMemo(function () { render: function (_, r) { var st = String(r && r.approvalStatus); var showFeeDetail = !(st === '待审批' || st === '审批中' || st === '审批完成'); - var showRevoke = String(r && r.approvalStatus) === '审批中'; + var showRevoke = (st === '待审批' || st === '审批中'); var showGenerateBill = String(r && r.approvalStatus) === '待审批'; return React.createElement('span', { style: { display: 'inline-flex', alignItems: 'center', gap: 8 } }, React.createElement(Button, { type: 'link', size: 'small', onClick: function () { handleView(r); } }, '查看'), @@ -685,8 +701,8 @@ return React.createElement('div', { style: layoutStyle }, return React.createElement('tr', { key: 'fee-' + idx }, idx === 0 ? React.createElement('td', { rowSpan: rowspan, className: 't-center' }, String(billDetail.vehicle.seq || 1)) : null, idx === 0 ? React.createElement('td', { rowSpan: rowspan, className: 't-center' }, billDetail.vehicle.plateNo) : null, - idx === 0 ? React.createElement('td', { rowSpan: rowspan, className: 't-center' }, billDetail.vehicle.deliveryTime) : null, - idx === 0 ? React.createElement('td', { rowSpan: rowspan, className: 't-center' }, billDetail.vehicle.returnTime) : null, + idx === 0 ? React.createElement('td', { rowSpan: rowspan, className: 't-center' }, fmtYMDHM(billDetail.vehicle.deliveryTime)) : null, + idx === 0 ? React.createElement('td', { rowSpan: rowspan, className: 't-center' }, fmtYMDHM(billDetail.vehicle.returnTime)) : null, React.createElement('td', null, r.item), React.createElement('td', { className: 't-right' }, fmtMoney(r.amount)) ); @@ -1437,8 +1453,8 @@ var requirementDocContent = useMemo(function () { { title: '合同编码', dataIndex: 'contractCode', key: 'contractCode', width: 160, ellipsis: true }, { title: '项目名称', dataIndex: 'projectName', key: 'projectName', width: 140, ellipsis: true }, { title: '客户名称', dataIndex: 'customerName', key: 'customerName', width: 140, ellipsis: true }, - { title: '交车时间', dataIndex: 'deliveryTime', key: 'deliveryTime', width: 110 }, - { title: '还车时间', dataIndex: 'returnTime', key: 'returnTime', width: 110 }, + { title: '交车时间', dataIndex: 'deliveryTime', key: 'deliveryTime', width: 160, render: function (v) { return fmtYMDHM(v); } }, + { title: '还车时间', dataIndex: 'returnTime', key: 'returnTime', width: 160, render: function (v) { return fmtYMDHM(v); } }, { title: '易损保', dataIndex: 'fragileInsurance', key: 'fragileInsurance', width: 110, render: function (v) { diff --git a/web端/运维管理/车辆业务/交车管理-交车单-编辑.jsx b/web端/运维管理/车辆业务/交车管理-交车单-编辑.jsx index 6657c58..bb45328 100644 --- a/web端/运维管理/车辆业务/交车管理-交车单-编辑.jsx +++ b/web端/运维管理/车辆业务/交车管理-交车单-编辑.jsx @@ -266,7 +266,7 @@ function FormItem(props) { + '2.1.车辆类型:输入框(禁用),根据车牌号反写车辆类型;\n' + '2.2.品牌:输入框(禁用),根据车牌号反写品牌;\n' + '2.2.型号:输入框(禁用),根据车牌号反写型号;\n' - + '2.3.车牌号:选择器,输入框,支持输入内容下拉模糊匹配选项,仅能选择备车库中车辆;\n' + + '2.3.车牌号:选择器,输入框,支持输入内容下拉模糊匹配选项,选择车辆有3个判断条件,1.仅能选择备车库中该型号车辆 2.选择时判断商业险是否到期,到期则报错不让选;\n' + '2.4.车辆识别代码:输入框(禁用),根据车牌号反写车辆识别代码;\n' + '2.5.车身广告及放大字:必选项,开关,选择车辆后拉取该车辆「后装设备」「车身广告」,如果该车辆有「车身广告」则勾选为开,如果无则勾选为无。同时如果手动进行操作,会同步到「后装设备」「车身广告」中, 安装时间以该条备车记录提交成功为准,不够选择广告照片和放大字照片字段隐藏不显示;\n' + '2.6.广告照片:必填项,图片上传,最多支持上传1张图片,支持主流照片格式。上传后,上传按钮切换为显示已上传图片缩略图,支持点击预览和删除,删除后,切换为上传按钮,从备车记录自动反写;\n' @@ -292,10 +292,10 @@ function FormItem(props) { + '3.4.瑕疵:必填项,包括照片上传按钮,最多支持4张照片;\n' + '3.5.其他:必填项,包括照片上传按钮,最多支持4张照片;\n' + '照片点击上传,从本地文件上传单张图片,上传成功后可通过图片右上角删除按钮删除,点击图片可放大预览;\n\n' - + '4.底部为提交、保存、取消按钮;\n' + + '4.底部为提交、取消按钮;\n' + ' 4.1.提交:点击进行二次确认,点击确认完成该车辆交车;\n' + ' 4.2.保存:点击暂存交车单(不做校验);\n' - + ' 4.3.取消:点击返回交车单页;\n'; + + ' 4.2.取消:点击返回交车单页;\n'; var trainingInputRef = useRef(null); diff --git a/web端/需求说明/财务管理/还车应结款 b/web端/需求说明/财务管理/还车应结款 index 05de422..7260de6 100644 --- a/web端/需求说明/财务管理/还车应结款 +++ b/web端/需求说明/财务管理/还车应结款 @@ -24,12 +24,12 @@ 2.6.车牌号:显示合同对应车牌号; 2.7.业务部门:显示合同对应业务部门; 2.8.业务负责人:显示合同对应业务负责人; -2.9.交车时间:显示该车辆交车时间; -2.10.还车时间:显示该车辆还车时间; +2.9.交车时间:显示该车辆交车时间,格式为:YYYY-MM-DD HH:MM; +2.10.还车时间:显示该车辆还车时间,格式为:YYYY-MM-DD HH:MM; 2.11.还车人:显示该车辆还车人姓名; 2.12.操作:查看、生成账单、费用明细、撤回; 2.12.1.查看:点击跳转还车应结款-查看页面; 2.12.2.生成账单:点击生成账单,弹框显示账单界面,审批状态为待审批的记录才可生成账单,其他状态生成账单隐藏; 2.12.3.费用明细:点击跳转还车应结款-费用明细页面,审批状态为待审批、审批中、审批完成时,不显示费用明细; - 2.12.4.撤回:审批状态为审批中时,不显示费用明细点击二次确认,提示:是否确认撤回,点击确定后,提示:撤回成功,同时审批状态修改为撤回; + 2.12.4.撤回:审批状态为待审批、审批中时,不显示费用明细点击二次确认,提示:是否确认撤回,点击确定后,提示:撤回成功,同时审批状态修改为撤回; 2.13.右下角为分页符,支持单页查看数据条数; \ No newline at end of file diff --git a/web端/需求说明/财务管理/还车应结款-费用明细 b/web端/需求说明/财务管理/还车应结款-费用明细 index 33d10ab..20f466f 100644 --- a/web端/需求说明/财务管理/还车应结款-费用明细 +++ b/web端/需求说明/财务管理/还车应结款-费用明细 @@ -9,8 +9,8 @@ 2.2.合同编码:显示还车车辆合同编码; 2.3.项目名称:显示还车车辆对应项目名称; 2.4.客户名称:显示还车车辆对应客户名称; -2.5.交车时间:显示还车车辆完成交车时间; -2.6.还车时间:显示还车车辆完成还车时间; +2.5.交车时间:显示还车车辆完成交车时间,格式为:YYYY-MM-DD HH:MM; +2.6.还车时间:显示还车车辆完成还车时间,格式为:YYYY-MM-DD HH:MM; 2.7.易损保:显示还车车辆是否购买易损保,显示为是或否,后方为提示图标,文案为:提供刹车片、灯泡、蓄电池、雨刮等易损件租期内免费更换服务(不含轮胎,只限自行到服务站更换); 2.8.轮胎保:显示还车车辆是否购买轮胎保,显示为是或否,后方为提示图标,文案为:每个租赁年度内提供1次车辆轮胎因自然磨损产生的替换服务; 2.9.养护保:显示还车车辆是否购买养护保,显示为是或否,后方为提示图标,文案为:按厂家保养要求提供定期保养服务; @@ -47,7 +47,7 @@ 4.13.附件:附件上传按钮,文案为:上传附件,支持多个附件; 4.14.操作:除固定费用项外,其余操作中为删除; 列表下方为车辆租金:包含本期账单已收租金、车辆实际租金、车辆应退租金; -4.15.本期账单已收租金:输入框(禁用),反写本期账单实际到账租金(从租赁账单中,首期由于未和用友YS打通,先显示为0,对接完成后显示财务实际到账金额); +4.15.本期账单已收租金:输入框(可编辑),反写本期账单该车辆实收款租金金额(后期与用友YS打通后,显示财务到账金额); 4.16.车辆实际租金:输入框(可编辑),自动计算车辆实际租金,按照:(车辆月租金/30)*(账单开始日期-还车日期总天数,取整) 4.17.车辆应退租金:输入框(可编辑),根据:本期账单已收租金-车辆实际租金计算并反写; @@ -64,7 +64,7 @@ 5.9.还车氢量:格式为:xx.xxMPa,保留2位小数,从该车辆交车在该合同还车时间氢量获取; 5.10.退还车氢气单价:xx.xx元,从车辆租赁合同中获取; 5.11.能源费补缴金额:右侧为2个输入框,分别为氢费补缴金额、电费补缴金额,支持2位小数,后缀为元; -5.12.预付款退费金额:输入框,支持2位小数,后缀为元;输入框下方显示项目预充值余额; +5.12.预付款退费金额:输入框,支持2位小数,后缀为元;输入框下方显示项目预充值余额,如果当前租赁合同已是最后一辆车还车,则输入框右侧加红提示:当前车辆为该合同最后一辆车; 6.运维部:仅由运维部人员进行填写;标题栏标题为运维部,后方为总金额、提交人、状态(待提交、已提交),该部分只有运维部能查看; 6.1.总金额:显示运维部所有费用项费用金额总额; @@ -81,7 +81,7 @@ 6.8.3.未结算维修:输入框手动填写; 6.8.4.车损费用:输入框手动填写; 6.8.5.工具损坏丢失费用:输入框手动填写; - 6.8.6.证件丢失费用:输入框,自动计算金额,交车时做备车检查时有,还车时无得证件自动计算费用,计算标准为:行驶证:200元,牌照:300元,营运证:300元,加氢证:300元;如所有证件无丢失,或交车时就为无则不进行计算; + 6.8.6.证件丢失费用:输入框(可编辑),自动计算金额,交车时做备车检查时有,还车时无得证件自动计算费用,计算标准为:行驶证:200元,牌照:300元,营运证:300元,加氢证:300元;如所有证件无丢失,或交车时就为无则不进行计算; 6.8.7.广告损坏丢失费用:输入框手动填写; 6.8.8.送车服务费:输入框(禁用),反写交车时送车服务费,如无则显示为0; 6.8.9.接车服务费:输入框(禁用),反写还车时接车服务费,如无则显示为0; diff --git a/web端/需求说明/运维管理-车务管理/交车管理-交车单-编辑 b/web端/需求说明/运维管理-车务管理/交车管理-交车单-编辑 index 076e33a..c1a4f58 100644 --- a/web端/需求说明/运维管理-车务管理/交车管理-交车单-编辑 +++ b/web端/需求说明/运维管理-车务管理/交车管理-交车单-编辑 @@ -8,7 +8,7 @@ 2.1.车辆类型:输入框(禁用),根据车牌号反写车辆类型; 2.2.品牌:输入框(禁用),根据车牌号反写品牌; 2.2.型号:输入框(禁用),根据车牌号反写型号; -2.3.车牌号:选择器,输入框,支持输入内容下拉模糊匹配选项,仅能选择备车库中车辆; +2.3.车牌号:选择器,输入框,支持输入内容下拉模糊匹配选项,选择车辆有3个判断条件,1.仅能选择备车库中该型号车辆 2.选择时判断商业险是否到期,到期则报错不让选; 2.4.车辆识别代码:输入框(禁用),根据车牌号反写车辆识别代码; 2.5.车身广告及放大字:必选项,开关,选择车辆后拉取该车辆「后装设备」「车身广告」,如果该车辆有「车身广告」则勾选为开,如果无则勾选为无。同时如果手动进行操作,会同步到「后装设备」「车身广告」中, 安装时间以该条备车记录提交成功为准,不够选择广告照片和放大字照片字段隐藏不显示; 2.6.广告照片:必填项,图片上传,最多支持上传1张图片,支持主流照片格式。上传后,上传按钮切换为显示已上传图片缩略图,支持点击预览和删除,删除后,切换为上传按钮,从备车记录自动反写;