Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit b5bbc12e
由
sunke
编写于
2021-08-16 11:18:27 +0800
浏览文件
选项
浏览文件
标签
下载
差异文件
Merge remote-tracking branch 'origin/master'
2 个父辈
c56351d1
572aa503
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
216 行增加
和
28 行删除
src/main/java/com/neotel/smfcore/common/exception/handler/GlobalExceptionHandler.java
src/main/java/com/neotel/smfcore/core/device/bean/StatusBean.java
src/main/java/com/neotel/smfcore/core/device/handler/impl/BaseDeviceHandler.java
src/main/java/com/neotel/smfcore/core/device/handler/impl/SisoBoxHandler.java
src/main/java/com/neotel/smfcore/core/storage/enums/DeviceType.java
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
src/main/resources/messages_ja_JP.properties
src/main/java/com/neotel/smfcore/common/exception/handler/GlobalExceptionHandler.java
查看文件 @
b5bbc12
...
@@ -83,10 +83,10 @@ public class GlobalExceptionHandler {
...
@@ -83,10 +83,10 @@ public class GlobalExceptionHandler {
@ExceptionHandler
(
value
=
ValidateException
.
class
)
@ExceptionHandler
(
value
=
ValidateException
.
class
)
public
ResponseEntity
<
ApiError
>
validateException
(
HttpServletRequest
servlet
,
ValidateException
e
){
public
ResponseEntity
<
ApiError
>
validateException
(
HttpServletRequest
servlet
,
ValidateException
e
){
String
language
=
servlet
.
getLocale
().
getLanguage
();
//
String language= servlet.getLocale().getLanguage();
// 打印堆栈信息
// 打印堆栈信息
//log.error(ThrowableUtil.getStackTrace(e));
//log.error(ThrowableUtil.getStackTrace(e));
String
targetMsg
=
messageUtils
.
getText
(
e
.
getMsgKey
(),
e
.
getMsgParam
(),
new
Locale
(
language
)
,
e
.
getDefaultMsg
());
String
targetMsg
=
messageUtils
.
getText
(
e
.
getMsgKey
(),
e
.
getMsgParam
(),
servlet
.
getLocale
(
)
,
e
.
getDefaultMsg
());
return
buildResponseEntity
(
ApiError
.
error
(
e
.
getStatus
(),
targetMsg
));
return
buildResponseEntity
(
ApiError
.
error
(
e
.
getStatus
(),
targetMsg
));
}
}
...
...
src/main/java/com/neotel/smfcore/core/device/bean/StatusBean.java
查看文件 @
b5bbc12
...
@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.device.bean;
...
@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.device.bean;
import
com.google.common.base.Strings
;
import
com.google.common.base.Strings
;
import
com.neotel.smfcore.core.device.enums.BOX_STATUS
;
import
com.neotel.smfcore.core.device.enums.BOX_STATUS
;
import
com.neotel.smfcore.core.system.service.po.AlarmInfo
;
import
com.neotel.smfcore.core.system.service.po.AlarmInfo
;
import
lombok.ToString
;
import
java.util.*
;
import
java.util.*
;
...
@@ -14,6 +15,7 @@ import java.util.*;
...
@@ -14,6 +15,7 @@ import java.util.*;
3,IO报警,信号超时,io电器定义(电器定义),
3,IO报警,信号超时,io电器定义(电器定义),
4,电钢报警,1=上下电钢,
4,电钢报警,1=上下电钢,
*/
*/
@ToString
public
class
StatusBean
{
public
class
StatusBean
{
/// <summary>
/// <summary>
...
...
src/main/java/com/neotel/smfcore/core/device/handler/impl/BaseDeviceHandler.java
查看文件 @
b5bbc12
...
@@ -465,23 +465,24 @@ public class BaseDeviceHandler implements IDeviceHandler {
...
@@ -465,23 +465,24 @@ public class BaseDeviceHandler implements IDeviceHandler {
}
}
protected
StatusBean
handleInOutFinished
(
StatusBean
statusBean
)
{
protected
StatusBean
handleInOutFinished
(
StatusBean
statusBean
)
{
// Map<Integer, BoxStatusBean> statusOfBoxes = statusBean.getBoxStatus();
Map
<
String
,
BoxStatusBean
>
statusOfBoxes
=
statusBean
.
getBoxStatus
();
// if (statusOfBoxes != null) {
if
(
statusOfBoxes
!=
null
)
{
// for (BoxStatusBean boxStatus : statusOfBoxes.values()) {
for
(
BoxStatusBean
boxStatus
:
statusOfBoxes
.
values
())
{
// try {
try
{
// //出库入库完成处理
//出库入库完成处理
// int status = boxStatus.getStatus();
int
status
=
boxStatus
.
getStatus
();
// String posName = boxStatus.getPosId();
String
posName
=
boxStatus
.
getPosId
();
// if (!Strings.isNullOrEmpty(posName)) {//客户端发一次完成之后,会发空的 posName,不需要处理
if
(!
Strings
.
isNullOrEmpty
(
posName
))
{
//客户端发一次完成之后,会发空的 posName,不需要处理
// if (BOX_STATUS.IN_FINISHED == status) {//入仓完成
if
(
BOX_STATUS
.
IN_FINISHED
==
status
)
{
//入仓完成
// finishedPutIn(statusBean.getCid(),posName);
finishedPutIn
(
statusBean
.
getCid
(),
posName
);
// } else if (BOX_STATUS.IN_FAILED == status) {//入库失败
}
else
if
(
BOX_STATUS
.
IN_FAILED
==
status
)
{
//入库失败
// //暂不处理
//暂不处理
// } else if (BOX_STATUS.OUT_FINISHED == status) {//出仓完成
}
else
if
(
BOX_STATUS
.
OUT_FINISHED
==
status
)
{
//出仓完成
// finishedOutPos(statusBean.getCid(),posName);
finishedOutPos
(
statusBean
.
getCid
(),
posName
);
// } else if (BOX_STATUS.OUT_END == status) {//出库完成(放到仓门口
}
else
if
(
BOX_STATUS
.
OUT_END
==
status
)
{
//出库完成(放到仓门口
// //暂不处理
//暂不处理
// } else if (BOX_STATUS.REWARM_TAKING_END == status) {
}
// else if (BOX_STATUS.REWARM_TAKING_END == status) {
// //回温取料完成, 将库位清空
// //回温取料完成, 将库位清空
// DataLog takingTask = taskService.findExecutingTask(statusBean.getCid(), boxStatus.getPosId());
// DataLog takingTask = taskService.findExecutingTask(statusBean.getCid(), boxStatus.getPosId());
// if (takingTask == null) {
// if (takingTask == null) {
...
@@ -545,12 +546,12 @@ public class BaseDeviceHandler implements IDeviceHandler {
...
@@ -545,12 +546,12 @@ public class BaseDeviceHandler implements IDeviceHandler {
// DataLog mixTask = findExecutingTask(statusBean.getCid(), boxStatus.getPosId());
// DataLog mixTask = findExecutingTask(statusBean.getCid(), boxStatus.getPosId());
// mixEnd(mixTask);
// mixEnd(mixTask);
// }
// }
//
}
}
//
} catch (ValidateException e) {
}
catch
(
ValidateException
e
)
{
//
log.error("更新状态时出错" + e.getMessage());
log
.
error
(
"更新状态时出错"
+
e
.
getMessage
());
//
}
}
//
}
}
//
}
}
return
statusBean
;
return
statusBean
;
}
}
...
@@ -794,9 +795,8 @@ public class BaseDeviceHandler implements IDeviceHandler {
...
@@ -794,9 +795,8 @@ public class BaseDeviceHandler implements IDeviceHandler {
}
}
@Override
@Override
public
DeviceType
getDeviceType
()
{
public
DeviceType
getDeviceType
()
{
return
DeviceType
.
AUTO
;
return
DeviceType
.
DEFAULT
;
}
}
}
}
src/main/java/com/neotel/smfcore/core/device/handler/impl/SisoBoxHandler.java
0 → 100644
查看文件 @
b5bbc12
package
com
.
neotel
.
smfcore
.
core
.
device
.
handler
.
impl
;
import
com.neotel.smfcore.core.device.api.IOpAuthApi
;
import
com.neotel.smfcore.core.device.bean.StatusBean
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.core.storage.enums.DeviceType
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
lombok.ToString
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Service
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.List
;
@Service
@Slf4j
public
class
SisoBoxHandler
extends
BaseDeviceHandler
{
public
SisoBoxHandler
(
List
<
IOpAuthApi
>
apiList
)
{
super
(
apiList
);
}
@Override
public
StatusBean
handleClientRequest
(
StatusBean
statusBean
,
HttpServletRequest
request
)
{
String
cid
=
statusBean
.
getCid
();
Storage
storage
=
dataCache
.
getStorage
(
cid
);
if
(
storage
==
null
)
{
log
.
error
(
"料仓cid: ["
+
cid
+
"]不存在"
);
return
null
;
}
handleMsg
(
statusBean
);
statusBean
=
saveAlarmAndHumidity
(
statusBean
);
statusBean
=
handleInOutFinished
(
statusBean
);
StatusBean
humidityResult
=
handleHumidity
(
statusBean
);
if
(
humidityResult
!=
null
)
{
return
humidityResult
;
}
if
(
statusBean
.
getOp
()
==
OP
.
PUT_IN
)
{
log
.
debug
(
"入库:"
+
statusBean
.
toString
());
statusBean
=
putInLine
(
storage
,
statusBean
);
}
else
{
//查看是否有要出库的操作
statusBean
=
taskService
.
checkOut
(
storage
,
statusBean
);
}
return
statusBean
;
}
@Override
public
DeviceType
getDeviceType
()
{
return
DeviceType
.
AUTO
;
}
}
src/main/java/com/neotel/smfcore/core/storage/enums/DeviceType.java
查看文件 @
b5bbc12
...
@@ -88,8 +88,12 @@ public enum DeviceType {
...
@@ -88,8 +88,12 @@ public enum DeviceType {
/**
/**
* 13 SMD-DUO(DUO料仓)
* 13 SMD-DUO(DUO料仓)
*/
*/
SMD_DUO
(
"storage.type.smdDuo"
)
SMD_DUO
(
"storage.type.smdDuo"
)
,
/**
* 14 (默认料仓)
*/
DEFAULT
(
"storage.type.default"
)
;
;
private
String
key
;
private
String
key
;
...
...
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
查看文件 @
b5bbc12
...
@@ -6,7 +6,9 @@ import com.google.common.collect.Maps;
...
@@ -6,7 +6,9 @@ import com.google.common.collect.Maps;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.utils.SecurityUtils
;
import
com.neotel.smfcore.common.utils.SecurityUtils
;
import
com.neotel.smfcore.common.utils.StorageConstants
;
import
com.neotel.smfcore.common.utils.StorageConstants
;
import
com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.device.bean.StatusBean
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.core.device.enums.OP_STATUS
;
import
com.neotel.smfcore.core.device.enums.OP_STATUS
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
...
@@ -29,6 +31,8 @@ public class TaskService {
...
@@ -29,6 +31,8 @@ public class TaskService {
@Autowired
@Autowired
protected
IDataLogDao
dataLogDao
;
protected
IDataLogDao
dataLogDao
;
@Autowired
protected
IBarcodeManager
barcodeManager
;
@Autowired
@Autowired
private
List
<
ITaskListener
>
taskListenerList
=
new
ArrayList
<>();
private
List
<
ITaskListener
>
taskListenerList
=
new
ArrayList
<>();
...
@@ -249,5 +253,131 @@ public class TaskService {
...
@@ -249,5 +253,131 @@ public class TaskService {
}
}
return
null
;
return
null
;
}
}
/**
* 是否有正在执行的任务
*
* @return
*/
private
boolean
hasExecutingTask
(
String
cid
,
int
type
)
{
for
(
DataLog
task
:
taskMap
.
values
())
{
if
(
type
==
task
.
getType
()
&&
task
.
getCid
().
equals
(
cid
))
{
return
true
;
}
}
return
false
;
}
/**
* 为 box 分配出库任务
*/
private
DataLog
findCheckoutBoxTask
(
Storage
storage
)
{
String
cid
=
storage
.
getCid
();
int
checkoutSize
=
0
;
Collection
<
DataLog
>
allTasks
=
taskMap
.
values
();
for
(
DataLog
task
:
allTasks
)
{
if
(!
task
.
isCheckOutTask
())
{
continue
;
}
//如果该BOX在已执行任务中已经有入库任务,不再分配直接返回
if
(
cid
.
equals
(
task
.
getCid
())
&&
task
.
isExecuting
())
{
if
(
task
.
isPutInTask
())
{
log
.
error
(
"cid["
+
cid
+
"]已有入库任务,不可再分配出库任务"
);
return
null
;
}
else
if
(
task
.
needReSendToClient
()
&&
task
.
isCheckOutTask
())
{
//超过30秒仍未完成的出库再次发送到客户端
log
.
error
(
"cid["
+
cid
+
"]的出库任务["
+
task
.
getPosName
()
+
"]超过60秒仍未完成,重新发送到客户端!"
);
task
.
setUpdateDate
(
new
Date
());
return
task
;
}
//只能同时有两个正在执行的出库任务,如果超过两个不再分配了
if
(
task
.
isCheckOutTask
())
{
checkoutSize
++;
if
(
checkoutSize
>=
2
)
{
//log.error("cid["+cid + "]的BOX["+ boxId+"]的出库任务已经超过2个,不再分配!");
return
null
;
}
}
}
}
//指定紧急单盘出库的优先出库,否则按批量出库处理
DataLog
singleOutTask
=
null
;
DataLog
outTask
=
null
;
for
(
DataLog
task
:
allTasks
)
{
//优先分配单盘任务和没有工单的任务
if
(
cid
.
equals
(
task
.
getCid
())
&&
task
.
isCheckOutTask
()
&&
task
.
isWait
())
{
String
posName
=
task
.
getPosName
();
if
(!
Strings
.
isNullOrEmpty
(
posName
))
{
//有库位号
if
(
task
.
isSingleOut
())
{
//单盘优先出库
if
(
singleOutTask
==
null
||
task
.
getCreateDate
().
before
(
singleOutTask
.
getCreateDate
()))
{
singleOutTask
=
task
;
}
}
else
{
if
(
outTask
==
null
||
task
.
getCreateDate
().
before
(
outTask
.
getCreateDate
()))
{
outTask
=
task
;
}
}
}
}
}
if
(
singleOutTask
!=
null
)
{
log
.
info
(
"分配优先(单盘或无工单)出库任务"
+
singleOutTask
.
getBarcode
()
+
"["
+
singleOutTask
.
getPosName
()
+
"]到 "
+
cid
);
return
singleOutTask
;
}
return
outTask
;
}
/**
* 出库处理
*/
public
StatusBean
checkOut
(
Storage
storage
,
StatusBean
statusBean
)
{
try
{
String
cid
=
storage
.
getCid
();
//有入库任务的料仓不分配出库任务
if
(!
hasExecutingTask
(
cid
,
OP
.
PUT_IN
))
{
DataLog
task
=
findCheckoutBoxTask
(
storage
);
if
(
task
!=
null
)
{
//从等待列表中删除,加入到执行列表中
log
.
info
(
"分配出库任务"
+
task
.
getBarcode
()
+
"["
+
task
.
getPosName
()
+
"]到 "
+
cid
);
task
.
setStatus
(
OP_STATUS
.
EXECUTING
.
name
());
taskMap
.
put
(
task
.
getId
(),
task
);
task
=
dataLogDao
.
save
(
task
);
statusBean
.
setOp
(
OP
.
CHECKOUT
);
String
posName
=
task
.
getPosName
();
Barcode
codeObj
=
barcodeManager
.
findByBarcode
(
task
.
getBarcode
());
int
plateW
=
0
;
int
plateH
=
0
;
//是否是单盘出库,批量上下料使用
boolean
isSingleOut
=
task
.
isSingleOut
();
if
(
codeObj
!=
null
)
{
plateW
=
codeObj
.
getPlateSize
();
plateH
=
codeObj
.
getHeight
();
if
(
codeObj
.
isOnlySingleOut
())
{
log
.
info
(
codeObj
.
getBarcode
()
+
" 只能单盘出库"
);
isSingleOut
=
true
;
}
}
else
{
log
.
warn
(
"出库无料仓位"
+
storage
.
getName
()
+
"["
+
posName
+
"]"
);
}
statusBean
.
addPosInfo
(
task
.
getBarcode
(),
posName
,
plateW
,
plateH
,
isSingleOut
);
log
.
info
(
"出库"
+
storage
.
getName
()
+
"["
+
posName
+
"]物料["
+
task
.
getBarcode
()
+
"]"
+
isSingleOut
+
"发送到客户端"
+
cid
);
}
}
String
posId
=
statusBean
.
getData
().
get
(
"posId"
);
if
(!
Strings
.
isNullOrEmpty
(
posId
))
{
log
.
info
(
"SEQ:"
+
statusBean
.
getSeq
()
+
"出库库位信息:["
+
posId
+
"]发送到客户端"
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"出库出错"
,
e
);
}
return
statusBean
;
}
}
}
src/main/resources/messages_ja_JP.properties
查看文件 @
b5bbc12
此文件的差异被折叠,
点击展开。
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论