Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit dae3e29e
由
hc
编写于
2024-07-30 08:57:10 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
fix:代码优化
1 个父辈
a86ccf55
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
162 行增加
和
169 行删除
src/main/java/com/neotel/smfcore/custom/luxsan_sp/service/manager/impl/SpBoxPutInManagerImpl.java
src/main/java/com/neotel/smfcore/custom/luxsan_sp/service/manager/impl/SpBoxPutInManagerImpl.java
查看文件 @
dae3e29
...
...
@@ -62,213 +62,203 @@ public class SpBoxPutInManagerImpl implements SpBoxPutInManager {
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
synchronized
Map
<
String
,
String
>
reelToBox
(
Map
<
String
,
String
>
paramMap
)
throws
Exception
{
try
{
String
boxStr
=
paramMap
.
get
(
"boxStr"
).
trim
();
String
rellCodeStr
=
paramMap
.
get
(
"codeStr"
).
trim
();
String
gekouCodeStr
=
paramMap
.
get
(
"binCodeStr"
).
trim
();
log
.
info
(
"reelToBox : boxStr="
+
boxStr
+
",codeStr="
+
rellCodeStr
+
",binCodeStr="
+
gekouCodeStr
);
String
boxStr
=
paramMap
.
get
(
"boxStr"
).
trim
();
String
rellCodeStr
=
paramMap
.
get
(
"codeStr"
).
trim
();
String
gekouCodeStr
=
paramMap
.
get
(
"binCodeStr"
).
trim
();
log
.
info
(
"reelToBox : boxStr="
+
boxStr
+
",codeStr="
+
rellCodeStr
+
",binCodeStr="
+
gekouCodeStr
);
// boxStr = "C0700377A";
// codeStr = "1950090020044V&&2";
// binCodeStr = "C0700377-01";
//解析料箱信息
Barcode
boxBarcode
=
codeResolve
.
resolveOneValideBarcode
(
"=2x2="
+
boxStr
);
if
(
boxBarcode
==
null
)
{
throw
new
Exception
(
"不是有效的料箱条码"
);
}
addBackupObj
(
boxBarcode
);
//解析料箱信息
Barcode
boxBarcode
=
codeResolve
.
resolveOneValideBarcode
(
"=2x2="
+
boxStr
);
if
(
boxBarcode
==
null
)
{
throw
new
Exception
(
"不是有效的料箱条码"
);
}
//解析料格信息
Barcode
gekouBarcode
=
codeResolve
.
resolveOneValideBarcode
(
"=2x2="
+
gekouCodeStr
);
if
(
gekouBarcode
==
null
)
{
throw
new
Exception
(
"不是有效的料格条码"
);
}
addBackupObj
(
gekouBarcode
);
//解析料格信息
Barcode
gekouBarcode
=
codeResolve
.
resolveOneValideBarcode
(
"=2x2="
+
gekouCodeStr
);
if
(
gekouBarcode
==
null
)
{
throw
new
Exception
(
"不是有效的料格条码"
);
}
//2.解析条码信息
CodeBarcode
codeBarcode
=
CodeUtil
.
getCodeBarcode
(
rellCodeStr
);
if
(
codeBarcode
==
null
)
{
throw
new
Exception
(
"不是有效的物料条码"
);
}
//1.判断料格信息与料箱信息是否匹配
if
(!
gekouBarcode
.
getBarcode
().
startsWith
(
boxBarcode
.
getBarcode
()))
{
throw
new
Exception
(
gekouCodeStr
+
"不是当前料箱:"
+
boxStr
+
"的格口"
);
}
//2.解析条码信息
CodeBarcode
codeBarcode
=
CodeUtil
.
getCodeBarcode
(
rellCodeStr
);
if
(
codeBarcode
==
null
)
{
throw
new
Exception
(
"不是有效的物料条码"
);
}
//1.判断料格信息与料箱信息是否匹配
if
(!
gekouBarcode
.
getBarcode
().
startsWith
(
boxBarcode
.
getBarcode
()))
{
throw
new
Exception
(
gekouCodeStr
+
"不是当前料箱:"
+
boxStr
+
"的格口"
);
}
int
binCodeNum
=
Integer
.
parseInt
(
gekouCodeStr
.
split
(
"-"
)[
1
]);
//判断格口数量是否超出
int
count
=
SpBoxUtil
.
GetBoxSubCount
(
boxBarcode
.
getBarcode
());
if
(
binCodeNum
>
count
)
{
int
binCodeNum
=
Integer
.
parseInt
(
gekouCodeStr
.
split
(
"-"
)[
1
]);
//判断格口数量是否超出
int
count
=
SpBoxUtil
.
GetBoxSubCount
(
boxBarcode
.
getBarcode
());
if
(
binCodeNum
>
count
)
{
// throw new Exception(boxBarcode.getBarcode() + "最多格口数" + count + ",请扫描正确的格口码");
}
//此格口为空
if
(
ObjectUtil
.
isEmpty
(
gekouBarcode
.
getPartNumber
())
||
gekouBarcode
.
getPartNumber
().
equals
(
boxBarcode
.
getPartNumber
()))
{
// 判断物料是否在其他格口
String
currP
=
barcodeManager
.
getPNCurrGeKou
(
codeBarcode
.
getPartNumber
());
if
(
ObjectUtil
.
isNotEmpty
(
currP
)&&(!
currP
.
equals
(
gekouCodeStr
)))
{
throw
new
Exception
(
codeBarcode
.
getPartNumber
()
+
"已在"
+
currP
+
"中"
);
}
//是新格口物料
gekouBarcode
.
setPartNumber
(
codeBarcode
.
getPartNumber
());
gekouBarcode
.
setAmount
(
0
);
gekouBarcode
.
setOut
(
false
);
}
else
if
(
gekouBarcode
.
getPartNumber
().
equals
(
codeBarcode
.
getPartNumber
()))
{
}
//此格口为空
if
(
ObjectUtil
.
isEmpty
(
gekouBarcode
.
getPartNumber
())
||
gekouBarcode
.
getPartNumber
().
equals
(
boxBarcode
.
getPartNumber
()))
{
//pn已在此
格口
}
else
{
//不匹配,直接返回
throw
new
Exception
(
rellCodeStr
+
"的料号与隔口:"
+
gekouCodeStr
+
"的料号["
+
gekouBarcode
.
getPartNumber
()
+
"]不匹配
"
);
// 判断物料是否在其他
格口
String
currP
=
barcodeManager
.
getPNCurrGeKou
(
codeBarcode
.
getPartNumber
());
if
(
ObjectUtil
.
isNotEmpty
(
currP
)&&(!
currP
.
equals
(
gekouCodeStr
)))
{
throw
new
Exception
(
codeBarcode
.
getPartNumber
()
+
"已在"
+
currP
+
"中
"
);
}
//判断有没有正在执行入库单
SpareNo
spareNo
=
spareNoCache
.
getExecutIngSpareNo
();
ReturnInventoryNo
returnInventoryNo
=
returnNoCache
.
getExecutingOrderNo
();
BaseNo
baseNo
=
null
;
boolean
isOrderPutIn
=
false
;
if
(
ObjectUtil
.
isAllEmpty
(
spareNo
,
returnInventoryNo
))
{
//是新格口物料
gekouBarcode
.
setPartNumber
(
codeBarcode
.
getPartNumber
());
gekouBarcode
.
setAmount
(
0
);
gekouBarcode
.
setOut
(
false
);
}
else
if
(
gekouBarcode
.
getPartNumber
().
equals
(
codeBarcode
.
getPartNumber
()))
{
//pn已在此格口
}
else
{
//不匹配,直接返回
throw
new
Exception
(
rellCodeStr
+
"的料号与隔口:"
+
gekouCodeStr
+
"的料号["
+
gekouBarcode
.
getPartNumber
()
+
"]不匹配"
);
}
//判断有没有正在执行入库单
SpareNo
spareNo
=
spareNoCache
.
getExecutIngSpareNo
();
ReturnInventoryNo
returnInventoryNo
=
returnNoCache
.
getExecutingOrderNo
();
BaseNo
baseNo
=
null
;
boolean
isOrderPutIn
=
false
;
if
(
ObjectUtil
.
isAllEmpty
(
spareNo
,
returnInventoryNo
))
{
// return ResultBean.newErrorResult(-1,"","没有找到正在执行的入库单或者退库单");
}
else
{
baseNo
=
ObjectUtil
.
isEmpty
(
spareNo
)
?
returnInventoryNo
:
spareNo
;
addBackupObj
(
baseNo
);
//判断此料箱有没有待执行的出入库任务
List
<
String
>
needInPn
=
new
ArrayList
<>();
for
(
Barcode
barcode
:
boxBarcode
.
getSubCodeList
())
{
String
inNum
=
barcode
.
getExtraData
(
"needInNum"
);
if
(
ObjectUtil
.
isEmpty
(
inNum
)
||
inNum
.
equals
(
"0"
))
{
continue
;
}
else
{
needInPn
.
add
(
barcode
.
getPartNumber
());
isOrderPutIn
=
true
;
}
}
if
(
needInPn
.
size
()
>
0
&&
(!
needInPn
.
contains
(
codeBarcode
.
getPartNumber
())))
{
throw
new
Exception
(
"有未完成的入库单任务,请先入入库单物料"
);
}
else
{
baseNo
=
ObjectUtil
.
isEmpty
(
spareNo
)
?
returnInventoryNo
:
spareNo
;
//判断此料箱有没有待执行的出入库任务
List
<
String
>
needInPn
=
new
ArrayList
<>();
for
(
Barcode
barcode
:
boxBarcode
.
getSubCodeList
())
{
String
inNum
=
barcode
.
getExtraData
(
"needInNum"
);
if
(
ObjectUtil
.
isEmpty
(
inNum
)
||
inNum
.
equals
(
"0"
))
{
continue
;
}
else
{
needInPn
.
add
(
barcode
.
getPartNumber
());
isOrderPutIn
=
true
;
}
}
if
(
needInPn
.
size
()
>
0
&&
(!
needInPn
.
contains
(
codeBarcode
.
getPartNumber
())))
{
throw
new
Exception
(
"有未完成的入库单任务,请先入入库单物料"
);
}
}
boolean
finish
=
true
;
//判断当前入库的是否和入库单一样
if
(
isOrderPutIn
)
{
List
<
SpareNoDetail
>
detailList
=
baseNo
.
getDetailList
();
boolean
finish
=
true
;
//判断当前入库的是否和入库单一样
if
(
isOrderPutIn
)
{
List
<
SpareNoDetail
>
detailList
=
baseNo
.
getDetailList
();
SpareNoDetail
spareNoDetail
=
null
;
SpareNoDetail
spareNoDetail
=
null
;
for
(
SpareNoDetail
detail
:
detailList
)
{
//如果相同的话,判断数量是否大于需求数量
if
(
detail
.
getPartno
().
equals
(
codeBarcode
.
getPartNumber
()))
{
if
(
detail
.
getAlrInQty
()
+
codeBarcode
.
getQty
()
<=
detail
.
getInQty
())
{
spareNoDetail
=
detail
;
break
;
}
for
(
SpareNoDetail
detail
:
detailList
)
{
//如果相同的话,判断数量是否大于需求数量
if
(
detail
.
getPartno
().
equals
(
codeBarcode
.
getPartNumber
()))
{
if
(
detail
.
getAlrInQty
()
+
codeBarcode
.
getQty
()
<=
detail
.
getInQty
())
{
spareNoDetail
=
detail
;
break
;
}
}
}
if
(
spareNoDetail
==
null
)
{
throw
new
Exception
(
codeBarcode
.
getPartNumber
()
+
"没有入退库需求,请检查是否存在或者不符合入退库数量"
);
}
if
(
spareNoDetail
==
null
)
{
throw
new
Exception
(
codeBarcode
.
getPartNumber
()
+
"没有入退库需求,请检查是否存在或者不符合入退库数量"
);
}
//数量加
spareNoDetail
.
setAlrInQty
(
spareNoDetail
.
getAlrInQty
()
+
codeBarcode
.
getQty
());
baseNo
.
updateDetailList
(
spareNoDetail
);
//数量加
spareNoDetail
.
setAlrInQty
(
spareNoDetail
.
getAlrInQty
()
+
codeBarcode
.
getQty
());
baseNo
.
updateDetailList
(
spareNoDetail
);
log
.
info
(
"开始判断是否完成入库单"
);
for
(
SpareNoDetail
noDetail
:
baseNo
.
getDetailList
())
{
if
(
noDetail
.
getInQty
()
>
noDetail
.
getAlrInQty
())
{
log
.
info
(
"入库未完成"
);
finish
=
false
;
break
;
}
log
.
info
(
"入料noDetail.getInQty()"
+
noDetail
.
getInQty
()
+
"noDetail.getAlrInQty()"
+
noDetail
.
getAlrInQty
());
log
.
info
(
"开始判断是否完成入库单"
);
for
(
SpareNoDetail
noDetail
:
baseNo
.
getDetailList
())
{
if
(
noDetail
.
getInQty
()
>
noDetail
.
getAlrInQty
())
{
log
.
info
(
"入库未完成"
);
finish
=
false
;
break
;
}
log
.
info
(
"入料noDetail.getInQty()"
+
noDetail
.
getInQty
()
+
"noDetail.getAlrInQty()"
+
noDetail
.
getAlrInQty
());
}
}
}
// 寻找空库位
StoragePos
pos
=
SpBoxUtil
.
locOnePos
(
boxBarcode
);
addBackupObj
(
pos
);
// 寻找空库位
StoragePos
pos
=
SpBoxUtil
.
locOnePos
(
boxBarcode
);
// 将给pos赋值延迟到深拷贝库位对象之后
// 开始放入料箱
gekouBarcode
.
setPartNumber
(
codeBarcode
.
getPartNumber
());
gekouBarcode
.
setAmount
(
gekouBarcode
.
getAmount
()
+
codeBarcode
.
getQty
());
boxBarcode
.
updateSubCodes
(
gekouBarcode
);
boxBarcode
.
setStatus
(
BARCODE_STATUS
.
OUT_NORMAL
);
// 将给pos赋值延迟到深拷贝库位对象之后
// 开始放入料箱
gekouBarcode
.
setPartNumber
(
codeBarcode
.
getPartNumber
());
gekouBarcode
.
setAmount
(
gekouBarcode
.
getAmount
()
+
codeBarcode
.
getQty
());
boxBarcode
.
updateSubCodes
(
gekouBarcode
);
boxBarcode
.
setStatus
(
BARCODE_STATUS
.
OUT_NORMAL
);
if
(
pos
==
null
){
throw
new
Exception
(
boxStr
+
"未找到可用的库位"
);
}
if
(
pos
==
null
){
throw
new
Exception
(
boxStr
+
"未找到可用的库位"
);
}
log
.
info
(
"reelToBox 入库成功 : boxStr="
+
boxStr
+
",codeStr="
+
rellCodeStr
+
",binCodeStr="
+
gekouCodeStr
+
",数量:"
+
codeBarcode
.
getQty
()+
",当前数量:"
+
gekouBarcode
.
getAmount
());
//6.生成入库任务
DataLog
dataLog
=
new
DataLog
();
dataLog
.
setBarcode
(
rellCodeStr
);
dataLog
.
setPartNumber
(
codeBarcode
.
getPartNumber
());
dataLog
.
setOperator
(
SecurityUtils
.
getLoginUsername
());
dataLog
.
setStatus
(
OP_STATUS
.
FINISHED
.
name
());
dataLog
.
setPosName
(
gekouBarcode
.
getBarcode
());
dataLog
.
setNum
(
codeBarcode
.
getQty
());
dataLog
.
setType
(
OP
.
PUT_IN
);
pos
.
setBarcode
(
boxBarcode
);
pos
.
setUsed
(
true
);
storagePosManager
.
save
(
pos
);
barcodeManager
.
save
(
gekouBarcode
);
barcodeManager
.
save
(
boxBarcode
);
Map
<
String
,
String
>
res
=
new
HashMap
<>();
res
.
put
(
"PN"
,
codeBarcode
.
getPartNumber
());
res
.
put
(
"InPutNum"
,
codeBarcode
.
getQty
()+
""
);
res
.
put
(
"CurrNum"
,
gekouBarcode
.
getAmount
()+
""
);
res
.
put
(
"Code"
,
gekouBarcode
.
getBarcode
());
taskService
.
updateFinishedTask
(
dataLog
);
if
(
isOrderPutIn
)
{
if
(
baseNo
.
getClass
().
equals
(
SpareNo
.
class
))
{
spareNoCache
.
addToMap
(
spareNo
);
spareNoManager
.
save
(
spareNo
);
}
else
{
returnNoCache
.
addToMap
(
returnInventoryNo
);
returnNoManager
.
save
(
returnInventoryNo
);
}
log
.
info
(
"reelToBox 入库成功 : boxStr="
+
boxStr
+
",codeStr="
+
rellCodeStr
+
",binCodeStr="
+
gekouCodeStr
+
",数量:"
+
codeBarcode
.
getQty
()+
",当前数量:"
+
gekouBarcode
.
getAmount
());
//6.生成入库任务
DataLog
dataLog
=
new
DataLog
();
dataLog
.
setBarcode
(
rellCodeStr
);
dataLog
.
setPartNumber
(
codeBarcode
.
getPartNumber
());
dataLog
.
setOperator
(
SecurityUtils
.
getLoginUsername
());
dataLog
.
setStatus
(
OP_STATUS
.
FINISHED
.
name
());
dataLog
.
setPosName
(
gekouBarcode
.
getBarcode
());
dataLog
.
setNum
(
codeBarcode
.
getQty
());
dataLog
.
setType
(
OP
.
PUT_IN
);
pos
.
setBarcode
(
boxBarcode
);
pos
.
setUsed
(
true
);
storagePosManager
.
save
(
pos
);
barcodeManager
.
save
(
gekouBarcode
);
barcodeManager
.
save
(
boxBarcode
);
Map
<
String
,
String
>
res
=
new
HashMap
<>();
res
.
put
(
"PN"
,
codeBarcode
.
getPartNumber
());
res
.
put
(
"InPutNum"
,
codeBarcode
.
getQty
()+
""
);
res
.
put
(
"CurrNum"
,
gekouBarcode
.
getAmount
()+
""
);
res
.
put
(
"Code"
,
gekouBarcode
.
getBarcode
());
taskService
.
updateFinishedTask
(
dataLog
);
if
(
isOrderPutIn
)
{
if
(
baseNo
.
getClass
().
equals
(
SpareNo
.
class
))
{
spareNoCache
.
addToMap
(
spareNo
);
spareNoManager
.
save
(
spareNo
);
}
else
{
returnNoCache
.
addToMap
(
returnInventoryNo
);
returnNoManager
.
save
(
returnInventoryNo
);
}
// 最后刷新不能回滚的
if
(
finish
&&
isOrderPutIn
)
{
// 调用入库接口
if
(
baseNo
.
getClass
().
equals
(
SpareNo
.
class
))
{
dataLog
.
setSourceId
(
baseNo
.
getId
());
dataLog
.
setSourceName
(((
SpareNo
)
baseNo
).
getSpareNo
());
List
<
SpareInHourseDetail
>
details
=
new
ArrayList
<>();
for
(
SpareNoDetail
detail
:
baseNo
.
getDetailList
())
{
SpareInHourseDetail
spareInHourseDetail
=
new
SpareInHourseDetail
();
spareInHourseDetail
.
setInQty
(
detail
.
getInQty
());
spareInHourseDetail
.
setPartno
(
detail
.
getPartno
());
String
location
=
boxStr
;
}
// 最后刷新不能回滚的
if
(
finish
&&
isOrderPutIn
)
{
// 调用入库接口
if
(
baseNo
.
getClass
().
equals
(
SpareNo
.
class
))
{
dataLog
.
setSourceId
(
baseNo
.
getId
());
dataLog
.
setSourceName
(((
SpareNo
)
baseNo
).
getSpareNo
());
List
<
SpareInHourseDetail
>
details
=
new
ArrayList
<>();
for
(
SpareNoDetail
detail
:
baseNo
.
getDetailList
())
{
SpareInHourseDetail
spareInHourseDetail
=
new
SpareInHourseDetail
();
spareInHourseDetail
.
setInQty
(
detail
.
getInQty
());
spareInHourseDetail
.
setPartno
(
detail
.
getPartno
());
String
location
=
boxStr
;
// String location = SpareNostatus.LOCATION_CODE.get(baseNo.getWhCode());
spareInHourseDetail
.
setLocationCode
(
location
);
spareInHourseDetail
.
setLocationCode
(
location
);
// spareInHourseDetail.setLocationCode(binBarcode.getBarcode());
details
.
add
(
spareInHourseDetail
);
}
LuxsanSpApi
.
spareInHourse
(
new
SpareInHourseRequest
(
baseNo
.
getDeptId
(),
baseNo
.
getNo
(),
baseNo
.
getWhCode
(),
details
));
details
.
add
(
spareInHourseDetail
);
}
LuxsanSpApi
.
spareInHourse
(
new
SpareInHourseRequest
(
baseNo
.
getDeptId
(),
baseNo
.
getNo
(),
baseNo
.
getWhCode
(),
details
));
}
return
res
;
}
catch
(
Exception
e
)
{
// 回滚
rollBack
();
throw
new
Exception
(
e
.
getMessage
());
}
return
res
;
}
// 入料接口使用了对象锁,可以
...
...
@@ -276,6 +266,7 @@ public class SpBoxPutInManagerImpl implements SpBoxPutInManager {
private
BaseNo
backupSpareNo
;
private
StoragePos
backupPos
;
@Deprecated
public
void
addBackupObj
(
Object
o
)
{
if
(
o
instanceof
Barcode
)
{
backupBarcodes
.
add
(
DeepCopyUtil
.
deepCopy
((
Barcode
)
o
));
...
...
@@ -286,6 +277,7 @@ public class SpBoxPutInManagerImpl implements SpBoxPutInManager {
}
}
@Deprecated
public
void
rollBack
()
throws
Exception
{
try
{
log
.
info
(
"开始回滚"
);
...
...
@@ -311,10 +303,11 @@ public class SpBoxPutInManagerImpl implements SpBoxPutInManager {
log
.
info
(
String
.
format
(
"库位[%s]回滚为"
+
backupPos
,
backupPos
.
getPosName
()));
}
}
catch
(
Exception
e
)
{
throw
new
Exception
(
"回滚失败,失败原因:"
+
e
.
getMessage
());
}
finally
{
backupBarcodes
=
new
ArrayList
<>();
backupPos
=
null
;
backupSpareNo
=
null
;
throw
new
Exception
(
"回滚失败,失败原因:"
+
e
.
getMessage
());
}
}
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论