Commit d1c67edd LN

增加设备通信接口:cidIsExists和uploadStoragePos

1 个父辈 76e4e688
package com.neotel.smfcore.core.device.bean;
import lombok.Data;
import java.io.Serializable;
@Data
public class PosInfo implements Serializable {
/**
* 库位号
*/
private String pos;
/**
* 优先级
*/
private Integer pri;
/**
* 高度
*/
private Integer h;
/**
* 宽度
*/
private Integer w;
}
......@@ -102,6 +102,8 @@ public class StatusBean {
*/
private long offlineTime=-1;
private List<PosInfo> posList=null;
/**
* 获取已经结束(缓存中存在,但新的报警列表不存在)的报警列表,同时将新的报警加入到缓存中
*/
......@@ -289,77 +291,6 @@ public class StatusBean {
return System.currentTimeMillis() - lastSaveTime >= 5 * 60 * 1000;
}
// public long getLastSaveTime() {
// return lastSaveTime;
// }
//
// public void setLastSaveTime(long lastSaveTime) {
// this.lastSaveTime = lastSaveTime;
// }
//
// public long getTime() {
// return time;
// }
//
// public void setTime(long time) {
// this.time = time;
// }
//
// public String getCid() {
// return cid;
// }
//
// public void setCid(String cid) {
// this.cid = cid;
// }
//
// public int getSeq() {
// return seq;
// }
//
// public void setSeq(int seq) {
// this.seq = seq;
// }
//
// public int getOp() {
// return op;
// }
//
// public void setOp(int op) {
// this.op = op;
// }
//
// public Map<String, String> getData() {
// return data;
// }
//
// public void setData(Map<String, String> data) {
// this.data = data;
// }
//
// public int getStatus() {
// return status;
// }
//
// public void setStatus(int status) {
// this.status = status;
// }
//
// public String getMsg() {
// return msg;
// }
//
// public void setMsg(String msg) {
// this.msg = msg;
// }
//
// public String getClientIp() {
// return clientIp;
// }
//
// public void setClientIp(String clientIp) {
// this.clientIp = clientIp;
// }
// public void setShowMsg(Locale local){
// String lang = local.getLanguage();
......@@ -374,13 +305,6 @@ public class StatusBean {
// this.msg = showMsg;
// }
//
// public Map<String, BoxStatusBean> getBoxStatus() {
// return boxStatus;
// }
//
// public void setBoxStatus(Map<String, BoxStatusBean> boxStatus) {
// this.boxStatus = boxStatus;
// }
public boolean isAvailable(){
if(!timeOut()){
......@@ -466,21 +390,7 @@ public class StatusBean {
// }
// }
// public String getMsgEn() {
// return msgEn;
// }
//
// public void setMsgEn(String msgEn) {
// this.msgEn = msgEn;
// }
//
// public Map<String, String> getMsgData() {
// return msgData;
// }
//
// public void setMsgData(Map<String, String> msgData) {
// this.msgData = msgData;
// }
public String getDoorReelSingnal() {
String doorReelSignal = getFromData("doorReelSignal");
......
......@@ -10,8 +10,11 @@ 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.ReelLockPosUtil;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.bean.PosInfo;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
......@@ -42,7 +45,7 @@ import java.util.*;
public class DeviceController {
@Autowired
private DataCache dataCahche;
private DataCache dataCache;
@Autowired
private TaskService taskService;
......@@ -56,6 +59,9 @@ public class DeviceController {
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private IBarcodeManager barcodeManager;
private Map<String, IDeviceHandler> handlerMap = new HashMap<>();
public DeviceController(List<IDeviceHandler> deviceHandlerList) {
......@@ -72,9 +78,15 @@ public class DeviceController {
public StatusBean communication(@RequestBody final StatusBean statusBean, HttpServletRequest request) {
try {
String cid = statusBean.getCid();
Storage storage = dataCahche.getStorage(cid);
Storage storage = dataCache.getStorage(cid);
if (storage == null) {
log.error("料仓cid: [" + cid + "]不存在");
log.error("料仓cid: [" + cid + "]不存在,默认自动创建料仓");
// //自动创建料仓
// storage = dataCahche.AutoCreateStorage(cid);
// if (storage == null) {
// return null;
// }
return null;
}
synchronized (storage) {
......@@ -98,6 +110,7 @@ public class DeviceController {
* 流水线提示消息
*/
private static String lineMsg = "";
/**
* 流水线入库查找空的料格
*/
......@@ -116,9 +129,9 @@ public class DeviceController {
log.info("流水线[" + cids + "]获取[" + rfid + "][" + code + "]的入库库位");
Map<String, Object> resultMap = Maps.newHashMap();
if (dataCahche.getCache(Constants.CACHE_StopOut)) {
if (dataCache.getCache(Constants.CACHE_StopOut)) {
lineMsg = "系统更新中,暂停出入库";
DeviceMessageUtil.updateLineMsg(lineMsg,code,cids,"" ,"smfcore.linemsg.update",null);
DeviceMessageUtil.updateLineMsg(lineMsg, code, cids, "", "smfcore.linemsg.update", null);
resultMap.put("result", "100");
resultMap.put("msg", lineMsg);
return resultMap;
......@@ -133,14 +146,14 @@ public class DeviceController {
List<Storage> storageList = Lists.newArrayList();
List<String> cidList = Lists.newArrayList();
for (String cid : cids.split(",")) {
String notIntoCids = dataCahche.getSettings().getNotIntoCids();
String notIntoCids = dataCache.getSettings().getNotIntoCids();
if (notIntoCids != null) {
if (notIntoCids.contains(cid)) {
log.info("料仓[" + cid + "]已被屏蔽入库");
continue;
}
}
Storage storage = dataCahche.getStorage(cid);
Storage storage = dataCache.getStorage(cid);
if (storage != null) {
storageList.add(storage);
cidList.add(cid);
......@@ -215,7 +228,7 @@ public class DeviceController {
// }
Storage theStorage = dataCahche.getStorageById(pos.getStorageId());
Storage theStorage = dataCache.getStorageById(pos.getStorageId());
resultMap.put("result", "0");
resultMap.put("msg", "");
......@@ -249,10 +262,10 @@ public class DeviceController {
reelLocInfo = ReelLockPosUtil.addReelLockPosInfo(reelLocInfo, cidList);
if (reelLocInfo == null) {
errorMsg = "[" + barcode.getBarcode() + "]库位["+reelLocInfo.getLockPosName()+"]已被锁定,暂停入库";
errorMsg = "[" + barcode.getBarcode() + "]库位[" + reelLocInfo.getLockPosName() + "]已被锁定,暂停入库";
lineMsg = errorMsg;
DeviceMessageUtil.updateLineMsg(lineMsg,code,cids, reelLocInfo.getLockPosName(),"smfcore.linemsg.posLock",new String[]{barcode.getBarcode(),reelLocInfo.getLockPosName()});
DeviceMessageUtil.updateLineMsg(lineMsg, code, cids, reelLocInfo.getLockPosName(), "smfcore.linemsg.posLock", new String[]{barcode.getBarcode(), reelLocInfo.getLockPosName()});
resultMap.put("result", "99");
resultMap.put("msg", errorMsg);
return resultMap;
......@@ -298,7 +311,7 @@ public class DeviceController {
alarmInfoDao.save(alarmInfo);
lineMsg = errorMsg;
DeviceMessageUtil.updateLineMsg(lineMsg,code,cids,"","",null );
DeviceMessageUtil.updateLineMsg(lineMsg, code, cids, "", "", null);
} else {
lineMsg = okMsg;
}
......@@ -335,19 +348,19 @@ public class DeviceController {
@AnonymousAccess
public ResultBean cancelOutTask(HttpServletRequest request) {
String codeStr = request.getParameter("barcode");
try{
try {
Collection<DataLog> tasks = taskService.getAllTasks();
for (DataLog task : tasks) {
if(codeStr.contains(task.getBarcode())){
if(task.isCheckOutTask()){
if(task.isWait() || task.isExecuting()){
if (codeStr.contains(task.getBarcode())) {
if (task.isCheckOutTask()) {
if (task.isWait() || task.isExecuting()) {
//未执行完成的,理论上不会从客户端取消
boolean cancelResult = taskService.cancelTask(task.getId());
log.info("客户端取消["+codeStr+"]的未执行完成的出库任务结果:" + cancelResult);
log.info("客户端取消[" + codeStr + "]的未执行完成的出库任务结果:" + cancelResult);
return ResultBean.newOkResult(cancelResult);
}else{
} else {
return ResultBean.newErrorResult(2005, "smfcore.cancelOutTask.taskHasEnd","客户端取消入库任务[{0}]失败:任务已结束或已取消", new String[]{codeStr });
return ResultBean.newErrorResult(2005, "smfcore.cancelOutTask.taskHasEnd", "客户端取消入库任务[{0}]失败:任务已结束或已取消", new String[]{codeStr});
}
// else{
// //禁用库位
......@@ -359,10 +372,10 @@ public class DeviceController {
}
}
}
}catch (Exception e){
return ResultBean.newErrorResult(2004, "smfcore.cancelOutTask.fail","客户端取消入库任务[{0}]失败:{1}" , new String[]{codeStr, e.getMessage()});
} catch (Exception e) {
return ResultBean.newErrorResult(2004, "smfcore.cancelOutTask.fail", "客户端取消入库任务[{0}]失败:{1}", new String[]{codeStr, e.getMessage()});
}
return ResultBean.newErrorResult(2005, "smfcore.cancelOutTask.fail","客户端取消入库任务[{0}]失败:{1}", new String[]{codeStr,""});
return ResultBean.newErrorResult(2005, "smfcore.cancelOutTask.fail", "客户端取消入库任务[{0}]失败:{1}", new String[]{codeStr, ""});
}
......@@ -383,11 +396,91 @@ public class DeviceController {
if (pos == null) {
return ResultBean.newErrorResult(1, "smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"PosId", posId});
}
pos.setEnabled(true);
pos.setEnabled(false);
storagePosManager.save(pos);
log.info("屏蔽库位:库位号[" + pos.getId() + "][" + pos.getPosName() + "]barcode[" + barcode + "]");
return ResultBean.newOkResult("");
}
@ApiOperation("客户端判断CID是否存在")
@RequestMapping(value = "/service/store/cidIsExists")
@ResponseBody
@AnonymousAccess
public ResultBean cidIsExists(HttpServletRequest request) {
String cid = request.getParameter("cid");
Storage storage = dataCache.getStorage(cid);
if (storage == null) {
return ResultBean.newErrorResult(1, "smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"CID", cid});
}
return ResultBean.newOkResult(cid);
}
@ApiOperation("客户端上传料仓库位列表")
@RequestMapping(value = "/service/store/uploadStoragePos")
@ResponseBody
@AnonymousAccess
public ResultBean uploadStoragePos(@RequestBody final StatusBean statusBean, HttpServletRequest request) {
String cid = statusBean.getCid();
Storage storage = dataCache.getStorage(cid);
if (storage == null) {
log.error("uploadStoragePos料仓cid: [" + cid + "]不存在,默认自动创建料仓");
//自动创建料仓
storage = dataCache.AutoCreateStorage(cid);
if (storage == null) {
return ResultBean.newErrorResult(1, "smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"CID", cid});
}
}
//料仓已存在,判断料仓是否有库位
List<StoragePos> storagePosList = storagePosManager.findByStorage(storage.getId());
if (storagePosList.size() >= 0) {
return ResultBean.newErrorResult(1, "smfcore.alreadyHasPos", "料仓[{0}]已有库位数:[{1}]", new String[]{cid, storagePosList.size() + ""});
}
//取库位
List<PosInfo> posInfoList=statusBean.getPosList();
List<StoragePos> newList=new ArrayList<>();
List<String> posNameList=new ArrayList<>();
if(posInfoList!=null&&posInfoList.size()>0){
int row = 1;
int newRowCount = 0;
for (PosInfo pos :
posInfoList) {
row++;
if (ObjectUtil.isEmpty(pos.getPos())) {
log.warn("第" + row + "条库位号中有空白内容,此行忽略");
continue;
}
if (posNameList.contains(pos.getPos())) {
log.warn("第" + row + "条库位号[" + storage + "]重复,只保留第一条,忽略其他行");
} else {
StoragePos posInfo = new StoragePos(storage.getId(), pos.getPos(), pos.getH(), pos.getW(), pos.getPri());
newRowCount++;
newList.add(posInfo);
}
}
if(newList.size()>0){
storagePosManager.insertAll(newList);
}
dataCache.reloadStorage(storage,"");
String msg = "读取到["+row+"]行数据:为料仓["+storage.getCid()+"]新增["+newRowCount+"]条库位号";
log.info(msg);
}
return ResultBean.newOkResult(cid);
}
private StoragePos findFormList(List<StoragePos> list ,String posName)
{
for (StoragePos pos :
list) {
if( pos.getPosName().equals(posName)){
return pos;
}
}
return null;
}
}
......@@ -17,6 +17,8 @@ import com.neotel.smfcore.core.language.service.po.LanguageMsg;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.storage.bean.InventoryItem;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.enums.COMPATIBLE_TYPE;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.OrderSetting;
import com.neotel.smfcore.core.system.service.dao.ICacheItemDao;
......@@ -343,6 +345,17 @@ public class DataCache {
}
return null;
}
/**
* 根据 料仓名称 Name 获取料仓信息
*/
public Storage getStorageByName(String storageName){
for(Storage storage : getAllStorage().values()){
if(storage.getName().equals(storageName)){
return storage;
}
}
return null;
}
public Storage reloadStorage(Storage storage,String oldCid) throws ValidateException {
......@@ -426,6 +439,9 @@ public class DataCache {
if (ObjectUtil.isNotEmpty(s)) {
for (String v :
valueArray) {
if(ObjectUtil.isEmpty(v)){
continue;
}
try {
Pattern pattern = Pattern.compile(QueryHelp.escapeExprSpecialWord(s), Pattern.CASE_INSENSITIVE);
Matcher m = pattern.matcher(v);
......@@ -643,4 +659,30 @@ public class DataCache {
return availableStorageIds;
}
public Storage AutoCreateStorage(String cid) {
//判断cid存在
Storage storage = null;
storage = getStorage(cid);
if (storage != null) {
return storage;
}
//判断cid是否和其他料仓名称重复,重复时无法自动创建
if (getStorageByName(cid) != null) {
return null;
}
storage = new Storage();
storage.setCid(cid);
storage.setType(DeviceType.AUTO.getName());
storage.setName(cid);
storage.setCompatibleType(COMPATIBLE_TYPE.EXACT_MATCH);
storage.setSourcePath("");
storage.setGroupId("");
storage = storageManager.save(storage);
reloadStorage(storage, "");
log.info("AutoCreateStorage :自动创建料仓完成:cid["+storage.getCid()+"]name["+storage.getName()+"]type["+storage.getCompatibleType().name()+"]");
return storage;
}
}
......@@ -2,8 +2,10 @@ package com.neotel.smfcore.core.storage.service.po;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.PointUtil;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import lombok.Data;
import org.springframework.data.geo.Point;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexType;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexed;
import org.springframework.data.mongodb.core.mapping.Document;
......@@ -14,6 +16,51 @@ import java.util.List;
@Data
@Document
public class StoragePos extends BasePo implements Serializable {
public StoragePos(){
}
public StoragePos(String storageId,String posName,int h,int w,int priority){
setStorageId(storageId);
setPosName(posName);
setH(h);
setW(w);
setPriority(priority);
Point point= PointUtil.getPosPoint(posName);
setCoordinate(new double[]{point.getX(),point.getY()});
}
public boolean updatePosInfo(String storageId,String posName,int h,int w,int priority){
boolean needUpdate=false;
if(!getPosName().equals(posName)){
needUpdate=true;
setPosName(posName);
}
if(!getStorageId().equals(storageId)){
needUpdate=true;
setStorageId(storageId);
}
if(getH()!=h){
needUpdate=true;
setH(h);
}
if(getW()!=w){
needUpdate=true;
setW(w);
}
if(getPriority()!=priority){
needUpdate=true;
setPriority(priority);
}
Point point= PointUtil.getPosPoint(getPosName());
if(getCoordinate()==null||getCoordinate().length!=2||
(getCoordinate()[0]!=point.getX()) ||(getCoordinate()[1]!=point.getY())){
needUpdate=true;
setCoordinate(new double[]{point.getX(),point.getY()});
}
return needUpdate;
}
private String storageId;
private Barcode barcode;
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!