Commit dfab2370 LN

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

3.过期物料不能入库。4.物料日志导出英文修改。5.库位管理页面出库使用新接口。
1 个父辈 c169f7fb
......@@ -31,6 +31,8 @@ import java.util.*;
@Component
public class DataInitManager {
public static Date startRunTime=new Date();
public static Set<String> allPermissionSet;
@Value("${menu.show}")
......@@ -72,6 +74,7 @@ public class DataInitManager {
public void DataInit() {
try {
log.info("smfcore Version:["+version+"], 初始化环境...");
startRunTime=new Date();
//查询admin的用户是否存在
String userName = Constants.SUPER_USERNAME;
User admin = userManager.findByUserName(userName);
......
......@@ -174,7 +174,7 @@ public class StatusBean {
* 提示信息是否超时(10秒)提示信息默认十分钟后不再显示
* @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 {
data.put(key, valueStr);
}
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 {
/**
* 入库时添加仓位及料盘大小信息(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 originalPlateW = data.get("plateW");
String originalPlateH = data.get("plateH");
......@@ -313,6 +313,10 @@ public class StatusBean {
data.put("plateH",plateHStr);
data.put("barcode",barcodeStr);
data.put("singleOut", isSingleOut+"");
data.put("ngReel",isNgReel+"");
if(isNgReel){
data.put("ngMsg","Repeat Inbound");
}
data.put("usedCount",usedCount+"" );
}
......
......@@ -279,7 +279,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
String posId = putInTask.getPosName();
int plateW = barcodeSave.getPlateSize();
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 + "]");
//清空展示的消息
......@@ -699,6 +699,13 @@ public class BaseDeviceHandler implements IDeviceHandler {
task.setStatus(OP_STATUS.FINISHED.name());
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);
......@@ -926,7 +933,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
} else {
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());
}
return 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.OP;
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.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.po.Storage;
......@@ -43,6 +46,8 @@ public class RobotBoxHandler extends BaseDeviceHandler {
@Autowired
private IAlarmInfoDao alarmInfoDao;
@Autowired
private IMaterialLogManager materialLogManager;
@Override
public StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request) {
......@@ -262,6 +267,16 @@ public class RobotBoxHandler extends BaseDeviceHandler {
@ResponseBody
@AnonymousAccess
public Map<String, Object> emptyPosForPutin(HttpServletRequest request) {
//返回:97=已有入库任务,需继续执行入库动作
//返回:98=已有出库任务,需继续执行出库动作
//返回:99=所在料仓有出库任务,暂停入库
//返回:104=未找到可用的仓位
//返回 105=查找空库位失败
//返回 106=唯一码已有入库任务
//返回 107=物料已过期,无法入库
String code = request.getParameter("code");
String cids = request.getParameter("cids");
String lastPosId = "";
......@@ -301,6 +316,16 @@ public class RobotBoxHandler extends BaseDeviceHandler {
} else {
try {
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()) {
//已取消或已完成的任务不返回
if(dataLog.isFinished()||dataLog.isCancel()){
......@@ -308,18 +333,29 @@ public class RobotBoxHandler extends BaseDeviceHandler {
}
if (dataLog.getBarcode().equals(barcode.getBarcode())) {
if (dataLog.isPutInTask()) {
//已有入库任务
errorMsg = "物料[" + dataLog.getBarcode() + "]已有入库任务,需继续执行入库动作";
resultMap.put("result","97");
//已有入库任务,返回NG,标记原来的入库任务
resultMap.put("result", "106");
errorMsg = "Serial No.(S)[" + barcode.getBarcode() + "] already have storage task";
resultMap.put("msg", errorMsg);
resultMap.put("pos", dataLog.getPosName());
resultMap.put("barcode", barcode.getBarcode());
resultMap.put("cid", dataLog.getCid());
resultMap.put("taskId", dataLog.getId());
//原任务标记NG
dataLog.setNgReel(true);
log.info("获取[" + code + "]的入库库位,条码已有入库任务posname["+dataLog.getPosName()+"],标记入库任务为NG,入库后自动出库");
taskService.updateQueueTask(dataLog);
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 {
//已有出库任务
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("msg", errorMsg);
......@@ -338,6 +374,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
boolean smallReel = barcode.isSmallReel();
resultMap.put("smallReel", smallReel + "");
resultMap.put("taskId", dataLog.getId());
log.info("条码[" + dataLog.getBarcode() + "]已有出库任务["+dataLog.getPosName()+"],需继续执行出库动作");
return resultMap;
}
}
......@@ -390,7 +427,8 @@ public class RobotBoxHandler extends BaseDeviceHandler {
for (DataLog task : tasks) {
if (task.isCheckOutTask() && task.getStorageId().equals(pos.getStorageId())) {
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;
resultMap.put("result", "99");
resultMap.put("msg", errorMsg);
......@@ -414,18 +452,30 @@ public class RobotBoxHandler extends BaseDeviceHandler {
} else {
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);
}
} catch (ValidateException ve) {
errorMsg = ve.getMessage();
log.info("查找空库位失败:" + errorMsg);
log.info("Failed to find empty storage space:" + errorMsg);
resultMap.put("result", "105");
resultMap.put("msg", errorMsg);
} catch (Exception e) {
errorMsg = e.getMessage();
log.info("查找空库位失败,", e);
log.info("Failed to find empty storage space,", e);
resultMap.put("result", "105");
resultMap.put("msg", errorMsg);
}
......@@ -464,7 +514,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
String barcode = request.getParameter("barcode");
String statusStr = request.getParameter("status");
String locInfo = request.getParameter("locInfo");
log.info("收到taskId["+taskId+"],料盘[" + barcode + "]更新位置指令[" + statusStr + "]=" + locInfo);
log.info("收到taskId[" + taskId + "],料盘[" + barcode + "]更新位置指令[" + statusStr + "]=" + locInfo);
if (ObjectUtil.isEmpty(locInfo)) {
locInfo = statusStr;
......@@ -472,20 +522,19 @@ public class RobotBoxHandler extends BaseDeviceHandler {
DataLog opTask = null;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if(task.isFinished()){
if (task.isFinished()) {
continue;
}
if(ObjectUtil.isNotEmpty(task)&&task.getId().equals(taskId)) {
if (ObjectUtil.isNotEmpty(task) && task.getId().equals(taskId)) {
opTask = task;
break;
}
else if (ObjectUtil.isNotEmpty(barcode) && task.getBarcode().equals(barcode)) {
} else if (ObjectUtil.isNotEmpty(barcode) && task.getBarcode().equals(barcode)) {
opTask = task;
break;
}
}
//如果任务为空,重新查找已完成的任务
if(opTask == null) {
if (opTask == null) {
for (DataLog task : allTasks) {
if (ObjectUtil.isNotEmpty(task) && task.getId().equals(taskId)) {
opTask = task;
......@@ -497,50 +546,49 @@ public class RobotBoxHandler extends BaseDeviceHandler {
}
}
if (opTask == null) {
log.info(" taskId["+taskId+"],料盘[" + barcode + "]更新位置指令[" + statusStr + "]=" + locInfo+",失败:任务不存在");
log.info(" taskId[" + taskId + "],料盘[" + barcode + "]更新位置指令[" + statusStr + "]=" + locInfo + ",失败:任务不存在");
return ResultBean.newErrorResult(301, "smfcore.task.notExist", "任务不存在");
}
if (opTask.isFinished()) {
log.info(" taskId["+taskId+"],料盘[" + barcode + "]更新位置指令[" + statusStr + "]=" + locInfo+",失败:任务已完成");
log.info(" taskId[" + taskId + "],料盘[" + barcode + "]更新位置指令[" + statusStr + "]=" + locInfo + ",失败:任务已完成");
return ResultBean.newErrorResult(302, "smfcore.task.hasEnd", "任务已完成");
}
if (opTask.isCancel()) {
return ResultBean.newErrorResult(303, "smfcore.task.hasCancel", "更新状态时{0}的任务[{1}]已被取消", new String[]{opTask.getBarcode(), opTask.getId()});
}
statusStr = statusStr.toUpperCase();
String inouType=opTask.isCheckOutTask()? "出库":"入库";
log.info("更新料盘[" + barcode + "]的["+inouType+"]任务状态[" + opTask.getStatus() + "=" + opTask.getLocInfo() + "]为[" + statusStr + "=" + locInfo + "]");
opTask.setStatus(statusStr);
opTask.setLocInfo(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);
// }
// }
String inouType = opTask.isCheckOutTask() ? "出库" : "入库";
//若已经在此状态,不需要再更新
if (opTask.getStatus().equals(statusStr) && opTask.getLocInfo().equals(locInfo)) {
log.warn("更新料盘[" + barcode + "]的[" + inouType + "]任务状态已是[" + opTask.getStatus() + "=" + opTask.getLocInfo() + "]不需要重复更新为[" + statusStr + "=" + locInfo + "]");
if (opTask.isPutInTask()) {
taskService.updateQueueTask(opTask);
} else {
if(opTask.isFinished()) {
taskService.removeQueueTask(opTask);
log.info("更新料盘[" + barcode + "]的[" + inouType + "]任务状态[" + opTask.getStatus() + "=" + opTask.getLocInfo() + "]为[" + statusStr + "=" + locInfo + "]");
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("");
......
......@@ -179,6 +179,11 @@ public class MessageUtils {
public static String getSmfClientMsg(String code, Locale locale, String defaultMsg){
LanguageMsg languageMsg = getMsg("smfclient",code);
if(languageMsg==null){
//重新取一次
String nCode=code.replace("smfclient.","");
languageMsg = getMsg("smfclient",nCode);
}
if(languageMsg != null){
String msg = languageMsg.getContent(locale.toLanguageTag());
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 {
});
}
@ApiOperation("出库操作")
@ApiOperation("出库操作,不能空出")
@PutMapping("/checkout")
public ResultBean checkout(@Validated @RequestBody CheckOutDto checkOutDto) {
......@@ -449,7 +449,7 @@ public class StoragePosController {
// }
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)) {
throw new ValidateException("smfcore.error", outResult);
}
......@@ -457,6 +457,46 @@ public class StoragePosController {
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("解析出库条码")
@PutMapping("/resolveCode/{blurry}")
......
......@@ -116,6 +116,10 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
* 缺料补发(使用料串)
*/
private boolean lessSendReel = false;
/**
* NG物料:入料时条码重启获取库位号会NG
*/
private boolean ngReel = false;
/**
* 是否是包装料卷
......
......@@ -77,11 +77,12 @@ public class DevicesStatusUtil {
//和上个消息是否一样
StatusBean msgBean=clientMsgs.get(cid);
if(msgBean!=null) {
if (msgBean.msgTimeOut()) {
newMsg = true;
} else if (msgBean.getMsgCode().equals(msgCode) && msgBean.getMsg().equals(clientMsg)) {
newMsg = false;
}
// if (msgBean.msgTimeOut()) {
// newMsg = true;
// } else
if (msgBean.getMsgCode().equals(msgCode) && msgBean.getMsg().equals(clientMsg)) {
newMsg = false;
}
}
if(newMsg){
......@@ -112,7 +113,7 @@ public class DevicesStatusUtil {
StatusBean statusBean = new StatusBean();
statusBean.setCid(cid);
statusBean.setLastSaveTime(System.currentTimeMillis());
statusBean.setTime(System.currentTimeMillis());
statusBean.setMsg(clientMsg);
statusBean.setMsgEn(clientMsgEn);
statusBean.setMsgCode(msgCode);
......
......@@ -104,7 +104,7 @@ public class TaskService {
* @return
* @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) {
String msg = "库位[" + pos.getPosName() + "]中已无物料,忽略";
log.info(msg);
......@@ -117,6 +117,7 @@ public class TaskService {
task.setPutInDate(pos.getBarcode().getPutInDate());
task.setStatus(OP_STATUS.WAIT.name());
task.setSingleOut(isSingleOut);
task.setNgReel(ngReel);
task.setOperator(opUserName);
addTaskToExecute(task);
return "";
......@@ -141,7 +142,7 @@ public class TaskService {
return "";
}
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;
import cn.hutool.core.util.ObjectUtil;
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.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.message.rest.bean.dto.MessageDto;
......@@ -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.po.Message;
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.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
......@@ -64,6 +67,17 @@ public class MicronReportController {
Message message = messageManager.findOne(query);
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());
dtos.add(dto);
}
......@@ -74,6 +88,7 @@ public class MicronReportController {
@ApiOperation("ErrorLog:错误数据列表")
@GetMapping("/errorLog")
@AnonymousAccess
public PageData<MessageDto> errorLog(MessageCriteria criteria, Pageable pageable, HttpServletRequest request){
criteria.setType("error");
......
......@@ -140,7 +140,7 @@ public class MicronSpUnloadController {
throw new ValidateException("smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"storageId", pos.getStorageId()});
}
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)) {
throw new ValidateException("smfcore.error", outResult);
}
......@@ -180,7 +180,7 @@ public class MicronSpUnloadController {
if (barcode != null) {
log.info("removal 料仓【" + storage.getName() + "_" + storage.getCid() + "】仓位【" + pos.getPosName() + "】 returnMaterial 成功,开始出库");
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)) {
// throw new ValidateException("smfcore.error", outResult);
log.error("removal 料仓【" + storage.getName() + "_" + storage.getCid() + "】仓位【" + pos.getPosName() + "】 returnMaterial 成功,出库失败: "+outResult);
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!