Commit ecbbf194 sunke

Merge remote-tracking branch 'origin/master'

2 个父辈 3601d390 aaf81e23
正在显示 61 个修改的文件 包含 1335 行增加97 行删除
package com.neotel.smfcore.common.excel;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcel;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
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
NoModelDataListener listener = new NoModelDataListener();
if(headRowNumber<=1){
if (headRowNumber <= 1) {
EasyExcel.read(fileName, listener).sheet().doRead();
}
else{
} else {
EasyExcel.read(fileName, listener).sheet().headRowNumber(headRowNumber).doRead();
}
List<Map<Integer, String>> data = listener.getData();
......@@ -29,6 +31,37 @@ public class ExcelReader {
return data;
}
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.*;
@Component
public class DataInitManager {
public static Date startRunTime=new Date();
public static Set<String> allPermissionSet;
@Value("${menu.show}")
......@@ -72,6 +74,7 @@ public class DataInitManager {
public void DataInit() {
try {
log.info("smfcore Version:["+version+"], 初始化环境...");
startRunTime=new Date();
//查询admin的用户是否存在
String userName = Constants.SUPER_USERNAME;
User admin = userManager.findByUserName(userName);
......
......@@ -73,7 +73,16 @@ public class DateUtil {
public static Date toDate(final String strDate) throws ParseException {
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){
SimpleDateFormat df;
Date date;
......
......@@ -260,6 +260,9 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
}
excelWriter.write(data, writeSheet);
page = page.next();
if(pageable==null){
break;
}
}
}
}
......
......@@ -92,6 +92,23 @@ public class CodeResolve {
barcode = barcodeManager.findByBarcode(codeStr);
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;
Component component = componentManager.findByPartNumberAndProvider(barcode.getPartNumber(),barcode.getProvider());
int validDay = 0;
......
......@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.google.common.base.Strings;
import com.neotel.smfcore.core.device.enums.BOX_STATUS;
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.system.service.po.AlarmInfo;
import lombok.Data;
......@@ -173,7 +174,7 @@ public class StatusBean {
* 提示信息是否超时(10秒)提示信息默认十分钟后不再显示
* @return
*/
public boolean msgTimeOut(){return (System.currentTimeMillis()-lastSaveTime)>(10*1000);}
public boolean msgTimeOut(){return (System.currentTimeMillis()-time)>(10*1000);}
/**
* 获取客户端发送上来的二维码
......@@ -271,7 +272,7 @@ public class StatusBean {
data.put(key, valueStr);
}
public void addPosInfo(String barcode, String posId, int plateW, int plateH, boolean isSingleOut ){
addPosInfo(barcode,posId,plateW,plateH,isSingleOut,0);
addPosInfo(barcode,posId,plateW,plateH,isSingleOut,false,0);
}
/**
* 获取客户端发送上来的条码信息
......@@ -282,7 +283,7 @@ public class StatusBean {
/**
* 入库时添加仓位及料盘大小信息(posId库位编号,plateW:料盘宽度,plateH:料盘高度,singleOut:是否出库到料仓门口)
*/
public void addPosInfo(String barcode, String posId, int plateW, int plateH, boolean isSingleOut,int usedCount){
public void addPosInfo(String barcode, String posId, int plateW, int plateH, boolean isSingleOut,boolean isNgReel,int usedCount){
String originalPosId = data.get("posId");
String originalPlateW = data.get("plateW");
String originalPlateH = data.get("plateH");
......@@ -312,6 +313,10 @@ public class StatusBean {
data.put("plateH",plateHStr);
data.put("barcode",barcodeStr);
data.put("singleOut", isSingleOut+"");
data.put("ngReel",isNgReel+"");
if(isNgReel){
data.put("ngMsg","Repeat Inbound");
}
data.put("usedCount",usedCount+"" );
}
......@@ -536,8 +541,7 @@ public class StatusBean {
}
//提示信息国际化
if (ObjectUtil.isEmpty(getMsgCode())) {
return this.msg;
return this.msg.replace("A=","").replace("I=","").replace("W=","");
} else {
String code = this.msgCode;
if (!code.startsWith(MessageUtils.smfcore)) {
......@@ -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 {
}
}
ReelLockPosUtil.removeReelLockPosInfo(barcodeSave.getBarcode());
//ReelLockPosUtil.removeReelLockPosInfo(barcodeSave.getBarcode());
return taskService.addPutInTaskToExecute(storage, barcodeSave, storagePos);
}
}
......@@ -279,7 +279,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
String posId = putInTask.getPosName();
int plateW = barcodeSave.getPlateSize();
int plateH = barcodeSave.getHeight();
statusBean.addPosInfo(barcodeSave.getBarcode(), posId, plateW, plateH, false,barcodeSave.getUsedCount());
statusBean.addPosInfo(barcodeSave.getBarcode(), posId, plateW, plateH, false,false,barcodeSave.getUsedCount());
log.info(barcodeSave.getBarcode() + "[" + plateW + "x" + plateH + "]开始入库到" + storage.getCid() + "[" + posId + "]");
//清空展示的消息
......@@ -519,7 +519,6 @@ public class BaseDeviceHandler implements IDeviceHandler {
updatePosExecuteTime(task.getPosName(), executeTime);
}
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,执行时间[" + executeTime + "]秒");
ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
DataLog cancelTask = taskService.findFinishedPutInTask(cid, task.getPosName(), task.getBarcode());
if (cancelTask != null && cancelTask.isCancel()) {
//将相同库位已经取消的任务从完成队列里删除
......@@ -527,6 +526,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
log.info("从已完成的任务列表中删除之前取消的任务:" + cancelTask.getPosName() + " ReelId:" + cancelTask.getBarcode());
}
updatePutInData(task);
ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
} else {
//从已完成列表中找,如果还找不到就忽略
task = taskService.findFinishedPutInTask(cid, posName, barcode);
......@@ -699,6 +699,13 @@ public class BaseDeviceHandler implements IDeviceHandler {
task.setStatus(OP_STATUS.FINISHED.name());
taskService.updateFinishedTask(task);
//如果入库任务标记为NG,自动生成出库任务
if(task.isNgReel()){
Storage storage=dataCache.getStorageById(storagePos.getStorageId());
taskService.checkout(storage,storagePos,false,true,"","");
log.error("updatePutInData 入库任务["+storagePos.getBarcode()+"]["+storagePos.getPosName()+"]标记为NG,自动生成NG出库任务 " );
}
// //调用西门子接口
// SiemensApi.lotInOut(barcode.getBarcode(),1);
......@@ -925,8 +932,11 @@ public class BaseDeviceHandler implements IDeviceHandler {
plateH = codeObj.getHeight();
} else {
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());
}
return statusBean;
......
......@@ -132,6 +132,9 @@ public class MimoBoxHandler extends BaseDeviceHandler {
plateH = codeObj.getHeight();
} else {
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);
log.info("出库紧急物料" + storage.getName() + "[" + posName + "]物料[" + singleOutTask.getBarcode() + "]" + "发送到客户端" + cid);
......
......@@ -210,7 +210,13 @@ public class ThirdBoxHandler extends BaseDeviceHandler{
List<DataLog> finishedTasks = taskService.getFinishedTasks();
for (DataLog finishedTask : finishedTasks) {
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());
taskService.updateFinishedTask(finishedTask);
......@@ -219,7 +225,7 @@ public class ThirdBoxHandler extends BaseDeviceHandler{
}
}
}
log.error(posName + "出库放到门口时,未找到对应的出库任务");
log.error(posName + ",barcode["+barcode+"] 出库放到门口时,未找到对应的出库任务");
} else if (BOX_STATUS.OUT_FAILED == status) {
//更改出库状态为OUT_DOOR
List<DataLog> finishedTasks = taskService.getFinishedTasks();
......
......@@ -585,4 +585,43 @@ public class DeviceController {
}
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;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
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.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
......@@ -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.query.BoxTaskQueryCriter;
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.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
......@@ -446,8 +448,17 @@ public class BoxKanbanController {
String humidity = boxStatus.getHumidity();
String temperature = boxStatus.getTemperature();
boxDto.setHumidity(humidity);
boxDto.setCodeAirTemp(boxStatus.getCodeAirTemp());
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.setMsg(bean.getShowMsg(locale));
boxDto.setBarcode(bean.getCode());
......
......@@ -179,6 +179,11 @@ public class MessageUtils {
public static String getSmfClientMsg(String code, Locale locale, String defaultMsg){
LanguageMsg languageMsg = getMsg("smfclient",code);
if(languageMsg==null){
//重新取一次
String nCode=code.replace("smfclient.","");
languageMsg = getMsg("smfclient",nCode);
}
if(languageMsg != null){
String msg = languageMsg.getContent(locale.toLanguageTag());
if(!msg.isEmpty()){
......
package com.neotel.smfcore.core.materialLog.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;
import com.neotel.smfcore.common.utils.QueryHelp;
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.MsgCountDto;
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.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
......@@ -70,4 +72,33 @@ public class MessageController {
List<String> typeList=messageManager.findDeviceNameList();
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;
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 {
List<MsgCountDto> getMsgCountList(Criteria criteria);
}
package com.neotel.smfcore.core.message.service.dao.impl;
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.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 java.util.List;
@Service
public class MessageDaoImpl extends AbstractBaseDao implements IMessageDao {
@Override
public Class getEntityClass() {
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;
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 org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
......@@ -11,4 +14,8 @@ public interface IMessageManager extends IBaseManager<Message> {
void download(List<Message> list, HttpServletResponse response, Locale locale);
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
import com.neotel.smfcore.core.language.service.po.LanguageMsg;
import com.neotel.smfcore.core.language.util.MessageUtils;
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.manager.IMessageManager;
import com.neotel.smfcore.core.message.service.po.Message;
......@@ -120,6 +121,15 @@ public class MessageManagerImpl implements IMessageManager {
}
return result;
}
@Override
public Message findOne(Query query){
return messageDao.findOne(query);
}
@Override
public List<MsgCountDto> getMsgCountList(Criteria criteria) {
return messageDao.getMsgCountList(criteria) ;
}
@Data
private class MsgDeviceName {
......
package com.neotel.smfcore.core.message.util;
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.EquipmentCache;
import com.neotel.smfcore.core.equipment.service.po.Equipment;
......@@ -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.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
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 javax.annotation.PostConstruct;
import java.util.Map;
@Slf4j
@Component
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 {
}
}else if (Strings.isNullOrEmpty(reelId) && !Strings.isNullOrEmpty(partNumber)){
//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)){
pos=storagePosManager.findMpnInStorages(availableStorageIds, mpn, excludePosIds, checkoutType);
pos=storagePosManager.findMpnInStorages(availableStorageIds, mpn, excludePosIds, checkoutType,orderItem.getAppendData());
}
if (pos == null) {
// log.error("未找到可以出库的物料[" + partNumber + "]");
......
......@@ -118,6 +118,21 @@ public class DefaultOrderFileListener implements IOrderFileListener {
int numIndex = csvRead.getIndex("NUM", orderSetting.getNum());
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 newRowCount = 0;
int updateRowCount = 0;
......@@ -183,6 +198,22 @@ public class DefaultOrderFileListener implements IOrderFileListener {
item.setFeederInfo(feeder);
item.setRi(ri);
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)){
itemMap.put(so,new ArrayList<LiteOrderItem>());
}
......@@ -244,7 +275,20 @@ public class DefaultOrderFileListener implements IOrderFileListener {
int feederIndex = headerMap.getOrDefault(orderSetting.getFeeder(), -1);
int soIndex = headerMap.getOrDefault(orderSetting.getSo(), -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++) {
Map<Integer, String> lineValues = data.get(i);
String partNumber = lineValues.get(partNumberIndex);
......@@ -317,6 +361,20 @@ public class DefaultOrderFileListener implements IOrderFileListener {
if (!itemMap.containsKey(so)) {
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);
}
}
......
......@@ -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.device.enums.OP;
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.order.LiteOrderCache;
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.OrderItemDto;
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.query.OrderQueryCondition;
......@@ -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.storage.service.po.StoragePos;
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.util.TaskService;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
......@@ -115,6 +118,9 @@ public class OrderController {
TaskService taskService;
@Autowired
private DataCache dataCache;
@Autowired
SmfApi smfApi;
// @ApiOperation("导出用户数据")
......@@ -270,22 +276,48 @@ public class OrderController {
if (!ObjectUtils.isEmpty(id)) {
LiteOrder liteOrder = liteOrderManager.get(id);
if (liteOrder != null) {
OrderDto dto = orderMapper.toDto(liteOrder);
dto.setOrderItems(orderItemMapper.toDto(liteOrder.getOrderItems()));
return dto;
// OrderDto dto = orderMapper.toDto(liteOrder);
// dto.setOrderItems(orderItemMapper.toDto(liteOrder.getOrderItems()));
// return dto;
return toOrderDto(liteOrder);
}
} else if (!ObjectUtils.isEmpty(orderNo)) {
LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder != null) {
OrderDto dto = orderMapper.toDto(liteOrder);
dto.setOrderItems(orderItemMapper.toDto(liteOrder.getOrderItems()));
return dto;
// OrderDto dto = orderMapper.toDto(liteOrder);
// dto.setOrderItems(orderItemMapper.toDto(liteOrder.getOrderItems()));
// return dto;
return toOrderDto(liteOrder);
}
}
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("下载工单详情")
@RequestMapping("/detial/download")
@PreAuthorize("@el.check('workOrder:detial')")
......@@ -304,6 +336,7 @@ public class OrderController {
Locale locale = request.getLocale();
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.MPN",locale,"MPN")));
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.feederInfo",locale,"站位信息")));
......@@ -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.needNum",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<>();
for (LiteOrderItem orderItem : liteOrder.getOrderItems()) {
......@@ -320,6 +363,7 @@ public class OrderController {
List<Object> data = new ArrayList<>();
data.add(orderItem.getRi());
data.add(orderItem.getPn());
data.add(orderItem.getMpn());
data.add(orderItem.getSide());
data.add(orderItem.getTableNo());
data.add(orderItem.getFeederInfo());
......@@ -327,6 +371,15 @@ public class OrderController {
data.add(orderItem.getOutReelCount());
data.add(orderItem.getNeedNum());
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,"是"):"";
data.add(exception);
dataList.add(data);
......
......@@ -5,6 +5,9 @@ import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Transient;
import java.util.HashMap;
import java.util.Map;
@Getter
@Setter
public class OrderItemDto {
......@@ -53,4 +56,7 @@ public class OrderItemDto {
@ApiModelProperty("制造商物料编号")
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;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
@Data
@Document
public class LiteOrderItem extends BasePo implements Serializable ,Comparable<LiteOrderItem> {
......@@ -88,6 +91,12 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
*/
private String mpn = "";
/**
* 自定义的附加字段,key=字段名,value=值
*/
public Map<String,String> appendData = new HashMap<>();
/**
* 出库是否满足要求,已出库数量大于需求数量
*/
......
......@@ -416,7 +416,7 @@ public class StoragePosController {
});
}
@ApiOperation("出库操作")
@ApiOperation("出库操作,不能空出")
@PutMapping("/checkout")
public ResultBean checkout(@Validated @RequestBody CheckOutDto checkOutDto) {
......@@ -448,7 +448,7 @@ public class StoragePosController {
// 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());
if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult);
......@@ -457,6 +457,46 @@ public class StoragePosController {
return ResultBean.newOkResult("");
}
@ApiOperation("库位管理页面出库,可以空出")
@PutMapping("/posCheckout")
public ResultBean posCheckout(@Validated @RequestBody CheckOutDto checkOutDto) {
if (checkOutDto.getPids() == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"ID"});
}
if (checkOutDto.getSingleOut() == null) {
checkOutDto.setSingleOut(true + "");
}
String isSingleOutStr = checkOutDto.getSingleOut();
boolean isSingleOut = Boolean.valueOf(isSingleOutStr);
for (String pid : checkOutDto.getPids()) {
StoragePos pos = storagePosManager.get(pid);
if (pos == null) {
//throw new ValidateException("smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"pid", pid});
// throw new ValidateException("位置[" + pid + "]不存在");
continue;
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
if (storage == null) {
throw new ValidateException("smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"storageId", pos.getStorageId()});
// throw new ValidateException("料仓[" + pos.getStorageId() + "]不存在");
}
// //西门子接口验证
// boolean result=SiemensApi.getMaterialLot(2, storage.getId(),storage.getName(),pos.getBarcode().getBarcode());
// if(!result) {
// throw new ValidateException("smfcore.error.getMaterialLot.out", "条码[{0}]验证失败,无法出库", new String[]{pos.getBarcode().getBarcode()});
// }
log.info("库位管理手动出库:出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkoutTest(storage, pos, isSingleOut,SecurityUtils.getCurrentUsername());
if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult);
}
}
return ResultBean.newOkResult("");
}
@ApiOperation("解析出库条码")
@PutMapping("/resolveCode/{blurry}")
......
......@@ -14,7 +14,7 @@ import java.util.List;
@Data
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;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "barcode.putInDate")
......
......@@ -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 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);
......@@ -81,7 +82,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
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);
}
......@@ -6,6 +6,7 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.bean.PageData;
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.core.barcode.bean.PlateSizeBean;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
......@@ -28,6 +29,7 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
......@@ -260,7 +262,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return findPartNumberInStorages(storageIdList,"",pn,excludePosIds,checkOutType);
}
@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)
.and("id").nin(excludePosIds)
.and("enabled").is(true)//可用
......@@ -271,6 +273,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
if (ObjectUtil.isNotEmpty(labelId)) {
c.and("labelId").is(labelId);
}
c=addAppendData(c,appendDate);
Query q = new Query(c);
Sort sort = getSortByCheckOutType(checkOutType);
q.with(sort);
......@@ -283,6 +286,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
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
*/
......@@ -677,7 +685,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@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)
.and("id").nin(excludePosIds)
.and("enabled").is(true)//可用
......@@ -685,6 +693,8 @@ public class StoragePosManagerImpl implements IStoragePosManager {
if (storageIdList != null) {
c = c.and("storageId").in(storageIdList);
}
c = addAppendData(c, appendData);
Query q = new Query(c);
Sort sort = getSortByCheckOutType(checkOutType);
q.with(sort);
......@@ -697,6 +707,44 @@ public class StoragePosManagerImpl implements IStoragePosManager {
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
public List<StoragePos> findExpiredOrSluggishBarcode(Date date, int type) {
Query q = new Query();
......
......@@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
@Data
public class OrderSetting implements Serializable {
......@@ -28,6 +30,11 @@ public class OrderSetting implements Serializable {
public String mpn="MPN";
/**
* 自定义的附加字段,key=字段名,value=表头名称
*/
public Map<String,String> appendData = new HashMap<>();
/**
* 是否显示料架亮灯方式
*/
@ApiModelProperty("是否显示料架亮灯方式 ture=显示")
......
......@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.system.rest;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean;
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.utils.Constants;
import com.neotel.smfcore.common.utils.DateUtil;
......@@ -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);
log.info("更改工单设置:"+Constants.CACHE_OrderSetting+"=" + orderSetting.toString());
return ResultBean.newOkResult("保存成功");
......@@ -247,22 +261,32 @@ public class SettingsController {
@AnonymousAccess
public ResultBean uploadOrderModel(@RequestParam MultipartFile orderFile) {
String image = "csv";
String csv = "csv";
String excel = "xlsx";
String fileType = FileUtil.getExtensionName(orderFile.getOriginalFilename());
String fileName = FileUtil.getFileNameNoEx(orderFile.getOriginalFilename());
if (fileType != null && !image.contains(fileType)) {
throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{image});
if (fileType != null && (!csv.contains(fileType)) && (!excel.contains(fileType))) {
throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{csv + "," + excel});
}
File folder = new File(properties.getPath(), "pos");
File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
try {
CsvReader csvRead = CsvReader.newReader(localFile.getAbsolutePath(),"","" );
String[] headers=csvRead.getHeaders();
if (fileType.equals(csv)) {
CsvReader csvRead = CsvReader.newReader(localFile.getAbsolutePath(), "", "");
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) {
e.printStackTrace();
return ResultBean.newOkResult("");
}
return ResultBean.newOkResult("");
}
@ApiOperation("获取版本号")
@GetMapping("/version")
......
......@@ -40,6 +40,13 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
msdAppendInfo.setMsl(barcode.getMsl());
msdAppendInfo.setOpenTime(barcode.getOpenTime());
msdAppendInfo.setThickness(barcode.getThickness());
}else{
setBarcode("");
setProviderNumber("");
setPartNumber("");
setNum(0);
setMemo("");
setBatchInfo("");
}
setCid(storage.getCid());
setStorageId(storage.getId());
......@@ -109,6 +116,10 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
* 缺料补发(使用料串)
*/
private boolean lessSendReel = false;
/**
* NG物料:入料时条码重启获取库位号会NG
*/
private boolean ngReel = false;
/**
* 是否是包装料卷
......
......@@ -77,20 +77,43 @@ public class DevicesStatusUtil {
//和上个消息是否一样
StatusBean msgBean=clientMsgs.get(cid);
if(msgBean!=null) {
if (msgBean.msgTimeOut()) {
newMsg = true;
} else if (msgBean.getMsgCode().equals(msgCode) && msgBean.getMsg().equals(clientMsg)) {
// if (msgBean.msgTimeOut()) {
// newMsg = true;
// } else
if (msgBean.getMsgCode().equals(msgCode) && msgBean.getMsg().equals(clientMsg)) {
newMsg = false;
}
}
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.setCid(cid);
statusBean.setLastSaveTime(System.currentTimeMillis());
statusBean.setTime(System.currentTimeMillis());
statusBean.setMsg(clientMsg);
statusBean.setMsgEn(clientMsgEn);
statusBean.setMsgCode(msgCode);
......
......@@ -104,7 +104,7 @@ public class TaskService {
* @return
* @throws ValidateException
*/
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName,String outType) throws ValidateException {
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut,boolean ngReel, String opUserName,String outType) throws ValidateException {
if (pos.getBarcode() == null) {
String msg = "库位[" + pos.getPosName() + "]中已无物料,忽略";
log.info(msg);
......@@ -117,12 +117,32 @@ public class TaskService {
task.setPutInDate(pos.getBarcode().getPutInDate());
task.setStatus(OP_STATUS.WAIT.name());
task.setSingleOut(isSingleOut);
task.setNgReel(ngReel);
task.setOperator(opUserName);
addTaskToExecute(task);
return "";
}
/**
* 库位出库 测试,空库位也可以出库
*/
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);
addTaskToExecute(task);
return "";
}
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName) throws ValidateException {
return checkout(storage,pos,isSingleOut,opUserName,"");
return checkout(storage,pos,isSingleOut,false,opUserName,"");
}
/**
* 触发任务状态改变事件
......@@ -479,6 +499,9 @@ public class TaskService {
}
} else {
log.warn("出库无料仓位" + storage.getName() + "[" + posName + "]");
StoragePos pos=storagePosManager.getByPosName(posName);
plateW = pos.getW();
plateH = pos.getH();
}
statusBean.addData("hSerial",task.getSourceName());
statusBean.addPosInfo(task.getBarcode(), posName, plateW, plateH, isSingleOut);
......
......@@ -65,6 +65,13 @@ public class Micron1053Menu {
MenuInit.addMenu(menuLabel,null,166, "Diagnosis","diagnosis", "system/diagnosis/index","diagnosis");
//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();
if(Strings.isNotBlank(apiName) && apiName.equals(menuLabel)){
......
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.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
import java.util.Locale;
@Data
@AllArgsConstructor
......@@ -15,4 +18,60 @@ public class EquipMsg implements Serializable {
private int status;
private String msg;
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;
public class ML5NgReelInfo implements Serializable {
@ApiModelProperty("NG口位置,1=左侧,2=右侧")
private int NgPos=0;
private int ngPos=0;
@ApiModelProperty("物料类型:pizzaBox,pcb,tray,reel")
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 {
private int ng2Count=0;
@ApiModelProperty("消息列表")
private List<EquipMsg> msgList=null;
private List<EquipMsgDto> msgList=null;
@ApiModelProperty("需要的料架列表")
......
......@@ -21,5 +21,5 @@ public class MicronEquipStatusDto implements Serializable {
private Map<String,Integer> statusMap=new HashMap<>();
@ApiModelProperty("消息列表")
private List<EquipMsg> msgList=new ArrayList<>();
private List<EquipMsgDto> msgList=new ArrayList<>();
}
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.util.TaskService;
import com.neotel.smfcore.custom.micron1053.bean.EquipMsg;
import com.neotel.smfcore.custom.micron1053.bean.ML5NgReelInfo;
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.ML5StatusDto;
import com.neotel.smfcore.custom.micron1053.util.MicronDataCache;
......@@ -31,7 +34,7 @@ public class MicronML5Controller {
@ApiOperation("ML5页面数据获取")
@GetMapping("/status")
@AnonymousAccess
public ML5StatusDto ml5Status( ) {
public ML5StatusDto ml5Status(HttpServletRequest servletRequest ) {
ML5StatusDto resultDto = new ML5StatusDto();
MicronEquipStatus mlL = MicronDataCache.getStatus("ML5-L");
MicronEquipStatus mlR = MicronDataCache.getStatus("ML5-R");
......@@ -51,7 +54,17 @@ public class MicronML5Controller {
msgs.addAll(mlR.getMsgList());
}
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<>();
......
......@@ -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.enums.OP_STATUS;
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.storage.bean.UsageItem;
import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
......@@ -54,18 +55,35 @@ public class MicronStatusController {
@GetMapping("/equipView")
@AnonymousAccess
public MicronEquipStatusDto view(HttpServletRequest servletRequest) {
MicronEquipStatusDto dto=new MicronEquipStatusDto();
MicronEquipStatusDto dto = new MicronEquipStatusDto();
dto.setMsgList(new ArrayList<>());
dto.setStatusMap(new HashMap<>());
// ML5,CI,R1,R2,R3
String[] names=new String[]{"ML5-L","ML5-R","CI","R1","R2","R3"};
for (String name :names
List<EquipMsg> allMsgList = new ArrayList<>();
// 设备组
// LS1
// LS2
// LS3
// LS4
//
// 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() );
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) {
// dto.getMsgList().addAll(s.getMsgList());
// }
......@@ -73,28 +91,35 @@ public class MicronStatusController {
}
//所有设备的报警都加上
List<MicronEquipStatus> statuses = new ArrayList<>();
if (MicronDataCache.equipStatusMap != null && MicronDataCache.equipStatusMap.size() > 0) {
statuses.addAll(MicronDataCache.equipStatusMap.values());
for (MicronEquipStatus s :
statuses) {
if (!s.timeOut()) {
if(!dto.getStatusMap().containsKey(s.getEquipName())){
dto.getStatusMap().put(s.getEquipName(),s.getStatus());
if (!dto.getStatusMap().containsKey(s.getEquipName())) {
if(s.getStatus()>0) {
dto.getStatusMap().put(s.getEquipName(), s.getStatus());
}
}
if (s.getMsgList() != null && s.getMsgList().size() > 0) {
dto.getMsgList().addAll(s.getMsgList());
allMsgList.addAll(s.getMsgList());
}
}
}
}
//料仓状态
List<String> boxList=new ArrayList<>();
for (int i=1;i<=8;i++
List<String> boxList = new ArrayList<>();
for (int i = 1; i <= 8; i++
) {
boxList.add("M"+i);
boxList.add("M" + i);
}
// SBDH1, SBDH2, SBDH3, SBSH1, SBSH2
boxList.add("SBDH1");
boxList.add("SBDH2");
boxList.add("SBDH3");
boxList.add("SBDH1-1");
boxList.add("SBDH1-2");
boxList.add("SBDH2-1");
boxList.add("SBDH2-2");
boxList.add("SBDH3-1");
boxList.add("SBDH3-2");
boxList.add("SBSH1");
boxList.add("SBSH2");
// for (MicronEquipName name : MicronEquipName.sbBoxList()){
......@@ -104,11 +129,32 @@ public class MicronStatusController {
for (String boxName :
boxList) {
//查找料仓
MicronEquipStatus s=getBoxEquip(boxName,servletRequest.getLocale());
dto.getStatusMap().put(s.getEquipName(),s.getStatus() );
if(s.getMsgList()!=null&&s.getMsgList().size()>0) {
dto.getMsgList().addAll(s.getMsgList());
MicronEquipStatus s = getBoxEquip(boxName, servletRequest.getLocale());
if (s.getStatus() > 0) {
dto.getStatusMap().put(s.getEquipName().replace("-", ""), s.getStatus());
}
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) {
}
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;
......@@ -146,17 +192,26 @@ public class MicronStatusController {
if (s.timeOut()) {
} else {
if (s.getStatus() == 1) {
dto.setStatus(s.getStatus());
} else if (s.getStatus() == 2||s.getStatus()==3) {
if (s.getStatus() == 2||s.getStatus()==3) {
dto.setStatus(2);
}
String msg=s.getShowMsg(locale);
if (ObjectUtil.isNotEmpty(msg)) {
dto.getMsgList().add(new EquipMsg(s.getCid(), s.getStatus(), msg, new Date(s.getTime())));
//如果状态还是0,需要改为1
else if(dto.getStatus()==0){
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;
}
......@@ -191,7 +246,7 @@ public class MicronStatusController {
dto.setTemperature(temperature);
}
dto.getStatuMap().put(cid, boxStatus.getStatus());
dto.getMsgMap().put(cid, statusBean.getShowMsg(servletRequest.getLocale()));
dto.getMsgMap().put(cid, statusBean.getErrorMsg(servletRequest.getLocale()));
}
}else{
......@@ -281,11 +336,10 @@ public class MicronStatusController {
StatusBean statusBean = DevicesStatusUtil.getStatusBean(cid);
if (statusBean != null && (!statusBean.timeOut())) {
if (statusBean.getStatus() == 1) {
boxDto.setStatus(statusBean.getStatus());
} else if (statusBean.getStatus() == 2 || statusBean.getStatus() == 3) {
if (statusBean.getStatus() == 2 || statusBean.getStatus() == 3) {
boxDto.setStatus(2);
} else {
boxDto.setStatus(1);
}
}
boxDtos.add(boxDto);
......@@ -329,34 +383,45 @@ public class MicronStatusController {
@GetMapping("/alarmMsgCount")
@AnonymousAccess
public ResultBean alarmMsgCount(HttpServletRequest servletRequest) {
int count=0;
int count = 0;
try {
//先添加设备的
List<MicronEquipStatus> statuses = new ArrayList<>();
if (MicronDataCache.equipStatusMap != null && MicronDataCache.equipStatusMap.size() > 0) {
statuses.addAll(MicronDataCache.equipStatusMap.values());
for (MicronEquipStatus s :
statuses) {
if (!s.timeOut()) {
if (s.getMsgList() != null && s.getMsgList().size() > 0) {
count+=s.getMsgList().size();
for (EquipMsg msg : s.getMsgList()){
//只累计报警消息
if(ObjectUtil.isEmpty(msg.getType())|| msg.IsErrorMsg()) {
count += s.getMsgList().size();
}
}
}
}
}
}
//添加料仓的
List<Storage> storages = new ArrayList<>();
storages.addAll(dataCache.getAllStorage().values());
Map<String, Storage> allStorages = dataCache.getAllStorage();
if (allStorages != null && allStorages.size() > 0) {
for (Storage storage :
storages) {
allStorages.values()) {
StatusBean statusBean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (statusBean != null && (!statusBean.timeOut())) {
String msg = statusBean.getShowMsg(servletRequest.getLocale());
String msg = statusBean.getErrorMsg(servletRequest.getLocale());
if (ObjectUtil.isNotEmpty(msg)) {
count+=1;
count += 1;
}
}
}
}
} catch (Exception ex) {
log.error("alarmMsgCount 出错:" + ex.toString());
}
return ResultBean.newOkResult(count);
}
......
package com.neotel.smfcore.custom.micron1053.util;
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.custom.micron1053.bean.EquipMsg;
import com.neotel.smfcore.custom.micron1053.bean.ML5NgReelInfo;
......@@ -23,16 +24,36 @@ public class MicronDataCache {
if (bean == null) {
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<>();
if(bean.getMsgList()!=null&&bean.getMsgList().size()>0){
for (EquipMsg msg :
bean.getMsgList()) {
if(ObjectUtil.isEmpty(msg.getMsg())){
continue;
}
if(ObjectUtil.isEmpty(msg.getName())){
msg.setName(bean.getEquipName());
}
if(msg.getTime()==null){
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);
}
bean.setMsgList(msgs);
......
......@@ -36,7 +36,7 @@ import java.util.*;
@RestController
@RequestMapping("/rest/micron/sp")
@RequiredArgsConstructor
public class MicronReportController {
public class MicronSpReportController {
@Autowired
private TaskService taskService;
......
......@@ -140,7 +140,7 @@ public class MicronSpUnloadController {
throw new ValidateException("smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"storageId", pos.getStorageId()});
}
log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkout(storage, pos, true, SecurityUtils.getCurrentUsername(), MInOutType.WITHDRAWN);
String outResult = taskService.checkout(storage, pos, true,false, SecurityUtils.getCurrentUsername(), MInOutType.WITHDRAWN);
if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult);
}
......@@ -180,7 +180,7 @@ public class MicronSpUnloadController {
if (barcode != null) {
log.info("removal 料仓【" + storage.getName() + "_" + storage.getCid() + "】仓位【" + pos.getPosName() + "】 returnMaterial 成功,开始出库");
try {
String outResult = taskService.checkout(storage, pos, isSingleOut, SecurityUtils.getCurrentUsername(),MInOutType.REMOVED);
String outResult = taskService.checkout(storage, pos, isSingleOut,false, SecurityUtils.getCurrentUsername(),MInOutType.REMOVED);
if (!Strings.isNullOrEmpty(outResult)) {
// throw new ValidateException("smfcore.error", outResult);
log.error("removal 料仓【" + storage.getName() + "_" + storage.getCid() + "】仓位【" + pos.getPosName() + "】 returnMaterial 成功,出库失败: "+outResult);
......
......@@ -310,6 +310,25 @@ smfcore.humiture.temperature=\u6E29\u5EA6
smfcore.humiture.humiture=\u6E7F\u5EA6
smfcore.humiture.createDate=\u521B\u5EFA\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.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1}
#smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F
......
......@@ -309,3 +309,22 @@ smfcore.humiture.temperature=Temperature
smfcore.humiture.humiture=Humidity
smfcore.humiture.createDate=Create Time
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
......@@ -306,3 +306,22 @@ smfcore.humiture.temperature=\u6E29\u5EA6
smfcore.humiture.humiture=\u6E7F\u5EA6
smfcore.humiture.createDate=\u521B\u5EFA\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
......@@ -306,3 +306,22 @@ smfcore.humiture.temperature=\u6E29\u5EA6
smfcore.humiture.humiture=\u6E7F\u5EA6
smfcore.humiture.createDate=\u521B\u5EFA\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
\ No newline at end of file
......@@ -307,3 +307,22 @@ smfcore.humiture.temperature=\u6E29\u5EA6
smfcore.humiture.humiture=\u6E7F\u5EA6
smfcore.humiture.createDate=\u521B\u5EFA\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\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
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!