package com.zy.api.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.R; import com.core.exception.CoolException; import com.zy.api.controller.params.ReceviceTaskParams; import com.zy.api.controller.params.StopOutTaskParams; import com.zy.api.controller.params.WorkTaskParams; import com.zy.api.service.WcsApiService; import com.zy.asrs.entity.*; import com.zy.asrs.service.*; import com.zy.asrs.utils.Utils; import com.zy.common.constant.MesConstant; import com.zy.common.service.CommonService; import com.zy.common.utils.HttpHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Slf4j @Service public class WcsApiServiceImpl implements WcsApiService { @Autowired private LocMastService locMastService; @Autowired private WrkMastService wrkMastService; @Autowired private WorkService workService; @Autowired private WrkDetlService wrkDetlService; @Autowired private MatService matService; @Autowired private LocDetlService locDetlService; @Value("${wcs.switch}") private String switchValue; @Value("${wcs.address.URL}") private String wcs_address; @Value("${wcs.address.createOutTask}") private String getWcs_address; @Value("${wcs.address.createInTask}") private String createInTask; @Value("${wcs.address.createLocMoveTask}") private String createLocMoveTask; @Value("${wcs.address.stopOutTask}") private String stopOutTask; @Autowired private CommonService commonService; /** * 下发任务至WCS * * @param params * @return com.core.common.R * @author Ryan * @date 2026/1/10 13:58 */ @Override public R pubWrkToWcs(WorkTaskParams params) { if (Objects.isNull(params.getTaskNo())) { return R.error("任务号不能为空!!"); } if (Objects.isNull(params.getBarcode())) { return R.error("托盘码不能为空!!"); } if (Objects.isNull(params.getLocNo())) { return R.error("目标库位不能为空!!"); } String url = createInTask; if (!Objects.isNull(params.getType()) && params.getType().equals("out")) { url = getWcs_address; }else if (!Objects.isNull(params.getType()) && params.getType().equals("move")) { url = createLocMoveTask; } String response; R r = R.ok(); WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper().eq("wrk_no", params.getTaskNo())); if (!Objects.isNull(wrkMast) && "out".equalsIgnoreCase(params.getType()) && "Y".equalsIgnoreCase(wrkMast.getPauseMk())) { return R.error("task paused"); } try { log.info("下发搬运任务给wcs="+JSON.toJSONString(params)); response = new HttpHandler.Builder() .setUri(wcs_address) .setPath(url) .setJson(JSON.toJSONString(params)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); log.info("下发任务给wcs的返回值="+response); Integer code = jsonObject.getInteger("code"); if (code==200) { if (!Objects.isNull(wrkMast)) { if (wrkMast.getIoType()==1 || wrkMast.getIoType()==10) { wrkMast.setWrkSts(2L); wrkMast.setModiTime(new Date()); wrkMastService.updateById(wrkMast); }else if(wrkMast.getIoType()==2){ wrkMast.setWrkSts(2L); wrkMast.setModiTime(new Date()); wrkMastService.updateById(wrkMast); }else if (wrkMast.getIoType()==101 || wrkMast.getIoType()==110) { wrkMast.setWrkSts(12L); wrkMast.setModiTime(new Date()); wrkMastService.updateById(wrkMast); } } //TODO 上报是否成功 }else { r =R.error(); } } catch (IOException e) { throw new RuntimeException(e); } return r; } /** * 堆垛机执行状态上报 * * @param params * @return com.core.common.R * @author Ryan * @date 2026/1/10 16:30 */ @Override @Transactional(rollbackFor = Exception.class) public R receviceTaskFromWcs(ReceviceTaskParams params) { log.info("wcs任务反馈="+JSON.toJSONString(params)); if (Objects.isNull(params.getSuperTaskNo())) { throw new CoolException("WMS任务号不能为空!!"); } if (Objects.isNull(params.getNotifyType())) { throw new CoolException("动作类型不能为空!!"); } WrkMast mast = wrkMastService.selectOne(new EntityWrapper().eq("wrk_no", params.getSuperTaskNo())); if (Objects.isNull(mast)) { throw new CoolException("任务档不存在!!"); } if (params.getNotifyType().equals("task")) { //任务 if (params.getMsgType().equals("task_complete")) { if (mast.getIoType() == 1 || mast.getIoType() == 2 ||mast.getIoType() == 10) { mast.setWrkSts(4L); } else if ((mast.getIoType() == 101||mast.getIoType()==110) && mast.getWrkSts()<14) { mast.setWrkSts(14L); if(Cools.isEmpty(mast.getStaNo())){ mast.setOveMk("Y"); } } if (!wrkMastService.updateById(mast)) { throw new CoolException("任务状态修改失败!!"); } } else if (params.getMsgType().equals("task_cancel")) { if (mast.getIoType() != null && mast.getIoType() > 100 && mast.getWrkSts() < 14) { mast.setPauseMk("Y"); mast.setUpdMk("WCS_CANCELLED"); mast.setManuType("WCS_CANCELLED"); mast.setModiTime(new Date()); if (!wrkMastService.updateById(mast)) { throw new CoolException("task cancel update fail"); } } }else if (params.getMsgType().equals("task_arrive")) { //到达目的地 //如果出库任务是跨区则需要生成新的入库任务入库 if(!Cools.isEmpty(mast.getLocNo())){ mast.setOnlineYn("N");//等待生成跨区入库任务 } mast.setWrkSts(14L); if(Cools.isEmpty(mast.getStaNo())){ mast.setOveMk("Y"); } mast.setModiTime(new Date()); if (!wrkMastService.updateById(mast)) { throw new CoolException("任务状态修改失败!!"); } } } else if (params.getNotifyType().equals("weight")) { } return R.ok(); } @Override public R pauseOutTasks(StopOutTaskParams params) { if (params == null || params.getTasks() == null || params.getTasks().isEmpty()) { return R.ok("no tasks to stop"); } if (!Boolean.parseBoolean(String.valueOf(switchValue))) { return R.ok("wcs switch off"); } String response; try { response = new HttpHandler.Builder() .setUri(wcs_address) .setPath(stopOutTask) .setHttps(wcs_address != null && wcs_address.startsWith("https://")) .setTimeout(10, TimeUnit.SECONDS) .setJson(JSON.toJSONString(params)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response == null ? "{}" : response); Integer code = jsonObject.getInteger("code"); if (code == null || !Objects.equals(code, 200)) { String msg = jsonObject.getString("msg"); throw new CoolException(Cools.isEmpty(msg) ? "WCS stop out task failed" : msg); } } catch (IOException e) { throw new CoolException("call WCS stop out task fail: " + e.getMessage()); } return R.ok(); } }