Commit 9f21ba77 LN

增加DeliveryReserve处理,预留成功默认返回2010

1 个父辈 132da977
......@@ -810,6 +810,20 @@ public class DataCache {
}
return availableStorageIds;
}
public List<String> getAvailableStorageIds(List<String> cidList) {
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : getAllStorage().values()) {
if(!cidList.contains(storage)){
continue;
}
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut() || !bean.isAvailable()) {
continue;
}
availableStorageIds.add(storage.getId());
}
return availableStorageIds;
}
public List<String> getAvailableStorageIds(DeviceType deviceType) {
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : getAllStorage().values()) {
......
......@@ -430,10 +430,13 @@ public class LiteOrderCache {
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom,boolean singleOut ) {
return checkOutLiteOrder(orderNo,outBom,singleOut,false);
}
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom,boolean singleOut,boolean needCheck) {
return checkOutLiteOrder(orderNo,outBom,singleOut,needCheck);
}
/**
* 执行工单出库
*/
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom,boolean singleOut,boolean needCheck) {
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom,boolean singleOut,boolean needCheck,List<String> cidList) {
LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if (cacheOrder == null) {
......@@ -484,7 +487,8 @@ public class LiteOrderCache {
return "smfcore.order.out.noTask";
}
List<String> availableStorageIds = dataCache.getAvailableStorageIds();
List<String> availableStorageIds = dataCache.getAvailableStorageIds(cidList);
//其他出库模式一次性全部生成任务
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
orderItem.setOutNum(0);
......@@ -829,4 +833,122 @@ public class LiteOrderCache {
return liteOrderMap.values();
}
/**
* 预锁定物料
*/
public synchronized String LiteOrderLockReel(String orderNo, boolean outBom,boolean singleOut,boolean needCheck,List<String> cidList) {
LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if (cacheOrder == null) {
cacheOrder = liteOrderManager.findByOrderNo(orderNo);
}
if (cacheOrder == null) {
return "smfcore.order.out.notFound";
}
if ( !cacheOrder.isTaskFinished() && !cacheOrder.isNew()) {
log.info("工单[" + orderNo + "]正在执行");
return "smfcore.order.out.executing";
}
if(cacheOrder.isClosed()) {
log.info("工单[" + orderNo + "]已关闭,无法出库");
return "smfcore.order.hasClose";
}
//先查找是否已经锁定过库位,如果已经锁定过,出锁定的库位
List<StoragePos> lockPosList = storagePosManager.findLockPos(cacheOrder.getOrderNo());
if(lockPosList!=null&& lockPosList.size()>0){
return "ok";
}
if(needCheck&&(shortageCheck(cacheOrder,outBom))) {
return "smfcore.order.out.noTask";
}
log.info("开始为工单挑料[" + orderNo + "] outBom=" + outBom);
//liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
int taskReelCount = 0;
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
List<String> availableStorageIds = dataCache.getAvailableStorageIds(cidList);
//其他出库模式一次性全部生成任务
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
//剩余未出数量
Float totalNum = orderItem.getNeedNum() * cacheOrder.getOrderTimes();
int remainNum = totalNum.intValue() - orderItem.getTotalOutNum();
//剩余未出盘数
int remainReelCount = orderItem.getNeedReelCount() - orderItem.getTotalOutReelCount();
//此PN未完成
if (remainNum > 0 || remainReelCount > 0) {
if (outBom) {
//套料出库,设置剩余数量为1,这样就只会出一盘
remainNum = 1;
remainReelCount = 0;
}
int assignNum = 0;
int assignReelCount = 0;
while (assignNum < remainNum || assignReelCount < remainReelCount) {
Collection<String> excludePosIds = excludeOutPosIds();
String partNumber = orderItem.getPn();
String reelId = orderItem.getRi();
String mpn = orderItem.getMpn();
StoragePos pos = null;
if(!Strings.isNullOrEmpty(reelId)){
//RI
pos=storagePosManager.getByBarcode(reelId);
if(pos != null){
if(excludePosIds.contains(pos.getId())) {
log.info("工单[" + orderNo + "]RI出库,任务数[" + taskReelCount + "]出库位置仓位【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "]已在操作队列中,跳过不处理");
break;
}
}else{
log.info("工单[" + orderNo + "]RI出库时,库存中未找到料盘["+reelId+"]");
}
}else if (Strings.isNullOrEmpty(reelId) && !Strings.isNullOrEmpty(partNumber)){
//PN
pos=storagePosManager.findPartNumberInStorages(availableStorageIds,"", partNumber, excludePosIds, checkoutType,orderItem.getAppendData());
} else if (Strings.isNullOrEmpty(reelId) && Strings.isNullOrEmpty(partNumber) && !Strings.isNullOrEmpty(mpn)){
pos=storagePosManager.findMpnInStorages(availableStorageIds, mpn, excludePosIds, checkoutType,orderItem.getAppendData());
}
if (pos == null) {
// //锁定物料
assignNum = assignNum + pos.getBarcode().getAmount();
assignReelCount = assignReelCount + 1;
taskReelCount = taskReelCount + 1;
log.info("工单[" + orderNo + "],锁定盘数[" + taskReelCount + "]锁定位置【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "] PN=[" + partNumber + "] num:" + pos.getBarcode().getAmount());
Barcode barcode=pos.getBarcode();
barcode.setLockId(cacheOrder.getOrderNo());
pos.setBarcode(barcode);
storagePosManager.save(pos);
}
//如果是RI出库,只有一盘,出完就结束
if(!Strings.isNullOrEmpty(reelId)){
break;
}
}
}
}
log.info("工单[" + orderNo + "]挑料完成,锁定物料盘数[" + taskReelCount + "]");
if (taskReelCount <= 0) {
//return "工单无可执行的任务";
return "smfcore.order.out.noTask";
}
return "";
}
}
......@@ -55,6 +55,8 @@ public class HanwhaApiHandler extends BaseSmfApiListener {
private IStoragePosManager storagePosManager;
@Autowired
private TMSCommunicator tmsCommunicator;
@Autowired
private TMSUtil tmsUtil;
@Autowired
private IComponentManager componentManager;
......@@ -228,7 +230,7 @@ public class HanwhaApiHandler extends BaseSmfApiListener {
log.info("工单取消处理中,此处不通知TMS");
}else{
log.info("工单关闭,通知TMS");
TMSReserve tmsReserve = tmsCommunicator.GetOrderInfo(liteOrder);
TMSReserve tmsReserve = tmsUtil.GetOrderInfo(liteOrder);
List<TMSReserve> list = new ArrayList<>();
list.add(tmsReserve);
tmsCommunicator.ResponseUpdateDeliveryReserveState(0, list, 0);
......
......@@ -93,12 +93,15 @@ public class TMSCommunicator implements WsMsgReceivedListener {
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private IDataLogManager dataLogManager;
// @Autowired
// private IDataLogManager dataLogManager;
@Autowired
private IComponentManager componentManager;
@Autowired
private TMSUtil tmsUtil;
private static int gRequestID = 1000;
public static int GetRequestID()
{
......@@ -309,28 +312,6 @@ public class TMSCommunicator implements WsMsgReceivedListener {
}
log.info("WebSocket 已连接,开始同步物料信息 RequestSyncPartReelPosInfo");
// for (Map<String, StoragePos> map : allUsedPosList) {
//
// for (StoragePos pos :
// map.values()) {
// if (pos.getBarcode() == null) {
// continue;
// }
// Storage storage = dataCache.getStorageById(pos.getStorageId());
// if (storage == null) {
// log.error("posName[" + pos.getPosName() + "],storageId[" + pos.getStorageId() + "]未找到料仓");
// continue;
// }
// Barcode barcode = pos.getBarcode();
// TMSPartReelPos bean = TMSPartReelPos.newBean(barcode.getPartNumber(), barcode.getBarcode(), barcode.getAmount(),
// storage.getCid(), pos.getPosName(), 4, barcode.getPutInDate().getTime(), -1);
//
// list.add(bean);
//// if(list.size()>=10){
//// break;
//// }
// }
// }
Map<String, Storage> allStorage = dataCache.getAllStorage();
for (Storage storage :
allStorage.values()) {
......@@ -446,7 +427,7 @@ public class TMSCommunicator implements WsMsgReceivedListener {
List<LiteOrder> orders = liteOrderManager.findByQuery(query);
for (LiteOrder order:orders
) {
TMSReserve tmsReserve=GetOrderInfo(order);
TMSReserve tmsReserve=tmsUtil.GetOrderInfo(order);
if(tmsReserve!=null&&tmsReserve.getPartList().size()>0){
tmsReserves.add(tmsReserve);
}
......@@ -455,71 +436,6 @@ public class TMSCommunicator implements WsMsgReceivedListener {
ResponseUpdateDeliveryReserveState(0, tmsReserves,1 );
}
public TMSReserve GetOrderInfo(LiteOrder liteOrder) {
TMSReserve tmsReserve = new TMSReserve();
tmsReserve.setReserveCode(liteOrder.getOrderNo());
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(liteOrder.getCreateDate());
tmsReserve.setDate(dateString);
List<TMSPart> tmsParts = new ArrayList<>();
//查找工单的所有任务
Criteria c = Criteria.where("sourceName").is(liteOrder.getOrderNo()).and("type").is(2);
List<DataLog> dataLogs = dataLogManager.findByQuery(new Query(c));
boolean hasCancelTask=false;
boolean allCancel = true;
for (DataLog task :
dataLogs) {
// if(ObjectUtil.isNotEmpty(item.getPn())&&task.getPartNumber().equals(task.getPartNumber())){
//
// }else if(ObjectUtil.isNotEmpty(item.getRi())&&task.getBarcode().equals(task.getBarcode())){
//
// }else{
// continue;
// }
//是工单出库任务
if (task.isCheckOutTask() && task.getSourceName().equals(liteOrder.getOrderNo())) {
int responseNum = task.getNum();
String logCode = TMS_Code.CODE_2013;//默认已完成
if (task.isCancel()) {
hasCancelTask=true;
responseNum = 0;
logCode = TMS_Code.CODE_2012;//取消成功
} else if (task.isExecuting() || task.isWait()) {
logCode = TMS_Code.CODE_2011;//出库中
allCancel = false;
} else {
logCode = TMS_Code.CODE_2013;//已完成
allCancel = false;
}
TMSPart part = TMSPart.newBean(tmsParts.size(), task.getPartNumber(), task.getBarcode(), task.getNum(), responseNum, logCode, task.getCid(), task.getPosName());
tmsParts.add(part);
}
}
//有取消且有完成的返回2016.全部取消返回2012
if (liteOrder.isClosed()) {
//如果工单全部取消,需要发送2012
if (allCancel) {
tmsReserve.setResultCode(TMS_Code.CODE_2012);
} else if (hasCancelTask) {
//有取消任务返回2016
tmsReserve.setResultCode(TMS_Code.CODE_2016);
} else if (tmsParts.size() > 0) {
tmsReserve.setResultCode(TMS_Code.CODE_2013);
} else {
tmsReserve.setResultCode(TMS_Code.CODE_2001);
}
}else if (liteOrder.isOutOne() || liteOrder.isOutTails() || liteOrder.isOutOne()) {
tmsReserve.setResultCode(TMS_Code.CODE_2011);
}
tmsReserve.setPartList(tmsParts);
return tmsReserve;
}
......@@ -546,6 +462,9 @@ public class TMSCommunicator implements WsMsgReceivedListener {
}
List<String> partItems;
List<Integer> partCounts;
List<String> rackList;
List<TMSPos> Locations;
List<String> reelCds;
boolean towerLamp;
String registerID;
String reelCode;
......@@ -558,35 +477,62 @@ public class TMSCommunicator implements WsMsgReceivedListener {
partItems = getMapValue(msgMap, "PartNames");
partCounts = getMapValue(msgMap, "Counts");
towerLamp = (boolean) getMapValue(msgMap, "TowerLamp");
rackList= getMapValue(msgMap,"RackList");
if(rackList==null){
rackList=new ArrayList<>();
}
//3.8 RequestDeliveryOrder
RequestDeliveryOrder(requestID, partItems, partCounts, towerLamp);
RequestDeliveryOrder(requestID, partItems, partCounts, towerLamp,rackList);
break;
case "RequestDeliveryOrderByLocation":
log.info("onMsgReceived: requestID=["+requestID+"],Topic=["+topic+"],message:["+message+"],");
List<TMSPos> Locations = getMapValue(msgMap, "Locations");
Locations = getMapValue(msgMap, "Locations");
//3.10 RequestDeliveryOrderByLocation
RequestDeliveryOrderByLocation(requestID, Locations);
break;
case "RequestDeliveryOrderByReelCd":
log.info("onMsgReceived: requestID=["+requestID+"],Topic=["+topic+"],message:["+message+"],");
List<String> reelCds = getMapValue(msgMap, "ReelCds");
reelCds = getMapValue(msgMap, "ReelCds");
rackList= getMapValue(msgMap,"RackList");
//3.12 RequestDeliveryOrderByReelCd
RequestDeliveryOrderByReelCd(requestID, reelCds);
RequestDeliveryOrderByReelCd(requestID, reelCds,rackList);
break;
case "RequestUpdateDeliveryReserveState":
log.info("onMsgReceived: requestID=["+requestID+"],Topic=["+topic+"],message:["+message+"],");
List<String> reserveCodes = getMapValue(msgMap, "ReserveCodes");
List<Integer> resultCodes = getMapValue(msgMap, "ResultCodes");
//
//3.14 RequestUpdateDeliveryReserveState
//3.20 RequestUpdateDeliveryReserveState
RequestUpdateDeliveryReserveState(requestID, reserveCodes, resultCodes);
break;
// case "RequestDeliveryReserve":
// partItems = getMapValue(msgMap, "PartNames");
// partCounts = getMapValue(msgMap, "Counts");
// RequestDeliveryReserve(requestID, partItems, partCounts);
//
// break;
case "RequestDeliveryReserve":
partItems = getMapValue(msgMap, "PartNames");
partCounts = getMapValue(msgMap, "Counts");
towerLamp = (boolean) getMapValue(msgMap, "TowerLamp");
rackList= getMapValue(msgMap,"RackList");
if(rackList==null){
rackList=new ArrayList<>();
}
//3.14 RequestDeliveryReserve
RequestDeliveryReserve(requestID, partItems, partCounts,towerLamp,rackList);
break;
case "RequestDeliveryReserveByLocation":
log.info("onMsgReceived: requestID=["+requestID+"],Topic=["+topic+"],message:["+message+"],");
Locations = getMapValue(msgMap, "Locations");
// 3.16 ,RequestDeliveryReserveByLocation
RequestDeliveryReserveByLocation(requestID, Locations);
break;
case "RequestDeliveryReserveByReelCd":
log.info("onMsgReceived: requestID=["+requestID+"],Topic=["+topic+"],message:["+message+"],");
reelCds = getMapValue(msgMap, "ReelCds");
rackList= getMapValue(msgMap,"RackList");
//3.18 RequestDeliveryOrderByReelCd
RequestDeliveryReserveByReelCd(requestID, reelCds,rackList);
break;
// case "RequestResultOfDeliveryReserve":
// String reserveCode = getMapValue(msgMap, "ReserveCode");
// RequestResultOfDeliveryReserve(requestID, reserveCode);
......@@ -651,48 +597,20 @@ public class TMSCommunicator implements WsMsgReceivedListener {
return null;
}
private LiteOrder createOrder(int requestID, List<LiteOrderItem> items,String orderNo,boolean autoOut) {
if (items.size() <= 0) {
return null;
}
//判断是否有已执行的工单,有的话创建失败
Query query =new Query(Criteria.where("status").ne(LITEORDER_STATUS.CLOSED));
List<LiteOrder> orderList = liteOrderManager.findByQuery(query);
if(orderList.size()>0){
log.info("RequestDelivery: 当前有未关闭的工单"+orderList.size()+",创建工单失败");
return null;
}
LiteOrder liteOrder = new LiteOrder(orderNo, items);
liteOrder.setSource("DeliveryOrder");
LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo());
if (dbOrder != null) {
orderNo = orderNo + "-" + requestID;
dbOrder = liteOrderManager.findByOrderNo(orderNo);
if (dbOrder == null) {
liteOrder.setOrderNo(orderNo);
} else {
log.info("RequestDelivery :数据库中已存在工单号为[" + orderNo + "],创建工单失败");
public void OrderProEndUpdateState(String requestCmd,int requestID, LiteOrder liteOrder){
return null;
}
}
log.info("RequestDelivery:新建工单:" + liteOrder.getOrderNo() + ",共" + items.size() + "条工单详情,自动执行:"+autoOut);
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
if (autoOut) {
try {
//如果工单执行中,发送ResponseUpdateDeliveryReserveState,否则不需要
if (liteOrder.isClosed()) {
log.info(requestCmd+" 工单已关闭,不需要发送 发送ResponseUpdateDeliveryReserveState");
} else {
liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false,false,true);
liteOrder = liteOrderCache.getLiteOrder(liteOrder.getOrderNo());
} catch (ValidateException ex) {
log.error("RequestDelivery 自动执行工单[" + liteOrder.getOrderNo() + "] error:" + ex.toString());
}
TMSReserve tmsReserve =tmsUtil.GetOrderInfo(liteOrder);
List<TMSReserve> tmsReserves = new ArrayList<>();
tmsReserves.add(tmsReserve);
ResponseUpdateDeliveryReserveState(requestID, tmsReserves, 0);
}
return liteOrder;
}
/**
* 3.8 RequestDeliveryOrder
* @param requestID
......@@ -700,42 +618,27 @@ public class TMSCommunicator implements WsMsgReceivedListener {
* @param partCount
* @param towerLamp
*/
private synchronized void RequestDeliveryOrder(int requestID, List<String> partItem, List<Integer> partCount, boolean towerLamp) {
private synchronized void RequestDeliveryOrder(int requestID, List<String> partItem, List<Integer> partCount, boolean towerLamp,List<String> rackList) {
// 3.9 ResponseDeliveryOrder
TMSReserve tmsReserve=null;
String requestCmd="RequestDeliveryOrder";
String responseCmd="ResponseDeliveryOrder";
try {
if (partItem == null || partCount == null || partItem.size() <= 0 || partCount.size() <= 0) {
log.info("RequestDeliveryOrder 数据不完整,直接返回");
ResponseDeliveryOrder(requestID, new ArrayList<>(), "","");
log.info(requestCmd+" 数据不完整,直接返回");
ResponseDeliveryOrder(responseCmd,requestID, new ArrayList<>(), "","");
return;
}
String soName = "DO" + DateUtil.toDateString(new Date(), "yyyyMMddHHmmss");
List<LiteOrderItem> liteOrderItems = new ArrayList<>();
int index = 0;
for (String pn : partItem) {
int count = Convert.toInt(partCount.get(index));
if (ObjectUtil.isNotEmpty(pn) && count > 0) {
LiteOrderItem item = new LiteOrderItem();
item.setPn(pn);
item.setNeedNum(count);
liteOrderItems.add(item);
}
index++;
}
LiteOrder liteOrder = createOrder(requestID, liteOrderItems, soName, true);
List<LiteOrderItem> liteOrderItems = tmsUtil.partToItems(partItem,partCount);
LiteOrder liteOrder = tmsUtil.createOrder(responseCmd,requestID, liteOrderItems, soName, true,rackList);
if(liteOrder==null){
//同时只能有一个工单执行,创建工单时不能有未关闭的工单。返回2014
List<TMSPart> parts = new ArrayList<>();
for (LiteOrderItem item :
liteOrderItems) {
TMSPart p = TMSPart.newBean(parts.size(), item.getPn(), "", item.getNeedNum(), 0, TMS_Code.CODE_2014, "", "");
parts.add(p);
}
ResponseDeliveryOrder(requestID, parts, "","");
List<TMSPart> parts =tmsUtil.itemsToTMSPartList(liteOrderItems) ;
ResponseDeliveryOrder(responseCmd,requestID, parts, "","");
}else {
//能够出库成功返回2010,库存不足范围2002 Out Of Part
liteOrder = liteOrderCache.getLiteOrder(liteOrder.getOrderNo());
......@@ -761,13 +664,13 @@ public class TMSCommunicator implements WsMsgReceivedListener {
requestNum = task.getNum() - (curroNum - item.getNeedNum());
}
TMSPart p = TMSPart.newBean(parts.size(), task.getPartNumber(), task.getBarcode(), requestNum, task.getNum(), TMS_Code.CODE_2010, task.getCid(), task.getPosName());
log.info("RequestDeliveryOrder pn=" + task.getPartNumber() + ",出库成功:code=" + TMS_Code.CODE_2010 + ",posName=" + task.getPosName() + ",barcode=" + task.getBarcode());
log.info(requestCmd+" pn=" + task.getPartNumber() + ",出库成功:code=" + TMS_Code.CODE_2010 + ",posName=" + task.getPosName() + ",barcode=" + task.getBarcode());
parts.add(p);
}
}
}
} catch (Exception ex) {
log.error(" RequestDeliveryOrder 查找 " + item.getPn() + "的出库任务出错:error::", ex.toString());
log.error(requestCmd+" 查找 " + item.getPn() + "的出库任务出错:error::", ex.toString());
}
if (curroNum <= 0) {
......@@ -784,7 +687,7 @@ public class TMSCommunicator implements WsMsgReceivedListener {
if (itmes.size() > 0) {
//如果是有库存但是库存不足,发送2003
p = TMSPart.newBean(parts.size(), item.getPn(), "", item.getNeedNum(), item.getOutNum(), TMS_Code.CODE_2001, "", "");
log.info("RequestDeliveryOrder pn=" + item.getPn() + ",出库失败缺料,库存不足:code=" + TMS_Code.CODE_2001);
log.info(requestCmd+" pn=" + item.getPn() + ",出库失败缺料,库存不足:code=" + TMS_Code.CODE_2001);
} else {
//判断pn是否存在,存在返回2002,否则返回2003
......@@ -792,24 +695,24 @@ public class TMSCommunicator implements WsMsgReceivedListener {
if(component==null){
//pn不存在,返回2003
p = TMSPart.newBean(parts.size(), item.getPn(), "", item.getNeedNum(), item.getOutNum(), TMS_Code.CODE_2003, "", "");
log.info("RequestDeliveryOrder pn=" + item.getPn() + ",出库失败缺料,PN不存在:code=" + TMS_Code.CODE_2003);
log.info(requestCmd+" pn=" + item.getPn() + ",出库失败缺料,PN不存在:code=" + TMS_Code.CODE_2003);
}else {
//库存无此物料,发送2002
p = TMSPart.newBean(parts.size(), item.getPn(), "", item.getNeedNum(), item.getOutNum(), TMS_Code.CODE_2002, "", "");
log.info("RequestDeliveryOrder pn=" + item.getPn() + ",出库失败缺料,库存无此料:code=" + TMS_Code.CODE_2002);
log.info(requestCmd+" pn=" + item.getPn() + ",出库失败缺料,库存无此料:code=" + TMS_Code.CODE_2002);
}
}
parts.add(p);
} else {
TMSPart p = TMSPart.newBean(parts.size(), item.getPn(), "", item.getNeedNum(), item.getOutNum(), TMS_Code.CODE_2010, "", "");
log.info("RequestDeliveryOrder pn=" + item.getPn() + ",未出库成功:code=" + TMS_Code.CODE_2010);
log.info(requestCmd+" pn=" + item.getPn() + ",未出库成功:code=" + TMS_Code.CODE_2010);
parts.add(p);
}
}
} catch (Exception ex) {
log.error(" RequestDeliveryOrder " + item.getPn() + ",error::", ex.toString());
log.error(requestCmd+" " + item.getPn() + ",error::", ex.toString());
}
}
......@@ -817,25 +720,16 @@ public class TMSCommunicator implements WsMsgReceivedListener {
// TMSPart part = TMSPart.newBean("PN1", "Barcode1", 999, 999, TMS_Code.CODE_2002, "", "");
// parts.add(part);
ResponseDeliveryOrder(requestID, parts, liteOrder.getOrderNo(),"");
ResponseDeliveryOrder(responseCmd,requestID, parts, liteOrder.getOrderNo(),"");
OrderProEndUpdateState(requestCmd,requestID, liteOrder);
//如果工单执行中,发送ResponseUpdateDeliveryReserveState,否则不需要
if (liteOrder.isClosed()) {
log.info("RequestDeliveryOrder 工单已关闭,不需要发送 发送ResponseUpdateDeliveryReserveState");
} else {
tmsReserve = GetOrderInfo(liteOrder);
List<TMSReserve> tmsReserves = new ArrayList<>();
tmsReserves.add(tmsReserve);
ResponseUpdateDeliveryReserveState(requestID, tmsReserves, 0);
}
}
}
} catch (Exception exception) {
log.error("RequestDeliveryOrder error:" + exception.toString());
log.error(requestCmd+" error:" + exception.toString());
}
ResponseDeliveryOrder(requestID, new ArrayList<>(), "","");
ResponseDeliveryOrder(responseCmd,requestID, new ArrayList<>(), "","");
}
/**
......@@ -845,10 +739,12 @@ public class TMSCommunicator implements WsMsgReceivedListener {
*/
private void RequestDeliveryOrderByLocation(int requestID, List<TMSPos> Locations) {
// 3.11 ResponseDeliveryOrderByLocation
String requestCmd="RequestDeliveryOrderByLocation";
String responseCmd="ResponseDeliveryOrderByLocation";
try {
Map<String, String> posResultMap = new HashMap<>();
if (Locations == null || Locations.size() <= 0) {
ResponseDeliveryOrderByLocation(requestID, new ArrayList<>(), new ArrayList<>(), "");
ResponseDeliveryOrderByLocation(responseCmd,requestID, new ArrayList<>(), new ArrayList<>(), "");
return;
}
String soName = "DOL" + DateUtil.toDateString(new Date(), "yyyyMMddHHmmss");
......@@ -869,15 +765,15 @@ public class TMSCommunicator implements WsMsgReceivedListener {
}
StoragePos pos = storagePosManager.getByPosName(posName);
if (pos == null) {
log.info("RequestDeliveryOrderByLocation : cid="+cid+", pos="+posName+",未找到库位号,出库结果:code="+TMS_Code.CODE_2002 );
log.info(requestCmd+" : cid="+cid+", pos="+posName+",未找到库位号,出库结果:code="+TMS_Code.CODE_2002 );
posResultMap.put(posName, TMS_Code.CODE_2002);
} else if (pos.getBarcode() == null) {
log.info("RequestDeliveryOrderByLocation : cid="+cid+", pos="+posName+",库位为空,出库失败,结果:code="+TMS_Code.CODE_2002 );
log.info(requestCmd+" : cid="+cid+", pos="+posName+",库位为空,出库失败,结果:code="+TMS_Code.CODE_2002 );
posResultMap.put(posName, TMS_Code.CODE_2002);
} else {
posResultMap.put(posName, TMS_Code.CODE_1011); //默认是开始送货时失败
log.info("RequestDeliveryOrderByLocation : cid="+cid+", pos="+posName+",可出库,准备创建工单" );
log.info(requestCmd+" : cid="+cid+", pos="+posName+",可出库,准备创建工单" );
LiteOrderItem item = new LiteOrderItem();
item.setRi(pos.getBarcode().getBarcode());
item.setNeedNum(1);
......@@ -885,7 +781,7 @@ public class TMSCommunicator implements WsMsgReceivedListener {
}
}
LiteOrder liteOrder = createOrder(requestID, liteOrderItems, soName, true);
LiteOrder liteOrder = tmsUtil.createOrder(requestCmd,requestID, liteOrderItems, soName, true,new ArrayList<>());
liteOrder = liteOrderCache.getLiteOrder(liteOrder.getOrderNo());
if (liteOrder != null) {
......@@ -896,7 +792,7 @@ public class TMSCommunicator implements WsMsgReceivedListener {
dataLogs) {
if (task.isCheckOutTask() && task.getSourceName().equals(liteOrder.getOrderNo()) && task.getBarcode().equals(item.getRi())) {
posResultMap.put(task.getPosName(), TMS_Code.CODE_2011);//状态改为开始送货
log.info("RequestDeliveryOrderByLocation : cid="+task.getCid()+", pos="+task.getPosName()+",出库成功,code="+ TMS_Code.CODE_2011);
log.info(requestCmd+" : cid="+task.getCid()+", pos="+task.getPosName()+",出库成功,code="+ TMS_Code.CODE_2011);
break;
}
}
......@@ -914,12 +810,13 @@ public class TMSCommunicator implements WsMsgReceivedListener {
rCodes.add(Integer.parseInt(code));
}
ResponseDeliveryOrderByLocation(requestID, Locations, rCodes, liteOrder.getOrderNo());
ResponseDeliveryOrderByLocation(responseCmd,requestID, Locations, rCodes, liteOrder.getOrderNo());
OrderProEndUpdateState(requestCmd,requestID, liteOrder);
} catch (Exception exception) {
log.error("RequestDeliveryOrderByLocation error:" + exception.toString());
log.error(requestCmd+" error:" + exception.toString());
}
ResponseDeliveryOrderByLocation(requestID, Locations, new ArrayList<>(), "");
ResponseDeliveryOrderByLocation(responseCmd,requestID, Locations, new ArrayList<>(), "");
}
/**
......@@ -927,12 +824,17 @@ public class TMSCommunicator implements WsMsgReceivedListener {
* @param requestID
* @param ReelCds
*/
private void RequestDeliveryOrderByReelCd(int requestID, List<String> ReelCds) {
private void RequestDeliveryOrderByReelCd(int requestID, List<String> ReelCds,List<String> rackList) {
// 3.13 ResponseDeliveryOrderByReelCd
String requestCmd="RequestDeliveryOrderByReelCd";
String responseCmd="ResponseDeliveryOrderByReelCd";
try {
if(rackList==null){
rackList=new ArrayList<>();
}
Map<String, String> posResultMap = new HashMap<>();
if (ReelCds == null || ReelCds.size() <= 0) {
ResponseDeliveryOrderByReelCd(requestID, new ArrayList<>(), new ArrayList<>(), "");
ResponseDeliveryOrderByReelCd(responseCmd,requestID, new ArrayList<>(), new ArrayList<>(), "");
return;
}
String soName = "DOR" + DateUtil.toDateString(new Date(), "yyyyMMddHHmmss");
......@@ -943,7 +845,7 @@ public class TMSCommunicator implements WsMsgReceivedListener {
StoragePos pos = storagePosManager.getByBarcode(ri);
if (pos == null) {
posResultMap.put(ri, TMS_Code.CODE_2041);
log.info("RequestDeliveryOrderByLocation : ri="+ri+", 未找到物料,出库失败,code="+ TMS_Code.CODE_2041);
log.info(requestCmd+" : ri="+ri+", 未找到物料,出库失败,code="+ TMS_Code.CODE_2041);
} else {
posResultMap.put(ri, TMS_Code.CODE_1011); //默认是开始送货时失败
......@@ -951,22 +853,21 @@ public class TMSCommunicator implements WsMsgReceivedListener {
item.setRi(pos.getBarcode().getBarcode());
item.setNeedNum(1);
liteOrderItems.add(item);
log.info("RequestDeliveryOrderByLocation : ri="+ri+", 可出库,准备创建工单");
log.info(requestCmd+" : ri="+ri+", 可出库,准备创建工单");
}
}
LiteOrder liteOrder = createOrder(requestID, liteOrderItems, soName, true);
LiteOrder liteOrder = tmsUtil.createOrder(requestCmd,requestID, liteOrderItems, soName, true,rackList);
liteOrder = liteOrderCache.getLiteOrder(liteOrder.getOrderNo());
if (liteOrder != null) {
List<DataLog> dataLogs = taskService.getAllTasks();
List<TMSPart> parts = new ArrayList<>();
for (LiteOrderItem item : liteOrder.getOrderItems()) {
for (DataLog task :
dataLogs) {
if (task.isCheckOutTask() && task.getSourceName().equals(liteOrder.getOrderNo()) && task.getBarcode().equals(item.getRi())) {
posResultMap.put(task.getBarcode(), TMS_Code.CODE_2011);//状态改为开始送货
log.info("RequestDeliveryOrderByLocation : ri="+task.getBarcode()+", 出库成功,code="+TMS_Code.CODE_2011);
log.info(requestCmd+" : ri="+task.getBarcode()+", 出库成功,code="+TMS_Code.CODE_2011);
break;
}
}
......@@ -984,13 +885,209 @@ public class TMSCommunicator implements WsMsgReceivedListener {
rCodes.add(Integer.parseInt(code));
}
ResponseDeliveryOrderByReelCd(requestID, ReelCds, rCodes, liteOrder.getOrderNo());
ResponseDeliveryOrderByReelCd(responseCmd,requestID, ReelCds, rCodes, liteOrder.getOrderNo());
OrderProEndUpdateState(requestCmd,requestID, liteOrder);
} catch (Exception exception) {
log.error("RequestDeliveryOrderByLocation error:" + exception.toString());
log.error(requestCmd+" error:" + exception.toString());
}
ResponseDeliveryOrderByReelCd(requestID, ReelCds, new ArrayList<>(), "");
ResponseDeliveryOrderByReelCd(responseCmd,requestID, ReelCds, new ArrayList<>(), "");
}
/**
* 3.14 RequestDeliveryReserve
*/
private void RequestDeliveryReserve(int requestID, List<String> partItem, List<Integer> partCount, boolean towerLamp, List<String> rackList) {
//创建工单,锁定物料,但不出库
String requestCmd = "RequestDeliveryReserve";
String responseCmd = "ResponseDeliveryReserve";
try {
if (partItem == null || partCount == null || partItem.size() <= 0 || partCount.size() <= 0) {
log.info(requestCmd + " 数据不完整,直接返回");
ResponseDeliveryReserve(responseCmd, requestID, new ArrayList<>(), "", "");
return;
}
String soName = "DO" + DateUtil.toDateString(new Date(), "yyyyMMddHHmmss");
List<LiteOrderItem> liteOrderItems = tmsUtil.partToItems(partItem, partCount);
LiteOrder liteOrder = tmsUtil.createOrder(responseCmd, requestID, liteOrderItems, soName, false, rackList);
if (liteOrder == null) {
//同时只能有一个工单执行,创建工单时不能有未关闭的工单。返回2014
List<TMSPart> parts = tmsUtil.itemsToTMSPartList(liteOrderItems);
ResponseDeliveryReserve(responseCmd, requestID, parts, "", "");
} else {
liteOrder = liteOrderCache.getLiteOrder(liteOrder.getOrderNo());
if (liteOrder != null) {
List<TMSPart> parts =tmsUtil.GetReserveList(requestCmd,liteOrder);
ResponseDeliveryReserve(responseCmd, requestID, parts, liteOrder.getOrderNo(), "");
OrderProEndUpdateState(requestCmd, requestID, liteOrder);
}
}
} catch (Exception exception) {
log.error(requestCmd + " error:" + exception.toString());
}
ResponseDeliveryReserve(responseCmd, requestID, new ArrayList<>(), "", "");
}
/**
* 3.16 RequestDeliveryReserveByLocation
* @param requestID
* @param Locations
*/
private void RequestDeliveryReserveByLocation(int requestID, List<TMSPos> Locations) {
String requestCmd = "RequestDeliveryReserveByLocation";
String responseCmd = "ResponseDeliveryReserveByLocation";
try {
Map<String, String> posResultMap = new HashMap<>();
if (Locations == null || Locations.size() <= 0) {
ResponseDeliveryOrderByLocation(responseCmd, requestID, new ArrayList<>(), new ArrayList<>(), "");
return;
}
String soName = "DOL" + DateUtil.toDateString(new Date(), "yyyyMMddHHmmss");
List<LiteOrderItem> liteOrderItems = new ArrayList<>();
for (TMSPos tmsPos : Locations) {
if (ObjectUtil.isEmpty(tmsPos.getColID()) && ObjectUtil.isEmpty(tmsPos.getRowID())) {
continue;
}
String cid = tmsPos.getRackID();
Storage storage = dataCache.getStorage(cid);
String posName = tmsPos.getPosName();
if (storage == null || ObjectUtil.isEmpty(posName)) {
posResultMap.put("", TMS_Code.CODE_2002);
continue;
}
StoragePos pos = storagePosManager.getByPosName(posName);
if (pos == null) {
log.info("RequestDeliveryOrderByLocation : cid=" + cid + ", pos=" + posName + ",未找到库位号,出库结果:code=" + TMS_Code.CODE_2002);
posResultMap.put(posName, TMS_Code.CODE_2002);
} else if (pos.getBarcode() == null) {
log.info("RequestDeliveryOrderByLocation : cid=" + cid + ", pos=" + posName + ",库位为空,出库失败,结果:code=" + TMS_Code.CODE_2002);
posResultMap.put(posName, TMS_Code.CODE_2002);
} else {
posResultMap.put(posName, TMS_Code.CODE_1011); //默认是开始送货时失败
log.info("RequestDeliveryOrderByLocation : cid=" + cid + ", pos=" + posName + ",可出库,准备创建工单");
LiteOrderItem item = new LiteOrderItem();
item.setRi(pos.getBarcode().getBarcode());
item.setNeedNum(1);
liteOrderItems.add(item);
}
}
LiteOrder liteOrder = tmsUtil.createOrder(requestCmd, requestID, liteOrderItems, soName, false, new ArrayList<>());
liteOrder = liteOrderCache.getLiteOrder(liteOrder.getOrderNo());
if (liteOrder != null) {
List<StoragePos> lockPosList = storagePosManager.findLockPos(liteOrder.getOrderNo());
for (StoragePos pos : lockPosList) {
posResultMap.put(pos.getPosName(), TMS_Code.CODE_2010);//准备出库
log.info(requestCmd + " : pos=" + pos.getPosName() + ",锁定成功,code=" + TMS_Code.CODE_2010);
}
}
//返回消息
List<Integer> rCodes = new ArrayList<>();
for (TMSPos tmsPos : Locations) {
String code = TMS_Code.CODE_1011;
String posName = tmsPos.getPosName();
if (posResultMap.containsKey(posName)) {
code = posResultMap.get(posName);
}
rCodes.add(Integer.parseInt(code));
}
ResponseDeliveryReserveByLocation(responseCmd, requestID, Locations, rCodes, liteOrder.getOrderNo());
OrderProEndUpdateState(requestCmd, requestID, liteOrder);
} catch (Exception exception) {
log.error(requestCmd + " error:" + exception.toString());
}
ResponseDeliveryReserveByLocation(responseCmd, requestID, Locations, new ArrayList<>(), "");
}
/**
* 3.18 RequestDeliveryReserveByReelCd
* @param requestID
* @param ReelCds
*/
private void RequestDeliveryReserveByReelCd(int requestID, List<String> ReelCds,List<String> rackList) {
String requestCmd = "RequestDeliveryReserveByReelCd";
String responseCmd = "ReponseDeliveryReserveByReelCd";
try {
if (rackList == null) {
rackList = new ArrayList<>();
}
Map<String, String> posResultMap = new HashMap<>();
if (ReelCds == null || ReelCds.size() <= 0) {
ResponseDeliveryOrderByReelCd(responseCmd, requestID, new ArrayList<>(), new ArrayList<>(), "");
return;
}
String soName = "DOR" + DateUtil.toDateString(new Date(), "yyyyMMddHHmmss");
List<LiteOrderItem> liteOrderItems = new ArrayList<>();
for (String ri : ReelCds) {
StoragePos pos = storagePosManager.getByBarcode(ri);
if (pos == null) {
posResultMap.put(ri, TMS_Code.CODE_2041);
log.info(requestCmd + " : ri=" + ri + ", 未找到物料,出库失败,code=" + TMS_Code.CODE_2041);
} else {
posResultMap.put(ri, TMS_Code.CODE_1011); //默认是开始送货时失败
LiteOrderItem item = new LiteOrderItem();
item.setRi(pos.getBarcode().getBarcode());
item.setNeedNum(1);
liteOrderItems.add(item);
log.info(requestCmd + " : ri=" + ri + ", 可出库,准备创建工单");
}
}
LiteOrder liteOrder = tmsUtil.createOrder(requestCmd, requestID, liteOrderItems, soName, false, rackList);
liteOrder = liteOrderCache.getLiteOrder(liteOrder.getOrderNo());
if (liteOrder != null) {
List<StoragePos> lockPosList = storagePosManager.findLockPos(liteOrder.getOrderNo());
for (StoragePos pos : lockPosList) {
posResultMap.put(pos.getBarcode().getBarcode(), TMS_Code.CODE_2010);//准备出库
log.info(requestCmd + " : barcode=" + pos.getBarcode().getBarcode() + ",锁定成功,code=" + TMS_Code.CODE_2010);
}
}
//返回消息
List<Integer> rCodes = new ArrayList<>();
for (String ri : ReelCds) {
String code = TMS_Code.CODE_1011;
if (posResultMap.containsKey(ri)) {
code = posResultMap.get(ri);
}
rCodes.add(Integer.parseInt(code));
}
ResponseDeliveryReserveByReelCd(responseCmd, requestID, ReelCds, rCodes, liteOrder.getOrderNo());
OrderProEndUpdateState(requestCmd, requestID, liteOrder);
} catch (Exception exception) {
log.error(requestCmd + " error:" + exception.toString());
}
ResponseDeliveryReserveByReelCd(responseCmd, requestID, ReelCds, new ArrayList<>(), "");
}
/**
* 3.14 RequestUpdateDeliveryReserveState
......@@ -1015,7 +1112,7 @@ public class TMSCommunicator implements WsMsgReceivedListener {
String reserveCode=reserveCodes.get(i);
Integer code=Convert.toInt(resultCodes.get(i)) ;
TMSReserve tmsReserve=ProcessOrder(reserveCode,code+"");
TMSReserve tmsReserve=tmsUtil.ProcessOrder(reserveCode,code+"");
ReserveList.add(tmsReserve);
}
}
......@@ -1026,82 +1123,6 @@ public class TMSCommunicator implements WsMsgReceivedListener {
}
private TMSReserve ProcessOrder(String reserveCode,String resultCode) {
TMSReserve tmsReserve = new TMSReserve();
tmsReserve.setReserveCode(reserveCode);
tmsReserve.setResultCode(resultCode);
tmsReserve.setPartList(new ArrayList<>());
List<TMSPart> tmsParts = new ArrayList<>();
if (resultCode.equals(TMS_Code.CODE_2012)||resultCode.equals(TMS_Code.CODE_2016)) {
tmsReserve.setResultCode(TMS_Code.CODE_2014);
LiteOrder order = liteOrderCache.getLiteOrder(reserveCode);
if (order != null) {
if (order.isOutBom() || order.isOutTails() || order.isOutOne()) {
log.info("ProcessOrder 准备取消工单:" + reserveCode + ",设置取消标记");
order.addAppendDate("cancel","true");
liteOrderManager.save(order);
liteOrderCache.addOrderToMap(order);
//查找工单的所有任务
Criteria c = Criteria.where("sourceName").is(order.getOrderNo()).and("type").is(2);
List<DataLog> dataLogs = dataLogManager.findByQuery(new Query(c));
for (DataLog task :
dataLogs) {
//是工单出库任务
if (task.isCheckOutTask() && task.getSourceName().equals(order.getOrderNo())) {
boolean cancelResult = false;
String logCode = TMS_Code.CODE_2014;//默认不能取消
if (task.isCancel()) {
logCode = TMS_Code.CODE_2012;//取消成功
} else if (task.isExecuting() || task.isWait()) {
//判断任务是否可取消
cancelResult = taskService.cancelTask(task.getId());
if (cancelResult) {
logCode = TMS_Code.CODE_2012;//取消成功
} else {
logCode = TMS_Code.CODE_2014;//取消失败
}
} else {
logCode = TMS_Code.CODE_2013;//已完成
}
log.info("RequestUpdateDeliveryReserveState 取消出库任务,工单:" + order.getOrderNo() + ", barcode:" + task.getBarcode() + ", taskID:" + task.getId() + "取消结果:" + cancelResult);
TMSPart part = TMSPart.newBean(tmsParts.size(), task.getPartNumber(), task.getBarcode(), task.getNum(), task.getNum(), logCode, task.getCid(), task.getPosName());
tmsParts.add(part);
}
}
//判断工单是否可以取消,
liteOrderCache.closeOrder(order.getOrderNo());
if (order.isClosed()) {
if ( resultCode.equals(TMS_Code.CODE_2016)) {
tmsReserve.setResultCode(TMS_Code.CODE_2016);//取消成功
}else {
tmsReserve.setResultCode(TMS_Code.CODE_2012);//取消成功
}
}else{
order.addAppendDate("cancel","");
liteOrderManager.save(order);
liteOrderCache.addOrderToMap(order);
log.info("ProcessOrder 取消工单失败,清空取消标记 ");
}
} else {
log.error("ProcessOrder 无法取消工单:" + reserveCode + ",未开始或已结束");
}
} else {
log.error("ProcessOrder 未找到工单号:" + reserveCode);
}
}
tmsReserve.setPartList(tmsParts);
return tmsReserve;
}
......@@ -1115,19 +1136,12 @@ public class TMSCommunicator implements WsMsgReceivedListener {
* @param Parts
* @param OrderCode
*/
public void ResponseDeliveryOrder(int requestID, List<TMSPart> Parts, String OrderCode,String ReserveCode) {
public void ResponseDeliveryOrder(String topic, int requestID, List<TMSPart> Parts, String OrderCode,String ReserveCode) {
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("Topic", "ResponseDeliveryOrder");
dataMap.put("Topic", topic);
dataMap.put("RequestID", requestID);
List<Map<String, Object>> arrayList = new ArrayList<>();
for (TMSPart Part : Parts) {
// Map<String, Object> dataMap2 = new HashMap<>();
// dataMap2.put("index", Part.index);
// dataMap2.put("PartName", Part.PartName);
// dataMap2.put("ReelCode", Part.ReelCode);
// dataMap2.put("RequestCount", Part.RequestCount);
// dataMap2.put("ResponseCount", Part.ResponseCount);
// dataMap2.put("ResultCode", Part.ResultCode);
arrayList.add(Part.getJson());
}
......@@ -1148,9 +1162,9 @@ public class TMSCommunicator implements WsMsgReceivedListener {
* @param ResultCodes
* @param OrderCode
*/
public void ResponseDeliveryOrderByLocation(int requestID, List<TMSPos> Locations, List<Integer> ResultCodes, String OrderCode) {
public void ResponseDeliveryOrderByLocation(String topic,int requestID, List<TMSPos> Locations, List<Integer> ResultCodes, String OrderCode) {
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("Topic", "ResponseDeliveryOrderByLocation");
dataMap.put("Topic", topic);
dataMap.put("RequestID", requestID);
List<Object> jArray = new ArrayList<>();
for (TMSPos pos : Locations) {
......@@ -1175,9 +1189,9 @@ public class TMSCommunicator implements WsMsgReceivedListener {
* @param ResultCodes
* @param OrderCode
*/
public void ResponseDeliveryOrderByReelCd(int requestID, List<String> ReelCds, List<Integer> ResultCodes, String OrderCode) {
public void ResponseDeliveryOrderByReelCd(String topic,int requestID, List<String> ReelCds, List<Integer> ResultCodes, String OrderCode) {
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("Topic", "ResponseDeliveryOrderByReelCd");
dataMap.put("Topic", topic);
dataMap.put("RequestID", requestID);
dataMap.put("ReelCds", ReelCds);
dataMap.put("ResultCodes", ResultCodes);
......@@ -1187,6 +1201,75 @@ public class TMSCommunicator implements WsMsgReceivedListener {
}
/**
* 3.15 ResponseDeliveryReserve
* @param requestID
* @param Parts
* @param OrderCode
*/
public void ResponseDeliveryReserve(String topic, int requestID, List<TMSPart> Parts, String OrderCode,String ReserveCode) {
ResponseDeliveryOrder(topic,requestID,Parts,OrderCode,ReserveCode);
// Map<String, Object> dataMap = new HashMap<>();
// dataMap.put("Topic", topic);
// dataMap.put("RequestID", requestID);
// List<Map<String, Object>> arrayList = new ArrayList<>();
// for (TMSPart Part : Parts) {
// arrayList.add(Part.getJson());
// }
//
// if(ObjectUtil.isEmpty(ReserveCode)){
// ReserveCode= OrderCode;
// }
//
// dataMap.put("PartList", arrayList);
// dataMap.put("OrderCode", OrderCode);
// dataMap.put("ReserveCode", ReserveCode);
// SendData(dataMap);
}
/**
* 3.17 ResponseDeliveryReserveByLocation
* @param requestID
* @param Locations
* @param ResultCodes
* @param OrderCode
*/
public void ResponseDeliveryReserveByLocation(String topic,int requestID, List<TMSPos> Locations, List<Integer> ResultCodes, String OrderCode) {
ResponseDeliveryReserveByLocation(topic,requestID,Locations,ResultCodes,OrderCode);
// Map<String, Object> dataMap = new HashMap<>();
// dataMap.put("Topic", topic);
// dataMap.put("RequestID", requestID);
// List<Object> jArray = new ArrayList<>();
// for (TMSPos pos : Locations) {
// jArray.add(pos.getJson());
// }
//
// dataMap.put("Locations", jArray);
// dataMap.put("ResultCodes", ResultCodes);
// dataMap.put("OrderCode", OrderCode);
// dataMap.put("ReserveCode", OrderCode);
// SendData(dataMap);
}
/**
* 3.19 ResponseDeliveryReserveByReelCd
* @param requestID
* @param ReelCds
* @param ResultCodes
* @param OrderCode
*/
public void ResponseDeliveryReserveByReelCd(String topic,int requestID, List<String> ReelCds, List<Integer> ResultCodes, String OrderCode) {
ResponseDeliveryOrderByReelCd(topic,requestID,ReelCds,ResultCodes, OrderCode);
// Map<String, Object> dataMap = new HashMap<>();
// dataMap.put("Topic", topic);
// dataMap.put("RequestID", requestID);
// dataMap.put("ReelCds", ReelCds);
// dataMap.put("ResultCodes", ResultCodes);
// dataMap.put("OrderCode", OrderCode);
// dataMap.put("ReserveCode", OrderCode);
// SendData(dataMap);
}
/**
* 3.15 ResponseUpdateDeliveryReserveState
* @param requestID
* @param ReserveList
......@@ -1208,15 +1291,6 @@ public class TMSCommunicator implements WsMsgReceivedListener {
List<Object> jArray2 = new ArrayList<>();
for (TMSPart part : Reserve.getPartList()) {
Map<String, Object> dataMap3 = new HashMap<>();
// dataMap3.put("Index", part.index);
// dataMap3.put("PartName", part.PartName);
// dataMap3.put("RequestCount", part.RequestCount);
// dataMap3.put("ResponseCount", part.ResponseCount);
// dataMap3.put("ResultCode", part.ResultCode);
// dataMap3.put("ReelCode", part.ReelCode);
// dataMap3.put("RackID", part.RackID);
// dataMap3.put("RowID", part.RowID);
// dataMap3.put("ColID", part.ColID);
jArray2.add(part.getAJson());
}
......@@ -1228,4 +1302,53 @@ public class TMSCommunicator implements WsMsgReceivedListener {
SendData(dataMap);
}
//[order]
//
// 4-1) Request Material to smart rack. : “API” RequestDeliveryOrder << Hanwha -> Smart Rack/Storage >>
//
// 4-2) Response about request : “API” ResponseDeliveryOrder
//
//4-3) Response about reservation information : “API” ResponseUpdateDeliveryReserveState ( History / state = 2011)
//
//
//
//[Reserve]
//
// 5-1) Reserve Material to smart rack : “API” RequestDeliveryReserve << Hanwha -> Smart Rack/Storage >>
//
// 5-2) Response about request : “API” ResponseDeliveryReserve
//
//5-3) Response about reservation information : “API” ResponseUpdateDeliveryReserveState ( History / state = 2010)
//
//
//
// We can change status reservation from Reserve to Order
//
//5-4) “API” RequestUpdateDeliveryReserveState ( code = 2011 ) << Hanwha -> Smart Rack / Storage>>
//
// 5-5) Responding to the result of cancellation request : “API” ResponseUpdateDeliveryReserveState ( History / state = 2011)
//
//
//
// You can synchronize in real time or synchronize all at once when dispensing materials
//
//6) Sync Material List : “API” RequestSyncPartReelPosInfo ( state = 0 )
//
//
//
// We can cancel the requested reservation.
//
// 7-1) “API” RequestUpdateDeliveryReserveState ( code = 2012 ) << Hanwha -> Smart Rack / Storage>>
//
// 7-2) Responding to the result of cancellation request : “API” ResponseUpdateDeliveryReserveState ( History / state = 2012)
//
//
//
// When all requested materials out from rack, the status of the reservation list must also be changed
//
//8) “API” ResponseUpdateDeliveryReserveState ( History / state = 2013)
}
package com.neotel.smfcore.custom.hanwha.handler;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.hanwha.handler.bean.TMSPart;
import com.neotel.smfcore.custom.hanwha.handler.bean.TMSReserve;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
public class TMSUtil {
@Autowired
private IDataLogManager dataLogManager;
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private LiteOrderCache liteOrderCache;
@Autowired
private DataCache dataCache;
@Autowired
private TaskService taskService;
public TMSReserve GetOrderInfo(LiteOrder liteOrder) {
TMSReserve tmsReserve = new TMSReserve();
tmsReserve.setReserveCode(liteOrder.getOrderNo());
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(liteOrder.getCreateDate());
tmsReserve.setDate(dateString);
List<TMSPart> tmsParts = new ArrayList<>();
//查找工单的所有任务
Criteria c = Criteria.where("sourceName").is(liteOrder.getOrderNo()).and("type").is(2);
List<DataLog> dataLogs = dataLogManager.findByQuery(new Query(c));
boolean hasCancelTask = false;
boolean allCancel = true;
for (DataLog task :
dataLogs) {
//是工单出库任务
if (task.isCheckOutTask() && task.getSourceName().equals(liteOrder.getOrderNo())) {
int responseNum = task.getNum();
String logCode = TMS_Code.CODE_2013;//默认已完成
if (task.isCancel()) {
hasCancelTask = true;
responseNum = 0;
logCode = TMS_Code.CODE_2012;//取消成功
} else if (task.isExecuting() || task.isWait()) {
logCode = TMS_Code.CODE_2011;//出库中
allCancel = false;
} else {
logCode = TMS_Code.CODE_2013;//已完成
allCancel = false;
}
TMSPart part = TMSPart.newBean(tmsParts.size(), task.getPartNumber(), task.getBarcode(), task.getNum(), responseNum, logCode, task.getCid(), task.getPosName());
tmsParts.add(part);
}
}
//有取消且有完成的返回2016.全部取消返回2012
if (liteOrder.isClosed()) {
//如果工单全部取消,需要发送2012
if (allCancel) {
tmsReserve.setResultCode(TMS_Code.CODE_2012);
} else if (hasCancelTask) {
//有取消任务返回2016
tmsReserve.setResultCode(TMS_Code.CODE_2016);
} else if (tmsParts.size() > 0) {
tmsReserve.setResultCode(TMS_Code.CODE_2013);
} else {
tmsReserve.setResultCode(TMS_Code.CODE_2001);
}
} else if (liteOrder.isOutOne() || liteOrder.isOutTails() || liteOrder.isOutOne()) {
tmsReserve.setResultCode(TMS_Code.CODE_2011);
} else if (liteOrder.isNew()) {
tmsReserve.setResultCode(TMS_Code.CODE_2010);
//查找锁定的物料
List<StoragePos> lockPosList = storagePosManager.findLockPos(liteOrder.getOrderNo());
for (StoragePos pos :
lockPosList) {
Barcode code = pos.getBarcode();
TMSPart part = TMSPart.newBean(tmsParts.size(), code.getPartNumber(), code.getBarcode(), code.getAmount(), code.getAmount(),
TMS_Code.CODE_2010, "", pos.getPosName());
tmsParts.add(part);
}
}
tmsReserve.setPartList(tmsParts);
return tmsReserve;
}
public LiteOrder createOrder(String requestCmd, int requestID, List<LiteOrderItem> items, String orderNo, boolean autoOut, List<String> rackList) {
if (items.size() <= 0) {
return null;
}
if (rackList == null) {
rackList = new ArrayList<>();
}
//判断是否有已执行的工单,有的话创建失败
Query query = new Query(Criteria.where("status").ne(LITEORDER_STATUS.CLOSED));
List<LiteOrder> orderList = liteOrderManager.findByQuery(query);
if (orderList.size() > 0) {
log.info(requestCmd + ": 当前有未关闭的工单" + orderList.size() + ",创建工单失败");
return null;
}
LiteOrder liteOrder = new LiteOrder(orderNo, items);
liteOrder.setSource("DeliveryOrder");
LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo());
if (dbOrder != null) {
orderNo = orderNo + "-" + requestID;
dbOrder = liteOrderManager.findByOrderNo(orderNo);
if (dbOrder == null) {
liteOrder.setOrderNo(orderNo);
} else {
log.info(requestCmd + " :数据库中已存在工单号为[" + orderNo + "],创建工单失败");
return null;
}
}
log.info(requestCmd + ":新建工单:" + liteOrder.getOrderNo() + ",共" + items.size() + "条工单详情,自动执行:" + autoOut);
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
if (autoOut) {
try {
liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false, false, true, rackList);
liteOrder = liteOrderCache.getLiteOrder(liteOrder.getOrderNo());
} catch (ValidateException ex) {
log.error(requestCmd + " 自动执行工单[" + liteOrder.getOrderNo() + "] error:" + ex.toString());
}
} else {
//先锁定物料
liteOrderCache.LiteOrderLockReel(liteOrder.getOrderNo(), false, false, true, rackList);
}
return liteOrder;
}
public List<TMSPart> GetReserveList(String requestCmd, LiteOrder liteOrder) {
List<StoragePos> lockPosList = storagePosManager.findLockPos(liteOrder.getOrderNo());
List<TMSPart> parts = new ArrayList<>();
for (LiteOrderItem item :
liteOrder.getOrderItems()) {
try {
int curroNum = 0;
for (StoragePos pos :
lockPosList) {
if (pos.getBarcode().getPartNumber().equals(item.getPn())) {
int requestNum = pos.getBarcode().getAmount();
curroNum += requestNum;
if (curroNum > item.getNeedNum()) {
requestNum = pos.getBarcode().getAmount() - (curroNum - item.getNeedNum());
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
//准备出库
TMSPart p = TMSPart.newBean(parts.size(), item.getPn(), pos.getBarcode().getBarcode(), requestNum, pos.getBarcode().getAmount(), TMS_Code.CODE_2010, storage.getCid(), pos.getPosName());
log.info(requestCmd + " pn=" + item.getPn() + ",锁定物料成功:code=" + TMS_Code.CODE_2010 + ",posName=" + pos.getPosName() + ",barcode=" + pos.getBarcode().getBarcode());
parts.add(p);
}
}
} catch (Exception ex) {
log.error(requestCmd + " " + item.getPn() + ",error::", ex.toString());
}
}
return parts;
}
public TMSReserve ProcessOrder(String reserveCode, String resultCode) {
TMSReserve tmsReserve = new TMSReserve();
tmsReserve.setReserveCode(reserveCode);
tmsReserve.setResultCode(resultCode);
tmsReserve.setPartList(new ArrayList<>());
List<TMSPart> tmsParts = new ArrayList<>();
if (resultCode.equals(TMS_Code.CODE_2012) || resultCode.equals(TMS_Code.CODE_2016)) {
tmsReserve.setResultCode(TMS_Code.CODE_2014);
LiteOrder order = liteOrderCache.getLiteOrder(reserveCode);
if (order != null) {
if (order.isOutBom() || order.isOutTails() || order.isOutOne()) {
log.info("ProcessOrder 准备取消工单:" + reserveCode + ",设置取消标记");
order.addAppendDate("cancel", "true");
liteOrderManager.save(order);
liteOrderCache.addOrderToMap(order);
//查找工单的所有任务
Criteria c = Criteria.where("sourceName").is(order.getOrderNo()).and("type").is(2);
List<DataLog> dataLogs = dataLogManager.findByQuery(new Query(c));
for (DataLog task :
dataLogs) {
//是工单出库任务
if (task.isCheckOutTask() && task.getSourceName().equals(order.getOrderNo())) {
boolean cancelResult = false;
String logCode = TMS_Code.CODE_2014;//默认不能取消
if (task.isCancel()) {
logCode = TMS_Code.CODE_2012;//取消成功
} else if (task.isExecuting() || task.isWait()) {
//判断任务是否可取消
cancelResult = taskService.cancelTask(task.getId());
if (cancelResult) {
logCode = TMS_Code.CODE_2012;//取消成功
} else {
logCode = TMS_Code.CODE_2014;//取消失败
}
} else {
logCode = TMS_Code.CODE_2013;//已完成
}
log.info("RequestUpdateDeliveryReserveState 取消出库任务,工单:" + order.getOrderNo() + ", barcode:" + task.getBarcode() + ", taskID:" + task.getId() + "取消结果:" + cancelResult);
TMSPart part = TMSPart.newBean(tmsParts.size(), task.getPartNumber(), task.getBarcode(), task.getNum(), task.getNum(), logCode, task.getCid(), task.getPosName());
tmsParts.add(part);
}
}
//判断工单是否可以取消,
liteOrderCache.closeOrder(order.getOrderNo());
if (order.isClosed()) {
if (resultCode.equals(TMS_Code.CODE_2016)) {
tmsReserve.setResultCode(TMS_Code.CODE_2016);//取消成功
} else {
tmsReserve.setResultCode(TMS_Code.CODE_2012);//取消成功
}
} else {
order.addAppendDate("cancel", "");
liteOrderManager.save(order);
liteOrderCache.addOrderToMap(order);
log.info("ProcessOrder 取消工单失败,清空取消标记 ");
}
} else {
log.error("ProcessOrder 无法取消工单:" + reserveCode + ",未开始或已结束");
}
} else {
log.error("ProcessOrder 未找到工单号:" + reserveCode);
}
} else if (reserveCode.equals(TMS_Code.CODE_2011)) {
tmsReserve.setResultCode(TMS_Code.CODE_2014);
//工单出库
LiteOrder order = liteOrderCache.getLiteOrder(reserveCode);
if (order != null) {
log.error("ProcessOrder 工单开始出库:" + reserveCode + "");
//工单出库
liteOrderCache.checkOutLiteOrder(order.getOrderNo(), false, false, true);
//查找工单的所有任务
Criteria c = Criteria.where("sourceName").is(order.getOrderNo()).and("type").is(2);
List<DataLog> dataLogs = dataLogManager.findByQuery(new Query(c));
for (DataLog task :
dataLogs) {
//是工单出库任务
if (task.isCheckOutTask() && task.getSourceName().equals(order.getOrderNo())) {
String logCode = TMS_Code.CODE_2011;
log.info("ProcessOrder 工单出库:" + order.getOrderNo() + ", barcode:" + task.getBarcode() + ", taskID:" + task.getId() + " ,postName=" + task.getPosName());
TMSPart part = TMSPart.newBean(tmsParts.size(), task.getPartNumber(), task.getBarcode(), task.getNum(), task.getNum(), logCode, task.getCid(), task.getPosName());
tmsParts.add(part);
}
}
} else {
log.error("ProcessOrder 未找到工单号:" + reserveCode);
}
}
tmsReserve.setPartList(tmsParts);
return tmsReserve;
}
public List<LiteOrderItem> partToItems(List<String> partItem, List<Integer> partCount) {
List<LiteOrderItem> liteOrderItems = new ArrayList<>();
int index = 0;
for (String pn : partItem) {
int count = Convert.toInt(partCount.get(index));
if (ObjectUtil.isNotEmpty(pn) && count > 0) {
LiteOrderItem item = new LiteOrderItem();
item.setPn(pn);
item.setNeedNum(count);
liteOrderItems.add(item);
}
index++;
}
return liteOrderItems;
}
public List<TMSPart> itemsToTMSPartList(List<LiteOrderItem> liteOrderItems) {
List<TMSPart> parts = new ArrayList<>();
for (LiteOrderItem item :
liteOrderItems) {
TMSPart p = TMSPart.newBean(parts.size(), item.getPn(), "", item.getNeedNum(), 0, TMS_Code.CODE_2014, "", "");
parts.add(p);
}
return parts;
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!