Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 24c875a9
由
zshaohui
编写于
2023-04-12 09:40:03 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
1.增加xlr处理类
2.出入库统计新接口 3.每小时存储出入库数量
1 个父辈
e27b628a
隐藏空白字符变更
内嵌
并排
正在显示
16 个修改的文件
包含
574 行增加
和
7 行删除
src/main/java/com/neotel/smfcore/common/init/DataInitManager.java
src/main/java/com/neotel/smfcore/core/device/bean/BoxStatusBean.java
src/main/java/com/neotel/smfcore/core/device/handler/impl/BaseDeviceHandler.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/device/util/DataCache.java
src/main/java/com/neotel/smfcore/core/inout/service/dao/IInOutDataDao.java
src/main/java/com/neotel/smfcore/core/inout/service/dao/impl/InOutDataDaoImpl.java
src/main/java/com/neotel/smfcore/core/inout/service/manager/IInOutDataManager.java
src/main/java/com/neotel/smfcore/core/inout/service/manager/impl/InOutDataManagerImpl.java
src/main/java/com/neotel/smfcore/core/inout/service/po/InOutData.java
src/main/java/com/neotel/smfcore/core/report/ReportController.java
src/main/java/com/neotel/smfcore/core/report/bean/dto/InOutDataDto.java
src/main/java/com/neotel/smfcore/core/report/rest/query/ReportExtQuery.java
src/main/java/com/neotel/smfcore/core/report/rest/query/ReportQuery.java
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
src/main/java/com/neotel/smfcore/common/init/DataInitManager.java
查看文件 @
24c875a
...
...
@@ -213,6 +213,7 @@ public class DataInitManager {
Menu
pMenuReport
=
Menu
.
CreatePMenu
(
"报表"
,
7
,
"report"
,
2
,
"inOutData"
,
null
);
addNewFunctionMenu
(
71
,
pMenuReport
,
"inOutData"
,
"出入库"
,
"inOutData"
,
"neolight/inOutData/index"
,
"outPut"
,
functionMenuMap
);
addNewFunctionMenu
(
72
,
pMenuReport
,
"inventory"
,
"库存"
,
"inventory"
,
"neolight/inventory/index"
,
"inventory"
,
functionMenuMap
);
addNewFunctionMenu
(
73
,
pMenuReport
,
"inOutDataCount"
,
"出入库"
,
"inOutDataCount"
,
"neolight/inOutDataCount/index"
,
"outPut"
,
functionMenuMap
);
//可观测性:物料追踪
Menu
guanceMenu
=
Menu
.
CreatePMenu
(
"可观测性"
,
8
,
"observability"
,
2
,
"scanKey"
,
null
);
...
...
src/main/java/com/neotel/smfcore/core/device/bean/BoxStatusBean.java
查看文件 @
24c875a
...
...
@@ -137,4 +137,11 @@ public class BoxStatusBean {
}
return
-
1
;
}
/**
* 获取客户端发送上来的出入库完成的条码信息
*/
public
String
getBarcode
(){
return
data
.
get
(
"barcode"
);
}
}
src/main/java/com/neotel/smfcore/core/device/handler/impl/BaseDeviceHandler.java
查看文件 @
24c875a
...
...
@@ -24,6 +24,8 @@ import com.neotel.smfcore.core.device.enums.OP;
import
com.neotel.smfcore.core.device.enums.OP_STATUS
;
import
com.neotel.smfcore.core.device.handler.IDeviceHandler
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.inout.service.manager.IInOutDataManager
;
import
com.neotel.smfcore.core.inout.service.po.InOutData
;
import
com.neotel.smfcore.core.message.util.DeviceMessageUtil
;
import
com.neotel.smfcore.core.msd.bean.MSDSettiings
;
import
com.neotel.smfcore.core.order.LiteOrderCache
;
...
...
@@ -96,6 +98,9 @@ public class BaseDeviceHandler implements IDeviceHandler {
@Autowired
protected
IComponentManager
componentManager
;
@Autowired
private
IInOutDataManager
inOutDataManager
;
/**
* CID的服务器消息(key 为 cid)
*/
...
...
@@ -928,6 +933,142 @@ public class BaseDeviceHandler implements IDeviceHandler {
return
false
;
}
/**
* 入仓位完成处理
* @param cid
* @param posName
* @param executeTime 执行时间
* @throws ValidateException
*/
protected
void
finishedPutIn
(
String
cid
,
String
posName
,
String
barcode
,
int
executeTime
)
throws
ValidateException
{
DataLog
task
=
taskService
.
findExecutingTask
(
cid
,
posName
,
barcode
);
if
(
task
!=
null
&&
task
.
isPutInTask
())
{
if
(
executeTime
>
0
)
{
task
.
setExecuteTime
(
executeTime
);
updatePosExecuteTime
(
task
.
getPosName
(),
executeTime
);
updateInOutDateExecuteTime
(
task
.
getPosName
(),
executeTime
);
}
log
.
info
(
task
.
getBarcode
()
+
"入仓位["
+
task
.
getPosName
()
+
"]完成,执行时间["
+
executeTime
+
"]秒"
);
DataLog
cancelTask
=
taskService
.
findFinishedPutInTask
(
cid
,
task
.
getPosName
(),
task
.
getBarcode
());
if
(
cancelTask
!=
null
&&
cancelTask
.
isCancel
())
{
//将相同库位已经取消的任务从完成队列里删除
taskService
.
removeFinishedTask
(
cancelTask
);
log
.
info
(
"从已完成的任务列表中删除之前取消的任务:"
+
cancelTask
.
getPosName
()
+
" ReelId:"
+
cancelTask
.
getBarcode
());
}
updatePutInData
(
task
);
ReelLockPosUtil
.
removeReelLockPosInfo
(
task
.
getBarcode
());
}
else
{
//从已完成列表中找,如果还找不到就忽略
task
=
taskService
.
findFinishedPutInTask
(
cid
,
posName
,
barcode
);
if
(
task
!=
null
&&
task
.
isPutInTask
())
{
if
(
task
.
isCancel
())
{
//被取消的任务,客户端发完成信号过来,修改取消状态为已完成
if
(
executeTime
>
0
)
{
task
.
setExecuteTime
(
executeTime
);
updatePosExecuteTime
(
task
.
getPosName
(),
executeTime
);
updateInOutDateExecuteTime
(
task
.
getPosName
(),
executeTime
);
}
log
.
info
(
task
.
getBarcode
()
+
"入仓位["
+
task
.
getPosName
()
+
"]完成,但任务已被取消,修改为完成,执行时间["
+
executeTime
+
"]秒"
);
updatePutInData
(
task
);
}
}
else
{
log
.
error
(
cid
+
"入仓位["
+
posName
+
"]ReelId["
+
barcode
+
"]完成时任务不存在"
);
}
}
}
/**
* 出仓位完成处理
* @param cid
* @param posName
* @param executeTime 执行时间
* @throws ValidateException
*/
protected
void
finishedOutPos
(
String
cid
,
String
posName
,
String
barcode
,
int
executeTime
,
OP_STATUS
outBoxStatus
)
throws
ValidateException
{
DataLog
task
=
taskService
.
findExecutingTask
(
cid
,
posName
,
barcode
);
if
(
task
!=
null
&&
task
.
isCheckOutTask
())
{
//判断状态是否重复推送
log
.
info
(
task
.
getBarcode
()+
"状态为:"
+
task
.
getStatus
()+
",重新更改状态:"
+
outBoxStatus
.
name
());
if
(
outBoxStatus
.
name
().
equals
(
task
.
getStatus
())){
log
.
info
(
"状态一致,不处理,返回"
);
return
;
}
if
(
executeTime
>
0
)
{
task
.
setExecuteTime
(
executeTime
);
updateInOutDateExecuteTime
(
task
.
getPosName
(),
executeTime
);
}
log
.
info
(
task
.
getBarcode
()
+
"出仓位["
+
task
.
getPosName
()
+
"]完成,执行时间["
+
executeTime
+
"]秒"
);
DataLog
cancelTask
=
taskService
.
findFinishedOutTask
(
cid
,
task
.
getPosName
(),
task
.
getBarcode
());
if
(
cancelTask
!=
null
&&
cancelTask
.
isCancel
())
{
//将相同库位已经取消的任务从完成队列里删除
taskService
.
removeFinishedTask
(
cancelTask
);
log
.
info
(
"从已完成的任务列表中删除之前取消的任务:"
+
cancelTask
.
getPosName
()
+
" ReelId:"
+
cancelTask
.
getBarcode
());
}
updateCheckoutData
(
task
,
outBoxStatus
);
}
else
{
//log.error(operationKey + "触发仓位完成时,操作队列中不存在");
//从已完成列表中找,如果还找不到就忽略
task
=
taskService
.
findFinishedOutTask
(
cid
,
posName
,
barcode
);
if
(
task
!=
null
&&
task
.
isCheckOutTask
())
{
//判断状态是否重复推送
log
.
info
(
task
.
getBarcode
()+
"状态为:"
+
task
.
getStatus
()+
",重新更改状态:"
+
outBoxStatus
.
name
());
if
(
outBoxStatus
.
name
().
equals
(
task
.
getStatus
())){
log
.
info
(
"状态一致,不处理,返回"
);
return
;
}
if
(
task
.
isCancel
())
{
//被取消的任务,客户端发完成信号过来,修改取消状态为已完成
if
(
executeTime
>
0
)
{
task
.
setExecuteTime
(
executeTime
);
updateInOutDateExecuteTime
(
task
.
getPosName
(),
executeTime
);
}
log
.
info
(
task
.
getBarcode
()
+
"出仓位["
+
task
.
getPosName
()
+
"]完成,但任务已被取消,修改为完成,执行时间["
+
executeTime
+
"]秒"
);
updateCheckoutData
(
task
,
outBoxStatus
);
}
}
else
if
(
ObjectUtil
.
isNotEmpty
(
posName
))
{
StoragePos
storagePos
=
storagePosManager
.
getByPosName
(
posName
);
if
(
storagePos
!=
null
&&
storagePos
.
isUsed
())
{
barcode
=
storagePos
.
getBarcode
().
getBarcode
();
//查找库位是否为空,如果库位有料,调用清理手动出库的方法清理库存
if
(
ObjectUtil
.
isNotEmpty
(
barcode
))
{
log
.
info
(
cid
+
"出仓位["
+
posName
+
"]完成时任务不存在,清理库位中的库存["
+
barcode
+
"]"
);
taskService
.
addTaskToFinished
(
storagePos
,
null
,
cid
+
"-clear"
);
}
else
{
log
.
info
(
cid
+
"出仓位["
+
posName
+
"]完成时任务不存在,清理库位失败,条码为空"
);
}
}
else
{
log
.
warn
(
cid
+
"出仓位["
+
posName
+
"]完成时任务不存在"
);
}
}
else
if
(
ObjectUtil
.
isNotEmpty
(
barcode
)){
StoragePos
storagePos
=
storagePosManager
.
getByBarcode
(
barcode
);
if
(
storagePos
!=
null
&&
storagePos
.
isUsed
())
{
posName
=
storagePos
.
getPosName
();
//查找库位是否为空,如果库位有料,调用清理手动出库的方法清理库存
log
.
info
(
cid
+
"出仓位条码["
+
barcode
+
"]完成时任务不存在,根据条码["
+
barcode
+
"]找到库位["
+
posName
+
"],清理库位中的库存 "
);
taskService
.
addTaskToFinished
(
storagePos
,
null
,
cid
+
"-clear"
);
}
else
{
log
.
warn
(
cid
+
"出仓位条码["
+
barcode
+
"]完成时任务不存在"
);
}
}
else
{
log
.
error
(
cid
+
"出仓位["
+
posName
+
"]ReelId["
+
barcode
+
"]完成时任务不存在"
);
}
}
}
private
void
updateInOutDateExecuteTime
(
String
posName
,
int
executeTime
)
{
StoragePos
storagePos
=
storagePosManager
.
getByPosName
(
posName
);
if
(
storagePos
!=
null
){
Storage
storage
=
dataCache
.
getStorageById
(
storagePos
.
getStorageId
());
InOutData
inOutData
=
dataCache
.
getLastSaveInOutData
(
storage
.
getCid
(),
storage
.
getId
());
inOutData
.
setExecuteTime
(
inOutData
.
getExecuteTime
()
+
executeTime
);
inOutDataManager
.
save
(
inOutData
);
}
}
@Override
public
DeviceType
getDeviceType
()
{
return
DeviceType
.
DEFAULT
;
...
...
src/main/java/com/neotel/smfcore/core/device/handler/impl/XLRBoxHandler.java
0 → 100644
查看文件 @
24c875a
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.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.system.service.po.DataLog
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Service
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.Map
;
/**
* XLR料仓
*/
@Service
@Slf4j
public
class
XLRBoxHandler
extends
BaseDeviceHandler
{
@Override
public
StatusBean
handleClientRequest
(
StatusBean
statusBean
,
HttpServletRequest
request
)
{
statusBean
.
setClientIp
(
request
.
getRemoteHost
());
String
cid
=
statusBean
.
getCid
();
Storage
storage
=
dataCache
.
getStorage
(
cid
);
if
(
storage
==
null
)
{
log
.
error
(
"料仓cid: ["
+
cid
+
"]不存在"
);
return
null
;
}
handleMsg
(
statusBean
);
statusBean
=
saveAlarmAndHumidity
(
statusBean
);
statusBean
=
handleDeviceStatus
(
statusBean
);
StatusBean
humidityResult
=
handleHumidity
(
statusBean
);
if
(
humidityResult
!=
null
)
{
return
humidityResult
;
}
if
(
statusBean
.
getOp
()
==
OP
.
PUT_IN
)
{
log
.
debug
(
"入库:"
+
statusBean
.
toString
());
statusBean
=
putInLine
(
storage
,
statusBean
);
}
else
{
//查看是否有要出库的操作
statusBean
=
taskService
.
checkOut
(
storage
,
statusBean
);
}
return
statusBean
;
}
protected
StatusBean
handleDeviceStatus
(
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
))
{
//客户端发一次完成之后,会发空的 posName,不需要处理
if
(
BOX_STATUS
.
IN_FINISHED
==
status
)
{
//入仓完成
finishedPutIn
(
statusBean
.
getCid
(),
posName
,
barcode
,
executeTime
);
}
else
if
(
BOX_STATUS
.
OUT_FINISHED
==
status
)
{
//出仓完成
finishedOutPos
(
statusBean
.
getCid
(),
posName
,
barcode
,
executeTime
,
OP_STATUS
.
OUT_BOX
);
}
else
if
(
BOX_STATUS
.
OUT_END
==
status
)
{
//出库完成(放到仓门口
log
.
info
(
statusBean
.
getCid
()
+
"将物料从库位["
+
posName
+
"]出库到门口/料串完成"
);
reelOnShelf
(
statusBean
.
getCid
(),
posName
);
}
}
}
catch
(
ValidateException
e
)
{
log
.
error
(
"更新状态时出错"
+
e
.
getMessage
());
}
}
}
return
statusBean
;
}
protected
void
reelOnShelf
(
String
cid
,
String
posName
){
DataLog
task
=
taskService
.
findFinishedOutTask
(
cid
,
posName
);
if
(
task
!=
null
){
task
.
setStatus
(
OP_STATUS
.
FINISHED
.
name
());
taskService
.
updateFinishedTask
(
task
);
}
}
@Override
public
DeviceType
getDeviceType
()
{
return
DeviceType
.
SMD_XLR
;
}
}
src/main/java/com/neotel/smfcore/core/device/rest/DeviceController.java
查看文件 @
24c875a
...
...
@@ -509,11 +509,12 @@ public class DeviceController {
String
hSerial
=
request
.
getParameter
(
"hSerial"
);
int
outTaskCount
=
0
;
if
(!
Strings
.
isNullOrEmpty
(
cid
)){
Collection
<
DataLog
>
queueTasks
=
taskService
.
get
QueueTasks
(
cid
);
Collection
<
DataLog
>
queueTasks
=
taskService
.
get
AllTasksByCid
(
cid
);
if
(!
Strings
.
isNullOrEmpty
(
hSerial
)){
for
(
DataLog
queueTask
:
queueTasks
)
{
if
(
queueTask
.
isCheckOutTask
()){
if
(
queueTask
.
getSourceName
().
equals
(
hSerial
)){
if
(
queueTask
.
isCheckOutTask
()
&&
!
queueTask
.
isFinished
()){
String
sourceName
=
queueTask
.
getSourceName
();
if
(
sourceName
!=
null
&&
queueTask
.
getSourceName
().
equals
(
hSerial
)){
//单号相同任务数量+1
outTaskCount
=
outTaskCount
+
1
;
}
...
...
@@ -521,7 +522,7 @@ public class DeviceController {
}
}
else
{
for
(
DataLog
queueTask
:
queueTasks
)
{
if
(
queueTask
.
isCheckOutTask
())
{
if
(
queueTask
.
isCheckOutTask
()
&&
!
queueTask
.
isFinished
()
)
{
outTaskCount
=
outTaskCount
+
1
;
}
}
...
...
src/main/java/com/neotel/smfcore/core/device/util/DataCache.java
查看文件 @
24c875a
...
...
@@ -625,7 +625,7 @@ public class DataCache {
inOutDataManager
.
save
(
inOutData
);
}
p
rivate
InOutData
getLastSaveInOutData
(
String
cid
,
String
storageId
)
{
p
ublic
InOutData
getLastSaveInOutData
(
String
cid
,
String
storageId
)
{
InOutData
inOutData
=
inOutDataManager
.
findOneByCidAndStorageId
(
cid
,
storageId
);
if
(
inOutData
==
null
)
{
inOutData
=
new
InOutData
();
...
...
src/main/java/com/neotel/smfcore/core/inout/service/dao/IInOutDataDao.java
0 → 100644
查看文件 @
24c875a
package
com
.
neotel
.
smfcore
.
core
.
inout
.
service
.
dao
;
import
com.neotel.smfcore.common.base.IBaseDao
;
public
interface
IInOutDataDao
extends
IBaseDao
{
}
src/main/java/com/neotel/smfcore/core/inout/service/dao/impl/InOutDataDaoImpl.java
0 → 100644
查看文件 @
24c875a
package
com
.
neotel
.
smfcore
.
core
.
inout
.
service
.
dao
.
impl
;
import
com.neotel.smfcore.common.base.AbstractBaseDao
;
import
com.neotel.smfcore.core.inout.service.dao.IInOutDataDao
;
import
com.neotel.smfcore.core.inout.service.po.InOutData
;
import
org.springframework.stereotype.Service
;
@Service
public
class
InOutDataDaoImpl
extends
AbstractBaseDao
implements
IInOutDataDao
{
@Override
public
Class
getEntityClass
()
{
return
InOutData
.
class
;
}
}
src/main/java/com/neotel/smfcore/core/inout/service/manager/IInOutDataManager.java
0 → 100644
查看文件 @
24c875a
package
com
.
neotel
.
smfcore
.
core
.
inout
.
service
.
manager
;
import
com.neotel.smfcore.common.base.IBaseManager
;
import
com.neotel.smfcore.core.inout.service.po.InOutData
;
import
org.springframework.data.mongodb.core.query.Query
;
import
java.util.Date
;
import
java.util.List
;
public
interface
IInOutDataManager
extends
IBaseManager
<
InOutData
>
{
List
<
InOutData
>
findByDate
(
Date
startDate
,
Date
endDate
,
List
<
String
>
storageIdList
);
InOutData
findOne
(
Query
query
);
InOutData
findOneByCidAndStorageId
(
String
cid
,
String
storageId
);
}
src/main/java/com/neotel/smfcore/core/inout/service/manager/impl/InOutDataManagerImpl.java
0 → 100644
查看文件 @
24c875a
package
com
.
neotel
.
smfcore
.
core
.
inout
.
service
.
manager
.
impl
;
import
com.neotel.smfcore.common.bean.PageData
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.core.inout.service.dao.IInOutDataDao
;
import
com.neotel.smfcore.core.inout.service.manager.IInOutDataManager
;
import
com.neotel.smfcore.core.inout.service.po.InOutData
;
import
com.neotel.smfcore.core.report.rest.dto.InoutDataDto
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.domain.Sort
;
import
org.springframework.data.mongodb.core.query.Criteria
;
import
org.springframework.data.mongodb.core.query.Query
;
import
org.springframework.stereotype.Service
;
import
java.util.Date
;
import
java.util.List
;
@Service
public
class
InOutDataManagerImpl
implements
IInOutDataManager
{
@Autowired
private
IInOutDataDao
inOutDataDao
;
@Override
public
InOutData
get
(
String
id
)
{
return
null
;
}
@Override
public
InOutData
save
(
InOutData
object
)
throws
ValidateException
{
return
inOutDataDao
.
save
(
object
);
}
@Override
public
void
delete
(
InOutData
object
)
throws
ValidateException
{
}
@Override
public
PageData
<
InOutData
>
findByPage
(
Query
query
,
Pageable
pageable
)
{
return
null
;
}
@Override
public
List
<
InOutData
>
findByQuery
(
Query
query
)
{
return
null
;
}
@Override
public
List
<
InOutData
>
findByDate
(
Date
startDate
,
Date
endDate
,
List
<
String
>
storageIdList
)
{
Query
q
=
new
Query
();
Criteria
c
=
Criteria
.
where
(
"createDate"
).
gte
(
startDate
).
lt
(
endDate
);
if
(
storageIdList
!=
null
&&
!
storageIdList
.
isEmpty
())
{
c
.
and
(
"storageId"
).
in
(
storageIdList
);
}
Sort
s
=
Sort
.
by
(
Sort
.
Direction
.
ASC
,
"createDate"
);
return
inOutDataDao
.
findByQuery
(
q
.
addCriteria
(
c
).
with
(
s
));
}
@Override
public
InOutData
findOne
(
Query
query
)
{
return
inOutDataDao
.
findOne
(
query
);
}
@Override
public
InOutData
findOneByCidAndStorageId
(
String
cid
,
String
storageId
)
{
Query
query
=
new
Query
(
Criteria
.
where
(
"cid"
).
is
(
cid
).
and
(
"storageId"
).
is
(
storageId
)).
with
(
Sort
.
by
(
Sort
.
Direction
.
DESC
,
"createDate"
));
return
inOutDataDao
.
findOne
(
query
);
}
}
src/main/java/com/neotel/smfcore/core/inout/service/po/InOutData.java
0 → 100644
查看文件 @
24c875a
package
com
.
neotel
.
smfcore
.
core
.
inout
.
service
.
po
;
import
com.neotel.smfcore.common.base.BasePo
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
org.springframework.data.mongodb.core.mapping.Document
;
@Data
@Document
@AllArgsConstructor
@NoArgsConstructor
public
class
InOutData
extends
BasePo
{
/**
* 设备cid
*/
private
String
cid
;
/**
* 设备id
*/
private
String
storageId
;
/**
* 入库数量
*/
private
int
inCount
=
0
;
/**
* 出库数量
*/
private
int
outCount
=
0
;
/**
* 执行时间
*/
private
int
executeTime
=
0
;
}
src/main/java/com/neotel/smfcore/core/report/ReportController.java
查看文件 @
24c875a
package
com
.
neotel
.
smfcore
.
core
.
report
;
import
cn.hutool.core.date.DateTime
;
import
cn.hutool.core.date.DateUnit
;
import
cn.hutool.core.date.DateUtil
;
import
com.neotel.smfcore.common.bean.BetweenData
;
import
com.neotel.smfcore.common.utils.SecurityUtils
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.inout.service.manager.IInOutDataManager
;
import
com.neotel.smfcore.core.inout.service.po.InOutData
;
import
com.neotel.smfcore.core.report.bean.ChartItem
;
import
com.neotel.smfcore.core.report.bean.dto.InOutDataDto
;
import
com.neotel.smfcore.core.report.rest.dto.InoutDataDto
;
import
com.neotel.smfcore.core.report.rest.dto.InventoryBoxDto
;
import
com.neotel.smfcore.core.report.rest.dto.InventoryGroupDto
;
import
com.neotel.smfcore.core.report.rest.mapstruct.ChartItemMapper
;
import
com.neotel.smfcore.core.report.rest.query.ReportExtQuery
;
import
com.neotel.smfcore.core.report.rest.query.ReportQuery
;
import
com.neotel.smfcore.core.storage.bean.UsageItem
;
import
com.neotel.smfcore.core.storage.service.manager.IStorageManager
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.security.annotation.AnonymousAccess
;
import
com.neotel.smfcore.security.service.manager.IGroupManager
;
import
com.neotel.smfcore.security.service.manager.IUserManager
;
import
com.neotel.smfcore.security.service.po.Group
;
...
...
@@ -49,6 +58,9 @@ public class ReportController {
@Autowired
DataCache
dataCache
;
@Autowired
private
IInOutDataManager
inOutDataManager
;
@ApiOperation
(
"获取出入库数据"
)
@GetMapping
(
value
=
"/inOutData"
)
@PreAuthorize
(
"@el.check('inOutData')"
)
...
...
@@ -123,4 +135,66 @@ public class ReportController {
}
return
groupDtos
;
}
@ApiOperation
(
"出入库统计"
)
@RequestMapping
(
"/api/report/getInOutData"
)
@AnonymousAccess
public
InOutDataDto
getInOutData
(
ReportExtQuery
query
)
{
InOutDataDto
dto
=
new
InOutDataDto
();
List
<
String
>
dateStrList
=
new
ArrayList
<>();
List
<
Integer
>
inDataList
=
new
ArrayList
<>();
List
<
Integer
>
outDataList
=
new
ArrayList
<>();
//开始时间与结束时间赋值
String
currentDateStr
=
DateUtil
.
format
(
new
Date
(),
"yyyy-MM-dd HH"
);
Date
startDate
=
DateUtil
.
parse
(
currentDateStr
,
"yyyy-MM-dd HH"
);
Date
endDate
=
DateUtil
.
parse
(
currentDateStr
,
"yyyy-MM-dd HH"
);
BetweenData
<
Date
>
updateDate
=
query
.
getUpdateDate
();
if
(
updateDate
!=
null
&&
updateDate
.
size
()
>
0
)
{
Date
from
=
updateDate
.
getFrom
();
Date
to
=
updateDate
.
getTo
();
if
(
from
!=
null
)
{
startDate
=
from
;
}
if
(
to
!=
null
)
{
endDate
=
to
;
}
}
else
{
endDate
=
DateUtil
.
parse
(
currentDateStr
,
"yyyy-MM-dd"
);
endDate
=
DateUtil
.
offsetDay
(
endDate
,
1
);
startDate
=
DateUtil
.
offsetDay
(
endDate
,
-
7
);
}
//判断相差小时数,是否超过48小时
long
between
=
DateUtil
.
between
(
startDate
,
endDate
,
DateUnit
.
HOUR
);
List
<
InOutData
>
inOutDataList
=
inOutDataManager
.
findByDate
(
startDate
,
endDate
,
query
.
getStorageIdList
());
while
(
startDate
.
getTime
()
<
endDate
.
getTime
())
{
DateTime
nextDayTime
;
if
(
between
>
48
)
{
dateStrList
.
add
(
DateUtil
.
format
(
startDate
,
"MM/dd"
));
nextDayTime
=
DateUtil
.
offsetDay
(
startDate
,
1
);
}
else
{
dateStrList
.
add
(
DateUtil
.
format
(
startDate
,
"MM/dd HH"
));
nextDayTime
=
DateUtil
.
offsetHour
(
startDate
,
1
);
}
int
inCount
=
0
,
outCount
=
0
;
for
(
InOutData
inOutData
:
inOutDataList
)
{
if
(
inOutData
.
getCreateDate
().
getTime
()
>=
startDate
.
getTime
()
&&
inOutData
.
getCreateDate
().
getTime
()
<
nextDayTime
.
getTime
())
{
inCount
=
inCount
+
inOutData
.
getInCount
();
outCount
=
outCount
+
inOutData
.
getOutCount
();
}
}
inDataList
.
add
(
inCount
);
outDataList
.
add
(
outCount
);
if
(
between
>
48
)
{
startDate
=
DateUtil
.
offsetDay
(
startDate
,
1
);
}
else
{
startDate
=
DateUtil
.
offsetHour
(
startDate
,
1
);
}
}
dto
.
setDateStrList
(
dateStrList
);
dto
.
setInDataList
(
inDataList
);
dto
.
setOutDataList
(
outDataList
);
return
dto
;
}
}
src/main/java/com/neotel/smfcore/core/report/bean/dto/InOutDataDto.java
0 → 100644
查看文件 @
24c875a
package
com
.
neotel
.
smfcore
.
core
.
report
.
bean
.
dto
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.util.List
;
@Data
public
class
InOutDataDto
{
@ApiModelProperty
(
"日期集合"
)
private
List
<
String
>
dateStrList
;
@ApiModelProperty
(
"入库数据集合"
)
private
List
<
Integer
>
inDataList
;
@ApiModelProperty
(
"出库数据集合"
)
private
List
<
Integer
>
outDataList
;
}
src/main/java/com/neotel/smfcore/core/report/rest/query/ReportExtQuery.java
0 → 100644
查看文件 @
24c875a
package
com
.
neotel
.
smfcore
.
core
.
report
.
rest
.
query
;
import
com.neotel.smfcore.common.bean.BetweenData
;
import
lombok.Data
;
import
org.springframework.format.annotation.DateTimeFormat
;
import
java.util.Date
;
@Data
public
class
ReportExtQuery
extends
ReportQuery
{
@DateTimeFormat
(
pattern
=
"yyyy-MM-dd HH"
)
private
BetweenData
<
Date
>
updateDate
;
}
src/main/java/com/neotel/smfcore/core/report/rest/query/ReportQuery.java
查看文件 @
24c875a
package
com
.
neotel
.
smfcore
.
core
.
report
.
rest
.
query
;
import
cn.hutool.core.date.DateTime
;
import
com.neotel.smfcore.common.annotation.QueryCondition
;
import
com.neotel.smfcore.common.bean.BetweenData
;
import
lombok.Data
;
import
org.springframework.format.annotation.DateTimeFormat
;
import
java.io.Serializable
;
import
java.util.Date
;
import
java.util.List
;
@Data
public
class
ReportQuery
implements
Serializable
{
@DateTimeFormat
(
pattern
=
"yyyy-MM-dd"
)
private
BetweenData
<
Date
>
updateDate
;
private
String
pn
;
@QueryCondition
(
type
=
QueryCondition
.
Type
.
IN
,
propName
=
"storageId"
)
private
List
<
String
>
storageIdList
;
}
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
查看文件 @
24c875a
...
...
@@ -220,13 +220,14 @@ public class TaskService {
* 获取所有任务
*/
public
List
<
DataLog
>
getAllTasksByCid
(
String
cid
)
{
List
<
DataLog
>
resultTasks
=
new
ArrayList
<>();
List
<
DataLog
>
allTasks
=
getAllTasks
();
for
(
DataLog
task
:
allTasks
)
{
if
(
task
.
getCid
().
equals
(
cid
)){
all
Tasks
.
add
(
task
);
result
Tasks
.
add
(
task
);
}
}
return
all
Tasks
;
return
result
Tasks
;
}
/**
...
...
@@ -990,4 +991,70 @@ public class TaskService {
theFinishedTaskMap
.
put
(
task
.
getId
(),
task
);
tiggerTaskChangeListener
(
task
);
}
public
DataLog
findFinishedOutTask
(
String
cid
,
String
posName
){
return
findFinishedTask
(
cid
,
posName
,
""
,
false
);
}
/**
* 根据料仓编号和库位获取已完成/取消的任务
*
* @param cid
* @param posName
* @return
*/
private
DataLog
findFinishedTask
(
String
cid
,
String
posName
,
String
barcode
,
boolean
putInTask
)
{
Collection
<
DataLog
>
areaFinishedTasks
=
theFinishedTaskMap
.
values
();
for
(
DataLog
task
:
areaFinishedTasks
)
{
boolean
isSameTask
=
false
;
if
(
ObjectUtil
.
isNotEmpty
(
posName
)
&&
task
.
getPosName
().
equals
(
posName
)
&&
task
.
getCid
().
equals
(
cid
))
{
isSameTask
=
true
;
}
else
if
(
ObjectUtil
.
isNotEmpty
(
barcode
)
&&
task
.
getBarcode
().
equals
(
barcode
)
&&
task
.
getCid
().
equals
(
cid
))
{
isSameTask
=
true
;
}
if
(
isSameTask
)
{
if
(
putInTask
)
{
if
(
task
.
isPutInTask
())
{
return
task
;
}
}
else
{
if
(
task
.
isCheckOutTask
())
{
return
task
;
}
}
}
}
return
null
;
}
/**
* 根据cid 和 posName ,barcode 查找正在执行的任务,不存在时返回 null
*/
public
DataLog
findExecutingTask
(
String
cid
,
String
posName
,
String
barcode
)
{
for
(
DataLog
task
:
taskMap
.
values
())
{
if
(
ObjectUtil
.
isNotEmpty
(
posName
)){
if
(
task
.
getCid
().
equals
(
cid
)
&&
task
.
getPosName
().
equals
(
posName
))
{
return
task
;
}
}
else
if
(
ObjectUtil
.
isNotEmpty
(
barcode
)){
if
(
task
.
getCid
().
equals
(
cid
)&&
task
.
getBarcode
().
equals
(
barcode
)){
return
task
;
}
}
}
return
null
;
}
public
DataLog
findFinishedOutTask
(
String
cid
,
String
posName
,
String
barcode
){
return
findFinishedTask
(
cid
,
posName
,
barcode
,
false
);
}
public
DataLog
findFinishedPutInTask
(
String
cid
,
String
posName
,
String
barcode
){
return
findFinishedTask
(
cid
,
posName
,
barcode
,
true
);
}
}
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论