diff --git a/src/main/java/org/nl/apt15e/apt/dto/WebResponse.java b/src/main/java/org/nl/apt15e/apt/dto/WebResponse.java new file mode 100644 index 0000000..2988d94 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/dto/WebResponse.java @@ -0,0 +1,50 @@ +package org.nl.apt15e.apt.dto; + +import lombok.Builder; +import lombok.Data; + +/** + *

+ * 返回结果 + *

+ * + * @author Liuxy + * @since 2025-06-05 + */ +@Data +@Builder +public class WebResponse { + + /** + * 信息 + */ + private String message; + + /** + * 返回数据 + */ + private T data; + + /** + * 不带数据反馈 + * @return ErpResponse + */ + public static WebResponse requestOk() { + return WebResponse.builder() + .message("操作成功!") + .build(); + } + + /** + * 带数据反馈 + * @return ErpResponse + */ + public static WebResponse requestParamOk(T data) { + return WebResponse.builder() + .message("操作成功!") + .data(data) + .build(); + } + +} + diff --git a/src/main/java/org/nl/apt15e/apt/ext/controller/RcsToAptController.java b/src/main/java/org/nl/apt15e/apt/ext/controller/RcsToAptController.java new file mode 100644 index 0000000..fabeb76 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/ext/controller/RcsToAptController.java @@ -0,0 +1,37 @@ +package org.nl.apt15e.apt.ext.controller; + +import lombok.extern.slf4j.Slf4j; +import org.nl.apt15e.apt.ext.dto.RcsToAptTaskDto; +import org.nl.apt15e.apt.ext.service.RcsToAptService; +import org.nl.apt15e.common.logging.annotation.Log; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * RCS调用APT控制层 + *

