zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/OpenController.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.framework.common.R; import com.zy.asrs.framework.common.SnowflakeIdWorker; import com.zy.asrs.wcs.core.domain.param.CreateInTaskParam; import com.zy.asrs.wcs.core.domain.param.CreateManualTakeTaskParam; import com.zy.asrs.wcs.core.domain.param.CreateMoveTaskParam; import com.zy.asrs.wcs.core.domain.param.CreateOutTaskParam; @@ -49,6 +50,57 @@ @Autowired private LocService locService; //生成入库任务 @PostMapping("/createInTask") public R createInTask(@RequestBody CreateInTaskParam param) { //获取入库任务类型 TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>() .eq(TaskCtg::getFlag, "IN") .eq(TaskCtg::getStatus, 1)); if (taskCtg == null) { return R.error("任务类型异常"); } Loc loc = locService.selectByLocNo(param.getDestLoc()); if (loc == null) { return R.error("库位号不存在"); } if (!loc.getLocStsFlag().equals("O")) { return R.error("库位状态不满足入库条件"); } //优先级 Integer priority = 10; if (param.getPriority() != null) { priority = param.getPriority(); } Task task = new Task(); task.setUuid(String.valueOf(snowflakeIdWorker.nextId())); task.setTaskNo(String.valueOf(Utils.getTaskNo("IN"))); task.setTaskSts(TaskStsType.NEW_INBOUND.sts); task.setTaskCtg(taskCtg.getId()); task.setPriority(priority); task.setOriginSite(param.getOriginSite()); task.setOriginLoc(null); task.setDestSite(param.getDestSite()); task.setDestLoc(param.getDestLoc()); task.setIoTime(new Date()); task.setStartTime(new Date()); task.setStatus(1); task.setMemo(""); task.setShuttleNo(null);//等待主线程分配小车 task.setRecordLoc("Y");//记录库存信息 task.setHostId(1L);//临时控制只允许host为1 boolean result = taskService.save(task); if (!result) { return R.error("生成入库任务失败!"); } return R.ok(); } //生成出库任务 @PostMapping("/createOutTask") public R createOutTask(@RequestBody CreateOutTaskParam param) { @@ -69,12 +121,18 @@ return R.error("库位状态不满足出库条件"); } //优先级 Integer priority = 10; if (param.getPriority() != null) { priority = param.getPriority(); } Task task = new Task(); task.setUuid(String.valueOf(snowflakeIdWorker.nextId())); task.setTaskNo(String.valueOf(Utils.getTaskNo("OUT"))); task.setTaskSts(TaskStsType.NEW_OUTBOUND.sts); task.setTaskCtg(taskCtg.getId()); task.setPriority(10); task.setPriority(priority); task.setOriginSite(param.getOriginSite()); task.setOriginLoc(param.getOriginLoc()); task.setDestSite(param.getDestSite()); @@ -105,12 +163,18 @@ return R.error("任务类型异常"); } //优先级 Integer priority = 10; if (param.getPriority() != null) { priority = param.getPriority(); } Task task = new Task(); task.setUuid(String.valueOf(snowflakeIdWorker.nextId())); task.setTaskNo(String.valueOf(Utils.getTaskNo("OUT"))); task.setTaskSts(TaskStsType.NEW_MANUAL.sts); task.setTaskCtg(taskCtg.getId()); task.setPriority(10); task.setPriority(priority); task.setOriginSite(null); task.setOriginLoc(param.getOriginLoc());//源库位 task.setDestSite(null); @@ -158,12 +222,18 @@ return R.error("穿梭车和目标位置不在同一楼层"); } //优先级 Integer priority = 10; if (param.getPriority() != null) { priority = param.getPriority(); } Task task = new Task(); task.setUuid(String.valueOf(snowflakeIdWorker.nextId())); task.setTaskNo(String.valueOf(Utils.getTaskNo("OUT"))); task.setTaskSts(TaskStsType.NEW_MOVE.sts); task.setTaskCtg(taskCtg.getId()); task.setPriority(10); task.setPriority(priority); task.setOriginSite(null); task.setOriginLoc(null); task.setDestSite(param.getDestSite()); zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/CreateInTaskParam.java
New file @@ -0,0 +1,20 @@ package com.zy.asrs.wcs.core.domain.param; import lombok.Data; @Data public class CreateInTaskParam { //入库库位 private String destLoc; //源站 private String originSite; //目标站 private String destSite; //优先级 private Integer priority; } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/CreateManualTakeTaskParam.java
@@ -14,4 +14,7 @@ //是否记录库存信息 private Boolean record; //优先级 private Integer priority; } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/CreateMoveTaskParam.java
@@ -11,4 +11,7 @@ //目标库位 private String destSite; //优先级 private Integer priority; } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/CreateOutTaskParam.java
@@ -14,4 +14,7 @@ //目标站 private String destSite; //优先级 private Integer priority; } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/task/ShuttlePowerEarlyWarning.java
New file @@ -0,0 +1,117 @@ package com.zy.asrs.wcs.core.task; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.common.utils.HttpHandler; import com.zy.asrs.wcs.core.model.enums.DeviceCtgType; import com.zy.asrs.wcs.rcs.cache.SlaveConnection; import com.zy.asrs.wcs.rcs.entity.Device; import com.zy.asrs.wcs.rcs.model.enums.SlaveType; import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; import com.zy.asrs.wcs.rcs.service.DeviceService; import com.zy.asrs.wcs.rcs.thread.ShuttleThread; import com.zy.asrs.wcs.system.entity.Dict; import com.zy.asrs.wcs.system.service.DictService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; /** * 小车电量预警检测 => 强制预警 */ @Component @Slf4j public class ShuttlePowerEarlyWarning { @Autowired private DictService dictService; @Autowired private DeviceService deviceService; /** * 小车电量预警检测 => 强制预警 * 每30分钟扫描一次 */ @Scheduled(cron = "0 30 * * * ? ") public synchronized void shuttlePowerEarlyWarning() { Dict dict = dictService.getOne(new LambdaQueryWrapper<Dict>().eq(Dict::getFlag, "dingdingReportUrl")); if (dict == null) { return; } if (dict.getStatus() == 0) { return;//通知禁用 } //小车电量预警阈值 int shuttlePowerEarlyValue = 20;//默认20 Dict shuttlePowerEarlyConfig = dictService.getOne(new LambdaQueryWrapper<Dict>().eq(Dict::getFlag, "shuttlePowerEarlyValue")); if (shuttlePowerEarlyConfig != null) { shuttlePowerEarlyValue = Integer.parseInt(shuttlePowerEarlyConfig.getValue()); } String title = "【通知】四向库"; Dict shuttlePowerEarlyTitle = dictService.getOne(new LambdaQueryWrapper<Dict>().eq(Dict::getFlag, "shuttlePowerEarlyTitle")); if (shuttlePowerEarlyTitle != null) { title = shuttlePowerEarlyTitle.getValue(); } StringBuffer buffer = new StringBuffer(); buffer.append(title); buffer.append("\n");//消息标题 boolean hasReport = false;//是否有需要报告的数据 List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>() .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val()) .eq(Device::getStatus, 1)); for (Device device : list) { //获取四向穿梭车线程 ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue()); if (shuttleThread == null) { continue; } ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); if (shuttleProtocol == null) { continue; } if (shuttleProtocol.getHasCharge()) { continue;//充电中,无需通知 } if (Double.parseDouble(shuttleProtocol.getBatteryPower()) < shuttlePowerEarlyValue) { buffer.append(shuttleProtocol.getShuttleNo()).append("号小车,电量").append(shuttleProtocol.getBatteryPower()).append(",请注意。\n"); hasReport = true; } } if (hasReport) { try { HashMap<String, Object> param = new HashMap<>(); HashMap<String, Object> data = new HashMap<>(); data.put("content", buffer.toString()); param.put("msgtype", "text"); param.put("text", data); String response = new HttpHandler.Builder() .setUri(dict.getValue()) .setJson(JSON.toJSONString(param)) .setHttps(true) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.get("errmsg").equals("ok")) { return;//发送成功 } } catch (Exception e) { e.printStackTrace(); } } } }