Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit b557a600
由
zshaohui
编写于
2023-10-13 15:52:12 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
任务分配逻辑修改
1 个父辈
700055ad
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
136 行增加
和
83 行删除
src/main/java/com/neotel/smfcore/core/device/enums/OP_STATUS.java
src/main/java/com/neotel/smfcore/core/system/service/po/DataLog.java
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
src/main/java/com/neotel/smfcore/core/device/enums/OP_STATUS.java
查看文件 @
b557a60
...
...
@@ -67,5 +67,8 @@ public enum OP_STATUS {
* 需要从流水线上拿走
*/
NEED_AWAY
,
OUT_POS
OUT_POS
,
//出料口
ON_SLIDE
}
src/main/java/com/neotel/smfcore/core/system/service/po/DataLog.java
查看文件 @
b557a60
...
...
@@ -397,6 +397,10 @@ public class DataLog extends BasePo implements Serializable {
return
OP_STATUS
.
EXECUTING
.
name
().
equals
(
status
);
}
public
boolean
isOnSlide
()
{
return
OP_STATUS
.
ON_SLIDE
.
name
().
equals
(
status
);
}
public
boolean
isOnInnerLine
(){
return
OP_STATUS
.
ON_INNER_LINE
.
name
().
equals
(
status
);
}
...
...
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
查看文件 @
b557a60
...
...
@@ -84,19 +84,19 @@ public class TaskService {
/**
* key为料仓cid,value为A/B面
*/
private
static
Map
<
String
,
String
>
posSideMap
=
Maps
.
newConcurrentMap
();
private
static
Map
<
String
,
String
>
posSideMap
=
Maps
.
newConcurrentMap
();
/**
* key为料箱号,value库位号
*/
private
static
Map
<
String
,
String
>
boxPosName
=
Maps
.
newConcurrentMap
();
private
static
Map
<
String
,
String
>
boxPosName
=
Maps
.
newConcurrentMap
();
/**
* 出料口信息缓存
*/
public
static
Map
<
String
,
String
>
exportMap
=
Maps
.
newConcurrentMap
();
public
static
Map
<
String
,
String
>
exportMap
=
Maps
.
newConcurrentMap
();
// public TaskService(List<ITaskListener> listenerList){
// for (ITaskListener taskListener: listenerList) {
...
...
@@ -113,7 +113,7 @@ public class TaskService {
task
.
setType
(
OP
.
PUT_IN
);
task
.
setStatus
(
OP_STATUS
.
EXECUTING
.
name
());
task
.
setExtendType
(
ExtendType
.
AUTO_PUTIN
);
//自动入库
if
(
barcode
!=
null
)
{
if
(
barcode
!=
null
)
{
task
.
setWarehouseCode
(
barcode
.
getWarehouseCode
());
task
.
setDescribe
(
barcode
.
getDescribe
());
task
.
setBatchInfo
(
barcode
.
getBatch
());
...
...
@@ -126,7 +126,7 @@ public class TaskService {
barcodeManager
.
saveBarcode
(
barcode
);
}
String
loginUser
=
DevicesStatusUtil
.
getLastOpUsername
(
storage
.
getCid
());
if
(
Strings
.
isNullOrEmpty
(
loginUser
))
{
if
(
Strings
.
isNullOrEmpty
(
loginUser
))
{
loginUser
=
SecurityUtils
.
getLoginUsername
();
}
task
.
setOperator
(
loginUser
);
...
...
@@ -136,8 +136,8 @@ public class TaskService {
}
public
synchronized
String
checkout
(
Storage
storage
,
StoragePos
pos
,
boolean
isSingleOut
,
String
opUserName
,
String
stationName
)
throws
ValidateException
{
return
checkout
(
storage
,
pos
,
isSingleOut
,
opUserName
,
stationName
,
-
1
);
public
synchronized
String
checkout
(
Storage
storage
,
StoragePos
pos
,
boolean
isSingleOut
,
String
opUserName
,
String
stationName
)
throws
ValidateException
{
return
checkout
(
storage
,
pos
,
isSingleOut
,
opUserName
,
stationName
,
-
1
);
}
/**
...
...
@@ -149,7 +149,7 @@ public class TaskService {
* @return
* @throws ValidateException
*/
public
synchronized
String
checkout
(
Storage
storage
,
StoragePos
pos
,
boolean
isSingleOut
,
String
opUserName
,
String
stationName
,
int
extendType
)
throws
ValidateException
{
public
synchronized
String
checkout
(
Storage
storage
,
StoragePos
pos
,
boolean
isSingleOut
,
String
opUserName
,
String
stationName
,
int
extendType
)
throws
ValidateException
{
if
(
pos
.
getBarcode
()
==
null
)
{
String
msg
=
"库位["
+
pos
.
getPosName
()
+
"]中已无物料,忽略"
;
log
.
info
(
msg
);
...
...
@@ -197,7 +197,7 @@ public class TaskService {
task
.
setProvider
(
barcode
.
getProvider
());
task
.
setProviderNumber
(
barcode
.
getProviderNumber
());
task
.
setKeeperCode
(
barcode
.
getKeeperCode
());
if
(
StringUtils
.
isNotBlank
(
SecurityUtils
.
getLoginUsername
())){
if
(
StringUtils
.
isNotBlank
(
SecurityUtils
.
getLoginUsername
()))
{
task
.
setCreator
(
SecurityUtils
.
getLoginUsername
());
}
if
(
extendType
!=
-
1
)
{
...
...
@@ -247,11 +247,11 @@ public class TaskService {
for
(
DataLog
task
:
tasks
)
{
String
barcode
=
taskToExecute
.
getBarcode
();
String
posName
=
taskToExecute
.
getPosName
();
if
(
task
.
getType
()
==
taskToExecute
.
getType
())
{
if
(
task
.
getType
()
==
taskToExecute
.
getType
())
{
if
(!
Strings
.
isNullOrEmpty
(
barcode
)
&&
task
.
getBarcode
().
equals
(
barcode
))
{
log
.
info
(
"二维码:["
+
barcode
+
"]已在操作队列中,操作失败"
);
throw
new
ValidateException
(
"smfcore.error.barcode.inQueue"
,
"二维码[{0}]已在操作队列中,操作失败"
,
new
String
[]{
barcode
});
}
else
if
(
task
.
getPosName
().
equals
(
posName
)&&
ObjectUtil
.
isNotEmpty
(
posName
))
{
}
else
if
(
task
.
getPosName
().
equals
(
posName
)
&&
ObjectUtil
.
isNotEmpty
(
posName
))
{
log
.
info
(
"位置:["
+
posName
+
"]已在操作队列中,操作失败"
);
throw
new
ValidateException
(
"smfcore.error.pos.inQueue"
,
"位置:[{0}}]已在操作队列中,操作失败"
,
new
String
[]{
posName
});
}
...
...
@@ -278,6 +278,7 @@ public class TaskService {
}
return
allTasks
;
}
/**
* 获取所有任务
*/
...
...
@@ -318,11 +319,11 @@ public class TaskService {
log
.
info
(
"任务["
+
task
.
getId
()
+
"] posName["
+
task
.
getPosName
()
+
"] Reel Id["
+
task
.
getBarcode
()
+
"]取消成功"
);
//同时进行库位屏蔽
if
(
/*task.isPutInTask() &&*/
!
task
.
isFinished
()){
if
(
/*task.isPutInTask() &&*/
!
task
.
isFinished
())
{
String
posName
=
task
.
getPosName
();
if
(
StringUtils
.
isNotBlank
(
posName
)){
if
(
StringUtils
.
isNotBlank
(
posName
))
{
StoragePos
pos
=
storagePosManager
.
getByPosName
(
posName
);
if
(
pos
!=
null
){
if
(
pos
!=
null
)
{
//排查料架
Storage
storage
=
dataCache
.
getStorageById
(
pos
.
getStorageId
());
if
(!
storage
.
isNLShelf
()
&&
!
storage
.
isNLMShelf
()
&&
!
storage
.
isNLPShelf
()
&&
!
storage
.
isShelf
())
{
...
...
@@ -452,24 +453,11 @@ public class TaskService {
task
.
setUpdateDate
(
new
Date
());
return
task
;
}
//只能同时有两个正在执行的出库任务,如果超过两个不再分配了
/*if (task.isCheckOutTask()) {
checkoutSize++;
if (checkoutSize >= 2) {
//log.error("cid["+cid + "]的BOX["+ boxId+"]的出库任务已经超过2个,不再分配!");
return null;
}
}*/
}
}
//指定紧急单盘出库的优先出库,否则按批量出库处理
DataLog
singleOutTask
=
null
;
DataLog
outTask
=
null
;
for
(
DataLog
task
:
allTasks
)
{
//优先分配单盘任务和没有工单的任务
if
(
cid
.
equals
(
task
.
getCid
())
&&
task
.
isCheckOutTask
()
&&
task
.
isWait
())
{
String
posName
=
task
.
getPosName
();
...
...
@@ -483,89 +471,146 @@ public class TaskService {
}
}
}
if
(
singleOutTask
!=
null
)
{
log
.
info
(
"分配优先(单盘或无工单)出库任务"
+
singleOutTask
.
getBarcode
()
+
"["
+
singleOutTask
.
getPosName
()
+
"]到 "
+
cid
);
return
singleOutTask
;
}
//判断出料口位置是否一样
for
(
DataLog
task
:
allTasks
)
{
if
(
cid
.
equals
(
task
.
getCid
())
&&
task
.
isCheckOutTask
()
&&
task
.
isWait
())
{
String
posName
=
task
.
getPosName
();
if
(!
Strings
.
isNullOrEmpty
(
posName
))
{
if
(!
task
.
isSingleOut
())
{
if
(
outTask
==
null
||
task
.
getCreateDate
().
before
(
outTask
.
getCreateDate
()))
{
String
export
=
task
.
getExport
();
String
cacheExport
=
exportMap
.
get
(
cid
);
if
(
StringUtils
.
isNotBlank
(
cacheExport
))
{
if
(
cacheExport
.
equals
(
export
))
{
continue
;
}
DataLog
outTask
=
null
;
//获取上一次出料口
String
export
=
exportMap
.
get
(
cid
);
//1.找到与上一次出料口不同的任务
outTask
=
getNeedOutTask
(
allTasks
,
export
,
cid
,
true
);
//2.如果没找到,不找到最早的任务
if
(
outTask
==
null
)
{
outTask
=
getNeedOutTask
(
allTasks
,
export
,
cid
,
false
);
}
if
(
outTask
!=
null
)
{
if
(
outTask
.
getPlateSize
()
>
7
)
{
log
.
info
(
outTask
.
getBarcode
()
+
"当前任务为大盘料,不需要处理:"
+
outTask
.
getBarcode
());
}
//3.如果当前任务不是大盘料
else
{
//4.判断是否属于工单任务
String
sourceId
=
outTask
.
getSourceId
();
if
(
StringUtils
.
isNotBlank
(
sourceId
))
{
//5.判断工单在当前库位中有没有大盘料
DataLog
bigReelTask
=
getBigReelTask
(
allTasks
,
cid
);
if
(
bigReelTask
!=
null
)
{
log
.
info
(
outTask
.
getSourceName
()+
"当前工单中,料仓:"
+
cid
+
"有大盘料:"
+
bigReelTask
.
getBarcode
()+
",优先出库"
);
exportMap
.
put
(
cid
,
bigReelTask
.
getExport
());
return
bigReelTask
;
}
//6.判断其他料仓有没有大料盘
else
{
boolean
hasBigReel
=
otherStorageHasBigReel
(
allTasks
,
sourceId
);
//7.如果其他仓有大盘料,则优先出B面的
DataLog
task
=
null
;
if
(
hasBigReel
)
{
log
.
info
(
outTask
.
getSourceName
()+
"当前工单中,其他料仓有大盘料,优先出B面料"
);
task
=
getOutTaskBySide
(
allTasks
,
cid
,
"B"
);
}
//8.如果其他仓没有大盘料,则优先出T面
else
{
log
.
info
(
outTask
.
getSourceName
()+
"当前工单中,其他料仓没有大盘料,优先出T面料"
);
task
=
getOutTaskBySide
(
allTasks
,
cid
,
"T"
);
if
(
task
==
null
)
{
log
.
info
(
outTask
.
getSourceName
()+
"当前工单中,其他料仓没有大盘料,T面料没有,出B面料"
);
task
=
getOutTaskBySide
(
allTasks
,
cid
,
"B"
);
}
outTask
=
task
;
}
if
(
task
!=
null
)
{
log
.
info
(
outTask
.
getSourceName
()+
"barcode为:"
+
task
.
getBarcode
()+
"面别为:"
+
task
.
getSide
());
exportMap
.
put
(
cid
,
task
.
getSide
());
return
task
;
}
}
}
}
}
//如果出料口相同,则重新赋值一遍
if
(
outTask
==
null
){
for
(
DataLog
task
:
allTasks
)
{
if
(
cid
.
equals
(
task
.
getCid
())
&&
task
.
isCheckOutTask
()
&&
task
.
isWait
())
{
String
posName
=
task
.
getPosName
();
if
(!
Strings
.
isNullOrEmpty
(
posName
))
{
if
(
outTask
==
null
||
task
.
getCreateDate
().
before
(
outTask
.
getCreateDate
()))
{
if
(
outTask
!=
null
)
{
log
.
info
(
outTask
.
getSourceName
()+
"barcode为:"
+
outTask
.
getBarcode
()+
"面别为:"
+
outTask
.
getSide
());
exportMap
.
put
(
cid
,
outTask
.
getSide
());
}
return
outTask
;
}
public
DataLog
getOutTaskBySide
(
Collection
<
DataLog
>
allTasks
,
String
cid
,
String
side
)
{
DataLog
outTask
=
null
;
for
(
DataLog
task
:
allTasks
)
{
if
(
cid
.
equals
(
task
.
getCid
())
&&
task
.
isCheckOutTask
()
&&
task
.
isWait
())
{
String
posName
=
task
.
getPosName
();
if
(!
Strings
.
isNullOrEmpty
(
posName
))
{
//有库位号
if
(
outTask
==
null
||
task
.
getCreateDate
().
before
(
outTask
.
getCreateDate
()))
{
if
(
side
.
equals
(
task
.
getSide
())){
outTask
=
task
;
}
}
}
}
}
return
outTask
;
}
//判断发送的任务与当前执行的工单是否一致
if
(
outTask
!=
null
)
{
//判断当前任务是不是大盘料
if
(
outTask
.
getW
()
>
7
)
{
return
outTask
;
public
boolean
otherStorageHasBigReel
(
Collection
<
DataLog
>
allTasks
,
String
sourceId
)
{
boolean
hasBigReel
=
false
;
for
(
DataLog
dataLog
:
allTasks
)
{
if
(
sourceId
.
equals
(
dataLog
.
getSourceId
()))
{
int
plateSize
=
dataLog
.
getPlateSize
();
if
(
plateSize
>
7
)
{
if
(
dataLog
.
isCheckOutTask
()
&&
(
dataLog
.
isWait
()
||
dataLog
.
isExecuting
()
||
dataLog
.
isOnSlide
()))
{
hasBigReel
=
true
;
break
;
}
}
}
}
return
hasBigReel
;
}
String
sourceName
=
outTask
.
getSourceName
();
//判断当前工单有没有大盘料
boolean
otherStorageBigReel
=
false
;
if
(
StringUtils
.
isNotBlank
(
sourceName
))
{
for
(
DataLog
dataLog
:
allTasks
)
{
if
(
dataLog
.
isCheckOutTask
()
&&
dataLog
.
isWait
()
&&
sourceName
.
equals
(
dataLog
.
getSourceName
())
&&
dataLog
.
getW
()
>
7
)
{
if
(
dataLog
.
getCid
().
equals
(
cid
))
{
exportMap
.
put
(
dataLog
.
getCid
(),
dataLog
.
getExport
());
return
dataLog
;
}
else
{
otherStorageBigReel
=
true
;
public
DataLog
getBigReelTask
(
Collection
<
DataLog
>
allTasks
,
String
cid
)
{
DataLog
outTask
=
null
;
for
(
DataLog
task
:
allTasks
)
{
if
(
cid
.
equals
(
task
.
getCid
())
&&
task
.
isCheckOutTask
()
&&
task
.
isWait
())
{
String
posName
=
task
.
getPosName
();
if
(!
Strings
.
isNullOrEmpty
(
posName
))
{
//有库位号
if
(
outTask
==
null
||
task
.
getCreateDate
().
before
(
outTask
.
getCreateDate
()))
{
if
(
task
.
getPlateSize
()
>
7
)
{
outTask
=
task
;
}
}
}
}
}
return
outTask
;
}
//没有大盘料,直接返回当前任务
if
(!
otherStorageBigReel
)
{
exportMap
.
put
(
outTask
.
getCid
(),
outTask
.
getExport
());
return
outTask
;
}
//如果有大盘料,取B面的料
else
{
if
(
"B"
.
equals
(
outTask
.
getSide
()))
{
exportMap
.
put
(
outTask
.
getCid
(),
outTask
.
getExport
());
return
outTask
;
}
else
{
for
(
DataLog
dataLog
:
allTasks
)
{
if
(
dataLog
.
isCheckOutTask
()
&&
dataLog
.
isWait
()
&&
sourceName
.
equals
(
dataLog
.
getSourceName
()))
{
if
(
dataLog
.
getCid
().
equals
(
cid
)
&&
"B"
.
equals
(
outTask
.
getCid
()))
{
exportMap
.
put
(
dataLog
.
getCid
(),
dataLog
.
getExport
());
return
dataLog
;
}
public
DataLog
getNeedOutTask
(
Collection
<
DataLog
>
allTasks
,
String
exportStr
,
String
cid
,
boolean
hasExport
)
{
DataLog
outTask
=
null
;
for
(
DataLog
task
:
allTasks
)
{
if
(
cid
.
equals
(
task
.
getCid
())
&&
task
.
isCheckOutTask
()
&&
task
.
isWait
())
{
String
posName
=
task
.
getPosName
();
if
(!
Strings
.
isNullOrEmpty
(
posName
))
{
//有库位号
if
(
outTask
==
null
||
task
.
getCreateDate
().
before
(
outTask
.
getCreateDate
()))
{
if
(
hasExport
)
{
if
(
StringUtils
.
isNotBlank
(
exportStr
)
&&
!
exportStr
.
equals
(
task
.
getExport
()))
{
outTask
=
task
;
}
}
else
{
outTask
=
task
;
}
}
}
...
...
@@ -575,6 +620,7 @@ public class TaskService {
}
/**
* 出库处理
*/
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论