Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 04ec3da6
由
sunke
编写于
2022-07-26 14:15:15 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
EasyExcel分页导出
感应料架占用库位加入缓存 MES兼容旧接口
1 个父辈
7362a1d0
隐藏空白字符变更
内嵌
并排
正在显示
24 个修改的文件
包含
692 行增加
和
196 行删除
pom.xml
src/main/java/com/neotel/smfcore/common/base/BasePo.java
src/main/java/com/neotel/smfcore/common/base/IExcelDownLoad.java
src/main/java/com/neotel/smfcore/common/utils/FileUtil.java
src/main/java/com/neotel/smfcore/core/device/handler/impl/NLPShelfHandler.java
src/main/java/com/neotel/smfcore/core/device/util/DataCache.java
src/main/java/com/neotel/smfcore/core/storage/rest/MesApiController.java
src/main/java/com/neotel/smfcore/core/storage/rest/StoragePosController.java
src/main/java/com/neotel/smfcore/core/storage/service/manager/IStoragePosManager.java
src/main/java/com/neotel/smfcore/core/storage/service/manager/impl/StoragePosManagerImpl.java
src/main/java/com/neotel/smfcore/core/system/rest/TaskController.java
src/main/java/com/neotel/smfcore/core/system/service/dao/IDataLogDao.java
src/main/java/com/neotel/smfcore/core/system/service/dao/impl/DataLogDaoImpl.java
src/main/java/com/neotel/smfcore/core/haman/bean/BINPosInfo.java → src/main/java/com/neotel/smfcore/custom/haman/bean/BINPosInfo.java
src/main/java/com/neotel/smfcore/core/haman/enums/BIN_STATUS.java → src/main/java/com/neotel/smfcore/custom/haman/enums/BIN_STATUS.java
src/main/java/com/neotel/smfcore/core/haman/listener/HamanOrderFileListener.java → src/main/java/com/neotel/smfcore/custom/haman/listener/HamanOrderFileListener.java
src/main/java/com/neotel/smfcore/core/haman/rest/HamanController.java → src/main/java/com/neotel/smfcore/custom/haman/rest/HamanController.java
src/main/java/com/neotel/smfcore/core/haman/rest/PosOutputController.java → src/main/java/com/neotel/smfcore/custom/haman/rest/PosOutputController.java
src/main/java/com/neotel/smfcore/core/haman/rest/dto/BINPosDto.java → src/main/java/com/neotel/smfcore/custom/haman/rest/dto/BINPosDto.java
src/main/java/com/neotel/smfcore/core/haman/rest/mapstruct/BINPosMapper.java → src/main/java/com/neotel/smfcore/custom/haman/rest/mapstruct/BINPosMapper.java
src/main/java/com/neotel/smfcore/core/haman/rest/query/HamanBinQueryCondition.java → src/main/java/com/neotel/smfcore/custom/haman/rest/query/HamanBinQueryCondition.java
src/main/java/com/neotel/smfcore/core/haman/services/dao/IHamanBinPosDao.java → src/main/java/com/neotel/smfcore/custom/haman/services/dao/IHamanBinPosDao.java
src/main/java/com/neotel/smfcore/core/haman/services/dao/impl/HamanBinPosDaoImpl.java → src/main/java/com/neotel/smfcore/custom/haman/services/dao/impl/HamanBinPosDaoImpl.java
src/main/java/com/neotel/smfcore/core/haman/services/po/HamanBinPos.java → src/main/java/com/neotel/smfcore/custom/haman/services/po/HamanBinPos.java
pom.xml
查看文件 @
04ec3da
...
...
@@ -167,21 +167,21 @@
</dependency>
<!-- excel工具 -->
<dependency
>
<groupId>
org.apache.poi
</groupId
>
<artifactId>
poi
</artifactId
>
<version>
3.17
</version
>
</dependency
>
<dependency
>
<groupId>
org.apache.poi
</groupId
>
<artifactId>
poi-ooxml
</artifactId
>
<version>
3.17
</version
>
</dependency
>
<dependency
>
<groupId>
xerces
</groupId
>
<artifactId>
xercesImpl
</artifactId
>
<version>
2.12.0
</version
>
</dependency
>
<!-- <dependency>--
>
<!-- <groupId>org.apache.poi</groupId>--
>
<!-- <artifactId>poi</artifactId>--
>
<!-- <version>3.17</version>--
>
<!-- </dependency>--
>
<!-- <dependency>--
>
<!-- <groupId>org.apache.poi</groupId>--
>
<!-- <artifactId>poi-ooxml</artifactId>--
>
<!-- <version>3.17</version>--
>
<!-- </dependency>--
>
<!-- <dependency>--
>
<!-- <groupId>xerces</groupId>--
>
<!-- <artifactId>xercesImpl</artifactId>--
>
<!-- <version>2.12.0</version>--
>
<!-- </dependency>--
>
<!--mapStruct-->
<dependency>
<groupId>
org.mapstruct
</groupId>
...
...
@@ -235,6 +235,12 @@
<artifactId>
commons-httpclient
</artifactId>
<version>
3.1
</version>
</dependency>
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
easyexcel
</artifactId>
<version>
3.1.1
</version>
</dependency>
</dependencies>
...
...
src/main/java/com/neotel/smfcore/common/base/BasePo.java
查看文件 @
04ec3da
package
com
.
neotel
.
smfcore
.
common
.
base
;
import
cn.hutool.core.date.DateUtil
;
import
lombok.Getter
;
import
lombok.Setter
;
import
org.apache.commons.lang3.builder.ToStringBuilder
;
...
...
src/main/java/com/neotel/smfcore/common/base/IExcelDownLoad.java
0 → 100644
查看文件 @
04ec3da
package
com
.
neotel
.
smfcore
.
common
.
base
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.mongodb.core.query.Query
;
import
java.util.List
;
public
interface
IExcelDownLoad
{
List
<
List
<
String
>>
getHeader
();
List
<
List
<
Object
>>
getPageData
(
Query
query
,
Pageable
pageable
);
}
src/main/java/com/neotel/smfcore/common/utils/FileUtil.java
查看文件 @
04ec3da
...
...
@@ -19,6 +19,10 @@ import cn.hutool.core.io.IoUtil;
import
cn.hutool.core.util.IdUtil
;
import
cn.hutool.poi.excel.BigExcelWriter
;
import
cn.hutool.poi.excel.ExcelUtil
;
import
com.alibaba.excel.EasyExcel
;
import
com.alibaba.excel.ExcelWriter
;
import
com.alibaba.excel.write.metadata.WriteSheet
;
import
com.neotel.smfcore.common.base.IExcelDownLoad
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.core.language.util.MessageUtils
;
import
org.apache.commons.collections4.CollectionUtils
;
...
...
@@ -26,6 +30,9 @@ import org.apache.poi.util.IOUtils;
import
org.apache.poi.xssf.streaming.SXSSFSheet
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.data.domain.PageRequest
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.mongodb.core.query.Query
;
import
org.springframework.web.multipart.MultipartFile
;
import
javax.servlet.ServletOutputStream
;
...
...
@@ -210,8 +217,63 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
}
/**
* 导出excel
* 分页导出Excel
* @param query
* @param pageable
* @param response
* @param excelDownLoad
* @throws IOException
*/
public
static
void
downloadExcel
(
Query
query
,
Pageable
pageable
,
HttpServletResponse
response
,
IExcelDownLoad
excelDownLoad
)
throws
IOException
{
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
response
.
setContentType
(
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
);
response
.
setCharacterEncoding
(
"utf-8"
);
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
//String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
String
fileName
=
SYS_TEM_DIR
+
IdUtil
.
fastSimpleUUID
()
+
".xlsx"
;
response
.
setHeader
(
"Content-disposition"
,
"attachment;filename*=utf-8''"
+
fileName
+
".xlsx"
);
// 这里 需要指定写用哪个class去写
try
(
ExcelWriter
excelWriter
=
EasyExcel
.
write
(
response
.
getOutputStream
()).
head
(
excelDownLoad
.
getHeader
()).
build
())
{
// 这里注意 如果同一个sheet只要创建一次
WriteSheet
writeSheet
=
EasyExcel
.
writerSheet
(
"Sheet1"
).
build
();
// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来
PageRequest
page
=
PageRequest
.
ofSize
(
10000
);
if
(
pageable
!=
null
){
page
.
withSort
(
pageable
.
getSort
());
}
while
(
true
){
List
<
List
<
Object
>>
data
=
excelDownLoad
.
getPageData
(
query
,
page
);
if
(
data
==
null
||
data
.
isEmpty
()){
break
;
}
excelWriter
.
write
(
data
,
writeSheet
);
page
=
page
.
next
();
}
}
}
/**
* 一次性导出excel
*/
public
static
void
downloadExcel
(
List
<
List
<
String
>>
headers
,
List
<
List
<
Object
>>
datas
,
HttpServletResponse
response
)
throws
IOException
{
// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
response
.
setContentType
(
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
);
response
.
setCharacterEncoding
(
"utf-8"
);
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
//String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
String
fileName
=
SYS_TEM_DIR
+
IdUtil
.
fastSimpleUUID
()
+
".xlsx"
;
response
.
setHeader
(
"Content-disposition"
,
"attachment;filename*=utf-8''"
+
fileName
+
".xlsx"
);
EasyExcel
.
write
(
response
.
getOutputStream
()).
sheet
(
"Sheet1"
).
head
(
headers
).
doWrite
(
datas
);
}
/**
* 使用分页导出Excel或者一次性导出Excel方法
*/
@Deprecated
public
static
void
downloadExcel
(
List
<
Map
<
String
,
Object
>>
list
,
HttpServletResponse
response
)
throws
IOException
{
String
tempPath
=
SYS_TEM_DIR
+
IdUtil
.
fastSimpleUUID
()
+
".xlsx"
;
File
file
=
new
File
(
tempPath
);
...
...
src/main/java/com/neotel/smfcore/core/device/handler/impl/NLPShelfHandler.java
查看文件 @
04ec3da
...
...
@@ -453,17 +453,12 @@ public class NLPShelfHandler extends BaseDeviceHandler{
@AnonymousAccess
public
ResultBean
shelfStatus
(
HttpServletRequest
request
){
String
cid
=
request
.
getParameter
(
"cid"
);
Storage
storage
=
dataCache
.
getStorage
(
cid
);
List
<
StoragePos
>
allPos
=
storagePosManager
.
findNotEmptyByStorageId
(
storage
.
getId
());
List
<
String
>
posList
=
new
ArrayList
<>();
for
(
StoragePos
pos
:
allPos
)
{
posList
.
add
(
pos
.
getPosName
());
}
List
<
String
>
posList
=
dataCache
.
getUsedPosNameList
(
cid
);
List
<
String
>
outTaskPosList
=
new
ArrayList
<>();
Collection
<
DataLog
>
queueTasks
=
taskService
.
getQueueTasks
(
cid
);
for
(
DataLog
task
:
queueTasks
)
{
if
(
task
.
isCheckOutTask
()){
//只发执行中的任务
if
(
task
.
isCheckOutTask
()&&
task
.
isExecuting
()){
String
rgb
=
task
.
getLightColor
();
ORDER_COLOR
color
=
ORDER_COLOR
.
fromRgb
(
rgb
);
if
(
color
==
null
){
...
...
@@ -477,6 +472,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
Map
<
String
,
List
<
String
>>
dataMap
=
new
HashMap
<>();
dataMap
.
put
(
"hasReelPosList"
,
posList
);
dataMap
.
put
(
"outTaskList"
,
outTaskPosList
);
//log.info("客户端获取["+cid+"]库位占用情况返回");
return
ResultBean
.
newOkResult
(
dataMap
);
}
...
...
@@ -488,12 +484,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
@AnonymousAccess
public
ResultBean
checkAll
(
HttpServletRequest
request
){
String
cid
=
request
.
getParameter
(
"cid"
);
Storage
storage
=
dataCache
.
getStorage
(
cid
);
List
<
StoragePos
>
allPos
=
storagePosManager
.
findNotEmptyByStorageId
(
storage
.
getId
());
List
<
String
>
posList
=
new
ArrayList
<>();
for
(
StoragePos
pos
:
allPos
)
{
posList
.
add
(
pos
.
getPosName
());
}
List
<
String
>
posList
=
dataCache
.
getUsedPosNameList
(
cid
);
return
ResultBean
.
newOkResult
(
posList
);
}
@Override
...
...
src/main/java/com/neotel/smfcore/core/device/util/DataCache.java
查看文件 @
04ec3da
...
...
@@ -87,7 +87,10 @@ public class DataCache {
*/
private
static
Settings
settings
;
/**
* 库位占用Map, key为cid,value为已使用的库位列表
*/
private
static
Map
<
String
,
List
<
String
>>
usedPosNameMap
=
new
ConcurrentHashMap
<>();
@PostConstruct
public
void
initialize
()
{
...
...
@@ -379,6 +382,44 @@ public class DataCache {
/**
* 出库时清除使用库位列表
*/
private
void
removeUsedPosNameList
(
String
cid
,
String
posName
){
List
<
String
>
usedPosNameList
=
getUsedPosNameList
(
cid
);
usedPosNameList
.
remove
(
posName
);
usedPosNameMap
.
put
(
cid
,
usedPosNameList
);
}
/**
* 入库时增加使用库位列表
*/
private
void
addUsedPosNameList
(
String
cid
,
String
posName
){
List
<
String
>
usedPosNameList
=
getUsedPosNameList
(
cid
);
usedPosNameList
.
add
(
posName
);
usedPosNameMap
.
put
(
cid
,
usedPosNameList
);
}
/**
* 获取设备所有占用的库位名称列表
*/
public
List
<
String
>
getUsedPosNameList
(
String
cid
){
List
<
String
>
posNameList
=
usedPosNameMap
.
get
(
cid
);
if
(
posNameList
==
null
){
Storage
storage
=
getStorage
(
cid
);
posNameList
=
new
ArrayList
<>();
if
(
storage
!=
null
){
log
.
info
(
"加载["
+
cid
+
"]所有已使用库位到缓存"
);
List
<
StoragePos
>
allPos
=
storagePosManager
.
findNotEmptyByStorageId
(
storage
.
getId
());
for
(
StoragePos
pos
:
allPos
)
{
posNameList
.
add
(
pos
.
getPosName
());
}
usedPosNameMap
.
put
(
cid
,
posNameList
);
}
}
return
posNameList
;
}
/**
* 锁定库存
* @param cid
* @param partNumber 物料编号
...
...
@@ -636,11 +677,12 @@ public class DataCache {
//出库
amount
=
-
barcode
.
getAmount
();
storage
.
emptyOnePos
(
pos
);
removeUsedPosNameList
(
cid
,
pos
.
getPosName
());
}
else
{
//入库
amount
=
barcode
.
getAmount
();
storage
.
useOnePos
(
pos
);
addUsedPosNameList
(
cid
,
pos
.
getPosName
());
//入库单处理
if
(
ObjectUtil
.
isNotEmpty
(
storage
.
getInListName
())){
inListCache
.
UpdateInList
(
storage
.
getInListName
(),
pos
,
barcode
);
...
...
src/main/java/com/neotel/smfcore/core/storage/rest/MesApiController.java
查看文件 @
04ec3da
...
...
@@ -3,26 +3,43 @@ package com.neotel.smfcore.core.storage.rest;
import
com.google.common.base.Strings
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
com.google.common.collect.Sets
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.utils.DateUtil
;
import
com.neotel.smfcore.common.utils.StorageConstants
;
import
com.neotel.smfcore.core.barcode.bean.CodeBean
;
import
com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager
;
import
com.neotel.smfcore.core.barcode.service.manager.IComponentManager
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.barcode.service.po.Component
;
import
com.neotel.smfcore.core.barcode.utils.CodeResolve
;
import
com.neotel.smfcore.core.device.bean.BoxStatusBean
;
import
com.neotel.smfcore.core.device.bean.StatusBean
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.storage.bean.UsageItem
;
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
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
com.neotel.smfcore.core.system.service.dao.IDataLogDao
;
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.security.annotation.AnonymousAccess
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
org.apache.logging.log4j.core.util.Integers
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.ResponseBody
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.*
;
@Slf4j
@RestController
...
...
@@ -33,10 +50,25 @@ public class MesApiController {
@Autowired
protected
TaskService
taskService
;
@Autowired
protected
IComponentManager
componentManager
;
@Autowired
private
IBarcodeManager
barcodeManager
;
@Autowired
private
IStoragePosManager
storagePosManager
;
@Autowired
IStoragePosManager
storagePosManager
;
private
DataCache
dataCache
;
@Autowired
private
IDataLogDao
dataLogDao
;
@Autowired
protected
DataCache
dataCache
;
protected
CodeResolve
codeResolve
;
//http://localhost/myproject/rest/api/v2/mes/inventory?LOC=1
@ApiOperation
(
"查询有料仓位"
)
@RequestMapping
(
value
=
"/inventory"
)
...
...
@@ -79,15 +111,109 @@ public class MesApiController {
}
return
ReelBarCodes
/*+ dataCache.getSettings().getNotifyApiUrl()*/
;
}
@ApiOperation
(
"指定出库"
)
/**
* 基础数据同步
*/
@RequestMapping
(
value
=
"/dataUpdate"
)
@ResponseBody
public
String
dataUpdate
(
HttpServletRequest
request
)
{
try
{
String
Partnumber
=
checkParameter
(
request
,
"PN"
);
String
w
=
checkParameter
(
request
,
"PACKAGE_WIDTH"
);
String
h
=
checkParameter
(
request
,
"PACKAGE_HEIGHT"
);
log
.
info
(
"收到 MES 的 数据同步信息"
+
Partnumber
+
"【"
+
w
+
"x"
+
h
+
"】"
);
Component
c
=
componentManager
.
findOneByPN
(
Partnumber
);
if
(
c
==
null
){
c
=
new
Component
();
}
c
.
setPartNumber
(
Partnumber
);
c
.
setPlateSize
(
Integer
.
valueOf
(
w
));
c
.
setHeight
(
Integer
.
valueOf
(
h
));
componentManager
.
save
(
c
);
}
catch
(
ValidateException
e
)
{
return
"Error:"
+
e
.
getMessage
();
}
return
"OK"
;
}
private
String
checkParameter
(
HttpServletRequest
request
,
String
paramName
)
throws
ValidateException
{
String
value
=
request
.
getParameter
(
paramName
);
if
(
Strings
.
isNullOrEmpty
(
value
)){
log
.
info
(
paramName
+
" is required."
);
throw
new
ValidateException
(
"param.required"
,
paramName
+
" is required."
);
}
return
value
;
}
@RequestMapping
(
value
=
"/barcode"
)
@ResponseBody
public
String
barcode
(
HttpServletRequest
request
)
{
try
{
String
codeStr
=
checkParameter
(
request
,
"codeStr"
);
String
batch
=
checkParameter
(
request
,
"batch"
);
log
.
info
(
"收到MES接口条码更新指令:codeStr="
+
codeStr
+
" batch="
+
batch
);
String
sizeCodeStr
=
"=1x1="
+
codeStr
;
CodeBean
codeBean
=
codeResolve
.
resolveSingleCode
(
sizeCodeStr
);
if
(
codeBean
.
isValid
()){
Barcode
barcode
=
codeBean
.
getBarcode
();
barcode
.
setBatch
(
batch
);
barcodeManager
.
save
(
barcode
);
return
"OK"
;
}
else
{
return
"Error:"
+
codeBean
.
getError
();
}
}
catch
(
ValidateException
ve
)
{
return
"Error:"
+
ve
.
getMessage
();
}
catch
(
Exception
e
){
return
"Error:"
+
e
.
getMessage
();
}
}
@RequestMapping
(
value
=
"/codeUpdate"
)
@ResponseBody
public
String
codeUpdate
(
HttpServletRequest
request
)
{
try
{
String
REEL_ID
=
checkParameter
(
request
,
"RI"
);
String
PARTNUMBER
=
checkParameter
(
request
,
"PN"
);
String
QTY
=
checkParameter
(
request
,
"QTY"
);
log
.
info
(
"收到条码同步信息:RI="
+
REEL_ID
+
" PN="
+
PARTNUMBER
+
" QTY="
+
QTY
);
Component
c
=
componentManager
.
findOneByPN
(
PARTNUMBER
);
if
(
c
==
null
){
return
"Error: 物料编号["
+
PARTNUMBER
+
"]的档案不存在"
;
}
Barcode
barcode
=
barcodeManager
.
findByBarcode
(
REEL_ID
);
if
(
barcode
==
null
){
barcode
=
new
Barcode
();
}
barcode
.
setBarcode
(
REEL_ID
);
barcode
.
setPartNumber
(
PARTNUMBER
);
barcode
.
setInitialAmount
(
Integer
.
valueOf
(
QTY
));
barcode
.
setAmount
(
Integer
.
valueOf
(
QTY
));
barcode
.
setPlateSize
(
c
.
getPlateSize
());
barcode
.
setHeight
(
c
.
getHeight
());
barcodeManager
.
save
(
barcode
);
}
catch
(
ValidateException
ve
)
{
return
"Error:"
+
ve
.
getMessage
();
}
catch
(
Exception
e
){
return
"Error:"
+
e
.
getMessage
();
}
return
"OK"
;
}
@RequestMapping
(
value
=
"/stackOut"
)
@ResponseBody
@AnonymousAccess
public
String
stackOut
(
HttpServletRequest
request
)
{
try
{
String
[]
REEL_IDS
=
request
.
getParameterValues
(
"RIS"
);
log
.
info
(
"stackOut: REEL_IDS="
+
REEL_IDS
.
toString
());
if
(
REEL_IDS
==
null
||
REEL_IDS
.
length
==
0
){
return
"Error: RI 为必须项"
;
}
...
...
@@ -110,4 +236,226 @@ public class MesApiController {
}
return
"OK"
;
}
@RequestMapping
(
value
=
"/unlock"
)
@ResponseBody
public
String
unlock
(
HttpServletRequest
request
)
{
String
orderName
=
request
.
getParameter
(
"orderName"
);
//锁定标签
log
.
info
(
"收到unlock 请求:orderName="
+
orderName
);
List
<
StoragePos
>
lockPoses
=
storagePosManager
.
findLockPos
(
orderName
);
for
(
StoragePos
lockPos
:
lockPoses
)
{
try
{
Barcode
code
=
lockPos
.
getBarcode
();
code
.
setLockId
(
null
);
code
.
setLockName
(
null
);
lockPos
.
setBarcode
(
code
);
storagePosManager
.
save
(
lockPos
);
Storage
storage
=
dataCache
.
getStorageById
(
lockPos
.
getStorageId
());
dataCache
.
unLockOneReel
(
storage
.
getCid
(),
code
.
getPartNumber
());
}
catch
(
ValidateException
e
)
{
log
.
error
(
"MES unlock error: "
+
e
.
getDefaultMsg
());
}
}
return
"OK"
;
}
@RequestMapping
(
value
=
"/lock"
)
@ResponseBody
public
String
lock
(
HttpServletRequest
request
){
String
orderName
=
request
.
getParameter
(
"orderName"
);
//锁定标签
String
pn
=
request
.
getParameter
(
"pn"
);
//Partnumber
int
num
=
Integers
.
parseInt
(
request
.
getParameter
(
"num"
),-
1
);
//锁定数量
log
.
info
(
"lock 请求:orderName="
+
orderName
+
";pn="
+
pn
+
";num="
+
num
);
if
(
Strings
.
isNullOrEmpty
(
orderName
)
||
Strings
.
isNullOrEmpty
(
pn
)
||
num
==
-
1
){
return
"Error:参数错误"
;
}
//验证库存
Collection
<
String
>
excludePosIds
=
Sets
.
newHashSet
();
Collection
<
StoragePos
>
posToLock
=
Sets
.
newHashSet
();
int
lockNum
=
0
;
while
(
lockNum
<
num
){
StoragePos
pos
=
storagePosManager
.
findPartNumberInStorages
(
null
,
pn
,
excludePosIds
,
dataCache
.
getCheckOutType
());
if
(
pos
==
null
){
return
"Error:库存不足"
;
}
Barcode
barcode
=
pos
.
getBarcode
();
if
(
barcode
!=
null
){
lockNum
=
lockNum
+
barcode
.
getAmount
();
log
.
info
(
"lockOrderName="
+
orderName
+
"查找到物料【 "
+
barcode
.
getBarcode
()+
" 】,PN=["
+
barcode
.
getPartNumber
()+
"],数量="
+
barcode
.
getAmount
()+
"已找到数量:"
+
lockNum
);
posToLock
.
add
(
pos
);
}
excludePosIds
.
add
(
pos
.
getId
());
}
for
(
StoragePos
storagePos
:
posToLock
)
{
try
{
Barcode
code
=
storagePos
.
getBarcode
();
code
.
setLockId
(
orderName
);
code
.
setLockName
(
"API"
);
storagePos
.
setBarcode
(
code
);
storagePosManager
.
save
(
storagePos
);
Storage
storage
=
dataCache
.
getStorageById
(
storagePos
.
getStorageId
());
dataCache
.
lockOneReel
(
storage
.
getCid
(),
pn
);
}
catch
(
ValidateException
e
)
{
e
.
printStackTrace
();
}
}
return
"OK"
;
}
@RequestMapping
(
value
=
"/pnInventory"
)
@ResponseBody
public
Map
<
String
,
Map
<
String
,
Integer
>>
getParnumberInventory
(
HttpServletRequest
request
){
log
.
info
(
"收到 getParnumberInventory 请求"
);
Map
<
String
,
Map
<
String
,
Integer
>>
partnumberInventory
=
Maps
.
newHashMap
();
List
<
StoragePos
>
poses
=
storagePosManager
.
findNotEmpty
();
for
(
StoragePos
pos
:
poses
){
Barcode
barcode
=
pos
.
getBarcode
();
String
parnumber
=
barcode
.
getPartNumber
();
Map
<
String
,
Integer
>
itemInventory
=
partnumberInventory
.
get
(
parnumber
);
int
totalNum
=
0
;
int
lockNum
=
0
;
if
(
itemInventory
==
null
){
itemInventory
=
Maps
.
newHashMap
();
}
else
{
totalNum
=
itemInventory
.
get
(
"totalNum"
);
lockNum
=
itemInventory
.
get
(
"lockNum"
);
}
totalNum
=
totalNum
+
barcode
.
getAmount
();
if
(!
Strings
.
isNullOrEmpty
(
barcode
.
getLockId
())){
lockNum
=
lockNum
+
barcode
.
getAmount
();
}
itemInventory
.
put
(
"totalNum"
,
totalNum
);
itemInventory
.
put
(
"lockNum"
,
lockNum
);
partnumberInventory
.
put
(
parnumber
,
itemInventory
);
}
return
partnumberInventory
;
}
@RequestMapping
(
value
=
"/history"
)
@ResponseBody
public
List
<
Map
<
String
,
Object
>>
history
(
HttpServletRequest
request
)
{
String
bid
=
request
.
getParameter
(
"bid"
);
// String start = request.getParameter("start");
// String end = request.getParameter("end");
// Date startDate = toDate(start);
// Date endDate = toDate(end);
String
numStr
=
request
.
getParameter
(
"num"
);
int
num
=
20
;
if
(!
Strings
.
isNullOrEmpty
(
numStr
)){
try
{
num
=
Integer
.
valueOf
(
numStr
);
}
catch
(
Exception
e
){
}
}
List
<
Map
<
String
,
Object
>>
results
=
Lists
.
newArrayList
();
List
<
DataLog
>
datas
=
dataLogDao
.
findHistory
(
bid
,
num
);
datas
.
sort
(
new
Comparator
<
DataLog
>()
{
@Override
public
int
compare
(
DataLog
o1
,
DataLog
o2
)
{
return
o1
.
getCreateDate
().
compareTo
(
o2
.
getCreateDate
());
}
});
for
(
DataLog
dataItem
:
datas
){
Map
<
String
,
Object
>
item
=
Maps
.
newHashMap
();
item
.
put
(
"barcode"
,
dataItem
.
getBarcode
());
item
.
put
(
"partnumber"
,
dataItem
.
getPartNumber
());
item
.
put
(
"qty"
,
dataItem
.
getNum
());
item
.
put
(
"type"
,
dataItem
.
getType
());
item
.
put
(
"opor"
,
dataItem
.
getOperator
());
item
.
put
(
"boxName"
,
dataItem
.
getStorageName
());
item
.
put
(
"posName"
,
dataItem
.
getPosName
());
item
.
put
(
"source"
,
dataItem
.
getSourceId
());
item
.
put
(
"status"
,
dataItem
.
getStatus
());
item
.
put
(
"date"
,
DateUtil
.
toDateTimeString
(
dataItem
.
getCreateDate
()));
results
.
add
(
item
);
}
return
results
;
}
@RequestMapping
(
value
=
"/status"
)
@ResponseBody
public
List
<
Map
<
String
,
Object
>>
status
(
HttpServletRequest
request
)
{
String
cid
=
request
.
getParameter
(
"cid"
);
// Locale localeZh = Language.ZH_CN.getLocale();
// Locale localeEn = Language.ENGLISH.getLocale();
Collection
<
Storage
>
storageList
=
Lists
.
newArrayList
();
if
(
Strings
.
isNullOrEmpty
(
cid
)){
storageList
.
addAll
(
dataCache
.
getAllStorage
().
values
());
}
else
{
Storage
storage
=
dataCache
.
getStorage
(
cid
);
storageList
.
add
(
storage
);
}
List
<
Map
<
String
,
Object
>>
results
=
Lists
.
newArrayList
();
for
(
Storage
storage
:
storageList
){
StatusBean
statusBean
=
DevicesStatusUtil
.
getStatusBean
(
storage
.
getCid
());
Map
<
String
,
BoxStatusBean
>
boxStatusMap
=
statusBean
.
getBoxStatus
();
int
status
=
-
1
;
if
(
boxStatusMap
!=
null
){
BoxStatusBean
boxStatusBean
=
boxStatusMap
.
get
(
"1"
);
if
(
boxStatusBean
!=
null
){
status
=
boxStatusBean
.
getStatus
();
}
}
int
storageStatus
=
status
;
if
(
status
==
StorageConstants
.
STATUS
.
OFFLINE
||
statusBean
.
timeOut
()){
//离线
storageStatus
=
-
1
;
}
String
msg
=
statusBean
.
getMsg
();
String
msgEn
=
statusBean
.
getMsgEn
();
// Exception e = taskService.getServerException(storage.getCid());
// if(e != null){
// if(e instanceof ValidateException){
// msg = getText(e.getMessage(),((ValidateException) e).getParams(), localeZh ,e.getMessage());
// msgEn = getText(e.getMessage(),((ValidateException) e).getParams(), localeEn ,e.getMessage());
// }else{
// msg = e.getMessage();
// msgEn = e.getMessage();
// }
// }
Map
<
String
,
Object
>
itemMap
=
new
HashMap
<>();
itemMap
.
put
(
"cid"
,
storage
.
getCid
());
itemMap
.
put
(
"name"
,
storage
.
getName
());
itemMap
.
put
(
"status"
,
storageStatus
);
itemMap
.
put
(
"msg"
,
msg
);
itemMap
.
put
(
"msgEn"
,
msgEn
);
itemMap
.
put
(
"doorReelSignal"
,
statusBean
.
getDoorReelSingnal
());
Map
<
String
,
Object
>
emptySlotMap
=
Maps
.
newHashMap
();
Map
<
String
,
Object
>
totalSlotMap
=
Maps
.
newHashMap
();
Map
<
String
,
UsageItem
>
usageMap
=
storage
.
getUsageMap
();
for
(
UsageItem
usageItem
:
usageMap
.
values
())
{
String
sizeStr
=
usageItem
.
getSizeStr
();
int
total
=
usageItem
.
getTotalCount
();
int
used
=
usageItem
.
getUsedCount
();
totalSlotMap
.
put
(
sizeStr
,
total
);
emptySlotMap
.
put
(
sizeStr
,
total
-
used
);
}
itemMap
.
put
(
"emptySlot"
,
emptySlotMap
);
itemMap
.
put
(
"totalSlot"
,
totalSlotMap
);
results
.
add
(
itemMap
);
}
return
results
;
}
private
Date
toDate
(
String
dateStr
){
try
{
return
DateUtil
.
toDate
(
dateStr
,
"yyyyMMddHHmmss"
);
}
catch
(
Exception
e
)
{
}
return
null
;
}
}
src/main/java/com/neotel/smfcore/core/storage/rest/StoragePosController.java
查看文件 @
04ec3da
...
...
@@ -2,9 +2,12 @@ package com.neotel.smfcore.core.storage.rest;
import
cn.hutool.core.util.ObjectUtil
;
import
com.google.common.base.Strings
;
import
com.google.common.collect.Lists
;
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.core.barcode.bean.CodeBean
;
...
...
@@ -44,6 +47,8 @@ import org.springframework.web.bind.annotation.*;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.text.DateFormat
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
@Slf4j
...
...
@@ -298,25 +303,72 @@ public class StoragePosController {
}
@ApiOperation
(
"导出查找出库列表"
)
@GetMapping
(
value
=
"/find/download"
)
@PreAuthorize
(
"@el.check('checkOut')"
)
public
void
download
(
HttpServletResponse
response
,
StoragePosFindCriteria
criteria
,
HttpServletRequest
request
)
throws
IOException
{
Query
query
=
getPosFindCriteria
(
criteria
);
List
<
StoragePos
>
storagePos
=
storagePosManager
.
findByQuery
(
query
);
storagePosManager
.
download
(
storagePos
,
response
,
request
.
getLocale
());
}
@ApiOperation
(
"查找出库列表"
)
@GetMapping
(
"/find"
)
@PreAuthorize
(
"@el.check('checkOut')"
)
public
PageData
<
StoragePosDto
>
storagePosFind
(
StoragePosFindCriteria
criteria
,
Pageable
pageable
,
HttpServletRequest
request
)
{
Query
query
=
getPosFindCriteria
(
criteria
);
PageData
<
StoragePos
>
pages
=
storagePosManager
.
findByPage
(
query
,
pageable
);
List
<
StoragePosDto
>
StoragePosDtos
=
storagePosMapper
.
toDto
(
pages
.
getContent
());
return
new
PageData
(
StoragePosDtos
,
pages
.
getTotalElements
());
}
@ApiOperation
(
"导出查找出库列表"
)
@GetMapping
(
value
=
"/find/download"
)
@PreAuthorize
(
"@el.check('checkOut')"
)
public
void
download
(
HttpServletResponse
response
,
StoragePosFindCriteria
criteria
,
Pageable
pageable
,
HttpServletRequest
request
)
throws
IOException
{
Query
query
=
getPosFindCriteria
(
criteria
);
FileUtil
.
downloadExcel
(
query
,
pageable
,
response
,
new
IExcelDownLoad
()
{
@Override
public
List
<
List
<
String
>>
getHeader
()
{
List
<
List
<
String
>>
header
=
new
ArrayList
<>();
Locale
locale
=
request
.
getLocale
();
header
.
add
(
Lists
.
newArrayList
(
MessageUtils
.
getText
(
"smfcore.storagePos.barcode"
,
locale
,
"条码编号"
)));
header
.
add
(
Lists
.
newArrayList
(
MessageUtils
.
getText
(
"smfcore.storagePos.partNumber"
,
locale
,
"物料编号"
)));
header
.
add
(
Lists
.
newArrayList
(
MessageUtils
.
getText
(
"smfcore.storagePos.proDate"
,
locale
,
"生产日期"
)));
header
.
add
(
Lists
.
newArrayList
(
MessageUtils
.
getText
(
"smfcore.storagePos.expireDate"
,
locale
,
"过期时间"
)));
header
.
add
(
Lists
.
newArrayList
(
MessageUtils
.
getText
(
"smfcore.storagePos.posName"
,
locale
,
"库位号"
)));
header
.
add
(
Lists
.
newArrayList
(
MessageUtils
.
getText
(
"smfcore.storagePos.lockName"
,
locale
,
"工单号"
)));
header
.
add
(
Lists
.
newArrayList
(
MessageUtils
.
getText
(
"smfcore.storagePos.amount"
,
locale
,
"数量"
)));
header
.
add
(
Lists
.
newArrayList
(
MessageUtils
.
getText
(
"smfcore.storagePos.putInTime"
,
locale
,
"首次入库时间"
)));
header
.
add
(
Lists
.
newArrayList
(
MessageUtils
.
getText
(
"smfcore.storagePos.putInDate"
,
locale
,
"入库时间"
)));
return
header
;
}
@Override
public
List
<
List
<
Object
>>
getPageData
(
Query
query
,
Pageable
pageable
)
{
List
<
List
<
Object
>>
dataList
=
new
ArrayList
<>();
DateFormat
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
List
<
Map
<
String
,
Object
>>
list
=
new
ArrayList
<>();
List
<
StoragePos
>
storagePos
=
storagePosManager
.
findByQuery
(
query
,
pageable
);
for
(
StoragePos
pos
:
storagePos
)
{
String
proDate
=
pos
.
getBarcode
().
getProduceDate
()
==
null
?
""
:
dateFormat
.
format
(
pos
.
getBarcode
().
getProduceDate
());
String
expireDate
=
pos
.
getBarcode
().
getExpireDate
()
==
null
?
""
:
dateFormat
.
format
(
pos
.
getBarcode
().
getExpireDate
());
String
putInTime
=
(
pos
.
getBarcode
().
getPutInTime
()
==
-
1
)
?
""
:
dateFormat
.
format
(
new
Date
(
pos
.
getBarcode
().
getPutInTime
()));
if
(
ObjectUtil
.
isNotEmpty
(
putInTime
)){
putInTime
=
dateFormat
.
format
(
pos
.
getBarcode
().
getPutInDate
());
}
List
<
Object
>
data
=
new
ArrayList
<>();
data
.
add
(
pos
.
getBarcode
().
getBarcode
());
data
.
add
(
pos
.
getBarcode
().
getPartNumber
());
data
.
add
(
proDate
);
data
.
add
(
expireDate
);
data
.
add
(
pos
.
getPosName
());
data
.
add
(
pos
.
getBarcode
().
getLockName
());
data
.
add
(
pos
.
getBarcode
().
getAmount
());
data
.
add
(
putInTime
);
data
.
add
(
dateFormat
.
format
(
pos
.
getBarcode
().
getPutInDate
()));
dataList
.
add
(
data
);
}
return
dataList
;
}
});
}
@ApiOperation
(
"出库操作"
)
@PutMapping
(
"/checkout"
)
public
ResultBean
checkout
(
@Validated
@RequestBody
CheckOutDto
checkOutDto
)
{
...
...
src/main/java/com/neotel/smfcore/core/storage/service/manager/IStoragePosManager.java
查看文件 @
04ec3da
...
...
@@ -8,6 +8,8 @@ import com.neotel.smfcore.core.storage.bean.InventoryItem;
import
com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.mongodb.core.query.Query
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
...
...
@@ -31,6 +33,8 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
StoragePos
findPartNumberInStorages
(
List
<
String
>
storageIdList
,
String
labelId
,
String
pn
,
Collection
<
String
>
excludePosIds
,
CHECKOUT_TYPE
checkOutType
);
List
<
StoragePos
>
findByQuery
(
Query
query
,
Pageable
pageable
);
void
removePosByStorageId
(
String
storageId
);
void
deletePoss
(
Set
<
String
>
ids
);
...
...
@@ -59,8 +63,6 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
public
void
updateBarcodeMsd
(
String
pn
,
String
msl
,
String
thickness
);
void
download
(
List
<
StoragePos
>
storagePos
,
HttpServletResponse
response
,
Locale
locale
)
throws
IOException
;
List
<
StoragePos
>
findPosList
(
String
storageId
,
List
<
String
>
posNames
);
List
<
StoragePos
>
getSameSizeContinuityEmptyPosList
(
Storage
storage
,
Barcode
barcode
)
throws
ValidateException
;
...
...
src/main/java/com/neotel/smfcore/core/storage/service/manager/impl/StoragePosManagerImpl.java
查看文件 @
04ec3da
...
...
@@ -6,13 +6,9 @@ import com.google.common.collect.Lists;
import
com.google.common.collect.Maps
;
import
com.neotel.smfcore.common.bean.PageData
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.utils.DateUtil
;
import
com.neotel.smfcore.common.utils.FileUtil
;
import
com.neotel.smfcore.common.utils.PointUtil
;
import
com.neotel.smfcore.common.utils.StringUtils
;
import
com.neotel.smfcore.core.barcode.bean.PlateSizeBean
;
import
com.neotel.smfcore.core.barcode.service.po.Barcode
;
import
com.neotel.smfcore.core.language.util.MessageUtils
;
import
com.neotel.smfcore.core.storage.bean.InventoryItem
;
import
com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE
;
import
com.neotel.smfcore.core.storage.enums.COMPATIBLE_TYPE
;
...
...
@@ -20,7 +16,6 @@ import com.neotel.smfcore.core.storage.service.dao.IStoragePosDao;
import
com.neotel.smfcore.core.storage.service.manager.IStoragePosManager
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
com.neotel.smfcore.security.service.po.User
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
...
...
@@ -33,10 +28,6 @@ import org.springframework.data.mongodb.core.query.Query;
import
org.springframework.data.mongodb.core.query.Update
;
import
org.springframework.stereotype.Service
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.text.DateFormat
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
...
...
@@ -308,6 +299,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public
List
<
StoragePos
>
findByQuery
(
Query
query
,
Pageable
pageable
)
{
return
storagePosDao
.
findByQuery
(
query
,
pageable
);
}
@Override
public
List
<
StoragePos
>
findByQuery
(
Query
query
)
{
return
storagePosDao
.
findByQuery
(
query
);
}
...
...
@@ -503,43 +499,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
storagePosDao
.
updateMulti
(
query
,
Update
.
update
(
"barcode.thickness"
,
thickness
));
}
@Override
public
void
download
(
List
<
StoragePos
>
storagePos
,
HttpServletResponse
response
,
Locale
locale
)
throws
IOException
{
String
barcodeStr
=
MessageUtils
.
getText
(
"smfcore.storagePos.barcode"
,
locale
,
"条码编号"
);
String
partNumberStr
=
MessageUtils
.
getText
(
"smfcore.storagePos.partNumber"
,
locale
,
"物料编号"
);
String
proDateStr
=
MessageUtils
.
getText
(
"smfcore.storagePos.proDate"
,
locale
,
"生产日期"
);
String
expireDateStr
=
MessageUtils
.
getText
(
"smfcore.storagePos.expireDate"
,
locale
,
"过期时间"
);
String
posNameStr
=
MessageUtils
.
getText
(
"smfcore.storagePos.posName"
,
locale
,
"库位号"
);
String
lockNameStr
=
MessageUtils
.
getText
(
"smfcore.storagePos.lockName"
,
locale
,
"工单号"
);
String
amountStr
=
MessageUtils
.
getText
(
"smfcore.storagePos.amount"
,
locale
,
"数量"
);
String
putInTimeStr
=
MessageUtils
.
getText
(
"smfcore.storagePos.putInTime"
,
locale
,
"首次入库时间"
);
String
putInDateStr
=
MessageUtils
.
getText
(
"smfcore.storagePos.putInDate"
,
locale
,
"入库时间"
);
DateFormat
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:SS"
);
List
<
Map
<
String
,
Object
>>
list
=
new
ArrayList
<>();
for
(
StoragePos
pos
:
storagePos
)
{
Map
<
String
,
Object
>
map
=
new
LinkedHashMap
<>();
map
.
put
(
barcodeStr
,
pos
.
getBarcode
().
getBarcode
());
map
.
put
(
partNumberStr
,
pos
.
getBarcode
().
getPartNumber
());
String
proDate
=
pos
.
getBarcode
().
getProduceDate
()
==
null
?
""
:
dateFormat
.
format
(
pos
.
getBarcode
().
getProduceDate
());
map
.
put
(
proDateStr
,
proDate
);
map
.
put
(
expireDateStr
,
pos
.
getBarcode
().
getExpireDate
());
map
.
put
(
posNameStr
,
pos
.
getPosName
());
map
.
put
(
lockNameStr
,
pos
.
getBarcode
().
getLockName
());
map
.
put
(
amountStr
,
pos
.
getBarcode
().
getAmount
());
String
putInTime
=
(
pos
.
getBarcode
().
getPutInTime
()
==
-
1
)
?
""
:
dateFormat
.
format
(
new
Date
(
pos
.
getBarcode
().
getPutInTime
()));
if
(
ObjectUtil
.
isNotEmpty
(
putInTime
)){
putInTime
=
dateFormat
.
format
(
pos
.
getBarcode
().
getPutInDate
());
}
map
.
put
(
putInTimeStr
,
putInTime
);
map
.
put
(
putInDateStr
,
dateFormat
.
format
(
pos
.
getBarcode
().
getPutInDate
()));
list
.
add
(
map
);
}
FileUtil
.
downloadExcel
(
list
,
response
);
}
/**
* 查找同尺寸连续的库位,合并库位放置料盘,仅用于智能料架
* @param storage
...
...
src/main/java/com/neotel/smfcore/core/system/rest/TaskController.java
查看文件 @
04ec3da
...
...
@@ -3,8 +3,10 @@ package com.neotel.smfcore.core.system.rest;
import
cn.hutool.core.util.ObjectUtil
;
import
com.google.common.collect.Lists
;
import
com.neotel.smfcore.common.base.IExcelDownLoad
;
import
com.neotel.smfcore.common.bean.PageData
;
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.core.device.enums.OP_STATUS
;
...
...
@@ -35,6 +37,11 @@ import org.springframework.util.ObjectUtils;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.text.DateFormat
;
import
java.text.SimpleDateFormat
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Set
;
...
...
@@ -60,17 +67,8 @@ public class TaskController {
@Autowired
private
IUserManager
userManager
;
// @ApiOperation("导出用户数据")
// @GetMapping(value = "/download")
// @PreAuthorize("@el.check('user:list')")
// public void download(HttpServletResponse response, UserQueryCriteria criteria) throws IOException {
// userService.download(userService.queryAll(criteria), response);
// }
@ApiOperation
(
"查询出入库日志"
)
@GetMapping
(
"/history"
)
@PreAuthorize
(
"@el.check('taskLog')"
)
public
PageData
<
TaskDto
>
query
(
TaskQueryCondition
criteria
,
Pageable
pageable
)
{
private
Query
getQuery
(
TaskQueryCondition
criteria
){
String
un_End
=
"UN_END"
;
boolean
unEnd
=
false
;
boolean
finished
=
false
;
...
...
@@ -88,12 +86,76 @@ public class TaskController {
}
else
if
(
finished
){
query
.
addCriteria
(
Criteria
.
where
(
"status"
).
in
(
OP_STATUS
.
END
.
name
(),
OP_STATUS
.
FINISHED
.
name
()));
}
// query.with(Sort.by(Sort.Direction.DESC,"updateDate","createDate"));
return
query
;
}
@ApiOperation
(
"查询出入库日志"
)
@GetMapping
(
"/history"
)
@PreAuthorize
(
"@el.check('taskLog')"
)
public
PageData
<
TaskDto
>
query
(
TaskQueryCondition
criteria
,
Pageable
pageable
)
{
Query
query
=
getQuery
(
criteria
);
PageData
<
DataLog
>
taskList
=
dataLogManager
.
findByPage
(
query
,
pageable
);
PageData
<
TaskDto
>
result
=
taskMapper
.
toDto
(
taskList
);
return
result
;
}
@ApiOperation
(
"导出查找出入库日志"
)
@GetMapping
(
value
=
"/history/download"
)
@PreAuthorize
(
"@el.check('taskLog')"
)
public
void
download
(
HttpServletResponse
response
,
TaskQueryCondition
criteria
,
Pageable
pageable
,
HttpServletRequest
request
)
throws
IOException
{
Query
query
=
getQuery
(
criteria
);
//dataLogManager.download(query, pageable, response,request.getLocale());
// FileUtil.downloadExcel(query, pageable, response, new IExcelDownLoad() {
// @Override
// public List<List<String>> getHeader() {
// List<List<String>> header = new ArrayList<>();
// header.add(Lists.newArrayList("类型"));
// header.add(Lists.newArrayList("单号"));
// header.add(Lists.newArrayList("料仓名称"));
// header.add(Lists.newArrayList("条码编号"));
// header.add(Lists.newArrayList("料件编号"));
// header.add(Lists.newArrayList("批次"));
// header.add(Lists.newArrayList("数量"));
// header.add(Lists.newArrayList("用户"));
//
// header.add(Lists.newArrayList("供应商"));
// header.add(Lists.newArrayList("来源二"));
// header.add(Lists.newArrayList("状态"));
// header.add(Lists.newArrayList("更新时间"));
// return header;
// }
//
// @Override
// public List<List<Object>> getPageData(Query query, Pageable pageable) {
// List<List<Object>> dataList = new ArrayList<>();
// List<DataLog> dataLogList = dataLogManager.findByQuery(query, pageable);
// DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// for (DataLog dataLog : dataLogList) {
// List<Object> data = new ArrayList<>();
//
// data.add(dataLog.getDetailTypeStr());//"类型"
// data.add(dataLog.getSourceName());//"单号"
// data.add(dataLog.getPosName());//"料仓名称"
// data.add(dataLog.getBarcode());//"条码编号"
// data.add(dataLog.getPartNumber());//"料件编号"
// data.add(dataLog.getBatchInfo());//"批次"
// data.add(dataLog.getReelQty());//"数量"
// data.add(dataLog.getOperator());//"用户"
//
// data.add(dataLog.getProvider());//"供应商"
// data.add(dataLog.getSubSourceInfo());//"来源二"
// data.add(dataLog.getStatusStr());//"状态"
// String updateTimeStr = dateFormat.format(dataLog.getUpdateDate());
// data.add(updateTimeStr);//"更新时间"
// dataList.add(data);
// }
// return dataList;
// }
// });
}
@ApiOperation
(
"获取某个分组队列中的任务"
)
@AnonymousGetMapping
(
"/{groupId}"
)
public
List
<
TaskDto
>
groupTask
(
@PathVariable
String
groupId
){
...
...
src/main/java/com/neotel/smfcore/core/system/service/dao/IDataLogDao.java
查看文件 @
04ec3da
...
...
@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.system.service.dao;
import
com.neotel.smfcore.common.base.IBaseDao
;
import
com.neotel.smfcore.core.report.bean.ChartItem
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
java.util.Date
;
import
java.util.List
;
...
...
@@ -10,4 +11,6 @@ public interface IDataLogDao extends IBaseDao {
List
<
ChartItem
>
putInChart
(
Date
startDay
,
Date
endDay
,
String
partNumber
);
List
<
ChartItem
>
checkOutChart
(
Date
startDay
,
Date
endDay
,
String
partNumber
);
List
<
DataLog
>
findHistory
(
String
bid
,
int
num
);
}
src/main/java/com/neotel/smfcore/core/system/service/dao/impl/DataLogDaoImpl.java
查看文件 @
04ec3da
...
...
@@ -8,9 +8,11 @@ import com.neotel.smfcore.core.report.bean.ChartItem;
import
com.neotel.smfcore.core.system.service.dao.IDataLogDao
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
org.apache.logging.log4j.util.Strings
;
import
org.springframework.data.domain.Sort
;
import
org.springframework.data.mongodb.core.aggregation.Aggregation
;
import
org.springframework.data.mongodb.core.aggregation.AggregationResults
;
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
;
...
...
@@ -51,5 +53,17 @@ public class DataLogDaoImpl extends AbstractBaseDao implements IDataLogDao {
return
results
.
getMappedResults
();
}
@Override
public
List
<
DataLog
>
findHistory
(
String
barcode
,
int
num
)
{
Criteria
c
=
new
Criteria
();
if
(
barcode
!=
null
&&
!
barcode
.
isEmpty
()){
c
.
and
(
"barcode"
).
is
(
barcode
);
}
Query
q
=
Query
.
query
(
c
);
q
.
limit
(
num
);
q
.
with
(
Sort
.
by
(
Sort
.
Direction
.
DESC
,
"updateDate"
));
return
findByQuery
(
q
);
}
}
src/main/java/com/neotel/smfcore/c
ore
/haman/bean/BINPosInfo.java
→
src/main/java/com/neotel/smfcore/c
ustom
/haman/bean/BINPosInfo.java
查看文件 @
04ec3da
package
com
.
neotel
.
smfcore
.
c
ore
.
haman
.
bean
;
package
com
.
neotel
.
smfcore
.
c
ustom
.
haman
.
bean
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
...
...
src/main/java/com/neotel/smfcore/c
ore
/haman/enums/BIN_STATUS.java
→
src/main/java/com/neotel/smfcore/c
ustom
/haman/enums/BIN_STATUS.java
查看文件 @
04ec3da
package
com
.
neotel
.
smfcore
.
c
ore
.
haman
.
enums
;
package
com
.
neotel
.
smfcore
.
c
ustom
.
haman
.
enums
;
public
class
BIN_STATUS
{
/**
...
...
src/main/java/com/neotel/smfcore/c
ore
/haman/listener/HamanOrderFileListener.java
→
src/main/java/com/neotel/smfcore/c
ustom
/haman/listener/HamanOrderFileListener.java
查看文件 @
04ec3da
package
com
.
neotel
.
smfcore
.
c
ore
.
haman
.
listener
;
package
com
.
neotel
.
smfcore
.
c
ustom
.
haman
.
listener
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.google.common.collect.Lists
;
import
com.neotel.smfcore.common.csv.CsvReader
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.haman.services.dao.IHamanBinPosDao
;
import
com.neotel.smfcore.core.haman.services.po.HamanBinPos
;
import
com.neotel.smfcore.core.order.LiteOrderCache
;
import
com.neotel.smfcore.custom.haman.services.dao.IHamanBinPosDao
;
import
com.neotel.smfcore.custom.haman.services.po.HamanBinPos
;
import
com.neotel.smfcore.core.order.listener.DefaultOrderFileListener
;
import
com.neotel.smfcore.core.order.listener.IOrderFileListener
;
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.system.bean.OrderSetting
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.logging.log4j.util.Strings
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.io.File
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
/**
...
...
src/main/java/com/neotel/smfcore/c
ore
/haman/rest/HamanController.java
→
src/main/java/com/neotel/smfcore/c
ustom
/haman/rest/HamanController.java
查看文件 @
04ec3da
package
com
.
neotel
.
smfcore
.
c
ore
.
haman
.
rest
;
package
com
.
neotel
.
smfcore
.
c
ustom
.
haman
.
rest
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.google.common.collect.Lists
;
import
com.neotel.smfcore.common.bean.PageData
;
import
com.neotel.smfcore.common.bean.ResultBean
;
import
com.neotel.smfcore.common.csv.CsvReader
;
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.core.device.util.DataCache
;
import
com.neotel.smfcore.core.haman.bean.BINPosInfo
;
import
com.neotel.smfcore.core.haman.enums.BIN_STATUS
;
import
com.neotel.smfcore.core.haman.rest.dto.BINPosDto
;
import
com.neotel.smfcore.core.haman.rest.mapstruct.BINPosMapper
;
import
com.neotel.smfcore.core.haman.rest.query.HamanBinQueryCondition
;
import
com.neotel.smfcore.core.haman.services.dao.IHamanBinPosDao
;
import
com.neotel.smfcore.core.haman.services.po.HamanBinPos
;
import
com.neotel.smfcore.core.inList.rest.bean.dto.InListDto
;
import
com.neotel.smfcore.core.inList.rest.bean.query.InListQueryCondition
;
import
com.neotel.smfcore.core.inList.service.po.InList
;
import
com.neotel.smfcore.core.order.enums.LITEORDER_STATUS
;
import
com.neotel.smfcore.custom.haman.enums.BIN_STATUS
;
import
com.neotel.smfcore.custom.haman.rest.dto.BINPosDto
;
import
com.neotel.smfcore.custom.haman.rest.mapstruct.BINPosMapper
;
import
com.neotel.smfcore.custom.haman.rest.query.HamanBinQueryCondition
;
import
com.neotel.smfcore.custom.haman.services.dao.IHamanBinPosDao
;
import
com.neotel.smfcore.custom.haman.services.po.HamanBinPos
;
import
com.neotel.smfcore.core.order.enums.ORDER_COLOR
;
import
com.neotel.smfcore.core.order.rest.bean.dto.OrderDto
;
import
com.neotel.smfcore.core.order.rest.bean.query.OrderQueryCondition
;
import
com.neotel.smfcore.core.order.service.po.LiteOrder
;
import
com.neotel.smfcore.core.storage.service.manager.IStoragePosManager
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
com.neotel.smfcore.core.system.util.DevicesStatusUtil
;
import
com.neotel.smfcore.security.TokenProvider
;
import
com.neotel.smfcore.security.annotation.AnonymousAccess
;
import
com.neotel.smfcore.security.bean.FileProperties
;
import
com.neotel.smfcore.security.service.po.Group
;
import
com.neotel.smfcore.security.service.po.User
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.RequiredArgsConstructor
;
...
...
@@ -41,14 +22,9 @@ import lombok.extern.slf4j.Slf4j;
import
org.apache.logging.log4j.util.Strings
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.mongodb.core.query.Criteria
;
import
org.springframework.data.mongodb.core.query.Query
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.multipart.MultipartFile
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.File
;
import
java.text.DecimalFormat
;
import
java.util.*
;
...
...
src/main/java/com/neotel/smfcore/c
ore
/haman/rest/PosOutputController.java
→
src/main/java/com/neotel/smfcore/c
ustom
/haman/rest/PosOutputController.java
查看文件 @
04ec3da
package
com
.
neotel
.
smfcore
.
c
ore
.
haman
.
rest
;
package
com
.
neotel
.
smfcore
.
c
ustom
.
haman
.
rest
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.google.common.collect.Lists
;
import
com.neotel.smfcore.common.bean.ResultBean
;
import
com.neotel.smfcore.common.csv.CsvReader
;
import
com.neotel.smfcore.common.exception.ValidateException
;
import
com.neotel.smfcore.common.utils.FileUtil
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.haman.bean.BINPosInfo
;
import
com.neotel.smfcore.core.haman.rest.dto.BINPosDto
;
import
com.neotel.smfcore.core.haman.rest.mapstruct.BINPosMapper
;
import
com.neotel.smfcore.custom.haman.bean.BINPosInfo
;
import
com.neotel.smfcore.custom.haman.rest.mapstruct.BINPosMapper
;
import
com.neotel.smfcore.core.storage.service.manager.IStoragePosManager
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
import
com.neotel.smfcore.core.system.util.DevicesStatusUtil
;
import
com.neotel.smfcore.security.TokenProvider
;
import
com.neotel.smfcore.security.annotation.AnonymousAccess
;
...
...
@@ -21,16 +17,12 @@ import io.swagger.annotations.Api;
import
io.swagger.annotations.ApiOperation
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
net.bytebuddy.asm.Advice
;
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.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.multipart.MultipartFile
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.File
;
import
java.text.DecimalFormat
;
import
java.util.*
;
...
...
src/main/java/com/neotel/smfcore/c
ore
/haman/rest/dto/BINPosDto.java
→
src/main/java/com/neotel/smfcore/c
ustom
/haman/rest/dto/BINPosDto.java
查看文件 @
04ec3da
package
com
.
neotel
.
smfcore
.
c
ore
.
haman
.
rest
.
dto
;
package
com
.
neotel
.
smfcore
.
c
ustom
.
haman
.
rest
.
dto
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.c
ore
.haman.enums.BIN_STATUS
;
import
com.neotel.smfcore.c
ustom
.haman.enums.BIN_STATUS
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
...
...
src/main/java/com/neotel/smfcore/c
ore
/haman/rest/mapstruct/BINPosMapper.java
→
src/main/java/com/neotel/smfcore/c
ustom
/haman/rest/mapstruct/BINPosMapper.java
查看文件 @
04ec3da
package
com
.
neotel
.
smfcore
.
c
ore
.
haman
.
rest
.
mapstruct
;
package
com
.
neotel
.
smfcore
.
c
ustom
.
haman
.
rest
.
mapstruct
;
import
com.neotel.smfcore.common.base.BaseMapper
;
import
com.neotel.smfcore.core.haman.bean.BINPosInfo
;
import
com.neotel.smfcore.core.haman.rest.dto.BINPosDto
;
import
com.neotel.smfcore.core.haman.services.po.HamanBinPos
;
import
com.neotel.smfcore.custom.haman.rest.dto.BINPosDto
;
import
com.neotel.smfcore.custom.haman.services.po.HamanBinPos
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.ReportingPolicy
;
...
...
src/main/java/com/neotel/smfcore/c
ore
/haman/rest/query/HamanBinQueryCondition.java
→
src/main/java/com/neotel/smfcore/c
ustom
/haman/rest/query/HamanBinQueryCondition.java
查看文件 @
04ec3da
package
com
.
neotel
.
smfcore
.
c
ore
.
haman
.
rest
.
query
;
package
com
.
neotel
.
smfcore
.
c
ustom
.
haman
.
rest
.
query
;
import
com.neotel.smfcore.common.annotation.QueryCondition
;
import
com.neotel.smfcore.common.bean.BetweenData
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
lombok.Data
;
import
java.util.Date
;
@Data
public
class
HamanBinQueryCondition
{
@QueryCondition
...
...
src/main/java/com/neotel/smfcore/c
ore
/haman/services/dao/IHamanBinPosDao.java
→
src/main/java/com/neotel/smfcore/c
ustom
/haman/services/dao/IHamanBinPosDao.java
查看文件 @
04ec3da
package
com
.
neotel
.
smfcore
.
c
ore
.
haman
.
services
.
dao
;
package
com
.
neotel
.
smfcore
.
c
ustom
.
haman
.
services
.
dao
;
import
com.neotel.smfcore.common.base.IBaseDao
;
import
com.neotel.smfcore.common.bean.PageData
;
import
com.neotel.smfcore.core.haman.services.po.HamanBinPos
;
import
com.neotel.smfcore.core.inList.service.po.InList
;
import
com.neotel.smfcore.custom.haman.services.po.HamanBinPos
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.mongodb.core.query.Query
;
...
...
src/main/java/com/neotel/smfcore/c
ore
/haman/services/dao/impl/HamanBinPosDaoImpl.java
→
src/main/java/com/neotel/smfcore/c
ustom
/haman/services/dao/impl/HamanBinPosDaoImpl.java
查看文件 @
04ec3da
package
com
.
neotel
.
smfcore
.
c
ore
.
haman
.
services
.
dao
.
impl
;
package
com
.
neotel
.
smfcore
.
c
ustom
.
haman
.
services
.
dao
.
impl
;
import
com.neotel.smfcore.common.base.AbstractBaseDao
;
import
com.neotel.smfcore.common.bean.PageData
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.core.haman.enums.BIN_STATUS
;
import
com.neotel.smfcore.core.haman.services.dao.IHamanBinPosDao
;
import
com.neotel.smfcore.core.haman.services.po.HamanBinPos
;
import
com.neotel.smfcore.core.inList.service.po.InList
;
import
com.neotel.smfcore.core.order.service.po.LiteOrder
;
import
com.neotel.smfcore.custom.haman.enums.BIN_STATUS
;
import
com.neotel.smfcore.custom.haman.services.dao.IHamanBinPosDao
;
import
com.neotel.smfcore.custom.haman.services.po.HamanBinPos
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.mongodb.core.query.Criteria
;
import
org.springframework.data.mongodb.core.query.Query
;
...
...
src/main/java/com/neotel/smfcore/c
ore
/haman/services/po/HamanBinPos.java
→
src/main/java/com/neotel/smfcore/c
ustom
/haman/services/po/HamanBinPos.java
查看文件 @
04ec3da
package
com
.
neotel
.
smfcore
.
c
ore
.
haman
.
services
.
po
;
package
com
.
neotel
.
smfcore
.
c
ustom
.
haman
.
services
.
po
;
import
com.google.common.collect.Lists
;
import
com.neotel.smfcore.common.base.BasePo
;
import
com.neotel.smfcore.common.utils.DateUtil
;
import
com.neotel.smfcore.core.barcode.enums.BARCODE_STATUS
;
import
com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE
;
import
com.neotel.smfcore.core.barcode.enums.SOLDER_STATUS
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.c
ore
.haman.enums.BIN_STATUS
;
import
com.neotel.smfcore.c
ustom
.haman.enums.BIN_STATUS
;
import
lombok.Data
;
import
org.springframework.data.annotation.Transient
;
import
org.springframework.data.mongodb.core.mapping.Document
;
import
java.io.Serializable
;
import
java.util.Date
;
import
java.util.List
;
@Data
@Document
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论