Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit c4bea40f
由
LN
编写于
2024-05-24 08:49:30 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
韩华接口调试修改
1 个父辈
06d99ddb
全部展开
显示空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
141 行增加
和
19 行删除
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
src/main/java/com/neotel/smfcore/core/order/service/po/LiteOrderItem.java
src/main/java/com/neotel/smfcore/custom/hanwha/client/MyWebSocketClient.java
src/main/java/com/neotel/smfcore/custom/hanwha/handler/HanwhaApiHandler.java
src/main/java/com/neotel/smfcore/custom/hanwha/handler/TMSApis.java
src/main/java/com/neotel/smfcore/custom/hanwha/handler/TMSCommunicator.java
src/main/java/com/neotel/smfcore/custom/hanwha/handler/bean/TMSPos.java
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
查看文件 @
c4bea40
...
...
@@ -427,10 +427,13 @@ public class LiteOrderCache {
boolean
singleOut
=
false
;
return
checkOutLiteOrder
(
orderNo
,
outBom
,
singleOut
);
}
public
synchronized
String
checkOutLiteOrder
(
String
orderNo
,
boolean
outBom
,
boolean
singleOut
)
{
return
checkOutLiteOrder
(
orderNo
,
outBom
,
singleOut
,
false
);
}
/**
* 执行工单出库
*/
public
synchronized
String
checkOutLiteOrder
(
String
orderNo
,
boolean
outBom
,
boolean
singleOut
)
{
public
synchronized
String
checkOutLiteOrder
(
String
orderNo
,
boolean
outBom
,
boolean
singleOut
,
boolean
needCheck
)
{
LiteOrder
cacheOrder
=
liteOrderMap
.
get
(
orderNo
);
if
(
cacheOrder
==
null
)
{
...
...
@@ -462,6 +465,7 @@ public class LiteOrderCache {
return
checkOutOrder
(
cacheOrder
).
getMsgKey
();
}
log
.
info
(
"开始执行工单["
+
orderNo
+
"] outBom="
+
outBom
);
cacheOrder
.
setTaskReelCount
(
0
);
cacheOrder
.
setTaskFinishedTime
(-
1
);
...
...
@@ -474,9 +478,13 @@ public class LiteOrderCache {
//liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
int
taskReelCount
=
0
;
CHECKOUT_TYPE
checkoutType
=
dataCache
.
getCheckOutType
();
List
<
String
>
availableStorageIds
=
dataCache
.
getAvailableStorageIds
();
if
(
needCheck
&&(
shortageCheck
(
cacheOrder
,
outBom
)))
{
return
"smfcore.order.out.noTask"
;
}
List
<
String
>
availableStorageIds
=
dataCache
.
getAvailableStorageIds
();
//其他出库模式一次性全部生成任务
for
(
LiteOrderItem
orderItem
:
cacheOrder
.
getOrderItems
())
{
orderItem
.
setOutNum
(
0
);
...
...
@@ -570,6 +578,91 @@ public class LiteOrderCache {
}
return
""
;
}
public
boolean
shortageCheck
(
LiteOrder
cacheOrder
,
boolean
outBom
)
{
String
orderNo
=
cacheOrder
.
getOrderNo
();
boolean
shortReel
=
false
;
try
{
List
<
String
>
availableStorageIds
=
dataCache
.
getAvailableStorageIds
();
CHECKOUT_TYPE
checkoutType
=
dataCache
.
getCheckOutType
();
log
.
info
(
"工单["
+
orderNo
+
"]出库前需要进行缺料检查"
);
//其他出库模式一次性全部生成任务
List
<
LiteOrderItem
>
newItems
=
new
ArrayList
<>();
for
(
LiteOrderItem
orderItem
:
cacheOrder
.
getOrderItems
())
{
//剩余未出数量
Float
totalNum
=
orderItem
.
getNeedNum
()
*
cacheOrder
.
getOrderTimes
();
int
remainNum
=
totalNum
.
intValue
()
-
orderItem
.
getTotalOutNum
();
//剩余未出盘数
int
remainReelCount
=
orderItem
.
getNeedReelCount
()
-
orderItem
.
getTotalOutReelCount
();
Collection
<
String
>
excludePosIds
=
excludeOutPosIds
();
//此PN未完成
if
(
remainNum
>
0
||
remainReelCount
>
0
)
{
if
(
outBom
)
{
//套料出库,设置剩余数量为1,这样就只会出一盘
remainNum
=
1
;
remainReelCount
=
0
;
}
int
assignNum
=
0
;
int
assignReelCount
=
0
;
while
(
assignNum
<
remainNum
||
assignReelCount
<
remainReelCount
)
{
String
partNumber
=
orderItem
.
getPn
();
String
reelId
=
orderItem
.
getRi
();
String
mpn
=
orderItem
.
getMpn
();
StoragePos
pos
=
null
;
if
(!
Strings
.
isNullOrEmpty
(
reelId
))
{
//RI
pos
=
storagePosManager
.
getByBarcode
(
reelId
);
if
(
pos
==
null
)
{
log
.
error
(
"工单["
+
orderNo
+
"]RI出库时,未找到料盘["
+
reelId
+
"],返回缺料"
);
shortReel
=
true
;
orderItem
.
addAppendDate
(
"shortage"
,
"true"
);
liteOrderItemManager
.
save
(
orderItem
);
break
;
}
else
{
excludePosIds
.
add
(
pos
.
getPosName
());
}
break
;
}
else
if
(
Strings
.
isNullOrEmpty
(
reelId
)
&&
!
Strings
.
isNullOrEmpty
(
partNumber
))
{
//PN
pos
=
storagePosManager
.
findPartNumberInStorages
(
availableStorageIds
,
""
,
partNumber
,
excludePosIds
,
checkoutType
,
orderItem
.
getAppendData
());
}
else
if
(
Strings
.
isNullOrEmpty
(
reelId
)
&&
Strings
.
isNullOrEmpty
(
partNumber
)
&&
!
Strings
.
isNullOrEmpty
(
mpn
))
{
pos
=
storagePosManager
.
findMpnInStorages
(
availableStorageIds
,
mpn
,
excludePosIds
,
checkoutType
,
orderItem
.
getAppendData
());
}
if
(
pos
==
null
)
{
shortReel
=
true
;
log
.
error
(
"工单["
+
orderNo
+
"]未找到可以出库的物料PN=["
+
partNumber
+
"],返回缺料"
);
orderItem
.
addAppendDate
(
"shortage"
,
"true"
);
liteOrderItemManager
.
save
(
orderItem
);
break
;
}
else
{
assignNum
=
assignNum
+
pos
.
getBarcode
().
getAmount
();
assignReelCount
=
assignReelCount
+
1
;
excludePosIds
.
add
(
pos
.
getPosName
());
}
}
}
newItems
.
add
(
orderItem
);
}
}
catch
(
Exception
ex
)
{
log
.
info
(
"工单["
+
orderNo
+
"]缺料检查出错:"
+
ex
.
toString
());
}
if
(
shortReel
){
cacheOrder
.
setClosed
(
true
);
cacheOrder
.
setStatus
(
LITEORDER_STATUS
.
CLOSED
);
liteOrderManager
.
save
(
cacheOrder
);
liteOrderMap
.
put
(
cacheOrder
.
getOrderNo
(),
cacheOrder
);
log
.
info
(
"工单["
+
orderNo
+
"]缺料,直接关闭工单 "
);
}
return
shortReel
;
}
/**
* 防止仓位任务重复,需要排除掉已经分配掉的出库仓位
*/
...
...
src/main/java/com/neotel/smfcore/core/order/service/po/LiteOrderItem.java
查看文件 @
c4bea40
...
...
@@ -103,6 +103,20 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
*/
public
Map
<
String
,
String
>
appendData
=
new
HashMap
<>();
public
void
addAppendDate
(
String
key
,
String
value
){
if
(
appendData
==
null
){
appendData
=
new
HashMap
<>();
}
appendData
.
put
(
key
,
value
);
}
public
String
getAppend
(
String
key
)
{
if
(
appendData
!=
null
&&
appendData
.
containsKey
(
key
))
{
return
appendData
.
get
(
key
);
}
return
""
;
}
/**
* 出库是否满足要求,已出库数量大于需求数量
*/
...
...
src/main/java/com/neotel/smfcore/custom/hanwha/client/MyWebSocketClient.java
查看文件 @
c4bea40
...
...
@@ -31,7 +31,7 @@ public class MyWebSocketClient extends WebSocketClient {
@Override
public
void
onMessage
(
String
s
)
{
log
.
info
(
"onMessage: "
+
s
);
//
log.info("onMessage: "+s);
if
(
msgReceivedListener
!=
null
){
msgReceivedListener
.
onMsgReceived
(
s
);
}
...
...
src/main/java/com/neotel/smfcore/custom/hanwha/handler/HanwhaApiHandler.java
查看文件 @
c4bea40
...
...
@@ -11,7 +11,6 @@ import com.neotel.smfcore.core.order.service.po.LiteOrder;
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.manager.IDataLogManager
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
com.neotel.smfcore.core.system.util.DevicesStatusUtil
;
import
com.neotel.smfcore.custom.hanwha.handler.bean.TMSPart
;
...
...
@@ -55,7 +54,6 @@ public class HanwhaApiHandler extends BaseSmfApiListener {
@Override
public
boolean
isForThisApi
(
String
apiName
)
{
return
apiName
!=
null
&&
apiName
.
equalsIgnoreCase
(
"hanwha"
)
&&
TMSCommunicator
.
isEnable
();
}
@Autowired
...
...
@@ -104,6 +102,10 @@ public class HanwhaApiHandler extends BaseSmfApiListener {
if
(
result
.
size
()
>
0
)
{
String
pn
=
result
.
get
(
0
).
getPartName
();
String
code
=
result
.
get
(
0
).
getReelCode
();
// 2024-05-23 14:15:45.749 INFO [TMSApis.java:473] - PostJson, url=[http://192.168.101.96:8082/webservice/RequestGetPartInfo],
// send=[{"data":{"RequestID":0,"ReelCode":"20180710184319-001","Indate":"2024-05-23 14:15:45"}}],
// response=[{"RequestID":0,"Data":[{"PartName":"Z2203061201A","ReelCode":"20180710184319-001","Count":5000}],"error":null}]
boolean
needS
=
false
;
if
(
ObjectUtil
.
isNotEmpty
(
pn
))
{
barcode
.
setPartNumber
(
pn
);
...
...
@@ -198,6 +200,7 @@ public class HanwhaApiHandler extends BaseSmfApiListener {
if
(
storage
==
null
)
{
continue
;
}
storageIds
.
add
(
storage
.
getId
());
String
type
=
"Storage"
;
if
(
storage
.
isNLShelf
()
||
storage
.
isNLPShelf
()
||
storage
.
isNLMShelf
()
||
storage
.
isShelf
())
{
type
=
"Rack"
;
...
...
src/main/java/com/neotel/smfcore/custom/hanwha/handler/TMSApis.java
查看文件 @
c4bea40
...
...
@@ -33,7 +33,8 @@ public class TMSApis {
Map
<
String
,
Object
>
sendData
=
new
HashMap
<>();
sendData
.
put
(
"data"
,
dataMap
);
String
responseStr
=
PostJson
(
url
,
sendData
);
if
(!
ObjectUtil
.
isNotEmpty
(
responseStr
))
{
if
(
ObjectUtil
.
isNotEmpty
(
responseStr
))
{
// {"RequestID":0,"Data":[{"PartName":"Z2203061201A","ReelCode":"20180710184319-001","Count":5000}],"error":null}
Map
<
String
,
Object
>
dataMap2
=
JsonUtil
.
toMap
(
responseStr
);
List
<
Object
>
jArray
=
(
List
<
Object
>)
dataMap2
.
get
(
"Data"
);
...
...
@@ -142,7 +143,7 @@ public class TMSApis {
Map
<
String
,
Object
>
sendData
=
new
HashMap
<>();
sendData
.
put
(
"data"
,
dataMap
);
String
responseStr
=
PostJson
(
url
,
sendData
);
if
(
!
ObjectUtil
.
isNotEmpty
(
responseStr
))
{
if
(
ObjectUtil
.
isNotEmpty
(
responseStr
))
{
List
<
Object
>
resList
=
JsonUtil
.
toList
(
responseStr
,
Object
.
class
);
for
(
Object
obj
:
resList
)
{
Map
<
String
,
Object
>
map
=
JsonUtil
.
toMap
(
JsonUtil
.
toJsonStr
(
obj
));
...
...
@@ -473,4 +474,5 @@ public class TMSApis {
log
.
info
(
"PostJson, url=["
+
url
+
"],send=["
+
JsonUtil
.
toJsonStr
(
sendData
)+
"],response=["
+
responseStr
+
"]"
);
return
responseStr
;
}
}
src/main/java/com/neotel/smfcore/custom/hanwha/handler/TMSCommunicator.java
查看文件 @
c4bea40
此文件的差异被折叠,
点击展开。
src/main/java/com/neotel/smfcore/custom/hanwha/handler/bean/TMSPos.java
查看文件 @
c4bea40
package
com
.
neotel
.
smfcore
.
custom
.
hanwha
.
handler
.
bean
;
import
cn.hutool.core.convert.Convert
;
import
cn.hutool.core.util.ObjectUtil
;
import
lombok.Data
;
import
lombok.extern.slf4j.Slf4j
;
...
...
@@ -44,39 +45,48 @@ public class TMSPos implements Serializable {
// setRowID(posName.substring(0,index-1));
// setColID(posName.substring(index+1,posName.length()-1));
// }
String
rowId
=
proStr
(
posName
);
String
colId
=
""
;
String
spit
=
"_"
;
String
[]
posArray
=
posName
.
split
(
spit
);
if
(
posArray
.
length
>=
2
)
{
if
(
posArray
.
length
>=
3
)
{
}
else
{
spit
=
"-"
;
posArray
=
posName
.
split
(
spit
);
}
try
{
String
rowId
=
proStr
(
posName
)
;
String
colId
=
""
;
if
(
posArray
.
length
==
3
)
{
rowId
=
Convert
.
toInt
(
posArray
[
1
])
+
""
;
colId
=
Convert
.
toInt
(
posArray
[
2
])
+
""
;
}
}
catch
(
Exception
ex
)
{
log
.
error
(
"解析出错:"
+
ex
.
toString
());
try
{
int
index
=
posName
.
lastIndexOf
(
spit
);
if
(
index
>
0
)
{
rowId
=
posName
.
substring
(
0
,
index
);
colId
=
posName
.
substring
(
index
+
1
,
posName
.
length
());
}
else
{
String
nPosName
=
proStr
(
posName
);
if
(
nPosName
.
length
()>
2
)
{
String
nPosName
=
proStr
(
posName
);
if
(
nPosName
.
length
()
>
2
)
{
index
=
posName
.
length
()
-
2
;
rowId
=
posName
.
substring
(
0
,
index
);
colId
=
posName
.
substring
(
index
,
posName
.
length
());
}
}
setRowID
(
proStr
(
rowId
));
setColID
(
proStr
(
colId
));
// setColID(posArray[posArray.length - 1]);
// setRowID(posArray[posArray.length - 2]);
}
catch
(
Exception
ex
)
{
log
.
error
(
"解析位置的行列失败 "
+
posName
+
","
+
ex
.
toString
());
}
catch
(
Exception
ex2
)
{
log
.
error
(
"解析位置的行列失败 "
+
posName
+
","
+
ex2
.
toString
());
}
}
setRowID
(
proStr
(
rowId
));
setColID
(
proStr
(
colId
));
}
private
String
proStr
(
String
input
)
{
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论