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

673 lines
82 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 作为组件变量名 - Axhub 产品原型
// 车辆管理系统 - 新增租赁合同模块整体实现IE11+ 兼容,采用 antd
const Component = function() {
var antd = window.antd;
var Input = antd.Input;
var Select = antd.Select;
var Button = antd.Button;
var DatePicker = antd.DatePicker;
var Modal = antd.Modal;
var message = antd.message;
var Option = Select.Option;
var cs1 = React.useState('');
var customerSearch = cs1[0];
var setCustomerSearch = cs1[1];
var cs2 = React.useState(null);
var selectedCustomer = cs2[0];
var setSelectedCustomer = cs2[1];
var cs3 = React.useState(false);
var customerDropdownOpen = cs3[0];
var setCustomerDropdownOpen = cs3[1];
var cs4 = React.useState('');
var businessDept = cs4[0];
var setBusinessDept = cs4[1];
var cs5 = React.useState('');
var businessOwner = cs5[0];
var setBusinessOwner = cs5[1];
var cs6 = React.useState('');
var ownerFocusError = cs6[0];
var setOwnerFocusError = cs6[1];
var contractOriginalRef = React.useRef(null);
var csContractOriginal = React.useState(null);
var contractOriginal = csContractOriginal[0];
var setContractOriginal = csContractOriginal[1];
var bs1 = React.useState('');
var projectName = bs1[0];
var setProjectName = bs1[1];
var bs2 = React.useState('');
var contractType = bs2[0];
var setContractType = bs2[1];
var bs3 = React.useState('2026-02-16');
var effectiveDate = bs3[0];
var setEffectiveDate = bs3[1];
var bs4 = React.useState('');
var paymentMethod = bs4[0];
var setPaymentMethod = bs4[1];
var bs6 = React.useState('2027-02-16');
var endDate = bs6[0];
var setEndDate = bs6[1];
var bs7 = React.useState('1');
var paymentPeriod = bs7[0];
var setPaymentPeriod = bs7[1];
var bs8 = React.useState('嘉兴羚牛');
var signingCompany = bs8[0];
var setSigningCompany = bs8[1];
var bs9 = React.useState('');
var deliveryProvince = bs9[0];
var setDeliveryProvince = bs9[1];
var bs10 = React.useState('');
var deliveryCity = bs10[0];
var setDeliveryCity = bs10[1];
var bs10b = React.useState(false);
var deliveryRegionOpen = bs10b[0];
var setDeliveryRegionOpen = bs10b[1];
var deliveryRegionClickInsideRef = React.useRef(false);
var bs11 = React.useState('');
var deliveryLocation = bs11[0];
var setDeliveryLocation = bs11[1];
var bs12 = React.useState('');
var remarks = bs12[0];
var setRemarks = bs12[1];
var as1 = React.useState([{ name: '', phone: '', idCard: '' }]);
var authorizedList = as1[0];
var setAuthorizedList = as1[1];
var emptyRentalRow = { brand: '', model: '', plateNo: '', vin: '', monthRent: '', serviceItems: [{ project: '', fee: '', effectiveDate: '' }], deposit: '', remark: '' };
var os1 = React.useState([emptyRentalRow]);
var rentalOrders = os1[0];
var setRentalOrders = os1[1];
var os1b = React.useState(null);
var serviceModalRowIndex = os1b[0];
var setServiceModalRowIndex = os1b[1];
var os1c = React.useState('客户');
var hydrogenBearer = os1c[0];
var setHydrogenBearer = os1c[1];
var os1d = React.useState('预付');
var hydrogenPaymentMethod = os1d[0];
var setHydrogenPaymentMethod = os1d[1];
var os1e = React.useState('');
var hydrogenPrepay = os1e[0];
var setHydrogenPrepay = os1e[1];
var os1f = React.useState('');
var returnHydrogenPrice = os1f[0];
var setReturnHydrogenPrice = os1f[1];
var os1g = React.useState(null);
var plateNoFocusRow = os1g[0];
var setPlateNoFocusRow = os1g[1];
var os1h = React.useState('');
var plateNoSearch = os1h[0];
var setPlateNoSearch = os1h[1];
var os1i = React.useState(null);
var serviceItemFocusRow = os1i[0];
var setServiceItemFocusRow = os1i[1];
var os1j = React.useState('');
var serviceItemSearch = os1j[0];
var setServiceItemSearch = os1j[1];
var os1k = React.useState(null);
var plateNoDropdownRect = os1k[0];
var setPlateNoDropdownRect = os1k[1];
var os2 = React.useState('');
var feeTemplate = os2[0];
var setFeeTemplate = os2[1];
var os3 = React.useState('month');
var billingMethod = os3[0];
var setBillingMethod = os3[1];
var cc1State = React.useState(false);
var cc1 = cc1State[0];
var setCc1 = cc1State[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 reqSpecState = React.useState(false);
var reqSpecOpen = reqSpecState[0];
var setReqSpecOpen = reqSpecState[1];
var formErrorsState = React.useState({});
var formErrors = formErrorsState[0];
var setFormErrors = formErrorsState[1];
var customerList = [
{ id: '1', name: '嘉兴某某物流有限公司', creditCode: '91330400MA2XXXXX1', address: '浙江省嘉兴市南湖区科技大道1号', contact: '张三', phone: '13800138001', email: 'zhangsan@example.com', companyName: '嘉兴某某物流有限公司', companyPhone: '0571-88888888', mailingAddress: '浙江省嘉兴市南湖区科技大道1号', bank: '中国工商银行嘉兴分行', bankAccount: '6222021234567890123', taxId: '91330400MA2XXXXX1' },
{ id: '2', name: '上海某某运输公司', creditCode: '91310000MA2XXXXX2', address: '上海市浦东新区张江高科技园区', contact: '李四', phone: '13800138002', email: 'lisi@example.com', companyName: '上海某某运输公司', companyPhone: '021-66666666', mailingAddress: '上海市浦东新区张江高科技园区', bank: '中国建设银行上海分行', bankAccount: '6217001234567890123', taxId: '91310000MA2XXXXX2' },
{ id: '3', name: '杭州某某租赁有限公司', creditCode: '91330100MA2XXXXX3', address: '浙江省杭州市余杭区未来科技城', contact: '王五', phone: '13800138003', email: 'wangwu@example.com', companyName: '杭州某某租赁有限公司', companyPhone: '0571-99999999', mailingAddress: '浙江省杭州市余杭区未来科技城', bank: '中国农业银行杭州分行', bankAccount: '6228481234567890123', taxId: '91330100MA2XXXXX3' }
];
var deptList = [{ id: 'YW1', name: '业务1部', owners: ['张经理', '李专员', '王专员'] }, { id: 'YW2', name: '业务2部', owners: ['赵经理', '钱专员'] }, { id: 'YW3', name: '业务3部', owners: ['孙经理', '周专员'] }];
var orgList = ['嘉兴羚牛', '上海羚牛', '广东羚牛'];
var regionList = [
{ province: '浙江省', cities: ['杭州市', '宁波市', '嘉兴市', '湖州市'] },
{ province: '上海市', cities: ['上海市'] },
{ province: '广东省', cities: ['广州市', '深圳市', '东莞市'] }
];
var feeTemplates = ['标准费用模板A', '标准费用模板B', '定制费用模板C'];
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 brandList = ['品牌A', '品牌B', '品牌C', '品牌D'];
var modelByBrand = { '品牌A': ['型号A1', '型号A2', '型号A3'], '品牌B': ['型号B1', '型号B2'], '品牌C': ['型号C1', '型号C2', '型号C3'], '品牌D': ['型号D1'] };
var vehicleList = [
{ plateNo: '浙A10001', vin: 'L1234567890ABCDEF', brand: '品牌A', model: '型号A1' },
{ plateNo: '浙B20002', vin: 'L2234567890ABCDEF', brand: '品牌A', model: '型号A2' },
{ plateNo: '沪A30003', vin: 'L3234567890ABCDEF', brand: '品牌B', model: '型号B1' },
{ plateNo: '粤A40004', vin: 'L4234567890ABCDEF', brand: '品牌C', model: '型号C1' }
];
var serviceItemOptions = ['代处理费用', '罚款', '违章处理违约金', '未参加安全培训', '车辆出险', '年检年审违约', '停车费', '设备损坏金(包含易损件)', '清洗费', '上门收车人工费', '上门收车送车行驶费', '上门收车基础服务费', '保险上浮', '保养费用', '补办驾驶证', '补办牌照', '补办营运证', '补办加氢证', '借用备用钥匙', '补配钥匙', '租金', '氢气费-客', '退还车氢量差', '能源费补缴', '能源费退款', '送车上门人工费', '送车上门送车行驶费', '送车上门基础服务费', '保证金', '氢气预付费', '维修费用', 'ETC-客', 'ETC卡缺损费', 'ETC设备缺损费', '电费-客', '未结算保养费', '未结算维修费', '车损费', '工具损坏或丢失费', '证件费', '广告损坏费', '送车服务费', '接车服务费', '补办行驶证', '超赔险', '轮胎磨损费', '无忧包', '轮胎保', '养护保', '尾板'];
var filteredCustomers = customerList.filter(function(c) { return !customerSearch || c.name.indexOf(customerSearch) !== -1; });
var currentDept = deptList.find(function(d) { return d.id === businessDept; });
var ownerOptions = currentDept ? currentDept.owners : [];
var contractCode = (function() {
var cityCode = 'JX';
var typeCode = 'ZL';
var signCode = contractType === '正式合同' ? 'A' : 'B';
var dateStr = effectiveDate ? effectiveDate.replace(/-/g, '') : '20260216';
var deptCode = businessDept || 'YW1';
return cityCode + typeCode + dateStr + deptCode + '01235' + signCode;
})();
var mainVehicleModelsDisplay = (function() {
var models = [];
var seen = {};
for (var i = 0; i < rentalOrders.length; i++) {
var m = rentalOrders[i].model;
if (m && !seen[m]) { seen[m] = true; models.push(m); }
}
return models.join('、');
})();
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 rentalTotalVehicles = rentalOrders.length;
var rentalTotalRentService = rentalOrders.reduce(function(s, r) { return s + (parseFloat(r.monthRent) || 0) + (parseFloat(calcRowServiceFee(r)) || 0); }, 0);
var rentalTotalDeposit = rentalOrders.reduce(function(s, r) { return s + (parseFloat(r.deposit) || 0); }, 0);
var rentalTotalHydrogen = (hydrogenPaymentMethod === '预付' && hydrogenBearer === '客户') ? (parseFloat(hydrogenPrepay) || 0) : 0;
var selectCustomer = function(c) {
setSelectedCustomer(c);
setCustomerSearch(c ? c.name : '');
setCustomerDropdownOpen(false);
};
var deliveryRegionDisplay = deliveryProvince && deliveryCity ? deliveryProvince + ' / ' + deliveryCity : '';
var selectDeliveryRegion = function(province, city) {
setDeliveryProvince(province);
setDeliveryCity(city);
setDeliveryRegionOpen(false);
};
var scrollToCard = function(id) {
var el = document.getElementById(id);
if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' });
};
var handleOwnerFocus = function() {
if (!businessDept) setOwnerFocusError('请先选择业务部门');
else setOwnerFocusError('');
};
var handleOwnerBlur = function() { setOwnerFocusError(''); };
var openContractOriginal = function() {
if (contractOriginal && contractOriginal.file) {
var url = URL.createObjectURL(contractOriginal.file);
window.open(url);
}
};
var validateSubmitAndReview = function() {
var errs = {};
if (!selectedCustomer) errs.customer = '请选择客户';
if (!businessDept) errs.businessDept = '请选择业务部门';
if (!contractOriginal) errs.contractOriginal = '请上传合同原件';
if (!businessOwner) errs.businessOwner = '请选择业务负责人';
if (!projectName || !projectName.trim()) errs.projectName = '请输入项目名称';
if (!contractType) errs.contractType = '请选择合同类型';
if (!effectiveDate) errs.effectiveDate = '请选择生效日期';
if (!paymentMethod) errs.paymentMethod = '请选择付款方式';
if (!endDate) errs.endDate = '请选择结束日期';
if (!paymentPeriod) errs.paymentPeriod = '请选择付款周期';
if (!signingCompany) errs.signingCompany = '请选择签约公司';
if (!deliveryProvince || !deliveryCity) errs.deliveryRegion = '请选择交车区域';
if (!deliveryLocation || !String(deliveryLocation).trim()) errs.deliveryLocation = '请输入交车地点';
var authInvalid = authorizedList.some(function(a) { return !a.name || !a.name.trim() || !a.phone || !a.phone.trim() || !a.idCard || !a.idCard.trim(); });
if (authInvalid) errs.authorizedList = '请完整填写被授权人姓名、联系电话、身份证';
var rentalInvalid = rentalOrders.some(function(r) { return !r.brand || !r.model || !(r.monthRent && String(r.monthRent).trim()) || !(r.deposit && String(r.deposit).trim()); });
if (rentalInvalid) errs.rentalOrders = '请完整填写租赁订单的品牌、型号、车辆月租金、保证金';
if (!hydrogenBearer) errs.hydrogenBearer = '请选择氢费承担方';
if (hydrogenBearer === '客户' && !hydrogenPaymentMethod) errs.hydrogenPaymentMethod = '请选择付款方式';
if (hydrogenBearer === '客户' && hydrogenPaymentMethod === '预付' && (!hydrogenPrepay || !String(hydrogenPrepay).trim())) errs.hydrogenPrepay = '请输入氢气预付款';
if (!returnHydrogenPrice || !String(returnHydrogenPrice).trim()) errs.returnHydrogenPrice = '请输入退还车氢气单价';
if (!feeTemplate) errs.feeTemplate = '请选择费用模板';
if (!billingMethod) errs.billingMethod = '请选择账单计算方式';
setFormErrors(errs);
if (Object.keys(errs).length > 0) {
var firstId = errs.customer || errs.businessDept || errs.businessOwner ? 'card-customer' : (errs.projectName || errs.contractType || errs.effectiveDate || errs.paymentMethod || errs.endDate || errs.paymentPeriod || errs.signingCompany || errs.deliveryRegion || errs.deliveryLocation || errs.contractOriginal) ? 'card-contract' : errs.authorizedList ? 'card-authorized' : (errs.rentalOrders || errs.hydrogenBearer || errs.hydrogenPaymentMethod || errs.hydrogenPrepay || errs.returnHydrogenPrice) ? 'card-rental' : errs.feeTemplate ? 'card-fee' : 'card-billing';
setCc1(false); setCc2(false); setCc3(false); setCc4(false); setCc5(false); setCc6(false);
setTimeout(function() { var el = document.getElementById(firstId); if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' }); }, 100);
return false;
}
return true;
};
var addAuthorized = function() {
setAuthorizedList(authorizedList.concat([{ name: '', phone: '', idCard: '' }]));
};
var removeAuthorized = function(index) {
var next = authorizedList.slice(0);
next.splice(index, 1);
setAuthorizedList(next.length ? next : [{ name: '', phone: '', idCard: '' }]);
};
var updateAuthorized = function(index, field, value) {
var next = authorizedList.slice(0);
var cur = next[index] || {};
var patch = {};
patch[field] = value;
next[index] = Object.assign({}, cur, patch);
setAuthorizedList(next);
};
var addRentalRow = function() {
setRentalOrders(rentalOrders.concat([{ brand: '', model: '', plateNo: '', vin: '', monthRent: '', serviceItems: [{ project: '', fee: '', effectiveDate: '' }], deposit: '', remark: '' }]));
};
var removeRentalRow = function(index) {
var next = rentalOrders.slice(0);
next.splice(index, 1);
setRentalOrders(next.length ? next : [{ brand: '', model: '', plateNo: '', vin: '', monthRent: '', serviceItems: [{ project: '', fee: '', effectiveDate: '' }], deposit: '', remark: '' }]);
};
var updateRentalOrder = function(index, field, value) {
var next = rentalOrders.slice(0);
var cur = next[index] || {};
var newRow = Object.assign({}, cur);
newRow[field] = value;
if (field === 'plateNo') {
var v = vehicleList.find(function(x) { return x.plateNo === value; });
if (v) {
newRow.vin = v.vin || '';
if (v.brand || v.model) {
if (!cur.brand && !cur.model) {
newRow.brand = v.brand || '';
newRow.model = v.model || '';
}
}
} else {
newRow.vin = '';
}
}
if (field === 'brand') newRow.model = '';
next[index] = newRow;
setRentalOrders(next);
};
var openServiceModal = function(index) { setServiceModalRowIndex(index); };
var closeServiceModal = function() { setServiceModalRowIndex(null); };
var addServiceItem = function() {
if (serviceModalRowIndex === null) return;
var next = rentalOrders.slice(0);
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;
setRentalOrders(next);
};
var removeServiceItem = function(siIndex) {
if (serviceModalRowIndex === null) return;
var next = rentalOrders.slice(0);
var row = next[serviceModalRowIndex];
var items = (row.serviceItems || []).slice(0);
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;
setRentalOrders(next);
};
var updateServiceItem = function(siIndex, field, value) {
if (serviceModalRowIndex === null) return;
var next = rentalOrders.slice(0);
var row = next[serviceModalRowIndex];
var items = (row.serviceItems || []).slice(0);
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;
setRentalOrders(next);
};
React.useEffect(function() {
if (!deliveryRegionOpen) return;
var handler = function(e) {
if (deliveryRegionClickInsideRef.current) { deliveryRegionClickInsideRef.current = false; return; }
var el = document.getElementById('delivery-region-wrap');
if (el && !el.contains(e.target)) setDeliveryRegionOpen(false);
};
document.addEventListener('mousedown', handler);
return function() { document.removeEventListener('mousedown', handler); };
}, [deliveryRegionOpen]);
React.useEffect(function() {
if (plateNoFocusRow === null) { setPlateNoDropdownRect(null); return; }
var timer = setTimeout(function() {
var el = document.getElementById('plate-no-input-' + plateNoFocusRow);
if (el && el.getBoundingClientRect) {
var rect = el.getBoundingClientRect();
setPlateNoDropdownRect({ top: rect.bottom + 2, left: rect.left, width: rect.width });
} else { setPlateNoDropdownRect(null); }
}, 0);
return function() { clearTimeout(timer); };
}, [plateNoFocusRow]);
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' },
labelRequired: { color: '#ff4d4f', marginRight: 4 },
input: { width: '100%', padding: '8px 12px', border: '1px solid #d9d9d9', borderRadius: 4, fontSize: 14 },
inputDisabled: { backgroundColor: '#f5f5f5', color: '#999', cursor: 'not-allowed' },
inputError: { borderColor: '#ff4d4f' },
select: { width: '100%', padding: '8px 12px', border: '1px solid #d9d9d9', borderRadius: 4, fontSize: 14 },
textarea: { width: '100%', padding: '8px 12px', border: '1px solid #d9d9d9', borderRadius: 4, fontSize: 14, minHeight: 80, resize: 'vertical' },
errMsg: { color: '#ff4d4f', fontSize: 12, marginTop: 4 },
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' },
authRow: { display: 'flex', gap: 12, alignItems: 'flex-start', marginBottom: 12 },
authInput: { flex: 1, padding: '8px 12px', border: '1px solid #d9d9d9', borderRadius: 4 },
btnDel: { padding: '8px 16px', color: '#ff4d4f', border: '1px solid #ff4d4f', borderRadius: 4, backgroundColor: '#fff', cursor: 'pointer' },
btnAdd: { padding: '8px 16px', color: '#1890ff', border: '1px dashed #1890ff', borderRadius: 4, backgroundColor: '#fff', cursor: 'pointer', marginBottom: 16 },
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 },
btnPrimary: { backgroundColor: '#1890ff', color: '#fff', borderColor: '#1890ff' },
btnDefault: { backgroundColor: '#fff', color: '#333' },
tag: { display: 'inline-block', padding: '2px 8px', marginRight: 8, marginBottom: 4, backgroundColor: '#e6f7ff', color: '#1890ff', borderRadius: 4, fontSize: 12 },
regionCascader: { position: 'absolute', top: '100%', left: 0, right: 0, marginTop: 4, backgroundColor: '#fff', border: '1px solid #d9d9d9', borderRadius: 4, boxShadow: '0 2px 8px rgba(0,0,0,0.12)', zIndex: 10, display: 'flex', minHeight: 200 },
regionCascaderCol: { flex: 1, borderRight: '1px solid #f0f0f0', overflowY: 'auto' },
regionCascaderColLast: { flex: 1 },
regionCascaderItem: { padding: '10px 12px', cursor: 'pointer' },
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: 'top' },
rentalTdCenter: { padding: '8px', borderBottom: '1px solid #f0f0f0', verticalAlign: 'middle' },
rentalInput: { width: '100%', padding: '6px 10px', border: '1px solid #d9d9d9', borderRadius: 4, fontSize: 13 },
rentalInputDisabled: { backgroundColor: '#f5f5f5', color: '#999' },
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 },
btnGroup: { display: 'inline-flex', border: '1px solid #d9d9d9', borderRadius: 4, overflow: 'hidden' },
btnGroupItem: { padding: '8px 16px', border: 'none', borderRight: '1px solid #d9d9d9', backgroundColor: '#fff', color: '#333', cursor: 'pointer', fontSize: 14 },
btnGroupItemLast: { borderRight: 'none' },
btnGroupItemActive: { backgroundColor: '#1890ff', color: '#fff', borderColor: '#1890ff', borderRightColor: '#1890ff' },
feeSectionTitle: { fontSize: 15, fontWeight: 600, color: '#333', marginTop: 20, marginBottom: 10 },
feeSectionTitleFirst: { marginTop: 0 },
modalFormInput: { width: '100%', padding: '8px 12px', border: '1px solid #d9d9d9', borderRadius: 4, fontSize: 14, height: 36, boxSizing: 'border-box' }
};
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 FormItem = function(props) {
var colStyle = props.fullWidth ? styles.formColFull : (props.colStyle ? Object.assign({}, styles.formCol, props.colStyle) : styles.formCol);
return React.createElement('div', { style: colStyle },
React.createElement('label', { style: styles.label }, props.required ? React.createElement('span', { style: styles.labelRequired }, '*') : null, props.label),
props.children,
props.error ? React.createElement('div', { style: styles.errMsg }, props.error) : null
);
};
var customerOptions = customerList.map(function(c) { return React.createElement(Option, { key: c.id, value: c.id }, c.name); });
var customerFields = React.createElement('div', { style: styles.formRow },
React.createElement(FormItem, { label: '客户名称', required: true, error: formErrors.customer }, React.createElement(Select, { placeholder: '请选择或输入搜索客户', style: { width: '100%' }, value: selectedCustomer ? selectedCustomer.id : undefined, onChange: function(id) { var c = customerList.find(function(x) { return x.id === id; }); selectCustomer(c || null); }, showSearch: true, allowClear: true, filterOption: function(input, opt) { return opt.children && String(opt.children).toLowerCase().indexOf((input || '').toLowerCase()) >= 0; }, status: formErrors.customer ? 'error' : undefined }, customerOptions)),
React.createElement(FormItem, { label: '客户统一信用代码' }, React.createElement(Input, { value: selectedCustomer ? selectedCustomer.creditCode : '', disabled: true, style: { width: '100%' } })),
React.createElement(FormItem, { label: '客户地址' }, React.createElement(Input, { value: selectedCustomer ? selectedCustomer.address : '', disabled: true, style: { width: '100%' } })),
React.createElement(FormItem, { label: '客户联系人' }, React.createElement(Input, { value: selectedCustomer ? selectedCustomer.contact : '', disabled: true, style: { width: '100%' } })),
React.createElement(FormItem, { label: '客户电话' }, React.createElement(Input, { value: selectedCustomer ? selectedCustomer.phone : '', disabled: true, style: { width: '100%' } })),
React.createElement(FormItem, { label: '客户电子邮箱' }, React.createElement(Input, { value: selectedCustomer ? selectedCustomer.email : '', disabled: true, style: { width: '100%' } })),
React.createElement(FormItem, { label: '企业名称' }, React.createElement(Input, { value: selectedCustomer ? selectedCustomer.companyName : '', disabled: true, style: { width: '100%' } })),
React.createElement(FormItem, { label: '企业电话' }, React.createElement(Input, { value: selectedCustomer ? selectedCustomer.companyPhone : '', disabled: true, style: { width: '100%' } })),
React.createElement(FormItem, { label: '邮寄地址' }, React.createElement(Input, { value: selectedCustomer ? selectedCustomer.mailingAddress : '', disabled: true, style: { width: '100%' } })),
React.createElement(FormItem, { label: '开户银行' }, React.createElement(Input, { value: selectedCustomer ? selectedCustomer.bank : '', disabled: true, style: { width: '100%' } })),
React.createElement(FormItem, { label: '银行账号' }, React.createElement(Input, { value: selectedCustomer ? selectedCustomer.bankAccount : '', disabled: true, style: { width: '100%' } })),
React.createElement(FormItem, { label: '纳税人识别号' }, React.createElement(Input, { value: selectedCustomer ? selectedCustomer.taxId : '', disabled: true, style: { width: '100%' } })),
React.createElement(FormItem, { label: '业务部门', required: true, error: formErrors.businessDept }, React.createElement(Select, { placeholder: '请选择业务部门', style: { width: '100%' }, value: businessDept || undefined, onChange: function(v) { setBusinessDept(v || ''); setBusinessOwner(''); }, status: formErrors.businessDept ? 'error' : undefined }, deptList.map(function(d, i) { return React.createElement(Option, { key: i, value: d.id }, d.name); }))),
React.createElement(FormItem, { label: '业务负责人', required: true, error: formErrors.businessOwner || ownerFocusError }, React.createElement(Select, { placeholder: businessDept ? '请选择' : '请先选择业务部门', style: { width: '100%' }, value: businessOwner || undefined, onChange: function(v) { setBusinessOwner(v || ''); setOwnerFocusError(''); }, onFocus: handleOwnerFocus, onBlur: handleOwnerBlur, disabled: !businessDept, status: (formErrors.businessOwner || ownerFocusError) ? 'error' : undefined }, ownerOptions.map(function(o, i) { return React.createElement(Option, { key: i, value: o }, o); })))
);
var contractFormRow1 = React.createElement('div', { style: styles.formRow },
React.createElement(FormItem, { label: '项目名称', required: true, error: formErrors.projectName }, React.createElement(Input, { placeholder: '请输入项目名称', value: projectName, onChange: function(e) { setProjectName(e.target.value); }, status: formErrors.projectName ? 'error' : undefined, style: { width: '100%' } })),
React.createElement(FormItem, { label: '合同类型', required: true, error: formErrors.contractType }, React.createElement(Select, { placeholder: '请选择合同类型', style: { width: '100%' }, value: contractType || undefined, onChange: function(v) { setContractType(v || ''); }, status: formErrors.contractType ? 'error' : undefined }, React.createElement(Option, { value: '正式合同' }, '正式合同'), React.createElement(Option, { value: '试用合同' }, '试用合同'))),
React.createElement(FormItem, { label: '生效日期', required: true, error: formErrors.effectiveDate }, React.createElement(DatePicker, { style: { width: '100%' }, format: 'YYYY-MM-DD', placeholder: '请选择生效日期', value: effectiveDate && window.moment ? window.moment(effectiveDate, 'YYYY-MM-DD') : null, onChange: function(d, dateStr) { setEffectiveDate(dateStr || ''); }, status: formErrors.effectiveDate ? 'error' : undefined })),
React.createElement(FormItem, { label: '付款方式', required: true, error: formErrors.paymentMethod }, React.createElement(Select, { placeholder: '请选择付款方式', style: { width: '100%' }, value: paymentMethod || undefined, onChange: function(v) { setPaymentMethod(v || ''); }, status: formErrors.paymentMethod ? 'error' : undefined }, React.createElement(Option, { value: '预付' }, '预付'), React.createElement(Option, { value: '后付' }, '后付'))),
React.createElement(FormItem, { label: '主要车型' }, React.createElement('div', { style: { padding: '8px 12px', minHeight: 36, border: '1px solid #d9d9d9', borderRadius: 4, backgroundColor: '#f5f5f5', display: 'flex', flexWrap: 'wrap', gap: 8, alignItems: 'center' } }, mainVehicleModelsDisplay ? mainVehicleModelsDisplay.split('、').map(function(m, i) { return React.createElement('span', { key: i, style: styles.tag }, m); }) : React.createElement('span', { style: { color: '#999' } }, '根据租赁订单自动反写'))),
React.createElement(FormItem, { label: '结束日期', required: true, error: formErrors.endDate }, React.createElement(DatePicker, { style: { width: '100%' }, format: 'YYYY-MM-DD', placeholder: '请选择结束日期', value: endDate && window.moment ? window.moment(endDate, 'YYYY-MM-DD') : null, onChange: function(d, dateStr) { setEndDate(dateStr || ''); }, status: formErrors.endDate ? 'error' : undefined })),
React.createElement(FormItem, { label: '付款周期', required: true, error: formErrors.paymentPeriod }, React.createElement(Select, { placeholder: '请选择', style: { width: '100%' }, value: paymentPeriod || undefined, onChange: function(v) { setPaymentPeriod(v || ''); }, status: formErrors.paymentPeriod ? 'error' : undefined }, [1,2,3,4,5,6,7,8,9,10,11,12].map(function(n) { return React.createElement(Option, { key: n, value: String(n) }, n + '个月'); }))),
React.createElement(FormItem, { label: '签约公司', required: true, error: formErrors.signingCompany }, React.createElement(Select, { placeholder: '请选择', style: { width: '100%' }, value: signingCompany || undefined, onChange: function(v) { setSigningCompany(v || ''); }, status: formErrors.signingCompany ? 'error' : undefined }, orgList.map(function(o, i) { return React.createElement(Option, { key: i, value: o }, o); }))),
React.createElement('div', { style: styles.formCol },
React.createElement(FormItem, { label: '交车区域', required: true, error: formErrors.deliveryRegion }, React.createElement('div', { id: 'delivery-region-wrap', style: { position: 'relative' } }, React.createElement(Input, { style: Object.assign({}, formErrors.deliveryRegion ? { borderColor: '#ff4d4f' } : {}, { cursor: 'pointer', caretColor: 'transparent', width: '100%' }), placeholder: '请选择省-市', value: deliveryRegionDisplay, readOnly: true, onClick: function() { setDeliveryRegionOpen(!deliveryRegionOpen); } }), deliveryRegionOpen ? React.createElement('div', { style: styles.regionCascader, onMouseDown: function() { deliveryRegionClickInsideRef.current = true; } }, React.createElement('div', { style: styles.regionCascaderCol }, regionList.map(function(r, i) { var isActive = r.province === deliveryProvince; return React.createElement('div', { key: i, style: Object.assign({}, styles.regionCascaderItem, isActive ? { backgroundColor: '#e6f7ff', color: '#1890ff' } : {}), onMouseEnter: function(e) { if (!isActive) e.currentTarget.style.backgroundColor = '#f5f5f5'; }, onMouseLeave: function(e) { if (!isActive) e.currentTarget.style.backgroundColor = 'transparent'; }, onMouseDown: function(e) { e.preventDefault(); setDeliveryProvince(r.province); setDeliveryCity(''); } }, r.province); })), React.createElement('div', { style: styles.regionCascaderColLast }, deliveryProvince ? (regionList.find(function(x) { return x.province === deliveryProvince; }) || { cities: [] }).cities.map(function(c, i) { var isActive = c === deliveryCity; return React.createElement('div', { key: i, style: Object.assign({}, styles.regionCascaderItem, isActive ? { backgroundColor: '#e6f7ff', color: '#1890ff' } : {}), onMouseEnter: function(e) { if (!isActive) e.currentTarget.style.backgroundColor = '#f5f5f5'; }, onMouseLeave: function(e) { if (!isActive) e.currentTarget.style.backgroundColor = 'transparent'; }, onMouseDown: function(e) { e.preventDefault(); selectDeliveryRegion(deliveryProvince, c); } }, c); }) : React.createElement('div', { style: { padding: 16, color: '#999', fontSize: 13 } }, '请先选择省'))) : null))
),
React.createElement(FormItem, { label: '交车地点', required: true, error: formErrors.deliveryLocation }, React.createElement(Input, { placeholder: '请输入交车地点', value: deliveryLocation, onChange: function(e) { setDeliveryLocation(e.target.value); }, status: formErrors.deliveryLocation ? 'error' : undefined, style: { width: '100%' } }))
);
var contractFormRow1Part2 = React.createElement('div', { style: styles.formRow },
React.createElement(FormItem, { label: '合同原件', required: true, error: formErrors.contractOriginal },
contractOriginal
? React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' } },
React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' } },
React.createElement('a', { href: '#', style: { color: '#1890ff' }, onClick: function(e) { e.preventDefault(); openContractOriginal(); } }, contractOriginal.name),
contractOriginal.size || contractOriginal.uploadTime ? React.createElement('span', { style: { color: '#999', fontSize: 12 } }, (contractOriginal.size ? contractOriginal.size : '') + (contractOriginal.size && contractOriginal.uploadTime ? ' · ' : '') + (contractOriginal.uploadTime || '')) : null
),
React.createElement(Button, { type: 'button', size: 'small', danger: true, onClick: function() { setContractOriginal(null); } }, '删除')
)
: React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 8 } },
React.createElement('input', { ref: contractOriginalRef, type: 'file', style: { display: 'none' }, onChange: function(e) {
var f = e.target.files && e.target.files[0];
if (f) {
var sizeDisplay = f.size >= 1024 * 1024 ? (f.size / 1024 / 1024).toFixed(1) + ' MB' : (f.size / 1024).toFixed(1) + ' KB';
var now = window.moment ? window.moment() : new Date();
var uploadTimeStr = window.moment ? now.format('YYYY-MM-DD HH:mm') : now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0') + '-' + String(now.getDate()).padStart(2, '0') + ' ' + String(now.getHours()).padStart(2, '0') + ':' + String(now.getMinutes()).padStart(2, '0');
setContractOriginal({ name: f.name, file: f, size: sizeDisplay, uploadTime: uploadTimeStr });
}
e.target.value = '';
} }),
React.createElement(Button, { type: 'default', style: { padding: '8px 16px', border: '1px solid #d9d9d9', borderRadius: 4, backgroundColor: '#fff', color: '#333', cursor: 'pointer', fontSize: 14 }, onClick: function() { if (contractOriginalRef.current) contractOriginalRef.current.click(); } }, '上传附件')
)
)
);
var contractFormRow2 = React.createElement('div', { style: styles.formRow }, React.createElement(FormItem, { label: '备注', fullWidth: true }, React.createElement(Input.TextArea, { placeholder: '请输入备注信息', value: remarks, onChange: function(e) { setRemarks(e.target.value); }, style: styles.textarea, rows: 4 })));
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: { color: '#ff4d4f', marginRight: 4 } }, '*'), '被授权人姓名'), React.createElement('span', { style: { flex: 1, fontWeight: 600, fontSize: 13 } }, React.createElement('span', { style: { color: '#ff4d4f', marginRight: 4 } }, '*'), '被授权人联系电话'), React.createElement('span', { style: { flex: 1, fontWeight: 600, fontSize: 13 } }, React.createElement('span', { style: { color: '#ff4d4f', marginRight: 4 } }, '*'), '被授权人身份证'), React.createElement('span', { style: { flex: '0 0 80px' } })),
authorizedList.map(function(item, index) { return React.createElement('div', { key: index, style: styles.authRow }, React.createElement(Input, { style: Object.assign({}, styles.authInput, formErrors.authorizedList ? { borderColor: '#ff4d4f' } : {}, { flex: 1 }), placeholder: '请输入被授权人姓名', value: item.name, onChange: function(e) { updateAuthorized(index, 'name', e.target.value); } }), React.createElement(Input, { style: Object.assign({}, styles.authInput, formErrors.authorizedList ? { borderColor: '#ff4d4f' } : {}, { flex: 1 }), placeholder: '请输入被授权人联系电话', value: item.phone, onChange: function(e) { updateAuthorized(index, 'phone', e.target.value); } }), React.createElement(Input, { style: Object.assign({}, styles.authInput, formErrors.authorizedList ? { borderColor: '#ff4d4f' } : {}, { flex: 1 }), placeholder: '请输入被授权人身份证号', value: item.idCard, onChange: function(e) { updateAuthorized(index, 'idCard', e.target.value); } }), React.createElement(Button, { type: 'button', danger: true, onClick: function() { removeAuthorized(index); } }, '删除')); }),
formErrors.authorizedList ? React.createElement('div', { style: styles.errMsg }, formErrors.authorizedList) : null,
React.createElement(Button, { type: 'dashed', style: { width: '100%', marginBottom: 16 }, onClick: addAuthorized }, '添加一行')
);
var hydrogenFormRow = (function() {
var hydrogenFields = [];
hydrogenFields.push(React.createElement(FormItem, { label: '氢费承担方', required: true, error: formErrors.hydrogenBearer }, React.createElement(Select, { style: { width: '100%' }, value: hydrogenBearer || undefined, onChange: function(v) { setHydrogenBearer(v || ''); setHydrogenPaymentMethod(v === '客户' ? '预付' : ''); }, status: formErrors.hydrogenBearer ? 'error' : undefined }, React.createElement(Option, { value: '我方' }, '我方'), React.createElement(Option, { value: '客户' }, '客户'))));
if (hydrogenBearer === '客户') { hydrogenFields.push(React.createElement(FormItem, { label: '付款方式', required: true, error: formErrors.hydrogenPaymentMethod }, React.createElement(Select, { style: { width: '100%' }, value: hydrogenPaymentMethod || undefined, onChange: function(v) { setHydrogenPaymentMethod(v || ''); }, status: formErrors.hydrogenPaymentMethod ? 'error' : undefined }, React.createElement(Option, { value: '预付' }, '预付'), React.createElement(Option, { value: '月付款' }, '月付款'), React.createElement(Option, { value: '自行结算' }, '自行结算')))); }
var hydrogenPrepayInput = React.createElement(Input, { placeholder: '0.00', value: hydrogenPrepay, onChange: function(e) { setHydrogenPrepay(e.target.value); }, addonAfter: '元', status: formErrors.hydrogenPrepay ? 'error' : undefined, style: { width: '100%' } });
var returnHydrogenInput = React.createElement(Input, { placeholder: '0.00', value: returnHydrogenPrice, onChange: function(e) { setReturnHydrogenPrice(e.target.value); }, addonAfter: '元', status: formErrors.returnHydrogenPrice ? 'error' : undefined, style: { width: '100%' } });
var returnHydrogenColStyle = hydrogenPaymentMethod === '预付' ? { flex: '1 1 0', minWidth: 180 } : { flex: '0 0 calc(50% - 8px)', minWidth: 180 };
hydrogenFields.push(React.createElement('div', { key: 'hydrogen-amount-row', style: { display: 'flex', gap: 16, flex: '1 1 100%' } }, hydrogenPaymentMethod === '预付' ? React.createElement(FormItem, { label: '氢气预付款', required: true, error: formErrors.hydrogenPrepay, colStyle: { flex: '1 1 0', minWidth: 180 } }, hydrogenPrepayInput) : null, React.createElement(FormItem, { label: '退还车氢气单价', required: true, error: formErrors.returnHydrogenPrice, colStyle: returnHydrogenColStyle }, returnHydrogenInput)));
return React.createElement.apply(React, ['div', { style: Object.assign({}, styles.formRow, { marginTop: 20 }) }].concat(hydrogenFields));
})();
var plateNoOptions = vehicleList.map(function(v) { return React.createElement(Option, { key: v.plateNo, value: v.plateNo }, v.plateNo); });
var rentalTableBody = rentalOrders.map(function(row, idx) {
var modelOpts = row.brand ? (modelByBrand[row.brand] || []) : [];
return React.createElement('tr', { key: idx },
React.createElement('td', { style: styles.rentalTdCenter }, idx + 1),
React.createElement('td', { style: styles.rentalTd }, React.createElement(Select, { style: { width: '100%', minWidth: 90 }, value: row.brand || undefined, onChange: function(v) { updateRentalOrder(idx, 'brand', v || ''); }, placeholder: '请选择' }, brandList.map(function(b, i) { return React.createElement(Option, { key: i, value: b }, b); }))),
React.createElement('td', { style: styles.rentalTd }, React.createElement(Select, { style: { width: '100%', minWidth: 90 }, value: row.model || undefined, onChange: function(v) { updateRentalOrder(idx, 'model', v || ''); }, disabled: !row.brand, placeholder: '请选择' }, modelOpts.map(function(m, i) { return React.createElement(Option, { key: i, value: m }, m); }))),
React.createElement('td', { style: styles.rentalTd }, React.createElement(Select, { style: { width: '100%' }, placeholder: '请选择或输入搜索', value: row.plateNo || undefined, onChange: function(v) { updateRentalOrder(idx, 'plateNo', v || ''); }, showSearch: true, allowClear: true, filterOption: function(input, opt) { return opt && opt.children && String(opt.children).toLowerCase().indexOf((input || '').toLowerCase()) >= 0; } }, plateNoOptions)),
React.createElement('td', { style: styles.rentalTd }, React.createElement(Input, { value: row.vin || '', disabled: true, style: { width: '100%' } })),
React.createElement('td', { style: styles.rentalTd }, React.createElement('div', { style: { display: 'flex', alignItems: 'center' } }, React.createElement(Input, { placeholder: '0.00', value: row.monthRent || '', onChange: function(e) { updateRentalOrder(idx, 'monthRent', e.target.value); }, style: styles.rentalInput }), React.createElement('span', { style: { marginLeft: 4, whiteSpace: 'nowrap' } }, '元'))),
React.createElement('td', { style: styles.rentalTdCenter }, React.createElement(Button, { type: 'link', size: 'small', onClick: function() { openServiceModal(idx); } }, '管理')),
React.createElement('td', { style: styles.rentalTdCenter }, calcRowServiceFee(row) + ' 元'),
React.createElement('td', { style: styles.rentalTd }, React.createElement('div', { style: { display: 'flex', alignItems: 'center' } }, React.createElement(Input, { placeholder: '0.00', value: row.deposit || '', onChange: function(e) { updateRentalOrder(idx, 'deposit', e.target.value); }, style: styles.rentalInput }), React.createElement('span', { style: { marginLeft: 4, whiteSpace: 'nowrap' } }, '元'))),
React.createElement('td', { style: styles.rentalTd }, React.createElement(Input, { placeholder: '备注', value: row.remark || '', onChange: function(e) { updateRentalOrder(idx, 'remark', e.target.value); }, style: Object.assign({}, styles.rentalInput, { width: '100%' }) })),
React.createElement('td', { style: styles.rentalTdCenter }, React.createElement(Button, { type: 'link', size: 'small', danger: true, onClick: function() { removeRentalRow(idx); } }, '删除'))
);
});
var rentalSummary = React.createElement('div', { style: styles.summaryList },
React.createElement('div', { style: styles.summaryListItem }, React.createElement('span', { style: styles.summaryListLabel }, '租赁车辆数'), React.createElement('span', { style: styles.summaryListValue }, rentalTotalVehicles + ' 辆')),
React.createElement('div', { style: styles.summaryListItem }, React.createElement('span', { style: styles.summaryListLabel }, '租金及服务费合计'), React.createElement('span', { style: styles.summaryListValue }, rentalTotalRentService.toFixed(2) + ' 元')),
React.createElement('div', { style: styles.summaryListItem }, React.createElement('span', { style: styles.summaryListLabel }, '保证金总额'), React.createElement('span', { style: styles.summaryListValue }, rentalTotalDeposit.toFixed(2) + ' 元')),
React.createElement('div', { style: styles.summaryListItem }, React.createElement('span', { style: styles.summaryListLabel }, '氢气预付款金额'), React.createElement('span', { style: styles.summaryListValue }, rentalTotalHydrogen.toFixed(2) + ' 元'))
);
var reqStarStyle = { color: '#ff4d4f', marginRight: 4 };
var reqStar = React.createElement('span', { style: reqStarStyle }, '*');
var rentalTh1 = React.createElement('th', { style: Object.assign({}, styles.rentalTh, { width: 50, verticalAlign: 'middle' }) }, '序号');
var rentalTh2 = React.createElement('th', { style: Object.assign({}, styles.rentalTh, { width: 100 }) }, reqStar, '品牌');
var rentalTh3 = React.createElement('th', { style: Object.assign({}, styles.rentalTh, { width: 100 }) }, reqStar, '型号');
var rentalTh4 = React.createElement('th', { style: Object.assign({}, styles.rentalTh, { width: 120 }) }, '车牌号');
var rentalTh5 = React.createElement('th', { style: Object.assign({}, styles.rentalTh, { width: 160 }) }, '车辆识别代码');
var rentalTh6 = React.createElement('th', { style: Object.assign({}, styles.rentalTh, { width: 120 }) }, reqStar, '车辆月租金');
var rentalTh7 = React.createElement('th', { style: Object.assign({}, styles.rentalTh, { width: 80, verticalAlign: 'middle' }) }, '服务费项目');
var rentalTh8 = React.createElement('th', { style: Object.assign({}, styles.rentalTh, { width: 90, verticalAlign: 'middle' }) }, '服务费');
var rentalTh9 = React.createElement('th', { style: Object.assign({}, styles.rentalTh, { width: 100 }) }, reqStar, '保证金');
var rentalTh10 = React.createElement('th', { style: Object.assign({}, styles.rentalTh, { width: 80 }) }, '备注');
var rentalTh11 = React.createElement('th', { style: Object.assign({}, styles.rentalTh, { width: 60, verticalAlign: 'middle' }) }, '操作');
var rentalTableThead = React.createElement('thead', null, React.createElement('tr', null, rentalTh1, rentalTh2, rentalTh3, rentalTh4, rentalTh5, rentalTh6, rentalTh7, rentalTh8, rentalTh9, rentalTh10, rentalTh11));
var rentalTableTbody = React.createElement('tbody', null, rentalTableBody);
var rentalTableEl = React.createElement('table', { style: styles.rentalTable }, rentalTableThead, rentalTableTbody);
var rentalTableWrap = React.createElement('div', { style: { overflowX: 'auto', marginBottom: 16 } }, rentalTableEl);
var rentalContent = React.createElement('div', null, rentalSummary, formErrors.rentalOrders ? React.createElement('div', { style: styles.errMsg }, formErrors.rentalOrders) : null, rentalTableWrap, React.createElement(Button, { type: 'dashed', style: { marginTop: 12, width: '100%' }, onClick: addRentalRow }, '添加一行'), hydrogenFormRow);
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) {
var td1 = React.createElement('td', { style: styles.rentalTd }, r.project);
var td2 = React.createElement('td', { style: styles.rentalTd }, r.standard);
var td3 = React.createElement('td', { style: styles.rentalTd }, r.serviceFee);
return React.createElement('tr', { key: i }, td1, td2, td3);
};
var makeFeeRow5 = function(r, i) {
var td1 = React.createElement('td', { style: styles.rentalTd }, r.category);
var td2 = React.createElement('td', { style: styles.rentalTd }, r.part);
var td3 = React.createElement('td', { style: styles.rentalTd }, r.partName);
var td4 = React.createElement('td', { style: styles.rentalTd }, r.qty);
var td5 = React.createElement('td', { style: styles.rentalTd }, r.feeDetail);
return React.createElement('tr', { key: i }, td1, td2, td3, td4, td5);
};
var feeCertRows = feeTemplateCertFees.map(makeFeeRow3);
var feePenaltyRows = feeTemplatePenaltyFees.map(makeFeeRow3);
var feeConsumablesRows = feeTemplateConsumables.map(makeFeeRow5);
var feeOtherRows = feeTemplateOtherFees.map(makeFeeRow3);
var feeCertTable = React.createElement('table', { style: styles.rentalTable }, React.createElement('thead', null, feeTableHeader3), React.createElement('tbody', null, feeCertRows));
var feePenaltyTable = React.createElement('table', { style: styles.rentalTable }, React.createElement('thead', null, feeTableHeader3), React.createElement('tbody', null, feePenaltyRows));
var feeConsumablesTable = React.createElement('table', { style: styles.rentalTable }, React.createElement('thead', null, feeTableHeader5), React.createElement('tbody', null, feeConsumablesRows));
var feeOtherTable = React.createElement('table', { style: styles.rentalTable }, React.createElement('thead', null, feeTableHeader3), React.createElement('tbody', null, feeOtherRows));
var feeTemplateSelect = React.createElement('div', { style: styles.formRow }, React.createElement(FormItem, { label: '选择费用模板', required: true, error: formErrors.feeTemplate }, React.createElement(Select, { placeholder: '请选择费用模板', style: { width: '100%' }, value: feeTemplate || undefined, onChange: function(v) { setFeeTemplate(v || ''); }, status: formErrors.feeTemplate ? 'error' : undefined }, feeTemplates.map(function(f, i) { return React.createElement(Option, { key: i, value: f }, f); }))));
var feeTemplateBody = feeTemplate ? 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
) : null;
var feeContent = React.createElement('div', null, feeTemplateSelect, feeTemplateBody);
var billingBtnBase = { padding: '12px 16px', border: '1px solid #d9d9d9', borderRadius: 0, backgroundColor: '#fff', color: '#333', cursor: 'pointer', fontSize: 14, textAlign: 'left', flex: 1, minWidth: 0, width: 0, height: 'auto', display: 'flex', flexDirection: 'column', alignItems: 'flex-start', justifyContent: 'flex-start', overflow: 'visible' };
var billingContent = React.createElement('div', null,
React.createElement('div', { style: { display: 'flex', border: formErrors.billingMethod ? '1px solid #ff4d4f' : '1px solid #d9d9d9', borderRadius: 4, overflow: 'hidden', alignItems: 'stretch' } },
React.createElement(Button, { type: 'button', style: Object.assign({}, billingBtnBase, { borderRight: '1px solid #d9d9d9' }, billingMethod === 'month' ? { backgroundColor: '#1890ff', color: '#fff', borderColor: '#1890ff' } : {}), onClick: function() { setBillingMethod('month'); } }, React.createElement('div', { style: { width: '100%' } }, React.createElement('div', { style: { fontWeight: 600, marginBottom: 6 } }, '按自然月结算'), React.createElement('div', { style: { fontSize: 12, opacity: 0.9, whiteSpace: 'normal', wordBreak: 'break-word', lineHeight: 1.5 } }, '账单按照第一个月计费日期开始-当月最后一天为第一期之后按自然月方式形成每一期账单例如付款周期为2个月则第二期账单从2月1日-3月31日。'))),
React.createElement(Button, { type: 'button', style: Object.assign({}, billingBtnBase, billingMethod === 'period' ? { backgroundColor: '#1890ff', color: '#fff', borderColor: '#1890ff' } : {}), onClick: function() { setBillingMethod('period'); } }, React.createElement('div', { style: { width: '100%' } }, React.createElement('div', { style: { fontWeight: 600, marginBottom: 6 } }, '按付款周期天数结算'), React.createElement('div', { style: { fontSize: 12, opacity: 0.9, whiteSpace: 'normal', wordBreak: 'break-word', lineHeight: 1.5 } }, '账单按照合同基本信息中付款周期实际天数形成一期账单例如付款周期为60天则该账单账期为60天每60天会自动生成新一期账单。')))
),
formErrors.billingMethod ? React.createElement('div', { style: styles.errMsg }, formErrors.billingMethod) : null
);
var serviceModalRows = serviceModalRowIndex !== null && rentalOrders[serviceModalRowIndex] ? rentalOrders[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) { var filteredServiceOpts = serviceItemOptions.filter(function(o) { return !serviceItemSearch || o.indexOf(serviceItemSearch) !== -1; }); 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 reqSpecH1 = { fontSize: 16, fontWeight: 600, marginBottom: 12, color: '#333' };
var reqSpecH2 = { fontSize: 14, fontWeight: 600, marginTop: 16, marginBottom: 8, color: '#333' };
var reqSpecH3 = { fontSize: 13, fontWeight: 600, marginTop: 10, marginBottom: 6, color: '#333' };
var reqSpecP = { fontSize: 13, lineHeight: 1.6, marginBottom: 6, color: '#555' };
var reqSpecLi = { fontSize: 13, lineHeight: 1.6, marginBottom: 4, marginLeft: 20, color: '#555' };
var reqSpecBlock = { marginBottom: 8 };
var reqSpecDoc = React.createElement('div', { style: { padding: '0 4px' } },
React.createElement('div', { style: reqSpecBlock }, React.createElement('div', { style: reqSpecH2 }, '1.面包屑:'), React.createElement('div', { style: reqSpecP }, '1.1.业务管理-车辆租赁合同-新增租赁合同')),
React.createElement('div', { style: reqSpecBlock }, React.createElement('div', { style: reqSpecH2 }, '2.客户基本信息卡片:'), React.createElement('div', { style: reqSpecP }, '2.1.用于从客户列表中选择客户,并将该合同绑定业务部门及业务负责人;'), React.createElement('div', { style: reqSpecLi }, '2.1.1.客户名称:必选项,选择器,支持从输入框内输入内容进行模糊搜索,从客户信息列表中选择对应客户;'), React.createElement('div', { style: reqSpecLi }, '2.1.2.客户统一信用代码:输入框(禁用状态),根据所选客户自动从客户信息列表中拉取对应客户-「信用代码」字段;'), React.createElement('div', { style: reqSpecLi }, '2.1.3.客户地址:输入框(禁用状态),根据所选客户自动从客户信息列表中拉取对应客户-「客户地址」字段;'), React.createElement('div', { style: reqSpecLi }, '2.1.4.客户联系人:输入框(禁用状态),根据所选客户自动从客户信息列表中拉取对应客户-「客户联系人」字段;'), React.createElement('div', { style: reqSpecLi }, '2.1.5.客户电话:输入框(禁用状态),根据所选客户自动从客户信息列表中拉取对应客户-「客户电话」字段;'), React.createElement('div', { style: reqSpecLi }, '2.1.6.客户电子邮箱:输入框(禁用状态),根据所选客户自动从客户信息列表中拉取对应客户-「客户电子邮箱」字段;'), React.createElement('div', { style: reqSpecLi }, '2.1.7.企业名称:输入框(禁用状态),根据所选客户自动从客户信息列表中拉取对应客户-「企业名称」字段;'), React.createElement('div', { style: reqSpecLi }, '2.1.8.企业电话:输入框(禁用状态),根据所选客户自动从客户信息列表中拉取对应客户-「企业电话」字段;'), React.createElement('div', { style: reqSpecLi }, '2.1.9.邮寄地址:输入框(禁用状态),根据所选客户自动从客户信息列表中拉取对应客户-「邮寄地址」字段;'), React.createElement('div', { style: reqSpecLi }, '2.1.10.开户银行:输入框(禁用状态),根据所选客户自动从客户信息列表中拉取对应客户-「开户银行」字段;'), React.createElement('div', { style: reqSpecLi }, '2.1.11.银行账号:输入框(禁用状态),根据所选客户自动从客户信息列表中拉取对应客户-「银行账号」字段;'), React.createElement('div', { style: reqSpecLi }, '2.1.12.纳税人识别号:输入框(禁用状态),根据所选客户自动从客户信息列表中拉取对应客户-「纳税人识别号」字段;'), React.createElement('div', { style: reqSpecLi }, '2.1.13.业务部门:必选项,选择器,从部门表中选择该租赁合同对应部门;'), React.createElement('div', { style: reqSpecLi }, '2.1.14.业务负责人:必选项,选择器,从已选业务部门下拉取对应业务负责人,未选择业务部门时,业务负责人输入框获取焦点时进行错误提示:请先选择业务部门;'), React.createElement('div', { style: reqSpecLi }, '2.1.15.合同原件必填项点击上传按钮上传本地文件支持doc、docx、pdf等格式。已上传则显示文件名后方为删除删除后可重新点击上传附件进行重新上传')),
React.createElement('div', { style: reqSpecBlock }, React.createElement('div', { style: reqSpecH2 }, '3.合同基本信息卡片:'), React.createElement('div', { style: reqSpecP }, '3.1.用于定义租赁合同基本情况和付款方式;'), React.createElement('div', { style: reqSpecLi }, '3.1.1.项目名称:必填项,输入框,用于定义该合同对应项目名称,默认提示信息"请输入项目名称"'), React.createElement('div', { style: reqSpecLi }, '3.1.2.合同编码:按照合同编码规则自动生成;'), React.createElement('div', { style: reqSpecLi }, '合同编码规则:[城市简写][合同类型][签约时间][业务部门代码][顺序流水号][签署状态]'), React.createElement('div', { style: reqSpecLi }, '3.1.2.1.地区简写如上海为SH嘉兴为JX'), React.createElement('div', { style: reqSpecLi }, '3.1.2.2.合同类型采购合同为CG、租赁合同为ZL、自营合同为ZY'), React.createElement('div', { style: reqSpecLi }, '3.1.2.3.签约时间显示合同签约时间如20260216'), React.createElement('div', { style: reqSpecLi }, '3.1.2.4.业务部门代码显示合同签约业务部门信息如YW1代表业务1部YW2代表业务2部'), React.createElement('div', { style: reqSpecLi }, '3.1.2.5.顺序流水号实施5位编号补零规则如01235代表是集团第1235份合同'), React.createElement('div', { style: reqSpecLi }, '3.1.2.6.签署状态A为正式合同B为试用合同'), React.createElement('div', { style: reqSpecLi }, '如编号为JXZL20260216YW101235A则代表嘉兴业务1部在2026年2月16日签署的租赁正式合同在集团中为第1235份'), React.createElement('div', { style: reqSpecLi }, '3.1.3.合同类型:必选项,选择器,合同类型分为「正式合同」「试用合同」;'), React.createElement('div', { style: reqSpecLi }, '3.1.4.生效日期必选项日期选择器格式为YYYY-MM-DD精确至天'), React.createElement('div', { style: reqSpecLi }, '3.1.5.付款方式:必选项,付款方式分为「预付」「后付」两种;'), React.createElement('div', { style: reqSpecLi }, '3.1.5.1.如果选择预付,则每笔账单以付款时间及账单计算方式,在账单日自动提前生成下月账单,同时生成时以消息/待办提醒对应业务人员;'), React.createElement('div', { style: reqSpecLi }, '3.1.5.2.如果选择后付,则每笔账单以付款时间及账单计算方式,在账单日自动提前生成下月账单,但只在退还车时,才以消息/待办提醒合同对应业务人员;'), React.createElement('div', { style: reqSpecLi }, '3.1.6.主要车型:输入框(禁用状态),根据租赁订单信息中所选车型,自动反写入输入框并以标签形式显示,支持多车型显示;'), React.createElement('div', { style: reqSpecLi }, '3.1.7.结束日期必选项日期选择器格式为YYYY-MM-DD精确至天'), React.createElement('div', { style: reqSpecLi }, '3.1.7.1.合同结束日期前30天将以消息提醒方式提醒'), React.createElement('div', { style: reqSpecLi }, '3.1.8.付款周期必选项选择器支持1个月-12个月 12种付款周期账单将以此周期进行定时生成'), React.createElement('div', { style: reqSpecLi }, '3.1.9.签约公司:必选项,选择器,从组织机构表中获取所有根组织机构(如嘉兴羚牛、上海羚牛、广东羚牛等),默认显示录入合同人员所在机构;'), React.createElement('div', { style: reqSpecLi }, '3.1.10.交车区域:必选项,地区选择器,支持省-市2级选择区域后该任务生成交车任务时会自动推送至该区域负责运维人员'), React.createElement('div', { style: reqSpecLi }, '3.1.11.交车地点:输入框,支持自定义输入交车地点;'), React.createElement('div', { style: reqSpecLi }, '3.1.12.备注:文本域,支持自定义输入备注信息;'))
);
var reqSpecDocPart2 = React.createElement('div', { style: { padding: '0 4px' } },
React.createElement('div', { style: reqSpecBlock }, React.createElement('div', { style: reqSpecH2 }, '4.被授权人信息卡片:'), React.createElement('div', { style: reqSpecP }, '4.1.用于定义租赁合同相关被授权人相关信息被授权人交车单完成时需要通过手机短信调取E签宝进行签字确认'), React.createElement('div', { style: reqSpecLi }, '4.1.1.被授权人:必填项,输入框,用于输入被授权人信息;'), React.createElement('div', { style: reqSpecLi }, '4.1.2.被授权人联系电话必填项输入框用于输入被授权人联系电话该电话后续需要接收E签宝签字链接'), React.createElement('div', { style: reqSpecLi }, '4.1.3.被授权人身份证:必填项,输入框,用于输入被授权人身份证信息;'), React.createElement('div', { style: reqSpecLi }, '4.1.4.支持通过新增/删除一行的方式,创建或管理多个授权人,后续交车单完成时可选择多个授权人;')),
React.createElement('div', { style: reqSpecBlock }, React.createElement('div', { style: reqSpecH2 }, '5.租赁订单信息卡片:'), React.createElement('div', { style: reqSpecP }, '5.1.用于定义租赁订单租赁车辆品牌、型号、月租金、服务费、保证金等相关信息;'), React.createElement('div', { style: reqSpecLi }, '5.1.1.卡片上方为租赁车辆总计数据,包括租赁车辆数、租金及服务费合计、保证金总额、氢气预付款金额等相关信息;'), React.createElement('div', { style: reqSpecLi }, '5.1.1.1.租赁车辆数:显示下方租赁订单信息包含多少辆车;'), React.createElement('div', { style: reqSpecLi }, '5.1.1.2.租金及服务费合计:显示下方租赁订单信息中车辆租金总额及服务费总额;'), React.createElement('div', { style: reqSpecLi }, '5.1.1.3.保证金总额:显示下方租赁订单信息中车辆保证金总额;'), React.createElement('div', { style: reqSpecLi }, '5.1.1.4.氢气预付款金额显示氢气预付款金额如客户选择自行承担氢费或羚牛承担氢费则该处为0不计入氢气预付款金额'), React.createElement('div', { style: reqSpecLi }, '5.1.2.下方为列表,显示序号、品牌、型号、车牌号、车辆识别代码、车辆月租金(元)、服务费项目、服务费、保证金、备注;'), React.createElement('div', { style: reqSpecLi }, '默认显示一行空数据;'), React.createElement('div', { style: reqSpecLi }, '5.1.2.1.序号自动按照条数生成规则为1、2、3....以此类推;'), React.createElement('div', { style: reqSpecLi }, '5.1.2.2.品牌:必选项,选择器,从型号参数库中「品牌」字段拉取所有品牌;'), React.createElement('div', { style: reqSpecLi }, '5.1.2.3.型号:必选项,选择器,从型号参数库中「型号」字段拉取所有品牌;'), React.createElement('div', { style: reqSpecLi }, '5.1.2.4.车牌号:选填项,选择器(支持从输入框输入车牌号关键字下拉匹配);'), React.createElement('div', { style: reqSpecLi }, '5.1.2.5.车辆识别代码:输入框(禁用),显示该车辆对应车辆识别代码,从车辆表直接拉取;'), React.createElement('div', { style: reqSpecLi }, '5.1.2.6.车辆月租金(元):输入框,支持两位小数,用于输入该车辆月租金金额,输入框后缀为元;'), React.createElement('div', { style: reqSpecLi }, '5.1.2.7.服务费项目:显示管理按钮,点击弹出卡片,卡片标题为:服务项目,下方列表显示服务项目、费用、生效时间、操作;'), React.createElement('div', { style: reqSpecLi }, '5.1.2.7.1.服务项目:必选项,选择器(支持输入框输入服务项目关键字进行下拉匹配),选项包含:代处理费用、罚款、违章处理违约金、未参加安全培训、车辆出险、年检年审违约、停车费、设备损坏金(包含易损件)、清洗费、上门收车人工费、上门收车送车行驶费、上门收车基础服务费、保险上浮、保养费用、补办驾驶证、补办牌照、补办营运证、补办加氢证、借用备用钥匙、补配钥匙、租金、氢气费-客、退还车氢量差、能源费补缴、能源费退款、送车上门人工费、送车上门送车行驶费、送车上门基础服务费、保证金、氢气预付费、维修费用、ETC-客、ETC卡缺损费、ETC设备缺损费、电费-客、未结算保养费、未结算维修费、车损费、工具损坏或丢失费、证件费、广告损坏费、送车服务费、接车服务费、补办行驶证、超赔险、轮胎磨损费、无忧包、轮胎保、养护保、尾板;'), React.createElement('div', { style: reqSpecLi }, '5.1.2.7.2.费用必填项输入框支持2位小数输入框后缀为元'), React.createElement('div', { style: reqSpecLi }, '5.1.2.7.3.生效时间必选项日期选择器格式为YYYY-MM-DD服务项目会以此时间提前3天进行消息通知'), React.createElement('div', { style: reqSpecLi }, '5.1.2.7.4.操作:删除,点击删除直接删除该行数据;'), React.createElement('div', { style: reqSpecLi }, '5.1.2.7.5.新增一行数据:点击添加一行服务项目;'), React.createElement('div', { style: reqSpecLi }, '5.1.3.氢费承担方:必选项,填充按钮组,选项为我方、客户,默认为客户,选择承担方为我方时,无需选择付款方式、输入氢气预付款;'), React.createElement('div', { style: reqSpecLi }, '5.1.4.付款方式:必选项,填充按钮组,选项为预付、月付款、自行结算;'), React.createElement('div', { style: reqSpecLi }, '5.1.4.1.预付:指合同签署时客户就需预先付出的氢费款项;'), React.createElement('div', { style: reqSpecLi }, '5.1.4.2.月付款:指合同签署后,客户按照每月氢费实际账单,进行支付,设置为月付款时,每月账期时会提示对应业务管理中心-能源部完善氢费账单;'), React.createElement('div', { style: reqSpecLi }, '5.1.4.3.自行结算:指合同签署后,所有氢气费用由客户自行承担;'), React.createElement('div', { style: reqSpecLi }, '5.1.5.氢气预付款必填项输入框支持2位小数当付款方式为预付时显示该输入框氢气预付款金额会并入该合同交车前首付款中一并结算并计入5.1.1.4.氢气预付款金额中;'), React.createElement('div', { style: reqSpecLi }, '5.1.6.退还车氢气单价必填项输入框支持2位小数后缀为元该金额主要用于约定退还车时与交车时氢气差值以此费用进行结算'))
);
var reqSpecDocPart3 = React.createElement('div', { style: { padding: '0 4px' } },
React.createElement('div', { style: reqSpecBlock }, React.createElement('div', { style: reqSpecH2 }, '6.其他费用信息卡片:'), React.createElement('div', { style: reqSpecP }, '6.1.用于选择对应费用模板,展示证照补办费用、违约金费用、易损件费用、其他费用信息;'), React.createElement('div', { style: reqSpecLi }, '6.1.1.选择费用模板:必选项,通过选择通过费用模板预设好的费用金额明细,自动将该模板所有环节费用显示在合同中;'), React.createElement('div', { style: reqSpecLi }, '6.1.2.证照补办费用:单独标题显示,内容为列表,列表中包括项目、收费标准、服务费,选择费用模板后自动反显;'), React.createElement('div', { style: reqSpecLi }, '6.1.3.违约金费用:单独标题显示,内容为列表,列表中包含项目、收费标准、服务费,选择费用模板后自动反显;'), React.createElement('div', { style: reqSpecLi }, '6.1.4.易损件信息:单独标题显示,内容为列表,列表中包含类别、损坏部位、配件、数量、费用明细,选择费用模板后自动反显;'), React.createElement('div', { style: reqSpecLi }, '6.1.5.其他费用信息:单独标题显示,内容为列表,列表中包含项目、收费标准、服务费,选择费用模板后自动反显;')),
React.createElement('div', { style: reqSpecBlock }, React.createElement('div', { style: reqSpecH2 }, '7.账单计算方式卡片:'), React.createElement('div', { style: reqSpecP }, '7.1.必选项,填充按钮组,默认为按自然月结算,需要在两种账单计算方式二选一,可手动修改,用于定义租赁合同的账单计算方式,分为按付款周期天数结算、按自然月结算两种方式;'), React.createElement('div', { style: reqSpecLi }, '7.1.1.按付款周期天数结算账单按照合同基本信息卡片中付款周期实际天数形成一期账单例如付款周期为60天则该账单账期为60天每60天会自动生成新一期账单'), React.createElement('div', { style: reqSpecLi }, '7.1.2.按自然月结算:账单按照第一个月计费日期开始-当月最后一天为第一期之后按照付款周期设置每个月第一天到对应月份最后一天的自然月方式形成每一期账单例如付款周期为2个月则第二期账单从2月1日-3月31日以此类推')),
React.createElement('div', { style: reqSpecBlock }, React.createElement('div', { style: reqSpecH2 }, '8.最下方为提交并审核、保存、取消三个按钮;'), React.createElement('div', { style: reqSpecLi }, '8.1.点击提交并审核toast提示租赁合同已提交审核。同时该租赁合同进入租赁合同审核列表中'), React.createElement('div', { style: reqSpecLi }, '8.2.点击保存,会存储租赁订单已填写内容,并加入租赁合同列表中,该条数据只能操作人自己查看并编辑,其他人无法操作;'), React.createElement('div', { style: reqSpecLi }, '8.3.点击取消,如当前页面有已编辑内容时,点击取消会进行二次提示,内容为:取消将会丢失所有已填写内容,是否确认?点击确认返回车辆租赁合同列表页;')),
React.createElement('div', { style: reqSpecBlock }, React.createElement('div', { style: reqSpecP }, '所有卡片支持收起/展开功能,通过点击卡片右侧收起/展开实现;并增加锚点功能,锚点固定于页面右上角,点击锚点对应卡片名称,页面自动跳转至该卡片所在区域;'))
);
var reqSpecModalContent = 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: 640 }), onClick: function(e) { e.stopPropagation(); } }, React.createElement('div', { style: styles.modalHeader }, '需求说明'), React.createElement('div', { style: Object.assign({}, styles.modalBody, { maxHeight: '70vh', padding: '20px 24px' }) }, reqSpecDoc, reqSpecDocPart2, reqSpecDocPart3), React.createElement('div', { style: { padding: '12px 20px', borderTop: '1px solid #f0f0f0', textAlign: 'right' } }, React.createElement(Button, { onClick: function() { setReqSpecOpen(false); } }, '关闭')))) : null;
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', { style: styles.anchorItem, onClick: function() { scrollToCard('card-customer'); } }, '客户基本信息'),
React.createElement('button', { style: styles.anchorItem, onClick: function() { scrollToCard('card-contract'); } }, '合同基本信息'),
React.createElement('button', { style: styles.anchorItem, onClick: function() { scrollToCard('card-authorized'); } }, '被授权人信息'),
React.createElement('button', { style: styles.anchorItem, onClick: function() { scrollToCard('card-rental'); } }, '租赁订单信息'),
React.createElement('button', { style: styles.anchorItem, onClick: function() { scrollToCard('card-fee'); } }, '其他费用信息'),
React.createElement('button', { style: styles.anchorItem, onClick: function() { scrollToCard('card-billing'); } }, '账单计算方式')
),
React.createElement('div', { id: 'card-customer' }, React.createElement(CardBlock, { id: 'card-customer', title: '客户基本信息', collapsed: cc1, setCollapsed: setCc1 }, customerFields)),
React.createElement('div', { id: 'card-contract', style: { marginTop: 16 } }, React.createElement(CardBlock, { title: '合同基本信息', collapsed: cc2, setCollapsed: setCc2 }, React.createElement('div', null, contractFormRow1, contractFormRow1Part2, 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-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', { style: { height: 60 } }),
serviceModalContent,
reqSpecModalContent,
React.createElement('div', { style: styles.footer }, React.createElement(Button, { type: 'primary', onClick: function() { if (validateSubmitAndReview()) { message.success('租赁合同已提交审核。'); } } }, '提交并审核'), React.createElement(Button, { onClick: function() { message.info('保存,加入租赁合同列表(仅操作人可查看编辑)'); } }, '保存'), React.createElement(Button, { onClick: function() { message.info('取消'); } }, '取消'))
);
};