Files
ONE-OS/web端/车辆租赁合同/车辆租赁合同-新增车辆.jsx

586 lines
65 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 【重要】必须使用 const Component 作为组件变量名
// 业务管理 - 车辆租赁合同 - 新增车辆(与查看合同页布局一致,仅新增车辆信息卡片可编辑)
const Component = function() {
var useState = React.useState;
var useCallback = React.useCallback;
var antd = window.antd;
var Select = antd.Select;
var Input = antd.Input;
var Button = antd.Button;
var Table = antd.Table;
var DatePicker = antd.DatePicker;
var message = antd.message;
var Option = Select.Option;
var cc1State = React.useState(false);
var cc1 = cc1State[0];
var setCc1 = cc1State[1];
var cc1bState = React.useState(false);
var cc1b = cc1bState[0];
var setCc1b = cc1bState[1];
var cc2State = React.useState(false);
var cc2 = cc2State[0];
var setCc2 = cc2State[1];
var cc3State = React.useState(false);
var cc3 = cc3State[0];
var setCc3 = cc3State[1];
var cc4State = React.useState(false);
var cc4 = cc4State[0];
var setCc4 = cc4State[1];
var cc5State = React.useState(false);
var cc5 = cc5State[0];
var setCc5 = cc5State[1];
var cc6State = React.useState(false);
var cc6 = cc6State[0];
var setCc6 = cc6State[1];
var cc7State = React.useState(false);
var cc7 = cc7State[0];
var setCc7 = cc7State[1];
var cc8State = React.useState(false);
var cc8 = cc8State[0];
var setCc8 = cc8State[1];
var cc9State = React.useState(false);
var cc9 = cc9State[0];
var setCc9 = cc9State[1];
var reqSpecState = React.useState(false);
var reqSpecOpen = reqSpecState[0];
var setReqSpecOpen = reqSpecState[1];
var cancelConfirmState = React.useState(false);
var cancelConfirmOpen = cancelConfirmState[0];
var setCancelConfirmOpen = cancelConfirmState[1];
var editedState = React.useState(false);
var edited = editedState[0];
var setEdited = editedState[1];
var emptyNewRow = { brand: '', model: '', plateNo: '', vin: '', monthRent: '', serviceItems: [{ project: '', fee: '', effectiveDate: '' }], deposit: '', remark: '' };
var _newVehicleRows = useState([Object.assign({}, emptyNewRow)]);
var newVehicleRows = _newVehicleRows[0];
var setNewVehicleRows = _newVehicleRows[1];
var _serviceModalRowIndex = useState(null);
var serviceModalRowIndex = _serviceModalRowIndex[0];
var setServiceModalRowIndex = _serviceModalRowIndex[1];
var brandList = ['品牌A', '品牌B', '品牌C', '品牌D'];
var serviceItemOptions = ['代处理费用', '罚款', '违章处理违约金', '未参加安全培训', '车辆出险', '年检年审违约', '停车费', '设备损坏金(包含易损件)', '清洗费', '上门收车人工费', '上门收车送车行驶费', '上门收车基础服务费', '保险上浮', '保养费用', '补办驾驶证', '补办牌照', '补办营运证', '补办加氢证', '借用备用钥匙', '补配钥匙', '租金', '氢气费-客', '退还车氢量差', '能源费补缴', '能源费退款', '送车上门人工费', '送车上门送车行驶费', '送车上门基础服务费', '保证金', '氢气预付费', '维修费用', 'ETC-客', 'ETC卡缺损费', 'ETC设备缺损费', '电费-客', '未结算保养费', '未结算维修费', '车损费', '工具损坏或丢失费', '证件费', '广告损坏费', '送车服务费', '接车服务费', '补办行驶证', '超赔险', '轮胎磨损费', '无忧包', '轮胎保', '养护保', '尾板'];
var modelByBrand = { '品牌A': ['型号A1', '型号A2', '型号A3'], '品牌B': ['型号B1', '型号B2'], '品牌C': ['型号C1', '型号C2'], '品牌D': ['型号D1'] };
var plateNoOptions = ['浙A10001', '浙A10002', '浙B20001', '浙B20002', '浙C30001', '浙C30002', '沪D40001', '沪D40002', '苏E50001', '苏E50002', '京F60001', '京F60002'].map(function(p) { return { value: p, label: p }; });
var vehicleList = [
{ plateNo: '浙A10001', vin: 'L1234567890ABCDEF', brand: '品牌A', model: '型号A1' },
{ plateNo: '浙B20002', vin: 'L2234567890ABCDEF', brand: '品牌A', model: '型号A2' },
{ plateNo: '沪D40001', vin: 'L3234567890ABCDEF', brand: '品牌B', model: '型号B1' }
];
var addNewVehicleRow = useCallback(function() {
setEdited(true);
setNewVehicleRows(function(prev) { return prev.concat([{ brand: '', model: '', plateNo: '', vin: '', monthRent: '', serviceItems: [{ project: '', fee: '', effectiveDate: '' }], deposit: '', remark: '' }]); });
}, []);
var removeNewVehicleRow = useCallback(function(index) {
setEdited(true);
setNewVehicleRows(function(prev) {
var next = prev.slice();
next.splice(index, 1);
if (next.length === 0) next = [{ brand: '', model: '', plateNo: '', vin: '', monthRent: '', serviceItems: [{ project: '', fee: '', effectiveDate: '' }], deposit: '', remark: '' }];
return next;
});
}, []);
var updateNewVehicleRow = useCallback(function(index, field, value) {
setEdited(true);
setNewVehicleRows(function(prev) {
var next = prev.slice();
var row = next[index] || emptyNewRow;
var o = {};
o[field] = value;
if (field === 'brand') o.model = '';
if (field === 'plateNo') {
var v = null;
for (var vi = 0; vi < vehicleList.length; vi++) {
if (vehicleList[vi].plateNo === value) { v = vehicleList[vi]; break; }
}
if (v) {
o.vin = v.vin || '';
if ((!row.brand && !row.model) && (v.brand || v.model)) {
o.brand = v.brand || '';
o.model = v.model || '';
}
} else {
o.vin = '';
}
}
next[index] = Object.assign({}, row, o);
return next;
});
}, []);
var calcRowServiceFee = function(row) {
var sum = 0;
for (var i = 0; i < (row.serviceItems || []).length; i++) {
var fee = parseFloat(row.serviceItems[i].fee);
if (!isNaN(fee)) sum += fee;
}
return sum.toFixed(2);
};
var openServiceModal = function(index) { setServiceModalRowIndex(index); };
var closeServiceModal = function() { setServiceModalRowIndex(null); };
var addServiceItem = function() {
if (serviceModalRowIndex === null) return;
setEdited(true);
var next = newVehicleRows.slice();
var row = next[serviceModalRowIndex];
var items = (row.serviceItems || []).concat([{ project: '', fee: '', effectiveDate: '' }]);
var newRow = {};
for (var k in row) { if (row.hasOwnProperty(k) && k !== 'serviceItems') newRow[k] = row[k]; }
newRow.serviceItems = items;
next[serviceModalRowIndex] = newRow;
setNewVehicleRows(next);
};
var removeServiceItem = function(siIndex) {
if (serviceModalRowIndex === null) return;
setEdited(true);
var next = newVehicleRows.slice();
var row = next[serviceModalRowIndex];
var items = (row.serviceItems || []).slice();
items.splice(siIndex, 1);
if (items.length === 0) items = [{ project: '', fee: '', effectiveDate: '' }];
var newRow = {};
for (var k in row) { if (row.hasOwnProperty(k) && k !== 'serviceItems') newRow[k] = row[k]; }
newRow.serviceItems = items;
next[serviceModalRowIndex] = newRow;
setNewVehicleRows(next);
};
var updateServiceItem = function(siIndex, field, value) {
if (serviceModalRowIndex === null) return;
setEdited(true);
var next = newVehicleRows.slice();
var row = next[serviceModalRowIndex];
var items = (row.serviceItems || []).slice();
var item = items[siIndex] || {};
var newItem = {};
for (var k in item) { if (item.hasOwnProperty(k)) newItem[k] = item[k]; }
newItem[field] = value;
items[siIndex] = newItem;
var newRow = {};
for (var rk in row) { if (row.hasOwnProperty(rk) && rk !== 'serviceItems') newRow[rk] = row[rk]; }
newRow.serviceItems = items;
next[serviceModalRowIndex] = newRow;
setNewVehicleRows(next);
};
var newOrderSummary = (function() {
var count = newVehicleRows.length;
var rentService = 0;
var depositTotal = 0;
for (var i = 0; i < newVehicleRows.length; i++) {
rentService += parseFloat(newVehicleRows[i].monthRent) || 0;
rentService += parseFloat(calcRowServiceFee(newVehicleRows[i])) || 0;
depositTotal += parseFloat(newVehicleRows[i].deposit) || 0;
}
return { vehicleCount: count, totalRentService: rentService.toFixed(2), totalDeposit: depositTotal.toFixed(2) };
})();
var scrollToCard = function(id) {
var el = document.getElementById(id);
if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' });
};
var styles = {
page: { padding: '16px 24px 48px', backgroundColor: '#f5f5f5', minHeight: '100vh', fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif', fontSize: 14 },
breadcrumb: { marginBottom: 16, color: '#666' },
breadcrumbSep: { margin: '0 8px', color: '#999' },
anchorWrap: { position: 'fixed', top: 80, right: 24, zIndex: 100, backgroundColor: '#fff', borderRadius: 8, boxShadow: '0 2px 8px rgba(0,0,0,0.12)', padding: '12px 16px', minWidth: 160 },
anchorItem: { display: 'block', padding: '6px 0', color: '#1890ff', cursor: 'pointer', border: 'none', background: 'none', width: '100%', textAlign: 'left', fontSize: 13 },
card: { backgroundColor: '#fff', borderRadius: 8, marginBottom: 16, boxShadow: '0 1px 2px rgba(0,0,0,0.05)', overflow: 'hidden' },
cardHeader: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '16px 20px', borderBottom: '1px solid #f0f0f0', cursor: 'pointer' },
cardTitle: { fontSize: 16, fontWeight: 600, color: '#333' },
cardToggle: { color: '#999', fontSize: 14 },
cardBody: { padding: '20px 24px' },
formRow: { display: 'flex', flexWrap: 'wrap', marginBottom: 16 },
formCol: { flex: '0 0 33.33%', minWidth: 200, paddingRight: 16, marginBottom: 8 },
formColFull: { flex: '0 0 100%', marginBottom: 8 },
label: { display: 'block', marginBottom: 6, color: '#333' },
input: { width: '100%', padding: '8px 12px', border: '1px solid #d9d9d9', borderRadius: 4, fontSize: 14 },
inputDisabled: { backgroundColor: '#f5f5f5', color: '#666', cursor: 'default', borderColor: '#e8e8e8' },
summaryList: { marginBottom: 16, display: 'flex', flexWrap: 'wrap', gap: 16 },
summaryListItem: { flex: '0 0 calc(50% - 8px)', display: 'flex', alignItems: 'center', padding: '12px 16px', border: '1px solid #e8e8e8', borderRadius: 4, backgroundColor: '#fafafa', fontSize: 14, boxSizing: 'border-box' },
summaryListLabel: { flex: '0 0 140px', color: '#666' },
summaryListValue: { flex: 1, fontWeight: 600, color: '#333' },
rentalTable: { width: '100%', borderCollapse: 'collapse', fontSize: 13 },
rentalTh: { padding: '10px 8px', textAlign: 'left', borderBottom: '1px solid #e8e8e8', backgroundColor: '#fafafa', fontWeight: 600 },
rentalTd: { padding: '8px', borderBottom: '1px solid #f0f0f0', verticalAlign: 'middle' },
rentalInputDisabled: { backgroundColor: '#f5f5f5', color: '#666', border: '1px solid #e8e8e8', padding: '6px 10px', borderRadius: 4, width: '100%', fontSize: 13 },
historyLink: { color: '#1890ff', cursor: 'pointer', background: 'none', border: 'none', padding: 0, fontSize: 14 },
footer: { position: 'fixed', bottom: 0, left: 0, right: 0, padding: '12px 24px', backgroundColor: '#fff', borderTop: '1px solid #e8e8e8', display: 'flex', gap: 12, justifyContent: 'flex-start', zIndex: 99 },
btn: { padding: '8px 24px', borderRadius: 4, border: '1px solid #d9d9d9', cursor: 'pointer', fontSize: 14 },
btnDefault: { backgroundColor: '#fff', color: '#333' },
btnPrimary: { backgroundColor: '#1890ff', color: '#fff', borderColor: '#1890ff' },
feeSectionTitle: { fontSize: 15, fontWeight: 600, color: '#333', marginTop: 20, marginBottom: 10 },
feeSectionTitleFirst: { marginTop: 0 },
sectionTitle: { fontSize: 15, fontWeight: 600, color: '#333', marginBottom: 12 },
modalMask: { position: 'fixed', left: 0, top: 0, right: 0, bottom: 0, backgroundColor: 'rgba(0,0,0,0.45)', zIndex: 1000, display: 'flex', alignItems: 'center', justifyContent: 'center' },
modalBox: { backgroundColor: '#fff', borderRadius: 8, width: '90%', maxWidth: 720, maxHeight: '85vh', overflow: 'hidden', display: 'flex', flexDirection: 'column', boxShadow: '0 4px 20px rgba(0,0,0,0.15)' },
modalHeader: { padding: '16px 20px', borderBottom: '1px solid #f0f0f0', fontSize: 16, fontWeight: 600 },
modalBody: { padding: 20, overflow: 'auto', flex: 1 },
rentalTdCenter: { padding: '8px', borderBottom: '1px solid #f0f0f0', verticalAlign: 'middle' }
};
var CardBlock = function(props) {
return React.createElement('div', { id: props.id, style: styles.card },
React.createElement('div', { style: styles.cardHeader, onClick: function() { props.setCollapsed(!props.collapsed); } },
React.createElement('span', { style: styles.cardTitle }, props.title),
React.createElement('span', { style: styles.cardToggle }, props.collapsed ? '展开' : '收起')
),
!props.collapsed ? React.createElement('div', { style: styles.cardBody }, props.children) : null
);
};
var FormItemReadOnly = function(props) {
var colStyle = props.fullWidth ? styles.formColFull : styles.formCol;
return React.createElement('div', { style: colStyle },
React.createElement('label', { style: styles.label }, props.label),
React.createElement('div', { style: Object.assign({}, styles.input, styles.inputDisabled) }, props.value || '—')
);
};
var mockCustomer = { name: '嘉兴某某物流有限公司', creditCode: '91330400MA2XXXXX1', address: '浙江省嘉兴市南湖区科技大道1号', contact: '张三', phone: '13800138001', email: 'zhangsan@example.com', companyName: '嘉兴某某物流有限公司', companyPhone: '0571-88888888', mailingAddress: '浙江省嘉兴市南湖区科技大道1号', bank: '中国工商银行嘉兴分行', bankAccount: '6222021234567890123', taxId: '91330400MA2XXXXX1' };
var isThreePartyContract = true;
var mockThirdPartyCustomer = { name: '杭州某某供应链有限公司', creditCode: '91330100MA2YYYYY2', address: '浙江省杭州市余杭区未来科技城', contact: '李四', phone: '13800138002', email: 'lisi@example.com', companyName: '杭州某某供应链有限公司', companyPhone: '0571-99999999', mailingAddress: '浙江省杭州市余杭区未来科技城', bank: '中国农业银行杭州分行', bankAccount: '6228481234567890123', taxId: '91330100MA2YYYYY2', department: '业务2部', responsible: '李专员' };
var contractOriginalFiles = [
{ name: '租赁合同-原件.pdf', size: '1.2 MB', uploadTime: '2026-02-16 14:30' },
{ name: '租赁合同-补充协议.pdf', size: '0.6 MB', uploadTime: '2026-02-16 14:35' }
];
var stampedContractFiles = [
{ name: '盖章合同-租赁合同-盖章版.pdf', size: '1.2 MB', uploadTime: '2026-02-18 10:30' },
{ name: '盖章合同-补充协议-盖章版.pdf', size: '0.6 MB', uploadTime: '2026-02-18 10:35' }
];
if (isThreePartyContract) {
contractOriginalFiles = contractOriginalFiles.concat([{ name: '三方合同-原件.pdf', size: '0.8 MB', uploadTime: '2026-03-02 16:10' }]);
stampedContractFiles = stampedContractFiles.concat([{ name: '三方盖章合同-盖章版.pdf', size: '1.1 MB', uploadTime: '2026-03-03 09:50' }]);
}
var addVehicleDate = '2026-03-15';
var mockContract = { projectName: '嘉兴氢能运输项目', contractCode: 'JXZL20260216YW101235A', contractType: '正式合同', effectiveDate: '2026-02-16', paymentMethod: '预付', mainVehicleModels: '型号A1、型号A2', endDate: '2027-02-16', paymentPeriod: '1个月', signingCompany: '嘉兴羚牛', deliveryRegion: '浙江省 / 嘉兴市', deliveryLocation: '嘉兴市南湖区科技大道1号', remarks: '' };
var mockAuthorized = [{ name: '张三', phone: '13800138001', idCard: '330102199001011234' }];
var mockRentalOrders = [{ brand: '品牌A', model: '型号A1', plateNo: '浙A10001', vin: 'L1234567890ABCDEF', monthRent: '8000', serviceFee: '500', deposit: '10000', remark: '' }, { brand: '品牌A', model: '型号A2', plateNo: '浙B20002', vin: 'L2234567890ABCDEF', monthRent: '8000', serviceFee: '500', deposit: '10000', remark: '' }];
var mockRentalSummary = { vehicleCount: 2, totalRentService: '17000.00', totalDeposit: '20000.00', hydrogenPrepay: '5000.00' };
var mockHydrogen = { bearer: '客户', paymentMethod: '预付', hydrogenPrepay: '5000', returnPrice: '80' };
var mockFeeTemplate = '标准费用模板A';
var mockBillingMethod = '按自然月结算';
var feeTemplateCertFees = [{ project: '补办行驶证', standard: '50元/次', serviceFee: '20' }, { project: '补办驾驶证', standard: '30元/次', serviceFee: '10' }, { project: '补办牌照', standard: '100元/次', serviceFee: '50' }];
var feeTemplatePenaltyFees = [{ project: '提前退车违约金', standard: '月租金×1', serviceFee: '0' }, { project: '违章处理违约金', standard: '按实际发生', serviceFee: '50' }];
var feeTemplateConsumables = [{ category: '轮胎', part: '前轮', partName: '轮胎A型', qty: 1, feeDetail: '500.00' }, { category: '易损件', part: '雨刮', partName: '雨刮片', qty: 2, feeDetail: '80.00' }];
var feeTemplateOtherFees = [{ project: '上门送车费', standard: '100元/次', serviceFee: '50' }, { project: '上门收车费', standard: '100元/次', serviceFee: '50' }, { project: '清洗费', standard: '80元/次', serviceFee: '30' }];
var feeTableHeader3 = React.createElement('tr', null, React.createElement('th', { style: styles.rentalTh }, '项目'), React.createElement('th', { style: styles.rentalTh }, '收费标准'), React.createElement('th', { style: styles.rentalTh }, '服务费'));
var feeTableHeader5 = React.createElement('tr', null, React.createElement('th', { style: styles.rentalTh }, '类别'), React.createElement('th', { style: styles.rentalTh }, '损坏部位'), React.createElement('th', { style: styles.rentalTh }, '配件'), React.createElement('th', { style: styles.rentalTh }, '数量'), React.createElement('th', { style: styles.rentalTh }, '费用明细'));
var makeFeeRow3 = function(r, i) { return React.createElement('tr', { key: i }, React.createElement('td', { style: styles.rentalTd }, r.project), React.createElement('td', { style: styles.rentalTd }, r.standard), React.createElement('td', { style: styles.rentalTd }, r.serviceFee)); };
var makeFeeRow5 = function(r, i) { return React.createElement('tr', { key: i }, React.createElement('td', { style: styles.rentalTd }, r.category), React.createElement('td', { style: styles.rentalTd }, r.part), React.createElement('td', { style: styles.rentalTd }, r.partName), React.createElement('td', { style: styles.rentalTd }, r.qty), React.createElement('td', { style: styles.rentalTd }, r.feeDetail)); };
var feeCertTable = React.createElement('table', { style: styles.rentalTable }, React.createElement('thead', null, feeTableHeader3), React.createElement('tbody', null, feeTemplateCertFees.map(makeFeeRow3)));
var feePenaltyTable = React.createElement('table', { style: styles.rentalTable }, React.createElement('thead', null, feeTableHeader3), React.createElement('tbody', null, feeTemplatePenaltyFees.map(makeFeeRow3)));
var feeConsumablesTable = React.createElement('table', { style: styles.rentalTable }, React.createElement('thead', null, feeTableHeader5), React.createElement('tbody', null, feeTemplateConsumables.map(makeFeeRow5)));
var feeOtherTable = React.createElement('table', { style: styles.rentalTable }, React.createElement('thead', null, feeTableHeader3), React.createElement('tbody', null, feeTemplateOtherFees.map(makeFeeRow3)));
var feeTemplateBody = React.createElement('div', null,
React.createElement('div', { style: Object.assign({}, styles.feeSectionTitle, styles.feeSectionTitleFirst) }, '证照补办费用'), feeCertTable,
React.createElement('div', { style: styles.feeSectionTitle }, '违约金费用'), feePenaltyTable,
React.createElement('div', { style: styles.feeSectionTitle }, '易损件信息'), feeConsumablesTable,
React.createElement('div', { style: styles.feeSectionTitle }, '其他费用信息'), feeOtherTable
);
var customerFields = React.createElement('div', { style: styles.formRow },
React.createElement(FormItemReadOnly, { label: '客户名称', value: mockCustomer.name }),
React.createElement(FormItemReadOnly, { label: '客户统一信用代码', value: mockCustomer.creditCode }),
React.createElement(FormItemReadOnly, { label: '客户地址', value: mockCustomer.address }),
React.createElement(FormItemReadOnly, { label: '客户联系人', value: mockCustomer.contact }),
React.createElement(FormItemReadOnly, { label: '客户电话', value: mockCustomer.phone }),
React.createElement(FormItemReadOnly, { label: '客户电子邮箱', value: mockCustomer.email }),
React.createElement(FormItemReadOnly, { label: '企业名称', value: mockCustomer.companyName }),
React.createElement(FormItemReadOnly, { label: '企业电话', value: mockCustomer.companyPhone }),
React.createElement(FormItemReadOnly, { label: '邮寄地址', value: mockCustomer.mailingAddress }),
React.createElement(FormItemReadOnly, { label: '开户银行', value: mockCustomer.bank }),
React.createElement(FormItemReadOnly, { label: '银行账号', value: mockCustomer.bankAccount }),
React.createElement(FormItemReadOnly, { label: '纳税人识别号', value: mockCustomer.taxId }),
React.createElement(FormItemReadOnly, { label: '业务部门', value: '业务1部' }),
React.createElement(FormItemReadOnly, { label: '业务负责人', value: '张经理' })
);
var thirdPartyCustomerFields = React.createElement('div', { style: styles.formRow },
React.createElement(FormItemReadOnly, { label: '客户名称', value: mockThirdPartyCustomer.name }),
React.createElement(FormItemReadOnly, { label: '客户统一信用代码', value: mockThirdPartyCustomer.creditCode }),
React.createElement(FormItemReadOnly, { label: '客户地址', value: mockThirdPartyCustomer.address }),
React.createElement(FormItemReadOnly, { label: '客户联系人', value: mockThirdPartyCustomer.contact }),
React.createElement(FormItemReadOnly, { label: '客户电话', value: mockThirdPartyCustomer.phone }),
React.createElement(FormItemReadOnly, { label: '客户电子邮箱', value: mockThirdPartyCustomer.email }),
React.createElement(FormItemReadOnly, { label: '企业名称', value: mockThirdPartyCustomer.companyName }),
React.createElement(FormItemReadOnly, { label: '企业电话', value: mockThirdPartyCustomer.companyPhone }),
React.createElement(FormItemReadOnly, { label: '邮寄地址', value: mockThirdPartyCustomer.mailingAddress }),
React.createElement(FormItemReadOnly, { label: '开户银行', value: mockThirdPartyCustomer.bank }),
React.createElement(FormItemReadOnly, { label: '银行账号', value: mockThirdPartyCustomer.bankAccount }),
React.createElement(FormItemReadOnly, { label: '纳税人识别号', value: mockThirdPartyCustomer.taxId }),
React.createElement(FormItemReadOnly, { label: '业务部门', value: mockThirdPartyCustomer.department }),
React.createElement(FormItemReadOnly, { label: '业务负责人', value: mockThirdPartyCustomer.responsible })
);
var contractFormRow1 = React.createElement('div', { style: styles.formRow },
React.createElement(FormItemReadOnly, { label: '项目名称', value: mockContract.projectName }),
React.createElement(FormItemReadOnly, { label: '合同编码', value: mockContract.contractCode }),
React.createElement(FormItemReadOnly, { label: '合同类型', value: mockContract.contractType }),
React.createElement(FormItemReadOnly, { label: '生效日期', value: mockContract.effectiveDate }),
React.createElement(FormItemReadOnly, { label: '付款方式', value: mockContract.paymentMethod }),
React.createElement(FormItemReadOnly, { label: '主要车型', value: mockContract.mainVehicleModels }),
React.createElement(FormItemReadOnly, { label: '结束日期', value: mockContract.endDate }),
React.createElement(FormItemReadOnly, { label: '付款周期', value: mockContract.paymentPeriod }),
React.createElement(FormItemReadOnly, { label: '签约公司', value: mockContract.signingCompany }),
React.createElement('div', { style: styles.formCol },
React.createElement(FormItemReadOnly, { label: '交车区域', value: mockContract.deliveryRegion }),
React.createElement('div', null,
React.createElement('label', { style: styles.label }, '合同原件'),
React.createElement('div', { style: Object.assign({}, styles.input, styles.inputDisabled, { padding: '8px 12px' }) },
contractOriginalFiles && contractOriginalFiles.length
? React.createElement('div', { style: { display: 'flex', flexDirection: 'column', gap: 8 } },
contractOriginalFiles.map(function(f, i) {
return React.createElement('div', { key: i, style: { display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' } },
React.createElement('a', { href: '#', style: { color: '#1890ff', cursor: 'pointer', textDecoration: 'none' }, onClick: function(e) { e.preventDefault(); window.open('#', '_blank'); } }, f.name),
(f.size || f.uploadTime) ? React.createElement('span', { style: { color: '#999', fontSize: 12 } }, (f.size || '') + (f.size && f.uploadTime ? ' · ' : '') + (f.uploadTime || '')) : null
);
})
)
: '—'
)
)
),
React.createElement(FormItemReadOnly, { label: '交车地点', value: mockContract.deliveryLocation })
);
var contractFormRow2 = React.createElement('div', { style: styles.formRow }, React.createElement(FormItemReadOnly, { label: '备注', fullWidth: true, value: mockContract.remarks || '—' }));
var authorizedContent = React.createElement('div', null,
React.createElement('div', { style: { display: 'flex', gap: 12, alignItems: 'center', marginBottom: 8 } },
React.createElement('span', { style: { flex: 1, fontWeight: 600, fontSize: 13 } }, '被授权人姓名'),
React.createElement('span', { style: { flex: 1, fontWeight: 600, fontSize: 13 } }, '被授权人联系电话'),
React.createElement('span', { style: { flex: 1, fontWeight: 600, fontSize: 13 } }, '被授权人身份证')
),
mockAuthorized.map(function(item, index) {
return React.createElement('div', { key: index, style: { display: 'flex', gap: 12, alignItems: 'center', marginBottom: 12 } },
React.createElement('div', { style: Object.assign({}, styles.input, styles.inputDisabled, { flex: 1 }) }, item.name),
React.createElement('div', { style: Object.assign({}, styles.input, styles.inputDisabled, { flex: 1 }) }, item.phone),
React.createElement('div', { style: Object.assign({}, styles.input, styles.inputDisabled, { flex: 1 }) }, item.idCard)
);
})
);
var rentalSummaryEl = React.createElement('div', { style: styles.summaryList },
React.createElement('div', { style: styles.summaryListItem }, React.createElement('span', { style: styles.summaryListLabel }, '租赁车辆数'), React.createElement('span', { style: styles.summaryListValue }, mockRentalSummary.vehicleCount + ' 辆')),
React.createElement('div', { style: styles.summaryListItem }, React.createElement('span', { style: styles.summaryListLabel }, '租金及服务费合计'), React.createElement('span', { style: styles.summaryListValue }, mockRentalSummary.totalRentService + ' 元')),
React.createElement('div', { style: styles.summaryListItem }, React.createElement('span', { style: styles.summaryListLabel }, '保证金总额'), React.createElement('span', { style: styles.summaryListValue }, mockRentalSummary.totalDeposit + ' 元')),
React.createElement('div', { style: styles.summaryListItem }, React.createElement('span', { style: styles.summaryListLabel }, '氢气预付款金额'), React.createElement('span', { style: styles.summaryListValue }, mockRentalSummary.hydrogenPrepay + ' 元'))
);
var rentalTableBody = mockRentalOrders.map(function(row, idx) {
return React.createElement('tr', { key: idx },
React.createElement('td', { style: styles.rentalTd }, idx + 1),
React.createElement('td', { style: styles.rentalTd }, React.createElement('div', { style: styles.rentalInputDisabled }, row.brand)),
React.createElement('td', { style: styles.rentalTd }, React.createElement('div', { style: styles.rentalInputDisabled }, row.model)),
React.createElement('td', { style: styles.rentalTd }, React.createElement('div', { style: styles.rentalInputDisabled }, row.plateNo)),
React.createElement('td', { style: styles.rentalTd }, React.createElement('div', { style: styles.rentalInputDisabled }, row.vin)),
React.createElement('td', { style: styles.rentalTd }, React.createElement('div', { style: styles.rentalInputDisabled }, row.monthRent + ' 元')),
React.createElement('td', { style: styles.rentalTd }, React.createElement('div', { style: styles.rentalInputDisabled }, row.serviceFee + ' 元')),
React.createElement('td', { style: styles.rentalTd }, React.createElement('div', { style: styles.rentalInputDisabled }, row.deposit + ' 元')),
React.createElement('td', { style: styles.rentalTd }, React.createElement('div', { style: styles.rentalInputDisabled }, row.remark || '—'))
);
});
var rentalTableEl = React.createElement('table', { style: styles.rentalTable },
React.createElement('thead', null,
React.createElement('tr', null,
React.createElement('th', { style: styles.rentalTh, width: 50 }, '序号'),
React.createElement('th', { style: styles.rentalTh, width: 100 }, '品牌'),
React.createElement('th', { style: styles.rentalTh, width: 100 }, '型号'),
React.createElement('th', { style: styles.rentalTh, width: 120 }, '车牌号'),
React.createElement('th', { style: styles.rentalTh, width: 160 }, '车辆识别代码'),
React.createElement('th', { style: styles.rentalTh, width: 120 }, '车辆月租金'),
React.createElement('th', { style: styles.rentalTh, width: 90 }, '服务费'),
React.createElement('th', { style: styles.rentalTh, width: 100 }, '保证金'),
React.createElement('th', { style: styles.rentalTh, width: 80 }, '备注')
)
),
React.createElement('tbody', null, rentalTableBody)
);
var hydrogenReadOnly = React.createElement('div', { style: styles.formRow },
React.createElement(FormItemReadOnly, { label: '氢费承担方', value: mockHydrogen.bearer }),
React.createElement(FormItemReadOnly, { label: '付款方式', value: mockHydrogen.paymentMethod }),
React.createElement(FormItemReadOnly, { label: '氢气预付款', value: mockHydrogen.hydrogenPrepay + ' 元' }),
React.createElement(FormItemReadOnly, { label: '退还车氢气单价', value: mockHydrogen.returnPrice + ' 元' })
);
var rentalContent = React.createElement('div', null, rentalSummaryEl, React.createElement('div', { style: { overflowX: 'auto', marginBottom: 16 } }, rentalTableEl), hydrogenReadOnly);
var newVehicleColumns = [
{ title: '序号', key: 'no', width: 60, render: function(_, __, i) { return i + 1; } },
{ title: '品牌', key: 'brand', width: 90, render: function(_, row, i) { return React.createElement(Select, { placeholder: '请选择', style: { width: '100%' }, value: row.brand || undefined, onChange: function(v) { updateNewVehicleRow(i, 'brand', v || ''); }, options: brandList.map(function(b) { return { value: b, label: b }; }), allowClear: true }); } },
{ title: '型号', key: 'model', width: 100, render: function(_, row, i) { var opts = (row.brand && modelByBrand[row.brand]) ? modelByBrand[row.brand].map(function(m) { return { value: m, label: m }; }) : []; return React.createElement(Select, { placeholder: '请选择', style: { width: '100%' }, value: row.model || undefined, onChange: function(v) { updateNewVehicleRow(i, 'model', v || ''); }, options: opts, allowClear: true, disabled: !row.brand }); } },
{ title: '车牌号', key: 'plateNo', width: 120, render: function(_, row, i) { return React.createElement(Select, { placeholder: '请选择或输入搜索', style: { width: '100%' }, value: row.plateNo || undefined, onChange: function(v) { updateNewVehicleRow(i, 'plateNo', v || ''); }, options: plateNoOptions, allowClear: true, showSearch: true, filterOption: function(input, option) { var label = (option && option.label) ? option.label : ''; return label.toLowerCase().indexOf((input || '').toLowerCase()) >= 0; } }); } },
{ title: '车辆识别代码', key: 'vin', width: 160, render: function(_, row, i) { return React.createElement(Input, { placeholder: '由车牌号反写', value: row.plateNo || row.vin || '', disabled: true }); } },
{ title: '车辆月租金', key: 'monthRent', width: 120, render: function(_, row, i) { return React.createElement(Input, { placeholder: '0.00', value: row.monthRent || '', onChange: function(e) { updateNewVehicleRow(i, 'monthRent', e.target.value); }, addonAfter: '元' }); } },
{ title: '服务费项目', key: 'serviceItems', width: 80, render: function(_, row, i) { return React.createElement(Button, { type: 'link', size: 'small', onClick: function() { openServiceModal(i); } }, '管理'); } },
{ title: '服务费', key: 'serviceFee', width: 90, render: function(_, row, i) { return calcRowServiceFee(row) + ' 元'; } },
{ title: '保证金', key: 'deposit', width: 100, render: function(_, row, i) { return React.createElement(Input, { placeholder: '0.00', value: row.deposit || '', onChange: function(e) { updateNewVehicleRow(i, 'deposit', e.target.value); }, addonAfter: '元' }); } },
{ title: '操作', key: 'action', width: 80, render: function(_, row, i) { return React.createElement(Button, { type: 'link', size: 'small', danger: true, onClick: function() { removeNewVehicleRow(i); } }, '删除'); } },
{ title: '备注', key: 'remark', width: 120, render: function(_, row, i) { return React.createElement(Input, { placeholder: '选填', value: row.remark || '', onChange: function(e) { updateNewVehicleRow(i, 'remark', e.target.value); } }); } }
];
var newOrderSummaryEl = React.createElement('div', { style: styles.summaryList },
React.createElement('div', { style: styles.summaryListItem }, React.createElement('span', { style: styles.summaryListLabel }, '租赁车辆数'), React.createElement('span', { style: styles.summaryListValue }, newOrderSummary.vehicleCount + ' 辆')),
React.createElement('div', { style: styles.summaryListItem }, React.createElement('span', { style: styles.summaryListLabel }, '租金及服务费合计'), React.createElement('span', { style: styles.summaryListValue }, newOrderSummary.totalRentService + ' 元')),
React.createElement('div', { style: styles.summaryListItem }, React.createElement('span', { style: styles.summaryListLabel }, '保证金总额'), React.createElement('span', { style: styles.summaryListValue }, newOrderSummary.totalDeposit + ' 元'))
);
var serviceModalRows = serviceModalRowIndex !== null && newVehicleRows[serviceModalRowIndex] ? newVehicleRows[serviceModalRowIndex].serviceItems : [];
var serviceModalContent = serviceModalRowIndex !== null ? React.createElement('div', { style: styles.modalMask, onClick: function(e) { if (e.target === e.currentTarget) closeServiceModal(); } },
React.createElement('div', { style: styles.modalBox, onClick: function(e) { e.stopPropagation(); } },
React.createElement('div', { style: styles.modalHeader }, '服务项目'),
React.createElement('div', { style: styles.modalBody },
React.createElement('table', { style: styles.rentalTable },
React.createElement('thead', null, React.createElement('tr', null, React.createElement('th', { style: styles.rentalTh }, '服务项目'), React.createElement('th', { style: styles.rentalTh }, '费用'), React.createElement('th', { style: styles.rentalTh }, '生效时间'), React.createElement('th', { style: Object.assign({}, styles.rentalTh, { width: 80 }) }, '操作'))),
React.createElement('tbody', null, serviceModalRows.map(function(si, siIdx) {
return React.createElement('tr', { key: siIdx },
React.createElement('td', { style: styles.rentalTd }, React.createElement(Select, { style: { width: '100%' }, placeholder: '请选择服务项目', value: si.project || undefined, onChange: function(v) { updateServiceItem(siIdx, 'project', v || ''); }, showSearch: true, filterOption: function(input, opt) { return opt && opt.children && String(opt.children).toLowerCase().indexOf((input || '').toLowerCase()) >= 0; }, allowClear: true }, serviceItemOptions.map(function(opt, oi) { return React.createElement(Option, { key: oi, value: opt }, opt); }))),
React.createElement('td', { style: styles.rentalTd }, React.createElement(Input, { placeholder: '0.00', value: si.fee || '', onChange: function(e) { updateServiceItem(siIdx, 'fee', e.target.value); }, addonAfter: '元', style: { width: '100%' } })),
React.createElement('td', { style: styles.rentalTd }, React.createElement(DatePicker, { style: { width: '100%' }, format: 'YYYY-MM-DD', placeholder: '请选择生效时间', value: si.effectiveDate && window.moment ? window.moment(si.effectiveDate, 'YYYY-MM-DD') : null, onChange: function(d, dateStr) { updateServiceItem(siIdx, 'effectiveDate', dateStr || ''); } })),
React.createElement('td', { style: styles.rentalTd }, React.createElement(Button, { type: 'link', size: 'small', danger: true, onClick: function() { removeServiceItem(siIdx); } }, '删除'))
);
}))
),
React.createElement(Button, { type: 'dashed', style: { marginTop: 12, width: '100%' }, onClick: addServiceItem }, '添加一行')
),
React.createElement('div', { style: { padding: '12px 20px', borderTop: '1px solid #f0f0f0', textAlign: 'right', display: 'flex', gap: 12, justifyContent: 'flex-end' } },
React.createElement(Button, { type: 'primary', onClick: function() { closeServiceModal(); } }, '保存'),
React.createElement(Button, { onClick: closeServiceModal }, '关闭')
)
)
) : null;
var newVehicleCardContent = React.createElement('div', null,
React.createElement('div', { style: styles.sectionTitle }, '新增车辆信息'),
newOrderSummaryEl,
React.createElement(Table, { rowKey: function(_, i) { return String(i); }, size: 'small', columns: newVehicleColumns, dataSource: newVehicleRows, pagination: false, scroll: { x: 1100 } }),
React.createElement(Button, { type: 'dashed', style: { marginTop: 12, width: '100%' }, onClick: addNewVehicleRow }, '添加一行')
);
var feeContent = React.createElement('div', null, React.createElement('div', { style: styles.formRow }, React.createElement(FormItemReadOnly, { label: '选择费用模板', value: mockFeeTemplate })), feeTemplateBody);
var billingContent = React.createElement('div', null, React.createElement('div', { style: { padding: '12px 16px', border: '1px solid #e8e8e8', borderRadius: 4, backgroundColor: '#fafafa', fontSize: 14, color: '#333' } }, mockBillingMethod));
var stampedAttachmentInner = stampedContractFiles && stampedContractFiles.length
? React.createElement('div', { style: { display: 'flex', flexDirection: 'column', gap: 10 } },
stampedContractFiles.map(function(f, i) {
return React.createElement('div', { key: i, style: { display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap', padding: '8px 12px', backgroundColor: '#f5f5f5', borderRadius: 4, border: '1px solid #d9d9d9' } },
React.createElement('a', { href: '#', style: { color: '#1890ff', cursor: 'pointer', textDecoration: 'none' }, onClick: function(e) { e.preventDefault(); window.open('#', '_blank'); } }, f.name),
React.createElement('span', { style: { color: '#999', fontSize: 12 } }, f.size + ' · ' + f.uploadTime)
);
})
)
: React.createElement('div', { style: { color: '#999', fontSize: 13 } }, '暂无附件');
var changeHistoryRaw = [
{ changeTime: '2026-03-03 10:20', opType: '保存', operator: '张三', remark: '无' },
{ changeTime: '2026-03-02 16:10', opType: '变更为三方合同', operator: '李四', remark: '增加丙方客户“客户名称杭州某某供应链有限公司”' },
{ changeTime: '2026-03-01 11:40', opType: '添加车辆', operator: '王五', remark: '添加车辆“沪A30003”\n添加车辆“浙A10001”\n添加车辆“浙B20002”' },
{ changeTime: '2026-02-28 09:05', opType: '添加授权人', operator: '赵六', remark: '添加授权人“授权人张三”\n添加授权人“授权人李四”' },
{ changeTime: '2026-02-26 15:30', opType: '续签合同', operator: '周九', remark: '续签自“原合同编码JXZL20250210YW101100A”' },
{ changeTime: '2026-02-23 14:18', opType: '撤回合同', operator: '钱七', remark: '主动撤回' },
{ changeTime: '2026-02-20 10:00', opType: '终止合同', operator: '孙八', remark: '主动终止' },
{ changeTime: '2026-02-16 14:30', opType: '转正式合同', operator: '张经理', remark: '转正式合同自“原合同编码JXZL20260210YW101230B”' }
];
var changeHistorySorted = changeHistoryRaw.slice().sort(function(a, b) { return b.changeTime.localeCompare(a.changeTime); });
var historyTableRows = changeHistorySorted.map(function(row, index) {
return React.createElement('tr', { key: index },
React.createElement('td', { style: styles.rentalTd }, index + 1),
React.createElement('td', { style: styles.rentalTd }, row.changeTime),
React.createElement('td', { style: styles.rentalTd }, row.opType),
React.createElement('td', { style: styles.rentalTd }, row.operator),
React.createElement('td', { style: styles.rentalTd }, React.createElement('button', { type: 'button', style: styles.historyLink, onClick: function() { window.open('#', '_blank'); } }, '查看变更前记录')),
React.createElement('td', { style: Object.assign({}, styles.rentalTd, { verticalAlign: 'top', whiteSpace: 'pre-line' }) }, row.remark)
);
});
var historyTable = React.createElement('table', { style: styles.rentalTable },
React.createElement('thead', null,
React.createElement('tr', null,
React.createElement('th', { style: styles.rentalTh, width: 60 }, '序号'),
React.createElement('th', { style: styles.rentalTh, width: 140 }, '变更时间'),
React.createElement('th', { style: styles.rentalTh, width: 120 }, '操作类型'),
React.createElement('th', { style: styles.rentalTh, width: 90 }, '操作人'),
React.createElement('th', { style: styles.rentalTh, width: 120 }, '原始记录'),
React.createElement('th', { style: styles.rentalTh }, '备注')
)
),
React.createElement('tbody', null, historyTableRows)
);
var requirementContent = '车辆租赁合同-新增车辆2026年3月3日版本\n「数字化资产ONE-OS运管平台」中的「车辆租赁合同」-「新增车辆」模块,在车辆租赁合同操作列点击「新增车辆」进行新增;\n1.面包屑:\n#业务管理-车辆租赁合同-新增车辆\n\n2.客户基本信息卡片:\n#显示已审批合同实际信息,不可修改,当客户信息产生变更时,对该条历史合同数据不作更新,合同变更为三方合同时不在原有客户基本信息做修改,而是增加三方客户基本信息卡片;\n2.1.客户名称:从该条合同自动反查;\n2.2.客户统一信用代码:从该条合同自动反查;\n2.3.客户地址:从该条合同自动反查;\n2.4.客户联系人:从该条合同自动反查;\n2.5.客户电话:从该条合同自动反查;\n2.6.客户电子邮箱:从该条合同自动反查;\n2.7.企业名称:从该条合同自动反查;\n2.8.企业电话:从该条合同自动反查;\n2.9.邮寄地址:从该条合同自动反查;\n2.10.开户银行:从该条合同自动反查;\n2.11.银行账号:从该条合同自动反查;\n2.12.纳税人识别号:从该条合同自动反查;\n2.13.业务部门:从该条合同自动反查;\n2.14.业务负责人:从该条合同自动反查;\n\n3.丙方客户基本信息卡片(当合同转三方合同时显示):\n#显示已审批合同丙方实际信息,不可修改;;\n3.1.客户名称:从该条合同自动反查;\n3.2.客户统一信用代码:从该条合同自动反查;\n3.3.客户地址:从该条合同自动反查;\n3.4.客户联系人:从该条合同自动反查;\n3.5.客户电话:从该条合同自动反查;\n3.6.客户电子邮箱:从该条合同自动反查;\n3.7.企业名称:从该条合同自动反查;\n3.8.企业电话:从该条合同自动反查;\n3.9.邮寄地址:从该条合同自动反查;\n3.10.开户银行:从该条合同自动反查;\n3.11.银行账号:从该条合同自动反查;\n3.12.纳税人识别号:从该条合同自动反查;\n3.13.业务部门:从该条合同自动反查;\n3.14.业务负责人:从该条合同自动反查;\n\n4.合同基本信息卡片:\n#显示合同基本信息,不可修改;\n4.1.项目名称:从该条合同自动反查;\n4.2.合同编码:从该条合同自动反查,在新增租赁合同点击提交审核时生成;\n 合同编码由:[城市简写][合同类型][签约时间][业务部门代码][顺序流水号][签署状态]组成;\n 4.2.1.地区简写如上海为SH嘉兴为JX\n 4.2.2.合同类型采购合同为CG、租赁合同为ZL、自营合同为ZY\n 4.2.3.签约时间显示合同签约时间如20260216\n 4.2.4.业务部门代码显示合同签约业务部门信息如YW1代表业务1部YW2代表业务2部\n 4.2.5.顺序流水号实施5位编号补零规则如01235代表是集团编号为1235的合同\n 4.2.6.签署状态A为正式合同B为试用合同\n 如编号为JXZL20260216YW101235A则代表嘉兴业务1部在2026年2月16日签署的租赁正式合同在集团中编号为1235也可以理解为第1235份合同\n 4.2.7.如果该合同为续签合同则自动在新合同编码后额外添加续签自旧合同合同编码xxx\n 4.2.8.如果该合同为转正式合同则自动在新合同编码后额外添加转正式合同自旧合同合同编码xxx\n4.3.合同类型:从该条合同自动反查;\n4.4.生效日期:从该条合同自动反查;\n4.5.付款方式:从该条合同自动反查;\n4.6.主要车型:从该条合同自动反查;\n4.7.结束日期:从该条合同自动反查;\n 4.7.1.合同结束日期前30天将以消息提醒方式提醒消息中心、工作台\n 4.7.2.到达合同结束日期时,租赁账单将会立刻停止计算,作为最后一期账单;\n 4.7.3.续签合同/转正式合同将重新生成账单,不会对旧合同账单做任何继承处理;\n4.8.付款周期:从该条合同自动反查;\n4.9.签约公司:从该条合同自动反查;\n4.10.交车区域:从该条合同自动反查;\n4.11.交车地点:从该条合同自动反查;\n4.12.合同原件:从该条合同自动反查,显示「合同原件名称.格式」「文件大小」「上传时间」,可能会存在多个附件,显示为一列,如果转为三方合同,则会显示新附件,显示「三方合同原件名称.格式」「文件大小」「上传时间」;\n4.13.备注:从该条合同自动反查;\n 4.13.1.如果该合同为续签合同则自动在已填备注信息上方额外添加续签自旧合同合同编码xxx\n 4.13.2.如果该合同为转正式合同则自动在已填备注信息上方额外添加转正式合同自旧合同合同编码xxx\n\n5.被授权人信息卡片:\n#显示所有被授权人信息,不可修改,如要新增被授权人,需要在列表中点击添加被授权人进行处理;\n5.1.被授权人:从该条合同自动反查;\n5.2.被授权人联系电话:从该条合同自动反查;\n5.3.被授权人身份证:从该条合同自动反查;\n\n6.租赁订单信息卡片:\n#显示租赁合同对应车辆明细费用、氢费明细费用等相关信息;\n6.1.上方为租赁车辆总计数据,包括租赁车辆数、租金及服务费合计、保证金总额、氢气预付款金额等相关信息;\n 6.1.1.租赁车辆数:显示下方租赁订单信息包含多少辆车;\n 6.1.2.租金及服务费合计:显示下方租赁订单信息中车辆租金总额及服务费总额;\n 6.1.3.保证金总额:显示下方租赁订单信息中车辆保证金总额;\n 6.1.4.氢气预付款金额显示氢气预付款金额如客户选择自行承担氢费或羚牛承担氢费则该处为0不计入氢气预付款金额\n6.2.下方为列表,显示序号、品牌、型号、车牌号、车辆识别代码、车辆月租金(元)、服务费项目、服务费、保证金、备注;\n 6.2.1.序号:从该条合同自动反查;\n 6.2.2.品牌:从该条合同自动反查;\n 6.2.3.型号:从该条合同自动反查;\n 6.2.4.车牌号:从该条合同自动反查;\n 6.2.5.车辆识别代码:从该条合同自动反查;\n 6.2.6.车辆月租金:从该条合同自动反查;\n 6.2.7.服务费项目:点击查看按钮弹出卡片,卡片标题为:服务项目,下方列表显示服务项目、费用、生效时间;\n 6.2.7.1.服务项目:从该条合同自动反查;\n 6.2.7.2.费用:从该条合同自动反查;\n 6.2.7.3.生效时间:从该条合同自动反查;\n #在提车应收款中,车辆的交车日期和服务费生效日期可能会存在不同的情况,所以服务费需要单独以生效时间进行计算,例如:\n 交车后车辆从1月1日开始计费付款周期为2个月则提车应收款租金会计算到3月1日但是服务费生效时间为1月30日此情况下需要以3月1日-1月30日计算出服务费具体收费天数为30天然后根据服务费费用/30* 服务费收费天数30进行计算\n 6.2.8.服务费:从该条合同自动反查;\n 6.2.9.保证金:从该条合同自动反查;\n 6.2.10.备注:从该条合同自动反查;\n6.3.氢费承担方:从该条合同自动反查;\n6.4.付款方式:从该条合同自动反查;\n6.5.氢气预付款:从该条合同自动反查;\n6.6.退还车氢气单价:从该条合同自动反查,该金额主要用于与客户约定还车时,与交车时氢气差值以此费用进行自动计算和结算;\n\n7.新增车辆信息卡片(用户每次为合同新增车辆时,都会生成一个新增车辆信息卡片):\n#显示租赁合同对应新增车辆的明细费用、氢费明细费用等相关信息;\n7.1.卡片标题显示为新增车辆信息YYYY-MM-DD\n7.2.上方为租赁车辆总计数据,包括租赁车辆数、租金及服务费合计、保证金总额等相关信息;\n 7.2.1.租赁车辆数:显示下方租赁订单信息包含多少辆车;\n 7.2.2.租金及服务费合计:显示下方租赁订单信息中车辆租金总额及服务费总额;\n 7.2.3.保证金总额:显示下方租赁订单信息中车辆保证金总额;\n7.3.下方为列表,显示序号、品牌、型号、车牌号、车辆识别代码、车辆月租金(元)、服务费项目、服务费、保证金、操作、备注;\n 7.3.1.序号自动按照条数生成规则为1、2、3....以此类推;\n 7.3.2.品牌:必选项,选择器,从型号参数库中「品牌」字段拉取所有品牌;\n 7.3.3.型号:必选项,选择器,与品牌存在级联关系,未选择品牌则无法选择型号;\n 7.3.4.车牌号:选填项,选择器(支持从输入框输入车牌号关键字下拉匹配),可通过选择车牌号对品牌、型号进行反写;\n 7.3.5.车辆识别代码:输入框(禁用),显示该车辆对应车辆识别代码,根据所选车牌号从车辆表直接拉取进行反写;\n 7.3.6.车辆月租金输入框支持两位小数用于输入该车辆月租金金额输入框后缀为元如还车时账单周期不满1个月则按照车辆月租金/30* 实际天数进行计算;\n 7.3.7.服务费项目:点击管理按钮弹出卡片,卡片标题为:服务项目,下方列表显示服务项目、费用、生效时间、操作;\n 7.3.7.1.服务项目:必选项,选择器(支持输入框输入服务项目关键字进行下拉匹配),选项包含:代处理费用、罚款、违章处理违约金、未参加安全培训、车辆出险、年检年审违约、停车费、设备损坏金(包含易损件)、清洗费、上门收车人工费、上门收车送车行驶费、上门收车基础服务费、保险上浮、保养费用、补办驾驶证、补办牌照、补办营运证、补办加氢证、借用备用钥匙、补配钥匙、租金、氢气费-客、退还车氢量差、能源费补缴、能源费退款、送车上门人工费、送车上门送车行驶费、送车上门基础服务费、保证金、氢气预付费、维修费用、ETC-客、ETC卡缺损费、ETC设备缺损费、电费-客、未结算保养费、未结算维修费、车损费、工具损坏或丢失费、证件费、广告损坏费、送车服务费、接车服务费、补办行驶证、超赔险、轮胎磨损费、无忧包、轮胎保、养护保、尾板;\n 7.3.7.2.费用必填项输入框支持2位小数输入框后缀为元\n 7.3.7.3.生效时间必选项日期选择器格式为YYYY-MM-DD\n 7.3.7.4.操作:删除,点击删除直接删除该行数据;\n 7.3.7.5.新增一行数据:点击添加一行服务项目;\n #在提车应收款中,车辆的交车日期和服务费生效日期可能会存在不同的情况,所以服务费需要单独以生效时间进行计算,例如:\n 交车后车辆从1月1日开始计费付款周期为2个月则提车应收款租金会计算到3月1日但是服务费生效时间为1月30日此情况下需要以3月1日-1月30日计算出服务费具体收费天数为30天然后根据服务费费用/30* 服务费收费天数30进行计算\n 7.3.8.服务费自动根据添加的所有服务费项目计算总额支持2位小数格式为xx.xx元\n 7.3.9.保证金必填项输入框支持2位小数后缀为元用于填写车辆需要支付的保证金金额保证金为提车应收款一次性支付还车时需要计入退还费用中\n 7.3.10.备注:选填项,输入框,用于备注车辆复杂情况;\n 7.3.11.操作:删除,点击删除删除该行数据;\n 7.3.12.添加一行:点击后列表新增一行,用于填写一条新的车辆租金费用信息;\n\n8.其他费用信息卡片:\n#显示对应租赁费用模板证照补办费用、违约金费用、易损件费用、其他费用等信息;\n8.1.选择费用模板:必选项,从「租赁费用模板」中拉取,选择后自动将该费用模板所有环节费用显示在合同中;\n 8.1.1.证照补办费用:单独标题显示,内容为列表,列表中包括项目、收费标准、服务费,从该条合同自动反查;\n 8.1.2.违约金费用:单独标题显示,内容为列表,列表中包含项目、收费标准、服务费,从该条合同自动反查;\n 8.1.3.易损件信息:单独标题显示,内容为列表,列表中包含类别、损坏部位、配件、数量、费用明细,从该条合同自动反查;\n 8.1.4.其他费用信息:单独标题显示,内容为列表,列表中包含项目、收费标准、服务费,从该条合同自动反查;\n\n9.账单计算方式卡片:\n#显示实际结算方式;\n\n10.盖章合同附件:\n#显示财务审核完成后,由法务上传的盖章版合同文件,显示「盖章合同名称.格式」「文件大小」「上传时间」,可能会存在多个附件,显示为一列;如果转为三方合同,则会重新审批,法务上传显示新附件,显示「三方盖章合同名称.格式」「文件大小」「上传时间」\n\n11.合同变更历史记录:\n#显示合同变更历史,包括序号、变更时间、操作类型、操作人、原始记录、备注;\n11.1.序号:显示变更历史序号,按照变更时间倒序(从近到远)进行排序;\n11.2.变更时间显示变更时间格式为YYYY-MM-DD HH:MM\n11.3.操作类型:包括变更为三方合同、添加车辆、添加授权人、续签合同、撤回合同、终止合同、转正式合同、保存;\n11.4.操作人:显示对应操作类型操作人员;\n11.5.原始记录:显示查看变更前记录,点击打开新页面至查看原始合同快照;\n11.6.备注:备注改动内容,包括:\n 11.6.1.变更为三方合同时增加丙方客户“客户名称xxxxxx”\n 11.6.2.添加车辆时添加车辆“车牌号xxx”、“车牌号xxx”、“车牌号xxx”每辆车单独一行显示\n 11.6.3.添加授权人时添加授权人“授权人xxxx”、“授权人xxx”每个授权人单独一行显示\n 11.6.4.续签合同时续签自”原合同编码xxxxxx“\n 11.6.5.撤回合同时:主动撤回;\n 11.6.6.终止合同时:主动终止;\n 11.6.7.转正式合同时转正式合同自“原合同编码xxxx”\n 11.6.8.保存:无;\n\n12.最下方为提交并审核、保存、取消三个按钮;\n12.1.点击提交并审核toast提示租赁合同已提交审核。同时该租赁合同重新触发审核流程\n12.2.点击保存,会存储租赁订单已填写内容,不做必填项校验,同时显示在租赁合同列表中,该条数据只能保存人自己查看并编辑,其他人无法操作;\n12.3.点击取消,如当前页面有已编辑内容时,点击取消会进行二次提示,内容为:取消将会丢失所有已填写内容,是否确认?点击确认返回车辆租赁合同列表页;\n\n所有卡片支持收起/展开功能,通过点击卡片右侧收起/展开实现;并增加锚点功能,锚点固定于页面右上角,点击锚点对应卡片名称,页面自动跳转至该卡片所在区域;';
return React.createElement('div', { style: styles.page },
React.createElement('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 } },
React.createElement('div', { style: styles.breadcrumb }, React.createElement('span', null, '业务管理'), React.createElement('span', { style: styles.breadcrumbSep }, ' / '), React.createElement('span', null, '车辆租赁合同'), React.createElement('span', { style: styles.breadcrumbSep }, ' / '), React.createElement('span', { style: { color: '#1890ff' } }, '新增车辆')),
React.createElement('span', { style: { color: '#1890ff', cursor: 'pointer', fontSize: 14 }, onClick: function() { setReqSpecOpen(true); } }, '查看需求说明')
),
React.createElement('div', { style: styles.anchorWrap },
React.createElement('div', { style: { marginBottom: 8, fontWeight: 600, fontSize: 14 } }, '锚点导航'),
React.createElement('button', { type: 'button', style: styles.anchorItem, onClick: function() { scrollToCard('card-customer'); } }, '客户基本信息'),
isThreePartyContract ? React.createElement('button', { type: 'button', style: styles.anchorItem, onClick: function() { scrollToCard('card-third-party'); } }, '丙方客户基本信息') : null,
React.createElement('button', { type: 'button', style: styles.anchorItem, onClick: function() { scrollToCard('card-contract'); } }, '合同基本信息'),
React.createElement('button', { type: 'button', style: styles.anchorItem, onClick: function() { scrollToCard('card-authorized'); } }, '被授权人信息'),
React.createElement('button', { type: 'button', style: styles.anchorItem, onClick: function() { scrollToCard('card-rental'); } }, '租赁订单信息'),
React.createElement('button', { type: 'button', style: styles.anchorItem, onClick: function() { scrollToCard('card-new-vehicle'); } }, '新增车辆信息(' + addVehicleDate + ''),
React.createElement('button', { type: 'button', style: styles.anchorItem, onClick: function() { scrollToCard('card-fee'); } }, '其他费用信息'),
React.createElement('button', { type: 'button', style: styles.anchorItem, onClick: function() { scrollToCard('card-billing'); } }, '账单计算方式'),
React.createElement('button', { type: 'button', style: styles.anchorItem, onClick: function() { scrollToCard('card-attachment'); } }, '盖章合同附件'),
React.createElement('button', { type: 'button', style: styles.anchorItem, onClick: function() { scrollToCard('card-history'); } }, '合同变更历史记录')
),
React.createElement('div', { id: 'card-customer' }, React.createElement(CardBlock, { title: '客户基本信息', collapsed: cc1, setCollapsed: setCc1 }, customerFields)),
isThreePartyContract ? React.createElement('div', { id: 'card-third-party', style: { marginTop: 16 } }, React.createElement(CardBlock, { title: '丙方客户基本信息', collapsed: cc1b, setCollapsed: setCc1b }, thirdPartyCustomerFields)) : null,
React.createElement('div', { id: 'card-contract', style: { marginTop: 16 } }, React.createElement(CardBlock, { title: '合同基本信息', collapsed: cc2, setCollapsed: setCc2 }, React.createElement('div', null, contractFormRow1, contractFormRow2))),
React.createElement('div', { id: 'card-authorized', style: { marginTop: 16 } }, React.createElement(CardBlock, { title: '被授权人信息', collapsed: cc3, setCollapsed: setCc3 }, authorizedContent)),
React.createElement('div', { id: 'card-rental', style: { marginTop: 16 } }, React.createElement(CardBlock, { title: '租赁订单信息', collapsed: cc4, setCollapsed: setCc4 }, rentalContent)),
React.createElement('div', { id: 'card-new-vehicle', style: { marginTop: 16 } }, React.createElement(CardBlock, { title: '新增车辆信息(' + addVehicleDate + '', collapsed: cc7, setCollapsed: setCc7 }, newVehicleCardContent)),
React.createElement('div', { id: 'card-fee', style: { marginTop: 16 } }, React.createElement(CardBlock, { title: '其他费用信息', collapsed: cc5, setCollapsed: setCc5 }, feeContent)),
React.createElement('div', { id: 'card-billing', style: { marginTop: 16 } }, React.createElement(CardBlock, { title: '账单计算方式', collapsed: cc6, setCollapsed: setCc6 }, billingContent)),
React.createElement('div', { id: 'card-attachment', style: { marginTop: 16 } }, React.createElement(CardBlock, { title: '盖章合同附件', collapsed: cc8, setCollapsed: setCc8 }, stampedAttachmentInner)),
React.createElement('div', { id: 'card-history', style: { marginTop: 16 } }, React.createElement(CardBlock, { title: '合同变更历史记录', collapsed: cc9, setCollapsed: setCc9 }, React.createElement('div', { style: { overflowX: 'auto' } }, historyTable))),
React.createElement('div', { style: { height: 60 } }),
serviceModalContent,
reqSpecOpen ? React.createElement('div', { style: styles.modalMask, onClick: function(e) { if (e.target === e.currentTarget) setReqSpecOpen(false); } },
React.createElement('div', { style: Object.assign({}, styles.modalBox, { maxWidth: 720 }), onClick: function(e) { e.stopPropagation(); } },
React.createElement('div', { style: styles.modalHeader }, '需求说明'),
React.createElement('div', { style: Object.assign({}, styles.modalBody, { maxHeight: '70vh', padding: '20px 24px' }) }, React.createElement('div', { style: { whiteSpace: 'pre-wrap', fontSize: 13, lineHeight: 1.6, color: 'rgba(0,0,0,0.85)' } }, requirementContent)),
React.createElement('div', { style: { padding: '12px 20px', borderTop: '1px solid #f0f0f0', textAlign: 'right' } }, React.createElement(Button, { onClick: function() { setReqSpecOpen(false); } }, '关闭'))
)
) : null,
cancelConfirmOpen ? React.createElement('div', { style: styles.modalMask, onClick: function(e) { if (e.target === e.currentTarget) setCancelConfirmOpen(false); } },
React.createElement('div', { style: Object.assign({}, styles.modalBox, { maxWidth: 520 }), onClick: function(e) { e.stopPropagation(); } },
React.createElement('div', { style: styles.modalHeader }, '提示'),
React.createElement('div', { style: Object.assign({}, styles.modalBody, { padding: '20px 24px' }) }, '取消将会丢失所有已填写内容,是否确认?'),
React.createElement('div', { style: { padding: '12px 20px', borderTop: '1px solid #f0f0f0', textAlign: 'right', display: 'flex', gap: 12, justifyContent: 'flex-end' } },
React.createElement(Button, { onClick: function() { setCancelConfirmOpen(false); } }, '否'),
React.createElement(Button, { type: 'primary', onClick: function() { setCancelConfirmOpen(false); setEdited(false); message.info('已返回车辆租赁合同列表(原型)'); } }, '是')
)
)
) : null,
React.createElement('div', { style: styles.footer },
React.createElement(Button, { type: 'primary', onClick: function() {
// 提交并审核:做必填校验(品牌/型号/月租金/保证金/服务项目/费用/生效时间)
var errs = [];
for (var i = 0; i < newVehicleRows.length; i++) {
var r = newVehicleRows[i];
if (!r.brand) errs.push('第' + (i + 1) + '行品牌');
if (!r.model) errs.push('第' + (i + 1) + '行型号');
if (!r.monthRent || String(r.monthRent).trim() === '') errs.push('第' + (i + 1) + '行车辆月租金');
if (!r.deposit || String(r.deposit).trim() === '') errs.push('第' + (i + 1) + '行保证金');
var items = r.serviceItems || [];
for (var j = 0; j < items.length; j++) {
if (!items[j].project) errs.push('第' + (i + 1) + '行服务项目');
if (!items[j].fee || String(items[j].fee).trim() === '') errs.push('第' + (i + 1) + '行服务费用');
if (!items[j].effectiveDate) errs.push('第' + (i + 1) + '行生效时间');
}
}
if (errs.length) { message.warning('请完善必填项:' + errs.join('、')); return; }
setEdited(false);
message.success('租赁合同已提交审核。同时该租赁合同重新触发审核流程;');
} }, '提交并审核'),
React.createElement(Button, { onClick: function() { setEdited(false); message.success('已保存(不校验必填项),仅操作人可查看编辑'); } }, '保存'),
React.createElement(Button, { onClick: function() { if (edited) setCancelConfirmOpen(true); else message.info('已返回车辆租赁合同列表(原型)'); } }, '取消')
)
);
};