Commit 6bc63691 sunke

西门子普通料架

1 个父辈 fe95fc30
......@@ -152,7 +152,7 @@ public class SmfApi {
}
}
return null;
return barcode;
}
public LiteOrder fetchOrder(String orderNumber, String username){
......
......@@ -52,6 +52,9 @@ public class NLShelfHandler extends BaseDeviceHandler {
@Autowired
private InListCache inListCache;
String putInColor = "green";
int delayCloseTime = 30000;
@Override
public StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request) {
statusBean.setClientIp(request.getRemoteHost());
......@@ -115,8 +118,9 @@ public class NLShelfHandler extends BaseDeviceHandler {
String psession=sessionId.substring(sessionId.length()-10);
log.info( psession+ "关闭上一个操作库位:"+ posToClose.getPosName());
operateBean.setPosToClose(null);
operateBean.setOpPos(null);
shelfPutInBeanMap.put(sessionId, operateBean);
opPosLight("close", posToClose, "",false);
opPosLight("close", posToClose, "");
}
}
......@@ -144,50 +148,54 @@ public class NLShelfHandler extends BaseDeviceHandler {
* @param pos
* @param colorStr
*/
private void opPosLight(String opKey, StoragePos pos, String colorStr,boolean neeCheck){
private void opPosLight(String opKey, StoragePos pos, String colorStr){
String opStr = pos.getPosName();
if(!Strings.isNullOrEmpty(colorStr)){
opStr =opStr+ "=" + colorStr;
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
if(neeCheck){
//判断库位是否有料,若已有料,不需要处理
StoragePos newPos=storagePosManager.get(pos.getId());
if(newPos.getBarcode()!=null){
log.info("自动关闭库位:"+ pos.getPosName()+"时,库位已有料,不需要处理自动关闭");
return;
}else{
log.info("自动关闭库位:"+ pos.getPosName());
}
}
DevicesStatusUtil.appendOp(storage.getCid(), opKey , opStr);
//log.info("操作库位["+pos.getPosName()+"]" + opKey + " : " + opStr);
log.info("操作库位["+pos.getPosName()+"]" + opKey + " : " + opStr);
}
/**
* 开灯, 等30秒后关闭
*/
private void openAndCloseLights(final String sessionId, final StoragePos pos, String color, final long delayCloseTime){
private void openAndCloseLights(final String token, final StoragePos pos, String color, final long delayCloseTime){
if(pos == null){
return;
}
final Storage storage = dataCache.getStorageById(pos.getStorageId());
final String cid = storage.getCid();
String lightOnStr = pos.getPosName() + "=" + color;
DevicesStatusUtil.appendOp(cid,"open", lightOnStr);
log.info("点亮库位:" + lightOnStr);
opPosLight("open",pos, color);
//30秒后灭灯
Thread closeTask = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(delayCloseTime);
// log.info("自动关闭库位:"+ pos.getPosName());
opPosLight("close", pos, "",true);
}catch (Exception e){
NLShelfOperateBean operateBean = getOperateBean(token);
StoragePos posToClose = operateBean.getPosToClose();
if(posToClose != null && posToClose.getPosName().equals(pos.getPosName())){
boolean autoClose = true;
Collection<DataLog> queueTasks = taskService.getQueueTasks();
for (DataLog queueTask : queueTasks) {
//如果有同一个库位正在执行的任务就不关闭了
if(queueTask.getPosName().equals(posToClose.getPosName())){
if(queueTask.isCheckOutTask()){
autoClose = false;
}
}
}
if(autoClose){
log.info("自动关闭库位:"+ posToClose.getPosName());
opPosLight("close", posToClose, "");
operateBean.setOpPos(null);
operateBean.setPosToClose(null);
shelfPutInBeanMap.put(token, operateBean);
}
}
}catch (Exception e){
log.error("自动关闭库位灯出错:" + e.getMessage());
}
}
});
......@@ -234,6 +242,7 @@ public class NLShelfHandler extends BaseDeviceHandler {
String token = tokenProvider.getToken(request);
String ptoken=token.substring(token.length()-10);
String loginUser = SecurityUtils.getLoginUsername();
log.info(storageId + "扫到条码["+code+"]" );
if (ObjectUtils.isEmpty(code)) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"code"});
}
......@@ -251,8 +260,6 @@ public class NLShelfHandler extends BaseDeviceHandler {
if (groupId != null && groupId.equals("-1")) {
groupId = "";
}
int delayCloseTime = 30000;
String putInColor = "green";
StoragePos pos = storagePosManager.getByPosName(code);
if(pos==null){
......@@ -264,9 +271,11 @@ public class NLShelfHandler extends BaseDeviceHandler {
}
}
if (pos != null) {
//扫描的为库位条码,先关掉上一个库位灯, 当前库位中没有物料的话点亮库位灯
closeLastPos(token);
//判断库位是否是对应设备或者租
if (currentStorage != null) {
if ( ! pos.getStorageId().equals(storageId)) {
if (!pos.getStorageId().equals(storageId)) {
return ResultBean.newErrorResult(1, "smfcore.shelf.pos.notInStorage", "料架[{0}]中未找到库位[{1}]", new String[]{currentStorage.getName(), pos.getPosName()});
}
} else {
......@@ -278,8 +287,6 @@ public class NLShelfHandler extends BaseDeviceHandler {
return ResultBean.newErrorResult(1, "smfcore.shelf.pos.notInGroup", "组中未找到库位[{0}]", new String[]{pos.getPosName()});
}
}
//扫描的为库位条码,先关掉上一个库位灯, 当前库位中没有物料的话点亮库位灯
closeLastPos(token);
if (pos.getBarcode() != null) {
return ResultBean.newErrorResult(1, "smfcore.shelf.msg.hasReel", "库位中[{0}]已有物料", new String[]{pos.getPosName()});
} else {
......@@ -288,144 +295,109 @@ public class NLShelfHandler extends BaseDeviceHandler {
NLShelfOperateBean operateBean = getOperateBean(token);
operateBean.setOpPos(pos);
operateBean.setPosToClose(pos);
operateBean.setNextPosId(null);
shelfPutInBeanMap.put(token, operateBean);
log.info(ptoken + ":库位[" + pos.getPosName() + "]操作成功,请扫描要放入的物料");
return ResultBean.newOkResult("smfcore.shelf.msg.tipScanReel", "库位[" + pos.getPosName() + "]操作成功,请扫描要放入的物料", new String[]{pos.getPosName()},pos.getPosName());
}
} else {
//扫的是物料条码
Barcode barcode = codeResolve.resolveOneValideBarcode("=1x1=" + code);
Date expireDate = barcode.getExpireDate();
if (expireDate != null) {
if (System.currentTimeMillis() > expireDate.getTime()) {
throw new ValidateException("smfcore.error.barcode.expired", "物料已过期,无法入库.");
}
//先判断库存中有没有此条码
ResultBean resultBean = outProcess(code,sourceId, loginUser);
if(resultBean != null){
return resultBean;
}
resultBean = putInProcess(code, token, loginUser);
if(resultBean != null){
return resultBean;
}
}
return ResultBean.newOkResult("");
}
try {
// if(barcode.getPlateSize() == 1){
// //长宽为1的需要弹框设置尺寸
// throw new ValidateException("error.barcode.errorSize","条码未设置尺寸");
// }
long now = System.currentTimeMillis();
//5秒内同一个条码忽略
Date usedDate = barcode.getUsedDate();
if (usedDate != null && now - usedDate.getTime() < 5000) {
return ResultBean.newErrorResult(1, "smfcore.shelf.msg.fastop", "条码操作频繁,请稍后再试");
}
StoragePos inPos = storagePosManager.getByBarcodeId(barcode.getId());
if (inPos != null) {
Collection<DataLog> allTasks = taskService.getQueueTasks();
for (DataLog task : allTasks) {
if (task.isCheckOutTask() && task.getBarcode() != null && task.getBarcode().equals(barcode.getBarcode())) {
if(ObjectUtil.isNotEmpty(sourceId) && !sourceId.equals(task.getSourceId())) {
LiteOrder liteOrder = liteOrderManager.get(sourceId);
if (liteOrder != null) {
return ResultBean.newErrorResult(1, "smfcore.shelf.error.orderError", "任务与指定工单[{0}]不一致", new String[]{liteOrder.getOrderNo()});
} else {
return ResultBean.newErrorResult(1, "smfcore.shelf.error.orderError", "任务与指定工单[{0}]不一致", new String[]{sourceId});
}
}
taskService.addTaskToFinished(inPos, null, loginUser);
opPosLight("close", inPos, null,false);
log.info(barcode.getBarcode() + " 出库完成, 库位[" + inPos.getPosName() + "]灭灯");
return ResultBean.newOkResult( "smfcore.shelf.msg.outConfirm", "出库完成, 库位[{0}]灭灯", new String[]{inPos.getPosName()} );
private ResultBean outProcess(String code, String sourceId, String loginUser){
StoragePos inPos = storagePosManager.getByBarcode(code);
if (inPos != null) {
Collection<DataLog> allTasks = taskService.getQueueTasks();
for (DataLog task : allTasks) {
if (task.isCheckOutTask() && task.getBarcode() != null && task.getBarcode().equals(code)) {
if(ObjectUtil.isNotEmpty(sourceId) && !sourceId.equals(task.getSourceId())) {
LiteOrder liteOrder = liteOrderManager.get(sourceId);
if (liteOrder != null) {
return ResultBean.newErrorResult(1, "smfcore.shelf.error.orderError", "任务与指定工单[{0}]不一致", new String[]{liteOrder.getOrderNo()});
} else {
return ResultBean.newErrorResult(1, "smfcore.shelf.error.orderError", "任务与指定工单[{0}]不一致", new String[]{sourceId});
}
}
return ResultBean.newErrorResult(1, "smfcore.shelf.msg.noTask", "操作失败,已在库位[{0}]中,未找到对应的出库任务", new String[]{inPos.getPosName()});
taskService.addTaskToFinished(inPos, null, loginUser);
opPosLight("close", inPos, "");
log.info(code + " 出库完成, 库位[" + inPos.getPosName() + "]灭灯");
return ResultBean.newOkResult( "smfcore.shelf.msg.outConfirm", "出库完成, 库位[{0}]灭灯", new String[]{inPos.getPosName()} );
}
}
return ResultBean.newErrorResult(1, "smfcore.shelf.msg.noTask", "操作失败,已在库位[{0}]中,未找到对应的出库任务", new String[]{inPos.getPosName()});
}
return null;
}
private ResultBean putInProcess(String code, String token,String loginUser){
String barcodeStr = "=1x1=" + code;
//扫的是物料条码
Barcode barcode = smfApi.canPutInBeforeResolve(barcodeStr);
if(barcode == null){
barcode = codeResolve.resolveOneValideBarcode(barcodeStr);
}
barcode = smfApi.canPutInAfterResolve(barcode);
if(barcode == null){
throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码",new String[]{code});
}
Date expireDate = barcode.getExpireDate();
if (expireDate != null) {
if (System.currentTimeMillis() > expireDate.getTime()) {
throw new ValidateException("smfcore.error.barcode.expired", "物料已过期,无法入库.");
}
}
//入库
NLShelfOperateBean operateBean = getOperateBean(token);
StoragePos opPos = operateBean.getOpPos();
currentStorage=dataCache.getStorageById(opPos.getStorageId());
if (opPos == null) {
//未扫描库位
String operatePosId = operateBean.getNextPosId();
if (Strings.isNullOrEmpty(operatePosId)) {
log.info(ptoken + ":条码[" +code+ "],请先扫描库位码");
return ResultBean.newErrorResult(1, "smfcore.shelf.msg.scanPos", "请先扫描库位码");
} else {
//有下一个库位
StoragePos currentPos = storagePosManager.get(String.valueOf(operatePosId));
if (currentPos != null) {
//入库单验证
ResultBean resultBean= inListCache.inListValidate(currentStorage.getInListName(),barcode.getPartNumber() );
if(!resultBean.isOkResult()){
return resultBean;
}
canBarcodePutInPos(currentPos, barcode);
//验证通过,先灭上一个库位灯
closeLastPos(token);
//打开下一个库位灯
openAndCloseLights(token, currentPos, putInColor, delayCloseTime);
taskService.addTaskToFinished(currentPos, barcode, loginUser);
operateBean.setOpPos(null);
operateBean.setPosToClose(currentPos);
Collection<String> operatingPosIds = taskService.excludePosIds();
StoragePos nextPos = storagePosManager.autoFindNextEmptyPos(currentStorage, operatingPosIds, currentPos);
String nextPosId = nextPos == null ? "null" : nextPos.getId() + "[" + nextPos.getPosName() + "]";
String data=nextPos == null ? "" : nextPos.getPosName();
//
operateBean.setNextPosId(null);
if (nextPos != null) {
operateBean.setNextPosId(nextPos.getId());
}
shelfPutInBeanMap.put(token, operateBean);
log.info(ptoken + ":条码[" + code + "]入库操作成功,请放入库位 [" + currentPos.getPosName() + "],下一个库位号:" + nextPosId);
return ResultBean.newOkResult("smfcore.shelf.msg.inOk", "操作成功,请放入库位[" + currentPos.getPosName() + "]", new String[]{currentPos.getPosName()}, data);
try {
long now = System.currentTimeMillis();
//5秒内同一个条码忽略
Date usedDate = barcode.getUsedDate();
if (usedDate != null && now - usedDate.getTime() < 5000) {
return ResultBean.newErrorResult(1, "smfcore.shelf.msg.fastop", "条码操作频繁,请稍后再试");
}
}
}
} else {
//入库单验证
ResultBean resultBean= inListCache.inListValidate(currentStorage.getInListName(),barcode.getPartNumber() );
if(!resultBean.isOkResult()){
return resultBean;
}
//已扫过库位
canBarcodePutInPos(opPos, barcode);
log.info(barcode.getPartNumber() + " [ " + barcode.getBarcode() + " ] " + "入库到:" + opPos.getPosName());
opPos.setCanCheckOutTime(System.currentTimeMillis() + delayCloseTime);
taskService.addTaskToFinished(opPos, barcode, loginUser);
//放入后不需要灭灯,也不需要亮灯,等下一个条码扫到时再灭灯
operateBean.setOpPos(null);
// Long nextPosId = Long.valueOf(opPos.getId()) + 1;
// operateBean.setNextPosId(String.valueOf(nextPosId));
// shelfPutInBeanMap.put(token, operateBean);
Collection<String> operatingPosIds = taskService.excludePosIds();
StoragePos nextPos = storagePosManager.autoFindNextEmptyPos(currentStorage, operatingPosIds, opPos);
String nextPosId = nextPos == null ? "null" : nextPos.getId() + "[" + nextPos.getPosName() + "]";
String data=nextPos == null ? "" : nextPos.getPosName();
//
operateBean.setNextPosId(null);
if (nextPos != null) {
operateBean.setNextPosId(nextPos.getId());
}
shelfPutInBeanMap.put(token, operateBean);
log.info(ptoken + ":条码["+code+"]入库操作成功,请放入库位 ["+opPos.getPosName()+"],下一个库位号:" + nextPosId);
return ResultBean.newOkResult("smfcore.shelf.msg.inOk", "操作成功,请放入库位["+opPos.getPosName()+"]", new String[]{opPos.getPosName()},data);
String ptoken=token.substring(token.length()-10);
//入库
NLShelfOperateBean operateBean = getOperateBean(token);
StoragePos opPos = operateBean.getOpPos();
if (opPos == null) {
//未扫描库位
log.info(ptoken + ":条码[" +code+ "],请先扫描库位码");
return ResultBean.newErrorResult(1, "smfcore.shelf.msg.scanPos", "请先扫描库位码");
} else {
Storage currentStorage=dataCache.getStorageById(opPos.getStorageId());
//入库单验证
ResultBean resultBean= inListCache.inListValidate(currentStorage.getInListName(),barcode.getPartNumber() );
if(!resultBean.isOkResult()){
return resultBean;
}
} catch (ValidateException e) {
log.error("Error:" + e.getMessage());
return ResultBean.newErrorResult(1, e.getMessage(), e.getMessage(), e.getMsgParam());
//已扫过库位
canBarcodePutInPos(opPos, barcode);
log.info(barcode.getPartNumber() + " [ " + barcode.getBarcode() + " ] " + "入库到:" + opPos.getPosName());
opPos.setCanCheckOutTime(System.currentTimeMillis() + delayCloseTime);
taskService.addTaskToFinished(opPos, barcode, loginUser);
//放入后不需要灭灯,也不需要亮灯,等下一个条码扫到时再灭灯
operateBean.setOpPos(null);
shelfPutInBeanMap.put(token, operateBean);
log.info(ptoken + ":条码["+code+"]入库操作成功,请放入库位 ["+opPos.getPosName()+"]" );
return ResultBean.newOkResult("smfcore.shelf.msg.inOk", "操作成功,请放入库位["+opPos.getPosName()+"]", new String[]{opPos.getPosName()},"");
}
} catch (ValidateException e) {
log.error("Error:" + e.getMessage());
return ResultBean.newErrorResult(1, e.getMessage(), e.getMessage(), e.getMsgParam());
}
return ResultBean.newOkResult("");
}
/**
* 获取料架的库位占用情况
*/
......
......@@ -132,12 +132,16 @@ public class MaterialController {
Sort.Order partNumberOrder = pageable.getSort().getOrderFor("partNumber");
if(partNumberOrder != null){
comparator = Comparator.comparing(InventoryItemDto::getPartNumber,Comparator.nullsFirst(String::compareTo));
if(stockCountOrder.isDescending()){
if(partNumberOrder.isDescending()){
comparator = comparator.reversed();
}
}
resultList = resultList.stream().sorted(comparator).collect(Collectors.toList());
// System.out.println("================");
// for (InventoryItemDto dto : resultList) {
// System.out.println(dto.getPartNumber() + "---" + dto.getStockCount() + " --- " + dto.getStockReel());
// }
return resultList;
}
......
......@@ -176,12 +176,14 @@ public class TaskService {
for (DataLog task : tasks) {
String barcode = taskToExecute.getBarcode();
String posName = taskToExecute.getPosName();
if (!Strings.isNullOrEmpty(barcode) && task.getBarcode().equals(barcode)) {
log.info("二维码:[" + barcode + "]已在操作队列中,操作失败");
throw new ValidateException("smfcore.error.barcode.inQueue", "二维码[{0}]已在操作队列中,操作失败", new String[]{barcode});
} else if (task.getPosName().equals(posName)&& ObjectUtil.isNotEmpty(posName)) {
log.info("位置:[" + posName + "]已在操作队列中,操作失败");
throw new ValidateException("smfcore.error.pos.inQueue", "位置:[{0}}]已在操作队列中,操作失败", new String[]{posName});
if(task.getType() == taskToExecute.getType()){
if (!Strings.isNullOrEmpty(barcode) && task.getBarcode().equals(barcode)) {
log.info("二维码:[" + barcode + "]已在操作队列中,操作失败");
throw new ValidateException("smfcore.error.barcode.inQueue", "二维码[{0}]已在操作队列中,操作失败", new String[]{barcode});
} else if (task.getPosName().equals(posName)&& ObjectUtil.isNotEmpty(posName)) {
log.info("位置:[" + posName + "]已在操作队列中,操作失败");
throw new ValidateException("smfcore.error.pos.inQueue", "位置:[{0}}]已在操作队列中,操作失败", new String[]{posName});
}
}
}
updateQueueTask(taskToExecute);
......
......@@ -21,13 +21,11 @@ import java.util.HashMap;
import java.util.Map;
/**
* Siemens
* #host: "140.231.193.101"
* port:
* #url: "http://cnctu04053:8014/api/JsonC"
* #url_checkIn: "http://cnctu04053:8014/api/JsonC"
* #url: "http://cnctu041p059:8014/api/JsonC"
* #url: "http://cnctu04053:8014/api/JsonC"
* api:
* name: Siemens
* inCheckUrl: http://cnctu04053:8014/api/JsonC
* outNotifyUrl: http://cnctu04053:8014/api/JsonC
* inNotifyUrl: http://cnctu04053:8014/api/JsonC
*
* action:
* GetMaterialLot: "http://siplace.com/facts/materiallot/2010/01/MaterialLot/GetMaterialLot"
......@@ -72,7 +70,6 @@ public class SiemensApi extends BaseSmfApiListener {
private static boolean lotInOut(String url, String lot,int inoutType) {
//String url=config.url;
if (ObjectUtil.isEmpty(url)) {
log.info("没有配置Siemens,无需通知");
......@@ -129,13 +126,15 @@ public class SiemensApi extends BaseSmfApiListener {
@Override
public Barcode canPutInBeforeResolve(String inCheckUrl, String codeStr) throws ValidateException {
if (ObjectUtil.isEmpty(inCheckUrl)) {
log.info("没有配置Siemens,无需验证");
return null;
}
try {
Collection<CodeBean> codeBeans = codeResolve.resolveCodeStr(codeStr, COMPONENT_TYPE.COMPONENT);
boolean ok = false;
for (CodeBean codebean : codeBeans) {
if (codebean.hasReelSizeInfo()) {
LotCheckInfo info = lotCheckIn(codebean.getCodeStr());
LotCheckInfo info = lotCheckIn(codebean.getCodeStr(),inCheckUrl);
if (info != null && info.isStatus() && ObjectUtil.isNotEmpty(info.getPartnum()) && ObjectUtil.isNotEmpty(info.getQuantity())) {
//查找元器件是否存在
com.neotel.smfcore.core.barcode.service.po.Component component = componentManager.findOneByPN(info.getPartnum());
......@@ -155,7 +154,7 @@ public class SiemensApi extends BaseSmfApiListener {
}
//判断条码是否存在
Barcode barcode = barcodeManager.get(codebean.getCodeStr());
Barcode barcode = barcodeManager.findByBarcode(codebean.getCodeStr());
if (barcode == null) {
barcode = new Barcode();
barcode.setPlateSize(component.getPlateSize());
......@@ -179,15 +178,14 @@ public class SiemensApi extends BaseSmfApiListener {
}
}
throw new ValidateException("siemens.barcode.failed","SIEMENS条码验证失败");
} catch (Exception ex) {
log.info("siemensCheckCode 验证条码 [" + codeStr + "] 出错:", ex);
throw new ValidateException("siemens.barcode.error","SIEMENS条码验证出错:" + ex.getMessage());
}
return null;
}
public static LotCheckInfo lotCheckIn(String lot) {
//String url = config.url_checkIn;
String url = "";
public static LotCheckInfo lotCheckIn(String lot, String url) {
if (ObjectUtil.isEmpty(url)) {
log.info("没有配置Siemens,无需验证");
return null;
......
......@@ -40,10 +40,16 @@ public class LotCheckInfo implements Serializable {
lotCheckInfo.setCode(map.get("Code").toString());
}
if (map.containsKey("partnum")) {
lotCheckInfo.setPartnum(map.get("partnum").toString());
Object partnum = map.get("partnum");
if(partnum != null){
lotCheckInfo.setPartnum(partnum.toString());
}
}
if (map.containsKey("quantity")) {
lotCheckInfo.setQuantity(Integer.parseInt(map.get("quantity").toString()));
Object quantity = map.get("quantity");
if(quantity != null){
lotCheckInfo.setQuantity(Integer.parseInt(quantity.toString()));
}
}
return lotCheckInfo;
}
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!