feat(工单): 支持手动输入设备信息或从列表选择

添加设备来源选项,允许用户在创建工单时选择从设备列表选择或手动输入设备信息
后端接口适配处理两种设备来源方式
添加terser依赖用于前端代码压缩优化
This commit is contained in:
zhang1106
2025-12-26 16:28:15 +08:00
parent e1e78f83c9
commit 7e0bf42b03
4 changed files with 159 additions and 20 deletions
+43 -8
View File
@@ -74,6 +74,7 @@ function TicketManagement() {
});
const [searchFilters, setSearchFilters] = useState({});
const [deviceSource, setDeviceSource] = useState('select');
const fetchTickets = useCallback(async (page = 1, pageSize = 10, filters = {}) => {
try {
@@ -148,9 +149,18 @@ function TicketManagement() {
if (ticketData.completionDate) {
ticketData.completionDate = dayjs(ticketData.completionDate);
}
if (ticket.deviceId) {
setDeviceSource('select');
ticketData.deviceId = ticket.deviceId;
} else {
setDeviceSource('manual');
ticketData.deviceName = ticket.deviceName;
ticketData.serialNumber = ticket.serialNumber;
}
form.setFieldsValue(ticketData);
} else {
form.resetFields();
setDeviceSource('select');
}
setModalVisible(true);
}, []);
@@ -168,6 +178,12 @@ function TicketManagement() {
completionDate: values.completionDate ? values.completionDate.format('YYYY-MM-DD HH:mm:ss') : null
};
if (deviceSource === 'manual') {
ticketData.deviceId = null;
ticketData.deviceName = values.deviceName;
ticketData.serialNumber = values.serialNumber;
}
if (editingTicket) {
await axios.put(`/api/tickets/${editingTicket.ticketId}`, ticketData);
message.success('工单更新成功');
@@ -182,11 +198,12 @@ function TicketManagement() {
setModalVisible(false);
fetchTickets();
setEditingTicket(null);
setDeviceSource('select');
} catch (error) {
message.error(editingTicket ? '工单更新失败' : '工单创建失败');
console.error(error);
}
}, [editingTicket, fetchTickets]);
}, [editingTicket, fetchTickets, deviceSource]);
const handleDelete = useCallback(async (ticketId) => {
Modal.confirm({
@@ -473,16 +490,34 @@ function TicketManagement() {
<Input placeholder="请输入工单标题" />
</Form.Item>
<Form.Item name="deviceId" label="关联设备" rules={[{ required: true }]}>
<Select placeholder="选择设备" showSearch optionFilterProp="children">
{devices.map(device => (
<Option key={device.deviceId} value={device.deviceId}>
{device.name} - {device.serialNumber}
</Option>
))}
<Form.Item label="设备来源">
<Select value={deviceSource} onChange={setDeviceSource} style={{ width: 200 }}>
<Option value="select">从设备列表选择</Option>
<Option value="manual">手动输入设备信息</Option>
</Select>
</Form.Item>
{deviceSource === 'select' ? (
<Form.Item name="deviceId" label="关联设备" rules={[{ required: true }]}>
<Select placeholder="选择设备" showSearch optionFilterProp="children">
{devices.map(device => (
<Option key={device.deviceId} value={device.deviceId}>
{device.name} - {device.serialNumber}
</Option>
))}
</Select>
</Form.Item>
) : (
<>
<Form.Item name="deviceName" label="设备名称" rules={[{ required: true }]}>
<Input placeholder="请输入设备名称" />
</Form.Item>
<Form.Item name="serialNumber" label="设备序列号" rules={[{ required: true }]}>
<Input placeholder="请输入设备序列号" />
</Form.Item>
</>
)}
<Form.Item name="faultCategory" label="故障分类" rules={[{ required: true }]}>
<Select placeholder="选择故障分类">
{categories.map(cat => (