Commit dfab2370 LN

1053:1.料盘日志MaterialLog保存到数据库。2.唯一码重复入库时标记入库任务NG,入库完成后自动生成NG出库任务.

3.过期物料不能入库。4.物料日志导出英文修改。5.库位管理页面出库使用新接口。
1 个父辈 c169f7fb
...@@ -31,6 +31,8 @@ import java.util.*; ...@@ -31,6 +31,8 @@ import java.util.*;
@Component @Component
public class DataInitManager { public class DataInitManager {
public static Date startRunTime=new Date();
public static Set<String> allPermissionSet; public static Set<String> allPermissionSet;
@Value("${menu.show}") @Value("${menu.show}")
...@@ -72,6 +74,7 @@ public class DataInitManager { ...@@ -72,6 +74,7 @@ public class DataInitManager {
public void DataInit() { public void DataInit() {
try { try {
log.info("smfcore Version:["+version+"], 初始化环境..."); log.info("smfcore Version:["+version+"], 初始化环境...");
startRunTime=new Date();
//查询admin的用户是否存在 //查询admin的用户是否存在
String userName = Constants.SUPER_USERNAME; String userName = Constants.SUPER_USERNAME;
User admin = userManager.findByUserName(userName); User admin = userManager.findByUserName(userName);
......
...@@ -174,7 +174,7 @@ public class StatusBean { ...@@ -174,7 +174,7 @@ public class StatusBean {
* 提示信息是否超时(10秒)提示信息默认十分钟后不再显示 * 提示信息是否超时(10秒)提示信息默认十分钟后不再显示
* @return * @return
*/ */
public boolean msgTimeOut(){return (System.currentTimeMillis()-lastSaveTime)>(10*1000);} public boolean msgTimeOut(){return (System.currentTimeMillis()-time)>(10*1000);}
/** /**
* 获取客户端发送上来的二维码 * 获取客户端发送上来的二维码
...@@ -272,7 +272,7 @@ public class StatusBean { ...@@ -272,7 +272,7 @@ public class StatusBean {
data.put(key, valueStr); data.put(key, valueStr);
} }
public void addPosInfo(String barcode, String posId, int plateW, int plateH, boolean isSingleOut ){ public void addPosInfo(String barcode, String posId, int plateW, int plateH, boolean isSingleOut ){
addPosInfo(barcode,posId,plateW,plateH,isSingleOut,0); addPosInfo(barcode,posId,plateW,plateH,isSingleOut,false,0);
} }
/** /**
* 获取客户端发送上来的条码信息 * 获取客户端发送上来的条码信息
...@@ -283,7 +283,7 @@ public class StatusBean { ...@@ -283,7 +283,7 @@ public class StatusBean {
/** /**
* 入库时添加仓位及料盘大小信息(posId库位编号,plateW:料盘宽度,plateH:料盘高度,singleOut:是否出库到料仓门口) * 入库时添加仓位及料盘大小信息(posId库位编号,plateW:料盘宽度,plateH:料盘高度,singleOut:是否出库到料仓门口)
*/ */
public void addPosInfo(String barcode, String posId, int plateW, int plateH, boolean isSingleOut,int usedCount){ public void addPosInfo(String barcode, String posId, int plateW, int plateH, boolean isSingleOut,boolean isNgReel,int usedCount){
String originalPosId = data.get("posId"); String originalPosId = data.get("posId");
String originalPlateW = data.get("plateW"); String originalPlateW = data.get("plateW");
String originalPlateH = data.get("plateH"); String originalPlateH = data.get("plateH");
...@@ -313,6 +313,10 @@ public class StatusBean { ...@@ -313,6 +313,10 @@ public class StatusBean {
data.put("plateH",plateHStr); data.put("plateH",plateHStr);
data.put("barcode",barcodeStr); data.put("barcode",barcodeStr);
data.put("singleOut", isSingleOut+""); data.put("singleOut", isSingleOut+"");
data.put("ngReel",isNgReel+"");
if(isNgReel){
data.put("ngMsg","Repeat Inbound");
}
data.put("usedCount",usedCount+"" ); data.put("usedCount",usedCount+"" );
} }
......
...@@ -279,7 +279,7 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -279,7 +279,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
String posId = putInTask.getPosName(); String posId = putInTask.getPosName();
int plateW = barcodeSave.getPlateSize(); int plateW = barcodeSave.getPlateSize();
int plateH = barcodeSave.getHeight(); int plateH = barcodeSave.getHeight();
statusBean.addPosInfo(barcodeSave.getBarcode(), posId, plateW, plateH, false,barcodeSave.getUsedCount()); statusBean.addPosInfo(barcodeSave.getBarcode(), posId, plateW, plateH, false,false,barcodeSave.getUsedCount());
log.info(barcodeSave.getBarcode() + "[" + plateW + "x" + plateH + "]开始入库到" + storage.getCid() + "[" + posId + "]"); log.info(barcodeSave.getBarcode() + "[" + plateW + "x" + plateH + "]开始入库到" + storage.getCid() + "[" + posId + "]");
//清空展示的消息 //清空展示的消息
...@@ -699,6 +699,13 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -699,6 +699,13 @@ public class BaseDeviceHandler implements IDeviceHandler {
task.setStatus(OP_STATUS.FINISHED.name()); task.setStatus(OP_STATUS.FINISHED.name());
taskService.updateFinishedTask(task); taskService.updateFinishedTask(task);
//如果入库任务标记为NG,自动生成出库任务
if(task.isNgReel()){
Storage storage=dataCache.getStorageById(storagePos.getStorageId());
taskService.checkout(storage,storagePos,false,true,"","");
log.error("updatePutInData 入库任务["+storagePos.getBarcode()+"]["+storagePos.getPosName()+"]标记为NG,自动生成NG出库任务 " );
}
// //调用西门子接口 // //调用西门子接口
// SiemensApi.lotInOut(barcode.getBarcode(),1); // SiemensApi.lotInOut(barcode.getBarcode(),1);
...@@ -926,7 +933,7 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -926,7 +933,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
} else { } else {
log.warn("出库无料仓位" + storage.getName() + "[" + posName + "]"); log.warn("出库无料仓位" + storage.getName() + "[" + posName + "]");
} }
statusBean.addPosInfo(outTask.getBarcode(), posName, plateW, plateH, false); statusBean.addPosInfo(outTask.getBarcode(), posName, plateW, plateH, false,outTask.isNgReel(),0);
log.info("出库" + storage.getName() + "[" + posName + "]物料[" + outTask.getBarcode() + "] 发送到客户端" + storage.getCid()); log.info("出库" + storage.getName() + "[" + posName + "]物料[" + outTask.getBarcode() + "] 发送到客户端" + storage.getCid());
} }
return statusBean; return statusBean;
......
...@@ -16,6 +16,9 @@ import com.neotel.smfcore.core.device.bean.StatusBean; ...@@ -16,6 +16,9 @@ import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.BOX_STATUS; import com.neotel.smfcore.core.device.enums.BOX_STATUS;
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.language.util.MessageUtils;
import com.neotel.smfcore.core.materialLog.service.manager.IMaterialLogManager;
import com.neotel.smfcore.core.materialLog.service.po.MaterialLog;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil; import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.storage.enums.DeviceType; import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
...@@ -43,6 +46,8 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -43,6 +46,8 @@ public class RobotBoxHandler extends BaseDeviceHandler {
@Autowired @Autowired
private IAlarmInfoDao alarmInfoDao; private IAlarmInfoDao alarmInfoDao;
@Autowired
private IMaterialLogManager materialLogManager;
@Override @Override
public StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request) { public StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request) {
...@@ -262,6 +267,16 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -262,6 +267,16 @@ public class RobotBoxHandler extends BaseDeviceHandler {
@ResponseBody @ResponseBody
@AnonymousAccess @AnonymousAccess
public Map<String, Object> emptyPosForPutin(HttpServletRequest request) { public Map<String, Object> emptyPosForPutin(HttpServletRequest request) {
//返回:97=已有入库任务,需继续执行入库动作
//返回:98=已有出库任务,需继续执行出库动作
//返回:99=所在料仓有出库任务,暂停入库
//返回:104=未找到可用的仓位
//返回 105=查找空库位失败
//返回 106=唯一码已有入库任务
//返回 107=物料已过期,无法入库
String code = request.getParameter("code"); String code = request.getParameter("code");
String cids = request.getParameter("cids"); String cids = request.getParameter("cids");
String lastPosId = ""; String lastPosId = "";
...@@ -301,6 +316,16 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -301,6 +316,16 @@ public class RobotBoxHandler extends BaseDeviceHandler {
} else { } else {
try { try {
Barcode barcode = codeResolve.resolveOneValideBarcode(code); Barcode barcode = codeResolve.resolveOneValideBarcode(code);
if (barcode.getExpireDate() != null && System.currentTimeMillis() > barcode.getExpireDate().getTime()) {
// throw new ValidateException("smfcore.error.barcode.expired", "物料已过期,无法入库.");
//已有入库任务,返回NG,标记原来的入库任务
resultMap.put("result", "107");
errorMsg = "["+barcode.getBarcode()+"]"+MessageUtils.getText("smfcore.error.barcode.expired",new Locale("en","US"),"物料已过期,无法入库");
resultMap.put("msg", errorMsg);
log.error("物料["+barcode.getBarcode()+"]已过期,无法入库");
return resultMap;
}
for (DataLog dataLog : taskService.getQueueTasks()) { for (DataLog dataLog : taskService.getQueueTasks()) {
//已取消或已完成的任务不返回 //已取消或已完成的任务不返回
if(dataLog.isFinished()||dataLog.isCancel()){ if(dataLog.isFinished()||dataLog.isCancel()){
...@@ -308,18 +333,29 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -308,18 +333,29 @@ public class RobotBoxHandler extends BaseDeviceHandler {
} }
if (dataLog.getBarcode().equals(barcode.getBarcode())) { if (dataLog.getBarcode().equals(barcode.getBarcode())) {
if (dataLog.isPutInTask()) { if (dataLog.isPutInTask()) {
//已有入库任务 //已有入库任务,返回NG,标记原来的入库任务
errorMsg = "物料[" + dataLog.getBarcode() + "]已有入库任务,需继续执行入库动作"; resultMap.put("result", "106");
resultMap.put("result","97"); errorMsg = "Serial No.(S)[" + barcode.getBarcode() + "] already have storage task";
resultMap.put("msg", errorMsg); resultMap.put("msg", errorMsg);
resultMap.put("pos", dataLog.getPosName());
resultMap.put("barcode", barcode.getBarcode()); //原任务标记NG
resultMap.put("cid", dataLog.getCid()); dataLog.setNgReel(true);
resultMap.put("taskId", dataLog.getId()); log.info("获取[" + code + "]的入库库位,条码已有入库任务posname["+dataLog.getPosName()+"],标记入库任务为NG,入库后自动出库");
taskService.updateQueueTask(dataLog);
return resultMap; return resultMap;
// //已有入库任务
// errorMsg = "物料[" + dataLog.getBarcode() + "]已有入库任务,需继续执行入库动作";
// resultMap.put("result","97");
// resultMap.put("msg", errorMsg);
// resultMap.put("pos", dataLog.getPosName());
// resultMap.put("barcode", barcode.getBarcode());
// resultMap.put("cid", dataLog.getCid());
// resultMap.put("taskId", dataLog.getId());
// return resultMap;
} else { } else {
//已有出库任务 //已有出库任务
errorMsg = "物料[" + dataLog.getBarcode() + "]已有出库任务,需继续执行出库动作"; // errorMsg = "条码[" + dataLog.getBarcode() + "]已有出库任务,需继续执行出库动作";
errorMsg = "Serial No.(S)[" + dataLog.getBarcode() + "] already have outbound tasks,Continue with the outbound action";
resultMap.put("result", "98"); resultMap.put("result", "98");
resultMap.put("msg", errorMsg); resultMap.put("msg", errorMsg);
...@@ -338,6 +374,7 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -338,6 +374,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
boolean smallReel = barcode.isSmallReel(); boolean smallReel = barcode.isSmallReel();
resultMap.put("smallReel", smallReel + ""); resultMap.put("smallReel", smallReel + "");
resultMap.put("taskId", dataLog.getId()); resultMap.put("taskId", dataLog.getId());
log.info("条码[" + dataLog.getBarcode() + "]已有出库任务["+dataLog.getPosName()+"],需继续执行出库动作");
return resultMap; return resultMap;
} }
} }
...@@ -390,7 +427,8 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -390,7 +427,8 @@ public class RobotBoxHandler extends BaseDeviceHandler {
for (DataLog task : tasks) { for (DataLog task : tasks) {
if (task.isCheckOutTask() && task.getStorageId().equals(pos.getStorageId())) { if (task.isCheckOutTask() && task.getStorageId().equals(pos.getStorageId())) {
if ((!task.isFinished()) && (!task.isInRobot())&&(!task.isInLine()) ) { if ((!task.isFinished()) && (!task.isInRobot())&&(!task.isInLine()) ) {
errorMsg = "库位[" + pos.getPosName() + "]所在料仓有出库任务,暂停入库"; // errorMsg = "库位[" + pos.getPosName() + "]所在料仓有出库任务,暂停入库";
errorMsg = "PosName[" + pos.getPosName() + "]There are outgoing tasks in the silo, suspend storage";
lineMsg = errorMsg; lineMsg = errorMsg;
resultMap.put("result", "99"); resultMap.put("result", "99");
resultMap.put("msg", errorMsg); resultMap.put("msg", errorMsg);
...@@ -414,18 +452,30 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -414,18 +452,30 @@ public class RobotBoxHandler extends BaseDeviceHandler {
} else { } else {
resultMap.put("result", "104"); resultMap.put("result", "104");
errorMsg = "[" + barcode.getBarcode() + "]未找到可用的[" + barcode.getPlateSize() + "x" + barcode.getHeight() + "]仓位"; // 310*80 pcb 330*120 tray 386*86 shoe box 400*60 Pizza box 其他的都是料盘
String size = barcode.getPlateSize() + "x" + barcode.getHeight();
if (size.equals("310*80")) {
size = "pcb";
} else if (size.equals("330*120")) {
size = "tray";
} else if (size.equals("386*86")) {
size = "shoe box";
} else if (size.equals("400*70")) {
size = "Pizza box";
}
// errorMsg = "[" + barcode.getBarcode() + "]未找到可用的[" + barcode.getPlateSize() + "x" + barcode.getHeight() + "]仓位";
errorMsg = "[" + barcode.getBarcode() + "]Not found available[" + size + "]Position";
resultMap.put("msg", errorMsg); resultMap.put("msg", errorMsg);
} }
} catch (ValidateException ve) { } catch (ValidateException ve) {
errorMsg = ve.getMessage(); errorMsg = ve.getMessage();
log.info("查找空库位失败:" + errorMsg); log.info("Failed to find empty storage space:" + errorMsg);
resultMap.put("result", "105"); resultMap.put("result", "105");
resultMap.put("msg", errorMsg); resultMap.put("msg", errorMsg);
} catch (Exception e) { } catch (Exception e) {
errorMsg = e.getMessage(); errorMsg = e.getMessage();
log.info("查找空库位失败,", e); log.info("Failed to find empty storage space,", e);
resultMap.put("result", "105"); resultMap.put("result", "105");
resultMap.put("msg", errorMsg); resultMap.put("msg", errorMsg);
} }
...@@ -464,7 +514,7 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -464,7 +514,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
String barcode = request.getParameter("barcode"); String barcode = request.getParameter("barcode");
String statusStr = request.getParameter("status"); String statusStr = request.getParameter("status");
String locInfo = request.getParameter("locInfo"); String locInfo = request.getParameter("locInfo");
log.info("收到taskId["+taskId+"],料盘[" + barcode + "]更新位置指令[" + statusStr + "]=" + locInfo); log.info("收到taskId[" + taskId + "],料盘[" + barcode + "]更新位置指令[" + statusStr + "]=" + locInfo);
if (ObjectUtil.isEmpty(locInfo)) { if (ObjectUtil.isEmpty(locInfo)) {
locInfo = statusStr; locInfo = statusStr;
...@@ -472,20 +522,19 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -472,20 +522,19 @@ public class RobotBoxHandler extends BaseDeviceHandler {
DataLog opTask = null; DataLog opTask = null;
List<DataLog> allTasks = taskService.getAllTasks(); List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) { for (DataLog task : allTasks) {
if(task.isFinished()){ if (task.isFinished()) {
continue; continue;
} }
if(ObjectUtil.isNotEmpty(task)&&task.getId().equals(taskId)) { if (ObjectUtil.isNotEmpty(task) && task.getId().equals(taskId)) {
opTask = task; opTask = task;
break; break;
} } else if (ObjectUtil.isNotEmpty(barcode) && task.getBarcode().equals(barcode)) {
else if (ObjectUtil.isNotEmpty(barcode) && task.getBarcode().equals(barcode)) {
opTask = task; opTask = task;
break; break;
} }
} }
//如果任务为空,重新查找已完成的任务 //如果任务为空,重新查找已完成的任务
if(opTask == null) { if (opTask == null) {
for (DataLog task : allTasks) { for (DataLog task : allTasks) {
if (ObjectUtil.isNotEmpty(task) && task.getId().equals(taskId)) { if (ObjectUtil.isNotEmpty(task) && task.getId().equals(taskId)) {
opTask = task; opTask = task;
...@@ -497,50 +546,49 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -497,50 +546,49 @@ public class RobotBoxHandler extends BaseDeviceHandler {
} }
} }
if (opTask == null) { if (opTask == null) {
log.info(" taskId["+taskId+"],料盘[" + barcode + "]更新位置指令[" + statusStr + "]=" + locInfo+",失败:任务不存在"); log.info(" taskId[" + taskId + "],料盘[" + barcode + "]更新位置指令[" + statusStr + "]=" + locInfo + ",失败:任务不存在");
return ResultBean.newErrorResult(301, "smfcore.task.notExist", "任务不存在"); return ResultBean.newErrorResult(301, "smfcore.task.notExist", "任务不存在");
} }
if (opTask.isFinished()) { if (opTask.isFinished()) {
log.info(" taskId["+taskId+"],料盘[" + barcode + "]更新位置指令[" + statusStr + "]=" + locInfo+",失败:任务已完成"); log.info(" taskId[" + taskId + "],料盘[" + barcode + "]更新位置指令[" + statusStr + "]=" + locInfo + ",失败:任务已完成");
return ResultBean.newErrorResult(302, "smfcore.task.hasEnd", "任务已完成"); return ResultBean.newErrorResult(302, "smfcore.task.hasEnd", "任务已完成");
} }
if (opTask.isCancel()) { if (opTask.isCancel()) {
return ResultBean.newErrorResult(303, "smfcore.task.hasCancel", "更新状态时{0}的任务[{1}]已被取消", new String[]{opTask.getBarcode(), opTask.getId()}); return ResultBean.newErrorResult(303, "smfcore.task.hasCancel", "更新状态时{0}的任务[{1}]已被取消", new String[]{opTask.getBarcode(), opTask.getId()});
} }
statusStr = statusStr.toUpperCase(); statusStr = statusStr.toUpperCase();
String inouType=opTask.isCheckOutTask()? "出库":"入库"; String inouType = opTask.isCheckOutTask() ? "出库" : "入库";
log.info("更新料盘[" + barcode + "]的["+inouType+"]任务状态[" + opTask.getStatus() + "=" + opTask.getLocInfo() + "]为[" + statusStr + "=" + locInfo + "]"); //若已经在此状态,不需要再更新
opTask.setStatus(statusStr); if (opTask.getStatus().equals(statusStr) && opTask.getLocInfo().equals(locInfo)) {
opTask.setLocInfo(locInfo); log.warn("更新料盘[" + barcode + "]的[" + inouType + "]任务状态已是[" + opTask.getStatus() + "=" + opTask.getLocInfo() + "]不需要重复更新为[" + statusStr + "=" + locInfo + "]");
//如果是出库任务并且放到料仓门口,需要发送任务给料仓
// if(task.isInBelt() || task.isPackageReel()){
// //已经放上皮带线
// AppendInfo appendInfo = task.getAppendInfo();
// if(org.apache.logging.log4j.util.Strings.isBlank(appendInfo.gethSerial())){
// log.info("手动出库料盘["+barcode+"]放上皮带线或包装料架,结束任务");
// task.setStatus(StorageConstants.OP_STATUS.FINISHED.name());
// }else if(appendInfo.isCheckAction()){
// log.info("盘点料盘["+barcode+"]放上皮带线或包装料架,结束任务");
// task.setStatus(StorageConstants.OP_STATUS.FINISHED.name());
// //盘点料,出到皮带线上即算完成
// int slotSeq = appendInfo.getSlotIndex();
// int sendQty = task.getNum();
// outInfoCache.incTaskFinishNum(appendInfo.gethSerial(),slotSeq, sendQty);
// }
// }
if (opTask.isPutInTask()) {
taskService.updateQueueTask(opTask);
} else { } else {
if(opTask.isFinished()) { log.info("更新料盘[" + barcode + "]的[" + inouType + "]任务状态[" + opTask.getStatus() + "=" + opTask.getLocInfo() + "]为[" + statusStr + "=" + locInfo + "]");
taskService.removeQueueTask(opTask); opTask.setStatus(statusStr);
opTask.setLocInfo(locInfo);
if (opTask.isPutInTask()) {
taskService.updateQueueTask(opTask);
} else {
if (opTask.isFinished()) {
taskService.removeQueueTask(opTask);
}
taskService.updateFinishedTask(opTask);
}
try{
if (opTask.isInRobot() || opTask.isInLine() || opTask.isBoxdoor()) {
//保存状态
MaterialLog m = new MaterialLog(opTask.getBarcode(), opTask.getPosName(), opTask.getType(), opTask.getStatus(), opTask.getLocInfo());
log.info("记录料盘[" + inouType + "]日志[" + m.getBarcode() + "," + m.getPosName() + "," + m.getStatus() + "," + m.getLocInfo() + "]");
materialLogManager.save(m);
}}catch (Exception ex){
log.info("记录料盘[" + inouType + "]日志[" + opTask.getBarcode() + "," + opTask.getPosName() + "," + opTask.getStatus() + "," + opTask.getLocInfo() + "]出错:"+ex.getMessage());
} }
taskService.updateFinishedTask(opTask);
} }
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
......
...@@ -179,6 +179,11 @@ public class MessageUtils { ...@@ -179,6 +179,11 @@ public class MessageUtils {
public static String getSmfClientMsg(String code, Locale locale, String defaultMsg){ public static String getSmfClientMsg(String code, Locale locale, String defaultMsg){
LanguageMsg languageMsg = getMsg("smfclient",code); LanguageMsg languageMsg = getMsg("smfclient",code);
if(languageMsg==null){
//重新取一次
String nCode=code.replace("smfclient.","");
languageMsg = getMsg("smfclient",nCode);
}
if(languageMsg != null){ if(languageMsg != null){
String msg = languageMsg.getContent(locale.toLanguageTag()); String msg = languageMsg.getContent(locale.toLanguageTag());
if(!msg.isEmpty()){ if(!msg.isEmpty()){
......
package com.neotel.smfcore.core.materialLog.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
public interface IMaterialLogDao extends IBaseDao {
}
package com.neotel.smfcore.core.materialLog.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.core.materialLog.service.dao.IMaterialLogDao;
import com.neotel.smfcore.core.materialLog.service.po.MaterialLog;
import org.springframework.stereotype.Service;
@Service
public class MaterialLogDao extends AbstractBaseDao implements IMaterialLogDao {
@Override
public Class getEntityClass() {
return MaterialLog.class;
}
}
package com.neotel.smfcore.core.materialLog.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.materialLog.service.po.MaterialLog;
public interface IMaterialLogManager extends IBaseManager<MaterialLog> {
}
package com.neotel.smfcore.core.materialLog.service.manager.impl;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.materialLog.service.dao.IMaterialLogDao;
import com.neotel.smfcore.core.materialLog.service.manager.IMaterialLogManager;
import com.neotel.smfcore.core.materialLog.service.po.MaterialLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class MaterialLogManager implements IMaterialLogManager {
@Autowired
private IMaterialLogDao materialLogDao;
@Override
public MaterialLog get(String id) {
return materialLogDao.findOneById(id);
}
@Override
public MaterialLog save(MaterialLog object) throws ValidateException {
return materialLogDao.save(object);
}
@Override
public void delete(MaterialLog object) throws ValidateException {
materialLogDao.removeOneById(object.getId());
}
@Override
public PageData<MaterialLog> findByPage(Query query, Pageable pageable) {
int totalCount = materialLogDao.countByQuery(query);
List<MaterialLog> barcodes = materialLogDao.findByQuery(query, pageable);
return new PageData(barcodes, totalCount);
}
@Override
public List<MaterialLog> findByQuery(Query query) {
return materialLogDao.findByQuery(query);
}
}
package com.neotel.smfcore.core.materialLog.service.po;
import com.neotel.smfcore.common.base.BasePo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
@Data
@Document
@AllArgsConstructor
@NoArgsConstructor
public class MaterialLog extends BasePo implements Serializable {
private String barcode;
private String posName;
/**
* 类型:入库OP.PUT_IN,出库OP.CHECKOUT
*/
private int type;
/**
* 状态:OP_STATUS
*/
private String status;
/**
* 位置信息,如料架编号,托盘编号,移栽编号,皮带线编号,机器人编号等
*/
private String locInfo = "";
}
...@@ -416,7 +416,7 @@ public class StoragePosController { ...@@ -416,7 +416,7 @@ public class StoragePosController {
}); });
} }
@ApiOperation("出库操作") @ApiOperation("出库操作,不能空出")
@PutMapping("/checkout") @PutMapping("/checkout")
public ResultBean checkout(@Validated @RequestBody CheckOutDto checkOutDto) { public ResultBean checkout(@Validated @RequestBody CheckOutDto checkOutDto) {
...@@ -449,7 +449,7 @@ public class StoragePosController { ...@@ -449,7 +449,7 @@ public class StoragePosController {
// } // }
log.info("手动出库:出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】"); log.info("手动出库:出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkoutTest(storage, pos, isSingleOut,SecurityUtils.getCurrentUsername()); String outResult = taskService.checkout(storage, pos, isSingleOut,SecurityUtils.getCurrentUsername());
if (!Strings.isNullOrEmpty(outResult)) { if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult); throw new ValidateException("smfcore.error", outResult);
} }
...@@ -457,6 +457,46 @@ public class StoragePosController { ...@@ -457,6 +457,46 @@ public class StoragePosController {
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
@ApiOperation("库位管理页面出库,可以空出")
@PutMapping("/posCheckout")
public ResultBean posCheckout(@Validated @RequestBody CheckOutDto checkOutDto) {
if (checkOutDto.getPids() == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"ID"});
}
if (checkOutDto.getSingleOut() == null) {
checkOutDto.setSingleOut(true + "");
}
String isSingleOutStr = checkOutDto.getSingleOut();
boolean isSingleOut = Boolean.valueOf(isSingleOutStr);
for (String pid : checkOutDto.getPids()) {
StoragePos pos = storagePosManager.get(pid);
if (pos == null) {
//throw new ValidateException("smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"pid", pid});
// throw new ValidateException("位置[" + pid + "]不存在");
continue;
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
if (storage == null) {
throw new ValidateException("smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"storageId", pos.getStorageId()});
// throw new ValidateException("料仓[" + pos.getStorageId() + "]不存在");
}
// //西门子接口验证
// boolean result=SiemensApi.getMaterialLot(2, storage.getId(),storage.getName(),pos.getBarcode().getBarcode());
// if(!result) {
// throw new ValidateException("smfcore.error.getMaterialLot.out", "条码[{0}]验证失败,无法出库", new String[]{pos.getBarcode().getBarcode()});
// }
log.info("库位管理手动出库:出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkoutTest(storage, pos, isSingleOut,SecurityUtils.getCurrentUsername());
if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult);
}
}
return ResultBean.newOkResult("");
}
@ApiOperation("解析出库条码") @ApiOperation("解析出库条码")
@PutMapping("/resolveCode/{blurry}") @PutMapping("/resolveCode/{blurry}")
......
...@@ -116,6 +116,10 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog> ...@@ -116,6 +116,10 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
* 缺料补发(使用料串) * 缺料补发(使用料串)
*/ */
private boolean lessSendReel = false; private boolean lessSendReel = false;
/**
* NG物料:入料时条码重启获取库位号会NG
*/
private boolean ngReel = false;
/** /**
* 是否是包装料卷 * 是否是包装料卷
......
...@@ -77,11 +77,12 @@ public class DevicesStatusUtil { ...@@ -77,11 +77,12 @@ public class DevicesStatusUtil {
//和上个消息是否一样 //和上个消息是否一样
StatusBean msgBean=clientMsgs.get(cid); StatusBean msgBean=clientMsgs.get(cid);
if(msgBean!=null) { if(msgBean!=null) {
if (msgBean.msgTimeOut()) { // if (msgBean.msgTimeOut()) {
newMsg = true; // newMsg = true;
} else if (msgBean.getMsgCode().equals(msgCode) && msgBean.getMsg().equals(clientMsg)) { // } else
newMsg = false; if (msgBean.getMsgCode().equals(msgCode) && msgBean.getMsg().equals(clientMsg)) {
} newMsg = false;
}
} }
if(newMsg){ if(newMsg){
...@@ -112,7 +113,7 @@ public class DevicesStatusUtil { ...@@ -112,7 +113,7 @@ public class DevicesStatusUtil {
StatusBean statusBean = new StatusBean(); StatusBean statusBean = new StatusBean();
statusBean.setCid(cid); statusBean.setCid(cid);
statusBean.setLastSaveTime(System.currentTimeMillis()); statusBean.setTime(System.currentTimeMillis());
statusBean.setMsg(clientMsg); statusBean.setMsg(clientMsg);
statusBean.setMsgEn(clientMsgEn); statusBean.setMsgEn(clientMsgEn);
statusBean.setMsgCode(msgCode); statusBean.setMsgCode(msgCode);
......
...@@ -104,7 +104,7 @@ public class TaskService { ...@@ -104,7 +104,7 @@ public class TaskService {
* @return * @return
* @throws ValidateException * @throws ValidateException
*/ */
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName,String outType) throws ValidateException { public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut,boolean ngReel, String opUserName,String outType) throws ValidateException {
if (pos.getBarcode() == null) { if (pos.getBarcode() == null) {
String msg = "库位[" + pos.getPosName() + "]中已无物料,忽略"; String msg = "库位[" + pos.getPosName() + "]中已无物料,忽略";
log.info(msg); log.info(msg);
...@@ -117,6 +117,7 @@ public class TaskService { ...@@ -117,6 +117,7 @@ public class TaskService {
task.setPutInDate(pos.getBarcode().getPutInDate()); task.setPutInDate(pos.getBarcode().getPutInDate());
task.setStatus(OP_STATUS.WAIT.name()); task.setStatus(OP_STATUS.WAIT.name());
task.setSingleOut(isSingleOut); task.setSingleOut(isSingleOut);
task.setNgReel(ngReel);
task.setOperator(opUserName); task.setOperator(opUserName);
addTaskToExecute(task); addTaskToExecute(task);
return ""; return "";
...@@ -141,7 +142,7 @@ public class TaskService { ...@@ -141,7 +142,7 @@ public class TaskService {
return ""; return "";
} }
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName) throws ValidateException { public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName) throws ValidateException {
return checkout(storage,pos,isSingleOut,opUserName,""); return checkout(storage,pos,isSingleOut,false,opUserName,"");
} }
/** /**
* 触发任务状态改变事件 * 触发任务状态改变事件
......
...@@ -2,7 +2,9 @@ package com.neotel.smfcore.custom.micron1053.controller; ...@@ -2,7 +2,9 @@ package com.neotel.smfcore.custom.micron1053.controller;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.init.DataInitManager;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.message.rest.bean.dto.MessageDto; import com.neotel.smfcore.core.message.rest.bean.dto.MessageDto;
...@@ -11,6 +13,7 @@ import com.neotel.smfcore.core.message.rest.bean.query.MessageCriteria; ...@@ -11,6 +13,7 @@ import com.neotel.smfcore.core.message.rest.bean.query.MessageCriteria;
import com.neotel.smfcore.core.message.service.manager.IMessageManager; import com.neotel.smfcore.core.message.service.manager.IMessageManager;
import com.neotel.smfcore.core.message.service.po.Message; import com.neotel.smfcore.core.message.service.po.Message;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.custom.micron1053.bean.dto.DeviceUtilizationDto; import com.neotel.smfcore.custom.micron1053.bean.dto.DeviceUtilizationDto;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -64,6 +67,17 @@ public class MicronReportController { ...@@ -64,6 +67,17 @@ public class MicronReportController {
Message message = messageManager.findOne(query); Message message = messageManager.findOne(query);
if (message != null) { if (message != null) {
if (message.getMsgCode().equals("smfcore.messages.online")) {
//其实早已经离线
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null) {
//从软件启动开始离线
String msg = MessageUtils.getText("smfcore.messages.offline", servletRequest.getLocale(), "设备离线");
DeviceUtilizationDto dto = new DeviceUtilizationDto(message.getDeviceName(), msg, DataInitManager.startRunTime);
dtos.add(dto);
continue;
}
}
DeviceUtilizationDto dto = new DeviceUtilizationDto(message.getDeviceName(), message.getShowMsg(servletRequest.getLocale()), message.getUpdateDate()); DeviceUtilizationDto dto = new DeviceUtilizationDto(message.getDeviceName(), message.getShowMsg(servletRequest.getLocale()), message.getUpdateDate());
dtos.add(dto); dtos.add(dto);
} }
...@@ -74,6 +88,7 @@ public class MicronReportController { ...@@ -74,6 +88,7 @@ public class MicronReportController {
@ApiOperation("ErrorLog:错误数据列表") @ApiOperation("ErrorLog:错误数据列表")
@GetMapping("/errorLog") @GetMapping("/errorLog")
@AnonymousAccess
public PageData<MessageDto> errorLog(MessageCriteria criteria, Pageable pageable, HttpServletRequest request){ public PageData<MessageDto> errorLog(MessageCriteria criteria, Pageable pageable, HttpServletRequest request){
criteria.setType("error"); criteria.setType("error");
......
...@@ -140,7 +140,7 @@ public class MicronSpUnloadController { ...@@ -140,7 +140,7 @@ public class MicronSpUnloadController {
throw new ValidateException("smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"storageId", pos.getStorageId()}); throw new ValidateException("smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"storageId", pos.getStorageId()});
} }
log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】"); log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkout(storage, pos, true, SecurityUtils.getCurrentUsername(), MInOutType.WITHDRAWN); String outResult = taskService.checkout(storage, pos, true,false, SecurityUtils.getCurrentUsername(), MInOutType.WITHDRAWN);
if (!Strings.isNullOrEmpty(outResult)) { if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult); throw new ValidateException("smfcore.error", outResult);
} }
...@@ -180,7 +180,7 @@ public class MicronSpUnloadController { ...@@ -180,7 +180,7 @@ public class MicronSpUnloadController {
if (barcode != null) { if (barcode != null) {
log.info("removal 料仓【" + storage.getName() + "_" + storage.getCid() + "】仓位【" + pos.getPosName() + "】 returnMaterial 成功,开始出库"); log.info("removal 料仓【" + storage.getName() + "_" + storage.getCid() + "】仓位【" + pos.getPosName() + "】 returnMaterial 成功,开始出库");
try { try {
String outResult = taskService.checkout(storage, pos, isSingleOut, SecurityUtils.getCurrentUsername(),MInOutType.REMOVED); String outResult = taskService.checkout(storage, pos, isSingleOut,false, SecurityUtils.getCurrentUsername(),MInOutType.REMOVED);
if (!Strings.isNullOrEmpty(outResult)) { if (!Strings.isNullOrEmpty(outResult)) {
// throw new ValidateException("smfcore.error", outResult); // throw new ValidateException("smfcore.error", outResult);
log.error("removal 料仓【" + storage.getName() + "_" + storage.getCid() + "】仓位【" + pos.getPosName() + "】 returnMaterial 成功,出库失败: "+outResult); log.error("removal 料仓【" + storage.getName() + "_" + storage.getCid() + "】仓位【" + pos.getPosName() + "】 returnMaterial 成功,出库失败: "+outResult);
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!