+ * + * @author Liuxy + * @since 2025-07-10 + */ +@Slf4j +@RestController +@RequestMapping("api/rcs") +public class RcsToAptController { + + @Autowired + private RcsToAptService rcsToAptService; + + @PostMapping("/reportTaskInfo") + @Log("RCS上报任务信息") + public ResponseEntity reportTaskInfo(@Validated @RequestBody RcsToAptTaskDto dto) { + return new ResponseEntity<>(rcsToAptService.reportTaskInfo(dto),HttpStatus.OK); + } +} diff --git a/src/main/java/org/nl/apt15e/apt/ext/dto/RcsToAptTaskDto.java b/src/main/java/org/nl/apt15e/apt/ext/dto/RcsToAptTaskDto.java new file mode 100644 index 0000000..2e972f0 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/ext/dto/RcsToAptTaskDto.java @@ -0,0 +1,89 @@ +package org.nl.apt15e.apt.ext.dto; + +import lombok.Data; + + +/** + *

+ * RCS上报任务信息Dto + *

+ * + * @author Liuxy + * @since 2025-07-10 + */ +@Data +public class RcsToAptTaskDto { + + /** + * 任务链 ID + */ + private String taskChainId; + + /** + * 区域 ID + */ + private String areaId; + + /** + * 任务创建时间 + */ + private String createTime; + + /** + * 任务链开始时间 + */ + private String chainStartTime; + + /** + * 任务链结束时间 + */ + private String chainFinishTime; + + /** + * 车辆 ID + */ + private String amrId; + + /** + * 任务状态 + * 0-未执行,1-子任务正在执行,2-子任务已完成,3-任务链取消 + * 4-子任务异常,5-任务链跳过,6-任务链异常,7-任务链完成 + */ + private String status; + + /** + * 子任务 ID + */ + private String taskId; + + /** + * 小车实际动作类型 + */ + private String action; + + /** + * 子任务类型 + */ + private String taskType; + + /** + * 目标点编号 + */ + private String endPointCode; + + /** + * 地图 id + */ + private String mapId; + + /** + * 小车状态 id + */ + private String stateId; + + /** + * 小车状态名称 + */ + private String state; + +} diff --git a/src/main/java/org/nl/apt15e/apt/ext/enums/RcsTaskStatus.java b/src/main/java/org/nl/apt15e/apt/ext/enums/RcsTaskStatus.java new file mode 100644 index 0000000..8ed7dc1 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/ext/enums/RcsTaskStatus.java @@ -0,0 +1,80 @@ +package org.nl.apt15e.apt.ext.enums; + +/** + *

+ * RCS任务枚举 + *

+ * + * @author Liuxy + * @since 2025-07-10 + */ +public enum RcsTaskStatus { + /** + * 未执行 + */ + CREATE("0", "未执行", "未执行"), + /** + * 子任务执行中 + */ + SON_EXECUTING("1", "子任务执行中", "子任务执行中"), + /** + * 子任务完成 + */ + SON_FINISHED("2", "子任务完成", "子任务完成"), + /** + * 任务链取消 + */ + TASK_CANCELED("3", "任务链取消", "任务链取消"), + /** + * 子任务异常 + */ + SON_UNUSUAL("4", "子任务异常", "子任务异常"), + /** + * 任务链跳过 + */ + TASK_SKIP("5", "任务链跳过", "任务链跳过"), + /** + * 任务链异常 + */ + TASK_UNUSUAL("6", "任务链异常", "任务链异常"), + /** + * 任务链完成 + */ + TASK_FINISHED("7", "任务链完成", "任务链完成") + ; + + + RcsTaskStatus(String code, String name, String desc) { + this.code = code; + this.name = name; + this.desc = desc; + } + + private String code; + private String name; + private String desc; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } +} diff --git a/src/main/java/org/nl/apt15e/apt/ext/service/RcsToAptService.java b/src/main/java/org/nl/apt15e/apt/ext/service/RcsToAptService.java new file mode 100644 index 0000000..136deb5 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/ext/service/RcsToAptService.java @@ -0,0 +1,24 @@ +package org.nl.apt15e.apt.ext.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.apt15e.apt.ext.dto.RcsToAptTaskDto; + +/** + *

+ * RCS调用APT服务 + *

+ * + * @author Liuxy + * @since 2025-07-10 + */ +public interface RcsToAptService { + + /** + * RCS上报任务信息 + * @param dto RcsToAptTaskDto + * @return { + * receive: 1(收到) + * } + */ + JSONObject reportTaskInfo(RcsToAptTaskDto dto); +} diff --git a/src/main/java/org/nl/apt15e/apt/ext/service/impl/RcsToAptServiceImpl.java b/src/main/java/org/nl/apt15e/apt/ext/service/impl/RcsToAptServiceImpl.java new file mode 100644 index 0000000..45adc6d --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/ext/service/impl/RcsToAptServiceImpl.java @@ -0,0 +1,77 @@ +package org.nl.apt15e.apt.ext.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.apt15e.apt.ext.dto.RcsToAptTaskDto; +import org.nl.apt15e.apt.ext.enums.RcsTaskStatus; +import org.nl.apt15e.apt.ext.service.RcsToAptService; +import org.nl.apt15e.apt.station.dao.Station; +import org.nl.apt15e.apt.station.service.StationService; +import org.nl.apt15e.apt.task.enums.TaskStatus; +import org.nl.apt15e.apt.task.service.ITaskService; +import org.nl.apt15e.apt.task.service.dao.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + *

+ * RCS调用APT实现类 + *

