新增工单模型 增加航线的

This commit is contained in:
mmc
2026-07-14 12:44:16 +08:00
parent 0cfa9e3554
commit 60fe1bc097
2 changed files with 132 additions and 30 deletions

20
env.js
View File

@@ -9,11 +9,11 @@ const currentEnv = import.meta.env?.MODE || process.env.NODE_ENV;
// 环境配置映射
const envConfig = {
[ENV.DEV]: {
//baseURL: 'http://192.168.2.59:8081',//http://192.168.2.56:8081
////baseURL: 'http://1.95.137.212:59015',//http://192.168.2.56:8081
//WS_URL: 'ws://192.168.2.59:9002/ws/',
//mqtt_url: "ws://1.95.137.212:8083/mqtt",
//geoserver_url: "http://192.168.2.59:7000/geoserver"
baseURL: 'http://192.168.2.59:8081',//http://192.168.2.56:8081
//baseURL: 'http://1.95.137.212:59015',//http://192.168.2.56:8081
WS_URL: 'ws://192.168.2.59:9002/ws/',
mqtt_url: "ws://1.95.137.212:8083/mqtt",
geoserver_url: "http://192.168.2.59:7000/geoserver"
//baseURL: 'http://1.95.137.212:8081',//http://192.168.2.56:8081
////baseURL: 'https://serviceri.satabot.com',
@@ -21,11 +21,11 @@ const envConfig = {
//mqtt_url: "ws://1.95.137.212:8083/mqtt",
//geoserver_url: "http://1.95.137.212:59018/geoserver"
baseURL: 'http://1.95.137.212:59015',//http://192.168.2.56:8081
//baseURL: 'https://serviceri.satabot.com',
WS_URL: 'ws://1.95.137.212:59017/ws/',
mqtt_url: "ws://1.95.137.212:59021/mqtt",
geoserver_url: "http://1.95.137.212:59018/geoserver"
//baseURL: 'http://1.95.137.212:59015',//http://192.168.2.56:8081
////baseURL: 'https://serviceri.satabot.com',
//WS_URL: 'ws://1.95.137.212:59017/ws/',
//mqtt_url: "ws://1.95.137.212:59021/mqtt",
//geoserver_url: "http://1.95.137.212:59018/geoserver"
},
[ENV.PROD]: {
//baseURL: 'https://pvcloudservice.satabot.com',

View File

@@ -29,7 +29,7 @@ import {
deleteWorkOrderModelApi,
} from '../../api/systemSetting';
import { getSiteDevice, getRobotRouteList } from '../../api/device';
import { getSiteDevice, getRobotRouteList, getWayLine, getSiteUAVList } from '../../api/device';
import { useSelector } from 'react-redux';
import { RootState } from '@/src/store';
import utils, { workOrderTypeOptions, getWorkOrderTypeText, errorLevelOptions, LEVEL_TAG_COLOR } from '@/lib/utils';
@@ -52,34 +52,64 @@ const WorkOrderModelManagement: React.FC = () => {
// 设备和预设路径数据
const [deviceOptions, setDeviceOptions] = useState([]);
const [routeOptions, setRouteOptions] = useState([]);
const [waylineOptions, setWaylineOptions] = useState([]);
// 当前选择的设备类型
const [selectedDeviceType, setSelectedDeviceType] = useState<'robot' | 'uav' | null>(null);
// 批量多选
const [selectedRowKeys, setSelectedRowKeys] = useState<(string | number)[]>([]);
// 获取设备列表
// 获取设备列表(分组显示机器人和无人机)
const fetchDeviceList = async () => {
try {
const res = await getSiteDevice({
// 获取机器人列表
const robotRes = await getSiteDevice({
siteId: stationId,
pageSize: 9999,
pageNum: 1,
orgId: userInfo?.orgId
});
if (res.code === 200) {
const devices = res.rows || [];
setDeviceOptions(
devices.map((item: any) => ({
// 获取无人机列表
const uavRes = await getSiteUAVList(stationId);
const robotOptions = [];
if (robotRes.code === 200) {
const robots = robotRes.rows || [];
robotOptions.push({
label: '机器人',
title: '机器人',
options: robots.map((item: any) => ({
label: item.deviceAlias || item.serialNumber,
value: item.serialNumber
value: item.serialNumber,
type: 'robot'
}))
);
});
}
const uavOptions = [];
if (uavRes.code === 200) {
const uavs = uavRes.rows || [];
uavOptions.push({
label: '无人机',
title: '无人机',
options: uavs.map((item: any) => ({
label: item.drone_callsign,
value: item.device_sn,
type: 'uav'
}))
});
}
setDeviceOptions([...robotOptions, ...uavOptions]);
} catch (e) {
console.error('获取设备列表失败', e);
}
};
// 获取预设路径列表
// 获取预设路径列表(机器人)
const fetchRouteList = async () => {
try {
const res = await getRobotRouteList({ siteId: stationId });
@@ -97,6 +127,24 @@ const WorkOrderModelManagement: React.FC = () => {
}
};
// 获取无人机航线列表
const fetchWaylineList = async () => {
try {
const res = await getWayLine();
if (res.code === 0) {
const waylines = res?.data?.list || [];
setWaylineOptions(
waylines.map((item: any) => ({
label: item.name,
value: item.id
}))
);
}
} catch (e) {
console.error('获取无人机航线失败', e);
}
};
// 获取数据
const fetchList = async () => {
setLoading(true);
@@ -123,21 +171,40 @@ const WorkOrderModelManagement: React.FC = () => {
fetchList();
fetchDeviceList();
fetchRouteList();
fetchWaylineList();
}
}, [stationId]);
const handleAdd = () => {
setEditingItem(null);
form.resetFields();
setSelectedDeviceType(null);
setModalVisible(true);
};
const handleEdit = (record: any) => {
setEditingItem(record);
form.setFieldsValue(record);
// 判断当前编辑的设备类型
if (record.waylineId) {
setSelectedDeviceType('uav');
} else if (record.routeId) {
setSelectedDeviceType('robot');
}
setModalVisible(true);
};
// 处理设备选择变化
const handleDeviceChange = (value, option) => {
console.log('handleDeviceChange value:', value, 'option:', option);
if (option) {
setSelectedDeviceType(option.type);
// 清空路径选择
form.setFieldValue('routeId', undefined);
form.setFieldValue('waylineId', undefined);
}
};
// 单条删除
const handleDelete = (id: string | number) => {
modal.confirm({
@@ -192,7 +259,9 @@ const WorkOrderModelManagement: React.FC = () => {
...values,
siteId: stationId,
deviceId: values.deviceId,
routeId: values.routeId
// 根据设备类型设置对应的路径字段
routeId: selectedDeviceType === 'robot' ? values.routeId : undefined,
waylineId: selectedDeviceType === 'uav' ? values.waylineId : undefined,
};
if (editingItem) {
res = await addWorkOrderModelApi({ ...payload, id: editingItem.id });
@@ -210,6 +279,19 @@ const WorkOrderModelManagement: React.FC = () => {
}
};
// 辅助函数:获取所有设备的选项(展开分组)
const getAllDeviceOptions = () => {
const result = [];
deviceOptions.forEach((group: any) => {
if (group.options) {
group.options.forEach((opt: any) => {
result.push(opt);
});
}
});
return result;
};
const columns = [
{ title: '工单名称', dataIndex: 'orderName', key: 'orderName' },
{
@@ -229,19 +311,24 @@ const WorkOrderModelManagement: React.FC = () => {
}
},
{
title: '机器人',
title: '设备',
dataIndex: 'deviceId',
key: 'deviceId',
render: (val) => {
const device = deviceOptions.find(d => d.value === val);
const allDevices = getAllDeviceOptions();
const device = allDevices.find(d => d.value === val);
return device ? device.label : val;
}
},
{
title: '预设路径',
title: '路径/航线',
dataIndex: 'routeId',
key: 'routeId',
render: (val) => {
render: (val, record) => {
if (record.waylineId) {
const wayline = waylineOptions.find(w => w.value === record.waylineId);
return wayline ? wayline.label : record.waylineId;
}
const route = routeOptions.find(r => r.value === val);
return route ? route.label : val;
}
@@ -312,13 +399,28 @@ const WorkOrderModelManagement: React.FC = () => {
<Form.Item label="错误等级" name="errorLevel" rules={[{ required: true, message: '请选择错误等级' }]}>
<Select placeholder="请选择错误等级" options={errorLevelOptions} />
</Form.Item>
<Form.Item label="机器人" name="deviceId" rules={[{ required: true, message: '请选择机器人' }]}>
<Select placeholder="请选择机器人" options={deviceOptions} />
</Form.Item>
<Form.Item label="预设路径" name="routeId" rules={[{ required: true, message: '请选择预设路径' }]}>
<Select placeholder="请选择预设路径" options={routeOptions} />
<Form.Item label="设备" name="deviceId" rules={[{ required: true, message: '请选择设备' }]}>
<Select
placeholder="请选择设备"
options={deviceOptions}
onChange={handleDeviceChange}
labelInValue={false}
/>
</Form.Item>
{/* 根据设备类型显示不同的路径选择 */}
{selectedDeviceType === 'robot' && (
<Form.Item label="预设路径" name="routeId" rules={[{ required: true, message: '请选择预设路径' }]}>
<Select placeholder="请选择预设路径" options={routeOptions} />
</Form.Item>
)}
{selectedDeviceType === 'uav' && (
<Form.Item label="无人机航线" name="waylineId" rules={[{ required: true, message: '请选择无人机航线' }]}>
<Select placeholder="请选择无人机航线" options={waylineOptions} />
</Form.Item>
)}
<Form.Item label="自动生成任务" name="autoGenerateTask" valuePropName="checked">
<Switch />
</Form.Item>