Files
ONE-OS/ONEOS-web/CRM/维修管理.jsx
王冕 a27e3b8e43 feat: sync full workspace including web modules, docs, and configurations to Gitea
Optimized the root .gitignore to exclude virtual environments, node modules,
and temp folders to ensure clean and lightweight version tracking.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-09 18:12:25 +08:00

1034 lines
42 KiB
JavaScript
Raw Permalink 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 作为组件变量名
// ONEOS-web - CRM 维修单管理(列表 / 新增 / 条件操作,对齐需求脑图)
function buildSampleMaintenanceRows() {
var plates = [
'沪A·D12345',
'苏E·F99887',
'浙A·H55660',
'粤B·K33210',
'京C·N88771',
'川A·L55602',
'渝D·P90123',
'津A·Q77889',
'鲁B·R33445',
'豫A·S66778',
'鄂A·T11223',
'湘A·U44556',
'闽D·V88990',
'陕A·W22334',
'辽A·X55667',
'吉A·Y88901',
'黑A·Z11234',
'云A·A99887',
'贵A·B44556',
'桂A·C77889'
];
var stations = [
'羚牛浦东维修中心',
'苏州园区快修站',
'杭州滨江服务站',
'深圳南山维修站',
'北京市朝阳区羚牛氢能示范维修中心(亦庄仓配一体化超长名称用于省略号展示)',
'成都高新南区快修点',
'重庆两江新区服务站',
'天津港保税区维修站',
'青岛胶州湾北岸羚牛合作维修站(冷链车队定点维保单位)',
'郑州航空港区服务中心',
'武汉东湖新技术开发区羚牛授权服务站',
'长沙岳麓山大学城轻型维保点',
'厦门湖里区港口大道综合维修中心',
'西安高新区丈八四路羚牛旗舰店',
'沈阳铁西区装备制造产业带维修站',
'长春汽车经济技术开发区羚牛服务站',
'哈尔滨松北区智慧园区快修站',
'昆明官渡区物流园维修中心',
'贵阳观山湖区羚牛城市服务站',
'南宁青秀区东盟商务区综合维修中心(超长名称测试省略)'
];
var stationAddresses = [
'上海市浦东新区科苑路',
'江苏省苏州市工业园区星海街',
'浙江省杭州市滨江区网商路',
'广东省深圳市南山区科技南十二路',
'北京市朝阳区亦庄经济技术开发区荣华南路',
'四川省成都市高新区天府大道',
'重庆市两江新区金渝大道',
'天津市滨海新区保税区海滨九路',
'山东省青岛市胶州市湾北路',
'河南省郑州市航空港区迎宾大道',
'湖北省武汉市东湖高新区光谷大道',
'湖南省长沙市岳麓区麓山南路',
'福建省厦门市湖里区港中路',
'陕西省西安市高新区丈八四路',
'辽宁省沈阳市铁西区建设大路',
'吉林省长春市汽开区东风大街',
'黑龙江省哈尔滨市松北区世茂大道',
'云南省昆明市官渡区彩云北路',
'贵州省贵阳市观山湖区林城东路',
'广西壮族自治区南宁市青秀区民族大道'
];
var dispatchers = [
'运维-周敏',
'运维-李航',
'运维-王磊',
'运维-赵静',
'运维-陈凯(华东夜班值班组长,负责跨省调度与异常升级)',
'运维-刘洋',
'运维-孙婷',
'运维-马超',
'运维-黄欣',
'运维-林峰',
'运维-何倩',
'运维-邓波',
'运维-罗兵',
'运维-梁雪',
'运维-谢军',
'运维-韩梅',
'运维-冯涛',
'运维-曾丽',
'运维-彭飞',
'运维-丁悦'
];
var rows = [];
var month = [4, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 5, 5, 5, 6, 6, 6, 6];
var day = [18, 10, 20, 19, 28, 15, 8, 22, 5, 12, 30, 7, 25, 3, 16, 9, 11, 2, 21, 14];
var hour = [9, 11, 8, 17, 14, 10, 16, 9, 13, 15, 8, 18, 12, 10, 11, 9, 14, 16, 8, 13];
var min = [20, 5, 0, 22, 45, 30, 12, 15, 40, 5, 0, 20, 50, 25, 8, 45, 33, 10, 15, 28];
var statusCycle = ['dispatched', 'in_progress', 'draft', 'draft', 'completed', 'accepted', 'dispatched', 'in_progress', 'draft', 'dispatched', 'in_progress', 'draft', 'completed', 'dispatched', 'in_progress', 'draft', 'dispatched', 'in_progress', 'draft', 'completed'];
var omCycle = ['已通过', '已通过', '待审批', '已驳回', '已通过', '待审批', '已通过', '已通过', '待审批', '已通过', '已通过', '已驳回', '已通过', '待审批', '已通过', '待审批', '已通过', '已通过', '待审批', '已通过'];
for (var i = 0; i < 20; i++) {
var key = String(i + 1);
var st = statusCycle[i];
var om = omCycle[i];
var cost = st === 'draft' ? 0 : 1200 + i * 437 + (i % 3) * 890;
var faultCount = i % 4;
var accCount = i % 5 === 0 ? 1 : i % 7 === 2 ? 2 : 0;
var faultTickets = [];
var k;
for (k = 0; k < faultCount; k++) {
var fd = Math.max(1, day[i] - k);
faultTickets.push({
no: 'GZ-2026' + String(month[i]).padStart(2, '0') + String(fd).padStart(2, '0') + '-' + String(100 + i * 3 + k).padStart(3, '0'),
time: '2026-' + String(month[i]).padStart(2, '0') + '-' + String(fd).padStart(2, '0') + ' ' + String(hour[i]).padStart(2, '0') + ':' + String(min[i]).padStart(2, '0') + ':00',
desc: ['冷却液渗漏', '空压机异响', '制动踏板行程偏长', '仪表报高压互锁', '动力电池温差偏大', '转向助力偶发失效'][k % 6]
});
}
var accidentTickets = [];
for (k = 0; k < accCount; k++) {
var ad = Math.max(1, day[i] - k - 1);
accidentTickets.push({
no: 'SG-2026' + String(month[i]).padStart(2, '0') + String(ad).padStart(2, '0') + '-00' + String(k + 1),
time: '2026-' + String(month[i]).padStart(2, '0') + '-' + String(ad).padStart(2, '0') + ' 19:05:00',
desc: ['侧碰右翼子板凹陷', '追尾后保险杠更换', '停车场剐蹭'][k % 3]
});
}
var lineItems =
cost > 0
? [
{
item: '例行检修项目-' + (i + 1),
partName: ['滤芯', '密封圈', '冷却软管', '传感器'][i % 4],
qty: 1 + (i % 3),
partSource: i % 2 === 0 ? '羚牛' : '维修站',
partCost: 200 + i * 50,
laborCost: 400 + i * 80
}
]
: [];
rows.push({
key: key,
omApprovalStatus: om,
orderStatus: st,
orderTime: '2026-' + String(month[i]).padStart(2, '0') + '-' + String(day[i]).padStart(2, '0') + ' ' + String(hour[i]).padStart(2, '0') + ':' + String(min[i]).padStart(2, '0') + ':00',
plateNo: plates[i],
totalCost: cost,
dispatcher: st === 'draft' ? '—' : dispatchers[i],
stationName: stations[i],
stationAddress: stationAddresses[i],
faultTickets: faultTickets,
accidentTickets: accidentTickets,
lineItems: lineItems
});
}
return rows;
}
const Component = function () {
var useState = React.useState;
var antd = window.antd;
var Table = antd.Table;
var Button = antd.Button;
var Space = antd.Space;
var Input = antd.Input;
var Select = antd.Select;
var DatePicker = antd.DatePicker;
var RangePicker = DatePicker.RangePicker;
var Form = antd.Form;
var Row = antd.Row;
var Col = antd.Col;
var Divider = antd.Divider;
var Breadcrumb = antd.Breadcrumb;
var Menu = antd.Menu;
var Layout = antd.Layout;
var message = antd.message;
var Typography = antd.Typography;
var Avatar = antd.Avatar;
var Badge = antd.Badge;
var Tag = antd.Tag;
var Tooltip = antd.Tooltip;
var Modal = antd.Modal;
var Popconfirm = antd.Popconfirm;
var Checkbox = antd.Checkbox;
var Header = Layout.Header;
var Content = Layout.Content;
var Sider = Layout.Sider;
var Title = Typography.Title;
var Text = Typography.Text;
var _currentMenu = useState('crm-maintenance');
var currentMenu = _currentMenu[0];
var setCurrentMenu = _currentMenu[1];
var _listData = useState(buildSampleMaintenanceRows());
var listData = _listData[0];
var setListData = _listData[1];
var _viewOpen = useState(false);
var viewOpen = _viewOpen[0];
var setViewOpen = _viewOpen[1];
var _viewRecord = useState(null);
var viewRecord = _viewRecord[0];
var setViewRecord = _viewRecord[1];
var _createOpen = useState(false);
var createOpen = _createOpen[0];
var setCreateOpen = _createOpen[1];
var _assocFault = useState(false);
var assocFault = _assocFault[0];
var setAssocFault = _assocFault[1];
var _assocAccident = useState(false);
var assocAccident = _assocAccident[0];
var setAssocAccident = _assocAccident[1];
var _otherItems = useState('');
var otherItems = _otherItems[0];
var setOtherItems = _otherItems[1];
var _partsLinkOpen = useState(false);
var partsLinkOpen = _partsLinkOpen[0];
var setPartsLinkOpen = _partsLinkOpen[1];
var _partsLinkRecord = useState(null);
var partsLinkRecord = _partsLinkRecord[0];
var setPartsLinkRecord = _partsLinkRecord[1];
var orderStatusLabel = function (s) {
var map = { draft: '草稿', dispatched: '已派单', accepted: '已接单', in_progress: '维修中', completed: '已完成' };
return map[s] || s;
};
var orderStatusColor = function (s) {
if (s === 'draft') return 'default';
if (s === 'dispatched') return 'processing';
if (s === 'accepted') return 'blue';
if (s === 'in_progress') return 'warning';
if (s === 'completed') return 'success';
return 'default';
};
var omApprovalColor = function (t) {
if (t === '待审批') return 'warning';
if (t === '已通过') return 'success';
if (t === '已驳回') return 'error';
return 'default';
};
var renderTicketTooltip = function (tickets, descLabel) {
if (!tickets || tickets.length === 0) {
return React.createElement('span', { style: { color: '#c9cdd4' } }, '—');
}
var label = descLabel || '说明';
var title = React.createElement(
'div',
{ style: { maxWidth: 320, padding: 4 } },
tickets.map(function (t, i) {
return React.createElement(
'div',
{
key: i,
style: {
marginBottom: i < tickets.length - 1 ? 10 : 0,
paddingBottom: i < tickets.length - 1 ? 10 : 0,
borderBottom: i < tickets.length - 1 ? '1px solid rgba(255,255,255,0.12)' : 'none'
}
},
React.createElement('div', { style: { fontWeight: 600, color: '#fff' } }, t.no),
React.createElement('div', { style: { fontSize: 12, opacity: 0.85, marginTop: 4 } }, t.time),
React.createElement('div', { style: { fontSize: 12, marginTop: 4, lineHeight: 1.5 } }, label + '' + t.desc)
);
})
);
return React.createElement(
Tooltip,
{ title: title, placement: 'topLeft', overlayStyle: { maxWidth: 360 } },
React.createElement(
'span',
{
className: 'mt-ticket-link',
style: {
color: '#165dff',
cursor: 'pointer',
borderBottom: '1px dashed rgba(22,93,255,0.45)',
display: 'inline-block',
maxWidth: '100%',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
verticalAlign: 'bottom'
}
},
tickets.length + ' 条'
)
);
};
var handleMenuClick = function (e) {
setCurrentMenu(e.key);
if (e.key === 'contract-list') {
message.info('跳转至 合同列表');
window.location.hash = '合同列表';
} else if (e.key === 'erp-order') {
message.info('跳转至 ERP 订单管理');
window.location.hash = '订单管理';
} else if (e.key === 'asset-overview') {
message.info('跳转至 资产概览');
window.location.hash = '资产概览';
} else if (e.key === 'crm-list') {
message.info('跳转至 客户列表');
window.location.hash = '客户列表';
} else if (e.key === 'crm-supplier') {
message.info('跳转至 供应商管理');
window.location.hash = '供应商管理';
} else if (e.key === 'crm-maintenance') {
window.location.hash = '维修管理';
}
};
var openView = function (record) {
setViewRecord(record);
setViewOpen(true);
};
var handleAccept = function (key) {
setListData(function (prev) {
return prev.map(function (r) {
if (r.key !== key) return r;
return Object.assign({}, r, { orderStatus: 'accepted' });
});
});
message.success('已接单');
};
var handleDelete = function (key) {
setListData(function (prev) {
return prev.filter(function (r) {
return r.key !== key;
});
});
message.success('已删除草稿');
};
var openPartsLink = function (record) {
setPartsLinkRecord(record);
setPartsLinkOpen(true);
};
var submitPartsLink = function () {
message.success('备件关联已提交(运维审核流占位)');
setPartsLinkOpen(false);
setPartsLinkRecord(null);
};
var openCreate = function () {
setAssocFault(false);
setAssocAccident(false);
setOtherItems('');
setCreateOpen(true);
};
var submitCreate = function () {
var newKey = String(Date.now());
setListData(function (prev) {
return [
{
key: newKey,
omApprovalStatus: '待审批',
orderStatus: 'draft',
orderTime: new Date().toISOString().slice(0, 19).replace('T', ' '),
plateNo: '(待完善)',
totalCost: 0,
dispatcher: '—',
stationName: '(待指派)',
stationAddress: '(待填写)',
faultTickets: assocFault
? [{ no: '(关联故障单占位)', time: '-', desc: '请在详情中补充' }]
: [],
accidentTickets: assocAccident
? [{ no: '(关联事故单占位)', time: '-', desc: '请在详情中补充' }]
: [],
lineItems: otherItems
? [{ item: '其他维修项', partName: '-', qty: 0, partSource: '维修站', partCost: 0, laborCost: 0, remark: otherItems }]
: []
}
].concat(prev);
});
message.success('已创建草稿维修单');
setCreateOpen(false);
};
var SearchIcon = function () {
return React.createElement(
'svg',
{ viewBox: '0 0 48 48', width: 14, height: 14, fill: 'none', stroke: 'currentColor', strokeWidth: 4 },
React.createElement('path', {
d: 'M33.072 33.071c6.248-6.248 6.248-16.379 0-22.627-6.249-6.249-16.38-6.249-22.628 0-6.248 6.248-6.248 16.379 0 22.627 6.248 6.248 16.38 6.248 22.628 0Zm0 0 8.485 8.485'
})
);
};
var ResetIcon = function () {
return React.createElement(
'svg',
{ viewBox: '0 0 48 48', width: 14, height: 14, fill: 'none', stroke: 'currentColor', strokeWidth: 4 },
React.createElement('path', { d: 'M38.837 18C36.463 12.136 30.715 8 24 8 15.163 8 8 15.163 8 24s7.163 16 16 16c7.455 0 13.72-5.1 15.496-12M40 8v10H30' })
);
};
var PlusIcon = function () {
return React.createElement(
'svg',
{ viewBox: '0 0 48 48', width: 14, height: 14, fill: 'none', stroke: 'currentColor', strokeWidth: 4 },
React.createElement('path', { d: 'M5 24h38M24 5v38' })
);
};
var DownloadIcon = function () {
return React.createElement(
'svg',
{ viewBox: '0 0 48 48', width: 14, height: 14, fill: 'none', stroke: 'currentColor', strokeWidth: 4 },
React.createElement('path', { d: 'm33.072 22.071-9.07 9.071-9.072-9.07M24 5v26m16 4v6H8v-6' })
);
};
var SettingIcon = function () {
return React.createElement(
'svg',
{ viewBox: '0 0 48 48', width: 16, height: 16, fill: 'none', stroke: 'currentColor', strokeWidth: 4 },
React.createElement('path', {
d: 'M18.797 6.732A1 1 0 0 1 19.76 6h8.48a1 1 0 0 1 .964.732l1.285 4.628a1 1 0 0 0 1.213.7l4.651-1.2a1 1 0 0 1 1.116.468l4.24 7.344a1 1 0 0 1-.153 1.2L38.193 23.3a1 1 0 0 0 0 1.402l3.364 3.427a1 1 0 0 1 .153 1.2l-4.24 7.344a1 1 0 0 1-1.116.468l-4.65-1.2a1 1 0 0 0-1.214.7l-1.285 4.628a1 1 0 0 1-.964.732h-8.48a1 1 0 0 1-.963-.732L17.51 36.64a1 1 0 0 0-1.213-.7l-4.65 1.2a1 1 0 0 1-1.116-.468l-4.24-7.344a1 1 0 0 1 .153-1.2L9.809 24.7a1 1 0 0 0 0-1.402l-3.364-3.427a1 1 0 0 1-.153-1.2l4.24-7.344a1 1 0 0 1 1.116-.468l4.65 1.2a1 1 0 0 0 1.213-.7l1.286-4.628Z'
}),
React.createElement('path', { d: 'M30 24a6 6 0 1 1-12 0 6 6 0 0 1 12 0Z' })
);
};
var NoticeIcon = function () {
return React.createElement(
'svg',
{ viewBox: '0 0 48 48', width: 18, height: 18, fill: 'none', stroke: 'currentColor', strokeWidth: 4 },
React.createElement('path', { d: 'M39 34h3v4H6v-4h3V20.218a15 15 0 0 1 30 0V34ZM24 44a6 6 0 0 1-6-6h12a6 6 0 0 1-6 6Z' })
);
};
var ListIcon = function () {
return React.createElement(
'svg',
{ viewBox: '0 0 48 48', width: 14, height: 14, fill: 'none', stroke: 'currentColor', strokeWidth: 4, strokeLinecap: 'butt', strokeLinejoin: 'miter' },
React.createElement('path', { d: 'M17 12H42' }),
React.createElement('path', { d: 'M17 24H42' }),
React.createElement('path', { d: 'M17 36H42' }),
React.createElement('path', { d: 'M8 12H9' }),
React.createElement('path', { d: 'M8 24H9' }),
React.createElement('path', { d: 'M8 36H9' })
);
};
var columns = [
{
title: '运维审批状态',
dataIndex: 'omApprovalStatus',
key: 'omApprovalStatus',
className: 'mt-col-om',
render: function (t) {
return React.createElement('span', { className: 'mt-cell-inner' }, React.createElement(Tag, { color: omApprovalColor(t) }, t));
}
},
{
title: '维修单状态',
dataIndex: 'orderStatus',
key: 'orderStatus',
className: 'mt-col-order',
render: function (s) {
return React.createElement(
'span',
{ className: 'mt-cell-inner' },
React.createElement(Tag, { color: orderStatusColor(s) }, orderStatusLabel(s))
);
}
},
{ title: '时间', dataIndex: 'orderTime', key: 'orderTime', className: 'mt-col-time', ellipsis: true },
{ title: '车牌号', dataIndex: 'plateNo', key: 'plateNo', className: 'mt-col-plate', ellipsis: true },
{
title: '费用(总计维修费用)',
dataIndex: 'totalCost',
key: 'totalCost',
className: 'mt-col-cost',
ellipsis: true,
render: function (v) {
return v ? '¥ ' + Number(v).toLocaleString() : '—';
}
},
{ title: '派单发起人', dataIndex: 'dispatcher', key: 'dispatcher', className: 'mt-col-dispatch', ellipsis: true },
{ title: '维修站名称', dataIndex: 'stationName', key: 'stationName', className: 'mt-col-station', ellipsis: true },
{ title: '维修站地址', dataIndex: 'stationAddress', key: 'stationAddress', className: 'mt-col-address', ellipsis: true },
{
title: '关联故障单号',
key: 'faultTickets',
className: 'mt-col-fault',
render: function (_, record) {
return renderTicketTooltip(record.faultTickets, '故障说明');
}
},
{
title: '关联事故单号',
key: 'accidentTickets',
className: 'mt-col-accident',
render: function (_, record) {
return renderTicketTooltip(record.accidentTickets, '事故说明');
}
},
{
title: '操作',
key: 'action',
className: 'mt-col-action',
fixed: 'right',
width: 200,
render: function (_, record) {
var nodes = [];
if (record.orderStatus === 'dispatched') {
nodes.push(
React.createElement(
Button,
{
key: 'accept',
type: 'link',
style: { padding: '0 4px' },
onClick: function () {
handleAccept(record.key);
}
},
'接单'
)
);
}
nodes.push(
React.createElement(
Button,
{
key: 'view',
type: 'link',
style: { padding: '0 4px' },
onClick: function () {
openView(record);
}
},
'查看'
)
);
if (record.orderStatus === 'in_progress') {
nodes.push(
React.createElement(
Button,
{
key: 'parts',
type: 'link',
style: { padding: '0 4px' },
onClick: function () {
openPartsLink(record);
}
},
'备件关联'
)
);
}
if (record.orderStatus === 'draft') {
nodes.push(
React.createElement(
Popconfirm,
{
key: 'del',
title: '确认删除该草稿?',
okText: '删除',
cancelText: '取消',
onConfirm: function () {
handleDelete(record.key);
}
},
React.createElement(Button, { type: 'link', danger: true, style: { padding: '0 4px' } }, '删除')
)
);
}
return React.createElement(Space, { size: 0, wrap: false, split: React.createElement('span', { style: { color: '#e5e6eb' } }, '|') }, nodes);
}
}
];
var menuItems = [
{
key: 'contract',
label: '合同管理',
icon: React.createElement('span', { className: 'anticon' }, '📄'),
children: [{ key: 'contract-list', label: '合同列表' }]
},
{
key: 'crm',
label: 'CRM 管理',
icon: React.createElement('span', { className: 'anticon' }, '👥'),
children: [
{ key: 'crm-list', label: '客户列表' },
{ key: 'crm-supplier', label: '供应商管理' },
{ key: 'crm-maintenance', label: '维修管理' },
{ key: 'crm-analysis', label: 'CRM 分析' }
]
},
{
key: 'erp',
label: 'ERP 订单管理',
icon: React.createElement('span', { className: 'anticon' }, '📦'),
children: [{ key: 'erp-order', label: '订单管理' }]
},
{
key: 'asset',
label: '资产管理',
icon: React.createElement('span', { className: 'anticon' }, '🚗'),
children: [{ key: 'asset-overview', label: '资产概览' }]
}
];
var formItemLayout = {
labelAlign: 'left',
colon: false,
labelCol: { flex: '0 0 86px' },
wrapperCol: { flex: '1 1 0' }
};
var viewDetailColumns = [
{ title: '维修项', dataIndex: 'item', key: 'item', width: 160 },
{ title: '备件', dataIndex: 'partName', key: 'partName', width: 140 },
{ title: '数量', dataIndex: 'qty', key: 'qty', width: 72 },
{
title: '备件来源',
dataIndex: 'partSource',
key: 'partSource',
width: 100,
render: function (t) {
return t === '羚牛' ? React.createElement(Tag, { color: 'blue' }, '羚牛') : React.createElement(Tag, null, '维修站');
}
},
{
title: '备件费用',
dataIndex: 'partCost',
key: 'partCost',
width: 100,
render: function (v) {
return '¥ ' + Number(v || 0).toLocaleString();
}
},
{
title: '人工费用',
dataIndex: 'laborCost',
key: 'laborCost',
width: 100,
render: function (v) {
return '¥ ' + Number(v || 0).toLocaleString();
}
}
];
var viewModal = React.createElement(
Modal,
{
title: '维修单明细',
open: viewOpen,
width: 920,
onCancel: function () {
setViewOpen(false);
setViewRecord(null);
},
footer: React.createElement(Button, { onClick: function () { setViewOpen(false); setViewRecord(null); } }, '关闭'),
destroyOnClose: true
},
viewRecord
? React.createElement(
Space,
{ direction: 'vertical', size: 16, style: { width: '100%' } },
React.createElement(
Row,
{ gutter: 16 },
React.createElement(Col, { span: 8 }, React.createElement(Text, { type: 'secondary' }, '车牌号')),
React.createElement(Col, { span: 8 }, React.createElement(Text, { type: 'secondary' }, '维修站')),
React.createElement(Col, { span: 8 }, React.createElement(Text, { type: 'secondary' }, '总计费用'))
),
React.createElement(
Row,
{ gutter: 16, style: { marginTop: -8 } },
React.createElement(Col, { span: 8 }, React.createElement('strong', null, viewRecord.plateNo)),
React.createElement(Col, { span: 8 }, React.createElement('strong', null, viewRecord.stationName)),
React.createElement(
Col,
{ span: 8 },
React.createElement('strong', null, viewRecord.totalCost ? '¥ ' + Number(viewRecord.totalCost).toLocaleString() : '—')
)
),
React.createElement(Row, { gutter: 16, style: { marginTop: 8 } },
React.createElement(Col, { span: 24 },
React.createElement(Text, { type: 'secondary', style: { display: 'block', marginBottom: 4 } }, '维修站地址'),
React.createElement('strong', null, viewRecord.stationAddress || '—')
)
),
React.createElement(Divider, { style: { margin: '8px 0' } }, '维修项 / 备件'),
React.createElement(Table, {
size: 'small',
pagination: false,
columns: viewDetailColumns,
dataSource: (viewRecord.lineItems || []).map(function (r, i) {
return Object.assign({ key: String(i) }, r);
}),
locale: { emptyText: '暂无明细,可在工单推进后补充' }
})
)
: null
);
var partsLinkModal = React.createElement(
Modal,
{
title: '备件关联(运维提交)',
open: partsLinkOpen,
width: 560,
onCancel: function () {
setPartsLinkOpen(false);
setPartsLinkRecord(null);
},
onOk: submitPartsLink,
okText: '提交',
cancelText: '取消',
destroyOnClose: true
},
partsLinkRecord
? React.createElement(
Space,
{ direction: 'vertical', size: 12, style: { width: '100%' } },
React.createElement(Text, { type: 'secondary' },
'当前单:' + partsLinkRecord.plateNo + ' · ' + partsLinkRecord.stationName + (partsLinkRecord.stationAddress ? ' · ' + partsLinkRecord.stationAddress : '')
),
React.createElement(
'div',
{ style: { color: '#4e5969', fontSize: 14, lineHeight: 1.6 } },
'接入运维提交的备件关联(批次、数量、来源等)。此处为交互占位,提交后走运维审核。'
)
)
: null
);
var createModal = React.createElement(
Modal,
{
title: '新增维修单',
open: createOpen,
width: 520,
onCancel: function () {
setCreateOpen(false);
},
onOk: submitCreate,
okText: '创建草稿',
cancelText: '取消',
destroyOnClose: true
},
React.createElement(
Space,
{ direction: 'vertical', size: 20, style: { width: '100%' } },
React.createElement(
'div',
null,
React.createElement('div', { style: { marginBottom: 8, color: '#4e5969', fontWeight: 500 } }, '是否关联故障/事故'),
React.createElement(
Space,
{ size: 24 },
React.createElement(Checkbox, { checked: assocFault, onChange: function (e) { setAssocFault(e.target.checked); } }, '关联故障'),
React.createElement(Checkbox, { checked: assocAccident, onChange: function (e) { setAssocAccident(e.target.checked); } }, '关联事故')
)
),
React.createElement(
'div',
null,
React.createElement('div', { style: { marginBottom: 8, color: '#4e5969', fontWeight: 500 } }, '其他维修项'),
React.createElement(Input.TextArea, {
rows: 4,
placeholder: '填写未由故障/事故单覆盖的维修说明',
value: otherItems,
onChange: function (e) {
setOtherItems(e.target.value);
}
})
)
)
);
return React.createElement(Layout, { className: 'arco-theme-overrides', style: { minHeight: '100vh', background: '#fff', fontFamily: 'Inter, Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif' } },
React.createElement('style', null, `
.arco-theme-overrides .ant-btn { border-radius: 4px; box-shadow: none; font-size: 14px; }
.arco-theme-overrides .ant-btn-primary { background-color: #165dff; border-color: #165dff; }
.arco-theme-overrides .ant-btn-primary:hover { background-color: #4080ff; border-color: #4080ff; }
.arco-theme-overrides .ant-btn-default { background-color: #f2f3f5; border-color: transparent; color: #4e5969; }
.arco-theme-overrides .ant-btn-default:hover { background-color: #e5e6eb; border-color: transparent; color: #4e5969; }
.arco-theme-overrides .ant-btn-link { color: #165dff; }
.arco-theme-overrides .ant-btn-link:hover { background-color: transparent; color: #4080ff; }
.arco-theme-overrides .ant-menu-light .ant-menu-item-selected { background-color: #f2f9fe; color: #165dff; }
.arco-theme-overrides .ant-menu-light .ant-menu-item-selected::after { border-right-color: #165dff; }
.arco-theme-overrides .ant-table-thead > tr > th { background-color: #f2f3f5; color: #1d2129; font-weight: 500; padding: 13px 16px; border-bottom: 1px solid #e5e6eb; border-top: none; }
.arco-theme-overrides .ant-table-thead > tr > th::before { display: none !important; }
.arco-theme-overrides .ant-table-tbody > tr > td { border-bottom: 1px solid #e5e6eb; padding: 13px 16px; color: #4e5969; }
.arco-theme-overrides .ant-table-wrapper { border: none; }
.arco-theme-overrides .ant-table { border: none; }
.arco-theme-overrides .ant-table-container { border: none; }
.arco-theme-overrides .ant-table-pagination.ant-pagination { margin: 16px 0 0 0; }
.arco-theme-overrides .ant-card { border: none; border-radius: 4px; }
.arco-theme-overrides .maintenance-table-wrap { width: 100%; overflow-x: auto; }
.arco-theme-overrides .maintenance-table { width: 100%; }
.arco-theme-overrides .maintenance-table .ant-table { table-layout: auto; width: 100% !important; }
.arco-theme-overrides .maintenance-table .ant-table-thead > tr > th:not(.ant-table-selection-column):not(.mt-col-action),
.arco-theme-overrides .maintenance-table .ant-table-tbody > tr > td:not(.ant-table-selection-column):not(.mt-col-action) {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
vertical-align: middle;
}
.arco-theme-overrides .maintenance-table .mt-col-om,
.arco-theme-overrides .maintenance-table .mt-col-order { max-width: 7.5rem; }
.arco-theme-overrides .maintenance-table .mt-col-time { max-width: 11rem; }
.arco-theme-overrides .maintenance-table .mt-col-plate { max-width: 8rem; }
.arco-theme-overrides .maintenance-table .mt-col-cost { max-width: 9.5rem; }
.arco-theme-overrides .maintenance-table .mt-col-dispatch { max-width: min(14rem, 24vw); }
.arco-theme-overrides .maintenance-table .mt-col-station { max-width: min(18rem, 32vw); }
.arco-theme-overrides .maintenance-table .mt-col-address { max-width: min(22rem, 38vw); }
.arco-theme-overrides .maintenance-table .mt-col-fault,
.arco-theme-overrides .maintenance-table .mt-col-accident { max-width: 5.5rem; }
.arco-theme-overrides .maintenance-table .mt-col-action {
min-width: 200px;
width: 200px;
max-width: none !important;
white-space: nowrap !important;
overflow: visible !important;
text-overflow: clip !important;
}
.arco-theme-overrides .maintenance-table .mt-cell-inner {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 100%;
}
.arco-theme-overrides .ant-input, .arco-theme-overrides .ant-select-selector, .arco-theme-overrides .ant-picker { border-radius: 2px; border: 1px solid #e5e6eb; background-color: #fff; transition: all 0.1s cubic-bezier(0, 0, 1, 1); }
.arco-theme-overrides .ant-input:hover, .arco-theme-overrides .ant-select:not(.ant-select-disabled):hover .ant-select-selector, .arco-theme-overrides .ant-picker:hover { background-color: #fff; border-color: #165dff; }
.arco-theme-overrides .ant-input:focus, .arco-theme-overrides .ant-input-focused, .arco-theme-overrides .ant-select-focused .ant-select-selector, .arco-theme-overrides .ant-picker-focused { background-color: #fff; border: 1px solid #165dff !important; box-shadow: 0 0 0 2px rgba(22, 93, 255, 0.2) !important; outline: 0; }
.arco-theme-overrides .ant-input-affix-wrapper:focus, .arco-theme-overrides .ant-input-affix-wrapper-focused { background-color: #fff; border-color: #165dff !important; box-shadow: 0 0 0 2px rgba(22, 93, 255, 0.2) !important; }
.arco-theme-overrides .ant-picker-dropdown .ant-picker-panel-container { border-radius: 4px; box-shadow: 0 4px 10px rgba(0,0,0,0.1); border: 1px solid #e5e6eb; background: #fff; }
.arco-theme-overrides .ant-picker-dropdown .ant-picker-header { border-bottom: 1px solid #e5e6eb; color: #1d2129; padding: 0 8px; }
.arco-theme-overrides .ant-picker-dropdown .ant-picker-content th { color: #86909c; font-weight: 400; font-size: 14px; }
.arco-theme-overrides .ant-picker-cell-in-view.ant-picker-cell-selected .ant-picker-cell-inner { background: #165dff; color: #fff; border-radius: 2px; }
.arco-theme-overrides .ant-picker-cell-in-view.ant-picker-cell-range-start .ant-picker-cell-inner,
.arco-theme-overrides .ant-picker-cell-in-view.ant-picker-cell-range-end .ant-picker-cell-inner { background: #165dff; color: #fff; border-radius: 2px; }
.arco-theme-overrides .ant-picker-cell-in-view.ant-picker-cell-in-range::before { background: #e8f3ff; }
.arco-theme-overrides .ant-picker-cell-in-view.ant-picker-cell-today .ant-picker-cell-inner::before { border: 1px solid transparent; border-radius: 2px; position: relative; }
.arco-theme-overrides .ant-picker-cell-in-view.ant-picker-cell-today .ant-picker-cell-inner::after { content: ""; position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); width: 4px; height: 4px; border-radius: 50%; background-color: #165dff; }
.arco-theme-overrides .ant-picker-cell-in-view.ant-picker-cell-today.ant-picker-cell-selected .ant-picker-cell-inner::after { background-color: #fff; }
.arco-theme-overrides .ant-picker-dropdown .ant-picker-cell:hover:not(.ant-picker-cell-selected):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end) .ant-picker-cell-inner { background: #f2f3f5; border-radius: 2px; }
.arco-theme-overrides .ant-picker-cell-inner { border-radius: 2px; font-size: 14px; color: #4e5969; width: 24px; height: 24px; line-height: 24px; }
.arco-theme-overrides .ant-breadcrumb { color: #86909c; font-size: 14px; }
.arco-theme-overrides .ant-breadcrumb a { color: #4e5969; }
.arco-theme-overrides .ant-breadcrumb a:hover { color: #165dff; background-color: transparent; }
.arco-theme-overrides .ant-form-item-label { padding: 0 16px 0 0 !important; line-height: 32px; height: 32px; display: flex; align-items: center; }
.arco-theme-overrides .ant-form-item-control { display: flex; align-items: center; line-height: 32px; min-height: 32px; }
.arco-theme-overrides .ant-form-item-control-input { min-height: 32px; width: 100%; display: flex; align-items: center; }
.arco-theme-overrides .ant-form-item-control-input-content { display: flex; align-items: center; width: 100%; height: 100%; }
.arco-theme-overrides .ant-select { width: 100%; height: 32px; }
.arco-theme-overrides .ant-select-selector { height: 32px !important; min-height: 32px !important; display: flex; align-items: center; width: 100%; padding: 0 12px; }
.arco-theme-overrides .ant-select-multiple .ant-select-selector { padding: 0 4px; align-items: center; }
.arco-theme-overrides .ant-select-selection-item { line-height: 30px !important; margin-top: 0 !important; margin-bottom: 0 !important; }
.arco-theme-overrides .ant-select-selection-overflow { align-items: center; }
.arco-theme-overrides .ant-input { height: 32px; padding: 4px 12px; }
.arco-theme-overrides .ant-picker { height: 32px !important; min-height: 32px !important; display: flex; align-items: center; padding: 4px 12px; width: 100%; }
.arco-theme-overrides .ant-form-item-label > label { color: #4e5969; }
.arco-theme-overrides .ant-form-item-label > label::after { display: none !important; content: "" !important; margin: 0 !important; }
.arco-theme-overrides .ant-select-multiple .ant-select-selection-item { background: #f2f3f5; border: none; border-radius: 2px; }
.arco-theme-overrides .ant-select-multiple.ant-select-show-arrow .ant-select-selection-item { padding-inline-end: 24px; }
.arco-theme-overrides .ant-select-multiple .ant-select-item-option { padding-left: 36px; position: relative; }
.arco-theme-overrides .ant-select-multiple .ant-select-item-option::before { content: ""; position: absolute; left: 12px; top: 50%; transform: translateY(-50%); width: 14px; height: 14px; border: 1px solid #e5e6eb; border-radius: 2px; transition: all 0.1s; background: #fff; box-sizing: border-box; }
.arco-theme-overrides .ant-select-multiple .ant-select-item-option-selected::before { background-color: #165dff; border-color: #165dff; }
.arco-theme-overrides .ant-select-multiple .ant-select-item-option-selected::after { content: ""; position: absolute; left: 16px; top: 50%; transform: translateY(-70%) rotate(45deg); width: 4px; height: 8px; border: 2px solid #fff; border-top: 0; border-left: 0; box-sizing: content-box; z-index: 1; }
.arco-theme-overrides .ant-select-multiple .ant-select-item-option-state { display: none; }
`),
React.createElement(Header, {
style: {
background: '#fff',
padding: '0 20px',
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
borderBottom: '1px solid #e5e6eb',
height: 60,
position: 'fixed',
top: 0,
left: 0,
right: 0,
zIndex: 100
}
},
React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 12 } },
React.createElement('div', { style: { width: 32, height: 32, background: '#165dff', borderRadius: 4, display: 'flex', justifyContent: 'center', alignItems: 'center', color: '#fff', fontWeight: 'bold' } }, 'A'),
React.createElement('div', { style: { fontSize: '20px', fontWeight: '600', color: '#1d2129', letterSpacing: '0.5px' } }, 'Arco Pro')
),
React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 20 } },
React.createElement(Input.Search, { placeholder: '搜索功能', style: { width: 220, borderRadius: 16 } }),
React.createElement(Badge, { dot: true, offset: [-2, 4] },
React.createElement('span', { style: { color: '#4e5969', cursor: 'pointer', display: 'flex' }, title: '消息通知' }, React.createElement(NoticeIcon, null))
),
React.createElement('span', { style: { color: '#4e5969', cursor: 'pointer', display: 'flex' }, title: '设置' }, React.createElement(SettingIcon, null)),
React.createElement(Avatar, { size: 32, src: 'https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/3ee5f13fb09879ecb5185e440cef6eb9.png~tplv-uwbnlip3yd-webp.webp', style: { cursor: 'pointer' } })
)
),
React.createElement(Layout, { style: { paddingTop: 60, background: '#fff' } },
React.createElement(Sider, {
width: 220,
style: {
background: '#fff',
borderRight: '1px solid #e5e6eb',
position: 'fixed',
top: 60,
left: 0,
height: 'calc(100vh - 60px)',
overflowY: 'auto',
zIndex: 99
}
},
React.createElement(Menu, {
mode: 'inline',
selectedKeys: [currentMenu],
defaultOpenKeys: ['crm'],
items: menuItems,
onClick: handleMenuClick,
style: { borderRight: 'none', padding: '8px', background: '#fff' }
})
),
React.createElement(Content, { style: { marginLeft: 220, padding: '16px 20px 0 20px', minHeight: 'calc(100vh - 60px)', display: 'flex', flexDirection: 'column', background: '#fff' } },
React.createElement('div', { style: { padding: '16px 20px 0 20px', marginBottom: 0 } },
React.createElement(Breadcrumb, {
separator: React.createElement('span', { style: { color: '#c9cdd4' } }, '/'),
items: [
{ title: React.createElement(ListIcon, { style: { display: 'inline-flex', alignItems: 'center', fontSize: 14, transform: 'translate(-2px, 1px)' } }) },
{ title: '列表页' },
{ title: React.createElement('span', { style: { color: '#1d2129' } }, '维修单管理') }
]
}),
React.createElement(Title, { level: 4, style: { marginTop: 16, marginBottom: 20, fontWeight: 700, color: '#1d2129', fontSize: 16 } }, '维修单管理')
),
React.createElement('div', { style: { padding: '0', display: 'flex', flexDirection: 'column', flex: 1, background: 'transparent' } },
React.createElement('div', { style: { padding: '0 20px 0 20px', marginBottom: 0, background: '#fff' } },
React.createElement(Row, { style: { flexWrap: 'nowrap' } },
React.createElement(Col, { flex: 1, style: { minWidth: 0, paddingRight: 40 } },
React.createElement(Form, Object.assign({ layout: 'horizontal' }, formItemLayout),
React.createElement(Row, { gutter: 24, style: { rowGap: 0 } },
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '车牌号', style: { marginBottom: 16, height: 32 } },
React.createElement(Input, { placeholder: '请输入车牌号' })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '维修单状态', style: { marginBottom: 16, height: 32 } },
React.createElement(Select, {
allowClear: true,
placeholder: '全部',
options: [
{ label: '全部', value: '' },
{ label: '草稿', value: 'draft' },
{ label: '已派单', value: 'dispatched' },
{ label: '已接单', value: 'accepted' },
{ label: '维修中', value: 'in_progress' },
{ label: '已完成', value: 'completed' }
]
})
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '运维审批', style: { marginBottom: 16, height: 32 } },
React.createElement(Select, {
allowClear: true,
placeholder: '全部',
options: [
{ label: '全部', value: '' },
{ label: '待审批', value: '待审批' },
{ label: '已通过', value: '已通过' },
{ label: '已驳回', value: '已驳回' }
]
})
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '时间', style: { marginBottom: 16, height: 32 } },
React.createElement(RangePicker, { style: { width: '100%' }, placeholder: ['开始', '结束'] })
)
)
)
)
),
React.createElement(Divider, { style: { height: 72, borderLeftColor: 'rgb(229, 230, 235)', borderLeftStyle: 'dashed', marginLeft: 20, marginRight: 20 }, type: 'vertical' }),
React.createElement(Col, { flex: '86px', style: { textAlign: 'right' } },
React.createElement(Space, { direction: 'vertical', size: 12 },
React.createElement(Button, { type: 'primary', icon: React.createElement(SearchIcon, null), style: { display: 'flex', alignItems: 'center', gap: 6, justifyContent: 'center' } }, '查询'),
React.createElement(Button, { icon: React.createElement(ResetIcon, null), style: { display: 'flex', alignItems: 'center', gap: 6, justifyContent: 'center' } }, '重置')
)
)
)
),
React.createElement('div', { style: { padding: '20px 20px 0 20px', display: 'flex', flexDirection: 'column', flex: 1, background: '#fff' } },
React.createElement(Row, { justify: 'space-between', align: 'middle', style: { marginBottom: 16 } },
React.createElement(Col, null,
React.createElement(Space, { size: 12 },
React.createElement(Button, { type: 'primary', icon: React.createElement(PlusIcon, null), style: { display: 'flex', alignItems: 'center', gap: 6 }, onClick: openCreate }, '新建'),
React.createElement(Button, null, '导出')
)
),
React.createElement(Col, null,
React.createElement(Button, { style: { padding: '4px 10px', height: 32, display: 'flex', alignItems: 'center', gap: 6, color: '#4e5969' }, title: '下载' }, React.createElement(DownloadIcon, null), React.createElement('span', null, '下载'))
)
),
React.createElement(
'div',
{ className: 'maintenance-table-wrap', style: { flex: 1, minHeight: 0 } },
React.createElement(Table, {
className: 'maintenance-table',
rowSelection: { type: 'checkbox', columnWidth: 48 },
columns: columns,
dataSource: listData,
pagination: { pageSize: 10, showTotal: function (total) { return '共 ' + total + ' 条'; } },
tableLayout: 'auto',
style: { width: '100%' },
scroll: { x: 'max-content' }
})
)
)
)
)
),
viewModal,
partsLinkModal,
createModal
);
};
if (typeof module !== 'undefined' && module.exports) module.exports = Component;