package com.zy.asrs.service.impl;
|
|
import com.alibaba.excel.util.DateUtils;
|
import com.alibaba.excel.util.StringUtils;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.core.common.R;
|
import com.core.common.SnowflakeIdWorker;
|
import com.core.exception.CoolException;
|
import com.zy.asrs.entity.*;
|
import com.zy.asrs.entity.mes.*;
|
import com.zy.asrs.entity.param.CombParam;
|
import com.zy.asrs.entity.rcs.*;
|
import com.zy.asrs.mapper.AgvInfoMapper;
|
import com.zy.asrs.service.*;
|
import com.zy.common.model.enums.WorkNoType;
|
import com.zy.common.service.CommonService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.text.ParseException;
|
import java.time.OffsetDateTime;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
@Slf4j
|
@Service
|
public class MesServiceImpl implements MesService {
|
|
@Value("${mes.url}")
|
public String MES_URL;
|
@Value("${dj.url}")
|
public String DJ_URL;
|
@Value("${wms.currentName}")
|
public String WMS_CURRENT_NAME;
|
@Value("${mes.defaultUserId}")
|
public long defaultUserId;
|
@Value("${wms.wmsTransStartStation1}")
|
public String WMS_TRANS_START_STATION_1;
|
|
|
@Resource
|
private RcsService rcsService;
|
@Resource
|
private MatService matService;
|
@Resource
|
private TagService tagService;
|
@Resource
|
private OrderPakinService orderPakinService;
|
@Resource
|
private OrderDetlPakinService orderDetlPakinService;
|
@Resource
|
private OrderPakoutService orderPakoutService;
|
@Resource
|
private OrderDetlPakoutService orderDetlPakoutService;
|
@Resource
|
private MobileService mobileService;
|
@Resource
|
private WaitPakinService waitPakinService;
|
@Resource
|
private TaskService taskService;
|
@Resource
|
private TaskDetlService taskDetlService;
|
@Resource
|
private SnowflakeIdWorker snowflakeIdWorker;
|
@Resource
|
private CommonService commonService;
|
@Resource
|
private AgvInfoMapper agvInfoMapper;
|
|
|
// region MES接口
|
|
// /**
|
// * 物料信息同步,MES->WMS
|
// * 同步物料信息->入库单
|
// *
|
// * @param matRecvForm
|
// * @return
|
// */
|
// @Transactional(rollbackFor = Exception.class)
|
// public MesReturn matInfoAndInBound(MesMatRecvForm matRecvForm) {
|
//
|
// MesReturn mesReturn = new MesReturn();
|
//
|
// // 1、物料信息同步
|
// try {
|
// if (synMatInfo(matRecvForm.getItemdata()) == 1) {
|
// // 2、生成入库单
|
// try {
|
// MesInApply mesInApply = new MesInApply();
|
// mesInApply.setItemno(matRecvForm.getItemdata().getItem_no());
|
// mesInApply.setQty(matRecvForm.getItemdata().getQty());
|
// mesInApply.setOrderNo(matRecvForm.getItemdata().getOrderNo());
|
// if (inBoundOrder(mesInApply, 1) == 1) {
|
// mesReturn.setSuccess("1");
|
// } else {
|
// mesReturn.setSuccess("2");
|
// mesReturn.setMessage("生成入库订单失败");
|
// }
|
// } catch (Exception e) {
|
// mesReturn.setSuccess("2");
|
// mesReturn.setMessage("生成入库订单失败");
|
// log.error("MES物料信息同步接口,生成入库订单错误", e);
|
// }
|
// } else {
|
// mesReturn.setSuccess("2");
|
// mesReturn.setMessage("同步物料信息失败");
|
// }
|
// } catch (Exception e) {
|
// mesReturn.setSuccess("2");
|
// mesReturn.setMessage("同步物料信息失败");
|
// log.error("MES物料信息同步接口,同步物料错误", e);
|
// }
|
//
|
// return mesReturn;
|
// }
|
|
/**
|
* 新增、修改物料信息
|
*
|
* @param mesMatInfo
|
* @return 1 成功;-1 保存物料类型失败;-2 保存物料失败;
|
* @throws ParseException
|
*/
|
public int synMatInfo(MesMatInfo mesMatInfo) {
|
|
try {
|
// 规则定义:默认第3层为同步的物料类型
|
long secondPath = 2;
|
String secondParentName = WMS_CURRENT_NAME;
|
// long locType = 1;
|
long userId = defaultUserId;
|
// if (mesMatInfo.getModified_operator1() != null && !mesMatInfo.getModified_operator1().isEmpty()) {
|
// userId = Long.parseLong(mesMatInfo.getModified_operator1());
|
// }
|
Date now = new Date();
|
if (mesMatInfo.getModified_date1() != null && !mesMatInfo.getModified_date1().isEmpty()) {
|
now = Date.from(OffsetDateTime.parse(mesMatInfo.getModified_date1()).toInstant());
|
}
|
|
// 物料类型更新
|
EntityWrapper<Tag> wrapper = new EntityWrapper<>();
|
wrapper.eq("name", mesMatInfo.getItem_type());
|
Tag tag = tagService.selectByName(mesMatInfo.getItem_type(), 3);
|
if (tag == null || StringUtils.isEmpty(tag.getName())) {
|
Tag newTag = new Tag();
|
newTag.setName(mesMatInfo.getItem_type());
|
newTag.setParentId(secondPath);
|
newTag.setParentName(secondParentName);
|
newTag.setPath("2");
|
newTag.setPathName(secondParentName);
|
newTag.setLevel(3);
|
newTag.setStatus(1);
|
newTag.setCreateBy(userId);
|
newTag.setCreateTime(now);
|
newTag.setUpdateBy(userId);
|
newTag.setUpdateTime(now);
|
|
if (!tagService.insert(newTag))
|
return -1;
|
}
|
|
// 物料更新
|
long tagId = tagService.selectByName(mesMatInfo.getItem_type(), 3).getId();
|
Mat mat = matService.selectByMatnr(mesMatInfo.getItem_no());
|
Mat newMat = new Mat();
|
newMat.setMatnr(mesMatInfo.getItem_no());
|
newMat.setMaktx(mesMatInfo.getDescription());
|
newMat.setTagId(tagId);
|
newMat.setLocType(tagId); //locType
|
newMat.setSpecs(mesMatInfo.getSpecification());
|
newMat.setUnit("件"); //统一为件,mesMatInfo.getUnit_of_measure()
|
newMat.setModel(mesMatInfo.getClassification_code());
|
newMat.setMemo(JSONObject.toJSONString(mesMatInfo));
|
newMat.setCreateBy(userId);
|
newMat.setCreateTime(now);
|
newMat.setUpdateBy(userId);
|
newMat.setUpdateTime(now);
|
newMat.setStatus(1);
|
if (mat == null) {
|
if (!matService.insert(newMat))
|
return -2;
|
} else {
|
JSONObject dbMemo = JSONObject.parseObject(mat.getMemo());
|
// dbMemo.remove("OrderNo");
|
// dbMemo.remove("qty");
|
JSONObject newMemo = JSONObject.parseObject(newMat.getMemo());
|
// newMemo.remove("OrderNo");
|
// newMemo.remove("qty");
|
if (!dbMemo.equals(newMemo)) {
|
newMat.setId(mat.getId());
|
if (!matService.updateById(newMat))
|
return -2;
|
}
|
}
|
|
return 1;
|
} catch (Exception e) {
|
log.error("同步物料失败", e);
|
return -1;
|
}
|
}
|
|
/**
|
* 实际入库反馈
|
* 触发条件:针对原料出库检查再入库的情况
|
* 推送时机:当订单完成时推送
|
*
|
* @param orderNo
|
* @return
|
*/
|
public int recvFeedback(String orderNo) {
|
|
// 按单号查询
|
OrderPakin order = orderPakinService.selectByNo(orderNo);
|
if (order != null && order.getSettle() == 4) { // 校验是否完成
|
// List<MesRecvFeedback.MesRecvFeedbackItem> list = new ArrayList<>();
|
JSONObject dbMemo = JSONObject.parseObject(order.getMemo());
|
List<MesItemDetails> details = new ArrayList<>();
|
EntityWrapper<OrderDetlPakin> wrapper = new EntityWrapper<>();
|
wrapper.eq("order_no", orderNo);
|
List<OrderDetlPakin> orderDetlPakins = orderDetlPakinService.selectList(wrapper);
|
if (orderDetlPakins != null && !orderDetlPakins.isEmpty()) {
|
for (OrderDetlPakin orderDetl : orderDetlPakins) {
|
int qty = Integer.parseInt(dbMemo.getString("qty"));
|
double real_qty = Double.parseDouble(orderDetl.getQty().toString());
|
MesItemDetails detail = new MesItemDetails();
|
detail.setItemNo(orderDetl.getMatnr());
|
detail.setAnfme(real_qty);
|
details.add(detail);
|
// MesRecvFeedback.MesRecvFeedbackItem item = new MesRecvFeedback.MesRecvFeedbackItem();
|
// item.setItem_no(orderDetl.getMatnr());
|
// item.setOrderNo(orderNo);
|
// item.setQty(qty);
|
// item.setReal_qty(real_qty);
|
// list.add(item);
|
}
|
}
|
|
// MesRecvFeedback mesRecvFeedback = new MesRecvFeedback();
|
// mesRecvFeedback.setSource_no(dbMemo.getString("source_no"));
|
// mesRecvFeedback.setOperuser(dbMemo.getString("operuser"));
|
// mesRecvFeedback.setItemdata(list);
|
|
MesInApply mesRecvFeedback = new MesInApply();
|
mesRecvFeedback.setBillType(dbMemo.getString("billType"));
|
mesRecvFeedback.setOrderNo(dbMemo.getString("orderNo"));
|
mesRecvFeedback.setCreateTime(dbMemo.getString("createTime"));
|
mesRecvFeedback.setDetails(details);
|
|
String url = DJ_URL + "api/InboundOrder/WmsInFinish";
|
String response = RcsServiceImpl.sendPost(url, mesRecvFeedback.toString());
|
if (!StringUtils.isEmpty(response) && response.contains("Success")){
|
MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
|
if("1".equals(mesReturn.getSuccess())) {
|
return 1;
|
}
|
}
|
}
|
|
return 0;
|
}
|
|
/**
|
* 出库申请
|
* 加工库、刀具库
|
*
|
* @param mesOutApply
|
* @return 1 成功;-1 订单重复;
|
*/
|
public int outBoundOrder(MesInApply mesOutApply){
|
|
// docType根据库类型确定
|
long docType = 7;
|
long settle = 1;
|
|
// 校验订单是否重复
|
OrderPakout order = orderPakoutService.selectByNo(mesOutApply.getOrderNo());
|
if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
|
return -1;
|
}
|
|
// 生成订单
|
Date now = new Date();
|
OrderPakout orderPakout = new OrderPakout();
|
orderPakout.setUuid( String.valueOf(snowflakeIdWorker.nextId()));
|
orderPakout.setOrderNo(mesOutApply.getOrderNo());
|
orderPakout.setOrderTime(com.core.common.DateUtils.convert(now));
|
orderPakout.setDocType(docType);
|
orderPakout.setSettle(settle);
|
orderPakout.setStatus(1);
|
orderPakout.setCreateBy(defaultUserId);
|
orderPakout.setCreateTime(now);
|
orderPakout.setUpdateBy(defaultUserId);
|
orderPakout.setUpdateTime(now);
|
orderPakout.setMemo(JSONObject.toJSONString(mesOutApply));
|
orderPakout.setPakinPakoutStatus(2);
|
if (!orderPakoutService.insert(orderPakout)) {
|
log.error("MES保存出库订单主档失败");
|
throw new CoolException("保存出库订单主档失败");
|
}
|
|
// 生成明细
|
for (MesItemDetails item : mesOutApply.getDetails()) {
|
Mat mat = matService.selectByMatnr(item.getItemNo());
|
OrderDetlPakout orderDetlPakout = new OrderDetlPakout();
|
orderDetlPakout.setOrderId(orderPakout.getId());
|
orderDetlPakout.setOrderNo(orderPakout.getOrderNo());
|
orderDetlPakout.setAnfme(Double.valueOf(item.getAnfme()));
|
orderDetlPakout.setQty(0.0);
|
orderDetlPakout.setMatnr(mat.getMatnr());
|
orderDetlPakout.setMaktx(mat.getMaktx());
|
orderDetlPakout.setSpecs(mat.getSpecs());
|
orderDetlPakout.setModel(mat.getModel());
|
orderDetlPakout.setCreateBy(defaultUserId);
|
orderDetlPakout.setCreateTime(now);
|
orderDetlPakout.setUpdateBy(defaultUserId);
|
orderDetlPakout.setUpdateTime(now);
|
orderDetlPakout.setStatus(1);
|
orderDetlPakout.setPakinPakoutStatus(2);
|
if (!orderDetlPakoutService.insert(orderDetlPakout)) {
|
log.error("MES保存出库订单明细档失败");
|
throw new CoolException("保存出库订单明细档失败");
|
}
|
}
|
|
// TODO:CTU出库动作
|
|
// todo 呼叫agv产线取空料架
|
// TODO:若AGV和输送线没有安全交互,则要保证立库出货完成后再呼叫AGV。
|
// 立库生成订单后,自动调度AGV从产线运输空刀架至立库缓存区。
|
try {
|
if (!StringUtils.isEmpty(mesOutApply.getTaskNo()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
|
TransTask transTask = new TransTask();
|
transTask.setTaskno(mesOutApply.getTaskNo());
|
// transTask.setTaskname(mesOutApply.getTaskname());
|
transTask.setOrderNo(mesOutApply.getOrderNo());
|
transTask.setTransType("02"); //运回刀架时默认02(下空托) mesOutApply.getTransType()
|
transTask.setCurProcess(mesOutApply.getProductLineId());
|
transTask.setCurStationId(mesOutApply.getStationId());
|
// transTask.setNextProcess();
|
transTask.setNextStationId(WMS_TRANS_START_STATION_1);
|
// transTask.setItemno(mesOutApply.getItemNo());
|
transTask.setQty(0);
|
transTask.setProductLineId(mesOutApply.getProductLineId());
|
// transTask.setItemBarcode(codes);
|
// transTask.setTuoPanId(entry.getKey());
|
transTask.setOperateType(1);
|
transTask.setAgvFactory(1);
|
JSONObject sendAgvTask = submitTask(transTask);
|
if (!"1".equals(sendAgvTask.getString("Success"))) {
|
log.error("出库下发agv运输任务失败", JSONObject.toJSONString(transTask));
|
}
|
|
|
// // 按零件二维码查询有几个托,多托生成多个任务,每托对应零件二维码
|
//// String barCode = barCodeListToStr(mesOutApply.getItemBarcode());
|
// EntityWrapper<MatItemBarcode> matItemBarcodeEntityWrapper = new EntityWrapper<>();
|
// matItemBarcodeEntityWrapper.in("item_barcode", barCode);
|
// List<MatItemBarcode> barcodes = matItemBarcodeMapper.selectList(matItemBarcodeEntityWrapper);
|
// if (barcodes != null) {
|
// Map<String, List<MatItemBarcode>> map = barcodes.stream().collect(Collectors.groupingBy(MatItemBarcode::getZapplet));
|
// for (Map.Entry<String, List<MatItemBarcode>> entry : map.entrySet()) {
|
// List<MatItemBarcode> list = entry.getValue();
|
// List<String> codes = new ArrayList<>();
|
// for (MatItemBarcode zapllet : list) {
|
// codes.add(zapllet.getItemBarcode());
|
// }
|
//
|
//
|
// }
|
// }
|
}
|
} catch (Exception e) {
|
log.error("下发AGV运输任务失败", e);
|
}
|
return 1;
|
}
|
|
public int transDj(String taskNo,String djNo) {
|
try {
|
EntityWrapper<Task> wapper = new EntityWrapper<>();
|
wapper.eq("task_no", taskNo).orderBy("wrk_date");
|
Task task = taskService.selectOne(wapper);
|
if (task != null) {
|
JSONObject memo = JSONObject.parseObject(task.getMemo());
|
|
TransTask transTask = new TransTask();
|
transTask.setTaskno(taskNo + "_1");
|
// transTask.setTaskname(mesOutApply.getTaskname());
|
transTask.setOrderNo(memo.getString("OrderNo"));
|
transTask.setTransType("05"); //送刀时默认05(上刀)
|
transTask.setCurStationId(WMS_TRANS_START_STATION_1);
|
transTask.setNextProcess(memo.getString("ProductLineId"));
|
transTask.setNextStationId(memo.getString("CurStationId"));
|
// transTask.setItemno(mesOutApply.getItemNo());
|
// transTask.setQty(0);
|
transTask.setProductLineId(memo.getString("ProductLineId"));
|
// transTask.setItemBarcode(codes);
|
// transTask.setTuoPanId(entry.getKey());
|
transTask.setOperateType(1);
|
transTask.setAgvFactory(1);
|
transTask.setDjNo(djNo);
|
JSONObject sendAgvTask = submitTask(transTask);
|
if (!"1".equals(sendAgvTask.getString("Success"))) {
|
log.error("上刀下发agv运输任务失败", JSONObject.toJSONString(transTask));
|
}
|
}
|
} catch (Exception e) {
|
log.error("上刀下发AGV运输任务失败", e);
|
}
|
|
return 1;
|
}
|
|
/**
|
* 入库申请
|
*
|
* @param mesInApply
|
* @return 1 成功;-1 入库订单重复;0 部分失败;
|
*/
|
public int inBoundOrder(MesInApply mesInApply, int check){
|
|
// docType根据库类型确定
|
long docType = 4;
|
long settle = 1;
|
|
// 校验订单是否重复
|
OrderPakin order = orderPakinService.selectByNo(mesInApply.getOrderNo());
|
if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
|
return -1;
|
}
|
|
// 生成订单
|
Date now = new Date();
|
OrderPakin orderPakin = new OrderPakin();
|
orderPakin.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
|
orderPakin.setOrderNo(mesInApply.getOrderNo());
|
orderPakin.setOrderTime(com.core.common.DateUtils.convert(now));
|
orderPakin.setDocType(docType);
|
orderPakin.setSettle(settle);
|
orderPakin.setStatus(1);
|
orderPakin.setCreateBy(defaultUserId);
|
orderPakin.setCreateTime(now);
|
orderPakin.setUpdateBy(defaultUserId);
|
orderPakin.setUpdateTime(now);
|
orderPakin.setMemo(JSONObject.toJSONString(mesInApply)); //为出库完成反馈保存
|
orderPakin.setPakinPakoutStatus(1);
|
if (!orderPakinService.insert(orderPakin)) {
|
log.error("MES保存入库订单主档失败");
|
throw new CoolException("保存入库订单主档失败");
|
}
|
|
// 生成明细
|
for (MesItemDetails item : mesInApply.getDetails()) {
|
Mat mat = matService.selectByMatnr(item.getItemNo());
|
OrderDetlPakin orderDetlPakin = new OrderDetlPakin();
|
orderDetlPakin.setOrderId(orderPakin.getId());
|
orderDetlPakin.setOrderNo(orderPakin.getOrderNo());
|
orderDetlPakin.setAnfme(Double.valueOf(item.getAnfme()));
|
orderDetlPakin.setQty(0.0);
|
orderDetlPakin.setMatnr(mat.getMatnr());
|
orderDetlPakin.setMaktx(mat.getMaktx());
|
orderDetlPakin.setSpecs(mat.getSpecs());
|
orderDetlPakin.setModel(mat.getModel());
|
// if (mesInApply.getDetails() != null) {
|
// orderDetlPakin.setStandby1(JSONObject.toJSONString(mesInApply.getProductInfo())); //零件详情存在备选1
|
// }
|
orderDetlPakin.setStandby2(String.valueOf(check)); //保存齐套性检查标识,1 检查;0 不检查;
|
orderDetlPakin.setCreateBy(defaultUserId);
|
orderDetlPakin.setCreateTime(now);
|
orderDetlPakin.setUpdateBy(defaultUserId);
|
orderDetlPakin.setUpdateTime(now);
|
orderDetlPakin.setStatus(1);
|
orderDetlPakin.setPakinPakoutStatus(1);
|
if (!orderDetlPakinService.insert(orderDetlPakin)) {
|
log.error("MES保存入库订单明细档失败1");
|
throw new CoolException("保存入库订单明细档失败1");
|
}
|
}
|
|
|
|
// // TODO:是否绑定货物和托盘?
|
// if (!StringUtils.isEmpty(mesInApply.getTuoPanId())) {
|
// CombParam combParam = new CombParam();
|
// combParam.setOrderNo(mesInApply.getOrderNo());
|
// combParam.setBarcode(mesInApply.getTuoPanId());
|
// List<CombParam.CombMat> combMats = new ArrayList<>();
|
// CombParam.CombMat combMat = new CombParam.CombMat();
|
// combMat.setOrderNo(mesInApply.getOrderNo());
|
// combMat.setMatnr(mat.getMatnr());
|
// combMat.setMaktx(mat.getMaktx());
|
// combMat.setSpecs(mat.getSpecs());
|
// combMat.setAnfme(Double.valueOf(mesInApply.getQty()));
|
//// combMat.setBatch("1");
|
// combMats.add(combMat);
|
// combParam.setCombMats(combMats);
|
// // 组托
|
// mobileService.comb(combParam, defaultUserId);
|
// }
|
|
return 1;
|
}
|
|
/**
|
* 出库申请(叫料)
|
* 装配库、滑块库
|
*
|
* @param mesCallOutApply
|
* @return
|
*/
|
public int callOutBoundOrder(MesCallOutApply mesCallOutApply){
|
|
// docType根据库类型确定
|
long docType = 7;
|
long settle = 1;
|
|
// 校验订单是否重复
|
OrderPakout order = orderPakoutService.selectByNo(mesCallOutApply.getOrderNo());
|
if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
|
return -1;
|
}
|
|
// 生成订单
|
Date now = new Date();
|
OrderPakout orderPakout = new OrderPakout();
|
orderPakout.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
|
orderPakout.setOrderNo(mesCallOutApply.getOrderNo());
|
orderPakout.setOrderTime(com.core.common.DateUtils.convert(now));
|
orderPakout.setDocType(docType);
|
orderPakout.setSettle(settle);
|
orderPakout.setStatus(1);
|
orderPakout.setCreateBy(defaultUserId);
|
orderPakout.setCreateTime(now);
|
orderPakout.setUpdateBy(defaultUserId);
|
orderPakout.setUpdateTime(now);
|
orderPakout.setMemo(JSONObject.toJSONString(mesCallOutApply));
|
orderPakout.setPakinPakoutStatus(2);
|
if (!orderPakoutService.insert(orderPakout)) {
|
log.error("MES保存出库订单(叫料)主档失败");
|
throw new CoolException("保存出库订单(叫料)主档失败");
|
}
|
|
// 生成明细
|
if (mesCallOutApply.getItemdata() != null && !mesCallOutApply.getItemdata().isEmpty()) {
|
for (MesCallOutApply.MesOutApplyItem mesOutApplyItem : mesCallOutApply.getItemdata()) {
|
Mat mat = matService.selectByMatnr(mesOutApplyItem.getItemno());
|
OrderDetlPakout orderDetlPakout = new OrderDetlPakout();
|
orderDetlPakout.setOrderId(orderPakout.getId());
|
orderDetlPakout.setOrderNo(orderPakout.getOrderNo());
|
orderDetlPakout.setAnfme(Double.valueOf(mesOutApplyItem.getQty()));
|
orderDetlPakout.setQty(0.0);
|
orderDetlPakout.setMatnr(mat.getMatnr());
|
orderDetlPakout.setMaktx(mat.getMaktx());
|
orderDetlPakout.setSpecs(mat.getSpecs());
|
orderDetlPakout.setModel(mat.getModel());
|
orderDetlPakout.setThreeCode(mesOutApplyItem.getItemBarcode());
|
orderDetlPakout.setStandby1(mesOutApplyItem.getTrayid()); //保存配盘号,非托盘号
|
orderDetlPakout.setCreateBy(defaultUserId);
|
orderDetlPakout.setCreateTime(now);
|
orderDetlPakout.setUpdateBy(defaultUserId);
|
orderDetlPakout.setUpdateTime(now);
|
orderDetlPakout.setStatus(1);
|
orderDetlPakout.setPakinPakoutStatus(2);
|
if (!orderDetlPakoutService.insert(orderDetlPakout)) {
|
log.error("MES保存出库订单(叫料)明细档失败");
|
throw new CoolException("保存出库订单(叫料)明细档失败");
|
}
|
}
|
}
|
|
return 1;
|
}
|
|
/**
|
* 出库完成
|
*
|
* @param orderNo
|
* @return
|
*/
|
public int outFeedback(String orderNo) {
|
|
int success = 0;
|
|
OrderPakout order = orderPakoutService.selectByNo(orderNo);
|
if (order != null && order.getSettle() == 4) { // 校验是否完成
|
List<MesItemDetails> details = new ArrayList<>();
|
JSONObject dbMemo = JSONObject.parseObject(order.getMemo());
|
EntityWrapper<OrderDetlPakout> wrapper = new EntityWrapper<>();
|
wrapper.eq("order_no", orderNo);
|
List<OrderDetlPakout> orderDetlPakouts = orderDetlPakoutService.selectList(wrapper);
|
if (orderDetlPakouts != null && !orderDetlPakouts.isEmpty()) {
|
for (OrderDetlPakout orderDetl : orderDetlPakouts) {
|
double real_qty = Double.parseDouble(orderDetl.getQty().toString());
|
MesItemDetails detail = new MesItemDetails();
|
detail.setItemNo(orderDetl.getMatnr());
|
detail.setAnfme(real_qty);
|
details.add(detail);
|
|
// StringBuilder palletId = new StringBuilder();
|
// EntityWrapper<WaitPakin> wrapper2 = new EntityWrapper<>();
|
// wrapper2.eq("order_no", orderDetl.getOrderNo());
|
// List<WaitPakin> waitPakins = waitPakinService.selectList(wrapper2);
|
// for (WaitPakin waitPakin : waitPakins) {
|
// palletId.append(waitPakin.getZpallet()).append(",");
|
// }
|
//
|
// MesOutFeedback mesOutFeedback = new MesOutFeedback();
|
// mesOutFeedback.setTaskno(dbMemo.getString("taskno"));
|
// mesOutFeedback.setTaskname(dbMemo.getString("taskname"));
|
// mesOutFeedback.setProductLineId(dbMemo.getString("ProductLineId"));
|
// mesOutFeedback.setStationId(dbMemo.getString("StationID"));
|
// mesOutFeedback.setItemno(orderDetl.getMatnr());
|
// if (!StringUtils.isEmpty(palletId.toString())) {
|
// mesOutFeedback.setTuoPanId(palletId.substring(0, palletId.length() - 1));
|
// }
|
// mesOutFeedback.setQty(Integer.parseInt(orderDetl.getQty().toString()));
|
// mesOutFeedback.setItemBarcode(dbMemo.getString("ItemBarcode"));
|
// mesOutFeedback.setOrderNo(orderNo);
|
}
|
|
MesInApply mesOutFeedback = new MesInApply();
|
mesOutFeedback.setBillType(dbMemo.getString("billType"));
|
mesOutFeedback.setOrderNo(dbMemo.getString("orderNo"));
|
mesOutFeedback.setCreateTime(dbMemo.getString("createTime"));
|
mesOutFeedback.setDetails(details);
|
String url = DJ_URL + "api/OutboundOrder/WmsOutFinish";
|
String response = RcsServiceImpl.sendPost(url, mesOutFeedback.toString());
|
if (!StringUtils.isEmpty(response) && response.contains("Success")){
|
MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
|
if("1".equals(mesReturn.getSuccess())) {
|
success++;
|
}
|
}
|
|
if (success == orderDetlPakouts.size()) {
|
success = 1;
|
} else {
|
success = 0;
|
}
|
}
|
}
|
|
return success;
|
}
|
|
/**
|
* 入库完成
|
*
|
* @param orderNo
|
* @return
|
*/
|
public int inFeedback(String orderNo) {
|
|
int success = 0;
|
int recvFeedback = 0;
|
|
OrderPakin order = orderPakinService.selectByNo(orderNo);
|
if (order != null && order.getSettle() == 4) { // 校验是否完成
|
EntityWrapper<OrderDetlPakin> wrapper = new EntityWrapper<>();
|
wrapper.eq("order_no", orderNo);
|
List<OrderDetlPakin> orderDetlPakins = orderDetlPakinService.selectList(wrapper);
|
if (orderDetlPakins != null && !orderDetlPakins.isEmpty()) {
|
for (OrderDetlPakin orderDetl : orderDetlPakins) {
|
MesInApply result = JSONObject.parseObject(order.getMemo(), MesInApply.class);
|
// result.setAnfme(Float.parseFloat(orderDetl.getAnfme().toString()));
|
|
String url = MES_URL + "api/order/inComplete";
|
String response = RcsServiceImpl.sendPost(url, result.toString());
|
if (!StringUtils.isEmpty(response) && response.contains("Success")){
|
MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
|
if("1".equals(mesReturn.getSuccess())) {
|
success++;
|
}
|
}
|
|
if ("1".equals(orderDetl.getStandby2())) {
|
recvFeedback++;
|
}
|
}
|
|
// 入库回馈
|
if (recvFeedback > 0) {
|
recvFeedback(orderNo);
|
}
|
|
if (success == orderDetlPakins.size()) {
|
success = 1;
|
} else {
|
success = 0;
|
}
|
}
|
}
|
|
return success;
|
}
|
|
// endregion
|
|
|
// region 搬运任务调度
|
|
// route转发3个WCS任务
|
|
/**
|
* 9.1下发运输任务
|
* TODO:其他库的任务全部转到滑块库统一调度
|
*
|
* @param transTask
|
* @return
|
*/
|
@Transactional
|
public JSONObject submitTask(TransTask transTask) {
|
|
JSONObject result = new JSONObject();
|
result.put("taskno", transTask.getTaskno());
|
|
// 重复性校验
|
EntityWrapper<Task> wrapper = new EntityWrapper<>();
|
wrapper.eq("task_no", transTask.getTaskno());
|
List<Task> tasks = taskService.selectList(wrapper);
|
if (tasks != null && !tasks.isEmpty()) {
|
result.put("Success", "2");
|
result.put("Message", "任务重复发送");
|
return result;
|
}
|
|
try {
|
int workNo = commonService.getWorkNo(WorkNoType.OTHER.type);
|
Date now = new Date();
|
Task task = new Task();
|
task.setWrkNo(workNo);
|
task.setTaskType("AGV");
|
task.setWrkSts(301L);
|
task.setIoType(3);
|
task.setIoPri(10.00);
|
task.setWrkDate(now);
|
task.setStaNo(transTask.getNextStationId());
|
task.setSourceStaNo(transTask.getCurStationId());
|
task.setModiUser(defaultUserId);
|
task.setModiTime(now);
|
task.setAppeUser(defaultUserId);
|
task.setAppeTime(now);
|
task.setTaskNo(transTask.getTaskno());
|
task.setMemo(JSONObject.toJSONString(transTask));
|
|
if (taskService.insert(task)) {
|
Mat mat = matService.selectByMatnr("emptyDj");
|
TaskDetl taskDetl = new TaskDetl();
|
taskDetl.setWrkNo(task.getWrkNo());
|
taskDetl.setIoTime(task.getIoTime());
|
taskDetl.setMatnr(mat.getMatnr());
|
taskDetl.setAnfme(0.0);
|
taskDetl.setStandby1(String.valueOf(transTask.getQty()));
|
taskDetl.setMaktx(mat.getMaktx());
|
taskDetl.setSpecs(mat.getSpecs());
|
taskDetl.setOrderNo(transTask.getOrderNo());
|
taskDetl.setModiUser(defaultUserId);
|
taskDetl.setModiTime(now);
|
taskDetl.setAppeUser(defaultUserId);
|
taskDetl.setAppeTime(now);
|
taskDetlService.insert(taskDetl);
|
|
// EntityWrapper<WaitPakin> wrapper1 = new EntityWrapper<>();
|
// wrapper1.eq("order_no", transTask.getTaskno())
|
// .eq("matnr", mat.getMatnr())
|
// .eq("anfme", transTask.getQty());
|
// WaitPakin waitPakin = waitPakinService.selectOne(wrapper1);
|
// if (waitPakin != null)
|
// {
|
// TaskDetl taskDetl = new TaskDetl();
|
// taskDetl.setWrkNo(task.getWrkNo());
|
// taskDetl.setIoTime(task.getIoTime());
|
// taskDetl.setMatnr(transTask.getItemno());
|
// taskDetl.setAnfme(Double.valueOf(transTask.getQty()));
|
// taskDetl.setAnfme(0.0);
|
// taskDetl.setStandby1(String.valueOf(transTask.getQty()));
|
// taskDetl.setZpallet(waitPakin.getZpallet());
|
// taskDetl.setMaktx(mat.getMaktx());
|
// taskDetl.setSpecs(mat.getSpecs());
|
// taskDetl.setOrderNo(transTask.getOrderNo());
|
// taskDetl.setModiUser(defaultUserId);
|
// taskDetl.setModiTime(now);
|
// taskDetl.setAppeUser(defaultUserId);
|
// taskDetl.setAppeTime(now);
|
// taskDetlService.insert(taskDetl);
|
// }
|
// else {
|
// result.put("Success", "2");
|
// result.put("Message", "接收任务失败");
|
// // Throw
|
// }
|
|
// 下发给RCS
|
RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
|
rcsTaskSubmit.setRobotTaskCode(transTask.getTaskno());
|
rcsTaskSubmit.setInitPriority(10); //默认10
|
List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
|
RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute();
|
startRoute.setSeq(0);
|
startRoute.setCode(transTask.getCurStationId());
|
startRoute.setOperation("COLLECT");
|
targetRouteList.add(startRoute);
|
RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute();
|
endRoute.setSeq(1);
|
endRoute.setCode(transTask.getNextStationId());
|
endRoute.setOperation("DELIVERY");
|
targetRouteList.add(endRoute);
|
rcsTaskSubmit.setTargetRoute(targetRouteList);
|
|
// 转发给海康或华晓RCS
|
int success = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
|
if (success == 1) {
|
result.put("Success", "1");
|
result.put("Message", "任务接收成功");
|
} else {
|
result.put("Success", "2");
|
result.put("Message", "任务下发给RCS失败");
|
}
|
} else {
|
result.put("Success", "2");
|
result.put("Message", "接收任务失败");
|
}
|
} catch (Exception e) {
|
log.error("下发运输任务错位 - {}", transTask, e);
|
}
|
|
return result;
|
}
|
|
/**
|
* 9.2返回任务执行结果
|
*
|
* @param rcsReporterTask
|
* @return
|
*/
|
public int reporterTask(RcsReporterTask rcsReporterTask) {
|
|
// 结果汇总
|
boolean completed = true;
|
EntityWrapper<Task> wrapper = new EntityWrapper<>();
|
wrapper.eq("task_no", rcsReporterTask.getRobotTaskCode());
|
List<Task> tasks = taskService.selectList(wrapper);
|
if (tasks != null && !tasks.isEmpty()) {
|
for (Task task : tasks) {
|
if (task.getWrkSts() != 304) { // TODO:确认完成,可能存在多盘任务
|
completed = false;
|
}
|
}
|
}
|
|
if (completed) {
|
TransTaskFeedback transTaskFeedback = new TransTaskFeedback();
|
transTaskFeedback.setTaskno(rcsReporterTask.getRobotTaskCode());
|
// transTaskFeedback.setTaskname();
|
transTaskFeedback.setResult(1);
|
|
String url = MES_URL + "api/task/reporter";
|
String response = RcsServiceImpl.sendPost(url, transTaskFeedback.toString());
|
if (!StringUtils.isEmpty(response) && response.contains("Success")){
|
MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
|
if("1".equals(mesReturn.getSuccess())) {
|
return 1;
|
}
|
}
|
}
|
|
return 0;
|
}
|
|
/**
|
* 9.8申请华晓AGV进入生产线
|
*
|
* @param apply
|
* @return
|
*/
|
public String applyInLine(TransParent apply) {
|
|
String url = MES_URL + "api/apply/inLine";
|
String response = RcsServiceImpl.sendPost(url, apply.toString());
|
if (!StringUtils.isEmpty(response) && response.contains("Success")){
|
JSONObject jsonObject = JSONObject.parseObject(response);
|
if("1".equals(jsonObject.getString("Success"))) {
|
return jsonObject.getJSONObject("Data").getString("status");
|
}
|
}
|
|
return "N";
|
}
|
|
/**
|
* 入站请求:转发AGV->入站请求->给MES
|
*
|
* @param apply
|
* @return
|
*/
|
public int applyInStation(TransParent apply) {
|
|
String url = MES_URL + (apply.getProductLineId().equals("LL") ? "AGVTransportPalletNotice" : "Aprs/AGVTransportPalletNotice");
|
String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
|
if (!StringUtils.isEmpty(response) && response.contains("Success")){
|
MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
|
if("1".equals(mesReturn.getSuccess())) {
|
return 1;
|
}
|
}
|
|
return 0;
|
}
|
|
/**
|
* 入站允许:转发MES->允许入站->给AGV
|
*
|
* @param allow
|
* @return
|
*/
|
public MesReturn allowInStation(TransInOutStationAllow allow) {
|
|
MesReturn mesReturn = new MesReturn();
|
mesReturn.setSuccess("1");
|
|
if ("Y".equals(allow.getStatus())) {
|
RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
|
rcsTaskContinue.setRobotTaskCode(allow.getTaskno());
|
rcsTaskContinue.setTriggerType("TASK");
|
rcsTaskContinue.setTriggerCode(allow.getTaskno());
|
// rcsTaskContinue.setTriggerType("ROBOT");
|
// rcsTaskContinue.setTriggerCode(allow.getAgvCode());
|
|
int success = rcsService.continueTask(rcsTaskContinue, checkRcsFactory(allow.getAgvCode()));
|
mesReturn.setSuccess(success == 1 ? "1" : "2");
|
mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");
|
}
|
|
return mesReturn;
|
}
|
|
/**
|
* 到站完成:转发AGV->到站完成->给MES
|
*
|
* @param arrivalStation
|
* @return
|
*/
|
public int arriveOnStation(TransArrivalStation arrivalStation,String path) {
|
|
String url = MES_URL + path;
|
String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(arrivalStation));
|
if (!StringUtils.isEmpty(response) && response.contains("Success")){
|
MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
|
if("1".equals(mesReturn.getSuccess())) {
|
return 1;
|
}
|
}
|
|
return 0;
|
}
|
|
/**
|
* 离站请求:转发AGV->离站请求->给MES
|
*
|
* @param apply
|
* @return
|
*/
|
public int applyOutStation(TransParent apply) {
|
|
String url = MES_URL + "api/apply/outStation";
|
String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
|
if (!StringUtils.isEmpty(response) && response.contains("Success")){
|
MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
|
if("1".equals(mesReturn.getSuccess())) {
|
return 1;
|
}
|
}
|
|
return 0;
|
}
|
|
/**
|
* 离站允许:转发MES->允许离站->给AGV
|
*
|
* @param allow
|
* @return
|
*/
|
public MesReturn allowOutStation(TransInOutStationAllow allow) {
|
|
MesReturn mesReturn = new MesReturn();
|
mesReturn.setSuccess("1");
|
|
if ("Y".equals(allow.getStatus())) {
|
RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
|
rcsTaskContinue.setRobotTaskCode(allow.getTaskno());
|
rcsTaskContinue.setTriggerType("TASK");
|
rcsTaskContinue.setTriggerCode(allow.getTaskno());
|
|
int success = rcsService.continueTask(rcsTaskContinue, checkRcsFactory(allow.getAgvCode()));
|
mesReturn.setSuccess(success == 1 ? "1" : "2");
|
mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");
|
}
|
|
return mesReturn;
|
}
|
|
/**
|
* 离站完成:转发AGV->离站完成->给MES
|
*
|
* @param apply
|
* @return
|
*/
|
public int outStation(TransParent apply) {
|
|
String url = MES_URL + (apply.getProductLineId().equals("LL") ? "AGVDepartureCompleted" : "Aprs/AGVDepartureCompleted");
|
String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
|
if (!StringUtils.isEmpty(response) && response.contains("Success")){
|
MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
|
if("1".equals(mesReturn.getSuccess())) {
|
return 1;
|
}
|
}
|
|
return 0;
|
}
|
|
@Override
|
public R tkt(String taskNo) {
|
boolean flag = false;
|
try {
|
EntityWrapper<Task> wapper = new EntityWrapper<>();
|
wapper.eq("task_no", taskNo).orderBy("wrk_date",false);
|
Task task = taskService.selectOne(wapper);
|
// 下发给RCS
|
RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
|
rcsTaskSubmit.setRobotTaskCode(taskNo + "-1");
|
rcsTaskSubmit.setInitPriority(10); //默认10
|
List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
|
RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute();
|
startRoute.setSeq(0);
|
startRoute.setCode(task.getStaNo());
|
startRoute.setOperation("COLLECT");
|
targetRouteList.add(startRoute);
|
RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute();
|
endRoute.setSeq(1);
|
endRoute.setCode(task.getSourceStaNo());
|
endRoute.setOperation("DELIVERY");
|
targetRouteList.add(endRoute);
|
rcsTaskSubmit.setTargetRoute(targetRouteList);
|
// 更新起点和终点
|
String memo = task.getMemo();
|
TransTask transTask = JSONObject.parseObject(memo, TransTask.class);
|
transTask.setCurStationId(task.getSourceStaNo());
|
transTask.setNextStationId(task.getStaNo());
|
transTask.setTransType("01"); // 下空托
|
// 更新agv任务起点和终点
|
task.setTaskNo(taskNo + "-1");
|
task.setSourceStaNo(transTask.getCurStationId());
|
task.setStaNo(transTask.getNextStationId());
|
task.setMemo(JSONObject.toJSONString(transTask));
|
taskService.updateById(task);
|
// 转发给海康或华晓RCS
|
int success = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
|
|
if (success == 1) {
|
flag = true;
|
}
|
} catch (Exception e) {
|
log.error("空托回产线发AGV运输任务失败", e);
|
}
|
|
return flag ?R.ok() : R.parse("空托回产线呼叫agv失败");
|
}
|
|
// endregion
|
|
/**
|
* 查询Rcs地址
|
*
|
* @param agvNo
|
* @return 1 海康;2 华晓
|
*/
|
private int checkRcsFactory(String agvNo) {
|
|
AgvInfo agvInfo = agvInfoMapper.selectById(agvNo);
|
return agvInfo.getAgvFactory();
|
}
|
|
}
|