Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit d46c5411
由
zshaohui
编写于
2025-10-16 14:11:00 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
1.扫码灭灯功能提交
1 个父辈
174e0d21
显示空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
285 行增加
和
6 行删除
src/main/java/com/neotel/smfcore/common/init/MenuInit.java
src/main/java/com/neotel/smfcore/custom/zhongche1568/bean/dto/ShelfDto.java
src/main/java/com/neotel/smfcore/custom/zhongche1568/bean/dto/ShelfReelDto.java
src/main/java/com/neotel/smfcore/custom/zhongche1568/controller/CodeLightController.java
src/main/java/com/neotel/smfcore/custom/zhongche1568/controller/ZhongCheAgvController.java
src/main/java/com/neotel/smfcore/common/init/MenuInit.java
查看文件 @
d46c541
...
@@ -164,7 +164,7 @@ public class MenuInit {
...
@@ -164,7 +164,7 @@ public class MenuInit {
addDefaultFunctionMenu
(
13
,
poutOut
,
"呆滞物料"
,
"sluggishMaterials"
,
"system/sluggishMaterials/index"
,
"sMaterial"
);
addDefaultFunctionMenu
(
13
,
poutOut
,
"呆滞物料"
,
"sluggishMaterials"
,
"system/sluggishMaterials/index"
,
"sMaterial"
);
//addDefaultFunctionMenu(16, poutOut,"生成工单", "createOrder", "system/createOrder/index", "createOrder");
//addDefaultFunctionMenu(16, poutOut,"生成工单", "createOrder", "system/createOrder/index", "createOrder");
// addDefaultFunctionMenu(91,poutOut, "共享文件夹", "orderSetting", "system/orderSetting/index", "sysSet",DEFAULT_SHOW_MENU);
// addDefaultFunctionMenu(91,poutOut, "共享文件夹", "orderSetting", "system/orderSetting/index", "sysSet",DEFAULT_SHOW_MENU);
addDefaultFunctionMenu
(
120
,
poutOut
,
"扫码灭灯"
,
"codeLight"
,
"neolight/codeLight/index"
,
"findOut"
);
//MSD管理:MSD库存.MSD追溯性.MSD设置
//MSD管理:MSD库存.MSD追溯性.MSD设置
Menu
msd
=
Menu
.
CreatePMenu
(
"MSD管理"
,
4
,
"msd"
,
"MSD"
,
null
);
Menu
msd
=
Menu
.
CreatePMenu
(
"MSD管理"
,
4
,
"msd"
,
"MSD"
,
null
);
...
...
src/main/java/com/neotel/smfcore/custom/zhongche1568/bean/dto/ShelfDto.java
0 → 100644
查看文件 @
d46c541
package
com
.
neotel
.
smfcore
.
custom
.
zhongche1568
.
bean
.
dto
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.util.List
;
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
ShelfDto
{
@ApiModelProperty
(
"料架rfid"
)
private
String
rfid
;
@ApiModelProperty
(
"位置"
)
private
String
loc
;
@ApiModelProperty
(
"工单信息"
)
private
String
orderNo
;
@ApiModelProperty
(
"物料列表"
)
private
List
<
ShelfReelDto
>
reelList
;
}
src/main/java/com/neotel/smfcore/custom/zhongche1568/bean/dto/ShelfReelDto.java
0 → 100644
查看文件 @
d46c541
package
com
.
neotel
.
smfcore
.
custom
.
zhongche1568
.
bean
.
dto
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
ShelfReelDto
implements
Serializable
{
@ApiModelProperty
(
"PN"
)
private
String
pn
;
@ApiModelProperty
(
"RI"
)
private
String
ri
;
@ApiModelProperty
(
"库位号"
)
private
String
posName
;
@ApiModelProperty
(
"是否有任务"
)
private
boolean
hasTask
=
false
;
}
src/main/java/com/neotel/smfcore/custom/zhongche1568/controller/CodeLightController.java
0 → 100644
查看文件 @
d46c541
package
com
.
neotel
.
smfcore
.
custom
.
zhongche1568
.
controller
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.neotel.smfcore.common.bean.ResultBean
;
import
com.neotel.smfcore.common.init.DataInitManager
;
import
com.neotel.smfcore.common.utils.StringUtils
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.barcode.utils.CodeResolve
;
import
com.neotel.smfcore.core.device.bean.StatusBean
;
import
com.neotel.smfcore.core.device.enums.OP_STATUS
;
import
com.neotel.smfcore.core.storage.rest.dto.StorageDto
;
import
com.neotel.smfcore.core.storage.rest.mapstruct.StorageMapper
;
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.Storage
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
com.neotel.smfcore.core.system.util.DevicesStatusUtil
;
import
com.neotel.smfcore.core.system.util.TaskService
;
import
com.neotel.smfcore.custom.zhongche1568.bean.dto.ShelfDto
;
import
com.neotel.smfcore.custom.zhongche1568.bean.dto.ShelfReelDto
;
import
com.neotel.smfcore.custom.zhongche1568.bean.shelf.ShelfInfo
;
import
com.neotel.smfcore.custom.zhongche1568.bean.shelf.ShelfLocInfo
;
import
com.neotel.smfcore.custom.zhongche1568.enums.ShelfStatus
;
import
com.neotel.smfcore.custom.zhongche1568.util.ShelfInfoUtil
;
import
com.neotel.smfcore.security.annotation.AnonymousAccess
;
import
com.neotel.smfcore.security.service.manager.IGroupManager
;
import
com.neotel.smfcore.security.service.po.Group
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.mongodb.core.query.Criteria
;
import
org.springframework.data.mongodb.core.query.Query
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.ArrayList
;
import
java.util.Collection
;
import
java.util.List
;
import
java.util.Map
;
/**
* 扫码亮灯
*/
@Slf4j
@RestController
public
class
CodeLightController
{
@Autowired
private
IStorageManager
storageManager
;
@Autowired
private
StorageMapper
storageMapper
;
@Autowired
private
IGroupManager
groupManager
;
@Autowired
private
ShelfInfoUtil
shelfInfoUtil
;
@Autowired
private
TaskService
taskService
;
@Autowired
private
CodeResolve
codeResolve
;
@ApiOperation
(
"获取指定类型的料仓列表"
)
@GetMapping
(
value
=
"/api/storage/listByType"
)
public
List
<
StorageDto
>
listByType
(
String
type
)
{
Criteria
c
=
Criteria
.
where
(
"type"
).
is
(
type
);
List
<
Storage
>
storages
=
storageManager
.
findByQuery
(
new
Query
(
c
));
List
<
StorageDto
>
storageDtos
=
storageMapper
.
toDto
(
storages
);
storageDtos
=
updateDtos
(
storageDtos
);
return
storageDtos
;
}
@ApiOperation
(
"获取扫码亮灯页面数据"
)
@GetMapping
(
value
=
"/rest/gree/light/reelList"
)
@ResponseBody
@AnonymousAccess
public
List
<
ShelfDto
>
reelList
(
String
cid
)
{
if
(
ObjectUtil
.
isEmpty
(
cid
))
{
cid
=
""
;
}
//分左右2个料架,展示
List
<
ShelfDto
>
shelfDtos
=
new
ArrayList
<>();
shelfDtos
.
add
(
new
ShelfDto
());
shelfDtos
.
add
(
new
ShelfDto
());
//获取到A/B的料架信息
Collection
<
ShelfInfo
>
allShelfInfo
=
shelfInfoUtil
.
getAllShelfInfo
();
if
(
allShelfInfo
!=
null
&&
!
allShelfInfo
.
isEmpty
())
{
for
(
ShelfInfo
shelfInfo
:
allShelfInfo
)
{
if
(
shelfInfo
.
getStatus
()
==
ShelfStatus
.
reachLine
)
{
String
currentLine
=
shelfInfo
.
getCurrentLine
();
if
(
StringUtils
.
isNotEmpty
(
currentLine
))
{
if
(
currentLine
.
startsWith
(
cid
))
{
if
(
currentLine
.
endsWith
(
"A"
))
{
ShelfDto
shelfDto
=
shelfDtos
.
get
(
0
);
shelfDto
.
setLoc
(
currentLine
);
shelfDto
.
setOrderNo
(
shelfInfo
.
getOrderNo
());
shelfDto
.
setRfid
(
shelfInfo
.
getShelfNo
());
List
<
ShelfReelDto
>
reelList
=
new
ArrayList
<>();
Map
<
String
,
ShelfLocInfo
>
shelfLocInfoMap
=
shelfInfo
.
getShelfLocInfoMap
();
if
(
shelfLocInfoMap
!=
null
&&
!
shelfLocInfoMap
.
isEmpty
()){
for
(
ShelfLocInfo
info
:
shelfLocInfoMap
.
values
())
{
// currentLine = currentLine.replaceAll("_A", "").replaceAll("_B", "");
String
posName
=
cid
+
"_A_"
+
info
.
getLoc
();
ShelfReelDto
dto
=
new
ShelfReelDto
();
dto
.
setRi
(
info
.
getBarcode
());
dto
.
setPn
(
info
.
getPartNumber
());
dto
.
setPosName
(
posName
);
boolean
hasTask
=
hasTask
(
info
.
getBarcode
());
dto
.
setHasTask
(
hasTask
);
reelList
.
add
(
dto
);
}
}
shelfDto
.
setReelList
(
reelList
);
shelfDtos
.
set
(
0
,
shelfDto
);
}
else
if
(
currentLine
.
endsWith
(
"B"
))
{
ShelfDto
shelfDto
=
shelfDtos
.
get
(
1
);
shelfDto
.
setLoc
(
currentLine
);
shelfDto
.
setOrderNo
(
shelfInfo
.
getOrderNo
());
shelfDto
.
setRfid
(
shelfInfo
.
getShelfNo
());
List
<
ShelfReelDto
>
reelList
=
new
ArrayList
<>();
Map
<
String
,
ShelfLocInfo
>
shelfLocInfoMap
=
shelfInfo
.
getShelfLocInfoMap
();
if
(
shelfLocInfoMap
!=
null
&&
!
shelfLocInfoMap
.
isEmpty
()){
for
(
ShelfLocInfo
info
:
shelfLocInfoMap
.
values
())
{
// currentLine = currentLine.replaceAll("_A", "").replaceAll("_B", "");
String
posName
=
cid
+
"_B_"
+
info
.
getLoc
();
ShelfReelDto
dto
=
new
ShelfReelDto
();
dto
.
setRi
(
info
.
getBarcode
());
dto
.
setPn
(
info
.
getPartNumber
());
dto
.
setPosName
(
posName
);
boolean
hasTask
=
hasTask
(
info
.
getBarcode
());
dto
.
setHasTask
(
hasTask
);
reelList
.
add
(
dto
);
}
}
shelfDto
.
setReelList
(
reelList
);
shelfDtos
.
set
(
1
,
shelfDto
);
}
}
}
}
}
}
return
shelfDtos
;
}
@ApiOperation
(
"扫码灭灯"
)
@PostMapping
(
value
=
"/rest/gree/light/lightOff"
)
@ResponseBody
@AnonymousAccess
public
ResultBean
lightOff
(
@RequestBody
Map
<
String
,
String
>
mapValues
,
HttpServletRequest
request
)
{
String
code
=
mapValues
.
get
(
"code"
);
Barcode
barcode
=
codeResolve
.
resolveOneValideBarcode
(
code
);
if
(
barcode
==
null
)
{
log
.
info
(
"codeLed 未找到有效条码["
+
code
+
"]"
);
return
ResultBean
.
newErrorResult
(
99
,
"smfcore.error.barcode.invalid"
,
"未找到有效条码"
);
}
String
reelId
=
barcode
.
getBarcode
();
log
.
info
(
"人工输入灭灯指令,reelId为"
+
reelId
);
//根据reelId获取到对应的料架和库位号,进行灭灯
ShelfLocInfo
info
=
shelfInfoUtil
.
getShelfLocByBarcode
(
reelId
);
if
(
info
!=
null
)
{
String
shelfNo
=
info
.
getShelfNo
();
String
loc
=
info
.
getLoc
();
shelfInfoUtil
.
removeByShelfNoAndBarcode
(
shelfNo
,
reelId
);
}
//判断有没有对应的任务,直接完成,发送灭灯指令
DataLog
dataLog
=
null
;
List
<
DataLog
>
allTasks
=
taskService
.
getAllTasks
();
for
(
DataLog
task
:
allTasks
)
{
if
(
task
.
isCheckOutTask
()
&&
!
task
.
isCancel
()
&&
!
task
.
isFinished
())
{
if
(
task
.
getBarcode
().
equals
(
reelId
))
{
dataLog
=
task
;
break
;
}
}
}
if
(
dataLog
!=
null
)
{
dataLog
.
setStatus
(
OP_STATUS
.
FINISHED
.
name
());
taskService
.
moveTaskToFinished
(
dataLog
);
taskService
.
updateFinishedTask
(
dataLog
);
//同时灭灯
DevicesStatusUtil
.
addOp
(
dataLog
.
getCid
(),
"close"
,
dataLog
.
getPosName
()
+
"="
);
}
return
ResultBean
.
newOkResult
(
""
);
}
private
boolean
hasTask
(
String
barcode
)
{
List
<
DataLog
>
allTasks
=
taskService
.
getAllTasks
();
for
(
DataLog
dataLog
:
allTasks
)
{
if
(
dataLog
.
isCheckOutTask
()
&&
(
dataLog
.
isExecuting
()
||
dataLog
.
isWait
()))
{
if
(
barcode
.
equals
(
dataLog
.
getBarcode
())){
return
true
;
}
}
}
return
false
;
}
private
List
<
StorageDto
>
updateDtos
(
List
<
StorageDto
>
dtoList
){
for
(
int
i
=
0
;
i
<
dtoList
.
size
();
i
++)
{
String
groupId
=
""
;
if
(
dtoList
.
get
(
i
).
getGroupId
()
!=
null
&&
(!
dtoList
.
get
(
i
).
getGroupId
().
isEmpty
()))
{
groupId
=
dtoList
.
get
(
i
).
getGroupId
();
}
Group
group
=
groupManager
.
get
(
groupId
);
if
(
group
!=
null
)
{
dtoList
.
get
(
i
).
setGroupName
(
group
.
getGroupName
());
}
else
{
//此料仓未分组
dtoList
.
get
(
i
).
setGroupName
(
""
);
if
(!
dtoList
.
get
(
i
).
getGroupId
().
equals
(
""
))
{
storageManager
.
updateStorageGroup
(
dtoList
.
get
(
i
).
getId
(),
""
);
log
.
info
(
"料仓["
+
dtoList
.
get
(
i
).
getId
()
+
"]["
+
dtoList
.
get
(
i
).
getName
()
+
"]的组不存在,修改组为空"
);
}
}
//获取设备状态,设置状态和当前任务信息
StatusBean
bean
=
DevicesStatusUtil
.
getStatusBean
(
dtoList
.
get
(
i
).
getCid
());
if
(
bean
!=
null
&&
bean
.
getBoxStatus
()
!=
null
)
{
dtoList
.
get
(
i
).
setClientIp
(
bean
.
getClientIp
());
}
}
return
dtoList
;
}
}
src/main/java/com/neotel/smfcore/custom/zhongche1568/controller/ZhongCheAgvController.java
查看文件 @
d46c541
...
@@ -14,9 +14,7 @@ import com.neotel.smfcore.security.annotation.AnonymousAccess;
...
@@ -14,9 +14,7 @@ import com.neotel.smfcore.security.annotation.AnonymousAccess;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.ResponseBody
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequest
;
...
@@ -57,12 +55,12 @@ public class ZhongCheAgvController {
...
@@ -57,12 +55,12 @@ public class ZhongCheAgvController {
line
=
line
.
substring
(
0
,
line
.
lastIndexOf
(
"-"
));
line
=
line
.
substring
(
0
,
line
.
lastIndexOf
(
"-"
));
}
}
//判断是否还有任务
//判断是否还有任务
/*
boolean hasLastShelf = hasLastShelf(shelfInfo.getOrderNo());
boolean
hasLastShelf
=
hasLastShelf
(
shelfInfo
.
getOrderNo
());
try
{
try
{
zhongcheApi
.
shelfFullNotification
(
shelfInfo
,
hasLastShelf
);
zhongcheApi
.
shelfFullNotification
(
shelfInfo
,
hasLastShelf
);
}
catch
(
ValidateException
e
){
}
catch
(
ValidateException
e
){
return ResultBean.newErrorResult(-1,e.getMsgKey(),e.getMessage(),e.getMsgParam());
//
return ResultBean.newErrorResult(-1,e.getMsgKey(),e.getMessage(),e.getMsgParam());
}
*/
}
log
.
info
(
"getShelfTargetLoc 料架 ,rfid=["
+
rfid
+
"],目标位置:["
+
line
+
"]"
);
log
.
info
(
"getShelfTargetLoc 料架 ,rfid=["
+
rfid
+
"],目标位置:["
+
line
+
"]"
);
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论