Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 4864f134
由
zshaohui
编写于
2025-08-20 15:44:30 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
1.库位管理增加是否锁定信息
2.增加msd管控料仓配置
1 个父辈
74643c1d
隐藏空白字符变更
内嵌
并排
正在显示
12 个修改的文件
包含
140 行增加
和
13 行删除
src/main/java/com/neotel/smfcore/common/utils/ReelLockPosUtil.java
src/main/java/com/neotel/smfcore/core/barcode/service/po/Barcode.java
src/main/java/com/neotel/smfcore/core/device/handler/impl/XLRBoxHandler.java
src/main/java/com/neotel/smfcore/core/device/rest/DeviceController.java
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
src/main/java/com/neotel/smfcore/core/storage/rest/StoragePosController.java
src/main/java/com/neotel/smfcore/core/storage/rest/dto/StorageDto.java
src/main/java/com/neotel/smfcore/core/storage/rest/dto/StoragePosDto.java
src/main/java/com/neotel/smfcore/core/storage/service/po/Storage.java
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
src/main/java/com/neotel/smfcore/custom/Jkem21481/util/StorageExportUtil.java
src/main/resources/config/application-prod.yml
src/main/java/com/neotel/smfcore/common/utils/ReelLockPosUtil.java
查看文件 @
4864f13
...
...
@@ -124,6 +124,18 @@ public class ReelLockPosUtil {
return
lockPosIds
;
}
public
static
void
removeLockPosId
(
String
lockPosId
){
String
barcode
=
""
;
for
(
ReelLockPosInfo
reelLockPosInfo
:
reelLocKPosMap
.
values
())
{
if
(
lockPosId
.
equals
(
reelLockPosInfo
.
getLockPosId
())){
barcode
=
reelLockPosInfo
.
getBarcode
();
break
;
}
}
if
(
StringUtils
.
isNotEmpty
(
barcode
)){
removeReelLockPosInfo
(
barcode
);
}
}
private
static
String
processBarcode
(
String
str
)
{
if
(
ObjectUtil
.
isEmpty
(
str
))
{
...
...
src/main/java/com/neotel/smfcore/core/barcode/service/po/Barcode.java
查看文件 @
4864f13
...
...
@@ -179,6 +179,13 @@ public class Barcode extends BasePo implements Serializable {
private
String
orderNo
=
""
;
private
String
feederInfo
=
""
;
/**
* 分盘的barcode
*/
private
String
traySeparationBarcode
=
""
;
/**
* 是否是锡膏
*/
...
...
@@ -243,6 +250,8 @@ public class Barcode extends BasePo implements Serializable {
*/
private
Date
sluggishTime
;
private
String
orderItemId
=
""
;
/**
* 自定义的附加信息
*/
...
...
src/main/java/com/neotel/smfcore/core/device/handler/impl/XLRBoxHandler.java
查看文件 @
4864f13
...
...
@@ -357,7 +357,7 @@ public class XLRBoxHandler extends BaseDeviceHandler {
}
String
lastExport
=
lastOutExportMap
.
get
(
cid
);
log
.
info
(
cid
+
"对应的上一次出料口为:"
+
lastExport
);
//
log.info(cid+"对应的上一次出料口为:"+lastExport);
//查找下一出口的任务, 出口顺序为13572468, 桶的顺序为3,2,1
DataLog
orderTask
=
findNextTask
(
boxTaskListToExecute
,
lastExport
);
...
...
src/main/java/com/neotel/smfcore/core/device/rest/DeviceController.java
查看文件 @
4864f13
...
...
@@ -31,6 +31,7 @@ import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
import
com.neotel.smfcore.core.storage.service.manager.IStoragePosManager
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
com.neotel.smfcore.core.system.service.dao.IAlarmInfoDao
;
import
com.neotel.smfcore.core.system.service.manager.IDataLogManager
;
import
com.neotel.smfcore.core.system.service.po.AlarmInfo
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
com.neotel.smfcore.core.system.util.DevicesStatusUtil
;
...
...
@@ -83,6 +84,9 @@ public class DeviceController {
@Autowired
private
IBarcodeManager
barcodeManager
;
@Autowired
private
IDataLogManager
dataLogManager
;
/**
* 权限验证API列表
*/
...
...
@@ -1083,7 +1087,7 @@ public class DeviceController {
needMovePosTask
.
setOperator
(
"admin-move"
);
needMovePosTask
.
setType
(
OP
.
CHECKOUT
);
needMovePosTask
.
setStatus
(
OP_STATUS
.
FINISHED
.
name
());
taskService
.
updateFinishedTask
(
needMovePosTask
);
dataLogManager
.
save
(
needMovePosTask
);
needMovePos
.
setBarcode
(
null
);
needMovePos
.
setUsed
(
false
);
storagePosManager
.
save
(
needMovePos
);
...
...
@@ -1100,7 +1104,7 @@ public class DeviceController {
targetPosTask
.
setOperator
(
"admin-move"
);
targetPosTask
.
setType
(
OP
.
PUT_IN
);
targetPosTask
.
setStatus
(
OP_STATUS
.
FINISHED
.
name
());
taskService
.
updateFinishedTask
(
targetPosTask
);
dataLogManager
.
save
(
targetPosTask
);
targetPos
.
setBarcode
(
barcode
);
targetPos
.
setUsed
(
true
);
targetPos
.
setCanCheckOutTime
(
System
.
currentTimeMillis
());
...
...
src/main/java/com/neotel/smfcore/core/order/LiteOrderCache.java
查看文件 @
4864f13
...
...
@@ -23,6 +23,7 @@ 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.storage.bean.InventoryItem
;
import
com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE
;
import
com.neotel.smfcore.core.storage.service.manager.IStoragePosManager
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
...
...
@@ -962,7 +963,7 @@ public class LiteOrderCache {
int
appendNum
=
0
;
int
pitch
=
partNumberManager
.
getPitchByJkemPartNumber
(
orderItem
.
getPn
());
if
(
pitch
==
2
||
pitch
==
4
)
{
appendNum
=
30
0
;
appendNum
=
15
0
;
}
log
.
info
(
"工单号为:"
+
orderNo
+
",料号为:"
+
orderItem
.
getPn
()
+
",找到的pitch为:"
+
pitch
+
".需要增加的数量为:"
+
appendNum
);
//判断剩余要出的数量和盘数
...
...
@@ -986,13 +987,85 @@ public class LiteOrderCache {
if
(
StringUtils
.
isEmpty
(
putInExport
)){
break
;
}
//统计任务数
Map
<
String
,
Integer
>
taskPosIdMap
=
new
HashMap
<>();
for
(
String
storageId
:
availableStorageIds
)
{
taskPosIdMap
.
put
(
storageId
,
0
);
}
List
<
DataLog
>
allTasks
=
taskService
.
getAllTasks
();
for
(
DataLog
task
:
allTasks
)
{
if
(!
task
.
isFinished
()
&&
!
task
.
isCancel
()
&&
task
.
isCheckOutTask
()){
if
(
StringUtils
.
isNotEmpty
(
task
.
getStorageId
())){
Integer
count
=
taskPosIdMap
.
get
(
task
.
getStorageId
());
if
(
count
==
null
){
continue
;
}
else
{
count
=
count
+
1
;
taskPosIdMap
.
put
(
task
.
getStorageId
(),
count
);
}
}
}
}
//任务数最少得进行排序
taskPosIdMap
=
taskPosIdMap
.
entrySet
()
.
stream
()
.
sorted
(
Map
.
Entry
.
comparingByValue
())
.
collect
(
Collectors
.
toMap
(
Map
.
Entry
::
getKey
,
Map
.
Entry
::
getValue
,
(
oldValue
,
newValue
)
->
oldValue
,
// 合并函数,处理键冲突
LinkedHashMap:
:
new
// 保持排序顺序
));
StoragePos
pos
=
null
;
for
(
String
storageId
:
taskPosIdMap
.
keySet
())
{
try
{
log
.
info
(
"休眠100毫秒"
);
Thread
.
sleep
(
100
);
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
StoragePos
pos
=
storagePosManager
.
findPartNumberInStorages
(
availableStorageIds
,
partNumber
,
excludePosIds
,
checkoutType
);
//判断当前库存中,有没有可用的料盘信息,没有直接跳过
Map
<
String
,
InventoryItem
>
allInventory
=
dataCache
.
getAllInventory
(
Arrays
.
asList
(
storageId
),
null
);
if
(
allInventory
==
null
||
allInventory
.
isEmpty
()){
log
.
info
(
storageId
+
"没有可用的库存,跳过"
);
continue
;
}
else
{
InventoryItem
inventoryItem
=
allInventory
.
get
(
partNumber
);
if
(
inventoryItem
==
null
){
log
.
info
(
storageId
+
"没有可用的库存,跳过,对应的PartNumber为:"
+
partNumber
);
continue
;
}
}
pos
=
storagePosManager
.
findPartNumberInStorages
(
Arrays
.
asList
(
storageId
),
partNumber
,
excludePosIds
,
checkoutType
);
if
(
pos
!=
null
){
Barcode
barcode
=
pos
.
getBarcode
();
if
(
barcode
!=
null
){
boolean
hasTask
=
false
;
String
barcodeStr
=
barcode
.
getBarcode
();
List
<
DataLog
>
dataLogList
=
taskService
.
getAllTasks
();
for
(
DataLog
dataLog
:
dataLogList
)
{
if
(
barcodeStr
.
equals
(
dataLog
.
getBarcode
())){
if
(!
dataLog
.
isFinished
()
&&
!
dataLog
.
isCancel
()){
hasTask
=
true
;
break
;
}
}
}
if
(
hasTask
){
pos
=
null
;
}
}
}
if
(
pos
!=
null
){
break
;
}
}
if
(
pos
==
null
)
{
log
.
info
(
orderNo
+
"未找到可以出库的物料,料号为:"
+
partNumber
+
",站位号为:"
+
feederInfo
);
//物料为空,同步更新出料口信息
if
(
countTask
<
1
)
{
StorageExportUtil
.
updateExportByOrder
(
putInExport
,
""
,
feederInfo
,
orderNo
,
OP_STATUS
.
NONE
.
name
(),
partNumber
,
countTask
>
1
);
StorageExportUtil
.
updateExportByOrder
(
putInExport
,
""
,
feederInfo
,
orderNo
,
OP_STATUS
.
NONE
.
name
(),
partNumber
,
countTask
>
1
,
true
);
}
break
;
}
...
...
@@ -1020,10 +1093,16 @@ public class LiteOrderCache {
barcode
.
setCheckingAmount
(
checkingAmount
);
barcode
.
setOrderId
(
cacheOrder
.
getId
());
barcode
.
setOrderNo
(
orderNo
);
barcode
.
setOrderItemId
(
orderItem
.
getId
());
barcode
.
setMpn
(
orderItem
.
getMpn
());
barcode
.
setFeederInfo
(
orderItem
.
getFeederInfo
());
}
else
{
barcode
.
setCheckingAmount
(
barcode
.
getAmount
());
barcode
.
setOrderId
(
cacheOrder
.
getId
());
barcode
.
setOrderNo
(
orderNo
);
barcode
.
setOrderItemId
(
orderItem
.
getId
());
barcode
.
setMpn
(
orderItem
.
getMpn
());
barcode
.
setFeederInfo
(
orderItem
.
getFeederInfo
());
}
barcodeManager
.
save
(
barcode
);
pos
.
setBarcode
(
barcode
);
...
...
@@ -1066,7 +1145,7 @@ public class LiteOrderCache {
//先更新出料口,再更新任务
if
(!
barcode
.
isBox
())
{
log
.
info
(
barcode
.
getBarcode
()+
"为非料盒信息,需要更改出料口信息"
);
StorageExportUtil
.
updateExportByOrder
(
putInExport
,
barcode
.
getBarcode
(),
feederInfo
,
orderNo
,
task
.
getStatus
(),
task
.
getPartNumber
(),
countTask
>
1
);
StorageExportUtil
.
updateExportByOrder
(
putInExport
,
barcode
.
getBarcode
(),
feederInfo
,
orderNo
,
task
.
getStatus
(),
task
.
getPartNumber
(),
countTask
>
1
,
hasReel
);
}
taskService
.
addTaskToExecute
(
task
);
}
...
...
src/main/java/com/neotel/smfcore/core/storage/rest/StoragePosController.java
查看文件 @
4864f13
...
...
@@ -7,9 +7,7 @@ import com.neotel.smfcore.common.base.IExcelDownLoad;
import
com.neotel.smfcore.common.bean.PageData
;
import
com.neotel.smfcore.common.bean.ResultBean
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.utils.FileUtil
;
import
com.neotel.smfcore.common.utils.QueryHelp
;
import
com.neotel.smfcore.common.utils.SecurityUtils
;
import
com.neotel.smfcore.common.utils.*
;
import
com.neotel.smfcore.core.barcode.bean.CodeBean
;
import
com.neotel.smfcore.core.barcode.rest.bean.dto.BarcodeDto
;
import
com.neotel.smfcore.core.barcode.rest.bean.dto.CodeDto
;
...
...
@@ -107,10 +105,14 @@ public class StoragePosController {
PageData
<
StoragePos
>
pages
=
storagePosManager
.
findByPage
(
query
,
pageable
);
List
<
StoragePosDto
>
StoragePosDtos
=
storagePosMapper
.
toDto
(
pages
.
getContent
());
for
(
int
i
=
0
;
i
<
StoragePosDtos
.
size
();
i
++){
Set
<
String
>
allLockPosIds
=
ReelLockPosUtil
.
getAllLockPosIds
();
for
(
int
i
=
0
;
i
<
StoragePosDtos
.
size
();
i
++){
Storage
storage
=
dataCache
.
getStorageById
(
StoragePosDtos
.
get
(
i
).
getStorageId
());
if
(
storage
!=
null
){
StoragePosDtos
.
get
(
i
).
setStorageName
(
storage
.
getName
());
if
(
allLockPosIds
.
contains
(
StoragePosDtos
.
get
(
i
).
getId
())){
StoragePosDtos
.
get
(
i
).
setLock
(
true
);
}
}
}
return
new
PageData
(
StoragePosDtos
,
pages
.
getTotalElements
());
...
...
@@ -333,6 +335,15 @@ public class StoragePosController {
return
new
ResponseEntity
<>(
HttpStatus
.
OK
);
}
@ApiOperation
(
"解除锁定库位"
)
@RequestMapping
(
"/removeLockPosId"
)
public
ResultBean
removeLockPosId
(
String
posId
)
{
if
(
StringUtils
.
isNotEmpty
(
posId
))
{
ReelLockPosUtil
.
removeLockPosId
(
posId
);
}
return
ResultBean
.
newOkResult
(
""
);
}
private
Query
getPosFindCriteria
(
StoragePosFindCriteria
criteria
){
if
(
ObjectUtil
.
isNotEmpty
(
criteria
.
getStorageId
())
&&
criteria
.
getStorageId
().
equals
(
"0"
))
{
criteria
.
setStorageId
(
null
);
...
...
src/main/java/com/neotel/smfcore/core/storage/rest/dto/StorageDto.java
查看文件 @
4864f13
...
...
@@ -68,4 +68,6 @@ public class StorageDto implements Serializable {
@ApiModelProperty
(
"是否可以合并库位"
)
private
boolean
mergePos
=
false
;
private
boolean
msdControl
=
false
;
}
src/main/java/com/neotel/smfcore/core/storage/rest/dto/StoragePosDto.java
查看文件 @
4864f13
...
...
@@ -78,5 +78,6 @@ public class StoragePosDto implements Serializable {
@ApiModelProperty
(
"组名称"
)
private
String
groupName
=
""
;
@ApiModelProperty
(
"是否锁定"
)
private
boolean
lock
=
false
;
}
src/main/java/com/neotel/smfcore/core/storage/service/po/Storage.java
查看文件 @
4864f13
...
...
@@ -80,6 +80,10 @@ public class Storage extends BasePo implements Serializable {
*/
private
boolean
mergePos
=
false
;
/**
* 是否为msd管控的物料
*/
private
boolean
msdControl
=
false
;
// /**
// * 是否是上下层的在线料仓
...
...
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
查看文件 @
4864f13
...
...
@@ -174,6 +174,7 @@ public class TaskService {
if
(
isBox
==
null
){
isBox
=
false
;
}
log
.
info
(
task
.
getBarcode
()+
"找到的出料口为:"
+
export
+
",是否有料箱为:"
+
isBox
);
if
(
StringUtils
.
isNotEmpty
(
export
)
&&
!
isBox
)
{
StorageExportUtil
.
updateExportByTask
(
export
,
task
.
getBarcode
(),
task
.
getAppendData
(
"feederInfo"
),
task
.
getSourceName
(),
task
.
getStatus
(),
task
.
getPartNumber
());
}
...
...
src/main/java/com/neotel/smfcore/custom/Jkem21481/util/StorageExportUtil.java
查看文件 @
4864f13
...
...
@@ -353,7 +353,7 @@ public class StorageExportUtil {
}
public
static
synchronized
void
updateExportByOrder
(
String
export
,
String
barcode
,
String
feederInfo
,
String
orderNo
,
String
status
,
String
partNumber
,
boolean
countTask
)
{
public
static
synchronized
void
updateExportByOrder
(
String
export
,
String
barcode
,
String
feederInfo
,
String
orderNo
,
String
status
,
String
partNumber
,
boolean
countTask
,
boolean
hasReel
)
{
log
.
info
(
"修改出料口:"
+
export
+
"barcode为:"
+
barcode
+
",站位信息为:"
+
feederInfo
+
"工单号为:"
+
orderNo
+
",状态为:"
+
status
+
",partNumber为:"
+
partNumber
);
String
exportFeederInfo
=
FeederInfoUtil
.
getOriginalFeeder
(
feederInfo
);
...
...
@@ -378,6 +378,7 @@ public class StorageExportUtil {
detail
.
setStatus
(
status
);
detail
.
setLastStatus
(
status
);
detail
.
setOrderFeederInfo
(
orderFeederInfo
);
detail
.
setHasReel
(
hasReel
);
hasFeederInfo
=
true
;
break
;
}
...
...
@@ -391,6 +392,7 @@ public class StorageExportUtil {
detail
.
setStatus
(
status
);
detail
.
setFeederInfo
(
exportFeederInfo
);
detail
.
setOrderFeederInfo
(
orderFeederInfo
);
detail
.
setHasReel
(
hasReel
);
detailList
.
add
(
detail
);
}
storageExport
.
setDetailList
(
detailList
);
...
...
src/main/resources/config/application-prod.yml
查看文件 @
4864f13
...
...
@@ -14,6 +14,8 @@ spring:
database
:
smf
# 数据库
username
:
password
:
maxConSize
:
600
minConsize
:
300
#备份数据库,如果有,则开启,注意:如果主数据库设置了用户名和密码,备份服务器必须设置用户名和密码!!
#西门子的正式和备份数据库,用户名和密码都是Siemens
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论