运维/财务:还车应结款分钟级时间与费用明细交互优化
- 还车应结款/查看/费用明细:交车/还车时间统一显示到分钟 - 待审批与审批中状态操作列支持撤回 - 费用明细:已收租金可编辑、预付款退费展示最后一辆车提示、证件丢失费用可编辑 - 同步更新相关需求说明文案 Made-with: Cursor
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user