Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 11a719d7
由
sunke
编写于
2022-08-09 16:33:55 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
Http请求时添加UTF-8编码
泰治状态修正
1 个父辈
bc987b9c
隐藏空白字符变更
内嵌
并排
正在显示
28 个修改的文件
包含
1082 行增加
和
164 行删除
src/main/java/com/neotel/smfcore/common/bean/ResultBean.java
src/main/java/com/neotel/smfcore/common/init/MainTimer.java
src/main/java/com/neotel/smfcore/common/utils/HttpHelper.java
src/main/java/com/neotel/smfcore/common/utils/JsonUtil.java
src/main/java/com/neotel/smfcore/core/device/bean/StatusBean.java
src/main/java/com/neotel/smfcore/core/device/enums/BOX_STATUS.java
src/main/java/com/neotel/smfcore/core/device/enums/OP_STATUS.java
src/main/java/com/neotel/smfcore/core/device/handler/impl/BaseDeviceHandler.java
src/main/java/com/neotel/smfcore/core/device/handler/impl/NLPShelfHandler.java
src/main/java/com/neotel/smfcore/core/device/handler/impl/RobotBoxHandler.java
src/main/java/com/neotel/smfcore/core/device/util/DataCache.java
src/main/java/com/neotel/smfcore/core/kanban/rest/BoxKanbanController.java
src/main/java/com/neotel/smfcore/core/message/util/DeviceMessageUtil.java
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
src/main/java/com/neotel/smfcore/core/order/service/po/LiteOrder.java
src/main/java/com/neotel/smfcore/core/storage/rest/MaterialController.java
src/main/java/com/neotel/smfcore/core/storage/rest/query/StoragePosFindCriteria.java
src/main/java/com/neotel/smfcore/core/system/api/APIUtil.java
src/main/java/com/neotel/smfcore/core/system/api/DefaultSMFListener.java
src/main/java/com/neotel/smfcore/core/system/api/ISMFListener.java
src/main/java/com/neotel/smfcore/core/system/service/po/DataLog.java
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
src/main/java/com/neotel/smfcore/panacim/PanaApiController.java
src/main/java/com/neotel/smfcore/taizhi/TaiZhiApi.java
src/main/java/com/neotel/smfcore/taizhi/TaiZhiConfig.java
src/main/java/com/neotel/smfcore/taizhi/TaiZhiRestController.java
src/main/resources/config/application-prod.yml
src/main/resources/config/application.yml
src/main/java/com/neotel/smfcore/common/bean/ResultBean.java
查看文件 @
11a719d
...
...
@@ -8,6 +8,7 @@ import lombok.Data;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
org.apache.logging.log4j.util.Strings
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
java.util.Locale
;
...
...
@@ -33,7 +34,9 @@ public class ResultBean<T> {
result
.
setParams
(
params
);
result
.
setMsg
(
MessageUtils
.
getText
(
msgKey
,
params
,
new
Locale
(
SecurityUtils
.
getCurrentUserLanguage
()),
msg
));
if
(
writeLog
)
{
log
.
info
(
result
.
getMsg
());
if
(
Strings
.
isNotBlank
(
result
.
getMsg
())){
log
.
info
(
result
.
getMsg
());
}
}
return
result
;
}
...
...
src/main/java/com/neotel/smfcore/common/init/MainTimer.java
查看文件 @
11a719d
...
...
@@ -45,13 +45,21 @@ public class MainTimer {
log
.
info
(
"开始加载未完成的任务..."
);
List
<
DataLog
>
unExecuteTasks
=
dataLogManager
.
findUnFinishedTasks
();
for
(
DataLog
unExecuteTask
:
unExecuteTasks
)
{
if
(
unExecuteTask
.
isExecuting
()
||
unExecuteTask
.
isWait
())
{
try
{
try
{
if
(
unExecuteTask
.
isPutInTask
()){
//入库
taskService
.
addTaskToExecute
(
unExecuteTask
);
}
catch
(
Exception
e
){
log
.
error
(
"初始化任务["
+
unExecuteTask
+
"]出错:"
+
e
);
}
else
{
if
(
unExecuteTask
.
isWait
()
||
unExecuteTask
.
isExecuting
()){
taskService
.
addTaskToExecute
(
unExecuteTask
);
}
else
{
taskService
.
updateFinishedTask
(
unExecuteTask
);
}
}
}
catch
(
Exception
e
){
log
.
error
(
"初始化任务["
+
unExecuteTask
+
"]出错:"
+
e
);
}
}
log
.
info
(
"加载未完成的任务完成,共["
+
unExecuteTasks
.
size
()
+
"]条数据..."
);
}
...
...
src/main/java/com/neotel/smfcore/common/utils/HttpHelper.java
查看文件 @
11a719d
...
...
@@ -38,10 +38,10 @@ public class HttpHelper {
ObjectMapper
mapper
=
new
ObjectMapper
();
try
{
String
requestBody
=
mapper
.
writeValueAsString
(
params
);
httpPost
.
setEntity
(
new
StringEntity
(
requestBody
));
httpPost
.
setEntity
(
new
StringEntity
(
requestBody
,
"utf-8"
));
}
catch
(
JsonProcessingException
e
)
{
throw
new
ApiException
(
"Request params to ["
+
url
+
"] failed:"
+
e
.
getMessage
());
}
catch
(
UnsupportedEncoding
Exception
e
)
{
}
catch
(
Exception
e
)
{
throw
new
ApiException
(
"Request params to ["
+
url
+
"] failed:"
+
e
.
getMessage
());
}
}
...
...
src/main/java/com/neotel/smfcore/common/utils/JsonUtil.java
0 → 100644
查看文件 @
11a719d
package
com
.
neotel
.
smfcore
.
common
.
utils
;
import
com.fasterxml.jackson.databind.DeserializationFeature
;
import
com.fasterxml.jackson.databind.JavaType
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
lombok.extern.slf4j.Slf4j
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
@Slf4j
public
class
JsonUtil
{
// 定义jackson对象
private
static
final
ObjectMapper
MAPPER
=
new
ObjectMapper
();
static
{
MAPPER
.
configure
(
DeserializationFeature
.
FAIL_ON_UNKNOWN_PROPERTIES
,
false
);
}
/**
* 将对象转换成json字符串。
* <p>Title: pojoToJson</p>
* <p>Description: </p>
* @param data
* @return
*/
public
static
String
toJsonStr
(
Object
data
)
{
try
{
String
string
=
MAPPER
.
writeValueAsString
(
data
);
return
string
;
}
catch
(
Exception
e
)
{
log
.
info
(
"转换JSON字符串出错:"
,
e
);
}
return
null
;
}
/**
* 将json结果集转化为对象
*
* @param jsonStr json数据
* @param beanType 对象中的object类型
* @return
*/
public
static
<
T
>
T
toObj
(
String
jsonStr
,
Class
<
T
>
beanType
)
{
try
{
T
t
=
MAPPER
.
readValue
(
jsonStr
,
beanType
);
return
t
;
}
catch
(
Exception
e
)
{
log
.
info
(
jsonStr
+
"转换对象出错:"
,
e
);
}
return
null
;
}
/**
* 将json数据转换成对象list
* <p>Title: jsonToList</p>
* <p>Description: </p>
* @param jsonStr
* @param beanType
* @return
*/
public
static
<
T
>
List
<
T
>
toList
(
String
jsonStr
,
Class
<
T
>
beanType
)
{
JavaType
javaType
=
MAPPER
.
getTypeFactory
().
constructParametricType
(
List
.
class
,
beanType
);
try
{
List
<
T
>
list
=
MAPPER
.
readValue
(
jsonStr
,
javaType
);
return
list
;
}
catch
(
Exception
e
)
{
log
.
info
(
jsonStr
+
"转换List出错:"
,
e
);
}
return
new
ArrayList
<>();
}
public
static
Map
<
String
,
Object
>
toMap
(
String
jsonStr
){
//JavaType javaType = MAPPER.getTypeFactory().constructParametricType(HashMap.class, String.class, String.class);
try
{
//Map<String, String> map = MAPPER.readValue(jsonStr, javaType);
Map
<
String
,
Object
>
map
=
MAPPER
.
readValue
(
jsonStr
,
Map
.
class
);
return
map
;
}
catch
(
Exception
e
)
{
log
.
info
(
jsonStr
+
"转换Map出错:"
,
e
);
}
return
new
HashMap
<>();
}
}
src/main/java/com/neotel/smfcore/core/device/bean/StatusBean.java
查看文件 @
11a719d
...
...
@@ -414,4 +414,33 @@ public class StatusBean {
}
}
public
int
getTaiZhiStatus
(){
int
taiZhiStatus
=
0
;
if
(
boxStatus
!=
null
){
Collection
<
BoxStatusBean
>
boxList
=
boxStatus
.
values
();
for
(
BoxStatusBean
theBox
:
boxList
)
{
int
theStatus
=
theBox
.
getStatus
();
//设备状态:0:离线;1:空闲;2:急停;3:故障;4:工作中;5:调试中
if
(
theStatus
==
1
){
taiZhiStatus
=
1
;
}
else
if
(
theStatus
==
2
){
taiZhiStatus
=
2
;
}
else
if
(
theStatus
==
3
||
theStatus
==
4
){
taiZhiStatus
=
3
;
}
else
if
(
theStatus
==
5
){
taiZhiStatus
=
5
;
}
else
if
(
theStatus
>=
6
&&
theStatus
<=
11
){
taiZhiStatus
=
4
;
}
break
;
}
}
if
(!
Strings
.
isNullOrEmpty
(
getMsg
())
&&
taiZhiStatus
!=
2
){
taiZhiStatus
=
3
;
}
return
taiZhiStatus
;
}
}
src/main/java/com/neotel/smfcore/core/device/enums/BOX_STATUS.java
查看文件 @
11a719d
...
...
@@ -104,4 +104,9 @@ public class BOX_STATUS {
* 22 搅拌完成放回原来的仓中
*/
public
final
static
int
MIX_END
=
22
;
/**
* 23出库失败(放到料仓门口后,未检测到有料盘)
*/
public
final
static
int
OUT_FAILED
=
23
;
}
src/main/java/com/neotel/smfcore/core/device/enums/OP_STATUS.java
查看文件 @
11a719d
...
...
@@ -35,6 +35,10 @@ public enum OP_STATUS {
*/
END
,
/**
* 已从仓位中取出
*/
OUTBOX
,
/**
* 机器人正在移栽中
*/
INROBOT
,
...
...
src/main/java/com/neotel/smfcore/core/device/handler/impl/BaseDeviceHandler.java
查看文件 @
11a719d
...
...
@@ -43,6 +43,7 @@ import com.neotel.smfcore.core.system.service.po.Humiture;
import
com.neotel.smfcore.core.system.util.DevicesStatusUtil
;
import
com.neotel.smfcore.core.system.util.TaskService
;
import
com.neotel.smfcore.security.service.manager.IGroupManager
;
import
com.neotel.smfcore.taizhi.TaiZhiApi
;
import
lombok.Data
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -224,7 +225,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
}
}
ReelLockPosUtil
.
removeReelLockPosInfo
(
barcodeSave
.
getBarcode
());
//
ReelLockPosUtil.removeReelLockPosInfo(barcodeSave.getBarcode());
return
taskService
.
addPutInTaskToExecute
(
storage
,
barcodeSave
,
storagePos
);
}
}
...
...
@@ -316,7 +317,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
/**
* 从API接口验证条码是否可以入库
*/
p
rotected
Barcode
verifyPutInFromApi
(
Barcode
barcode
)
throws
ValidateException
{
p
ublic
Barcode
verifyPutInFromApi
(
Barcode
barcode
)
throws
ValidateException
{
for
(
IOpAuthApi
opAuthApi
:
opAuthApiList
)
{
Barcode
responseBarcode
=
opAuthApi
.
canPutIn
(
barcode
);
if
(
responseBarcode
!=
null
){
...
...
@@ -498,7 +499,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
updatePosExecuteTime
(
posName
,
executeTime
);
}
log
.
info
(
task
.
getBarcode
()
+
"入仓位["
+
task
.
getPosName
()
+
"]完成,执行时间["
+
executeTime
+
"]秒"
);
ReelLockPosUtil
.
removeReelLockPosInfo
(
task
.
getBarcode
());
//
ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
DataLog
cancelTask
=
taskService
.
findFinishedTask
(
cid
,
posName
);
if
(
cancelTask
!=
null
&&
cancelTask
.
isCancel
())
{
//将相同库位已经取消的任务从完成队列里删除
...
...
@@ -665,7 +666,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
log
.
warn
(
"任务:"
+
task
.
getId
()
+
" 仓位:"
+
task
.
getPosId
()
+
" 的 Barcode 为null, 之前可能处理过,结束任务后直接返回"
);
//记录日志
task
.
setStatus
(
OP_STATUS
.
FINISHED
.
name
());
task
.
setStatus
(
OP_STATUS
.
OUTBOX
.
name
());
taskService
.
updateFinishedTask
(
task
);
return
;
}
...
...
@@ -696,7 +697,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
dataCache
.
updateInventory
(
storagePos
,
barcode
);
//记录日志
task
.
setStatus
(
OP_STATUS
.
FINISHED
.
name
());
task
.
setStatus
(
OP_STATUS
.
OUTBOX
.
name
());
taskService
.
updateFinishedTask
(
task
);
}
...
...
@@ -748,6 +749,9 @@ public class BaseDeviceHandler implements IDeviceHandler {
}
else
{
needSaveToMongo
=
statusBean
.
needSaveToMongo
();
}
if
(
statusBean
.
getTaiZhiStatus
()
!=
statusBeanToSave
.
getTaiZhiStatus
()){
TaiZhiApi
.
deviceStatusChange
(
statusBeanToSave
.
getCid
(),
statusBeanToSave
.
getTaiZhiStatus
());
}
statusBean
.
setTime
(
System
.
currentTimeMillis
());
Map
<
String
,
BoxStatusBean
>
statusOfBoxes
=
statusBeanToSave
.
getBoxStatus
();
...
...
@@ -769,12 +773,14 @@ public class BaseDeviceHandler implements IDeviceHandler {
if
(
statusOfBoxes
!=
null
)
{
for
(
BoxStatusBean
boxStatus
:
statusOfBoxes
.
values
())
{
String
humidity
=
boxStatus
.
getHumidity
();
String
temperature
=
boxStatus
.
getTemperature
();
if
(
needSaveToMongo
)
{
TaiZhiApi
.
tempEnv
(
cid
,
temperature
,
humidity
);
//保存温湿度到数据库
Humiture
humiture
=
new
Humiture
();
humiture
.
setCid
(
cid
);
String
humidity
=
boxStatus
.
getHumidity
();
String
temperature
=
boxStatus
.
getTemperature
();
if
(!
Strings
.
isNullOrEmpty
(
humidity
)
&&
!
Strings
.
isNullOrEmpty
(
temperature
))
{
humiture
.
setHumidity
(
humidity
);
humiture
.
setTemperature
(
temperature
);
...
...
src/main/java/com/neotel/smfcore/core/device/handler/impl/NLPShelfHandler.java
查看文件 @
11a719d
...
...
@@ -178,8 +178,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
}
return
null
;
}
@Override
public
StatusBean
handleClientRequest
(
StatusBean
statusBean
,
HttpServletRequest
request
)
{
statusBean
.
setClientIp
(
request
.
getRemoteHost
());
...
...
src/main/java/com/neotel/smfcore/core/device/handler/impl/RobotBoxHandler.java
查看文件 @
11a719d
...
...
@@ -11,8 +11,11 @@ import com.neotel.smfcore.common.utils.Constants;
import
com.neotel.smfcore.common.utils.ReelLockPosUtil
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.device.api.IOpAuthApi
;
import
com.neotel.smfcore.core.device.bean.BoxStatusBean
;
import
com.neotel.smfcore.core.device.bean.StatusBean
;
import
com.neotel.smfcore.core.device.enums.BOX_STATUS
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.core.device.enums.OP_STATUS
;
import
com.neotel.smfcore.core.message.util.DeviceMessageUtil
;
import
com.neotel.smfcore.core.storage.enums.DeviceType
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
...
...
@@ -54,7 +57,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
statusBean
.
setClientIp
(
request
.
getRemoteHost
());
handleMsg
(
statusBean
);
statusBean
=
saveAlarmAndHumidity
(
statusBean
);
statusBean
=
handle
InOut
Finished
(
statusBean
);
statusBean
=
handleFinished
(
statusBean
);
StatusBean
humidityResult
=
handleHumidity
(
statusBean
);
if
(
humidityResult
!=
null
)
{
return
humidityResult
;
...
...
@@ -63,16 +66,148 @@ public class RobotBoxHandler extends BaseDeviceHandler {
if
(
statusBean
.
getOp
()
==
OP
.
PUT_IN
)
{
log
.
debug
(
"入库:"
+
statusBean
.
toString
());
statusBean
=
putInLine
(
storage
,
statusBean
);
//判断是否有放在门口状态的入库任务
Collection
<
DataLog
>
queueTasks
=
taskService
.
getQueueTasks
();
for
(
DataLog
queueTask
:
queueTasks
)
{
if
(
queueTask
.
getCid
().
equals
(
statusBean
.
getCid
())
&&
queueTask
.
isPutInTask
()
&&
queueTask
.
isBoxdoor
()){
String
posId
=
queueTask
.
getPosName
();
String
reelId
=
queueTask
.
getBarcode
();
Barcode
barcode
=
barcodeManager
.
findByBarcode
(
reelId
);
int
plateW
=
barcode
.
getPlateSize
();
int
plateH
=
barcode
.
getHeight
();
statusBean
.
addPosInfo
(
reelId
,
posId
,
plateW
,
plateH
,
false
);
log
.
info
(
reelId
+
"["
+
plateW
+
"x"
+
plateH
+
"]开始入库到"
+
storage
.
getCid
()
+
"["
+
posId
+
"]"
);
return
statusBean
;
}
}
//statusBean = putInLine(storage, statusBean);
}
else
{
//查看是否有要出库的操作
statusBean
=
findCheckOutTask
(
storage
,
statusBean
);
}
return
statusBean
;
}
/**
* 出库处理
*/
public
StatusBean
findCheckOutTask
(
Storage
storage
,
StatusBean
statusBean
)
{
try
{
//准备更新暂停出入库
if
(
dataCache
.
getCache
(
Constants
.
CACHE_StopOut
))
{
return
statusBean
;
}
String
cid
=
statusBean
.
getCid
();
Collection
<
DataLog
>
queueTasks
=
taskService
.
getQueueTasks
();
int
executingOutTaskSize
=
0
;
DataLog
outTask
=
null
;
for
(
DataLog
queueTask
:
queueTasks
)
{
if
(
queueTask
.
getCid
().
equals
(
cid
)){
//有入库任务不分配出库任务
if
(
queueTask
.
isPutInTask
()){
return
statusBean
;
}
else
{
if
(
queueTask
.
isExecuting
()){
executingOutTaskSize
++;
//已经有出库任务正在执行,超过60秒仍未完成的出库再次发送到客户端
if
(
queueTask
.
needReSendToClient
()){
outTask
=
queueTask
;
log
.
error
(
"cid["
+
cid
+
"]的出库任务["
+
queueTask
.
getPosName
()
+
"]超过60秒仍未完成,重新发送到客户端!"
);
queueTask
.
setUpdateDate
(
new
Date
());
break
;
}
}
else
if
(
queueTask
.
isWait
()){
if
(
executingOutTaskSize
>=
2
)
{
//log.error("cid["+cid + "]的BOX["+ boxId+"]的出库任务已经超过2个,不再分配!");
outTask
=
null
;
break
;
}
outTask
=
queueTask
;
if
(
queueTask
.
isUrgentReel
()){
break
;
}
}
}
}
}
//没有入库任务时才处理出库
statusBean
=
taskService
.
checkOut
(
storage
,
statusBean
);
if
(
outTask
!=
null
){
log
.
info
(
"分配出库任务"
+
outTask
.
getBarcode
()
+
"["
+
outTask
.
getPosName
()
+
"]到 "
+
cid
);
outTask
.
setStatus
(
OP_STATUS
.
EXECUTING
.
name
());
taskService
.
updateQueueTask
(
outTask
);
statusBean
.
setOp
(
OP
.
CHECKOUT
);
String
posName
=
outTask
.
getPosName
();
Barcode
codeObj
=
barcodeManager
.
findByBarcode
(
outTask
.
getBarcode
());
int
plateW
=
0
;
int
plateH
=
0
;
if
(
codeObj
!=
null
)
{
plateW
=
codeObj
.
getPlateSize
();
plateH
=
codeObj
.
getHeight
();
}
else
{
log
.
warn
(
"出库无料仓位"
+
storage
.
getName
()
+
"["
+
posName
+
"]"
);
}
statusBean
.
addPosInfo
(
outTask
.
getBarcode
(),
posName
,
plateW
,
plateH
,
false
);
log
.
info
(
"出库"
+
storage
.
getName
()
+
"["
+
posName
+
"]物料["
+
outTask
.
getBarcode
()
+
"] 发送到客户端"
+
cid
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"出库出错"
,
e
);
}
return
statusBean
;
}
protected
StatusBean
handleFinished
(
StatusBean
statusBean
)
{
Map
<
String
,
BoxStatusBean
>
statusOfBoxes
=
statusBean
.
getBoxStatus
();
if
(
statusOfBoxes
!=
null
)
{
for
(
BoxStatusBean
boxStatus
:
statusOfBoxes
.
values
())
{
try
{
//出库入库完成处理
int
status
=
boxStatus
.
getStatus
();
String
posName
=
boxStatus
.
getPosId
();
int
executeTime
=
boxStatus
.
getExecuteTime
();
if
(!
Strings
.
isNullOrEmpty
(
posName
))
{
//客户端发一次完成之后,会发空的 posName,不需要处理
if
(
BOX_STATUS
.
IN_FINISHED
==
status
)
{
//入仓完成
finishedPutIn
(
statusBean
.
getCid
(),
posName
,
executeTime
);
}
else
if
(
BOX_STATUS
.
IN_FAILED
==
status
)
{
//入库失败
//暂不处理
}
else
if
(
BOX_STATUS
.
OUT_FINISHED
==
status
)
{
//出仓完成
finishedOutPos
(
statusBean
.
getCid
(),
posName
,
executeTime
);
}
else
if
(
BOX_STATUS
.
OUT_END
==
status
)
{
//出库完成(放到仓门口
//更改出库状态为OUT_DOOR
List
<
DataLog
>
finishedTasks
=
taskService
.
getFinishedTasks
();
for
(
DataLog
finishedTask
:
finishedTasks
)
{
if
(
finishedTask
.
getCid
().
equals
(
statusBean
.
getCid
())
&&
finishedTask
.
isCheckOutTask
()
&&
finishedTask
.
isOutBox
()){
if
(
posName
.
equals
(
finishedTask
.
getPosName
())){
//已出仓但未放到门口,更改状态
finishedTask
.
setStatus
(
OP_STATUS
.
BOXDOOR
.
name
());
taskService
.
updateFinishedTask
(
finishedTask
);
log
.
info
(
"物料"
+
finishedTask
.
getBarcode
()
+
"已从库位"
+
finishedTask
.
getPosName
()
+
"取出放到门口"
);
return
statusBean
;
}
}
}
log
.
error
(
posName
+
"出库放到门口时,未找到对应的出库任务"
);
}
else
if
(
BOX_STATUS
.
OUT_FAILED
==
status
){
log
.
error
(
posName
+
"出库放到门口时,未感应到料盘"
);
//通知
}
}
}
catch
(
ValidateException
e
)
{
log
.
error
(
"更新状态时出错"
+
e
.
getMessage
());
}
}
}
return
statusBean
;
}
@ApiOperation
(
"扫码后获取库位号"
)
@PostMapping
(
value
=
"/service/store/robotBox/emptyPosForPutin"
)
@ResponseBody
...
...
@@ -110,12 +245,10 @@ public class RobotBoxHandler extends BaseDeviceHandler {
if
(
Strings
.
isNullOrEmpty
(
cids
))
{
//自动获取在线的料仓列表
cidList
=
dataCache
.
getAvailableStorageIds
(
this
.
getDeviceType
());
// resultMap.put("result", "101");
// resultMap.put("msg", "未指定料仓 cids ");
}
else
{
cidList
=
Lists
.
newArrayList
();
cidList
=
Lists
.
newArrayList
(
cids
.
split
(
","
)
);
}
for
(
String
cid
:
cid
s
.
split
(
","
)
)
{
for
(
String
cid
:
cid
List
)
{
String
notIntoCids
=
dataCache
.
getSettings
().
getNotIntoCids
();
if
(
notIntoCids
!=
null
)
{
if
(
notIntoCids
.
contains
(
cid
))
{
...
...
@@ -123,25 +256,9 @@ public class RobotBoxHandler extends BaseDeviceHandler {
continue
;
}
}
boolean
hasOutTask
=
false
;
//判断是否有正在执行的出库任务,有的话不能入库
Storage
storage
=
dataCache
.
getStorage
(
cid
);
if
(!
storage
.
isRobotBox
())
{
Collection
<
DataLog
>
tasks
=
taskService
.
getQueueTasks
();
for
(
DataLog
task
:
tasks
)
{
if
(
task
.
isCheckOutTask
()
&&
task
.
getStorageId
().
equals
(
storage
.
getId
()))
{
if
(
task
.
isExecuting
()
||
task
.
isBoxdoor
()
)
{
hasOutTask
=
true
;
break
;
}
}
}
}
if
(
storage
!=
null
&&
(!
hasOutTask
))
{
if
(
storage
!=
null
)
{
storageList
.
add
(
storage
);
cidList
.
add
(
cid
);
}
}
if
(
storageList
.
isEmpty
())
{
...
...
@@ -149,7 +266,6 @@ public class RobotBoxHandler extends BaseDeviceHandler {
errorMsg
=
"无可用的料仓"
;
resultMap
.
put
(
"msg"
,
errorMsg
);
}
else
{
try
{
Barcode
barcode
=
codeResolve
.
resolveOneValideBarcode
(
code
);
...
...
@@ -163,6 +279,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
resultMap
.
put
(
"pos"
,
dataLog
.
getPosName
());
resultMap
.
put
(
"barcode"
,
barcode
.
getBarcode
());
resultMap
.
put
(
"cid"
,
dataLog
.
getCid
());
resultMap
.
put
(
"taskId"
,
dataLog
.
getId
());
return
resultMap
;
}
else
{
//已有出库任务
...
...
@@ -187,67 +304,52 @@ public class RobotBoxHandler extends BaseDeviceHandler {
resultMap
.
put
(
"barcode"
,
dataLog
.
getBarcode
());
boolean
smallReel
=
barcode
.
isSmallReel
();
resultMap
.
put
(
"smallReel"
,
smallReel
+
""
);
resultMap
.
put
(
"taskId"
,
dataLog
.
getId
());
return
resultMap
;
}
// }
}
}
try
{
barcode
=
verifyPutInFromApi
(
barcode
);
}
catch
(
ValidateException
ex
){
lineMsg
=
"不允许入库,"
+
ex
.
getDefaultMsg
();
DeviceMessageUtil
.
updateLineMsg
(
lineMsg
,
code
,
cids
,
""
,
"smfcore.linemsg.update"
,
null
);
resultMap
.
put
(
"result"
,
"107"
);
resultMap
.
put
(
"msg"
,
lineMsg
);
return
resultMap
;
}
StoragePos
pos
=
taskService
.
findEmptyPosForPutIn
(
storageList
,
barcode
,
""
,
lastPosId
);
if
(
pos
!=
null
)
{
Storage
theStorage
=
dataCache
.
getStorageById
(
pos
.
getStorageId
());
resultMap
.
put
(
"result"
,
"0"
);
resultMap
.
put
(
"msg"
,
""
);
okMsg
=
"["
+
barcode
.
getBarcode
()
+
"]锁定库位["
+
pos
.
getPosName
()
+
"]优先级["
+
pos
.
getPriority
()
+
"] 上个库位号["
+
lastPosId
+
"]"
;
ReelLockPosInfo
oldLockInfo
=
ReelLockPosUtil
.
getLockPosInfoByCode
(
barcode
.
getBarcode
());
if
(
oldLockInfo
!=
null
)
{
if
(!
oldLockInfo
.
getBarcode
().
equals
(
barcode
.
getBarcode
()))
{
String
result
=
"-1"
;
okMsg
=
"["
+
barcode
.
getBarcode
()
+
"]锁定库位["
+
pos
.
getPosName
()
+
"],清理旧有锁定信息"
;
resultMap
.
put
(
"result"
,
result
);
resultMap
.
put
(
"msg"
,
okMsg
);
//已经锁定过库位,但不是同一个条码,需要把对应位置的锁定信息清理掉
ReelLockPosUtil
.
removeReelLockPosInfo
(
oldLockInfo
.
getBarcode
());
log
.
info
(
"清理锁定库位:库位号["
+
oldLockInfo
.
getLockPosName
()
+
"]上物料["
+
oldLockInfo
.
getBarcode
()
+
"]锁定的库位"
);
Storage
storage
=
dataCache
.
getStorageById
(
pos
.
getStorageId
());
//如果所在料仓有出库任务未完成,暂停入库
Collection
<
DataLog
>
tasks
=
taskService
.
getAllTasks
();
for
(
DataLog
task
:
tasks
)
{
if
(
task
.
isCheckOutTask
()
&&
task
.
getStorageId
().
equals
(
pos
.
getStorageId
())){
if
(!
task
.
isFinished
()
&&
!
task
.
isInRobot
()){
errorMsg
=
"库位["
+
pos
.
getPosName
()
+
"]所在料仓有出库任务,暂停入库"
;
lineMsg
=
errorMsg
;
resultMap
.
put
(
"result"
,
"99"
);
resultMap
.
put
(
"msg"
,
errorMsg
);
return
resultMap
;
}
}
}
log
.
info
(
okMsg
+
oldLockInfo
);
ReelLockPosInfo
reelLocInfo
=
new
ReelLockPosInfo
();
reelLocInfo
.
setBarcode
(
barcode
.
getBarcode
());
reelLocInfo
.
setCid
(
theStorage
.
getCid
());
reelLocInfo
.
setLockPosName
(
pos
.
getPosName
());
reelLocInfo
.
setLockPosId
(
pos
.
getId
());
reelLocInfo
=
ReelLockPosUtil
.
addReelLockPosInfo
(
reelLocInfo
,
cidList
);
if
(
reelLocInfo
==
null
)
{
errorMsg
=
"["
+
barcode
.
getBarcode
()
+
"]库位["
+
reelLocInfo
.
getLockPosName
()
+
"]已被锁定,暂停入库"
;
lineMsg
=
errorMsg
;
resultMap
.
put
(
"result"
,
"0"
);
resultMap
.
put
(
"msg"
,
"ok"
);
DataLog
newTask
=
taskService
.
addPutInTaskToExecute
(
storage
,
barcode
,
pos
);
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
;
}
else
{
resultMap
.
put
(
"pos"
,
pos
.
getPosName
());
resultMap
.
put
(
"barcode"
,
barcode
.
getBarcode
());
resultMap
.
put
(
"cid"
,
theStorage
.
getCid
());
okMsg
=
"["
+
barcode
.
getBarcode
()
+
"]锁定库位["
+
pos
.
getPosName
()
+
"]优先级["
+
pos
.
getPriority
()
+
"] 上个库位号["
+
lastPosId
+
"]"
;
//TODO 创建入库任务,状态执行中
Storage
storage
=
dataCache
.
getStorageById
(
pos
.
getStorageId
());
taskService
.
addPutInTaskToExecute
(
storage
,
barcode
,
pos
);
}
log
.
info
(
okMsg
);
resultMap
.
put
(
"pos"
,
pos
.
getPosName
());
resultMap
.
put
(
"barcode"
,
barcode
.
getBarcode
()
);
resultMap
.
put
(
"cid"
,
storage
.
getCid
());
resultMap
.
put
(
"taskId"
,
newTask
.
getId
());
}
else
{
resultMap
.
put
(
"result"
,
"104"
);
...
...
@@ -297,6 +399,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
@ResponseBody
@AnonymousAccess
public
ResultBean
updateLocInfo
(
HttpServletRequest
request
)
{
String
taskId
=
request
.
getParameter
(
"taskId"
);
String
barcode
=
request
.
getParameter
(
"barcode"
);
String
statusStr
=
request
.
getParameter
(
"status"
);
String
locInfo
=
request
.
getParameter
(
"locInfo"
);
...
...
@@ -305,22 +408,29 @@ public class RobotBoxHandler extends BaseDeviceHandler {
if
(
ObjectUtil
.
isEmpty
(
locInfo
)){
locInfo
=
statusStr
;
}
DataLog
task
=
taskService
.
findTask
(
barcode
);
if
(
task
==
null
)
{
DataLog
opTask
=
null
;
List
<
DataLog
>
allTasks
=
taskService
.
getAllTasks
();
for
(
DataLog
task
:
allTasks
)
{
if
(
task
.
getId
().
equals
(
taskId
)
&&
task
.
getBarcode
().
equals
(
barcode
)){
opTask
=
task
;
break
;
}
}
if
(
opTask
==
null
)
{
return
ResultBean
.
newErrorResult
(
301
,
"smfcore.task.notExist"
,
"任务不存在"
);
}
if
(
t
ask
.
isFinished
())
{
if
(
opT
ask
.
isFinished
())
{
return
ResultBean
.
newErrorResult
(
302
,
"smfcore.task.hasEnd"
,
"任务已完成"
);
}
if
(
t
ask
.
isCancel
())
{
return
ResultBean
.
newErrorResult
(
303
,
"smfcore.task.hasCancel"
,
"更新状态时{0}的出库任务[{1}]已被取消"
,
new
String
[]{
task
.
getBarcode
(),
t
ask
.
getId
()});
}
// if (opT
ask.isCancel()) {
// return ResultBean.newErrorResult(303, "smfcore.task.hasCancel", "更新状态时{0}的出库任务[{1}]已被取消", new String[]{opTask.getBarcode(), opT
ask.getId()});
//
}
statusStr
=
statusStr
.
toUpperCase
();
log
.
info
(
"更新料盘["
+
barcode
+
"]的任务状态["
+
task
.
getStatus
()
+
"="
+
t
ask
.
getLocInfo
()
+
"]为["
+
statusStr
+
"="
+
locInfo
+
"]"
);
t
ask
.
setStatus
(
statusStr
);
t
ask
.
setLocInfo
(
locInfo
);
log
.
info
(
"更新料盘["
+
barcode
+
"]的任务状态["
+
opTask
.
getStatus
()
+
"="
+
opT
ask
.
getLocInfo
()
+
"]为["
+
statusStr
+
"="
+
locInfo
+
"]"
);
opT
ask
.
setStatus
(
statusStr
);
opT
ask
.
setLocInfo
(
locInfo
);
//如果是出库任务并且放到料仓门口,需要发送任务给料仓
...
...
@@ -341,7 +451,12 @@ public class RobotBoxHandler extends BaseDeviceHandler {
// }
// }
task
=
taskService
.
updateQueueTask
(
task
);
if
(
opTask
.
isPutInTask
()){
taskService
.
updateQueueTask
(
opTask
);
}
else
{
taskService
.
updateFinishedTask
(
opTask
);
}
return
ResultBean
.
newOkResult
(
""
);
}
...
...
@@ -354,14 +469,14 @@ public class RobotBoxHandler extends BaseDeviceHandler {
//TODO 先查找是否有出库任务
Collection
<
DataLog
>
datalogs
=
taskService
.
get
Queue
Tasks
();
Collection
<
DataLog
>
datalogs
=
taskService
.
get
All
Tasks
();
//先查找已在机器人的
for
(
DataLog
task
:
datalogs
)
{
if
(
task
.
isInRobot
())
{
//获取任务失败,还有未完成的任务
return
ResultBean
.
newErrorResult
(
1
,
"smfcore.task.lastNotEnd"
,
"上个任务未结束{0}{1}"
,
new
String
[]{
task
.
getPosName
(),
task
.
getBarcode
()});
}
}
//
for (DataLog task : datalogs) {
//
if (task.isInRobot()) {
//
//获取任务失败,还有未完成的任务
//
return ResultBean.newErrorResult(1, "smfcore.task.lastNotEnd", "上个任务未结束{0}{1}", new String[]{task.getPosName(), task.getBarcode()});
//
}
//
}
//查找出库已经到门口的
for
(
DataLog
task
:
datalogs
)
{
if
(
task
.
isCheckOutTask
())
{
...
...
@@ -383,6 +498,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
taskMap
.
put
(
"plateW"
,
plateW
+
""
);
taskMap
.
put
(
"plateH"
,
plateH
+
""
);
taskMap
.
put
(
"barcode"
,
task
.
getBarcode
());
taskMap
.
put
(
"taskId"
,
task
.
getId
());
return
ResultBean
.
newOkResult
(
taskMap
);
}
...
...
@@ -414,10 +530,9 @@ public class RobotBoxHandler extends BaseDeviceHandler {
if
(
task
.
isBoxdoor
())
{
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.robotBox.boxHasTask"
,
"任务[{0}][{1}]类型{2}状态{3}"
,
new
String
[]{
task
.
getPosName
(),
task
.
getBarcode
(),
task
.
getType
()+
""
,
task
.
getStatus
()});
}
else
if
(
task
.
isPutInTask
()&&
task
.
isInRobot
()){
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.robotBox.boxHasTask"
,
"任务[{0}][{1}]类型{2}状态{3}"
,
new
String
[]{
task
.
getPosName
(),
task
.
getBarcode
(),
task
.
getType
()+
""
,
task
.
getStatus
()});
}
// else if(task.isPutInTask()&&task.isInRobot()){
// return ResultBean.newErrorResult(-1, "smfcore.robotBox.boxHasTask", "任务[{0}][{1}]类型{2}状态{3}", new String[]{task.getPosName(), task.getBarcode(),task.getType()+"", task.getStatus()});
// }
}
}
return
ResultBean
.
newOkResult
(
""
);
...
...
src/main/java/com/neotel/smfcore/core/device/util/DataCache.java
查看文件 @
11a719d
...
...
@@ -666,13 +666,12 @@ public class DataCache {
if
(
storage
.
getType
().
equals
(
deviceType
.
name
()))
{
StatusBean
bean
=
DevicesStatusUtil
.
getStatusBean
(
storage
.
getCid
());
if
(
bean
==
null
||
bean
.
timeOut
())
{
if
(
bean
==
null
||
bean
.
timeOut
()
||
bean
.
isAvailable
()
)
{
continue
;
}
if
(
bean
.
getStatus
()
==
1
)
{
//
if (bean.getStatus() == 1) {
availableStorageIds
.
add
(
storage
.
getId
());
}
//}
}
}
return
availableStorageIds
;
...
...
src/main/java/com/neotel/smfcore/core/kanban/rest/BoxKanbanController.java
查看文件 @
11a719d
...
...
@@ -128,8 +128,7 @@ public class BoxKanbanController {
}
List
<
DataLog
>
allTasks
=
taskService
.
getAllTasks
();
List
<
BoxTaskDto
>
dtos
=
new
ArrayList
<>();
for
(
DataLog
datalog
:
allTasks
)
{
for
(
DataLog
datalog
:
allTasks
)
{
//判断类型
if
(
criteria
.
getType
()
!=
null
&&
(!
criteria
.
getType
().
equals
(
datalog
.
getType
())))
{
continue
;
...
...
@@ -150,12 +149,12 @@ public class BoxKanbanController {
Date
lastUpdateTime
=
new
Date
((
new
Date
().
getTime
())
-
10
*
60
*
1000
);
//正常
if
(
criteria
.
getTaskStatus
()
==
1
)
{
if
(
lastUpdateTime
.
before
(
datalog
.
getUpdateDate
())
&&
datalog
.
getStatus
().
equals
(
OP_STATUS
.
EXECUTING
.
name
())
)
{
if
(
lastUpdateTime
.
before
(
datalog
.
getUpdateDate
()))
{
statusOk
=
true
;
}
}
//异常
else
if
(
criteria
.
getTaskStatus
()
==
2
)
{
if
(
lastUpdateTime
.
after
(
datalog
.
getUpdateDate
())
&&
datalog
.
getStatus
().
equals
(
OP_STATUS
.
EXECUTING
.
name
()))
{
if
(
lastUpdateTime
.
after
(
datalog
.
getUpdateDate
())
&&
!
datalog
.
getStatus
().
equals
(
OP_STATUS
.
WAIT
.
name
()))
{
statusOk
=
true
;
}
}
//等待
...
...
@@ -396,14 +395,14 @@ public class BoxKanbanController {
int
allcount
=
0
;
int
waitCount
=
0
;
for
(
DataLog
data
:
allTasks
)
{
if
(
data
.
isFinished
()
||
data
.
isCancel
())
{
continue
;
}
//
if (data.isFinished() || data.isCancel()) {
//
continue;
//
}
if
(
data
.
isWait
()){
waitCount
++;
}
//超过10分钟未更新为异常
else
if
(
data
.
isAbnormal
()
)
{
else
if
(
data
.
isAbnormal
())
{
abnormal
++;
}
else
{
normal
++;
...
...
@@ -463,7 +462,7 @@ public class BoxKanbanController {
String
temperature
=
boxStatus
.
getTemperature
();
boxDto
.
setHumidity
(
humidity
);
boxDto
.
setTemperature
(
temperature
);
boxDto
.
setStatus
(
b
ean
.
getStatus
());
boxDto
.
setStatus
(
b
oxStatus
.
getStatus
());
boxDto
.
setMsg
(
bean
.
getShowMsg
(
locale
));
boxDto
.
setBarcode
(
bean
.
getCode
());
boxDto
.
setPosName
(
bean
.
getPosId
());
...
...
src/main/java/com/neotel/smfcore/core/message/util/DeviceMessageUtil.java
查看文件 @
11a719d
...
...
@@ -8,10 +8,14 @@ import com.neotel.smfcore.core.message.service.manager.IMessageManager;
import
com.neotel.smfcore.core.message.service.po.Message
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
com.neotel.smfcore.taizhi.TaiZhiApi
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
java.util.ArrayList
;
import
java.util.List
;
@Slf4j
@Component
public
class
DeviceMessageUtil
{
...
...
@@ -63,6 +67,8 @@ public class DeviceMessageUtil {
}
Message
message
=
Message
.
newMsg
(
MessageType
.
ERROR
,
storage
.
getName
(),
storage
.
getId
(),
moudle
,
code
,
msg
,
msgParam
);
messageManager
.
save
(
message
);
TaiZhiApi
.
onDeviceAlarm
(
cid
,
msg
);
}
}
...
...
@@ -79,7 +85,8 @@ public class DeviceMessageUtil {
Storage
storage
=
dataCache
.
getStorage
(
cid
);
if
(
storage
!=
null
)
{
Message
message
=
Message
.
newMsg
(
MessageType
.
INFO
,
storage
.
getName
(),
storage
.
getId
(),
moudle
,
"smfcore.messages.offline"
,
"离线"
,
null
);
Message
message
=
Message
.
newMsg
(
MessageType
.
ERROR
,
storage
.
getName
(),
storage
.
getId
(),
moudle
,
"smfcore.messages.offline"
,
"离线"
,
null
);
TaiZhiApi
.
deviceStatusChange
(
cid
,
0
);
messageManager
.
save
(
message
);
}
...
...
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
查看文件 @
11a719d
...
...
@@ -27,6 +27,7 @@ import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import
com.neotel.smfcore.core.system.listener.ITaskListener
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
com.neotel.smfcore.core.system.util.TaskService
;
import
com.neotel.smfcore.taizhi.TaiZhiApi
;
import
javafx.concurrent.Task
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -146,7 +147,6 @@ public class LiteOrderCache implements ITaskListener {
}
}
public
ResultBean
checkOutOrder
(
LiteOrder
liteOrder
)
throws
ValidateException
{
ORDER_COLOR
nextColor
=
getNextColor
();
...
...
@@ -280,6 +280,7 @@ public class LiteOrderCache implements ITaskListener {
}
liteOrderManager
.
save
(
order
);
liteOrderMap
.
put
(
orderNo
,
order
);
TaiZhiApi
.
orderStatusChange
(
order
);
}
else
{
log
.
error
(
"完成任务时,未找到工单["
+
orderNo
+
"]信息"
);
}
...
...
@@ -332,6 +333,7 @@ public class LiteOrderCache implements ITaskListener {
}
log
.
info
(
"开始执行工单["
+
orderNo
+
"] outBom="
+
outBom
);
TaiZhiApi
.
orderStatusChange
(
cacheOrder
);
cacheOrder
.
setTaskReelCount
(
0
);
cacheOrder
.
setTaskFinishedTime
(-
1
);
cacheOrder
.
setFinishedReelCount
(
0
);
...
...
@@ -393,6 +395,10 @@ public class LiteOrderCache implements ITaskListener {
task
.
setSubSourceId
(
orderItem
.
getId
());
task
.
setSubSourceInfo
(
orderItem
.
getFeederInfo
());
task
.
setType
(
OP
.
CHECKOUT
);
//jobType 任务种类:M 常规发料;P 改机发料(优先级最高)
if
(
cacheOrder
.
getJobType
().
equals
(
"P"
)){
task
.
setUrgentReel
(
true
);
}
task
.
setLightColor
(
nextColor
.
getRgb
());
task
.
setStatus
(
OP_STATUS
.
WAIT
.
name
());
// task = dataLogDao.save(task);
...
...
@@ -429,9 +435,9 @@ public class LiteOrderCache implements ITaskListener {
*/
public
Collection
<
String
>
excludePosIds
()
{
//排除掉正在执行的仓位
List
<
DataLog
>
allTasks
=
taskService
.
getAll
Tasks
();
Collection
<
DataLog
>
queueTasks
=
taskService
.
getQueue
Tasks
();
Collection
<
String
>
operatingPosIds
=
new
HashSet
<>();
for
(
DataLog
task
:
all
Tasks
)
{
for
(
DataLog
task
:
queue
Tasks
)
{
String
posId
=
task
.
getPosId
();
if
(!
Strings
.
isNullOrEmpty
(
posId
))
{
operatingPosIds
.
add
(
task
.
getPosId
());
...
...
src/main/java/com/neotel/smfcore/core/order/service/po/LiteOrder.java
查看文件 @
11a719d
...
...
@@ -94,6 +94,11 @@ public class LiteOrder extends BasePo implements Serializable {
private
float
orderTimes
=
1
f
;
/**
* 任务类型
*/
private
String
jobType
=
""
;
/**
* 工单类型,默认1=PN,2=RI
*/
private
int
type
=
1
;
...
...
src/main/java/com/neotel/smfcore/core/storage/rest/MaterialController.java
查看文件 @
11a719d
...
...
@@ -139,7 +139,7 @@ public class MaterialController {
@ApiOperation
(
"物料分组界面"
)
@GetMapping
(
"/labelOuput"
)
@PreAuthorize
(
"@el.check('labelOuput')"
)
public
PageData
<
StoragePosDto
>
storagePosFind
(
StoragePosFindCriteria
criteria
,
Pageable
pageable
,
HttpServletRequest
request
)
{
public
PageData
<
StoragePosDto
>
labelOuput
(
StoragePosFindCriteria
criteria
,
Pageable
pageable
,
HttpServletRequest
request
)
{
if
(
ObjectUtil
.
isEmpty
(
criteria
.
getStorageId
())
||
criteria
.
getStorageId
().
equals
(
"0"
)
){
criteria
.
setStorageId
(
null
);
}
...
...
src/main/java/com/neotel/smfcore/core/storage/rest/query/StoragePosFindCriteria.java
查看文件 @
11a719d
...
...
@@ -12,7 +12,7 @@ import java.util.List;
@Data
public
class
StoragePosFindCriteria
{
@QueryCondition
(
blurry
=
"barcode.partNumber,barcode,posName"
)
@QueryCondition
(
blurry
=
"barcode.partNumber,barcode
.barcode
,posName"
)
private
String
blurry
;
@QueryCondition
(
type
=
QueryCondition
.
Type
.
BETWEEN
,
propName
=
"barcode.putInDate"
)
...
...
src/main/java/com/neotel/smfcore/core/system/api/APIUtil.java
0 → 100644
查看文件 @
11a719d
package
com
.
neotel
.
smfcore
.
core
.
system
.
api
;
public
class
APIUtil
{
}
src/main/java/com/neotel/smfcore/core/system/api/DefaultSMFListener.java
0 → 100644
查看文件 @
11a719d
package
com
.
neotel
.
smfcore
.
core
.
system
.
api
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.order.service.po.LiteOrder
;
import
com.neotel.smfcore.core.system.listener.ITaskListener
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
org.springframework.stereotype.Service
;
/**
* Created by sunke on 2021/7/12.
*/
@Service
public
class
DefaultSMFListener
implements
ISMFListener
{
@Override
public
void
onTaskStatusChange
(
DataLog
task
)
{
}
@Override
public
void
onLiteOrderStatusChange
(
LiteOrder
liteOrder
)
{
}
@Override
public
Barcode
canPutIn
(
Barcode
barcode
)
throws
ValidateException
{
return
null
;
}
}
src/main/java/com/neotel/smfcore/core/system/api/ISMFListener.java
0 → 100644
查看文件 @
11a719d
package
com
.
neotel
.
smfcore
.
core
.
system
.
api
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.device.api.CodeValidateParam
;
import
com.neotel.smfcore.core.order.service.po.LiteOrder
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
/**
* Created by sunke on 2021/7/12.
*/
public
interface
ISMFListener
{
void
onTaskStatusChange
(
DataLog
task
);
void
onLiteOrderStatusChange
(
LiteOrder
liteOrder
);
/**
* 是否可入库验证
*/
Barcode
canPutIn
(
Barcode
barcode
)
throws
ValidateException
;
}
src/main/java/com/neotel/smfcore/core/system/service/po/DataLog.java
查看文件 @
11a719d
...
...
@@ -248,6 +248,10 @@ public class DataLog extends BasePo implements Serializable {
return
OP_STATUS
.
FINISHED
.
name
().
equals
(
status
);
}
public
boolean
isOutBox
(){
return
OP_STATUS
.
OUTBOX
.
name
().
equals
(
status
);
}
public
boolean
isWait
(){
return
OP_STATUS
.
WAIT
.
name
().
equals
(
status
);
}
...
...
@@ -404,7 +408,7 @@ public class DataLog extends BasePo implements Serializable {
* 判断任务是否异常,执行中,且10分钟未更新的认为异常
*/
public
boolean
isAbnormal
(){
if
(
isExecuting
()
){
if
(
isExecuting
()){
if
(
System
.
currentTimeMillis
()
-
super
.
getUpdateDate
().
getTime
()
>
10
*
60
*
1000
){
return
true
;
}
...
...
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
查看文件 @
11a719d
...
...
@@ -648,37 +648,7 @@ public class TaskService {
}
String
lockPosId
=
ReelLockPosUtil
.
getReelLockPosId
(
barcode
.
getBarcode
());
StoragePos
pos
=
null
;
if
(!
Strings
.
isNullOrEmpty
(
lockPosId
))
{
//已有锁定库位
pos
=
storagePosManager
.
get
(
lockPosId
);
if
(
pos
!=
null
)
{
if
(!
storageIds
.
contains
(
pos
.
getStorageId
())){
log
.
info
(
"条码["
+
barcode
.
getBarcode
()
+
"]已有锁定库位["
+
pos
.
getPosName
()
+
"],料仓ID["
+
pos
.
getStorageId
()+
"]不在请求列表["
+
String
.
join
(
","
,
storageIds
)+
"]中,重新查找库位"
);
pos
=
null
;
}
else
if
(
pos
.
getW
()
<
barcode
.
getPlateSize
()
||
pos
.
getH
()
<
barcode
.
getHeight
())
{
log
.
info
(
"条码["
+
barcode
.
getBarcode
()
+
"]尺寸已改变,无法放入已锁定库位["
+
pos
.
getPosName
()
+
"],重新查找库位"
);
pos
=
null
;
}
else
{
Barcode
posBarcode
=
pos
.
getBarcode
();
if
(
posBarcode
==
null
)
{
log
.
info
(
"条码["
+
barcode
.
getBarcode
()
+
"]已锁定库位["
+
pos
.
getPosName
()
+
"],返回锁定中的库位"
);
}
else
{
log
.
info
(
"条码["
+
barcode
.
getBarcode
()
+
"]已锁定库位["
+
pos
.
getPosName
()
+
"]中已有物料["
+
posBarcode
.
getBarcode
()
+
"],重新查找库位"
);
pos
=
null
;
}
}
}
}
if
(
pos
!=
null
)
{
return
pos
;
}
//可用的料仓(在线,且可以放入)
List
<
Storage
>
availbleStorageList
=
new
ArrayList
<>();
...
...
@@ -926,7 +896,7 @@ public class TaskService {
dataCache
.
updateInventory
(
storagePos
,
barcode
);
//记录日志
task
.
setStatus
(
OP_STATUS
.
FINISHED
.
name
());
task
.
setStatus
(
OP_STATUS
.
OUTBOX
.
name
());
if
(
isCancelTask
)
{
task
.
setStatus
(
OP_STATUS
.
CANCEL
.
name
());
}
...
...
src/main/java/com/neotel/smfcore/panacim/PanaApiController.java
查看文件 @
11a719d
...
...
@@ -424,7 +424,7 @@ public class PanaApiController implements IOpAuthApi, ITaskListener{
}
}
}
else
{
log
.
info
(
"没有配置PanaCIM条码检测接口,查找setConfiguration注册的IP 及端口"
);
//
log.info("没有配置PanaCIM条码检测接口,查找setConfiguration注册的IP 及端口");
return
null
;
}
}
catch
(
Exception
e
)
{
...
...
@@ -477,7 +477,7 @@ public class PanaApiController implements IOpAuthApi, ITaskListener{
String
result
=
HttpHelper
.
postJson
(
inNotifyApi
,
params
);
log
.
info
(
"Response Of checkInNotification From PanaCIM:"
+
result
);
}
else
{
log
.
info
(
"没有配置PanaCIM接口,无需通知"
);
//
log.info("没有配置PanaCIM接口,无需通知");
}
}
catch
(
Exception
e
)
{
...
...
@@ -511,7 +511,7 @@ public class PanaApiController implements IOpAuthApi, ITaskListener{
log
.
info
(
"Response Of deliverNotification From PanaCIM:"
+
result
);
}
else
{
log
.
info
(
"没有配置PanaCIM接口,无需通知"
);
//
log.info("没有配置PanaCIM接口,无需通知");
}
}
catch
(
Exception
e
)
{
log
.
error
(
"出库通知PanaCIM["
+
outNotifyApi
+
"]料盘"
+
task
.
getBarcode
()+
" 出错"
,
e
);
...
...
src/main/java/com/neotel/smfcore/taizhi/TaiZhiApi.java
0 → 100644
查看文件 @
11a719d
package
com
.
neotel
.
smfcore
.
taizhi
;
import
com.neotel.smfcore.common.exception.ApiException
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.utils.DateUtil
;
import
com.neotel.smfcore.common.utils.HttpHelper
;
import
com.neotel.smfcore.common.utils.JsonUtil
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.device.api.CodeValidateParam
;
import
com.neotel.smfcore.core.device.api.IOpAuthApi
;
import
com.neotel.smfcore.core.order.service.po.LiteOrder
;
import
com.neotel.smfcore.core.system.listener.ITaskListener
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.logging.log4j.util.Strings
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
java.net.URLDecoder
;
import
java.net.URLEncoder
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.Map
;
@Slf4j
@Component
public
class
TaiZhiApi
implements
ITaskListener
,
IOpAuthApi
{
private
static
TaiZhiConfig
config
;
@Autowired
public
void
setConfig
(
TaiZhiConfig
config
){
TaiZhiApi
.
config
=
config
;
}
@Override
public
void
onTaskStatusChange
(
DataLog
task
)
{
if
(
task
.
isFinished
()
||
task
.
isOutBox
()){
if
(
task
.
isPutInTask
()){
inFinished
(
task
);
}
else
{
outFinished
(
task
);
}
}
}
/**
* 8、物料出库完成接口
* @param task
*/
private
void
outFinished
(
DataLog
task
)
{
String
outDoneUrl
=
config
.
outDoneUrl
;
if
(
Strings
.
isNotBlank
(
outDoneUrl
)){
try
{
String
reelId
=
task
.
getBarcode
();
String
deviceId
=
task
.
getCid
();
String
location
=
task
.
getPosName
();
//"status": "状态:R:开始出库,Y:出库成功,N:出库失败",
String
status
=
"Y"
;
log
.
info
(
"调用物料出库完成接口deviceId="
+
deviceId
+
",reelId="
+
reelId
+
",location="
+
location
+
","
+
status
);
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
paramMap
.
put
(
"deviceId"
,
deviceId
);
paramMap
.
put
(
"location"
,
location
);
paramMap
.
put
(
"reelId"
,
reelId
);
paramMap
.
put
(
"status"
,
status
);
paramMap
.
put
(
"outTime"
,
task
.
getUpdateDate
());
paramMap
.
put
(
"remark"
,
""
);
String
result
=
HttpHelper
.
postJson
(
outDoneUrl
,
paramMap
);
log
.
info
(
reelId
+
"物料出库完成接口返回:"
+
result
);
}
catch
(
ApiException
e
)
{
log
.
error
(
"调用物料出库完成接口"
,
e
);
}
}
}
/**
* 5、物料入库储位接口
* @param task
*/
private
void
inFinished
(
DataLog
task
){
String
inLocationUrl
=
config
.
inLocationUrl
;
if
(
Strings
.
isNotBlank
(
inLocationUrl
)){
try
{
String
reelId
=
task
.
getBarcode
();
String
deviceId
=
task
.
getCid
();
String
location
=
task
.
getPosName
();
String
status
=
"Y"
;
log
.
info
(
"物料入库储位接口deviceId="
+
deviceId
+
",reelId="
+
reelId
+
",location="
+
location
+
","
+
status
);
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
paramMap
.
put
(
"deviceId"
,
deviceId
);
paramMap
.
put
(
"location"
,
location
);
paramMap
.
put
(
"reelId"
,
reelId
);
paramMap
.
put
(
"status"
,
status
);
String
result
=
HttpHelper
.
postJson
(
inLocationUrl
,
paramMap
);
log
.
info
(
deviceId
+
"物料入库储位接口返回:"
+
result
);
}
catch
(
ApiException
e
)
{
log
.
error
(
"调用物料入库储位接口出错"
,
e
);
}
}
}
/**
* 1、设备报警接口
* 简要描述
* 此接口由泰治提供,当设备发生报警时,设备端调用此接口,推送报 警。
* @param deviceId
* @param alarmMsg
*/
public
static
void
onDeviceAlarm
(
String
deviceId
,
String
alarmMsg
)
{
String
deviceAlarmUrl
=
config
.
deviceAlarmUrl
;
if
(
Strings
.
isNotBlank
(
deviceAlarmUrl
)){
try
{
log
.
info
(
"调用设备报警接口deviceId="
+
deviceId
+
",alarmInfo="
+
alarmMsg
);
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
paramMap
.
put
(
"deviceId"
,
deviceId
);
String
encodeMsg
=
alarmMsg
;
// try{
// encodeMsg = URLEncoder.encode(alarmMsg, "UTF-8");
// }catch (Exception e){
// log.info("转义出错",e);
// }
paramMap
.
put
(
"alarmInfo"
,
encodeMsg
);
String
dateTimeStr
=
DateUtil
.
toDateString
(
new
Date
(),
"yyyy-MM-dd HH:mm:ss"
);
paramMap
.
put
(
"alarmTime"
,
dateTimeStr
);
paramMap
.
put
(
"remark"
,
""
);
String
result
=
HttpHelper
.
postJson
(
deviceAlarmUrl
,
paramMap
);
log
.
info
(
deviceId
+
"报警接口返回:"
+
result
);
}
catch
(
ApiException
e
)
{
log
.
error
(
"调用设备报警接口出错"
,
e
);
}
}
}
@Override
public
Barcode
resolveBarcode
(
CodeValidateParam
param
)
throws
ValidateException
{
return
null
;
}
/**
* 4 此接口由泰治提供,物料入库前,设备调用此接口接收信息判定物料 能否入库。
* @param barcode
* @return
* @throws ValidateException
*/
@Override
public
Barcode
canPutIn
(
Barcode
barcode
)
throws
ValidateException
{
String
inAssertUrl
=
config
.
inAssertUrl
;
if
(
Strings
.
isNotBlank
(
inAssertUrl
)){
try
{
String
reelId
=
barcode
.
getBarcode
();
int
w
=
barcode
.
getPlateSize
();
int
h
=
barcode
.
getHeight
();
log
.
info
(
"调用物料能否入库接口reelId="
+
reelId
+
",w="
+
w
+
",h="
+
h
);
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
paramMap
.
put
(
"deviceId"
,
"T01"
);
paramMap
.
put
(
"reelId"
,
reelId
);
paramMap
.
put
(
"w"
,
w
+
""
);
paramMap
.
put
(
"h"
,
h
+
""
);
paramMap
.
put
(
"remark"
,
""
);
String
result
=
HttpHelper
.
postJson
(
inAssertUrl
,
paramMap
);
log
.
info
(
reelId
+
"入库验证接口返回:"
+
result
);
Map
<
String
,
Object
>
resultMap
=
JsonUtil
.
toMap
(
result
);
String
isStorage
=
resultMap
.
get
(
"isStorage"
).
toString
();
if
(!
isStorage
.
equalsIgnoreCase
(
"Y"
)){
String
msg
=
resultMap
.
get
(
"msg"
).
toString
();
throw
new
ValidateException
(
"smfcore.taizhi.inAssert.error"
,
"MES验证失败:"
+
msg
);
}
return
barcode
;
}
catch
(
ApiException
e
)
{
log
.
error
(
"调用入库验证接口出错"
,
e
);
throw
new
ValidateException
(
"smfcore.taizhi.inAssert.error"
,
"MES验证失败:"
+
e
.
getMessage
());
}
}
return
null
;
}
@Override
public
boolean
canCheckout
(
Barcode
barcode
)
throws
ValidateException
{
return
false
;
}
@Override
public
boolean
isEnable
()
{
return
true
;
}
/**
* 3、设备状态推送接口
*/
public
static
void
deviceStatusChange
(
String
deviceId
,
int
taiZhiStatus
)
{
String
deviceStatusUrl
=
config
.
deviceStatusUrl
;
if
(
Strings
.
isNotBlank
(
deviceStatusUrl
))
{
try
{
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
paramMap
.
put
(
"deviceId"
,
deviceId
);
paramMap
.
put
(
"status"
,
taiZhiStatus
+
""
);
String
dateTimeStr
=
DateUtil
.
toDateString
(
new
Date
(),
"yyyy-MM-dd HH:mm:ss"
);
paramMap
.
put
(
"sendTime"
,
dateTimeStr
);
paramMap
.
put
(
"remark"
,
""
);
String
result
=
HttpHelper
.
postJson
(
deviceStatusUrl
,
paramMap
);
}
catch
(
ApiException
e
)
{
log
.
error
(
"调用设备状态推送接口"
,
e
);
}
}
}
/**
* 7、物料出库任务状态接口
*/
public
static
void
orderStatusChange
(
LiteOrder
liteOrder
){
String
outStatusUrl
=
config
.
outStatusUrl
;
if
(
Strings
.
isNotBlank
(
outStatusUrl
))
{
try
{
//"status": "任务状态:Created=已创建; Executed=开始执行; Completed= 已完成; Closed=已关闭",
String
orderStatus
=
""
;
if
(
liteOrder
.
isTaskFinished
()){
orderStatus
=
"Completed"
;
}
else
if
(
liteOrder
.
isClosed
()){
orderStatus
=
"Closed"
;
}
else
if
(
liteOrder
.
isNew
()){
orderStatus
=
"Created"
;
}
else
{
orderStatus
=
"Executed"
;
}
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
paramMap
.
put
(
"jobNo"
,
liteOrder
.
getOrderNo
());
paramMap
.
put
(
"status"
,
orderStatus
);
paramMap
.
put
(
"deviceId"
,
liteOrder
.
getLine
());
paramMap
.
put
(
"total"
,
liteOrder
.
getTaskReelCount
());
paramMap
.
put
(
"count"
,
liteOrder
.
getFinishedReelCount
());
log
.
info
(
"调用物料出库任务状态接口jobNo="
+
liteOrder
.
getOrderNo
()+
",orderStatus="
+
orderStatus
+
",total="
+
liteOrder
.
getTaskReelCount
()+
"count"
+
liteOrder
.
getTaskReelCount
());
String
result
=
HttpHelper
.
postJson
(
outStatusUrl
,
paramMap
);
}
catch
(
ApiException
e
)
{
log
.
error
(
"调用物料出库任务状态接口"
,
e
);
}
}
}
/**
* 9、仓储温湿度接口
*/
public
static
void
tempEnv
(
String
deviceId
,
String
temp
,
String
humidity
){
String
storageEnvUrl
=
config
.
storageEnvUrl
;
if
(
Strings
.
isNotBlank
(
storageEnvUrl
)){
try
{
//log.info("调用温湿度接口deviceId="+deviceId+",alarmInfo="+alarmMsg);
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
paramMap
.
put
(
"deviceId"
,
deviceId
);
paramMap
.
put
(
"temp"
,
temp
);
paramMap
.
put
(
"humidity"
,
humidity
);
String
dateTimeStr
=
DateUtil
.
toDateString
(
new
Date
(),
"yyyy-MM-dd HH:mm:ss"
);
paramMap
.
put
(
"sendTime"
,
dateTimeStr
);
paramMap
.
put
(
"N2"
,
""
);
String
result
=
HttpHelper
.
postJson
(
storageEnvUrl
,
paramMap
);
//log.info(deviceId + "报警接口返回:" +result);
}
catch
(
ApiException
e
)
{
log
.
error
(
"调用温湿度接口出错"
,
e
);
}
}
}
}
src/main/java/com/neotel/smfcore/taizhi/TaiZhiConfig.java
0 → 100644
查看文件 @
11a719d
package
com
.
neotel
.
smfcore
.
taizhi
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Service
;
import
javax.annotation.PostConstruct
;
@Service
@Slf4j
public
class
TaiZhiConfig
{
//读取配置中的地址
@Value
(
"${taizhi.url.deviceAlarm:}"
)
public
String
deviceAlarmUrl
=
""
;
@Value
(
"${taizhi.url.deviceStatus:}"
)
public
String
deviceStatusUrl
=
""
;
/**
* 入库验证地址
*/
@Value
(
"${taizhi.url.inAssert:}"
)
public
String
inAssertUrl
=
""
;
/**
* 入库完成通知接口
*/
@Value
(
"${taizhi.url.inLocation:}"
)
public
String
inLocationUrl
=
""
;
@Value
(
"${taizhi.url.outStatus:}"
)
public
String
outStatusUrl
=
""
;
/**
* 出库完成通知接口
*/
@Value
(
"${taizhi.url.outDone:}"
)
public
String
outDoneUrl
=
""
;
/**
* 仓储温湿度接口
*/
@Value
(
"${taizhi.url.storageEnv:}"
)
public
String
storageEnvUrl
=
""
;
}
src/main/java/com/neotel/smfcore/taizhi/TaiZhiRestController.java
0 → 100644
查看文件 @
11a719d
package
com
.
neotel
.
smfcore
.
taizhi
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.alibaba.fastjson.JSONArray
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
com.neotel.smfcore.common.bean.ResultBean
;
import
com.neotel.smfcore.common.csv.CsvReader
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.utils.DateUtil
;
import
com.neotel.smfcore.common.utils.FileUtil
;
import
com.neotel.smfcore.common.utils.SecurityUtils
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.device.bean.StatusBean
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.haman.bean.BINPosInfo
;
import
com.neotel.smfcore.core.haman.rest.dto.BINPosDto
;
import
com.neotel.smfcore.core.haman.rest.mapstruct.BINPosMapper
;
import
com.neotel.smfcore.core.order.LiteOrderCache
;
import
com.neotel.smfcore.core.order.service.manager.ILiteOrderManager
;
import
com.neotel.smfcore.core.order.service.po.LiteOrder
;
import
com.neotel.smfcore.core.order.service.po.LiteOrderItem
;
import
com.neotel.smfcore.core.storage.service.manager.IStoragePosManager
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
com.neotel.smfcore.core.system.util.DevicesStatusUtil
;
import
com.neotel.smfcore.core.system.util.TaskService
;
import
com.neotel.smfcore.security.TokenProvider
;
import
com.neotel.smfcore.security.annotation.AnonymousAccess
;
import
com.neotel.smfcore.security.bean.FileProperties
;
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
org.springframework.web.multipart.MultipartFile
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.File
;
import
java.text.DecimalFormat
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
@Slf4j
@RestController
@RequiredArgsConstructor
@Api
(
tags
=
"泰治接口"
)
@RequestMapping
(
"api/taizhi"
)
public
class
TaiZhiRestController
{
@Autowired
private
ILiteOrderManager
liteOrderManager
;
@Autowired
IStoragePosManager
storagePosManager
;
@Autowired
TaskService
taskService
;
@Autowired
private
LiteOrderCache
liteOrderCache
;
@Autowired
private
DataCache
dataCache
;
@ApiOperation
(
"2 设备状态查询接口"
)
@PostMapping
(
value
=
"/device/status/search"
)
@AnonymousAccess
public
Map
<
String
,
Object
>
statusSearch
(
@RequestBody
Map
<
String
,
String
>
bodyParamMap
)
{
String
deviceId
=
bodyParamMap
.
get
(
"deviceId"
);
Map
<
String
,
Object
>
resultMap
=
Maps
.
newHashMap
();
resultMap
.
put
(
"deviceId"
,
deviceId
);
//deviceId string 设备 ID: 贴标机:L01;点料机:C01;料塔 1-1:T01-1;料塔 1-2:T01-2;料塔 1- 3;T01-3;料塔 1-4;T01-4;料塔 1-5;T01-5;料塔 1-6;T01-6;料仓:B01
//status string 设备状态:0:离线;1:空闲;2:急停;3:故障;4:工作中;5:调试中
StatusBean
statusBean
=
DevicesStatusUtil
.
getStatusBean
(
deviceId
);
int
status
=
0
;
if
(
statusBean
!=
null
){
status
=
statusBean
.
getTaiZhiStatus
();
}
resultMap
.
put
(
"status"
,
status
+
""
);
return
resultMap
;
}
/**
*6、物料出库任务接口
* "userId": "出库人员", "jobNo": "任务编号", "jobType": "任务种类", "deviceId": "设备 ID", "count": "物料数量", "reelIds": "物料 ids"
*/
@ApiOperation
(
"物料出库任务接口"
)
@PostMapping
(
value
=
"/matter/out"
)
@AnonymousAccess
public
Map
<
String
,
Object
>
matterOut
(
@RequestBody
Map
<
String
,
Object
>
paramMap
)
{
log
.
info
(
"接收到TaiZhi物料出库任务:"
+
paramMap
.
toString
());
String
jobNo
=
paramMap
.
get
(
"jobNo"
).
toString
();
LiteOrder
dbOrder
=
liteOrderManager
.
findByOrderNo
(
jobNo
);
if
(
dbOrder
!=
null
){
Map
<
String
,
Object
>
resultMap
=
Maps
.
newHashMap
();
resultMap
.
put
(
"code"
,
"501"
);
log
.
info
(
"工单号:"
+
jobNo
+
"对应的工单已存在"
);
resultMap
.
put
(
"msg"
,
"工单号:"
+
jobNo
+
"对应的工单已存在"
);
return
resultMap
;
}
String
deviceId
=
paramMap
.
get
(
"deviceId"
).
toString
();
List
<
LiteOrderItem
>
liteOrderItems
=
Lists
.
newArrayList
();
JSONArray
reelIds
=
(
JSONArray
)
paramMap
.
get
(
"reelIds"
);
for
(
Object
reelId
:
reelIds
)
{
LiteOrderItem
item
=
new
LiteOrderItem
();
item
.
setRi
(
reelId
.
toString
());
item
.
setOrderNo
(
jobNo
);
item
.
setNeedNum
(
1
);
liteOrderItems
.
add
(
item
);
}
//jobType 任务种类:M 常规发料;P 改机发料(优先级最高)
String
jobType
=
paramMap
.
get
(
"jobType"
).
toString
();
LiteOrder
liteOrder
=
new
LiteOrder
(
jobNo
,
liteOrderItems
);
liteOrder
.
setJobType
(
jobType
);
liteOrder
.
setLine
(
deviceId
);
liteOrder
=
liteOrderManager
.
createWithItems
(
liteOrder
);
log
.
info
(
"创建工单:"
+
jobNo
);
TaiZhiApi
.
orderStatusChange
(
liteOrder
);
boolean
outBom
=
false
;
liteOrderCache
.
checkOutLiteOrder
(
liteOrder
.
getOrderNo
(),
outBom
);
Map
<
String
,
Object
>
resultMap
=
Maps
.
newHashMap
();
resultMap
.
put
(
"code"
,
"200"
);
resultMap
.
put
(
"msg"
,
"OK"
);
return
resultMap
;
}
// private void outOrder(LiteOrder liteOrder){
//
// }
/**
* 10、异常出库接口
*/
@ApiOperation
(
"异常出库接口"
)
@PostMapping
(
value
=
"/exception/out"
)
@AnonymousAccess
public
Map
<
String
,
Object
>
exceptionOut
(
@RequestBody
Map
<
String
,
String
>
bodyParamMap
)
{
String
reelId
=
bodyParamMap
.
get
(
"reelId"
);
log
.
info
(
"收到异常出库接口指令:"
+
bodyParamMap
);
String
code
=
"200"
;
String
msg
=
"ok"
;
StoragePos
storagePos
=
storagePosManager
.
getByBarcode
(
reelId
);
if
(
storagePos
!=
null
)
{
try
{
log
.
info
(
"开始执行接口清除库位["
+
storagePos
.
getPosName
()
+
"]"
+
reelId
);
//Barcode barcode = storagePos.getBarcode();
taskService
.
addTaskToFinished
(
storagePos
,
null
,
"MES-clear"
);
}
catch
(
Exception
e
)
{
log
.
error
(
"异常出库接口指令执行出错"
,
e
);
code
=
"500"
;
msg
=
"内部错误"
;
}
}
else
{
code
=
"401"
;
msg
=
"库存中不存在reelId="
+
reelId
+
"的物料"
;
}
Map
<
String
,
Object
>
resultMap
=
Maps
.
newHashMap
();
resultMap
.
put
(
"code"
,
code
);
resultMap
.
put
(
"msg"
,
msg
);
return
resultMap
;
}
/**
* 11、出库任务中途取消接口
*/
@ApiOperation
(
"11、出库任务中途取消接口"
)
@PostMapping
(
value
=
"/out/cancel"
)
@AnonymousAccess
public
Map
<
String
,
Object
>
outCancel
(
@RequestBody
Map
<
String
,
String
>
bodyParamMap
)
{
String
reelId
=
bodyParamMap
.
get
(
"reelId"
);
String
deviceId
=
bodyParamMap
.
get
(
"deviceId"
);
log
.
info
(
"收到出库任务中途取消接口:"
+
bodyParamMap
);
List
<
DataLog
>
allTask
=
taskService
.
getAllTasks
();
DataLog
cancelTask
=
null
;
for
(
DataLog
dataLog
:
allTask
)
{
if
(
dataLog
.
isCheckOutTask
()
&&
dataLog
.
getBarcode
().
equals
(
reelId
)){
cancelTask
=
dataLog
;
break
;
}
}
String
code
=
"200"
;
String
msg
=
"ok"
;
if
(
cancelTask
!=
null
){
if
(
cancelTask
.
isWait
()){
taskService
.
cancelTask
(
cancelTask
.
getId
());
log
.
info
(
"MES接口取消等待中的任务:"
+
reelId
);
}
else
{
code
=
"301"
;
msg
=
"出库任务取消失败:"
+
reelId
+
" 出库任务正在执行"
;
log
.
info
(
msg
);
}
}
else
{
code
=
"404"
;
msg
=
"未找到要取消的出库任务:"
+
reelId
;
log
.
info
(
msg
);
}
Map
<
String
,
Object
>
resultMap
=
Maps
.
newHashMap
();
resultMap
.
put
(
"code"
,
code
);
resultMap
.
put
(
"msg"
,
msg
);
return
resultMap
;
}
/**
* 12、物料储位手动同步接口(即设备库 存信息查询)
*/
@ApiOperation
(
"12、物料储位手动同步接口"
)
@PostMapping
(
value
=
"/location/sync"
)
@AnonymousAccess
public
Map
<
String
,
Object
>
locationSync
(
@RequestBody
Map
<
String
,
String
>
bodyParamMap
)
{
String
deviceId
=
bodyParamMap
.
get
(
"deviceId"
);
log
.
info
(
"物料储位手动同步接口:"
+
bodyParamMap
);
Map
<
String
,
Object
>
resultMap
=
Maps
.
newHashMap
();
String
statusCode
=
"200"
;
String
msg
=
"ok"
;
List
<
Map
<
String
,
String
>>
data
=
Lists
.
newArrayList
();
Storage
storage
=
dataCache
.
getStorage
(
deviceId
);
if
(
storage
!=
null
){
List
<
StoragePos
>
posList
=
storagePosManager
.
findNotEmptyByStorageId
(
storage
.
getId
());
for
(
StoragePos
pos
:
posList
)
{
Map
<
String
,
String
>
reelData
=
Maps
.
newHashMap
();
String
reelId
=
pos
.
getBarcode
().
getBarcode
();
reelData
.
put
(
"reelId"
,
reelId
);
reelData
.
put
(
"location"
,
pos
.
getPosName
());
String
putInDataStr
=
DateUtil
.
toDateString
(
pos
.
getBarcode
().
getPutInDate
(),
"yyyy-MM-dd HH:mm:ss"
);
reelData
.
put
(
"checkInTime"
,
putInDataStr
);
String
status
=
"S"
;
DataLog
task
=
taskService
.
findTask
(
reelId
);
if
(
task
!=
null
){
status
=
"W"
;
}
reelData
.
put
(
"status"
,
status
);
data
.
add
(
reelData
);
}
}
resultMap
.
put
(
"statusCode"
,
statusCode
);
resultMap
.
put
(
"deviceId"
,
deviceId
);
resultMap
.
put
(
"data"
,
data
);
resultMap
.
put
(
"msg"
,
msg
);
return
resultMap
;
}
/**
* 13、库存清理接口
* 此接口由设备提供,当需要清理库存数据时,泰治可调用此接口清理 物料库存(设备在清除前要判断该储位是否有实物料盘,有料盘则返 回清除失败,需先将料盘从储位取出)。
*/
@ApiOperation
(
"13、库存清理接口"
)
@PostMapping
(
value
=
"/stock/clear"
)
@AnonymousAccess
public
Map
<
String
,
Object
>
stockClear
(
@RequestBody
Map
<
String
,
String
>
bodyParamMap
)
{
String
deviceId
=
bodyParamMap
.
get
(
"deviceId"
);
String
location
=
bodyParamMap
.
get
(
"location"
);
String
reelId
=
bodyParamMap
.
get
(
"reelId"
);
log
.
info
(
"库存清理接口:"
+
bodyParamMap
);
Map
<
String
,
Object
>
resultMap
=
Maps
.
newHashMap
();
String
code
=
"200"
;
String
msg
=
"ok"
;
StoragePos
pos
=
storagePosManager
.
getByBarcode
(
reelId
);
if
(
pos
!=
null
){
//物料在设备中,清理失败
code
=
"-1"
;
msg
=
"清除失败,料盘在库位中"
;
}
resultMap
.
put
(
"code"
,
code
);
resultMap
.
put
(
"msg"
,
msg
);
return
resultMap
;
}
}
src/main/resources/config/application-prod.yml
查看文件 @
11a719d
taizhi
:
#url:
inAssert
:
http://172.26.13.211:9030/device/alarm
deviceAlarm
:
http://172.26.13.211:9030/device/alarm
# 登录相关配置
...
...
src/main/resources/config/application.yml
查看文件 @
11a719d
taizhi
:
url
:
deviceAlarm
:
http://172.26.13.211:9030/device/alarm
deviceStatus
:
http://172.26.13.211:9030/device/status
inAssert
:
http://172.26.13.211:9030/matter/in/assert
inLocation
:
http://172.26.13.211:9030/matter/in/location
outStatus
:
http://172.26.13.211:9030/matter/out/status
outDone
:
http://172.26.13.211:9030/matter/out/done
storageEnv
:
http://172.26.13.211:9030/storage/env
server
:
port
:
8800
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论