package com.zy.api.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; 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.WorkTaskParams; import com.zy.api.entity.dto.LocMastDto; import com.zy.api.service.WcsApiService; import com.zy.asrs.entity.*; import com.zy.asrs.service.*; import com.zy.asrs.service.impl.LocDetlServiceImpl; import com.zy.asrs.service.impl.MatServiceImpl; import com.zy.asrs.service.impl.WrkDetlServiceImpl; import com.zy.common.constant.MesConstant; import com.zy.common.utils.HttpHandler; import org.springframework.beans.BeanUtils; 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.*; import java.util.stream.Collectors; @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; /** * 通知WCS锁定库位,及禁止当前库位的一切操作 * * @param params * @return com.core.common.R * @author Ryan * @date 2026/1/10 11:18 */ @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("上报成功!!"); } // /** // * 余料回库 (搬运余料回库) // * // * @param params // * @return com.core.common.R // * @author Ryan // * @date 2026/1/10 13:19 // */ // @Override // @Transactional(rollbackFor = Exception.class) // public R backLocs(WorkTaskParams params) { // if (Objects.isNull(params.getWrkNo())) { // throw new CoolException("工作号不能为空!!"); // } //// String wrkCode = params.getTaskNo(); //// if (wrkCode.contains("-1")) { //// throw new CoolException("配对任务编码错误,请检查后重新上传!!"); //// } // WrkMast mast = wrkMastService.selectOne(new EntityWrapper().eq("wrk_no", params.getWrkNo())); // if (Objects.isNull(mast)) { // throw new CoolException("任务不存在!!"); // } //// if (!mast.getWrkSts().equals(103L)) { //// throw new CoolException("当前任务并非余料出库任务!!"); //// } //// if (params.getIsSuplus() == 1) { //// mast.setIsSuplus(1); //// } //// //// if (!wrkMastService.updateById(mast)) { //// throw new CoolException("任务状态更新失败!!"); //// } // workService.backLocOperation(mast.getWrkNo() + "", mast.getAppeUser()); // // return R.ok("接收成功,执行回库中..."); // } /** * 下发任务至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 = 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 R.ok(); } /** * 堆垛机执行状态上报 * * @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) { if (Objects.isNull(params.getWrkNo())) { throw new CoolException("WMS任务号不能为空!!"); } if (Objects.isNull(params.getNotifyType())) { throw new CoolException("动作类型不能为空!!"); } WrkMast mast = wrkMastService.selectOne(new EntityWrapper().eq("wrk_no", params.getWrkNo())); if (Objects.isNull(mast)) { throw new CoolException("任务档不存在!!"); } if (params.getNotifyType().equals("task")) { //任务 if (params.getMsgType().equals("task_complete")) { if (mast.getIoType() == 1) { mast.setWrkSts(4L); } else if (mast.getIoType() == 101) { mast.setWrkSts(14L); } if (!wrkMastService.updateById(mast)) { throw new CoolException("任务状态修改失败!!"); } } else if (params.getMsgType().equals("task_cancel")) { //todo 取消任务 } } return R.ok(); } /** * 獲取庫位信息 * @param params * @return */ @Override @Transactional(rollbackFor = Exception.class) public R getLocs(Map params) { String url = MesConstant.SYN_LOCS; String response; try { response = new HttpHandler.Builder() .setUri(MesConstant.WCS_URL) .setPath(url) .setJson(JSON.toJSONString(params)) .build() .doPost(); JSONObject jsonObject = JSONObject.parseObject(response); if (jsonObject.get("code").equals(200)) { List dtos = JSONArray.parseArray(jsonObject.get("data").toString(), LocMastDto.class); dtos.forEach(e -> { LocMast locMast = new LocMast(); BeanUtils.copyProperties(e, locMast); locMast.setRow1(e.getRow()); locMast.setLev1(e.getLev()); locMast.setBay1(e.getBay()); System.out.println(JSONObject.toJSON(locMast)); if (!locMastService.insert(locMast)) { throw new CoolException("库位保存失败!!"); } }); } } catch (IOException e) { throw new RuntimeException(e); } return R.ok(); } @Override public R getStations(Map params) { return null; } }