Commit dfab2370 LN

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

3.过期物料不能入库。4.物料日志导出英文修改。5.库位管理页面出库使用新接口。
1 个父辈 c169f7fb
......@@ -31,6 +31,8 @@ import java.util.*;
@Component
public class DataInitManager {
public static Date startRunTime=new Date();
public static Set<String> allPermissionSet;
@Value("${menu.show}")
......@@ -72,6 +74,7 @@ public class DataInitManager {
public void DataInit() {
try {
log.info("smfcore Version:["+version+"], 初始化环境...");
startRunTime=new Date();
//查询admin的用户是否存在
String userName = Constants.SUPER_USERNAME;
User admin = userManager.findByUserName(userName);
......
......@@ -174,7 +174,7 @@ public class StatusBean {
* 提示信息是否超时(10秒)提示信息默认十分钟后不再显示
* @return
*/
public boolean msgTimeOut(){return (System.currentTimeMillis()-lastSaveTime)>(10*1000);}
public boolean msgTimeOut(){return (System.currentTimeMillis()-time)>(10*1000);}
/**
* 获取客户端发送上来的二维码
......@@ -272,7 +272,7 @@ public class StatusBean {
data.put(key, valueStr);
}
public void addPosInfo(String barcode, String posId, int plateW, int plateH, boolean isSingleOut ){
addPosInfo(barcode,posId,plateW,plateH,isSingleOut,0);
addPosInfo(barcode,posId,plateW,plateH,isSingleOut,false,0);
}
/**
* 获取客户端发送上来的条码信息
......@@ -283,7 +283,7 @@ public class StatusBean {
/**
* 入库时添加仓位及料盘大小信息(posId库位编号,plateW:料盘宽度,plateH:料盘高度,singleOut:是否出库到料仓门口)
*/
public void addPosInfo(String barcode, String posId, int plateW, int plateH, boolean isSingleOut,int usedCount){
public void addPosInfo(String barcode, String posId, int plateW, int plateH, boolean isSingleOut,boolean isNgReel,int usedCount){
String originalPosId = data.get("posId");
String originalPlateW = data.get("plateW");
String originalPlateH = data.get("plateH");
......@@ -313,6 +313,10 @@ public class StatusBean {
data.put("plateH",plateHStr);
data.put("barcode",barcodeStr);
data.put("singleOut", isSingleOut+"");
data.put("ngReel",isNgReel+"");
if(isNgReel){
data.put("ngMsg","Repeat Inbound");
}
data.put("usedCount",usedCount+"" );
}
......
......@@ -279,7 +279,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
String posId = putInTask.getPosName();
int plateW = barcodeSave.getPlateSize();
int plateH = barcodeSave.getHeight();
statusBean.addPosInfo(barcodeSave.getBarcode(), posId, plateW, plateH, false,barcodeSave.getUsedCount());
statusBean.addPosInfo(barcodeSave.getBarcode(), posId, plateW, plateH, false,false,barcodeSave.getUsedCount());
log.info(barcodeSave.getBarcode() + "[" + plateW + "x" + plateH + "]开始入库到" + storage.getCid() + "[" + posId + "]");
//清空展示的消息
......@@ -699,6 +699,13 @@ public class BaseDeviceHandler implements IDeviceHandler {
task.setStatus(OP_STATUS.FINISHED.name());
taskService.updateFinishedTask(task);
//如果入库任务标记为NG,自动生成出库任务
if(task.isNgReel()){
Storage storage=dataCache.getStorageById(storagePos.getStorageId());
taskService.checkout(storage,storagePos,false,true,"","");
log.error("updatePutInData 入库任务["+storagePos.getBarcode()+"]["+storagePos.getPosName()+"]标记为NG,自动生成NG出库任务 " );
}
// //调用西门子接口
// SiemensApi.lotInOut(barcode.getBarcode(),1);
......@@ -926,7 +933,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
} else {
log.warn("出库无料仓位" + storage.getName() + "[" + posName + "]");
}
statusBean.addPosInfo(outTask.getBarcode(), posName, plateW, plateH, false);
statusBean.addPosInfo(outTask.getBarcode(), posName, plateW, plateH, false,outTask.isNgReel(),0);
log.info("出库" + storage.getName() + "[" + posName + "]物料[" + outTask.getBarcode() + "] 发送到客户端" + storage.getCid());
}
return statusBean;
......
......@@ -179,6 +179,11 @@ public class MessageUtils {
public static String getSmfClientMsg(String code, Locale locale, String defaultMsg){
LanguageMsg languageMsg = getMsg("smfclient",code);
if(languageMsg==null){
//重新取一次
String nCode=code.replace("smfclient.","");
languageMsg = getMsg("smfclient",nCode);
}
if(languageMsg != null){
String msg = languageMsg.getContent(locale.toLanguageTag());
if(!msg.isEmpty()){
......
package com.neotel.smfcore.core.materialLog.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
public interface IMaterialLogDao extends IBaseDao {
}
package com.neotel.smfcore.core.materialLog.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.core.materialLog.service.dao.IMaterialLogDao;
import com.neotel.smfcore.core.materialLog.service.po.MaterialLog;
import org.springframework.stereotype.Service;
@Service
public class MaterialLogDao extends AbstractBaseDao implements IMaterialLogDao {
@Override
public Class getEntityClass() {
return MaterialLog.class;
}
}
package com.neotel.smfcore.core.materialLog.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.materialLog.service.po.MaterialLog;
public interface IMaterialLogManager extends IBaseManager<MaterialLog> {
}
package com.neotel.smfcore.core.materialLog.service.manager.impl;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.materialLog.service.dao.IMaterialLogDao;
import com.neotel.smfcore.core.materialLog.service.manager.IMaterialLogManager;
import com.neotel.smfcore.core.materialLog.service.po.MaterialLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class MaterialLogManager implements IMaterialLogManager {
@Autowired
private IMaterialLogDao materialLogDao;
@Override
public MaterialLog get(String id) {
return materialLogDao.findOneById(id);
}
@Override
public MaterialLog save(MaterialLog object) throws ValidateException {
return materialLogDao.save(object);
}
@Override
public void delete(MaterialLog object) throws ValidateException {
materialLogDao.removeOneById(object.getId());
}
@Override
public PageData<MaterialLog> findByPage(Query query, Pageable pageable) {
int totalCount = materialLogDao.countByQuery(query);
List<MaterialLog> barcodes = materialLogDao.findByQuery(query, pageable);
return new PageData(barcodes, totalCount);
}
@Override
public List<MaterialLog> findByQuery(Query query) {
return materialLogDao.findByQuery(query);
}
}
package com.neotel.smfcore.core.materialLog.service.po;
import com.neotel.smfcore.common.base.BasePo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
@Data
@Document
@AllArgsConstructor
@NoArgsConstructor
public class MaterialLog extends BasePo implements Serializable {
private String barcode;
private String posName;
/**
* 类型:入库OP.PUT_IN,出库OP.CHECKOUT
*/
private int type;
/**
* 状态:OP_STATUS
*/
private String status;
/**
* 位置信息,如料架编号,托盘编号,移栽编号,皮带线编号,机器人编号等
*/
private String locInfo = "";
}
......@@ -416,7 +416,7 @@ public class StoragePosController {
});
}
@ApiOperation("出库操作")
@ApiOperation("出库操作,不能空出")
@PutMapping("/checkout")
public ResultBean checkout(@Validated @RequestBody CheckOutDto checkOutDto) {
......@@ -449,7 +449,7 @@ public class StoragePosController {
// }
log.info("手动出库:出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkoutTest(storage, pos, isSingleOut,SecurityUtils.getCurrentUsername());
String outResult = taskService.checkout(storage, pos, isSingleOut,SecurityUtils.getCurrentUsername());
if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult);
}
......@@ -457,6 +457,46 @@ public class StoragePosController {
return ResultBean.newOkResult("");
}
@ApiOperation("库位管理页面出库,可以空出")
@PutMapping("/posCheckout")
public ResultBean posCheckout(@Validated @RequestBody CheckOutDto checkOutDto) {
if (checkOutDto.getPids() == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"ID"});
}
if (checkOutDto.getSingleOut() == null) {
checkOutDto.setSingleOut(true + "");
}
String isSingleOutStr = checkOutDto.getSingleOut();
boolean isSingleOut = Boolean.valueOf(isSingleOutStr);
for (String pid : checkOutDto.getPids()) {
StoragePos pos = storagePosManager.get(pid);
if (pos == null) {
//throw new ValidateException("smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"pid", pid});
// throw new ValidateException("位置[" + pid + "]不存在");
continue;
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
if (storage == null) {
throw new ValidateException("smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"storageId", pos.getStorageId()});
// throw new ValidateException("料仓[" + pos.getStorageId() + "]不存在");
}
// //西门子接口验证
// boolean result=SiemensApi.getMaterialLot(2, storage.getId(),storage.getName(),pos.getBarcode().getBarcode());
// if(!result) {
// throw new ValidateException("smfcore.error.getMaterialLot.out", "条码[{0}]验证失败,无法出库", new String[]{pos.getBarcode().getBarcode()});
// }
log.info("库位管理手动出库:出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkoutTest(storage, pos, isSingleOut,SecurityUtils.getCurrentUsername());
if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult);
}
}
return ResultBean.newOkResult("");
}
@ApiOperation("解析出库条码")
@PutMapping("/resolveCode/{blurry}")
......
......@@ -116,6 +116,10 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
* 缺料补发(使用料串)
*/
private boolean lessSendReel = false;
/**
* NG物料:入料时条码重启获取库位号会NG
*/
private boolean ngReel = false;
/**
* 是否是包装料卷
......
......@@ -77,11 +77,12 @@ public class DevicesStatusUtil {
//和上个消息是否一样
StatusBean msgBean=clientMsgs.get(cid);
if(msgBean!=null) {
if (msgBean.msgTimeOut()) {
newMsg = true;
} else if (msgBean.getMsgCode().equals(msgCode) && msgBean.getMsg().equals(clientMsg)) {
newMsg = false;
}
// if (msgBean.msgTimeOut()) {
// newMsg = true;
// } else
if (msgBean.getMsgCode().equals(msgCode) && msgBean.getMsg().equals(clientMsg)) {
newMsg = false;
}
}
if(newMsg){
......@@ -112,7 +113,7 @@ public class DevicesStatusUtil {
StatusBean statusBean = new StatusBean();
statusBean.setCid(cid);
statusBean.setLastSaveTime(System.currentTimeMillis());
statusBean.setTime(System.currentTimeMillis());
statusBean.setMsg(clientMsg);
statusBean.setMsgEn(clientMsgEn);
statusBean.setMsgCode(msgCode);
......
......@@ -104,7 +104,7 @@ public class TaskService {
* @return
* @throws ValidateException
*/
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName,String outType) throws ValidateException {
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut,boolean ngReel, String opUserName,String outType) throws ValidateException {
if (pos.getBarcode() == null) {
String msg = "库位[" + pos.getPosName() + "]中已无物料,忽略";
log.info(msg);
......@@ -117,6 +117,7 @@ public class TaskService {
task.setPutInDate(pos.getBarcode().getPutInDate());
task.setStatus(OP_STATUS.WAIT.name());
task.setSingleOut(isSingleOut);
task.setNgReel(ngReel);
task.setOperator(opUserName);
addTaskToExecute(task);
return "";
......@@ -141,7 +142,7 @@ public class TaskService {
return "";
}
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName) throws ValidateException {
return checkout(storage,pos,isSingleOut,opUserName,"");
return checkout(storage,pos,isSingleOut,false,opUserName,"");
}
/**
* 触发任务状态改变事件
......
......@@ -2,7 +2,9 @@ package com.neotel.smfcore.custom.micron1053.controller;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.init.DataInitManager;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.message.rest.bean.dto.MessageDto;
......@@ -11,6 +13,7 @@ import com.neotel.smfcore.core.message.rest.bean.query.MessageCriteria;
import com.neotel.smfcore.core.message.service.manager.IMessageManager;
import com.neotel.smfcore.core.message.service.po.Message;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.custom.micron1053.bean.dto.DeviceUtilizationDto;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
......@@ -64,6 +67,17 @@ public class MicronReportController {
Message message = messageManager.findOne(query);
if (message != null) {
if (message.getMsgCode().equals("smfcore.messages.online")) {
//其实早已经离线
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null) {
//从软件启动开始离线
String msg = MessageUtils.getText("smfcore.messages.offline", servletRequest.getLocale(), "设备离线");
DeviceUtilizationDto dto = new DeviceUtilizationDto(message.getDeviceName(), msg, DataInitManager.startRunTime);
dtos.add(dto);
continue;
}
}
DeviceUtilizationDto dto = new DeviceUtilizationDto(message.getDeviceName(), message.getShowMsg(servletRequest.getLocale()), message.getUpdateDate());
dtos.add(dto);
}
......@@ -74,6 +88,7 @@ public class MicronReportController {
@ApiOperation("ErrorLog:错误数据列表")
@GetMapping("/errorLog")
@AnonymousAccess
public PageData<MessageDto> errorLog(MessageCriteria criteria, Pageable pageable, HttpServletRequest request){
criteria.setType("error");
......
......@@ -140,7 +140,7 @@ public class MicronSpUnloadController {
throw new ValidateException("smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"storageId", pos.getStorageId()});
}
log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkout(storage, pos, true, SecurityUtils.getCurrentUsername(), MInOutType.WITHDRAWN);
String outResult = taskService.checkout(storage, pos, true,false, SecurityUtils.getCurrentUsername(), MInOutType.WITHDRAWN);
if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult);
}
......@@ -180,7 +180,7 @@ public class MicronSpUnloadController {
if (barcode != null) {
log.info("removal 料仓【" + storage.getName() + "_" + storage.getCid() + "】仓位【" + pos.getPosName() + "】 returnMaterial 成功,开始出库");
try {
String outResult = taskService.checkout(storage, pos, isSingleOut, SecurityUtils.getCurrentUsername(),MInOutType.REMOVED);
String outResult = taskService.checkout(storage, pos, isSingleOut,false, SecurityUtils.getCurrentUsername(),MInOutType.REMOVED);
if (!Strings.isNullOrEmpty(outResult)) {
// throw new ValidateException("smfcore.error", outResult);
log.error("removal 料仓【" + storage.getName() + "_" + storage.getCid() + "】仓位【" + pos.getPosName() + "】 returnMaterial 成功,出库失败: "+outResult);
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!