소스 검색

新增设备作业管理接口

zmj 5 달 전
부모
커밋
064b0508a0

+ 210 - 0
ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/controller/VehicleTasksController.java

@@ -0,0 +1,210 @@
+package com.ruoyi.uniapp.controller;
+
+import java.util.List;
+import java.io.IOException;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.uniapp.domain.VehicleWorkAreas;
+import com.ruoyi.uniapp.dto.DeviceTasksDTO;
+import com.ruoyi.uniapp.service.IVehicleWorkAreasService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.uniapp.domain.VehicleTasks;
+import com.ruoyi.uniapp.service.IVehicleTasksService;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+
+/**
+ * 车辆作业Controller
+ *
+ * @author zmj
+ * @date 2025-12-17
+ */
+@RestController
+@RequestMapping("/deviceTasks")
+public class VehicleTasksController extends BaseController
+{
+    @Autowired
+    private IVehicleTasksService vehicleTasksService;
+
+    @Autowired
+    private IVehicleWorkAreasService vehicleWorkAreasService;
+
+    /**
+     * 查询车辆作业列表
+     */
+    @RequiresPermissions("uniapp:vehicleTasks:list")
+    @GetMapping("/list")
+    public TableDataInfo list(VehicleTasks vehicleTasks)
+    {
+        startPage();
+        List<VehicleTasks> list = vehicleTasksService.selectVehicleTasksList(vehicleTasks);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出车辆作业列表
+     */
+    @RequiresPermissions("uniapp:vehicleTasks:export")
+    @Log(title = "车辆作业", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, VehicleTasks vehicleTasks)
+    {
+        List<VehicleTasks> list = vehicleTasksService.selectVehicleTasksList(vehicleTasks);
+        ExcelUtil<VehicleTasks> util = new ExcelUtil<VehicleTasks>(VehicleTasks.class);
+        util.exportExcel(response, list, "车辆作业数据");
+    }
+
+    /**
+     * 获取车辆作业详细信息
+     */
+    @RequiresPermissions("uniapp:vehicleTasks:query")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(vehicleTasksService.selectVehicleTasksById(id));
+    }
+
+    /**
+     * 新增车辆作业
+     */
+    @RequiresPermissions("uniapp:vehicleTasks:add")
+    @Log(title = "车辆作业", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody DeviceTasksDTO deviceTasksDTO)
+    {
+        //1、新增工作区域
+        VehicleWorkAreas vehicleWorkAreas = new VehicleWorkAreas();
+        vehicleWorkAreas.setFieldId(Long.valueOf(deviceTasksDTO.getFieldId()));
+        vehicleWorkAreas.setAreaName(deviceTasksDTO.getTaskName());
+        vehicleWorkAreas.setUserId(deviceTasksDTO.getUserId());
+        vehicleWorkAreas.setAreaType(deviceTasksDTO.getAreaType());
+        vehicleWorkAreas.setPathWidth(deviceTasksDTO.getPathWidth());
+        vehicleWorkAreas.setWaypoints(deviceTasksDTO.getWaypoints().toString());
+        vehicleWorkAreas.setObstacles(deviceTasksDTO.getObstacles().toString());
+        vehicleWorkAreas.setReturnPoint(deviceTasksDTO.getReturnPoint().toString());
+        vehicleWorkAreasService.insertVehicleWorkAreas(vehicleWorkAreas);
+        //2、新增工作作业
+        VehicleTasks vehicleTasks = new VehicleTasks();
+        vehicleTasks.setTaskName(deviceTasksDTO.getTaskName());
+        vehicleTasks.setDeviceId(Long.valueOf(deviceTasksDTO.getDeviceId()));
+        vehicleTasks.setAreaId(vehicleWorkAreas.getId());
+        return toAjax(vehicleTasksService.insertVehicleTasks(vehicleTasks));
+    }
+
+
+    /**
+     * 开始作业
+     */
+    @Log(title = "开始作业", businessType = BusinessType.UPDATE)
+    @PutMapping("/start/{taskId}")
+    public AjaxResult startWork(@PathVariable("taskId") Long taskId)
+    {
+        VehicleTasks vehicleTasks = new VehicleTasks();
+        vehicleTasks.setId(taskId);
+        vehicleTasks.setTaskStatus(1L); // 设置作业状态为开始
+
+        //TODO:MQ下发开始作业命令
+        return toAjax(vehicleTasksService.updateVehicleTasks(vehicleTasks));
+    }
+
+
+    /**
+     * 暂停作业
+     */
+    @Log(title = "暂停作业", businessType = BusinessType.UPDATE)
+    @PutMapping("/pause/{taskId}")
+    public AjaxResult pauseWork(@PathVariable("taskId") Long taskId)
+    {
+        VehicleTasks vehicleTasks = new VehicleTasks();
+        vehicleTasks.setId(taskId);
+        vehicleTasks.setTaskStatus(4L); // 设置作业状态为已暂停
+
+        //TODO:MQ下发暂停作业命令
+        return toAjax(vehicleTasksService.updateVehicleTasks(vehicleTasks));
+    }
+
+    /**
+     * 停止作业
+     */
+    @Log(title = "停止作业", businessType = BusinessType.UPDATE)
+    @PutMapping("/stop/{taskId}")
+    public AjaxResult stopWork(@PathVariable("taskId") Long taskId)
+    {
+        VehicleTasks vehicleTasks = new VehicleTasks();
+        vehicleTasks.setId(taskId);
+        vehicleTasks.setTaskStatus(5L); // 设置作业状态为已停止
+
+        //TODO:MQ下发停止作业命令
+        return toAjax(vehicleTasksService.updateVehicleTasks(vehicleTasks));
+    }
+
+
+    /**
+     * 召回设备
+     */
+    @Log(title = "召回设备", businessType = BusinessType.UPDATE)
+    @PutMapping("/recall/{taskId}")
+    public AjaxResult recallWork(@PathVariable("taskId") Long taskId)
+    {
+        VehicleTasks vehicleTasks = new VehicleTasks();
+        vehicleTasks.setId(taskId);
+        vehicleTasks.setTaskStatus(6L); // 设置作业状态为召回中
+
+        //TODO:MQ下发停止作业命令
+        return toAjax(vehicleTasksService.updateVehicleTasks(vehicleTasks));
+    }
+
+
+
+
+    /**
+     * 删除作业任务
+     */
+    @Log(title = "删除作业任务", businessType = BusinessType.DELETE)
+    @DeleteMapping("/delete/{taskId}")
+    public AjaxResult removeTasks(@PathVariable("taskId") Long taskId)
+    {
+        VehicleTasks vehicleTasks = vehicleTasksService.selectVehicleTasksById(taskId);
+        vehicleWorkAreasService.deleteVehicleWorkAreasById(vehicleTasks.getAreaId());
+        int i = vehicleTasksService.deleteVehicleTasksByIds(new Long[]{taskId});
+        return toAjax(i);
+    }
+
+
+
+
+    /**
+     * 修改车辆作业
+     */
+    @RequiresPermissions("uniapp:vehicleTasks:edit")
+    @Log(title = "车辆作业", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody VehicleTasks vehicleTasks)
+    {
+        return toAjax(vehicleTasksService.updateVehicleTasks(vehicleTasks));
+    }
+
+    /**
+     * 删除车辆作业
+     */
+    @RequiresPermissions("uniapp:vehicleTasks:remove")
+    @Log(title = "车辆作业", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(vehicleTasksService.deleteVehicleTasksByIds(ids));
+    }
+}

