Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 1f4db1e4
由
LN
编写于
2024-08-07 13:11:55 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
增加SMD_MIMO_G3类型
1 个父辈
ab29875c
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
256 行增加
和
1 行删除
src/main/java/com/neotel/smfcore/core/device/handler/impl/MimoG3BoxHandler.java
src/main/java/com/neotel/smfcore/core/selfAudit/rest/SelfAuditDeviceController.java
src/main/java/com/neotel/smfcore/core/storage/enums/DeviceType.java
src/main/java/com/neotel/smfcore/core/device/handler/impl/MimoG3BoxHandler.java
0 → 100644
查看文件 @
1f4db1e
package
com
.
neotel
.
smfcore
.
core
.
device
.
handler
.
impl
;
import
com.google.common.base.Strings
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.utils.Constants
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.device.bean.BoxStatusBean
;
import
com.neotel.smfcore.core.device.bean.StatusBean
;
import
com.neotel.smfcore.core.device.enums.BOX_STATUS
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.core.device.enums.OP_STATUS
;
import
com.neotel.smfcore.core.storage.enums.DeviceType
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
com.neotel.smfcore.core.system.util.DevicesStatusUtil
;
import
com.neotel.smfcore.custom.djk20388.util.AgvDataUtil
;
import
io.swagger.annotations.Api
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Service
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.Collection
;
import
java.util.Map
;
@Api
(
tags
=
"MIMOG3: 批量料仓(竖屏界面)增加压力传感器,灯带"
)
@Service
@Slf4j
public
class
MimoG3BoxHandler
extends
BaseDeviceHandler
{
@Override
public
StatusBean
handleClientRequest
(
StatusBean
statusBean
,
HttpServletRequest
request
)
{
String
cid
=
statusBean
.
getCid
();
Storage
storage
=
dataCache
.
getStorage
(
cid
);
if
(
storage
==
null
)
{
log
.
error
(
"料仓cid: ["
+
cid
+
"]不存在"
);
return
null
;
}
statusBean
.
setClientIp
(
request
.
getRemoteHost
());
handleMsg
(
statusBean
);
// if(ObjectUtil.isNotEmpty(statusBean.getMsg())){
// log.info("cid["+cid+"],msgCode["+statusBean.getMsgCode()+"],msg["+statusBean.getMsg()+"]");
// }
statusBean
=
saveAlarmAndHumidity
(
statusBean
);
statusBean
=
handleInOutFinished
(
statusBean
);
StatusBean
humidityResult
=
handleHumidity
(
statusBean
);
statusBean
=
handleSelfAudit
(
statusBean
);
if
(
humidityResult
!=
null
)
{
return
humidityResult
;
}
if
(
statusBean
.
getOp
()
==
OP
.
PUT_IN
)
{
log
.
debug
(
"入库:"
+
statusBean
.
toString
());
statusBean
=
putInLine
(
storage
,
statusBean
);
}
else
{
//先查找紧急出库的物料
StatusBean
outSingleTaskResult
=
outSingleOutTask
(
storage
,
statusBean
);
if
(
outSingleTaskResult
!=
null
){
statusBean
=
outSingleTaskResult
;
}
else
{
//查看是否有要出库的操作
statusBean
=
taskService
.
checkOut
(
storage
,
statusBean
);
}
}
//获取操作
Map
<
String
,
String
>
opMap
=
DevicesStatusUtil
.
getAndRemoveOp
(
cid
);
statusBean
.
putOp
(
opMap
);
//agv附加操作
Map
<
String
,
String
>
agvToMimoOpMap
=
AgvDataUtil
.
getAndRemoveToMimoOp
(
cid
);
statusBean
.
putOp
(
agvToMimoOpMap
);
return
statusBean
;
}
@Override
protected
StatusBean
handleInOutFinished
(
StatusBean
statusBean
)
{
Map
<
String
,
BoxStatusBean
>
statusOfBoxes
=
statusBean
.
getBoxStatus
();
if
(
statusOfBoxes
!=
null
)
{
for
(
BoxStatusBean
boxStatus
:
statusOfBoxes
.
values
())
{
try
{
//出库入库完成处理
int
status
=
boxStatus
.
getStatus
();
String
posName
=
boxStatus
.
getPosId
();
String
barcode
=
boxStatus
.
getBarcode
();
int
executeTime
=
boxStatus
.
getExecuteTime
();
if
((!
Strings
.
isNullOrEmpty
(
posName
))
||
(!
Strings
.
isNullOrEmpty
(
barcode
)))
{
//客户端发一次完成之后,会发空的 posName,不需要处理
if
(
BOX_STATUS
.
IN_FINISHED
==
status
)
{
//入仓完成
finishedPutIn
(
statusBean
.
getCid
(),
posName
,
barcode
,
executeTime
);
}
else
if
(
BOX_STATUS
.
IN_FAILED
==
status
)
{
//入库失败
//暂不处理
}
else
if
(
BOX_STATUS
.
OUT_FINISHED
==
status
)
{
//出仓完成
finishedOutPos
(
statusBean
.
getCid
(),
posName
,
barcode
,
executeTime
,
OP_STATUS
.
OUT_BOX
);
}
else
if
(
BOX_STATUS
.
OUT_END
==
status
)
{
//出库完成(放到仓门口
endOutTask
(
statusBean
.
getCid
(),
posName
,
barcode
);
}
}
}
catch
(
ValidateException
e
)
{
log
.
error
(
"更新状态时出错"
+
e
.
getMessage
());
}
}
}
return
statusBean
;
}
/**
* 出库紧急物料
*/
public
StatusBean
outSingleOutTask
(
Storage
storage
,
StatusBean
statusBean
)
{
try
{
//准备更新暂停出入库
if
(
dataCache
.
getCache
(
Constants
.
CACHE_StopOut
))
{
return
statusBean
;
}
String
cid
=
storage
.
getCid
();
//紧急出库任务不论是否有入库任务都发到客户端,由客户端在入库间隙进行出库
Collection
<
DataLog
>
queueTasks
=
taskService
.
getQueueTasks
();
int
excuttingOutTaskNum
=
0
;
DataLog
singleOutTask
=
null
;
for
(
DataLog
queueTask
:
queueTasks
)
{
if
(
queueTask
.
isCheckOutTask
()){
if
(
cid
.
equals
(
queueTask
.
getCid
()))
{
if
(
queueTask
.
isExecuting
()){
excuttingOutTaskNum
++;
}
if
(
queueTask
.
isSingleOut
()
&&
queueTask
.
isWait
())
{
//单盘优先出库
if
(
singleOutTask
==
null
||
queueTask
.
getCreateDate
().
before
(
singleOutTask
.
getCreateDate
()))
{
singleOutTask
=
queueTask
;
}
}
}
}
}
//已经有2个出库任务在执行,不再发了
if
(
excuttingOutTaskNum
<
2
){
if
(
singleOutTask
!=
null
)
{
log
.
info
(
"MIMO料仓优先分配紧急出库任务"
+
singleOutTask
.
getBarcode
()
+
"["
+
singleOutTask
.
getPosName
()
+
"]到 "
+
cid
);
singleOutTask
.
setStatus
(
OP_STATUS
.
EXECUTING
.
name
());
taskService
.
updateQueueTask
(
singleOutTask
);
statusBean
.
setOp
(
OP
.
CHECKOUT
);
String
posName
=
singleOutTask
.
getPosName
();
Barcode
codeObj
=
barcodeManager
.
findByBarcode
(
singleOutTask
.
getBarcode
());
int
plateW
=
0
;
int
plateH
=
0
;
if
(
codeObj
!=
null
)
{
plateW
=
codeObj
.
getPlateSize
();
plateH
=
codeObj
.
getHeight
();
}
else
{
log
.
warn
(
"MIMO紧急出库无料仓位"
+
storage
.
getName
()
+
"["
+
posName
+
"]"
);
StoragePos
pos
=
storagePosManager
.
getByPosName
(
posName
);
plateW
=
pos
.
getW
();
plateH
=
pos
.
getH
();
}
statusBean
.
addPosInfo
(
singleOutTask
.
getBarcode
(),
posName
,
plateW
,
plateH
,
true
);
log
.
info
(
"出库紧急物料"
+
storage
.
getName
()
+
"["
+
posName
+
"]物料["
+
singleOutTask
.
getBarcode
()
+
"]"
+
"发送到客户端"
+
cid
);
return
statusBean
;
}
}
}
catch
(
Exception
e
)
{
log
.
error
(
"出库紧急物料出错"
,
e
);
}
return
null
;
}
@Override
public
DeviceType
getDeviceType
()
{
return
DeviceType
.
SMD_MIMO_G2
;
}
}
src/main/java/com/neotel/smfcore/core/selfAudit/rest/SelfAuditDeviceController.java
查看文件 @
1f4db1e
...
@@ -298,6 +298,84 @@ public class SelfAuditDeviceController {
...
@@ -298,6 +298,84 @@ public class SelfAuditDeviceController {
return
ResultBean
.
newErrorResult
(
99
,
"smfcore.selfAudit.posNotFind"
,
"未找到库位[{0}]的盘点信息"
);
return
ResultBean
.
newErrorResult
(
99
,
"smfcore.selfAudit.posNotFind"
,
"未找到库位[{0}]的盘点信息"
);
}
}
@ApiOperation
(
"盘点: MIMOG3 自动盘点完成,有料时回传原条码,没料时实际条码为空 "
)
@PostMapping
(
value
=
"/posValidationEnd"
)
@ResponseBody
@AnonymousAccess
public
ResultBean
posValidationEnd
(
HttpServletRequest
request
)
{
String
posName
=
request
.
getParameter
(
"posName"
);
String
barcode
=
request
.
getParameter
(
"barcode"
);
String
actualBarcode
=
request
.
getParameter
(
"actualBarcode"
);
log
.
info
(
"盘点:posSelfAuditEnd:posName=["
+
posName
+
"],barcode=["
+
barcode
+
"],actualBarcode=["
+
actualBarcode
+
"]"
);
//发送库位号,库存条码,实时条码
SelfAudit
selfAudit
=
getCurrObj
();
if
(
selfAudit
==
null
)
{
log
.
info
(
"盘点:posSelfAuditEnd:posName=["
+
posName
+
"],barcode=["
+
barcode
+
"],actualBarcode=["
+
actualBarcode
+
"]:未找到盘点信息"
);
return
ResultBean
.
newErrorResult
(
99
,
"smfcore.selfAudit.notFind"
,
"未找到盘点信息"
);
}
List
<
SelfAuditItem
>
items
=
selfAudit
.
getItems
();
List
<
SelfAuditItem
>
newItems
=
new
ArrayList
<>();
boolean
findOk
=
false
;
for
(
SelfAuditItem
item
:
items
)
{
if
(
item
.
getPosName
().
equals
(
posName
))
{
findOk
=
true
;
if
(!
barcode
.
equals
(
item
.
getBarcode
())){
barcode
=
item
.
getBarcode
();
log
.
info
(
"盘点:posSelfAuditEnd:posName=["
+
posName
+
"],纠正 barcode=["
+
item
.
getBarcode
()
+
"]"
);
}
item
.
setActualBarcode
(
actualBarcode
);
//如果异常,改为3,否则改为2
if
(
item
.
getBarcode
().
equals
(
actualBarcode
)){
item
.
setItemStatus
(
2
);
}
else
{
item
.
setItemStatus
(
3
);
}
selfAuditItemManager
.
save
(
item
);
log
.
info
(
" 盘点["
+
selfAudit
.
getBatchNo
()
+
"]库位入库完成:posName["
+
item
.
getPosName
()
+
"]barcode["
+
item
.
getBarcode
()
+
"],actualBarcode=["
+
actualBarcode
+
"],设置状态="
+
item
.
getItemStatus
());
//不需要处理出入库
}
newItems
.
add
(
item
);
}
if
(
findOk
)
{
selfAudit
.
setItems
(
newItems
);
selfAudit
.
setEndItemNum
(
selfAudit
.
getEndItemNum
()+
1
);
if
(
selfAudit
.
getEndItemNum
()>=
selfAudit
.
getTotalItemNum
()){
boolean
hasE
=
false
;
//判断是否有异常
for
(
SelfAuditItem
item
:
newItems
)
{
if
(
item
.
getItemStatus
()==
3
){
hasE
=
true
;
break
;
}
}
if
(
hasE
){
selfAudit
.
setStatus
(
SELFAUDIT_STATUS
.
END
.
name
());
log
.
info
(
" 盘点["
+
selfAudit
.
getBatchNo
()
+
"] 已完成库位数["
+
selfAudit
.
getEndItemNum
()
+
"]总库位数["
+
selfAudit
.
getTotalItemNum
()
+
"],存在异常库位,更改盘点状态为完成,等待处理异常库位"
);
}
else
{
selfAudit
.
setStatus
(
SELFAUDIT_STATUS
.
FINISHED
.
name
());
log
.
info
(
" 盘点["
+
selfAudit
.
getBatchNo
()
+
"] 已完成库位数["
+
selfAudit
.
getEndItemNum
()
+
"]总库位数["
+
selfAudit
.
getTotalItemNum
()
+
"],更改盘点状态为已结束"
);
}
}
// selfAuditManager.save(selfAudit);
selfAuditUtil
.
updateShelfAudit
(
selfAudit
);
return
ResultBean
.
newOkResult
(
"ok"
);
}
log
.
info
(
"盘点:posSelfAuditEnd:posName=["
+
posName
+
"],barcode=["
+
barcode
+
"],actualBarcode=["
+
actualBarcode
+
"]:未找到库位的盘点信息"
);
return
ResultBean
.
newErrorResult
(
99
,
"smfcore.selfAudit.posNotFind"
,
"未找到库位[{0}]的盘点信息"
);
}
private
Barcode
resolveOneValideBarcode
(
String
paramName
,
String
code
){
private
Barcode
resolveOneValideBarcode
(
String
paramName
,
String
code
){
//物料不一致 优先实际条码入库
//物料不一致 优先实际条码入库
Barcode
barcodeIn
=
null
;
Barcode
barcodeIn
=
null
;
...
...
src/main/java/com/neotel/smfcore/core/storage/enums/DeviceType.java
查看文件 @
1f4db1e
...
@@ -149,6 +149,11 @@ public enum DeviceType {
...
@@ -149,6 +149,11 @@ public enum DeviceType {
* 24 推荐库位钢网料架 NLSM
* 24 推荐库位钢网料架 NLSM
*/
*/
NLSM
(
"storage.type.nlsm"
),
NLSM
(
"storage.type.nlsm"
),
/**
* 25 SMD_MIMO_G3
*/
SMD_MIMO_G3
(
"storage.type.smdMimoG3"
),
;
;
private
String
key
;
private
String
key
;
...
@@ -170,6 +175,6 @@ public enum DeviceType {
...
@@ -170,6 +175,6 @@ public enum DeviceType {
}
}
public
static
List
<
DeviceType
>
availableTypeList
(){
public
static
List
<
DeviceType
>
availableTypeList
(){
return
Lists
.
newArrayList
(
AUTO
,
LINE
,
BATCH
,
SOLDERPASTE
,
VERTICALBOX
,
SMD_XL
,
SMD_DUO
,
SMD_XLC
,
SMD_XLR
,
VIRTUAL
,
NL
,
NLP
,
NLM
,
NLL
,
NLS
,
NLSM
,
SMDBOX_THIRD
,
SMD_MIMO_G2
);
return
Lists
.
newArrayList
(
AUTO
,
LINE
,
BATCH
,
SOLDERPASTE
,
VERTICALBOX
,
SMD_XL
,
SMD_DUO
,
SMD_XLC
,
SMD_XLR
,
VIRTUAL
,
NL
,
NLP
,
NLM
,
NLL
,
NLS
,
NLSM
,
SMDBOX_THIRD
,
SMD_MIMO_G2
,
SMD_MIMO_G3
);
}
}
}
}
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论