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.R; import com.core.exception.CoolException; import com.zy.api.controller.params.ReceviceTaskParams; import com.zy.api.controller.params.WorkTaskParams; import com.zy.api.service.WcsApiService; import com.zy.asrs.entity.BasDevice; import com.zy.asrs.entity.LocAroundBind; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.service.BasDeviceService; import com.zy.asrs.service.LocAroundBindService; import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.WrkMastService; import com.zy.common.constant.MesConstant; import com.zy.common.utils.HttpHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @Service public class WcsApiServiceImpl implements WcsApiService { @Autowired private BasDeviceService basDeviceService; @Autowired private LocAroundBindService locAroundBindService; @Autowired private LocMastService locMastService; @Autowired private WrkMastService wrkMastService; /** * 通知WCS锁定库位,及禁止当前库位的一切操作 * @author Ryan * @date 2026/1/10 11:18 * @param params * @return com.core.common.R */ @Override @Transactional(rollbackFor = Exception.class) public R lockLocs(ReceviceTaskParams params) { BasDevice basDevice = basDeviceService.selectOne(new EntityWrapper() .eq("status", 1) .eq("dev_no", params.getDeviceNo())); if (Objects.isNull(basDevice)) { throw new CoolException("机台信息不存在或已禁用!!"); } List binds = locAroundBindService.selectList(new EntityWrapper().eq("dev_no", basDevice.getDevNo())); if (Objects.isNull(binds) || binds.isEmpty()) { throw new CoolException("机台未绑定工作站台!!"); } Set locs = binds.stream().map(LocAroundBind::getBLocNo).collect(Collectors.toSet()); reportLockLocs(locs, "lock"); return R.ok("上报成功!!"); } /** * 余料回库 (搬运余料回库) * @author Ryan * @date 2026/1/10 13:19 * @param params * @return com.core.common.R */ @Override @Transactional(rollbackFor = Exception.class) public R backLocs(WorkTaskParams params) { if (Objects.isNull(params.getTaskNo())) { throw new CoolException("工作号不能为空!!"); } String wrkCode = params.getTaskNo(); if (wrkCode.contains("-1")) { throw new CoolException("配对任务编码错误,请检查后重新上传!!"); } WrkMast mast = wrkMastService.selectOne(new EntityWrapper().eq("wrk_code", params.getTaskNo())); if (Objects.isNull(mast)) { throw new CoolException("任务不存在!!"); } if (!mast.getWrkSts().equals(103L)) { throw new CoolException("当前任务并非余料出库任务!!"); } mast.setWrkSts(53L); if (!wrkMastService.updateById(mast)) { throw new CoolException("任务状态更新失败!!"); } return R.ok("接收成功,执行回库中..."); } /** * 下发任务至WCS * @author Ryan * @date 2026/1/10 13:58 * @param params * @return com.core.common.R */ @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 = MesConstant.PUB_TASK_IN; if (Objects.isNull(params.getType()) && params.getType().equals("out")) { url = MesConstant.PUB_TASK_OUT; } String response; try { response = new HttpHandler.Builder() .setUri(MesConstant.URL) .setPath(url) .setJson(JSON.toJSONString(params)) .build() .doPost(); R result = JSON.parseObject(response, R.class); if (result.get("code").equals("200")) { //TODO 上报是否成功 } } catch (IOException e) { throw new RuntimeException(e); } return null; } /** * 上报锁定/释放库位信息 * @author Ryan * @date 2026/1/10 12:50 * @param locs */ @Override @Transactional(rollbackFor = Exception.class) public void reportLockLocs(Set locs, String type) { String url = MesConstant.LOCK_LOCS_URL; if (!Objects.isNull(type)) { if (type.equals("release")) { url = MesConstant.RELEASE_LOCS_URL; } } String response; try { response = new HttpHandler.Builder() .setUri(MesConstant.URL) .setPath(url) .setJson(JSON.toJSONString(locs)) .build() .doPost(); R result = JSON.parseObject(response, R.class); if (result.get("code").equals("200")) { //TODO 上报是否成功 } } catch (IOException e) { throw new RuntimeException(e); } } }