feat(web): 车辆租赁合同合同审批类型、法务上传盖章合同;新增数据分析页面;交车任务查看调整

- 租赁合同列表:合同审批类型筛选与列、需求说明;审批通过且未上传盖章件时法务可更多上传
- 新增/续签/转正式/查看等页同步合同审批类型及需求说明
- 新增数据分析:业务部业绩明细、物流业务月度统计、租赁客户氢费台账、租赁车辆收入明细
- 查看交车任务页面更新

Made-with: Cursor
This commit is contained in:
王冕
2026-03-25 15:50:31 +08:00
parent 826a774495
commit e1ac94bacf
13 changed files with 3654 additions and 96 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -53,6 +53,7 @@ const Component = function() {
deliveryProvince: '浙江省',
deliveryCity: '嘉兴市',
deliveryLocation: '嘉兴市南湖区科技大道1号',
contractApprovalType: '标准合同审批',
remarks: '',
authorizedList: [{ name: '张三', phone: '13800138001', idCard: '330102199001011234' }],
rentalOrders: [
@@ -128,6 +129,9 @@ const Component = function() {
var bs11 = React.useState(prevContractSample.deliveryLocation);
var deliveryLocation = bs11[0];
var setDeliveryLocation = bs11[1];
var bs11a = React.useState(prevContractSample.contractApprovalType);
var contractApprovalType = bs11a[0];
var setContractApprovalType = bs11a[1];
var bs12 = React.useState('转正式合同自旧合同编码JXZL20260216YW101235A');
var remarks = bs12[0];
var setRemarks = bs12[1];
@@ -321,6 +325,7 @@ const Component = function() {
if (!signingCompany) errs.signingCompany = '请选择签约公司';
if (!deliveryProvince || !deliveryCity) errs.deliveryRegion = '请选择交车区域';
if (!deliveryLocation || !deliveryLocation.trim()) errs.deliveryLocation = '请输入交车地点';
if (!contractApprovalType) errs.contractApprovalType = '请选择合同审批类型';
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()); });
@@ -347,7 +352,7 @@ const Component = function() {
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.effectiveDate || errs.paymentMethod || errs.endDate || errs.paymentPeriod || errs.signingCompany || errs.deliveryRegion || errs.deliveryLocation || errs.contractOriginal) ? 'card-contract' : errs.authorizedList ? 'card-authorized' : (errs.rentalOrders || errs.serviceItems || errs.hydrogenBearer || errs.hydrogenPaymentMethod || errs.hydrogenPrepay || errs.returnHydrogenPrice) ? 'card-rental' : errs.feeTemplate ? 'card-fee' : 'card-billing';
var firstId = errs.customer || errs.businessDept || errs.businessOwner ? 'card-customer' : (errs.projectName || errs.effectiveDate || errs.paymentMethod || errs.endDate || errs.paymentPeriod || errs.signingCompany || errs.deliveryRegion || errs.deliveryLocation || errs.contractApprovalType || errs.contractOriginal) ? 'card-contract' : errs.authorizedList ? 'card-authorized' : (errs.rentalOrders || errs.serviceItems || 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;
@@ -579,7 +584,8 @@ const Component = function() {
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(); setEdited(true); 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))
);
var contractFormRow4 = React.createElement('div', { style: styles.formRow },
React.createElement(FormItem, { label: '交车地点', required: true, error: formErrors.deliveryLocation }, React.createElement(Input, { placeholder: '请输入交车地点', value: deliveryLocation, onChange: function(e) { setEdited(true); setDeliveryLocation(e.target.value); }, status: formErrors.deliveryLocation ? 'error' : undefined, style: { width: '100%' } }))
React.createElement(FormItem, { label: '交车地点', required: true, error: formErrors.deliveryLocation }, React.createElement(Input, { placeholder: '请输入交车地点', value: deliveryLocation, onChange: function(e) { setEdited(true); setDeliveryLocation(e.target.value); }, status: formErrors.deliveryLocation ? 'error' : undefined, style: { width: '100%' } })),
React.createElement(FormItem, { label: '合同审批类型', required: true, error: formErrors.contractApprovalType }, React.createElement(Select, { placeholder: '请选择合同审批类型', style: { width: '100%' }, value: contractApprovalType || undefined, onChange: function(v) { setEdited(true); setContractApprovalType(v || ''); }, status: formErrors.contractApprovalType ? 'error' : undefined }, React.createElement(Option, { value: '标准合同审批' }, '标准合同审批'), React.createElement(Option, { value: '非标准合同审批' }, '非标准合同审批')))
);
var contractFormRow5 = React.createElement('div', { style: styles.formRow },
React.createElement(FormItem, { label: '合同原件', required: true, error: formErrors.contractOriginal },
@@ -759,8 +765,9 @@ const Component = function() {
3.8.签约公司:从原合同自动反写,必选项,选择器,从组织机构表中获取所有根组织机构(如嘉兴羚牛、上海羚牛、广东羚牛等),默认显示新增用户当前机构,可手动修改,后期需要考虑从签约公司维度统计合同相关数据;
3.9.交车区域:从原合同自动反写,必选项,地区选择器,支持省-市2级选择区域后该任务生成交车任务时会自动推送至该区域负责运维人员
3.10.交车地点:从原合同自动反写,必填项,输入框,支持自定义输入交车地点;
3.11.合同原件:从原合同自动反写,必填项,按钮按钮文字为上传附件支持多个附件上传doc/docx/pdf格式
3.12.备注:从原合同自动反写,如果该合同为转正式合同则自动在已填备注信息上方额外添加转正式合同自旧合同合同编码xxx文本域支持自定义输入备注信息
3.11.合同审批类型:从原合同自动反写,必填项,选择器,分为「标准合同审批」「非标准合同审批」
3.12.合同原件:从原合同自动反写,必填项按钮按钮文字为上传附件支持多个附件上传doc/docx/pdf格式
3.13.备注从原合同自动反写如果该合同为转正式合同则自动在已填备注信息上方额外添加转正式合同自旧合同合同编码xxx文本域支持自定义输入备注信息
4.被授权人信息卡片:
#用于定义租赁合同相关被授权人相关信息被授权人在交车单完成时需要选择被授权人并通过被授权人手机短信在E签宝进行签字确认

View File

@@ -37,6 +37,7 @@ const Component = function() {
signingCompany: '嘉兴羚牛',
deliveryRegion: '浙江省 / 嘉兴市',
deliveryLocation: '嘉兴市南湖区科技大道1号',
contractApprovalType: '标准合同审批',
contractOriginalName: '租赁合同-嘉兴某某物流.pdf',
remarks: '首年优惠',
authorizedList: [
@@ -221,6 +222,7 @@ const Component = function() {
React.createElement(FormItem, { label: '签约公司' }, React.createElement(Input, { value: detail.signingCompany, disabled: true, style: styles.inputDisabled })),
React.createElement(FormItem, { label: '交车区域' }, React.createElement(Input, { value: detail.deliveryRegion, disabled: true, style: styles.inputDisabled })),
React.createElement(FormItem, { label: '交车地点' }, React.createElement(Input, { value: detail.deliveryLocation, disabled: true, style: styles.inputDisabled })),
React.createElement(FormItem, { label: '合同审批类型' }, React.createElement(Input, { value: detail.contractApprovalType || '—', disabled: true, style: styles.inputDisabled })),
React.createElement(FormItem, { label: '合同原件' }, React.createElement(Input, { value: detail.contractOriginalName, disabled: true, style: styles.inputDisabled })),
React.createElement(FormItem, { label: '备注', fullWidth: true }, React.createElement(Input.TextArea, { value: detail.remarks, disabled: true, style: { width: '100%', minHeight: 80, backgroundColor: '#f5f5f5' } }))
);

View File

@@ -17,6 +17,7 @@ const Component = function() {
var Popover = antd.Popover;
var Dropdown = antd.Dropdown;
var Modal = antd.Modal;
var Upload = antd.Upload;
var message = antd.message;
var App = antd.App;
@@ -33,6 +34,7 @@ const Component = function() {
var _businessDept = useState([]);
var _businessOwner = useState([]);
var _contractType = useState(['全部']);
var _contractApprovalType = useState(['全部']);
var _creator = useState([]);
var _endDateRange = useState(null);
@@ -46,6 +48,7 @@ const Component = function() {
businessDept: [],
businessOwner: [],
contractType: ['全部'],
contractApprovalType: ['全部'],
creator: [],
endDateRange: null
});
@@ -65,6 +68,14 @@ const Component = function() {
var _terminateModalVisible = useState(false);
var _terminateModalRecord = useState(null);
var _requirementModalVisible = useState(false);
var _stampModalVisible = useState(false);
var _stampModalRecord = useState(null);
var _stampFileList = useState([]);
// 上传盖章合同完成后,按合同 id 记录已上传(原型:与列表 legalStampedContractUploaded 合并判断)
var _stampedUploadedOverride = useState({});
// 联调时:当前登录用户所属部门为法务部时为 true原型默认 true 便于演示「上传盖章合同」)
var isLegalDeptUser = true;
// 模拟选项(与新增租赁合同保持一致)
var contractCodeOptions = [
@@ -118,6 +129,11 @@ const Component = function() {
{ value: '正式合同', label: '正式合同' },
{ value: '试用合同', label: '试用合同' }
];
var contractApprovalTypeOptions = [
{ value: '全部', label: '全部' },
{ value: '标准合同审批', label: '标准合同审批' },
{ value: '非标准合同审批', label: '非标准合同审批' }
];
var deptOptions = [
{ value: '业务1部', label: '业务1部' },
{ value: '业务2部', label: '业务2部' },
@@ -151,6 +167,7 @@ const Component = function() {
businessDept: '业务1部',
businessOwner: '张经理',
contractType: '正式合同',
contractApprovalType: '标准合同审批',
contractEndDate: '2026-02-16',
contactName: '张三',
contactPhone: '13800138001',
@@ -158,7 +175,8 @@ const Component = function() {
createTime: '2025-01-05 10:00',
updater: '-',
updateTime: '-',
remark: '草稿待完善'
remark: '草稿待完善',
legalStampedContractUploaded: undefined
},
// 2. 未提交 + 草稿(试用合同)
{
@@ -176,6 +194,7 @@ const Component = function() {
businessDept: '业务2部',
businessOwner: '李专员',
contractType: '试用合同',
contractApprovalType: '非标准合同审批',
contractEndDate: '2025-08-01',
contactName: '李四',
contactPhone: '13800138002',
@@ -183,7 +202,8 @@ const Component = function() {
createTime: '2025-02-10 09:00',
updater: '-',
updateTime: '-',
remark: '试用期 3 个月'
remark: '试用期 3 个月',
legalStampedContractUploaded: undefined
},
// 3. 待审批 + 已提交审批(初次提交,尚未有任何节点审批)
{
@@ -201,6 +221,7 @@ const Component = function() {
businessDept: '业务3部',
businessOwner: '王专员',
contractType: '正式合同',
contractApprovalType: '标准合同审批',
contractEndDate: '2026-06-30',
contactName: '王五',
contactPhone: '13800138003',
@@ -208,7 +229,8 @@ const Component = function() {
createTime: '2025-02-12 11:00',
updater: '-',
updateTime: '-',
remark: '-'
remark: '-',
legalStampedContractUploaded: undefined
},
// 4. 审批中 + 已提交审批(已有节点审批,未走完)
{
@@ -227,6 +249,7 @@ const Component = function() {
businessDept: '业务1部',
businessOwner: '张经理',
contractType: '正式合同',
contractApprovalType: '非标准合同审批',
contractEndDate: '2026-03-01',
contactName: '赵六',
contactPhone: '13900139001',
@@ -234,7 +257,8 @@ const Component = function() {
createTime: '2025-02-14 09:00',
updater: '李专员',
updateTime: '2025-02-15 16:00',
remark: '-'
remark: '-',
legalStampedContractUploaded: undefined
},
// 5. 审批中 + 变更(已通过审批后做了变更并重新提交)
{
@@ -252,6 +276,7 @@ const Component = function() {
businessDept: '业务2部',
businessOwner: '李专员',
contractType: '正式合同',
contractApprovalType: '标准合同审批',
contractEndDate: '2026-05-31',
contactName: '孙七',
contactPhone: '13900139002',
@@ -259,7 +284,8 @@ const Component = function() {
createTime: '2025-02-18 10:00',
updater: '李专员',
updateTime: '2025-02-22 14:00',
remark: '变更车辆数量'
remark: '变更车辆数量',
legalStampedContractUploaded: undefined
},
// 6. 审批通过 + 合同进行中(正式合同)
{
@@ -279,6 +305,7 @@ const Component = function() {
businessDept: '业务3部',
businessOwner: '王专员',
contractType: '正式合同',
contractApprovalType: '标准合同审批',
contractEndDate: '2026-12-31',
contactName: '周八',
contactPhone: '13900139003',
@@ -286,7 +313,8 @@ const Component = function() {
createTime: '2025-01-15 09:00',
updater: '王专员',
updateTime: '2025-01-25 11:00',
remark: '-'
remark: '-',
legalStampedContractUploaded: false
},
// 7. 审批通过 + 合同进行中(试用合同,可转正式)
{
@@ -304,6 +332,7 @@ const Component = function() {
businessDept: '业务1部',
businessOwner: '张经理',
contractType: '试用合同',
contractApprovalType: '非标准合同审批',
contractEndDate: '2025-05-31',
contactName: '吴九',
contactPhone: '13900139004',
@@ -311,7 +340,8 @@ const Component = function() {
createTime: '2025-01-28 10:00',
updater: '-',
updateTime: '-',
remark: '试用 3 个月'
remark: '试用 3 个月',
legalStampedContractUploaded: false
},
// 8. 审批驳回 + 已提交审批(可编辑和重新提交)
{
@@ -330,6 +360,7 @@ const Component = function() {
businessDept: '业务2部',
businessOwner: '李专员',
contractType: '正式合同',
contractApprovalType: '标准合同审批',
contractEndDate: '2026-08-15',
contactName: '郑十',
contactPhone: '13900139005',
@@ -337,7 +368,8 @@ const Component = function() {
createTime: '2025-02-20 14:00',
updater: '李专员',
updateTime: '2025-02-23 09:00',
remark: '驳回原因:费用条款需调整'
remark: '驳回原因:费用条款需调整',
legalStampedContractUploaded: undefined
},
// 9. 审批通过 + 到期合同(审批已通过但合同结束日期已过)
{
@@ -356,6 +388,7 @@ const Component = function() {
businessDept: '业务3部',
businessOwner: '王专员',
contractType: '正式合同',
contractApprovalType: '标准合同审批',
contractEndDate: '2024-12-31',
contactName: '王五',
contactPhone: '13800138003',
@@ -363,7 +396,8 @@ const Component = function() {
createTime: '2024-02-20 10:00',
updater: '王专员',
updateTime: '2024-12-20 16:00',
remark: '已到期可续签'
remark: '已到期可续签',
legalStampedContractUploaded: false
},
// 10. 审批通过 + 已结束(操作列终止合同并完成审核)
{
@@ -381,6 +415,7 @@ const Component = function() {
businessDept: '业务1部',
businessOwner: '张经理',
contractType: '正式合同',
contractApprovalType: '非标准合同审批',
contractEndDate: '2025-01-15',
contactName: '张三',
contactPhone: '13800138001',
@@ -388,7 +423,8 @@ const Component = function() {
createTime: '2024-05-20 09:00',
updater: '张经理',
updateTime: '2025-01-10 14:00',
remark: '-'
remark: '-',
legalStampedContractUploaded: true
}
];
@@ -428,6 +464,10 @@ const Component = function() {
if (type && type.length > 0 && type.indexOf('全部') === -1) {
list = list.filter(function(r) { return type.indexOf(r.contractType) !== -1; });
}
var capType = f.contractApprovalType;
if (capType && capType.length > 0 && capType.indexOf('全部') === -1) {
list = list.filter(function(r) { return capType.indexOf(r.contractApprovalType) !== -1; });
}
if (f.creator && f.creator.length > 0) {
list = list.filter(function(r) { return f.creator.indexOf(r.creator) !== -1; });
}
@@ -463,6 +503,7 @@ const Component = function() {
businessDept: _businessDept[0] ? _businessDept[0].slice() : [],
businessOwner: _businessOwner[0] ? _businessOwner[0].slice() : [],
contractType: _contractType[0] ? _contractType[0].slice() : ['全部'],
contractApprovalType: _contractApprovalType[0] ? _contractApprovalType[0].slice() : ['全部'],
creator: _creator[0] ? _creator[0].slice() : [],
endDateRange: _endDateRange[0]
});
@@ -478,6 +519,7 @@ const Component = function() {
_businessDept[1]([]);
_businessOwner[1]([]);
_contractType[1](['全部']);
_contractApprovalType[1](['全部']);
_creator[1]([]);
_endDateRange[1](null);
_appliedFilter[1]({
@@ -490,6 +532,7 @@ const Component = function() {
businessDept: [],
businessOwner: [],
contractType: ['全部'],
contractApprovalType: ['全部'],
creator: [],
endDateRange: null
});
@@ -544,6 +587,22 @@ const Component = function() {
}
_contractType[1](v);
}, []);
var handleContractApprovalTypeChange = useCallback(function(v) {
if (!v || v.length === 0) { _contractApprovalType[1](['全部']); return; }
if (v.indexOf('全部') !== -1 && v.length > 1) {
var prevA = _contractApprovalType[0] || [];
var hadAllOnlyA = prevA.length === 1 && prevA.indexOf('全部') !== -1;
if (hadAllOnlyA) {
var nextA = [];
for (var ia = 0; ia < v.length; ia++) { if (v[ia] !== '全部') nextA.push(v[ia]); }
_contractApprovalType[1](nextA);
} else {
_contractApprovalType[1](['全部']);
}
return;
}
_contractApprovalType[1](v);
}, []);
var addAuthorizedRow = useCallback(function() {
_authorizedList[1](function(prev) { return prev.concat([{ name: '', phone: '', idCard: '' }]); });
@@ -649,6 +708,21 @@ const Component = function() {
if (type === '试用合同') {
items.push({ key: 'toFormal', label: '转正式合同', onClick: function() { message.info('转正式合同(原型)'); } });
}
// 审批通过且法务审核环节尚未上传盖章合同附件时,法务部员工可在「更多」中上传(上传完成后入口关闭)
if (approval === '审批通过' && isLegalDeptUser) {
var needStampUpload = (record.legalStampedContractUploaded === false) && !(_stampedUploadedOverride[0][record.id] === true);
if (needStampUpload) {
items.push({
key: 'uploadStamped',
label: '上传盖章合同',
onClick: function() {
_stampModalRecord[1](record);
_stampFileList[1]([]);
_stampModalVisible[1](true);
}
});
}
}
return items;
}
@@ -751,6 +825,7 @@ const Component = function() {
{ title: '业务部门', dataIndex: 'businessDept', key: 'businessDept', width: 100 },
{ title: '业务负责人', dataIndex: 'businessOwner', key: 'businessOwner', width: 100 },
{ title: '合同类型', dataIndex: 'contractType', key: 'contractType', width: 100 },
{ title: '合同审批类型', dataIndex: 'contractApprovalType', key: 'contractApprovalType', width: 130 },
{ title: '合同结束日期', dataIndex: 'contractEndDate', key: 'contractEndDate', width: 120 },
{ title: '客户联系人', dataIndex: 'contactName', key: 'contactName', width: 100 },
{ title: '联系电话', dataIndex: 'contactPhone', key: 'contactPhone', width: 120 },
@@ -865,6 +940,16 @@ const Component = function() {
onChange: handleContractTypeChange,
options: contractTypeOptions
})),
React.createElement('div', { key: 'contractApprovalType', style: filterItemStyle },
React.createElement('div', { style: filterLabelStyle }, '合同审批类型'),
React.createElement(Select, {
mode: 'multiple',
placeholder: '请选择',
style: filterControlStyle,
value: _contractApprovalType[0],
onChange: handleContractApprovalTypeChange,
options: contractApprovalTypeOptions
})),
React.createElement('div', { key: 'creator', style: filterItemStyle },
React.createElement('div', { style: filterLabelStyle }, '创建人'),
React.createElement(Select, {
@@ -885,7 +970,7 @@ const Component = function() {
}))
];
var filterCount = _filterExpanded[0] ? 11 : 3;
var filterCount = _filterExpanded[0] ? 12 : 3;
var filterNodes = [];
for (var i = 0; i < filterCount && i < filterItems.length; i++) {
filterNodes.push(filterItems[i]);
@@ -1034,6 +1119,61 @@ const Component = function() {
scroll: { x: 920 }
})
)),
React.createElement(Modal, {
title: '上传盖章合同',
open: _stampModalVisible[0],
onCancel: function() {
_stampModalVisible[1](false);
_stampModalRecord[1](null);
_stampFileList[1]([]);
},
width: 560,
footer: [
React.createElement(Button, { key: 'cancel', onClick: function() {
_stampModalVisible[1](false);
_stampModalRecord[1](null);
_stampFileList[1]([]);
} }, '取消'),
React.createElement(Button, { key: 'ok', type: 'primary', onClick: function() {
var rec = _stampModalRecord[0];
var list = _stampFileList[0] || [];
if (!list.length) {
message.warning('请先选择要上传的文件');
return;
}
var pending = list.some(function(f) { return f.status === 'uploading'; });
if (pending) {
message.warning('请等待文件上传完成');
return;
}
_stampedUploadedOverride[1](function(prev) {
var n = Object.assign({}, prev);
if (rec) n[rec.id] = true;
return n;
});
message.success('盖章合同已上传(原型)');
_stampModalVisible[1](false);
_stampModalRecord[1](null);
_stampFileList[1]([]);
} }, '确认上传')
]
}, React.createElement('div', { style: { padding: '8px 0' } },
React.createElement('div', { style: { marginBottom: 12, fontSize: 14, color: 'rgba(0,0,0,0.65)' } },
'合同编码:',
React.createElement('span', { style: { color: 'rgba(0,0,0,0.85)', fontWeight: 500 } }, _stampModalRecord[0] ? _stampModalRecord[0].contractCode : '-')
),
React.createElement(Upload.Dragger, {
multiple: true,
fileList: _stampFileList[0],
onChange: function(info) { _stampFileList[1](info.fileList); },
customRequest: function(opts) {
setTimeout(function() {
if (opts.onSuccess) opts.onSuccess('ok');
}, 200);
},
accept: '.pdf,.doc,.docx,image/*'
}, React.createElement('p', { style: { margin: 0, padding: '20px 0' } }, '点击或拖拽文件到此区域上传,支持多文件'))
)),
React.createElement(Modal, {
title: '需求说明',
open: _requirementModalVisible[0],
@@ -1047,7 +1187,7 @@ const Component = function() {
React.createElement('div', { style: reqSectionStyle }, '1.面包屑:'),
React.createElement('div', { style: reqSubStyle }, '1.1.业务管理-车辆租赁合同'),
React.createElement('div', { style: reqSectionStyle }, '2.筛选:'),
React.createElement('div', { style: reqSubStyle }, '2.1.支持通过合同编码、项目名称、客户名称、签约公司、审批状态、合同状态、业务部门、业务负责人、合同类型、创建人、合同结束日期等条件进行筛选,右侧为重置、查询、展开/收起筛选条件以3列显示默认显示一行点击展开/收起对筛选栏卡片进行展开/收起所有筛选条件),点击查询后,筛选条件与列表内容联动。点击重置会回到默认筛选条件并在列表展示结果:'),
React.createElement('div', { style: reqSubStyle }, '2.1.支持通过合同编码、项目名称、客户名称、签约公司、审批状态、合同状态、业务部门、业务负责人、合同类型、合同审批类型、创建人、合同结束日期等条件进行筛选,右侧为重置、查询、展开/收起筛选条件以3列显示默认显示一行点击展开/收起对筛选栏卡片进行展开/收起所有筛选条件),点击查询后,筛选条件与列表内容联动。点击重置会回到默认筛选条件并在列表展示结果:'),
React.createElement('div', { style: reqItemStyle }, '2.1.1.合同编码:选择器,支持从输入框内输入内容进行模糊搜索,下拉显示匹配选项;'),
React.createElement('div', { style: reqItemStyle }, '2.1.2.项目名称:选择器,支持从输入框内输入内容进行模糊搜索,下拉显示匹配选项;'),
React.createElement('div', { style: reqItemStyle }, '2.1.3.客户名称:选择器,支持从输入框内输入内容进行模糊搜索,下拉显示匹配选项;'),
@@ -1057,10 +1197,11 @@ const Component = function() {
React.createElement('div', { style: reqItemStyle }, '2.1.7.业务部门:选择器,支持全选或多选,拉取部门下所有业务相关部门;'),
React.createElement('div', { style: reqItemStyle }, '2.1.8.业务负责人:选择器,支持全选或多选,拉取所有业务相关部门下所有用户姓名;'),
React.createElement('div', { style: reqItemStyle }, '2.1.9.合同类型:选择器,支持全选或多选,选项为:全部、正式合同、试用合同;'),
React.createElement('div', { style: reqItemStyle }, '2.1.10.创建人:选择器,支持全选或多选,拉取所有业务相关部门下所有用户姓名'),
React.createElement('div', { style: reqItemStyle }, '2.1.11.合同结束日期:日期选择器,支持单输入框内双日历选择开始-结束时间'),
React.createElement('div', { style: reqItemStyle }, '2.1.10.合同审批类型:选择器,支持全选或多选,选项为:全部、标准合同审批、非标准合同审批'),
React.createElement('div', { style: reqItemStyle }, '2.1.11.创建人:选择器,支持全选或多选,拉取所有业务相关部门下所有用户姓名'),
React.createElement('div', { style: reqItemStyle }, '2.1.12.合同结束日期:日期选择器,支持单输入框内双日历选择开始-结束时间;'),
React.createElement('div', { style: reqSectionStyle }, '3.列表:'),
React.createElement('div', { style: reqSubStyle }, '3.1.列表展示所有租赁合同信息,字段依次为:合同编码、项目名称、租赁车辆数、已交车辆数、审批状态、合同状态、客户名称、签约公司、业务部门、业务负责人、合同类型、合同结束日期、客户联系人、联系电话、创建人、创建时间、更新人、最后更新时间、备注、操作;列表右上角为新增、导出;'),
React.createElement('div', { style: reqSubStyle }, '3.1.列表展示所有租赁合同信息,字段依次为:合同编码、项目名称、租赁车辆数、已交车辆数、审批状态、合同状态、客户名称、签约公司、业务部门、业务负责人、合同类型、合同审批类型、合同结束日期、客户联系人、联系电话、创建人、创建时间、更新人、最后更新时间、备注、操作;列表右上角为新增、导出;'),
React.createElement('div', { style: reqItemStyle }, '3.1.1.合同编码:显示租赁合同对应合同编码;'),
React.createElement('div', { style: reqItemStyle }, '3.1.2.项目名称:显示租赁合同对应项目名称;'),
React.createElement('div', { style: reqItemStyle }, '3.1.3.租赁车辆数:显示租赁车辆数,点击显示气泡卡片,卡片中列表显示:车辆类型、品牌、型号、车牌号、实际交车日期;'),
@@ -1089,29 +1230,31 @@ const Component = function() {
React.createElement('div', { style: reqItemStyle }, '3.1.8.业务部门:显示租赁合同创建时所选业务部门,业务部门来自部门表(业务组);'),
React.createElement('div', { style: reqItemStyle }, '3.1.9.业务负责人:显示租赁合同创建时所选业务负责人,与业务部门联动,查询该业务组下人员;'),
React.createElement('div', { style: reqItemStyle }, '3.1.10.合同类型:显示租赁合同类型,类型包括:正式合同、试用合同,于创建租赁合同时选取;'),
React.createElement('div', { style: reqItemStyle }, '3.1.11.合同结束日期:显示租赁合同结束日期精确至日格式为YYYY-MM-DD'),
React.createElement('div', { style: reqItemStyle }, '3.1.12.客户联系人:显示租赁合同客户联系人姓名,客户联系人姓名来自「客户管理」-「联系人」'),
React.createElement('div', { style: reqItemStyle }, '3.1.13.联系电话:显示租赁合同客户联系电话,客户联系电话来自「客户管理」-「联系人手机」;'),
React.createElement('div', { style: reqItemStyle }, '3.1.14.创建人:显示租赁合同创建人姓名,取自操作用户姓名'),
React.createElement('div', { style: reqItemStyle }, '3.1.15.创建时间:显示租赁合同创建时间精确至分钟格式为YYYY-MM-DD HH:MM;'),
React.createElement('div', { style: reqItemStyle }, '3.1.16.更新人:显示租赁合同最后一次更新人姓名,取自操作用户姓名,如无则显示:-'),
React.createElement('div', { style: reqItemStyle }, '3.1.17.最后更新时间:显示租赁合同最后一次更新时间精确至分钟格式为YYYY-MM-DD HH:MM,如无则显示:-;'),
React.createElement('div', { style: reqItemStyle }, '3.1.18.备注:显示租赁合同创建时输入的备注信息,如无则显示:-'),
React.createElement('div', { style: reqItemStyle }, '3.1.19.操作:操作分为:查看、编辑、新增车辆、续签合同、删除合同、撤回合同、添加被授权人、附加费用、变更为三方合同、转正式合同、终止合同'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.1.查看:跳转车辆租赁合同-查看'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.2.编辑:当「合同状态」为「草稿」时显示,点击跳转编辑租赁合同页面,编辑租赁合同页面可输入项参考「新增租赁合同」页面,并支持对保存时已填内容进行修改'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.3.新增车辆:当「合同状态」为「合同进行中」时显示,仅能在租赁订单信息卡片下新订单中进行车辆新增;新增车辆提交后触发重新审核流程,审核通过后生效(不影响原有合同正常业务)'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.4.续签合同:当「合同状态」为「合同进行中」、「合同到期」时显示,点击跳转车辆租赁合同-续签合同页,提交时重新触发租赁合同审核流程'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.5.删除合同:当「合同状态」为「草稿」时显示,点击删除合同时进行二次确认,提示语:是否确认删除该合同草稿'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.6.撤回合同:当「合同状态」为「已提交审核」时显示,点击撤回合同时进行二次确认,提示语:是否确认撤回该合同;'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.7.添加被授权人:当「合同状态」为「合同进行中」时显示,点击弹出卡片,卡片中可编辑被授权人、被授权人联系电话、被授权人身份证,同时支持添加一行、删除已有行等操作;添加被授权人触发重新审核流程,审核通过后生效'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.8.附加费用:当「合同状态」为「合同进行中」时显示,点击弹出卡片,卡片中显示该租赁合同内:车辆类型、品牌、型号、车牌号,同时可对服务项目、费用、生效时间进行编辑,触发租赁合同审核流程,审核通过后生效;'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.8.1.服务项目:代处理费用、罚款、违章处理违约金、未参加安全培训、车辆出险、年检年审违约、停车费、设备损坏金(包含易损件)、清洗费、上门收车人工费、上门收车送车行驶费、上门收车基础服务费、保险上浮、保养费用、补办驾驶证、补办牌照、补办营运证、补办加氢证、借用备用钥匙、补配钥匙、租金、氢气费-客、退还车氢量差、能源费补缴、能源费退款、送车上门人工费、送车上门送车行驶费、送车上门基础服务费、保证金、氢气预付费、维修费用、ETC-客、ETC卡缺损费、ETC设备缺损费、电费-客、未结算保养费、未结算维修费、车损费、工具损坏或丢失费、证件费、广告损坏费、送车服务费、接车服务费、补办行驶证、超赔险、轮胎磨损费、无忧包、轮胎保、养护保、尾板'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.8.2.费用输入框后缀为元支持2位小数输入'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.8.3.生效时间:日期选择器,精确至日'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.9.变更为三方合同:当「合同状态」为「合同进行中」时显示,点击跳转车辆租赁合同-变更为三方合同页面,提交时重新触发租赁合同审核流程;'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.10.转正式合同:当「合同类型」为「试用合同」时显示,点击跳转车辆租赁合同-转正式合同页面,提交时重新触发租赁合同审核流程;'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.19.11.终止合同:当「合同状态」为「合同进行中」时显示,点击后进行二次确认,提示语:是否确认终止合同,确认按钮为提交审核,会重新发起合同审核流程,审核通过后,合同状态变更为:已结束')
React.createElement('div', { style: reqItemStyle }, '3.1.11.合同审批类型:显示租赁合同创建时所选合同审批类型,包括:标准合同审批、非标准合同审批'),
React.createElement('div', { style: reqItemStyle }, '3.1.12.合同结束日期:显示租赁合同结束日期精确至日格式为YYYY-MM-DD'),
React.createElement('div', { style: reqItemStyle }, '3.1.13.客户联系人:显示租赁合同客户联系人姓名,客户联系人姓名来自「客户管理」-「联系人」;'),
React.createElement('div', { style: reqItemStyle }, '3.1.14.联系电话:显示租赁合同客户联系电话,客户联系电话来自「客户管理」-「联系人手机」'),
React.createElement('div', { style: reqItemStyle }, '3.1.15.创建:显示租赁合同创建人姓名,取自操作用户姓名;'),
React.createElement('div', { style: reqItemStyle }, '3.1.16.创建时间:显示租赁合同创建时间精确至分钟格式为YYYY-MM-DD HH:MM;'),
React.createElement('div', { style: reqItemStyle }, '3.1.17.更新人:显示租赁合同最后一次更新人姓名,取自操作用户姓名,如无则显示:-'),
React.createElement('div', { style: reqItemStyle }, '3.1.18.最后更新时间:显示租赁合同最后一次更新时间精确至分钟格式为YYYY-MM-DD HH:MM,如无则显示:-;'),
React.createElement('div', { style: reqItemStyle }, '3.1.19.备注:显示租赁合同创建时输入的备注信息,如无则显示:-'),
React.createElement('div', { style: reqItemStyle }, '3.1.20.操作:操作分为:查看、编辑、新增车辆、续签合同、删除合同、撤回合同、添加被授权人、附加费用、变更为三方合同、转正式合同、终止合同、上传盖章合同'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.1.查看:跳转车辆租赁合同-查看'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.2.编辑:当「合同状态」为「草稿」时显示,点击跳转编辑租赁合同页面,编辑租赁合同页面可输入项参考「新增租赁合同」页面,并支持对保存时已填内容进行修改'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.3.新增车辆:当「合同状态」为「合同进行中」时显示,仅能在租赁订单信息卡片下新订单中进行车辆新增;新增车辆提交后触发重新审核流程,审核通过后生效(不影响原有合同正常业务)'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.4.续签合同:当「合同状态」为「合同进行中」、「合同到期」时显示,点击跳转车辆租赁合同-续签合同页,提交时重新触发租赁合同审核流程'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.5.删除合同:当「合同状态」为「草稿」时显示,点击删除合同时进行二次确认,提示语:是否确认删除该合同草稿'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.6.撤回合同:当「合同状态」为「已提交审核」时显示,点击撤回合同时进行二次确认,提示语:是否确认撤回该合同'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.7.添加被授权人:当「合同状态」为「合同进行中」时显示,点击弹出卡片,卡片中可编辑被授权人、被授权人联系电话、被授权人身份证,同时支持添加一行、删除已有行等操作;添加被授权人触发重新审核流程,审核通过后生效;'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.8.附加费用:当「合同状态」为「合同进行中」时显示,点击弹出卡片,卡片中显示该租赁合同内:车辆类型、品牌、型号、车牌号,同时可对服务项目、费用、生效时间进行编辑,触发租赁合同审核流程,审核通过后生效'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.8.1.服务项目:代处理费用、罚款、违章处理违约金、未参加安全培训、车辆出险、年检年审违约、停车费、设备损坏金(包含易损件)、清洗费、上门收车人工费、上门收车送车行驶费、上门收车基础服务费、保险上浮、保养费用、补办驾驶证、补办牌照、补办营运证、补办加氢证、借用备用钥匙、补配钥匙、租金、氢气费-客、退还车氢量差、能源费补缴、能源费退款、送车上门人工费、送车上门送车行驶费、送车上门基础服务费、保证金、氢气预付费、维修费用、ETC-客、ETC卡缺损费、ETC设备缺损费、电费-客、未结算保养费、未结算维修费、车损费、工具损坏或丢失费、证件费、广告损坏费、送车服务费、接车服务费、补办行驶证、超赔险、轮胎磨损费、无忧包、轮胎保、养护保、尾板'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.8.2.费用输入框后缀为元支持2位小数输入'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.8.3.生效时间:日期选择器,精确至日'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.9.变更为三方合同:当「合同状态」为「合同进行中」时显示,点击跳转车辆租赁合同-变更为三方合同页面,提交时重新触发租赁合同审核流程;'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.10.转正式合同:当「合同类型」为「试用合同」时显示,点击后跳转车辆租赁合同-转正式合同页面,提交时重新触发租赁合同审核流程'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.11.终止合同:当「合同状态」为「合同进行中」时显示,点击后进行二次确认,提示语:是否确认终止合同,确认按钮为提交审核,会重新发起合同审核流程,审核通过后,合同状态变更为:已结束;'),
React.createElement('div', { style: reqSubItemStyle }, '3.1.20.12.上传盖章合同:当「审批状态」为「审批通过」且法务审核环节尚未上传盖章合同附件时,在「更多」中显示,仅法务部员工可见并可操作;点击后弹出上传窗口,可浏览本地文件上传,支持多文件;上传完成后关闭该入口(列表不再展示「上传盖章合同」);')
))
)
);