feat(web): 同步 web 端目录更新至 Gitea
包含加氢站站点信息、运维交车/故障、台账与数据分析等页面新增与改动。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
688
web端/工作台.jsx
688
web端/工作台.jsx
@@ -27,9 +27,12 @@ const Component = function () {
|
||||
var Typography = antd.Typography;
|
||||
var message = antd.message;
|
||||
var Tooltip = antd.Tooltip;
|
||||
var Input = antd.Input;
|
||||
var Checkbox = antd.Checkbox;
|
||||
|
||||
var Text = Typography.Text;
|
||||
var Title = Typography.Title;
|
||||
var RangePicker = DatePicker.RangePicker;
|
||||
|
||||
var pageBg = '#f5f7fa';
|
||||
var cardRadius = 12;
|
||||
@@ -94,6 +97,51 @@ const Component = function () {
|
||||
var overdueReturnModalOpen = overdueReturnModalState[0];
|
||||
var setOverdueReturnModalOpen = overdueReturnModalState[1];
|
||||
|
||||
var inspectModalState = useState(false);
|
||||
var inspectModalOpen = inspectModalState[0];
|
||||
var setInspectModalOpen = inspectModalState[1];
|
||||
|
||||
var genDeliveryPickOpenState = useState(false);
|
||||
var genDeliveryPickOpen = genDeliveryPickOpenState[0];
|
||||
var setGenDeliveryPickOpen = genDeliveryPickOpenState[1];
|
||||
var genDeliveryConfigOpenState = useState(false);
|
||||
var genDeliveryConfigOpen = genDeliveryConfigOpenState[0];
|
||||
var setGenDeliveryConfigOpen = genDeliveryConfigOpenState[1];
|
||||
var genDeliveryCustomerState = useState('');
|
||||
var genDeliveryCustomer = genDeliveryCustomerState[0];
|
||||
var setGenDeliveryCustomer = genDeliveryCustomerState[1];
|
||||
var genDeliveryProjectIdState = useState(undefined);
|
||||
var genDeliveryProjectId = genDeliveryProjectIdState[0];
|
||||
var setGenDeliveryProjectId = genDeliveryProjectIdState[1];
|
||||
var genDeliveryExpectedState = useState(null);
|
||||
var genDeliveryExpected = genDeliveryExpectedState[0];
|
||||
var setGenDeliveryExpected = genDeliveryExpectedState[1];
|
||||
var genDeliveryBillingState = useState(null);
|
||||
var genDeliveryBilling = genDeliveryBillingState[0];
|
||||
var setGenDeliveryBilling = genDeliveryBillingState[1];
|
||||
var genDeliverySelectedKeysState = useState([]);
|
||||
var genDeliverySelectedKeys = genDeliverySelectedKeysState[0];
|
||||
var setGenDeliverySelectedKeys = genDeliverySelectedKeysState[1];
|
||||
|
||||
var genReturnPickOpenState = useState(false);
|
||||
var genReturnPickOpen = genReturnPickOpenState[0];
|
||||
var setGenReturnPickOpen = genReturnPickOpenState[1];
|
||||
var genReturnConfigOpenState = useState(false);
|
||||
var genReturnConfigOpen = genReturnConfigOpenState[0];
|
||||
var setGenReturnConfigOpen = genReturnConfigOpenState[1];
|
||||
var genReturnCustomerState = useState('');
|
||||
var genReturnCustomer = genReturnCustomerState[0];
|
||||
var setGenReturnCustomer = genReturnCustomerState[1];
|
||||
var genReturnProjectIdState = useState(undefined);
|
||||
var genReturnProjectId = genReturnProjectIdState[0];
|
||||
var setGenReturnProjectId = genReturnProjectIdState[1];
|
||||
var genReturnDateState = useState(null);
|
||||
var genReturnDate = genReturnDateState[0];
|
||||
var setGenReturnDate = genReturnDateState[1];
|
||||
var genReturnSelectedKeysState = useState([]);
|
||||
var genReturnSelectedKeys = genReturnSelectedKeysState[0];
|
||||
var setGenReturnSelectedKeys = genReturnSelectedKeysState[1];
|
||||
|
||||
// 业管-能源部 · 独立卡片「本日导入加氢明细条数」:0 条时卡片内显示提示文案(联调接接口)
|
||||
var energyH2ImportTodayState = useState(0);
|
||||
var energyH2ImportTodayCount = energyH2ImportTodayState[0];
|
||||
@@ -285,6 +333,26 @@ const Component = function () {
|
||||
setOverdueReturnModalOpen(true);
|
||||
}, []);
|
||||
|
||||
// 工作台-年审/等级评定:根据提供的列表要求展示示意数据
|
||||
var inspectMockRows = useMemo(function () {
|
||||
var pad = function (n) { return n < 10 ? '0' + n : '' + n; };
|
||||
var fmtD = function (d) {
|
||||
return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate());
|
||||
};
|
||||
var base = new Date();
|
||||
base.setHours(12, 0, 0, 0);
|
||||
var addDays = function (days) {
|
||||
var x = new Date(base.getTime());
|
||||
x.setDate(x.getDate() + days);
|
||||
return x;
|
||||
};
|
||||
return [
|
||||
{ id: 'wb_insp_1', plateNo: '沪A12345', vehicleType: '重型厢式货车', brand: '东风', model: 'DFH1180', nextDate: fmtD(addDays(2)), remainDays: 2 },
|
||||
{ id: 'wb_insp_2', plateNo: '苏B88888', vehicleType: '厢式货车', brand: '福田', model: 'BJ1180', nextDate: fmtD(addDays(5)), remainDays: 5 },
|
||||
{ id: 'wb_insp_3', plateNo: '浙C66666', vehicleType: '轻型厢式货车', brand: '江淮', model: 'HFC1180', nextDate: fmtD(addDays(-1)), remainDays: -1 }
|
||||
];
|
||||
}, []);
|
||||
|
||||
// 待办任务表(原型:任务类型、任务名称、状态、任务时间、操作)
|
||||
var dashboardTodoRows = useMemo(function () {
|
||||
return [
|
||||
@@ -832,13 +900,295 @@ const Component = function () {
|
||||
);
|
||||
}
|
||||
|
||||
var deliveryTaskProjectList = useMemo(function () {
|
||||
return [
|
||||
{
|
||||
id: 'p1',
|
||||
name: '嘉兴某某物流氢能运输项目',
|
||||
contractCode: 'JXZL20260216YW101235A',
|
||||
customerName: '嘉兴某某物流有限公司',
|
||||
deliveryRegion: '浙江省 / 嘉兴市',
|
||||
deliveryLocation: '浙江省嘉兴市南湖区科技大道1号',
|
||||
vehicles: [
|
||||
{ key: 'v1', seq: 1, brand: '东风', model: '氢燃料电池重卡 H31', plateNo: '浙A10001', vin: 'LFV2BJCH8K3123456', monthRent: '12800', serviceFee: '800', deposit: '30000', remark: '首车', deliveryStatus: 'submitted' },
|
||||
{ key: 'v1c', seq: 1, brand: '东风', model: '氢燃料电池重卡 H31', plateNo: '浙A10000', vin: 'LFV2BJCH8K3000001', monthRent: '12800', serviceFee: '800', deposit: '30000', remark: '已交车样例', deliveryStatus: 'completed' },
|
||||
{ key: 'v2', seq: 2, brand: '东风', model: '氢燃料电池重卡 H31', plateNo: '浙A10002', vin: 'LFV2BJCH8K3123457', monthRent: '12800', serviceFee: '800', deposit: '30000', remark: '', deliveryStatus: 'submitted' },
|
||||
{ key: 'v3', seq: 3, brand: '福田', model: '智蓝氢能轻卡', plateNo: '', vin: 'LZYTBACR2M1234567', monthRent: '8500', serviceFee: '500', deposit: '20000', remark: '待上牌', deliveryStatus: 'none' },
|
||||
{ key: 'v4', seq: 4, brand: '重汽', model: '豪沃氢能牵引车', plateNo: '浙F20001', vin: 'ZZ4257N386FZ12345', monthRent: '15000', serviceFee: '1000', deposit: '35000', remark: '', deliveryStatus: 'none' },
|
||||
{ key: 'v5', seq: 5, brand: '陕汽', model: '德龙氢能自卸', plateNo: '浙F20002', vin: 'SX1313GR456123456', monthRent: '13200', serviceFee: '880', deposit: '32000', remark: '固定线路', deliveryStatus: 'none' }
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'p2',
|
||||
name: '上海某某运输氢能租赁项目',
|
||||
contractCode: 'SHZL20260201YW200123A',
|
||||
customerName: '上海某某运输公司',
|
||||
deliveryRegion: '上海市 / 上海市',
|
||||
deliveryLocation: '上海市浦东新区张江高科技园区',
|
||||
vehicles: [
|
||||
{ key: 'v7', seq: 2, brand: '宇通', model: '氢能公交 ZK6126', plateNo: '沪B40001', vin: 'LZYTAGCF8K4567890', monthRent: '22000', serviceFee: '1200', deposit: '50000', remark: '示范线路', deliveryStatus: 'none' },
|
||||
{ key: 'v8', seq: 3, brand: '福田', model: '欧辉氢能大巴', plateNo: '', vin: 'LZYTBACR2M2345678', monthRent: '19800', serviceFee: '1100', deposit: '45000', remark: '', deliveryStatus: 'none' }
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'p3',
|
||||
name: '杭州某某租赁氢能项目',
|
||||
contractCode: 'HZZL20260115YW100089A',
|
||||
customerName: '杭州某某租赁有限公司',
|
||||
deliveryRegion: '浙江省 / 杭州市',
|
||||
deliveryLocation: '浙江省杭州市余杭区未来科技城',
|
||||
vehicles: [
|
||||
{ key: 'v11', seq: 3, brand: '东风', model: '氢燃料电池厢货', plateNo: '浙A50001', vin: 'LFV2BJCH8K5678901', monthRent: '9200', serviceFee: '520', deposit: '22000', remark: '城配', deliveryStatus: 'none' },
|
||||
{ key: 'v12', seq: 4, brand: '开沃', model: '创源氢能轻卡', plateNo: '浙A50002', vin: 'LJXTBACR9N6789012', monthRent: '8800', serviceFee: '480', deposit: '21000', remark: '', deliveryStatus: 'none' }
|
||||
]
|
||||
}
|
||||
];
|
||||
}, []);
|
||||
|
||||
function filterProjectsByCustomer(customerName) {
|
||||
var kw = String(customerName || '').trim().toLowerCase();
|
||||
if (!kw) return deliveryTaskProjectList;
|
||||
return deliveryTaskProjectList.filter(function (p) {
|
||||
return (p.customerName || '').toLowerCase().indexOf(kw) !== -1;
|
||||
});
|
||||
}
|
||||
|
||||
var genDeliveryCustomerOptions = useMemo(function () {
|
||||
var seen = {};
|
||||
var options = [];
|
||||
deliveryTaskProjectList.forEach(function (p) {
|
||||
var name = p.customerName;
|
||||
if (name && !seen[name]) {
|
||||
seen[name] = true;
|
||||
options.push({ value: name, label: name });
|
||||
}
|
||||
});
|
||||
return options;
|
||||
}, [deliveryTaskProjectList]);
|
||||
|
||||
var genDeliveryProjectOptions = useMemo(function () {
|
||||
if (!genDeliveryCustomer) return [];
|
||||
return deliveryTaskProjectList.filter(function (p) {
|
||||
return p.customerName === genDeliveryCustomer;
|
||||
}).map(function (p) {
|
||||
return { value: p.id, label: p.name };
|
||||
});
|
||||
}, [genDeliveryCustomer, deliveryTaskProjectList]);
|
||||
|
||||
var genReturnProjectOptions = useMemo(function () {
|
||||
return filterProjectsByCustomer(genReturnCustomer).map(function (p) {
|
||||
return { value: p.id, label: p.name };
|
||||
});
|
||||
}, [genReturnCustomer, deliveryTaskProjectList]);
|
||||
|
||||
var selectedGenDeliveryProject = useMemo(function () {
|
||||
return deliveryTaskProjectList.find(function (p) { return p.id === genDeliveryProjectId; }) || null;
|
||||
}, [genDeliveryProjectId, deliveryTaskProjectList]);
|
||||
|
||||
var selectedGenReturnProject = useMemo(function () {
|
||||
return deliveryTaskProjectList.find(function (p) { return p.id === genReturnProjectId; }) || null;
|
||||
}, [genReturnProjectId, deliveryTaskProjectList]);
|
||||
|
||||
var genDeliveryVehicleList = useMemo(function () {
|
||||
if (!selectedGenDeliveryProject) return [];
|
||||
return (selectedGenDeliveryProject.vehicles || []).filter(function (v) {
|
||||
return v.deliveryStatus !== 'completed';
|
||||
});
|
||||
}, [selectedGenDeliveryProject]);
|
||||
|
||||
var genDeliverySelectableVehicles = useMemo(function () {
|
||||
return genDeliveryVehicleList.filter(function (v) {
|
||||
return v.deliveryStatus === 'none';
|
||||
});
|
||||
}, [genDeliveryVehicleList]);
|
||||
|
||||
var genReturnVehicleList = useMemo(function () {
|
||||
if (!selectedGenReturnProject) return [];
|
||||
return (selectedGenReturnProject.vehicles || []).filter(function (v) {
|
||||
return v.plateNo && v.deliveryStatus === 'completed';
|
||||
});
|
||||
}, [selectedGenReturnProject]);
|
||||
|
||||
var genReturnSelectableVehicles = genReturnVehicleList;
|
||||
|
||||
var genDeliveryRowSelection = useMemo(function () {
|
||||
return {
|
||||
selectedRowKeys: genDeliverySelectedKeys,
|
||||
onChange: function (keys) { setGenDeliverySelectedKeys(keys); },
|
||||
getCheckboxProps: function (record) {
|
||||
var disabled = record.deliveryStatus !== 'none';
|
||||
return {
|
||||
disabled: disabled,
|
||||
title: disabled ? (record.deliveryStatus === 'submitted' ? '该车辆已创建交车任务' : '该车辆已完成交车') : undefined
|
||||
};
|
||||
},
|
||||
selections: [
|
||||
{
|
||||
key: 'all',
|
||||
text: '全选可选车辆',
|
||||
onSelect: function () {
|
||||
setGenDeliverySelectedKeys(genDeliverySelectableVehicles.map(function (v) { return v.key; }));
|
||||
}
|
||||
},
|
||||
{ key: 'none', text: '清空选择', onSelect: function () { setGenDeliverySelectedKeys([]); } }
|
||||
]
|
||||
};
|
||||
}, [genDeliverySelectedKeys, genDeliverySelectableVehicles]);
|
||||
|
||||
var genReturnRowSelection = useMemo(function () {
|
||||
return {
|
||||
selectedRowKeys: genReturnSelectedKeys,
|
||||
onChange: function (keys) { setGenReturnSelectedKeys(keys); },
|
||||
selections: [
|
||||
{
|
||||
key: 'all',
|
||||
text: '全选',
|
||||
onSelect: function () {
|
||||
setGenReturnSelectedKeys(genReturnSelectableVehicles.map(function (v) { return v.key; }));
|
||||
}
|
||||
},
|
||||
{ key: 'none', text: '清空选择', onSelect: function () { setGenReturnSelectedKeys([]); } }
|
||||
]
|
||||
};
|
||||
}, [genReturnSelectedKeys, genReturnSelectableVehicles]);
|
||||
|
||||
function renderGenTaskLabel(text, required) {
|
||||
return React.createElement('label', { className: 'workbench-gen-task-form-label' },
|
||||
required ? React.createElement('span', { className: 'req' }, '*') : null,
|
||||
text
|
||||
);
|
||||
}
|
||||
|
||||
function resetGenDeliveryFlow() {
|
||||
setGenDeliveryCustomer('');
|
||||
setGenDeliveryProjectId(undefined);
|
||||
setGenDeliveryExpected(null);
|
||||
setGenDeliveryBilling(null);
|
||||
setGenDeliverySelectedKeys([]);
|
||||
}
|
||||
|
||||
function resetGenReturnFlow() {
|
||||
setGenReturnCustomer('');
|
||||
setGenReturnProjectId(undefined);
|
||||
setGenReturnDate(null);
|
||||
setGenReturnSelectedKeys([]);
|
||||
}
|
||||
|
||||
function openGenDeliveryPick() {
|
||||
resetGenDeliveryFlow();
|
||||
setGenDeliveryPickOpen(true);
|
||||
}
|
||||
|
||||
function openGenReturnPick() {
|
||||
resetGenReturnFlow();
|
||||
setGenReturnPickOpen(true);
|
||||
}
|
||||
|
||||
function handleGenDeliveryNext() {
|
||||
if (!genDeliveryCustomer) {
|
||||
message.warning('请选择客户名称');
|
||||
return;
|
||||
}
|
||||
if (!genDeliveryProjectId) {
|
||||
message.warning('请选择项目名称');
|
||||
return;
|
||||
}
|
||||
setGenDeliveryExpected(null);
|
||||
setGenDeliveryBilling(null);
|
||||
setGenDeliverySelectedKeys([]);
|
||||
setGenDeliveryPickOpen(false);
|
||||
setGenDeliveryConfigOpen(true);
|
||||
}
|
||||
|
||||
function handleGenDeliveryConfirm() {
|
||||
if (!genDeliveryExpected || !genDeliveryExpected.length) {
|
||||
message.warning('请选择预计交车日期');
|
||||
return;
|
||||
}
|
||||
if (!genDeliveryBilling) {
|
||||
message.warning('请选择开始计费日期');
|
||||
return;
|
||||
}
|
||||
if (!genDeliverySelectedKeys.length) {
|
||||
message.warning('请至少勾选一辆车辆');
|
||||
return;
|
||||
}
|
||||
setGenDeliveryConfigOpen(false);
|
||||
resetGenDeliveryFlow();
|
||||
message.success('已生成交车任务(原型)');
|
||||
}
|
||||
|
||||
function handleGenReturnNext() {
|
||||
if (!genReturnCustomer.trim()) {
|
||||
message.warning('请输入客户名称');
|
||||
return;
|
||||
}
|
||||
if (!genReturnProjectId) {
|
||||
message.warning('请选择项目名称');
|
||||
return;
|
||||
}
|
||||
setGenReturnDate(null);
|
||||
setGenReturnSelectedKeys([]);
|
||||
setGenReturnPickOpen(false);
|
||||
setGenReturnConfigOpen(true);
|
||||
}
|
||||
|
||||
function handleGenReturnConfirm() {
|
||||
if (!genReturnDate) {
|
||||
message.warning('请选择预计还车日期');
|
||||
return;
|
||||
}
|
||||
if (!genReturnSelectedKeys.length) {
|
||||
message.warning('请至少勾选一辆车辆');
|
||||
return;
|
||||
}
|
||||
setGenReturnConfigOpen(false);
|
||||
resetGenReturnFlow();
|
||||
message.success('已生成还车任务(原型)');
|
||||
}
|
||||
|
||||
function handleQuickItemClick(it) {
|
||||
if (it.action === 'genDelivery') {
|
||||
openGenDeliveryPick();
|
||||
return;
|
||||
}
|
||||
if (it.action === 'genReturn') {
|
||||
openGenReturnPick();
|
||||
return;
|
||||
}
|
||||
if (it.p) protoNav(it.p);
|
||||
}
|
||||
|
||||
var genDeliveryVehicleColumns = useMemo(function () {
|
||||
return [
|
||||
{ title: '序号', dataIndex: 'seq', key: 'seq', width: 56 },
|
||||
{ title: '品牌', dataIndex: 'brand', key: 'brand', width: 88 },
|
||||
{ title: '型号', dataIndex: 'model', key: 'model', width: 140, ellipsis: true },
|
||||
{ title: '车牌号', dataIndex: 'plateNo', key: 'plateNo', width: 100, render: function (v) { return v || '—'; } },
|
||||
{ title: '车辆识别代码', dataIndex: 'vin', key: 'vin', width: 168, ellipsis: true },
|
||||
{ title: '月租金', dataIndex: 'monthRent', key: 'monthRent', width: 88, render: function (v) { return v ? v + ' 元' : '—'; } },
|
||||
{ title: '备注', dataIndex: 'remark', key: 'remark', width: 100, ellipsis: true, render: function (v) { return v || '—'; } }
|
||||
];
|
||||
}, []);
|
||||
|
||||
var genReturnVehicleColumns = useMemo(function () {
|
||||
return [
|
||||
{ title: '序号', dataIndex: 'seq', key: 'seq', width: 56 },
|
||||
{ title: '品牌', dataIndex: 'brand', key: 'brand', width: 88 },
|
||||
{ title: '型号', dataIndex: 'model', key: 'model', width: 140, ellipsis: true },
|
||||
{ title: '车牌号', dataIndex: 'plateNo', key: 'plateNo', width: 100 },
|
||||
{ title: '车辆识别代码', dataIndex: 'vin', key: 'vin', width: 168, ellipsis: true }
|
||||
];
|
||||
}, []);
|
||||
|
||||
var quickByRole = useMemo(function () {
|
||||
return {
|
||||
ye: {
|
||||
label: '业管',
|
||||
items: [
|
||||
{ t: '生成交车任务', action: 'genDelivery', accent: 'primary' },
|
||||
{ t: '生成还车任务', action: 'genReturn', accent: 'orange' },
|
||||
{ t: '租赁合同', p: 'web端/车辆租赁合同/车辆租赁合同.jsx' },
|
||||
{ t: '交车任务', p: 'web端/业务管理/交车任务.jsx' },
|
||||
{ t: '提车应收款', p: 'web端/财务管理/提车应收款.jsx' },
|
||||
{ t: '租赁账单', p: 'web端/业务管理/租赁账单.jsx' },
|
||||
{ t: '还车应结款', p: 'web端/财务管理/还车应结款.jsx' },
|
||||
@@ -846,7 +1196,7 @@ const Component = function () {
|
||||
{ t: '氢费账单', p: 'web端/财务管理/氢费账单.jsx' },
|
||||
{ t: '电费账单', p: 'web端/财务管理/电费账单.jsx' },
|
||||
{ t: 'ETC账单', p: 'web端/业务管理/ETC管理.jsx' },
|
||||
{ t: '保险管理', p: 'web端/业务管理/保险管理.jsx' },
|
||||
{ t: '保险采购', p: 'web端/业务管理/保险采购.jsx' },
|
||||
{ t: '审批中心', p: 'web端/审批中心.jsx' },
|
||||
{ t: '意见建议', p: 'web端/意见建议.jsx' }
|
||||
]
|
||||
@@ -854,6 +1204,7 @@ const Component = function () {
|
||||
yeEnergy: {
|
||||
label: '业管-能源部',
|
||||
items: [
|
||||
{ t: '站点信息', p: 'web端/加氢站管理/站点信息.jsx' },
|
||||
{ t: '加氢订单管理', p: 'web端/加氢站管理/加氢订单.jsx' },
|
||||
{ t: '意见建议', p: 'web端/意见建议.jsx' }
|
||||
]
|
||||
@@ -863,6 +1214,7 @@ const Component = function () {
|
||||
items: [
|
||||
{ t: '车辆管理', p: 'web端/车辆管理.jsx' },
|
||||
{ t: '证照管理', p: 'web端/运维管理/车辆业务/证照管理.jsx' },
|
||||
{ t: '证照管理-编辑', p: 'web端/运维管理/车辆业务/证照管理-编辑.jsx' },
|
||||
{ t: '备车管理', p: 'web端/运维管理/车辆业务/备车管理.jsx' },
|
||||
{ t: '交车管理', p: 'web端/运维管理/车辆业务/交车管理.jsx' },
|
||||
{ t: '还车管理', p: 'web端/运维管理/车辆业务/还车管理.jsx' },
|
||||
@@ -1005,6 +1357,26 @@ const Component = function () {
|
||||
}
|
||||
];
|
||||
|
||||
var inspectModalColumns = [
|
||||
{ title: '车牌号', dataIndex: 'plateNo', key: 'plateNo', width: 120 },
|
||||
{ title: '车辆类型', dataIndex: 'vehicleType', key: 'vehicleType', width: 140 },
|
||||
{ title: '品牌', dataIndex: 'brand', key: 'brand', width: 100 },
|
||||
{ title: '型号', dataIndex: 'model', key: 'model', width: 120 },
|
||||
{ title: '下次检验/等评日期', dataIndex: 'nextDate', key: 'nextDate', width: 160 },
|
||||
{ title: '剩余天数', dataIndex: 'remainDays', key: 'remainDays', width: 120, render: function(v) {
|
||||
return React.createElement(Text, { type: v < 0 ? 'danger' : undefined }, v + ' 天');
|
||||
} },
|
||||
{
|
||||
title: '操作',
|
||||
key: 'action',
|
||||
width: 80,
|
||||
fixed: 'right',
|
||||
render: function (_, record) {
|
||||
return React.createElement(Button, { type: 'link', size: 'small', style: { padding: 0 }, onClick: function () { message.info('跳转年审详情(原型)'); } }, '年审');
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
var overdueDeliveryModalColumns = [
|
||||
{ title: '预计交车时间', dataIndex: 'expectedDate', key: 'expectedDate', width: 220, ellipsis: true },
|
||||
{ title: '合同编码', dataIndex: 'contractCode', key: 'contractCode', width: 150, ellipsis: true },
|
||||
@@ -1334,6 +1706,14 @@ const Component = function () {
|
||||
openOverdueReturnModal();
|
||||
return;
|
||||
}
|
||||
if (s.key === 'w_ops_inspect') {
|
||||
setInspectModalOpen(true);
|
||||
return;
|
||||
}
|
||||
if (s.key === 'w_ops_maint') {
|
||||
message.info('未来上线,敬请期待');
|
||||
return;
|
||||
}
|
||||
message.info('「' + s.title + '」明细(原型,联调接口后打开列表)');
|
||||
}
|
||||
};
|
||||
@@ -1532,6 +1912,22 @@ const Component = function () {
|
||||
'.workbench-quick-item:focus-visible{box-shadow:0 0 0 2px rgba(22,119,255,0.2)}' +
|
||||
'.workbench-quick-item-icon{flex-shrink:0;width:26px;height:26px;border-radius:6px;background:linear-gradient(135deg,#f0f5ff,#d6e4ff);line-height:26px;text-align:center;font-size:12px;font-weight:600;color:#1677ff}' +
|
||||
'.workbench-quick-item-label{flex:1;min-width:0;font-size:11px;line-height:1.3;color:rgba(0,0,0,0.78);word-break:break-word;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}' +
|
||||
'.workbench-quick-item--action{padding:7px 10px;min-height:38px}' +
|
||||
'.workbench-quick-item--primary{border-color:rgba(22,119,255,0.2);background:linear-gradient(135deg,#f8fbff 0%,#eef5ff 100%)}' +
|
||||
'.workbench-quick-item--primary:hover{border-color:rgba(22,119,255,0.35);background:linear-gradient(135deg,#f0f7ff 0%,#e6f0ff 100%)}' +
|
||||
'.workbench-quick-item--primary .workbench-quick-item-icon{background:linear-gradient(135deg,#1677ff,#4096ff);color:#fff;box-shadow:0 2px 6px rgba(22,119,255,0.25)}' +
|
||||
'.workbench-quick-item--orange{border-color:rgba(250,140,22,0.22);background:linear-gradient(135deg,#fffaf5 0%,#fff3e6 100%)}' +
|
||||
'.workbench-quick-item--orange:hover{border-color:rgba(250,140,22,0.38);background:linear-gradient(135deg,#fff7ef 0%,#ffebd6 100%)}' +
|
||||
'.workbench-quick-item--orange .workbench-quick-item-icon{background:linear-gradient(135deg,#fa8c16,#ffa940);color:#fff;box-shadow:0 2px 6px rgba(250,140,22,0.22)}' +
|
||||
'.workbench-quick-section-hint{font-size:11px;line-height:1.35;color:rgba(0,0,0,0.45);padding:0 4px 6px;font-weight:500;letter-spacing:0.02em}' +
|
||||
'.workbench-gen-task-modal .ant-modal-body{padding-top:14px}' +
|
||||
'.workbench-gen-task-form-label{display:block;margin-bottom:6px;font-size:13px;font-weight:500;color:rgba(0,0,0,0.88);line-height:1.4}' +
|
||||
'.workbench-gen-task-form-label .req{color:#ff4d4f;margin-right:4px}' +
|
||||
'.workbench-gen-task-section{background:#fafafa;border:1px solid rgba(0,0,0,0.06);border-radius:10px;padding:14px 16px;margin-bottom:14px}' +
|
||||
'.workbench-gen-task-readonly{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 16px;margin-bottom:4px}' +
|
||||
'.workbench-gen-task-readonly-item{font-size:12px;line-height:1.45;color:rgba(0,0,0,0.65)}' +
|
||||
'.workbench-gen-task-readonly-item strong{color:rgba(0,0,0,0.88);font-weight:500;margin-right:6px}' +
|
||||
'.workbench-gen-task-table-hint{font-size:12px;color:rgba(0,0,0,0.45);margin:4px 0 10px;line-height:1.45}' +
|
||||
'.workbench-header-warning-dept-tabs{flex-shrink:0;max-width:100%}' +
|
||||
'.workbench-header-warning-dept-tabs.ant-tabs{min-width:0}' +
|
||||
'.workbench-header-warning-dept-tabs .ant-tabs-nav{margin:0!important;min-height:32px}' +
|
||||
@@ -1730,18 +2126,46 @@ const Component = function () {
|
||||
)
|
||||
},
|
||||
React.createElement('div', { className: 'workbench-quick-scroll', style: { padding: '6px 6px 4px' } },
|
||||
quickItems.some(function (it) { return it.action; })
|
||||
? React.createElement('div', { className: 'workbench-quick-section-hint' }, '常用操作')
|
||||
: null,
|
||||
React.createElement(Row, { gutter: [6, 6], style: { marginBottom: quickItems.some(function (it) { return !it.action; }) ? 8 : 0 } },
|
||||
quickItems.filter(function (it) { return it.action; }).map(function (it, idx) {
|
||||
var accentClass = it.accent === 'orange' ? ' workbench-quick-item--orange' : ' workbench-quick-item--primary';
|
||||
return React.createElement(Col, { span: 24, key: it.t + '-action-' + idx },
|
||||
React.createElement('div', {
|
||||
className: 'workbench-quick-item workbench-quick-item--action' + accentClass,
|
||||
role: 'button',
|
||||
tabIndex: 0,
|
||||
onClick: function () { handleQuickItemClick(it); },
|
||||
onKeyDown: function (e) {
|
||||
if (e.key === 'Enter' || e.key === ' ') {
|
||||
e.preventDefault();
|
||||
handleQuickItemClick(it);
|
||||
}
|
||||
}
|
||||
},
|
||||
React.createElement('div', { className: 'workbench-quick-item-icon', 'aria-hidden': true }, it.t.charAt(0)),
|
||||
React.createElement('div', { className: 'workbench-quick-item-label' }, it.t)
|
||||
)
|
||||
);
|
||||
})
|
||||
),
|
||||
quickItems.some(function (it) { return !it.action; })
|
||||
? React.createElement('div', { className: 'workbench-quick-section-hint' }, '功能入口')
|
||||
: null,
|
||||
React.createElement(Row, { gutter: [6, 6], style: { marginBottom: 0 } },
|
||||
quickItems.map(function (it, idx) {
|
||||
quickItems.filter(function (it) { return !it.action; }).map(function (it, idx) {
|
||||
return React.createElement(Col, { span: 12, key: it.t + '-' + idx },
|
||||
React.createElement('div', {
|
||||
className: 'workbench-quick-item',
|
||||
role: 'button',
|
||||
tabIndex: 0,
|
||||
onClick: function () { protoNav(it.p); },
|
||||
onClick: function () { handleQuickItemClick(it); },
|
||||
onKeyDown: function (e) {
|
||||
if (e.key === 'Enter' || e.key === ' ') {
|
||||
e.preventDefault();
|
||||
protoNav(it.p);
|
||||
handleQuickItemClick(it);
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1854,7 +2278,7 @@ const Component = function () {
|
||||
destroyOnClose: true
|
||||
},
|
||||
React.createElement(Text, { type: 'secondary', style: { fontSize: 12, display: 'block', marginBottom: 10 } },
|
||||
'以下任务当前日期已超过预计交车结束日期(含区间结束日),示意数据标红;列表字段与交车管理-待处理一致,联调接接口。'
|
||||
'以下任务已超过预计交车结束日期,请与业管人员沟通交车是否延误,修改交车时间或及时处理'
|
||||
),
|
||||
React.createElement(Table, {
|
||||
className: 'workbench-overdue-delivery-modal',
|
||||
@@ -1887,6 +2311,258 @@ const Component = function () {
|
||||
pagination: false,
|
||||
scroll: { x: 1780, y: 360 }
|
||||
})
|
||||
),
|
||||
|
||||
React.createElement(Modal, {
|
||||
title: '年审/等级评定',
|
||||
open: inspectModalOpen,
|
||||
width: 1000,
|
||||
onCancel: function () { setInspectModalOpen(false); },
|
||||
footer: React.createElement(Button, { onClick: function () { setInspectModalOpen(false); } }, '关闭'),
|
||||
destroyOnClose: true
|
||||
},
|
||||
React.createElement(Table, {
|
||||
size: 'small',
|
||||
rowKey: 'id',
|
||||
columns: inspectModalColumns,
|
||||
dataSource: inspectMockRows,
|
||||
pagination: false,
|
||||
scroll: { x: 800, y: 360 }
|
||||
})
|
||||
),
|
||||
|
||||
React.createElement(Modal, {
|
||||
className: 'workbench-gen-task-modal',
|
||||
title: '生成交车任务',
|
||||
open: genDeliveryPickOpen,
|
||||
width: 520,
|
||||
destroyOnClose: true,
|
||||
onCancel: function () {
|
||||
setGenDeliveryPickOpen(false);
|
||||
resetGenDeliveryFlow();
|
||||
},
|
||||
footer: React.createElement(Space, null,
|
||||
React.createElement(Button, {
|
||||
onClick: function () {
|
||||
setGenDeliveryPickOpen(false);
|
||||
resetGenDeliveryFlow();
|
||||
}
|
||||
}, '取消'),
|
||||
React.createElement(Button, { type: 'primary', onClick: handleGenDeliveryNext }, '生成')
|
||||
)
|
||||
},
|
||||
React.createElement('div', { className: 'workbench-gen-task-section' },
|
||||
React.createElement('div', { style: { marginBottom: 14 } },
|
||||
renderGenTaskLabel('客户名称', true),
|
||||
React.createElement(Select, {
|
||||
showSearch: true,
|
||||
allowClear: true,
|
||||
placeholder: '请选择客户名称',
|
||||
style: { width: '100%' },
|
||||
value: genDeliveryCustomer || undefined,
|
||||
options: genDeliveryCustomerOptions,
|
||||
optionFilterProp: 'label',
|
||||
onChange: function (val) {
|
||||
setGenDeliveryCustomer(val || '');
|
||||
setGenDeliveryProjectId(undefined);
|
||||
}
|
||||
})
|
||||
),
|
||||
React.createElement('div', null,
|
||||
renderGenTaskLabel('项目名称', true),
|
||||
React.createElement(Select, {
|
||||
showSearch: true,
|
||||
allowClear: true,
|
||||
placeholder: genDeliveryCustomer
|
||||
? (genDeliveryProjectOptions.length ? '请选择或搜索项目名称' : '该客户暂无可用项目')
|
||||
: '请先选择客户名称',
|
||||
style: { width: '100%' },
|
||||
value: genDeliveryProjectId,
|
||||
options: genDeliveryProjectOptions,
|
||||
optionFilterProp: 'label',
|
||||
disabled: !genDeliveryCustomer,
|
||||
onChange: function (val) { setGenDeliveryProjectId(val); }
|
||||
})
|
||||
)
|
||||
),
|
||||
React.createElement(Text, { type: 'secondary', style: { fontSize: 12 } }, '选择客户与项目后,将配置预计交车日期并勾选待交车辆。')
|
||||
),
|
||||
|
||||
React.createElement(Modal, {
|
||||
className: 'workbench-gen-task-modal',
|
||||
title: '配置交车任务',
|
||||
open: genDeliveryConfigOpen,
|
||||
width: 980,
|
||||
destroyOnClose: true,
|
||||
onCancel: function () {
|
||||
setGenDeliveryConfigOpen(false);
|
||||
resetGenDeliveryFlow();
|
||||
},
|
||||
footer: React.createElement(Space, null,
|
||||
React.createElement(Button, {
|
||||
onClick: function () {
|
||||
setGenDeliveryConfigOpen(false);
|
||||
setGenDeliveryPickOpen(true);
|
||||
}
|
||||
}, '上一步'),
|
||||
React.createElement(Button, {
|
||||
onClick: function () {
|
||||
setGenDeliveryConfigOpen(false);
|
||||
resetGenDeliveryFlow();
|
||||
}
|
||||
}, '取消'),
|
||||
React.createElement(Button, { type: 'primary', onClick: handleGenDeliveryConfirm }, '确认生成')
|
||||
)
|
||||
},
|
||||
selectedGenDeliveryProject
|
||||
? React.createElement('div', { className: 'workbench-gen-task-readonly' },
|
||||
React.createElement('div', { className: 'workbench-gen-task-readonly-item' }, React.createElement('strong', null, '项目名称'), selectedGenDeliveryProject.name),
|
||||
React.createElement('div', { className: 'workbench-gen-task-readonly-item' }, React.createElement('strong', null, '合同编码'), selectedGenDeliveryProject.contractCode),
|
||||
React.createElement('div', { className: 'workbench-gen-task-readonly-item' }, React.createElement('strong', null, '客户名称'), selectedGenDeliveryProject.customerName),
|
||||
React.createElement('div', { className: 'workbench-gen-task-readonly-item' }, React.createElement('strong', null, '交车区域'), selectedGenDeliveryProject.deliveryRegion)
|
||||
)
|
||||
: null,
|
||||
React.createElement(Row, { gutter: [16, 12], style: { marginBottom: 12 } },
|
||||
React.createElement(Col, { xs: 24, md: 12 },
|
||||
renderGenTaskLabel('预计交车日期', true),
|
||||
React.createElement(RangePicker, {
|
||||
style: { width: '100%' },
|
||||
value: genDeliveryExpected,
|
||||
onChange: function (val) { setGenDeliveryExpected(val); },
|
||||
placeholder: ['开始日期', '结束日期']
|
||||
})
|
||||
),
|
||||
React.createElement(Col, { xs: 24, md: 12 },
|
||||
renderGenTaskLabel('开始计费日期', true),
|
||||
React.createElement(DatePicker, {
|
||||
style: { width: '100%' },
|
||||
value: genDeliveryBilling,
|
||||
onChange: function (val) { setGenDeliveryBilling(val); },
|
||||
placeholder: '请选择开始计费日期'
|
||||
})
|
||||
)
|
||||
),
|
||||
React.createElement('div', { className: 'workbench-gen-task-table-hint' },
|
||||
'勾选待交车辆;已创建交车任务或已完成交车的车辆不可选。'
|
||||
),
|
||||
React.createElement(Table, {
|
||||
size: 'small',
|
||||
rowKey: 'key',
|
||||
columns: genDeliveryVehicleColumns,
|
||||
dataSource: genDeliveryVehicleList,
|
||||
rowSelection: genDeliveryRowSelection,
|
||||
pagination: false,
|
||||
scroll: { x: 860, y: 280 },
|
||||
locale: { emptyText: '当前项目暂无可选车辆' }
|
||||
})
|
||||
),
|
||||
|
||||
React.createElement(Modal, {
|
||||
className: 'workbench-gen-task-modal',
|
||||
title: '生成还车任务',
|
||||
open: genReturnPickOpen,
|
||||
width: 520,
|
||||
destroyOnClose: true,
|
||||
onCancel: function () {
|
||||
setGenReturnPickOpen(false);
|
||||
resetGenReturnFlow();
|
||||
},
|
||||
footer: React.createElement(Space, null,
|
||||
React.createElement(Button, {
|
||||
onClick: function () {
|
||||
setGenReturnPickOpen(false);
|
||||
resetGenReturnFlow();
|
||||
}
|
||||
}, '取消'),
|
||||
React.createElement(Button, { type: 'primary', onClick: handleGenReturnNext }, '生成')
|
||||
)
|
||||
},
|
||||
React.createElement('div', { className: 'workbench-gen-task-section' },
|
||||
React.createElement('div', { style: { marginBottom: 14 } },
|
||||
renderGenTaskLabel('客户名称', true),
|
||||
React.createElement(Input, {
|
||||
placeholder: '请输入客户名称',
|
||||
value: genReturnCustomer,
|
||||
onChange: function (e) {
|
||||
setGenReturnCustomer(e.target.value);
|
||||
setGenReturnProjectId(undefined);
|
||||
},
|
||||
allowClear: true
|
||||
})
|
||||
),
|
||||
React.createElement('div', null,
|
||||
renderGenTaskLabel('项目名称', true),
|
||||
React.createElement(Select, {
|
||||
showSearch: true,
|
||||
allowClear: true,
|
||||
placeholder: genReturnProjectOptions.length ? '请选择或搜索项目名称' : '暂无匹配项目,请调整客户名称',
|
||||
style: { width: '100%' },
|
||||
value: genReturnProjectId,
|
||||
options: genReturnProjectOptions,
|
||||
optionFilterProp: 'label',
|
||||
onChange: function (val) { setGenReturnProjectId(val); }
|
||||
})
|
||||
)
|
||||
),
|
||||
React.createElement(Text, { type: 'secondary', style: { fontSize: 12 } }, '选择客户与项目后,将配置预计还车日期并勾选待还车辆。')
|
||||
),
|
||||
|
||||
React.createElement(Modal, {
|
||||
className: 'workbench-gen-task-modal',
|
||||
title: '配置还车任务',
|
||||
open: genReturnConfigOpen,
|
||||
width: 860,
|
||||
destroyOnClose: true,
|
||||
onCancel: function () {
|
||||
setGenReturnConfigOpen(false);
|
||||
resetGenReturnFlow();
|
||||
},
|
||||
footer: React.createElement(Space, null,
|
||||
React.createElement(Button, {
|
||||
onClick: function () {
|
||||
setGenReturnConfigOpen(false);
|
||||
setGenReturnPickOpen(true);
|
||||
}
|
||||
}, '上一步'),
|
||||
React.createElement(Button, {
|
||||
onClick: function () {
|
||||
setGenReturnConfigOpen(false);
|
||||
resetGenReturnFlow();
|
||||
}
|
||||
}, '取消'),
|
||||
React.createElement(Button, { type: 'primary', onClick: handleGenReturnConfirm }, '确认生成')
|
||||
)
|
||||
},
|
||||
selectedGenReturnProject
|
||||
? React.createElement('div', { className: 'workbench-gen-task-readonly' },
|
||||
React.createElement('div', { className: 'workbench-gen-task-readonly-item' }, React.createElement('strong', null, '项目名称'), selectedGenReturnProject.name),
|
||||
React.createElement('div', { className: 'workbench-gen-task-readonly-item' }, React.createElement('strong', null, '合同编码'), selectedGenReturnProject.contractCode),
|
||||
React.createElement('div', { className: 'workbench-gen-task-readonly-item' }, React.createElement('strong', null, '客户名称'), selectedGenReturnProject.customerName),
|
||||
React.createElement('div', { className: 'workbench-gen-task-readonly-item' }, React.createElement('strong', null, '交车区域'), selectedGenReturnProject.deliveryRegion)
|
||||
)
|
||||
: null,
|
||||
React.createElement('div', { style: { marginBottom: 12, maxWidth: 320 } },
|
||||
renderGenTaskLabel('预计还车日期', true),
|
||||
React.createElement(DatePicker, {
|
||||
style: { width: '100%' },
|
||||
value: genReturnDate,
|
||||
onChange: function (val) { setGenReturnDate(val); },
|
||||
placeholder: '请选择预计还车日期'
|
||||
})
|
||||
),
|
||||
React.createElement('div', { className: 'workbench-gen-task-table-hint' },
|
||||
'勾选已交车、待还车辆;仅展示可发起还车流程的车辆。'
|
||||
),
|
||||
React.createElement(Table, {
|
||||
size: 'small',
|
||||
rowKey: 'key',
|
||||
columns: genReturnVehicleColumns,
|
||||
dataSource: genReturnVehicleList,
|
||||
rowSelection: genReturnRowSelection,
|
||||
pagination: false,
|
||||
scroll: { x: 620, y: 280 },
|
||||
locale: { emptyText: '当前项目暂无已交车车辆' }
|
||||
})
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user