Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 23e813cc
由
zshaohui
编写于
2023-02-24 14:14:25 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
1.工单模板增加NUM和MPN字段
2.工单出库PN和MPN同时满足数量与盘数
1 个父辈
4e1d8062
显示空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
103 行增加
和
10 行删除
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
src/main/java/com/neotel/smfcore/core/order/listener/DefaultOrderFileListener.java
src/main/java/com/neotel/smfcore/core/order/rest/bean/dto/OrderItemDto.java
src/main/java/com/neotel/smfcore/core/order/service/po/LiteOrderItem.java
src/main/java/com/neotel/smfcore/core/storage/service/manager/IStoragePosManager.java
src/main/java/com/neotel/smfcore/core/storage/service/manager/impl/StoragePosManagerImpl.java
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
查看文件 @
23e813c
...
@@ -7,6 +7,7 @@ import com.neotel.smfcore.common.bean.ResultBean;
...
@@ -7,6 +7,7 @@ import com.neotel.smfcore.common.bean.ResultBean;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.utils.Constants
;
import
com.neotel.smfcore.common.utils.Constants
;
import
com.neotel.smfcore.common.utils.SecurityUtils
;
import
com.neotel.smfcore.common.utils.SecurityUtils
;
import
com.neotel.smfcore.common.utils.StringUtils
;
import
com.neotel.smfcore.core.api.SmfApi
;
import
com.neotel.smfcore.core.api.SmfApi
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.core.device.enums.OP
;
...
@@ -297,6 +298,14 @@ public class LiteOrderCache {
...
@@ -297,6 +298,14 @@ public class LiteOrderCache {
closed
=
false
;
closed
=
false
;
break
;
break
;
}
}
if
(
closed
)
{
if
(
StringUtils
.
isBlank
(
liteOrderItem
.
getRi
())
&&
(
StringUtils
.
isNotBlank
(
liteOrderItem
.
getPn
())
||
StringUtils
.
isNotBlank
(
liteOrderItem
.
getMpn
())))
{
if
(!
liteOrderItem
.
isOutReelFinished
())
{
closed
=
false
;
break
;
}
}
}
}
}
if
(
closed
){
if
(
closed
){
order
.
setClosed
(
closed
);
order
.
setClosed
(
closed
);
...
@@ -394,20 +403,25 @@ public class LiteOrderCache {
...
@@ -394,20 +403,25 @@ public class LiteOrderCache {
//剩余未出数量
//剩余未出数量
Float
totalNum
=
orderItem
.
getNeedNum
()
*
cacheOrder
.
getOrderTimes
();
Float
totalNum
=
orderItem
.
getNeedNum
()
*
cacheOrder
.
getOrderTimes
();
int
remainNum
=
totalNum
.
intValue
()
-
orderItem
.
getOutNum
();
int
remainNum
=
totalNum
.
intValue
()
-
orderItem
.
getTotalOutNum
();
//剩余未出盘数
int
remainReelCount
=
orderItem
.
getNeedReelCount
()
-
orderItem
.
getTotalOutReelCount
();
//此PN未完成
//此PN未完成
if
(
remainNum
>
0
)
{
if
(
remainNum
>
0
)
{
if
(
outBom
)
{
if
(
outBom
)
{
//套料出库,设置剩余数量为1,这样就只会出一盘
//套料出库,设置剩余数量为1,这样就只会出一盘
remainNum
=
1
;
remainNum
=
1
;
remainReelCount
=
0
;
}
}
int
assignNum
=
0
;
int
assignNum
=
0
;
while
(
assignNum
<
remainNum
)
{
int
assignReelCount
=
0
;
while
(
assignNum
<
remainNum
||
assignReelCount
<
remainReelCount
)
{
Collection
<
String
>
excludePosIds
=
excludeOutPosIds
();
Collection
<
String
>
excludePosIds
=
excludeOutPosIds
();
String
partNumber
=
orderItem
.
getPn
();
String
partNumber
=
orderItem
.
getPn
();
String
reelId
=
orderItem
.
getRi
();
String
reelId
=
orderItem
.
getRi
();
String
mpn
=
orderItem
.
getMpn
();
StoragePos
pos
=
null
;
StoragePos
pos
=
null
;
if
(!
Strings
.
isNullOrEmpty
(
reelId
)){
if
(!
Strings
.
isNullOrEmpty
(
reelId
)){
//RI
//RI
...
@@ -420,15 +434,18 @@ public class LiteOrderCache {
...
@@ -420,15 +434,18 @@ public class LiteOrderCache {
}
else
{
}
else
{
log
.
info
(
"工单["
+
orderNo
+
"]RI出库时,库存中未找到料盘["
+
reelId
+
"]"
);
log
.
info
(
"工单["
+
orderNo
+
"]RI出库时,库存中未找到料盘["
+
reelId
+
"]"
);
}
}
}
else
{
}
else
if
(
Strings
.
isNullOrEmpty
(
reelId
)
&&
!
Strings
.
isNullOrEmpty
(
partNumber
))
{
//PN
//PN
pos
=
storagePosManager
.
findPartNumberInStorages
(
availableStorageIds
,
partNumber
,
excludePosIds
,
checkoutType
);
pos
=
storagePosManager
.
findPartNumberInStorages
(
availableStorageIds
,
partNumber
,
excludePosIds
,
checkoutType
);
}
else
if
(
Strings
.
isNullOrEmpty
(
reelId
)
&&
Strings
.
isNullOrEmpty
(
partNumber
)
&&
!
Strings
.
isNullOrEmpty
(
mpn
)){
pos
=
storagePosManager
.
findMpnInStorages
(
availableStorageIds
,
mpn
,
excludePosIds
,
checkoutType
);
}
}
if
(
pos
==
null
)
{
if
(
pos
==
null
)
{
// log.error("未找到可以出库的物料[" + partNumber + "]");
// log.error("未找到可以出库的物料[" + partNumber + "]");
break
;
break
;
}
else
{
}
else
{
assignNum
=
assignNum
+
pos
.
getBarcode
().
getAmount
();
assignNum
=
assignNum
+
pos
.
getBarcode
().
getAmount
();
assignReelCount
=
assignReelCount
+
1
;
taskReelCount
=
taskReelCount
+
1
;
taskReelCount
=
taskReelCount
+
1
;
log
.
info
(
"工单["
+
orderNo
+
"],任务数["
+
taskReelCount
+
"]出库位置仓位【"
+
pos
.
getPosName
()
+
"】RI=["
+
pos
.
getBarcode
().
getBarcode
()
+
"] PN=["
+
partNumber
+
"] num:"
+
pos
.
getBarcode
().
getAmount
());
log
.
info
(
"工单["
+
orderNo
+
"],任务数["
+
taskReelCount
+
"]出库位置仓位【"
+
pos
.
getPosName
()
+
"】RI=["
+
pos
.
getBarcode
().
getBarcode
()
+
"] PN=["
+
partNumber
+
"] num:"
+
pos
.
getBarcode
().
getAmount
());
DataLog
task
=
newTask
(
pos
)
;
DataLog
task
=
newTask
(
pos
)
;
...
...
src/main/java/com/neotel/smfcore/core/order/listener/DefaultOrderFileListener.java
查看文件 @
23e813c
...
@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
...
@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Lists
;
import
com.neotel.smfcore.common.csv.CsvReader
;
import
com.neotel.smfcore.common.csv.CsvReader
;
import
com.neotel.smfcore.common.excel.ExcelReader
;
import
com.neotel.smfcore.common.excel.ExcelReader
;
import
com.neotel.smfcore.common.utils.StringUtils
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.order.LiteOrderCache
;
import
com.neotel.smfcore.core.order.LiteOrderCache
;
import
com.neotel.smfcore.core.order.service.manager.ILiteOrderManager
;
import
com.neotel.smfcore.core.order.service.manager.ILiteOrderManager
;
...
@@ -114,6 +115,8 @@ public class DefaultOrderFileListener implements IOrderFileListener {
...
@@ -114,6 +115,8 @@ public class DefaultOrderFileListener implements IOrderFileListener {
int
feederIndex
=
csvRead
.
getIndex
(
"FEEDER"
,
orderSetting
.
getFeeder
());
int
feederIndex
=
csvRead
.
getIndex
(
"FEEDER"
,
orderSetting
.
getFeeder
());
int
riIndex
=
csvRead
.
getIndex
(
"RI"
,
orderSetting
.
getRi
());
int
riIndex
=
csvRead
.
getIndex
(
"RI"
,
orderSetting
.
getRi
());
int
soIndex
=
csvRead
.
getIndex
(
"SO"
,
orderSetting
.
getSo
());
int
soIndex
=
csvRead
.
getIndex
(
"SO"
,
orderSetting
.
getSo
());
int
numIndex
=
csvRead
.
getIndex
(
"NUM"
,
orderSetting
.
getNum
());
int
mpnIndex
=
csvRead
.
getIndex
(
"MPN"
,
orderSetting
.
getMpn
());
int
row
=
1
;
int
row
=
1
;
int
newRowCount
=
0
;
int
newRowCount
=
0
;
...
@@ -127,8 +130,12 @@ public class DefaultOrderFileListener implements IOrderFileListener {
...
@@ -127,8 +130,12 @@ public class DefaultOrderFileListener implements IOrderFileListener {
if
(
riIndex
!=-
1
){
if
(
riIndex
!=-
1
){
ri
=
lineValues
[
riIndex
];
ri
=
lineValues
[
riIndex
];
}
}
if
(
partNumber
.
isEmpty
()&&
ri
.
isEmpty
())
{
String
mpn
=
""
;
log
.
warn
(
"行[partNumber="
+
partNumber
+
"]中PN和RI都 为空,此行忽略"
);
if
(
mpnIndex
!=-
1
){
mpn
=
lineValues
[
mpnIndex
];
}
if
(
partNumber
.
isEmpty
()&&
ri
.
isEmpty
()&&
mpn
.
isEmpty
())
{
log
.
warn
(
"行[partNumber="
+
partNumber
+
"]中PN和RI,MPN都为空,此行忽略"
);
}
else
{
}
else
{
int
num
=
1
;
int
num
=
1
;
if
(
qtyIndex
!=
-
1
)
{
if
(
qtyIndex
!=
-
1
)
{
...
@@ -153,8 +160,21 @@ public class DefaultOrderFileListener implements IOrderFileListener {
...
@@ -153,8 +160,21 @@ public class DefaultOrderFileListener implements IOrderFileListener {
if
(!
ObjectUtil
.
isNotEmpty
(
so
)){
if
(!
ObjectUtil
.
isNotEmpty
(
so
)){
so
=
fileName
;
so
=
fileName
;
}
}
int
count
=
1
;
if
(
numIndex
!=
-
1
){
String
countStr
=
lineValues
[
numIndex
];
if
(
StringUtils
.
isNotBlank
(
countStr
)){
try
{
count
=
Integer
.
valueOf
(
countStr
);
}
catch
(
Exception
e
)
{
log
.
error
(
partNumber
+
"的数量:"
+
countStr
+
" 不是数字,使用1"
);
}
}
}
LiteOrderItem
item
=
new
LiteOrderItem
();
LiteOrderItem
item
=
new
LiteOrderItem
();
item
.
setPn
(
partNumber
);
item
.
setPn
(
partNumber
);
item
.
setNeedReelCount
(
count
);
if
(
partNumber
.
isEmpty
()){
if
(
partNumber
.
isEmpty
()){
item
.
setNeedReelCount
(
1
);
item
.
setNeedReelCount
(
1
);
}
}
...
@@ -162,12 +182,12 @@ public class DefaultOrderFileListener implements IOrderFileListener {
...
@@ -162,12 +182,12 @@ public class DefaultOrderFileListener implements IOrderFileListener {
item
.
setFeederInfo
(
feeder
);
item
.
setFeederInfo
(
feeder
);
item
.
setRi
(
ri
);
item
.
setRi
(
ri
);
item
.
setMpn
(
mpn
);
if
(!
itemMap
.
containsKey
(
so
)){
if
(!
itemMap
.
containsKey
(
so
)){
itemMap
.
put
(
so
,
new
ArrayList
<
LiteOrderItem
>());
itemMap
.
put
(
so
,
new
ArrayList
<
LiteOrderItem
>());
}
}
itemMap
.
get
(
so
).
add
(
item
);
itemMap
.
get
(
so
).
add
(
item
);
items
.
add
(
item
);
items
.
add
(
item
);
}
}
}
}
...
@@ -206,15 +226,22 @@ public class DefaultOrderFileListener implements IOrderFileListener {
...
@@ -206,15 +226,22 @@ public class DefaultOrderFileListener implements IOrderFileListener {
int
feederIndex
=
headerMap
.
getOrDefault
(
orderSetting
.
getFeeder
(),-
1
);
int
feederIndex
=
headerMap
.
getOrDefault
(
orderSetting
.
getFeeder
(),-
1
);
int
riIndex
=
headerMap
.
getOrDefault
(
orderSetting
.
getRi
(),-
1
);
int
riIndex
=
headerMap
.
getOrDefault
(
orderSetting
.
getRi
(),-
1
);
int
soIndex
=
headerMap
.
getOrDefault
(
orderSetting
.
getSo
(),-
1
);
int
soIndex
=
headerMap
.
getOrDefault
(
orderSetting
.
getSo
(),-
1
);
int
numIndex
=
headerMap
.
getOrDefault
(
orderSetting
.
getNum
(),-
1
);
int
mpnIndex
=
headerMap
.
getOrDefault
(
orderSetting
.
getMpn
(),-
1
);
for
(
int
i
=
1
;
i
<
data
.
size
();
i
++){
for
(
int
i
=
1
;
i
<
data
.
size
();
i
++){
Map
<
Integer
,
String
>
lineValues
=
data
.
get
(
i
);
Map
<
Integer
,
String
>
lineValues
=
data
.
get
(
i
);
String
partNumber
=
lineValues
.
get
(
partNumberIndex
);
String
partNumber
=
lineValues
.
get
(
partNumberIndex
);
String
ri
=
""
;
String
ri
=
""
;
String
mpn
=
""
;
if
(
riIndex
!=-
1
){
if
(
riIndex
!=-
1
){
ri
=
lineValues
.
get
(
riIndex
);
ri
=
lineValues
.
get
(
riIndex
);
}
}
if
(
partNumber
.
isEmpty
()&&
ri
.
isEmpty
())
{
if
(
mpnIndex
!=-
1
){
log
.
warn
(
"行[partNumber="
+
partNumber
+
"]中PN和RI都 为空,此行忽略"
);
mpn
=
lineValues
.
get
(
mpnIndex
);
}
if
(
partNumber
.
isEmpty
()&&
ri
.
isEmpty
()&&
mpn
.
isEmpty
())
{
log
.
warn
(
"行[partNumber="
+
partNumber
+
"]中PN和RI,MPN都 为空,此行忽略"
);
}
else
{
}
else
{
int
num
=
1
;
int
num
=
1
;
if
(
qtyIndex
!=
-
1
)
{
if
(
qtyIndex
!=
-
1
)
{
...
@@ -239,8 +266,21 @@ public class DefaultOrderFileListener implements IOrderFileListener {
...
@@ -239,8 +266,21 @@ public class DefaultOrderFileListener implements IOrderFileListener {
if
(!
ObjectUtil
.
isNotEmpty
(
so
)){
if
(!
ObjectUtil
.
isNotEmpty
(
so
)){
so
=
fileName
;
so
=
fileName
;
}
}
int
count
=
1
;
if
(
numIndex
!=
-
1
){
String
countStr
=
lineValues
.
get
(
numIndex
);
if
(
StringUtils
.
isNotBlank
(
countStr
)){
try
{
count
=
Integer
.
valueOf
(
countStr
);
}
catch
(
Exception
e
)
{
log
.
error
(
partNumber
+
"的数量:"
+
countStr
+
" 不是数字,使用1"
);
}
}
}
LiteOrderItem
item
=
new
LiteOrderItem
();
LiteOrderItem
item
=
new
LiteOrderItem
();
item
.
setPn
(
partNumber
);
item
.
setPn
(
partNumber
);
item
.
setNeedReelCount
(
count
);
if
(
partNumber
.
isEmpty
()){
if
(
partNumber
.
isEmpty
()){
item
.
setNeedReelCount
(
1
);
item
.
setNeedReelCount
(
1
);
}
}
...
@@ -248,6 +288,7 @@ public class DefaultOrderFileListener implements IOrderFileListener {
...
@@ -248,6 +288,7 @@ public class DefaultOrderFileListener implements IOrderFileListener {
item
.
setFeederInfo
(
feeder
);
item
.
setFeederInfo
(
feeder
);
item
.
setRi
(
ri
);
item
.
setRi
(
ri
);
item
.
setMpn
(
mpn
);
if
(!
itemMap
.
containsKey
(
so
)){
if
(!
itemMap
.
containsKey
(
so
)){
itemMap
.
put
(
so
,
new
ArrayList
<
LiteOrderItem
>());
itemMap
.
put
(
so
,
new
ArrayList
<
LiteOrderItem
>());
}
}
...
...
src/main/java/com/neotel/smfcore/core/order/rest/bean/dto/OrderItemDto.java
查看文件 @
23e813c
...
@@ -51,4 +51,6 @@ public class OrderItemDto {
...
@@ -51,4 +51,6 @@ public class OrderItemDto {
@Transient
@Transient
private
int
inventoryNum
=
0
;
private
int
inventoryNum
=
0
;
@ApiModelProperty
(
"制造商物料编号"
)
private
String
mpn
=
""
;
}
}
src/main/java/com/neotel/smfcore/core/order/service/po/LiteOrderItem.java
查看文件 @
23e813c
...
@@ -82,11 +82,21 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
...
@@ -82,11 +82,21 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
*/
*/
private
String
side
=
""
;
private
String
side
=
""
;
/**
* 制造商物料编号
*/
private
String
mpn
=
""
;
/**
/**
* 出库是否满足要求,已出库数量大于需求数量
* 出库是否满足要求,已出库数量大于需求数量
*/
*/
public
boolean
isOutFinished
(){
public
boolean
isOutFinished
(){
return
outNum
-
needNum
>=
0
;
return
totalOutNum
-
needNum
>=
0
;
}
public
boolean
isOutReelFinished
(){
return
totalOutReelCount
-
needReelCount
>=
0
;
}
}
@Override
@Override
...
...
src/main/java/com/neotel/smfcore/core/storage/service/manager/IStoragePosManager.java
查看文件 @
23e813c
...
@@ -80,4 +80,6 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
...
@@ -80,4 +80,6 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
void
batchUpdatePosEnabled
(
List
<
String
>
idList
,
boolean
enabled
);
void
batchUpdatePosEnabled
(
List
<
String
>
idList
,
boolean
enabled
);
List
<
StoragePos
>
findPosByIdList
(
List
<
String
>
idList
);
List
<
StoragePos
>
findPosByIdList
(
List
<
String
>
idList
);
StoragePos
findMpnInStorages
(
List
<
String
>
availableStorageIds
,
String
mpn
,
Collection
<
String
>
excludePosIds
,
CHECKOUT_TYPE
checkoutType
);
}
}
src/main/java/com/neotel/smfcore/core/storage/service/manager/impl/StoragePosManagerImpl.java
查看文件 @
23e813c
...
@@ -676,4 +676,25 @@ public class StoragePosManagerImpl implements IStoragePosManager {
...
@@ -676,4 +676,25 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return
storagePosDao
.
findByQuery
(
query
);
return
storagePosDao
.
findByQuery
(
query
);
}
}
@Override
public
StoragePos
findMpnInStorages
(
List
<
String
>
storageIdList
,
String
mpn
,
Collection
<
String
>
excludePosIds
,
CHECKOUT_TYPE
checkOutType
)
{
Criteria
c
=
Criteria
.
where
(
"barcode.mpn"
).
is
(
mpn
)
.
and
(
"id"
).
nin
(
excludePosIds
)
.
and
(
"enabled"
).
is
(
true
)
//可用
.
and
(
"barcode.lockId"
).
is
(
null
);
//没有被锁定的仓位;
if
(
storageIdList
!=
null
)
{
c
=
c
.
and
(
"storageId"
).
in
(
storageIdList
);
}
Query
q
=
new
Query
(
c
);
Sort
sort
=
getSortByCheckOutType
(
checkOutType
);
q
.
with
(
sort
);
StoragePos
pos
=
storagePosDao
.
findOne
(
q
);
if
(
pos
==
null
)
{
log
.
info
(
"使用"
+
checkOutType
+
" 策略出库 mpn="
+
mpn
+
",未找到可以出库的物料 "
);
}
else
{
log
.
info
(
"使用"
+
checkOutType
+
" 策略出库 mpn="
+
mpn
+
",找到出仓位置【"
+
pos
.
getPosName
()
+
"】,RI【"
+
pos
.
getBarcode
().
getBarcode
()
+
"】 "
);
}
return
pos
;
}
}
}
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论