Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 37ea7b66
由
LN
编写于
2022-05-27 14:43:31 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
1.既是首盘又是截料出库时,设置为截料出库
1 个父辈
d5ccf8cb
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
68 行增加
和
31 行删除
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
查看文件 @
37ea7b6
...
@@ -19,7 +19,6 @@ import com.neotel.smfcore.core.order.service.po.LiteOrder;
...
@@ -19,7 +19,6 @@ import com.neotel.smfcore.core.order.service.po.LiteOrder;
import
com.neotel.smfcore.core.order.service.po.LiteOrderItem
;
import
com.neotel.smfcore.core.order.service.po.LiteOrderItem
;
import
com.neotel.smfcore.core.storage.rest.mapstruct.SafetyInventoryMapper
;
import
com.neotel.smfcore.core.storage.rest.mapstruct.SafetyInventoryMapper
;
import
com.neotel.smfcore.core.storage.service.manager.IStoragePosManager
;
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.storage.service.po.StoragePos
;
import
com.neotel.smfcore.core.system.listener.ITaskListener
;
import
com.neotel.smfcore.core.system.listener.ITaskListener
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
...
@@ -344,20 +343,30 @@ public class LiteOrderCache implements ITaskListener {
...
@@ -344,20 +343,30 @@ public class LiteOrderCache implements ITaskListener {
@Autowired
@Autowired
private
SafetyInventoryMapper
safetyInventoryMapper
;
private
SafetyInventoryMapper
safetyInventoryMapper
;
public
synchronized
String
checkOutLiteOrder
(
String
userName
,
String
orderNo
)
{
return
checkOutLiteOrder
(
userName
,
orderNo
,
false
,
false
);
}
/**
/**
* 锁定物料
* 工单出库
* @param userName 操作人
* @param orderNo 工单号
* @param isShortageOut 是否缺料继续出库
* @param addOutbound 是否补料出库
* @return
*/
*/
public
synchronized
String
checkOutLiteOrder
(
String
userName
,
String
orderNo
)
{
public
synchronized
String
checkOutLiteOrder
(
String
userName
,
String
orderNo
,
boolean
isShortageOut
,
boolean
addOutbound
)
{
LiteOrder
cacheOrder
=
findOrderByNo
(
orderNo
);
LiteOrder
cacheOrder
=
findOrderByNo
(
orderNo
);
if
(
cacheOrder
==
null
)
{
if
(
cacheOrder
==
null
)
{
return
"smfcore.order.out.notFound"
;
return
"smfcore.order.out.notFound"
;
}
}
if
(!
addOutbound
)
{
if
(
cacheOrder
.
isExecuting
())
{
if
(
cacheOrder
.
isExecuting
())
{
log
.
info
(
"工单["
+
orderNo
+
"]正在执行"
);
log
.
info
(
"工单["
+
orderNo
+
"]正在执行"
);
return
"smfcore.order.out.executing"
;
return
"smfcore.order.out.executing"
;
}
}
}
if
(
cacheOrder
.
isClosed
())
{
if
(
cacheOrder
.
isClosed
())
{
log
.
info
(
"工单["
+
orderNo
+
"]已关闭,无法出库"
);
log
.
info
(
"工单["
+
orderNo
+
"]已关闭,无法出库"
);
return
"smfcore.order.hasClose"
;
return
"smfcore.order.hasClose"
;
...
@@ -410,6 +419,7 @@ public class LiteOrderCache implements ITaskListener {
...
@@ -410,6 +419,7 @@ public class LiteOrderCache implements ITaskListener {
//②③④筛选锁定料盘中的最大料盘
//②③④筛选锁定料盘中的最大料盘
log
.
info
(
"开始为工单["
+
orderNo
+
"]挑选出库物料 "
);
log
.
info
(
"开始为工单["
+
orderNo
+
"]挑选出库物料 "
);
boolean
shortage
=
false
;
List
<
String
>
availableStorageIds
=
dataCache
.
getAvailableStorageIds
();
List
<
String
>
availableStorageIds
=
dataCache
.
getAvailableStorageIds
();
...
@@ -422,16 +432,15 @@ public class LiteOrderCache implements ITaskListener {
...
@@ -422,16 +432,15 @@ public class LiteOrderCache implements ITaskListener {
String
pn
=
orderItem
.
getMaterialNo
();
String
pn
=
orderItem
.
getMaterialNo
();
//需求数量
//需求数量
int
needNum
=
orderItem
.
getQty
()
+
orderItem
.
getIncrement
();
int
needNum
=
orderItem
.
getQty
()
+
orderItem
.
getIncrement
()-
orderItem
.
getOutNum
();
if
(
needNum
<=
0
)
{
continue
;
}
////②贵重物料,不允许超发,按实际需求发料;
////②贵重物料,不允许超发,按实际需求发料;
boolean
isGuizhong
=
orderItem
.
getOverFlag
()==
1
;
boolean
isGuizhong
=
orderItem
.
getOverFlag
()==
1
;
//判断是否需要截料
//判断是否需要截料
boolean
needJieliao
=
false
;
boolean
needJieliao
=
false
;
if
(
needNum
<=
0
)
{
continue
;
}
List
<
StoragePos
>
itemPosList
=
new
ArrayList
<>();
List
<
StoragePos
>
itemPosList
=
new
ArrayList
<>();
List
<
String
>
itemPosNameList
=
new
ArrayList
<>();
List
<
String
>
itemPosNameList
=
new
ArrayList
<>();
...
@@ -447,8 +456,13 @@ public class LiteOrderCache implements ITaskListener {
...
@@ -447,8 +456,13 @@ public class LiteOrderCache implements ITaskListener {
Component
component
=
componentManager
.
findOneByPN
(
pn
);
Component
component
=
componentManager
.
findOneByPN
(
pn
);
if
(
component
==
null
){
if
(
component
==
null
){
log
.
info
(
"工单["
+
cacheOrder
.
getOrderNo
()
+
"] 物料号["
+
pn
+
"] ,需求数量["
+
orderItem
.
getWemng
()
+
"], 未找到元器件信息, 缺料 "
);
if
(
isShortageOut
)
{
return
materialShortPro
(
userName
,
cacheOrder
);
log
.
info
(
"工单["
+
cacheOrder
.
getOrderNo
()
+
"]缺料出库: 物料号["
+
pn
+
"] ,需求数量["
+
orderItem
.
getWemng
()
+
"], 未找到元器件信息 "
);
shortage
=
true
;
}
else
{
log
.
info
(
"工单["
+
cacheOrder
.
getOrderNo
()
+
"] 物料号["
+
pn
+
"] ,需求数量["
+
orderItem
.
getWemng
()
+
"], 未找到元器件信息, 缺料 "
);
return
materialShortPro
(
userName
,
cacheOrder
);
}
}
}
//判断库存 使用最小库存盘数:当前盘数<=最小库存盘数时,需要截料
//判断库存 使用最小库存盘数:当前盘数<=最小库存盘数时,需要截料
if
(
reelNum
<=
component
.
getMinStoreNum
()){
if
(
reelNum
<=
component
.
getMinStoreNum
()){
...
@@ -456,9 +470,15 @@ public class LiteOrderCache implements ITaskListener {
...
@@ -456,9 +470,15 @@ public class LiteOrderCache implements ITaskListener {
}
}
//判断库存数量是否小于需求数量,小于直接返回缺料
//判断库存数量是否小于需求数量,小于直接返回缺料
if
(
storageNum
<
orderItem
.
getQty
()){
if
(
storageNum
<
orderItem
.
getQty
()){
//不满足实际需求,不发,报缺料
if
(
isShortageOut
){
log
.
info
(
"工单["
+
cacheOrder
.
getOrderNo
()
+
"] 物料号["
+
pn
+
"] ,需求数量["
+
orderItem
.
getWemng
()
+
"], 库存总数量["
+
storageNum
+
"], 不满足实际需求,缺料 "
);
shortage
=
true
;
return
materialShortPro
(
userName
,
cacheOrder
);
log
.
info
(
"工单["
+
cacheOrder
.
getOrderNo
()
+
"]缺料出库: 物料号["
+
pn
+
"] ,需求数量["
+
orderItem
.
getWemng
()
+
"], 库存总数量["
+
storageNum
+
"] "
);
}
else
{
//不满足实际需求,不发,报缺料
log
.
info
(
"工单["
+
cacheOrder
.
getOrderNo
()
+
"] 物料号["
+
pn
+
"] ,需求数量["
+
orderItem
.
getWemng
()
+
"], 库存总数量["
+
storageNum
+
"], 不满足实际需求,缺料 "
);
return
materialShortPro
(
userName
,
cacheOrder
);
}
}
}
int
wholeReelCount
=
0
;
int
wholeReelCount
=
0
;
...
@@ -588,9 +608,15 @@ public class LiteOrderCache implements ITaskListener {
...
@@ -588,9 +608,15 @@ public class LiteOrderCache implements ITaskListener {
if
(
targetNum
>
0
)
{
if
(
targetNum
>
0
)
{
int
outNum
=
needNum
-
targetNum
;
int
outNum
=
needNum
-
targetNum
;
if
(
outNum
<
orderItem
.
getQty
())
{
if
(
outNum
<
orderItem
.
getQty
())
{
//不满足实际需求,不发,报缺料
if
(
isShortageOut
){
log
.
info
(
"工单["
+
cacheOrder
.
getOrderNo
()
+
"] 物料号["
+
pn
+
"] ,需求数量["
+
orderItem
.
getWemng
()
+
"], 库存可发数量["
+
outNum
+
"], 不满足实际需求,缺料 "
);
shortage
=
true
;
return
materialShortPro
(
userName
,
cacheOrder
);
log
.
info
(
"工单["
+
cacheOrder
.
getOrderNo
()
+
"]缺料出库: 物料号["
+
pn
+
"] ,需求数量["
+
orderItem
.
getWemng
()
+
"], 库存可发数量["
+
outNum
+
"], 不满足实际需求 "
);
}
else
{
//不满足实际需求,不发,报缺料
log
.
info
(
"工单["
+
cacheOrder
.
getOrderNo
()
+
"] 物料号["
+
pn
+
"] ,需求数量["
+
orderItem
.
getWemng
()
+
"], 库存可发数量["
+
outNum
+
"], 不满足实际需求,缺料 "
);
return
materialShortPro
(
userName
,
cacheOrder
);
}
}
}
}
}
//可以出库
//可以出库
...
@@ -598,9 +624,11 @@ public class LiteOrderCache implements ITaskListener {
...
@@ -598,9 +624,11 @@ public class LiteOrderCache implements ITaskListener {
}
}
log
.
info
(
"开始执行工单["
+
orderNo
+
"] "
);
log
.
info
(
"开始执行工单["
+
orderNo
+
"] "
);
cacheOrder
.
setTaskReelCount
(
0
);
if
(!
addOutbound
){
cacheOrder
.
setTaskFinishedTime
(-
1
);
cacheOrder
.
setTaskReelCount
(
0
);
cacheOrder
.
setFinishedReelCount
(
0
);
cacheOrder
.
setTaskFinishedTime
(-
1
);
cacheOrder
.
setFinishedReelCount
(
0
);
}
cacheOrder
.
setStatus
(
LITEORDER_STATUS
.
EXECUTING
);
cacheOrder
.
setStatus
(
LITEORDER_STATUS
.
EXECUTING
);
//设置出库操作人
//设置出库操作人
cacheOrder
.
setOperateUser
(
userName
);
cacheOrder
.
setOperateUser
(
userName
);
...
@@ -627,23 +655,26 @@ public class LiteOrderCache implements ITaskListener {
...
@@ -627,23 +655,26 @@ public class LiteOrderCache implements ITaskListener {
task
.
setOperator
(
userName
);
task
.
setOperator
(
userName
);
task
.
setOutType
(
10
);
//工单出库类型为10
task
.
setOutType
(
10
);
//工单出库类型为10
if
(
itemReelCount
==
0
){
if
(
jieliaoPosMap
.
containsKey
(
pos
.
getPosName
())){
task
.
setFirstReel
(
true
);
task
.
setLightColor
(
ORDER_COLOR
.
CYAN
.
getRgb
());
//首盘料 颜色:CYAN
}
else
if
(
jieliaoPosMap
.
containsKey
(
pos
.
getPosName
())){
//需要截料
//需要截料
int
count
=
jieliaoPosMap
.
get
(
pos
.
getPosName
());
int
count
=
jieliaoPosMap
.
get
(
pos
.
getPosName
());
task
.
setNeedSplitting
(
true
);
task
.
setNeedSplitting
(
true
);
task
.
setNeedQty
(
count
);
task
.
setNeedQty
(
count
);
task
.
setLightColor
(
ORDER_COLOR
.
PURPLE
.
getRgb
());
//截料料 颜色:PURPLE
task
.
setLightColor
(
ORDER_COLOR
.
PURPLE
.
getRgb
());
//截料料 颜色:PURPLE
}
else
{
}
else
if
(
itemReelCount
==
0
){
task
.
setFirstReel
(
true
);
task
.
setLightColor
(
ORDER_COLOR
.
CYAN
.
getRgb
());
//首盘料 颜色:CYAN
}
else
{
task
.
setLightColor
(
ORDER_COLOR
.
SKYBLUE
.
getRgb
());
//普通工单 颜色:SKYBLUE
task
.
setLightColor
(
ORDER_COLOR
.
SKYBLUE
.
getRgb
());
//普通工单 颜色:SKYBLUE
}
}
if
(
addOutbound
){
task
.
setAddOutbound
(
true
);
task
.
setLightColor
(
ORDER_COLOR
.
PINK
.
getRgb
());
//补料出库 颜色:PINK
}
taskService
.
addTaskToExecute
(
task
);
taskService
.
addTaskToExecute
(
task
);
log
.
info
(
"工单["
+
orderNo
+
"],任务数["
+
taskReelCount
+
"]仓位【"
+
pos
.
getPosName
()
+
"】RI=["
+
pos
.
getBarcode
().
getBarcode
()
+
"] PN=["
+
orderItem
.
getMaterialNo
()
+
"] Amount["
+
pos
.
getBarcode
().
getAmount
()+
log
.
info
(
"工单["
+
orderNo
+
"],任务数["
+
taskReelCount
+
"]仓位【"
+
pos
.
getPosName
()
+
"】RI=["
+
pos
.
getBarcode
().
getBarcode
()
+
"] PN=["
+
orderItem
.
getMaterialNo
()
+
"] Amount["
+
pos
.
getBarcode
().
getAmount
()+
"] 首盘["
+
task
.
isFirstReel
()+
"] 截料["
+
task
.
isNeedSplitting
()+
"]["
+
task
.
getNeedQty
()+
"]"
);
"] 首盘["
+
task
.
isFirstReel
()+
"] 截料["
+
task
.
isNeedSplitting
()+
"]["
+
task
.
getNeedQty
()+
"]
补料出库["
+
task
.
isAddOutbound
()+
"]
"
);
taskReelCount
++;
taskReelCount
++;
itemReelCount
++;
itemReelCount
++;
...
@@ -661,6 +692,12 @@ public class LiteOrderCache implements ITaskListener {
...
@@ -661,6 +692,12 @@ public class LiteOrderCache implements ITaskListener {
cacheOrder
.
setTaskReelCount
(
taskReelCount
);
cacheOrder
.
setTaskReelCount
(
taskReelCount
);
cacheOrder
.
setTotalFinishedReelCount
(
0
);
cacheOrder
.
setTotalFinishedReelCount
(
0
);
cacheOrder
.
setTotalTaskReelCount
(
cacheOrder
.
getTotalTaskReelCount
()+
taskReelCount
);
cacheOrder
.
setTotalTaskReelCount
(
cacheOrder
.
getTotalTaskReelCount
()+
taskReelCount
);
if
(
addOutbound
){
}
else
if
(
shortage
)
{
cacheOrder
.
setShortageOut
(
true
);
}
log
.
info
(
"工单["
+
orderNo
+
"]任务分配结束,任务数["
+
taskReelCount
+
"]"
);
log
.
info
(
"工单["
+
orderNo
+
"]任务分配结束,任务数["
+
taskReelCount
+
"]"
);
//有需要出库的
//有需要出库的
if
(
taskReelCount
<=
0
)
{
if
(
taskReelCount
<=
0
)
{
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论