+ 74 - 0
ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/domain/VehicleTasks.java

@@ -0,0 +1,74 @@
+package com.ruoyi.uniapp.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.core.annotation.Excel;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+
+/**
+ * 车辆作业对象 vehicle_tasks
+ *
+ * @author zmj
+ * @date 2025-12-17
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class VehicleTasks extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 作业ID(主键) */
+    private Long id;
+
+    /** 作业名称(如测试1) */
+    @Excel(name = "作业名称", readConverterExp = "如=测试1")
+    private String taskName;
+
+    /** 所属设备ID(关联设备表) */
+    @Excel(name = "所属设备ID", readConverterExp = "关=联设备表")
+    private Long deviceId;
+
+    /** 关联工作区域ID(关联工作区域表) */
+    @Excel(name = "关联工作区域ID", readConverterExp = "关=联工作区域表")
+    private Long areaId;
+
+    /** 作业进度(百分比,如0.00%) */
+    @Excel(name = "作业进度", readConverterExp = "百=分比,如0.00%")
+    private BigDecimal progress;
+
+    /** 作业状态:0=未开始,1=进行中,2=已完成,3=已取消 */
+    @Excel(name = "作业状态:0=未开始,1=进行中,2=已完成,3=已取消,4=已暂停,5=已停止,6=召回中,7=到达返航点")
+    private Long taskStatus;
+    /**工作区域类型:1=回字形,2=弓字形,3=自定义,4=垄沟*/
+    private Long areaType;
+    /**作业状态描述*/
+    private String taskStatusDesc;
+
+    /** 避障开关:1=开启,0=关闭 */
+    @Excel(name = "避障开关:1=开启,0=关闭")
+    private Long obstacleSwitch;
+    /*避障开关描述*/
+    private String obstacleSwitchDesc;
+
+    /** 开始时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date startTime;
+
+    /** 结束时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date endTime;
+
+    /*工作区域*/
+    private VehicleWorkAreas  workAreas;
+
+
+}

