Files
nxxmdata/backend/controllers/electronicFencePointController.js

419 lines
10 KiB
JavaScript
Raw Normal View History

2025-09-12 20:08:42 +08:00
/**
* 电子围栏坐标点控制器
* 处理围栏坐标点的CRUD操作
*/
const { ElectronicFencePoint, ElectronicFence } = require('../models');
const { Op } = require('sequelize');
class ElectronicFencePointController {
/**
* 获取围栏的所有坐标点
*/
async getFencePoints(req, res) {
try {
const { fenceId } = req.params;
const { point_type, is_active } = req.query;
// 构建查询条件
const where = { fence_id: fenceId };
if (point_type) where.point_type = point_type;
if (is_active !== undefined) where.is_active = is_active === 'true';
const points = await ElectronicFencePoint.findAll({
where,
order: [['point_order', 'ASC']]
});
res.json({
success: true,
data: points.map(point => point.toFrontendFormat()),
total: points.length,
message: '获取围栏坐标点成功'
});
} catch (error) {
console.error('获取围栏坐标点失败:', error);
res.status(500).json({
success: false,
message: '获取围栏坐标点失败',
error: error.message
});
}
}
/**
* 获取单个坐标点详情
*/
async getPointById(req, res) {
try {
const { id } = req.params;
const point = await ElectronicFencePoint.findByPk(id);
if (!point) {
return res.status(404).json({
success: false,
message: '坐标点不存在'
});
}
res.json({
success: true,
data: point.toFrontendFormat(),
message: '获取坐标点详情成功'
});
} catch (error) {
console.error('获取坐标点详情失败:', error);
res.status(500).json({
success: false,
message: '获取坐标点详情失败',
error: error.message
});
}
}
/**
* 创建坐标点
*/
async createPoint(req, res) {
try {
const {
fence_id,
point_order,
longitude,
latitude,
point_type = 'corner',
description
} = req.body;
// 验证必填字段
if (!fence_id || point_order === undefined || !longitude || !latitude) {
return res.status(400).json({
success: false,
message: '围栏ID、顺序、经度、纬度为必填项'
});
}
// 验证围栏是否存在
const fence = await ElectronicFence.findByPk(fence_id);
if (!fence) {
return res.status(404).json({
success: false,
message: '围栏不存在'
});
}
// 创建坐标点
const point = await ElectronicFencePoint.create({
fence_id,
point_order,
longitude,
latitude,
point_type,
description,
created_by: req.user?.id
});
res.status(201).json({
success: true,
data: point.toFrontendFormat(),
message: '坐标点创建成功'
});
} catch (error) {
console.error('创建坐标点失败:', error);
res.status(500).json({
success: false,
message: '创建坐标点失败',
error: error.message
});
}
}
/**
* 批量创建坐标点
*/
async createPoints(req, res) {
try {
const { fence_id, points } = req.body;
// 验证必填字段
if (!fence_id || !Array.isArray(points) || points.length === 0) {
return res.status(400).json({
success: false,
message: '围栏ID和坐标点数组为必填项'
});
}
// 验证围栏是否存在
const fence = await ElectronicFence.findByPk(fence_id);
if (!fence) {
return res.status(404).json({
success: false,
message: '围栏不存在'
});
}
// 批量创建坐标点
const createdPoints = await ElectronicFencePoint.createPoints(fence_id, points, {
createdBy: req.user?.id
});
res.status(201).json({
success: true,
data: createdPoints.map(point => point.toFrontendFormat()),
total: createdPoints.length,
message: '坐标点批量创建成功'
});
} catch (error) {
console.error('批量创建坐标点失败:', error);
res.status(500).json({
success: false,
message: '批量创建坐标点失败',
error: error.message
});
}
}
/**
* 更新坐标点
*/
async updatePoint(req, res) {
try {
const { id } = req.params;
const updateData = req.body;
const point = await ElectronicFencePoint.findByPk(id);
if (!point) {
return res.status(404).json({
success: false,
message: '坐标点不存在'
});
}
// 更新坐标点
updateData.updated_by = req.user?.id;
await point.update(updateData);
res.json({
success: true,
data: point.toFrontendFormat(),
message: '坐标点更新成功'
});
} catch (error) {
console.error('更新坐标点失败:', error);
res.status(500).json({
success: false,
message: '更新坐标点失败',
error: error.message
});
}
}
/**
* 更新围栏的所有坐标点
*/
async updateFencePoints(req, res) {
try {
const { fenceId } = req.params;
const { points } = req.body;
// 验证必填字段
if (!Array.isArray(points)) {
return res.status(400).json({
success: false,
message: '坐标点数组为必填项'
});
}
// 验证围栏是否存在
const fence = await ElectronicFence.findByPk(fenceId);
if (!fence) {
return res.status(404).json({
success: false,
message: '围栏不存在'
});
}
// 更新围栏的所有坐标点
const updatedPoints = await ElectronicFencePoint.updateFencePoints(fenceId, points, {
createdBy: req.user?.id
});
res.json({
success: true,
data: updatedPoints.map(point => point.toFrontendFormat()),
total: updatedPoints.length,
message: '围栏坐标点更新成功'
});
} catch (error) {
console.error('更新围栏坐标点失败:', error);
res.status(500).json({
success: false,
message: '更新围栏坐标点失败',
error: error.message
});
}
}
/**
* 删除坐标点
*/
async deletePoint(req, res) {
try {
const { id } = req.params;
const point = await ElectronicFencePoint.findByPk(id);
if (!point) {
return res.status(404).json({
success: false,
message: '坐标点不存在'
});
}
await point.destroy();
res.json({
success: true,
message: '坐标点删除成功'
});
} catch (error) {
console.error('删除坐标点失败:', error);
res.status(500).json({
success: false,
message: '删除坐标点失败',
error: error.message
});
}
}
/**
* 删除围栏的所有坐标点
*/
async deleteFencePoints(req, res) {
try {
const { fenceId } = req.params;
const deletedCount = await ElectronicFencePoint.destroy({
where: { fence_id: fenceId }
});
res.json({
success: true,
data: { deletedCount },
message: '围栏坐标点删除成功'
});
} catch (error) {
console.error('删除围栏坐标点失败:', error);
res.status(500).json({
success: false,
message: '删除围栏坐标点失败',
error: error.message
});
}
}
/**
* 获取围栏边界框
*/
async getFenceBounds(req, res) {
try {
const { fenceId } = req.params;
const bounds = await ElectronicFencePoint.getFenceBounds(fenceId);
if (!bounds) {
return res.status(404).json({
success: false,
message: '围栏没有坐标点'
});
}
res.json({
success: true,
data: bounds,
message: '获取围栏边界框成功'
});
} catch (error) {
console.error('获取围栏边界框失败:', error);
res.status(500).json({
success: false,
message: '获取围栏边界框失败',
error: error.message
});
}
}
/**
* 搜索坐标点
*/
async searchPoints(req, res) {
try {
const {
fence_id,
point_type,
longitude_min,
longitude_max,
latitude_min,
latitude_max,
description,
page = 1,
limit = 10
} = req.query;
// 构建查询条件
const where = {};
if (fence_id) where.fence_id = fence_id;
if (point_type) where.point_type = point_type;
if (description) where.description = { [Op.like]: `%${description}%` };
// 坐标范围查询
if (longitude_min !== undefined || longitude_max !== undefined) {
where.longitude = {};
if (longitude_min !== undefined) where.longitude[Op.gte] = longitude_min;
if (longitude_max !== undefined) where.longitude[Op.lte] = longitude_max;
}
if (latitude_min !== undefined || latitude_max !== undefined) {
where.latitude = {};
if (latitude_min !== undefined) where.latitude[Op.gte] = latitude_min;
if (latitude_max !== undefined) where.latitude[Op.lte] = latitude_max;
}
const offset = (page - 1) * limit;
const { count, rows } = await ElectronicFencePoint.findAndCountAll({
where,
order: [['fence_id', 'ASC'], ['point_order', 'ASC']],
limit: parseInt(limit),
offset: parseInt(offset)
});
res.json({
success: true,
data: rows.map(point => point.toFrontendFormat()),
total: count,
page: parseInt(page),
limit: parseInt(limit),
message: '搜索坐标点成功'
});
} catch (error) {
console.error('搜索坐标点失败:', error);
res.status(500).json({
success: false,
message: '搜索坐标点失败',
error: error.message
});
}
}
}
module.exports = new ElectronicFencePointController();