Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit b36b4b80
由
张少辉
编写于
2026-04-28 13:07:39 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
1.增加工单出库 补料出库功能
1 个父辈
9ebd8d7e
隐藏空白字符变更
内嵌
并排
正在显示
11 个修改的文件
包含
92 行增加
和
28 行删除
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
src/main/java/com/neotel/smfcore/core/order/rest/OrderController.java
src/main/java/com/neotel/smfcore/core/order/rest/bean/OrderItemCheckDetail.java
src/main/java/com/neotel/smfcore/core/storage/rest/MaterialBoxController.java
src/main/java/com/neotel/smfcore/core/storage/service/manager/impl/StoragePosManagerImpl.java
src/main/java/com/neotel/smfcore/custom/aiqingzhiyin1643/finishedGoodsWarehouse/enums/PutAwayLocEnum.java
src/main/java/com/neotel/smfcore/custom/aiqingzhiyin1643/momo/MomoApi.java
src/main/java/com/neotel/smfcore/custom/hanwha/handler/TMSUtil.java
src/main/java/com/neotel/smfcore/custom/neotel/NeotelController.java
src/main/java/com/neotel/smfcore/custom/tiantong/TianTongController.java
src/main/java/com/neotel/smfcore/custom/zhongche1568/controller/ZhongCheDeviceController.java
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
查看文件 @
b36b4b8
...
...
@@ -165,7 +165,7 @@ public class LiteOrderCache {
Date
curr
=
new
Date
();
if
(
order
.
getSDate
().
before
(
curr
))
{
//开始自动出库
String
result
=
checkOutLiteOrder
(
order
.
getOrderNo
(),
false
);
String
result
=
checkOutLiteOrder
(
order
.
getOrderNo
(),
false
,
new
HashMap
<>()
);
if
(!
ObjectUtil
.
isEmpty
(
result
))
{
String
msg
=
MessageUtils
.
getText
(
result
,
MessageUtils
.
getDefaultLocal
(),
""
);
log
.
info
(
"自动执行工单 【"
+
order
.
getOrderNo
()
+
"】 失败:"
+
msg
);
...
...
@@ -435,23 +435,23 @@ public class LiteOrderCache {
/**
* 执行工单出库,批量料仓默认出库到料串上
*/
public
String
checkOutLiteOrder
(
String
orderNo
,
boolean
outBom
)
{
public
String
checkOutLiteOrder
(
String
orderNo
,
boolean
outBom
,
Map
<
String
,
Integer
>
orderItemCheckOutMap
)
{
boolean
singleOut
=
false
;
return
checkOutLiteOrder
(
orderNo
,
outBom
,
singleOut
);
return
checkOutLiteOrder
(
orderNo
,
outBom
,
singleOut
,
orderItemCheckOutMap
);
}
public
synchronized
String
checkOutLiteOrder
(
String
orderNo
,
boolean
outBom
,
boolean
singleOut
)
{
return
checkOutLiteOrder
(
orderNo
,
outBom
,
singleOut
,
false
);
public
synchronized
String
checkOutLiteOrder
(
String
orderNo
,
boolean
outBom
,
boolean
singleOut
,
Map
<
String
,
Integer
>
orderItemCheckOutMap
)
{
return
checkOutLiteOrder
(
orderNo
,
outBom
,
singleOut
,
false
,
orderItemCheckOutMap
);
}
public
synchronized
String
checkOutLiteOrder
(
String
orderNo
,
boolean
outBom
,
boolean
singleOut
,
boolean
needCheck
)
{
return
checkOutLiteOrder
(
orderNo
,
outBom
,
singleOut
,
needCheck
,
new
ArrayList
<>());
public
synchronized
String
checkOutLiteOrder
(
String
orderNo
,
boolean
outBom
,
boolean
singleOut
,
boolean
needCheck
,
Map
<
String
,
Integer
>
orderItemCheckOutMap
)
{
return
checkOutLiteOrder
(
orderNo
,
outBom
,
singleOut
,
needCheck
,
new
ArrayList
<>()
,
orderItemCheckOutMap
);
}
/**
* 执行工单出库
*/
public
synchronized
String
checkOutLiteOrder
(
String
orderNo
,
boolean
outBom
,
boolean
singleOut
,
boolean
needCheck
,
List
<
String
>
cidList
){
public
synchronized
String
checkOutLiteOrder
(
String
orderNo
,
boolean
outBom
,
boolean
singleOut
,
boolean
needCheck
,
List
<
String
>
cidList
,
Map
<
String
,
Integer
>
orderItemCheckOutMap
){
//判断工单是否存在
LiteOrder
cacheOrder
=
liteOrderMap
.
get
(
orderNo
);
if
(
cacheOrder
==
null
)
{
...
...
@@ -498,15 +498,34 @@ public class LiteOrderCache {
List
<
String
>
availableStorageIds
=
dataCache
.
getAvailableStorageIds
(
cidList
);
boolean
shortage
=
false
;
List
<
String
>
needOutPosId
=
new
ArrayList
<>();
//开始循环处理数据
for
(
LiteOrderItem
orderItem
:
cacheOrder
.
getOrderItems
())
{
//判断在不在所勾选的里边
Integer
needCheckNum
=
null
;
if
(
orderItemCheckOutMap
!=
null
&&
!
orderItemCheckOutMap
.
isEmpty
())
{
needCheckNum
=
orderItemCheckOutMap
.
get
(
orderItem
.
getId
());
if
(
needCheckNum
==
null
)
{
continue
;
}
}
//当前已出数量置为空
orderItem
.
setOutNum
(
0
);
orderItem
.
setOutReelCount
(
0
);
liteOrderItemManager
.
save
(
orderItem
);
//剩余未出数量
Float
totalNum
=
orderItem
.
getNeedNum
()
*
cacheOrder
.
getOrderTimes
();
int
remainNum
=
totalNum
.
intValue
()
-
orderItem
.
getTotalOutNum
();
//判断数量
if
(
needCheckNum
!=
null
)
{
if
(
needCheckNum
<
remainNum
)
{
remainNum
=
needCheckNum
;
}
}
//剩余未出盘数
int
remainReelCount
=
orderItem
.
getNeedReelCount
()
-
orderItem
.
getTotalOutReelCount
();
if
(
remainNum
>
0
||
remainReelCount
>
0
)
{
...
...
src/main/java/com/neotel/smfcore/core/order/rest/OrderController.java
查看文件 @
b36b4b8
...
...
@@ -2,6 +2,8 @@
package
com
.
neotel
.
smfcore
.
core
.
order
.
rest
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
com.google.common.collect.Lists
;
import
com.neotel.smfcore.common.bean.PageData
;
import
com.neotel.smfcore.common.bean.ResultBean
;
...
...
@@ -21,6 +23,7 @@ import com.neotel.smfcore.core.language.util.MessageUtils;
import
com.neotel.smfcore.core.order.LiteOrderCache
;
import
com.neotel.smfcore.core.order.enums.LITEORDER_STATUS
;
import
com.neotel.smfcore.core.order.enums.LITEORDER_STYPE
;
import
com.neotel.smfcore.core.order.rest.bean.OrderItemCheckDetail
;
import
com.neotel.smfcore.core.order.rest.bean.dto.OrderDto
;
import
com.neotel.smfcore.core.order.rest.bean.dto.OrderItemDto
;
import
com.neotel.smfcore.core.order.rest.bean.dto.OrderKanbanDto
;
...
...
@@ -156,8 +159,25 @@ public class OrderController {
@PostMapping
(
value
=
"/out"
)
@PreAuthorize
(
"@el.check('workOrder')"
)
public
ResultBean
checkOut
(
@RequestBody
Map
<
String
,
String
>
mapValues
)
{
String
orderNo
=
mapValues
.
get
(
"orderNo"
);
String
id
=
mapValues
.
get
(
"id"
);
String
orderItems
=
mapValues
.
get
(
"orderItems"
);
//转化为map
Map
<
String
,
Integer
>
orderItemCheckOutMap
=
new
HashMap
<>();
if
(
StringUtils
.
isNotEmpty
(
orderItems
))
{
List
<
OrderItemCheckDetail
>
detailList
=
JSONObject
.
parseArray
(
orderItems
,
OrderItemCheckDetail
.
class
);
for
(
OrderItemCheckDetail
detail
:
detailList
)
{
int
needNum
=
detail
.
getNeedNum
();
if
(
needNum
<=
0
)
{
return
ResultBean
.
newErrorResult
(-
1
,
""
,
"需求数量不能为0"
);
}
String
itemId
=
detail
.
getId
();
orderItemCheckOutMap
.
put
(
itemId
,
needNum
);
}
}
LiteOrder
liteOrder
=
null
;
if
(!
ObjectUtils
.
isEmpty
(
id
))
{
liteOrder
=
liteOrderManager
.
get
(
id
);
...
...
@@ -170,7 +190,7 @@ public class OrderController {
if
(
liteOrder
==
null
)
{
throw
new
ValidateException
(
"smfcore.valueNotFind"
,
"未找到{0}[{1}]"
,
new
String
[]{
"orderNo"
,
orderNo
});
}
String
result
=
liteOrderCache
.
checkOutLiteOrder
(
liteOrder
.
getOrderNo
(),
false
);
String
result
=
liteOrderCache
.
checkOutLiteOrder
(
liteOrder
.
getOrderNo
(),
false
,
orderItemCheckOutMap
);
if
(
ObjectUtil
.
isEmpty
(
result
))
{
return
ResultBean
.
newOkResult
(
result
);
}
else
{
...
...
@@ -187,7 +207,7 @@ public class OrderController {
if
(
orderNo
==
null
)
{
throw
new
ValidateException
(
"smfcore.valueCanotNull"
,
"{0}不能为空"
,
new
String
[]{
"orderNo"
});
}
String
result
=
liteOrderCache
.
checkOutLiteOrder
(
orderNo
,
true
);
String
result
=
liteOrderCache
.
checkOutLiteOrder
(
orderNo
,
true
,
new
HashMap
<>()
);
if
(
ObjectUtil
.
isEmpty
(
result
))
{
return
ResultBean
.
newOkResult
(
result
);
}
else
{
...
...
@@ -205,7 +225,7 @@ public class OrderController {
throw
new
ValidateException
(
"smfcore.valueCanotNull"
,
"{0}不能为空"
,
new
String
[]{
"orderNo"
});
}
String
result
=
liteOrderCache
.
checkOutLiteOrder
(
orderNo
,
false
);
String
result
=
liteOrderCache
.
checkOutLiteOrder
(
orderNo
,
false
,
new
HashMap
<>()
);
if
(
ObjectUtil
.
isEmpty
(
result
))
{
return
ResultBean
.
newOkResult
(
result
);
}
else
{
...
...
src/main/java/com/neotel/smfcore/core/order/rest/bean/OrderItemCheckDetail.java
0 → 100644
查看文件 @
b36b4b8
package
com
.
neotel
.
smfcore
.
core
.
order
.
rest
.
bean
;
import
lombok.Data
;
@Data
public
class
OrderItemCheckDetail
{
private
String
id
;
private
int
needNum
;
}
src/main/java/com/neotel/smfcore/core/storage/rest/MaterialBoxController.java
查看文件 @
b36b4b8
...
...
@@ -235,7 +235,7 @@ public class MaterialBoxController {
boolean
isDocking
=
dataCache
.
isElectronicWarehouseDocking
();
if
(
isDocking
)
{
//通知momo,退库接口
StockReturnResponse
response
=
momoApi
.
stockReturn
(
barcode
);
StockReturnResponse
response
=
momoApi
.
stockReturn
(
barcode
,
"LDHJ_J"
);
if
(!
response
.
getIsSuccess
()){
return
ResultBean
.
newErrorResult
(-
1
,
"smfcore.momo.stockOutError"
,
response
.
getErrorMessage
(),
new
String
[]{});
}
...
...
src/main/java/com/neotel/smfcore/core/storage/service/manager/impl/StoragePosManagerImpl.java
查看文件 @
b36b4b8
...
...
@@ -425,11 +425,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
//判断有没有限高
if
(
heightLimited
){
// 限高:匹配仓位编码最后以-03结尾(请确认字段名是posCode,若不是请替换)
Pattern
pattern
=
Pattern
.
compile
(
"-
0
3$"
);
Pattern
pattern
=
Pattern
.
compile
(
"-3$"
);
c
=
c
.
and
(
"posName"
).
regex
(
pattern
);
}
else
{
// 不限高:匹配仓位编码最后不是-
0
3结尾
Pattern
pattern
=
Pattern
.
compile
(
"^(.*(?<!-
0
3))$"
);
// 不限高:匹配仓位编码最后不是-3结尾
Pattern
pattern
=
Pattern
.
compile
(
"^(.*(?<!-3))$"
);
c
=
c
.
and
(
"posName"
).
regex
(
pattern
);
}
Query
query
=
new
Query
(
c
);
...
...
src/main/java/com/neotel/smfcore/custom/aiqingzhiyin1643/finishedGoodsWarehouse/enums/PutAwayLocEnum.java
查看文件 @
b36b4b8
...
...
@@ -15,8 +15,8 @@ public enum PutAwayLocEnum {
inPos1
(
"inPos1"
,
false
),
inPos2
(
"inPos2"
,
false
),
inPos3
(
"inPos3"
,
false
),
inPos4
(
"inPos4"
,
fals
e
),
inPos5
(
"inPos5"
,
tru
e
);
inPos4
(
"inPos4"
,
tru
e
),
inPos5
(
"inPos5"
,
fals
e
);
// 实际位置(默认和枚举名一致,可自定义)
private
final
String
actualPosition
;
...
...
src/main/java/com/neotel/smfcore/custom/aiqingzhiyin1643/momo/MomoApi.java
查看文件 @
b36b4b8
...
...
@@ -81,16 +81,21 @@ public class MomoApi extends BaseSmfApiListener {
)
{
String
receiptOrder
=
barcode
.
getReceiptOrder
();
if
(
StringUtils
.
isNotEmpty
(
receiptOrder
))
{
stockIn
(
barcode
);
//如果是电子仓的,则传LDHJ,如果是结构仓的则传LDHJ_J
String
warehouseLocation
=
"LDHJ"
;
if
(
storage
.
getCorrespondingWarehouse
()
==
CORRESPONDING_WAREHOUSE
.
STRUCTURAL_WAREHOUSE
){
warehouseLocation
=
"LDHJ_J"
;
}
stockIn
(
barcode
,
warehouseLocation
);
}
else
{
if
(
storage
.
getCorrespondingWarehouse
()
==
CORRESPONDING_WAREHOUSE
.
ELECTRONIC_WAREHOUSE
)
{
if
(
StringUtils
.
isNotEmpty
(
task
.
getStockoutNo
())){
stockReturn
(
barcode
);
stockReturn
(
barcode
,
"LDHJ"
);
}
}
}
}
else
if
(
storage
.
getCorrespondingWarehouse
()
==
CORRESPONDING_WAREHOUSE
.
FINISHED_GOODS_WAREHOUSE
)
{
fgStockIn
(
barcode
);
fgStockIn
(
barcode
,
task
.
getPosName
()
);
}
}
}
...
...
@@ -121,9 +126,11 @@ public class MomoApi extends BaseSmfApiListener {
}
}
public
void
stockIn
(
Barcode
barcode
)
{
public
void
stockIn
(
Barcode
barcode
,
String
warehouseLocation
)
{
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
paramMap
.
put
(
"StockinNo"
,
barcode
.
getReceiptOrder
());
paramMap
.
put
(
"WarehouseLocation"
,
warehouseLocation
);
Map
<
String
,
Object
>
itemMap
=
new
HashMap
<>();
itemMap
.
put
(
"StockinNoline"
,
barcode
.
getRowNumber
());
if
(
StringUtils
.
isNotEmpty
(
barcode
.
getPidBarcode
()))
{
...
...
@@ -144,10 +151,11 @@ public class MomoApi extends BaseSmfApiListener {
}
}
public
StockReturnResponse
stockReturn
(
Barcode
barcode
)
{
public
StockReturnResponse
stockReturn
(
Barcode
barcode
,
String
warehouseLocation
)
{
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
paramMap
.
put
(
"ReturnDate"
,
DateUtil
.
toDateString
(
new
Date
(),
"yyyy/MM/dd HH:mm:ss"
));
paramMap
.
put
(
"StockReturn"
,
"SMF"
+
System
.
currentTimeMillis
());
paramMap
.
put
(
"WarehouseLocation"
,
warehouseLocation
);
List
<
Map
<
String
,
Object
>>
Details
=
new
ArrayList
<>();
Map
<
String
,
Object
>
detailMap
=
new
HashMap
<>();
detailMap
.
put
(
"ProductName"
,
barcode
.
getDescription
());
...
...
@@ -349,10 +357,10 @@ public class MomoApi extends BaseSmfApiListener {
* @param barcode
*/
public
void
fgStockIn
(
Barcode
barcode
)
{
public
void
fgStockIn
(
Barcode
barcode
,
String
posName
)
{
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
paramMap
.
put
(
"Account"
,
"SMF"
);
paramMap
.
put
(
"WarehouseLocation"
,
""
);
paramMap
.
put
(
"WarehouseLocation"
,
posName
);
List
<
Map
<
String
,
Object
>>
palletInfoModels
=
new
ArrayList
<>();
List
<
Barcode
>
subCodeList
=
barcode
.
getSubCodeList
();
for
(
Barcode
subCode
:
subCodeList
)
{
...
...
src/main/java/com/neotel/smfcore/custom/hanwha/handler/TMSUtil.java
查看文件 @
b36b4b8
...
...
@@ -34,6 +34,7 @@ import org.springframework.stereotype.Service;
import
java.text.SimpleDateFormat
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
@Slf4j
@Service
...
...
@@ -188,7 +189,7 @@ public class TMSUtil {
liteOrderCache
.
addOrderToMap
(
liteOrder
);
if
(
autoOut
)
{
try
{
liteOrderCache
.
checkOutLiteOrder
(
liteOrder
.
getOrderNo
(),
false
,
false
,
true
,
rackList
);
liteOrderCache
.
checkOutLiteOrder
(
liteOrder
.
getOrderNo
(),
false
,
false
,
true
,
rackList
,
new
HashMap
<>()
);
liteOrder
=
liteOrderCache
.
getLiteOrder
(
liteOrder
.
getOrderNo
());
}
catch
(
ValidateException
ex
)
{
log
.
error
(
requestCmd
+
" 自动执行工单["
+
liteOrder
.
getOrderNo
()
+
"] error:"
+
ex
.
toString
());
...
...
@@ -432,7 +433,7 @@ public class TMSUtil {
tmsParts
=
GetReserveList
(
"ProcessOrder"
,
order
,
lockPosList
,
order
.
getCidList
());
}
else
{
//工单出库
String
result
=
liteOrderCache
.
checkOutLiteOrder
(
order
.
getOrderNo
(),
false
,
false
,
true
);
String
result
=
liteOrderCache
.
checkOutLiteOrder
(
order
.
getOrderNo
(),
false
,
false
,
true
,
new
HashMap
<>()
);
tmsReserve
.
setResultCode
(
TMS_Code
.
CODE_2011
);
//查找工单的所有任务
Criteria
c
=
Criteria
.
where
(
"sourceName"
).
is
(
order
.
getOrderNo
()).
and
(
"type"
).
is
(
2
);
...
...
src/main/java/com/neotel/smfcore/custom/neotel/NeotelController.java
查看文件 @
b36b4b8
...
...
@@ -114,7 +114,7 @@ public class NeotelController {
liteOrder
=
liteOrderManager
.
createWithItems
(
liteOrder
);
liteOrderCache
.
addOrderToMap
(
liteOrder
);
if
(
execute
){
liteOrderCache
.
checkOutLiteOrder
(
liteOrder
.
getOrderNo
(),
false
,
singleOut
);
liteOrderCache
.
checkOutLiteOrder
(
liteOrder
.
getOrderNo
(),
false
,
singleOut
,
new
HashMap
<>()
);
}
}
return
ResultBean
.
newOkResult
(
""
);
...
...
src/main/java/com/neotel/smfcore/custom/tiantong/TianTongController.java
查看文件 @
b36b4b8
...
...
@@ -137,7 +137,7 @@ public class TianTongController {
liteOrder
=
liteOrderManager
.
createWithItems
(
liteOrder
);
liteOrderCache
.
addOrderToMap
(
liteOrder
);
if
(
execute
){
liteOrderCache
.
checkOutLiteOrder
(
liteOrder
.
getOrderNo
(),
false
,
singleOut
);
liteOrderCache
.
checkOutLiteOrder
(
liteOrder
.
getOrderNo
(),
false
,
singleOut
,
new
HashMap
<>()
);
}
return
ResultBean
.
newOkResult
(
""
);
}
...
...
src/main/java/com/neotel/smfcore/custom/zhongche1568/controller/ZhongCheDeviceController.java
查看文件 @
b36b4b8
...
...
@@ -520,8 +520,14 @@ public class ZhongCheDeviceController {
log
.
info
(
barcodeStr
+
"获取目的地信息"
);
Barcode
barcode
=
codeResolve
.
resolveOneValideBarcode
(
barcodeStr
);
resultMap
.
put
(
"locInfo"
,
"Manaul-"
+
ZhongCheOrderLoc
.
BELTLINE
);
if
(
barcode
!=
null
)
{
log
.
info
(
"解析到的条码信息为:"
+
barcode
.
getBarcode
());
resultMap
.
put
(
"height"
,
barcode
.
getHeight
());
resultMap
.
put
(
"plateSize"
,
barcode
.
getPlateSize
());
resultMap
.
put
(
"barcode"
,
barcode
.
getBarcode
());
List
<
DataLog
>
allTasks
=
taskService
.
getAllTasks
();
for
(
DataLog
dataLog
:
allTasks
)
{
if
(
dataLog
.
isCheckOutTask
()
&&
!
dataLog
.
isFinished
()
&&
!
dataLog
.
isCancel
())
{
...
...
@@ -542,6 +548,7 @@ public class ZhongCheDeviceController {
resultMap
.
put
(
"orderNo"
,
dataLog
.
getSourceName
());
}
}
}
log
.
info
(
barcodeStr
+
"获取目的地,返回的内容为:"
+
JSON
.
toJSONString
(
resultMap
));
return
resultMap
;
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论