Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit f13d7263
由
sunke
编写于
2022-09-07 09:15:48 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
1 数据库连接池配置
2 优化挑料速度
1 个父辈
211a0cdc
隐藏空白字符变更
内嵌
并排
正在显示
20 个修改的文件
包含
1036 行增加
和
886 行删除
src/main/java/com/neotel/smfcore/common/base/AbstractBaseDao.java
src/main/java/com/neotel/smfcore/common/init/DataInitManager.java
src/main/java/com/neotel/smfcore/common/utils/DateUtil.java
src/main/java/com/neotel/smfcore/core/barcode/service/manager/IComponentManager.java
src/main/java/com/neotel/smfcore/core/barcode/service/manager/impl/ComponentManagerImpl.java
src/main/java/com/neotel/smfcore/core/device/handler/impl/NLPShelfHandler.java
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
src/main/java/com/neotel/smfcore/core/order/rest/OrderShortageController.java
src/main/java/com/neotel/smfcore/core/outList/util/OutListCache.java
src/main/java/com/neotel/smfcore/core/storage/service/manager/IStoragePosManager.java
src/main/java/com/neotel/smfcore/core/storage/service/manager/impl/StoragePosManagerImpl.java
src/main/java/com/neotel/smfcore/hella/handler/HellaApiHandler.java
src/main/java/com/neotel/smfcore/hella/handler/HellaServiceHandler.java
src/main/java/com/neotel/smfcore/hella/tcp/HellaTcpClient.java
src/main/java/com/neotel/smfcore/hikvision/HikApi.java
src/main/java/com/neotel/smfcore/hikvision/HikvisionApiController.java
src/main/java/com/neotel/smfcore/security/config/CustomMongoProperties.java
src/main/java/com/neotel/smfcore/security/config/MongoDbConfig.java
src/main/resources/config/application.yml
src/main/resources/log4j2-spring.xml
src/main/java/com/neotel/smfcore/common/base/AbstractBaseDao.java
查看文件 @
f13d726
...
...
@@ -4,6 +4,7 @@ import com.mongodb.client.result.DeleteResult;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.data.domain.Page
;
import
org.springframework.data.domain.PageRequest
;
import
org.springframework.data.domain.Pageable
;
...
...
@@ -23,6 +24,7 @@ import java.util.regex.Pattern;
*/
public
abstract
class
AbstractBaseDao
implements
IBaseDao
{
@Autowired
@Qualifier
(
"mongoTemplate"
)
private
MongoTemplate
mongoTemplate
;
private
final
static
int
DEFAULT_PAGE_SIZE
=
10
;
protected
final
transient
Logger
log
=
LogManager
.
getLogger
(
getClass
());
...
...
src/main/java/com/neotel/smfcore/common/init/DataInitManager.java
查看文件 @
f13d726
...
...
@@ -45,7 +45,7 @@ public class DataInitManager {
MainTimer
mainTimer
;
//@Value("${menu.show}")
private
String
[]
menuShowList
=
new
String
[]{
"mslOut"
};
private
String
[]
menuShowList
=
new
String
[]{
/*"commonIn","returnIn","cutIn"*/
};
//@Value("${menu.hide}")
private
String
[]
menuHideList
=
new
String
[]{};
...
...
@@ -125,8 +125,6 @@ public class DataInitManager {
private
Map
<
String
,
Menu
>
getAllMenuMap
()
{
List
<
Menu
>
menus
=
new
ArrayList
<
Menu
>();
Map
<
String
,
Menu
>
functionMenuMap
=
new
HashMap
<>();
//物料管理:工单出库,查找出库(UID出库,PN出库),物料标签,料盒操作,出库策略,工单设置
...
...
@@ -135,22 +133,27 @@ public class DataInitManager {
Menu
out
=
Menu
.
CreatePMenu
(
"查找出库"
,
20
,
"searchOut"
,
2
,
"findOut"
,
poutOut
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"checkOut"
,
"UID出库"
,
1
,
"singleOuput"
,
"neolight/singleOuput/index"
,
""
,
0
,
"export1"
,
functionMenuMap
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"tacticsOuput"
,
"PN出库"
,
1
,
"tacticsOuput"
,
"neolight/tacticsOuput/index"
,
""
,
0
,
"tacticsOuput"
,
functionMenuMap
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"mslOut"
,
"湿敏管理"
,
1
,
"mslOut"
,
"neolight/mslOut/index"
,
""
,
0
,
"tacticsOuput"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"mslOut"
,
"湿敏管理"
,
1
,
"mslOut"
,
"neolight/mslOut/index"
,
""
,
0
,
"tacticsOuput"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"posOutput"
,
"库位出库"
,
1
,
"posOutput"
,
"system/posOutput/index"
,
""
,
0
,
"swagger"
,
functionMenuMap
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"posOutput"
,
"库位出库"
,
1
,
"posOutput"
,
"system/posOutput/index"
,
""
,
0
,
"swagger"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"labelOuput"
,
"物料标签"
,
1
,
"labelOuput"
,
"neolight/labelOuput/index"
,
""
,
0
,
"mgroup"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"materialBox"
,
"料盒操作"
,
1
,
"materialBox"
,
"neolight/materialBox/index"
,
""
,
0
,
"mIbox"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"outSetting"
,
"出库策略"
,
1
,
"outSetting"
,
"system/outSetting/index"
,
""
,
0
,
"outSet"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"inList"
,
"入库单"
,
1
,
"inList"
,
"system/inList/index"
,
""
,
0
,
"headIcon"
,
functionMenuMap
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"labelOuput"
,
"物料标签"
,
1
,
"labelOuput"
,
"neolight/labelOuput/index"
,
""
,
0
,
"mgroup"
,
functionMenuMap
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"materialBox"
,
"料盒操作"
,
1
,
"materialBox"
,
"neolight/materialBox/index"
,
""
,
0
,
"mIbox"
,
functionMenuMap
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"outSetting"
,
"出库策略"
,
1
,
"outSetting"
,
"system/outSetting/index"
,
""
,
0
,
"outSet"
,
functionMenuMap
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"inList"
,
"入库单"
,
1
,
"inList"
,
"system/inList/index"
,
""
,
0
,
"headIcon"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"dumpWarehousing"
,
"转储入库"
,
1
,
"dumpWarehousing"
,
"system/dumpWarehousing/index"
,
""
,
0
,
"dumpWarehousing"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"singleDiskWarehousing"
,
"单盘入库"
,
1
,
"singleDiskWarehousing"
,
"system/singleDiskWarehousing/index"
,
""
,
0
,
"singleDiskWarehousing"
,
functionMenuMap
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"dumpWarehousing"
,
"转储入库"
,
1
,
"dumpWarehousing"
,
"system/dumpWarehousing/index"
,
""
,
0
,
"dumpWarehousing"
,
functionMenuMap
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"singleDiskWarehousing"
,
"单盘入库"
,
1
,
"singleDiskWarehousing"
,
"system/singleDiskWarehousing/index"
,
""
,
0
,
"singleDiskWarehousing"
,
functionMenuMap
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"sluggishMaterials"
,
"呆滞物料"
,
1
,
"sluggishMaterials"
,
"system/sluggishMaterials/index"
,
""
,
0
,
"sMaterial"
,
functionMenuMap
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"safetyInventory"
,
"安全库存"
,
1
,
"safetyInventory"
,
"system/safetyInventory/index"
,
""
,
0
,
"safeInventory"
,
functionMenuMap
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"outList"
,
"转储出库"
,
1
,
"outList"
,
"system/outList/index"
,
""
,
0
,
"outList"
,
functionMenuMap
);
addNewFunctionMenu
(
out
,
new
ArrayList
<
Menu
>(),
1
,
"orderSet"
,
"齐套"
,
1
,
"orderSet"
,
"system/orderSet/index"
,
""
,
0
,
"outS"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"commonIn"
,
"普通入库"
,
1
,
"commonIn"
,
"system/singleStockIn/index"
,
""
,
0
,
"singleDiskWarehousing"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"returnIn"
,
"退料入库"
,
1
,
"returnIn"
,
"system/singleStockIn/index"
,
""
,
0
,
"singleDiskWarehousing"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"cutIn"
,
"截料入库"
,
1
,
"cutIn"
,
"system/singleStockIn/index"
,
""
,
0
,
"singleDiskWarehousing"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"sluggishMaterials"
,
"呆滞物料"
,
1
,
"sluggishMaterials"
,
"system/sluggishMaterials/index"
,
""
,
0
,
"sMaterial"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"safetyInventory"
,
"安全库存"
,
1
,
"safetyInventory"
,
"system/safetyInventory/index"
,
""
,
0
,
"safeInventory"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"outList"
,
"转储出库"
,
1
,
"outList"
,
"system/outList/index"
,
""
,
0
,
"outList"
,
functionMenuMap
);
addNewFunctionMenu
(
poutOut
,
new
ArrayList
<
Menu
>(),
1
,
"orderSet"
,
"齐套"
,
1
,
"orderSet"
,
"system/orderSet/index"
,
""
,
0
,
"outS"
,
functionMenuMap
);
Menu
orderM
=
Menu
.
CreatePMenu
(
"工单管理"
,
20
,
"orderManager"
,
2
,
"orderManager"
,
null
);
addNewFunctionMenu
(
orderM
,
new
ArrayList
<
Menu
>(),
1
,
"billworkOrder"
,
"工单"
,
1
,
"billworkOrder"
,
"neolight/billworkOrder/index"
,
""
,
0
,
"orderOut"
,
functionMenuMap
);
...
...
@@ -245,24 +248,12 @@ public class DataInitManager {
if
(
dbMenus
.
isEmpty
()){
log
.
info
(
"创建默认菜单..."
);
menuListToShow
=
new
String
[]{
"lockMaterial"
,
//设备看板
"singleOuput"
,
"tacticsOuput"
,
"outSetting"
,
"componentParts"
,
"barcode"
,
"barcodeSetting"
,
"taskLog"
,
//"orderSetting",//工单设置
"inOutData"
,
//报表->出入库
"inventory"
,
//报表->库存
"bunker"
,
//设备管理
"storagePos"
,
//库位管理
//"sysSetting", //系统设置
"peoples"
,
//用户管理
"role"
//角色管理
"searchOut"
,
"singleOuput"
,
"tacticsOuput"
,
"mslOut"
,
"inList"
,
"dumpWarehousing"
,
"commonIn"
,
"returnIn"
,
"cutIn"
,
"sluggishMaterials"
,
"safetyInventory"
,
"outList"
,
"orderSet"
,
"billworkOrder"
,
"reelOut"
,
"orderSheet"
,
"orderShortageOut"
,
"orderShortageSheet"
,
"productionLineReple"
,
"productionLineOut"
,
"componentParts"
,
"barcode"
,
"barcodeSetting"
,
"taskLog"
,
"message"
,
"interfaceException"
,
"bunker"
,
"storagePos"
,
"peoples"
,
"role"
,
"about"
};
}
...
...
src/main/java/com/neotel/smfcore/common/utils/DateUtil.java
查看文件 @
f13d726
...
...
@@ -80,6 +80,9 @@ public class DateUtil {
public
static
Date
toDate
(
String
strDate
,
String
aMask
)
throws
ParseException
{
if
(
ObjectUtil
.
isEmpty
(
strDate
)){
return
null
;
}
if
(
ObjectUtil
.
isEmpty
(
aMask
)){
aMask
=
"yyyy-MM-dd HH:mm:ss"
;
}
...
...
src/main/java/com/neotel/smfcore/core/barcode/service/manager/IComponentManager.java
查看文件 @
f13d726
...
...
@@ -7,6 +7,7 @@ import org.springframework.data.mongodb.core.query.Query;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.util.Collection
;
import
java.util.List
;
import
java.util.Set
;
...
...
@@ -19,6 +20,8 @@ public interface IComponentManager extends IBaseManager<Component> {
Component
saveComponent
(
Component
resources
);
List
<
Component
>
findByPN
(
Collection
<
String
>
pnList
);
void
deleteComponents
(
Set
<
String
>
ids
);
int
saveComponentList
(
List
<
Component
>
componentList
);
...
...
src/main/java/com/neotel/smfcore/core/barcode/service/manager/impl/ComponentManagerImpl.java
查看文件 @
f13d726
...
...
@@ -98,6 +98,13 @@ public class ComponentManagerImpl implements IComponentManager {
}
@Override
public
List
<
Component
>
findByPN
(
Collection
<
String
>
pnList
)
{
Query
query
=
new
Query
(
Criteria
.
where
(
"partNumber"
).
in
(
pnList
));
List
<
Component
>
components
=
componentDao
.
findByQuery
(
query
);
return
components
;
}
@Override
public
void
deleteComponents
(
Set
<
String
>
ids
)
{
Query
query
=
new
Query
(
Criteria
.
where
(
"id"
).
in
(
ids
));
List
<
Component
>
components
=
componentDao
.
findByQuery
(
query
);
...
...
src/main/java/com/neotel/smfcore/core/device/handler/impl/NLPShelfHandler.java
查看文件 @
f13d726
...
...
@@ -40,6 +40,8 @@ import org.springframework.web.bind.annotation.*;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpSession
;
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.locks.ReentrantLock
;
@Api
(
tags
=
"SHELF: NLP感应料架"
)
@RestController
...
...
@@ -129,6 +131,8 @@ public class NLPShelfHandler extends BaseDeviceHandler{
return
statusBean
;
}
private
static
Map
<
String
,
Boolean
>
processMap
=
new
ConcurrentHashMap
<>();
/**
* 客户端sensor变化
*/
...
...
@@ -141,7 +145,17 @@ public class NLPShelfHandler extends BaseDeviceHandler{
if
(
storage
==
null
){
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.shelfNotExist"
,
"{0}对应的料架不存在"
,
new
String
[]{
cid
}
);
}
synchronized
(
storage
){
synchronized
(
storage
){
Boolean
process
=
processMap
.
get
(
cid
);
if
(
process
==
null
){
processMap
.
put
(
cid
,
true
);
}
else
{
String
msg
=
"料架["
+
cid
+
"]的上一次请求还未完成,忽略本次请求"
;
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.shelfNotExist"
,
msg
);
}
}
try
{
//实际信号有料,数据库无信息
String
[]
hasReelPosErrorList
=
request
.
getParameterValues
(
"hasReelPosErrorList"
);
//实际信号无料,数据库有信息
...
...
@@ -159,9 +173,9 @@ public class NLPShelfHandler extends BaseDeviceHandler{
if
(
noReelPosErrorList
.
length
>
0
){
//log.info("开始检测noReelPosErrorList");
for
(
String
noReelPosName
:
noReelPosErrorList
)
{
if
(
usedPosNameList
.
contains
(
noReelPosName
)){
if
(
!
usedPosNameList
.
contains
(
noReelPosName
)){
ngToOk
.
add
(
noReelPosName
);
log
.
info
(
"sensorChange 客户端上传 noReelPosErrorList 库位["
+
noReelPosName
+
"]数据库无物料,放入ngToOk"
);
log
.
info
(
cid
+
"sensorChange 客户端上传 noReelPosErrorList 库位["
+
noReelPosName
+
"]数据库无物料,放入ngToOk"
);
}
}
}
...
...
@@ -178,12 +192,12 @@ public class NLPShelfHandler extends BaseDeviceHandler{
String
[]
hasReelPosList
=
request
.
getParameterValues
(
"hasReelPosList"
);
if
(
hasReelPosList
!=
null
){
log
.
info
(
"开始检测hasReelPosList"
);
log
.
info
(
cid
+
"开始检测hasReelPosList"
);
Set
<
String
>
disabledPosNameSet
=
dataCache
.
getDisabledPosNameSet
();
List
<
String
>
newList
=
new
ArrayList
<>();
for
(
String
posName
:
hasReelPosList
)
{
if
(
disabledPosNameSet
.
contains
(
posName
)){
log
.
info
(
"sensorChange hasReelPosList ["
+
posName
+
"]库位被禁用,忽略"
);
log
.
info
(
cid
+
"sensorChange hasReelPosList ["
+
posName
+
"]库位被禁用,忽略"
);
continue
;
}
newList
.
add
(
posName
);
...
...
@@ -193,20 +207,20 @@ public class NLPShelfHandler extends BaseDeviceHandler{
//入库的库位列表
if
(
hasReelPosList
.
length
>
1
){
String
msg
=
"不可同时放入多盘物料:"
+
String
.
join
(
","
,
hasReelPosList
);
String
msg
=
cid
+
"不可同时放入多盘物料:"
+
String
.
join
(
","
,
hasReelPosList
);
log
.
error
(
msg
);
for
(
String
posStr
:
hasReelPosList
)
{
inNgList
.
add
(
posStr
);
}
}
else
if
(
hasReelPosList
.
length
==
1
){
log
.
info
(
"开始检测执行入库
"
);
log
.
info
(
cid
+
"开始检测执行入库到库位:["
+
hasReelPosList
[
0
]+
"]
"
);
StoragePos
pos
=
storagePosManager
.
getByPosName
(
hasReelPosList
[
0
]);
if
(
pos
==
null
){
String
msg
=
"未找到库位:"
+
String
.
join
(
","
,
hasReelPosList
)
;
log
.
error
(
msg
);
}
else
if
(!
pos
.
getStorageId
().
equals
(
storage
.
getId
())){
String
msg
=
"["
+
storage
.
getName
()
+
"]未找到库位:"
+
String
.
join
(
","
,
hasReelPosList
)
;
String
msg
=
"["
+
cid
+
"]未找到库位:"
+
String
.
join
(
","
,
hasReelPosList
)
;
log
.
error
(
msg
);
}
//如果库位有料,直接结束
...
...
@@ -214,7 +228,9 @@ public class NLPShelfHandler extends BaseDeviceHandler{
log
.
info
(
"料架["
+
cid
+
"]入库库位["
+
pos
.
getPosName
()
+
"]已有料: ["
+
pos
.
getBarcode
().
getBarcode
()
+
"]"
);
}
else
{
log
.
info
(
cid
+
"处理有料库位:["
+
pos
.
getPosName
()+
"]"
);
boolean
posInResult
=
handlePosIn
(
storage
,
pos
);
log
.
info
(
cid
+
"处理有料库位:["
+
pos
.
getPosName
()+
"]完成,结果:"
+
posInResult
);
if
(
posInResult
){
inOkList
.
add
(
pos
.
getPosName
());
}
else
{
...
...
@@ -227,9 +243,10 @@ public class NLPShelfHandler extends BaseDeviceHandler{
String
[]
noReelPosList
=
request
.
getParameterValues
(
"noReelPosList"
);
if
(
noReelPosList
!=
null
){
//出库
log
.
info
(
"出库检测noReelPosList"
);
for
(
String
noReelPosName
:
noReelPosList
)
{
log
.
info
(
cid
+
"处理无料库位:["
+
noReelPosName
+
"]"
);
boolean
handleNoReelPosResult
=
handleNoReelPos
(
storage
,
usedPosNameList
,
noReelPosName
);
log
.
info
(
cid
+
"处理无料库位:["
+
noReelPosName
+
"]完成,结果:"
+
handleNoReelPosResult
);
if
(
handleNoReelPosResult
){
outOkList
.
add
(
noReelPosName
);
}
else
{
...
...
@@ -245,9 +262,13 @@ public class NLPShelfHandler extends BaseDeviceHandler{
dataMap
.
put
(
"outNgList"
,
outNgList
);
dataMap
.
put
(
"ngToOk"
,
ngToOk
);
return
ResultBean
.
newOkResult
(
dataMap
);
}
catch
(
Exception
e
){
String
msg
=
"料架["
+
cid
+
"]处理sensorChange异常"
;
log
.
error
(
msg
,
e
);
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.sensorChangeError"
,
msg
);
}
finally
{
processMap
.
remove
(
cid
);
}
}
/**
...
...
@@ -282,7 +303,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
queueTask
.
setStorageName
(
storage
.
getName
());
try
{
//入库完成,发送入库完成请求
log
.
info
(
"入库完成,发送入库完成请求"
);
log
.
info
(
queueTask
.
getBarcode
()
+
"入库完成,发送入库完成请求"
);
super
.
finishedPutIn
(
storage
.
getCid
(),
pos
.
getPosName
());
String
msg
=
queueTask
.
getBarcode
()
+
"入库到"
+
pos
.
getPosName
()
+
"成功"
;
log
.
info
(
msg
);
...
...
@@ -315,7 +336,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
return
inResult
;
}
}
log
.
error
(
"未找到["
+
pos
.
getPosName
()+
"]的入库任务"
);
log
.
warn
(
"未找到["
+
pos
.
getPosName
()+
"]的入库任务"
);
return
false
;
}
...
...
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
查看文件 @
f13d726
...
...
@@ -448,7 +448,22 @@ public class LiteOrderCache implements ITaskListener {
List
<
String
>
excludePosIds
=
Lists
.
newArrayList
();
excludePosIds
.
addAll
(
taskService
.
excludePosIds
());
List
<
String
>
outPosNameList
=
new
ArrayList
<>();
Set
<
String
>
pnList
=
new
HashSet
<>();
for
(
LiteOrderItem
orderItem
:
cacheOrder
.
getOrderItems
())
{
String
pn
=
orderItem
.
getMaterialNo
();
//需求数量
int
needNum
=
orderItem
.
getQty
()
+
orderItem
.
getIncrement
()
-
orderItem
.
getTotalOutNum
();
if
(
needNum
<=
0
)
{
continue
;
}
pnList
.
add
(
pn
);
}
List
<
StoragePos
>
allAvailblePosList
=
storagePosManager
.
findOrderItemInStorage
(
availableStorageIds
,
pnList
,
excludePosIds
);
Set
<
String
>
outPosNameList
=
new
HashSet
<>();
List
<
Component
>
componentList
=
componentManager
.
findByPN
(
pnList
);
//获取此工单出库的所有物料
for
(
LiteOrderItem
orderItem
:
cacheOrder
.
getOrderItems
())
{
...
...
@@ -460,7 +475,12 @@ public class LiteOrderCache implements ITaskListener {
}
//查找PN的所有库存,PN=pn,未锁定,qty 从大到小,批次正序, 入库时间正序
List
<
StoragePos
>
posList
=
storagePosManager
.
findOrderItemInStorage
(
availableStorageIds
,
pn
,
excludePosIds
);
List
<
StoragePos
>
posList
=
new
ArrayList
<>();
for
(
StoragePos
storagePos
:
allAvailblePosList
)
{
if
(
storagePos
.
getBarcode
().
getPartNumber
().
equals
(
pn
)){
posList
.
add
(
storagePos
);
}
}
int
targetNum
=
needNum
;
List
<
StoragePos
>
outPosList
=
new
ArrayList
<>();
...
...
@@ -491,6 +511,7 @@ public class LiteOrderCache implements ITaskListener {
//排除掉这些库位,以免重复挑取同一盘料
for
(
StoragePos
storagePos
:
outPosList
)
{
excludePosIds
.
add
(
storagePos
.
getId
());
outPosNameList
.
add
(
storagePos
.
getPosName
());
int
reelAmount
=
storagePos
.
getBarcode
().
getAmount
();
outNum
=
outNum
+
reelAmount
;
}
...
...
@@ -507,7 +528,13 @@ public class LiteOrderCache implements ITaskListener {
//判断是否需要截料
boolean
needJieliao
=
false
;
//判断库存 使用最小库存盘数:当前盘数<=最小库存盘数时,需要截料
Component
component
=
componentManager
.
findOneByPN
(
pn
);
Component
component
=
null
;
for
(
Component
c
:
componentList
)
{
if
(
c
.
getPartNumber
().
equals
(
pn
)){
component
=
c
;
break
;
}
}
if
(
component
!=
null
){
if
(
component
.
getMinStoreNum
()>
0
&&
posList
.
size
()
<=
component
.
getMinStoreNum
()){
needJieliao
=
true
;
...
...
@@ -735,7 +762,7 @@ public class LiteOrderCache implements ITaskListener {
* @param targetNum
* @return
*/
private
List
<
StoragePos
>
pickBigOrderReels
(
String
pn
,
Lis
t
<
String
>
outPosNameList
,
List
<
StoragePos
>
posList
,
int
targetNum
){
private
List
<
StoragePos
>
pickBigOrderReels
(
String
pn
,
Se
t
<
String
>
outPosNameList
,
List
<
StoragePos
>
posList
,
int
targetNum
){
List
<
String
>
excludePosNameList
=
new
ArrayList
<>(
outPosNameList
);
List
<
StoragePos
>
outPosList
=
new
ArrayList
<>();
...
...
@@ -813,7 +840,7 @@ public class LiteOrderCache implements ITaskListener {
* @param targetNum
* @return
*/
private
List
<
StoragePos
>
pickRepleReels
(
Lis
t
<
String
>
outPosNameList
,
List
<
StoragePos
>
posList
,
int
targetNum
){
private
List
<
StoragePos
>
pickRepleReels
(
Se
t
<
String
>
outPosNameList
,
List
<
StoragePos
>
posList
,
int
targetNum
){
List
<
String
>
excludePosNameList
=
new
ArrayList
<>(
outPosNameList
);
List
<
StoragePos
>
itemPickPosList
=
new
ArrayList
<>();
boolean
pickMaxQtyReel
=
false
;
...
...
src/main/java/com/neotel/smfcore/core/order/rest/OrderShortageController.java
查看文件 @
f13d726
...
...
@@ -155,12 +155,8 @@ public class OrderShortageController {
List
<
DataLog
>
taskList
=
new
ArrayList
<>();
if
(
liteOrders
.
size
()
>
0
)
{
LiteOrder
liteOrder
=
liteOrders
.
get
(
0
);
if
(
liteOrder
.
isNew
()
||
liteOrder
.
isClosed
())
{
throw
new
ValidateException
(
"smfcore.order.notExecute"
,
"工单[{0}]不在出库中"
,
new
String
[]{
liteOrder
.
getOrderNo
()});
}
List
<
DataLog
>
allTasks
=
taskService
.
getAllTasks
();
for
(
DataLog
datalog
:
allTasks
)
{
for
(
DataLog
datalog
:
allTasks
)
{
if
(
datalog
.
isOrderTask
()
&&
datalog
.
getSourceId
().
equals
(
liteOrder
.
getId
()))
{
//判断是否是缺料出库
if
(
datalog
.
isAddOutbound
())
{
...
...
src/main/java/com/neotel/smfcore/core/outList/util/OutListCache.java
查看文件 @
f13d726
...
...
@@ -230,6 +230,21 @@ public class OutListCache implements ITaskListener {
Map
<
String
,
List
<
StoragePos
>>
needOutPosMap
=
new
HashMap
<>();
//挑出的需要出库的料列表,key=itemId,value=库位
List
<
String
>
itemPosNameList
=
new
ArrayList
<>();
Set
<
String
>
pnList
=
new
HashSet
<>();
for
(
OutListItem
outListItem
:
outList
.
getOutListItems
())
{
String
pn
=
outListItem
.
getMaterialNo
();
//需求数量
int
needNum
=
outListItem
.
getDumpQty
();
if
(
needNum
<=
0
)
{
continue
;
}
pnList
.
add
(
pn
);
}
List
<
StoragePos
>
allAvailblePosList
=
storagePosManager
.
findOrderItemInStorage
(
availableStorageIds
,
pnList
,
taskService
.
excludePosIds
());
List
<
Component
>
componentList
=
componentManager
.
findByPN
(
pnList
);
//获取此转储出库单出库的所有物料
for
(
OutListItem
outListItem
:
outList
.
getOutListItems
())
{
String
pn
=
outListItem
.
getMaterialNo
();
...
...
@@ -239,7 +254,13 @@ public class OutListCache implements ITaskListener {
continue
;
}
Component
component
=
componentManager
.
findOneByPN
(
pn
);
Component
component
=
null
;
for
(
Component
c
:
componentList
)
{
if
(
c
.
getPartNumber
().
equals
(
pn
)){
component
=
c
;
break
;
}
}
if
(
component
==
null
)
{
if
(
isShortageOut
){
shortage
=
true
;
...
...
@@ -251,7 +272,12 @@ public class OutListCache implements ITaskListener {
}
//查找PN的所有库存,PN=pn,未锁定,qty 从大到小,入库时间正序
List
<
StoragePos
>
posList
=
storagePosManager
.
findOrderItemInStorage
(
availableStorageIds
,
pn
,
taskService
.
excludePosIds
());
List
<
StoragePos
>
posList
=
new
ArrayList
<>();
for
(
StoragePos
storagePos
:
allAvailblePosList
)
{
if
(
storagePos
.
getBarcode
().
getPartNumber
().
equals
(
pn
)){
posList
.
add
(
storagePos
);
}
}
log
.
info
(
"共找到"
+
posList
.
size
()+
"盘"
+
pn
+
"的物料"
);
int
storageNum
=
0
;
...
...
src/main/java/com/neotel/smfcore/core/storage/service/manager/IStoragePosManager.java
查看文件 @
f13d726
...
...
@@ -69,5 +69,5 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
List
<
StoragePos
>
getSameSizeContinuityEmptyPosList
(
Storage
storage
,
Barcode
barcode
)
throws
ValidateException
;
List
<
StoragePos
>
findOrderItemInStorage
(
List
<
String
>
storageIdList
,
S
tring
pn
,
Collection
<
String
>
excludePosIds
);
List
<
StoragePos
>
findOrderItemInStorage
(
List
<
String
>
storageIdList
,
S
et
<
String
>
pnList
,
Collection
<
String
>
excludePosIds
);
}
src/main/java/com/neotel/smfcore/core/storage/service/manager/impl/StoragePosManagerImpl.java
查看文件 @
f13d726
...
...
@@ -615,9 +615,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return
new
ArrayList
<>();
}
@Override
public
List
<
StoragePos
>
findOrderItemInStorage
(
List
<
String
>
storageIdList
,
S
tring
pn
,
Collection
<
String
>
excludePosIds
)
{
Criteria
c
=
Criteria
.
where
(
"barcode.partNumber"
).
i
s
(
pn
)
public
List
<
StoragePos
>
findOrderItemInStorage
(
List
<
String
>
storageIdList
,
S
et
<
String
>
pnList
,
Collection
<
String
>
excludePosIds
)
{
Criteria
c
=
Criteria
.
where
(
"barcode.partNumber"
).
i
n
(
pnList
)
.
and
(
"id"
).
nin
(
excludePosIds
)
.
and
(
"enabled"
).
is
(
true
)
//可用
.
and
(
"barcode.lockId"
).
is
(
null
)
//没有被锁定的仓位;
...
...
@@ -632,9 +634,9 @@ public class StoragePosManagerImpl implements IStoragePosManager {
//sort.and(Sort.by(Sort.Direction.ASC, "canCheckOutTime"));
q
.
with
(
amountSort
).
with
(
batchSort
);
List
<
StoragePos
>
posList
=
storagePosDao
.
findByQuery
(
q
);
if
(
posList
==
null
||
posList
.
size
()
<=
0
)
{
log
.
info
(
"findOrderItemInStorage 挑料 partNumber="
+
pn
+
",
未找到可以出库的物料 "
);
}
//
if (posList == null || posList.size() <= 0) {
// log.info("findOrderItemInStorage 挑料
未找到可以出库的物料 ");
//
}
return
posList
;
}
...
...
src/main/java/com/neotel/smfcore/hella/handler/HellaApiHandler.java
查看文件 @
f13d726
package
com
.
neotel
.
smfcore
.
hella
.
handler
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.neotel.smfcore.common.bean.ResultBean
;
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.device.api.IOpAuthApi
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.hella.tcp.HellaTcpClient
;
import
com.neotel.smfcore.hella.tcp.command.HellaReqCommand
;
import
com.neotel.smfcore.hella.tcp.command.HellaRespCommand
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.ArrayList
;
import
java.util.List
;
@Service
public
class
HellaApiHandler
implements
IOpAuthApi
{
@Autowired
private
HellaServiceHandler
hellaServiceHandler
;
@Override
public
Barcode
resolveBarcode
(
CodeValidateParam
param
)
throws
ValidateException
{
if
(!
isEnable
())
{
return
null
;
}
hellaServiceHandler
.
checkMaterial
(
param
);
Barcode
barcode
=
new
Barcode
();
barcode
.
setFullCode
(
param
.
getCode
());
return
barcode
;
}
@Override
public
Barcode
canPutIn
(
Barcode
barcode
)
throws
ValidateException
{
if
(!
isEnable
())
{
return
null
;
}
return
barcode
;
}
@Override
public
boolean
canCheckout
(
Barcode
barcode
)
throws
ValidateException
{
if
(!
isEnable
()){
return
false
;
}
return
false
;
}
@Override
public
boolean
isEnable
()
{
return
HellaTcpClient
.
isEnable
();
}
}
//
package com.neotel.smfcore.hella.handler;
//
//
import cn.hutool.core.util.ObjectUtil;
//
import com.neotel.smfcore.common.bean.ResultBean;
//
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.device.api.IOpAuthApi;
//
import com.neotel.smfcore.core.storage.service.po.Storage;
//
import com.neotel.smfcore.hella.tcp.HellaTcpClient;
//
import com.neotel.smfcore.hella.tcp.command.HellaReqCommand;
//
import com.neotel.smfcore.hella.tcp.command.HellaRespCommand;
//
import org.springframework.beans.factory.annotation.Autowired;
//
import org.springframework.stereotype.Service;
//
//
import java.util.ArrayList;
//
import java.util.List;
//
@Service
//
public class HellaApiHandler implements IOpAuthApi {
//
//
@Autowired
//
private HellaServiceHandler hellaServiceHandler;
//
@Override
//
public Barcode resolveBarcode(CodeValidateParam param) throws ValidateException {
//
//
if (!isEnable()) {
//
return null;
//
}
//
hellaServiceHandler.checkMaterial(param);
//
Barcode barcode = new Barcode();
//
barcode.setFullCode(param.getCode());
//
return barcode;
//
}
//
//
@Override
//
public Barcode canPutIn(Barcode barcode) throws ValidateException {
//
if (!isEnable()) {
//
return null;
//
}
//
return barcode;
//
}
//
//
@Override
//
public boolean canCheckout(Barcode barcode) throws ValidateException {
//
if(!isEnable()){
//
return false;
//
}
//
return false;
//
}
//
//
@Override
//
public boolean isEnable() {
//
return HellaTcpClient.isEnable();
//
}
//
}
src/main/java/com/neotel/smfcore/hella/handler/HellaServiceHandler.java
查看文件 @
f13d726
package
com
.
neotel
.
smfcore
.
hella
.
handler
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.google.common.collect.Lists
;
import
com.neotel.smfcore.common.bean.ResultBean
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.core.barcode.bean.CodeBean
;
import
com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager
;
import
com.neotel.smfcore.core.barcode.service.manager.IComponentManager
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.barcode.service.po.Component
;
import
com.neotel.smfcore.core.barcode.utils.CodeResolve
;
import
com.neotel.smfcore.core.device.api.CodeValidateParam
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.core.device.enums.OP_STATUS
;
import
com.neotel.smfcore.core.device.util.DataCache
;
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.enums.CHECKOUT_TYPE
;
import
com.neotel.smfcore.core.storage.service.manager.ILabelManager
;
import
com.neotel.smfcore.core.storage.service.manager.IStoragePosManager
;
import
com.neotel.smfcore.core.storage.service.po.Label
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
com.neotel.smfcore.core.system.listener.ITaskListener
;
import
com.neotel.smfcore.core.system.service.dao.IDataLogDao
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
com.neotel.smfcore.core.system.util.TaskService
;
import
com.neotel.smfcore.core.system.websocket.MsgType
;
import
com.neotel.smfcore.core.system.websocket.SocketMsg
;
import
com.neotel.smfcore.core.system.websocket.WebSocketServer
;
import
com.neotel.smfcore.hella.tcp.HellaTcpClient
;
import
com.neotel.smfcore.hella.tcp.command.HellaReqCommand
;
import
com.neotel.smfcore.hella.tcp.command.HellaRespCommand
;
import
com.neotel.smfcore.security.service.manager.IGroupManager
;
import
com.neotel.smfcore.security.service.po.Group
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
org.apache.logging.log4j.util.Strings
;
import
org.apache.mina.core.service.IoHandlerAdapter
;
import
org.apache.mina.core.session.IdleStatus
;
import
org.apache.mina.core.session.IoSession
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.atomic.AtomicLong
;
/**
* Created by sunke on 2021/5/26.
*/
@Service
public
class
HellaServiceHandler
extends
IoHandlerAdapter
implements
ITaskListener
{
@Autowired
private
IComponentManager
componentManager
;
@Autowired
private
IBarcodeManager
barcodeManager
;
@Autowired
private
IDataLogDao
dataLogDao
;
@Autowired
private
TaskService
taskService
;
@Autowired
protected
IStoragePosManager
storagePosManager
;
@Autowired
protected
ILiteOrderManager
liteOrderManager
;
@Autowired
private
DataCache
dataCache
;
@Autowired
private
LiteOrderCache
liteOrderCache
;
@Autowired
private
IGroupManager
groupManager
;
@Autowired
private
ILabelManager
labelManager
;
@Autowired
private
CodeResolve
codeResolve
;
protected
final
static
Logger
log
=
LogManager
.
getLogger
();
private
AtomicLong
eventId
=
new
AtomicLong
(
0
);
private
Map
<
String
,
HellaReqCommand
>
commandMap
=
new
ConcurrentHashMap
<>();
/**
* 检查物料条码
* <STX>checkMaterial;eventId;scannedCode<CR><LF>
* @return
*/
public
ResultBean
checkMaterial
(
CodeValidateParam
param
){
String
loginUser
=
param
.
getLoginUser
();
String
groupId
=
param
.
getGroupId
();
String
storageId
=
param
.
getStorageId
();
String
scannedCode
=
param
.
getCode
();
String
token
=
param
.
getToken
();
HellaReqCommand
command
=
HellaReqCommand
.
newCheckMaterialCmd
(
eventId
.
incrementAndGet
(),
scannedCode
);
command
.
setToken
(
token
);
command
.
setGroupId
(
groupId
);
boolean
storageCheckMaterial
=
false
;
if
(
ObjectUtil
.
isNotEmpty
(
storageId
)){
Storage
storage
=
dataCache
.
getStorageById
(
storageId
);
if
(
storage
!=
null
){
storageCheckMaterial
=
true
;
command
.
setGroupId
(
storage
.
getGroupId
());
command
.
setStorageId
(
storageId
);
}
}
command
.
setLoginUser
(
loginUser
);
for
(
HellaReqCommand
hellaReqCommand
:
commandMap
.
values
())
{
if
(
storageCheckMaterial
)
{
if
(
ObjectUtil
.
isNotEmpty
(
hellaReqCommand
.
getStorageId
())&&
hellaReqCommand
.
getStorageId
().
equals
(
storageId
)&&
hellaReqCommand
.
isCheckMaterialReq
()){
//有未完成的入库请求
commandMap
.
remove
(
hellaReqCommand
.
getEventId
());
log
.
info
(
"清理未完成的入库检查请求["
+
hellaReqCommand
.
getEventId
()
+
"]:"
+
hellaReqCommand
.
getData
());
}
}
else
{
if
(
hellaReqCommand
.
getGroupId
().
equals
(
groupId
)
&&
hellaReqCommand
.
isCheckMaterialReq
())
{
//有未完成的入库请求
commandMap
.
remove
(
hellaReqCommand
.
getEventId
());
log
.
info
(
"清理未完成的入库检查请求["
+
hellaReqCommand
.
getEventId
()
+
"]:"
+
hellaReqCommand
.
getData
());
//return ResultBean.newErrorResult(-1,"["+hellaReqCommand.getData()+"]入库任务未完成,无法入库");
}
}
}
commandMap
.
put
(
command
.
getEventId
(),
command
);
log
.
info
(
"发送检查物料条码请求:"
+
command
.
toReqMsg
());
ResultBean
resultBean
=
HellaTcpClient
.
sendMsg
(
command
.
toReqMsg
());
// ResultBean resultBean = testCheckOK(command);
resultBean
.
setMsg
(
"Check Material result:"
+
resultBean
.
getMsg
());
return
resultBean
;
}
@Override
public
void
sessionIdle
(
IoSession
session
,
IdleStatus
status
)
throws
Exception
{
log
.
info
(
"客户端与服务端连接[空闲] - "
+
status
.
toString
());
if
(
session
!=
null
){
session
.
closeNow
();
}
}
@Override
public
void
messageSent
(
IoSession
session
,
Object
message
)
throws
Exception
{
super
.
messageSent
(
session
,
message
);
}
@Override
public
void
sessionClosed
(
IoSession
session
)
throws
Exception
{
super
.
sessionClosed
(
session
);
log
.
info
(
"与服务端"
+
session
.
getRemoteAddress
()
+
" 的连接已断开"
);
}
@Override
public
void
messageReceived
(
IoSession
session
,
Object
message
)
throws
Exception
{
String
msg
=
message
.
toString
();
msg
=
msg
.
replace
(
"\u0002"
,
""
);
log
.
info
(
"Received Tcp Server msg:"
+
msg
);
//getInventory;21296;
String
[]
resposArr
=
msg
.
split
(
";"
,-
1
);
String
cmd
=
resposArr
[
0
];
String
eventId
=
resposArr
[
1
];
HellaRespCommand
respCommand
=
new
HellaRespCommand
();
respCommand
.
setCmd
(
cmd
);
respCommand
.
setEventId
(
eventId
);
if
(
respCommand
.
isCheckMaterialResp
()){
handleCheckMaterialResp
(
respCommand
,
resposArr
);
}
else
if
(
respCommand
.
isLoadMaterialResp
()){
//入库完成反馈
String
returnCode
=
resposArr
[
2
];
String
messageText
=
resposArr
[
3
];
respCommand
.
setReturnCode
(
returnCode
);
respCommand
.
setMessageText
(
messageText
);
HellaReqCommand
requestCommand
=
commandMap
.
get
(
respCommand
.
getEventId
());
if
(
requestCommand
==
null
||
requestCommand
.
isCheckMaterialReq
()){
log
.
error
(
"未找到["
+
respCommand
.
getEventId
()+
"]对应的入库完成通知信息"
);
return
;
}
String
groupId
=
requestCommand
.
getGroupId
();
if
(
respCommand
.
isOkResp
()){
ResultBean
okResult
=
ResultBean
.
newOkResult
(
"smfcore.loadMaterialFinished"
,
"loading material is finished: {0}"
,
new
String
[]{
messageText
},
""
);
WebSocketServer
.
sendMsg
(
requestCommand
.
getToken
(),
new
SocketMsg
(
null
,
okResult
.
getMsg
(),
MsgType
.
INFO
,
"smfclient.loadMaterialFinished"
,
new
String
[]{
messageText
}));
}
else
{
ResultBean
ngResult
=
ResultBean
.
newErrorResult
(
Integer
.
valueOf
(
returnCode
),
"smfcore.loadMaterialFailed"
,
"loading material failed:{0}"
,
new
String
[]{
messageText
}
);
WebSocketServer
.
sendMsg
(
requestCommand
.
getToken
(),
new
SocketMsg
(
null
,
ngResult
.
getMsg
(),
MsgType
.
ERROR
,
"smfclient.loadMaterialFailed"
,
new
String
[]{
messageText
}));
}
commandMap
.
remove
(
respCommand
.
getEventId
());
}
else
if
(
respCommand
.
isUnloadMaterialCmd
()){
//单盘出库
//<STX>unloadMaterial;eventId;partNumber;containerNumber<CR><LF>
String
reelId
=
resposArr
[
2
];
StoragePos
storagePos
=
storagePosManager
.
getByBarcode
(
reelId
);
String
resultCode
=
"0"
;
String
resultMsg
=
"OK"
;
if
(
storagePos
==
null
){
//<STX>unloadMaterialResp;eventId;returnCode;messageText<CR><LF>
resultCode
=
"-1"
;
resultMsg
=
"Not Found"
;
}
else
{
String
lockId
=
storagePos
.
getBarcode
().
getLockId
();
if
(
Strings
.
isNotBlank
(
lockId
)){
resultCode
=
"-2"
;
resultMsg
=
"The reel is locked by ["
+
lockId
+
"]"
;
}
else
{
Storage
storage
=
dataCache
.
getStorageById
(
storagePos
.
getStorageId
());
try
{
taskService
.
checkout
(
storage
,
storagePos
,
false
,
""
);
}
catch
(
ValidateException
ve
){
resultCode
=
"-3"
;
resultMsg
=
ve
.
getMessage
();
}
}
}
String
respMsg
=
"unloadMaterialResp;"
+
eventId
+
";"
+
resultCode
+
";"
+
resultMsg
;
// log.info(respMsg);
// session.write("\02" + respMsg);
HellaTcpClient
.
sendMsg
(
respMsg
,
session
);
}
else
if
(
respCommand
.
isOrderMaterialExtCmd
()){
handleOrderMaterialExtCmd
(
session
,
resposArr
);
}
else
if
(
respCommand
.
isGetInventoryCmd
()){
//<STX>getInventory;eventId;shelfNumber<CR><LF>
//20220217修改: <STX>getInventory;eventId;lineNumber<CR><LF>
// String shelfNumber = resposArr[2];
// Storage shelf = null;
// if(ObjectUtil.isNotEmpty(shelfNumber)) {
// Collection<Storage> allStorages = dataCache.getAllStorage().values();
// for (Storage storage : allStorages) {
// if (storage.getName().equals(shelfNumber)) {
// shelf = storage;
// }
// }
//package com.neotel.smfcore.hella.handler;
//
//import cn.hutool.core.util.ObjectUtil;
//import com.google.common.collect.Lists;
//import com.neotel.smfcore.common.bean.ResultBean;
//import com.neotel.smfcore.common.exception.ValidateException;
//import com.neotel.smfcore.core.barcode.bean.CodeBean;
//import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
//import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
//import com.neotel.smfcore.core.barcode.service.po.Barcode;
//import com.neotel.smfcore.core.barcode.service.po.Component;
//import com.neotel.smfcore.core.barcode.utils.CodeResolve;
//import com.neotel.smfcore.core.device.api.CodeValidateParam;
//import com.neotel.smfcore.core.device.enums.OP;
//import com.neotel.smfcore.core.device.enums.OP_STATUS;
//import com.neotel.smfcore.core.device.util.DataCache;
//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.enums.CHECKOUT_TYPE;
//import com.neotel.smfcore.core.storage.service.manager.ILabelManager;
//import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
//import com.neotel.smfcore.core.storage.service.po.Label;
//import com.neotel.smfcore.core.storage.service.po.Storage;
//import com.neotel.smfcore.core.storage.service.po.StoragePos;
//import com.neotel.smfcore.core.system.listener.ITaskListener;
//import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
//import com.neotel.smfcore.core.system.service.po.DataLog;
//import com.neotel.smfcore.core.system.util.TaskService;
//import com.neotel.smfcore.core.system.websocket.MsgType;
//import com.neotel.smfcore.core.system.websocket.SocketMsg;
//import com.neotel.smfcore.core.system.websocket.WebSocketServer;
//import com.neotel.smfcore.hella.tcp.HellaTcpClient;
//import com.neotel.smfcore.hella.tcp.command.HellaReqCommand;
//import com.neotel.smfcore.hella.tcp.command.HellaRespCommand;
//import com.neotel.smfcore.security.service.manager.IGroupManager;
//import com.neotel.smfcore.security.service.po.Group;
//import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;
//import org.apache.logging.log4j.util.Strings;
//import org.apache.mina.core.service.IoHandlerAdapter;
//import org.apache.mina.core.session.IdleStatus;
//import org.apache.mina.core.session.IoSession;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.util.*;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.atomic.AtomicLong;
//
///**
// * Created by sunke on 2021/5/26.
// */
//@Service
//public class HellaServiceHandler extends IoHandlerAdapter implements ITaskListener {
//
// @Autowired
// private IComponentManager componentManager;
//
// @Autowired
// private IBarcodeManager barcodeManager;
//
// @Autowired
// private IDataLogDao dataLogDao;
//
// @Autowired
// private TaskService taskService;
//
// @Autowired
// protected IStoragePosManager storagePosManager;
//
// @Autowired
// protected ILiteOrderManager liteOrderManager;
//
// @Autowired
// private DataCache dataCache;
//
// @Autowired
// private LiteOrderCache liteOrderCache;
//
// @Autowired
// private IGroupManager groupManager;
//
// @Autowired
// private ILabelManager labelManager;
//
// @Autowired
// private CodeResolve codeResolve;
//
// protected final static Logger log = LogManager.getLogger();
//
// private AtomicLong eventId = new AtomicLong(0);
//
// private Map<String,HellaReqCommand> commandMap = new ConcurrentHashMap<>();
//
// /**
// * 检查物料条码
// * <STX>checkMaterial;eventId;scannedCode<CR><LF>
// * @return
// */
// public ResultBean checkMaterial(CodeValidateParam param){
// String loginUser=param.getLoginUser();
// String groupId=param.getGroupId();
// String storageId=param.getStorageId();
// String scannedCode= param.getCode();
// String token=param.getToken();
//
// HellaReqCommand command = HellaReqCommand.newCheckMaterialCmd(eventId.incrementAndGet(),scannedCode);
// command.setToken(token);
// command.setGroupId(groupId);
// boolean storageCheckMaterial=false;
// if(ObjectUtil.isNotEmpty(storageId)){
// Storage storage=dataCache.getStorageById(storageId);
// if(storage!=null){
// storageCheckMaterial=true;
// command.setGroupId(storage.getGroupId());
// command.setStorageId(storageId);
// }
String
lineNumber
=
resposArr
[
2
];
List
<
String
>
shelfIds
=
new
ArrayList
<>();
if
(
ObjectUtil
.
isNotEmpty
(
lineNumber
)){
Group
group
=
groupManager
.
getByGroupName
(
lineNumber
);
if
(
group
!=
null
){
shelfIds
=
dataCache
.
getStorageIdsByGroupId
(
group
.
getId
(),
false
);
}
}
String
resultCode
=
"0"
;
String
resultMsg
=
"OK"
;
String
dataStr
=
""
;
int
posSize
=
0
;
// if(ObjectUtil.isNotEmpty(shelfNumber)&&shelf == null){
if
(
ObjectUtil
.
isNotEmpty
(
lineNumber
)&&
shelfIds
.
size
()<=
0
){
//<STX>getInventoryResp;eventId;returnCode;messageText;numberofResults;partNumber1;containerNumber;remainQuantity;MSL;lightClass;SelfPosition;reserved;…;partNumberN;containerNumberN;remainQuantityN;MSLN;lightClassN;SelfPositionN;reservedN;<CR><LF>
resultCode
=
"-1"
;
resultMsg
=
"Shelf is not found"
;
dataStr
=
"0"
;
}
else
{
// String shelfId="";
// if(!(shelf==null)){
// shelfId=shelf.getId();
// }
// command.setLoginUser(loginUser);
//
// for (HellaReqCommand hellaReqCommand : commandMap.values()) {
// if(storageCheckMaterial) {
// if(ObjectUtil.isNotEmpty(hellaReqCommand.getStorageId())&&hellaReqCommand.getStorageId().equals(storageId)&&hellaReqCommand.isCheckMaterialReq()){
// //有未完成的入库请求
// commandMap.remove(hellaReqCommand.getEventId());
// log.info("清理未完成的入库检查请求[" + hellaReqCommand.getEventId() + "]:" + hellaReqCommand.getData());
// }
if
(
shelfIds
.
size
()<=
0
){
shelfIds
.
add
(
""
);
}
log
.
info
(
"getInventory,lineNumber["
+
lineNumber
+
"],shelfIds["
+
String
.
join
(
","
,
shelfIds
)+
"]"
);
for
(
String
shelfId
:
shelfIds
)
{
List
<
StoragePos
>
posList
=
storagePosManager
.
findNotEmptyByStorageId
(
shelfId
);
int
numberOfResult
=
posList
.
size
();
log
.
info
(
"getInventory,shelfId["
+
shelfId
+
"],numberOfResult["
+
numberOfResult
+
"]"
);
posSize
+=
numberOfResult
;
// dataStr = "" + numberOfResult;
for
(
StoragePos
storagePos
:
posList
)
{
Barcode
barcode
=
storagePos
.
getBarcode
();
String
pn
=
barcode
.
getPartNumber
();
String
reelId
=
barcode
.
getBarcode
();
int
qty
=
barcode
.
getAmount
();
String
msl
=
barcode
.
getMsl
();
String
lightClass
=
barcode
.
getBatch
();
String
posName
=
storagePos
.
getPosName
();
String
reserved
=
"0"
;
if
(
Strings
.
isNotBlank
(
barcode
.
getLockId
()))
{
reserved
=
"1"
;
}
// dataStr = dataStr + ";" + pn + ";" + reelId + ";" + qty + ";" + msl + ";" + lightClass + ";" + posName + ";" + reserved;
if
(
ObjectUtil
.
isNotEmpty
(
dataStr
)){
dataStr
=
dataStr
+
";"
+
pn
+
";"
+
reelId
+
";"
+
qty
+
";"
+
msl
+
";"
+
lightClass
+
";"
+
posName
+
";"
+
reserved
;
}
else
{
dataStr
=
pn
+
";"
+
reelId
+
";"
+
qty
+
";"
+
msl
+
";"
+
lightClass
+
";"
+
posName
+
";"
+
reserved
;
}
}
}
}
String
respMsg
=
"getInventoryResp;"
+
eventId
+
";"
+
resultCode
+
";"
+
resultMsg
+
";"
+
posSize
+
";"
+
dataStr
;
// log.info(respMsg);
//session.write("\02" + respMsg);
HellaTcpClient
.
sendMsg
(
respMsg
,
session
);
}
}
private
ResultBean
testCheckOK
(
HellaReqCommand
command
)
{
HellaRespCommand
respCommand
=
new
HellaRespCommand
();
respCommand
.
setCmd
(
"TestCheckMaterial"
);
respCommand
.
setEventId
(
command
.
getEventId
());
String
codeStr
=
command
.
getData
().
toString
();
CodeBean
codeBean
=
codeResolve
.
resolveSingleCode
(
codeStr
);
if
(
codeBean
==
null
||
codeBean
.
getBarcode
()==
null
){
return
ResultBean
.
newErrorResult
(
1
,
"smfcore.error.barcode.invalid"
,
"{0}不是有效的条码"
,
new
String
[]{
codeStr
});
}
if
(
ObjectUtil
.
isNotEmpty
(
codeBean
.
getErrorCode
())
){
return
ResultBean
.
newErrorResult
(
1
,
codeBean
.
getErrorCode
(),
codeBean
.
getError
(),
codeBean
.
getParams
());
}
String
pn
=
codeBean
.
getBarcode
().
getPartNumber
();
String
reelId
=
codeBean
.
getBarcode
().
getBarcode
();
String
num
=
codeBean
.
getBarcode
().
getAmount
()+
""
;
String
[]
resposArr
=
new
String
[]{
"TestCheckMaterial"
,
command
.
getEventId
(),
"0"
,
"OK"
,
pn
,
reelId
,
num
,
"1"
,
"LC01"
};
try
{
handleCheckMaterialResp
(
respCommand
,
resposArr
);
return
ResultBean
.
newOkResult
(
""
);
}
catch
(
ValidateException
e
)
{
log
.
error
(
e
);
return
ResultBean
.
newErrorResult
(
1
,
e
.
getMsgKey
(),
e
.
getDefaultMsg
());
}
}
/**
* 处理入库验证返回消息
* @param respCommand
* @param resposArr
*/
private
void
handleCheckMaterialResp
(
HellaRespCommand
respCommand
,
String
[]
resposArr
)
throws
ValidateException
{
String
returnCode
=
resposArr
[
2
];
String
messageText
=
resposArr
[
3
];
respCommand
.
setReturnCode
(
returnCode
);
respCommand
.
setMessageText
(
messageText
);
HellaReqCommand
requestCommand
=
commandMap
.
get
(
respCommand
.
getEventId
());
if
(
requestCommand
==
null
||
!
requestCommand
.
isCheckMaterialReq
()){
log
.
error
(
"未找到["
+
respCommand
.
getEventId
()+
"]对应的入库请求信息"
);
return
;
}
String
groupId
=
requestCommand
.
getGroupId
();
String
storageId
=
requestCommand
.
getStorageId
();
String
loginUser
=
requestCommand
.
getLoginUser
();
String
fullCode
=
requestCommand
.
getData
().
toString
();
String
token
=
requestCommand
.
getToken
().
toString
();
if
(
respCommand
.
isOkResp
()){
//<STX>loadMaterialResp;eventId;returnCode;messageText;partNumber;containerNumber;remainQuantity;MSL;lightClass<CR><LF>
//可以入库,生成一个任务,通知到页面,并将其存下来
String
pn
=
resposArr
[
4
];
String
reelId
=
resposArr
[
5
];
String
qty
=
resposArr
[
6
];
String
msl
=
resposArr
[
7
];
String
lightClass
=
""
;
if
(
resposArr
.
length
>=
9
){
lightClass
=
resposArr
[
8
];
}
//checkMaterialResp;1;0;OK;714.758-41;48200085SIA1531JU2N15;1000.0;1;
Barcode
barcode
=
barcodeManager
.
findByBarcode
(
reelId
);
if
(
barcode
==
null
){
barcode
=
new
Barcode
();
barcode
.
setBarcode
(
reelId
);
Component
component
=
componentManager
.
findByPartNumberAndProvider
(
pn
,
null
);
if
(
component
==
null
){
log
.
info
(
"自动添加["
+
pn
+
"]的档案信息"
);
component
=
new
Component
();
component
.
setPartNumber
(
pn
);
component
.
setAmount
(
Double
.
valueOf
(
qty
).
intValue
());
component
.
setPlateSize
(
1
);
component
.
setHeight
(
1
);
component
.
setName
(
pn
);
componentManager
.
save
(
component
);
}
log
.
info
(
"创建条码["
+
reelId
+
"]"
);
}
barcode
.
setPartNumber
(
pn
);
barcode
.
setMsl
(
msl
);
barcode
.
setBatch
(
lightClass
);
barcode
.
setAmount
(
Double
.
valueOf
(
qty
).
intValue
());
barcode
.
setFullCode
(
fullCode
);
barcode
=
barcodeManager
.
save
(
barcode
);
DataLog
dataLog
=
new
DataLog
();
dataLog
.
setBarcode
(
reelId
);
dataLog
.
setPartNumber
(
pn
);
dataLog
.
setType
(
OP
.
PUT_IN
);
dataLog
.
setNum
(
barcode
.
getAmount
());
dataLog
.
setStatus
(
OP_STATUS
.
WAIT
.
name
());
dataLog
.
setGroupId
(
groupId
);
dataLog
.
setStorageId
(
storageId
);
dataLog
.
setMemo
(
barcode
.
getMemo
());
dataLog
.
setOperator
(
loginUser
);
if
(
ObjectUtil
.
isNotEmpty
(
storageId
)){
Storage
storage
=
dataCache
.
getStorageById
(
storageId
);
if
(
storage
!=
null
){
dataLog
.
setCid
(
storage
.
getCid
());
dataLog
.
setStorageName
(
storage
.
getName
());
}
}
try
{
taskService
.
addTaskToExecute
(
dataLog
);
ResultBean
okResult
=
ResultBean
.
newOkResult
(
"checking material is ok: "
+
messageText
);
WebSocketServer
.
sendMsg
(
token
,
new
SocketMsg
(
null
,
okResult
.
getMsg
(),
MsgType
.
INFO
,
"smfclient.checkingMaterialOk"
,
new
String
[]{
messageText
}));
}
catch
(
Exception
e
){
WebSocketServer
.
sendMsg
(
token
,
new
SocketMsg
(
null
,
e
.
getMessage
(),
MsgType
.
INFO
,
"smfclient.nlp.error"
,
new
String
[]{
e
.
getMessage
()}));
}
}
else
{
//NG,需要在界面上进行提示
ResultBean
ngResult
=
ResultBean
.
newErrorResult
(
Integer
.
valueOf
(
returnCode
),
"smfcore.checkNg"
,
"checking material is ng:{0}"
,
new
String
[]{
messageText
}
);
WebSocketServer
.
sendMsg
(
token
,
new
SocketMsg
(
null
,
ngResult
.
getMsg
(),
MsgType
.
ERROR
,
"smfclient.checkNg"
,
new
String
[]{
messageText
}));
}
commandMap
.
remove
(
respCommand
.
getEventId
());
}
/**
* 处理工单指令
*/
private
void
handleOrderMaterialExtCmd
(
IoSession
session
,
String
[]
resposArr
)
throws
ValidateException
{
// //工单出库
// //<STX>orderMaterialExt;eventId;lineNumber;workorderNumber;currentWorkorderflag;reflowgroupNumber;numberofPartnumbers;partNumber1;numberofReels;…;partNumberN;numberofReels<CR><LF>
// //20220217 修改工单出库参数
// //<STX>orderMaterialExt;eventId;lineNumber;CRPNumber;currentWorkorderflag;productGroup;numberofPartnumbers;partNumber1;numberofReels;…;partNumberN;numberofReels<CR><LF>
// String responseEventId = resposArr[1];
// String groupName = resposArr[2];//设备组名称
// String workorderNumber = resposArr[3];
//// workorderNumber=responseEventId;
// //currentWorkorderflag 0 for current workorder; 1 for next workorder
// String currentWorkorderflag = resposArr[4];
//// String reflowgroupNumber = resposArr[5];
// String labelName=resposArr[5];//标签名称
// String numberofPartnumbers = resposArr[6];
// LiteOrder liteOrder = liteOrderManager.findByOrderNo(workorderNumber);
// if(liteOrder != null){
// log.info("数据库中已存在工单号为["+workorderNumber+"]的工单,忽略");
// int resultCode=-1;
// String resultMsg="workorderNumber ["+workorderNumber+"] already exists";
// String respMsg = "orderMaterialExtResp;"+ responseEventId+";" + resultCode+";"+resultMsg+";"+workorderNumber+";"+currentWorkorderflag+";"+labelName+";"+numberofPartnumbers ;
// }else {
// if (hellaReqCommand.getGroupId().equals(groupId) && hellaReqCommand.isCheckMaterialReq()) {
// //有未完成的入库请求
// commandMap.remove(hellaReqCommand.getEventId());
// log.info("清理未完成的入库检查请求[" + hellaReqCommand.getEventId() + "]:" + hellaReqCommand.getData());
// //return ResultBean.newErrorResult(-1,"["+hellaReqCommand.getData()+"]入库任务未完成,无法入库");
// }
// }
// }
//
// HellaTcpClient.sendMsg(respMsg,session);
// }else{
// List<LiteOrderItem> items = Lists.newArrayList();
// int startIndex = 6;
// while(startIndex+2<resposArr.length){
// String partNumber = resposArr[startIndex + 1];
// String numberofReels = resposArr[startIndex+2];
// LiteOrderItem item = new LiteOrderItem();
// item.setPn(partNumber);
// item.setNeedReelCount(Integer.valueOf(numberofReels));
// items.add(item);
// startIndex = startIndex + 2;
// commandMap.put(command.getEventId(),command);
// log.info("发送检查物料条码请求:" + command.toReqMsg());
// ResultBean resultBean = HellaTcpClient.sendMsg(command.toReqMsg());
//// ResultBean resultBean = testCheckOK(command);
// resultBean.setMsg("Check Material result:"+resultBean.getMsg());
// return resultBean;
// }
//
//
//
// @Override
// public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
// log.info("客户端与服务端连接[空闲] - " + status.toString());
// if(session != null){
// session.closeNow();
// }
// }
//
// @Override
// public void messageSent(IoSession session, Object message) throws Exception {
// super.messageSent(session, message);
// }
//
// @Override
// public void sessionClosed(IoSession session) throws Exception {
// super.sessionClosed(session);
// log.info("与服务端" + session.getRemoteAddress() +" 的连接已断开");
// }
//
// @Override
// public void messageReceived(IoSession session, Object message) throws Exception {
// String msg = message.toString();
// msg= msg.replace("\u0002","");
// log.info("Received Tcp Server msg:" + msg);
// //getInventory;21296;
// String[] resposArr = msg.split(";",-1);
// String cmd = resposArr[0];
// String eventId = resposArr[1];
//
// HellaRespCommand respCommand = new HellaRespCommand();
// respCommand.setCmd(cmd);
// respCommand.setEventId(eventId);
//
// if(respCommand.isCheckMaterialResp()){
// handleCheckMaterialResp(respCommand,resposArr);
// }else if(respCommand.isLoadMaterialResp()){
// //入库完成反馈
// String returnCode = resposArr[2];
// String messageText = resposArr[3];
// respCommand.setReturnCode(returnCode);
// respCommand.setMessageText(messageText);
// HellaReqCommand requestCommand = commandMap.get(respCommand.getEventId());
// if(requestCommand == null || requestCommand.isCheckMaterialReq()){
// log.error("未找到["+respCommand.getEventId()+"]对应的入库完成通知信息");
// return;
// }
// String groupId = requestCommand.getGroupId();
//
// if(respCommand.isOkResp()){
// ResultBean okResult = ResultBean.newOkResult("smfcore.loadMaterialFinished","loading material is finished: {0}" ,new String[]{messageText},"");
//
// WebSocketServer.sendMsg(requestCommand.getToken(),new SocketMsg(null, okResult.getMsg(), MsgType.INFO,"smfclient.loadMaterialFinished",new String[]{messageText}));
// }else{
// ResultBean ngResult = ResultBean.newErrorResult(Integer.valueOf(returnCode),"smfcore.loadMaterialFailed","loading material failed:{0}",new String[]{messageText} );
// WebSocketServer.sendMsg(requestCommand.getToken(),new SocketMsg(null, ngResult.getMsg(), MsgType.ERROR,"smfclient.loadMaterialFailed",new String[]{messageText}));
// }
// liteOrder = new LiteOrder(workorderNumber,items);
// liteOrder.setSource(groupName);
// log.info("新增加订单:" + liteOrder.getOrderNo()+",设备组名称["+groupName+"],标签名称["+labelName+"]");
// liteOrder = liteOrderManager.createWithItems(liteOrder);
// liteOrderCache.addOrderToMap(liteOrder);
// //对工单进行锁定
// List<String> storageIdList = new ArrayList<>();
//
// Map<String, Storage> allStorage = dataCache.getAllStorage();
// Group group = groupManager.getByGroupName(groupName);
// if(group != null){
// for (Storage storage : allStorage.values()) {
//// if(storage.getGroupId().equals(storage.getGroupId())){
// if(storage.IsRightGroup(group.getId())){
// storageIdList.add(storage.getId());
// commandMap.remove(respCommand.getEventId());
// }else if(respCommand.isUnloadMaterialCmd()){
// //单盘出库
// //<STX>unloadMaterial;eventId;partNumber;containerNumber<CR><LF>
// String reelId = resposArr[2];
// StoragePos storagePos = storagePosManager.getByBarcode(reelId);
// String resultCode = "0";
// String resultMsg = "OK";
// if(storagePos == null){
// //<STX>unloadMaterialResp;eventId;returnCode;messageText<CR><LF>
// resultCode = "-1";
// resultMsg = "Not Found";
// }else {
// String lockId = storagePos.getBarcode().getLockId();
// if(Strings.isNotBlank(lockId)){
// resultCode = "-2";
// resultMsg = "The reel is locked by ["+lockId+"]";
// }else{
// Storage storage = dataCache.getStorageById(storagePos.getStorageId());
// try{
// taskService.checkout(storage,storagePos,false,"");
// }catch(ValidateException ve){
// resultCode = "-3";
// resultMsg = ve.getMessage();
// }
// }
// }
// String respMsg = "unloadMaterialResp;"+ eventId+";" + resultCode+";"+resultMsg;
//// log.info(respMsg);
//// session.write("\02" + respMsg);
// HellaTcpClient.sendMsg(respMsg,session);
// }else if(respCommand.isOrderMaterialExtCmd()){
// handleOrderMaterialExtCmd(session,resposArr);
// }else if(respCommand.isGetInventoryCmd()){
// //<STX>getInventory;eventId;shelfNumber<CR><LF>
// //20220217修改: <STX>getInventory;eventId;lineNumber<CR><LF>
//// String shelfNumber = resposArr[2];
//// Storage shelf = null;
//// if(ObjectUtil.isNotEmpty(shelfNumber)) {
//// Collection<Storage> allStorages = dataCache.getAllStorage().values();
//// for (Storage storage : allStorages) {
//// if (storage.getName().equals(shelfNumber)) {
//// shelf = storage;
//// }
//// }
//// }
//
//
//增加标签过滤
//
String labelId=""
;
// if(ObjectUtil.isNotEmpty(l
abelName
)){
//
Label label=labelManager.getBylabelName(labelName
);
// if(
label
!=null){
//
labelId=label.getId()
;
//
String lineNumber=resposArr[2];
//
List<String> shelfIds=new ArrayList<>()
;
// if(ObjectUtil.isNotEmpty(l
ineNumber
)){
//
Group group= groupManager.getByGroupName(lineNumber
);
// if(
group
!=null){
//
shelfIds =dataCache. getStorageIdsByGroupId(group.getId(), false)
;
// }
// }
//
//
// CHECKOUT_TYPE checkOutType = dataCache.getCheckOutType();
// Collection<String> excludePosIds = new ArrayList<>();
//
// String resultCode = "0";
// String resultMsg = "OK";
// String resultDataStr = "";
// for (LiteOrderItem liteOrderItem : liteOrder.getOrderItems()) {
// int reelCount = liteOrderItem.getNeedReelCount();
// String pn = liteOrderItem.getPn();
// int lockCount = 0;
// while(lockCount < reelCount){
// StoragePos pos = storagePosManager.findPartNumberInStorages(storageIdList,labelId, pn, excludePosIds, checkOutType);
// if(pos == null){
// break;
// }else{
// try {
// Barcode barcode = pos.getBarcode();
// resultDataStr = resultDataStr + ";" + barcode.getPartNumber()+ ";" + barcode.getBarcode()+";"+barcode.getAmount();
// barcode.setLockId(workorderNumber);
// barcode.setLockName(liteOrderItem.getId());
// pos.setBarcode(barcode);
// storagePosManager.save(pos);
// Storage storage = dataCache.getStorageById(pos.getStorageId());
// dataCache.lockOneReel(storage.getCid(),pn);
// } catch (ValidateException e) {
// log.error("锁定料盘出错",e);
// String dataStr = "";
// int posSize=0;
//// if(ObjectUtil.isNotEmpty(shelfNumber)&&shelf == null){
// if(ObjectUtil.isNotEmpty(lineNumber)&&shelfIds.size()<=0){
// //<STX>getInventoryResp;eventId;returnCode;messageText;numberofResults;partNumber1;containerNumber;remainQuantity;MSL;lightClass;SelfPosition;reserved;…;partNumberN;containerNumberN;remainQuantityN;MSLN;lightClassN;SelfPositionN;reservedN;<CR><LF>
// resultCode = "-1";
// resultMsg = "Shelf is not found";
// dataStr = "0";
// }else {
//// String shelfId="";
//// if(!(shelf==null)){
//// shelfId=shelf.getId();
//// }
// if(shelfIds.size()<=0){
// shelfIds.add("");
// }
// log.info("getInventory,lineNumber["+lineNumber+"],shelfIds["+String.join(",",shelfIds)+"]");
// for (String shelfId :
// shelfIds) {
// List<StoragePos> posList = storagePosManager.findNotEmptyByStorageId(shelfId);
// int numberOfResult = posList.size();
// log.info("getInventory,shelfId["+shelfId+"],numberOfResult["+numberOfResult+"]");
// posSize+=numberOfResult;
//// dataStr = "" + numberOfResult;
// for (StoragePos storagePos : posList) {
// Barcode barcode = storagePos.getBarcode();
// String pn = barcode.getPartNumber();
// String reelId = barcode.getBarcode();
// int qty = barcode.getAmount();
// String msl = barcode.getMsl();
// String lightClass = barcode.getBatch();
// String posName = storagePos.getPosName();
// String reserved = "0";
// if (Strings.isNotBlank(barcode.getLockId())) {
// reserved = "1";
// }
//// dataStr = dataStr + ";" + pn + ";" + reelId + ";" + qty + ";" + msl + ";" + lightClass + ";" + posName + ";" + reserved;
// if(ObjectUtil.isNotEmpty(dataStr)){
// dataStr = dataStr + ";" + pn + ";" + reelId + ";" + qty + ";" + msl + ";" + lightClass + ";" + posName + ";" + reserved;
// }else{
// dataStr = pn + ";" + reelId + ";" + qty + ";" + msl + ";" + lightClass + ";" + posName + ";" + reserved;
// }
// lockCount = lockCount + 1;
// }
//
// }
// }
//
// int notFoundReelCount = reelCount - lockCount;
// if(notFoundReelCount > 0){
// //有未绑定的
// resultCode = "-1";
// resultMsg = "Some material not on the shelf";
// for (int i=0;i<notFoundReelCount;i++){
// resultDataStr = resultDataStr + ";" + pn + ";NOT_FOUND;0";
// }
// String respMsg = "getInventoryResp;"+eventId+";"+resultCode+";"+resultMsg+";"+posSize+";"+dataStr;
//// log.info(respMsg);
// //session.write("\02" + respMsg);
// HellaTcpClient.sendMsg(respMsg,session);
// }
//
// }
//
//
//
// private ResultBean testCheckOK(HellaReqCommand command) {
// HellaRespCommand respCommand = new HellaRespCommand();
// respCommand.setCmd("TestCheckMaterial");
// respCommand.setEventId(command.getEventId());
// String codeStr = command.getData().toString();
// CodeBean codeBean = codeResolve.resolveSingleCode(codeStr);
// if(codeBean==null||codeBean.getBarcode()==null){
// return ResultBean.newErrorResult(1,"smfcore.error.barcode.invalid","{0}不是有效的条码",new String[]{codeStr});
// }
// if(ObjectUtil.isNotEmpty(codeBean.getErrorCode()) ){
// return ResultBean.newErrorResult(1,codeBean.getErrorCode(),codeBean.getError(),codeBean.getParams());
// }
// String pn=codeBean.getBarcode().getPartNumber();
// String reelId=codeBean.getBarcode().getBarcode();
// String num=codeBean.getBarcode().getAmount()+"";
// String[] resposArr = new String[]{"TestCheckMaterial",command.getEventId(),"0","OK",pn,reelId,num,"1","LC01"};
// try {
// handleCheckMaterialResp(respCommand,resposArr);
// return ResultBean.newOkResult("");
// } catch (ValidateException e) {
// log.error(e);
// return ResultBean.newErrorResult(1,e.getMsgKey(),e.getDefaultMsg());
// }
// }
//
// /**
// * 处理入库验证返回消息
// * @param respCommand
// * @param resposArr
// */
// private void handleCheckMaterialResp(HellaRespCommand respCommand, String[] resposArr) throws ValidateException{
// String returnCode = resposArr[2];
// String messageText = resposArr[3];
// respCommand.setReturnCode(returnCode);
// respCommand.setMessageText(messageText);
// HellaReqCommand requestCommand = commandMap.get(respCommand.getEventId());
// if(requestCommand == null || !requestCommand.isCheckMaterialReq()){
// log.error("未找到["+respCommand.getEventId()+"]对应的入库请求信息");
// return;
// }
// String groupId = requestCommand.getGroupId();
// String storageId=requestCommand.getStorageId();
// String loginUser = requestCommand.getLoginUser();
// String fullCode = requestCommand.getData().toString();
// String token=requestCommand.getToken().toString();
// if(respCommand.isOkResp()){
// //<STX>loadMaterialResp;eventId;returnCode;messageText;partNumber;containerNumber;remainQuantity;MSL;lightClass<CR><LF>
// //可以入库,生成一个任务,通知到页面,并将其存下来
// String pn = resposArr[4];
// String reelId = resposArr[5];
// String qty = resposArr[6];
// String msl = resposArr[7];
//
// String lightClass = "";
//
// if(resposArr.length >= 9){
// lightClass = resposArr[8];
// }
//
// //checkMaterialResp;1;0;OK;714.758-41;48200085SIA1531JU2N15;1000.0;1;
//
// Barcode barcode = barcodeManager.findByBarcode(reelId);
// if(barcode == null){
// barcode = new Barcode();
// barcode.setBarcode(reelId);
// Component component = componentManager.findByPartNumberAndProvider(pn,null);
// if(component == null){
// log.info("自动添加["+pn+"]的档案信息");
// component = new Component();
// component.setPartNumber(pn);
// component.setAmount(Double.valueOf(qty).intValue());
// component.setPlateSize(1);
// component.setHeight(1);
// component.setName(pn);
// componentManager.save(component);
// }
// log.info("创建条码["+reelId+"]");
// }
// barcode.setPartNumber(pn);
// barcode.setMsl(msl);
// barcode.setBatch(lightClass);
// barcode.setAmount(Double.valueOf(qty).intValue());
// barcode.setFullCode(fullCode);
// barcode = barcodeManager.save(barcode);
//
// if("1".equals(currentWorkorderflag)){
// liteOrderCache.checkOutOrder(liteOrder);
// DataLog dataLog = new DataLog();
// dataLog.setBarcode(reelId);
// dataLog.setPartNumber(pn);
// dataLog.setType(OP.PUT_IN);
// dataLog.setNum(barcode.getAmount());
// dataLog.setStatus(OP_STATUS.WAIT.name());
// dataLog.setGroupId(groupId);
// dataLog.setStorageId(storageId);
// dataLog.setMemo(barcode.getMemo());
// dataLog.setOperator(loginUser);
// if(ObjectUtil.isNotEmpty(storageId)){
// Storage storage=dataCache.getStorageById(storageId);
// if(storage!=null){
// dataLog.setCid(storage.getCid());
// dataLog.setStorageName(storage.getName());
// }
// }
// try{
// taskService.addTaskToExecute(dataLog);
// ResultBean okResult = ResultBean.newOkResult("checking material is ok: " + messageText);
// WebSocketServer.sendMsg(token,new SocketMsg(null, okResult.getMsg(), MsgType.INFO,"smfclient.checkingMaterialOk",new String[]{messageText}));
// }catch(Exception e){
// WebSocketServer.sendMsg(token,new SocketMsg(null, e.getMessage(), MsgType.INFO,"smfclient.nlp.error",new String[]{e.getMessage()}));
// }
// //<STX>orderMaterialExtResp;eventId;returnCode;messageText;workorderNumber;currentWorkorderflag;reflowgroupNumber;numberofPartnumbers;partNumber1;containerNumber;quantity;…;partNumberN;containerNumberN;quantityN<CR><LF>
// //<STX>orderMaterialExtResp;1;0;OK;61598;1;325.618-01;3;790.130-13;abcde;3000; 790.131-01;abcdf;5000;790.131-01;abcdg;2580<CR><LF>
// //orderMaterialExtResp;0;-1;Some material not on the shelf;1408;1;325.618-01;1;;791.704-06NOT_FOUND;0
// //<STX>orderMaterialExtResp;eventId;returnCode;messageText;workorderNumber;currentWorkorderflag;reflowgroupNumber;numberofPartnumbers;partNumber1;containerNumber;quantity;…;partNumberN;containerNumberN;quantityN<CR><LF>
// String respMsg = "orderMaterialExtResp;"+ responseEventId+";" + resultCode+";"+resultMsg+";"+workorderNumber+";"+currentWorkorderflag+";"+labelName+";"+numberofPartnumbers +resultDataStr;
//// log.info("工单结果:" + respMsg);
//// session.write("\02"+respMsg);
//
// HellaTcpClient.sendMsg(respMsg,session);
// }else{
// //NG,需要在界面上进行提示
// ResultBean ngResult = ResultBean.newErrorResult(Integer.valueOf(returnCode),"smfcore.checkNg","checking material is ng:{0}" ,new String[]{messageText} );
// WebSocketServer.sendMsg(token,new SocketMsg(null, ngResult.getMsg(), MsgType.ERROR,"smfclient.checkNg",new String[]{messageText}));
// }
}
/**
* 入库完成通知
* <STX>loadMaterial;eventId;scannedCode;shelfNumber;shelfSlot<CR><LF>
* @return
*/
private
void
loadMaterial
(
String
groupId
,
String
scannedCode
,
String
shelfNumber
,
String
shelfSlot
){
HellaReqCommand
command
=
HellaReqCommand
.
newLoadMaterialCmd
(
eventId
.
incrementAndGet
(),
scannedCode
,
shelfNumber
,
shelfSlot
);
command
.
setGroupId
(
groupId
);
commandMap
.
put
(
command
.
getEventId
(),
command
);
log
.
info
(
"发送入库完成通知:"
+
command
.
toReqMsg
());
HellaTcpClient
.
sendMsg
(
command
.
toReqMsg
());
}
@Override
public
void
onTaskStatusChange
(
DataLog
task
)
{
if
(
task
.
isFinished
()){
if
(
task
.
isPutInTask
()){
String
groupId
=
task
.
getGroupId
();
String
fullCode
=
task
.
getBarcode
();
Barcode
barcode
=
barcodeManager
.
findByBarcode
(
task
.
getBarcode
());
if
(
barcode
!=
null
){
fullCode
=
barcode
.
getFullCode
();
}
loadMaterial
(
groupId
,
fullCode
,
task
.
getStorageName
(),
task
.
getPosName
());
}
}
}
}
// commandMap.remove(respCommand.getEventId());
// }
//
// /**
// * 处理工单指令
// */
// private void handleOrderMaterialExtCmd(IoSession session, String[] resposArr) throws ValidateException {
//// //工单出库
//// //<STX>orderMaterialExt;eventId;lineNumber;workorderNumber;currentWorkorderflag;reflowgroupNumber;numberofPartnumbers;partNumber1;numberofReels;…;partNumberN;numberofReels<CR><LF>
//// //20220217 修改工单出库参数
//// //<STX>orderMaterialExt;eventId;lineNumber;CRPNumber;currentWorkorderflag;productGroup;numberofPartnumbers;partNumber1;numberofReels;…;partNumberN;numberofReels<CR><LF>
//// String responseEventId = resposArr[1];
//// String groupName = resposArr[2];//设备组名称
//// String workorderNumber = resposArr[3];
////// workorderNumber=responseEventId;
//// //currentWorkorderflag 0 for current workorder; 1 for next workorder
//// String currentWorkorderflag = resposArr[4];
////// String reflowgroupNumber = resposArr[5];
//// String labelName=resposArr[5];//标签名称
//// String numberofPartnumbers = resposArr[6];
//// LiteOrder liteOrder = liteOrderManager.findByOrderNo(workorderNumber);
//// if(liteOrder != null){
//// log.info("数据库中已存在工单号为["+workorderNumber+"]的工单,忽略");
//// int resultCode=-1;
//// String resultMsg="workorderNumber ["+workorderNumber+"] already exists";
//// String respMsg = "orderMaterialExtResp;"+ responseEventId+";" + resultCode+";"+resultMsg+";"+workorderNumber+";"+currentWorkorderflag+";"+labelName+";"+numberofPartnumbers ;
////
//// HellaTcpClient.sendMsg(respMsg,session);
//// }else{
//// List<LiteOrderItem> items = Lists.newArrayList();
//// int startIndex = 6;
//// while(startIndex+2<resposArr.length){
//// String partNumber = resposArr[startIndex + 1];
//// String numberofReels = resposArr[startIndex+2];
//// LiteOrderItem item = new LiteOrderItem();
//// item.setPn(partNumber);
//// item.setNeedReelCount(Integer.valueOf(numberofReels));
//// items.add(item);
//// startIndex = startIndex + 2;
//// }
//// liteOrder = new LiteOrder(workorderNumber,items);
//// liteOrder.setSource(groupName);
//// log.info("新增加订单:" + liteOrder.getOrderNo()+",设备组名称["+groupName+"],标签名称["+labelName+"]");
//// liteOrder = liteOrderManager.createWithItems(liteOrder);
//// liteOrderCache.addOrderToMap(liteOrder);
//// //对工单进行锁定
//// List<String> storageIdList = new ArrayList<>();
////
//// Map<String, Storage> allStorage = dataCache.getAllStorage();
//// Group group = groupManager.getByGroupName(groupName);
//// if(group != null){
//// for (Storage storage : allStorage.values()) {
////// if(storage.getGroupId().equals(storage.getGroupId())){
//// if(storage.IsRightGroup(group.getId())){
//// storageIdList.add(storage.getId());
//// }
//// }
//// }
////
//// //增加标签过滤
//// String labelId="";
//// if(ObjectUtil.isNotEmpty(labelName)){
//// Label label=labelManager.getBylabelName(labelName );
//// if(label!=null){
//// labelId=label.getId() ;
//// }
//// }
////
////
//// CHECKOUT_TYPE checkOutType = dataCache.getCheckOutType();
//// Collection<String> excludePosIds = new ArrayList<>();
////
//// String resultCode = "0";
//// String resultMsg = "OK";
//// String resultDataStr = "";
//// for (LiteOrderItem liteOrderItem : liteOrder.getOrderItems()) {
//// int reelCount = liteOrderItem.getNeedReelCount();
//// String pn = liteOrderItem.getPn();
//// int lockCount = 0;
//// while(lockCount < reelCount){
//// StoragePos pos = storagePosManager.findPartNumberInStorages(storageIdList,labelId, pn, excludePosIds, checkOutType);
//// if(pos == null){
//// break;
//// }else{
//// try {
//// Barcode barcode = pos.getBarcode();
//// resultDataStr = resultDataStr + ";" + barcode.getPartNumber()+ ";" + barcode.getBarcode()+";"+barcode.getAmount();
//// barcode.setLockId(workorderNumber);
//// barcode.setLockName(liteOrderItem.getId());
//// pos.setBarcode(barcode);
//// storagePosManager.save(pos);
//// Storage storage = dataCache.getStorageById(pos.getStorageId());
//// dataCache.lockOneReel(storage.getCid(),pn);
//// } catch (ValidateException e) {
//// log.error("锁定料盘出错",e);
//// }
//// lockCount = lockCount + 1;
//// }
//// }
////
//// int notFoundReelCount = reelCount - lockCount;
//// if(notFoundReelCount > 0){
//// //有未绑定的
//// resultCode = "-1";
//// resultMsg = "Some material not on the shelf";
//// for (int i=0;i<notFoundReelCount;i++){
//// resultDataStr = resultDataStr + ";" + pn + ";NOT_FOUND;0";
//// }
//// }
//// }
////
//// if("1".equals(currentWorkorderflag)){
//// liteOrderCache.checkOutOrder(liteOrder);
//// }
//// //<STX>orderMaterialExtResp;eventId;returnCode;messageText;workorderNumber;currentWorkorderflag;reflowgroupNumber;numberofPartnumbers;partNumber1;containerNumber;quantity;…;partNumberN;containerNumberN;quantityN<CR><LF>
//// //<STX>orderMaterialExtResp;1;0;OK;61598;1;325.618-01;3;790.130-13;abcde;3000; 790.131-01;abcdf;5000;790.131-01;abcdg;2580<CR><LF>
//// //orderMaterialExtResp;0;-1;Some material not on the shelf;1408;1;325.618-01;1;;791.704-06NOT_FOUND;0
//// //<STX>orderMaterialExtResp;eventId;returnCode;messageText;workorderNumber;currentWorkorderflag;reflowgroupNumber;numberofPartnumbers;partNumber1;containerNumber;quantity;…;partNumberN;containerNumberN;quantityN<CR><LF>
//// String respMsg = "orderMaterialExtResp;"+ responseEventId+";" + resultCode+";"+resultMsg+";"+workorderNumber+";"+currentWorkorderflag+";"+labelName+";"+numberofPartnumbers +resultDataStr;
////// log.info("工单结果:" + respMsg);
////// session.write("\02"+respMsg);
////
//// HellaTcpClient.sendMsg(respMsg,session);
//// }
// }
//
// /**
// * 入库完成通知
// * <STX>loadMaterial;eventId;scannedCode;shelfNumber;shelfSlot<CR><LF>
// * @return
// */
// private void loadMaterial(String groupId, String scannedCode,String shelfNumber, String shelfSlot){
// HellaReqCommand command = HellaReqCommand.newLoadMaterialCmd(eventId.incrementAndGet(),scannedCode,shelfNumber,shelfSlot);
// command.setGroupId(groupId);
// commandMap.put(command.getEventId(),command);
// log.info("发送入库完成通知:" + command.toReqMsg());
// HellaTcpClient.sendMsg(command.toReqMsg());
// }
//
// @Override
// public void onTaskStatusChange(DataLog task) {
// if(task.isFinished()){
// if(task.isPutInTask()){
// String groupId = task.getGroupId();
// String fullCode = task.getBarcode();
// Barcode barcode = barcodeManager.findByBarcode(task.getBarcode());
// if(barcode != null){
// fullCode = barcode.getFullCode();
// }
// loadMaterial(groupId,fullCode,task.getStorageName(),task.getPosName());
// }
// }
// }
//
//
//}
src/main/java/com/neotel/smfcore/hella/tcp/HellaTcpClient.java
查看文件 @
f13d726
package
com
.
neotel
.
smfcore
.
hella
.
tcp
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.google.common.base.Strings
;
import
com.neotel.smfcore.common.bean.ResultBean
;
import
com.neotel.smfcore.common.utils.StringUtils
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.system.service.po.Settings
;
import
com.neotel.smfcore.hella.handler.HellaServiceHandler
;
import
lombok.Data
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
org.apache.mina.core.filterchain.IoFilterAdapter
;
import
org.apache.mina.core.future.ConnectFuture
;
import
org.apache.mina.core.session.IdleStatus
;
import
org.apache.mina.core.session.IoSession
;
import
org.apache.mina.filter.codec.ProtocolCodecFilter
;
import
org.apache.mina.filter.codec.textline.LineDelimiter
;
import
org.apache.mina.filter.codec.textline.TextLineCodecFactory
;
import
org.apache.mina.filter.logging.MdcInjectionFilter
;
import
org.apache.mina.transport.socket.nio.NioSocketConnector
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Service
;
import
javax.annotation.PostConstruct
;
import
javax.annotation.PreDestroy
;
import
java.net.InetSocketAddress
;
import
java.nio.charset.Charset
;
/**
* Created by sunke on 2019/4/17.
*/
@Slf4j
@Service
public
class
HellaTcpClient
{
private
static
NioSocketConnector
connector
;
private
static
String
host
=
""
;
private
static
int
port
=
9999
;
@Value
(
"${hella.host:}"
)
public
void
setHost
(
String
host
)
{
HellaTcpClient
.
host
=
host
;
}
@Value
(
"${hella.port:9999}"
)
public
void
setPort
(
int
port
)
{
HellaTcpClient
.
port
=
port
;
}
@Autowired
private
HellaServiceHandler
hellaServiceHandler
;
@Autowired
private
DataCache
dataCache
;
private
static
IoSession
theSession
;
@PostConstruct
public
void
init
(){
host
=
dataCache
.
GetConfigCache
(
"hella.host"
,
"hella.host"
,
host
);
port
=
Integer
.
parseInt
(
dataCache
.
GetConfigCache
(
"hella.port"
,
"hella.port"
,
port
+
""
))
;
updateServerInfo
(
host
,
port
);
if
(
ObjectUtil
.
isEmpty
(
host
)||
ObjectUtil
.
isEmpty
(
port
)){
log
.
info
(
"配置不完整,不需要连接"
);
}
else
{
start
();
}
}
public
static
boolean
isEnable
()
{
if
(
ObjectUtil
.
isEmpty
(
host
)
||
ObjectUtil
.
isEmpty
(
port
))
{
return
false
;
}
else
{
return
true
;
}
}
public
static
void
updateServerInfo
(
String
serverHost
,
int
serverPort
){
host
=
serverHost
;
port
=
serverPort
;
log
.
info
(
"设置Tcp连接信息为["
+
host
+
":"
+
port
+
"]"
);
if
(
connector
!=
null
){
connector
.
dispose
();
}
//connectThreadStart();
}
public
void
start
(){
connector
=
new
NioSocketConnector
();
//创建连接客户端
connector
.
setConnectTimeoutMillis
(
30000
);
//设置连接超时
//断线重连回调拦截器
connector
.
getFilterChain
().
addFirst
(
"reconnection"
,
new
IoFilterAdapter
()
{
@Override
public
void
sessionClosed
(
NextFilter
nextFilter
,
IoSession
ioSession
)
throws
Exception
{
log
.
info
(
"执行断线重连"
);
connectThreadStart
();
}
});
connector
.
getFilterChain
().
addLast
(
"mdc"
,
new
MdcInjectionFilter
());
TextLineCodecFactory
factory
=
new
TextLineCodecFactory
(
Charset
.
defaultCharset
(),
LineDelimiter
.
CRLF
,
LineDelimiter
.
CRLF
);
// factory.setDecoderMaxLineLength(10240);
// factory.setEncoderMaxLineLength(10240);
//加入解码器
connector
.
getFilterChain
().
addLast
(
"codec"
,
new
ProtocolCodecFilter
(
factory
));
connector
.
getSessionConfig
().
setReceiveBufferSize
(
10240
);
// 设置接收缓冲区的大小
connector
.
getSessionConfig
().
setSendBufferSize
(
10240
);
// 设置输出缓冲区的大小
connector
.
getSessionConfig
().
setIdleTime
(
IdleStatus
.
BOTH_IDLE
,
30000
);
//读写都空闲时间:30秒
connector
.
getSessionConfig
().
setIdleTime
(
IdleStatus
.
READER_IDLE
,
40000
);
//读(接收通道)空闲时间:40秒
connector
.
getSessionConfig
().
setIdleTime
(
IdleStatus
.
WRITER_IDLE
,
50000
);
//写(发送通道)空闲时间:50秒
//添加处理器
connector
.
setHandler
(
hellaServiceHandler
);
log
.
info
(
"开始连接"
);
connectThreadStart
();
}
// 停止MINA服务
@PreDestroy
public
void
stop
()
{
try
{
if
(
connector
!=
null
){
log
.
info
(
"stopping the TCP Client"
);
connector
.
dispose
();
}
else
{
log
.
info
(
"stopping the TCP Client: connector=null "
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"TCP Server stop error:"
,
e
);
}
}
private
static
boolean
isConnectThreadRunning
=
false
;
public
static
void
connectThreadStart
(){
if
(
isConnectThreadRunning
){
return
;
}
isConnectThreadRunning
=
true
;
new
Thread
(
new
Runnable
()
{
public
void
run
()
{
for
(;;)
{
try
{
Thread
.
sleep
(
5000
);
// 连接失败后,重连
if
(!
Strings
.
isNullOrEmpty
(
host
)){
connector
.
setDefaultRemoteAddress
(
new
InetSocketAddress
(
host
,
port
));
// 设置默认访问地址
ConnectFuture
future
=
connector
.
connect
();
// 等待连接创建成功
future
.
awaitUninterruptibly
();
// 获取会话
IoSession
ioSession
=
future
.
getSession
();
if
(
ioSession
.
isConnected
()){
theSession
=
ioSession
;
log
.
info
(
"连接["
+
connector
.
getDefaultRemoteAddress
().
getHostName
()
+
":"
+
connector
.
getDefaultRemoteAddress
().
getPort
()+
"]成功"
);
break
;
}
else
{
theSession
=
null
;
}
}
}
catch
(
Exception
e
)
{
log
.
error
(
"连接服务端"
+
host
+
":"
+
port
+
"失败"
+
",异常内容:"
+
e
.
getMessage
(),
e
);
}
}
isConnectThreadRunning
=
false
;
}
}).
start
();
}
public
static
ResultBean
sendMsg
(
String
msg
){
if
(
theSession
!=
null
&&
theSession
.
isConnected
()){
log
.
info
(
"发送消息到Tcp Server:"
+
msg
);
theSession
.
write
(
"\02"
+
msg
);
return
ResultBean
.
newOkResult
(
""
);
}
else
{
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.noconnecttion"
,
"no connecttion"
);
}
}
public
static
void
sendMsg
(
String
msg
,
IoSession
session
){
log
.
info
(
"发送反馈消息:"
+
msg
);
session
.
write
(
"\02"
+
msg
);
}
}
//package com.neotel.smfcore.hella.tcp;
//
//import cn.hutool.core.util.ObjectUtil;
//import com.google.common.base.Strings;
//import com.neotel.smfcore.common.bean.ResultBean;
//import com.neotel.smfcore.common.utils.StringUtils;
//import com.neotel.smfcore.core.device.util.DataCache;
//import com.neotel.smfcore.core.system.service.po.Settings;
//import lombok.Data;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;
//import org.apache.mina.core.filterchain.IoFilterAdapter;
//import org.apache.mina.core.future.ConnectFuture;
//import org.apache.mina.core.session.IdleStatus;
//import org.apache.mina.core.session.IoSession;
//import org.apache.mina.filter.codec.ProtocolCodecFilter;
//import org.apache.mina.filter.codec.textline.LineDelimiter;
//import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
//import org.apache.mina.filter.logging.MdcInjectionFilter;
//import org.apache.mina.transport.socket.nio.NioSocketConnector;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.PreDestroy;
//import java.net.InetSocketAddress;
//import java.nio.charset.Charset;
//
///**
// * Created by sunke on 2019/4/17.
// */
//@Slf4j
//@Service
//public class HellaTcpClient {
//
// private static NioSocketConnector connector;
//
//
// private static String host = "";
// private static int port = 9999;
//
// @Value("${hella.host:}")
// public void setHost(String host) {
// HellaTcpClient.host = host;
// }
//
// @Value("${hella.port:9999}")
// public void setPort(int port) {
// HellaTcpClient.port = port;
// }
//
// @Autowired
// private HellaServiceHandler hellaServiceHandler;
//
// @Autowired
// private DataCache dataCache;
//
// private static IoSession theSession;
//
//
// @PostConstruct
// public void init(){
// host=dataCache.GetConfigCache("hella.host","hella.host",host);
// port=Integer.parseInt(dataCache.GetConfigCache("hella.port","hella.port",port+"")) ;
// updateServerInfo(host, port);
// if(ObjectUtil.isEmpty(host)||ObjectUtil.isEmpty(port)){
// log.info("配置不完整,不需要连接");
// }else{
// start();
// }
// }
//
// public static boolean isEnable() {
// if (ObjectUtil.isEmpty(host) || ObjectUtil.isEmpty(port)) {
// return false;
// } else {
// return true;
// }
// }
//
// public static void updateServerInfo(String serverHost, int serverPort){
// host = serverHost;
// port = serverPort;
// log.info("设置Tcp连接信息为["+host+":"+port+"]");
// if(connector != null){
// connector.dispose();
// }
// //connectThreadStart();
// }
//
// public void start(){
// connector = new NioSocketConnector(); //创建连接客户端
// connector.setConnectTimeoutMillis(30000); //设置连接超时
// //断线重连回调拦截器
// connector.getFilterChain().addFirst("reconnection", new IoFilterAdapter() {
// @Override
// public void sessionClosed(NextFilter nextFilter, IoSession ioSession) throws Exception {
// log.info("执行断线重连");
// connectThreadStart();
// }
// });
//
// connector.getFilterChain().addLast("mdc", new MdcInjectionFilter());
// TextLineCodecFactory factory = new TextLineCodecFactory(Charset.defaultCharset(), LineDelimiter.CRLF,LineDelimiter.CRLF);
//// factory.setDecoderMaxLineLength(10240);
//// factory.setEncoderMaxLineLength(10240);
// //加入解码器
// connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(factory));
//
// connector.getSessionConfig().setReceiveBufferSize(10240); // 设置接收缓冲区的大小
// connector.getSessionConfig().setSendBufferSize(10240);// 设置输出缓冲区的大小
//
// connector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30000); //读写都空闲时间:30秒
// connector.getSessionConfig().setIdleTime(IdleStatus.READER_IDLE, 40000);//读(接收通道)空闲时间:40秒
// connector.getSessionConfig().setIdleTime(IdleStatus.WRITER_IDLE, 50000);//写(发送通道)空闲时间:50秒
//
// //添加处理器
// connector.setHandler(hellaServiceHandler);
// log.info("开始连接");
// connectThreadStart();
//
//
// }
// // 停止MINA服务
// @PreDestroy
// public void stop() {
// try {
// if(connector!=null){
// log.info("stopping the TCP Client");
// connector.dispose();
// }else{
// log.info("stopping the TCP Client: connector=null ");
// }
// } catch (Exception e) {
// log.error("TCP Server stop error:",e);
// }
// }
//
// private static boolean isConnectThreadRunning = false;
// public static void connectThreadStart(){
// if(isConnectThreadRunning){
// return;
// }
// isConnectThreadRunning = true;
// new Thread(new Runnable() {
// public void run() {
// for (;;) {
// try {
// Thread.sleep(5000);// 连接失败后,重连
// if(!Strings.isNullOrEmpty(host)){
// connector.setDefaultRemoteAddress(new InetSocketAddress(host, port));// 设置默认访问地址
// ConnectFuture future = connector.connect();
// // 等待连接创建成功
// future.awaitUninterruptibly();
// // 获取会话
// IoSession ioSession = future.getSession();
// if(ioSession.isConnected()){
// theSession = ioSession;
// log.info("连接["+ connector.getDefaultRemoteAddress().getHostName() +":"+ connector.getDefaultRemoteAddress().getPort()+"]成功");
// break;
// }else{
// theSession = null;
// }
// }
// } catch (Exception e) {
// log.error("连接服务端" + host + ":" + port + "失败" + ",异常内容:" + e.getMessage(), e);
// }
// }
// isConnectThreadRunning = false;
// }
// }).start();
//
// }
//
//
// public static ResultBean sendMsg(String msg){
// if(theSession != null && theSession.isConnected()){
// log.info("发送消息到Tcp Server:" + msg);
// theSession.write("\02"+msg);
// return ResultBean.newOkResult("");
// }else{
// return ResultBean.newErrorResult(-1,"smfcore.noconnecttion","no connecttion");
// }
// }
//
// public static void sendMsg(String msg,IoSession session){
// log.info("发送反馈消息:" + msg);
// session.write("\02" + msg);
// }
//
//}
src/main/java/com/neotel/smfcore/hikvision/HikApi.java
查看文件 @
f13d726
...
...
@@ -330,6 +330,7 @@ public class HikApi {
RequestParam
info
=
new
RequestParam
(
getReqCode
(),
userName
,
dataMap
);
HikApiRequest
request
=
new
HikApiRequest
(
5
,
url
,
config
.
key_5_putInApi
,
config
.
secret_5_putInApi
,
info
);
apiName
=
apiName
+
" ("
+
info
.
getReqCode
()+
") "
;
log
.
info
(
apiName
+
" 发送 "
+
info
.
getData
());
try
{
...
...
src/main/java/com/neotel/smfcore/hikvision/HikvisionApiController.java
查看文件 @
f13d726
...
...
@@ -74,8 +74,7 @@ public class HikvisionApiController {
// msg string 提示消息
// data 返回数据
if
(
outInfos
!=
null
&&
outInfos
.
size
()
>
0
)
{
for
(
HikOrderInfo
outInfo
:
outInfos
)
{
for
(
HikOrderInfo
outInfo
:
outInfos
)
{
//查找工单是否存在
String
orderNo
=
outInfo
.
getJobNo
();
...
...
src/main/java/com/neotel/smfcore/security/config/CustomMongoProperties.java
0 → 100644
查看文件 @
f13d726
package
com
.
neotel
.
smfcore
.
security
.
config
;
import
lombok.Data
;
@Data
public
class
CustomMongoProperties
{
private
String
host
;
private
Integer
port
;
private
String
database
;
private
Integer
maxConSize
=
200
;
private
Integer
minConSize
=
100
;
}
src/main/java/com/neotel/smfcore/security/config/MongoDbConfig.java
0 → 100644
查看文件 @
f13d726
package
com
.
neotel
.
smfcore
.
security
.
config
;
import
com.mongodb.MongoClientSettings
;
import
com.mongodb.ServerAddress
;
import
com.mongodb.client.MongoClient
;
import
com.mongodb.client.MongoClients
;
import
com.mongodb.connection.ClusterConnectionMode
;
import
com.mongodb.connection.ClusterType
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.data.mongodb.MongoDatabaseFactory
;
import
org.springframework.data.mongodb.core.MongoTemplate
;
import
org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory
;
import
java.util.ArrayList
;
import
java.util.List
;
@Configuration
public
class
MongoDbConfig
{
@Bean
(
name
=
"mongoProperties"
)
@ConfigurationProperties
(
prefix
=
"spring.data.mongodb"
)
protected
CustomMongoProperties
mongoProperties
()
{
return
new
CustomMongoProperties
();
}
@Primary
@Bean
(
name
=
"mongoTemplate"
)
public
MongoTemplate
mongoTemplate
(
@Qualifier
(
"mongoProperties"
)
CustomMongoProperties
mongoProperties
)
{
return
new
MongoTemplate
(
mongoDbFactory
(
mongoProperties
));
}
private
static
MongoDatabaseFactory
mongoDbFactory
(
CustomMongoProperties
mongoProperties
)
{
ClusterConnectionMode
clusterConnectionMode
;
ClusterType
clusterType
;
List
<
ServerAddress
>
serverAddressList
=
new
ArrayList
<>();
clusterConnectionMode
=
ClusterConnectionMode
.
SINGLE
;
clusterType
=
ClusterType
.
STANDALONE
;
ServerAddress
serverAddress
=
new
ServerAddress
(
mongoProperties
.
getHost
(),
mongoProperties
.
getPort
());
serverAddressList
.
add
(
serverAddress
);
MongoClientSettings
setting
=
MongoClientSettings
.
builder
()
.
applyToClusterSettings
(
builder
->
builder
.
hosts
(
serverAddressList
)
.
mode
(
clusterConnectionMode
)
.
requiredClusterType
(
clusterType
)
).
applyToConnectionPoolSettings
(
builder
->
builder
.
maxSize
(
mongoProperties
.
getMaxConSize
())
.
minSize
(
mongoProperties
.
getMinConSize
())
).
build
();
MongoClient
mongoClient
=
MongoClients
.
create
(
setting
);
return
new
SimpleMongoClientDatabaseFactory
(
mongoClient
,
mongoProperties
.
getDatabase
());
}
}
\ No newline at end of file
src/main/resources/config/application.yml
查看文件 @
f13d726
...
...
@@ -93,7 +93,8 @@ spring:
mongodb
:
host
:
localhost
# 主机地址
port
:
27017
# 端口
database
:
hikvision20220801
# 数据库
database
:
hikvision
# 数据库
messages
:
encoding
:
utf-8
main
:
...
...
src/main/resources/log4j2-spring.xml
查看文件 @
f13d726
...
...
@@ -6,10 +6,10 @@
</Properties>
<appenders>
<Console
name=
"Console"
target=
"SYSTEM_OUT"
>
<PatternLayout
pattern=
"%d{yyyy-MM-dd HH:mm:ss} %-5level [%file:%line] - %msg%n"
/>
<PatternLayout
pattern=
"%d{yyyy-MM-dd HH:mm:ss
.SSS
} %-5level [%file:%line] - %msg%n"
/>
</Console>
<RollingFile
name=
"log"
fileName=
"${LOG_HOME}/${LOG_NAME}"
filePattern=
"${LOG_HOME}/%d{yyyy-MM-dd}.${LOG_NAME}"
append=
"true"
>
<PatternLayout
charset=
"GB18030"
pattern=
"%d{yyyy-MM-dd HH:mm:ss} %-5level [%file:%line] - %msg%n"
/>
<PatternLayout
charset=
"GB18030"
pattern=
"%d{yyyy-MM-dd HH:mm:ss
.SSS
} %-5level [%file:%line] - %msg%n"
/>
<Policies>
<TimeBasedTriggeringPolicy
modulate=
"true"
interval=
"1"
/>
</Policies>
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论