+ 66 - 0
ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/domain/VehicleWorkAreas.java

@@ -0,0 +1,66 @@
+package com.ruoyi.uniapp.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.core.annotation.Excel;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+
+/**
+ * 工作区域对象 vehicle_work_areas
+ *
+ * @author ruoyi
+ * @date 2025-12-17
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class VehicleWorkAreas extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 区域ID(主键) */
+    private Long id;
+
+    /** 所属地块ID */
+    @Excel(name = "所属地块ID")
+    private Long fieldId;
+
+    /** 区域名称(如Test zone) */
+    @Excel(name = "区域名称", readConverterExp = "如=Test,z=one")
+    private String areaName;
+
+    /** 创建者ID(关联用户表) */
+    @Excel(name = "创建者ID", readConverterExp = "关=联用户表")
+    private Long userId;
+
+    /** 区域类型:1=回字形,2=弓字形,3=自定义,4=垄沟 */
+    @Excel(name = "区域类型:1=回字形,2=弓字形,3=自定义,4=垄沟")
+    private Long areaType;
+    /*区域类型描述*/
+    private String areaTypeDesc;
+
+    /** 路径宽度(单位:厘米,如100) */
+    @Excel(name = "路径宽度", readConverterExp = "单=位:厘米,如100")
+    private Long pathWidth;
+
+    /** 航线角度(仅弓字形有效,0-360度) */
+    @Excel(name = "航线角度", readConverterExp = "仅=弓字形有效,0-360度")
+    private Long routeAngle;
+
+    /** 区域拐点坐标(JSON格式,如[{"lon":120.0,"lat":30.0},{"lon":120.1,"lat":30.1}]) */
+    @Excel(name = "区域拐点坐标")
+    private String waypoints;
+
+    /** 障碍物坐标(JSON格式,同拐点) */
+    @Excel(name = "障碍物坐标", readConverterExp = "J=SON格式,同拐点")
+    private String obstacles;
+
+    /** 返航点坐标(如"120.0,30.0") */
+    @Excel(name = "返航点坐标")
+    private String returnPoint;
+
+
+}

+ 44 - 0
ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/dto/DeviceTasksDTO.java

@@ -0,0 +1,44 @@
+package com.ruoyi.uniapp.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeviceTasksDTO {
+
+
+    private String deviceId;      // 设备ID(必填)
+    private String fieldId;       // 地块ID(必填)
+    private String taskName;      // 作业名称(必填)
+    private Long areaType;     // 作业路线类型(必填,1=回字形,2=弓字形,3=自定义,4=垄沟)
+
+    /**
+     * 作业区域端点(必填,至少3个点)
+     * json格式:[{lng: 经度, lat: 纬度}, ...]
+     */
+    private List<Point> waypoints;
+
+    /**
+     * 障碍物端点(可选,格式同waypoints)
+     */
+    private List<Point> obstacles;
+
+    private Point returnPoint;    // 返航点(必填)
+    private Long pathWidth;    // 路径宽度(必填,单位:厘米)
+    private Long userId;
+
+    /**
+     * 经纬度坐标对
+     */
+    @Data
+    public static class Point {
+        private Double lng;   // 经度
+        private Double lat;   // 纬度
+    }
+}

