package com.zy.asrs.wms.apis.wcs.controller; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.framework.common.R; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wms.apis.wcs.entity.request.ContainerArrivedParam; import com.zy.asrs.wms.apis.wcs.entity.request.RfidSingalRequest; import com.zy.asrs.wms.apis.wcs.entity.request.TasksStatusCallbackParam; import com.zy.asrs.wms.apis.wcs.services.WcsApiService; import com.zy.asrs.wms.asrs.entity.CacheSite; import com.zy.asrs.wms.asrs.entity.Task; import com.zy.asrs.wms.asrs.entity.WaveSeed; import com.zy.asrs.wms.asrs.entity.param.BindPlatformParam; import com.zy.asrs.wms.asrs.service.CacheSiteService; import com.zy.asrs.wms.asrs.service.PlatformService; import com.zy.asrs.wms.asrs.service.TaskService; import com.zy.asrs.wms.asrs.service.WaveSeedService; import com.zy.asrs.wms.asrs.service.impl.WaveSeedServiceImpl; import com.zy.asrs.wms.system.controller.BaseController; import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @Slf4j @RestController @RequestMapping("/out/stock/") public class OutStockController extends BaseController { @Autowired private WcsApiService wcsApiService; @Autowired private PlatformService platformService; @Resource private CacheSiteService cacheSiteService; @Resource private TaskService taskService; @Autowired private WaveSeedService waveSeedService; /** * 出库任务-接收回调状态接口 * @param callbackParam * @return */ @PostMapping("/receive/tasks/status") public R receiveTaskStatus(@RequestBody TasksStatusCallbackParam callbackParam) { if (!StringUtil.isNullOrEmpty(callbackParam.getEventType())) { if (StringUtil.isNullOrEmpty(callbackParam.getContainerCode())) { return R.error("容器编码不能为空!!"); } if (StringUtil.isNullOrEmpty(callbackParam.getTaskCode())) { return R.error("任务编码不能为空!!"); } wcsApiService.receiveTaskStatus(callbackParam, "outStock", getHostId()); } else { return R.error("上报事件类型不能为空!!"); } return R.success(); } /*** * 容器到达接收 * @param arrivedParam * @return */ @PostMapping("/container/arrived") public R containerArrivedNotify(@RequestBody ContainerArrivedParam arrivedParam) { if (StringUtil.isNullOrEmpty(arrivedParam.getContainerCode())) { return R.error("容器编码不能为空!!"); } if (StringUtil.isNullOrEmpty(arrivedParam.getSlotCode())) { return R.error("输送线节点编码不能为空!!"); } return wcsApiService.containerArrivedNotify(arrivedParam, "outStock", getHostId()); } /** * ESS 播种墙拍灯回调 * 播种墙拍灯,ESS调用 */ @PostMapping("/light/off") public R lightOff(@RequestBody Map request) { if (Objects.isNull(request)) { throw new CoolException("参数不能为空!!"); } if (Objects.isNull(request.get("tagCode"))) { throw new CoolException("电子标签编号不能为空!!"); } if (Objects.isNull(request.get("eventCode"))){ throw new CoolException("事件名称不能为空!!"); } log.info("播种墙拍灯,请求参数:{}", JSONObject.toJSONString(request)); // 根据站点编码查播种站点信息 CacheSite cacheSite = cacheSiteService.getOne(new LambdaQueryWrapper().eq(CacheSite::getSiteNo, request.get("tagCode"))); if (Objects.isNull(cacheSite)) { throw new CoolException("当前站点不存在!!"); } WaveSeed waveSeed = waveSeedService.getOne(new LambdaQueryWrapper() .eq(WaveSeed::getExceStatus, 1) .eq(WaveSeed::getSiteNo, request.get("tagCode").toString()), false); if (Objects.isNull(waveSeed)) { throw new CoolException("播种墙地标未绑定!!"); } // 根据播种站点信息条码,查任务 Task task = taskService.getOne(new LambdaQueryWrapper().eq(Task::getId, waveSeed.getTaskId())); if (Objects.isNull(task)) { throw new CoolException("当前站点任务不存在!!"); } Map param = new HashMap<>(); param.put("taskNo", task.getTaskNo()); param.put("siteNo", cacheSite.getSiteNo()); param.put("weedId", waveSeed.getId()); param.put("orderNo",cacheSite.getOrderNo()); waveSeed.setExceStatus(0); if (!waveSeedService.updateById(waveSeed)) { throw new CoolException("播种状态修改失败!!"); } return wcsApiService.slapLightLogic(param); } /** * 容器流动通知(当前物料播种完成) * //fixme 此接口将不再单独调用 * 1. 更新当前任务物料信息 * 2. * @param code 容器编码 * @return */ @GetMapping("/container/converyor/{code}") public R containerConveyor(@PathVariable String code) throws Exception { if (StringUtil.isNullOrEmpty(code)) { return R.error("容器编码不能为空!!!"); } return wcsApiService.containerConveryor(code); } /** * 发送命令给电子标签,可以控制电子标签亮灯颜色及灭灯等。 * * 1. 判断当前容器是否还有物料未拣,未拣完闪灯,拣完通知容器流动,并灭灯 * 2. 容器流动判断,如果料箱没有物料 code传200, 有物料传100 执行回库任务, IOTYP = 4 * * @param request * @return */ @PostMapping("/slap/light") public R slapLightLogic(@RequestBody Map request) { if (Objects.isNull(request)) { throw new CoolException("参数不能为空!!"); } if (Objects.isNull(request.get("taskNo"))) { throw new CoolException("任务号不能为空!!"); } if (Objects.isNull(request.get("orderNo"))){ throw new CoolException("当前任务订单号不能为空!!"); } return wcsApiService.slapLightLogic(request); } /** * 信号回传接口,回传电子标签状态变化内容给上游系统。 * 当人为操作(比如拍灯,更改数字,放箱等)导致电子标签的状态和信号等发生变化、或设备本身发生异常时,ESS接收到信号后,通过该接口将信号回传给上游系统。 * RFID回调接口 * @param request * @return */ @PostMapping("/") public R rfidCallback(@RequestBody RfidSingalRequest request) { if (Objects.isNull(request)) { throw new CoolException("参数不能为空!!"); } return wcsApiService.rfidCallback(request); } /** * 获取所有集货区 * @return */ @GetMapping("/all/platforms") public R getPlatforms() { return wcsApiService.getPlatforms(); } // /** // * 绑定订单与集货区关系 // * @param platform // * @return // */ // @PostMapping("/bind/shipping/platform") // public R bindShippingAndPlatform(@RequestBody BindPlatformParam platform) { // return platformService.bindShippingPlatform(platform); // } // }