+ * + * @author Liuxy + * @since 2025-07-10 + */ +@Service +@Slf4j +public class RcsToAptServiceImpl implements RcsToAptService { + + /** + * 任务服务 + */ + @Autowired + private ITaskService iTaskService; + + /** + * 站点服务 + */ + @Autowired + private StationService stationService; + + @Override + public JSONObject reportTaskInfo(RcsToAptTaskDto dto) { + log.info("RCS上报任务信息输入参数{}", dto.toString()); + JSONObject result = new JSONObject(); + + Task task = iTaskService.getOne( + new QueryWrapper().lambda() + .eq(Task::getTask_id, dto.getTaskChainId()) + ); + if (ObjectUtil.isEmpty(task)) { + result.put("receive", "1"); + result.put("message", "任务不存在!【"+dto.getTaskChainId()+"】"); + log.info("RCS上报任务信息输出参数{}", result.toString()); + return result; + } + + // 更新任务状态 + String status = dto.getStatus(); + if (status.equals(RcsTaskStatus.SON_EXECUTING.getCode()) || status.equals(RcsTaskStatus.SON_FINISHED.getCode())) { + task.setTask_status(TaskStatus.EXECUTING.getCode()); + } else if (status.equals(RcsTaskStatus.TASK_FINISHED.getCode())) { + task.setTask_status(TaskStatus.FINISHED.getCode()); + } + // 更新当前执行点位 + String endPointCode = dto.getEndPointCode(); + if (ObjectUtil.isNotEmpty(endPointCode)) { + Station staDao = stationService.getById(endPointCode); + task.setTask_point(staDao.getStation_name()); + } + iTaskService.updateById(task); + + result.put("receive", "1"); + log.info("RCS上报任务信息输出参数{}", result.toString()); + return result; + } +} diff --git a/src/main/java/org/nl/apt15e/apt/station/service/StationService.java b/src/main/java/org/nl/apt15e/apt/station/service/StationService.java index cf5399f..5dcf948 100644 --- a/src/main/java/org/nl/apt15e/apt/station/service/StationService.java +++ b/src/main/java/org/nl/apt15e/apt/station/service/StationService.java @@ -12,6 +12,6 @@ import java.util.List; */ public interface StationService extends IService { - JSONObject queryAllStation(); + List queryAllStation(); } diff --git a/src/main/java/org/nl/apt15e/apt/station/service/impl/StationServiceImpl.java b/src/main/java/org/nl/apt15e/apt/station/service/impl/StationServiceImpl.java index 8a030c1..f4c5f40 100644 --- a/src/main/java/org/nl/apt15e/apt/station/service/impl/StationServiceImpl.java +++ b/src/main/java/org/nl/apt15e/apt/station/service/impl/StationServiceImpl.java @@ -24,10 +24,7 @@ public class StationServiceImpl extends ServiceImpl impl private StationMapper stationMapper; @Override - public JSONObject queryAllStation() { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("code", HttpStatus.OK.value()); - jsonObject.put("data", stationMapper.selectList(null)); - return jsonObject; + public List queryAllStation() { + return stationMapper.selectList(null); } } diff --git a/src/main/java/org/nl/apt15e/apt/task/enums/TaskStatus.java b/src/main/java/org/nl/apt15e/apt/task/enums/TaskStatus.java new file mode 100644 index 0000000..55b5927 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/task/enums/TaskStatus.java @@ -0,0 +1,63 @@ +package org.nl.apt15e.apt.task.enums; + +/** + *

+ * 任务枚举 + *

+ * + * @author Liuxy + * @since 2025-07-09 + */ +public enum TaskStatus { + /** + * 申请 + */ + CREATE("0", "生成", "生成"), + /** + * 执行中 + */ + EXECUTING("1", "执行中", "执行中"), + /** + * 完成 + */ + FINISHED("2", "完成", "完成"), + /** + * 已取消 + */ + CANCELED("3", "已取消", "已取消"); + + + TaskStatus(String code, String name, String desc) { + this.code = code; + this.name = name; + this.desc = desc; + } + + private String code; + private String name; + private String desc; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } +} diff --git a/src/main/java/org/nl/apt15e/apt/task/service/ITaskService.java b/src/main/java/org/nl/apt15e/apt/task/service/ITaskService.java new file mode 100644 index 0000000..38048bf --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/task/service/ITaskService.java @@ -0,0 +1,26 @@ +package org.nl.apt15e.apt.task.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.apt15e.apt.station.dao.Station; +import org.nl.apt15e.apt.task.service.dao.Task; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author Liuxy + * @since 2025-07-09 + */ +public interface ITaskService extends IService { + + /** + * 组织下发任务数据 + * @param staList 站点集合 + * @return JSONObject + */ + JSONObject sendTask(List staList); +} diff --git a/src/main/java/org/nl/apt15e/apt/task/service/dao/Task.java b/src/main/java/org/nl/apt15e/apt/task/service/dao/Task.java new file mode 100644 index 0000000..bb97dd7 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/task/service/dao/Task.java @@ -0,0 +1,63 @@ +package org.nl.apt15e.apt.task.service.dao; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * + *

+ * + * @author Liuxy + * @since 2025-07-09 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("task") +public class Task implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 标识 + */ + @TableId(value = "id") + private String id; + + /** + * 任务id + */ + private String task_id; + + /** + * 任务顺序 + */ + private String task_seq; + + /** + * 任务状态 + */ + private String task_status; + + /** + * 当前站点 + */ + private String task_point; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 完成时间 + */ + private LocalDateTime confirm_time; + + +} diff --git a/src/main/java/org/nl/apt15e/apt/task/service/dao/mapper/TaskMapper.java b/src/main/java/org/nl/apt15e/apt/task/service/dao/mapper/TaskMapper.java new file mode 100644 index 0000000..6924a9e --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/task/service/dao/mapper/TaskMapper.java @@ -0,0 +1,16 @@ +package org.nl.apt15e.apt.task.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.apt15e.apt.task.service.dao.Task; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Liuxy + * @since 2025-07-09 + */ +public interface TaskMapper extends BaseMapper { + +} diff --git a/src/main/java/org/nl/apt15e/apt/task/service/dao/mapper/TaskMapper.xml b/src/main/java/org/nl/apt15e/apt/task/service/dao/mapper/TaskMapper.xml new file mode 100644 index 0000000..c23061e --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/task/service/dao/mapper/TaskMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/java/org/nl/apt15e/apt/task/service/impl/TaskServiceImpl.java b/src/main/java/org/nl/apt15e/apt/task/service/impl/TaskServiceImpl.java new file mode 100644 index 0000000..dba4e7c --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/task/service/impl/TaskServiceImpl.java @@ -0,0 +1,66 @@ +package org.nl.apt15e.apt.task.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.nl.apt15e.apt.station.dao.Station; +import org.nl.apt15e.apt.task.service.ITaskService; +import org.nl.apt15e.apt.task.service.dao.Task; +import org.nl.apt15e.apt.task.service.dao.mapper.TaskMapper; +import org.nl.apt15e.apt.vehicle.dao.VehicleInfo; +import org.nl.apt15e.apt.vehicle.service.VehicleInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author Liuxy + * @since 2025-07-09 + */ +@Service +public class TaskServiceImpl extends ServiceImpl implements ITaskService { + + /** + * 车辆服务 + */ + @Autowired + private VehicleInfoService vehicleInfoService; + + @Override + public JSONObject sendTask (List staList ) { + JSONObject result = new JSONObject(); + // 获取车辆信息 + VehicleInfo vehicleInfo = vehicleInfoService.getVehicleInfo(); + JSONObject taskChain = new JSONObject(); + taskChain.put("areaId", vehicleInfo.getAreaId()); + taskChain.put("amrId", vehicleInfo.getId()); + result.put("taskChain",taskChain); + + // 组织站点信息 + List tasks = new ArrayList<>(); + for (Station dao : staList) { + JSONObject json = new JSONObject(); + json.put("endPointCode", dao.getStation_code()); + json.put("mapId", vehicleInfo.getMapId()); + switch (dao.getAction_type()) { + case "Ascend" : + json.put("taskType", "O12"); + break; + case "Descend" : + json.put("taskType", "O13"); + break; + case "Move" : + json.put("taskType", "O0"); + break; + } + tasks.add(json); + } + result.put("tasks", tasks); + return result; + } +} diff --git a/src/main/java/org/nl/apt15e/apt/taskOperate/controller/TaskManageController.java b/src/main/java/org/nl/apt15e/apt/taskOperate/controller/TaskManageController.java new file mode 100644 index 0000000..5d17b9c --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/taskOperate/controller/TaskManageController.java @@ -0,0 +1,86 @@ +package org.nl.apt15e.apt.taskOperate.controller; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.apt15e.apt.dto.WebResponse; +import org.nl.apt15e.apt.station.service.StationService; +import org.nl.apt15e.apt.taskOperate.service.TaskManageService; +import org.nl.apt15e.common.logging.annotation.Log; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 任务操作模块控制层 + *

+ * + * @author Liuxy + * @since 2025-07-09 + */ +@Slf4j +@RestController +@RequestMapping("api/operate") +public class TaskManageController { + + /** + * 站点服务 + */ + @Autowired + private StationService stationService; + + /** + * 站点服务 + */ + @Autowired + private TaskManageService taskManageService; + + @PostMapping("/queryStation") + @Log("站点查询") + public ResponseEntity queryStation() { + return new ResponseEntity<>(WebResponse.requestParamOk(stationService.queryAllStation()),HttpStatus.OK); + } + + @PostMapping("/sendTask") + @Log("下发任务") + public ResponseEntity sendTask(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(taskManageService.sendTask(whereJson),HttpStatus.OK); + } + + @PostMapping("/saveTask") + @Log("保存任务") + public ResponseEntity saveTask(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(taskManageService.saveTask(whereJson),HttpStatus.OK); + } + + @PostMapping("/cancelTask") + @Log("取消任务") + public ResponseEntity cancelTask() { + return new ResponseEntity<>(taskManageService.cancelTask(),HttpStatus.OK); + } + + @PostMapping("/queryTaskChain") + @Log("任务链查询") + public ResponseEntity queryTaskChain() { + return new ResponseEntity<>(taskManageService.queryTaskChain(),HttpStatus.OK); + } + + @PostMapping("/deleteTaskChain") + @Log("删除任务链") + public ResponseEntity deleteTaskChain(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(taskManageService.deleteTaskChain(whereJson),HttpStatus.OK); + } + + @PostMapping("/updateStation") + @Log("修改站点名称") + public ResponseEntity updateStation(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(taskManageService.updateStation(whereJson),HttpStatus.OK); + } + + @PostMapping("/TaskChainDtl") + @Log("查询任务链明细") + public ResponseEntity TaskChainDtl(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(taskManageService.TaskChainDtl(whereJson),HttpStatus.OK); + } +} diff --git a/src/main/java/org/nl/apt15e/apt/taskOperate/service/TaskManageService.java b/src/main/java/org/nl/apt15e/apt/taskOperate/service/TaskManageService.java new file mode 100644 index 0000000..2c94c67 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/taskOperate/service/TaskManageService.java @@ -0,0 +1,82 @@ +package org.nl.apt15e.apt.taskOperate.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.apt15e.apt.dto.WebResponse; + + +/** + *

+ * 任务操作接口 + *

+ * + * @author Liuxy + * @since 2025-07-09 + */ +public interface TaskManageService { + + /** + * 下发任务 + * @param whereJson { + * data:[ + * station_code:站点编码 + * station_name:站点别名 + * action_type:动作类型 + * ] + * } + * @return WebResponse + */ + WebResponse sendTask(JSONObject whereJson); + + /** + * 保存任务 + * @param whereJson { + * data:[ + * station_code:站点编码 + * station_name:站点别名 + * action_type:动作类型 + * ] + * } + * @return WebResponse + */ + WebResponse saveTask(JSONObject whereJson); + + /** + * 取消任务 + * @return WebResponse + */ + WebResponse cancelTask(); + + /** + * 任务链查询 + * @return WebResponse + */ + WebResponse queryTaskChain(); + + /** + * 删除任务链 + * @param whereJson { + * chain_id: 任务链标识 + * } + * @return WebResponse + */ + WebResponse deleteTaskChain(JSONObject whereJson); + + /** + * 修改站点名称 + * @param whereJson{ + * station_code:站点编码 + * station_name:站点别名 + * } + * @return WebResponse + */ + WebResponse updateStation(JSONObject whereJson); + + /** + * 查询任务链明细 + * @param whereJson { + * chain_id: 任务链标识 + * } + * @return WebResponse + */ + WebResponse TaskChainDtl(JSONObject whereJson); +} diff --git a/src/main/java/org/nl/apt15e/apt/taskOperate/service/impl/TaskManageServiceImpl.java b/src/main/java/org/nl/apt15e/apt/taskOperate/service/impl/TaskManageServiceImpl.java new file mode 100644 index 0000000..4e970b3 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/taskOperate/service/impl/TaskManageServiceImpl.java @@ -0,0 +1,222 @@ +package org.nl.apt15e.apt.taskOperate.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.apt15e.apt.dto.WebResponse; +import org.nl.apt15e.apt.station.dao.Station; +import org.nl.apt15e.apt.station.service.StationService; +import org.nl.apt15e.apt.task.enums.TaskStatus; +import org.nl.apt15e.apt.task.service.ITaskService; +import org.nl.apt15e.apt.task.service.dao.Task; +import org.nl.apt15e.apt.taskOperate.service.TaskManageService; +import org.nl.apt15e.apt.taskchain.service.ITaskchainService; +import org.nl.apt15e.apt.taskchain.service.dao.Taskchain; +import org.nl.apt15e.common.BadRequestException; +import org.nl.apt15e.util.HTTPUtil; +import org.nl.apt15e.util.IdUtil; +import org.nl.apt15e.util.URLConstant; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + *

+ * 任务操作模块实现类 + *

+ * + * @author Liuxy + * @since 2025-07-09 + */ +@Service +@Slf4j +public class TaskManageServiceImpl implements TaskManageService { + + /** + * 任务服务 + */ + @Autowired + private ITaskService iTaskService; + + /** + * 任务链服务 + */ + @Autowired + private ITaskchainService iTaskchainService; + + /** + * 站点服务 + */ + @Autowired + private StationService stationService; + + @Override + public WebResponse sendTask(JSONObject whereJson) { + // 校验当前是否有任务 + List list = iTaskService.list( + new QueryWrapper().lambda() + .lt(Task::getTask_status, TaskStatus.FINISHED.getCode()) + ); + if (ObjectUtil.isNotEmpty(list)) { + throw new BadRequestException("当前有正在执行中的任务!"); + } + + List staList = whereJson.getJSONArray("data").toJavaList(Station.class); + // 取返回点 + Station breakPoint = stationService.getOne( + new QueryWrapper().lambda() + .eq(Station::getStation_type, "Breaks") + ); + if (ObjectUtil.isEmpty(breakPoint)) { + throw new BadRequestException("请先设置返回点!"); + } + staList.add(breakPoint); + + // 任务id + String task_id = ""; + // 组织任务下发 + try { + JSONObject param = iTaskService.sendTask(staList); + log.info("下发RCS任务输入参数{}", param.toString()); + HttpResponse response = HTTPUtil.post(URLConstant.RCS_IP_PORT, URLConstant.SEND_TASK_URL, param); + + JSONObject result = JSONObject.parseObject(response.body()); + log.info("下发RCS任务输出参数{}", result.toString()); + if (result.getBoolean("state").equals(false)) { + throw new BadRequestException("访问调度报错:" + result.getString("errMsg")); + } + task_id = result.getString("data"); + } catch (Exception e) { + throw new BadRequestException("访问调度报错:" + e.getMessage()); + } + + // 创建任务 + Task task = new Task(); + task.setId(IdUtil.getStringId()); + task.setTask_id(task_id); + task.setTask_seq( + staList.stream() + .map(Station::getStation_name) + .collect(Collectors.joining("-")) + ); + task.setTask_status(TaskStatus.CREATE.getCode()); + task.setCreate_time(DateUtil.now()); + iTaskService.save(task); + return WebResponse.requestOk(); + } + + @Override + @Transactional + public WebResponse saveTask(JSONObject whereJson) { + List staList = whereJson.getJSONArray("data").toJavaList(Station.class); + + List taskChainList = new ArrayList<>(); + String chain_id = IdUtil.getStringId(); + for (int i = 0; i < staList.size(); i++) { + Station station = staList.get(i); + Taskchain taskchain = new Taskchain(); + taskchain.setId(IdUtil.getStringId()); + taskchain.setChain_id(chain_id); + taskchain.setChain_name(whereJson.getString("chain_name")); + taskchain.setOrder_num(i + 1 + ""); + taskchain.setStation_code(station.getStation_code()); + taskchain.setStation_name(station.getStation_name()); + taskchain.setAction_type(station.getAction_type()); + taskChainList.add(taskchain); + } + iTaskchainService.saveBatch(taskChainList); + return WebResponse.requestOk(); + } + + @Override + public WebResponse cancelTask() { + // 找到当前正在执行的任务 + Task task = iTaskService.getOne( + new QueryWrapper().lambda() + .lt(Task::getTask_status, TaskStatus.FINISHED.getCode()) + ); + if (ObjectUtil.isEmpty(task)) { + throw new BadRequestException("当前没有任务在执行中!"); + } + try { + HttpResponse response = HTTPUtil.post(URLConstant.RCS_IP_PORT, URLConstant.CANCEL_TASK_URL + task.getTask_id(), null); + JSONObject result = JSONObject.parseObject(response.body()); + if (result.getBoolean("state").equals(false)) { + throw new BadRequestException("访问调度报错:" + result.getString("errMsg")); + } + // 取消任务 + task.setTask_status(TaskStatus.CANCELED.getCode()); + iTaskService.updateById(task); + } catch (Exception e) { + throw new BadRequestException("访问调度报错:" + e.getMessage()); + } + return WebResponse.requestOk(); + } + + @Override + public WebResponse queryTaskChain() { + List taskList = iTaskchainService.list(); + // 根据任务链id分组 + Map> mapTask = taskList.stream() + .collect(Collectors.groupingBy(Taskchain::getChain_id)); + + List resultList = new ArrayList<>(); + for (String chain_id : mapTask.keySet()) { + // 根据循序号排序 + List taskChainList = mapTask.get(chain_id).stream() + .sorted(Comparator.comparing(Taskchain::getOrder_num)) + .collect(Collectors.toList()); + + JSONObject jsonTaskChain = new JSONObject(); + jsonTaskChain.put("chain_id", chain_id); + jsonTaskChain.put("chain_name", taskChainList.get(0).getChain_name()); + jsonTaskChain.put("chain_point", + taskChainList.stream() + .map(Taskchain::getStation_name) + .collect(Collectors.joining("-")) + ); + resultList.add(jsonTaskChain); + } + return WebResponse.requestParamOk(resultList); + } + + @Override + @Transactional + public WebResponse deleteTaskChain(JSONObject whereJson) { + iTaskchainService.remove( + new QueryWrapper().lambda() + .eq(Taskchain::getChain_id, whereJson.getString("chain_id")) + ); + return WebResponse.requestOk(); + } + + @Override + @Transactional + public WebResponse updateStation(JSONObject whereJson) { + stationService.update( + new UpdateWrapper().lambda() + .eq(Station::getStation_code, whereJson.getString("station_code")) + .set(Station::getStation_name, whereJson.getString("station_name")) + ); + return WebResponse.requestOk(); + } + + @Override + public WebResponse TaskChainDtl(JSONObject whereJson) { + return WebResponse.requestParamOk(iTaskchainService.list( + new QueryWrapper().lambda() + .eq(Taskchain::getChain_id, whereJson.getString("chain_id")) + .orderByAsc(Taskchain::getOrder_num) + )); + } +} diff --git a/src/main/java/org/nl/apt15e/apt/taskchain/service/ITaskchainService.java b/src/main/java/org/nl/apt15e/apt/taskchain/service/ITaskchainService.java new file mode 100644 index 0000000..f04b49c --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/taskchain/service/ITaskchainService.java @@ -0,0 +1,16 @@ +package org.nl.apt15e.apt.taskchain.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.apt15e.apt.taskchain.service.dao.Taskchain; + +/** + *

+ * 服务类 + *

+ * + * @author Liuxy + * @since 2025-07-09 + */ +public interface ITaskchainService extends IService { + +} diff --git a/src/main/java/org/nl/apt15e/apt/taskchain/service/dao/Taskchain.java b/src/main/java/org/nl/apt15e/apt/taskchain/service/dao/Taskchain.java new file mode 100644 index 0000000..97fde67 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/taskchain/service/dao/Taskchain.java @@ -0,0 +1,63 @@ +package org.nl.apt15e.apt.taskchain.service.dao; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author author + * @since 2025-07-09 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("taskchain") +public class Taskchain implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 标识 + */ + @TableId(value = "id") + private String id; + + /** + * 任务链标识 + */ + private String chain_id; + + /** + * 任务链名称 + */ + private String chain_name; + + /** + * 顺序号 + */ + private String order_num; + + /** + * 站点编码 + */ + private String station_code; + + /** + * 站点名称 + */ + private String station_name; + + /** + * 动作类型 + */ + private String action_type; + + +} diff --git a/src/main/java/org/nl/apt15e/apt/taskchain/service/dao/mapper/TaskchainMapper.java b/src/main/java/org/nl/apt15e/apt/taskchain/service/dao/mapper/TaskchainMapper.java new file mode 100644 index 0000000..52ce84c --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/taskchain/service/dao/mapper/TaskchainMapper.java @@ -0,0 +1,16 @@ +package org.nl.apt15e.apt.taskchain.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.apt15e.apt.taskchain.service.dao.Taskchain; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Liuxy + * @since 2025-07-09 + */ +public interface TaskchainMapper extends BaseMapper { + +} diff --git a/src/main/java/org/nl/apt15e/apt/taskchain/service/dao/mapper/TaskchainMapper.xml b/src/main/java/org/nl/apt15e/apt/taskchain/service/dao/mapper/TaskchainMapper.xml new file mode 100644 index 0000000..c542db7 --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/taskchain/service/dao/mapper/TaskchainMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/java/org/nl/apt15e/apt/taskchain/service/impl/TaskchainServiceImpl.java b/src/main/java/org/nl/apt15e/apt/taskchain/service/impl/TaskchainServiceImpl.java new file mode 100644 index 0000000..383d3fb --- /dev/null +++ b/src/main/java/org/nl/apt15e/apt/taskchain/service/impl/TaskchainServiceImpl.java @@ -0,0 +1,20 @@ +package org.nl.apt15e.apt.taskchain.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.nl.apt15e.apt.taskchain.service.ITaskchainService; +import org.nl.apt15e.apt.taskchain.service.dao.Taskchain; +import org.nl.apt15e.apt.taskchain.service.dao.mapper.TaskchainMapper; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Liuxy + * @since 2025-07-09 + */ +@Service +public class TaskchainServiceImpl extends ServiceImpl implements ITaskchainService { + +} diff --git a/src/main/java/org/nl/apt15e/config/thread/CorsFilter.java b/src/main/java/org/nl/apt15e/config/thread/CorsFilter.java new file mode 100644 index 0000000..8250449 --- /dev/null +++ b/src/main/java/org/nl/apt15e/config/thread/CorsFilter.java @@ -0,0 +1,55 @@ +package org.nl.apt15e.config.thread; + +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 跨域过滤器 + * @author kong + */ +@Component +@Order(-200) +public class CorsFilter implements Filter { + + static final String OPTIONS = "OPTIONS"; + + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) req; + HttpServletResponse response = (HttpServletResponse) res; + // 允许指定域访问跨域资源 + response.setHeader("Access-Control-Allow-Origin", "*"); + // 允许所有请求方式 + response.setHeader("Access-Control-Allow-Methods", "*"); + // 有效时间 + response.setHeader("Access-Control-Max-Age", "3600"); + // 允许的header参数 + response.setHeader("Access-Control-Allow-Headers", "*"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + + // 如果是预检请求,直接返回 + if (OPTIONS.equals(request.getMethod())) { + System.out.println("=======================浏览器发来了OPTIONS预检请求=========="); + response.getWriter().print(""); + return; + } + + // System.out.println("*********************************过滤器被使用**************************"); + chain.doFilter(req, res); + } + + @Override + public void init(FilterConfig filterConfig) { + } + + @Override + public void destroy() { + } + +} diff --git a/src/main/java/org/nl/apt15e/util/IdUtil.java b/src/main/java/org/nl/apt15e/util/IdUtil.java new file mode 100644 index 0000000..868a25d --- /dev/null +++ b/src/main/java/org/nl/apt15e/util/IdUtil.java @@ -0,0 +1,11 @@ +package org.nl.apt15e.util; + +public class IdUtil { + public static Long getLongId() { + return cn.hutool.core.util.IdUtil.getSnowflake(1, 1).nextId(); + } + + public static String getStringId() { + return String.valueOf(IdUtil.getLongId()); + } +} diff --git a/src/main/java/org/nl/apt15e/util/URLConstant.java b/src/main/java/org/nl/apt15e/util/URLConstant.java new file mode 100644 index 0000000..ff1147c --- /dev/null +++ b/src/main/java/org/nl/apt15e/util/URLConstant.java @@ -0,0 +1,28 @@ +package org.nl.apt15e.util; + +/** + *

+ * 地址常量 + *

+ * + * @author Liuxy + * @since 2025-07-09 + */ +public class URLConstant { + + /** + * RCS调度IP及端口 + */ + public final static String RCS_IP_PORT = "127.0.0.1:8011"; + + /** + * 下发任务URL + */ + public final static String SEND_TASK_URL = "/task/add"; + + /** + * 取消任务URL + */ + public final static String CANCEL_TASK_URL = "/task/cancel/"; + +}