Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 38026629
由
zshaohui
编写于
2024-08-02 19:20:32 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
odn出库 挑料逻辑提交
1 个父辈
0b074730
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
120 行增加
和
122 行删除
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
src/main/java/com/neotel/smfcore/core/order/util/CombinationUtil.java
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
查看文件 @
3802662
...
...
@@ -23,7 +23,6 @@ import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
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.order.util.CombinationUtil
;
import
com.neotel.smfcore.core.storage.bean.InventoryItem
;
import
com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE
;
import
com.neotel.smfcore.core.storage.service.manager.IStoragePosManager
;
...
...
@@ -38,15 +37,12 @@ import com.neotel.smfcore.custom.lizhen.innerBox.util.StorageExportUtil;
import
com.neotel.smfcore.custom.lizhen.third.maicheng.api.MaiZhengApi
;
import
com.neotel.smfcore.custom.luxsan.api.LuxsanApi
;
import
com.neotel.smfcore.custom.luxsan.api.bean.request.FetchHoldInfoRequest
;
import
com.neotel.smfcore.custom.luxsan.api.bean.request.TicketPickLabelList
;
import
com.neotel.smfcore.custom.luxsan.api.bean.request.TicketPickRequest
;
import
com.neotel.smfcore.custom.luxsan.api.bean.result.FetchHoldInfoResult
;
import
com.neotel.smfcore.custom.luxsan.factory_c.common.util.CommonUtil
;
import
com.neotel.smfcore.custom.luxsan.factory_c.common.util.DisableBarcodeUtil
;
import
com.neotel.smfcore.custom.luxsan.factory_c.rawstor.enums.LiteorderCheckType
;
import
com.neotel.smfcore.custom.luxsan.factory_c.rawstor.enums.TaskCurrentLoc
;
import
com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util.BinCacheUtil
;
import
com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util.BoxHandleUtil
;
import
com.neotel.smfcore.custom.luxsan.factory_c.wipstor.util.TaskLocUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -1430,7 +1426,6 @@ public class LiteOrderCache {
log
.
info
(
"开始执行工单:"
+
orderNo
);
cacheOrder
.
setTaskReelCount
(
0
);
cacheOrder
.
setFinishedReelCount
(
0
);
cacheOrder
.
setStatus
(
LITEORDER_STATUS
.
TAILS
);
CHECKOUT_TYPE
checkoutType
=
dataCache
.
getCheckOutType
();
List
<
String
>
storageIdList
=
new
ArrayList
<>();
...
...
@@ -1438,94 +1433,118 @@ public class LiteOrderCache {
storageIdList
.
add
(
storage
.
getId
());
}
int
taskReelCount
=
0
;
List
<
String
>
holdPosIdList
=
getHoldPosIdList
(
cacheOrder
);
//查找所有的任务
List
<
DataLog
>
dataLogList
=
new
ArrayList
<>();
for
(
LiteOrderItem
orderItem
:
cacheOrder
.
getOrderItems
())
{
String
partNumber
=
orderItem
.
getPn
();
int
taskNum
=
0
;
int
remainNum
=
orderItem
.
getNeedNum
()
-
orderItem
.
getTotalOutNum
();
if
(
remainNum
<=
0
)
{
continue
;
}
String
pn
=
orderItem
.
getPn
();
String
warehouseCode
=
orderItem
.
getWarehouseCode
();
List
<
StoragePos
>
needOutPosList
=
new
ArrayList
<>();
if
(
storagePosList
!=
null
&&
!
storagePosList
.
isEmpty
())
{
for
(
StoragePos
storagePos
:
storagePosList
)
{
Barcode
barcode
=
storagePos
.
getBarcode
();
if
(
barcode
.
getPartNumber
().
equals
(
pn
)
&&
barcode
.
getWarehouseCode
().
equals
(
warehouseCode
))
{
if
(
holdPosIdList
!=
null
&&
!
holdPosIdList
.
isEmpty
())
{
if
(
holdPosIdList
.
contains
(
storagePos
.
getId
()))
{
throw
new
ValidateException
(
""
,
barcode
.
getPalletId
()
+
"被hold,不允许出库"
);
}
}
if
(
dataLogList
!=
null
&&
!
dataLogList
.
isEmpty
())
{
for
(
DataLog
dataLog
:
dataLogList
)
{
if
(
storagePos
.
getId
().
equals
(
dataLog
.
getPosId
()))
{
log
.
info
(
storagePos
.
getPosName
()
+
"已经在任务列表中,跳过"
);
continue
;
//throw new ValidateException("", barcode.getPalletId()+"已在任务列表中,不允许出库");;
}
}
}
needOutPosList
.
add
(
storagePos
);
}
}
}
while
(
taskNum
<
remainNum
)
{
if
(
needOutPosList
!=
null
&&
!
needOutPosList
.
isEmpty
())
{
List
<
Barcode
>
barcodeList
=
needOutPosList
.
stream
().
map
(
StoragePos:
:
getBarcode
).
collect
(
Collectors
.
toList
());
int
count
=
barcodeList
.
stream
().
collect
(
Collectors
.
summingInt
(
Barcode:
:
getQty
));
if
(
count
>
remainNum
)
{
throw
new
ValidateException
(
""
,
"手动输入的料箱号数量为:"
+
count
+
"大于实际需要的数量:"
+
remainNum
+
"料号为:"
+
pn
+
"库别为:"
+
warehouseCode
);
}
remainNum
=
(
remainNum
-
count
);
}
log
.
info
(
orderNo
+
"已分配数量为:"
+
taskNum
+
",剩余数量为:"
+
remainNum
);
if
(
remainNum
>
0
)
{
Collection
<
String
>
excludePosIds
=
excludeOutPosIds
();
if
(
dataLogList
!=
null
&&
!
dataLogList
.
isEmpty
()){
if
(
dataLogList
!=
null
&&
!
dataLogList
.
isEmpty
())
{
for
(
DataLog
dataLog
:
dataLogList
)
{
excludePosIds
.
add
(
dataLog
.
get
Pos
Id
());
excludePosIds
.
add
(
dataLog
.
getId
());
}
}
//1.先从执行的料箱中出库
StoragePos
pos
=
null
;
if
(
storagePosList
!=
null
&&
!
storagePosList
.
isEmpty
())
{
for
(
StoragePos
storagePos
:
storagePosList
)
{
if
(
excludePosIds
.
contains
(
storagePos
.
getId
()))
{
continue
;
}
if
(
partNumber
.
equals
(
storagePos
.
getBarcode
().
getPartNumber
()))
{
pos
=
storagePos
;
break
;
}
}
}
//查找符合条件的库位
Criteria
c
=
Criteria
.
where
(
"barcode.partNumber"
).
is
(
pn
)
.
and
(
"id"
).
nin
(
excludePosIds
)
.
and
(
"enabled"
).
is
(
true
)
.
and
(
"storageId"
).
in
(
storageIdList
)
.
and
(
"barcode.warehouseCode"
).
is
(
warehouseCode
);
if
(
pos
==
null
)
{
pos
=
storagePosManager
.
findPartNumberInStorages
(
storageIdList
,
partNumber
,
excludePosIds
,
checkoutType
,
orderItem
.
getBrand
(),
orderItem
.
getWarehouseCode
());
List
<
StoragePos
>
posList
=
storagePosManager
.
findByQuery
(
new
Query
(
c
));
if
(
posList
==
null
||
posList
.
isEmpty
())
{
throw
new
ValidateException
(
""
,
"料号:"
+
pn
+
",库别:"
+
warehouseCode
+
"未找到可用出库的物料"
);
}
if
(
pos
==
null
)
{
break
;
}
else
{
Barcode
barcode
=
pos
.
getBarcode
();
log
.
info
(
barcode
.
getBarcode
()
+
"需要生成出库任务,工单号为:"
+
orderNo
+
",数量为:"
+
barcode
.
getQty
());
taskNum
=
taskNum
+
barcode
.
getQty
();
taskReelCount
=
taskReelCount
+
1
;
DataLog
task
=
newTask
(
pos
);
task
.
setSourceId
(
cacheOrder
.
getId
());
task
.
setSourceName
(
cacheOrder
.
getOrderNo
());
task
.
setSubSourceId
(
orderItem
.
getId
());
task
.
setSubSourceInfo
(
orderItem
.
getFeederInfo
());
task
.
setType
(
OP
.
CHECKOUT
);
task
.
setStatus
(
OP_STATUS
.
WAIT
.
name
());
task
.
setLoc
(
TaskLocUtil
.
OUT
);
if
(
StringUtils
.
isNotEmpty
(
barcode
.
getCartonId
())){
task
.
setCartonId
(
barcode
.
getCartonId
());
}
task
.
setOdn
(
true
);
dataLogList
.
add
(
task
);
List
<
StoragePos
>
targetPos
=
findTargetPos
(
posList
,
remainNum
);
if
(
targetPos
==
null
||
targetPos
.
isEmpty
())
{
throw
new
ValidateException
(
""
,
"料号:"
+
pn
+
",库别:"
+
warehouseCode
+
"未找到符合出库的组合"
);
}
needOutPosList
.
addAll
(
targetPos
);
}
//如果数量不满足,则提示出来
if
(
taskNum
<
remainNum
){
finishedOrderTasks
(
cacheOrder
);
throw
new
ValidateException
(
""
,
orderItem
.
getPn
()+
"库存不足,odn:"
+
cacheOrder
.
getOrderNo
()+
"无法进行出库"
);
for
(
StoragePos
pos
:
needOutPosList
)
{
Storage
storage
=
dataCache
.
getStorageById
(
pos
.
getStorageId
());
Barcode
barcode
=
pos
.
getBarcode
();
DataLog
dataLog
=
new
DataLog
(
storage
,
barcode
,
pos
);
dataLog
.
setSubSourceId
(
orderItem
.
getId
());
dataLog
.
setSourceName
(
cacheOrder
.
getOrderNo
());
dataLog
.
setSourceId
(
cacheOrder
.
getId
());
dataLog
.
setStatus
(
OP_STATUS
.
WAIT
.
name
());
dataLog
.
setType
(
OP
.
CHECKOUT
);
dataLog
.
setLoc
(
TaskLocUtil
.
OUT
);
if
(
StringUtils
.
isNotEmpty
(
barcode
.
getCartonId
()))
{
dataLog
.
setCartonId
(
barcode
.
getCartonId
());
}
dataLog
.
setOdn
(
true
);
dataLogList
.
add
(
dataLog
);
}
}
for
(
DataLog
dataLog
:
dataLogList
)
{
taskService
.
addTaskToExecute
(
dataLog
);
}
if
(
taskReelCount
<=
0
)
{
log
.
info
(
"工单:"
+
orderNo
+
"没有找到对应的任务"
);
finishedOrderTasks
(
cacheOrder
);
throw
new
ValidateException
(
"smfcore.order.out.noTask"
,
"工单无可执行的任务"
);
}
if
(
dataLogList
==
null
||
dataLogList
.
isEmpty
()){
log
.
info
(
"工单:"
+
orderNo
+
"没有找到对应的任务"
);
//finishedOrderTasks(cacheOrder);
throw
new
ValidateException
(
"smfcore.order.out.noTask"
,
"工单无可执行的任务"
);
}
Collection
newDataLogList
=
taskService
.
batchSave
(
dataLogList
);
cacheOrder
.
setTaskReelCount
(
taskReelCount
);
cacheOrder
.
setStatus
(
LITEORDER_STATUS
.
TAILS
);
cacheOrder
.
setTaskReelCount
(
dataLogList
.
size
());
liteOrderManager
.
save
(
cacheOrder
);
liteOrderMap
.
put
(
cacheOrder
.
getOrderNo
(),
cacheOrder
);
log
.
info
(
"生成工单"
+
orderNo
+
"任务结束,数量为:"
+
taskReelCount
);
log
.
info
(
"生成工单"
+
orderNo
+
"任务结束,数量为:"
+
dataLogList
.
size
());
}
...
...
@@ -2106,7 +2125,7 @@ public class LiteOrderCache {
private
List
<
String
>
getHoldPosIdList
(
LiteOrder
cacheOrder
)
{
//如果是hold的,判断有没有符合的条件
List
<
String
>
holdPosIdList
=
new
ArrayList
<>();
for
(
LiteOrderItem
orderItem
:
cacheOrder
.
getOrderItems
())
{
/*
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
String warehouseCode = StringUtils.isNotEmpty(orderItem.getSrcWarehouse()) ? orderItem.getSrcWarehouse() : orderItem.getWarehouseCode();
...
...
@@ -2124,7 +2143,35 @@ public class LiteOrderCache {
}
}
}
}
}
*/
return
holdPosIdList
;
}
private
List
<
StoragePos
>
findTargetPos
(
List
<
StoragePos
>
numbers
,
int
targetNum
)
{
numbers
.
sort
((
a
,
b
)
->
Integer
.
valueOf
(
b
.
getBarcode
().
getQty
()).
compareTo
(
Integer
.
valueOf
(
a
.
getBarcode
().
getQty
())));
//System.out.println(numbers);
int
target
=
targetNum
;
List
<
StoragePos
>
result
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
3000
;
i
++)
{
boolean
notFound
=
true
;
Iterator
<
StoragePos
>
iterator
=
numbers
.
iterator
();
while
(
iterator
.
hasNext
())
{
StoragePos
pos
=
iterator
.
next
();
if
(
pos
.
getBarcode
().
getQty
()
<=
target
)
{
// 假设我们要删除值为3的元素
result
.
add
(
pos
);
notFound
=
false
;
iterator
.
remove
();
target
=
target
-
pos
.
getBarcode
().
getQty
();
break
;
}
}
if
(
notFound
)
{
break
;
}
}
if
(
target
==
0
)
{
return
result
;
}
return
new
ArrayList
<>();
}
}
src/main/java/com/neotel/smfcore/core/order/util/CombinationUtil.java
deleted
100644 → 0
查看文件 @
0b07473
package
com
.
neotel
.
smfcore
.
core
.
order
.
util
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
CombinationUtil
{
private
static
void
backtrack
(
List
<
Integer
>
numbers
,
int
targetSum
,
int
start
,
List
<
Integer
>
current
,
List
<
List
<
Integer
>>
combinations
,
boolean
used
[])
{
if
(
targetSum
==
0
)
{
combinations
.
add
(
new
ArrayList
<>(
current
));
return
;
}
if
(
targetSum
<
0
||
start
>=
numbers
.
size
())
{
return
;
}
for
(
int
i
=
start
;
i
<
numbers
.
size
();
i
++)
{
// 如果不允许重复使用数字,并且当前数字已经被使用过,则跳过
if
(
used
!=
null
&&
used
[
i
])
{
continue
;
}
// 选择当前数字
current
.
add
(
numbers
.
get
(
i
));
// 如果不允许重复使用数字,则标记当前数字为已使用
if
(
used
!=
null
)
{
used
[
i
]
=
true
;
}
// 递归调用,继续查找剩余的数字
backtrack
(
numbers
,
targetSum
-
numbers
.
get
(
i
),
i
+
1
,
current
,
combinations
,
used
);
// 回溯,移除当前选择的数字
current
.
remove
(
current
.
size
()
-
1
);
// 如果不允许重复使用数字,则取消标记
if
(
used
!=
null
)
{
used
[
i
]
=
false
;
}
}
}
// 如果不允许重复使用数字,可以使用以下版本的findCombinations方法
public
static
List
<
List
<
Integer
>>
findCombinationsWithoutDuplicates
(
List
<
Integer
>
numbers
,
int
targetSum
)
{
boolean
[]
used
=
new
boolean
[
numbers
.
size
()];
return
findCombinations
(
numbers
,
targetSum
,
used
);
}
// 带有used数组的findCombinations方法
private
static
List
<
List
<
Integer
>>
findCombinations
(
List
<
Integer
>
numbers
,
int
targetSum
,
boolean
[]
used
)
{
List
<
List
<
Integer
>>
combinations
=
new
ArrayList
<>();
backtrack
(
numbers
,
targetSum
,
0
,
new
ArrayList
<>(),
combinations
,
used
);
return
combinations
;
}
}
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
查看文件 @
3802662
...
...
@@ -1338,4 +1338,12 @@ public class TaskService {
public
void
outTaskStatusChange
(
List
<
DataLog
>
dataLogList
)
{
smfApi
.
outTaskStatusChange
(
dataLogList
);
}
public
Collection
<
DataLog
>
batchSave
(
List
<
DataLog
>
dataLogList
)
{
Collection
<
DataLog
>
dataLogs
=
dataLogDao
.
insertAll
(
dataLogList
);
for
(
DataLog
task
:
dataLogs
)
{
taskMap
.
put
(
task
.
getId
(),
task
);
}
return
dataLogs
;
}
}
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论