504 lines
24 KiB
JavaScript
504 lines
24 KiB
JavaScript
// 交车管理 - 列表内编辑抽屉(参照 交车管理-交车单-编辑.jsx)
|
||
// 使用方式:window.DeliveryEditDrawer(props)
|
||
|
||
function DeliveryEditDrawer(props) {
|
||
var useState = React.useState;
|
||
var useMemo = React.useMemo;
|
||
var useCallback = React.useCallback;
|
||
var useRef = React.useRef;
|
||
var useEffect = React.useEffect;
|
||
|
||
var open = props.open;
|
||
var record = props.record;
|
||
var onClose = props.onClose;
|
||
var onSave = props.onSave;
|
||
var onSubmit = props.onSubmit;
|
||
|
||
var antd = window.antd;
|
||
var Drawer = antd.Drawer;
|
||
var Button = antd.Button;
|
||
var Input = antd.Input;
|
||
var Select = antd.Select;
|
||
var Switch = antd.Switch;
|
||
var Modal = antd.Modal;
|
||
var Table = antd.Table;
|
||
var Tag = antd.Tag;
|
||
var message = antd.message;
|
||
|
||
function RequiredLabel(text) {
|
||
return React.createElement('span', { style: { display: 'inline-flex', alignItems: 'center', gap: 4 } },
|
||
React.createElement('span', { style: { color: '#ef4444', fontWeight: 600 } }, '*'),
|
||
React.createElement('span', null, text)
|
||
);
|
||
}
|
||
|
||
function isEmpty(v) {
|
||
return v === null || v === undefined || String(v).trim() === '';
|
||
}
|
||
|
||
function filterOption(input, option) {
|
||
var label = (option && (option.label || option.children)) || '';
|
||
return String(label).toLowerCase().indexOf(String(input || '').toLowerCase()) >= 0;
|
||
}
|
||
|
||
function fileToDataUrl(file, cb) {
|
||
try {
|
||
var reader = new FileReader();
|
||
reader.onload = function (e) { cb(null, (e && e.target && e.target.result) || ''); };
|
||
reader.onerror = function () { cb(new Error('read error')); };
|
||
reader.readAsDataURL(file);
|
||
} catch (e) { cb(e); }
|
||
}
|
||
|
||
var reserveVehicles = useMemo(function () {
|
||
return [
|
||
{ plateNo: '京A12345', vehicleType: '牵引车', brand: '东风', model: 'DFH1180', vin: 'LJNAU1A2XK1234567', hasAd: true, adPhoto: [{ uid: 'ad1', name: '广告照片.jpg', url: 'https://dummyimage.com/600x400/e2e8f0/475569&text=Ad' }], bigWordPhoto: [{ uid: 'bw1', name: '放大字.jpg', url: 'https://dummyimage.com/600x400/e2e8f0/475569&text=BigWord' }], hasTailboard: true },
|
||
{ plateNo: '浙F80088', vehicleType: '厢式车', brand: '福田', model: 'BJ1180', vin: 'LJNAU1A2XK7654321', hasAd: false, adPhoto: [], bigWordPhoto: [], hasTailboard: false },
|
||
{ plateNo: '沪A30003', vehicleType: '厢式车', brand: '重汽', model: 'HOWO-T5G', vin: 'LJNAU1A2XK9999000', hasAd: true, adPhoto: [{ uid: 'ad2', name: '广告2.jpg', url: 'https://dummyimage.com/600x400/e2e8f0/475569&text=Ad2' }], bigWordPhoto: [{ uid: 'bw2', name: '放大字2.jpg', url: 'https://dummyimage.com/600x400/e2e8f0/475569&text=BW2' }], hasTailboard: true },
|
||
{ plateNo: '粤AGP4598', vehicleType: '4.5吨冷链车', brand: '现代', model: '帕力安牌4.5吨冷链车', vin: 'LNBSCPKB9RR223402', hasAd: false, adPhoto: [], bigWordPhoto: [], hasTailboard: false }
|
||
];
|
||
}, []);
|
||
|
||
var plateOptions = useMemo(function () {
|
||
return reserveVehicles.map(function (v) { return { value: v.plateNo, label: v.plateNo }; });
|
||
}, [reserveVehicles]);
|
||
|
||
var vehicleByPlate = useMemo(function () {
|
||
var map = {};
|
||
reserveVehicles.forEach(function (v) { map[v.plateNo] = v; });
|
||
return map;
|
||
}, [reserveVehicles]);
|
||
|
||
function buildInitialForm(rec) {
|
||
var plate = (rec && rec.plateNo && String(rec.plateNo).trim()) || undefined;
|
||
var veh = plate ? vehicleByPlate[plate] : null;
|
||
if (!veh && rec && rec.brand) {
|
||
veh = { plateNo: plate, vehicleType: rec.vehicleType || '', brand: rec.brand || '', model: rec.model || '', vin: rec.vin || '', hasAd: false, adPhoto: [], bigWordPhoto: [], hasTailboard: false };
|
||
}
|
||
return {
|
||
plateNo: plate,
|
||
vehicleType: (veh && veh.vehicleType) || (rec && rec.vehicleType) || '',
|
||
brand: (veh && veh.brand) || (rec && rec.brand) || '',
|
||
model: (veh && veh.model) || (rec && rec.model) || '',
|
||
vin: (veh && veh.vin) || (rec && rec.vin) || '',
|
||
hasAd: !!(veh && veh.hasAd),
|
||
adPhoto: (veh && veh.adPhoto) || [],
|
||
bigWordPhoto: (veh && veh.bigWordPhoto) || [],
|
||
hasTailboard: !!(veh && veh.hasTailboard),
|
||
spareTirePhoto: [],
|
||
spareTireDepth: '',
|
||
trainingRecognized: false,
|
||
driverLicenses: [],
|
||
mileageKm: rec && rec.deliveryMileage != null ? String(rec.deliveryMileage) : '',
|
||
batteryPct: rec && rec.deliveryElec != null ? String(rec.deliveryElec) : '',
|
||
hydrogenAmount: rec && rec.deliveryH2 != null ? String(rec.deliveryH2) : '',
|
||
hydrogenUnit: (rec && rec.deliveryH2Unit === 'MPa') ? 'MPa' : '%',
|
||
serviceFee: ''
|
||
};
|
||
}
|
||
|
||
var formState = useState(buildInitialForm(null));
|
||
var form = formState[0];
|
||
var setForm = formState[1];
|
||
var activeSectionState = useState('basic');
|
||
var activeSection = activeSectionState[0];
|
||
var setActiveSection = activeSectionState[1];
|
||
var submittingState = useState(false);
|
||
var submitting = submittingState[0];
|
||
var setSubmitting = submittingState[1];
|
||
var previewState = useState({ open: false, url: '', title: '' });
|
||
var ocrModalState = useState({ open: false, photoUrl: '', depth: '6.50' });
|
||
var inspectionOpenState = useState(false);
|
||
var trainingInputRef = useRef(null);
|
||
|
||
useEffect(function () {
|
||
if (open && record) {
|
||
setForm(buildInitialForm(record));
|
||
setActiveSection('basic');
|
||
setSubmitting(false);
|
||
}
|
||
}, [open, record && record.id]);
|
||
|
||
function updateForm(patch) {
|
||
setForm(function (p) { return Object.assign({}, p, patch); });
|
||
}
|
||
|
||
function handlePlateChange(v) {
|
||
var veh = vehicleByPlate[v];
|
||
updateForm({
|
||
plateNo: v,
|
||
vehicleType: (veh && veh.vehicleType) || '',
|
||
brand: (veh && veh.brand) || '',
|
||
model: (veh && veh.model) || '',
|
||
vin: (veh && veh.vin) || '',
|
||
hasAd: !!(veh && veh.hasAd),
|
||
adPhoto: (veh && (veh.adPhoto || [])) || [],
|
||
bigWordPhoto: (veh && (veh.bigWordPhoto || [])) || [],
|
||
hasTailboard: !!(veh && veh.hasTailboard),
|
||
spareTirePhoto: [],
|
||
spareTireDepth: '',
|
||
trainingRecognized: false,
|
||
driverLicenses: []
|
||
});
|
||
}
|
||
|
||
function makeThumb(url, onPreview, onRemove) {
|
||
return React.createElement('div', { style: { width: 72, height: 72, borderRadius: 8, border: '1px solid #e2e8f0', overflow: 'hidden', position: 'relative', background: '#f8fafc' } },
|
||
React.createElement('img', { src: url, style: { width: '100%', height: '100%', objectFit: 'cover', cursor: 'pointer' }, onClick: onPreview }),
|
||
onRemove ? React.createElement('button', {
|
||
type: 'button',
|
||
'aria-label': '删除图片',
|
||
style: { position: 'absolute', right: 4, top: 4, width: 22, height: 22, borderRadius: 999, border: 'none', background: 'rgba(15,23,42,.65)', color: '#fff', cursor: 'pointer', fontSize: 12, lineHeight: '22px', padding: 0 },
|
||
onClick: function (e) { e.stopPropagation(); onRemove(); }
|
||
}, '×') : null
|
||
);
|
||
}
|
||
|
||
function UploadBox(uploadProps) {
|
||
var label = uploadProps.label;
|
||
var value = uploadProps.value || [];
|
||
var max = uploadProps.max || 1;
|
||
var onChange = uploadProps.onChange;
|
||
function handlePick(e) {
|
||
var f = e && e.target && e.target.files && e.target.files[0];
|
||
if (!f) return;
|
||
fileToDataUrl(f, function (err, url) {
|
||
if (err) { message.error('上传失败'); return; }
|
||
var next = value.slice();
|
||
next.push({ uid: String(Date.now()), name: f.name || 'image', url: url });
|
||
if (next.length > max) next = next.slice(next.length - max);
|
||
onChange && onChange(next);
|
||
});
|
||
e.target.value = '';
|
||
}
|
||
return React.createElement('div', null,
|
||
label ? React.createElement('div', { style: { fontSize: 13, color: '#475569', marginBottom: 8, fontWeight: 500 } }, label) : null,
|
||
React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap' } },
|
||
value.map(function (f) {
|
||
return React.createElement('div', { key: f.uid },
|
||
makeThumb(f.url, function () { previewState[1]({ open: true, url: f.url, title: f.name }); }, function () { onChange && onChange(value.filter(function (x) { return x.uid !== f.uid; })); })
|
||
);
|
||
}),
|
||
value.length >= max ? null : React.createElement('label', { style: { width: 72, height: 72, borderRadius: 8, border: '1px dashed #cbd5e1', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#64748b', cursor: 'pointer', fontSize: 13, background: '#fff', transition: 'border-color .2s' } },
|
||
React.createElement('input', { type: 'file', accept: 'image/*', style: { display: 'none' }, onChange: handlePick }),
|
||
'上传'
|
||
)
|
||
)
|
||
);
|
||
}
|
||
|
||
function FormItem(itemProps) {
|
||
return React.createElement('div', { style: { marginBottom: 16, minWidth: 0 } },
|
||
React.createElement('div', { style: { fontSize: 13, color: '#475569', marginBottom: 6, fontWeight: 500 } },
|
||
itemProps.required ? RequiredLabel(itemProps.label) : itemProps.label
|
||
),
|
||
itemProps.children
|
||
);
|
||
}
|
||
|
||
var inspectionListState = useState([{ key: 'ins-1', category: '车灯', item: '大灯', checked: true, treadDepth: '', remark: '' }]);
|
||
var inspectionList = inspectionListState[0];
|
||
|
||
var sectionNav = [
|
||
{ key: 'basic', label: '车辆信息' },
|
||
{ key: 'equip', label: '设备证照' },
|
||
{ key: 'metrics', label: '交车数据' },
|
||
{ key: 'photos', label: '交车照片' }
|
||
];
|
||
|
||
function scrollToSection(key) {
|
||
setActiveSection(key);
|
||
var el = document.getElementById('dv-edit-section-' + key);
|
||
if (el && el.scrollIntoView) el.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||
}
|
||
|
||
function validateSubmit() {
|
||
if (isEmpty(form.plateNo)) return '请选择车牌号';
|
||
if (form.hasAd) {
|
||
if (!form.adPhoto.length) return '请上传广告照片';
|
||
if (!form.bigWordPhoto.length) return '请上传放大字照片';
|
||
}
|
||
if (!form.spareTirePhoto.length) return '请上传备胎照片';
|
||
if (isEmpty(form.spareTireDepth)) return '请填写备胎胎纹深度';
|
||
if (!form.trainingRecognized) return '请上传验车码并完成识别';
|
||
if (isEmpty(form.mileageKm)) return '请填写交车里程';
|
||
if (isEmpty(form.batteryPct)) return '请填写交车电量';
|
||
if (isEmpty(form.hydrogenAmount)) return '请填写交车氢量';
|
||
return '';
|
||
}
|
||
|
||
function buildPatchFromForm() {
|
||
return {
|
||
plateNo: form.plateNo || '',
|
||
vehicleType: form.vehicleType,
|
||
brand: form.brand,
|
||
model: form.model,
|
||
vin: form.vin,
|
||
deliveryMileage: form.mileageKm === '' ? null : Number(form.mileageKm),
|
||
deliveryElec: form.batteryPct === '' ? null : Number(form.batteryPct),
|
||
deliveryH2: form.hydrogenAmount === '' ? null : Number(form.hydrogenAmount),
|
||
deliveryH2Unit: form.hydrogenUnit,
|
||
deliveryStatus: '已保存'
|
||
};
|
||
}
|
||
|
||
function handleSaveClick() {
|
||
onSave && onSave(buildPatchFromForm());
|
||
message.success('已保存');
|
||
}
|
||
|
||
function handleSubmitClick() {
|
||
var err = validateSubmit();
|
||
if (err) { message.error(err); return; }
|
||
Modal.confirm({
|
||
title: '确认交车',
|
||
content: '请确认信息填写无误,点击确认完成该车辆交车。',
|
||
okText: '确认',
|
||
cancelText: '取消',
|
||
onOk: function () {
|
||
setSubmitting(true);
|
||
setTimeout(function () {
|
||
setSubmitting(false);
|
||
onSubmit && onSubmit(buildPatchFromForm());
|
||
message.success('交车成功');
|
||
onClose && onClose();
|
||
}, 400);
|
||
}
|
||
});
|
||
}
|
||
|
||
function handleTrainingPick(e) {
|
||
var f = e && e.target && e.target.files && e.target.files[0];
|
||
if (!f) return;
|
||
setTimeout(function () {
|
||
updateForm({
|
||
trainingRecognized: true,
|
||
driverLicenses: [
|
||
{ uid: 'id1', name: '身份证正面', url: 'https://dummyimage.com/600x400/e2e8f0/475569&text=ID-F' },
|
||
{ uid: 'id2', name: '身份证反面', url: 'https://dummyimage.com/600x400/e2e8f0/475569&text=ID-B' },
|
||
{ uid: 'dl', name: '驾驶证', url: 'https://dummyimage.com/600x400/e2e8f0/475569&text=DL' },
|
||
{ uid: 'qc', name: '从业资格证', url: 'https://dummyimage.com/600x400/e2e8f0/475569&text=QC' }
|
||
]
|
||
});
|
||
message.success('验车码识别成功');
|
||
}, 500);
|
||
e.target.value = '';
|
||
}
|
||
|
||
if (!open) return null;
|
||
|
||
var drawerTitle = React.createElement('div', { style: { paddingRight: 24 } },
|
||
React.createElement('div', { style: { fontSize: 16, fontWeight: 700, color: '#0f172a', lineHeight: 1.4 } }, '编辑交车单'),
|
||
record ? React.createElement('div', { style: { marginTop: 6, fontSize: 13, color: '#64748b', display: 'flex', flexWrap: 'wrap', gap: 8, alignItems: 'center' } },
|
||
React.createElement(Tag, { style: { margin: 0, border: 'none', background: '#eff6ff', color: '#2563eb', fontWeight: 600 } }, record.customerName || '-'),
|
||
React.createElement('span', null, record.contractCode || '-'),
|
||
React.createElement(Tag, { style: { margin: 0, border: 'none', background: '#f1f5f9', color: '#475569' } }, record.deliveryStatus || '未开始')
|
||
) : null
|
||
);
|
||
|
||
var summaryCard = record ? React.createElement('div', { style: { marginBottom: 16, padding: '12px 14px', borderRadius: 10, background: 'linear-gradient(135deg,#f8fafc 0%,#fff 100%)', border: '1px solid #e2e8f0', display: 'grid', gridTemplateColumns: 'repeat(2,minmax(0,1fr))', gap: '8px 16px', fontSize: 13 } },
|
||
React.createElement('div', null, React.createElement('span', { style: { color: '#94a3b8' } }, '项目:'), record.projectName || '-'),
|
||
React.createElement('div', null, React.createElement('span', { style: { color: '#94a3b8' } }, '交车地点:'), record.deliveryAddress || '-'),
|
||
React.createElement('div', null, React.createElement('span', { style: { color: '#94a3b8' } }, '品牌型号:'), (record.brand || '-') + ' / ' + (record.model || '-')),
|
||
React.createElement('div', null, React.createElement('span', { style: { color: '#94a3b8' } }, '任务来源:'), record.taskSource || '-')
|
||
) : null;
|
||
|
||
var sectionNavEl = React.createElement('div', { style: { position: 'sticky', top: 0, zIndex: 3, background: '#fff', padding: '8px 0 12px', marginBottom: 8, borderBottom: '1px solid #f1f5f9', display: 'flex', gap: 8, flexWrap: 'wrap' } },
|
||
sectionNav.map(function (s) {
|
||
var active = activeSection === s.key;
|
||
return React.createElement('button', {
|
||
key: s.key,
|
||
type: 'button',
|
||
onClick: function () { scrollToSection(s.key); },
|
||
style: {
|
||
border: 'none',
|
||
cursor: 'pointer',
|
||
padding: '6px 14px',
|
||
borderRadius: 999,
|
||
fontSize: 13,
|
||
fontWeight: active ? 600 : 500,
|
||
background: active ? '#2563eb' : '#f1f5f9',
|
||
color: active ? '#fff' : '#475569',
|
||
transition: 'background .2s,color .2s'
|
||
}
|
||
}, s.label);
|
||
})
|
||
);
|
||
|
||
var sectionBasic = React.createElement('div', { id: 'dv-edit-section-basic', style: { scrollMarginTop: 56 } },
|
||
React.createElement('div', { style: { fontSize: 14, fontWeight: 700, color: '#0f172a', marginBottom: 12, paddingLeft: 10, borderLeft: '3px solid #2563eb' } }, '车辆信息'),
|
||
React.createElement('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(2,minmax(0,1fr))', gap: '0 16px' } },
|
||
React.createElement(FormItem, { label: '车牌号', required: true },
|
||
React.createElement(Select, { value: form.plateNo, options: plateOptions, showSearch: true, filterOption: filterOption, placeholder: '请输入或选择车牌号', allowClear: true, style: { width: '100%' }, onChange: handlePlateChange })
|
||
),
|
||
React.createElement(FormItem, { label: '车辆类型' }, React.createElement(Input, { value: form.vehicleType, disabled: true })),
|
||
React.createElement(FormItem, { label: '品牌' }, React.createElement(Input, { value: form.brand, disabled: true })),
|
||
React.createElement(FormItem, { label: '型号' }, React.createElement(Input, { value: form.model, disabled: true })),
|
||
React.createElement(FormItem, { label: '车辆识别代码' }, React.createElement(Input, { value: form.vin, disabled: true }))
|
||
)
|
||
);
|
||
|
||
var sectionEquip = React.createElement('div', { id: 'dv-edit-section-equip', style: { scrollMarginTop: 56, marginTop: 24 } },
|
||
React.createElement('div', { style: { fontSize: 14, fontWeight: 700, color: '#0f172a', marginBottom: 12, paddingLeft: 10, borderLeft: '3px solid #2563eb' } }, '设备与证照'),
|
||
React.createElement(FormItem, { label: '车身广告及放大字', required: true },
|
||
React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 10 } },
|
||
React.createElement(Switch, { checked: !!form.hasAd, onChange: function (v) { updateForm({ hasAd: !!v }); } }),
|
||
React.createElement('span', { style: { fontSize: 13, color: '#64748b' } }, form.hasAd ? '有车身广告' : '无车身广告')
|
||
)
|
||
),
|
||
form.hasAd ? React.createElement('div', { style: { display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16, marginBottom: 8 } },
|
||
React.createElement(UploadBox, { label: RequiredLabel('广告照片'), value: form.adPhoto, max: 1, onChange: function (l) { updateForm({ adPhoto: l }); } }),
|
||
React.createElement(UploadBox, { label: RequiredLabel('放大字照片'), value: form.bigWordPhoto, max: 1, onChange: function (l) { updateForm({ bigWordPhoto: l }); } })
|
||
) : null,
|
||
React.createElement(FormItem, { label: '尾板', required: true },
|
||
React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 10 } },
|
||
React.createElement(Switch, { checked: !!form.hasTailboard, onChange: function (v) { updateForm({ hasTailboard: !!v }); } }),
|
||
React.createElement('span', { style: { fontSize: 13, color: '#64748b' } }, form.hasTailboard ? '有尾板' : '无尾板')
|
||
)
|
||
),
|
||
React.createElement('div', { style: { display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16 } },
|
||
React.createElement(UploadBox, { label: RequiredLabel('备胎照片'), value: form.spareTirePhoto, max: 1, onChange: function (l) { updateForm({ spareTirePhoto: l }); if (l && l.length) ocrModalState[1]({ open: true, photoUrl: l[0].url, depth: '6.50' }); } }),
|
||
React.createElement(FormItem, { label: '备胎胎纹深度', required: true },
|
||
React.createElement(Input, { value: form.spareTireDepth, placeholder: '请输入', addonAfter: 'mm', onChange: function (e) { updateForm({ spareTireDepth: e.target.value }); } })
|
||
)
|
||
),
|
||
React.createElement(FormItem, { label: '驾驶培训', required: true },
|
||
form.trainingRecognized
|
||
? React.createElement('span', { style: { color: '#16a34a', fontWeight: 600, fontSize: 13 } }, '已完成视频培训')
|
||
: React.createElement(React.Fragment, null,
|
||
React.createElement('input', { type: 'file', ref: trainingInputRef, accept: 'image/*', style: { display: 'none' }, onChange: handleTrainingPick }),
|
||
React.createElement(Button, { onClick: function () { trainingInputRef.current && trainingInputRef.current.click(); } }, '上传验车码')
|
||
)
|
||
),
|
||
form.driverLicenses && form.driverLicenses.length ? React.createElement(FormItem, { label: '司机证照' },
|
||
React.createElement('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(4,minmax(0,1fr))', gap: 12 } },
|
||
form.driverLicenses.map(function (f) {
|
||
return React.createElement('div', { key: f.uid },
|
||
makeThumb(f.url, function () { previewState[1]({ open: true, url: f.url, title: f.name }); }),
|
||
React.createElement('div', { style: { marginTop: 4, fontSize: 12, color: '#64748b', textAlign: 'center' } }, f.name)
|
||
);
|
||
})
|
||
)
|
||
) : null,
|
||
React.createElement(FormItem, { label: '车辆检查' },
|
||
React.createElement(Button, { onClick: function () { inspectionOpenState[1](true); } }, '交车检查单')
|
||
)
|
||
);
|
||
|
||
var sectionMetrics = React.createElement('div', { id: 'dv-edit-section-metrics', style: { scrollMarginTop: 56, marginTop: 24 } },
|
||
React.createElement('div', { style: { fontSize: 14, fontWeight: 700, color: '#0f172a', marginBottom: 12, paddingLeft: 10, borderLeft: '3px solid #2563eb' } }, '交车数据'),
|
||
React.createElement('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(2,minmax(0,1fr))', gap: '0 16px' } },
|
||
React.createElement(FormItem, { label: '交车里程', required: true },
|
||
React.createElement(Input, { value: form.mileageKm, placeholder: '请输入', addonAfter: 'km', onChange: function (e) { updateForm({ mileageKm: e.target.value }); } })
|
||
),
|
||
React.createElement(FormItem, { label: '交车电量', required: true },
|
||
React.createElement(Input, { value: form.batteryPct, placeholder: '请输入', addonAfter: '%', onChange: function (e) { updateForm({ batteryPct: e.target.value }); } })
|
||
),
|
||
React.createElement(FormItem, { label: '交车氢量', required: true },
|
||
React.createElement(Input, { value: form.hydrogenAmount, placeholder: '请输入', addonAfter: form.hydrogenUnit, onChange: function (e) { updateForm({ hydrogenAmount: e.target.value }); } })
|
||
),
|
||
React.createElement(FormItem, { label: '送车服务费' },
|
||
React.createElement(Input, { value: form.serviceFee, placeholder: '选填', addonAfter: '元', onChange: function (e) { updateForm({ serviceFee: e.target.value }); } })
|
||
)
|
||
)
|
||
);
|
||
|
||
var photoKeys = ['仪表盘', '车辆正面', '车辆左前方'];
|
||
var photoState = useState({ vehicle: { '仪表盘': [], '车辆正面': [], '车辆左前方': [] } });
|
||
var photos = photoState[0];
|
||
var setPhotos = photoState[1];
|
||
|
||
var sectionPhotos = React.createElement('div', { id: 'dv-edit-section-photos', style: { scrollMarginTop: 56, marginTop: 24, marginBottom: 24 } },
|
||
React.createElement('div', { style: { fontSize: 14, fontWeight: 700, color: '#0f172a', marginBottom: 12, paddingLeft: 10, borderLeft: '3px solid #2563eb' } }, '交车照片'),
|
||
React.createElement('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(3,minmax(0,1fr))', gap: 16 } },
|
||
photoKeys.map(function (k) {
|
||
return React.createElement(UploadBox, {
|
||
key: k,
|
||
label: RequiredLabel(k),
|
||
value: photos.vehicle[k] || [],
|
||
max: 1,
|
||
onChange: function (l) {
|
||
setPhotos(function (p) {
|
||
var n = Object.assign({}, p);
|
||
n.vehicle = Object.assign({}, p.vehicle);
|
||
n.vehicle[k] = l;
|
||
return n;
|
||
});
|
||
}
|
||
});
|
||
})
|
||
),
|
||
React.createElement('div', { style: { marginTop: 8, fontSize: 12, color: '#94a3b8' } }, '原型:完整照片清单见交车单编辑页需求说明')
|
||
);
|
||
|
||
return React.createElement(React.Fragment, null,
|
||
React.createElement(Drawer, {
|
||
open: open,
|
||
onClose: onClose,
|
||
width: Math.min(960, typeof window !== 'undefined' ? window.innerWidth - 24 : 960),
|
||
title: drawerTitle,
|
||
destroyOnClose: true,
|
||
styles: {
|
||
body: { padding: '16px 20px 88px', background: '#f8fafc' },
|
||
footer: { borderTop: '1px solid #e2e8f0', padding: '12px 20px' }
|
||
},
|
||
footer: React.createElement('div', { style: { display: 'flex', justifyContent: 'flex-end', gap: 10 } },
|
||
React.createElement(Button, { onClick: onClose, disabled: submitting }, '取消'),
|
||
React.createElement(Button, { onClick: handleSaveClick, disabled: submitting }, '保存'),
|
||
React.createElement(Button, { type: 'primary', loading: submitting, onClick: handleSubmitClick }, '提交')
|
||
)
|
||
},
|
||
summaryCard,
|
||
sectionNavEl,
|
||
React.createElement('div', { style: { background: '#fff', borderRadius: 12, border: '1px solid #e2e8f0', padding: '16px 16px 8px' } },
|
||
sectionBasic,
|
||
sectionEquip,
|
||
sectionMetrics,
|
||
sectionPhotos
|
||
)
|
||
),
|
||
React.createElement(Modal, {
|
||
open: !!previewState[0].open,
|
||
title: previewState[0].title || '预览',
|
||
footer: null,
|
||
onCancel: function () { previewState[1]({ open: false, url: '', title: '' }); },
|
||
width: 860
|
||
}, previewState[0].url ? React.createElement('img', { src: previewState[0].url, alt: previewState[0].title, style: { width: '100%', maxHeight: '70vh', objectFit: 'contain' } }) : null),
|
||
React.createElement(Modal, {
|
||
open: !!ocrModalState[0].open,
|
||
title: '备胎识别',
|
||
onCancel: function () { ocrModalState[1](Object.assign({}, ocrModalState[0], { open: false })); },
|
||
onOk: function () { updateForm({ spareTireDepth: ocrModalState[0].depth }); ocrModalState[1](Object.assign({}, ocrModalState[0], { open: false })); message.success('已反写胎纹深度'); },
|
||
okText: '确认',
|
||
cancelText: '取消'
|
||
},
|
||
React.createElement(Input, { value: ocrModalState[0].depth, addonAfter: 'mm', onChange: function (e) { ocrModalState[1](Object.assign({}, ocrModalState[0], { depth: e.target.value })); } })
|
||
),
|
||
React.createElement(Drawer, {
|
||
open: inspectionOpenState[0],
|
||
title: '交车检查单',
|
||
width: 720,
|
||
onClose: function () { inspectionOpenState[1](false); },
|
||
footer: React.createElement(Button, { type: 'primary', onClick: function () { message.success('检查单已保存'); inspectionOpenState[1](false); } }, '确定')
|
||
},
|
||
React.createElement(Table, {
|
||
rowKey: 'key',
|
||
size: 'small',
|
||
pagination: false,
|
||
bordered: true,
|
||
dataSource: inspectionList,
|
||
columns: [
|
||
{ title: '类别', dataIndex: 'category', width: 100 },
|
||
{ title: '检查项目', dataIndex: 'item', width: 140 },
|
||
{ title: '检查情况', dataIndex: 'checked', width: 100, render: function (v) { return React.createElement(Switch, { checked: !!v, disabled: true }); } },
|
||
{ title: '备注', dataIndex: 'remark' }
|
||
]
|
||
})
|
||
)
|
||
);
|
||
}
|
||
|
||
if (typeof window !== 'undefined') {
|
||
window.DeliveryEditDrawer = DeliveryEditDrawer;
|
||
}
|