Commit c5e87e4d LN

科博达移库逻辑修改

1 个父辈 2bbb59bd
......@@ -50,6 +50,7 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.List;
@Slf4j
......@@ -702,6 +703,121 @@ public class DeviceController {
}
// @ApiOperation("获取需要移动的库位是否有料")
// @RequestMapping("/service/store/needMovePosHasReel")
// @ResponseBody
// @AnonymousAccess
// public ResultBean needMovePosHasReel(@RequestBody Map<String, String> paramMap) {
// String checkOutPosName = paramMap.get("checkOutPosName");
// String needMovePosName = paramMap.get("needMovePosName");
// log.info("出库的库位为:"+checkOutPosName+",需要移动的库位为:"+needMovePosName);
// StoragePos checkOutPos = storagePosManager.getByPosName(checkOutPosName);
// if (checkOutPos == null) {
// return ResultBean.newErrorResult(-1, "smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"posName", checkOutPosName});
// }
// StoragePos needMovePos = storagePosManager.getByPosName(needMovePosName);
// if (needMovePos == null) {
// return ResultBean.newErrorResult(-1, "smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"posName", needMovePosName});
// }
//
// //如果barcode不为空,则提前锁定目标库位
// boolean hasReel = true;
// Barcode barcode = needMovePos.getBarcode();
// if (barcode != null) {
// Storage storage = dataCache.getStorageById(checkOutPos.getStorageId());
// ReelLockPosInfo reelLocInfo = new ReelLockPosInfo();
// reelLocInfo.setBarcode(barcode.getBarcode());
// reelLocInfo.setCid(storage.getCid());
// reelLocInfo.setLockPosName(checkOutPos.getPosName());
// reelLocInfo.setLockPosId(checkOutPos.getId());
// ReelLockPosUtil.addReelLockPosInfo(reelLocInfo, Arrays.asList(storage.getCid()));
// log.info("提前锁定库位:" + checkOutPos.getPosName() + ",barcode为:" + barcode.getBarcode());
// } else {
// hasReel = false;
// }
//
// Map<String, Object> resultMap = new HashMap<>();
// resultMap.put("hasReel", hasReel);
// if (hasReel){
// resultMap.put("barcode", barcode.getBarcode());
// resultMap.put("partNumber",barcode.getPartNumber());
// }
// return ResultBean.newOkResult(resultMap);
// }
//
//
// @ApiOperation("移动物料到另外一个库位")
// @RequestMapping("/service/store/moveToOtherPos")
// @ResponseBody
// @AnonymousAccess
// public ResultBean moveToOtherPos(@RequestBody Map<String, String> paramMap) {
// String needMovePosName = paramMap.get("needMovePosName"); //需要移动的库位
// String targetPosName = paramMap.get("targetPosName"); //目标库位
// log.info("需要移动的库位为:" + needMovePosName + ",目标库位为:" + targetPosName);
//
// //判断有没有物料
// StoragePos needMovePos = storagePosManager.getByPosName(needMovePosName);
// Barcode barcode = needMovePos.getBarcode();
// if (barcode == null) {
// return ResultBean.newErrorResult(-1, "smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{needMovePosName, "barcode"});
// }
//
// //判断目标库位是否存在
// StoragePos targetPos = storagePosManager.getByPosName(targetPosName);
// if (targetPos == null) {
// return ResultBean.newErrorResult(-1, "smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"posName", targetPosName});
// }
//
// //把外侧相同的任务给改成内侧的
// List<DataLog> allTasks = taskService.getAllTasks();
// for (DataLog dataLog : allTasks) {
// if (dataLog.isCheckOutTask()) {
// if (!dataLog.isFinished() && !dataLog.isCancel()) {
// if (dataLog.getPosId().equals(needMovePos.getId())) {
// dataLog.setPosId(targetPos.getId());
// dataLog.setPosName(targetPos.getPosName());
// taskService.updateQueueTask(dataLog);
// log.info(dataLog.getBarcode()+":外测有任务,原始库位为:"+dataLog.getPosName()+"更改后的库位为:"+targetPos.getPosName());
// break;
// }
// }
// }
// }
//
// //生成一条出库任务
// Storage storage = dataCache.getStorageById(needMovePos.getStorageId());
// DataLog needMovePosTask = new DataLog(storage, barcode, needMovePos);
// needMovePosTask.setOperator("admin-move");
// needMovePosTask.setType(OP.CHECKOUT);
// needMovePosTask.setStatus(OP_STATUS.FINISHED.name());
// taskService.updateFinishedTask(needMovePosTask);
// needMovePos.setBarcode(null);
// needMovePos.setUsed(false);
// storagePosManager.save(needMovePos);
// log.info(barcode.getBarcode() + "转移库位,清空仓位: " + needMovePos.getId() + "[" + needMovePos.getPosName() + "]");
// dataCache.updateInventory(needMovePos, barcode);
//
//
//
// //生成一条入库任务
// DataLog targetPosTask = new DataLog(storage, barcode, targetPos);
// targetPosTask.setOperator("admin-move");
// targetPosTask.setType(OP.PUT_IN);
// targetPosTask.setStatus(OP_STATUS.FINISHED.name());
// taskService.updateFinishedTask(targetPosTask);
// targetPos.setBarcode(barcode);
// targetPos.setUsed(true);
// targetPos.setCanCheckOutTime(System.currentTimeMillis());
// storagePosManager.save(targetPos);
// log.info(barcode.getBarcode() + "转移库位,入库库位: " + needMovePos.getId() + "[" + needMovePos.getPosName() + "]");
// dataCache.updateInventory(targetPos, barcode);
//
// //解除库位绑定
// ReelLockPosUtil.removeReelLockPosInfo(barcode.getBarcode());
//
// return ResultBean.newOkResult("");
// }
@ApiOperation("获取需要移动的库位是否有料")
@RequestMapping("/service/store/needMovePosHasReel")
@ResponseBody
......@@ -722,15 +838,86 @@ public class DeviceController {
//如果barcode不为空,则提前锁定目标库位
boolean hasReel = true;
Barcode barcode = needMovePos.getBarcode();
String posName="";
if (barcode != null) {
Storage storage = dataCache.getStorageById(checkOutPos.getStorageId());
// Storage storage = dataCache.getStorageById(checkOutPos.getStorageId());
// ReelLockPosInfo reelLocInfo = new ReelLockPosInfo();
// reelLocInfo.setBarcode(barcode.getBarcode());
// reelLocInfo.setCid(storage.getCid());
// reelLocInfo.setLockPosName(checkOutPos.getPosName());
// reelLocInfo.setLockPosId(checkOutPos.getId());
// ReelLockPosUtil.addReelLockPosInfo(reelLocInfo, Arrays.asList(storage.getCid()));
// log.info("提前锁定库位:" + checkOutPos.getPosName() + ",barcode为:" + barcode.getBarcode());
//有料,先查找锁定的lockS库位,有的话返回
ReelLockPosInfo lockPosInfo= ReelLockPosUtil.getLockPosInfoByCode(Constants.XLR_lockPosS);
if(lockPosInfo!=null&&ObjectUtil.isNotEmpty(lockPosInfo.getLockPosName())){
posName=lockPosInfo.getLockPosName();
log.info("查找到锁定的内侧库位为目标库位:"+posName+" ");
}
else{
lockPosInfo=ReelLockPosUtil.getLockPosInfoByCode(Constants.XLR_lockPos);
if(lockPosInfo!=null&&ObjectUtil.isNotEmpty(lockPosInfo.getLockPosName())){
posName=lockPosInfo.getLockPosName();
log.info("查找到锁定的外侧库位为目标库位:"+posName+" ");
}else{
//查找一个库位号
StoragePos pos = null;
int loopCount=0;
List<Storage> storageList=new ArrayList<>();
Storage storage=dataCache.getStorageById(needMovePos.getStorageId());
storageList.add(storage);
List<String> cidList=new ArrayList<>();
cidList.add(storage.getCid());
while (pos == null){
loopCount++;
if(loopCount>=10 ){
log.info(barcode.getBarcode()+"已循环查找10次 直接跳出循环");
}
pos = taskService.findEmptyPosForPutIn(storageList, barcode, "", "");
if (pos == null){
break;
}
//如果是以S结尾的,则判断不带S的有没有料
posName = pos.getPosName();
String wPosName="";
if (posName.endsWith("S") || posName.endsWith("s")){
log.info(posName+"以S结尾,需要判断外层有没有物料");
wPosName = posName.substring(0,posName.length()-1);
StoragePos storagePos = storagePosManager.getByPosName(wPosName);
if (storagePos != null){
if (storagePos.getBarcode() != null){
log.info("查找到目标库位:"+pos.getPosName()+" 的外侧库位"+wPosName+"有物料信息,重新查找库位 ");
ReelLockPosInfo reelLocInfo = new ReelLockPosInfo();
reelLocInfo.setBarcode(barcode.getBarcode());
reelLocInfo.setCid(storage.getCid());
reelLocInfo.setLockPosName(checkOutPos.getPosName());
reelLocInfo.setLockPosId(checkOutPos.getId());
ReelLockPosUtil.addReelLockPosInfo(reelLocInfo, Arrays.asList(storage.getCid()));
log.info("提前锁定库位:" + checkOutPos.getPosName() + ",barcode为:" + barcode.getBarcode());
reelLocInfo.setBarcode(pos.getId());
reelLocInfo.setCid(dataCache.getStorageById(pos.getStorageId()).getCid());
reelLocInfo.setLockPosName(pos.getPosName());
reelLocInfo.setLockPosId(pos.getId());
ReelLockPosUtil.addReelLockPosInfo(reelLocInfo,cidList);
pos = null;
posName="";
}else {
log.info("查找到目标库位:"+pos.getPosName()+" 且外侧库位" + wPosName + "无料,锁定两个库位 :" + pos.getPosName() + "=" + Constants.XLR_lockPosS + ",wPosName=" + Constants.XLR_lockPos);
//是内侧库位,且外侧库位也无料,锁定两个库位
AddLock(pos,Constants.XLR_lockPosS,cidList);
AddLock(storagePos,Constants.XLR_lockPos,cidList);
}
}
}else {
//是外侧库位,直接锁定外侧库位
log.info("查找到外侧库位作为目标库位,锁定库位 :" + pos.getPosName() + "=" + Constants.XLR_lockPos);
AddLock(pos,Constants.XLR_lockPos,cidList);
}
}
}
}
//然后找lock库位,有的话返回
//没库位查找一个库位,如果是里面的,判断外面需要没料
//如果是外面的锁定为Lock
} else {
hasReel = false;
}
......@@ -740,10 +927,24 @@ public class DeviceController {
if (hasReel){
resultMap.put("barcode", barcode.getBarcode());
resultMap.put("partNumber",barcode.getPartNumber());
if(ObjectUtil.isEmpty(posName)){
return ResultBean.newErrorResult(-1, "smfcore.shelf.msg.inError", "未找到适合[{0}]的库位", new String[]{"posName", needMovePosName});
}else{
resultMap.put("posName", posName);
}
}
return ResultBean.newOkResult(resultMap);
}
private void AddLock(StoragePos pos,String key,List<String> cidList) {
ReelLockPosInfo lockS = new ReelLockPosInfo();
lockS.setBarcode(key);
lockS.setCid(dataCache.getStorageById(pos.getStorageId()).getCid());
lockS.setLockPosName(pos.getPosName());
lockS.setLockPosId(pos.getId());
ReelLockPosUtil.addReelLockPosInfo(lockS, cidList);
}
@ApiOperation("移动物料到另外一个库位")
@RequestMapping("/service/store/moveToOtherPos")
......@@ -776,7 +977,7 @@ public class DeviceController {
dataLog.setPosId(targetPos.getId());
dataLog.setPosName(targetPos.getPosName());
taskService.updateQueueTask(dataLog);
log.info(dataLog.getBarcode()+":外测有任务,原始库位为:"+dataLog.getPosName()+"更改后的库位为:"+targetPos.getPosName());
log.info(dataLog.getBarcode() + ":外测有任务,原始库位为:" + dataLog.getPosName() + "更改后的库位为:" + targetPos.getPosName());
break;
}
}
......@@ -797,7 +998,6 @@ public class DeviceController {
dataCache.updateInventory(needMovePos, barcode);
//生成一条入库任务
DataLog targetPosTask = new DataLog(storage, barcode, targetPos);
targetPosTask.setOperator("admin-move");
......@@ -814,6 +1014,44 @@ public class DeviceController {
//解除库位绑定
ReelLockPosUtil.removeReelLockPosInfo(barcode.getBarcode());
ReelLockPosInfo lockS = ReelLockPosUtil.getLockPosInfoByCode(Constants.XLR_lockPosS);
if (lockS != null && ObjectUtil.isNotEmpty(lockS.getLockPosName()) && lockS.getLockPosName().equals(targetPosName)) {
ReelLockPosUtil.removeReelLockPosInfo(Constants.XLR_lockPosS);
} else {
ReelLockPosInfo lock = ReelLockPosUtil.getLockPosInfoByCode(Constants.XLR_lockPos);
if (lock != null && ObjectUtil.isNotEmpty(lock.getLockPosName()) && lock.getLockPosName().equals(targetPosName)) {
ReelLockPosUtil.removeReelLockPosInfo(Constants.XLR_lockPos);
lock = null;
}
if ( lock == null) {
if (needMovePosName.endsWith("S") || needMovePosName.endsWith("s")) {
log.info("需要移动的库位为:" + needMovePosName + "是内侧库位,不需要锁定库位");
} else {
String sPosname = needMovePosName + "S";
StoragePos sPos = storagePosManager.getByPosName(sPosname);
if (sPos != null) {
String cid = dataCache.getStorageById(sPos.getStorageId()).getCid();
List<String> cidList = new ArrayList<>();
cidList.add(cid);
//如果两个库位锁定都为空了,将当前库位锁定为缓存库位
log.info("重新锁定两个缓存库位 :" + sPos.getPosName() + "=" + Constants.XLR_lockPosS + ","+needMovePos.getPosName()+"=" + Constants.XLR_lockPos);
//是内侧库位,且外侧库位也无料,锁定两个库位
AddLock(sPos,Constants.XLR_lockPosS,cidList);
AddLock(needMovePos,Constants.XLR_lockPos,cidList);
}
}
}
}
return ResultBean.newOkResult("");
}
......
......@@ -222,11 +222,13 @@ public class TMSCommunicator implements WsMsgReceivedListener {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 在这里编写您要执行的方法逻辑
// 同步数据
List<String> cids= new ArrayList<>(dataCache.getAllStorage().keySet());
SyncStorageConnectionInfo(cids.toArray(new String[cids.size()]),new Integer[]{});
List<Map<String, StoragePos>> allUsedPoss= dataCache.getAllUsedPosMap();
SyncReelData(allUsedPoss);
// List<TMSPart> result= tmsApis.RequestGetPartInfo(0,"20180126153040-001");
}
});
......@@ -296,6 +298,7 @@ public class TMSCommunicator implements WsMsgReceivedListener {
return;
}
log.info("WebSocket 已连接,开始同步物料信息");
List<TMSPartReelPos> list = new ArrayList<>();
for (Map<String, StoragePos> map : allUsedPosList) {
......@@ -304,7 +307,6 @@ public class TMSCommunicator implements WsMsgReceivedListener {
if (pos.getBarcode() == null) {
continue;
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
if(storage==null){
log.error("posName["+pos.getPosName()+"],storageId["+pos.getStorageId()+"]未找到料仓");
......@@ -315,6 +317,9 @@ public class TMSCommunicator implements WsMsgReceivedListener {
storage.getCid(), pos.getPosName(), 4, barcode.getPutInDate().getTime(), -1);
list.add(bean);
if(list.size()>=10){
break;
}
}
}
......@@ -422,6 +427,8 @@ public class TMSCommunicator implements WsMsgReceivedListener {
TMSDockingCartInfo dockingCartInfo = getMapValue(msgMap, "DockingCartInfo");
RequestPrintLabelDockingCart(requestID, dockingCartInfo);
break;
case "NotifyLog":
break;
default:
log.error("onMsgReceived:未找到对应的TOPIC: Topic=["+topic+"],requestID=["+requestID+"],message:["+message+"]");
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!