zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/controller/OutStockController.java
@@ -121,7 +121,7 @@ * @return */ @GetMapping("/container/converyor/{code}") public R containerConveyor(@PathVariable String code) { public R containerConveyor(@PathVariable String code) throws Exception { if (StringUtil.isNullOrEmpty(code)) { return R.error("容器编码不能为空!!!"); } @@ -150,9 +150,7 @@ throw new CoolException("当前任务订单号不能为空!!"); } wcsApiService.slapLightLogic(request); return R.ok(); return wcsApiService.slapLightLogic(request); } zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/controller/WaveManagentController.java
@@ -8,15 +8,22 @@ import com.zy.asrs.wms.apis.wcs.services.WaveManagentService; import com.zy.asrs.wms.asrs.entity.param.WaveSeedReviewParam; import com.zy.asrs.wms.system.controller.BaseController; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Map; import java.util.Objects; import static com.zy.asrs.wms.utils.HttpUtils.getClientIpAddress; /** * 大屏操作基本功能 */ @Slf4j @RestController @RequestMapping("/wave") public class WaveManagentController extends BaseController { @@ -74,7 +81,8 @@ */ @GetMapping("/seed/locs") public R getSeedLoc() { return waveManagentService.AllSeedLocs(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); return waveManagentService.AllSeedLocs(request); } /*** zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/Impl/WaveManagentServiceImpl.java
@@ -7,6 +7,7 @@ import com.zy.asrs.wms.apis.wcs.entity.domain.WaveTaskDetl; import com.zy.asrs.wms.apis.wcs.entity.response.SowSeeds; import com.zy.asrs.wms.apis.wcs.services.WaveManagentService; import com.zy.asrs.wms.apis.wcs.utils.HttpEssUtils; import com.zy.asrs.wms.asrs.entity.*; import com.zy.asrs.wms.asrs.entity.dto.LargeScreenTaskDto; import com.zy.asrs.wms.asrs.entity.enums.OrderPickStatus; @@ -15,15 +16,16 @@ import com.zy.asrs.wms.asrs.mapper.*; import com.zy.asrs.wms.asrs.service.TaskService; import com.zy.asrs.wms.asrs.service.WaveSeedService; import org.aspectj.weaver.ast.Or; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.ArrayList; import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.stream.Collectors; import static com.zy.asrs.wms.utils.HttpUtils.getClientIpAddress; @Slf4j @Service public class WaveManagentServiceImpl implements WaveManagentService { @Autowired @@ -121,8 +123,15 @@ * @return */ @Override public R AllSeedLocs() { List<CacheSite> cacheSites = cacheSiteMapper.selectList(new LambdaQueryWrapper<CacheSite>()); public R AllSeedLocs(HttpServletRequest request) { log.info("ip地址====>: {}", getClientIpAddress(request)); String locIp = getClientIpAddress(request); List<CacheSite> cacheSites; if (locIp.equals(HttpEssUtils.S2_SITE_NO)) { cacheSites = cacheSiteMapper.selectList(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getChannel, "S2")); } else { cacheSites = cacheSiteMapper.selectList(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getChannel, "S1")); } if (cacheSites.isEmpty()) { return R.error("当前播种墙信息未设置!!"); } zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/Impl/WcsApiServiceImpl.java
@@ -4,10 +4,6 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.cfg.CoercionAction; import com.fasterxml.jackson.databind.cfg.CoercionInputShape; import com.zy.asrs.framework.common.R; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wms.apis.wcs.entity.domain.SystemProperties; @@ -23,8 +19,6 @@ import com.zy.asrs.wms.asrs.service.*; import io.jsonwebtoken.lang.Collections; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -37,7 +31,6 @@ import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -124,8 +117,12 @@ List<TaskDetl> taskDetlByTaskId = taskDetlService.getTaskDetlByTaskId(task.getId()); double sum = taskDetlByTaskId.stream().mapToDouble(TaskDetl::getAnfme).sum(); SlapLightControlParam slapLightControlParam = new SlapLightControlParam(); slapLightControlParam.setControllerCode(cacheSite.getMemo()).setTagCode(cacheSite.getSiteNo()) .setColor("GREEN").setMode("LIGHT").setDisplay(String.valueOf(sum)); slapLightControlParam .setControllerCode(cacheSite.getMemo()) .setTagCode(cacheSite.getSiteNo()) .setColor("GREEN") .setMode("LIGHT") .setDisplay(String.valueOf(sum)); // 发起亮灯请求 log.info("任务{}到达拣选位,播种墙亮灯下发",task.getTaskNo(), JSONObject.toJSONString(slapLightControlParam)); CommonReponse response = HttpEssUtils.post("到达拣选位,播种墙亮灯", HttpEssUtils.PLT_SEND_COMMAND, slapLightControlParam); @@ -277,62 +274,53 @@ * @return */ @Override public synchronized R containerConveryor(String code) { List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, code)); if (tasks.isEmpty()) { return R.error("容器码任务不存在!!"); } else if (tasks.size() > 1) { return R.error("容器码任务错误!!"); } tasks.forEach(task -> { try { ConveyorStarParam conveyorStarParam = new ConveyorStarParam(); conveyorStarParam.setSlotCode(task.getOriginSite()) .setContainerCode(task.getBarcode()); if (task.getTaskType() == 101) { //任务类型为101全盘出库,直接取下容器,传200 conveyorStarParam.setDirection("200"); } else if (task.getTaskType() == 103 || task.getTaskType() == 107) { //如果为任务类型为103,需走回库操作,传100 conveyorStarParam.setDirection("100"); } //调用三方接口,将任务推送至ESS平台 MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); // 设置请求参数 HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("api-version", "v2.0"); HttpEntity httpEntity = new HttpEntity<>(conveyorStarParam, headers); log.info("请求地址:{},请求参数:{}", HttpEssUtils.CONVEYOR_START, JSONObject.toJSONString(conveyorStarParam)); ResponseEntity<String> exchange = restTemplate.exchange("http://192.168.2.200:9046/conveyor/moveContainer", HttpMethod.POST, httpEntity, String.class); // HttpHeaders headers = new HttpHeaders(); // headers.add("Content-Type", "application/json"); // HttpEntity httpEntity = new HttpEntity<>(params, headers); // // 请求 // ResponseEntity<String> exchange = restTemplate.exchange(HttpEssUtils.CONVEYOR_START, HttpMethod.POST, httpEntity, String.class); log.info("下发流动通知 返回结果:{}", exchange); if (exchange.getBody() == null) { throw new CoolException("下发流动通知失败!!"); } else { CommonReponse commonReponse = JSON.toJavaObject(JSON.parseObject(exchange.getBody()), CommonReponse.class); if (commonReponse.getCode() == 0) { //流动通知下发完成后,修改任务状态为输送线流动中。。 if (task.getTaskType() == 103 || task.getTaskType() == 107) { //更新库存信息,修改任务状态为4 (RCS容器流动任务已下发) workService.pickTask(task.getId()); // taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getId, task.getId()).set(Task::getTaskSts, TaskStsType.WCS_CONVEYOR_START)) } else { taskService.update(new LambdaUpdateWrapper<Task>() .eq(Task::getId, task.getId()) .set(Task::getTaskSts, TaskStsType.COMPLETE_OUT.id)); } log.info(task.getTaskNo() + "下发流动通知" + commonReponse.getMsg()); } else { throw new CoolException("下发流动通知失败!!"); } } } catch (Exception ex) { log.error(ex.getMessage()); @Transactional(rollbackFor = Exception.class) public synchronized R containerConveryor(String code) throws Exception{ Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, code)); if (Objects.isNull(task)) { throw new CoolException("容器码任务不存在!!"); } try { ConveyorStarParam conveyorStarParam = new ConveyorStarParam(); conveyorStarParam.setSlotCode(task.getOriginSite()) .setContainerCode(task.getBarcode()); if (task.getTaskType() == 101) { //任务类型为101全盘出库,直接取下容器,传200 conveyorStarParam.setDirection("200"); } else if (task.getTaskType() == 103 || task.getTaskType() == 107) { //如果为任务类型为103,需走回库操作,传100 conveyorStarParam.setDirection("100"); } }); //调用三方接口,将任务推送至ESS平台 MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); // 设置请求参数 HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("api-version", "v2.0"); HttpEntity httpEntity = new HttpEntity<>(conveyorStarParam, headers); log.info("请求地址:{},请求参数:{}", HttpEssUtils.CONVEYOR_START, JSONObject.toJSONString(conveyorStarParam)); ResponseEntity<String> exchange = restTemplate.exchange("http://192.168.2.200:9046/conveyor/moveContainer", HttpMethod.POST, httpEntity, String.class); log.info("下发流动通知 返回结果:{}", exchange); if (exchange.getBody() == null) { throw new CoolException("下发流动通知失败!!"); } else { CommonReponse commonReponse = JSON.toJavaObject(JSON.parseObject(exchange.getBody()), CommonReponse.class); if (commonReponse.getCode() == 0) { //流动通知下发完成后,修改任务状态为输送线流动中。。 if (task.getTaskType() == 103 || task.getTaskType() == 107) { //更新库存信息,修改任务状态为4 (RCS容器流动任务已下发) workService.pickTask(task.getId()); } else { taskService.update(new LambdaUpdateWrapper<Task>() .eq(Task::getId, task.getId()) .set(Task::getTaskSts, TaskStsType.COMPLETE_OUT.id)); } log.info(task.getTaskNo() + "下发流动通知" + commonReponse.getMsg()); } else { throw new CoolException("下发流动通知失败!!"); } } } catch (Exception ex) { log.error("UNK", ex); } return R.ok(); } @@ -351,10 +339,11 @@ * 拍灯拣料逻辑,详细说明见接口调用说明 * * @param request * @return */ @Override @Transactional(rollbackFor = Exception.class) public void slapLightLogic(Map<String, Object> request) { public R slapLightLogic(Map<String, Object> request) { String taskNo = request.get("taskNo").toString(); String orderNo = request.get("orderNo").toString(); @@ -366,19 +355,17 @@ //* 1. 判断当前容器是否还有物料未拣,未拣完闪灯,拣完通知容器流动,并灭灯 SlapLightControlParam slapParam = new SlapLightControlParam(); MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); //默认流动 boolean converyor = false; //判断当前任务是否还有物料未拣 if (!checked(orderNo, taskNo)) { log.info("未完成闪灯请求地址:{},请求参数:{}", SystemProperties.SLAP_LIGHT, JSONObject.toJSONString(slapParam)); //调用三方接口,闪灯不做操作 // 设置请求参数 params.add("params", JSONObject.toJSONString(slapParam)); log.info("未完成闪灯请求地址:{},请求参数:{}", SystemProperties.SLAP_LIGHT, JSONObject.toJSONString(slapParam)); throw new CoolException("当前任务未完成,不能执行此操作!!"); // params.add("params", JSONObject.toJSONString(slapParam)); } else { //调用三方接口,灭灯通知容器流动, 传灭灯参数 //todo 判断当前订单是否完成,完成灭灯,未完成保持拣货状态亮灯 Order one = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderNo)); if (Objects.isNull(one)) { throw new CoolException("当前订单明细不存在!!"); } @@ -406,36 +393,22 @@ } } } converyor = true; params.add("params", JSONObject.toJSONString(slapParam)); log.info("完成灭灯请求地址:{},请求参数:{}", SystemProperties.SLAP_LIGHT, JSONObject.toJSONString(slapParam)); } if (converyor) { Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskNo, request.get("taskNo"))); if (Objects.isNull(task)) { throw new CoolException("任务不存在!!"); } Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskNo, request.get("taskNo"))); if (Objects.isNull(task)) { throw new CoolException("任务不存在!!"); } try { containerConveryor(task.getBarcode()); } catch (Exception e) { log.error("执行异常:UNK", e); throw new CoolException(e.getMessage()); } // HttpHeaders headers = new HttpHeaders(); // headers.add("Content-Type", "application/json"); // HttpEntity httpEntity = new HttpEntity<>(params, headers); // // 请求 // ResponseEntity<CommonReponse> exchange = restTemplate.exchange(SystemProperties.CONVEYOR_START, HttpMethod.POST, httpEntity, CommonReponse.class); // log.info("下发流动通知 返回结果:{}", exchange); // if (exchange.getBody() == null) { // throw new CoolException("下发流动通知失败!!"); // } else { // CommonReponse response = exchange.getBody(); // if (response.getCode() == 0) { // if (!converyor) { // //* 2. 容器流动判断,如果料箱没有物料 code传200, 有物料传100 执行回库任务,修改任务状态为 调用containerConveryor(taskNo)方法 // containerConveryor(request.get("taskNo").toString()); // } // } // } return R.ok(); } /** zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/WaveManagentService.java
@@ -4,6 +4,8 @@ import com.zy.asrs.framework.common.R; import com.zy.asrs.wms.asrs.entity.param.WaveSeedReviewParam; import javax.servlet.http.HttpServletRequest; public interface WaveManagentService { R getSowSeeds(); @@ -19,5 +21,5 @@ R getAllOrders(String waveNo); R AllSeedLocs(); R AllSeedLocs(HttpServletRequest request); } zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/WcsApiService.java
@@ -13,9 +13,9 @@ void receiveTaskStatus(TasksStatusCallbackParam callbackParam, String stockType, Long hostId); R containerConveryor(String code); R containerConveryor(String code) throws Exception; void slapLightLogic(Map<String, Object> request); R slapLightLogic(Map<String, Object> request); R rfidCallback(RfidSingalRequest request); zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/utils/HttpEssUtils.java
@@ -27,6 +27,8 @@ */ public static final String baseUrl = "http://192.168.2.200:9046"; public static final String S2_SITE_NO = "192.168.2.42"; /** * 请求头 */ zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java
@@ -531,39 +531,6 @@ } }); Set<Long> waveIds = orderList.stream().map(Order::getWaveId).collect(Collectors.toSet()); if (waveIds.isEmpty()) { throw new CoolException("波次信息为空!!"); } List<Wave> waves = waveService.list(new LambdaQueryWrapper<Wave>().in(Wave::getId, waveIds)); for (Wave wave : waves) { WaveLog waveLog = new WaveLog(); waveLog.sync(wave); waveLog.setId(null); if (!waveLogService.save(waveLog)) { throw new CoolException("波次转历史失败"); } List<WaveDetl> waveDetls = waveDetlService.list(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getWaveId, wave.getId())); for (WaveDetl waveDetl : waveDetls) { WaveDetlLog waveDetlLog = new WaveDetlLog(); waveDetlLog.sync(waveDetl); waveDetlLog.setId(null); waveDetlLog.setWaveId(waveLog.getId()); if (!waveDetlLogService.save(waveDetlLog)) { throw new CoolException("波次明细转历史失败"); } if (!waveDetlService.removeById(waveDetl.getId())) { throw new CoolException("波次明细删除失败"); } } if (!waveService.removeById(wave.getId())) { throw new CoolException("波次删除失败"); } } Set<Long> ordersSet = orderList.stream().map(Order::getId).collect(Collectors.toSet()); List<PlatformDetl> platDetls = platformDetlService.list(new LambdaQueryWrapper<PlatformDetl>().in(PlatformDetl::getOrderId, ordersSet)); if (platDetls.isEmpty()) { zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/PlatformServiceImpl.java
@@ -200,7 +200,10 @@ platformDetl.setPlatformId(pl.getId()); platformDetl.setPlatformNo(pl.getPlatformNo()); List<PlatformDetl> list = platformDetlService.list(new LambdaQueryWrapper<PlatformDetl>().eq(PlatformDetl::getTaskDetlId, waveSeed.getTaskDetlId()).eq(PlatformDetl::getOrderDetlId, waveSeed.getOrderDetlId()).eq(PlatformDetl::getMatnr, waveSeed.getMatnr())); List<PlatformDetl> list = platformDetlService.list(new LambdaQueryWrapper<PlatformDetl>() .eq(PlatformDetl::getTaskDetlId, waveSeed.getTaskDetlId()) .eq(PlatformDetl::getOrderDetlId, waveSeed.getOrderDetlId()) .eq(PlatformDetl::getMatnr, waveSeed.getMatnr())); if (!list.isEmpty()) { throw new CoolException("订单已入集货区!!"); } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
@@ -422,6 +422,11 @@ } } } } /** zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java
@@ -10,6 +10,10 @@ import com.zy.asrs.wms.asrs.entity.enums.OrderSettleType; import com.zy.asrs.wms.asrs.entity.enums.TaskStsType; import com.zy.asrs.wms.asrs.service.*; import com.zy.asrs.wms.asrs.service.impl.WaveDetlLogServiceImpl; import com.zy.asrs.wms.asrs.service.impl.WaveDetlServiceImpl; import com.zy.asrs.wms.asrs.service.impl.WaveLogServiceImpl; import com.zy.asrs.wms.asrs.service.impl.WaveServiceImpl; import com.zy.asrs.wms.system.entity.Dict; import com.zy.asrs.wms.system.service.DictService; import com.zy.asrs.wms.utils.OrderUtils; @@ -42,6 +46,69 @@ private WaveSeedService waveSeedService; @Autowired private DictService dictService; @Autowired private WaveServiceImpl waveService; @Autowired private WaveLogServiceImpl waveLogService; @Autowired private WaveDetlServiceImpl waveDetlService; @Autowired private WaveDetlLogServiceImpl waveDetlLogService; /** * @author Ryan * @date 2025/6/20 * @description: 波次加入历史档 * @version 1.0 */ @Scheduled(cron = "0/30 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void addWaveHistories() { List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.COMPLETE_OUT.id)); if (tasks.isEmpty()) { return; } for (Task task : tasks) { List<TaskDetl> detls = taskDetlService.list(new LambdaQueryWrapper<TaskDetl>().eq(TaskDetl::getTaskId, task.getId())); if (detls.isEmpty()) { continue; } Set<Long> waveIds = detls.stream().map(TaskDetl::getWaveId).collect(Collectors.toSet()); if (waveIds.isEmpty()) { throw new CoolException("波次信息为空!!"); } List<Wave> waves = waveService.list(new LambdaQueryWrapper<Wave>().in(Wave::getId, waveIds)); for (Wave wave : waves) { WaveLog waveLog = new WaveLog(); waveLog.sync(wave); waveLog.setId(null); if (!waveLogService.save(waveLog)) { throw new CoolException("波次转历史失败"); } List<WaveDetl> waveDetls = waveDetlService.list(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getWaveId, wave.getId())); for (WaveDetl waveDetl : waveDetls) { WaveDetlLog waveDetlLog = new WaveDetlLog(); waveDetlLog.sync(waveDetl); waveDetlLog.setId(null); waveDetlLog.setWaveId(waveLog.getId()); if (!waveDetlLogService.save(waveDetlLog)) { throw new CoolException("波次明细转历史失败"); } if (!waveDetlService.removeById(waveDetl.getId())) { throw new CoolException("波次明细删除失败"); } } if (!waveService.removeById(wave.getId())) { throw new CoolException("波次删除失败"); } } } } /** * modifty: zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/HttpUtils.java
@@ -3,6 +3,7 @@ import com.alibaba.fastjson.JSON; import com.zy.asrs.framework.common.R; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @@ -23,4 +24,30 @@ } } public static String getClientIpAddress(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 if (ip != null && ip.contains(",")) { ip = ip.split(",")[0].trim(); } return ip; } }