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<WrkMast>().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<WrkMast>().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();
|
}
|
|
}
|