Commit 3d545633 sunke

架构调整

1 个父辈 ae9d97f3
正在显示 75 个修改的文件 包含 1734 行增加361 行删除
package com.neotel.smfcore; package com.neotel.smfcore;
import com.neotel.smfcore.common.annotation.security.AnonymousGetMapping; import com.neotel.smfcore.security.annotation.AnonymousGetMapping;
import com.neotel.smfcore.common.utils.SpringContextHolder; import com.neotel.smfcore.common.utils.SpringContextHolder;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
......
...@@ -111,222 +111,6 @@ public class StorageConstants { ...@@ -111,222 +111,6 @@ public class StorageConstants {
public final static int OFFLINE = 999; public final static int OFFLINE = 999;
} }
/// <summary>
/// 单台BOX状态
/// 1=正常运行中
/// 2=急停,3=故障,4=警告,5=调试中
/// 6入库执行中,7入仓位完成,8入库失败
/// 9出库执行中,10出仓位完成,11出库失败
/// </summary>
public static class BOX_STATUS{
/**
* 1=准备就绪
*/
public final static int READY = 1;
/**
* 2=急停
*/
public final static int EMERGENCY = 2;
/**
* 3=故障
*/
public final static int PROBLEM = 3;
/**
* 4=警告(用msg发送提醒,如出库到达工位但是没有工人操作)
*/
public final static int WARNING = 4;
/**
* 5=调试中
*/
public final static int DEBUG = 5;
/**
* 6入库执行中
*/
public final static int PUTIN = 6;
/**
* 7入仓位完成,
*/
public final static int IN_FINISHED = 7;
/**
* 8入库失败
*/
public final static int IN_FAILED = 8;
/**
*9出库执行中,
*/
public final static int CHECKOUT = 9;
/**
* 10出仓位完成
*/
public final static int OUT_FINISHED = 10;
/**
* 11出库完成
*/
public final static int OUT_END = 11;
/**
* 12出库移栽中
*/
public final static int OUT_MOVING = 12;
/**
* 13原点返回中
*/
public final static int RESET = 13;
/**
* 14 回温取料中
*/
public final static int REWARM_TAKING = 14;
/**
* 15 回温取料完成
*/
public final static int REWARM_TAKING_END = 15;
/**
* 16 回温放料中
*/
public final static int REWARM_PUTTING = 16;
/**
* 17 回温放料完成
*/
public final static int REWARM_PUTTING_END = 17;
/**
* 18 搅拌取料中
*/
public final static int MIX_TAKING = 18;
/**
* 19 等待搅拌
*/
public final static int WAIT_MIX = 19;
/**
* 20 搅拌执行中
*/
public final static int MIXING = 20;
/**
* 21 搅拌完成回仓
*/
public final static int MIX_PUTTING = 21;
/**
* 22 搅拌完成放回原来的仓中
*/
public final static int MIX_END = 22;
}
/**
* 料仓类型:0单台自动料仓,1手动料仓2流水线料仓
*/
public static enum TYPE{
/**
*0单台自动料仓
*/
AUTO("storage.type.auto"),
/**
* 1手动料仓
*/
MANUAL("storage.type.manual"),
/**
* 2流水线料仓
*/
LINE("storage.type.line"),
/**
* 3 虚拟料仓
*/
VIRTUAL("storage.type.virtual"),
/**
* 4 在线料仓(上下层两个 BOX)
*/
ONLINE("storage.type.online"),
/**
* 5批量上下料料仓
*/
BATCH("storage.type.batch"),
/**
* 6智能料架
*/
SHELF("storage.type.shelf"),
/**
* 7 料柜
*/
CABINET("storage.type.cabinet"),
/**
* 8 料架
*/
ACCSHELF("storage.type.accShelf"),
/**
* 9 新料架,支持合并库位确认
*/
NEWSHELF("storage.type.newShelf"),
/**
* 9 扫码料架
*/
CODESHELF("storage.type.codeShelf"),
/**
* 10 锡膏料仓
*/
SOLDERPASTE("storage.type.solderPaste"),
/**
* 11 垂直货柜
*/
VERTICALBOX("storage.type.smdVl"),
/**
* 12 SMD-XL(方仓)
*/
SMD_XL("storage.type.smdXl"),
/**
* 13 SMD-DUO(DUO料仓)
*/
SMD_DUO("storage.type.smdDuo")
;
private String key;
TYPE(String key) {
this.key = key;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getName(){
return name();
}
public static List<TYPE> availableTypeList(){
return Lists.newArrayList(AUTO,LINE,BATCH,ACCSHELF,CODESHELF,SOLDERPASTE,VERTICALBOX,SMD_XL,SMD_DUO);
}
}
/** /**
* 操作状态 * 操作状态
......
package com.neotel.smfcore.security.service.dao; package com.neotel.smfcore.core.barcode.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
......
package com.neotel.smfcore.security.service.dao; package com.neotel.smfcore.core.barcode.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
import com.neotel.smfcore.security.service.po.Component; import com.neotel.smfcore.core.barcode.service.po.Component;
import java.util.List; import java.util.List;
......
package com.neotel.smfcore.security.service.dao.impl; package com.neotel.smfcore.core.barcode.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao; import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.security.service.dao.IBarcodeDao; import com.neotel.smfcore.core.barcode.service.dao.IBarcodeDao;
import com.neotel.smfcore.security.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
public class BarcodeDaoImpl extends AbstractBaseDao implements IBarcodeDao { public class BarcodeDaoImpl extends AbstractBaseDao implements IBarcodeDao {
@Override @Override
......
package com.neotel.smfcore.security.service.dao.impl; package com.neotel.smfcore.core.barcode.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao; import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.security.service.dao.IComponentDao; import com.neotel.smfcore.core.barcode.service.dao.IComponentDao;
import com.neotel.smfcore.security.service.po.Component; import com.neotel.smfcore.core.barcode.service.po.Component;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
......
package com.neotel.smfcore.security.service.manager; package com.neotel.smfcore.core.barcode.service.manager;
import com.neotel.smfcore.common.base.IBaseManager; import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.security.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
public interface IBarcodeManager extends IBaseManager<Barcode> { public interface IBarcodeManager extends IBaseManager<Barcode> {
} }
package com.neotel.smfcore.security.service.manager; package com.neotel.smfcore.core.barcode.service.manager;
import com.neotel.smfcore.common.base.IBaseManager; import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.security.service.po.Component; import com.neotel.smfcore.core.barcode.service.po.Component;
public interface IComponentManager extends IBaseManager<Component> { public interface IComponentManager extends IBaseManager<Component> {
} }
package com.neotel.smfcore.security.service.manager.impl; package com.neotel.smfcore.core.barcode.service.manager.impl;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.security.service.manager.IBarcodeManager; import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.security.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
......
package com.neotel.smfcore.security.service.manager.impl; package com.neotel.smfcore.core.barcode.service.manager.impl;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.security.service.manager.IComponentManager; import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.security.service.po.Component; import com.neotel.smfcore.core.barcode.service.po.Component;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
......
package com.neotel.smfcore.security.service.po; package com.neotel.smfcore.core.barcode.service.po;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
......
package com.neotel.smfcore.security.service.po; package com.neotel.smfcore.core.barcode.service.po;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.StorageConstants; import com.neotel.smfcore.common.utils.StorageConstants;
......
package com.neotel.smfcore.core.device;
/**
* Created by sunke on 2021/7/12.
*/
public class SmdXlBoxHandler implements IDeviceHandler{
@Override
public String getDeviceType() {
return null;
}
}
package com.neotel.smfcore.core.device.bean;
import com.neotel.smfcore.core.device.enums.BOX_STATUS;
import java.util.HashMap;
import java.util.Map;
/**
* Created by sunke on 17/2/13.
*/
public class BoxStatusBean {
/// <summary>
/// Box编号,从1开始
/// </summary>
private int boxId;
/// <summary>
/// 单台BOX状态
///1=正常运行中
/// 2=急停,3=故障,4=警告,5=调试中
/// 6入库执行中,7入仓位完成,8入库失败
/// 9出库执行中,10出仓位完成,11出库失败
/// </summary>
private int status;
/// <summary>
/// 操作相关数据,出仓完成或入仓完成时,需要有 posId 信息
/// </summary>
private Map<String, String> data = new HashMap<>();
/// <summary>
/// 单台BOX的消息
/// 正在调试中,不能出入库
/// 入库失败原因:
/// 出库失败原因:
/// </summary>
public String msg;
/// <summary>
/// 温度
/// </summary>
public String temperature;
/// <summary>
/// 湿度
/// </summary>
public String humidity;
public int getBoxId() {
return boxId;
}
public void setBoxId(int boxId) {
this.boxId = boxId;
}
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 getTemperature() {
return temperature;
}
public void setTemperature(String temperature) {
this.temperature = temperature;
}
public String getHumidity() {
return humidity;
}
public void setHumidity(String humidity) {
this.humidity = humidity;
}
/**
* 当前的 BOX 是否空闲,即状态为就绪状态
*/
public boolean boxIsIdle(){
return status == BOX_STATUS.READY;
}
/**
* 当前的 BOX 是否正在出库执行(未出仓位或出仓完成但还没完成出库)
*/
public boolean boxIsCheckingOut(){
return status == BOX_STATUS.CHECKOUT || status == BOX_STATUS.OUT_FINISHED || status == BOX_STATUS.OUT_MOVING;
}
/**
* 当前 box 是否可以接受出库任务(空闲或出仓完成或正在移栽的都可以再分配出库任务)
*/
public boolean boxCanCheckout(){
return boxIsIdle() || status == BOX_STATUS.OUT_MOVING;
}
/**
* BOX 是否可以正常使用,没有急停,故障,调试等
*/
public boolean boxIsAvailable(){
return status != BOX_STATUS.EMERGENCY && status != BOX_STATUS.PROBLEM && status != BOX_STATUS.DEBUG ;
}
public Map<String, String> getData() {
return data;
}
public void setData(Map<String, String> data) {
this.data = data;
}
/**
* 获取客户端发送上来的出入库完成的库位信息
*/
public String getPosId(){
return data.get("posId");
}
}
package com.neotel.smfcore.core.device.bean;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.device.enums.BOX_STATUS;
import com.neotel.smfcore.core.service.po.AlarmInfo;
import java.util.*;
/**
* 类型,内容,详情,Msg
0,消息,"1=原点返回 2=复位",
1,总体错误,"1=急停 2=没有气压信号 3=盘错乱",
2,运动轴错误,"1=第一轴(旋转)2=第二轴(上下轴)3=第三轴(前进轴)4=第四轴(压紧轴)",
3,IO报警,信号超时,io电器定义(电器定义),
4,电钢报警,1=上下电钢,
*/
public class StatusBean {
/// <summary>
/// 料仓唯一标识
/// </summary>;
private String cid;
/// <summary>
/// 请求序列号
/// </summary>
private int seq;
/// <summary>
/// 操作码(0无操作(发送料仓状态给服务器),1扫码入库(扫码成功后发送给服务器),2 出库(服务器发送) )
/// </summary>
private int op;
/// <summary>
/// 操作相关数据,
/// op=1时,客户端发送 code 二维码给服务器,服务器返回时有:posId库位编号,plateW:料盘宽度,plateH:料盘高度
/// 如果需要更新温湿度的报警值,服务器会发送alarmTemperature,alarmHumidity给客户端,客户端缓存,如果没有发送,不处理
/// </summary>
//数据还放入data那个map里面,客户端收到服务器openLock为doit时,执行打开门锁动作;startBatchIn为doit时,执行开始批量入库动作;closeLock为doit时,执行关闭门锁;takeOutReel为doit时,执行取出出库料盘动作;confirmReelOut为doit时,执行门口料盘已取出;
//当服务器收到客户端:doorStatus为门锁状态(如开门中,或关闭中);openLock为enable时,此按钮状态为可用;startBatchIn为enable时此按钮状态为可用;closeLock为enable时此按钮状态为可用;takeOutReel为enable时此按钮状态为可用;confirmReelOut为enable时此按钮状态为可用;
//服务器默认这些按钮都为不可用状态,只有收到对应的enable时,按钮才可以进行点击
private Map<String, String> data = new HashMap<>();
/**
* 提示消息,key为en, zh_CN, jp等,消息为对应语言的消息
*/
private Map<String, String> msgData = new HashMap<>();
/// <summary>
/// 整体料仓状态
/// 1=正常运行中
/// 2=急停中
/// 3=故障(气压检测不到等,用msg发送详细故障说明)
/// 4=警告(用msg发送提醒,如出库到达工位但是没有工人操作)
/// </summary>
private int status;
/// <summary>
/// 提示消息
/// 出入库错误: BOX正在调试中,不能出入库
/// 出入库错误: 急停了不能出入库
/// 入库错误:料盘过大,放不到指定的位置中去
/// 故障:气压信号检测不到
/// 警告:出库盘到达工位但是没有工人操作
/// </summary>
public String msg = "";
/**
* 英文提示消息
*/
public String msgEn = "";
/// <summary>
/// 包含的多个 BOX 的状态信息
/// </summary>
private Map<Integer,BoxStatusBean> boxStatus = new HashMap<>();
/**
* 报警集合
*/
private List<AlarmInfo> alarmList = new ArrayList<>();
private long time = System.currentTimeMillis();
/**
* 上次保存时间
*/
private long lastSaveTime = System.currentTimeMillis();
/**
* 获取已经结束(缓存中存在,但新的报警列表不存在)的报警列表,同时将新的报警加入到缓存中
*/
public List<AlarmInfo> getEndAlarmList(String storageName, List<AlarmInfo> newAlarmList){
List<AlarmInfo> endAlarmList = new ArrayList<>();
Map<String,AlarmInfo> map = new HashMap<>();
if(newAlarmList != null){
for (AlarmInfo newAlarm : newAlarmList){
map.put(newAlarm.getKey(), newAlarm);
}
}
if(alarmList == null){
alarmList = new ArrayList<>();
}
for (AlarmInfo cacheAlarm : alarmList){
AlarmInfo existAlarm = map.get(cacheAlarm.getKey());
if(existAlarm == null){//客户端新上传的报警列表中不存在,说明该报警已经结束
//如果结束时间超过20秒就存到数据库中
Date endDate = cacheAlarm.getEndTime();
if(endDate != null){
if(System.currentTimeMillis() - endDate.getTime() >= 20 * 1000){
cacheAlarm.setStorageName(storageName);
endAlarmList.add(cacheAlarm);
}
}else{
//设置结束时间
cacheAlarm.setEndTime(new Date());
}
}else{//报警还在继续维持
cacheAlarm.setEndTime(null);
//从map 中移除,剩余的就是本次新增的报警信息
map.remove(cacheAlarm.getKey());
}
}
//将已经结束的报警信息从缓存列表中移除
for (AlarmInfo endAlarm : endAlarmList){
alarmList.remove(endAlarm);
}
//新增加的报警信息添加到缓存列表中
for(AlarmInfo newAlarm : map.values()){
newAlarm.setStartTime(new Date());
alarmList.add(newAlarm);
}
return endAlarmList;
}
/**
* 是否超时(3秒)
*/
public boolean timeOut(){
return System.currentTimeMillis() - time > 10 * 1000;
}
/**
* 获取客户端发送上来的二维码
*/
public String getCode(){
return data.get("code");
}
public int getWeight(){
String weightStr = data.get("weight");
try{
return Integer.valueOf(weightStr);
}catch (Exception e){
}
return 0;
}
/**
* 获取库位信息
*/
public String getPosId(){
return data.get("posId");
}
/**
* 门口是否有料盘,如果
* @return
*/
public String hasTrayAtDoor(){
return getFromData("TrayCheck_Door");
}
/**
* 从Data中获取数据
*/
public String getFromData(String key){
return data.get(key);
}
/**
* 获取客户端发送上来的二维码对应的 boxId
*/
// public String getCodeBoxId(){
// return data.get("boxId");
// }
public void setCode(String barcode){
data.put("code",barcode);
}
public void setTemperature(float temperature) {
data.put("temp",String.valueOf(temperature));
}
public void setHumidity(float humidity) {
data.put("humi", String.valueOf(humidity));
}
public List<AlarmInfo> getAlarmList() {
return alarmList;
}
public void setAlarmList(List<AlarmInfo> alarmList) {
this.alarmList = alarmList;
}
/**
* 添加一些服务器的操作发送到客户端(批量入库)
* @param opMap
*/
public void addOp(Map<String, String> opMap){
if(opMap != null && !opMap.isEmpty()){
for (Map.Entry<String, String> op : opMap.entrySet()) {
data.put(op.getKey(), op.getValue());
}
}
}
public void addData(String key, String value){
String oldValue = data.get(key);
String valueStr = value;
if(!Strings.isNullOrEmpty(oldValue)){
valueStr = valueStr + "|" + oldValue;
}
data.put(key, valueStr);
}
/**
* 入库时添加仓位及料盘大小信息(posId库位编号,plateW:料盘宽度,plateH:料盘高度,singleOut:是否出库到料仓门口)
*/
public void addPosInfo(String barcode, String posId, int plateW, int plateH, boolean isSingleOut){
String originalPosId = data.get("posId");
String originalPlateW = data.get("plateW");
String originalPlateH = data.get("plateH");
String originalBarcode = data.get("barcode");
String posIdStr = posId;
String plateWStr = plateW + "";
String plateHStr = plateH + "";
String barcodeStr = barcode + "";
if(!Strings.isNullOrEmpty(originalPosId)){
posIdStr = originalPosId + "|" + posId;
}
if(!Strings.isNullOrEmpty(originalPlateW)){
plateWStr = originalPlateW + "|" + plateW;
}
if(!Strings.isNullOrEmpty(originalPlateH)){
plateHStr = originalPlateH + "|" + plateH;
}
if(!Strings.isNullOrEmpty(originalBarcode)){
barcodeStr = originalBarcode + "|" + barcodeStr;
}
data.put("posId",posIdStr);
data.put("plateW",plateWStr);
data.put("plateH",plateHStr);
data.put("barcode",barcodeStr);
data.put("singleOut", isSingleOut+"");
}
/**
* 是否需要往数据库保存(5分钟保存一次)
*/
public boolean needSaveToMongo(){
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 void setShowMsg(Locale local){
String lang = local.getLanguage();
String showMsg = msgData.get(lang);
// if(showMsg == null){
// if(Language.ENGLISH.getLabel().contains(lang)){
// showMsg = msgEn;
// }else{
// showMsg = msg;
// }
// }
this.msg = showMsg;
}
public Map<Integer, BoxStatusBean> getBoxStatus() {
return boxStatus;
}
public void setBoxStatus(Map<Integer, BoxStatusBean> boxStatus) {
this.boxStatus = boxStatus;
}
public boolean isAvailable(){
if(!timeOut()){
return status != BOX_STATUS.EMERGENCY && status != BOX_STATUS.PROBLEM && status != BOX_STATUS.DEBUG;
}
return false;
}
// public List<Integer> allIdleBoxIds(){
// List<Integer> idleBoxIds = new ArrayList<>();
// if(!timeOut()){//在线
// if(StorageConstants.STATUS.OFFLINE != status){//在线
// for (BoxStatusBean boxStatusBean : boxStatus.values()) {
// if(boxStatusBean.boxIsIdle()){
// idleBoxIds.add(boxStatusBean.getBoxId());
// }
// }
// }
// }
// return idleBoxIds;
// }
/**
* 所有可以出库的 box
*/
// public List<Integer> allCanCheckoutBoxIds(){
// List<Integer> canCheckoutBoxIds = new ArrayList<>();
// if(StorageConstants.STATUS.OFFLINE != status){//在线
// for (BoxStatusBean boxStatusBean : boxStatus.values()) {
// if(boxStatusBean.boxCanCheckout()){
// canCheckoutBoxIds.add(boxStatusBean.getBoxId());
// }
// }
// }
// return canCheckoutBoxIds;
// }
/**
* 获取所有可以入库的 BOXID(用正则的|线隔开),即 BOX 可以正常使用(没有急停,故障,调试等)并且不是出库状态(正在出库时如果再分配入库有可能会出现卡死的情况,即出库要等空托盘,但入库的托盘卡在移载处)
*/
// public List<Integer> allCanPutInBoxIds(){
// List<Integer> canPutInBoxIds = new ArrayList<>();
// String idleBoxIds = "";
// for (BoxStatusBean boxStatusBean : boxStatus.values()) {
// //可正常使用,且未在出库执行中
// if(boxStatusBean.boxIsAvailable() && !boxStatusBean.boxIsCheckingOut()){
// canPutInBoxIds.add(boxStatusBean.getBoxId());
// }
// }
// return canPutInBoxIds;
// }
/**
* 判断某个 box 是否可以执行入库操作
*/
// public boolean isBoxCanPutIn(int boxId){
// if(timeOut()){
// return false;
// }
// for (BoxStatusBean boxStatusBean : boxStatus.values()) {
// //可正常使用,且未在出库执行中
// int bid = boxStatusBean.getBoxId();
// if(bid == boxId){
// if(boxStatusBean.boxIsAvailable() && !boxStatusBean.boxIsCheckingOut()){
// return true;
// }
// return false;
// }
// }
// return false;
// }
// public void updateBoxStatus(String posName, int boxStatusToChange){
// int index = posName.indexOf("#");
// if(index > 0){
// int boxId = Integer.valueOf(posName.substring(0,index));
// for (BoxStatusBean boxStatusBean : boxStatus.values()) {
// if(boxStatusBean.getBoxId() == boxId){
// boxStatusBean.setStatus(boxStatusToChange);
// break;
// }
// }
// }
// }
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");
if(Strings.isNullOrEmpty(doorReelSignal)){
doorReelSignal = "-1";
}
return doorReelSignal;
}
}
package com.neotel.smfcore.core.device.enums;
/**
* Created by sunke on 2021/7/13.
*/
public class BOX_STATUS {
/**
* 1=准备就绪
*/
public final static int READY = 1;
/**
* 2=急停
*/
public final static int EMERGENCY = 2;
/**
* 3=故障
*/
public final static int PROBLEM = 3;
/**
* 4=警告(用msg发送提醒,如出库到达工位但是没有工人操作)
*/
public final static int WARNING = 4;
/**
* 5=调试中
*/
public final static int DEBUG = 5;
/**
* 6入库执行中
*/
public final static int PUTIN = 6;
/**
* 7入仓位完成,
*/
public final static int IN_FINISHED = 7;
/**
* 8入库失败
*/
public final static int IN_FAILED = 8;
/**
*9出库执行中,
*/
public final static int CHECKOUT = 9;
/**
* 10出仓位完成
*/
public final static int OUT_FINISHED = 10;
/**
* 11出库完成
*/
public final static int OUT_END = 11;
/**
* 12出库移栽中
*/
public final static int OUT_MOVING = 12;
/**
* 13原点返回中
*/
public final static int RESET = 13;
/**
* 14 回温取料中
*/
public final static int REWARM_TAKING = 14;
/**
* 15 回温取料完成
*/
public final static int REWARM_TAKING_END = 15;
/**
* 16 回温放料中
*/
public final static int REWARM_PUTTING = 16;
/**
* 17 回温放料完成
*/
public final static int REWARM_PUTTING_END = 17;
/**
* 18 搅拌取料中
*/
public final static int MIX_TAKING = 18;
/**
* 19 等待搅拌
*/
public final static int WAIT_MIX = 19;
/**
* 20 搅拌执行中
*/
public final static int MIXING = 20;
/**
* 21 搅拌完成回仓
*/
public final static int MIX_PUTTING = 21;
/**
* 22 搅拌完成放回原来的仓中
*/
public final static int MIX_END = 22;
}
package com.neotel.smfcore.core.device.handler;
import com.neotel.smfcore.common.enums.DeviceType;
import com.neotel.smfcore.core.device.bean.StatusBean;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
/**
* Created by sunke on 2021/7/12.
*/
@Service
public class BaseDeviceHandler implements IDeviceHandler{
@Override
public StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request) {
return null;
}
@Override
public DeviceType getDeviceType() {
return DeviceType.AUTO;
}
}
package com.neotel.smfcore.core.device; package com.neotel.smfcore.core.device.handler;
import com.neotel.smfcore.common.enums.DeviceType;
import com.neotel.smfcore.core.device.bean.StatusBean;
import javax.servlet.http.HttpServletRequest;
/** /**
* Created by sunke on 2021/7/13. * Created by sunke on 2021/7/13.
*/ */
public interface IDeviceHandler { public interface IDeviceHandler {
String getDeviceType(); StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request);
DeviceType getDeviceType();
} }
package com.neotel.smfcore.core.device; package com.neotel.smfcore.core.device.handler;
import com.neotel.smfcore.core.listener.IDeviceListener; import com.neotel.smfcore.common.enums.DeviceType;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/** /**
* Created by sunke on 2021/7/12. * Created by sunke on 2021/7/12.
*/ */
@Service @Service
public class BaseDeviceHandler implements IDeviceHandler{ public class SmdXlBoxHandler extends BaseDeviceHandler{
@Override @Override
public String getDeviceType() { public DeviceType getDeviceType() {
return ""; return DeviceType.SMD_XL;
} }
} }
package com.neotel.smfcore.core.device.handler;
import com.neotel.smfcore.common.enums.DeviceType;
import org.springframework.stereotype.Service;
/**
* Created by sunke on 2021/7/13.
*/
@Service
public class VerticalBoxHandler extends BaseDeviceHandler{
@Override
public DeviceType getDeviceType() {
return DeviceType.VERTICALBOX;
}
}
package com.neotel.smfcore.core.device.rest;
import com.neotel.smfcore.security.annotation.AnonymousPostMapping;
import com.neotel.smfcore.common.enums.DeviceType;
import com.neotel.smfcore.core.device.handler.IDeviceHandler;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.service.po.Storage;
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.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping("/service/store")
@RequiredArgsConstructor
@Api(tags = "设备通信")
public class DeviceController {
@Autowired
private DataCache dataCahche;
private Map<String, IDeviceHandler> handlerMap = new HashMap<>();
public DeviceController(List<IDeviceHandler> deviceHandlerList){
for (IDeviceHandler deviceHandler : deviceHandlerList) {
System.out.println(deviceHandler.getDeviceType() + "处理类 :" + deviceHandler.getClass());
handlerMap.put(deviceHandler.getDeviceType().name(),deviceHandler);
}
}
@ApiOperation("客户端定时通信接口")
@AnonymousPostMapping(value = "/communication")
@ResponseBody
public StatusBean communication(@RequestBody final StatusBean statusBean, HttpServletRequest request) {
try {
String cid = statusBean.getCid();
Storage storage = dataCahche.getStorage(cid);
if (storage == null) {
log.error("料仓cid: [" + cid + "]不存在");
return null;
}
synchronized (storage) {
String deviceType = storage.getType();
IDeviceHandler deviceHandler = handlerMap.get(deviceType);
if(deviceHandler == null){
//未找到处理类,使用默认处理类
deviceHandler = handlerMap.get(DeviceType.AUTO.name());
}
StatusBean resultBean = deviceHandler.handleClientRequest(statusBean,request);
return resultBean;
}
} catch (Exception e) {
log.error("", e);
}
return statusBean;
}
}
package com.neotel.smfcore.core.device.util;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.core.service.manager.IDataLogManager;
import com.neotel.smfcore.core.service.manager.IStorageManager;
import com.neotel.smfcore.core.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.service.po.Settings;
import com.neotel.smfcore.core.service.po.Storage;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* 缓存
* Created by sunke on 17/3/17.
*/
@Repository
public class DataCache {
protected final transient Logger log = LogManager.getLogger(getClass());
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private IStorageManager storageManager;
@Autowired
private IDataLogManager dataLogManager;
// @Autowired
// private ISettingsDao settingsDao;
//
// @Autowired
// private IBarcodeManager barcodeManager;
//
// @Autowired
// private IComponentManager componentManager;
//
// /**
// * 是否需要推送温湿度报警值
// */
// public static Map<String, Boolean> needUpdateHumidityMap = new ConcurrentHashMap<>();
//
// /**
// * 出库方式
// */
// private static Settings settings;
//
// private static List<BarcodeRule> barcodeRuleList;
//
// /**
// * 是否需要推送温湿度报警值
// */
// public boolean needUpdateHumidiy(String cid){
// Boolean needUpdateHumidiy = needUpdateHumidityMap.get(cid);
// if(needUpdateHumidiy == null || needUpdateHumidiy){
// needUpdateHumidityMap.put(cid, false);
// return true;
// }
// return false;
// }
//
//
// public Settings getSettings(){
// if(settings == null){
// List<Settings> allSettings = settingsDao.findAll();
// if(allSettings == null || allSettings.isEmpty()){
// settings = new Settings();
// settings.setOutType(StorageConstants.CHECKOUT_TYPE.EFFICIENCY.name());
// settings = settingsDao.save(settings);
// }else{
// settings = allSettings.get(0);
// }
//
// barcodeRuleList = Lists.newArrayList();
// List<String> ruleList = settings.getCodeRuleList();
// String oldCodeRule = settings.getCodeRule();
// if(!Strings.isNullOrEmpty(oldCodeRule)){
// ruleList.add(oldCodeRule);
// settings.setCodeRule("");
// settings.setCodeRuleList(ruleList);
// updateSettings(settings);
// }
//
// for(String codeRule : ruleList){
// if(!Strings.isNullOrEmpty(codeRule)){
// barcodeRuleList.add(BarcodeRule.newRule(codeRule));
// }
// }
// }
// return settings;
// }
//
// /**
// * 解析条码为单个 Barcode
// */
// public CodeBean resolveSingleCode(String barcodeItemStr){
// //防止规则未初始化
// if(barcodeRuleList == null){
// getSettings();
// }
//
// CodeBean codeBeanFromRule = null;
// Barcode barcode = null;
// if(barcodeRuleList.isEmpty()){
// //没有配置规则的话,直接从数据库中查询
// barcode = barcodeManager.findByBarcode(barcodeItemStr);
// if(barcode != null) {
// codeBeanFromRule = new CodeBean();
// codeBeanFromRule.setError(null,null);
// codeBeanFromRule.setCodeStr(barcode.getBarcode());
// codeBeanFromRule.setBarcode(barcode);
//// Component component = componentManager.findByPartNumber(barcode.getPartNumber());
//// codeBeanFromRule.setShowImg(component.getShowImg());
//
// return codeBeanFromRule;
// }
// }
//
// //每个规则尝试解析一次
// for (BarcodeRule codeRule : barcodeRuleList){
// codeBeanFromRule = codeRule.toCodeBean(barcodeItemStr);
// //查看数据库中是否已存在
// String codeStr = codeBeanFromRule.getCodeStr();
// barcode = barcodeManager.findByBarcode(codeStr);
// if(barcode != null) {//数据库中已存在
// if(codeBeanFromRule.hasReelSizeInfo()){
// //如果客户端传入的有尺寸,但尺寸不一致,使用上传上来的尺寸
// if(barcode.getHeight() != codeBeanFromRule.getReelHeight() || barcode.getPlateSize() != codeBeanFromRule.getReelWidth()){
// try{
// log.warn("重新设置尺寸["+barcode.getPlateSize()+"x"+barcode.getHeight()+"]为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
//
// barcode.setPlateSize(codeBeanFromRule.getReelWidth());
// barcode.setHeight(codeBeanFromRule.getReelHeight());
// barcode = barcodeManager.save(barcode);
// }catch (Exception ve){
// log.error("重设尺寸出错",ve);
// }
// }
// }
// Component component = componentManager.findByPartNumberAndProvider(barcode.getPartNumber(),barcode.getProvider());
// int validDay = 0;
// if(component != null){
// validDay = component.getValidDay();
// codeBeanFromRule.setShowImg(component.getShowImg());
// }
//
// Barcode barcodeFromRule = codeBeanFromRule.getBarcode();
// if(barcodeFromRule != null){
// boolean needUpdate = false;
// int lastLabelAmount = barcode.getLabelAmount();
// int currentLabelAmount = barcodeFromRule.getAmount();
// if(currentLabelAmount != lastLabelAmount){
// //本次解析出来的数量与上次条码解析出来的数量不一样,重新设置数量
// log.info("重新设置"+codeBeanFromRule.getCodeStr()+"数量为:"+currentLabelAmount);
// barcode.setAmount(currentLabelAmount);
// barcode.setLabelAmount(currentLabelAmount);
// needUpdate = true;
// }
//// Date produceDate = barcodeFromRule.getProduceDate();
//// if(produceDate != null){
//// //抓取到了生产日期,未抓取到过期日期,重新设置过期日期
//// if(barcode.getExpireDate() == null){
//// if(validDay > 0){
//// log.info("重新设置"+codeBeanFromRule.getCodeStr()+"生产日期和过期日期");
//// Date expireDate = DateUtil.addDays(produceDate, validDay);
//// barcode.setExpireDate(expireDate);
//// barcode.setProduceDate(produceDate);
//// needUpdate = true;
//// }
//// }
//// }
//
// if(needUpdate){
// try {
// barcodeManager.save(barcode);
// }catch (Exception e){
// log.error(e);
// }
// }
// }
//
// codeBeanFromRule.setError(null,null);
// codeBeanFromRule.setCodeStr(barcode.getBarcode());
// codeBeanFromRule.setBarcode(barcode);
// return codeBeanFromRule;
// }else if(codeBeanFromRule.isValid()){//数据库中不存在,但解析成功
// Barcode barcodeFromRule = codeBeanFromRule.getBarcode();
// try{
// //如果有料盘尺寸,重新设置料盘尺寸信息,没有档案时自动添加档案
// if(codeBeanFromRule.hasReelSizeInfo()){
// //log.info("料盘["+barcode.getBarcode()+"]的尺寸信息从["+barcode.getPlateSize()+"x"+barcode.getHeight()+"]设置为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
// Component component = componentManager.findByPartNumberAndProvider(barcodeFromRule.getPartNumber(),barcodeFromRule.getProvider());
//
// if(component == null){
// log.info("自动添加["+barcodeFromRule.getPartNumber()+"]["+barcodeFromRule.getProvider()+"]的档案信息["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
// component = new Component();
// component.setPartNumber(barcodeFromRule.getPartNumber());
// component.setAmount(barcodeFromRule.getAmount());
// component.setPlateSize(barcodeFromRule.getPlateSize());
// component.setHeight(barcodeFromRule.getHeight());
// component.setName(barcodeFromRule.getPartNumber());
// component.setProvider(barcodeFromRule.getProvider());
// componentManager.save(component);
// }else{
// //如果 barcode 里的料盘信息比 Component 中的大,使用比较大的,防止放不进去撞击
// if(codeBeanFromRule.getReelHeight() > component.getHeight() || codeBeanFromRule.getReelWidth() > component.getPlateSize()){
// log.info("更新物料["+component.getPartNumber()+"]档案尺寸["+component.getPlateSize()+"x"+component.getHeight()+"]为["+codeBeanFromRule.getReelWidth()+"x"+codeBeanFromRule.getReelHeight()+"]");
// component.setPlateSize(barcodeFromRule.getPlateSize());
// component.setHeight(barcodeFromRule.getHeight());
// componentManager.save(component);
// }
// codeBeanFromRule.setShowImg(component.getShowImg());
// }
//
// }
//
// boolean needAddNew = true;
// if(isProductionFor(CUSTOMER.LIAN_DIAN)){
// //联电的唯一码中必须带有-,否则无效
// if(!barcodeFromRule.getBarcode().contains("-")){
// needAddNew = false;
// log.info("唯一码["+barcodeFromRule.getBarcode()+"]中不带符号-,忽略");
// return null;
// }
// }
// if(needAddNew){
// log.info("自动添加条码"+barcodeItemStr+"到数据库中");
// Component component = componentManager.findByPartNumberAndProvider(barcodeFromRule.getPartNumber(),barcodeFromRule.getProvider());
// if(component == null){
// log.info("档案["+barcodeFromRule.getPartNumber()+"]不存在");
// throw new ValidateException("component.error.notExist",new String[]{barcodeFromRule.getPartNumber()});
// }
//
// codeBeanFromRule.setShowImg(component.getShowImg());
// Date produceDate = barcodeFromRule.getProduceDate();
// if(produceDate != null && barcodeFromRule.getExpireDate() == null){
// int validDay = component.getValidDay();
// if( validDay > 0){
// log.info("设置"+barcodeFromRule.getBarcode()+"的过期时间");
// Date expireDate = DateUtil.addDays(produceDate, validDay);
// barcodeFromRule.setExpireDate(expireDate);
// barcodeManager.save(barcodeFromRule);
// }
// }
//
// barcode = barcodeManager.save(barcodeFromRule);
// codeBeanFromRule.setCodeStr(barcode.getBarcode());
// codeBeanFromRule.setBarcode(barcode);
// codeBeanFromRule.setError(null,null);
// }
// }catch (ValidateException ve){
// //档案不存在
// codeBeanFromRule.setError("error.barcode.pnNotExist",new String[]{barcodeFromRule.getPartNumber()},"x档案 "+barcodeFromRule.getPartNumber()+" 不存在");
// log.warn("x档案"+barcodeFromRule.getPartNumber()+"不存在");
// }
// //解析成功了,直接返回
// return codeBeanFromRule;
// }else{
// //在数据库中不存在,且未解析成功,用其他规则再解析
// codeBeanFromRule.setError("error.barcode.invalid",new String[]{barcodeItemStr}, barcodeItemStr + "不是有效的条码");
// }
// }
//
// if(codeBeanFromRule == null){
// codeBeanFromRule = new CodeBean();
// codeBeanFromRule.setBarcode(null);
// codeBeanFromRule.setError("error.barcode.invalid",new String[]{barcodeItemStr}, barcodeItemStr + "不是有效的条码");
// codeBeanFromRule.setCodeStr(barcodeItemStr);
// return codeBeanFromRule;
// }
// return codeBeanFromRule;
// }
//
// public Collection<CodeBean> resolveCodeStr(String codeStr){
// List<CodeBean> codeBeans = Lists.newArrayList();
// //Map<String, CodeBean> codeBeanMap = Maps.newHashMap();
// if(!Strings.isNullOrEmpty(codeStr)){
// //双##号分割多个二维码
// String[] barcodeItemStrs = codeStr.split("##");
//
// //需要检查partNumber 是否一致
// //Multiset<String> partNumberMultiset = HashMultiset.create();
// //含有最多的 partNumber
// //String mostPartNumber = "";
//
//
// for (String barcodeItemStr : barcodeItemStrs){
// CodeBean codeBean = resolveSingleCode(barcodeItemStr);
// if(codeBean == null){
// continue;
// }
// boolean hasSameCode = false;
// if(codeBean.isValid()){
// //过滤唯一码重复的,防止即扫到二维码也扫到一维码会有多个条码的问题
// for (CodeBean bean : codeBeans) {
// if(bean.isValid()){
// String reelId = codeBean.getBarcode().getBarcode();
// if(reelId.equals(bean.getBarcode().getBarcode())){
// hasSameCode = true;
// log.info(reelId + "与已有效条码一样,忽略");
// break;
// }
// }
// }
// }
//
// if(!hasSameCode){
// codeBeans.add(codeBean);
// }
//
// //统计非夹具的 partNubmer
//// if(codeBean.isValid() && !codeBean.isFixtureCode()){
//// String partNumber = codeBean.getBarcode().getPartNumber();
//// partNumberMultiset.add(partNumber);
//// if(partNumberMultiset.count(partNumber) > partNumberMultiset.count(mostPartNumber) ){
//// mostPartNumber = partNumber;
//// }
//// }
// }
//
//
//// for (CodeBean codeBean : codeBeans) {
//// if(codeBean.isValid() && !codeBean.isFixtureCode()){
//// //非夹具的 partNumber 不一致
//// if(!mostPartNumber.equals(codeBean.getBarcode().getPartNumber())){
//// codeBean.setError("error.barcode.wrongPn", "PartNumber不一致");
//// }
//// }
//// codeBeanMap.put(codeBean.getCodeStr(), codeBean);
//// }
// }
// //return codeBeanMap.values();
// return codeBeans;
// }
//
// /**
// * 从条码信息中解析出一个有效条码
// * @param codeStr
// * @return
// */
// public Barcode resolveOneValideBarcode(String codeStr) throws ValidateException{
// if(org.apache.logging.log4j.util.Strings.isBlank(codeStr)){
// throw new ValidateException("error.barcode.empty","未扫到条码");
// }
// Collection<CodeBean> codeBeans = resolveCodeStr(codeStr);
// Barcode barcode = null;
// String errorMsg = "";
// for (CodeBean codeBean : codeBeans) {
// if(codeBean.isValid()){
// Barcode barcodeFromRule = codeBean.getBarcode();
// if(barcode == null){
// barcode = barcodeFromRule;
// }else{
// throw new ValidateException("error.barcode.many",new String[]{codeStr},"找到多个有效的条码");
// }
// }else{
// errorMsg = codeBean.getError();
// }
// }
//
// if(barcode == null){
// throw new ValidateException("error.barcode.noValidCode",new String[]{codeBeans.size()+"",codeStr}, "无效的条码");
// }
// return barcode;
// }
//
// /**
// * 出库方式
// */
// public StorageConstants.CHECKOUT_TYPE getCheckOutType(){
// String outType = getSettings().getOutType();
// return StorageConstants.CHECKOUT_TYPE.valueOf(outType);
// }
//
// public Settings updateSettings(Settings newSetting){
// settings = settingsDao.save(newSetting);
// List<String> ruleItems = settings.getCodeRuleList();
// barcodeRuleList = Lists.newArrayList();
// for(String codeRule : ruleItems){
// if(!Strings.isNullOrEmpty(codeRule)){
// barcodeRuleList.add(BarcodeRule.newRule(codeRule));
// }
// }
// needUpdateHumidityMap = new ConcurrentHashMap<>();
// return settings;
// }
// public List<String> getCids(){
// List<String> cids = new ArrayList<>();
// for (Storage storage : getAllStorage().values()){
// cids.add(storage.getCid());
// }
// return cids;
// }
//
// public Storage defaultStorage(){
// Map<String, Storage> storages = getAllStorage();
// for (Storage storage : storages.values()){
// if(!storage.isVirtual()){
// return storage;
// }
// }
// return null;
// }
//
// public String defaultStorageCid(){
// Storage storage = defaultStorage();
// if(storage != null){
// return storage.getCid();
// }
// return "";
// }
//
// /**
// * 获取某个区域默认的虚拟仓
// */
// public Storage defaultVirtualStorage(String areaId){
// Map<String, Storage> storages = getAllStorage();
// for (Storage storage : storages.values()){
// return storage;
// }
// return null;
// }
// /**
// * 库存 map, key 为 cid,value 为料盘存量 map(key为 PartNumber,value 为 库存数量及盘数的Bean)
// */
// private static Map<String,Map<String,InventoryItem>> inventoryMap = new ConcurrentHashMap<>();
//
//
//
// /**
// * 所有的料仓 key 为 cid, value 为 Storage
// */
// private static Map<String, Storage> allStorage = new ConcurrentHashMap<>();
//
//
// /**
// * 某个区域需要进行清理呆滞物料的所有料仓(虚拟仓应该不需要清理的)
// */
// public List<String> needClearInactionStorageIds(){
// Collection<Storage> allStorage = getAllStorage().values();
// List<String> storageIds = Lists.newArrayList();
// for (Storage storage : allStorage){
// //if(storage.isLine() && storage.getAreaId().equals(areaId)){
// storageIds.add(storage.getId());
// //}
// }
// return storageIds;
// }
//
// public Map<String, Storage> getAllStorage(){
// if(allStorage.isEmpty()){
// synchronized (allStorage){
// if(allStorage.isEmpty()){
// List<Storage> all = storageManager.findAll();
// if(all != null){
// Map<String, Storage> map = new ConcurrentHashMap<>();
// for(Storage storage : all){
//
// List<PlateSizeBean> plateSizeBeanList = storagePosManager.getStoragePosUsage(storage.getId());
// storage.initUsage(plateSizeBeanList);
//
// map.put(storage.getCid(), storage);
//
//
// }
// allStorage = map;
// log.info("加载所有料仓["+all.size()+"]信息到缓存");
// }
// }
// }
// }
// return allStorage;
// }
//
//
// /**
// * 获取某区域可以放入该尺寸料盘的所有料仓名称
// */
// public List<String> getCanPutInStorages(String areaId, int w, int h){
// List<String> storageList = Lists.newArrayList();
// for(Storage storage : getAllStorage().values()){
// storageList.add(storage.getName());
// }
// return storageList;
// }
//
// /**
// * 根据 cid 获取料仓信息
// */
// public Storage getStorage(String cid){
// if(Strings.isNullOrEmpty(cid)){
// return null;
// }
// return getAllStorage().get(cid);
// }
//
// /**
// * 根据 Id 获取料仓信息
// */
// public Storage getStorageById(String storageId){
// for(Storage storage : getAllStorage().values()){
// if(storage.getId().equals(storageId)){
// return storage;
// }
// }
// return null;
// }
//
// public Storage reloadStorage(Storage storage) throws ValidateException {
// List<PlateSizeBean> plateSizeBeanList = storagePosManager.getStoragePosUsage(storage.getId());
// storage.initUsage(plateSizeBeanList);
// storage = storageManager.save(storage);
// allStorage.put(storage.getCid(), storage);
// return storage;
// }
//
//
// /**
// * 锁定库存
// * @param cid
// * @param partNumber 物料编号
// * @return 锁定结果,true 表示有足够的库存,锁定成功;false表示库存不足,锁定失败
// */
// public boolean lockOneReel(String cid, String partNumber){
// boolean result = false;
// InventoryItem inventoryItem = getStorageInventoryByPartNumber(cid, partNumber);
// if(inventoryItem != null) {
// int lockReel = inventoryItem.getLockReel();
// //理论上这里是同一个对象,不需要再显式的放入map 中
// result = inventoryItem.lockOne();
// log.info("锁定料仓["+cid+"]物料["+partNumber+"],锁定数量["+lockReel+"]=>["+inventoryItem.getLockReel()+"],当前库存:"+inventoryItem.getStockReel());
// updateStorageInventory(cid,inventoryItem);
// }
// return result;
// }
// /**
// * 解除锁定库存(出库任务完成或取消时调用)
// */
// public void unLockOneReel(String cid, String partNumber){
// InventoryItem partNumberInventory = getStorageInventoryByPartNumber(cid, partNumber);
// if(partNumberInventory != null) {
// int lockReel = partNumberInventory.getLockReel();
// //理论上这里是同一个对象,不需要再显式的放入map 中
// partNumberInventory.unLock(1);
// log.info("解除锁定料仓["+cid+"]物料["+partNumber+"],锁定数量["+lockReel+"]=>["+partNumberInventory.getLockReel()+"],当前库存:"+partNumberInventory.getStockReel());
// updateStorageInventory(cid,partNumberInventory);
// }
// }
//
// /**
// * 获取库存信息,key 为 PN
// */
// public Map<String,InventoryItem> getAllInventory(){
// Map<String, Storage> allStorages = getAllStorage();
// return getInventory(allStorages.values());
// }
//
// /**
// * 获取某些料仓的库存信息
// */
// public Map<String,InventoryItem> getInventory(Collection<Storage> storageList){
// Map<String,InventoryItem> resultMap = Maps.newHashMap();
// for (Storage storage : storageList) {
// Map<String, InventoryItem> storageInventory = getStorageInventory(storage.getCid());
// for(InventoryItem storageInventoryItem : storageInventory.values()){
// String partNumber = storageInventoryItem.getPartNumber();
// InventoryItem pnInventoryItem = resultMap.get(storageInventoryItem.getPartNumber());
// if(pnInventoryItem == null){
// pnInventoryItem = new InventoryItem();
// }
// pnInventoryItem.setPartNumber(partNumber);
// pnInventoryItem.setStockCount(pnInventoryItem.getStockCount() + storageInventoryItem.getStockCount());
// pnInventoryItem.setLockCount(pnInventoryItem.getLockCount() + storageInventoryItem.getLockCount());
// pnInventoryItem.setStockReel(pnInventoryItem.getStockReel() + storageInventoryItem.getStockReel());
// pnInventoryItem.setLockReel(pnInventoryItem.getLockReel() + storageInventoryItem.getLockReel());
// resultMap.put(partNumber,pnInventoryItem);
// }
// }
// return resultMap;
// }
//
// /**
// * 获取料仓的库存信息
// */
// public Map<String, InventoryItem> getStorageInventory(String cid){
// Map<String, InventoryItem> storageInventory = inventoryMap.get(cid);
// if(storageInventory == null){
// storageInventory = initInventory(cid);
// }
// return storageInventory;
// }
//
//
// public InventoryItem getStorageInventoryByPartNumber(String cid, String partNumber){
// Map<String, InventoryItem> storageInventory = getStorageInventory(cid);
// InventoryItem partNumberInventoryItem = storageInventory.get(partNumber);
// if(partNumberInventoryItem == null){
// partNumberInventoryItem = new InventoryItem();
// partNumberInventoryItem.setPartNumber(partNumber);
// }
// return partNumberInventoryItem;
// }
//
// private synchronized Map<String, InventoryItem> initInventory(String cid){
// Storage storage = getStorage(cid);
// Map<String, InventoryItem> storageInventoryMap = storagePosManager.getInventory(storage.getId());
// //未完成的 Task 也需要锁定
// List<InventoryItem> feederLockInventories = dataLogDao.getStorageLockCount(storage.getId());
//
// for (InventoryItem feederInventoryItem : feederLockInventories){
// String partNumber = feederInventoryItem.getPartNumber();
// if(!Strings.isNullOrEmpty(partNumber)){
// InventoryItem inventoryItem = storageInventoryMap.get(partNumber);
// if(inventoryItem != null){
// int lockReel = inventoryItem.getLockReel() + feederInventoryItem.getLockReel();
// inventoryItem.setLockReel(lockReel);
// storageInventoryMap.put(partNumber, inventoryItem);
// }
// }
// }
//
// log.info("初始化料仓["+cid+"]的库存信息["+storageInventoryMap.size()+"]条");
// inventoryMap.put(cid, storageInventoryMap);
// return storageInventoryMap;
// }
//
// /**
// * 手动修改数量的时候更新库存
// * @param cid
// * @param partNumber
// * @param amount
// * @return
// */
// public int updateInventoryAmount(String cid,String partNumber,int amount){
// if(amount != 0){
// InventoryItem inventoryItem = getStorageInventoryByPartNumber(cid,partNumber);
// if(inventoryItem == null){
// inventoryItem = new InventoryItem();
// inventoryItem.setPartNumber(partNumber);
// }
// inventoryItem.updateInventory(amount);
// updateStorageInventory(cid, inventoryItem);
// return inventoryItem.getStockReel();
// }
// return -1;
// }
//
// /**
// * 修改库存,出库为负,入库为正
// */
// public int updateInventory(StoragePos pos, Barcode barcode){
// Storage storage = getStorageById(pos.getStorageId());
//
// String cid = storage.getCid();
// String partNumber = barcode.getPartNumber();
// int amount = 0;
// String sizeStr = pos.getSizeStr();
// if(pos.getBarcode() == null){
// //出库
// amount = - barcode.getAmount();
// storage.emptyOnePos(pos);
// }else{
// //入库
// amount = barcode.getAmount();
// storage.useOnePos(pos);
// }
// allStorage.put(cid, storage);
// return updateInventoryAmount(cid,partNumber,amount);
// }
//
// private void updateStorageInventory(String cid, InventoryItem inventoryItem){
// Map<String, InventoryItem> storageInventory = inventoryMap.get(cid);
// storageInventory.put(inventoryItem.getPartNumber(), inventoryItem);
// inventoryMap.put(cid, storageInventory);
// }
//
// public Map<String,String> allBoxNameMap(){
// Map<String, String> allBoxMap = Maps.newHashMap();
// for (Storage storage : getAllStorage().values()){
// if(storage.getBoxCount() > 1){
// for (int i=1;i<=storage.getBoxCount();i++){
// allBoxMap.put(storage.getCid()+"-"+i, storage.getName() + " BOX-" + i);
// }
// }else{
// allBoxMap.put(storage.getCid()+"-i", storage.getName());
// }
// }
// return allBoxMap;
// }
}
...@@ -6,7 +6,7 @@ import org.springframework.stereotype.Service; ...@@ -6,7 +6,7 @@ import org.springframework.stereotype.Service;
* Created by sunke on 2021/7/12. * Created by sunke on 2021/7/12.
*/ */
@Service @Service
public class ApiListener implements IDeviceListener { public class ApiListener implements ITaskListener {
@Override @Override
public String onScanCode(String codeStr) { public String onScanCode(String codeStr) {
......
package com.neotel.smfcore.core.listener; package com.neotel.smfcore.core.listener;
import com.neotel.smfcore.core.service.po.DataLog;
/** /**
* Created by sunke on 2021/7/12. * Created by sunke on 2021/7/12.
*/ */
public interface IDeviceListener { public interface ITaskListener {
String onScanCode(String codeStr); String onTaskStatusChange(DataLog task);
} }
...@@ -6,7 +6,7 @@ import org.springframework.stereotype.Service; ...@@ -6,7 +6,7 @@ import org.springframework.stereotype.Service;
* Created by sunke on 2021/7/12. * Created by sunke on 2021/7/12.
*/ */
@Service @Service
public class LiteOrderListener implements IDeviceListener { public class LiteOrderListener implements ITaskListener {
@Override @Override
public String onScanCode(String codeStr) { public String onScanCode(String codeStr) {
......
package com.neotel.smfcore.core.rest; package com.neotel.smfcore.core.rest;
import com.neotel.smfcore.core.device.IDeviceHandler; import com.google.common.collect.Maps;
import com.neotel.smfcore.core.listener.IDeviceListener; import com.neotel.smfcore.core.listener.ITaskListener;
import com.neotel.smfcore.core.service.po.DataLog;
import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* Created by sunke on 2021/7/13. * Created by sunke on 2021/7/13.
*/ */
@Service
public class TaskService { public class TaskService {
private List<IDeviceListener> listenerList = new ArrayList<>(); private List<ITaskListener> taskListenerList = new ArrayList<>();
private Map<String, IDeviceHandler> handlerMap = new HashMap<>(); /**
* 任务队列,Key 为dataLog的ID,value 为本区域待执行的任务
*/
private static Map<String, DataLog> taskMap = Maps.newConcurrentMap();
public TaskService(List<IDeviceHandler> deviceHandlerList, List<IDeviceListener> deviceListenerList){ /**
* 完成的任务列表Key 为dataLog的ID, Value 为 Datalog
*/
private static Map<String,DataLog> theFinishedTaskMap = Maps.newConcurrentMap();
for (IDeviceHandler deviceHandler : deviceHandlerList) { public TaskService(List<ITaskListener> deviceListenerList){
for (ITaskListener deviceListener: deviceListenerList) {
} taskListenerList.add(deviceListener);
for (IDeviceListener deviceListener: deviceListenerList) {
listenerList.add(deviceListener);
} }
} }
} }
package com.neotel.smfcore.security.service.dao; package com.neotel.smfcore.core.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
......
package com.neotel.smfcore.security.service.dao; package com.neotel.smfcore.core.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
......
package com.neotel.smfcore.security.service.dao; package com.neotel.smfcore.core.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
......
package com.neotel.smfcore.security.service.dao; package com.neotel.smfcore.core.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
......
package com.neotel.smfcore.security.service.dao; package com.neotel.smfcore.core.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
import com.neotel.smfcore.security.service.po.LiteOrderItem; import com.neotel.smfcore.core.service.po.LiteOrderItem;
import java.util.List; import java.util.List;
......
package com.neotel.smfcore.security.service.dao; package com.neotel.smfcore.core.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
import com.neotel.smfcore.security.service.po.Maintenance; import com.neotel.smfcore.core.service.po.Maintenance;
public interface IMaintenanceDao extends IBaseDao { public interface IMaintenanceDao extends IBaseDao {
Maintenance findByCid(String cid); Maintenance findByCid(String cid);
......
package com.neotel.smfcore.security.service.dao; package com.neotel.smfcore.core.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
......
package com.neotel.smfcore.security.service.dao; package com.neotel.smfcore.core.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
......
package com.neotel.smfcore.security.service.dao; package com.neotel.smfcore.core.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
......
package com.neotel.smfcore.security.service.dao.impl; package com.neotel.smfcore.core.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao; import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.security.service.dao.IAlarmInfoDao; import com.neotel.smfcore.core.service.dao.IAlarmInfoDao;
import com.neotel.smfcore.security.service.po.AlarmInfo; import com.neotel.smfcore.core.service.po.AlarmInfo;
public class AlarmInfoDaoImpl extends AbstractBaseDao implements IAlarmInfoDao { public class AlarmInfoDaoImpl extends AbstractBaseDao implements IAlarmInfoDao {
@Override @Override
......
package com.neotel.smfcore.security.service.dao.impl; package com.neotel.smfcore.core.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao; import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.security.service.dao.IDataLogDao; import com.neotel.smfcore.core.service.dao.IDataLogDao;
import com.neotel.smfcore.security.service.po.DataLog; import com.neotel.smfcore.core.service.po.DataLog;
import org.springframework.stereotype.Service;
@Service
public class DataLogDaoImpl extends AbstractBaseDao implements IDataLogDao { public class DataLogDaoImpl extends AbstractBaseDao implements IDataLogDao {
@Override @Override
public Class getEntityClass() { public Class getEntityClass() {
......
package com.neotel.smfcore.security.service.dao.impl; package com.neotel.smfcore.core.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao; import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.security.service.dao.IHumitureDao; import com.neotel.smfcore.core.service.dao.IHumitureDao;
import com.neotel.smfcore.security.service.po.Humiture; import com.neotel.smfcore.core.service.po.Humiture;
public class HumitureDaoImpl extends AbstractBaseDao implements IHumitureDao { public class HumitureDaoImpl extends AbstractBaseDao implements IHumitureDao {
@Override @Override
......
package com.neotel.smfcore.security.service.dao.impl; package com.neotel.smfcore.core.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao; import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.security.service.dao.ILiteOrderDao; import com.neotel.smfcore.core.service.dao.ILiteOrderDao;
import com.neotel.smfcore.security.service.po.LiteOrder; import com.neotel.smfcore.core.service.po.LiteOrder;
public class LiteOrderDaoImpl extends AbstractBaseDao implements ILiteOrderDao { public class LiteOrderDaoImpl extends AbstractBaseDao implements ILiteOrderDao {
@Override @Override
......
package com.neotel.smfcore.security.service.dao.impl; package com.neotel.smfcore.core.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao; import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.security.service.dao.ILiteOrderItemDao; import com.neotel.smfcore.core.service.dao.ILiteOrderItemDao;
import com.neotel.smfcore.security.service.po.LiteOrderItem; import com.neotel.smfcore.core.service.po.LiteOrderItem;
import java.util.List; import java.util.List;
......
package com.neotel.smfcore.security.service.dao.impl; package com.neotel.smfcore.core.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao; import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.security.service.dao.IMaintenanceDao; import com.neotel.smfcore.core.service.dao.IMaintenanceDao;
import com.neotel.smfcore.security.service.po.Maintenance; import com.neotel.smfcore.core.service.po.Maintenance;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
......
package com.neotel.smfcore.security.service.dao.impl; package com.neotel.smfcore.core.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao; import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.security.service.dao.ISettingsDao; import com.neotel.smfcore.core.service.dao.ISettingsDao;
import com.neotel.smfcore.security.service.po.Settings; import com.neotel.smfcore.core.service.po.Settings;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
......
package com.neotel.smfcore.security.service.dao.impl; package com.neotel.smfcore.core.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao; import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.security.service.dao.IStorageDao; import com.neotel.smfcore.core.service.dao.IStorageDao;
import com.neotel.smfcore.security.service.po.Storage; import com.neotel.smfcore.core.service.po.Storage;
import org.springframework.stereotype.Service;
@Service
public class StorageDaoImpl extends AbstractBaseDao implements IStorageDao { public class StorageDaoImpl extends AbstractBaseDao implements IStorageDao {
@Override @Override
public Class getEntityClass() { public Class getEntityClass() {
......
package com.neotel.smfcore.security.service.po.data; package com.neotel.smfcore.core.service.data;
import lombok.Data; import lombok.Data;
......
package com.neotel.smfcore.security.service.po.data; package com.neotel.smfcore.core.service.data;
import com.neotel.smfcore.common.utils.StorageConstants; import com.neotel.smfcore.common.utils.StorageConstants;
import lombok.Data; import lombok.Data;
......
package com.neotel.smfcore.security.service.po.data; package com.neotel.smfcore.core.service.data;
import com.neotel.smfcore.common.utils.PLATE_SIZE; import com.neotel.smfcore.common.utils.PLATE_SIZE;
import lombok.Getter; import lombok.Getter;
......
package com.neotel.smfcore.security.service.po.data; package com.neotel.smfcore.core.service.data;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import lombok.Data; import lombok.Data;
......
package com.neotel.smfcore.security.service.po.data; package com.neotel.smfcore.core.service.data;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import lombok.Data; import lombok.Data;
......
package com.neotel.smfcore.security.service.po.data; package com.neotel.smfcore.core.service.data;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.StorageConstants; import com.neotel.smfcore.common.utils.StorageConstants;
......
package com.neotel.smfcore.security.service.po.data; package com.neotel.smfcore.core.service.data;
import lombok.Data; import lombok.Data;
......
package com.neotel.smfcore.core.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.service.po.DataLog;
public interface IDataLogManager extends IBaseManager<DataLog> {
}
package com.neotel.smfcore.security.service.manager; package com.neotel.smfcore.core.service.manager;
import com.neotel.smfcore.common.base.IBaseManager; import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.security.service.po.Humiture; import com.neotel.smfcore.core.service.po.Humiture;
public interface IHumitureManager extends IBaseManager<Humiture> { public interface IHumitureManager extends IBaseManager<Humiture> {
} }
package com.neotel.smfcore.security.service.manager; package com.neotel.smfcore.core.service.manager;
import com.neotel.smfcore.common.base.IBaseManager; import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.security.service.po.Storage; import com.neotel.smfcore.core.service.po.Storage;
import java.util.List;
public interface IStorageManager extends IBaseManager<Storage> { public interface IStorageManager extends IBaseManager<Storage> {
List<Storage> findAll();
} }
package com.neotel.smfcore.security.service.manager; package com.neotel.smfcore.core.service.manager;
import com.neotel.smfcore.common.base.IBaseManager; import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.security.service.po.StoragePos; import com.neotel.smfcore.core.service.po.StoragePos;
public interface IStoragePosManager extends IBaseManager<StoragePos> { public interface IStoragePosManager extends IBaseManager<StoragePos> {
} }
package com.neotel.smfcore.security.service.manager.impl; package com.neotel.smfcore.core.service.manager.impl;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.security.service.manager.IStorageManager; import com.neotel.smfcore.core.service.manager.IDataLogManager;
import com.neotel.smfcore.security.service.po.Storage; import com.neotel.smfcore.core.service.po.DataLog;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
public class StorageManagerImpl implements IStorageManager { @Service
public class DataLogManagerImpl implements IDataLogManager {
@Override @Override
public Storage get(String id) { public DataLog get(String id) {
return null; return null;
} }
@Override @Override
public Storage save(Storage object) throws ValidateException { public DataLog save(DataLog object) throws ValidateException {
return null; return null;
} }
@Override @Override
public void delete(Storage object) throws ValidateException { public void delete(DataLog object) throws ValidateException {
} }
@Override @Override
public List<Storage> findByPage(Query query, Pageable pageable) { public List<DataLog> findByPage(Query query, Pageable pageable) {
return null; return null;
} }
@Override @Override
public List<Storage> findByQuery(Query query) { public List<DataLog> findByQuery(Query query) {
return null; return null;
} }
} }
package com.neotel.smfcore.security.service.manager.impl; package com.neotel.smfcore.core.service.manager.impl;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.security.service.manager.IHumitureManager; import com.neotel.smfcore.core.service.manager.IHumitureManager;
import com.neotel.smfcore.security.service.po.Humiture; import com.neotel.smfcore.core.service.po.Humiture;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
......
package com.neotel.smfcore.core.service.manager.impl;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.service.dao.IStorageDao;
import com.neotel.smfcore.core.service.manager.IStorageManager;
import com.neotel.smfcore.core.service.po.Storage;
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 StorageManagerImpl implements IStorageManager {
@Autowired
private IStorageDao storageDao;
@Override
public Storage get(String id) {
return storageDao.findOneById(id);
}
@Override
public Storage save(Storage object) throws ValidateException {
return storageDao.save(object);
}
@Override
public void delete(Storage object) throws ValidateException {
}
@Override
public List<Storage> findByPage(Query query, Pageable pageable) {
return storageDao.findByQuery(query,pageable);
}
@Override
public List<Storage> findByQuery(Query query) {
return storageDao.findByQuery(query);
}
@Override
public List<Storage> findAll(){
return storageDao.findAll();
}
}
package com.neotel.smfcore.security.service.manager.impl; package com.neotel.smfcore.core.service.manager.impl;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.security.service.manager.IStoragePosManager; import com.neotel.smfcore.core.service.manager.IStoragePosManager;
import com.neotel.smfcore.security.service.po.StoragePos; import com.neotel.smfcore.core.service.po.StoragePos;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
......
package com.neotel.smfcore.security.service.po; package com.neotel.smfcore.core.service.po;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.StorageConstants;
import lombok.Data; import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
...@@ -46,4 +47,12 @@ public class AlarmInfo extends BasePo implements Serializable { ...@@ -46,4 +47,12 @@ public class AlarmInfo extends BasePo implements Serializable {
* 结束时间 * 结束时间
*/ */
private Date endTime; private Date endTime;
public String getAlarmTypeMsg(){
return StorageConstants.ALARM_TYPE_MSG.getMsg(alarmType,alarmDetail);
}
public String getKey(){
return storageName + "-"+ boxId + "-" + alarmType+"-" + alarmDetail;
}
} }
package com.neotel.smfcore.security.service.po; package com.neotel.smfcore.core.service.po;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
......
package com.neotel.smfcore.security.service.po; package com.neotel.smfcore.core.service.po;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import lombok.Data; import lombok.Data;
......
package com.neotel.smfcore.security.service.po; package com.neotel.smfcore.core.service.po;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.StorageConstants; import com.neotel.smfcore.common.utils.StorageConstants;
......
package com.neotel.smfcore.security.service.po; package com.neotel.smfcore.core.service.po;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import lombok.Data; import lombok.Data;
......
package com.neotel.smfcore.security.service.po; package com.neotel.smfcore.core.service.po;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.DateUtil; import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.security.service.po.data.DeviceStatusBean; import com.neotel.smfcore.core.service.data.DeviceStatusBean;
import lombok.Data; import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
......
package com.neotel.smfcore.security.service.po; package com.neotel.smfcore.core.service.po;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
......
package com.neotel.smfcore.security.service.po; package com.neotel.smfcore.core.service.po;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.StorageConstants; import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.security.service.po.data.PlateSizeBean; import com.neotel.smfcore.core.service.data.PlateSizeBean;
import com.neotel.smfcore.security.service.po.data.UsageItem; import com.neotel.smfcore.core.service.data.UsageItem;
import com.sun.istack.internal.NotNull; import com.sun.istack.internal.NotNull;
import lombok.Data; import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
......
package com.neotel.smfcore.security.service.po; package com.neotel.smfcore.core.service.po;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package com.neotel.smfcore.common.annotation.security; package com.neotel.smfcore.security.annotation;
import java.lang.annotation.*; import java.lang.annotation.*;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.neotel.smfcore.common.annotation.security; package com.neotel.smfcore.security.annotation;
import org.springframework.core.annotation.AliasFor; import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.neotel.smfcore.common.annotation.security; package com.neotel.smfcore.security.annotation;
import org.springframework.core.annotation.AliasFor; import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.neotel.smfcore.common.annotation.security; package com.neotel.smfcore.security.annotation;
import org.springframework.core.annotation.AliasFor; import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.neotel.smfcore.common.annotation.security; package com.neotel.smfcore.security.annotation;
import org.springframework.core.annotation.AliasFor; import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.neotel.smfcore.common.annotation.security; package com.neotel.smfcore.security.annotation;
import org.springframework.core.annotation.AliasFor; import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
*/ */
package com.neotel.smfcore.security.config; package com.neotel.smfcore.security.config;
import com.neotel.smfcore.common.annotation.security.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.common.enums.RequestMethodEnum; import com.neotel.smfcore.common.enums.RequestMethodEnum;
import com.neotel.smfcore.security.JwtAccessDeniedHandler; import com.neotel.smfcore.security.JwtAccessDeniedHandler;
import com.neotel.smfcore.security.JwtAuthenticationEntryPoint; import com.neotel.smfcore.security.JwtAuthenticationEntryPoint;
......
...@@ -15,9 +15,9 @@ ...@@ -15,9 +15,9 @@
*/ */
package com.neotel.smfcore.security.rest; package com.neotel.smfcore.security.rest;
import com.neotel.smfcore.common.annotation.security.AnonymousDeleteMapping; import com.neotel.smfcore.security.annotation.AnonymousDeleteMapping;
import com.neotel.smfcore.common.annotation.security.AnonymousGetMapping; import com.neotel.smfcore.security.annotation.AnonymousGetMapping;
import com.neotel.smfcore.common.annotation.security.AnonymousPostMapping; import com.neotel.smfcore.security.annotation.AnonymousPostMapping;
import com.neotel.smfcore.common.utils.EncryptUtils; import com.neotel.smfcore.common.utils.EncryptUtils;
import com.neotel.smfcore.common.utils.StringUtils; import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.security.bean.RsaProperties; import com.neotel.smfcore.security.bean.RsaProperties;
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!