Commit ecbbf194 sunke

Merge remote-tracking branch 'origin/master'

2 个父辈 3601d390 aaf81e23
正在显示 61 个修改的文件 包含 1678 行增加174 行删除
package com.neotel.smfcore.common.excel; package com.neotel.smfcore.common.excel;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@Slf4j
public class ExcelReader { public class ExcelReader {
public static List<Map<Integer, String>> noModelRead(String fileName,int headRowNumber) { public static List<Map<Integer, String>> noModelRead(String fileName, int headRowNumber) {
// 这里 只要,然后读取第一个sheet 同步读取会自动finish // 这里 只要,然后读取第一个sheet 同步读取会自动finish
NoModelDataListener listener = new NoModelDataListener(); NoModelDataListener listener = new NoModelDataListener();
if(headRowNumber<=1){ if (headRowNumber <= 1) {
EasyExcel.read(fileName, listener).sheet().doRead(); EasyExcel.read(fileName, listener).sheet().doRead();
} } else {
else{
EasyExcel.read(fileName, listener).sheet().headRowNumber(headRowNumber).doRead(); EasyExcel.read(fileName, listener).sheet().headRowNumber(headRowNumber).doRead();
} }
List<Map<Integer, String>> data = listener.getData(); List<Map<Integer, String>> data = listener.getData();
...@@ -29,6 +31,37 @@ public class ExcelReader { ...@@ -29,6 +31,37 @@ public class ExcelReader {
return data; return data;
} }
public static List<Map<Integer, String>> noModelRead(String fileName) { public static List<Map<Integer, String>> noModelRead(String fileName) {
return noModelRead(fileName,1); return noModelRead(fileName, 1);
}
public static Map<String, Integer> readHeaderMap(String fileName, int headRowNumber) {
//读取所有excel表头
List<Map<Integer, String>> data = ExcelReader.noModelRead(fileName, headRowNumber);
Map<String, Integer> headerMap = new HashMap<>();
Map<Integer, String> headerData = data.get(0);
if (data != null && data.size() >= 2) {
for (Integer key :
headerData.keySet()) {
if (ObjectUtil.isEmpty(key)) {
continue;
}
String v = headerData.get(key);
if(ObjectUtil.isEmpty(v)){
continue;
}
headerMap.put(v, key);
}
//表头过少,需要重新读取
if (headerMap.size() <= 2) {
if (headRowNumber <= 1) {
log.error("文件[" + fileName + "],当前读取表头数[" + headerData.size() + "],当前headRowNumber=[" + headRowNumber + "],设置headRowNumber=3重新读取");
return readHeaderMap(fileName, 3);
} else {
return headerMap;
}
}
}
return headerMap;
} }
} }
...@@ -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);
......
...@@ -73,7 +73,16 @@ public class DateUtil { ...@@ -73,7 +73,16 @@ public class DateUtil {
public static Date toDate(final String strDate) throws ParseException { public static Date toDate(final String strDate) throws ParseException {
return toDate(strDate, getDatePattern()); return toDate(strDate, getDatePattern());
} }
public static Date toDate(String strDate, String[] aMasks) throws ParseException {
for (String aMask :
aMasks) {
Date date=toDate(strDate, aMask);
if(date!=null){
return date;
}
}
return toDate(strDate, getDatePattern());
}
public static Date toDate(String strDate,String aMask){ public static Date toDate(String strDate,String aMask){
SimpleDateFormat df; SimpleDateFormat df;
Date date; Date date;
......
...@@ -260,6 +260,9 @@ public class FileUtil extends cn.hutool.core.io.FileUtil { ...@@ -260,6 +260,9 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
} }
excelWriter.write(data, writeSheet); excelWriter.write(data, writeSheet);
page = page.next(); page = page.next();
if(pageable==null){
break;
}
} }
} }
} }
......
...@@ -92,6 +92,23 @@ public class CodeResolve { ...@@ -92,6 +92,23 @@ public class CodeResolve {
barcode = barcodeManager.findByBarcode(codeStr); barcode = barcodeManager.findByBarcode(codeStr);
if(barcode != null) {//数据库中已存在 if(barcode != null) {//数据库中已存在
try{
if((codeBeanFromRule.getBarcode()!=null)&&(codeBeanFromRule.getBarcode().getPartNumber()!=null)) {
if (!barcode.getPartNumber().equals(codeBeanFromRule.getBarcode().getPartNumber())) {
try {
log.warn("[" + barcode.getPartNumber() + "]重新设置PN[" + barcode.getPartNumber() + "]为[" + codeBeanFromRule.getBarcode().getPartNumber() + "]");
barcode.setPartNumber(codeBeanFromRule.getBarcode().getPartNumber());
barcode = barcodeManager.save(barcode);
} catch (Exception ve) {
log.error("重新设置PN出错", ve);
}
}
}
}catch (Exception ex){
log.error("条码["+codeStr+"]重置PN出错:"+ ex.getMessage());
}
boolean setSize=false; boolean setSize=false;
Component component = componentManager.findByPartNumberAndProvider(barcode.getPartNumber(),barcode.getProvider()); Component component = componentManager.findByPartNumberAndProvider(barcode.getPartNumber(),barcode.getProvider());
int validDay = 0; int validDay = 0;
......
...@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil; ...@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
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.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.message.enums.MessageType;
import com.neotel.smfcore.core.storage.enums.DeviceType; import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.system.service.po.AlarmInfo; import com.neotel.smfcore.core.system.service.po.AlarmInfo;
import lombok.Data; import lombok.Data;
...@@ -173,7 +174,7 @@ public class StatusBean { ...@@ -173,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);}
/** /**
* 获取客户端发送上来的二维码 * 获取客户端发送上来的二维码
...@@ -271,7 +272,7 @@ public class StatusBean { ...@@ -271,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);
} }
/** /**
* 获取客户端发送上来的条码信息 * 获取客户端发送上来的条码信息
...@@ -282,7 +283,7 @@ public class StatusBean { ...@@ -282,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");
...@@ -312,6 +313,10 @@ public class StatusBean { ...@@ -312,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+"" );
} }
...@@ -536,8 +541,7 @@ public class StatusBean { ...@@ -536,8 +541,7 @@ public class StatusBean {
} }
//提示信息国际化 //提示信息国际化
if (ObjectUtil.isEmpty(getMsgCode())) { if (ObjectUtil.isEmpty(getMsgCode())) {
return this.msg.replace("A=","").replace("I=","").replace("W=","");
return this.msg;
} else { } else {
String code = this.msgCode; String code = this.msgCode;
if (!code.startsWith(MessageUtils.smfcore)) { if (!code.startsWith(MessageUtils.smfcore)) {
...@@ -548,4 +552,63 @@ public class StatusBean { ...@@ -548,4 +552,63 @@ public class StatusBean {
} }
} }
public String getErrorMsg(Locale locale) {
if(ObjectUtil.isEmpty(this.msg)){
return "";
}
//判断是否有换行
String[] msgArray=this.msg.split("\r\n");
if(msgArray.length>0) {
for (String msg :
msgArray) {
String msgType = MessageType.ERROR.name();
if (msg.startsWith("A=")) {
msgType = MessageType.ERROR.name();
msg = msg.substring(2);
} else if (msg.startsWith("I=")) {
msgType = MessageType.INFO.name();
msg = msg.substring(2);
} else if (msg.startsWith("W=")) {
msgType = MessageType.WARNING.name();
msg = msg.substring(2);
}
if(msgType.equals(MessageType.ERROR.name())){
return msg;
}
}
}
return "";
}
public Map<String,String> getMsgMap() {
Map<String,String> resultMap=new HashMap<>();
if(ObjectUtil.isEmpty(this.msg)){
return resultMap;
}
//判断是否有换行
String[] msgArray=this.msg.split("\r\n");
if(msgArray.length>0) {
for (String msg :
msgArray) {
if(ObjectUtil.isEmpty(msg)){
continue;
}
String msgType = MessageType.ERROR.name();
if (msg.startsWith("A=")) {
msgType = MessageType.ERROR.name();
msg = msg.substring(2);
} else if (msg.startsWith("I=")) {
msgType = MessageType.INFO.name();
msg = msg.substring(2);
} else if (msg.startsWith("W=")) {
msgType = MessageType.WARNING.name();
msg = msg.substring(2);
}
resultMap.put(msg,msgType);
}
}
return resultMap;
}
} }
...@@ -234,7 +234,7 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -234,7 +234,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
} }
} }
ReelLockPosUtil.removeReelLockPosInfo(barcodeSave.getBarcode()); //ReelLockPosUtil.removeReelLockPosInfo(barcodeSave.getBarcode());
return taskService.addPutInTaskToExecute(storage, barcodeSave, storagePos); return taskService.addPutInTaskToExecute(storage, barcodeSave, storagePos);
} }
} }
...@@ -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 + "]");
//清空展示的消息 //清空展示的消息
...@@ -519,7 +519,6 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -519,7 +519,6 @@ public class BaseDeviceHandler implements IDeviceHandler {
updatePosExecuteTime(task.getPosName(), executeTime); updatePosExecuteTime(task.getPosName(), executeTime);
} }
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,执行时间[" + executeTime + "]秒"); log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,执行时间[" + executeTime + "]秒");
ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
DataLog cancelTask = taskService.findFinishedPutInTask(cid, task.getPosName(), task.getBarcode()); DataLog cancelTask = taskService.findFinishedPutInTask(cid, task.getPosName(), task.getBarcode());
if (cancelTask != null && cancelTask.isCancel()) { if (cancelTask != null && cancelTask.isCancel()) {
//将相同库位已经取消的任务从完成队列里删除 //将相同库位已经取消的任务从完成队列里删除
...@@ -527,6 +526,7 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -527,6 +526,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
log.info("从已完成的任务列表中删除之前取消的任务:" + cancelTask.getPosName() + " ReelId:" + cancelTask.getBarcode()); log.info("从已完成的任务列表中删除之前取消的任务:" + cancelTask.getPosName() + " ReelId:" + cancelTask.getBarcode());
} }
updatePutInData(task); updatePutInData(task);
ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
} else { } else {
//从已完成列表中找,如果还找不到就忽略 //从已完成列表中找,如果还找不到就忽略
task = taskService.findFinishedPutInTask(cid, posName, barcode); task = taskService.findFinishedPutInTask(cid, posName, barcode);
...@@ -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);
...@@ -925,8 +932,11 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -925,8 +932,11 @@ public class BaseDeviceHandler implements IDeviceHandler {
plateH = codeObj.getHeight(); plateH = codeObj.getHeight();
} else { } else {
log.warn("出库无料仓位" + storage.getName() + "[" + posName + "]"); log.warn("出库无料仓位" + storage.getName() + "[" + posName + "]");
StoragePos pos=storagePosManager.getByPosName(posName);
plateW = pos.getW();
plateH = pos.getH();
} }
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;
......
...@@ -132,6 +132,9 @@ public class MimoBoxHandler extends BaseDeviceHandler { ...@@ -132,6 +132,9 @@ public class MimoBoxHandler extends BaseDeviceHandler {
plateH = codeObj.getHeight(); plateH = codeObj.getHeight();
} else { } else {
log.warn("MIMO紧急出库无料仓位" + storage.getName() + "[" + posName + "]"); log.warn("MIMO紧急出库无料仓位" + storage.getName() + "[" + posName + "]");
StoragePos pos=storagePosManager.getByPosName(posName);
plateW = pos.getW();
plateH = pos.getH();
} }
statusBean.addPosInfo(singleOutTask.getBarcode(), posName, plateW, plateH, true); statusBean.addPosInfo(singleOutTask.getBarcode(), posName, plateW, plateH, true);
log.info("出库紧急物料" + storage.getName() + "[" + posName + "]物料[" + singleOutTask.getBarcode() + "]" + "发送到客户端" + cid); log.info("出库紧急物料" + storage.getName() + "[" + posName + "]物料[" + singleOutTask.getBarcode() + "]" + "发送到客户端" + cid);
......
...@@ -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("");
...@@ -628,7 +676,6 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -628,7 +676,6 @@ public class RobotBoxHandler extends BaseDeviceHandler {
log.info(" 获取[" + barcodeStr + "]的尺寸信息"); log.info(" 获取[" + barcodeStr + "]的尺寸信息");
Collection<CodeBean> codeBeans = codeResolve.resolveCodeStr(barcodeStr, COMPONENT_TYPE.COMPONENT); Collection<CodeBean> codeBeans = codeResolve.resolveCodeStr(barcodeStr, COMPONENT_TYPE.COMPONENT);
;
Barcode barcode = null; Barcode barcode = null;
for (CodeBean codeBean : codeBeans) { for (CodeBean codeBean : codeBeans) {
if (codeBean.isValid()) { if (codeBean.isValid()) {
......
...@@ -210,7 +210,13 @@ public class ThirdBoxHandler extends BaseDeviceHandler{ ...@@ -210,7 +210,13 @@ public class ThirdBoxHandler extends BaseDeviceHandler{
List<DataLog> finishedTasks = taskService.getFinishedTasks(); List<DataLog> finishedTasks = taskService.getFinishedTasks();
for (DataLog finishedTask : finishedTasks) { for (DataLog finishedTask : finishedTasks) {
if (finishedTask.getCid().equals(statusBean.getCid()) && finishedTask.isCheckOutTask() && finishedTask.isOutBox()) { if (finishedTask.getCid().equals(statusBean.getCid()) && finishedTask.isCheckOutTask() && finishedTask.isOutBox()) {
if (posName.equals(finishedTask.getPosName())) { if (ObjectUtil.isNotEmpty(posName)&& posName.equals(finishedTask.getPosName())) {
//已出仓但未放到门口,更改状态
finishedTask.setStatus(OP_STATUS.BOXDOOR.name());
taskService.updateFinishedTask(finishedTask);
log.info("物料" + finishedTask.getBarcode() + "已从库位" + finishedTask.getPosName() + "取出放到门口");
return statusBean;
}else if(ObjectUtil.isNotEmpty(barcode)&&barcode.equals(finishedTask.getBarcode())){
//已出仓但未放到门口,更改状态 //已出仓但未放到门口,更改状态
finishedTask.setStatus(OP_STATUS.BOXDOOR.name()); finishedTask.setStatus(OP_STATUS.BOXDOOR.name());
taskService.updateFinishedTask(finishedTask); taskService.updateFinishedTask(finishedTask);
...@@ -219,7 +225,7 @@ public class ThirdBoxHandler extends BaseDeviceHandler{ ...@@ -219,7 +225,7 @@ public class ThirdBoxHandler extends BaseDeviceHandler{
} }
} }
} }
log.error(posName + "出库放到门口时,未找到对应的出库任务"); log.error(posName + ",barcode["+barcode+"] 出库放到门口时,未找到对应的出库任务");
} else if (BOX_STATUS.OUT_FAILED == status) { } else if (BOX_STATUS.OUT_FAILED == status) {
//更改出库状态为OUT_DOOR //更改出库状态为OUT_DOOR
List<DataLog> finishedTasks = taskService.getFinishedTasks(); List<DataLog> finishedTasks = taskService.getFinishedTasks();
......
...@@ -585,4 +585,43 @@ public class DeviceController { ...@@ -585,4 +585,43 @@ public class DeviceController {
} }
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
@ApiOperation("查询库位是否有料或物料是否在库位中")
@RequestMapping(value = "/service/store/posQuery")
@ResponseBody
@AnonymousAccess
public ResultBean queryPos(HttpServletRequest request) {
String posName = request.getParameter("posName");
String barcode = request.getParameter("barcode");
//参数:发送posName 或 barcode
//返回code=0,有料或在库位中,data中返回 posName,barcode,plateW,plateH
//返回code=101: 未找到库位号
//返回code=102:条码未找到库位
//返回code=100:库位中无料
StoragePos pos = null;
if (ObjectUtil.isNotEmpty(posName)) {
//查询库位中是否有料
pos = storagePosManager.getByPosName(posName);
if (pos == null) {
return ResultBean.newErrorResult(101, "smfcore.queryPos.cannotFind", "cannot find posName ["+posName+"]", new String[]{posName});
} else if (pos.getBarcode() == null) {
return ResultBean.newErrorResult(100, "smfcore.queryPos.posIsEmpty", "["+posName+"] is empty", new String[]{posName});
}
} else if (ObjectUtil.isNotEmpty(barcode)) {
pos = storagePosManager.getByBarcode(barcode);
if (pos == null) {
return ResultBean.newErrorResult(102, "smfcore.queryPos.cannotFindBarcode", "cannot find barcode ["+barcode+"] In storage", new String[]{barcode});
}
}else{
return ResultBean.newErrorResult(101, "smfcore.queryPos.cannotFind", "cannot find posName ["+posName+"]", new String[]{posName});
}
Map<String, String> data = new HashMap<>();
data.put("posName", pos.getPosName());
data.put("barcode", pos.getBarcode().getBarcode());
data.put("plateW", pos.getBarcode().getPlateSize() + "");
data.put("plateH", pos.getBarcode().getHeight() + "");
return ResultBean.newOkResult(data);
}
} }
...@@ -5,6 +5,7 @@ import com.google.common.base.Strings; ...@@ -5,6 +5,7 @@ import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.SecurityUtils; import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils; import com.neotel.smfcore.common.utils.StringUtils;
...@@ -17,6 +18,7 @@ import com.neotel.smfcore.core.kanban.rest.bean.dto.*; ...@@ -17,6 +18,7 @@ import com.neotel.smfcore.core.kanban.rest.bean.dto.*;
import com.neotel.smfcore.core.kanban.rest.bean.mapstruct.BoxTaskMapper; import com.neotel.smfcore.core.kanban.rest.bean.mapstruct.BoxTaskMapper;
import com.neotel.smfcore.core.kanban.rest.bean.query.BoxTaskQueryCriter; import com.neotel.smfcore.core.kanban.rest.bean.query.BoxTaskQueryCriter;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil; import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.msd.bean.MSDSettiings;
import com.neotel.smfcore.core.solder.util.SolderBoxCache; import com.neotel.smfcore.core.solder.util.SolderBoxCache;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
...@@ -446,8 +448,17 @@ public class BoxKanbanController { ...@@ -446,8 +448,17 @@ public class BoxKanbanController {
String humidity = boxStatus.getHumidity(); String humidity = boxStatus.getHumidity();
String temperature = boxStatus.getTemperature(); String temperature = boxStatus.getTemperature();
boxDto.setHumidity(humidity); boxDto.setHumidity(humidity);
boxDto.setCodeAirTemp(boxStatus.getCodeAirTemp());
boxDto.setTemperature(temperature); boxDto.setTemperature(temperature);
MSDSettiings settiings = dataCache.getCache(Constants.CACHE_msdSetting);
if (settiings != null) {
if (settiings.getMinHumidity() == -1f) {
boxDto.setHumidity(0 + "");
}
if (settiings.getMinTemperature() == -1f) {
boxDto.setTemperature(0 + "");
}
}
boxDto.setCodeAirTemp(boxStatus.getCodeAirTemp());
boxDto.setStatus(bean.getStatus()); boxDto.setStatus(bean.getStatus());
boxDto.setMsg(bean.getShowMsg(locale)); boxDto.setMsg(bean.getShowMsg(locale));
boxDto.setBarcode(bean.getCode()); boxDto.setBarcode(bean.getCode());
......
...@@ -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.rest;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.base.IExcelDownLoad;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.materialLog.rest.dto.MaterialLogDto;
import com.neotel.smfcore.core.materialLog.rest.mapstruct.MaterialLogMapper;
import com.neotel.smfcore.core.materialLog.rest.query.MaterialLogCriteria;
import com.neotel.smfcore.core.materialLog.service.manager.IMaterialLogManager;
import com.neotel.smfcore.core.materialLog.service.po.MaterialLog;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@Slf4j
@Api(tags = "1053:料盘日志")
@RestController
@RequestMapping("/api/materialLog")
@RequiredArgsConstructor
public class MaterialLogController {
@Autowired
private IMaterialLogManager materialLogManager;
@Autowired
private MaterialLogMapper materialLogMapper;
@ApiOperation("查询料盘日志")
@GetMapping
public PageData<MaterialLogDto> query(MaterialLogCriteria criteria, Pageable pageable) {
Query query = QueryHelp.getQuery(criteria);
PageData<MaterialLog> pages = materialLogManager.findByPage(query, pageable);
List<MaterialLogDto> logDtos = materialLogMapper.toDto(pages.getContent());
return new PageData(logDtos, pages.getTotalElements());
}
@ApiOperation("料盘日志导出")
@RequestMapping("/download")
@AnonymousAccess
public void download(MaterialLogCriteria criteria, Pageable pageable, HttpServletRequest servletRequest, HttpServletResponse response) throws IOException {
Locale locale=servletRequest.getLocale();
log.info("开始导出 ErrorLog ");
Query query = QueryHelp.getQuery(criteria);
FileUtil.downloadExcel(query, pageable, response, new IExcelDownLoad() {
@Override
public List<List<String>> getHeader() {
List<List<String>> header = new ArrayList<>();
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.trayLog.barcode",locale,"条码编号")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.trayLog.posname",locale,"库位号")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.trayLog.state",locale,"状态")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.trayLog.type",locale,"类型")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.trayLog.poMsg",locale,"位置信息")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.utilization.updateTime",locale,"更新时间")));
return header;
}
@Override
public List<List<Object>> getPageData(Query query, Pageable pageable) {
List<List<Object>> dataList = new ArrayList<>();
PageData<MaterialLog> pages = materialLogManager.findByPage(query, pageable);
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (MaterialLog msg : pages.getContent()) {
String updateTime = dateFormat.format(msg.getUpdateDate());
List<Object> data = new ArrayList<>();
data.add(msg.getBarcode());
data.add(msg.getPosName());
data.add(msg.getStatus());
String inoutType=MessageUtils.getSmfClientMsg("smfclient.NeoLight.logType.2",locale,"出库");
if(msg.getType()==1){
inoutType=MessageUtils.getSmfClientMsg("smfclient.NeoLight.logType.1",locale,"入库");
}
data.add(inoutType);
data.add(msg.getLocInfo());
data.add(updateTime);
dataList.add(data);
}
return dataList;
}
});
log.info("ErrorLog 导出完成");
}
}
package com.neotel.smfcore.core.materialLog.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MaterialLogDto implements Serializable {
@ApiModelProperty("条码编号")
private String barcode;
@ApiModelProperty("库位号")
private String posName;
@ApiModelProperty("类型:入库OP.PUT_IN,出库OP.CHECKOUT")
private int type;
@ApiModelProperty("状态:OP_STATUS")
private String status;
@ApiModelProperty("位置信息,如料架编号,托盘编号,移栽编号,皮带线编号,机器人编号等")
private String locInfo = "";
}
package com.neotel.smfcore.core.materialLog.rest.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.materialLog.rest.dto.MaterialLogDto;
import com.neotel.smfcore.core.materialLog.service.po.MaterialLog;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface MaterialLogMapper extends BaseMapper<MaterialLogDto, MaterialLog> {
}
package com.neotel.smfcore.core.materialLog.rest.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
public class MaterialLogCriteria {
@QueryCondition(blurry = "barcode,posName,locInfo")
private String blurry;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> createDate;
@QueryCondition(blurry = "barcode")
private String barcode;
@QueryCondition(blurry = "posName")
private String posName;
@ApiModelProperty("status")
@QueryCondition(blurry = "status")
private String status;
}
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 = "";
}
...@@ -5,10 +5,12 @@ import com.neotel.smfcore.common.bean.PageData; ...@@ -5,10 +5,12 @@ import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
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;
import com.neotel.smfcore.core.message.rest.bean.dto.MsgCountDto;
import com.neotel.smfcore.core.message.rest.bean.mapstruct.MessageMapper; import com.neotel.smfcore.core.message.rest.bean.mapstruct.MessageMapper;
import com.neotel.smfcore.core.message.rest.bean.query.MessageCriteria; 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.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
...@@ -70,4 +72,33 @@ public class MessageController { ...@@ -70,4 +72,33 @@ public class MessageController {
List<String> typeList=messageManager.findDeviceNameList(); List<String> typeList=messageManager.findDeviceNameList();
return typeList; return typeList;
} }
@ApiOperation("消息统计,根据模块名统计")
@GetMapping(value = "/msgCount")
@AnonymousAccess
public List<MsgCountDto> msgCount(MessageCriteria criteria, HttpServletRequest request) {
// Query query = QueryHelp.getQuery(criteria);
Criteria c = Criteria.where("type").is("ERROR");
if (ObjectUtil.isNotEmpty(criteria.getDeviceName())) {
c.and("deviceName").is(criteria.getDeviceName());
}
if (criteria.getCreateDate() != null && criteria.getCreateDate().getFrom() != null) {
c.and("createDate").gte(criteria.getCreateDate().getFrom());
}
if (criteria.getCreateDate() != null && criteria.getCreateDate().getTo() != null) {
c.and("createDate").lte(criteria.getCreateDate().getTo());
}
List<MsgCountDto> list = messageManager.getMsgCountList(c);
// List<MessageDto> dtos=messageMapper.toDto(list);
for (int i = 0; i < list.size(); i++) {
if (ObjectUtil.isNotEmpty(list.get(i).getMsgCode())) {
list.get(i).setMsg(MessageUtils.getText(list.get(i).getMsgCode(), list.get(i).getMsgParams(), request.getLocale(), list.get(i).getId()));
} else {
list.get(i).setMsg(list.get(i).getId());
}
}
return list;
}
} }
package com.neotel.smfcore.core.message.rest.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MsgCountDto implements Serializable {
@ApiModelProperty(value = "ID")
private String id;
@ApiModelProperty(value = "消息字符串Code")
private String msgCode;
@ApiModelProperty(value = "消息内容")
private String msg;
@ApiModelProperty(value = "参数")
private String[] msgParams;
private Integer count;
}
package com.neotel.smfcore.core.message.service.dao; package com.neotel.smfcore.core.message.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
import com.neotel.smfcore.core.message.rest.bean.dto.MsgCountDto;
import org.springframework.data.mongodb.core.query.Criteria;
import java.util.List;
public interface IMessageDao extends IBaseDao { public interface IMessageDao extends IBaseDao {
List<MsgCountDto> getMsgCountList(Criteria criteria);
} }
package com.neotel.smfcore.core.message.service.dao.impl; package com.neotel.smfcore.core.message.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao; import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.core.message.rest.bean.dto.MsgCountDto;
import com.neotel.smfcore.core.message.service.dao.IMessageDao; import com.neotel.smfcore.core.message.service.dao.IMessageDao;
import com.neotel.smfcore.core.message.service.po.Message; import com.neotel.smfcore.core.message.service.po.Message;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
@Service @Service
public class MessageDaoImpl extends AbstractBaseDao implements IMessageDao { public class MessageDaoImpl extends AbstractBaseDao implements IMessageDao {
@Override @Override
public Class getEntityClass() { public Class getEntityClass() {
return Message.class; return Message.class;
} }
@Override
public List<MsgCountDto> getMsgCountList(Criteria criteria) {
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(criteria),
Aggregation.group("msg").count().as("count")
.first("msgCode").as("msgCode").first("msgParams").as("msgParams")
// Aggregation.project("count").and("msg").previousOperation()
);
AggregationResults<MsgCountDto> results = getMongoTemplate().aggregate(agg, getEntityClass(), MsgCountDto.class);
return results.getMappedResults();
}
} }
package com.neotel.smfcore.core.message.service.manager; package com.neotel.smfcore.core.message.service.manager;
import com.neotel.smfcore.common.base.IBaseManager; import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.message.rest.bean.dto.MsgCountDto;
import com.neotel.smfcore.core.message.service.po.Message; import com.neotel.smfcore.core.message.service.po.Message;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
...@@ -11,4 +14,8 @@ public interface IMessageManager extends IBaseManager<Message> { ...@@ -11,4 +14,8 @@ public interface IMessageManager extends IBaseManager<Message> {
void download(List<Message> list, HttpServletResponse response, Locale locale); void download(List<Message> list, HttpServletResponse response, Locale locale);
List<String> findDeviceNameList(); List<String> findDeviceNameList();
Message findOne(Query query);
List<MsgCountDto> getMsgCountList(Criteria criteria);
} }
...@@ -9,6 +9,7 @@ import com.neotel.smfcore.core.language.service.nanager.impl.LanguageMsgManagerI ...@@ -9,6 +9,7 @@ import com.neotel.smfcore.core.language.service.nanager.impl.LanguageMsgManagerI
import com.neotel.smfcore.core.language.service.po.LanguageMsg; import com.neotel.smfcore.core.language.service.po.LanguageMsg;
import com.neotel.smfcore.core.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.message.enums.MessageType; import com.neotel.smfcore.core.message.enums.MessageType;
import com.neotel.smfcore.core.message.rest.bean.dto.MsgCountDto;
import com.neotel.smfcore.core.message.service.dao.IMessageDao; import com.neotel.smfcore.core.message.service.dao.IMessageDao;
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;
...@@ -120,6 +121,15 @@ public class MessageManagerImpl implements IMessageManager { ...@@ -120,6 +121,15 @@ public class MessageManagerImpl implements IMessageManager {
} }
return result; return result;
} }
@Override
public Message findOne(Query query){
return messageDao.findOne(query);
}
@Override
public List<MsgCountDto> getMsgCountList(Criteria criteria) {
return messageDao.getMsgCountList(criteria) ;
}
@Data @Data
private class MsgDeviceName { private class MsgDeviceName {
......
package com.neotel.smfcore.core.message.util; package com.neotel.smfcore.core.message.util;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
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.device.util.EquipmentCache; import com.neotel.smfcore.core.device.util.EquipmentCache;
import com.neotel.smfcore.core.equipment.service.po.Equipment; import com.neotel.smfcore.core.equipment.service.po.Equipment;
...@@ -11,13 +12,19 @@ import com.neotel.smfcore.core.message.service.po.Message; ...@@ -11,13 +12,19 @@ import com.neotel.smfcore.core.message.service.po.Message;
import com.neotel.smfcore.core.message.util.bean.DeviceInfo; import com.neotel.smfcore.core.message.util.bean.DeviceInfo;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.aggregation.ComparisonOperators; import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Map;
@Slf4j @Slf4j
@Component @Component
public class DeviceMessageUtil { public class DeviceMessageUtil {
...@@ -127,5 +134,58 @@ public class DeviceMessageUtil { ...@@ -127,5 +134,58 @@ public class DeviceMessageUtil {
} }
public static void addMessage( String msgType, String name,String moudle, String msgCode, String msg, String[] msgParam) {
if(ObjectUtil.isEmpty(msgType)||ObjectUtil.isEmpty(msg)){
return;
}try {
String code = msgCode;
if (ObjectUtil.isNotEmpty(msgCode)) {
if (!msgCode.startsWith(MessageUtils.smfcore)) {
code = MessageUtils.smfcore + "." + msgCode;
}
}
Message message = Message.newMsg(msgType, name, "", moudle, code, msg, msgParam);
messageManager.save(message);
}catch (Exception ex){
log.error("addMessage ["+msgType+"]["+name+"]["+msg+"]出错:"+ex.toString());
}
}
/**
* 服务器重启后,自动更新设备为离线
*/
@PostConstruct
public static void processDeviceStatus() {
try {
//获取所有料仓状态
Map<String, Storage> allStorages = dataCache.getAllStorage();
String[] msgCodes = new String[]{"smfcore.messages.online", "smfcore.messages.offline"};
for (Storage storage :
allStorages.values()) {
Criteria criteria = Criteria.where("deviceId").is(storage.getId());
criteria.and("msgCode").in(msgCodes);
Sort sort = Sort.by(Sort.Direction.DESC, "createDate");
Query query = new Query(criteria);
query.with(sort);
Message message = messageManager.findOne(query);
if (message != null) {
if (message.getMsgCode().equals("smfcore.messages.online")) {
//其实早已经离线
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null) {
DeviceMessageUtil.addOfflineMessage(storage.getCid(), "");
log.info("processDeviceStatus 添加设备[" + storage.getCid() + "][" + storage.getName() + "]离线消息");
continue;
}
}
}
}
} catch (Exception ex) {
log.error("processDeviceStatus 出错:" + ex.getMessage());
}
}
} }
...@@ -502,9 +502,9 @@ public class LiteOrderCache { ...@@ -502,9 +502,9 @@ public class LiteOrderCache {
} }
}else if (Strings.isNullOrEmpty(reelId) && !Strings.isNullOrEmpty(partNumber)){ }else if (Strings.isNullOrEmpty(reelId) && !Strings.isNullOrEmpty(partNumber)){
//PN //PN
pos=storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType); pos=storagePosManager.findPartNumberInStorages(availableStorageIds,"", partNumber, excludePosIds, checkoutType,orderItem.getAppendData());
} else if (Strings.isNullOrEmpty(reelId) && Strings.isNullOrEmpty(partNumber) && !Strings.isNullOrEmpty(mpn)){ } else if (Strings.isNullOrEmpty(reelId) && Strings.isNullOrEmpty(partNumber) && !Strings.isNullOrEmpty(mpn)){
pos=storagePosManager.findMpnInStorages(availableStorageIds, mpn, excludePosIds, checkoutType); pos=storagePosManager.findMpnInStorages(availableStorageIds, mpn, excludePosIds, checkoutType,orderItem.getAppendData());
} }
if (pos == null) { if (pos == null) {
// log.error("未找到可以出库的物料[" + partNumber + "]"); // log.error("未找到可以出库的物料[" + partNumber + "]");
......
...@@ -118,6 +118,21 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -118,6 +118,21 @@ public class DefaultOrderFileListener implements IOrderFileListener {
int numIndex = csvRead.getIndex("NUM", orderSetting.getNum()); int numIndex = csvRead.getIndex("NUM", orderSetting.getNum());
int mpnIndex = csvRead.getIndex("MPN", orderSetting.getMpn()); int mpnIndex = csvRead.getIndex("MPN", orderSetting.getMpn());
//附加字段读取
Map<String,Integer> appendIndexMap=new HashMap<>();
if(orderSetting.getAppendData()!=null&&orderSetting.getAppendData().size()>0){
for (String key :
orderSetting.getAppendData().keySet()) {
String value=orderSetting.getAppendData().get(key);
if(ObjectUtil.isNotEmpty(value)){
int index=csvRead.getIndex(value,key);
if(index>=0){
appendIndexMap.put(key,index);
}
}
}
}
int row = 1; int row = 1;
int newRowCount = 0; int newRowCount = 0;
int updateRowCount = 0; int updateRowCount = 0;
...@@ -183,6 +198,22 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -183,6 +198,22 @@ public class DefaultOrderFileListener implements IOrderFileListener {
item.setFeederInfo(feeder); item.setFeederInfo(feeder);
item.setRi(ri); item.setRi(ri);
item.setMpn(mpn); item.setMpn(mpn);
Map<String,String> appendValue=new HashMap<>();
if(appendIndexMap.size()>0){
for (String key :
appendIndexMap.keySet()) {
Integer index=appendIndexMap.get(key);
String value=lineValues[index];
if(ObjectUtil.isNotEmpty(value)){
appendValue.put(key,value);
}
}
if(appendValue.size()>0){
item.setAppendData(appendValue);
}
}
if(!itemMap.containsKey(so)){ if(!itemMap.containsKey(so)){
itemMap.put(so,new ArrayList<LiteOrderItem>()); itemMap.put(so,new ArrayList<LiteOrderItem>());
} }
...@@ -244,7 +275,20 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -244,7 +275,20 @@ public class DefaultOrderFileListener implements IOrderFileListener {
int feederIndex = headerMap.getOrDefault(orderSetting.getFeeder(), -1); int feederIndex = headerMap.getOrDefault(orderSetting.getFeeder(), -1);
int soIndex = headerMap.getOrDefault(orderSetting.getSo(), -1); int soIndex = headerMap.getOrDefault(orderSetting.getSo(), -1);
int numIndex = headerMap.getOrDefault(orderSetting.getNum(), -1); int numIndex = headerMap.getOrDefault(orderSetting.getNum(), -1);
//附加字段读取
Map<String,Integer> appendIndexMap=new HashMap<>();
if(orderSetting.getAppendData()!=null&&orderSetting.getAppendData().size()>0){
for (String key :
orderSetting.getAppendData().keySet()) {
String value=orderSetting.getAppendData().get(key);
if(ObjectUtil.isNotEmpty(value)){
int index=headerMap.getOrDefault(value,-1);
if(index>=0){
appendIndexMap.put(key,index);
}
}
}
}
for (int i = 1; i < data.size(); i++) { for (int i = 1; i < data.size(); i++) {
Map<Integer, String> lineValues = data.get(i); Map<Integer, String> lineValues = data.get(i);
String partNumber = lineValues.get(partNumberIndex); String partNumber = lineValues.get(partNumberIndex);
...@@ -317,6 +361,20 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -317,6 +361,20 @@ public class DefaultOrderFileListener implements IOrderFileListener {
if (!itemMap.containsKey(so)) { if (!itemMap.containsKey(so)) {
itemMap.put(so, new ArrayList<LiteOrderItem>()); itemMap.put(so, new ArrayList<LiteOrderItem>());
} }
Map<String,String> appendValue=new HashMap<>();
if(appendIndexMap.size()>0){
for (String key :
appendIndexMap.keySet()) {
Integer index=appendIndexMap.get(key);
String value=lineValues.get(index);
if(ObjectUtil.isNotEmpty(value)){
appendValue.put(key,value);
}
}
if(appendValue.size()>0){
item.setAppendData(appendValue);
}
}
itemMap.get(so).add(item); itemMap.get(so).add(item);
} }
} }
......
...@@ -17,10 +17,12 @@ import com.neotel.smfcore.core.barcode.service.po.Barcode; ...@@ -17,10 +17,12 @@ import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve; import com.neotel.smfcore.core.barcode.utils.CodeResolve;
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.device.util.DataCache;
import com.neotel.smfcore.core.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS; import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderDto; import com.neotel.smfcore.core.order.rest.bean.dto.OrderDto;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderItemDto;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderItemMapper; import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderItemMapper;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderMapper; import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderMapper;
import com.neotel.smfcore.core.order.rest.bean.query.OrderQueryCondition; import com.neotel.smfcore.core.order.rest.bean.query.OrderQueryCondition;
...@@ -31,6 +33,7 @@ import com.neotel.smfcore.core.order.service.po.LiteOrderItem; ...@@ -31,6 +33,7 @@ import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.order.util.OrderFileWatch; import com.neotel.smfcore.core.order.util.OrderFileWatch;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.MSDAppendInfo; import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import com.neotel.smfcore.core.system.bean.OrderSetting;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService; import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
...@@ -115,6 +118,9 @@ public class OrderController { ...@@ -115,6 +118,9 @@ public class OrderController {
TaskService taskService; TaskService taskService;
@Autowired @Autowired
private DataCache dataCache;
@Autowired
SmfApi smfApi; SmfApi smfApi;
// @ApiOperation("导出用户数据") // @ApiOperation("导出用户数据")
...@@ -270,22 +276,48 @@ public class OrderController { ...@@ -270,22 +276,48 @@ public class OrderController {
if (!ObjectUtils.isEmpty(id)) { if (!ObjectUtils.isEmpty(id)) {
LiteOrder liteOrder = liteOrderManager.get(id); LiteOrder liteOrder = liteOrderManager.get(id);
if (liteOrder != null) { if (liteOrder != null) {
OrderDto dto = orderMapper.toDto(liteOrder); // OrderDto dto = orderMapper.toDto(liteOrder);
dto.setOrderItems(orderItemMapper.toDto(liteOrder.getOrderItems())); // dto.setOrderItems(orderItemMapper.toDto(liteOrder.getOrderItems()));
return dto; // return dto;
return toOrderDto(liteOrder);
} }
} else if (!ObjectUtils.isEmpty(orderNo)) { } else if (!ObjectUtils.isEmpty(orderNo)) {
LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo); LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder != null) { if (liteOrder != null) {
OrderDto dto = orderMapper.toDto(liteOrder); // OrderDto dto = orderMapper.toDto(liteOrder);
dto.setOrderItems(orderItemMapper.toDto(liteOrder.getOrderItems())); // dto.setOrderItems(orderItemMapper.toDto(liteOrder.getOrderItems()));
return dto; // return dto;
return toOrderDto(liteOrder);
} }
} }
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"}); throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
} }
private OrderDto toOrderDto(LiteOrder liteOrder) {
OrderSetting orderSetting = dataCache.getOrderSetting();
OrderDto dto = orderMapper.toDto(liteOrder);
List<LiteOrderItem> orderItemDtos = liteOrder.getOrderItems();
List<OrderItemDto> dtos = new ArrayList<>();
for (LiteOrderItem item : orderItemDtos
) {
OrderItemDto orderItemDto = orderItemMapper.toDto(item);
if (orderSetting.getAppendData() != null && orderSetting.getAppendData().size() > 0 && orderItemDto.getAppendData() != null && orderItemDto.getAppendData().size() > 0) {
Map<String, String> newMap = new HashMap<>();
for (String key :
orderItemDto.getAppendData().keySet()) {
String v = orderItemDto.appendData.getOrDefault(key, "");
String title = orderSetting.getAppendData().getOrDefault(key, "");
newMap.put(title, v);
}
orderItemDto.setAppendData(newMap);
}
dtos.add(orderItemDto);
}
dto.setOrderItems(dtos);
return dto;
}
@ApiOperation("下载工单详情") @ApiOperation("下载工单详情")
@RequestMapping("/detial/download") @RequestMapping("/detial/download")
@PreAuthorize("@el.check('workOrder:detial')") @PreAuthorize("@el.check('workOrder:detial')")
...@@ -304,6 +336,7 @@ public class OrderController { ...@@ -304,6 +336,7 @@ public class OrderController {
Locale locale = request.getLocale(); Locale locale = request.getLocale();
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.ri",locale,"RI"))); header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.ri",locale,"RI")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.pn",locale,"PN"))); header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.pn",locale,"PN")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.MPN",locale,"MPN")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.side",locale,"面别"))); header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.side",locale,"面别")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.tableNo",locale,"台车号"))); header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.tableNo",locale,"台车号")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.feederInfo",locale,"站位信息"))); header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.feederInfo",locale,"站位信息")));
...@@ -311,8 +344,18 @@ public class OrderController { ...@@ -311,8 +344,18 @@ public class OrderController {
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.outReelCount",locale,"已出盘数"))); header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.outReelCount",locale,"已出盘数")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.needNum",locale,"需求数量"))); header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.needNum",locale,"需求数量")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.outNum",locale,"已出数量"))); header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.outNum",locale,"已出数量")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.exception",locale,"异常")));
//附加字段
OrderSetting orderSetting=dataCache.getOrderSetting();
if(orderSetting.getAppendData()!=null&&orderSetting.getAppendData().size()>0){
for (String key :
orderSetting.getAppendData().keySet()) {
String title=orderSetting.getAppendData().get(key);
header.add(Lists.newArrayList(title));
}
}
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.exception",locale,"异常")));
List<List<Object>> dataList = new ArrayList<>(); List<List<Object>> dataList = new ArrayList<>();
for (LiteOrderItem orderItem : liteOrder.getOrderItems()) { for (LiteOrderItem orderItem : liteOrder.getOrderItems()) {
...@@ -320,6 +363,7 @@ public class OrderController { ...@@ -320,6 +363,7 @@ public class OrderController {
List<Object> data = new ArrayList<>(); List<Object> data = new ArrayList<>();
data.add(orderItem.getRi()); data.add(orderItem.getRi());
data.add(orderItem.getPn()); data.add(orderItem.getPn());
data.add(orderItem.getMpn());
data.add(orderItem.getSide()); data.add(orderItem.getSide());
data.add(orderItem.getTableNo()); data.add(orderItem.getTableNo());
data.add(orderItem.getFeederInfo()); data.add(orderItem.getFeederInfo());
...@@ -327,6 +371,15 @@ public class OrderController { ...@@ -327,6 +371,15 @@ public class OrderController {
data.add(orderItem.getOutReelCount()); data.add(orderItem.getOutReelCount());
data.add(orderItem.getNeedNum()); data.add(orderItem.getNeedNum());
data.add(orderItem.getOutNum()); data.add(orderItem.getOutNum());
//附加字段
if(orderSetting.getAppendData()!=null&&orderSetting.getAppendData().size()>0){
for (String key :
orderSetting.getAppendData().keySet()) {
String title=orderSetting.getAppendData().get(key);
String v=orderItem.getAppendData().getOrDefault(key,"");
data.add(v);
}
}
String exception=orderItem.getOutNum()<orderItem.getNeedNum()?MessageUtils.getText("smfcore.order.yes",locale,"是"):""; String exception=orderItem.getOutNum()<orderItem.getNeedNum()?MessageUtils.getText("smfcore.order.yes",locale,"是"):"";
data.add(exception); data.add(exception);
dataList.add(data); dataList.add(data);
......
...@@ -5,6 +5,9 @@ import lombok.Getter; ...@@ -5,6 +5,9 @@ import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.springframework.data.annotation.Transient; import org.springframework.data.annotation.Transient;
import java.util.HashMap;
import java.util.Map;
@Getter @Getter
@Setter @Setter
public class OrderItemDto { public class OrderItemDto {
...@@ -53,4 +56,7 @@ public class OrderItemDto { ...@@ -53,4 +56,7 @@ public class OrderItemDto {
@ApiModelProperty("制造商物料编号") @ApiModelProperty("制造商物料编号")
private String mpn = ""; private String mpn = "";
@ApiModelProperty("自定义的附加字段,key=字段名,value=值")
public Map<String,String> appendData = new HashMap<>();
} }
...@@ -7,6 +7,9 @@ import org.springframework.data.mongodb.core.index.Indexed; ...@@ -7,6 +7,9 @@ import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
@Data @Data
@Document @Document
public class LiteOrderItem extends BasePo implements Serializable ,Comparable<LiteOrderItem> { public class LiteOrderItem extends BasePo implements Serializable ,Comparable<LiteOrderItem> {
...@@ -88,6 +91,12 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li ...@@ -88,6 +91,12 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
*/ */
private String mpn = ""; private String mpn = "";
/**
* 自定义的附加字段,key=字段名,value=值
*/
public Map<String,String> appendData = new HashMap<>();
/** /**
* 出库是否满足要求,已出库数量大于需求数量 * 出库是否满足要求,已出库数量大于需求数量
*/ */
......
...@@ -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) {
...@@ -448,7 +448,7 @@ public class StoragePosController { ...@@ -448,7 +448,7 @@ public class StoragePosController {
// throw new ValidateException("smfcore.error.getMaterialLot.out", "条码[{0}]验证失败,无法出库", new String[]{pos.getBarcode().getBarcode()}); // throw new ValidateException("smfcore.error.getMaterialLot.out", "条码[{0}]验证失败,无法出库", new String[]{pos.getBarcode().getBarcode()});
// } // }
log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】"); log.info("手动出库:出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkout(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}")
......
...@@ -14,7 +14,7 @@ import java.util.List; ...@@ -14,7 +14,7 @@ import java.util.List;
@Data @Data
public class StoragePosFindCriteria { public class StoragePosFindCriteria {
@QueryCondition(blurry = "barcode.partNumber,barcode.barcode,barcode.subCodeList.barcode,barcode.subCodeList.partNumber,posName") @QueryCondition(blurry = "barcode.partNumber,barcode.barcode,barcode.subCodeList.barcode,barcode.subCodeList.partNumber,posName,barcode.batch")
private String blurry; private String blurry;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "barcode.putInDate") @QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "barcode.putInDate")
......
...@@ -34,6 +34,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> { ...@@ -34,6 +34,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType); StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType);
StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType); StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType);
StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType,Map<String,String> appendDate);
List<StoragePos> findByQuery(Query query, Pageable pageable); List<StoragePos> findByQuery(Query query, Pageable pageable);
...@@ -81,7 +82,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> { ...@@ -81,7 +82,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
List<StoragePos> findPosByIdList(List<String> idList); List<StoragePos> findPosByIdList(List<String> idList);
StoragePos findMpnInStorages(List<String> availableStorageIds, String mpn, Collection<String> excludePosIds, CHECKOUT_TYPE checkoutType); StoragePos findMpnInStorages(List<String> availableStorageIds, String mpn, Collection<String> excludePosIds, CHECKOUT_TYPE checkoutType,Map<String,String> appendData);
List<StoragePos> findExpiredOrSluggishBarcode(Date date,int type); List<StoragePos> findExpiredOrSluggishBarcode(Date date,int type);
} }
...@@ -6,6 +6,7 @@ import com.google.common.collect.Lists; ...@@ -6,6 +6,7 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.PointUtil; import com.neotel.smfcore.common.utils.PointUtil;
import com.neotel.smfcore.core.barcode.bean.PlateSizeBean; import com.neotel.smfcore.core.barcode.bean.PlateSizeBean;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
...@@ -28,6 +29,7 @@ import org.springframework.data.mongodb.core.query.Query; ...@@ -28,6 +29,7 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update; import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
...@@ -260,7 +262,7 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -260,7 +262,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return findPartNumberInStorages(storageIdList,"",pn,excludePosIds,checkOutType); return findPartNumberInStorages(storageIdList,"",pn,excludePosIds,checkOutType);
} }
@Override @Override
public StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) { public StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType,Map<String, String> appendDate) {
Criteria c = Criteria.where("barcode.partNumber").is(pn) Criteria c = Criteria.where("barcode.partNumber").is(pn)
.and("id").nin(excludePosIds) .and("id").nin(excludePosIds)
.and("enabled").is(true)//可用 .and("enabled").is(true)//可用
...@@ -271,6 +273,7 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -271,6 +273,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
if (ObjectUtil.isNotEmpty(labelId)) { if (ObjectUtil.isNotEmpty(labelId)) {
c.and("labelId").is(labelId); c.and("labelId").is(labelId);
} }
c=addAppendData(c,appendDate);
Query q = new Query(c); Query q = new Query(c);
Sort sort = getSortByCheckOutType(checkOutType); Sort sort = getSortByCheckOutType(checkOutType);
q.with(sort); q.with(sort);
...@@ -283,6 +286,11 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -283,6 +286,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return pos; return pos;
} }
@Override
public StoragePos findPartNumberInStorages(List<String> storageIdList, String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) {
return findPartNumberInStorages(storageIdList,labelId,pn,excludePosIds,checkOutType,new HashMap<>());
}
/** /**
* 根据出库方式获取不同的 Sort * 根据出库方式获取不同的 Sort
*/ */
...@@ -677,7 +685,7 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -677,7 +685,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
} }
@Override @Override
public StoragePos findMpnInStorages(List<String> storageIdList, String mpn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) { public StoragePos findMpnInStorages(List<String> storageIdList, String mpn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType,Map<String,String> appendData) {
Criteria c = Criteria.where("barcode.mpn").is(mpn) Criteria c = Criteria.where("barcode.mpn").is(mpn)
.and("id").nin(excludePosIds) .and("id").nin(excludePosIds)
.and("enabled").is(true)//可用 .and("enabled").is(true)//可用
...@@ -685,6 +693,8 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -685,6 +693,8 @@ public class StoragePosManagerImpl implements IStoragePosManager {
if (storageIdList != null) { if (storageIdList != null) {
c = c.and("storageId").in(storageIdList); c = c.and("storageId").in(storageIdList);
} }
c = addAppendData(c, appendData);
Query q = new Query(c); Query q = new Query(c);
Sort sort = getSortByCheckOutType(checkOutType); Sort sort = getSortByCheckOutType(checkOutType);
q.with(sort); q.with(sort);
...@@ -697,6 +707,44 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -697,6 +707,44 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return pos; return pos;
} }
private Criteria addAppendData(Criteria c, Map<String,String> appendData){
try {
if(appendData!=null&&appendData.size()>0){
for (String key :
appendData.keySet()) {
String value=appendData.get(key);
if(ObjectUtil.isNotEmpty(key)&&ObjectUtil.isNotEmpty(value)) {
key=key.replace("#",".");
//如果是过期日期
if (key.equals("barcode.expireDate") || key.equals("barcode.produceDate")) { //如果是生产日期
//把value转换为时间
try {
Date date = DateUtil.toDate(value);
String[] patternArray=new String[]{"yyyy-MM-dd","MM-dd-yyyy","yyyyMMdd"};
date= DateUtil.toDate(value,patternArray);
if(date!=null) {
//时间判断为当天
Date endDate=new Date(date.getTime()+24*60*60*1000);
c.and(key).gte(date).lt(endDate);
}
} catch (ParseException e) {
e.printStackTrace();
continue;//转换出错直接continue;
}
} else {
c.and(key).is(value);
}
}
}
}
}catch (Exception ex){
log.error("addAppendData 处理出错:"+appendData);
}
return c;
}
@Override @Override
public List<StoragePos> findExpiredOrSluggishBarcode(Date date, int type) { public List<StoragePos> findExpiredOrSluggishBarcode(Date date, int type) {
Query q = new Query(); Query q = new Query();
......
...@@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModelProperty; ...@@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
@Data @Data
public class OrderSetting implements Serializable { public class OrderSetting implements Serializable {
...@@ -28,6 +30,11 @@ public class OrderSetting implements Serializable { ...@@ -28,6 +30,11 @@ public class OrderSetting implements Serializable {
public String mpn="MPN"; public String mpn="MPN";
/** /**
* 自定义的附加字段,key=字段名,value=表头名称
*/
public Map<String,String> appendData = new HashMap<>();
/**
* 是否显示料架亮灯方式 * 是否显示料架亮灯方式
*/ */
@ApiModelProperty("是否显示料架亮灯方式 ture=显示") @ApiModelProperty("是否显示料架亮灯方式 ture=显示")
......
...@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.system.rest; ...@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.system.rest;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.csv.CsvReader; import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.excel.ExcelReader;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants; import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.DateUtil; import com.neotel.smfcore.common.utils.DateUtil;
...@@ -187,6 +188,19 @@ public class SettingsController { ...@@ -187,6 +188,19 @@ public class SettingsController {
} }
} }
if(orderSetting.getAppendData()!=null&&orderSetting.getAppendData().size()>0) {
Map<String, String> appendData = new HashMap<>();
for (String key :
orderSetting.getAppendData().keySet()) {
String value = orderSetting.getAppendData().get(key);
if (ObjectUtil.isNotEmpty(key) && ObjectUtil.isNotEmpty(value)) {
String nKey = key.replace(".", "#");
appendData.put(nKey, value);
}
}
orderSetting.setAppendData(appendData);
}
dataCache.updateCache(Constants.CACHE_OrderSetting, orderSetting); dataCache.updateCache(Constants.CACHE_OrderSetting, orderSetting);
log.info("更改工单设置:"+Constants.CACHE_OrderSetting+"=" + orderSetting.toString()); log.info("更改工单设置:"+Constants.CACHE_OrderSetting+"=" + orderSetting.toString());
return ResultBean.newOkResult("保存成功"); return ResultBean.newOkResult("保存成功");
...@@ -247,22 +261,32 @@ public class SettingsController { ...@@ -247,22 +261,32 @@ public class SettingsController {
@AnonymousAccess @AnonymousAccess
public ResultBean uploadOrderModel(@RequestParam MultipartFile orderFile) { public ResultBean uploadOrderModel(@RequestParam MultipartFile orderFile) {
String image = "csv"; String csv = "csv";
String excel = "xlsx";
String fileType = FileUtil.getExtensionName(orderFile.getOriginalFilename()); String fileType = FileUtil.getExtensionName(orderFile.getOriginalFilename());
String fileName = FileUtil.getFileNameNoEx(orderFile.getOriginalFilename()); String fileName = FileUtil.getFileNameNoEx(orderFile.getOriginalFilename());
if (fileType != null && !image.contains(fileType)) { if (fileType != null && (!csv.contains(fileType)) && (!excel.contains(fileType))) {
throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{image}); throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{csv + "," + excel});
} }
File folder = new File(properties.getPath(), "pos"); File folder = new File(properties.getPath(), "pos");
File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath()); File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
try { try {
CsvReader csvRead = CsvReader.newReader(localFile.getAbsolutePath(),"","" ); if (fileType.equals(csv)) {
String[] headers=csvRead.getHeaders(); CsvReader csvRead = CsvReader.newReader(localFile.getAbsolutePath(), "", "");
return ResultBean.newOkResult(headers); String[] headers = csvRead.getHeaders();
return ResultBean.newOkResult(headers);
} else if (fileType.equals(excel)) {
//读取所有excel表头
Map<String, Integer> headerData = ExcelReader.readHeaderMap(localFile.getAbsolutePath(), 1);
String[] headerArray = new String[headerData.size()];
headerData.keySet().toArray(headerArray);
return ResultBean.newOkResult(headerArray);
}
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
return ResultBean.newOkResult("");
} }
@ApiOperation("获取版本号") @ApiOperation("获取版本号")
@GetMapping("/version") @GetMapping("/version")
......
...@@ -40,6 +40,13 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog> ...@@ -40,6 +40,13 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
msdAppendInfo.setMsl(barcode.getMsl()); msdAppendInfo.setMsl(barcode.getMsl());
msdAppendInfo.setOpenTime(barcode.getOpenTime()); msdAppendInfo.setOpenTime(barcode.getOpenTime());
msdAppendInfo.setThickness(barcode.getThickness()); msdAppendInfo.setThickness(barcode.getThickness());
}else{
setBarcode("");
setProviderNumber("");
setPartNumber("");
setNum(0);
setMemo("");
setBatchInfo("");
} }
setCid(storage.getCid()); setCid(storage.getCid());
setStorageId(storage.getId()); setStorageId(storage.getId());
...@@ -109,6 +116,10 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog> ...@@ -109,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,20 +77,43 @@ public class DevicesStatusUtil { ...@@ -77,20 +77,43 @@ 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){
DeviceMessageUtil.addDeviceMessage(cid, MessageType.ERROR.name(),"",msgCode,clientMsg,msgParam);
//判断是否有换行
String[] msgArray=clientMsg.split("\r\n");
if(msgArray!=null&& msgArray.length>0) {
for (String msg :
msgArray) {
String msgType = MessageType.ERROR.name();
if (msg.startsWith("A=")) {
msgType = MessageType.ERROR.name();
msg = msg.substring(2);
} else if (msg.startsWith("I=")) {
msgType = MessageType.INFO.name();
msg = msg.substring(2);
} else if (msg.startsWith("W=")) {
msgType = MessageType.WARNING.name();
msg = msg.substring(2);
}
DeviceMessageUtil.addDeviceMessage(cid, msgType, "", msgCode, msg, msgParam);
}
}
else {
DeviceMessageUtil.addDeviceMessage(cid, MessageType.ERROR.name(), "", msgCode, clientMsg, msgParam);
}
} }
} }
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,12 +117,32 @@ public class TaskService { ...@@ -117,12 +117,32 @@ 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);
addTaskToExecute(task);
return "";
}
/**
* 库位出库 测试,空库位也可以出库
*/
public synchronized String checkoutTest(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName) throws ValidateException {
DataLog task = new DataLog(storage, pos.getBarcode(), pos);
task.setType(OP.CHECKOUT);
task.setInOutType("0");
if(pos.getBarcode()!=null){
task.setPutInDate(pos.getBarcode().getPutInDate());
}
task.setStatus(OP_STATUS.WAIT.name());
task.setSingleOut(isSingleOut);
task.setOperator(opUserName); task.setOperator(opUserName);
addTaskToExecute(task); addTaskToExecute(task);
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,"");
} }
/** /**
* 触发任务状态改变事件 * 触发任务状态改变事件
...@@ -479,6 +499,9 @@ public class TaskService { ...@@ -479,6 +499,9 @@ public class TaskService {
} }
} else { } else {
log.warn("出库无料仓位" + storage.getName() + "[" + posName + "]"); log.warn("出库无料仓位" + storage.getName() + "[" + posName + "]");
StoragePos pos=storagePosManager.getByPosName(posName);
plateW = pos.getW();
plateH = pos.getH();
} }
statusBean.addData("hSerial",task.getSourceName()); statusBean.addData("hSerial",task.getSourceName());
statusBean.addPosInfo(task.getBarcode(), posName, plateW, plateH, isSingleOut); statusBean.addPosInfo(task.getBarcode(), posName, plateW, plateH, isSingleOut);
......
...@@ -65,6 +65,13 @@ public class Micron1053Menu { ...@@ -65,6 +65,13 @@ public class Micron1053Menu {
MenuInit.addMenu(menuLabel,null,166, "Diagnosis","diagnosis", "system/diagnosis/index","diagnosis"); MenuInit.addMenu(menuLabel,null,166, "Diagnosis","diagnosis", "system/diagnosis/index","diagnosis");
//Help //Help
MenuInit.addMenu(menuLabel,null,167, "Help","helps", "help/helps/index","help"); MenuInit.addMenu(menuLabel,null,167, "Help","helps", "help/helps/index","help");
//报表:出入库、库存
Menu pMenuReport = Menu.CreatePMenu("报表", 7, "report","inOutData",null);
MenuInit.addMenu(menuLabel,pMenuReport,201, "料盘日志","trayLog", "report/trayLog/index","trayLog");
MenuInit.addMenu(menuLabel,pMenuReport,202, "Utilization ","utilization ", "report/utilization/index","utilization");
MenuInit.addMenu(menuLabel,pMenuReport,203, "ErrorLog","errorLog", "report/errorLog/index","errorLog");
MenuInit.addMenu(menuLabel,pMenuReport,204, "ErrorReport","errorReport", "report/errorReport/index","errorReport");
MenuInit.addMenu(menuLabel,pMenuReport,205, "EventLog","eventLog", "report/eventLog/index","eventLog");
String apiName = smfApi.getApiName(); String apiName = smfApi.getApiName();
if(Strings.isNotBlank(apiName) && apiName.equals(menuLabel)){ if(Strings.isNotBlank(apiName) && apiName.equals(menuLabel)){
......
package com.neotel.smfcore.custom.micron1053.bean; package com.neotel.smfcore.custom.micron1053.bean;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.core.language.util.MessageUtils;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.Locale;
@Data @Data
@AllArgsConstructor @AllArgsConstructor
...@@ -15,4 +18,60 @@ public class EquipMsg implements Serializable { ...@@ -15,4 +18,60 @@ public class EquipMsg implements Serializable {
private int status; private int status;
private String msg; private String msg;
private Date time; private Date time;
/**
* 消息类型,info,warning,error
*/
private String type;
public Integer getTypeLevel() {
if (type.toUpperCase().equals("ERROR")) {
return 1;
} else if (type.toUpperCase().equals("WARNING")) {
return 100;
}
if (type.toUpperCase().equals("INFO")) {
return 200;
}
return 2;
}
/**
* 英文提示消息
*/
public String msgEn = "";
/**
* 消息字符串Code
*/
private String msgCode;
/**
* 参数
*/
private String[] msgParams;
public boolean IsErrorMsg(){
if(this.type.toUpperCase().equals("ERROR")){
return true;
}
return false;
}
public String getShowMsg(Locale locale) {
if (ObjectUtil.isEmpty(this.msg)) {
return "";
}
//从收到数据中查找
String lan = locale.toLanguageTag();
if (lan.equals(MessageUtils.EN_US) && ObjectUtil.isNotEmpty(getMsgEn())) {
return getMsgEn();
}
//提示信息国际化
if (ObjectUtil.isEmpty(getMsgCode())) {
return this.msg;
} else {
String code = this.msgCode;
if (!code.startsWith(MessageUtils.smfcore)) {
code = MessageUtils.smfcore + "." + this.msgCode;
}
String newMsg = MessageUtils.getText(code, msgParams, locale, getMsg());
return newMsg;
}
}
} }
...@@ -12,7 +12,7 @@ import java.io.Serializable; ...@@ -12,7 +12,7 @@ import java.io.Serializable;
public class ML5NgReelInfo implements Serializable { public class ML5NgReelInfo implements Serializable {
@ApiModelProperty("NG口位置,1=左侧,2=右侧") @ApiModelProperty("NG口位置,1=左侧,2=右侧")
private int NgPos=0; private int ngPos=0;
@ApiModelProperty("物料类型:pizzaBox,pcb,tray,reel") @ApiModelProperty("物料类型:pizzaBox,pcb,tray,reel")
private String mType; private String mType;
......
package com.neotel.smfcore.custom.micron1053.bean.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DeviceUtilizationDto implements Serializable {
private String deviceName;
private String state;
private Date updateDate;
}
package com.neotel.smfcore.custom.micron1053.bean.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class EquipMsgDto implements Serializable {
private String name;
private int status;
private String msg;
private Date time;
/**
* 消息类型,info,warning,error
*/
private String type;
}
...@@ -29,7 +29,7 @@ public class ML5StatusDto implements Serializable { ...@@ -29,7 +29,7 @@ public class ML5StatusDto implements Serializable {
private int ng2Count=0; private int ng2Count=0;
@ApiModelProperty("消息列表") @ApiModelProperty("消息列表")
private List<EquipMsg> msgList=null; private List<EquipMsgDto> msgList=null;
@ApiModelProperty("需要的料架列表") @ApiModelProperty("需要的料架列表")
......
...@@ -21,5 +21,5 @@ public class MicronEquipStatusDto implements Serializable { ...@@ -21,5 +21,5 @@ public class MicronEquipStatusDto implements Serializable {
private Map<String,Integer> statusMap=new HashMap<>(); private Map<String,Integer> statusMap=new HashMap<>();
@ApiModelProperty("消息列表") @ApiModelProperty("消息列表")
private List<EquipMsg> msgList=new ArrayList<>(); private List<EquipMsgDto> msgList=new ArrayList<>();
} }
package com.neotel.smfcore.custom.micron1053.controller; package com.neotel.smfcore.custom.micron1053.controller;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.core.message.enums.MessageType;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService; import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.micron1053.bean.EquipMsg; import com.neotel.smfcore.custom.micron1053.bean.EquipMsg;
import com.neotel.smfcore.custom.micron1053.bean.ML5NgReelInfo; import com.neotel.smfcore.custom.micron1053.bean.ML5NgReelInfo;
import com.neotel.smfcore.custom.micron1053.bean.MicronEquipStatus; import com.neotel.smfcore.custom.micron1053.bean.MicronEquipStatus;
import com.neotel.smfcore.custom.micron1053.bean.dto.EquipMsgDto;
import com.neotel.smfcore.custom.micron1053.bean.dto.ML5ShelfDto; import com.neotel.smfcore.custom.micron1053.bean.dto.ML5ShelfDto;
import com.neotel.smfcore.custom.micron1053.bean.dto.ML5StatusDto; import com.neotel.smfcore.custom.micron1053.bean.dto.ML5StatusDto;
import com.neotel.smfcore.custom.micron1053.util.MicronDataCache; import com.neotel.smfcore.custom.micron1053.util.MicronDataCache;
...@@ -31,7 +34,7 @@ public class MicronML5Controller { ...@@ -31,7 +34,7 @@ public class MicronML5Controller {
@ApiOperation("ML5页面数据获取") @ApiOperation("ML5页面数据获取")
@GetMapping("/status") @GetMapping("/status")
@AnonymousAccess @AnonymousAccess
public ML5StatusDto ml5Status( ) { public ML5StatusDto ml5Status(HttpServletRequest servletRequest ) {
ML5StatusDto resultDto = new ML5StatusDto(); ML5StatusDto resultDto = new ML5StatusDto();
MicronEquipStatus mlL = MicronDataCache.getStatus("ML5-L"); MicronEquipStatus mlL = MicronDataCache.getStatus("ML5-L");
MicronEquipStatus mlR = MicronDataCache.getStatus("ML5-R"); MicronEquipStatus mlR = MicronDataCache.getStatus("ML5-R");
...@@ -51,7 +54,17 @@ public class MicronML5Controller { ...@@ -51,7 +54,17 @@ public class MicronML5Controller {
msgs.addAll(mlR.getMsgList()); msgs.addAll(mlR.getMsgList());
} }
if (msgs.size() > 0) { if (msgs.size() > 0) {
resultDto.setMsgList(msgs); List<EquipMsgDto> msgDtos=new ArrayList<>();
for (EquipMsg msg :
msgs) {
//只显示报警
if(ObjectUtil.isEmpty(msg.getType())|| msg.IsErrorMsg()) {
EquipMsgDto dtoMsg = new EquipMsgDto(msg.getName(), msg.getStatus(), msg.getShowMsg(servletRequest.getLocale()), msg.getTime(), msg.getType());
msgDtos.add(dtoMsg);
}
}
resultDto.setMsgList(msgDtos);
} }
Map<String, ML5ShelfDto> needShelfs = new HashMap<>(); Map<String, ML5ShelfDto> needShelfs = new HashMap<>();
......
package com.neotel.smfcore.custom.micron1053.controller;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.base.IExcelDownLoad;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.init.DataInitManager;
import com.neotel.smfcore.common.utils.FileUtil;
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;
import com.neotel.smfcore.core.message.rest.bean.mapstruct.MessageMapper;
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;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
@Slf4j
@Api(tags = "1053:报表 trayLog, utilization,errorLog, errorReport, eventLog")
@RestController
@RequestMapping("/rest/micron/report")
@RequiredArgsConstructor
public class MicronReportController {
@Autowired
private DataCache dataCache;
@Autowired
private IMessageManager messageManager;
@Autowired
private MessageMapper messageMapper;
@ApiOperation("utilization:获取数据列表")
@GetMapping("/utilization")
@AnonymousAccess
public List<DeviceUtilizationDto> utilization(HttpServletRequest servletRequest) {
return getUtilizationList(servletRequest.getLocale());
}
private List<DeviceUtilizationDto> getUtilizationList(Locale locale) {
List<DeviceUtilizationDto> dtos = new ArrayList<>();
//获取所有料仓状态
Map<String, Storage> allStorages = dataCache.getAllStorage();
String[] msgCodes = new String[]{"smfcore.messages.online", "smfcore.messages.offline"};
for (Storage storage :
allStorages.values()) {
Criteria criteria = Criteria.where("deviceId").is(storage.getId());
criteria.and("msgCode").in(msgCodes);
Sort sort = Sort.by(Sort.Direction.DESC, "createDate");
Query query = new Query(criteria);
query.with(sort);
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", locale, "设备离线");
DeviceUtilizationDto dto = new DeviceUtilizationDto(message.getDeviceName(), msg, DataInitManager.startRunTime);
dtos.add(dto);
continue;
}
}
DeviceUtilizationDto dto = new DeviceUtilizationDto(message.getDeviceName(), message.getShowMsg(locale), message.getUpdateDate());
dtos.add(dto);
}
}
Collections.sort(dtos, new Comparator<DeviceUtilizationDto>() {
@Override
public int compare(DeviceUtilizationDto o1, DeviceUtilizationDto o2) {
return o2.getUpdateDate().compareTo(o1.getUpdateDate());
}
});
return dtos;
}
@ApiOperation("utilization:导出")
@RequestMapping("/utilization/download")
@AnonymousAccess
public void utilizationDownload( HttpServletRequest servletRequest,HttpServletResponse response) throws IOException {
Locale locale=servletRequest.getLocale();
List<DeviceUtilizationDto> dtos = getUtilizationList(locale);
log.info("开始导出 utilization ");
FileUtil.downloadExcel(null, null, response, new IExcelDownLoad() {
@Override
public List<List<String>> getHeader() {
List<List<String>> header = new ArrayList<>();
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.utilization.deviceName",locale,"设备名称")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.utilization.state",locale,"状态")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.utilization.updateTime",locale,"更新时间")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.utilization.timeToDate",locale,"截止到目前的时间(小时)")));
return header;
}
@Override
public List<List<Object>> getPageData(Query query, Pageable pageable) {
List<List<Object>> dataList = new ArrayList<>();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (DeviceUtilizationDto dto : dtos) {
String updateDate = dateFormat.format(dto.getUpdateDate());
long tTime=System.currentTimeMillis()-dto.getUpdateDate().getTime();
String hour= String.format("%.1f",(float)tTime/1000/60/60) ;
List<Object> data = new ArrayList<>();
data.add(dto.getDeviceName());
data.add(dto.getState());
data.add(updateDate);
data.add(hour);
dataList.add(data);
}
return dataList;
}
});
log.info("utilization 导出完成");
}
@ApiOperation("ErrorLog:错误数据列表")
@GetMapping("/errorLog")
@AnonymousAccess
public PageData<MessageDto> errorLog(MessageCriteria criteria, Pageable pageable, HttpServletRequest request){
criteria.setType("ERROR");
Query query = QueryHelp.getQuery(criteria);
PageData<Message> messagePageData=messageManager.findByPage(query,pageable);
List<MessageDto> dtos=messageMapper.toDto(messagePageData.getContent());
for (int i=0;i<dtos.size();i++) {
if(ObjectUtil.isNotEmpty(dtos.get(i).getMsgCode())){
dtos.get(i).setMsg(MessageUtils.getText(dtos.get(i).getMsgCode(),dtos.get(i).getMsgParams(),request.getLocale(),dtos.get(i).getMsg()));
}
}
return new PageData(dtos,messagePageData.getTotalElements());
}
@ApiOperation("ErrorLog:导出")
@RequestMapping("/errorLog/download")
@AnonymousAccess
public void errorLogDownload( MessageCriteria criteria, Pageable pageable,HttpServletRequest servletRequest,HttpServletResponse response) throws IOException {
Locale locale=servletRequest.getLocale();
log.info("开始导出 ErrorLog ");
criteria.setType("ERROR");
Query query = QueryHelp.getQuery(criteria);
FileUtil.downloadExcel(query, pageable, response, new IExcelDownLoad() {
@Override
public List<List<String>> getHeader() {
List<List<String>> header = new ArrayList<>();
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.utilization.deviceName",locale,"设备名称")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.infoFind.mess",locale,"消息")));
header.add(Lists.newArrayList(MessageUtils.getSmfClientMsg("smfclient.NeoLight.createDate",locale,"创建时间")));
return header;
}
@Override
public List<List<Object>> getPageData(Query query, Pageable pageable) {
List<List<Object>> dataList = new ArrayList<>();
PageData<Message> messagePageData=messageManager.findByPage(query,pageable);
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (Message msg : messagePageData.getContent()) {
String createDate = dateFormat.format(msg.getCreateDate());
List<Object> data = new ArrayList<>();
data.add(msg.getDeviceName());
data.add(msg.getShowMsg(locale));
data.add(createDate);
dataList.add(data);
}
return dataList;
}
});
log.info("ErrorLog 导出完成");
}
@ApiOperation("eventLog:事件列表")
@GetMapping("/eventLog")
@AnonymousAccess
public PageData<MessageDto> eventLog(MessageCriteria criteria, Pageable pageable, HttpServletRequest request){
criteria.setType("INFO");
Query query = QueryHelp.getQuery(criteria);
PageData<Message> messagePageData=messageManager.findByPage(query,pageable);
List<MessageDto> dtos=messageMapper.toDto(messagePageData.getContent());
for (int i=0;i<dtos.size();i++) {
if(ObjectUtil.isNotEmpty(dtos.get(i).getMsgCode())){
dtos.get(i).setMsg(MessageUtils.getText(dtos.get(i).getMsgCode(),dtos.get(i).getMsgParams(),request.getLocale(),dtos.get(i).getMsg()));
}
}
return new PageData(dtos,messagePageData.getTotalElements());
}
}
...@@ -8,6 +8,7 @@ import com.neotel.smfcore.core.device.bean.BoxStatusBean; ...@@ -8,6 +8,7 @@ import com.neotel.smfcore.core.device.bean.BoxStatusBean;
import com.neotel.smfcore.core.device.bean.StatusBean; import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.OP_STATUS; import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.message.enums.MessageType;
import com.neotel.smfcore.core.report.bean.ChartItem; import com.neotel.smfcore.core.report.bean.ChartItem;
import com.neotel.smfcore.core.storage.bean.UsageItem; import com.neotel.smfcore.core.storage.bean.UsageItem;
import com.neotel.smfcore.core.storage.service.manager.IStorageManager; import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
...@@ -54,18 +55,35 @@ public class MicronStatusController { ...@@ -54,18 +55,35 @@ public class MicronStatusController {
@GetMapping("/equipView") @GetMapping("/equipView")
@AnonymousAccess @AnonymousAccess
public MicronEquipStatusDto view(HttpServletRequest servletRequest) { public MicronEquipStatusDto view(HttpServletRequest servletRequest) {
MicronEquipStatusDto dto=new MicronEquipStatusDto(); MicronEquipStatusDto dto = new MicronEquipStatusDto();
dto.setMsgList(new ArrayList<>()); dto.setMsgList(new ArrayList<>());
dto.setStatusMap(new HashMap<>()); dto.setStatusMap(new HashMap<>());
// ML5,CI,R1,R2,R3 // ML5,CI,R1,R2,R3
String[] names=new String[]{"ML5-L","ML5-R","CI","R1","R2","R3"}; List<EquipMsg> allMsgList = new ArrayList<>();
for (String name :names // 设备组
) { // LS1
MicronEquipStatus s=MicronDataCache.getStatus(name); // LS2
if(!s.timeOut()){ // LS3
String newKey=s.getEquipName().replace("-",""); // LS4
dto.getStatusMap().put(newKey,s.getStatus() ); //
// AMH-SBSH2
// AMH-SBDH2-1
// AMH-SBDH2-2
// AMH-SBSH1
// AMH-SBDH3-1
// AMH-SBDH3-2
// AMH-SBDH1-1
// AMH-SBDH1-2
String[] names = new String[]{"ML5-L", "ML5-R", "CI", "R1", "R2", "R3",
"LS1","LS2","LS3","LS4","AMH-SBSH1","AMH-SBSH2","AMH-SBDH1-1","AMH-SBDH1-2","AMH-SBDH2-1","AMH-SBDH2-2","AMH-SBDH3-1","AMH-SBDH3-2"};
for (String name : names
) {
MicronEquipStatus s = MicronDataCache.getStatus(name);
if (!s.timeOut()) {
String newKey = s.getEquipName().replace("-", "");
dto.getStatusMap().put(newKey, s.getStatus());
// if(s.getMsgList()!=null&&s.getMsgList().size()>0) { // if(s.getMsgList()!=null&&s.getMsgList().size()>0) {
// dto.getMsgList().addAll(s.getMsgList()); // dto.getMsgList().addAll(s.getMsgList());
// } // }
...@@ -73,28 +91,35 @@ public class MicronStatusController { ...@@ -73,28 +91,35 @@ public class MicronStatusController {
} }
//所有设备的报警都加上 //所有设备的报警都加上
List<MicronEquipStatus> statuses = new ArrayList<>(); List<MicronEquipStatus> statuses = new ArrayList<>();
statuses.addAll(MicronDataCache.equipStatusMap.values()); if (MicronDataCache.equipStatusMap != null && MicronDataCache.equipStatusMap.size() > 0) {
for (MicronEquipStatus s : statuses.addAll(MicronDataCache.equipStatusMap.values());
statuses) { for (MicronEquipStatus s :
if (!s.timeOut()) { statuses) {
if(!dto.getStatusMap().containsKey(s.getEquipName())){ if (!s.timeOut()) {
dto.getStatusMap().put(s.getEquipName(),s.getStatus()); if (!dto.getStatusMap().containsKey(s.getEquipName())) {
} if(s.getStatus()>0) {
if (s.getMsgList() != null && s.getMsgList().size() > 0) { dto.getStatusMap().put(s.getEquipName(), s.getStatus());
dto.getMsgList().addAll(s.getMsgList()); }
}
if (s.getMsgList() != null && s.getMsgList().size() > 0) {
allMsgList.addAll(s.getMsgList());
}
} }
} }
} }
//料仓状态 //料仓状态
List<String> boxList=new ArrayList<>(); List<String> boxList = new ArrayList<>();
for (int i=1;i<=8;i++ for (int i = 1; i <= 8; i++
) { ) {
boxList.add("M"+i); boxList.add("M" + i);
} }
// SBDH1, SBDH2, SBDH3, SBSH1, SBSH2 // SBDH1, SBDH2, SBDH3, SBSH1, SBSH2
boxList.add("SBDH1"); boxList.add("SBDH1-1");
boxList.add("SBDH2"); boxList.add("SBDH1-2");
boxList.add("SBDH3"); boxList.add("SBDH2-1");
boxList.add("SBDH2-2");
boxList.add("SBDH3-1");
boxList.add("SBDH3-2");
boxList.add("SBSH1"); boxList.add("SBSH1");
boxList.add("SBSH2"); boxList.add("SBSH2");
// for (MicronEquipName name : MicronEquipName.sbBoxList()){ // for (MicronEquipName name : MicronEquipName.sbBoxList()){
...@@ -104,14 +129,35 @@ public class MicronStatusController { ...@@ -104,14 +129,35 @@ public class MicronStatusController {
for (String boxName : for (String boxName :
boxList) { boxList) {
//查找料仓 //查找料仓
MicronEquipStatus s=getBoxEquip(boxName,servletRequest.getLocale()); MicronEquipStatus s = getBoxEquip(boxName, servletRequest.getLocale());
dto.getStatusMap().put(s.getEquipName(),s.getStatus() ); if (s.getStatus() > 0) {
if(s.getMsgList()!=null&&s.getMsgList().size()>0) { dto.getStatusMap().put(s.getEquipName().replace("-", ""), s.getStatus());
dto.getMsgList().addAll(s.getMsgList()); }
if (s.getMsgList() != null && s.getMsgList().size() > 0) {
allMsgList.addAll(s.getMsgList());
} }
} }
try {
Collections.sort(allMsgList, new Comparator<EquipMsg>() {
@Override
public int compare(EquipMsg o1, EquipMsg o2) {
return o1.getTypeLevel().compareTo(o2.getTypeLevel());
}
});
} catch (Exception ex) {
return dto; }
for (EquipMsg msg :
allMsgList) {
//只显示报警
// if(ObjectUtil.isEmpty(msg.getType())|| msg.IsErrorMsg()) {
EquipMsgDto dtoMsg = new EquipMsgDto(msg.getName(), msg.getStatus(), msg.getShowMsg(servletRequest.getLocale()), msg.getTime(), msg.getType());
dto.getMsgList().add(dtoMsg);
// }
}
return dto;
} }
private List<String> getCidsByBoxName(String boxName) { private List<String> getCidsByBoxName(String boxName) {
...@@ -146,16 +192,25 @@ public class MicronStatusController { ...@@ -146,16 +192,25 @@ public class MicronStatusController {
if (s.timeOut()) { if (s.timeOut()) {
} else { } else {
if (s.getStatus() == 1) { if (s.getStatus() == 2||s.getStatus()==3) {
dto.setStatus(s.getStatus());
} else if (s.getStatus() == 2||s.getStatus()==3) {
dto.setStatus(2); dto.setStatus(2);
} }
String msg=s.getShowMsg(locale); //如果状态还是0,需要改为1
if (ObjectUtil.isNotEmpty(msg)) { else if(dto.getStatus()==0){
dto.getMsgList().add(new EquipMsg(s.getCid(), s.getStatus(), msg, new Date(s.getTime()))); dto.setStatus(1);
}
Map<String,String> msgMap=s.getMsgMap();
if(msgMap!=null&&msgMap.size()>0) {
for (String msg :
msgMap.keySet()) {
String type= msgMap.getOrDefault(msg, "");
dto.getMsgList().add(new EquipMsg(s.getCid(), s.getStatus(), msg, new Date(s.getTime()), type, "", "", new String[]{}));
}
} }
// String msg=s.getErrorMsg(locale);
// if (ObjectUtil.isNotEmpty(msg)) {
// dto.getMsgList().add(new EquipMsg(s.getCid(), s.getStatus(), msg, new Date(s.getTime()),"","","",new String[]{}));
// }
} }
} }
return dto; return dto;
...@@ -191,7 +246,7 @@ public class MicronStatusController { ...@@ -191,7 +246,7 @@ public class MicronStatusController {
dto.setTemperature(temperature); dto.setTemperature(temperature);
} }
dto.getStatuMap().put(cid, boxStatus.getStatus()); dto.getStatuMap().put(cid, boxStatus.getStatus());
dto.getMsgMap().put(cid, statusBean.getShowMsg(servletRequest.getLocale())); dto.getMsgMap().put(cid, statusBean.getErrorMsg(servletRequest.getLocale()));
} }
}else{ }else{
...@@ -281,11 +336,10 @@ public class MicronStatusController { ...@@ -281,11 +336,10 @@ public class MicronStatusController {
StatusBean statusBean = DevicesStatusUtil.getStatusBean(cid); StatusBean statusBean = DevicesStatusUtil.getStatusBean(cid);
if (statusBean != null && (!statusBean.timeOut())) { if (statusBean != null && (!statusBean.timeOut())) {
if (statusBean.getStatus() == 1) { if (statusBean.getStatus() == 2 || statusBean.getStatus() == 3) {
boxDto.setStatus(statusBean.getStatus());
} else if (statusBean.getStatus() == 2 || statusBean.getStatus() == 3) {
boxDto.setStatus(2); boxDto.setStatus(2);
} else {
boxDto.setStatus(1);
} }
} }
boxDtos.add(boxDto); boxDtos.add(boxDto);
...@@ -329,33 +383,44 @@ public class MicronStatusController { ...@@ -329,33 +383,44 @@ public class MicronStatusController {
@GetMapping("/alarmMsgCount") @GetMapping("/alarmMsgCount")
@AnonymousAccess @AnonymousAccess
public ResultBean alarmMsgCount(HttpServletRequest servletRequest) { public ResultBean alarmMsgCount(HttpServletRequest servletRequest) {
int count=0; int count = 0;
try {
//先添加设备的 //先添加设备的
List<MicronEquipStatus> statuses = new ArrayList<>(); List<MicronEquipStatus> statuses = new ArrayList<>();
statuses.addAll(MicronDataCache.equipStatusMap.values()); if (MicronDataCache.equipStatusMap != null && MicronDataCache.equipStatusMap.size() > 0) {
for (MicronEquipStatus s : statuses.addAll(MicronDataCache.equipStatusMap.values());
statuses) { for (MicronEquipStatus s :
if (!s.timeOut()) { statuses) {
if (s.getMsgList() != null && s.getMsgList().size() > 0) { if (!s.timeOut()) {
count+=s.getMsgList().size(); if (s.getMsgList() != null && s.getMsgList().size() > 0) {
for (EquipMsg msg : s.getMsgList()){
//只累计报警消息
if(ObjectUtil.isEmpty(msg.getType())|| msg.IsErrorMsg()) {
count += s.getMsgList().size();
}
}
}
}
} }
} }
}
//添加料仓的 //添加料仓的
List<Storage> storages = new ArrayList<>(); Map<String, Storage> allStorages = dataCache.getAllStorage();
storages.addAll(dataCache.getAllStorage().values()); if (allStorages != null && allStorages.size() > 0) {
for (Storage storage : for (Storage storage :
storages) { allStorages.values()) {
StatusBean statusBean = DevicesStatusUtil.getStatusBean(storage.getCid()); StatusBean statusBean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (statusBean != null && (!statusBean.timeOut())) { if (statusBean != null && (!statusBean.timeOut())) {
String msg = statusBean.getShowMsg(servletRequest.getLocale()); String msg = statusBean.getErrorMsg(servletRequest.getLocale());
if (ObjectUtil.isNotEmpty(msg)) { if (ObjectUtil.isNotEmpty(msg)) {
count+=1; count += 1;
}
}
} }
} }
} catch (Exception ex) {
log.error("alarmMsgCount 出错:" + ex.toString());
} }
return ResultBean.newOkResult(count); return ResultBean.newOkResult(count);
......
package com.neotel.smfcore.custom.micron1053.util; package com.neotel.smfcore.custom.micron1053.util;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.micron1053.bean.EquipMsg; import com.neotel.smfcore.custom.micron1053.bean.EquipMsg;
import com.neotel.smfcore.custom.micron1053.bean.ML5NgReelInfo; import com.neotel.smfcore.custom.micron1053.bean.ML5NgReelInfo;
...@@ -23,16 +24,36 @@ public class MicronDataCache { ...@@ -23,16 +24,36 @@ public class MicronDataCache {
if (bean == null) { if (bean == null) {
return; return;
} }
List<String> oldMsgs=new ArrayList<>();
MicronEquipStatus oldS=equipStatusMap.getOrDefault(bean.getEquipName(),new MicronEquipStatus());
if(oldS.getMsgList()!=null&&oldS.getMsgList().size()>0){
for (EquipMsg msg :
oldS.getMsgList()) {
oldMsgs.add(msg.getMsg());
}
}
List<EquipMsg> msgs=new ArrayList<>(); List<EquipMsg> msgs=new ArrayList<>();
if(bean.getMsgList()!=null&&bean.getMsgList().size()>0){ if(bean.getMsgList()!=null&&bean.getMsgList().size()>0){
for (EquipMsg msg : for (EquipMsg msg :
bean.getMsgList()) { bean.getMsgList()) {
if(ObjectUtil.isEmpty(msg.getMsg())){
continue;
}
if(ObjectUtil.isEmpty(msg.getName())){ if(ObjectUtil.isEmpty(msg.getName())){
msg.setName(bean.getEquipName()); msg.setName(bean.getEquipName());
} }
if(msg.getTime()==null){ if(msg.getTime()==null){
msg.setTime(new Date()); msg.setTime(new Date());
} }
//判断是否需要保存到数据
if(!oldMsgs.contains(msg.getMsg())){
//保存数据
DeviceMessageUtil.addMessage(msg.getType(),bean.getEquipName(), msg.getName(),msg.getMsgCode(),msg.getMsg(),msg.getMsgParams());
}
msgs.add(msg); msgs.add(msg);
} }
bean.setMsgList(msgs); bean.setMsgList(msgs);
......
...@@ -36,7 +36,7 @@ import java.util.*; ...@@ -36,7 +36,7 @@ import java.util.*;
@RestController @RestController
@RequestMapping("/rest/micron/sp") @RequestMapping("/rest/micron/sp")
@RequiredArgsConstructor @RequiredArgsConstructor
public class MicronReportController { public class MicronSpReportController {
@Autowired @Autowired
private TaskService taskService; private TaskService taskService;
......
...@@ -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);
......
...@@ -310,6 +310,25 @@ smfcore.humiture.temperature=\u6E29\u5EA6 ...@@ -310,6 +310,25 @@ smfcore.humiture.temperature=\u6E29\u5EA6
smfcore.humiture.humiture=\u6E7F\u5EA6 smfcore.humiture.humiture=\u6E7F\u5EA6
smfcore.humiture.createDate=\u521B\u5EFA\u65F6\u95F4 smfcore.humiture.createDate=\u521B\u5EFA\u65F6\u95F4
smfcore.humiture.updateDate=\u66F4\u65B0\u65F6\u95F4 smfcore.humiture.updateDate=\u66F4\u65B0\u65F6\u95F4
smfcore.order.ri=RI
smfcore.order.pn=PN
smfcore.order.MPN=MPN
smfcore.order.side=\u9762\u522B
smfcore.order.tableNo=\u53F0\u8F66\u53F7
smfcore.order.feederInfo=\u7AD9\u4F4D\u4FE1\u606F
smfcore.order.needReelCount=\u9700\u6C42\u76D8\u6570
smfcore.order.outReelCount=\u5DF2\u51FA\u76D8\u6570
smfcore.order.needNum=\u9700\u6C42\u6570\u91CF
smfcore.order.outNum=\u5DF2\u51FA\u6570\u91CF
smfcore.trayLog=\u6599\u76D8\u65E5\u5FD7
smfcore.utilization=Utilization
smfcore.errorLog=ErrorLog
smfcore.errorReport=ErrorReport
smfcore.eventLog=EventLog
smfcore.reports=Report
smfcore.queryPos.cannotFind=cannot find posName [{0}]
smfcore.queryPos.posIsEmpty=[{0}] is empty
smfcore.queryPos.cannotFindBarcode=cannot find barcode [{0}] In storage
#smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0} #smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0}
#smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1} #smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1}
#smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F #smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F
......
...@@ -308,4 +308,23 @@ smfcore.humiture.cid=CID ...@@ -308,4 +308,23 @@ smfcore.humiture.cid=CID
smfcore.humiture.temperature=Temperature smfcore.humiture.temperature=Temperature
smfcore.humiture.humiture=Humidity smfcore.humiture.humiture=Humidity
smfcore.humiture.createDate=Create Time smfcore.humiture.createDate=Create Time
smfcore.humiture.updateDate=Update Time
\ No newline at end of file \ No newline at end of file
smfcore.humiture.updateDate=Update Time
smfcore.order.ri=RI
smfcore.order.pn=PN
smfcore.order.MPN=MPN
smfcore.order.side=Face Type
smfcore.order.tableNo=Trolley Number
smfcore.order.feederInfo=Station Information
smfcore.order.needReelCount=Need Reel Count
smfcore.order.outReelCount=Out Reel Count
smfcore.order.needNum=Demand Quantity
smfcore.order.outNum=Quantity Issued
smfcore.trayLog=TrayLog
smfcore.utilization=Utilization
smfcore.errorLog=ErrorLog
smfcore.errorReport=ErrorReport
smfcore.eventLog=EventLog
smfcore.reports=Report
smfcore.queryPos.cannotFind=cannot find posName [{0}]
smfcore.queryPos.posIsEmpty=[{0}] is empty
smfcore.queryPos.cannotFindBarcode=cannot find barcode [{0}] In storage
\ No newline at end of file \ No newline at end of file
...@@ -306,3 +306,22 @@ smfcore.humiture.temperature=\u6E29\u5EA6 ...@@ -306,3 +306,22 @@ smfcore.humiture.temperature=\u6E29\u5EA6
smfcore.humiture.humiture=\u6E7F\u5EA6 smfcore.humiture.humiture=\u6E7F\u5EA6
smfcore.humiture.createDate=\u521B\u5EFA\u65F6\u95F4 smfcore.humiture.createDate=\u521B\u5EFA\u65F6\u95F4
smfcore.humiture.updateDate=\u66F4\u65B0\u65F6\u95F4 smfcore.humiture.updateDate=\u66F4\u65B0\u65F6\u95F4
smfcore.order.ri=RI
smfcore.order.pn=PN
smfcore.order.MPN=MPN
smfcore.order.side=\u3068\u5225\u308C\u308B
smfcore.order.tableNo=\u53F0\u8ECA\u756A\u53F7
smfcore.order.feederInfo=\u7AD9\u4F4D\u4FE1\u606F
smfcore.order.needReelCount=\u9700\u8981\u30C7\u30A3\u30B9\u30AF\u6570
smfcore.order.outReelCount=\u30C7\u30A3\u30B9\u30AF\u304C\u51FA\u307E\u3057\u305F
smfcore.order.needNum=\u9700\u6C42\u6570\u91CF
smfcore.order.outNum=\u51FA\u8377\u6E08\u6570\u91CF
smfcore.trayLog=TrayLog
smfcore.utilization=Utilization
smfcore.errorLog=ErrorLog
smfcore.errorReport=ErrorReport
smfcore.eventLog=EventLog
smfcore.reports=Report
smfcore.queryPos.cannotFind=cannot find posName [{0}]
smfcore.queryPos.posIsEmpty=[{0}] is empty
smfcore.queryPos.cannotFindBarcode=cannot find barcode [{0}] In storage
...@@ -305,4 +305,23 @@ smfcore.humiture.cid=CID ...@@ -305,4 +305,23 @@ smfcore.humiture.cid=CID
smfcore.humiture.temperature=\u6E29\u5EA6 smfcore.humiture.temperature=\u6E29\u5EA6
smfcore.humiture.humiture=\u6E7F\u5EA6 smfcore.humiture.humiture=\u6E7F\u5EA6
smfcore.humiture.createDate=\u521B\u5EFA\u65F6\u95F4 smfcore.humiture.createDate=\u521B\u5EFA\u65F6\u95F4
smfcore.humiture.updateDate=\u66F4\u65B0\u65F6\u95F4
\ No newline at end of file \ No newline at end of file
smfcore.humiture.updateDate=\u66F4\u65B0\u65F6\u95F4
smfcore.order.ri=RI
smfcore.order.pn=PN
smfcore.order.MPN=MPN
smfcore.order.side=\u9762\u522B
smfcore.order.tableNo=\u53F0\u8F66\u53F7
smfcore.order.feederInfo=\u7AD9\u4F4D\u4FE1\u606F
smfcore.order.needReelCount=\u9700\u6C42\u76D8\u6570
smfcore.order.outReelCount=\u5DF2\u51FA\u76D8\u6570
smfcore.order.needNum=\u9700\u6C42\u6570\u91CF
smfcore.order.outNum=\u5DF2\u51FA\u6570\u91CF
smfcore.trayLog=\u6599\u76D8\u65E5\u5FD7
smfcore.utilization=Utilization
smfcore.errorLog=ErrorLog
smfcore.errorReport=ErrorReport
smfcore.eventLog=EventLog
smfcore.reports=Report
smfcore.queryPos.cannotFind=cannot find posName [{0}]
smfcore.queryPos.posIsEmpty=[{0}] is empty
smfcore.queryPos.cannotFindBarcode=cannot find barcode [{0}] In storage
\ No newline at end of file \ No newline at end of file
...@@ -306,4 +306,23 @@ smfcore.humiture.cid=CID ...@@ -306,4 +306,23 @@ smfcore.humiture.cid=CID
smfcore.humiture.temperature=\u6E29\u5EA6 smfcore.humiture.temperature=\u6E29\u5EA6
smfcore.humiture.humiture=\u6E7F\u5EA6 smfcore.humiture.humiture=\u6E7F\u5EA6
smfcore.humiture.createDate=\u521B\u5EFA\u65F6\u95F4 smfcore.humiture.createDate=\u521B\u5EFA\u65F6\u95F4
smfcore.humiture.updateDate=\u66F4\u65B0\u65F6\u95F4
\ No newline at end of file \ No newline at end of file
smfcore.humiture.updateDate=\u66F4\u65B0\u65F6\u95F4
smfcore.order.ri=RI
smfcore.order.pn=PN
smfcore.order.MPN=MPN
smfcore.order.side=\u9762\u5225
smfcore.order.tableNo=\u53F0\u8ECA\u865F
smfcore.order.feederInfo=\u7AD9\u4F4D\u4FE1\u606F
smfcore.order.needReelCount=\u9700\u6C42\u76E4\u6578
smfcore.order.outReelCount=\u5DF2\u51FA\u76E4\u6578
smfcore.order.needNum=\u9700\u6C42\u6578\u91CF
smfcore.order.outNum=\u5DF2\u51FA\u6578\u91CF
smfcore.trayLog=\u6599\u76E4\u65E5\u8A8C
smfcore.utilization=Utilization
smfcore.errorLog=ErrorLog
smfcore.errorReport=ErrorReport
smfcore.eventLog=EventLog
smfcore.reports=Report
smfcore.queryPos.cannotFind=cannot find posName [{0}]
smfcore.queryPos.posIsEmpty=[{0}] is empty
smfcore.queryPos.cannotFindBarcode=cannot find barcode [{0}] In storage
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!