diff --git a/nl-business-api/src/main/java/org/nl/api/schedule/task/api/ScheduleTaskAPI.java b/nl-business-api/src/main/java/org/nl/api/schedule/task/api/ScheduleTaskAPI.java index 4c1609c..435414e 100644 --- a/nl-business-api/src/main/java/org/nl/api/schedule/task/api/ScheduleTaskAPI.java +++ b/nl-business-api/src/main/java/org/nl/api/schedule/task/api/ScheduleTaskAPI.java @@ -3,6 +3,7 @@ package org.nl.api.schedule.task.api; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONObject; +import org.nl.api.schedule.task.core.ScheduleAPICreateCruiseTaskParam; import org.nl.api.schedule.task.core.ScheduleAPICreateOneClickTaskParam; import org.nl.api.schedule.task.core.ScheduleAPICreateTaskParam; @@ -55,4 +56,11 @@ public interface ScheduleTaskAPI { * @return */ HttpResponse oneClickOperationTask(ScheduleAPICreateOneClickTaskParam scheduleAPICreateOneClickTaskParam); + + /** + * 创建调度巡航任务 + * @param param + * @return + */ + HttpResponse createCruiseTask(ScheduleAPICreateCruiseTaskParam param); } diff --git a/nl-business-api/src/main/java/org/nl/api/schedule/task/core/ScheduleAPICreateCruiseTaskParam.java b/nl-business-api/src/main/java/org/nl/api/schedule/task/core/ScheduleAPICreateCruiseTaskParam.java new file mode 100644 index 0000000..d567a18 --- /dev/null +++ b/nl-business-api/src/main/java/org/nl/api/schedule/task/core/ScheduleAPICreateCruiseTaskParam.java @@ -0,0 +1,37 @@ +package org.nl.api.schedule.task.core; + +import lombok.Data; + +import java.util.List; + +/** + * @author dsh + * 2026/3/3 + */ +@Data +public class ScheduleAPICreateCruiseTaskParam { + /** + * 任务号 + */ + private String task_code; + + /** + * 目标点 + */ + private List destinations; + + /** + * 任务类型 + */ + private String type; + + /** + * 任务优先级 (1-10数字越低优先级越高) + */ + private String priority; + + /** + * 指定车号 + */ + private String vehicle_number; +} diff --git a/nl-business-media/pom.xml b/nl-business-externalApi/pom.xml similarity index 89% rename from nl-business-media/pom.xml rename to nl-business-externalApi/pom.xml index f80f000..762450f 100644 --- a/nl-business-media/pom.xml +++ b/nl-business-externalApi/pom.xml @@ -9,11 +9,11 @@ 1.0-SNAPSHOT - nl-business-media + nl-business-externalApi jar - 媒体模块 - 处理音乐和SOP文档 + 外部API模块 + 提供外部访问API diff --git a/nl-business-media/src/main/java/org/nl/media/Main.java b/nl-business-externalApi/src/main/java/org/nl/externalApi/Main.java similarity index 85% rename from nl-business-media/src/main/java/org/nl/media/Main.java rename to nl-business-externalApi/src/main/java/org/nl/externalApi/Main.java index f935974..54817e1 100644 --- a/nl-business-media/src/main/java/org/nl/media/Main.java +++ b/nl-business-externalApi/src/main/java/org/nl/externalApi/Main.java @@ -1,4 +1,4 @@ -package org.nl.media; +package org.nl.externalApi; /** * @Author: lyd diff --git a/nl-business-externalApi/src/main/java/org/nl/externalApi/task/controller/ExternalTaskController.java b/nl-business-externalApi/src/main/java/org/nl/externalApi/task/controller/ExternalTaskController.java new file mode 100644 index 0000000..ea843d8 --- /dev/null +++ b/nl-business-externalApi/src/main/java/org/nl/externalApi/task/controller/ExternalTaskController.java @@ -0,0 +1,49 @@ +package org.nl.externalApi.task.controller; + +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.nl.externalApi.task.param.CreateTaskParam; +import org.nl.externalApi.task.service.ExternalTaskService; +import org.nl.logging.annotation.Log; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * @author dsh + * 2026/2/24 + */ +@RestController +@RequestMapping("/external/api") +@Validated +@Slf4j +public class ExternalTaskController { + + @Resource + private ExternalTaskService externalTaskService; + + @PostMapping("/createTask") + @Log("外部API:创建任务") + public ResponseEntity createTask(@RequestBody CreateTaskParam createTaskParam){ + return new ResponseEntity<>(externalTaskService.createTask(createTaskParam), HttpStatus.OK); + } + + @PostMapping("/cancelTask/{id}") + @Log("外部API:取消任务任务") + public ResponseEntity cancelTask(@PathVariable String id){ + return new ResponseEntity<>(externalTaskService.cancelTask(id), HttpStatus.OK); + } + + @GetMapping("/getTaskInfos") + @Log("外部API:查询所有未完成的任务") + public ResponseEntity getTaskInfos(){ + return new ResponseEntity<>(externalTaskService.getTaskInfos(), HttpStatus.OK); + } + + @GetMapping("/getTaskInfos/{id}") + @Log("外部API:根据任务号查询任务") + public ResponseEntity getTaskInfosById(@PathVariable String id){ + return new ResponseEntity<>(externalTaskService.getTaskInfosById(id), HttpStatus.OK); + } +} diff --git a/nl-business-externalApi/src/main/java/org/nl/externalApi/task/param/CreateTaskParam.java b/nl-business-externalApi/src/main/java/org/nl/externalApi/task/param/CreateTaskParam.java new file mode 100644 index 0000000..3437e67 --- /dev/null +++ b/nl-business-externalApi/src/main/java/org/nl/externalApi/task/param/CreateTaskParam.java @@ -0,0 +1,35 @@ +package org.nl.externalApi.task.param; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +/** + * 外部API创建任务参数 + * @author dsh + * 2026/2/24 + */ +@Data +public class CreateTaskParam { + + /** + * 目的地 + */ + @NotBlank(message = "目的地不能为空") + private String destinations; + + /** + * 任务类型 + */ + @NotBlank(message = "任务类型不能为空") + private String type; + + /** + * 优先级 + */ + private String priority; + + /** + * 指定车辆 + */ + private String vehicle_number; +} diff --git a/nl-business-externalApi/src/main/java/org/nl/externalApi/task/service/ExternalTaskService.java b/nl-business-externalApi/src/main/java/org/nl/externalApi/task/service/ExternalTaskService.java new file mode 100644 index 0000000..f10deb5 --- /dev/null +++ b/nl-business-externalApi/src/main/java/org/nl/externalApi/task/service/ExternalTaskService.java @@ -0,0 +1,38 @@ +package org.nl.externalApi.task.service; + +import org.nl.externalApi.task.param.CreateTaskParam; +import org.nl.response.WebResponse; + +/** + * @author dsh + * 2026/2/24 + */ +public interface ExternalTaskService { + + /** + * 外部API 创建任务 + * @param createTaskParam + * @return WebResponse + */ + WebResponse createTask(CreateTaskParam createTaskParam); + + /** + * 外部API 取消任务 + * @param task_code + * @return WebResponse + */ + WebResponse cancelTask(String task_code); + + /** + * 外部API 查询所有未完成的任务信息 + * @return WebResponse + */ + WebResponse getTaskInfos(); + + /** + * 根据任务号查询任务信息 + * @param task_code + * @return WebResponse + */ + WebResponse getTaskInfosById(String task_code); +} diff --git a/nl-business-externalApi/src/main/java/org/nl/externalApi/task/service/impl/ExternalTaskServiceImpl.java b/nl-business-externalApi/src/main/java/org/nl/externalApi/task/service/impl/ExternalTaskServiceImpl.java new file mode 100644 index 0000000..60ad757 --- /dev/null +++ b/nl-business-externalApi/src/main/java/org/nl/externalApi/task/service/impl/ExternalTaskServiceImpl.java @@ -0,0 +1,39 @@ +package org.nl.externalApi.task.service.impl; + +import jakarta.annotation.Resource; +import org.nl.api.task.api.TaskAPI; +import org.nl.externalApi.task.param.CreateTaskParam; +import org.nl.externalApi.task.service.ExternalTaskService; +import org.nl.response.WebResponse; +import org.springframework.stereotype.Service; + +/** + * @author dsh + * 2026/2/24 + */ +@Service +public class ExternalTaskServiceImpl implements ExternalTaskService { + + @Resource + private TaskAPI taskAPI; + + @Override + public WebResponse createTask(CreateTaskParam createTaskParam) { + return null; + } + + @Override + public WebResponse cancelTask(String task_code) { + return null; + } + + @Override + public WebResponse getTaskInfos() { + return null; + } + + @Override + public WebResponse getTaskInfosById(String task_code) { + return null; + } +} diff --git a/nl-business-schedule/src/main/java/org/nl/schedule/modular/setting/controller/ScheduleSettingController.java b/nl-business-schedule/src/main/java/org/nl/schedule/modular/setting/controller/ScheduleSettingController.java new file mode 100644 index 0000000..8a56372 --- /dev/null +++ b/nl-business-schedule/src/main/java/org/nl/schedule/modular/setting/controller/ScheduleSettingController.java @@ -0,0 +1,28 @@ +package org.nl.schedule.modular.setting.controller; + +import jakarta.annotation.Resource; +import org.nl.schedule.modular.setting.param.NetworkParam; +import org.nl.schedule.modular.setting.service.ScheduleSettingService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +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; + +/** + * @author dsh + * 2026/3/2 + */ +@RestController +@RequestMapping("/schedule/setting") +public class ScheduleSettingController { + + @Resource + private ScheduleSettingService scheduleSettingService; + + @PostMapping("/networkOperation") + public ResponseEntity networkOperation(@RequestBody NetworkParam param){ + return new ResponseEntity<>(scheduleSettingService.networkOperation(param), HttpStatus.OK); + } +} diff --git a/nl-business-schedule/src/main/java/org/nl/schedule/modular/setting/param/NetworkParam.java b/nl-business-schedule/src/main/java/org/nl/schedule/modular/setting/param/NetworkParam.java new file mode 100644 index 0000000..303ff23 --- /dev/null +++ b/nl-business-schedule/src/main/java/org/nl/schedule/modular/setting/param/NetworkParam.java @@ -0,0 +1,30 @@ +package org.nl.schedule.modular.setting.param; + +import lombok.Data; + +/** + * @author dsh + * 2026/3/2 + */ +@Data +public class NetworkParam { + /** + * 命令 取值范围:[connect,disconnect,status,scan],分别是连接,断开,wifi状态,扫描wifi + */ + private String command; + + /** + * 车号 + */ + private String agvId; + + /** + * wifi名称 + */ + private String ssid; + + /** + * wifi密码 + */ + private String password; +} diff --git a/nl-business-schedule/src/main/java/org/nl/schedule/modular/setting/service/ScheduleSettingService.java b/nl-business-schedule/src/main/java/org/nl/schedule/modular/setting/service/ScheduleSettingService.java new file mode 100644 index 0000000..0cf05c1 --- /dev/null +++ b/nl-business-schedule/src/main/java/org/nl/schedule/modular/setting/service/ScheduleSettingService.java @@ -0,0 +1,18 @@ +package org.nl.schedule.modular.setting.service; + +import org.nl.response.WebResponse; +import org.nl.schedule.modular.setting.param.NetworkParam; + +/** + * @author dsh + * 2026/3/2 + */ +public interface ScheduleSettingService { + + /** + * + * @param param + * @return + */ + WebResponse networkOperation(NetworkParam param); +} diff --git a/nl-business-schedule/src/main/java/org/nl/schedule/modular/setting/service/impl/ScheduleSettingServiceImpl.java b/nl-business-schedule/src/main/java/org/nl/schedule/modular/setting/service/impl/ScheduleSettingServiceImpl.java new file mode 100644 index 0000000..fff40e0 --- /dev/null +++ b/nl-business-schedule/src/main/java/org/nl/schedule/modular/setting/service/impl/ScheduleSettingServiceImpl.java @@ -0,0 +1,45 @@ +package org.nl.schedule.modular.setting.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.config.language.LangProcess; +import org.nl.exception.BadRequestException; +import org.nl.response.WebResponse; +import org.nl.schedule.modular.setting.param.NetworkParam; +import org.nl.schedule.modular.setting.service.ScheduleSettingService; +import org.nl.util.URLConstant; +import org.springframework.stereotype.Service; + +/** + * @author dsh + * 2026/3/2 + */ +@Slf4j +@Service +public class ScheduleSettingServiceImpl implements ScheduleSettingService { + + @Override + public WebResponse networkOperation(NetworkParam param) { + if (ObjectUtil.isEmpty(param)){ + throw new BadRequestException(LangProcess.msg("schedule_wifi_param_empty")); + } + log.info("调度网络操作参数:{}", param); + HttpResponse result = null; + try { + result = HttpRequest.post(URLConstant.SCHEDULE_IP_PORT+"/system/network/wifi") + .body(String.valueOf(JSONObject.toJSON(param))) + .execute(); + if (result !=null && result.isOk()){ + log.info("调度网络操作响应结果:{}",result.body()); + return WebResponse.requestParamOk(JSON.parseObject(result.body())); + } + }catch (Exception e){ + log.info("调度网络操作参数失败"); + } + throw new BadRequestException(LangProcess.msg("schedule_wifi_param_error")); + } +} diff --git a/nl-business-schedule/src/main/java/org/nl/schedule/modular/task/provider/ScheduleTaskAPIProvider.java b/nl-business-schedule/src/main/java/org/nl/schedule/modular/task/provider/ScheduleTaskAPIProvider.java index 6a597d4..3327390 100644 --- a/nl-business-schedule/src/main/java/org/nl/schedule/modular/task/provider/ScheduleTaskAPIProvider.java +++ b/nl-business-schedule/src/main/java/org/nl/schedule/modular/task/provider/ScheduleTaskAPIProvider.java @@ -1,5 +1,6 @@ package org.nl.schedule.modular.task.provider; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; @@ -7,6 +8,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.nl.api.schedule.task.api.ScheduleTaskAPI; +import org.nl.api.schedule.task.core.ScheduleAPICreateCruiseTaskParam; import org.nl.api.schedule.task.core.ScheduleAPICreateOneClickTaskParam; import org.nl.api.schedule.task.core.ScheduleAPICreateTaskParam; import org.nl.config.language.LangProcess; @@ -15,6 +17,8 @@ import org.nl.schedule.core.util.ScheduleUtil; import org.nl.util.URLConstant; import org.springframework.stereotype.Service; +import java.util.List; + /** * @author dsh * 2025/12/1 @@ -181,4 +185,51 @@ public class ScheduleTaskAPIProvider implements ScheduleTaskAPI { } return result; } + + @Override + public HttpResponse createCruiseTask(ScheduleAPICreateCruiseTaskParam param) { + String task_code = param.getTask_code(); + List destinations = param.getDestinations(); + String type = param.getType(); + if (StrUtil.isBlank(task_code)){ + throw new BadRequestException(LangProcess.msg("schedule_task_code_empty")); + } + if (ObjectUtil.isEmpty(destinations)){ + throw new BadRequestException(LangProcess.msg("schedule_destinations_empty")); + } + if (StrUtil.isBlank(type)){ + throw new BadRequestException(LangProcess.msg("schedule_operation_type_empty")); + } + + JSONObject request_body = new JSONObject(); + request_body.put("deadline", ScheduleUtil.getNextDay(1)); + if (StrUtil.isNotBlank(param.getVehicle_number())){ + request_body.put("intendedVehicle", param.getVehicle_number()); + } + JSONArray body_destinations = new JSONArray(); + for (String destination : destinations){ + JSONObject body_destination = new JSONObject(); + body_destination.put("locationName", destination); + body_destination.put("operation", type); + body_destinations.add(body_destination); + } + request_body.put("destinations", body_destinations); + if (StrUtil.isNotBlank(param.getPriority())){ + request_body.put("priority", Integer.parseInt(param.getPriority())); + } + + log.info("下发调度巡航任务参数:{}", request_body); + HttpResponse result = null; + try { + result = HttpRequest + .post(URLConstant.SCHEDULE_IP_PORT+"/tasks/"+param.getTask_code()) + .body(String.valueOf(request_body)) + .execute(); + + log.info("下发调度巡航任务响应结果:{}",result.body()); + }catch (Exception e){ + log.error("下发调度巡航任务失败:{}",e.getMessage()); + } + return result; + } } diff --git a/nl-business-schedule/src/main/java/org/nl/schedule/modular/vehicle/dto/VehicleInfoDto.java b/nl-business-schedule/src/main/java/org/nl/schedule/modular/vehicle/dto/VehicleInfoDto.java index 0d19c3f..19eedd5 100644 --- a/nl-business-schedule/src/main/java/org/nl/schedule/modular/vehicle/dto/VehicleInfoDto.java +++ b/nl-business-schedule/src/main/java/org/nl/schedule/modular/vehicle/dto/VehicleInfoDto.java @@ -78,4 +78,9 @@ public class VehicleInfoDto{ * 最后更新时间 */ private String lastUpdated; + + /** + * 车辆模式(0配送,1循环) + */ + private String vehicleMode; } diff --git a/nl-business-schedule/src/main/java/org/nl/schedule/modular/vehicle/service/impl/VehicleServiceImpl.java b/nl-business-schedule/src/main/java/org/nl/schedule/modular/vehicle/service/impl/VehicleServiceImpl.java index 1088248..80826c6 100644 --- a/nl-business-schedule/src/main/java/org/nl/schedule/modular/vehicle/service/impl/VehicleServiceImpl.java +++ b/nl-business-schedule/src/main/java/org/nl/schedule/modular/vehicle/service/impl/VehicleServiceImpl.java @@ -7,6 +7,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.nl.api.setting.api.SettingAPI; import org.nl.api.sys.anomalyInfo.api.ErrorInfoAPI; import org.nl.api.task.api.TaskAPI; import org.nl.response.WebResponse; @@ -43,6 +44,9 @@ public class VehicleServiceImpl implements VehicleService { @Resource private ErrorInfoAPI errorInfoAPI; + @Resource + private SettingAPI settingAPI; + /** * 定时更新车辆信息(每秒执行) */ @@ -60,6 +64,8 @@ public class VehicleServiceImpl implements VehicleService { if (vehicle.getError_code()!=0) { vehicle.setError_info(errorInfoAPI.queryErrorInfoByCode(vehicle.getError_code())); } + // 查询车辆模式 + vehicle.setVehicleMode(settingAPI.querySettingParamByCode("mode").getJSONObject("data").getString("value")); vehicleCache.put(vehicle.getVehicleNumber(), vehicle); } diff --git a/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/dict/dao/Dict.java b/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/dict/dao/Dict.java index 22b0542..82fa3d8 100644 --- a/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/dict/dao/Dict.java +++ b/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/dict/dao/Dict.java @@ -104,4 +104,13 @@ public class Dict implements Serializable { */ private String update_time; + /** + * 中文字典标签 + */ + private String zh_label; + + /** + * 英文字典标签 + */ + private String en_label; } diff --git a/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/menu/dao/SysMenu.java b/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/menu/dao/SysMenu.java index 28537c3..f452f26 100644 --- a/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/menu/dao/SysMenu.java +++ b/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/menu/dao/SysMenu.java @@ -60,6 +60,16 @@ public class SysMenu implements Serializable { */ private String title; + /** + * 菜单标题 + */ + private String zh_title; + + /** + * 菜单标题 + */ + private String en_title; + /** * 组件名称 */ diff --git a/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/menu/dto/MenuDto.java b/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/menu/dto/MenuDto.java index dd45f7e..a9c3293 100644 --- a/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/menu/dto/MenuDto.java +++ b/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/menu/dto/MenuDto.java @@ -34,6 +34,8 @@ public class MenuDto extends BaseDTO implements Serializable { private String permission; private String title; + private String zh_title; + private String en_title; private Integer menu_sort; @@ -90,4 +92,14 @@ public class MenuDto extends BaseDTO implements Serializable { public int hashCode() { return Objects.hash(menu_id); } + + public String getLocalTitle(String local){ + if ("en".equals(local)){ + return en_title; + } + if ("zh".equals(local)){ + return zh_title; + } + return title; + } } diff --git a/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/menu/service/impl/SysMenuServiceImpl.java b/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/menu/service/impl/SysMenuServiceImpl.java index e71a847..fe01978 100644 --- a/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/menu/service/impl/SysMenuServiceImpl.java +++ b/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/menu/service/impl/SysMenuServiceImpl.java @@ -27,6 +27,7 @@ import org.nl.sys.modular.backgroundmanagement.menu.mapper.SysMenuMapper; import org.nl.sys.modular.backgroundmanagement.menu.service.ISysMenuService; import org.nl.util.IdUtil; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -259,11 +260,12 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override public List buildMenus(List menuDtos) { List list = new LinkedList<>(); + String lang = LocaleContextHolder.getLocale().getLanguage(); menuDtos.forEach(menuDTO -> { if (menuDTO != null) { List menuDtoList = menuDTO.getChildren(); MenuVo menuVo = new MenuVo(); - menuVo.setName(ObjectUtil.isNotEmpty(menuDTO.getComponent_name()) ? menuDTO.getComponent_name() : menuDTO.getTitle()); + menuVo.setName(ObjectUtil.isNotEmpty(menuDTO.getComponent_name()) ? menuDTO.getComponent_name() : menuDTO.getLocalTitle(lang)); // 一级目录需要加斜杠,不然会报警告 menuVo.setPath(ObjectUtil.isEmpty(menuDTO.getPid()) ? "/" + menuDTO.getPath() : menuDTO.getPath()); menuVo.setHidden(menuDTO.getHidden()); @@ -278,7 +280,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl menuVo.setComponent(menuDTO.getComponent()); } } - menuVo.setMeta(new MenuMetaVo(menuDTO.getTitle(), menuDTO.getIcon(), !menuDTO.getCache())); + menuVo.setMeta(new MenuMetaVo(menuDTO.getLocalTitle(lang), menuDTO.getIcon(), !menuDTO.getCache())); if (menuDtoList != null && menuDtoList.size() != 0) { menuVo.setAlwaysShow(true); menuVo.setRedirect("noredirect"); @@ -397,12 +399,13 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override public List buildMenus(List menuDtos, String pid) { List list = new LinkedList<>(); + String lang = LocaleContextHolder.getLocale().getLanguage(); //剔除系统级菜单 menuDtos.forEach(menuDTO -> { if (menuDTO != null) { List menuDtoList = menuDTO.getChildren(); MenuVo menuVo = new MenuVo(); - menuVo.setName(ObjectUtil.isNotEmpty(menuDTO.getComponent_name()) ? menuDTO.getComponent_name() : menuDTO.getTitle()); + menuVo.setName(ObjectUtil.isNotEmpty(menuDTO.getComponent_name()) ? menuDTO.getComponent_name() : menuDTO.getLocalTitle(lang)); // 一级目录需要加斜杠,不然会报警告 menuVo.setPath(pid.equals(menuDTO.getPid())? "/" + menuDTO.getPath() : menuDTO.getPath()); menuVo.setHidden(menuDTO.getHidden()); @@ -417,7 +420,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl menuVo.setComponent(menuDTO.getComponent()); } } - menuVo.setMeta(new MenuMetaVo(menuDTO.getTitle(), menuDTO.getIcon(), !menuDTO.getCache())); + menuVo.setMeta(new MenuMetaVo(menuDTO.getLocalTitle(lang), menuDTO.getIcon(), !menuDTO.getCache())); if (menuDtoList != null && menuDtoList.size() != 0) { menuVo.setAlwaysShow(true); menuVo.setRedirect("noredirect"); diff --git a/nl-business-sys/src/main/java/org/nl/sys/modular/qrcode/service/impl/QRCodeServiceImpl.java b/nl-business-sys/src/main/java/org/nl/sys/modular/qrcode/service/impl/QRCodeServiceImpl.java index df73bf1..27b14d0 100644 --- a/nl-business-sys/src/main/java/org/nl/sys/modular/qrcode/service/impl/QRCodeServiceImpl.java +++ b/nl-business-sys/src/main/java/org/nl/sys/modular/qrcode/service/impl/QRCodeServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import jakarta.annotation.Resource; +import org.nl.api.setting.api.SettingAPI; import org.nl.api.task.api.TaskAPI; import org.nl.api.task.core.TaskRequestParam; import org.nl.config.language.LangProcess; @@ -44,6 +45,9 @@ public class QRCodeServiceImpl implements QRCodeService { @Resource private QRcodeInfoMapper qrcodeInfoMapper; + @Resource + private SettingAPI settingAPI; + @Resource private TaskAPI taskAPI; @@ -150,8 +154,12 @@ public class QRCodeServiceImpl implements QRCodeService { @Override public WebResponse createTask(TaskRequestParam qrCodeTaskRequestParam) { - taskAPI.createTask(qrCodeTaskRequestParam, TaskSourceEnum.QRCODE.getName()); - return null; + String mode = settingAPI.querySettingParamByCode("mode").getJSONObject("data").getString("value"); + // 判断是否在巡航模式 再巡航模式不能下发二维码任务 + if ("1".equals(mode)){ + throw new BadRequestException(LangProcess.msg("qrcode_create_failed_mode")); + } + return taskAPI.createTask(qrCodeTaskRequestParam, TaskSourceEnum.QRCODE.getName()); } @Override diff --git a/nl-business-task/src/main/java/org/nl/task/controller/TaskController.java b/nl-business-task/src/main/java/org/nl/task/controller/TaskController.java index aa100a6..26f2d9f 100644 --- a/nl-business-task/src/main/java/org/nl/task/controller/TaskController.java +++ b/nl-business-task/src/main/java/org/nl/task/controller/TaskController.java @@ -77,4 +77,10 @@ public class TaskController { return new ResponseEntity<>(taskService.queryCurrentTaskInfo(),HttpStatus.OK); } + @PostMapping("/createCruiseTask") + @Log("创建巡航任务") + public ResponseEntity createCruiseTask(@RequestBody @Validated CreateCruiseTaskRequestParam createCruiseTaskRequestParam){ + return new ResponseEntity<>(taskService.createCruiseTask(createCruiseTaskRequestParam), HttpStatus.OK); + } + } diff --git a/nl-business-task/src/main/java/org/nl/task/enums/TaskTypeEnum.java b/nl-business-task/src/main/java/org/nl/task/enums/TaskTypeEnum.java index cd628f6..d097659 100644 --- a/nl-business-task/src/main/java/org/nl/task/enums/TaskTypeEnum.java +++ b/nl-business-task/src/main/java/org/nl/task/enums/TaskTypeEnum.java @@ -24,7 +24,11 @@ public enum TaskTypeEnum { /** * 移动 */ - MOVE("3", "Move", "移动"); + MOVE("3", "Move", "移动"), + /** + * 巡航 + */ + CRUISE("4", "cruise", "巡航"); private String code; private String name; @@ -46,7 +50,8 @@ public enum TaskTypeEnum { return TaskTypeEnum.DELIVER.getName().equals(taskType) || TaskTypeEnum.CHARGE.getName().equals(taskType) || TaskTypeEnum.REFILL.getName().equals(taskType) - || TaskTypeEnum.MOVE.getName().equals(taskType); + || TaskTypeEnum.MOVE.getName().equals(taskType) + || TaskTypeEnum.CRUISE.getName().equals(taskType); } diff --git a/nl-business-task/src/main/java/org/nl/task/param/CreateCruiseTaskRequestParam.java b/nl-business-task/src/main/java/org/nl/task/param/CreateCruiseTaskRequestParam.java new file mode 100644 index 0000000..ef8f3b0 --- /dev/null +++ b/nl-business-task/src/main/java/org/nl/task/param/CreateCruiseTaskRequestParam.java @@ -0,0 +1,30 @@ +package org.nl.task.param; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.util.List; + +/** + * @author dsh + * 2026/3/3 + */ +@Data +public class CreateCruiseTaskRequestParam { + + /** + * 巡航站点集合 + */ + private List destinations; + + /** + * 任务类型 + */ + @NotBlank(message = "任务类型不能为空") + private String type; + + /** + * 指定车号 + */ + private String vehicle_number; +} diff --git a/nl-business-task/src/main/java/org/nl/task/service/TaskService.java b/nl-business-task/src/main/java/org/nl/task/service/TaskService.java index 9e44082..b240acd 100644 --- a/nl-business-task/src/main/java/org/nl/task/service/TaskService.java +++ b/nl-business-task/src/main/java/org/nl/task/service/TaskService.java @@ -73,4 +73,11 @@ public interface TaskService extends IService{ * @return List */ List queryCurrentTaskInfo(); + + /** + * 创建巡航任务 + * @return WebResponse + */ + WebResponse createCruiseTask(CreateCruiseTaskRequestParam param); + } diff --git a/nl-business-task/src/main/java/org/nl/task/service/impl/TaskServiceImpl.java b/nl-business-task/src/main/java/org/nl/task/service/impl/TaskServiceImpl.java index d1bb343..24ea516 100644 --- a/nl-business-task/src/main/java/org/nl/task/service/impl/TaskServiceImpl.java +++ b/nl-business-task/src/main/java/org/nl/task/service/impl/TaskServiceImpl.java @@ -16,10 +16,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.nl.api.schedule.task.api.ScheduleTaskAPI; +import org.nl.api.schedule.task.core.ScheduleAPICreateCruiseTaskParam; import org.nl.api.schedule.task.core.ScheduleAPICreateOneClickTaskParam; import org.nl.api.schedule.task.core.ScheduleAPICreateTaskParam; import org.nl.config.language.LangProcess; import org.nl.enums.ScheduleTaskReportStatusEnum; +import org.nl.enums.TaskSourceEnum; import org.nl.enums.YesOrNoEnum; import org.nl.exception.BadRequestException; import org.nl.response.WebResponse; @@ -326,4 +328,38 @@ public class TaskServiceImpl extends ServiceImpl implements Tas return currentTaskList; } + @Override + @Transactional(rollbackFor = Exception.class) + public WebResponse createCruiseTask(CreateCruiseTaskRequestParam param) { + try { + if (!TaskTypeEnum.CRUISE.getName().equals(param.getType())) { + throw new BadRequestException(LangProcess.msg("create_cruise_task_error")); + } + Task task = BeanUtil.copyProperties(param, Task.class); + task.setDestinations(TaskTypeEnum.CRUISE.getName()); + task.setId(IdUtil.getStringId()); + if (StrUtil.isBlank(task.getTask_code())){ + task.setTask_code(TaskCodeGeneratorUtil.generateTaskId()); + } + task.setType(param.getType()); + task.setSource(TaskSourceEnum.SCREEN.getName()); + task.setStatus(TaskStatusEnum.CREATE.getCode()); + task.setIsPause(YesOrNoEnum.NO.getCode()); + task.setVehicleReportStatus("0"); + task.setCreate_time(DateUtil.now()); + taskMapper.insert(task); + + ScheduleAPICreateCruiseTaskParam scheduleAPICreateCruiseTaskParam = BeanUtil.copyProperties(task, ScheduleAPICreateCruiseTaskParam.class); + scheduleAPICreateCruiseTaskParam.setDestinations(param.getDestinations()); + HttpResponse result = scheduleTaskAPI.createCruiseTask(scheduleAPICreateCruiseTaskParam); + if (result == null || !result.isOk()){ + throw new BadRequestException(LangProcess.msg("task_schedule_create_failed")); + } + return WebResponse.requestOk(); + }catch (Exception e){ + log.error("创建巡航任务失败:{}",e.getMessage()); + throw new BadRequestException(LangProcess.msg("task_create_failed",e.getMessage())); + } + } + } diff --git a/nl-web-app/pom.xml b/nl-web-app/pom.xml index 6b6f1b2..298cb38 100644 --- a/nl-web-app/pom.xml +++ b/nl-web-app/pom.xml @@ -36,7 +36,7 @@ org.nl - nl-business-media + nl-business-externalApi org.nl diff --git a/nl-web-app/src/main/resources/config/application.yml b/nl-web-app/src/main/resources/config/application.yml index b4d7d2c..eb11255 100644 --- a/nl-web-app/src/main/resources/config/application.yml +++ b/nl-web-app/src/main/resources/config/application.yml @@ -9,7 +9,7 @@ spring: basename: language/task/task,language/error/error,language/buss/buss encoding: UTF-8 profiles: - active: dev + active: prod jackson: time-zone: GMT+8 @@ -45,6 +45,7 @@ security: - /sys-user-do/** # frobot屏幕操作 - /schedule/vehicle/** + - /schedule/setting/** - /task/** - /mapinfo/** - /security/** diff --git a/nl-web-app/src/main/resources/language/buss/buss.properties b/nl-web-app/src/main/resources/language/buss/buss.properties index 69d34f0..5275cca 100644 --- a/nl-web-app/src/main/resources/language/buss/buss.properties +++ b/nl-web-app/src/main/resources/language/buss/buss.properties @@ -9,6 +9,8 @@ password_error = 账号或密码错误 # 调度相关 schedule_speed_param_empty = 调度设置配送速度参数不能为空 schedule_charge_param_empty = 调度设置充电参数不能为空 +schedule_wifi_param_empty = 调度设置wifi参数不能为空 +schedule_wifi_param_error = 调度设置网络wifi操作失败 schedule_task_code_empty = 任务号不能为空 schedule_destinations_empty = 目标点不能为空 schedule_operation_type_empty = 任务操作类型不能为空 @@ -45,6 +47,7 @@ task_station_code_empty = 站号不能为空 task_report_not_arrived = 未上报到达点位,无法确认到达 task_confirm_arrival_failed = 任务到达确认失败 task_next_station_failed = 任务下一站失败:{0} +create_cruise_task_error = 任务类型不是巡航类型 # 异常信息相关 error_info = 异常信息 @@ -104,6 +107,7 @@ qrcode_id_empty = 二维码标识不能为空 qrcode_delete_file_failed = 删除二维码文件失败 qrcode_delete_failed = 删除二维码失败 qrcode_station_code_empty = 站号不能为空 +qrcode_create_failed_mode = 巡航模式中,无法下发任务 # 安全相关 security_password_error = 密码错误 diff --git a/nl-web-app/src/main/resources/language/buss/buss_en_US.properties b/nl-web-app/src/main/resources/language/buss/buss_en_US.properties index 98b9a20..b3d14e3 100644 --- a/nl-web-app/src/main/resources/language/buss/buss_en_US.properties +++ b/nl-web-app/src/main/resources/language/buss/buss_en_US.properties @@ -9,6 +9,8 @@ password_error = Wrong account or password # Schedule related schedule_speed_param_empty = Dispatch setting delivery speed parameter cannot be empty schedule_charge_param_empty = Dispatch setting charging parameter cannot be empty +schedule_wifi_param_empty = The wifi parameter set for scheduling cannot be empty +schedule_wifi_param_error = The scheduling network wifi operation failed schedule_task_code_empty = Task number cannot be empty schedule_destinations_empty = Destination cannot be empty schedule_operation_type_empty = Task operation type cannot be empty @@ -45,6 +47,7 @@ task_station_code_empty = Station code cannot be empty task_report_not_arrived = Not reported arrival location, unable to confirm arrival task_confirm_arrival_failed = Failed to confirm task arrival task_next_station_failed = Failed to go to next station:{0} +create_cruise_task_error = The mission type is not a cruise type # Anomaly related error_info = Anomaly information @@ -104,6 +107,7 @@ qrcode_id_empty = QR code ID cannot be empty qrcode_delete_file_failed = Failed to delete QR code file qrcode_delete_failed = Failed to delete QR code qrcode_station_code_empty = Station code cannot be empty +qrcode_create_failed_mode = In cruise mode, missions cannot be issued # Security related security_password_error = Password error diff --git a/nl-web-app/src/main/resources/language/buss/buss_zh_CN.properties b/nl-web-app/src/main/resources/language/buss/buss_zh_CN.properties index 69d34f0..5275cca 100644 --- a/nl-web-app/src/main/resources/language/buss/buss_zh_CN.properties +++ b/nl-web-app/src/main/resources/language/buss/buss_zh_CN.properties @@ -9,6 +9,8 @@ password_error = 账号或密码错误 # 调度相关 schedule_speed_param_empty = 调度设置配送速度参数不能为空 schedule_charge_param_empty = 调度设置充电参数不能为空 +schedule_wifi_param_empty = 调度设置wifi参数不能为空 +schedule_wifi_param_error = 调度设置网络wifi操作失败 schedule_task_code_empty = 任务号不能为空 schedule_destinations_empty = 目标点不能为空 schedule_operation_type_empty = 任务操作类型不能为空 @@ -45,6 +47,7 @@ task_station_code_empty = 站号不能为空 task_report_not_arrived = 未上报到达点位,无法确认到达 task_confirm_arrival_failed = 任务到达确认失败 task_next_station_failed = 任务下一站失败:{0} +create_cruise_task_error = 任务类型不是巡航类型 # 异常信息相关 error_info = 异常信息 @@ -104,6 +107,7 @@ qrcode_id_empty = 二维码标识不能为空 qrcode_delete_file_failed = 删除二维码文件失败 qrcode_delete_failed = 删除二维码失败 qrcode_station_code_empty = 站号不能为空 +qrcode_create_failed_mode = 巡航模式中,无法下发任务 # 安全相关 security_password_error = 密码错误 diff --git a/pom.xml b/pom.xml index 4d60669..7771eed 100644 --- a/pom.xml +++ b/pom.xml @@ -19,8 +19,8 @@ nl-business-task nl-business-map - - nl-business-media + + nl-business-externalApi nl-business-sys @@ -82,7 +82,7 @@ org.nl - nl-business-media + nl-business-externalApi ${nl.version}