+ 61 - 0
ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/mapper/VehicleTasksMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.uniapp.mapper;
+
+import java.util.List;
+import com.ruoyi.uniapp.domain.VehicleTasks;
+
+/**
+ * 车辆作业Mapper接口
+ * 
+ * @author zmj
+ * @date 2025-12-17
+ */
+public interface VehicleTasksMapper 
+{
+    /**
+     * 查询车辆作业
+     * 
+     * @param id 车辆作业主键
+     * @return 车辆作业
+     */
+    public VehicleTasks selectVehicleTasksById(Long id);
+
+    /**
+     * 查询车辆作业列表
+     * 
+     * @param vehicleTasks 车辆作业
+     * @return 车辆作业集合
+     */
+    public List<VehicleTasks> selectVehicleTasksList(VehicleTasks vehicleTasks);
+
+    /**
+     * 新增车辆作业
+     * 
+     * @param vehicleTasks 车辆作业
+     * @return 结果
+     */
+    public int insertVehicleTasks(VehicleTasks vehicleTasks);
+
+    /**
+     * 修改车辆作业
+     * 
+     * @param vehicleTasks 车辆作业
+     * @return 结果
+     */
+    public int updateVehicleTasks(VehicleTasks vehicleTasks);
+
+    /**
+     * 删除车辆作业
+     * 
+     * @param id 车辆作业主键
+     * @return 结果
+     */
+    public int deleteVehicleTasksById(Long id);
+
+    /**
+     * 批量删除车辆作业
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteVehicleTasksByIds(Long[] ids);
+}

+ 61 - 0
ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/mapper/VehicleWorkAreasMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.uniapp.mapper;
+
+import java.util.List;
+import com.ruoyi.uniapp.domain.VehicleWorkAreas;
+
+/**
+ * 工作区域Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-12-17
+ */
+public interface VehicleWorkAreasMapper 
+{
+    /**
+     * 查询工作区域
+     * 
+     * @param id 工作区域主键
+     * @return 工作区域
+     */
+    public VehicleWorkAreas selectVehicleWorkAreasById(Long id);
+
+    /**
+     * 查询工作区域列表
+     * 
+     * @param vehicleWorkAreas 工作区域
+     * @return 工作区域集合
+     */
+    public List<VehicleWorkAreas> selectVehicleWorkAreasList(VehicleWorkAreas vehicleWorkAreas);
+
+    /**
+     * 新增工作区域
+     * 
+     * @param vehicleWorkAreas 工作区域
+     * @return 结果
+     */
+    public int insertVehicleWorkAreas(VehicleWorkAreas vehicleWorkAreas);
+
+    /**
+     * 修改工作区域
+     * 
+     * @param vehicleWorkAreas 工作区域
+     * @return 结果
+     */
+    public int updateVehicleWorkAreas(VehicleWorkAreas vehicleWorkAreas);
+
+    /**
+     * 删除工作区域
+     * 
+     * @param id 工作区域主键
+     * @return 结果
+     */
+    public int deleteVehicleWorkAreasById(Long id);
+
+    /**
+     * 批量删除工作区域
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteVehicleWorkAreasByIds(Long[] ids);
+}

+ 61 - 0
ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/service/IVehicleTasksService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.uniapp.service;
+
+import java.util.List;
+import com.ruoyi.uniapp.domain.VehicleTasks;
+
+/**
+ * 车辆作业Service接口
+ * 
+ * @author zmj
+ * @date 2025-12-17
+ */
+public interface IVehicleTasksService 
+{
+    /**
+     * 查询车辆作业
+     * 
+     * @param id 车辆作业主键
+     * @return 车辆作业
+     */
+    public VehicleTasks selectVehicleTasksById(Long id);
+
+    /**
+     * 查询车辆作业列表
+     * 
+     * @param vehicleTasks 车辆作业
+     * @return 车辆作业集合
+     */
+    public List<VehicleTasks> selectVehicleTasksList(VehicleTasks vehicleTasks);
+
+    /**
+     * 新增车辆作业
+     * 
+     * @param vehicleTasks 车辆作业
+     * @return 结果
+     */
+    public int insertVehicleTasks(VehicleTasks vehicleTasks);
+
+    /**
+     * 修改车辆作业
+     * 
+     * @param vehicleTasks 车辆作业
+     * @return 结果
+     */
+    public int updateVehicleTasks(VehicleTasks vehicleTasks);
+
+    /**
+     * 批量删除车辆作业
+     * 
+     * @param ids 需要删除的车辆作业主键集合
+     * @return 结果
+     */
+    public int deleteVehicleTasksByIds(Long[] ids);
+
+    /**
+     * 删除车辆作业信息
+     * 
+     * @param id 车辆作业主键
+     * @return 结果
+     */
+    public int deleteVehicleTasksById(Long id);
+}

+ 61 - 0
ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/service/IVehicleWorkAreasService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.uniapp.service;
+
+import java.util.List;
+import com.ruoyi.uniapp.domain.VehicleWorkAreas;
+
+/**
+ * 工作区域Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-12-17
+ */
+public interface IVehicleWorkAreasService 
+{
+    /**
+     * 查询工作区域
+     * 
+     * @param id 工作区域主键
+     * @return 工作区域
+     */
+    public VehicleWorkAreas selectVehicleWorkAreasById(Long id);
+
+    /**
+     * 查询工作区域列表
+     * 
+     * @param vehicleWorkAreas 工作区域
+     * @return 工作区域集合
+     */
+    public List<VehicleWorkAreas> selectVehicleWorkAreasList(VehicleWorkAreas vehicleWorkAreas);
+
+    /**
+     * 新增工作区域
+     * 
+     * @param vehicleWorkAreas 工作区域
+     * @return 结果
+     */
+    public int insertVehicleWorkAreas(VehicleWorkAreas vehicleWorkAreas);
+
+    /**
+     * 修改工作区域
+     * 
+     * @param vehicleWorkAreas 工作区域
+     * @return 结果
+     */
+    public int updateVehicleWorkAreas(VehicleWorkAreas vehicleWorkAreas);
+
+    /**
+     * 批量删除工作区域
+     * 
+     * @param ids 需要删除的工作区域主键集合
+     * @return 结果
+     */
+    public int deleteVehicleWorkAreasByIds(Long[] ids);
+
+    /**
+     * 删除工作区域信息
+     * 
+     * @param id 工作区域主键
+     * @return 结果
+     */
+    public int deleteVehicleWorkAreasById(Long id);
+}

+ 96 - 0
ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/service/impl/VehicleTasksServiceImpl.java

@@ -0,0 +1,96 @@
+package com.ruoyi.uniapp.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.core.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.uniapp.mapper.VehicleTasksMapper;
+import com.ruoyi.uniapp.domain.VehicleTasks;
+import com.ruoyi.uniapp.service.IVehicleTasksService;
+
+/**
+ * 车辆作业Service业务层处理
+ * 
+ * @author zmj
+ * @date 2025-12-17
+ */
+@Service
+public class VehicleTasksServiceImpl implements IVehicleTasksService 
+{
+    @Autowired
+    private VehicleTasksMapper vehicleTasksMapper;
+
+    /**
+     * 查询车辆作业
+     * 
+     * @param id 车辆作业主键
+     * @return 车辆作业
+     */
+    @Override
+    public VehicleTasks selectVehicleTasksById(Long id)
+    {
+        return vehicleTasksMapper.selectVehicleTasksById(id);
+    }
+
+    /**
+     * 查询车辆作业列表
+     * 
+     * @param vehicleTasks 车辆作业
+     * @return 车辆作业
+     */
+    @Override
+    public List<VehicleTasks> selectVehicleTasksList(VehicleTasks vehicleTasks)
+    {
+        return vehicleTasksMapper.selectVehicleTasksList(vehicleTasks);
+    }
+
+    /**
+     * 新增车辆作业
+     * 
+     * @param vehicleTasks 车辆作业
+     * @return 结果
+     */
+    @Override
+    public int insertVehicleTasks(VehicleTasks vehicleTasks)
+    {
+        vehicleTasks.setCreateTime(DateUtils.getNowDate());
+        return vehicleTasksMapper.insertVehicleTasks(vehicleTasks);
+    }
+
+    /**
+     * 修改车辆作业
+     * 
+     * @param vehicleTasks 车辆作业
+     * @return 结果
+     */
+    @Override
+    public int updateVehicleTasks(VehicleTasks vehicleTasks)
+    {
+        vehicleTasks.setUpdateTime(DateUtils.getNowDate());
+        return vehicleTasksMapper.updateVehicleTasks(vehicleTasks);
+    }
+
+    /**
+     * 批量删除车辆作业
+     * 
+     * @param ids 需要删除的车辆作业主键
+     * @return 结果
+     */
+    @Override
+    public int deleteVehicleTasksByIds(Long[] ids)
+    {
+        return vehicleTasksMapper.deleteVehicleTasksByIds(ids);
+    }
+
+    /**
+     * 删除车辆作业信息
+     * 
+     * @param id 车辆作业主键
+     * @return 结果
+     */
+    @Override
+    public int deleteVehicleTasksById(Long id)
+    {
+        return vehicleTasksMapper.deleteVehicleTasksById(id);
+    }
+}

+ 96 - 0
ruoyi-modules/ruoyi-uniapp/src/main/java/com/ruoyi/uniapp/service/impl/VehicleWorkAreasServiceImpl.java

@@ -0,0 +1,96 @@
+package com.ruoyi.uniapp.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.core.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.uniapp.mapper.VehicleWorkAreasMapper;
+import com.ruoyi.uniapp.domain.VehicleWorkAreas;
+import com.ruoyi.uniapp.service.IVehicleWorkAreasService;
+
+/**
+ * 工作区域Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-12-17
+ */
+@Service
+public class VehicleWorkAreasServiceImpl implements IVehicleWorkAreasService 
+{
+    @Autowired
+    private VehicleWorkAreasMapper vehicleWorkAreasMapper;
+
+    /**
+     * 查询工作区域
+     * 
+     * @param id 工作区域主键
+     * @return 工作区域
+     */
+    @Override
+    public VehicleWorkAreas selectVehicleWorkAreasById(Long id)
+    {
+        return vehicleWorkAreasMapper.selectVehicleWorkAreasById(id);
+    }
+
+    /**
+     * 查询工作区域列表
+     * 
+     * @param vehicleWorkAreas 工作区域
+     * @return 工作区域
+     */
+    @Override
+    public List<VehicleWorkAreas> selectVehicleWorkAreasList(VehicleWorkAreas vehicleWorkAreas)
+    {
+        return vehicleWorkAreasMapper.selectVehicleWorkAreasList(vehicleWorkAreas);
+    }
+
+    /**
+     * 新增工作区域
+     * 
+     * @param vehicleWorkAreas 工作区域
+     * @return 结果
+     */
+    @Override
+    public int insertVehicleWorkAreas(VehicleWorkAreas vehicleWorkAreas)
+    {
+        vehicleWorkAreas.setCreateTime(DateUtils.getNowDate());
+        return vehicleWorkAreasMapper.insertVehicleWorkAreas(vehicleWorkAreas);
+    }
+
+    /**
+     * 修改工作区域
+     * 
+     * @param vehicleWorkAreas 工作区域
+     * @return 结果
+     */
+    @Override
+    public int updateVehicleWorkAreas(VehicleWorkAreas vehicleWorkAreas)
+    {
+        vehicleWorkAreas.setUpdateTime(DateUtils.getNowDate());
+        return vehicleWorkAreasMapper.updateVehicleWorkAreas(vehicleWorkAreas);
+    }
+
+    /**
+     * 批量删除工作区域
+     * 
+     * @param ids 需要删除的工作区域主键
+     * @return 结果
+     */
+    @Override
+    public int deleteVehicleWorkAreasByIds(Long[] ids)
+    {
+        return vehicleWorkAreasMapper.deleteVehicleWorkAreasByIds(ids);
+    }
+
+    /**
+     * 删除工作区域信息
+     * 
+     * @param id 工作区域主键
+     * @return 结果
+     */
+    @Override
+    public int deleteVehicleWorkAreasById(Long id)
+    {
+        return vehicleWorkAreasMapper.deleteVehicleWorkAreasById(id);
+    }
+}

+ 140 - 0
ruoyi-modules/ruoyi-uniapp/src/main/resources/mapper/VehicleTasksMapper.xml

@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.uniapp.mapper.VehicleTasksMapper">
+
+    <resultMap type="VehicleTasks" id="VehicleTasksResult">
+        <result property="id"    column="id"    />
+        <result property="taskName"    column="task_name"    />
+        <result property="deviceId"    column="device_id"    />
+        <result property="areaId"    column="area_id"    />
+        <result property="progress"    column="progress"    />
+        <result property="taskStatus"    column="task_status"    />
+        <result property="obstacleSwitch"    column="obstacle_switch"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="endTime"    column="end_time"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <!-- 缺少 workAreas 关联映射 -->
+        <association property="workAreas" javaType="VehicleWorkAreas">
+            <result property="id" column="work_area_id"/>
+            <result property="fieldId" column="field_id"/>
+            <result property="areaName" column="area_name"/>
+            <result property="userId" column="user_id"/>
+            <result property="areaType" column="area_type"/>
+            <result property="pathWidth" column="path_width"/>
+            <result property="routeAngle" column="route_angle"/>
+            <result property="waypoints" column="waypoints"/>
+            <result property="obstacles" column="obstacles"/>
+            <result property="returnPoint" column="return_point"/>
+        </association>
+    </resultMap>
+
+    <sql id="selectVehicleTasksVo">
+        select id, task_name, device_id, area_id, progress, task_status, obstacle_switch, start_time, end_time, create_time, update_time from vehicle_tasks
+    </sql>
+
+    <select id="selectVehicleTasksList" parameterType="VehicleTasks" resultMap="VehicleTasksResult">
+        SELECT
+        vt.id,
+        vt.task_name,
+        vt.device_id,
+        vt.area_id,
+        vt.progress,
+        vt.task_status,
+        vt.obstacle_switch,
+        vt.start_time,
+        vt.end_time,
+        vt.create_time,
+        vt.update_time,
+        vwa.id as work_area_id,
+        vwa.field_id,
+        vwa.area_name,
+        vwa.user_id,
+        vwa.area_type,
+        vwa.path_width,
+        vwa.route_angle,
+        vwa.waypoints,
+        vwa.obstacles,
+        vwa.return_point
+        FROM vehicle_tasks vt
+        LEFT JOIN vehicle_work_areas vwa ON vt.area_id = vwa.id
+        <where>
+            <if test="taskName != null and taskName != ''"> AND vt.task_name LIKE CONCAT('%', #{taskName}, '%')</if>
+            <if test="deviceId != null"> AND vt.device_id = #{deviceId}</if>
+            <if test="areaId != null"> AND vt.area_id = #{areaId}</if>
+            <if test="progress != null"> AND vt.progress = #{progress}</if>
+            <if test="taskStatus != null"> AND vt.task_status = #{taskStatus}</if>
+            <if test="areaType != null"> AND vwa.area_type = #{areaType}</if>
+            <if test="obstacleSwitch != null"> AND vt.obstacle_switch = #{obstacleSwitch}</if>
+            <if test="startTime != null"> AND vt.start_time = #{startTime}</if>
+            <if test="endTime != null"> AND vt.end_time = #{endTime}</if>
+            <!-- 增加对关联表字段的查询支持 -->
+            <if test="workAreas != null and workAreas.areaName != null and workAreas.areaName != ''">
+                AND vwa.area_name LIKE CONCAT('%', #{workAreas.areaName}, '%')
+            </if>
+        </where>
+    </select>
+
+    <select id="selectVehicleTasksById" parameterType="Long" resultMap="VehicleTasksResult">
+        <include refid="selectVehicleTasksVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertVehicleTasks" parameterType="VehicleTasks" useGeneratedKeys="true" keyProperty="id">
+        insert into vehicle_tasks
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="taskName != null and taskName != ''">task_name,</if>
+            <if test="deviceId != null">device_id,</if>
+            <if test="areaId != null">area_id,</if>
+            <if test="progress != null">progress,</if>
+            <if test="taskStatus != null">task_status,</if>
+            <if test="obstacleSwitch != null">obstacle_switch,</if>
+            <if test="startTime != null">start_time,</if>
+            <if test="endTime != null">end_time,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="taskName != null and taskName != ''">#{taskName},</if>
+            <if test="deviceId != null">#{deviceId},</if>
+            <if test="areaId != null">#{areaId},</if>
+            <if test="progress != null">#{progress},</if>
+            <if test="taskStatus != null">#{taskStatus},</if>
+            <if test="obstacleSwitch != null">#{obstacleSwitch},</if>
+            <if test="startTime != null">#{startTime},</if>
+            <if test="endTime != null">#{endTime},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateVehicleTasks" parameterType="VehicleTasks">
+        update vehicle_tasks
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="taskName != null and taskName != ''">task_name = #{taskName},</if>
+            <if test="deviceId != null">device_id = #{deviceId},</if>
+            <if test="areaId != null">area_id = #{areaId},</if>
+            <if test="progress != null">progress = #{progress},</if>
+            <if test="taskStatus != null">task_status = #{taskStatus},</if>
+            <if test="obstacleSwitch != null">obstacle_switch = #{obstacleSwitch},</if>
+            <if test="startTime != null">start_time = #{startTime},</if>
+            <if test="endTime != null">end_time = #{endTime},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteVehicleTasksById" parameterType="Long">
+        delete from vehicle_tasks where id = #{id}
+    </delete>
+
+    <delete id="deleteVehicleTasksByIds" parameterType="String">
+        delete from vehicle_tasks where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 104 - 0
ruoyi-modules/ruoyi-uniapp/src/main/resources/mapper/VehicleWorkAreasMapper.xml

@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.uniapp.mapper.VehicleWorkAreasMapper">
+    
+    <resultMap type="VehicleWorkAreas" id="VehicleWorkAreasResult">
+        <result property="id"    column="id"    />
+        <result property="fieldId"    column="field_id"    />
+        <result property="areaName"    column="area_name"    />
+        <result property="userId"    column="user_id"    />
+        <result property="areaType"    column="area_type"    />
+        <result property="pathWidth"    column="path_width"    />
+        <result property="routeAngle"    column="route_angle"    />
+        <result property="waypoints"    column="waypoints"    />
+        <result property="obstacles"    column="obstacles"    />
+        <result property="returnPoint"    column="return_point"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectVehicleWorkAreasVo">
+        select id, field_id, area_name, user_id, area_type, path_width, route_angle, waypoints, obstacles, return_point, create_time, update_time from vehicle_work_areas
+    </sql>
+
+    <select id="selectVehicleWorkAreasList" parameterType="VehicleWorkAreas" resultMap="VehicleWorkAreasResult">
+        <include refid="selectVehicleWorkAreasVo"/>
+        <where>  
+            <if test="fieldId != null "> and field_id = #{fieldId}</if>
+            <if test="areaName != null  and areaName != ''"> and area_name like concat('%', #{areaName}, '%')</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="areaType != null "> and area_type = #{areaType}</if>
+            <if test="pathWidth != null "> and path_width = #{pathWidth}</if>
+            <if test="routeAngle != null "> and route_angle = #{routeAngle}</if>
+            <if test="waypoints != null  and waypoints != ''"> and waypoints = #{waypoints}</if>
+            <if test="obstacles != null  and obstacles != ''"> and obstacles = #{obstacles}</if>
+            <if test="returnPoint != null  and returnPoint != ''"> and return_point = #{returnPoint}</if>
+        </where>
+    </select>
+    
+    <select id="selectVehicleWorkAreasById" parameterType="Long" resultMap="VehicleWorkAreasResult">
+        <include refid="selectVehicleWorkAreasVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertVehicleWorkAreas" parameterType="VehicleWorkAreas" useGeneratedKeys="true" keyProperty="id">
+        insert into vehicle_work_areas
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="fieldId != null">field_id,</if>
+            <if test="areaName != null and areaName != ''">area_name,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="areaType != null">area_type,</if>
+            <if test="pathWidth != null">path_width,</if>
+            <if test="routeAngle != null">route_angle,</if>
+            <if test="waypoints != null">waypoints,</if>
+            <if test="obstacles != null">obstacles,</if>
+            <if test="returnPoint != null">return_point,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="fieldId != null">#{fieldId},</if>
+            <if test="areaName != null and areaName != ''">#{areaName},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="areaType != null">#{areaType},</if>
+            <if test="pathWidth != null">#{pathWidth},</if>
+            <if test="routeAngle != null">#{routeAngle},</if>
+            <if test="waypoints != null">#{waypoints},</if>
+            <if test="obstacles != null">#{obstacles},</if>
+            <if test="returnPoint != null">#{returnPoint},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateVehicleWorkAreas" parameterType="VehicleWorkAreas">
+        update vehicle_work_areas
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="fieldId != null">field_id = #{fieldId},</if>
+            <if test="areaName != null and areaName != ''">area_name = #{areaName},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="areaType != null">area_type = #{areaType},</if>
+            <if test="pathWidth != null">path_width = #{pathWidth},</if>
+            <if test="routeAngle != null">route_angle = #{routeAngle},</if>
+            <if test="waypoints != null">waypoints = #{waypoints},</if>
+            <if test="obstacles != null">obstacles = #{obstacles},</if>
+            <if test="returnPoint != null">return_point = #{returnPoint},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteVehicleWorkAreasById" parameterType="Long">
+        delete from vehicle_work_areas where id = #{id}
+    </delete>
+
+    <delete id="deleteVehicleWorkAreasByIds" parameterType="String">
+        delete from vehicle_work_areas where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>