Commit b5bbc12e sunke

Merge remote-tracking branch 'origin/master'

2 个父辈 c56351d1 572aa503
...@@ -83,10 +83,10 @@ public class GlobalExceptionHandler { ...@@ -83,10 +83,10 @@ public class GlobalExceptionHandler {
@ExceptionHandler(value = ValidateException.class) @ExceptionHandler(value = ValidateException.class)
public ResponseEntity<ApiError> validateException(HttpServletRequest servlet,ValidateException e){ public ResponseEntity<ApiError> validateException(HttpServletRequest servlet,ValidateException e){
String language= servlet.getLocale().getLanguage(); // String language= servlet.getLocale().getLanguage();
// 打印堆栈信息 // 打印堆栈信息
//log.error(ThrowableUtil.getStackTrace(e)); //log.error(ThrowableUtil.getStackTrace(e));
String targetMsg=messageUtils.getText(e.getMsgKey(),e.getMsgParam(),new Locale(language) ,e.getDefaultMsg()); String targetMsg=messageUtils.getText(e.getMsgKey(),e.getMsgParam(),servlet.getLocale() ,e.getDefaultMsg());
return buildResponseEntity(ApiError.error(e.getStatus(),targetMsg)); return buildResponseEntity(ApiError.error(e.getStatus(),targetMsg));
} }
......
...@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.device.bean; ...@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.device.bean;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.neotel.smfcore.core.device.enums.BOX_STATUS; import com.neotel.smfcore.core.device.enums.BOX_STATUS;
import com.neotel.smfcore.core.system.service.po.AlarmInfo; import com.neotel.smfcore.core.system.service.po.AlarmInfo;
import lombok.ToString;
import java.util.*; import java.util.*;
...@@ -14,6 +15,7 @@ import java.util.*; ...@@ -14,6 +15,7 @@ import java.util.*;
3,IO报警,信号超时,io电器定义(电器定义), 3,IO报警,信号超时,io电器定义(电器定义),
4,电钢报警,1=上下电钢, 4,电钢报警,1=上下电钢,
*/ */
@ToString
public class StatusBean { public class StatusBean {
/// <summary> /// <summary>
......
...@@ -465,23 +465,24 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -465,23 +465,24 @@ public class BaseDeviceHandler implements IDeviceHandler {
} }
protected StatusBean handleInOutFinished(StatusBean statusBean) { protected StatusBean handleInOutFinished(StatusBean statusBean) {
// Map<Integer, BoxStatusBean> statusOfBoxes = statusBean.getBoxStatus(); Map<String, BoxStatusBean> statusOfBoxes = statusBean.getBoxStatus();
// if (statusOfBoxes != null) { if (statusOfBoxes != null) {
// for (BoxStatusBean boxStatus : statusOfBoxes.values()) { for (BoxStatusBean boxStatus : statusOfBoxes.values()) {
// try { try {
// //出库入库完成处理 //出库入库完成处理
// int status = boxStatus.getStatus(); int status = boxStatus.getStatus();
// String posName = boxStatus.getPosId(); String posName = boxStatus.getPosId();
// if (!Strings.isNullOrEmpty(posName)) {//客户端发一次完成之后,会发空的 posName,不需要处理 if (!Strings.isNullOrEmpty(posName)) {//客户端发一次完成之后,会发空的 posName,不需要处理
// if (BOX_STATUS.IN_FINISHED == status) {//入仓完成 if (BOX_STATUS.IN_FINISHED == status) {//入仓完成
// finishedPutIn(statusBean.getCid(),posName); finishedPutIn(statusBean.getCid(),posName);
// } else if (BOX_STATUS.IN_FAILED == status) {//入库失败 } else if (BOX_STATUS.IN_FAILED == status) {//入库失败
// //暂不处理 //暂不处理
// } else if (BOX_STATUS.OUT_FINISHED == status) {//出仓完成 } else if (BOX_STATUS.OUT_FINISHED == status) {//出仓完成
// finishedOutPos(statusBean.getCid(),posName); finishedOutPos(statusBean.getCid(),posName);
// } else if (BOX_STATUS.OUT_END == status) {//出库完成(放到仓门口 } else if (BOX_STATUS.OUT_END == status) {//出库完成(放到仓门口
// //暂不处理 //暂不处理
// } else if (BOX_STATUS.REWARM_TAKING_END == status) { }
// else if (BOX_STATUS.REWARM_TAKING_END == status) {
// //回温取料完成, 将库位清空 // //回温取料完成, 将库位清空
// DataLog takingTask = taskService.findExecutingTask(statusBean.getCid(), boxStatus.getPosId()); // DataLog takingTask = taskService.findExecutingTask(statusBean.getCid(), boxStatus.getPosId());
// if (takingTask == null) { // if (takingTask == null) {
...@@ -545,12 +546,12 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -545,12 +546,12 @@ public class BaseDeviceHandler implements IDeviceHandler {
// DataLog mixTask = findExecutingTask(statusBean.getCid(), boxStatus.getPosId()); // DataLog mixTask = findExecutingTask(statusBean.getCid(), boxStatus.getPosId());
// mixEnd(mixTask); // mixEnd(mixTask);
// } // }
// } }
// } catch (ValidateException e) { } catch (ValidateException e) {
// log.error("更新状态时出错" + e.getMessage()); log.error("更新状态时出错" + e.getMessage());
// } }
// } }
// } }
return statusBean; return statusBean;
} }
...@@ -794,9 +795,8 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -794,9 +795,8 @@ public class BaseDeviceHandler implements IDeviceHandler {
} }
@Override @Override
public DeviceType getDeviceType() { public DeviceType getDeviceType() {
return DeviceType.AUTO; return DeviceType.DEFAULT;
} }
} }
package com.neotel.smfcore.core.device.handler.impl;
import com.neotel.smfcore.core.device.api.IOpAuthApi;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.po.Storage;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@Service
@Slf4j
public class SisoBoxHandler extends BaseDeviceHandler {
public SisoBoxHandler(List<IOpAuthApi> apiList) {
super(apiList);
}
@Override
public StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request) {
String cid = statusBean.getCid();
Storage storage = dataCache.getStorage(cid);
if (storage == null) {
log.error("料仓cid: [" + cid + "]不存在");
return null;
}
handleMsg(statusBean);
statusBean = saveAlarmAndHumidity(statusBean);
statusBean = handleInOutFinished(statusBean);
StatusBean humidityResult = handleHumidity(statusBean);
if (humidityResult != null) {
return humidityResult;
}
if (statusBean.getOp() == OP.PUT_IN) {
log.debug("入库:" + statusBean.toString());
statusBean = putInLine(storage, statusBean);
} else {
//查看是否有要出库的操作
statusBean =taskService.checkOut(storage, statusBean);
}
return statusBean;
}
@Override
public DeviceType getDeviceType() {
return DeviceType.AUTO;
}
}
...@@ -88,8 +88,12 @@ public enum DeviceType { ...@@ -88,8 +88,12 @@ public enum DeviceType {
/** /**
* 13 SMD-DUO(DUO料仓) * 13 SMD-DUO(DUO料仓)
*/ */
SMD_DUO("storage.type.smdDuo") SMD_DUO("storage.type.smdDuo"),
/**
* 14 (默认料仓)
*/
DEFAULT("storage.type.default")
; ;
private String key; private String key;
......
...@@ -6,7 +6,9 @@ import com.google.common.collect.Maps; ...@@ -6,7 +6,9 @@ import com.google.common.collect.Maps;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.SecurityUtils; import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StorageConstants; import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.OP; import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS; import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
...@@ -29,6 +31,8 @@ public class TaskService { ...@@ -29,6 +31,8 @@ public class TaskService {
@Autowired @Autowired
protected IDataLogDao dataLogDao; protected IDataLogDao dataLogDao;
@Autowired
protected IBarcodeManager barcodeManager;
@Autowired @Autowired
private List<ITaskListener> taskListenerList = new ArrayList<>(); private List<ITaskListener> taskListenerList = new ArrayList<>();
...@@ -249,5 +253,131 @@ public class TaskService { ...@@ -249,5 +253,131 @@ public class TaskService {
} }
return null; return null;
} }
/**
* 是否有正在执行的任务
*
* @return
*/
private boolean hasExecutingTask(String cid, int type) {
for (DataLog task : taskMap.values()) {
if (type == task.getType() && task.getCid().equals(cid)) {
return true;
}
}
return false;
}
/**
* 为 box 分配出库任务
*/
private DataLog findCheckoutBoxTask(Storage storage) {
String cid=storage.getCid();
int checkoutSize = 0;
Collection<DataLog> allTasks = taskMap.values();
for (DataLog task : allTasks) {
if (!task.isCheckOutTask()) {
continue;
}
//如果该BOX在已执行任务中已经有入库任务,不再分配直接返回
if (cid.equals(task.getCid()) && task.isExecuting()) {
if (task.isPutInTask()) {
log.error("cid[" + cid + "]已有入库任务,不可再分配出库任务");
return null;
} else if (task.needReSendToClient() && task.isCheckOutTask()) {//超过30秒仍未完成的出库再次发送到客户端
log.error("cid[" + cid + "]的出库任务[" + task.getPosName() + "]超过60秒仍未完成,重新发送到客户端!");
task.setUpdateDate(new Date());
return task;
}
//只能同时有两个正在执行的出库任务,如果超过两个不再分配了
if (task.isCheckOutTask()) {
checkoutSize++;
if (checkoutSize >= 2) {
//log.error("cid["+cid + "]的BOX["+ boxId+"]的出库任务已经超过2个,不再分配!");
return null;
}
}
}
}
//指定紧急单盘出库的优先出库,否则按批量出库处理
DataLog singleOutTask = null;
DataLog outTask = null;
for (DataLog task : allTasks) {//优先分配单盘任务和没有工单的任务
if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) {
String posName = task.getPosName();
if (!Strings.isNullOrEmpty(posName)) {//有库位号
if (task.isSingleOut()) {
//单盘优先出库
if (singleOutTask == null || task.getCreateDate().before(singleOutTask.getCreateDate())) {
singleOutTask = task;
}
} else {
if (outTask == null || task.getCreateDate().before(outTask.getCreateDate())) {
outTask = task;
}
}
}
}
}
if (singleOutTask != null) {
log.info("分配优先(单盘或无工单)出库任务" + singleOutTask.getBarcode() + "[" + singleOutTask.getPosName() + "]到 " + cid);
return singleOutTask;
}
return outTask;
}
/**
* 出库处理
*/
public StatusBean checkOut(Storage storage,StatusBean statusBean ) {
try {
String cid = storage.getCid();
//有入库任务的料仓不分配出库任务
if (!hasExecutingTask(cid, OP.PUT_IN)) {
DataLog task = findCheckoutBoxTask(storage);
if (task != null) {
//从等待列表中删除,加入到执行列表中
log.info("分配出库任务" + task.getBarcode() + "[" + task.getPosName() + "]到 " + cid);
task.setStatus(OP_STATUS.EXECUTING.name());
taskMap.put(task.getId(), task);
task = dataLogDao.save(task);
statusBean.setOp(OP.CHECKOUT);
String posName = task.getPosName();
Barcode codeObj = barcodeManager.findByBarcode(task.getBarcode());
int plateW = 0;
int plateH = 0;
//是否是单盘出库,批量上下料使用
boolean isSingleOut = task.isSingleOut();
if (codeObj != null) {
plateW = codeObj.getPlateSize();
plateH = codeObj.getHeight();
if (codeObj.isOnlySingleOut()) {
log.info(codeObj.getBarcode() + " 只能单盘出库");
isSingleOut = true;
}
} else {
log.warn("出库无料仓位" + storage.getName() + "[" + posName + "]");
}
statusBean.addPosInfo(task.getBarcode(), posName, plateW, plateH, isSingleOut);
log.info("出库" + storage.getName() + "[" + posName + "]物料[" + task.getBarcode() + "]" + isSingleOut + "发送到客户端" + cid);
}
}
String posId = statusBean.getData().get("posId");
if (!Strings.isNullOrEmpty(posId)) {
log.info("SEQ:" + statusBean.getSeq() + "出库库位信息:[" + posId + "]发送到客户端");
}
} catch (Exception e) {
log.error("出库出错", e);
}
return statusBean;
}
} }
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!